diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS new file mode 100644 index 000000000000..7707f9ca3677 --- /dev/null +++ b/.github/CODEOWNERS @@ -0,0 +1,5 @@ +# By default, all files require review by members of these teams +* @microsoft/kata-cc-devs @microsoft/kata-cc-admins + +# Modifications to this file require admin approval +/.github/CODEOWNERS @microsoft/kata-cc-admins diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md new file mode 100644 index 000000000000..a96ed6d4c2f9 --- /dev/null +++ b/.github/pull_request_template.md @@ -0,0 +1,11 @@ +###### Merge Checklist +- [ ] Followed patch format from upstream recommendation: https://github.com/kata-containers/community/blob/main/CONTRIBUTING.md#patch-format + - [ ] Included a single commit in a given PR - at least unless there are related commits and each makes sense as a change on its own. +- [ ] Aware about the PR to be merged using "create a merge commit" rather than "squash and merge" (or similar) +- [ ] The `upstream/missing` label (or `upstream/not-needed`) has been set on the PR. + +###### Summary + + +###### Test Methodology + diff --git a/.github/workflows/check-samples.yaml b/.github/workflows/check-samples.yaml new file mode 100644 index 000000000000..92945a2fa2da --- /dev/null +++ b/.github/workflows/check-samples.yaml @@ -0,0 +1,49 @@ +# Copyright (c) Microsoft Corporation. + +name: Check policy samples + +on: + pull_request: + +jobs: + check-policy-samples: + runs-on: ubuntu-latest + + steps: + + - name: Check out code + uses: actions/checkout@v4 + + - name: Install yq + env: + INSTALL_IN_GOPATH: false + run: | + ./ci/install_yq.sh + + - name: Install Rust + run: | + ./tests/install_rust.sh + echo "${HOME}/.cargo/bin" >> $GITHUB_PATH + + - name: Install protobuf-compiler + run: | + sudo apt-get -y install protobuf-compiler + + - name: Configure containerd + run: | + sudo containerd config default | sudo dd of=/etc/containerd/config.toml + sudo systemctl restart containerd + sudo systemctl is-active containerd + + - name: Update policy samples + working-directory: ./src/tools/genpolicy + run: | + python3 update_policy_samples.py + + - name: Show diff + run: | + git diff + + - name: Check policy samples + run: | + git diff-files --exit-code diff --git a/.github/workflows/static-checks.yaml b/.github/workflows/static-checks.yaml index 1438c634e490..788288e16944 100644 --- a/.github/workflows/static-checks.yaml +++ b/.github/workflows/static-checks.yaml @@ -43,11 +43,101 @@ jobs: fi build-checks: - needs: skipper - if: ${{ needs.skipper.outputs.skip_static != 'yes' }} - uses: ./.github/workflows/build-checks.yaml - with: - instance: ubuntu-22.04 + runs-on: ubuntu-20.04 + strategy: + fail-fast: false + matrix: + component: + - agent + - dragonball + - runtime + - runtime-rs + - agent-ctl + - kata-ctl + - log-parser-rs + - runk + - trace-forwarder + - genpolicy + command: + - "make vendor" + - "make check" + - "make test" + - "sudo -E PATH=\"$PATH\" make test" + include: + - component: agent + component-path: src/agent + - component: dragonball + component-path: src/dragonball + - component: runtime + component-path: src/runtime + - component: runtime-rs + component-path: src/runtime-rs + - component: agent-ctl + component-path: src/tools/agent-ctl + - component: kata-ctl + component-path: src/tools/kata-ctl + - component: log-parser-rs + component-path: src/tools/log-parser-rs + - component: runk + component-path: src/tools/runk + - component: trace-forwarder + component-path: src/tools/trace-forwarder + - install-libseccomp: no + - component: agent + install-libseccomp: yes + - component: runk + install-libseccomp: yes + - component: genpolicy + component-path: src/tools/genpolicy + steps: + - name: Checkout the code + uses: actions/checkout@v4 + with: + fetch-depth: 0 + - name: Install yq + run: | + ./ci/install_yq.sh + env: + INSTALL_IN_GOPATH: false + - name: Install golang + if: ${{ matrix.component == 'runtime' }} + run: | + ./tests/install_go.sh -f -p + echo "/usr/local/go/bin" >> $GITHUB_PATH + - name: Install rust + if: ${{ matrix.component != 'runtime' }} + run: | + ./tests/install_rust.sh + echo "${HOME}/.cargo/bin" >> $GITHUB_PATH + - name: Install protobuf-compiler + if: ${{ matrix.command != 'make vendor' && (matrix.component == 'agent' || matrix.component == 'genpolicy' || matrix.component == 'agent-ctl') }} + run: sudo apt-get -y install protobuf-compiler + - name: Install musl-tools + if: ${{ matrix.component != 'runtime' }} + run: sudo apt-get -y install musl-tools + - name: Install devicemapper + if: ${{ (matrix.command == 'make check' || matrix.command == 'make test') && matrix.component == 'agent' }} + run: sudo apt-get -y install libdevmapper-dev + - name: Install libseccomp + if: ${{ matrix.command != 'make vendor' && matrix.command != 'make check' && matrix.install-libseccomp == 'yes' }} + run: | + libseccomp_install_dir=$(mktemp -d -t libseccomp.XXXXXXXXXX) + gperf_install_dir=$(mktemp -d -t gperf.XXXXXXXXXX) + ./ci/install_libseccomp.sh "${libseccomp_install_dir}" "${gperf_install_dir}" + echo "Set environment variables for the libseccomp crate to link the libseccomp library statically" + echo "LIBSECCOMP_LINK_TYPE=static" >> $GITHUB_ENV + echo "LIBSECCOMP_LIB_PATH=${libseccomp_install_dir}/lib" >> $GITHUB_ENV + - name: Setup XDG_RUNTIME_DIR for the `runtime` tests + if: ${{ matrix.command != 'make vendor' && matrix.command != 'make check' && matrix.component == 'runtime' }} + run: | + XDG_RUNTIME_DIR=$(mktemp -d /tmp/kata-tests-$USER.XXX | tee >(xargs chmod 0700)) + echo "XDG_RUNTIME_DIR=${XDG_RUNTIME_DIR}" >> $GITHUB_ENV + - name: Running `${{ matrix.command }}` for ${{ matrix.component }} + run: | + cd ${{ matrix.component-path }} + ${{ matrix.command }} + env: + RUST_BACKTRACE: "1" build-checks-depending-on-kvm: runs-on: ubuntu-22.04 diff --git a/.gitignore b/.gitignore index fd1452f7bf20..ca98f4519368 100644 --- a/.gitignore +++ b/.gitignore @@ -16,3 +16,23 @@ src/agent/protocols/src/*.rs build src/tools/log-parser/kata-log-parser tools/packaging/static-build/agent/install_libseccomp.sh + +# Microsoft-specific +.cargo/ +src/agent/samples/policy/test-input/ +src/tarfs/**/*.cmd +src/tarfs/**/*.ko +src/tarfs/**/*.mod +src/tarfs/**/*.mod.c +src/tarfs/**/*.o +src/tarfs/**/modules.order +src/tarfs/**/Module.symvers +src/tarfs-cvm/ +tools/osbuilder/kata-containers-igvm.img +tools/osbuilder/kata-containers-igvm-debug.img +tools/osbuilder/igvm-debug-measurement.cose +tools/osbuilder/igvm-measurement.cose +tools/osbuilder/root_hash.txt +tools/osbuilder/igvm.log +tools/osbuilder/kata-opa.service +tools/osbuilder/rootfs-builder/opa/ diff --git a/Makefile b/Makefile index 411e1f78faee..3359a6120fcd 100644 --- a/Makefile +++ b/Makefile @@ -11,6 +11,10 @@ COMPONENTS += agent COMPONENTS += dragonball COMPONENTS += runtime COMPONENTS += runtime-rs +COMPONENTS += tarfs +COMPONENTS += tardev-snapshotter +COMPONENTS += overlay +COMPONENTS += utarfs # List of available tools TOOLS = diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 000000000000..b3c89efc852e --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,41 @@ + + +## Security + +Microsoft takes the security of our software products and services seriously, which includes all source code repositories managed through our GitHub organizations, which include [Microsoft](https://github.com/Microsoft), [Azure](https://github.com/Azure), [DotNet](https://github.com/dotnet), [AspNet](https://github.com/aspnet) and [Xamarin](https://github.com/xamarin). + +If you believe you have found a security vulnerability in any Microsoft-owned repository that meets [Microsoft's definition of a security vulnerability](https://aka.ms/security.md/definition), please report it to us as described below. + +## Reporting Security Issues + +**Please do not report security vulnerabilities through public GitHub issues.** + +Instead, please report them to the Microsoft Security Response Center (MSRC) at [https://msrc.microsoft.com/create-report](https://aka.ms/security.md/msrc/create-report). + +If you prefer to submit without logging in, send email to [secure@microsoft.com](mailto:secure@microsoft.com). If possible, encrypt your message with our PGP key; please download it from the [Microsoft Security Response Center PGP Key page](https://aka.ms/security.md/msrc/pgp). + +You should receive a response within 24 hours. If for some reason you do not, please follow up via email to ensure we received your original message. Additional information can be found at [microsoft.com/msrc](https://www.microsoft.com/msrc). + +Please include the requested information listed below (as much as you can provide) to help us better understand the nature and scope of the possible issue: + + * Type of issue (e.g. buffer overflow, SQL injection, cross-site scripting, etc.) + * Full paths of source file(s) related to the manifestation of the issue + * The location of the affected source code (tag/branch/commit or direct URL) + * Any special configuration required to reproduce the issue + * Step-by-step instructions to reproduce the issue + * Proof-of-concept or exploit code (if possible) + * Impact of the issue, including how an attacker might exploit the issue + +This information will help us triage your report more quickly. + +If you are reporting for a bug bounty, more complete reports can contribute to a higher bounty award. Please visit our [Microsoft Bug Bounty Program](https://aka.ms/security.md/msrc/bounty) page for more details about our active programs. + +## Preferred Languages + +We prefer all communications to be in English. + +## Policy + +Microsoft follows the principle of [Coordinated Vulnerability Disclosure](https://aka.ms/security.md/cvd). + + diff --git a/docs/how-to/how-to-enable-storage-in-confidential-pods.md b/docs/how-to/how-to-enable-storage-in-confidential-pods.md new file mode 100644 index 000000000000..fa17798575c8 --- /dev/null +++ b/docs/how-to/how-to-enable-storage-in-confidential-pods.md @@ -0,0 +1,443 @@ +# How to enable storage in AKS confidential pods + +> [!WARNING] +> **Confidentiality is NOT supported in this initial release.** This +> release is focused on first enabling persistence. + +Currently, enabling storage in AKS confidential containers requires +manually installing Kubernetes CSI drivers into your clusters. We have +implemented three such drivers: + + * CoCo Azure Disk: Implements Azure Disk support. + * CoCo Azure Files: Implements Azure Files support. + * CoCo Azure Local: Implement ephemeral, node-local storage, equivalent + to the native Kubernetes emptyDir. + +This document describes how to install and test each driver in an AKS +cluster. + +## Prerequisites for all drivers + +These steps need to be performed before installing any driver. After +completing this section, you will have a 1-node cluster ready to install +the drivers and schedule test workloads. + +### 1. Configure your environment + +First, you'll need to configure your machine to install the required +Azure CLI extensions and enable the confidential containers feature in +your Azure subscription. Please follow the below links to do so: + + 1. [Install the AKS preview Azure CLI extension](https://learn.microsoft.com/en-us/azure/aks/deploy-confidential-containers-default-policy#install-the-aks-preview-azure-cli-extension) + 1. [Install the confcom Azure CLI extension](https://learn.microsoft.com/en-us/azure/aks/deploy-confidential-containers-default-policy#install-the-confcom-azure-cli-extension) + 1. [Register the KataCcIsolationPreview feature flag](https://learn.microsoft.com/en-us/azure/aks/deploy-confidential-containers-default-policy#register-the-kataccisolationpreview-feature-flag) + +### 2. Create the cluster + +Now you can create the cluster: + +```shell +$ cluster="YOUR_AKS_CLUSTER_NAME" +$ rg="YOUR_AKS_CLUSTER_RESOURCE_GROUP_NAME" +$ az aks create \ + --resource-group "$rg" \ + --name "$cluster" \ + --os-sku AzureLinux \ + --node-vm-size Standard_DC4as_cc_v5 \ + --node-count 1 \ + --enable-oidc-issuer \ + --enable-workload-identity \ + --workload-runtime KataCcIsolation +``` + +When the cluster is ready, log into it: + +```shell +$ az aks get-credentials --resource-group "$rg" --name "$cluster" +``` + +Now your machine should be ready, and listing the cluster nodes will get +you an output that looks like this: + +``` +$ kubectl get nodes +NAME STATUS ROLES AGE VERSION +aks-nodepool1-38693887-vmss000000 Ready agent 2m v1.29.6 +``` + +### 3. Grant the drivers permission to access your cluster + +> [!TIP] +> This step is not required for Azure File driver. + +Run the following script to grant permission to the drivers to provision +Azure volumes in your node resource group. Note that the user logged +into the Azure CLI needs to have the permission to add such a role +assignment. + +```shell +mc_rg="$(az aks show -g $rg -n $cluster --query nodeResourceGroup -o tsv)" +mc_rg_oid="$(az group show -g $mc_rg --query id -o tsv)" +umi_principal_id="$(az identity list --query "[?name == '$cluster-agentpool' && resourceGroup == '$mc_rg'].principalId" -o tsv)" +az role assignment create --role Contributor --assignee-principal-type ServicePrincipal --assignee-object-id "$umi_principal_id" --scope "$mc_rg_oid" +``` + +### 4. Enable running manual tests in the confidential containers + +To make manual testing easier, run the following script to allow +executing any shell command in the guest VM. Note that this script is +idempotent so it is safe to rerun if it fails. + +```shell +node="$(kubectl get nodes -o name)" +kata_version="$(kubectl debug "$node" -qi --image=alpine:latest -- chroot /host bash -c 'tdnf info --installed kata-containers-cc' | grep Version | awk '{print $3}')" +wget -O genpolicy-settings.json "https://raw.githubusercontent.com/microsoft/kata-containers/$kata_version/src/tools/genpolicy/genpolicy-settings.json" +sed -i 's/"regex": \[\]/"regex": \[".+"\]/g' genpolicy-settings.json +``` + +After running this script, `genpolicy-settings.json` should have its +field `request_defaults.ExecProcessRequest.regex` set to `[".+"]`. + +## Installing the CoCo Azure Disk driver + +Run the following command to deploy the driver in the cluster: + +```shell +$ curl -sSf https://raw.githubusercontent.com/microsoft/kata-containers/cc-azuredisk-csi-driver/latest/cc-deploy/install.sh | bash +``` + +You can then verify that the driver containers are properly deployed and +in the `Running` state: + +```shell +$ kubectl get pods -A | grep azuredisk-cc +kube-system csi-azuredisk-cc-controller-fbf5fc87d-xm6wg 6/6 Running 0 32s +kube-system csi-azuredisk-cc-node-b9bpf 3/3 Running 0 32s +``` + +You can also verify that the storage classes are installed: + +```shell +$ kubectl get storageclass cc-managed-csi cc-managed-csi-premium +cc-managed-csi cc.disk.csi.azure.com Delete WaitForFirstConsumer true 35s +cc-managed-csi-premium cc.disk.csi.azure.com Delete WaitForFirstConsumer true 35s +``` + +### Known limitations + + * Sharing volumes across pods on the same node is not supported. + * Only tested with ext4 filesystems. + * [`volumeMode: + Block`](https://kubernetes.io/docs/concepts/storage/persistent-volumes/#volume-mode) + is not supported. + * Specifying `securityContext.runAsUser` or `securityContext.fsGroup` + in the pod spec is not supported. + +### Quick testing + +First, copy the below spec to your machine. You will generate its +security policy in the next step. + +This spec will create two persistent volume claims (PVCs) of 10GB each, +one using the built-in `managed-csi` storage class, and the other using +our new `cc-managed-csi` storage class. It will also create a pod that +mounts the `managed-csi` PVC in `/mnt/persistent-broken` and the +`cc-managed-csi` PVC in `/mnt/persistent-ok`. + +
+ demo-cc-azuredisk.yaml +
+ + ```yaml + --- + apiVersion: v1 + kind: PersistentVolumeClaim + metadata: + name: pvc-cc-managed-csi + spec: + accessModes: + - ReadWriteOncePod + resources: + requests: + storage: 10Gi + storageClassName: cc-managed-csi + --- + apiVersion: v1 + kind: PersistentVolumeClaim + metadata: + name: pvc-managed-csi + spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 10Gi + storageClassName: managed-csi + --- + kind: Pod + apiVersion: v1 + metadata: + name: demo-cc-azuredisk + spec: + runtimeClassName: kata-cc-isolation + containers: + - image: busybox:latest + name: busybox + volumeMounts: + - name: cc-managed-csi-vol + mountPath: /mnt/persistent-ok + - name: managed-csi-vol + mountPath: /mnt/persistent-broken + volumes: + - name: cc-managed-csi-vol + persistentVolumeClaim: + claimName: pvc-cc-managed-csi + - name: managed-csi-vol + persistentVolumeClaim: + claimName: pvc-managed-csi + ``` +
+ +Now you can generate the security policy for the spec (using the +`genpolicy-settings.json` file set up in the prerequisites section) and +deploy it: + +```shell +$ az confcom katapolicygen -j genpolicy-settings.json -y demo-cc-azuredisk.yaml +$ kubectl apply -f demo-cc-azuredisk.yaml +``` + +Once the pod is deployed, you should be able to list the mounted +filesystems using the command below: + + * `/mnt/persistent-ok`, from our driver, correctly appears as an ext4 + filesystem with 10GB of capacity. + * `/mnt/persistent-broken` shows that the built-in driver is not + working properly and mounts a tmpfs in the guest root filesystem. + +```shell +$ kubectl exec -it demo-cc-azuredisk -- df -hT | grep /mnt +/dev/vdc ext4 9.7G 2.0M 9.7G 0% /mnt/persistent-ok +tmpfs tmpfs 369.1M 236.0K 368.9M 0% /mnt/persistent-broken +``` + +Note: You may see the error `The request failed due to conflict with a +concurrent request` in the output of `kubectl describe pod +demo-cc-azuredisk`. This does not affect behavior and is expected when +using both the built-in and the new drivers simultaneously in the same +pod. Production workloads that only use our new driver will not +experience this error. + +## Installing the CoCo Azure Files driver + +> [!NOTE] +> The Coco Azure Files driver functionality has been added to +> the built-in Azure Files driver since Kubernetes version 1.32+ in AKS. + +You can verify that the driver containers are in the `Running` state: + +```shell +$ kubectl get pods -A | grep csi-azurefile +kube-system csi-azurefile-node-7zfd9 3/3 Running 0 2d +``` + +You can also verify that the storage classes are installed: + +``` +$ kubectl get storageclass azurefile-csi azurefile-csi-premium +azurefile-csi file.csi.azure.com Delete Immediate true 2d +azurefile-csi-premium file.csi.azure.com Delete Immediate true 2d +``` + +### Known limitations + + * The NFS protocol is not supported. + +### Important notes + + * The current implementation increases the size of the Trusted Compute + Base (TCB) as it introduces an SMB client in the guest VM. + Furthermore, it doesn't protect secrets from the control plane or + other host components. + +### Quick testing + +First, copy the below spec to your machine. You will generate its +security policy in the next step. + +This spec will create a persistent volume claim (PVC) of 10GB using the built-in `azurefile-csi` storage class. It will create a +pod that mounts the `azurefile-csi` PVC in `/mnt/persistent-ok`. + +
+ demo-cc-azurefile.yaml +
+ + ```yaml + --- + apiVersion: v1 + kind: PersistentVolumeClaim + metadata: + name: azurefile-pvc + spec: + accessModes: + - ReadWriteMany + resources: + requests: + storage: 10Gi + storageClassName: azurefile-csi + --- + apiVersion: v1 + kind: Pod + metadata: + name: kata-cc-writer + spec: + runtimeClassName: kata-cc-isolation + containers: + - name: busybox + image: busybox + command: ["sh", "-c", "echo 'Hello from kata-cc!' > /mnt/azurefile/hello-kata-cc.txt && sleep 3600"] + volumeMounts: + - name: azurefile-vol + mountPath: /mnt/azurefile + volumes: + - name: azurefile-vol + persistentVolumeClaim: + claimName: azurefile-pvc + ``` +
+ +Now you can generate the security policy for the spec (using the +`genpolicy-settings.json` file set up in the prerequisites section) and +deploy it: + +```shell +$ az confcom katapolicygen -j genpolicy-settings.json -y demo-cc-azurefile.yaml +$ kubectl apply -f demo-cc-azurefile.yaml +``` + +Once the pod is deployed, you should be able to list the mounted filesystems using the command below: + + * `/mnt/azurefile`, correctly appears as a cifs + filesystem with 10GB of capacity. + +```shell +$ kubectl exec -it demo-cc-azurefile -- df -hT +Filesystem Type Size Used Available Use% Mounted on +... +//fcd8a0d3ad177481cac70bc.file.core.windows.net/pvc-72983850-8132-4673-afc8-0682bb480101 + cifs 10.0G 0 10.0G 0% /mnt/azurefile +... +``` + +## Installing the CoCo Azure Local driver + +Run the following command to deploy the driver in the cluster: + +```shell +$ curl -sSf https://raw.githubusercontent.com/microsoft/kata-containers/cc-azurelocal-csi-driver/latest/cc-deploy/install.sh | bash +``` + +You can then verify that the driver containers are properly deployed and +in the `Running` state: + +```shell +$ kubectl get pods -A | grep cc-local +kube-system csi-cc-local-controller-79ffb676f4-4w8mw 6/6 Running 0 32s +kube-system csi-cc-local-node-g7png 3/3 Running 0 32s +``` + +You can also verify that the storage class is installed: + +```shell +$ kubectl get storageclass cc-local-csi +NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE +cc-local-csi cc.local.csi.azure.com Delete WaitForFirstConsumer true 3d18h +``` + +### Known limitations + + * Sharing volumes across pods is not supported. + * Only tested with ext4 filesystems. + * [`volumeMode: + Block`](https://kubernetes.io/docs/concepts/storage/persistent-volumes/#volume-mode) + has not been tested. + * Specifying `securityContext.runAsUser` or `securityContext.fsGroup` + in the pod spec is not supported. + +### Notes + + * This following warning appears consistently in the output of `kubectl + describe pod` when using this driver. This is by design of Kubernetes + and does not affect behavior (see + [kubernetes/kubernetes#104605](https://github.com/kubernetes/kubernetes/pull/104605)): + ``` + Warning FailedScheduling 2m19s default-scheduler 0/1 nodes are available: waiting for ephemeral volume controller to create the persistentvolumeclaim "demo-cc-azurelocal". preemption: 0/1 nodes are available: 1 Preemption is not helpful for scheduling.. + ``` + +### Quick testing + +First, copy the below spec to your machine. You will generate its +security policy in the next step. + +This spec will create a pod that mounts two ephemeral volumes of 1GB +each, one in `/mnt/scratch-broken` using the native Kubernetes emptyDir +feature in, and the other one in `/mnt/scratch-ok` using our +`cc-local-csi` storage class. + +
+ demo-cc-azurelocal.yaml +
+ + ```yaml + --- + kind: Pod + apiVersion: v1 + metadata: + name: demo-cc-azurelocal + spec: + runtimeClassName: kata-cc-isolation + containers: + - image: busybox:latest + name: busybox + volumeMounts: + - name: cc-local + mountPath: /mnt/scratch-ok + - name: emptydir + mountPath: /mnt/scratch-broken + volumes: + - name: cc-local + ephemeral: + volumeClaimTemplate: + spec: + accessModes: + - ReadWriteOncePod + storageClassName: cc-local-csi + resources: + requests: + storage: 1Gi + - name: emptydir + emptyDir: {} + ``` +
+ +Now you can generate the security policy for the spec (using the +`genpolicy-settings.json` file set up in the prerequisites section) and +deploy it: + +```shell +$ az confcom katapolicygen -j genpolicy-settings.json -y demo-cc-azurelocal.yaml +$ kubectl apply -f demo-cc-azurelocal.yaml +``` + +Once the pod is deployed, you should be able to list the mounted filesystems using the command below: + + * `/mnt/scratch-ok`, from our driver, correctly appears as an ext4 + filesystem with 1GB of capacity. + * `/mnt/scratch-broken` shows that the emptyDir is not working properly + and mounts an overlayfs in the guest root filesystem. + +```shell +$ kubectl exec -it demo-cc-azurelocal -- df -hT | grep /mnt +/dev/vdd ext4 973.4M 280.0K 905.9M 0% /mnt/scratch-ok +none overlay 369.2M 280.0K 368.9M 0% /mnt/scratch-broken +``` diff --git a/src/agent/Cargo.lock b/src/agent/Cargo.lock index c81667cf3c9f..42850188bcc7 100644 --- a/src/agent/Cargo.lock +++ b/src/agent/Cargo.lock @@ -1,6 +1,6 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. -version = 3 +version = 4 [[package]] name = "addr2line" @@ -24,7 +24,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d122413f284cf2d62fb1b7db97e02edb8cda96d769b16e443a4f6195e35662b0" dependencies = [ "crypto-common", - "generic-array", + "generic-array 0.14.7", ] [[package]] @@ -204,9 +204,9 @@ dependencies = [ [[package]] name = "astral-tokio-tar" -version = "0.5.1" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65152cbda42e8ab5ecff69e8811e8333d69188c7d5c41e3eedb8d127e3f23b27" +checksum = "1abb2bfba199d9ec4759b797115ba6ae435bdd920ce99783bb53aeff57ba919b" dependencies = [ "filetime", "futures-core", @@ -263,9 +263,9 @@ dependencies = [ [[package]] name = "async-compression" -version = "0.4.20" +version = "0.4.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "310c9bcae737a48ef5cdee3174184e6d548b292739ede61a1f955ef76a738861" +checksum = "59a194f9d963d8099596278594b3107448656ba73831c9d8c783e613ce86da64" dependencies = [ "flate2", "futures-core", @@ -435,9 +435,9 @@ dependencies = [ [[package]] name = "async-std" -version = "1.13.0" +version = "1.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c634475f29802fde2b8f0b505b1bd00dfe4df7d4a000f0b36f7671197d5c3615" +checksum = "730294c1c08c2e0f85759590518f6333f0d5a0a766a27d519c1b244c3dfd8a24" dependencies = [ "async-attributes", "async-channel 1.9.0", @@ -468,9 +468,9 @@ checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de" [[package]] name = "async-trait" -version = "0.1.87" +version = "0.1.88" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d556ec1359574147ec0c4fc5eb525f3f23263a592b1a9c07e0a75b427de55c97" +checksum = "e539d3fca749fcee5236ab05e93a52867dd549cc157c8cb7f99595f3cedffdb5" dependencies = [ "proc-macro2", "quote", @@ -577,9 +577,9 @@ dependencies = [ [[package]] name = "base64ct" -version = "1.6.0" +version = "1.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" +checksum = "89e25b6adfb930f02d1981565a6e5d9c547ac15a96606256d3b59040e5cd4ca3" [[package]] name = "bincode" @@ -631,6 +631,12 @@ version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb" +[[package]] +name = "bitfield" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46afbd2983a5d5a7bd740ccb198caf5b82f45c40c09c0eed36052d91cb92e719" + [[package]] name = "bitflags" version = "1.3.2" @@ -682,7 +688,7 @@ version = "0.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" dependencies = [ - "generic-array", + "generic-array 0.14.7", ] [[package]] @@ -691,7 +697,7 @@ version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a8894febbff9f758034a5b8e12d87918f56dfc64a8e1fe757d65e29041538d93" dependencies = [ - "generic-array", + "generic-array 0.14.7", ] [[package]] @@ -719,9 +725,9 @@ dependencies = [ [[package]] name = "borsh" -version = "1.5.5" +version = "1.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5430e3be710b68d984d1391c854eb431a9d548640711faa54eecb1df93db91cc" +checksum = "ad8646f98db542e39fc66e68a20b2144f6a732636df7c2354e74645faaa433ce" dependencies = [ "borsh-derive", "cfg_aliases", @@ -729,9 +735,9 @@ dependencies = [ [[package]] name = "borsh-derive" -version = "1.5.5" +version = "1.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8b668d39970baad5356d7c83a86fee3a539e6f93bf6764c97368243e17a0487" +checksum = "fdd1d3c0c2f5833f22386f252fe8ed005c7f59fdcddeef025c01b4c3b9fd9ac3" dependencies = [ "once_cell", "proc-macro-crate 3.3.0", @@ -746,7 +752,7 @@ version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "db26bf1f092fd5e05b5ab3be2f290915aeb6f3f20c4e9f86ce0f07f336c2412f" dependencies = [ - "bzip2", + "bzip2 0.5.2", "flate2", "libc", ] @@ -818,6 +824,16 @@ version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" +[[package]] +name = "bzip2" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bdb116a6ef3f6c3698828873ad02c3014b3c85cadb88496095628e3ef1e347f8" +dependencies = [ + "bzip2-sys", + "libc", +] + [[package]] name = "bzip2" version = "0.5.2" @@ -888,9 +904,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.2.16" +version = "1.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be714c154be609ec7f5dad223a33bf1482fff90472de28f7362806e6d4832b8c" +checksum = "1fcb57c740ae1daf453ae85f16e37396f672b039e00d9d866e07ddb24e328e3a" dependencies = [ "jobserver", "libc", @@ -903,7 +919,7 @@ version = "0.1.0" source = "git+https://github.com/cncf-tags/container-device-interface-rs?rev=fba5677a8e7cc962fc6e495fcec98d7d765e332a#fba5677a8e7cc962fc6e495fcec98d7d765e332a" dependencies = [ "anyhow", - "clap 4.5.31", + "clap 4.5.34", "const_format", "jsonschema", "lazy_static", @@ -1032,19 +1048,19 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.31" +version = "4.5.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "027bb0d98429ae334a8698531da7077bdf906419543a35a55c2cb1b66437d767" +checksum = "e958897981290da2a852763fe9cdb89cd36977a5d729023127095fa94d95e2ff" dependencies = [ "clap_builder", - "clap_derive 4.5.28", + "clap_derive 4.5.32", ] [[package]] name = "clap_builder" -version = "4.5.31" +version = "4.5.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5589e0cba072e0f3d23791efac0fd8627b49c829c196a492e88168e6a669d863" +checksum = "83b0f35019843db2160b5bb19ae09b4e6411ac33fc6a712003c33e03090e2489" dependencies = [ "anstream", "anstyle", @@ -1067,9 +1083,9 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.5.28" +version = "4.5.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf4ced95c6f4a675af3da73304b9ac4ed991640c36374e4b46795c49e17cf1ed" +checksum = "09176aae279615badda0765c0c0b3f6ed53f4709118af73cf4655d85d1530cd7" dependencies = [ "heck 0.5.0", "proc-macro2", @@ -1114,6 +1130,12 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "codicon" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12170080f3533d6f09a19f81596f836854d0fa4867dc32c8172b8474b4e9de61" + [[package]] name = "colorchoice" version = "1.0.3" @@ -1340,7 +1362,7 @@ version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" dependencies = [ - "generic-array", + "generic-array 0.14.7", "rand_core 0.6.4", "subtle", "zeroize", @@ -1352,7 +1374,7 @@ version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" dependencies = [ - "generic-array", + "generic-array 0.14.7", "rand_core 0.6.4", "typenum", ] @@ -1365,7 +1387,7 @@ checksum = "b9d6cf87adf719ddf43a805e92c6870a531aedda35ff640442cbaf8674e141e1" dependencies = [ "aead", "cipher", - "generic-array", + "generic-array 0.14.7", "poly1305", "salsa20", "subtle", @@ -1436,12 +1458,12 @@ dependencies = [ [[package]] name = "darling" -version = "0.20.10" +version = "0.20.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f63b86c8a8826a49b8c21f08a2d07338eec8d900540f8630dc76284be802989" +checksum = "fc7f46116c46ff9ab3eb1597a45688b6715c6e628b5c133e288e709a29bcb4ee" dependencies = [ - "darling_core 0.20.10", - "darling_macro 0.20.10", + "darling_core 0.20.11", + "darling_macro 0.20.11", ] [[package]] @@ -1473,9 +1495,9 @@ dependencies = [ [[package]] name = "darling_core" -version = "0.20.10" +version = "0.20.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95133861a8032aaea082871032f5815eb9e98cef03fa916ab4500513994df9e5" +checksum = "0d00b9596d185e565c2207a0b01f8bd1a135483d02d9b7b0a54b11da8d53412e" dependencies = [ "fnv", "ident_case", @@ -1509,22 +1531,28 @@ dependencies = [ [[package]] name = "darling_macro" -version = "0.20.10" +version = "0.20.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" +checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" dependencies = [ - "darling_core 0.20.10", + "darling_core 0.20.11", "quote", "syn 2.0.100", ] +[[package]] +name = "data-encoding" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "575f75dfd25738df5b91b8e43e14d44bda14637a58fae779fd2b064f8bf3e010" + [[package]] name = "dbl" version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bd2735a791158376708f9347fe8faba9667589d82427ef3aed6794a8981de3d9" dependencies = [ - "generic-array", + "generic-array 0.14.7", ] [[package]] @@ -1559,9 +1587,9 @@ dependencies = [ [[package]] name = "deranged" -version = "0.3.11" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" +checksum = "28cfac68e08048ae1883171632c2aef3ebc555621ae56fbccce1cbf22dd7f058" dependencies = [ "powerfmt", ] @@ -1603,7 +1631,7 @@ version = "0.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2d5bcf7b024d6835cfb3d473887cd966994907effbe9227e8c8219824d06c4e8" dependencies = [ - "darling 0.20.10", + "darling 0.20.11", "proc-macro2", "quote", "syn 2.0.100", @@ -1628,6 +1656,34 @@ dependencies = [ "cipher", ] +[[package]] +name = "devicemapper" +version = "0.33.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75a9fd602a98d192f7662a1f4c4cf6920a1b454c3a9e724f6490cf8e30910114" +dependencies = [ + "bitflags 1.3.2", + "devicemapper-sys", + "env_logger", + "lazy_static", + "log", + "nix 0.26.4", + "rand 0.8.5", + "retry", + "semver", + "serde", +] + +[[package]] +name = "devicemapper-sys" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0b0f9d16560f830ae6e90b769017333c4561d2c84f39e7aa7d935d2e7bcbc4c" +dependencies = [ + "bindgen", + "nix 0.26.4", +] + [[package]] name = "digest" version = "0.10.7" @@ -1640,6 +1696,15 @@ dependencies = [ "subtle", ] +[[package]] +name = "dirs" +version = "5.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44c45a9d03d6676652bcb5e724c7e988de1acad23a711b5217ab9cbecbec2225" +dependencies = [ + "dirs-sys", +] + [[package]] name = "dirs-next" version = "2.0.0" @@ -1650,6 +1715,18 @@ dependencies = [ "dirs-sys-next", ] +[[package]] +name = "dirs-sys" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "520f05a5cbd335fae5a99ff7a6ab8627577660ee5cfd6a94a6a929b52ff0321c" +dependencies = [ + "libc", + "option-ext", + "redox_users", + "windows-sys 0.48.0", +] + [[package]] name = "dirs-sys-next" version = "0.1.2" @@ -1790,7 +1867,7 @@ dependencies = [ "crypto-bigint", "digest", "ff", - "generic-array", + "generic-array 0.14.7", "group", "hkdf", "pem-rfc7468", @@ -1831,6 +1908,19 @@ dependencies = [ "syn 2.0.100", ] +[[package]] +name = "env_logger" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cd405aab171cb85d6735e5c8d9db038c17d3ca007a4d2c25f337935c3d90580" +dependencies = [ + "humantime", + "is-terminal", + "log", + "regex", + "termcolor", +] + [[package]] name = "equivalent" version = "1.0.2" @@ -1898,9 +1988,9 @@ dependencies = [ [[package]] name = "event-listener-strategy" -version = "0.5.3" +version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c3e4e0dd3673c1139bf041f3008816d9cf2946bbfac2945c09e523b8d7b05b2" +checksum = "8be9f3dfaaffdae2972880079a491a1a8bb7cbed0b8dd7a347f668b4150a3b93" dependencies = [ "event-listener 5.4.0", "pin-project-lite", @@ -2182,6 +2272,15 @@ dependencies = [ "zeroize", ] +[[package]] +name = "generic-array" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8c8444bc9d71b935156cc0ccab7f622180808af7867b1daae6547d773591703" +dependencies = [ + "typenum", +] + [[package]] name = "getrandom" version = "0.2.15" @@ -2197,14 +2296,16 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.3.1" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43a49c392881ce6d5c3b8cb70f98717b7c07aabbdff06687b9030dbfbe2725f8" +checksum = "73fea8450eea4bac3940448fb7ae50d91f034f941199fcd9d909a5a07aa455f0" dependencies = [ "cfg-if 1.0.0", + "js-sys", "libc", - "wasi 0.13.3+wasi-0.2.2", - "windows-targets 0.52.6", + "r-efi", + "wasi 0.14.2+wasi-0.2.4", + "wasm-bindgen", ] [[package]] @@ -2264,6 +2365,25 @@ dependencies = [ "subtle", ] +[[package]] +name = "h2" +version = "0.3.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81fe527a889e1532da5c525686d96d4c2e74cdd345badf8dfef9f6b39dd5f5e8" +dependencies = [ + "bytes 1.10.1", + "fnv", + "futures-core", + "futures-sink", + "futures-util", + "http 0.2.12", + "indexmap 2.8.0", + "slab", + "tokio", + "tokio-util", + "tracing", +] + [[package]] name = "hashbrown" version = "0.12.3" @@ -2386,9 +2506,20 @@ dependencies = [ [[package]] name = "http" -version = "1.2.0" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f16ca2af56261c99fba8bac40a10251ce8188205a4c448fbb745a2e4daa76fea" +checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" +dependencies = [ + "bytes 1.10.1", + "fnv", + "itoa", +] + +[[package]] +name = "http" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565" dependencies = [ "bytes 1.10.1", "fnv", @@ -2411,18 +2542,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" dependencies = [ "bytes 1.10.1", - "http", + "http 1.3.1", ] [[package]] name = "http-body-util" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "793429d76616a256bcb62c2a2ec2bed781c8307e797e2598c50010f2bee2544f" +checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" dependencies = [ "bytes 1.10.1", - "futures-util", - "http", + "futures-core", + "http 1.3.1", "http-body", "pin-project-lite", ] @@ -2433,6 +2564,12 @@ version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" +[[package]] +name = "humantime" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b112acc8b3adf4b107a8ec20977da0273a8c386765a3ec0229bd500a1443f9f" + [[package]] name = "hyper" version = "1.6.0" @@ -2442,7 +2579,7 @@ dependencies = [ "bytes 1.10.1", "futures-channel", "futures-util", - "http", + "http 1.3.1", "http-body", "httparse", "itoa", @@ -2459,7 +2596,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2d191583f3da1305256f22463b9bb0471acad48a4e534a5218b9963e9c1f59b2" dependencies = [ "futures-util", - "http", + "http 1.3.1", "hyper", "hyper-util", "rustls", @@ -2473,18 +2610,19 @@ dependencies = [ [[package]] name = "hyper-util" -version = "0.1.10" +version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df2dcfbe0677734ab2f3ffa7fa7bfd4706bfdc1ef393f2ee30184aed67e631b4" +checksum = "497bbc33a26fdd4af9ed9c70d63f61cf56a938375fbb32df34db9b1cd6d643f2" dependencies = [ "bytes 1.10.1", "futures-channel", "futures-util", - "http", + "http 1.3.1", "http-body", "hyper", + "libc", "pin-project-lite", - "socket2 0.5.8", + "socket2 0.5.9", "tokio", "tower-service", "tracing", @@ -2492,16 +2630,17 @@ dependencies = [ [[package]] name = "iana-time-zone" -version = "0.1.61" +version = "0.1.63" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "235e081f3925a06703c2d0117ea8b91f042756fd6e7a6e5d901e8ca1a996b220" +checksum = "b0c919e5debc312ad217002b8048a17b7d83f80703865bbfcfebb0458b0b27d8" dependencies = [ "android_system_properties", "core-foundation-sys", "iana-time-zone-haiku", "js-sys", + "log", "wasm-bindgen", - "windows-core", + "windows-core 0.61.0", ] [[package]] @@ -2554,9 +2693,9 @@ dependencies = [ [[package]] name = "icu_locid_transform_data" -version = "1.5.0" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdc8ff3388f852bede6b579ad4e978ab004f139284d7b28715f773507b946f6e" +checksum = "7515e6d781098bf9f7205ab3fc7e9709d34554ae0b21ddbcb5febfa4bc7df11d" [[package]] name = "icu_normalizer" @@ -2578,9 +2717,9 @@ dependencies = [ [[package]] name = "icu_normalizer_data" -version = "1.5.0" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8cafbf7aa791e9b22bec55a167906f9e1215fd475cd22adfcf660e03e989516" +checksum = "c5e8338228bdc8ab83303f16b797e177953730f601a96c25d10cb3ab0daa0cb7" [[package]] name = "icu_properties" @@ -2599,9 +2738,9 @@ dependencies = [ [[package]] name = "icu_properties_data" -version = "1.5.0" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67a8effbc3dd3e4ba1afa8ad918d5684b8868b3b26500753effea8d2eed19569" +checksum = "85fb8799753b75aee8d2a21d7c14d9f38921b54b3dbda10f5a3c7a7b82dba5e2" [[package]] name = "icu_provider" @@ -2722,9 +2861,9 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.7.1" +version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c9c992b02b5b4c94ea26e32fe5bccb7aa7d9f390ab5c1221ff895bc7ea8b652" +checksum = "3954d50fe15b02142bf25d3b8bdadb634ec3948f103d04ffe3031bc8fe9d7058" dependencies = [ "equivalent", "hashbrown 0.15.2", @@ -2759,7 +2898,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "879f10e63c20629ecabbb64a8010319738c66a5cd0c29b02d63d272b03751d01" dependencies = [ "block-padding", - "generic-array", + "generic-array 0.14.7", ] [[package]] @@ -2782,6 +2921,12 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "iocuddle" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8972d5be69940353d5347a1344cb375d9b457d6809b428b05bb1ca2fb9ce007" + [[package]] name = "iovec" version = "0.1.4" @@ -2961,7 +3106,7 @@ dependencies = [ "anyhow", "base64 0.22.1", "bytecount", - "clap 4.5.31", + "clap 4.5.34", "fancy-regex", "fraction", "getrandom 0.2.15", @@ -3044,6 +3189,7 @@ dependencies = [ "async-recursion 0.3.2", "async-std", "async-trait", + "bzip2 0.4.4", "capctl", "cdi", "cfg-if 1.0.0", @@ -3051,7 +3197,9 @@ dependencies = [ "clap 3.2.25", "const_format", "derivative", + "devicemapper", "futures", + "h2", "image-rs", "ipnetwork", "kata-agent-policy", @@ -3068,6 +3216,7 @@ dependencies = [ "nix 0.24.3", "oci-spec 0.6.8", "opentelemetry", + "proc-mounts", "procfs 0.12.0", "prometheus", "protobuf 3.7.1", @@ -3083,6 +3232,7 @@ dependencies = [ "serde", "serde_json", "serial_test", + "simple_asn1", "slog", "slog-scope", "slog-stdlog", @@ -3100,8 +3250,10 @@ dependencies = [ "tracing-subscriber", "ttrpc", "url", + "verity", "vsock-exporter", "which", + "zerocopy 0.6.6", ] [[package]] @@ -3111,9 +3263,12 @@ dependencies = [ "anyhow", "json-patch", "logging", + "protocols", "regorus", "serde", "serde_json", + "sev", + "sha2", "slog", "slog-scope", "slog-term", @@ -3256,6 +3411,27 @@ dependencies = [ "log", ] +[[package]] +name = "kvm-bindings" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b13baf7bdfda2e10bcb109fcb099ef40cff82374eb6b7cdcf4695bdec4e522c" +dependencies = [ + "vmm-sys-util", +] + +[[package]] +name = "kvm-ioctls" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "083c460d5a272c2f22205973e319147b791d92a288d7d7a8d4c6194f95229440" +dependencies = [ + "bitflags 2.9.0", + "kvm-bindings", + "libc", + "vmm-sys-util", +] + [[package]] name = "lalrpop" version = "0.20.2" @@ -3376,9 +3552,9 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.170" +version = "0.2.171" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "875b3680cb2f8f71bdcf9a30f38d48282f5d3c95cbf9b3fa57269bb5d5c06828" +checksum = "c19937216e9d3aa9956d9bb8dfc0b0c8beb6058fc4f7a4dc4d850edf86a237d6" [[package]] name = "libloading" @@ -3439,15 +3615,15 @@ checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" [[package]] name = "linux-raw-sys" -version = "0.9.2" +version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6db9c683daf087dc577b7506e9695b3d556a9f3849903fa28186283afd6809e9" +checksum = "fe7db12097d22ec582439daf8618b8fdd1a7bef6270e9af3b1ebcd30893cf413" [[package]] name = "litemap" -version = "0.7.4" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ee93343901ab17bd981295f2cf0026d4ad018c7c31ba84549a4ddbb47a45104" +checksum = "23fb14cb19457329c82206317a5663005a4d404783dc74f4252769b0d5f42856" [[package]] name = "litrs" @@ -3485,9 +3661,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.26" +version = "0.4.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30bde2b3dc3671ae49d8e2e9f044c7c005836e7a023ee57cffa25ab82764bb9e" +checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" dependencies = [ "value-bag", ] @@ -4003,7 +4179,7 @@ dependencies = [ "bytes 1.10.1", "chrono", "futures-util", - "http", + "http 1.3.1", "http-auth", "jwt", "lazy_static", @@ -4126,6 +4302,12 @@ dependencies = [ "tokio-stream", ] +[[package]] +name = "option-ext" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" + [[package]] name = "ordered-stream" version = "0.2.0" @@ -4244,6 +4426,15 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "partition-identity" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fa925f9becb532d758b0014b472c576869910929cf4c3f8054b386f19ab9e21" +dependencies = [ + "thiserror 1.0.69", +] + [[package]] name = "password-hash" version = "0.5.0" @@ -4344,7 +4535,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" dependencies = [ "fixedbitset 0.4.2", - "indexmap 2.7.1", + "indexmap 2.8.0", ] [[package]] @@ -4515,7 +4706,7 @@ version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" dependencies = [ - "zerocopy 0.8.23", + "zerocopy 0.8.24", ] [[package]] @@ -4607,6 +4798,15 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "proc-mounts" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d652f8435d0ab70bf4f3590a6a851d59604831a458086541b95238cc51ffcf2" +dependencies = [ + "partition-identity", +] + [[package]] name = "procfs" version = "0.12.0" @@ -4761,7 +4961,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "322330e133eab455718444b4e033ebfac7c6528972c784fcde28d2cc783c6257" dependencies = [ "anyhow", - "indexmap 2.7.1", + "indexmap 2.8.0", "log", "protobuf 3.7.1", "protobuf-support", @@ -4830,31 +5030,33 @@ dependencies = [ [[package]] name = "quinn" -version = "0.11.6" +version = "0.11.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62e96808277ec6f97351a2380e6c25114bc9e67037775464979f3037c92d05ef" +checksum = "c3bd15a6f2967aef83887dcb9fec0014580467e33720d073560cf015a5683012" dependencies = [ "bytes 1.10.1", + "cfg_aliases", "pin-project-lite", "quinn-proto", "quinn-udp", "rustc-hash 2.1.1", "rustls", - "socket2 0.5.8", + "socket2 0.5.9", "thiserror 2.0.12", "tokio", "tracing", + "web-time", ] [[package]] name = "quinn-proto" -version = "0.11.9" +version = "0.11.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2fe5ef3495d7d2e377ff17b1a8ce2ee2ec2a18cde8b6ad6619d65d0701c135d" +checksum = "b820744eb4dc9b57a3398183639c511b5a26d2ed702cedd3febaa1393caa22cc" dependencies = [ "bytes 1.10.1", - "getrandom 0.2.15", - "rand 0.8.5", + "getrandom 0.3.2", + "rand 0.9.0", "ring", "rustc-hash 2.1.1", "rustls", @@ -4868,27 +5070,33 @@ dependencies = [ [[package]] name = "quinn-udp" -version = "0.5.10" +version = "0.5.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e46f3055866785f6b92bc6164b76be02ca8f2eb4b002c0354b28cf4c119e5944" +checksum = "541d0f57c6ec747a90738a52741d3221f7960e8ac2f0ff4b1a63680e033b4ab5" dependencies = [ "cfg_aliases", "libc", "once_cell", - "socket2 0.5.8", + "socket2 0.5.9", "tracing", "windows-sys 0.59.0", ] [[package]] name = "quote" -version = "1.0.39" +version = "1.0.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1f1914ce909e1658d9907913b4b91947430c7d9be598b15a1912935b8c04801" +checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" dependencies = [ "proc-macro2", ] +[[package]] +name = "r-efi" +version = "5.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74765f6d916ee2faa39bc8e68e4f3ed8949b48cccdac59983d287a7cb71ce9c5" + [[package]] name = "radium" version = "0.7.0" @@ -4914,7 +5122,7 @@ checksum = "3779b94aeb87e8bd4e834cee3650289ee9e0d5677f976ecdb6d219e5f4f6cd94" dependencies = [ "rand_chacha 0.9.0", "rand_core 0.9.3", - "zerocopy 0.8.23", + "zerocopy 0.8.24", ] [[package]] @@ -4952,7 +5160,7 @@ version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" dependencies = [ - "getrandom 0.3.1", + "getrandom 0.3.2", ] [[package]] @@ -5055,6 +5263,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "843c3d97f07e3b5ac0955d53ad0af4c91fe4a4f8525843ece5bf014f27829b73" dependencies = [ "anyhow", + "data-encoding", "lazy_static", "rand 0.8.5", "regex", @@ -5080,9 +5289,9 @@ dependencies = [ [[package]] name = "reqwest" -version = "0.12.12" +version = "0.12.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43e734407157c3c2034e0258f5e4473ddb361b1e85f95a66690d67264d7cd1da" +checksum = "d19c46a6fdd48bc4dab94b6103fccc55d34c67cc0ad04653aad4ea2a07cd7bbb" dependencies = [ "base64 0.22.1", "bytes 1.10.1", @@ -5091,7 +5300,7 @@ dependencies = [ "futures-channel", "futures-core", "futures-util", - "http", + "http 1.3.1", "http-body", "http-body-util", "hyper", @@ -5138,6 +5347,15 @@ dependencies = [ "url", ] +[[package]] +name = "retry" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac95c60a949a63fd2822f4964939662d8f2c16c4fa0624fd954bc6e703b9a3f6" +dependencies = [ + "rand 0.8.5", +] + [[package]] name = "rfc6979" version = "0.4.0" @@ -5150,9 +5368,9 @@ dependencies = [ [[package]] name = "ring" -version = "0.17.13" +version = "0.17.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70ac5d832aa16abd7d1def883a8545280c20a60f523a370aa3a9617c2b8550ee" +checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" dependencies = [ "cc", "cfg-if 1.0.0", @@ -5211,9 +5429,9 @@ dependencies = [ [[package]] name = "rsa" -version = "0.9.7" +version = "0.9.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47c75d7c5c6b673e58bf54d8544a9f432e3a925b0e80f7cd3602ab5c50c55519" +checksum = "78928ac1ed176a5ca1d17e578a1825f3d81ca54cf41053a592584b020cfd691b" dependencies = [ "const-oid", "digest", @@ -5289,9 +5507,9 @@ dependencies = [ [[package]] name = "rust_decimal" -version = "1.36.0" +version = "1.37.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b082d80e3e3cc52b2ed634388d436fe1f4de6af5786cc2de9ba9737527bdf555" +checksum = "faa7de2ba56ac291bd90c6b9bece784a52ae1411f9506544b3eae36dd2356d50" dependencies = [ "arrayvec", "borsh", @@ -5359,14 +5577,14 @@ dependencies = [ [[package]] name = "rustix" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7178faa4b75a30e269c71e61c353ce2748cf3d76f0c44c393f4e60abf49b825" +checksum = "e56a18552996ac8d29ecc3b190b4fdbb2d91ca4ec396de7bbffaf43f3d637e96" dependencies = [ "bitflags 2.9.0", "errno 0.3.10", "libc", - "linux-raw-sys 0.9.2", + "linux-raw-sys 0.9.3", "windows-sys 0.59.0", ] @@ -5414,14 +5632,14 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.23" +version = "0.23.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47796c98c480fce5406ef69d1c76378375492c3b0a0de587be0c1d9feb12f395" +checksum = "822ee9188ac4ec04a2f0531e55d035fb2de73f18b41a63c70c2712503b6fb13c" dependencies = [ "once_cell", "ring", "rustls-pki-types", - "rustls-webpki", + "rustls-webpki 0.103.1", "subtle", "zeroize", ] @@ -5467,6 +5685,17 @@ dependencies = [ "untrusted", ] +[[package]] +name = "rustls-webpki" +version = "0.103.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fef8b8769aaccf73098557a87cd1816b4f9c7c16811c9c77142aa695c16f2c03" +dependencies = [ + "ring", + "rustls-pki-types", + "untrusted", +] + [[package]] name = "rustversion" version = "1.0.20" @@ -5580,7 +5809,7 @@ checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" dependencies = [ "base16ct", "der", - "generic-array", + "generic-array 0.14.7", "pkcs8", "subtle", "zeroize", @@ -5628,7 +5857,7 @@ dependencies = [ "block-padding", "blowfish", "buffered-reader", - "bzip2", + "bzip2 0.5.2", "camellia", "cast5", "cfb-mode", @@ -5693,6 +5922,15 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "serde-big-array" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11fc7cc2c76d73e0f27ee52abbd64eec84d46f370c88371120433196934e4b7f" +dependencies = [ + "serde", +] + [[package]] name = "serde-enum-str" version = "0.4.0" @@ -5712,6 +5950,15 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "794e44574226fc701e3be5c651feb7939038fc67fb73f6f4dd5c4ba90fd3be70" +[[package]] +name = "serde_bytes" +version = "0.11.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8437fd221bde2d4ca316d61b90e337e9e702b3820b87d63caa9ba6c02bd06d96" +dependencies = [ + "serde", +] + [[package]] name = "serde_derive" version = "1.0.219" @@ -5787,7 +6034,7 @@ version = "0.9.34+deprecated" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a8b1a1a2ebf674015cc02edccce75287f1a0130d394307b36743c2f5d504b47" dependencies = [ - "indexmap 2.7.1", + "indexmap 2.8.0", "itoa", "ryu", "serde", @@ -5816,6 +6063,27 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "sev" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fd749a01c88a51ac718b59fe571177b31e478dfe059267977042477a0531224" +dependencies = [ + "bincode", + "bitfield", + "bitflags 1.3.2", + "codicon", + "dirs", + "hex", + "iocuddle", + "kvm-ioctls", + "serde", + "serde-big-array", + "serde_bytes", + "static_assertions", + "uuid", +] + [[package]] name = "sha1" version = "0.10.6" @@ -5835,7 +6103,7 @@ checksum = "1f606421e4a6012877e893c399822a4ed4b089164c5969424e1b9d1e66e6964b" dependencies = [ "const-oid", "digest", - "generic-array", + "generic-array 1.2.0", ] [[package]] @@ -5915,7 +6183,7 @@ dependencies = [ "regex", "ring", "rsa", - "rustls-webpki", + "rustls-webpki 0.102.8", "scrypt", "serde", "serde_json", @@ -5939,6 +6207,18 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3a9fe34e3e7a50316060351f37187a3f546bce95496156754b601a5fa71b76e" +[[package]] +name = "simple_asn1" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "297f631f50729c8c99b84667867963997ec0b50f32b2a7dbcab828ef0541e8bb" +dependencies = [ + "num-bigint", + "num-traits", + "thiserror 2.0.12", + "time", +] + [[package]] name = "siphasher" version = "1.0.1" @@ -6053,9 +6333,9 @@ dependencies = [ [[package]] name = "socket2" -version = "0.5.8" +version = "0.5.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c970269d99b64e60ec3bd6ad27270092a5394c4e309314b18ae3fe575695fbe8" +checksum = "4f5fd57c80058a56cf5c777ab8a126398ece8e442983605d280a44ce79d0edef" dependencies = [ "libc", "windows-sys 0.52.0", @@ -6091,9 +6371,9 @@ checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" [[package]] name = "string_cache" -version = "0.8.8" +version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "938d512196766101d333398efde81bc1f37b00cb42c2f8350e5df639f040bbbe" +checksum = "bf776ba3fa74f83bf4b63c3dcbbf82173db2632ed8452cb2d891d33f459de70f" dependencies = [ "new_debug_unreachable", "parking_lot 0.12.3", @@ -6248,15 +6528,14 @@ checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" [[package]] name = "tempfile" -version = "3.18.0" +version = "3.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c317e0a526ee6120d8dabad239c8dadca62b24b6f168914bbbc8e2fb1f0e567" +checksum = "7437ac7763b9b123ccf33c338a5cc1bac6f69b45a136c19bdd8a65e3916435bf" dependencies = [ - "cfg-if 1.0.0", "fastrand 2.3.0", - "getrandom 0.3.1", + "getrandom 0.3.2", "once_cell", - "rustix 1.0.2", + "rustix 1.0.3", "windows-sys 0.59.0", ] @@ -6345,9 +6624,9 @@ dependencies = [ [[package]] name = "time" -version = "0.3.39" +version = "0.3.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dad298b01a40a23aac4580b67e3dbedb7cc8402f3592d7f49469de2ea4aecdd8" +checksum = "8a7619e19bc266e0f9c5e6686659d394bc57973859340060a69221e57dbc0c40" dependencies = [ "deranged", "itoa", @@ -6360,15 +6639,15 @@ dependencies = [ [[package]] name = "time-core" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "765c97a5b985b7c11d7bc27fa927dc4fe6af3a6dfb021d28deb60d3bf51e76ef" +checksum = "c9e9a38711f559d9e3ce1cdb06dd7c5b8ea546bc90052da6d06bb76da74bb07c" [[package]] name = "time-macros" -version = "0.2.20" +version = "0.2.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8093bc3e81c3bc5f7879de09619d06c9a5a5e45ca44dfeeb7225bae38005c5c" +checksum = "3526739392ec93fd8b359c8e98514cb3e8e021beb4e5f597b00a0221f8ed8a49" dependencies = [ "num-conv", "time-core", @@ -6431,9 +6710,9 @@ dependencies = [ [[package]] name = "tokio" -version = "1.44.0" +version = "1.44.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9975ea0f48b5aa3972bf2d888c238182458437cc2a19374b81b25cdf1023fb3a" +checksum = "f382da615b842244d4b8738c82ed1275e6c5dd90c459a30941cd07080b06c91a" dependencies = [ "backtrace", "bytes 1.10.1", @@ -6442,7 +6721,7 @@ dependencies = [ "parking_lot 0.12.3", "pin-project-lite", "signal-hook-registry", - "socket2 0.5.8", + "socket2 0.5.9", "tokio-macros", "windows-sys 0.52.0", ] @@ -6481,9 +6760,9 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.13" +version = "0.7.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7fcaa8d55a2bdd6b83ace262b016eca0d79ee02818c5c1bcdf0305114081078" +checksum = "6b9590b93e6fcc1739458317cccd391ad3955e2bde8913edf6f95f9e65a8f034" dependencies = [ "bytes 1.10.1", "futures-core", @@ -6539,7 +6818,7 @@ version = "0.19.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" dependencies = [ - "indexmap 2.7.1", + "indexmap 2.8.0", "toml_datetime", "winnow 0.5.40", ] @@ -6550,9 +6829,9 @@ version = "0.22.24" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "17b4795ff5edd201c7cd6dca065ae59972ce77d1b80fa0a84d94950ece7d1474" dependencies = [ - "indexmap 2.7.1", + "indexmap 2.8.0", "toml_datetime", - "winnow 0.7.3", + "winnow 0.7.4", ] [[package]] @@ -6879,9 +7158,12 @@ checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "uuid" -version = "1.15.1" +version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0f540e3240398cce6128b64ba83fdbdd86129c16a3aa1a3a252efd66eb3d587" +checksum = "458f7a779bf54acc9f347480ac654f68407d3aab21269a6e3c9f922acd9e2da9" +dependencies = [ + "serde", +] [[package]] name = "valuable" @@ -6891,9 +7173,18 @@ checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" [[package]] name = "value-bag" -version = "1.10.0" +version = "1.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ef4c4aa54d5d05a279399bfa921ec387b7aba77caf7a682ae8d86785b8fdad2" +checksum = "943ce29a8a743eb10d6082545d861b24f9d1b160b7d741e0f2cdf726bec909c5" + +[[package]] +name = "verity" +version = "0.1.0" +dependencies = [ + "generic-array 0.14.7", + "sha2", + "zerocopy 0.6.6", +] [[package]] name = "version_check" @@ -6901,6 +7192,16 @@ version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" +[[package]] +name = "vmm-sys-util" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d1435039746e20da4f8d507a72ee1b916f7b4b05af7a91c093d2c6561934ede" +dependencies = [ + "bitflags 1.3.2", + "libc", +] + [[package]] name = "vsock" version = "0.2.6" @@ -6971,9 +7272,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasi" -version = "0.13.3+wasi-0.2.2" +version = "0.14.2+wasi-0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26816d2e1a4a36a2940b96c5296ce403917633dff8f3440e9b236ed6f6bacad2" +checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" dependencies = [ "wit-bindgen-rt", ] @@ -7166,7 +7467,7 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e48a53791691ab099e5e2ad123536d0fff50652600abaf43bbf952894110d0be" dependencies = [ - "windows-core", + "windows-core 0.52.0", "windows-targets 0.52.6", ] @@ -7179,40 +7480,83 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "windows-core" +version = "0.61.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4763c1de310c86d75a878046489e2e5ba02c649d185f21c67d4cf8a56d098980" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-link", + "windows-result", + "windows-strings 0.4.0", +] + +[[package]] +name = "windows-implement" +version = "0.60.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", +] + +[[package]] +name = "windows-interface" +version = "0.59.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", +] + [[package]] name = "windows-link" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6dccfd733ce2b1753b03b6d3c65edf020262ea35e20ccdf3e288043e6dd620e3" +checksum = "76840935b766e1b0a05c0066835fb9ec80071d4c09a16f6bd5f7e655e3c14c38" [[package]] name = "windows-registry" -version = "0.2.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e400001bb720a623c1c69032f8e3e4cf09984deec740f007dd2b03ec864804b0" +checksum = "4286ad90ddb45071efd1a66dfa43eb02dd0dfbae1545ad6cc3c51cf34d7e8ba3" dependencies = [ "windows-result", - "windows-strings", - "windows-targets 0.52.6", + "windows-strings 0.3.1", + "windows-targets 0.53.0", ] [[package]] name = "windows-result" -version = "0.2.0" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d1043d8214f791817bab27572aaa8af63732e11bf84aa21a45a78d6c317ae0e" +checksum = "c64fd11a4fd95df68efcfee5f44a294fe71b8bc6a91993e2791938abcc712252" dependencies = [ - "windows-targets 0.52.6", + "windows-link", ] [[package]] name = "windows-strings" -version = "0.1.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10" +checksum = "87fa48cc5d406560701792be122a10132491cff9d0aeb23583cc2dcafc847319" dependencies = [ - "windows-result", - "windows-targets 0.52.6", + "windows-link", +] + +[[package]] +name = "windows-strings" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a2ba9642430ee452d5a7aa78d72907ebe8cfda358e8cb7918a2050581322f97" +dependencies = [ + "windows-link", ] [[package]] @@ -7290,13 +7634,29 @@ dependencies = [ "windows_aarch64_gnullvm 0.52.6", "windows_aarch64_msvc 0.52.6", "windows_i686_gnu 0.52.6", - "windows_i686_gnullvm", + "windows_i686_gnullvm 0.52.6", "windows_i686_msvc 0.52.6", "windows_x86_64_gnu 0.52.6", "windows_x86_64_gnullvm 0.52.6", "windows_x86_64_msvc 0.52.6", ] +[[package]] +name = "windows-targets" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1e4c7e8ceaaf9cb7d7507c974735728ab453b67ef8f18febdd7c11fe59dca8b" +dependencies = [ + "windows_aarch64_gnullvm 0.53.0", + "windows_aarch64_msvc 0.53.0", + "windows_i686_gnu 0.53.0", + "windows_i686_gnullvm 0.53.0", + "windows_i686_msvc 0.53.0", + "windows_x86_64_gnu 0.53.0", + "windows_x86_64_gnullvm 0.53.0", + "windows_x86_64_msvc 0.53.0", +] + [[package]] name = "windows_aarch64_gnullvm" version = "0.42.2" @@ -7315,6 +7675,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764" + [[package]] name = "windows_aarch64_msvc" version = "0.42.2" @@ -7333,6 +7699,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" +[[package]] +name = "windows_aarch64_msvc" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c" + [[package]] name = "windows_i686_gnu" version = "0.42.2" @@ -7351,12 +7723,24 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" +[[package]] +name = "windows_i686_gnu" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1dc67659d35f387f5f6c479dc4e28f1d4bb90ddd1a5d3da2e5d97b42d6272c3" + [[package]] name = "windows_i686_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" +[[package]] +name = "windows_i686_gnullvm" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11" + [[package]] name = "windows_i686_msvc" version = "0.42.2" @@ -7375,6 +7759,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" +[[package]] +name = "windows_i686_msvc" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d" + [[package]] name = "windows_x86_64_gnu" version = "0.42.2" @@ -7393,6 +7783,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" +[[package]] +name = "windows_x86_64_gnu" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba" + [[package]] name = "windows_x86_64_gnullvm" version = "0.42.2" @@ -7411,6 +7807,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57" + [[package]] name = "windows_x86_64_msvc" version = "0.42.2" @@ -7429,6 +7831,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" +[[package]] +name = "windows_x86_64_msvc" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" + [[package]] name = "winnow" version = "0.5.40" @@ -7440,18 +7848,18 @@ dependencies = [ [[package]] name = "winnow" -version = "0.7.3" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e7f4ea97f6f78012141bcdb6a216b2609f0979ada50b20ca5b52dde2eac2bb1" +checksum = "0e97b544156e9bebe1a0ffbc03484fc1ffe3100cbce3ffb17eac35f7cdd7ab36" dependencies = [ "memchr", ] [[package]] name = "wit-bindgen-rt" -version = "0.33.0" +version = "0.39.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3268f3d866458b787f390cf61f4bbb563b922d091359f9608842999eaee3943c" +checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" dependencies = [ "bitflags 2.9.0", ] @@ -7518,7 +7926,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0d65cbf2f12c15564212d48f4e3dfb87923d25d611f2aed18f4cb23f0413d89e" dependencies = [ "libc", - "rustix 1.0.2", + "rustix 1.0.3", ] [[package]] @@ -7627,6 +8035,16 @@ dependencies = [ "zvariant", ] +[[package]] +name = "zerocopy" +version = "0.6.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "854e949ac82d619ee9a14c66a1b674ac730422372ccb759ce0c39cabcf2bf8e6" +dependencies = [ + "byteorder", + "zerocopy-derive 0.6.6", +] + [[package]] name = "zerocopy" version = "0.7.35" @@ -7638,11 +8056,22 @@ dependencies = [ [[package]] name = "zerocopy" -version = "0.8.23" +version = "0.8.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd97444d05a4328b90e75e503a34bad781f14e28a823ad3557f0750df1ebcbc6" +checksum = "2586fea28e186957ef732a5f8b3be2da217d65c5969d4b1e17f973ebbe876879" dependencies = [ - "zerocopy-derive 0.8.23", + "zerocopy-derive 0.8.24", +] + +[[package]] +name = "zerocopy-derive" +version = "0.6.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "125139de3f6b9d625c39e2efdd73d41bdac468ccd556556440e322be0e1bbd91" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", ] [[package]] @@ -7658,9 +8087,9 @@ dependencies = [ [[package]] name = "zerocopy-derive" -version = "0.8.23" +version = "0.8.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6352c01d0edd5db859a63e2605f4ea3183ddbd15e2c4a9e7d32184df75e4f154" +checksum = "a996a8f63c5c4448cd959ac1bab0aaa3306ccfd060472f85943ee0750f0169be" dependencies = [ "proc-macro2", "quote", @@ -7669,9 +8098,9 @@ dependencies = [ [[package]] name = "zerofrom" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cff3ee08c995dee1859d998dea82f7374f2826091dd9cd47def953cae446cd2e" +checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" dependencies = [ "zerofrom-derive", ] @@ -7741,18 +8170,18 @@ dependencies = [ [[package]] name = "zstd-safe" -version = "7.2.3" +version = "7.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3051792fbdc2e1e143244dc28c60f73d8470e93f3f9cbd0ead44da5ed802722" +checksum = "8f49c4d5f0abb602a93fb8736af2a4f4dd9512e36f7f570d66e65ff867ed3b9d" dependencies = [ "zstd-sys", ] [[package]] name = "zstd-sys" -version = "2.0.14+zstd.1.5.7" +version = "2.0.15+zstd.1.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fb060d4926e4ac3a3ad15d864e99ceb5f343c6b34f5bd6d81ae6ed417311be5" +checksum = "eb81183ddd97d0c74cedf1d50d85c8d08c1b8b68ee863bdee9e706eedba1a237" dependencies = [ "cc", "pkg-config", diff --git a/src/agent/Cargo.toml b/src/agent/Cargo.toml index 60c96e80be3d..2f081482d5fa 100644 --- a/src/agent/Cargo.toml +++ b/src/agent/Cargo.toml @@ -13,7 +13,7 @@ rustjail = { path = "rustjail" } protocols = { path = "../libs/protocols", features = ["async", "with-serde"] } lazy_static = "1.3.0" ttrpc = { version = "0.8.4", features = ["async"], default-features = false } -protobuf = "3.2.0" +protobuf = "=3.7.1" libc = "0.2.58" nix = "0.24.2" capctl = "0.2.0" @@ -29,6 +29,13 @@ kata-sys-util = { path = "../libs/kata-sys-util" } kata-types = { path = "../libs/kata-types" } safe-path = { path = "../libs/safe-path" } const_format = "0.2.30" +bzip2 = "0.4.4" +h2 = "0.3.17" +simple_asn1 = "0.6.1" +verity = { path = "../tardev-snapshotter/verity" } +zerocopy = "0.6.1" +devicemapper = "0.33.1" +proc-mounts = "0.3.0" # Async helpers async-trait = "0.1.42" @@ -103,7 +110,7 @@ lto = true default-pull = ["guest-pull"] seccomp = ["rustjail/seccomp"] standard-oci-runtime = ["rustjail/standard-oci-runtime"] -agent-policy = [ "kata-agent-policy" ] +agent-policy = ["kata-agent-policy"] guest-pull = ["image-rs/kata-cc-rustls-tls"] [[bin]] diff --git a/src/agent/policy/Cargo.toml b/src/agent/policy/Cargo.toml index 4bf98fb19290..7812d4c714f1 100644 --- a/src/agent/policy/Cargo.toml +++ b/src/agent/policy/Cargo.toml @@ -1,29 +1,41 @@ [package] name = "kata-agent-policy" version = "0.1.0" -authors = ["The Kata Containers community "] +authors = [ + "The Kata Containers community ", +] edition = "2018" license = "Apache-2.0" [dependencies] # Async runtime -tokio = { version = "1.39.0", features = ["full"] } +tokio = { version = "1.39.0", features = [ + "full", +] } tokio-vsock = "0.3.4" anyhow = "1" # Configuration -serde = { version = "1.0.129", features = ["derive"] } +serde = { version = "1.0.129", features = [ + "derive", +] } serde_json = "1.0.39" # Agent Policy regorus = { version = "0.2.8", default-features = false, features = [ "arc", + "base64", + "base64url", "regex", "std", ] } json-patch = "2.0.0" - +sha2 = { version = "0.10.6" } +sev = { version = "1.2", default-features = false, features = [ + "snp", +] } +protocols = { path = "../../libs/protocols" } # Note: this crate sets the slog 'max_*' features which allows the log level # to be modified at runtime. diff --git a/src/agent/policy/src/policy.rs b/src/agent/policy/src/policy.rs index 34f107385377..e5cab5d9ed52 100644 --- a/src/agent/policy/src/policy.rs +++ b/src/agent/policy/src/policy.rs @@ -7,11 +7,12 @@ //! Policy evaluation for the kata-agent. use anyhow::{bail, Result}; -use slog::{debug, error, info, warn}; +use sha2::{Digest, Sha256}; +use slog::{debug, error, warn}; +use std::path::PathBuf; use tokio::io::AsyncWriteExt; static POLICY_LOG_FILE: &str = "/tmp/policy.txt"; -static POLICY_DEFAULT_FILE: &str = "/etc/kata-opa/default-policy.rego"; /// Convenience macro to obtain the scope logger macro_rules! sl { @@ -20,6 +21,37 @@ macro_rules! sl { }; } +/// PolicyCopyFileRequest is very similar to CopyFileRequest from src/libs/protocols, except: +/// - When creating a symbolic link, the symlink_src field is a string representation of the +/// data bytes vector from CopyFileRequest. It's easier to verify a string compared with +/// a bytes vector in OPA. +/// - When not creating a symbolic link, the data bytes field from CopyFileRequest is not +/// present in PolicyCopyFileRequest, because it might be large and probably unused by OPA. +#[derive(::serde::Serialize, ::serde::Deserialize, Default)] +#[serde(default)] +pub struct PolicyCopyFileRequest { + pub path: String, + pub file_size: i64, + pub file_mode: u32, + pub dir_mode: u32, + pub uid: i32, + pub gid: i32, + pub offset: i64, + + pub symlink_src: PathBuf, +} + +/// PolicyCreateContainerRequest is very similar to CreateContainerRequest from src/libs/protocols, except: +/// - It wraps the base CreateContainerRequest. +/// - It has an env_map field which is a map of environment variable names to expanded values. +/// This makes it easier to validate the environment variables inside the rego rules. +#[derive(Debug, serde::Serialize, serde::Deserialize)] +pub struct PolicyCreateContainerRequest { + pub base: protocols::agent::CreateContainerRequest, + // a map of environment variable names to value + pub env_map: std::collections::BTreeMap, +} + /// Singleton policy object. #[derive(Debug, Default)] pub struct AgentPolicy { @@ -71,7 +103,7 @@ impl AgentPolicy { pub async fn initialize( &mut self, log_level: usize, - default_policy_file: String, + default_policy_file: &str, log_file: Option, ) -> Result<()> { // log file path @@ -87,20 +119,12 @@ impl AgentPolicy { .write(true) .truncate(true) .create(true) - .open(&log_file_path) + .open(log_file_path) .await?, ); debug!(sl!(), "policy: log file: {}", log_file_path); } - // Check if policy file has been set via AgentConfig - // If empty, use default file. - let mut default_policy_file = default_policy_file; - if default_policy_file.is_empty() { - default_policy_file = POLICY_DEFAULT_FILE.to_string(); - } - info!(sl!(), "default policy: {default_policy_file}"); - self.engine.add_policy_from_file(default_policy_file)?; self.update_allow_failures_flag().await?; Ok(()) @@ -126,7 +150,7 @@ impl AgentPolicy { /// Ask regorus if an API call should be allowed or not. pub async fn allow_request(&mut self, ep: &str, ep_input: &str) -> Result<(bool, String)> { debug!(sl!(), "policy check: {ep}"); - self.log_eval_input(ep, ep_input).await; + self.log_request(ep, ep_input).await; let query = format!("data.agent_policy.{ep}"); self.engine.set_input_json(ep_input)?; @@ -163,7 +187,7 @@ impl AgentPolicy { regorus::Value::Object(obj) => { let json_str = serde_json::to_string(obj)?; - self.log_eval_input(ep, &json_str).await; + self.log_request(ep, &json_str).await; let metadata_response: MetadataResponse = serde_json::from_str(&json_str)?; @@ -184,9 +208,12 @@ impl AgentPolicy { } }; - if !allow && self.allow_failures { - warn!(sl!(), "policy: ignoring error for {ep}"); - allow = true; + if !allow { + self.log_request(ep, &prints).await; + if self.allow_failures { + warn!(sl!(), "policy: ignoring error for {ep}"); + allow = true; + } } Ok((allow, prints)) @@ -194,6 +221,7 @@ impl AgentPolicy { /// Replace the Policy in regorus. pub async fn set_policy(&mut self, policy: &str) -> Result<()> { + check_policy_hash(policy)?; self.engine = Self::new_engine(); self.engine .add_policy("agent_policy".to_string(), policy.to_string())?; @@ -201,24 +229,22 @@ impl AgentPolicy { Ok(()) } - async fn log_eval_input(&mut self, ep: &str, input: &str) { + async fn log_request(&mut self, ep: &str, input: &str) { if let Some(log_file) = &mut self.log_file { match ep { - "StatsContainerRequest" | "ReadStreamRequest" | "SetPolicyRequest" => { - // - StatsContainerRequest and ReadStreamRequest are called - // relatively often, so we're not logging them, to avoid - // growing this log file too much. - // - Confidential Containers Policy documents are relatively - // large, so we're not logging them here, for SetPolicyRequest. - // The Policy text can be obtained directly from the pod YAML. + "StatsContainerRequest" + | "ReadStreamRequest" + | "SetPolicyRequest" + | "AllowRequestsFailingPolicy" => { + // Logging these request types would create too much unnecessary output. } _ => { let log_entry = format!("[\"ep\":\"{ep}\",{input}],\n\n"); if let Err(e) = log_file.write_all(log_entry.as_bytes()).await { - warn!(sl!(), "policy: log_eval_input: write_all failed: {}", e); + warn!(sl!(), "policy: log_request: write_all failed: {}", e); } else if let Err(e) = log_file.flush().await { - warn!(sl!(), "policy: log_eval_input: flush failed: {}", e); + warn!(sl!(), "policy: log_request: flush failed: {}", e); } } } @@ -241,3 +267,24 @@ impl AgentPolicy { Ok(()) } } + +pub fn check_policy_hash(policy: &str) -> Result<()> { + let mut hasher = Sha256::new(); + hasher.update(policy.as_bytes()); + let digest = hasher.finalize(); + debug!(sl!(), "policy: calculated hash ({:?})", digest.as_slice()); + + let mut firmware = sev::firmware::guest::Firmware::open()?; + let report_data: [u8; 64] = [0; 64]; + let report = firmware.get_report(None, Some(report_data), Some(0))?; + + if report.host_data != digest.as_slice() { + bail!( + "Unexpected policy hash ({:?}), expected ({:?})", + digest.as_slice(), + report.host_data + ); + } + + Ok(()) +} diff --git a/src/agent/rustjail/src/container.rs b/src/agent/rustjail/src/container.rs index a1eb6974a482..deb4837b41bd 100644 --- a/src/agent/rustjail/src/container.rs +++ b/src/agent/rustjail/src/container.rs @@ -152,7 +152,7 @@ lazy_static! { }; pub static ref DEFAULT_DEVICES: Vec = { - vec![ + let mut devices = vec![ oci::LinuxDeviceBuilder::default() .path(PathBuf::from("/dev/null")) .typ(oci::LinuxDeviceType::C) @@ -213,7 +213,24 @@ lazy_static! { .gid(0xffffffff_u32) .build() .unwrap(), - ] + ]; + + let sev_guest_path = "/dev/sev-guest"; + if let Ok(sev_guest_attr) = fs::metadata(sev_guest_path) { + let sev_guest_devid = sev_guest_attr.rdev(); + devices.push(oci::LinuxDeviceBuilder::default() + .path(PathBuf::from(sev_guest_path)) + .typ(oci::LinuxDeviceType::C) + .major(stat::major(sev_guest_devid) as i64) + .minor(stat::minor(sev_guest_devid) as i64) + .file_mode(0o066_u32) + .uid(sev_guest_attr.uid()) + .gid(sev_guest_attr.gid()) + .build() + .unwrap()); + }; + + devices }; pub static ref SYSTEMD_CGROUP_PATH_FORMAT:Regex = Regex::new(r"^[\w\-.]*:[\w\-.]*:[\w\-.]*$").unwrap(); diff --git a/src/agent/samples/policy/yaml/configmap/pod-cm1.yaml b/src/agent/samples/policy/yaml/configmap/pod-cm1.yaml new file mode 100644 index 000000000000..c4a667e094d1 --- /dev/null +++ b/src/agent/samples/policy/yaml/configmap/pod-cm1.yaml @@ -0,0 +1,37 @@ +--- +apiVersion: v1 +kind: ConfigMap +metadata: + name: config-map1 +data: + simple_value1: value1 +--- +apiVersion: v1 +kind: Pod +metadata: + name: cm1 + labels: + run: busybox + annotations: + io.katacontainers.config.agent.policy: IyBDb3B5cmlnaHQgKGMpIDIwMjMgTWljcm9zb2Z0IENvcnBvcmF0aW9uCiMKIyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMAojCnBhY2thZ2UgYWdlbnRfcG9saWN5CgppbXBvcnQgZnV0dXJlLmtleXdvcmRzLmluCmltcG9ydCBmdXR1cmUua2V5d29yZHMuZXZlcnkKCiMgRGVmYXVsdCB2YWx1ZXMsIHJldHVybmVkIGJ5IE9QQSB3aGVuIHJ1bGVzIGNhbm5vdCBiZSBldmFsdWF0ZWQgdG8gdHJ1ZS4KZGVmYXVsdCBBZGRBUlBOZWlnaGJvcnNSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgQWRkU3dhcFJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBDbG9zZVN0ZGluUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IENvcHlGaWxlUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IENyZWF0ZUNvbnRhaW5lclJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBDcmVhdGVTYW5kYm94UmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IERlc3Ryb3lTYW5kYm94UmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgRXhlY1Byb2Nlc3NSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgR2V0T09NRXZlbnRSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBHdWVzdERldGFpbHNSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBMaXN0SW50ZXJmYWNlc1JlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBMaXN0Um91dGVzUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IE1lbUhvdHBsdWdCeVByb2JlUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IE9ubGluZUNQVU1lbVJlcXVlc3QgOj0gdHJ1ZQpkZWZhdWx0IFBhdXNlQ29udGFpbmVyUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFJlYWRTdHJlYW1SZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgUmVtb3ZlQ29udGFpbmVyUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgUmVtb3ZlU3RhbGVWaXJ0aW9mc1NoYXJlTW91bnRzUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgUmVzZWVkUmFuZG9tRGV2UmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFJlc3VtZUNvbnRhaW5lclJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBTZXRHdWVzdERhdGVUaW1lUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFNldFBvbGljeVJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBTaWduYWxQcm9jZXNzUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgU3RhcnRDb250YWluZXJSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBTdGFydFRyYWNpbmdSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgU3RhdHNDb250YWluZXJSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBTdG9wVHJhY2luZ1JlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBUdHlXaW5SZXNpemVSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBVcGRhdGVDb250YWluZXJSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgVXBkYXRlRXBoZW1lcmFsTW91bnRzUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFVwZGF0ZUludGVyZmFjZVJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBVcGRhdGVSb3V0ZXNSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgV2FpdFByb2Nlc3NSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBXcml0ZVN0cmVhbVJlcXVlc3QgOj0gZmFsc2UKCiMgQWxsb3dSZXF1ZXN0c0ZhaWxpbmdQb2xpY3kgOj0gdHJ1ZSBjb25maWd1cmVzIHRoZSBBZ2VudCB0byAqYWxsb3cgYW55CiMgcmVxdWVzdHMgY2F1c2luZyBhIHBvbGljeSBmYWlsdXJlKi4gVGhpcyBpcyBhbiB1bnNlY3VyZSBjb25maWd1cmF0aW9uCiMgYnV0IGlzIHVzZWZ1bCBmb3IgYWxsb3dpbmcgdW5zZWN1cmUgcG9kcyB0byBzdGFydCwgdGhlbiBjb25uZWN0IHRvCiMgdGhlbSBhbmQgaW5zcGVjdCBPUEEgbG9ncyBmb3IgdGhlIHJvb3QgY2F1c2Ugb2YgYSBmYWlsdXJlLgpkZWZhdWx0IEFsbG93UmVxdWVzdHNGYWlsaW5nUG9saWN5IDo9IGZhbHNlCgojIENvbnN0YW50cwpTX05BTUVfS0VZID0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZSIKU19OQU1FU1BBQ0VfS0VZID0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZXNwYWNlIgpCVU5ETEVfSUQgPSAiW2EtejAtOV17NjR9IgoKQ3JlYXRlQ29udGFpbmVyUmVxdWVzdDo9IHJlc3AgewogICAgbm90IGlzX251bGwoaW5wdXQuZW52X21hcCkKICAgIAogICAgaV9lbnZfbWFwIDo9IGlucHV0LmVudl9tYXAKICAgIAogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBwX2Vudl9tYXAgOj0gcF9jb250YWluZXIuZW52X21hcCAgCiAgICBhbGxvd19lbnZfbWFwKHBfZW52X21hcCwgaV9lbnZfbWFwKQogICAgCiAgICBpX3Byb2Nlc3MgOj0gaW5wdXQuYmFzZS5PQ0kuUHJvY2VzcwogICAgCiAgICBwX3Byb2Nlc3MgOj0gcF9jb250YWluZXIuT0NJLlByb2Nlc3MKICAgIAogICAgYWxsb3dfYXJncyhpX3Byb2Nlc3MsIHBfcHJvY2VzcywgaV9lbnZfbWFwKQoKICAgIHJlc3AgPSBDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uKGlucHV0LmJhc2UpCiAgICBwcmludCgiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdDogdHJ1ZSIpCn0KCmFsbG93X2FyZ3MoaV9wcm9jZXNzLCBwX3Byb2Nlc3MsIGlfZW52X21hcCkgewogICAgaV9hcmdzIDo9IGlfcHJvY2Vzcy5BcmdzCiAgICBwX2FyZ3MgOj0gcF9wcm9jZXNzLkFyZ3MKICAgIHByaW50KCJhbGxvd19hcmdzOiBpX2FyZ3MgPSIsIGlfYXJncywgInBfYXJncyA9IiwgcF9hcmdzKQogICAgY291bnQoaV9hcmdzKSA9PSBjb3VudChwX2FyZ3MpCiAgICBldmVyeSBpLCBpX2FyZyBpbiBpX2FyZ3MgewogICAgICAgIHByaW50KCJhbGxvd19hcmdzOiBpX2FyZyA9IiwgaV9hcmcpCiAgICAgICAgcF9hcmdfcmVwbGFjZWQgOj0gcmVwbGFjZV9lbnZfdmFyaWFibGVzKHBfYXJnc1tpXSwgaV9lbnZfbWFwKQogICAgICAgIHByaW50KCJhbGxvd19hcmdzOiBwX2FyZ19yZXBsYWNlZCA9IiwgcF9hcmdfcmVwbGFjZWQpCiAgICAgICAgcF9hcmdfcmVwbGFjZWQyIDo9IHJlcGxhY2UocF9hcmdfcmVwbGFjZWQsICIkJCIsICIkIikKICAgICAgICBwcmludCgiYWxsb3dfYXJnczogcF9hcmdfcmVwbGFjZWQyID0iLCBwX2FyZ19yZXBsYWNlZDIpCiAgICAgICAgaV9hcmcgPT0gcF9hcmdfcmVwbGFjZWQyCiAgICB9CiAgICBwcmludCgiYWxsb3dfYXJnczogdHJ1ZSIpCn0KCmFsbG93X2FyZ3MoaV9wcm9jZXNzLCBwX3Byb2Nlc3MsIGlfZW52X21hcCkgewogICAgbm90IGlfcHJvY2Vzcy5BcmdzCiAgICBub3QgcF9wcm9jZXNzLkFyZ3MKICAgIHByaW50KCJhbGxvd19hcmdzMjogbm8gYXJncyIpCn0KCiMgdGhpcyBmdW5jdGlvbiByZXBsYWNlcyBhbGwgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyBpbiBhIHN0cmluZywgZ2l2ZW4gYSBtYXAgb2YgZW52aXJvbm1lbnQga2V5cyB0byBlbnZpcm9ubWVudCB2YWx1ZXMKIyBlZyBzdHIgPSAiZWNobyAkKENMVVNURVJfSUQpOyBlY2hvICQoTk9ERV9OQU1FKTsiCiMgZW52X21hcCA9IHsiQ0xVU1RFUl9JRCI6ICJhYmMiLCAiTk9ERV9OQU1FIiA6ICJ4eXoifQojIHJlc3VsdCA9ICJlY2hvIGFiYzsgZWNobyB4eXo7IgpyZXBsYWNlX2Vudl92YXJpYWJsZXMoc3RyLCBlbnZfbWFwKSA9IHJlc3VsdCB7CiAgICAjIG1ha2UgYW4gYXJyYXkgb2YgdGhlIGtleXMgZWcgWyJDTFVTVEVSX0lEIiwgIk5PREVfTkFNRSJdCiAgICBrZXlzIDo9IFt4IHwgc29tZSB4IGluIG9iamVjdC5rZXlzKGVudl9tYXApXQogICAgcmVzdWx0IDo9IHJlcGxhY2Vfc3RyX3JlYyhzdHIsIGVudl9tYXAsIGtleXMsIGNvdW50KGtleXMpIC0gMSkKfQoKIyBiYXNlIGNhc2UKcmVwbGFjZV9zdHJfcmVjKHN0ciwgZW52X21hcCwgYXJyX2tleXMsIGkpID0gcmVzdWx0IHsKICAgIGkgPCAwCiAgICByZXN1bHQgOj0gc3RyCn0KCiMgcmVjdXJzaXZlIHN0ZXAKcmVwbGFjZV9zdHJfcmVjKHN0ciwgZW52X21hcCwgYXJyX2tleXMsIGkpID0gcmVzdWx0IHsKICAgIGkgPj0gMAogICAga2V5IDo9IGFycl9rZXlzW2ldCiAgICBlbnZfa2V5MSA6PSBjb25jYXQoIiIsIFsiJCgiLCBrZXksICIpIl0pCiAgICAjIHJlcGxhY2UgJChWQVIpIHdpdGggdmFsdWUKICAgIG5ld19zdHIxIDo9IHJlcGxhY2Uoc3RyLCBlbnZfa2V5MSwgZW52X21hcFtrZXldKQogICAgIyByZXBsYWNlIG5leHQgZW52aXJvbm1lbnQgdmFyaWFibGUKICAgIHJlc3VsdCA9IHJlcGxhY2Vfc3RyX3JlYyhuZXdfc3RyMSwgZW52X21hcCwgYXJyX2tleXMsIGkgLSAxKQp9CgphbGxvd19lbnZfbWFwKHBfZW52X21hcCwgaV9lbnZfbWFwKSB7CiAgICBwcmludCgiYWxsb3dfZW52X21hcDogcF9lbnZfbWFwID0iLCBwX2Vudl9tYXApCiAgICBldmVyeSBlbnZfa2V5LCBlbnZfdmFsIGluIGlfZW52X21hcCB7CiAgICAgICAgcHJpbnQoImFsbG93X2VudjogZW52X2tleSA9IiwgZW52X2tleSwgImVudl92YWwgPSIsIGVudl92YWwpCiAgICAgICAgYWxsb3dfZW52X21hcF9lbnRyeShlbnZfa2V5LCBlbnZfdmFsLCBwX2Vudl9tYXApCiAgICB9CiAgICBwcmludCgiYWxsb3dfZW52X21hcDogdHJ1ZSIpCn0KCiMgQWxsb3cgZXhhY3QgbWF0Y2gKYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBpX3ZhbCA9PSBwX3ZhbAogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnk6IHRydWUiKQp9CgojIEFsbG93IHJlc291cmNlRmllbGRSZWYgdmFsdWVzIChlLmcuLCAibGltaXRzLmNwdSIpLgphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgICMgYSB2YXJpYWJsZSB3ZSBzaG91bGQgYmUgdmFsaWRhdGluZyB1c2luZyBhIHJlZ2V4IGZyb20gc2V0dGluZ3MKICAgIHBfdmFsID09ICIkKHZhbGlkYXRlLWZyb20tc2V0dGluZ3MpIgogICAgcmVnZXhfdmFsIDo9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuQ3JlYXRlQ29udGFpbmVyUmVxdWVzdC5hbGxvd19lbnZfcmVnZXhfbWFwW2tleV0KICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4X3ZhbCwgaV92YWwpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSAyOiB0cnVlIikKfQoKIyBBbGxvdyBub2RlLW5hbWUKYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChub2RlLW5hbWUpIgogICAgcmVnZXgubWF0Y2gocG9saWN5X2RhdGEuY29tbW9uLmRuc19zdWJkb21haW4gLCBpX3ZhbCkKICAgIHByaW50KCJhbGxvd19lbnZfbWFwX2VudHJ5IDM6IHRydWUiKQp9CgojIEFsbG93IGhvc3QtbmFtZQphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgIHBfdmFsID09ICIkKGhvc3QtbmFtZSkiCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24uZG5zX2xhYmVsICwgaV92YWwpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSA0OiB0cnVlIikKfQoKIyBBbGxvdyBwb2QtdWlkCmFsbG93X2Vudl9tYXBfZW50cnkoa2V5LCBpX3ZhbCwgcF9lbnZfbWFwKSB7CiAgICBwX3ZhbCA6PSBwX2Vudl9tYXBba2V5XQogICAgcF92YWwgPT0gIiQocG9kLXVpZCkiCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24ucG9kX3VpZCAsIGlfdmFsKQogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgNTogdHJ1ZSIpCn0KCiMgQWxsb3cgZmllbGRSZWYgImZpZWxkUGF0aDogc3RhdHVzLnBvZElQIiB2YWx1ZXMuCmFsbG93X2Vudl9tYXBfZW50cnkoa2V5LCBpX3ZhbCwgcF9lbnZfbWFwKSB7CiAgICBpc19pcChpX3ZhbCkKCiAgICBwX3ZhbCA6PSBwX2Vudl9tYXBba2V5XQogICAgcF92YXIgOj0gY29uY2F0KCI9IiwgW2tleSwgcF92YWxdKQogICAgYWxsb3dfcG9kX2lwX3ZhcihrZXksIHBfdmFyKQogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgNjogdHJ1ZSIpCn0KCiMgQWxsb3cgZmllbGRSZWYgImZpZWxkUGF0aDogc3RhdHVzLmhvc3RJUCIgdmFsdWVzLgphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgaXNfaXAoaV92YWwpCgogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgIHBfdmFyIDo9IGNvbmNhdCgiPSIsIFtrZXksIHBfdmFsXSkKICAgIGFsbG93X2hvc3RfaXBfdmFyKGtleSwgcF92YXIpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSA3OiB0cnVlIikKfQoKIyBNYXRjaCBpbnB1dCB3aXRoIG9uZSBvZiB0aGUgcG9saWN5IHZhcmlhYmxlcywgYWZ0ZXIgc3Vic3RpdHV0aW5nICQoc2FuZGJveC1uYW1lKS4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChzYW5kYm94LW5hbWUpIgogICAgc19uYW1lIDo9IGlucHV0LmJhc2UuT0NJLkFubm90YXRpb25zW1NfTkFNRV9LRVldCiAgICBwX3ZhcjIgOj0gcmVwbGFjZShwX3ZhbCwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHBfdmFyMiA9PSBpX3ZhbAogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgODogdHJ1ZSIpCn0KCiMgTWF0Y2ggaW5wdXQgd2l0aCBvbmUgb2YgdGhlIHBvbGljeSB2YXJpYWJsZXMsIGFmdGVyIHN1YnN0aXR1dGluZyAkKHNhbmRib3gtbmFtZXNwYWNlKS4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChzYW5kYm94LW5hbWVzcGFjZSkiCiAgICBzX25hbWVzcGFjZSA6PSBpbnB1dC5iYXNlLk9DSS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwX3ZhcjIgOj0gcmVwbGFjZShwX3ZhbCwgIiQoc2FuZGJveC1uYW1lc3BhY2UpIiwgc19uYW1lc3BhY2UpCiAgICBwX3ZhcjIgPT0gaV92YWwKICAgIHByaW50KCJhbGxvd19lbnZfbWFwX2VudHJ5IDk6IHRydWUiKQp9CgojIEFsbG93IGlucHV0IGVudiB2YXJpYWJsZXMgdGhhdCBtYXRjaCB3aXRoIGEgcmVxdWVzdF9kZWZhdWx0cyByZWdleC4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHNvbWUgcF9yZWdleDEgaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5DcmVhdGVDb250YWluZXJSZXF1ZXN0LmFsbG93X2Vudl9yZWdleAogICAgcF9yZWdleDIgOj0gcmVwbGFjZShwX3JlZ2V4MSwgIiQoaXB2NF9hKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcHY0X2EpCiAgICBwX3JlZ2V4MyA6PSByZXBsYWNlKHBfcmVnZXgyLCAiJChpcF9wKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcF9wKQogICAgcF9yZWdleDQgOj0gcmVwbGFjZShwX3JlZ2V4MywgIiQoc3ZjX25hbWUpIiwgcG9saWN5X2RhdGEuY29tbW9uLnN2Y19uYW1lKQogICAgcF9yZWdleDUgOj0gcmVwbGFjZShwX3JlZ2V4NCwgIiQoZG5zX2xhYmVsKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5kbnNfbGFiZWwpCgogICAgcmVzdWx0IDo9IGNvbmNhdCgiPSIsIFtrZXksIGlfdmFsXSkKICAgIHJlZ2V4Lm1hdGNoKHBfcmVnZXg1LCByZXN1bHQpCgogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgMTA6IHRydWUiKQp9CgpDcmVhdGVDb250YWluZXJSZXF1ZXN0Oj0gcmVzcCB7CiAgICBub3QgaW5wdXQuZW52X21hcAogICAgaV9wcm9jZXNzID0gaW5wdXQuT0NJLlByb2Nlc3MKICAgIHNfbmFtZSA9IGlucHV0Lk9DSS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBwX3Byb2Nlc3MgPSBwX2NvbnRhaW5lci5PQ0kuUHJvY2VzcwogICAgYWxsb3dfZGVwcmVjYXRlZF9hcmdzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUpCiAgICByZXNwID0gQ3JlYXRlQ29udGFpbmVyUmVxdWVzdENvbW1vbihpbnB1dCkKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0MjogdHJ1ZSIpCn0KCkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb24ocmVxKTo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgICMgQ2hlY2sgaWYgdGhlIGlucHV0IHJlcXVlc3Qgc2hvdWxkIGJlIHJlamVjdGVkIGV2ZW4gYmVmb3JlIGNoZWNraW5nIHRoZQogICAgIyBwb2xpY3lfZGF0YS5jb250YWluZXJzIGluZm9ybWF0aW9uLgogICAgYWxsb3dfY3JlYXRlX2NvbnRhaW5lcl9pbnB1dChyZXEpCgogICAgaV9vY2kgOj0gcmVxLk9DSQogICAgaV9zdG9yYWdlcyA6PSByZXEuc3RvcmFnZXMKICAgIGlfZGV2aWNlcyA6PSByZXEuZGV2aWNlcwoKICAgICMgYXJyYXkgb2YgcG9zc2libGUgc3RhdGUgb3BlcmF0aW9ucwogICAgb3BzX2J1aWxkZXIgOj0gW10KCiAgICAjIGNoZWNrIHNhbmRib3ggbmFtZQogICAgc2FuZGJveF9uYW1lID0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FX0tFWV0KICAgIGFkZF9zYW5kYm94X25hbWVfdG9fc3RhdGUgOj0gc3RhdGVfYWxsb3dzKCJzYW5kYm94X25hbWUiLCBzYW5kYm94X25hbWUpCiAgICBvcHNfYnVpbGRlcjEgOj0gY29uY2F0X29wX2lmX25vdF9udWxsKG9wc19idWlsZGVyLCBhZGRfc2FuZGJveF9uYW1lX3RvX3N0YXRlKQoKICAgICMgQ2hlY2sgaWYgYW55IGVsZW1lbnQgZnJvbSB0aGUgcG9saWN5X2RhdGEuY29udGFpbmVycyBhcnJheSBhbGxvd3MgdGhlIGlucHV0IHJlcXVlc3QuCiAgICBzb21lIHBfY29udGFpbmVyIGluIHBvbGljeV9kYXRhLmNvbnRhaW5lcnMKICAgIHByaW50KCI9PT09PT09PSBDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiB0cnlpbmcgbmV4dCBwb2xpY3kgY29udGFpbmVyIikKCiAgICBwX3BpZG5zIDo9IHBfY29udGFpbmVyLnNhbmRib3hfcGlkbnMKICAgIGlfcGlkbnMgOj0gcmVxLnNhbmRib3hfcGlkbnMKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiBwX3BpZG5zID0iLCBwX3BpZG5zLCAiaV9waWRucyA9IiwgaV9waWRucykKICAgIHBfcGlkbnMgPT0gaV9waWRucwoKICAgIHBfb2NpIDo9IHBfY29udGFpbmVyLk9DSQoKICAgICMgY2hlY2sgbmFtZXNwYWNlCiAgICBwX25hbWVzcGFjZSA6PSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBpX25hbWVzcGFjZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwcmludCAoIkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb246IHBfbmFtZXNwYWNlID0iLCBwX25hbWVzcGFjZSwgImlfbmFtZXNwYWNlID0iLCBpX25hbWVzcGFjZSkKICAgIGFkZF9uYW1lc3BhY2VfdG9fc3RhdGUgOj0gYWxsb3dfbmFtZXNwYWNlKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkKICAgIG9wc19idWlsZGVyMiA6PSBjb25jYXRfb3BfaWZfbm90X251bGwob3BzX2J1aWxkZXIxLCBhZGRfbmFtZXNwYWNlX3RvX3N0YXRlKQoKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiBwIFZlcnNpb24gPSIsIHBfb2NpLlZlcnNpb24sICJpIFZlcnNpb24gPSIsIGlfb2NpLlZlcnNpb24pCiAgICBwX29jaS5WZXJzaW9uID09IGlfb2NpLlZlcnNpb24KCiAgICBwcmludCgiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdENvbW1vbjogcCBSZWFkb25seSA9IiwgcF9vY2kuUm9vdC5SZWFkb25seSwgImkgUmVhZG9ubHkgPSIsIGlfb2NpLlJvb3QuUmVhZG9ubHkpCiAgICBwX29jaS5Sb290LlJlYWRvbmx5ID09IGlfb2NpLlJvb3QuUmVhZG9ubHkKCiAgICBhbGxvd19hbm5vKHBfb2NpLCBpX29jaSkKCiAgICBwX3N0b3JhZ2VzIDo9IHBfY29udGFpbmVyLnN0b3JhZ2VzCiAgICBhbGxvd19ieV9hbm5vKHBfb2NpLCBpX29jaSwgcF9zdG9yYWdlcywgaV9zdG9yYWdlcykKCiAgICBwX2RldmljZXMgOj0gcF9jb250YWluZXIuZGV2aWNlcwogICAgYWxsb3dfZGV2aWNlcyhwX2RldmljZXMsIGlfZGV2aWNlcykKCiAgICByZXQgOj0gYWxsb3dfbGludXgob3BzX2J1aWxkZXIyLCBwX29jaSwgaV9vY2kpCiAgICByZXQuYWxsb3dlZAoKICAgIG9wcyA6PSByZXQub3BzCgogICAgcHJpbnQoIkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb246IHRydWUiKQp9CgphbGxvd19jcmVhdGVfY29udGFpbmVyX2lucHV0KHJlcSkgewogICAgcHJpbnQoImFsbG93X2NyZWF0ZV9jb250YWluZXJfaW5wdXQ6IGlucHV0ID0iLCByZXEpCgogICAgY291bnQocmVxLnNoYXJlZF9tb3VudHMpID09IDAKICAgIGlzX251bGwocmVxLnN0cmluZ191c2VyKQoKICAgIGlfb2NpIDo9IHJlcS5PQ0kKICAgIGlzX251bGwoaV9vY2kuSG9va3MpCiAgICBpc19udWxsKGlfb2NpLlNvbGFyaXMpCiAgICBpc19udWxsKGlfb2NpLldpbmRvd3MpCgogICAgaV9saW51eCA6PSBpX29jaS5MaW51eAogICAgY291bnQoaV9saW51eC5HSURNYXBwaW5ncykgPT0gMAogICAgY291bnQoaV9saW51eC5Nb3VudExhYmVsKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlJlc291cmNlcy5EZXZpY2VzKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlJvb3Rmc1Byb3BhZ2F0aW9uKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlVJRE1hcHBpbmdzKSA9PSAwCiAgICBpc19udWxsKGlfbGludXguSW50ZWxSZHQpCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLkJsb2NrSU8pCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLk5ldHdvcmspCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLlBpZHMpCiAgICBpc19udWxsKGlfbGludXguU2VjY29tcCkKCiAgICBpX3Byb2Nlc3MgOj0gaV9vY2kuUHJvY2VzcwogICAgY291bnQoaV9wcm9jZXNzLlNlbGludXhMYWJlbCkgPT0gMAogICAgY291bnQoaV9wcm9jZXNzLlVzZXIuVXNlcm5hbWUpID09IDAKCiAgICBwcmludCgiYWxsb3dfY3JlYXRlX2NvbnRhaW5lcl9pbnB1dDogdHJ1ZSIpCn0KCmFsbG93X25hbWVzcGFjZShwX25hbWVzcGFjZSwgaV9uYW1lc3BhY2UpID0gYWRkX25hbWVzcGFjZSB7CiAgICBwX25hbWVzcGFjZSA9PSBpX25hbWVzcGFjZQogICAgYWRkX25hbWVzcGFjZSA6PSBudWxsCiAgICBwcmludCgiYWxsb3dfbmFtZXNwYWNlIDE6IGlucHV0IG5hbWVzcGFjZSBtYXRjaGVzIHBvbGljeSBkYXRhIikKfQoKYWxsb3dfbmFtZXNwYWNlKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkgPSBhZGRfbmFtZXNwYWNlIHsKICAgIHBfbmFtZXNwYWNlID09ICIiCiAgICBwcmludCgiYWxsb3dfbmFtZXNwYWNlIDI6IG5vIG5hbWVzcGFjZSBmb3VuZCBvbiBwb2xpY3kgZGF0YSIpCiAgICBhZGRfbmFtZXNwYWNlIDo9IHN0YXRlX2FsbG93cygibmFtZXNwYWNlIiwgaV9uYW1lc3BhY2UpCn0KCiMgdmFsdWUgaGFzbid0IGJlZW4gc2VlbiBiZWZvcmUsIHNhdmUgaXQgdG8gc3RhdGUKc3RhdGVfYWxsb3dzKGtleSwgdmFsdWUpID0gYWN0aW9uIHsKICBzdGF0ZSA6PSBnZXRfc3RhdGUoKQogIHByaW50KCJzdGF0ZV9hbGxvd3MgMTogc3RhdGVba2V5XSA9Iiwgc3RhdGVba2V5XSwgInZhbHVlID0iLCB2YWx1ZSkKICBub3Qgc3RhdGVba2V5XQogIHByaW50KCJzdGF0ZV9hbGxvd3MgMTogc2F2aW5nIHRvIHN0YXRlIGtleSA9Iiwga2V5LCAidmFsdWUgPSIsIHZhbHVlKQogIHBhdGggOj0gZ2V0X3N0YXRlX3BhdGgoa2V5KSAKICBhY3Rpb24gOj0gewogICAgIm9wIjogImFkZCIsCiAgICAicGF0aCI6IHBhdGgsIAogICAgInZhbHVlIjogdmFsdWUsCiAgfQp9CgojIHZhbHVlIG1hdGNoZXMgd2hhdCdzIGluIHN0YXRlLCBhbGxvdyBpdApzdGF0ZV9hbGxvd3Moa2V5LCB2YWx1ZSkgPSBhY3Rpb24gewogIHByaW50KCJzdGF0ZV9hbGxvd3MgMjogc3RhcnQiKQogIHN0YXRlIDo9IGdldF9zdGF0ZSgpCiAgcHJpbnQoInN0YXRlX2FsbG93cyAyOiBzdGF0ZVtrZXldID0iLCBzdGF0ZVtrZXldLCAidmFsdWUgPSIsIHZhbHVlKQogIHZhbHVlID09IHN0YXRlW2tleV0KICBwcmludCgic3RhdGVfYWxsb3dzIDI6IGZvdW5kIGtleSA9Iiwga2V5LCAidmFsdWUgPSIsIHZhbHVlLCAiIGluIHN0YXRlIikKICBhY3Rpb24gOj0gbnVsbAp9CgojIGhlbHBlciBmdW5jdGlvbnMgdG8gaW50ZXJhY3Qgd2l0aCB0aGUgc3RhdGUKZ2V0X3N0YXRlKCkgPSBzdGF0ZSB7CiAgc3RhdGUgOj0gZGF0YVsicHN0YXRlIl0KfQoKZ2V0X3N0YXRlX3ZhbChrZXkpID0gdmFsdWUgewogICAgc3RhdGUgOj0gZ2V0X3N0YXRlKCkKICAgIHZhbHVlIDo9IHN0YXRlW2tleV0KfQoKZ2V0X3N0YXRlX3BhdGgoa2V5KSA9IHBhdGggewogICAgIyBwcmVwZW5kICIvcHN0YXRlLyIgdG8ga2V5CiAgICBwYXRoIDo9IGNvbmNhdCgiLyIsIFsiL3BzdGF0ZSIsIGtleV0pCn0KCiMgSGVscGVyIGZ1bmN0aW9ucyB0byBjb25kaXRpb25hbGx5IGNvbmNhdGVuYXRlIG9wIGlzIG5vdCBudWxsCmNvbmNhdF9vcF9pZl9ub3RfbnVsbChvcHMsIG9wKSA9IHJlc3VsdCB7CiAgICBvcCA9PSBudWxsCiAgICByZXN1bHQgOj0gb3BzCn0KCmNvbmNhdF9vcF9pZl9ub3RfbnVsbChvcHMsIG9wKSA9IHJlc3VsdCB7CiAgICBvcCAhPSBudWxsCiAgICByZXN1bHQgOj0gYXJyYXkuY29uY2F0KG9wcywgW29wXSkKfQoKIyBSZWplY3QgdW5leHBlY3RlZCBhbm5vdGF0aW9ucy4KYWxsb3dfYW5ubyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19hbm5vIDE6IHN0YXJ0IikKCiAgICBub3QgaV9vY2kuQW5ub3RhdGlvbnMKCiAgICBwcmludCgiYWxsb3dfYW5ubyAxOiB0cnVlIikKfQphbGxvd19hbm5vKHBfb2NpLCBpX29jaSkgewogICAgcHJpbnQoImFsbG93X2Fubm8gMjogcCBBbm5vdGF0aW9ucyA9IiwgcF9vY2kuQW5ub3RhdGlvbnMpCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiBpIEFubm90YXRpb25zID0iLCBpX29jaS5Bbm5vdGF0aW9ucykKCiAgICBpX2tleXMgOj0gb2JqZWN0LmtleXMoaV9vY2kuQW5ub3RhdGlvbnMpCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiBpIGtleXMgPSIsIGlfa2V5cykKCiAgICBldmVyeSBpX2tleSBpbiBpX2tleXMgewogICAgICAgIGFsbG93X2Fubm9fa2V5KGlfa2V5LCBwX29jaSkKICAgIH0KCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiB0cnVlIikKfQoKYWxsb3dfYW5ub19rZXkoaV9rZXksIHBfb2NpKSB7CiAgICBwcmludCgiYWxsb3dfYW5ub19rZXkgMTogaSBrZXkgPSIsIGlfa2V5KQoKICAgIHN0YXJ0c3dpdGgoaV9rZXksICJpby5rdWJlcm5ldGVzLmNyaS4iKQoKICAgIHByaW50KCJhbGxvd19hbm5vX2tleSAxOiB0cnVlIikKfQphbGxvd19hbm5vX2tleShpX2tleSwgcF9vY2kpIHsKICAgIHByaW50KCJhbGxvd19hbm5vX2tleSAyOiBpIGtleSA9IiwgaV9rZXkpCgogICAgc29tZSBwX2tleSwgXyBpbiBwX29jaS5Bbm5vdGF0aW9ucwogICAgcF9rZXkgPT0gaV9rZXkKCiAgICBwcmludCgiYWxsb3dfYW5ub19rZXkgMjogdHJ1ZSIpCn0KCiMgR2V0IHRoZSB2YWx1ZSBvZiB0aGUgU19OQU1FX0tFWSBhbm5vdGF0aW9uIGFuZAojIGNvcnJlbGF0ZSBpdCB3aXRoIG90aGVyIGFubm90YXRpb25zIGFuZCBwcm9jZXNzIGZpZWxkcy4KYWxsb3dfYnlfYW5ubyhwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpIHsKICAgIHByaW50KCJhbGxvd19ieV9hbm5vIDE6IHN0YXJ0IikKCiAgICBub3QgcF9vY2kuQW5ub3RhdGlvbnNbU19OQU1FX0tFWV0KCiAgICBpX3NfbmFtZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMTogaV9zX25hbWUgPSIsIGlfc19uYW1lKQoKICAgIGlfc19uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FU1BBQ0VfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMTogaV9zX25hbWVzcGFjZSA9IiwgaV9zX25hbWVzcGFjZSkKCiAgICBhbGxvd19ieV9zYW5kYm94X25hbWUocF9vY2ksIGlfb2NpLCBwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBpX3NfbmFtZSwgaV9zX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfYnlfYW5ubyAxOiB0cnVlIikKfQphbGxvd19ieV9hbm5vKHBfb2NpLCBpX29jaSwgcF9zdG9yYWdlcywgaV9zdG9yYWdlcykgewogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMjogc3RhcnQiKQoKICAgIHBfc19uYW1lIDo9IHBfb2NpLkFubm90YXRpb25zW1NfTkFNRV9LRVldCiAgICBpX3NfbmFtZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMjogaV9zX25hbWUgPSIsIGlfc19uYW1lLCAicF9zX25hbWUgPSIsIHBfc19uYW1lKQoKICAgIGFsbG93X3NhbmRib3hfbmFtZShwX3NfbmFtZSwgaV9zX25hbWUpCgogICAgaV9zX25hbWVzcGFjZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwcmludCgiYWxsb3dfYnlfYW5ubyAyOiBpX3NfbmFtZXNwYWNlID0iLCBpX3NfbmFtZXNwYWNlKQoKICAgIGFsbG93X2J5X3NhbmRib3hfbmFtZShwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMsIGlfc19uYW1lLCBpX3NfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd19ieV9hbm5vIDI6IHRydWUiKQp9CgphbGxvd19ieV9zYW5kYm94X25hbWUocF9vY2ksIGlfb2NpLCBwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfYnlfc2FuZGJveF9uYW1lOiBzdGFydCIpCgogICAgaV9uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FU1BBQ0VfS0VZXQoKICAgIGFsbG93X2J5X2NvbnRhaW5lcl90eXBlcyhwX29jaSwgaV9vY2ksIHNfbmFtZSwgaV9uYW1lc3BhY2UpCiAgICBhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZChwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpCiAgICBhbGxvd19wcm9jZXNzKHBfb2NpLlByb2Nlc3MsIGlfb2NpLlByb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpCgogICAgcHJpbnQoImFsbG93X2J5X3NhbmRib3hfbmFtZTogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfbmFtZShwX3NfbmFtZSwgaV9zX25hbWUpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X25hbWU6IHN0YXJ0IikKICAgIHJlZ2V4Lm1hdGNoKHBfc19uYW1lLCBpX3NfbmFtZSkKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9uYW1lOiB0cnVlIikKfQoKIyBDaGVjayB0aGF0IHRoZSAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLXR5cGUiIGFuZAojICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIiBhbm5vdGF0aW9ucyBkZXNpZ25hdGUgdGhlCiMgZXhwZWN0ZWQgdHlwZSAtIGVpdGhlciBhICJzYW5kYm94IiBvciBhICJjb250YWluZXIiLiBUaGVuLCB2YWxpZGF0ZQojIG90aGVyIGFubm90YXRpb25zIGJhc2VkIG9uIHRoZSBhY3R1YWwgInNhbmRib3giIG9yICJjb250YWluZXIiIHZhbHVlCiMgZnJvbSB0aGUgaW5wdXQgY29udGFpbmVyLgphbGxvd19ieV9jb250YWluZXJfdHlwZXMocF9vY2ksIGlfb2NpLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfYnlfY29udGFpbmVyX3R5cGVzOiBjaGVja2luZyBpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSIpCgogICAgY190eXBlIDo9ICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSIKICAgIAogICAgcF9jcmlfdHlwZSA6PSBwX29jaS5Bbm5vdGF0aW9uc1tjX3R5cGVdCiAgICBpX2NyaV90eXBlIDo9IGlfb2NpLkFubm90YXRpb25zW2NfdHlwZV0KICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZXM6IHBfY3JpX3R5cGUgPSIsIHBfY3JpX3R5cGUsICJpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgcF9jcmlfdHlwZSA9PSBpX2NyaV90eXBlCgogICAgYWxsb3dfYnlfY29udGFpbmVyX3R5cGUoaV9jcmlfdHlwZSwgcF9vY2ksIGlfb2NpLCBzX25hbWUsIHNfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZXM6IHRydWUiKQp9CgphbGxvd19ieV9jb250YWluZXJfdHlwZShpX2NyaV90eXBlLCBwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAxOiBpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgaV9jcmlfdHlwZSA9PSAic2FuZGJveCIKCiAgICBpX2thdGFfdHlwZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1siaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5jb250YWluZXJfdHlwZSJdCiAgICBwcmludCgiYWxsb3dfYnlfY29udGFpbmVyX3R5cGUgMTogaV9rYXRhX3R5cGUgPSIsIGlfa2F0YV90eXBlKQogICAgaV9rYXRhX3R5cGUgPT0gInBvZF9zYW5kYm94IgoKICAgIGFsbG93X3NhbmRib3hfY29udGFpbmVyX25hbWUocF9vY2ksIGlfb2NpKQogICAgYWxsb3dfc2FuZGJveF9uZXRfbmFtZXNwYWNlKHBfb2NpLCBpX29jaSkKICAgIGFsbG93X3NhbmRib3hfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpCgogICAgcHJpbnQoImFsbG93X2J5X2NvbnRhaW5lcl90eXBlIDE6IHRydWUiKQp9CgphbGxvd19ieV9jb250YWluZXJfdHlwZShpX2NyaV90eXBlLCBwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiBpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgaV9jcmlfdHlwZSA9PSAiY29udGFpbmVyIgoKICAgIGlfa2F0YV90eXBlIDo9IGlfb2NpLkFubm90YXRpb25zWyJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIl0KICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiBpX2thdGFfdHlwZSA9IiwgaV9rYXRhX3R5cGUpCiAgICBpX2thdGFfdHlwZSA9PSAicG9kX2NvbnRhaW5lciIKCiAgICBhbGxvd19jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpCiAgICBhbGxvd19uZXRfbmFtZXNwYWNlKHBfb2NpLCBpX29jaSkKICAgIGFsbG93X2xvZ19kaXJlY3RvcnkocF9vY2ksIGlfb2NpKQoKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiB0cnVlIikKfQoKIyAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLW5hbWUiIGFubm90YXRpb24KYWxsb3dfc2FuZGJveF9jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X2NvbnRhaW5lcl9uYW1lOiBzdGFydCIpCgogICAgY29udGFpbmVyX2Fubm90YXRpb25fbWlzc2luZyhwX29jaSwgaV9vY2ksICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItbmFtZSIpCgogICAgcHJpbnQoImFsbG93X3NhbmRib3hfY29udGFpbmVyX25hbWU6IHRydWUiKQp9CgphbGxvd19jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19jb250YWluZXJfbmFtZTogc3RhcnQiKQoKICAgIGFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uKHBfb2NpLCBpX29jaSwgImlvLmt1YmVybmV0ZXMuY3JpLmNvbnRhaW5lci1uYW1lIikKCiAgICBwcmludCgiYWxsb3dfY29udGFpbmVyX25hbWU6IHRydWUiKQp9Cgpjb250YWluZXJfYW5ub3RhdGlvbl9taXNzaW5nKHBfb2NpLCBpX29jaSwga2V5KSB7CiAgICBwcmludCgiY29udGFpbmVyX2Fubm90YXRpb25fbWlzc2luZzoiLCBrZXkpCgogICAgbm90IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIG5vdCBpX29jaS5Bbm5vdGF0aW9uc1trZXldCgogICAgcHJpbnQoImNvbnRhaW5lcl9hbm5vdGF0aW9uX21pc3Npbmc6IHRydWUiKQp9CgphbGxvd19jb250YWluZXJfYW5ub3RhdGlvbihwX29jaSwgaV9vY2ksIGtleSkgewogICAgcHJpbnQoImFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uOiBrZXkgPSIsIGtleSkKCiAgICBwX3ZhbHVlIDo9IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIGlfdmFsdWUgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgcHJpbnQoImFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uOiBwX3ZhbHVlID0iLCBwX3ZhbHVlLCAiaV92YWx1ZSA9IiwgaV92YWx1ZSkKCiAgICBwX3ZhbHVlID09IGlfdmFsdWUKCiAgICBwcmludCgiYWxsb3dfY29udGFpbmVyX2Fubm90YXRpb246IHRydWUiKQp9CgojICJuZXJkY3RsL25ldHdvcmstbmFtZXNwYWNlIiBhbm5vdGF0aW9uCmFsbG93X3NhbmRib3hfbmV0X25hbWVzcGFjZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X25ldF9uYW1lc3BhY2U6IHN0YXJ0IikKCiAgICBrZXkgOj0gIm5lcmRjdGwvbmV0d29yay1uYW1lc3BhY2UiCgogICAgcF9uYW1lc3BhY2UgOj0gcF9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgaV9uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgcHJpbnQoImFsbG93X3NhbmRib3hfbmV0X25hbWVzcGFjZTogcF9uYW1lc3BhY2UgPSIsIHBfbmFtZXNwYWNlLCAiaV9uYW1lc3BhY2UgPSIsIGlfbmFtZXNwYWNlKQoKICAgIHJlZ2V4Lm1hdGNoKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9uZXRfbmFtZXNwYWNlOiB0cnVlIikKfQoKYWxsb3dfbmV0X25hbWVzcGFjZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19uZXRfbmFtZXNwYWNlOiBzdGFydCIpCgogICAga2V5IDo9ICJuZXJkY3RsL25ldHdvcmstbmFtZXNwYWNlIgoKICAgIG5vdCBwX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICBub3QgaV9vY2kuQW5ub3RhdGlvbnNba2V5XQoKICAgIHByaW50KCJhbGxvd19uZXRfbmFtZXNwYWNlOiB0cnVlIikKfQoKIyAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1sb2ctZGlyZWN0b3J5IiBhbm5vdGF0aW9uCmFsbG93X3NhbmRib3hfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X2xvZ19kaXJlY3Rvcnk6IHN0YXJ0IikKCiAgICBrZXkgOj0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbG9nLWRpcmVjdG9yeSIKCiAgICBwX2RpciA6PSBwX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICByZWdleDEgOj0gcmVwbGFjZShwX2RpciwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHJlZ2V4MiA6PSByZXBsYWNlKHJlZ2V4MSwgIiQoc2FuZGJveC1uYW1lc3BhY2UpIiwgc19uYW1lc3BhY2UpCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiByZWdleDIgPSIsIHJlZ2V4MikKCiAgICBpX2RpciA6PSBpX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiBpX2RpciA9IiwgaV9kaXIpCgogICAgcmVnZXgubWF0Y2gocmVnZXgyLCBpX2RpcikKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiB0cnVlIikKfQoKYWxsb3dfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19sb2dfZGlyZWN0b3J5OiBzdGFydCIpCgogICAga2V5IDo9ICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWxvZy1kaXJlY3RvcnkiCgogICAgbm90IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIG5vdCBpX29jaS5Bbm5vdGF0aW9uc1trZXldCgogICAgcHJpbnQoImFsbG93X2xvZ19kaXJlY3Rvcnk6IHRydWUiKQp9CgphbGxvd19kZXZpY2VzKHBfZGV2aWNlcywgaV9kZXZpY2VzKSB7CiAgICBwcmludCgiYWxsb3dfZGV2aWNlczogc3RhcnQiKQogICAgZXZlcnkgaV9kZXZpY2UgaW4gaV9kZXZpY2VzIHsKICAgICAgICBwcmludCgiYWxsb3dfZGV2aWNlczogaV9kZXZpY2UgPSIsIGlfZGV2aWNlKQogICAgICAgIHNvbWUgcF9kZXZpY2UgaW4gcF9kZXZpY2VzCiAgICAgICAgcF9kZXZpY2UuY29udGFpbmVyX3BhdGggPT0gaV9kZXZpY2UuY29udGFpbmVyX3BhdGgKICAgIH0KICAgIHByaW50KCJhbGxvd19kZXZpY2VzOiB0cnVlIikKfQoKYWxsb3dfbGludXgoc3RhdGVfb3BzLCBwX29jaSwgaV9vY2kpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIHBfbmFtZXNwYWNlcyA6PSBwX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbGludXg6IHAgbmFtZXNwYWNlcyA9IiwgcF9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlcyA6PSBpX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbGludXg6IGkgbmFtZXNwYWNlcyA9IiwgaV9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlX3dpdGhvdXRfbmV0d29yayA6PSBbb2JqIHwgb2JqIDo9IGlfbmFtZXNwYWNlc1tfXTsgb2JqLlR5cGUgIT0gIm5ldHdvcmsiXQoKICAgIHByaW50KCJhbGxvd19saW51eDogaV9uYW1lc3BhY2Vfd2l0aG91dF9uZXR3b3JrID0iLCBpX25hbWVzcGFjZV93aXRob3V0X25ldHdvcmspCgogICAgcF9uYW1lc3BhY2VzID09IGlfbmFtZXNwYWNlX3dpdGhvdXRfbmV0d29yawoKICAgIGFsbG93X21hc2tlZF9wYXRocyhwX29jaSwgaV9vY2kpCiAgICBhbGxvd19yZWFkb25seV9wYXRocyhwX29jaSwgaV9vY2kpCiAgICBhbGxvd19saW51eF9kZXZpY2VzKHBfb2NpLkxpbnV4LkRldmljZXMsIGlfb2NpLkxpbnV4LkRldmljZXMpCiAgICBhbGxvd19saW51eF9zeXNjdGwocF9vY2kuTGludXgsIGlfb2NpLkxpbnV4KQogICAgcmV0IDo9IGFsbG93X25ldHdvcmtfbmFtZXNwYWNlX3N0YXJ0KHN0YXRlX29wcywgcF9vY2ksIGlfb2NpKQogICAgcmV0LmFsbG93ZWQKCiAgICBvcHMgOj0gcmV0Lm9wcwoKICAgIHByaW50KCJhbGxvd19saW51eDogdHJ1ZSIpCn0KCiMgUmV0cmlldmUgdGhlICJuZXR3b3JrIiBuYW1lc3BhY2UgZnJvbSB0aGUgaW5wdXQgZGF0YSBhbmQgcGFzcyBpdCBvbiBmb3IgdGhlCiMgbmV0d29yayBuYW1lc3BhY2UgcG9saWN5IGNoZWNrcy4KYWxsb3dfbmV0d29ya19uYW1lc3BhY2Vfc3RhcnQoc3RhdGVfb3BzLCBwX29jaSwgaV9vY2kpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIHByaW50KCJhbGxvd19uZXR3b3JrX25hbWVzcGFjZSBzdGFydDogc3RhcnQiKQoKICAgIHBfbmFtZXNwYWNlcyA6PSBwX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IHAgbmFtZXNwYWNlcyA9IiwgcF9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlcyA6PSBpX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IGkgbmFtZXNwYWNlcyA9IiwgaV9uYW1lc3BhY2VzKQoKICAgICMgUmV0dXJuIHBhdGggb2YgdGhlICJuZXR3b3JrIiBuYW1lc3BhY2UKICAgIG5ldHdvcmtfbnMgOj0gW29iaiB8IG9iaiA6PSBpX25hbWVzcGFjZXNbX107IG9iai5UeXBlID09ICJuZXR3b3JrIl0KCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IG5ldHdvcmtfbnMgPSIsIG5ldHdvcmtfbnMpCgogICAgcmV0IDo9IGFsbG93X25ldHdvcmtfbmFtZXNwYWNlKHN0YXRlX29wcywgbmV0d29ya19ucykKICAgIHJldC5hbGxvd2VkCgogICAgb3BzIDo9IHJldC5vcHMKfQoKIyBUaGlzIHJ1bGUgaXMgd2hlbiB0aGVyZSdzIG5vIG5ldHdvcmsgbmFtZXNwYWNlIGluIHRoZSBpbnB1dCBkYXRhLgphbGxvd19uZXR3b3JrX25hbWVzcGFjZShzdGF0ZV9vcHMsIG5ldHdvcmtfbnMpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIGNvdW50KG5ldHdvcmtfbnMpID09IDAKCiAgICBuZXR3b3JrX25zX3BhdGggPSAiIgoKICAgIGFkZF9uZXR3b3JrX25hbWVzcGFjZV90b19zdGF0ZSA6PSBzdGF0ZV9hbGxvd3MoIm5ldHdvcmtfbmFtZXNwYWNlIiwgbmV0d29ya19uc19wYXRoKQogICAgb3BzIDo9IGNvbmNhdF9vcF9pZl9ub3RfbnVsbChzdGF0ZV9vcHMsIGFkZF9uZXR3b3JrX25hbWVzcGFjZV90b19zdGF0ZSkKCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2UgMTogdHJ1ZSIpCn0KCiMgVGhpcyBydWxlIGlzIHdoZW4gdGhlcmUncyBleGFjdGx5IG9uZSBuZXR3b3JrIG5hbWVzcGFjZSBpbiB0aGUgaW5wdXQgZGF0YS4KYWxsb3dfbmV0d29ya19uYW1lc3BhY2Uoc3RhdGVfb3BzLCBuZXR3b3JrX25zKSA6PSB7Im9wcyI6IG9wcywgImFsbG93ZWQiOiB0cnVlfSB7CiAgICBjb3VudChuZXR3b3JrX25zKSA9PSAxCgogICAgYWRkX25ldHdvcmtfbmFtZXNwYWNlX3RvX3N0YXRlIDo9IHN0YXRlX2FsbG93cygibmV0d29ya19uYW1lc3BhY2UiLCBuZXR3b3JrX25zWzBdLlBhdGgpCiAgICBvcHMgOj0gY29uY2F0X29wX2lmX25vdF9udWxsKHN0YXRlX29wcywgYWRkX25ldHdvcmtfbmFtZXNwYWNlX3RvX3N0YXRlKQoKICAgIHByaW50KCJhbGxvd19uZXR3b3JrX25hbWVzcGFjZSAyOiB0cnVlIikKfQoKYWxsb3dfbWFza2VkX3BhdGhzKHBfb2NpLCBpX29jaSkgewogICAgcF9wYXRocyA6PSBwX29jaS5MaW51eC5NYXNrZWRQYXRocwogICAgcHJpbnQoImFsbG93X21hc2tlZF9wYXRocyAxOiBwX3BhdGhzID0iLCBwX3BhdGhzKQoKICAgIGlfcGF0aHMgOj0gaV9vY2kuTGludXguTWFza2VkUGF0aHMKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aHMgMTogaV9wYXRocyA9IiwgaV9wYXRocykKCiAgICBhbGxvd19tYXNrZWRfcGF0aHNfYXJyYXkocF9wYXRocywgaV9wYXRocykKCiAgICBwcmludCgiYWxsb3dfbWFza2VkX3BhdGhzIDE6IHRydWUiKQp9CmFsbG93X21hc2tlZF9wYXRocyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aHMgMjogc3RhcnQiKQoKICAgIG5vdCBwX29jaS5MaW51eC5NYXNrZWRQYXRocwogICAgbm90IGlfb2NpLkxpbnV4Lk1hc2tlZFBhdGhzCgogICAgcHJpbnQoImFsbG93X21hc2tlZF9wYXRocyAyOiB0cnVlIikKfQoKIyBBbGwgdGhlIHBvbGljeSBtYXNrZWQgcGF0aHMgbXVzdCBiZSBtYXNrZWQgaW4gdGhlIGlucHV0IGRhdGEgdG9vLgojIElucHV0IGlzIGFsbG93ZWQgdG8gaGF2ZSBtb3JlIG1hc2tlZCBwYXRocyB0aGFuIHRoZSBwb2xpY3kuCmFsbG93X21hc2tlZF9wYXRoc19hcnJheShwX2FycmF5LCBpX2FycmF5KSB7CiAgICBldmVyeSBwX2VsZW0gaW4gcF9hcnJheSB7CiAgICAgICAgYWxsb3dfbWFza2VkX3BhdGgocF9lbGVtLCBpX2FycmF5KQogICAgfQp9CgphbGxvd19tYXNrZWRfcGF0aChwX2VsZW0sIGlfYXJyYXkpIHsKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aDogcF9lbGVtID0iLCBwX2VsZW0pCgogICAgc29tZSBpX2VsZW0gaW4gaV9hcnJheQogICAgcF9lbGVtID09IGlfZWxlbQoKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aDogdHJ1ZSIpCn0KCmFsbG93X3JlYWRvbmx5X3BhdGhzKHBfb2NpLCBpX29jaSkgewogICAgcF9wYXRocyA6PSBwX29jaS5MaW51eC5SZWFkb25seVBhdGhzCiAgICBwcmludCgiYWxsb3dfcmVhZG9ubHlfcGF0aHMgMTogcF9wYXRocyA9IiwgcF9wYXRocykKCiAgICBpX3BhdGhzIDo9IGlfb2NpLkxpbnV4LlJlYWRvbmx5UGF0aHMKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAxOiBpX3BhdGhzID0iLCBpX3BhdGhzKQoKICAgIGFsbG93X3JlYWRvbmx5X3BhdGhzX2FycmF5KHBfcGF0aHMsIGlfcGF0aHMsIGlfb2NpLkxpbnV4Lk1hc2tlZFBhdGhzKQoKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAxOiB0cnVlIikKfQphbGxvd19yZWFkb25seV9wYXRocyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAyOiBzdGFydCIpCgogICAgbm90IHBfb2NpLkxpbnV4LlJlYWRvbmx5UGF0aHMKICAgIG5vdCBpX29jaS5MaW51eC5SZWFkb25seVBhdGhzCgogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGhzIDI6IHRydWUiKQp9CgojIEFsbCB0aGUgcG9saWN5IHJlYWRvbmx5IHBhdGhzIG11c3QgYmUgZWl0aGVyOgojIC0gUHJlc2VudCBpbiB0aGUgaW5wdXQgcmVhZG9ubHkgcGF0aHMsIG9yCiMgLSBQcmVzZW50IGluIHRoZSBpbnB1dCBtYXNrZWQgcGF0aHMuCiMgSW5wdXQgaXMgYWxsb3dlZCB0byBoYXZlIG1vcmUgcmVhZG9ubHkgcGF0aHMgdGhhbiB0aGUgcG9saWN5LgphbGxvd19yZWFkb25seV9wYXRoc19hcnJheShwX2FycmF5LCBpX2FycmF5LCBtYXNrZWRfcGF0aHMpIHsKICAgIGV2ZXJ5IHBfZWxlbSBpbiBwX2FycmF5IHsKICAgICAgICBhbGxvd19yZWFkb25seV9wYXRoKHBfZWxlbSwgaV9hcnJheSwgbWFza2VkX3BhdGhzKQogICAgfQp9CgphbGxvd19yZWFkb25seV9wYXRoKHBfZWxlbSwgaV9hcnJheSwgbWFza2VkX3BhdGhzKSB7CiAgICBwcmludCgiYWxsb3dfcmVhZG9ubHlfcGF0aCAxOiBwX2VsZW0gPSIsIHBfZWxlbSkKCiAgICBzb21lIGlfZWxlbSBpbiBpX2FycmF5CiAgICBwX2VsZW0gPT0gaV9lbGVtCgogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGggMTogdHJ1ZSIpCn0KYWxsb3dfcmVhZG9ubHlfcGF0aChwX2VsZW0sIGlfYXJyYXksIG1hc2tlZF9wYXRocykgewogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGggMjogcF9lbGVtID0iLCBwX2VsZW0pCgogICAgc29tZSBpX21hc2tlZCBpbiBtYXNrZWRfcGF0aHMKICAgIHBfZWxlbSA9PSBpX21hc2tlZAoKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRoIDI6IHRydWUiKQp9CgphbGxvd19saW51eF9kZXZpY2VzKHBfZGV2aWNlcywgaV9kZXZpY2VzKSB7CiAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogc3RhcnQiKQogICAgZXZlcnkgaV9kZXZpY2UgaW4gaV9kZXZpY2VzIHsKICAgICAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogaV9kZXZpY2UgPSIsIGlfZGV2aWNlKQogICAgICAgIHNvbWUgcF9kZXZpY2UgaW4gcF9kZXZpY2VzCiAgICAgICAgaV9kZXZpY2UuUGF0aCA9PSBwX2RldmljZS5QYXRoCiAgICB9CiAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogdHJ1ZSIpCn0KCmFsbG93X2xpbnV4X3N5c2N0bChwX2xpbnV4LCBpX2xpbnV4KSB7CiAgICBwcmludCgiYWxsb3dfbGludXhfc3lzY3RsIDE6IHN0YXJ0IikKICAgIG5vdCBpX2xpbnV4LlN5c2N0bAogICAgcHJpbnQoImFsbG93X2xpbnV4X3N5c2N0bCAxOiB0cnVlIikKfQoKYWxsb3dfbGludXhfc3lzY3RsKHBfbGludXgsIGlfbGludXgpIHsKICAgIHByaW50KCJhbGxvd19saW51eF9zeXNjdGwgMjogc3RhcnQiKQogICAgcF9zeXNjdGwgOj0gcF9saW51eC5TeXNjdGwKICAgIGlfc3lzY3RsIDo9IGlfbGludXguU3lzY3RsCiAgICBldmVyeSBpX25hbWUsIGlfdmFsIGluIGlfc3lzY3RsIHsKICAgICAgICBwcmludCgiYWxsb3dfbGludXhfc3lzY3RsIDI6IGlfbmFtZSA9IiwgaV9uYW1lLCAiaV92YWwgPSIsIGlfdmFsKQogICAgICAgIHBfc3lzY3RsW2lfbmFtZV0gPT0gaV92YWwKICAgIH0KICAgIHByaW50KCJhbGxvd19saW51eF9zeXNjdGwgMjogdHJ1ZSIpCn0KCiMgQ2hlY2sgdGhlIGNvbnNpc3RlbmN5IG9mIHRoZSBpbnB1dCAiaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5idW5kbGVfcGF0aCIKIyBhbmQgaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCIgdmFsdWVzIHdpdGggb3RoZXIgZmllbGRzLgphbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZChwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpIHsKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogc3RhcnQiKQoKICAgIGJ1bmRsZV9wYXRoIDo9IGlfb2NpLkFubm90YXRpb25zWyJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmJ1bmRsZV9wYXRoIl0KICAgIGJ1bmRsZV9pZCA6PSByZXBsYWNlKGJ1bmRsZV9wYXRoLCAiL3J1bi9jb250YWluZXJkL2lvLmNvbnRhaW5lcmQucnVudGltZS52Mi50YXNrL2s4cy5pby8iLCAiIikKCiAgICBidW5kbGVfaWRfZm9ybWF0IDo9IGNvbmNhdCgiIiwgWyJeIiwgQlVORExFX0lELCAiJCJdKQogICAgcmVnZXgubWF0Y2goYnVuZGxlX2lkX2Zvcm1hdCwgYnVuZGxlX2lkKQoKICAgIGtleSA6PSAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCIKCiAgICBwX3JlZ2V4IDo9IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIHNhbmRib3hfaWQgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQoKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogc2FuZGJveF9pZCA9Iiwgc2FuZGJveF9pZCwgInJlZ2V4ID0iLCBwX3JlZ2V4KQogICAgcmVnZXgubWF0Y2gocF9yZWdleCwgc2FuZGJveF9pZCkKCiAgICBhbGxvd19yb290X3BhdGgocF9vY2ksIGlfb2NpLCBidW5kbGVfaWQpCgogICAgZXZlcnkgaV9tb3VudCBpbiBpX29jaS5Nb3VudHMgewogICAgICAgIGFsbG93X21vdW50KHBfb2NpLCBpX21vdW50LCBpX3N0b3JhZ2VzLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpCiAgICB9CgogICAgYWxsb3dfc3RvcmFnZXMocF9zdG9yYWdlcywgaV9zdG9yYWdlcywgYnVuZGxlX2lkLCBzYW5kYm94X2lkKQoKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogdHJ1ZSIpCn0KCmFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHBfcHJvY2VzcyA9IiwgcF9wcm9jZXNzKQogICAgcHJpbnQoImFsbG93X3Byb2Nlc3NfY29tbW9uOiBpX3Byb2Nlc3MgPSAiLCBpX3Byb2Nlc3MpCiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHNfbmFtZSA9Iiwgc19uYW1lKQoKICAgIHBfcHJvY2Vzcy5Dd2QgPT0gaV9wcm9jZXNzLkN3ZAogICAgcF9wcm9jZXNzLk5vTmV3UHJpdmlsZWdlcyA9PSBpX3Byb2Nlc3MuTm9OZXdQcml2aWxlZ2VzCgogICAgYWxsb3dfdXNlcihwX3Byb2Nlc3MsIGlfcHJvY2VzcykKICAgIGFsbG93X2VudihwX3Byb2Nlc3MsIGlfcHJvY2Vzcywgc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHRydWUiKQp9CgojIENvbXBhcmUgdGhlIE9DSSBQcm9jZXNzIGZpZWxkIG9mIGEgcG9saWN5IGNvbnRhaW5lciB3aXRoIHRoZSBpbnB1dCBPQ0kgUHJvY2VzcyBmcm9tIGEgQ3JlYXRlQ29udGFpbmVyUmVxdWVzdAphbGxvd19wcm9jZXNzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfcHJvY2Vzczogc3RhcnQiKQoKICAgIGFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgYWxsb3dfY2FwcyhwX3Byb2Nlc3MuQ2FwYWJpbGl0aWVzLCBpX3Byb2Nlc3MuQ2FwYWJpbGl0aWVzKQogICAgcF9wcm9jZXNzLlRlcm1pbmFsID09IGlfcHJvY2Vzcy5UZXJtaW5hbAoKICAgIHByaW50KCJhbGxvd19wcm9jZXNzOiB0cnVlIikKfQoKIyBDb21wYXJlIHRoZSBPQ0kgUHJvY2VzcyBmaWVsZCBvZiBhIHBvbGljeSBjb250YWluZXIgd2l0aCB0aGUgaW5wdXQgcHJvY2VzcyBmaWVsZCBmcm9tIEV4ZWNQcm9jZXNzUmVxdWVzdAphbGxvd19pbnRlcmFjdGl2ZV9wcm9jZXNzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfaW50ZXJhY3RpdmVfcHJvY2Vzczogc3RhcnQiKQoKICAgIGFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgYWxsb3dfZXhlY19jYXBzKGlfcHJvY2Vzcy5DYXBhYmlsaXRpZXMpCgogICAgIyBUaGVzZSBhcmUgY29tbWFuZHMgZW5hYmxlZCB1c2luZyBFeGVjUHJvY2Vzc1JlcXVlc3QgY29tbWFuZHMgYW5kL29yIHJlZ2V4IGZyb20gdGhlIHNldHRpbmdzIGZpbGUuCiAgICAjIFRoZXkgY2FuIGJlIGV4ZWN1dGVkIGludGVyYWN0aXZlbHkgc28gYWxsb3cgdGhlbSB0byB1c2UgYW55IHZhbHVlIGZvciBpX3Byb2Nlc3MuVGVybWluYWwuCgogICAgcHJpbnQoImFsbG93X2ludGVyYWN0aXZlX3Byb2Nlc3M6IHRydWUiKQp9CgojIENvbXBhcmUgdGhlIE9DSSBQcm9jZXNzIGZpZWxkIG9mIGEgcG9saWN5IGNvbnRhaW5lciB3aXRoIHRoZSBpbnB1dCBwcm9jZXNzIGZpZWxkIGZyb20gRXhlY1Byb2Nlc3NSZXF1ZXN0CmFsbG93X3Byb2JlX3Byb2Nlc3MocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19wcm9iZV9wcm9jZXNzOiBzdGFydCIpCgogICAgYWxsb3dfcHJvY2Vzc19jb21tb24ocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpCiAgICBhbGxvd19leGVjX2NhcHMoaV9wcm9jZXNzLkNhcGFiaWxpdGllcykKICAgIHBfcHJvY2Vzcy5UZXJtaW5hbCA9PSBpX3Byb2Nlc3MuVGVybWluYWwKCiAgICBwcmludCgiYWxsb3dfcHJvYmVfcHJvY2VzczogdHJ1ZSIpCn0KCmFsbG93X3VzZXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MpIHsKICAgIHBfdXNlciA6PSBwX3Byb2Nlc3MuVXNlcgogICAgaV91c2VyIDo9IGlfcHJvY2Vzcy5Vc2VyCgogICAgcHJpbnQoImFsbG93X3VzZXI6IGlucHV0IHVpZCA9IiwgaV91c2VyLlVJRCwgInBvbGljeSB1aWQgPSIsIHBfdXNlci5VSUQpCiAgICBwX3VzZXIuVUlEID09IGlfdXNlci5VSUQKCiAgICAjIFRPRE86IHRyYWNrIGRvd24gdGhlIHJlYXNvbiBmb3IgcmVnaXN0cnkuazhzLmlvL3BhdXNlOjMuOSBiZWluZwogICAgIyAgICAgICBleGVjdXRlZCB3aXRoIGdpZCA9IDAgZGVzcGl0ZSBoYXZpbmcgIjY1NTM1OjY1NTM1IiBpbiBpdHMgY29udGFpbmVyIGltYWdlCiAgICAjICAgICAgIGNvbmZpZy4KICAgICNwcmludCgiYWxsb3dfdXNlcjogaW5wdXQgZ2lkID0iLCBpX3VzZXIuR0lELCAicG9saWN5IGdpZCA9IiwgcF91c2VyLkdJRCkKICAgICNwX3VzZXIuR0lEID09IGlfdXNlci5HSUQKCiAgICAjIFRPRE86IGNvbXBhcmUgdGhlIGFkZGl0aW9uYWxHaWRzIGZpZWxkIHRvbyBhZnRlciBjb21wdXRpbmcgaXRzIHZhbHVlCiAgICAjIGJhc2VkIG9uIC9ldGMvcGFzc3dkIGFuZCAvZXRjL2dyb3VwIGZyb20gdGhlIGNvbnRhaW5lciBpbWFnZS4KfQoKYWxsb3dfZGVwcmVjYXRlZF9hcmdzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZ3MgMTogbm8gYXJncyIpCgogICAgbm90IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJncwogICAgbm90IGlfcHJvY2Vzcy5BcmdzCgogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAxOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZ3MocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSkgewogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiBwb2xpY3kgYXJncyA9IiwgcF9wcm9jZXNzLkRlcHJlY2F0ZWRBcmdzKQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiBpbnB1dCBhcmdzID0iLCBpX3Byb2Nlc3MuQXJncykKCiAgICBjb3VudChwX3Byb2Nlc3MuRGVwcmVjYXRlZEFyZ3MpID09IGNvdW50KGlfcHJvY2Vzcy5BcmdzKQoKICAgIGV2ZXJ5IGksIGlfYXJnIGluIGlfcHJvY2Vzcy5BcmdzIHsKICAgICAgICBhbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpCiAgICB9CgogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDE6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgcF9hcmcyIDo9IHJlcGxhY2UocF9hcmcsICIkJCIsICIkIikKICAgIHBfYXJnMiA9PSBpX2FyZwoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAxOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDI6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgIyBUT0RPOiBjYW4gJChub2RlLW5hbWUpIGJlIGhhbmRsZWQgYmV0dGVyPwogICAgY29udGFpbnMocF9hcmcsICIkKG5vZGUtbmFtZSkiKQoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAyOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDM6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgcF9hcmcyIDo9IHJlcGxhY2UocF9hcmcsICIkJCIsICIkIikKICAgIHBfYXJnMyA6PSByZXBsYWNlKHBfYXJnMiwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAzOiBwX2FyZzMgPSIsIHBfYXJnMykKICAgIHBfYXJnMyA9PSBpX2FyZwoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAzOiB0cnVlIikKfQoKIyBPQ0kgcHJvY2Vzcy5FbnYgZmllbGQKYWxsb3dfZW52KHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfZW52OiBwIGVudiA9IiwgcF9wcm9jZXNzLkVudikKICAgIHByaW50KCJhbGxvd19lbnY6IGkgZW52ID0iLCBpX3Byb2Nlc3MuRW52KQoKICAgIGV2ZXJ5IGlfdmFyIGluIGlfcHJvY2Vzcy5FbnYgewogICAgICAgIHByaW50KCJhbGxvd19lbnY6IGlfdmFyID0iLCBpX3ZhcikKICAgICAgICBhbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgfQoKICAgIHByaW50KCJhbGxvd19lbnY6IHRydWUiKQp9CgojIEFsbG93IGlucHV0IGVudiB2YXJpYWJsZXMgdGhhdCBhcmUgcHJlc2VudCBpbiB0aGUgcG9saWN5IGRhdGEgdG9vLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHBfdmFyID09IGlfdmFyCiAgICBwcmludCgiYWxsb3dfdmFyIDE6IHRydWUiKQp9CgojIE1hdGNoIGlucHV0IHdpdGggb25lIG9mIHRoZSBwb2xpY3kgdmFyaWFibGVzLCBhZnRlciBzdWJzdGl0dXRpbmcgJChzYW5kYm94LW5hbWUpLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHByaW50KCJhbGxvd192YXIgMjogcF92YXIgPSIsIHBfdmFyKQoKICAgIHBfdmFyX3NwbGl0IDo9IHNwbGl0KHBfdmFyLCAiPSIpCiAgICBjb3VudChwX3Zhcl9zcGxpdCkgPT0gMgoKICAgIHBfdmFyX3NwbGl0WzFdID09ICIkKHNhbmRib3gtbmFtZSkiCgogICAgaV92YXJfc3BsaXQgOj0gc3BsaXQoaV92YXIsICI9IikKICAgIGNvdW50KGlfdmFyX3NwbGl0KSA9PSAyCgogICAgaV92YXJfc3BsaXRbMF0gPT0gcF92YXJfc3BsaXRbMF0KICAgIHJlZ2V4Lm1hdGNoKHNfbmFtZSwgaV92YXJfc3BsaXRbMV0pCgogICAgcHJpbnQoImFsbG93X3ZhciAyOiB0cnVlIikKfQoKIyBBbGxvdyBpbnB1dCBlbnYgdmFyaWFibGVzIHRoYXQgbWF0Y2ggd2l0aCBhIHJlcXVlc3RfZGVmYXVsdHMgcmVnZXguCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHNvbWUgcF9yZWdleDEgaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5DcmVhdGVDb250YWluZXJSZXF1ZXN0LmFsbG93X2Vudl9yZWdleAogICAgcF9yZWdleDIgOj0gcmVwbGFjZShwX3JlZ2V4MSwgIiQoaXB2NF9hKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcHY0X2EpCiAgICBwX3JlZ2V4MyA6PSByZXBsYWNlKHBfcmVnZXgyLCAiJChpcF9wKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcF9wKQogICAgcF9yZWdleDQgOj0gcmVwbGFjZShwX3JlZ2V4MywgIiQoc3ZjX25hbWUpIiwgcG9saWN5X2RhdGEuY29tbW9uLnN2Y19uYW1lKQogICAgcF9yZWdleDUgOj0gcmVwbGFjZShwX3JlZ2V4NCwgIiQoZG5zX2xhYmVsKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5kbnNfbGFiZWwpCgogICAgcHJpbnQoImFsbG93X3ZhciAzOiBwX3JlZ2V4NSA9IiwgcF9yZWdleDUpCiAgICByZWdleC5tYXRjaChwX3JlZ2V4NSwgaV92YXIpCgogICAgcHJpbnQoImFsbG93X3ZhciAzOiB0cnVlIikKfQoKIyBBbGxvdyBmaWVsZFJlZiAiZmllbGRQYXRoOiBzdGF0dXMucG9kSVAiIHZhbHVlcy4KYWxsb3dfdmFyKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBpX3Zhciwgc19uYW1lLCBzX25hbWVzcGFjZSkgewogICAgbmFtZV92YWx1ZSA6PSBzcGxpdChpX3ZhciwgIj0iKQogICAgY291bnQobmFtZV92YWx1ZSkgPT0gMgogICAgaXNfaXAobmFtZV92YWx1ZVsxXSkKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIGFsbG93X3BvZF9pcF92YXIobmFtZV92YWx1ZVswXSwgcF92YXIpCgogICAgcHJpbnQoImFsbG93X3ZhciA0OiB0cnVlIikKfQoKIyBBbGxvdyBjb21tb24gZmllbGRSZWYgdmFyaWFibGVzLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBuYW1lX3ZhbHVlIDo9IHNwbGl0KGlfdmFyLCAiPSIpCiAgICBjb3VudChuYW1lX3ZhbHVlKSA9PSAyCgogICAgc29tZSBwX3ZhciBpbiBwX3Byb2Nlc3MuRW52CiAgICBwX25hbWVfdmFsdWUgOj0gc3BsaXQocF92YXIsICI9IikKICAgIGNvdW50KHBfbmFtZV92YWx1ZSkgPT0gMgoKICAgIHBfbmFtZV92YWx1ZVswXSA9PSBuYW1lX3ZhbHVlWzBdCgogICAgIyBUT0RPOiBzaG91bGQgdGhlc2UgYmUgaGFuZGxlZCBpbiBhIGRpZmZlcmVudCB3YXk/CiAgICBhbHdheXNfYWxsb3dlZCA6PSBbIiQoaG9zdC1uYW1lKSIsICIkKG5vZGUtbmFtZSkiLCAiJChwb2QtdWlkKSJdCiAgICBzb21lIGFsbG93ZWQgaW4gYWx3YXlzX2FsbG93ZWQKICAgIGNvbnRhaW5zKHBfbmFtZV92YWx1ZVsxXSwgYWxsb3dlZCkKCiAgICBwcmludCgiYWxsb3dfdmFyIDU6IHRydWUiKQp9CgojIEFsbG93IGZpZWxkUmVmICJmaWVsZFBhdGg6IHN0YXR1cy5ob3N0SVAiIHZhbHVlcy4KYWxsb3dfdmFyKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBpX3Zhciwgc19uYW1lLCBzX25hbWVzcGFjZSkgewogICAgbmFtZV92YWx1ZSA6PSBzcGxpdChpX3ZhciwgIj0iKQogICAgY291bnQobmFtZV92YWx1ZSkgPT0gMgogICAgaXNfaXAobmFtZV92YWx1ZVsxXSkKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIGFsbG93X2hvc3RfaXBfdmFyKG5hbWVfdmFsdWVbMF0sIHBfdmFyKQoKICAgIHByaW50KCJhbGxvd192YXIgNjogdHJ1ZSIpCn0KCiMgQWxsb3cgcmVzb3VyY2VGaWVsZFJlZiB2YWx1ZXMgKGUuZy4sICJsaW1pdHMuY3B1IikuCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIG5hbWVfdmFsdWUgOj0gc3BsaXQoaV92YXIsICI9IikKICAgIGNvdW50KG5hbWVfdmFsdWUpID09IDIKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHBfbmFtZV92YWx1ZSA6PSBzcGxpdChwX3ZhciwgIj0iKQogICAgY291bnQocF9uYW1lX3ZhbHVlKSA9PSAyCgogICAgcF9uYW1lX3ZhbHVlWzBdID09IG5hbWVfdmFsdWVbMF0KCiAgICAjIGEgdmFyaWFibGUgd2Ugc2hvdWxkIGJlIHZhbGlkYXRpbmcgdXNpbmcgYSByZWdleCBmcm9tIHNldHRpbmdzCiAgICBwX25hbWVfdmFsdWVbMV0gPT0gIiQodmFsaWRhdGUtZnJvbS1zZXR0aW5ncykiCgogICAgcmVnZXhfdmFsIDo9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuQ3JlYXRlQ29udGFpbmVyUmVxdWVzdC5hbGxvd19lbnZfcmVnZXhfbWFwW25hbWVfdmFsdWVbMF1dCgogICAgcHJpbnQoImFsbG93X3ZhciA3OiB2YWwgPSIsIG5hbWVfdmFsdWVbMV0pCiAgICBwcmludCgiYWxsb3dfdmFyIDc6IHJlZ2V4X3ZhbCA9IiwgcmVnZXhfdmFsKQoKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4X3ZhbCwgbmFtZV92YWx1ZVsxXSkKCiAgICBwcmludCgiYWxsb3dfdmFyIDc6IHRydWUiKQp9CgojIE1hdGNoIGlucHV0IHdpdGggb25lIG9mIHRoZSBwb2xpY3kgdmFyaWFibGVzLCBhZnRlciBzdWJzdGl0dXRpbmcgJChzYW5kYm94LW5hbWVzcGFjZSkuCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHNvbWUgcF92YXIgaW4gcF9wcm9jZXNzLkVudgogICAgcF92YXIyIDo9IHJlcGxhY2UocF92YXIsICIkKHNhbmRib3gtbmFtZXNwYWNlKSIsIHNfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd192YXIgODogcF92YXIyID0iLCBwX3ZhcjIpCiAgICBwX3ZhcjIgPT0gaV92YXIKCiAgICBwcmludCgiYWxsb3dfdmFyIDg6IHRydWUiKQp9CgphbGxvd19wb2RfaXBfdmFyKHZhcl9uYW1lLCBwX3ZhcikgewogICAgcHJpbnQoImFsbG93X3BvZF9pcF92YXI6IHZhcl9uYW1lID0iLCB2YXJfbmFtZSwgInBfdmFyID0iLCBwX3ZhcikKCiAgICBwX25hbWVfdmFsdWUgOj0gc3BsaXQocF92YXIsICI9IikKICAgIGNvdW50KHBfbmFtZV92YWx1ZSkgPT0gMgoKICAgIHBfbmFtZV92YWx1ZVswXSA9PSB2YXJfbmFtZQogICAgcF9uYW1lX3ZhbHVlWzFdID09ICIkKHBvZC1pcCkiCgogICAgcHJpbnQoImFsbG93X3BvZF9pcF92YXI6IHRydWUiKQp9CgphbGxvd19ob3N0X2lwX3Zhcih2YXJfbmFtZSwgcF92YXIpIHsKICAgIHByaW50KCJhbGxvd19ob3N0X2lwX3ZhcjogdmFyX25hbWUgPSIsIHZhcl9uYW1lLCAicF92YXIgPSIsIHBfdmFyKQoKICAgIHBfbmFtZV92YWx1ZSA6PSBzcGxpdChwX3ZhciwgIj0iKQogICAgY291bnQocF9uYW1lX3ZhbHVlKSA9PSAyCgogICAgcF9uYW1lX3ZhbHVlWzBdID09IHZhcl9uYW1lCiAgICBwX25hbWVfdmFsdWVbMV0gPT0gIiQoaG9zdC1pcCkiCgogICAgcHJpbnQoImFsbG93X2hvc3RfaXBfdmFyOiB0cnVlIikKfQoKaXNfaXAodmFsdWUpIHsKICAgIGJ5dGVzID0gc3BsaXQodmFsdWUsICIuIikKICAgIGNvdW50KGJ5dGVzKSA9PSA0CgogICAgaXNfaXBfZmlyc3RfYnl0ZShieXRlc1swXSkKICAgIGlzX2lwX290aGVyX2J5dGUoYnl0ZXNbMV0pCiAgICBpc19pcF9vdGhlcl9ieXRlKGJ5dGVzWzJdKQogICAgaXNfaXBfb3RoZXJfYnl0ZShieXRlc1szXSkKfQppc19pcF9maXJzdF9ieXRlKGNvbXBvbmVudCkgewogICAgbnVtYmVyID0gdG9fbnVtYmVyKGNvbXBvbmVudCkKICAgIG51bWJlciA+PSAxCiAgICBudW1iZXIgPD0gMjU1Cn0KaXNfaXBfb3RoZXJfYnl0ZShjb21wb25lbnQpIHsKICAgIG51bWJlciA9IHRvX251bWJlcihjb21wb25lbnQpCiAgICBudW1iZXIgPj0gMAogICAgbnVtYmVyIDw9IDI1NQp9CgojIE9DSSByb290LlBhdGgKYWxsb3dfcm9vdF9wYXRoKHBfb2NpLCBpX29jaSwgYnVuZGxlX2lkKSB7CiAgICBpX3BhdGggOj0gaV9vY2kuUm9vdC5QYXRoCiAgICBwX3BhdGgxIDo9IHBfb2NpLlJvb3QuUGF0aAogICAgcHJpbnQoImFsbG93X3Jvb3RfcGF0aDogaV9wYXRoID0iLCBpX3BhdGgsICJwX3BhdGgxID0iLCBwX3BhdGgxKQoKICAgIHBfcGF0aDIgOj0gcmVwbGFjZShwX3BhdGgxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfcm9vdF9wYXRoOiBwX3BhdGgyID0iLCBwX3BhdGgyKQoKICAgIHBfcGF0aDMgOj0gcmVwbGFjZShwX3BhdGgyLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X3Jvb3RfcGF0aDogcF9wYXRoMyA9IiwgcF9wYXRoMykKCiAgICBwX3BhdGgzID09IGlfcGF0aAoKICAgIHByaW50KCJhbGxvd19yb290X3BhdGg6IHRydWUiKQp9CgojIGRldmljZSBtb3VudHMKYWxsb3dfbW91bnQocF9vY2ksIGlfbW91bnQsIGlfc3RvcmFnZXMsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcHJpbnQoImFsbG93X21vdW50OiBpX21vdW50ID0iLCBpX21vdW50KQoKICAgIHNvbWUgcF9tb3VudCBpbiBwX29jaS5Nb3VudHMKICAgIHNvbWUgaV9zdG9yYWdlIGluIGlfc3RvcmFnZXMKCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IHBfbW91bnQgPSIsIHBfbW91bnQpCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IGlfc3RvcmFnZSA9IiwgaV9zdG9yYWdlKQoKICAgIGNoZWNrX21vdW50KHBfbW91bnQsIGlfbW91bnQsIGlfc3RvcmFnZSwgYnVuZGxlX2lkLCBzYW5kYm94X2lkKQoKICAgICMgVE9ETzogYXJlIHRoZXJlIGFueSBvdGhlciByZXF1aXJlZCBwb2xpY3kgY2hlY2tzIGZvciBtb3VudHMgLSBlLmcuLAogICAgIyAgICAgICBtdWx0aXBsZSBtb3VudHMgd2l0aCBzYW1lIHNvdXJjZSBvciBkZXN0aW5hdGlvbj8KCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IHRydWUiKQp9CgpjaGVja19tb3VudChwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcF9tb3VudCA9PSBpX21vdW50CiAgICBwcmludCgiY2hlY2tfbW91bnQgMTogdHJ1ZSIpCn0KY2hlY2tfbW91bnQocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHBfbW91bnQuZGVzdGluYXRpb24gPT0gaV9tb3VudC5kZXN0aW5hdGlvbgogICAgcF9tb3VudC50eXBlXyA9PSBpX21vdW50LnR5cGVfCiAgICBwX21vdW50Lm9wdGlvbnMgPT0gaV9tb3VudC5vcHRpb25zCgogICAgbW91bnRfc291cmNlX2FsbG93cyhwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkKCiAgICBwcmludCgiY2hlY2tfbW91bnQgMjogdHJ1ZSIpCn0KCm1vdW50X3NvdXJjZV9hbGxvd3MocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHJlZ2V4MSA6PSBwX21vdW50LnNvdXJjZQogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5tb3VudF9zb3VyY2VfY3BhdGgpCiAgICByZWdleDQgOj0gcmVwbGFjZShyZWdleDMsICIkKGJ1bmRsZS1pZCkiLCBidW5kbGVfaWQpCgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMTogcmVnZXg0ID0iLCByZWdleDQpCiAgICByZWdleC5tYXRjaChyZWdleDQsIGlfbW91bnQuc291cmNlKQoKICAgIHByaW50KCJtb3VudF9zb3VyY2VfYWxsb3dzIDE6IHRydWUiKQp9Cm1vdW50X3NvdXJjZV9hbGxvd3MocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHJlZ2V4MSA6PSBwX21vdW50LnNvdXJjZQogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5tb3VudF9zb3VyY2VfY3BhdGgpCiAgICByZWdleDQgOj0gcmVwbGFjZShyZWdleDMsICIkKHNhbmRib3gtaWQpIiwgc2FuZGJveF9pZCkKCiAgICBwcmludCgibW91bnRfc291cmNlX2FsbG93cyAyOiByZWdleDQgPSIsIHJlZ2V4NCkKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4NCwgaV9tb3VudC5zb3VyY2UpCgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMjogdHJ1ZSIpCn0KbW91bnRfc291cmNlX2FsbG93cyhwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogaV9tb3VudC5zb3VyY2UgPSIsIGlfbW91bnQuc291cmNlKQogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogaV9zdG9yYWdlLm1vdW50X3BvaW50ID0iLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCgogICAgaV9tb3VudC5zb3VyY2UgPT0gaV9zdG9yYWdlLm1vdW50X3BvaW50CgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogdHJ1ZSIpCn0KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBDcmVhdGUgY29udGFpbmVyIFN0b3JhZ2VzCgphbGxvd19zdG9yYWdlcyhwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHBfY291bnQgOj0gY291bnQocF9zdG9yYWdlcykKICAgIGlfY291bnQgOj0gY291bnQoaV9zdG9yYWdlcykKICAgIHByaW50KCJhbGxvd19zdG9yYWdlczogcF9jb3VudCA9IiwgcF9jb3VudCwgImlfY291bnQgPSIsIGlfY291bnQpCgogICAgcF9jb3VudCA9PSBpX2NvdW50CgogICAgIyBHZXQgdGhlIGNvbnRhaW5lciBpbWFnZSBsYXllciBJRHMgYW5kIHZlcml0eSByb290IGhhc2hlcywgZnJvbSB0aGUgIm92ZXJsYXlmcyIgc3RvcmFnZS4KICAgIHNvbWUgb3ZlcmxheV9zdG9yYWdlIGluIHBfc3RvcmFnZXMKICAgIG92ZXJsYXlfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIHByaW50KCJhbGxvd19zdG9yYWdlczogb3ZlcmxheV9zdG9yYWdlID0iLCBvdmVybGF5X3N0b3JhZ2UpCiAgICBjb3VudChvdmVybGF5X3N0b3JhZ2Uub3B0aW9ucykgPT0gMgoKICAgIGxheWVyX2lkcyA6PSBzcGxpdChvdmVybGF5X3N0b3JhZ2Uub3B0aW9uc1swXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiBsYXllcl9pZHMgPSIsIGxheWVyX2lkcykKCiAgICByb290X2hhc2hlcyA6PSBzcGxpdChvdmVybGF5X3N0b3JhZ2Uub3B0aW9uc1sxXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiByb290X2hhc2hlcyA9Iiwgcm9vdF9oYXNoZXMpCgogICAgZXZlcnkgaV9zdG9yYWdlIGluIGlfc3RvcmFnZXMgewogICAgICAgIGFsbG93X3N0b3JhZ2UocF9zdG9yYWdlcywgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpCiAgICB9CgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiB0cnVlIikKfQoKYWxsb3dfc3RvcmFnZShwX3N0b3JhZ2VzLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgc29tZSBwX3N0b3JhZ2UgaW4gcF9zdG9yYWdlcwoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiBwX3N0b3JhZ2UgPSIsIHBfc3RvcmFnZSkKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiBpX3N0b3JhZ2UgPSIsIGlfc3RvcmFnZSkKCiAgICBwX3N0b3JhZ2UuZHJpdmVyICAgICAgICAgICA9PSBpX3N0b3JhZ2UuZHJpdmVyCiAgICBwX3N0b3JhZ2UuZHJpdmVyX29wdGlvbnMgICA9PSBpX3N0b3JhZ2UuZHJpdmVyX29wdGlvbnMKICAgIHBfc3RvcmFnZS5mc19ncm91cCAgICAgICAgID09IGlfc3RvcmFnZS5mc19ncm91cAogICAgcF9zdG9yYWdlLmZzdHlwZSAgICAgICAgICAgPT0gaV9zdG9yYWdlLmZzdHlwZQoKICAgIGFsbG93X3N0b3JhZ2Vfc291cmNlKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKQogICAgYWxsb3dfc3RvcmFnZV9vcHRpb25zKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKQogICAgYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKQoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiB0cnVlIikKfQoKYWxsb3dfc3RvcmFnZV9zb3VyY2UocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX3NvdXJjZSAxOiBzdGFydCIpCgogICAgcF9zdG9yYWdlLnNvdXJjZSA9PSBpX3N0b3JhZ2Uuc291cmNlCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDE6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX3NvdXJjZShwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDI6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCgogICAgIyBEREREOkJCOkRELkY6IERvbWFpbjpCdXM6RGV2aWNlLkZ1bmN0aW9uCiAgICAjIGh0dHBzOi8vd3d3Lmtlcm5lbC5vcmcvZG9jL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtYnVzLXBjaQogICAgcmVnZXgubWF0Y2goYF5bYS1mMC05XXs0fTpbYS1mMC05XXsyfTpbYS1mMC05XXsyfVwuW2EtZjAtOV0kYCwgaV9zdG9yYWdlLnNvdXJjZSkKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9zb3VyY2UgMjogdHJ1ZSIpCn0KCmFsbG93X3N0b3JhZ2Vfc291cmNlKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKSB7CiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9zb3VyY2UgMzogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIGlfc3RvcmFnZS5zb3VyY2UgPT0gIm5vbmUiCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDM6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX3NvdXJjZShwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDQ6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJzbWIiCgogICAgIyBQYXR0ZXJuOiAvLzxzdG9yYWdlLWFjY291bnQtbmFtZT4uZmlsZS5jb3JlLndpbmRvd3MubmV0LzxrOHMtUFZDLW5hbWU+CiAgICAjIFN0b3JhZ2UgYWNjb3VudCBuYW1lOiBodHRwczovL2xlYXJuLm1pY3Jvc29mdC5jb20vZW4tdXMvYXp1cmUvc3RvcmFnZS9jb21tb24vc3RvcmFnZS1hY2NvdW50LW92ZXJ2aWV3I3N0b3JhZ2UtYWNjb3VudC1uYW1lCiAgICAjIEs4cyBQVkMgbmFtZTogaHR0cHM6Ly9rdWJlcm5ldGVzLmlvL2RvY3MvY29uY2VwdHMvb3ZlcnZpZXcvd29ya2luZy13aXRoLW9iamVjdHMvbmFtZXMvI2Rucy1zdWJkb21haW4tbmFtZXMKICAgIHJlZ2V4Lm1hdGNoKGBeXC9cLyhbYS16MC05XXszLDI0fSlcLmZpbGVcLmNvcmVcLndpbmRvd3NcLm5ldFwvW2EtejAtOV0oW2EtejAtOS4tXXswLDI1MX1bYS16MC05XSk/JGAsIGlfc3RvcmFnZS5zb3VyY2UpCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDQ6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMTogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgIT0gIm92ZXJsYXlmcyIKICAgIHBfc3RvcmFnZS5vcHRpb25zID09IGlfc3RvcmFnZS5vcHRpb25zCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAxOiB0cnVlIikKfQphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIGNvdW50KHBfc3RvcmFnZS5vcHRpb25zKSA9PSAyCgogICAgcG9saWN5X2lkcyA6PSBzcGxpdChwX3N0b3JhZ2Uub3B0aW9uc1swXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBwb2xpY3lfaWRzID0iLCBwb2xpY3lfaWRzKQogICAgcG9saWN5X2lkcyA9PSBsYXllcl9pZHMKCiAgICBwb2xpY3lfaGFzaGVzIDo9IHNwbGl0KHBfc3RvcmFnZS5vcHRpb25zWzFdLCAiOiIpCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IHBvbGljeV9oYXNoZXMgPSIsIHBvbGljeV9oYXNoZXMpCgogICAgcF9jb3VudCA6PSBjb3VudChwb2xpY3lfaWRzKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBwX2NvdW50ID0iLCBwX2NvdW50KQogICAgcF9jb3VudCA+PSAxCiAgICBwX2NvdW50ID09IGNvdW50KHBvbGljeV9oYXNoZXMpCgogICAgaV9jb3VudCA6PSBjb3VudChpX3N0b3JhZ2Uub3B0aW9ucykKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogaV9jb3VudCA9IiwgaV9jb3VudCkKICAgIGlfY291bnQgPT0gcF9jb3VudCArIDMKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zWzBdID0iLCBpX3N0b3JhZ2Uub3B0aW9uc1swXSkKICAgIGlfc3RvcmFnZS5vcHRpb25zWzBdID09ICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQubGF5ZXItc3JjLXByZWZpeD0vdmFyL2xpYi9jb250YWluZXJkL2lvLmNvbnRhaW5lcmQuc25hcHNob3R0ZXIudjEudGFyZGV2L2xheWVycyIKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zW2lfY291bnQgLSAyXSA9IiwgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDJdKQogICAgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDJdID09ICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQub3ZlcmxheS1ydyIKCiAgICBsb3dlcmRpciA6PSBjb25jYXQoIj0iLCBbImxvd2VyZGlyIiwgcF9zdG9yYWdlLm9wdGlvbnNbMF1dKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBsb3dlcmRpciA9IiwgbG93ZXJkaXIpCgogICAgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDFdID09IGxvd2VyZGlyCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zW2lfY291bnQgLSAxXSA9IiwgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDFdKQoKICAgIGV2ZXJ5IGksIHBvbGljeV9pZCBpbiBwb2xpY3lfaWRzIHsKICAgICAgICBhbGxvd19vdmVybGF5X2xheWVyKHBvbGljeV9pZCwgcG9saWN5X2hhc2hlc1tpXSwgaV9zdG9yYWdlLm9wdGlvbnNbaSArIDFdKQogICAgfQoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogdHJ1ZSIpCn0KYWxsb3dfc3RvcmFnZV9vcHRpb25zKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKSB7CiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDM6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCiAgICBjb3VudChwX3N0b3JhZ2Uub3B0aW9ucykgPT0gMQoKICAgIHN0YXJ0c3dpdGgocF9zdG9yYWdlLm9wdGlvbnNbMF0sICIkKGhhc2giKQogICAgaGFzaF9zdWZmaXggOj0gdHJpbV9sZWZ0KHBfc3RvcmFnZS5vcHRpb25zWzBdLCAiJChoYXNoIikKCiAgICBlbmRzd2l0aChoYXNoX3N1ZmZpeCwgIikiKQogICAgaGFzaF9pbmRleCA6PSB0cmltX3JpZ2h0KGhhc2hfc3VmZml4LCAiKSIpCiAgICBpIDo9IHRvX251bWJlcihoYXNoX2luZGV4KQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAzOiBpID0iLCBpKQoKICAgIGhhc2hfb3B0aW9uIDo9IGNvbmNhdCgiPSIsIFsiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LnJvb3QtaGFzaCIsIHJvb3RfaGFzaGVzW2ldXSkKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMzogaGFzaF9vcHRpb24gPSIsIGhhc2hfb3B0aW9uKQoKICAgIGNvdW50KGlfc3RvcmFnZS5vcHRpb25zKSA9PSA0CiAgICBpX3N0b3JhZ2Uub3B0aW9uc1swXSA9PSAicm8iCiAgICBpX3N0b3JhZ2Uub3B0aW9uc1sxXSA9PSAiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmJsb2NrX2RldmljZT1maWxlIgogICAgaV9zdG9yYWdlLm9wdGlvbnNbMl0gPT0gImlvLmthdGFjb250YWluZXJzLmZzLW9wdC5pcy1sYXllciIKICAgIGlfc3RvcmFnZS5vcHRpb25zWzNdID09IGhhc2hfb3B0aW9uCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAzOiB0cnVlIikKfQphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgNDogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gInNtYiIKICAgIHBfb3B0c19jb3VudCA6PSBjb3VudChwX3N0b3JhZ2Uub3B0aW9ucykKICAgIGlfb3B0c19jb3VudCA6PSBjb3VudChpX3N0b3JhZ2Uub3B0aW9ucykKICAgIGlfb3B0c19jb3VudCA9PSBwX29wdHNfY291bnQgKyAyCgogICAgaV9vcHRfbWF0Y2hlcyA6PSBbaSB8IGkgOj0gaWR4OyBpZHggPCBwX29wdHNfY291bnQ7IHBfc3RvcmFnZS5vcHRpb25zW2lkeF0gPT0gaV9zdG9yYWdlLm9wdGlvbnNbaWR4XV0KICAgIGNvdW50KGlfb3B0X21hdGNoZXMpID09IHBfb3B0c19jb3VudAoKICAgIHN0YXJ0c3dpdGgoaV9zdG9yYWdlLm9wdGlvbnNbaV9vcHRzX2NvdW50LTJdLCAiYWRkcj0iKQogICAgY3JlZHMgPSBzcGxpdChpX3N0b3JhZ2Uub3B0aW9uc1tpX29wdHNfY291bnQtMV0sICIsIikKICAgIGNvdW50KGNyZWRzKSA9PSAyCiAgICBzdGFydHN3aXRoKGNyZWRzWzBdLCAidXNlcm5hbWU9IikKICAgIHN0YXJ0c3dpdGgoY3JlZHNbMV0sICJwYXNzd29yZD0iKQogICAgCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDQ6IHRydWUiKQp9CgphbGxvd19vdmVybGF5X2xheWVyKHBvbGljeV9pZCwgcG9saWN5X2hhc2gsIGlfb3B0aW9uKSB7CiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogcG9saWN5X2lkID0iLCBwb2xpY3lfaWQsICJwb2xpY3lfaGFzaCA9IiwgcG9saWN5X2hhc2gpCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogaV9vcHRpb24gPSIsIGlfb3B0aW9uKQoKICAgIHN0YXJ0c3dpdGgoaV9vcHRpb24sICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQubGF5ZXI9IikKICAgIGlfdmFsdWUgOj0gcmVwbGFjZShpX29wdGlvbiwgImlvLmthdGFjb250YWluZXJzLmZzLW9wdC5sYXllcj0iLCAiIikKICAgIGlfdmFsdWVfZGVjb2RlZCA6PSBiYXNlNjQuZGVjb2RlKGlfdmFsdWUpCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogaV92YWx1ZV9kZWNvZGVkID0iLCBpX3ZhbHVlX2RlY29kZWQpCgogICAgcG9saWN5X3N1ZmZpeCA6PSBjb25jYXQoIj0iLCBbInRhcixybyxpby5rYXRhY29udGFpbmVycy5mcy1vcHQuYmxvY2tfZGV2aWNlPWZpbGUsaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmlzLWxheWVyLGlvLmthdGFjb250YWluZXJzLmZzLW9wdC5yb290LWhhc2giLCBwb2xpY3lfaGFzaF0pCiAgICBwX3ZhbHVlIDo9IGNvbmNhdCgiLCIsIFtwb2xpY3lfaWQsIHBvbGljeV9zdWZmaXhdKQogICAgcHJpbnQoImFsbG93X292ZXJsYXlfbGF5ZXI6IHBfdmFsdWUgPSIsIHBfdmFsdWUpCgogICAgcF92YWx1ZSA9PSBpX3ZhbHVlX2RlY29kZWQKCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogdHJ1ZSIpCn0KCmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAidGFyIgoKICAgIHN0YXJ0c3dpdGgocF9zdG9yYWdlLm1vdW50X3BvaW50LCAiJChsYXllciIpCiAgICBtb3VudF9zdWZmaXggOj0gdHJpbV9sZWZ0KHBfc3RvcmFnZS5tb3VudF9wb2ludCwgIiQobGF5ZXIiKQoKICAgIGVuZHN3aXRoKG1vdW50X3N1ZmZpeCwgIikiKQogICAgbGF5ZXJfaW5kZXggOj0gdHJpbV9yaWdodChtb3VudF9zdWZmaXgsICIpIikKICAgIGkgOj0gdG9fbnVtYmVyKGxheWVyX2luZGV4KQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDE6IGkgPSIsIGkpCgogICAgbGF5ZXJfaWQgOj0gbGF5ZXJfaWRzW2ldCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMTogbGF5ZXJfaWQgPSIsIGxheWVyX2lkKQoKICAgIHBfbW91bnQgOj0gY29uY2F0KCIvIiwgWyIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L2xheWVycyIsIGxheWVyX2lkXSkKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCAxOiBwX21vdW50ID0iLCBwX21vdW50KQoKICAgIHBfbW91bnQgPT0gaV9zdG9yYWdlLm1vdW50X3BvaW50CgogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDE6IHRydWUiKQp9CmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAiZnVzZTMua2F0YS1vdmVybGF5IgoKICAgIG1vdW50MSA6PSByZXBsYWNlKHBfc3RvcmFnZS5tb3VudF9wb2ludCwgIiQoY3BhdGgpIiwgcG9saWN5X2RhdGEuY29tbW9uLmNwYXRoKQogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDI6IG1vdW50MiA9IiwgbW91bnQyKQoKICAgIG1vdW50MiA9PSBpX3N0b3JhZ2UubW91bnRfcG9pbnQKCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMjogdHJ1ZSIpCn0KYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKSB7CiAgICBwX3N0b3JhZ2UuZnN0eXBlID09ICJsb2NhbCIKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQyID0iLCBtb3VudDIpCgogICAgbW91bnQzIDo9IHJlcGxhY2UobW91bnQyLCAiJChzYW5kYm94LWlkKSIsIHNhbmRib3hfaWQpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQzID0iLCBtb3VudDMpCgogICAgcmVnZXgubWF0Y2gobW91bnQzLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCgogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDM6IHRydWUiKQp9CmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAiYmluZCIKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNDogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNDogbW91bnQyID0iLCBtb3VudDIpCgogICAgbW91bnQzIDo9IHJlcGxhY2UobW91bnQyLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDQ6IG1vdW50MyA9IiwgbW91bnQzKQoKICAgIHJlZ2V4Lm1hdGNoKG1vdW50MywgaV9zdG9yYWdlLm1vdW50X3BvaW50KQoKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA0OiB0cnVlIikKfQphbGxvd19tb3VudF9wb2ludChwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgYnVuZGxlX2lkLCBzYW5kYm94X2lkLCBsYXllcl9pZHMpIHsKICAgIHBfc3RvcmFnZS5mc3R5cGUgPT0gInRtcGZzIgoKICAgIG1vdW50MSA6PSBwX3N0b3JhZ2UubW91bnRfcG9pbnQKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA1OiBtb3VudDEgPSIsIG1vdW50MSkKCiAgICByZWdleC5tYXRjaChtb3VudDEsIGlfc3RvcmFnZS5tb3VudF9wb2ludCkKCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNTogdHJ1ZSIpCn0KYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKSB7CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogaV9zdG9yYWdlLm1vdW50X3BvaW50ID0iLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCiAgICBhbGxvd19kaXJlY3Rfdm9sX2RyaXZlcihwX3N0b3JhZ2UsIGlfc3RvcmFnZSkKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChzcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQyID0iLCBtb3VudDIpCgogICAgZGlyZWN0X3ZvbF9wYXRoIDo9IGlfc3RvcmFnZS5zb3VyY2UKICAgIG1vdW50MyA6PSByZXBsYWNlKG1vdW50MiwgIiQoYjY0LWRpcmVjdC12b2wtcGF0aCkiLCBiYXNlNjR1cmwuZW5jb2RlKGRpcmVjdF92b2xfcGF0aCkpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQzID0iLCBtb3VudDMpCgogICAgbW91bnQzID09IGlfc3RvcmFnZS5tb3VudF9wb2ludAoKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA2OiB0cnVlIikKfQoKYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIocF9zdG9yYWdlLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19kaXJlY3Rfdm9sX2RyaXZlciAxOiBzdGFydCIpCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCiAgICBwcmludCgiYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIgMTogdHJ1ZSIpCn0KYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIocF9zdG9yYWdlLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19kaXJlY3Rfdm9sX2RyaXZlciAyOiBzdGFydCIpCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJzbWIiCiAgICBwcmludCgiYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIgMjogdHJ1ZSIpCn0KCiMgRXhlY1Byb2Nlc3NSZXF1ZXN0LnByb2Nlc3MuQ2FwYWJpbGl0aWVzCmFsbG93X2V4ZWNfY2FwcyhpX2NhcHMpIHsKICAgIG5vdCBpX2NhcHMuQW1iaWVudAogICAgbm90IGlfY2Fwcy5Cb3VuZGluZwogICAgbm90IGlfY2Fwcy5FZmZlY3RpdmUKICAgIG5vdCBpX2NhcHMuSW5oZXJpdGFibGUKICAgIG5vdCBpX2NhcHMuUGVybWl0dGVkCn0KCiMgT0NJLlByb2Nlc3MuQ2FwYWJpbGl0aWVzCmFsbG93X2NhcHMocF9jYXBzLCBpX2NhcHMpIHsKICAgIHByaW50KCJhbGxvd19jYXBzOiBwb2xpY3kgQW1iaWVudCA9IiwgcF9jYXBzLkFtYmllbnQpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgQW1iaWVudCA9IiwgaV9jYXBzLkFtYmllbnQpCiAgICBtYXRjaF9jYXBzKHBfY2Fwcy5BbWJpZW50LCBpX2NhcHMuQW1iaWVudCkKCiAgICBwcmludCgiYWxsb3dfY2FwczogcG9saWN5IEJvdW5kaW5nID0iLCBwX2NhcHMuQm91bmRpbmcpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgQm91bmRpbmcgPSIsIGlfY2Fwcy5Cb3VuZGluZykKICAgIG1hdGNoX2NhcHMocF9jYXBzLkJvdW5kaW5nLCBpX2NhcHMuQm91bmRpbmcpCgogICAgcHJpbnQoImFsbG93X2NhcHM6IHBvbGljeSBFZmZlY3RpdmUgPSIsIHBfY2Fwcy5FZmZlY3RpdmUpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgRWZmZWN0aXZlID0iLCBpX2NhcHMuRWZmZWN0aXZlKQogICAgbWF0Y2hfY2FwcyhwX2NhcHMuRWZmZWN0aXZlLCBpX2NhcHMuRWZmZWN0aXZlKQoKICAgIHByaW50KCJhbGxvd19jYXBzOiBwb2xpY3kgSW5oZXJpdGFibGUgPSIsIHBfY2Fwcy5Jbmhlcml0YWJsZSkKICAgIHByaW50KCJhbGxvd19jYXBzOiBpbnB1dCBJbmhlcml0YWJsZSA9IiwgaV9jYXBzLkluaGVyaXRhYmxlKQogICAgbWF0Y2hfY2FwcyhwX2NhcHMuSW5oZXJpdGFibGUsIGlfY2Fwcy5Jbmhlcml0YWJsZSkKCiAgICBwcmludCgiYWxsb3dfY2FwczogcG9saWN5IFBlcm1pdHRlZCA9IiwgcF9jYXBzLlBlcm1pdHRlZCkKICAgIHByaW50KCJhbGxvd19jYXBzOiBpbnB1dCBQZXJtaXR0ZWQgPSIsIGlfY2Fwcy5QZXJtaXR0ZWQpCiAgICBtYXRjaF9jYXBzKHBfY2Fwcy5QZXJtaXR0ZWQsIGlfY2Fwcy5QZXJtaXR0ZWQpCn0KCm1hdGNoX2NhcHMocF9jYXBzLCBpX2NhcHMpIHsKICAgIHByaW50KCJtYXRjaF9jYXBzIDE6IHN0YXJ0IikKCiAgICBwX2NhcHMgPT0gaV9jYXBzCgogICAgcHJpbnQoIm1hdGNoX2NhcHMgMTogdHJ1ZSIpCn0KbWF0Y2hfY2FwcyhwX2NhcHMsIGlfY2FwcykgewogICAgcHJpbnQoIm1hdGNoX2NhcHMgMjogc3RhcnQiKQoKICAgIGNvdW50KHBfY2FwcykgPT0gMQogICAgcF9jYXBzWzBdID09ICIkKGRlZmF1bHRfY2FwcykiCgogICAgcHJpbnQoIm1hdGNoX2NhcHMgMjogZGVmYXVsdF9jYXBzID0iLCBwb2xpY3lfZGF0YS5jb21tb24uZGVmYXVsdF9jYXBzKQogICAgcG9saWN5X2RhdGEuY29tbW9uLmRlZmF1bHRfY2FwcyA9PSBpX2NhcHMKCiAgICBwcmludCgibWF0Y2hfY2FwcyAyOiB0cnVlIikKfQptYXRjaF9jYXBzKHBfY2FwcywgaV9jYXBzKSB7CiAgICBwcmludCgibWF0Y2hfY2FwcyAzOiBzdGFydCIpCgogICAgY291bnQocF9jYXBzKSA9PSAxCiAgICBwX2NhcHNbMF0gPT0gIiQocHJpdmlsZWdlZF9jYXBzKSIKCiAgICBwcmludCgibWF0Y2hfY2FwcyAzOiBwcml2aWxlZ2VkX2NhcHMgPSIsIHBvbGljeV9kYXRhLmNvbW1vbi5wcml2aWxlZ2VkX2NhcHMpCiAgICBwb2xpY3lfZGF0YS5jb21tb24ucHJpdmlsZWdlZF9jYXBzID09IGlfY2FwcwoKICAgIHByaW50KCJtYXRjaF9jYXBzIDM6IHRydWUiKQp9CgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgpjaGVja19kaXJlY3RvcnlfdHJhdmVyc2FsKGlfcGF0aCkgewogICAgbm90IHJlZ2V4Lm1hdGNoKCIoXnwvKS4uKCR8LykiLCBpX3BhdGgpCn0KCmNoZWNrX3N5bWxpbmtfc291cmNlKGlfc3JjKSB7CiAgICBpX3NyYyA9PSAiIgogICAgcHJpbnQoImNoZWNrX3N5bWxpbmtfc291cmNlIDE6IHRydWUiKQp9CmNoZWNrX3N5bWxpbmtfc291cmNlKGlfc3JjKSB7CiAgICBpX3NyYyAhPSAiIgogICAgcHJpbnQoImNoZWNrX3N5bWxpbmtfc291cmNlIDI6IGlfc3JjID0iLCBpX3NyYykKCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24uc19zb3VyY2UxLCBpX3NyYykKCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMjogdHJ1ZSIpCn0KY2hlY2tfc3ltbGlua19zb3VyY2UoaV9zcmMpIHsKICAgIGlfc3JjICE9ICIiCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMzogaV9zcmMgPSIsIGlfc3JjKQoKICAgIHJlZ2V4Lm1hdGNoKHBvbGljeV9kYXRhLmNvbW1vbi5zX3NvdXJjZTIsIGlfc3JjKQogICAgY2hlY2tfZGlyZWN0b3J5X3RyYXZlcnNhbChpX3NyYykKCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMzogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfc3RvcmFnZXMoaV9zdG9yYWdlcykgewogICAgcHJpbnQoImFsbG93X3NhbmRib3hfc3RvcmFnZXM6IGlfc3RvcmFnZXMgPSIsIGlfc3RvcmFnZXMpCgogICAgcF9zdG9yYWdlcyA6PSBwb2xpY3lfZGF0YS5zYW5kYm94LnN0b3JhZ2VzCiAgICBldmVyeSBpX3N0b3JhZ2UgaW4gaV9zdG9yYWdlcyB7CiAgICAgICAgYWxsb3dfc2FuZGJveF9zdG9yYWdlKHBfc3RvcmFnZXMsIGlfc3RvcmFnZSkKICAgIH0KCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9zdG9yYWdlczogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfc3RvcmFnZShwX3N0b3JhZ2VzLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IGlfc3RvcmFnZSA9IiwgaV9zdG9yYWdlKQoKICAgIHNvbWUgcF9zdG9yYWdlIGluIHBfc3RvcmFnZXMKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IHBfc3RvcmFnZSA9IiwgcF9zdG9yYWdlKQogICAgaV9zdG9yYWdlID09IHBfc3RvcmFnZQoKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IHRydWUiKQp9CgpDb3B5RmlsZVJlcXVlc3QgewogICAgcHJpbnQoIkNvcHlGaWxlUmVxdWVzdDogaW5wdXQucGF0aCA9IiwgaW5wdXQucGF0aCkKCiAgICBjaGVja19zeW1saW5rX3NvdXJjZShpbnB1dC5zeW1saW5rX3NyYykKICAgIGNoZWNrX2RpcmVjdG9yeV90cmF2ZXJzYWwoaW5wdXQucGF0aCkKCiAgICBzb21lIHJlZ2V4MSBpbiBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLkNvcHlGaWxlUmVxdWVzdAogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5jcGF0aCkKICAgIHJlZ2V4NCA6PSByZXBsYWNlKHJlZ2V4MywgIiQoYnVuZGxlLWlkKSIsIEJVTkRMRV9JRCkKICAgIHByaW50KCJDb3B5RmlsZVJlcXVlc3Q6IHJlZ2V4NCA9IiwgcmVnZXg0KQoKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4NCwgaW5wdXQucGF0aCkKCiAgICBwcmludCgiQ29weUZpbGVSZXF1ZXN0OiB0cnVlIikKfQoKQ3JlYXRlU2FuZGJveFJlcXVlc3QgewogICAgcHJpbnQoIkNyZWF0ZVNhbmRib3hSZXF1ZXN0OiBpbnB1dC5ndWVzdF9ob29rX3BhdGggPSIsIGlucHV0Lmd1ZXN0X2hvb2tfcGF0aCkKICAgIGNvdW50KGlucHV0Lmd1ZXN0X2hvb2tfcGF0aCkgPT0gMAoKICAgIHByaW50KCJDcmVhdGVTYW5kYm94UmVxdWVzdDogaW5wdXQua2VybmVsX21vZHVsZXMgPSIsIGlucHV0Lmtlcm5lbF9tb2R1bGVzKQogICAgY291bnQoaW5wdXQua2VybmVsX21vZHVsZXMpID09IDAKCiAgICBpX3BpZG5zIDo9IGlucHV0LnNhbmRib3hfcGlkbnMKICAgIHByaW50KCJDcmVhdGVTYW5kYm94UmVxdWVzdDogaV9waWRucyA9IiwgaV9waWRucykKICAgIGlfcGlkbnMgPT0gZmFsc2UKICAgIGFsbG93X3NhbmRib3hfc3RvcmFnZXMoaW5wdXQuc3RvcmFnZXMpCn0KCmFsbG93X2V4ZWMocF9jb250YWluZXIsIGlfcHJvY2VzcykgewogICAgcHJpbnQoImFsbG93X2V4ZWM6IHN0YXJ0IikKCiAgICBwX29jaSA9IHBfY29udGFpbmVyLk9DSQogICAgcF9zX25hbWUgPSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc19uYW1lc3BhY2UgPSBnZXRfc3RhdGVfdmFsKCJuYW1lc3BhY2UiKQogICAgYWxsb3dfcHJvYmVfcHJvY2VzcyhwX29jaS5Qcm9jZXNzLCBpX3Byb2Nlc3MsIHBfc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfZXhlYzogdHJ1ZSIpCn0KCmFsbG93X2ludGVyYWN0aXZlX2V4ZWMocF9jb250YWluZXIsIGlfcHJvY2VzcykgewogICAgcHJpbnQoImFsbG93X2ludGVyYWN0aXZlX2V4ZWM6IHN0YXJ0IikKCiAgICBwX29jaSA9IHBfY29udGFpbmVyLk9DSQogICAgcF9zX25hbWUgPSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc19uYW1lc3BhY2UgPSBnZXRfc3RhdGVfdmFsKCJuYW1lc3BhY2UiKQogICAgYWxsb3dfaW50ZXJhY3RpdmVfcHJvY2VzcyhwX29jaS5Qcm9jZXNzLCBpX3Byb2Nlc3MsIHBfc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfaW50ZXJhY3RpdmVfZXhlYzogdHJ1ZSIpCn0KCiMgVE9ETzogc2hvdWxkIG90aGVyIEV4ZWNQcm9jZXNzUmVxdWVzdCBpbnB1dCBkYXRhIGZpZWxkcyBiZSB2YWxpZGF0ZWQgYXMgd2VsbD8KRXhlY1Byb2Nlc3NSZXF1ZXN0IHsKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMTogaW5wdXQgPSIsIGlucHV0KQoKICAgIHNvbWUgcF9jb21tYW5kIGluIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuRXhlY1Byb2Nlc3NSZXF1ZXN0LmFsbG93ZWRfY29tbWFuZHMKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMTogcF9jb21tYW5kID0iLCBwX2NvbW1hbmQpCiAgICBwX2NvbW1hbmQgPT0gaW5wdXQucHJvY2Vzcy5BcmdzCgogICAgIyBUT0RPOiBtYXRjaCBwX2NvbnRhaW5lcidzIElEIHdpdGggdGhlIGlucHV0IGNvbnRhaW5lcl9pZC4KICAgIHNvbWUgcF9jb250YWluZXIgaW4gcG9saWN5X2RhdGEuY29udGFpbmVycwogICAgYWxsb3dfaW50ZXJhY3RpdmVfZXhlYyhwX2NvbnRhaW5lciwgaW5wdXQucHJvY2VzcykKCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDE6IHRydWUiKQp9CkV4ZWNQcm9jZXNzUmVxdWVzdCB7CiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDI6IGlucHV0ID0iLCBpbnB1dCkKCiAgICAjIFRPRE86IG1hdGNoIGlucHV0IGNvbnRhaW5lciBJRCB3aXRoIGl0cyBjb3JyZXNwb25kaW5nIGNvbnRhaW5lci5leGVjX2NvbW1hbmRzLgogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBzb21lIHBfY29tbWFuZCBpbiBwX2NvbnRhaW5lci5leGVjX2NvbW1hbmRzCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDI6IHBfY29tbWFuZCA9IiwgcF9jb21tYW5kKQoKICAgICMgVE9ETzogc2hvdWxkIG90aGVyIGlucHV0IGRhdGEgZmllbGRzIGJlIHZhbGlkYXRlZCBhcyB3ZWxsPwogICAgcF9jb21tYW5kID09IGlucHV0LnByb2Nlc3MuQXJncwoKICAgIGFsbG93X2V4ZWMocF9jb250YWluZXIsIGlucHV0LnByb2Nlc3MpCgogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAyOiB0cnVlIikKfQpFeGVjUHJvY2Vzc1JlcXVlc3QgewogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAzOiBpbnB1dCA9IiwgaW5wdXQpCgogICAgaV9jb21tYW5kID0gY29uY2F0KCIgIiwgaW5wdXQucHJvY2Vzcy5BcmdzKQogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAzOiBpX2NvbW1hbmQgPSIsIGlfY29tbWFuZCkKCiAgICBzb21lIHBfcmVnZXggaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5FeGVjUHJvY2Vzc1JlcXVlc3QucmVnZXgKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMzogcF9yZWdleCA9IiwgcF9yZWdleCkKCiAgICByZWdleC5tYXRjaChwX3JlZ2V4LCBpX2NvbW1hbmQpCgogICAgIyBUT0RPOiBtYXRjaCBwX2NvbnRhaW5lcidzIElEIHdpdGggdGhlIGlucHV0IGNvbnRhaW5lcl9pZC4KICAgIHNvbWUgcF9jb250YWluZXIgaW4gcG9saWN5X2RhdGEuY29udGFpbmVycwogICAgYWxsb3dfaW50ZXJhY3RpdmVfZXhlYyhwX2NvbnRhaW5lciwgaW5wdXQucHJvY2VzcykKCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDM6IHRydWUiKQp9CgpVcGRhdGVSb3V0ZXNSZXF1ZXN0IHsKICAgIHByaW50KCJVcGRhdGVSb3V0ZXNSZXF1ZXN0OiBpbnB1dCA9IiwgaW5wdXQpCiAgICBwcmludCgiVXBkYXRlUm91dGVzUmVxdWVzdDogcG9saWN5ID0iLCBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLlVwZGF0ZVJvdXRlc1JlcXVlc3QpCgogICAgaV9yb3V0ZXMgOj0gaW5wdXQucm91dGVzLlJvdXRlcwogICAgcF9zb3VyY2VfcmVnZXggPSBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLlVwZGF0ZVJvdXRlc1JlcXVlc3QuZm9yYmlkZGVuX3NvdXJjZV9yZWdleAogICAgcF9uYW1lcyA9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuVXBkYXRlUm91dGVzUmVxdWVzdC5mb3JiaWRkZW5fZGV2aWNlX25hbWVzCgogICAgZXZlcnkgaV9yb3V0ZSBpbiBpX3JvdXRlcyB7CiAgICAgICAgcHJpbnQoImlfcm91dGUuc291cmNlID0iLCBpX3JvdXRlLnNvdXJjZSkKICAgICAgICBldmVyeSBwX3JlZ2V4IGluIHBfc291cmNlX3JlZ2V4IHsKICAgICAgICAgICAgcHJpbnQoInBfcmVnZXggPSIsIHBfcmVnZXgpCiAgICAgICAgICAgIG5vdCByZWdleC5tYXRjaChwX3JlZ2V4LCBpX3JvdXRlLnNvdXJjZSkKICAgICAgICB9CgogICAgICAgIHByaW50KCJpX3JvdXRlLmRldmljZSA9IiwgaV9yb3V0ZS5kZXZpY2UpCiAgICAgICAgbm90IGlfcm91dGUuZGV2aWNlIGluIHBfbmFtZXMKICAgIH0KCiAgICBwcmludCgiVXBkYXRlUm91dGVzUmVxdWVzdDogdHJ1ZSIpCn0KClVwZGF0ZUludGVyZmFjZVJlcXVlc3QgewogICAgcHJpbnQoIlVwZGF0ZUludGVyZmFjZVJlcXVlc3Q6IGlucHV0ID0iLCBpbnB1dCkKICAgIHByaW50KCJVcGRhdGVJbnRlcmZhY2VSZXF1ZXN0OiBwb2xpY3kgPSIsIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuVXBkYXRlSW50ZXJmYWNlUmVxdWVzdCkKCiAgICBpX2ludGVyZmFjZSA6PSBpbnB1dC5pbnRlcmZhY2UKICAgIHBfZmxhZ3MgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmFsbG93X3Jhd19mbGFncwoKICAgICMgVHlwaWNhbGx5LCBqdXN0IElGRl9OT0FSUCBpcyB1c2VkLgogICAgYml0cy5hbmQoaV9pbnRlcmZhY2UucmF3X2ZsYWdzLCBiaXRzLm5lZ2F0ZShwX2ZsYWdzKSkgPT0gMAoKICAgIHBfbmFtZXMgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmZvcmJpZGRlbl9uYW1lcwoKICAgIG5vdCBpX2ludGVyZmFjZS5uYW1lIGluIHBfbmFtZXMKCiAgICBwX2h3YWRkcnMgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmZvcmJpZGRlbl9od19hZGRycwoKICAgIG5vdCBpX2ludGVyZmFjZS5od0FkZHIgaW4gcF9od2FkZHJzCgogICAgcHJpbnQoIlVwZGF0ZUludGVyZmFjZVJlcXVlc3Q6IHRydWUiKQp9CgpDbG9zZVN0ZGluUmVxdWVzdCB7CiAgICBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLkNsb3NlU3RkaW5SZXF1ZXN0ID09IHRydWUKfQoKUmVhZFN0cmVhbVJlcXVlc3QgewogICAgcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5SZWFkU3RyZWFtUmVxdWVzdCA9PSB0cnVlCn0KClVwZGF0ZUVwaGVtZXJhbE1vdW50c1JlcXVlc3QgewogICAgcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVFcGhlbWVyYWxNb3VudHNSZXF1ZXN0ID09IHRydWUKfQoKV3JpdGVTdHJlYW1SZXF1ZXN0IHsKICAgIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuV3JpdGVTdHJlYW1SZXF1ZXN0ID09IHRydWUKfQoKcG9saWN5X2RhdGEgOj0gewogICJjb250YWluZXJzIjogWwogICAgewogICAgICAiT0NJIjogewogICAgICAgICJWZXJzaW9uIjogIjEuMS4wLXJjLjEiLAogICAgICAgICJQcm9jZXNzIjogewogICAgICAgICAgIlRlcm1pbmFsIjogZmFsc2UsCiAgICAgICAgICAiVXNlciI6IHsKICAgICAgICAgICAgIlVJRCI6IDIwMDAsCiAgICAgICAgICAgICJHSUQiOiA2NTUzNSwKICAgICAgICAgICAgIkFkZGl0aW9uYWxHaWRzIjogW10sCiAgICAgICAgICAgICJVc2VybmFtZSI6ICIiCiAgICAgICAgICB9LAogICAgICAgICAgIkRlcHJlY2F0ZWRBcmdzIjogWwogICAgICAgICAgICAiL3BhdXNlIgogICAgICAgICAgXSwKICAgICAgICAgICJBcmdzIjogWwogICAgICAgICAgICAiL3BhdXNlIgogICAgICAgICAgXSwKICAgICAgICAgICJFbnYiOiBbCiAgICAgICAgICAgICJQQVRIPS91c3IvbG9jYWwvc2JpbjovdXNyL2xvY2FsL2JpbjovdXNyL3NiaW46L3Vzci9iaW46L3NiaW46L2JpbiIKICAgICAgICAgIF0sCiAgICAgICAgICAiQ3dkIjogIi8iLAogICAgICAgICAgIkNhcGFiaWxpdGllcyI6IHsKICAgICAgICAgICAgIkFtYmllbnQiOiBbXSwKICAgICAgICAgICAgIkJvdW5kaW5nIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJFZmZlY3RpdmUiOiBbCiAgICAgICAgICAgICAgIiQoZGVmYXVsdF9jYXBzKSIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgIkluaGVyaXRhYmxlIjogW10sCiAgICAgICAgICAgICJQZXJtaXR0ZWQiOiBbCiAgICAgICAgICAgICAgIiQoZGVmYXVsdF9jYXBzKSIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgICJOb05ld1ByaXZpbGVnZXMiOiB0cnVlCiAgICAgICAgfSwKICAgICAgICAiUm9vdCI6IHsKICAgICAgICAgICJQYXRoIjogIiQoY3BhdGgpLyQoYnVuZGxlLWlkKSIsCiAgICAgICAgICAiUmVhZG9ubHkiOiB0cnVlCiAgICAgICAgfSwKICAgICAgICAiTW91bnRzIjogWwogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL3Byb2MiLAogICAgICAgICAgICAic291cmNlIjogInByb2MiLAogICAgICAgICAgICAidHlwZV8iOiAicHJvYyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYiLAogICAgICAgICAgICAic291cmNlIjogInRtcGZzIiwKICAgICAgICAgICAgInR5cGVfIjogInRtcGZzIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgInN0cmljdGF0aW1lIiwKICAgICAgICAgICAgICAibW9kZT03NTUiLAogICAgICAgICAgICAgICJzaXplPTY1NTM2ayIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvcHRzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJkZXZwdHMiLAogICAgICAgICAgICAidHlwZV8iOiAiZGV2cHRzIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAgICAgIm5ld2luc3RhbmNlIiwKICAgICAgICAgICAgICAicHRteG1vZGU9MDY2NiIsCiAgICAgICAgICAgICAgIm1vZGU9MDYyMCIsCiAgICAgICAgICAgICAgImdpZD01IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi9zaG0iLAogICAgICAgICAgICAic291cmNlIjogIi9ydW4va2F0YS1jb250YWluZXJzL3NhbmRib3gvc2htIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L21xdWV1ZSIsCiAgICAgICAgICAgICJzb3VyY2UiOiAibXF1ZXVlIiwKICAgICAgICAgICAgInR5cGVfIjogIm1xdWV1ZSIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9zeXMiLAogICAgICAgICAgICAic291cmNlIjogInN5c2ZzIiwKICAgICAgICAgICAgInR5cGVfIjogInN5c2ZzIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAgICAgIm5vZGV2IiwKICAgICAgICAgICAgICAicm8iCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZXRjL3Jlc29sdi5jb25mIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KXJlc29sdi5jb25mJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicm8iLAogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2RldiIsCiAgICAgICAgICAgICAgIm5vZXhlYyIKICAgICAgICAgICAgXQogICAgICAgICAgfQogICAgICAgIF0sCiAgICAgICAgIkFubm90YXRpb25zIjogewogICAgICAgICAgImlvLmthdGFjb250YWluZXJzLnBrZy5vY2kuYnVuZGxlX3BhdGgiOiAiL3J1bi9jb250YWluZXJkL2lvLmNvbnRhaW5lcmQucnVudGltZS52Mi50YXNrL2s4cy5pby8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgImlvLmthdGFjb250YWluZXJzLnBrZy5vY2kuY29udGFpbmVyX3R5cGUiOiAicG9kX3NhbmRib3giLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLmNvbnRhaW5lci10eXBlIjogInNhbmRib3giLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtaWQiOiAiXlthLXowLTldezY0fSQiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbG9nLWRpcmVjdG9yeSI6ICJeL3Zhci9sb2cvcG9kcy8kKHNhbmRib3gtbmFtZXNwYWNlKV8kKHNhbmRib3gtbmFtZSlfWzAtOWEtZl17OH0tWzAtOWEtZl17NH0tWzAtOWEtZl17NH0tWzAtOWEtZl17NH0tWzAtOWEtZl17MTJ9JCIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1uYW1lIjogIl5jbTEkIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LW5hbWVzcGFjZSI6ICIiLAogICAgICAgICAgIm5lcmRjdGwvbmV0d29yay1uYW1lc3BhY2UiOiAiXi92YXIvcnVuL25ldG5zL2NuaS1bMC05YS1mXXs4fS1bMC05YS1mXXs0fS1bMC05YS1mXXs0fS1bMC05YS1mXXs0fS1bMC05YS1mXXsxMn0kIgogICAgICAgIH0sCiAgICAgICAgIkxpbnV4IjogewogICAgICAgICAgIk5hbWVzcGFjZXMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiVHlwZSI6ICJpcGMiLAogICAgICAgICAgICAgICJQYXRoIjogIiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJUeXBlIjogInV0cyIsCiAgICAgICAgICAgICAgIlBhdGgiOiAiIgogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgIlR5cGUiOiAibW91bnQiLAogICAgICAgICAgICAgICJQYXRoIjogIiIKICAgICAgICAgICAgfQogICAgICAgICAgXSwKICAgICAgICAgICJNYXNrZWRQYXRocyI6IFsKICAgICAgICAgICAgIi9wcm9jL2FjcGkiLAogICAgICAgICAgICAiL3Byb2MvYXNvdW5kIiwKICAgICAgICAgICAgIi9wcm9jL2tjb3JlIiwKICAgICAgICAgICAgIi9wcm9jL2tleXMiLAogICAgICAgICAgICAiL3Byb2MvbGF0ZW5jeV9zdGF0cyIsCiAgICAgICAgICAgICIvcHJvYy90aW1lcl9saXN0IiwKICAgICAgICAgICAgIi9wcm9jL3RpbWVyX3N0YXRzIiwKICAgICAgICAgICAgIi9wcm9jL3NjaGVkX2RlYnVnIiwKICAgICAgICAgICAgIi9zeXMvZmlybXdhcmUiLAogICAgICAgICAgICAiL3Byb2Mvc2NzaSIKICAgICAgICAgIF0sCiAgICAgICAgICAiUmVhZG9ubHlQYXRocyI6IFsKICAgICAgICAgICAgIi9wcm9jL2J1cyIsCiAgICAgICAgICAgICIvcHJvYy9mcyIsCiAgICAgICAgICAgICIvcHJvYy9pcnEiLAogICAgICAgICAgICAiL3Byb2Mvc3lzIiwKICAgICAgICAgICAgIi9wcm9jL3N5c3JxLXRyaWdnZXIiCiAgICAgICAgICBdLAogICAgICAgICAgIkRldmljZXMiOiBbXSwKICAgICAgICAgICJTeXNjdGwiOiB7CiAgICAgICAgICAgICJuZXQuaXB2NC5pcF91bnByaXZpbGVnZWRfcG9ydF9zdGFydCI6ICIwIiwKICAgICAgICAgICAgIm5ldC5pcHY0LnBpbmdfZ3JvdXBfcmFuZ2UiOiAiMCAyMTQ3NDgzNjQ3IgogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSwKICAgICAgInN0b3JhZ2VzIjogWwogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2gwKSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjApIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAib3ZlcmxheWZzIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJmdXNlMy5rYXRhLW92ZXJsYXkiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICI1YTVhYWQ4MDA1NWZmMjAwMTJhNTBkYzI1ZjhkZjdhMjk5MjQ0NzQzMjRkNjVmN2Q1MzA2ZWU4ZWUyN2ZmNzFkIiwKICAgICAgICAgICAgIjgxNzI1MGYxYTNlMzM2ZGE3NmY1YmQzZmE3ODRlMWIyNmQ5NTliOWMxMzE4NzY4MTViYTI2MDQwNDhiNzBjMTgiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQoY3BhdGgpLyQoYnVuZGxlLWlkKSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfQogICAgICBdLAogICAgICAiZGV2aWNlcyI6IFtdLAogICAgICAic2FuZGJveF9waWRucyI6IGZhbHNlLAogICAgICAiZXhlY19jb21tYW5kcyI6IFtdLAogICAgICAiZW52X21hcCI6IHsKICAgICAgICAiUEFUSCI6ICIvdXNyL2xvY2FsL3NiaW46L3Vzci9sb2NhbC9iaW46L3Vzci9zYmluOi91c3IvYmluOi9zYmluOi9iaW4iCiAgICAgIH0KICAgIH0sCiAgICB7CiAgICAgICJPQ0kiOiB7CiAgICAgICAgIlZlcnNpb24iOiAiMS4xLjAtcmMuMSIsCiAgICAgICAgIlByb2Nlc3MiOiB7CiAgICAgICAgICAiVGVybWluYWwiOiBmYWxzZSwKICAgICAgICAgICJVc2VyIjogewogICAgICAgICAgICAiVUlEIjogMjAwMCwKICAgICAgICAgICAgIkdJRCI6IDAsCiAgICAgICAgICAgICJBZGRpdGlvbmFsR2lkcyI6IFtdLAogICAgICAgICAgICAiVXNlcm5hbWUiOiAiIgogICAgICAgICAgfSwKICAgICAgICAgICJEZXByZWNhdGVkQXJncyI6IFsKICAgICAgICAgICAgIi9iaW4vc2giLAogICAgICAgICAgICAiLWMiLAogICAgICAgICAgICAid2hpbGUgdHJ1ZTsgZG8gZWNobyBoZWxsbzsgc2xlZXAgMTA7IGRvbmUiCiAgICAgICAgICBdLAogICAgICAgICAgIkFyZ3MiOiBbCiAgICAgICAgICAgICIvYmluL3NoIiwKICAgICAgICAgICAgIi1jIiwKICAgICAgICAgICAgIndoaWxlIHRydWU7IGRvIGVjaG8gaGVsbG87IHNsZWVwIDEwOyBkb25lIgogICAgICAgICAgXSwKICAgICAgICAgICJFbnYiOiBbCiAgICAgICAgICAgICJQQVRIPS91c3IvbG9jYWwvc2JpbjovdXNyL2xvY2FsL2JpbjovdXNyL3NiaW46L3Vzci9iaW46L3NiaW46L2JpbiIsCiAgICAgICAgICAgICJIT1NUTkFNRT0kKGhvc3QtbmFtZSkiLAogICAgICAgICAgICAiQ09ORklHX01BUF9WQUxVRTE9dmFsdWUxIgogICAgICAgICAgXSwKICAgICAgICAgICJDd2QiOiAiLyIsCiAgICAgICAgICAiQ2FwYWJpbGl0aWVzIjogewogICAgICAgICAgICAiQW1iaWVudCI6IFtdLAogICAgICAgICAgICAiQm91bmRpbmciOiBbCiAgICAgICAgICAgICAgIiQocHJpdmlsZWdlZF9jYXBzKSIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgIkVmZmVjdGl2ZSI6IFsKICAgICAgICAgICAgICAiJChwcml2aWxlZ2VkX2NhcHMpIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiSW5oZXJpdGFibGUiOiBbXSwKICAgICAgICAgICAgIlBlcm1pdHRlZCI6IFsKICAgICAgICAgICAgICAiJChwcml2aWxlZ2VkX2NhcHMpIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgIk5vTmV3UHJpdmlsZWdlcyI6IGZhbHNlCiAgICAgICAgfSwKICAgICAgICAiUm9vdCI6IHsKICAgICAgICAgICJQYXRoIjogIiQoY3BhdGgpLyQoYnVuZGxlLWlkKSIsCiAgICAgICAgICAiUmVhZG9ubHkiOiBmYWxzZQogICAgICAgIH0sCiAgICAgICAgIk1vdW50cyI6IFsKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9wcm9jIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJwcm9jIiwKICAgICAgICAgICAgInR5cGVfIjogInByb2MiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2IiwKICAgICAgICAgICAgInNvdXJjZSI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJzdHJpY3RhdGltZSIsCiAgICAgICAgICAgICAgIm1vZGU9NzU1IiwKICAgICAgICAgICAgICAic2l6ZT02NTUzNmsiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L3B0cyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiZGV2cHRzIiwKICAgICAgICAgICAgInR5cGVfIjogImRldnB0cyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJuZXdpbnN0YW5jZSIsCiAgICAgICAgICAgICAgInB0bXhtb2RlPTA2NjYiLAogICAgICAgICAgICAgICJtb2RlPTA2MjAiLAogICAgICAgICAgICAgICJnaWQ9NSIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvc2htIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L3NobSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi9tcXVldWUiLAogICAgICAgICAgICAic291cmNlIjogIm1xdWV1ZSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJtcXVldWUiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvc3lzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJzeXNmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJzeXNmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIsCiAgICAgICAgICAgICAgInJ3IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL3N5cy9mcy9jZ3JvdXAiLAogICAgICAgICAgICAic291cmNlIjogImNncm91cCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJjZ3JvdXAiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiLAogICAgICAgICAgICAgICJyZWxhdGltZSIsCiAgICAgICAgICAgICAgInJ3IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2V0Yy9ob3N0cyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClob3N0cyQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicnciCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L3Rlcm1pbmF0aW9uLWxvZyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeCl0ZXJtaW5hdGlvbi1sb2ckIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJ3IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2V0Yy9ob3N0bmFtZSIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClob3N0bmFtZSQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicnciCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZXRjL3Jlc29sdi5jb25mIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KXJlc29sdi5jb25mJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJydyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi92YXIvcnVuL3NlY3JldHMva3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudCIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClzZXJ2aWNlYWNjb3VudCQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicm8iCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvdmFyL3J1bi9zZWNyZXRzL2F6dXJlL3Rva2VucyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeCl0b2tlbnMkIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9CiAgICAgICAgXSwKICAgICAgICAiQW5ub3RhdGlvbnMiOiB7CiAgICAgICAgICAiaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5idW5kbGVfcGF0aCI6ICIvcnVuL2NvbnRhaW5lcmQvaW8uY29udGFpbmVyZC5ydW50aW1lLnYyLnRhc2svazhzLmlvLyQoYnVuZGxlLWlkKSIsCiAgICAgICAgICAiaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5jb250YWluZXJfdHlwZSI6ICJwb2RfY29udGFpbmVyIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItbmFtZSI6ICJidXN5Ym94IiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSI6ICJjb250YWluZXIiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLmltYWdlLW5hbWUiOiAibWNyLm1pY3Jvc29mdC5jb20vYWtzL2UyZS9saWJyYXJ5LWJ1c3lib3g6bWFzdGVyLjIyMDMxNC4xLWxpbnV4LWFtZDY0IiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWlkIjogIl5bYS16MC05XXs2NH0kIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LW5hbWUiOiAiXmNtMSQiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZXNwYWNlIjogIiIKICAgICAgICB9LAogICAgICAgICJMaW51eCI6IHsKICAgICAgICAgICJOYW1lc3BhY2VzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgIlR5cGUiOiAiaXBjIiwKICAgICAgICAgICAgICAiUGF0aCI6ICIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiVHlwZSI6ICJ1dHMiLAogICAgICAgICAgICAgICJQYXRoIjogIiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJUeXBlIjogIm1vdW50IiwKICAgICAgICAgICAgICAiUGF0aCI6ICIiCiAgICAgICAgICAgIH0KICAgICAgICAgIF0sCiAgICAgICAgICAiTWFza2VkUGF0aHMiOiBbXSwKICAgICAgICAgICJSZWFkb25seVBhdGhzIjogW10sCiAgICAgICAgICAiRGV2aWNlcyI6IFtdLAogICAgICAgICAgIlN5c2N0bCI6IHsKICAgICAgICAgICAgIm5ldC5pcHY0LmlwX3VucHJpdmlsZWdlZF9wb3J0X3N0YXJ0IjogIjAiLAogICAgICAgICAgICAibmV0LmlwdjQucGluZ19ncm91cF9yYW5nZSI6ICIwIDIxNDc0ODM2NDciCiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9LAogICAgICAic3RvcmFnZXMiOiBbCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJibGsiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogInRhciIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIiQoaGFzaDApIgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGxheWVyMCkiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJibGsiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogInRhciIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIiQoaGFzaDEpIgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGxheWVyMSkiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJvdmVybGF5ZnMiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogImZ1c2UzLmthdGEtb3ZlcmxheSIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIjJjMzQyYTEzN2U2OTNjNzg5OGFlYzM2ZGExMDQ3ZjE5MWRjN2MxNjg3ZTY2MTk4YWRhY2M0MzljZjRhZGYzNzk6MjU3MGUzYTE5ZTFiZjIwZGRkYTQ1NDk4YTk2MjdmNjE1NTVkMmQ2YzAxNDc5YjliNzY0NjBiNjc5YjI3ZDU1MiIsCiAgICAgICAgICAgICI4NTY4YzcwYzBjY2ZlMDA1MTA5MmU4MThkYTc2OTExMWE1OTg4MmNkMTlkZDc5OWQzYmNhNWZmYTgyNzkxMDgwOmI2NDNiNjIxNzc0ODk4MzgzMGIyNmFjMTRhMzVhMzMyMmRkNTI4YzAwOTYzZWFhZGQ5MWVmNTVmNTEzZGM3M2YiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQoY3BhdGgpLyQoYnVuZGxlLWlkKSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfQogICAgICBdLAogICAgICAiZGV2aWNlcyI6IFtdLAogICAgICAic2FuZGJveF9waWRucyI6IGZhbHNlLAogICAgICAiZXhlY19jb21tYW5kcyI6IFtdLAogICAgICAiZW52X21hcCI6IHsKICAgICAgICAiQ09ORklHX01BUF9WQUxVRTEiOiAidmFsdWUxIiwKICAgICAgICAiSE9TVE5BTUUiOiAiJChob3N0LW5hbWUpIiwKICAgICAgICAiUEFUSCI6ICIvdXNyL2xvY2FsL3NiaW46L3Vzci9sb2NhbC9iaW46L3Vzci9zYmluOi91c3IvYmluOi9zYmluOi9iaW4iCiAgICAgIH0KICAgIH0KICBdLAogICJjb21tb24iOiB7CiAgICAiY3BhdGgiOiAiL3J1bi9rYXRhLWNvbnRhaW5lcnMvc2hhcmVkL2NvbnRhaW5lcnMiLAogICAgIm1vdW50X3NvdXJjZV9jcGF0aCI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zaGFyZWQvY29udGFpbmVycyIsCiAgICAic2ZwcmVmaXgiOiAiXiQoY3BhdGgpLyQoYnVuZGxlLWlkKS1bYS16MC05XXsxNn0tIiwKICAgICJzcGF0aCI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L3N0b3JhZ2UiLAogICAgImlwdjRfYSI6ICIoKFswLTldfFsxLTldWzAtOV18MVswLTldezJ9fDJbMC00XVswLTldfDI1WzAtNV0pXFwuKXszfShbMC05XXxbMS05XVswLTldfDFbMC05XXsyfXwyWzAtNF1bMC05XXwyNVswLTVdKSIsCiAgICAiaXBfcCI6ICJbMC05XXsxLDV9IiwKICAgICJzdmNfbmFtZSI6ICJbQS1aX1xcLlxcLV0rIiwKICAgICJkbnNfbGFiZWwiOiAiW2EtekEtWjAtOV9cXC5cXC1dKyIsCiAgICAic19zb3VyY2UxIjogIl4uLjJbMC05XXszfV9bMC0xXVswLTldX1swLTNdWzAtOV1fWzAtMl1bMC05XV9bMC01XVswLTldX1swLTVdWzAtOV1cXC5bMC05XXsxLDEwfSQiLAogICAgInNfc291cmNlMiI6ICJeLi5kYXRhLyIsCiAgICAiZG5zX3N1YmRvbWFpbiI6ICJeW2EtejAtOV0oWy1hLXowLTldKlthLXowLTldKT8kIiwKICAgICJwb2RfdWlkIjogIl5bMC05YS1mQS1GXXs4fS1bMC05YS1mQS1GXXs0fS1bMC05YS1mQS1GXXs0fS1bMC05YS1mQS1GXXs0fS1bMC05YS1mQS1GXXsxMn0kIiwKICAgICJkZWZhdWx0X2NhcHMiOiBbCiAgICAgICJDQVBfQ0hPV04iLAogICAgICAiQ0FQX0RBQ19PVkVSUklERSIsCiAgICAgICJDQVBfRlNFVElEIiwKICAgICAgIkNBUF9GT1dORVIiLAogICAgICAiQ0FQX01LTk9EIiwKICAgICAgIkNBUF9ORVRfUkFXIiwKICAgICAgIkNBUF9TRVRHSUQiLAogICAgICAiQ0FQX1NFVFVJRCIsCiAgICAgICJDQVBfU0VURkNBUCIsCiAgICAgICJDQVBfU0VUUENBUCIsCiAgICAgICJDQVBfTkVUX0JJTkRfU0VSVklDRSIsCiAgICAgICJDQVBfU1lTX0NIUk9PVCIsCiAgICAgICJDQVBfS0lMTCIsCiAgICAgICJDQVBfQVVESVRfV1JJVEUiCiAgICBdLAogICAgInByaXZpbGVnZWRfY2FwcyI6IFsKICAgICAgIkNBUF9DSE9XTiIsCiAgICAgICJDQVBfREFDX09WRVJSSURFIiwKICAgICAgIkNBUF9EQUNfUkVBRF9TRUFSQ0giLAogICAgICAiQ0FQX0ZPV05FUiIsCiAgICAgICJDQVBfRlNFVElEIiwKICAgICAgIkNBUF9LSUxMIiwKICAgICAgIkNBUF9TRVRHSUQiLAogICAgICAiQ0FQX1NFVFVJRCIsCiAgICAgICJDQVBfU0VUUENBUCIsCiAgICAgICJDQVBfTElOVVhfSU1NVVRBQkxFIiwKICAgICAgIkNBUF9ORVRfQklORF9TRVJWSUNFIiwKICAgICAgIkNBUF9ORVRfQlJPQURDQVNUIiwKICAgICAgIkNBUF9ORVRfQURNSU4iLAogICAgICAiQ0FQX05FVF9SQVciLAogICAgICAiQ0FQX0lQQ19MT0NLIiwKICAgICAgIkNBUF9JUENfT1dORVIiLAogICAgICAiQ0FQX1NZU19NT0RVTEUiLAogICAgICAiQ0FQX1NZU19SQVdJTyIsCiAgICAgICJDQVBfU1lTX0NIUk9PVCIsCiAgICAgICJDQVBfU1lTX1BUUkFDRSIsCiAgICAgICJDQVBfU1lTX1BBQ0NUIiwKICAgICAgIkNBUF9TWVNfQURNSU4iLAogICAgICAiQ0FQX1NZU19CT09UIiwKICAgICAgIkNBUF9TWVNfTklDRSIsCiAgICAgICJDQVBfU1lTX1JFU09VUkNFIiwKICAgICAgIkNBUF9TWVNfVElNRSIsCiAgICAgICJDQVBfU1lTX1RUWV9DT05GSUciLAogICAgICAiQ0FQX01LTk9EIiwKICAgICAgIkNBUF9MRUFTRSIsCiAgICAgICJDQVBfQVVESVRfV1JJVEUiLAogICAgICAiQ0FQX0FVRElUX0NPTlRST0wiLAogICAgICAiQ0FQX1NFVEZDQVAiLAogICAgICAiQ0FQX01BQ19PVkVSUklERSIsCiAgICAgICJDQVBfTUFDX0FETUlOIiwKICAgICAgIkNBUF9TWVNMT0ciLAogICAgICAiQ0FQX1dBS0VfQUxBUk0iLAogICAgICAiQ0FQX0JMT0NLX1NVU1BFTkQiLAogICAgICAiQ0FQX0FVRElUX1JFQUQiLAogICAgICAiQ0FQX1BFUkZNT04iLAogICAgICAiQ0FQX0JQRiIsCiAgICAgICJDQVBfQ0hFQ0tQT0lOVF9SRVNUT1JFIgogICAgXSwKICAgICJ2aXJ0aW9fYmxrX3N0b3JhZ2VfY2xhc3NlcyI6IFsKICAgICAgImNjLWxvY2FsLWNzaSIsCiAgICAgICJjYy1tYW5hZ2VkLWNzaSIsCiAgICAgICJjYy1tYW5hZ2VkLXByZW1pdW0tY3NpIgogICAgXSwKICAgICJzbWJfc3RvcmFnZV9jbGFzc2VzIjogWwogICAgICB7CiAgICAgICAgIm5hbWUiOiAiYXp1cmVmaWxlLWNzaS1rYXRhLWNjIiwKICAgICAgICAibW91bnRfb3B0aW9ucyI6IFsKICAgICAgICAgICJkaXJfbW9kZT0wNzc3IiwKICAgICAgICAgICJmaWxlX21vZGU9MDc3NyIsCiAgICAgICAgICAibWZzeW1saW5rcyIsCiAgICAgICAgICAiY2FjaGU9c3RyaWN0IiwKICAgICAgICAgICJub3NoYXJlc29jayIsCiAgICAgICAgICAiYWN0aW1lbz0zMCIsCiAgICAgICAgICAibm9icmwiCiAgICAgICAgXQogICAgICB9CiAgICBdCiAgfSwKICAic2FuZGJveCI6IHsKICAgICJzdG9yYWdlcyI6IFsKICAgICAgewogICAgICAgICJkcml2ZXIiOiAiZXBoZW1lcmFsIiwKICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAic291cmNlIjogInNobSIsCiAgICAgICAgImZzdHlwZSI6ICJ0bXBmcyIsCiAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgIm5vZGV2IiwKICAgICAgICAgICJtb2RlPTE3NzciLAogICAgICAgICAgInNpemU9NjcxMDg4NjQiCiAgICAgICAgXSwKICAgICAgICAibW91bnRfcG9pbnQiOiAiL3J1bi9rYXRhLWNvbnRhaW5lcnMvc2FuZGJveC9zaG0iLAogICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgfQogICAgXQogIH0sCiAgInJlcXVlc3RfZGVmYXVsdHMiOiB7CiAgICAiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdCI6IHsKICAgICAgImFsbG93X2Vudl9yZWdleCI6IFsKICAgICAgICAiXkhPU1ROQU1FPSQoZG5zX2xhYmVsKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfUE9SVF8kKGlwX3ApX1RDUD10Y3A6Ly8kKGlwdjRfYSk6JChpcF9wKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfUE9SVF8kKGlwX3ApX1RDUF9QUk9UTz10Y3AkIiwKICAgICAgICAiXiQoc3ZjX25hbWUpX1BPUlRfJChpcF9wKV9UQ1BfUE9SVD0kKGlwX3ApJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9QT1JUXyQoaXBfcClfVENQX0FERFI9JChpcHY0X2EpJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9TRVJWSUNFX0hPU1Q9JChpcHY0X2EpJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9TRVJWSUNFX1BPUlQ9JChpcF9wKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfU0VSVklDRV9QT1JUXyQoZG5zX2xhYmVsKT0kKGlwX3ApJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9QT1JUPXRjcDovLyQoaXB2NF9hKTokKGlwX3ApJCIsCiAgICAgICAgIl5BWlVSRV9DTElFTlRfSUQ9W0EtRmEtZjAtOS1dKiQiLAogICAgICAgICJeQVpVUkVfVEVOQU5UX0lEPVtBLUZhLWYwLTktXSokIiwKICAgICAgICAiXkFaVVJFX0ZFREVSQVRFRF9UT0tFTl9GSUxFPS92YXIvcnVuL3NlY3JldHMvYXp1cmUvdG9rZW5zL2F6dXJlLWlkZW50aXR5LXRva2VuJCIsCiAgICAgICAgIl5BWlVSRV9BVVRIT1JJVFlfSE9TVD1odHRwczovL2xvZ2luXFwubWljcm9zb2Z0b25saW5lXFwuY29tLyQiLAogICAgICAgICJeVEVSTT14dGVybSQiCiAgICAgIF0sCiAgICAgICJhbGxvd19lbnZfcmVnZXhfbWFwIjogewogICAgICAgICJDUFVfTElNSVQiOiAiXlswLTldKyQiLAogICAgICAgICJKT0JfQ09NUExFVElPTl9JTkRFWCI6ICJeWzAtOV0qJCIsCiAgICAgICAgIk1FTU9SWV9MSU1JVCI6ICJeWzAtOV0rJCIKICAgICAgfQogICAgfSwKICAgICJDb3B5RmlsZVJlcXVlc3QiOiBbCiAgICAgICIkKHNmcHJlZml4KSIKICAgIF0sCiAgICAiRXhlY1Byb2Nlc3NSZXF1ZXN0IjogewogICAgICAiYWxsb3dlZF9jb21tYW5kcyI6IFtdLAogICAgICAicmVnZXgiOiBbXQogICAgfSwKICAgICJVcGRhdGVSb3V0ZXNSZXF1ZXN0IjogewogICAgICAiZm9yYmlkZGVuX2RldmljZV9uYW1lcyI6IFsKICAgICAgICAibG8iCiAgICAgIF0sCiAgICAgICJmb3JiaWRkZW5fc291cmNlX3JlZ2V4IjogWwogICAgICAgICJeKD86MHswLDR9Oil7MCw3fTB7MCwzfTEkIiwKICAgICAgICAiXjEyN1xcLig/OlswLTldezEsM31cXC4pezJ9WzAtOV17MSwzfSQiCiAgICAgIF0KICAgIH0sCiAgICAiVXBkYXRlSW50ZXJmYWNlUmVxdWVzdCI6IHsKICAgICAgImFsbG93X3Jhd19mbGFncyI6IDEyOCwKICAgICAgImZvcmJpZGRlbl9uYW1lcyI6IFsKICAgICAgICAibG8iCiAgICAgIF0sCiAgICAgICJmb3JiaWRkZW5faHdfYWRkcnMiOiBbCiAgICAgICAgIjAwOjAwOjAwOjAwOjAwOjAwIgogICAgICBdCiAgICB9LAogICAgIkNsb3NlU3RkaW5SZXF1ZXN0IjogZmFsc2UsCiAgICAiUmVhZFN0cmVhbVJlcXVlc3QiOiBmYWxzZSwKICAgICJVcGRhdGVFcGhlbWVyYWxNb3VudHNSZXF1ZXN0IjogZmFsc2UsCiAgICAiV3JpdGVTdHJlYW1SZXF1ZXN0IjogZmFsc2UKICB9Cn0= +spec: + restartPolicy: Never + runtimeClassName: kata-cc + securityContext: + runAsUser: 2000 + containers: + - name: busybox + image: "mcr.microsoft.com/aks/e2e/library-busybox:master.220314.1-linux-amd64" + securityContext: + privileged: true + env: + - name: CONFIG_MAP_VALUE1 + valueFrom: + configMapKeyRef: + key: simple_value1 + name: config-map1 + command: + - /bin/sh + args: + - "-c" + - while true; do echo hello; sleep 10; done diff --git a/src/agent/samples/policy/yaml/configmap/pod-cm2.yaml b/src/agent/samples/policy/yaml/configmap/pod-cm2.yaml new file mode 100644 index 000000000000..6058320c72c8 --- /dev/null +++ b/src/agent/samples/policy/yaml/configmap/pod-cm2.yaml @@ -0,0 +1,69 @@ +--- +apiVersion: v1 +kind: ConfigMap +metadata: + name: config-map2 +data: + file1.json: "{key1: value1, key2: value2, key123: value123, 321key: value321}\n" +--- +apiVersion: v1 +kind: ConfigMap +metadata: + name: ro-config-map2 +data: + file1.json: "{key1: foo}" +--- +apiVersion: v1 +kind: Pod +metadata: + name: cm2 + annotations: + io.katacontainers.config.agent.policy: IyBDb3B5cmlnaHQgKGMpIDIwMjMgTWljcm9zb2Z0IENvcnBvcmF0aW9uCiMKIyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMAojCnBhY2thZ2UgYWdlbnRfcG9saWN5CgppbXBvcnQgZnV0dXJlLmtleXdvcmRzLmluCmltcG9ydCBmdXR1cmUua2V5d29yZHMuZXZlcnkKCiMgRGVmYXVsdCB2YWx1ZXMsIHJldHVybmVkIGJ5IE9QQSB3aGVuIHJ1bGVzIGNhbm5vdCBiZSBldmFsdWF0ZWQgdG8gdHJ1ZS4KZGVmYXVsdCBBZGRBUlBOZWlnaGJvcnNSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgQWRkU3dhcFJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBDbG9zZVN0ZGluUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IENvcHlGaWxlUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IENyZWF0ZUNvbnRhaW5lclJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBDcmVhdGVTYW5kYm94UmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IERlc3Ryb3lTYW5kYm94UmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgRXhlY1Byb2Nlc3NSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgR2V0T09NRXZlbnRSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBHdWVzdERldGFpbHNSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBMaXN0SW50ZXJmYWNlc1JlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBMaXN0Um91dGVzUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IE1lbUhvdHBsdWdCeVByb2JlUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IE9ubGluZUNQVU1lbVJlcXVlc3QgOj0gdHJ1ZQpkZWZhdWx0IFBhdXNlQ29udGFpbmVyUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFJlYWRTdHJlYW1SZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgUmVtb3ZlQ29udGFpbmVyUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgUmVtb3ZlU3RhbGVWaXJ0aW9mc1NoYXJlTW91bnRzUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgUmVzZWVkUmFuZG9tRGV2UmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFJlc3VtZUNvbnRhaW5lclJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBTZXRHdWVzdERhdGVUaW1lUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFNldFBvbGljeVJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBTaWduYWxQcm9jZXNzUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgU3RhcnRDb250YWluZXJSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBTdGFydFRyYWNpbmdSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgU3RhdHNDb250YWluZXJSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBTdG9wVHJhY2luZ1JlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBUdHlXaW5SZXNpemVSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBVcGRhdGVDb250YWluZXJSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgVXBkYXRlRXBoZW1lcmFsTW91bnRzUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFVwZGF0ZUludGVyZmFjZVJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBVcGRhdGVSb3V0ZXNSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgV2FpdFByb2Nlc3NSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBXcml0ZVN0cmVhbVJlcXVlc3QgOj0gZmFsc2UKCiMgQWxsb3dSZXF1ZXN0c0ZhaWxpbmdQb2xpY3kgOj0gdHJ1ZSBjb25maWd1cmVzIHRoZSBBZ2VudCB0byAqYWxsb3cgYW55CiMgcmVxdWVzdHMgY2F1c2luZyBhIHBvbGljeSBmYWlsdXJlKi4gVGhpcyBpcyBhbiB1bnNlY3VyZSBjb25maWd1cmF0aW9uCiMgYnV0IGlzIHVzZWZ1bCBmb3IgYWxsb3dpbmcgdW5zZWN1cmUgcG9kcyB0byBzdGFydCwgdGhlbiBjb25uZWN0IHRvCiMgdGhlbSBhbmQgaW5zcGVjdCBPUEEgbG9ncyBmb3IgdGhlIHJvb3QgY2F1c2Ugb2YgYSBmYWlsdXJlLgpkZWZhdWx0IEFsbG93UmVxdWVzdHNGYWlsaW5nUG9saWN5IDo9IGZhbHNlCgojIENvbnN0YW50cwpTX05BTUVfS0VZID0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZSIKU19OQU1FU1BBQ0VfS0VZID0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZXNwYWNlIgpCVU5ETEVfSUQgPSAiW2EtejAtOV17NjR9IgoKQ3JlYXRlQ29udGFpbmVyUmVxdWVzdDo9IHJlc3AgewogICAgbm90IGlzX251bGwoaW5wdXQuZW52X21hcCkKICAgIAogICAgaV9lbnZfbWFwIDo9IGlucHV0LmVudl9tYXAKICAgIAogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBwX2Vudl9tYXAgOj0gcF9jb250YWluZXIuZW52X21hcCAgCiAgICBhbGxvd19lbnZfbWFwKHBfZW52X21hcCwgaV9lbnZfbWFwKQogICAgCiAgICBpX3Byb2Nlc3MgOj0gaW5wdXQuYmFzZS5PQ0kuUHJvY2VzcwogICAgCiAgICBwX3Byb2Nlc3MgOj0gcF9jb250YWluZXIuT0NJLlByb2Nlc3MKICAgIAogICAgYWxsb3dfYXJncyhpX3Byb2Nlc3MsIHBfcHJvY2VzcywgaV9lbnZfbWFwKQoKICAgIHJlc3AgPSBDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uKGlucHV0LmJhc2UpCiAgICBwcmludCgiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdDogdHJ1ZSIpCn0KCmFsbG93X2FyZ3MoaV9wcm9jZXNzLCBwX3Byb2Nlc3MsIGlfZW52X21hcCkgewogICAgaV9hcmdzIDo9IGlfcHJvY2Vzcy5BcmdzCiAgICBwX2FyZ3MgOj0gcF9wcm9jZXNzLkFyZ3MKICAgIHByaW50KCJhbGxvd19hcmdzOiBpX2FyZ3MgPSIsIGlfYXJncywgInBfYXJncyA9IiwgcF9hcmdzKQogICAgY291bnQoaV9hcmdzKSA9PSBjb3VudChwX2FyZ3MpCiAgICBldmVyeSBpLCBpX2FyZyBpbiBpX2FyZ3MgewogICAgICAgIHByaW50KCJhbGxvd19hcmdzOiBpX2FyZyA9IiwgaV9hcmcpCiAgICAgICAgcF9hcmdfcmVwbGFjZWQgOj0gcmVwbGFjZV9lbnZfdmFyaWFibGVzKHBfYXJnc1tpXSwgaV9lbnZfbWFwKQogICAgICAgIHByaW50KCJhbGxvd19hcmdzOiBwX2FyZ19yZXBsYWNlZCA9IiwgcF9hcmdfcmVwbGFjZWQpCiAgICAgICAgcF9hcmdfcmVwbGFjZWQyIDo9IHJlcGxhY2UocF9hcmdfcmVwbGFjZWQsICIkJCIsICIkIikKICAgICAgICBwcmludCgiYWxsb3dfYXJnczogcF9hcmdfcmVwbGFjZWQyID0iLCBwX2FyZ19yZXBsYWNlZDIpCiAgICAgICAgaV9hcmcgPT0gcF9hcmdfcmVwbGFjZWQyCiAgICB9CiAgICBwcmludCgiYWxsb3dfYXJnczogdHJ1ZSIpCn0KCmFsbG93X2FyZ3MoaV9wcm9jZXNzLCBwX3Byb2Nlc3MsIGlfZW52X21hcCkgewogICAgbm90IGlfcHJvY2Vzcy5BcmdzCiAgICBub3QgcF9wcm9jZXNzLkFyZ3MKICAgIHByaW50KCJhbGxvd19hcmdzMjogbm8gYXJncyIpCn0KCiMgdGhpcyBmdW5jdGlvbiByZXBsYWNlcyBhbGwgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyBpbiBhIHN0cmluZywgZ2l2ZW4gYSBtYXAgb2YgZW52aXJvbm1lbnQga2V5cyB0byBlbnZpcm9ubWVudCB2YWx1ZXMKIyBlZyBzdHIgPSAiZWNobyAkKENMVVNURVJfSUQpOyBlY2hvICQoTk9ERV9OQU1FKTsiCiMgZW52X21hcCA9IHsiQ0xVU1RFUl9JRCI6ICJhYmMiLCAiTk9ERV9OQU1FIiA6ICJ4eXoifQojIHJlc3VsdCA9ICJlY2hvIGFiYzsgZWNobyB4eXo7IgpyZXBsYWNlX2Vudl92YXJpYWJsZXMoc3RyLCBlbnZfbWFwKSA9IHJlc3VsdCB7CiAgICAjIG1ha2UgYW4gYXJyYXkgb2YgdGhlIGtleXMgZWcgWyJDTFVTVEVSX0lEIiwgIk5PREVfTkFNRSJdCiAgICBrZXlzIDo9IFt4IHwgc29tZSB4IGluIG9iamVjdC5rZXlzKGVudl9tYXApXQogICAgcmVzdWx0IDo9IHJlcGxhY2Vfc3RyX3JlYyhzdHIsIGVudl9tYXAsIGtleXMsIGNvdW50KGtleXMpIC0gMSkKfQoKIyBiYXNlIGNhc2UKcmVwbGFjZV9zdHJfcmVjKHN0ciwgZW52X21hcCwgYXJyX2tleXMsIGkpID0gcmVzdWx0IHsKICAgIGkgPCAwCiAgICByZXN1bHQgOj0gc3RyCn0KCiMgcmVjdXJzaXZlIHN0ZXAKcmVwbGFjZV9zdHJfcmVjKHN0ciwgZW52X21hcCwgYXJyX2tleXMsIGkpID0gcmVzdWx0IHsKICAgIGkgPj0gMAogICAga2V5IDo9IGFycl9rZXlzW2ldCiAgICBlbnZfa2V5MSA6PSBjb25jYXQoIiIsIFsiJCgiLCBrZXksICIpIl0pCiAgICAjIHJlcGxhY2UgJChWQVIpIHdpdGggdmFsdWUKICAgIG5ld19zdHIxIDo9IHJlcGxhY2Uoc3RyLCBlbnZfa2V5MSwgZW52X21hcFtrZXldKQogICAgIyByZXBsYWNlIG5leHQgZW52aXJvbm1lbnQgdmFyaWFibGUKICAgIHJlc3VsdCA9IHJlcGxhY2Vfc3RyX3JlYyhuZXdfc3RyMSwgZW52X21hcCwgYXJyX2tleXMsIGkgLSAxKQp9CgphbGxvd19lbnZfbWFwKHBfZW52X21hcCwgaV9lbnZfbWFwKSB7CiAgICBwcmludCgiYWxsb3dfZW52X21hcDogcF9lbnZfbWFwID0iLCBwX2Vudl9tYXApCiAgICBldmVyeSBlbnZfa2V5LCBlbnZfdmFsIGluIGlfZW52X21hcCB7CiAgICAgICAgcHJpbnQoImFsbG93X2VudjogZW52X2tleSA9IiwgZW52X2tleSwgImVudl92YWwgPSIsIGVudl92YWwpCiAgICAgICAgYWxsb3dfZW52X21hcF9lbnRyeShlbnZfa2V5LCBlbnZfdmFsLCBwX2Vudl9tYXApCiAgICB9CiAgICBwcmludCgiYWxsb3dfZW52X21hcDogdHJ1ZSIpCn0KCiMgQWxsb3cgZXhhY3QgbWF0Y2gKYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBpX3ZhbCA9PSBwX3ZhbAogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnk6IHRydWUiKQp9CgojIEFsbG93IHJlc291cmNlRmllbGRSZWYgdmFsdWVzIChlLmcuLCAibGltaXRzLmNwdSIpLgphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgICMgYSB2YXJpYWJsZSB3ZSBzaG91bGQgYmUgdmFsaWRhdGluZyB1c2luZyBhIHJlZ2V4IGZyb20gc2V0dGluZ3MKICAgIHBfdmFsID09ICIkKHZhbGlkYXRlLWZyb20tc2V0dGluZ3MpIgogICAgcmVnZXhfdmFsIDo9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuQ3JlYXRlQ29udGFpbmVyUmVxdWVzdC5hbGxvd19lbnZfcmVnZXhfbWFwW2tleV0KICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4X3ZhbCwgaV92YWwpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSAyOiB0cnVlIikKfQoKIyBBbGxvdyBub2RlLW5hbWUKYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChub2RlLW5hbWUpIgogICAgcmVnZXgubWF0Y2gocG9saWN5X2RhdGEuY29tbW9uLmRuc19zdWJkb21haW4gLCBpX3ZhbCkKICAgIHByaW50KCJhbGxvd19lbnZfbWFwX2VudHJ5IDM6IHRydWUiKQp9CgojIEFsbG93IGhvc3QtbmFtZQphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgIHBfdmFsID09ICIkKGhvc3QtbmFtZSkiCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24uZG5zX2xhYmVsICwgaV92YWwpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSA0OiB0cnVlIikKfQoKIyBBbGxvdyBwb2QtdWlkCmFsbG93X2Vudl9tYXBfZW50cnkoa2V5LCBpX3ZhbCwgcF9lbnZfbWFwKSB7CiAgICBwX3ZhbCA6PSBwX2Vudl9tYXBba2V5XQogICAgcF92YWwgPT0gIiQocG9kLXVpZCkiCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24ucG9kX3VpZCAsIGlfdmFsKQogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgNTogdHJ1ZSIpCn0KCiMgQWxsb3cgZmllbGRSZWYgImZpZWxkUGF0aDogc3RhdHVzLnBvZElQIiB2YWx1ZXMuCmFsbG93X2Vudl9tYXBfZW50cnkoa2V5LCBpX3ZhbCwgcF9lbnZfbWFwKSB7CiAgICBpc19pcChpX3ZhbCkKCiAgICBwX3ZhbCA6PSBwX2Vudl9tYXBba2V5XQogICAgcF92YXIgOj0gY29uY2F0KCI9IiwgW2tleSwgcF92YWxdKQogICAgYWxsb3dfcG9kX2lwX3ZhcihrZXksIHBfdmFyKQogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgNjogdHJ1ZSIpCn0KCiMgQWxsb3cgZmllbGRSZWYgImZpZWxkUGF0aDogc3RhdHVzLmhvc3RJUCIgdmFsdWVzLgphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgaXNfaXAoaV92YWwpCgogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgIHBfdmFyIDo9IGNvbmNhdCgiPSIsIFtrZXksIHBfdmFsXSkKICAgIGFsbG93X2hvc3RfaXBfdmFyKGtleSwgcF92YXIpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSA3OiB0cnVlIikKfQoKIyBNYXRjaCBpbnB1dCB3aXRoIG9uZSBvZiB0aGUgcG9saWN5IHZhcmlhYmxlcywgYWZ0ZXIgc3Vic3RpdHV0aW5nICQoc2FuZGJveC1uYW1lKS4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChzYW5kYm94LW5hbWUpIgogICAgc19uYW1lIDo9IGlucHV0LmJhc2UuT0NJLkFubm90YXRpb25zW1NfTkFNRV9LRVldCiAgICBwX3ZhcjIgOj0gcmVwbGFjZShwX3ZhbCwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHBfdmFyMiA9PSBpX3ZhbAogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgODogdHJ1ZSIpCn0KCiMgTWF0Y2ggaW5wdXQgd2l0aCBvbmUgb2YgdGhlIHBvbGljeSB2YXJpYWJsZXMsIGFmdGVyIHN1YnN0aXR1dGluZyAkKHNhbmRib3gtbmFtZXNwYWNlKS4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChzYW5kYm94LW5hbWVzcGFjZSkiCiAgICBzX25hbWVzcGFjZSA6PSBpbnB1dC5iYXNlLk9DSS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwX3ZhcjIgOj0gcmVwbGFjZShwX3ZhbCwgIiQoc2FuZGJveC1uYW1lc3BhY2UpIiwgc19uYW1lc3BhY2UpCiAgICBwX3ZhcjIgPT0gaV92YWwKICAgIHByaW50KCJhbGxvd19lbnZfbWFwX2VudHJ5IDk6IHRydWUiKQp9CgojIEFsbG93IGlucHV0IGVudiB2YXJpYWJsZXMgdGhhdCBtYXRjaCB3aXRoIGEgcmVxdWVzdF9kZWZhdWx0cyByZWdleC4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHNvbWUgcF9yZWdleDEgaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5DcmVhdGVDb250YWluZXJSZXF1ZXN0LmFsbG93X2Vudl9yZWdleAogICAgcF9yZWdleDIgOj0gcmVwbGFjZShwX3JlZ2V4MSwgIiQoaXB2NF9hKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcHY0X2EpCiAgICBwX3JlZ2V4MyA6PSByZXBsYWNlKHBfcmVnZXgyLCAiJChpcF9wKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcF9wKQogICAgcF9yZWdleDQgOj0gcmVwbGFjZShwX3JlZ2V4MywgIiQoc3ZjX25hbWUpIiwgcG9saWN5X2RhdGEuY29tbW9uLnN2Y19uYW1lKQogICAgcF9yZWdleDUgOj0gcmVwbGFjZShwX3JlZ2V4NCwgIiQoZG5zX2xhYmVsKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5kbnNfbGFiZWwpCgogICAgcmVzdWx0IDo9IGNvbmNhdCgiPSIsIFtrZXksIGlfdmFsXSkKICAgIHJlZ2V4Lm1hdGNoKHBfcmVnZXg1LCByZXN1bHQpCgogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgMTA6IHRydWUiKQp9CgpDcmVhdGVDb250YWluZXJSZXF1ZXN0Oj0gcmVzcCB7CiAgICBub3QgaW5wdXQuZW52X21hcAogICAgaV9wcm9jZXNzID0gaW5wdXQuT0NJLlByb2Nlc3MKICAgIHNfbmFtZSA9IGlucHV0Lk9DSS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBwX3Byb2Nlc3MgPSBwX2NvbnRhaW5lci5PQ0kuUHJvY2VzcwogICAgYWxsb3dfZGVwcmVjYXRlZF9hcmdzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUpCiAgICByZXNwID0gQ3JlYXRlQ29udGFpbmVyUmVxdWVzdENvbW1vbihpbnB1dCkKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0MjogdHJ1ZSIpCn0KCkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb24ocmVxKTo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgICMgQ2hlY2sgaWYgdGhlIGlucHV0IHJlcXVlc3Qgc2hvdWxkIGJlIHJlamVjdGVkIGV2ZW4gYmVmb3JlIGNoZWNraW5nIHRoZQogICAgIyBwb2xpY3lfZGF0YS5jb250YWluZXJzIGluZm9ybWF0aW9uLgogICAgYWxsb3dfY3JlYXRlX2NvbnRhaW5lcl9pbnB1dChyZXEpCgogICAgaV9vY2kgOj0gcmVxLk9DSQogICAgaV9zdG9yYWdlcyA6PSByZXEuc3RvcmFnZXMKICAgIGlfZGV2aWNlcyA6PSByZXEuZGV2aWNlcwoKICAgICMgYXJyYXkgb2YgcG9zc2libGUgc3RhdGUgb3BlcmF0aW9ucwogICAgb3BzX2J1aWxkZXIgOj0gW10KCiAgICAjIGNoZWNrIHNhbmRib3ggbmFtZQogICAgc2FuZGJveF9uYW1lID0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FX0tFWV0KICAgIGFkZF9zYW5kYm94X25hbWVfdG9fc3RhdGUgOj0gc3RhdGVfYWxsb3dzKCJzYW5kYm94X25hbWUiLCBzYW5kYm94X25hbWUpCiAgICBvcHNfYnVpbGRlcjEgOj0gY29uY2F0X29wX2lmX25vdF9udWxsKG9wc19idWlsZGVyLCBhZGRfc2FuZGJveF9uYW1lX3RvX3N0YXRlKQoKICAgICMgQ2hlY2sgaWYgYW55IGVsZW1lbnQgZnJvbSB0aGUgcG9saWN5X2RhdGEuY29udGFpbmVycyBhcnJheSBhbGxvd3MgdGhlIGlucHV0IHJlcXVlc3QuCiAgICBzb21lIHBfY29udGFpbmVyIGluIHBvbGljeV9kYXRhLmNvbnRhaW5lcnMKICAgIHByaW50KCI9PT09PT09PSBDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiB0cnlpbmcgbmV4dCBwb2xpY3kgY29udGFpbmVyIikKCiAgICBwX3BpZG5zIDo9IHBfY29udGFpbmVyLnNhbmRib3hfcGlkbnMKICAgIGlfcGlkbnMgOj0gcmVxLnNhbmRib3hfcGlkbnMKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiBwX3BpZG5zID0iLCBwX3BpZG5zLCAiaV9waWRucyA9IiwgaV9waWRucykKICAgIHBfcGlkbnMgPT0gaV9waWRucwoKICAgIHBfb2NpIDo9IHBfY29udGFpbmVyLk9DSQoKICAgICMgY2hlY2sgbmFtZXNwYWNlCiAgICBwX25hbWVzcGFjZSA6PSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBpX25hbWVzcGFjZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwcmludCAoIkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb246IHBfbmFtZXNwYWNlID0iLCBwX25hbWVzcGFjZSwgImlfbmFtZXNwYWNlID0iLCBpX25hbWVzcGFjZSkKICAgIGFkZF9uYW1lc3BhY2VfdG9fc3RhdGUgOj0gYWxsb3dfbmFtZXNwYWNlKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkKICAgIG9wc19idWlsZGVyMiA6PSBjb25jYXRfb3BfaWZfbm90X251bGwob3BzX2J1aWxkZXIxLCBhZGRfbmFtZXNwYWNlX3RvX3N0YXRlKQoKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiBwIFZlcnNpb24gPSIsIHBfb2NpLlZlcnNpb24sICJpIFZlcnNpb24gPSIsIGlfb2NpLlZlcnNpb24pCiAgICBwX29jaS5WZXJzaW9uID09IGlfb2NpLlZlcnNpb24KCiAgICBwcmludCgiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdENvbW1vbjogcCBSZWFkb25seSA9IiwgcF9vY2kuUm9vdC5SZWFkb25seSwgImkgUmVhZG9ubHkgPSIsIGlfb2NpLlJvb3QuUmVhZG9ubHkpCiAgICBwX29jaS5Sb290LlJlYWRvbmx5ID09IGlfb2NpLlJvb3QuUmVhZG9ubHkKCiAgICBhbGxvd19hbm5vKHBfb2NpLCBpX29jaSkKCiAgICBwX3N0b3JhZ2VzIDo9IHBfY29udGFpbmVyLnN0b3JhZ2VzCiAgICBhbGxvd19ieV9hbm5vKHBfb2NpLCBpX29jaSwgcF9zdG9yYWdlcywgaV9zdG9yYWdlcykKCiAgICBwX2RldmljZXMgOj0gcF9jb250YWluZXIuZGV2aWNlcwogICAgYWxsb3dfZGV2aWNlcyhwX2RldmljZXMsIGlfZGV2aWNlcykKCiAgICByZXQgOj0gYWxsb3dfbGludXgob3BzX2J1aWxkZXIyLCBwX29jaSwgaV9vY2kpCiAgICByZXQuYWxsb3dlZAoKICAgIG9wcyA6PSByZXQub3BzCgogICAgcHJpbnQoIkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb246IHRydWUiKQp9CgphbGxvd19jcmVhdGVfY29udGFpbmVyX2lucHV0KHJlcSkgewogICAgcHJpbnQoImFsbG93X2NyZWF0ZV9jb250YWluZXJfaW5wdXQ6IGlucHV0ID0iLCByZXEpCgogICAgY291bnQocmVxLnNoYXJlZF9tb3VudHMpID09IDAKICAgIGlzX251bGwocmVxLnN0cmluZ191c2VyKQoKICAgIGlfb2NpIDo9IHJlcS5PQ0kKICAgIGlzX251bGwoaV9vY2kuSG9va3MpCiAgICBpc19udWxsKGlfb2NpLlNvbGFyaXMpCiAgICBpc19udWxsKGlfb2NpLldpbmRvd3MpCgogICAgaV9saW51eCA6PSBpX29jaS5MaW51eAogICAgY291bnQoaV9saW51eC5HSURNYXBwaW5ncykgPT0gMAogICAgY291bnQoaV9saW51eC5Nb3VudExhYmVsKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlJlc291cmNlcy5EZXZpY2VzKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlJvb3Rmc1Byb3BhZ2F0aW9uKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlVJRE1hcHBpbmdzKSA9PSAwCiAgICBpc19udWxsKGlfbGludXguSW50ZWxSZHQpCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLkJsb2NrSU8pCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLk5ldHdvcmspCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLlBpZHMpCiAgICBpc19udWxsKGlfbGludXguU2VjY29tcCkKCiAgICBpX3Byb2Nlc3MgOj0gaV9vY2kuUHJvY2VzcwogICAgY291bnQoaV9wcm9jZXNzLlNlbGludXhMYWJlbCkgPT0gMAogICAgY291bnQoaV9wcm9jZXNzLlVzZXIuVXNlcm5hbWUpID09IDAKCiAgICBwcmludCgiYWxsb3dfY3JlYXRlX2NvbnRhaW5lcl9pbnB1dDogdHJ1ZSIpCn0KCmFsbG93X25hbWVzcGFjZShwX25hbWVzcGFjZSwgaV9uYW1lc3BhY2UpID0gYWRkX25hbWVzcGFjZSB7CiAgICBwX25hbWVzcGFjZSA9PSBpX25hbWVzcGFjZQogICAgYWRkX25hbWVzcGFjZSA6PSBudWxsCiAgICBwcmludCgiYWxsb3dfbmFtZXNwYWNlIDE6IGlucHV0IG5hbWVzcGFjZSBtYXRjaGVzIHBvbGljeSBkYXRhIikKfQoKYWxsb3dfbmFtZXNwYWNlKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkgPSBhZGRfbmFtZXNwYWNlIHsKICAgIHBfbmFtZXNwYWNlID09ICIiCiAgICBwcmludCgiYWxsb3dfbmFtZXNwYWNlIDI6IG5vIG5hbWVzcGFjZSBmb3VuZCBvbiBwb2xpY3kgZGF0YSIpCiAgICBhZGRfbmFtZXNwYWNlIDo9IHN0YXRlX2FsbG93cygibmFtZXNwYWNlIiwgaV9uYW1lc3BhY2UpCn0KCiMgdmFsdWUgaGFzbid0IGJlZW4gc2VlbiBiZWZvcmUsIHNhdmUgaXQgdG8gc3RhdGUKc3RhdGVfYWxsb3dzKGtleSwgdmFsdWUpID0gYWN0aW9uIHsKICBzdGF0ZSA6PSBnZXRfc3RhdGUoKQogIHByaW50KCJzdGF0ZV9hbGxvd3MgMTogc3RhdGVba2V5XSA9Iiwgc3RhdGVba2V5XSwgInZhbHVlID0iLCB2YWx1ZSkKICBub3Qgc3RhdGVba2V5XQogIHByaW50KCJzdGF0ZV9hbGxvd3MgMTogc2F2aW5nIHRvIHN0YXRlIGtleSA9Iiwga2V5LCAidmFsdWUgPSIsIHZhbHVlKQogIHBhdGggOj0gZ2V0X3N0YXRlX3BhdGgoa2V5KSAKICBhY3Rpb24gOj0gewogICAgIm9wIjogImFkZCIsCiAgICAicGF0aCI6IHBhdGgsIAogICAgInZhbHVlIjogdmFsdWUsCiAgfQp9CgojIHZhbHVlIG1hdGNoZXMgd2hhdCdzIGluIHN0YXRlLCBhbGxvdyBpdApzdGF0ZV9hbGxvd3Moa2V5LCB2YWx1ZSkgPSBhY3Rpb24gewogIHByaW50KCJzdGF0ZV9hbGxvd3MgMjogc3RhcnQiKQogIHN0YXRlIDo9IGdldF9zdGF0ZSgpCiAgcHJpbnQoInN0YXRlX2FsbG93cyAyOiBzdGF0ZVtrZXldID0iLCBzdGF0ZVtrZXldLCAidmFsdWUgPSIsIHZhbHVlKQogIHZhbHVlID09IHN0YXRlW2tleV0KICBwcmludCgic3RhdGVfYWxsb3dzIDI6IGZvdW5kIGtleSA9Iiwga2V5LCAidmFsdWUgPSIsIHZhbHVlLCAiIGluIHN0YXRlIikKICBhY3Rpb24gOj0gbnVsbAp9CgojIGhlbHBlciBmdW5jdGlvbnMgdG8gaW50ZXJhY3Qgd2l0aCB0aGUgc3RhdGUKZ2V0X3N0YXRlKCkgPSBzdGF0ZSB7CiAgc3RhdGUgOj0gZGF0YVsicHN0YXRlIl0KfQoKZ2V0X3N0YXRlX3ZhbChrZXkpID0gdmFsdWUgewogICAgc3RhdGUgOj0gZ2V0X3N0YXRlKCkKICAgIHZhbHVlIDo9IHN0YXRlW2tleV0KfQoKZ2V0X3N0YXRlX3BhdGgoa2V5KSA9IHBhdGggewogICAgIyBwcmVwZW5kICIvcHN0YXRlLyIgdG8ga2V5CiAgICBwYXRoIDo9IGNvbmNhdCgiLyIsIFsiL3BzdGF0ZSIsIGtleV0pCn0KCiMgSGVscGVyIGZ1bmN0aW9ucyB0byBjb25kaXRpb25hbGx5IGNvbmNhdGVuYXRlIG9wIGlzIG5vdCBudWxsCmNvbmNhdF9vcF9pZl9ub3RfbnVsbChvcHMsIG9wKSA9IHJlc3VsdCB7CiAgICBvcCA9PSBudWxsCiAgICByZXN1bHQgOj0gb3BzCn0KCmNvbmNhdF9vcF9pZl9ub3RfbnVsbChvcHMsIG9wKSA9IHJlc3VsdCB7CiAgICBvcCAhPSBudWxsCiAgICByZXN1bHQgOj0gYXJyYXkuY29uY2F0KG9wcywgW29wXSkKfQoKIyBSZWplY3QgdW5leHBlY3RlZCBhbm5vdGF0aW9ucy4KYWxsb3dfYW5ubyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19hbm5vIDE6IHN0YXJ0IikKCiAgICBub3QgaV9vY2kuQW5ub3RhdGlvbnMKCiAgICBwcmludCgiYWxsb3dfYW5ubyAxOiB0cnVlIikKfQphbGxvd19hbm5vKHBfb2NpLCBpX29jaSkgewogICAgcHJpbnQoImFsbG93X2Fubm8gMjogcCBBbm5vdGF0aW9ucyA9IiwgcF9vY2kuQW5ub3RhdGlvbnMpCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiBpIEFubm90YXRpb25zID0iLCBpX29jaS5Bbm5vdGF0aW9ucykKCiAgICBpX2tleXMgOj0gb2JqZWN0LmtleXMoaV9vY2kuQW5ub3RhdGlvbnMpCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiBpIGtleXMgPSIsIGlfa2V5cykKCiAgICBldmVyeSBpX2tleSBpbiBpX2tleXMgewogICAgICAgIGFsbG93X2Fubm9fa2V5KGlfa2V5LCBwX29jaSkKICAgIH0KCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiB0cnVlIikKfQoKYWxsb3dfYW5ub19rZXkoaV9rZXksIHBfb2NpKSB7CiAgICBwcmludCgiYWxsb3dfYW5ub19rZXkgMTogaSBrZXkgPSIsIGlfa2V5KQoKICAgIHN0YXJ0c3dpdGgoaV9rZXksICJpby5rdWJlcm5ldGVzLmNyaS4iKQoKICAgIHByaW50KCJhbGxvd19hbm5vX2tleSAxOiB0cnVlIikKfQphbGxvd19hbm5vX2tleShpX2tleSwgcF9vY2kpIHsKICAgIHByaW50KCJhbGxvd19hbm5vX2tleSAyOiBpIGtleSA9IiwgaV9rZXkpCgogICAgc29tZSBwX2tleSwgXyBpbiBwX29jaS5Bbm5vdGF0aW9ucwogICAgcF9rZXkgPT0gaV9rZXkKCiAgICBwcmludCgiYWxsb3dfYW5ub19rZXkgMjogdHJ1ZSIpCn0KCiMgR2V0IHRoZSB2YWx1ZSBvZiB0aGUgU19OQU1FX0tFWSBhbm5vdGF0aW9uIGFuZAojIGNvcnJlbGF0ZSBpdCB3aXRoIG90aGVyIGFubm90YXRpb25zIGFuZCBwcm9jZXNzIGZpZWxkcy4KYWxsb3dfYnlfYW5ubyhwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpIHsKICAgIHByaW50KCJhbGxvd19ieV9hbm5vIDE6IHN0YXJ0IikKCiAgICBub3QgcF9vY2kuQW5ub3RhdGlvbnNbU19OQU1FX0tFWV0KCiAgICBpX3NfbmFtZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMTogaV9zX25hbWUgPSIsIGlfc19uYW1lKQoKICAgIGlfc19uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FU1BBQ0VfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMTogaV9zX25hbWVzcGFjZSA9IiwgaV9zX25hbWVzcGFjZSkKCiAgICBhbGxvd19ieV9zYW5kYm94X25hbWUocF9vY2ksIGlfb2NpLCBwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBpX3NfbmFtZSwgaV9zX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfYnlfYW5ubyAxOiB0cnVlIikKfQphbGxvd19ieV9hbm5vKHBfb2NpLCBpX29jaSwgcF9zdG9yYWdlcywgaV9zdG9yYWdlcykgewogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMjogc3RhcnQiKQoKICAgIHBfc19uYW1lIDo9IHBfb2NpLkFubm90YXRpb25zW1NfTkFNRV9LRVldCiAgICBpX3NfbmFtZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMjogaV9zX25hbWUgPSIsIGlfc19uYW1lLCAicF9zX25hbWUgPSIsIHBfc19uYW1lKQoKICAgIGFsbG93X3NhbmRib3hfbmFtZShwX3NfbmFtZSwgaV9zX25hbWUpCgogICAgaV9zX25hbWVzcGFjZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwcmludCgiYWxsb3dfYnlfYW5ubyAyOiBpX3NfbmFtZXNwYWNlID0iLCBpX3NfbmFtZXNwYWNlKQoKICAgIGFsbG93X2J5X3NhbmRib3hfbmFtZShwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMsIGlfc19uYW1lLCBpX3NfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd19ieV9hbm5vIDI6IHRydWUiKQp9CgphbGxvd19ieV9zYW5kYm94X25hbWUocF9vY2ksIGlfb2NpLCBwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfYnlfc2FuZGJveF9uYW1lOiBzdGFydCIpCgogICAgaV9uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FU1BBQ0VfS0VZXQoKICAgIGFsbG93X2J5X2NvbnRhaW5lcl90eXBlcyhwX29jaSwgaV9vY2ksIHNfbmFtZSwgaV9uYW1lc3BhY2UpCiAgICBhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZChwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpCiAgICBhbGxvd19wcm9jZXNzKHBfb2NpLlByb2Nlc3MsIGlfb2NpLlByb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpCgogICAgcHJpbnQoImFsbG93X2J5X3NhbmRib3hfbmFtZTogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfbmFtZShwX3NfbmFtZSwgaV9zX25hbWUpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X25hbWU6IHN0YXJ0IikKICAgIHJlZ2V4Lm1hdGNoKHBfc19uYW1lLCBpX3NfbmFtZSkKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9uYW1lOiB0cnVlIikKfQoKIyBDaGVjayB0aGF0IHRoZSAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLXR5cGUiIGFuZAojICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIiBhbm5vdGF0aW9ucyBkZXNpZ25hdGUgdGhlCiMgZXhwZWN0ZWQgdHlwZSAtIGVpdGhlciBhICJzYW5kYm94IiBvciBhICJjb250YWluZXIiLiBUaGVuLCB2YWxpZGF0ZQojIG90aGVyIGFubm90YXRpb25zIGJhc2VkIG9uIHRoZSBhY3R1YWwgInNhbmRib3giIG9yICJjb250YWluZXIiIHZhbHVlCiMgZnJvbSB0aGUgaW5wdXQgY29udGFpbmVyLgphbGxvd19ieV9jb250YWluZXJfdHlwZXMocF9vY2ksIGlfb2NpLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfYnlfY29udGFpbmVyX3R5cGVzOiBjaGVja2luZyBpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSIpCgogICAgY190eXBlIDo9ICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSIKICAgIAogICAgcF9jcmlfdHlwZSA6PSBwX29jaS5Bbm5vdGF0aW9uc1tjX3R5cGVdCiAgICBpX2NyaV90eXBlIDo9IGlfb2NpLkFubm90YXRpb25zW2NfdHlwZV0KICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZXM6IHBfY3JpX3R5cGUgPSIsIHBfY3JpX3R5cGUsICJpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgcF9jcmlfdHlwZSA9PSBpX2NyaV90eXBlCgogICAgYWxsb3dfYnlfY29udGFpbmVyX3R5cGUoaV9jcmlfdHlwZSwgcF9vY2ksIGlfb2NpLCBzX25hbWUsIHNfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZXM6IHRydWUiKQp9CgphbGxvd19ieV9jb250YWluZXJfdHlwZShpX2NyaV90eXBlLCBwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAxOiBpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgaV9jcmlfdHlwZSA9PSAic2FuZGJveCIKCiAgICBpX2thdGFfdHlwZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1siaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5jb250YWluZXJfdHlwZSJdCiAgICBwcmludCgiYWxsb3dfYnlfY29udGFpbmVyX3R5cGUgMTogaV9rYXRhX3R5cGUgPSIsIGlfa2F0YV90eXBlKQogICAgaV9rYXRhX3R5cGUgPT0gInBvZF9zYW5kYm94IgoKICAgIGFsbG93X3NhbmRib3hfY29udGFpbmVyX25hbWUocF9vY2ksIGlfb2NpKQogICAgYWxsb3dfc2FuZGJveF9uZXRfbmFtZXNwYWNlKHBfb2NpLCBpX29jaSkKICAgIGFsbG93X3NhbmRib3hfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpCgogICAgcHJpbnQoImFsbG93X2J5X2NvbnRhaW5lcl90eXBlIDE6IHRydWUiKQp9CgphbGxvd19ieV9jb250YWluZXJfdHlwZShpX2NyaV90eXBlLCBwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiBpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgaV9jcmlfdHlwZSA9PSAiY29udGFpbmVyIgoKICAgIGlfa2F0YV90eXBlIDo9IGlfb2NpLkFubm90YXRpb25zWyJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIl0KICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiBpX2thdGFfdHlwZSA9IiwgaV9rYXRhX3R5cGUpCiAgICBpX2thdGFfdHlwZSA9PSAicG9kX2NvbnRhaW5lciIKCiAgICBhbGxvd19jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpCiAgICBhbGxvd19uZXRfbmFtZXNwYWNlKHBfb2NpLCBpX29jaSkKICAgIGFsbG93X2xvZ19kaXJlY3RvcnkocF9vY2ksIGlfb2NpKQoKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiB0cnVlIikKfQoKIyAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLW5hbWUiIGFubm90YXRpb24KYWxsb3dfc2FuZGJveF9jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X2NvbnRhaW5lcl9uYW1lOiBzdGFydCIpCgogICAgY29udGFpbmVyX2Fubm90YXRpb25fbWlzc2luZyhwX29jaSwgaV9vY2ksICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItbmFtZSIpCgogICAgcHJpbnQoImFsbG93X3NhbmRib3hfY29udGFpbmVyX25hbWU6IHRydWUiKQp9CgphbGxvd19jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19jb250YWluZXJfbmFtZTogc3RhcnQiKQoKICAgIGFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uKHBfb2NpLCBpX29jaSwgImlvLmt1YmVybmV0ZXMuY3JpLmNvbnRhaW5lci1uYW1lIikKCiAgICBwcmludCgiYWxsb3dfY29udGFpbmVyX25hbWU6IHRydWUiKQp9Cgpjb250YWluZXJfYW5ub3RhdGlvbl9taXNzaW5nKHBfb2NpLCBpX29jaSwga2V5KSB7CiAgICBwcmludCgiY29udGFpbmVyX2Fubm90YXRpb25fbWlzc2luZzoiLCBrZXkpCgogICAgbm90IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIG5vdCBpX29jaS5Bbm5vdGF0aW9uc1trZXldCgogICAgcHJpbnQoImNvbnRhaW5lcl9hbm5vdGF0aW9uX21pc3Npbmc6IHRydWUiKQp9CgphbGxvd19jb250YWluZXJfYW5ub3RhdGlvbihwX29jaSwgaV9vY2ksIGtleSkgewogICAgcHJpbnQoImFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uOiBrZXkgPSIsIGtleSkKCiAgICBwX3ZhbHVlIDo9IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIGlfdmFsdWUgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgcHJpbnQoImFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uOiBwX3ZhbHVlID0iLCBwX3ZhbHVlLCAiaV92YWx1ZSA9IiwgaV92YWx1ZSkKCiAgICBwX3ZhbHVlID09IGlfdmFsdWUKCiAgICBwcmludCgiYWxsb3dfY29udGFpbmVyX2Fubm90YXRpb246IHRydWUiKQp9CgojICJuZXJkY3RsL25ldHdvcmstbmFtZXNwYWNlIiBhbm5vdGF0aW9uCmFsbG93X3NhbmRib3hfbmV0X25hbWVzcGFjZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X25ldF9uYW1lc3BhY2U6IHN0YXJ0IikKCiAgICBrZXkgOj0gIm5lcmRjdGwvbmV0d29yay1uYW1lc3BhY2UiCgogICAgcF9uYW1lc3BhY2UgOj0gcF9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgaV9uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgcHJpbnQoImFsbG93X3NhbmRib3hfbmV0X25hbWVzcGFjZTogcF9uYW1lc3BhY2UgPSIsIHBfbmFtZXNwYWNlLCAiaV9uYW1lc3BhY2UgPSIsIGlfbmFtZXNwYWNlKQoKICAgIHJlZ2V4Lm1hdGNoKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9uZXRfbmFtZXNwYWNlOiB0cnVlIikKfQoKYWxsb3dfbmV0X25hbWVzcGFjZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19uZXRfbmFtZXNwYWNlOiBzdGFydCIpCgogICAga2V5IDo9ICJuZXJkY3RsL25ldHdvcmstbmFtZXNwYWNlIgoKICAgIG5vdCBwX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICBub3QgaV9vY2kuQW5ub3RhdGlvbnNba2V5XQoKICAgIHByaW50KCJhbGxvd19uZXRfbmFtZXNwYWNlOiB0cnVlIikKfQoKIyAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1sb2ctZGlyZWN0b3J5IiBhbm5vdGF0aW9uCmFsbG93X3NhbmRib3hfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X2xvZ19kaXJlY3Rvcnk6IHN0YXJ0IikKCiAgICBrZXkgOj0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbG9nLWRpcmVjdG9yeSIKCiAgICBwX2RpciA6PSBwX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICByZWdleDEgOj0gcmVwbGFjZShwX2RpciwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHJlZ2V4MiA6PSByZXBsYWNlKHJlZ2V4MSwgIiQoc2FuZGJveC1uYW1lc3BhY2UpIiwgc19uYW1lc3BhY2UpCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiByZWdleDIgPSIsIHJlZ2V4MikKCiAgICBpX2RpciA6PSBpX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiBpX2RpciA9IiwgaV9kaXIpCgogICAgcmVnZXgubWF0Y2gocmVnZXgyLCBpX2RpcikKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiB0cnVlIikKfQoKYWxsb3dfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19sb2dfZGlyZWN0b3J5OiBzdGFydCIpCgogICAga2V5IDo9ICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWxvZy1kaXJlY3RvcnkiCgogICAgbm90IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIG5vdCBpX29jaS5Bbm5vdGF0aW9uc1trZXldCgogICAgcHJpbnQoImFsbG93X2xvZ19kaXJlY3Rvcnk6IHRydWUiKQp9CgphbGxvd19kZXZpY2VzKHBfZGV2aWNlcywgaV9kZXZpY2VzKSB7CiAgICBwcmludCgiYWxsb3dfZGV2aWNlczogc3RhcnQiKQogICAgZXZlcnkgaV9kZXZpY2UgaW4gaV9kZXZpY2VzIHsKICAgICAgICBwcmludCgiYWxsb3dfZGV2aWNlczogaV9kZXZpY2UgPSIsIGlfZGV2aWNlKQogICAgICAgIHNvbWUgcF9kZXZpY2UgaW4gcF9kZXZpY2VzCiAgICAgICAgcF9kZXZpY2UuY29udGFpbmVyX3BhdGggPT0gaV9kZXZpY2UuY29udGFpbmVyX3BhdGgKICAgIH0KICAgIHByaW50KCJhbGxvd19kZXZpY2VzOiB0cnVlIikKfQoKYWxsb3dfbGludXgoc3RhdGVfb3BzLCBwX29jaSwgaV9vY2kpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIHBfbmFtZXNwYWNlcyA6PSBwX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbGludXg6IHAgbmFtZXNwYWNlcyA9IiwgcF9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlcyA6PSBpX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbGludXg6IGkgbmFtZXNwYWNlcyA9IiwgaV9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlX3dpdGhvdXRfbmV0d29yayA6PSBbb2JqIHwgb2JqIDo9IGlfbmFtZXNwYWNlc1tfXTsgb2JqLlR5cGUgIT0gIm5ldHdvcmsiXQoKICAgIHByaW50KCJhbGxvd19saW51eDogaV9uYW1lc3BhY2Vfd2l0aG91dF9uZXR3b3JrID0iLCBpX25hbWVzcGFjZV93aXRob3V0X25ldHdvcmspCgogICAgcF9uYW1lc3BhY2VzID09IGlfbmFtZXNwYWNlX3dpdGhvdXRfbmV0d29yawoKICAgIGFsbG93X21hc2tlZF9wYXRocyhwX29jaSwgaV9vY2kpCiAgICBhbGxvd19yZWFkb25seV9wYXRocyhwX29jaSwgaV9vY2kpCiAgICBhbGxvd19saW51eF9kZXZpY2VzKHBfb2NpLkxpbnV4LkRldmljZXMsIGlfb2NpLkxpbnV4LkRldmljZXMpCiAgICBhbGxvd19saW51eF9zeXNjdGwocF9vY2kuTGludXgsIGlfb2NpLkxpbnV4KQogICAgcmV0IDo9IGFsbG93X25ldHdvcmtfbmFtZXNwYWNlX3N0YXJ0KHN0YXRlX29wcywgcF9vY2ksIGlfb2NpKQogICAgcmV0LmFsbG93ZWQKCiAgICBvcHMgOj0gcmV0Lm9wcwoKICAgIHByaW50KCJhbGxvd19saW51eDogdHJ1ZSIpCn0KCiMgUmV0cmlldmUgdGhlICJuZXR3b3JrIiBuYW1lc3BhY2UgZnJvbSB0aGUgaW5wdXQgZGF0YSBhbmQgcGFzcyBpdCBvbiBmb3IgdGhlCiMgbmV0d29yayBuYW1lc3BhY2UgcG9saWN5IGNoZWNrcy4KYWxsb3dfbmV0d29ya19uYW1lc3BhY2Vfc3RhcnQoc3RhdGVfb3BzLCBwX29jaSwgaV9vY2kpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIHByaW50KCJhbGxvd19uZXR3b3JrX25hbWVzcGFjZSBzdGFydDogc3RhcnQiKQoKICAgIHBfbmFtZXNwYWNlcyA6PSBwX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IHAgbmFtZXNwYWNlcyA9IiwgcF9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlcyA6PSBpX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IGkgbmFtZXNwYWNlcyA9IiwgaV9uYW1lc3BhY2VzKQoKICAgICMgUmV0dXJuIHBhdGggb2YgdGhlICJuZXR3b3JrIiBuYW1lc3BhY2UKICAgIG5ldHdvcmtfbnMgOj0gW29iaiB8IG9iaiA6PSBpX25hbWVzcGFjZXNbX107IG9iai5UeXBlID09ICJuZXR3b3JrIl0KCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IG5ldHdvcmtfbnMgPSIsIG5ldHdvcmtfbnMpCgogICAgcmV0IDo9IGFsbG93X25ldHdvcmtfbmFtZXNwYWNlKHN0YXRlX29wcywgbmV0d29ya19ucykKICAgIHJldC5hbGxvd2VkCgogICAgb3BzIDo9IHJldC5vcHMKfQoKIyBUaGlzIHJ1bGUgaXMgd2hlbiB0aGVyZSdzIG5vIG5ldHdvcmsgbmFtZXNwYWNlIGluIHRoZSBpbnB1dCBkYXRhLgphbGxvd19uZXR3b3JrX25hbWVzcGFjZShzdGF0ZV9vcHMsIG5ldHdvcmtfbnMpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIGNvdW50KG5ldHdvcmtfbnMpID09IDAKCiAgICBuZXR3b3JrX25zX3BhdGggPSAiIgoKICAgIGFkZF9uZXR3b3JrX25hbWVzcGFjZV90b19zdGF0ZSA6PSBzdGF0ZV9hbGxvd3MoIm5ldHdvcmtfbmFtZXNwYWNlIiwgbmV0d29ya19uc19wYXRoKQogICAgb3BzIDo9IGNvbmNhdF9vcF9pZl9ub3RfbnVsbChzdGF0ZV9vcHMsIGFkZF9uZXR3b3JrX25hbWVzcGFjZV90b19zdGF0ZSkKCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2UgMTogdHJ1ZSIpCn0KCiMgVGhpcyBydWxlIGlzIHdoZW4gdGhlcmUncyBleGFjdGx5IG9uZSBuZXR3b3JrIG5hbWVzcGFjZSBpbiB0aGUgaW5wdXQgZGF0YS4KYWxsb3dfbmV0d29ya19uYW1lc3BhY2Uoc3RhdGVfb3BzLCBuZXR3b3JrX25zKSA6PSB7Im9wcyI6IG9wcywgImFsbG93ZWQiOiB0cnVlfSB7CiAgICBjb3VudChuZXR3b3JrX25zKSA9PSAxCgogICAgYWRkX25ldHdvcmtfbmFtZXNwYWNlX3RvX3N0YXRlIDo9IHN0YXRlX2FsbG93cygibmV0d29ya19uYW1lc3BhY2UiLCBuZXR3b3JrX25zWzBdLlBhdGgpCiAgICBvcHMgOj0gY29uY2F0X29wX2lmX25vdF9udWxsKHN0YXRlX29wcywgYWRkX25ldHdvcmtfbmFtZXNwYWNlX3RvX3N0YXRlKQoKICAgIHByaW50KCJhbGxvd19uZXR3b3JrX25hbWVzcGFjZSAyOiB0cnVlIikKfQoKYWxsb3dfbWFza2VkX3BhdGhzKHBfb2NpLCBpX29jaSkgewogICAgcF9wYXRocyA6PSBwX29jaS5MaW51eC5NYXNrZWRQYXRocwogICAgcHJpbnQoImFsbG93X21hc2tlZF9wYXRocyAxOiBwX3BhdGhzID0iLCBwX3BhdGhzKQoKICAgIGlfcGF0aHMgOj0gaV9vY2kuTGludXguTWFza2VkUGF0aHMKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aHMgMTogaV9wYXRocyA9IiwgaV9wYXRocykKCiAgICBhbGxvd19tYXNrZWRfcGF0aHNfYXJyYXkocF9wYXRocywgaV9wYXRocykKCiAgICBwcmludCgiYWxsb3dfbWFza2VkX3BhdGhzIDE6IHRydWUiKQp9CmFsbG93X21hc2tlZF9wYXRocyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aHMgMjogc3RhcnQiKQoKICAgIG5vdCBwX29jaS5MaW51eC5NYXNrZWRQYXRocwogICAgbm90IGlfb2NpLkxpbnV4Lk1hc2tlZFBhdGhzCgogICAgcHJpbnQoImFsbG93X21hc2tlZF9wYXRocyAyOiB0cnVlIikKfQoKIyBBbGwgdGhlIHBvbGljeSBtYXNrZWQgcGF0aHMgbXVzdCBiZSBtYXNrZWQgaW4gdGhlIGlucHV0IGRhdGEgdG9vLgojIElucHV0IGlzIGFsbG93ZWQgdG8gaGF2ZSBtb3JlIG1hc2tlZCBwYXRocyB0aGFuIHRoZSBwb2xpY3kuCmFsbG93X21hc2tlZF9wYXRoc19hcnJheShwX2FycmF5LCBpX2FycmF5KSB7CiAgICBldmVyeSBwX2VsZW0gaW4gcF9hcnJheSB7CiAgICAgICAgYWxsb3dfbWFza2VkX3BhdGgocF9lbGVtLCBpX2FycmF5KQogICAgfQp9CgphbGxvd19tYXNrZWRfcGF0aChwX2VsZW0sIGlfYXJyYXkpIHsKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aDogcF9lbGVtID0iLCBwX2VsZW0pCgogICAgc29tZSBpX2VsZW0gaW4gaV9hcnJheQogICAgcF9lbGVtID09IGlfZWxlbQoKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aDogdHJ1ZSIpCn0KCmFsbG93X3JlYWRvbmx5X3BhdGhzKHBfb2NpLCBpX29jaSkgewogICAgcF9wYXRocyA6PSBwX29jaS5MaW51eC5SZWFkb25seVBhdGhzCiAgICBwcmludCgiYWxsb3dfcmVhZG9ubHlfcGF0aHMgMTogcF9wYXRocyA9IiwgcF9wYXRocykKCiAgICBpX3BhdGhzIDo9IGlfb2NpLkxpbnV4LlJlYWRvbmx5UGF0aHMKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAxOiBpX3BhdGhzID0iLCBpX3BhdGhzKQoKICAgIGFsbG93X3JlYWRvbmx5X3BhdGhzX2FycmF5KHBfcGF0aHMsIGlfcGF0aHMsIGlfb2NpLkxpbnV4Lk1hc2tlZFBhdGhzKQoKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAxOiB0cnVlIikKfQphbGxvd19yZWFkb25seV9wYXRocyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAyOiBzdGFydCIpCgogICAgbm90IHBfb2NpLkxpbnV4LlJlYWRvbmx5UGF0aHMKICAgIG5vdCBpX29jaS5MaW51eC5SZWFkb25seVBhdGhzCgogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGhzIDI6IHRydWUiKQp9CgojIEFsbCB0aGUgcG9saWN5IHJlYWRvbmx5IHBhdGhzIG11c3QgYmUgZWl0aGVyOgojIC0gUHJlc2VudCBpbiB0aGUgaW5wdXQgcmVhZG9ubHkgcGF0aHMsIG9yCiMgLSBQcmVzZW50IGluIHRoZSBpbnB1dCBtYXNrZWQgcGF0aHMuCiMgSW5wdXQgaXMgYWxsb3dlZCB0byBoYXZlIG1vcmUgcmVhZG9ubHkgcGF0aHMgdGhhbiB0aGUgcG9saWN5LgphbGxvd19yZWFkb25seV9wYXRoc19hcnJheShwX2FycmF5LCBpX2FycmF5LCBtYXNrZWRfcGF0aHMpIHsKICAgIGV2ZXJ5IHBfZWxlbSBpbiBwX2FycmF5IHsKICAgICAgICBhbGxvd19yZWFkb25seV9wYXRoKHBfZWxlbSwgaV9hcnJheSwgbWFza2VkX3BhdGhzKQogICAgfQp9CgphbGxvd19yZWFkb25seV9wYXRoKHBfZWxlbSwgaV9hcnJheSwgbWFza2VkX3BhdGhzKSB7CiAgICBwcmludCgiYWxsb3dfcmVhZG9ubHlfcGF0aCAxOiBwX2VsZW0gPSIsIHBfZWxlbSkKCiAgICBzb21lIGlfZWxlbSBpbiBpX2FycmF5CiAgICBwX2VsZW0gPT0gaV9lbGVtCgogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGggMTogdHJ1ZSIpCn0KYWxsb3dfcmVhZG9ubHlfcGF0aChwX2VsZW0sIGlfYXJyYXksIG1hc2tlZF9wYXRocykgewogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGggMjogcF9lbGVtID0iLCBwX2VsZW0pCgogICAgc29tZSBpX21hc2tlZCBpbiBtYXNrZWRfcGF0aHMKICAgIHBfZWxlbSA9PSBpX21hc2tlZAoKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRoIDI6IHRydWUiKQp9CgphbGxvd19saW51eF9kZXZpY2VzKHBfZGV2aWNlcywgaV9kZXZpY2VzKSB7CiAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogc3RhcnQiKQogICAgZXZlcnkgaV9kZXZpY2UgaW4gaV9kZXZpY2VzIHsKICAgICAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogaV9kZXZpY2UgPSIsIGlfZGV2aWNlKQogICAgICAgIHNvbWUgcF9kZXZpY2UgaW4gcF9kZXZpY2VzCiAgICAgICAgaV9kZXZpY2UuUGF0aCA9PSBwX2RldmljZS5QYXRoCiAgICB9CiAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogdHJ1ZSIpCn0KCmFsbG93X2xpbnV4X3N5c2N0bChwX2xpbnV4LCBpX2xpbnV4KSB7CiAgICBwcmludCgiYWxsb3dfbGludXhfc3lzY3RsIDE6IHN0YXJ0IikKICAgIG5vdCBpX2xpbnV4LlN5c2N0bAogICAgcHJpbnQoImFsbG93X2xpbnV4X3N5c2N0bCAxOiB0cnVlIikKfQoKYWxsb3dfbGludXhfc3lzY3RsKHBfbGludXgsIGlfbGludXgpIHsKICAgIHByaW50KCJhbGxvd19saW51eF9zeXNjdGwgMjogc3RhcnQiKQogICAgcF9zeXNjdGwgOj0gcF9saW51eC5TeXNjdGwKICAgIGlfc3lzY3RsIDo9IGlfbGludXguU3lzY3RsCiAgICBldmVyeSBpX25hbWUsIGlfdmFsIGluIGlfc3lzY3RsIHsKICAgICAgICBwcmludCgiYWxsb3dfbGludXhfc3lzY3RsIDI6IGlfbmFtZSA9IiwgaV9uYW1lLCAiaV92YWwgPSIsIGlfdmFsKQogICAgICAgIHBfc3lzY3RsW2lfbmFtZV0gPT0gaV92YWwKICAgIH0KICAgIHByaW50KCJhbGxvd19saW51eF9zeXNjdGwgMjogdHJ1ZSIpCn0KCiMgQ2hlY2sgdGhlIGNvbnNpc3RlbmN5IG9mIHRoZSBpbnB1dCAiaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5idW5kbGVfcGF0aCIKIyBhbmQgaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCIgdmFsdWVzIHdpdGggb3RoZXIgZmllbGRzLgphbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZChwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpIHsKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogc3RhcnQiKQoKICAgIGJ1bmRsZV9wYXRoIDo9IGlfb2NpLkFubm90YXRpb25zWyJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmJ1bmRsZV9wYXRoIl0KICAgIGJ1bmRsZV9pZCA6PSByZXBsYWNlKGJ1bmRsZV9wYXRoLCAiL3J1bi9jb250YWluZXJkL2lvLmNvbnRhaW5lcmQucnVudGltZS52Mi50YXNrL2s4cy5pby8iLCAiIikKCiAgICBidW5kbGVfaWRfZm9ybWF0IDo9IGNvbmNhdCgiIiwgWyJeIiwgQlVORExFX0lELCAiJCJdKQogICAgcmVnZXgubWF0Y2goYnVuZGxlX2lkX2Zvcm1hdCwgYnVuZGxlX2lkKQoKICAgIGtleSA6PSAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCIKCiAgICBwX3JlZ2V4IDo9IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIHNhbmRib3hfaWQgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQoKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogc2FuZGJveF9pZCA9Iiwgc2FuZGJveF9pZCwgInJlZ2V4ID0iLCBwX3JlZ2V4KQogICAgcmVnZXgubWF0Y2gocF9yZWdleCwgc2FuZGJveF9pZCkKCiAgICBhbGxvd19yb290X3BhdGgocF9vY2ksIGlfb2NpLCBidW5kbGVfaWQpCgogICAgZXZlcnkgaV9tb3VudCBpbiBpX29jaS5Nb3VudHMgewogICAgICAgIGFsbG93X21vdW50KHBfb2NpLCBpX21vdW50LCBpX3N0b3JhZ2VzLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpCiAgICB9CgogICAgYWxsb3dfc3RvcmFnZXMocF9zdG9yYWdlcywgaV9zdG9yYWdlcywgYnVuZGxlX2lkLCBzYW5kYm94X2lkKQoKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogdHJ1ZSIpCn0KCmFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHBfcHJvY2VzcyA9IiwgcF9wcm9jZXNzKQogICAgcHJpbnQoImFsbG93X3Byb2Nlc3NfY29tbW9uOiBpX3Byb2Nlc3MgPSAiLCBpX3Byb2Nlc3MpCiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHNfbmFtZSA9Iiwgc19uYW1lKQoKICAgIHBfcHJvY2Vzcy5Dd2QgPT0gaV9wcm9jZXNzLkN3ZAogICAgcF9wcm9jZXNzLk5vTmV3UHJpdmlsZWdlcyA9PSBpX3Byb2Nlc3MuTm9OZXdQcml2aWxlZ2VzCgogICAgYWxsb3dfdXNlcihwX3Byb2Nlc3MsIGlfcHJvY2VzcykKICAgIGFsbG93X2VudihwX3Byb2Nlc3MsIGlfcHJvY2Vzcywgc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHRydWUiKQp9CgojIENvbXBhcmUgdGhlIE9DSSBQcm9jZXNzIGZpZWxkIG9mIGEgcG9saWN5IGNvbnRhaW5lciB3aXRoIHRoZSBpbnB1dCBPQ0kgUHJvY2VzcyBmcm9tIGEgQ3JlYXRlQ29udGFpbmVyUmVxdWVzdAphbGxvd19wcm9jZXNzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfcHJvY2Vzczogc3RhcnQiKQoKICAgIGFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgYWxsb3dfY2FwcyhwX3Byb2Nlc3MuQ2FwYWJpbGl0aWVzLCBpX3Byb2Nlc3MuQ2FwYWJpbGl0aWVzKQogICAgcF9wcm9jZXNzLlRlcm1pbmFsID09IGlfcHJvY2Vzcy5UZXJtaW5hbAoKICAgIHByaW50KCJhbGxvd19wcm9jZXNzOiB0cnVlIikKfQoKIyBDb21wYXJlIHRoZSBPQ0kgUHJvY2VzcyBmaWVsZCBvZiBhIHBvbGljeSBjb250YWluZXIgd2l0aCB0aGUgaW5wdXQgcHJvY2VzcyBmaWVsZCBmcm9tIEV4ZWNQcm9jZXNzUmVxdWVzdAphbGxvd19pbnRlcmFjdGl2ZV9wcm9jZXNzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfaW50ZXJhY3RpdmVfcHJvY2Vzczogc3RhcnQiKQoKICAgIGFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgYWxsb3dfZXhlY19jYXBzKGlfcHJvY2Vzcy5DYXBhYmlsaXRpZXMpCgogICAgIyBUaGVzZSBhcmUgY29tbWFuZHMgZW5hYmxlZCB1c2luZyBFeGVjUHJvY2Vzc1JlcXVlc3QgY29tbWFuZHMgYW5kL29yIHJlZ2V4IGZyb20gdGhlIHNldHRpbmdzIGZpbGUuCiAgICAjIFRoZXkgY2FuIGJlIGV4ZWN1dGVkIGludGVyYWN0aXZlbHkgc28gYWxsb3cgdGhlbSB0byB1c2UgYW55IHZhbHVlIGZvciBpX3Byb2Nlc3MuVGVybWluYWwuCgogICAgcHJpbnQoImFsbG93X2ludGVyYWN0aXZlX3Byb2Nlc3M6IHRydWUiKQp9CgojIENvbXBhcmUgdGhlIE9DSSBQcm9jZXNzIGZpZWxkIG9mIGEgcG9saWN5IGNvbnRhaW5lciB3aXRoIHRoZSBpbnB1dCBwcm9jZXNzIGZpZWxkIGZyb20gRXhlY1Byb2Nlc3NSZXF1ZXN0CmFsbG93X3Byb2JlX3Byb2Nlc3MocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19wcm9iZV9wcm9jZXNzOiBzdGFydCIpCgogICAgYWxsb3dfcHJvY2Vzc19jb21tb24ocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpCiAgICBhbGxvd19leGVjX2NhcHMoaV9wcm9jZXNzLkNhcGFiaWxpdGllcykKICAgIHBfcHJvY2Vzcy5UZXJtaW5hbCA9PSBpX3Byb2Nlc3MuVGVybWluYWwKCiAgICBwcmludCgiYWxsb3dfcHJvYmVfcHJvY2VzczogdHJ1ZSIpCn0KCmFsbG93X3VzZXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MpIHsKICAgIHBfdXNlciA6PSBwX3Byb2Nlc3MuVXNlcgogICAgaV91c2VyIDo9IGlfcHJvY2Vzcy5Vc2VyCgogICAgcHJpbnQoImFsbG93X3VzZXI6IGlucHV0IHVpZCA9IiwgaV91c2VyLlVJRCwgInBvbGljeSB1aWQgPSIsIHBfdXNlci5VSUQpCiAgICBwX3VzZXIuVUlEID09IGlfdXNlci5VSUQKCiAgICAjIFRPRE86IHRyYWNrIGRvd24gdGhlIHJlYXNvbiBmb3IgcmVnaXN0cnkuazhzLmlvL3BhdXNlOjMuOSBiZWluZwogICAgIyAgICAgICBleGVjdXRlZCB3aXRoIGdpZCA9IDAgZGVzcGl0ZSBoYXZpbmcgIjY1NTM1OjY1NTM1IiBpbiBpdHMgY29udGFpbmVyIGltYWdlCiAgICAjICAgICAgIGNvbmZpZy4KICAgICNwcmludCgiYWxsb3dfdXNlcjogaW5wdXQgZ2lkID0iLCBpX3VzZXIuR0lELCAicG9saWN5IGdpZCA9IiwgcF91c2VyLkdJRCkKICAgICNwX3VzZXIuR0lEID09IGlfdXNlci5HSUQKCiAgICAjIFRPRE86IGNvbXBhcmUgdGhlIGFkZGl0aW9uYWxHaWRzIGZpZWxkIHRvbyBhZnRlciBjb21wdXRpbmcgaXRzIHZhbHVlCiAgICAjIGJhc2VkIG9uIC9ldGMvcGFzc3dkIGFuZCAvZXRjL2dyb3VwIGZyb20gdGhlIGNvbnRhaW5lciBpbWFnZS4KfQoKYWxsb3dfZGVwcmVjYXRlZF9hcmdzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZ3MgMTogbm8gYXJncyIpCgogICAgbm90IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJncwogICAgbm90IGlfcHJvY2Vzcy5BcmdzCgogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAxOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZ3MocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSkgewogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiBwb2xpY3kgYXJncyA9IiwgcF9wcm9jZXNzLkRlcHJlY2F0ZWRBcmdzKQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiBpbnB1dCBhcmdzID0iLCBpX3Byb2Nlc3MuQXJncykKCiAgICBjb3VudChwX3Byb2Nlc3MuRGVwcmVjYXRlZEFyZ3MpID09IGNvdW50KGlfcHJvY2Vzcy5BcmdzKQoKICAgIGV2ZXJ5IGksIGlfYXJnIGluIGlfcHJvY2Vzcy5BcmdzIHsKICAgICAgICBhbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpCiAgICB9CgogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDE6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgcF9hcmcyIDo9IHJlcGxhY2UocF9hcmcsICIkJCIsICIkIikKICAgIHBfYXJnMiA9PSBpX2FyZwoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAxOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDI6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgIyBUT0RPOiBjYW4gJChub2RlLW5hbWUpIGJlIGhhbmRsZWQgYmV0dGVyPwogICAgY29udGFpbnMocF9hcmcsICIkKG5vZGUtbmFtZSkiKQoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAyOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDM6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgcF9hcmcyIDo9IHJlcGxhY2UocF9hcmcsICIkJCIsICIkIikKICAgIHBfYXJnMyA6PSByZXBsYWNlKHBfYXJnMiwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAzOiBwX2FyZzMgPSIsIHBfYXJnMykKICAgIHBfYXJnMyA9PSBpX2FyZwoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAzOiB0cnVlIikKfQoKIyBPQ0kgcHJvY2Vzcy5FbnYgZmllbGQKYWxsb3dfZW52KHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfZW52OiBwIGVudiA9IiwgcF9wcm9jZXNzLkVudikKICAgIHByaW50KCJhbGxvd19lbnY6IGkgZW52ID0iLCBpX3Byb2Nlc3MuRW52KQoKICAgIGV2ZXJ5IGlfdmFyIGluIGlfcHJvY2Vzcy5FbnYgewogICAgICAgIHByaW50KCJhbGxvd19lbnY6IGlfdmFyID0iLCBpX3ZhcikKICAgICAgICBhbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgfQoKICAgIHByaW50KCJhbGxvd19lbnY6IHRydWUiKQp9CgojIEFsbG93IGlucHV0IGVudiB2YXJpYWJsZXMgdGhhdCBhcmUgcHJlc2VudCBpbiB0aGUgcG9saWN5IGRhdGEgdG9vLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHBfdmFyID09IGlfdmFyCiAgICBwcmludCgiYWxsb3dfdmFyIDE6IHRydWUiKQp9CgojIE1hdGNoIGlucHV0IHdpdGggb25lIG9mIHRoZSBwb2xpY3kgdmFyaWFibGVzLCBhZnRlciBzdWJzdGl0dXRpbmcgJChzYW5kYm94LW5hbWUpLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHByaW50KCJhbGxvd192YXIgMjogcF92YXIgPSIsIHBfdmFyKQoKICAgIHBfdmFyX3NwbGl0IDo9IHNwbGl0KHBfdmFyLCAiPSIpCiAgICBjb3VudChwX3Zhcl9zcGxpdCkgPT0gMgoKICAgIHBfdmFyX3NwbGl0WzFdID09ICIkKHNhbmRib3gtbmFtZSkiCgogICAgaV92YXJfc3BsaXQgOj0gc3BsaXQoaV92YXIsICI9IikKICAgIGNvdW50KGlfdmFyX3NwbGl0KSA9PSAyCgogICAgaV92YXJfc3BsaXRbMF0gPT0gcF92YXJfc3BsaXRbMF0KICAgIHJlZ2V4Lm1hdGNoKHNfbmFtZSwgaV92YXJfc3BsaXRbMV0pCgogICAgcHJpbnQoImFsbG93X3ZhciAyOiB0cnVlIikKfQoKIyBBbGxvdyBpbnB1dCBlbnYgdmFyaWFibGVzIHRoYXQgbWF0Y2ggd2l0aCBhIHJlcXVlc3RfZGVmYXVsdHMgcmVnZXguCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHNvbWUgcF9yZWdleDEgaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5DcmVhdGVDb250YWluZXJSZXF1ZXN0LmFsbG93X2Vudl9yZWdleAogICAgcF9yZWdleDIgOj0gcmVwbGFjZShwX3JlZ2V4MSwgIiQoaXB2NF9hKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcHY0X2EpCiAgICBwX3JlZ2V4MyA6PSByZXBsYWNlKHBfcmVnZXgyLCAiJChpcF9wKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcF9wKQogICAgcF9yZWdleDQgOj0gcmVwbGFjZShwX3JlZ2V4MywgIiQoc3ZjX25hbWUpIiwgcG9saWN5X2RhdGEuY29tbW9uLnN2Y19uYW1lKQogICAgcF9yZWdleDUgOj0gcmVwbGFjZShwX3JlZ2V4NCwgIiQoZG5zX2xhYmVsKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5kbnNfbGFiZWwpCgogICAgcHJpbnQoImFsbG93X3ZhciAzOiBwX3JlZ2V4NSA9IiwgcF9yZWdleDUpCiAgICByZWdleC5tYXRjaChwX3JlZ2V4NSwgaV92YXIpCgogICAgcHJpbnQoImFsbG93X3ZhciAzOiB0cnVlIikKfQoKIyBBbGxvdyBmaWVsZFJlZiAiZmllbGRQYXRoOiBzdGF0dXMucG9kSVAiIHZhbHVlcy4KYWxsb3dfdmFyKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBpX3Zhciwgc19uYW1lLCBzX25hbWVzcGFjZSkgewogICAgbmFtZV92YWx1ZSA6PSBzcGxpdChpX3ZhciwgIj0iKQogICAgY291bnQobmFtZV92YWx1ZSkgPT0gMgogICAgaXNfaXAobmFtZV92YWx1ZVsxXSkKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIGFsbG93X3BvZF9pcF92YXIobmFtZV92YWx1ZVswXSwgcF92YXIpCgogICAgcHJpbnQoImFsbG93X3ZhciA0OiB0cnVlIikKfQoKIyBBbGxvdyBjb21tb24gZmllbGRSZWYgdmFyaWFibGVzLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBuYW1lX3ZhbHVlIDo9IHNwbGl0KGlfdmFyLCAiPSIpCiAgICBjb3VudChuYW1lX3ZhbHVlKSA9PSAyCgogICAgc29tZSBwX3ZhciBpbiBwX3Byb2Nlc3MuRW52CiAgICBwX25hbWVfdmFsdWUgOj0gc3BsaXQocF92YXIsICI9IikKICAgIGNvdW50KHBfbmFtZV92YWx1ZSkgPT0gMgoKICAgIHBfbmFtZV92YWx1ZVswXSA9PSBuYW1lX3ZhbHVlWzBdCgogICAgIyBUT0RPOiBzaG91bGQgdGhlc2UgYmUgaGFuZGxlZCBpbiBhIGRpZmZlcmVudCB3YXk/CiAgICBhbHdheXNfYWxsb3dlZCA6PSBbIiQoaG9zdC1uYW1lKSIsICIkKG5vZGUtbmFtZSkiLCAiJChwb2QtdWlkKSJdCiAgICBzb21lIGFsbG93ZWQgaW4gYWx3YXlzX2FsbG93ZWQKICAgIGNvbnRhaW5zKHBfbmFtZV92YWx1ZVsxXSwgYWxsb3dlZCkKCiAgICBwcmludCgiYWxsb3dfdmFyIDU6IHRydWUiKQp9CgojIEFsbG93IGZpZWxkUmVmICJmaWVsZFBhdGg6IHN0YXR1cy5ob3N0SVAiIHZhbHVlcy4KYWxsb3dfdmFyKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBpX3Zhciwgc19uYW1lLCBzX25hbWVzcGFjZSkgewogICAgbmFtZV92YWx1ZSA6PSBzcGxpdChpX3ZhciwgIj0iKQogICAgY291bnQobmFtZV92YWx1ZSkgPT0gMgogICAgaXNfaXAobmFtZV92YWx1ZVsxXSkKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIGFsbG93X2hvc3RfaXBfdmFyKG5hbWVfdmFsdWVbMF0sIHBfdmFyKQoKICAgIHByaW50KCJhbGxvd192YXIgNjogdHJ1ZSIpCn0KCiMgQWxsb3cgcmVzb3VyY2VGaWVsZFJlZiB2YWx1ZXMgKGUuZy4sICJsaW1pdHMuY3B1IikuCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIG5hbWVfdmFsdWUgOj0gc3BsaXQoaV92YXIsICI9IikKICAgIGNvdW50KG5hbWVfdmFsdWUpID09IDIKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHBfbmFtZV92YWx1ZSA6PSBzcGxpdChwX3ZhciwgIj0iKQogICAgY291bnQocF9uYW1lX3ZhbHVlKSA9PSAyCgogICAgcF9uYW1lX3ZhbHVlWzBdID09IG5hbWVfdmFsdWVbMF0KCiAgICAjIGEgdmFyaWFibGUgd2Ugc2hvdWxkIGJlIHZhbGlkYXRpbmcgdXNpbmcgYSByZWdleCBmcm9tIHNldHRpbmdzCiAgICBwX25hbWVfdmFsdWVbMV0gPT0gIiQodmFsaWRhdGUtZnJvbS1zZXR0aW5ncykiCgogICAgcmVnZXhfdmFsIDo9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuQ3JlYXRlQ29udGFpbmVyUmVxdWVzdC5hbGxvd19lbnZfcmVnZXhfbWFwW25hbWVfdmFsdWVbMF1dCgogICAgcHJpbnQoImFsbG93X3ZhciA3OiB2YWwgPSIsIG5hbWVfdmFsdWVbMV0pCiAgICBwcmludCgiYWxsb3dfdmFyIDc6IHJlZ2V4X3ZhbCA9IiwgcmVnZXhfdmFsKQoKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4X3ZhbCwgbmFtZV92YWx1ZVsxXSkKCiAgICBwcmludCgiYWxsb3dfdmFyIDc6IHRydWUiKQp9CgojIE1hdGNoIGlucHV0IHdpdGggb25lIG9mIHRoZSBwb2xpY3kgdmFyaWFibGVzLCBhZnRlciBzdWJzdGl0dXRpbmcgJChzYW5kYm94LW5hbWVzcGFjZSkuCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHNvbWUgcF92YXIgaW4gcF9wcm9jZXNzLkVudgogICAgcF92YXIyIDo9IHJlcGxhY2UocF92YXIsICIkKHNhbmRib3gtbmFtZXNwYWNlKSIsIHNfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd192YXIgODogcF92YXIyID0iLCBwX3ZhcjIpCiAgICBwX3ZhcjIgPT0gaV92YXIKCiAgICBwcmludCgiYWxsb3dfdmFyIDg6IHRydWUiKQp9CgphbGxvd19wb2RfaXBfdmFyKHZhcl9uYW1lLCBwX3ZhcikgewogICAgcHJpbnQoImFsbG93X3BvZF9pcF92YXI6IHZhcl9uYW1lID0iLCB2YXJfbmFtZSwgInBfdmFyID0iLCBwX3ZhcikKCiAgICBwX25hbWVfdmFsdWUgOj0gc3BsaXQocF92YXIsICI9IikKICAgIGNvdW50KHBfbmFtZV92YWx1ZSkgPT0gMgoKICAgIHBfbmFtZV92YWx1ZVswXSA9PSB2YXJfbmFtZQogICAgcF9uYW1lX3ZhbHVlWzFdID09ICIkKHBvZC1pcCkiCgogICAgcHJpbnQoImFsbG93X3BvZF9pcF92YXI6IHRydWUiKQp9CgphbGxvd19ob3N0X2lwX3Zhcih2YXJfbmFtZSwgcF92YXIpIHsKICAgIHByaW50KCJhbGxvd19ob3N0X2lwX3ZhcjogdmFyX25hbWUgPSIsIHZhcl9uYW1lLCAicF92YXIgPSIsIHBfdmFyKQoKICAgIHBfbmFtZV92YWx1ZSA6PSBzcGxpdChwX3ZhciwgIj0iKQogICAgY291bnQocF9uYW1lX3ZhbHVlKSA9PSAyCgogICAgcF9uYW1lX3ZhbHVlWzBdID09IHZhcl9uYW1lCiAgICBwX25hbWVfdmFsdWVbMV0gPT0gIiQoaG9zdC1pcCkiCgogICAgcHJpbnQoImFsbG93X2hvc3RfaXBfdmFyOiB0cnVlIikKfQoKaXNfaXAodmFsdWUpIHsKICAgIGJ5dGVzID0gc3BsaXQodmFsdWUsICIuIikKICAgIGNvdW50KGJ5dGVzKSA9PSA0CgogICAgaXNfaXBfZmlyc3RfYnl0ZShieXRlc1swXSkKICAgIGlzX2lwX290aGVyX2J5dGUoYnl0ZXNbMV0pCiAgICBpc19pcF9vdGhlcl9ieXRlKGJ5dGVzWzJdKQogICAgaXNfaXBfb3RoZXJfYnl0ZShieXRlc1szXSkKfQppc19pcF9maXJzdF9ieXRlKGNvbXBvbmVudCkgewogICAgbnVtYmVyID0gdG9fbnVtYmVyKGNvbXBvbmVudCkKICAgIG51bWJlciA+PSAxCiAgICBudW1iZXIgPD0gMjU1Cn0KaXNfaXBfb3RoZXJfYnl0ZShjb21wb25lbnQpIHsKICAgIG51bWJlciA9IHRvX251bWJlcihjb21wb25lbnQpCiAgICBudW1iZXIgPj0gMAogICAgbnVtYmVyIDw9IDI1NQp9CgojIE9DSSByb290LlBhdGgKYWxsb3dfcm9vdF9wYXRoKHBfb2NpLCBpX29jaSwgYnVuZGxlX2lkKSB7CiAgICBpX3BhdGggOj0gaV9vY2kuUm9vdC5QYXRoCiAgICBwX3BhdGgxIDo9IHBfb2NpLlJvb3QuUGF0aAogICAgcHJpbnQoImFsbG93X3Jvb3RfcGF0aDogaV9wYXRoID0iLCBpX3BhdGgsICJwX3BhdGgxID0iLCBwX3BhdGgxKQoKICAgIHBfcGF0aDIgOj0gcmVwbGFjZShwX3BhdGgxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfcm9vdF9wYXRoOiBwX3BhdGgyID0iLCBwX3BhdGgyKQoKICAgIHBfcGF0aDMgOj0gcmVwbGFjZShwX3BhdGgyLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X3Jvb3RfcGF0aDogcF9wYXRoMyA9IiwgcF9wYXRoMykKCiAgICBwX3BhdGgzID09IGlfcGF0aAoKICAgIHByaW50KCJhbGxvd19yb290X3BhdGg6IHRydWUiKQp9CgojIGRldmljZSBtb3VudHMKYWxsb3dfbW91bnQocF9vY2ksIGlfbW91bnQsIGlfc3RvcmFnZXMsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcHJpbnQoImFsbG93X21vdW50OiBpX21vdW50ID0iLCBpX21vdW50KQoKICAgIHNvbWUgcF9tb3VudCBpbiBwX29jaS5Nb3VudHMKICAgIHNvbWUgaV9zdG9yYWdlIGluIGlfc3RvcmFnZXMKCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IHBfbW91bnQgPSIsIHBfbW91bnQpCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IGlfc3RvcmFnZSA9IiwgaV9zdG9yYWdlKQoKICAgIGNoZWNrX21vdW50KHBfbW91bnQsIGlfbW91bnQsIGlfc3RvcmFnZSwgYnVuZGxlX2lkLCBzYW5kYm94X2lkKQoKICAgICMgVE9ETzogYXJlIHRoZXJlIGFueSBvdGhlciByZXF1aXJlZCBwb2xpY3kgY2hlY2tzIGZvciBtb3VudHMgLSBlLmcuLAogICAgIyAgICAgICBtdWx0aXBsZSBtb3VudHMgd2l0aCBzYW1lIHNvdXJjZSBvciBkZXN0aW5hdGlvbj8KCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IHRydWUiKQp9CgpjaGVja19tb3VudChwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcF9tb3VudCA9PSBpX21vdW50CiAgICBwcmludCgiY2hlY2tfbW91bnQgMTogdHJ1ZSIpCn0KY2hlY2tfbW91bnQocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHBfbW91bnQuZGVzdGluYXRpb24gPT0gaV9tb3VudC5kZXN0aW5hdGlvbgogICAgcF9tb3VudC50eXBlXyA9PSBpX21vdW50LnR5cGVfCiAgICBwX21vdW50Lm9wdGlvbnMgPT0gaV9tb3VudC5vcHRpb25zCgogICAgbW91bnRfc291cmNlX2FsbG93cyhwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkKCiAgICBwcmludCgiY2hlY2tfbW91bnQgMjogdHJ1ZSIpCn0KCm1vdW50X3NvdXJjZV9hbGxvd3MocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHJlZ2V4MSA6PSBwX21vdW50LnNvdXJjZQogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5tb3VudF9zb3VyY2VfY3BhdGgpCiAgICByZWdleDQgOj0gcmVwbGFjZShyZWdleDMsICIkKGJ1bmRsZS1pZCkiLCBidW5kbGVfaWQpCgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMTogcmVnZXg0ID0iLCByZWdleDQpCiAgICByZWdleC5tYXRjaChyZWdleDQsIGlfbW91bnQuc291cmNlKQoKICAgIHByaW50KCJtb3VudF9zb3VyY2VfYWxsb3dzIDE6IHRydWUiKQp9Cm1vdW50X3NvdXJjZV9hbGxvd3MocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHJlZ2V4MSA6PSBwX21vdW50LnNvdXJjZQogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5tb3VudF9zb3VyY2VfY3BhdGgpCiAgICByZWdleDQgOj0gcmVwbGFjZShyZWdleDMsICIkKHNhbmRib3gtaWQpIiwgc2FuZGJveF9pZCkKCiAgICBwcmludCgibW91bnRfc291cmNlX2FsbG93cyAyOiByZWdleDQgPSIsIHJlZ2V4NCkKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4NCwgaV9tb3VudC5zb3VyY2UpCgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMjogdHJ1ZSIpCn0KbW91bnRfc291cmNlX2FsbG93cyhwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogaV9tb3VudC5zb3VyY2UgPSIsIGlfbW91bnQuc291cmNlKQogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogaV9zdG9yYWdlLm1vdW50X3BvaW50ID0iLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCgogICAgaV9tb3VudC5zb3VyY2UgPT0gaV9zdG9yYWdlLm1vdW50X3BvaW50CgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogdHJ1ZSIpCn0KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBDcmVhdGUgY29udGFpbmVyIFN0b3JhZ2VzCgphbGxvd19zdG9yYWdlcyhwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHBfY291bnQgOj0gY291bnQocF9zdG9yYWdlcykKICAgIGlfY291bnQgOj0gY291bnQoaV9zdG9yYWdlcykKICAgIHByaW50KCJhbGxvd19zdG9yYWdlczogcF9jb3VudCA9IiwgcF9jb3VudCwgImlfY291bnQgPSIsIGlfY291bnQpCgogICAgcF9jb3VudCA9PSBpX2NvdW50CgogICAgIyBHZXQgdGhlIGNvbnRhaW5lciBpbWFnZSBsYXllciBJRHMgYW5kIHZlcml0eSByb290IGhhc2hlcywgZnJvbSB0aGUgIm92ZXJsYXlmcyIgc3RvcmFnZS4KICAgIHNvbWUgb3ZlcmxheV9zdG9yYWdlIGluIHBfc3RvcmFnZXMKICAgIG92ZXJsYXlfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIHByaW50KCJhbGxvd19zdG9yYWdlczogb3ZlcmxheV9zdG9yYWdlID0iLCBvdmVybGF5X3N0b3JhZ2UpCiAgICBjb3VudChvdmVybGF5X3N0b3JhZ2Uub3B0aW9ucykgPT0gMgoKICAgIGxheWVyX2lkcyA6PSBzcGxpdChvdmVybGF5X3N0b3JhZ2Uub3B0aW9uc1swXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiBsYXllcl9pZHMgPSIsIGxheWVyX2lkcykKCiAgICByb290X2hhc2hlcyA6PSBzcGxpdChvdmVybGF5X3N0b3JhZ2Uub3B0aW9uc1sxXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiByb290X2hhc2hlcyA9Iiwgcm9vdF9oYXNoZXMpCgogICAgZXZlcnkgaV9zdG9yYWdlIGluIGlfc3RvcmFnZXMgewogICAgICAgIGFsbG93X3N0b3JhZ2UocF9zdG9yYWdlcywgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpCiAgICB9CgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiB0cnVlIikKfQoKYWxsb3dfc3RvcmFnZShwX3N0b3JhZ2VzLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgc29tZSBwX3N0b3JhZ2UgaW4gcF9zdG9yYWdlcwoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiBwX3N0b3JhZ2UgPSIsIHBfc3RvcmFnZSkKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiBpX3N0b3JhZ2UgPSIsIGlfc3RvcmFnZSkKCiAgICBwX3N0b3JhZ2UuZHJpdmVyICAgICAgICAgICA9PSBpX3N0b3JhZ2UuZHJpdmVyCiAgICBwX3N0b3JhZ2UuZHJpdmVyX29wdGlvbnMgICA9PSBpX3N0b3JhZ2UuZHJpdmVyX29wdGlvbnMKICAgIHBfc3RvcmFnZS5mc19ncm91cCAgICAgICAgID09IGlfc3RvcmFnZS5mc19ncm91cAogICAgcF9zdG9yYWdlLmZzdHlwZSAgICAgICAgICAgPT0gaV9zdG9yYWdlLmZzdHlwZQoKICAgIGFsbG93X3N0b3JhZ2Vfc291cmNlKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKQogICAgYWxsb3dfc3RvcmFnZV9vcHRpb25zKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKQogICAgYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKQoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiB0cnVlIikKfQoKYWxsb3dfc3RvcmFnZV9zb3VyY2UocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX3NvdXJjZSAxOiBzdGFydCIpCgogICAgcF9zdG9yYWdlLnNvdXJjZSA9PSBpX3N0b3JhZ2Uuc291cmNlCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDE6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX3NvdXJjZShwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDI6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCgogICAgIyBEREREOkJCOkRELkY6IERvbWFpbjpCdXM6RGV2aWNlLkZ1bmN0aW9uCiAgICAjIGh0dHBzOi8vd3d3Lmtlcm5lbC5vcmcvZG9jL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtYnVzLXBjaQogICAgcmVnZXgubWF0Y2goYF5bYS1mMC05XXs0fTpbYS1mMC05XXsyfTpbYS1mMC05XXsyfVwuW2EtZjAtOV0kYCwgaV9zdG9yYWdlLnNvdXJjZSkKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9zb3VyY2UgMjogdHJ1ZSIpCn0KCmFsbG93X3N0b3JhZ2Vfc291cmNlKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKSB7CiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9zb3VyY2UgMzogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIGlfc3RvcmFnZS5zb3VyY2UgPT0gIm5vbmUiCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDM6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX3NvdXJjZShwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDQ6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJzbWIiCgogICAgIyBQYXR0ZXJuOiAvLzxzdG9yYWdlLWFjY291bnQtbmFtZT4uZmlsZS5jb3JlLndpbmRvd3MubmV0LzxrOHMtUFZDLW5hbWU+CiAgICAjIFN0b3JhZ2UgYWNjb3VudCBuYW1lOiBodHRwczovL2xlYXJuLm1pY3Jvc29mdC5jb20vZW4tdXMvYXp1cmUvc3RvcmFnZS9jb21tb24vc3RvcmFnZS1hY2NvdW50LW92ZXJ2aWV3I3N0b3JhZ2UtYWNjb3VudC1uYW1lCiAgICAjIEs4cyBQVkMgbmFtZTogaHR0cHM6Ly9rdWJlcm5ldGVzLmlvL2RvY3MvY29uY2VwdHMvb3ZlcnZpZXcvd29ya2luZy13aXRoLW9iamVjdHMvbmFtZXMvI2Rucy1zdWJkb21haW4tbmFtZXMKICAgIHJlZ2V4Lm1hdGNoKGBeXC9cLyhbYS16MC05XXszLDI0fSlcLmZpbGVcLmNvcmVcLndpbmRvd3NcLm5ldFwvW2EtejAtOV0oW2EtejAtOS4tXXswLDI1MX1bYS16MC05XSk/JGAsIGlfc3RvcmFnZS5zb3VyY2UpCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDQ6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMTogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgIT0gIm92ZXJsYXlmcyIKICAgIHBfc3RvcmFnZS5vcHRpb25zID09IGlfc3RvcmFnZS5vcHRpb25zCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAxOiB0cnVlIikKfQphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIGNvdW50KHBfc3RvcmFnZS5vcHRpb25zKSA9PSAyCgogICAgcG9saWN5X2lkcyA6PSBzcGxpdChwX3N0b3JhZ2Uub3B0aW9uc1swXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBwb2xpY3lfaWRzID0iLCBwb2xpY3lfaWRzKQogICAgcG9saWN5X2lkcyA9PSBsYXllcl9pZHMKCiAgICBwb2xpY3lfaGFzaGVzIDo9IHNwbGl0KHBfc3RvcmFnZS5vcHRpb25zWzFdLCAiOiIpCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IHBvbGljeV9oYXNoZXMgPSIsIHBvbGljeV9oYXNoZXMpCgogICAgcF9jb3VudCA6PSBjb3VudChwb2xpY3lfaWRzKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBwX2NvdW50ID0iLCBwX2NvdW50KQogICAgcF9jb3VudCA+PSAxCiAgICBwX2NvdW50ID09IGNvdW50KHBvbGljeV9oYXNoZXMpCgogICAgaV9jb3VudCA6PSBjb3VudChpX3N0b3JhZ2Uub3B0aW9ucykKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogaV9jb3VudCA9IiwgaV9jb3VudCkKICAgIGlfY291bnQgPT0gcF9jb3VudCArIDMKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zWzBdID0iLCBpX3N0b3JhZ2Uub3B0aW9uc1swXSkKICAgIGlfc3RvcmFnZS5vcHRpb25zWzBdID09ICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQubGF5ZXItc3JjLXByZWZpeD0vdmFyL2xpYi9jb250YWluZXJkL2lvLmNvbnRhaW5lcmQuc25hcHNob3R0ZXIudjEudGFyZGV2L2xheWVycyIKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zW2lfY291bnQgLSAyXSA9IiwgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDJdKQogICAgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDJdID09ICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQub3ZlcmxheS1ydyIKCiAgICBsb3dlcmRpciA6PSBjb25jYXQoIj0iLCBbImxvd2VyZGlyIiwgcF9zdG9yYWdlLm9wdGlvbnNbMF1dKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBsb3dlcmRpciA9IiwgbG93ZXJkaXIpCgogICAgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDFdID09IGxvd2VyZGlyCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zW2lfY291bnQgLSAxXSA9IiwgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDFdKQoKICAgIGV2ZXJ5IGksIHBvbGljeV9pZCBpbiBwb2xpY3lfaWRzIHsKICAgICAgICBhbGxvd19vdmVybGF5X2xheWVyKHBvbGljeV9pZCwgcG9saWN5X2hhc2hlc1tpXSwgaV9zdG9yYWdlLm9wdGlvbnNbaSArIDFdKQogICAgfQoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogdHJ1ZSIpCn0KYWxsb3dfc3RvcmFnZV9vcHRpb25zKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKSB7CiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDM6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCiAgICBjb3VudChwX3N0b3JhZ2Uub3B0aW9ucykgPT0gMQoKICAgIHN0YXJ0c3dpdGgocF9zdG9yYWdlLm9wdGlvbnNbMF0sICIkKGhhc2giKQogICAgaGFzaF9zdWZmaXggOj0gdHJpbV9sZWZ0KHBfc3RvcmFnZS5vcHRpb25zWzBdLCAiJChoYXNoIikKCiAgICBlbmRzd2l0aChoYXNoX3N1ZmZpeCwgIikiKQogICAgaGFzaF9pbmRleCA6PSB0cmltX3JpZ2h0KGhhc2hfc3VmZml4LCAiKSIpCiAgICBpIDo9IHRvX251bWJlcihoYXNoX2luZGV4KQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAzOiBpID0iLCBpKQoKICAgIGhhc2hfb3B0aW9uIDo9IGNvbmNhdCgiPSIsIFsiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LnJvb3QtaGFzaCIsIHJvb3RfaGFzaGVzW2ldXSkKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMzogaGFzaF9vcHRpb24gPSIsIGhhc2hfb3B0aW9uKQoKICAgIGNvdW50KGlfc3RvcmFnZS5vcHRpb25zKSA9PSA0CiAgICBpX3N0b3JhZ2Uub3B0aW9uc1swXSA9PSAicm8iCiAgICBpX3N0b3JhZ2Uub3B0aW9uc1sxXSA9PSAiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmJsb2NrX2RldmljZT1maWxlIgogICAgaV9zdG9yYWdlLm9wdGlvbnNbMl0gPT0gImlvLmthdGFjb250YWluZXJzLmZzLW9wdC5pcy1sYXllciIKICAgIGlfc3RvcmFnZS5vcHRpb25zWzNdID09IGhhc2hfb3B0aW9uCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAzOiB0cnVlIikKfQphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgNDogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gInNtYiIKICAgIHBfb3B0c19jb3VudCA6PSBjb3VudChwX3N0b3JhZ2Uub3B0aW9ucykKICAgIGlfb3B0c19jb3VudCA6PSBjb3VudChpX3N0b3JhZ2Uub3B0aW9ucykKICAgIGlfb3B0c19jb3VudCA9PSBwX29wdHNfY291bnQgKyAyCgogICAgaV9vcHRfbWF0Y2hlcyA6PSBbaSB8IGkgOj0gaWR4OyBpZHggPCBwX29wdHNfY291bnQ7IHBfc3RvcmFnZS5vcHRpb25zW2lkeF0gPT0gaV9zdG9yYWdlLm9wdGlvbnNbaWR4XV0KICAgIGNvdW50KGlfb3B0X21hdGNoZXMpID09IHBfb3B0c19jb3VudAoKICAgIHN0YXJ0c3dpdGgoaV9zdG9yYWdlLm9wdGlvbnNbaV9vcHRzX2NvdW50LTJdLCAiYWRkcj0iKQogICAgY3JlZHMgPSBzcGxpdChpX3N0b3JhZ2Uub3B0aW9uc1tpX29wdHNfY291bnQtMV0sICIsIikKICAgIGNvdW50KGNyZWRzKSA9PSAyCiAgICBzdGFydHN3aXRoKGNyZWRzWzBdLCAidXNlcm5hbWU9IikKICAgIHN0YXJ0c3dpdGgoY3JlZHNbMV0sICJwYXNzd29yZD0iKQogICAgCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDQ6IHRydWUiKQp9CgphbGxvd19vdmVybGF5X2xheWVyKHBvbGljeV9pZCwgcG9saWN5X2hhc2gsIGlfb3B0aW9uKSB7CiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogcG9saWN5X2lkID0iLCBwb2xpY3lfaWQsICJwb2xpY3lfaGFzaCA9IiwgcG9saWN5X2hhc2gpCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogaV9vcHRpb24gPSIsIGlfb3B0aW9uKQoKICAgIHN0YXJ0c3dpdGgoaV9vcHRpb24sICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQubGF5ZXI9IikKICAgIGlfdmFsdWUgOj0gcmVwbGFjZShpX29wdGlvbiwgImlvLmthdGFjb250YWluZXJzLmZzLW9wdC5sYXllcj0iLCAiIikKICAgIGlfdmFsdWVfZGVjb2RlZCA6PSBiYXNlNjQuZGVjb2RlKGlfdmFsdWUpCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogaV92YWx1ZV9kZWNvZGVkID0iLCBpX3ZhbHVlX2RlY29kZWQpCgogICAgcG9saWN5X3N1ZmZpeCA6PSBjb25jYXQoIj0iLCBbInRhcixybyxpby5rYXRhY29udGFpbmVycy5mcy1vcHQuYmxvY2tfZGV2aWNlPWZpbGUsaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmlzLWxheWVyLGlvLmthdGFjb250YWluZXJzLmZzLW9wdC5yb290LWhhc2giLCBwb2xpY3lfaGFzaF0pCiAgICBwX3ZhbHVlIDo9IGNvbmNhdCgiLCIsIFtwb2xpY3lfaWQsIHBvbGljeV9zdWZmaXhdKQogICAgcHJpbnQoImFsbG93X292ZXJsYXlfbGF5ZXI6IHBfdmFsdWUgPSIsIHBfdmFsdWUpCgogICAgcF92YWx1ZSA9PSBpX3ZhbHVlX2RlY29kZWQKCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogdHJ1ZSIpCn0KCmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAidGFyIgoKICAgIHN0YXJ0c3dpdGgocF9zdG9yYWdlLm1vdW50X3BvaW50LCAiJChsYXllciIpCiAgICBtb3VudF9zdWZmaXggOj0gdHJpbV9sZWZ0KHBfc3RvcmFnZS5tb3VudF9wb2ludCwgIiQobGF5ZXIiKQoKICAgIGVuZHN3aXRoKG1vdW50X3N1ZmZpeCwgIikiKQogICAgbGF5ZXJfaW5kZXggOj0gdHJpbV9yaWdodChtb3VudF9zdWZmaXgsICIpIikKICAgIGkgOj0gdG9fbnVtYmVyKGxheWVyX2luZGV4KQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDE6IGkgPSIsIGkpCgogICAgbGF5ZXJfaWQgOj0gbGF5ZXJfaWRzW2ldCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMTogbGF5ZXJfaWQgPSIsIGxheWVyX2lkKQoKICAgIHBfbW91bnQgOj0gY29uY2F0KCIvIiwgWyIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L2xheWVycyIsIGxheWVyX2lkXSkKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCAxOiBwX21vdW50ID0iLCBwX21vdW50KQoKICAgIHBfbW91bnQgPT0gaV9zdG9yYWdlLm1vdW50X3BvaW50CgogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDE6IHRydWUiKQp9CmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAiZnVzZTMua2F0YS1vdmVybGF5IgoKICAgIG1vdW50MSA6PSByZXBsYWNlKHBfc3RvcmFnZS5tb3VudF9wb2ludCwgIiQoY3BhdGgpIiwgcG9saWN5X2RhdGEuY29tbW9uLmNwYXRoKQogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDI6IG1vdW50MiA9IiwgbW91bnQyKQoKICAgIG1vdW50MiA9PSBpX3N0b3JhZ2UubW91bnRfcG9pbnQKCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMjogdHJ1ZSIpCn0KYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKSB7CiAgICBwX3N0b3JhZ2UuZnN0eXBlID09ICJsb2NhbCIKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQyID0iLCBtb3VudDIpCgogICAgbW91bnQzIDo9IHJlcGxhY2UobW91bnQyLCAiJChzYW5kYm94LWlkKSIsIHNhbmRib3hfaWQpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQzID0iLCBtb3VudDMpCgogICAgcmVnZXgubWF0Y2gobW91bnQzLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCgogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDM6IHRydWUiKQp9CmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAiYmluZCIKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNDogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNDogbW91bnQyID0iLCBtb3VudDIpCgogICAgbW91bnQzIDo9IHJlcGxhY2UobW91bnQyLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDQ6IG1vdW50MyA9IiwgbW91bnQzKQoKICAgIHJlZ2V4Lm1hdGNoKG1vdW50MywgaV9zdG9yYWdlLm1vdW50X3BvaW50KQoKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA0OiB0cnVlIikKfQphbGxvd19tb3VudF9wb2ludChwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgYnVuZGxlX2lkLCBzYW5kYm94X2lkLCBsYXllcl9pZHMpIHsKICAgIHBfc3RvcmFnZS5mc3R5cGUgPT0gInRtcGZzIgoKICAgIG1vdW50MSA6PSBwX3N0b3JhZ2UubW91bnRfcG9pbnQKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA1OiBtb3VudDEgPSIsIG1vdW50MSkKCiAgICByZWdleC5tYXRjaChtb3VudDEsIGlfc3RvcmFnZS5tb3VudF9wb2ludCkKCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNTogdHJ1ZSIpCn0KYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKSB7CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogaV9zdG9yYWdlLm1vdW50X3BvaW50ID0iLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCiAgICBhbGxvd19kaXJlY3Rfdm9sX2RyaXZlcihwX3N0b3JhZ2UsIGlfc3RvcmFnZSkKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChzcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQyID0iLCBtb3VudDIpCgogICAgZGlyZWN0X3ZvbF9wYXRoIDo9IGlfc3RvcmFnZS5zb3VyY2UKICAgIG1vdW50MyA6PSByZXBsYWNlKG1vdW50MiwgIiQoYjY0LWRpcmVjdC12b2wtcGF0aCkiLCBiYXNlNjR1cmwuZW5jb2RlKGRpcmVjdF92b2xfcGF0aCkpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQzID0iLCBtb3VudDMpCgogICAgbW91bnQzID09IGlfc3RvcmFnZS5tb3VudF9wb2ludAoKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA2OiB0cnVlIikKfQoKYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIocF9zdG9yYWdlLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19kaXJlY3Rfdm9sX2RyaXZlciAxOiBzdGFydCIpCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCiAgICBwcmludCgiYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIgMTogdHJ1ZSIpCn0KYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIocF9zdG9yYWdlLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19kaXJlY3Rfdm9sX2RyaXZlciAyOiBzdGFydCIpCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJzbWIiCiAgICBwcmludCgiYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIgMjogdHJ1ZSIpCn0KCiMgRXhlY1Byb2Nlc3NSZXF1ZXN0LnByb2Nlc3MuQ2FwYWJpbGl0aWVzCmFsbG93X2V4ZWNfY2FwcyhpX2NhcHMpIHsKICAgIG5vdCBpX2NhcHMuQW1iaWVudAogICAgbm90IGlfY2Fwcy5Cb3VuZGluZwogICAgbm90IGlfY2Fwcy5FZmZlY3RpdmUKICAgIG5vdCBpX2NhcHMuSW5oZXJpdGFibGUKICAgIG5vdCBpX2NhcHMuUGVybWl0dGVkCn0KCiMgT0NJLlByb2Nlc3MuQ2FwYWJpbGl0aWVzCmFsbG93X2NhcHMocF9jYXBzLCBpX2NhcHMpIHsKICAgIHByaW50KCJhbGxvd19jYXBzOiBwb2xpY3kgQW1iaWVudCA9IiwgcF9jYXBzLkFtYmllbnQpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgQW1iaWVudCA9IiwgaV9jYXBzLkFtYmllbnQpCiAgICBtYXRjaF9jYXBzKHBfY2Fwcy5BbWJpZW50LCBpX2NhcHMuQW1iaWVudCkKCiAgICBwcmludCgiYWxsb3dfY2FwczogcG9saWN5IEJvdW5kaW5nID0iLCBwX2NhcHMuQm91bmRpbmcpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgQm91bmRpbmcgPSIsIGlfY2Fwcy5Cb3VuZGluZykKICAgIG1hdGNoX2NhcHMocF9jYXBzLkJvdW5kaW5nLCBpX2NhcHMuQm91bmRpbmcpCgogICAgcHJpbnQoImFsbG93X2NhcHM6IHBvbGljeSBFZmZlY3RpdmUgPSIsIHBfY2Fwcy5FZmZlY3RpdmUpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgRWZmZWN0aXZlID0iLCBpX2NhcHMuRWZmZWN0aXZlKQogICAgbWF0Y2hfY2FwcyhwX2NhcHMuRWZmZWN0aXZlLCBpX2NhcHMuRWZmZWN0aXZlKQoKICAgIHByaW50KCJhbGxvd19jYXBzOiBwb2xpY3kgSW5oZXJpdGFibGUgPSIsIHBfY2Fwcy5Jbmhlcml0YWJsZSkKICAgIHByaW50KCJhbGxvd19jYXBzOiBpbnB1dCBJbmhlcml0YWJsZSA9IiwgaV9jYXBzLkluaGVyaXRhYmxlKQogICAgbWF0Y2hfY2FwcyhwX2NhcHMuSW5oZXJpdGFibGUsIGlfY2Fwcy5Jbmhlcml0YWJsZSkKCiAgICBwcmludCgiYWxsb3dfY2FwczogcG9saWN5IFBlcm1pdHRlZCA9IiwgcF9jYXBzLlBlcm1pdHRlZCkKICAgIHByaW50KCJhbGxvd19jYXBzOiBpbnB1dCBQZXJtaXR0ZWQgPSIsIGlfY2Fwcy5QZXJtaXR0ZWQpCiAgICBtYXRjaF9jYXBzKHBfY2Fwcy5QZXJtaXR0ZWQsIGlfY2Fwcy5QZXJtaXR0ZWQpCn0KCm1hdGNoX2NhcHMocF9jYXBzLCBpX2NhcHMpIHsKICAgIHByaW50KCJtYXRjaF9jYXBzIDE6IHN0YXJ0IikKCiAgICBwX2NhcHMgPT0gaV9jYXBzCgogICAgcHJpbnQoIm1hdGNoX2NhcHMgMTogdHJ1ZSIpCn0KbWF0Y2hfY2FwcyhwX2NhcHMsIGlfY2FwcykgewogICAgcHJpbnQoIm1hdGNoX2NhcHMgMjogc3RhcnQiKQoKICAgIGNvdW50KHBfY2FwcykgPT0gMQogICAgcF9jYXBzWzBdID09ICIkKGRlZmF1bHRfY2FwcykiCgogICAgcHJpbnQoIm1hdGNoX2NhcHMgMjogZGVmYXVsdF9jYXBzID0iLCBwb2xpY3lfZGF0YS5jb21tb24uZGVmYXVsdF9jYXBzKQogICAgcG9saWN5X2RhdGEuY29tbW9uLmRlZmF1bHRfY2FwcyA9PSBpX2NhcHMKCiAgICBwcmludCgibWF0Y2hfY2FwcyAyOiB0cnVlIikKfQptYXRjaF9jYXBzKHBfY2FwcywgaV9jYXBzKSB7CiAgICBwcmludCgibWF0Y2hfY2FwcyAzOiBzdGFydCIpCgogICAgY291bnQocF9jYXBzKSA9PSAxCiAgICBwX2NhcHNbMF0gPT0gIiQocHJpdmlsZWdlZF9jYXBzKSIKCiAgICBwcmludCgibWF0Y2hfY2FwcyAzOiBwcml2aWxlZ2VkX2NhcHMgPSIsIHBvbGljeV9kYXRhLmNvbW1vbi5wcml2aWxlZ2VkX2NhcHMpCiAgICBwb2xpY3lfZGF0YS5jb21tb24ucHJpdmlsZWdlZF9jYXBzID09IGlfY2FwcwoKICAgIHByaW50KCJtYXRjaF9jYXBzIDM6IHRydWUiKQp9CgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgpjaGVja19kaXJlY3RvcnlfdHJhdmVyc2FsKGlfcGF0aCkgewogICAgbm90IHJlZ2V4Lm1hdGNoKCIoXnwvKS4uKCR8LykiLCBpX3BhdGgpCn0KCmNoZWNrX3N5bWxpbmtfc291cmNlKGlfc3JjKSB7CiAgICBpX3NyYyA9PSAiIgogICAgcHJpbnQoImNoZWNrX3N5bWxpbmtfc291cmNlIDE6IHRydWUiKQp9CmNoZWNrX3N5bWxpbmtfc291cmNlKGlfc3JjKSB7CiAgICBpX3NyYyAhPSAiIgogICAgcHJpbnQoImNoZWNrX3N5bWxpbmtfc291cmNlIDI6IGlfc3JjID0iLCBpX3NyYykKCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24uc19zb3VyY2UxLCBpX3NyYykKCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMjogdHJ1ZSIpCn0KY2hlY2tfc3ltbGlua19zb3VyY2UoaV9zcmMpIHsKICAgIGlfc3JjICE9ICIiCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMzogaV9zcmMgPSIsIGlfc3JjKQoKICAgIHJlZ2V4Lm1hdGNoKHBvbGljeV9kYXRhLmNvbW1vbi5zX3NvdXJjZTIsIGlfc3JjKQogICAgY2hlY2tfZGlyZWN0b3J5X3RyYXZlcnNhbChpX3NyYykKCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMzogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfc3RvcmFnZXMoaV9zdG9yYWdlcykgewogICAgcHJpbnQoImFsbG93X3NhbmRib3hfc3RvcmFnZXM6IGlfc3RvcmFnZXMgPSIsIGlfc3RvcmFnZXMpCgogICAgcF9zdG9yYWdlcyA6PSBwb2xpY3lfZGF0YS5zYW5kYm94LnN0b3JhZ2VzCiAgICBldmVyeSBpX3N0b3JhZ2UgaW4gaV9zdG9yYWdlcyB7CiAgICAgICAgYWxsb3dfc2FuZGJveF9zdG9yYWdlKHBfc3RvcmFnZXMsIGlfc3RvcmFnZSkKICAgIH0KCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9zdG9yYWdlczogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfc3RvcmFnZShwX3N0b3JhZ2VzLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IGlfc3RvcmFnZSA9IiwgaV9zdG9yYWdlKQoKICAgIHNvbWUgcF9zdG9yYWdlIGluIHBfc3RvcmFnZXMKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IHBfc3RvcmFnZSA9IiwgcF9zdG9yYWdlKQogICAgaV9zdG9yYWdlID09IHBfc3RvcmFnZQoKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IHRydWUiKQp9CgpDb3B5RmlsZVJlcXVlc3QgewogICAgcHJpbnQoIkNvcHlGaWxlUmVxdWVzdDogaW5wdXQucGF0aCA9IiwgaW5wdXQucGF0aCkKCiAgICBjaGVja19zeW1saW5rX3NvdXJjZShpbnB1dC5zeW1saW5rX3NyYykKICAgIGNoZWNrX2RpcmVjdG9yeV90cmF2ZXJzYWwoaW5wdXQucGF0aCkKCiAgICBzb21lIHJlZ2V4MSBpbiBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLkNvcHlGaWxlUmVxdWVzdAogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5jcGF0aCkKICAgIHJlZ2V4NCA6PSByZXBsYWNlKHJlZ2V4MywgIiQoYnVuZGxlLWlkKSIsIEJVTkRMRV9JRCkKICAgIHByaW50KCJDb3B5RmlsZVJlcXVlc3Q6IHJlZ2V4NCA9IiwgcmVnZXg0KQoKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4NCwgaW5wdXQucGF0aCkKCiAgICBwcmludCgiQ29weUZpbGVSZXF1ZXN0OiB0cnVlIikKfQoKQ3JlYXRlU2FuZGJveFJlcXVlc3QgewogICAgcHJpbnQoIkNyZWF0ZVNhbmRib3hSZXF1ZXN0OiBpbnB1dC5ndWVzdF9ob29rX3BhdGggPSIsIGlucHV0Lmd1ZXN0X2hvb2tfcGF0aCkKICAgIGNvdW50KGlucHV0Lmd1ZXN0X2hvb2tfcGF0aCkgPT0gMAoKICAgIHByaW50KCJDcmVhdGVTYW5kYm94UmVxdWVzdDogaW5wdXQua2VybmVsX21vZHVsZXMgPSIsIGlucHV0Lmtlcm5lbF9tb2R1bGVzKQogICAgY291bnQoaW5wdXQua2VybmVsX21vZHVsZXMpID09IDAKCiAgICBpX3BpZG5zIDo9IGlucHV0LnNhbmRib3hfcGlkbnMKICAgIHByaW50KCJDcmVhdGVTYW5kYm94UmVxdWVzdDogaV9waWRucyA9IiwgaV9waWRucykKICAgIGlfcGlkbnMgPT0gZmFsc2UKICAgIGFsbG93X3NhbmRib3hfc3RvcmFnZXMoaW5wdXQuc3RvcmFnZXMpCn0KCmFsbG93X2V4ZWMocF9jb250YWluZXIsIGlfcHJvY2VzcykgewogICAgcHJpbnQoImFsbG93X2V4ZWM6IHN0YXJ0IikKCiAgICBwX29jaSA9IHBfY29udGFpbmVyLk9DSQogICAgcF9zX25hbWUgPSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc19uYW1lc3BhY2UgPSBnZXRfc3RhdGVfdmFsKCJuYW1lc3BhY2UiKQogICAgYWxsb3dfcHJvYmVfcHJvY2VzcyhwX29jaS5Qcm9jZXNzLCBpX3Byb2Nlc3MsIHBfc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfZXhlYzogdHJ1ZSIpCn0KCmFsbG93X2ludGVyYWN0aXZlX2V4ZWMocF9jb250YWluZXIsIGlfcHJvY2VzcykgewogICAgcHJpbnQoImFsbG93X2ludGVyYWN0aXZlX2V4ZWM6IHN0YXJ0IikKCiAgICBwX29jaSA9IHBfY29udGFpbmVyLk9DSQogICAgcF9zX25hbWUgPSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc19uYW1lc3BhY2UgPSBnZXRfc3RhdGVfdmFsKCJuYW1lc3BhY2UiKQogICAgYWxsb3dfaW50ZXJhY3RpdmVfcHJvY2VzcyhwX29jaS5Qcm9jZXNzLCBpX3Byb2Nlc3MsIHBfc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfaW50ZXJhY3RpdmVfZXhlYzogdHJ1ZSIpCn0KCiMgVE9ETzogc2hvdWxkIG90aGVyIEV4ZWNQcm9jZXNzUmVxdWVzdCBpbnB1dCBkYXRhIGZpZWxkcyBiZSB2YWxpZGF0ZWQgYXMgd2VsbD8KRXhlY1Byb2Nlc3NSZXF1ZXN0IHsKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMTogaW5wdXQgPSIsIGlucHV0KQoKICAgIHNvbWUgcF9jb21tYW5kIGluIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuRXhlY1Byb2Nlc3NSZXF1ZXN0LmFsbG93ZWRfY29tbWFuZHMKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMTogcF9jb21tYW5kID0iLCBwX2NvbW1hbmQpCiAgICBwX2NvbW1hbmQgPT0gaW5wdXQucHJvY2Vzcy5BcmdzCgogICAgIyBUT0RPOiBtYXRjaCBwX2NvbnRhaW5lcidzIElEIHdpdGggdGhlIGlucHV0IGNvbnRhaW5lcl9pZC4KICAgIHNvbWUgcF9jb250YWluZXIgaW4gcG9saWN5X2RhdGEuY29udGFpbmVycwogICAgYWxsb3dfaW50ZXJhY3RpdmVfZXhlYyhwX2NvbnRhaW5lciwgaW5wdXQucHJvY2VzcykKCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDE6IHRydWUiKQp9CkV4ZWNQcm9jZXNzUmVxdWVzdCB7CiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDI6IGlucHV0ID0iLCBpbnB1dCkKCiAgICAjIFRPRE86IG1hdGNoIGlucHV0IGNvbnRhaW5lciBJRCB3aXRoIGl0cyBjb3JyZXNwb25kaW5nIGNvbnRhaW5lci5leGVjX2NvbW1hbmRzLgogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBzb21lIHBfY29tbWFuZCBpbiBwX2NvbnRhaW5lci5leGVjX2NvbW1hbmRzCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDI6IHBfY29tbWFuZCA9IiwgcF9jb21tYW5kKQoKICAgICMgVE9ETzogc2hvdWxkIG90aGVyIGlucHV0IGRhdGEgZmllbGRzIGJlIHZhbGlkYXRlZCBhcyB3ZWxsPwogICAgcF9jb21tYW5kID09IGlucHV0LnByb2Nlc3MuQXJncwoKICAgIGFsbG93X2V4ZWMocF9jb250YWluZXIsIGlucHV0LnByb2Nlc3MpCgogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAyOiB0cnVlIikKfQpFeGVjUHJvY2Vzc1JlcXVlc3QgewogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAzOiBpbnB1dCA9IiwgaW5wdXQpCgogICAgaV9jb21tYW5kID0gY29uY2F0KCIgIiwgaW5wdXQucHJvY2Vzcy5BcmdzKQogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAzOiBpX2NvbW1hbmQgPSIsIGlfY29tbWFuZCkKCiAgICBzb21lIHBfcmVnZXggaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5FeGVjUHJvY2Vzc1JlcXVlc3QucmVnZXgKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMzogcF9yZWdleCA9IiwgcF9yZWdleCkKCiAgICByZWdleC5tYXRjaChwX3JlZ2V4LCBpX2NvbW1hbmQpCgogICAgIyBUT0RPOiBtYXRjaCBwX2NvbnRhaW5lcidzIElEIHdpdGggdGhlIGlucHV0IGNvbnRhaW5lcl9pZC4KICAgIHNvbWUgcF9jb250YWluZXIgaW4gcG9saWN5X2RhdGEuY29udGFpbmVycwogICAgYWxsb3dfaW50ZXJhY3RpdmVfZXhlYyhwX2NvbnRhaW5lciwgaW5wdXQucHJvY2VzcykKCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDM6IHRydWUiKQp9CgpVcGRhdGVSb3V0ZXNSZXF1ZXN0IHsKICAgIHByaW50KCJVcGRhdGVSb3V0ZXNSZXF1ZXN0OiBpbnB1dCA9IiwgaW5wdXQpCiAgICBwcmludCgiVXBkYXRlUm91dGVzUmVxdWVzdDogcG9saWN5ID0iLCBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLlVwZGF0ZVJvdXRlc1JlcXVlc3QpCgogICAgaV9yb3V0ZXMgOj0gaW5wdXQucm91dGVzLlJvdXRlcwogICAgcF9zb3VyY2VfcmVnZXggPSBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLlVwZGF0ZVJvdXRlc1JlcXVlc3QuZm9yYmlkZGVuX3NvdXJjZV9yZWdleAogICAgcF9uYW1lcyA9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuVXBkYXRlUm91dGVzUmVxdWVzdC5mb3JiaWRkZW5fZGV2aWNlX25hbWVzCgogICAgZXZlcnkgaV9yb3V0ZSBpbiBpX3JvdXRlcyB7CiAgICAgICAgcHJpbnQoImlfcm91dGUuc291cmNlID0iLCBpX3JvdXRlLnNvdXJjZSkKICAgICAgICBldmVyeSBwX3JlZ2V4IGluIHBfc291cmNlX3JlZ2V4IHsKICAgICAgICAgICAgcHJpbnQoInBfcmVnZXggPSIsIHBfcmVnZXgpCiAgICAgICAgICAgIG5vdCByZWdleC5tYXRjaChwX3JlZ2V4LCBpX3JvdXRlLnNvdXJjZSkKICAgICAgICB9CgogICAgICAgIHByaW50KCJpX3JvdXRlLmRldmljZSA9IiwgaV9yb3V0ZS5kZXZpY2UpCiAgICAgICAgbm90IGlfcm91dGUuZGV2aWNlIGluIHBfbmFtZXMKICAgIH0KCiAgICBwcmludCgiVXBkYXRlUm91dGVzUmVxdWVzdDogdHJ1ZSIpCn0KClVwZGF0ZUludGVyZmFjZVJlcXVlc3QgewogICAgcHJpbnQoIlVwZGF0ZUludGVyZmFjZVJlcXVlc3Q6IGlucHV0ID0iLCBpbnB1dCkKICAgIHByaW50KCJVcGRhdGVJbnRlcmZhY2VSZXF1ZXN0OiBwb2xpY3kgPSIsIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuVXBkYXRlSW50ZXJmYWNlUmVxdWVzdCkKCiAgICBpX2ludGVyZmFjZSA6PSBpbnB1dC5pbnRlcmZhY2UKICAgIHBfZmxhZ3MgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmFsbG93X3Jhd19mbGFncwoKICAgICMgVHlwaWNhbGx5LCBqdXN0IElGRl9OT0FSUCBpcyB1c2VkLgogICAgYml0cy5hbmQoaV9pbnRlcmZhY2UucmF3X2ZsYWdzLCBiaXRzLm5lZ2F0ZShwX2ZsYWdzKSkgPT0gMAoKICAgIHBfbmFtZXMgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmZvcmJpZGRlbl9uYW1lcwoKICAgIG5vdCBpX2ludGVyZmFjZS5uYW1lIGluIHBfbmFtZXMKCiAgICBwX2h3YWRkcnMgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmZvcmJpZGRlbl9od19hZGRycwoKICAgIG5vdCBpX2ludGVyZmFjZS5od0FkZHIgaW4gcF9od2FkZHJzCgogICAgcHJpbnQoIlVwZGF0ZUludGVyZmFjZVJlcXVlc3Q6IHRydWUiKQp9CgpDbG9zZVN0ZGluUmVxdWVzdCB7CiAgICBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLkNsb3NlU3RkaW5SZXF1ZXN0ID09IHRydWUKfQoKUmVhZFN0cmVhbVJlcXVlc3QgewogICAgcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5SZWFkU3RyZWFtUmVxdWVzdCA9PSB0cnVlCn0KClVwZGF0ZUVwaGVtZXJhbE1vdW50c1JlcXVlc3QgewogICAgcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVFcGhlbWVyYWxNb3VudHNSZXF1ZXN0ID09IHRydWUKfQoKV3JpdGVTdHJlYW1SZXF1ZXN0IHsKICAgIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuV3JpdGVTdHJlYW1SZXF1ZXN0ID09IHRydWUKfQoKcG9saWN5X2RhdGEgOj0gewogICJjb250YWluZXJzIjogWwogICAgewogICAgICAiT0NJIjogewogICAgICAgICJWZXJzaW9uIjogIjEuMS4wLXJjLjEiLAogICAgICAgICJQcm9jZXNzIjogewogICAgICAgICAgIlRlcm1pbmFsIjogZmFsc2UsCiAgICAgICAgICAiVXNlciI6IHsKICAgICAgICAgICAgIlVJRCI6IDY1NTM1LAogICAgICAgICAgICAiR0lEIjogNjU1MzUsCiAgICAgICAgICAgICJBZGRpdGlvbmFsR2lkcyI6IFtdLAogICAgICAgICAgICAiVXNlcm5hbWUiOiAiIgogICAgICAgICAgfSwKICAgICAgICAgICJEZXByZWNhdGVkQXJncyI6IFsKICAgICAgICAgICAgIi9wYXVzZSIKICAgICAgICAgIF0sCiAgICAgICAgICAiQXJncyI6IFsKICAgICAgICAgICAgIi9wYXVzZSIKICAgICAgICAgIF0sCiAgICAgICAgICAiRW52IjogWwogICAgICAgICAgICAiUEFUSD0vdXNyL2xvY2FsL3NiaW46L3Vzci9sb2NhbC9iaW46L3Vzci9zYmluOi91c3IvYmluOi9zYmluOi9iaW4iCiAgICAgICAgICBdLAogICAgICAgICAgIkN3ZCI6ICIvIiwKICAgICAgICAgICJDYXBhYmlsaXRpZXMiOiB7CiAgICAgICAgICAgICJBbWJpZW50IjogW10sCiAgICAgICAgICAgICJCb3VuZGluZyI6IFsKICAgICAgICAgICAgICAiJChkZWZhdWx0X2NhcHMpIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiRWZmZWN0aXZlIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJJbmhlcml0YWJsZSI6IFtdLAogICAgICAgICAgICAiUGVybWl0dGVkIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICAiTm9OZXdQcml2aWxlZ2VzIjogdHJ1ZQogICAgICAgIH0sCiAgICAgICAgIlJvb3QiOiB7CiAgICAgICAgICAiUGF0aCI6ICIkKGNwYXRoKS8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgIlJlYWRvbmx5IjogdHJ1ZQogICAgICAgIH0sCiAgICAgICAgIk1vdW50cyI6IFsKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9wcm9jIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJwcm9jIiwKICAgICAgICAgICAgInR5cGVfIjogInByb2MiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2IiwKICAgICAgICAgICAgInNvdXJjZSI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJzdHJpY3RhdGltZSIsCiAgICAgICAgICAgICAgIm1vZGU9NzU1IiwKICAgICAgICAgICAgICAic2l6ZT02NTUzNmsiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L3B0cyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiZGV2cHRzIiwKICAgICAgICAgICAgInR5cGVfIjogImRldnB0cyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJuZXdpbnN0YW5jZSIsCiAgICAgICAgICAgICAgInB0bXhtb2RlPTA2NjYiLAogICAgICAgICAgICAgICJtb2RlPTA2MjAiLAogICAgICAgICAgICAgICJnaWQ9NSIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvc2htIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L3NobSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi9tcXVldWUiLAogICAgICAgICAgICAic291cmNlIjogIm1xdWV1ZSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJtcXVldWUiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvc3lzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJzeXNmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJzeXNmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2V0Yy9yZXNvbHYuY29uZiIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClyZXNvbHYuY29uZiQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJvIiwKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9kZXYiLAogICAgICAgICAgICAgICJub2V4ZWMiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0KICAgICAgICBdLAogICAgICAgICJBbm5vdGF0aW9ucyI6IHsKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmJ1bmRsZV9wYXRoIjogIi9ydW4vY29udGFpbmVyZC9pby5jb250YWluZXJkLnJ1bnRpbWUudjIudGFzay9rOHMuaW8vJChidW5kbGUtaWQpIiwKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIjogInBvZF9zYW5kYm94IiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSI6ICJzYW5kYm94IiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWlkIjogIl5bYS16MC05XXs2NH0kIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWxvZy1kaXJlY3RvcnkiOiAiXi92YXIvbG9nL3BvZHMvJChzYW5kYm94LW5hbWVzcGFjZSlfJChzYW5kYm94LW5hbWUpX1swLTlhLWZdezh9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezEyfSQiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZSI6ICJeY20yJCIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1uYW1lc3BhY2UiOiAiIiwKICAgICAgICAgICJuZXJkY3RsL25ldHdvcmstbmFtZXNwYWNlIjogIl4vdmFyL3J1bi9uZXRucy9jbmktWzAtOWEtZl17OH0tWzAtOWEtZl17NH0tWzAtOWEtZl17NH0tWzAtOWEtZl17NH0tWzAtOWEtZl17MTJ9JCIKICAgICAgICB9LAogICAgICAgICJMaW51eCI6IHsKICAgICAgICAgICJOYW1lc3BhY2VzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgIlR5cGUiOiAiaXBjIiwKICAgICAgICAgICAgICAiUGF0aCI6ICIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiVHlwZSI6ICJ1dHMiLAogICAgICAgICAgICAgICJQYXRoIjogIiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJUeXBlIjogIm1vdW50IiwKICAgICAgICAgICAgICAiUGF0aCI6ICIiCiAgICAgICAgICAgIH0KICAgICAgICAgIF0sCiAgICAgICAgICAiTWFza2VkUGF0aHMiOiBbCiAgICAgICAgICAgICIvcHJvYy9hY3BpIiwKICAgICAgICAgICAgIi9wcm9jL2Fzb3VuZCIsCiAgICAgICAgICAgICIvcHJvYy9rY29yZSIsCiAgICAgICAgICAgICIvcHJvYy9rZXlzIiwKICAgICAgICAgICAgIi9wcm9jL2xhdGVuY3lfc3RhdHMiLAogICAgICAgICAgICAiL3Byb2MvdGltZXJfbGlzdCIsCiAgICAgICAgICAgICIvcHJvYy90aW1lcl9zdGF0cyIsCiAgICAgICAgICAgICIvcHJvYy9zY2hlZF9kZWJ1ZyIsCiAgICAgICAgICAgICIvc3lzL2Zpcm13YXJlIiwKICAgICAgICAgICAgIi9wcm9jL3Njc2kiCiAgICAgICAgICBdLAogICAgICAgICAgIlJlYWRvbmx5UGF0aHMiOiBbCiAgICAgICAgICAgICIvcHJvYy9idXMiLAogICAgICAgICAgICAiL3Byb2MvZnMiLAogICAgICAgICAgICAiL3Byb2MvaXJxIiwKICAgICAgICAgICAgIi9wcm9jL3N5cyIsCiAgICAgICAgICAgICIvcHJvYy9zeXNycS10cmlnZ2VyIgogICAgICAgICAgXSwKICAgICAgICAgICJEZXZpY2VzIjogW10sCiAgICAgICAgICAiU3lzY3RsIjogewogICAgICAgICAgICAibmV0LmlwdjQuaXBfdW5wcml2aWxlZ2VkX3BvcnRfc3RhcnQiOiAiMCIsCiAgICAgICAgICAgICJuZXQuaXB2NC5waW5nX2dyb3VwX3JhbmdlIjogIjAgMjE0NzQ4MzY0NyIKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0sCiAgICAgICJzdG9yYWdlcyI6IFsKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoMCkiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXIwKSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogIm92ZXJsYXlmcyIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAiZnVzZTMua2F0YS1vdmVybGF5IiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiNWE1YWFkODAwNTVmZjIwMDEyYTUwZGMyNWY4ZGY3YTI5OTI0NDc0MzI0ZDY1ZjdkNTMwNmVlOGVlMjdmZjcxZCIsCiAgICAgICAgICAgICI4MTcyNTBmMWEzZTMzNmRhNzZmNWJkM2ZhNzg0ZTFiMjZkOTU5YjljMTMxODc2ODE1YmEyNjA0MDQ4YjcwYzE4IgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGNwYXRoKS8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0KICAgICAgXSwKICAgICAgImRldmljZXMiOiBbXSwKICAgICAgInNhbmRib3hfcGlkbnMiOiBmYWxzZSwKICAgICAgImV4ZWNfY29tbWFuZHMiOiBbXSwKICAgICAgImVudl9tYXAiOiB7CiAgICAgICAgIlBBVEgiOiAiL3Vzci9sb2NhbC9zYmluOi91c3IvbG9jYWwvYmluOi91c3Ivc2JpbjovdXNyL2Jpbjovc2JpbjovYmluIgogICAgICB9CiAgICB9LAogICAgewogICAgICAiT0NJIjogewogICAgICAgICJWZXJzaW9uIjogIjEuMS4wLXJjLjEiLAogICAgICAgICJQcm9jZXNzIjogewogICAgICAgICAgIlRlcm1pbmFsIjogZmFsc2UsCiAgICAgICAgICAiVXNlciI6IHsKICAgICAgICAgICAgIlVJRCI6IDEyMywKICAgICAgICAgICAgIkdJRCI6IDAsCiAgICAgICAgICAgICJBZGRpdGlvbmFsR2lkcyI6IFtdLAogICAgICAgICAgICAiVXNlcm5hbWUiOiAiIgogICAgICAgICAgfSwKICAgICAgICAgICJEZXByZWNhdGVkQXJncyI6IFsKICAgICAgICAgICAgIi9iaW4vc2giLAogICAgICAgICAgICAiLWMiLAogICAgICAgICAgICAid2hpbGUgdHJ1ZTsgZG8gZWNobyBoZWxsbzsgc2xlZXAgMTA7IGRvbmUiCiAgICAgICAgICBdLAogICAgICAgICAgIkFyZ3MiOiBbCiAgICAgICAgICAgICIvYmluL3NoIiwKICAgICAgICAgICAgIi1jIiwKICAgICAgICAgICAgIndoaWxlIHRydWU7IGRvIGVjaG8gaGVsbG87IHNsZWVwIDEwOyBkb25lIgogICAgICAgICAgXSwKICAgICAgICAgICJFbnYiOiBbCiAgICAgICAgICAgICJQQVRIPS91c3IvbG9jYWwvc2JpbjovdXNyL2xvY2FsL2JpbjovdXNyL3NiaW46L3Vzci9iaW46L3NiaW46L2JpbiIsCiAgICAgICAgICAgICJIT1NUTkFNRT0kKGhvc3QtbmFtZSkiCiAgICAgICAgICBdLAogICAgICAgICAgIkN3ZCI6ICIvIiwKICAgICAgICAgICJDYXBhYmlsaXRpZXMiOiB7CiAgICAgICAgICAgICJBbWJpZW50IjogW10sCiAgICAgICAgICAgICJCb3VuZGluZyI6IFsKICAgICAgICAgICAgICAiJChkZWZhdWx0X2NhcHMpIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiRWZmZWN0aXZlIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJJbmhlcml0YWJsZSI6IFtdLAogICAgICAgICAgICAiUGVybWl0dGVkIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICAiTm9OZXdQcml2aWxlZ2VzIjogZmFsc2UKICAgICAgICB9LAogICAgICAgICJSb290IjogewogICAgICAgICAgIlBhdGgiOiAiJChjcGF0aCkvJChidW5kbGUtaWQpIiwKICAgICAgICAgICJSZWFkb25seSI6IGZhbHNlCiAgICAgICAgfSwKICAgICAgICAiTW91bnRzIjogWwogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL3Byb2MiLAogICAgICAgICAgICAic291cmNlIjogInByb2MiLAogICAgICAgICAgICAidHlwZV8iOiAicHJvYyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYiLAogICAgICAgICAgICAic291cmNlIjogInRtcGZzIiwKICAgICAgICAgICAgInR5cGVfIjogInRtcGZzIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgInN0cmljdGF0aW1lIiwKICAgICAgICAgICAgICAibW9kZT03NTUiLAogICAgICAgICAgICAgICJzaXplPTY1NTM2ayIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvcHRzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJkZXZwdHMiLAogICAgICAgICAgICAidHlwZV8iOiAiZGV2cHRzIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAgICAgIm5ld2luc3RhbmNlIiwKICAgICAgICAgICAgICAicHRteG1vZGU9MDY2NiIsCiAgICAgICAgICAgICAgIm1vZGU9MDYyMCIsCiAgICAgICAgICAgICAgImdpZD01IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi9zaG0iLAogICAgICAgICAgICAic291cmNlIjogIi9ydW4va2F0YS1jb250YWluZXJzL3NhbmRib3gvc2htIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L21xdWV1ZSIsCiAgICAgICAgICAgICJzb3VyY2UiOiAibXF1ZXVlIiwKICAgICAgICAgICAgInR5cGVfIjogIm1xdWV1ZSIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9zeXMiLAogICAgICAgICAgICAic291cmNlIjogInN5c2ZzIiwKICAgICAgICAgICAgInR5cGVfIjogInN5c2ZzIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAgICAgIm5vZGV2IiwKICAgICAgICAgICAgICAicm8iCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvc3lzL2ZzL2Nncm91cCIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiY2dyb3VwIiwKICAgICAgICAgICAgInR5cGVfIjogImNncm91cCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIsCiAgICAgICAgICAgICAgInJlbGF0aW1lIiwKICAgICAgICAgICAgICAicm8iCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZXRjL2hvc3RzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KWhvc3RzJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJydyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvdGVybWluYXRpb24tbG9nIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KXRlcm1pbmF0aW9uLWxvZyQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicnciCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZXRjL2hvc3RuYW1lIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KWhvc3RuYW1lJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJydyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9ldGMvcmVzb2x2LmNvbmYiLAogICAgICAgICAgICAic291cmNlIjogIiQoc2ZwcmVmaXgpcmVzb2x2LmNvbmYkIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJ3IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL3Zhci9ydW4vc2VjcmV0cy9rdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50IiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KXNlcnZpY2VhY2NvdW50JCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJybyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi92YXIvcnVuL3NlY3JldHMvYXp1cmUvdG9rZW5zIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KXRva2VucyQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicm8iCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvY20yIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KWNtMiQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicm8iCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvY20zIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KWNtMyQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicm8iCiAgICAgICAgICAgIF0KICAgICAgICAgIH0KICAgICAgICBdLAogICAgICAgICJBbm5vdGF0aW9ucyI6IHsKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmJ1bmRsZV9wYXRoIjogIi9ydW4vY29udGFpbmVyZC9pby5jb250YWluZXJkLnJ1bnRpbWUudjIudGFzay9rOHMuaW8vJChidW5kbGUtaWQpIiwKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIjogInBvZF9jb250YWluZXIiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLmNvbnRhaW5lci1uYW1lIjogImJ1c3lib3giLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLmNvbnRhaW5lci10eXBlIjogImNvbnRhaW5lciIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuaW1hZ2UtbmFtZSI6ICJtY3IubWljcm9zb2Z0LmNvbS9ha3MvZTJlL2xpYnJhcnktYnVzeWJveDptYXN0ZXIuMjIwMzE0LjEtbGludXgtYW1kNjQiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtaWQiOiAiXlthLXowLTldezY0fSQiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZSI6ICJeY20yJCIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1uYW1lc3BhY2UiOiAiIgogICAgICAgIH0sCiAgICAgICAgIkxpbnV4IjogewogICAgICAgICAgIk5hbWVzcGFjZXMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiVHlwZSI6ICJpcGMiLAogICAgICAgICAgICAgICJQYXRoIjogIiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJUeXBlIjogInV0cyIsCiAgICAgICAgICAgICAgIlBhdGgiOiAiIgogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgIlR5cGUiOiAibW91bnQiLAogICAgICAgICAgICAgICJQYXRoIjogIiIKICAgICAgICAgICAgfQogICAgICAgICAgXSwKICAgICAgICAgICJNYXNrZWRQYXRocyI6IFsKICAgICAgICAgICAgIi9wcm9jL2FjcGkiLAogICAgICAgICAgICAiL3Byb2Mva2NvcmUiLAogICAgICAgICAgICAiL3Byb2Mva2V5cyIsCiAgICAgICAgICAgICIvcHJvYy9sYXRlbmN5X3N0YXRzIiwKICAgICAgICAgICAgIi9wcm9jL3RpbWVyX2xpc3QiLAogICAgICAgICAgICAiL3Byb2MvdGltZXJfc3RhdHMiLAogICAgICAgICAgICAiL3Byb2Mvc2NoZWRfZGVidWciLAogICAgICAgICAgICAiL3Byb2Mvc2NzaSIsCiAgICAgICAgICAgICIvc3lzL2Zpcm13YXJlIgogICAgICAgICAgXSwKICAgICAgICAgICJSZWFkb25seVBhdGhzIjogWwogICAgICAgICAgICAiL3Byb2MvYXNvdW5kIiwKICAgICAgICAgICAgIi9wcm9jL2J1cyIsCiAgICAgICAgICAgICIvcHJvYy9mcyIsCiAgICAgICAgICAgICIvcHJvYy9pcnEiLAogICAgICAgICAgICAiL3Byb2Mvc3lzIiwKICAgICAgICAgICAgIi9wcm9jL3N5c3JxLXRyaWdnZXIiCiAgICAgICAgICBdLAogICAgICAgICAgIkRldmljZXMiOiBbXSwKICAgICAgICAgICJTeXNjdGwiOiB7CiAgICAgICAgICAgICJuZXQuaXB2NC5pcF91bnByaXZpbGVnZWRfcG9ydF9zdGFydCI6ICIwIiwKICAgICAgICAgICAgIm5ldC5pcHY0LnBpbmdfZ3JvdXBfcmFuZ2UiOiAiMCAyMTQ3NDgzNjQ3IgogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSwKICAgICAgInN0b3JhZ2VzIjogWwogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2gwKSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjApIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2gxKSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjEpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAib3ZlcmxheWZzIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJmdXNlMy5rYXRhLW92ZXJsYXkiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIyYzM0MmExMzdlNjkzYzc4OThhZWMzNmRhMTA0N2YxOTFkYzdjMTY4N2U2NjE5OGFkYWNjNDM5Y2Y0YWRmMzc5OjI1NzBlM2ExOWUxYmYyMGRkZGE0NTQ5OGE5NjI3ZjYxNTU1ZDJkNmMwMTQ3OWI5Yjc2NDYwYjY3OWIyN2Q1NTIiLAogICAgICAgICAgICAiODU2OGM3MGMwY2NmZTAwNTEwOTJlODE4ZGE3NjkxMTFhNTk4ODJjZDE5ZGQ3OTlkM2JjYTVmZmE4Mjc5MTA4MDpiNjQzYjYyMTc3NDg5ODM4MzBiMjZhYzE0YTM1YTMzMjJkZDUyOGMwMDk2M2VhYWRkOTFlZjU1ZjUxM2RjNzNmIgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGNwYXRoKS8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0KICAgICAgXSwKICAgICAgImRldmljZXMiOiBbXSwKICAgICAgInNhbmRib3hfcGlkbnMiOiB0cnVlLAogICAgICAiZXhlY19jb21tYW5kcyI6IFtdLAogICAgICAiZW52X21hcCI6IHsKICAgICAgICAiSE9TVE5BTUUiOiAiJChob3N0LW5hbWUpIiwKICAgICAgICAiUEFUSCI6ICIvdXNyL2xvY2FsL3NiaW46L3Vzci9sb2NhbC9iaW46L3Vzci9zYmluOi91c3IvYmluOi9zYmluOi9iaW4iCiAgICAgIH0KICAgIH0sCiAgICB7CiAgICAgICJPQ0kiOiB7CiAgICAgICAgIlZlcnNpb24iOiAiMS4xLjAtcmMuMSIsCiAgICAgICAgIlByb2Nlc3MiOiB7CiAgICAgICAgICAiVGVybWluYWwiOiBmYWxzZSwKICAgICAgICAgICJVc2VyIjogewogICAgICAgICAgICAiVUlEIjogMzIxLAogICAgICAgICAgICAiR0lEIjogMCwKICAgICAgICAgICAgIkFkZGl0aW9uYWxHaWRzIjogW10sCiAgICAgICAgICAgICJVc2VybmFtZSI6ICIiCiAgICAgICAgICB9LAogICAgICAgICAgIkRlcHJlY2F0ZWRBcmdzIjogWwogICAgICAgICAgICAiL2Jpbi9zaCIsCiAgICAgICAgICAgICItYyIsCiAgICAgICAgICAgICJ3aGlsZSB0cnVlOyBkbyBlY2hvIGhlbGxvOyBzbGVlcCAxMDsgZG9uZSIKICAgICAgICAgIF0sCiAgICAgICAgICAiQXJncyI6IFsKICAgICAgICAgICAgIi9iaW4vc2giLAogICAgICAgICAgICAiLWMiLAogICAgICAgICAgICAid2hpbGUgdHJ1ZTsgZG8gZWNobyBoZWxsbzsgc2xlZXAgMTA7IGRvbmUiCiAgICAgICAgICBdLAogICAgICAgICAgIkVudiI6IFsKICAgICAgICAgICAgIlBBVEg9L3Vzci9sb2NhbC9zYmluOi91c3IvbG9jYWwvYmluOi91c3Ivc2JpbjovdXNyL2Jpbjovc2JpbjovYmluIiwKICAgICAgICAgICAgIkhPU1ROQU1FPSQoaG9zdC1uYW1lKSIKICAgICAgICAgIF0sCiAgICAgICAgICAiQ3dkIjogIi8iLAogICAgICAgICAgIkNhcGFiaWxpdGllcyI6IHsKICAgICAgICAgICAgIkFtYmllbnQiOiBbXSwKICAgICAgICAgICAgIkJvdW5kaW5nIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJFZmZlY3RpdmUiOiBbCiAgICAgICAgICAgICAgIiQoZGVmYXVsdF9jYXBzKSIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgIkluaGVyaXRhYmxlIjogW10sCiAgICAgICAgICAgICJQZXJtaXR0ZWQiOiBbCiAgICAgICAgICAgICAgIiQoZGVmYXVsdF9jYXBzKSIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgICJOb05ld1ByaXZpbGVnZXMiOiBmYWxzZQogICAgICAgIH0sCiAgICAgICAgIlJvb3QiOiB7CiAgICAgICAgICAiUGF0aCI6ICIkKGNwYXRoKS8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgIlJlYWRvbmx5IjogZmFsc2UKICAgICAgICB9LAogICAgICAgICJNb3VudHMiOiBbCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvcHJvYyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAicHJvYyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJwcm9jIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAgICAgIm5vZGV2IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2RldiIsCiAgICAgICAgICAgICJzb3VyY2UiOiAidG1wZnMiLAogICAgICAgICAgICAidHlwZV8iOiAidG1wZnMiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAic3RyaWN0YXRpbWUiLAogICAgICAgICAgICAgICJtb2RlPTc1NSIsCiAgICAgICAgICAgICAgInNpemU9NjU1MzZrIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi9wdHMiLAogICAgICAgICAgICAic291cmNlIjogImRldnB0cyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJkZXZwdHMiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibmV3aW5zdGFuY2UiLAogICAgICAgICAgICAgICJwdG14bW9kZT0wNjY2IiwKICAgICAgICAgICAgICAibW9kZT0wNjIwIiwKICAgICAgICAgICAgICAiZ2lkPTUiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L3NobSIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiL3J1bi9rYXRhLWNvbnRhaW5lcnMvc2FuZGJveC9zaG0iLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvbXF1ZXVlIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJtcXVldWUiLAogICAgICAgICAgICAidHlwZV8iOiAibXF1ZXVlIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAgICAgIm5vZGV2IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL3N5cyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAic3lzZnMiLAogICAgICAgICAgICAidHlwZV8iOiAic3lzZnMiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiLAogICAgICAgICAgICAgICJybyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9zeXMvZnMvY2dyb3VwIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJjZ3JvdXAiLAogICAgICAgICAgICAidHlwZV8iOiAiY2dyb3VwIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAgICAgIm5vZGV2IiwKICAgICAgICAgICAgICAicmVsYXRpbWUiLAogICAgICAgICAgICAgICJybyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9ldGMvaG9zdHMiLAogICAgICAgICAgICAic291cmNlIjogIiQoc2ZwcmVmaXgpaG9zdHMkIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJ3IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi90ZXJtaW5hdGlvbi1sb2ciLAogICAgICAgICAgICAic291cmNlIjogIiQoc2ZwcmVmaXgpdGVybWluYXRpb24tbG9nJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJydyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9ldGMvaG9zdG5hbWUiLAogICAgICAgICAgICAic291cmNlIjogIiQoc2ZwcmVmaXgpaG9zdG5hbWUkIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJ3IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2V0Yy9yZXNvbHYuY29uZiIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClyZXNvbHYuY29uZiQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicnciCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvdmFyL3J1bi9zZWNyZXRzL2t1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQiLAogICAgICAgICAgICAic291cmNlIjogIiQoc2ZwcmVmaXgpc2VydmljZWFjY291bnQkIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL3Zhci9ydW4vc2VjcmV0cy9henVyZS90b2tlbnMiLAogICAgICAgICAgICAic291cmNlIjogIiQoc2ZwcmVmaXgpdG9rZW5zJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJybyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9jbTIiLAogICAgICAgICAgICAic291cmNlIjogIiQoc2ZwcmVmaXgpY20yJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJybyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9jbTMiLAogICAgICAgICAgICAic291cmNlIjogIiQoc2ZwcmVmaXgpY20zJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJybyIKICAgICAgICAgICAgXQogICAgICAgICAgfQogICAgICAgIF0sCiAgICAgICAgIkFubm90YXRpb25zIjogewogICAgICAgICAgImlvLmthdGFjb250YWluZXJzLnBrZy5vY2kuYnVuZGxlX3BhdGgiOiAiL3J1bi9jb250YWluZXJkL2lvLmNvbnRhaW5lcmQucnVudGltZS52Mi50YXNrL2s4cy5pby8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgImlvLmthdGFjb250YWluZXJzLnBrZy5vY2kuY29udGFpbmVyX3R5cGUiOiAicG9kX2NvbnRhaW5lciIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLW5hbWUiOiAiYnVzeWJveDIiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLmNvbnRhaW5lci10eXBlIjogImNvbnRhaW5lciIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuaW1hZ2UtbmFtZSI6ICJtY3IubWljcm9zb2Z0LmNvbS9ha3MvZTJlL2xpYnJhcnktYnVzeWJveDptYXN0ZXIuMjIwMzE0LjEtbGludXgtYW1kNjQiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtaWQiOiAiXlthLXowLTldezY0fSQiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZSI6ICJeY20yJCIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1uYW1lc3BhY2UiOiAiIgogICAgICAgIH0sCiAgICAgICAgIkxpbnV4IjogewogICAgICAgICAgIk5hbWVzcGFjZXMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiVHlwZSI6ICJpcGMiLAogICAgICAgICAgICAgICJQYXRoIjogIiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJUeXBlIjogInV0cyIsCiAgICAgICAgICAgICAgIlBhdGgiOiAiIgogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgIlR5cGUiOiAibW91bnQiLAogICAgICAgICAgICAgICJQYXRoIjogIiIKICAgICAgICAgICAgfQogICAgICAgICAgXSwKICAgICAgICAgICJNYXNrZWRQYXRocyI6IFsKICAgICAgICAgICAgIi9wcm9jL2FjcGkiLAogICAgICAgICAgICAiL3Byb2Mva2NvcmUiLAogICAgICAgICAgICAiL3Byb2Mva2V5cyIsCiAgICAgICAgICAgICIvcHJvYy9sYXRlbmN5X3N0YXRzIiwKICAgICAgICAgICAgIi9wcm9jL3RpbWVyX2xpc3QiLAogICAgICAgICAgICAiL3Byb2MvdGltZXJfc3RhdHMiLAogICAgICAgICAgICAiL3Byb2Mvc2NoZWRfZGVidWciLAogICAgICAgICAgICAiL3Byb2Mvc2NzaSIsCiAgICAgICAgICAgICIvc3lzL2Zpcm13YXJlIgogICAgICAgICAgXSwKICAgICAgICAgICJSZWFkb25seVBhdGhzIjogWwogICAgICAgICAgICAiL3Byb2MvYXNvdW5kIiwKICAgICAgICAgICAgIi9wcm9jL2J1cyIsCiAgICAgICAgICAgICIvcHJvYy9mcyIsCiAgICAgICAgICAgICIvcHJvYy9pcnEiLAogICAgICAgICAgICAiL3Byb2Mvc3lzIiwKICAgICAgICAgICAgIi9wcm9jL3N5c3JxLXRyaWdnZXIiCiAgICAgICAgICBdLAogICAgICAgICAgIkRldmljZXMiOiBbXSwKICAgICAgICAgICJTeXNjdGwiOiB7CiAgICAgICAgICAgICJuZXQuaXB2NC5pcF91bnByaXZpbGVnZWRfcG9ydF9zdGFydCI6ICIwIiwKICAgICAgICAgICAgIm5ldC5pcHY0LnBpbmdfZ3JvdXBfcmFuZ2UiOiAiMCAyMTQ3NDgzNjQ3IgogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSwKICAgICAgInN0b3JhZ2VzIjogWwogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2gwKSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjApIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2gxKSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjEpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAib3ZlcmxheWZzIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJmdXNlMy5rYXRhLW92ZXJsYXkiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIyYzM0MmExMzdlNjkzYzc4OThhZWMzNmRhMTA0N2YxOTFkYzdjMTY4N2U2NjE5OGFkYWNjNDM5Y2Y0YWRmMzc5OjI1NzBlM2ExOWUxYmYyMGRkZGE0NTQ5OGE5NjI3ZjYxNTU1ZDJkNmMwMTQ3OWI5Yjc2NDYwYjY3OWIyN2Q1NTIiLAogICAgICAgICAgICAiODU2OGM3MGMwY2NmZTAwNTEwOTJlODE4ZGE3NjkxMTFhNTk4ODJjZDE5ZGQ3OTlkM2JjYTVmZmE4Mjc5MTA4MDpiNjQzYjYyMTc3NDg5ODM4MzBiMjZhYzE0YTM1YTMzMjJkZDUyOGMwMDk2M2VhYWRkOTFlZjU1ZjUxM2RjNzNmIgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGNwYXRoKS8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0KICAgICAgXSwKICAgICAgImRldmljZXMiOiBbXSwKICAgICAgInNhbmRib3hfcGlkbnMiOiB0cnVlLAogICAgICAiZXhlY19jb21tYW5kcyI6IFtdLAogICAgICAiZW52X21hcCI6IHsKICAgICAgICAiSE9TVE5BTUUiOiAiJChob3N0LW5hbWUpIiwKICAgICAgICAiUEFUSCI6ICIvdXNyL2xvY2FsL3NiaW46L3Vzci9sb2NhbC9iaW46L3Vzci9zYmluOi91c3IvYmluOi9zYmluOi9iaW4iCiAgICAgIH0KICAgIH0KICBdLAogICJjb21tb24iOiB7CiAgICAiY3BhdGgiOiAiL3J1bi9rYXRhLWNvbnRhaW5lcnMvc2hhcmVkL2NvbnRhaW5lcnMiLAogICAgIm1vdW50X3NvdXJjZV9jcGF0aCI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zaGFyZWQvY29udGFpbmVycyIsCiAgICAic2ZwcmVmaXgiOiAiXiQoY3BhdGgpLyQoYnVuZGxlLWlkKS1bYS16MC05XXsxNn0tIiwKICAgICJzcGF0aCI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L3N0b3JhZ2UiLAogICAgImlwdjRfYSI6ICIoKFswLTldfFsxLTldWzAtOV18MVswLTldezJ9fDJbMC00XVswLTldfDI1WzAtNV0pXFwuKXszfShbMC05XXxbMS05XVswLTldfDFbMC05XXsyfXwyWzAtNF1bMC05XXwyNVswLTVdKSIsCiAgICAiaXBfcCI6ICJbMC05XXsxLDV9IiwKICAgICJzdmNfbmFtZSI6ICJbQS1aX1xcLlxcLV0rIiwKICAgICJkbnNfbGFiZWwiOiAiW2EtekEtWjAtOV9cXC5cXC1dKyIsCiAgICAic19zb3VyY2UxIjogIl4uLjJbMC05XXszfV9bMC0xXVswLTldX1swLTNdWzAtOV1fWzAtMl1bMC05XV9bMC01XVswLTldX1swLTVdWzAtOV1cXC5bMC05XXsxLDEwfSQiLAogICAgInNfc291cmNlMiI6ICJeLi5kYXRhLyIsCiAgICAiZG5zX3N1YmRvbWFpbiI6ICJeW2EtejAtOV0oWy1hLXowLTldKlthLXowLTldKT8kIiwKICAgICJwb2RfdWlkIjogIl5bMC05YS1mQS1GXXs4fS1bMC05YS1mQS1GXXs0fS1bMC05YS1mQS1GXXs0fS1bMC05YS1mQS1GXXs0fS1bMC05YS1mQS1GXXsxMn0kIiwKICAgICJkZWZhdWx0X2NhcHMiOiBbCiAgICAgICJDQVBfQ0hPV04iLAogICAgICAiQ0FQX0RBQ19PVkVSUklERSIsCiAgICAgICJDQVBfRlNFVElEIiwKICAgICAgIkNBUF9GT1dORVIiLAogICAgICAiQ0FQX01LTk9EIiwKICAgICAgIkNBUF9ORVRfUkFXIiwKICAgICAgIkNBUF9TRVRHSUQiLAogICAgICAiQ0FQX1NFVFVJRCIsCiAgICAgICJDQVBfU0VURkNBUCIsCiAgICAgICJDQVBfU0VUUENBUCIsCiAgICAgICJDQVBfTkVUX0JJTkRfU0VSVklDRSIsCiAgICAgICJDQVBfU1lTX0NIUk9PVCIsCiAgICAgICJDQVBfS0lMTCIsCiAgICAgICJDQVBfQVVESVRfV1JJVEUiCiAgICBdLAogICAgInByaXZpbGVnZWRfY2FwcyI6IFsKICAgICAgIkNBUF9DSE9XTiIsCiAgICAgICJDQVBfREFDX09WRVJSSURFIiwKICAgICAgIkNBUF9EQUNfUkVBRF9TRUFSQ0giLAogICAgICAiQ0FQX0ZPV05FUiIsCiAgICAgICJDQVBfRlNFVElEIiwKICAgICAgIkNBUF9LSUxMIiwKICAgICAgIkNBUF9TRVRHSUQiLAogICAgICAiQ0FQX1NFVFVJRCIsCiAgICAgICJDQVBfU0VUUENBUCIsCiAgICAgICJDQVBfTElOVVhfSU1NVVRBQkxFIiwKICAgICAgIkNBUF9ORVRfQklORF9TRVJWSUNFIiwKICAgICAgIkNBUF9ORVRfQlJPQURDQVNUIiwKICAgICAgIkNBUF9ORVRfQURNSU4iLAogICAgICAiQ0FQX05FVF9SQVciLAogICAgICAiQ0FQX0lQQ19MT0NLIiwKICAgICAgIkNBUF9JUENfT1dORVIiLAogICAgICAiQ0FQX1NZU19NT0RVTEUiLAogICAgICAiQ0FQX1NZU19SQVdJTyIsCiAgICAgICJDQVBfU1lTX0NIUk9PVCIsCiAgICAgICJDQVBfU1lTX1BUUkFDRSIsCiAgICAgICJDQVBfU1lTX1BBQ0NUIiwKICAgICAgIkNBUF9TWVNfQURNSU4iLAogICAgICAiQ0FQX1NZU19CT09UIiwKICAgICAgIkNBUF9TWVNfTklDRSIsCiAgICAgICJDQVBfU1lTX1JFU09VUkNFIiwKICAgICAgIkNBUF9TWVNfVElNRSIsCiAgICAgICJDQVBfU1lTX1RUWV9DT05GSUciLAogICAgICAiQ0FQX01LTk9EIiwKICAgICAgIkNBUF9MRUFTRSIsCiAgICAgICJDQVBfQVVESVRfV1JJVEUiLAogICAgICAiQ0FQX0FVRElUX0NPTlRST0wiLAogICAgICAiQ0FQX1NFVEZDQVAiLAogICAgICAiQ0FQX01BQ19PVkVSUklERSIsCiAgICAgICJDQVBfTUFDX0FETUlOIiwKICAgICAgIkNBUF9TWVNMT0ciLAogICAgICAiQ0FQX1dBS0VfQUxBUk0iLAogICAgICAiQ0FQX0JMT0NLX1NVU1BFTkQiLAogICAgICAiQ0FQX0FVRElUX1JFQUQiLAogICAgICAiQ0FQX1BFUkZNT04iLAogICAgICAiQ0FQX0JQRiIsCiAgICAgICJDQVBfQ0hFQ0tQT0lOVF9SRVNUT1JFIgogICAgXSwKICAgICJ2aXJ0aW9fYmxrX3N0b3JhZ2VfY2xhc3NlcyI6IFsKICAgICAgImNjLWxvY2FsLWNzaSIsCiAgICAgICJjYy1tYW5hZ2VkLWNzaSIsCiAgICAgICJjYy1tYW5hZ2VkLXByZW1pdW0tY3NpIgogICAgXSwKICAgICJzbWJfc3RvcmFnZV9jbGFzc2VzIjogWwogICAgICB7CiAgICAgICAgIm5hbWUiOiAiYXp1cmVmaWxlLWNzaS1rYXRhLWNjIiwKICAgICAgICAibW91bnRfb3B0aW9ucyI6IFsKICAgICAgICAgICJkaXJfbW9kZT0wNzc3IiwKICAgICAgICAgICJmaWxlX21vZGU9MDc3NyIsCiAgICAgICAgICAibWZzeW1saW5rcyIsCiAgICAgICAgICAiY2FjaGU9c3RyaWN0IiwKICAgICAgICAgICJub3NoYXJlc29jayIsCiAgICAgICAgICAiYWN0aW1lbz0zMCIsCiAgICAgICAgICAibm9icmwiCiAgICAgICAgXQogICAgICB9CiAgICBdCiAgfSwKICAic2FuZGJveCI6IHsKICAgICJzdG9yYWdlcyI6IFsKICAgICAgewogICAgICAgICJkcml2ZXIiOiAiZXBoZW1lcmFsIiwKICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAic291cmNlIjogInNobSIsCiAgICAgICAgImZzdHlwZSI6ICJ0bXBmcyIsCiAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgIm5vZGV2IiwKICAgICAgICAgICJtb2RlPTE3NzciLAogICAgICAgICAgInNpemU9NjcxMDg4NjQiCiAgICAgICAgXSwKICAgICAgICAibW91bnRfcG9pbnQiOiAiL3J1bi9rYXRhLWNvbnRhaW5lcnMvc2FuZGJveC9zaG0iLAogICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgfQogICAgXQogIH0sCiAgInJlcXVlc3RfZGVmYXVsdHMiOiB7CiAgICAiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdCI6IHsKICAgICAgImFsbG93X2Vudl9yZWdleCI6IFsKICAgICAgICAiXkhPU1ROQU1FPSQoZG5zX2xhYmVsKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfUE9SVF8kKGlwX3ApX1RDUD10Y3A6Ly8kKGlwdjRfYSk6JChpcF9wKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfUE9SVF8kKGlwX3ApX1RDUF9QUk9UTz10Y3AkIiwKICAgICAgICAiXiQoc3ZjX25hbWUpX1BPUlRfJChpcF9wKV9UQ1BfUE9SVD0kKGlwX3ApJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9QT1JUXyQoaXBfcClfVENQX0FERFI9JChpcHY0X2EpJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9TRVJWSUNFX0hPU1Q9JChpcHY0X2EpJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9TRVJWSUNFX1BPUlQ9JChpcF9wKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfU0VSVklDRV9QT1JUXyQoZG5zX2xhYmVsKT0kKGlwX3ApJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9QT1JUPXRjcDovLyQoaXB2NF9hKTokKGlwX3ApJCIsCiAgICAgICAgIl5BWlVSRV9DTElFTlRfSUQ9W0EtRmEtZjAtOS1dKiQiLAogICAgICAgICJeQVpVUkVfVEVOQU5UX0lEPVtBLUZhLWYwLTktXSokIiwKICAgICAgICAiXkFaVVJFX0ZFREVSQVRFRF9UT0tFTl9GSUxFPS92YXIvcnVuL3NlY3JldHMvYXp1cmUvdG9rZW5zL2F6dXJlLWlkZW50aXR5LXRva2VuJCIsCiAgICAgICAgIl5BWlVSRV9BVVRIT1JJVFlfSE9TVD1odHRwczovL2xvZ2luXFwubWljcm9zb2Z0b25saW5lXFwuY29tLyQiLAogICAgICAgICJeVEVSTT14dGVybSQiCiAgICAgIF0sCiAgICAgICJhbGxvd19lbnZfcmVnZXhfbWFwIjogewogICAgICAgICJDUFVfTElNSVQiOiAiXlswLTldKyQiLAogICAgICAgICJKT0JfQ09NUExFVElPTl9JTkRFWCI6ICJeWzAtOV0qJCIsCiAgICAgICAgIk1FTU9SWV9MSU1JVCI6ICJeWzAtOV0rJCIKICAgICAgfQogICAgfSwKICAgICJDb3B5RmlsZVJlcXVlc3QiOiBbCiAgICAgICIkKHNmcHJlZml4KSIKICAgIF0sCiAgICAiRXhlY1Byb2Nlc3NSZXF1ZXN0IjogewogICAgICAiYWxsb3dlZF9jb21tYW5kcyI6IFtdLAogICAgICAicmVnZXgiOiBbXQogICAgfSwKICAgICJVcGRhdGVSb3V0ZXNSZXF1ZXN0IjogewogICAgICAiZm9yYmlkZGVuX2RldmljZV9uYW1lcyI6IFsKICAgICAgICAibG8iCiAgICAgIF0sCiAgICAgICJmb3JiaWRkZW5fc291cmNlX3JlZ2V4IjogWwogICAgICAgICJeKD86MHswLDR9Oil7MCw3fTB7MCwzfTEkIiwKICAgICAgICAiXjEyN1xcLig/OlswLTldezEsM31cXC4pezJ9WzAtOV17MSwzfSQiCiAgICAgIF0KICAgIH0sCiAgICAiVXBkYXRlSW50ZXJmYWNlUmVxdWVzdCI6IHsKICAgICAgImFsbG93X3Jhd19mbGFncyI6IDEyOCwKICAgICAgImZvcmJpZGRlbl9uYW1lcyI6IFsKICAgICAgICAibG8iCiAgICAgIF0sCiAgICAgICJmb3JiaWRkZW5faHdfYWRkcnMiOiBbCiAgICAgICAgIjAwOjAwOjAwOjAwOjAwOjAwIgogICAgICBdCiAgICB9LAogICAgIkNsb3NlU3RkaW5SZXF1ZXN0IjogZmFsc2UsCiAgICAiUmVhZFN0cmVhbVJlcXVlc3QiOiBmYWxzZSwKICAgICJVcGRhdGVFcGhlbWVyYWxNb3VudHNSZXF1ZXN0IjogZmFsc2UsCiAgICAiV3JpdGVTdHJlYW1SZXF1ZXN0IjogZmFsc2UKICB9Cn0= +spec: + restartPolicy: Never + runtimeClassName: kata-cc + shareProcessNamespace: true + containers: + - name: busybox + image: "mcr.microsoft.com/aks/e2e/library-busybox:master.220314.1-linux-amd64" + securityContext: + runAsUser: 123 + volumeMounts: + - mountPath: /cm2 + name: cm2-volume + - mountPath: /cm3 + name: cm2-volume-ro + readOnly: true + command: + - /bin/sh + args: + - "-c" + - while true; do echo hello; sleep 10; done + - name: busybox2 + image: "mcr.microsoft.com/aks/e2e/library-busybox:master.220314.1-linux-amd64" + securityContext: + runAsUser: 321 + volumeMounts: + - mountPath: /cm2 + name: cm2-volume + - mountPath: /cm3 + name: cm2-volume-ro + readOnly: true + command: + - /bin/sh + args: + - "-c" + - while true; do echo hello; sleep 10; done + volumes: + - name: cm2-volume + configMap: + name: config-map2 + items: + - key: file1.json + path: my-keys + - name: cm2-volume-ro + configMap: + name: ro-config-map2 + items: + - key: file1.json + path: ro-keys diff --git a/src/agent/samples/policy/yaml/configmap/pod-cm3.yaml b/src/agent/samples/policy/yaml/configmap/pod-cm3.yaml new file mode 100644 index 000000000000..2e73c73e0811 --- /dev/null +++ b/src/agent/samples/policy/yaml/configmap/pod-cm3.yaml @@ -0,0 +1,33 @@ +--- +apiVersion: v1 +kind: ConfigMap +metadata: + name: config-map3 +data: + simple_value1: value1 + simple_value2: value2 +--- +apiVersion: v1 +kind: Pod +metadata: + name: cm3 + labels: + run: busybox + annotations: + io.katacontainers.config.agent.policy: IyBDb3B5cmlnaHQgKGMpIDIwMjMgTWljcm9zb2Z0IENvcnBvcmF0aW9uCiMKIyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMAojCnBhY2thZ2UgYWdlbnRfcG9saWN5CgppbXBvcnQgZnV0dXJlLmtleXdvcmRzLmluCmltcG9ydCBmdXR1cmUua2V5d29yZHMuZXZlcnkKCiMgRGVmYXVsdCB2YWx1ZXMsIHJldHVybmVkIGJ5IE9QQSB3aGVuIHJ1bGVzIGNhbm5vdCBiZSBldmFsdWF0ZWQgdG8gdHJ1ZS4KZGVmYXVsdCBBZGRBUlBOZWlnaGJvcnNSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgQWRkU3dhcFJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBDbG9zZVN0ZGluUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IENvcHlGaWxlUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IENyZWF0ZUNvbnRhaW5lclJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBDcmVhdGVTYW5kYm94UmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IERlc3Ryb3lTYW5kYm94UmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgRXhlY1Byb2Nlc3NSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgR2V0T09NRXZlbnRSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBHdWVzdERldGFpbHNSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBMaXN0SW50ZXJmYWNlc1JlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBMaXN0Um91dGVzUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IE1lbUhvdHBsdWdCeVByb2JlUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IE9ubGluZUNQVU1lbVJlcXVlc3QgOj0gdHJ1ZQpkZWZhdWx0IFBhdXNlQ29udGFpbmVyUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFJlYWRTdHJlYW1SZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgUmVtb3ZlQ29udGFpbmVyUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgUmVtb3ZlU3RhbGVWaXJ0aW9mc1NoYXJlTW91bnRzUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgUmVzZWVkUmFuZG9tRGV2UmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFJlc3VtZUNvbnRhaW5lclJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBTZXRHdWVzdERhdGVUaW1lUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFNldFBvbGljeVJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBTaWduYWxQcm9jZXNzUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgU3RhcnRDb250YWluZXJSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBTdGFydFRyYWNpbmdSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgU3RhdHNDb250YWluZXJSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBTdG9wVHJhY2luZ1JlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBUdHlXaW5SZXNpemVSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBVcGRhdGVDb250YWluZXJSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgVXBkYXRlRXBoZW1lcmFsTW91bnRzUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFVwZGF0ZUludGVyZmFjZVJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBVcGRhdGVSb3V0ZXNSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgV2FpdFByb2Nlc3NSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBXcml0ZVN0cmVhbVJlcXVlc3QgOj0gZmFsc2UKCiMgQWxsb3dSZXF1ZXN0c0ZhaWxpbmdQb2xpY3kgOj0gdHJ1ZSBjb25maWd1cmVzIHRoZSBBZ2VudCB0byAqYWxsb3cgYW55CiMgcmVxdWVzdHMgY2F1c2luZyBhIHBvbGljeSBmYWlsdXJlKi4gVGhpcyBpcyBhbiB1bnNlY3VyZSBjb25maWd1cmF0aW9uCiMgYnV0IGlzIHVzZWZ1bCBmb3IgYWxsb3dpbmcgdW5zZWN1cmUgcG9kcyB0byBzdGFydCwgdGhlbiBjb25uZWN0IHRvCiMgdGhlbSBhbmQgaW5zcGVjdCBPUEEgbG9ncyBmb3IgdGhlIHJvb3QgY2F1c2Ugb2YgYSBmYWlsdXJlLgpkZWZhdWx0IEFsbG93UmVxdWVzdHNGYWlsaW5nUG9saWN5IDo9IGZhbHNlCgojIENvbnN0YW50cwpTX05BTUVfS0VZID0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZSIKU19OQU1FU1BBQ0VfS0VZID0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZXNwYWNlIgpCVU5ETEVfSUQgPSAiW2EtejAtOV17NjR9IgoKQ3JlYXRlQ29udGFpbmVyUmVxdWVzdDo9IHJlc3AgewogICAgbm90IGlzX251bGwoaW5wdXQuZW52X21hcCkKICAgIAogICAgaV9lbnZfbWFwIDo9IGlucHV0LmVudl9tYXAKICAgIAogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBwX2Vudl9tYXAgOj0gcF9jb250YWluZXIuZW52X21hcCAgCiAgICBhbGxvd19lbnZfbWFwKHBfZW52X21hcCwgaV9lbnZfbWFwKQogICAgCiAgICBpX3Byb2Nlc3MgOj0gaW5wdXQuYmFzZS5PQ0kuUHJvY2VzcwogICAgCiAgICBwX3Byb2Nlc3MgOj0gcF9jb250YWluZXIuT0NJLlByb2Nlc3MKICAgIAogICAgYWxsb3dfYXJncyhpX3Byb2Nlc3MsIHBfcHJvY2VzcywgaV9lbnZfbWFwKQoKICAgIHJlc3AgPSBDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uKGlucHV0LmJhc2UpCiAgICBwcmludCgiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdDogdHJ1ZSIpCn0KCmFsbG93X2FyZ3MoaV9wcm9jZXNzLCBwX3Byb2Nlc3MsIGlfZW52X21hcCkgewogICAgaV9hcmdzIDo9IGlfcHJvY2Vzcy5BcmdzCiAgICBwX2FyZ3MgOj0gcF9wcm9jZXNzLkFyZ3MKICAgIHByaW50KCJhbGxvd19hcmdzOiBpX2FyZ3MgPSIsIGlfYXJncywgInBfYXJncyA9IiwgcF9hcmdzKQogICAgY291bnQoaV9hcmdzKSA9PSBjb3VudChwX2FyZ3MpCiAgICBldmVyeSBpLCBpX2FyZyBpbiBpX2FyZ3MgewogICAgICAgIHByaW50KCJhbGxvd19hcmdzOiBpX2FyZyA9IiwgaV9hcmcpCiAgICAgICAgcF9hcmdfcmVwbGFjZWQgOj0gcmVwbGFjZV9lbnZfdmFyaWFibGVzKHBfYXJnc1tpXSwgaV9lbnZfbWFwKQogICAgICAgIHByaW50KCJhbGxvd19hcmdzOiBwX2FyZ19yZXBsYWNlZCA9IiwgcF9hcmdfcmVwbGFjZWQpCiAgICAgICAgcF9hcmdfcmVwbGFjZWQyIDo9IHJlcGxhY2UocF9hcmdfcmVwbGFjZWQsICIkJCIsICIkIikKICAgICAgICBwcmludCgiYWxsb3dfYXJnczogcF9hcmdfcmVwbGFjZWQyID0iLCBwX2FyZ19yZXBsYWNlZDIpCiAgICAgICAgaV9hcmcgPT0gcF9hcmdfcmVwbGFjZWQyCiAgICB9CiAgICBwcmludCgiYWxsb3dfYXJnczogdHJ1ZSIpCn0KCmFsbG93X2FyZ3MoaV9wcm9jZXNzLCBwX3Byb2Nlc3MsIGlfZW52X21hcCkgewogICAgbm90IGlfcHJvY2Vzcy5BcmdzCiAgICBub3QgcF9wcm9jZXNzLkFyZ3MKICAgIHByaW50KCJhbGxvd19hcmdzMjogbm8gYXJncyIpCn0KCiMgdGhpcyBmdW5jdGlvbiByZXBsYWNlcyBhbGwgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyBpbiBhIHN0cmluZywgZ2l2ZW4gYSBtYXAgb2YgZW52aXJvbm1lbnQga2V5cyB0byBlbnZpcm9ubWVudCB2YWx1ZXMKIyBlZyBzdHIgPSAiZWNobyAkKENMVVNURVJfSUQpOyBlY2hvICQoTk9ERV9OQU1FKTsiCiMgZW52X21hcCA9IHsiQ0xVU1RFUl9JRCI6ICJhYmMiLCAiTk9ERV9OQU1FIiA6ICJ4eXoifQojIHJlc3VsdCA9ICJlY2hvIGFiYzsgZWNobyB4eXo7IgpyZXBsYWNlX2Vudl92YXJpYWJsZXMoc3RyLCBlbnZfbWFwKSA9IHJlc3VsdCB7CiAgICAjIG1ha2UgYW4gYXJyYXkgb2YgdGhlIGtleXMgZWcgWyJDTFVTVEVSX0lEIiwgIk5PREVfTkFNRSJdCiAgICBrZXlzIDo9IFt4IHwgc29tZSB4IGluIG9iamVjdC5rZXlzKGVudl9tYXApXQogICAgcmVzdWx0IDo9IHJlcGxhY2Vfc3RyX3JlYyhzdHIsIGVudl9tYXAsIGtleXMsIGNvdW50KGtleXMpIC0gMSkKfQoKIyBiYXNlIGNhc2UKcmVwbGFjZV9zdHJfcmVjKHN0ciwgZW52X21hcCwgYXJyX2tleXMsIGkpID0gcmVzdWx0IHsKICAgIGkgPCAwCiAgICByZXN1bHQgOj0gc3RyCn0KCiMgcmVjdXJzaXZlIHN0ZXAKcmVwbGFjZV9zdHJfcmVjKHN0ciwgZW52X21hcCwgYXJyX2tleXMsIGkpID0gcmVzdWx0IHsKICAgIGkgPj0gMAogICAga2V5IDo9IGFycl9rZXlzW2ldCiAgICBlbnZfa2V5MSA6PSBjb25jYXQoIiIsIFsiJCgiLCBrZXksICIpIl0pCiAgICAjIHJlcGxhY2UgJChWQVIpIHdpdGggdmFsdWUKICAgIG5ld19zdHIxIDo9IHJlcGxhY2Uoc3RyLCBlbnZfa2V5MSwgZW52X21hcFtrZXldKQogICAgIyByZXBsYWNlIG5leHQgZW52aXJvbm1lbnQgdmFyaWFibGUKICAgIHJlc3VsdCA9IHJlcGxhY2Vfc3RyX3JlYyhuZXdfc3RyMSwgZW52X21hcCwgYXJyX2tleXMsIGkgLSAxKQp9CgphbGxvd19lbnZfbWFwKHBfZW52X21hcCwgaV9lbnZfbWFwKSB7CiAgICBwcmludCgiYWxsb3dfZW52X21hcDogcF9lbnZfbWFwID0iLCBwX2Vudl9tYXApCiAgICBldmVyeSBlbnZfa2V5LCBlbnZfdmFsIGluIGlfZW52X21hcCB7CiAgICAgICAgcHJpbnQoImFsbG93X2VudjogZW52X2tleSA9IiwgZW52X2tleSwgImVudl92YWwgPSIsIGVudl92YWwpCiAgICAgICAgYWxsb3dfZW52X21hcF9lbnRyeShlbnZfa2V5LCBlbnZfdmFsLCBwX2Vudl9tYXApCiAgICB9CiAgICBwcmludCgiYWxsb3dfZW52X21hcDogdHJ1ZSIpCn0KCiMgQWxsb3cgZXhhY3QgbWF0Y2gKYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBpX3ZhbCA9PSBwX3ZhbAogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnk6IHRydWUiKQp9CgojIEFsbG93IHJlc291cmNlRmllbGRSZWYgdmFsdWVzIChlLmcuLCAibGltaXRzLmNwdSIpLgphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgICMgYSB2YXJpYWJsZSB3ZSBzaG91bGQgYmUgdmFsaWRhdGluZyB1c2luZyBhIHJlZ2V4IGZyb20gc2V0dGluZ3MKICAgIHBfdmFsID09ICIkKHZhbGlkYXRlLWZyb20tc2V0dGluZ3MpIgogICAgcmVnZXhfdmFsIDo9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuQ3JlYXRlQ29udGFpbmVyUmVxdWVzdC5hbGxvd19lbnZfcmVnZXhfbWFwW2tleV0KICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4X3ZhbCwgaV92YWwpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSAyOiB0cnVlIikKfQoKIyBBbGxvdyBub2RlLW5hbWUKYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChub2RlLW5hbWUpIgogICAgcmVnZXgubWF0Y2gocG9saWN5X2RhdGEuY29tbW9uLmRuc19zdWJkb21haW4gLCBpX3ZhbCkKICAgIHByaW50KCJhbGxvd19lbnZfbWFwX2VudHJ5IDM6IHRydWUiKQp9CgojIEFsbG93IGhvc3QtbmFtZQphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgIHBfdmFsID09ICIkKGhvc3QtbmFtZSkiCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24uZG5zX2xhYmVsICwgaV92YWwpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSA0OiB0cnVlIikKfQoKIyBBbGxvdyBwb2QtdWlkCmFsbG93X2Vudl9tYXBfZW50cnkoa2V5LCBpX3ZhbCwgcF9lbnZfbWFwKSB7CiAgICBwX3ZhbCA6PSBwX2Vudl9tYXBba2V5XQogICAgcF92YWwgPT0gIiQocG9kLXVpZCkiCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24ucG9kX3VpZCAsIGlfdmFsKQogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgNTogdHJ1ZSIpCn0KCiMgQWxsb3cgZmllbGRSZWYgImZpZWxkUGF0aDogc3RhdHVzLnBvZElQIiB2YWx1ZXMuCmFsbG93X2Vudl9tYXBfZW50cnkoa2V5LCBpX3ZhbCwgcF9lbnZfbWFwKSB7CiAgICBpc19pcChpX3ZhbCkKCiAgICBwX3ZhbCA6PSBwX2Vudl9tYXBba2V5XQogICAgcF92YXIgOj0gY29uY2F0KCI9IiwgW2tleSwgcF92YWxdKQogICAgYWxsb3dfcG9kX2lwX3ZhcihrZXksIHBfdmFyKQogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgNjogdHJ1ZSIpCn0KCiMgQWxsb3cgZmllbGRSZWYgImZpZWxkUGF0aDogc3RhdHVzLmhvc3RJUCIgdmFsdWVzLgphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgaXNfaXAoaV92YWwpCgogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgIHBfdmFyIDo9IGNvbmNhdCgiPSIsIFtrZXksIHBfdmFsXSkKICAgIGFsbG93X2hvc3RfaXBfdmFyKGtleSwgcF92YXIpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSA3OiB0cnVlIikKfQoKIyBNYXRjaCBpbnB1dCB3aXRoIG9uZSBvZiB0aGUgcG9saWN5IHZhcmlhYmxlcywgYWZ0ZXIgc3Vic3RpdHV0aW5nICQoc2FuZGJveC1uYW1lKS4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChzYW5kYm94LW5hbWUpIgogICAgc19uYW1lIDo9IGlucHV0LmJhc2UuT0NJLkFubm90YXRpb25zW1NfTkFNRV9LRVldCiAgICBwX3ZhcjIgOj0gcmVwbGFjZShwX3ZhbCwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHBfdmFyMiA9PSBpX3ZhbAogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgODogdHJ1ZSIpCn0KCiMgTWF0Y2ggaW5wdXQgd2l0aCBvbmUgb2YgdGhlIHBvbGljeSB2YXJpYWJsZXMsIGFmdGVyIHN1YnN0aXR1dGluZyAkKHNhbmRib3gtbmFtZXNwYWNlKS4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChzYW5kYm94LW5hbWVzcGFjZSkiCiAgICBzX25hbWVzcGFjZSA6PSBpbnB1dC5iYXNlLk9DSS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwX3ZhcjIgOj0gcmVwbGFjZShwX3ZhbCwgIiQoc2FuZGJveC1uYW1lc3BhY2UpIiwgc19uYW1lc3BhY2UpCiAgICBwX3ZhcjIgPT0gaV92YWwKICAgIHByaW50KCJhbGxvd19lbnZfbWFwX2VudHJ5IDk6IHRydWUiKQp9CgojIEFsbG93IGlucHV0IGVudiB2YXJpYWJsZXMgdGhhdCBtYXRjaCB3aXRoIGEgcmVxdWVzdF9kZWZhdWx0cyByZWdleC4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHNvbWUgcF9yZWdleDEgaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5DcmVhdGVDb250YWluZXJSZXF1ZXN0LmFsbG93X2Vudl9yZWdleAogICAgcF9yZWdleDIgOj0gcmVwbGFjZShwX3JlZ2V4MSwgIiQoaXB2NF9hKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcHY0X2EpCiAgICBwX3JlZ2V4MyA6PSByZXBsYWNlKHBfcmVnZXgyLCAiJChpcF9wKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcF9wKQogICAgcF9yZWdleDQgOj0gcmVwbGFjZShwX3JlZ2V4MywgIiQoc3ZjX25hbWUpIiwgcG9saWN5X2RhdGEuY29tbW9uLnN2Y19uYW1lKQogICAgcF9yZWdleDUgOj0gcmVwbGFjZShwX3JlZ2V4NCwgIiQoZG5zX2xhYmVsKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5kbnNfbGFiZWwpCgogICAgcmVzdWx0IDo9IGNvbmNhdCgiPSIsIFtrZXksIGlfdmFsXSkKICAgIHJlZ2V4Lm1hdGNoKHBfcmVnZXg1LCByZXN1bHQpCgogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgMTA6IHRydWUiKQp9CgpDcmVhdGVDb250YWluZXJSZXF1ZXN0Oj0gcmVzcCB7CiAgICBub3QgaW5wdXQuZW52X21hcAogICAgaV9wcm9jZXNzID0gaW5wdXQuT0NJLlByb2Nlc3MKICAgIHNfbmFtZSA9IGlucHV0Lk9DSS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBwX3Byb2Nlc3MgPSBwX2NvbnRhaW5lci5PQ0kuUHJvY2VzcwogICAgYWxsb3dfZGVwcmVjYXRlZF9hcmdzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUpCiAgICByZXNwID0gQ3JlYXRlQ29udGFpbmVyUmVxdWVzdENvbW1vbihpbnB1dCkKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0MjogdHJ1ZSIpCn0KCkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb24ocmVxKTo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgICMgQ2hlY2sgaWYgdGhlIGlucHV0IHJlcXVlc3Qgc2hvdWxkIGJlIHJlamVjdGVkIGV2ZW4gYmVmb3JlIGNoZWNraW5nIHRoZQogICAgIyBwb2xpY3lfZGF0YS5jb250YWluZXJzIGluZm9ybWF0aW9uLgogICAgYWxsb3dfY3JlYXRlX2NvbnRhaW5lcl9pbnB1dChyZXEpCgogICAgaV9vY2kgOj0gcmVxLk9DSQogICAgaV9zdG9yYWdlcyA6PSByZXEuc3RvcmFnZXMKICAgIGlfZGV2aWNlcyA6PSByZXEuZGV2aWNlcwoKICAgICMgYXJyYXkgb2YgcG9zc2libGUgc3RhdGUgb3BlcmF0aW9ucwogICAgb3BzX2J1aWxkZXIgOj0gW10KCiAgICAjIGNoZWNrIHNhbmRib3ggbmFtZQogICAgc2FuZGJveF9uYW1lID0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FX0tFWV0KICAgIGFkZF9zYW5kYm94X25hbWVfdG9fc3RhdGUgOj0gc3RhdGVfYWxsb3dzKCJzYW5kYm94X25hbWUiLCBzYW5kYm94X25hbWUpCiAgICBvcHNfYnVpbGRlcjEgOj0gY29uY2F0X29wX2lmX25vdF9udWxsKG9wc19idWlsZGVyLCBhZGRfc2FuZGJveF9uYW1lX3RvX3N0YXRlKQoKICAgICMgQ2hlY2sgaWYgYW55IGVsZW1lbnQgZnJvbSB0aGUgcG9saWN5X2RhdGEuY29udGFpbmVycyBhcnJheSBhbGxvd3MgdGhlIGlucHV0IHJlcXVlc3QuCiAgICBzb21lIHBfY29udGFpbmVyIGluIHBvbGljeV9kYXRhLmNvbnRhaW5lcnMKICAgIHByaW50KCI9PT09PT09PSBDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiB0cnlpbmcgbmV4dCBwb2xpY3kgY29udGFpbmVyIikKCiAgICBwX3BpZG5zIDo9IHBfY29udGFpbmVyLnNhbmRib3hfcGlkbnMKICAgIGlfcGlkbnMgOj0gcmVxLnNhbmRib3hfcGlkbnMKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiBwX3BpZG5zID0iLCBwX3BpZG5zLCAiaV9waWRucyA9IiwgaV9waWRucykKICAgIHBfcGlkbnMgPT0gaV9waWRucwoKICAgIHBfb2NpIDo9IHBfY29udGFpbmVyLk9DSQoKICAgICMgY2hlY2sgbmFtZXNwYWNlCiAgICBwX25hbWVzcGFjZSA6PSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBpX25hbWVzcGFjZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwcmludCAoIkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb246IHBfbmFtZXNwYWNlID0iLCBwX25hbWVzcGFjZSwgImlfbmFtZXNwYWNlID0iLCBpX25hbWVzcGFjZSkKICAgIGFkZF9uYW1lc3BhY2VfdG9fc3RhdGUgOj0gYWxsb3dfbmFtZXNwYWNlKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkKICAgIG9wc19idWlsZGVyMiA6PSBjb25jYXRfb3BfaWZfbm90X251bGwob3BzX2J1aWxkZXIxLCBhZGRfbmFtZXNwYWNlX3RvX3N0YXRlKQoKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiBwIFZlcnNpb24gPSIsIHBfb2NpLlZlcnNpb24sICJpIFZlcnNpb24gPSIsIGlfb2NpLlZlcnNpb24pCiAgICBwX29jaS5WZXJzaW9uID09IGlfb2NpLlZlcnNpb24KCiAgICBwcmludCgiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdENvbW1vbjogcCBSZWFkb25seSA9IiwgcF9vY2kuUm9vdC5SZWFkb25seSwgImkgUmVhZG9ubHkgPSIsIGlfb2NpLlJvb3QuUmVhZG9ubHkpCiAgICBwX29jaS5Sb290LlJlYWRvbmx5ID09IGlfb2NpLlJvb3QuUmVhZG9ubHkKCiAgICBhbGxvd19hbm5vKHBfb2NpLCBpX29jaSkKCiAgICBwX3N0b3JhZ2VzIDo9IHBfY29udGFpbmVyLnN0b3JhZ2VzCiAgICBhbGxvd19ieV9hbm5vKHBfb2NpLCBpX29jaSwgcF9zdG9yYWdlcywgaV9zdG9yYWdlcykKCiAgICBwX2RldmljZXMgOj0gcF9jb250YWluZXIuZGV2aWNlcwogICAgYWxsb3dfZGV2aWNlcyhwX2RldmljZXMsIGlfZGV2aWNlcykKCiAgICByZXQgOj0gYWxsb3dfbGludXgob3BzX2J1aWxkZXIyLCBwX29jaSwgaV9vY2kpCiAgICByZXQuYWxsb3dlZAoKICAgIG9wcyA6PSByZXQub3BzCgogICAgcHJpbnQoIkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb246IHRydWUiKQp9CgphbGxvd19jcmVhdGVfY29udGFpbmVyX2lucHV0KHJlcSkgewogICAgcHJpbnQoImFsbG93X2NyZWF0ZV9jb250YWluZXJfaW5wdXQ6IGlucHV0ID0iLCByZXEpCgogICAgY291bnQocmVxLnNoYXJlZF9tb3VudHMpID09IDAKICAgIGlzX251bGwocmVxLnN0cmluZ191c2VyKQoKICAgIGlfb2NpIDo9IHJlcS5PQ0kKICAgIGlzX251bGwoaV9vY2kuSG9va3MpCiAgICBpc19udWxsKGlfb2NpLlNvbGFyaXMpCiAgICBpc19udWxsKGlfb2NpLldpbmRvd3MpCgogICAgaV9saW51eCA6PSBpX29jaS5MaW51eAogICAgY291bnQoaV9saW51eC5HSURNYXBwaW5ncykgPT0gMAogICAgY291bnQoaV9saW51eC5Nb3VudExhYmVsKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlJlc291cmNlcy5EZXZpY2VzKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlJvb3Rmc1Byb3BhZ2F0aW9uKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlVJRE1hcHBpbmdzKSA9PSAwCiAgICBpc19udWxsKGlfbGludXguSW50ZWxSZHQpCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLkJsb2NrSU8pCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLk5ldHdvcmspCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLlBpZHMpCiAgICBpc19udWxsKGlfbGludXguU2VjY29tcCkKCiAgICBpX3Byb2Nlc3MgOj0gaV9vY2kuUHJvY2VzcwogICAgY291bnQoaV9wcm9jZXNzLlNlbGludXhMYWJlbCkgPT0gMAogICAgY291bnQoaV9wcm9jZXNzLlVzZXIuVXNlcm5hbWUpID09IDAKCiAgICBwcmludCgiYWxsb3dfY3JlYXRlX2NvbnRhaW5lcl9pbnB1dDogdHJ1ZSIpCn0KCmFsbG93X25hbWVzcGFjZShwX25hbWVzcGFjZSwgaV9uYW1lc3BhY2UpID0gYWRkX25hbWVzcGFjZSB7CiAgICBwX25hbWVzcGFjZSA9PSBpX25hbWVzcGFjZQogICAgYWRkX25hbWVzcGFjZSA6PSBudWxsCiAgICBwcmludCgiYWxsb3dfbmFtZXNwYWNlIDE6IGlucHV0IG5hbWVzcGFjZSBtYXRjaGVzIHBvbGljeSBkYXRhIikKfQoKYWxsb3dfbmFtZXNwYWNlKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkgPSBhZGRfbmFtZXNwYWNlIHsKICAgIHBfbmFtZXNwYWNlID09ICIiCiAgICBwcmludCgiYWxsb3dfbmFtZXNwYWNlIDI6IG5vIG5hbWVzcGFjZSBmb3VuZCBvbiBwb2xpY3kgZGF0YSIpCiAgICBhZGRfbmFtZXNwYWNlIDo9IHN0YXRlX2FsbG93cygibmFtZXNwYWNlIiwgaV9uYW1lc3BhY2UpCn0KCiMgdmFsdWUgaGFzbid0IGJlZW4gc2VlbiBiZWZvcmUsIHNhdmUgaXQgdG8gc3RhdGUKc3RhdGVfYWxsb3dzKGtleSwgdmFsdWUpID0gYWN0aW9uIHsKICBzdGF0ZSA6PSBnZXRfc3RhdGUoKQogIHByaW50KCJzdGF0ZV9hbGxvd3MgMTogc3RhdGVba2V5XSA9Iiwgc3RhdGVba2V5XSwgInZhbHVlID0iLCB2YWx1ZSkKICBub3Qgc3RhdGVba2V5XQogIHByaW50KCJzdGF0ZV9hbGxvd3MgMTogc2F2aW5nIHRvIHN0YXRlIGtleSA9Iiwga2V5LCAidmFsdWUgPSIsIHZhbHVlKQogIHBhdGggOj0gZ2V0X3N0YXRlX3BhdGgoa2V5KSAKICBhY3Rpb24gOj0gewogICAgIm9wIjogImFkZCIsCiAgICAicGF0aCI6IHBhdGgsIAogICAgInZhbHVlIjogdmFsdWUsCiAgfQp9CgojIHZhbHVlIG1hdGNoZXMgd2hhdCdzIGluIHN0YXRlLCBhbGxvdyBpdApzdGF0ZV9hbGxvd3Moa2V5LCB2YWx1ZSkgPSBhY3Rpb24gewogIHByaW50KCJzdGF0ZV9hbGxvd3MgMjogc3RhcnQiKQogIHN0YXRlIDo9IGdldF9zdGF0ZSgpCiAgcHJpbnQoInN0YXRlX2FsbG93cyAyOiBzdGF0ZVtrZXldID0iLCBzdGF0ZVtrZXldLCAidmFsdWUgPSIsIHZhbHVlKQogIHZhbHVlID09IHN0YXRlW2tleV0KICBwcmludCgic3RhdGVfYWxsb3dzIDI6IGZvdW5kIGtleSA9Iiwga2V5LCAidmFsdWUgPSIsIHZhbHVlLCAiIGluIHN0YXRlIikKICBhY3Rpb24gOj0gbnVsbAp9CgojIGhlbHBlciBmdW5jdGlvbnMgdG8gaW50ZXJhY3Qgd2l0aCB0aGUgc3RhdGUKZ2V0X3N0YXRlKCkgPSBzdGF0ZSB7CiAgc3RhdGUgOj0gZGF0YVsicHN0YXRlIl0KfQoKZ2V0X3N0YXRlX3ZhbChrZXkpID0gdmFsdWUgewogICAgc3RhdGUgOj0gZ2V0X3N0YXRlKCkKICAgIHZhbHVlIDo9IHN0YXRlW2tleV0KfQoKZ2V0X3N0YXRlX3BhdGgoa2V5KSA9IHBhdGggewogICAgIyBwcmVwZW5kICIvcHN0YXRlLyIgdG8ga2V5CiAgICBwYXRoIDo9IGNvbmNhdCgiLyIsIFsiL3BzdGF0ZSIsIGtleV0pCn0KCiMgSGVscGVyIGZ1bmN0aW9ucyB0byBjb25kaXRpb25hbGx5IGNvbmNhdGVuYXRlIG9wIGlzIG5vdCBudWxsCmNvbmNhdF9vcF9pZl9ub3RfbnVsbChvcHMsIG9wKSA9IHJlc3VsdCB7CiAgICBvcCA9PSBudWxsCiAgICByZXN1bHQgOj0gb3BzCn0KCmNvbmNhdF9vcF9pZl9ub3RfbnVsbChvcHMsIG9wKSA9IHJlc3VsdCB7CiAgICBvcCAhPSBudWxsCiAgICByZXN1bHQgOj0gYXJyYXkuY29uY2F0KG9wcywgW29wXSkKfQoKIyBSZWplY3QgdW5leHBlY3RlZCBhbm5vdGF0aW9ucy4KYWxsb3dfYW5ubyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19hbm5vIDE6IHN0YXJ0IikKCiAgICBub3QgaV9vY2kuQW5ub3RhdGlvbnMKCiAgICBwcmludCgiYWxsb3dfYW5ubyAxOiB0cnVlIikKfQphbGxvd19hbm5vKHBfb2NpLCBpX29jaSkgewogICAgcHJpbnQoImFsbG93X2Fubm8gMjogcCBBbm5vdGF0aW9ucyA9IiwgcF9vY2kuQW5ub3RhdGlvbnMpCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiBpIEFubm90YXRpb25zID0iLCBpX29jaS5Bbm5vdGF0aW9ucykKCiAgICBpX2tleXMgOj0gb2JqZWN0LmtleXMoaV9vY2kuQW5ub3RhdGlvbnMpCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiBpIGtleXMgPSIsIGlfa2V5cykKCiAgICBldmVyeSBpX2tleSBpbiBpX2tleXMgewogICAgICAgIGFsbG93X2Fubm9fa2V5KGlfa2V5LCBwX29jaSkKICAgIH0KCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiB0cnVlIikKfQoKYWxsb3dfYW5ub19rZXkoaV9rZXksIHBfb2NpKSB7CiAgICBwcmludCgiYWxsb3dfYW5ub19rZXkgMTogaSBrZXkgPSIsIGlfa2V5KQoKICAgIHN0YXJ0c3dpdGgoaV9rZXksICJpby5rdWJlcm5ldGVzLmNyaS4iKQoKICAgIHByaW50KCJhbGxvd19hbm5vX2tleSAxOiB0cnVlIikKfQphbGxvd19hbm5vX2tleShpX2tleSwgcF9vY2kpIHsKICAgIHByaW50KCJhbGxvd19hbm5vX2tleSAyOiBpIGtleSA9IiwgaV9rZXkpCgogICAgc29tZSBwX2tleSwgXyBpbiBwX29jaS5Bbm5vdGF0aW9ucwogICAgcF9rZXkgPT0gaV9rZXkKCiAgICBwcmludCgiYWxsb3dfYW5ub19rZXkgMjogdHJ1ZSIpCn0KCiMgR2V0IHRoZSB2YWx1ZSBvZiB0aGUgU19OQU1FX0tFWSBhbm5vdGF0aW9uIGFuZAojIGNvcnJlbGF0ZSBpdCB3aXRoIG90aGVyIGFubm90YXRpb25zIGFuZCBwcm9jZXNzIGZpZWxkcy4KYWxsb3dfYnlfYW5ubyhwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpIHsKICAgIHByaW50KCJhbGxvd19ieV9hbm5vIDE6IHN0YXJ0IikKCiAgICBub3QgcF9vY2kuQW5ub3RhdGlvbnNbU19OQU1FX0tFWV0KCiAgICBpX3NfbmFtZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMTogaV9zX25hbWUgPSIsIGlfc19uYW1lKQoKICAgIGlfc19uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FU1BBQ0VfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMTogaV9zX25hbWVzcGFjZSA9IiwgaV9zX25hbWVzcGFjZSkKCiAgICBhbGxvd19ieV9zYW5kYm94X25hbWUocF9vY2ksIGlfb2NpLCBwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBpX3NfbmFtZSwgaV9zX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfYnlfYW5ubyAxOiB0cnVlIikKfQphbGxvd19ieV9hbm5vKHBfb2NpLCBpX29jaSwgcF9zdG9yYWdlcywgaV9zdG9yYWdlcykgewogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMjogc3RhcnQiKQoKICAgIHBfc19uYW1lIDo9IHBfb2NpLkFubm90YXRpb25zW1NfTkFNRV9LRVldCiAgICBpX3NfbmFtZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMjogaV9zX25hbWUgPSIsIGlfc19uYW1lLCAicF9zX25hbWUgPSIsIHBfc19uYW1lKQoKICAgIGFsbG93X3NhbmRib3hfbmFtZShwX3NfbmFtZSwgaV9zX25hbWUpCgogICAgaV9zX25hbWVzcGFjZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwcmludCgiYWxsb3dfYnlfYW5ubyAyOiBpX3NfbmFtZXNwYWNlID0iLCBpX3NfbmFtZXNwYWNlKQoKICAgIGFsbG93X2J5X3NhbmRib3hfbmFtZShwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMsIGlfc19uYW1lLCBpX3NfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd19ieV9hbm5vIDI6IHRydWUiKQp9CgphbGxvd19ieV9zYW5kYm94X25hbWUocF9vY2ksIGlfb2NpLCBwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfYnlfc2FuZGJveF9uYW1lOiBzdGFydCIpCgogICAgaV9uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FU1BBQ0VfS0VZXQoKICAgIGFsbG93X2J5X2NvbnRhaW5lcl90eXBlcyhwX29jaSwgaV9vY2ksIHNfbmFtZSwgaV9uYW1lc3BhY2UpCiAgICBhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZChwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpCiAgICBhbGxvd19wcm9jZXNzKHBfb2NpLlByb2Nlc3MsIGlfb2NpLlByb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpCgogICAgcHJpbnQoImFsbG93X2J5X3NhbmRib3hfbmFtZTogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfbmFtZShwX3NfbmFtZSwgaV9zX25hbWUpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X25hbWU6IHN0YXJ0IikKICAgIHJlZ2V4Lm1hdGNoKHBfc19uYW1lLCBpX3NfbmFtZSkKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9uYW1lOiB0cnVlIikKfQoKIyBDaGVjayB0aGF0IHRoZSAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLXR5cGUiIGFuZAojICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIiBhbm5vdGF0aW9ucyBkZXNpZ25hdGUgdGhlCiMgZXhwZWN0ZWQgdHlwZSAtIGVpdGhlciBhICJzYW5kYm94IiBvciBhICJjb250YWluZXIiLiBUaGVuLCB2YWxpZGF0ZQojIG90aGVyIGFubm90YXRpb25zIGJhc2VkIG9uIHRoZSBhY3R1YWwgInNhbmRib3giIG9yICJjb250YWluZXIiIHZhbHVlCiMgZnJvbSB0aGUgaW5wdXQgY29udGFpbmVyLgphbGxvd19ieV9jb250YWluZXJfdHlwZXMocF9vY2ksIGlfb2NpLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfYnlfY29udGFpbmVyX3R5cGVzOiBjaGVja2luZyBpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSIpCgogICAgY190eXBlIDo9ICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSIKICAgIAogICAgcF9jcmlfdHlwZSA6PSBwX29jaS5Bbm5vdGF0aW9uc1tjX3R5cGVdCiAgICBpX2NyaV90eXBlIDo9IGlfb2NpLkFubm90YXRpb25zW2NfdHlwZV0KICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZXM6IHBfY3JpX3R5cGUgPSIsIHBfY3JpX3R5cGUsICJpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgcF9jcmlfdHlwZSA9PSBpX2NyaV90eXBlCgogICAgYWxsb3dfYnlfY29udGFpbmVyX3R5cGUoaV9jcmlfdHlwZSwgcF9vY2ksIGlfb2NpLCBzX25hbWUsIHNfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZXM6IHRydWUiKQp9CgphbGxvd19ieV9jb250YWluZXJfdHlwZShpX2NyaV90eXBlLCBwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAxOiBpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgaV9jcmlfdHlwZSA9PSAic2FuZGJveCIKCiAgICBpX2thdGFfdHlwZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1siaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5jb250YWluZXJfdHlwZSJdCiAgICBwcmludCgiYWxsb3dfYnlfY29udGFpbmVyX3R5cGUgMTogaV9rYXRhX3R5cGUgPSIsIGlfa2F0YV90eXBlKQogICAgaV9rYXRhX3R5cGUgPT0gInBvZF9zYW5kYm94IgoKICAgIGFsbG93X3NhbmRib3hfY29udGFpbmVyX25hbWUocF9vY2ksIGlfb2NpKQogICAgYWxsb3dfc2FuZGJveF9uZXRfbmFtZXNwYWNlKHBfb2NpLCBpX29jaSkKICAgIGFsbG93X3NhbmRib3hfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpCgogICAgcHJpbnQoImFsbG93X2J5X2NvbnRhaW5lcl90eXBlIDE6IHRydWUiKQp9CgphbGxvd19ieV9jb250YWluZXJfdHlwZShpX2NyaV90eXBlLCBwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiBpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgaV9jcmlfdHlwZSA9PSAiY29udGFpbmVyIgoKICAgIGlfa2F0YV90eXBlIDo9IGlfb2NpLkFubm90YXRpb25zWyJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIl0KICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiBpX2thdGFfdHlwZSA9IiwgaV9rYXRhX3R5cGUpCiAgICBpX2thdGFfdHlwZSA9PSAicG9kX2NvbnRhaW5lciIKCiAgICBhbGxvd19jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpCiAgICBhbGxvd19uZXRfbmFtZXNwYWNlKHBfb2NpLCBpX29jaSkKICAgIGFsbG93X2xvZ19kaXJlY3RvcnkocF9vY2ksIGlfb2NpKQoKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiB0cnVlIikKfQoKIyAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLW5hbWUiIGFubm90YXRpb24KYWxsb3dfc2FuZGJveF9jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X2NvbnRhaW5lcl9uYW1lOiBzdGFydCIpCgogICAgY29udGFpbmVyX2Fubm90YXRpb25fbWlzc2luZyhwX29jaSwgaV9vY2ksICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItbmFtZSIpCgogICAgcHJpbnQoImFsbG93X3NhbmRib3hfY29udGFpbmVyX25hbWU6IHRydWUiKQp9CgphbGxvd19jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19jb250YWluZXJfbmFtZTogc3RhcnQiKQoKICAgIGFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uKHBfb2NpLCBpX29jaSwgImlvLmt1YmVybmV0ZXMuY3JpLmNvbnRhaW5lci1uYW1lIikKCiAgICBwcmludCgiYWxsb3dfY29udGFpbmVyX25hbWU6IHRydWUiKQp9Cgpjb250YWluZXJfYW5ub3RhdGlvbl9taXNzaW5nKHBfb2NpLCBpX29jaSwga2V5KSB7CiAgICBwcmludCgiY29udGFpbmVyX2Fubm90YXRpb25fbWlzc2luZzoiLCBrZXkpCgogICAgbm90IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIG5vdCBpX29jaS5Bbm5vdGF0aW9uc1trZXldCgogICAgcHJpbnQoImNvbnRhaW5lcl9hbm5vdGF0aW9uX21pc3Npbmc6IHRydWUiKQp9CgphbGxvd19jb250YWluZXJfYW5ub3RhdGlvbihwX29jaSwgaV9vY2ksIGtleSkgewogICAgcHJpbnQoImFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uOiBrZXkgPSIsIGtleSkKCiAgICBwX3ZhbHVlIDo9IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIGlfdmFsdWUgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgcHJpbnQoImFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uOiBwX3ZhbHVlID0iLCBwX3ZhbHVlLCAiaV92YWx1ZSA9IiwgaV92YWx1ZSkKCiAgICBwX3ZhbHVlID09IGlfdmFsdWUKCiAgICBwcmludCgiYWxsb3dfY29udGFpbmVyX2Fubm90YXRpb246IHRydWUiKQp9CgojICJuZXJkY3RsL25ldHdvcmstbmFtZXNwYWNlIiBhbm5vdGF0aW9uCmFsbG93X3NhbmRib3hfbmV0X25hbWVzcGFjZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X25ldF9uYW1lc3BhY2U6IHN0YXJ0IikKCiAgICBrZXkgOj0gIm5lcmRjdGwvbmV0d29yay1uYW1lc3BhY2UiCgogICAgcF9uYW1lc3BhY2UgOj0gcF9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgaV9uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgcHJpbnQoImFsbG93X3NhbmRib3hfbmV0X25hbWVzcGFjZTogcF9uYW1lc3BhY2UgPSIsIHBfbmFtZXNwYWNlLCAiaV9uYW1lc3BhY2UgPSIsIGlfbmFtZXNwYWNlKQoKICAgIHJlZ2V4Lm1hdGNoKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9uZXRfbmFtZXNwYWNlOiB0cnVlIikKfQoKYWxsb3dfbmV0X25hbWVzcGFjZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19uZXRfbmFtZXNwYWNlOiBzdGFydCIpCgogICAga2V5IDo9ICJuZXJkY3RsL25ldHdvcmstbmFtZXNwYWNlIgoKICAgIG5vdCBwX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICBub3QgaV9vY2kuQW5ub3RhdGlvbnNba2V5XQoKICAgIHByaW50KCJhbGxvd19uZXRfbmFtZXNwYWNlOiB0cnVlIikKfQoKIyAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1sb2ctZGlyZWN0b3J5IiBhbm5vdGF0aW9uCmFsbG93X3NhbmRib3hfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X2xvZ19kaXJlY3Rvcnk6IHN0YXJ0IikKCiAgICBrZXkgOj0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbG9nLWRpcmVjdG9yeSIKCiAgICBwX2RpciA6PSBwX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICByZWdleDEgOj0gcmVwbGFjZShwX2RpciwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHJlZ2V4MiA6PSByZXBsYWNlKHJlZ2V4MSwgIiQoc2FuZGJveC1uYW1lc3BhY2UpIiwgc19uYW1lc3BhY2UpCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiByZWdleDIgPSIsIHJlZ2V4MikKCiAgICBpX2RpciA6PSBpX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiBpX2RpciA9IiwgaV9kaXIpCgogICAgcmVnZXgubWF0Y2gocmVnZXgyLCBpX2RpcikKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiB0cnVlIikKfQoKYWxsb3dfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19sb2dfZGlyZWN0b3J5OiBzdGFydCIpCgogICAga2V5IDo9ICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWxvZy1kaXJlY3RvcnkiCgogICAgbm90IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIG5vdCBpX29jaS5Bbm5vdGF0aW9uc1trZXldCgogICAgcHJpbnQoImFsbG93X2xvZ19kaXJlY3Rvcnk6IHRydWUiKQp9CgphbGxvd19kZXZpY2VzKHBfZGV2aWNlcywgaV9kZXZpY2VzKSB7CiAgICBwcmludCgiYWxsb3dfZGV2aWNlczogc3RhcnQiKQogICAgZXZlcnkgaV9kZXZpY2UgaW4gaV9kZXZpY2VzIHsKICAgICAgICBwcmludCgiYWxsb3dfZGV2aWNlczogaV9kZXZpY2UgPSIsIGlfZGV2aWNlKQogICAgICAgIHNvbWUgcF9kZXZpY2UgaW4gcF9kZXZpY2VzCiAgICAgICAgcF9kZXZpY2UuY29udGFpbmVyX3BhdGggPT0gaV9kZXZpY2UuY29udGFpbmVyX3BhdGgKICAgIH0KICAgIHByaW50KCJhbGxvd19kZXZpY2VzOiB0cnVlIikKfQoKYWxsb3dfbGludXgoc3RhdGVfb3BzLCBwX29jaSwgaV9vY2kpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIHBfbmFtZXNwYWNlcyA6PSBwX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbGludXg6IHAgbmFtZXNwYWNlcyA9IiwgcF9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlcyA6PSBpX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbGludXg6IGkgbmFtZXNwYWNlcyA9IiwgaV9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlX3dpdGhvdXRfbmV0d29yayA6PSBbb2JqIHwgb2JqIDo9IGlfbmFtZXNwYWNlc1tfXTsgb2JqLlR5cGUgIT0gIm5ldHdvcmsiXQoKICAgIHByaW50KCJhbGxvd19saW51eDogaV9uYW1lc3BhY2Vfd2l0aG91dF9uZXR3b3JrID0iLCBpX25hbWVzcGFjZV93aXRob3V0X25ldHdvcmspCgogICAgcF9uYW1lc3BhY2VzID09IGlfbmFtZXNwYWNlX3dpdGhvdXRfbmV0d29yawoKICAgIGFsbG93X21hc2tlZF9wYXRocyhwX29jaSwgaV9vY2kpCiAgICBhbGxvd19yZWFkb25seV9wYXRocyhwX29jaSwgaV9vY2kpCiAgICBhbGxvd19saW51eF9kZXZpY2VzKHBfb2NpLkxpbnV4LkRldmljZXMsIGlfb2NpLkxpbnV4LkRldmljZXMpCiAgICBhbGxvd19saW51eF9zeXNjdGwocF9vY2kuTGludXgsIGlfb2NpLkxpbnV4KQogICAgcmV0IDo9IGFsbG93X25ldHdvcmtfbmFtZXNwYWNlX3N0YXJ0KHN0YXRlX29wcywgcF9vY2ksIGlfb2NpKQogICAgcmV0LmFsbG93ZWQKCiAgICBvcHMgOj0gcmV0Lm9wcwoKICAgIHByaW50KCJhbGxvd19saW51eDogdHJ1ZSIpCn0KCiMgUmV0cmlldmUgdGhlICJuZXR3b3JrIiBuYW1lc3BhY2UgZnJvbSB0aGUgaW5wdXQgZGF0YSBhbmQgcGFzcyBpdCBvbiBmb3IgdGhlCiMgbmV0d29yayBuYW1lc3BhY2UgcG9saWN5IGNoZWNrcy4KYWxsb3dfbmV0d29ya19uYW1lc3BhY2Vfc3RhcnQoc3RhdGVfb3BzLCBwX29jaSwgaV9vY2kpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIHByaW50KCJhbGxvd19uZXR3b3JrX25hbWVzcGFjZSBzdGFydDogc3RhcnQiKQoKICAgIHBfbmFtZXNwYWNlcyA6PSBwX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IHAgbmFtZXNwYWNlcyA9IiwgcF9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlcyA6PSBpX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IGkgbmFtZXNwYWNlcyA9IiwgaV9uYW1lc3BhY2VzKQoKICAgICMgUmV0dXJuIHBhdGggb2YgdGhlICJuZXR3b3JrIiBuYW1lc3BhY2UKICAgIG5ldHdvcmtfbnMgOj0gW29iaiB8IG9iaiA6PSBpX25hbWVzcGFjZXNbX107IG9iai5UeXBlID09ICJuZXR3b3JrIl0KCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IG5ldHdvcmtfbnMgPSIsIG5ldHdvcmtfbnMpCgogICAgcmV0IDo9IGFsbG93X25ldHdvcmtfbmFtZXNwYWNlKHN0YXRlX29wcywgbmV0d29ya19ucykKICAgIHJldC5hbGxvd2VkCgogICAgb3BzIDo9IHJldC5vcHMKfQoKIyBUaGlzIHJ1bGUgaXMgd2hlbiB0aGVyZSdzIG5vIG5ldHdvcmsgbmFtZXNwYWNlIGluIHRoZSBpbnB1dCBkYXRhLgphbGxvd19uZXR3b3JrX25hbWVzcGFjZShzdGF0ZV9vcHMsIG5ldHdvcmtfbnMpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIGNvdW50KG5ldHdvcmtfbnMpID09IDAKCiAgICBuZXR3b3JrX25zX3BhdGggPSAiIgoKICAgIGFkZF9uZXR3b3JrX25hbWVzcGFjZV90b19zdGF0ZSA6PSBzdGF0ZV9hbGxvd3MoIm5ldHdvcmtfbmFtZXNwYWNlIiwgbmV0d29ya19uc19wYXRoKQogICAgb3BzIDo9IGNvbmNhdF9vcF9pZl9ub3RfbnVsbChzdGF0ZV9vcHMsIGFkZF9uZXR3b3JrX25hbWVzcGFjZV90b19zdGF0ZSkKCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2UgMTogdHJ1ZSIpCn0KCiMgVGhpcyBydWxlIGlzIHdoZW4gdGhlcmUncyBleGFjdGx5IG9uZSBuZXR3b3JrIG5hbWVzcGFjZSBpbiB0aGUgaW5wdXQgZGF0YS4KYWxsb3dfbmV0d29ya19uYW1lc3BhY2Uoc3RhdGVfb3BzLCBuZXR3b3JrX25zKSA6PSB7Im9wcyI6IG9wcywgImFsbG93ZWQiOiB0cnVlfSB7CiAgICBjb3VudChuZXR3b3JrX25zKSA9PSAxCgogICAgYWRkX25ldHdvcmtfbmFtZXNwYWNlX3RvX3N0YXRlIDo9IHN0YXRlX2FsbG93cygibmV0d29ya19uYW1lc3BhY2UiLCBuZXR3b3JrX25zWzBdLlBhdGgpCiAgICBvcHMgOj0gY29uY2F0X29wX2lmX25vdF9udWxsKHN0YXRlX29wcywgYWRkX25ldHdvcmtfbmFtZXNwYWNlX3RvX3N0YXRlKQoKICAgIHByaW50KCJhbGxvd19uZXR3b3JrX25hbWVzcGFjZSAyOiB0cnVlIikKfQoKYWxsb3dfbWFza2VkX3BhdGhzKHBfb2NpLCBpX29jaSkgewogICAgcF9wYXRocyA6PSBwX29jaS5MaW51eC5NYXNrZWRQYXRocwogICAgcHJpbnQoImFsbG93X21hc2tlZF9wYXRocyAxOiBwX3BhdGhzID0iLCBwX3BhdGhzKQoKICAgIGlfcGF0aHMgOj0gaV9vY2kuTGludXguTWFza2VkUGF0aHMKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aHMgMTogaV9wYXRocyA9IiwgaV9wYXRocykKCiAgICBhbGxvd19tYXNrZWRfcGF0aHNfYXJyYXkocF9wYXRocywgaV9wYXRocykKCiAgICBwcmludCgiYWxsb3dfbWFza2VkX3BhdGhzIDE6IHRydWUiKQp9CmFsbG93X21hc2tlZF9wYXRocyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aHMgMjogc3RhcnQiKQoKICAgIG5vdCBwX29jaS5MaW51eC5NYXNrZWRQYXRocwogICAgbm90IGlfb2NpLkxpbnV4Lk1hc2tlZFBhdGhzCgogICAgcHJpbnQoImFsbG93X21hc2tlZF9wYXRocyAyOiB0cnVlIikKfQoKIyBBbGwgdGhlIHBvbGljeSBtYXNrZWQgcGF0aHMgbXVzdCBiZSBtYXNrZWQgaW4gdGhlIGlucHV0IGRhdGEgdG9vLgojIElucHV0IGlzIGFsbG93ZWQgdG8gaGF2ZSBtb3JlIG1hc2tlZCBwYXRocyB0aGFuIHRoZSBwb2xpY3kuCmFsbG93X21hc2tlZF9wYXRoc19hcnJheShwX2FycmF5LCBpX2FycmF5KSB7CiAgICBldmVyeSBwX2VsZW0gaW4gcF9hcnJheSB7CiAgICAgICAgYWxsb3dfbWFza2VkX3BhdGgocF9lbGVtLCBpX2FycmF5KQogICAgfQp9CgphbGxvd19tYXNrZWRfcGF0aChwX2VsZW0sIGlfYXJyYXkpIHsKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aDogcF9lbGVtID0iLCBwX2VsZW0pCgogICAgc29tZSBpX2VsZW0gaW4gaV9hcnJheQogICAgcF9lbGVtID09IGlfZWxlbQoKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aDogdHJ1ZSIpCn0KCmFsbG93X3JlYWRvbmx5X3BhdGhzKHBfb2NpLCBpX29jaSkgewogICAgcF9wYXRocyA6PSBwX29jaS5MaW51eC5SZWFkb25seVBhdGhzCiAgICBwcmludCgiYWxsb3dfcmVhZG9ubHlfcGF0aHMgMTogcF9wYXRocyA9IiwgcF9wYXRocykKCiAgICBpX3BhdGhzIDo9IGlfb2NpLkxpbnV4LlJlYWRvbmx5UGF0aHMKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAxOiBpX3BhdGhzID0iLCBpX3BhdGhzKQoKICAgIGFsbG93X3JlYWRvbmx5X3BhdGhzX2FycmF5KHBfcGF0aHMsIGlfcGF0aHMsIGlfb2NpLkxpbnV4Lk1hc2tlZFBhdGhzKQoKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAxOiB0cnVlIikKfQphbGxvd19yZWFkb25seV9wYXRocyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAyOiBzdGFydCIpCgogICAgbm90IHBfb2NpLkxpbnV4LlJlYWRvbmx5UGF0aHMKICAgIG5vdCBpX29jaS5MaW51eC5SZWFkb25seVBhdGhzCgogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGhzIDI6IHRydWUiKQp9CgojIEFsbCB0aGUgcG9saWN5IHJlYWRvbmx5IHBhdGhzIG11c3QgYmUgZWl0aGVyOgojIC0gUHJlc2VudCBpbiB0aGUgaW5wdXQgcmVhZG9ubHkgcGF0aHMsIG9yCiMgLSBQcmVzZW50IGluIHRoZSBpbnB1dCBtYXNrZWQgcGF0aHMuCiMgSW5wdXQgaXMgYWxsb3dlZCB0byBoYXZlIG1vcmUgcmVhZG9ubHkgcGF0aHMgdGhhbiB0aGUgcG9saWN5LgphbGxvd19yZWFkb25seV9wYXRoc19hcnJheShwX2FycmF5LCBpX2FycmF5LCBtYXNrZWRfcGF0aHMpIHsKICAgIGV2ZXJ5IHBfZWxlbSBpbiBwX2FycmF5IHsKICAgICAgICBhbGxvd19yZWFkb25seV9wYXRoKHBfZWxlbSwgaV9hcnJheSwgbWFza2VkX3BhdGhzKQogICAgfQp9CgphbGxvd19yZWFkb25seV9wYXRoKHBfZWxlbSwgaV9hcnJheSwgbWFza2VkX3BhdGhzKSB7CiAgICBwcmludCgiYWxsb3dfcmVhZG9ubHlfcGF0aCAxOiBwX2VsZW0gPSIsIHBfZWxlbSkKCiAgICBzb21lIGlfZWxlbSBpbiBpX2FycmF5CiAgICBwX2VsZW0gPT0gaV9lbGVtCgogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGggMTogdHJ1ZSIpCn0KYWxsb3dfcmVhZG9ubHlfcGF0aChwX2VsZW0sIGlfYXJyYXksIG1hc2tlZF9wYXRocykgewogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGggMjogcF9lbGVtID0iLCBwX2VsZW0pCgogICAgc29tZSBpX21hc2tlZCBpbiBtYXNrZWRfcGF0aHMKICAgIHBfZWxlbSA9PSBpX21hc2tlZAoKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRoIDI6IHRydWUiKQp9CgphbGxvd19saW51eF9kZXZpY2VzKHBfZGV2aWNlcywgaV9kZXZpY2VzKSB7CiAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogc3RhcnQiKQogICAgZXZlcnkgaV9kZXZpY2UgaW4gaV9kZXZpY2VzIHsKICAgICAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogaV9kZXZpY2UgPSIsIGlfZGV2aWNlKQogICAgICAgIHNvbWUgcF9kZXZpY2UgaW4gcF9kZXZpY2VzCiAgICAgICAgaV9kZXZpY2UuUGF0aCA9PSBwX2RldmljZS5QYXRoCiAgICB9CiAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogdHJ1ZSIpCn0KCmFsbG93X2xpbnV4X3N5c2N0bChwX2xpbnV4LCBpX2xpbnV4KSB7CiAgICBwcmludCgiYWxsb3dfbGludXhfc3lzY3RsIDE6IHN0YXJ0IikKICAgIG5vdCBpX2xpbnV4LlN5c2N0bAogICAgcHJpbnQoImFsbG93X2xpbnV4X3N5c2N0bCAxOiB0cnVlIikKfQoKYWxsb3dfbGludXhfc3lzY3RsKHBfbGludXgsIGlfbGludXgpIHsKICAgIHByaW50KCJhbGxvd19saW51eF9zeXNjdGwgMjogc3RhcnQiKQogICAgcF9zeXNjdGwgOj0gcF9saW51eC5TeXNjdGwKICAgIGlfc3lzY3RsIDo9IGlfbGludXguU3lzY3RsCiAgICBldmVyeSBpX25hbWUsIGlfdmFsIGluIGlfc3lzY3RsIHsKICAgICAgICBwcmludCgiYWxsb3dfbGludXhfc3lzY3RsIDI6IGlfbmFtZSA9IiwgaV9uYW1lLCAiaV92YWwgPSIsIGlfdmFsKQogICAgICAgIHBfc3lzY3RsW2lfbmFtZV0gPT0gaV92YWwKICAgIH0KICAgIHByaW50KCJhbGxvd19saW51eF9zeXNjdGwgMjogdHJ1ZSIpCn0KCiMgQ2hlY2sgdGhlIGNvbnNpc3RlbmN5IG9mIHRoZSBpbnB1dCAiaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5idW5kbGVfcGF0aCIKIyBhbmQgaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCIgdmFsdWVzIHdpdGggb3RoZXIgZmllbGRzLgphbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZChwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpIHsKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogc3RhcnQiKQoKICAgIGJ1bmRsZV9wYXRoIDo9IGlfb2NpLkFubm90YXRpb25zWyJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmJ1bmRsZV9wYXRoIl0KICAgIGJ1bmRsZV9pZCA6PSByZXBsYWNlKGJ1bmRsZV9wYXRoLCAiL3J1bi9jb250YWluZXJkL2lvLmNvbnRhaW5lcmQucnVudGltZS52Mi50YXNrL2s4cy5pby8iLCAiIikKCiAgICBidW5kbGVfaWRfZm9ybWF0IDo9IGNvbmNhdCgiIiwgWyJeIiwgQlVORExFX0lELCAiJCJdKQogICAgcmVnZXgubWF0Y2goYnVuZGxlX2lkX2Zvcm1hdCwgYnVuZGxlX2lkKQoKICAgIGtleSA6PSAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCIKCiAgICBwX3JlZ2V4IDo9IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIHNhbmRib3hfaWQgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQoKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogc2FuZGJveF9pZCA9Iiwgc2FuZGJveF9pZCwgInJlZ2V4ID0iLCBwX3JlZ2V4KQogICAgcmVnZXgubWF0Y2gocF9yZWdleCwgc2FuZGJveF9pZCkKCiAgICBhbGxvd19yb290X3BhdGgocF9vY2ksIGlfb2NpLCBidW5kbGVfaWQpCgogICAgZXZlcnkgaV9tb3VudCBpbiBpX29jaS5Nb3VudHMgewogICAgICAgIGFsbG93X21vdW50KHBfb2NpLCBpX21vdW50LCBpX3N0b3JhZ2VzLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpCiAgICB9CgogICAgYWxsb3dfc3RvcmFnZXMocF9zdG9yYWdlcywgaV9zdG9yYWdlcywgYnVuZGxlX2lkLCBzYW5kYm94X2lkKQoKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogdHJ1ZSIpCn0KCmFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHBfcHJvY2VzcyA9IiwgcF9wcm9jZXNzKQogICAgcHJpbnQoImFsbG93X3Byb2Nlc3NfY29tbW9uOiBpX3Byb2Nlc3MgPSAiLCBpX3Byb2Nlc3MpCiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHNfbmFtZSA9Iiwgc19uYW1lKQoKICAgIHBfcHJvY2Vzcy5Dd2QgPT0gaV9wcm9jZXNzLkN3ZAogICAgcF9wcm9jZXNzLk5vTmV3UHJpdmlsZWdlcyA9PSBpX3Byb2Nlc3MuTm9OZXdQcml2aWxlZ2VzCgogICAgYWxsb3dfdXNlcihwX3Byb2Nlc3MsIGlfcHJvY2VzcykKICAgIGFsbG93X2VudihwX3Byb2Nlc3MsIGlfcHJvY2Vzcywgc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHRydWUiKQp9CgojIENvbXBhcmUgdGhlIE9DSSBQcm9jZXNzIGZpZWxkIG9mIGEgcG9saWN5IGNvbnRhaW5lciB3aXRoIHRoZSBpbnB1dCBPQ0kgUHJvY2VzcyBmcm9tIGEgQ3JlYXRlQ29udGFpbmVyUmVxdWVzdAphbGxvd19wcm9jZXNzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfcHJvY2Vzczogc3RhcnQiKQoKICAgIGFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgYWxsb3dfY2FwcyhwX3Byb2Nlc3MuQ2FwYWJpbGl0aWVzLCBpX3Byb2Nlc3MuQ2FwYWJpbGl0aWVzKQogICAgcF9wcm9jZXNzLlRlcm1pbmFsID09IGlfcHJvY2Vzcy5UZXJtaW5hbAoKICAgIHByaW50KCJhbGxvd19wcm9jZXNzOiB0cnVlIikKfQoKIyBDb21wYXJlIHRoZSBPQ0kgUHJvY2VzcyBmaWVsZCBvZiBhIHBvbGljeSBjb250YWluZXIgd2l0aCB0aGUgaW5wdXQgcHJvY2VzcyBmaWVsZCBmcm9tIEV4ZWNQcm9jZXNzUmVxdWVzdAphbGxvd19pbnRlcmFjdGl2ZV9wcm9jZXNzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfaW50ZXJhY3RpdmVfcHJvY2Vzczogc3RhcnQiKQoKICAgIGFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgYWxsb3dfZXhlY19jYXBzKGlfcHJvY2Vzcy5DYXBhYmlsaXRpZXMpCgogICAgIyBUaGVzZSBhcmUgY29tbWFuZHMgZW5hYmxlZCB1c2luZyBFeGVjUHJvY2Vzc1JlcXVlc3QgY29tbWFuZHMgYW5kL29yIHJlZ2V4IGZyb20gdGhlIHNldHRpbmdzIGZpbGUuCiAgICAjIFRoZXkgY2FuIGJlIGV4ZWN1dGVkIGludGVyYWN0aXZlbHkgc28gYWxsb3cgdGhlbSB0byB1c2UgYW55IHZhbHVlIGZvciBpX3Byb2Nlc3MuVGVybWluYWwuCgogICAgcHJpbnQoImFsbG93X2ludGVyYWN0aXZlX3Byb2Nlc3M6IHRydWUiKQp9CgojIENvbXBhcmUgdGhlIE9DSSBQcm9jZXNzIGZpZWxkIG9mIGEgcG9saWN5IGNvbnRhaW5lciB3aXRoIHRoZSBpbnB1dCBwcm9jZXNzIGZpZWxkIGZyb20gRXhlY1Byb2Nlc3NSZXF1ZXN0CmFsbG93X3Byb2JlX3Byb2Nlc3MocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19wcm9iZV9wcm9jZXNzOiBzdGFydCIpCgogICAgYWxsb3dfcHJvY2Vzc19jb21tb24ocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpCiAgICBhbGxvd19leGVjX2NhcHMoaV9wcm9jZXNzLkNhcGFiaWxpdGllcykKICAgIHBfcHJvY2Vzcy5UZXJtaW5hbCA9PSBpX3Byb2Nlc3MuVGVybWluYWwKCiAgICBwcmludCgiYWxsb3dfcHJvYmVfcHJvY2VzczogdHJ1ZSIpCn0KCmFsbG93X3VzZXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MpIHsKICAgIHBfdXNlciA6PSBwX3Byb2Nlc3MuVXNlcgogICAgaV91c2VyIDo9IGlfcHJvY2Vzcy5Vc2VyCgogICAgcHJpbnQoImFsbG93X3VzZXI6IGlucHV0IHVpZCA9IiwgaV91c2VyLlVJRCwgInBvbGljeSB1aWQgPSIsIHBfdXNlci5VSUQpCiAgICBwX3VzZXIuVUlEID09IGlfdXNlci5VSUQKCiAgICAjIFRPRE86IHRyYWNrIGRvd24gdGhlIHJlYXNvbiBmb3IgcmVnaXN0cnkuazhzLmlvL3BhdXNlOjMuOSBiZWluZwogICAgIyAgICAgICBleGVjdXRlZCB3aXRoIGdpZCA9IDAgZGVzcGl0ZSBoYXZpbmcgIjY1NTM1OjY1NTM1IiBpbiBpdHMgY29udGFpbmVyIGltYWdlCiAgICAjICAgICAgIGNvbmZpZy4KICAgICNwcmludCgiYWxsb3dfdXNlcjogaW5wdXQgZ2lkID0iLCBpX3VzZXIuR0lELCAicG9saWN5IGdpZCA9IiwgcF91c2VyLkdJRCkKICAgICNwX3VzZXIuR0lEID09IGlfdXNlci5HSUQKCiAgICAjIFRPRE86IGNvbXBhcmUgdGhlIGFkZGl0aW9uYWxHaWRzIGZpZWxkIHRvbyBhZnRlciBjb21wdXRpbmcgaXRzIHZhbHVlCiAgICAjIGJhc2VkIG9uIC9ldGMvcGFzc3dkIGFuZCAvZXRjL2dyb3VwIGZyb20gdGhlIGNvbnRhaW5lciBpbWFnZS4KfQoKYWxsb3dfZGVwcmVjYXRlZF9hcmdzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZ3MgMTogbm8gYXJncyIpCgogICAgbm90IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJncwogICAgbm90IGlfcHJvY2Vzcy5BcmdzCgogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAxOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZ3MocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSkgewogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiBwb2xpY3kgYXJncyA9IiwgcF9wcm9jZXNzLkRlcHJlY2F0ZWRBcmdzKQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiBpbnB1dCBhcmdzID0iLCBpX3Byb2Nlc3MuQXJncykKCiAgICBjb3VudChwX3Byb2Nlc3MuRGVwcmVjYXRlZEFyZ3MpID09IGNvdW50KGlfcHJvY2Vzcy5BcmdzKQoKICAgIGV2ZXJ5IGksIGlfYXJnIGluIGlfcHJvY2Vzcy5BcmdzIHsKICAgICAgICBhbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpCiAgICB9CgogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDE6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgcF9hcmcyIDo9IHJlcGxhY2UocF9hcmcsICIkJCIsICIkIikKICAgIHBfYXJnMiA9PSBpX2FyZwoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAxOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDI6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgIyBUT0RPOiBjYW4gJChub2RlLW5hbWUpIGJlIGhhbmRsZWQgYmV0dGVyPwogICAgY29udGFpbnMocF9hcmcsICIkKG5vZGUtbmFtZSkiKQoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAyOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDM6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgcF9hcmcyIDo9IHJlcGxhY2UocF9hcmcsICIkJCIsICIkIikKICAgIHBfYXJnMyA6PSByZXBsYWNlKHBfYXJnMiwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAzOiBwX2FyZzMgPSIsIHBfYXJnMykKICAgIHBfYXJnMyA9PSBpX2FyZwoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAzOiB0cnVlIikKfQoKIyBPQ0kgcHJvY2Vzcy5FbnYgZmllbGQKYWxsb3dfZW52KHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfZW52OiBwIGVudiA9IiwgcF9wcm9jZXNzLkVudikKICAgIHByaW50KCJhbGxvd19lbnY6IGkgZW52ID0iLCBpX3Byb2Nlc3MuRW52KQoKICAgIGV2ZXJ5IGlfdmFyIGluIGlfcHJvY2Vzcy5FbnYgewogICAgICAgIHByaW50KCJhbGxvd19lbnY6IGlfdmFyID0iLCBpX3ZhcikKICAgICAgICBhbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgfQoKICAgIHByaW50KCJhbGxvd19lbnY6IHRydWUiKQp9CgojIEFsbG93IGlucHV0IGVudiB2YXJpYWJsZXMgdGhhdCBhcmUgcHJlc2VudCBpbiB0aGUgcG9saWN5IGRhdGEgdG9vLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHBfdmFyID09IGlfdmFyCiAgICBwcmludCgiYWxsb3dfdmFyIDE6IHRydWUiKQp9CgojIE1hdGNoIGlucHV0IHdpdGggb25lIG9mIHRoZSBwb2xpY3kgdmFyaWFibGVzLCBhZnRlciBzdWJzdGl0dXRpbmcgJChzYW5kYm94LW5hbWUpLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHByaW50KCJhbGxvd192YXIgMjogcF92YXIgPSIsIHBfdmFyKQoKICAgIHBfdmFyX3NwbGl0IDo9IHNwbGl0KHBfdmFyLCAiPSIpCiAgICBjb3VudChwX3Zhcl9zcGxpdCkgPT0gMgoKICAgIHBfdmFyX3NwbGl0WzFdID09ICIkKHNhbmRib3gtbmFtZSkiCgogICAgaV92YXJfc3BsaXQgOj0gc3BsaXQoaV92YXIsICI9IikKICAgIGNvdW50KGlfdmFyX3NwbGl0KSA9PSAyCgogICAgaV92YXJfc3BsaXRbMF0gPT0gcF92YXJfc3BsaXRbMF0KICAgIHJlZ2V4Lm1hdGNoKHNfbmFtZSwgaV92YXJfc3BsaXRbMV0pCgogICAgcHJpbnQoImFsbG93X3ZhciAyOiB0cnVlIikKfQoKIyBBbGxvdyBpbnB1dCBlbnYgdmFyaWFibGVzIHRoYXQgbWF0Y2ggd2l0aCBhIHJlcXVlc3RfZGVmYXVsdHMgcmVnZXguCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHNvbWUgcF9yZWdleDEgaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5DcmVhdGVDb250YWluZXJSZXF1ZXN0LmFsbG93X2Vudl9yZWdleAogICAgcF9yZWdleDIgOj0gcmVwbGFjZShwX3JlZ2V4MSwgIiQoaXB2NF9hKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcHY0X2EpCiAgICBwX3JlZ2V4MyA6PSByZXBsYWNlKHBfcmVnZXgyLCAiJChpcF9wKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcF9wKQogICAgcF9yZWdleDQgOj0gcmVwbGFjZShwX3JlZ2V4MywgIiQoc3ZjX25hbWUpIiwgcG9saWN5X2RhdGEuY29tbW9uLnN2Y19uYW1lKQogICAgcF9yZWdleDUgOj0gcmVwbGFjZShwX3JlZ2V4NCwgIiQoZG5zX2xhYmVsKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5kbnNfbGFiZWwpCgogICAgcHJpbnQoImFsbG93X3ZhciAzOiBwX3JlZ2V4NSA9IiwgcF9yZWdleDUpCiAgICByZWdleC5tYXRjaChwX3JlZ2V4NSwgaV92YXIpCgogICAgcHJpbnQoImFsbG93X3ZhciAzOiB0cnVlIikKfQoKIyBBbGxvdyBmaWVsZFJlZiAiZmllbGRQYXRoOiBzdGF0dXMucG9kSVAiIHZhbHVlcy4KYWxsb3dfdmFyKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBpX3Zhciwgc19uYW1lLCBzX25hbWVzcGFjZSkgewogICAgbmFtZV92YWx1ZSA6PSBzcGxpdChpX3ZhciwgIj0iKQogICAgY291bnQobmFtZV92YWx1ZSkgPT0gMgogICAgaXNfaXAobmFtZV92YWx1ZVsxXSkKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIGFsbG93X3BvZF9pcF92YXIobmFtZV92YWx1ZVswXSwgcF92YXIpCgogICAgcHJpbnQoImFsbG93X3ZhciA0OiB0cnVlIikKfQoKIyBBbGxvdyBjb21tb24gZmllbGRSZWYgdmFyaWFibGVzLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBuYW1lX3ZhbHVlIDo9IHNwbGl0KGlfdmFyLCAiPSIpCiAgICBjb3VudChuYW1lX3ZhbHVlKSA9PSAyCgogICAgc29tZSBwX3ZhciBpbiBwX3Byb2Nlc3MuRW52CiAgICBwX25hbWVfdmFsdWUgOj0gc3BsaXQocF92YXIsICI9IikKICAgIGNvdW50KHBfbmFtZV92YWx1ZSkgPT0gMgoKICAgIHBfbmFtZV92YWx1ZVswXSA9PSBuYW1lX3ZhbHVlWzBdCgogICAgIyBUT0RPOiBzaG91bGQgdGhlc2UgYmUgaGFuZGxlZCBpbiBhIGRpZmZlcmVudCB3YXk/CiAgICBhbHdheXNfYWxsb3dlZCA6PSBbIiQoaG9zdC1uYW1lKSIsICIkKG5vZGUtbmFtZSkiLCAiJChwb2QtdWlkKSJdCiAgICBzb21lIGFsbG93ZWQgaW4gYWx3YXlzX2FsbG93ZWQKICAgIGNvbnRhaW5zKHBfbmFtZV92YWx1ZVsxXSwgYWxsb3dlZCkKCiAgICBwcmludCgiYWxsb3dfdmFyIDU6IHRydWUiKQp9CgojIEFsbG93IGZpZWxkUmVmICJmaWVsZFBhdGg6IHN0YXR1cy5ob3N0SVAiIHZhbHVlcy4KYWxsb3dfdmFyKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBpX3Zhciwgc19uYW1lLCBzX25hbWVzcGFjZSkgewogICAgbmFtZV92YWx1ZSA6PSBzcGxpdChpX3ZhciwgIj0iKQogICAgY291bnQobmFtZV92YWx1ZSkgPT0gMgogICAgaXNfaXAobmFtZV92YWx1ZVsxXSkKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIGFsbG93X2hvc3RfaXBfdmFyKG5hbWVfdmFsdWVbMF0sIHBfdmFyKQoKICAgIHByaW50KCJhbGxvd192YXIgNjogdHJ1ZSIpCn0KCiMgQWxsb3cgcmVzb3VyY2VGaWVsZFJlZiB2YWx1ZXMgKGUuZy4sICJsaW1pdHMuY3B1IikuCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIG5hbWVfdmFsdWUgOj0gc3BsaXQoaV92YXIsICI9IikKICAgIGNvdW50KG5hbWVfdmFsdWUpID09IDIKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHBfbmFtZV92YWx1ZSA6PSBzcGxpdChwX3ZhciwgIj0iKQogICAgY291bnQocF9uYW1lX3ZhbHVlKSA9PSAyCgogICAgcF9uYW1lX3ZhbHVlWzBdID09IG5hbWVfdmFsdWVbMF0KCiAgICAjIGEgdmFyaWFibGUgd2Ugc2hvdWxkIGJlIHZhbGlkYXRpbmcgdXNpbmcgYSByZWdleCBmcm9tIHNldHRpbmdzCiAgICBwX25hbWVfdmFsdWVbMV0gPT0gIiQodmFsaWRhdGUtZnJvbS1zZXR0aW5ncykiCgogICAgcmVnZXhfdmFsIDo9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuQ3JlYXRlQ29udGFpbmVyUmVxdWVzdC5hbGxvd19lbnZfcmVnZXhfbWFwW25hbWVfdmFsdWVbMF1dCgogICAgcHJpbnQoImFsbG93X3ZhciA3OiB2YWwgPSIsIG5hbWVfdmFsdWVbMV0pCiAgICBwcmludCgiYWxsb3dfdmFyIDc6IHJlZ2V4X3ZhbCA9IiwgcmVnZXhfdmFsKQoKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4X3ZhbCwgbmFtZV92YWx1ZVsxXSkKCiAgICBwcmludCgiYWxsb3dfdmFyIDc6IHRydWUiKQp9CgojIE1hdGNoIGlucHV0IHdpdGggb25lIG9mIHRoZSBwb2xpY3kgdmFyaWFibGVzLCBhZnRlciBzdWJzdGl0dXRpbmcgJChzYW5kYm94LW5hbWVzcGFjZSkuCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHNvbWUgcF92YXIgaW4gcF9wcm9jZXNzLkVudgogICAgcF92YXIyIDo9IHJlcGxhY2UocF92YXIsICIkKHNhbmRib3gtbmFtZXNwYWNlKSIsIHNfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd192YXIgODogcF92YXIyID0iLCBwX3ZhcjIpCiAgICBwX3ZhcjIgPT0gaV92YXIKCiAgICBwcmludCgiYWxsb3dfdmFyIDg6IHRydWUiKQp9CgphbGxvd19wb2RfaXBfdmFyKHZhcl9uYW1lLCBwX3ZhcikgewogICAgcHJpbnQoImFsbG93X3BvZF9pcF92YXI6IHZhcl9uYW1lID0iLCB2YXJfbmFtZSwgInBfdmFyID0iLCBwX3ZhcikKCiAgICBwX25hbWVfdmFsdWUgOj0gc3BsaXQocF92YXIsICI9IikKICAgIGNvdW50KHBfbmFtZV92YWx1ZSkgPT0gMgoKICAgIHBfbmFtZV92YWx1ZVswXSA9PSB2YXJfbmFtZQogICAgcF9uYW1lX3ZhbHVlWzFdID09ICIkKHBvZC1pcCkiCgogICAgcHJpbnQoImFsbG93X3BvZF9pcF92YXI6IHRydWUiKQp9CgphbGxvd19ob3N0X2lwX3Zhcih2YXJfbmFtZSwgcF92YXIpIHsKICAgIHByaW50KCJhbGxvd19ob3N0X2lwX3ZhcjogdmFyX25hbWUgPSIsIHZhcl9uYW1lLCAicF92YXIgPSIsIHBfdmFyKQoKICAgIHBfbmFtZV92YWx1ZSA6PSBzcGxpdChwX3ZhciwgIj0iKQogICAgY291bnQocF9uYW1lX3ZhbHVlKSA9PSAyCgogICAgcF9uYW1lX3ZhbHVlWzBdID09IHZhcl9uYW1lCiAgICBwX25hbWVfdmFsdWVbMV0gPT0gIiQoaG9zdC1pcCkiCgogICAgcHJpbnQoImFsbG93X2hvc3RfaXBfdmFyOiB0cnVlIikKfQoKaXNfaXAodmFsdWUpIHsKICAgIGJ5dGVzID0gc3BsaXQodmFsdWUsICIuIikKICAgIGNvdW50KGJ5dGVzKSA9PSA0CgogICAgaXNfaXBfZmlyc3RfYnl0ZShieXRlc1swXSkKICAgIGlzX2lwX290aGVyX2J5dGUoYnl0ZXNbMV0pCiAgICBpc19pcF9vdGhlcl9ieXRlKGJ5dGVzWzJdKQogICAgaXNfaXBfb3RoZXJfYnl0ZShieXRlc1szXSkKfQppc19pcF9maXJzdF9ieXRlKGNvbXBvbmVudCkgewogICAgbnVtYmVyID0gdG9fbnVtYmVyKGNvbXBvbmVudCkKICAgIG51bWJlciA+PSAxCiAgICBudW1iZXIgPD0gMjU1Cn0KaXNfaXBfb3RoZXJfYnl0ZShjb21wb25lbnQpIHsKICAgIG51bWJlciA9IHRvX251bWJlcihjb21wb25lbnQpCiAgICBudW1iZXIgPj0gMAogICAgbnVtYmVyIDw9IDI1NQp9CgojIE9DSSByb290LlBhdGgKYWxsb3dfcm9vdF9wYXRoKHBfb2NpLCBpX29jaSwgYnVuZGxlX2lkKSB7CiAgICBpX3BhdGggOj0gaV9vY2kuUm9vdC5QYXRoCiAgICBwX3BhdGgxIDo9IHBfb2NpLlJvb3QuUGF0aAogICAgcHJpbnQoImFsbG93X3Jvb3RfcGF0aDogaV9wYXRoID0iLCBpX3BhdGgsICJwX3BhdGgxID0iLCBwX3BhdGgxKQoKICAgIHBfcGF0aDIgOj0gcmVwbGFjZShwX3BhdGgxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfcm9vdF9wYXRoOiBwX3BhdGgyID0iLCBwX3BhdGgyKQoKICAgIHBfcGF0aDMgOj0gcmVwbGFjZShwX3BhdGgyLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X3Jvb3RfcGF0aDogcF9wYXRoMyA9IiwgcF9wYXRoMykKCiAgICBwX3BhdGgzID09IGlfcGF0aAoKICAgIHByaW50KCJhbGxvd19yb290X3BhdGg6IHRydWUiKQp9CgojIGRldmljZSBtb3VudHMKYWxsb3dfbW91bnQocF9vY2ksIGlfbW91bnQsIGlfc3RvcmFnZXMsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcHJpbnQoImFsbG93X21vdW50OiBpX21vdW50ID0iLCBpX21vdW50KQoKICAgIHNvbWUgcF9tb3VudCBpbiBwX29jaS5Nb3VudHMKICAgIHNvbWUgaV9zdG9yYWdlIGluIGlfc3RvcmFnZXMKCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IHBfbW91bnQgPSIsIHBfbW91bnQpCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IGlfc3RvcmFnZSA9IiwgaV9zdG9yYWdlKQoKICAgIGNoZWNrX21vdW50KHBfbW91bnQsIGlfbW91bnQsIGlfc3RvcmFnZSwgYnVuZGxlX2lkLCBzYW5kYm94X2lkKQoKICAgICMgVE9ETzogYXJlIHRoZXJlIGFueSBvdGhlciByZXF1aXJlZCBwb2xpY3kgY2hlY2tzIGZvciBtb3VudHMgLSBlLmcuLAogICAgIyAgICAgICBtdWx0aXBsZSBtb3VudHMgd2l0aCBzYW1lIHNvdXJjZSBvciBkZXN0aW5hdGlvbj8KCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IHRydWUiKQp9CgpjaGVja19tb3VudChwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcF9tb3VudCA9PSBpX21vdW50CiAgICBwcmludCgiY2hlY2tfbW91bnQgMTogdHJ1ZSIpCn0KY2hlY2tfbW91bnQocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHBfbW91bnQuZGVzdGluYXRpb24gPT0gaV9tb3VudC5kZXN0aW5hdGlvbgogICAgcF9tb3VudC50eXBlXyA9PSBpX21vdW50LnR5cGVfCiAgICBwX21vdW50Lm9wdGlvbnMgPT0gaV9tb3VudC5vcHRpb25zCgogICAgbW91bnRfc291cmNlX2FsbG93cyhwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkKCiAgICBwcmludCgiY2hlY2tfbW91bnQgMjogdHJ1ZSIpCn0KCm1vdW50X3NvdXJjZV9hbGxvd3MocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHJlZ2V4MSA6PSBwX21vdW50LnNvdXJjZQogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5tb3VudF9zb3VyY2VfY3BhdGgpCiAgICByZWdleDQgOj0gcmVwbGFjZShyZWdleDMsICIkKGJ1bmRsZS1pZCkiLCBidW5kbGVfaWQpCgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMTogcmVnZXg0ID0iLCByZWdleDQpCiAgICByZWdleC5tYXRjaChyZWdleDQsIGlfbW91bnQuc291cmNlKQoKICAgIHByaW50KCJtb3VudF9zb3VyY2VfYWxsb3dzIDE6IHRydWUiKQp9Cm1vdW50X3NvdXJjZV9hbGxvd3MocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHJlZ2V4MSA6PSBwX21vdW50LnNvdXJjZQogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5tb3VudF9zb3VyY2VfY3BhdGgpCiAgICByZWdleDQgOj0gcmVwbGFjZShyZWdleDMsICIkKHNhbmRib3gtaWQpIiwgc2FuZGJveF9pZCkKCiAgICBwcmludCgibW91bnRfc291cmNlX2FsbG93cyAyOiByZWdleDQgPSIsIHJlZ2V4NCkKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4NCwgaV9tb3VudC5zb3VyY2UpCgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMjogdHJ1ZSIpCn0KbW91bnRfc291cmNlX2FsbG93cyhwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogaV9tb3VudC5zb3VyY2UgPSIsIGlfbW91bnQuc291cmNlKQogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogaV9zdG9yYWdlLm1vdW50X3BvaW50ID0iLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCgogICAgaV9tb3VudC5zb3VyY2UgPT0gaV9zdG9yYWdlLm1vdW50X3BvaW50CgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogdHJ1ZSIpCn0KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBDcmVhdGUgY29udGFpbmVyIFN0b3JhZ2VzCgphbGxvd19zdG9yYWdlcyhwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHBfY291bnQgOj0gY291bnQocF9zdG9yYWdlcykKICAgIGlfY291bnQgOj0gY291bnQoaV9zdG9yYWdlcykKICAgIHByaW50KCJhbGxvd19zdG9yYWdlczogcF9jb3VudCA9IiwgcF9jb3VudCwgImlfY291bnQgPSIsIGlfY291bnQpCgogICAgcF9jb3VudCA9PSBpX2NvdW50CgogICAgIyBHZXQgdGhlIGNvbnRhaW5lciBpbWFnZSBsYXllciBJRHMgYW5kIHZlcml0eSByb290IGhhc2hlcywgZnJvbSB0aGUgIm92ZXJsYXlmcyIgc3RvcmFnZS4KICAgIHNvbWUgb3ZlcmxheV9zdG9yYWdlIGluIHBfc3RvcmFnZXMKICAgIG92ZXJsYXlfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIHByaW50KCJhbGxvd19zdG9yYWdlczogb3ZlcmxheV9zdG9yYWdlID0iLCBvdmVybGF5X3N0b3JhZ2UpCiAgICBjb3VudChvdmVybGF5X3N0b3JhZ2Uub3B0aW9ucykgPT0gMgoKICAgIGxheWVyX2lkcyA6PSBzcGxpdChvdmVybGF5X3N0b3JhZ2Uub3B0aW9uc1swXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiBsYXllcl9pZHMgPSIsIGxheWVyX2lkcykKCiAgICByb290X2hhc2hlcyA6PSBzcGxpdChvdmVybGF5X3N0b3JhZ2Uub3B0aW9uc1sxXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiByb290X2hhc2hlcyA9Iiwgcm9vdF9oYXNoZXMpCgogICAgZXZlcnkgaV9zdG9yYWdlIGluIGlfc3RvcmFnZXMgewogICAgICAgIGFsbG93X3N0b3JhZ2UocF9zdG9yYWdlcywgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpCiAgICB9CgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiB0cnVlIikKfQoKYWxsb3dfc3RvcmFnZShwX3N0b3JhZ2VzLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgc29tZSBwX3N0b3JhZ2UgaW4gcF9zdG9yYWdlcwoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiBwX3N0b3JhZ2UgPSIsIHBfc3RvcmFnZSkKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiBpX3N0b3JhZ2UgPSIsIGlfc3RvcmFnZSkKCiAgICBwX3N0b3JhZ2UuZHJpdmVyICAgICAgICAgICA9PSBpX3N0b3JhZ2UuZHJpdmVyCiAgICBwX3N0b3JhZ2UuZHJpdmVyX29wdGlvbnMgICA9PSBpX3N0b3JhZ2UuZHJpdmVyX29wdGlvbnMKICAgIHBfc3RvcmFnZS5mc19ncm91cCAgICAgICAgID09IGlfc3RvcmFnZS5mc19ncm91cAogICAgcF9zdG9yYWdlLmZzdHlwZSAgICAgICAgICAgPT0gaV9zdG9yYWdlLmZzdHlwZQoKICAgIGFsbG93X3N0b3JhZ2Vfc291cmNlKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKQogICAgYWxsb3dfc3RvcmFnZV9vcHRpb25zKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKQogICAgYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKQoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiB0cnVlIikKfQoKYWxsb3dfc3RvcmFnZV9zb3VyY2UocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX3NvdXJjZSAxOiBzdGFydCIpCgogICAgcF9zdG9yYWdlLnNvdXJjZSA9PSBpX3N0b3JhZ2Uuc291cmNlCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDE6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX3NvdXJjZShwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDI6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCgogICAgIyBEREREOkJCOkRELkY6IERvbWFpbjpCdXM6RGV2aWNlLkZ1bmN0aW9uCiAgICAjIGh0dHBzOi8vd3d3Lmtlcm5lbC5vcmcvZG9jL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtYnVzLXBjaQogICAgcmVnZXgubWF0Y2goYF5bYS1mMC05XXs0fTpbYS1mMC05XXsyfTpbYS1mMC05XXsyfVwuW2EtZjAtOV0kYCwgaV9zdG9yYWdlLnNvdXJjZSkKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9zb3VyY2UgMjogdHJ1ZSIpCn0KCmFsbG93X3N0b3JhZ2Vfc291cmNlKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKSB7CiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9zb3VyY2UgMzogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIGlfc3RvcmFnZS5zb3VyY2UgPT0gIm5vbmUiCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDM6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX3NvdXJjZShwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDQ6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJzbWIiCgogICAgIyBQYXR0ZXJuOiAvLzxzdG9yYWdlLWFjY291bnQtbmFtZT4uZmlsZS5jb3JlLndpbmRvd3MubmV0LzxrOHMtUFZDLW5hbWU+CiAgICAjIFN0b3JhZ2UgYWNjb3VudCBuYW1lOiBodHRwczovL2xlYXJuLm1pY3Jvc29mdC5jb20vZW4tdXMvYXp1cmUvc3RvcmFnZS9jb21tb24vc3RvcmFnZS1hY2NvdW50LW92ZXJ2aWV3I3N0b3JhZ2UtYWNjb3VudC1uYW1lCiAgICAjIEs4cyBQVkMgbmFtZTogaHR0cHM6Ly9rdWJlcm5ldGVzLmlvL2RvY3MvY29uY2VwdHMvb3ZlcnZpZXcvd29ya2luZy13aXRoLW9iamVjdHMvbmFtZXMvI2Rucy1zdWJkb21haW4tbmFtZXMKICAgIHJlZ2V4Lm1hdGNoKGBeXC9cLyhbYS16MC05XXszLDI0fSlcLmZpbGVcLmNvcmVcLndpbmRvd3NcLm5ldFwvW2EtejAtOV0oW2EtejAtOS4tXXswLDI1MX1bYS16MC05XSk/JGAsIGlfc3RvcmFnZS5zb3VyY2UpCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDQ6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMTogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgIT0gIm92ZXJsYXlmcyIKICAgIHBfc3RvcmFnZS5vcHRpb25zID09IGlfc3RvcmFnZS5vcHRpb25zCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAxOiB0cnVlIikKfQphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIGNvdW50KHBfc3RvcmFnZS5vcHRpb25zKSA9PSAyCgogICAgcG9saWN5X2lkcyA6PSBzcGxpdChwX3N0b3JhZ2Uub3B0aW9uc1swXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBwb2xpY3lfaWRzID0iLCBwb2xpY3lfaWRzKQogICAgcG9saWN5X2lkcyA9PSBsYXllcl9pZHMKCiAgICBwb2xpY3lfaGFzaGVzIDo9IHNwbGl0KHBfc3RvcmFnZS5vcHRpb25zWzFdLCAiOiIpCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IHBvbGljeV9oYXNoZXMgPSIsIHBvbGljeV9oYXNoZXMpCgogICAgcF9jb3VudCA6PSBjb3VudChwb2xpY3lfaWRzKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBwX2NvdW50ID0iLCBwX2NvdW50KQogICAgcF9jb3VudCA+PSAxCiAgICBwX2NvdW50ID09IGNvdW50KHBvbGljeV9oYXNoZXMpCgogICAgaV9jb3VudCA6PSBjb3VudChpX3N0b3JhZ2Uub3B0aW9ucykKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogaV9jb3VudCA9IiwgaV9jb3VudCkKICAgIGlfY291bnQgPT0gcF9jb3VudCArIDMKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zWzBdID0iLCBpX3N0b3JhZ2Uub3B0aW9uc1swXSkKICAgIGlfc3RvcmFnZS5vcHRpb25zWzBdID09ICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQubGF5ZXItc3JjLXByZWZpeD0vdmFyL2xpYi9jb250YWluZXJkL2lvLmNvbnRhaW5lcmQuc25hcHNob3R0ZXIudjEudGFyZGV2L2xheWVycyIKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zW2lfY291bnQgLSAyXSA9IiwgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDJdKQogICAgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDJdID09ICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQub3ZlcmxheS1ydyIKCiAgICBsb3dlcmRpciA6PSBjb25jYXQoIj0iLCBbImxvd2VyZGlyIiwgcF9zdG9yYWdlLm9wdGlvbnNbMF1dKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBsb3dlcmRpciA9IiwgbG93ZXJkaXIpCgogICAgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDFdID09IGxvd2VyZGlyCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zW2lfY291bnQgLSAxXSA9IiwgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDFdKQoKICAgIGV2ZXJ5IGksIHBvbGljeV9pZCBpbiBwb2xpY3lfaWRzIHsKICAgICAgICBhbGxvd19vdmVybGF5X2xheWVyKHBvbGljeV9pZCwgcG9saWN5X2hhc2hlc1tpXSwgaV9zdG9yYWdlLm9wdGlvbnNbaSArIDFdKQogICAgfQoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogdHJ1ZSIpCn0KYWxsb3dfc3RvcmFnZV9vcHRpb25zKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKSB7CiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDM6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCiAgICBjb3VudChwX3N0b3JhZ2Uub3B0aW9ucykgPT0gMQoKICAgIHN0YXJ0c3dpdGgocF9zdG9yYWdlLm9wdGlvbnNbMF0sICIkKGhhc2giKQogICAgaGFzaF9zdWZmaXggOj0gdHJpbV9sZWZ0KHBfc3RvcmFnZS5vcHRpb25zWzBdLCAiJChoYXNoIikKCiAgICBlbmRzd2l0aChoYXNoX3N1ZmZpeCwgIikiKQogICAgaGFzaF9pbmRleCA6PSB0cmltX3JpZ2h0KGhhc2hfc3VmZml4LCAiKSIpCiAgICBpIDo9IHRvX251bWJlcihoYXNoX2luZGV4KQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAzOiBpID0iLCBpKQoKICAgIGhhc2hfb3B0aW9uIDo9IGNvbmNhdCgiPSIsIFsiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LnJvb3QtaGFzaCIsIHJvb3RfaGFzaGVzW2ldXSkKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMzogaGFzaF9vcHRpb24gPSIsIGhhc2hfb3B0aW9uKQoKICAgIGNvdW50KGlfc3RvcmFnZS5vcHRpb25zKSA9PSA0CiAgICBpX3N0b3JhZ2Uub3B0aW9uc1swXSA9PSAicm8iCiAgICBpX3N0b3JhZ2Uub3B0aW9uc1sxXSA9PSAiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmJsb2NrX2RldmljZT1maWxlIgogICAgaV9zdG9yYWdlLm9wdGlvbnNbMl0gPT0gImlvLmthdGFjb250YWluZXJzLmZzLW9wdC5pcy1sYXllciIKICAgIGlfc3RvcmFnZS5vcHRpb25zWzNdID09IGhhc2hfb3B0aW9uCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAzOiB0cnVlIikKfQphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgNDogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gInNtYiIKICAgIHBfb3B0c19jb3VudCA6PSBjb3VudChwX3N0b3JhZ2Uub3B0aW9ucykKICAgIGlfb3B0c19jb3VudCA6PSBjb3VudChpX3N0b3JhZ2Uub3B0aW9ucykKICAgIGlfb3B0c19jb3VudCA9PSBwX29wdHNfY291bnQgKyAyCgogICAgaV9vcHRfbWF0Y2hlcyA6PSBbaSB8IGkgOj0gaWR4OyBpZHggPCBwX29wdHNfY291bnQ7IHBfc3RvcmFnZS5vcHRpb25zW2lkeF0gPT0gaV9zdG9yYWdlLm9wdGlvbnNbaWR4XV0KICAgIGNvdW50KGlfb3B0X21hdGNoZXMpID09IHBfb3B0c19jb3VudAoKICAgIHN0YXJ0c3dpdGgoaV9zdG9yYWdlLm9wdGlvbnNbaV9vcHRzX2NvdW50LTJdLCAiYWRkcj0iKQogICAgY3JlZHMgPSBzcGxpdChpX3N0b3JhZ2Uub3B0aW9uc1tpX29wdHNfY291bnQtMV0sICIsIikKICAgIGNvdW50KGNyZWRzKSA9PSAyCiAgICBzdGFydHN3aXRoKGNyZWRzWzBdLCAidXNlcm5hbWU9IikKICAgIHN0YXJ0c3dpdGgoY3JlZHNbMV0sICJwYXNzd29yZD0iKQogICAgCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDQ6IHRydWUiKQp9CgphbGxvd19vdmVybGF5X2xheWVyKHBvbGljeV9pZCwgcG9saWN5X2hhc2gsIGlfb3B0aW9uKSB7CiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogcG9saWN5X2lkID0iLCBwb2xpY3lfaWQsICJwb2xpY3lfaGFzaCA9IiwgcG9saWN5X2hhc2gpCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogaV9vcHRpb24gPSIsIGlfb3B0aW9uKQoKICAgIHN0YXJ0c3dpdGgoaV9vcHRpb24sICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQubGF5ZXI9IikKICAgIGlfdmFsdWUgOj0gcmVwbGFjZShpX29wdGlvbiwgImlvLmthdGFjb250YWluZXJzLmZzLW9wdC5sYXllcj0iLCAiIikKICAgIGlfdmFsdWVfZGVjb2RlZCA6PSBiYXNlNjQuZGVjb2RlKGlfdmFsdWUpCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogaV92YWx1ZV9kZWNvZGVkID0iLCBpX3ZhbHVlX2RlY29kZWQpCgogICAgcG9saWN5X3N1ZmZpeCA6PSBjb25jYXQoIj0iLCBbInRhcixybyxpby5rYXRhY29udGFpbmVycy5mcy1vcHQuYmxvY2tfZGV2aWNlPWZpbGUsaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmlzLWxheWVyLGlvLmthdGFjb250YWluZXJzLmZzLW9wdC5yb290LWhhc2giLCBwb2xpY3lfaGFzaF0pCiAgICBwX3ZhbHVlIDo9IGNvbmNhdCgiLCIsIFtwb2xpY3lfaWQsIHBvbGljeV9zdWZmaXhdKQogICAgcHJpbnQoImFsbG93X292ZXJsYXlfbGF5ZXI6IHBfdmFsdWUgPSIsIHBfdmFsdWUpCgogICAgcF92YWx1ZSA9PSBpX3ZhbHVlX2RlY29kZWQKCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogdHJ1ZSIpCn0KCmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAidGFyIgoKICAgIHN0YXJ0c3dpdGgocF9zdG9yYWdlLm1vdW50X3BvaW50LCAiJChsYXllciIpCiAgICBtb3VudF9zdWZmaXggOj0gdHJpbV9sZWZ0KHBfc3RvcmFnZS5tb3VudF9wb2ludCwgIiQobGF5ZXIiKQoKICAgIGVuZHN3aXRoKG1vdW50X3N1ZmZpeCwgIikiKQogICAgbGF5ZXJfaW5kZXggOj0gdHJpbV9yaWdodChtb3VudF9zdWZmaXgsICIpIikKICAgIGkgOj0gdG9fbnVtYmVyKGxheWVyX2luZGV4KQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDE6IGkgPSIsIGkpCgogICAgbGF5ZXJfaWQgOj0gbGF5ZXJfaWRzW2ldCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMTogbGF5ZXJfaWQgPSIsIGxheWVyX2lkKQoKICAgIHBfbW91bnQgOj0gY29uY2F0KCIvIiwgWyIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L2xheWVycyIsIGxheWVyX2lkXSkKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCAxOiBwX21vdW50ID0iLCBwX21vdW50KQoKICAgIHBfbW91bnQgPT0gaV9zdG9yYWdlLm1vdW50X3BvaW50CgogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDE6IHRydWUiKQp9CmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAiZnVzZTMua2F0YS1vdmVybGF5IgoKICAgIG1vdW50MSA6PSByZXBsYWNlKHBfc3RvcmFnZS5tb3VudF9wb2ludCwgIiQoY3BhdGgpIiwgcG9saWN5X2RhdGEuY29tbW9uLmNwYXRoKQogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDI6IG1vdW50MiA9IiwgbW91bnQyKQoKICAgIG1vdW50MiA9PSBpX3N0b3JhZ2UubW91bnRfcG9pbnQKCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMjogdHJ1ZSIpCn0KYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKSB7CiAgICBwX3N0b3JhZ2UuZnN0eXBlID09ICJsb2NhbCIKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQyID0iLCBtb3VudDIpCgogICAgbW91bnQzIDo9IHJlcGxhY2UobW91bnQyLCAiJChzYW5kYm94LWlkKSIsIHNhbmRib3hfaWQpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQzID0iLCBtb3VudDMpCgogICAgcmVnZXgubWF0Y2gobW91bnQzLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCgogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDM6IHRydWUiKQp9CmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAiYmluZCIKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNDogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNDogbW91bnQyID0iLCBtb3VudDIpCgogICAgbW91bnQzIDo9IHJlcGxhY2UobW91bnQyLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDQ6IG1vdW50MyA9IiwgbW91bnQzKQoKICAgIHJlZ2V4Lm1hdGNoKG1vdW50MywgaV9zdG9yYWdlLm1vdW50X3BvaW50KQoKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA0OiB0cnVlIikKfQphbGxvd19tb3VudF9wb2ludChwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgYnVuZGxlX2lkLCBzYW5kYm94X2lkLCBsYXllcl9pZHMpIHsKICAgIHBfc3RvcmFnZS5mc3R5cGUgPT0gInRtcGZzIgoKICAgIG1vdW50MSA6PSBwX3N0b3JhZ2UubW91bnRfcG9pbnQKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA1OiBtb3VudDEgPSIsIG1vdW50MSkKCiAgICByZWdleC5tYXRjaChtb3VudDEsIGlfc3RvcmFnZS5tb3VudF9wb2ludCkKCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNTogdHJ1ZSIpCn0KYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKSB7CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogaV9zdG9yYWdlLm1vdW50X3BvaW50ID0iLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCiAgICBhbGxvd19kaXJlY3Rfdm9sX2RyaXZlcihwX3N0b3JhZ2UsIGlfc3RvcmFnZSkKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChzcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQyID0iLCBtb3VudDIpCgogICAgZGlyZWN0X3ZvbF9wYXRoIDo9IGlfc3RvcmFnZS5zb3VyY2UKICAgIG1vdW50MyA6PSByZXBsYWNlKG1vdW50MiwgIiQoYjY0LWRpcmVjdC12b2wtcGF0aCkiLCBiYXNlNjR1cmwuZW5jb2RlKGRpcmVjdF92b2xfcGF0aCkpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQzID0iLCBtb3VudDMpCgogICAgbW91bnQzID09IGlfc3RvcmFnZS5tb3VudF9wb2ludAoKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA2OiB0cnVlIikKfQoKYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIocF9zdG9yYWdlLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19kaXJlY3Rfdm9sX2RyaXZlciAxOiBzdGFydCIpCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCiAgICBwcmludCgiYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIgMTogdHJ1ZSIpCn0KYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIocF9zdG9yYWdlLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19kaXJlY3Rfdm9sX2RyaXZlciAyOiBzdGFydCIpCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJzbWIiCiAgICBwcmludCgiYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIgMjogdHJ1ZSIpCn0KCiMgRXhlY1Byb2Nlc3NSZXF1ZXN0LnByb2Nlc3MuQ2FwYWJpbGl0aWVzCmFsbG93X2V4ZWNfY2FwcyhpX2NhcHMpIHsKICAgIG5vdCBpX2NhcHMuQW1iaWVudAogICAgbm90IGlfY2Fwcy5Cb3VuZGluZwogICAgbm90IGlfY2Fwcy5FZmZlY3RpdmUKICAgIG5vdCBpX2NhcHMuSW5oZXJpdGFibGUKICAgIG5vdCBpX2NhcHMuUGVybWl0dGVkCn0KCiMgT0NJLlByb2Nlc3MuQ2FwYWJpbGl0aWVzCmFsbG93X2NhcHMocF9jYXBzLCBpX2NhcHMpIHsKICAgIHByaW50KCJhbGxvd19jYXBzOiBwb2xpY3kgQW1iaWVudCA9IiwgcF9jYXBzLkFtYmllbnQpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgQW1iaWVudCA9IiwgaV9jYXBzLkFtYmllbnQpCiAgICBtYXRjaF9jYXBzKHBfY2Fwcy5BbWJpZW50LCBpX2NhcHMuQW1iaWVudCkKCiAgICBwcmludCgiYWxsb3dfY2FwczogcG9saWN5IEJvdW5kaW5nID0iLCBwX2NhcHMuQm91bmRpbmcpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgQm91bmRpbmcgPSIsIGlfY2Fwcy5Cb3VuZGluZykKICAgIG1hdGNoX2NhcHMocF9jYXBzLkJvdW5kaW5nLCBpX2NhcHMuQm91bmRpbmcpCgogICAgcHJpbnQoImFsbG93X2NhcHM6IHBvbGljeSBFZmZlY3RpdmUgPSIsIHBfY2Fwcy5FZmZlY3RpdmUpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgRWZmZWN0aXZlID0iLCBpX2NhcHMuRWZmZWN0aXZlKQogICAgbWF0Y2hfY2FwcyhwX2NhcHMuRWZmZWN0aXZlLCBpX2NhcHMuRWZmZWN0aXZlKQoKICAgIHByaW50KCJhbGxvd19jYXBzOiBwb2xpY3kgSW5oZXJpdGFibGUgPSIsIHBfY2Fwcy5Jbmhlcml0YWJsZSkKICAgIHByaW50KCJhbGxvd19jYXBzOiBpbnB1dCBJbmhlcml0YWJsZSA9IiwgaV9jYXBzLkluaGVyaXRhYmxlKQogICAgbWF0Y2hfY2FwcyhwX2NhcHMuSW5oZXJpdGFibGUsIGlfY2Fwcy5Jbmhlcml0YWJsZSkKCiAgICBwcmludCgiYWxsb3dfY2FwczogcG9saWN5IFBlcm1pdHRlZCA9IiwgcF9jYXBzLlBlcm1pdHRlZCkKICAgIHByaW50KCJhbGxvd19jYXBzOiBpbnB1dCBQZXJtaXR0ZWQgPSIsIGlfY2Fwcy5QZXJtaXR0ZWQpCiAgICBtYXRjaF9jYXBzKHBfY2Fwcy5QZXJtaXR0ZWQsIGlfY2Fwcy5QZXJtaXR0ZWQpCn0KCm1hdGNoX2NhcHMocF9jYXBzLCBpX2NhcHMpIHsKICAgIHByaW50KCJtYXRjaF9jYXBzIDE6IHN0YXJ0IikKCiAgICBwX2NhcHMgPT0gaV9jYXBzCgogICAgcHJpbnQoIm1hdGNoX2NhcHMgMTogdHJ1ZSIpCn0KbWF0Y2hfY2FwcyhwX2NhcHMsIGlfY2FwcykgewogICAgcHJpbnQoIm1hdGNoX2NhcHMgMjogc3RhcnQiKQoKICAgIGNvdW50KHBfY2FwcykgPT0gMQogICAgcF9jYXBzWzBdID09ICIkKGRlZmF1bHRfY2FwcykiCgogICAgcHJpbnQoIm1hdGNoX2NhcHMgMjogZGVmYXVsdF9jYXBzID0iLCBwb2xpY3lfZGF0YS5jb21tb24uZGVmYXVsdF9jYXBzKQogICAgcG9saWN5X2RhdGEuY29tbW9uLmRlZmF1bHRfY2FwcyA9PSBpX2NhcHMKCiAgICBwcmludCgibWF0Y2hfY2FwcyAyOiB0cnVlIikKfQptYXRjaF9jYXBzKHBfY2FwcywgaV9jYXBzKSB7CiAgICBwcmludCgibWF0Y2hfY2FwcyAzOiBzdGFydCIpCgogICAgY291bnQocF9jYXBzKSA9PSAxCiAgICBwX2NhcHNbMF0gPT0gIiQocHJpdmlsZWdlZF9jYXBzKSIKCiAgICBwcmludCgibWF0Y2hfY2FwcyAzOiBwcml2aWxlZ2VkX2NhcHMgPSIsIHBvbGljeV9kYXRhLmNvbW1vbi5wcml2aWxlZ2VkX2NhcHMpCiAgICBwb2xpY3lfZGF0YS5jb21tb24ucHJpdmlsZWdlZF9jYXBzID09IGlfY2FwcwoKICAgIHByaW50KCJtYXRjaF9jYXBzIDM6IHRydWUiKQp9CgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgpjaGVja19kaXJlY3RvcnlfdHJhdmVyc2FsKGlfcGF0aCkgewogICAgbm90IHJlZ2V4Lm1hdGNoKCIoXnwvKS4uKCR8LykiLCBpX3BhdGgpCn0KCmNoZWNrX3N5bWxpbmtfc291cmNlKGlfc3JjKSB7CiAgICBpX3NyYyA9PSAiIgogICAgcHJpbnQoImNoZWNrX3N5bWxpbmtfc291cmNlIDE6IHRydWUiKQp9CmNoZWNrX3N5bWxpbmtfc291cmNlKGlfc3JjKSB7CiAgICBpX3NyYyAhPSAiIgogICAgcHJpbnQoImNoZWNrX3N5bWxpbmtfc291cmNlIDI6IGlfc3JjID0iLCBpX3NyYykKCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24uc19zb3VyY2UxLCBpX3NyYykKCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMjogdHJ1ZSIpCn0KY2hlY2tfc3ltbGlua19zb3VyY2UoaV9zcmMpIHsKICAgIGlfc3JjICE9ICIiCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMzogaV9zcmMgPSIsIGlfc3JjKQoKICAgIHJlZ2V4Lm1hdGNoKHBvbGljeV9kYXRhLmNvbW1vbi5zX3NvdXJjZTIsIGlfc3JjKQogICAgY2hlY2tfZGlyZWN0b3J5X3RyYXZlcnNhbChpX3NyYykKCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMzogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfc3RvcmFnZXMoaV9zdG9yYWdlcykgewogICAgcHJpbnQoImFsbG93X3NhbmRib3hfc3RvcmFnZXM6IGlfc3RvcmFnZXMgPSIsIGlfc3RvcmFnZXMpCgogICAgcF9zdG9yYWdlcyA6PSBwb2xpY3lfZGF0YS5zYW5kYm94LnN0b3JhZ2VzCiAgICBldmVyeSBpX3N0b3JhZ2UgaW4gaV9zdG9yYWdlcyB7CiAgICAgICAgYWxsb3dfc2FuZGJveF9zdG9yYWdlKHBfc3RvcmFnZXMsIGlfc3RvcmFnZSkKICAgIH0KCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9zdG9yYWdlczogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfc3RvcmFnZShwX3N0b3JhZ2VzLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IGlfc3RvcmFnZSA9IiwgaV9zdG9yYWdlKQoKICAgIHNvbWUgcF9zdG9yYWdlIGluIHBfc3RvcmFnZXMKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IHBfc3RvcmFnZSA9IiwgcF9zdG9yYWdlKQogICAgaV9zdG9yYWdlID09IHBfc3RvcmFnZQoKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IHRydWUiKQp9CgpDb3B5RmlsZVJlcXVlc3QgewogICAgcHJpbnQoIkNvcHlGaWxlUmVxdWVzdDogaW5wdXQucGF0aCA9IiwgaW5wdXQucGF0aCkKCiAgICBjaGVja19zeW1saW5rX3NvdXJjZShpbnB1dC5zeW1saW5rX3NyYykKICAgIGNoZWNrX2RpcmVjdG9yeV90cmF2ZXJzYWwoaW5wdXQucGF0aCkKCiAgICBzb21lIHJlZ2V4MSBpbiBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLkNvcHlGaWxlUmVxdWVzdAogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5jcGF0aCkKICAgIHJlZ2V4NCA6PSByZXBsYWNlKHJlZ2V4MywgIiQoYnVuZGxlLWlkKSIsIEJVTkRMRV9JRCkKICAgIHByaW50KCJDb3B5RmlsZVJlcXVlc3Q6IHJlZ2V4NCA9IiwgcmVnZXg0KQoKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4NCwgaW5wdXQucGF0aCkKCiAgICBwcmludCgiQ29weUZpbGVSZXF1ZXN0OiB0cnVlIikKfQoKQ3JlYXRlU2FuZGJveFJlcXVlc3QgewogICAgcHJpbnQoIkNyZWF0ZVNhbmRib3hSZXF1ZXN0OiBpbnB1dC5ndWVzdF9ob29rX3BhdGggPSIsIGlucHV0Lmd1ZXN0X2hvb2tfcGF0aCkKICAgIGNvdW50KGlucHV0Lmd1ZXN0X2hvb2tfcGF0aCkgPT0gMAoKICAgIHByaW50KCJDcmVhdGVTYW5kYm94UmVxdWVzdDogaW5wdXQua2VybmVsX21vZHVsZXMgPSIsIGlucHV0Lmtlcm5lbF9tb2R1bGVzKQogICAgY291bnQoaW5wdXQua2VybmVsX21vZHVsZXMpID09IDAKCiAgICBpX3BpZG5zIDo9IGlucHV0LnNhbmRib3hfcGlkbnMKICAgIHByaW50KCJDcmVhdGVTYW5kYm94UmVxdWVzdDogaV9waWRucyA9IiwgaV9waWRucykKICAgIGlfcGlkbnMgPT0gZmFsc2UKICAgIGFsbG93X3NhbmRib3hfc3RvcmFnZXMoaW5wdXQuc3RvcmFnZXMpCn0KCmFsbG93X2V4ZWMocF9jb250YWluZXIsIGlfcHJvY2VzcykgewogICAgcHJpbnQoImFsbG93X2V4ZWM6IHN0YXJ0IikKCiAgICBwX29jaSA9IHBfY29udGFpbmVyLk9DSQogICAgcF9zX25hbWUgPSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc19uYW1lc3BhY2UgPSBnZXRfc3RhdGVfdmFsKCJuYW1lc3BhY2UiKQogICAgYWxsb3dfcHJvYmVfcHJvY2VzcyhwX29jaS5Qcm9jZXNzLCBpX3Byb2Nlc3MsIHBfc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfZXhlYzogdHJ1ZSIpCn0KCmFsbG93X2ludGVyYWN0aXZlX2V4ZWMocF9jb250YWluZXIsIGlfcHJvY2VzcykgewogICAgcHJpbnQoImFsbG93X2ludGVyYWN0aXZlX2V4ZWM6IHN0YXJ0IikKCiAgICBwX29jaSA9IHBfY29udGFpbmVyLk9DSQogICAgcF9zX25hbWUgPSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc19uYW1lc3BhY2UgPSBnZXRfc3RhdGVfdmFsKCJuYW1lc3BhY2UiKQogICAgYWxsb3dfaW50ZXJhY3RpdmVfcHJvY2VzcyhwX29jaS5Qcm9jZXNzLCBpX3Byb2Nlc3MsIHBfc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfaW50ZXJhY3RpdmVfZXhlYzogdHJ1ZSIpCn0KCiMgVE9ETzogc2hvdWxkIG90aGVyIEV4ZWNQcm9jZXNzUmVxdWVzdCBpbnB1dCBkYXRhIGZpZWxkcyBiZSB2YWxpZGF0ZWQgYXMgd2VsbD8KRXhlY1Byb2Nlc3NSZXF1ZXN0IHsKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMTogaW5wdXQgPSIsIGlucHV0KQoKICAgIHNvbWUgcF9jb21tYW5kIGluIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuRXhlY1Byb2Nlc3NSZXF1ZXN0LmFsbG93ZWRfY29tbWFuZHMKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMTogcF9jb21tYW5kID0iLCBwX2NvbW1hbmQpCiAgICBwX2NvbW1hbmQgPT0gaW5wdXQucHJvY2Vzcy5BcmdzCgogICAgIyBUT0RPOiBtYXRjaCBwX2NvbnRhaW5lcidzIElEIHdpdGggdGhlIGlucHV0IGNvbnRhaW5lcl9pZC4KICAgIHNvbWUgcF9jb250YWluZXIgaW4gcG9saWN5X2RhdGEuY29udGFpbmVycwogICAgYWxsb3dfaW50ZXJhY3RpdmVfZXhlYyhwX2NvbnRhaW5lciwgaW5wdXQucHJvY2VzcykKCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDE6IHRydWUiKQp9CkV4ZWNQcm9jZXNzUmVxdWVzdCB7CiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDI6IGlucHV0ID0iLCBpbnB1dCkKCiAgICAjIFRPRE86IG1hdGNoIGlucHV0IGNvbnRhaW5lciBJRCB3aXRoIGl0cyBjb3JyZXNwb25kaW5nIGNvbnRhaW5lci5leGVjX2NvbW1hbmRzLgogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBzb21lIHBfY29tbWFuZCBpbiBwX2NvbnRhaW5lci5leGVjX2NvbW1hbmRzCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDI6IHBfY29tbWFuZCA9IiwgcF9jb21tYW5kKQoKICAgICMgVE9ETzogc2hvdWxkIG90aGVyIGlucHV0IGRhdGEgZmllbGRzIGJlIHZhbGlkYXRlZCBhcyB3ZWxsPwogICAgcF9jb21tYW5kID09IGlucHV0LnByb2Nlc3MuQXJncwoKICAgIGFsbG93X2V4ZWMocF9jb250YWluZXIsIGlucHV0LnByb2Nlc3MpCgogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAyOiB0cnVlIikKfQpFeGVjUHJvY2Vzc1JlcXVlc3QgewogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAzOiBpbnB1dCA9IiwgaW5wdXQpCgogICAgaV9jb21tYW5kID0gY29uY2F0KCIgIiwgaW5wdXQucHJvY2Vzcy5BcmdzKQogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAzOiBpX2NvbW1hbmQgPSIsIGlfY29tbWFuZCkKCiAgICBzb21lIHBfcmVnZXggaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5FeGVjUHJvY2Vzc1JlcXVlc3QucmVnZXgKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMzogcF9yZWdleCA9IiwgcF9yZWdleCkKCiAgICByZWdleC5tYXRjaChwX3JlZ2V4LCBpX2NvbW1hbmQpCgogICAgIyBUT0RPOiBtYXRjaCBwX2NvbnRhaW5lcidzIElEIHdpdGggdGhlIGlucHV0IGNvbnRhaW5lcl9pZC4KICAgIHNvbWUgcF9jb250YWluZXIgaW4gcG9saWN5X2RhdGEuY29udGFpbmVycwogICAgYWxsb3dfaW50ZXJhY3RpdmVfZXhlYyhwX2NvbnRhaW5lciwgaW5wdXQucHJvY2VzcykKCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDM6IHRydWUiKQp9CgpVcGRhdGVSb3V0ZXNSZXF1ZXN0IHsKICAgIHByaW50KCJVcGRhdGVSb3V0ZXNSZXF1ZXN0OiBpbnB1dCA9IiwgaW5wdXQpCiAgICBwcmludCgiVXBkYXRlUm91dGVzUmVxdWVzdDogcG9saWN5ID0iLCBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLlVwZGF0ZVJvdXRlc1JlcXVlc3QpCgogICAgaV9yb3V0ZXMgOj0gaW5wdXQucm91dGVzLlJvdXRlcwogICAgcF9zb3VyY2VfcmVnZXggPSBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLlVwZGF0ZVJvdXRlc1JlcXVlc3QuZm9yYmlkZGVuX3NvdXJjZV9yZWdleAogICAgcF9uYW1lcyA9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuVXBkYXRlUm91dGVzUmVxdWVzdC5mb3JiaWRkZW5fZGV2aWNlX25hbWVzCgogICAgZXZlcnkgaV9yb3V0ZSBpbiBpX3JvdXRlcyB7CiAgICAgICAgcHJpbnQoImlfcm91dGUuc291cmNlID0iLCBpX3JvdXRlLnNvdXJjZSkKICAgICAgICBldmVyeSBwX3JlZ2V4IGluIHBfc291cmNlX3JlZ2V4IHsKICAgICAgICAgICAgcHJpbnQoInBfcmVnZXggPSIsIHBfcmVnZXgpCiAgICAgICAgICAgIG5vdCByZWdleC5tYXRjaChwX3JlZ2V4LCBpX3JvdXRlLnNvdXJjZSkKICAgICAgICB9CgogICAgICAgIHByaW50KCJpX3JvdXRlLmRldmljZSA9IiwgaV9yb3V0ZS5kZXZpY2UpCiAgICAgICAgbm90IGlfcm91dGUuZGV2aWNlIGluIHBfbmFtZXMKICAgIH0KCiAgICBwcmludCgiVXBkYXRlUm91dGVzUmVxdWVzdDogdHJ1ZSIpCn0KClVwZGF0ZUludGVyZmFjZVJlcXVlc3QgewogICAgcHJpbnQoIlVwZGF0ZUludGVyZmFjZVJlcXVlc3Q6IGlucHV0ID0iLCBpbnB1dCkKICAgIHByaW50KCJVcGRhdGVJbnRlcmZhY2VSZXF1ZXN0OiBwb2xpY3kgPSIsIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuVXBkYXRlSW50ZXJmYWNlUmVxdWVzdCkKCiAgICBpX2ludGVyZmFjZSA6PSBpbnB1dC5pbnRlcmZhY2UKICAgIHBfZmxhZ3MgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmFsbG93X3Jhd19mbGFncwoKICAgICMgVHlwaWNhbGx5LCBqdXN0IElGRl9OT0FSUCBpcyB1c2VkLgogICAgYml0cy5hbmQoaV9pbnRlcmZhY2UucmF3X2ZsYWdzLCBiaXRzLm5lZ2F0ZShwX2ZsYWdzKSkgPT0gMAoKICAgIHBfbmFtZXMgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmZvcmJpZGRlbl9uYW1lcwoKICAgIG5vdCBpX2ludGVyZmFjZS5uYW1lIGluIHBfbmFtZXMKCiAgICBwX2h3YWRkcnMgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmZvcmJpZGRlbl9od19hZGRycwoKICAgIG5vdCBpX2ludGVyZmFjZS5od0FkZHIgaW4gcF9od2FkZHJzCgogICAgcHJpbnQoIlVwZGF0ZUludGVyZmFjZVJlcXVlc3Q6IHRydWUiKQp9CgpDbG9zZVN0ZGluUmVxdWVzdCB7CiAgICBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLkNsb3NlU3RkaW5SZXF1ZXN0ID09IHRydWUKfQoKUmVhZFN0cmVhbVJlcXVlc3QgewogICAgcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5SZWFkU3RyZWFtUmVxdWVzdCA9PSB0cnVlCn0KClVwZGF0ZUVwaGVtZXJhbE1vdW50c1JlcXVlc3QgewogICAgcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVFcGhlbWVyYWxNb3VudHNSZXF1ZXN0ID09IHRydWUKfQoKV3JpdGVTdHJlYW1SZXF1ZXN0IHsKICAgIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuV3JpdGVTdHJlYW1SZXF1ZXN0ID09IHRydWUKfQoKcG9saWN5X2RhdGEgOj0gewogICJjb250YWluZXJzIjogWwogICAgewogICAgICAiT0NJIjogewogICAgICAgICJWZXJzaW9uIjogIjEuMS4wLXJjLjEiLAogICAgICAgICJQcm9jZXNzIjogewogICAgICAgICAgIlRlcm1pbmFsIjogZmFsc2UsCiAgICAgICAgICAiVXNlciI6IHsKICAgICAgICAgICAgIlVJRCI6IDY1NTM1LAogICAgICAgICAgICAiR0lEIjogNjU1MzUsCiAgICAgICAgICAgICJBZGRpdGlvbmFsR2lkcyI6IFtdLAogICAgICAgICAgICAiVXNlcm5hbWUiOiAiIgogICAgICAgICAgfSwKICAgICAgICAgICJEZXByZWNhdGVkQXJncyI6IFsKICAgICAgICAgICAgIi9wYXVzZSIKICAgICAgICAgIF0sCiAgICAgICAgICAiQXJncyI6IFsKICAgICAgICAgICAgIi9wYXVzZSIKICAgICAgICAgIF0sCiAgICAgICAgICAiRW52IjogWwogICAgICAgICAgICAiUEFUSD0vdXNyL2xvY2FsL3NiaW46L3Vzci9sb2NhbC9iaW46L3Vzci9zYmluOi91c3IvYmluOi9zYmluOi9iaW4iCiAgICAgICAgICBdLAogICAgICAgICAgIkN3ZCI6ICIvIiwKICAgICAgICAgICJDYXBhYmlsaXRpZXMiOiB7CiAgICAgICAgICAgICJBbWJpZW50IjogW10sCiAgICAgICAgICAgICJCb3VuZGluZyI6IFsKICAgICAgICAgICAgICAiJChkZWZhdWx0X2NhcHMpIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiRWZmZWN0aXZlIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJJbmhlcml0YWJsZSI6IFtdLAogICAgICAgICAgICAiUGVybWl0dGVkIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICAiTm9OZXdQcml2aWxlZ2VzIjogdHJ1ZQogICAgICAgIH0sCiAgICAgICAgIlJvb3QiOiB7CiAgICAgICAgICAiUGF0aCI6ICIkKGNwYXRoKS8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgIlJlYWRvbmx5IjogdHJ1ZQogICAgICAgIH0sCiAgICAgICAgIk1vdW50cyI6IFsKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9wcm9jIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJwcm9jIiwKICAgICAgICAgICAgInR5cGVfIjogInByb2MiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2IiwKICAgICAgICAgICAgInNvdXJjZSI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJzdHJpY3RhdGltZSIsCiAgICAgICAgICAgICAgIm1vZGU9NzU1IiwKICAgICAgICAgICAgICAic2l6ZT02NTUzNmsiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L3B0cyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiZGV2cHRzIiwKICAgICAgICAgICAgInR5cGVfIjogImRldnB0cyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJuZXdpbnN0YW5jZSIsCiAgICAgICAgICAgICAgInB0bXhtb2RlPTA2NjYiLAogICAgICAgICAgICAgICJtb2RlPTA2MjAiLAogICAgICAgICAgICAgICJnaWQ9NSIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvc2htIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L3NobSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi9tcXVldWUiLAogICAgICAgICAgICAic291cmNlIjogIm1xdWV1ZSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJtcXVldWUiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvc3lzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJzeXNmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJzeXNmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2V0Yy9yZXNvbHYuY29uZiIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClyZXNvbHYuY29uZiQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJvIiwKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9kZXYiLAogICAgICAgICAgICAgICJub2V4ZWMiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0KICAgICAgICBdLAogICAgICAgICJBbm5vdGF0aW9ucyI6IHsKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmJ1bmRsZV9wYXRoIjogIi9ydW4vY29udGFpbmVyZC9pby5jb250YWluZXJkLnJ1bnRpbWUudjIudGFzay9rOHMuaW8vJChidW5kbGUtaWQpIiwKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIjogInBvZF9zYW5kYm94IiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSI6ICJzYW5kYm94IiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWlkIjogIl5bYS16MC05XXs2NH0kIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWxvZy1kaXJlY3RvcnkiOiAiXi92YXIvbG9nL3BvZHMvJChzYW5kYm94LW5hbWVzcGFjZSlfJChzYW5kYm94LW5hbWUpX1swLTlhLWZdezh9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezEyfSQiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZSI6ICJeY20zJCIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1uYW1lc3BhY2UiOiAiIiwKICAgICAgICAgICJuZXJkY3RsL25ldHdvcmstbmFtZXNwYWNlIjogIl4vdmFyL3J1bi9uZXRucy9jbmktWzAtOWEtZl17OH0tWzAtOWEtZl17NH0tWzAtOWEtZl17NH0tWzAtOWEtZl17NH0tWzAtOWEtZl17MTJ9JCIKICAgICAgICB9LAogICAgICAgICJMaW51eCI6IHsKICAgICAgICAgICJOYW1lc3BhY2VzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgIlR5cGUiOiAiaXBjIiwKICAgICAgICAgICAgICAiUGF0aCI6ICIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiVHlwZSI6ICJ1dHMiLAogICAgICAgICAgICAgICJQYXRoIjogIiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJUeXBlIjogIm1vdW50IiwKICAgICAgICAgICAgICAiUGF0aCI6ICIiCiAgICAgICAgICAgIH0KICAgICAgICAgIF0sCiAgICAgICAgICAiTWFza2VkUGF0aHMiOiBbCiAgICAgICAgICAgICIvcHJvYy9hY3BpIiwKICAgICAgICAgICAgIi9wcm9jL2Fzb3VuZCIsCiAgICAgICAgICAgICIvcHJvYy9rY29yZSIsCiAgICAgICAgICAgICIvcHJvYy9rZXlzIiwKICAgICAgICAgICAgIi9wcm9jL2xhdGVuY3lfc3RhdHMiLAogICAgICAgICAgICAiL3Byb2MvdGltZXJfbGlzdCIsCiAgICAgICAgICAgICIvcHJvYy90aW1lcl9zdGF0cyIsCiAgICAgICAgICAgICIvcHJvYy9zY2hlZF9kZWJ1ZyIsCiAgICAgICAgICAgICIvc3lzL2Zpcm13YXJlIiwKICAgICAgICAgICAgIi9wcm9jL3Njc2kiCiAgICAgICAgICBdLAogICAgICAgICAgIlJlYWRvbmx5UGF0aHMiOiBbCiAgICAgICAgICAgICIvcHJvYy9idXMiLAogICAgICAgICAgICAiL3Byb2MvZnMiLAogICAgICAgICAgICAiL3Byb2MvaXJxIiwKICAgICAgICAgICAgIi9wcm9jL3N5cyIsCiAgICAgICAgICAgICIvcHJvYy9zeXNycS10cmlnZ2VyIgogICAgICAgICAgXSwKICAgICAgICAgICJEZXZpY2VzIjogW10sCiAgICAgICAgICAiU3lzY3RsIjogewogICAgICAgICAgICAibmV0LmlwdjQuaXBfdW5wcml2aWxlZ2VkX3BvcnRfc3RhcnQiOiAiMCIsCiAgICAgICAgICAgICJuZXQuaXB2NC5waW5nX2dyb3VwX3JhbmdlIjogIjAgMjE0NzQ4MzY0NyIKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0sCiAgICAgICJzdG9yYWdlcyI6IFsKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoMCkiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXIwKSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogIm92ZXJsYXlmcyIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAiZnVzZTMua2F0YS1vdmVybGF5IiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiNWE1YWFkODAwNTVmZjIwMDEyYTUwZGMyNWY4ZGY3YTI5OTI0NDc0MzI0ZDY1ZjdkNTMwNmVlOGVlMjdmZjcxZCIsCiAgICAgICAgICAgICI4MTcyNTBmMWEzZTMzNmRhNzZmNWJkM2ZhNzg0ZTFiMjZkOTU5YjljMTMxODc2ODE1YmEyNjA0MDQ4YjcwYzE4IgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGNwYXRoKS8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0KICAgICAgXSwKICAgICAgImRldmljZXMiOiBbXSwKICAgICAgInNhbmRib3hfcGlkbnMiOiBmYWxzZSwKICAgICAgImV4ZWNfY29tbWFuZHMiOiBbXSwKICAgICAgImVudl9tYXAiOiB7CiAgICAgICAgIlBBVEgiOiAiL3Vzci9sb2NhbC9zYmluOi91c3IvbG9jYWwvYmluOi91c3Ivc2JpbjovdXNyL2Jpbjovc2JpbjovYmluIgogICAgICB9CiAgICB9LAogICAgewogICAgICAiT0NJIjogewogICAgICAgICJWZXJzaW9uIjogIjEuMS4wLXJjLjEiLAogICAgICAgICJQcm9jZXNzIjogewogICAgICAgICAgIlRlcm1pbmFsIjogZmFsc2UsCiAgICAgICAgICAiVXNlciI6IHsKICAgICAgICAgICAgIlVJRCI6IDAsCiAgICAgICAgICAgICJHSUQiOiAwLAogICAgICAgICAgICAiQWRkaXRpb25hbEdpZHMiOiBbXSwKICAgICAgICAgICAgIlVzZXJuYW1lIjogIiIKICAgICAgICAgIH0sCiAgICAgICAgICAiRGVwcmVjYXRlZEFyZ3MiOiBbCiAgICAgICAgICAgICIvYmluL3NoIiwKICAgICAgICAgICAgIi1jIiwKICAgICAgICAgICAgIndoaWxlIHRydWU7IGRvIGVjaG8gJHNpbXBsZV92YWx1ZTE7IGVjaG8gJHNpbXBsZV92YWx1ZTI7IHNsZWVwIDEwOyBkb25lIgogICAgICAgICAgXSwKICAgICAgICAgICJBcmdzIjogWwogICAgICAgICAgICAiL2Jpbi9zaCIsCiAgICAgICAgICAgICItYyIsCiAgICAgICAgICAgICJ3aGlsZSB0cnVlOyBkbyBlY2hvICRzaW1wbGVfdmFsdWUxOyBlY2hvICRzaW1wbGVfdmFsdWUyOyBzbGVlcCAxMDsgZG9uZSIKICAgICAgICAgIF0sCiAgICAgICAgICAiRW52IjogWwogICAgICAgICAgICAiUEFUSD0vdXNyL2xvY2FsL3NiaW46L3Vzci9sb2NhbC9iaW46L3Vzci9zYmluOi91c3IvYmluOi9zYmluOi9iaW4iLAogICAgICAgICAgICAiSE9TVE5BTUU9JChob3N0LW5hbWUpIiwKICAgICAgICAgICAgInNpbXBsZV92YWx1ZTE9dmFsdWUxIiwKICAgICAgICAgICAgInNpbXBsZV92YWx1ZTI9dmFsdWUyIgogICAgICAgICAgXSwKICAgICAgICAgICJDd2QiOiAiLyIsCiAgICAgICAgICAiQ2FwYWJpbGl0aWVzIjogewogICAgICAgICAgICAiQW1iaWVudCI6IFtdLAogICAgICAgICAgICAiQm91bmRpbmciOiBbCiAgICAgICAgICAgICAgIiQocHJpdmlsZWdlZF9jYXBzKSIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgIkVmZmVjdGl2ZSI6IFsKICAgICAgICAgICAgICAiJChwcml2aWxlZ2VkX2NhcHMpIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiSW5oZXJpdGFibGUiOiBbXSwKICAgICAgICAgICAgIlBlcm1pdHRlZCI6IFsKICAgICAgICAgICAgICAiJChwcml2aWxlZ2VkX2NhcHMpIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgIk5vTmV3UHJpdmlsZWdlcyI6IGZhbHNlCiAgICAgICAgfSwKICAgICAgICAiUm9vdCI6IHsKICAgICAgICAgICJQYXRoIjogIiQoY3BhdGgpLyQoYnVuZGxlLWlkKSIsCiAgICAgICAgICAiUmVhZG9ubHkiOiBmYWxzZQogICAgICAgIH0sCiAgICAgICAgIk1vdW50cyI6IFsKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9wcm9jIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJwcm9jIiwKICAgICAgICAgICAgInR5cGVfIjogInByb2MiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2IiwKICAgICAgICAgICAgInNvdXJjZSI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJzdHJpY3RhdGltZSIsCiAgICAgICAgICAgICAgIm1vZGU9NzU1IiwKICAgICAgICAgICAgICAic2l6ZT02NTUzNmsiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L3B0cyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiZGV2cHRzIiwKICAgICAgICAgICAgInR5cGVfIjogImRldnB0cyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJuZXdpbnN0YW5jZSIsCiAgICAgICAgICAgICAgInB0bXhtb2RlPTA2NjYiLAogICAgICAgICAgICAgICJtb2RlPTA2MjAiLAogICAgICAgICAgICAgICJnaWQ9NSIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvc2htIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L3NobSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi9tcXVldWUiLAogICAgICAgICAgICAic291cmNlIjogIm1xdWV1ZSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJtcXVldWUiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvc3lzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJzeXNmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJzeXNmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIsCiAgICAgICAgICAgICAgInJ3IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL3N5cy9mcy9jZ3JvdXAiLAogICAgICAgICAgICAic291cmNlIjogImNncm91cCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJjZ3JvdXAiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiLAogICAgICAgICAgICAgICJyZWxhdGltZSIsCiAgICAgICAgICAgICAgInJ3IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2V0Yy9ob3N0cyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClob3N0cyQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicnciCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L3Rlcm1pbmF0aW9uLWxvZyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeCl0ZXJtaW5hdGlvbi1sb2ckIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJ3IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2V0Yy9ob3N0bmFtZSIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClob3N0bmFtZSQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicnciCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZXRjL3Jlc29sdi5jb25mIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KXJlc29sdi5jb25mJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJydyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi92YXIvcnVuL3NlY3JldHMva3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudCIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClzZXJ2aWNlYWNjb3VudCQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicm8iCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvdmFyL3J1bi9zZWNyZXRzL2F6dXJlL3Rva2VucyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeCl0b2tlbnMkIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9CiAgICAgICAgXSwKICAgICAgICAiQW5ub3RhdGlvbnMiOiB7CiAgICAgICAgICAiaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5idW5kbGVfcGF0aCI6ICIvcnVuL2NvbnRhaW5lcmQvaW8uY29udGFpbmVyZC5ydW50aW1lLnYyLnRhc2svazhzLmlvLyQoYnVuZGxlLWlkKSIsCiAgICAgICAgICAiaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5jb250YWluZXJfdHlwZSI6ICJwb2RfY29udGFpbmVyIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItbmFtZSI6ICJidXN5Ym94IiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSI6ICJjb250YWluZXIiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLmltYWdlLW5hbWUiOiAibWNyLm1pY3Jvc29mdC5jb20vYWtzL2UyZS9saWJyYXJ5LWJ1c3lib3g6bWFzdGVyLjIyMDMxNC4xLWxpbnV4LWFtZDY0IiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWlkIjogIl5bYS16MC05XXs2NH0kIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LW5hbWUiOiAiXmNtMyQiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZXNwYWNlIjogIiIKICAgICAgICB9LAogICAgICAgICJMaW51eCI6IHsKICAgICAgICAgICJOYW1lc3BhY2VzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgIlR5cGUiOiAiaXBjIiwKICAgICAgICAgICAgICAiUGF0aCI6ICIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiVHlwZSI6ICJ1dHMiLAogICAgICAgICAgICAgICJQYXRoIjogIiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJUeXBlIjogIm1vdW50IiwKICAgICAgICAgICAgICAiUGF0aCI6ICIiCiAgICAgICAgICAgIH0KICAgICAgICAgIF0sCiAgICAgICAgICAiTWFza2VkUGF0aHMiOiBbXSwKICAgICAgICAgICJSZWFkb25seVBhdGhzIjogW10sCiAgICAgICAgICAiRGV2aWNlcyI6IFtdLAogICAgICAgICAgIlN5c2N0bCI6IHsKICAgICAgICAgICAgIm5ldC5pcHY0LmlwX3VucHJpdmlsZWdlZF9wb3J0X3N0YXJ0IjogIjAiLAogICAgICAgICAgICAibmV0LmlwdjQucGluZ19ncm91cF9yYW5nZSI6ICIwIDIxNDc0ODM2NDciCiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9LAogICAgICAic3RvcmFnZXMiOiBbCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJibGsiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogInRhciIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIiQoaGFzaDApIgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGxheWVyMCkiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJibGsiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogInRhciIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIiQoaGFzaDEpIgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGxheWVyMSkiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJvdmVybGF5ZnMiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogImZ1c2UzLmthdGEtb3ZlcmxheSIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIjJjMzQyYTEzN2U2OTNjNzg5OGFlYzM2ZGExMDQ3ZjE5MWRjN2MxNjg3ZTY2MTk4YWRhY2M0MzljZjRhZGYzNzk6MjU3MGUzYTE5ZTFiZjIwZGRkYTQ1NDk4YTk2MjdmNjE1NTVkMmQ2YzAxNDc5YjliNzY0NjBiNjc5YjI3ZDU1MiIsCiAgICAgICAgICAgICI4NTY4YzcwYzBjY2ZlMDA1MTA5MmU4MThkYTc2OTExMWE1OTg4MmNkMTlkZDc5OWQzYmNhNWZmYTgyNzkxMDgwOmI2NDNiNjIxNzc0ODk4MzgzMGIyNmFjMTRhMzVhMzMyMmRkNTI4YzAwOTYzZWFhZGQ5MWVmNTVmNTEzZGM3M2YiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQoY3BhdGgpLyQoYnVuZGxlLWlkKSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfQogICAgICBdLAogICAgICAiZGV2aWNlcyI6IFtdLAogICAgICAic2FuZGJveF9waWRucyI6IGZhbHNlLAogICAgICAiZXhlY19jb21tYW5kcyI6IFtdLAogICAgICAiZW52X21hcCI6IHsKICAgICAgICAiSE9TVE5BTUUiOiAiJChob3N0LW5hbWUpIiwKICAgICAgICAiUEFUSCI6ICIvdXNyL2xvY2FsL3NiaW46L3Vzci9sb2NhbC9iaW46L3Vzci9zYmluOi91c3IvYmluOi9zYmluOi9iaW4iLAogICAgICAgICJzaW1wbGVfdmFsdWUxIjogInZhbHVlMSIsCiAgICAgICAgInNpbXBsZV92YWx1ZTIiOiAidmFsdWUyIgogICAgICB9CiAgICB9CiAgXSwKICAiY29tbW9uIjogewogICAgImNwYXRoIjogIi9ydW4va2F0YS1jb250YWluZXJzL3NoYXJlZC9jb250YWluZXJzIiwKICAgICJtb3VudF9zb3VyY2VfY3BhdGgiOiAiL3J1bi9rYXRhLWNvbnRhaW5lcnMvc2hhcmVkL2NvbnRhaW5lcnMiLAogICAgInNmcHJlZml4IjogIl4kKGNwYXRoKS8kKGJ1bmRsZS1pZCktW2EtejAtOV17MTZ9LSIsCiAgICAic3BhdGgiOiAiL3J1bi9rYXRhLWNvbnRhaW5lcnMvc2FuZGJveC9zdG9yYWdlIiwKICAgICJpcHY0X2EiOiAiKChbMC05XXxbMS05XVswLTldfDFbMC05XXsyfXwyWzAtNF1bMC05XXwyNVswLTVdKVxcLil7M30oWzAtOV18WzEtOV1bMC05XXwxWzAtOV17Mn18MlswLTRdWzAtOV18MjVbMC01XSkiLAogICAgImlwX3AiOiAiWzAtOV17MSw1fSIsCiAgICAic3ZjX25hbWUiOiAiW0EtWl9cXC5cXC1dKyIsCiAgICAiZG5zX2xhYmVsIjogIlthLXpBLVowLTlfXFwuXFwtXSsiLAogICAgInNfc291cmNlMSI6ICJeLi4yWzAtOV17M31fWzAtMV1bMC05XV9bMC0zXVswLTldX1swLTJdWzAtOV1fWzAtNV1bMC05XV9bMC01XVswLTldXFwuWzAtOV17MSwxMH0kIiwKICAgICJzX3NvdXJjZTIiOiAiXi4uZGF0YS8iLAogICAgImRuc19zdWJkb21haW4iOiAiXlthLXowLTldKFstYS16MC05XSpbYS16MC05XSk/JCIsCiAgICAicG9kX3VpZCI6ICJeWzAtOWEtZkEtRl17OH0tWzAtOWEtZkEtRl17NH0tWzAtOWEtZkEtRl17NH0tWzAtOWEtZkEtRl17NH0tWzAtOWEtZkEtRl17MTJ9JCIsCiAgICAiZGVmYXVsdF9jYXBzIjogWwogICAgICAiQ0FQX0NIT1dOIiwKICAgICAgIkNBUF9EQUNfT1ZFUlJJREUiLAogICAgICAiQ0FQX0ZTRVRJRCIsCiAgICAgICJDQVBfRk9XTkVSIiwKICAgICAgIkNBUF9NS05PRCIsCiAgICAgICJDQVBfTkVUX1JBVyIsCiAgICAgICJDQVBfU0VUR0lEIiwKICAgICAgIkNBUF9TRVRVSUQiLAogICAgICAiQ0FQX1NFVEZDQVAiLAogICAgICAiQ0FQX1NFVFBDQVAiLAogICAgICAiQ0FQX05FVF9CSU5EX1NFUlZJQ0UiLAogICAgICAiQ0FQX1NZU19DSFJPT1QiLAogICAgICAiQ0FQX0tJTEwiLAogICAgICAiQ0FQX0FVRElUX1dSSVRFIgogICAgXSwKICAgICJwcml2aWxlZ2VkX2NhcHMiOiBbCiAgICAgICJDQVBfQ0hPV04iLAogICAgICAiQ0FQX0RBQ19PVkVSUklERSIsCiAgICAgICJDQVBfREFDX1JFQURfU0VBUkNIIiwKICAgICAgIkNBUF9GT1dORVIiLAogICAgICAiQ0FQX0ZTRVRJRCIsCiAgICAgICJDQVBfS0lMTCIsCiAgICAgICJDQVBfU0VUR0lEIiwKICAgICAgIkNBUF9TRVRVSUQiLAogICAgICAiQ0FQX1NFVFBDQVAiLAogICAgICAiQ0FQX0xJTlVYX0lNTVVUQUJMRSIsCiAgICAgICJDQVBfTkVUX0JJTkRfU0VSVklDRSIsCiAgICAgICJDQVBfTkVUX0JST0FEQ0FTVCIsCiAgICAgICJDQVBfTkVUX0FETUlOIiwKICAgICAgIkNBUF9ORVRfUkFXIiwKICAgICAgIkNBUF9JUENfTE9DSyIsCiAgICAgICJDQVBfSVBDX09XTkVSIiwKICAgICAgIkNBUF9TWVNfTU9EVUxFIiwKICAgICAgIkNBUF9TWVNfUkFXSU8iLAogICAgICAiQ0FQX1NZU19DSFJPT1QiLAogICAgICAiQ0FQX1NZU19QVFJBQ0UiLAogICAgICAiQ0FQX1NZU19QQUNDVCIsCiAgICAgICJDQVBfU1lTX0FETUlOIiwKICAgICAgIkNBUF9TWVNfQk9PVCIsCiAgICAgICJDQVBfU1lTX05JQ0UiLAogICAgICAiQ0FQX1NZU19SRVNPVVJDRSIsCiAgICAgICJDQVBfU1lTX1RJTUUiLAogICAgICAiQ0FQX1NZU19UVFlfQ09ORklHIiwKICAgICAgIkNBUF9NS05PRCIsCiAgICAgICJDQVBfTEVBU0UiLAogICAgICAiQ0FQX0FVRElUX1dSSVRFIiwKICAgICAgIkNBUF9BVURJVF9DT05UUk9MIiwKICAgICAgIkNBUF9TRVRGQ0FQIiwKICAgICAgIkNBUF9NQUNfT1ZFUlJJREUiLAogICAgICAiQ0FQX01BQ19BRE1JTiIsCiAgICAgICJDQVBfU1lTTE9HIiwKICAgICAgIkNBUF9XQUtFX0FMQVJNIiwKICAgICAgIkNBUF9CTE9DS19TVVNQRU5EIiwKICAgICAgIkNBUF9BVURJVF9SRUFEIiwKICAgICAgIkNBUF9QRVJGTU9OIiwKICAgICAgIkNBUF9CUEYiLAogICAgICAiQ0FQX0NIRUNLUE9JTlRfUkVTVE9SRSIKICAgIF0sCiAgICAidmlydGlvX2Jsa19zdG9yYWdlX2NsYXNzZXMiOiBbCiAgICAgICJjYy1sb2NhbC1jc2kiLAogICAgICAiY2MtbWFuYWdlZC1jc2kiLAogICAgICAiY2MtbWFuYWdlZC1wcmVtaXVtLWNzaSIKICAgIF0sCiAgICAic21iX3N0b3JhZ2VfY2xhc3NlcyI6IFsKICAgICAgewogICAgICAgICJuYW1lIjogImF6dXJlZmlsZS1jc2kta2F0YS1jYyIsCiAgICAgICAgIm1vdW50X29wdGlvbnMiOiBbCiAgICAgICAgICAiZGlyX21vZGU9MDc3NyIsCiAgICAgICAgICAiZmlsZV9tb2RlPTA3NzciLAogICAgICAgICAgIm1mc3ltbGlua3MiLAogICAgICAgICAgImNhY2hlPXN0cmljdCIsCiAgICAgICAgICAibm9zaGFyZXNvY2siLAogICAgICAgICAgImFjdGltZW89MzAiLAogICAgICAgICAgIm5vYnJsIgogICAgICAgIF0KICAgICAgfQogICAgXQogIH0sCiAgInNhbmRib3giOiB7CiAgICAic3RvcmFnZXMiOiBbCiAgICAgIHsKICAgICAgICAiZHJpdmVyIjogImVwaGVtZXJhbCIsCiAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgInNvdXJjZSI6ICJzaG0iLAogICAgICAgICJmc3R5cGUiOiAidG1wZnMiLAogICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICJub2RldiIsCiAgICAgICAgICAibW9kZT0xNzc3IiwKICAgICAgICAgICJzaXplPTY3MTA4ODY0IgogICAgICAgIF0sCiAgICAgICAgIm1vdW50X3BvaW50IjogIi9ydW4va2F0YS1jb250YWluZXJzL3NhbmRib3gvc2htIiwKICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgIH0KICAgIF0KICB9LAogICJyZXF1ZXN0X2RlZmF1bHRzIjogewogICAgIkNyZWF0ZUNvbnRhaW5lclJlcXVlc3QiOiB7CiAgICAgICJhbGxvd19lbnZfcmVnZXgiOiBbCiAgICAgICAgIl5IT1NUTkFNRT0kKGRuc19sYWJlbCkkIiwKICAgICAgICAiXiQoc3ZjX25hbWUpX1BPUlRfJChpcF9wKV9UQ1A9dGNwOi8vJChpcHY0X2EpOiQoaXBfcCkkIiwKICAgICAgICAiXiQoc3ZjX25hbWUpX1BPUlRfJChpcF9wKV9UQ1BfUFJPVE89dGNwJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9QT1JUXyQoaXBfcClfVENQX1BPUlQ9JChpcF9wKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfUE9SVF8kKGlwX3ApX1RDUF9BRERSPSQoaXB2NF9hKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfU0VSVklDRV9IT1NUPSQoaXB2NF9hKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfU0VSVklDRV9QT1JUPSQoaXBfcCkkIiwKICAgICAgICAiXiQoc3ZjX25hbWUpX1NFUlZJQ0VfUE9SVF8kKGRuc19sYWJlbCk9JChpcF9wKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfUE9SVD10Y3A6Ly8kKGlwdjRfYSk6JChpcF9wKSQiLAogICAgICAgICJeQVpVUkVfQ0xJRU5UX0lEPVtBLUZhLWYwLTktXSokIiwKICAgICAgICAiXkFaVVJFX1RFTkFOVF9JRD1bQS1GYS1mMC05LV0qJCIsCiAgICAgICAgIl5BWlVSRV9GRURFUkFURURfVE9LRU5fRklMRT0vdmFyL3J1bi9zZWNyZXRzL2F6dXJlL3Rva2Vucy9henVyZS1pZGVudGl0eS10b2tlbiQiLAogICAgICAgICJeQVpVUkVfQVVUSE9SSVRZX0hPU1Q9aHR0cHM6Ly9sb2dpblxcLm1pY3Jvc29mdG9ubGluZVxcLmNvbS8kIiwKICAgICAgICAiXlRFUk09eHRlcm0kIgogICAgICBdLAogICAgICAiYWxsb3dfZW52X3JlZ2V4X21hcCI6IHsKICAgICAgICAiQ1BVX0xJTUlUIjogIl5bMC05XSskIiwKICAgICAgICAiSk9CX0NPTVBMRVRJT05fSU5ERVgiOiAiXlswLTldKiQiLAogICAgICAgICJNRU1PUllfTElNSVQiOiAiXlswLTldKyQiCiAgICAgIH0KICAgIH0sCiAgICAiQ29weUZpbGVSZXF1ZXN0IjogWwogICAgICAiJChzZnByZWZpeCkiCiAgICBdLAogICAgIkV4ZWNQcm9jZXNzUmVxdWVzdCI6IHsKICAgICAgImFsbG93ZWRfY29tbWFuZHMiOiBbXSwKICAgICAgInJlZ2V4IjogW10KICAgIH0sCiAgICAiVXBkYXRlUm91dGVzUmVxdWVzdCI6IHsKICAgICAgImZvcmJpZGRlbl9kZXZpY2VfbmFtZXMiOiBbCiAgICAgICAgImxvIgogICAgICBdLAogICAgICAiZm9yYmlkZGVuX3NvdXJjZV9yZWdleCI6IFsKICAgICAgICAiXig/OjB7MCw0fTopezAsN30wezAsM30xJCIsCiAgICAgICAgIl4xMjdcXC4oPzpbMC05XXsxLDN9XFwuKXsyfVswLTldezEsM30kIgogICAgICBdCiAgICB9LAogICAgIlVwZGF0ZUludGVyZmFjZVJlcXVlc3QiOiB7CiAgICAgICJhbGxvd19yYXdfZmxhZ3MiOiAxMjgsCiAgICAgICJmb3JiaWRkZW5fbmFtZXMiOiBbCiAgICAgICAgImxvIgogICAgICBdLAogICAgICAiZm9yYmlkZGVuX2h3X2FkZHJzIjogWwogICAgICAgICIwMDowMDowMDowMDowMDowMCIKICAgICAgXQogICAgfSwKICAgICJDbG9zZVN0ZGluUmVxdWVzdCI6IGZhbHNlLAogICAgIlJlYWRTdHJlYW1SZXF1ZXN0IjogZmFsc2UsCiAgICAiVXBkYXRlRXBoZW1lcmFsTW91bnRzUmVxdWVzdCI6IGZhbHNlLAogICAgIldyaXRlU3RyZWFtUmVxdWVzdCI6IGZhbHNlCiAgfQp9 +spec: + restartPolicy: Never + runtimeClassName: kata-cc + containers: + - name: busybox + image: "mcr.microsoft.com/aks/e2e/library-busybox:master.220314.1-linux-amd64" + securityContext: + privileged: true + envFrom: + - configMapRef: + name: config-map3 + command: + - /bin/sh + args: + - "-c" + - while true; do echo $simple_value1; echo $simple_value2; sleep 10; done diff --git a/src/agent/samples/policy/yaml/cron-job/test-cron-job.yaml b/src/agent/samples/policy/yaml/cron-job/test-cron-job.yaml new file mode 100644 index 000000000000..1d41ba2b6707 --- /dev/null +++ b/src/agent/samples/policy/yaml/cron-job/test-cron-job.yaml @@ -0,0 +1,22 @@ +--- +apiVersion: batch/v1 +kind: CronJob +metadata: + name: cron-job-pi-test +spec: + schedule: "* * * * *" + jobTemplate: + spec: + template: + spec: + containers: + - name: pi + image: "mcr.microsoft.com/aks/e2e/library-busybox:master.220314.1-linux-amd64" + command: + - /bin/sh + - "-c" + - "echo 'scale=5; 4*a(1)' | bc -l" + restartPolicy: OnFailure + metadata: + annotations: + io.katacontainers.config.agent.policy: IyBDb3B5cmlnaHQgKGMpIDIwMjMgTWljcm9zb2Z0IENvcnBvcmF0aW9uCiMKIyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMAojCnBhY2thZ2UgYWdlbnRfcG9saWN5CgppbXBvcnQgZnV0dXJlLmtleXdvcmRzLmluCmltcG9ydCBmdXR1cmUua2V5d29yZHMuZXZlcnkKCiMgRGVmYXVsdCB2YWx1ZXMsIHJldHVybmVkIGJ5IE9QQSB3aGVuIHJ1bGVzIGNhbm5vdCBiZSBldmFsdWF0ZWQgdG8gdHJ1ZS4KZGVmYXVsdCBBZGRBUlBOZWlnaGJvcnNSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgQWRkU3dhcFJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBDbG9zZVN0ZGluUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IENvcHlGaWxlUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IENyZWF0ZUNvbnRhaW5lclJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBDcmVhdGVTYW5kYm94UmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IERlc3Ryb3lTYW5kYm94UmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgRXhlY1Byb2Nlc3NSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgR2V0T09NRXZlbnRSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBHdWVzdERldGFpbHNSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBMaXN0SW50ZXJmYWNlc1JlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBMaXN0Um91dGVzUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IE1lbUhvdHBsdWdCeVByb2JlUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IE9ubGluZUNQVU1lbVJlcXVlc3QgOj0gdHJ1ZQpkZWZhdWx0IFBhdXNlQ29udGFpbmVyUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFJlYWRTdHJlYW1SZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgUmVtb3ZlQ29udGFpbmVyUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgUmVtb3ZlU3RhbGVWaXJ0aW9mc1NoYXJlTW91bnRzUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgUmVzZWVkUmFuZG9tRGV2UmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFJlc3VtZUNvbnRhaW5lclJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBTZXRHdWVzdERhdGVUaW1lUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFNldFBvbGljeVJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBTaWduYWxQcm9jZXNzUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgU3RhcnRDb250YWluZXJSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBTdGFydFRyYWNpbmdSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgU3RhdHNDb250YWluZXJSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBTdG9wVHJhY2luZ1JlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBUdHlXaW5SZXNpemVSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBVcGRhdGVDb250YWluZXJSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgVXBkYXRlRXBoZW1lcmFsTW91bnRzUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFVwZGF0ZUludGVyZmFjZVJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBVcGRhdGVSb3V0ZXNSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgV2FpdFByb2Nlc3NSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBXcml0ZVN0cmVhbVJlcXVlc3QgOj0gZmFsc2UKCiMgQWxsb3dSZXF1ZXN0c0ZhaWxpbmdQb2xpY3kgOj0gdHJ1ZSBjb25maWd1cmVzIHRoZSBBZ2VudCB0byAqYWxsb3cgYW55CiMgcmVxdWVzdHMgY2F1c2luZyBhIHBvbGljeSBmYWlsdXJlKi4gVGhpcyBpcyBhbiB1bnNlY3VyZSBjb25maWd1cmF0aW9uCiMgYnV0IGlzIHVzZWZ1bCBmb3IgYWxsb3dpbmcgdW5zZWN1cmUgcG9kcyB0byBzdGFydCwgdGhlbiBjb25uZWN0IHRvCiMgdGhlbSBhbmQgaW5zcGVjdCBPUEEgbG9ncyBmb3IgdGhlIHJvb3QgY2F1c2Ugb2YgYSBmYWlsdXJlLgpkZWZhdWx0IEFsbG93UmVxdWVzdHNGYWlsaW5nUG9saWN5IDo9IGZhbHNlCgojIENvbnN0YW50cwpTX05BTUVfS0VZID0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZSIKU19OQU1FU1BBQ0VfS0VZID0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZXNwYWNlIgpCVU5ETEVfSUQgPSAiW2EtejAtOV17NjR9IgoKQ3JlYXRlQ29udGFpbmVyUmVxdWVzdDo9IHJlc3AgewogICAgbm90IGlzX251bGwoaW5wdXQuZW52X21hcCkKICAgIAogICAgaV9lbnZfbWFwIDo9IGlucHV0LmVudl9tYXAKICAgIAogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBwX2Vudl9tYXAgOj0gcF9jb250YWluZXIuZW52X21hcCAgCiAgICBhbGxvd19lbnZfbWFwKHBfZW52X21hcCwgaV9lbnZfbWFwKQogICAgCiAgICBpX3Byb2Nlc3MgOj0gaW5wdXQuYmFzZS5PQ0kuUHJvY2VzcwogICAgCiAgICBwX3Byb2Nlc3MgOj0gcF9jb250YWluZXIuT0NJLlByb2Nlc3MKICAgIAogICAgYWxsb3dfYXJncyhpX3Byb2Nlc3MsIHBfcHJvY2VzcywgaV9lbnZfbWFwKQoKICAgIHJlc3AgPSBDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uKGlucHV0LmJhc2UpCiAgICBwcmludCgiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdDogdHJ1ZSIpCn0KCmFsbG93X2FyZ3MoaV9wcm9jZXNzLCBwX3Byb2Nlc3MsIGlfZW52X21hcCkgewogICAgaV9hcmdzIDo9IGlfcHJvY2Vzcy5BcmdzCiAgICBwX2FyZ3MgOj0gcF9wcm9jZXNzLkFyZ3MKICAgIHByaW50KCJhbGxvd19hcmdzOiBpX2FyZ3MgPSIsIGlfYXJncywgInBfYXJncyA9IiwgcF9hcmdzKQogICAgY291bnQoaV9hcmdzKSA9PSBjb3VudChwX2FyZ3MpCiAgICBldmVyeSBpLCBpX2FyZyBpbiBpX2FyZ3MgewogICAgICAgIHByaW50KCJhbGxvd19hcmdzOiBpX2FyZyA9IiwgaV9hcmcpCiAgICAgICAgcF9hcmdfcmVwbGFjZWQgOj0gcmVwbGFjZV9lbnZfdmFyaWFibGVzKHBfYXJnc1tpXSwgaV9lbnZfbWFwKQogICAgICAgIHByaW50KCJhbGxvd19hcmdzOiBwX2FyZ19yZXBsYWNlZCA9IiwgcF9hcmdfcmVwbGFjZWQpCiAgICAgICAgcF9hcmdfcmVwbGFjZWQyIDo9IHJlcGxhY2UocF9hcmdfcmVwbGFjZWQsICIkJCIsICIkIikKICAgICAgICBwcmludCgiYWxsb3dfYXJnczogcF9hcmdfcmVwbGFjZWQyID0iLCBwX2FyZ19yZXBsYWNlZDIpCiAgICAgICAgaV9hcmcgPT0gcF9hcmdfcmVwbGFjZWQyCiAgICB9CiAgICBwcmludCgiYWxsb3dfYXJnczogdHJ1ZSIpCn0KCmFsbG93X2FyZ3MoaV9wcm9jZXNzLCBwX3Byb2Nlc3MsIGlfZW52X21hcCkgewogICAgbm90IGlfcHJvY2Vzcy5BcmdzCiAgICBub3QgcF9wcm9jZXNzLkFyZ3MKICAgIHByaW50KCJhbGxvd19hcmdzMjogbm8gYXJncyIpCn0KCiMgdGhpcyBmdW5jdGlvbiByZXBsYWNlcyBhbGwgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyBpbiBhIHN0cmluZywgZ2l2ZW4gYSBtYXAgb2YgZW52aXJvbm1lbnQga2V5cyB0byBlbnZpcm9ubWVudCB2YWx1ZXMKIyBlZyBzdHIgPSAiZWNobyAkKENMVVNURVJfSUQpOyBlY2hvICQoTk9ERV9OQU1FKTsiCiMgZW52X21hcCA9IHsiQ0xVU1RFUl9JRCI6ICJhYmMiLCAiTk9ERV9OQU1FIiA6ICJ4eXoifQojIHJlc3VsdCA9ICJlY2hvIGFiYzsgZWNobyB4eXo7IgpyZXBsYWNlX2Vudl92YXJpYWJsZXMoc3RyLCBlbnZfbWFwKSA9IHJlc3VsdCB7CiAgICAjIG1ha2UgYW4gYXJyYXkgb2YgdGhlIGtleXMgZWcgWyJDTFVTVEVSX0lEIiwgIk5PREVfTkFNRSJdCiAgICBrZXlzIDo9IFt4IHwgc29tZSB4IGluIG9iamVjdC5rZXlzKGVudl9tYXApXQogICAgcmVzdWx0IDo9IHJlcGxhY2Vfc3RyX3JlYyhzdHIsIGVudl9tYXAsIGtleXMsIGNvdW50KGtleXMpIC0gMSkKfQoKIyBiYXNlIGNhc2UKcmVwbGFjZV9zdHJfcmVjKHN0ciwgZW52X21hcCwgYXJyX2tleXMsIGkpID0gcmVzdWx0IHsKICAgIGkgPCAwCiAgICByZXN1bHQgOj0gc3RyCn0KCiMgcmVjdXJzaXZlIHN0ZXAKcmVwbGFjZV9zdHJfcmVjKHN0ciwgZW52X21hcCwgYXJyX2tleXMsIGkpID0gcmVzdWx0IHsKICAgIGkgPj0gMAogICAga2V5IDo9IGFycl9rZXlzW2ldCiAgICBlbnZfa2V5MSA6PSBjb25jYXQoIiIsIFsiJCgiLCBrZXksICIpIl0pCiAgICAjIHJlcGxhY2UgJChWQVIpIHdpdGggdmFsdWUKICAgIG5ld19zdHIxIDo9IHJlcGxhY2Uoc3RyLCBlbnZfa2V5MSwgZW52X21hcFtrZXldKQogICAgIyByZXBsYWNlIG5leHQgZW52aXJvbm1lbnQgdmFyaWFibGUKICAgIHJlc3VsdCA9IHJlcGxhY2Vfc3RyX3JlYyhuZXdfc3RyMSwgZW52X21hcCwgYXJyX2tleXMsIGkgLSAxKQp9CgphbGxvd19lbnZfbWFwKHBfZW52X21hcCwgaV9lbnZfbWFwKSB7CiAgICBwcmludCgiYWxsb3dfZW52X21hcDogcF9lbnZfbWFwID0iLCBwX2Vudl9tYXApCiAgICBldmVyeSBlbnZfa2V5LCBlbnZfdmFsIGluIGlfZW52X21hcCB7CiAgICAgICAgcHJpbnQoImFsbG93X2VudjogZW52X2tleSA9IiwgZW52X2tleSwgImVudl92YWwgPSIsIGVudl92YWwpCiAgICAgICAgYWxsb3dfZW52X21hcF9lbnRyeShlbnZfa2V5LCBlbnZfdmFsLCBwX2Vudl9tYXApCiAgICB9CiAgICBwcmludCgiYWxsb3dfZW52X21hcDogdHJ1ZSIpCn0KCiMgQWxsb3cgZXhhY3QgbWF0Y2gKYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBpX3ZhbCA9PSBwX3ZhbAogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnk6IHRydWUiKQp9CgojIEFsbG93IHJlc291cmNlRmllbGRSZWYgdmFsdWVzIChlLmcuLCAibGltaXRzLmNwdSIpLgphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgICMgYSB2YXJpYWJsZSB3ZSBzaG91bGQgYmUgdmFsaWRhdGluZyB1c2luZyBhIHJlZ2V4IGZyb20gc2V0dGluZ3MKICAgIHBfdmFsID09ICIkKHZhbGlkYXRlLWZyb20tc2V0dGluZ3MpIgogICAgcmVnZXhfdmFsIDo9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuQ3JlYXRlQ29udGFpbmVyUmVxdWVzdC5hbGxvd19lbnZfcmVnZXhfbWFwW2tleV0KICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4X3ZhbCwgaV92YWwpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSAyOiB0cnVlIikKfQoKIyBBbGxvdyBub2RlLW5hbWUKYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChub2RlLW5hbWUpIgogICAgcmVnZXgubWF0Y2gocG9saWN5X2RhdGEuY29tbW9uLmRuc19zdWJkb21haW4gLCBpX3ZhbCkKICAgIHByaW50KCJhbGxvd19lbnZfbWFwX2VudHJ5IDM6IHRydWUiKQp9CgojIEFsbG93IGhvc3QtbmFtZQphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgIHBfdmFsID09ICIkKGhvc3QtbmFtZSkiCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24uZG5zX2xhYmVsICwgaV92YWwpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSA0OiB0cnVlIikKfQoKIyBBbGxvdyBwb2QtdWlkCmFsbG93X2Vudl9tYXBfZW50cnkoa2V5LCBpX3ZhbCwgcF9lbnZfbWFwKSB7CiAgICBwX3ZhbCA6PSBwX2Vudl9tYXBba2V5XQogICAgcF92YWwgPT0gIiQocG9kLXVpZCkiCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24ucG9kX3VpZCAsIGlfdmFsKQogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgNTogdHJ1ZSIpCn0KCiMgQWxsb3cgZmllbGRSZWYgImZpZWxkUGF0aDogc3RhdHVzLnBvZElQIiB2YWx1ZXMuCmFsbG93X2Vudl9tYXBfZW50cnkoa2V5LCBpX3ZhbCwgcF9lbnZfbWFwKSB7CiAgICBpc19pcChpX3ZhbCkKCiAgICBwX3ZhbCA6PSBwX2Vudl9tYXBba2V5XQogICAgcF92YXIgOj0gY29uY2F0KCI9IiwgW2tleSwgcF92YWxdKQogICAgYWxsb3dfcG9kX2lwX3ZhcihrZXksIHBfdmFyKQogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgNjogdHJ1ZSIpCn0KCiMgQWxsb3cgZmllbGRSZWYgImZpZWxkUGF0aDogc3RhdHVzLmhvc3RJUCIgdmFsdWVzLgphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgaXNfaXAoaV92YWwpCgogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgIHBfdmFyIDo9IGNvbmNhdCgiPSIsIFtrZXksIHBfdmFsXSkKICAgIGFsbG93X2hvc3RfaXBfdmFyKGtleSwgcF92YXIpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSA3OiB0cnVlIikKfQoKIyBNYXRjaCBpbnB1dCB3aXRoIG9uZSBvZiB0aGUgcG9saWN5IHZhcmlhYmxlcywgYWZ0ZXIgc3Vic3RpdHV0aW5nICQoc2FuZGJveC1uYW1lKS4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChzYW5kYm94LW5hbWUpIgogICAgc19uYW1lIDo9IGlucHV0LmJhc2UuT0NJLkFubm90YXRpb25zW1NfTkFNRV9LRVldCiAgICBwX3ZhcjIgOj0gcmVwbGFjZShwX3ZhbCwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHBfdmFyMiA9PSBpX3ZhbAogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgODogdHJ1ZSIpCn0KCiMgTWF0Y2ggaW5wdXQgd2l0aCBvbmUgb2YgdGhlIHBvbGljeSB2YXJpYWJsZXMsIGFmdGVyIHN1YnN0aXR1dGluZyAkKHNhbmRib3gtbmFtZXNwYWNlKS4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChzYW5kYm94LW5hbWVzcGFjZSkiCiAgICBzX25hbWVzcGFjZSA6PSBpbnB1dC5iYXNlLk9DSS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwX3ZhcjIgOj0gcmVwbGFjZShwX3ZhbCwgIiQoc2FuZGJveC1uYW1lc3BhY2UpIiwgc19uYW1lc3BhY2UpCiAgICBwX3ZhcjIgPT0gaV92YWwKICAgIHByaW50KCJhbGxvd19lbnZfbWFwX2VudHJ5IDk6IHRydWUiKQp9CgojIEFsbG93IGlucHV0IGVudiB2YXJpYWJsZXMgdGhhdCBtYXRjaCB3aXRoIGEgcmVxdWVzdF9kZWZhdWx0cyByZWdleC4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHNvbWUgcF9yZWdleDEgaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5DcmVhdGVDb250YWluZXJSZXF1ZXN0LmFsbG93X2Vudl9yZWdleAogICAgcF9yZWdleDIgOj0gcmVwbGFjZShwX3JlZ2V4MSwgIiQoaXB2NF9hKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcHY0X2EpCiAgICBwX3JlZ2V4MyA6PSByZXBsYWNlKHBfcmVnZXgyLCAiJChpcF9wKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcF9wKQogICAgcF9yZWdleDQgOj0gcmVwbGFjZShwX3JlZ2V4MywgIiQoc3ZjX25hbWUpIiwgcG9saWN5X2RhdGEuY29tbW9uLnN2Y19uYW1lKQogICAgcF9yZWdleDUgOj0gcmVwbGFjZShwX3JlZ2V4NCwgIiQoZG5zX2xhYmVsKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5kbnNfbGFiZWwpCgogICAgcmVzdWx0IDo9IGNvbmNhdCgiPSIsIFtrZXksIGlfdmFsXSkKICAgIHJlZ2V4Lm1hdGNoKHBfcmVnZXg1LCByZXN1bHQpCgogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgMTA6IHRydWUiKQp9CgpDcmVhdGVDb250YWluZXJSZXF1ZXN0Oj0gcmVzcCB7CiAgICBub3QgaW5wdXQuZW52X21hcAogICAgaV9wcm9jZXNzID0gaW5wdXQuT0NJLlByb2Nlc3MKICAgIHNfbmFtZSA9IGlucHV0Lk9DSS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBwX3Byb2Nlc3MgPSBwX2NvbnRhaW5lci5PQ0kuUHJvY2VzcwogICAgYWxsb3dfZGVwcmVjYXRlZF9hcmdzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUpCiAgICByZXNwID0gQ3JlYXRlQ29udGFpbmVyUmVxdWVzdENvbW1vbihpbnB1dCkKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0MjogdHJ1ZSIpCn0KCkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb24ocmVxKTo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgICMgQ2hlY2sgaWYgdGhlIGlucHV0IHJlcXVlc3Qgc2hvdWxkIGJlIHJlamVjdGVkIGV2ZW4gYmVmb3JlIGNoZWNraW5nIHRoZQogICAgIyBwb2xpY3lfZGF0YS5jb250YWluZXJzIGluZm9ybWF0aW9uLgogICAgYWxsb3dfY3JlYXRlX2NvbnRhaW5lcl9pbnB1dChyZXEpCgogICAgaV9vY2kgOj0gcmVxLk9DSQogICAgaV9zdG9yYWdlcyA6PSByZXEuc3RvcmFnZXMKICAgIGlfZGV2aWNlcyA6PSByZXEuZGV2aWNlcwoKICAgICMgYXJyYXkgb2YgcG9zc2libGUgc3RhdGUgb3BlcmF0aW9ucwogICAgb3BzX2J1aWxkZXIgOj0gW10KCiAgICAjIGNoZWNrIHNhbmRib3ggbmFtZQogICAgc2FuZGJveF9uYW1lID0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FX0tFWV0KICAgIGFkZF9zYW5kYm94X25hbWVfdG9fc3RhdGUgOj0gc3RhdGVfYWxsb3dzKCJzYW5kYm94X25hbWUiLCBzYW5kYm94X25hbWUpCiAgICBvcHNfYnVpbGRlcjEgOj0gY29uY2F0X29wX2lmX25vdF9udWxsKG9wc19idWlsZGVyLCBhZGRfc2FuZGJveF9uYW1lX3RvX3N0YXRlKQoKICAgICMgQ2hlY2sgaWYgYW55IGVsZW1lbnQgZnJvbSB0aGUgcG9saWN5X2RhdGEuY29udGFpbmVycyBhcnJheSBhbGxvd3MgdGhlIGlucHV0IHJlcXVlc3QuCiAgICBzb21lIHBfY29udGFpbmVyIGluIHBvbGljeV9kYXRhLmNvbnRhaW5lcnMKICAgIHByaW50KCI9PT09PT09PSBDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiB0cnlpbmcgbmV4dCBwb2xpY3kgY29udGFpbmVyIikKCiAgICBwX3BpZG5zIDo9IHBfY29udGFpbmVyLnNhbmRib3hfcGlkbnMKICAgIGlfcGlkbnMgOj0gcmVxLnNhbmRib3hfcGlkbnMKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiBwX3BpZG5zID0iLCBwX3BpZG5zLCAiaV9waWRucyA9IiwgaV9waWRucykKICAgIHBfcGlkbnMgPT0gaV9waWRucwoKICAgIHBfb2NpIDo9IHBfY29udGFpbmVyLk9DSQoKICAgICMgY2hlY2sgbmFtZXNwYWNlCiAgICBwX25hbWVzcGFjZSA6PSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBpX25hbWVzcGFjZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwcmludCAoIkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb246IHBfbmFtZXNwYWNlID0iLCBwX25hbWVzcGFjZSwgImlfbmFtZXNwYWNlID0iLCBpX25hbWVzcGFjZSkKICAgIGFkZF9uYW1lc3BhY2VfdG9fc3RhdGUgOj0gYWxsb3dfbmFtZXNwYWNlKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkKICAgIG9wc19idWlsZGVyMiA6PSBjb25jYXRfb3BfaWZfbm90X251bGwob3BzX2J1aWxkZXIxLCBhZGRfbmFtZXNwYWNlX3RvX3N0YXRlKQoKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiBwIFZlcnNpb24gPSIsIHBfb2NpLlZlcnNpb24sICJpIFZlcnNpb24gPSIsIGlfb2NpLlZlcnNpb24pCiAgICBwX29jaS5WZXJzaW9uID09IGlfb2NpLlZlcnNpb24KCiAgICBwcmludCgiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdENvbW1vbjogcCBSZWFkb25seSA9IiwgcF9vY2kuUm9vdC5SZWFkb25seSwgImkgUmVhZG9ubHkgPSIsIGlfb2NpLlJvb3QuUmVhZG9ubHkpCiAgICBwX29jaS5Sb290LlJlYWRvbmx5ID09IGlfb2NpLlJvb3QuUmVhZG9ubHkKCiAgICBhbGxvd19hbm5vKHBfb2NpLCBpX29jaSkKCiAgICBwX3N0b3JhZ2VzIDo9IHBfY29udGFpbmVyLnN0b3JhZ2VzCiAgICBhbGxvd19ieV9hbm5vKHBfb2NpLCBpX29jaSwgcF9zdG9yYWdlcywgaV9zdG9yYWdlcykKCiAgICBwX2RldmljZXMgOj0gcF9jb250YWluZXIuZGV2aWNlcwogICAgYWxsb3dfZGV2aWNlcyhwX2RldmljZXMsIGlfZGV2aWNlcykKCiAgICByZXQgOj0gYWxsb3dfbGludXgob3BzX2J1aWxkZXIyLCBwX29jaSwgaV9vY2kpCiAgICByZXQuYWxsb3dlZAoKICAgIG9wcyA6PSByZXQub3BzCgogICAgcHJpbnQoIkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb246IHRydWUiKQp9CgphbGxvd19jcmVhdGVfY29udGFpbmVyX2lucHV0KHJlcSkgewogICAgcHJpbnQoImFsbG93X2NyZWF0ZV9jb250YWluZXJfaW5wdXQ6IGlucHV0ID0iLCByZXEpCgogICAgY291bnQocmVxLnNoYXJlZF9tb3VudHMpID09IDAKICAgIGlzX251bGwocmVxLnN0cmluZ191c2VyKQoKICAgIGlfb2NpIDo9IHJlcS5PQ0kKICAgIGlzX251bGwoaV9vY2kuSG9va3MpCiAgICBpc19udWxsKGlfb2NpLlNvbGFyaXMpCiAgICBpc19udWxsKGlfb2NpLldpbmRvd3MpCgogICAgaV9saW51eCA6PSBpX29jaS5MaW51eAogICAgY291bnQoaV9saW51eC5HSURNYXBwaW5ncykgPT0gMAogICAgY291bnQoaV9saW51eC5Nb3VudExhYmVsKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlJlc291cmNlcy5EZXZpY2VzKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlJvb3Rmc1Byb3BhZ2F0aW9uKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlVJRE1hcHBpbmdzKSA9PSAwCiAgICBpc19udWxsKGlfbGludXguSW50ZWxSZHQpCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLkJsb2NrSU8pCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLk5ldHdvcmspCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLlBpZHMpCiAgICBpc19udWxsKGlfbGludXguU2VjY29tcCkKCiAgICBpX3Byb2Nlc3MgOj0gaV9vY2kuUHJvY2VzcwogICAgY291bnQoaV9wcm9jZXNzLlNlbGludXhMYWJlbCkgPT0gMAogICAgY291bnQoaV9wcm9jZXNzLlVzZXIuVXNlcm5hbWUpID09IDAKCiAgICBwcmludCgiYWxsb3dfY3JlYXRlX2NvbnRhaW5lcl9pbnB1dDogdHJ1ZSIpCn0KCmFsbG93X25hbWVzcGFjZShwX25hbWVzcGFjZSwgaV9uYW1lc3BhY2UpID0gYWRkX25hbWVzcGFjZSB7CiAgICBwX25hbWVzcGFjZSA9PSBpX25hbWVzcGFjZQogICAgYWRkX25hbWVzcGFjZSA6PSBudWxsCiAgICBwcmludCgiYWxsb3dfbmFtZXNwYWNlIDE6IGlucHV0IG5hbWVzcGFjZSBtYXRjaGVzIHBvbGljeSBkYXRhIikKfQoKYWxsb3dfbmFtZXNwYWNlKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkgPSBhZGRfbmFtZXNwYWNlIHsKICAgIHBfbmFtZXNwYWNlID09ICIiCiAgICBwcmludCgiYWxsb3dfbmFtZXNwYWNlIDI6IG5vIG5hbWVzcGFjZSBmb3VuZCBvbiBwb2xpY3kgZGF0YSIpCiAgICBhZGRfbmFtZXNwYWNlIDo9IHN0YXRlX2FsbG93cygibmFtZXNwYWNlIiwgaV9uYW1lc3BhY2UpCn0KCiMgdmFsdWUgaGFzbid0IGJlZW4gc2VlbiBiZWZvcmUsIHNhdmUgaXQgdG8gc3RhdGUKc3RhdGVfYWxsb3dzKGtleSwgdmFsdWUpID0gYWN0aW9uIHsKICBzdGF0ZSA6PSBnZXRfc3RhdGUoKQogIHByaW50KCJzdGF0ZV9hbGxvd3MgMTogc3RhdGVba2V5XSA9Iiwgc3RhdGVba2V5XSwgInZhbHVlID0iLCB2YWx1ZSkKICBub3Qgc3RhdGVba2V5XQogIHByaW50KCJzdGF0ZV9hbGxvd3MgMTogc2F2aW5nIHRvIHN0YXRlIGtleSA9Iiwga2V5LCAidmFsdWUgPSIsIHZhbHVlKQogIHBhdGggOj0gZ2V0X3N0YXRlX3BhdGgoa2V5KSAKICBhY3Rpb24gOj0gewogICAgIm9wIjogImFkZCIsCiAgICAicGF0aCI6IHBhdGgsIAogICAgInZhbHVlIjogdmFsdWUsCiAgfQp9CgojIHZhbHVlIG1hdGNoZXMgd2hhdCdzIGluIHN0YXRlLCBhbGxvdyBpdApzdGF0ZV9hbGxvd3Moa2V5LCB2YWx1ZSkgPSBhY3Rpb24gewogIHByaW50KCJzdGF0ZV9hbGxvd3MgMjogc3RhcnQiKQogIHN0YXRlIDo9IGdldF9zdGF0ZSgpCiAgcHJpbnQoInN0YXRlX2FsbG93cyAyOiBzdGF0ZVtrZXldID0iLCBzdGF0ZVtrZXldLCAidmFsdWUgPSIsIHZhbHVlKQogIHZhbHVlID09IHN0YXRlW2tleV0KICBwcmludCgic3RhdGVfYWxsb3dzIDI6IGZvdW5kIGtleSA9Iiwga2V5LCAidmFsdWUgPSIsIHZhbHVlLCAiIGluIHN0YXRlIikKICBhY3Rpb24gOj0gbnVsbAp9CgojIGhlbHBlciBmdW5jdGlvbnMgdG8gaW50ZXJhY3Qgd2l0aCB0aGUgc3RhdGUKZ2V0X3N0YXRlKCkgPSBzdGF0ZSB7CiAgc3RhdGUgOj0gZGF0YVsicHN0YXRlIl0KfQoKZ2V0X3N0YXRlX3ZhbChrZXkpID0gdmFsdWUgewogICAgc3RhdGUgOj0gZ2V0X3N0YXRlKCkKICAgIHZhbHVlIDo9IHN0YXRlW2tleV0KfQoKZ2V0X3N0YXRlX3BhdGgoa2V5KSA9IHBhdGggewogICAgIyBwcmVwZW5kICIvcHN0YXRlLyIgdG8ga2V5CiAgICBwYXRoIDo9IGNvbmNhdCgiLyIsIFsiL3BzdGF0ZSIsIGtleV0pCn0KCiMgSGVscGVyIGZ1bmN0aW9ucyB0byBjb25kaXRpb25hbGx5IGNvbmNhdGVuYXRlIG9wIGlzIG5vdCBudWxsCmNvbmNhdF9vcF9pZl9ub3RfbnVsbChvcHMsIG9wKSA9IHJlc3VsdCB7CiAgICBvcCA9PSBudWxsCiAgICByZXN1bHQgOj0gb3BzCn0KCmNvbmNhdF9vcF9pZl9ub3RfbnVsbChvcHMsIG9wKSA9IHJlc3VsdCB7CiAgICBvcCAhPSBudWxsCiAgICByZXN1bHQgOj0gYXJyYXkuY29uY2F0KG9wcywgW29wXSkKfQoKIyBSZWplY3QgdW5leHBlY3RlZCBhbm5vdGF0aW9ucy4KYWxsb3dfYW5ubyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19hbm5vIDE6IHN0YXJ0IikKCiAgICBub3QgaV9vY2kuQW5ub3RhdGlvbnMKCiAgICBwcmludCgiYWxsb3dfYW5ubyAxOiB0cnVlIikKfQphbGxvd19hbm5vKHBfb2NpLCBpX29jaSkgewogICAgcHJpbnQoImFsbG93X2Fubm8gMjogcCBBbm5vdGF0aW9ucyA9IiwgcF9vY2kuQW5ub3RhdGlvbnMpCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiBpIEFubm90YXRpb25zID0iLCBpX29jaS5Bbm5vdGF0aW9ucykKCiAgICBpX2tleXMgOj0gb2JqZWN0LmtleXMoaV9vY2kuQW5ub3RhdGlvbnMpCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiBpIGtleXMgPSIsIGlfa2V5cykKCiAgICBldmVyeSBpX2tleSBpbiBpX2tleXMgewogICAgICAgIGFsbG93X2Fubm9fa2V5KGlfa2V5LCBwX29jaSkKICAgIH0KCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiB0cnVlIikKfQoKYWxsb3dfYW5ub19rZXkoaV9rZXksIHBfb2NpKSB7CiAgICBwcmludCgiYWxsb3dfYW5ub19rZXkgMTogaSBrZXkgPSIsIGlfa2V5KQoKICAgIHN0YXJ0c3dpdGgoaV9rZXksICJpby5rdWJlcm5ldGVzLmNyaS4iKQoKICAgIHByaW50KCJhbGxvd19hbm5vX2tleSAxOiB0cnVlIikKfQphbGxvd19hbm5vX2tleShpX2tleSwgcF9vY2kpIHsKICAgIHByaW50KCJhbGxvd19hbm5vX2tleSAyOiBpIGtleSA9IiwgaV9rZXkpCgogICAgc29tZSBwX2tleSwgXyBpbiBwX29jaS5Bbm5vdGF0aW9ucwogICAgcF9rZXkgPT0gaV9rZXkKCiAgICBwcmludCgiYWxsb3dfYW5ub19rZXkgMjogdHJ1ZSIpCn0KCiMgR2V0IHRoZSB2YWx1ZSBvZiB0aGUgU19OQU1FX0tFWSBhbm5vdGF0aW9uIGFuZAojIGNvcnJlbGF0ZSBpdCB3aXRoIG90aGVyIGFubm90YXRpb25zIGFuZCBwcm9jZXNzIGZpZWxkcy4KYWxsb3dfYnlfYW5ubyhwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpIHsKICAgIHByaW50KCJhbGxvd19ieV9hbm5vIDE6IHN0YXJ0IikKCiAgICBub3QgcF9vY2kuQW5ub3RhdGlvbnNbU19OQU1FX0tFWV0KCiAgICBpX3NfbmFtZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMTogaV9zX25hbWUgPSIsIGlfc19uYW1lKQoKICAgIGlfc19uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FU1BBQ0VfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMTogaV9zX25hbWVzcGFjZSA9IiwgaV9zX25hbWVzcGFjZSkKCiAgICBhbGxvd19ieV9zYW5kYm94X25hbWUocF9vY2ksIGlfb2NpLCBwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBpX3NfbmFtZSwgaV9zX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfYnlfYW5ubyAxOiB0cnVlIikKfQphbGxvd19ieV9hbm5vKHBfb2NpLCBpX29jaSwgcF9zdG9yYWdlcywgaV9zdG9yYWdlcykgewogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMjogc3RhcnQiKQoKICAgIHBfc19uYW1lIDo9IHBfb2NpLkFubm90YXRpb25zW1NfTkFNRV9LRVldCiAgICBpX3NfbmFtZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMjogaV9zX25hbWUgPSIsIGlfc19uYW1lLCAicF9zX25hbWUgPSIsIHBfc19uYW1lKQoKICAgIGFsbG93X3NhbmRib3hfbmFtZShwX3NfbmFtZSwgaV9zX25hbWUpCgogICAgaV9zX25hbWVzcGFjZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwcmludCgiYWxsb3dfYnlfYW5ubyAyOiBpX3NfbmFtZXNwYWNlID0iLCBpX3NfbmFtZXNwYWNlKQoKICAgIGFsbG93X2J5X3NhbmRib3hfbmFtZShwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMsIGlfc19uYW1lLCBpX3NfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd19ieV9hbm5vIDI6IHRydWUiKQp9CgphbGxvd19ieV9zYW5kYm94X25hbWUocF9vY2ksIGlfb2NpLCBwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfYnlfc2FuZGJveF9uYW1lOiBzdGFydCIpCgogICAgaV9uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FU1BBQ0VfS0VZXQoKICAgIGFsbG93X2J5X2NvbnRhaW5lcl90eXBlcyhwX29jaSwgaV9vY2ksIHNfbmFtZSwgaV9uYW1lc3BhY2UpCiAgICBhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZChwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpCiAgICBhbGxvd19wcm9jZXNzKHBfb2NpLlByb2Nlc3MsIGlfb2NpLlByb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpCgogICAgcHJpbnQoImFsbG93X2J5X3NhbmRib3hfbmFtZTogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfbmFtZShwX3NfbmFtZSwgaV9zX25hbWUpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X25hbWU6IHN0YXJ0IikKICAgIHJlZ2V4Lm1hdGNoKHBfc19uYW1lLCBpX3NfbmFtZSkKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9uYW1lOiB0cnVlIikKfQoKIyBDaGVjayB0aGF0IHRoZSAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLXR5cGUiIGFuZAojICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIiBhbm5vdGF0aW9ucyBkZXNpZ25hdGUgdGhlCiMgZXhwZWN0ZWQgdHlwZSAtIGVpdGhlciBhICJzYW5kYm94IiBvciBhICJjb250YWluZXIiLiBUaGVuLCB2YWxpZGF0ZQojIG90aGVyIGFubm90YXRpb25zIGJhc2VkIG9uIHRoZSBhY3R1YWwgInNhbmRib3giIG9yICJjb250YWluZXIiIHZhbHVlCiMgZnJvbSB0aGUgaW5wdXQgY29udGFpbmVyLgphbGxvd19ieV9jb250YWluZXJfdHlwZXMocF9vY2ksIGlfb2NpLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfYnlfY29udGFpbmVyX3R5cGVzOiBjaGVja2luZyBpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSIpCgogICAgY190eXBlIDo9ICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSIKICAgIAogICAgcF9jcmlfdHlwZSA6PSBwX29jaS5Bbm5vdGF0aW9uc1tjX3R5cGVdCiAgICBpX2NyaV90eXBlIDo9IGlfb2NpLkFubm90YXRpb25zW2NfdHlwZV0KICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZXM6IHBfY3JpX3R5cGUgPSIsIHBfY3JpX3R5cGUsICJpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgcF9jcmlfdHlwZSA9PSBpX2NyaV90eXBlCgogICAgYWxsb3dfYnlfY29udGFpbmVyX3R5cGUoaV9jcmlfdHlwZSwgcF9vY2ksIGlfb2NpLCBzX25hbWUsIHNfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZXM6IHRydWUiKQp9CgphbGxvd19ieV9jb250YWluZXJfdHlwZShpX2NyaV90eXBlLCBwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAxOiBpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgaV9jcmlfdHlwZSA9PSAic2FuZGJveCIKCiAgICBpX2thdGFfdHlwZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1siaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5jb250YWluZXJfdHlwZSJdCiAgICBwcmludCgiYWxsb3dfYnlfY29udGFpbmVyX3R5cGUgMTogaV9rYXRhX3R5cGUgPSIsIGlfa2F0YV90eXBlKQogICAgaV9rYXRhX3R5cGUgPT0gInBvZF9zYW5kYm94IgoKICAgIGFsbG93X3NhbmRib3hfY29udGFpbmVyX25hbWUocF9vY2ksIGlfb2NpKQogICAgYWxsb3dfc2FuZGJveF9uZXRfbmFtZXNwYWNlKHBfb2NpLCBpX29jaSkKICAgIGFsbG93X3NhbmRib3hfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpCgogICAgcHJpbnQoImFsbG93X2J5X2NvbnRhaW5lcl90eXBlIDE6IHRydWUiKQp9CgphbGxvd19ieV9jb250YWluZXJfdHlwZShpX2NyaV90eXBlLCBwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiBpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgaV9jcmlfdHlwZSA9PSAiY29udGFpbmVyIgoKICAgIGlfa2F0YV90eXBlIDo9IGlfb2NpLkFubm90YXRpb25zWyJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIl0KICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiBpX2thdGFfdHlwZSA9IiwgaV9rYXRhX3R5cGUpCiAgICBpX2thdGFfdHlwZSA9PSAicG9kX2NvbnRhaW5lciIKCiAgICBhbGxvd19jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpCiAgICBhbGxvd19uZXRfbmFtZXNwYWNlKHBfb2NpLCBpX29jaSkKICAgIGFsbG93X2xvZ19kaXJlY3RvcnkocF9vY2ksIGlfb2NpKQoKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiB0cnVlIikKfQoKIyAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLW5hbWUiIGFubm90YXRpb24KYWxsb3dfc2FuZGJveF9jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X2NvbnRhaW5lcl9uYW1lOiBzdGFydCIpCgogICAgY29udGFpbmVyX2Fubm90YXRpb25fbWlzc2luZyhwX29jaSwgaV9vY2ksICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItbmFtZSIpCgogICAgcHJpbnQoImFsbG93X3NhbmRib3hfY29udGFpbmVyX25hbWU6IHRydWUiKQp9CgphbGxvd19jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19jb250YWluZXJfbmFtZTogc3RhcnQiKQoKICAgIGFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uKHBfb2NpLCBpX29jaSwgImlvLmt1YmVybmV0ZXMuY3JpLmNvbnRhaW5lci1uYW1lIikKCiAgICBwcmludCgiYWxsb3dfY29udGFpbmVyX25hbWU6IHRydWUiKQp9Cgpjb250YWluZXJfYW5ub3RhdGlvbl9taXNzaW5nKHBfb2NpLCBpX29jaSwga2V5KSB7CiAgICBwcmludCgiY29udGFpbmVyX2Fubm90YXRpb25fbWlzc2luZzoiLCBrZXkpCgogICAgbm90IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIG5vdCBpX29jaS5Bbm5vdGF0aW9uc1trZXldCgogICAgcHJpbnQoImNvbnRhaW5lcl9hbm5vdGF0aW9uX21pc3Npbmc6IHRydWUiKQp9CgphbGxvd19jb250YWluZXJfYW5ub3RhdGlvbihwX29jaSwgaV9vY2ksIGtleSkgewogICAgcHJpbnQoImFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uOiBrZXkgPSIsIGtleSkKCiAgICBwX3ZhbHVlIDo9IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIGlfdmFsdWUgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgcHJpbnQoImFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uOiBwX3ZhbHVlID0iLCBwX3ZhbHVlLCAiaV92YWx1ZSA9IiwgaV92YWx1ZSkKCiAgICBwX3ZhbHVlID09IGlfdmFsdWUKCiAgICBwcmludCgiYWxsb3dfY29udGFpbmVyX2Fubm90YXRpb246IHRydWUiKQp9CgojICJuZXJkY3RsL25ldHdvcmstbmFtZXNwYWNlIiBhbm5vdGF0aW9uCmFsbG93X3NhbmRib3hfbmV0X25hbWVzcGFjZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X25ldF9uYW1lc3BhY2U6IHN0YXJ0IikKCiAgICBrZXkgOj0gIm5lcmRjdGwvbmV0d29yay1uYW1lc3BhY2UiCgogICAgcF9uYW1lc3BhY2UgOj0gcF9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgaV9uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgcHJpbnQoImFsbG93X3NhbmRib3hfbmV0X25hbWVzcGFjZTogcF9uYW1lc3BhY2UgPSIsIHBfbmFtZXNwYWNlLCAiaV9uYW1lc3BhY2UgPSIsIGlfbmFtZXNwYWNlKQoKICAgIHJlZ2V4Lm1hdGNoKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9uZXRfbmFtZXNwYWNlOiB0cnVlIikKfQoKYWxsb3dfbmV0X25hbWVzcGFjZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19uZXRfbmFtZXNwYWNlOiBzdGFydCIpCgogICAga2V5IDo9ICJuZXJkY3RsL25ldHdvcmstbmFtZXNwYWNlIgoKICAgIG5vdCBwX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICBub3QgaV9vY2kuQW5ub3RhdGlvbnNba2V5XQoKICAgIHByaW50KCJhbGxvd19uZXRfbmFtZXNwYWNlOiB0cnVlIikKfQoKIyAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1sb2ctZGlyZWN0b3J5IiBhbm5vdGF0aW9uCmFsbG93X3NhbmRib3hfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X2xvZ19kaXJlY3Rvcnk6IHN0YXJ0IikKCiAgICBrZXkgOj0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbG9nLWRpcmVjdG9yeSIKCiAgICBwX2RpciA6PSBwX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICByZWdleDEgOj0gcmVwbGFjZShwX2RpciwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHJlZ2V4MiA6PSByZXBsYWNlKHJlZ2V4MSwgIiQoc2FuZGJveC1uYW1lc3BhY2UpIiwgc19uYW1lc3BhY2UpCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiByZWdleDIgPSIsIHJlZ2V4MikKCiAgICBpX2RpciA6PSBpX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiBpX2RpciA9IiwgaV9kaXIpCgogICAgcmVnZXgubWF0Y2gocmVnZXgyLCBpX2RpcikKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiB0cnVlIikKfQoKYWxsb3dfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19sb2dfZGlyZWN0b3J5OiBzdGFydCIpCgogICAga2V5IDo9ICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWxvZy1kaXJlY3RvcnkiCgogICAgbm90IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIG5vdCBpX29jaS5Bbm5vdGF0aW9uc1trZXldCgogICAgcHJpbnQoImFsbG93X2xvZ19kaXJlY3Rvcnk6IHRydWUiKQp9CgphbGxvd19kZXZpY2VzKHBfZGV2aWNlcywgaV9kZXZpY2VzKSB7CiAgICBwcmludCgiYWxsb3dfZGV2aWNlczogc3RhcnQiKQogICAgZXZlcnkgaV9kZXZpY2UgaW4gaV9kZXZpY2VzIHsKICAgICAgICBwcmludCgiYWxsb3dfZGV2aWNlczogaV9kZXZpY2UgPSIsIGlfZGV2aWNlKQogICAgICAgIHNvbWUgcF9kZXZpY2UgaW4gcF9kZXZpY2VzCiAgICAgICAgcF9kZXZpY2UuY29udGFpbmVyX3BhdGggPT0gaV9kZXZpY2UuY29udGFpbmVyX3BhdGgKICAgIH0KICAgIHByaW50KCJhbGxvd19kZXZpY2VzOiB0cnVlIikKfQoKYWxsb3dfbGludXgoc3RhdGVfb3BzLCBwX29jaSwgaV9vY2kpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIHBfbmFtZXNwYWNlcyA6PSBwX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbGludXg6IHAgbmFtZXNwYWNlcyA9IiwgcF9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlcyA6PSBpX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbGludXg6IGkgbmFtZXNwYWNlcyA9IiwgaV9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlX3dpdGhvdXRfbmV0d29yayA6PSBbb2JqIHwgb2JqIDo9IGlfbmFtZXNwYWNlc1tfXTsgb2JqLlR5cGUgIT0gIm5ldHdvcmsiXQoKICAgIHByaW50KCJhbGxvd19saW51eDogaV9uYW1lc3BhY2Vfd2l0aG91dF9uZXR3b3JrID0iLCBpX25hbWVzcGFjZV93aXRob3V0X25ldHdvcmspCgogICAgcF9uYW1lc3BhY2VzID09IGlfbmFtZXNwYWNlX3dpdGhvdXRfbmV0d29yawoKICAgIGFsbG93X21hc2tlZF9wYXRocyhwX29jaSwgaV9vY2kpCiAgICBhbGxvd19yZWFkb25seV9wYXRocyhwX29jaSwgaV9vY2kpCiAgICBhbGxvd19saW51eF9kZXZpY2VzKHBfb2NpLkxpbnV4LkRldmljZXMsIGlfb2NpLkxpbnV4LkRldmljZXMpCiAgICBhbGxvd19saW51eF9zeXNjdGwocF9vY2kuTGludXgsIGlfb2NpLkxpbnV4KQogICAgcmV0IDo9IGFsbG93X25ldHdvcmtfbmFtZXNwYWNlX3N0YXJ0KHN0YXRlX29wcywgcF9vY2ksIGlfb2NpKQogICAgcmV0LmFsbG93ZWQKCiAgICBvcHMgOj0gcmV0Lm9wcwoKICAgIHByaW50KCJhbGxvd19saW51eDogdHJ1ZSIpCn0KCiMgUmV0cmlldmUgdGhlICJuZXR3b3JrIiBuYW1lc3BhY2UgZnJvbSB0aGUgaW5wdXQgZGF0YSBhbmQgcGFzcyBpdCBvbiBmb3IgdGhlCiMgbmV0d29yayBuYW1lc3BhY2UgcG9saWN5IGNoZWNrcy4KYWxsb3dfbmV0d29ya19uYW1lc3BhY2Vfc3RhcnQoc3RhdGVfb3BzLCBwX29jaSwgaV9vY2kpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIHByaW50KCJhbGxvd19uZXR3b3JrX25hbWVzcGFjZSBzdGFydDogc3RhcnQiKQoKICAgIHBfbmFtZXNwYWNlcyA6PSBwX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IHAgbmFtZXNwYWNlcyA9IiwgcF9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlcyA6PSBpX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IGkgbmFtZXNwYWNlcyA9IiwgaV9uYW1lc3BhY2VzKQoKICAgICMgUmV0dXJuIHBhdGggb2YgdGhlICJuZXR3b3JrIiBuYW1lc3BhY2UKICAgIG5ldHdvcmtfbnMgOj0gW29iaiB8IG9iaiA6PSBpX25hbWVzcGFjZXNbX107IG9iai5UeXBlID09ICJuZXR3b3JrIl0KCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IG5ldHdvcmtfbnMgPSIsIG5ldHdvcmtfbnMpCgogICAgcmV0IDo9IGFsbG93X25ldHdvcmtfbmFtZXNwYWNlKHN0YXRlX29wcywgbmV0d29ya19ucykKICAgIHJldC5hbGxvd2VkCgogICAgb3BzIDo9IHJldC5vcHMKfQoKIyBUaGlzIHJ1bGUgaXMgd2hlbiB0aGVyZSdzIG5vIG5ldHdvcmsgbmFtZXNwYWNlIGluIHRoZSBpbnB1dCBkYXRhLgphbGxvd19uZXR3b3JrX25hbWVzcGFjZShzdGF0ZV9vcHMsIG5ldHdvcmtfbnMpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIGNvdW50KG5ldHdvcmtfbnMpID09IDAKCiAgICBuZXR3b3JrX25zX3BhdGggPSAiIgoKICAgIGFkZF9uZXR3b3JrX25hbWVzcGFjZV90b19zdGF0ZSA6PSBzdGF0ZV9hbGxvd3MoIm5ldHdvcmtfbmFtZXNwYWNlIiwgbmV0d29ya19uc19wYXRoKQogICAgb3BzIDo9IGNvbmNhdF9vcF9pZl9ub3RfbnVsbChzdGF0ZV9vcHMsIGFkZF9uZXR3b3JrX25hbWVzcGFjZV90b19zdGF0ZSkKCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2UgMTogdHJ1ZSIpCn0KCiMgVGhpcyBydWxlIGlzIHdoZW4gdGhlcmUncyBleGFjdGx5IG9uZSBuZXR3b3JrIG5hbWVzcGFjZSBpbiB0aGUgaW5wdXQgZGF0YS4KYWxsb3dfbmV0d29ya19uYW1lc3BhY2Uoc3RhdGVfb3BzLCBuZXR3b3JrX25zKSA6PSB7Im9wcyI6IG9wcywgImFsbG93ZWQiOiB0cnVlfSB7CiAgICBjb3VudChuZXR3b3JrX25zKSA9PSAxCgogICAgYWRkX25ldHdvcmtfbmFtZXNwYWNlX3RvX3N0YXRlIDo9IHN0YXRlX2FsbG93cygibmV0d29ya19uYW1lc3BhY2UiLCBuZXR3b3JrX25zWzBdLlBhdGgpCiAgICBvcHMgOj0gY29uY2F0X29wX2lmX25vdF9udWxsKHN0YXRlX29wcywgYWRkX25ldHdvcmtfbmFtZXNwYWNlX3RvX3N0YXRlKQoKICAgIHByaW50KCJhbGxvd19uZXR3b3JrX25hbWVzcGFjZSAyOiB0cnVlIikKfQoKYWxsb3dfbWFza2VkX3BhdGhzKHBfb2NpLCBpX29jaSkgewogICAgcF9wYXRocyA6PSBwX29jaS5MaW51eC5NYXNrZWRQYXRocwogICAgcHJpbnQoImFsbG93X21hc2tlZF9wYXRocyAxOiBwX3BhdGhzID0iLCBwX3BhdGhzKQoKICAgIGlfcGF0aHMgOj0gaV9vY2kuTGludXguTWFza2VkUGF0aHMKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aHMgMTogaV9wYXRocyA9IiwgaV9wYXRocykKCiAgICBhbGxvd19tYXNrZWRfcGF0aHNfYXJyYXkocF9wYXRocywgaV9wYXRocykKCiAgICBwcmludCgiYWxsb3dfbWFza2VkX3BhdGhzIDE6IHRydWUiKQp9CmFsbG93X21hc2tlZF9wYXRocyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aHMgMjogc3RhcnQiKQoKICAgIG5vdCBwX29jaS5MaW51eC5NYXNrZWRQYXRocwogICAgbm90IGlfb2NpLkxpbnV4Lk1hc2tlZFBhdGhzCgogICAgcHJpbnQoImFsbG93X21hc2tlZF9wYXRocyAyOiB0cnVlIikKfQoKIyBBbGwgdGhlIHBvbGljeSBtYXNrZWQgcGF0aHMgbXVzdCBiZSBtYXNrZWQgaW4gdGhlIGlucHV0IGRhdGEgdG9vLgojIElucHV0IGlzIGFsbG93ZWQgdG8gaGF2ZSBtb3JlIG1hc2tlZCBwYXRocyB0aGFuIHRoZSBwb2xpY3kuCmFsbG93X21hc2tlZF9wYXRoc19hcnJheShwX2FycmF5LCBpX2FycmF5KSB7CiAgICBldmVyeSBwX2VsZW0gaW4gcF9hcnJheSB7CiAgICAgICAgYWxsb3dfbWFza2VkX3BhdGgocF9lbGVtLCBpX2FycmF5KQogICAgfQp9CgphbGxvd19tYXNrZWRfcGF0aChwX2VsZW0sIGlfYXJyYXkpIHsKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aDogcF9lbGVtID0iLCBwX2VsZW0pCgogICAgc29tZSBpX2VsZW0gaW4gaV9hcnJheQogICAgcF9lbGVtID09IGlfZWxlbQoKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aDogdHJ1ZSIpCn0KCmFsbG93X3JlYWRvbmx5X3BhdGhzKHBfb2NpLCBpX29jaSkgewogICAgcF9wYXRocyA6PSBwX29jaS5MaW51eC5SZWFkb25seVBhdGhzCiAgICBwcmludCgiYWxsb3dfcmVhZG9ubHlfcGF0aHMgMTogcF9wYXRocyA9IiwgcF9wYXRocykKCiAgICBpX3BhdGhzIDo9IGlfb2NpLkxpbnV4LlJlYWRvbmx5UGF0aHMKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAxOiBpX3BhdGhzID0iLCBpX3BhdGhzKQoKICAgIGFsbG93X3JlYWRvbmx5X3BhdGhzX2FycmF5KHBfcGF0aHMsIGlfcGF0aHMsIGlfb2NpLkxpbnV4Lk1hc2tlZFBhdGhzKQoKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAxOiB0cnVlIikKfQphbGxvd19yZWFkb25seV9wYXRocyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAyOiBzdGFydCIpCgogICAgbm90IHBfb2NpLkxpbnV4LlJlYWRvbmx5UGF0aHMKICAgIG5vdCBpX29jaS5MaW51eC5SZWFkb25seVBhdGhzCgogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGhzIDI6IHRydWUiKQp9CgojIEFsbCB0aGUgcG9saWN5IHJlYWRvbmx5IHBhdGhzIG11c3QgYmUgZWl0aGVyOgojIC0gUHJlc2VudCBpbiB0aGUgaW5wdXQgcmVhZG9ubHkgcGF0aHMsIG9yCiMgLSBQcmVzZW50IGluIHRoZSBpbnB1dCBtYXNrZWQgcGF0aHMuCiMgSW5wdXQgaXMgYWxsb3dlZCB0byBoYXZlIG1vcmUgcmVhZG9ubHkgcGF0aHMgdGhhbiB0aGUgcG9saWN5LgphbGxvd19yZWFkb25seV9wYXRoc19hcnJheShwX2FycmF5LCBpX2FycmF5LCBtYXNrZWRfcGF0aHMpIHsKICAgIGV2ZXJ5IHBfZWxlbSBpbiBwX2FycmF5IHsKICAgICAgICBhbGxvd19yZWFkb25seV9wYXRoKHBfZWxlbSwgaV9hcnJheSwgbWFza2VkX3BhdGhzKQogICAgfQp9CgphbGxvd19yZWFkb25seV9wYXRoKHBfZWxlbSwgaV9hcnJheSwgbWFza2VkX3BhdGhzKSB7CiAgICBwcmludCgiYWxsb3dfcmVhZG9ubHlfcGF0aCAxOiBwX2VsZW0gPSIsIHBfZWxlbSkKCiAgICBzb21lIGlfZWxlbSBpbiBpX2FycmF5CiAgICBwX2VsZW0gPT0gaV9lbGVtCgogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGggMTogdHJ1ZSIpCn0KYWxsb3dfcmVhZG9ubHlfcGF0aChwX2VsZW0sIGlfYXJyYXksIG1hc2tlZF9wYXRocykgewogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGggMjogcF9lbGVtID0iLCBwX2VsZW0pCgogICAgc29tZSBpX21hc2tlZCBpbiBtYXNrZWRfcGF0aHMKICAgIHBfZWxlbSA9PSBpX21hc2tlZAoKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRoIDI6IHRydWUiKQp9CgphbGxvd19saW51eF9kZXZpY2VzKHBfZGV2aWNlcywgaV9kZXZpY2VzKSB7CiAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogc3RhcnQiKQogICAgZXZlcnkgaV9kZXZpY2UgaW4gaV9kZXZpY2VzIHsKICAgICAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogaV9kZXZpY2UgPSIsIGlfZGV2aWNlKQogICAgICAgIHNvbWUgcF9kZXZpY2UgaW4gcF9kZXZpY2VzCiAgICAgICAgaV9kZXZpY2UuUGF0aCA9PSBwX2RldmljZS5QYXRoCiAgICB9CiAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogdHJ1ZSIpCn0KCmFsbG93X2xpbnV4X3N5c2N0bChwX2xpbnV4LCBpX2xpbnV4KSB7CiAgICBwcmludCgiYWxsb3dfbGludXhfc3lzY3RsIDE6IHN0YXJ0IikKICAgIG5vdCBpX2xpbnV4LlN5c2N0bAogICAgcHJpbnQoImFsbG93X2xpbnV4X3N5c2N0bCAxOiB0cnVlIikKfQoKYWxsb3dfbGludXhfc3lzY3RsKHBfbGludXgsIGlfbGludXgpIHsKICAgIHByaW50KCJhbGxvd19saW51eF9zeXNjdGwgMjogc3RhcnQiKQogICAgcF9zeXNjdGwgOj0gcF9saW51eC5TeXNjdGwKICAgIGlfc3lzY3RsIDo9IGlfbGludXguU3lzY3RsCiAgICBldmVyeSBpX25hbWUsIGlfdmFsIGluIGlfc3lzY3RsIHsKICAgICAgICBwcmludCgiYWxsb3dfbGludXhfc3lzY3RsIDI6IGlfbmFtZSA9IiwgaV9uYW1lLCAiaV92YWwgPSIsIGlfdmFsKQogICAgICAgIHBfc3lzY3RsW2lfbmFtZV0gPT0gaV92YWwKICAgIH0KICAgIHByaW50KCJhbGxvd19saW51eF9zeXNjdGwgMjogdHJ1ZSIpCn0KCiMgQ2hlY2sgdGhlIGNvbnNpc3RlbmN5IG9mIHRoZSBpbnB1dCAiaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5idW5kbGVfcGF0aCIKIyBhbmQgaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCIgdmFsdWVzIHdpdGggb3RoZXIgZmllbGRzLgphbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZChwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpIHsKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogc3RhcnQiKQoKICAgIGJ1bmRsZV9wYXRoIDo9IGlfb2NpLkFubm90YXRpb25zWyJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmJ1bmRsZV9wYXRoIl0KICAgIGJ1bmRsZV9pZCA6PSByZXBsYWNlKGJ1bmRsZV9wYXRoLCAiL3J1bi9jb250YWluZXJkL2lvLmNvbnRhaW5lcmQucnVudGltZS52Mi50YXNrL2s4cy5pby8iLCAiIikKCiAgICBidW5kbGVfaWRfZm9ybWF0IDo9IGNvbmNhdCgiIiwgWyJeIiwgQlVORExFX0lELCAiJCJdKQogICAgcmVnZXgubWF0Y2goYnVuZGxlX2lkX2Zvcm1hdCwgYnVuZGxlX2lkKQoKICAgIGtleSA6PSAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCIKCiAgICBwX3JlZ2V4IDo9IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIHNhbmRib3hfaWQgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQoKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogc2FuZGJveF9pZCA9Iiwgc2FuZGJveF9pZCwgInJlZ2V4ID0iLCBwX3JlZ2V4KQogICAgcmVnZXgubWF0Y2gocF9yZWdleCwgc2FuZGJveF9pZCkKCiAgICBhbGxvd19yb290X3BhdGgocF9vY2ksIGlfb2NpLCBidW5kbGVfaWQpCgogICAgZXZlcnkgaV9tb3VudCBpbiBpX29jaS5Nb3VudHMgewogICAgICAgIGFsbG93X21vdW50KHBfb2NpLCBpX21vdW50LCBpX3N0b3JhZ2VzLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpCiAgICB9CgogICAgYWxsb3dfc3RvcmFnZXMocF9zdG9yYWdlcywgaV9zdG9yYWdlcywgYnVuZGxlX2lkLCBzYW5kYm94X2lkKQoKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogdHJ1ZSIpCn0KCmFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHBfcHJvY2VzcyA9IiwgcF9wcm9jZXNzKQogICAgcHJpbnQoImFsbG93X3Byb2Nlc3NfY29tbW9uOiBpX3Byb2Nlc3MgPSAiLCBpX3Byb2Nlc3MpCiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHNfbmFtZSA9Iiwgc19uYW1lKQoKICAgIHBfcHJvY2Vzcy5Dd2QgPT0gaV9wcm9jZXNzLkN3ZAogICAgcF9wcm9jZXNzLk5vTmV3UHJpdmlsZWdlcyA9PSBpX3Byb2Nlc3MuTm9OZXdQcml2aWxlZ2VzCgogICAgYWxsb3dfdXNlcihwX3Byb2Nlc3MsIGlfcHJvY2VzcykKICAgIGFsbG93X2VudihwX3Byb2Nlc3MsIGlfcHJvY2Vzcywgc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHRydWUiKQp9CgojIENvbXBhcmUgdGhlIE9DSSBQcm9jZXNzIGZpZWxkIG9mIGEgcG9saWN5IGNvbnRhaW5lciB3aXRoIHRoZSBpbnB1dCBPQ0kgUHJvY2VzcyBmcm9tIGEgQ3JlYXRlQ29udGFpbmVyUmVxdWVzdAphbGxvd19wcm9jZXNzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfcHJvY2Vzczogc3RhcnQiKQoKICAgIGFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgYWxsb3dfY2FwcyhwX3Byb2Nlc3MuQ2FwYWJpbGl0aWVzLCBpX3Byb2Nlc3MuQ2FwYWJpbGl0aWVzKQogICAgcF9wcm9jZXNzLlRlcm1pbmFsID09IGlfcHJvY2Vzcy5UZXJtaW5hbAoKICAgIHByaW50KCJhbGxvd19wcm9jZXNzOiB0cnVlIikKfQoKIyBDb21wYXJlIHRoZSBPQ0kgUHJvY2VzcyBmaWVsZCBvZiBhIHBvbGljeSBjb250YWluZXIgd2l0aCB0aGUgaW5wdXQgcHJvY2VzcyBmaWVsZCBmcm9tIEV4ZWNQcm9jZXNzUmVxdWVzdAphbGxvd19pbnRlcmFjdGl2ZV9wcm9jZXNzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfaW50ZXJhY3RpdmVfcHJvY2Vzczogc3RhcnQiKQoKICAgIGFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgYWxsb3dfZXhlY19jYXBzKGlfcHJvY2Vzcy5DYXBhYmlsaXRpZXMpCgogICAgIyBUaGVzZSBhcmUgY29tbWFuZHMgZW5hYmxlZCB1c2luZyBFeGVjUHJvY2Vzc1JlcXVlc3QgY29tbWFuZHMgYW5kL29yIHJlZ2V4IGZyb20gdGhlIHNldHRpbmdzIGZpbGUuCiAgICAjIFRoZXkgY2FuIGJlIGV4ZWN1dGVkIGludGVyYWN0aXZlbHkgc28gYWxsb3cgdGhlbSB0byB1c2UgYW55IHZhbHVlIGZvciBpX3Byb2Nlc3MuVGVybWluYWwuCgogICAgcHJpbnQoImFsbG93X2ludGVyYWN0aXZlX3Byb2Nlc3M6IHRydWUiKQp9CgojIENvbXBhcmUgdGhlIE9DSSBQcm9jZXNzIGZpZWxkIG9mIGEgcG9saWN5IGNvbnRhaW5lciB3aXRoIHRoZSBpbnB1dCBwcm9jZXNzIGZpZWxkIGZyb20gRXhlY1Byb2Nlc3NSZXF1ZXN0CmFsbG93X3Byb2JlX3Byb2Nlc3MocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19wcm9iZV9wcm9jZXNzOiBzdGFydCIpCgogICAgYWxsb3dfcHJvY2Vzc19jb21tb24ocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpCiAgICBhbGxvd19leGVjX2NhcHMoaV9wcm9jZXNzLkNhcGFiaWxpdGllcykKICAgIHBfcHJvY2Vzcy5UZXJtaW5hbCA9PSBpX3Byb2Nlc3MuVGVybWluYWwKCiAgICBwcmludCgiYWxsb3dfcHJvYmVfcHJvY2VzczogdHJ1ZSIpCn0KCmFsbG93X3VzZXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MpIHsKICAgIHBfdXNlciA6PSBwX3Byb2Nlc3MuVXNlcgogICAgaV91c2VyIDo9IGlfcHJvY2Vzcy5Vc2VyCgogICAgcHJpbnQoImFsbG93X3VzZXI6IGlucHV0IHVpZCA9IiwgaV91c2VyLlVJRCwgInBvbGljeSB1aWQgPSIsIHBfdXNlci5VSUQpCiAgICBwX3VzZXIuVUlEID09IGlfdXNlci5VSUQKCiAgICAjIFRPRE86IHRyYWNrIGRvd24gdGhlIHJlYXNvbiBmb3IgcmVnaXN0cnkuazhzLmlvL3BhdXNlOjMuOSBiZWluZwogICAgIyAgICAgICBleGVjdXRlZCB3aXRoIGdpZCA9IDAgZGVzcGl0ZSBoYXZpbmcgIjY1NTM1OjY1NTM1IiBpbiBpdHMgY29udGFpbmVyIGltYWdlCiAgICAjICAgICAgIGNvbmZpZy4KICAgICNwcmludCgiYWxsb3dfdXNlcjogaW5wdXQgZ2lkID0iLCBpX3VzZXIuR0lELCAicG9saWN5IGdpZCA9IiwgcF91c2VyLkdJRCkKICAgICNwX3VzZXIuR0lEID09IGlfdXNlci5HSUQKCiAgICAjIFRPRE86IGNvbXBhcmUgdGhlIGFkZGl0aW9uYWxHaWRzIGZpZWxkIHRvbyBhZnRlciBjb21wdXRpbmcgaXRzIHZhbHVlCiAgICAjIGJhc2VkIG9uIC9ldGMvcGFzc3dkIGFuZCAvZXRjL2dyb3VwIGZyb20gdGhlIGNvbnRhaW5lciBpbWFnZS4KfQoKYWxsb3dfZGVwcmVjYXRlZF9hcmdzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZ3MgMTogbm8gYXJncyIpCgogICAgbm90IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJncwogICAgbm90IGlfcHJvY2Vzcy5BcmdzCgogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAxOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZ3MocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSkgewogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiBwb2xpY3kgYXJncyA9IiwgcF9wcm9jZXNzLkRlcHJlY2F0ZWRBcmdzKQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiBpbnB1dCBhcmdzID0iLCBpX3Byb2Nlc3MuQXJncykKCiAgICBjb3VudChwX3Byb2Nlc3MuRGVwcmVjYXRlZEFyZ3MpID09IGNvdW50KGlfcHJvY2Vzcy5BcmdzKQoKICAgIGV2ZXJ5IGksIGlfYXJnIGluIGlfcHJvY2Vzcy5BcmdzIHsKICAgICAgICBhbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpCiAgICB9CgogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDE6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgcF9hcmcyIDo9IHJlcGxhY2UocF9hcmcsICIkJCIsICIkIikKICAgIHBfYXJnMiA9PSBpX2FyZwoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAxOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDI6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgIyBUT0RPOiBjYW4gJChub2RlLW5hbWUpIGJlIGhhbmRsZWQgYmV0dGVyPwogICAgY29udGFpbnMocF9hcmcsICIkKG5vZGUtbmFtZSkiKQoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAyOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDM6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgcF9hcmcyIDo9IHJlcGxhY2UocF9hcmcsICIkJCIsICIkIikKICAgIHBfYXJnMyA6PSByZXBsYWNlKHBfYXJnMiwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAzOiBwX2FyZzMgPSIsIHBfYXJnMykKICAgIHBfYXJnMyA9PSBpX2FyZwoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAzOiB0cnVlIikKfQoKIyBPQ0kgcHJvY2Vzcy5FbnYgZmllbGQKYWxsb3dfZW52KHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfZW52OiBwIGVudiA9IiwgcF9wcm9jZXNzLkVudikKICAgIHByaW50KCJhbGxvd19lbnY6IGkgZW52ID0iLCBpX3Byb2Nlc3MuRW52KQoKICAgIGV2ZXJ5IGlfdmFyIGluIGlfcHJvY2Vzcy5FbnYgewogICAgICAgIHByaW50KCJhbGxvd19lbnY6IGlfdmFyID0iLCBpX3ZhcikKICAgICAgICBhbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgfQoKICAgIHByaW50KCJhbGxvd19lbnY6IHRydWUiKQp9CgojIEFsbG93IGlucHV0IGVudiB2YXJpYWJsZXMgdGhhdCBhcmUgcHJlc2VudCBpbiB0aGUgcG9saWN5IGRhdGEgdG9vLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHBfdmFyID09IGlfdmFyCiAgICBwcmludCgiYWxsb3dfdmFyIDE6IHRydWUiKQp9CgojIE1hdGNoIGlucHV0IHdpdGggb25lIG9mIHRoZSBwb2xpY3kgdmFyaWFibGVzLCBhZnRlciBzdWJzdGl0dXRpbmcgJChzYW5kYm94LW5hbWUpLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHByaW50KCJhbGxvd192YXIgMjogcF92YXIgPSIsIHBfdmFyKQoKICAgIHBfdmFyX3NwbGl0IDo9IHNwbGl0KHBfdmFyLCAiPSIpCiAgICBjb3VudChwX3Zhcl9zcGxpdCkgPT0gMgoKICAgIHBfdmFyX3NwbGl0WzFdID09ICIkKHNhbmRib3gtbmFtZSkiCgogICAgaV92YXJfc3BsaXQgOj0gc3BsaXQoaV92YXIsICI9IikKICAgIGNvdW50KGlfdmFyX3NwbGl0KSA9PSAyCgogICAgaV92YXJfc3BsaXRbMF0gPT0gcF92YXJfc3BsaXRbMF0KICAgIHJlZ2V4Lm1hdGNoKHNfbmFtZSwgaV92YXJfc3BsaXRbMV0pCgogICAgcHJpbnQoImFsbG93X3ZhciAyOiB0cnVlIikKfQoKIyBBbGxvdyBpbnB1dCBlbnYgdmFyaWFibGVzIHRoYXQgbWF0Y2ggd2l0aCBhIHJlcXVlc3RfZGVmYXVsdHMgcmVnZXguCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHNvbWUgcF9yZWdleDEgaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5DcmVhdGVDb250YWluZXJSZXF1ZXN0LmFsbG93X2Vudl9yZWdleAogICAgcF9yZWdleDIgOj0gcmVwbGFjZShwX3JlZ2V4MSwgIiQoaXB2NF9hKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcHY0X2EpCiAgICBwX3JlZ2V4MyA6PSByZXBsYWNlKHBfcmVnZXgyLCAiJChpcF9wKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcF9wKQogICAgcF9yZWdleDQgOj0gcmVwbGFjZShwX3JlZ2V4MywgIiQoc3ZjX25hbWUpIiwgcG9saWN5X2RhdGEuY29tbW9uLnN2Y19uYW1lKQogICAgcF9yZWdleDUgOj0gcmVwbGFjZShwX3JlZ2V4NCwgIiQoZG5zX2xhYmVsKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5kbnNfbGFiZWwpCgogICAgcHJpbnQoImFsbG93X3ZhciAzOiBwX3JlZ2V4NSA9IiwgcF9yZWdleDUpCiAgICByZWdleC5tYXRjaChwX3JlZ2V4NSwgaV92YXIpCgogICAgcHJpbnQoImFsbG93X3ZhciAzOiB0cnVlIikKfQoKIyBBbGxvdyBmaWVsZFJlZiAiZmllbGRQYXRoOiBzdGF0dXMucG9kSVAiIHZhbHVlcy4KYWxsb3dfdmFyKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBpX3Zhciwgc19uYW1lLCBzX25hbWVzcGFjZSkgewogICAgbmFtZV92YWx1ZSA6PSBzcGxpdChpX3ZhciwgIj0iKQogICAgY291bnQobmFtZV92YWx1ZSkgPT0gMgogICAgaXNfaXAobmFtZV92YWx1ZVsxXSkKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIGFsbG93X3BvZF9pcF92YXIobmFtZV92YWx1ZVswXSwgcF92YXIpCgogICAgcHJpbnQoImFsbG93X3ZhciA0OiB0cnVlIikKfQoKIyBBbGxvdyBjb21tb24gZmllbGRSZWYgdmFyaWFibGVzLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBuYW1lX3ZhbHVlIDo9IHNwbGl0KGlfdmFyLCAiPSIpCiAgICBjb3VudChuYW1lX3ZhbHVlKSA9PSAyCgogICAgc29tZSBwX3ZhciBpbiBwX3Byb2Nlc3MuRW52CiAgICBwX25hbWVfdmFsdWUgOj0gc3BsaXQocF92YXIsICI9IikKICAgIGNvdW50KHBfbmFtZV92YWx1ZSkgPT0gMgoKICAgIHBfbmFtZV92YWx1ZVswXSA9PSBuYW1lX3ZhbHVlWzBdCgogICAgIyBUT0RPOiBzaG91bGQgdGhlc2UgYmUgaGFuZGxlZCBpbiBhIGRpZmZlcmVudCB3YXk/CiAgICBhbHdheXNfYWxsb3dlZCA6PSBbIiQoaG9zdC1uYW1lKSIsICIkKG5vZGUtbmFtZSkiLCAiJChwb2QtdWlkKSJdCiAgICBzb21lIGFsbG93ZWQgaW4gYWx3YXlzX2FsbG93ZWQKICAgIGNvbnRhaW5zKHBfbmFtZV92YWx1ZVsxXSwgYWxsb3dlZCkKCiAgICBwcmludCgiYWxsb3dfdmFyIDU6IHRydWUiKQp9CgojIEFsbG93IGZpZWxkUmVmICJmaWVsZFBhdGg6IHN0YXR1cy5ob3N0SVAiIHZhbHVlcy4KYWxsb3dfdmFyKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBpX3Zhciwgc19uYW1lLCBzX25hbWVzcGFjZSkgewogICAgbmFtZV92YWx1ZSA6PSBzcGxpdChpX3ZhciwgIj0iKQogICAgY291bnQobmFtZV92YWx1ZSkgPT0gMgogICAgaXNfaXAobmFtZV92YWx1ZVsxXSkKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIGFsbG93X2hvc3RfaXBfdmFyKG5hbWVfdmFsdWVbMF0sIHBfdmFyKQoKICAgIHByaW50KCJhbGxvd192YXIgNjogdHJ1ZSIpCn0KCiMgQWxsb3cgcmVzb3VyY2VGaWVsZFJlZiB2YWx1ZXMgKGUuZy4sICJsaW1pdHMuY3B1IikuCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIG5hbWVfdmFsdWUgOj0gc3BsaXQoaV92YXIsICI9IikKICAgIGNvdW50KG5hbWVfdmFsdWUpID09IDIKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHBfbmFtZV92YWx1ZSA6PSBzcGxpdChwX3ZhciwgIj0iKQogICAgY291bnQocF9uYW1lX3ZhbHVlKSA9PSAyCgogICAgcF9uYW1lX3ZhbHVlWzBdID09IG5hbWVfdmFsdWVbMF0KCiAgICAjIGEgdmFyaWFibGUgd2Ugc2hvdWxkIGJlIHZhbGlkYXRpbmcgdXNpbmcgYSByZWdleCBmcm9tIHNldHRpbmdzCiAgICBwX25hbWVfdmFsdWVbMV0gPT0gIiQodmFsaWRhdGUtZnJvbS1zZXR0aW5ncykiCgogICAgcmVnZXhfdmFsIDo9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuQ3JlYXRlQ29udGFpbmVyUmVxdWVzdC5hbGxvd19lbnZfcmVnZXhfbWFwW25hbWVfdmFsdWVbMF1dCgogICAgcHJpbnQoImFsbG93X3ZhciA3OiB2YWwgPSIsIG5hbWVfdmFsdWVbMV0pCiAgICBwcmludCgiYWxsb3dfdmFyIDc6IHJlZ2V4X3ZhbCA9IiwgcmVnZXhfdmFsKQoKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4X3ZhbCwgbmFtZV92YWx1ZVsxXSkKCiAgICBwcmludCgiYWxsb3dfdmFyIDc6IHRydWUiKQp9CgojIE1hdGNoIGlucHV0IHdpdGggb25lIG9mIHRoZSBwb2xpY3kgdmFyaWFibGVzLCBhZnRlciBzdWJzdGl0dXRpbmcgJChzYW5kYm94LW5hbWVzcGFjZSkuCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHNvbWUgcF92YXIgaW4gcF9wcm9jZXNzLkVudgogICAgcF92YXIyIDo9IHJlcGxhY2UocF92YXIsICIkKHNhbmRib3gtbmFtZXNwYWNlKSIsIHNfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd192YXIgODogcF92YXIyID0iLCBwX3ZhcjIpCiAgICBwX3ZhcjIgPT0gaV92YXIKCiAgICBwcmludCgiYWxsb3dfdmFyIDg6IHRydWUiKQp9CgphbGxvd19wb2RfaXBfdmFyKHZhcl9uYW1lLCBwX3ZhcikgewogICAgcHJpbnQoImFsbG93X3BvZF9pcF92YXI6IHZhcl9uYW1lID0iLCB2YXJfbmFtZSwgInBfdmFyID0iLCBwX3ZhcikKCiAgICBwX25hbWVfdmFsdWUgOj0gc3BsaXQocF92YXIsICI9IikKICAgIGNvdW50KHBfbmFtZV92YWx1ZSkgPT0gMgoKICAgIHBfbmFtZV92YWx1ZVswXSA9PSB2YXJfbmFtZQogICAgcF9uYW1lX3ZhbHVlWzFdID09ICIkKHBvZC1pcCkiCgogICAgcHJpbnQoImFsbG93X3BvZF9pcF92YXI6IHRydWUiKQp9CgphbGxvd19ob3N0X2lwX3Zhcih2YXJfbmFtZSwgcF92YXIpIHsKICAgIHByaW50KCJhbGxvd19ob3N0X2lwX3ZhcjogdmFyX25hbWUgPSIsIHZhcl9uYW1lLCAicF92YXIgPSIsIHBfdmFyKQoKICAgIHBfbmFtZV92YWx1ZSA6PSBzcGxpdChwX3ZhciwgIj0iKQogICAgY291bnQocF9uYW1lX3ZhbHVlKSA9PSAyCgogICAgcF9uYW1lX3ZhbHVlWzBdID09IHZhcl9uYW1lCiAgICBwX25hbWVfdmFsdWVbMV0gPT0gIiQoaG9zdC1pcCkiCgogICAgcHJpbnQoImFsbG93X2hvc3RfaXBfdmFyOiB0cnVlIikKfQoKaXNfaXAodmFsdWUpIHsKICAgIGJ5dGVzID0gc3BsaXQodmFsdWUsICIuIikKICAgIGNvdW50KGJ5dGVzKSA9PSA0CgogICAgaXNfaXBfZmlyc3RfYnl0ZShieXRlc1swXSkKICAgIGlzX2lwX290aGVyX2J5dGUoYnl0ZXNbMV0pCiAgICBpc19pcF9vdGhlcl9ieXRlKGJ5dGVzWzJdKQogICAgaXNfaXBfb3RoZXJfYnl0ZShieXRlc1szXSkKfQppc19pcF9maXJzdF9ieXRlKGNvbXBvbmVudCkgewogICAgbnVtYmVyID0gdG9fbnVtYmVyKGNvbXBvbmVudCkKICAgIG51bWJlciA+PSAxCiAgICBudW1iZXIgPD0gMjU1Cn0KaXNfaXBfb3RoZXJfYnl0ZShjb21wb25lbnQpIHsKICAgIG51bWJlciA9IHRvX251bWJlcihjb21wb25lbnQpCiAgICBudW1iZXIgPj0gMAogICAgbnVtYmVyIDw9IDI1NQp9CgojIE9DSSByb290LlBhdGgKYWxsb3dfcm9vdF9wYXRoKHBfb2NpLCBpX29jaSwgYnVuZGxlX2lkKSB7CiAgICBpX3BhdGggOj0gaV9vY2kuUm9vdC5QYXRoCiAgICBwX3BhdGgxIDo9IHBfb2NpLlJvb3QuUGF0aAogICAgcHJpbnQoImFsbG93X3Jvb3RfcGF0aDogaV9wYXRoID0iLCBpX3BhdGgsICJwX3BhdGgxID0iLCBwX3BhdGgxKQoKICAgIHBfcGF0aDIgOj0gcmVwbGFjZShwX3BhdGgxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfcm9vdF9wYXRoOiBwX3BhdGgyID0iLCBwX3BhdGgyKQoKICAgIHBfcGF0aDMgOj0gcmVwbGFjZShwX3BhdGgyLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X3Jvb3RfcGF0aDogcF9wYXRoMyA9IiwgcF9wYXRoMykKCiAgICBwX3BhdGgzID09IGlfcGF0aAoKICAgIHByaW50KCJhbGxvd19yb290X3BhdGg6IHRydWUiKQp9CgojIGRldmljZSBtb3VudHMKYWxsb3dfbW91bnQocF9vY2ksIGlfbW91bnQsIGlfc3RvcmFnZXMsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcHJpbnQoImFsbG93X21vdW50OiBpX21vdW50ID0iLCBpX21vdW50KQoKICAgIHNvbWUgcF9tb3VudCBpbiBwX29jaS5Nb3VudHMKICAgIHNvbWUgaV9zdG9yYWdlIGluIGlfc3RvcmFnZXMKCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IHBfbW91bnQgPSIsIHBfbW91bnQpCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IGlfc3RvcmFnZSA9IiwgaV9zdG9yYWdlKQoKICAgIGNoZWNrX21vdW50KHBfbW91bnQsIGlfbW91bnQsIGlfc3RvcmFnZSwgYnVuZGxlX2lkLCBzYW5kYm94X2lkKQoKICAgICMgVE9ETzogYXJlIHRoZXJlIGFueSBvdGhlciByZXF1aXJlZCBwb2xpY3kgY2hlY2tzIGZvciBtb3VudHMgLSBlLmcuLAogICAgIyAgICAgICBtdWx0aXBsZSBtb3VudHMgd2l0aCBzYW1lIHNvdXJjZSBvciBkZXN0aW5hdGlvbj8KCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IHRydWUiKQp9CgpjaGVja19tb3VudChwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcF9tb3VudCA9PSBpX21vdW50CiAgICBwcmludCgiY2hlY2tfbW91bnQgMTogdHJ1ZSIpCn0KY2hlY2tfbW91bnQocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHBfbW91bnQuZGVzdGluYXRpb24gPT0gaV9tb3VudC5kZXN0aW5hdGlvbgogICAgcF9tb3VudC50eXBlXyA9PSBpX21vdW50LnR5cGVfCiAgICBwX21vdW50Lm9wdGlvbnMgPT0gaV9tb3VudC5vcHRpb25zCgogICAgbW91bnRfc291cmNlX2FsbG93cyhwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkKCiAgICBwcmludCgiY2hlY2tfbW91bnQgMjogdHJ1ZSIpCn0KCm1vdW50X3NvdXJjZV9hbGxvd3MocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHJlZ2V4MSA6PSBwX21vdW50LnNvdXJjZQogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5tb3VudF9zb3VyY2VfY3BhdGgpCiAgICByZWdleDQgOj0gcmVwbGFjZShyZWdleDMsICIkKGJ1bmRsZS1pZCkiLCBidW5kbGVfaWQpCgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMTogcmVnZXg0ID0iLCByZWdleDQpCiAgICByZWdleC5tYXRjaChyZWdleDQsIGlfbW91bnQuc291cmNlKQoKICAgIHByaW50KCJtb3VudF9zb3VyY2VfYWxsb3dzIDE6IHRydWUiKQp9Cm1vdW50X3NvdXJjZV9hbGxvd3MocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHJlZ2V4MSA6PSBwX21vdW50LnNvdXJjZQogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5tb3VudF9zb3VyY2VfY3BhdGgpCiAgICByZWdleDQgOj0gcmVwbGFjZShyZWdleDMsICIkKHNhbmRib3gtaWQpIiwgc2FuZGJveF9pZCkKCiAgICBwcmludCgibW91bnRfc291cmNlX2FsbG93cyAyOiByZWdleDQgPSIsIHJlZ2V4NCkKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4NCwgaV9tb3VudC5zb3VyY2UpCgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMjogdHJ1ZSIpCn0KbW91bnRfc291cmNlX2FsbG93cyhwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogaV9tb3VudC5zb3VyY2UgPSIsIGlfbW91bnQuc291cmNlKQogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogaV9zdG9yYWdlLm1vdW50X3BvaW50ID0iLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCgogICAgaV9tb3VudC5zb3VyY2UgPT0gaV9zdG9yYWdlLm1vdW50X3BvaW50CgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogdHJ1ZSIpCn0KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBDcmVhdGUgY29udGFpbmVyIFN0b3JhZ2VzCgphbGxvd19zdG9yYWdlcyhwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHBfY291bnQgOj0gY291bnQocF9zdG9yYWdlcykKICAgIGlfY291bnQgOj0gY291bnQoaV9zdG9yYWdlcykKICAgIHByaW50KCJhbGxvd19zdG9yYWdlczogcF9jb3VudCA9IiwgcF9jb3VudCwgImlfY291bnQgPSIsIGlfY291bnQpCgogICAgcF9jb3VudCA9PSBpX2NvdW50CgogICAgIyBHZXQgdGhlIGNvbnRhaW5lciBpbWFnZSBsYXllciBJRHMgYW5kIHZlcml0eSByb290IGhhc2hlcywgZnJvbSB0aGUgIm92ZXJsYXlmcyIgc3RvcmFnZS4KICAgIHNvbWUgb3ZlcmxheV9zdG9yYWdlIGluIHBfc3RvcmFnZXMKICAgIG92ZXJsYXlfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIHByaW50KCJhbGxvd19zdG9yYWdlczogb3ZlcmxheV9zdG9yYWdlID0iLCBvdmVybGF5X3N0b3JhZ2UpCiAgICBjb3VudChvdmVybGF5X3N0b3JhZ2Uub3B0aW9ucykgPT0gMgoKICAgIGxheWVyX2lkcyA6PSBzcGxpdChvdmVybGF5X3N0b3JhZ2Uub3B0aW9uc1swXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiBsYXllcl9pZHMgPSIsIGxheWVyX2lkcykKCiAgICByb290X2hhc2hlcyA6PSBzcGxpdChvdmVybGF5X3N0b3JhZ2Uub3B0aW9uc1sxXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiByb290X2hhc2hlcyA9Iiwgcm9vdF9oYXNoZXMpCgogICAgZXZlcnkgaV9zdG9yYWdlIGluIGlfc3RvcmFnZXMgewogICAgICAgIGFsbG93X3N0b3JhZ2UocF9zdG9yYWdlcywgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpCiAgICB9CgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiB0cnVlIikKfQoKYWxsb3dfc3RvcmFnZShwX3N0b3JhZ2VzLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgc29tZSBwX3N0b3JhZ2UgaW4gcF9zdG9yYWdlcwoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiBwX3N0b3JhZ2UgPSIsIHBfc3RvcmFnZSkKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiBpX3N0b3JhZ2UgPSIsIGlfc3RvcmFnZSkKCiAgICBwX3N0b3JhZ2UuZHJpdmVyICAgICAgICAgICA9PSBpX3N0b3JhZ2UuZHJpdmVyCiAgICBwX3N0b3JhZ2UuZHJpdmVyX29wdGlvbnMgICA9PSBpX3N0b3JhZ2UuZHJpdmVyX29wdGlvbnMKICAgIHBfc3RvcmFnZS5mc19ncm91cCAgICAgICAgID09IGlfc3RvcmFnZS5mc19ncm91cAogICAgcF9zdG9yYWdlLmZzdHlwZSAgICAgICAgICAgPT0gaV9zdG9yYWdlLmZzdHlwZQoKICAgIGFsbG93X3N0b3JhZ2Vfc291cmNlKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKQogICAgYWxsb3dfc3RvcmFnZV9vcHRpb25zKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKQogICAgYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKQoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiB0cnVlIikKfQoKYWxsb3dfc3RvcmFnZV9zb3VyY2UocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX3NvdXJjZSAxOiBzdGFydCIpCgogICAgcF9zdG9yYWdlLnNvdXJjZSA9PSBpX3N0b3JhZ2Uuc291cmNlCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDE6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX3NvdXJjZShwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDI6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCgogICAgIyBEREREOkJCOkRELkY6IERvbWFpbjpCdXM6RGV2aWNlLkZ1bmN0aW9uCiAgICAjIGh0dHBzOi8vd3d3Lmtlcm5lbC5vcmcvZG9jL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtYnVzLXBjaQogICAgcmVnZXgubWF0Y2goYF5bYS1mMC05XXs0fTpbYS1mMC05XXsyfTpbYS1mMC05XXsyfVwuW2EtZjAtOV0kYCwgaV9zdG9yYWdlLnNvdXJjZSkKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9zb3VyY2UgMjogdHJ1ZSIpCn0KCmFsbG93X3N0b3JhZ2Vfc291cmNlKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKSB7CiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9zb3VyY2UgMzogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIGlfc3RvcmFnZS5zb3VyY2UgPT0gIm5vbmUiCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDM6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX3NvdXJjZShwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDQ6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJzbWIiCgogICAgIyBQYXR0ZXJuOiAvLzxzdG9yYWdlLWFjY291bnQtbmFtZT4uZmlsZS5jb3JlLndpbmRvd3MubmV0LzxrOHMtUFZDLW5hbWU+CiAgICAjIFN0b3JhZ2UgYWNjb3VudCBuYW1lOiBodHRwczovL2xlYXJuLm1pY3Jvc29mdC5jb20vZW4tdXMvYXp1cmUvc3RvcmFnZS9jb21tb24vc3RvcmFnZS1hY2NvdW50LW92ZXJ2aWV3I3N0b3JhZ2UtYWNjb3VudC1uYW1lCiAgICAjIEs4cyBQVkMgbmFtZTogaHR0cHM6Ly9rdWJlcm5ldGVzLmlvL2RvY3MvY29uY2VwdHMvb3ZlcnZpZXcvd29ya2luZy13aXRoLW9iamVjdHMvbmFtZXMvI2Rucy1zdWJkb21haW4tbmFtZXMKICAgIHJlZ2V4Lm1hdGNoKGBeXC9cLyhbYS16MC05XXszLDI0fSlcLmZpbGVcLmNvcmVcLndpbmRvd3NcLm5ldFwvW2EtejAtOV0oW2EtejAtOS4tXXswLDI1MX1bYS16MC05XSk/JGAsIGlfc3RvcmFnZS5zb3VyY2UpCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDQ6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMTogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgIT0gIm92ZXJsYXlmcyIKICAgIHBfc3RvcmFnZS5vcHRpb25zID09IGlfc3RvcmFnZS5vcHRpb25zCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAxOiB0cnVlIikKfQphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIGNvdW50KHBfc3RvcmFnZS5vcHRpb25zKSA9PSAyCgogICAgcG9saWN5X2lkcyA6PSBzcGxpdChwX3N0b3JhZ2Uub3B0aW9uc1swXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBwb2xpY3lfaWRzID0iLCBwb2xpY3lfaWRzKQogICAgcG9saWN5X2lkcyA9PSBsYXllcl9pZHMKCiAgICBwb2xpY3lfaGFzaGVzIDo9IHNwbGl0KHBfc3RvcmFnZS5vcHRpb25zWzFdLCAiOiIpCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IHBvbGljeV9oYXNoZXMgPSIsIHBvbGljeV9oYXNoZXMpCgogICAgcF9jb3VudCA6PSBjb3VudChwb2xpY3lfaWRzKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBwX2NvdW50ID0iLCBwX2NvdW50KQogICAgcF9jb3VudCA+PSAxCiAgICBwX2NvdW50ID09IGNvdW50KHBvbGljeV9oYXNoZXMpCgogICAgaV9jb3VudCA6PSBjb3VudChpX3N0b3JhZ2Uub3B0aW9ucykKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogaV9jb3VudCA9IiwgaV9jb3VudCkKICAgIGlfY291bnQgPT0gcF9jb3VudCArIDMKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zWzBdID0iLCBpX3N0b3JhZ2Uub3B0aW9uc1swXSkKICAgIGlfc3RvcmFnZS5vcHRpb25zWzBdID09ICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQubGF5ZXItc3JjLXByZWZpeD0vdmFyL2xpYi9jb250YWluZXJkL2lvLmNvbnRhaW5lcmQuc25hcHNob3R0ZXIudjEudGFyZGV2L2xheWVycyIKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zW2lfY291bnQgLSAyXSA9IiwgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDJdKQogICAgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDJdID09ICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQub3ZlcmxheS1ydyIKCiAgICBsb3dlcmRpciA6PSBjb25jYXQoIj0iLCBbImxvd2VyZGlyIiwgcF9zdG9yYWdlLm9wdGlvbnNbMF1dKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBsb3dlcmRpciA9IiwgbG93ZXJkaXIpCgogICAgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDFdID09IGxvd2VyZGlyCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zW2lfY291bnQgLSAxXSA9IiwgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDFdKQoKICAgIGV2ZXJ5IGksIHBvbGljeV9pZCBpbiBwb2xpY3lfaWRzIHsKICAgICAgICBhbGxvd19vdmVybGF5X2xheWVyKHBvbGljeV9pZCwgcG9saWN5X2hhc2hlc1tpXSwgaV9zdG9yYWdlLm9wdGlvbnNbaSArIDFdKQogICAgfQoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogdHJ1ZSIpCn0KYWxsb3dfc3RvcmFnZV9vcHRpb25zKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKSB7CiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDM6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCiAgICBjb3VudChwX3N0b3JhZ2Uub3B0aW9ucykgPT0gMQoKICAgIHN0YXJ0c3dpdGgocF9zdG9yYWdlLm9wdGlvbnNbMF0sICIkKGhhc2giKQogICAgaGFzaF9zdWZmaXggOj0gdHJpbV9sZWZ0KHBfc3RvcmFnZS5vcHRpb25zWzBdLCAiJChoYXNoIikKCiAgICBlbmRzd2l0aChoYXNoX3N1ZmZpeCwgIikiKQogICAgaGFzaF9pbmRleCA6PSB0cmltX3JpZ2h0KGhhc2hfc3VmZml4LCAiKSIpCiAgICBpIDo9IHRvX251bWJlcihoYXNoX2luZGV4KQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAzOiBpID0iLCBpKQoKICAgIGhhc2hfb3B0aW9uIDo9IGNvbmNhdCgiPSIsIFsiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LnJvb3QtaGFzaCIsIHJvb3RfaGFzaGVzW2ldXSkKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMzogaGFzaF9vcHRpb24gPSIsIGhhc2hfb3B0aW9uKQoKICAgIGNvdW50KGlfc3RvcmFnZS5vcHRpb25zKSA9PSA0CiAgICBpX3N0b3JhZ2Uub3B0aW9uc1swXSA9PSAicm8iCiAgICBpX3N0b3JhZ2Uub3B0aW9uc1sxXSA9PSAiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmJsb2NrX2RldmljZT1maWxlIgogICAgaV9zdG9yYWdlLm9wdGlvbnNbMl0gPT0gImlvLmthdGFjb250YWluZXJzLmZzLW9wdC5pcy1sYXllciIKICAgIGlfc3RvcmFnZS5vcHRpb25zWzNdID09IGhhc2hfb3B0aW9uCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAzOiB0cnVlIikKfQphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgNDogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gInNtYiIKICAgIHBfb3B0c19jb3VudCA6PSBjb3VudChwX3N0b3JhZ2Uub3B0aW9ucykKICAgIGlfb3B0c19jb3VudCA6PSBjb3VudChpX3N0b3JhZ2Uub3B0aW9ucykKICAgIGlfb3B0c19jb3VudCA9PSBwX29wdHNfY291bnQgKyAyCgogICAgaV9vcHRfbWF0Y2hlcyA6PSBbaSB8IGkgOj0gaWR4OyBpZHggPCBwX29wdHNfY291bnQ7IHBfc3RvcmFnZS5vcHRpb25zW2lkeF0gPT0gaV9zdG9yYWdlLm9wdGlvbnNbaWR4XV0KICAgIGNvdW50KGlfb3B0X21hdGNoZXMpID09IHBfb3B0c19jb3VudAoKICAgIHN0YXJ0c3dpdGgoaV9zdG9yYWdlLm9wdGlvbnNbaV9vcHRzX2NvdW50LTJdLCAiYWRkcj0iKQogICAgY3JlZHMgPSBzcGxpdChpX3N0b3JhZ2Uub3B0aW9uc1tpX29wdHNfY291bnQtMV0sICIsIikKICAgIGNvdW50KGNyZWRzKSA9PSAyCiAgICBzdGFydHN3aXRoKGNyZWRzWzBdLCAidXNlcm5hbWU9IikKICAgIHN0YXJ0c3dpdGgoY3JlZHNbMV0sICJwYXNzd29yZD0iKQogICAgCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDQ6IHRydWUiKQp9CgphbGxvd19vdmVybGF5X2xheWVyKHBvbGljeV9pZCwgcG9saWN5X2hhc2gsIGlfb3B0aW9uKSB7CiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogcG9saWN5X2lkID0iLCBwb2xpY3lfaWQsICJwb2xpY3lfaGFzaCA9IiwgcG9saWN5X2hhc2gpCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogaV9vcHRpb24gPSIsIGlfb3B0aW9uKQoKICAgIHN0YXJ0c3dpdGgoaV9vcHRpb24sICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQubGF5ZXI9IikKICAgIGlfdmFsdWUgOj0gcmVwbGFjZShpX29wdGlvbiwgImlvLmthdGFjb250YWluZXJzLmZzLW9wdC5sYXllcj0iLCAiIikKICAgIGlfdmFsdWVfZGVjb2RlZCA6PSBiYXNlNjQuZGVjb2RlKGlfdmFsdWUpCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogaV92YWx1ZV9kZWNvZGVkID0iLCBpX3ZhbHVlX2RlY29kZWQpCgogICAgcG9saWN5X3N1ZmZpeCA6PSBjb25jYXQoIj0iLCBbInRhcixybyxpby5rYXRhY29udGFpbmVycy5mcy1vcHQuYmxvY2tfZGV2aWNlPWZpbGUsaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmlzLWxheWVyLGlvLmthdGFjb250YWluZXJzLmZzLW9wdC5yb290LWhhc2giLCBwb2xpY3lfaGFzaF0pCiAgICBwX3ZhbHVlIDo9IGNvbmNhdCgiLCIsIFtwb2xpY3lfaWQsIHBvbGljeV9zdWZmaXhdKQogICAgcHJpbnQoImFsbG93X292ZXJsYXlfbGF5ZXI6IHBfdmFsdWUgPSIsIHBfdmFsdWUpCgogICAgcF92YWx1ZSA9PSBpX3ZhbHVlX2RlY29kZWQKCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogdHJ1ZSIpCn0KCmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAidGFyIgoKICAgIHN0YXJ0c3dpdGgocF9zdG9yYWdlLm1vdW50X3BvaW50LCAiJChsYXllciIpCiAgICBtb3VudF9zdWZmaXggOj0gdHJpbV9sZWZ0KHBfc3RvcmFnZS5tb3VudF9wb2ludCwgIiQobGF5ZXIiKQoKICAgIGVuZHN3aXRoKG1vdW50X3N1ZmZpeCwgIikiKQogICAgbGF5ZXJfaW5kZXggOj0gdHJpbV9yaWdodChtb3VudF9zdWZmaXgsICIpIikKICAgIGkgOj0gdG9fbnVtYmVyKGxheWVyX2luZGV4KQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDE6IGkgPSIsIGkpCgogICAgbGF5ZXJfaWQgOj0gbGF5ZXJfaWRzW2ldCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMTogbGF5ZXJfaWQgPSIsIGxheWVyX2lkKQoKICAgIHBfbW91bnQgOj0gY29uY2F0KCIvIiwgWyIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L2xheWVycyIsIGxheWVyX2lkXSkKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCAxOiBwX21vdW50ID0iLCBwX21vdW50KQoKICAgIHBfbW91bnQgPT0gaV9zdG9yYWdlLm1vdW50X3BvaW50CgogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDE6IHRydWUiKQp9CmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAiZnVzZTMua2F0YS1vdmVybGF5IgoKICAgIG1vdW50MSA6PSByZXBsYWNlKHBfc3RvcmFnZS5tb3VudF9wb2ludCwgIiQoY3BhdGgpIiwgcG9saWN5X2RhdGEuY29tbW9uLmNwYXRoKQogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDI6IG1vdW50MiA9IiwgbW91bnQyKQoKICAgIG1vdW50MiA9PSBpX3N0b3JhZ2UubW91bnRfcG9pbnQKCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMjogdHJ1ZSIpCn0KYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKSB7CiAgICBwX3N0b3JhZ2UuZnN0eXBlID09ICJsb2NhbCIKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQyID0iLCBtb3VudDIpCgogICAgbW91bnQzIDo9IHJlcGxhY2UobW91bnQyLCAiJChzYW5kYm94LWlkKSIsIHNhbmRib3hfaWQpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQzID0iLCBtb3VudDMpCgogICAgcmVnZXgubWF0Y2gobW91bnQzLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCgogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDM6IHRydWUiKQp9CmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAiYmluZCIKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNDogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNDogbW91bnQyID0iLCBtb3VudDIpCgogICAgbW91bnQzIDo9IHJlcGxhY2UobW91bnQyLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDQ6IG1vdW50MyA9IiwgbW91bnQzKQoKICAgIHJlZ2V4Lm1hdGNoKG1vdW50MywgaV9zdG9yYWdlLm1vdW50X3BvaW50KQoKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA0OiB0cnVlIikKfQphbGxvd19tb3VudF9wb2ludChwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgYnVuZGxlX2lkLCBzYW5kYm94X2lkLCBsYXllcl9pZHMpIHsKICAgIHBfc3RvcmFnZS5mc3R5cGUgPT0gInRtcGZzIgoKICAgIG1vdW50MSA6PSBwX3N0b3JhZ2UubW91bnRfcG9pbnQKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA1OiBtb3VudDEgPSIsIG1vdW50MSkKCiAgICByZWdleC5tYXRjaChtb3VudDEsIGlfc3RvcmFnZS5tb3VudF9wb2ludCkKCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNTogdHJ1ZSIpCn0KYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKSB7CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogaV9zdG9yYWdlLm1vdW50X3BvaW50ID0iLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCiAgICBhbGxvd19kaXJlY3Rfdm9sX2RyaXZlcihwX3N0b3JhZ2UsIGlfc3RvcmFnZSkKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChzcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQyID0iLCBtb3VudDIpCgogICAgZGlyZWN0X3ZvbF9wYXRoIDo9IGlfc3RvcmFnZS5zb3VyY2UKICAgIG1vdW50MyA6PSByZXBsYWNlKG1vdW50MiwgIiQoYjY0LWRpcmVjdC12b2wtcGF0aCkiLCBiYXNlNjR1cmwuZW5jb2RlKGRpcmVjdF92b2xfcGF0aCkpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQzID0iLCBtb3VudDMpCgogICAgbW91bnQzID09IGlfc3RvcmFnZS5tb3VudF9wb2ludAoKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA2OiB0cnVlIikKfQoKYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIocF9zdG9yYWdlLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19kaXJlY3Rfdm9sX2RyaXZlciAxOiBzdGFydCIpCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCiAgICBwcmludCgiYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIgMTogdHJ1ZSIpCn0KYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIocF9zdG9yYWdlLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19kaXJlY3Rfdm9sX2RyaXZlciAyOiBzdGFydCIpCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJzbWIiCiAgICBwcmludCgiYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIgMjogdHJ1ZSIpCn0KCiMgRXhlY1Byb2Nlc3NSZXF1ZXN0LnByb2Nlc3MuQ2FwYWJpbGl0aWVzCmFsbG93X2V4ZWNfY2FwcyhpX2NhcHMpIHsKICAgIG5vdCBpX2NhcHMuQW1iaWVudAogICAgbm90IGlfY2Fwcy5Cb3VuZGluZwogICAgbm90IGlfY2Fwcy5FZmZlY3RpdmUKICAgIG5vdCBpX2NhcHMuSW5oZXJpdGFibGUKICAgIG5vdCBpX2NhcHMuUGVybWl0dGVkCn0KCiMgT0NJLlByb2Nlc3MuQ2FwYWJpbGl0aWVzCmFsbG93X2NhcHMocF9jYXBzLCBpX2NhcHMpIHsKICAgIHByaW50KCJhbGxvd19jYXBzOiBwb2xpY3kgQW1iaWVudCA9IiwgcF9jYXBzLkFtYmllbnQpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgQW1iaWVudCA9IiwgaV9jYXBzLkFtYmllbnQpCiAgICBtYXRjaF9jYXBzKHBfY2Fwcy5BbWJpZW50LCBpX2NhcHMuQW1iaWVudCkKCiAgICBwcmludCgiYWxsb3dfY2FwczogcG9saWN5IEJvdW5kaW5nID0iLCBwX2NhcHMuQm91bmRpbmcpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgQm91bmRpbmcgPSIsIGlfY2Fwcy5Cb3VuZGluZykKICAgIG1hdGNoX2NhcHMocF9jYXBzLkJvdW5kaW5nLCBpX2NhcHMuQm91bmRpbmcpCgogICAgcHJpbnQoImFsbG93X2NhcHM6IHBvbGljeSBFZmZlY3RpdmUgPSIsIHBfY2Fwcy5FZmZlY3RpdmUpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgRWZmZWN0aXZlID0iLCBpX2NhcHMuRWZmZWN0aXZlKQogICAgbWF0Y2hfY2FwcyhwX2NhcHMuRWZmZWN0aXZlLCBpX2NhcHMuRWZmZWN0aXZlKQoKICAgIHByaW50KCJhbGxvd19jYXBzOiBwb2xpY3kgSW5oZXJpdGFibGUgPSIsIHBfY2Fwcy5Jbmhlcml0YWJsZSkKICAgIHByaW50KCJhbGxvd19jYXBzOiBpbnB1dCBJbmhlcml0YWJsZSA9IiwgaV9jYXBzLkluaGVyaXRhYmxlKQogICAgbWF0Y2hfY2FwcyhwX2NhcHMuSW5oZXJpdGFibGUsIGlfY2Fwcy5Jbmhlcml0YWJsZSkKCiAgICBwcmludCgiYWxsb3dfY2FwczogcG9saWN5IFBlcm1pdHRlZCA9IiwgcF9jYXBzLlBlcm1pdHRlZCkKICAgIHByaW50KCJhbGxvd19jYXBzOiBpbnB1dCBQZXJtaXR0ZWQgPSIsIGlfY2Fwcy5QZXJtaXR0ZWQpCiAgICBtYXRjaF9jYXBzKHBfY2Fwcy5QZXJtaXR0ZWQsIGlfY2Fwcy5QZXJtaXR0ZWQpCn0KCm1hdGNoX2NhcHMocF9jYXBzLCBpX2NhcHMpIHsKICAgIHByaW50KCJtYXRjaF9jYXBzIDE6IHN0YXJ0IikKCiAgICBwX2NhcHMgPT0gaV9jYXBzCgogICAgcHJpbnQoIm1hdGNoX2NhcHMgMTogdHJ1ZSIpCn0KbWF0Y2hfY2FwcyhwX2NhcHMsIGlfY2FwcykgewogICAgcHJpbnQoIm1hdGNoX2NhcHMgMjogc3RhcnQiKQoKICAgIGNvdW50KHBfY2FwcykgPT0gMQogICAgcF9jYXBzWzBdID09ICIkKGRlZmF1bHRfY2FwcykiCgogICAgcHJpbnQoIm1hdGNoX2NhcHMgMjogZGVmYXVsdF9jYXBzID0iLCBwb2xpY3lfZGF0YS5jb21tb24uZGVmYXVsdF9jYXBzKQogICAgcG9saWN5X2RhdGEuY29tbW9uLmRlZmF1bHRfY2FwcyA9PSBpX2NhcHMKCiAgICBwcmludCgibWF0Y2hfY2FwcyAyOiB0cnVlIikKfQptYXRjaF9jYXBzKHBfY2FwcywgaV9jYXBzKSB7CiAgICBwcmludCgibWF0Y2hfY2FwcyAzOiBzdGFydCIpCgogICAgY291bnQocF9jYXBzKSA9PSAxCiAgICBwX2NhcHNbMF0gPT0gIiQocHJpdmlsZWdlZF9jYXBzKSIKCiAgICBwcmludCgibWF0Y2hfY2FwcyAzOiBwcml2aWxlZ2VkX2NhcHMgPSIsIHBvbGljeV9kYXRhLmNvbW1vbi5wcml2aWxlZ2VkX2NhcHMpCiAgICBwb2xpY3lfZGF0YS5jb21tb24ucHJpdmlsZWdlZF9jYXBzID09IGlfY2FwcwoKICAgIHByaW50KCJtYXRjaF9jYXBzIDM6IHRydWUiKQp9CgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgpjaGVja19kaXJlY3RvcnlfdHJhdmVyc2FsKGlfcGF0aCkgewogICAgbm90IHJlZ2V4Lm1hdGNoKCIoXnwvKS4uKCR8LykiLCBpX3BhdGgpCn0KCmNoZWNrX3N5bWxpbmtfc291cmNlKGlfc3JjKSB7CiAgICBpX3NyYyA9PSAiIgogICAgcHJpbnQoImNoZWNrX3N5bWxpbmtfc291cmNlIDE6IHRydWUiKQp9CmNoZWNrX3N5bWxpbmtfc291cmNlKGlfc3JjKSB7CiAgICBpX3NyYyAhPSAiIgogICAgcHJpbnQoImNoZWNrX3N5bWxpbmtfc291cmNlIDI6IGlfc3JjID0iLCBpX3NyYykKCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24uc19zb3VyY2UxLCBpX3NyYykKCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMjogdHJ1ZSIpCn0KY2hlY2tfc3ltbGlua19zb3VyY2UoaV9zcmMpIHsKICAgIGlfc3JjICE9ICIiCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMzogaV9zcmMgPSIsIGlfc3JjKQoKICAgIHJlZ2V4Lm1hdGNoKHBvbGljeV9kYXRhLmNvbW1vbi5zX3NvdXJjZTIsIGlfc3JjKQogICAgY2hlY2tfZGlyZWN0b3J5X3RyYXZlcnNhbChpX3NyYykKCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMzogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfc3RvcmFnZXMoaV9zdG9yYWdlcykgewogICAgcHJpbnQoImFsbG93X3NhbmRib3hfc3RvcmFnZXM6IGlfc3RvcmFnZXMgPSIsIGlfc3RvcmFnZXMpCgogICAgcF9zdG9yYWdlcyA6PSBwb2xpY3lfZGF0YS5zYW5kYm94LnN0b3JhZ2VzCiAgICBldmVyeSBpX3N0b3JhZ2UgaW4gaV9zdG9yYWdlcyB7CiAgICAgICAgYWxsb3dfc2FuZGJveF9zdG9yYWdlKHBfc3RvcmFnZXMsIGlfc3RvcmFnZSkKICAgIH0KCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9zdG9yYWdlczogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfc3RvcmFnZShwX3N0b3JhZ2VzLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IGlfc3RvcmFnZSA9IiwgaV9zdG9yYWdlKQoKICAgIHNvbWUgcF9zdG9yYWdlIGluIHBfc3RvcmFnZXMKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IHBfc3RvcmFnZSA9IiwgcF9zdG9yYWdlKQogICAgaV9zdG9yYWdlID09IHBfc3RvcmFnZQoKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IHRydWUiKQp9CgpDb3B5RmlsZVJlcXVlc3QgewogICAgcHJpbnQoIkNvcHlGaWxlUmVxdWVzdDogaW5wdXQucGF0aCA9IiwgaW5wdXQucGF0aCkKCiAgICBjaGVja19zeW1saW5rX3NvdXJjZShpbnB1dC5zeW1saW5rX3NyYykKICAgIGNoZWNrX2RpcmVjdG9yeV90cmF2ZXJzYWwoaW5wdXQucGF0aCkKCiAgICBzb21lIHJlZ2V4MSBpbiBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLkNvcHlGaWxlUmVxdWVzdAogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5jcGF0aCkKICAgIHJlZ2V4NCA6PSByZXBsYWNlKHJlZ2V4MywgIiQoYnVuZGxlLWlkKSIsIEJVTkRMRV9JRCkKICAgIHByaW50KCJDb3B5RmlsZVJlcXVlc3Q6IHJlZ2V4NCA9IiwgcmVnZXg0KQoKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4NCwgaW5wdXQucGF0aCkKCiAgICBwcmludCgiQ29weUZpbGVSZXF1ZXN0OiB0cnVlIikKfQoKQ3JlYXRlU2FuZGJveFJlcXVlc3QgewogICAgcHJpbnQoIkNyZWF0ZVNhbmRib3hSZXF1ZXN0OiBpbnB1dC5ndWVzdF9ob29rX3BhdGggPSIsIGlucHV0Lmd1ZXN0X2hvb2tfcGF0aCkKICAgIGNvdW50KGlucHV0Lmd1ZXN0X2hvb2tfcGF0aCkgPT0gMAoKICAgIHByaW50KCJDcmVhdGVTYW5kYm94UmVxdWVzdDogaW5wdXQua2VybmVsX21vZHVsZXMgPSIsIGlucHV0Lmtlcm5lbF9tb2R1bGVzKQogICAgY291bnQoaW5wdXQua2VybmVsX21vZHVsZXMpID09IDAKCiAgICBpX3BpZG5zIDo9IGlucHV0LnNhbmRib3hfcGlkbnMKICAgIHByaW50KCJDcmVhdGVTYW5kYm94UmVxdWVzdDogaV9waWRucyA9IiwgaV9waWRucykKICAgIGlfcGlkbnMgPT0gZmFsc2UKICAgIGFsbG93X3NhbmRib3hfc3RvcmFnZXMoaW5wdXQuc3RvcmFnZXMpCn0KCmFsbG93X2V4ZWMocF9jb250YWluZXIsIGlfcHJvY2VzcykgewogICAgcHJpbnQoImFsbG93X2V4ZWM6IHN0YXJ0IikKCiAgICBwX29jaSA9IHBfY29udGFpbmVyLk9DSQogICAgcF9zX25hbWUgPSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc19uYW1lc3BhY2UgPSBnZXRfc3RhdGVfdmFsKCJuYW1lc3BhY2UiKQogICAgYWxsb3dfcHJvYmVfcHJvY2VzcyhwX29jaS5Qcm9jZXNzLCBpX3Byb2Nlc3MsIHBfc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfZXhlYzogdHJ1ZSIpCn0KCmFsbG93X2ludGVyYWN0aXZlX2V4ZWMocF9jb250YWluZXIsIGlfcHJvY2VzcykgewogICAgcHJpbnQoImFsbG93X2ludGVyYWN0aXZlX2V4ZWM6IHN0YXJ0IikKCiAgICBwX29jaSA9IHBfY29udGFpbmVyLk9DSQogICAgcF9zX25hbWUgPSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc19uYW1lc3BhY2UgPSBnZXRfc3RhdGVfdmFsKCJuYW1lc3BhY2UiKQogICAgYWxsb3dfaW50ZXJhY3RpdmVfcHJvY2VzcyhwX29jaS5Qcm9jZXNzLCBpX3Byb2Nlc3MsIHBfc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfaW50ZXJhY3RpdmVfZXhlYzogdHJ1ZSIpCn0KCiMgVE9ETzogc2hvdWxkIG90aGVyIEV4ZWNQcm9jZXNzUmVxdWVzdCBpbnB1dCBkYXRhIGZpZWxkcyBiZSB2YWxpZGF0ZWQgYXMgd2VsbD8KRXhlY1Byb2Nlc3NSZXF1ZXN0IHsKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMTogaW5wdXQgPSIsIGlucHV0KQoKICAgIHNvbWUgcF9jb21tYW5kIGluIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuRXhlY1Byb2Nlc3NSZXF1ZXN0LmFsbG93ZWRfY29tbWFuZHMKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMTogcF9jb21tYW5kID0iLCBwX2NvbW1hbmQpCiAgICBwX2NvbW1hbmQgPT0gaW5wdXQucHJvY2Vzcy5BcmdzCgogICAgIyBUT0RPOiBtYXRjaCBwX2NvbnRhaW5lcidzIElEIHdpdGggdGhlIGlucHV0IGNvbnRhaW5lcl9pZC4KICAgIHNvbWUgcF9jb250YWluZXIgaW4gcG9saWN5X2RhdGEuY29udGFpbmVycwogICAgYWxsb3dfaW50ZXJhY3RpdmVfZXhlYyhwX2NvbnRhaW5lciwgaW5wdXQucHJvY2VzcykKCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDE6IHRydWUiKQp9CkV4ZWNQcm9jZXNzUmVxdWVzdCB7CiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDI6IGlucHV0ID0iLCBpbnB1dCkKCiAgICAjIFRPRE86IG1hdGNoIGlucHV0IGNvbnRhaW5lciBJRCB3aXRoIGl0cyBjb3JyZXNwb25kaW5nIGNvbnRhaW5lci5leGVjX2NvbW1hbmRzLgogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBzb21lIHBfY29tbWFuZCBpbiBwX2NvbnRhaW5lci5leGVjX2NvbW1hbmRzCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDI6IHBfY29tbWFuZCA9IiwgcF9jb21tYW5kKQoKICAgICMgVE9ETzogc2hvdWxkIG90aGVyIGlucHV0IGRhdGEgZmllbGRzIGJlIHZhbGlkYXRlZCBhcyB3ZWxsPwogICAgcF9jb21tYW5kID09IGlucHV0LnByb2Nlc3MuQXJncwoKICAgIGFsbG93X2V4ZWMocF9jb250YWluZXIsIGlucHV0LnByb2Nlc3MpCgogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAyOiB0cnVlIikKfQpFeGVjUHJvY2Vzc1JlcXVlc3QgewogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAzOiBpbnB1dCA9IiwgaW5wdXQpCgogICAgaV9jb21tYW5kID0gY29uY2F0KCIgIiwgaW5wdXQucHJvY2Vzcy5BcmdzKQogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAzOiBpX2NvbW1hbmQgPSIsIGlfY29tbWFuZCkKCiAgICBzb21lIHBfcmVnZXggaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5FeGVjUHJvY2Vzc1JlcXVlc3QucmVnZXgKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMzogcF9yZWdleCA9IiwgcF9yZWdleCkKCiAgICByZWdleC5tYXRjaChwX3JlZ2V4LCBpX2NvbW1hbmQpCgogICAgIyBUT0RPOiBtYXRjaCBwX2NvbnRhaW5lcidzIElEIHdpdGggdGhlIGlucHV0IGNvbnRhaW5lcl9pZC4KICAgIHNvbWUgcF9jb250YWluZXIgaW4gcG9saWN5X2RhdGEuY29udGFpbmVycwogICAgYWxsb3dfaW50ZXJhY3RpdmVfZXhlYyhwX2NvbnRhaW5lciwgaW5wdXQucHJvY2VzcykKCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDM6IHRydWUiKQp9CgpVcGRhdGVSb3V0ZXNSZXF1ZXN0IHsKICAgIHByaW50KCJVcGRhdGVSb3V0ZXNSZXF1ZXN0OiBpbnB1dCA9IiwgaW5wdXQpCiAgICBwcmludCgiVXBkYXRlUm91dGVzUmVxdWVzdDogcG9saWN5ID0iLCBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLlVwZGF0ZVJvdXRlc1JlcXVlc3QpCgogICAgaV9yb3V0ZXMgOj0gaW5wdXQucm91dGVzLlJvdXRlcwogICAgcF9zb3VyY2VfcmVnZXggPSBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLlVwZGF0ZVJvdXRlc1JlcXVlc3QuZm9yYmlkZGVuX3NvdXJjZV9yZWdleAogICAgcF9uYW1lcyA9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuVXBkYXRlUm91dGVzUmVxdWVzdC5mb3JiaWRkZW5fZGV2aWNlX25hbWVzCgogICAgZXZlcnkgaV9yb3V0ZSBpbiBpX3JvdXRlcyB7CiAgICAgICAgcHJpbnQoImlfcm91dGUuc291cmNlID0iLCBpX3JvdXRlLnNvdXJjZSkKICAgICAgICBldmVyeSBwX3JlZ2V4IGluIHBfc291cmNlX3JlZ2V4IHsKICAgICAgICAgICAgcHJpbnQoInBfcmVnZXggPSIsIHBfcmVnZXgpCiAgICAgICAgICAgIG5vdCByZWdleC5tYXRjaChwX3JlZ2V4LCBpX3JvdXRlLnNvdXJjZSkKICAgICAgICB9CgogICAgICAgIHByaW50KCJpX3JvdXRlLmRldmljZSA9IiwgaV9yb3V0ZS5kZXZpY2UpCiAgICAgICAgbm90IGlfcm91dGUuZGV2aWNlIGluIHBfbmFtZXMKICAgIH0KCiAgICBwcmludCgiVXBkYXRlUm91dGVzUmVxdWVzdDogdHJ1ZSIpCn0KClVwZGF0ZUludGVyZmFjZVJlcXVlc3QgewogICAgcHJpbnQoIlVwZGF0ZUludGVyZmFjZVJlcXVlc3Q6IGlucHV0ID0iLCBpbnB1dCkKICAgIHByaW50KCJVcGRhdGVJbnRlcmZhY2VSZXF1ZXN0OiBwb2xpY3kgPSIsIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuVXBkYXRlSW50ZXJmYWNlUmVxdWVzdCkKCiAgICBpX2ludGVyZmFjZSA6PSBpbnB1dC5pbnRlcmZhY2UKICAgIHBfZmxhZ3MgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmFsbG93X3Jhd19mbGFncwoKICAgICMgVHlwaWNhbGx5LCBqdXN0IElGRl9OT0FSUCBpcyB1c2VkLgogICAgYml0cy5hbmQoaV9pbnRlcmZhY2UucmF3X2ZsYWdzLCBiaXRzLm5lZ2F0ZShwX2ZsYWdzKSkgPT0gMAoKICAgIHBfbmFtZXMgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmZvcmJpZGRlbl9uYW1lcwoKICAgIG5vdCBpX2ludGVyZmFjZS5uYW1lIGluIHBfbmFtZXMKCiAgICBwX2h3YWRkcnMgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmZvcmJpZGRlbl9od19hZGRycwoKICAgIG5vdCBpX2ludGVyZmFjZS5od0FkZHIgaW4gcF9od2FkZHJzCgogICAgcHJpbnQoIlVwZGF0ZUludGVyZmFjZVJlcXVlc3Q6IHRydWUiKQp9CgpDbG9zZVN0ZGluUmVxdWVzdCB7CiAgICBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLkNsb3NlU3RkaW5SZXF1ZXN0ID09IHRydWUKfQoKUmVhZFN0cmVhbVJlcXVlc3QgewogICAgcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5SZWFkU3RyZWFtUmVxdWVzdCA9PSB0cnVlCn0KClVwZGF0ZUVwaGVtZXJhbE1vdW50c1JlcXVlc3QgewogICAgcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVFcGhlbWVyYWxNb3VudHNSZXF1ZXN0ID09IHRydWUKfQoKV3JpdGVTdHJlYW1SZXF1ZXN0IHsKICAgIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuV3JpdGVTdHJlYW1SZXF1ZXN0ID09IHRydWUKfQoKcG9saWN5X2RhdGEgOj0gewogICJjb250YWluZXJzIjogWwogICAgewogICAgICAiT0NJIjogewogICAgICAgICJWZXJzaW9uIjogIjEuMS4wLXJjLjEiLAogICAgICAgICJQcm9jZXNzIjogewogICAgICAgICAgIlRlcm1pbmFsIjogZmFsc2UsCiAgICAgICAgICAiVXNlciI6IHsKICAgICAgICAgICAgIlVJRCI6IDY1NTM1LAogICAgICAgICAgICAiR0lEIjogNjU1MzUsCiAgICAgICAgICAgICJBZGRpdGlvbmFsR2lkcyI6IFtdLAogICAgICAgICAgICAiVXNlcm5hbWUiOiAiIgogICAgICAgICAgfSwKICAgICAgICAgICJEZXByZWNhdGVkQXJncyI6IFsKICAgICAgICAgICAgIi9wYXVzZSIKICAgICAgICAgIF0sCiAgICAgICAgICAiQXJncyI6IFsKICAgICAgICAgICAgIi9wYXVzZSIKICAgICAgICAgIF0sCiAgICAgICAgICAiRW52IjogWwogICAgICAgICAgICAiUEFUSD0vdXNyL2xvY2FsL3NiaW46L3Vzci9sb2NhbC9iaW46L3Vzci9zYmluOi91c3IvYmluOi9zYmluOi9iaW4iCiAgICAgICAgICBdLAogICAgICAgICAgIkN3ZCI6ICIvIiwKICAgICAgICAgICJDYXBhYmlsaXRpZXMiOiB7CiAgICAgICAgICAgICJBbWJpZW50IjogW10sCiAgICAgICAgICAgICJCb3VuZGluZyI6IFsKICAgICAgICAgICAgICAiJChkZWZhdWx0X2NhcHMpIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiRWZmZWN0aXZlIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJJbmhlcml0YWJsZSI6IFtdLAogICAgICAgICAgICAiUGVybWl0dGVkIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICAiTm9OZXdQcml2aWxlZ2VzIjogdHJ1ZQogICAgICAgIH0sCiAgICAgICAgIlJvb3QiOiB7CiAgICAgICAgICAiUGF0aCI6ICIkKGNwYXRoKS8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgIlJlYWRvbmx5IjogdHJ1ZQogICAgICAgIH0sCiAgICAgICAgIk1vdW50cyI6IFsKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9wcm9jIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJwcm9jIiwKICAgICAgICAgICAgInR5cGVfIjogInByb2MiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2IiwKICAgICAgICAgICAgInNvdXJjZSI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJzdHJpY3RhdGltZSIsCiAgICAgICAgICAgICAgIm1vZGU9NzU1IiwKICAgICAgICAgICAgICAic2l6ZT02NTUzNmsiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L3B0cyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiZGV2cHRzIiwKICAgICAgICAgICAgInR5cGVfIjogImRldnB0cyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJuZXdpbnN0YW5jZSIsCiAgICAgICAgICAgICAgInB0bXhtb2RlPTA2NjYiLAogICAgICAgICAgICAgICJtb2RlPTA2MjAiLAogICAgICAgICAgICAgICJnaWQ9NSIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvc2htIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L3NobSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi9tcXVldWUiLAogICAgICAgICAgICAic291cmNlIjogIm1xdWV1ZSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJtcXVldWUiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvc3lzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJzeXNmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJzeXNmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2V0Yy9yZXNvbHYuY29uZiIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClyZXNvbHYuY29uZiQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJvIiwKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9kZXYiLAogICAgICAgICAgICAgICJub2V4ZWMiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0KICAgICAgICBdLAogICAgICAgICJBbm5vdGF0aW9ucyI6IHsKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmJ1bmRsZV9wYXRoIjogIi9ydW4vY29udGFpbmVyZC9pby5jb250YWluZXJkLnJ1bnRpbWUudjIudGFzay9rOHMuaW8vJChidW5kbGUtaWQpIiwKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIjogInBvZF9zYW5kYm94IiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSI6ICJzYW5kYm94IiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWlkIjogIl5bYS16MC05XXs2NH0kIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWxvZy1kaXJlY3RvcnkiOiAiXi92YXIvbG9nL3BvZHMvJChzYW5kYm94LW5hbWVzcGFjZSlfJChzYW5kYm94LW5hbWUpX1swLTlhLWZdezh9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezEyfSQiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZXNwYWNlIjogIiIsCiAgICAgICAgICAibmVyZGN0bC9uZXR3b3JrLW5hbWVzcGFjZSI6ICJeL3Zhci9ydW4vbmV0bnMvY25pLVswLTlhLWZdezh9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezEyfSQiCiAgICAgICAgfSwKICAgICAgICAiTGludXgiOiB7CiAgICAgICAgICAiTmFtZXNwYWNlcyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICJUeXBlIjogImlwYyIsCiAgICAgICAgICAgICAgIlBhdGgiOiAiIgogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgIlR5cGUiOiAidXRzIiwKICAgICAgICAgICAgICAiUGF0aCI6ICIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiVHlwZSI6ICJtb3VudCIsCiAgICAgICAgICAgICAgIlBhdGgiOiAiIgogICAgICAgICAgICB9CiAgICAgICAgICBdLAogICAgICAgICAgIk1hc2tlZFBhdGhzIjogWwogICAgICAgICAgICAiL3Byb2MvYWNwaSIsCiAgICAgICAgICAgICIvcHJvYy9hc291bmQiLAogICAgICAgICAgICAiL3Byb2Mva2NvcmUiLAogICAgICAgICAgICAiL3Byb2Mva2V5cyIsCiAgICAgICAgICAgICIvcHJvYy9sYXRlbmN5X3N0YXRzIiwKICAgICAgICAgICAgIi9wcm9jL3RpbWVyX2xpc3QiLAogICAgICAgICAgICAiL3Byb2MvdGltZXJfc3RhdHMiLAogICAgICAgICAgICAiL3Byb2Mvc2NoZWRfZGVidWciLAogICAgICAgICAgICAiL3N5cy9maXJtd2FyZSIsCiAgICAgICAgICAgICIvcHJvYy9zY3NpIgogICAgICAgICAgXSwKICAgICAgICAgICJSZWFkb25seVBhdGhzIjogWwogICAgICAgICAgICAiL3Byb2MvYnVzIiwKICAgICAgICAgICAgIi9wcm9jL2ZzIiwKICAgICAgICAgICAgIi9wcm9jL2lycSIsCiAgICAgICAgICAgICIvcHJvYy9zeXMiLAogICAgICAgICAgICAiL3Byb2Mvc3lzcnEtdHJpZ2dlciIKICAgICAgICAgIF0sCiAgICAgICAgICAiRGV2aWNlcyI6IFtdLAogICAgICAgICAgIlN5c2N0bCI6IHsKICAgICAgICAgICAgIm5ldC5pcHY0LmlwX3VucHJpdmlsZWdlZF9wb3J0X3N0YXJ0IjogIjAiLAogICAgICAgICAgICAibmV0LmlwdjQucGluZ19ncm91cF9yYW5nZSI6ICIwIDIxNDc0ODM2NDciCiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9LAogICAgICAic3RvcmFnZXMiOiBbCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJibGsiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogInRhciIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIiQoaGFzaDApIgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGxheWVyMCkiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJvdmVybGF5ZnMiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogImZ1c2UzLmthdGEtb3ZlcmxheSIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIjVhNWFhZDgwMDU1ZmYyMDAxMmE1MGRjMjVmOGRmN2EyOTkyNDQ3NDMyNGQ2NWY3ZDUzMDZlZThlZTI3ZmY3MWQiLAogICAgICAgICAgICAiODE3MjUwZjFhM2UzMzZkYTc2ZjViZDNmYTc4NGUxYjI2ZDk1OWI5YzEzMTg3NjgxNWJhMjYwNDA0OGI3MGMxOCIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChjcGF0aCkvJChidW5kbGUtaWQpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9CiAgICAgIF0sCiAgICAgICJkZXZpY2VzIjogW10sCiAgICAgICJzYW5kYm94X3BpZG5zIjogZmFsc2UsCiAgICAgICJleGVjX2NvbW1hbmRzIjogW10sCiAgICAgICJlbnZfbWFwIjogewogICAgICAgICJQQVRIIjogIi91c3IvbG9jYWwvc2JpbjovdXNyL2xvY2FsL2JpbjovdXNyL3NiaW46L3Vzci9iaW46L3NiaW46L2JpbiIKICAgICAgfQogICAgfSwKICAgIHsKICAgICAgIk9DSSI6IHsKICAgICAgICAiVmVyc2lvbiI6ICIxLjEuMC1yYy4xIiwKICAgICAgICAiUHJvY2VzcyI6IHsKICAgICAgICAgICJUZXJtaW5hbCI6IGZhbHNlLAogICAgICAgICAgIlVzZXIiOiB7CiAgICAgICAgICAgICJVSUQiOiAwLAogICAgICAgICAgICAiR0lEIjogMCwKICAgICAgICAgICAgIkFkZGl0aW9uYWxHaWRzIjogW10sCiAgICAgICAgICAgICJVc2VybmFtZSI6ICIiCiAgICAgICAgICB9LAogICAgICAgICAgIkRlcHJlY2F0ZWRBcmdzIjogWwogICAgICAgICAgICAiL2Jpbi9zaCIsCiAgICAgICAgICAgICItYyIsCiAgICAgICAgICAgICJlY2hvICdzY2FsZT01OyA0KmEoMSknIHwgYmMgLWwiCiAgICAgICAgICBdLAogICAgICAgICAgIkFyZ3MiOiBbCiAgICAgICAgICAgICIvYmluL3NoIiwKICAgICAgICAgICAgIi1jIiwKICAgICAgICAgICAgImVjaG8gJ3NjYWxlPTU7IDQqYSgxKScgfCBiYyAtbCIKICAgICAgICAgIF0sCiAgICAgICAgICAiRW52IjogWwogICAgICAgICAgICAiUEFUSD0vdXNyL2xvY2FsL3NiaW46L3Vzci9sb2NhbC9iaW46L3Vzci9zYmluOi91c3IvYmluOi9zYmluOi9iaW4iLAogICAgICAgICAgICAiSE9TVE5BTUU9JChob3N0LW5hbWUpIgogICAgICAgICAgXSwKICAgICAgICAgICJDd2QiOiAiLyIsCiAgICAgICAgICAiQ2FwYWJpbGl0aWVzIjogewogICAgICAgICAgICAiQW1iaWVudCI6IFtdLAogICAgICAgICAgICAiQm91bmRpbmciOiBbCiAgICAgICAgICAgICAgIiQoZGVmYXVsdF9jYXBzKSIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgIkVmZmVjdGl2ZSI6IFsKICAgICAgICAgICAgICAiJChkZWZhdWx0X2NhcHMpIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiSW5oZXJpdGFibGUiOiBbXSwKICAgICAgICAgICAgIlBlcm1pdHRlZCI6IFsKICAgICAgICAgICAgICAiJChkZWZhdWx0X2NhcHMpIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgIk5vTmV3UHJpdmlsZWdlcyI6IGZhbHNlCiAgICAgICAgfSwKICAgICAgICAiUm9vdCI6IHsKICAgICAgICAgICJQYXRoIjogIiQoY3BhdGgpLyQoYnVuZGxlLWlkKSIsCiAgICAgICAgICAiUmVhZG9ubHkiOiBmYWxzZQogICAgICAgIH0sCiAgICAgICAgIk1vdW50cyI6IFsKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9wcm9jIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJwcm9jIiwKICAgICAgICAgICAgInR5cGVfIjogInByb2MiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2IiwKICAgICAgICAgICAgInNvdXJjZSI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJzdHJpY3RhdGltZSIsCiAgICAgICAgICAgICAgIm1vZGU9NzU1IiwKICAgICAgICAgICAgICAic2l6ZT02NTUzNmsiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L3B0cyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiZGV2cHRzIiwKICAgICAgICAgICAgInR5cGVfIjogImRldnB0cyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJuZXdpbnN0YW5jZSIsCiAgICAgICAgICAgICAgInB0bXhtb2RlPTA2NjYiLAogICAgICAgICAgICAgICJtb2RlPTA2MjAiLAogICAgICAgICAgICAgICJnaWQ9NSIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvc2htIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L3NobSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi9tcXVldWUiLAogICAgICAgICAgICAic291cmNlIjogIm1xdWV1ZSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJtcXVldWUiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvc3lzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJzeXNmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJzeXNmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL3N5cy9mcy9jZ3JvdXAiLAogICAgICAgICAgICAic291cmNlIjogImNncm91cCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJjZ3JvdXAiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiLAogICAgICAgICAgICAgICJyZWxhdGltZSIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2V0Yy9ob3N0cyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClob3N0cyQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicnciCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L3Rlcm1pbmF0aW9uLWxvZyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeCl0ZXJtaW5hdGlvbi1sb2ckIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJ3IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2V0Yy9ob3N0bmFtZSIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClob3N0bmFtZSQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicnciCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZXRjL3Jlc29sdi5jb25mIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KXJlc29sdi5jb25mJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJydyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi92YXIvcnVuL3NlY3JldHMva3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudCIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClzZXJ2aWNlYWNjb3VudCQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicm8iCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvdmFyL3J1bi9zZWNyZXRzL2F6dXJlL3Rva2VucyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeCl0b2tlbnMkIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9CiAgICAgICAgXSwKICAgICAgICAiQW5ub3RhdGlvbnMiOiB7CiAgICAgICAgICAiaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5idW5kbGVfcGF0aCI6ICIvcnVuL2NvbnRhaW5lcmQvaW8uY29udGFpbmVyZC5ydW50aW1lLnYyLnRhc2svazhzLmlvLyQoYnVuZGxlLWlkKSIsCiAgICAgICAgICAiaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5jb250YWluZXJfdHlwZSI6ICJwb2RfY29udGFpbmVyIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItbmFtZSI6ICJwaSIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLXR5cGUiOiAiY29udGFpbmVyIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5pbWFnZS1uYW1lIjogIm1jci5taWNyb3NvZnQuY29tL2Frcy9lMmUvbGlicmFyeS1idXN5Ym94Om1hc3Rlci4yMjAzMTQuMS1saW51eC1hbWQ2NCIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCI6ICJeW2EtejAtOV17NjR9JCIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1uYW1lc3BhY2UiOiAiIgogICAgICAgIH0sCiAgICAgICAgIkxpbnV4IjogewogICAgICAgICAgIk5hbWVzcGFjZXMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiVHlwZSI6ICJpcGMiLAogICAgICAgICAgICAgICJQYXRoIjogIiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJUeXBlIjogInV0cyIsCiAgICAgICAgICAgICAgIlBhdGgiOiAiIgogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgIlR5cGUiOiAibW91bnQiLAogICAgICAgICAgICAgICJQYXRoIjogIiIKICAgICAgICAgICAgfQogICAgICAgICAgXSwKICAgICAgICAgICJNYXNrZWRQYXRocyI6IFsKICAgICAgICAgICAgIi9wcm9jL2FjcGkiLAogICAgICAgICAgICAiL3Byb2Mva2NvcmUiLAogICAgICAgICAgICAiL3Byb2Mva2V5cyIsCiAgICAgICAgICAgICIvcHJvYy9sYXRlbmN5X3N0YXRzIiwKICAgICAgICAgICAgIi9wcm9jL3RpbWVyX2xpc3QiLAogICAgICAgICAgICAiL3Byb2MvdGltZXJfc3RhdHMiLAogICAgICAgICAgICAiL3Byb2Mvc2NoZWRfZGVidWciLAogICAgICAgICAgICAiL3Byb2Mvc2NzaSIsCiAgICAgICAgICAgICIvc3lzL2Zpcm13YXJlIgogICAgICAgICAgXSwKICAgICAgICAgICJSZWFkb25seVBhdGhzIjogWwogICAgICAgICAgICAiL3Byb2MvYXNvdW5kIiwKICAgICAgICAgICAgIi9wcm9jL2J1cyIsCiAgICAgICAgICAgICIvcHJvYy9mcyIsCiAgICAgICAgICAgICIvcHJvYy9pcnEiLAogICAgICAgICAgICAiL3Byb2Mvc3lzIiwKICAgICAgICAgICAgIi9wcm9jL3N5c3JxLXRyaWdnZXIiCiAgICAgICAgICBdLAogICAgICAgICAgIkRldmljZXMiOiBbXSwKICAgICAgICAgICJTeXNjdGwiOiB7CiAgICAgICAgICAgICJuZXQuaXB2NC5pcF91bnByaXZpbGVnZWRfcG9ydF9zdGFydCI6ICIwIiwKICAgICAgICAgICAgIm5ldC5pcHY0LnBpbmdfZ3JvdXBfcmFuZ2UiOiAiMCAyMTQ3NDgzNjQ3IgogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSwKICAgICAgInN0b3JhZ2VzIjogWwogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2gwKSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjApIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2gxKSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjEpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAib3ZlcmxheWZzIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJmdXNlMy5rYXRhLW92ZXJsYXkiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIyYzM0MmExMzdlNjkzYzc4OThhZWMzNmRhMTA0N2YxOTFkYzdjMTY4N2U2NjE5OGFkYWNjNDM5Y2Y0YWRmMzc5OjI1NzBlM2ExOWUxYmYyMGRkZGE0NTQ5OGE5NjI3ZjYxNTU1ZDJkNmMwMTQ3OWI5Yjc2NDYwYjY3OWIyN2Q1NTIiLAogICAgICAgICAgICAiODU2OGM3MGMwY2NmZTAwNTEwOTJlODE4ZGE3NjkxMTFhNTk4ODJjZDE5ZGQ3OTlkM2JjYTVmZmE4Mjc5MTA4MDpiNjQzYjYyMTc3NDg5ODM4MzBiMjZhYzE0YTM1YTMzMjJkZDUyOGMwMDk2M2VhYWRkOTFlZjU1ZjUxM2RjNzNmIgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGNwYXRoKS8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0KICAgICAgXSwKICAgICAgImRldmljZXMiOiBbXSwKICAgICAgInNhbmRib3hfcGlkbnMiOiBmYWxzZSwKICAgICAgImV4ZWNfY29tbWFuZHMiOiBbXSwKICAgICAgImVudl9tYXAiOiB7CiAgICAgICAgIkhPU1ROQU1FIjogIiQoaG9zdC1uYW1lKSIsCiAgICAgICAgIlBBVEgiOiAiL3Vzci9sb2NhbC9zYmluOi91c3IvbG9jYWwvYmluOi91c3Ivc2JpbjovdXNyL2Jpbjovc2JpbjovYmluIgogICAgICB9CiAgICB9CiAgXSwKICAiY29tbW9uIjogewogICAgImNwYXRoIjogIi9ydW4va2F0YS1jb250YWluZXJzL3NoYXJlZC9jb250YWluZXJzIiwKICAgICJtb3VudF9zb3VyY2VfY3BhdGgiOiAiL3J1bi9rYXRhLWNvbnRhaW5lcnMvc2hhcmVkL2NvbnRhaW5lcnMiLAogICAgInNmcHJlZml4IjogIl4kKGNwYXRoKS8kKGJ1bmRsZS1pZCktW2EtejAtOV17MTZ9LSIsCiAgICAic3BhdGgiOiAiL3J1bi9rYXRhLWNvbnRhaW5lcnMvc2FuZGJveC9zdG9yYWdlIiwKICAgICJpcHY0X2EiOiAiKChbMC05XXxbMS05XVswLTldfDFbMC05XXsyfXwyWzAtNF1bMC05XXwyNVswLTVdKVxcLil7M30oWzAtOV18WzEtOV1bMC05XXwxWzAtOV17Mn18MlswLTRdWzAtOV18MjVbMC01XSkiLAogICAgImlwX3AiOiAiWzAtOV17MSw1fSIsCiAgICAic3ZjX25hbWUiOiAiW0EtWl9cXC5cXC1dKyIsCiAgICAiZG5zX2xhYmVsIjogIlthLXpBLVowLTlfXFwuXFwtXSsiLAogICAgInNfc291cmNlMSI6ICJeLi4yWzAtOV17M31fWzAtMV1bMC05XV9bMC0zXVswLTldX1swLTJdWzAtOV1fWzAtNV1bMC05XV9bMC01XVswLTldXFwuWzAtOV17MSwxMH0kIiwKICAgICJzX3NvdXJjZTIiOiAiXi4uZGF0YS8iLAogICAgImRuc19zdWJkb21haW4iOiAiXlthLXowLTldKFstYS16MC05XSpbYS16MC05XSk/JCIsCiAgICAicG9kX3VpZCI6ICJeWzAtOWEtZkEtRl17OH0tWzAtOWEtZkEtRl17NH0tWzAtOWEtZkEtRl17NH0tWzAtOWEtZkEtRl17NH0tWzAtOWEtZkEtRl17MTJ9JCIsCiAgICAiZGVmYXVsdF9jYXBzIjogWwogICAgICAiQ0FQX0NIT1dOIiwKICAgICAgIkNBUF9EQUNfT1ZFUlJJREUiLAogICAgICAiQ0FQX0ZTRVRJRCIsCiAgICAgICJDQVBfRk9XTkVSIiwKICAgICAgIkNBUF9NS05PRCIsCiAgICAgICJDQVBfTkVUX1JBVyIsCiAgICAgICJDQVBfU0VUR0lEIiwKICAgICAgIkNBUF9TRVRVSUQiLAogICAgICAiQ0FQX1NFVEZDQVAiLAogICAgICAiQ0FQX1NFVFBDQVAiLAogICAgICAiQ0FQX05FVF9CSU5EX1NFUlZJQ0UiLAogICAgICAiQ0FQX1NZU19DSFJPT1QiLAogICAgICAiQ0FQX0tJTEwiLAogICAgICAiQ0FQX0FVRElUX1dSSVRFIgogICAgXSwKICAgICJwcml2aWxlZ2VkX2NhcHMiOiBbCiAgICAgICJDQVBfQ0hPV04iLAogICAgICAiQ0FQX0RBQ19PVkVSUklERSIsCiAgICAgICJDQVBfREFDX1JFQURfU0VBUkNIIiwKICAgICAgIkNBUF9GT1dORVIiLAogICAgICAiQ0FQX0ZTRVRJRCIsCiAgICAgICJDQVBfS0lMTCIsCiAgICAgICJDQVBfU0VUR0lEIiwKICAgICAgIkNBUF9TRVRVSUQiLAogICAgICAiQ0FQX1NFVFBDQVAiLAogICAgICAiQ0FQX0xJTlVYX0lNTVVUQUJMRSIsCiAgICAgICJDQVBfTkVUX0JJTkRfU0VSVklDRSIsCiAgICAgICJDQVBfTkVUX0JST0FEQ0FTVCIsCiAgICAgICJDQVBfTkVUX0FETUlOIiwKICAgICAgIkNBUF9ORVRfUkFXIiwKICAgICAgIkNBUF9JUENfTE9DSyIsCiAgICAgICJDQVBfSVBDX09XTkVSIiwKICAgICAgIkNBUF9TWVNfTU9EVUxFIiwKICAgICAgIkNBUF9TWVNfUkFXSU8iLAogICAgICAiQ0FQX1NZU19DSFJPT1QiLAogICAgICAiQ0FQX1NZU19QVFJBQ0UiLAogICAgICAiQ0FQX1NZU19QQUNDVCIsCiAgICAgICJDQVBfU1lTX0FETUlOIiwKICAgICAgIkNBUF9TWVNfQk9PVCIsCiAgICAgICJDQVBfU1lTX05JQ0UiLAogICAgICAiQ0FQX1NZU19SRVNPVVJDRSIsCiAgICAgICJDQVBfU1lTX1RJTUUiLAogICAgICAiQ0FQX1NZU19UVFlfQ09ORklHIiwKICAgICAgIkNBUF9NS05PRCIsCiAgICAgICJDQVBfTEVBU0UiLAogICAgICAiQ0FQX0FVRElUX1dSSVRFIiwKICAgICAgIkNBUF9BVURJVF9DT05UUk9MIiwKICAgICAgIkNBUF9TRVRGQ0FQIiwKICAgICAgIkNBUF9NQUNfT1ZFUlJJREUiLAogICAgICAiQ0FQX01BQ19BRE1JTiIsCiAgICAgICJDQVBfU1lTTE9HIiwKICAgICAgIkNBUF9XQUtFX0FMQVJNIiwKICAgICAgIkNBUF9CTE9DS19TVVNQRU5EIiwKICAgICAgIkNBUF9BVURJVF9SRUFEIiwKICAgICAgIkNBUF9QRVJGTU9OIiwKICAgICAgIkNBUF9CUEYiLAogICAgICAiQ0FQX0NIRUNLUE9JTlRfUkVTVE9SRSIKICAgIF0sCiAgICAidmlydGlvX2Jsa19zdG9yYWdlX2NsYXNzZXMiOiBbCiAgICAgICJjYy1sb2NhbC1jc2kiLAogICAgICAiY2MtbWFuYWdlZC1jc2kiLAogICAgICAiY2MtbWFuYWdlZC1wcmVtaXVtLWNzaSIKICAgIF0sCiAgICAic21iX3N0b3JhZ2VfY2xhc3NlcyI6IFsKICAgICAgewogICAgICAgICJuYW1lIjogImF6dXJlZmlsZS1jc2kta2F0YS1jYyIsCiAgICAgICAgIm1vdW50X29wdGlvbnMiOiBbCiAgICAgICAgICAiZGlyX21vZGU9MDc3NyIsCiAgICAgICAgICAiZmlsZV9tb2RlPTA3NzciLAogICAgICAgICAgIm1mc3ltbGlua3MiLAogICAgICAgICAgImNhY2hlPXN0cmljdCIsCiAgICAgICAgICAibm9zaGFyZXNvY2siLAogICAgICAgICAgImFjdGltZW89MzAiLAogICAgICAgICAgIm5vYnJsIgogICAgICAgIF0KICAgICAgfQogICAgXQogIH0sCiAgInNhbmRib3giOiB7CiAgICAic3RvcmFnZXMiOiBbCiAgICAgIHsKICAgICAgICAiZHJpdmVyIjogImVwaGVtZXJhbCIsCiAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgInNvdXJjZSI6ICJzaG0iLAogICAgICAgICJmc3R5cGUiOiAidG1wZnMiLAogICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICJub2RldiIsCiAgICAgICAgICAibW9kZT0xNzc3IiwKICAgICAgICAgICJzaXplPTY3MTA4ODY0IgogICAgICAgIF0sCiAgICAgICAgIm1vdW50X3BvaW50IjogIi9ydW4va2F0YS1jb250YWluZXJzL3NhbmRib3gvc2htIiwKICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgIH0KICAgIF0KICB9LAogICJyZXF1ZXN0X2RlZmF1bHRzIjogewogICAgIkNyZWF0ZUNvbnRhaW5lclJlcXVlc3QiOiB7CiAgICAgICJhbGxvd19lbnZfcmVnZXgiOiBbCiAgICAgICAgIl5IT1NUTkFNRT0kKGRuc19sYWJlbCkkIiwKICAgICAgICAiXiQoc3ZjX25hbWUpX1BPUlRfJChpcF9wKV9UQ1A9dGNwOi8vJChpcHY0X2EpOiQoaXBfcCkkIiwKICAgICAgICAiXiQoc3ZjX25hbWUpX1BPUlRfJChpcF9wKV9UQ1BfUFJPVE89dGNwJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9QT1JUXyQoaXBfcClfVENQX1BPUlQ9JChpcF9wKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfUE9SVF8kKGlwX3ApX1RDUF9BRERSPSQoaXB2NF9hKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfU0VSVklDRV9IT1NUPSQoaXB2NF9hKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfU0VSVklDRV9QT1JUPSQoaXBfcCkkIiwKICAgICAgICAiXiQoc3ZjX25hbWUpX1NFUlZJQ0VfUE9SVF8kKGRuc19sYWJlbCk9JChpcF9wKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfUE9SVD10Y3A6Ly8kKGlwdjRfYSk6JChpcF9wKSQiLAogICAgICAgICJeQVpVUkVfQ0xJRU5UX0lEPVtBLUZhLWYwLTktXSokIiwKICAgICAgICAiXkFaVVJFX1RFTkFOVF9JRD1bQS1GYS1mMC05LV0qJCIsCiAgICAgICAgIl5BWlVSRV9GRURFUkFURURfVE9LRU5fRklMRT0vdmFyL3J1bi9zZWNyZXRzL2F6dXJlL3Rva2Vucy9henVyZS1pZGVudGl0eS10b2tlbiQiLAogICAgICAgICJeQVpVUkVfQVVUSE9SSVRZX0hPU1Q9aHR0cHM6Ly9sb2dpblxcLm1pY3Jvc29mdG9ubGluZVxcLmNvbS8kIiwKICAgICAgICAiXlRFUk09eHRlcm0kIgogICAgICBdLAogICAgICAiYWxsb3dfZW52X3JlZ2V4X21hcCI6IHsKICAgICAgICAiQ1BVX0xJTUlUIjogIl5bMC05XSskIiwKICAgICAgICAiSk9CX0NPTVBMRVRJT05fSU5ERVgiOiAiXlswLTldKiQiLAogICAgICAgICJNRU1PUllfTElNSVQiOiAiXlswLTldKyQiCiAgICAgIH0KICAgIH0sCiAgICAiQ29weUZpbGVSZXF1ZXN0IjogWwogICAgICAiJChzZnByZWZpeCkiCiAgICBdLAogICAgIkV4ZWNQcm9jZXNzUmVxdWVzdCI6IHsKICAgICAgImFsbG93ZWRfY29tbWFuZHMiOiBbXSwKICAgICAgInJlZ2V4IjogW10KICAgIH0sCiAgICAiVXBkYXRlUm91dGVzUmVxdWVzdCI6IHsKICAgICAgImZvcmJpZGRlbl9kZXZpY2VfbmFtZXMiOiBbCiAgICAgICAgImxvIgogICAgICBdLAogICAgICAiZm9yYmlkZGVuX3NvdXJjZV9yZWdleCI6IFsKICAgICAgICAiXig/OjB7MCw0fTopezAsN30wezAsM30xJCIsCiAgICAgICAgIl4xMjdcXC4oPzpbMC05XXsxLDN9XFwuKXsyfVswLTldezEsM30kIgogICAgICBdCiAgICB9LAogICAgIlVwZGF0ZUludGVyZmFjZVJlcXVlc3QiOiB7CiAgICAgICJhbGxvd19yYXdfZmxhZ3MiOiAxMjgsCiAgICAgICJmb3JiaWRkZW5fbmFtZXMiOiBbCiAgICAgICAgImxvIgogICAgICBdLAogICAgICAiZm9yYmlkZGVuX2h3X2FkZHJzIjogWwogICAgICAgICIwMDowMDowMDowMDowMDowMCIKICAgICAgXQogICAgfSwKICAgICJDbG9zZVN0ZGluUmVxdWVzdCI6IGZhbHNlLAogICAgIlJlYWRTdHJlYW1SZXF1ZXN0IjogZmFsc2UsCiAgICAiVXBkYXRlRXBoZW1lcmFsTW91bnRzUmVxdWVzdCI6IGZhbHNlLAogICAgIldyaXRlU3RyZWFtUmVxdWVzdCI6IGZhbHNlCiAgfQp9 diff --git a/src/agent/samples/policy/yaml/demo/pod-demo.yaml b/src/agent/samples/policy/yaml/demo/pod-demo.yaml new file mode 100644 index 000000000000..5ebf5df798f5 --- /dev/null +++ b/src/agent/samples/policy/yaml/demo/pod-demo.yaml @@ -0,0 +1,22 @@ +--- +apiVersion: v1 +kind: Pod +metadata: + name: demo + annotations: + io.katacontainers.config.agent.policy: cGFja2FnZSBjb2NvX3BvbGljeQoKaW1wb3J0IGZ1dHVyZS5rZXl3b3Jkcy5pbgppbXBvcnQgZnV0dXJlLmtleXdvcmRzLmV2ZXJ5CgppbXBvcnQgaW5wdXQKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBEZWZhdWx0IHZhbHVlczoKIwojIC0gdHJ1ZSBmb3IgcmVxdWVzdHMgdGhhdCBhcmUgYWxsb3dlZCBieSBkZWZhdWx0LgojIC0gZmFsc2UgZm9yIHJlcXVlc3RzIHRoYXQgaGF2ZSBhZGRpdGlvbmFsIHBvbGljeSBydWxlcywgZGVmaW5lZCBiZWxvdy4KIyAtIFJlcXVlc3RzIHRoYXQgYXJlIG5vdCBsaXN0ZWQgaGVyZSBnZXQgcmVqZWN0ZWQgYnkgZGVmYXVsdC4KCiMgRGV0YWlsZWQgcG9saWN5IHJ1bGVzIGZvciB0aGVzZSByZXF1ZXN0cyBhcmUgYmVsb3cuCmRlZmF1bHQgQ29weUZpbGVSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgQ3JlYXRlQ29udGFpbmVyUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IEV4ZWNQcm9jZXNzUmVxdWVzdCA6PSBmYWxzZQoKIyBSZXF1ZXN0cyB0aGF0IGFyZSBhbHdheXMgYWxsb3dlZC4KZGVmYXVsdCBDcmVhdGVTYW5kYm94UmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgRGVzdHJveVNhbmRib3hSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBHZXRPT01FdmVudFJlcXVlc3QgOj0gdHJ1ZQpkZWZhdWx0IEd1ZXN0RGV0YWlsc1JlcXVlc3QgOj0gdHJ1ZQpkZWZhdWx0IE9ubGluZUNQVU1lbVJlcXVlc3QgOj0gdHJ1ZQpkZWZhdWx0IFB1bGxJbWFnZVJlcXVlc3QgOj0gdHJ1ZQpkZWZhdWx0IFJlYWRTdHJlYW1SZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBSZW1vdmVDb250YWluZXJSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBSZW1vdmVTdGFsZVZpcnRpb2ZzU2hhcmVNb3VudHNSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBTZXRQb2xpY3lSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBTaWduYWxQcm9jZXNzUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgU3RhcnRDb250YWluZXJSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBTdGF0c0NvbnRhaW5lclJlcXVlc3QgOj0gdHJ1ZQpkZWZhdWx0IFR0eVdpblJlc2l6ZVJlcXVlc3QgOj0gdHJ1ZQpkZWZhdWx0IFVwZGF0ZUVwaGVtZXJhbE1vdW50c1JlcXVlc3QgOj0gdHJ1ZQpkZWZhdWx0IFVwZGF0ZUludGVyZmFjZVJlcXVlc3QgOj0gdHJ1ZQpkZWZhdWx0IFVwZGF0ZVJvdXRlc1JlcXVlc3QgOj0gdHJ1ZQpkZWZhdWx0IFdhaXRQcm9jZXNzUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgV3JpdGVTdHJlYW1SZXF1ZXN0IDo9IHRydWUKCiMgQ29uZmlndXJlIHRoZSBBZ2VudCB0byAqYWxsb3cgYW55IHJlcXVlc3RzIGNhdXNpbmcgYSBwb2xpY3kgZmFpbHVyZSouCiMgVGhpcyBpcyBhbiB1bnNlY3VyZSBjb25maWd1cmF0aW9uIGJ1dCBpcyB1c2VmdWwgZm9yIGFsbG93aW5nIHVuc2VjdXJlCiMgcG9kcyB0byBzdGFydCwgdGhlbiBjb25uZWN0IHRvIHRoZW0gYW5kIGluc3BlY3QgT1BBIGxvZ3MgZm9yIHRoZSByb290CiMgY2F1c2Ugb2YgYSBmYWlsdXJlLgojIGRlZmF1bHQgQWxsb3dSZXF1ZXN0c0ZhaWxpbmdQb2xpY3kgOj0gdHJ1ZQoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpDcmVhdGVDb250YWluZXJSZXF1ZXN0IHsKICAgIHNvbWUgcG9saWN5X2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCgogICAgcG9saWN5X29jaSA6PSBwb2xpY3lfY29udGFpbmVyLm9jaQogICAgcG9saWN5X3N0b3JhZ2VzIDo9IHBvbGljeV9jb250YWluZXIuc3RvcmFnZXMKCiAgICBpbnB1dF9vY2kgOj0gaW5wdXQub2NpCiAgICBpbnB1dF9zdG9yYWdlcyA6PSBpbnB1dC5zdG9yYWdlcwoKICAgIHByaW50KCI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IikKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0OiBwb2xpY3lfb2NpLm9jaVZlcnNpb24iKQogICAgcG9saWN5X29jaS5vY2lWZXJzaW9uICAgICA9PSBpbnB1dF9vY2kub2NpVmVyc2lvbgoKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0OiBwb2xpY3lfb2NpLnJvb3QucmVhZG9ubHkiKQogICAgcG9saWN5X29jaS5yb290LnJlYWRvbmx5ICA9PSBpbnB1dF9vY2kucm9vdC5yZWFkb25seQoKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0OiBhbGxvdyBhbm5vdGF0aW9ucyIpCiAgICBhbGxvd19hbm5vdGF0aW9ucyhwb2xpY3lfb2NpLCBpbnB1dF9vY2kpCgogICAgcHJpbnQoIkNyZWF0ZUNvbnRhaW5lclJlcXVlc3Q6IGFsbG93X2J5X2Fubm90YXRpb25zIikKICAgIGFsbG93X2J5X2Fubm90YXRpb25zKHBvbGljeV9vY2ksIGlucHV0X29jaSwgcG9saWN5X3N0b3JhZ2VzLCBpbnB1dF9zdG9yYWdlcykKCiAgICBwcmludCgiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdDogYWxsb3dfbGludXgiKQogICAgYWxsb3dfbGludXgocG9saWN5X29jaSwgaW5wdXRfb2NpKQoKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0OiBzdWNjZXNzIikKfQoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIFJlamVjdCB1bmV4cGVjdGVkIGFubm90YXRpb25zLgphbGxvd19hbm5vdGF0aW9ucyhwb2xpY3lfb2NpLCBpbnB1dF9vY2kpIHsKICAgIG5vdCBpbnB1dF9vY2kuYW5ub3RhdGlvbnMKfQphbGxvd19hbm5vdGF0aW9ucyhwb2xpY3lfb2NpLCBpbnB1dF9vY2kpIHsKICAgIGlucHV0X2tleXMgOj0gb2JqZWN0LmtleXMoaW5wdXRfb2NpLmFubm90YXRpb25zKQoKICAgIGV2ZXJ5IGlucHV0X2tleSBpbiBpbnB1dF9rZXlzIHsKICAgICAgICBwcmludCgiYWxsb3dfYW5ub3RhdGlvbnM6IGNoZWNraW5nIGlucHV0IGtleSA9IiwgaW5wdXRfa2V5KQogICAgICAgIGFsbG93X2Fubm90YXRpb25fa2V5KGlucHV0X2tleSwgcG9saWN5X29jaSkKICAgIH0KfQoKYWxsb3dfYW5ub3RhdGlvbl9rZXkoaW5wdXRfa2V5LCBwb2xpY3lfb2NpKSB7CiAgICBzdGFydHN3aXRoKGlucHV0X2tleSwgImlvLmt1YmVybmV0ZXMuY3JpLiIpCn0KYWxsb3dfYW5ub3RhdGlvbl9rZXkoaW5wdXRfa2V5LCBwb2xpY3lfb2NpKSB7CiAgICBzb21lIHBvbGljeV9rZXksIF8gaW4gcG9saWN5X29jaS5hbm5vdGF0aW9ucwogICAgcG9saWN5X2tleSA9PSBpbnB1dF9rZXkKfQoKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBHZXQgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZSIsIGFuZCBjb3JyZWxhdGUgaXRzIHZhbHVlIHdpdGggb3RoZXIKIyBhbm5vdGF0aW9ucyBhbmQgcHJvY2VzcyBmaWVsZHMuCgphbGxvd19ieV9hbm5vdGF0aW9ucyhwb2xpY3lfb2NpLCBpbnB1dF9vY2ksIHBvbGljeV9zdG9yYWdlcywgaW5wdXRfc3RvcmFnZXMpIHsKICAgIHByaW50KCJhbGxvd19ieV9hbm5vdGF0aW9ucyAxOiBubyBpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LW5hbWUgaW4gcG9saWN5IikKICAgIG5vdCBwb2xpY3lfb2NpLmFubm90YXRpb25zWyJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LW5hbWUiXQoKICAgIGlucHV0X3NhbmRib3hfbmFtZSA6PSBpbnB1dF9vY2kuYW5ub3RhdGlvbnNbImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZSJdCgogICAgcHJpbnQoImFsbG93X2J5X2Fubm90YXRpb25zIDE6IGFsbG93X2J5X3NhbmRib3hfbmFtZSIsIGlucHV0X3NhbmRib3hfbmFtZSkKICAgIGFsbG93X2J5X3NhbmRib3hfbmFtZShwb2xpY3lfb2NpLCBpbnB1dF9vY2ksIHBvbGljeV9zdG9yYWdlcywgaW5wdXRfc3RvcmFnZXMsIGlucHV0X3NhbmRib3hfbmFtZSkKCiAgICBwcmludCgiYWxsb3dfYnlfYW5ub3RhdGlvbnMgMTogc3VjY2VzcyIpCn0KYWxsb3dfYnlfYW5ub3RhdGlvbnMocG9saWN5X29jaSwgaW5wdXRfb2NpLCBwb2xpY3lfc3RvcmFnZXMsIGlucHV0X3N0b3JhZ2VzKSB7CiAgICBwcmludCgiYWxsb3dfYnlfYW5ub3RhdGlvbnMgMjogaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1uYW1lIikKICAgIHBvbGljeV9zYW5kYm94X25hbWUgOj0gcG9saWN5X29jaS5hbm5vdGF0aW9uc1siaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1uYW1lIl0KICAgIGlucHV0X3NhbmRib3hfbmFtZSA6PSBpbnB1dF9vY2kuYW5ub3RhdGlvbnNbImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZSJdCgogICAgcHJpbnQoImFsbG93X2J5X2Fubm90YXRpb25zIDI6IGlucHV0IHNhbmRib3ggPSIsIGlucHV0X3NhbmRib3hfbmFtZSwgInBvbGljeSBzYW5kYm94ID0iLCBwb2xpY3lfc2FuZGJveF9uYW1lKQogICAgYWxsb3dfc2FuZGJveF9uYW1lKHBvbGljeV9zYW5kYm94X25hbWUsIGlucHV0X3NhbmRib3hfbmFtZSkKCiAgICBwcmludCgiYWxsb3dfYnlfYW5ub3RhdGlvbnMgMjogYWxsb3dfYnlfc2FuZGJveF9uYW1lIiwgaW5wdXRfc2FuZGJveF9uYW1lKQogICAgYWxsb3dfYnlfc2FuZGJveF9uYW1lKHBvbGljeV9vY2ksIGlucHV0X29jaSwgcG9saWN5X3N0b3JhZ2VzLCBpbnB1dF9zdG9yYWdlcywgaW5wdXRfc2FuZGJveF9uYW1lKQoKICAgIHByaW50KCJhbGxvd19ieV9hbm5vdGF0aW9ucyAyOiBzdWNjZXNzIikKfQoKYWxsb3dfYnlfc2FuZGJveF9uYW1lKHBvbGljeV9vY2ksIGlucHV0X29jaSwgcG9saWN5X3N0b3JhZ2VzLCBpbnB1dF9zdG9yYWdlcywgc2FuZGJveF9uYW1lKSB7CiAgICBwcmludCgiYWxsb3dfYnlfc2FuZGJveF9uYW1lOiBzdGFydGluZyIpCgogICAgcG9saWN5X25hbWVzcGFjZSA6PSBwb2xpY3lfb2NpLmFubm90YXRpb25zWyJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LW5hbWVzcGFjZSJdCiAgICBpbnB1dF9uYW1lc3BhY2UgOj0gaW5wdXRfb2NpLmFubm90YXRpb25zWyJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LW5hbWVzcGFjZSJdCiAgICBwcmludCgiYWxsb3dfYnlfc2FuZGJveF9uYW1lOiBwb2xpY3lfbmFtZXNwYWNlID0iLCBwb2xpY3lfbmFtZXNwYWNlLCAiaW5wdXRfbmFtZXNwYWNlID0iLCBpbnB1dF9uYW1lc3BhY2UpCiAgICBwb2xpY3lfbmFtZXNwYWNlID09IGlucHV0X25hbWVzcGFjZQoKICAgIHByaW50KCJhbGxvd19ieV9zYW5kYm94X25hbWU6IGFsbG93X2J5X2NvbnRhaW5lcl90eXBlcyIpCiAgICBhbGxvd19ieV9jb250YWluZXJfdHlwZXMocG9saWN5X29jaSwgaW5wdXRfb2NpLCBzYW5kYm94X25hbWUsIHBvbGljeV9uYW1lc3BhY2UpCgogICAgcHJpbnQoImFsbG93X2J5X3NhbmRib3hfbmFtZTogYWxsb3dfYnlfYnVuZGxlX29yX3NhbmRib3hfaWQiKQogICAgYWxsb3dfYnlfYnVuZGxlX29yX3NhbmRib3hfaWQocG9saWN5X29jaSwgaW5wdXRfb2NpLCBwb2xpY3lfc3RvcmFnZXMsIGlucHV0X3N0b3JhZ2VzKQoKICAgIHByaW50KCJhbGxvd19ieV9zYW5kYm94X25hbWU6IGFsbG93X3Byb2Nlc3MiKQogICAgYWxsb3dfcHJvY2Vzcyhwb2xpY3lfb2NpLCBpbnB1dF9vY2ksIHNhbmRib3hfbmFtZSkKCiAgICBwcmludCgiYWxsb3dfYnlfc2FuZGJveF9uYW1lOiBzdWNjZXNzIikKfQoKYWxsb3dfc2FuZGJveF9uYW1lKHBvbGljeV9zYW5kYm94X25hbWUsIGlucHV0X3NhbmRib3hfbmFtZSkgewogICAgcHJpbnQoImFsbG93X3NhbmRib3hfbmFtZSAxOiBzYW1lIG5hbWUiKQogICAgcG9saWN5X3NhbmRib3hfbmFtZSA9PSBpbnB1dF9zYW5kYm94X25hbWUKICAgIHByaW50KCJhbGxvd19zYW5kYm94X25hbWUgMTogc3VjY2VzcyIpCn0KYWxsb3dfc2FuZGJveF9uYW1lKHBvbGljeV9zYW5kYm94X25hbWUsIGlucHV0X3NhbmRib3hfbmFtZSkgewogICAgcHJpbnQoImFsbG93X3NhbmRib3hfbmFtZSAyOiBnZW5lcmF0ZWQgbmFtZSIpCgogICAgIyBUT0RPOiBzaG91bGQgZ2VuZXJhdGVkIG5hbWVzIGJlIGhhbmRsZWQgZGlmZmVyZW50bHk/CiAgICBjb250YWlucyhwb2xpY3lfc2FuZGJveF9uYW1lLCAiJChnZW5lcmF0ZWQtbmFtZSkiKQoKICAgIHByaW50KCJhbGxvd19zYW5kYm94X25hbWUgMjogc3VjY2VzcyIpCn0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIC0gQ2hlY2sgdGhhdCB0aGUgImlvLmt1YmVybmV0ZXMuY3JpLmNvbnRhaW5lci10eXBlIiBhbmQKIyAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIiBhbm5vdGF0aW9ucwojICAgZGVzaWduYXRlIHRoZSBleHBlY3RlZCB0eXBlIC0gZWl0aGVyIGEgInNhbmRib3giIG9yIGEKIyAgICJjb250YWluZXIiIHR5cGUuCiMKIyAtIFRoZW4sIHZhbGlkYXRlIG90aGVyIGFubm90YXRpb25zIGJhc2VkIG9uIHRoZSBhY3R1YWwKIyAgICJzYW5kYm94IiBvciAiY29udGFpbmVyIiB2YWx1ZSBmcm9tIHRoZSBpbnB1dCBjb250YWluZXIuCgphbGxvd19ieV9jb250YWluZXJfdHlwZXMocG9saWN5X29jaSwgaW5wdXRfb2NpLCBzYW5kYm94X25hbWUsIHNhbmRib3hfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfYnlfY29udGFpbmVyX3R5cGVzOiBjaGVja2luZyBpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSIpCiAgICAKICAgIHBvbGljeV9jcmlfdHlwZSA6PSBwb2xpY3lfb2NpLmFubm90YXRpb25zWyJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSJdCiAgICBwcmludCgiYWxsb3dfYnlfY29udGFpbmVyX3R5cGVzOiBwb2xpY3kgdHlwZSA9IiwgcG9saWN5X2NyaV90eXBlKQogICAgCiAgICBpbnB1dF9jcmlfdHlwZSA6PSBpbnB1dF9vY2kuYW5ub3RhdGlvbnNbImlvLmt1YmVybmV0ZXMuY3JpLmNvbnRhaW5lci10eXBlIl0KICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZXM6IGlucHV0IHR5cGUgPSIsIGlucHV0X2NyaV90eXBlKQogICAgCiAgICBwb2xpY3lfY3JpX3R5cGUgPT0gaW5wdXRfY3JpX3R5cGUKCiAgICBwcmludCgiYWxsb3dfYnlfY29udGFpbmVyX3R5cGVzOiBhbGxvd19ieV9jb250YWluZXJfdHlwZSIpCiAgICBhbGxvd19ieV9jb250YWluZXJfdHlwZShpbnB1dF9jcmlfdHlwZSwgcG9saWN5X29jaSwgaW5wdXRfb2NpLCBzYW5kYm94X25hbWUsIHNhbmRib3hfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZXM6IHN1Y2Nlc3MiKQp9CgojIFJ1bGVzIGFwcGxpY2FibGUgdG8gdGhlICJzYW5kYm94IiBjb250YWluZXIgdHlwZQphbGxvd19ieV9jb250YWluZXJfdHlwZShpbnB1dF9jcmlfdHlwZSwgcG9saWN5X29jaSwgaW5wdXRfb2NpLCBzYW5kYm94X25hbWUsIHNhbmRib3hfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfYnlfY29udGFpbmVyX3R5cGUgMTogaW5wdXRfY3JpX3R5cGUgPSIsIGlucHV0X2NyaV90eXBlKQogICAgaW5wdXRfY3JpX3R5cGUgPT0gInNhbmRib3giCgogICAgaW5wdXRfa2F0YV90eXBlIDo9IGlucHV0X29jaS5hbm5vdGF0aW9uc1siaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5jb250YWluZXJfdHlwZSJdCiAgICBwcmludCgiYWxsb3dfYnlfY29udGFpbmVyX3R5cGUgMTogaW5wdXQgY29udGFpbmVyIHR5cGUiLCBpbnB1dF9rYXRhX3R5cGUpCiAgICBpbnB1dF9rYXRhX3R5cGUgPT0gInBvZF9zYW5kYm94IgoKICAgIGFsbG93X3NhbmRib3hfY29udGFpbmVyX25hbWUocG9saWN5X29jaSwgaW5wdXRfb2NpKQogICAgYWxsb3dfc2FuZGJveF9uZXRfbmFtZXNwYWNlKHBvbGljeV9vY2ksIGlucHV0X29jaSkKICAgIGFsbG93X3NhbmRib3hfbG9nX2RpcmVjdG9yeShwb2xpY3lfb2NpLCBpbnB1dF9vY2ksIHNhbmRib3hfbmFtZSwgc2FuZGJveF9uYW1lc3BhY2UpCgogICAgcHJpbnQoImFsbG93X2J5X2NvbnRhaW5lcl90eXBlIDE6IHN1Y2Nlc3MiKQp9CgojIFJ1bGVzIGFwcGxpY2FibGUgdG8gdGhlICJjb250YWluZXIiIGNvbnRhaW5lciB0eXBlCmFsbG93X2J5X2NvbnRhaW5lcl90eXBlKGlucHV0X2NyaV90eXBlLCBwb2xpY3lfb2NpLCBpbnB1dF9vY2ksIHNhbmRib3hfbmFtZSwgc2FuZGJveF9uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiBpbnB1dF9jcmlfdHlwZSA9IiwgaW5wdXRfY3JpX3R5cGUpCiAgICBpbnB1dF9jcmlfdHlwZSA9PSAiY29udGFpbmVyIgoKICAgIGlucHV0X2thdGFfdHlwZSA6PSBpbnB1dF9vY2kuYW5ub3RhdGlvbnNbImlvLmthdGFjb250YWluZXJzLnBrZy5vY2kuY29udGFpbmVyX3R5cGUiXQogICAgcHJpbnQoImFsbG93X2J5X2NvbnRhaW5lcl90eXBlIDI6IGlucHV0IHR5cGUiLCBpbnB1dF9rYXRhX3R5cGUpCiAgICBpbnB1dF9rYXRhX3R5cGUgPT0gInBvZF9jb250YWluZXIiCgogICAgcHJpbnQoImFsbG93X2J5X2NvbnRhaW5lcl90eXBlIDI6IGFsbG93X2NvbnRhaW5lcl9uYW1lIikKICAgIGFsbG93X2NvbnRhaW5lcl9uYW1lKHBvbGljeV9vY2ksIGlucHV0X29jaSkKCiAgICBwcmludCgiYWxsb3dfYnlfY29udGFpbmVyX3R5cGUgMjogYWxsb3dfbmV0X25hbWVzcGFjZSIpCiAgICBhbGxvd19uZXRfbmFtZXNwYWNlKHBvbGljeV9vY2ksIGlucHV0X29jaSkKCiAgICBwcmludCgiYWxsb3dfYnlfY29udGFpbmVyX3R5cGUgMjogYWxsb3dfbG9nX2RpcmVjdG9yeSIpCiAgICBhbGxvd19sb2dfZGlyZWN0b3J5KHBvbGljeV9vY2ksIGlucHV0X29jaSkKCiAgICBwcmludCgiYWxsb3dfYnlfY29udGFpbmVyX3R5cGUgMjogc3VjY2VzcyIpCn0KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLW5hbWUiIGFubm90YXRpb24KCmFsbG93X3NhbmRib3hfY29udGFpbmVyX25hbWUocG9saWN5X29jaSwgaW5wdXRfb2NpKSB7CiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9jb250YWluZXJfbmFtZTogY29udGFpbmVyX2Fubm90YXRpb25fbWlzc2luZyIpCiAgICBjb250YWluZXJfYW5ub3RhdGlvbl9taXNzaW5nKHBvbGljeV9vY2ksIGlucHV0X29jaSwgImlvLmt1YmVybmV0ZXMuY3JpLmNvbnRhaW5lci1uYW1lIikKICAgIHByaW50KCJhbGxvd19zYW5kYm94X2NvbnRhaW5lcl9uYW1lOiBzdWNjZXNzIikKfQoKYWxsb3dfY29udGFpbmVyX25hbWUocG9saWN5X29jaSwgaW5wdXRfb2NpKSB7CiAgICBwcmludCgiYWxsb3dfY29udGFpbmVyX25hbWU6IGFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uIikKICAgIGFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uKHBvbGljeV9vY2ksIGlucHV0X29jaSwgImlvLmt1YmVybmV0ZXMuY3JpLmNvbnRhaW5lci1uYW1lIikKICAgIHByaW50KCJhbGxvd19jb250YWluZXJfbmFtZTogc3VjY2VzcyIpCn0KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBBbm5vdGlvbnMgcmVxdWlyZWQgZm9yICJjb250YWluZXIiIHR5cGUsIGFuZCBub3QgYWxsb3dlZCBmb3IgInNhbmRib3giIHR5cGUuCgpjb250YWluZXJfYW5ub3RhdGlvbl9taXNzaW5nKHBvbGljeV9vY2ksIGlucHV0X29jaSwgYW5ub3RhdGlvbl9rZXkpIHsKICAgIHByaW50KCJjb250YWluZXJfYW5ub3RhdGlvbl9taXNzaW5nOiIsIGFubm90YXRpb25fa2V5KQoKICAgIG5vdCBwb2xpY3lfb2NpLmFubm90YXRpb25zW2Fubm90YXRpb25fa2V5XQogICAgbm90IGlucHV0X29jaS5hbm5vdGF0aW9uc1thbm5vdGF0aW9uX2tleV0KCiAgICBwcmludCgiY29udGFpbmVyX2Fubm90YXRpb25fbWlzc2luZzogc3VjY2VzcyIpCn0KCmFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uKHBvbGljeV9vY2ksIGlucHV0X29jaSwgYW5ub3RhdGlvbl9rZXkpIHsKICAgIHByaW50KCJhbGxvd19jb250YWluZXJfYW5ub3RhdGlvbjogYW5ub3RhdGlvbl9rZXkgPSIsIGFubm90YXRpb25fa2V5KQoKICAgIHBvbGljeV92YWx1ZSA6PSBwb2xpY3lfb2NpLmFubm90YXRpb25zW2Fubm90YXRpb25fa2V5XQogICAgcHJpbnQoImFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uOiBwb2xpY3lfdmFsdWUgPSIsIHBvbGljeV92YWx1ZSkKCiAgICBpbnB1dF92YWx1ZSA6PSBpbnB1dF9vY2kuYW5ub3RhdGlvbnNbYW5ub3RhdGlvbl9rZXldCiAgICBwcmludCgiYWxsb3dfY29udGFpbmVyX2Fubm90YXRpb246IGlucHV0X3ZhbHVlID0gIiwgaW5wdXRfdmFsdWUpCgogICAgcG9saWN5X3ZhbHVlID09IGlucHV0X3ZhbHVlCiAgICBwcmludCgiYWxsb3dfY29udGFpbmVyX2Fubm90YXRpb246IHN1Y2Nlc3MiKQp9CgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgIm5lcmRjdGwvbmV0d29yay1uYW1lc3BhY2UiIGFubm90YXRpb24KCmFsbG93X3NhbmRib3hfbmV0X25hbWVzcGFjZShwb2xpY3lfb2NpLCBpbnB1dF9vY2kpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X25ldF9uYW1lc3BhY2U6IHN0YXJ0IikKCiAgICBwb2xpY3lfbmFtZXNwYWNlIDo9IHBvbGljeV9vY2kuYW5ub3RhdGlvbnNbIm5lcmRjdGwvbmV0d29yay1uYW1lc3BhY2UiXQogICAgcHJpbnQoImFsbG93X3NhbmRib3hfbmV0X25hbWVzcGFjZTogcG9saWN5X25hbWVzcGFjZSA9IiwgcG9saWN5X25hbWVzcGFjZSkKCiAgICBpbnB1dF9uYW1lc3BhY2UgOj0gaW5wdXRfb2NpLmFubm90YXRpb25zWyJuZXJkY3RsL25ldHdvcmstbmFtZXNwYWNlIl0KICAgIHByaW50KCJhbGxvd19zYW5kYm94X25ldF9uYW1lc3BhY2U6IGlucHV0X25hbWVzcGFjZSA9IiwgaW5wdXRfbmFtZXNwYWNlKQoKICAgIHJlZ2V4Lm1hdGNoKHBvbGljeV9uYW1lc3BhY2UsIGlucHV0X25hbWVzcGFjZSkKICAgIHByaW50KCJhbGxvd19zYW5kYm94X25ldF9uYW1lc3BhY2U6IHN1Y2Nlc3MiKQp9CgphbGxvd19uZXRfbmFtZXNwYWNlKHBvbGljeV9vY2ksIGlucHV0X29jaSkgewogICAgcHJpbnQoImFsbG93X25ldF9uYW1lc3BhY2U6IHN0YXJ0IikKCiAgICBub3QgcG9saWN5X29jaS5hbm5vdGF0aW9uc1sibmVyZGN0bC9uZXR3b3JrLW5hbWVzcGFjZSJdCiAgICBub3QgaW5wdXRfb2NpLmFubm90YXRpb25zWyJuZXJkY3RsL25ldHdvcmstbmFtZXNwYWNlIl0KCiAgICBwcmludCgiYWxsb3dfbmV0X25hbWVzcGFjZTogc3VjY2VzcyIpCn0KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1sb2ctZGlyZWN0b3J5IiBhbm5vdGF0aW9uCgphbGxvd19zYW5kYm94X2xvZ19kaXJlY3RvcnkocG9saWN5X29jaSwgaW5wdXRfb2NpLCBzYW5kYm94X25hbWUsIHNhbmRib3hfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiBzdGFydCIpCgogICAgcG9saWN5X2xvZ19kaXJlY3RvcnkgOj0gcG9saWN5X29jaS5hbm5vdGF0aW9uc1siaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1sb2ctZGlyZWN0b3J5Il0KICAgIGRpcmVjdG9yeV9yZWdleF90bXAgOj0gcmVwbGFjZShwb2xpY3lfbG9nX2RpcmVjdG9yeSwgIiQoc2FuZGJveC1uYW1lKSIsIHNhbmRib3hfbmFtZSkKICAgIGRpcmVjdG9yeV9yZWdleCA6PSByZXBsYWNlKGRpcmVjdG9yeV9yZWdleF90bXAsICIkKHNhbmRib3gtbmFtZXNwYWNlKSIsIHNhbmRib3hfbmFtZXNwYWNlKQogICAgcHJpbnQoImFsbG93X3NhbmRib3hfbG9nX2RpcmVjdG9yeTogcG9saWN5IHJlZ2V4ID0iLCBkaXJlY3RvcnlfcmVnZXgpCgogICAgaW5wdXRfbG9nX2RpcmVjdG9yeSA6PSBpbnB1dF9vY2kuYW5ub3RhdGlvbnNbImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbG9nLWRpcmVjdG9yeSJdCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiBpbnB1dCA9IiwgaW5wdXRfbG9nX2RpcmVjdG9yeSkKCiAgICByZWdleC5tYXRjaChkaXJlY3RvcnlfcmVnZXgsIGlucHV0X2xvZ19kaXJlY3RvcnkpCgogICAgcHJpbnQoImFsbG93X3NhbmRib3hfbG9nX2RpcmVjdG9yeTogc3VjY2VzcyIpCn0KCmFsbG93X2xvZ19kaXJlY3RvcnkocG9saWN5X29jaSwgaW5wdXRfb2NpKSB7CiAgICBub3QgcG9saWN5X29jaS5hbm5vdGF0aW9uc1siaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1sb2ctZGlyZWN0b3J5Il0KICAgIG5vdCBpbnB1dF9vY2kuYW5ub3RhdGlvbnNbImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbG9nLWRpcmVjdG9yeSJdCn0KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBWYWxpZGF0ZSB0aGUgbGludXggZmllbGRzIGZyb20gY29uZmlnLmpzb24uCgphbGxvd19saW51eChwb2xpY3lfb2NpLCBpbnB1dF9vY2kpIHsKICAgIHByaW50KCJhbGxvd19saW51eDogcG9saWN5IG5hbWVzcGFjZXMgPSIsIHBvbGljeV9vY2kubGludXgubmFtZXNwYWNlcykKICAgIHByaW50KCJhbGxvd19saW51eDogaW5wdXQgbmFtZXNwYWNlcyA9IiwgaW5wdXRfb2NpLmxpbnV4Lm5hbWVzcGFjZXMpCiAgICBwb2xpY3lfb2NpLmxpbnV4Lm5hbWVzcGFjZXMgICAgID09IGlucHV0X29jaS5saW51eC5uYW1lc3BhY2VzCgogICAgcHJpbnQoImFsbG93X2xpbnV4OiBhbGxvd19tYXNrZWRfcGF0aHMiKQogICAgYWxsb3dfbWFza2VkX3BhdGhzKHBvbGljeV9vY2ksIGlucHV0X29jaSkKCiAgICBwcmludCgiYWxsb3dfbGludXg6IGFsbG93X3JlYWRvbmx5X3BhdGhzIikKICAgIGFsbG93X3JlYWRvbmx5X3BhdGhzKHBvbGljeV9vY2ksIGlucHV0X29jaSkKCiAgICBwcmludCgiYWxsb3dfbGludXg6IHN1Y2Nlc3MiKQp9CgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmFsbG93X21hc2tlZF9wYXRocyhwb2xpY3lfb2NpLCBpbnB1dF9vY2kpIHsKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aHMgMTogcG9saWN5IG1hc2tlZFBhdGhzID0iLCBwb2xpY3lfb2NpLmxpbnV4Lm1hc2tlZFBhdGhzKQogICAgcHJpbnQoImFsbG93X21hc2tlZF9wYXRocyAxOiBpbnB1dCBtYXNrZWRQYXRocyA9IiwgaW5wdXRfb2NpLmxpbnV4Lm1hc2tlZFBhdGhzKQoKICAgIGFsbG93X21hc2tlZF9wYXRoc19hcnJheShwb2xpY3lfb2NpLmxpbnV4Lm1hc2tlZFBhdGhzLCBpbnB1dF9vY2kubGludXgubWFza2VkUGF0aHMpCgogICAgcHJpbnQoImFsbG93X21hc2tlZF9wYXRocyAxOiBzdWNjZXNzIikKfQphbGxvd19tYXNrZWRfcGF0aHMocG9saWN5X29jaSwgaW5wdXRfb2NpKSB7CiAgICBwcmludCgiYWxsb3dfbWFza2VkX3BhdGhzIDI6IG5vIG1hc2tlZFBhdGhzIikKCiAgICBub3QgcG9saWN5X29jaS5saW51eC5tYXNrZWRQYXRocwogICAgbm90IGlucHV0X29jaS5saW51eC5tYXNrZWRQYXRocwoKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aHMgMjogc3VjY2VzcyIpCn0KCiMgQWxsIHRoZSBwb2xpY3kgbWFza2VkIHBhdGhzIG11c3QgYmUgbWFza2VkIGluIHRoZSBpbnB1dCBkYXRhIHRvby4KIyBJbnB1dCBpcyBhbGxvd2VkIHRvIGhhdmUgbW9yZSBtYXNrZWQgcGF0aHMgdGhhbiB0aGUgcG9saWN5LgphbGxvd19tYXNrZWRfcGF0aHNfYXJyYXkocG9saWN5X2FycmF5LCBpbnB1dF9hcnJheSkgewogICAgZXZlcnkgcG9saWN5X2VsZW1lbnQgaW4gcG9saWN5X2FycmF5IHsKICAgICAgICBhbGxvd19tYXNrZWRfcGF0aChwb2xpY3lfZWxlbWVudCwgaW5wdXRfYXJyYXkpCiAgICB9Cn0KCmFsbG93X21hc2tlZF9wYXRoKHBvbGljeV9lbGVtZW50LCBpbnB1dF9hcnJheSkgewogICAgcHJpbnQoImFsbG93X21hc2tlZF9wYXRoOiBwb2xpY3lfZWxlbWVudCA9IiwgcG9saWN5X2VsZW1lbnQpCgogICAgc29tZSBpbnB1dF9lbGVtZW50IGluIGlucHV0X2FycmF5CiAgICBwb2xpY3lfZWxlbWVudCA9PSBpbnB1dF9lbGVtZW50CgogICAgcHJpbnQoImFsbG93X21hc2tlZF9wYXRoOiBzdWNjZXNzIikKfQoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwphbGxvd19yZWFkb25seV9wYXRocyhwb2xpY3lfb2NpLCBpbnB1dF9vY2kpIHsKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAxOiBwb2xpY3kgcmVhZG9ubHlQYXRocyA9IiwgcG9saWN5X29jaS5saW51eC5yZWFkb25seVBhdGhzKQogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGhzIDE6IGlucHV0IHJlYWRvbmx5UGF0aHMgPSIsIGlucHV0X29jaS5saW51eC5yZWFkb25seVBhdGhzKQoKICAgIGFsbG93X3JlYWRvbmx5X3BhdGhzX2FycmF5KHBvbGljeV9vY2kubGludXgucmVhZG9ubHlQYXRocywgaW5wdXRfb2NpLmxpbnV4LnJlYWRvbmx5UGF0aHMsIGlucHV0X29jaS5saW51eC5tYXNrZWRQYXRocykKCiAgICBwcmludCgiYWxsb3dfcmVhZG9ubHlfcGF0aHMgMTogc3VjY2VzcyIpCn0KYWxsb3dfcmVhZG9ubHlfcGF0aHMocG9saWN5X29jaSwgaW5wdXRfb2NpKSB7CiAgICBwcmludCgiYWxsb3dfcmVhZG9ubHlfcGF0aHMgMjogbm8gcmVhZG9ubHlQYXRocyIpCgogICAgbm90IHBvbGljeV9vY2kubGludXgucmVhZG9ubHlQYXRocwogICAgbm90IGlucHV0X29jaS5saW51eC5yZWFkb25seVBhdGhzCgogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGhzIDI6IHN1Y2Nlc3MiKQp9CgojIEFsbCB0aGUgcG9saWN5IHJlYWRvbmx5IHBhdGhzIG11c3QgYmUgZWl0aGVyOgojIC0gUHJlc2VudCBpbiB0aGUgaW5wdXQgcmVhZG9ubHkgcGF0aHMsIG9yCiMgLSBQcmVzZW50IGluIHRoZSBpbnB1dCBtYXNrZWQgcGF0aHMuCiMgSW5wdXQgaXMgYWxsb3dlZCB0byBoYXZlIG1vcmUgcmVhZG9ubHkgcGF0aHMgdGhhbiB0aGUgcG9saWN5LgphbGxvd19yZWFkb25seV9wYXRoc19hcnJheShwb2xpY3lfYXJyYXksIGlucHV0X2FycmF5LCBtYXNrZWRfcGF0aHMpIHsKICAgIGV2ZXJ5IHBvbGljeV9lbGVtZW50IGluIHBvbGljeV9hcnJheSB7CiAgICAgICAgYWxsb3dfcmVhZG9ubHlfcGF0aChwb2xpY3lfZWxlbWVudCwgaW5wdXRfYXJyYXksIG1hc2tlZF9wYXRocykKICAgIH0KfQoKYWxsb3dfcmVhZG9ubHlfcGF0aChwb2xpY3lfZWxlbWVudCwgaW5wdXRfYXJyYXksIG1hc2tlZF9wYXRocykgewogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGggMTogcG9saWN5X2VsZW1lbnQgPSIsIHBvbGljeV9lbGVtZW50KQoKICAgIHNvbWUgaW5wdXRfZWxlbWVudCBpbiBpbnB1dF9hcnJheQogICAgcG9saWN5X2VsZW1lbnQgPT0gaW5wdXRfZWxlbWVudAoKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRoIDE6IHN1Y2Nlc3MiKQp9CmFsbG93X3JlYWRvbmx5X3BhdGgocG9saWN5X2VsZW1lbnQsIGlucHV0X2FycmF5LCBtYXNrZWRfcGF0aHMpIHsKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRoIDI6IHBvbGljeV9lbGVtZW50ID0iLCBwb2xpY3lfZWxlbWVudCkKCiAgICBzb21lIGlucHV0X21hc2tlZCBpbiBtYXNrZWRfcGF0aHMKICAgIHBvbGljeV9lbGVtZW50ID09IGlucHV0X21hc2tlZAoKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRoIDI6IHN1Y2Nlc3MiKQp9CgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgR2V0IHRoZSBpbnB1dDoKIwojIC0gYnVuZGxlX2lkIGZyb20gImlvLmthdGFjb250YWluZXJzLnBrZy5vY2kuYnVuZGxlX3BhdGgiCiMgLSBzYW5kYm94X2lkIGZyb20gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtaWQiCiMKIyBhbmQgY2hlY2sgdGhlaXIgY29uc2lzdGVuY3kgd2l0aCBvdGhlciBydWxlcy4KCmFsbG93X2J5X2J1bmRsZV9vcl9zYW5kYm94X2lkKHBvbGljeV9vY2ksIGlucHV0X29jaSwgcG9saWN5X3N0b3JhZ2VzLCBpbnB1dF9zdG9yYWdlcykgewogICAgcHJpbnQoImFsbG93X2J5X2J1bmRsZV9vcl9zYW5kYm94X2lkOiBjaGVja2luZyBpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmJ1bmRsZV9wYXRoIikKICAgIGJ1bmRsZV9wYXRoIDo9IGlucHV0X29jaS5hbm5vdGF0aW9uc1siaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5idW5kbGVfcGF0aCJdCiAgICBidW5kbGVfaWQgOj0gcmVwbGFjZShidW5kbGVfcGF0aCwgIi9ydW4vY29udGFpbmVyZC9pby5jb250YWluZXJkLnJ1bnRpbWUudjIudGFzay9rOHMuaW8vIiwgIiIpCgogICAgcG9saWN5X3NhbmRib3hfcmVnZXggOj0gcG9saWN5X29jaS5hbm5vdGF0aW9uc1siaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCJdCiAgICBzYW5kYm94X2lkIDo9IGlucHV0X29jaS5hbm5vdGF0aW9uc1siaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCJdCgogICAgcHJpbnQoImFsbG93X2J5X2J1bmRsZV9vcl9zYW5kYm94X2lkOiByZWdleC5tYXRjaCBzYW5kYm94X2lkID0iLCBzYW5kYm94X2lkLCAicmVnZXggPSIsIHBvbGljeV9zYW5kYm94X3JlZ2V4KQogICAgcmVnZXgubWF0Y2gocG9saWN5X3NhbmRib3hfcmVnZXgsIHNhbmRib3hfaWQpCgogICAgcHJpbnQoImFsbG93X2J5X2J1bmRsZV9vcl9zYW5kYm94X2lkOiBhbGxvd19yb290X3BhdGgiKQogICAgYWxsb3dfcm9vdF9wYXRoKHBvbGljeV9vY2ksIGlucHV0X29jaSwgYnVuZGxlX2lkKQoKICAgIGV2ZXJ5IGlucHV0X21vdW50IGluIGlucHV0Lm9jaS5tb3VudHMgewogICAgICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogYWxsb3dfbW91bnQiKQogICAgICAgIGFsbG93X21vdW50KHBvbGljeV9vY2ksIGlucHV0X21vdW50LCBidW5kbGVfaWQsIHNhbmRib3hfaWQpCiAgICB9CgogICAgcHJpbnQoImFsbG93X2J5X2J1bmRsZV9vcl9zYW5kYm94X2lkOiBhbGxvd19zdG9yYWdlcyIpCiAgICBhbGxvd19zdG9yYWdlcyhwb2xpY3lfc3RvcmFnZXMsIGlucHV0X3N0b3JhZ2VzLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpCgogICAgcHJpbnQoImFsbG93X2J5X2J1bmRsZV9vcl9zYW5kYm94X2lkOiBzdWNjZXNzIikKfQoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIFZhbGlkYXRlIHRoZSBwcm9jZXNzIGZpZWxkcyBmcm9tIGNvbmZpZy5qc29uLgoKYWxsb3dfcHJvY2Vzcyhwb2xpY3lfb2NpLCBpbnB1dF9vY2ksIHNhbmRib3hfbmFtZSkgewogICAgcG9saWN5X3Byb2Nlc3MgOj0gcG9saWN5X29jaS5wcm9jZXNzCiAgICBpbnB1dF9wcm9jZXNzIDo9IGlucHV0X29jaS5wcm9jZXNzCgogICAgcHJpbnQoImFsbG93X3Byb2Nlc3M6IGlucHV0IHRlcm1pbmFsID0iLCBpbnB1dF9wcm9jZXNzLnRlcm1pbmFsLCAicG9saWN5IHRlcm1pbmFsID0iLCBwb2xpY3lfcHJvY2Vzcy50ZXJtaW5hbCkKICAgIHBvbGljeV9wcm9jZXNzLnRlcm1pbmFsICAgICAgICAgPT0gaW5wdXRfcHJvY2Vzcy50ZXJtaW5hbAoKICAgIHByaW50KCJhbGxvd19wcm9jZXNzOiBpbnB1dCBjd2QgPSIsIGlucHV0X3Byb2Nlc3MuY3dkLCAicG9saWN5IGN3ZCA9IiwgcG9saWN5X3Byb2Nlc3MuY3dkKQogICAgcG9saWN5X3Byb2Nlc3MuY3dkICAgICAgICAgICAgICA9PSBpbnB1dF9wcm9jZXNzLmN3ZAoKICAgIHByaW50KCJhbGxvd19wcm9jZXNzOiBpbnB1dCBjYXBhYmlsaXRpZXMgPSIsIGlucHV0X3Byb2Nlc3MuY2FwYWJpbGl0aWVzKQogICAgcHJpbnQoImFsbG93X3Byb2Nlc3M6IHBvbGljeSBjYXBhYmlsaXRpZXMgPSIsIHBvbGljeV9wcm9jZXNzLmNhcGFiaWxpdGllcykKICAgIHBvbGljeV9wcm9jZXNzLmNhcGFiaWxpdGllcyAgICAgPT0gaW5wdXRfcHJvY2Vzcy5jYXBhYmlsaXRpZXMKCiAgICBwcmludCgiYWxsb3dfcHJvY2VzczogaW5wdXQgbm9OZXdQcml2aWxlZ2VzID0iLCBpbnB1dF9wcm9jZXNzLm5vTmV3UHJpdmlsZWdlcywgInBvbGljeSBub05ld1ByaXZpbGVnZXMgPSIsIHBvbGljeV9wcm9jZXNzLm5vTmV3UHJpdmlsZWdlcykKICAgIHBvbGljeV9wcm9jZXNzLm5vTmV3UHJpdmlsZWdlcyAgPT0gaW5wdXRfcHJvY2Vzcy5ub05ld1ByaXZpbGVnZXMKCiAgICBwcmludCgiYWxsb3dfcHJvY2VzczogYWxsb3dfdXNlciIpCiAgICBhbGxvd191c2VyKHBvbGljeV9wcm9jZXNzLCBpbnB1dF9wcm9jZXNzKQoKICAgIHByaW50KCJhbGxvd19wcm9jZXNzOiBhbGxvd19hcmdzIikKICAgIGFsbG93X2FyZ3MocG9saWN5X3Byb2Nlc3MsIGlucHV0X3Byb2Nlc3MsIHNhbmRib3hfbmFtZSkKCiAgICBwcmludCgiYWxsb3dfcHJvY2VzczogYWxsb3dfZW52IikKICAgIGFsbG93X2Vudihwb2xpY3lfcHJvY2VzcywgaW5wdXRfcHJvY2Vzcywgc2FuZGJveF9uYW1lKQoKICAgIHByaW50KCJhbGxvd19wcm9jZXNzOiBzdWNjZXNzIikKfQoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIE9DSSBwcm9jZXNzLnVzZXIgZmllbGQKCmFsbG93X3VzZXIocG9saWN5X3Byb2Nlc3MsIGlucHV0X3Byb2Nlc3MpIHsKICAgIHBvbGljeV91c2VyIDo9IHBvbGljeV9wcm9jZXNzLnVzZXIKICAgIGlucHV0X3VzZXIgOj0gaW5wdXRfcHJvY2Vzcy51c2VyCgogICAgIyBUT0RPOiB0cmFjayBkb3duIHRoZSByZWFzb24gZm9yIG1jci5taWNyb3NvZnQuY29tL29zcy9iaXRuYW1pL3JlZGlzOjYuMC44IGJlaW5nCiAgICAjICAgICAgIGV4ZWN1dGVkIHdpdGggdWlkID0gMCBkZXNwaXRlIGhhdmluZyAiVXNlciI6ICIxMDAxIiBpbiBpdHMgY29udGFpbmVyIGltYWdlCiAgICAjICAgICAgIGNvbmZpZy4KICAgICNwcmludCgiYWxsb3dfdXNlcjogaW5wdXQgdWlkID0iLCBpbnB1dF91c2VyLnVpZCwgInBvbGljeSB1aWQgPSIsIHBvbGljeV91c2VyLnVpZCkKICAgICNwb2xpY3lfdXNlci51aWQgICAgICAgICAgICAgICAgID09IGlucHV0X3VzZXIudWlkCgogICAgIyBUT0RPOiB0cmFjayBkb3duIHRoZSByZWFzb24gZm9yIHJlZ2lzdHJ5Lms4cy5pby9wYXVzZTozLjkgYmVpbmcKICAgICMgICAgICAgZXhlY3V0ZWQgd2l0aCBnaWQgPSAwIGRlc3BpdGUgaGF2aW5nICI2NTUzNTo2NTUzNSIgaW4gaXRzIGNvbnRhaW5lciBpbWFnZQogICAgIyAgICAgICBjb25maWcuCiAgICAjcHJpbnQoImFsbG93X3VzZXI6IGlucHV0IGdpZCA9IiwgaW5wdXRfdXNlci5naWQsICJwb2xpY3kgZ2lkID0iLCBwb2xpY3lfdXNlci5naWQpCiAgICAjcG9saWN5X3VzZXIuZ2lkICAgICAgICAgICAgICAgICA9PSBpbnB1dF91c2VyLmdpZAoKICAgICMgVE9ETzogY29tcGFyZSB0aGUgYWRkaXRpb25hbEdpZHMgZmllbGQgdG9vIGFmdGVyIGNvbXB1dGluZyBpdHMgdmFsdWUKICAgICMgYmFzZWQgb24gL2V0Yy9wYXNzd2QgYW5kIC9ldGMvZ3JvdXAgZnJvbSB0aGUgY29udGFpbmVyIGltYWdlLgp9CgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgT0NJIHByb2Nlc3MuYXJncyBmaWVsZAoKYWxsb3dfYXJncyhwb2xpY3lfcHJvY2VzcywgaW5wdXRfcHJvY2Vzcywgc2FuZGJveF9uYW1lKSB7CiAgICBwcmludCgiYWxsb3dfYXJncyAxOiBubyBhcmdzIikKCiAgICBub3QgcG9saWN5X3Byb2Nlc3MuYXJncwogICAgbm90IGlucHV0X3Byb2Nlc3MuYXJncwoKICAgIHByaW50KCJhbGxvd19hcmdzIDE6IHN1Y2Nlc3MiKQp9CmFsbG93X2FyZ3MocG9saWN5X3Byb2Nlc3MsIGlucHV0X3Byb2Nlc3MsIHNhbmRib3hfbmFtZSkgewogICAgcHJpbnQoImFsbG93X2FyZ3MgMjogcG9saWN5IGFyZ3MgPSIsIHBvbGljeV9wcm9jZXNzLmFyZ3MpCiAgICBwcmludCgiYWxsb3dfYXJncyAyOiBpbnB1dCBhcmdzID0iLCBpbnB1dF9wcm9jZXNzLmFyZ3MpCgogICAgY291bnQocG9saWN5X3Byb2Nlc3MuYXJncykgPT0gY291bnQoaW5wdXRfcHJvY2Vzcy5hcmdzKQoKICAgIGV2ZXJ5IGksIGlucHV0X2FyZyBpbiBpbnB1dF9wcm9jZXNzLmFyZ3MgewogICAgICAgIGFsbG93X2FyZyhpLCBpbnB1dF9hcmcsIHBvbGljeV9wcm9jZXNzLCBzYW5kYm94X25hbWUpCiAgICB9CgogICAgcHJpbnQoImFsbG93X2FyZ3MgMjogc3VjY2VzcyIpCn0KCmFsbG93X2FyZyhpLCBpbnB1dF9hcmcsIHBvbGljeV9wcm9jZXNzLCBzYW5kYm94X25hbWUpIHsKICAgIHByaW50KCJhbGxvd19hcmcgMTogaSA9IiwgaSwgImlucHV0X2FyZyA9IiwgaW5wdXRfYXJnLCAicG9saWN5X2FyZyA9IiwgcG9saWN5X3Byb2Nlc3MuYXJnc1tpXSkKICAgIGlucHV0X2FyZyA9PSBwb2xpY3lfcHJvY2Vzcy5hcmdzW2ldCiAgICBwcmludCgiYWxsb3dfYXJnIDE6IHN1Y2Nlc3MiKQp9CmFsbG93X2FyZyhpLCBpbnB1dF9hcmcsIHBvbGljeV9wcm9jZXNzLCBzYW5kYm94X25hbWUpIHsKICAgIHByaW50KCJhbGxvd19hcmcgMjogaSA9IiwgaSwgImlucHV0X2FyZyA9IiwgaW5wdXRfYXJnLCAicG9saWN5X2FyZyA9IiwgcG9saWN5X3Byb2Nlc3MuYXJnc1tpXSkKCiAgICAjIFRPRE86IGNhbiAkKG5vZGUtbmFtZSkgYmUgaGFuZGxlZCBiZXR0ZXI/CiAgICBjb250YWlucyhwb2xpY3lfcHJvY2Vzcy5hcmdzW2ldLCAiJChub2RlLW5hbWUpIikKCiAgICBwcmludCgiYWxsb3dfYXJnIDI6IHN1Y2Nlc3MiKQp9CmFsbG93X2FyZyhpLCBpbnB1dF9hcmcsIHBvbGljeV9wcm9jZXNzLCBzYW5kYm94X25hbWUpIHsKICAgIHByaW50KCJhbGxvd19hcmcgMzogaSA9IiwgaSwgImlucHV0X2FyZyA9IiwgaW5wdXRfYXJnLCAicG9saWN5X2FyZyA9IiwgcG9saWN5X3Byb2Nlc3MuYXJnc1tpXSkKCiAgICBleHBhbmRlZF9hcmcgPSByZXBsYWNlKHBvbGljeV9wcm9jZXNzLmFyZ3NbaV0sICIkKHNhbmRib3gtbmFtZSkiLCBzYW5kYm94X25hbWUpCiAgICBwcmludCgiYWxsb3dfYXJnIDM6IGV4cGFuZGVkIHBvbGljeV9hcmcgPSIsIGV4cGFuZGVkX2FyZykKICAgIGV4cGFuZGVkX2FyZyA9PSBpbnB1dF9hcmcKCiAgICBwcmludCgiYWxsb3dfYXJnIDM6IHN1Y2Nlc3MiKQp9CgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgT0NJIHByb2Nlc3MuZW52IGZpZWxkCgphbGxvd19lbnYocG9saWN5X3Byb2Nlc3MsIGlucHV0X3Byb2Nlc3MsIHNhbmRib3hfbmFtZSkgewogICAgcHJpbnQoImFsbG93X2VudjogcG9saWN5IGVudiA9IiwgcG9saWN5X3Byb2Nlc3MuZW52KQoKICAgIGV2ZXJ5IGVudl92YXIgaW4gaW5wdXRfcHJvY2Vzcy5lbnYgewogICAgICAgIHByaW50KCJhbGxvd19lbnYgPT4gYWxsb3dfZW52X3ZhcjoiLCBlbnZfdmFyKQogICAgICAgIGFsbG93X2Vudl92YXIocG9saWN5X3Byb2Nlc3MsIGlucHV0X3Byb2Nlc3MsIGVudl92YXIsIHNhbmRib3hfbmFtZSkKICAgIH0KCiAgICBwcmludCgiYWxsb3dfZW52OiBzdWNjZXNzIikKfQoKIyBBbGxvdyBpbnB1dCBlbnYgdmFyaWFibGVzIHRoYXQgYXJlIHByZXNlbnQgaW4gdGhlIHBvbGljeSBkYXRhIHRvby4KYWxsb3dfZW52X3Zhcihwb2xpY3lfcHJvY2VzcywgaW5wdXRfcHJvY2VzcywgZW52X3Zhciwgc2FuZGJveF9uYW1lKSB7CiAgICBwcmludCgiYWxsb3dfZW52X3ZhciAxOiBzb21lIHBvbGljeV9lbnZfdmFyID09IGVudl92YXIiKQoKICAgIHNvbWUgcG9saWN5X2Vudl92YXIgaW4gcG9saWN5X3Byb2Nlc3MuZW52CiAgICBwb2xpY3lfZW52X3ZhciA9PSBlbnZfdmFyCgogICAgcHJpbnQoImFsbG93X2Vudl92YXIgMTogc3VjY2VzcyIpCn0KCiMgTWF0Y2ggaW5wdXQgd2l0aCBvbmUgb2YgdGhlIHBvbGljeSB2YXJpYWJsZXMsIGFmdGVyIHN1YnN0aXR1dGluZyAkKHNhbmRib3gtbmFtZSkuCmFsbG93X2Vudl92YXIocG9saWN5X3Byb2Nlc3MsIGlucHV0X3Byb2Nlc3MsIGVudl92YXIsIHNhbmRib3hfbmFtZSkgewogICAgcHJpbnQoImFsbG93X2Vudl92YXIgMjogcmVwbGFjZSAkKHNhbmRib3gtbmFtZSkiKQoKICAgIHNvbWUgcG9saWN5X2Vudl92YXIgaW4gcG9saWN5X3Byb2Nlc3MuZW52CiAgICBwb2xpY3lfdmFyID0gcmVwbGFjZShwb2xpY3lfZW52X3ZhciwgIiQoc2FuZGJveC1uYW1lKSIsIHNhbmRib3hfbmFtZSkKCiAgICBwcmludCgiYWxsb3dfZW52X3ZhciAyOiBpbnB1dCA9IiwgZW52X3ZhciwgInBvbGljeSA9IiwgcG9saWN5X3ZhcikKICAgIHBvbGljeV92YXIgPT0gZW52X3ZhcgoKICAgIHByaW50KCJhbGxvd19lbnZfdmFyIDI6IHN1Y2Nlc3MiKQp9CgojIEFsbG93IHNlcnZpY2UtcmVsYXRlZCBlbnYgdmFyaWFibGVzOgoKIyAiS1VCRVJORVRFU19QT1JUXzQ0M19UQ1BfUFJPVE89dGNwIgphbGxvd19lbnZfdmFyKHBvbGljeV9wcm9jZXNzLCBpbnB1dF9wcm9jZXNzLCBlbnZfdmFyLCBzYW5kYm94X25hbWUpIHsKICAgIHByaW50KCJhbGxvd19lbnZfdmFyIDM6IEtVQkVSTkVURVNfUE9SVF80NDNfVENQX1BST1RPPXRjcCIpCgogICAgbmFtZV92YWx1ZSA6PSBzcGxpdChlbnZfdmFyLCAiPSIpCiAgICBjb3VudChuYW1lX3ZhbHVlKSA9PSAyCgogICAgbmFtZV92YWx1ZVsxXSA9PSAidGNwIgoKICAgIG5hbWVfY29tcG9uZW50cyA9IHNwbGl0KG5hbWVfdmFsdWVbMF0sICJfIikKICAgIGNvbXBvbmVudHNfY291bnQgOj0gY291bnQobmFtZV9jb21wb25lbnRzKQogICAgY29tcG9uZW50c19jb3VudCA+PSA1CiAgICBuYW1lX2NvbXBvbmVudHNbY29tcG9uZW50c19jb3VudCAtIDFdID09ICJQUk9UTyIKICAgIG5hbWVfY29tcG9uZW50c1tjb21wb25lbnRzX2NvdW50IC0gMl0gPT0gIlRDUCIKICAgIG5hbWVfY29tcG9uZW50c1tjb21wb25lbnRzX2NvdW50IC0gNF0gPT0gIlBPUlQiCiAgICBwb3J0IDo9IG5hbWVfY29tcG9uZW50c1tjb21wb25lbnRzX2NvdW50IC0gM10KICAgIGlzX3BvcnQocG9ydCkKCiAgICBwcmludCgiYWxsb3dfZW52X3ZhciAzOiBzdWNjZXNzIikKfQoKIyAiS1VCRVJORVRFU19QT1JUXzQ0M19UQ1BfUE9SVD00NDMiCmFsbG93X2Vudl92YXIocG9saWN5X3Byb2Nlc3MsIGlucHV0X3Byb2Nlc3MsIGVudl92YXIsIHNhbmRib3hfbmFtZSkgewogICAgcHJpbnQoImFsbG93X2Vudl92YXIgNDogS1VCRVJORVRFU19QT1JUXzQ0M19UQ1BfUE9SVD00NDMiKQoKICAgIG5hbWVfdmFsdWUgOj0gc3BsaXQoZW52X3ZhciwgIj0iKQogICAgY291bnQobmFtZV92YWx1ZSkgPT0gMgoKICAgIHBvcnQgPSBuYW1lX3ZhbHVlWzFdCiAgICBpc19wb3J0KHBvcnQpCgogICAgbmFtZV9jb21wb25lbnRzID0gc3BsaXQobmFtZV92YWx1ZVswXSwgIl8iKQogICAgY29tcG9uZW50c19jb3VudCA6PSBjb3VudChuYW1lX2NvbXBvbmVudHMpCiAgICBjb21wb25lbnRzX2NvdW50ID49IDUKICAgIG5hbWVfY29tcG9uZW50c1tjb21wb25lbnRzX2NvdW50IC0gMV0gPT0gIlBPUlQiCiAgICBuYW1lX2NvbXBvbmVudHNbY29tcG9uZW50c19jb3VudCAtIDJdID09ICJUQ1AiCiAgICBuYW1lX2NvbXBvbmVudHNbY29tcG9uZW50c19jb3VudCAtIDNdID09IHBvcnQKICAgIG5hbWVfY29tcG9uZW50c1tjb21wb25lbnRzX2NvdW50IC0gNF0gPT0gIlBPUlQiCgogICAgcHJpbnQoImFsbG93X2Vudl92YXIgNDogc3VjY2VzcyIpCn0KCiMgIktVQkVSTkVURVNfUE9SVF80NDNfVENQX0FERFI9MTAuMC4wLjEiCmFsbG93X2Vudl92YXIocG9saWN5X3Byb2Nlc3MsIGlucHV0X3Byb2Nlc3MsIGVudl92YXIsIHNhbmRib3hfbmFtZSkgewogICAgcHJpbnQoImFsbG93X2Vudl92YXIgNTogS1VCRVJORVRFU19QT1JUXzQ0M19UQ1BfQUREUj0xMC4wLjAuMSIpCgogICAgbmFtZV92YWx1ZSA6PSBzcGxpdChlbnZfdmFyLCAiPSIpCiAgICBjb3VudChuYW1lX3ZhbHVlKSA9PSAyCgogICAgaXNfaXAobmFtZV92YWx1ZVsxXSkKCiAgICBuYW1lX2NvbXBvbmVudHMgPSBzcGxpdChuYW1lX3ZhbHVlWzBdLCAiXyIpCiAgICBjb21wb25lbnRzX2NvdW50IDo9IGNvdW50KG5hbWVfY29tcG9uZW50cykKICAgIGNvbXBvbmVudHNfY291bnQgPj0gNQogICAgbmFtZV9jb21wb25lbnRzW2NvbXBvbmVudHNfY291bnQgLSAxXSA9PSAiQUREUiIKICAgIG5hbWVfY29tcG9uZW50c1tjb21wb25lbnRzX2NvdW50IC0gMl0gPT0gIlRDUCIKICAgIG5hbWVfY29tcG9uZW50c1tjb21wb25lbnRzX2NvdW50IC0gNF0gPT0gIlBPUlQiCiAgICBwb3J0IDo9IG5hbWVfY29tcG9uZW50c1tjb21wb25lbnRzX2NvdW50IC0gM10KICAgIGlzX3BvcnQocG9ydCkKCiAgICBwcmludCgiYWxsb3dfZW52X3ZhciA1OiBzdWNjZXNzIikKfQoKIyAiS1VCRVJORVRFU19TRVJWSUNFX0hPU1Q9MTAuMC4wLjEiLAphbGxvd19lbnZfdmFyKHBvbGljeV9wcm9jZXNzLCBpbnB1dF9wcm9jZXNzLCBlbnZfdmFyLCBzYW5kYm94X25hbWUpIHsKICAgIHByaW50KCJhbGxvd19lbnZfdmFyIDY6IEtVQkVSTkVURVNfU0VSVklDRV9IT1NUPTEwLjAuMC4xIikKCiAgICBuYW1lX3ZhbHVlIDo9IHNwbGl0KGVudl92YXIsICI9IikKICAgIGNvdW50KG5hbWVfdmFsdWUpID09IDIKCiAgICBpc19pcChuYW1lX3ZhbHVlWzFdKQoKICAgIG5hbWVfY29tcG9uZW50cyA9IHNwbGl0KG5hbWVfdmFsdWVbMF0sICJfIikKICAgIGNvbXBvbmVudHNfY291bnQgOj0gY291bnQobmFtZV9jb21wb25lbnRzKQogICAgY29tcG9uZW50c19jb3VudCA+PSAzCiAgICBuYW1lX2NvbXBvbmVudHNbY29tcG9uZW50c19jb3VudCAtIDFdID09ICJIT1NUIgogICAgbmFtZV9jb21wb25lbnRzW2NvbXBvbmVudHNfY291bnQgLSAyXSA9PSAiU0VSVklDRSIKCiAgICBwcmludCgiYWxsb3dfZW52X3ZhciA2OiBzdWNjZXNzIikKfQoKIyAiS1VCRVJORVRFU19TRVJWSUNFX1BPUlQ9NDQzIiwKYWxsb3dfZW52X3Zhcihwb2xpY3lfcHJvY2VzcywgaW5wdXRfcHJvY2VzcywgZW52X3Zhciwgc2FuZGJveF9uYW1lKSB7CiAgICBwcmludCgiYWxsb3dfZW52X3ZhciA3OiBLVUJFUk5FVEVTX1NFUlZJQ0VfUE9SVD00NDMiKQoKICAgIG5hbWVfdmFsdWUgOj0gc3BsaXQoZW52X3ZhciwgIj0iKQogICAgY291bnQobmFtZV92YWx1ZSkgPT0gMgoKICAgIGlzX3BvcnQobmFtZV92YWx1ZVsxXSkKCiAgICBuYW1lX2NvbXBvbmVudHMgPSBzcGxpdChuYW1lX3ZhbHVlWzBdLCAiXyIpCiAgICBjb21wb25lbnRzX2NvdW50IDo9IGNvdW50KG5hbWVfY29tcG9uZW50cykKICAgIGNvbXBvbmVudHNfY291bnQgPj0gMwogICAgbmFtZV9jb21wb25lbnRzW2NvbXBvbmVudHNfY291bnQgLSAxXSA9PSAiUE9SVCIKICAgIG5hbWVfY29tcG9uZW50c1tjb21wb25lbnRzX2NvdW50IC0gMl0gPT0gIlNFUlZJQ0UiCgogICAgcHJpbnQoImFsbG93X2Vudl92YXIgNzogc3VjY2VzcyIpCn0KCiMgIktVQkVSTkVURVNfU0VSVklDRV9QT1JUX0hUVFBTPTQ0MyIsCmFsbG93X2Vudl92YXIocG9saWN5X3Byb2Nlc3MsIGlucHV0X3Byb2Nlc3MsIGVudl92YXIsIHNhbmRib3hfbmFtZSkgewogICAgcHJpbnQoImFsbG93X2Vudl92YXIgODogS1VCRVJORVRFU19TRVJWSUNFX1BPUlRfSFRUUFM9NDQzIikKCiAgICBuYW1lX3ZhbHVlIDo9IHNwbGl0KGVudl92YXIsICI9IikKICAgIGNvdW50KG5hbWVfdmFsdWUpID09IDIKCiAgICBpc19wb3J0KG5hbWVfdmFsdWVbMV0pCgogICAgbmFtZV9jb21wb25lbnRzID0gc3BsaXQobmFtZV92YWx1ZVswXSwgIl8iKQogICAgY29tcG9uZW50c19jb3VudCA6PSBjb3VudChuYW1lX2NvbXBvbmVudHMpCiAgICBjb21wb25lbnRzX2NvdW50ID49IDQKICAgIG5hbWVfY29tcG9uZW50c1tjb21wb25lbnRzX2NvdW50IC0gMV0gPT0gIkhUVFBTIgogICAgbmFtZV9jb21wb25lbnRzW2NvbXBvbmVudHNfY291bnQgLSAyXSA9PSAiUE9SVCIKICAgIG5hbWVfY29tcG9uZW50c1tjb21wb25lbnRzX2NvdW50IC0gM10gPT0gIlNFUlZJQ0UiCgogICAgcHJpbnQoImFsbG93X2Vudl92YXIgODogc3VjY2VzcyIpCn0KCiMgIktVQkVSTkVURVNfUE9SVD10Y3A6Ly8xMC4wLjAuMTo0NDMiLAphbGxvd19lbnZfdmFyKHBvbGljeV9wcm9jZXNzLCBpbnB1dF9wcm9jZXNzLCBlbnZfdmFyLCBzYW5kYm94X25hbWUpIHsKICAgIHByaW50KCJhbGxvd19lbnZfdmFyIDk6IEtVQkVSTkVURVNfUE9SVD10Y3A6Ly8xMC4wLjAuMTo0NDMiKQoKICAgIG5hbWVfdmFsdWUgOj0gc3BsaXQoZW52X3ZhciwgIj0iKQogICAgY291bnQobmFtZV92YWx1ZSkgPT0gMgoKICAgIGlzX3RjcF91cmkobmFtZV92YWx1ZVsxXSkKCiAgICBuYW1lX2NvbXBvbmVudHMgPSBzcGxpdChuYW1lX3ZhbHVlWzBdLCAiXyIpCiAgICBjb21wb25lbnRzX2NvdW50IDo9IGNvdW50KG5hbWVfY29tcG9uZW50cykKICAgIGNvbXBvbmVudHNfY291bnQgPj0gMgogICAgbmFtZV9jb21wb25lbnRzW2NvbXBvbmVudHNfY291bnQgLSAxXSA9PSAiUE9SVCIKCiAgICBwcmludCgiYWxsb3dfZW52X3ZhciA5OiBzdWNjZXNzIikKfQoKIyAiS1VCRVJORVRFU19QT1JUXzQ0M19UQ1A9dGNwOi8vMTAuMC4wLjE6NDQzIiwKYWxsb3dfZW52X3Zhcihwb2xpY3lfcHJvY2VzcywgaW5wdXRfcHJvY2VzcywgZW52X3Zhciwgc2FuZGJveF9uYW1lKSB7CiAgICBwcmludCgiYWxsb3dfZW52X3ZhciAxMDogS1VCRVJORVRFU19QT1JUXzQ0M19UQ1A9dGNwOi8vMTAuMC4wLjE6NDQzIikKCiAgICBuYW1lX3ZhbHVlIDo9IHNwbGl0KGVudl92YXIsICI9IikKICAgIGNvdW50KG5hbWVfdmFsdWUpID09IDIKCiAgICBuYW1lX2NvbXBvbmVudHMgPSBzcGxpdChuYW1lX3ZhbHVlWzBdLCAiXyIpCiAgICBjb21wb25lbnRzX2NvdW50IDo9IGNvdW50KG5hbWVfY29tcG9uZW50cykKICAgIGNvbXBvbmVudHNfY291bnQgPj0gNAogICAgbmFtZV9jb21wb25lbnRzW2NvbXBvbmVudHNfY291bnQgLSAxXSA9PSAiVENQIgogICAgbmFtZV9jb21wb25lbnRzW2NvbXBvbmVudHNfY291bnQgLSAzXSA9PSAiUE9SVCIKICAgIHBvcnQgOj0gbmFtZV9jb21wb25lbnRzW2NvbXBvbmVudHNfY291bnQgLSAyXQogICAgaXNfcG9ydChwb3J0KQoKICAgIGlzX3RjcF91cmkobmFtZV92YWx1ZVsxXSkKICAgIHZhbHVlX2NvbXBvbmVudHMgPSBzcGxpdChuYW1lX3ZhbHVlWzFdLCAiOiIpCiAgICBjb3VudCh2YWx1ZV9jb21wb25lbnRzKSA9PSAzCiAgICB2YWx1ZV9jb21wb25lbnRzWzJdID09IHBvcnQKCiAgICBwcmludCgiYWxsb3dfZW52X3ZhciAxMDogc3VjY2VzcyIpCn0KCiMgQWxsb3cgZmllbGRSZWYgImZpZWxkUGF0aDogc3RhdHVzLnBvZElQIiB2YWx1ZXMuCmFsbG93X2Vudl92YXIocG9saWN5X3Byb2Nlc3MsIGlucHV0X3Byb2Nlc3MsIGVudl92YXIsIHNhbmRib3hfbmFtZSkgewogICAgcHJpbnQoImFsbG93X2Vudl92YXIgMTE6IGZpZWxkUGF0aDogc3RhdHVzLnBvZElQIikKCiAgICBuYW1lX3ZhbHVlIDo9IHNwbGl0KGVudl92YXIsICI9IikKICAgIGNvdW50KG5hbWVfdmFsdWUpID09IDIKICAgIGlzX2lwKG5hbWVfdmFsdWVbMV0pCgogICAgc29tZSBwb2xpY3lfZW52X3ZhciBpbiBwb2xpY3lfcHJvY2Vzcy5lbnYKICAgIGFsbG93X3BvZF9pcF92YXIobmFtZV92YWx1ZVswXSwgcG9saWN5X2Vudl92YXIpCgogICAgcHJpbnQoImFsbG93X2Vudl92YXIgMTE6IHN1Y2Nlc3MiKQp9CgojIEFsbG93IGNvbW1vbiBmaWVsZFJlZiB2YXJpYWJsZXMuCmFsbG93X2Vudl92YXIocG9saWN5X3Byb2Nlc3MsIGlucHV0X3Byb2Nlc3MsIGVudl92YXIsIHNhbmRib3hfbmFtZSkgewogICAgcHJpbnQoImFsbG93X2Vudl92YXIgMTI6IGZpZWxkUmVmIikKCiAgICBuYW1lX3ZhbHVlIDo9IHNwbGl0KGVudl92YXIsICI9IikKICAgIGNvdW50KG5hbWVfdmFsdWUpID09IDIKCiAgICBzb21lIHBvbGljeV9lbnZfdmFyIGluIHBvbGljeV9wcm9jZXNzLmVudgogICAgcG9saWN5X25hbWVfdmFsdWUgOj0gc3BsaXQocG9saWN5X2Vudl92YXIsICI9IikKICAgIGNvdW50KHBvbGljeV9uYW1lX3ZhbHVlKSA9PSAyCgogICAgcG9saWN5X25hbWVfdmFsdWVbMF0gPT0gbmFtZV92YWx1ZVswXQoKICAgICMgVE9ETzogc2hvdWxkIHRoZXNlIGJlIGhhbmRsZWQgaW4gYSBkaWZmZXJlbnQgd2F5PwogICAgYWx3YXlzX2FsbG93ZWQgOj0gWyIkKGhvc3QtbmFtZSkiLCAiJChub2RlLW5hbWUpIiwgIiQocG9kLXVpZCkiXQogICAgc29tZSBhbGxvd2VkIGluIGFsd2F5c19hbGxvd2VkCiAgICBjb250YWlucyhwb2xpY3lfbmFtZV92YWx1ZVsxXSwgYWxsb3dlZCkKCiAgICBwcmludCgiYWxsb3dfZW52X3ZhciAxMjogc3VjY2VzcyIpCn0KCiMgQWxsb3cgZmllbGRSZWYgImZpZWxkUGF0aDogc3RhdHVzLmhvc3RJUCIgdmFsdWVzLgphbGxvd19lbnZfdmFyKHBvbGljeV9wcm9jZXNzLCBpbnB1dF9wcm9jZXNzLCBlbnZfdmFyLCBzYW5kYm94X25hbWUpIHsKICAgIHByaW50KCJhbGxvd19lbnZfdmFyIDEzOiBmaWVsZFBhdGg6IHN0YXR1cy5ob3N0SVAiKQoKICAgIG5hbWVfdmFsdWUgOj0gc3BsaXQoZW52X3ZhciwgIj0iKQogICAgY291bnQobmFtZV92YWx1ZSkgPT0gMgogICAgaXNfaXAobmFtZV92YWx1ZVsxXSkKCiAgICBzb21lIHBvbGljeV9lbnZfdmFyIGluIHBvbGljeV9wcm9jZXNzLmVudgogICAgYWxsb3dfaG9zdF9pcF92YXIobmFtZV92YWx1ZVswXSwgcG9saWN5X2Vudl92YXIpCgogICAgcHJpbnQoImFsbG93X2Vudl92YXIgMTM6IHN1Y2Nlc3MiKQp9CgojIEFsbG93IHJlc291cmNlRmllbGRSZWYgdmFsdWVzIChlLmcuLCAibGltaXRzLmNwdSIpLgphbGxvd19lbnZfdmFyKHBvbGljeV9wcm9jZXNzLCBpbnB1dF9wcm9jZXNzLCBlbnZfdmFyLCBzYW5kYm94X25hbWUpIHsKICAgIHByaW50KCJhbGxvd19lbnZfdmFyIDE0OiByZXNvdXJjZUZpZWxkUmVmIikKCiAgICBuYW1lX3ZhbHVlIDo9IHNwbGl0KGVudl92YXIsICI9IikKICAgIGNvdW50KG5hbWVfdmFsdWUpID09IDIKCiAgICBzb21lIHBvbGljeV9lbnZfdmFyIGluIHBvbGljeV9wcm9jZXNzLmVudgogICAgcG9saWN5X25hbWVfdmFsdWUgOj0gc3BsaXQocG9saWN5X2Vudl92YXIsICI9IikKICAgIGNvdW50KHBvbGljeV9uYW1lX3ZhbHVlKSA9PSAyCgogICAgcG9saWN5X25hbWVfdmFsdWVbMF0gPT0gbmFtZV92YWx1ZVswXQoKICAgICMgVE9ETzogc2hvdWxkIHRoZXNlIGJlIGhhbmRsZWQgaW4gYSBkaWZmZXJlbnQgd2F5PwogICAgYWx3YXlzX2FsbG93ZWQgPSBbIiQocmVzb3VyY2UtZmllbGQpIiwgIiQodG9kby1hbm5vdGF0aW9uKSJdCiAgICBzb21lIGFsbG93ZWQgaW4gYWx3YXlzX2FsbG93ZWQKICAgIGNvbnRhaW5zKHBvbGljeV9uYW1lX3ZhbHVlWzFdLCBhbGxvd2VkKQoKICAgIHByaW50KCJhbGxvd19lbnZfdmFyIDE0OiBzdWNjZXNzIikKfQoKCmFsbG93X3BvZF9pcF92YXIodmFyX25hbWUsIHBvbGljeV9lbnZfdmFyKSB7CiAgICBwcmludCgiYWxsb3dfcG9kX2lwX3ZhcjogdmFyX25hbWUgPSIsIHZhcl9uYW1lLCAicG9saWN5X2Vudl92YXIgPSIsIHBvbGljeV9lbnZfdmFyKQoKICAgIHBvbGljeV9uYW1lX3ZhbHVlIDo9IHNwbGl0KHBvbGljeV9lbnZfdmFyLCAiPSIpCiAgICBjb3VudChwb2xpY3lfbmFtZV92YWx1ZSkgPT0gMgoKICAgIHBvbGljeV9uYW1lX3ZhbHVlWzBdID09IHZhcl9uYW1lCiAgICBwb2xpY3lfbmFtZV92YWx1ZVsxXSA9PSAiJChwb2QtaXApIgoKICAgIHByaW50KCJhbGxvd19wb2RfaXBfdmFyOiBzdWNjZXNzIikKfQoKYWxsb3dfaG9zdF9pcF92YXIodmFyX25hbWUsIHBvbGljeV9lbnZfdmFyKSB7CiAgICBwcmludCgiYWxsb3dfaG9zdF9pcF92YXI6IHZhcl9uYW1lID0iLCB2YXJfbmFtZSwgInBvbGljeV9lbnZfdmFyID0iLCBwb2xpY3lfZW52X3ZhcikKCiAgICBwb2xpY3lfbmFtZV92YWx1ZSA6PSBzcGxpdChwb2xpY3lfZW52X3ZhciwgIj0iKQogICAgY291bnQocG9saWN5X25hbWVfdmFsdWUpID09IDIKCiAgICBwb2xpY3lfbmFtZV92YWx1ZVswXSA9PSB2YXJfbmFtZQogICAgcG9saWN5X25hbWVfdmFsdWVbMV0gPT0gIiQoaG9zdC1pcCkiCgogICAgcHJpbnQoImFsbG93X2hvc3RfaXBfdmFyOiBzdWNjZXNzIikKfQoKaXNfaXAodmFsdWUpIHsKICAgIGJ5dGVzID0gc3BsaXQodmFsdWUsICIuIikKICAgIGNvdW50KGJ5dGVzKSA9PSA0CgogICAgaXNfaXBfZmlyc3RfYnl0ZShieXRlc1swXSkKICAgIGlzX2lwX290aGVyX2J5dGUoYnl0ZXNbMV0pCiAgICBpc19pcF9vdGhlcl9ieXRlKGJ5dGVzWzJdKQogICAgaXNfaXBfb3RoZXJfYnl0ZShieXRlc1szXSkKfQppc19pcF9maXJzdF9ieXRlKGNvbXBvbmVudCkgewogICAgbnVtYmVyID0gdG9fbnVtYmVyKGNvbXBvbmVudCkKICAgIG51bWJlciA+PSAxCiAgICBudW1iZXIgPD0gMjU1Cn0KaXNfaXBfb3RoZXJfYnl0ZShjb21wb25lbnQpIHsKICAgIG51bWJlciA9IHRvX251bWJlcihjb21wb25lbnQpCiAgICBudW1iZXIgPj0gMAogICAgbnVtYmVyIDw9IDI1NQp9Cgppc19wb3J0KHZhbHVlKSB7CiAgICBudW1iZXIgPSB0b19udW1iZXIodmFsdWUpCiAgICBudW1iZXIgPj0gMQogICAgbnVtYmVyIDw9IDY1NjM1Cn0KCiMgRS5nLiwgInRjcDovLzEwLjAuMC4xOjQ0MyIKaXNfdGNwX3VyaSh2YWx1ZSkgewogICAgY29tcG9uZW50cyA9IHNwbGl0KHZhbHVlLCAiLy8iKQogICAgY291bnQoY29tcG9uZW50cykgPT0gMgogICAgY29tcG9uZW50c1swXSA9PSAidGNwOiIKCiAgICBpcF9hbmRfcG9ydCA9IHNwbGl0KGNvbXBvbmVudHNbMV0sICI6IikKICAgIGNvdW50KGlwX2FuZF9wb3J0KSA9PSAyCiAgICBpc19pcChpcF9hbmRfcG9ydFswXSkKICAgIGlzX3BvcnQoaXBfYW5kX3BvcnRbMV0pCn0KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBPQ0kgcm9vdC5wYXRoCgphbGxvd19yb290X3BhdGgocG9saWN5X29jaSwgaW5wdXRfb2NpLCBidW5kbGVfaWQpIHsKICAgIHBvbGljeV9wYXRoIDo9IHJlcGxhY2UocG9saWN5X29jaS5yb290LnBhdGgsICIkKGJ1bmRsZS1pZCkiLCBidW5kbGVfaWQpCiAgICBwb2xpY3lfcGF0aCA9PSBpbnB1dF9vY2kucm9vdC5wYXRoCn0KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBtb3VudHMKCmFsbG93X21vdW50KHBvbGljeV9vY2ksIGlucHV0X21vdW50LCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHByaW50KCJhbGxvd19tb3VudDogaW5wdXRfbW91bnQuZGVzdGluYXRpb24gPSIsIGlucHV0X21vdW50LmRlc3RpbmF0aW9uKQoKICAgIHNvbWUgcG9saWN5X21vdW50IGluIHBvbGljeV9vY2kubW91bnRzCiAgICBwb2xpY3lfbW91bnRfYWxsb3dzKHBvbGljeV9tb3VudCwgaW5wdXRfbW91bnQsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkKCiAgICAjIFRPRE86IGFyZSB0aGVyZSBhbnkgb3RoZXIgcmVxdWlyZWQgcG9saWN5IGNoZWNrcyBmb3IgbW91bnRzIC0gZS5nLiwKICAgICMgICAgICAgbXVsdGlwbGUgbW91bnRzIHdpdGggc2FtZSBzb3VyY2Ugb3IgZGVzdGluYXRpb24/Cn0KCnBvbGljeV9tb3VudF9hbGxvd3MocG9saWN5X21vdW50LCBpbnB1dF9tb3VudCwgYnVuZGxlX2lkLCBzYW5kYm94X2lkKSB7CiAgICBwcmludCgicG9saWN5X21vdW50X2FsbG93cyAxOiBwb2xpY3lfbW91bnQgPSIsIHBvbGljeV9tb3VudCkKICAgIHByaW50KCJwb2xpY3lfbW91bnRfYWxsb3dzIDE6IGlucHV0X21vdW50ID0iLCBpbnB1dF9tb3VudCkKCiAgICBwb2xpY3lfbW91bnQgPT0gaW5wdXRfbW91bnQKCiAgICBwcmludCgicG9saWN5X21vdW50X2FsbG93cyAxIHN1Y2Nlc3MiKQp9CnBvbGljeV9tb3VudF9hbGxvd3MocG9saWN5X21vdW50LCBpbnB1dF9tb3VudCwgYnVuZGxlX2lkLCBzYW5kYm94X2lkKSB7CiAgICBwcmludCgicG9saWN5X21vdW50X2FsbG93cyAyOiBpbnB1dF9tb3VudC5kZXN0aW5hdGlvbiA9IiwgaW5wdXRfbW91bnQuZGVzdGluYXRpb24sICJwb2xpY3lfbW91bnQuZGVzdGluYXRpb24gPSIsIHBvbGljeV9tb3VudC5kZXN0aW5hdGlvbikKICAgIHBvbGljeV9tb3VudC5kZXN0aW5hdGlvbiAgICA9PSBpbnB1dF9tb3VudC5kZXN0aW5hdGlvbgoKICAgIHByaW50KCJwb2xpY3lfbW91bnRfYWxsb3dzIDI6IGlucHV0IHR5cGUgPSIsIGlucHV0X21vdW50LnR5cGUsICJwb2xpY3kgdHlwZSA9IiwgcG9saWN5X21vdW50LnR5cGUpCiAgICBwb2xpY3lfbW91bnQudHlwZSAgICAgICAgICAgPT0gaW5wdXRfbW91bnQudHlwZQoKICAgIHByaW50KCJwb2xpY3lfbW91bnRfYWxsb3dzIDI6IGlucHV0IG9wdGlvbnMgPSIsIGlucHV0X21vdW50Lm9wdGlvbnMpCiAgICBwcmludCgicG9saWN5X21vdW50X2FsbG93cyAyOiBwb2xpY3kgb3B0aW9ucyA9IiwgcG9saWN5X21vdW50Lm9wdGlvbnMpCiAgICBwb2xpY3lfbW91bnQub3B0aW9ucyAgICAgICAgPT0gaW5wdXRfbW91bnQub3B0aW9ucwoKICAgIHByaW50KCJwb2xpY3lfbW91bnRfYWxsb3dzIDI6IHBvbGljeV9tb3VudF9zb3VyY2VfYWxsb3dzIikKICAgIHBvbGljeV9tb3VudF9zb3VyY2VfYWxsb3dzKHBvbGljeV9tb3VudCwgaW5wdXRfbW91bnQsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkKCiAgICBwcmludCgicG9saWN5X21vdW50X2FsbG93cyAyOiBzdWNjZXNzIikKfQoKcG9saWN5X21vdW50X3NvdXJjZV9hbGxvd3MocG9saWN5X21vdW50LCBpbnB1dF9tb3VudCwgYnVuZGxlX2lkLCBzYW5kYm94X2lkKSB7CiAgICAjIEUuZy4sICJzb3VyY2UiOiAiXi9ydW4va2F0YS1jb250YWluZXJzL3NoYXJlZC9jb250YWluZXJzLyQoYnVuZGxlLWlkKS1bYS16MC05XXsxNn0tcmVzb2x2LmNvbmYkIiwKICAgIHBvbGljeV9zb3VyY2VfcmVnZXggOj0gcmVwbGFjZShwb2xpY3lfbW91bnQuc291cmNlLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoInBvbGljeV9tb3VudF9zb3VyY2VfYWxsb3dzIDE6IHBvbGljeV9zb3VyY2VfcmVnZXggPSIsIHBvbGljeV9zb3VyY2VfcmVnZXgpCgogICAgcHJpbnQoInBvbGljeV9tb3VudF9zb3VyY2VfYWxsb3dzIDE6IGlucHV0X21vdW50LnNvdXJjZT0iLCBpbnB1dF9tb3VudC5zb3VyY2UpCiAgICByZWdleC5tYXRjaChwb2xpY3lfc291cmNlX3JlZ2V4LCBpbnB1dF9tb3VudC5zb3VyY2UpCgogICAgcHJpbnQoInBvbGljeV9tb3VudF9zb3VyY2VfYWxsb3dzIDE6IHN1Y2Nlc3MiKQp9CnBvbGljeV9tb3VudF9zb3VyY2VfYWxsb3dzKHBvbGljeV9tb3VudCwgaW5wdXRfbW91bnQsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgIyBFLmcuLCAic291cmNlIjogIl4vcnVuL2thdGEtY29udGFpbmVycy9zaGFyZWQvY29udGFpbmVycy8kKHNhbmRib3gtaWQpL3Jvb3Rmcy9sb2NhbC9kYXRhJCIsCiAgICBwb2xpY3lfc291cmNlX3JlZ2V4IDo9IHJlcGxhY2UocG9saWN5X21vdW50LnNvdXJjZSwgIiQoc2FuZGJveC1pZCkiLCBzYW5kYm94X2lkKQoKICAgIHByaW50KCJwb2xpY3lfbW91bnRfc291cmNlX2FsbG93cyAyOiBwb2xpY3lfc291cmNlX3JlZ2V4ID0iLCBwb2xpY3lfc291cmNlX3JlZ2V4LCAiaW5wdXRfbW91bnQuc291cmNlPSIsIGlucHV0X21vdW50LnNvdXJjZSkKICAgIHJlZ2V4Lm1hdGNoKHBvbGljeV9zb3VyY2VfcmVnZXgsIGlucHV0X21vdW50LnNvdXJjZSkKCiAgICBwcmludCgicG9saWN5X21vdW50X3NvdXJjZV9hbGxvd3MgMjogc3VjY2VzcyIpCn0KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBTdG9yYWdlcwoKYWxsb3dfc3RvcmFnZXMocG9saWN5X3N0b3JhZ2VzLCBpbnB1dF9zdG9yYWdlcywgYnVuZGxlX2lkLCBzYW5kYm94X2lkKSB7CiAgICBwb2xpY3lfY291bnQgOj0gY291bnQocG9saWN5X3N0b3JhZ2VzKQogICAgaW5wdXRfY291bnQgOj0gY291bnQoaW5wdXRfc3RvcmFnZXMpCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZXM6IHBvbGljeV9jb3VudCA9IiwgcG9saWN5X2NvdW50LCAiaW5wdXRfY291bnQgPSIsIGlucHV0X2NvdW50KQogICAgcG9saWN5X2NvdW50ID09IGlucHV0X2NvdW50CgogICAgc29tZSBpLCBpbnB1dF9zdG9yYWdlIGluIGlucHV0X3N0b3JhZ2VzCiAgICBhbGxvd19pbnB1dF9zdG9yYWdlKGksIGlucHV0X3N0b3JhZ2UsIHBvbGljeV9zdG9yYWdlcywgcG9saWN5X2NvdW50LCBidW5kbGVfaWQsIHNhbmRib3hfaWQpCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiBzdWNjZXNzIikKfQoKYWxsb3dfaW5wdXRfc3RvcmFnZShpLCBpbnB1dF9zdG9yYWdlLCBwb2xpY3lfc3RvcmFnZXMsIGNvdW50LCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHByaW50KCJhbGxvd19pbnB1dF9zdG9yYWdlOiBpID0iLCBpLCAiaW5wdXRfc3RvcmFnZSA9IiwgaW5wdXRfc3RvcmFnZSkKCiAgICBwb2xpY3lfc3RvcmFnZSA6PSBwb2xpY3lfc3RvcmFnZXNbaV0KICAgIHByaW50KCJhbGxvd19pbnB1dF9zdG9yYWdlOiBpID0iLCBpLCAicG9saWN5X3N0b3JhZ2UgPSIsIHBvbGljeV9zdG9yYWdlKQoKICAgIHN0b3JhZ2VzX21hdGNoKHBvbGljeV9zdG9yYWdlLCBpbnB1dF9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpCgogICAgIyBTdG9wIHdoZW4gcmVhY2hpbmcgdGhlIGxhc3QgZWxlbWVudCBvZiB0aGUgc3RvcmFnZXMgYXJyYXkuCiAgICBpID09IGNvdW50IC0gMQp9CgpzdG9yYWdlc19tYXRjaChwb2xpY3lfc3RvcmFnZSwgaW5wdXRfc3RvcmFnZSwgYnVuZGxlX2lkLCBzYW5kYm94X2lkKSB7CiAgICBwb2xpY3lfc3RvcmFnZS5kcml2ZXIgICAgICAgICAgID09IGlucHV0X3N0b3JhZ2UuZHJpdmVyCiAgICBwb2xpY3lfc3RvcmFnZS5kcml2ZXJfb3B0aW9ucyAgID09IGlucHV0X3N0b3JhZ2UuZHJpdmVyX29wdGlvbnMKICAgIHBvbGljeV9zdG9yYWdlLm9wdGlvbnMgICAgICAgICAgPT0gaW5wdXRfc3RvcmFnZS5vcHRpb25zCiAgICBwb2xpY3lfc3RvcmFnZS5mc19ncm91cCAgICAgICAgID09IGlucHV0X3N0b3JhZ2UuZnNfZ3JvdXAKCiAgICBhbGxvd19tb3VudF9wb2ludChwb2xpY3lfc3RvcmFnZSwgaW5wdXRfc3RvcmFnZSwgYnVuZGxlX2lkLCBzYW5kYm94X2lkKQoKICAgICMgVE9ETzogdmFsaWRhdGUgdGhlIHNvdXJjZSBmaWVsZCB0b28uCgogICAgcHJpbnQoInN0b3JhZ2VzX21hdGNoOiBzdWNjZXNzIikKfQoKYWxsb3dfbW91bnRfcG9pbnQocG9saWN5X3N0b3JhZ2UsIGlucHV0X3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDE6IGZzdHlwZSA9PSB0YXIiKQogICAgcG9saWN5X3N0b3JhZ2UuZnN0eXBlID09ICJ0YXIiCgogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDE6IHBvbGljeV9zdG9yYWdlLm1vdW50X3BvaW50ID09IGlucHV0X3N0b3JhZ2UubW91bnRfcG9pbnQiKQogICAgcG9saWN5X3N0b3JhZ2UubW91bnRfcG9pbnQgPT0gaW5wdXRfc3RvcmFnZS5tb3VudF9wb2ludAoKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCAxOiBzdWNjZXNzIikKfQphbGxvd19tb3VudF9wb2ludChwb2xpY3lfc3RvcmFnZSwgaW5wdXRfc3RvcmFnZSwgYnVuZGxlX2lkLCBzYW5kYm94X2lkKSB7CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMjogZnN0eXBlID09IHRhci1vdmVybGF5IikKICAgIHBvbGljeV9zdG9yYWdlLmZzdHlwZSA9PSAidGFyLW92ZXJsYXkiCgogICAgcG9saWN5X21vdW50X3BvaW50IDo9IHJlcGxhY2UocG9saWN5X3N0b3JhZ2UubW91bnRfcG9pbnQsICIkKGJ1bmRsZS1pZCkiLCBidW5kbGVfaWQpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMjogcG9saWN5X21vdW50X3BvaW50ID0iLCBwb2xpY3lfbW91bnRfcG9pbnQpCgogICAgcG9saWN5X21vdW50X3BvaW50ID09IGlucHV0X3N0b3JhZ2UubW91bnRfcG9pbnQKCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMjogc3VjY2VzcyIpCn0KYWxsb3dfbW91bnRfcG9pbnQocG9saWN5X3N0b3JhZ2UsIGlucHV0X3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDM6IGZzdHlwZSA9PSBsb2NhbCIpCiAgICBwb2xpY3lfc3RvcmFnZS5mc3R5cGUgPT0gImxvY2FsIgoKICAgIG1vdW50X3BvaW50X3JlZ2V4IDo9IHJlcGxhY2UocG9saWN5X3N0b3JhZ2UubW91bnRfcG9pbnQsICIkKHNhbmRib3gtaWQpIiwgc2FuZGJveF9pZCkKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCAzOiBtb3VudF9wb2ludF9yZWdleCA9IiwgbW91bnRfcG9pbnRfcmVnZXgpCgogICAgcmVnZXgubWF0Y2gobW91bnRfcG9pbnRfcmVnZXgsIGlucHV0X3N0b3JhZ2UubW91bnRfcG9pbnQpCgogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDM6IHN1Y2Nlc3MiKQp9CmFsbG93X21vdW50X3BvaW50KHBvbGljeV9zdG9yYWdlLCBpbnB1dF9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA0OiBmc3R5cGUgPT0gYmluZCIpCiAgICBwb2xpY3lfc3RvcmFnZS5mc3R5cGUgPT0gImJpbmQiCgogICAgbW91bnRfcG9pbnRfcmVnZXggOj0gcmVwbGFjZShwb2xpY3lfc3RvcmFnZS5tb3VudF9wb2ludCwgIiQoYnVuZGxlLWlkKSIsIGJ1bmRsZV9pZCkKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA0OiBtb3VudF9wb2ludF9yZWdleCA9IiwgbW91bnRfcG9pbnRfcmVnZXgpCgogICAgcmVnZXgubWF0Y2gobW91bnRfcG9pbnRfcmVnZXgsIGlucHV0X3N0b3JhZ2UubW91bnRfcG9pbnQpCgogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDQ6IHN1Y2Nlc3MiKQp9CgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCkV4ZWNQcm9jZXNzUmVxdWVzdCB7CiAgICBpbnB1dF9jb21tYW5kID0gY29uY2F0KCIgIiwgaW5wdXQucHJvY2Vzcy5BcmdzKQogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdDogaW5wdXRfY29tbWFuZCA9IiwgaW5wdXRfY29tbWFuZCkKCiAgICBzb21lIGNvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBzb21lIHBvbGljeV9jb21tYW5kIGluIGNvbnRhaW5lci5leGVjX2NvbW1hbmRzCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0OiBwb2xpY3lfY29tbWFuZCA9IiwgcG9saWN5X2NvbW1hbmQpCgogICAgIyBUT0RPOiBzaG91bGQgb3RoZXIgaW5wdXQgZGF0YSBmaWVsZHMgYmUgdmFsaWRhdGVkIGFzIHdlbGw/CiAgICBwb2xpY3lfY29tbWFuZCA9PSBpbnB1dF9jb21tYW5kCgogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdDogc3VjY2VzcyIpCn0KCkNvcHlGaWxlUmVxdWVzdCB7CiAgICBwcmludCgiQ29weUZpbGVSZXF1ZXN0OiIsIGlucHV0KQoKICAgICMgVE9ETzogcmV2aWV3IGFuZCBpbXByb3ZlIGlmIG5lZWRlZC4KICAgIHN0YXJ0c3dpdGgoaW5wdXQucGF0aCwgIi9ydW4va2F0YS1jb250YWluZXJzL3NoYXJlZC9jb250YWluZXJzLyIpCgogICAgcHJpbnQoIkNvcHlGaWxlUmVxdWVzdDogc3VjY2VzcyIpCn0KcG9saWN5X2RhdGEgOj0gewogICJjb250YWluZXJzIjogWwogICAgewogICAgICAib2NpIjogewogICAgICAgICJvY2lWZXJzaW9uIjogIjEuMS4wLXJjLjEiLAogICAgICAgICJwcm9jZXNzIjogewogICAgICAgICAgInRlcm1pbmFsIjogZmFsc2UsCiAgICAgICAgICAidXNlciI6IHsKICAgICAgICAgICAgInVpZCI6IDY1NTM1LAogICAgICAgICAgICAiZ2lkIjogNjU1MzUKICAgICAgICAgIH0sCiAgICAgICAgICAiYXJncyI6IFsKICAgICAgICAgICAgIi9wYXVzZSIKICAgICAgICAgIF0sCiAgICAgICAgICAiZW52IjogWwogICAgICAgICAgICAiUEFUSD0vdXNyL2xvY2FsL3NiaW46L3Vzci9sb2NhbC9iaW46L3Vzci9zYmluOi91c3IvYmluOi9zYmluOi9iaW4iCiAgICAgICAgICBdLAogICAgICAgICAgImN3ZCI6ICIvIiwKICAgICAgICAgICJjYXBhYmlsaXRpZXMiOiB7CiAgICAgICAgICAgICJib3VuZGluZyI6IFsKICAgICAgICAgICAgICAiQ0FQX0NIT1dOIiwKICAgICAgICAgICAgICAiQ0FQX0RBQ19PVkVSUklERSIsCiAgICAgICAgICAgICAgIkNBUF9GU0VUSUQiLAogICAgICAgICAgICAgICJDQVBfRk9XTkVSIiwKICAgICAgICAgICAgICAiQ0FQX01LTk9EIiwKICAgICAgICAgICAgICAiQ0FQX05FVF9SQVciLAogICAgICAgICAgICAgICJDQVBfU0VUR0lEIiwKICAgICAgICAgICAgICAiQ0FQX1NFVFVJRCIsCiAgICAgICAgICAgICAgIkNBUF9TRVRGQ0FQIiwKICAgICAgICAgICAgICAiQ0FQX1NFVFBDQVAiLAogICAgICAgICAgICAgICJDQVBfTkVUX0JJTkRfU0VSVklDRSIsCiAgICAgICAgICAgICAgIkNBUF9TWVNfQ0hST09UIiwKICAgICAgICAgICAgICAiQ0FQX0tJTEwiLAogICAgICAgICAgICAgICJDQVBfQVVESVRfV1JJVEUiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJlZmZlY3RpdmUiOiBbCiAgICAgICAgICAgICAgIkNBUF9DSE9XTiIsCiAgICAgICAgICAgICAgIkNBUF9EQUNfT1ZFUlJJREUiLAogICAgICAgICAgICAgICJDQVBfRlNFVElEIiwKICAgICAgICAgICAgICAiQ0FQX0ZPV05FUiIsCiAgICAgICAgICAgICAgIkNBUF9NS05PRCIsCiAgICAgICAgICAgICAgIkNBUF9ORVRfUkFXIiwKICAgICAgICAgICAgICAiQ0FQX1NFVEdJRCIsCiAgICAgICAgICAgICAgIkNBUF9TRVRVSUQiLAogICAgICAgICAgICAgICJDQVBfU0VURkNBUCIsCiAgICAgICAgICAgICAgIkNBUF9TRVRQQ0FQIiwKICAgICAgICAgICAgICAiQ0FQX05FVF9CSU5EX1NFUlZJQ0UiLAogICAgICAgICAgICAgICJDQVBfU1lTX0NIUk9PVCIsCiAgICAgICAgICAgICAgIkNBUF9LSUxMIiwKICAgICAgICAgICAgICAiQ0FQX0FVRElUX1dSSVRFIgogICAgICAgICAgICBdLAogICAgICAgICAgICAicGVybWl0dGVkIjogWwogICAgICAgICAgICAgICJDQVBfQ0hPV04iLAogICAgICAgICAgICAgICJDQVBfREFDX09WRVJSSURFIiwKICAgICAgICAgICAgICAiQ0FQX0ZTRVRJRCIsCiAgICAgICAgICAgICAgIkNBUF9GT1dORVIiLAogICAgICAgICAgICAgICJDQVBfTUtOT0QiLAogICAgICAgICAgICAgICJDQVBfTkVUX1JBVyIsCiAgICAgICAgICAgICAgIkNBUF9TRVRHSUQiLAogICAgICAgICAgICAgICJDQVBfU0VUVUlEIiwKICAgICAgICAgICAgICAiQ0FQX1NFVEZDQVAiLAogICAgICAgICAgICAgICJDQVBfU0VUUENBUCIsCiAgICAgICAgICAgICAgIkNBUF9ORVRfQklORF9TRVJWSUNFIiwKICAgICAgICAgICAgICAiQ0FQX1NZU19DSFJPT1QiLAogICAgICAgICAgICAgICJDQVBfS0lMTCIsCiAgICAgICAgICAgICAgIkNBUF9BVURJVF9XUklURSIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgICJub05ld1ByaXZpbGVnZXMiOiB0cnVlCiAgICAgICAgfSwKICAgICAgICAicm9vdCI6IHsKICAgICAgICAgICJwYXRoIjogIi9ydW4va2F0YS1jb250YWluZXJzL3NoYXJlZC9jb250YWluZXJzLyQoYnVuZGxlLWlkKSIsCiAgICAgICAgICAicmVhZG9ubHkiOiB0cnVlCiAgICAgICAgfSwKICAgICAgICAibW91bnRzIjogWwogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL3Byb2MiLAogICAgICAgICAgICAidHlwZSI6ICJwcm9jIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJwcm9jIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAgICAgIm5vZGV2IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2RldiIsCiAgICAgICAgICAgICJ0eXBlIjogInRtcGZzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJzdHJpY3RhdGltZSIsCiAgICAgICAgICAgICAgIm1vZGU9NzU1IiwKICAgICAgICAgICAgICAic2l6ZT02NTUzNmsiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L3B0cyIsCiAgICAgICAgICAgICJ0eXBlIjogImRldnB0cyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiZGV2cHRzIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAgICAgIm5ld2luc3RhbmNlIiwKICAgICAgICAgICAgICAicHRteG1vZGU9MDY2NiIsCiAgICAgICAgICAgICAgIm1vZGU9MDYyMCIsCiAgICAgICAgICAgICAgImdpZD01IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi9zaG0iLAogICAgICAgICAgICAidHlwZSI6ICJiaW5kIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L3NobSIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvbXF1ZXVlIiwKICAgICAgICAgICAgInR5cGUiOiAibXF1ZXVlIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJtcXVldWUiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvc3lzIiwKICAgICAgICAgICAgInR5cGUiOiAic3lzZnMiLAogICAgICAgICAgICAic291cmNlIjogInN5c2ZzIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAgICAgIm5vZGV2IiwKICAgICAgICAgICAgICAicm8iCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZXRjL3Jlc29sdi5jb25mIiwKICAgICAgICAgICAgInR5cGUiOiAiYmluZCIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiXi9ydW4va2F0YS1jb250YWluZXJzL3NoYXJlZC9jb250YWluZXJzLyQoYnVuZGxlLWlkKS1bYS16MC05XXsxNn0tcmVzb2x2LmNvbmYkIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicm8iLAogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2RldiIsCiAgICAgICAgICAgICAgIm5vZXhlYyIKICAgICAgICAgICAgXQogICAgICAgICAgfQogICAgICAgIF0sCiAgICAgICAgImFubm90YXRpb25zIjogewogICAgICAgICAgImlvLmthdGFjb250YWluZXJzLnBrZy5vY2kuYnVuZGxlX3BhdGgiOiAiL3J1bi9jb250YWluZXJkL2lvLmNvbnRhaW5lcmQucnVudGltZS52Mi50YXNrL2s4cy5pby8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgImlvLmthdGFjb250YWluZXJzLnBrZy5vY2kuY29udGFpbmVyX3R5cGUiOiAicG9kX3NhbmRib3giLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLmNvbnRhaW5lci10eXBlIjogInNhbmRib3giLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtaWQiOiAiXlthLXowLTldezY0fSQiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbG9nLWRpcmVjdG9yeSI6ICJeL3Zhci9sb2cvcG9kcy8kKHNhbmRib3gtbmFtZXNwYWNlKV8kKHNhbmRib3gtbmFtZSlfWzAtOWEtZl17OH0tWzAtOWEtZl17NH0tWzAtOWEtZl17NH0tWzAtOWEtZl17NH0tWzAtOWEtZl17MTJ9JCIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1uYW1lIjogImRlbW8iLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZXNwYWNlIjogImRlZmF1bHQiLAogICAgICAgICAgIm5lcmRjdGwvbmV0d29yay1uYW1lc3BhY2UiOiAiXi92YXIvcnVuL25ldG5zL2NuaS1bMC05YS1mXXs4fS1bMC05YS1mXXs0fS1bMC05YS1mXXs0fS1bMC05YS1mXXs0fS1bMC05YS1mXXsxMn0kIgogICAgICAgIH0sCiAgICAgICAgImxpbnV4IjogewogICAgICAgICAgIm5hbWVzcGFjZXMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAidHlwZSI6ICJpcGMiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAidHlwZSI6ICJ1dHMiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAidHlwZSI6ICJtb3VudCIKICAgICAgICAgICAgfQogICAgICAgICAgXSwKICAgICAgICAgICJtYXNrZWRQYXRocyI6IFsKICAgICAgICAgICAgIi9wcm9jL2FjcGkiLAogICAgICAgICAgICAiL3Byb2MvYXNvdW5kIiwKICAgICAgICAgICAgIi9wcm9jL2tjb3JlIiwKICAgICAgICAgICAgIi9wcm9jL2tleXMiLAogICAgICAgICAgICAiL3Byb2MvbGF0ZW5jeV9zdGF0cyIsCiAgICAgICAgICAgICIvcHJvYy90aW1lcl9saXN0IiwKICAgICAgICAgICAgIi9wcm9jL3RpbWVyX3N0YXRzIiwKICAgICAgICAgICAgIi9wcm9jL3NjaGVkX2RlYnVnIiwKICAgICAgICAgICAgIi9zeXMvZmlybXdhcmUiLAogICAgICAgICAgICAiL3Byb2Mvc2NzaSIKICAgICAgICAgIF0sCiAgICAgICAgICAicmVhZG9ubHlQYXRocyI6IFsKICAgICAgICAgICAgIi9wcm9jL2J1cyIsCiAgICAgICAgICAgICIvcHJvYy9mcyIsCiAgICAgICAgICAgICIvcHJvYy9pcnEiLAogICAgICAgICAgICAiL3Byb2Mvc3lzIiwKICAgICAgICAgICAgIi9wcm9jL3N5c3JxLXRyaWdnZXIiCiAgICAgICAgICBdCiAgICAgICAgfQogICAgICB9LAogICAgICAic3RvcmFnZXMiOiBbCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJibGsiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogInRhciIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgInJvIiwKICAgICAgICAgICAgImlvLmthdGFjb250YWluZXJzLmZzLW9wdC5ibG9ja19kZXZpY2U9ZmlsZSIsCiAgICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQuaXMtbGF5ZXIiLAogICAgICAgICAgICAiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LnJvb3QtaGFzaD04MTcyNTBmMWEzZTMzNmRhNzZmNWJkM2ZhNzg0ZTFiMjZkOTU5YjljMTMxODc2ODE1YmEyNjA0MDQ4YjcwYzE4IgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L2xheWVycy81YTVhYWQ4MDA1NWZmMjAwMTJhNTBkYzI1ZjhkZjdhMjk5MjQ0NzQzMjRkNjVmN2Q1MzA2ZWU4ZWUyN2ZmNzFkIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAib3ZlcmxheWZzIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXItb3ZlcmxheSIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgImlvLmthdGFjb250YWluZXJzLmZzLW9wdC5sYXllci1zcmMtcHJlZml4PS92YXIvbGliL2NvbnRhaW5lcmQvaW8uY29udGFpbmVyZC5zbmFwc2hvdHRlci52MS50YXJkZXYvbGF5ZXJzIiwKICAgICAgICAgICAgImlvLmthdGFjb250YWluZXJzLmZzLW9wdC5sYXllcj01YTVhYWQ4MDA1NWZmMjAwMTJhNTBkYzI1ZjhkZjdhMjk5MjQ0NzQzMjRkNjVmN2Q1MzA2ZWU4ZWUyN2ZmNzFkLHRhcixybyxpby5rYXRhY29udGFpbmVycy5mcy1vcHQuYmxvY2tfZGV2aWNlPWZpbGUsaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmlzLWxheWVyLGlvLmthdGFjb250YWluZXJzLmZzLW9wdC5yb290LWhhc2g9ODE3MjUwZjFhM2UzMzZkYTc2ZjViZDNmYTc4NGUxYjI2ZDk1OWI5YzEzMTg3NjgxNWJhMjYwNDA0OGI3MGMxOCIsCiAgICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQub3ZlcmxheS1ydyIsCiAgICAgICAgICAgICJsb3dlcmRpcj01YTVhYWQ4MDA1NWZmMjAwMTJhNTBkYzI1ZjhkZjdhMjk5MjQ0NzQzMjRkNjVmN2Q1MzA2ZWU4ZWUyN2ZmNzFkIgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zaGFyZWQvY29udGFpbmVycy8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0KICAgICAgXSwKICAgICAgImV4ZWNfY29tbWFuZHMiOiBbXQogICAgfSwKICAgIHsKICAgICAgIm9jaSI6IHsKICAgICAgICAib2NpVmVyc2lvbiI6ICIxLjEuMC1yYy4xIiwKICAgICAgICAicHJvY2VzcyI6IHsKICAgICAgICAgICJ0ZXJtaW5hbCI6IGZhbHNlLAogICAgICAgICAgInVzZXIiOiB7CiAgICAgICAgICAgICJ1aWQiOiAxMDAxLAogICAgICAgICAgICAiZ2lkIjogMAogICAgICAgICAgfSwKICAgICAgICAgICJhcmdzIjogWwogICAgICAgICAgICAiL29wdC9iaXRuYW1pL3NjcmlwdHMvcmVkaXMvZW50cnlwb2ludC5zaCIsCiAgICAgICAgICAgICIvb3B0L2JpdG5hbWkvc2NyaXB0cy9yZWRpcy9ydW4uc2giCiAgICAgICAgICBdLAogICAgICAgICAgImVudiI6IFsKICAgICAgICAgICAgIlBBVEg9L29wdC9iaXRuYW1pL2NvbW1vbi9iaW46L29wdC9iaXRuYW1pL3JlZGlzL2JpbjovdXNyL2xvY2FsL3NiaW46L3Vzci9sb2NhbC9iaW46L3Vzci9zYmluOi91c3IvYmluOi9zYmluOi9iaW4iLAogICAgICAgICAgICAiSE9NRT0vIiwKICAgICAgICAgICAgIk9TX0FSQ0g9YW1kNjQiLAogICAgICAgICAgICAiT1NfRkxBVk9VUj1kZWJpYW4tMTAiLAogICAgICAgICAgICAiT1NfTkFNRT1saW51eCIsCiAgICAgICAgICAgICJCSVROQU1JX0FQUF9OQU1FPXJlZGlzIiwKICAgICAgICAgICAgIkJJVE5BTUlfSU1BR0VfVkVSU0lPTj02LjAuOC1kZWJpYW4tMTAtcjIzIiwKICAgICAgICAgICAgIkhPU1ROQU1FPSQoaG9zdC1uYW1lKSIsCiAgICAgICAgICAgICJBTExPV19FTVBUWV9QQVNTV09SRD15ZXMiCiAgICAgICAgICBdLAogICAgICAgICAgImN3ZCI6ICIvIiwKICAgICAgICAgICJjYXBhYmlsaXRpZXMiOiB7CiAgICAgICAgICAgICJib3VuZGluZyI6IFsKICAgICAgICAgICAgICAiQ0FQX0NIT1dOIiwKICAgICAgICAgICAgICAiQ0FQX0RBQ19PVkVSUklERSIsCiAgICAgICAgICAgICAgIkNBUF9GU0VUSUQiLAogICAgICAgICAgICAgICJDQVBfRk9XTkVSIiwKICAgICAgICAgICAgICAiQ0FQX01LTk9EIiwKICAgICAgICAgICAgICAiQ0FQX05FVF9SQVciLAogICAgICAgICAgICAgICJDQVBfU0VUR0lEIiwKICAgICAgICAgICAgICAiQ0FQX1NFVFVJRCIsCiAgICAgICAgICAgICAgIkNBUF9TRVRGQ0FQIiwKICAgICAgICAgICAgICAiQ0FQX1NFVFBDQVAiLAogICAgICAgICAgICAgICJDQVBfTkVUX0JJTkRfU0VSVklDRSIsCiAgICAgICAgICAgICAgIkNBUF9TWVNfQ0hST09UIiwKICAgICAgICAgICAgICAiQ0FQX0tJTEwiLAogICAgICAgICAgICAgICJDQVBfQVVESVRfV1JJVEUiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJlZmZlY3RpdmUiOiBbCiAgICAgICAgICAgICAgIkNBUF9DSE9XTiIsCiAgICAgICAgICAgICAgIkNBUF9EQUNfT1ZFUlJJREUiLAogICAgICAgICAgICAgICJDQVBfRlNFVElEIiwKICAgICAgICAgICAgICAiQ0FQX0ZPV05FUiIsCiAgICAgICAgICAgICAgIkNBUF9NS05PRCIsCiAgICAgICAgICAgICAgIkNBUF9ORVRfUkFXIiwKICAgICAgICAgICAgICAiQ0FQX1NFVEdJRCIsCiAgICAgICAgICAgICAgIkNBUF9TRVRVSUQiLAogICAgICAgICAgICAgICJDQVBfU0VURkNBUCIsCiAgICAgICAgICAgICAgIkNBUF9TRVRQQ0FQIiwKICAgICAgICAgICAgICAiQ0FQX05FVF9CSU5EX1NFUlZJQ0UiLAogICAgICAgICAgICAgICJDQVBfU1lTX0NIUk9PVCIsCiAgICAgICAgICAgICAgIkNBUF9LSUxMIiwKICAgICAgICAgICAgICAiQ0FQX0FVRElUX1dSSVRFIgogICAgICAgICAgICBdLAogICAgICAgICAgICAicGVybWl0dGVkIjogWwogICAgICAgICAgICAgICJDQVBfQ0hPV04iLAogICAgICAgICAgICAgICJDQVBfREFDX09WRVJSSURFIiwKICAgICAgICAgICAgICAiQ0FQX0ZTRVRJRCIsCiAgICAgICAgICAgICAgIkNBUF9GT1dORVIiLAogICAgICAgICAgICAgICJDQVBfTUtOT0QiLAogICAgICAgICAgICAgICJDQVBfTkVUX1JBVyIsCiAgICAgICAgICAgICAgIkNBUF9TRVRHSUQiLAogICAgICAgICAgICAgICJDQVBfU0VUVUlEIiwKICAgICAgICAgICAgICAiQ0FQX1NFVEZDQVAiLAogICAgICAgICAgICAgICJDQVBfU0VUUENBUCIsCiAgICAgICAgICAgICAgIkNBUF9ORVRfQklORF9TRVJWSUNFIiwKICAgICAgICAgICAgICAiQ0FQX1NZU19DSFJPT1QiLAogICAgICAgICAgICAgICJDQVBfS0lMTCIsCiAgICAgICAgICAgICAgIkNBUF9BVURJVF9XUklURSIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgICJub05ld1ByaXZpbGVnZXMiOiBmYWxzZQogICAgICAgIH0sCiAgICAgICAgInJvb3QiOiB7CiAgICAgICAgICAicGF0aCI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zaGFyZWQvY29udGFpbmVycy8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgInJlYWRvbmx5IjogZmFsc2UKICAgICAgICB9LAogICAgICAgICJtb3VudHMiOiBbCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvcHJvYyIsCiAgICAgICAgICAgICJ0eXBlIjogInByb2MiLAogICAgICAgICAgICAic291cmNlIjogInByb2MiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2IiwKICAgICAgICAgICAgInR5cGUiOiAidG1wZnMiLAogICAgICAgICAgICAic291cmNlIjogInRtcGZzIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgInN0cmljdGF0aW1lIiwKICAgICAgICAgICAgICAibW9kZT03NTUiLAogICAgICAgICAgICAgICJzaXplPTY1NTM2ayIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvcHRzIiwKICAgICAgICAgICAgInR5cGUiOiAiZGV2cHRzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJkZXZwdHMiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibmV3aW5zdGFuY2UiLAogICAgICAgICAgICAgICJwdG14bW9kZT0wNjY2IiwKICAgICAgICAgICAgICAibW9kZT0wNjIwIiwKICAgICAgICAgICAgICAiZ2lkPTUiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L3NobSIsCiAgICAgICAgICAgICJ0eXBlIjogImJpbmQiLAogICAgICAgICAgICAic291cmNlIjogIi9ydW4va2F0YS1jb250YWluZXJzL3NhbmRib3gvc2htIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi9tcXVldWUiLAogICAgICAgICAgICAidHlwZSI6ICJtcXVldWUiLAogICAgICAgICAgICAic291cmNlIjogIm1xdWV1ZSIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9zeXMiLAogICAgICAgICAgICAidHlwZSI6ICJzeXNmcyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAic3lzZnMiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiLAogICAgICAgICAgICAgICJybyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9zeXMvZnMvY2dyb3VwIiwKICAgICAgICAgICAgInR5cGUiOiAiY2dyb3VwIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJjZ3JvdXAiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiLAogICAgICAgICAgICAgICJyZWxhdGltZSIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2V0Yy9ob3N0cyIsCiAgICAgICAgICAgICJ0eXBlIjogImJpbmQiLAogICAgICAgICAgICAic291cmNlIjogIl4vcnVuL2thdGEtY29udGFpbmVycy9zaGFyZWQvY29udGFpbmVycy8kKGJ1bmRsZS1pZCktW2EtejAtOV17MTZ9LWhvc3RzJCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicnciCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L3Rlcm1pbmF0aW9uLWxvZyIsCiAgICAgICAgICAgICJ0eXBlIjogImJpbmQiLAogICAgICAgICAgICAic291cmNlIjogIl4vcnVuL2thdGEtY29udGFpbmVycy9zaGFyZWQvY29udGFpbmVycy8kKGJ1bmRsZS1pZCktW2EtejAtOV17MTZ9LXRlcm1pbmF0aW9uLWxvZyQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJ3IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2V0Yy9ob3N0bmFtZSIsCiAgICAgICAgICAgICJ0eXBlIjogImJpbmQiLAogICAgICAgICAgICAic291cmNlIjogIl4vcnVuL2thdGEtY29udGFpbmVycy9zaGFyZWQvY29udGFpbmVycy8kKGJ1bmRsZS1pZCktW2EtejAtOV17MTZ9LWhvc3RuYW1lJCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicnciCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZXRjL3Jlc29sdi5jb25mIiwKICAgICAgICAgICAgInR5cGUiOiAiYmluZCIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiXi9ydW4va2F0YS1jb250YWluZXJzL3NoYXJlZC9jb250YWluZXJzLyQoYnVuZGxlLWlkKS1bYS16MC05XXsxNn0tcmVzb2x2LmNvbmYkIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJydyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi92YXIvcnVuL3NlY3JldHMva3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudCIsCiAgICAgICAgICAgICJ0eXBlIjogImJpbmQiLAogICAgICAgICAgICAic291cmNlIjogIl4vcnVuL2thdGEtY29udGFpbmVycy9zaGFyZWQvY29udGFpbmVycy8kKGJ1bmRsZS1pZCktW2EtejAtOV17MTZ9LXNlcnZpY2VhY2NvdW50JCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicm8iCiAgICAgICAgICAgIF0KICAgICAgICAgIH0KICAgICAgICBdLAogICAgICAgICJhbm5vdGF0aW9ucyI6IHsKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmJ1bmRsZV9wYXRoIjogIi9ydW4vY29udGFpbmVyZC9pby5jb250YWluZXJkLnJ1bnRpbWUudjIudGFzay9rOHMuaW8vJChidW5kbGUtaWQpIiwKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIjogInBvZF9jb250YWluZXIiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLmNvbnRhaW5lci1uYW1lIjogImRtaWhhaS1yZWRpcyIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLXR5cGUiOiAiY29udGFpbmVyIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5pbWFnZS1uYW1lIjogImRtaWhhaWFjci5henVyZWNyLmlvL3JlZGlzOjYuMC44IiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWlkIjogIl5bYS16MC05XXs2NH0kIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LW5hbWUiOiAiZGVtbyIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1uYW1lc3BhY2UiOiAiZGVmYXVsdCIKICAgICAgICB9LAogICAgICAgICJsaW51eCI6IHsKICAgICAgICAgICJuYW1lc3BhY2VzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInR5cGUiOiAiaXBjIgogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInR5cGUiOiAidXRzIgogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInR5cGUiOiAibW91bnQiCiAgICAgICAgICAgIH0KICAgICAgICAgIF0sCiAgICAgICAgICAibWFza2VkUGF0aHMiOiBbCiAgICAgICAgICAgICIvcHJvYy9hY3BpIiwKICAgICAgICAgICAgIi9wcm9jL2tjb3JlIiwKICAgICAgICAgICAgIi9wcm9jL2tleXMiLAogICAgICAgICAgICAiL3Byb2MvbGF0ZW5jeV9zdGF0cyIsCiAgICAgICAgICAgICIvcHJvYy90aW1lcl9saXN0IiwKICAgICAgICAgICAgIi9wcm9jL3RpbWVyX3N0YXRzIiwKICAgICAgICAgICAgIi9wcm9jL3NjaGVkX2RlYnVnIiwKICAgICAgICAgICAgIi9wcm9jL3Njc2kiLAogICAgICAgICAgICAiL3N5cy9maXJtd2FyZSIKICAgICAgICAgIF0sCiAgICAgICAgICAicmVhZG9ubHlQYXRocyI6IFsKICAgICAgICAgICAgIi9wcm9jL2Fzb3VuZCIsCiAgICAgICAgICAgICIvcHJvYy9idXMiLAogICAgICAgICAgICAiL3Byb2MvZnMiLAogICAgICAgICAgICAiL3Byb2MvaXJxIiwKICAgICAgICAgICAgIi9wcm9jL3N5cyIsCiAgICAgICAgICAgICIvcHJvYy9zeXNycS10cmlnZ2VyIgogICAgICAgICAgXQogICAgICAgIH0KICAgICAgfSwKICAgICAgInN0b3JhZ2VzIjogWwogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICJybyIsCiAgICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQuYmxvY2tfZGV2aWNlPWZpbGUiLAogICAgICAgICAgICAiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmlzLWxheWVyIiwKICAgICAgICAgICAgImlvLmthdGFjb250YWluZXJzLmZzLW9wdC5yb290LWhhc2g9YzZjMDYyYzk3YmI1MzNkNTU0OWE0ZDk1YzNkY2NmMGE3NThlNDIzNDk3YmQ3M2Q0NTI1ZjgxYjY5N2EyNDAzMCIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiL3J1bi9rYXRhLWNvbnRhaW5lcnMvc2FuZGJveC9sYXllcnMvYmRmZTJkMjRmYWMyNGIzNzZlY2Y0MWRhOWZhNjlmZWM4NjMyMWRjMTU1MWI4Y2NjNWNjYjg0YmQwNGUwM2JiNSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAicm8iLAogICAgICAgICAgICAiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmJsb2NrX2RldmljZT1maWxlIiwKICAgICAgICAgICAgImlvLmthdGFjb250YWluZXJzLmZzLW9wdC5pcy1sYXllciIsCiAgICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQucm9vdC1oYXNoPTU1ZDBhZTA3ZjJjMDRlNmM5ZTYwMGM4NzRhMjViOWFhZTEzNDYwMGY2NDliY2JjODEwN2EwYmY0ZDExZjgxMjEiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIi9ydW4va2F0YS1jb250YWluZXJzL3NhbmRib3gvbGF5ZXJzL2E2ZTdiMWUxMTY3NTQwMmMzMDQ5ODNlNTc3OThhZWIxODlkNDE1ZDQ5MjIwMjY2NmExOGM4YTg4NDM2YTU2ZTUiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJibGsiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogInRhciIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgInJvIiwKICAgICAgICAgICAgImlvLmthdGFjb250YWluZXJzLmZzLW9wdC5ibG9ja19kZXZpY2U9ZmlsZSIsCiAgICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQuaXMtbGF5ZXIiLAogICAgICAgICAgICAiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LnJvb3QtaGFzaD0zNDkwNWRlMGJhMDk5NWQyNGU3MmQxNjA3ODUyNzZlNTFjMzFjOTNlMmM2NTRmZDI4YTAyM2ZiZTU3MjBkNDg3IgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L2xheWVycy81YWRlNzNlOTBlYTU3OGU4ZTEwYzNiYTBlNDA2NWI0NDY3ZTE1MzA5NmJiZGJiNzM2ZTFlMjRhODNhOGI3NDIyIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICJybyIsCiAgICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQuYmxvY2tfZGV2aWNlPWZpbGUiLAogICAgICAgICAgICAiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmlzLWxheWVyIiwKICAgICAgICAgICAgImlvLmthdGFjb250YWluZXJzLmZzLW9wdC5yb290LWhhc2g9ODE3MTBlMDQ0YzRjY2U0NjI3OTk4MmE1YTk1N2I5YmIxNzNhZWQyYmY0YjBhNGFkN2Q3NjlmY2Q5NmY5MzJmNyIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiL3J1bi9rYXRhLWNvbnRhaW5lcnMvc2FuZGJveC9sYXllcnMvZTkxMDgyMTNmNjU4MzU1ZjEzMTI4YzJkYjBmMmJkZThhOWNmMjY4YWU2MjY5OTE3NzU2Yjk4ZjZjY2QyMTI1NSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAicm8iLAogICAgICAgICAgICAiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmJsb2NrX2RldmljZT1maWxlIiwKICAgICAgICAgICAgImlvLmthdGFjb250YWluZXJzLmZzLW9wdC5pcy1sYXllciIsCiAgICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQucm9vdC1oYXNoPWEwYWI2NTQ1NTE4NDM0NDJjYjhhNzg0YzZlMjc2ODM0MGJiODgyZTA0OGQxNDBjMjI4ZmQ1YjE4YWU4MWRiYzQiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIi9ydW4va2F0YS1jb250YWluZXJzL3NhbmRib3gvbGF5ZXJzLzMxZTZjMjRhNGMxZDFhZDRhYzcxNDAxM2M0MDBhMWUwZDNlZGE2ZGU2MDQ5NTBmNTQ2YzhjNWRlY2M1OWMxOWQiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJibGsiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogInRhciIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgInJvIiwKICAgICAgICAgICAgImlvLmthdGFjb250YWluZXJzLmZzLW9wdC5ibG9ja19kZXZpY2U9ZmlsZSIsCiAgICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQuaXMtbGF5ZXIiLAogICAgICAgICAgICAiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LnJvb3QtaGFzaD1kNWQ4ZDYxODdiMjc1NDFmODk4ZmJlMThlNTg2MTE2ZjBjMjczNWQ5MjQ5MDZhMWM1ZDA1YWQ3MTA2YzNhNWZmIgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L2xheWVycy9jNmQ0NzU4ZGI0YzA5MTA0YjA1NTRhM2ZmMjVkMzdlNDJlNGYwNzk1YTAyMmYyYTQyZjcxNDEyOTQzNmNlMTQzIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICJybyIsCiAgICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQuYmxvY2tfZGV2aWNlPWZpbGUiLAogICAgICAgICAgICAiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmlzLWxheWVyIiwKICAgICAgICAgICAgImlvLmthdGFjb250YWluZXJzLmZzLW9wdC5yb290LWhhc2g9M2MxNjVkNjY2NDEwNTM5MjgzODgxNDc3MGQ3ZTc0MzRhMWIwYzM1YjEwNjhlMDUzMjk1ODhkM2VkNDk0MzBmZiIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiL3J1bi9rYXRhLWNvbnRhaW5lcnMvc2FuZGJveC9sYXllcnMvOTQ0NDJkN2Q3NzM1MjgxMzIwNmYxZGMwOTliZGIzYzk5MGYzYmMwZDJlYTY2NjE1NTE0Yzk5MGNlMTA3NjM2NCIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAicm8iLAogICAgICAgICAgICAiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmJsb2NrX2RldmljZT1maWxlIiwKICAgICAgICAgICAgImlvLmthdGFjb250YWluZXJzLmZzLW9wdC5pcy1sYXllciIsCiAgICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQucm9vdC1oYXNoPTg1MTcxNzlkM2U5OTE5ZGZlZDQyYjEyODJjYzM5M2MzOTJjNTZiMGQ4Mjk4MzQ3ODcyYzlhOTk2NDdjNTYwYWYiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIi9ydW4va2F0YS1jb250YWluZXJzL3NhbmRib3gvbGF5ZXJzLzU3NGI3M2U2NmRhZjJjNzM1NzI5ZDc0YTY5NTQ2MDkzZmRjMDY4MTMxYWVkZGI1ODAyYmRkOWVjOTdmNDEwMzAiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJibGsiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogInRhciIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgInJvIiwKICAgICAgICAgICAgImlvLmthdGFjb250YWluZXJzLmZzLW9wdC5ibG9ja19kZXZpY2U9ZmlsZSIsCiAgICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQuaXMtbGF5ZXIiLAogICAgICAgICAgICAiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LnJvb3QtaGFzaD04M2I4NTIwODFhMDUyZjJhODMyZGRmYzA0ZGViNmRlZWM0YmE3MDg1NDQyYTM2MGI1MjQ3OTdlZDE2YTM5OGQzIgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L2xheWVycy8zZjUyY2I2NTI1ZDhlNjhkNTczYzM4MWY2ZDEwNGRkMTY4Y2MwYjMzYTExNjhmMTZiMDBjODc3Y2U4YjhiNjE1IiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICJybyIsCiAgICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQuYmxvY2tfZGV2aWNlPWZpbGUiLAogICAgICAgICAgICAiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmlzLWxheWVyIiwKICAgICAgICAgICAgImlvLmthdGFjb250YWluZXJzLmZzLW9wdC5yb290LWhhc2g9YTM5NzhhYWI5ZTc1NmQ2YjZkNGIzM2RjMzFkMTVlNTQzZjQyZWRkNmJmZjUzMWFkYTNkN2UzODQyMWJlNGU3NSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiL3J1bi9rYXRhLWNvbnRhaW5lcnMvc2FuZGJveC9sYXllcnMvNmI3NjcwNDZlZjA3NzcxNDk4M2E2NzUzYjlmOWZiNDExMmQ0MTBkMzYwZWFiYTU5NzBjMmY3M2IzNDY0YjgyMiIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAicm8iLAogICAgICAgICAgICAiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmJsb2NrX2RldmljZT1maWxlIiwKICAgICAgICAgICAgImlvLmthdGFjb250YWluZXJzLmZzLW9wdC5pcy1sYXllciIsCiAgICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQucm9vdC1oYXNoPTM5ZTg1ZjcyYTZkODQxOTVhNTdiMzM4NWE0ZTY4Yjc5MTUxY2RjMTkxN2ExNjFmOWI4Nzk5ZTY4ZjVlYTgxZDkiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIi9ydW4va2F0YS1jb250YWluZXJzL3NhbmRib3gvbGF5ZXJzL2ZjYmViOTk1OWY0NDIzMWNmYmYzZjRiNjc5ODI4MTlhZjYyY2YxZjYxNDc2MzRjZjZiMTdhYTM4N2Q2OGEwYjciLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJvdmVybGF5ZnMiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogInRhci1vdmVybGF5IiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmxheWVyLXNyYy1wcmVmaXg9L3Zhci9saWIvY29udGFpbmVyZC9pby5jb250YWluZXJkLnNuYXBzaG90dGVyLnYxLnRhcmRldi9sYXllcnMiLAogICAgICAgICAgICAiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmxheWVyPWJkZmUyZDI0ZmFjMjRiMzc2ZWNmNDFkYTlmYTY5ZmVjODYzMjFkYzE1NTFiOGNjYzVjY2I4NGJkMDRlMDNiYjUsdGFyLHJvLGlvLmthdGFjb250YWluZXJzLmZzLW9wdC5ibG9ja19kZXZpY2U9ZmlsZSxpby5rYXRhY29udGFpbmVycy5mcy1vcHQuaXMtbGF5ZXIsaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LnJvb3QtaGFzaD1jNmMwNjJjOTdiYjUzM2Q1NTQ5YTRkOTVjM2RjY2YwYTc1OGU0MjM0OTdiZDczZDQ1MjVmODFiNjk3YTI0MDMwIiwKICAgICAgICAgICAgImlvLmthdGFjb250YWluZXJzLmZzLW9wdC5sYXllcj1hNmU3YjFlMTE2NzU0MDJjMzA0OTgzZTU3Nzk4YWViMTg5ZDQxNWQ0OTIyMDI2NjZhMThjOGE4ODQzNmE1NmU1LHRhcixybyxpby5rYXRhY29udGFpbmVycy5mcy1vcHQuYmxvY2tfZGV2aWNlPWZpbGUsaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmlzLWxheWVyLGlvLmthdGFjb250YWluZXJzLmZzLW9wdC5yb290LWhhc2g9NTVkMGFlMDdmMmMwNGU2YzllNjAwYzg3NGEyNWI5YWFlMTM0NjAwZjY0OWJjYmM4MTA3YTBiZjRkMTFmODEyMSIsCiAgICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQubGF5ZXI9NWFkZTczZTkwZWE1NzhlOGUxMGMzYmEwZTQwNjViNDQ2N2UxNTMwOTZiYmRiYjczNmUxZTI0YTgzYThiNzQyMix0YXIscm8saW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmJsb2NrX2RldmljZT1maWxlLGlvLmthdGFjb250YWluZXJzLmZzLW9wdC5pcy1sYXllcixpby5rYXRhY29udGFpbmVycy5mcy1vcHQucm9vdC1oYXNoPTM0OTA1ZGUwYmEwOTk1ZDI0ZTcyZDE2MDc4NTI3NmU1MWMzMWM5M2UyYzY1NGZkMjhhMDIzZmJlNTcyMGQ0ODciLAogICAgICAgICAgICAiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmxheWVyPWU5MTA4MjEzZjY1ODM1NWYxMzEyOGMyZGIwZjJiZGU4YTljZjI2OGFlNjI2OTkxNzc1NmI5OGY2Y2NkMjEyNTUsdGFyLHJvLGlvLmthdGFjb250YWluZXJzLmZzLW9wdC5ibG9ja19kZXZpY2U9ZmlsZSxpby5rYXRhY29udGFpbmVycy5mcy1vcHQuaXMtbGF5ZXIsaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LnJvb3QtaGFzaD04MTcxMGUwNDRjNGNjZTQ2Mjc5OTgyYTVhOTU3YjliYjE3M2FlZDJiZjRiMGE0YWQ3ZDc2OWZjZDk2ZjkzMmY3IiwKICAgICAgICAgICAgImlvLmthdGFjb250YWluZXJzLmZzLW9wdC5sYXllcj0zMWU2YzI0YTRjMWQxYWQ0YWM3MTQwMTNjNDAwYTFlMGQzZWRhNmRlNjA0OTUwZjU0NmM4YzVkZWNjNTljMTlkLHRhcixybyxpby5rYXRhY29udGFpbmVycy5mcy1vcHQuYmxvY2tfZGV2aWNlPWZpbGUsaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmlzLWxheWVyLGlvLmthdGFjb250YWluZXJzLmZzLW9wdC5yb290LWhhc2g9YTBhYjY1NDU1MTg0MzQ0MmNiOGE3ODRjNmUyNzY4MzQwYmI4ODJlMDQ4ZDE0MGMyMjhmZDViMThhZTgxZGJjNCIsCiAgICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQubGF5ZXI9YzZkNDc1OGRiNGMwOTEwNGIwNTU0YTNmZjI1ZDM3ZTQyZTRmMDc5NWEwMjJmMmE0MmY3MTQxMjk0MzZjZTE0Myx0YXIscm8saW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmJsb2NrX2RldmljZT1maWxlLGlvLmthdGFjb250YWluZXJzLmZzLW9wdC5pcy1sYXllcixpby5rYXRhY29udGFpbmVycy5mcy1vcHQucm9vdC1oYXNoPWQ1ZDhkNjE4N2IyNzU0MWY4OThmYmUxOGU1ODYxMTZmMGMyNzM1ZDkyNDkwNmExYzVkMDVhZDcxMDZjM2E1ZmYiLAogICAgICAgICAgICAiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmxheWVyPTk0NDQyZDdkNzczNTI4MTMyMDZmMWRjMDk5YmRiM2M5OTBmM2JjMGQyZWE2NjYxNTUxNGM5OTBjZTEwNzYzNjQsdGFyLHJvLGlvLmthdGFjb250YWluZXJzLmZzLW9wdC5ibG9ja19kZXZpY2U9ZmlsZSxpby5rYXRhY29udGFpbmVycy5mcy1vcHQuaXMtbGF5ZXIsaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LnJvb3QtaGFzaD0zYzE2NWQ2NjY0MTA1MzkyODM4ODE0NzcwZDdlNzQzNGExYjBjMzViMTA2OGUwNTMyOTU4OGQzZWQ0OTQzMGZmIiwKICAgICAgICAgICAgImlvLmthdGFjb250YWluZXJzLmZzLW9wdC5sYXllcj01NzRiNzNlNjZkYWYyYzczNTcyOWQ3NGE2OTU0NjA5M2ZkYzA2ODEzMWFlZGRiNTgwMmJkZDllYzk3ZjQxMDMwLHRhcixybyxpby5rYXRhY29udGFpbmVycy5mcy1vcHQuYmxvY2tfZGV2aWNlPWZpbGUsaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmlzLWxheWVyLGlvLmthdGFjb250YWluZXJzLmZzLW9wdC5yb290LWhhc2g9ODUxNzE3OWQzZTk5MTlkZmVkNDJiMTI4MmNjMzkzYzM5MmM1NmIwZDgyOTgzNDc4NzJjOWE5OTY0N2M1NjBhZiIsCiAgICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQubGF5ZXI9M2Y1MmNiNjUyNWQ4ZTY4ZDU3M2MzODFmNmQxMDRkZDE2OGNjMGIzM2ExMTY4ZjE2YjAwYzg3N2NlOGI4YjYxNSx0YXIscm8saW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmJsb2NrX2RldmljZT1maWxlLGlvLmthdGFjb250YWluZXJzLmZzLW9wdC5pcy1sYXllcixpby5rYXRhY29udGFpbmVycy5mcy1vcHQucm9vdC1oYXNoPTgzYjg1MjA4MWEwNTJmMmE4MzJkZGZjMDRkZWI2ZGVlYzRiYTcwODU0NDJhMzYwYjUyNDc5N2VkMTZhMzk4ZDMiLAogICAgICAgICAgICAiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmxheWVyPTZiNzY3MDQ2ZWYwNzc3MTQ5ODNhNjc1M2I5ZjlmYjQxMTJkNDEwZDM2MGVhYmE1OTcwYzJmNzNiMzQ2NGI4MjIsdGFyLHJvLGlvLmthdGFjb250YWluZXJzLmZzLW9wdC5ibG9ja19kZXZpY2U9ZmlsZSxpby5rYXRhY29udGFpbmVycy5mcy1vcHQuaXMtbGF5ZXIsaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LnJvb3QtaGFzaD1hMzk3OGFhYjllNzU2ZDZiNmQ0YjMzZGMzMWQxNWU1NDNmNDJlZGQ2YmZmNTMxYWRhM2Q3ZTM4NDIxYmU0ZTc1IiwKICAgICAgICAgICAgImlvLmthdGFjb250YWluZXJzLmZzLW9wdC5sYXllcj1mY2JlYjk5NTlmNDQyMzFjZmJmM2Y0YjY3OTgyODE5YWY2MmNmMWY2MTQ3NjM0Y2Y2YjE3YWEzODdkNjhhMGI3LHRhcixybyxpby5rYXRhY29udGFpbmVycy5mcy1vcHQuYmxvY2tfZGV2aWNlPWZpbGUsaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmlzLWxheWVyLGlvLmthdGFjb250YWluZXJzLmZzLW9wdC5yb290LWhhc2g9MzllODVmNzJhNmQ4NDE5NWE1N2IzMzg1YTRlNjhiNzkxNTFjZGMxOTE3YTE2MWY5Yjg3OTllNjhmNWVhODFkOSIsCiAgICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQub3ZlcmxheS1ydyIsCiAgICAgICAgICAgICJsb3dlcmRpcj1iZGZlMmQyNGZhYzI0YjM3NmVjZjQxZGE5ZmE2OWZlYzg2MzIxZGMxNTUxYjhjY2M1Y2NiODRiZDA0ZTAzYmI1OmE2ZTdiMWUxMTY3NTQwMmMzMDQ5ODNlNTc3OThhZWIxODlkNDE1ZDQ5MjIwMjY2NmExOGM4YTg4NDM2YTU2ZTU6NWFkZTczZTkwZWE1NzhlOGUxMGMzYmEwZTQwNjViNDQ2N2UxNTMwOTZiYmRiYjczNmUxZTI0YTgzYThiNzQyMjplOTEwODIxM2Y2NTgzNTVmMTMxMjhjMmRiMGYyYmRlOGE5Y2YyNjhhZTYyNjk5MTc3NTZiOThmNmNjZDIxMjU1OjMxZTZjMjRhNGMxZDFhZDRhYzcxNDAxM2M0MDBhMWUwZDNlZGE2ZGU2MDQ5NTBmNTQ2YzhjNWRlY2M1OWMxOWQ6YzZkNDc1OGRiNGMwOTEwNGIwNTU0YTNmZjI1ZDM3ZTQyZTRmMDc5NWEwMjJmMmE0MmY3MTQxMjk0MzZjZTE0Mzo5NDQ0MmQ3ZDc3MzUyODEzMjA2ZjFkYzA5OWJkYjNjOTkwZjNiYzBkMmVhNjY2MTU1MTRjOTkwY2UxMDc2MzY0OjU3NGI3M2U2NmRhZjJjNzM1NzI5ZDc0YTY5NTQ2MDkzZmRjMDY4MTMxYWVkZGI1ODAyYmRkOWVjOTdmNDEwMzA6M2Y1MmNiNjUyNWQ4ZTY4ZDU3M2MzODFmNmQxMDRkZDE2OGNjMGIzM2ExMTY4ZjE2YjAwYzg3N2NlOGI4YjYxNTo2Yjc2NzA0NmVmMDc3NzE0OTgzYTY3NTNiOWY5ZmI0MTEyZDQxMGQzNjBlYWJhNTk3MGMyZjczYjM0NjRiODIyOmZjYmViOTk1OWY0NDIzMWNmYmYzZjRiNjc5ODI4MTlhZjYyY2YxZjYxNDc2MzRjZjZiMTdhYTM4N2Q2OGEwYjciCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIi9ydW4va2F0YS1jb250YWluZXJzL3NoYXJlZC9jb250YWluZXJzLyQoYnVuZGxlLWlkKSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfQogICAgICBdLAogICAgICAiZXhlY19jb21tYW5kcyI6IFtdCiAgICB9CiAgXQp9 +spec: + imagePullSecrets: + - name: acr-secret + restartPolicy: Never + runtimeClassName: kata-cc + containers: + - image: "dmihaiacr.azurecr.io/redis:6.0.8" + name: dmihai-redis + imagePullPolicy: Always + env: + - name: ALLOW_EMPTY_PASSWORD + value: "yes" + ports: + - containerPort: 6379 + name: redis diff --git a/src/agent/samples/policy/yaml/deployment/deployment-back.yaml b/src/agent/samples/policy/yaml/deployment/deployment-back.yaml new file mode 100644 index 000000000000..1c9ed5d18c17 --- /dev/null +++ b/src/agent/samples/policy/yaml/deployment/deployment-back.yaml @@ -0,0 +1,43 @@ +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: backend + labels: + app: backend +spec: + replicas: 1 + selector: + matchLabels: + app: backend + template: + metadata: + labels: + app: backend + annotations: + io.katacontainers.config.agent.policy: IyBDb3B5cmlnaHQgKGMpIDIwMjMgTWljcm9zb2Z0IENvcnBvcmF0aW9uCiMKIyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMAojCnBhY2thZ2UgYWdlbnRfcG9saWN5CgppbXBvcnQgZnV0dXJlLmtleXdvcmRzLmluCmltcG9ydCBmdXR1cmUua2V5d29yZHMuZXZlcnkKCiMgRGVmYXVsdCB2YWx1ZXMsIHJldHVybmVkIGJ5IE9QQSB3aGVuIHJ1bGVzIGNhbm5vdCBiZSBldmFsdWF0ZWQgdG8gdHJ1ZS4KZGVmYXVsdCBBZGRBUlBOZWlnaGJvcnNSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgQWRkU3dhcFJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBDbG9zZVN0ZGluUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IENvcHlGaWxlUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IENyZWF0ZUNvbnRhaW5lclJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBDcmVhdGVTYW5kYm94UmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IERlc3Ryb3lTYW5kYm94UmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgRXhlY1Byb2Nlc3NSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgR2V0T09NRXZlbnRSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBHdWVzdERldGFpbHNSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBMaXN0SW50ZXJmYWNlc1JlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBMaXN0Um91dGVzUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IE1lbUhvdHBsdWdCeVByb2JlUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IE9ubGluZUNQVU1lbVJlcXVlc3QgOj0gdHJ1ZQpkZWZhdWx0IFBhdXNlQ29udGFpbmVyUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFJlYWRTdHJlYW1SZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgUmVtb3ZlQ29udGFpbmVyUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgUmVtb3ZlU3RhbGVWaXJ0aW9mc1NoYXJlTW91bnRzUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgUmVzZWVkUmFuZG9tRGV2UmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFJlc3VtZUNvbnRhaW5lclJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBTZXRHdWVzdERhdGVUaW1lUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFNldFBvbGljeVJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBTaWduYWxQcm9jZXNzUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgU3RhcnRDb250YWluZXJSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBTdGFydFRyYWNpbmdSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgU3RhdHNDb250YWluZXJSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBTdG9wVHJhY2luZ1JlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBUdHlXaW5SZXNpemVSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBVcGRhdGVDb250YWluZXJSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgVXBkYXRlRXBoZW1lcmFsTW91bnRzUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFVwZGF0ZUludGVyZmFjZVJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBVcGRhdGVSb3V0ZXNSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgV2FpdFByb2Nlc3NSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBXcml0ZVN0cmVhbVJlcXVlc3QgOj0gZmFsc2UKCiMgQWxsb3dSZXF1ZXN0c0ZhaWxpbmdQb2xpY3kgOj0gdHJ1ZSBjb25maWd1cmVzIHRoZSBBZ2VudCB0byAqYWxsb3cgYW55CiMgcmVxdWVzdHMgY2F1c2luZyBhIHBvbGljeSBmYWlsdXJlKi4gVGhpcyBpcyBhbiB1bnNlY3VyZSBjb25maWd1cmF0aW9uCiMgYnV0IGlzIHVzZWZ1bCBmb3IgYWxsb3dpbmcgdW5zZWN1cmUgcG9kcyB0byBzdGFydCwgdGhlbiBjb25uZWN0IHRvCiMgdGhlbSBhbmQgaW5zcGVjdCBPUEEgbG9ncyBmb3IgdGhlIHJvb3QgY2F1c2Ugb2YgYSBmYWlsdXJlLgpkZWZhdWx0IEFsbG93UmVxdWVzdHNGYWlsaW5nUG9saWN5IDo9IGZhbHNlCgojIENvbnN0YW50cwpTX05BTUVfS0VZID0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZSIKU19OQU1FU1BBQ0VfS0VZID0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZXNwYWNlIgpCVU5ETEVfSUQgPSAiW2EtejAtOV17NjR9IgoKQ3JlYXRlQ29udGFpbmVyUmVxdWVzdDo9IHJlc3AgewogICAgbm90IGlzX251bGwoaW5wdXQuZW52X21hcCkKICAgIAogICAgaV9lbnZfbWFwIDo9IGlucHV0LmVudl9tYXAKICAgIAogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBwX2Vudl9tYXAgOj0gcF9jb250YWluZXIuZW52X21hcCAgCiAgICBhbGxvd19lbnZfbWFwKHBfZW52X21hcCwgaV9lbnZfbWFwKQogICAgCiAgICBpX3Byb2Nlc3MgOj0gaW5wdXQuYmFzZS5PQ0kuUHJvY2VzcwogICAgCiAgICBwX3Byb2Nlc3MgOj0gcF9jb250YWluZXIuT0NJLlByb2Nlc3MKICAgIAogICAgYWxsb3dfYXJncyhpX3Byb2Nlc3MsIHBfcHJvY2VzcywgaV9lbnZfbWFwKQoKICAgIHJlc3AgPSBDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uKGlucHV0LmJhc2UpCiAgICBwcmludCgiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdDogdHJ1ZSIpCn0KCmFsbG93X2FyZ3MoaV9wcm9jZXNzLCBwX3Byb2Nlc3MsIGlfZW52X21hcCkgewogICAgaV9hcmdzIDo9IGlfcHJvY2Vzcy5BcmdzCiAgICBwX2FyZ3MgOj0gcF9wcm9jZXNzLkFyZ3MKICAgIHByaW50KCJhbGxvd19hcmdzOiBpX2FyZ3MgPSIsIGlfYXJncywgInBfYXJncyA9IiwgcF9hcmdzKQogICAgY291bnQoaV9hcmdzKSA9PSBjb3VudChwX2FyZ3MpCiAgICBldmVyeSBpLCBpX2FyZyBpbiBpX2FyZ3MgewogICAgICAgIHByaW50KCJhbGxvd19hcmdzOiBpX2FyZyA9IiwgaV9hcmcpCiAgICAgICAgcF9hcmdfcmVwbGFjZWQgOj0gcmVwbGFjZV9lbnZfdmFyaWFibGVzKHBfYXJnc1tpXSwgaV9lbnZfbWFwKQogICAgICAgIHByaW50KCJhbGxvd19hcmdzOiBwX2FyZ19yZXBsYWNlZCA9IiwgcF9hcmdfcmVwbGFjZWQpCiAgICAgICAgcF9hcmdfcmVwbGFjZWQyIDo9IHJlcGxhY2UocF9hcmdfcmVwbGFjZWQsICIkJCIsICIkIikKICAgICAgICBwcmludCgiYWxsb3dfYXJnczogcF9hcmdfcmVwbGFjZWQyID0iLCBwX2FyZ19yZXBsYWNlZDIpCiAgICAgICAgaV9hcmcgPT0gcF9hcmdfcmVwbGFjZWQyCiAgICB9CiAgICBwcmludCgiYWxsb3dfYXJnczogdHJ1ZSIpCn0KCmFsbG93X2FyZ3MoaV9wcm9jZXNzLCBwX3Byb2Nlc3MsIGlfZW52X21hcCkgewogICAgbm90IGlfcHJvY2Vzcy5BcmdzCiAgICBub3QgcF9wcm9jZXNzLkFyZ3MKICAgIHByaW50KCJhbGxvd19hcmdzMjogbm8gYXJncyIpCn0KCiMgdGhpcyBmdW5jdGlvbiByZXBsYWNlcyBhbGwgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyBpbiBhIHN0cmluZywgZ2l2ZW4gYSBtYXAgb2YgZW52aXJvbm1lbnQga2V5cyB0byBlbnZpcm9ubWVudCB2YWx1ZXMKIyBlZyBzdHIgPSAiZWNobyAkKENMVVNURVJfSUQpOyBlY2hvICQoTk9ERV9OQU1FKTsiCiMgZW52X21hcCA9IHsiQ0xVU1RFUl9JRCI6ICJhYmMiLCAiTk9ERV9OQU1FIiA6ICJ4eXoifQojIHJlc3VsdCA9ICJlY2hvIGFiYzsgZWNobyB4eXo7IgpyZXBsYWNlX2Vudl92YXJpYWJsZXMoc3RyLCBlbnZfbWFwKSA9IHJlc3VsdCB7CiAgICAjIG1ha2UgYW4gYXJyYXkgb2YgdGhlIGtleXMgZWcgWyJDTFVTVEVSX0lEIiwgIk5PREVfTkFNRSJdCiAgICBrZXlzIDo9IFt4IHwgc29tZSB4IGluIG9iamVjdC5rZXlzKGVudl9tYXApXQogICAgcmVzdWx0IDo9IHJlcGxhY2Vfc3RyX3JlYyhzdHIsIGVudl9tYXAsIGtleXMsIGNvdW50KGtleXMpIC0gMSkKfQoKIyBiYXNlIGNhc2UKcmVwbGFjZV9zdHJfcmVjKHN0ciwgZW52X21hcCwgYXJyX2tleXMsIGkpID0gcmVzdWx0IHsKICAgIGkgPCAwCiAgICByZXN1bHQgOj0gc3RyCn0KCiMgcmVjdXJzaXZlIHN0ZXAKcmVwbGFjZV9zdHJfcmVjKHN0ciwgZW52X21hcCwgYXJyX2tleXMsIGkpID0gcmVzdWx0IHsKICAgIGkgPj0gMAogICAga2V5IDo9IGFycl9rZXlzW2ldCiAgICBlbnZfa2V5MSA6PSBjb25jYXQoIiIsIFsiJCgiLCBrZXksICIpIl0pCiAgICAjIHJlcGxhY2UgJChWQVIpIHdpdGggdmFsdWUKICAgIG5ld19zdHIxIDo9IHJlcGxhY2Uoc3RyLCBlbnZfa2V5MSwgZW52X21hcFtrZXldKQogICAgIyByZXBsYWNlIG5leHQgZW52aXJvbm1lbnQgdmFyaWFibGUKICAgIHJlc3VsdCA9IHJlcGxhY2Vfc3RyX3JlYyhuZXdfc3RyMSwgZW52X21hcCwgYXJyX2tleXMsIGkgLSAxKQp9CgphbGxvd19lbnZfbWFwKHBfZW52X21hcCwgaV9lbnZfbWFwKSB7CiAgICBwcmludCgiYWxsb3dfZW52X21hcDogcF9lbnZfbWFwID0iLCBwX2Vudl9tYXApCiAgICBldmVyeSBlbnZfa2V5LCBlbnZfdmFsIGluIGlfZW52X21hcCB7CiAgICAgICAgcHJpbnQoImFsbG93X2VudjogZW52X2tleSA9IiwgZW52X2tleSwgImVudl92YWwgPSIsIGVudl92YWwpCiAgICAgICAgYWxsb3dfZW52X21hcF9lbnRyeShlbnZfa2V5LCBlbnZfdmFsLCBwX2Vudl9tYXApCiAgICB9CiAgICBwcmludCgiYWxsb3dfZW52X21hcDogdHJ1ZSIpCn0KCiMgQWxsb3cgZXhhY3QgbWF0Y2gKYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBpX3ZhbCA9PSBwX3ZhbAogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnk6IHRydWUiKQp9CgojIEFsbG93IHJlc291cmNlRmllbGRSZWYgdmFsdWVzIChlLmcuLCAibGltaXRzLmNwdSIpLgphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgICMgYSB2YXJpYWJsZSB3ZSBzaG91bGQgYmUgdmFsaWRhdGluZyB1c2luZyBhIHJlZ2V4IGZyb20gc2V0dGluZ3MKICAgIHBfdmFsID09ICIkKHZhbGlkYXRlLWZyb20tc2V0dGluZ3MpIgogICAgcmVnZXhfdmFsIDo9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuQ3JlYXRlQ29udGFpbmVyUmVxdWVzdC5hbGxvd19lbnZfcmVnZXhfbWFwW2tleV0KICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4X3ZhbCwgaV92YWwpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSAyOiB0cnVlIikKfQoKIyBBbGxvdyBub2RlLW5hbWUKYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChub2RlLW5hbWUpIgogICAgcmVnZXgubWF0Y2gocG9saWN5X2RhdGEuY29tbW9uLmRuc19zdWJkb21haW4gLCBpX3ZhbCkKICAgIHByaW50KCJhbGxvd19lbnZfbWFwX2VudHJ5IDM6IHRydWUiKQp9CgojIEFsbG93IGhvc3QtbmFtZQphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgIHBfdmFsID09ICIkKGhvc3QtbmFtZSkiCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24uZG5zX2xhYmVsICwgaV92YWwpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSA0OiB0cnVlIikKfQoKIyBBbGxvdyBwb2QtdWlkCmFsbG93X2Vudl9tYXBfZW50cnkoa2V5LCBpX3ZhbCwgcF9lbnZfbWFwKSB7CiAgICBwX3ZhbCA6PSBwX2Vudl9tYXBba2V5XQogICAgcF92YWwgPT0gIiQocG9kLXVpZCkiCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24ucG9kX3VpZCAsIGlfdmFsKQogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgNTogdHJ1ZSIpCn0KCiMgQWxsb3cgZmllbGRSZWYgImZpZWxkUGF0aDogc3RhdHVzLnBvZElQIiB2YWx1ZXMuCmFsbG93X2Vudl9tYXBfZW50cnkoa2V5LCBpX3ZhbCwgcF9lbnZfbWFwKSB7CiAgICBpc19pcChpX3ZhbCkKCiAgICBwX3ZhbCA6PSBwX2Vudl9tYXBba2V5XQogICAgcF92YXIgOj0gY29uY2F0KCI9IiwgW2tleSwgcF92YWxdKQogICAgYWxsb3dfcG9kX2lwX3ZhcihrZXksIHBfdmFyKQogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgNjogdHJ1ZSIpCn0KCiMgQWxsb3cgZmllbGRSZWYgImZpZWxkUGF0aDogc3RhdHVzLmhvc3RJUCIgdmFsdWVzLgphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgaXNfaXAoaV92YWwpCgogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgIHBfdmFyIDo9IGNvbmNhdCgiPSIsIFtrZXksIHBfdmFsXSkKICAgIGFsbG93X2hvc3RfaXBfdmFyKGtleSwgcF92YXIpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSA3OiB0cnVlIikKfQoKIyBNYXRjaCBpbnB1dCB3aXRoIG9uZSBvZiB0aGUgcG9saWN5IHZhcmlhYmxlcywgYWZ0ZXIgc3Vic3RpdHV0aW5nICQoc2FuZGJveC1uYW1lKS4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChzYW5kYm94LW5hbWUpIgogICAgc19uYW1lIDo9IGlucHV0LmJhc2UuT0NJLkFubm90YXRpb25zW1NfTkFNRV9LRVldCiAgICBwX3ZhcjIgOj0gcmVwbGFjZShwX3ZhbCwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHBfdmFyMiA9PSBpX3ZhbAogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgODogdHJ1ZSIpCn0KCiMgTWF0Y2ggaW5wdXQgd2l0aCBvbmUgb2YgdGhlIHBvbGljeSB2YXJpYWJsZXMsIGFmdGVyIHN1YnN0aXR1dGluZyAkKHNhbmRib3gtbmFtZXNwYWNlKS4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChzYW5kYm94LW5hbWVzcGFjZSkiCiAgICBzX25hbWVzcGFjZSA6PSBpbnB1dC5iYXNlLk9DSS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwX3ZhcjIgOj0gcmVwbGFjZShwX3ZhbCwgIiQoc2FuZGJveC1uYW1lc3BhY2UpIiwgc19uYW1lc3BhY2UpCiAgICBwX3ZhcjIgPT0gaV92YWwKICAgIHByaW50KCJhbGxvd19lbnZfbWFwX2VudHJ5IDk6IHRydWUiKQp9CgojIEFsbG93IGlucHV0IGVudiB2YXJpYWJsZXMgdGhhdCBtYXRjaCB3aXRoIGEgcmVxdWVzdF9kZWZhdWx0cyByZWdleC4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHNvbWUgcF9yZWdleDEgaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5DcmVhdGVDb250YWluZXJSZXF1ZXN0LmFsbG93X2Vudl9yZWdleAogICAgcF9yZWdleDIgOj0gcmVwbGFjZShwX3JlZ2V4MSwgIiQoaXB2NF9hKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcHY0X2EpCiAgICBwX3JlZ2V4MyA6PSByZXBsYWNlKHBfcmVnZXgyLCAiJChpcF9wKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcF9wKQogICAgcF9yZWdleDQgOj0gcmVwbGFjZShwX3JlZ2V4MywgIiQoc3ZjX25hbWUpIiwgcG9saWN5X2RhdGEuY29tbW9uLnN2Y19uYW1lKQogICAgcF9yZWdleDUgOj0gcmVwbGFjZShwX3JlZ2V4NCwgIiQoZG5zX2xhYmVsKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5kbnNfbGFiZWwpCgogICAgcmVzdWx0IDo9IGNvbmNhdCgiPSIsIFtrZXksIGlfdmFsXSkKICAgIHJlZ2V4Lm1hdGNoKHBfcmVnZXg1LCByZXN1bHQpCgogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgMTA6IHRydWUiKQp9CgpDcmVhdGVDb250YWluZXJSZXF1ZXN0Oj0gcmVzcCB7CiAgICBub3QgaW5wdXQuZW52X21hcAogICAgaV9wcm9jZXNzID0gaW5wdXQuT0NJLlByb2Nlc3MKICAgIHNfbmFtZSA9IGlucHV0Lk9DSS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBwX3Byb2Nlc3MgPSBwX2NvbnRhaW5lci5PQ0kuUHJvY2VzcwogICAgYWxsb3dfZGVwcmVjYXRlZF9hcmdzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUpCiAgICByZXNwID0gQ3JlYXRlQ29udGFpbmVyUmVxdWVzdENvbW1vbihpbnB1dCkKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0MjogdHJ1ZSIpCn0KCkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb24ocmVxKTo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgICMgQ2hlY2sgaWYgdGhlIGlucHV0IHJlcXVlc3Qgc2hvdWxkIGJlIHJlamVjdGVkIGV2ZW4gYmVmb3JlIGNoZWNraW5nIHRoZQogICAgIyBwb2xpY3lfZGF0YS5jb250YWluZXJzIGluZm9ybWF0aW9uLgogICAgYWxsb3dfY3JlYXRlX2NvbnRhaW5lcl9pbnB1dChyZXEpCgogICAgaV9vY2kgOj0gcmVxLk9DSQogICAgaV9zdG9yYWdlcyA6PSByZXEuc3RvcmFnZXMKICAgIGlfZGV2aWNlcyA6PSByZXEuZGV2aWNlcwoKICAgICMgYXJyYXkgb2YgcG9zc2libGUgc3RhdGUgb3BlcmF0aW9ucwogICAgb3BzX2J1aWxkZXIgOj0gW10KCiAgICAjIGNoZWNrIHNhbmRib3ggbmFtZQogICAgc2FuZGJveF9uYW1lID0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FX0tFWV0KICAgIGFkZF9zYW5kYm94X25hbWVfdG9fc3RhdGUgOj0gc3RhdGVfYWxsb3dzKCJzYW5kYm94X25hbWUiLCBzYW5kYm94X25hbWUpCiAgICBvcHNfYnVpbGRlcjEgOj0gY29uY2F0X29wX2lmX25vdF9udWxsKG9wc19idWlsZGVyLCBhZGRfc2FuZGJveF9uYW1lX3RvX3N0YXRlKQoKICAgICMgQ2hlY2sgaWYgYW55IGVsZW1lbnQgZnJvbSB0aGUgcG9saWN5X2RhdGEuY29udGFpbmVycyBhcnJheSBhbGxvd3MgdGhlIGlucHV0IHJlcXVlc3QuCiAgICBzb21lIHBfY29udGFpbmVyIGluIHBvbGljeV9kYXRhLmNvbnRhaW5lcnMKICAgIHByaW50KCI9PT09PT09PSBDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiB0cnlpbmcgbmV4dCBwb2xpY3kgY29udGFpbmVyIikKCiAgICBwX3BpZG5zIDo9IHBfY29udGFpbmVyLnNhbmRib3hfcGlkbnMKICAgIGlfcGlkbnMgOj0gcmVxLnNhbmRib3hfcGlkbnMKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiBwX3BpZG5zID0iLCBwX3BpZG5zLCAiaV9waWRucyA9IiwgaV9waWRucykKICAgIHBfcGlkbnMgPT0gaV9waWRucwoKICAgIHBfb2NpIDo9IHBfY29udGFpbmVyLk9DSQoKICAgICMgY2hlY2sgbmFtZXNwYWNlCiAgICBwX25hbWVzcGFjZSA6PSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBpX25hbWVzcGFjZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwcmludCAoIkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb246IHBfbmFtZXNwYWNlID0iLCBwX25hbWVzcGFjZSwgImlfbmFtZXNwYWNlID0iLCBpX25hbWVzcGFjZSkKICAgIGFkZF9uYW1lc3BhY2VfdG9fc3RhdGUgOj0gYWxsb3dfbmFtZXNwYWNlKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkKICAgIG9wc19idWlsZGVyMiA6PSBjb25jYXRfb3BfaWZfbm90X251bGwob3BzX2J1aWxkZXIxLCBhZGRfbmFtZXNwYWNlX3RvX3N0YXRlKQoKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiBwIFZlcnNpb24gPSIsIHBfb2NpLlZlcnNpb24sICJpIFZlcnNpb24gPSIsIGlfb2NpLlZlcnNpb24pCiAgICBwX29jaS5WZXJzaW9uID09IGlfb2NpLlZlcnNpb24KCiAgICBwcmludCgiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdENvbW1vbjogcCBSZWFkb25seSA9IiwgcF9vY2kuUm9vdC5SZWFkb25seSwgImkgUmVhZG9ubHkgPSIsIGlfb2NpLlJvb3QuUmVhZG9ubHkpCiAgICBwX29jaS5Sb290LlJlYWRvbmx5ID09IGlfb2NpLlJvb3QuUmVhZG9ubHkKCiAgICBhbGxvd19hbm5vKHBfb2NpLCBpX29jaSkKCiAgICBwX3N0b3JhZ2VzIDo9IHBfY29udGFpbmVyLnN0b3JhZ2VzCiAgICBhbGxvd19ieV9hbm5vKHBfb2NpLCBpX29jaSwgcF9zdG9yYWdlcywgaV9zdG9yYWdlcykKCiAgICBwX2RldmljZXMgOj0gcF9jb250YWluZXIuZGV2aWNlcwogICAgYWxsb3dfZGV2aWNlcyhwX2RldmljZXMsIGlfZGV2aWNlcykKCiAgICByZXQgOj0gYWxsb3dfbGludXgob3BzX2J1aWxkZXIyLCBwX29jaSwgaV9vY2kpCiAgICByZXQuYWxsb3dlZAoKICAgIG9wcyA6PSByZXQub3BzCgogICAgcHJpbnQoIkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb246IHRydWUiKQp9CgphbGxvd19jcmVhdGVfY29udGFpbmVyX2lucHV0KHJlcSkgewogICAgcHJpbnQoImFsbG93X2NyZWF0ZV9jb250YWluZXJfaW5wdXQ6IGlucHV0ID0iLCByZXEpCgogICAgY291bnQocmVxLnNoYXJlZF9tb3VudHMpID09IDAKICAgIGlzX251bGwocmVxLnN0cmluZ191c2VyKQoKICAgIGlfb2NpIDo9IHJlcS5PQ0kKICAgIGlzX251bGwoaV9vY2kuSG9va3MpCiAgICBpc19udWxsKGlfb2NpLlNvbGFyaXMpCiAgICBpc19udWxsKGlfb2NpLldpbmRvd3MpCgogICAgaV9saW51eCA6PSBpX29jaS5MaW51eAogICAgY291bnQoaV9saW51eC5HSURNYXBwaW5ncykgPT0gMAogICAgY291bnQoaV9saW51eC5Nb3VudExhYmVsKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlJlc291cmNlcy5EZXZpY2VzKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlJvb3Rmc1Byb3BhZ2F0aW9uKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlVJRE1hcHBpbmdzKSA9PSAwCiAgICBpc19udWxsKGlfbGludXguSW50ZWxSZHQpCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLkJsb2NrSU8pCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLk5ldHdvcmspCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLlBpZHMpCiAgICBpc19udWxsKGlfbGludXguU2VjY29tcCkKCiAgICBpX3Byb2Nlc3MgOj0gaV9vY2kuUHJvY2VzcwogICAgY291bnQoaV9wcm9jZXNzLlNlbGludXhMYWJlbCkgPT0gMAogICAgY291bnQoaV9wcm9jZXNzLlVzZXIuVXNlcm5hbWUpID09IDAKCiAgICBwcmludCgiYWxsb3dfY3JlYXRlX2NvbnRhaW5lcl9pbnB1dDogdHJ1ZSIpCn0KCmFsbG93X25hbWVzcGFjZShwX25hbWVzcGFjZSwgaV9uYW1lc3BhY2UpID0gYWRkX25hbWVzcGFjZSB7CiAgICBwX25hbWVzcGFjZSA9PSBpX25hbWVzcGFjZQogICAgYWRkX25hbWVzcGFjZSA6PSBudWxsCiAgICBwcmludCgiYWxsb3dfbmFtZXNwYWNlIDE6IGlucHV0IG5hbWVzcGFjZSBtYXRjaGVzIHBvbGljeSBkYXRhIikKfQoKYWxsb3dfbmFtZXNwYWNlKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkgPSBhZGRfbmFtZXNwYWNlIHsKICAgIHBfbmFtZXNwYWNlID09ICIiCiAgICBwcmludCgiYWxsb3dfbmFtZXNwYWNlIDI6IG5vIG5hbWVzcGFjZSBmb3VuZCBvbiBwb2xpY3kgZGF0YSIpCiAgICBhZGRfbmFtZXNwYWNlIDo9IHN0YXRlX2FsbG93cygibmFtZXNwYWNlIiwgaV9uYW1lc3BhY2UpCn0KCiMgdmFsdWUgaGFzbid0IGJlZW4gc2VlbiBiZWZvcmUsIHNhdmUgaXQgdG8gc3RhdGUKc3RhdGVfYWxsb3dzKGtleSwgdmFsdWUpID0gYWN0aW9uIHsKICBzdGF0ZSA6PSBnZXRfc3RhdGUoKQogIHByaW50KCJzdGF0ZV9hbGxvd3MgMTogc3RhdGVba2V5XSA9Iiwgc3RhdGVba2V5XSwgInZhbHVlID0iLCB2YWx1ZSkKICBub3Qgc3RhdGVba2V5XQogIHByaW50KCJzdGF0ZV9hbGxvd3MgMTogc2F2aW5nIHRvIHN0YXRlIGtleSA9Iiwga2V5LCAidmFsdWUgPSIsIHZhbHVlKQogIHBhdGggOj0gZ2V0X3N0YXRlX3BhdGgoa2V5KSAKICBhY3Rpb24gOj0gewogICAgIm9wIjogImFkZCIsCiAgICAicGF0aCI6IHBhdGgsIAogICAgInZhbHVlIjogdmFsdWUsCiAgfQp9CgojIHZhbHVlIG1hdGNoZXMgd2hhdCdzIGluIHN0YXRlLCBhbGxvdyBpdApzdGF0ZV9hbGxvd3Moa2V5LCB2YWx1ZSkgPSBhY3Rpb24gewogIHByaW50KCJzdGF0ZV9hbGxvd3MgMjogc3RhcnQiKQogIHN0YXRlIDo9IGdldF9zdGF0ZSgpCiAgcHJpbnQoInN0YXRlX2FsbG93cyAyOiBzdGF0ZVtrZXldID0iLCBzdGF0ZVtrZXldLCAidmFsdWUgPSIsIHZhbHVlKQogIHZhbHVlID09IHN0YXRlW2tleV0KICBwcmludCgic3RhdGVfYWxsb3dzIDI6IGZvdW5kIGtleSA9Iiwga2V5LCAidmFsdWUgPSIsIHZhbHVlLCAiIGluIHN0YXRlIikKICBhY3Rpb24gOj0gbnVsbAp9CgojIGhlbHBlciBmdW5jdGlvbnMgdG8gaW50ZXJhY3Qgd2l0aCB0aGUgc3RhdGUKZ2V0X3N0YXRlKCkgPSBzdGF0ZSB7CiAgc3RhdGUgOj0gZGF0YVsicHN0YXRlIl0KfQoKZ2V0X3N0YXRlX3ZhbChrZXkpID0gdmFsdWUgewogICAgc3RhdGUgOj0gZ2V0X3N0YXRlKCkKICAgIHZhbHVlIDo9IHN0YXRlW2tleV0KfQoKZ2V0X3N0YXRlX3BhdGgoa2V5KSA9IHBhdGggewogICAgIyBwcmVwZW5kICIvcHN0YXRlLyIgdG8ga2V5CiAgICBwYXRoIDo9IGNvbmNhdCgiLyIsIFsiL3BzdGF0ZSIsIGtleV0pCn0KCiMgSGVscGVyIGZ1bmN0aW9ucyB0byBjb25kaXRpb25hbGx5IGNvbmNhdGVuYXRlIG9wIGlzIG5vdCBudWxsCmNvbmNhdF9vcF9pZl9ub3RfbnVsbChvcHMsIG9wKSA9IHJlc3VsdCB7CiAgICBvcCA9PSBudWxsCiAgICByZXN1bHQgOj0gb3BzCn0KCmNvbmNhdF9vcF9pZl9ub3RfbnVsbChvcHMsIG9wKSA9IHJlc3VsdCB7CiAgICBvcCAhPSBudWxsCiAgICByZXN1bHQgOj0gYXJyYXkuY29uY2F0KG9wcywgW29wXSkKfQoKIyBSZWplY3QgdW5leHBlY3RlZCBhbm5vdGF0aW9ucy4KYWxsb3dfYW5ubyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19hbm5vIDE6IHN0YXJ0IikKCiAgICBub3QgaV9vY2kuQW5ub3RhdGlvbnMKCiAgICBwcmludCgiYWxsb3dfYW5ubyAxOiB0cnVlIikKfQphbGxvd19hbm5vKHBfb2NpLCBpX29jaSkgewogICAgcHJpbnQoImFsbG93X2Fubm8gMjogcCBBbm5vdGF0aW9ucyA9IiwgcF9vY2kuQW5ub3RhdGlvbnMpCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiBpIEFubm90YXRpb25zID0iLCBpX29jaS5Bbm5vdGF0aW9ucykKCiAgICBpX2tleXMgOj0gb2JqZWN0LmtleXMoaV9vY2kuQW5ub3RhdGlvbnMpCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiBpIGtleXMgPSIsIGlfa2V5cykKCiAgICBldmVyeSBpX2tleSBpbiBpX2tleXMgewogICAgICAgIGFsbG93X2Fubm9fa2V5KGlfa2V5LCBwX29jaSkKICAgIH0KCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiB0cnVlIikKfQoKYWxsb3dfYW5ub19rZXkoaV9rZXksIHBfb2NpKSB7CiAgICBwcmludCgiYWxsb3dfYW5ub19rZXkgMTogaSBrZXkgPSIsIGlfa2V5KQoKICAgIHN0YXJ0c3dpdGgoaV9rZXksICJpby5rdWJlcm5ldGVzLmNyaS4iKQoKICAgIHByaW50KCJhbGxvd19hbm5vX2tleSAxOiB0cnVlIikKfQphbGxvd19hbm5vX2tleShpX2tleSwgcF9vY2kpIHsKICAgIHByaW50KCJhbGxvd19hbm5vX2tleSAyOiBpIGtleSA9IiwgaV9rZXkpCgogICAgc29tZSBwX2tleSwgXyBpbiBwX29jaS5Bbm5vdGF0aW9ucwogICAgcF9rZXkgPT0gaV9rZXkKCiAgICBwcmludCgiYWxsb3dfYW5ub19rZXkgMjogdHJ1ZSIpCn0KCiMgR2V0IHRoZSB2YWx1ZSBvZiB0aGUgU19OQU1FX0tFWSBhbm5vdGF0aW9uIGFuZAojIGNvcnJlbGF0ZSBpdCB3aXRoIG90aGVyIGFubm90YXRpb25zIGFuZCBwcm9jZXNzIGZpZWxkcy4KYWxsb3dfYnlfYW5ubyhwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpIHsKICAgIHByaW50KCJhbGxvd19ieV9hbm5vIDE6IHN0YXJ0IikKCiAgICBub3QgcF9vY2kuQW5ub3RhdGlvbnNbU19OQU1FX0tFWV0KCiAgICBpX3NfbmFtZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMTogaV9zX25hbWUgPSIsIGlfc19uYW1lKQoKICAgIGlfc19uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FU1BBQ0VfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMTogaV9zX25hbWVzcGFjZSA9IiwgaV9zX25hbWVzcGFjZSkKCiAgICBhbGxvd19ieV9zYW5kYm94X25hbWUocF9vY2ksIGlfb2NpLCBwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBpX3NfbmFtZSwgaV9zX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfYnlfYW5ubyAxOiB0cnVlIikKfQphbGxvd19ieV9hbm5vKHBfb2NpLCBpX29jaSwgcF9zdG9yYWdlcywgaV9zdG9yYWdlcykgewogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMjogc3RhcnQiKQoKICAgIHBfc19uYW1lIDo9IHBfb2NpLkFubm90YXRpb25zW1NfTkFNRV9LRVldCiAgICBpX3NfbmFtZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMjogaV9zX25hbWUgPSIsIGlfc19uYW1lLCAicF9zX25hbWUgPSIsIHBfc19uYW1lKQoKICAgIGFsbG93X3NhbmRib3hfbmFtZShwX3NfbmFtZSwgaV9zX25hbWUpCgogICAgaV9zX25hbWVzcGFjZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwcmludCgiYWxsb3dfYnlfYW5ubyAyOiBpX3NfbmFtZXNwYWNlID0iLCBpX3NfbmFtZXNwYWNlKQoKICAgIGFsbG93X2J5X3NhbmRib3hfbmFtZShwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMsIGlfc19uYW1lLCBpX3NfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd19ieV9hbm5vIDI6IHRydWUiKQp9CgphbGxvd19ieV9zYW5kYm94X25hbWUocF9vY2ksIGlfb2NpLCBwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfYnlfc2FuZGJveF9uYW1lOiBzdGFydCIpCgogICAgaV9uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FU1BBQ0VfS0VZXQoKICAgIGFsbG93X2J5X2NvbnRhaW5lcl90eXBlcyhwX29jaSwgaV9vY2ksIHNfbmFtZSwgaV9uYW1lc3BhY2UpCiAgICBhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZChwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpCiAgICBhbGxvd19wcm9jZXNzKHBfb2NpLlByb2Nlc3MsIGlfb2NpLlByb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpCgogICAgcHJpbnQoImFsbG93X2J5X3NhbmRib3hfbmFtZTogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfbmFtZShwX3NfbmFtZSwgaV9zX25hbWUpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X25hbWU6IHN0YXJ0IikKICAgIHJlZ2V4Lm1hdGNoKHBfc19uYW1lLCBpX3NfbmFtZSkKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9uYW1lOiB0cnVlIikKfQoKIyBDaGVjayB0aGF0IHRoZSAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLXR5cGUiIGFuZAojICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIiBhbm5vdGF0aW9ucyBkZXNpZ25hdGUgdGhlCiMgZXhwZWN0ZWQgdHlwZSAtIGVpdGhlciBhICJzYW5kYm94IiBvciBhICJjb250YWluZXIiLiBUaGVuLCB2YWxpZGF0ZQojIG90aGVyIGFubm90YXRpb25zIGJhc2VkIG9uIHRoZSBhY3R1YWwgInNhbmRib3giIG9yICJjb250YWluZXIiIHZhbHVlCiMgZnJvbSB0aGUgaW5wdXQgY29udGFpbmVyLgphbGxvd19ieV9jb250YWluZXJfdHlwZXMocF9vY2ksIGlfb2NpLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfYnlfY29udGFpbmVyX3R5cGVzOiBjaGVja2luZyBpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSIpCgogICAgY190eXBlIDo9ICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSIKICAgIAogICAgcF9jcmlfdHlwZSA6PSBwX29jaS5Bbm5vdGF0aW9uc1tjX3R5cGVdCiAgICBpX2NyaV90eXBlIDo9IGlfb2NpLkFubm90YXRpb25zW2NfdHlwZV0KICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZXM6IHBfY3JpX3R5cGUgPSIsIHBfY3JpX3R5cGUsICJpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgcF9jcmlfdHlwZSA9PSBpX2NyaV90eXBlCgogICAgYWxsb3dfYnlfY29udGFpbmVyX3R5cGUoaV9jcmlfdHlwZSwgcF9vY2ksIGlfb2NpLCBzX25hbWUsIHNfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZXM6IHRydWUiKQp9CgphbGxvd19ieV9jb250YWluZXJfdHlwZShpX2NyaV90eXBlLCBwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAxOiBpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgaV9jcmlfdHlwZSA9PSAic2FuZGJveCIKCiAgICBpX2thdGFfdHlwZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1siaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5jb250YWluZXJfdHlwZSJdCiAgICBwcmludCgiYWxsb3dfYnlfY29udGFpbmVyX3R5cGUgMTogaV9rYXRhX3R5cGUgPSIsIGlfa2F0YV90eXBlKQogICAgaV9rYXRhX3R5cGUgPT0gInBvZF9zYW5kYm94IgoKICAgIGFsbG93X3NhbmRib3hfY29udGFpbmVyX25hbWUocF9vY2ksIGlfb2NpKQogICAgYWxsb3dfc2FuZGJveF9uZXRfbmFtZXNwYWNlKHBfb2NpLCBpX29jaSkKICAgIGFsbG93X3NhbmRib3hfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpCgogICAgcHJpbnQoImFsbG93X2J5X2NvbnRhaW5lcl90eXBlIDE6IHRydWUiKQp9CgphbGxvd19ieV9jb250YWluZXJfdHlwZShpX2NyaV90eXBlLCBwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiBpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgaV9jcmlfdHlwZSA9PSAiY29udGFpbmVyIgoKICAgIGlfa2F0YV90eXBlIDo9IGlfb2NpLkFubm90YXRpb25zWyJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIl0KICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiBpX2thdGFfdHlwZSA9IiwgaV9rYXRhX3R5cGUpCiAgICBpX2thdGFfdHlwZSA9PSAicG9kX2NvbnRhaW5lciIKCiAgICBhbGxvd19jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpCiAgICBhbGxvd19uZXRfbmFtZXNwYWNlKHBfb2NpLCBpX29jaSkKICAgIGFsbG93X2xvZ19kaXJlY3RvcnkocF9vY2ksIGlfb2NpKQoKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiB0cnVlIikKfQoKIyAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLW5hbWUiIGFubm90YXRpb24KYWxsb3dfc2FuZGJveF9jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X2NvbnRhaW5lcl9uYW1lOiBzdGFydCIpCgogICAgY29udGFpbmVyX2Fubm90YXRpb25fbWlzc2luZyhwX29jaSwgaV9vY2ksICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItbmFtZSIpCgogICAgcHJpbnQoImFsbG93X3NhbmRib3hfY29udGFpbmVyX25hbWU6IHRydWUiKQp9CgphbGxvd19jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19jb250YWluZXJfbmFtZTogc3RhcnQiKQoKICAgIGFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uKHBfb2NpLCBpX29jaSwgImlvLmt1YmVybmV0ZXMuY3JpLmNvbnRhaW5lci1uYW1lIikKCiAgICBwcmludCgiYWxsb3dfY29udGFpbmVyX25hbWU6IHRydWUiKQp9Cgpjb250YWluZXJfYW5ub3RhdGlvbl9taXNzaW5nKHBfb2NpLCBpX29jaSwga2V5KSB7CiAgICBwcmludCgiY29udGFpbmVyX2Fubm90YXRpb25fbWlzc2luZzoiLCBrZXkpCgogICAgbm90IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIG5vdCBpX29jaS5Bbm5vdGF0aW9uc1trZXldCgogICAgcHJpbnQoImNvbnRhaW5lcl9hbm5vdGF0aW9uX21pc3Npbmc6IHRydWUiKQp9CgphbGxvd19jb250YWluZXJfYW5ub3RhdGlvbihwX29jaSwgaV9vY2ksIGtleSkgewogICAgcHJpbnQoImFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uOiBrZXkgPSIsIGtleSkKCiAgICBwX3ZhbHVlIDo9IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIGlfdmFsdWUgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgcHJpbnQoImFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uOiBwX3ZhbHVlID0iLCBwX3ZhbHVlLCAiaV92YWx1ZSA9IiwgaV92YWx1ZSkKCiAgICBwX3ZhbHVlID09IGlfdmFsdWUKCiAgICBwcmludCgiYWxsb3dfY29udGFpbmVyX2Fubm90YXRpb246IHRydWUiKQp9CgojICJuZXJkY3RsL25ldHdvcmstbmFtZXNwYWNlIiBhbm5vdGF0aW9uCmFsbG93X3NhbmRib3hfbmV0X25hbWVzcGFjZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X25ldF9uYW1lc3BhY2U6IHN0YXJ0IikKCiAgICBrZXkgOj0gIm5lcmRjdGwvbmV0d29yay1uYW1lc3BhY2UiCgogICAgcF9uYW1lc3BhY2UgOj0gcF9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgaV9uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgcHJpbnQoImFsbG93X3NhbmRib3hfbmV0X25hbWVzcGFjZTogcF9uYW1lc3BhY2UgPSIsIHBfbmFtZXNwYWNlLCAiaV9uYW1lc3BhY2UgPSIsIGlfbmFtZXNwYWNlKQoKICAgIHJlZ2V4Lm1hdGNoKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9uZXRfbmFtZXNwYWNlOiB0cnVlIikKfQoKYWxsb3dfbmV0X25hbWVzcGFjZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19uZXRfbmFtZXNwYWNlOiBzdGFydCIpCgogICAga2V5IDo9ICJuZXJkY3RsL25ldHdvcmstbmFtZXNwYWNlIgoKICAgIG5vdCBwX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICBub3QgaV9vY2kuQW5ub3RhdGlvbnNba2V5XQoKICAgIHByaW50KCJhbGxvd19uZXRfbmFtZXNwYWNlOiB0cnVlIikKfQoKIyAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1sb2ctZGlyZWN0b3J5IiBhbm5vdGF0aW9uCmFsbG93X3NhbmRib3hfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X2xvZ19kaXJlY3Rvcnk6IHN0YXJ0IikKCiAgICBrZXkgOj0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbG9nLWRpcmVjdG9yeSIKCiAgICBwX2RpciA6PSBwX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICByZWdleDEgOj0gcmVwbGFjZShwX2RpciwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHJlZ2V4MiA6PSByZXBsYWNlKHJlZ2V4MSwgIiQoc2FuZGJveC1uYW1lc3BhY2UpIiwgc19uYW1lc3BhY2UpCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiByZWdleDIgPSIsIHJlZ2V4MikKCiAgICBpX2RpciA6PSBpX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiBpX2RpciA9IiwgaV9kaXIpCgogICAgcmVnZXgubWF0Y2gocmVnZXgyLCBpX2RpcikKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiB0cnVlIikKfQoKYWxsb3dfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19sb2dfZGlyZWN0b3J5OiBzdGFydCIpCgogICAga2V5IDo9ICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWxvZy1kaXJlY3RvcnkiCgogICAgbm90IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIG5vdCBpX29jaS5Bbm5vdGF0aW9uc1trZXldCgogICAgcHJpbnQoImFsbG93X2xvZ19kaXJlY3Rvcnk6IHRydWUiKQp9CgphbGxvd19kZXZpY2VzKHBfZGV2aWNlcywgaV9kZXZpY2VzKSB7CiAgICBwcmludCgiYWxsb3dfZGV2aWNlczogc3RhcnQiKQogICAgZXZlcnkgaV9kZXZpY2UgaW4gaV9kZXZpY2VzIHsKICAgICAgICBwcmludCgiYWxsb3dfZGV2aWNlczogaV9kZXZpY2UgPSIsIGlfZGV2aWNlKQogICAgICAgIHNvbWUgcF9kZXZpY2UgaW4gcF9kZXZpY2VzCiAgICAgICAgcF9kZXZpY2UuY29udGFpbmVyX3BhdGggPT0gaV9kZXZpY2UuY29udGFpbmVyX3BhdGgKICAgIH0KICAgIHByaW50KCJhbGxvd19kZXZpY2VzOiB0cnVlIikKfQoKYWxsb3dfbGludXgoc3RhdGVfb3BzLCBwX29jaSwgaV9vY2kpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIHBfbmFtZXNwYWNlcyA6PSBwX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbGludXg6IHAgbmFtZXNwYWNlcyA9IiwgcF9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlcyA6PSBpX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbGludXg6IGkgbmFtZXNwYWNlcyA9IiwgaV9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlX3dpdGhvdXRfbmV0d29yayA6PSBbb2JqIHwgb2JqIDo9IGlfbmFtZXNwYWNlc1tfXTsgb2JqLlR5cGUgIT0gIm5ldHdvcmsiXQoKICAgIHByaW50KCJhbGxvd19saW51eDogaV9uYW1lc3BhY2Vfd2l0aG91dF9uZXR3b3JrID0iLCBpX25hbWVzcGFjZV93aXRob3V0X25ldHdvcmspCgogICAgcF9uYW1lc3BhY2VzID09IGlfbmFtZXNwYWNlX3dpdGhvdXRfbmV0d29yawoKICAgIGFsbG93X21hc2tlZF9wYXRocyhwX29jaSwgaV9vY2kpCiAgICBhbGxvd19yZWFkb25seV9wYXRocyhwX29jaSwgaV9vY2kpCiAgICBhbGxvd19saW51eF9kZXZpY2VzKHBfb2NpLkxpbnV4LkRldmljZXMsIGlfb2NpLkxpbnV4LkRldmljZXMpCiAgICBhbGxvd19saW51eF9zeXNjdGwocF9vY2kuTGludXgsIGlfb2NpLkxpbnV4KQogICAgcmV0IDo9IGFsbG93X25ldHdvcmtfbmFtZXNwYWNlX3N0YXJ0KHN0YXRlX29wcywgcF9vY2ksIGlfb2NpKQogICAgcmV0LmFsbG93ZWQKCiAgICBvcHMgOj0gcmV0Lm9wcwoKICAgIHByaW50KCJhbGxvd19saW51eDogdHJ1ZSIpCn0KCiMgUmV0cmlldmUgdGhlICJuZXR3b3JrIiBuYW1lc3BhY2UgZnJvbSB0aGUgaW5wdXQgZGF0YSBhbmQgcGFzcyBpdCBvbiBmb3IgdGhlCiMgbmV0d29yayBuYW1lc3BhY2UgcG9saWN5IGNoZWNrcy4KYWxsb3dfbmV0d29ya19uYW1lc3BhY2Vfc3RhcnQoc3RhdGVfb3BzLCBwX29jaSwgaV9vY2kpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIHByaW50KCJhbGxvd19uZXR3b3JrX25hbWVzcGFjZSBzdGFydDogc3RhcnQiKQoKICAgIHBfbmFtZXNwYWNlcyA6PSBwX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IHAgbmFtZXNwYWNlcyA9IiwgcF9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlcyA6PSBpX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IGkgbmFtZXNwYWNlcyA9IiwgaV9uYW1lc3BhY2VzKQoKICAgICMgUmV0dXJuIHBhdGggb2YgdGhlICJuZXR3b3JrIiBuYW1lc3BhY2UKICAgIG5ldHdvcmtfbnMgOj0gW29iaiB8IG9iaiA6PSBpX25hbWVzcGFjZXNbX107IG9iai5UeXBlID09ICJuZXR3b3JrIl0KCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IG5ldHdvcmtfbnMgPSIsIG5ldHdvcmtfbnMpCgogICAgcmV0IDo9IGFsbG93X25ldHdvcmtfbmFtZXNwYWNlKHN0YXRlX29wcywgbmV0d29ya19ucykKICAgIHJldC5hbGxvd2VkCgogICAgb3BzIDo9IHJldC5vcHMKfQoKIyBUaGlzIHJ1bGUgaXMgd2hlbiB0aGVyZSdzIG5vIG5ldHdvcmsgbmFtZXNwYWNlIGluIHRoZSBpbnB1dCBkYXRhLgphbGxvd19uZXR3b3JrX25hbWVzcGFjZShzdGF0ZV9vcHMsIG5ldHdvcmtfbnMpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIGNvdW50KG5ldHdvcmtfbnMpID09IDAKCiAgICBuZXR3b3JrX25zX3BhdGggPSAiIgoKICAgIGFkZF9uZXR3b3JrX25hbWVzcGFjZV90b19zdGF0ZSA6PSBzdGF0ZV9hbGxvd3MoIm5ldHdvcmtfbmFtZXNwYWNlIiwgbmV0d29ya19uc19wYXRoKQogICAgb3BzIDo9IGNvbmNhdF9vcF9pZl9ub3RfbnVsbChzdGF0ZV9vcHMsIGFkZF9uZXR3b3JrX25hbWVzcGFjZV90b19zdGF0ZSkKCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2UgMTogdHJ1ZSIpCn0KCiMgVGhpcyBydWxlIGlzIHdoZW4gdGhlcmUncyBleGFjdGx5IG9uZSBuZXR3b3JrIG5hbWVzcGFjZSBpbiB0aGUgaW5wdXQgZGF0YS4KYWxsb3dfbmV0d29ya19uYW1lc3BhY2Uoc3RhdGVfb3BzLCBuZXR3b3JrX25zKSA6PSB7Im9wcyI6IG9wcywgImFsbG93ZWQiOiB0cnVlfSB7CiAgICBjb3VudChuZXR3b3JrX25zKSA9PSAxCgogICAgYWRkX25ldHdvcmtfbmFtZXNwYWNlX3RvX3N0YXRlIDo9IHN0YXRlX2FsbG93cygibmV0d29ya19uYW1lc3BhY2UiLCBuZXR3b3JrX25zWzBdLlBhdGgpCiAgICBvcHMgOj0gY29uY2F0X29wX2lmX25vdF9udWxsKHN0YXRlX29wcywgYWRkX25ldHdvcmtfbmFtZXNwYWNlX3RvX3N0YXRlKQoKICAgIHByaW50KCJhbGxvd19uZXR3b3JrX25hbWVzcGFjZSAyOiB0cnVlIikKfQoKYWxsb3dfbWFza2VkX3BhdGhzKHBfb2NpLCBpX29jaSkgewogICAgcF9wYXRocyA6PSBwX29jaS5MaW51eC5NYXNrZWRQYXRocwogICAgcHJpbnQoImFsbG93X21hc2tlZF9wYXRocyAxOiBwX3BhdGhzID0iLCBwX3BhdGhzKQoKICAgIGlfcGF0aHMgOj0gaV9vY2kuTGludXguTWFza2VkUGF0aHMKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aHMgMTogaV9wYXRocyA9IiwgaV9wYXRocykKCiAgICBhbGxvd19tYXNrZWRfcGF0aHNfYXJyYXkocF9wYXRocywgaV9wYXRocykKCiAgICBwcmludCgiYWxsb3dfbWFza2VkX3BhdGhzIDE6IHRydWUiKQp9CmFsbG93X21hc2tlZF9wYXRocyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aHMgMjogc3RhcnQiKQoKICAgIG5vdCBwX29jaS5MaW51eC5NYXNrZWRQYXRocwogICAgbm90IGlfb2NpLkxpbnV4Lk1hc2tlZFBhdGhzCgogICAgcHJpbnQoImFsbG93X21hc2tlZF9wYXRocyAyOiB0cnVlIikKfQoKIyBBbGwgdGhlIHBvbGljeSBtYXNrZWQgcGF0aHMgbXVzdCBiZSBtYXNrZWQgaW4gdGhlIGlucHV0IGRhdGEgdG9vLgojIElucHV0IGlzIGFsbG93ZWQgdG8gaGF2ZSBtb3JlIG1hc2tlZCBwYXRocyB0aGFuIHRoZSBwb2xpY3kuCmFsbG93X21hc2tlZF9wYXRoc19hcnJheShwX2FycmF5LCBpX2FycmF5KSB7CiAgICBldmVyeSBwX2VsZW0gaW4gcF9hcnJheSB7CiAgICAgICAgYWxsb3dfbWFza2VkX3BhdGgocF9lbGVtLCBpX2FycmF5KQogICAgfQp9CgphbGxvd19tYXNrZWRfcGF0aChwX2VsZW0sIGlfYXJyYXkpIHsKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aDogcF9lbGVtID0iLCBwX2VsZW0pCgogICAgc29tZSBpX2VsZW0gaW4gaV9hcnJheQogICAgcF9lbGVtID09IGlfZWxlbQoKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aDogdHJ1ZSIpCn0KCmFsbG93X3JlYWRvbmx5X3BhdGhzKHBfb2NpLCBpX29jaSkgewogICAgcF9wYXRocyA6PSBwX29jaS5MaW51eC5SZWFkb25seVBhdGhzCiAgICBwcmludCgiYWxsb3dfcmVhZG9ubHlfcGF0aHMgMTogcF9wYXRocyA9IiwgcF9wYXRocykKCiAgICBpX3BhdGhzIDo9IGlfb2NpLkxpbnV4LlJlYWRvbmx5UGF0aHMKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAxOiBpX3BhdGhzID0iLCBpX3BhdGhzKQoKICAgIGFsbG93X3JlYWRvbmx5X3BhdGhzX2FycmF5KHBfcGF0aHMsIGlfcGF0aHMsIGlfb2NpLkxpbnV4Lk1hc2tlZFBhdGhzKQoKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAxOiB0cnVlIikKfQphbGxvd19yZWFkb25seV9wYXRocyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAyOiBzdGFydCIpCgogICAgbm90IHBfb2NpLkxpbnV4LlJlYWRvbmx5UGF0aHMKICAgIG5vdCBpX29jaS5MaW51eC5SZWFkb25seVBhdGhzCgogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGhzIDI6IHRydWUiKQp9CgojIEFsbCB0aGUgcG9saWN5IHJlYWRvbmx5IHBhdGhzIG11c3QgYmUgZWl0aGVyOgojIC0gUHJlc2VudCBpbiB0aGUgaW5wdXQgcmVhZG9ubHkgcGF0aHMsIG9yCiMgLSBQcmVzZW50IGluIHRoZSBpbnB1dCBtYXNrZWQgcGF0aHMuCiMgSW5wdXQgaXMgYWxsb3dlZCB0byBoYXZlIG1vcmUgcmVhZG9ubHkgcGF0aHMgdGhhbiB0aGUgcG9saWN5LgphbGxvd19yZWFkb25seV9wYXRoc19hcnJheShwX2FycmF5LCBpX2FycmF5LCBtYXNrZWRfcGF0aHMpIHsKICAgIGV2ZXJ5IHBfZWxlbSBpbiBwX2FycmF5IHsKICAgICAgICBhbGxvd19yZWFkb25seV9wYXRoKHBfZWxlbSwgaV9hcnJheSwgbWFza2VkX3BhdGhzKQogICAgfQp9CgphbGxvd19yZWFkb25seV9wYXRoKHBfZWxlbSwgaV9hcnJheSwgbWFza2VkX3BhdGhzKSB7CiAgICBwcmludCgiYWxsb3dfcmVhZG9ubHlfcGF0aCAxOiBwX2VsZW0gPSIsIHBfZWxlbSkKCiAgICBzb21lIGlfZWxlbSBpbiBpX2FycmF5CiAgICBwX2VsZW0gPT0gaV9lbGVtCgogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGggMTogdHJ1ZSIpCn0KYWxsb3dfcmVhZG9ubHlfcGF0aChwX2VsZW0sIGlfYXJyYXksIG1hc2tlZF9wYXRocykgewogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGggMjogcF9lbGVtID0iLCBwX2VsZW0pCgogICAgc29tZSBpX21hc2tlZCBpbiBtYXNrZWRfcGF0aHMKICAgIHBfZWxlbSA9PSBpX21hc2tlZAoKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRoIDI6IHRydWUiKQp9CgphbGxvd19saW51eF9kZXZpY2VzKHBfZGV2aWNlcywgaV9kZXZpY2VzKSB7CiAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogc3RhcnQiKQogICAgZXZlcnkgaV9kZXZpY2UgaW4gaV9kZXZpY2VzIHsKICAgICAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogaV9kZXZpY2UgPSIsIGlfZGV2aWNlKQogICAgICAgIHNvbWUgcF9kZXZpY2UgaW4gcF9kZXZpY2VzCiAgICAgICAgaV9kZXZpY2UuUGF0aCA9PSBwX2RldmljZS5QYXRoCiAgICB9CiAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogdHJ1ZSIpCn0KCmFsbG93X2xpbnV4X3N5c2N0bChwX2xpbnV4LCBpX2xpbnV4KSB7CiAgICBwcmludCgiYWxsb3dfbGludXhfc3lzY3RsIDE6IHN0YXJ0IikKICAgIG5vdCBpX2xpbnV4LlN5c2N0bAogICAgcHJpbnQoImFsbG93X2xpbnV4X3N5c2N0bCAxOiB0cnVlIikKfQoKYWxsb3dfbGludXhfc3lzY3RsKHBfbGludXgsIGlfbGludXgpIHsKICAgIHByaW50KCJhbGxvd19saW51eF9zeXNjdGwgMjogc3RhcnQiKQogICAgcF9zeXNjdGwgOj0gcF9saW51eC5TeXNjdGwKICAgIGlfc3lzY3RsIDo9IGlfbGludXguU3lzY3RsCiAgICBldmVyeSBpX25hbWUsIGlfdmFsIGluIGlfc3lzY3RsIHsKICAgICAgICBwcmludCgiYWxsb3dfbGludXhfc3lzY3RsIDI6IGlfbmFtZSA9IiwgaV9uYW1lLCAiaV92YWwgPSIsIGlfdmFsKQogICAgICAgIHBfc3lzY3RsW2lfbmFtZV0gPT0gaV92YWwKICAgIH0KICAgIHByaW50KCJhbGxvd19saW51eF9zeXNjdGwgMjogdHJ1ZSIpCn0KCiMgQ2hlY2sgdGhlIGNvbnNpc3RlbmN5IG9mIHRoZSBpbnB1dCAiaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5idW5kbGVfcGF0aCIKIyBhbmQgaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCIgdmFsdWVzIHdpdGggb3RoZXIgZmllbGRzLgphbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZChwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpIHsKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogc3RhcnQiKQoKICAgIGJ1bmRsZV9wYXRoIDo9IGlfb2NpLkFubm90YXRpb25zWyJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmJ1bmRsZV9wYXRoIl0KICAgIGJ1bmRsZV9pZCA6PSByZXBsYWNlKGJ1bmRsZV9wYXRoLCAiL3J1bi9jb250YWluZXJkL2lvLmNvbnRhaW5lcmQucnVudGltZS52Mi50YXNrL2s4cy5pby8iLCAiIikKCiAgICBidW5kbGVfaWRfZm9ybWF0IDo9IGNvbmNhdCgiIiwgWyJeIiwgQlVORExFX0lELCAiJCJdKQogICAgcmVnZXgubWF0Y2goYnVuZGxlX2lkX2Zvcm1hdCwgYnVuZGxlX2lkKQoKICAgIGtleSA6PSAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCIKCiAgICBwX3JlZ2V4IDo9IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIHNhbmRib3hfaWQgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQoKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogc2FuZGJveF9pZCA9Iiwgc2FuZGJveF9pZCwgInJlZ2V4ID0iLCBwX3JlZ2V4KQogICAgcmVnZXgubWF0Y2gocF9yZWdleCwgc2FuZGJveF9pZCkKCiAgICBhbGxvd19yb290X3BhdGgocF9vY2ksIGlfb2NpLCBidW5kbGVfaWQpCgogICAgZXZlcnkgaV9tb3VudCBpbiBpX29jaS5Nb3VudHMgewogICAgICAgIGFsbG93X21vdW50KHBfb2NpLCBpX21vdW50LCBpX3N0b3JhZ2VzLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpCiAgICB9CgogICAgYWxsb3dfc3RvcmFnZXMocF9zdG9yYWdlcywgaV9zdG9yYWdlcywgYnVuZGxlX2lkLCBzYW5kYm94X2lkKQoKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogdHJ1ZSIpCn0KCmFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHBfcHJvY2VzcyA9IiwgcF9wcm9jZXNzKQogICAgcHJpbnQoImFsbG93X3Byb2Nlc3NfY29tbW9uOiBpX3Byb2Nlc3MgPSAiLCBpX3Byb2Nlc3MpCiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHNfbmFtZSA9Iiwgc19uYW1lKQoKICAgIHBfcHJvY2Vzcy5Dd2QgPT0gaV9wcm9jZXNzLkN3ZAogICAgcF9wcm9jZXNzLk5vTmV3UHJpdmlsZWdlcyA9PSBpX3Byb2Nlc3MuTm9OZXdQcml2aWxlZ2VzCgogICAgYWxsb3dfdXNlcihwX3Byb2Nlc3MsIGlfcHJvY2VzcykKICAgIGFsbG93X2VudihwX3Byb2Nlc3MsIGlfcHJvY2Vzcywgc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHRydWUiKQp9CgojIENvbXBhcmUgdGhlIE9DSSBQcm9jZXNzIGZpZWxkIG9mIGEgcG9saWN5IGNvbnRhaW5lciB3aXRoIHRoZSBpbnB1dCBPQ0kgUHJvY2VzcyBmcm9tIGEgQ3JlYXRlQ29udGFpbmVyUmVxdWVzdAphbGxvd19wcm9jZXNzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfcHJvY2Vzczogc3RhcnQiKQoKICAgIGFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgYWxsb3dfY2FwcyhwX3Byb2Nlc3MuQ2FwYWJpbGl0aWVzLCBpX3Byb2Nlc3MuQ2FwYWJpbGl0aWVzKQogICAgcF9wcm9jZXNzLlRlcm1pbmFsID09IGlfcHJvY2Vzcy5UZXJtaW5hbAoKICAgIHByaW50KCJhbGxvd19wcm9jZXNzOiB0cnVlIikKfQoKIyBDb21wYXJlIHRoZSBPQ0kgUHJvY2VzcyBmaWVsZCBvZiBhIHBvbGljeSBjb250YWluZXIgd2l0aCB0aGUgaW5wdXQgcHJvY2VzcyBmaWVsZCBmcm9tIEV4ZWNQcm9jZXNzUmVxdWVzdAphbGxvd19pbnRlcmFjdGl2ZV9wcm9jZXNzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfaW50ZXJhY3RpdmVfcHJvY2Vzczogc3RhcnQiKQoKICAgIGFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgYWxsb3dfZXhlY19jYXBzKGlfcHJvY2Vzcy5DYXBhYmlsaXRpZXMpCgogICAgIyBUaGVzZSBhcmUgY29tbWFuZHMgZW5hYmxlZCB1c2luZyBFeGVjUHJvY2Vzc1JlcXVlc3QgY29tbWFuZHMgYW5kL29yIHJlZ2V4IGZyb20gdGhlIHNldHRpbmdzIGZpbGUuCiAgICAjIFRoZXkgY2FuIGJlIGV4ZWN1dGVkIGludGVyYWN0aXZlbHkgc28gYWxsb3cgdGhlbSB0byB1c2UgYW55IHZhbHVlIGZvciBpX3Byb2Nlc3MuVGVybWluYWwuCgogICAgcHJpbnQoImFsbG93X2ludGVyYWN0aXZlX3Byb2Nlc3M6IHRydWUiKQp9CgojIENvbXBhcmUgdGhlIE9DSSBQcm9jZXNzIGZpZWxkIG9mIGEgcG9saWN5IGNvbnRhaW5lciB3aXRoIHRoZSBpbnB1dCBwcm9jZXNzIGZpZWxkIGZyb20gRXhlY1Byb2Nlc3NSZXF1ZXN0CmFsbG93X3Byb2JlX3Byb2Nlc3MocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19wcm9iZV9wcm9jZXNzOiBzdGFydCIpCgogICAgYWxsb3dfcHJvY2Vzc19jb21tb24ocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpCiAgICBhbGxvd19leGVjX2NhcHMoaV9wcm9jZXNzLkNhcGFiaWxpdGllcykKICAgIHBfcHJvY2Vzcy5UZXJtaW5hbCA9PSBpX3Byb2Nlc3MuVGVybWluYWwKCiAgICBwcmludCgiYWxsb3dfcHJvYmVfcHJvY2VzczogdHJ1ZSIpCn0KCmFsbG93X3VzZXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MpIHsKICAgIHBfdXNlciA6PSBwX3Byb2Nlc3MuVXNlcgogICAgaV91c2VyIDo9IGlfcHJvY2Vzcy5Vc2VyCgogICAgcHJpbnQoImFsbG93X3VzZXI6IGlucHV0IHVpZCA9IiwgaV91c2VyLlVJRCwgInBvbGljeSB1aWQgPSIsIHBfdXNlci5VSUQpCiAgICBwX3VzZXIuVUlEID09IGlfdXNlci5VSUQKCiAgICAjIFRPRE86IHRyYWNrIGRvd24gdGhlIHJlYXNvbiBmb3IgcmVnaXN0cnkuazhzLmlvL3BhdXNlOjMuOSBiZWluZwogICAgIyAgICAgICBleGVjdXRlZCB3aXRoIGdpZCA9IDAgZGVzcGl0ZSBoYXZpbmcgIjY1NTM1OjY1NTM1IiBpbiBpdHMgY29udGFpbmVyIGltYWdlCiAgICAjICAgICAgIGNvbmZpZy4KICAgICNwcmludCgiYWxsb3dfdXNlcjogaW5wdXQgZ2lkID0iLCBpX3VzZXIuR0lELCAicG9saWN5IGdpZCA9IiwgcF91c2VyLkdJRCkKICAgICNwX3VzZXIuR0lEID09IGlfdXNlci5HSUQKCiAgICAjIFRPRE86IGNvbXBhcmUgdGhlIGFkZGl0aW9uYWxHaWRzIGZpZWxkIHRvbyBhZnRlciBjb21wdXRpbmcgaXRzIHZhbHVlCiAgICAjIGJhc2VkIG9uIC9ldGMvcGFzc3dkIGFuZCAvZXRjL2dyb3VwIGZyb20gdGhlIGNvbnRhaW5lciBpbWFnZS4KfQoKYWxsb3dfZGVwcmVjYXRlZF9hcmdzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZ3MgMTogbm8gYXJncyIpCgogICAgbm90IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJncwogICAgbm90IGlfcHJvY2Vzcy5BcmdzCgogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAxOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZ3MocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSkgewogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiBwb2xpY3kgYXJncyA9IiwgcF9wcm9jZXNzLkRlcHJlY2F0ZWRBcmdzKQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiBpbnB1dCBhcmdzID0iLCBpX3Byb2Nlc3MuQXJncykKCiAgICBjb3VudChwX3Byb2Nlc3MuRGVwcmVjYXRlZEFyZ3MpID09IGNvdW50KGlfcHJvY2Vzcy5BcmdzKQoKICAgIGV2ZXJ5IGksIGlfYXJnIGluIGlfcHJvY2Vzcy5BcmdzIHsKICAgICAgICBhbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpCiAgICB9CgogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDE6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgcF9hcmcyIDo9IHJlcGxhY2UocF9hcmcsICIkJCIsICIkIikKICAgIHBfYXJnMiA9PSBpX2FyZwoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAxOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDI6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgIyBUT0RPOiBjYW4gJChub2RlLW5hbWUpIGJlIGhhbmRsZWQgYmV0dGVyPwogICAgY29udGFpbnMocF9hcmcsICIkKG5vZGUtbmFtZSkiKQoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAyOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDM6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgcF9hcmcyIDo9IHJlcGxhY2UocF9hcmcsICIkJCIsICIkIikKICAgIHBfYXJnMyA6PSByZXBsYWNlKHBfYXJnMiwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAzOiBwX2FyZzMgPSIsIHBfYXJnMykKICAgIHBfYXJnMyA9PSBpX2FyZwoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAzOiB0cnVlIikKfQoKIyBPQ0kgcHJvY2Vzcy5FbnYgZmllbGQKYWxsb3dfZW52KHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfZW52OiBwIGVudiA9IiwgcF9wcm9jZXNzLkVudikKICAgIHByaW50KCJhbGxvd19lbnY6IGkgZW52ID0iLCBpX3Byb2Nlc3MuRW52KQoKICAgIGV2ZXJ5IGlfdmFyIGluIGlfcHJvY2Vzcy5FbnYgewogICAgICAgIHByaW50KCJhbGxvd19lbnY6IGlfdmFyID0iLCBpX3ZhcikKICAgICAgICBhbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgfQoKICAgIHByaW50KCJhbGxvd19lbnY6IHRydWUiKQp9CgojIEFsbG93IGlucHV0IGVudiB2YXJpYWJsZXMgdGhhdCBhcmUgcHJlc2VudCBpbiB0aGUgcG9saWN5IGRhdGEgdG9vLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHBfdmFyID09IGlfdmFyCiAgICBwcmludCgiYWxsb3dfdmFyIDE6IHRydWUiKQp9CgojIE1hdGNoIGlucHV0IHdpdGggb25lIG9mIHRoZSBwb2xpY3kgdmFyaWFibGVzLCBhZnRlciBzdWJzdGl0dXRpbmcgJChzYW5kYm94LW5hbWUpLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHByaW50KCJhbGxvd192YXIgMjogcF92YXIgPSIsIHBfdmFyKQoKICAgIHBfdmFyX3NwbGl0IDo9IHNwbGl0KHBfdmFyLCAiPSIpCiAgICBjb3VudChwX3Zhcl9zcGxpdCkgPT0gMgoKICAgIHBfdmFyX3NwbGl0WzFdID09ICIkKHNhbmRib3gtbmFtZSkiCgogICAgaV92YXJfc3BsaXQgOj0gc3BsaXQoaV92YXIsICI9IikKICAgIGNvdW50KGlfdmFyX3NwbGl0KSA9PSAyCgogICAgaV92YXJfc3BsaXRbMF0gPT0gcF92YXJfc3BsaXRbMF0KICAgIHJlZ2V4Lm1hdGNoKHNfbmFtZSwgaV92YXJfc3BsaXRbMV0pCgogICAgcHJpbnQoImFsbG93X3ZhciAyOiB0cnVlIikKfQoKIyBBbGxvdyBpbnB1dCBlbnYgdmFyaWFibGVzIHRoYXQgbWF0Y2ggd2l0aCBhIHJlcXVlc3RfZGVmYXVsdHMgcmVnZXguCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHNvbWUgcF9yZWdleDEgaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5DcmVhdGVDb250YWluZXJSZXF1ZXN0LmFsbG93X2Vudl9yZWdleAogICAgcF9yZWdleDIgOj0gcmVwbGFjZShwX3JlZ2V4MSwgIiQoaXB2NF9hKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcHY0X2EpCiAgICBwX3JlZ2V4MyA6PSByZXBsYWNlKHBfcmVnZXgyLCAiJChpcF9wKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcF9wKQogICAgcF9yZWdleDQgOj0gcmVwbGFjZShwX3JlZ2V4MywgIiQoc3ZjX25hbWUpIiwgcG9saWN5X2RhdGEuY29tbW9uLnN2Y19uYW1lKQogICAgcF9yZWdleDUgOj0gcmVwbGFjZShwX3JlZ2V4NCwgIiQoZG5zX2xhYmVsKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5kbnNfbGFiZWwpCgogICAgcHJpbnQoImFsbG93X3ZhciAzOiBwX3JlZ2V4NSA9IiwgcF9yZWdleDUpCiAgICByZWdleC5tYXRjaChwX3JlZ2V4NSwgaV92YXIpCgogICAgcHJpbnQoImFsbG93X3ZhciAzOiB0cnVlIikKfQoKIyBBbGxvdyBmaWVsZFJlZiAiZmllbGRQYXRoOiBzdGF0dXMucG9kSVAiIHZhbHVlcy4KYWxsb3dfdmFyKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBpX3Zhciwgc19uYW1lLCBzX25hbWVzcGFjZSkgewogICAgbmFtZV92YWx1ZSA6PSBzcGxpdChpX3ZhciwgIj0iKQogICAgY291bnQobmFtZV92YWx1ZSkgPT0gMgogICAgaXNfaXAobmFtZV92YWx1ZVsxXSkKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIGFsbG93X3BvZF9pcF92YXIobmFtZV92YWx1ZVswXSwgcF92YXIpCgogICAgcHJpbnQoImFsbG93X3ZhciA0OiB0cnVlIikKfQoKIyBBbGxvdyBjb21tb24gZmllbGRSZWYgdmFyaWFibGVzLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBuYW1lX3ZhbHVlIDo9IHNwbGl0KGlfdmFyLCAiPSIpCiAgICBjb3VudChuYW1lX3ZhbHVlKSA9PSAyCgogICAgc29tZSBwX3ZhciBpbiBwX3Byb2Nlc3MuRW52CiAgICBwX25hbWVfdmFsdWUgOj0gc3BsaXQocF92YXIsICI9IikKICAgIGNvdW50KHBfbmFtZV92YWx1ZSkgPT0gMgoKICAgIHBfbmFtZV92YWx1ZVswXSA9PSBuYW1lX3ZhbHVlWzBdCgogICAgIyBUT0RPOiBzaG91bGQgdGhlc2UgYmUgaGFuZGxlZCBpbiBhIGRpZmZlcmVudCB3YXk/CiAgICBhbHdheXNfYWxsb3dlZCA6PSBbIiQoaG9zdC1uYW1lKSIsICIkKG5vZGUtbmFtZSkiLCAiJChwb2QtdWlkKSJdCiAgICBzb21lIGFsbG93ZWQgaW4gYWx3YXlzX2FsbG93ZWQKICAgIGNvbnRhaW5zKHBfbmFtZV92YWx1ZVsxXSwgYWxsb3dlZCkKCiAgICBwcmludCgiYWxsb3dfdmFyIDU6IHRydWUiKQp9CgojIEFsbG93IGZpZWxkUmVmICJmaWVsZFBhdGg6IHN0YXR1cy5ob3N0SVAiIHZhbHVlcy4KYWxsb3dfdmFyKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBpX3Zhciwgc19uYW1lLCBzX25hbWVzcGFjZSkgewogICAgbmFtZV92YWx1ZSA6PSBzcGxpdChpX3ZhciwgIj0iKQogICAgY291bnQobmFtZV92YWx1ZSkgPT0gMgogICAgaXNfaXAobmFtZV92YWx1ZVsxXSkKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIGFsbG93X2hvc3RfaXBfdmFyKG5hbWVfdmFsdWVbMF0sIHBfdmFyKQoKICAgIHByaW50KCJhbGxvd192YXIgNjogdHJ1ZSIpCn0KCiMgQWxsb3cgcmVzb3VyY2VGaWVsZFJlZiB2YWx1ZXMgKGUuZy4sICJsaW1pdHMuY3B1IikuCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIG5hbWVfdmFsdWUgOj0gc3BsaXQoaV92YXIsICI9IikKICAgIGNvdW50KG5hbWVfdmFsdWUpID09IDIKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHBfbmFtZV92YWx1ZSA6PSBzcGxpdChwX3ZhciwgIj0iKQogICAgY291bnQocF9uYW1lX3ZhbHVlKSA9PSAyCgogICAgcF9uYW1lX3ZhbHVlWzBdID09IG5hbWVfdmFsdWVbMF0KCiAgICAjIGEgdmFyaWFibGUgd2Ugc2hvdWxkIGJlIHZhbGlkYXRpbmcgdXNpbmcgYSByZWdleCBmcm9tIHNldHRpbmdzCiAgICBwX25hbWVfdmFsdWVbMV0gPT0gIiQodmFsaWRhdGUtZnJvbS1zZXR0aW5ncykiCgogICAgcmVnZXhfdmFsIDo9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuQ3JlYXRlQ29udGFpbmVyUmVxdWVzdC5hbGxvd19lbnZfcmVnZXhfbWFwW25hbWVfdmFsdWVbMF1dCgogICAgcHJpbnQoImFsbG93X3ZhciA3OiB2YWwgPSIsIG5hbWVfdmFsdWVbMV0pCiAgICBwcmludCgiYWxsb3dfdmFyIDc6IHJlZ2V4X3ZhbCA9IiwgcmVnZXhfdmFsKQoKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4X3ZhbCwgbmFtZV92YWx1ZVsxXSkKCiAgICBwcmludCgiYWxsb3dfdmFyIDc6IHRydWUiKQp9CgojIE1hdGNoIGlucHV0IHdpdGggb25lIG9mIHRoZSBwb2xpY3kgdmFyaWFibGVzLCBhZnRlciBzdWJzdGl0dXRpbmcgJChzYW5kYm94LW5hbWVzcGFjZSkuCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHNvbWUgcF92YXIgaW4gcF9wcm9jZXNzLkVudgogICAgcF92YXIyIDo9IHJlcGxhY2UocF92YXIsICIkKHNhbmRib3gtbmFtZXNwYWNlKSIsIHNfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd192YXIgODogcF92YXIyID0iLCBwX3ZhcjIpCiAgICBwX3ZhcjIgPT0gaV92YXIKCiAgICBwcmludCgiYWxsb3dfdmFyIDg6IHRydWUiKQp9CgphbGxvd19wb2RfaXBfdmFyKHZhcl9uYW1lLCBwX3ZhcikgewogICAgcHJpbnQoImFsbG93X3BvZF9pcF92YXI6IHZhcl9uYW1lID0iLCB2YXJfbmFtZSwgInBfdmFyID0iLCBwX3ZhcikKCiAgICBwX25hbWVfdmFsdWUgOj0gc3BsaXQocF92YXIsICI9IikKICAgIGNvdW50KHBfbmFtZV92YWx1ZSkgPT0gMgoKICAgIHBfbmFtZV92YWx1ZVswXSA9PSB2YXJfbmFtZQogICAgcF9uYW1lX3ZhbHVlWzFdID09ICIkKHBvZC1pcCkiCgogICAgcHJpbnQoImFsbG93X3BvZF9pcF92YXI6IHRydWUiKQp9CgphbGxvd19ob3N0X2lwX3Zhcih2YXJfbmFtZSwgcF92YXIpIHsKICAgIHByaW50KCJhbGxvd19ob3N0X2lwX3ZhcjogdmFyX25hbWUgPSIsIHZhcl9uYW1lLCAicF92YXIgPSIsIHBfdmFyKQoKICAgIHBfbmFtZV92YWx1ZSA6PSBzcGxpdChwX3ZhciwgIj0iKQogICAgY291bnQocF9uYW1lX3ZhbHVlKSA9PSAyCgogICAgcF9uYW1lX3ZhbHVlWzBdID09IHZhcl9uYW1lCiAgICBwX25hbWVfdmFsdWVbMV0gPT0gIiQoaG9zdC1pcCkiCgogICAgcHJpbnQoImFsbG93X2hvc3RfaXBfdmFyOiB0cnVlIikKfQoKaXNfaXAodmFsdWUpIHsKICAgIGJ5dGVzID0gc3BsaXQodmFsdWUsICIuIikKICAgIGNvdW50KGJ5dGVzKSA9PSA0CgogICAgaXNfaXBfZmlyc3RfYnl0ZShieXRlc1swXSkKICAgIGlzX2lwX290aGVyX2J5dGUoYnl0ZXNbMV0pCiAgICBpc19pcF9vdGhlcl9ieXRlKGJ5dGVzWzJdKQogICAgaXNfaXBfb3RoZXJfYnl0ZShieXRlc1szXSkKfQppc19pcF9maXJzdF9ieXRlKGNvbXBvbmVudCkgewogICAgbnVtYmVyID0gdG9fbnVtYmVyKGNvbXBvbmVudCkKICAgIG51bWJlciA+PSAxCiAgICBudW1iZXIgPD0gMjU1Cn0KaXNfaXBfb3RoZXJfYnl0ZShjb21wb25lbnQpIHsKICAgIG51bWJlciA9IHRvX251bWJlcihjb21wb25lbnQpCiAgICBudW1iZXIgPj0gMAogICAgbnVtYmVyIDw9IDI1NQp9CgojIE9DSSByb290LlBhdGgKYWxsb3dfcm9vdF9wYXRoKHBfb2NpLCBpX29jaSwgYnVuZGxlX2lkKSB7CiAgICBpX3BhdGggOj0gaV9vY2kuUm9vdC5QYXRoCiAgICBwX3BhdGgxIDo9IHBfb2NpLlJvb3QuUGF0aAogICAgcHJpbnQoImFsbG93X3Jvb3RfcGF0aDogaV9wYXRoID0iLCBpX3BhdGgsICJwX3BhdGgxID0iLCBwX3BhdGgxKQoKICAgIHBfcGF0aDIgOj0gcmVwbGFjZShwX3BhdGgxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfcm9vdF9wYXRoOiBwX3BhdGgyID0iLCBwX3BhdGgyKQoKICAgIHBfcGF0aDMgOj0gcmVwbGFjZShwX3BhdGgyLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X3Jvb3RfcGF0aDogcF9wYXRoMyA9IiwgcF9wYXRoMykKCiAgICBwX3BhdGgzID09IGlfcGF0aAoKICAgIHByaW50KCJhbGxvd19yb290X3BhdGg6IHRydWUiKQp9CgojIGRldmljZSBtb3VudHMKYWxsb3dfbW91bnQocF9vY2ksIGlfbW91bnQsIGlfc3RvcmFnZXMsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcHJpbnQoImFsbG93X21vdW50OiBpX21vdW50ID0iLCBpX21vdW50KQoKICAgIHNvbWUgcF9tb3VudCBpbiBwX29jaS5Nb3VudHMKICAgIHNvbWUgaV9zdG9yYWdlIGluIGlfc3RvcmFnZXMKCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IHBfbW91bnQgPSIsIHBfbW91bnQpCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IGlfc3RvcmFnZSA9IiwgaV9zdG9yYWdlKQoKICAgIGNoZWNrX21vdW50KHBfbW91bnQsIGlfbW91bnQsIGlfc3RvcmFnZSwgYnVuZGxlX2lkLCBzYW5kYm94X2lkKQoKICAgICMgVE9ETzogYXJlIHRoZXJlIGFueSBvdGhlciByZXF1aXJlZCBwb2xpY3kgY2hlY2tzIGZvciBtb3VudHMgLSBlLmcuLAogICAgIyAgICAgICBtdWx0aXBsZSBtb3VudHMgd2l0aCBzYW1lIHNvdXJjZSBvciBkZXN0aW5hdGlvbj8KCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IHRydWUiKQp9CgpjaGVja19tb3VudChwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcF9tb3VudCA9PSBpX21vdW50CiAgICBwcmludCgiY2hlY2tfbW91bnQgMTogdHJ1ZSIpCn0KY2hlY2tfbW91bnQocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHBfbW91bnQuZGVzdGluYXRpb24gPT0gaV9tb3VudC5kZXN0aW5hdGlvbgogICAgcF9tb3VudC50eXBlXyA9PSBpX21vdW50LnR5cGVfCiAgICBwX21vdW50Lm9wdGlvbnMgPT0gaV9tb3VudC5vcHRpb25zCgogICAgbW91bnRfc291cmNlX2FsbG93cyhwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkKCiAgICBwcmludCgiY2hlY2tfbW91bnQgMjogdHJ1ZSIpCn0KCm1vdW50X3NvdXJjZV9hbGxvd3MocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHJlZ2V4MSA6PSBwX21vdW50LnNvdXJjZQogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5tb3VudF9zb3VyY2VfY3BhdGgpCiAgICByZWdleDQgOj0gcmVwbGFjZShyZWdleDMsICIkKGJ1bmRsZS1pZCkiLCBidW5kbGVfaWQpCgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMTogcmVnZXg0ID0iLCByZWdleDQpCiAgICByZWdleC5tYXRjaChyZWdleDQsIGlfbW91bnQuc291cmNlKQoKICAgIHByaW50KCJtb3VudF9zb3VyY2VfYWxsb3dzIDE6IHRydWUiKQp9Cm1vdW50X3NvdXJjZV9hbGxvd3MocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHJlZ2V4MSA6PSBwX21vdW50LnNvdXJjZQogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5tb3VudF9zb3VyY2VfY3BhdGgpCiAgICByZWdleDQgOj0gcmVwbGFjZShyZWdleDMsICIkKHNhbmRib3gtaWQpIiwgc2FuZGJveF9pZCkKCiAgICBwcmludCgibW91bnRfc291cmNlX2FsbG93cyAyOiByZWdleDQgPSIsIHJlZ2V4NCkKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4NCwgaV9tb3VudC5zb3VyY2UpCgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMjogdHJ1ZSIpCn0KbW91bnRfc291cmNlX2FsbG93cyhwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogaV9tb3VudC5zb3VyY2UgPSIsIGlfbW91bnQuc291cmNlKQogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogaV9zdG9yYWdlLm1vdW50X3BvaW50ID0iLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCgogICAgaV9tb3VudC5zb3VyY2UgPT0gaV9zdG9yYWdlLm1vdW50X3BvaW50CgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogdHJ1ZSIpCn0KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBDcmVhdGUgY29udGFpbmVyIFN0b3JhZ2VzCgphbGxvd19zdG9yYWdlcyhwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHBfY291bnQgOj0gY291bnQocF9zdG9yYWdlcykKICAgIGlfY291bnQgOj0gY291bnQoaV9zdG9yYWdlcykKICAgIHByaW50KCJhbGxvd19zdG9yYWdlczogcF9jb3VudCA9IiwgcF9jb3VudCwgImlfY291bnQgPSIsIGlfY291bnQpCgogICAgcF9jb3VudCA9PSBpX2NvdW50CgogICAgIyBHZXQgdGhlIGNvbnRhaW5lciBpbWFnZSBsYXllciBJRHMgYW5kIHZlcml0eSByb290IGhhc2hlcywgZnJvbSB0aGUgIm92ZXJsYXlmcyIgc3RvcmFnZS4KICAgIHNvbWUgb3ZlcmxheV9zdG9yYWdlIGluIHBfc3RvcmFnZXMKICAgIG92ZXJsYXlfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIHByaW50KCJhbGxvd19zdG9yYWdlczogb3ZlcmxheV9zdG9yYWdlID0iLCBvdmVybGF5X3N0b3JhZ2UpCiAgICBjb3VudChvdmVybGF5X3N0b3JhZ2Uub3B0aW9ucykgPT0gMgoKICAgIGxheWVyX2lkcyA6PSBzcGxpdChvdmVybGF5X3N0b3JhZ2Uub3B0aW9uc1swXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiBsYXllcl9pZHMgPSIsIGxheWVyX2lkcykKCiAgICByb290X2hhc2hlcyA6PSBzcGxpdChvdmVybGF5X3N0b3JhZ2Uub3B0aW9uc1sxXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiByb290X2hhc2hlcyA9Iiwgcm9vdF9oYXNoZXMpCgogICAgZXZlcnkgaV9zdG9yYWdlIGluIGlfc3RvcmFnZXMgewogICAgICAgIGFsbG93X3N0b3JhZ2UocF9zdG9yYWdlcywgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpCiAgICB9CgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiB0cnVlIikKfQoKYWxsb3dfc3RvcmFnZShwX3N0b3JhZ2VzLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgc29tZSBwX3N0b3JhZ2UgaW4gcF9zdG9yYWdlcwoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiBwX3N0b3JhZ2UgPSIsIHBfc3RvcmFnZSkKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiBpX3N0b3JhZ2UgPSIsIGlfc3RvcmFnZSkKCiAgICBwX3N0b3JhZ2UuZHJpdmVyICAgICAgICAgICA9PSBpX3N0b3JhZ2UuZHJpdmVyCiAgICBwX3N0b3JhZ2UuZHJpdmVyX29wdGlvbnMgICA9PSBpX3N0b3JhZ2UuZHJpdmVyX29wdGlvbnMKICAgIHBfc3RvcmFnZS5mc19ncm91cCAgICAgICAgID09IGlfc3RvcmFnZS5mc19ncm91cAogICAgcF9zdG9yYWdlLmZzdHlwZSAgICAgICAgICAgPT0gaV9zdG9yYWdlLmZzdHlwZQoKICAgIGFsbG93X3N0b3JhZ2Vfc291cmNlKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKQogICAgYWxsb3dfc3RvcmFnZV9vcHRpb25zKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKQogICAgYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKQoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiB0cnVlIikKfQoKYWxsb3dfc3RvcmFnZV9zb3VyY2UocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX3NvdXJjZSAxOiBzdGFydCIpCgogICAgcF9zdG9yYWdlLnNvdXJjZSA9PSBpX3N0b3JhZ2Uuc291cmNlCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDE6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX3NvdXJjZShwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDI6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCgogICAgIyBEREREOkJCOkRELkY6IERvbWFpbjpCdXM6RGV2aWNlLkZ1bmN0aW9uCiAgICAjIGh0dHBzOi8vd3d3Lmtlcm5lbC5vcmcvZG9jL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtYnVzLXBjaQogICAgcmVnZXgubWF0Y2goYF5bYS1mMC05XXs0fTpbYS1mMC05XXsyfTpbYS1mMC05XXsyfVwuW2EtZjAtOV0kYCwgaV9zdG9yYWdlLnNvdXJjZSkKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9zb3VyY2UgMjogdHJ1ZSIpCn0KCmFsbG93X3N0b3JhZ2Vfc291cmNlKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKSB7CiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9zb3VyY2UgMzogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIGlfc3RvcmFnZS5zb3VyY2UgPT0gIm5vbmUiCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDM6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX3NvdXJjZShwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDQ6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJzbWIiCgogICAgIyBQYXR0ZXJuOiAvLzxzdG9yYWdlLWFjY291bnQtbmFtZT4uZmlsZS5jb3JlLndpbmRvd3MubmV0LzxrOHMtUFZDLW5hbWU+CiAgICAjIFN0b3JhZ2UgYWNjb3VudCBuYW1lOiBodHRwczovL2xlYXJuLm1pY3Jvc29mdC5jb20vZW4tdXMvYXp1cmUvc3RvcmFnZS9jb21tb24vc3RvcmFnZS1hY2NvdW50LW92ZXJ2aWV3I3N0b3JhZ2UtYWNjb3VudC1uYW1lCiAgICAjIEs4cyBQVkMgbmFtZTogaHR0cHM6Ly9rdWJlcm5ldGVzLmlvL2RvY3MvY29uY2VwdHMvb3ZlcnZpZXcvd29ya2luZy13aXRoLW9iamVjdHMvbmFtZXMvI2Rucy1zdWJkb21haW4tbmFtZXMKICAgIHJlZ2V4Lm1hdGNoKGBeXC9cLyhbYS16MC05XXszLDI0fSlcLmZpbGVcLmNvcmVcLndpbmRvd3NcLm5ldFwvW2EtejAtOV0oW2EtejAtOS4tXXswLDI1MX1bYS16MC05XSk/JGAsIGlfc3RvcmFnZS5zb3VyY2UpCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDQ6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMTogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgIT0gIm92ZXJsYXlmcyIKICAgIHBfc3RvcmFnZS5vcHRpb25zID09IGlfc3RvcmFnZS5vcHRpb25zCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAxOiB0cnVlIikKfQphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIGNvdW50KHBfc3RvcmFnZS5vcHRpb25zKSA9PSAyCgogICAgcG9saWN5X2lkcyA6PSBzcGxpdChwX3N0b3JhZ2Uub3B0aW9uc1swXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBwb2xpY3lfaWRzID0iLCBwb2xpY3lfaWRzKQogICAgcG9saWN5X2lkcyA9PSBsYXllcl9pZHMKCiAgICBwb2xpY3lfaGFzaGVzIDo9IHNwbGl0KHBfc3RvcmFnZS5vcHRpb25zWzFdLCAiOiIpCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IHBvbGljeV9oYXNoZXMgPSIsIHBvbGljeV9oYXNoZXMpCgogICAgcF9jb3VudCA6PSBjb3VudChwb2xpY3lfaWRzKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBwX2NvdW50ID0iLCBwX2NvdW50KQogICAgcF9jb3VudCA+PSAxCiAgICBwX2NvdW50ID09IGNvdW50KHBvbGljeV9oYXNoZXMpCgogICAgaV9jb3VudCA6PSBjb3VudChpX3N0b3JhZ2Uub3B0aW9ucykKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogaV9jb3VudCA9IiwgaV9jb3VudCkKICAgIGlfY291bnQgPT0gcF9jb3VudCArIDMKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zWzBdID0iLCBpX3N0b3JhZ2Uub3B0aW9uc1swXSkKICAgIGlfc3RvcmFnZS5vcHRpb25zWzBdID09ICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQubGF5ZXItc3JjLXByZWZpeD0vdmFyL2xpYi9jb250YWluZXJkL2lvLmNvbnRhaW5lcmQuc25hcHNob3R0ZXIudjEudGFyZGV2L2xheWVycyIKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zW2lfY291bnQgLSAyXSA9IiwgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDJdKQogICAgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDJdID09ICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQub3ZlcmxheS1ydyIKCiAgICBsb3dlcmRpciA6PSBjb25jYXQoIj0iLCBbImxvd2VyZGlyIiwgcF9zdG9yYWdlLm9wdGlvbnNbMF1dKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBsb3dlcmRpciA9IiwgbG93ZXJkaXIpCgogICAgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDFdID09IGxvd2VyZGlyCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zW2lfY291bnQgLSAxXSA9IiwgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDFdKQoKICAgIGV2ZXJ5IGksIHBvbGljeV9pZCBpbiBwb2xpY3lfaWRzIHsKICAgICAgICBhbGxvd19vdmVybGF5X2xheWVyKHBvbGljeV9pZCwgcG9saWN5X2hhc2hlc1tpXSwgaV9zdG9yYWdlLm9wdGlvbnNbaSArIDFdKQogICAgfQoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogdHJ1ZSIpCn0KYWxsb3dfc3RvcmFnZV9vcHRpb25zKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKSB7CiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDM6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCiAgICBjb3VudChwX3N0b3JhZ2Uub3B0aW9ucykgPT0gMQoKICAgIHN0YXJ0c3dpdGgocF9zdG9yYWdlLm9wdGlvbnNbMF0sICIkKGhhc2giKQogICAgaGFzaF9zdWZmaXggOj0gdHJpbV9sZWZ0KHBfc3RvcmFnZS5vcHRpb25zWzBdLCAiJChoYXNoIikKCiAgICBlbmRzd2l0aChoYXNoX3N1ZmZpeCwgIikiKQogICAgaGFzaF9pbmRleCA6PSB0cmltX3JpZ2h0KGhhc2hfc3VmZml4LCAiKSIpCiAgICBpIDo9IHRvX251bWJlcihoYXNoX2luZGV4KQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAzOiBpID0iLCBpKQoKICAgIGhhc2hfb3B0aW9uIDo9IGNvbmNhdCgiPSIsIFsiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LnJvb3QtaGFzaCIsIHJvb3RfaGFzaGVzW2ldXSkKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMzogaGFzaF9vcHRpb24gPSIsIGhhc2hfb3B0aW9uKQoKICAgIGNvdW50KGlfc3RvcmFnZS5vcHRpb25zKSA9PSA0CiAgICBpX3N0b3JhZ2Uub3B0aW9uc1swXSA9PSAicm8iCiAgICBpX3N0b3JhZ2Uub3B0aW9uc1sxXSA9PSAiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmJsb2NrX2RldmljZT1maWxlIgogICAgaV9zdG9yYWdlLm9wdGlvbnNbMl0gPT0gImlvLmthdGFjb250YWluZXJzLmZzLW9wdC5pcy1sYXllciIKICAgIGlfc3RvcmFnZS5vcHRpb25zWzNdID09IGhhc2hfb3B0aW9uCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAzOiB0cnVlIikKfQphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgNDogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gInNtYiIKICAgIHBfb3B0c19jb3VudCA6PSBjb3VudChwX3N0b3JhZ2Uub3B0aW9ucykKICAgIGlfb3B0c19jb3VudCA6PSBjb3VudChpX3N0b3JhZ2Uub3B0aW9ucykKICAgIGlfb3B0c19jb3VudCA9PSBwX29wdHNfY291bnQgKyAyCgogICAgaV9vcHRfbWF0Y2hlcyA6PSBbaSB8IGkgOj0gaWR4OyBpZHggPCBwX29wdHNfY291bnQ7IHBfc3RvcmFnZS5vcHRpb25zW2lkeF0gPT0gaV9zdG9yYWdlLm9wdGlvbnNbaWR4XV0KICAgIGNvdW50KGlfb3B0X21hdGNoZXMpID09IHBfb3B0c19jb3VudAoKICAgIHN0YXJ0c3dpdGgoaV9zdG9yYWdlLm9wdGlvbnNbaV9vcHRzX2NvdW50LTJdLCAiYWRkcj0iKQogICAgY3JlZHMgPSBzcGxpdChpX3N0b3JhZ2Uub3B0aW9uc1tpX29wdHNfY291bnQtMV0sICIsIikKICAgIGNvdW50KGNyZWRzKSA9PSAyCiAgICBzdGFydHN3aXRoKGNyZWRzWzBdLCAidXNlcm5hbWU9IikKICAgIHN0YXJ0c3dpdGgoY3JlZHNbMV0sICJwYXNzd29yZD0iKQogICAgCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDQ6IHRydWUiKQp9CgphbGxvd19vdmVybGF5X2xheWVyKHBvbGljeV9pZCwgcG9saWN5X2hhc2gsIGlfb3B0aW9uKSB7CiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogcG9saWN5X2lkID0iLCBwb2xpY3lfaWQsICJwb2xpY3lfaGFzaCA9IiwgcG9saWN5X2hhc2gpCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogaV9vcHRpb24gPSIsIGlfb3B0aW9uKQoKICAgIHN0YXJ0c3dpdGgoaV9vcHRpb24sICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQubGF5ZXI9IikKICAgIGlfdmFsdWUgOj0gcmVwbGFjZShpX29wdGlvbiwgImlvLmthdGFjb250YWluZXJzLmZzLW9wdC5sYXllcj0iLCAiIikKICAgIGlfdmFsdWVfZGVjb2RlZCA6PSBiYXNlNjQuZGVjb2RlKGlfdmFsdWUpCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogaV92YWx1ZV9kZWNvZGVkID0iLCBpX3ZhbHVlX2RlY29kZWQpCgogICAgcG9saWN5X3N1ZmZpeCA6PSBjb25jYXQoIj0iLCBbInRhcixybyxpby5rYXRhY29udGFpbmVycy5mcy1vcHQuYmxvY2tfZGV2aWNlPWZpbGUsaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmlzLWxheWVyLGlvLmthdGFjb250YWluZXJzLmZzLW9wdC5yb290LWhhc2giLCBwb2xpY3lfaGFzaF0pCiAgICBwX3ZhbHVlIDo9IGNvbmNhdCgiLCIsIFtwb2xpY3lfaWQsIHBvbGljeV9zdWZmaXhdKQogICAgcHJpbnQoImFsbG93X292ZXJsYXlfbGF5ZXI6IHBfdmFsdWUgPSIsIHBfdmFsdWUpCgogICAgcF92YWx1ZSA9PSBpX3ZhbHVlX2RlY29kZWQKCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogdHJ1ZSIpCn0KCmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAidGFyIgoKICAgIHN0YXJ0c3dpdGgocF9zdG9yYWdlLm1vdW50X3BvaW50LCAiJChsYXllciIpCiAgICBtb3VudF9zdWZmaXggOj0gdHJpbV9sZWZ0KHBfc3RvcmFnZS5tb3VudF9wb2ludCwgIiQobGF5ZXIiKQoKICAgIGVuZHN3aXRoKG1vdW50X3N1ZmZpeCwgIikiKQogICAgbGF5ZXJfaW5kZXggOj0gdHJpbV9yaWdodChtb3VudF9zdWZmaXgsICIpIikKICAgIGkgOj0gdG9fbnVtYmVyKGxheWVyX2luZGV4KQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDE6IGkgPSIsIGkpCgogICAgbGF5ZXJfaWQgOj0gbGF5ZXJfaWRzW2ldCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMTogbGF5ZXJfaWQgPSIsIGxheWVyX2lkKQoKICAgIHBfbW91bnQgOj0gY29uY2F0KCIvIiwgWyIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L2xheWVycyIsIGxheWVyX2lkXSkKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCAxOiBwX21vdW50ID0iLCBwX21vdW50KQoKICAgIHBfbW91bnQgPT0gaV9zdG9yYWdlLm1vdW50X3BvaW50CgogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDE6IHRydWUiKQp9CmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAiZnVzZTMua2F0YS1vdmVybGF5IgoKICAgIG1vdW50MSA6PSByZXBsYWNlKHBfc3RvcmFnZS5tb3VudF9wb2ludCwgIiQoY3BhdGgpIiwgcG9saWN5X2RhdGEuY29tbW9uLmNwYXRoKQogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDI6IG1vdW50MiA9IiwgbW91bnQyKQoKICAgIG1vdW50MiA9PSBpX3N0b3JhZ2UubW91bnRfcG9pbnQKCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMjogdHJ1ZSIpCn0KYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKSB7CiAgICBwX3N0b3JhZ2UuZnN0eXBlID09ICJsb2NhbCIKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQyID0iLCBtb3VudDIpCgogICAgbW91bnQzIDo9IHJlcGxhY2UobW91bnQyLCAiJChzYW5kYm94LWlkKSIsIHNhbmRib3hfaWQpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQzID0iLCBtb3VudDMpCgogICAgcmVnZXgubWF0Y2gobW91bnQzLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCgogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDM6IHRydWUiKQp9CmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAiYmluZCIKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNDogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNDogbW91bnQyID0iLCBtb3VudDIpCgogICAgbW91bnQzIDo9IHJlcGxhY2UobW91bnQyLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDQ6IG1vdW50MyA9IiwgbW91bnQzKQoKICAgIHJlZ2V4Lm1hdGNoKG1vdW50MywgaV9zdG9yYWdlLm1vdW50X3BvaW50KQoKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA0OiB0cnVlIikKfQphbGxvd19tb3VudF9wb2ludChwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgYnVuZGxlX2lkLCBzYW5kYm94X2lkLCBsYXllcl9pZHMpIHsKICAgIHBfc3RvcmFnZS5mc3R5cGUgPT0gInRtcGZzIgoKICAgIG1vdW50MSA6PSBwX3N0b3JhZ2UubW91bnRfcG9pbnQKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA1OiBtb3VudDEgPSIsIG1vdW50MSkKCiAgICByZWdleC5tYXRjaChtb3VudDEsIGlfc3RvcmFnZS5tb3VudF9wb2ludCkKCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNTogdHJ1ZSIpCn0KYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKSB7CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogaV9zdG9yYWdlLm1vdW50X3BvaW50ID0iLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCiAgICBhbGxvd19kaXJlY3Rfdm9sX2RyaXZlcihwX3N0b3JhZ2UsIGlfc3RvcmFnZSkKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChzcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQyID0iLCBtb3VudDIpCgogICAgZGlyZWN0X3ZvbF9wYXRoIDo9IGlfc3RvcmFnZS5zb3VyY2UKICAgIG1vdW50MyA6PSByZXBsYWNlKG1vdW50MiwgIiQoYjY0LWRpcmVjdC12b2wtcGF0aCkiLCBiYXNlNjR1cmwuZW5jb2RlKGRpcmVjdF92b2xfcGF0aCkpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQzID0iLCBtb3VudDMpCgogICAgbW91bnQzID09IGlfc3RvcmFnZS5tb3VudF9wb2ludAoKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA2OiB0cnVlIikKfQoKYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIocF9zdG9yYWdlLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19kaXJlY3Rfdm9sX2RyaXZlciAxOiBzdGFydCIpCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCiAgICBwcmludCgiYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIgMTogdHJ1ZSIpCn0KYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIocF9zdG9yYWdlLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19kaXJlY3Rfdm9sX2RyaXZlciAyOiBzdGFydCIpCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJzbWIiCiAgICBwcmludCgiYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIgMjogdHJ1ZSIpCn0KCiMgRXhlY1Byb2Nlc3NSZXF1ZXN0LnByb2Nlc3MuQ2FwYWJpbGl0aWVzCmFsbG93X2V4ZWNfY2FwcyhpX2NhcHMpIHsKICAgIG5vdCBpX2NhcHMuQW1iaWVudAogICAgbm90IGlfY2Fwcy5Cb3VuZGluZwogICAgbm90IGlfY2Fwcy5FZmZlY3RpdmUKICAgIG5vdCBpX2NhcHMuSW5oZXJpdGFibGUKICAgIG5vdCBpX2NhcHMuUGVybWl0dGVkCn0KCiMgT0NJLlByb2Nlc3MuQ2FwYWJpbGl0aWVzCmFsbG93X2NhcHMocF9jYXBzLCBpX2NhcHMpIHsKICAgIHByaW50KCJhbGxvd19jYXBzOiBwb2xpY3kgQW1iaWVudCA9IiwgcF9jYXBzLkFtYmllbnQpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgQW1iaWVudCA9IiwgaV9jYXBzLkFtYmllbnQpCiAgICBtYXRjaF9jYXBzKHBfY2Fwcy5BbWJpZW50LCBpX2NhcHMuQW1iaWVudCkKCiAgICBwcmludCgiYWxsb3dfY2FwczogcG9saWN5IEJvdW5kaW5nID0iLCBwX2NhcHMuQm91bmRpbmcpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgQm91bmRpbmcgPSIsIGlfY2Fwcy5Cb3VuZGluZykKICAgIG1hdGNoX2NhcHMocF9jYXBzLkJvdW5kaW5nLCBpX2NhcHMuQm91bmRpbmcpCgogICAgcHJpbnQoImFsbG93X2NhcHM6IHBvbGljeSBFZmZlY3RpdmUgPSIsIHBfY2Fwcy5FZmZlY3RpdmUpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgRWZmZWN0aXZlID0iLCBpX2NhcHMuRWZmZWN0aXZlKQogICAgbWF0Y2hfY2FwcyhwX2NhcHMuRWZmZWN0aXZlLCBpX2NhcHMuRWZmZWN0aXZlKQoKICAgIHByaW50KCJhbGxvd19jYXBzOiBwb2xpY3kgSW5oZXJpdGFibGUgPSIsIHBfY2Fwcy5Jbmhlcml0YWJsZSkKICAgIHByaW50KCJhbGxvd19jYXBzOiBpbnB1dCBJbmhlcml0YWJsZSA9IiwgaV9jYXBzLkluaGVyaXRhYmxlKQogICAgbWF0Y2hfY2FwcyhwX2NhcHMuSW5oZXJpdGFibGUsIGlfY2Fwcy5Jbmhlcml0YWJsZSkKCiAgICBwcmludCgiYWxsb3dfY2FwczogcG9saWN5IFBlcm1pdHRlZCA9IiwgcF9jYXBzLlBlcm1pdHRlZCkKICAgIHByaW50KCJhbGxvd19jYXBzOiBpbnB1dCBQZXJtaXR0ZWQgPSIsIGlfY2Fwcy5QZXJtaXR0ZWQpCiAgICBtYXRjaF9jYXBzKHBfY2Fwcy5QZXJtaXR0ZWQsIGlfY2Fwcy5QZXJtaXR0ZWQpCn0KCm1hdGNoX2NhcHMocF9jYXBzLCBpX2NhcHMpIHsKICAgIHByaW50KCJtYXRjaF9jYXBzIDE6IHN0YXJ0IikKCiAgICBwX2NhcHMgPT0gaV9jYXBzCgogICAgcHJpbnQoIm1hdGNoX2NhcHMgMTogdHJ1ZSIpCn0KbWF0Y2hfY2FwcyhwX2NhcHMsIGlfY2FwcykgewogICAgcHJpbnQoIm1hdGNoX2NhcHMgMjogc3RhcnQiKQoKICAgIGNvdW50KHBfY2FwcykgPT0gMQogICAgcF9jYXBzWzBdID09ICIkKGRlZmF1bHRfY2FwcykiCgogICAgcHJpbnQoIm1hdGNoX2NhcHMgMjogZGVmYXVsdF9jYXBzID0iLCBwb2xpY3lfZGF0YS5jb21tb24uZGVmYXVsdF9jYXBzKQogICAgcG9saWN5X2RhdGEuY29tbW9uLmRlZmF1bHRfY2FwcyA9PSBpX2NhcHMKCiAgICBwcmludCgibWF0Y2hfY2FwcyAyOiB0cnVlIikKfQptYXRjaF9jYXBzKHBfY2FwcywgaV9jYXBzKSB7CiAgICBwcmludCgibWF0Y2hfY2FwcyAzOiBzdGFydCIpCgogICAgY291bnQocF9jYXBzKSA9PSAxCiAgICBwX2NhcHNbMF0gPT0gIiQocHJpdmlsZWdlZF9jYXBzKSIKCiAgICBwcmludCgibWF0Y2hfY2FwcyAzOiBwcml2aWxlZ2VkX2NhcHMgPSIsIHBvbGljeV9kYXRhLmNvbW1vbi5wcml2aWxlZ2VkX2NhcHMpCiAgICBwb2xpY3lfZGF0YS5jb21tb24ucHJpdmlsZWdlZF9jYXBzID09IGlfY2FwcwoKICAgIHByaW50KCJtYXRjaF9jYXBzIDM6IHRydWUiKQp9CgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgpjaGVja19kaXJlY3RvcnlfdHJhdmVyc2FsKGlfcGF0aCkgewogICAgbm90IHJlZ2V4Lm1hdGNoKCIoXnwvKS4uKCR8LykiLCBpX3BhdGgpCn0KCmNoZWNrX3N5bWxpbmtfc291cmNlKGlfc3JjKSB7CiAgICBpX3NyYyA9PSAiIgogICAgcHJpbnQoImNoZWNrX3N5bWxpbmtfc291cmNlIDE6IHRydWUiKQp9CmNoZWNrX3N5bWxpbmtfc291cmNlKGlfc3JjKSB7CiAgICBpX3NyYyAhPSAiIgogICAgcHJpbnQoImNoZWNrX3N5bWxpbmtfc291cmNlIDI6IGlfc3JjID0iLCBpX3NyYykKCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24uc19zb3VyY2UxLCBpX3NyYykKCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMjogdHJ1ZSIpCn0KY2hlY2tfc3ltbGlua19zb3VyY2UoaV9zcmMpIHsKICAgIGlfc3JjICE9ICIiCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMzogaV9zcmMgPSIsIGlfc3JjKQoKICAgIHJlZ2V4Lm1hdGNoKHBvbGljeV9kYXRhLmNvbW1vbi5zX3NvdXJjZTIsIGlfc3JjKQogICAgY2hlY2tfZGlyZWN0b3J5X3RyYXZlcnNhbChpX3NyYykKCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMzogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfc3RvcmFnZXMoaV9zdG9yYWdlcykgewogICAgcHJpbnQoImFsbG93X3NhbmRib3hfc3RvcmFnZXM6IGlfc3RvcmFnZXMgPSIsIGlfc3RvcmFnZXMpCgogICAgcF9zdG9yYWdlcyA6PSBwb2xpY3lfZGF0YS5zYW5kYm94LnN0b3JhZ2VzCiAgICBldmVyeSBpX3N0b3JhZ2UgaW4gaV9zdG9yYWdlcyB7CiAgICAgICAgYWxsb3dfc2FuZGJveF9zdG9yYWdlKHBfc3RvcmFnZXMsIGlfc3RvcmFnZSkKICAgIH0KCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9zdG9yYWdlczogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfc3RvcmFnZShwX3N0b3JhZ2VzLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IGlfc3RvcmFnZSA9IiwgaV9zdG9yYWdlKQoKICAgIHNvbWUgcF9zdG9yYWdlIGluIHBfc3RvcmFnZXMKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IHBfc3RvcmFnZSA9IiwgcF9zdG9yYWdlKQogICAgaV9zdG9yYWdlID09IHBfc3RvcmFnZQoKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IHRydWUiKQp9CgpDb3B5RmlsZVJlcXVlc3QgewogICAgcHJpbnQoIkNvcHlGaWxlUmVxdWVzdDogaW5wdXQucGF0aCA9IiwgaW5wdXQucGF0aCkKCiAgICBjaGVja19zeW1saW5rX3NvdXJjZShpbnB1dC5zeW1saW5rX3NyYykKICAgIGNoZWNrX2RpcmVjdG9yeV90cmF2ZXJzYWwoaW5wdXQucGF0aCkKCiAgICBzb21lIHJlZ2V4MSBpbiBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLkNvcHlGaWxlUmVxdWVzdAogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5jcGF0aCkKICAgIHJlZ2V4NCA6PSByZXBsYWNlKHJlZ2V4MywgIiQoYnVuZGxlLWlkKSIsIEJVTkRMRV9JRCkKICAgIHByaW50KCJDb3B5RmlsZVJlcXVlc3Q6IHJlZ2V4NCA9IiwgcmVnZXg0KQoKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4NCwgaW5wdXQucGF0aCkKCiAgICBwcmludCgiQ29weUZpbGVSZXF1ZXN0OiB0cnVlIikKfQoKQ3JlYXRlU2FuZGJveFJlcXVlc3QgewogICAgcHJpbnQoIkNyZWF0ZVNhbmRib3hSZXF1ZXN0OiBpbnB1dC5ndWVzdF9ob29rX3BhdGggPSIsIGlucHV0Lmd1ZXN0X2hvb2tfcGF0aCkKICAgIGNvdW50KGlucHV0Lmd1ZXN0X2hvb2tfcGF0aCkgPT0gMAoKICAgIHByaW50KCJDcmVhdGVTYW5kYm94UmVxdWVzdDogaW5wdXQua2VybmVsX21vZHVsZXMgPSIsIGlucHV0Lmtlcm5lbF9tb2R1bGVzKQogICAgY291bnQoaW5wdXQua2VybmVsX21vZHVsZXMpID09IDAKCiAgICBpX3BpZG5zIDo9IGlucHV0LnNhbmRib3hfcGlkbnMKICAgIHByaW50KCJDcmVhdGVTYW5kYm94UmVxdWVzdDogaV9waWRucyA9IiwgaV9waWRucykKICAgIGlfcGlkbnMgPT0gZmFsc2UKICAgIGFsbG93X3NhbmRib3hfc3RvcmFnZXMoaW5wdXQuc3RvcmFnZXMpCn0KCmFsbG93X2V4ZWMocF9jb250YWluZXIsIGlfcHJvY2VzcykgewogICAgcHJpbnQoImFsbG93X2V4ZWM6IHN0YXJ0IikKCiAgICBwX29jaSA9IHBfY29udGFpbmVyLk9DSQogICAgcF9zX25hbWUgPSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc19uYW1lc3BhY2UgPSBnZXRfc3RhdGVfdmFsKCJuYW1lc3BhY2UiKQogICAgYWxsb3dfcHJvYmVfcHJvY2VzcyhwX29jaS5Qcm9jZXNzLCBpX3Byb2Nlc3MsIHBfc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfZXhlYzogdHJ1ZSIpCn0KCmFsbG93X2ludGVyYWN0aXZlX2V4ZWMocF9jb250YWluZXIsIGlfcHJvY2VzcykgewogICAgcHJpbnQoImFsbG93X2ludGVyYWN0aXZlX2V4ZWM6IHN0YXJ0IikKCiAgICBwX29jaSA9IHBfY29udGFpbmVyLk9DSQogICAgcF9zX25hbWUgPSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc19uYW1lc3BhY2UgPSBnZXRfc3RhdGVfdmFsKCJuYW1lc3BhY2UiKQogICAgYWxsb3dfaW50ZXJhY3RpdmVfcHJvY2VzcyhwX29jaS5Qcm9jZXNzLCBpX3Byb2Nlc3MsIHBfc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfaW50ZXJhY3RpdmVfZXhlYzogdHJ1ZSIpCn0KCiMgVE9ETzogc2hvdWxkIG90aGVyIEV4ZWNQcm9jZXNzUmVxdWVzdCBpbnB1dCBkYXRhIGZpZWxkcyBiZSB2YWxpZGF0ZWQgYXMgd2VsbD8KRXhlY1Byb2Nlc3NSZXF1ZXN0IHsKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMTogaW5wdXQgPSIsIGlucHV0KQoKICAgIHNvbWUgcF9jb21tYW5kIGluIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuRXhlY1Byb2Nlc3NSZXF1ZXN0LmFsbG93ZWRfY29tbWFuZHMKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMTogcF9jb21tYW5kID0iLCBwX2NvbW1hbmQpCiAgICBwX2NvbW1hbmQgPT0gaW5wdXQucHJvY2Vzcy5BcmdzCgogICAgIyBUT0RPOiBtYXRjaCBwX2NvbnRhaW5lcidzIElEIHdpdGggdGhlIGlucHV0IGNvbnRhaW5lcl9pZC4KICAgIHNvbWUgcF9jb250YWluZXIgaW4gcG9saWN5X2RhdGEuY29udGFpbmVycwogICAgYWxsb3dfaW50ZXJhY3RpdmVfZXhlYyhwX2NvbnRhaW5lciwgaW5wdXQucHJvY2VzcykKCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDE6IHRydWUiKQp9CkV4ZWNQcm9jZXNzUmVxdWVzdCB7CiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDI6IGlucHV0ID0iLCBpbnB1dCkKCiAgICAjIFRPRE86IG1hdGNoIGlucHV0IGNvbnRhaW5lciBJRCB3aXRoIGl0cyBjb3JyZXNwb25kaW5nIGNvbnRhaW5lci5leGVjX2NvbW1hbmRzLgogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBzb21lIHBfY29tbWFuZCBpbiBwX2NvbnRhaW5lci5leGVjX2NvbW1hbmRzCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDI6IHBfY29tbWFuZCA9IiwgcF9jb21tYW5kKQoKICAgICMgVE9ETzogc2hvdWxkIG90aGVyIGlucHV0IGRhdGEgZmllbGRzIGJlIHZhbGlkYXRlZCBhcyB3ZWxsPwogICAgcF9jb21tYW5kID09IGlucHV0LnByb2Nlc3MuQXJncwoKICAgIGFsbG93X2V4ZWMocF9jb250YWluZXIsIGlucHV0LnByb2Nlc3MpCgogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAyOiB0cnVlIikKfQpFeGVjUHJvY2Vzc1JlcXVlc3QgewogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAzOiBpbnB1dCA9IiwgaW5wdXQpCgogICAgaV9jb21tYW5kID0gY29uY2F0KCIgIiwgaW5wdXQucHJvY2Vzcy5BcmdzKQogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAzOiBpX2NvbW1hbmQgPSIsIGlfY29tbWFuZCkKCiAgICBzb21lIHBfcmVnZXggaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5FeGVjUHJvY2Vzc1JlcXVlc3QucmVnZXgKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMzogcF9yZWdleCA9IiwgcF9yZWdleCkKCiAgICByZWdleC5tYXRjaChwX3JlZ2V4LCBpX2NvbW1hbmQpCgogICAgIyBUT0RPOiBtYXRjaCBwX2NvbnRhaW5lcidzIElEIHdpdGggdGhlIGlucHV0IGNvbnRhaW5lcl9pZC4KICAgIHNvbWUgcF9jb250YWluZXIgaW4gcG9saWN5X2RhdGEuY29udGFpbmVycwogICAgYWxsb3dfaW50ZXJhY3RpdmVfZXhlYyhwX2NvbnRhaW5lciwgaW5wdXQucHJvY2VzcykKCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDM6IHRydWUiKQp9CgpVcGRhdGVSb3V0ZXNSZXF1ZXN0IHsKICAgIHByaW50KCJVcGRhdGVSb3V0ZXNSZXF1ZXN0OiBpbnB1dCA9IiwgaW5wdXQpCiAgICBwcmludCgiVXBkYXRlUm91dGVzUmVxdWVzdDogcG9saWN5ID0iLCBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLlVwZGF0ZVJvdXRlc1JlcXVlc3QpCgogICAgaV9yb3V0ZXMgOj0gaW5wdXQucm91dGVzLlJvdXRlcwogICAgcF9zb3VyY2VfcmVnZXggPSBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLlVwZGF0ZVJvdXRlc1JlcXVlc3QuZm9yYmlkZGVuX3NvdXJjZV9yZWdleAogICAgcF9uYW1lcyA9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuVXBkYXRlUm91dGVzUmVxdWVzdC5mb3JiaWRkZW5fZGV2aWNlX25hbWVzCgogICAgZXZlcnkgaV9yb3V0ZSBpbiBpX3JvdXRlcyB7CiAgICAgICAgcHJpbnQoImlfcm91dGUuc291cmNlID0iLCBpX3JvdXRlLnNvdXJjZSkKICAgICAgICBldmVyeSBwX3JlZ2V4IGluIHBfc291cmNlX3JlZ2V4IHsKICAgICAgICAgICAgcHJpbnQoInBfcmVnZXggPSIsIHBfcmVnZXgpCiAgICAgICAgICAgIG5vdCByZWdleC5tYXRjaChwX3JlZ2V4LCBpX3JvdXRlLnNvdXJjZSkKICAgICAgICB9CgogICAgICAgIHByaW50KCJpX3JvdXRlLmRldmljZSA9IiwgaV9yb3V0ZS5kZXZpY2UpCiAgICAgICAgbm90IGlfcm91dGUuZGV2aWNlIGluIHBfbmFtZXMKICAgIH0KCiAgICBwcmludCgiVXBkYXRlUm91dGVzUmVxdWVzdDogdHJ1ZSIpCn0KClVwZGF0ZUludGVyZmFjZVJlcXVlc3QgewogICAgcHJpbnQoIlVwZGF0ZUludGVyZmFjZVJlcXVlc3Q6IGlucHV0ID0iLCBpbnB1dCkKICAgIHByaW50KCJVcGRhdGVJbnRlcmZhY2VSZXF1ZXN0OiBwb2xpY3kgPSIsIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuVXBkYXRlSW50ZXJmYWNlUmVxdWVzdCkKCiAgICBpX2ludGVyZmFjZSA6PSBpbnB1dC5pbnRlcmZhY2UKICAgIHBfZmxhZ3MgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmFsbG93X3Jhd19mbGFncwoKICAgICMgVHlwaWNhbGx5LCBqdXN0IElGRl9OT0FSUCBpcyB1c2VkLgogICAgYml0cy5hbmQoaV9pbnRlcmZhY2UucmF3X2ZsYWdzLCBiaXRzLm5lZ2F0ZShwX2ZsYWdzKSkgPT0gMAoKICAgIHBfbmFtZXMgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmZvcmJpZGRlbl9uYW1lcwoKICAgIG5vdCBpX2ludGVyZmFjZS5uYW1lIGluIHBfbmFtZXMKCiAgICBwX2h3YWRkcnMgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmZvcmJpZGRlbl9od19hZGRycwoKICAgIG5vdCBpX2ludGVyZmFjZS5od0FkZHIgaW4gcF9od2FkZHJzCgogICAgcHJpbnQoIlVwZGF0ZUludGVyZmFjZVJlcXVlc3Q6IHRydWUiKQp9CgpDbG9zZVN0ZGluUmVxdWVzdCB7CiAgICBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLkNsb3NlU3RkaW5SZXF1ZXN0ID09IHRydWUKfQoKUmVhZFN0cmVhbVJlcXVlc3QgewogICAgcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5SZWFkU3RyZWFtUmVxdWVzdCA9PSB0cnVlCn0KClVwZGF0ZUVwaGVtZXJhbE1vdW50c1JlcXVlc3QgewogICAgcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVFcGhlbWVyYWxNb3VudHNSZXF1ZXN0ID09IHRydWUKfQoKV3JpdGVTdHJlYW1SZXF1ZXN0IHsKICAgIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuV3JpdGVTdHJlYW1SZXF1ZXN0ID09IHRydWUKfQoKcG9saWN5X2RhdGEgOj0gewogICJjb250YWluZXJzIjogWwogICAgewogICAgICAiT0NJIjogewogICAgICAgICJWZXJzaW9uIjogIjEuMS4wLXJjLjEiLAogICAgICAgICJQcm9jZXNzIjogewogICAgICAgICAgIlRlcm1pbmFsIjogZmFsc2UsCiAgICAgICAgICAiVXNlciI6IHsKICAgICAgICAgICAgIlVJRCI6IDY1NTM1LAogICAgICAgICAgICAiR0lEIjogNjU1MzUsCiAgICAgICAgICAgICJBZGRpdGlvbmFsR2lkcyI6IFtdLAogICAgICAgICAgICAiVXNlcm5hbWUiOiAiIgogICAgICAgICAgfSwKICAgICAgICAgICJEZXByZWNhdGVkQXJncyI6IFsKICAgICAgICAgICAgIi9wYXVzZSIKICAgICAgICAgIF0sCiAgICAgICAgICAiQXJncyI6IFsKICAgICAgICAgICAgIi9wYXVzZSIKICAgICAgICAgIF0sCiAgICAgICAgICAiRW52IjogWwogICAgICAgICAgICAiUEFUSD0vdXNyL2xvY2FsL3NiaW46L3Vzci9sb2NhbC9iaW46L3Vzci9zYmluOi91c3IvYmluOi9zYmluOi9iaW4iCiAgICAgICAgICBdLAogICAgICAgICAgIkN3ZCI6ICIvIiwKICAgICAgICAgICJDYXBhYmlsaXRpZXMiOiB7CiAgICAgICAgICAgICJBbWJpZW50IjogW10sCiAgICAgICAgICAgICJCb3VuZGluZyI6IFsKICAgICAgICAgICAgICAiJChkZWZhdWx0X2NhcHMpIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiRWZmZWN0aXZlIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJJbmhlcml0YWJsZSI6IFtdLAogICAgICAgICAgICAiUGVybWl0dGVkIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICAiTm9OZXdQcml2aWxlZ2VzIjogdHJ1ZQogICAgICAgIH0sCiAgICAgICAgIlJvb3QiOiB7CiAgICAgICAgICAiUGF0aCI6ICIkKGNwYXRoKS8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgIlJlYWRvbmx5IjogdHJ1ZQogICAgICAgIH0sCiAgICAgICAgIk1vdW50cyI6IFsKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9wcm9jIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJwcm9jIiwKICAgICAgICAgICAgInR5cGVfIjogInByb2MiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2IiwKICAgICAgICAgICAgInNvdXJjZSI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJzdHJpY3RhdGltZSIsCiAgICAgICAgICAgICAgIm1vZGU9NzU1IiwKICAgICAgICAgICAgICAic2l6ZT02NTUzNmsiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L3B0cyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiZGV2cHRzIiwKICAgICAgICAgICAgInR5cGVfIjogImRldnB0cyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJuZXdpbnN0YW5jZSIsCiAgICAgICAgICAgICAgInB0bXhtb2RlPTA2NjYiLAogICAgICAgICAgICAgICJtb2RlPTA2MjAiLAogICAgICAgICAgICAgICJnaWQ9NSIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvc2htIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L3NobSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi9tcXVldWUiLAogICAgICAgICAgICAic291cmNlIjogIm1xdWV1ZSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJtcXVldWUiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvc3lzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJzeXNmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJzeXNmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2V0Yy9yZXNvbHYuY29uZiIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClyZXNvbHYuY29uZiQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJvIiwKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9kZXYiLAogICAgICAgICAgICAgICJub2V4ZWMiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0KICAgICAgICBdLAogICAgICAgICJBbm5vdGF0aW9ucyI6IHsKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmJ1bmRsZV9wYXRoIjogIi9ydW4vY29udGFpbmVyZC9pby5jb250YWluZXJkLnJ1bnRpbWUudjIudGFzay9rOHMuaW8vJChidW5kbGUtaWQpIiwKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIjogInBvZF9zYW5kYm94IiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSI6ICJzYW5kYm94IiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWlkIjogIl5bYS16MC05XXs2NH0kIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWxvZy1kaXJlY3RvcnkiOiAiXi92YXIvbG9nL3BvZHMvJChzYW5kYm94LW5hbWVzcGFjZSlfJChzYW5kYm94LW5hbWUpX1swLTlhLWZdezh9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezEyfSQiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZXNwYWNlIjogIiIsCiAgICAgICAgICAibmVyZGN0bC9uZXR3b3JrLW5hbWVzcGFjZSI6ICJeL3Zhci9ydW4vbmV0bnMvY25pLVswLTlhLWZdezh9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezEyfSQiCiAgICAgICAgfSwKICAgICAgICAiTGludXgiOiB7CiAgICAgICAgICAiTmFtZXNwYWNlcyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICJUeXBlIjogImlwYyIsCiAgICAgICAgICAgICAgIlBhdGgiOiAiIgogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgIlR5cGUiOiAidXRzIiwKICAgICAgICAgICAgICAiUGF0aCI6ICIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiVHlwZSI6ICJtb3VudCIsCiAgICAgICAgICAgICAgIlBhdGgiOiAiIgogICAgICAgICAgICB9CiAgICAgICAgICBdLAogICAgICAgICAgIk1hc2tlZFBhdGhzIjogWwogICAgICAgICAgICAiL3Byb2MvYWNwaSIsCiAgICAgICAgICAgICIvcHJvYy9hc291bmQiLAogICAgICAgICAgICAiL3Byb2Mva2NvcmUiLAogICAgICAgICAgICAiL3Byb2Mva2V5cyIsCiAgICAgICAgICAgICIvcHJvYy9sYXRlbmN5X3N0YXRzIiwKICAgICAgICAgICAgIi9wcm9jL3RpbWVyX2xpc3QiLAogICAgICAgICAgICAiL3Byb2MvdGltZXJfc3RhdHMiLAogICAgICAgICAgICAiL3Byb2Mvc2NoZWRfZGVidWciLAogICAgICAgICAgICAiL3N5cy9maXJtd2FyZSIsCiAgICAgICAgICAgICIvcHJvYy9zY3NpIgogICAgICAgICAgXSwKICAgICAgICAgICJSZWFkb25seVBhdGhzIjogWwogICAgICAgICAgICAiL3Byb2MvYnVzIiwKICAgICAgICAgICAgIi9wcm9jL2ZzIiwKICAgICAgICAgICAgIi9wcm9jL2lycSIsCiAgICAgICAgICAgICIvcHJvYy9zeXMiLAogICAgICAgICAgICAiL3Byb2Mvc3lzcnEtdHJpZ2dlciIKICAgICAgICAgIF0sCiAgICAgICAgICAiRGV2aWNlcyI6IFtdLAogICAgICAgICAgIlN5c2N0bCI6IHsKICAgICAgICAgICAgIm5ldC5pcHY0LmlwX3VucHJpdmlsZWdlZF9wb3J0X3N0YXJ0IjogIjAiLAogICAgICAgICAgICAibmV0LmlwdjQucGluZ19ncm91cF9yYW5nZSI6ICIwIDIxNDc0ODM2NDciCiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9LAogICAgICAic3RvcmFnZXMiOiBbCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJibGsiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogInRhciIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIiQoaGFzaDApIgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGxheWVyMCkiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJvdmVybGF5ZnMiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogImZ1c2UzLmthdGEtb3ZlcmxheSIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIjVhNWFhZDgwMDU1ZmYyMDAxMmE1MGRjMjVmOGRmN2EyOTkyNDQ3NDMyNGQ2NWY3ZDUzMDZlZThlZTI3ZmY3MWQiLAogICAgICAgICAgICAiODE3MjUwZjFhM2UzMzZkYTc2ZjViZDNmYTc4NGUxYjI2ZDk1OWI5YzEzMTg3NjgxNWJhMjYwNDA0OGI3MGMxOCIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChjcGF0aCkvJChidW5kbGUtaWQpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9CiAgICAgIF0sCiAgICAgICJkZXZpY2VzIjogW10sCiAgICAgICJzYW5kYm94X3BpZG5zIjogZmFsc2UsCiAgICAgICJleGVjX2NvbW1hbmRzIjogW10sCiAgICAgICJlbnZfbWFwIjogewogICAgICAgICJQQVRIIjogIi91c3IvbG9jYWwvc2JpbjovdXNyL2xvY2FsL2JpbjovdXNyL3NiaW46L3Vzci9iaW46L3NiaW46L2JpbiIKICAgICAgfQogICAgfSwKICAgIHsKICAgICAgIk9DSSI6IHsKICAgICAgICAiVmVyc2lvbiI6ICIxLjEuMC1yYy4xIiwKICAgICAgICAiUHJvY2VzcyI6IHsKICAgICAgICAgICJUZXJtaW5hbCI6IGZhbHNlLAogICAgICAgICAgIlVzZXIiOiB7CiAgICAgICAgICAgICJVSUQiOiA2NTUzMiwKICAgICAgICAgICAgIkdJRCI6IDAsCiAgICAgICAgICAgICJBZGRpdGlvbmFsR2lkcyI6IFtdLAogICAgICAgICAgICAiVXNlcm5hbWUiOiAiIgogICAgICAgICAgfSwKICAgICAgICAgICJEZXByZWNhdGVkQXJncyI6IFsKICAgICAgICAgICAgIi9odHRwLWVjaG8iLAogICAgICAgICAgICAiLXRleHQ9SGVsbG8gZnJvbSBCYWNrZW5kIiwKICAgICAgICAgICAgIi1saXN0ZW49OjgwODAiCiAgICAgICAgICBdLAogICAgICAgICAgIkFyZ3MiOiBbCiAgICAgICAgICAgICIvaHR0cC1lY2hvIiwKICAgICAgICAgICAgIi10ZXh0PUhlbGxvIGZyb20gQmFja2VuZCIsCiAgICAgICAgICAgICItbGlzdGVuPTo4MDgwIgogICAgICAgICAgXSwKICAgICAgICAgICJFbnYiOiBbCiAgICAgICAgICAgICJQQVRIPS91c3IvbG9jYWwvc2JpbjovdXNyL2xvY2FsL2JpbjovdXNyL3NiaW46L3Vzci9iaW46L3NiaW46L2JpbiIsCiAgICAgICAgICAgICJTU0xfQ0VSVF9GSUxFPS9ldGMvc3NsL2NlcnRzL2NhLWNlcnRpZmljYXRlcy5jcnQiLAogICAgICAgICAgICAiRUNIT19URVhUPWhlbGxvLXdvcmxkIiwKICAgICAgICAgICAgIkhPU1ROQU1FPSQoaG9zdC1uYW1lKSIKICAgICAgICAgIF0sCiAgICAgICAgICAiQ3dkIjogIi9ob21lL25vbnJvb3QiLAogICAgICAgICAgIkNhcGFiaWxpdGllcyI6IHsKICAgICAgICAgICAgIkFtYmllbnQiOiBbXSwKICAgICAgICAgICAgIkJvdW5kaW5nIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJFZmZlY3RpdmUiOiBbCiAgICAgICAgICAgICAgIiQoZGVmYXVsdF9jYXBzKSIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgIkluaGVyaXRhYmxlIjogW10sCiAgICAgICAgICAgICJQZXJtaXR0ZWQiOiBbCiAgICAgICAgICAgICAgIiQoZGVmYXVsdF9jYXBzKSIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgICJOb05ld1ByaXZpbGVnZXMiOiBmYWxzZQogICAgICAgIH0sCiAgICAgICAgIlJvb3QiOiB7CiAgICAgICAgICAiUGF0aCI6ICIkKGNwYXRoKS8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgIlJlYWRvbmx5IjogZmFsc2UKICAgICAgICB9LAogICAgICAgICJNb3VudHMiOiBbCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvcHJvYyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAicHJvYyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJwcm9jIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAgICAgIm5vZGV2IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2RldiIsCiAgICAgICAgICAgICJzb3VyY2UiOiAidG1wZnMiLAogICAgICAgICAgICAidHlwZV8iOiAidG1wZnMiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAic3RyaWN0YXRpbWUiLAogICAgICAgICAgICAgICJtb2RlPTc1NSIsCiAgICAgICAgICAgICAgInNpemU9NjU1MzZrIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi9wdHMiLAogICAgICAgICAgICAic291cmNlIjogImRldnB0cyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJkZXZwdHMiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibmV3aW5zdGFuY2UiLAogICAgICAgICAgICAgICJwdG14bW9kZT0wNjY2IiwKICAgICAgICAgICAgICAibW9kZT0wNjIwIiwKICAgICAgICAgICAgICAiZ2lkPTUiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L3NobSIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiL3J1bi9rYXRhLWNvbnRhaW5lcnMvc2FuZGJveC9zaG0iLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvbXF1ZXVlIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJtcXVldWUiLAogICAgICAgICAgICAidHlwZV8iOiAibXF1ZXVlIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAgICAgIm5vZGV2IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL3N5cyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAic3lzZnMiLAogICAgICAgICAgICAidHlwZV8iOiAic3lzZnMiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiLAogICAgICAgICAgICAgICJybyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9zeXMvZnMvY2dyb3VwIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJjZ3JvdXAiLAogICAgICAgICAgICAidHlwZV8iOiAiY2dyb3VwIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAgICAgIm5vZGV2IiwKICAgICAgICAgICAgICAicmVsYXRpbWUiLAogICAgICAgICAgICAgICJybyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9ldGMvaG9zdHMiLAogICAgICAgICAgICAic291cmNlIjogIiQoc2ZwcmVmaXgpaG9zdHMkIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJ3IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi90ZXJtaW5hdGlvbi1sb2ciLAogICAgICAgICAgICAic291cmNlIjogIiQoc2ZwcmVmaXgpdGVybWluYXRpb24tbG9nJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJydyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9ldGMvaG9zdG5hbWUiLAogICAgICAgICAgICAic291cmNlIjogIiQoc2ZwcmVmaXgpaG9zdG5hbWUkIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJ3IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2V0Yy9yZXNvbHYuY29uZiIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClyZXNvbHYuY29uZiQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicnciCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvdmFyL3J1bi9zZWNyZXRzL2t1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQiLAogICAgICAgICAgICAic291cmNlIjogIiQoc2ZwcmVmaXgpc2VydmljZWFjY291bnQkIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL3Zhci9ydW4vc2VjcmV0cy9henVyZS90b2tlbnMiLAogICAgICAgICAgICAic291cmNlIjogIiQoc2ZwcmVmaXgpdG9rZW5zJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJybyIKICAgICAgICAgICAgXQogICAgICAgICAgfQogICAgICAgIF0sCiAgICAgICAgIkFubm90YXRpb25zIjogewogICAgICAgICAgImlvLmthdGFjb250YWluZXJzLnBrZy5vY2kuYnVuZGxlX3BhdGgiOiAiL3J1bi9jb250YWluZXJkL2lvLmNvbnRhaW5lcmQucnVudGltZS52Mi50YXNrL2s4cy5pby8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgImlvLmthdGFjb250YWluZXJzLnBrZy5vY2kuY29udGFpbmVyX3R5cGUiOiAicG9kX2NvbnRhaW5lciIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLW5hbWUiOiAiYmFja2VuZCIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLXR5cGUiOiAiY29udGFpbmVyIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5pbWFnZS1uYW1lIjogIm1hcmluZXJjb25mcG9kc3Rlc3QuYXp1cmVjci5pby9oYXNoaWNvcnAvaHR0cC1lY2hvOmxhdGVzdCIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCI6ICJeW2EtejAtOV17NjR9JCIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1uYW1lc3BhY2UiOiAiIgogICAgICAgIH0sCiAgICAgICAgIkxpbnV4IjogewogICAgICAgICAgIk5hbWVzcGFjZXMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiVHlwZSI6ICJpcGMiLAogICAgICAgICAgICAgICJQYXRoIjogIiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJUeXBlIjogInV0cyIsCiAgICAgICAgICAgICAgIlBhdGgiOiAiIgogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgIlR5cGUiOiAibW91bnQiLAogICAgICAgICAgICAgICJQYXRoIjogIiIKICAgICAgICAgICAgfQogICAgICAgICAgXSwKICAgICAgICAgICJNYXNrZWRQYXRocyI6IFsKICAgICAgICAgICAgIi9wcm9jL2FjcGkiLAogICAgICAgICAgICAiL3Byb2Mva2NvcmUiLAogICAgICAgICAgICAiL3Byb2Mva2V5cyIsCiAgICAgICAgICAgICIvcHJvYy9sYXRlbmN5X3N0YXRzIiwKICAgICAgICAgICAgIi9wcm9jL3RpbWVyX2xpc3QiLAogICAgICAgICAgICAiL3Byb2MvdGltZXJfc3RhdHMiLAogICAgICAgICAgICAiL3Byb2Mvc2NoZWRfZGVidWciLAogICAgICAgICAgICAiL3Byb2Mvc2NzaSIsCiAgICAgICAgICAgICIvc3lzL2Zpcm13YXJlIgogICAgICAgICAgXSwKICAgICAgICAgICJSZWFkb25seVBhdGhzIjogWwogICAgICAgICAgICAiL3Byb2MvYXNvdW5kIiwKICAgICAgICAgICAgIi9wcm9jL2J1cyIsCiAgICAgICAgICAgICIvcHJvYy9mcyIsCiAgICAgICAgICAgICIvcHJvYy9pcnEiLAogICAgICAgICAgICAiL3Byb2Mvc3lzIiwKICAgICAgICAgICAgIi9wcm9jL3N5c3JxLXRyaWdnZXIiCiAgICAgICAgICBdLAogICAgICAgICAgIkRldmljZXMiOiBbXSwKICAgICAgICAgICJTeXNjdGwiOiB7CiAgICAgICAgICAgICJuZXQuaXB2NC5pcF91bnByaXZpbGVnZWRfcG9ydF9zdGFydCI6ICIwIiwKICAgICAgICAgICAgIm5ldC5pcHY0LnBpbmdfZ3JvdXBfcmFuZ2UiOiAiMCAyMTQ3NDgzNjQ3IgogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSwKICAgICAgInN0b3JhZ2VzIjogWwogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2gwKSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjApIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2gxKSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjEpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2gyKSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjIpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2gzKSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjMpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2g0KSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjQpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2g1KSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjUpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2g2KSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjYpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2g3KSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjcpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2g4KSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjgpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2g5KSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjkpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAib3ZlcmxheWZzIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJmdXNlMy5rYXRhLW92ZXJsYXkiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICI5MzJmZjI0OTNiMTEyZTVhYzYyZWIzZjEwMzMxZjhiYzgwZjc5NDE4NjA2ZGE5ODRiYTc3NWVjMmRjYTExOTczOmQwMzhjOTQ1NWMzNTlhMTY0ZmRjNDdlZTY4MWEzZjRlNWU0NDkzMjMzMGUzMmY5NGFjYzIxNWQ3ZWJmZDJmMjM6YTQ4NWRlYjI3NGEzYmFlYjM4ZWQxMzQzOGJjZDlhMTA2ZTMyNmYzMTlmYmUxOTk1ZjU2ZjcyMjM3OThmMDNkYjozYjI3ZGM1Y2I5MmU0MmFlNmQyYzQ1M2IwODIyMzhkZTYwMGRmMDM2OTE5NjY1NTA5NGIzYjhjYzJjZTdmOGRjOjk4YTRmMGQxN2NhNGZiNDI4YmI3OTA1ZTYyMGNiZjA5ODk2MTcxMzg5Yjc1NzMzZjc1YjQ0Y2EwYzQzODVjMTk6MGE1ZGUzMGFjNDQ2M2NiYjEwYWRlMGIxMDJlY2YyZWFiYjRkY2MxNTI1MmEzYWFmYmFjNzFhZDcwMmM0NTQzMDowNzM4NzExYmUwOTI4NmJlYmE2MTliYjY5MTQ5YTRhZWI0ZjVkNmU2MzUxYjViZmRjNzMxMzk0MDE0YjMwY2YxOjYwNzIxNzMyNjc0ZDhlMGY3YmRlOGMxMmFkNzNkZTRmNzk4ZjY2NjMwNWFhYzMwNjU1YzUyNGUyNWVmZjdkYWY6MGUzOTg4YWEyNjZiZDdjMWIwYzhlZDBiOGM3Y2ZhN2VlZWQ1NDIwZjE5NTY3ZGQ4NjkyODkxZmQxYWYwMjI3MTowYmNiOTFkOGMxOTE1ODVlYjJlYzQ1MzVjYThhOTQ3OGY0ZDdiZWRiODQ0Y2NkNDY1ODE2NTIyMWM3NjFlNTNmIiwKICAgICAgICAgICAgIjI1OTY3MGY5MDE1NDMwNjhiOGY1MTZlNDNhMWRkMjdlYTdiMDlmNTQwYjNhNWMwZDdiM2QzYjIxYWMyMGM4YmI6ZjNlOTI2NTM5ODI3MGI0OTk4ZGQyODQ5NWM5NzE1MjE5YzcxNTQxMWU1ODVlN2UzZjRiYjY0YzQ4YjEyMmMzZDpiYzA2Y2QxOTI3ZTA0NzA0N2MzZTZhMzczYzYzN2E5Y2E1MDQ1NDgzMzdkNjJhYWQ3ZWIwZGJmNzllODUxYWU3OmExMGQ0NzdiY2YxODA4MmYyYzk1MWViNDNhNzhmZDFmNGMwOTk3NWMxMmUzODczYmM4NmYyY2E3Yzk2OTkwMWU6ODgzOGMxODI0NTdlYTdiN2M2ZjhiZjhhNzNhMzk3MzdlNGE5YzU5ZTU1MmRkOTA2MzIxYjI3ZTY1YWJlYTFlNzpjZmVhYWEzZjdiZWQ4MGRjYWY2OGQ4M2I0NDEwMzUwZGY3OWI5YTk3OWFhMTkxMDAwOTA2MTJjZmI4OWMyNWU0Ojc2YWUyYWMyOGE4Y2I2MDdmMGUwNDRlYTZkMmNhZDg4Mzg3ODU3NTAyNGRmMjk5YTkyZjJhNTVmNTBiZWE4YTI6MjNiOGM0NTFhN2E3Mjg0NmU1ZjRjODFkYzIwYjhkODQyMjRlYTJjODkwYTU4MjAxOGRmMjMyOGE5Njc2MTU2Yzo2Y2UzNTA3MWRlMmUzYjU0Mzg5MTk3NzYwNTA5MDZkMGVkMTE2NGE0OWRjM2QwNjYxNDhhMWE4MzljOTllMmVmOjUzYjgwMjhhZjA2MDA5YzNhZjZlODc2NWE1Y2M2M2MyMzE5OWQ0Y2VlZmNlZTJjNTgxOTRhMTM0MTdmNmE2Y2UiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQoY3BhdGgpLyQoYnVuZGxlLWlkKSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfQogICAgICBdLAogICAgICAiZGV2aWNlcyI6IFtdLAogICAgICAic2FuZGJveF9waWRucyI6IGZhbHNlLAogICAgICAiZXhlY19jb21tYW5kcyI6IFtdLAogICAgICAiZW52X21hcCI6IHsKICAgICAgICAiRUNIT19URVhUIjogImhlbGxvLXdvcmxkIiwKICAgICAgICAiSE9TVE5BTUUiOiAiJChob3N0LW5hbWUpIiwKICAgICAgICAiUEFUSCI6ICIvdXNyL2xvY2FsL3NiaW46L3Vzci9sb2NhbC9iaW46L3Vzci9zYmluOi91c3IvYmluOi9zYmluOi9iaW4iLAogICAgICAgICJTU0xfQ0VSVF9GSUxFIjogIi9ldGMvc3NsL2NlcnRzL2NhLWNlcnRpZmljYXRlcy5jcnQiCiAgICAgIH0KICAgIH0KICBdLAogICJjb21tb24iOiB7CiAgICAiY3BhdGgiOiAiL3J1bi9rYXRhLWNvbnRhaW5lcnMvc2hhcmVkL2NvbnRhaW5lcnMiLAogICAgIm1vdW50X3NvdXJjZV9jcGF0aCI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zaGFyZWQvY29udGFpbmVycyIsCiAgICAic2ZwcmVmaXgiOiAiXiQoY3BhdGgpLyQoYnVuZGxlLWlkKS1bYS16MC05XXsxNn0tIiwKICAgICJzcGF0aCI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L3N0b3JhZ2UiLAogICAgImlwdjRfYSI6ICIoKFswLTldfFsxLTldWzAtOV18MVswLTldezJ9fDJbMC00XVswLTldfDI1WzAtNV0pXFwuKXszfShbMC05XXxbMS05XVswLTldfDFbMC05XXsyfXwyWzAtNF1bMC05XXwyNVswLTVdKSIsCiAgICAiaXBfcCI6ICJbMC05XXsxLDV9IiwKICAgICJzdmNfbmFtZSI6ICJbQS1aX1xcLlxcLV0rIiwKICAgICJkbnNfbGFiZWwiOiAiW2EtekEtWjAtOV9cXC5cXC1dKyIsCiAgICAic19zb3VyY2UxIjogIl4uLjJbMC05XXszfV9bMC0xXVswLTldX1swLTNdWzAtOV1fWzAtMl1bMC05XV9bMC01XVswLTldX1swLTVdWzAtOV1cXC5bMC05XXsxLDEwfSQiLAogICAgInNfc291cmNlMiI6ICJeLi5kYXRhLyIsCiAgICAiZG5zX3N1YmRvbWFpbiI6ICJeW2EtejAtOV0oWy1hLXowLTldKlthLXowLTldKT8kIiwKICAgICJwb2RfdWlkIjogIl5bMC05YS1mQS1GXXs4fS1bMC05YS1mQS1GXXs0fS1bMC05YS1mQS1GXXs0fS1bMC05YS1mQS1GXXs0fS1bMC05YS1mQS1GXXsxMn0kIiwKICAgICJkZWZhdWx0X2NhcHMiOiBbCiAgICAgICJDQVBfQ0hPV04iLAogICAgICAiQ0FQX0RBQ19PVkVSUklERSIsCiAgICAgICJDQVBfRlNFVElEIiwKICAgICAgIkNBUF9GT1dORVIiLAogICAgICAiQ0FQX01LTk9EIiwKICAgICAgIkNBUF9ORVRfUkFXIiwKICAgICAgIkNBUF9TRVRHSUQiLAogICAgICAiQ0FQX1NFVFVJRCIsCiAgICAgICJDQVBfU0VURkNBUCIsCiAgICAgICJDQVBfU0VUUENBUCIsCiAgICAgICJDQVBfTkVUX0JJTkRfU0VSVklDRSIsCiAgICAgICJDQVBfU1lTX0NIUk9PVCIsCiAgICAgICJDQVBfS0lMTCIsCiAgICAgICJDQVBfQVVESVRfV1JJVEUiCiAgICBdLAogICAgInByaXZpbGVnZWRfY2FwcyI6IFsKICAgICAgIkNBUF9DSE9XTiIsCiAgICAgICJDQVBfREFDX09WRVJSSURFIiwKICAgICAgIkNBUF9EQUNfUkVBRF9TRUFSQ0giLAogICAgICAiQ0FQX0ZPV05FUiIsCiAgICAgICJDQVBfRlNFVElEIiwKICAgICAgIkNBUF9LSUxMIiwKICAgICAgIkNBUF9TRVRHSUQiLAogICAgICAiQ0FQX1NFVFVJRCIsCiAgICAgICJDQVBfU0VUUENBUCIsCiAgICAgICJDQVBfTElOVVhfSU1NVVRBQkxFIiwKICAgICAgIkNBUF9ORVRfQklORF9TRVJWSUNFIiwKICAgICAgIkNBUF9ORVRfQlJPQURDQVNUIiwKICAgICAgIkNBUF9ORVRfQURNSU4iLAogICAgICAiQ0FQX05FVF9SQVciLAogICAgICAiQ0FQX0lQQ19MT0NLIiwKICAgICAgIkNBUF9JUENfT1dORVIiLAogICAgICAiQ0FQX1NZU19NT0RVTEUiLAogICAgICAiQ0FQX1NZU19SQVdJTyIsCiAgICAgICJDQVBfU1lTX0NIUk9PVCIsCiAgICAgICJDQVBfU1lTX1BUUkFDRSIsCiAgICAgICJDQVBfU1lTX1BBQ0NUIiwKICAgICAgIkNBUF9TWVNfQURNSU4iLAogICAgICAiQ0FQX1NZU19CT09UIiwKICAgICAgIkNBUF9TWVNfTklDRSIsCiAgICAgICJDQVBfU1lTX1JFU09VUkNFIiwKICAgICAgIkNBUF9TWVNfVElNRSIsCiAgICAgICJDQVBfU1lTX1RUWV9DT05GSUciLAogICAgICAiQ0FQX01LTk9EIiwKICAgICAgIkNBUF9MRUFTRSIsCiAgICAgICJDQVBfQVVESVRfV1JJVEUiLAogICAgICAiQ0FQX0FVRElUX0NPTlRST0wiLAogICAgICAiQ0FQX1NFVEZDQVAiLAogICAgICAiQ0FQX01BQ19PVkVSUklERSIsCiAgICAgICJDQVBfTUFDX0FETUlOIiwKICAgICAgIkNBUF9TWVNMT0ciLAogICAgICAiQ0FQX1dBS0VfQUxBUk0iLAogICAgICAiQ0FQX0JMT0NLX1NVU1BFTkQiLAogICAgICAiQ0FQX0FVRElUX1JFQUQiLAogICAgICAiQ0FQX1BFUkZNT04iLAogICAgICAiQ0FQX0JQRiIsCiAgICAgICJDQVBfQ0hFQ0tQT0lOVF9SRVNUT1JFIgogICAgXSwKICAgICJ2aXJ0aW9fYmxrX3N0b3JhZ2VfY2xhc3NlcyI6IFsKICAgICAgImNjLWxvY2FsLWNzaSIsCiAgICAgICJjYy1tYW5hZ2VkLWNzaSIsCiAgICAgICJjYy1tYW5hZ2VkLXByZW1pdW0tY3NpIgogICAgXSwKICAgICJzbWJfc3RvcmFnZV9jbGFzc2VzIjogWwogICAgICB7CiAgICAgICAgIm5hbWUiOiAiYXp1cmVmaWxlLWNzaS1rYXRhLWNjIiwKICAgICAgICAibW91bnRfb3B0aW9ucyI6IFsKICAgICAgICAgICJkaXJfbW9kZT0wNzc3IiwKICAgICAgICAgICJmaWxlX21vZGU9MDc3NyIsCiAgICAgICAgICAibWZzeW1saW5rcyIsCiAgICAgICAgICAiY2FjaGU9c3RyaWN0IiwKICAgICAgICAgICJub3NoYXJlc29jayIsCiAgICAgICAgICAiYWN0aW1lbz0zMCIsCiAgICAgICAgICAibm9icmwiCiAgICAgICAgXQogICAgICB9CiAgICBdCiAgfSwKICAic2FuZGJveCI6IHsKICAgICJzdG9yYWdlcyI6IFsKICAgICAgewogICAgICAgICJkcml2ZXIiOiAiZXBoZW1lcmFsIiwKICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAic291cmNlIjogInNobSIsCiAgICAgICAgImZzdHlwZSI6ICJ0bXBmcyIsCiAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgIm5vZGV2IiwKICAgICAgICAgICJtb2RlPTE3NzciLAogICAgICAgICAgInNpemU9NjcxMDg4NjQiCiAgICAgICAgXSwKICAgICAgICAibW91bnRfcG9pbnQiOiAiL3J1bi9rYXRhLWNvbnRhaW5lcnMvc2FuZGJveC9zaG0iLAogICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgfQogICAgXQogIH0sCiAgInJlcXVlc3RfZGVmYXVsdHMiOiB7CiAgICAiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdCI6IHsKICAgICAgImFsbG93X2Vudl9yZWdleCI6IFsKICAgICAgICAiXkhPU1ROQU1FPSQoZG5zX2xhYmVsKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfUE9SVF8kKGlwX3ApX1RDUD10Y3A6Ly8kKGlwdjRfYSk6JChpcF9wKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfUE9SVF8kKGlwX3ApX1RDUF9QUk9UTz10Y3AkIiwKICAgICAgICAiXiQoc3ZjX25hbWUpX1BPUlRfJChpcF9wKV9UQ1BfUE9SVD0kKGlwX3ApJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9QT1JUXyQoaXBfcClfVENQX0FERFI9JChpcHY0X2EpJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9TRVJWSUNFX0hPU1Q9JChpcHY0X2EpJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9TRVJWSUNFX1BPUlQ9JChpcF9wKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfU0VSVklDRV9QT1JUXyQoZG5zX2xhYmVsKT0kKGlwX3ApJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9QT1JUPXRjcDovLyQoaXB2NF9hKTokKGlwX3ApJCIsCiAgICAgICAgIl5BWlVSRV9DTElFTlRfSUQ9W0EtRmEtZjAtOS1dKiQiLAogICAgICAgICJeQVpVUkVfVEVOQU5UX0lEPVtBLUZhLWYwLTktXSokIiwKICAgICAgICAiXkFaVVJFX0ZFREVSQVRFRF9UT0tFTl9GSUxFPS92YXIvcnVuL3NlY3JldHMvYXp1cmUvdG9rZW5zL2F6dXJlLWlkZW50aXR5LXRva2VuJCIsCiAgICAgICAgIl5BWlVSRV9BVVRIT1JJVFlfSE9TVD1odHRwczovL2xvZ2luXFwubWljcm9zb2Z0b25saW5lXFwuY29tLyQiLAogICAgICAgICJeVEVSTT14dGVybSQiCiAgICAgIF0sCiAgICAgICJhbGxvd19lbnZfcmVnZXhfbWFwIjogewogICAgICAgICJDUFVfTElNSVQiOiAiXlswLTldKyQiLAogICAgICAgICJKT0JfQ09NUExFVElPTl9JTkRFWCI6ICJeWzAtOV0qJCIsCiAgICAgICAgIk1FTU9SWV9MSU1JVCI6ICJeWzAtOV0rJCIKICAgICAgfQogICAgfSwKICAgICJDb3B5RmlsZVJlcXVlc3QiOiBbCiAgICAgICIkKHNmcHJlZml4KSIKICAgIF0sCiAgICAiRXhlY1Byb2Nlc3NSZXF1ZXN0IjogewogICAgICAiYWxsb3dlZF9jb21tYW5kcyI6IFtdLAogICAgICAicmVnZXgiOiBbXQogICAgfSwKICAgICJVcGRhdGVSb3V0ZXNSZXF1ZXN0IjogewogICAgICAiZm9yYmlkZGVuX2RldmljZV9uYW1lcyI6IFsKICAgICAgICAibG8iCiAgICAgIF0sCiAgICAgICJmb3JiaWRkZW5fc291cmNlX3JlZ2V4IjogWwogICAgICAgICJeKD86MHswLDR9Oil7MCw3fTB7MCwzfTEkIiwKICAgICAgICAiXjEyN1xcLig/OlswLTldezEsM31cXC4pezJ9WzAtOV17MSwzfSQiCiAgICAgIF0KICAgIH0sCiAgICAiVXBkYXRlSW50ZXJmYWNlUmVxdWVzdCI6IHsKICAgICAgImFsbG93X3Jhd19mbGFncyI6IDEyOCwKICAgICAgImZvcmJpZGRlbl9uYW1lcyI6IFsKICAgICAgICAibG8iCiAgICAgIF0sCiAgICAgICJmb3JiaWRkZW5faHdfYWRkcnMiOiBbCiAgICAgICAgIjAwOjAwOjAwOjAwOjAwOjAwIgogICAgICBdCiAgICB9LAogICAgIkNsb3NlU3RkaW5SZXF1ZXN0IjogZmFsc2UsCiAgICAiUmVhZFN0cmVhbVJlcXVlc3QiOiBmYWxzZSwKICAgICJVcGRhdGVFcGhlbWVyYWxNb3VudHNSZXF1ZXN0IjogZmFsc2UsCiAgICAiV3JpdGVTdHJlYW1SZXF1ZXN0IjogZmFsc2UKICB9Cn0= + spec: + nodeSelector: + kubernetes.io/os: linux + runtimeClassName: kata-cc + containers: + - name: backend + image: "marinerconfpodstest.azurecr.io/hashicorp/http-echo:latest" + args: + - "-text=Hello from Backend" + - "-listen=:8080" + ports: + - containerPort: 8080 + restartPolicy: Always +--- +apiVersion: v1 +kind: Service +metadata: + name: backend +spec: + selector: + app: backend + ports: + - protocol: TCP + port: 8080 + targetPort: 8080 diff --git a/src/agent/samples/policy/yaml/deployment/deployment-busybox.yaml b/src/agent/samples/policy/yaml/deployment/deployment-busybox.yaml new file mode 100644 index 000000000000..475c0779a92c --- /dev/null +++ b/src/agent/samples/policy/yaml/deployment/deployment-busybox.yaml @@ -0,0 +1,24 @@ +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: busybox-deployment +spec: + replicas: 1 + selector: + matchLabels: + app: busybox-deployment + template: + metadata: + labels: + app: busybox-deployment + annotations: + io.katacontainers.config.agent.policy: IyBDb3B5cmlnaHQgKGMpIDIwMjMgTWljcm9zb2Z0IENvcnBvcmF0aW9uCiMKIyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMAojCnBhY2thZ2UgYWdlbnRfcG9saWN5CgppbXBvcnQgZnV0dXJlLmtleXdvcmRzLmluCmltcG9ydCBmdXR1cmUua2V5d29yZHMuZXZlcnkKCiMgRGVmYXVsdCB2YWx1ZXMsIHJldHVybmVkIGJ5IE9QQSB3aGVuIHJ1bGVzIGNhbm5vdCBiZSBldmFsdWF0ZWQgdG8gdHJ1ZS4KZGVmYXVsdCBBZGRBUlBOZWlnaGJvcnNSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgQWRkU3dhcFJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBDbG9zZVN0ZGluUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IENvcHlGaWxlUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IENyZWF0ZUNvbnRhaW5lclJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBDcmVhdGVTYW5kYm94UmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IERlc3Ryb3lTYW5kYm94UmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgRXhlY1Byb2Nlc3NSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgR2V0T09NRXZlbnRSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBHdWVzdERldGFpbHNSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBMaXN0SW50ZXJmYWNlc1JlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBMaXN0Um91dGVzUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IE1lbUhvdHBsdWdCeVByb2JlUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IE9ubGluZUNQVU1lbVJlcXVlc3QgOj0gdHJ1ZQpkZWZhdWx0IFBhdXNlQ29udGFpbmVyUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFJlYWRTdHJlYW1SZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgUmVtb3ZlQ29udGFpbmVyUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgUmVtb3ZlU3RhbGVWaXJ0aW9mc1NoYXJlTW91bnRzUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgUmVzZWVkUmFuZG9tRGV2UmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFJlc3VtZUNvbnRhaW5lclJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBTZXRHdWVzdERhdGVUaW1lUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFNldFBvbGljeVJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBTaWduYWxQcm9jZXNzUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgU3RhcnRDb250YWluZXJSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBTdGFydFRyYWNpbmdSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgU3RhdHNDb250YWluZXJSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBTdG9wVHJhY2luZ1JlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBUdHlXaW5SZXNpemVSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBVcGRhdGVDb250YWluZXJSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgVXBkYXRlRXBoZW1lcmFsTW91bnRzUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFVwZGF0ZUludGVyZmFjZVJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBVcGRhdGVSb3V0ZXNSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgV2FpdFByb2Nlc3NSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBXcml0ZVN0cmVhbVJlcXVlc3QgOj0gZmFsc2UKCiMgQWxsb3dSZXF1ZXN0c0ZhaWxpbmdQb2xpY3kgOj0gdHJ1ZSBjb25maWd1cmVzIHRoZSBBZ2VudCB0byAqYWxsb3cgYW55CiMgcmVxdWVzdHMgY2F1c2luZyBhIHBvbGljeSBmYWlsdXJlKi4gVGhpcyBpcyBhbiB1bnNlY3VyZSBjb25maWd1cmF0aW9uCiMgYnV0IGlzIHVzZWZ1bCBmb3IgYWxsb3dpbmcgdW5zZWN1cmUgcG9kcyB0byBzdGFydCwgdGhlbiBjb25uZWN0IHRvCiMgdGhlbSBhbmQgaW5zcGVjdCBPUEEgbG9ncyBmb3IgdGhlIHJvb3QgY2F1c2Ugb2YgYSBmYWlsdXJlLgpkZWZhdWx0IEFsbG93UmVxdWVzdHNGYWlsaW5nUG9saWN5IDo9IGZhbHNlCgojIENvbnN0YW50cwpTX05BTUVfS0VZID0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZSIKU19OQU1FU1BBQ0VfS0VZID0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZXNwYWNlIgpCVU5ETEVfSUQgPSAiW2EtejAtOV17NjR9IgoKQ3JlYXRlQ29udGFpbmVyUmVxdWVzdDo9IHJlc3AgewogICAgbm90IGlzX251bGwoaW5wdXQuZW52X21hcCkKICAgIAogICAgaV9lbnZfbWFwIDo9IGlucHV0LmVudl9tYXAKICAgIAogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBwX2Vudl9tYXAgOj0gcF9jb250YWluZXIuZW52X21hcCAgCiAgICBhbGxvd19lbnZfbWFwKHBfZW52X21hcCwgaV9lbnZfbWFwKQogICAgCiAgICBpX3Byb2Nlc3MgOj0gaW5wdXQuYmFzZS5PQ0kuUHJvY2VzcwogICAgCiAgICBwX3Byb2Nlc3MgOj0gcF9jb250YWluZXIuT0NJLlByb2Nlc3MKICAgIAogICAgYWxsb3dfYXJncyhpX3Byb2Nlc3MsIHBfcHJvY2VzcywgaV9lbnZfbWFwKQoKICAgIHJlc3AgPSBDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uKGlucHV0LmJhc2UpCiAgICBwcmludCgiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdDogdHJ1ZSIpCn0KCmFsbG93X2FyZ3MoaV9wcm9jZXNzLCBwX3Byb2Nlc3MsIGlfZW52X21hcCkgewogICAgaV9hcmdzIDo9IGlfcHJvY2Vzcy5BcmdzCiAgICBwX2FyZ3MgOj0gcF9wcm9jZXNzLkFyZ3MKICAgIHByaW50KCJhbGxvd19hcmdzOiBpX2FyZ3MgPSIsIGlfYXJncywgInBfYXJncyA9IiwgcF9hcmdzKQogICAgY291bnQoaV9hcmdzKSA9PSBjb3VudChwX2FyZ3MpCiAgICBldmVyeSBpLCBpX2FyZyBpbiBpX2FyZ3MgewogICAgICAgIHByaW50KCJhbGxvd19hcmdzOiBpX2FyZyA9IiwgaV9hcmcpCiAgICAgICAgcF9hcmdfcmVwbGFjZWQgOj0gcmVwbGFjZV9lbnZfdmFyaWFibGVzKHBfYXJnc1tpXSwgaV9lbnZfbWFwKQogICAgICAgIHByaW50KCJhbGxvd19hcmdzOiBwX2FyZ19yZXBsYWNlZCA9IiwgcF9hcmdfcmVwbGFjZWQpCiAgICAgICAgcF9hcmdfcmVwbGFjZWQyIDo9IHJlcGxhY2UocF9hcmdfcmVwbGFjZWQsICIkJCIsICIkIikKICAgICAgICBwcmludCgiYWxsb3dfYXJnczogcF9hcmdfcmVwbGFjZWQyID0iLCBwX2FyZ19yZXBsYWNlZDIpCiAgICAgICAgaV9hcmcgPT0gcF9hcmdfcmVwbGFjZWQyCiAgICB9CiAgICBwcmludCgiYWxsb3dfYXJnczogdHJ1ZSIpCn0KCmFsbG93X2FyZ3MoaV9wcm9jZXNzLCBwX3Byb2Nlc3MsIGlfZW52X21hcCkgewogICAgbm90IGlfcHJvY2Vzcy5BcmdzCiAgICBub3QgcF9wcm9jZXNzLkFyZ3MKICAgIHByaW50KCJhbGxvd19hcmdzMjogbm8gYXJncyIpCn0KCiMgdGhpcyBmdW5jdGlvbiByZXBsYWNlcyBhbGwgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyBpbiBhIHN0cmluZywgZ2l2ZW4gYSBtYXAgb2YgZW52aXJvbm1lbnQga2V5cyB0byBlbnZpcm9ubWVudCB2YWx1ZXMKIyBlZyBzdHIgPSAiZWNobyAkKENMVVNURVJfSUQpOyBlY2hvICQoTk9ERV9OQU1FKTsiCiMgZW52X21hcCA9IHsiQ0xVU1RFUl9JRCI6ICJhYmMiLCAiTk9ERV9OQU1FIiA6ICJ4eXoifQojIHJlc3VsdCA9ICJlY2hvIGFiYzsgZWNobyB4eXo7IgpyZXBsYWNlX2Vudl92YXJpYWJsZXMoc3RyLCBlbnZfbWFwKSA9IHJlc3VsdCB7CiAgICAjIG1ha2UgYW4gYXJyYXkgb2YgdGhlIGtleXMgZWcgWyJDTFVTVEVSX0lEIiwgIk5PREVfTkFNRSJdCiAgICBrZXlzIDo9IFt4IHwgc29tZSB4IGluIG9iamVjdC5rZXlzKGVudl9tYXApXQogICAgcmVzdWx0IDo9IHJlcGxhY2Vfc3RyX3JlYyhzdHIsIGVudl9tYXAsIGtleXMsIGNvdW50KGtleXMpIC0gMSkKfQoKIyBiYXNlIGNhc2UKcmVwbGFjZV9zdHJfcmVjKHN0ciwgZW52X21hcCwgYXJyX2tleXMsIGkpID0gcmVzdWx0IHsKICAgIGkgPCAwCiAgICByZXN1bHQgOj0gc3RyCn0KCiMgcmVjdXJzaXZlIHN0ZXAKcmVwbGFjZV9zdHJfcmVjKHN0ciwgZW52X21hcCwgYXJyX2tleXMsIGkpID0gcmVzdWx0IHsKICAgIGkgPj0gMAogICAga2V5IDo9IGFycl9rZXlzW2ldCiAgICBlbnZfa2V5MSA6PSBjb25jYXQoIiIsIFsiJCgiLCBrZXksICIpIl0pCiAgICAjIHJlcGxhY2UgJChWQVIpIHdpdGggdmFsdWUKICAgIG5ld19zdHIxIDo9IHJlcGxhY2Uoc3RyLCBlbnZfa2V5MSwgZW52X21hcFtrZXldKQogICAgIyByZXBsYWNlIG5leHQgZW52aXJvbm1lbnQgdmFyaWFibGUKICAgIHJlc3VsdCA9IHJlcGxhY2Vfc3RyX3JlYyhuZXdfc3RyMSwgZW52X21hcCwgYXJyX2tleXMsIGkgLSAxKQp9CgphbGxvd19lbnZfbWFwKHBfZW52X21hcCwgaV9lbnZfbWFwKSB7CiAgICBwcmludCgiYWxsb3dfZW52X21hcDogcF9lbnZfbWFwID0iLCBwX2Vudl9tYXApCiAgICBldmVyeSBlbnZfa2V5LCBlbnZfdmFsIGluIGlfZW52X21hcCB7CiAgICAgICAgcHJpbnQoImFsbG93X2VudjogZW52X2tleSA9IiwgZW52X2tleSwgImVudl92YWwgPSIsIGVudl92YWwpCiAgICAgICAgYWxsb3dfZW52X21hcF9lbnRyeShlbnZfa2V5LCBlbnZfdmFsLCBwX2Vudl9tYXApCiAgICB9CiAgICBwcmludCgiYWxsb3dfZW52X21hcDogdHJ1ZSIpCn0KCiMgQWxsb3cgZXhhY3QgbWF0Y2gKYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBpX3ZhbCA9PSBwX3ZhbAogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnk6IHRydWUiKQp9CgojIEFsbG93IHJlc291cmNlRmllbGRSZWYgdmFsdWVzIChlLmcuLCAibGltaXRzLmNwdSIpLgphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgICMgYSB2YXJpYWJsZSB3ZSBzaG91bGQgYmUgdmFsaWRhdGluZyB1c2luZyBhIHJlZ2V4IGZyb20gc2V0dGluZ3MKICAgIHBfdmFsID09ICIkKHZhbGlkYXRlLWZyb20tc2V0dGluZ3MpIgogICAgcmVnZXhfdmFsIDo9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuQ3JlYXRlQ29udGFpbmVyUmVxdWVzdC5hbGxvd19lbnZfcmVnZXhfbWFwW2tleV0KICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4X3ZhbCwgaV92YWwpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSAyOiB0cnVlIikKfQoKIyBBbGxvdyBub2RlLW5hbWUKYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChub2RlLW5hbWUpIgogICAgcmVnZXgubWF0Y2gocG9saWN5X2RhdGEuY29tbW9uLmRuc19zdWJkb21haW4gLCBpX3ZhbCkKICAgIHByaW50KCJhbGxvd19lbnZfbWFwX2VudHJ5IDM6IHRydWUiKQp9CgojIEFsbG93IGhvc3QtbmFtZQphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgIHBfdmFsID09ICIkKGhvc3QtbmFtZSkiCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24uZG5zX2xhYmVsICwgaV92YWwpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSA0OiB0cnVlIikKfQoKIyBBbGxvdyBwb2QtdWlkCmFsbG93X2Vudl9tYXBfZW50cnkoa2V5LCBpX3ZhbCwgcF9lbnZfbWFwKSB7CiAgICBwX3ZhbCA6PSBwX2Vudl9tYXBba2V5XQogICAgcF92YWwgPT0gIiQocG9kLXVpZCkiCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24ucG9kX3VpZCAsIGlfdmFsKQogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgNTogdHJ1ZSIpCn0KCiMgQWxsb3cgZmllbGRSZWYgImZpZWxkUGF0aDogc3RhdHVzLnBvZElQIiB2YWx1ZXMuCmFsbG93X2Vudl9tYXBfZW50cnkoa2V5LCBpX3ZhbCwgcF9lbnZfbWFwKSB7CiAgICBpc19pcChpX3ZhbCkKCiAgICBwX3ZhbCA6PSBwX2Vudl9tYXBba2V5XQogICAgcF92YXIgOj0gY29uY2F0KCI9IiwgW2tleSwgcF92YWxdKQogICAgYWxsb3dfcG9kX2lwX3ZhcihrZXksIHBfdmFyKQogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgNjogdHJ1ZSIpCn0KCiMgQWxsb3cgZmllbGRSZWYgImZpZWxkUGF0aDogc3RhdHVzLmhvc3RJUCIgdmFsdWVzLgphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgaXNfaXAoaV92YWwpCgogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgIHBfdmFyIDo9IGNvbmNhdCgiPSIsIFtrZXksIHBfdmFsXSkKICAgIGFsbG93X2hvc3RfaXBfdmFyKGtleSwgcF92YXIpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSA3OiB0cnVlIikKfQoKIyBNYXRjaCBpbnB1dCB3aXRoIG9uZSBvZiB0aGUgcG9saWN5IHZhcmlhYmxlcywgYWZ0ZXIgc3Vic3RpdHV0aW5nICQoc2FuZGJveC1uYW1lKS4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChzYW5kYm94LW5hbWUpIgogICAgc19uYW1lIDo9IGlucHV0LmJhc2UuT0NJLkFubm90YXRpb25zW1NfTkFNRV9LRVldCiAgICBwX3ZhcjIgOj0gcmVwbGFjZShwX3ZhbCwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHBfdmFyMiA9PSBpX3ZhbAogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgODogdHJ1ZSIpCn0KCiMgTWF0Y2ggaW5wdXQgd2l0aCBvbmUgb2YgdGhlIHBvbGljeSB2YXJpYWJsZXMsIGFmdGVyIHN1YnN0aXR1dGluZyAkKHNhbmRib3gtbmFtZXNwYWNlKS4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChzYW5kYm94LW5hbWVzcGFjZSkiCiAgICBzX25hbWVzcGFjZSA6PSBpbnB1dC5iYXNlLk9DSS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwX3ZhcjIgOj0gcmVwbGFjZShwX3ZhbCwgIiQoc2FuZGJveC1uYW1lc3BhY2UpIiwgc19uYW1lc3BhY2UpCiAgICBwX3ZhcjIgPT0gaV92YWwKICAgIHByaW50KCJhbGxvd19lbnZfbWFwX2VudHJ5IDk6IHRydWUiKQp9CgojIEFsbG93IGlucHV0IGVudiB2YXJpYWJsZXMgdGhhdCBtYXRjaCB3aXRoIGEgcmVxdWVzdF9kZWZhdWx0cyByZWdleC4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHNvbWUgcF9yZWdleDEgaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5DcmVhdGVDb250YWluZXJSZXF1ZXN0LmFsbG93X2Vudl9yZWdleAogICAgcF9yZWdleDIgOj0gcmVwbGFjZShwX3JlZ2V4MSwgIiQoaXB2NF9hKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcHY0X2EpCiAgICBwX3JlZ2V4MyA6PSByZXBsYWNlKHBfcmVnZXgyLCAiJChpcF9wKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcF9wKQogICAgcF9yZWdleDQgOj0gcmVwbGFjZShwX3JlZ2V4MywgIiQoc3ZjX25hbWUpIiwgcG9saWN5X2RhdGEuY29tbW9uLnN2Y19uYW1lKQogICAgcF9yZWdleDUgOj0gcmVwbGFjZShwX3JlZ2V4NCwgIiQoZG5zX2xhYmVsKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5kbnNfbGFiZWwpCgogICAgcmVzdWx0IDo9IGNvbmNhdCgiPSIsIFtrZXksIGlfdmFsXSkKICAgIHJlZ2V4Lm1hdGNoKHBfcmVnZXg1LCByZXN1bHQpCgogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgMTA6IHRydWUiKQp9CgpDcmVhdGVDb250YWluZXJSZXF1ZXN0Oj0gcmVzcCB7CiAgICBub3QgaW5wdXQuZW52X21hcAogICAgaV9wcm9jZXNzID0gaW5wdXQuT0NJLlByb2Nlc3MKICAgIHNfbmFtZSA9IGlucHV0Lk9DSS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBwX3Byb2Nlc3MgPSBwX2NvbnRhaW5lci5PQ0kuUHJvY2VzcwogICAgYWxsb3dfZGVwcmVjYXRlZF9hcmdzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUpCiAgICByZXNwID0gQ3JlYXRlQ29udGFpbmVyUmVxdWVzdENvbW1vbihpbnB1dCkKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0MjogdHJ1ZSIpCn0KCkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb24ocmVxKTo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgICMgQ2hlY2sgaWYgdGhlIGlucHV0IHJlcXVlc3Qgc2hvdWxkIGJlIHJlamVjdGVkIGV2ZW4gYmVmb3JlIGNoZWNraW5nIHRoZQogICAgIyBwb2xpY3lfZGF0YS5jb250YWluZXJzIGluZm9ybWF0aW9uLgogICAgYWxsb3dfY3JlYXRlX2NvbnRhaW5lcl9pbnB1dChyZXEpCgogICAgaV9vY2kgOj0gcmVxLk9DSQogICAgaV9zdG9yYWdlcyA6PSByZXEuc3RvcmFnZXMKICAgIGlfZGV2aWNlcyA6PSByZXEuZGV2aWNlcwoKICAgICMgYXJyYXkgb2YgcG9zc2libGUgc3RhdGUgb3BlcmF0aW9ucwogICAgb3BzX2J1aWxkZXIgOj0gW10KCiAgICAjIGNoZWNrIHNhbmRib3ggbmFtZQogICAgc2FuZGJveF9uYW1lID0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FX0tFWV0KICAgIGFkZF9zYW5kYm94X25hbWVfdG9fc3RhdGUgOj0gc3RhdGVfYWxsb3dzKCJzYW5kYm94X25hbWUiLCBzYW5kYm94X25hbWUpCiAgICBvcHNfYnVpbGRlcjEgOj0gY29uY2F0X29wX2lmX25vdF9udWxsKG9wc19idWlsZGVyLCBhZGRfc2FuZGJveF9uYW1lX3RvX3N0YXRlKQoKICAgICMgQ2hlY2sgaWYgYW55IGVsZW1lbnQgZnJvbSB0aGUgcG9saWN5X2RhdGEuY29udGFpbmVycyBhcnJheSBhbGxvd3MgdGhlIGlucHV0IHJlcXVlc3QuCiAgICBzb21lIHBfY29udGFpbmVyIGluIHBvbGljeV9kYXRhLmNvbnRhaW5lcnMKICAgIHByaW50KCI9PT09PT09PSBDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiB0cnlpbmcgbmV4dCBwb2xpY3kgY29udGFpbmVyIikKCiAgICBwX3BpZG5zIDo9IHBfY29udGFpbmVyLnNhbmRib3hfcGlkbnMKICAgIGlfcGlkbnMgOj0gcmVxLnNhbmRib3hfcGlkbnMKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiBwX3BpZG5zID0iLCBwX3BpZG5zLCAiaV9waWRucyA9IiwgaV9waWRucykKICAgIHBfcGlkbnMgPT0gaV9waWRucwoKICAgIHBfb2NpIDo9IHBfY29udGFpbmVyLk9DSQoKICAgICMgY2hlY2sgbmFtZXNwYWNlCiAgICBwX25hbWVzcGFjZSA6PSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBpX25hbWVzcGFjZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwcmludCAoIkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb246IHBfbmFtZXNwYWNlID0iLCBwX25hbWVzcGFjZSwgImlfbmFtZXNwYWNlID0iLCBpX25hbWVzcGFjZSkKICAgIGFkZF9uYW1lc3BhY2VfdG9fc3RhdGUgOj0gYWxsb3dfbmFtZXNwYWNlKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkKICAgIG9wc19idWlsZGVyMiA6PSBjb25jYXRfb3BfaWZfbm90X251bGwob3BzX2J1aWxkZXIxLCBhZGRfbmFtZXNwYWNlX3RvX3N0YXRlKQoKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiBwIFZlcnNpb24gPSIsIHBfb2NpLlZlcnNpb24sICJpIFZlcnNpb24gPSIsIGlfb2NpLlZlcnNpb24pCiAgICBwX29jaS5WZXJzaW9uID09IGlfb2NpLlZlcnNpb24KCiAgICBwcmludCgiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdENvbW1vbjogcCBSZWFkb25seSA9IiwgcF9vY2kuUm9vdC5SZWFkb25seSwgImkgUmVhZG9ubHkgPSIsIGlfb2NpLlJvb3QuUmVhZG9ubHkpCiAgICBwX29jaS5Sb290LlJlYWRvbmx5ID09IGlfb2NpLlJvb3QuUmVhZG9ubHkKCiAgICBhbGxvd19hbm5vKHBfb2NpLCBpX29jaSkKCiAgICBwX3N0b3JhZ2VzIDo9IHBfY29udGFpbmVyLnN0b3JhZ2VzCiAgICBhbGxvd19ieV9hbm5vKHBfb2NpLCBpX29jaSwgcF9zdG9yYWdlcywgaV9zdG9yYWdlcykKCiAgICBwX2RldmljZXMgOj0gcF9jb250YWluZXIuZGV2aWNlcwogICAgYWxsb3dfZGV2aWNlcyhwX2RldmljZXMsIGlfZGV2aWNlcykKCiAgICByZXQgOj0gYWxsb3dfbGludXgob3BzX2J1aWxkZXIyLCBwX29jaSwgaV9vY2kpCiAgICByZXQuYWxsb3dlZAoKICAgIG9wcyA6PSByZXQub3BzCgogICAgcHJpbnQoIkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb246IHRydWUiKQp9CgphbGxvd19jcmVhdGVfY29udGFpbmVyX2lucHV0KHJlcSkgewogICAgcHJpbnQoImFsbG93X2NyZWF0ZV9jb250YWluZXJfaW5wdXQ6IGlucHV0ID0iLCByZXEpCgogICAgY291bnQocmVxLnNoYXJlZF9tb3VudHMpID09IDAKICAgIGlzX251bGwocmVxLnN0cmluZ191c2VyKQoKICAgIGlfb2NpIDo9IHJlcS5PQ0kKICAgIGlzX251bGwoaV9vY2kuSG9va3MpCiAgICBpc19udWxsKGlfb2NpLlNvbGFyaXMpCiAgICBpc19udWxsKGlfb2NpLldpbmRvd3MpCgogICAgaV9saW51eCA6PSBpX29jaS5MaW51eAogICAgY291bnQoaV9saW51eC5HSURNYXBwaW5ncykgPT0gMAogICAgY291bnQoaV9saW51eC5Nb3VudExhYmVsKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlJlc291cmNlcy5EZXZpY2VzKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlJvb3Rmc1Byb3BhZ2F0aW9uKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlVJRE1hcHBpbmdzKSA9PSAwCiAgICBpc19udWxsKGlfbGludXguSW50ZWxSZHQpCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLkJsb2NrSU8pCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLk5ldHdvcmspCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLlBpZHMpCiAgICBpc19udWxsKGlfbGludXguU2VjY29tcCkKCiAgICBpX3Byb2Nlc3MgOj0gaV9vY2kuUHJvY2VzcwogICAgY291bnQoaV9wcm9jZXNzLlNlbGludXhMYWJlbCkgPT0gMAogICAgY291bnQoaV9wcm9jZXNzLlVzZXIuVXNlcm5hbWUpID09IDAKCiAgICBwcmludCgiYWxsb3dfY3JlYXRlX2NvbnRhaW5lcl9pbnB1dDogdHJ1ZSIpCn0KCmFsbG93X25hbWVzcGFjZShwX25hbWVzcGFjZSwgaV9uYW1lc3BhY2UpID0gYWRkX25hbWVzcGFjZSB7CiAgICBwX25hbWVzcGFjZSA9PSBpX25hbWVzcGFjZQogICAgYWRkX25hbWVzcGFjZSA6PSBudWxsCiAgICBwcmludCgiYWxsb3dfbmFtZXNwYWNlIDE6IGlucHV0IG5hbWVzcGFjZSBtYXRjaGVzIHBvbGljeSBkYXRhIikKfQoKYWxsb3dfbmFtZXNwYWNlKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkgPSBhZGRfbmFtZXNwYWNlIHsKICAgIHBfbmFtZXNwYWNlID09ICIiCiAgICBwcmludCgiYWxsb3dfbmFtZXNwYWNlIDI6IG5vIG5hbWVzcGFjZSBmb3VuZCBvbiBwb2xpY3kgZGF0YSIpCiAgICBhZGRfbmFtZXNwYWNlIDo9IHN0YXRlX2FsbG93cygibmFtZXNwYWNlIiwgaV9uYW1lc3BhY2UpCn0KCiMgdmFsdWUgaGFzbid0IGJlZW4gc2VlbiBiZWZvcmUsIHNhdmUgaXQgdG8gc3RhdGUKc3RhdGVfYWxsb3dzKGtleSwgdmFsdWUpID0gYWN0aW9uIHsKICBzdGF0ZSA6PSBnZXRfc3RhdGUoKQogIHByaW50KCJzdGF0ZV9hbGxvd3MgMTogc3RhdGVba2V5XSA9Iiwgc3RhdGVba2V5XSwgInZhbHVlID0iLCB2YWx1ZSkKICBub3Qgc3RhdGVba2V5XQogIHByaW50KCJzdGF0ZV9hbGxvd3MgMTogc2F2aW5nIHRvIHN0YXRlIGtleSA9Iiwga2V5LCAidmFsdWUgPSIsIHZhbHVlKQogIHBhdGggOj0gZ2V0X3N0YXRlX3BhdGgoa2V5KSAKICBhY3Rpb24gOj0gewogICAgIm9wIjogImFkZCIsCiAgICAicGF0aCI6IHBhdGgsIAogICAgInZhbHVlIjogdmFsdWUsCiAgfQp9CgojIHZhbHVlIG1hdGNoZXMgd2hhdCdzIGluIHN0YXRlLCBhbGxvdyBpdApzdGF0ZV9hbGxvd3Moa2V5LCB2YWx1ZSkgPSBhY3Rpb24gewogIHByaW50KCJzdGF0ZV9hbGxvd3MgMjogc3RhcnQiKQogIHN0YXRlIDo9IGdldF9zdGF0ZSgpCiAgcHJpbnQoInN0YXRlX2FsbG93cyAyOiBzdGF0ZVtrZXldID0iLCBzdGF0ZVtrZXldLCAidmFsdWUgPSIsIHZhbHVlKQogIHZhbHVlID09IHN0YXRlW2tleV0KICBwcmludCgic3RhdGVfYWxsb3dzIDI6IGZvdW5kIGtleSA9Iiwga2V5LCAidmFsdWUgPSIsIHZhbHVlLCAiIGluIHN0YXRlIikKICBhY3Rpb24gOj0gbnVsbAp9CgojIGhlbHBlciBmdW5jdGlvbnMgdG8gaW50ZXJhY3Qgd2l0aCB0aGUgc3RhdGUKZ2V0X3N0YXRlKCkgPSBzdGF0ZSB7CiAgc3RhdGUgOj0gZGF0YVsicHN0YXRlIl0KfQoKZ2V0X3N0YXRlX3ZhbChrZXkpID0gdmFsdWUgewogICAgc3RhdGUgOj0gZ2V0X3N0YXRlKCkKICAgIHZhbHVlIDo9IHN0YXRlW2tleV0KfQoKZ2V0X3N0YXRlX3BhdGgoa2V5KSA9IHBhdGggewogICAgIyBwcmVwZW5kICIvcHN0YXRlLyIgdG8ga2V5CiAgICBwYXRoIDo9IGNvbmNhdCgiLyIsIFsiL3BzdGF0ZSIsIGtleV0pCn0KCiMgSGVscGVyIGZ1bmN0aW9ucyB0byBjb25kaXRpb25hbGx5IGNvbmNhdGVuYXRlIG9wIGlzIG5vdCBudWxsCmNvbmNhdF9vcF9pZl9ub3RfbnVsbChvcHMsIG9wKSA9IHJlc3VsdCB7CiAgICBvcCA9PSBudWxsCiAgICByZXN1bHQgOj0gb3BzCn0KCmNvbmNhdF9vcF9pZl9ub3RfbnVsbChvcHMsIG9wKSA9IHJlc3VsdCB7CiAgICBvcCAhPSBudWxsCiAgICByZXN1bHQgOj0gYXJyYXkuY29uY2F0KG9wcywgW29wXSkKfQoKIyBSZWplY3QgdW5leHBlY3RlZCBhbm5vdGF0aW9ucy4KYWxsb3dfYW5ubyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19hbm5vIDE6IHN0YXJ0IikKCiAgICBub3QgaV9vY2kuQW5ub3RhdGlvbnMKCiAgICBwcmludCgiYWxsb3dfYW5ubyAxOiB0cnVlIikKfQphbGxvd19hbm5vKHBfb2NpLCBpX29jaSkgewogICAgcHJpbnQoImFsbG93X2Fubm8gMjogcCBBbm5vdGF0aW9ucyA9IiwgcF9vY2kuQW5ub3RhdGlvbnMpCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiBpIEFubm90YXRpb25zID0iLCBpX29jaS5Bbm5vdGF0aW9ucykKCiAgICBpX2tleXMgOj0gb2JqZWN0LmtleXMoaV9vY2kuQW5ub3RhdGlvbnMpCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiBpIGtleXMgPSIsIGlfa2V5cykKCiAgICBldmVyeSBpX2tleSBpbiBpX2tleXMgewogICAgICAgIGFsbG93X2Fubm9fa2V5KGlfa2V5LCBwX29jaSkKICAgIH0KCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiB0cnVlIikKfQoKYWxsb3dfYW5ub19rZXkoaV9rZXksIHBfb2NpKSB7CiAgICBwcmludCgiYWxsb3dfYW5ub19rZXkgMTogaSBrZXkgPSIsIGlfa2V5KQoKICAgIHN0YXJ0c3dpdGgoaV9rZXksICJpby5rdWJlcm5ldGVzLmNyaS4iKQoKICAgIHByaW50KCJhbGxvd19hbm5vX2tleSAxOiB0cnVlIikKfQphbGxvd19hbm5vX2tleShpX2tleSwgcF9vY2kpIHsKICAgIHByaW50KCJhbGxvd19hbm5vX2tleSAyOiBpIGtleSA9IiwgaV9rZXkpCgogICAgc29tZSBwX2tleSwgXyBpbiBwX29jaS5Bbm5vdGF0aW9ucwogICAgcF9rZXkgPT0gaV9rZXkKCiAgICBwcmludCgiYWxsb3dfYW5ub19rZXkgMjogdHJ1ZSIpCn0KCiMgR2V0IHRoZSB2YWx1ZSBvZiB0aGUgU19OQU1FX0tFWSBhbm5vdGF0aW9uIGFuZAojIGNvcnJlbGF0ZSBpdCB3aXRoIG90aGVyIGFubm90YXRpb25zIGFuZCBwcm9jZXNzIGZpZWxkcy4KYWxsb3dfYnlfYW5ubyhwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpIHsKICAgIHByaW50KCJhbGxvd19ieV9hbm5vIDE6IHN0YXJ0IikKCiAgICBub3QgcF9vY2kuQW5ub3RhdGlvbnNbU19OQU1FX0tFWV0KCiAgICBpX3NfbmFtZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMTogaV9zX25hbWUgPSIsIGlfc19uYW1lKQoKICAgIGlfc19uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FU1BBQ0VfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMTogaV9zX25hbWVzcGFjZSA9IiwgaV9zX25hbWVzcGFjZSkKCiAgICBhbGxvd19ieV9zYW5kYm94X25hbWUocF9vY2ksIGlfb2NpLCBwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBpX3NfbmFtZSwgaV9zX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfYnlfYW5ubyAxOiB0cnVlIikKfQphbGxvd19ieV9hbm5vKHBfb2NpLCBpX29jaSwgcF9zdG9yYWdlcywgaV9zdG9yYWdlcykgewogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMjogc3RhcnQiKQoKICAgIHBfc19uYW1lIDo9IHBfb2NpLkFubm90YXRpb25zW1NfTkFNRV9LRVldCiAgICBpX3NfbmFtZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMjogaV9zX25hbWUgPSIsIGlfc19uYW1lLCAicF9zX25hbWUgPSIsIHBfc19uYW1lKQoKICAgIGFsbG93X3NhbmRib3hfbmFtZShwX3NfbmFtZSwgaV9zX25hbWUpCgogICAgaV9zX25hbWVzcGFjZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwcmludCgiYWxsb3dfYnlfYW5ubyAyOiBpX3NfbmFtZXNwYWNlID0iLCBpX3NfbmFtZXNwYWNlKQoKICAgIGFsbG93X2J5X3NhbmRib3hfbmFtZShwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMsIGlfc19uYW1lLCBpX3NfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd19ieV9hbm5vIDI6IHRydWUiKQp9CgphbGxvd19ieV9zYW5kYm94X25hbWUocF9vY2ksIGlfb2NpLCBwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfYnlfc2FuZGJveF9uYW1lOiBzdGFydCIpCgogICAgaV9uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FU1BBQ0VfS0VZXQoKICAgIGFsbG93X2J5X2NvbnRhaW5lcl90eXBlcyhwX29jaSwgaV9vY2ksIHNfbmFtZSwgaV9uYW1lc3BhY2UpCiAgICBhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZChwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpCiAgICBhbGxvd19wcm9jZXNzKHBfb2NpLlByb2Nlc3MsIGlfb2NpLlByb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpCgogICAgcHJpbnQoImFsbG93X2J5X3NhbmRib3hfbmFtZTogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfbmFtZShwX3NfbmFtZSwgaV9zX25hbWUpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X25hbWU6IHN0YXJ0IikKICAgIHJlZ2V4Lm1hdGNoKHBfc19uYW1lLCBpX3NfbmFtZSkKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9uYW1lOiB0cnVlIikKfQoKIyBDaGVjayB0aGF0IHRoZSAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLXR5cGUiIGFuZAojICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIiBhbm5vdGF0aW9ucyBkZXNpZ25hdGUgdGhlCiMgZXhwZWN0ZWQgdHlwZSAtIGVpdGhlciBhICJzYW5kYm94IiBvciBhICJjb250YWluZXIiLiBUaGVuLCB2YWxpZGF0ZQojIG90aGVyIGFubm90YXRpb25zIGJhc2VkIG9uIHRoZSBhY3R1YWwgInNhbmRib3giIG9yICJjb250YWluZXIiIHZhbHVlCiMgZnJvbSB0aGUgaW5wdXQgY29udGFpbmVyLgphbGxvd19ieV9jb250YWluZXJfdHlwZXMocF9vY2ksIGlfb2NpLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfYnlfY29udGFpbmVyX3R5cGVzOiBjaGVja2luZyBpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSIpCgogICAgY190eXBlIDo9ICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSIKICAgIAogICAgcF9jcmlfdHlwZSA6PSBwX29jaS5Bbm5vdGF0aW9uc1tjX3R5cGVdCiAgICBpX2NyaV90eXBlIDo9IGlfb2NpLkFubm90YXRpb25zW2NfdHlwZV0KICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZXM6IHBfY3JpX3R5cGUgPSIsIHBfY3JpX3R5cGUsICJpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgcF9jcmlfdHlwZSA9PSBpX2NyaV90eXBlCgogICAgYWxsb3dfYnlfY29udGFpbmVyX3R5cGUoaV9jcmlfdHlwZSwgcF9vY2ksIGlfb2NpLCBzX25hbWUsIHNfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZXM6IHRydWUiKQp9CgphbGxvd19ieV9jb250YWluZXJfdHlwZShpX2NyaV90eXBlLCBwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAxOiBpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgaV9jcmlfdHlwZSA9PSAic2FuZGJveCIKCiAgICBpX2thdGFfdHlwZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1siaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5jb250YWluZXJfdHlwZSJdCiAgICBwcmludCgiYWxsb3dfYnlfY29udGFpbmVyX3R5cGUgMTogaV9rYXRhX3R5cGUgPSIsIGlfa2F0YV90eXBlKQogICAgaV9rYXRhX3R5cGUgPT0gInBvZF9zYW5kYm94IgoKICAgIGFsbG93X3NhbmRib3hfY29udGFpbmVyX25hbWUocF9vY2ksIGlfb2NpKQogICAgYWxsb3dfc2FuZGJveF9uZXRfbmFtZXNwYWNlKHBfb2NpLCBpX29jaSkKICAgIGFsbG93X3NhbmRib3hfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpCgogICAgcHJpbnQoImFsbG93X2J5X2NvbnRhaW5lcl90eXBlIDE6IHRydWUiKQp9CgphbGxvd19ieV9jb250YWluZXJfdHlwZShpX2NyaV90eXBlLCBwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiBpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgaV9jcmlfdHlwZSA9PSAiY29udGFpbmVyIgoKICAgIGlfa2F0YV90eXBlIDo9IGlfb2NpLkFubm90YXRpb25zWyJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIl0KICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiBpX2thdGFfdHlwZSA9IiwgaV9rYXRhX3R5cGUpCiAgICBpX2thdGFfdHlwZSA9PSAicG9kX2NvbnRhaW5lciIKCiAgICBhbGxvd19jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpCiAgICBhbGxvd19uZXRfbmFtZXNwYWNlKHBfb2NpLCBpX29jaSkKICAgIGFsbG93X2xvZ19kaXJlY3RvcnkocF9vY2ksIGlfb2NpKQoKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiB0cnVlIikKfQoKIyAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLW5hbWUiIGFubm90YXRpb24KYWxsb3dfc2FuZGJveF9jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X2NvbnRhaW5lcl9uYW1lOiBzdGFydCIpCgogICAgY29udGFpbmVyX2Fubm90YXRpb25fbWlzc2luZyhwX29jaSwgaV9vY2ksICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItbmFtZSIpCgogICAgcHJpbnQoImFsbG93X3NhbmRib3hfY29udGFpbmVyX25hbWU6IHRydWUiKQp9CgphbGxvd19jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19jb250YWluZXJfbmFtZTogc3RhcnQiKQoKICAgIGFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uKHBfb2NpLCBpX29jaSwgImlvLmt1YmVybmV0ZXMuY3JpLmNvbnRhaW5lci1uYW1lIikKCiAgICBwcmludCgiYWxsb3dfY29udGFpbmVyX25hbWU6IHRydWUiKQp9Cgpjb250YWluZXJfYW5ub3RhdGlvbl9taXNzaW5nKHBfb2NpLCBpX29jaSwga2V5KSB7CiAgICBwcmludCgiY29udGFpbmVyX2Fubm90YXRpb25fbWlzc2luZzoiLCBrZXkpCgogICAgbm90IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIG5vdCBpX29jaS5Bbm5vdGF0aW9uc1trZXldCgogICAgcHJpbnQoImNvbnRhaW5lcl9hbm5vdGF0aW9uX21pc3Npbmc6IHRydWUiKQp9CgphbGxvd19jb250YWluZXJfYW5ub3RhdGlvbihwX29jaSwgaV9vY2ksIGtleSkgewogICAgcHJpbnQoImFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uOiBrZXkgPSIsIGtleSkKCiAgICBwX3ZhbHVlIDo9IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIGlfdmFsdWUgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgcHJpbnQoImFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uOiBwX3ZhbHVlID0iLCBwX3ZhbHVlLCAiaV92YWx1ZSA9IiwgaV92YWx1ZSkKCiAgICBwX3ZhbHVlID09IGlfdmFsdWUKCiAgICBwcmludCgiYWxsb3dfY29udGFpbmVyX2Fubm90YXRpb246IHRydWUiKQp9CgojICJuZXJkY3RsL25ldHdvcmstbmFtZXNwYWNlIiBhbm5vdGF0aW9uCmFsbG93X3NhbmRib3hfbmV0X25hbWVzcGFjZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X25ldF9uYW1lc3BhY2U6IHN0YXJ0IikKCiAgICBrZXkgOj0gIm5lcmRjdGwvbmV0d29yay1uYW1lc3BhY2UiCgogICAgcF9uYW1lc3BhY2UgOj0gcF9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgaV9uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgcHJpbnQoImFsbG93X3NhbmRib3hfbmV0X25hbWVzcGFjZTogcF9uYW1lc3BhY2UgPSIsIHBfbmFtZXNwYWNlLCAiaV9uYW1lc3BhY2UgPSIsIGlfbmFtZXNwYWNlKQoKICAgIHJlZ2V4Lm1hdGNoKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9uZXRfbmFtZXNwYWNlOiB0cnVlIikKfQoKYWxsb3dfbmV0X25hbWVzcGFjZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19uZXRfbmFtZXNwYWNlOiBzdGFydCIpCgogICAga2V5IDo9ICJuZXJkY3RsL25ldHdvcmstbmFtZXNwYWNlIgoKICAgIG5vdCBwX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICBub3QgaV9vY2kuQW5ub3RhdGlvbnNba2V5XQoKICAgIHByaW50KCJhbGxvd19uZXRfbmFtZXNwYWNlOiB0cnVlIikKfQoKIyAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1sb2ctZGlyZWN0b3J5IiBhbm5vdGF0aW9uCmFsbG93X3NhbmRib3hfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X2xvZ19kaXJlY3Rvcnk6IHN0YXJ0IikKCiAgICBrZXkgOj0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbG9nLWRpcmVjdG9yeSIKCiAgICBwX2RpciA6PSBwX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICByZWdleDEgOj0gcmVwbGFjZShwX2RpciwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHJlZ2V4MiA6PSByZXBsYWNlKHJlZ2V4MSwgIiQoc2FuZGJveC1uYW1lc3BhY2UpIiwgc19uYW1lc3BhY2UpCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiByZWdleDIgPSIsIHJlZ2V4MikKCiAgICBpX2RpciA6PSBpX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiBpX2RpciA9IiwgaV9kaXIpCgogICAgcmVnZXgubWF0Y2gocmVnZXgyLCBpX2RpcikKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiB0cnVlIikKfQoKYWxsb3dfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19sb2dfZGlyZWN0b3J5OiBzdGFydCIpCgogICAga2V5IDo9ICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWxvZy1kaXJlY3RvcnkiCgogICAgbm90IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIG5vdCBpX29jaS5Bbm5vdGF0aW9uc1trZXldCgogICAgcHJpbnQoImFsbG93X2xvZ19kaXJlY3Rvcnk6IHRydWUiKQp9CgphbGxvd19kZXZpY2VzKHBfZGV2aWNlcywgaV9kZXZpY2VzKSB7CiAgICBwcmludCgiYWxsb3dfZGV2aWNlczogc3RhcnQiKQogICAgZXZlcnkgaV9kZXZpY2UgaW4gaV9kZXZpY2VzIHsKICAgICAgICBwcmludCgiYWxsb3dfZGV2aWNlczogaV9kZXZpY2UgPSIsIGlfZGV2aWNlKQogICAgICAgIHNvbWUgcF9kZXZpY2UgaW4gcF9kZXZpY2VzCiAgICAgICAgcF9kZXZpY2UuY29udGFpbmVyX3BhdGggPT0gaV9kZXZpY2UuY29udGFpbmVyX3BhdGgKICAgIH0KICAgIHByaW50KCJhbGxvd19kZXZpY2VzOiB0cnVlIikKfQoKYWxsb3dfbGludXgoc3RhdGVfb3BzLCBwX29jaSwgaV9vY2kpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIHBfbmFtZXNwYWNlcyA6PSBwX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbGludXg6IHAgbmFtZXNwYWNlcyA9IiwgcF9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlcyA6PSBpX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbGludXg6IGkgbmFtZXNwYWNlcyA9IiwgaV9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlX3dpdGhvdXRfbmV0d29yayA6PSBbb2JqIHwgb2JqIDo9IGlfbmFtZXNwYWNlc1tfXTsgb2JqLlR5cGUgIT0gIm5ldHdvcmsiXQoKICAgIHByaW50KCJhbGxvd19saW51eDogaV9uYW1lc3BhY2Vfd2l0aG91dF9uZXR3b3JrID0iLCBpX25hbWVzcGFjZV93aXRob3V0X25ldHdvcmspCgogICAgcF9uYW1lc3BhY2VzID09IGlfbmFtZXNwYWNlX3dpdGhvdXRfbmV0d29yawoKICAgIGFsbG93X21hc2tlZF9wYXRocyhwX29jaSwgaV9vY2kpCiAgICBhbGxvd19yZWFkb25seV9wYXRocyhwX29jaSwgaV9vY2kpCiAgICBhbGxvd19saW51eF9kZXZpY2VzKHBfb2NpLkxpbnV4LkRldmljZXMsIGlfb2NpLkxpbnV4LkRldmljZXMpCiAgICBhbGxvd19saW51eF9zeXNjdGwocF9vY2kuTGludXgsIGlfb2NpLkxpbnV4KQogICAgcmV0IDo9IGFsbG93X25ldHdvcmtfbmFtZXNwYWNlX3N0YXJ0KHN0YXRlX29wcywgcF9vY2ksIGlfb2NpKQogICAgcmV0LmFsbG93ZWQKCiAgICBvcHMgOj0gcmV0Lm9wcwoKICAgIHByaW50KCJhbGxvd19saW51eDogdHJ1ZSIpCn0KCiMgUmV0cmlldmUgdGhlICJuZXR3b3JrIiBuYW1lc3BhY2UgZnJvbSB0aGUgaW5wdXQgZGF0YSBhbmQgcGFzcyBpdCBvbiBmb3IgdGhlCiMgbmV0d29yayBuYW1lc3BhY2UgcG9saWN5IGNoZWNrcy4KYWxsb3dfbmV0d29ya19uYW1lc3BhY2Vfc3RhcnQoc3RhdGVfb3BzLCBwX29jaSwgaV9vY2kpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIHByaW50KCJhbGxvd19uZXR3b3JrX25hbWVzcGFjZSBzdGFydDogc3RhcnQiKQoKICAgIHBfbmFtZXNwYWNlcyA6PSBwX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IHAgbmFtZXNwYWNlcyA9IiwgcF9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlcyA6PSBpX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IGkgbmFtZXNwYWNlcyA9IiwgaV9uYW1lc3BhY2VzKQoKICAgICMgUmV0dXJuIHBhdGggb2YgdGhlICJuZXR3b3JrIiBuYW1lc3BhY2UKICAgIG5ldHdvcmtfbnMgOj0gW29iaiB8IG9iaiA6PSBpX25hbWVzcGFjZXNbX107IG9iai5UeXBlID09ICJuZXR3b3JrIl0KCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IG5ldHdvcmtfbnMgPSIsIG5ldHdvcmtfbnMpCgogICAgcmV0IDo9IGFsbG93X25ldHdvcmtfbmFtZXNwYWNlKHN0YXRlX29wcywgbmV0d29ya19ucykKICAgIHJldC5hbGxvd2VkCgogICAgb3BzIDo9IHJldC5vcHMKfQoKIyBUaGlzIHJ1bGUgaXMgd2hlbiB0aGVyZSdzIG5vIG5ldHdvcmsgbmFtZXNwYWNlIGluIHRoZSBpbnB1dCBkYXRhLgphbGxvd19uZXR3b3JrX25hbWVzcGFjZShzdGF0ZV9vcHMsIG5ldHdvcmtfbnMpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIGNvdW50KG5ldHdvcmtfbnMpID09IDAKCiAgICBuZXR3b3JrX25zX3BhdGggPSAiIgoKICAgIGFkZF9uZXR3b3JrX25hbWVzcGFjZV90b19zdGF0ZSA6PSBzdGF0ZV9hbGxvd3MoIm5ldHdvcmtfbmFtZXNwYWNlIiwgbmV0d29ya19uc19wYXRoKQogICAgb3BzIDo9IGNvbmNhdF9vcF9pZl9ub3RfbnVsbChzdGF0ZV9vcHMsIGFkZF9uZXR3b3JrX25hbWVzcGFjZV90b19zdGF0ZSkKCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2UgMTogdHJ1ZSIpCn0KCiMgVGhpcyBydWxlIGlzIHdoZW4gdGhlcmUncyBleGFjdGx5IG9uZSBuZXR3b3JrIG5hbWVzcGFjZSBpbiB0aGUgaW5wdXQgZGF0YS4KYWxsb3dfbmV0d29ya19uYW1lc3BhY2Uoc3RhdGVfb3BzLCBuZXR3b3JrX25zKSA6PSB7Im9wcyI6IG9wcywgImFsbG93ZWQiOiB0cnVlfSB7CiAgICBjb3VudChuZXR3b3JrX25zKSA9PSAxCgogICAgYWRkX25ldHdvcmtfbmFtZXNwYWNlX3RvX3N0YXRlIDo9IHN0YXRlX2FsbG93cygibmV0d29ya19uYW1lc3BhY2UiLCBuZXR3b3JrX25zWzBdLlBhdGgpCiAgICBvcHMgOj0gY29uY2F0X29wX2lmX25vdF9udWxsKHN0YXRlX29wcywgYWRkX25ldHdvcmtfbmFtZXNwYWNlX3RvX3N0YXRlKQoKICAgIHByaW50KCJhbGxvd19uZXR3b3JrX25hbWVzcGFjZSAyOiB0cnVlIikKfQoKYWxsb3dfbWFza2VkX3BhdGhzKHBfb2NpLCBpX29jaSkgewogICAgcF9wYXRocyA6PSBwX29jaS5MaW51eC5NYXNrZWRQYXRocwogICAgcHJpbnQoImFsbG93X21hc2tlZF9wYXRocyAxOiBwX3BhdGhzID0iLCBwX3BhdGhzKQoKICAgIGlfcGF0aHMgOj0gaV9vY2kuTGludXguTWFza2VkUGF0aHMKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aHMgMTogaV9wYXRocyA9IiwgaV9wYXRocykKCiAgICBhbGxvd19tYXNrZWRfcGF0aHNfYXJyYXkocF9wYXRocywgaV9wYXRocykKCiAgICBwcmludCgiYWxsb3dfbWFza2VkX3BhdGhzIDE6IHRydWUiKQp9CmFsbG93X21hc2tlZF9wYXRocyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aHMgMjogc3RhcnQiKQoKICAgIG5vdCBwX29jaS5MaW51eC5NYXNrZWRQYXRocwogICAgbm90IGlfb2NpLkxpbnV4Lk1hc2tlZFBhdGhzCgogICAgcHJpbnQoImFsbG93X21hc2tlZF9wYXRocyAyOiB0cnVlIikKfQoKIyBBbGwgdGhlIHBvbGljeSBtYXNrZWQgcGF0aHMgbXVzdCBiZSBtYXNrZWQgaW4gdGhlIGlucHV0IGRhdGEgdG9vLgojIElucHV0IGlzIGFsbG93ZWQgdG8gaGF2ZSBtb3JlIG1hc2tlZCBwYXRocyB0aGFuIHRoZSBwb2xpY3kuCmFsbG93X21hc2tlZF9wYXRoc19hcnJheShwX2FycmF5LCBpX2FycmF5KSB7CiAgICBldmVyeSBwX2VsZW0gaW4gcF9hcnJheSB7CiAgICAgICAgYWxsb3dfbWFza2VkX3BhdGgocF9lbGVtLCBpX2FycmF5KQogICAgfQp9CgphbGxvd19tYXNrZWRfcGF0aChwX2VsZW0sIGlfYXJyYXkpIHsKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aDogcF9lbGVtID0iLCBwX2VsZW0pCgogICAgc29tZSBpX2VsZW0gaW4gaV9hcnJheQogICAgcF9lbGVtID09IGlfZWxlbQoKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aDogdHJ1ZSIpCn0KCmFsbG93X3JlYWRvbmx5X3BhdGhzKHBfb2NpLCBpX29jaSkgewogICAgcF9wYXRocyA6PSBwX29jaS5MaW51eC5SZWFkb25seVBhdGhzCiAgICBwcmludCgiYWxsb3dfcmVhZG9ubHlfcGF0aHMgMTogcF9wYXRocyA9IiwgcF9wYXRocykKCiAgICBpX3BhdGhzIDo9IGlfb2NpLkxpbnV4LlJlYWRvbmx5UGF0aHMKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAxOiBpX3BhdGhzID0iLCBpX3BhdGhzKQoKICAgIGFsbG93X3JlYWRvbmx5X3BhdGhzX2FycmF5KHBfcGF0aHMsIGlfcGF0aHMsIGlfb2NpLkxpbnV4Lk1hc2tlZFBhdGhzKQoKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAxOiB0cnVlIikKfQphbGxvd19yZWFkb25seV9wYXRocyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAyOiBzdGFydCIpCgogICAgbm90IHBfb2NpLkxpbnV4LlJlYWRvbmx5UGF0aHMKICAgIG5vdCBpX29jaS5MaW51eC5SZWFkb25seVBhdGhzCgogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGhzIDI6IHRydWUiKQp9CgojIEFsbCB0aGUgcG9saWN5IHJlYWRvbmx5IHBhdGhzIG11c3QgYmUgZWl0aGVyOgojIC0gUHJlc2VudCBpbiB0aGUgaW5wdXQgcmVhZG9ubHkgcGF0aHMsIG9yCiMgLSBQcmVzZW50IGluIHRoZSBpbnB1dCBtYXNrZWQgcGF0aHMuCiMgSW5wdXQgaXMgYWxsb3dlZCB0byBoYXZlIG1vcmUgcmVhZG9ubHkgcGF0aHMgdGhhbiB0aGUgcG9saWN5LgphbGxvd19yZWFkb25seV9wYXRoc19hcnJheShwX2FycmF5LCBpX2FycmF5LCBtYXNrZWRfcGF0aHMpIHsKICAgIGV2ZXJ5IHBfZWxlbSBpbiBwX2FycmF5IHsKICAgICAgICBhbGxvd19yZWFkb25seV9wYXRoKHBfZWxlbSwgaV9hcnJheSwgbWFza2VkX3BhdGhzKQogICAgfQp9CgphbGxvd19yZWFkb25seV9wYXRoKHBfZWxlbSwgaV9hcnJheSwgbWFza2VkX3BhdGhzKSB7CiAgICBwcmludCgiYWxsb3dfcmVhZG9ubHlfcGF0aCAxOiBwX2VsZW0gPSIsIHBfZWxlbSkKCiAgICBzb21lIGlfZWxlbSBpbiBpX2FycmF5CiAgICBwX2VsZW0gPT0gaV9lbGVtCgogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGggMTogdHJ1ZSIpCn0KYWxsb3dfcmVhZG9ubHlfcGF0aChwX2VsZW0sIGlfYXJyYXksIG1hc2tlZF9wYXRocykgewogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGggMjogcF9lbGVtID0iLCBwX2VsZW0pCgogICAgc29tZSBpX21hc2tlZCBpbiBtYXNrZWRfcGF0aHMKICAgIHBfZWxlbSA9PSBpX21hc2tlZAoKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRoIDI6IHRydWUiKQp9CgphbGxvd19saW51eF9kZXZpY2VzKHBfZGV2aWNlcywgaV9kZXZpY2VzKSB7CiAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogc3RhcnQiKQogICAgZXZlcnkgaV9kZXZpY2UgaW4gaV9kZXZpY2VzIHsKICAgICAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogaV9kZXZpY2UgPSIsIGlfZGV2aWNlKQogICAgICAgIHNvbWUgcF9kZXZpY2UgaW4gcF9kZXZpY2VzCiAgICAgICAgaV9kZXZpY2UuUGF0aCA9PSBwX2RldmljZS5QYXRoCiAgICB9CiAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogdHJ1ZSIpCn0KCmFsbG93X2xpbnV4X3N5c2N0bChwX2xpbnV4LCBpX2xpbnV4KSB7CiAgICBwcmludCgiYWxsb3dfbGludXhfc3lzY3RsIDE6IHN0YXJ0IikKICAgIG5vdCBpX2xpbnV4LlN5c2N0bAogICAgcHJpbnQoImFsbG93X2xpbnV4X3N5c2N0bCAxOiB0cnVlIikKfQoKYWxsb3dfbGludXhfc3lzY3RsKHBfbGludXgsIGlfbGludXgpIHsKICAgIHByaW50KCJhbGxvd19saW51eF9zeXNjdGwgMjogc3RhcnQiKQogICAgcF9zeXNjdGwgOj0gcF9saW51eC5TeXNjdGwKICAgIGlfc3lzY3RsIDo9IGlfbGludXguU3lzY3RsCiAgICBldmVyeSBpX25hbWUsIGlfdmFsIGluIGlfc3lzY3RsIHsKICAgICAgICBwcmludCgiYWxsb3dfbGludXhfc3lzY3RsIDI6IGlfbmFtZSA9IiwgaV9uYW1lLCAiaV92YWwgPSIsIGlfdmFsKQogICAgICAgIHBfc3lzY3RsW2lfbmFtZV0gPT0gaV92YWwKICAgIH0KICAgIHByaW50KCJhbGxvd19saW51eF9zeXNjdGwgMjogdHJ1ZSIpCn0KCiMgQ2hlY2sgdGhlIGNvbnNpc3RlbmN5IG9mIHRoZSBpbnB1dCAiaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5idW5kbGVfcGF0aCIKIyBhbmQgaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCIgdmFsdWVzIHdpdGggb3RoZXIgZmllbGRzLgphbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZChwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpIHsKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogc3RhcnQiKQoKICAgIGJ1bmRsZV9wYXRoIDo9IGlfb2NpLkFubm90YXRpb25zWyJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmJ1bmRsZV9wYXRoIl0KICAgIGJ1bmRsZV9pZCA6PSByZXBsYWNlKGJ1bmRsZV9wYXRoLCAiL3J1bi9jb250YWluZXJkL2lvLmNvbnRhaW5lcmQucnVudGltZS52Mi50YXNrL2s4cy5pby8iLCAiIikKCiAgICBidW5kbGVfaWRfZm9ybWF0IDo9IGNvbmNhdCgiIiwgWyJeIiwgQlVORExFX0lELCAiJCJdKQogICAgcmVnZXgubWF0Y2goYnVuZGxlX2lkX2Zvcm1hdCwgYnVuZGxlX2lkKQoKICAgIGtleSA6PSAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCIKCiAgICBwX3JlZ2V4IDo9IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIHNhbmRib3hfaWQgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQoKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogc2FuZGJveF9pZCA9Iiwgc2FuZGJveF9pZCwgInJlZ2V4ID0iLCBwX3JlZ2V4KQogICAgcmVnZXgubWF0Y2gocF9yZWdleCwgc2FuZGJveF9pZCkKCiAgICBhbGxvd19yb290X3BhdGgocF9vY2ksIGlfb2NpLCBidW5kbGVfaWQpCgogICAgZXZlcnkgaV9tb3VudCBpbiBpX29jaS5Nb3VudHMgewogICAgICAgIGFsbG93X21vdW50KHBfb2NpLCBpX21vdW50LCBpX3N0b3JhZ2VzLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpCiAgICB9CgogICAgYWxsb3dfc3RvcmFnZXMocF9zdG9yYWdlcywgaV9zdG9yYWdlcywgYnVuZGxlX2lkLCBzYW5kYm94X2lkKQoKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogdHJ1ZSIpCn0KCmFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHBfcHJvY2VzcyA9IiwgcF9wcm9jZXNzKQogICAgcHJpbnQoImFsbG93X3Byb2Nlc3NfY29tbW9uOiBpX3Byb2Nlc3MgPSAiLCBpX3Byb2Nlc3MpCiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHNfbmFtZSA9Iiwgc19uYW1lKQoKICAgIHBfcHJvY2Vzcy5Dd2QgPT0gaV9wcm9jZXNzLkN3ZAogICAgcF9wcm9jZXNzLk5vTmV3UHJpdmlsZWdlcyA9PSBpX3Byb2Nlc3MuTm9OZXdQcml2aWxlZ2VzCgogICAgYWxsb3dfdXNlcihwX3Byb2Nlc3MsIGlfcHJvY2VzcykKICAgIGFsbG93X2VudihwX3Byb2Nlc3MsIGlfcHJvY2Vzcywgc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHRydWUiKQp9CgojIENvbXBhcmUgdGhlIE9DSSBQcm9jZXNzIGZpZWxkIG9mIGEgcG9saWN5IGNvbnRhaW5lciB3aXRoIHRoZSBpbnB1dCBPQ0kgUHJvY2VzcyBmcm9tIGEgQ3JlYXRlQ29udGFpbmVyUmVxdWVzdAphbGxvd19wcm9jZXNzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfcHJvY2Vzczogc3RhcnQiKQoKICAgIGFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgYWxsb3dfY2FwcyhwX3Byb2Nlc3MuQ2FwYWJpbGl0aWVzLCBpX3Byb2Nlc3MuQ2FwYWJpbGl0aWVzKQogICAgcF9wcm9jZXNzLlRlcm1pbmFsID09IGlfcHJvY2Vzcy5UZXJtaW5hbAoKICAgIHByaW50KCJhbGxvd19wcm9jZXNzOiB0cnVlIikKfQoKIyBDb21wYXJlIHRoZSBPQ0kgUHJvY2VzcyBmaWVsZCBvZiBhIHBvbGljeSBjb250YWluZXIgd2l0aCB0aGUgaW5wdXQgcHJvY2VzcyBmaWVsZCBmcm9tIEV4ZWNQcm9jZXNzUmVxdWVzdAphbGxvd19pbnRlcmFjdGl2ZV9wcm9jZXNzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfaW50ZXJhY3RpdmVfcHJvY2Vzczogc3RhcnQiKQoKICAgIGFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgYWxsb3dfZXhlY19jYXBzKGlfcHJvY2Vzcy5DYXBhYmlsaXRpZXMpCgogICAgIyBUaGVzZSBhcmUgY29tbWFuZHMgZW5hYmxlZCB1c2luZyBFeGVjUHJvY2Vzc1JlcXVlc3QgY29tbWFuZHMgYW5kL29yIHJlZ2V4IGZyb20gdGhlIHNldHRpbmdzIGZpbGUuCiAgICAjIFRoZXkgY2FuIGJlIGV4ZWN1dGVkIGludGVyYWN0aXZlbHkgc28gYWxsb3cgdGhlbSB0byB1c2UgYW55IHZhbHVlIGZvciBpX3Byb2Nlc3MuVGVybWluYWwuCgogICAgcHJpbnQoImFsbG93X2ludGVyYWN0aXZlX3Byb2Nlc3M6IHRydWUiKQp9CgojIENvbXBhcmUgdGhlIE9DSSBQcm9jZXNzIGZpZWxkIG9mIGEgcG9saWN5IGNvbnRhaW5lciB3aXRoIHRoZSBpbnB1dCBwcm9jZXNzIGZpZWxkIGZyb20gRXhlY1Byb2Nlc3NSZXF1ZXN0CmFsbG93X3Byb2JlX3Byb2Nlc3MocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19wcm9iZV9wcm9jZXNzOiBzdGFydCIpCgogICAgYWxsb3dfcHJvY2Vzc19jb21tb24ocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpCiAgICBhbGxvd19leGVjX2NhcHMoaV9wcm9jZXNzLkNhcGFiaWxpdGllcykKICAgIHBfcHJvY2Vzcy5UZXJtaW5hbCA9PSBpX3Byb2Nlc3MuVGVybWluYWwKCiAgICBwcmludCgiYWxsb3dfcHJvYmVfcHJvY2VzczogdHJ1ZSIpCn0KCmFsbG93X3VzZXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MpIHsKICAgIHBfdXNlciA6PSBwX3Byb2Nlc3MuVXNlcgogICAgaV91c2VyIDo9IGlfcHJvY2Vzcy5Vc2VyCgogICAgcHJpbnQoImFsbG93X3VzZXI6IGlucHV0IHVpZCA9IiwgaV91c2VyLlVJRCwgInBvbGljeSB1aWQgPSIsIHBfdXNlci5VSUQpCiAgICBwX3VzZXIuVUlEID09IGlfdXNlci5VSUQKCiAgICAjIFRPRE86IHRyYWNrIGRvd24gdGhlIHJlYXNvbiBmb3IgcmVnaXN0cnkuazhzLmlvL3BhdXNlOjMuOSBiZWluZwogICAgIyAgICAgICBleGVjdXRlZCB3aXRoIGdpZCA9IDAgZGVzcGl0ZSBoYXZpbmcgIjY1NTM1OjY1NTM1IiBpbiBpdHMgY29udGFpbmVyIGltYWdlCiAgICAjICAgICAgIGNvbmZpZy4KICAgICNwcmludCgiYWxsb3dfdXNlcjogaW5wdXQgZ2lkID0iLCBpX3VzZXIuR0lELCAicG9saWN5IGdpZCA9IiwgcF91c2VyLkdJRCkKICAgICNwX3VzZXIuR0lEID09IGlfdXNlci5HSUQKCiAgICAjIFRPRE86IGNvbXBhcmUgdGhlIGFkZGl0aW9uYWxHaWRzIGZpZWxkIHRvbyBhZnRlciBjb21wdXRpbmcgaXRzIHZhbHVlCiAgICAjIGJhc2VkIG9uIC9ldGMvcGFzc3dkIGFuZCAvZXRjL2dyb3VwIGZyb20gdGhlIGNvbnRhaW5lciBpbWFnZS4KfQoKYWxsb3dfZGVwcmVjYXRlZF9hcmdzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZ3MgMTogbm8gYXJncyIpCgogICAgbm90IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJncwogICAgbm90IGlfcHJvY2Vzcy5BcmdzCgogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAxOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZ3MocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSkgewogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiBwb2xpY3kgYXJncyA9IiwgcF9wcm9jZXNzLkRlcHJlY2F0ZWRBcmdzKQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiBpbnB1dCBhcmdzID0iLCBpX3Byb2Nlc3MuQXJncykKCiAgICBjb3VudChwX3Byb2Nlc3MuRGVwcmVjYXRlZEFyZ3MpID09IGNvdW50KGlfcHJvY2Vzcy5BcmdzKQoKICAgIGV2ZXJ5IGksIGlfYXJnIGluIGlfcHJvY2Vzcy5BcmdzIHsKICAgICAgICBhbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpCiAgICB9CgogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDE6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgcF9hcmcyIDo9IHJlcGxhY2UocF9hcmcsICIkJCIsICIkIikKICAgIHBfYXJnMiA9PSBpX2FyZwoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAxOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDI6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgIyBUT0RPOiBjYW4gJChub2RlLW5hbWUpIGJlIGhhbmRsZWQgYmV0dGVyPwogICAgY29udGFpbnMocF9hcmcsICIkKG5vZGUtbmFtZSkiKQoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAyOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDM6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgcF9hcmcyIDo9IHJlcGxhY2UocF9hcmcsICIkJCIsICIkIikKICAgIHBfYXJnMyA6PSByZXBsYWNlKHBfYXJnMiwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAzOiBwX2FyZzMgPSIsIHBfYXJnMykKICAgIHBfYXJnMyA9PSBpX2FyZwoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAzOiB0cnVlIikKfQoKIyBPQ0kgcHJvY2Vzcy5FbnYgZmllbGQKYWxsb3dfZW52KHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfZW52OiBwIGVudiA9IiwgcF9wcm9jZXNzLkVudikKICAgIHByaW50KCJhbGxvd19lbnY6IGkgZW52ID0iLCBpX3Byb2Nlc3MuRW52KQoKICAgIGV2ZXJ5IGlfdmFyIGluIGlfcHJvY2Vzcy5FbnYgewogICAgICAgIHByaW50KCJhbGxvd19lbnY6IGlfdmFyID0iLCBpX3ZhcikKICAgICAgICBhbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgfQoKICAgIHByaW50KCJhbGxvd19lbnY6IHRydWUiKQp9CgojIEFsbG93IGlucHV0IGVudiB2YXJpYWJsZXMgdGhhdCBhcmUgcHJlc2VudCBpbiB0aGUgcG9saWN5IGRhdGEgdG9vLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHBfdmFyID09IGlfdmFyCiAgICBwcmludCgiYWxsb3dfdmFyIDE6IHRydWUiKQp9CgojIE1hdGNoIGlucHV0IHdpdGggb25lIG9mIHRoZSBwb2xpY3kgdmFyaWFibGVzLCBhZnRlciBzdWJzdGl0dXRpbmcgJChzYW5kYm94LW5hbWUpLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHByaW50KCJhbGxvd192YXIgMjogcF92YXIgPSIsIHBfdmFyKQoKICAgIHBfdmFyX3NwbGl0IDo9IHNwbGl0KHBfdmFyLCAiPSIpCiAgICBjb3VudChwX3Zhcl9zcGxpdCkgPT0gMgoKICAgIHBfdmFyX3NwbGl0WzFdID09ICIkKHNhbmRib3gtbmFtZSkiCgogICAgaV92YXJfc3BsaXQgOj0gc3BsaXQoaV92YXIsICI9IikKICAgIGNvdW50KGlfdmFyX3NwbGl0KSA9PSAyCgogICAgaV92YXJfc3BsaXRbMF0gPT0gcF92YXJfc3BsaXRbMF0KICAgIHJlZ2V4Lm1hdGNoKHNfbmFtZSwgaV92YXJfc3BsaXRbMV0pCgogICAgcHJpbnQoImFsbG93X3ZhciAyOiB0cnVlIikKfQoKIyBBbGxvdyBpbnB1dCBlbnYgdmFyaWFibGVzIHRoYXQgbWF0Y2ggd2l0aCBhIHJlcXVlc3RfZGVmYXVsdHMgcmVnZXguCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHNvbWUgcF9yZWdleDEgaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5DcmVhdGVDb250YWluZXJSZXF1ZXN0LmFsbG93X2Vudl9yZWdleAogICAgcF9yZWdleDIgOj0gcmVwbGFjZShwX3JlZ2V4MSwgIiQoaXB2NF9hKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcHY0X2EpCiAgICBwX3JlZ2V4MyA6PSByZXBsYWNlKHBfcmVnZXgyLCAiJChpcF9wKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcF9wKQogICAgcF9yZWdleDQgOj0gcmVwbGFjZShwX3JlZ2V4MywgIiQoc3ZjX25hbWUpIiwgcG9saWN5X2RhdGEuY29tbW9uLnN2Y19uYW1lKQogICAgcF9yZWdleDUgOj0gcmVwbGFjZShwX3JlZ2V4NCwgIiQoZG5zX2xhYmVsKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5kbnNfbGFiZWwpCgogICAgcHJpbnQoImFsbG93X3ZhciAzOiBwX3JlZ2V4NSA9IiwgcF9yZWdleDUpCiAgICByZWdleC5tYXRjaChwX3JlZ2V4NSwgaV92YXIpCgogICAgcHJpbnQoImFsbG93X3ZhciAzOiB0cnVlIikKfQoKIyBBbGxvdyBmaWVsZFJlZiAiZmllbGRQYXRoOiBzdGF0dXMucG9kSVAiIHZhbHVlcy4KYWxsb3dfdmFyKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBpX3Zhciwgc19uYW1lLCBzX25hbWVzcGFjZSkgewogICAgbmFtZV92YWx1ZSA6PSBzcGxpdChpX3ZhciwgIj0iKQogICAgY291bnQobmFtZV92YWx1ZSkgPT0gMgogICAgaXNfaXAobmFtZV92YWx1ZVsxXSkKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIGFsbG93X3BvZF9pcF92YXIobmFtZV92YWx1ZVswXSwgcF92YXIpCgogICAgcHJpbnQoImFsbG93X3ZhciA0OiB0cnVlIikKfQoKIyBBbGxvdyBjb21tb24gZmllbGRSZWYgdmFyaWFibGVzLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBuYW1lX3ZhbHVlIDo9IHNwbGl0KGlfdmFyLCAiPSIpCiAgICBjb3VudChuYW1lX3ZhbHVlKSA9PSAyCgogICAgc29tZSBwX3ZhciBpbiBwX3Byb2Nlc3MuRW52CiAgICBwX25hbWVfdmFsdWUgOj0gc3BsaXQocF92YXIsICI9IikKICAgIGNvdW50KHBfbmFtZV92YWx1ZSkgPT0gMgoKICAgIHBfbmFtZV92YWx1ZVswXSA9PSBuYW1lX3ZhbHVlWzBdCgogICAgIyBUT0RPOiBzaG91bGQgdGhlc2UgYmUgaGFuZGxlZCBpbiBhIGRpZmZlcmVudCB3YXk/CiAgICBhbHdheXNfYWxsb3dlZCA6PSBbIiQoaG9zdC1uYW1lKSIsICIkKG5vZGUtbmFtZSkiLCAiJChwb2QtdWlkKSJdCiAgICBzb21lIGFsbG93ZWQgaW4gYWx3YXlzX2FsbG93ZWQKICAgIGNvbnRhaW5zKHBfbmFtZV92YWx1ZVsxXSwgYWxsb3dlZCkKCiAgICBwcmludCgiYWxsb3dfdmFyIDU6IHRydWUiKQp9CgojIEFsbG93IGZpZWxkUmVmICJmaWVsZFBhdGg6IHN0YXR1cy5ob3N0SVAiIHZhbHVlcy4KYWxsb3dfdmFyKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBpX3Zhciwgc19uYW1lLCBzX25hbWVzcGFjZSkgewogICAgbmFtZV92YWx1ZSA6PSBzcGxpdChpX3ZhciwgIj0iKQogICAgY291bnQobmFtZV92YWx1ZSkgPT0gMgogICAgaXNfaXAobmFtZV92YWx1ZVsxXSkKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIGFsbG93X2hvc3RfaXBfdmFyKG5hbWVfdmFsdWVbMF0sIHBfdmFyKQoKICAgIHByaW50KCJhbGxvd192YXIgNjogdHJ1ZSIpCn0KCiMgQWxsb3cgcmVzb3VyY2VGaWVsZFJlZiB2YWx1ZXMgKGUuZy4sICJsaW1pdHMuY3B1IikuCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIG5hbWVfdmFsdWUgOj0gc3BsaXQoaV92YXIsICI9IikKICAgIGNvdW50KG5hbWVfdmFsdWUpID09IDIKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHBfbmFtZV92YWx1ZSA6PSBzcGxpdChwX3ZhciwgIj0iKQogICAgY291bnQocF9uYW1lX3ZhbHVlKSA9PSAyCgogICAgcF9uYW1lX3ZhbHVlWzBdID09IG5hbWVfdmFsdWVbMF0KCiAgICAjIGEgdmFyaWFibGUgd2Ugc2hvdWxkIGJlIHZhbGlkYXRpbmcgdXNpbmcgYSByZWdleCBmcm9tIHNldHRpbmdzCiAgICBwX25hbWVfdmFsdWVbMV0gPT0gIiQodmFsaWRhdGUtZnJvbS1zZXR0aW5ncykiCgogICAgcmVnZXhfdmFsIDo9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuQ3JlYXRlQ29udGFpbmVyUmVxdWVzdC5hbGxvd19lbnZfcmVnZXhfbWFwW25hbWVfdmFsdWVbMF1dCgogICAgcHJpbnQoImFsbG93X3ZhciA3OiB2YWwgPSIsIG5hbWVfdmFsdWVbMV0pCiAgICBwcmludCgiYWxsb3dfdmFyIDc6IHJlZ2V4X3ZhbCA9IiwgcmVnZXhfdmFsKQoKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4X3ZhbCwgbmFtZV92YWx1ZVsxXSkKCiAgICBwcmludCgiYWxsb3dfdmFyIDc6IHRydWUiKQp9CgojIE1hdGNoIGlucHV0IHdpdGggb25lIG9mIHRoZSBwb2xpY3kgdmFyaWFibGVzLCBhZnRlciBzdWJzdGl0dXRpbmcgJChzYW5kYm94LW5hbWVzcGFjZSkuCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHNvbWUgcF92YXIgaW4gcF9wcm9jZXNzLkVudgogICAgcF92YXIyIDo9IHJlcGxhY2UocF92YXIsICIkKHNhbmRib3gtbmFtZXNwYWNlKSIsIHNfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd192YXIgODogcF92YXIyID0iLCBwX3ZhcjIpCiAgICBwX3ZhcjIgPT0gaV92YXIKCiAgICBwcmludCgiYWxsb3dfdmFyIDg6IHRydWUiKQp9CgphbGxvd19wb2RfaXBfdmFyKHZhcl9uYW1lLCBwX3ZhcikgewogICAgcHJpbnQoImFsbG93X3BvZF9pcF92YXI6IHZhcl9uYW1lID0iLCB2YXJfbmFtZSwgInBfdmFyID0iLCBwX3ZhcikKCiAgICBwX25hbWVfdmFsdWUgOj0gc3BsaXQocF92YXIsICI9IikKICAgIGNvdW50KHBfbmFtZV92YWx1ZSkgPT0gMgoKICAgIHBfbmFtZV92YWx1ZVswXSA9PSB2YXJfbmFtZQogICAgcF9uYW1lX3ZhbHVlWzFdID09ICIkKHBvZC1pcCkiCgogICAgcHJpbnQoImFsbG93X3BvZF9pcF92YXI6IHRydWUiKQp9CgphbGxvd19ob3N0X2lwX3Zhcih2YXJfbmFtZSwgcF92YXIpIHsKICAgIHByaW50KCJhbGxvd19ob3N0X2lwX3ZhcjogdmFyX25hbWUgPSIsIHZhcl9uYW1lLCAicF92YXIgPSIsIHBfdmFyKQoKICAgIHBfbmFtZV92YWx1ZSA6PSBzcGxpdChwX3ZhciwgIj0iKQogICAgY291bnQocF9uYW1lX3ZhbHVlKSA9PSAyCgogICAgcF9uYW1lX3ZhbHVlWzBdID09IHZhcl9uYW1lCiAgICBwX25hbWVfdmFsdWVbMV0gPT0gIiQoaG9zdC1pcCkiCgogICAgcHJpbnQoImFsbG93X2hvc3RfaXBfdmFyOiB0cnVlIikKfQoKaXNfaXAodmFsdWUpIHsKICAgIGJ5dGVzID0gc3BsaXQodmFsdWUsICIuIikKICAgIGNvdW50KGJ5dGVzKSA9PSA0CgogICAgaXNfaXBfZmlyc3RfYnl0ZShieXRlc1swXSkKICAgIGlzX2lwX290aGVyX2J5dGUoYnl0ZXNbMV0pCiAgICBpc19pcF9vdGhlcl9ieXRlKGJ5dGVzWzJdKQogICAgaXNfaXBfb3RoZXJfYnl0ZShieXRlc1szXSkKfQppc19pcF9maXJzdF9ieXRlKGNvbXBvbmVudCkgewogICAgbnVtYmVyID0gdG9fbnVtYmVyKGNvbXBvbmVudCkKICAgIG51bWJlciA+PSAxCiAgICBudW1iZXIgPD0gMjU1Cn0KaXNfaXBfb3RoZXJfYnl0ZShjb21wb25lbnQpIHsKICAgIG51bWJlciA9IHRvX251bWJlcihjb21wb25lbnQpCiAgICBudW1iZXIgPj0gMAogICAgbnVtYmVyIDw9IDI1NQp9CgojIE9DSSByb290LlBhdGgKYWxsb3dfcm9vdF9wYXRoKHBfb2NpLCBpX29jaSwgYnVuZGxlX2lkKSB7CiAgICBpX3BhdGggOj0gaV9vY2kuUm9vdC5QYXRoCiAgICBwX3BhdGgxIDo9IHBfb2NpLlJvb3QuUGF0aAogICAgcHJpbnQoImFsbG93X3Jvb3RfcGF0aDogaV9wYXRoID0iLCBpX3BhdGgsICJwX3BhdGgxID0iLCBwX3BhdGgxKQoKICAgIHBfcGF0aDIgOj0gcmVwbGFjZShwX3BhdGgxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfcm9vdF9wYXRoOiBwX3BhdGgyID0iLCBwX3BhdGgyKQoKICAgIHBfcGF0aDMgOj0gcmVwbGFjZShwX3BhdGgyLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X3Jvb3RfcGF0aDogcF9wYXRoMyA9IiwgcF9wYXRoMykKCiAgICBwX3BhdGgzID09IGlfcGF0aAoKICAgIHByaW50KCJhbGxvd19yb290X3BhdGg6IHRydWUiKQp9CgojIGRldmljZSBtb3VudHMKYWxsb3dfbW91bnQocF9vY2ksIGlfbW91bnQsIGlfc3RvcmFnZXMsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcHJpbnQoImFsbG93X21vdW50OiBpX21vdW50ID0iLCBpX21vdW50KQoKICAgIHNvbWUgcF9tb3VudCBpbiBwX29jaS5Nb3VudHMKICAgIHNvbWUgaV9zdG9yYWdlIGluIGlfc3RvcmFnZXMKCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IHBfbW91bnQgPSIsIHBfbW91bnQpCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IGlfc3RvcmFnZSA9IiwgaV9zdG9yYWdlKQoKICAgIGNoZWNrX21vdW50KHBfbW91bnQsIGlfbW91bnQsIGlfc3RvcmFnZSwgYnVuZGxlX2lkLCBzYW5kYm94X2lkKQoKICAgICMgVE9ETzogYXJlIHRoZXJlIGFueSBvdGhlciByZXF1aXJlZCBwb2xpY3kgY2hlY2tzIGZvciBtb3VudHMgLSBlLmcuLAogICAgIyAgICAgICBtdWx0aXBsZSBtb3VudHMgd2l0aCBzYW1lIHNvdXJjZSBvciBkZXN0aW5hdGlvbj8KCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IHRydWUiKQp9CgpjaGVja19tb3VudChwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcF9tb3VudCA9PSBpX21vdW50CiAgICBwcmludCgiY2hlY2tfbW91bnQgMTogdHJ1ZSIpCn0KY2hlY2tfbW91bnQocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHBfbW91bnQuZGVzdGluYXRpb24gPT0gaV9tb3VudC5kZXN0aW5hdGlvbgogICAgcF9tb3VudC50eXBlXyA9PSBpX21vdW50LnR5cGVfCiAgICBwX21vdW50Lm9wdGlvbnMgPT0gaV9tb3VudC5vcHRpb25zCgogICAgbW91bnRfc291cmNlX2FsbG93cyhwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkKCiAgICBwcmludCgiY2hlY2tfbW91bnQgMjogdHJ1ZSIpCn0KCm1vdW50X3NvdXJjZV9hbGxvd3MocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHJlZ2V4MSA6PSBwX21vdW50LnNvdXJjZQogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5tb3VudF9zb3VyY2VfY3BhdGgpCiAgICByZWdleDQgOj0gcmVwbGFjZShyZWdleDMsICIkKGJ1bmRsZS1pZCkiLCBidW5kbGVfaWQpCgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMTogcmVnZXg0ID0iLCByZWdleDQpCiAgICByZWdleC5tYXRjaChyZWdleDQsIGlfbW91bnQuc291cmNlKQoKICAgIHByaW50KCJtb3VudF9zb3VyY2VfYWxsb3dzIDE6IHRydWUiKQp9Cm1vdW50X3NvdXJjZV9hbGxvd3MocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHJlZ2V4MSA6PSBwX21vdW50LnNvdXJjZQogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5tb3VudF9zb3VyY2VfY3BhdGgpCiAgICByZWdleDQgOj0gcmVwbGFjZShyZWdleDMsICIkKHNhbmRib3gtaWQpIiwgc2FuZGJveF9pZCkKCiAgICBwcmludCgibW91bnRfc291cmNlX2FsbG93cyAyOiByZWdleDQgPSIsIHJlZ2V4NCkKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4NCwgaV9tb3VudC5zb3VyY2UpCgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMjogdHJ1ZSIpCn0KbW91bnRfc291cmNlX2FsbG93cyhwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogaV9tb3VudC5zb3VyY2UgPSIsIGlfbW91bnQuc291cmNlKQogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogaV9zdG9yYWdlLm1vdW50X3BvaW50ID0iLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCgogICAgaV9tb3VudC5zb3VyY2UgPT0gaV9zdG9yYWdlLm1vdW50X3BvaW50CgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogdHJ1ZSIpCn0KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBDcmVhdGUgY29udGFpbmVyIFN0b3JhZ2VzCgphbGxvd19zdG9yYWdlcyhwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHBfY291bnQgOj0gY291bnQocF9zdG9yYWdlcykKICAgIGlfY291bnQgOj0gY291bnQoaV9zdG9yYWdlcykKICAgIHByaW50KCJhbGxvd19zdG9yYWdlczogcF9jb3VudCA9IiwgcF9jb3VudCwgImlfY291bnQgPSIsIGlfY291bnQpCgogICAgcF9jb3VudCA9PSBpX2NvdW50CgogICAgIyBHZXQgdGhlIGNvbnRhaW5lciBpbWFnZSBsYXllciBJRHMgYW5kIHZlcml0eSByb290IGhhc2hlcywgZnJvbSB0aGUgIm92ZXJsYXlmcyIgc3RvcmFnZS4KICAgIHNvbWUgb3ZlcmxheV9zdG9yYWdlIGluIHBfc3RvcmFnZXMKICAgIG92ZXJsYXlfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIHByaW50KCJhbGxvd19zdG9yYWdlczogb3ZlcmxheV9zdG9yYWdlID0iLCBvdmVybGF5X3N0b3JhZ2UpCiAgICBjb3VudChvdmVybGF5X3N0b3JhZ2Uub3B0aW9ucykgPT0gMgoKICAgIGxheWVyX2lkcyA6PSBzcGxpdChvdmVybGF5X3N0b3JhZ2Uub3B0aW9uc1swXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiBsYXllcl9pZHMgPSIsIGxheWVyX2lkcykKCiAgICByb290X2hhc2hlcyA6PSBzcGxpdChvdmVybGF5X3N0b3JhZ2Uub3B0aW9uc1sxXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiByb290X2hhc2hlcyA9Iiwgcm9vdF9oYXNoZXMpCgogICAgZXZlcnkgaV9zdG9yYWdlIGluIGlfc3RvcmFnZXMgewogICAgICAgIGFsbG93X3N0b3JhZ2UocF9zdG9yYWdlcywgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpCiAgICB9CgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiB0cnVlIikKfQoKYWxsb3dfc3RvcmFnZShwX3N0b3JhZ2VzLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgc29tZSBwX3N0b3JhZ2UgaW4gcF9zdG9yYWdlcwoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiBwX3N0b3JhZ2UgPSIsIHBfc3RvcmFnZSkKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiBpX3N0b3JhZ2UgPSIsIGlfc3RvcmFnZSkKCiAgICBwX3N0b3JhZ2UuZHJpdmVyICAgICAgICAgICA9PSBpX3N0b3JhZ2UuZHJpdmVyCiAgICBwX3N0b3JhZ2UuZHJpdmVyX29wdGlvbnMgICA9PSBpX3N0b3JhZ2UuZHJpdmVyX29wdGlvbnMKICAgIHBfc3RvcmFnZS5mc19ncm91cCAgICAgICAgID09IGlfc3RvcmFnZS5mc19ncm91cAogICAgcF9zdG9yYWdlLmZzdHlwZSAgICAgICAgICAgPT0gaV9zdG9yYWdlLmZzdHlwZQoKICAgIGFsbG93X3N0b3JhZ2Vfc291cmNlKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKQogICAgYWxsb3dfc3RvcmFnZV9vcHRpb25zKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKQogICAgYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKQoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiB0cnVlIikKfQoKYWxsb3dfc3RvcmFnZV9zb3VyY2UocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX3NvdXJjZSAxOiBzdGFydCIpCgogICAgcF9zdG9yYWdlLnNvdXJjZSA9PSBpX3N0b3JhZ2Uuc291cmNlCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDE6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX3NvdXJjZShwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDI6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCgogICAgIyBEREREOkJCOkRELkY6IERvbWFpbjpCdXM6RGV2aWNlLkZ1bmN0aW9uCiAgICAjIGh0dHBzOi8vd3d3Lmtlcm5lbC5vcmcvZG9jL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtYnVzLXBjaQogICAgcmVnZXgubWF0Y2goYF5bYS1mMC05XXs0fTpbYS1mMC05XXsyfTpbYS1mMC05XXsyfVwuW2EtZjAtOV0kYCwgaV9zdG9yYWdlLnNvdXJjZSkKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9zb3VyY2UgMjogdHJ1ZSIpCn0KCmFsbG93X3N0b3JhZ2Vfc291cmNlKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKSB7CiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9zb3VyY2UgMzogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIGlfc3RvcmFnZS5zb3VyY2UgPT0gIm5vbmUiCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDM6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX3NvdXJjZShwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDQ6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJzbWIiCgogICAgIyBQYXR0ZXJuOiAvLzxzdG9yYWdlLWFjY291bnQtbmFtZT4uZmlsZS5jb3JlLndpbmRvd3MubmV0LzxrOHMtUFZDLW5hbWU+CiAgICAjIFN0b3JhZ2UgYWNjb3VudCBuYW1lOiBodHRwczovL2xlYXJuLm1pY3Jvc29mdC5jb20vZW4tdXMvYXp1cmUvc3RvcmFnZS9jb21tb24vc3RvcmFnZS1hY2NvdW50LW92ZXJ2aWV3I3N0b3JhZ2UtYWNjb3VudC1uYW1lCiAgICAjIEs4cyBQVkMgbmFtZTogaHR0cHM6Ly9rdWJlcm5ldGVzLmlvL2RvY3MvY29uY2VwdHMvb3ZlcnZpZXcvd29ya2luZy13aXRoLW9iamVjdHMvbmFtZXMvI2Rucy1zdWJkb21haW4tbmFtZXMKICAgIHJlZ2V4Lm1hdGNoKGBeXC9cLyhbYS16MC05XXszLDI0fSlcLmZpbGVcLmNvcmVcLndpbmRvd3NcLm5ldFwvW2EtejAtOV0oW2EtejAtOS4tXXswLDI1MX1bYS16MC05XSk/JGAsIGlfc3RvcmFnZS5zb3VyY2UpCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDQ6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMTogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgIT0gIm92ZXJsYXlmcyIKICAgIHBfc3RvcmFnZS5vcHRpb25zID09IGlfc3RvcmFnZS5vcHRpb25zCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAxOiB0cnVlIikKfQphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIGNvdW50KHBfc3RvcmFnZS5vcHRpb25zKSA9PSAyCgogICAgcG9saWN5X2lkcyA6PSBzcGxpdChwX3N0b3JhZ2Uub3B0aW9uc1swXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBwb2xpY3lfaWRzID0iLCBwb2xpY3lfaWRzKQogICAgcG9saWN5X2lkcyA9PSBsYXllcl9pZHMKCiAgICBwb2xpY3lfaGFzaGVzIDo9IHNwbGl0KHBfc3RvcmFnZS5vcHRpb25zWzFdLCAiOiIpCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IHBvbGljeV9oYXNoZXMgPSIsIHBvbGljeV9oYXNoZXMpCgogICAgcF9jb3VudCA6PSBjb3VudChwb2xpY3lfaWRzKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBwX2NvdW50ID0iLCBwX2NvdW50KQogICAgcF9jb3VudCA+PSAxCiAgICBwX2NvdW50ID09IGNvdW50KHBvbGljeV9oYXNoZXMpCgogICAgaV9jb3VudCA6PSBjb3VudChpX3N0b3JhZ2Uub3B0aW9ucykKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogaV9jb3VudCA9IiwgaV9jb3VudCkKICAgIGlfY291bnQgPT0gcF9jb3VudCArIDMKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zWzBdID0iLCBpX3N0b3JhZ2Uub3B0aW9uc1swXSkKICAgIGlfc3RvcmFnZS5vcHRpb25zWzBdID09ICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQubGF5ZXItc3JjLXByZWZpeD0vdmFyL2xpYi9jb250YWluZXJkL2lvLmNvbnRhaW5lcmQuc25hcHNob3R0ZXIudjEudGFyZGV2L2xheWVycyIKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zW2lfY291bnQgLSAyXSA9IiwgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDJdKQogICAgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDJdID09ICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQub3ZlcmxheS1ydyIKCiAgICBsb3dlcmRpciA6PSBjb25jYXQoIj0iLCBbImxvd2VyZGlyIiwgcF9zdG9yYWdlLm9wdGlvbnNbMF1dKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBsb3dlcmRpciA9IiwgbG93ZXJkaXIpCgogICAgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDFdID09IGxvd2VyZGlyCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zW2lfY291bnQgLSAxXSA9IiwgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDFdKQoKICAgIGV2ZXJ5IGksIHBvbGljeV9pZCBpbiBwb2xpY3lfaWRzIHsKICAgICAgICBhbGxvd19vdmVybGF5X2xheWVyKHBvbGljeV9pZCwgcG9saWN5X2hhc2hlc1tpXSwgaV9zdG9yYWdlLm9wdGlvbnNbaSArIDFdKQogICAgfQoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogdHJ1ZSIpCn0KYWxsb3dfc3RvcmFnZV9vcHRpb25zKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKSB7CiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDM6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCiAgICBjb3VudChwX3N0b3JhZ2Uub3B0aW9ucykgPT0gMQoKICAgIHN0YXJ0c3dpdGgocF9zdG9yYWdlLm9wdGlvbnNbMF0sICIkKGhhc2giKQogICAgaGFzaF9zdWZmaXggOj0gdHJpbV9sZWZ0KHBfc3RvcmFnZS5vcHRpb25zWzBdLCAiJChoYXNoIikKCiAgICBlbmRzd2l0aChoYXNoX3N1ZmZpeCwgIikiKQogICAgaGFzaF9pbmRleCA6PSB0cmltX3JpZ2h0KGhhc2hfc3VmZml4LCAiKSIpCiAgICBpIDo9IHRvX251bWJlcihoYXNoX2luZGV4KQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAzOiBpID0iLCBpKQoKICAgIGhhc2hfb3B0aW9uIDo9IGNvbmNhdCgiPSIsIFsiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LnJvb3QtaGFzaCIsIHJvb3RfaGFzaGVzW2ldXSkKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMzogaGFzaF9vcHRpb24gPSIsIGhhc2hfb3B0aW9uKQoKICAgIGNvdW50KGlfc3RvcmFnZS5vcHRpb25zKSA9PSA0CiAgICBpX3N0b3JhZ2Uub3B0aW9uc1swXSA9PSAicm8iCiAgICBpX3N0b3JhZ2Uub3B0aW9uc1sxXSA9PSAiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmJsb2NrX2RldmljZT1maWxlIgogICAgaV9zdG9yYWdlLm9wdGlvbnNbMl0gPT0gImlvLmthdGFjb250YWluZXJzLmZzLW9wdC5pcy1sYXllciIKICAgIGlfc3RvcmFnZS5vcHRpb25zWzNdID09IGhhc2hfb3B0aW9uCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAzOiB0cnVlIikKfQphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgNDogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gInNtYiIKICAgIHBfb3B0c19jb3VudCA6PSBjb3VudChwX3N0b3JhZ2Uub3B0aW9ucykKICAgIGlfb3B0c19jb3VudCA6PSBjb3VudChpX3N0b3JhZ2Uub3B0aW9ucykKICAgIGlfb3B0c19jb3VudCA9PSBwX29wdHNfY291bnQgKyAyCgogICAgaV9vcHRfbWF0Y2hlcyA6PSBbaSB8IGkgOj0gaWR4OyBpZHggPCBwX29wdHNfY291bnQ7IHBfc3RvcmFnZS5vcHRpb25zW2lkeF0gPT0gaV9zdG9yYWdlLm9wdGlvbnNbaWR4XV0KICAgIGNvdW50KGlfb3B0X21hdGNoZXMpID09IHBfb3B0c19jb3VudAoKICAgIHN0YXJ0c3dpdGgoaV9zdG9yYWdlLm9wdGlvbnNbaV9vcHRzX2NvdW50LTJdLCAiYWRkcj0iKQogICAgY3JlZHMgPSBzcGxpdChpX3N0b3JhZ2Uub3B0aW9uc1tpX29wdHNfY291bnQtMV0sICIsIikKICAgIGNvdW50KGNyZWRzKSA9PSAyCiAgICBzdGFydHN3aXRoKGNyZWRzWzBdLCAidXNlcm5hbWU9IikKICAgIHN0YXJ0c3dpdGgoY3JlZHNbMV0sICJwYXNzd29yZD0iKQogICAgCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDQ6IHRydWUiKQp9CgphbGxvd19vdmVybGF5X2xheWVyKHBvbGljeV9pZCwgcG9saWN5X2hhc2gsIGlfb3B0aW9uKSB7CiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogcG9saWN5X2lkID0iLCBwb2xpY3lfaWQsICJwb2xpY3lfaGFzaCA9IiwgcG9saWN5X2hhc2gpCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogaV9vcHRpb24gPSIsIGlfb3B0aW9uKQoKICAgIHN0YXJ0c3dpdGgoaV9vcHRpb24sICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQubGF5ZXI9IikKICAgIGlfdmFsdWUgOj0gcmVwbGFjZShpX29wdGlvbiwgImlvLmthdGFjb250YWluZXJzLmZzLW9wdC5sYXllcj0iLCAiIikKICAgIGlfdmFsdWVfZGVjb2RlZCA6PSBiYXNlNjQuZGVjb2RlKGlfdmFsdWUpCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogaV92YWx1ZV9kZWNvZGVkID0iLCBpX3ZhbHVlX2RlY29kZWQpCgogICAgcG9saWN5X3N1ZmZpeCA6PSBjb25jYXQoIj0iLCBbInRhcixybyxpby5rYXRhY29udGFpbmVycy5mcy1vcHQuYmxvY2tfZGV2aWNlPWZpbGUsaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmlzLWxheWVyLGlvLmthdGFjb250YWluZXJzLmZzLW9wdC5yb290LWhhc2giLCBwb2xpY3lfaGFzaF0pCiAgICBwX3ZhbHVlIDo9IGNvbmNhdCgiLCIsIFtwb2xpY3lfaWQsIHBvbGljeV9zdWZmaXhdKQogICAgcHJpbnQoImFsbG93X292ZXJsYXlfbGF5ZXI6IHBfdmFsdWUgPSIsIHBfdmFsdWUpCgogICAgcF92YWx1ZSA9PSBpX3ZhbHVlX2RlY29kZWQKCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogdHJ1ZSIpCn0KCmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAidGFyIgoKICAgIHN0YXJ0c3dpdGgocF9zdG9yYWdlLm1vdW50X3BvaW50LCAiJChsYXllciIpCiAgICBtb3VudF9zdWZmaXggOj0gdHJpbV9sZWZ0KHBfc3RvcmFnZS5tb3VudF9wb2ludCwgIiQobGF5ZXIiKQoKICAgIGVuZHN3aXRoKG1vdW50X3N1ZmZpeCwgIikiKQogICAgbGF5ZXJfaW5kZXggOj0gdHJpbV9yaWdodChtb3VudF9zdWZmaXgsICIpIikKICAgIGkgOj0gdG9fbnVtYmVyKGxheWVyX2luZGV4KQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDE6IGkgPSIsIGkpCgogICAgbGF5ZXJfaWQgOj0gbGF5ZXJfaWRzW2ldCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMTogbGF5ZXJfaWQgPSIsIGxheWVyX2lkKQoKICAgIHBfbW91bnQgOj0gY29uY2F0KCIvIiwgWyIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L2xheWVycyIsIGxheWVyX2lkXSkKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCAxOiBwX21vdW50ID0iLCBwX21vdW50KQoKICAgIHBfbW91bnQgPT0gaV9zdG9yYWdlLm1vdW50X3BvaW50CgogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDE6IHRydWUiKQp9CmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAiZnVzZTMua2F0YS1vdmVybGF5IgoKICAgIG1vdW50MSA6PSByZXBsYWNlKHBfc3RvcmFnZS5tb3VudF9wb2ludCwgIiQoY3BhdGgpIiwgcG9saWN5X2RhdGEuY29tbW9uLmNwYXRoKQogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDI6IG1vdW50MiA9IiwgbW91bnQyKQoKICAgIG1vdW50MiA9PSBpX3N0b3JhZ2UubW91bnRfcG9pbnQKCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMjogdHJ1ZSIpCn0KYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKSB7CiAgICBwX3N0b3JhZ2UuZnN0eXBlID09ICJsb2NhbCIKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQyID0iLCBtb3VudDIpCgogICAgbW91bnQzIDo9IHJlcGxhY2UobW91bnQyLCAiJChzYW5kYm94LWlkKSIsIHNhbmRib3hfaWQpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQzID0iLCBtb3VudDMpCgogICAgcmVnZXgubWF0Y2gobW91bnQzLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCgogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDM6IHRydWUiKQp9CmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAiYmluZCIKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNDogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNDogbW91bnQyID0iLCBtb3VudDIpCgogICAgbW91bnQzIDo9IHJlcGxhY2UobW91bnQyLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDQ6IG1vdW50MyA9IiwgbW91bnQzKQoKICAgIHJlZ2V4Lm1hdGNoKG1vdW50MywgaV9zdG9yYWdlLm1vdW50X3BvaW50KQoKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA0OiB0cnVlIikKfQphbGxvd19tb3VudF9wb2ludChwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgYnVuZGxlX2lkLCBzYW5kYm94X2lkLCBsYXllcl9pZHMpIHsKICAgIHBfc3RvcmFnZS5mc3R5cGUgPT0gInRtcGZzIgoKICAgIG1vdW50MSA6PSBwX3N0b3JhZ2UubW91bnRfcG9pbnQKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA1OiBtb3VudDEgPSIsIG1vdW50MSkKCiAgICByZWdleC5tYXRjaChtb3VudDEsIGlfc3RvcmFnZS5tb3VudF9wb2ludCkKCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNTogdHJ1ZSIpCn0KYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKSB7CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogaV9zdG9yYWdlLm1vdW50X3BvaW50ID0iLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCiAgICBhbGxvd19kaXJlY3Rfdm9sX2RyaXZlcihwX3N0b3JhZ2UsIGlfc3RvcmFnZSkKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChzcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQyID0iLCBtb3VudDIpCgogICAgZGlyZWN0X3ZvbF9wYXRoIDo9IGlfc3RvcmFnZS5zb3VyY2UKICAgIG1vdW50MyA6PSByZXBsYWNlKG1vdW50MiwgIiQoYjY0LWRpcmVjdC12b2wtcGF0aCkiLCBiYXNlNjR1cmwuZW5jb2RlKGRpcmVjdF92b2xfcGF0aCkpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQzID0iLCBtb3VudDMpCgogICAgbW91bnQzID09IGlfc3RvcmFnZS5tb3VudF9wb2ludAoKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA2OiB0cnVlIikKfQoKYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIocF9zdG9yYWdlLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19kaXJlY3Rfdm9sX2RyaXZlciAxOiBzdGFydCIpCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCiAgICBwcmludCgiYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIgMTogdHJ1ZSIpCn0KYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIocF9zdG9yYWdlLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19kaXJlY3Rfdm9sX2RyaXZlciAyOiBzdGFydCIpCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJzbWIiCiAgICBwcmludCgiYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIgMjogdHJ1ZSIpCn0KCiMgRXhlY1Byb2Nlc3NSZXF1ZXN0LnByb2Nlc3MuQ2FwYWJpbGl0aWVzCmFsbG93X2V4ZWNfY2FwcyhpX2NhcHMpIHsKICAgIG5vdCBpX2NhcHMuQW1iaWVudAogICAgbm90IGlfY2Fwcy5Cb3VuZGluZwogICAgbm90IGlfY2Fwcy5FZmZlY3RpdmUKICAgIG5vdCBpX2NhcHMuSW5oZXJpdGFibGUKICAgIG5vdCBpX2NhcHMuUGVybWl0dGVkCn0KCiMgT0NJLlByb2Nlc3MuQ2FwYWJpbGl0aWVzCmFsbG93X2NhcHMocF9jYXBzLCBpX2NhcHMpIHsKICAgIHByaW50KCJhbGxvd19jYXBzOiBwb2xpY3kgQW1iaWVudCA9IiwgcF9jYXBzLkFtYmllbnQpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgQW1iaWVudCA9IiwgaV9jYXBzLkFtYmllbnQpCiAgICBtYXRjaF9jYXBzKHBfY2Fwcy5BbWJpZW50LCBpX2NhcHMuQW1iaWVudCkKCiAgICBwcmludCgiYWxsb3dfY2FwczogcG9saWN5IEJvdW5kaW5nID0iLCBwX2NhcHMuQm91bmRpbmcpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgQm91bmRpbmcgPSIsIGlfY2Fwcy5Cb3VuZGluZykKICAgIG1hdGNoX2NhcHMocF9jYXBzLkJvdW5kaW5nLCBpX2NhcHMuQm91bmRpbmcpCgogICAgcHJpbnQoImFsbG93X2NhcHM6IHBvbGljeSBFZmZlY3RpdmUgPSIsIHBfY2Fwcy5FZmZlY3RpdmUpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgRWZmZWN0aXZlID0iLCBpX2NhcHMuRWZmZWN0aXZlKQogICAgbWF0Y2hfY2FwcyhwX2NhcHMuRWZmZWN0aXZlLCBpX2NhcHMuRWZmZWN0aXZlKQoKICAgIHByaW50KCJhbGxvd19jYXBzOiBwb2xpY3kgSW5oZXJpdGFibGUgPSIsIHBfY2Fwcy5Jbmhlcml0YWJsZSkKICAgIHByaW50KCJhbGxvd19jYXBzOiBpbnB1dCBJbmhlcml0YWJsZSA9IiwgaV9jYXBzLkluaGVyaXRhYmxlKQogICAgbWF0Y2hfY2FwcyhwX2NhcHMuSW5oZXJpdGFibGUsIGlfY2Fwcy5Jbmhlcml0YWJsZSkKCiAgICBwcmludCgiYWxsb3dfY2FwczogcG9saWN5IFBlcm1pdHRlZCA9IiwgcF9jYXBzLlBlcm1pdHRlZCkKICAgIHByaW50KCJhbGxvd19jYXBzOiBpbnB1dCBQZXJtaXR0ZWQgPSIsIGlfY2Fwcy5QZXJtaXR0ZWQpCiAgICBtYXRjaF9jYXBzKHBfY2Fwcy5QZXJtaXR0ZWQsIGlfY2Fwcy5QZXJtaXR0ZWQpCn0KCm1hdGNoX2NhcHMocF9jYXBzLCBpX2NhcHMpIHsKICAgIHByaW50KCJtYXRjaF9jYXBzIDE6IHN0YXJ0IikKCiAgICBwX2NhcHMgPT0gaV9jYXBzCgogICAgcHJpbnQoIm1hdGNoX2NhcHMgMTogdHJ1ZSIpCn0KbWF0Y2hfY2FwcyhwX2NhcHMsIGlfY2FwcykgewogICAgcHJpbnQoIm1hdGNoX2NhcHMgMjogc3RhcnQiKQoKICAgIGNvdW50KHBfY2FwcykgPT0gMQogICAgcF9jYXBzWzBdID09ICIkKGRlZmF1bHRfY2FwcykiCgogICAgcHJpbnQoIm1hdGNoX2NhcHMgMjogZGVmYXVsdF9jYXBzID0iLCBwb2xpY3lfZGF0YS5jb21tb24uZGVmYXVsdF9jYXBzKQogICAgcG9saWN5X2RhdGEuY29tbW9uLmRlZmF1bHRfY2FwcyA9PSBpX2NhcHMKCiAgICBwcmludCgibWF0Y2hfY2FwcyAyOiB0cnVlIikKfQptYXRjaF9jYXBzKHBfY2FwcywgaV9jYXBzKSB7CiAgICBwcmludCgibWF0Y2hfY2FwcyAzOiBzdGFydCIpCgogICAgY291bnQocF9jYXBzKSA9PSAxCiAgICBwX2NhcHNbMF0gPT0gIiQocHJpdmlsZWdlZF9jYXBzKSIKCiAgICBwcmludCgibWF0Y2hfY2FwcyAzOiBwcml2aWxlZ2VkX2NhcHMgPSIsIHBvbGljeV9kYXRhLmNvbW1vbi5wcml2aWxlZ2VkX2NhcHMpCiAgICBwb2xpY3lfZGF0YS5jb21tb24ucHJpdmlsZWdlZF9jYXBzID09IGlfY2FwcwoKICAgIHByaW50KCJtYXRjaF9jYXBzIDM6IHRydWUiKQp9CgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgpjaGVja19kaXJlY3RvcnlfdHJhdmVyc2FsKGlfcGF0aCkgewogICAgbm90IHJlZ2V4Lm1hdGNoKCIoXnwvKS4uKCR8LykiLCBpX3BhdGgpCn0KCmNoZWNrX3N5bWxpbmtfc291cmNlKGlfc3JjKSB7CiAgICBpX3NyYyA9PSAiIgogICAgcHJpbnQoImNoZWNrX3N5bWxpbmtfc291cmNlIDE6IHRydWUiKQp9CmNoZWNrX3N5bWxpbmtfc291cmNlKGlfc3JjKSB7CiAgICBpX3NyYyAhPSAiIgogICAgcHJpbnQoImNoZWNrX3N5bWxpbmtfc291cmNlIDI6IGlfc3JjID0iLCBpX3NyYykKCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24uc19zb3VyY2UxLCBpX3NyYykKCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMjogdHJ1ZSIpCn0KY2hlY2tfc3ltbGlua19zb3VyY2UoaV9zcmMpIHsKICAgIGlfc3JjICE9ICIiCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMzogaV9zcmMgPSIsIGlfc3JjKQoKICAgIHJlZ2V4Lm1hdGNoKHBvbGljeV9kYXRhLmNvbW1vbi5zX3NvdXJjZTIsIGlfc3JjKQogICAgY2hlY2tfZGlyZWN0b3J5X3RyYXZlcnNhbChpX3NyYykKCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMzogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfc3RvcmFnZXMoaV9zdG9yYWdlcykgewogICAgcHJpbnQoImFsbG93X3NhbmRib3hfc3RvcmFnZXM6IGlfc3RvcmFnZXMgPSIsIGlfc3RvcmFnZXMpCgogICAgcF9zdG9yYWdlcyA6PSBwb2xpY3lfZGF0YS5zYW5kYm94LnN0b3JhZ2VzCiAgICBldmVyeSBpX3N0b3JhZ2UgaW4gaV9zdG9yYWdlcyB7CiAgICAgICAgYWxsb3dfc2FuZGJveF9zdG9yYWdlKHBfc3RvcmFnZXMsIGlfc3RvcmFnZSkKICAgIH0KCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9zdG9yYWdlczogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfc3RvcmFnZShwX3N0b3JhZ2VzLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IGlfc3RvcmFnZSA9IiwgaV9zdG9yYWdlKQoKICAgIHNvbWUgcF9zdG9yYWdlIGluIHBfc3RvcmFnZXMKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IHBfc3RvcmFnZSA9IiwgcF9zdG9yYWdlKQogICAgaV9zdG9yYWdlID09IHBfc3RvcmFnZQoKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IHRydWUiKQp9CgpDb3B5RmlsZVJlcXVlc3QgewogICAgcHJpbnQoIkNvcHlGaWxlUmVxdWVzdDogaW5wdXQucGF0aCA9IiwgaW5wdXQucGF0aCkKCiAgICBjaGVja19zeW1saW5rX3NvdXJjZShpbnB1dC5zeW1saW5rX3NyYykKICAgIGNoZWNrX2RpcmVjdG9yeV90cmF2ZXJzYWwoaW5wdXQucGF0aCkKCiAgICBzb21lIHJlZ2V4MSBpbiBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLkNvcHlGaWxlUmVxdWVzdAogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5jcGF0aCkKICAgIHJlZ2V4NCA6PSByZXBsYWNlKHJlZ2V4MywgIiQoYnVuZGxlLWlkKSIsIEJVTkRMRV9JRCkKICAgIHByaW50KCJDb3B5RmlsZVJlcXVlc3Q6IHJlZ2V4NCA9IiwgcmVnZXg0KQoKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4NCwgaW5wdXQucGF0aCkKCiAgICBwcmludCgiQ29weUZpbGVSZXF1ZXN0OiB0cnVlIikKfQoKQ3JlYXRlU2FuZGJveFJlcXVlc3QgewogICAgcHJpbnQoIkNyZWF0ZVNhbmRib3hSZXF1ZXN0OiBpbnB1dC5ndWVzdF9ob29rX3BhdGggPSIsIGlucHV0Lmd1ZXN0X2hvb2tfcGF0aCkKICAgIGNvdW50KGlucHV0Lmd1ZXN0X2hvb2tfcGF0aCkgPT0gMAoKICAgIHByaW50KCJDcmVhdGVTYW5kYm94UmVxdWVzdDogaW5wdXQua2VybmVsX21vZHVsZXMgPSIsIGlucHV0Lmtlcm5lbF9tb2R1bGVzKQogICAgY291bnQoaW5wdXQua2VybmVsX21vZHVsZXMpID09IDAKCiAgICBpX3BpZG5zIDo9IGlucHV0LnNhbmRib3hfcGlkbnMKICAgIHByaW50KCJDcmVhdGVTYW5kYm94UmVxdWVzdDogaV9waWRucyA9IiwgaV9waWRucykKICAgIGlfcGlkbnMgPT0gZmFsc2UKICAgIGFsbG93X3NhbmRib3hfc3RvcmFnZXMoaW5wdXQuc3RvcmFnZXMpCn0KCmFsbG93X2V4ZWMocF9jb250YWluZXIsIGlfcHJvY2VzcykgewogICAgcHJpbnQoImFsbG93X2V4ZWM6IHN0YXJ0IikKCiAgICBwX29jaSA9IHBfY29udGFpbmVyLk9DSQogICAgcF9zX25hbWUgPSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc19uYW1lc3BhY2UgPSBnZXRfc3RhdGVfdmFsKCJuYW1lc3BhY2UiKQogICAgYWxsb3dfcHJvYmVfcHJvY2VzcyhwX29jaS5Qcm9jZXNzLCBpX3Byb2Nlc3MsIHBfc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfZXhlYzogdHJ1ZSIpCn0KCmFsbG93X2ludGVyYWN0aXZlX2V4ZWMocF9jb250YWluZXIsIGlfcHJvY2VzcykgewogICAgcHJpbnQoImFsbG93X2ludGVyYWN0aXZlX2V4ZWM6IHN0YXJ0IikKCiAgICBwX29jaSA9IHBfY29udGFpbmVyLk9DSQogICAgcF9zX25hbWUgPSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc19uYW1lc3BhY2UgPSBnZXRfc3RhdGVfdmFsKCJuYW1lc3BhY2UiKQogICAgYWxsb3dfaW50ZXJhY3RpdmVfcHJvY2VzcyhwX29jaS5Qcm9jZXNzLCBpX3Byb2Nlc3MsIHBfc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfaW50ZXJhY3RpdmVfZXhlYzogdHJ1ZSIpCn0KCiMgVE9ETzogc2hvdWxkIG90aGVyIEV4ZWNQcm9jZXNzUmVxdWVzdCBpbnB1dCBkYXRhIGZpZWxkcyBiZSB2YWxpZGF0ZWQgYXMgd2VsbD8KRXhlY1Byb2Nlc3NSZXF1ZXN0IHsKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMTogaW5wdXQgPSIsIGlucHV0KQoKICAgIHNvbWUgcF9jb21tYW5kIGluIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuRXhlY1Byb2Nlc3NSZXF1ZXN0LmFsbG93ZWRfY29tbWFuZHMKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMTogcF9jb21tYW5kID0iLCBwX2NvbW1hbmQpCiAgICBwX2NvbW1hbmQgPT0gaW5wdXQucHJvY2Vzcy5BcmdzCgogICAgIyBUT0RPOiBtYXRjaCBwX2NvbnRhaW5lcidzIElEIHdpdGggdGhlIGlucHV0IGNvbnRhaW5lcl9pZC4KICAgIHNvbWUgcF9jb250YWluZXIgaW4gcG9saWN5X2RhdGEuY29udGFpbmVycwogICAgYWxsb3dfaW50ZXJhY3RpdmVfZXhlYyhwX2NvbnRhaW5lciwgaW5wdXQucHJvY2VzcykKCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDE6IHRydWUiKQp9CkV4ZWNQcm9jZXNzUmVxdWVzdCB7CiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDI6IGlucHV0ID0iLCBpbnB1dCkKCiAgICAjIFRPRE86IG1hdGNoIGlucHV0IGNvbnRhaW5lciBJRCB3aXRoIGl0cyBjb3JyZXNwb25kaW5nIGNvbnRhaW5lci5leGVjX2NvbW1hbmRzLgogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBzb21lIHBfY29tbWFuZCBpbiBwX2NvbnRhaW5lci5leGVjX2NvbW1hbmRzCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDI6IHBfY29tbWFuZCA9IiwgcF9jb21tYW5kKQoKICAgICMgVE9ETzogc2hvdWxkIG90aGVyIGlucHV0IGRhdGEgZmllbGRzIGJlIHZhbGlkYXRlZCBhcyB3ZWxsPwogICAgcF9jb21tYW5kID09IGlucHV0LnByb2Nlc3MuQXJncwoKICAgIGFsbG93X2V4ZWMocF9jb250YWluZXIsIGlucHV0LnByb2Nlc3MpCgogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAyOiB0cnVlIikKfQpFeGVjUHJvY2Vzc1JlcXVlc3QgewogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAzOiBpbnB1dCA9IiwgaW5wdXQpCgogICAgaV9jb21tYW5kID0gY29uY2F0KCIgIiwgaW5wdXQucHJvY2Vzcy5BcmdzKQogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAzOiBpX2NvbW1hbmQgPSIsIGlfY29tbWFuZCkKCiAgICBzb21lIHBfcmVnZXggaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5FeGVjUHJvY2Vzc1JlcXVlc3QucmVnZXgKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMzogcF9yZWdleCA9IiwgcF9yZWdleCkKCiAgICByZWdleC5tYXRjaChwX3JlZ2V4LCBpX2NvbW1hbmQpCgogICAgIyBUT0RPOiBtYXRjaCBwX2NvbnRhaW5lcidzIElEIHdpdGggdGhlIGlucHV0IGNvbnRhaW5lcl9pZC4KICAgIHNvbWUgcF9jb250YWluZXIgaW4gcG9saWN5X2RhdGEuY29udGFpbmVycwogICAgYWxsb3dfaW50ZXJhY3RpdmVfZXhlYyhwX2NvbnRhaW5lciwgaW5wdXQucHJvY2VzcykKCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDM6IHRydWUiKQp9CgpVcGRhdGVSb3V0ZXNSZXF1ZXN0IHsKICAgIHByaW50KCJVcGRhdGVSb3V0ZXNSZXF1ZXN0OiBpbnB1dCA9IiwgaW5wdXQpCiAgICBwcmludCgiVXBkYXRlUm91dGVzUmVxdWVzdDogcG9saWN5ID0iLCBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLlVwZGF0ZVJvdXRlc1JlcXVlc3QpCgogICAgaV9yb3V0ZXMgOj0gaW5wdXQucm91dGVzLlJvdXRlcwogICAgcF9zb3VyY2VfcmVnZXggPSBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLlVwZGF0ZVJvdXRlc1JlcXVlc3QuZm9yYmlkZGVuX3NvdXJjZV9yZWdleAogICAgcF9uYW1lcyA9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuVXBkYXRlUm91dGVzUmVxdWVzdC5mb3JiaWRkZW5fZGV2aWNlX25hbWVzCgogICAgZXZlcnkgaV9yb3V0ZSBpbiBpX3JvdXRlcyB7CiAgICAgICAgcHJpbnQoImlfcm91dGUuc291cmNlID0iLCBpX3JvdXRlLnNvdXJjZSkKICAgICAgICBldmVyeSBwX3JlZ2V4IGluIHBfc291cmNlX3JlZ2V4IHsKICAgICAgICAgICAgcHJpbnQoInBfcmVnZXggPSIsIHBfcmVnZXgpCiAgICAgICAgICAgIG5vdCByZWdleC5tYXRjaChwX3JlZ2V4LCBpX3JvdXRlLnNvdXJjZSkKICAgICAgICB9CgogICAgICAgIHByaW50KCJpX3JvdXRlLmRldmljZSA9IiwgaV9yb3V0ZS5kZXZpY2UpCiAgICAgICAgbm90IGlfcm91dGUuZGV2aWNlIGluIHBfbmFtZXMKICAgIH0KCiAgICBwcmludCgiVXBkYXRlUm91dGVzUmVxdWVzdDogdHJ1ZSIpCn0KClVwZGF0ZUludGVyZmFjZVJlcXVlc3QgewogICAgcHJpbnQoIlVwZGF0ZUludGVyZmFjZVJlcXVlc3Q6IGlucHV0ID0iLCBpbnB1dCkKICAgIHByaW50KCJVcGRhdGVJbnRlcmZhY2VSZXF1ZXN0OiBwb2xpY3kgPSIsIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuVXBkYXRlSW50ZXJmYWNlUmVxdWVzdCkKCiAgICBpX2ludGVyZmFjZSA6PSBpbnB1dC5pbnRlcmZhY2UKICAgIHBfZmxhZ3MgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmFsbG93X3Jhd19mbGFncwoKICAgICMgVHlwaWNhbGx5LCBqdXN0IElGRl9OT0FSUCBpcyB1c2VkLgogICAgYml0cy5hbmQoaV9pbnRlcmZhY2UucmF3X2ZsYWdzLCBiaXRzLm5lZ2F0ZShwX2ZsYWdzKSkgPT0gMAoKICAgIHBfbmFtZXMgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmZvcmJpZGRlbl9uYW1lcwoKICAgIG5vdCBpX2ludGVyZmFjZS5uYW1lIGluIHBfbmFtZXMKCiAgICBwX2h3YWRkcnMgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmZvcmJpZGRlbl9od19hZGRycwoKICAgIG5vdCBpX2ludGVyZmFjZS5od0FkZHIgaW4gcF9od2FkZHJzCgogICAgcHJpbnQoIlVwZGF0ZUludGVyZmFjZVJlcXVlc3Q6IHRydWUiKQp9CgpDbG9zZVN0ZGluUmVxdWVzdCB7CiAgICBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLkNsb3NlU3RkaW5SZXF1ZXN0ID09IHRydWUKfQoKUmVhZFN0cmVhbVJlcXVlc3QgewogICAgcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5SZWFkU3RyZWFtUmVxdWVzdCA9PSB0cnVlCn0KClVwZGF0ZUVwaGVtZXJhbE1vdW50c1JlcXVlc3QgewogICAgcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVFcGhlbWVyYWxNb3VudHNSZXF1ZXN0ID09IHRydWUKfQoKV3JpdGVTdHJlYW1SZXF1ZXN0IHsKICAgIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuV3JpdGVTdHJlYW1SZXF1ZXN0ID09IHRydWUKfQoKcG9saWN5X2RhdGEgOj0gewogICJjb250YWluZXJzIjogWwogICAgewogICAgICAiT0NJIjogewogICAgICAgICJWZXJzaW9uIjogIjEuMS4wLXJjLjEiLAogICAgICAgICJQcm9jZXNzIjogewogICAgICAgICAgIlRlcm1pbmFsIjogZmFsc2UsCiAgICAgICAgICAiVXNlciI6IHsKICAgICAgICAgICAgIlVJRCI6IDEwMDAsCiAgICAgICAgICAgICJHSUQiOiA2NTUzNSwKICAgICAgICAgICAgIkFkZGl0aW9uYWxHaWRzIjogW10sCiAgICAgICAgICAgICJVc2VybmFtZSI6ICIiCiAgICAgICAgICB9LAogICAgICAgICAgIkRlcHJlY2F0ZWRBcmdzIjogWwogICAgICAgICAgICAiL3BhdXNlIgogICAgICAgICAgXSwKICAgICAgICAgICJBcmdzIjogWwogICAgICAgICAgICAiL3BhdXNlIgogICAgICAgICAgXSwKICAgICAgICAgICJFbnYiOiBbCiAgICAgICAgICAgICJQQVRIPS91c3IvbG9jYWwvc2JpbjovdXNyL2xvY2FsL2JpbjovdXNyL3NiaW46L3Vzci9iaW46L3NiaW46L2JpbiIKICAgICAgICAgIF0sCiAgICAgICAgICAiQ3dkIjogIi8iLAogICAgICAgICAgIkNhcGFiaWxpdGllcyI6IHsKICAgICAgICAgICAgIkFtYmllbnQiOiBbXSwKICAgICAgICAgICAgIkJvdW5kaW5nIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJFZmZlY3RpdmUiOiBbCiAgICAgICAgICAgICAgIiQoZGVmYXVsdF9jYXBzKSIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgIkluaGVyaXRhYmxlIjogW10sCiAgICAgICAgICAgICJQZXJtaXR0ZWQiOiBbCiAgICAgICAgICAgICAgIiQoZGVmYXVsdF9jYXBzKSIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgICJOb05ld1ByaXZpbGVnZXMiOiB0cnVlCiAgICAgICAgfSwKICAgICAgICAiUm9vdCI6IHsKICAgICAgICAgICJQYXRoIjogIiQoY3BhdGgpLyQoYnVuZGxlLWlkKSIsCiAgICAgICAgICAiUmVhZG9ubHkiOiB0cnVlCiAgICAgICAgfSwKICAgICAgICAiTW91bnRzIjogWwogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL3Byb2MiLAogICAgICAgICAgICAic291cmNlIjogInByb2MiLAogICAgICAgICAgICAidHlwZV8iOiAicHJvYyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYiLAogICAgICAgICAgICAic291cmNlIjogInRtcGZzIiwKICAgICAgICAgICAgInR5cGVfIjogInRtcGZzIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgInN0cmljdGF0aW1lIiwKICAgICAgICAgICAgICAibW9kZT03NTUiLAogICAgICAgICAgICAgICJzaXplPTY1NTM2ayIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvcHRzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJkZXZwdHMiLAogICAgICAgICAgICAidHlwZV8iOiAiZGV2cHRzIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAgICAgIm5ld2luc3RhbmNlIiwKICAgICAgICAgICAgICAicHRteG1vZGU9MDY2NiIsCiAgICAgICAgICAgICAgIm1vZGU9MDYyMCIsCiAgICAgICAgICAgICAgImdpZD01IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi9zaG0iLAogICAgICAgICAgICAic291cmNlIjogIi9ydW4va2F0YS1jb250YWluZXJzL3NhbmRib3gvc2htIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L21xdWV1ZSIsCiAgICAgICAgICAgICJzb3VyY2UiOiAibXF1ZXVlIiwKICAgICAgICAgICAgInR5cGVfIjogIm1xdWV1ZSIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9zeXMiLAogICAgICAgICAgICAic291cmNlIjogInN5c2ZzIiwKICAgICAgICAgICAgInR5cGVfIjogInN5c2ZzIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAgICAgIm5vZGV2IiwKICAgICAgICAgICAgICAicm8iCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZXRjL3Jlc29sdi5jb25mIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KXJlc29sdi5jb25mJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicm8iLAogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2RldiIsCiAgICAgICAgICAgICAgIm5vZXhlYyIKICAgICAgICAgICAgXQogICAgICAgICAgfQogICAgICAgIF0sCiAgICAgICAgIkFubm90YXRpb25zIjogewogICAgICAgICAgImlvLmthdGFjb250YWluZXJzLnBrZy5vY2kuYnVuZGxlX3BhdGgiOiAiL3J1bi9jb250YWluZXJkL2lvLmNvbnRhaW5lcmQucnVudGltZS52Mi50YXNrL2s4cy5pby8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgImlvLmthdGFjb250YWluZXJzLnBrZy5vY2kuY29udGFpbmVyX3R5cGUiOiAicG9kX3NhbmRib3giLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLmNvbnRhaW5lci10eXBlIjogInNhbmRib3giLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtaWQiOiAiXlthLXowLTldezY0fSQiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbG9nLWRpcmVjdG9yeSI6ICJeL3Zhci9sb2cvcG9kcy8kKHNhbmRib3gtbmFtZXNwYWNlKV8kKHNhbmRib3gtbmFtZSlfWzAtOWEtZl17OH0tWzAtOWEtZl17NH0tWzAtOWEtZl17NH0tWzAtOWEtZl17NH0tWzAtOWEtZl17MTJ9JCIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1uYW1lc3BhY2UiOiAiIiwKICAgICAgICAgICJuZXJkY3RsL25ldHdvcmstbmFtZXNwYWNlIjogIl4vdmFyL3J1bi9uZXRucy9jbmktWzAtOWEtZl17OH0tWzAtOWEtZl17NH0tWzAtOWEtZl17NH0tWzAtOWEtZl17NH0tWzAtOWEtZl17MTJ9JCIKICAgICAgICB9LAogICAgICAgICJMaW51eCI6IHsKICAgICAgICAgICJOYW1lc3BhY2VzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgIlR5cGUiOiAiaXBjIiwKICAgICAgICAgICAgICAiUGF0aCI6ICIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiVHlwZSI6ICJ1dHMiLAogICAgICAgICAgICAgICJQYXRoIjogIiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJUeXBlIjogIm1vdW50IiwKICAgICAgICAgICAgICAiUGF0aCI6ICIiCiAgICAgICAgICAgIH0KICAgICAgICAgIF0sCiAgICAgICAgICAiTWFza2VkUGF0aHMiOiBbCiAgICAgICAgICAgICIvcHJvYy9hY3BpIiwKICAgICAgICAgICAgIi9wcm9jL2Fzb3VuZCIsCiAgICAgICAgICAgICIvcHJvYy9rY29yZSIsCiAgICAgICAgICAgICIvcHJvYy9rZXlzIiwKICAgICAgICAgICAgIi9wcm9jL2xhdGVuY3lfc3RhdHMiLAogICAgICAgICAgICAiL3Byb2MvdGltZXJfbGlzdCIsCiAgICAgICAgICAgICIvcHJvYy90aW1lcl9zdGF0cyIsCiAgICAgICAgICAgICIvcHJvYy9zY2hlZF9kZWJ1ZyIsCiAgICAgICAgICAgICIvc3lzL2Zpcm13YXJlIiwKICAgICAgICAgICAgIi9wcm9jL3Njc2kiCiAgICAgICAgICBdLAogICAgICAgICAgIlJlYWRvbmx5UGF0aHMiOiBbCiAgICAgICAgICAgICIvcHJvYy9idXMiLAogICAgICAgICAgICAiL3Byb2MvZnMiLAogICAgICAgICAgICAiL3Byb2MvaXJxIiwKICAgICAgICAgICAgIi9wcm9jL3N5cyIsCiAgICAgICAgICAgICIvcHJvYy9zeXNycS10cmlnZ2VyIgogICAgICAgICAgXSwKICAgICAgICAgICJEZXZpY2VzIjogW10sCiAgICAgICAgICAiU3lzY3RsIjogewogICAgICAgICAgICAibmV0LmlwdjQuaXBfdW5wcml2aWxlZ2VkX3BvcnRfc3RhcnQiOiAiMCIsCiAgICAgICAgICAgICJuZXQuaXB2NC5waW5nX2dyb3VwX3JhbmdlIjogIjAgMjE0NzQ4MzY0NyIKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0sCiAgICAgICJzdG9yYWdlcyI6IFsKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoMCkiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXIwKSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogIm92ZXJsYXlmcyIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAiZnVzZTMua2F0YS1vdmVybGF5IiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiNWE1YWFkODAwNTVmZjIwMDEyYTUwZGMyNWY4ZGY3YTI5OTI0NDc0MzI0ZDY1ZjdkNTMwNmVlOGVlMjdmZjcxZCIsCiAgICAgICAgICAgICI4MTcyNTBmMWEzZTMzNmRhNzZmNWJkM2ZhNzg0ZTFiMjZkOTU5YjljMTMxODc2ODE1YmEyNjA0MDQ4YjcwYzE4IgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGNwYXRoKS8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0KICAgICAgXSwKICAgICAgImRldmljZXMiOiBbXSwKICAgICAgInNhbmRib3hfcGlkbnMiOiBmYWxzZSwKICAgICAgImV4ZWNfY29tbWFuZHMiOiBbXSwKICAgICAgImVudl9tYXAiOiB7CiAgICAgICAgIlBBVEgiOiAiL3Vzci9sb2NhbC9zYmluOi91c3IvbG9jYWwvYmluOi91c3Ivc2JpbjovdXNyL2Jpbjovc2JpbjovYmluIgogICAgICB9CiAgICB9LAogICAgewogICAgICAiT0NJIjogewogICAgICAgICJWZXJzaW9uIjogIjEuMS4wLXJjLjEiLAogICAgICAgICJQcm9jZXNzIjogewogICAgICAgICAgIlRlcm1pbmFsIjogZmFsc2UsCiAgICAgICAgICAiVXNlciI6IHsKICAgICAgICAgICAgIlVJRCI6IDEwMDAsCiAgICAgICAgICAgICJHSUQiOiAwLAogICAgICAgICAgICAiQWRkaXRpb25hbEdpZHMiOiBbXSwKICAgICAgICAgICAgIlVzZXJuYW1lIjogIiIKICAgICAgICAgIH0sCiAgICAgICAgICAiRGVwcmVjYXRlZEFyZ3MiOiBbCiAgICAgICAgICAgICJzaCIKICAgICAgICAgIF0sCiAgICAgICAgICAiQXJncyI6IFsKICAgICAgICAgICAgInNoIgogICAgICAgICAgXSwKICAgICAgICAgICJFbnYiOiBbCiAgICAgICAgICAgICJQQVRIPS91c3IvbG9jYWwvc2JpbjovdXNyL2xvY2FsL2JpbjovdXNyL3NiaW46L3Vzci9iaW46L3NiaW46L2JpbiIsCiAgICAgICAgICAgICJIT1NUTkFNRT0kKGhvc3QtbmFtZSkiCiAgICAgICAgICBdLAogICAgICAgICAgIkN3ZCI6ICIvIiwKICAgICAgICAgICJDYXBhYmlsaXRpZXMiOiB7CiAgICAgICAgICAgICJBbWJpZW50IjogW10sCiAgICAgICAgICAgICJCb3VuZGluZyI6IFsKICAgICAgICAgICAgICAiJChkZWZhdWx0X2NhcHMpIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiRWZmZWN0aXZlIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJJbmhlcml0YWJsZSI6IFtdLAogICAgICAgICAgICAiUGVybWl0dGVkIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICAiTm9OZXdQcml2aWxlZ2VzIjogZmFsc2UKICAgICAgICB9LAogICAgICAgICJSb290IjogewogICAgICAgICAgIlBhdGgiOiAiJChjcGF0aCkvJChidW5kbGUtaWQpIiwKICAgICAgICAgICJSZWFkb25seSI6IGZhbHNlCiAgICAgICAgfSwKICAgICAgICAiTW91bnRzIjogWwogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL3Byb2MiLAogICAgICAgICAgICAic291cmNlIjogInByb2MiLAogICAgICAgICAgICAidHlwZV8iOiAicHJvYyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYiLAogICAgICAgICAgICAic291cmNlIjogInRtcGZzIiwKICAgICAgICAgICAgInR5cGVfIjogInRtcGZzIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgInN0cmljdGF0aW1lIiwKICAgICAgICAgICAgICAibW9kZT03NTUiLAogICAgICAgICAgICAgICJzaXplPTY1NTM2ayIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvcHRzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJkZXZwdHMiLAogICAgICAgICAgICAidHlwZV8iOiAiZGV2cHRzIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAgICAgIm5ld2luc3RhbmNlIiwKICAgICAgICAgICAgICAicHRteG1vZGU9MDY2NiIsCiAgICAgICAgICAgICAgIm1vZGU9MDYyMCIsCiAgICAgICAgICAgICAgImdpZD01IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi9zaG0iLAogICAgICAgICAgICAic291cmNlIjogIi9ydW4va2F0YS1jb250YWluZXJzL3NhbmRib3gvc2htIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L21xdWV1ZSIsCiAgICAgICAgICAgICJzb3VyY2UiOiAibXF1ZXVlIiwKICAgICAgICAgICAgInR5cGVfIjogIm1xdWV1ZSIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9zeXMiLAogICAgICAgICAgICAic291cmNlIjogInN5c2ZzIiwKICAgICAgICAgICAgInR5cGVfIjogInN5c2ZzIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAgICAgIm5vZGV2IiwKICAgICAgICAgICAgICAicm8iCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvc3lzL2ZzL2Nncm91cCIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiY2dyb3VwIiwKICAgICAgICAgICAgInR5cGVfIjogImNncm91cCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIsCiAgICAgICAgICAgICAgInJlbGF0aW1lIiwKICAgICAgICAgICAgICAicm8iCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZXRjL2hvc3RzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KWhvc3RzJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJydyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvdGVybWluYXRpb24tbG9nIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KXRlcm1pbmF0aW9uLWxvZyQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicnciCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZXRjL2hvc3RuYW1lIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KWhvc3RuYW1lJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJydyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9ldGMvcmVzb2x2LmNvbmYiLAogICAgICAgICAgICAic291cmNlIjogIiQoc2ZwcmVmaXgpcmVzb2x2LmNvbmYkIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJ3IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL3Zhci9ydW4vc2VjcmV0cy9rdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50IiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KXNlcnZpY2VhY2NvdW50JCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJybyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi92YXIvcnVuL3NlY3JldHMvYXp1cmUvdG9rZW5zIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KXRva2VucyQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicm8iCiAgICAgICAgICAgIF0KICAgICAgICAgIH0KICAgICAgICBdLAogICAgICAgICJBbm5vdGF0aW9ucyI6IHsKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmJ1bmRsZV9wYXRoIjogIi9ydW4vY29udGFpbmVyZC9pby5jb250YWluZXJkLnJ1bnRpbWUudjIudGFzay9rOHMuaW8vJChidW5kbGUtaWQpIiwKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIjogInBvZF9jb250YWluZXIiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLmNvbnRhaW5lci1uYW1lIjogImJ1c3lib3gtZGVwbG95bWVudCIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLXR5cGUiOiAiY29udGFpbmVyIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5pbWFnZS1uYW1lIjogIm1jci5taWNyb3NvZnQuY29tL2Frcy9lMmUvbGlicmFyeS1idXN5Ym94Om1hc3Rlci4yMjAzMTQuMS1saW51eC1hbWQ2NCIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCI6ICJeW2EtejAtOV17NjR9JCIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1uYW1lc3BhY2UiOiAiIgogICAgICAgIH0sCiAgICAgICAgIkxpbnV4IjogewogICAgICAgICAgIk5hbWVzcGFjZXMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiVHlwZSI6ICJpcGMiLAogICAgICAgICAgICAgICJQYXRoIjogIiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJUeXBlIjogInV0cyIsCiAgICAgICAgICAgICAgIlBhdGgiOiAiIgogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgIlR5cGUiOiAibW91bnQiLAogICAgICAgICAgICAgICJQYXRoIjogIiIKICAgICAgICAgICAgfQogICAgICAgICAgXSwKICAgICAgICAgICJNYXNrZWRQYXRocyI6IFsKICAgICAgICAgICAgIi9wcm9jL2FjcGkiLAogICAgICAgICAgICAiL3Byb2Mva2NvcmUiLAogICAgICAgICAgICAiL3Byb2Mva2V5cyIsCiAgICAgICAgICAgICIvcHJvYy9sYXRlbmN5X3N0YXRzIiwKICAgICAgICAgICAgIi9wcm9jL3RpbWVyX2xpc3QiLAogICAgICAgICAgICAiL3Byb2MvdGltZXJfc3RhdHMiLAogICAgICAgICAgICAiL3Byb2Mvc2NoZWRfZGVidWciLAogICAgICAgICAgICAiL3Byb2Mvc2NzaSIsCiAgICAgICAgICAgICIvc3lzL2Zpcm13YXJlIgogICAgICAgICAgXSwKICAgICAgICAgICJSZWFkb25seVBhdGhzIjogWwogICAgICAgICAgICAiL3Byb2MvYXNvdW5kIiwKICAgICAgICAgICAgIi9wcm9jL2J1cyIsCiAgICAgICAgICAgICIvcHJvYy9mcyIsCiAgICAgICAgICAgICIvcHJvYy9pcnEiLAogICAgICAgICAgICAiL3Byb2Mvc3lzIiwKICAgICAgICAgICAgIi9wcm9jL3N5c3JxLXRyaWdnZXIiCiAgICAgICAgICBdLAogICAgICAgICAgIkRldmljZXMiOiBbXSwKICAgICAgICAgICJTeXNjdGwiOiB7CiAgICAgICAgICAgICJuZXQuaXB2NC5pcF91bnByaXZpbGVnZWRfcG9ydF9zdGFydCI6ICIwIiwKICAgICAgICAgICAgIm5ldC5pcHY0LnBpbmdfZ3JvdXBfcmFuZ2UiOiAiMCAyMTQ3NDgzNjQ3IgogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSwKICAgICAgInN0b3JhZ2VzIjogWwogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2gwKSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjApIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2gxKSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjEpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAib3ZlcmxheWZzIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJmdXNlMy5rYXRhLW92ZXJsYXkiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIyYzM0MmExMzdlNjkzYzc4OThhZWMzNmRhMTA0N2YxOTFkYzdjMTY4N2U2NjE5OGFkYWNjNDM5Y2Y0YWRmMzc5OjI1NzBlM2ExOWUxYmYyMGRkZGE0NTQ5OGE5NjI3ZjYxNTU1ZDJkNmMwMTQ3OWI5Yjc2NDYwYjY3OWIyN2Q1NTIiLAogICAgICAgICAgICAiODU2OGM3MGMwY2NmZTAwNTEwOTJlODE4ZGE3NjkxMTFhNTk4ODJjZDE5ZGQ3OTlkM2JjYTVmZmE4Mjc5MTA4MDpiNjQzYjYyMTc3NDg5ODM4MzBiMjZhYzE0YTM1YTMzMjJkZDUyOGMwMDk2M2VhYWRkOTFlZjU1ZjUxM2RjNzNmIgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGNwYXRoKS8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0KICAgICAgXSwKICAgICAgImRldmljZXMiOiBbXSwKICAgICAgInNhbmRib3hfcGlkbnMiOiB0cnVlLAogICAgICAiZXhlY19jb21tYW5kcyI6IFtdLAogICAgICAiZW52X21hcCI6IHsKICAgICAgICAiSE9TVE5BTUUiOiAiJChob3N0LW5hbWUpIiwKICAgICAgICAiUEFUSCI6ICIvdXNyL2xvY2FsL3NiaW46L3Vzci9sb2NhbC9iaW46L3Vzci9zYmluOi91c3IvYmluOi9zYmluOi9iaW4iCiAgICAgIH0KICAgIH0KICBdLAogICJjb21tb24iOiB7CiAgICAiY3BhdGgiOiAiL3J1bi9rYXRhLWNvbnRhaW5lcnMvc2hhcmVkL2NvbnRhaW5lcnMiLAogICAgIm1vdW50X3NvdXJjZV9jcGF0aCI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zaGFyZWQvY29udGFpbmVycyIsCiAgICAic2ZwcmVmaXgiOiAiXiQoY3BhdGgpLyQoYnVuZGxlLWlkKS1bYS16MC05XXsxNn0tIiwKICAgICJzcGF0aCI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L3N0b3JhZ2UiLAogICAgImlwdjRfYSI6ICIoKFswLTldfFsxLTldWzAtOV18MVswLTldezJ9fDJbMC00XVswLTldfDI1WzAtNV0pXFwuKXszfShbMC05XXxbMS05XVswLTldfDFbMC05XXsyfXwyWzAtNF1bMC05XXwyNVswLTVdKSIsCiAgICAiaXBfcCI6ICJbMC05XXsxLDV9IiwKICAgICJzdmNfbmFtZSI6ICJbQS1aX1xcLlxcLV0rIiwKICAgICJkbnNfbGFiZWwiOiAiW2EtekEtWjAtOV9cXC5cXC1dKyIsCiAgICAic19zb3VyY2UxIjogIl4uLjJbMC05XXszfV9bMC0xXVswLTldX1swLTNdWzAtOV1fWzAtMl1bMC05XV9bMC01XVswLTldX1swLTVdWzAtOV1cXC5bMC05XXsxLDEwfSQiLAogICAgInNfc291cmNlMiI6ICJeLi5kYXRhLyIsCiAgICAiZG5zX3N1YmRvbWFpbiI6ICJeW2EtejAtOV0oWy1hLXowLTldKlthLXowLTldKT8kIiwKICAgICJwb2RfdWlkIjogIl5bMC05YS1mQS1GXXs4fS1bMC05YS1mQS1GXXs0fS1bMC05YS1mQS1GXXs0fS1bMC05YS1mQS1GXXs0fS1bMC05YS1mQS1GXXsxMn0kIiwKICAgICJkZWZhdWx0X2NhcHMiOiBbCiAgICAgICJDQVBfQ0hPV04iLAogICAgICAiQ0FQX0RBQ19PVkVSUklERSIsCiAgICAgICJDQVBfRlNFVElEIiwKICAgICAgIkNBUF9GT1dORVIiLAogICAgICAiQ0FQX01LTk9EIiwKICAgICAgIkNBUF9ORVRfUkFXIiwKICAgICAgIkNBUF9TRVRHSUQiLAogICAgICAiQ0FQX1NFVFVJRCIsCiAgICAgICJDQVBfU0VURkNBUCIsCiAgICAgICJDQVBfU0VUUENBUCIsCiAgICAgICJDQVBfTkVUX0JJTkRfU0VSVklDRSIsCiAgICAgICJDQVBfU1lTX0NIUk9PVCIsCiAgICAgICJDQVBfS0lMTCIsCiAgICAgICJDQVBfQVVESVRfV1JJVEUiCiAgICBdLAogICAgInByaXZpbGVnZWRfY2FwcyI6IFsKICAgICAgIkNBUF9DSE9XTiIsCiAgICAgICJDQVBfREFDX09WRVJSSURFIiwKICAgICAgIkNBUF9EQUNfUkVBRF9TRUFSQ0giLAogICAgICAiQ0FQX0ZPV05FUiIsCiAgICAgICJDQVBfRlNFVElEIiwKICAgICAgIkNBUF9LSUxMIiwKICAgICAgIkNBUF9TRVRHSUQiLAogICAgICAiQ0FQX1NFVFVJRCIsCiAgICAgICJDQVBfU0VUUENBUCIsCiAgICAgICJDQVBfTElOVVhfSU1NVVRBQkxFIiwKICAgICAgIkNBUF9ORVRfQklORF9TRVJWSUNFIiwKICAgICAgIkNBUF9ORVRfQlJPQURDQVNUIiwKICAgICAgIkNBUF9ORVRfQURNSU4iLAogICAgICAiQ0FQX05FVF9SQVciLAogICAgICAiQ0FQX0lQQ19MT0NLIiwKICAgICAgIkNBUF9JUENfT1dORVIiLAogICAgICAiQ0FQX1NZU19NT0RVTEUiLAogICAgICAiQ0FQX1NZU19SQVdJTyIsCiAgICAgICJDQVBfU1lTX0NIUk9PVCIsCiAgICAgICJDQVBfU1lTX1BUUkFDRSIsCiAgICAgICJDQVBfU1lTX1BBQ0NUIiwKICAgICAgIkNBUF9TWVNfQURNSU4iLAogICAgICAiQ0FQX1NZU19CT09UIiwKICAgICAgIkNBUF9TWVNfTklDRSIsCiAgICAgICJDQVBfU1lTX1JFU09VUkNFIiwKICAgICAgIkNBUF9TWVNfVElNRSIsCiAgICAgICJDQVBfU1lTX1RUWV9DT05GSUciLAogICAgICAiQ0FQX01LTk9EIiwKICAgICAgIkNBUF9MRUFTRSIsCiAgICAgICJDQVBfQVVESVRfV1JJVEUiLAogICAgICAiQ0FQX0FVRElUX0NPTlRST0wiLAogICAgICAiQ0FQX1NFVEZDQVAiLAogICAgICAiQ0FQX01BQ19PVkVSUklERSIsCiAgICAgICJDQVBfTUFDX0FETUlOIiwKICAgICAgIkNBUF9TWVNMT0ciLAogICAgICAiQ0FQX1dBS0VfQUxBUk0iLAogICAgICAiQ0FQX0JMT0NLX1NVU1BFTkQiLAogICAgICAiQ0FQX0FVRElUX1JFQUQiLAogICAgICAiQ0FQX1BFUkZNT04iLAogICAgICAiQ0FQX0JQRiIsCiAgICAgICJDQVBfQ0hFQ0tQT0lOVF9SRVNUT1JFIgogICAgXSwKICAgICJ2aXJ0aW9fYmxrX3N0b3JhZ2VfY2xhc3NlcyI6IFsKICAgICAgImNjLWxvY2FsLWNzaSIsCiAgICAgICJjYy1tYW5hZ2VkLWNzaSIsCiAgICAgICJjYy1tYW5hZ2VkLXByZW1pdW0tY3NpIgogICAgXSwKICAgICJzbWJfc3RvcmFnZV9jbGFzc2VzIjogWwogICAgICB7CiAgICAgICAgIm5hbWUiOiAiYXp1cmVmaWxlLWNzaS1rYXRhLWNjIiwKICAgICAgICAibW91bnRfb3B0aW9ucyI6IFsKICAgICAgICAgICJkaXJfbW9kZT0wNzc3IiwKICAgICAgICAgICJmaWxlX21vZGU9MDc3NyIsCiAgICAgICAgICAibWZzeW1saW5rcyIsCiAgICAgICAgICAiY2FjaGU9c3RyaWN0IiwKICAgICAgICAgICJub3NoYXJlc29jayIsCiAgICAgICAgICAiYWN0aW1lbz0zMCIsCiAgICAgICAgICAibm9icmwiCiAgICAgICAgXQogICAgICB9CiAgICBdCiAgfSwKICAic2FuZGJveCI6IHsKICAgICJzdG9yYWdlcyI6IFsKICAgICAgewogICAgICAgICJkcml2ZXIiOiAiZXBoZW1lcmFsIiwKICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAic291cmNlIjogInNobSIsCiAgICAgICAgImZzdHlwZSI6ICJ0bXBmcyIsCiAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgIm5vZGV2IiwKICAgICAgICAgICJtb2RlPTE3NzciLAogICAgICAgICAgInNpemU9NjcxMDg4NjQiCiAgICAgICAgXSwKICAgICAgICAibW91bnRfcG9pbnQiOiAiL3J1bi9rYXRhLWNvbnRhaW5lcnMvc2FuZGJveC9zaG0iLAogICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgfQogICAgXQogIH0sCiAgInJlcXVlc3RfZGVmYXVsdHMiOiB7CiAgICAiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdCI6IHsKICAgICAgImFsbG93X2Vudl9yZWdleCI6IFsKICAgICAgICAiXkhPU1ROQU1FPSQoZG5zX2xhYmVsKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfUE9SVF8kKGlwX3ApX1RDUD10Y3A6Ly8kKGlwdjRfYSk6JChpcF9wKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfUE9SVF8kKGlwX3ApX1RDUF9QUk9UTz10Y3AkIiwKICAgICAgICAiXiQoc3ZjX25hbWUpX1BPUlRfJChpcF9wKV9UQ1BfUE9SVD0kKGlwX3ApJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9QT1JUXyQoaXBfcClfVENQX0FERFI9JChpcHY0X2EpJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9TRVJWSUNFX0hPU1Q9JChpcHY0X2EpJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9TRVJWSUNFX1BPUlQ9JChpcF9wKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfU0VSVklDRV9QT1JUXyQoZG5zX2xhYmVsKT0kKGlwX3ApJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9QT1JUPXRjcDovLyQoaXB2NF9hKTokKGlwX3ApJCIsCiAgICAgICAgIl5BWlVSRV9DTElFTlRfSUQ9W0EtRmEtZjAtOS1dKiQiLAogICAgICAgICJeQVpVUkVfVEVOQU5UX0lEPVtBLUZhLWYwLTktXSokIiwKICAgICAgICAiXkFaVVJFX0ZFREVSQVRFRF9UT0tFTl9GSUxFPS92YXIvcnVuL3NlY3JldHMvYXp1cmUvdG9rZW5zL2F6dXJlLWlkZW50aXR5LXRva2VuJCIsCiAgICAgICAgIl5BWlVSRV9BVVRIT1JJVFlfSE9TVD1odHRwczovL2xvZ2luXFwubWljcm9zb2Z0b25saW5lXFwuY29tLyQiLAogICAgICAgICJeVEVSTT14dGVybSQiCiAgICAgIF0sCiAgICAgICJhbGxvd19lbnZfcmVnZXhfbWFwIjogewogICAgICAgICJDUFVfTElNSVQiOiAiXlswLTldKyQiLAogICAgICAgICJKT0JfQ09NUExFVElPTl9JTkRFWCI6ICJeWzAtOV0qJCIsCiAgICAgICAgIk1FTU9SWV9MSU1JVCI6ICJeWzAtOV0rJCIKICAgICAgfQogICAgfSwKICAgICJDb3B5RmlsZVJlcXVlc3QiOiBbCiAgICAgICIkKHNmcHJlZml4KSIKICAgIF0sCiAgICAiRXhlY1Byb2Nlc3NSZXF1ZXN0IjogewogICAgICAiYWxsb3dlZF9jb21tYW5kcyI6IFtdLAogICAgICAicmVnZXgiOiBbXQogICAgfSwKICAgICJVcGRhdGVSb3V0ZXNSZXF1ZXN0IjogewogICAgICAiZm9yYmlkZGVuX2RldmljZV9uYW1lcyI6IFsKICAgICAgICAibG8iCiAgICAgIF0sCiAgICAgICJmb3JiaWRkZW5fc291cmNlX3JlZ2V4IjogWwogICAgICAgICJeKD86MHswLDR9Oil7MCw3fTB7MCwzfTEkIiwKICAgICAgICAiXjEyN1xcLig/OlswLTldezEsM31cXC4pezJ9WzAtOV17MSwzfSQiCiAgICAgIF0KICAgIH0sCiAgICAiVXBkYXRlSW50ZXJmYWNlUmVxdWVzdCI6IHsKICAgICAgImFsbG93X3Jhd19mbGFncyI6IDEyOCwKICAgICAgImZvcmJpZGRlbl9uYW1lcyI6IFsKICAgICAgICAibG8iCiAgICAgIF0sCiAgICAgICJmb3JiaWRkZW5faHdfYWRkcnMiOiBbCiAgICAgICAgIjAwOjAwOjAwOjAwOjAwOjAwIgogICAgICBdCiAgICB9LAogICAgIkNsb3NlU3RkaW5SZXF1ZXN0IjogZmFsc2UsCiAgICAiUmVhZFN0cmVhbVJlcXVlc3QiOiBmYWxzZSwKICAgICJVcGRhdGVFcGhlbWVyYWxNb3VudHNSZXF1ZXN0IjogZmFsc2UsCiAgICAiV3JpdGVTdHJlYW1SZXF1ZXN0IjogZmFsc2UKICB9Cn0= + spec: + runtimeClassName: kata-cc + securityContext: + runAsUser: 1000 + shareProcessNamespace: true + containers: + - image: "mcr.microsoft.com/aks/e2e/library-busybox:master.220314.1-linux-amd64" + name: busybox-deployment diff --git a/src/agent/samples/policy/yaml/deployment/deployment-front.yaml b/src/agent/samples/policy/yaml/deployment/deployment-front.yaml new file mode 100644 index 000000000000..dfb49d24f3ee --- /dev/null +++ b/src/agent/samples/policy/yaml/deployment/deployment-front.yaml @@ -0,0 +1,47 @@ +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: frontend + labels: + app: frontend +spec: + replicas: 1 + selector: + matchLabels: + app: frontend + template: + metadata: + labels: + app: frontend + annotations: + io.katacontainers.config.agent.policy: IyBDb3B5cmlnaHQgKGMpIDIwMjMgTWljcm9zb2Z0IENvcnBvcmF0aW9uCiMKIyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMAojCnBhY2thZ2UgYWdlbnRfcG9saWN5CgppbXBvcnQgZnV0dXJlLmtleXdvcmRzLmluCmltcG9ydCBmdXR1cmUua2V5d29yZHMuZXZlcnkKCiMgRGVmYXVsdCB2YWx1ZXMsIHJldHVybmVkIGJ5IE9QQSB3aGVuIHJ1bGVzIGNhbm5vdCBiZSBldmFsdWF0ZWQgdG8gdHJ1ZS4KZGVmYXVsdCBBZGRBUlBOZWlnaGJvcnNSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgQWRkU3dhcFJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBDbG9zZVN0ZGluUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IENvcHlGaWxlUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IENyZWF0ZUNvbnRhaW5lclJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBDcmVhdGVTYW5kYm94UmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IERlc3Ryb3lTYW5kYm94UmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgRXhlY1Byb2Nlc3NSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgR2V0T09NRXZlbnRSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBHdWVzdERldGFpbHNSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBMaXN0SW50ZXJmYWNlc1JlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBMaXN0Um91dGVzUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IE1lbUhvdHBsdWdCeVByb2JlUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IE9ubGluZUNQVU1lbVJlcXVlc3QgOj0gdHJ1ZQpkZWZhdWx0IFBhdXNlQ29udGFpbmVyUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFJlYWRTdHJlYW1SZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgUmVtb3ZlQ29udGFpbmVyUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgUmVtb3ZlU3RhbGVWaXJ0aW9mc1NoYXJlTW91bnRzUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgUmVzZWVkUmFuZG9tRGV2UmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFJlc3VtZUNvbnRhaW5lclJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBTZXRHdWVzdERhdGVUaW1lUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFNldFBvbGljeVJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBTaWduYWxQcm9jZXNzUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgU3RhcnRDb250YWluZXJSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBTdGFydFRyYWNpbmdSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgU3RhdHNDb250YWluZXJSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBTdG9wVHJhY2luZ1JlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBUdHlXaW5SZXNpemVSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBVcGRhdGVDb250YWluZXJSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgVXBkYXRlRXBoZW1lcmFsTW91bnRzUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFVwZGF0ZUludGVyZmFjZVJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBVcGRhdGVSb3V0ZXNSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgV2FpdFByb2Nlc3NSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBXcml0ZVN0cmVhbVJlcXVlc3QgOj0gZmFsc2UKCiMgQWxsb3dSZXF1ZXN0c0ZhaWxpbmdQb2xpY3kgOj0gdHJ1ZSBjb25maWd1cmVzIHRoZSBBZ2VudCB0byAqYWxsb3cgYW55CiMgcmVxdWVzdHMgY2F1c2luZyBhIHBvbGljeSBmYWlsdXJlKi4gVGhpcyBpcyBhbiB1bnNlY3VyZSBjb25maWd1cmF0aW9uCiMgYnV0IGlzIHVzZWZ1bCBmb3IgYWxsb3dpbmcgdW5zZWN1cmUgcG9kcyB0byBzdGFydCwgdGhlbiBjb25uZWN0IHRvCiMgdGhlbSBhbmQgaW5zcGVjdCBPUEEgbG9ncyBmb3IgdGhlIHJvb3QgY2F1c2Ugb2YgYSBmYWlsdXJlLgpkZWZhdWx0IEFsbG93UmVxdWVzdHNGYWlsaW5nUG9saWN5IDo9IGZhbHNlCgojIENvbnN0YW50cwpTX05BTUVfS0VZID0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZSIKU19OQU1FU1BBQ0VfS0VZID0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZXNwYWNlIgpCVU5ETEVfSUQgPSAiW2EtejAtOV17NjR9IgoKQ3JlYXRlQ29udGFpbmVyUmVxdWVzdDo9IHJlc3AgewogICAgbm90IGlzX251bGwoaW5wdXQuZW52X21hcCkKICAgIAogICAgaV9lbnZfbWFwIDo9IGlucHV0LmVudl9tYXAKICAgIAogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBwX2Vudl9tYXAgOj0gcF9jb250YWluZXIuZW52X21hcCAgCiAgICBhbGxvd19lbnZfbWFwKHBfZW52X21hcCwgaV9lbnZfbWFwKQogICAgCiAgICBpX3Byb2Nlc3MgOj0gaW5wdXQuYmFzZS5PQ0kuUHJvY2VzcwogICAgCiAgICBwX3Byb2Nlc3MgOj0gcF9jb250YWluZXIuT0NJLlByb2Nlc3MKICAgIAogICAgYWxsb3dfYXJncyhpX3Byb2Nlc3MsIHBfcHJvY2VzcywgaV9lbnZfbWFwKQoKICAgIHJlc3AgPSBDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uKGlucHV0LmJhc2UpCiAgICBwcmludCgiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdDogdHJ1ZSIpCn0KCmFsbG93X2FyZ3MoaV9wcm9jZXNzLCBwX3Byb2Nlc3MsIGlfZW52X21hcCkgewogICAgaV9hcmdzIDo9IGlfcHJvY2Vzcy5BcmdzCiAgICBwX2FyZ3MgOj0gcF9wcm9jZXNzLkFyZ3MKICAgIHByaW50KCJhbGxvd19hcmdzOiBpX2FyZ3MgPSIsIGlfYXJncywgInBfYXJncyA9IiwgcF9hcmdzKQogICAgY291bnQoaV9hcmdzKSA9PSBjb3VudChwX2FyZ3MpCiAgICBldmVyeSBpLCBpX2FyZyBpbiBpX2FyZ3MgewogICAgICAgIHByaW50KCJhbGxvd19hcmdzOiBpX2FyZyA9IiwgaV9hcmcpCiAgICAgICAgcF9hcmdfcmVwbGFjZWQgOj0gcmVwbGFjZV9lbnZfdmFyaWFibGVzKHBfYXJnc1tpXSwgaV9lbnZfbWFwKQogICAgICAgIHByaW50KCJhbGxvd19hcmdzOiBwX2FyZ19yZXBsYWNlZCA9IiwgcF9hcmdfcmVwbGFjZWQpCiAgICAgICAgcF9hcmdfcmVwbGFjZWQyIDo9IHJlcGxhY2UocF9hcmdfcmVwbGFjZWQsICIkJCIsICIkIikKICAgICAgICBwcmludCgiYWxsb3dfYXJnczogcF9hcmdfcmVwbGFjZWQyID0iLCBwX2FyZ19yZXBsYWNlZDIpCiAgICAgICAgaV9hcmcgPT0gcF9hcmdfcmVwbGFjZWQyCiAgICB9CiAgICBwcmludCgiYWxsb3dfYXJnczogdHJ1ZSIpCn0KCmFsbG93X2FyZ3MoaV9wcm9jZXNzLCBwX3Byb2Nlc3MsIGlfZW52X21hcCkgewogICAgbm90IGlfcHJvY2Vzcy5BcmdzCiAgICBub3QgcF9wcm9jZXNzLkFyZ3MKICAgIHByaW50KCJhbGxvd19hcmdzMjogbm8gYXJncyIpCn0KCiMgdGhpcyBmdW5jdGlvbiByZXBsYWNlcyBhbGwgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyBpbiBhIHN0cmluZywgZ2l2ZW4gYSBtYXAgb2YgZW52aXJvbm1lbnQga2V5cyB0byBlbnZpcm9ubWVudCB2YWx1ZXMKIyBlZyBzdHIgPSAiZWNobyAkKENMVVNURVJfSUQpOyBlY2hvICQoTk9ERV9OQU1FKTsiCiMgZW52X21hcCA9IHsiQ0xVU1RFUl9JRCI6ICJhYmMiLCAiTk9ERV9OQU1FIiA6ICJ4eXoifQojIHJlc3VsdCA9ICJlY2hvIGFiYzsgZWNobyB4eXo7IgpyZXBsYWNlX2Vudl92YXJpYWJsZXMoc3RyLCBlbnZfbWFwKSA9IHJlc3VsdCB7CiAgICAjIG1ha2UgYW4gYXJyYXkgb2YgdGhlIGtleXMgZWcgWyJDTFVTVEVSX0lEIiwgIk5PREVfTkFNRSJdCiAgICBrZXlzIDo9IFt4IHwgc29tZSB4IGluIG9iamVjdC5rZXlzKGVudl9tYXApXQogICAgcmVzdWx0IDo9IHJlcGxhY2Vfc3RyX3JlYyhzdHIsIGVudl9tYXAsIGtleXMsIGNvdW50KGtleXMpIC0gMSkKfQoKIyBiYXNlIGNhc2UKcmVwbGFjZV9zdHJfcmVjKHN0ciwgZW52X21hcCwgYXJyX2tleXMsIGkpID0gcmVzdWx0IHsKICAgIGkgPCAwCiAgICByZXN1bHQgOj0gc3RyCn0KCiMgcmVjdXJzaXZlIHN0ZXAKcmVwbGFjZV9zdHJfcmVjKHN0ciwgZW52X21hcCwgYXJyX2tleXMsIGkpID0gcmVzdWx0IHsKICAgIGkgPj0gMAogICAga2V5IDo9IGFycl9rZXlzW2ldCiAgICBlbnZfa2V5MSA6PSBjb25jYXQoIiIsIFsiJCgiLCBrZXksICIpIl0pCiAgICAjIHJlcGxhY2UgJChWQVIpIHdpdGggdmFsdWUKICAgIG5ld19zdHIxIDo9IHJlcGxhY2Uoc3RyLCBlbnZfa2V5MSwgZW52X21hcFtrZXldKQogICAgIyByZXBsYWNlIG5leHQgZW52aXJvbm1lbnQgdmFyaWFibGUKICAgIHJlc3VsdCA9IHJlcGxhY2Vfc3RyX3JlYyhuZXdfc3RyMSwgZW52X21hcCwgYXJyX2tleXMsIGkgLSAxKQp9CgphbGxvd19lbnZfbWFwKHBfZW52X21hcCwgaV9lbnZfbWFwKSB7CiAgICBwcmludCgiYWxsb3dfZW52X21hcDogcF9lbnZfbWFwID0iLCBwX2Vudl9tYXApCiAgICBldmVyeSBlbnZfa2V5LCBlbnZfdmFsIGluIGlfZW52X21hcCB7CiAgICAgICAgcHJpbnQoImFsbG93X2VudjogZW52X2tleSA9IiwgZW52X2tleSwgImVudl92YWwgPSIsIGVudl92YWwpCiAgICAgICAgYWxsb3dfZW52X21hcF9lbnRyeShlbnZfa2V5LCBlbnZfdmFsLCBwX2Vudl9tYXApCiAgICB9CiAgICBwcmludCgiYWxsb3dfZW52X21hcDogdHJ1ZSIpCn0KCiMgQWxsb3cgZXhhY3QgbWF0Y2gKYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBpX3ZhbCA9PSBwX3ZhbAogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnk6IHRydWUiKQp9CgojIEFsbG93IHJlc291cmNlRmllbGRSZWYgdmFsdWVzIChlLmcuLCAibGltaXRzLmNwdSIpLgphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgICMgYSB2YXJpYWJsZSB3ZSBzaG91bGQgYmUgdmFsaWRhdGluZyB1c2luZyBhIHJlZ2V4IGZyb20gc2V0dGluZ3MKICAgIHBfdmFsID09ICIkKHZhbGlkYXRlLWZyb20tc2V0dGluZ3MpIgogICAgcmVnZXhfdmFsIDo9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuQ3JlYXRlQ29udGFpbmVyUmVxdWVzdC5hbGxvd19lbnZfcmVnZXhfbWFwW2tleV0KICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4X3ZhbCwgaV92YWwpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSAyOiB0cnVlIikKfQoKIyBBbGxvdyBub2RlLW5hbWUKYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChub2RlLW5hbWUpIgogICAgcmVnZXgubWF0Y2gocG9saWN5X2RhdGEuY29tbW9uLmRuc19zdWJkb21haW4gLCBpX3ZhbCkKICAgIHByaW50KCJhbGxvd19lbnZfbWFwX2VudHJ5IDM6IHRydWUiKQp9CgojIEFsbG93IGhvc3QtbmFtZQphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgIHBfdmFsID09ICIkKGhvc3QtbmFtZSkiCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24uZG5zX2xhYmVsICwgaV92YWwpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSA0OiB0cnVlIikKfQoKIyBBbGxvdyBwb2QtdWlkCmFsbG93X2Vudl9tYXBfZW50cnkoa2V5LCBpX3ZhbCwgcF9lbnZfbWFwKSB7CiAgICBwX3ZhbCA6PSBwX2Vudl9tYXBba2V5XQogICAgcF92YWwgPT0gIiQocG9kLXVpZCkiCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24ucG9kX3VpZCAsIGlfdmFsKQogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgNTogdHJ1ZSIpCn0KCiMgQWxsb3cgZmllbGRSZWYgImZpZWxkUGF0aDogc3RhdHVzLnBvZElQIiB2YWx1ZXMuCmFsbG93X2Vudl9tYXBfZW50cnkoa2V5LCBpX3ZhbCwgcF9lbnZfbWFwKSB7CiAgICBpc19pcChpX3ZhbCkKCiAgICBwX3ZhbCA6PSBwX2Vudl9tYXBba2V5XQogICAgcF92YXIgOj0gY29uY2F0KCI9IiwgW2tleSwgcF92YWxdKQogICAgYWxsb3dfcG9kX2lwX3ZhcihrZXksIHBfdmFyKQogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgNjogdHJ1ZSIpCn0KCiMgQWxsb3cgZmllbGRSZWYgImZpZWxkUGF0aDogc3RhdHVzLmhvc3RJUCIgdmFsdWVzLgphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgaXNfaXAoaV92YWwpCgogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgIHBfdmFyIDo9IGNvbmNhdCgiPSIsIFtrZXksIHBfdmFsXSkKICAgIGFsbG93X2hvc3RfaXBfdmFyKGtleSwgcF92YXIpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSA3OiB0cnVlIikKfQoKIyBNYXRjaCBpbnB1dCB3aXRoIG9uZSBvZiB0aGUgcG9saWN5IHZhcmlhYmxlcywgYWZ0ZXIgc3Vic3RpdHV0aW5nICQoc2FuZGJveC1uYW1lKS4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChzYW5kYm94LW5hbWUpIgogICAgc19uYW1lIDo9IGlucHV0LmJhc2UuT0NJLkFubm90YXRpb25zW1NfTkFNRV9LRVldCiAgICBwX3ZhcjIgOj0gcmVwbGFjZShwX3ZhbCwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHBfdmFyMiA9PSBpX3ZhbAogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgODogdHJ1ZSIpCn0KCiMgTWF0Y2ggaW5wdXQgd2l0aCBvbmUgb2YgdGhlIHBvbGljeSB2YXJpYWJsZXMsIGFmdGVyIHN1YnN0aXR1dGluZyAkKHNhbmRib3gtbmFtZXNwYWNlKS4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChzYW5kYm94LW5hbWVzcGFjZSkiCiAgICBzX25hbWVzcGFjZSA6PSBpbnB1dC5iYXNlLk9DSS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwX3ZhcjIgOj0gcmVwbGFjZShwX3ZhbCwgIiQoc2FuZGJveC1uYW1lc3BhY2UpIiwgc19uYW1lc3BhY2UpCiAgICBwX3ZhcjIgPT0gaV92YWwKICAgIHByaW50KCJhbGxvd19lbnZfbWFwX2VudHJ5IDk6IHRydWUiKQp9CgojIEFsbG93IGlucHV0IGVudiB2YXJpYWJsZXMgdGhhdCBtYXRjaCB3aXRoIGEgcmVxdWVzdF9kZWZhdWx0cyByZWdleC4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHNvbWUgcF9yZWdleDEgaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5DcmVhdGVDb250YWluZXJSZXF1ZXN0LmFsbG93X2Vudl9yZWdleAogICAgcF9yZWdleDIgOj0gcmVwbGFjZShwX3JlZ2V4MSwgIiQoaXB2NF9hKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcHY0X2EpCiAgICBwX3JlZ2V4MyA6PSByZXBsYWNlKHBfcmVnZXgyLCAiJChpcF9wKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcF9wKQogICAgcF9yZWdleDQgOj0gcmVwbGFjZShwX3JlZ2V4MywgIiQoc3ZjX25hbWUpIiwgcG9saWN5X2RhdGEuY29tbW9uLnN2Y19uYW1lKQogICAgcF9yZWdleDUgOj0gcmVwbGFjZShwX3JlZ2V4NCwgIiQoZG5zX2xhYmVsKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5kbnNfbGFiZWwpCgogICAgcmVzdWx0IDo9IGNvbmNhdCgiPSIsIFtrZXksIGlfdmFsXSkKICAgIHJlZ2V4Lm1hdGNoKHBfcmVnZXg1LCByZXN1bHQpCgogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgMTA6IHRydWUiKQp9CgpDcmVhdGVDb250YWluZXJSZXF1ZXN0Oj0gcmVzcCB7CiAgICBub3QgaW5wdXQuZW52X21hcAogICAgaV9wcm9jZXNzID0gaW5wdXQuT0NJLlByb2Nlc3MKICAgIHNfbmFtZSA9IGlucHV0Lk9DSS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBwX3Byb2Nlc3MgPSBwX2NvbnRhaW5lci5PQ0kuUHJvY2VzcwogICAgYWxsb3dfZGVwcmVjYXRlZF9hcmdzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUpCiAgICByZXNwID0gQ3JlYXRlQ29udGFpbmVyUmVxdWVzdENvbW1vbihpbnB1dCkKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0MjogdHJ1ZSIpCn0KCkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb24ocmVxKTo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgICMgQ2hlY2sgaWYgdGhlIGlucHV0IHJlcXVlc3Qgc2hvdWxkIGJlIHJlamVjdGVkIGV2ZW4gYmVmb3JlIGNoZWNraW5nIHRoZQogICAgIyBwb2xpY3lfZGF0YS5jb250YWluZXJzIGluZm9ybWF0aW9uLgogICAgYWxsb3dfY3JlYXRlX2NvbnRhaW5lcl9pbnB1dChyZXEpCgogICAgaV9vY2kgOj0gcmVxLk9DSQogICAgaV9zdG9yYWdlcyA6PSByZXEuc3RvcmFnZXMKICAgIGlfZGV2aWNlcyA6PSByZXEuZGV2aWNlcwoKICAgICMgYXJyYXkgb2YgcG9zc2libGUgc3RhdGUgb3BlcmF0aW9ucwogICAgb3BzX2J1aWxkZXIgOj0gW10KCiAgICAjIGNoZWNrIHNhbmRib3ggbmFtZQogICAgc2FuZGJveF9uYW1lID0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FX0tFWV0KICAgIGFkZF9zYW5kYm94X25hbWVfdG9fc3RhdGUgOj0gc3RhdGVfYWxsb3dzKCJzYW5kYm94X25hbWUiLCBzYW5kYm94X25hbWUpCiAgICBvcHNfYnVpbGRlcjEgOj0gY29uY2F0X29wX2lmX25vdF9udWxsKG9wc19idWlsZGVyLCBhZGRfc2FuZGJveF9uYW1lX3RvX3N0YXRlKQoKICAgICMgQ2hlY2sgaWYgYW55IGVsZW1lbnQgZnJvbSB0aGUgcG9saWN5X2RhdGEuY29udGFpbmVycyBhcnJheSBhbGxvd3MgdGhlIGlucHV0IHJlcXVlc3QuCiAgICBzb21lIHBfY29udGFpbmVyIGluIHBvbGljeV9kYXRhLmNvbnRhaW5lcnMKICAgIHByaW50KCI9PT09PT09PSBDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiB0cnlpbmcgbmV4dCBwb2xpY3kgY29udGFpbmVyIikKCiAgICBwX3BpZG5zIDo9IHBfY29udGFpbmVyLnNhbmRib3hfcGlkbnMKICAgIGlfcGlkbnMgOj0gcmVxLnNhbmRib3hfcGlkbnMKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiBwX3BpZG5zID0iLCBwX3BpZG5zLCAiaV9waWRucyA9IiwgaV9waWRucykKICAgIHBfcGlkbnMgPT0gaV9waWRucwoKICAgIHBfb2NpIDo9IHBfY29udGFpbmVyLk9DSQoKICAgICMgY2hlY2sgbmFtZXNwYWNlCiAgICBwX25hbWVzcGFjZSA6PSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBpX25hbWVzcGFjZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwcmludCAoIkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb246IHBfbmFtZXNwYWNlID0iLCBwX25hbWVzcGFjZSwgImlfbmFtZXNwYWNlID0iLCBpX25hbWVzcGFjZSkKICAgIGFkZF9uYW1lc3BhY2VfdG9fc3RhdGUgOj0gYWxsb3dfbmFtZXNwYWNlKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkKICAgIG9wc19idWlsZGVyMiA6PSBjb25jYXRfb3BfaWZfbm90X251bGwob3BzX2J1aWxkZXIxLCBhZGRfbmFtZXNwYWNlX3RvX3N0YXRlKQoKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiBwIFZlcnNpb24gPSIsIHBfb2NpLlZlcnNpb24sICJpIFZlcnNpb24gPSIsIGlfb2NpLlZlcnNpb24pCiAgICBwX29jaS5WZXJzaW9uID09IGlfb2NpLlZlcnNpb24KCiAgICBwcmludCgiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdENvbW1vbjogcCBSZWFkb25seSA9IiwgcF9vY2kuUm9vdC5SZWFkb25seSwgImkgUmVhZG9ubHkgPSIsIGlfb2NpLlJvb3QuUmVhZG9ubHkpCiAgICBwX29jaS5Sb290LlJlYWRvbmx5ID09IGlfb2NpLlJvb3QuUmVhZG9ubHkKCiAgICBhbGxvd19hbm5vKHBfb2NpLCBpX29jaSkKCiAgICBwX3N0b3JhZ2VzIDo9IHBfY29udGFpbmVyLnN0b3JhZ2VzCiAgICBhbGxvd19ieV9hbm5vKHBfb2NpLCBpX29jaSwgcF9zdG9yYWdlcywgaV9zdG9yYWdlcykKCiAgICBwX2RldmljZXMgOj0gcF9jb250YWluZXIuZGV2aWNlcwogICAgYWxsb3dfZGV2aWNlcyhwX2RldmljZXMsIGlfZGV2aWNlcykKCiAgICByZXQgOj0gYWxsb3dfbGludXgob3BzX2J1aWxkZXIyLCBwX29jaSwgaV9vY2kpCiAgICByZXQuYWxsb3dlZAoKICAgIG9wcyA6PSByZXQub3BzCgogICAgcHJpbnQoIkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb246IHRydWUiKQp9CgphbGxvd19jcmVhdGVfY29udGFpbmVyX2lucHV0KHJlcSkgewogICAgcHJpbnQoImFsbG93X2NyZWF0ZV9jb250YWluZXJfaW5wdXQ6IGlucHV0ID0iLCByZXEpCgogICAgY291bnQocmVxLnNoYXJlZF9tb3VudHMpID09IDAKICAgIGlzX251bGwocmVxLnN0cmluZ191c2VyKQoKICAgIGlfb2NpIDo9IHJlcS5PQ0kKICAgIGlzX251bGwoaV9vY2kuSG9va3MpCiAgICBpc19udWxsKGlfb2NpLlNvbGFyaXMpCiAgICBpc19udWxsKGlfb2NpLldpbmRvd3MpCgogICAgaV9saW51eCA6PSBpX29jaS5MaW51eAogICAgY291bnQoaV9saW51eC5HSURNYXBwaW5ncykgPT0gMAogICAgY291bnQoaV9saW51eC5Nb3VudExhYmVsKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlJlc291cmNlcy5EZXZpY2VzKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlJvb3Rmc1Byb3BhZ2F0aW9uKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlVJRE1hcHBpbmdzKSA9PSAwCiAgICBpc19udWxsKGlfbGludXguSW50ZWxSZHQpCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLkJsb2NrSU8pCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLk5ldHdvcmspCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLlBpZHMpCiAgICBpc19udWxsKGlfbGludXguU2VjY29tcCkKCiAgICBpX3Byb2Nlc3MgOj0gaV9vY2kuUHJvY2VzcwogICAgY291bnQoaV9wcm9jZXNzLlNlbGludXhMYWJlbCkgPT0gMAogICAgY291bnQoaV9wcm9jZXNzLlVzZXIuVXNlcm5hbWUpID09IDAKCiAgICBwcmludCgiYWxsb3dfY3JlYXRlX2NvbnRhaW5lcl9pbnB1dDogdHJ1ZSIpCn0KCmFsbG93X25hbWVzcGFjZShwX25hbWVzcGFjZSwgaV9uYW1lc3BhY2UpID0gYWRkX25hbWVzcGFjZSB7CiAgICBwX25hbWVzcGFjZSA9PSBpX25hbWVzcGFjZQogICAgYWRkX25hbWVzcGFjZSA6PSBudWxsCiAgICBwcmludCgiYWxsb3dfbmFtZXNwYWNlIDE6IGlucHV0IG5hbWVzcGFjZSBtYXRjaGVzIHBvbGljeSBkYXRhIikKfQoKYWxsb3dfbmFtZXNwYWNlKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkgPSBhZGRfbmFtZXNwYWNlIHsKICAgIHBfbmFtZXNwYWNlID09ICIiCiAgICBwcmludCgiYWxsb3dfbmFtZXNwYWNlIDI6IG5vIG5hbWVzcGFjZSBmb3VuZCBvbiBwb2xpY3kgZGF0YSIpCiAgICBhZGRfbmFtZXNwYWNlIDo9IHN0YXRlX2FsbG93cygibmFtZXNwYWNlIiwgaV9uYW1lc3BhY2UpCn0KCiMgdmFsdWUgaGFzbid0IGJlZW4gc2VlbiBiZWZvcmUsIHNhdmUgaXQgdG8gc3RhdGUKc3RhdGVfYWxsb3dzKGtleSwgdmFsdWUpID0gYWN0aW9uIHsKICBzdGF0ZSA6PSBnZXRfc3RhdGUoKQogIHByaW50KCJzdGF0ZV9hbGxvd3MgMTogc3RhdGVba2V5XSA9Iiwgc3RhdGVba2V5XSwgInZhbHVlID0iLCB2YWx1ZSkKICBub3Qgc3RhdGVba2V5XQogIHByaW50KCJzdGF0ZV9hbGxvd3MgMTogc2F2aW5nIHRvIHN0YXRlIGtleSA9Iiwga2V5LCAidmFsdWUgPSIsIHZhbHVlKQogIHBhdGggOj0gZ2V0X3N0YXRlX3BhdGgoa2V5KSAKICBhY3Rpb24gOj0gewogICAgIm9wIjogImFkZCIsCiAgICAicGF0aCI6IHBhdGgsIAogICAgInZhbHVlIjogdmFsdWUsCiAgfQp9CgojIHZhbHVlIG1hdGNoZXMgd2hhdCdzIGluIHN0YXRlLCBhbGxvdyBpdApzdGF0ZV9hbGxvd3Moa2V5LCB2YWx1ZSkgPSBhY3Rpb24gewogIHByaW50KCJzdGF0ZV9hbGxvd3MgMjogc3RhcnQiKQogIHN0YXRlIDo9IGdldF9zdGF0ZSgpCiAgcHJpbnQoInN0YXRlX2FsbG93cyAyOiBzdGF0ZVtrZXldID0iLCBzdGF0ZVtrZXldLCAidmFsdWUgPSIsIHZhbHVlKQogIHZhbHVlID09IHN0YXRlW2tleV0KICBwcmludCgic3RhdGVfYWxsb3dzIDI6IGZvdW5kIGtleSA9Iiwga2V5LCAidmFsdWUgPSIsIHZhbHVlLCAiIGluIHN0YXRlIikKICBhY3Rpb24gOj0gbnVsbAp9CgojIGhlbHBlciBmdW5jdGlvbnMgdG8gaW50ZXJhY3Qgd2l0aCB0aGUgc3RhdGUKZ2V0X3N0YXRlKCkgPSBzdGF0ZSB7CiAgc3RhdGUgOj0gZGF0YVsicHN0YXRlIl0KfQoKZ2V0X3N0YXRlX3ZhbChrZXkpID0gdmFsdWUgewogICAgc3RhdGUgOj0gZ2V0X3N0YXRlKCkKICAgIHZhbHVlIDo9IHN0YXRlW2tleV0KfQoKZ2V0X3N0YXRlX3BhdGgoa2V5KSA9IHBhdGggewogICAgIyBwcmVwZW5kICIvcHN0YXRlLyIgdG8ga2V5CiAgICBwYXRoIDo9IGNvbmNhdCgiLyIsIFsiL3BzdGF0ZSIsIGtleV0pCn0KCiMgSGVscGVyIGZ1bmN0aW9ucyB0byBjb25kaXRpb25hbGx5IGNvbmNhdGVuYXRlIG9wIGlzIG5vdCBudWxsCmNvbmNhdF9vcF9pZl9ub3RfbnVsbChvcHMsIG9wKSA9IHJlc3VsdCB7CiAgICBvcCA9PSBudWxsCiAgICByZXN1bHQgOj0gb3BzCn0KCmNvbmNhdF9vcF9pZl9ub3RfbnVsbChvcHMsIG9wKSA9IHJlc3VsdCB7CiAgICBvcCAhPSBudWxsCiAgICByZXN1bHQgOj0gYXJyYXkuY29uY2F0KG9wcywgW29wXSkKfQoKIyBSZWplY3QgdW5leHBlY3RlZCBhbm5vdGF0aW9ucy4KYWxsb3dfYW5ubyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19hbm5vIDE6IHN0YXJ0IikKCiAgICBub3QgaV9vY2kuQW5ub3RhdGlvbnMKCiAgICBwcmludCgiYWxsb3dfYW5ubyAxOiB0cnVlIikKfQphbGxvd19hbm5vKHBfb2NpLCBpX29jaSkgewogICAgcHJpbnQoImFsbG93X2Fubm8gMjogcCBBbm5vdGF0aW9ucyA9IiwgcF9vY2kuQW5ub3RhdGlvbnMpCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiBpIEFubm90YXRpb25zID0iLCBpX29jaS5Bbm5vdGF0aW9ucykKCiAgICBpX2tleXMgOj0gb2JqZWN0LmtleXMoaV9vY2kuQW5ub3RhdGlvbnMpCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiBpIGtleXMgPSIsIGlfa2V5cykKCiAgICBldmVyeSBpX2tleSBpbiBpX2tleXMgewogICAgICAgIGFsbG93X2Fubm9fa2V5KGlfa2V5LCBwX29jaSkKICAgIH0KCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiB0cnVlIikKfQoKYWxsb3dfYW5ub19rZXkoaV9rZXksIHBfb2NpKSB7CiAgICBwcmludCgiYWxsb3dfYW5ub19rZXkgMTogaSBrZXkgPSIsIGlfa2V5KQoKICAgIHN0YXJ0c3dpdGgoaV9rZXksICJpby5rdWJlcm5ldGVzLmNyaS4iKQoKICAgIHByaW50KCJhbGxvd19hbm5vX2tleSAxOiB0cnVlIikKfQphbGxvd19hbm5vX2tleShpX2tleSwgcF9vY2kpIHsKICAgIHByaW50KCJhbGxvd19hbm5vX2tleSAyOiBpIGtleSA9IiwgaV9rZXkpCgogICAgc29tZSBwX2tleSwgXyBpbiBwX29jaS5Bbm5vdGF0aW9ucwogICAgcF9rZXkgPT0gaV9rZXkKCiAgICBwcmludCgiYWxsb3dfYW5ub19rZXkgMjogdHJ1ZSIpCn0KCiMgR2V0IHRoZSB2YWx1ZSBvZiB0aGUgU19OQU1FX0tFWSBhbm5vdGF0aW9uIGFuZAojIGNvcnJlbGF0ZSBpdCB3aXRoIG90aGVyIGFubm90YXRpb25zIGFuZCBwcm9jZXNzIGZpZWxkcy4KYWxsb3dfYnlfYW5ubyhwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpIHsKICAgIHByaW50KCJhbGxvd19ieV9hbm5vIDE6IHN0YXJ0IikKCiAgICBub3QgcF9vY2kuQW5ub3RhdGlvbnNbU19OQU1FX0tFWV0KCiAgICBpX3NfbmFtZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMTogaV9zX25hbWUgPSIsIGlfc19uYW1lKQoKICAgIGlfc19uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FU1BBQ0VfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMTogaV9zX25hbWVzcGFjZSA9IiwgaV9zX25hbWVzcGFjZSkKCiAgICBhbGxvd19ieV9zYW5kYm94X25hbWUocF9vY2ksIGlfb2NpLCBwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBpX3NfbmFtZSwgaV9zX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfYnlfYW5ubyAxOiB0cnVlIikKfQphbGxvd19ieV9hbm5vKHBfb2NpLCBpX29jaSwgcF9zdG9yYWdlcywgaV9zdG9yYWdlcykgewogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMjogc3RhcnQiKQoKICAgIHBfc19uYW1lIDo9IHBfb2NpLkFubm90YXRpb25zW1NfTkFNRV9LRVldCiAgICBpX3NfbmFtZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMjogaV9zX25hbWUgPSIsIGlfc19uYW1lLCAicF9zX25hbWUgPSIsIHBfc19uYW1lKQoKICAgIGFsbG93X3NhbmRib3hfbmFtZShwX3NfbmFtZSwgaV9zX25hbWUpCgogICAgaV9zX25hbWVzcGFjZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwcmludCgiYWxsb3dfYnlfYW5ubyAyOiBpX3NfbmFtZXNwYWNlID0iLCBpX3NfbmFtZXNwYWNlKQoKICAgIGFsbG93X2J5X3NhbmRib3hfbmFtZShwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMsIGlfc19uYW1lLCBpX3NfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd19ieV9hbm5vIDI6IHRydWUiKQp9CgphbGxvd19ieV9zYW5kYm94X25hbWUocF9vY2ksIGlfb2NpLCBwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfYnlfc2FuZGJveF9uYW1lOiBzdGFydCIpCgogICAgaV9uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FU1BBQ0VfS0VZXQoKICAgIGFsbG93X2J5X2NvbnRhaW5lcl90eXBlcyhwX29jaSwgaV9vY2ksIHNfbmFtZSwgaV9uYW1lc3BhY2UpCiAgICBhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZChwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpCiAgICBhbGxvd19wcm9jZXNzKHBfb2NpLlByb2Nlc3MsIGlfb2NpLlByb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpCgogICAgcHJpbnQoImFsbG93X2J5X3NhbmRib3hfbmFtZTogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfbmFtZShwX3NfbmFtZSwgaV9zX25hbWUpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X25hbWU6IHN0YXJ0IikKICAgIHJlZ2V4Lm1hdGNoKHBfc19uYW1lLCBpX3NfbmFtZSkKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9uYW1lOiB0cnVlIikKfQoKIyBDaGVjayB0aGF0IHRoZSAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLXR5cGUiIGFuZAojICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIiBhbm5vdGF0aW9ucyBkZXNpZ25hdGUgdGhlCiMgZXhwZWN0ZWQgdHlwZSAtIGVpdGhlciBhICJzYW5kYm94IiBvciBhICJjb250YWluZXIiLiBUaGVuLCB2YWxpZGF0ZQojIG90aGVyIGFubm90YXRpb25zIGJhc2VkIG9uIHRoZSBhY3R1YWwgInNhbmRib3giIG9yICJjb250YWluZXIiIHZhbHVlCiMgZnJvbSB0aGUgaW5wdXQgY29udGFpbmVyLgphbGxvd19ieV9jb250YWluZXJfdHlwZXMocF9vY2ksIGlfb2NpLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfYnlfY29udGFpbmVyX3R5cGVzOiBjaGVja2luZyBpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSIpCgogICAgY190eXBlIDo9ICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSIKICAgIAogICAgcF9jcmlfdHlwZSA6PSBwX29jaS5Bbm5vdGF0aW9uc1tjX3R5cGVdCiAgICBpX2NyaV90eXBlIDo9IGlfb2NpLkFubm90YXRpb25zW2NfdHlwZV0KICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZXM6IHBfY3JpX3R5cGUgPSIsIHBfY3JpX3R5cGUsICJpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgcF9jcmlfdHlwZSA9PSBpX2NyaV90eXBlCgogICAgYWxsb3dfYnlfY29udGFpbmVyX3R5cGUoaV9jcmlfdHlwZSwgcF9vY2ksIGlfb2NpLCBzX25hbWUsIHNfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZXM6IHRydWUiKQp9CgphbGxvd19ieV9jb250YWluZXJfdHlwZShpX2NyaV90eXBlLCBwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAxOiBpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgaV9jcmlfdHlwZSA9PSAic2FuZGJveCIKCiAgICBpX2thdGFfdHlwZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1siaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5jb250YWluZXJfdHlwZSJdCiAgICBwcmludCgiYWxsb3dfYnlfY29udGFpbmVyX3R5cGUgMTogaV9rYXRhX3R5cGUgPSIsIGlfa2F0YV90eXBlKQogICAgaV9rYXRhX3R5cGUgPT0gInBvZF9zYW5kYm94IgoKICAgIGFsbG93X3NhbmRib3hfY29udGFpbmVyX25hbWUocF9vY2ksIGlfb2NpKQogICAgYWxsb3dfc2FuZGJveF9uZXRfbmFtZXNwYWNlKHBfb2NpLCBpX29jaSkKICAgIGFsbG93X3NhbmRib3hfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpCgogICAgcHJpbnQoImFsbG93X2J5X2NvbnRhaW5lcl90eXBlIDE6IHRydWUiKQp9CgphbGxvd19ieV9jb250YWluZXJfdHlwZShpX2NyaV90eXBlLCBwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiBpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgaV9jcmlfdHlwZSA9PSAiY29udGFpbmVyIgoKICAgIGlfa2F0YV90eXBlIDo9IGlfb2NpLkFubm90YXRpb25zWyJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIl0KICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiBpX2thdGFfdHlwZSA9IiwgaV9rYXRhX3R5cGUpCiAgICBpX2thdGFfdHlwZSA9PSAicG9kX2NvbnRhaW5lciIKCiAgICBhbGxvd19jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpCiAgICBhbGxvd19uZXRfbmFtZXNwYWNlKHBfb2NpLCBpX29jaSkKICAgIGFsbG93X2xvZ19kaXJlY3RvcnkocF9vY2ksIGlfb2NpKQoKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiB0cnVlIikKfQoKIyAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLW5hbWUiIGFubm90YXRpb24KYWxsb3dfc2FuZGJveF9jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X2NvbnRhaW5lcl9uYW1lOiBzdGFydCIpCgogICAgY29udGFpbmVyX2Fubm90YXRpb25fbWlzc2luZyhwX29jaSwgaV9vY2ksICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItbmFtZSIpCgogICAgcHJpbnQoImFsbG93X3NhbmRib3hfY29udGFpbmVyX25hbWU6IHRydWUiKQp9CgphbGxvd19jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19jb250YWluZXJfbmFtZTogc3RhcnQiKQoKICAgIGFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uKHBfb2NpLCBpX29jaSwgImlvLmt1YmVybmV0ZXMuY3JpLmNvbnRhaW5lci1uYW1lIikKCiAgICBwcmludCgiYWxsb3dfY29udGFpbmVyX25hbWU6IHRydWUiKQp9Cgpjb250YWluZXJfYW5ub3RhdGlvbl9taXNzaW5nKHBfb2NpLCBpX29jaSwga2V5KSB7CiAgICBwcmludCgiY29udGFpbmVyX2Fubm90YXRpb25fbWlzc2luZzoiLCBrZXkpCgogICAgbm90IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIG5vdCBpX29jaS5Bbm5vdGF0aW9uc1trZXldCgogICAgcHJpbnQoImNvbnRhaW5lcl9hbm5vdGF0aW9uX21pc3Npbmc6IHRydWUiKQp9CgphbGxvd19jb250YWluZXJfYW5ub3RhdGlvbihwX29jaSwgaV9vY2ksIGtleSkgewogICAgcHJpbnQoImFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uOiBrZXkgPSIsIGtleSkKCiAgICBwX3ZhbHVlIDo9IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIGlfdmFsdWUgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgcHJpbnQoImFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uOiBwX3ZhbHVlID0iLCBwX3ZhbHVlLCAiaV92YWx1ZSA9IiwgaV92YWx1ZSkKCiAgICBwX3ZhbHVlID09IGlfdmFsdWUKCiAgICBwcmludCgiYWxsb3dfY29udGFpbmVyX2Fubm90YXRpb246IHRydWUiKQp9CgojICJuZXJkY3RsL25ldHdvcmstbmFtZXNwYWNlIiBhbm5vdGF0aW9uCmFsbG93X3NhbmRib3hfbmV0X25hbWVzcGFjZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X25ldF9uYW1lc3BhY2U6IHN0YXJ0IikKCiAgICBrZXkgOj0gIm5lcmRjdGwvbmV0d29yay1uYW1lc3BhY2UiCgogICAgcF9uYW1lc3BhY2UgOj0gcF9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgaV9uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgcHJpbnQoImFsbG93X3NhbmRib3hfbmV0X25hbWVzcGFjZTogcF9uYW1lc3BhY2UgPSIsIHBfbmFtZXNwYWNlLCAiaV9uYW1lc3BhY2UgPSIsIGlfbmFtZXNwYWNlKQoKICAgIHJlZ2V4Lm1hdGNoKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9uZXRfbmFtZXNwYWNlOiB0cnVlIikKfQoKYWxsb3dfbmV0X25hbWVzcGFjZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19uZXRfbmFtZXNwYWNlOiBzdGFydCIpCgogICAga2V5IDo9ICJuZXJkY3RsL25ldHdvcmstbmFtZXNwYWNlIgoKICAgIG5vdCBwX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICBub3QgaV9vY2kuQW5ub3RhdGlvbnNba2V5XQoKICAgIHByaW50KCJhbGxvd19uZXRfbmFtZXNwYWNlOiB0cnVlIikKfQoKIyAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1sb2ctZGlyZWN0b3J5IiBhbm5vdGF0aW9uCmFsbG93X3NhbmRib3hfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X2xvZ19kaXJlY3Rvcnk6IHN0YXJ0IikKCiAgICBrZXkgOj0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbG9nLWRpcmVjdG9yeSIKCiAgICBwX2RpciA6PSBwX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICByZWdleDEgOj0gcmVwbGFjZShwX2RpciwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHJlZ2V4MiA6PSByZXBsYWNlKHJlZ2V4MSwgIiQoc2FuZGJveC1uYW1lc3BhY2UpIiwgc19uYW1lc3BhY2UpCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiByZWdleDIgPSIsIHJlZ2V4MikKCiAgICBpX2RpciA6PSBpX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiBpX2RpciA9IiwgaV9kaXIpCgogICAgcmVnZXgubWF0Y2gocmVnZXgyLCBpX2RpcikKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiB0cnVlIikKfQoKYWxsb3dfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19sb2dfZGlyZWN0b3J5OiBzdGFydCIpCgogICAga2V5IDo9ICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWxvZy1kaXJlY3RvcnkiCgogICAgbm90IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIG5vdCBpX29jaS5Bbm5vdGF0aW9uc1trZXldCgogICAgcHJpbnQoImFsbG93X2xvZ19kaXJlY3Rvcnk6IHRydWUiKQp9CgphbGxvd19kZXZpY2VzKHBfZGV2aWNlcywgaV9kZXZpY2VzKSB7CiAgICBwcmludCgiYWxsb3dfZGV2aWNlczogc3RhcnQiKQogICAgZXZlcnkgaV9kZXZpY2UgaW4gaV9kZXZpY2VzIHsKICAgICAgICBwcmludCgiYWxsb3dfZGV2aWNlczogaV9kZXZpY2UgPSIsIGlfZGV2aWNlKQogICAgICAgIHNvbWUgcF9kZXZpY2UgaW4gcF9kZXZpY2VzCiAgICAgICAgcF9kZXZpY2UuY29udGFpbmVyX3BhdGggPT0gaV9kZXZpY2UuY29udGFpbmVyX3BhdGgKICAgIH0KICAgIHByaW50KCJhbGxvd19kZXZpY2VzOiB0cnVlIikKfQoKYWxsb3dfbGludXgoc3RhdGVfb3BzLCBwX29jaSwgaV9vY2kpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIHBfbmFtZXNwYWNlcyA6PSBwX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbGludXg6IHAgbmFtZXNwYWNlcyA9IiwgcF9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlcyA6PSBpX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbGludXg6IGkgbmFtZXNwYWNlcyA9IiwgaV9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlX3dpdGhvdXRfbmV0d29yayA6PSBbb2JqIHwgb2JqIDo9IGlfbmFtZXNwYWNlc1tfXTsgb2JqLlR5cGUgIT0gIm5ldHdvcmsiXQoKICAgIHByaW50KCJhbGxvd19saW51eDogaV9uYW1lc3BhY2Vfd2l0aG91dF9uZXR3b3JrID0iLCBpX25hbWVzcGFjZV93aXRob3V0X25ldHdvcmspCgogICAgcF9uYW1lc3BhY2VzID09IGlfbmFtZXNwYWNlX3dpdGhvdXRfbmV0d29yawoKICAgIGFsbG93X21hc2tlZF9wYXRocyhwX29jaSwgaV9vY2kpCiAgICBhbGxvd19yZWFkb25seV9wYXRocyhwX29jaSwgaV9vY2kpCiAgICBhbGxvd19saW51eF9kZXZpY2VzKHBfb2NpLkxpbnV4LkRldmljZXMsIGlfb2NpLkxpbnV4LkRldmljZXMpCiAgICBhbGxvd19saW51eF9zeXNjdGwocF9vY2kuTGludXgsIGlfb2NpLkxpbnV4KQogICAgcmV0IDo9IGFsbG93X25ldHdvcmtfbmFtZXNwYWNlX3N0YXJ0KHN0YXRlX29wcywgcF9vY2ksIGlfb2NpKQogICAgcmV0LmFsbG93ZWQKCiAgICBvcHMgOj0gcmV0Lm9wcwoKICAgIHByaW50KCJhbGxvd19saW51eDogdHJ1ZSIpCn0KCiMgUmV0cmlldmUgdGhlICJuZXR3b3JrIiBuYW1lc3BhY2UgZnJvbSB0aGUgaW5wdXQgZGF0YSBhbmQgcGFzcyBpdCBvbiBmb3IgdGhlCiMgbmV0d29yayBuYW1lc3BhY2UgcG9saWN5IGNoZWNrcy4KYWxsb3dfbmV0d29ya19uYW1lc3BhY2Vfc3RhcnQoc3RhdGVfb3BzLCBwX29jaSwgaV9vY2kpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIHByaW50KCJhbGxvd19uZXR3b3JrX25hbWVzcGFjZSBzdGFydDogc3RhcnQiKQoKICAgIHBfbmFtZXNwYWNlcyA6PSBwX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IHAgbmFtZXNwYWNlcyA9IiwgcF9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlcyA6PSBpX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IGkgbmFtZXNwYWNlcyA9IiwgaV9uYW1lc3BhY2VzKQoKICAgICMgUmV0dXJuIHBhdGggb2YgdGhlICJuZXR3b3JrIiBuYW1lc3BhY2UKICAgIG5ldHdvcmtfbnMgOj0gW29iaiB8IG9iaiA6PSBpX25hbWVzcGFjZXNbX107IG9iai5UeXBlID09ICJuZXR3b3JrIl0KCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IG5ldHdvcmtfbnMgPSIsIG5ldHdvcmtfbnMpCgogICAgcmV0IDo9IGFsbG93X25ldHdvcmtfbmFtZXNwYWNlKHN0YXRlX29wcywgbmV0d29ya19ucykKICAgIHJldC5hbGxvd2VkCgogICAgb3BzIDo9IHJldC5vcHMKfQoKIyBUaGlzIHJ1bGUgaXMgd2hlbiB0aGVyZSdzIG5vIG5ldHdvcmsgbmFtZXNwYWNlIGluIHRoZSBpbnB1dCBkYXRhLgphbGxvd19uZXR3b3JrX25hbWVzcGFjZShzdGF0ZV9vcHMsIG5ldHdvcmtfbnMpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIGNvdW50KG5ldHdvcmtfbnMpID09IDAKCiAgICBuZXR3b3JrX25zX3BhdGggPSAiIgoKICAgIGFkZF9uZXR3b3JrX25hbWVzcGFjZV90b19zdGF0ZSA6PSBzdGF0ZV9hbGxvd3MoIm5ldHdvcmtfbmFtZXNwYWNlIiwgbmV0d29ya19uc19wYXRoKQogICAgb3BzIDo9IGNvbmNhdF9vcF9pZl9ub3RfbnVsbChzdGF0ZV9vcHMsIGFkZF9uZXR3b3JrX25hbWVzcGFjZV90b19zdGF0ZSkKCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2UgMTogdHJ1ZSIpCn0KCiMgVGhpcyBydWxlIGlzIHdoZW4gdGhlcmUncyBleGFjdGx5IG9uZSBuZXR3b3JrIG5hbWVzcGFjZSBpbiB0aGUgaW5wdXQgZGF0YS4KYWxsb3dfbmV0d29ya19uYW1lc3BhY2Uoc3RhdGVfb3BzLCBuZXR3b3JrX25zKSA6PSB7Im9wcyI6IG9wcywgImFsbG93ZWQiOiB0cnVlfSB7CiAgICBjb3VudChuZXR3b3JrX25zKSA9PSAxCgogICAgYWRkX25ldHdvcmtfbmFtZXNwYWNlX3RvX3N0YXRlIDo9IHN0YXRlX2FsbG93cygibmV0d29ya19uYW1lc3BhY2UiLCBuZXR3b3JrX25zWzBdLlBhdGgpCiAgICBvcHMgOj0gY29uY2F0X29wX2lmX25vdF9udWxsKHN0YXRlX29wcywgYWRkX25ldHdvcmtfbmFtZXNwYWNlX3RvX3N0YXRlKQoKICAgIHByaW50KCJhbGxvd19uZXR3b3JrX25hbWVzcGFjZSAyOiB0cnVlIikKfQoKYWxsb3dfbWFza2VkX3BhdGhzKHBfb2NpLCBpX29jaSkgewogICAgcF9wYXRocyA6PSBwX29jaS5MaW51eC5NYXNrZWRQYXRocwogICAgcHJpbnQoImFsbG93X21hc2tlZF9wYXRocyAxOiBwX3BhdGhzID0iLCBwX3BhdGhzKQoKICAgIGlfcGF0aHMgOj0gaV9vY2kuTGludXguTWFza2VkUGF0aHMKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aHMgMTogaV9wYXRocyA9IiwgaV9wYXRocykKCiAgICBhbGxvd19tYXNrZWRfcGF0aHNfYXJyYXkocF9wYXRocywgaV9wYXRocykKCiAgICBwcmludCgiYWxsb3dfbWFza2VkX3BhdGhzIDE6IHRydWUiKQp9CmFsbG93X21hc2tlZF9wYXRocyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aHMgMjogc3RhcnQiKQoKICAgIG5vdCBwX29jaS5MaW51eC5NYXNrZWRQYXRocwogICAgbm90IGlfb2NpLkxpbnV4Lk1hc2tlZFBhdGhzCgogICAgcHJpbnQoImFsbG93X21hc2tlZF9wYXRocyAyOiB0cnVlIikKfQoKIyBBbGwgdGhlIHBvbGljeSBtYXNrZWQgcGF0aHMgbXVzdCBiZSBtYXNrZWQgaW4gdGhlIGlucHV0IGRhdGEgdG9vLgojIElucHV0IGlzIGFsbG93ZWQgdG8gaGF2ZSBtb3JlIG1hc2tlZCBwYXRocyB0aGFuIHRoZSBwb2xpY3kuCmFsbG93X21hc2tlZF9wYXRoc19hcnJheShwX2FycmF5LCBpX2FycmF5KSB7CiAgICBldmVyeSBwX2VsZW0gaW4gcF9hcnJheSB7CiAgICAgICAgYWxsb3dfbWFza2VkX3BhdGgocF9lbGVtLCBpX2FycmF5KQogICAgfQp9CgphbGxvd19tYXNrZWRfcGF0aChwX2VsZW0sIGlfYXJyYXkpIHsKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aDogcF9lbGVtID0iLCBwX2VsZW0pCgogICAgc29tZSBpX2VsZW0gaW4gaV9hcnJheQogICAgcF9lbGVtID09IGlfZWxlbQoKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aDogdHJ1ZSIpCn0KCmFsbG93X3JlYWRvbmx5X3BhdGhzKHBfb2NpLCBpX29jaSkgewogICAgcF9wYXRocyA6PSBwX29jaS5MaW51eC5SZWFkb25seVBhdGhzCiAgICBwcmludCgiYWxsb3dfcmVhZG9ubHlfcGF0aHMgMTogcF9wYXRocyA9IiwgcF9wYXRocykKCiAgICBpX3BhdGhzIDo9IGlfb2NpLkxpbnV4LlJlYWRvbmx5UGF0aHMKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAxOiBpX3BhdGhzID0iLCBpX3BhdGhzKQoKICAgIGFsbG93X3JlYWRvbmx5X3BhdGhzX2FycmF5KHBfcGF0aHMsIGlfcGF0aHMsIGlfb2NpLkxpbnV4Lk1hc2tlZFBhdGhzKQoKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAxOiB0cnVlIikKfQphbGxvd19yZWFkb25seV9wYXRocyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAyOiBzdGFydCIpCgogICAgbm90IHBfb2NpLkxpbnV4LlJlYWRvbmx5UGF0aHMKICAgIG5vdCBpX29jaS5MaW51eC5SZWFkb25seVBhdGhzCgogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGhzIDI6IHRydWUiKQp9CgojIEFsbCB0aGUgcG9saWN5IHJlYWRvbmx5IHBhdGhzIG11c3QgYmUgZWl0aGVyOgojIC0gUHJlc2VudCBpbiB0aGUgaW5wdXQgcmVhZG9ubHkgcGF0aHMsIG9yCiMgLSBQcmVzZW50IGluIHRoZSBpbnB1dCBtYXNrZWQgcGF0aHMuCiMgSW5wdXQgaXMgYWxsb3dlZCB0byBoYXZlIG1vcmUgcmVhZG9ubHkgcGF0aHMgdGhhbiB0aGUgcG9saWN5LgphbGxvd19yZWFkb25seV9wYXRoc19hcnJheShwX2FycmF5LCBpX2FycmF5LCBtYXNrZWRfcGF0aHMpIHsKICAgIGV2ZXJ5IHBfZWxlbSBpbiBwX2FycmF5IHsKICAgICAgICBhbGxvd19yZWFkb25seV9wYXRoKHBfZWxlbSwgaV9hcnJheSwgbWFza2VkX3BhdGhzKQogICAgfQp9CgphbGxvd19yZWFkb25seV9wYXRoKHBfZWxlbSwgaV9hcnJheSwgbWFza2VkX3BhdGhzKSB7CiAgICBwcmludCgiYWxsb3dfcmVhZG9ubHlfcGF0aCAxOiBwX2VsZW0gPSIsIHBfZWxlbSkKCiAgICBzb21lIGlfZWxlbSBpbiBpX2FycmF5CiAgICBwX2VsZW0gPT0gaV9lbGVtCgogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGggMTogdHJ1ZSIpCn0KYWxsb3dfcmVhZG9ubHlfcGF0aChwX2VsZW0sIGlfYXJyYXksIG1hc2tlZF9wYXRocykgewogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGggMjogcF9lbGVtID0iLCBwX2VsZW0pCgogICAgc29tZSBpX21hc2tlZCBpbiBtYXNrZWRfcGF0aHMKICAgIHBfZWxlbSA9PSBpX21hc2tlZAoKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRoIDI6IHRydWUiKQp9CgphbGxvd19saW51eF9kZXZpY2VzKHBfZGV2aWNlcywgaV9kZXZpY2VzKSB7CiAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogc3RhcnQiKQogICAgZXZlcnkgaV9kZXZpY2UgaW4gaV9kZXZpY2VzIHsKICAgICAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogaV9kZXZpY2UgPSIsIGlfZGV2aWNlKQogICAgICAgIHNvbWUgcF9kZXZpY2UgaW4gcF9kZXZpY2VzCiAgICAgICAgaV9kZXZpY2UuUGF0aCA9PSBwX2RldmljZS5QYXRoCiAgICB9CiAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogdHJ1ZSIpCn0KCmFsbG93X2xpbnV4X3N5c2N0bChwX2xpbnV4LCBpX2xpbnV4KSB7CiAgICBwcmludCgiYWxsb3dfbGludXhfc3lzY3RsIDE6IHN0YXJ0IikKICAgIG5vdCBpX2xpbnV4LlN5c2N0bAogICAgcHJpbnQoImFsbG93X2xpbnV4X3N5c2N0bCAxOiB0cnVlIikKfQoKYWxsb3dfbGludXhfc3lzY3RsKHBfbGludXgsIGlfbGludXgpIHsKICAgIHByaW50KCJhbGxvd19saW51eF9zeXNjdGwgMjogc3RhcnQiKQogICAgcF9zeXNjdGwgOj0gcF9saW51eC5TeXNjdGwKICAgIGlfc3lzY3RsIDo9IGlfbGludXguU3lzY3RsCiAgICBldmVyeSBpX25hbWUsIGlfdmFsIGluIGlfc3lzY3RsIHsKICAgICAgICBwcmludCgiYWxsb3dfbGludXhfc3lzY3RsIDI6IGlfbmFtZSA9IiwgaV9uYW1lLCAiaV92YWwgPSIsIGlfdmFsKQogICAgICAgIHBfc3lzY3RsW2lfbmFtZV0gPT0gaV92YWwKICAgIH0KICAgIHByaW50KCJhbGxvd19saW51eF9zeXNjdGwgMjogdHJ1ZSIpCn0KCiMgQ2hlY2sgdGhlIGNvbnNpc3RlbmN5IG9mIHRoZSBpbnB1dCAiaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5idW5kbGVfcGF0aCIKIyBhbmQgaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCIgdmFsdWVzIHdpdGggb3RoZXIgZmllbGRzLgphbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZChwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpIHsKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogc3RhcnQiKQoKICAgIGJ1bmRsZV9wYXRoIDo9IGlfb2NpLkFubm90YXRpb25zWyJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmJ1bmRsZV9wYXRoIl0KICAgIGJ1bmRsZV9pZCA6PSByZXBsYWNlKGJ1bmRsZV9wYXRoLCAiL3J1bi9jb250YWluZXJkL2lvLmNvbnRhaW5lcmQucnVudGltZS52Mi50YXNrL2s4cy5pby8iLCAiIikKCiAgICBidW5kbGVfaWRfZm9ybWF0IDo9IGNvbmNhdCgiIiwgWyJeIiwgQlVORExFX0lELCAiJCJdKQogICAgcmVnZXgubWF0Y2goYnVuZGxlX2lkX2Zvcm1hdCwgYnVuZGxlX2lkKQoKICAgIGtleSA6PSAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCIKCiAgICBwX3JlZ2V4IDo9IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIHNhbmRib3hfaWQgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQoKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogc2FuZGJveF9pZCA9Iiwgc2FuZGJveF9pZCwgInJlZ2V4ID0iLCBwX3JlZ2V4KQogICAgcmVnZXgubWF0Y2gocF9yZWdleCwgc2FuZGJveF9pZCkKCiAgICBhbGxvd19yb290X3BhdGgocF9vY2ksIGlfb2NpLCBidW5kbGVfaWQpCgogICAgZXZlcnkgaV9tb3VudCBpbiBpX29jaS5Nb3VudHMgewogICAgICAgIGFsbG93X21vdW50KHBfb2NpLCBpX21vdW50LCBpX3N0b3JhZ2VzLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpCiAgICB9CgogICAgYWxsb3dfc3RvcmFnZXMocF9zdG9yYWdlcywgaV9zdG9yYWdlcywgYnVuZGxlX2lkLCBzYW5kYm94X2lkKQoKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogdHJ1ZSIpCn0KCmFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHBfcHJvY2VzcyA9IiwgcF9wcm9jZXNzKQogICAgcHJpbnQoImFsbG93X3Byb2Nlc3NfY29tbW9uOiBpX3Byb2Nlc3MgPSAiLCBpX3Byb2Nlc3MpCiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHNfbmFtZSA9Iiwgc19uYW1lKQoKICAgIHBfcHJvY2Vzcy5Dd2QgPT0gaV9wcm9jZXNzLkN3ZAogICAgcF9wcm9jZXNzLk5vTmV3UHJpdmlsZWdlcyA9PSBpX3Byb2Nlc3MuTm9OZXdQcml2aWxlZ2VzCgogICAgYWxsb3dfdXNlcihwX3Byb2Nlc3MsIGlfcHJvY2VzcykKICAgIGFsbG93X2VudihwX3Byb2Nlc3MsIGlfcHJvY2Vzcywgc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHRydWUiKQp9CgojIENvbXBhcmUgdGhlIE9DSSBQcm9jZXNzIGZpZWxkIG9mIGEgcG9saWN5IGNvbnRhaW5lciB3aXRoIHRoZSBpbnB1dCBPQ0kgUHJvY2VzcyBmcm9tIGEgQ3JlYXRlQ29udGFpbmVyUmVxdWVzdAphbGxvd19wcm9jZXNzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfcHJvY2Vzczogc3RhcnQiKQoKICAgIGFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgYWxsb3dfY2FwcyhwX3Byb2Nlc3MuQ2FwYWJpbGl0aWVzLCBpX3Byb2Nlc3MuQ2FwYWJpbGl0aWVzKQogICAgcF9wcm9jZXNzLlRlcm1pbmFsID09IGlfcHJvY2Vzcy5UZXJtaW5hbAoKICAgIHByaW50KCJhbGxvd19wcm9jZXNzOiB0cnVlIikKfQoKIyBDb21wYXJlIHRoZSBPQ0kgUHJvY2VzcyBmaWVsZCBvZiBhIHBvbGljeSBjb250YWluZXIgd2l0aCB0aGUgaW5wdXQgcHJvY2VzcyBmaWVsZCBmcm9tIEV4ZWNQcm9jZXNzUmVxdWVzdAphbGxvd19pbnRlcmFjdGl2ZV9wcm9jZXNzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfaW50ZXJhY3RpdmVfcHJvY2Vzczogc3RhcnQiKQoKICAgIGFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgYWxsb3dfZXhlY19jYXBzKGlfcHJvY2Vzcy5DYXBhYmlsaXRpZXMpCgogICAgIyBUaGVzZSBhcmUgY29tbWFuZHMgZW5hYmxlZCB1c2luZyBFeGVjUHJvY2Vzc1JlcXVlc3QgY29tbWFuZHMgYW5kL29yIHJlZ2V4IGZyb20gdGhlIHNldHRpbmdzIGZpbGUuCiAgICAjIFRoZXkgY2FuIGJlIGV4ZWN1dGVkIGludGVyYWN0aXZlbHkgc28gYWxsb3cgdGhlbSB0byB1c2UgYW55IHZhbHVlIGZvciBpX3Byb2Nlc3MuVGVybWluYWwuCgogICAgcHJpbnQoImFsbG93X2ludGVyYWN0aXZlX3Byb2Nlc3M6IHRydWUiKQp9CgojIENvbXBhcmUgdGhlIE9DSSBQcm9jZXNzIGZpZWxkIG9mIGEgcG9saWN5IGNvbnRhaW5lciB3aXRoIHRoZSBpbnB1dCBwcm9jZXNzIGZpZWxkIGZyb20gRXhlY1Byb2Nlc3NSZXF1ZXN0CmFsbG93X3Byb2JlX3Byb2Nlc3MocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19wcm9iZV9wcm9jZXNzOiBzdGFydCIpCgogICAgYWxsb3dfcHJvY2Vzc19jb21tb24ocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpCiAgICBhbGxvd19leGVjX2NhcHMoaV9wcm9jZXNzLkNhcGFiaWxpdGllcykKICAgIHBfcHJvY2Vzcy5UZXJtaW5hbCA9PSBpX3Byb2Nlc3MuVGVybWluYWwKCiAgICBwcmludCgiYWxsb3dfcHJvYmVfcHJvY2VzczogdHJ1ZSIpCn0KCmFsbG93X3VzZXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MpIHsKICAgIHBfdXNlciA6PSBwX3Byb2Nlc3MuVXNlcgogICAgaV91c2VyIDo9IGlfcHJvY2Vzcy5Vc2VyCgogICAgcHJpbnQoImFsbG93X3VzZXI6IGlucHV0IHVpZCA9IiwgaV91c2VyLlVJRCwgInBvbGljeSB1aWQgPSIsIHBfdXNlci5VSUQpCiAgICBwX3VzZXIuVUlEID09IGlfdXNlci5VSUQKCiAgICAjIFRPRE86IHRyYWNrIGRvd24gdGhlIHJlYXNvbiBmb3IgcmVnaXN0cnkuazhzLmlvL3BhdXNlOjMuOSBiZWluZwogICAgIyAgICAgICBleGVjdXRlZCB3aXRoIGdpZCA9IDAgZGVzcGl0ZSBoYXZpbmcgIjY1NTM1OjY1NTM1IiBpbiBpdHMgY29udGFpbmVyIGltYWdlCiAgICAjICAgICAgIGNvbmZpZy4KICAgICNwcmludCgiYWxsb3dfdXNlcjogaW5wdXQgZ2lkID0iLCBpX3VzZXIuR0lELCAicG9saWN5IGdpZCA9IiwgcF91c2VyLkdJRCkKICAgICNwX3VzZXIuR0lEID09IGlfdXNlci5HSUQKCiAgICAjIFRPRE86IGNvbXBhcmUgdGhlIGFkZGl0aW9uYWxHaWRzIGZpZWxkIHRvbyBhZnRlciBjb21wdXRpbmcgaXRzIHZhbHVlCiAgICAjIGJhc2VkIG9uIC9ldGMvcGFzc3dkIGFuZCAvZXRjL2dyb3VwIGZyb20gdGhlIGNvbnRhaW5lciBpbWFnZS4KfQoKYWxsb3dfZGVwcmVjYXRlZF9hcmdzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZ3MgMTogbm8gYXJncyIpCgogICAgbm90IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJncwogICAgbm90IGlfcHJvY2Vzcy5BcmdzCgogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAxOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZ3MocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSkgewogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiBwb2xpY3kgYXJncyA9IiwgcF9wcm9jZXNzLkRlcHJlY2F0ZWRBcmdzKQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiBpbnB1dCBhcmdzID0iLCBpX3Byb2Nlc3MuQXJncykKCiAgICBjb3VudChwX3Byb2Nlc3MuRGVwcmVjYXRlZEFyZ3MpID09IGNvdW50KGlfcHJvY2Vzcy5BcmdzKQoKICAgIGV2ZXJ5IGksIGlfYXJnIGluIGlfcHJvY2Vzcy5BcmdzIHsKICAgICAgICBhbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpCiAgICB9CgogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDE6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgcF9hcmcyIDo9IHJlcGxhY2UocF9hcmcsICIkJCIsICIkIikKICAgIHBfYXJnMiA9PSBpX2FyZwoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAxOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDI6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgIyBUT0RPOiBjYW4gJChub2RlLW5hbWUpIGJlIGhhbmRsZWQgYmV0dGVyPwogICAgY29udGFpbnMocF9hcmcsICIkKG5vZGUtbmFtZSkiKQoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAyOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDM6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgcF9hcmcyIDo9IHJlcGxhY2UocF9hcmcsICIkJCIsICIkIikKICAgIHBfYXJnMyA6PSByZXBsYWNlKHBfYXJnMiwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAzOiBwX2FyZzMgPSIsIHBfYXJnMykKICAgIHBfYXJnMyA9PSBpX2FyZwoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAzOiB0cnVlIikKfQoKIyBPQ0kgcHJvY2Vzcy5FbnYgZmllbGQKYWxsb3dfZW52KHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfZW52OiBwIGVudiA9IiwgcF9wcm9jZXNzLkVudikKICAgIHByaW50KCJhbGxvd19lbnY6IGkgZW52ID0iLCBpX3Byb2Nlc3MuRW52KQoKICAgIGV2ZXJ5IGlfdmFyIGluIGlfcHJvY2Vzcy5FbnYgewogICAgICAgIHByaW50KCJhbGxvd19lbnY6IGlfdmFyID0iLCBpX3ZhcikKICAgICAgICBhbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgfQoKICAgIHByaW50KCJhbGxvd19lbnY6IHRydWUiKQp9CgojIEFsbG93IGlucHV0IGVudiB2YXJpYWJsZXMgdGhhdCBhcmUgcHJlc2VudCBpbiB0aGUgcG9saWN5IGRhdGEgdG9vLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHBfdmFyID09IGlfdmFyCiAgICBwcmludCgiYWxsb3dfdmFyIDE6IHRydWUiKQp9CgojIE1hdGNoIGlucHV0IHdpdGggb25lIG9mIHRoZSBwb2xpY3kgdmFyaWFibGVzLCBhZnRlciBzdWJzdGl0dXRpbmcgJChzYW5kYm94LW5hbWUpLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHByaW50KCJhbGxvd192YXIgMjogcF92YXIgPSIsIHBfdmFyKQoKICAgIHBfdmFyX3NwbGl0IDo9IHNwbGl0KHBfdmFyLCAiPSIpCiAgICBjb3VudChwX3Zhcl9zcGxpdCkgPT0gMgoKICAgIHBfdmFyX3NwbGl0WzFdID09ICIkKHNhbmRib3gtbmFtZSkiCgogICAgaV92YXJfc3BsaXQgOj0gc3BsaXQoaV92YXIsICI9IikKICAgIGNvdW50KGlfdmFyX3NwbGl0KSA9PSAyCgogICAgaV92YXJfc3BsaXRbMF0gPT0gcF92YXJfc3BsaXRbMF0KICAgIHJlZ2V4Lm1hdGNoKHNfbmFtZSwgaV92YXJfc3BsaXRbMV0pCgogICAgcHJpbnQoImFsbG93X3ZhciAyOiB0cnVlIikKfQoKIyBBbGxvdyBpbnB1dCBlbnYgdmFyaWFibGVzIHRoYXQgbWF0Y2ggd2l0aCBhIHJlcXVlc3RfZGVmYXVsdHMgcmVnZXguCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHNvbWUgcF9yZWdleDEgaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5DcmVhdGVDb250YWluZXJSZXF1ZXN0LmFsbG93X2Vudl9yZWdleAogICAgcF9yZWdleDIgOj0gcmVwbGFjZShwX3JlZ2V4MSwgIiQoaXB2NF9hKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcHY0X2EpCiAgICBwX3JlZ2V4MyA6PSByZXBsYWNlKHBfcmVnZXgyLCAiJChpcF9wKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcF9wKQogICAgcF9yZWdleDQgOj0gcmVwbGFjZShwX3JlZ2V4MywgIiQoc3ZjX25hbWUpIiwgcG9saWN5X2RhdGEuY29tbW9uLnN2Y19uYW1lKQogICAgcF9yZWdleDUgOj0gcmVwbGFjZShwX3JlZ2V4NCwgIiQoZG5zX2xhYmVsKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5kbnNfbGFiZWwpCgogICAgcHJpbnQoImFsbG93X3ZhciAzOiBwX3JlZ2V4NSA9IiwgcF9yZWdleDUpCiAgICByZWdleC5tYXRjaChwX3JlZ2V4NSwgaV92YXIpCgogICAgcHJpbnQoImFsbG93X3ZhciAzOiB0cnVlIikKfQoKIyBBbGxvdyBmaWVsZFJlZiAiZmllbGRQYXRoOiBzdGF0dXMucG9kSVAiIHZhbHVlcy4KYWxsb3dfdmFyKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBpX3Zhciwgc19uYW1lLCBzX25hbWVzcGFjZSkgewogICAgbmFtZV92YWx1ZSA6PSBzcGxpdChpX3ZhciwgIj0iKQogICAgY291bnQobmFtZV92YWx1ZSkgPT0gMgogICAgaXNfaXAobmFtZV92YWx1ZVsxXSkKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIGFsbG93X3BvZF9pcF92YXIobmFtZV92YWx1ZVswXSwgcF92YXIpCgogICAgcHJpbnQoImFsbG93X3ZhciA0OiB0cnVlIikKfQoKIyBBbGxvdyBjb21tb24gZmllbGRSZWYgdmFyaWFibGVzLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBuYW1lX3ZhbHVlIDo9IHNwbGl0KGlfdmFyLCAiPSIpCiAgICBjb3VudChuYW1lX3ZhbHVlKSA9PSAyCgogICAgc29tZSBwX3ZhciBpbiBwX3Byb2Nlc3MuRW52CiAgICBwX25hbWVfdmFsdWUgOj0gc3BsaXQocF92YXIsICI9IikKICAgIGNvdW50KHBfbmFtZV92YWx1ZSkgPT0gMgoKICAgIHBfbmFtZV92YWx1ZVswXSA9PSBuYW1lX3ZhbHVlWzBdCgogICAgIyBUT0RPOiBzaG91bGQgdGhlc2UgYmUgaGFuZGxlZCBpbiBhIGRpZmZlcmVudCB3YXk/CiAgICBhbHdheXNfYWxsb3dlZCA6PSBbIiQoaG9zdC1uYW1lKSIsICIkKG5vZGUtbmFtZSkiLCAiJChwb2QtdWlkKSJdCiAgICBzb21lIGFsbG93ZWQgaW4gYWx3YXlzX2FsbG93ZWQKICAgIGNvbnRhaW5zKHBfbmFtZV92YWx1ZVsxXSwgYWxsb3dlZCkKCiAgICBwcmludCgiYWxsb3dfdmFyIDU6IHRydWUiKQp9CgojIEFsbG93IGZpZWxkUmVmICJmaWVsZFBhdGg6IHN0YXR1cy5ob3N0SVAiIHZhbHVlcy4KYWxsb3dfdmFyKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBpX3Zhciwgc19uYW1lLCBzX25hbWVzcGFjZSkgewogICAgbmFtZV92YWx1ZSA6PSBzcGxpdChpX3ZhciwgIj0iKQogICAgY291bnQobmFtZV92YWx1ZSkgPT0gMgogICAgaXNfaXAobmFtZV92YWx1ZVsxXSkKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIGFsbG93X2hvc3RfaXBfdmFyKG5hbWVfdmFsdWVbMF0sIHBfdmFyKQoKICAgIHByaW50KCJhbGxvd192YXIgNjogdHJ1ZSIpCn0KCiMgQWxsb3cgcmVzb3VyY2VGaWVsZFJlZiB2YWx1ZXMgKGUuZy4sICJsaW1pdHMuY3B1IikuCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIG5hbWVfdmFsdWUgOj0gc3BsaXQoaV92YXIsICI9IikKICAgIGNvdW50KG5hbWVfdmFsdWUpID09IDIKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHBfbmFtZV92YWx1ZSA6PSBzcGxpdChwX3ZhciwgIj0iKQogICAgY291bnQocF9uYW1lX3ZhbHVlKSA9PSAyCgogICAgcF9uYW1lX3ZhbHVlWzBdID09IG5hbWVfdmFsdWVbMF0KCiAgICAjIGEgdmFyaWFibGUgd2Ugc2hvdWxkIGJlIHZhbGlkYXRpbmcgdXNpbmcgYSByZWdleCBmcm9tIHNldHRpbmdzCiAgICBwX25hbWVfdmFsdWVbMV0gPT0gIiQodmFsaWRhdGUtZnJvbS1zZXR0aW5ncykiCgogICAgcmVnZXhfdmFsIDo9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuQ3JlYXRlQ29udGFpbmVyUmVxdWVzdC5hbGxvd19lbnZfcmVnZXhfbWFwW25hbWVfdmFsdWVbMF1dCgogICAgcHJpbnQoImFsbG93X3ZhciA3OiB2YWwgPSIsIG5hbWVfdmFsdWVbMV0pCiAgICBwcmludCgiYWxsb3dfdmFyIDc6IHJlZ2V4X3ZhbCA9IiwgcmVnZXhfdmFsKQoKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4X3ZhbCwgbmFtZV92YWx1ZVsxXSkKCiAgICBwcmludCgiYWxsb3dfdmFyIDc6IHRydWUiKQp9CgojIE1hdGNoIGlucHV0IHdpdGggb25lIG9mIHRoZSBwb2xpY3kgdmFyaWFibGVzLCBhZnRlciBzdWJzdGl0dXRpbmcgJChzYW5kYm94LW5hbWVzcGFjZSkuCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHNvbWUgcF92YXIgaW4gcF9wcm9jZXNzLkVudgogICAgcF92YXIyIDo9IHJlcGxhY2UocF92YXIsICIkKHNhbmRib3gtbmFtZXNwYWNlKSIsIHNfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd192YXIgODogcF92YXIyID0iLCBwX3ZhcjIpCiAgICBwX3ZhcjIgPT0gaV92YXIKCiAgICBwcmludCgiYWxsb3dfdmFyIDg6IHRydWUiKQp9CgphbGxvd19wb2RfaXBfdmFyKHZhcl9uYW1lLCBwX3ZhcikgewogICAgcHJpbnQoImFsbG93X3BvZF9pcF92YXI6IHZhcl9uYW1lID0iLCB2YXJfbmFtZSwgInBfdmFyID0iLCBwX3ZhcikKCiAgICBwX25hbWVfdmFsdWUgOj0gc3BsaXQocF92YXIsICI9IikKICAgIGNvdW50KHBfbmFtZV92YWx1ZSkgPT0gMgoKICAgIHBfbmFtZV92YWx1ZVswXSA9PSB2YXJfbmFtZQogICAgcF9uYW1lX3ZhbHVlWzFdID09ICIkKHBvZC1pcCkiCgogICAgcHJpbnQoImFsbG93X3BvZF9pcF92YXI6IHRydWUiKQp9CgphbGxvd19ob3N0X2lwX3Zhcih2YXJfbmFtZSwgcF92YXIpIHsKICAgIHByaW50KCJhbGxvd19ob3N0X2lwX3ZhcjogdmFyX25hbWUgPSIsIHZhcl9uYW1lLCAicF92YXIgPSIsIHBfdmFyKQoKICAgIHBfbmFtZV92YWx1ZSA6PSBzcGxpdChwX3ZhciwgIj0iKQogICAgY291bnQocF9uYW1lX3ZhbHVlKSA9PSAyCgogICAgcF9uYW1lX3ZhbHVlWzBdID09IHZhcl9uYW1lCiAgICBwX25hbWVfdmFsdWVbMV0gPT0gIiQoaG9zdC1pcCkiCgogICAgcHJpbnQoImFsbG93X2hvc3RfaXBfdmFyOiB0cnVlIikKfQoKaXNfaXAodmFsdWUpIHsKICAgIGJ5dGVzID0gc3BsaXQodmFsdWUsICIuIikKICAgIGNvdW50KGJ5dGVzKSA9PSA0CgogICAgaXNfaXBfZmlyc3RfYnl0ZShieXRlc1swXSkKICAgIGlzX2lwX290aGVyX2J5dGUoYnl0ZXNbMV0pCiAgICBpc19pcF9vdGhlcl9ieXRlKGJ5dGVzWzJdKQogICAgaXNfaXBfb3RoZXJfYnl0ZShieXRlc1szXSkKfQppc19pcF9maXJzdF9ieXRlKGNvbXBvbmVudCkgewogICAgbnVtYmVyID0gdG9fbnVtYmVyKGNvbXBvbmVudCkKICAgIG51bWJlciA+PSAxCiAgICBudW1iZXIgPD0gMjU1Cn0KaXNfaXBfb3RoZXJfYnl0ZShjb21wb25lbnQpIHsKICAgIG51bWJlciA9IHRvX251bWJlcihjb21wb25lbnQpCiAgICBudW1iZXIgPj0gMAogICAgbnVtYmVyIDw9IDI1NQp9CgojIE9DSSByb290LlBhdGgKYWxsb3dfcm9vdF9wYXRoKHBfb2NpLCBpX29jaSwgYnVuZGxlX2lkKSB7CiAgICBpX3BhdGggOj0gaV9vY2kuUm9vdC5QYXRoCiAgICBwX3BhdGgxIDo9IHBfb2NpLlJvb3QuUGF0aAogICAgcHJpbnQoImFsbG93X3Jvb3RfcGF0aDogaV9wYXRoID0iLCBpX3BhdGgsICJwX3BhdGgxID0iLCBwX3BhdGgxKQoKICAgIHBfcGF0aDIgOj0gcmVwbGFjZShwX3BhdGgxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfcm9vdF9wYXRoOiBwX3BhdGgyID0iLCBwX3BhdGgyKQoKICAgIHBfcGF0aDMgOj0gcmVwbGFjZShwX3BhdGgyLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X3Jvb3RfcGF0aDogcF9wYXRoMyA9IiwgcF9wYXRoMykKCiAgICBwX3BhdGgzID09IGlfcGF0aAoKICAgIHByaW50KCJhbGxvd19yb290X3BhdGg6IHRydWUiKQp9CgojIGRldmljZSBtb3VudHMKYWxsb3dfbW91bnQocF9vY2ksIGlfbW91bnQsIGlfc3RvcmFnZXMsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcHJpbnQoImFsbG93X21vdW50OiBpX21vdW50ID0iLCBpX21vdW50KQoKICAgIHNvbWUgcF9tb3VudCBpbiBwX29jaS5Nb3VudHMKICAgIHNvbWUgaV9zdG9yYWdlIGluIGlfc3RvcmFnZXMKCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IHBfbW91bnQgPSIsIHBfbW91bnQpCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IGlfc3RvcmFnZSA9IiwgaV9zdG9yYWdlKQoKICAgIGNoZWNrX21vdW50KHBfbW91bnQsIGlfbW91bnQsIGlfc3RvcmFnZSwgYnVuZGxlX2lkLCBzYW5kYm94X2lkKQoKICAgICMgVE9ETzogYXJlIHRoZXJlIGFueSBvdGhlciByZXF1aXJlZCBwb2xpY3kgY2hlY2tzIGZvciBtb3VudHMgLSBlLmcuLAogICAgIyAgICAgICBtdWx0aXBsZSBtb3VudHMgd2l0aCBzYW1lIHNvdXJjZSBvciBkZXN0aW5hdGlvbj8KCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IHRydWUiKQp9CgpjaGVja19tb3VudChwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcF9tb3VudCA9PSBpX21vdW50CiAgICBwcmludCgiY2hlY2tfbW91bnQgMTogdHJ1ZSIpCn0KY2hlY2tfbW91bnQocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHBfbW91bnQuZGVzdGluYXRpb24gPT0gaV9tb3VudC5kZXN0aW5hdGlvbgogICAgcF9tb3VudC50eXBlXyA9PSBpX21vdW50LnR5cGVfCiAgICBwX21vdW50Lm9wdGlvbnMgPT0gaV9tb3VudC5vcHRpb25zCgogICAgbW91bnRfc291cmNlX2FsbG93cyhwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkKCiAgICBwcmludCgiY2hlY2tfbW91bnQgMjogdHJ1ZSIpCn0KCm1vdW50X3NvdXJjZV9hbGxvd3MocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHJlZ2V4MSA6PSBwX21vdW50LnNvdXJjZQogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5tb3VudF9zb3VyY2VfY3BhdGgpCiAgICByZWdleDQgOj0gcmVwbGFjZShyZWdleDMsICIkKGJ1bmRsZS1pZCkiLCBidW5kbGVfaWQpCgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMTogcmVnZXg0ID0iLCByZWdleDQpCiAgICByZWdleC5tYXRjaChyZWdleDQsIGlfbW91bnQuc291cmNlKQoKICAgIHByaW50KCJtb3VudF9zb3VyY2VfYWxsb3dzIDE6IHRydWUiKQp9Cm1vdW50X3NvdXJjZV9hbGxvd3MocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHJlZ2V4MSA6PSBwX21vdW50LnNvdXJjZQogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5tb3VudF9zb3VyY2VfY3BhdGgpCiAgICByZWdleDQgOj0gcmVwbGFjZShyZWdleDMsICIkKHNhbmRib3gtaWQpIiwgc2FuZGJveF9pZCkKCiAgICBwcmludCgibW91bnRfc291cmNlX2FsbG93cyAyOiByZWdleDQgPSIsIHJlZ2V4NCkKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4NCwgaV9tb3VudC5zb3VyY2UpCgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMjogdHJ1ZSIpCn0KbW91bnRfc291cmNlX2FsbG93cyhwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogaV9tb3VudC5zb3VyY2UgPSIsIGlfbW91bnQuc291cmNlKQogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogaV9zdG9yYWdlLm1vdW50X3BvaW50ID0iLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCgogICAgaV9tb3VudC5zb3VyY2UgPT0gaV9zdG9yYWdlLm1vdW50X3BvaW50CgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogdHJ1ZSIpCn0KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBDcmVhdGUgY29udGFpbmVyIFN0b3JhZ2VzCgphbGxvd19zdG9yYWdlcyhwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHBfY291bnQgOj0gY291bnQocF9zdG9yYWdlcykKICAgIGlfY291bnQgOj0gY291bnQoaV9zdG9yYWdlcykKICAgIHByaW50KCJhbGxvd19zdG9yYWdlczogcF9jb3VudCA9IiwgcF9jb3VudCwgImlfY291bnQgPSIsIGlfY291bnQpCgogICAgcF9jb3VudCA9PSBpX2NvdW50CgogICAgIyBHZXQgdGhlIGNvbnRhaW5lciBpbWFnZSBsYXllciBJRHMgYW5kIHZlcml0eSByb290IGhhc2hlcywgZnJvbSB0aGUgIm92ZXJsYXlmcyIgc3RvcmFnZS4KICAgIHNvbWUgb3ZlcmxheV9zdG9yYWdlIGluIHBfc3RvcmFnZXMKICAgIG92ZXJsYXlfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIHByaW50KCJhbGxvd19zdG9yYWdlczogb3ZlcmxheV9zdG9yYWdlID0iLCBvdmVybGF5X3N0b3JhZ2UpCiAgICBjb3VudChvdmVybGF5X3N0b3JhZ2Uub3B0aW9ucykgPT0gMgoKICAgIGxheWVyX2lkcyA6PSBzcGxpdChvdmVybGF5X3N0b3JhZ2Uub3B0aW9uc1swXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiBsYXllcl9pZHMgPSIsIGxheWVyX2lkcykKCiAgICByb290X2hhc2hlcyA6PSBzcGxpdChvdmVybGF5X3N0b3JhZ2Uub3B0aW9uc1sxXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiByb290X2hhc2hlcyA9Iiwgcm9vdF9oYXNoZXMpCgogICAgZXZlcnkgaV9zdG9yYWdlIGluIGlfc3RvcmFnZXMgewogICAgICAgIGFsbG93X3N0b3JhZ2UocF9zdG9yYWdlcywgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpCiAgICB9CgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiB0cnVlIikKfQoKYWxsb3dfc3RvcmFnZShwX3N0b3JhZ2VzLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgc29tZSBwX3N0b3JhZ2UgaW4gcF9zdG9yYWdlcwoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiBwX3N0b3JhZ2UgPSIsIHBfc3RvcmFnZSkKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiBpX3N0b3JhZ2UgPSIsIGlfc3RvcmFnZSkKCiAgICBwX3N0b3JhZ2UuZHJpdmVyICAgICAgICAgICA9PSBpX3N0b3JhZ2UuZHJpdmVyCiAgICBwX3N0b3JhZ2UuZHJpdmVyX29wdGlvbnMgICA9PSBpX3N0b3JhZ2UuZHJpdmVyX29wdGlvbnMKICAgIHBfc3RvcmFnZS5mc19ncm91cCAgICAgICAgID09IGlfc3RvcmFnZS5mc19ncm91cAogICAgcF9zdG9yYWdlLmZzdHlwZSAgICAgICAgICAgPT0gaV9zdG9yYWdlLmZzdHlwZQoKICAgIGFsbG93X3N0b3JhZ2Vfc291cmNlKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKQogICAgYWxsb3dfc3RvcmFnZV9vcHRpb25zKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKQogICAgYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKQoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiB0cnVlIikKfQoKYWxsb3dfc3RvcmFnZV9zb3VyY2UocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX3NvdXJjZSAxOiBzdGFydCIpCgogICAgcF9zdG9yYWdlLnNvdXJjZSA9PSBpX3N0b3JhZ2Uuc291cmNlCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDE6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX3NvdXJjZShwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDI6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCgogICAgIyBEREREOkJCOkRELkY6IERvbWFpbjpCdXM6RGV2aWNlLkZ1bmN0aW9uCiAgICAjIGh0dHBzOi8vd3d3Lmtlcm5lbC5vcmcvZG9jL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtYnVzLXBjaQogICAgcmVnZXgubWF0Y2goYF5bYS1mMC05XXs0fTpbYS1mMC05XXsyfTpbYS1mMC05XXsyfVwuW2EtZjAtOV0kYCwgaV9zdG9yYWdlLnNvdXJjZSkKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9zb3VyY2UgMjogdHJ1ZSIpCn0KCmFsbG93X3N0b3JhZ2Vfc291cmNlKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKSB7CiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9zb3VyY2UgMzogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIGlfc3RvcmFnZS5zb3VyY2UgPT0gIm5vbmUiCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDM6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX3NvdXJjZShwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDQ6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJzbWIiCgogICAgIyBQYXR0ZXJuOiAvLzxzdG9yYWdlLWFjY291bnQtbmFtZT4uZmlsZS5jb3JlLndpbmRvd3MubmV0LzxrOHMtUFZDLW5hbWU+CiAgICAjIFN0b3JhZ2UgYWNjb3VudCBuYW1lOiBodHRwczovL2xlYXJuLm1pY3Jvc29mdC5jb20vZW4tdXMvYXp1cmUvc3RvcmFnZS9jb21tb24vc3RvcmFnZS1hY2NvdW50LW92ZXJ2aWV3I3N0b3JhZ2UtYWNjb3VudC1uYW1lCiAgICAjIEs4cyBQVkMgbmFtZTogaHR0cHM6Ly9rdWJlcm5ldGVzLmlvL2RvY3MvY29uY2VwdHMvb3ZlcnZpZXcvd29ya2luZy13aXRoLW9iamVjdHMvbmFtZXMvI2Rucy1zdWJkb21haW4tbmFtZXMKICAgIHJlZ2V4Lm1hdGNoKGBeXC9cLyhbYS16MC05XXszLDI0fSlcLmZpbGVcLmNvcmVcLndpbmRvd3NcLm5ldFwvW2EtejAtOV0oW2EtejAtOS4tXXswLDI1MX1bYS16MC05XSk/JGAsIGlfc3RvcmFnZS5zb3VyY2UpCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDQ6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMTogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgIT0gIm92ZXJsYXlmcyIKICAgIHBfc3RvcmFnZS5vcHRpb25zID09IGlfc3RvcmFnZS5vcHRpb25zCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAxOiB0cnVlIikKfQphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIGNvdW50KHBfc3RvcmFnZS5vcHRpb25zKSA9PSAyCgogICAgcG9saWN5X2lkcyA6PSBzcGxpdChwX3N0b3JhZ2Uub3B0aW9uc1swXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBwb2xpY3lfaWRzID0iLCBwb2xpY3lfaWRzKQogICAgcG9saWN5X2lkcyA9PSBsYXllcl9pZHMKCiAgICBwb2xpY3lfaGFzaGVzIDo9IHNwbGl0KHBfc3RvcmFnZS5vcHRpb25zWzFdLCAiOiIpCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IHBvbGljeV9oYXNoZXMgPSIsIHBvbGljeV9oYXNoZXMpCgogICAgcF9jb3VudCA6PSBjb3VudChwb2xpY3lfaWRzKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBwX2NvdW50ID0iLCBwX2NvdW50KQogICAgcF9jb3VudCA+PSAxCiAgICBwX2NvdW50ID09IGNvdW50KHBvbGljeV9oYXNoZXMpCgogICAgaV9jb3VudCA6PSBjb3VudChpX3N0b3JhZ2Uub3B0aW9ucykKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogaV9jb3VudCA9IiwgaV9jb3VudCkKICAgIGlfY291bnQgPT0gcF9jb3VudCArIDMKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zWzBdID0iLCBpX3N0b3JhZ2Uub3B0aW9uc1swXSkKICAgIGlfc3RvcmFnZS5vcHRpb25zWzBdID09ICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQubGF5ZXItc3JjLXByZWZpeD0vdmFyL2xpYi9jb250YWluZXJkL2lvLmNvbnRhaW5lcmQuc25hcHNob3R0ZXIudjEudGFyZGV2L2xheWVycyIKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zW2lfY291bnQgLSAyXSA9IiwgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDJdKQogICAgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDJdID09ICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQub3ZlcmxheS1ydyIKCiAgICBsb3dlcmRpciA6PSBjb25jYXQoIj0iLCBbImxvd2VyZGlyIiwgcF9zdG9yYWdlLm9wdGlvbnNbMF1dKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBsb3dlcmRpciA9IiwgbG93ZXJkaXIpCgogICAgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDFdID09IGxvd2VyZGlyCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zW2lfY291bnQgLSAxXSA9IiwgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDFdKQoKICAgIGV2ZXJ5IGksIHBvbGljeV9pZCBpbiBwb2xpY3lfaWRzIHsKICAgICAgICBhbGxvd19vdmVybGF5X2xheWVyKHBvbGljeV9pZCwgcG9saWN5X2hhc2hlc1tpXSwgaV9zdG9yYWdlLm9wdGlvbnNbaSArIDFdKQogICAgfQoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogdHJ1ZSIpCn0KYWxsb3dfc3RvcmFnZV9vcHRpb25zKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKSB7CiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDM6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCiAgICBjb3VudChwX3N0b3JhZ2Uub3B0aW9ucykgPT0gMQoKICAgIHN0YXJ0c3dpdGgocF9zdG9yYWdlLm9wdGlvbnNbMF0sICIkKGhhc2giKQogICAgaGFzaF9zdWZmaXggOj0gdHJpbV9sZWZ0KHBfc3RvcmFnZS5vcHRpb25zWzBdLCAiJChoYXNoIikKCiAgICBlbmRzd2l0aChoYXNoX3N1ZmZpeCwgIikiKQogICAgaGFzaF9pbmRleCA6PSB0cmltX3JpZ2h0KGhhc2hfc3VmZml4LCAiKSIpCiAgICBpIDo9IHRvX251bWJlcihoYXNoX2luZGV4KQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAzOiBpID0iLCBpKQoKICAgIGhhc2hfb3B0aW9uIDo9IGNvbmNhdCgiPSIsIFsiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LnJvb3QtaGFzaCIsIHJvb3RfaGFzaGVzW2ldXSkKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMzogaGFzaF9vcHRpb24gPSIsIGhhc2hfb3B0aW9uKQoKICAgIGNvdW50KGlfc3RvcmFnZS5vcHRpb25zKSA9PSA0CiAgICBpX3N0b3JhZ2Uub3B0aW9uc1swXSA9PSAicm8iCiAgICBpX3N0b3JhZ2Uub3B0aW9uc1sxXSA9PSAiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmJsb2NrX2RldmljZT1maWxlIgogICAgaV9zdG9yYWdlLm9wdGlvbnNbMl0gPT0gImlvLmthdGFjb250YWluZXJzLmZzLW9wdC5pcy1sYXllciIKICAgIGlfc3RvcmFnZS5vcHRpb25zWzNdID09IGhhc2hfb3B0aW9uCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAzOiB0cnVlIikKfQphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgNDogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gInNtYiIKICAgIHBfb3B0c19jb3VudCA6PSBjb3VudChwX3N0b3JhZ2Uub3B0aW9ucykKICAgIGlfb3B0c19jb3VudCA6PSBjb3VudChpX3N0b3JhZ2Uub3B0aW9ucykKICAgIGlfb3B0c19jb3VudCA9PSBwX29wdHNfY291bnQgKyAyCgogICAgaV9vcHRfbWF0Y2hlcyA6PSBbaSB8IGkgOj0gaWR4OyBpZHggPCBwX29wdHNfY291bnQ7IHBfc3RvcmFnZS5vcHRpb25zW2lkeF0gPT0gaV9zdG9yYWdlLm9wdGlvbnNbaWR4XV0KICAgIGNvdW50KGlfb3B0X21hdGNoZXMpID09IHBfb3B0c19jb3VudAoKICAgIHN0YXJ0c3dpdGgoaV9zdG9yYWdlLm9wdGlvbnNbaV9vcHRzX2NvdW50LTJdLCAiYWRkcj0iKQogICAgY3JlZHMgPSBzcGxpdChpX3N0b3JhZ2Uub3B0aW9uc1tpX29wdHNfY291bnQtMV0sICIsIikKICAgIGNvdW50KGNyZWRzKSA9PSAyCiAgICBzdGFydHN3aXRoKGNyZWRzWzBdLCAidXNlcm5hbWU9IikKICAgIHN0YXJ0c3dpdGgoY3JlZHNbMV0sICJwYXNzd29yZD0iKQogICAgCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDQ6IHRydWUiKQp9CgphbGxvd19vdmVybGF5X2xheWVyKHBvbGljeV9pZCwgcG9saWN5X2hhc2gsIGlfb3B0aW9uKSB7CiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogcG9saWN5X2lkID0iLCBwb2xpY3lfaWQsICJwb2xpY3lfaGFzaCA9IiwgcG9saWN5X2hhc2gpCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogaV9vcHRpb24gPSIsIGlfb3B0aW9uKQoKICAgIHN0YXJ0c3dpdGgoaV9vcHRpb24sICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQubGF5ZXI9IikKICAgIGlfdmFsdWUgOj0gcmVwbGFjZShpX29wdGlvbiwgImlvLmthdGFjb250YWluZXJzLmZzLW9wdC5sYXllcj0iLCAiIikKICAgIGlfdmFsdWVfZGVjb2RlZCA6PSBiYXNlNjQuZGVjb2RlKGlfdmFsdWUpCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogaV92YWx1ZV9kZWNvZGVkID0iLCBpX3ZhbHVlX2RlY29kZWQpCgogICAgcG9saWN5X3N1ZmZpeCA6PSBjb25jYXQoIj0iLCBbInRhcixybyxpby5rYXRhY29udGFpbmVycy5mcy1vcHQuYmxvY2tfZGV2aWNlPWZpbGUsaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmlzLWxheWVyLGlvLmthdGFjb250YWluZXJzLmZzLW9wdC5yb290LWhhc2giLCBwb2xpY3lfaGFzaF0pCiAgICBwX3ZhbHVlIDo9IGNvbmNhdCgiLCIsIFtwb2xpY3lfaWQsIHBvbGljeV9zdWZmaXhdKQogICAgcHJpbnQoImFsbG93X292ZXJsYXlfbGF5ZXI6IHBfdmFsdWUgPSIsIHBfdmFsdWUpCgogICAgcF92YWx1ZSA9PSBpX3ZhbHVlX2RlY29kZWQKCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogdHJ1ZSIpCn0KCmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAidGFyIgoKICAgIHN0YXJ0c3dpdGgocF9zdG9yYWdlLm1vdW50X3BvaW50LCAiJChsYXllciIpCiAgICBtb3VudF9zdWZmaXggOj0gdHJpbV9sZWZ0KHBfc3RvcmFnZS5tb3VudF9wb2ludCwgIiQobGF5ZXIiKQoKICAgIGVuZHN3aXRoKG1vdW50X3N1ZmZpeCwgIikiKQogICAgbGF5ZXJfaW5kZXggOj0gdHJpbV9yaWdodChtb3VudF9zdWZmaXgsICIpIikKICAgIGkgOj0gdG9fbnVtYmVyKGxheWVyX2luZGV4KQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDE6IGkgPSIsIGkpCgogICAgbGF5ZXJfaWQgOj0gbGF5ZXJfaWRzW2ldCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMTogbGF5ZXJfaWQgPSIsIGxheWVyX2lkKQoKICAgIHBfbW91bnQgOj0gY29uY2F0KCIvIiwgWyIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L2xheWVycyIsIGxheWVyX2lkXSkKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCAxOiBwX21vdW50ID0iLCBwX21vdW50KQoKICAgIHBfbW91bnQgPT0gaV9zdG9yYWdlLm1vdW50X3BvaW50CgogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDE6IHRydWUiKQp9CmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAiZnVzZTMua2F0YS1vdmVybGF5IgoKICAgIG1vdW50MSA6PSByZXBsYWNlKHBfc3RvcmFnZS5tb3VudF9wb2ludCwgIiQoY3BhdGgpIiwgcG9saWN5X2RhdGEuY29tbW9uLmNwYXRoKQogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDI6IG1vdW50MiA9IiwgbW91bnQyKQoKICAgIG1vdW50MiA9PSBpX3N0b3JhZ2UubW91bnRfcG9pbnQKCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMjogdHJ1ZSIpCn0KYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKSB7CiAgICBwX3N0b3JhZ2UuZnN0eXBlID09ICJsb2NhbCIKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQyID0iLCBtb3VudDIpCgogICAgbW91bnQzIDo9IHJlcGxhY2UobW91bnQyLCAiJChzYW5kYm94LWlkKSIsIHNhbmRib3hfaWQpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQzID0iLCBtb3VudDMpCgogICAgcmVnZXgubWF0Y2gobW91bnQzLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCgogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDM6IHRydWUiKQp9CmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAiYmluZCIKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNDogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNDogbW91bnQyID0iLCBtb3VudDIpCgogICAgbW91bnQzIDo9IHJlcGxhY2UobW91bnQyLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDQ6IG1vdW50MyA9IiwgbW91bnQzKQoKICAgIHJlZ2V4Lm1hdGNoKG1vdW50MywgaV9zdG9yYWdlLm1vdW50X3BvaW50KQoKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA0OiB0cnVlIikKfQphbGxvd19tb3VudF9wb2ludChwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgYnVuZGxlX2lkLCBzYW5kYm94X2lkLCBsYXllcl9pZHMpIHsKICAgIHBfc3RvcmFnZS5mc3R5cGUgPT0gInRtcGZzIgoKICAgIG1vdW50MSA6PSBwX3N0b3JhZ2UubW91bnRfcG9pbnQKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA1OiBtb3VudDEgPSIsIG1vdW50MSkKCiAgICByZWdleC5tYXRjaChtb3VudDEsIGlfc3RvcmFnZS5tb3VudF9wb2ludCkKCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNTogdHJ1ZSIpCn0KYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKSB7CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogaV9zdG9yYWdlLm1vdW50X3BvaW50ID0iLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCiAgICBhbGxvd19kaXJlY3Rfdm9sX2RyaXZlcihwX3N0b3JhZ2UsIGlfc3RvcmFnZSkKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChzcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQyID0iLCBtb3VudDIpCgogICAgZGlyZWN0X3ZvbF9wYXRoIDo9IGlfc3RvcmFnZS5zb3VyY2UKICAgIG1vdW50MyA6PSByZXBsYWNlKG1vdW50MiwgIiQoYjY0LWRpcmVjdC12b2wtcGF0aCkiLCBiYXNlNjR1cmwuZW5jb2RlKGRpcmVjdF92b2xfcGF0aCkpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQzID0iLCBtb3VudDMpCgogICAgbW91bnQzID09IGlfc3RvcmFnZS5tb3VudF9wb2ludAoKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA2OiB0cnVlIikKfQoKYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIocF9zdG9yYWdlLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19kaXJlY3Rfdm9sX2RyaXZlciAxOiBzdGFydCIpCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCiAgICBwcmludCgiYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIgMTogdHJ1ZSIpCn0KYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIocF9zdG9yYWdlLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19kaXJlY3Rfdm9sX2RyaXZlciAyOiBzdGFydCIpCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJzbWIiCiAgICBwcmludCgiYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIgMjogdHJ1ZSIpCn0KCiMgRXhlY1Byb2Nlc3NSZXF1ZXN0LnByb2Nlc3MuQ2FwYWJpbGl0aWVzCmFsbG93X2V4ZWNfY2FwcyhpX2NhcHMpIHsKICAgIG5vdCBpX2NhcHMuQW1iaWVudAogICAgbm90IGlfY2Fwcy5Cb3VuZGluZwogICAgbm90IGlfY2Fwcy5FZmZlY3RpdmUKICAgIG5vdCBpX2NhcHMuSW5oZXJpdGFibGUKICAgIG5vdCBpX2NhcHMuUGVybWl0dGVkCn0KCiMgT0NJLlByb2Nlc3MuQ2FwYWJpbGl0aWVzCmFsbG93X2NhcHMocF9jYXBzLCBpX2NhcHMpIHsKICAgIHByaW50KCJhbGxvd19jYXBzOiBwb2xpY3kgQW1iaWVudCA9IiwgcF9jYXBzLkFtYmllbnQpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgQW1iaWVudCA9IiwgaV9jYXBzLkFtYmllbnQpCiAgICBtYXRjaF9jYXBzKHBfY2Fwcy5BbWJpZW50LCBpX2NhcHMuQW1iaWVudCkKCiAgICBwcmludCgiYWxsb3dfY2FwczogcG9saWN5IEJvdW5kaW5nID0iLCBwX2NhcHMuQm91bmRpbmcpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgQm91bmRpbmcgPSIsIGlfY2Fwcy5Cb3VuZGluZykKICAgIG1hdGNoX2NhcHMocF9jYXBzLkJvdW5kaW5nLCBpX2NhcHMuQm91bmRpbmcpCgogICAgcHJpbnQoImFsbG93X2NhcHM6IHBvbGljeSBFZmZlY3RpdmUgPSIsIHBfY2Fwcy5FZmZlY3RpdmUpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgRWZmZWN0aXZlID0iLCBpX2NhcHMuRWZmZWN0aXZlKQogICAgbWF0Y2hfY2FwcyhwX2NhcHMuRWZmZWN0aXZlLCBpX2NhcHMuRWZmZWN0aXZlKQoKICAgIHByaW50KCJhbGxvd19jYXBzOiBwb2xpY3kgSW5oZXJpdGFibGUgPSIsIHBfY2Fwcy5Jbmhlcml0YWJsZSkKICAgIHByaW50KCJhbGxvd19jYXBzOiBpbnB1dCBJbmhlcml0YWJsZSA9IiwgaV9jYXBzLkluaGVyaXRhYmxlKQogICAgbWF0Y2hfY2FwcyhwX2NhcHMuSW5oZXJpdGFibGUsIGlfY2Fwcy5Jbmhlcml0YWJsZSkKCiAgICBwcmludCgiYWxsb3dfY2FwczogcG9saWN5IFBlcm1pdHRlZCA9IiwgcF9jYXBzLlBlcm1pdHRlZCkKICAgIHByaW50KCJhbGxvd19jYXBzOiBpbnB1dCBQZXJtaXR0ZWQgPSIsIGlfY2Fwcy5QZXJtaXR0ZWQpCiAgICBtYXRjaF9jYXBzKHBfY2Fwcy5QZXJtaXR0ZWQsIGlfY2Fwcy5QZXJtaXR0ZWQpCn0KCm1hdGNoX2NhcHMocF9jYXBzLCBpX2NhcHMpIHsKICAgIHByaW50KCJtYXRjaF9jYXBzIDE6IHN0YXJ0IikKCiAgICBwX2NhcHMgPT0gaV9jYXBzCgogICAgcHJpbnQoIm1hdGNoX2NhcHMgMTogdHJ1ZSIpCn0KbWF0Y2hfY2FwcyhwX2NhcHMsIGlfY2FwcykgewogICAgcHJpbnQoIm1hdGNoX2NhcHMgMjogc3RhcnQiKQoKICAgIGNvdW50KHBfY2FwcykgPT0gMQogICAgcF9jYXBzWzBdID09ICIkKGRlZmF1bHRfY2FwcykiCgogICAgcHJpbnQoIm1hdGNoX2NhcHMgMjogZGVmYXVsdF9jYXBzID0iLCBwb2xpY3lfZGF0YS5jb21tb24uZGVmYXVsdF9jYXBzKQogICAgcG9saWN5X2RhdGEuY29tbW9uLmRlZmF1bHRfY2FwcyA9PSBpX2NhcHMKCiAgICBwcmludCgibWF0Y2hfY2FwcyAyOiB0cnVlIikKfQptYXRjaF9jYXBzKHBfY2FwcywgaV9jYXBzKSB7CiAgICBwcmludCgibWF0Y2hfY2FwcyAzOiBzdGFydCIpCgogICAgY291bnQocF9jYXBzKSA9PSAxCiAgICBwX2NhcHNbMF0gPT0gIiQocHJpdmlsZWdlZF9jYXBzKSIKCiAgICBwcmludCgibWF0Y2hfY2FwcyAzOiBwcml2aWxlZ2VkX2NhcHMgPSIsIHBvbGljeV9kYXRhLmNvbW1vbi5wcml2aWxlZ2VkX2NhcHMpCiAgICBwb2xpY3lfZGF0YS5jb21tb24ucHJpdmlsZWdlZF9jYXBzID09IGlfY2FwcwoKICAgIHByaW50KCJtYXRjaF9jYXBzIDM6IHRydWUiKQp9CgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgpjaGVja19kaXJlY3RvcnlfdHJhdmVyc2FsKGlfcGF0aCkgewogICAgbm90IHJlZ2V4Lm1hdGNoKCIoXnwvKS4uKCR8LykiLCBpX3BhdGgpCn0KCmNoZWNrX3N5bWxpbmtfc291cmNlKGlfc3JjKSB7CiAgICBpX3NyYyA9PSAiIgogICAgcHJpbnQoImNoZWNrX3N5bWxpbmtfc291cmNlIDE6IHRydWUiKQp9CmNoZWNrX3N5bWxpbmtfc291cmNlKGlfc3JjKSB7CiAgICBpX3NyYyAhPSAiIgogICAgcHJpbnQoImNoZWNrX3N5bWxpbmtfc291cmNlIDI6IGlfc3JjID0iLCBpX3NyYykKCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24uc19zb3VyY2UxLCBpX3NyYykKCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMjogdHJ1ZSIpCn0KY2hlY2tfc3ltbGlua19zb3VyY2UoaV9zcmMpIHsKICAgIGlfc3JjICE9ICIiCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMzogaV9zcmMgPSIsIGlfc3JjKQoKICAgIHJlZ2V4Lm1hdGNoKHBvbGljeV9kYXRhLmNvbW1vbi5zX3NvdXJjZTIsIGlfc3JjKQogICAgY2hlY2tfZGlyZWN0b3J5X3RyYXZlcnNhbChpX3NyYykKCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMzogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfc3RvcmFnZXMoaV9zdG9yYWdlcykgewogICAgcHJpbnQoImFsbG93X3NhbmRib3hfc3RvcmFnZXM6IGlfc3RvcmFnZXMgPSIsIGlfc3RvcmFnZXMpCgogICAgcF9zdG9yYWdlcyA6PSBwb2xpY3lfZGF0YS5zYW5kYm94LnN0b3JhZ2VzCiAgICBldmVyeSBpX3N0b3JhZ2UgaW4gaV9zdG9yYWdlcyB7CiAgICAgICAgYWxsb3dfc2FuZGJveF9zdG9yYWdlKHBfc3RvcmFnZXMsIGlfc3RvcmFnZSkKICAgIH0KCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9zdG9yYWdlczogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfc3RvcmFnZShwX3N0b3JhZ2VzLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IGlfc3RvcmFnZSA9IiwgaV9zdG9yYWdlKQoKICAgIHNvbWUgcF9zdG9yYWdlIGluIHBfc3RvcmFnZXMKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IHBfc3RvcmFnZSA9IiwgcF9zdG9yYWdlKQogICAgaV9zdG9yYWdlID09IHBfc3RvcmFnZQoKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IHRydWUiKQp9CgpDb3B5RmlsZVJlcXVlc3QgewogICAgcHJpbnQoIkNvcHlGaWxlUmVxdWVzdDogaW5wdXQucGF0aCA9IiwgaW5wdXQucGF0aCkKCiAgICBjaGVja19zeW1saW5rX3NvdXJjZShpbnB1dC5zeW1saW5rX3NyYykKICAgIGNoZWNrX2RpcmVjdG9yeV90cmF2ZXJzYWwoaW5wdXQucGF0aCkKCiAgICBzb21lIHJlZ2V4MSBpbiBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLkNvcHlGaWxlUmVxdWVzdAogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5jcGF0aCkKICAgIHJlZ2V4NCA6PSByZXBsYWNlKHJlZ2V4MywgIiQoYnVuZGxlLWlkKSIsIEJVTkRMRV9JRCkKICAgIHByaW50KCJDb3B5RmlsZVJlcXVlc3Q6IHJlZ2V4NCA9IiwgcmVnZXg0KQoKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4NCwgaW5wdXQucGF0aCkKCiAgICBwcmludCgiQ29weUZpbGVSZXF1ZXN0OiB0cnVlIikKfQoKQ3JlYXRlU2FuZGJveFJlcXVlc3QgewogICAgcHJpbnQoIkNyZWF0ZVNhbmRib3hSZXF1ZXN0OiBpbnB1dC5ndWVzdF9ob29rX3BhdGggPSIsIGlucHV0Lmd1ZXN0X2hvb2tfcGF0aCkKICAgIGNvdW50KGlucHV0Lmd1ZXN0X2hvb2tfcGF0aCkgPT0gMAoKICAgIHByaW50KCJDcmVhdGVTYW5kYm94UmVxdWVzdDogaW5wdXQua2VybmVsX21vZHVsZXMgPSIsIGlucHV0Lmtlcm5lbF9tb2R1bGVzKQogICAgY291bnQoaW5wdXQua2VybmVsX21vZHVsZXMpID09IDAKCiAgICBpX3BpZG5zIDo9IGlucHV0LnNhbmRib3hfcGlkbnMKICAgIHByaW50KCJDcmVhdGVTYW5kYm94UmVxdWVzdDogaV9waWRucyA9IiwgaV9waWRucykKICAgIGlfcGlkbnMgPT0gZmFsc2UKICAgIGFsbG93X3NhbmRib3hfc3RvcmFnZXMoaW5wdXQuc3RvcmFnZXMpCn0KCmFsbG93X2V4ZWMocF9jb250YWluZXIsIGlfcHJvY2VzcykgewogICAgcHJpbnQoImFsbG93X2V4ZWM6IHN0YXJ0IikKCiAgICBwX29jaSA9IHBfY29udGFpbmVyLk9DSQogICAgcF9zX25hbWUgPSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc19uYW1lc3BhY2UgPSBnZXRfc3RhdGVfdmFsKCJuYW1lc3BhY2UiKQogICAgYWxsb3dfcHJvYmVfcHJvY2VzcyhwX29jaS5Qcm9jZXNzLCBpX3Byb2Nlc3MsIHBfc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfZXhlYzogdHJ1ZSIpCn0KCmFsbG93X2ludGVyYWN0aXZlX2V4ZWMocF9jb250YWluZXIsIGlfcHJvY2VzcykgewogICAgcHJpbnQoImFsbG93X2ludGVyYWN0aXZlX2V4ZWM6IHN0YXJ0IikKCiAgICBwX29jaSA9IHBfY29udGFpbmVyLk9DSQogICAgcF9zX25hbWUgPSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc19uYW1lc3BhY2UgPSBnZXRfc3RhdGVfdmFsKCJuYW1lc3BhY2UiKQogICAgYWxsb3dfaW50ZXJhY3RpdmVfcHJvY2VzcyhwX29jaS5Qcm9jZXNzLCBpX3Byb2Nlc3MsIHBfc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfaW50ZXJhY3RpdmVfZXhlYzogdHJ1ZSIpCn0KCiMgVE9ETzogc2hvdWxkIG90aGVyIEV4ZWNQcm9jZXNzUmVxdWVzdCBpbnB1dCBkYXRhIGZpZWxkcyBiZSB2YWxpZGF0ZWQgYXMgd2VsbD8KRXhlY1Byb2Nlc3NSZXF1ZXN0IHsKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMTogaW5wdXQgPSIsIGlucHV0KQoKICAgIHNvbWUgcF9jb21tYW5kIGluIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuRXhlY1Byb2Nlc3NSZXF1ZXN0LmFsbG93ZWRfY29tbWFuZHMKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMTogcF9jb21tYW5kID0iLCBwX2NvbW1hbmQpCiAgICBwX2NvbW1hbmQgPT0gaW5wdXQucHJvY2Vzcy5BcmdzCgogICAgIyBUT0RPOiBtYXRjaCBwX2NvbnRhaW5lcidzIElEIHdpdGggdGhlIGlucHV0IGNvbnRhaW5lcl9pZC4KICAgIHNvbWUgcF9jb250YWluZXIgaW4gcG9saWN5X2RhdGEuY29udGFpbmVycwogICAgYWxsb3dfaW50ZXJhY3RpdmVfZXhlYyhwX2NvbnRhaW5lciwgaW5wdXQucHJvY2VzcykKCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDE6IHRydWUiKQp9CkV4ZWNQcm9jZXNzUmVxdWVzdCB7CiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDI6IGlucHV0ID0iLCBpbnB1dCkKCiAgICAjIFRPRE86IG1hdGNoIGlucHV0IGNvbnRhaW5lciBJRCB3aXRoIGl0cyBjb3JyZXNwb25kaW5nIGNvbnRhaW5lci5leGVjX2NvbW1hbmRzLgogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBzb21lIHBfY29tbWFuZCBpbiBwX2NvbnRhaW5lci5leGVjX2NvbW1hbmRzCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDI6IHBfY29tbWFuZCA9IiwgcF9jb21tYW5kKQoKICAgICMgVE9ETzogc2hvdWxkIG90aGVyIGlucHV0IGRhdGEgZmllbGRzIGJlIHZhbGlkYXRlZCBhcyB3ZWxsPwogICAgcF9jb21tYW5kID09IGlucHV0LnByb2Nlc3MuQXJncwoKICAgIGFsbG93X2V4ZWMocF9jb250YWluZXIsIGlucHV0LnByb2Nlc3MpCgogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAyOiB0cnVlIikKfQpFeGVjUHJvY2Vzc1JlcXVlc3QgewogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAzOiBpbnB1dCA9IiwgaW5wdXQpCgogICAgaV9jb21tYW5kID0gY29uY2F0KCIgIiwgaW5wdXQucHJvY2Vzcy5BcmdzKQogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAzOiBpX2NvbW1hbmQgPSIsIGlfY29tbWFuZCkKCiAgICBzb21lIHBfcmVnZXggaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5FeGVjUHJvY2Vzc1JlcXVlc3QucmVnZXgKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMzogcF9yZWdleCA9IiwgcF9yZWdleCkKCiAgICByZWdleC5tYXRjaChwX3JlZ2V4LCBpX2NvbW1hbmQpCgogICAgIyBUT0RPOiBtYXRjaCBwX2NvbnRhaW5lcidzIElEIHdpdGggdGhlIGlucHV0IGNvbnRhaW5lcl9pZC4KICAgIHNvbWUgcF9jb250YWluZXIgaW4gcG9saWN5X2RhdGEuY29udGFpbmVycwogICAgYWxsb3dfaW50ZXJhY3RpdmVfZXhlYyhwX2NvbnRhaW5lciwgaW5wdXQucHJvY2VzcykKCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDM6IHRydWUiKQp9CgpVcGRhdGVSb3V0ZXNSZXF1ZXN0IHsKICAgIHByaW50KCJVcGRhdGVSb3V0ZXNSZXF1ZXN0OiBpbnB1dCA9IiwgaW5wdXQpCiAgICBwcmludCgiVXBkYXRlUm91dGVzUmVxdWVzdDogcG9saWN5ID0iLCBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLlVwZGF0ZVJvdXRlc1JlcXVlc3QpCgogICAgaV9yb3V0ZXMgOj0gaW5wdXQucm91dGVzLlJvdXRlcwogICAgcF9zb3VyY2VfcmVnZXggPSBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLlVwZGF0ZVJvdXRlc1JlcXVlc3QuZm9yYmlkZGVuX3NvdXJjZV9yZWdleAogICAgcF9uYW1lcyA9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuVXBkYXRlUm91dGVzUmVxdWVzdC5mb3JiaWRkZW5fZGV2aWNlX25hbWVzCgogICAgZXZlcnkgaV9yb3V0ZSBpbiBpX3JvdXRlcyB7CiAgICAgICAgcHJpbnQoImlfcm91dGUuc291cmNlID0iLCBpX3JvdXRlLnNvdXJjZSkKICAgICAgICBldmVyeSBwX3JlZ2V4IGluIHBfc291cmNlX3JlZ2V4IHsKICAgICAgICAgICAgcHJpbnQoInBfcmVnZXggPSIsIHBfcmVnZXgpCiAgICAgICAgICAgIG5vdCByZWdleC5tYXRjaChwX3JlZ2V4LCBpX3JvdXRlLnNvdXJjZSkKICAgICAgICB9CgogICAgICAgIHByaW50KCJpX3JvdXRlLmRldmljZSA9IiwgaV9yb3V0ZS5kZXZpY2UpCiAgICAgICAgbm90IGlfcm91dGUuZGV2aWNlIGluIHBfbmFtZXMKICAgIH0KCiAgICBwcmludCgiVXBkYXRlUm91dGVzUmVxdWVzdDogdHJ1ZSIpCn0KClVwZGF0ZUludGVyZmFjZVJlcXVlc3QgewogICAgcHJpbnQoIlVwZGF0ZUludGVyZmFjZVJlcXVlc3Q6IGlucHV0ID0iLCBpbnB1dCkKICAgIHByaW50KCJVcGRhdGVJbnRlcmZhY2VSZXF1ZXN0OiBwb2xpY3kgPSIsIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuVXBkYXRlSW50ZXJmYWNlUmVxdWVzdCkKCiAgICBpX2ludGVyZmFjZSA6PSBpbnB1dC5pbnRlcmZhY2UKICAgIHBfZmxhZ3MgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmFsbG93X3Jhd19mbGFncwoKICAgICMgVHlwaWNhbGx5LCBqdXN0IElGRl9OT0FSUCBpcyB1c2VkLgogICAgYml0cy5hbmQoaV9pbnRlcmZhY2UucmF3X2ZsYWdzLCBiaXRzLm5lZ2F0ZShwX2ZsYWdzKSkgPT0gMAoKICAgIHBfbmFtZXMgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmZvcmJpZGRlbl9uYW1lcwoKICAgIG5vdCBpX2ludGVyZmFjZS5uYW1lIGluIHBfbmFtZXMKCiAgICBwX2h3YWRkcnMgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmZvcmJpZGRlbl9od19hZGRycwoKICAgIG5vdCBpX2ludGVyZmFjZS5od0FkZHIgaW4gcF9od2FkZHJzCgogICAgcHJpbnQoIlVwZGF0ZUludGVyZmFjZVJlcXVlc3Q6IHRydWUiKQp9CgpDbG9zZVN0ZGluUmVxdWVzdCB7CiAgICBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLkNsb3NlU3RkaW5SZXF1ZXN0ID09IHRydWUKfQoKUmVhZFN0cmVhbVJlcXVlc3QgewogICAgcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5SZWFkU3RyZWFtUmVxdWVzdCA9PSB0cnVlCn0KClVwZGF0ZUVwaGVtZXJhbE1vdW50c1JlcXVlc3QgewogICAgcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVFcGhlbWVyYWxNb3VudHNSZXF1ZXN0ID09IHRydWUKfQoKV3JpdGVTdHJlYW1SZXF1ZXN0IHsKICAgIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuV3JpdGVTdHJlYW1SZXF1ZXN0ID09IHRydWUKfQoKcG9saWN5X2RhdGEgOj0gewogICJjb250YWluZXJzIjogWwogICAgewogICAgICAiT0NJIjogewogICAgICAgICJWZXJzaW9uIjogIjEuMS4wLXJjLjEiLAogICAgICAgICJQcm9jZXNzIjogewogICAgICAgICAgIlRlcm1pbmFsIjogZmFsc2UsCiAgICAgICAgICAiVXNlciI6IHsKICAgICAgICAgICAgIlVJRCI6IDY1NTM1LAogICAgICAgICAgICAiR0lEIjogNjU1MzUsCiAgICAgICAgICAgICJBZGRpdGlvbmFsR2lkcyI6IFtdLAogICAgICAgICAgICAiVXNlcm5hbWUiOiAiIgogICAgICAgICAgfSwKICAgICAgICAgICJEZXByZWNhdGVkQXJncyI6IFsKICAgICAgICAgICAgIi9wYXVzZSIKICAgICAgICAgIF0sCiAgICAgICAgICAiQXJncyI6IFsKICAgICAgICAgICAgIi9wYXVzZSIKICAgICAgICAgIF0sCiAgICAgICAgICAiRW52IjogWwogICAgICAgICAgICAiUEFUSD0vdXNyL2xvY2FsL3NiaW46L3Vzci9sb2NhbC9iaW46L3Vzci9zYmluOi91c3IvYmluOi9zYmluOi9iaW4iCiAgICAgICAgICBdLAogICAgICAgICAgIkN3ZCI6ICIvIiwKICAgICAgICAgICJDYXBhYmlsaXRpZXMiOiB7CiAgICAgICAgICAgICJBbWJpZW50IjogW10sCiAgICAgICAgICAgICJCb3VuZGluZyI6IFsKICAgICAgICAgICAgICAiJChkZWZhdWx0X2NhcHMpIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiRWZmZWN0aXZlIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJJbmhlcml0YWJsZSI6IFtdLAogICAgICAgICAgICAiUGVybWl0dGVkIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICAiTm9OZXdQcml2aWxlZ2VzIjogdHJ1ZQogICAgICAgIH0sCiAgICAgICAgIlJvb3QiOiB7CiAgICAgICAgICAiUGF0aCI6ICIkKGNwYXRoKS8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgIlJlYWRvbmx5IjogdHJ1ZQogICAgICAgIH0sCiAgICAgICAgIk1vdW50cyI6IFsKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9wcm9jIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJwcm9jIiwKICAgICAgICAgICAgInR5cGVfIjogInByb2MiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2IiwKICAgICAgICAgICAgInNvdXJjZSI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJzdHJpY3RhdGltZSIsCiAgICAgICAgICAgICAgIm1vZGU9NzU1IiwKICAgICAgICAgICAgICAic2l6ZT02NTUzNmsiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L3B0cyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiZGV2cHRzIiwKICAgICAgICAgICAgInR5cGVfIjogImRldnB0cyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJuZXdpbnN0YW5jZSIsCiAgICAgICAgICAgICAgInB0bXhtb2RlPTA2NjYiLAogICAgICAgICAgICAgICJtb2RlPTA2MjAiLAogICAgICAgICAgICAgICJnaWQ9NSIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvc2htIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L3NobSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi9tcXVldWUiLAogICAgICAgICAgICAic291cmNlIjogIm1xdWV1ZSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJtcXVldWUiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvc3lzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJzeXNmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJzeXNmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2V0Yy9yZXNvbHYuY29uZiIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClyZXNvbHYuY29uZiQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJvIiwKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9kZXYiLAogICAgICAgICAgICAgICJub2V4ZWMiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0KICAgICAgICBdLAogICAgICAgICJBbm5vdGF0aW9ucyI6IHsKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmJ1bmRsZV9wYXRoIjogIi9ydW4vY29udGFpbmVyZC9pby5jb250YWluZXJkLnJ1bnRpbWUudjIudGFzay9rOHMuaW8vJChidW5kbGUtaWQpIiwKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIjogInBvZF9zYW5kYm94IiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSI6ICJzYW5kYm94IiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWlkIjogIl5bYS16MC05XXs2NH0kIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWxvZy1kaXJlY3RvcnkiOiAiXi92YXIvbG9nL3BvZHMvJChzYW5kYm94LW5hbWVzcGFjZSlfJChzYW5kYm94LW5hbWUpX1swLTlhLWZdezh9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezEyfSQiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZXNwYWNlIjogIiIsCiAgICAgICAgICAibmVyZGN0bC9uZXR3b3JrLW5hbWVzcGFjZSI6ICJeL3Zhci9ydW4vbmV0bnMvY25pLVswLTlhLWZdezh9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezEyfSQiCiAgICAgICAgfSwKICAgICAgICAiTGludXgiOiB7CiAgICAgICAgICAiTmFtZXNwYWNlcyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICJUeXBlIjogImlwYyIsCiAgICAgICAgICAgICAgIlBhdGgiOiAiIgogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgIlR5cGUiOiAidXRzIiwKICAgICAgICAgICAgICAiUGF0aCI6ICIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiVHlwZSI6ICJtb3VudCIsCiAgICAgICAgICAgICAgIlBhdGgiOiAiIgogICAgICAgICAgICB9CiAgICAgICAgICBdLAogICAgICAgICAgIk1hc2tlZFBhdGhzIjogWwogICAgICAgICAgICAiL3Byb2MvYWNwaSIsCiAgICAgICAgICAgICIvcHJvYy9hc291bmQiLAogICAgICAgICAgICAiL3Byb2Mva2NvcmUiLAogICAgICAgICAgICAiL3Byb2Mva2V5cyIsCiAgICAgICAgICAgICIvcHJvYy9sYXRlbmN5X3N0YXRzIiwKICAgICAgICAgICAgIi9wcm9jL3RpbWVyX2xpc3QiLAogICAgICAgICAgICAiL3Byb2MvdGltZXJfc3RhdHMiLAogICAgICAgICAgICAiL3Byb2Mvc2NoZWRfZGVidWciLAogICAgICAgICAgICAiL3N5cy9maXJtd2FyZSIsCiAgICAgICAgICAgICIvcHJvYy9zY3NpIgogICAgICAgICAgXSwKICAgICAgICAgICJSZWFkb25seVBhdGhzIjogWwogICAgICAgICAgICAiL3Byb2MvYnVzIiwKICAgICAgICAgICAgIi9wcm9jL2ZzIiwKICAgICAgICAgICAgIi9wcm9jL2lycSIsCiAgICAgICAgICAgICIvcHJvYy9zeXMiLAogICAgICAgICAgICAiL3Byb2Mvc3lzcnEtdHJpZ2dlciIKICAgICAgICAgIF0sCiAgICAgICAgICAiRGV2aWNlcyI6IFtdLAogICAgICAgICAgIlN5c2N0bCI6IHsKICAgICAgICAgICAgIm5ldC5pcHY0LmlwX3VucHJpdmlsZWdlZF9wb3J0X3N0YXJ0IjogIjAiLAogICAgICAgICAgICAibmV0LmlwdjQucGluZ19ncm91cF9yYW5nZSI6ICIwIDIxNDc0ODM2NDciCiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9LAogICAgICAic3RvcmFnZXMiOiBbCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJibGsiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogInRhciIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIiQoaGFzaDApIgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGxheWVyMCkiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJvdmVybGF5ZnMiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogImZ1c2UzLmthdGEtb3ZlcmxheSIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIjVhNWFhZDgwMDU1ZmYyMDAxMmE1MGRjMjVmOGRmN2EyOTkyNDQ3NDMyNGQ2NWY3ZDUzMDZlZThlZTI3ZmY3MWQiLAogICAgICAgICAgICAiODE3MjUwZjFhM2UzMzZkYTc2ZjViZDNmYTc4NGUxYjI2ZDk1OWI5YzEzMTg3NjgxNWJhMjYwNDA0OGI3MGMxOCIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChjcGF0aCkvJChidW5kbGUtaWQpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9CiAgICAgIF0sCiAgICAgICJkZXZpY2VzIjogW10sCiAgICAgICJzYW5kYm94X3BpZG5zIjogZmFsc2UsCiAgICAgICJleGVjX2NvbW1hbmRzIjogW10sCiAgICAgICJlbnZfbWFwIjogewogICAgICAgICJQQVRIIjogIi91c3IvbG9jYWwvc2JpbjovdXNyL2xvY2FsL2JpbjovdXNyL3NiaW46L3Vzci9iaW46L3NiaW46L2JpbiIKICAgICAgfQogICAgfSwKICAgIHsKICAgICAgIk9DSSI6IHsKICAgICAgICAiVmVyc2lvbiI6ICIxLjEuMC1yYy4xIiwKICAgICAgICAiUHJvY2VzcyI6IHsKICAgICAgICAgICJUZXJtaW5hbCI6IGZhbHNlLAogICAgICAgICAgIlVzZXIiOiB7CiAgICAgICAgICAgICJVSUQiOiAwLAogICAgICAgICAgICAiR0lEIjogMCwKICAgICAgICAgICAgIkFkZGl0aW9uYWxHaWRzIjogW10sCiAgICAgICAgICAgICJVc2VybmFtZSI6ICIiCiAgICAgICAgICB9LAogICAgICAgICAgIkRlcHJlY2F0ZWRBcmdzIjogWwogICAgICAgICAgICAiL2Jpbi9zaCIsCiAgICAgICAgICAgICItYyIsCiAgICAgICAgICAgICJta2RpciAtcCAvdXNyL3NoYXJlL25naW54L2h0bWw7ZWNobyBcIjxodG1sPjxib2R5PjxoMT5IZWxsbyBmcm9tIEZyb250ZW5kPC9oMT48cD5Db25uZWN0aW5nIHRvIGJhY2tlbmQgYXQgJEJBQ0tFTkRfVVJMPC9wPjwvYm9keT48L2h0bWw+XCIgPiAvdXNyL3NoYXJlL25naW54L2h0bWwvaW5kZXguaHRtbDtcblJFVFJZX0xJTUlUPTU7XG5SRVRSSUVTPTA7XG53aGlsZSAhIGN1cmwgLXMgJEJBQ0tFTkRfVVJMID4gL2Rldi9udWxsOyBkb1xuICBSRVRSSUVTPSQoKFJFVFJJRVMrMSkpO1xuICBlY2hvIFwiQmFja2VuZCBpcyBub3QgYXZhaWxhYmxlLCByZXRyeWluZy4uLiBhdHRlbXB0ICgkUkVUUklFUy8kUkVUUllfTElNSVQpXCI7XG4gIGlmIFsgXCIkUkVUUklFU1wiIC1nZSBcIiRSRVRSWV9MSU1JVFwiIF07IHRoZW5cbiAgICBlY2hvIFwiQmFja2VuZCBpcyBub3QgYXZhaWxhYmxlIGFmdGVyICRSRVRSWV9MSU1JVCBhdHRlbXB0cywgZXhpdGluZy5cIjtcbiAgICBleGl0IDE7XG4gIGZpXG4gIHNsZWVwIDU7XG5kb25lO1xuZWNobyBcIkJhY2tlbmQgaXMgYXZhaWxhYmxlLCBzdGFydGluZyBuZ2lueC4uLlwiO1xubmdpbnggLWcgJ2RhZW1vbiBvZmY7J1xuIgogICAgICAgICAgXSwKICAgICAgICAgICJBcmdzIjogWwogICAgICAgICAgICAiL2Jpbi9zaCIsCiAgICAgICAgICAgICItYyIsCiAgICAgICAgICAgICJta2RpciAtcCAvdXNyL3NoYXJlL25naW54L2h0bWw7ZWNobyBcIjxodG1sPjxib2R5PjxoMT5IZWxsbyBmcm9tIEZyb250ZW5kPC9oMT48cD5Db25uZWN0aW5nIHRvIGJhY2tlbmQgYXQgJEJBQ0tFTkRfVVJMPC9wPjwvYm9keT48L2h0bWw+XCIgPiAvdXNyL3NoYXJlL25naW54L2h0bWwvaW5kZXguaHRtbDtcblJFVFJZX0xJTUlUPTU7XG5SRVRSSUVTPTA7XG53aGlsZSAhIGN1cmwgLXMgJEJBQ0tFTkRfVVJMID4gL2Rldi9udWxsOyBkb1xuICBSRVRSSUVTPSQoKFJFVFJJRVMrMSkpO1xuICBlY2hvIFwiQmFja2VuZCBpcyBub3QgYXZhaWxhYmxlLCByZXRyeWluZy4uLiBhdHRlbXB0ICgkUkVUUklFUy8kUkVUUllfTElNSVQpXCI7XG4gIGlmIFsgXCIkUkVUUklFU1wiIC1nZSBcIiRSRVRSWV9MSU1JVFwiIF07IHRoZW5cbiAgICBlY2hvIFwiQmFja2VuZCBpcyBub3QgYXZhaWxhYmxlIGFmdGVyICRSRVRSWV9MSU1JVCBhdHRlbXB0cywgZXhpdGluZy5cIjtcbiAgICBleGl0IDE7XG4gIGZpXG4gIHNsZWVwIDU7XG5kb25lO1xuZWNobyBcIkJhY2tlbmQgaXMgYXZhaWxhYmxlLCBzdGFydGluZyBuZ2lueC4uLlwiO1xubmdpbnggLWcgJ2RhZW1vbiBvZmY7J1xuIgogICAgICAgICAgXSwKICAgICAgICAgICJFbnYiOiBbCiAgICAgICAgICAgICJQQVRIPS91c3IvbG9jYWwvc2JpbjovdXNyL2xvY2FsL2JpbjovdXNyL3NiaW46L3Vzci9iaW46L3NiaW46L2JpbiIsCiAgICAgICAgICAgICJIT1NUTkFNRT0kKGhvc3QtbmFtZSkiLAogICAgICAgICAgICAiQkFDS0VORF9VUkw9aHR0cDovL2JhY2tlbmQ6ODA4MCIKICAgICAgICAgIF0sCiAgICAgICAgICAiQ3dkIjogIi8iLAogICAgICAgICAgIkNhcGFiaWxpdGllcyI6IHsKICAgICAgICAgICAgIkFtYmllbnQiOiBbXSwKICAgICAgICAgICAgIkJvdW5kaW5nIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJFZmZlY3RpdmUiOiBbCiAgICAgICAgICAgICAgIiQoZGVmYXVsdF9jYXBzKSIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgIkluaGVyaXRhYmxlIjogW10sCiAgICAgICAgICAgICJQZXJtaXR0ZWQiOiBbCiAgICAgICAgICAgICAgIiQoZGVmYXVsdF9jYXBzKSIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgICJOb05ld1ByaXZpbGVnZXMiOiBmYWxzZQogICAgICAgIH0sCiAgICAgICAgIlJvb3QiOiB7CiAgICAgICAgICAiUGF0aCI6ICIkKGNwYXRoKS8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgIlJlYWRvbmx5IjogZmFsc2UKICAgICAgICB9LAogICAgICAgICJNb3VudHMiOiBbCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvcHJvYyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAicHJvYyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJwcm9jIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAgICAgIm5vZGV2IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2RldiIsCiAgICAgICAgICAgICJzb3VyY2UiOiAidG1wZnMiLAogICAgICAgICAgICAidHlwZV8iOiAidG1wZnMiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAic3RyaWN0YXRpbWUiLAogICAgICAgICAgICAgICJtb2RlPTc1NSIsCiAgICAgICAgICAgICAgInNpemU9NjU1MzZrIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi9wdHMiLAogICAgICAgICAgICAic291cmNlIjogImRldnB0cyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJkZXZwdHMiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibmV3aW5zdGFuY2UiLAogICAgICAgICAgICAgICJwdG14bW9kZT0wNjY2IiwKICAgICAgICAgICAgICAibW9kZT0wNjIwIiwKICAgICAgICAgICAgICAiZ2lkPTUiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L3NobSIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiL3J1bi9rYXRhLWNvbnRhaW5lcnMvc2FuZGJveC9zaG0iLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvbXF1ZXVlIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJtcXVldWUiLAogICAgICAgICAgICAidHlwZV8iOiAibXF1ZXVlIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAgICAgIm5vZGV2IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL3N5cyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAic3lzZnMiLAogICAgICAgICAgICAidHlwZV8iOiAic3lzZnMiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiLAogICAgICAgICAgICAgICJybyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9zeXMvZnMvY2dyb3VwIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJjZ3JvdXAiLAogICAgICAgICAgICAidHlwZV8iOiAiY2dyb3VwIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAgICAgIm5vZGV2IiwKICAgICAgICAgICAgICAicmVsYXRpbWUiLAogICAgICAgICAgICAgICJybyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9ldGMvaG9zdHMiLAogICAgICAgICAgICAic291cmNlIjogIiQoc2ZwcmVmaXgpaG9zdHMkIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJ3IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi90ZXJtaW5hdGlvbi1sb2ciLAogICAgICAgICAgICAic291cmNlIjogIiQoc2ZwcmVmaXgpdGVybWluYXRpb24tbG9nJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJydyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9ldGMvaG9zdG5hbWUiLAogICAgICAgICAgICAic291cmNlIjogIiQoc2ZwcmVmaXgpaG9zdG5hbWUkIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJ3IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2V0Yy9yZXNvbHYuY29uZiIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClyZXNvbHYuY29uZiQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicnciCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvdmFyL3J1bi9zZWNyZXRzL2t1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQiLAogICAgICAgICAgICAic291cmNlIjogIiQoc2ZwcmVmaXgpc2VydmljZWFjY291bnQkIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL3Zhci9ydW4vc2VjcmV0cy9henVyZS90b2tlbnMiLAogICAgICAgICAgICAic291cmNlIjogIiQoc2ZwcmVmaXgpdG9rZW5zJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJybyIKICAgICAgICAgICAgXQogICAgICAgICAgfQogICAgICAgIF0sCiAgICAgICAgIkFubm90YXRpb25zIjogewogICAgICAgICAgImlvLmthdGFjb250YWluZXJzLnBrZy5vY2kuYnVuZGxlX3BhdGgiOiAiL3J1bi9jb250YWluZXJkL2lvLmNvbnRhaW5lcmQucnVudGltZS52Mi50YXNrL2s4cy5pby8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgImlvLmthdGFjb250YWluZXJzLnBrZy5vY2kuY29udGFpbmVyX3R5cGUiOiAicG9kX2NvbnRhaW5lciIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLW5hbWUiOiAiZnJvbnRlbmQiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLmNvbnRhaW5lci10eXBlIjogImNvbnRhaW5lciIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuaW1hZ2UtbmFtZSI6ICJtYXJpbmVyY29uZnBvZHN0ZXN0LmF6dXJlY3IuaW8vYXp1cmVsaW51eC9iYXNlL25naW54OjEuMjUiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtaWQiOiAiXlthLXowLTldezY0fSQiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZXNwYWNlIjogIiIKICAgICAgICB9LAogICAgICAgICJMaW51eCI6IHsKICAgICAgICAgICJOYW1lc3BhY2VzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgIlR5cGUiOiAiaXBjIiwKICAgICAgICAgICAgICAiUGF0aCI6ICIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiVHlwZSI6ICJ1dHMiLAogICAgICAgICAgICAgICJQYXRoIjogIiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJUeXBlIjogIm1vdW50IiwKICAgICAgICAgICAgICAiUGF0aCI6ICIiCiAgICAgICAgICAgIH0KICAgICAgICAgIF0sCiAgICAgICAgICAiTWFza2VkUGF0aHMiOiBbCiAgICAgICAgICAgICIvcHJvYy9hY3BpIiwKICAgICAgICAgICAgIi9wcm9jL2tjb3JlIiwKICAgICAgICAgICAgIi9wcm9jL2tleXMiLAogICAgICAgICAgICAiL3Byb2MvbGF0ZW5jeV9zdGF0cyIsCiAgICAgICAgICAgICIvcHJvYy90aW1lcl9saXN0IiwKICAgICAgICAgICAgIi9wcm9jL3RpbWVyX3N0YXRzIiwKICAgICAgICAgICAgIi9wcm9jL3NjaGVkX2RlYnVnIiwKICAgICAgICAgICAgIi9wcm9jL3Njc2kiLAogICAgICAgICAgICAiL3N5cy9maXJtd2FyZSIKICAgICAgICAgIF0sCiAgICAgICAgICAiUmVhZG9ubHlQYXRocyI6IFsKICAgICAgICAgICAgIi9wcm9jL2Fzb3VuZCIsCiAgICAgICAgICAgICIvcHJvYy9idXMiLAogICAgICAgICAgICAiL3Byb2MvZnMiLAogICAgICAgICAgICAiL3Byb2MvaXJxIiwKICAgICAgICAgICAgIi9wcm9jL3N5cyIsCiAgICAgICAgICAgICIvcHJvYy9zeXNycS10cmlnZ2VyIgogICAgICAgICAgXSwKICAgICAgICAgICJEZXZpY2VzIjogW10sCiAgICAgICAgICAiU3lzY3RsIjogewogICAgICAgICAgICAibmV0LmlwdjQuaXBfdW5wcml2aWxlZ2VkX3BvcnRfc3RhcnQiOiAiMCIsCiAgICAgICAgICAgICJuZXQuaXB2NC5waW5nX2dyb3VwX3JhbmdlIjogIjAgMjE0NzQ4MzY0NyIKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0sCiAgICAgICJzdG9yYWdlcyI6IFsKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoMCkiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXIwKSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoMSkiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXIxKSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoMikiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXIyKSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoMykiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXIzKSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoNCkiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXI0KSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogIm92ZXJsYXlmcyIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAiZnVzZTMua2F0YS1vdmVybGF5IiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiOGJmYmJhNzY5NjYzNjUyNDA0YTY0YTIzYTdlZWFiNzk0MzhkYWVkNzFhY2NmMzI5YTQwYTRmNjhlZmFmMGZmNDo4Y2M3YWZiY2RkMDRmMTdhZmY4ZjZkNDkzNWU0ZjU0YTFmNWFkZDQ3ZGNhNTE2ZThkMzU0NTNmMWY0MjE4MTY3OjkwMzBlNjBhYThkOGFiOWMyN2YwNTFlMmM3ODVhNTQ5ZDhhZWMxODg4MTY5OWVhYjMyMGEwNDA5ZjdmZGJlMzk6MzZhZjljMDgxNDZlNmQyNTFkNTEzZTU5ZTVhMWM2MmQ2MmNmYjllYmU4NTZkNzUzOTRiZWZkZGVjZTc0ODRjMTowMTY1YTBjMDc4NjU3NzVkZWE4M2E0NTE3YzEyNWZmMzBjMWUyYzFhMDk4ZTdjYmNlN2JjYWZlMmI3MTk5Y2JjIiwKICAgICAgICAgICAgIjI0OWVmNTVmY2Q0MTFjNWE4MDU0YWJiNjBlNzE1MTE1ZDU5OWViYmU2ODJkNmI3NGJlM2JkMTkyNzI0ODg1YzE6NTAyYjUzNzIwMWM3MTE1ZWYwZDE3MTUzMGM3Y2Y1YzBlNTExNzU0ZTljOTVmMDU5NDFlYzI3ZDE1YzllMDE5ODo0OGFhMTE4ZmRmZGE5YTMwMzg3ZTkwZTA2NjFmMmI1YjZjOGU4NzM1NGQxZmE5YTM3YmY1ODUxM2FjM2U0NTEyOjlmNjI1NDY0YzdiMzRhNTUzNmY0MzFmNWQyOTQ2MzQzZDI3MjU4MGUzNjQ0NmRkYjEyYjA0MDE2MmU1NDNjZTE6ZDQ0OTFlYTE4ODcxMDVlZjA2MDFmNGU1ZmEzOTgzZmZlNTdkN2E1N2VlOGY2YjAzNzA5MWY0MjE4YzFhNjM1OCIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChjcGF0aCkvJChidW5kbGUtaWQpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9CiAgICAgIF0sCiAgICAgICJkZXZpY2VzIjogW10sCiAgICAgICJzYW5kYm94X3BpZG5zIjogZmFsc2UsCiAgICAgICJleGVjX2NvbW1hbmRzIjogW10sCiAgICAgICJlbnZfbWFwIjogewogICAgICAgICJCQUNLRU5EX1VSTCI6ICJodHRwOi8vYmFja2VuZDo4MDgwIiwKICAgICAgICAiSE9TVE5BTUUiOiAiJChob3N0LW5hbWUpIiwKICAgICAgICAiUEFUSCI6ICIvdXNyL2xvY2FsL3NiaW46L3Vzci9sb2NhbC9iaW46L3Vzci9zYmluOi91c3IvYmluOi9zYmluOi9iaW4iCiAgICAgIH0KICAgIH0KICBdLAogICJjb21tb24iOiB7CiAgICAiY3BhdGgiOiAiL3J1bi9rYXRhLWNvbnRhaW5lcnMvc2hhcmVkL2NvbnRhaW5lcnMiLAogICAgIm1vdW50X3NvdXJjZV9jcGF0aCI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zaGFyZWQvY29udGFpbmVycyIsCiAgICAic2ZwcmVmaXgiOiAiXiQoY3BhdGgpLyQoYnVuZGxlLWlkKS1bYS16MC05XXsxNn0tIiwKICAgICJzcGF0aCI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L3N0b3JhZ2UiLAogICAgImlwdjRfYSI6ICIoKFswLTldfFsxLTldWzAtOV18MVswLTldezJ9fDJbMC00XVswLTldfDI1WzAtNV0pXFwuKXszfShbMC05XXxbMS05XVswLTldfDFbMC05XXsyfXwyWzAtNF1bMC05XXwyNVswLTVdKSIsCiAgICAiaXBfcCI6ICJbMC05XXsxLDV9IiwKICAgICJzdmNfbmFtZSI6ICJbQS1aX1xcLlxcLV0rIiwKICAgICJkbnNfbGFiZWwiOiAiW2EtekEtWjAtOV9cXC5cXC1dKyIsCiAgICAic19zb3VyY2UxIjogIl4uLjJbMC05XXszfV9bMC0xXVswLTldX1swLTNdWzAtOV1fWzAtMl1bMC05XV9bMC01XVswLTldX1swLTVdWzAtOV1cXC5bMC05XXsxLDEwfSQiLAogICAgInNfc291cmNlMiI6ICJeLi5kYXRhLyIsCiAgICAiZG5zX3N1YmRvbWFpbiI6ICJeW2EtejAtOV0oWy1hLXowLTldKlthLXowLTldKT8kIiwKICAgICJwb2RfdWlkIjogIl5bMC05YS1mQS1GXXs4fS1bMC05YS1mQS1GXXs0fS1bMC05YS1mQS1GXXs0fS1bMC05YS1mQS1GXXs0fS1bMC05YS1mQS1GXXsxMn0kIiwKICAgICJkZWZhdWx0X2NhcHMiOiBbCiAgICAgICJDQVBfQ0hPV04iLAogICAgICAiQ0FQX0RBQ19PVkVSUklERSIsCiAgICAgICJDQVBfRlNFVElEIiwKICAgICAgIkNBUF9GT1dORVIiLAogICAgICAiQ0FQX01LTk9EIiwKICAgICAgIkNBUF9ORVRfUkFXIiwKICAgICAgIkNBUF9TRVRHSUQiLAogICAgICAiQ0FQX1NFVFVJRCIsCiAgICAgICJDQVBfU0VURkNBUCIsCiAgICAgICJDQVBfU0VUUENBUCIsCiAgICAgICJDQVBfTkVUX0JJTkRfU0VSVklDRSIsCiAgICAgICJDQVBfU1lTX0NIUk9PVCIsCiAgICAgICJDQVBfS0lMTCIsCiAgICAgICJDQVBfQVVESVRfV1JJVEUiCiAgICBdLAogICAgInByaXZpbGVnZWRfY2FwcyI6IFsKICAgICAgIkNBUF9DSE9XTiIsCiAgICAgICJDQVBfREFDX09WRVJSSURFIiwKICAgICAgIkNBUF9EQUNfUkVBRF9TRUFSQ0giLAogICAgICAiQ0FQX0ZPV05FUiIsCiAgICAgICJDQVBfRlNFVElEIiwKICAgICAgIkNBUF9LSUxMIiwKICAgICAgIkNBUF9TRVRHSUQiLAogICAgICAiQ0FQX1NFVFVJRCIsCiAgICAgICJDQVBfU0VUUENBUCIsCiAgICAgICJDQVBfTElOVVhfSU1NVVRBQkxFIiwKICAgICAgIkNBUF9ORVRfQklORF9TRVJWSUNFIiwKICAgICAgIkNBUF9ORVRfQlJPQURDQVNUIiwKICAgICAgIkNBUF9ORVRfQURNSU4iLAogICAgICAiQ0FQX05FVF9SQVciLAogICAgICAiQ0FQX0lQQ19MT0NLIiwKICAgICAgIkNBUF9JUENfT1dORVIiLAogICAgICAiQ0FQX1NZU19NT0RVTEUiLAogICAgICAiQ0FQX1NZU19SQVdJTyIsCiAgICAgICJDQVBfU1lTX0NIUk9PVCIsCiAgICAgICJDQVBfU1lTX1BUUkFDRSIsCiAgICAgICJDQVBfU1lTX1BBQ0NUIiwKICAgICAgIkNBUF9TWVNfQURNSU4iLAogICAgICAiQ0FQX1NZU19CT09UIiwKICAgICAgIkNBUF9TWVNfTklDRSIsCiAgICAgICJDQVBfU1lTX1JFU09VUkNFIiwKICAgICAgIkNBUF9TWVNfVElNRSIsCiAgICAgICJDQVBfU1lTX1RUWV9DT05GSUciLAogICAgICAiQ0FQX01LTk9EIiwKICAgICAgIkNBUF9MRUFTRSIsCiAgICAgICJDQVBfQVVESVRfV1JJVEUiLAogICAgICAiQ0FQX0FVRElUX0NPTlRST0wiLAogICAgICAiQ0FQX1NFVEZDQVAiLAogICAgICAiQ0FQX01BQ19PVkVSUklERSIsCiAgICAgICJDQVBfTUFDX0FETUlOIiwKICAgICAgIkNBUF9TWVNMT0ciLAogICAgICAiQ0FQX1dBS0VfQUxBUk0iLAogICAgICAiQ0FQX0JMT0NLX1NVU1BFTkQiLAogICAgICAiQ0FQX0FVRElUX1JFQUQiLAogICAgICAiQ0FQX1BFUkZNT04iLAogICAgICAiQ0FQX0JQRiIsCiAgICAgICJDQVBfQ0hFQ0tQT0lOVF9SRVNUT1JFIgogICAgXSwKICAgICJ2aXJ0aW9fYmxrX3N0b3JhZ2VfY2xhc3NlcyI6IFsKICAgICAgImNjLWxvY2FsLWNzaSIsCiAgICAgICJjYy1tYW5hZ2VkLWNzaSIsCiAgICAgICJjYy1tYW5hZ2VkLXByZW1pdW0tY3NpIgogICAgXSwKICAgICJzbWJfc3RvcmFnZV9jbGFzc2VzIjogWwogICAgICB7CiAgICAgICAgIm5hbWUiOiAiYXp1cmVmaWxlLWNzaS1rYXRhLWNjIiwKICAgICAgICAibW91bnRfb3B0aW9ucyI6IFsKICAgICAgICAgICJkaXJfbW9kZT0wNzc3IiwKICAgICAgICAgICJmaWxlX21vZGU9MDc3NyIsCiAgICAgICAgICAibWZzeW1saW5rcyIsCiAgICAgICAgICAiY2FjaGU9c3RyaWN0IiwKICAgICAgICAgICJub3NoYXJlc29jayIsCiAgICAgICAgICAiYWN0aW1lbz0zMCIsCiAgICAgICAgICAibm9icmwiCiAgICAgICAgXQogICAgICB9CiAgICBdCiAgfSwKICAic2FuZGJveCI6IHsKICAgICJzdG9yYWdlcyI6IFsKICAgICAgewogICAgICAgICJkcml2ZXIiOiAiZXBoZW1lcmFsIiwKICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAic291cmNlIjogInNobSIsCiAgICAgICAgImZzdHlwZSI6ICJ0bXBmcyIsCiAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgIm5vZGV2IiwKICAgICAgICAgICJtb2RlPTE3NzciLAogICAgICAgICAgInNpemU9NjcxMDg4NjQiCiAgICAgICAgXSwKICAgICAgICAibW91bnRfcG9pbnQiOiAiL3J1bi9rYXRhLWNvbnRhaW5lcnMvc2FuZGJveC9zaG0iLAogICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgfQogICAgXQogIH0sCiAgInJlcXVlc3RfZGVmYXVsdHMiOiB7CiAgICAiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdCI6IHsKICAgICAgImFsbG93X2Vudl9yZWdleCI6IFsKICAgICAgICAiXkhPU1ROQU1FPSQoZG5zX2xhYmVsKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfUE9SVF8kKGlwX3ApX1RDUD10Y3A6Ly8kKGlwdjRfYSk6JChpcF9wKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfUE9SVF8kKGlwX3ApX1RDUF9QUk9UTz10Y3AkIiwKICAgICAgICAiXiQoc3ZjX25hbWUpX1BPUlRfJChpcF9wKV9UQ1BfUE9SVD0kKGlwX3ApJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9QT1JUXyQoaXBfcClfVENQX0FERFI9JChpcHY0X2EpJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9TRVJWSUNFX0hPU1Q9JChpcHY0X2EpJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9TRVJWSUNFX1BPUlQ9JChpcF9wKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfU0VSVklDRV9QT1JUXyQoZG5zX2xhYmVsKT0kKGlwX3ApJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9QT1JUPXRjcDovLyQoaXB2NF9hKTokKGlwX3ApJCIsCiAgICAgICAgIl5BWlVSRV9DTElFTlRfSUQ9W0EtRmEtZjAtOS1dKiQiLAogICAgICAgICJeQVpVUkVfVEVOQU5UX0lEPVtBLUZhLWYwLTktXSokIiwKICAgICAgICAiXkFaVVJFX0ZFREVSQVRFRF9UT0tFTl9GSUxFPS92YXIvcnVuL3NlY3JldHMvYXp1cmUvdG9rZW5zL2F6dXJlLWlkZW50aXR5LXRva2VuJCIsCiAgICAgICAgIl5BWlVSRV9BVVRIT1JJVFlfSE9TVD1odHRwczovL2xvZ2luXFwubWljcm9zb2Z0b25saW5lXFwuY29tLyQiLAogICAgICAgICJeVEVSTT14dGVybSQiCiAgICAgIF0sCiAgICAgICJhbGxvd19lbnZfcmVnZXhfbWFwIjogewogICAgICAgICJDUFVfTElNSVQiOiAiXlswLTldKyQiLAogICAgICAgICJKT0JfQ09NUExFVElPTl9JTkRFWCI6ICJeWzAtOV0qJCIsCiAgICAgICAgIk1FTU9SWV9MSU1JVCI6ICJeWzAtOV0rJCIKICAgICAgfQogICAgfSwKICAgICJDb3B5RmlsZVJlcXVlc3QiOiBbCiAgICAgICIkKHNmcHJlZml4KSIKICAgIF0sCiAgICAiRXhlY1Byb2Nlc3NSZXF1ZXN0IjogewogICAgICAiYWxsb3dlZF9jb21tYW5kcyI6IFtdLAogICAgICAicmVnZXgiOiBbXQogICAgfSwKICAgICJVcGRhdGVSb3V0ZXNSZXF1ZXN0IjogewogICAgICAiZm9yYmlkZGVuX2RldmljZV9uYW1lcyI6IFsKICAgICAgICAibG8iCiAgICAgIF0sCiAgICAgICJmb3JiaWRkZW5fc291cmNlX3JlZ2V4IjogWwogICAgICAgICJeKD86MHswLDR9Oil7MCw3fTB7MCwzfTEkIiwKICAgICAgICAiXjEyN1xcLig/OlswLTldezEsM31cXC4pezJ9WzAtOV17MSwzfSQiCiAgICAgIF0KICAgIH0sCiAgICAiVXBkYXRlSW50ZXJmYWNlUmVxdWVzdCI6IHsKICAgICAgImFsbG93X3Jhd19mbGFncyI6IDEyOCwKICAgICAgImZvcmJpZGRlbl9uYW1lcyI6IFsKICAgICAgICAibG8iCiAgICAgIF0sCiAgICAgICJmb3JiaWRkZW5faHdfYWRkcnMiOiBbCiAgICAgICAgIjAwOjAwOjAwOjAwOjAwOjAwIgogICAgICBdCiAgICB9LAogICAgIkNsb3NlU3RkaW5SZXF1ZXN0IjogZmFsc2UsCiAgICAiUmVhZFN0cmVhbVJlcXVlc3QiOiBmYWxzZSwKICAgICJVcGRhdGVFcGhlbWVyYWxNb3VudHNSZXF1ZXN0IjogZmFsc2UsCiAgICAiV3JpdGVTdHJlYW1SZXF1ZXN0IjogZmFsc2UKICB9Cn0= + spec: + nodeSelector: + kubernetes.io/os: linux + runtimeClassName: kata-cc + containers: + - name: frontend + image: "marinerconfpodstest.azurecr.io/azurelinux/base/nginx:1.25" + ports: + - containerPort: 80 + env: + - name: BACKEND_URL + value: "http://backend:8080" + command: + - /bin/sh + args: + - "-c" + - "mkdir -p /usr/share/nginx/html;echo \"

Hello from Frontend

Connecting to backend at $BACKEND_URL

\" > /usr/share/nginx/html/index.html;\nRETRY_LIMIT=5;\nRETRIES=0;\nwhile ! curl -s $BACKEND_URL > /dev/null; do\n RETRIES=$((RETRIES+1));\n echo \"Backend is not available, retrying... attempt ($RETRIES/$RETRY_LIMIT)\";\n if [ \"$RETRIES\" -ge \"$RETRY_LIMIT\" ]; then\n echo \"Backend is not available after $RETRY_LIMIT attempts, exiting.\";\n exit 1;\n fi\n sleep 5;\ndone;\necho \"Backend is available, starting nginx...\";\nnginx -g 'daemon off;'\n" + restartPolicy: Always +--- +apiVersion: v1 +kind: Service +metadata: + name: frontend +spec: + type: LoadBalancer + ports: + - port: 80 + selector: + app: frontend diff --git a/src/agent/samples/policy/yaml/dont-enable-kata-debug/pod-lots-of-layers.yaml b/src/agent/samples/policy/yaml/dont-enable-kata-debug/pod-lots-of-layers.yaml new file mode 100644 index 000000000000..022d4d7e2a99 --- /dev/null +++ b/src/agent/samples/policy/yaml/dont-enable-kata-debug/pod-lots-of-layers.yaml @@ -0,0 +1,57 @@ +--- +# This pod fails to start if Kata debug features are enabled. +# It starts successfully without Kata debug output. +# +# The policy generated by the genpolicy tool is also too large +# and therefore gets rejected by "kubectl apply". +apiVersion: v1 +kind: Pod +metadata: + name: debug-failing-many-layers +spec: + terminationGracePeriodSeconds: 0 + restartPolicy: Never + runtimeClassName: kata-cc + containers: + # 11 layers + - name: footloose + image: "quay.io/footloose/ubuntu18.04:latest" + command: + - sh + - "-c" + - while true; do echo go; sleep 25; done + # 9 layers + - name: bootloose + image: "quay.io/k0sproject/bootloose-ubuntu22.04:latest" + command: + - sh + - "-c" + - while true; do echo go; sleep 25; done + # 6 layers + - name: nginx + image: "marinerconfpodstest.azurecr.io/azurelinux/base/nginx:1.25" + command: + - sh + - "-c" + - while true; do echo nginx; sleep 10; done + # 5 layers + - name: redis + image: "mcr.microsoft.com/oss/bitnami/redis:6.0.8" + command: + - sh + - "-c" + - while true; do echo redis; sleep 20; done + # 4 layers + - name: go + image: "mcr.microsoft.com/appsvc/go:1.19-bullseye_20230324.1" + command: + - sh + - "-c" + - while true; do echo go; sleep 25; done + # 4 layers + - name: sysbench-kata + image: "quay.io/kata-containers/sysbench-kata:latest" + command: + - sh + - "-c" + - while true; do echo go; sleep 25; done diff --git a/src/agent/samples/policy/yaml/job/test-job.yaml b/src/agent/samples/policy/yaml/job/test-job.yaml new file mode 100644 index 000000000000..a0f2b34ed84c --- /dev/null +++ b/src/agent/samples/policy/yaml/job/test-job.yaml @@ -0,0 +1,28 @@ +--- +apiVersion: batch/v1 +kind: Job +metadata: + generateName: test-job- +spec: + template: + metadata: + name: foo + annotations: + io.katacontainers.config.agent.policy: IyBDb3B5cmlnaHQgKGMpIDIwMjMgTWljcm9zb2Z0IENvcnBvcmF0aW9uCiMKIyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMAojCnBhY2thZ2UgYWdlbnRfcG9saWN5CgppbXBvcnQgZnV0dXJlLmtleXdvcmRzLmluCmltcG9ydCBmdXR1cmUua2V5d29yZHMuZXZlcnkKCiMgRGVmYXVsdCB2YWx1ZXMsIHJldHVybmVkIGJ5IE9QQSB3aGVuIHJ1bGVzIGNhbm5vdCBiZSBldmFsdWF0ZWQgdG8gdHJ1ZS4KZGVmYXVsdCBBZGRBUlBOZWlnaGJvcnNSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgQWRkU3dhcFJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBDbG9zZVN0ZGluUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IENvcHlGaWxlUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IENyZWF0ZUNvbnRhaW5lclJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBDcmVhdGVTYW5kYm94UmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IERlc3Ryb3lTYW5kYm94UmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgRXhlY1Byb2Nlc3NSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgR2V0T09NRXZlbnRSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBHdWVzdERldGFpbHNSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBMaXN0SW50ZXJmYWNlc1JlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBMaXN0Um91dGVzUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IE1lbUhvdHBsdWdCeVByb2JlUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IE9ubGluZUNQVU1lbVJlcXVlc3QgOj0gdHJ1ZQpkZWZhdWx0IFBhdXNlQ29udGFpbmVyUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFJlYWRTdHJlYW1SZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgUmVtb3ZlQ29udGFpbmVyUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgUmVtb3ZlU3RhbGVWaXJ0aW9mc1NoYXJlTW91bnRzUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgUmVzZWVkUmFuZG9tRGV2UmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFJlc3VtZUNvbnRhaW5lclJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBTZXRHdWVzdERhdGVUaW1lUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFNldFBvbGljeVJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBTaWduYWxQcm9jZXNzUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgU3RhcnRDb250YWluZXJSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBTdGFydFRyYWNpbmdSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgU3RhdHNDb250YWluZXJSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBTdG9wVHJhY2luZ1JlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBUdHlXaW5SZXNpemVSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBVcGRhdGVDb250YWluZXJSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgVXBkYXRlRXBoZW1lcmFsTW91bnRzUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFVwZGF0ZUludGVyZmFjZVJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBVcGRhdGVSb3V0ZXNSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgV2FpdFByb2Nlc3NSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBXcml0ZVN0cmVhbVJlcXVlc3QgOj0gZmFsc2UKCiMgQWxsb3dSZXF1ZXN0c0ZhaWxpbmdQb2xpY3kgOj0gdHJ1ZSBjb25maWd1cmVzIHRoZSBBZ2VudCB0byAqYWxsb3cgYW55CiMgcmVxdWVzdHMgY2F1c2luZyBhIHBvbGljeSBmYWlsdXJlKi4gVGhpcyBpcyBhbiB1bnNlY3VyZSBjb25maWd1cmF0aW9uCiMgYnV0IGlzIHVzZWZ1bCBmb3IgYWxsb3dpbmcgdW5zZWN1cmUgcG9kcyB0byBzdGFydCwgdGhlbiBjb25uZWN0IHRvCiMgdGhlbSBhbmQgaW5zcGVjdCBPUEEgbG9ncyBmb3IgdGhlIHJvb3QgY2F1c2Ugb2YgYSBmYWlsdXJlLgpkZWZhdWx0IEFsbG93UmVxdWVzdHNGYWlsaW5nUG9saWN5IDo9IGZhbHNlCgojIENvbnN0YW50cwpTX05BTUVfS0VZID0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZSIKU19OQU1FU1BBQ0VfS0VZID0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZXNwYWNlIgpCVU5ETEVfSUQgPSAiW2EtejAtOV17NjR9IgoKQ3JlYXRlQ29udGFpbmVyUmVxdWVzdDo9IHJlc3AgewogICAgbm90IGlzX251bGwoaW5wdXQuZW52X21hcCkKICAgIAogICAgaV9lbnZfbWFwIDo9IGlucHV0LmVudl9tYXAKICAgIAogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBwX2Vudl9tYXAgOj0gcF9jb250YWluZXIuZW52X21hcCAgCiAgICBhbGxvd19lbnZfbWFwKHBfZW52X21hcCwgaV9lbnZfbWFwKQogICAgCiAgICBpX3Byb2Nlc3MgOj0gaW5wdXQuYmFzZS5PQ0kuUHJvY2VzcwogICAgCiAgICBwX3Byb2Nlc3MgOj0gcF9jb250YWluZXIuT0NJLlByb2Nlc3MKICAgIAogICAgYWxsb3dfYXJncyhpX3Byb2Nlc3MsIHBfcHJvY2VzcywgaV9lbnZfbWFwKQoKICAgIHJlc3AgPSBDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uKGlucHV0LmJhc2UpCiAgICBwcmludCgiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdDogdHJ1ZSIpCn0KCmFsbG93X2FyZ3MoaV9wcm9jZXNzLCBwX3Byb2Nlc3MsIGlfZW52X21hcCkgewogICAgaV9hcmdzIDo9IGlfcHJvY2Vzcy5BcmdzCiAgICBwX2FyZ3MgOj0gcF9wcm9jZXNzLkFyZ3MKICAgIHByaW50KCJhbGxvd19hcmdzOiBpX2FyZ3MgPSIsIGlfYXJncywgInBfYXJncyA9IiwgcF9hcmdzKQogICAgY291bnQoaV9hcmdzKSA9PSBjb3VudChwX2FyZ3MpCiAgICBldmVyeSBpLCBpX2FyZyBpbiBpX2FyZ3MgewogICAgICAgIHByaW50KCJhbGxvd19hcmdzOiBpX2FyZyA9IiwgaV9hcmcpCiAgICAgICAgcF9hcmdfcmVwbGFjZWQgOj0gcmVwbGFjZV9lbnZfdmFyaWFibGVzKHBfYXJnc1tpXSwgaV9lbnZfbWFwKQogICAgICAgIHByaW50KCJhbGxvd19hcmdzOiBwX2FyZ19yZXBsYWNlZCA9IiwgcF9hcmdfcmVwbGFjZWQpCiAgICAgICAgcF9hcmdfcmVwbGFjZWQyIDo9IHJlcGxhY2UocF9hcmdfcmVwbGFjZWQsICIkJCIsICIkIikKICAgICAgICBwcmludCgiYWxsb3dfYXJnczogcF9hcmdfcmVwbGFjZWQyID0iLCBwX2FyZ19yZXBsYWNlZDIpCiAgICAgICAgaV9hcmcgPT0gcF9hcmdfcmVwbGFjZWQyCiAgICB9CiAgICBwcmludCgiYWxsb3dfYXJnczogdHJ1ZSIpCn0KCmFsbG93X2FyZ3MoaV9wcm9jZXNzLCBwX3Byb2Nlc3MsIGlfZW52X21hcCkgewogICAgbm90IGlfcHJvY2Vzcy5BcmdzCiAgICBub3QgcF9wcm9jZXNzLkFyZ3MKICAgIHByaW50KCJhbGxvd19hcmdzMjogbm8gYXJncyIpCn0KCiMgdGhpcyBmdW5jdGlvbiByZXBsYWNlcyBhbGwgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyBpbiBhIHN0cmluZywgZ2l2ZW4gYSBtYXAgb2YgZW52aXJvbm1lbnQga2V5cyB0byBlbnZpcm9ubWVudCB2YWx1ZXMKIyBlZyBzdHIgPSAiZWNobyAkKENMVVNURVJfSUQpOyBlY2hvICQoTk9ERV9OQU1FKTsiCiMgZW52X21hcCA9IHsiQ0xVU1RFUl9JRCI6ICJhYmMiLCAiTk9ERV9OQU1FIiA6ICJ4eXoifQojIHJlc3VsdCA9ICJlY2hvIGFiYzsgZWNobyB4eXo7IgpyZXBsYWNlX2Vudl92YXJpYWJsZXMoc3RyLCBlbnZfbWFwKSA9IHJlc3VsdCB7CiAgICAjIG1ha2UgYW4gYXJyYXkgb2YgdGhlIGtleXMgZWcgWyJDTFVTVEVSX0lEIiwgIk5PREVfTkFNRSJdCiAgICBrZXlzIDo9IFt4IHwgc29tZSB4IGluIG9iamVjdC5rZXlzKGVudl9tYXApXQogICAgcmVzdWx0IDo9IHJlcGxhY2Vfc3RyX3JlYyhzdHIsIGVudl9tYXAsIGtleXMsIGNvdW50KGtleXMpIC0gMSkKfQoKIyBiYXNlIGNhc2UKcmVwbGFjZV9zdHJfcmVjKHN0ciwgZW52X21hcCwgYXJyX2tleXMsIGkpID0gcmVzdWx0IHsKICAgIGkgPCAwCiAgICByZXN1bHQgOj0gc3RyCn0KCiMgcmVjdXJzaXZlIHN0ZXAKcmVwbGFjZV9zdHJfcmVjKHN0ciwgZW52X21hcCwgYXJyX2tleXMsIGkpID0gcmVzdWx0IHsKICAgIGkgPj0gMAogICAga2V5IDo9IGFycl9rZXlzW2ldCiAgICBlbnZfa2V5MSA6PSBjb25jYXQoIiIsIFsiJCgiLCBrZXksICIpIl0pCiAgICAjIHJlcGxhY2UgJChWQVIpIHdpdGggdmFsdWUKICAgIG5ld19zdHIxIDo9IHJlcGxhY2Uoc3RyLCBlbnZfa2V5MSwgZW52X21hcFtrZXldKQogICAgIyByZXBsYWNlIG5leHQgZW52aXJvbm1lbnQgdmFyaWFibGUKICAgIHJlc3VsdCA9IHJlcGxhY2Vfc3RyX3JlYyhuZXdfc3RyMSwgZW52X21hcCwgYXJyX2tleXMsIGkgLSAxKQp9CgphbGxvd19lbnZfbWFwKHBfZW52X21hcCwgaV9lbnZfbWFwKSB7CiAgICBwcmludCgiYWxsb3dfZW52X21hcDogcF9lbnZfbWFwID0iLCBwX2Vudl9tYXApCiAgICBldmVyeSBlbnZfa2V5LCBlbnZfdmFsIGluIGlfZW52X21hcCB7CiAgICAgICAgcHJpbnQoImFsbG93X2VudjogZW52X2tleSA9IiwgZW52X2tleSwgImVudl92YWwgPSIsIGVudl92YWwpCiAgICAgICAgYWxsb3dfZW52X21hcF9lbnRyeShlbnZfa2V5LCBlbnZfdmFsLCBwX2Vudl9tYXApCiAgICB9CiAgICBwcmludCgiYWxsb3dfZW52X21hcDogdHJ1ZSIpCn0KCiMgQWxsb3cgZXhhY3QgbWF0Y2gKYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBpX3ZhbCA9PSBwX3ZhbAogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnk6IHRydWUiKQp9CgojIEFsbG93IHJlc291cmNlRmllbGRSZWYgdmFsdWVzIChlLmcuLCAibGltaXRzLmNwdSIpLgphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgICMgYSB2YXJpYWJsZSB3ZSBzaG91bGQgYmUgdmFsaWRhdGluZyB1c2luZyBhIHJlZ2V4IGZyb20gc2V0dGluZ3MKICAgIHBfdmFsID09ICIkKHZhbGlkYXRlLWZyb20tc2V0dGluZ3MpIgogICAgcmVnZXhfdmFsIDo9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuQ3JlYXRlQ29udGFpbmVyUmVxdWVzdC5hbGxvd19lbnZfcmVnZXhfbWFwW2tleV0KICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4X3ZhbCwgaV92YWwpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSAyOiB0cnVlIikKfQoKIyBBbGxvdyBub2RlLW5hbWUKYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChub2RlLW5hbWUpIgogICAgcmVnZXgubWF0Y2gocG9saWN5X2RhdGEuY29tbW9uLmRuc19zdWJkb21haW4gLCBpX3ZhbCkKICAgIHByaW50KCJhbGxvd19lbnZfbWFwX2VudHJ5IDM6IHRydWUiKQp9CgojIEFsbG93IGhvc3QtbmFtZQphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgIHBfdmFsID09ICIkKGhvc3QtbmFtZSkiCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24uZG5zX2xhYmVsICwgaV92YWwpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSA0OiB0cnVlIikKfQoKIyBBbGxvdyBwb2QtdWlkCmFsbG93X2Vudl9tYXBfZW50cnkoa2V5LCBpX3ZhbCwgcF9lbnZfbWFwKSB7CiAgICBwX3ZhbCA6PSBwX2Vudl9tYXBba2V5XQogICAgcF92YWwgPT0gIiQocG9kLXVpZCkiCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24ucG9kX3VpZCAsIGlfdmFsKQogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgNTogdHJ1ZSIpCn0KCiMgQWxsb3cgZmllbGRSZWYgImZpZWxkUGF0aDogc3RhdHVzLnBvZElQIiB2YWx1ZXMuCmFsbG93X2Vudl9tYXBfZW50cnkoa2V5LCBpX3ZhbCwgcF9lbnZfbWFwKSB7CiAgICBpc19pcChpX3ZhbCkKCiAgICBwX3ZhbCA6PSBwX2Vudl9tYXBba2V5XQogICAgcF92YXIgOj0gY29uY2F0KCI9IiwgW2tleSwgcF92YWxdKQogICAgYWxsb3dfcG9kX2lwX3ZhcihrZXksIHBfdmFyKQogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgNjogdHJ1ZSIpCn0KCiMgQWxsb3cgZmllbGRSZWYgImZpZWxkUGF0aDogc3RhdHVzLmhvc3RJUCIgdmFsdWVzLgphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgaXNfaXAoaV92YWwpCgogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgIHBfdmFyIDo9IGNvbmNhdCgiPSIsIFtrZXksIHBfdmFsXSkKICAgIGFsbG93X2hvc3RfaXBfdmFyKGtleSwgcF92YXIpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSA3OiB0cnVlIikKfQoKIyBNYXRjaCBpbnB1dCB3aXRoIG9uZSBvZiB0aGUgcG9saWN5IHZhcmlhYmxlcywgYWZ0ZXIgc3Vic3RpdHV0aW5nICQoc2FuZGJveC1uYW1lKS4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChzYW5kYm94LW5hbWUpIgogICAgc19uYW1lIDo9IGlucHV0LmJhc2UuT0NJLkFubm90YXRpb25zW1NfTkFNRV9LRVldCiAgICBwX3ZhcjIgOj0gcmVwbGFjZShwX3ZhbCwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHBfdmFyMiA9PSBpX3ZhbAogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgODogdHJ1ZSIpCn0KCiMgTWF0Y2ggaW5wdXQgd2l0aCBvbmUgb2YgdGhlIHBvbGljeSB2YXJpYWJsZXMsIGFmdGVyIHN1YnN0aXR1dGluZyAkKHNhbmRib3gtbmFtZXNwYWNlKS4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChzYW5kYm94LW5hbWVzcGFjZSkiCiAgICBzX25hbWVzcGFjZSA6PSBpbnB1dC5iYXNlLk9DSS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwX3ZhcjIgOj0gcmVwbGFjZShwX3ZhbCwgIiQoc2FuZGJveC1uYW1lc3BhY2UpIiwgc19uYW1lc3BhY2UpCiAgICBwX3ZhcjIgPT0gaV92YWwKICAgIHByaW50KCJhbGxvd19lbnZfbWFwX2VudHJ5IDk6IHRydWUiKQp9CgojIEFsbG93IGlucHV0IGVudiB2YXJpYWJsZXMgdGhhdCBtYXRjaCB3aXRoIGEgcmVxdWVzdF9kZWZhdWx0cyByZWdleC4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHNvbWUgcF9yZWdleDEgaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5DcmVhdGVDb250YWluZXJSZXF1ZXN0LmFsbG93X2Vudl9yZWdleAogICAgcF9yZWdleDIgOj0gcmVwbGFjZShwX3JlZ2V4MSwgIiQoaXB2NF9hKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcHY0X2EpCiAgICBwX3JlZ2V4MyA6PSByZXBsYWNlKHBfcmVnZXgyLCAiJChpcF9wKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcF9wKQogICAgcF9yZWdleDQgOj0gcmVwbGFjZShwX3JlZ2V4MywgIiQoc3ZjX25hbWUpIiwgcG9saWN5X2RhdGEuY29tbW9uLnN2Y19uYW1lKQogICAgcF9yZWdleDUgOj0gcmVwbGFjZShwX3JlZ2V4NCwgIiQoZG5zX2xhYmVsKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5kbnNfbGFiZWwpCgogICAgcmVzdWx0IDo9IGNvbmNhdCgiPSIsIFtrZXksIGlfdmFsXSkKICAgIHJlZ2V4Lm1hdGNoKHBfcmVnZXg1LCByZXN1bHQpCgogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgMTA6IHRydWUiKQp9CgpDcmVhdGVDb250YWluZXJSZXF1ZXN0Oj0gcmVzcCB7CiAgICBub3QgaW5wdXQuZW52X21hcAogICAgaV9wcm9jZXNzID0gaW5wdXQuT0NJLlByb2Nlc3MKICAgIHNfbmFtZSA9IGlucHV0Lk9DSS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBwX3Byb2Nlc3MgPSBwX2NvbnRhaW5lci5PQ0kuUHJvY2VzcwogICAgYWxsb3dfZGVwcmVjYXRlZF9hcmdzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUpCiAgICByZXNwID0gQ3JlYXRlQ29udGFpbmVyUmVxdWVzdENvbW1vbihpbnB1dCkKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0MjogdHJ1ZSIpCn0KCkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb24ocmVxKTo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgICMgQ2hlY2sgaWYgdGhlIGlucHV0IHJlcXVlc3Qgc2hvdWxkIGJlIHJlamVjdGVkIGV2ZW4gYmVmb3JlIGNoZWNraW5nIHRoZQogICAgIyBwb2xpY3lfZGF0YS5jb250YWluZXJzIGluZm9ybWF0aW9uLgogICAgYWxsb3dfY3JlYXRlX2NvbnRhaW5lcl9pbnB1dChyZXEpCgogICAgaV9vY2kgOj0gcmVxLk9DSQogICAgaV9zdG9yYWdlcyA6PSByZXEuc3RvcmFnZXMKICAgIGlfZGV2aWNlcyA6PSByZXEuZGV2aWNlcwoKICAgICMgYXJyYXkgb2YgcG9zc2libGUgc3RhdGUgb3BlcmF0aW9ucwogICAgb3BzX2J1aWxkZXIgOj0gW10KCiAgICAjIGNoZWNrIHNhbmRib3ggbmFtZQogICAgc2FuZGJveF9uYW1lID0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FX0tFWV0KICAgIGFkZF9zYW5kYm94X25hbWVfdG9fc3RhdGUgOj0gc3RhdGVfYWxsb3dzKCJzYW5kYm94X25hbWUiLCBzYW5kYm94X25hbWUpCiAgICBvcHNfYnVpbGRlcjEgOj0gY29uY2F0X29wX2lmX25vdF9udWxsKG9wc19idWlsZGVyLCBhZGRfc2FuZGJveF9uYW1lX3RvX3N0YXRlKQoKICAgICMgQ2hlY2sgaWYgYW55IGVsZW1lbnQgZnJvbSB0aGUgcG9saWN5X2RhdGEuY29udGFpbmVycyBhcnJheSBhbGxvd3MgdGhlIGlucHV0IHJlcXVlc3QuCiAgICBzb21lIHBfY29udGFpbmVyIGluIHBvbGljeV9kYXRhLmNvbnRhaW5lcnMKICAgIHByaW50KCI9PT09PT09PSBDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiB0cnlpbmcgbmV4dCBwb2xpY3kgY29udGFpbmVyIikKCiAgICBwX3BpZG5zIDo9IHBfY29udGFpbmVyLnNhbmRib3hfcGlkbnMKICAgIGlfcGlkbnMgOj0gcmVxLnNhbmRib3hfcGlkbnMKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiBwX3BpZG5zID0iLCBwX3BpZG5zLCAiaV9waWRucyA9IiwgaV9waWRucykKICAgIHBfcGlkbnMgPT0gaV9waWRucwoKICAgIHBfb2NpIDo9IHBfY29udGFpbmVyLk9DSQoKICAgICMgY2hlY2sgbmFtZXNwYWNlCiAgICBwX25hbWVzcGFjZSA6PSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBpX25hbWVzcGFjZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwcmludCAoIkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb246IHBfbmFtZXNwYWNlID0iLCBwX25hbWVzcGFjZSwgImlfbmFtZXNwYWNlID0iLCBpX25hbWVzcGFjZSkKICAgIGFkZF9uYW1lc3BhY2VfdG9fc3RhdGUgOj0gYWxsb3dfbmFtZXNwYWNlKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkKICAgIG9wc19idWlsZGVyMiA6PSBjb25jYXRfb3BfaWZfbm90X251bGwob3BzX2J1aWxkZXIxLCBhZGRfbmFtZXNwYWNlX3RvX3N0YXRlKQoKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiBwIFZlcnNpb24gPSIsIHBfb2NpLlZlcnNpb24sICJpIFZlcnNpb24gPSIsIGlfb2NpLlZlcnNpb24pCiAgICBwX29jaS5WZXJzaW9uID09IGlfb2NpLlZlcnNpb24KCiAgICBwcmludCgiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdENvbW1vbjogcCBSZWFkb25seSA9IiwgcF9vY2kuUm9vdC5SZWFkb25seSwgImkgUmVhZG9ubHkgPSIsIGlfb2NpLlJvb3QuUmVhZG9ubHkpCiAgICBwX29jaS5Sb290LlJlYWRvbmx5ID09IGlfb2NpLlJvb3QuUmVhZG9ubHkKCiAgICBhbGxvd19hbm5vKHBfb2NpLCBpX29jaSkKCiAgICBwX3N0b3JhZ2VzIDo9IHBfY29udGFpbmVyLnN0b3JhZ2VzCiAgICBhbGxvd19ieV9hbm5vKHBfb2NpLCBpX29jaSwgcF9zdG9yYWdlcywgaV9zdG9yYWdlcykKCiAgICBwX2RldmljZXMgOj0gcF9jb250YWluZXIuZGV2aWNlcwogICAgYWxsb3dfZGV2aWNlcyhwX2RldmljZXMsIGlfZGV2aWNlcykKCiAgICByZXQgOj0gYWxsb3dfbGludXgob3BzX2J1aWxkZXIyLCBwX29jaSwgaV9vY2kpCiAgICByZXQuYWxsb3dlZAoKICAgIG9wcyA6PSByZXQub3BzCgogICAgcHJpbnQoIkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb246IHRydWUiKQp9CgphbGxvd19jcmVhdGVfY29udGFpbmVyX2lucHV0KHJlcSkgewogICAgcHJpbnQoImFsbG93X2NyZWF0ZV9jb250YWluZXJfaW5wdXQ6IGlucHV0ID0iLCByZXEpCgogICAgY291bnQocmVxLnNoYXJlZF9tb3VudHMpID09IDAKICAgIGlzX251bGwocmVxLnN0cmluZ191c2VyKQoKICAgIGlfb2NpIDo9IHJlcS5PQ0kKICAgIGlzX251bGwoaV9vY2kuSG9va3MpCiAgICBpc19udWxsKGlfb2NpLlNvbGFyaXMpCiAgICBpc19udWxsKGlfb2NpLldpbmRvd3MpCgogICAgaV9saW51eCA6PSBpX29jaS5MaW51eAogICAgY291bnQoaV9saW51eC5HSURNYXBwaW5ncykgPT0gMAogICAgY291bnQoaV9saW51eC5Nb3VudExhYmVsKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlJlc291cmNlcy5EZXZpY2VzKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlJvb3Rmc1Byb3BhZ2F0aW9uKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlVJRE1hcHBpbmdzKSA9PSAwCiAgICBpc19udWxsKGlfbGludXguSW50ZWxSZHQpCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLkJsb2NrSU8pCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLk5ldHdvcmspCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLlBpZHMpCiAgICBpc19udWxsKGlfbGludXguU2VjY29tcCkKCiAgICBpX3Byb2Nlc3MgOj0gaV9vY2kuUHJvY2VzcwogICAgY291bnQoaV9wcm9jZXNzLlNlbGludXhMYWJlbCkgPT0gMAogICAgY291bnQoaV9wcm9jZXNzLlVzZXIuVXNlcm5hbWUpID09IDAKCiAgICBwcmludCgiYWxsb3dfY3JlYXRlX2NvbnRhaW5lcl9pbnB1dDogdHJ1ZSIpCn0KCmFsbG93X25hbWVzcGFjZShwX25hbWVzcGFjZSwgaV9uYW1lc3BhY2UpID0gYWRkX25hbWVzcGFjZSB7CiAgICBwX25hbWVzcGFjZSA9PSBpX25hbWVzcGFjZQogICAgYWRkX25hbWVzcGFjZSA6PSBudWxsCiAgICBwcmludCgiYWxsb3dfbmFtZXNwYWNlIDE6IGlucHV0IG5hbWVzcGFjZSBtYXRjaGVzIHBvbGljeSBkYXRhIikKfQoKYWxsb3dfbmFtZXNwYWNlKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkgPSBhZGRfbmFtZXNwYWNlIHsKICAgIHBfbmFtZXNwYWNlID09ICIiCiAgICBwcmludCgiYWxsb3dfbmFtZXNwYWNlIDI6IG5vIG5hbWVzcGFjZSBmb3VuZCBvbiBwb2xpY3kgZGF0YSIpCiAgICBhZGRfbmFtZXNwYWNlIDo9IHN0YXRlX2FsbG93cygibmFtZXNwYWNlIiwgaV9uYW1lc3BhY2UpCn0KCiMgdmFsdWUgaGFzbid0IGJlZW4gc2VlbiBiZWZvcmUsIHNhdmUgaXQgdG8gc3RhdGUKc3RhdGVfYWxsb3dzKGtleSwgdmFsdWUpID0gYWN0aW9uIHsKICBzdGF0ZSA6PSBnZXRfc3RhdGUoKQogIHByaW50KCJzdGF0ZV9hbGxvd3MgMTogc3RhdGVba2V5XSA9Iiwgc3RhdGVba2V5XSwgInZhbHVlID0iLCB2YWx1ZSkKICBub3Qgc3RhdGVba2V5XQogIHByaW50KCJzdGF0ZV9hbGxvd3MgMTogc2F2aW5nIHRvIHN0YXRlIGtleSA9Iiwga2V5LCAidmFsdWUgPSIsIHZhbHVlKQogIHBhdGggOj0gZ2V0X3N0YXRlX3BhdGgoa2V5KSAKICBhY3Rpb24gOj0gewogICAgIm9wIjogImFkZCIsCiAgICAicGF0aCI6IHBhdGgsIAogICAgInZhbHVlIjogdmFsdWUsCiAgfQp9CgojIHZhbHVlIG1hdGNoZXMgd2hhdCdzIGluIHN0YXRlLCBhbGxvdyBpdApzdGF0ZV9hbGxvd3Moa2V5LCB2YWx1ZSkgPSBhY3Rpb24gewogIHByaW50KCJzdGF0ZV9hbGxvd3MgMjogc3RhcnQiKQogIHN0YXRlIDo9IGdldF9zdGF0ZSgpCiAgcHJpbnQoInN0YXRlX2FsbG93cyAyOiBzdGF0ZVtrZXldID0iLCBzdGF0ZVtrZXldLCAidmFsdWUgPSIsIHZhbHVlKQogIHZhbHVlID09IHN0YXRlW2tleV0KICBwcmludCgic3RhdGVfYWxsb3dzIDI6IGZvdW5kIGtleSA9Iiwga2V5LCAidmFsdWUgPSIsIHZhbHVlLCAiIGluIHN0YXRlIikKICBhY3Rpb24gOj0gbnVsbAp9CgojIGhlbHBlciBmdW5jdGlvbnMgdG8gaW50ZXJhY3Qgd2l0aCB0aGUgc3RhdGUKZ2V0X3N0YXRlKCkgPSBzdGF0ZSB7CiAgc3RhdGUgOj0gZGF0YVsicHN0YXRlIl0KfQoKZ2V0X3N0YXRlX3ZhbChrZXkpID0gdmFsdWUgewogICAgc3RhdGUgOj0gZ2V0X3N0YXRlKCkKICAgIHZhbHVlIDo9IHN0YXRlW2tleV0KfQoKZ2V0X3N0YXRlX3BhdGgoa2V5KSA9IHBhdGggewogICAgIyBwcmVwZW5kICIvcHN0YXRlLyIgdG8ga2V5CiAgICBwYXRoIDo9IGNvbmNhdCgiLyIsIFsiL3BzdGF0ZSIsIGtleV0pCn0KCiMgSGVscGVyIGZ1bmN0aW9ucyB0byBjb25kaXRpb25hbGx5IGNvbmNhdGVuYXRlIG9wIGlzIG5vdCBudWxsCmNvbmNhdF9vcF9pZl9ub3RfbnVsbChvcHMsIG9wKSA9IHJlc3VsdCB7CiAgICBvcCA9PSBudWxsCiAgICByZXN1bHQgOj0gb3BzCn0KCmNvbmNhdF9vcF9pZl9ub3RfbnVsbChvcHMsIG9wKSA9IHJlc3VsdCB7CiAgICBvcCAhPSBudWxsCiAgICByZXN1bHQgOj0gYXJyYXkuY29uY2F0KG9wcywgW29wXSkKfQoKIyBSZWplY3QgdW5leHBlY3RlZCBhbm5vdGF0aW9ucy4KYWxsb3dfYW5ubyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19hbm5vIDE6IHN0YXJ0IikKCiAgICBub3QgaV9vY2kuQW5ub3RhdGlvbnMKCiAgICBwcmludCgiYWxsb3dfYW5ubyAxOiB0cnVlIikKfQphbGxvd19hbm5vKHBfb2NpLCBpX29jaSkgewogICAgcHJpbnQoImFsbG93X2Fubm8gMjogcCBBbm5vdGF0aW9ucyA9IiwgcF9vY2kuQW5ub3RhdGlvbnMpCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiBpIEFubm90YXRpb25zID0iLCBpX29jaS5Bbm5vdGF0aW9ucykKCiAgICBpX2tleXMgOj0gb2JqZWN0LmtleXMoaV9vY2kuQW5ub3RhdGlvbnMpCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiBpIGtleXMgPSIsIGlfa2V5cykKCiAgICBldmVyeSBpX2tleSBpbiBpX2tleXMgewogICAgICAgIGFsbG93X2Fubm9fa2V5KGlfa2V5LCBwX29jaSkKICAgIH0KCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiB0cnVlIikKfQoKYWxsb3dfYW5ub19rZXkoaV9rZXksIHBfb2NpKSB7CiAgICBwcmludCgiYWxsb3dfYW5ub19rZXkgMTogaSBrZXkgPSIsIGlfa2V5KQoKICAgIHN0YXJ0c3dpdGgoaV9rZXksICJpby5rdWJlcm5ldGVzLmNyaS4iKQoKICAgIHByaW50KCJhbGxvd19hbm5vX2tleSAxOiB0cnVlIikKfQphbGxvd19hbm5vX2tleShpX2tleSwgcF9vY2kpIHsKICAgIHByaW50KCJhbGxvd19hbm5vX2tleSAyOiBpIGtleSA9IiwgaV9rZXkpCgogICAgc29tZSBwX2tleSwgXyBpbiBwX29jaS5Bbm5vdGF0aW9ucwogICAgcF9rZXkgPT0gaV9rZXkKCiAgICBwcmludCgiYWxsb3dfYW5ub19rZXkgMjogdHJ1ZSIpCn0KCiMgR2V0IHRoZSB2YWx1ZSBvZiB0aGUgU19OQU1FX0tFWSBhbm5vdGF0aW9uIGFuZAojIGNvcnJlbGF0ZSBpdCB3aXRoIG90aGVyIGFubm90YXRpb25zIGFuZCBwcm9jZXNzIGZpZWxkcy4KYWxsb3dfYnlfYW5ubyhwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpIHsKICAgIHByaW50KCJhbGxvd19ieV9hbm5vIDE6IHN0YXJ0IikKCiAgICBub3QgcF9vY2kuQW5ub3RhdGlvbnNbU19OQU1FX0tFWV0KCiAgICBpX3NfbmFtZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMTogaV9zX25hbWUgPSIsIGlfc19uYW1lKQoKICAgIGlfc19uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FU1BBQ0VfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMTogaV9zX25hbWVzcGFjZSA9IiwgaV9zX25hbWVzcGFjZSkKCiAgICBhbGxvd19ieV9zYW5kYm94X25hbWUocF9vY2ksIGlfb2NpLCBwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBpX3NfbmFtZSwgaV9zX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfYnlfYW5ubyAxOiB0cnVlIikKfQphbGxvd19ieV9hbm5vKHBfb2NpLCBpX29jaSwgcF9zdG9yYWdlcywgaV9zdG9yYWdlcykgewogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMjogc3RhcnQiKQoKICAgIHBfc19uYW1lIDo9IHBfb2NpLkFubm90YXRpb25zW1NfTkFNRV9LRVldCiAgICBpX3NfbmFtZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMjogaV9zX25hbWUgPSIsIGlfc19uYW1lLCAicF9zX25hbWUgPSIsIHBfc19uYW1lKQoKICAgIGFsbG93X3NhbmRib3hfbmFtZShwX3NfbmFtZSwgaV9zX25hbWUpCgogICAgaV9zX25hbWVzcGFjZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwcmludCgiYWxsb3dfYnlfYW5ubyAyOiBpX3NfbmFtZXNwYWNlID0iLCBpX3NfbmFtZXNwYWNlKQoKICAgIGFsbG93X2J5X3NhbmRib3hfbmFtZShwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMsIGlfc19uYW1lLCBpX3NfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd19ieV9hbm5vIDI6IHRydWUiKQp9CgphbGxvd19ieV9zYW5kYm94X25hbWUocF9vY2ksIGlfb2NpLCBwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfYnlfc2FuZGJveF9uYW1lOiBzdGFydCIpCgogICAgaV9uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FU1BBQ0VfS0VZXQoKICAgIGFsbG93X2J5X2NvbnRhaW5lcl90eXBlcyhwX29jaSwgaV9vY2ksIHNfbmFtZSwgaV9uYW1lc3BhY2UpCiAgICBhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZChwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpCiAgICBhbGxvd19wcm9jZXNzKHBfb2NpLlByb2Nlc3MsIGlfb2NpLlByb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpCgogICAgcHJpbnQoImFsbG93X2J5X3NhbmRib3hfbmFtZTogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfbmFtZShwX3NfbmFtZSwgaV9zX25hbWUpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X25hbWU6IHN0YXJ0IikKICAgIHJlZ2V4Lm1hdGNoKHBfc19uYW1lLCBpX3NfbmFtZSkKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9uYW1lOiB0cnVlIikKfQoKIyBDaGVjayB0aGF0IHRoZSAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLXR5cGUiIGFuZAojICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIiBhbm5vdGF0aW9ucyBkZXNpZ25hdGUgdGhlCiMgZXhwZWN0ZWQgdHlwZSAtIGVpdGhlciBhICJzYW5kYm94IiBvciBhICJjb250YWluZXIiLiBUaGVuLCB2YWxpZGF0ZQojIG90aGVyIGFubm90YXRpb25zIGJhc2VkIG9uIHRoZSBhY3R1YWwgInNhbmRib3giIG9yICJjb250YWluZXIiIHZhbHVlCiMgZnJvbSB0aGUgaW5wdXQgY29udGFpbmVyLgphbGxvd19ieV9jb250YWluZXJfdHlwZXMocF9vY2ksIGlfb2NpLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfYnlfY29udGFpbmVyX3R5cGVzOiBjaGVja2luZyBpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSIpCgogICAgY190eXBlIDo9ICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSIKICAgIAogICAgcF9jcmlfdHlwZSA6PSBwX29jaS5Bbm5vdGF0aW9uc1tjX3R5cGVdCiAgICBpX2NyaV90eXBlIDo9IGlfb2NpLkFubm90YXRpb25zW2NfdHlwZV0KICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZXM6IHBfY3JpX3R5cGUgPSIsIHBfY3JpX3R5cGUsICJpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgcF9jcmlfdHlwZSA9PSBpX2NyaV90eXBlCgogICAgYWxsb3dfYnlfY29udGFpbmVyX3R5cGUoaV9jcmlfdHlwZSwgcF9vY2ksIGlfb2NpLCBzX25hbWUsIHNfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZXM6IHRydWUiKQp9CgphbGxvd19ieV9jb250YWluZXJfdHlwZShpX2NyaV90eXBlLCBwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAxOiBpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgaV9jcmlfdHlwZSA9PSAic2FuZGJveCIKCiAgICBpX2thdGFfdHlwZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1siaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5jb250YWluZXJfdHlwZSJdCiAgICBwcmludCgiYWxsb3dfYnlfY29udGFpbmVyX3R5cGUgMTogaV9rYXRhX3R5cGUgPSIsIGlfa2F0YV90eXBlKQogICAgaV9rYXRhX3R5cGUgPT0gInBvZF9zYW5kYm94IgoKICAgIGFsbG93X3NhbmRib3hfY29udGFpbmVyX25hbWUocF9vY2ksIGlfb2NpKQogICAgYWxsb3dfc2FuZGJveF9uZXRfbmFtZXNwYWNlKHBfb2NpLCBpX29jaSkKICAgIGFsbG93X3NhbmRib3hfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpCgogICAgcHJpbnQoImFsbG93X2J5X2NvbnRhaW5lcl90eXBlIDE6IHRydWUiKQp9CgphbGxvd19ieV9jb250YWluZXJfdHlwZShpX2NyaV90eXBlLCBwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiBpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgaV9jcmlfdHlwZSA9PSAiY29udGFpbmVyIgoKICAgIGlfa2F0YV90eXBlIDo9IGlfb2NpLkFubm90YXRpb25zWyJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIl0KICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiBpX2thdGFfdHlwZSA9IiwgaV9rYXRhX3R5cGUpCiAgICBpX2thdGFfdHlwZSA9PSAicG9kX2NvbnRhaW5lciIKCiAgICBhbGxvd19jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpCiAgICBhbGxvd19uZXRfbmFtZXNwYWNlKHBfb2NpLCBpX29jaSkKICAgIGFsbG93X2xvZ19kaXJlY3RvcnkocF9vY2ksIGlfb2NpKQoKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiB0cnVlIikKfQoKIyAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLW5hbWUiIGFubm90YXRpb24KYWxsb3dfc2FuZGJveF9jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X2NvbnRhaW5lcl9uYW1lOiBzdGFydCIpCgogICAgY29udGFpbmVyX2Fubm90YXRpb25fbWlzc2luZyhwX29jaSwgaV9vY2ksICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItbmFtZSIpCgogICAgcHJpbnQoImFsbG93X3NhbmRib3hfY29udGFpbmVyX25hbWU6IHRydWUiKQp9CgphbGxvd19jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19jb250YWluZXJfbmFtZTogc3RhcnQiKQoKICAgIGFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uKHBfb2NpLCBpX29jaSwgImlvLmt1YmVybmV0ZXMuY3JpLmNvbnRhaW5lci1uYW1lIikKCiAgICBwcmludCgiYWxsb3dfY29udGFpbmVyX25hbWU6IHRydWUiKQp9Cgpjb250YWluZXJfYW5ub3RhdGlvbl9taXNzaW5nKHBfb2NpLCBpX29jaSwga2V5KSB7CiAgICBwcmludCgiY29udGFpbmVyX2Fubm90YXRpb25fbWlzc2luZzoiLCBrZXkpCgogICAgbm90IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIG5vdCBpX29jaS5Bbm5vdGF0aW9uc1trZXldCgogICAgcHJpbnQoImNvbnRhaW5lcl9hbm5vdGF0aW9uX21pc3Npbmc6IHRydWUiKQp9CgphbGxvd19jb250YWluZXJfYW5ub3RhdGlvbihwX29jaSwgaV9vY2ksIGtleSkgewogICAgcHJpbnQoImFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uOiBrZXkgPSIsIGtleSkKCiAgICBwX3ZhbHVlIDo9IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIGlfdmFsdWUgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgcHJpbnQoImFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uOiBwX3ZhbHVlID0iLCBwX3ZhbHVlLCAiaV92YWx1ZSA9IiwgaV92YWx1ZSkKCiAgICBwX3ZhbHVlID09IGlfdmFsdWUKCiAgICBwcmludCgiYWxsb3dfY29udGFpbmVyX2Fubm90YXRpb246IHRydWUiKQp9CgojICJuZXJkY3RsL25ldHdvcmstbmFtZXNwYWNlIiBhbm5vdGF0aW9uCmFsbG93X3NhbmRib3hfbmV0X25hbWVzcGFjZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X25ldF9uYW1lc3BhY2U6IHN0YXJ0IikKCiAgICBrZXkgOj0gIm5lcmRjdGwvbmV0d29yay1uYW1lc3BhY2UiCgogICAgcF9uYW1lc3BhY2UgOj0gcF9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgaV9uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgcHJpbnQoImFsbG93X3NhbmRib3hfbmV0X25hbWVzcGFjZTogcF9uYW1lc3BhY2UgPSIsIHBfbmFtZXNwYWNlLCAiaV9uYW1lc3BhY2UgPSIsIGlfbmFtZXNwYWNlKQoKICAgIHJlZ2V4Lm1hdGNoKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9uZXRfbmFtZXNwYWNlOiB0cnVlIikKfQoKYWxsb3dfbmV0X25hbWVzcGFjZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19uZXRfbmFtZXNwYWNlOiBzdGFydCIpCgogICAga2V5IDo9ICJuZXJkY3RsL25ldHdvcmstbmFtZXNwYWNlIgoKICAgIG5vdCBwX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICBub3QgaV9vY2kuQW5ub3RhdGlvbnNba2V5XQoKICAgIHByaW50KCJhbGxvd19uZXRfbmFtZXNwYWNlOiB0cnVlIikKfQoKIyAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1sb2ctZGlyZWN0b3J5IiBhbm5vdGF0aW9uCmFsbG93X3NhbmRib3hfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X2xvZ19kaXJlY3Rvcnk6IHN0YXJ0IikKCiAgICBrZXkgOj0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbG9nLWRpcmVjdG9yeSIKCiAgICBwX2RpciA6PSBwX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICByZWdleDEgOj0gcmVwbGFjZShwX2RpciwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHJlZ2V4MiA6PSByZXBsYWNlKHJlZ2V4MSwgIiQoc2FuZGJveC1uYW1lc3BhY2UpIiwgc19uYW1lc3BhY2UpCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiByZWdleDIgPSIsIHJlZ2V4MikKCiAgICBpX2RpciA6PSBpX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiBpX2RpciA9IiwgaV9kaXIpCgogICAgcmVnZXgubWF0Y2gocmVnZXgyLCBpX2RpcikKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiB0cnVlIikKfQoKYWxsb3dfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19sb2dfZGlyZWN0b3J5OiBzdGFydCIpCgogICAga2V5IDo9ICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWxvZy1kaXJlY3RvcnkiCgogICAgbm90IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIG5vdCBpX29jaS5Bbm5vdGF0aW9uc1trZXldCgogICAgcHJpbnQoImFsbG93X2xvZ19kaXJlY3Rvcnk6IHRydWUiKQp9CgphbGxvd19kZXZpY2VzKHBfZGV2aWNlcywgaV9kZXZpY2VzKSB7CiAgICBwcmludCgiYWxsb3dfZGV2aWNlczogc3RhcnQiKQogICAgZXZlcnkgaV9kZXZpY2UgaW4gaV9kZXZpY2VzIHsKICAgICAgICBwcmludCgiYWxsb3dfZGV2aWNlczogaV9kZXZpY2UgPSIsIGlfZGV2aWNlKQogICAgICAgIHNvbWUgcF9kZXZpY2UgaW4gcF9kZXZpY2VzCiAgICAgICAgcF9kZXZpY2UuY29udGFpbmVyX3BhdGggPT0gaV9kZXZpY2UuY29udGFpbmVyX3BhdGgKICAgIH0KICAgIHByaW50KCJhbGxvd19kZXZpY2VzOiB0cnVlIikKfQoKYWxsb3dfbGludXgoc3RhdGVfb3BzLCBwX29jaSwgaV9vY2kpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIHBfbmFtZXNwYWNlcyA6PSBwX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbGludXg6IHAgbmFtZXNwYWNlcyA9IiwgcF9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlcyA6PSBpX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbGludXg6IGkgbmFtZXNwYWNlcyA9IiwgaV9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlX3dpdGhvdXRfbmV0d29yayA6PSBbb2JqIHwgb2JqIDo9IGlfbmFtZXNwYWNlc1tfXTsgb2JqLlR5cGUgIT0gIm5ldHdvcmsiXQoKICAgIHByaW50KCJhbGxvd19saW51eDogaV9uYW1lc3BhY2Vfd2l0aG91dF9uZXR3b3JrID0iLCBpX25hbWVzcGFjZV93aXRob3V0X25ldHdvcmspCgogICAgcF9uYW1lc3BhY2VzID09IGlfbmFtZXNwYWNlX3dpdGhvdXRfbmV0d29yawoKICAgIGFsbG93X21hc2tlZF9wYXRocyhwX29jaSwgaV9vY2kpCiAgICBhbGxvd19yZWFkb25seV9wYXRocyhwX29jaSwgaV9vY2kpCiAgICBhbGxvd19saW51eF9kZXZpY2VzKHBfb2NpLkxpbnV4LkRldmljZXMsIGlfb2NpLkxpbnV4LkRldmljZXMpCiAgICBhbGxvd19saW51eF9zeXNjdGwocF9vY2kuTGludXgsIGlfb2NpLkxpbnV4KQogICAgcmV0IDo9IGFsbG93X25ldHdvcmtfbmFtZXNwYWNlX3N0YXJ0KHN0YXRlX29wcywgcF9vY2ksIGlfb2NpKQogICAgcmV0LmFsbG93ZWQKCiAgICBvcHMgOj0gcmV0Lm9wcwoKICAgIHByaW50KCJhbGxvd19saW51eDogdHJ1ZSIpCn0KCiMgUmV0cmlldmUgdGhlICJuZXR3b3JrIiBuYW1lc3BhY2UgZnJvbSB0aGUgaW5wdXQgZGF0YSBhbmQgcGFzcyBpdCBvbiBmb3IgdGhlCiMgbmV0d29yayBuYW1lc3BhY2UgcG9saWN5IGNoZWNrcy4KYWxsb3dfbmV0d29ya19uYW1lc3BhY2Vfc3RhcnQoc3RhdGVfb3BzLCBwX29jaSwgaV9vY2kpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIHByaW50KCJhbGxvd19uZXR3b3JrX25hbWVzcGFjZSBzdGFydDogc3RhcnQiKQoKICAgIHBfbmFtZXNwYWNlcyA6PSBwX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IHAgbmFtZXNwYWNlcyA9IiwgcF9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlcyA6PSBpX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IGkgbmFtZXNwYWNlcyA9IiwgaV9uYW1lc3BhY2VzKQoKICAgICMgUmV0dXJuIHBhdGggb2YgdGhlICJuZXR3b3JrIiBuYW1lc3BhY2UKICAgIG5ldHdvcmtfbnMgOj0gW29iaiB8IG9iaiA6PSBpX25hbWVzcGFjZXNbX107IG9iai5UeXBlID09ICJuZXR3b3JrIl0KCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IG5ldHdvcmtfbnMgPSIsIG5ldHdvcmtfbnMpCgogICAgcmV0IDo9IGFsbG93X25ldHdvcmtfbmFtZXNwYWNlKHN0YXRlX29wcywgbmV0d29ya19ucykKICAgIHJldC5hbGxvd2VkCgogICAgb3BzIDo9IHJldC5vcHMKfQoKIyBUaGlzIHJ1bGUgaXMgd2hlbiB0aGVyZSdzIG5vIG5ldHdvcmsgbmFtZXNwYWNlIGluIHRoZSBpbnB1dCBkYXRhLgphbGxvd19uZXR3b3JrX25hbWVzcGFjZShzdGF0ZV9vcHMsIG5ldHdvcmtfbnMpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIGNvdW50KG5ldHdvcmtfbnMpID09IDAKCiAgICBuZXR3b3JrX25zX3BhdGggPSAiIgoKICAgIGFkZF9uZXR3b3JrX25hbWVzcGFjZV90b19zdGF0ZSA6PSBzdGF0ZV9hbGxvd3MoIm5ldHdvcmtfbmFtZXNwYWNlIiwgbmV0d29ya19uc19wYXRoKQogICAgb3BzIDo9IGNvbmNhdF9vcF9pZl9ub3RfbnVsbChzdGF0ZV9vcHMsIGFkZF9uZXR3b3JrX25hbWVzcGFjZV90b19zdGF0ZSkKCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2UgMTogdHJ1ZSIpCn0KCiMgVGhpcyBydWxlIGlzIHdoZW4gdGhlcmUncyBleGFjdGx5IG9uZSBuZXR3b3JrIG5hbWVzcGFjZSBpbiB0aGUgaW5wdXQgZGF0YS4KYWxsb3dfbmV0d29ya19uYW1lc3BhY2Uoc3RhdGVfb3BzLCBuZXR3b3JrX25zKSA6PSB7Im9wcyI6IG9wcywgImFsbG93ZWQiOiB0cnVlfSB7CiAgICBjb3VudChuZXR3b3JrX25zKSA9PSAxCgogICAgYWRkX25ldHdvcmtfbmFtZXNwYWNlX3RvX3N0YXRlIDo9IHN0YXRlX2FsbG93cygibmV0d29ya19uYW1lc3BhY2UiLCBuZXR3b3JrX25zWzBdLlBhdGgpCiAgICBvcHMgOj0gY29uY2F0X29wX2lmX25vdF9udWxsKHN0YXRlX29wcywgYWRkX25ldHdvcmtfbmFtZXNwYWNlX3RvX3N0YXRlKQoKICAgIHByaW50KCJhbGxvd19uZXR3b3JrX25hbWVzcGFjZSAyOiB0cnVlIikKfQoKYWxsb3dfbWFza2VkX3BhdGhzKHBfb2NpLCBpX29jaSkgewogICAgcF9wYXRocyA6PSBwX29jaS5MaW51eC5NYXNrZWRQYXRocwogICAgcHJpbnQoImFsbG93X21hc2tlZF9wYXRocyAxOiBwX3BhdGhzID0iLCBwX3BhdGhzKQoKICAgIGlfcGF0aHMgOj0gaV9vY2kuTGludXguTWFza2VkUGF0aHMKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aHMgMTogaV9wYXRocyA9IiwgaV9wYXRocykKCiAgICBhbGxvd19tYXNrZWRfcGF0aHNfYXJyYXkocF9wYXRocywgaV9wYXRocykKCiAgICBwcmludCgiYWxsb3dfbWFza2VkX3BhdGhzIDE6IHRydWUiKQp9CmFsbG93X21hc2tlZF9wYXRocyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aHMgMjogc3RhcnQiKQoKICAgIG5vdCBwX29jaS5MaW51eC5NYXNrZWRQYXRocwogICAgbm90IGlfb2NpLkxpbnV4Lk1hc2tlZFBhdGhzCgogICAgcHJpbnQoImFsbG93X21hc2tlZF9wYXRocyAyOiB0cnVlIikKfQoKIyBBbGwgdGhlIHBvbGljeSBtYXNrZWQgcGF0aHMgbXVzdCBiZSBtYXNrZWQgaW4gdGhlIGlucHV0IGRhdGEgdG9vLgojIElucHV0IGlzIGFsbG93ZWQgdG8gaGF2ZSBtb3JlIG1hc2tlZCBwYXRocyB0aGFuIHRoZSBwb2xpY3kuCmFsbG93X21hc2tlZF9wYXRoc19hcnJheShwX2FycmF5LCBpX2FycmF5KSB7CiAgICBldmVyeSBwX2VsZW0gaW4gcF9hcnJheSB7CiAgICAgICAgYWxsb3dfbWFza2VkX3BhdGgocF9lbGVtLCBpX2FycmF5KQogICAgfQp9CgphbGxvd19tYXNrZWRfcGF0aChwX2VsZW0sIGlfYXJyYXkpIHsKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aDogcF9lbGVtID0iLCBwX2VsZW0pCgogICAgc29tZSBpX2VsZW0gaW4gaV9hcnJheQogICAgcF9lbGVtID09IGlfZWxlbQoKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aDogdHJ1ZSIpCn0KCmFsbG93X3JlYWRvbmx5X3BhdGhzKHBfb2NpLCBpX29jaSkgewogICAgcF9wYXRocyA6PSBwX29jaS5MaW51eC5SZWFkb25seVBhdGhzCiAgICBwcmludCgiYWxsb3dfcmVhZG9ubHlfcGF0aHMgMTogcF9wYXRocyA9IiwgcF9wYXRocykKCiAgICBpX3BhdGhzIDo9IGlfb2NpLkxpbnV4LlJlYWRvbmx5UGF0aHMKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAxOiBpX3BhdGhzID0iLCBpX3BhdGhzKQoKICAgIGFsbG93X3JlYWRvbmx5X3BhdGhzX2FycmF5KHBfcGF0aHMsIGlfcGF0aHMsIGlfb2NpLkxpbnV4Lk1hc2tlZFBhdGhzKQoKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAxOiB0cnVlIikKfQphbGxvd19yZWFkb25seV9wYXRocyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAyOiBzdGFydCIpCgogICAgbm90IHBfb2NpLkxpbnV4LlJlYWRvbmx5UGF0aHMKICAgIG5vdCBpX29jaS5MaW51eC5SZWFkb25seVBhdGhzCgogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGhzIDI6IHRydWUiKQp9CgojIEFsbCB0aGUgcG9saWN5IHJlYWRvbmx5IHBhdGhzIG11c3QgYmUgZWl0aGVyOgojIC0gUHJlc2VudCBpbiB0aGUgaW5wdXQgcmVhZG9ubHkgcGF0aHMsIG9yCiMgLSBQcmVzZW50IGluIHRoZSBpbnB1dCBtYXNrZWQgcGF0aHMuCiMgSW5wdXQgaXMgYWxsb3dlZCB0byBoYXZlIG1vcmUgcmVhZG9ubHkgcGF0aHMgdGhhbiB0aGUgcG9saWN5LgphbGxvd19yZWFkb25seV9wYXRoc19hcnJheShwX2FycmF5LCBpX2FycmF5LCBtYXNrZWRfcGF0aHMpIHsKICAgIGV2ZXJ5IHBfZWxlbSBpbiBwX2FycmF5IHsKICAgICAgICBhbGxvd19yZWFkb25seV9wYXRoKHBfZWxlbSwgaV9hcnJheSwgbWFza2VkX3BhdGhzKQogICAgfQp9CgphbGxvd19yZWFkb25seV9wYXRoKHBfZWxlbSwgaV9hcnJheSwgbWFza2VkX3BhdGhzKSB7CiAgICBwcmludCgiYWxsb3dfcmVhZG9ubHlfcGF0aCAxOiBwX2VsZW0gPSIsIHBfZWxlbSkKCiAgICBzb21lIGlfZWxlbSBpbiBpX2FycmF5CiAgICBwX2VsZW0gPT0gaV9lbGVtCgogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGggMTogdHJ1ZSIpCn0KYWxsb3dfcmVhZG9ubHlfcGF0aChwX2VsZW0sIGlfYXJyYXksIG1hc2tlZF9wYXRocykgewogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGggMjogcF9lbGVtID0iLCBwX2VsZW0pCgogICAgc29tZSBpX21hc2tlZCBpbiBtYXNrZWRfcGF0aHMKICAgIHBfZWxlbSA9PSBpX21hc2tlZAoKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRoIDI6IHRydWUiKQp9CgphbGxvd19saW51eF9kZXZpY2VzKHBfZGV2aWNlcywgaV9kZXZpY2VzKSB7CiAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogc3RhcnQiKQogICAgZXZlcnkgaV9kZXZpY2UgaW4gaV9kZXZpY2VzIHsKICAgICAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogaV9kZXZpY2UgPSIsIGlfZGV2aWNlKQogICAgICAgIHNvbWUgcF9kZXZpY2UgaW4gcF9kZXZpY2VzCiAgICAgICAgaV9kZXZpY2UuUGF0aCA9PSBwX2RldmljZS5QYXRoCiAgICB9CiAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogdHJ1ZSIpCn0KCmFsbG93X2xpbnV4X3N5c2N0bChwX2xpbnV4LCBpX2xpbnV4KSB7CiAgICBwcmludCgiYWxsb3dfbGludXhfc3lzY3RsIDE6IHN0YXJ0IikKICAgIG5vdCBpX2xpbnV4LlN5c2N0bAogICAgcHJpbnQoImFsbG93X2xpbnV4X3N5c2N0bCAxOiB0cnVlIikKfQoKYWxsb3dfbGludXhfc3lzY3RsKHBfbGludXgsIGlfbGludXgpIHsKICAgIHByaW50KCJhbGxvd19saW51eF9zeXNjdGwgMjogc3RhcnQiKQogICAgcF9zeXNjdGwgOj0gcF9saW51eC5TeXNjdGwKICAgIGlfc3lzY3RsIDo9IGlfbGludXguU3lzY3RsCiAgICBldmVyeSBpX25hbWUsIGlfdmFsIGluIGlfc3lzY3RsIHsKICAgICAgICBwcmludCgiYWxsb3dfbGludXhfc3lzY3RsIDI6IGlfbmFtZSA9IiwgaV9uYW1lLCAiaV92YWwgPSIsIGlfdmFsKQogICAgICAgIHBfc3lzY3RsW2lfbmFtZV0gPT0gaV92YWwKICAgIH0KICAgIHByaW50KCJhbGxvd19saW51eF9zeXNjdGwgMjogdHJ1ZSIpCn0KCiMgQ2hlY2sgdGhlIGNvbnNpc3RlbmN5IG9mIHRoZSBpbnB1dCAiaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5idW5kbGVfcGF0aCIKIyBhbmQgaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCIgdmFsdWVzIHdpdGggb3RoZXIgZmllbGRzLgphbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZChwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpIHsKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogc3RhcnQiKQoKICAgIGJ1bmRsZV9wYXRoIDo9IGlfb2NpLkFubm90YXRpb25zWyJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmJ1bmRsZV9wYXRoIl0KICAgIGJ1bmRsZV9pZCA6PSByZXBsYWNlKGJ1bmRsZV9wYXRoLCAiL3J1bi9jb250YWluZXJkL2lvLmNvbnRhaW5lcmQucnVudGltZS52Mi50YXNrL2s4cy5pby8iLCAiIikKCiAgICBidW5kbGVfaWRfZm9ybWF0IDo9IGNvbmNhdCgiIiwgWyJeIiwgQlVORExFX0lELCAiJCJdKQogICAgcmVnZXgubWF0Y2goYnVuZGxlX2lkX2Zvcm1hdCwgYnVuZGxlX2lkKQoKICAgIGtleSA6PSAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCIKCiAgICBwX3JlZ2V4IDo9IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIHNhbmRib3hfaWQgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQoKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogc2FuZGJveF9pZCA9Iiwgc2FuZGJveF9pZCwgInJlZ2V4ID0iLCBwX3JlZ2V4KQogICAgcmVnZXgubWF0Y2gocF9yZWdleCwgc2FuZGJveF9pZCkKCiAgICBhbGxvd19yb290X3BhdGgocF9vY2ksIGlfb2NpLCBidW5kbGVfaWQpCgogICAgZXZlcnkgaV9tb3VudCBpbiBpX29jaS5Nb3VudHMgewogICAgICAgIGFsbG93X21vdW50KHBfb2NpLCBpX21vdW50LCBpX3N0b3JhZ2VzLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpCiAgICB9CgogICAgYWxsb3dfc3RvcmFnZXMocF9zdG9yYWdlcywgaV9zdG9yYWdlcywgYnVuZGxlX2lkLCBzYW5kYm94X2lkKQoKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogdHJ1ZSIpCn0KCmFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHBfcHJvY2VzcyA9IiwgcF9wcm9jZXNzKQogICAgcHJpbnQoImFsbG93X3Byb2Nlc3NfY29tbW9uOiBpX3Byb2Nlc3MgPSAiLCBpX3Byb2Nlc3MpCiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHNfbmFtZSA9Iiwgc19uYW1lKQoKICAgIHBfcHJvY2Vzcy5Dd2QgPT0gaV9wcm9jZXNzLkN3ZAogICAgcF9wcm9jZXNzLk5vTmV3UHJpdmlsZWdlcyA9PSBpX3Byb2Nlc3MuTm9OZXdQcml2aWxlZ2VzCgogICAgYWxsb3dfdXNlcihwX3Byb2Nlc3MsIGlfcHJvY2VzcykKICAgIGFsbG93X2VudihwX3Byb2Nlc3MsIGlfcHJvY2Vzcywgc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHRydWUiKQp9CgojIENvbXBhcmUgdGhlIE9DSSBQcm9jZXNzIGZpZWxkIG9mIGEgcG9saWN5IGNvbnRhaW5lciB3aXRoIHRoZSBpbnB1dCBPQ0kgUHJvY2VzcyBmcm9tIGEgQ3JlYXRlQ29udGFpbmVyUmVxdWVzdAphbGxvd19wcm9jZXNzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfcHJvY2Vzczogc3RhcnQiKQoKICAgIGFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgYWxsb3dfY2FwcyhwX3Byb2Nlc3MuQ2FwYWJpbGl0aWVzLCBpX3Byb2Nlc3MuQ2FwYWJpbGl0aWVzKQogICAgcF9wcm9jZXNzLlRlcm1pbmFsID09IGlfcHJvY2Vzcy5UZXJtaW5hbAoKICAgIHByaW50KCJhbGxvd19wcm9jZXNzOiB0cnVlIikKfQoKIyBDb21wYXJlIHRoZSBPQ0kgUHJvY2VzcyBmaWVsZCBvZiBhIHBvbGljeSBjb250YWluZXIgd2l0aCB0aGUgaW5wdXQgcHJvY2VzcyBmaWVsZCBmcm9tIEV4ZWNQcm9jZXNzUmVxdWVzdAphbGxvd19pbnRlcmFjdGl2ZV9wcm9jZXNzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfaW50ZXJhY3RpdmVfcHJvY2Vzczogc3RhcnQiKQoKICAgIGFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgYWxsb3dfZXhlY19jYXBzKGlfcHJvY2Vzcy5DYXBhYmlsaXRpZXMpCgogICAgIyBUaGVzZSBhcmUgY29tbWFuZHMgZW5hYmxlZCB1c2luZyBFeGVjUHJvY2Vzc1JlcXVlc3QgY29tbWFuZHMgYW5kL29yIHJlZ2V4IGZyb20gdGhlIHNldHRpbmdzIGZpbGUuCiAgICAjIFRoZXkgY2FuIGJlIGV4ZWN1dGVkIGludGVyYWN0aXZlbHkgc28gYWxsb3cgdGhlbSB0byB1c2UgYW55IHZhbHVlIGZvciBpX3Byb2Nlc3MuVGVybWluYWwuCgogICAgcHJpbnQoImFsbG93X2ludGVyYWN0aXZlX3Byb2Nlc3M6IHRydWUiKQp9CgojIENvbXBhcmUgdGhlIE9DSSBQcm9jZXNzIGZpZWxkIG9mIGEgcG9saWN5IGNvbnRhaW5lciB3aXRoIHRoZSBpbnB1dCBwcm9jZXNzIGZpZWxkIGZyb20gRXhlY1Byb2Nlc3NSZXF1ZXN0CmFsbG93X3Byb2JlX3Byb2Nlc3MocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19wcm9iZV9wcm9jZXNzOiBzdGFydCIpCgogICAgYWxsb3dfcHJvY2Vzc19jb21tb24ocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpCiAgICBhbGxvd19leGVjX2NhcHMoaV9wcm9jZXNzLkNhcGFiaWxpdGllcykKICAgIHBfcHJvY2Vzcy5UZXJtaW5hbCA9PSBpX3Byb2Nlc3MuVGVybWluYWwKCiAgICBwcmludCgiYWxsb3dfcHJvYmVfcHJvY2VzczogdHJ1ZSIpCn0KCmFsbG93X3VzZXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MpIHsKICAgIHBfdXNlciA6PSBwX3Byb2Nlc3MuVXNlcgogICAgaV91c2VyIDo9IGlfcHJvY2Vzcy5Vc2VyCgogICAgcHJpbnQoImFsbG93X3VzZXI6IGlucHV0IHVpZCA9IiwgaV91c2VyLlVJRCwgInBvbGljeSB1aWQgPSIsIHBfdXNlci5VSUQpCiAgICBwX3VzZXIuVUlEID09IGlfdXNlci5VSUQKCiAgICAjIFRPRE86IHRyYWNrIGRvd24gdGhlIHJlYXNvbiBmb3IgcmVnaXN0cnkuazhzLmlvL3BhdXNlOjMuOSBiZWluZwogICAgIyAgICAgICBleGVjdXRlZCB3aXRoIGdpZCA9IDAgZGVzcGl0ZSBoYXZpbmcgIjY1NTM1OjY1NTM1IiBpbiBpdHMgY29udGFpbmVyIGltYWdlCiAgICAjICAgICAgIGNvbmZpZy4KICAgICNwcmludCgiYWxsb3dfdXNlcjogaW5wdXQgZ2lkID0iLCBpX3VzZXIuR0lELCAicG9saWN5IGdpZCA9IiwgcF91c2VyLkdJRCkKICAgICNwX3VzZXIuR0lEID09IGlfdXNlci5HSUQKCiAgICAjIFRPRE86IGNvbXBhcmUgdGhlIGFkZGl0aW9uYWxHaWRzIGZpZWxkIHRvbyBhZnRlciBjb21wdXRpbmcgaXRzIHZhbHVlCiAgICAjIGJhc2VkIG9uIC9ldGMvcGFzc3dkIGFuZCAvZXRjL2dyb3VwIGZyb20gdGhlIGNvbnRhaW5lciBpbWFnZS4KfQoKYWxsb3dfZGVwcmVjYXRlZF9hcmdzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZ3MgMTogbm8gYXJncyIpCgogICAgbm90IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJncwogICAgbm90IGlfcHJvY2Vzcy5BcmdzCgogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAxOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZ3MocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSkgewogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiBwb2xpY3kgYXJncyA9IiwgcF9wcm9jZXNzLkRlcHJlY2F0ZWRBcmdzKQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiBpbnB1dCBhcmdzID0iLCBpX3Byb2Nlc3MuQXJncykKCiAgICBjb3VudChwX3Byb2Nlc3MuRGVwcmVjYXRlZEFyZ3MpID09IGNvdW50KGlfcHJvY2Vzcy5BcmdzKQoKICAgIGV2ZXJ5IGksIGlfYXJnIGluIGlfcHJvY2Vzcy5BcmdzIHsKICAgICAgICBhbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpCiAgICB9CgogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDE6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgcF9hcmcyIDo9IHJlcGxhY2UocF9hcmcsICIkJCIsICIkIikKICAgIHBfYXJnMiA9PSBpX2FyZwoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAxOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDI6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgIyBUT0RPOiBjYW4gJChub2RlLW5hbWUpIGJlIGhhbmRsZWQgYmV0dGVyPwogICAgY29udGFpbnMocF9hcmcsICIkKG5vZGUtbmFtZSkiKQoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAyOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDM6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgcF9hcmcyIDo9IHJlcGxhY2UocF9hcmcsICIkJCIsICIkIikKICAgIHBfYXJnMyA6PSByZXBsYWNlKHBfYXJnMiwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAzOiBwX2FyZzMgPSIsIHBfYXJnMykKICAgIHBfYXJnMyA9PSBpX2FyZwoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAzOiB0cnVlIikKfQoKIyBPQ0kgcHJvY2Vzcy5FbnYgZmllbGQKYWxsb3dfZW52KHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfZW52OiBwIGVudiA9IiwgcF9wcm9jZXNzLkVudikKICAgIHByaW50KCJhbGxvd19lbnY6IGkgZW52ID0iLCBpX3Byb2Nlc3MuRW52KQoKICAgIGV2ZXJ5IGlfdmFyIGluIGlfcHJvY2Vzcy5FbnYgewogICAgICAgIHByaW50KCJhbGxvd19lbnY6IGlfdmFyID0iLCBpX3ZhcikKICAgICAgICBhbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgfQoKICAgIHByaW50KCJhbGxvd19lbnY6IHRydWUiKQp9CgojIEFsbG93IGlucHV0IGVudiB2YXJpYWJsZXMgdGhhdCBhcmUgcHJlc2VudCBpbiB0aGUgcG9saWN5IGRhdGEgdG9vLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHBfdmFyID09IGlfdmFyCiAgICBwcmludCgiYWxsb3dfdmFyIDE6IHRydWUiKQp9CgojIE1hdGNoIGlucHV0IHdpdGggb25lIG9mIHRoZSBwb2xpY3kgdmFyaWFibGVzLCBhZnRlciBzdWJzdGl0dXRpbmcgJChzYW5kYm94LW5hbWUpLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHByaW50KCJhbGxvd192YXIgMjogcF92YXIgPSIsIHBfdmFyKQoKICAgIHBfdmFyX3NwbGl0IDo9IHNwbGl0KHBfdmFyLCAiPSIpCiAgICBjb3VudChwX3Zhcl9zcGxpdCkgPT0gMgoKICAgIHBfdmFyX3NwbGl0WzFdID09ICIkKHNhbmRib3gtbmFtZSkiCgogICAgaV92YXJfc3BsaXQgOj0gc3BsaXQoaV92YXIsICI9IikKICAgIGNvdW50KGlfdmFyX3NwbGl0KSA9PSAyCgogICAgaV92YXJfc3BsaXRbMF0gPT0gcF92YXJfc3BsaXRbMF0KICAgIHJlZ2V4Lm1hdGNoKHNfbmFtZSwgaV92YXJfc3BsaXRbMV0pCgogICAgcHJpbnQoImFsbG93X3ZhciAyOiB0cnVlIikKfQoKIyBBbGxvdyBpbnB1dCBlbnYgdmFyaWFibGVzIHRoYXQgbWF0Y2ggd2l0aCBhIHJlcXVlc3RfZGVmYXVsdHMgcmVnZXguCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHNvbWUgcF9yZWdleDEgaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5DcmVhdGVDb250YWluZXJSZXF1ZXN0LmFsbG93X2Vudl9yZWdleAogICAgcF9yZWdleDIgOj0gcmVwbGFjZShwX3JlZ2V4MSwgIiQoaXB2NF9hKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcHY0X2EpCiAgICBwX3JlZ2V4MyA6PSByZXBsYWNlKHBfcmVnZXgyLCAiJChpcF9wKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcF9wKQogICAgcF9yZWdleDQgOj0gcmVwbGFjZShwX3JlZ2V4MywgIiQoc3ZjX25hbWUpIiwgcG9saWN5X2RhdGEuY29tbW9uLnN2Y19uYW1lKQogICAgcF9yZWdleDUgOj0gcmVwbGFjZShwX3JlZ2V4NCwgIiQoZG5zX2xhYmVsKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5kbnNfbGFiZWwpCgogICAgcHJpbnQoImFsbG93X3ZhciAzOiBwX3JlZ2V4NSA9IiwgcF9yZWdleDUpCiAgICByZWdleC5tYXRjaChwX3JlZ2V4NSwgaV92YXIpCgogICAgcHJpbnQoImFsbG93X3ZhciAzOiB0cnVlIikKfQoKIyBBbGxvdyBmaWVsZFJlZiAiZmllbGRQYXRoOiBzdGF0dXMucG9kSVAiIHZhbHVlcy4KYWxsb3dfdmFyKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBpX3Zhciwgc19uYW1lLCBzX25hbWVzcGFjZSkgewogICAgbmFtZV92YWx1ZSA6PSBzcGxpdChpX3ZhciwgIj0iKQogICAgY291bnQobmFtZV92YWx1ZSkgPT0gMgogICAgaXNfaXAobmFtZV92YWx1ZVsxXSkKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIGFsbG93X3BvZF9pcF92YXIobmFtZV92YWx1ZVswXSwgcF92YXIpCgogICAgcHJpbnQoImFsbG93X3ZhciA0OiB0cnVlIikKfQoKIyBBbGxvdyBjb21tb24gZmllbGRSZWYgdmFyaWFibGVzLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBuYW1lX3ZhbHVlIDo9IHNwbGl0KGlfdmFyLCAiPSIpCiAgICBjb3VudChuYW1lX3ZhbHVlKSA9PSAyCgogICAgc29tZSBwX3ZhciBpbiBwX3Byb2Nlc3MuRW52CiAgICBwX25hbWVfdmFsdWUgOj0gc3BsaXQocF92YXIsICI9IikKICAgIGNvdW50KHBfbmFtZV92YWx1ZSkgPT0gMgoKICAgIHBfbmFtZV92YWx1ZVswXSA9PSBuYW1lX3ZhbHVlWzBdCgogICAgIyBUT0RPOiBzaG91bGQgdGhlc2UgYmUgaGFuZGxlZCBpbiBhIGRpZmZlcmVudCB3YXk/CiAgICBhbHdheXNfYWxsb3dlZCA6PSBbIiQoaG9zdC1uYW1lKSIsICIkKG5vZGUtbmFtZSkiLCAiJChwb2QtdWlkKSJdCiAgICBzb21lIGFsbG93ZWQgaW4gYWx3YXlzX2FsbG93ZWQKICAgIGNvbnRhaW5zKHBfbmFtZV92YWx1ZVsxXSwgYWxsb3dlZCkKCiAgICBwcmludCgiYWxsb3dfdmFyIDU6IHRydWUiKQp9CgojIEFsbG93IGZpZWxkUmVmICJmaWVsZFBhdGg6IHN0YXR1cy5ob3N0SVAiIHZhbHVlcy4KYWxsb3dfdmFyKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBpX3Zhciwgc19uYW1lLCBzX25hbWVzcGFjZSkgewogICAgbmFtZV92YWx1ZSA6PSBzcGxpdChpX3ZhciwgIj0iKQogICAgY291bnQobmFtZV92YWx1ZSkgPT0gMgogICAgaXNfaXAobmFtZV92YWx1ZVsxXSkKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIGFsbG93X2hvc3RfaXBfdmFyKG5hbWVfdmFsdWVbMF0sIHBfdmFyKQoKICAgIHByaW50KCJhbGxvd192YXIgNjogdHJ1ZSIpCn0KCiMgQWxsb3cgcmVzb3VyY2VGaWVsZFJlZiB2YWx1ZXMgKGUuZy4sICJsaW1pdHMuY3B1IikuCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIG5hbWVfdmFsdWUgOj0gc3BsaXQoaV92YXIsICI9IikKICAgIGNvdW50KG5hbWVfdmFsdWUpID09IDIKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHBfbmFtZV92YWx1ZSA6PSBzcGxpdChwX3ZhciwgIj0iKQogICAgY291bnQocF9uYW1lX3ZhbHVlKSA9PSAyCgogICAgcF9uYW1lX3ZhbHVlWzBdID09IG5hbWVfdmFsdWVbMF0KCiAgICAjIGEgdmFyaWFibGUgd2Ugc2hvdWxkIGJlIHZhbGlkYXRpbmcgdXNpbmcgYSByZWdleCBmcm9tIHNldHRpbmdzCiAgICBwX25hbWVfdmFsdWVbMV0gPT0gIiQodmFsaWRhdGUtZnJvbS1zZXR0aW5ncykiCgogICAgcmVnZXhfdmFsIDo9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuQ3JlYXRlQ29udGFpbmVyUmVxdWVzdC5hbGxvd19lbnZfcmVnZXhfbWFwW25hbWVfdmFsdWVbMF1dCgogICAgcHJpbnQoImFsbG93X3ZhciA3OiB2YWwgPSIsIG5hbWVfdmFsdWVbMV0pCiAgICBwcmludCgiYWxsb3dfdmFyIDc6IHJlZ2V4X3ZhbCA9IiwgcmVnZXhfdmFsKQoKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4X3ZhbCwgbmFtZV92YWx1ZVsxXSkKCiAgICBwcmludCgiYWxsb3dfdmFyIDc6IHRydWUiKQp9CgojIE1hdGNoIGlucHV0IHdpdGggb25lIG9mIHRoZSBwb2xpY3kgdmFyaWFibGVzLCBhZnRlciBzdWJzdGl0dXRpbmcgJChzYW5kYm94LW5hbWVzcGFjZSkuCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHNvbWUgcF92YXIgaW4gcF9wcm9jZXNzLkVudgogICAgcF92YXIyIDo9IHJlcGxhY2UocF92YXIsICIkKHNhbmRib3gtbmFtZXNwYWNlKSIsIHNfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd192YXIgODogcF92YXIyID0iLCBwX3ZhcjIpCiAgICBwX3ZhcjIgPT0gaV92YXIKCiAgICBwcmludCgiYWxsb3dfdmFyIDg6IHRydWUiKQp9CgphbGxvd19wb2RfaXBfdmFyKHZhcl9uYW1lLCBwX3ZhcikgewogICAgcHJpbnQoImFsbG93X3BvZF9pcF92YXI6IHZhcl9uYW1lID0iLCB2YXJfbmFtZSwgInBfdmFyID0iLCBwX3ZhcikKCiAgICBwX25hbWVfdmFsdWUgOj0gc3BsaXQocF92YXIsICI9IikKICAgIGNvdW50KHBfbmFtZV92YWx1ZSkgPT0gMgoKICAgIHBfbmFtZV92YWx1ZVswXSA9PSB2YXJfbmFtZQogICAgcF9uYW1lX3ZhbHVlWzFdID09ICIkKHBvZC1pcCkiCgogICAgcHJpbnQoImFsbG93X3BvZF9pcF92YXI6IHRydWUiKQp9CgphbGxvd19ob3N0X2lwX3Zhcih2YXJfbmFtZSwgcF92YXIpIHsKICAgIHByaW50KCJhbGxvd19ob3N0X2lwX3ZhcjogdmFyX25hbWUgPSIsIHZhcl9uYW1lLCAicF92YXIgPSIsIHBfdmFyKQoKICAgIHBfbmFtZV92YWx1ZSA6PSBzcGxpdChwX3ZhciwgIj0iKQogICAgY291bnQocF9uYW1lX3ZhbHVlKSA9PSAyCgogICAgcF9uYW1lX3ZhbHVlWzBdID09IHZhcl9uYW1lCiAgICBwX25hbWVfdmFsdWVbMV0gPT0gIiQoaG9zdC1pcCkiCgogICAgcHJpbnQoImFsbG93X2hvc3RfaXBfdmFyOiB0cnVlIikKfQoKaXNfaXAodmFsdWUpIHsKICAgIGJ5dGVzID0gc3BsaXQodmFsdWUsICIuIikKICAgIGNvdW50KGJ5dGVzKSA9PSA0CgogICAgaXNfaXBfZmlyc3RfYnl0ZShieXRlc1swXSkKICAgIGlzX2lwX290aGVyX2J5dGUoYnl0ZXNbMV0pCiAgICBpc19pcF9vdGhlcl9ieXRlKGJ5dGVzWzJdKQogICAgaXNfaXBfb3RoZXJfYnl0ZShieXRlc1szXSkKfQppc19pcF9maXJzdF9ieXRlKGNvbXBvbmVudCkgewogICAgbnVtYmVyID0gdG9fbnVtYmVyKGNvbXBvbmVudCkKICAgIG51bWJlciA+PSAxCiAgICBudW1iZXIgPD0gMjU1Cn0KaXNfaXBfb3RoZXJfYnl0ZShjb21wb25lbnQpIHsKICAgIG51bWJlciA9IHRvX251bWJlcihjb21wb25lbnQpCiAgICBudW1iZXIgPj0gMAogICAgbnVtYmVyIDw9IDI1NQp9CgojIE9DSSByb290LlBhdGgKYWxsb3dfcm9vdF9wYXRoKHBfb2NpLCBpX29jaSwgYnVuZGxlX2lkKSB7CiAgICBpX3BhdGggOj0gaV9vY2kuUm9vdC5QYXRoCiAgICBwX3BhdGgxIDo9IHBfb2NpLlJvb3QuUGF0aAogICAgcHJpbnQoImFsbG93X3Jvb3RfcGF0aDogaV9wYXRoID0iLCBpX3BhdGgsICJwX3BhdGgxID0iLCBwX3BhdGgxKQoKICAgIHBfcGF0aDIgOj0gcmVwbGFjZShwX3BhdGgxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfcm9vdF9wYXRoOiBwX3BhdGgyID0iLCBwX3BhdGgyKQoKICAgIHBfcGF0aDMgOj0gcmVwbGFjZShwX3BhdGgyLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X3Jvb3RfcGF0aDogcF9wYXRoMyA9IiwgcF9wYXRoMykKCiAgICBwX3BhdGgzID09IGlfcGF0aAoKICAgIHByaW50KCJhbGxvd19yb290X3BhdGg6IHRydWUiKQp9CgojIGRldmljZSBtb3VudHMKYWxsb3dfbW91bnQocF9vY2ksIGlfbW91bnQsIGlfc3RvcmFnZXMsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcHJpbnQoImFsbG93X21vdW50OiBpX21vdW50ID0iLCBpX21vdW50KQoKICAgIHNvbWUgcF9tb3VudCBpbiBwX29jaS5Nb3VudHMKICAgIHNvbWUgaV9zdG9yYWdlIGluIGlfc3RvcmFnZXMKCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IHBfbW91bnQgPSIsIHBfbW91bnQpCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IGlfc3RvcmFnZSA9IiwgaV9zdG9yYWdlKQoKICAgIGNoZWNrX21vdW50KHBfbW91bnQsIGlfbW91bnQsIGlfc3RvcmFnZSwgYnVuZGxlX2lkLCBzYW5kYm94X2lkKQoKICAgICMgVE9ETzogYXJlIHRoZXJlIGFueSBvdGhlciByZXF1aXJlZCBwb2xpY3kgY2hlY2tzIGZvciBtb3VudHMgLSBlLmcuLAogICAgIyAgICAgICBtdWx0aXBsZSBtb3VudHMgd2l0aCBzYW1lIHNvdXJjZSBvciBkZXN0aW5hdGlvbj8KCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IHRydWUiKQp9CgpjaGVja19tb3VudChwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcF9tb3VudCA9PSBpX21vdW50CiAgICBwcmludCgiY2hlY2tfbW91bnQgMTogdHJ1ZSIpCn0KY2hlY2tfbW91bnQocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHBfbW91bnQuZGVzdGluYXRpb24gPT0gaV9tb3VudC5kZXN0aW5hdGlvbgogICAgcF9tb3VudC50eXBlXyA9PSBpX21vdW50LnR5cGVfCiAgICBwX21vdW50Lm9wdGlvbnMgPT0gaV9tb3VudC5vcHRpb25zCgogICAgbW91bnRfc291cmNlX2FsbG93cyhwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkKCiAgICBwcmludCgiY2hlY2tfbW91bnQgMjogdHJ1ZSIpCn0KCm1vdW50X3NvdXJjZV9hbGxvd3MocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHJlZ2V4MSA6PSBwX21vdW50LnNvdXJjZQogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5tb3VudF9zb3VyY2VfY3BhdGgpCiAgICByZWdleDQgOj0gcmVwbGFjZShyZWdleDMsICIkKGJ1bmRsZS1pZCkiLCBidW5kbGVfaWQpCgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMTogcmVnZXg0ID0iLCByZWdleDQpCiAgICByZWdleC5tYXRjaChyZWdleDQsIGlfbW91bnQuc291cmNlKQoKICAgIHByaW50KCJtb3VudF9zb3VyY2VfYWxsb3dzIDE6IHRydWUiKQp9Cm1vdW50X3NvdXJjZV9hbGxvd3MocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHJlZ2V4MSA6PSBwX21vdW50LnNvdXJjZQogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5tb3VudF9zb3VyY2VfY3BhdGgpCiAgICByZWdleDQgOj0gcmVwbGFjZShyZWdleDMsICIkKHNhbmRib3gtaWQpIiwgc2FuZGJveF9pZCkKCiAgICBwcmludCgibW91bnRfc291cmNlX2FsbG93cyAyOiByZWdleDQgPSIsIHJlZ2V4NCkKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4NCwgaV9tb3VudC5zb3VyY2UpCgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMjogdHJ1ZSIpCn0KbW91bnRfc291cmNlX2FsbG93cyhwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogaV9tb3VudC5zb3VyY2UgPSIsIGlfbW91bnQuc291cmNlKQogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogaV9zdG9yYWdlLm1vdW50X3BvaW50ID0iLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCgogICAgaV9tb3VudC5zb3VyY2UgPT0gaV9zdG9yYWdlLm1vdW50X3BvaW50CgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogdHJ1ZSIpCn0KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBDcmVhdGUgY29udGFpbmVyIFN0b3JhZ2VzCgphbGxvd19zdG9yYWdlcyhwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHBfY291bnQgOj0gY291bnQocF9zdG9yYWdlcykKICAgIGlfY291bnQgOj0gY291bnQoaV9zdG9yYWdlcykKICAgIHByaW50KCJhbGxvd19zdG9yYWdlczogcF9jb3VudCA9IiwgcF9jb3VudCwgImlfY291bnQgPSIsIGlfY291bnQpCgogICAgcF9jb3VudCA9PSBpX2NvdW50CgogICAgIyBHZXQgdGhlIGNvbnRhaW5lciBpbWFnZSBsYXllciBJRHMgYW5kIHZlcml0eSByb290IGhhc2hlcywgZnJvbSB0aGUgIm92ZXJsYXlmcyIgc3RvcmFnZS4KICAgIHNvbWUgb3ZlcmxheV9zdG9yYWdlIGluIHBfc3RvcmFnZXMKICAgIG92ZXJsYXlfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIHByaW50KCJhbGxvd19zdG9yYWdlczogb3ZlcmxheV9zdG9yYWdlID0iLCBvdmVybGF5X3N0b3JhZ2UpCiAgICBjb3VudChvdmVybGF5X3N0b3JhZ2Uub3B0aW9ucykgPT0gMgoKICAgIGxheWVyX2lkcyA6PSBzcGxpdChvdmVybGF5X3N0b3JhZ2Uub3B0aW9uc1swXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiBsYXllcl9pZHMgPSIsIGxheWVyX2lkcykKCiAgICByb290X2hhc2hlcyA6PSBzcGxpdChvdmVybGF5X3N0b3JhZ2Uub3B0aW9uc1sxXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiByb290X2hhc2hlcyA9Iiwgcm9vdF9oYXNoZXMpCgogICAgZXZlcnkgaV9zdG9yYWdlIGluIGlfc3RvcmFnZXMgewogICAgICAgIGFsbG93X3N0b3JhZ2UocF9zdG9yYWdlcywgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpCiAgICB9CgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiB0cnVlIikKfQoKYWxsb3dfc3RvcmFnZShwX3N0b3JhZ2VzLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgc29tZSBwX3N0b3JhZ2UgaW4gcF9zdG9yYWdlcwoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiBwX3N0b3JhZ2UgPSIsIHBfc3RvcmFnZSkKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiBpX3N0b3JhZ2UgPSIsIGlfc3RvcmFnZSkKCiAgICBwX3N0b3JhZ2UuZHJpdmVyICAgICAgICAgICA9PSBpX3N0b3JhZ2UuZHJpdmVyCiAgICBwX3N0b3JhZ2UuZHJpdmVyX29wdGlvbnMgICA9PSBpX3N0b3JhZ2UuZHJpdmVyX29wdGlvbnMKICAgIHBfc3RvcmFnZS5mc19ncm91cCAgICAgICAgID09IGlfc3RvcmFnZS5mc19ncm91cAogICAgcF9zdG9yYWdlLmZzdHlwZSAgICAgICAgICAgPT0gaV9zdG9yYWdlLmZzdHlwZQoKICAgIGFsbG93X3N0b3JhZ2Vfc291cmNlKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKQogICAgYWxsb3dfc3RvcmFnZV9vcHRpb25zKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKQogICAgYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKQoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiB0cnVlIikKfQoKYWxsb3dfc3RvcmFnZV9zb3VyY2UocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX3NvdXJjZSAxOiBzdGFydCIpCgogICAgcF9zdG9yYWdlLnNvdXJjZSA9PSBpX3N0b3JhZ2Uuc291cmNlCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDE6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX3NvdXJjZShwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDI6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCgogICAgIyBEREREOkJCOkRELkY6IERvbWFpbjpCdXM6RGV2aWNlLkZ1bmN0aW9uCiAgICAjIGh0dHBzOi8vd3d3Lmtlcm5lbC5vcmcvZG9jL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtYnVzLXBjaQogICAgcmVnZXgubWF0Y2goYF5bYS1mMC05XXs0fTpbYS1mMC05XXsyfTpbYS1mMC05XXsyfVwuW2EtZjAtOV0kYCwgaV9zdG9yYWdlLnNvdXJjZSkKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9zb3VyY2UgMjogdHJ1ZSIpCn0KCmFsbG93X3N0b3JhZ2Vfc291cmNlKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKSB7CiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9zb3VyY2UgMzogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIGlfc3RvcmFnZS5zb3VyY2UgPT0gIm5vbmUiCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDM6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX3NvdXJjZShwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDQ6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJzbWIiCgogICAgIyBQYXR0ZXJuOiAvLzxzdG9yYWdlLWFjY291bnQtbmFtZT4uZmlsZS5jb3JlLndpbmRvd3MubmV0LzxrOHMtUFZDLW5hbWU+CiAgICAjIFN0b3JhZ2UgYWNjb3VudCBuYW1lOiBodHRwczovL2xlYXJuLm1pY3Jvc29mdC5jb20vZW4tdXMvYXp1cmUvc3RvcmFnZS9jb21tb24vc3RvcmFnZS1hY2NvdW50LW92ZXJ2aWV3I3N0b3JhZ2UtYWNjb3VudC1uYW1lCiAgICAjIEs4cyBQVkMgbmFtZTogaHR0cHM6Ly9rdWJlcm5ldGVzLmlvL2RvY3MvY29uY2VwdHMvb3ZlcnZpZXcvd29ya2luZy13aXRoLW9iamVjdHMvbmFtZXMvI2Rucy1zdWJkb21haW4tbmFtZXMKICAgIHJlZ2V4Lm1hdGNoKGBeXC9cLyhbYS16MC05XXszLDI0fSlcLmZpbGVcLmNvcmVcLndpbmRvd3NcLm5ldFwvW2EtejAtOV0oW2EtejAtOS4tXXswLDI1MX1bYS16MC05XSk/JGAsIGlfc3RvcmFnZS5zb3VyY2UpCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDQ6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMTogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgIT0gIm92ZXJsYXlmcyIKICAgIHBfc3RvcmFnZS5vcHRpb25zID09IGlfc3RvcmFnZS5vcHRpb25zCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAxOiB0cnVlIikKfQphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIGNvdW50KHBfc3RvcmFnZS5vcHRpb25zKSA9PSAyCgogICAgcG9saWN5X2lkcyA6PSBzcGxpdChwX3N0b3JhZ2Uub3B0aW9uc1swXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBwb2xpY3lfaWRzID0iLCBwb2xpY3lfaWRzKQogICAgcG9saWN5X2lkcyA9PSBsYXllcl9pZHMKCiAgICBwb2xpY3lfaGFzaGVzIDo9IHNwbGl0KHBfc3RvcmFnZS5vcHRpb25zWzFdLCAiOiIpCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IHBvbGljeV9oYXNoZXMgPSIsIHBvbGljeV9oYXNoZXMpCgogICAgcF9jb3VudCA6PSBjb3VudChwb2xpY3lfaWRzKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBwX2NvdW50ID0iLCBwX2NvdW50KQogICAgcF9jb3VudCA+PSAxCiAgICBwX2NvdW50ID09IGNvdW50KHBvbGljeV9oYXNoZXMpCgogICAgaV9jb3VudCA6PSBjb3VudChpX3N0b3JhZ2Uub3B0aW9ucykKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogaV9jb3VudCA9IiwgaV9jb3VudCkKICAgIGlfY291bnQgPT0gcF9jb3VudCArIDMKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zWzBdID0iLCBpX3N0b3JhZ2Uub3B0aW9uc1swXSkKICAgIGlfc3RvcmFnZS5vcHRpb25zWzBdID09ICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQubGF5ZXItc3JjLXByZWZpeD0vdmFyL2xpYi9jb250YWluZXJkL2lvLmNvbnRhaW5lcmQuc25hcHNob3R0ZXIudjEudGFyZGV2L2xheWVycyIKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zW2lfY291bnQgLSAyXSA9IiwgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDJdKQogICAgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDJdID09ICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQub3ZlcmxheS1ydyIKCiAgICBsb3dlcmRpciA6PSBjb25jYXQoIj0iLCBbImxvd2VyZGlyIiwgcF9zdG9yYWdlLm9wdGlvbnNbMF1dKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBsb3dlcmRpciA9IiwgbG93ZXJkaXIpCgogICAgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDFdID09IGxvd2VyZGlyCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zW2lfY291bnQgLSAxXSA9IiwgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDFdKQoKICAgIGV2ZXJ5IGksIHBvbGljeV9pZCBpbiBwb2xpY3lfaWRzIHsKICAgICAgICBhbGxvd19vdmVybGF5X2xheWVyKHBvbGljeV9pZCwgcG9saWN5X2hhc2hlc1tpXSwgaV9zdG9yYWdlLm9wdGlvbnNbaSArIDFdKQogICAgfQoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogdHJ1ZSIpCn0KYWxsb3dfc3RvcmFnZV9vcHRpb25zKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKSB7CiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDM6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCiAgICBjb3VudChwX3N0b3JhZ2Uub3B0aW9ucykgPT0gMQoKICAgIHN0YXJ0c3dpdGgocF9zdG9yYWdlLm9wdGlvbnNbMF0sICIkKGhhc2giKQogICAgaGFzaF9zdWZmaXggOj0gdHJpbV9sZWZ0KHBfc3RvcmFnZS5vcHRpb25zWzBdLCAiJChoYXNoIikKCiAgICBlbmRzd2l0aChoYXNoX3N1ZmZpeCwgIikiKQogICAgaGFzaF9pbmRleCA6PSB0cmltX3JpZ2h0KGhhc2hfc3VmZml4LCAiKSIpCiAgICBpIDo9IHRvX251bWJlcihoYXNoX2luZGV4KQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAzOiBpID0iLCBpKQoKICAgIGhhc2hfb3B0aW9uIDo9IGNvbmNhdCgiPSIsIFsiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LnJvb3QtaGFzaCIsIHJvb3RfaGFzaGVzW2ldXSkKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMzogaGFzaF9vcHRpb24gPSIsIGhhc2hfb3B0aW9uKQoKICAgIGNvdW50KGlfc3RvcmFnZS5vcHRpb25zKSA9PSA0CiAgICBpX3N0b3JhZ2Uub3B0aW9uc1swXSA9PSAicm8iCiAgICBpX3N0b3JhZ2Uub3B0aW9uc1sxXSA9PSAiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmJsb2NrX2RldmljZT1maWxlIgogICAgaV9zdG9yYWdlLm9wdGlvbnNbMl0gPT0gImlvLmthdGFjb250YWluZXJzLmZzLW9wdC5pcy1sYXllciIKICAgIGlfc3RvcmFnZS5vcHRpb25zWzNdID09IGhhc2hfb3B0aW9uCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAzOiB0cnVlIikKfQphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgNDogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gInNtYiIKICAgIHBfb3B0c19jb3VudCA6PSBjb3VudChwX3N0b3JhZ2Uub3B0aW9ucykKICAgIGlfb3B0c19jb3VudCA6PSBjb3VudChpX3N0b3JhZ2Uub3B0aW9ucykKICAgIGlfb3B0c19jb3VudCA9PSBwX29wdHNfY291bnQgKyAyCgogICAgaV9vcHRfbWF0Y2hlcyA6PSBbaSB8IGkgOj0gaWR4OyBpZHggPCBwX29wdHNfY291bnQ7IHBfc3RvcmFnZS5vcHRpb25zW2lkeF0gPT0gaV9zdG9yYWdlLm9wdGlvbnNbaWR4XV0KICAgIGNvdW50KGlfb3B0X21hdGNoZXMpID09IHBfb3B0c19jb3VudAoKICAgIHN0YXJ0c3dpdGgoaV9zdG9yYWdlLm9wdGlvbnNbaV9vcHRzX2NvdW50LTJdLCAiYWRkcj0iKQogICAgY3JlZHMgPSBzcGxpdChpX3N0b3JhZ2Uub3B0aW9uc1tpX29wdHNfY291bnQtMV0sICIsIikKICAgIGNvdW50KGNyZWRzKSA9PSAyCiAgICBzdGFydHN3aXRoKGNyZWRzWzBdLCAidXNlcm5hbWU9IikKICAgIHN0YXJ0c3dpdGgoY3JlZHNbMV0sICJwYXNzd29yZD0iKQogICAgCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDQ6IHRydWUiKQp9CgphbGxvd19vdmVybGF5X2xheWVyKHBvbGljeV9pZCwgcG9saWN5X2hhc2gsIGlfb3B0aW9uKSB7CiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogcG9saWN5X2lkID0iLCBwb2xpY3lfaWQsICJwb2xpY3lfaGFzaCA9IiwgcG9saWN5X2hhc2gpCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogaV9vcHRpb24gPSIsIGlfb3B0aW9uKQoKICAgIHN0YXJ0c3dpdGgoaV9vcHRpb24sICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQubGF5ZXI9IikKICAgIGlfdmFsdWUgOj0gcmVwbGFjZShpX29wdGlvbiwgImlvLmthdGFjb250YWluZXJzLmZzLW9wdC5sYXllcj0iLCAiIikKICAgIGlfdmFsdWVfZGVjb2RlZCA6PSBiYXNlNjQuZGVjb2RlKGlfdmFsdWUpCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogaV92YWx1ZV9kZWNvZGVkID0iLCBpX3ZhbHVlX2RlY29kZWQpCgogICAgcG9saWN5X3N1ZmZpeCA6PSBjb25jYXQoIj0iLCBbInRhcixybyxpby5rYXRhY29udGFpbmVycy5mcy1vcHQuYmxvY2tfZGV2aWNlPWZpbGUsaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmlzLWxheWVyLGlvLmthdGFjb250YWluZXJzLmZzLW9wdC5yb290LWhhc2giLCBwb2xpY3lfaGFzaF0pCiAgICBwX3ZhbHVlIDo9IGNvbmNhdCgiLCIsIFtwb2xpY3lfaWQsIHBvbGljeV9zdWZmaXhdKQogICAgcHJpbnQoImFsbG93X292ZXJsYXlfbGF5ZXI6IHBfdmFsdWUgPSIsIHBfdmFsdWUpCgogICAgcF92YWx1ZSA9PSBpX3ZhbHVlX2RlY29kZWQKCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogdHJ1ZSIpCn0KCmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAidGFyIgoKICAgIHN0YXJ0c3dpdGgocF9zdG9yYWdlLm1vdW50X3BvaW50LCAiJChsYXllciIpCiAgICBtb3VudF9zdWZmaXggOj0gdHJpbV9sZWZ0KHBfc3RvcmFnZS5tb3VudF9wb2ludCwgIiQobGF5ZXIiKQoKICAgIGVuZHN3aXRoKG1vdW50X3N1ZmZpeCwgIikiKQogICAgbGF5ZXJfaW5kZXggOj0gdHJpbV9yaWdodChtb3VudF9zdWZmaXgsICIpIikKICAgIGkgOj0gdG9fbnVtYmVyKGxheWVyX2luZGV4KQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDE6IGkgPSIsIGkpCgogICAgbGF5ZXJfaWQgOj0gbGF5ZXJfaWRzW2ldCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMTogbGF5ZXJfaWQgPSIsIGxheWVyX2lkKQoKICAgIHBfbW91bnQgOj0gY29uY2F0KCIvIiwgWyIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L2xheWVycyIsIGxheWVyX2lkXSkKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCAxOiBwX21vdW50ID0iLCBwX21vdW50KQoKICAgIHBfbW91bnQgPT0gaV9zdG9yYWdlLm1vdW50X3BvaW50CgogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDE6IHRydWUiKQp9CmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAiZnVzZTMua2F0YS1vdmVybGF5IgoKICAgIG1vdW50MSA6PSByZXBsYWNlKHBfc3RvcmFnZS5tb3VudF9wb2ludCwgIiQoY3BhdGgpIiwgcG9saWN5X2RhdGEuY29tbW9uLmNwYXRoKQogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDI6IG1vdW50MiA9IiwgbW91bnQyKQoKICAgIG1vdW50MiA9PSBpX3N0b3JhZ2UubW91bnRfcG9pbnQKCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMjogdHJ1ZSIpCn0KYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKSB7CiAgICBwX3N0b3JhZ2UuZnN0eXBlID09ICJsb2NhbCIKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQyID0iLCBtb3VudDIpCgogICAgbW91bnQzIDo9IHJlcGxhY2UobW91bnQyLCAiJChzYW5kYm94LWlkKSIsIHNhbmRib3hfaWQpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQzID0iLCBtb3VudDMpCgogICAgcmVnZXgubWF0Y2gobW91bnQzLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCgogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDM6IHRydWUiKQp9CmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAiYmluZCIKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNDogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNDogbW91bnQyID0iLCBtb3VudDIpCgogICAgbW91bnQzIDo9IHJlcGxhY2UobW91bnQyLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDQ6IG1vdW50MyA9IiwgbW91bnQzKQoKICAgIHJlZ2V4Lm1hdGNoKG1vdW50MywgaV9zdG9yYWdlLm1vdW50X3BvaW50KQoKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA0OiB0cnVlIikKfQphbGxvd19tb3VudF9wb2ludChwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgYnVuZGxlX2lkLCBzYW5kYm94X2lkLCBsYXllcl9pZHMpIHsKICAgIHBfc3RvcmFnZS5mc3R5cGUgPT0gInRtcGZzIgoKICAgIG1vdW50MSA6PSBwX3N0b3JhZ2UubW91bnRfcG9pbnQKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA1OiBtb3VudDEgPSIsIG1vdW50MSkKCiAgICByZWdleC5tYXRjaChtb3VudDEsIGlfc3RvcmFnZS5tb3VudF9wb2ludCkKCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNTogdHJ1ZSIpCn0KYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKSB7CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogaV9zdG9yYWdlLm1vdW50X3BvaW50ID0iLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCiAgICBhbGxvd19kaXJlY3Rfdm9sX2RyaXZlcihwX3N0b3JhZ2UsIGlfc3RvcmFnZSkKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChzcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQyID0iLCBtb3VudDIpCgogICAgZGlyZWN0X3ZvbF9wYXRoIDo9IGlfc3RvcmFnZS5zb3VyY2UKICAgIG1vdW50MyA6PSByZXBsYWNlKG1vdW50MiwgIiQoYjY0LWRpcmVjdC12b2wtcGF0aCkiLCBiYXNlNjR1cmwuZW5jb2RlKGRpcmVjdF92b2xfcGF0aCkpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQzID0iLCBtb3VudDMpCgogICAgbW91bnQzID09IGlfc3RvcmFnZS5tb3VudF9wb2ludAoKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA2OiB0cnVlIikKfQoKYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIocF9zdG9yYWdlLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19kaXJlY3Rfdm9sX2RyaXZlciAxOiBzdGFydCIpCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCiAgICBwcmludCgiYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIgMTogdHJ1ZSIpCn0KYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIocF9zdG9yYWdlLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19kaXJlY3Rfdm9sX2RyaXZlciAyOiBzdGFydCIpCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJzbWIiCiAgICBwcmludCgiYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIgMjogdHJ1ZSIpCn0KCiMgRXhlY1Byb2Nlc3NSZXF1ZXN0LnByb2Nlc3MuQ2FwYWJpbGl0aWVzCmFsbG93X2V4ZWNfY2FwcyhpX2NhcHMpIHsKICAgIG5vdCBpX2NhcHMuQW1iaWVudAogICAgbm90IGlfY2Fwcy5Cb3VuZGluZwogICAgbm90IGlfY2Fwcy5FZmZlY3RpdmUKICAgIG5vdCBpX2NhcHMuSW5oZXJpdGFibGUKICAgIG5vdCBpX2NhcHMuUGVybWl0dGVkCn0KCiMgT0NJLlByb2Nlc3MuQ2FwYWJpbGl0aWVzCmFsbG93X2NhcHMocF9jYXBzLCBpX2NhcHMpIHsKICAgIHByaW50KCJhbGxvd19jYXBzOiBwb2xpY3kgQW1iaWVudCA9IiwgcF9jYXBzLkFtYmllbnQpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgQW1iaWVudCA9IiwgaV9jYXBzLkFtYmllbnQpCiAgICBtYXRjaF9jYXBzKHBfY2Fwcy5BbWJpZW50LCBpX2NhcHMuQW1iaWVudCkKCiAgICBwcmludCgiYWxsb3dfY2FwczogcG9saWN5IEJvdW5kaW5nID0iLCBwX2NhcHMuQm91bmRpbmcpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgQm91bmRpbmcgPSIsIGlfY2Fwcy5Cb3VuZGluZykKICAgIG1hdGNoX2NhcHMocF9jYXBzLkJvdW5kaW5nLCBpX2NhcHMuQm91bmRpbmcpCgogICAgcHJpbnQoImFsbG93X2NhcHM6IHBvbGljeSBFZmZlY3RpdmUgPSIsIHBfY2Fwcy5FZmZlY3RpdmUpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgRWZmZWN0aXZlID0iLCBpX2NhcHMuRWZmZWN0aXZlKQogICAgbWF0Y2hfY2FwcyhwX2NhcHMuRWZmZWN0aXZlLCBpX2NhcHMuRWZmZWN0aXZlKQoKICAgIHByaW50KCJhbGxvd19jYXBzOiBwb2xpY3kgSW5oZXJpdGFibGUgPSIsIHBfY2Fwcy5Jbmhlcml0YWJsZSkKICAgIHByaW50KCJhbGxvd19jYXBzOiBpbnB1dCBJbmhlcml0YWJsZSA9IiwgaV9jYXBzLkluaGVyaXRhYmxlKQogICAgbWF0Y2hfY2FwcyhwX2NhcHMuSW5oZXJpdGFibGUsIGlfY2Fwcy5Jbmhlcml0YWJsZSkKCiAgICBwcmludCgiYWxsb3dfY2FwczogcG9saWN5IFBlcm1pdHRlZCA9IiwgcF9jYXBzLlBlcm1pdHRlZCkKICAgIHByaW50KCJhbGxvd19jYXBzOiBpbnB1dCBQZXJtaXR0ZWQgPSIsIGlfY2Fwcy5QZXJtaXR0ZWQpCiAgICBtYXRjaF9jYXBzKHBfY2Fwcy5QZXJtaXR0ZWQsIGlfY2Fwcy5QZXJtaXR0ZWQpCn0KCm1hdGNoX2NhcHMocF9jYXBzLCBpX2NhcHMpIHsKICAgIHByaW50KCJtYXRjaF9jYXBzIDE6IHN0YXJ0IikKCiAgICBwX2NhcHMgPT0gaV9jYXBzCgogICAgcHJpbnQoIm1hdGNoX2NhcHMgMTogdHJ1ZSIpCn0KbWF0Y2hfY2FwcyhwX2NhcHMsIGlfY2FwcykgewogICAgcHJpbnQoIm1hdGNoX2NhcHMgMjogc3RhcnQiKQoKICAgIGNvdW50KHBfY2FwcykgPT0gMQogICAgcF9jYXBzWzBdID09ICIkKGRlZmF1bHRfY2FwcykiCgogICAgcHJpbnQoIm1hdGNoX2NhcHMgMjogZGVmYXVsdF9jYXBzID0iLCBwb2xpY3lfZGF0YS5jb21tb24uZGVmYXVsdF9jYXBzKQogICAgcG9saWN5X2RhdGEuY29tbW9uLmRlZmF1bHRfY2FwcyA9PSBpX2NhcHMKCiAgICBwcmludCgibWF0Y2hfY2FwcyAyOiB0cnVlIikKfQptYXRjaF9jYXBzKHBfY2FwcywgaV9jYXBzKSB7CiAgICBwcmludCgibWF0Y2hfY2FwcyAzOiBzdGFydCIpCgogICAgY291bnQocF9jYXBzKSA9PSAxCiAgICBwX2NhcHNbMF0gPT0gIiQocHJpdmlsZWdlZF9jYXBzKSIKCiAgICBwcmludCgibWF0Y2hfY2FwcyAzOiBwcml2aWxlZ2VkX2NhcHMgPSIsIHBvbGljeV9kYXRhLmNvbW1vbi5wcml2aWxlZ2VkX2NhcHMpCiAgICBwb2xpY3lfZGF0YS5jb21tb24ucHJpdmlsZWdlZF9jYXBzID09IGlfY2FwcwoKICAgIHByaW50KCJtYXRjaF9jYXBzIDM6IHRydWUiKQp9CgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgpjaGVja19kaXJlY3RvcnlfdHJhdmVyc2FsKGlfcGF0aCkgewogICAgbm90IHJlZ2V4Lm1hdGNoKCIoXnwvKS4uKCR8LykiLCBpX3BhdGgpCn0KCmNoZWNrX3N5bWxpbmtfc291cmNlKGlfc3JjKSB7CiAgICBpX3NyYyA9PSAiIgogICAgcHJpbnQoImNoZWNrX3N5bWxpbmtfc291cmNlIDE6IHRydWUiKQp9CmNoZWNrX3N5bWxpbmtfc291cmNlKGlfc3JjKSB7CiAgICBpX3NyYyAhPSAiIgogICAgcHJpbnQoImNoZWNrX3N5bWxpbmtfc291cmNlIDI6IGlfc3JjID0iLCBpX3NyYykKCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24uc19zb3VyY2UxLCBpX3NyYykKCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMjogdHJ1ZSIpCn0KY2hlY2tfc3ltbGlua19zb3VyY2UoaV9zcmMpIHsKICAgIGlfc3JjICE9ICIiCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMzogaV9zcmMgPSIsIGlfc3JjKQoKICAgIHJlZ2V4Lm1hdGNoKHBvbGljeV9kYXRhLmNvbW1vbi5zX3NvdXJjZTIsIGlfc3JjKQogICAgY2hlY2tfZGlyZWN0b3J5X3RyYXZlcnNhbChpX3NyYykKCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMzogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfc3RvcmFnZXMoaV9zdG9yYWdlcykgewogICAgcHJpbnQoImFsbG93X3NhbmRib3hfc3RvcmFnZXM6IGlfc3RvcmFnZXMgPSIsIGlfc3RvcmFnZXMpCgogICAgcF9zdG9yYWdlcyA6PSBwb2xpY3lfZGF0YS5zYW5kYm94LnN0b3JhZ2VzCiAgICBldmVyeSBpX3N0b3JhZ2UgaW4gaV9zdG9yYWdlcyB7CiAgICAgICAgYWxsb3dfc2FuZGJveF9zdG9yYWdlKHBfc3RvcmFnZXMsIGlfc3RvcmFnZSkKICAgIH0KCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9zdG9yYWdlczogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfc3RvcmFnZShwX3N0b3JhZ2VzLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IGlfc3RvcmFnZSA9IiwgaV9zdG9yYWdlKQoKICAgIHNvbWUgcF9zdG9yYWdlIGluIHBfc3RvcmFnZXMKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IHBfc3RvcmFnZSA9IiwgcF9zdG9yYWdlKQogICAgaV9zdG9yYWdlID09IHBfc3RvcmFnZQoKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IHRydWUiKQp9CgpDb3B5RmlsZVJlcXVlc3QgewogICAgcHJpbnQoIkNvcHlGaWxlUmVxdWVzdDogaW5wdXQucGF0aCA9IiwgaW5wdXQucGF0aCkKCiAgICBjaGVja19zeW1saW5rX3NvdXJjZShpbnB1dC5zeW1saW5rX3NyYykKICAgIGNoZWNrX2RpcmVjdG9yeV90cmF2ZXJzYWwoaW5wdXQucGF0aCkKCiAgICBzb21lIHJlZ2V4MSBpbiBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLkNvcHlGaWxlUmVxdWVzdAogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5jcGF0aCkKICAgIHJlZ2V4NCA6PSByZXBsYWNlKHJlZ2V4MywgIiQoYnVuZGxlLWlkKSIsIEJVTkRMRV9JRCkKICAgIHByaW50KCJDb3B5RmlsZVJlcXVlc3Q6IHJlZ2V4NCA9IiwgcmVnZXg0KQoKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4NCwgaW5wdXQucGF0aCkKCiAgICBwcmludCgiQ29weUZpbGVSZXF1ZXN0OiB0cnVlIikKfQoKQ3JlYXRlU2FuZGJveFJlcXVlc3QgewogICAgcHJpbnQoIkNyZWF0ZVNhbmRib3hSZXF1ZXN0OiBpbnB1dC5ndWVzdF9ob29rX3BhdGggPSIsIGlucHV0Lmd1ZXN0X2hvb2tfcGF0aCkKICAgIGNvdW50KGlucHV0Lmd1ZXN0X2hvb2tfcGF0aCkgPT0gMAoKICAgIHByaW50KCJDcmVhdGVTYW5kYm94UmVxdWVzdDogaW5wdXQua2VybmVsX21vZHVsZXMgPSIsIGlucHV0Lmtlcm5lbF9tb2R1bGVzKQogICAgY291bnQoaW5wdXQua2VybmVsX21vZHVsZXMpID09IDAKCiAgICBpX3BpZG5zIDo9IGlucHV0LnNhbmRib3hfcGlkbnMKICAgIHByaW50KCJDcmVhdGVTYW5kYm94UmVxdWVzdDogaV9waWRucyA9IiwgaV9waWRucykKICAgIGlfcGlkbnMgPT0gZmFsc2UKICAgIGFsbG93X3NhbmRib3hfc3RvcmFnZXMoaW5wdXQuc3RvcmFnZXMpCn0KCmFsbG93X2V4ZWMocF9jb250YWluZXIsIGlfcHJvY2VzcykgewogICAgcHJpbnQoImFsbG93X2V4ZWM6IHN0YXJ0IikKCiAgICBwX29jaSA9IHBfY29udGFpbmVyLk9DSQogICAgcF9zX25hbWUgPSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc19uYW1lc3BhY2UgPSBnZXRfc3RhdGVfdmFsKCJuYW1lc3BhY2UiKQogICAgYWxsb3dfcHJvYmVfcHJvY2VzcyhwX29jaS5Qcm9jZXNzLCBpX3Byb2Nlc3MsIHBfc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfZXhlYzogdHJ1ZSIpCn0KCmFsbG93X2ludGVyYWN0aXZlX2V4ZWMocF9jb250YWluZXIsIGlfcHJvY2VzcykgewogICAgcHJpbnQoImFsbG93X2ludGVyYWN0aXZlX2V4ZWM6IHN0YXJ0IikKCiAgICBwX29jaSA9IHBfY29udGFpbmVyLk9DSQogICAgcF9zX25hbWUgPSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc19uYW1lc3BhY2UgPSBnZXRfc3RhdGVfdmFsKCJuYW1lc3BhY2UiKQogICAgYWxsb3dfaW50ZXJhY3RpdmVfcHJvY2VzcyhwX29jaS5Qcm9jZXNzLCBpX3Byb2Nlc3MsIHBfc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfaW50ZXJhY3RpdmVfZXhlYzogdHJ1ZSIpCn0KCiMgVE9ETzogc2hvdWxkIG90aGVyIEV4ZWNQcm9jZXNzUmVxdWVzdCBpbnB1dCBkYXRhIGZpZWxkcyBiZSB2YWxpZGF0ZWQgYXMgd2VsbD8KRXhlY1Byb2Nlc3NSZXF1ZXN0IHsKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMTogaW5wdXQgPSIsIGlucHV0KQoKICAgIHNvbWUgcF9jb21tYW5kIGluIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuRXhlY1Byb2Nlc3NSZXF1ZXN0LmFsbG93ZWRfY29tbWFuZHMKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMTogcF9jb21tYW5kID0iLCBwX2NvbW1hbmQpCiAgICBwX2NvbW1hbmQgPT0gaW5wdXQucHJvY2Vzcy5BcmdzCgogICAgIyBUT0RPOiBtYXRjaCBwX2NvbnRhaW5lcidzIElEIHdpdGggdGhlIGlucHV0IGNvbnRhaW5lcl9pZC4KICAgIHNvbWUgcF9jb250YWluZXIgaW4gcG9saWN5X2RhdGEuY29udGFpbmVycwogICAgYWxsb3dfaW50ZXJhY3RpdmVfZXhlYyhwX2NvbnRhaW5lciwgaW5wdXQucHJvY2VzcykKCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDE6IHRydWUiKQp9CkV4ZWNQcm9jZXNzUmVxdWVzdCB7CiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDI6IGlucHV0ID0iLCBpbnB1dCkKCiAgICAjIFRPRE86IG1hdGNoIGlucHV0IGNvbnRhaW5lciBJRCB3aXRoIGl0cyBjb3JyZXNwb25kaW5nIGNvbnRhaW5lci5leGVjX2NvbW1hbmRzLgogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBzb21lIHBfY29tbWFuZCBpbiBwX2NvbnRhaW5lci5leGVjX2NvbW1hbmRzCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDI6IHBfY29tbWFuZCA9IiwgcF9jb21tYW5kKQoKICAgICMgVE9ETzogc2hvdWxkIG90aGVyIGlucHV0IGRhdGEgZmllbGRzIGJlIHZhbGlkYXRlZCBhcyB3ZWxsPwogICAgcF9jb21tYW5kID09IGlucHV0LnByb2Nlc3MuQXJncwoKICAgIGFsbG93X2V4ZWMocF9jb250YWluZXIsIGlucHV0LnByb2Nlc3MpCgogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAyOiB0cnVlIikKfQpFeGVjUHJvY2Vzc1JlcXVlc3QgewogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAzOiBpbnB1dCA9IiwgaW5wdXQpCgogICAgaV9jb21tYW5kID0gY29uY2F0KCIgIiwgaW5wdXQucHJvY2Vzcy5BcmdzKQogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAzOiBpX2NvbW1hbmQgPSIsIGlfY29tbWFuZCkKCiAgICBzb21lIHBfcmVnZXggaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5FeGVjUHJvY2Vzc1JlcXVlc3QucmVnZXgKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMzogcF9yZWdleCA9IiwgcF9yZWdleCkKCiAgICByZWdleC5tYXRjaChwX3JlZ2V4LCBpX2NvbW1hbmQpCgogICAgIyBUT0RPOiBtYXRjaCBwX2NvbnRhaW5lcidzIElEIHdpdGggdGhlIGlucHV0IGNvbnRhaW5lcl9pZC4KICAgIHNvbWUgcF9jb250YWluZXIgaW4gcG9saWN5X2RhdGEuY29udGFpbmVycwogICAgYWxsb3dfaW50ZXJhY3RpdmVfZXhlYyhwX2NvbnRhaW5lciwgaW5wdXQucHJvY2VzcykKCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDM6IHRydWUiKQp9CgpVcGRhdGVSb3V0ZXNSZXF1ZXN0IHsKICAgIHByaW50KCJVcGRhdGVSb3V0ZXNSZXF1ZXN0OiBpbnB1dCA9IiwgaW5wdXQpCiAgICBwcmludCgiVXBkYXRlUm91dGVzUmVxdWVzdDogcG9saWN5ID0iLCBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLlVwZGF0ZVJvdXRlc1JlcXVlc3QpCgogICAgaV9yb3V0ZXMgOj0gaW5wdXQucm91dGVzLlJvdXRlcwogICAgcF9zb3VyY2VfcmVnZXggPSBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLlVwZGF0ZVJvdXRlc1JlcXVlc3QuZm9yYmlkZGVuX3NvdXJjZV9yZWdleAogICAgcF9uYW1lcyA9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuVXBkYXRlUm91dGVzUmVxdWVzdC5mb3JiaWRkZW5fZGV2aWNlX25hbWVzCgogICAgZXZlcnkgaV9yb3V0ZSBpbiBpX3JvdXRlcyB7CiAgICAgICAgcHJpbnQoImlfcm91dGUuc291cmNlID0iLCBpX3JvdXRlLnNvdXJjZSkKICAgICAgICBldmVyeSBwX3JlZ2V4IGluIHBfc291cmNlX3JlZ2V4IHsKICAgICAgICAgICAgcHJpbnQoInBfcmVnZXggPSIsIHBfcmVnZXgpCiAgICAgICAgICAgIG5vdCByZWdleC5tYXRjaChwX3JlZ2V4LCBpX3JvdXRlLnNvdXJjZSkKICAgICAgICB9CgogICAgICAgIHByaW50KCJpX3JvdXRlLmRldmljZSA9IiwgaV9yb3V0ZS5kZXZpY2UpCiAgICAgICAgbm90IGlfcm91dGUuZGV2aWNlIGluIHBfbmFtZXMKICAgIH0KCiAgICBwcmludCgiVXBkYXRlUm91dGVzUmVxdWVzdDogdHJ1ZSIpCn0KClVwZGF0ZUludGVyZmFjZVJlcXVlc3QgewogICAgcHJpbnQoIlVwZGF0ZUludGVyZmFjZVJlcXVlc3Q6IGlucHV0ID0iLCBpbnB1dCkKICAgIHByaW50KCJVcGRhdGVJbnRlcmZhY2VSZXF1ZXN0OiBwb2xpY3kgPSIsIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuVXBkYXRlSW50ZXJmYWNlUmVxdWVzdCkKCiAgICBpX2ludGVyZmFjZSA6PSBpbnB1dC5pbnRlcmZhY2UKICAgIHBfZmxhZ3MgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmFsbG93X3Jhd19mbGFncwoKICAgICMgVHlwaWNhbGx5LCBqdXN0IElGRl9OT0FSUCBpcyB1c2VkLgogICAgYml0cy5hbmQoaV9pbnRlcmZhY2UucmF3X2ZsYWdzLCBiaXRzLm5lZ2F0ZShwX2ZsYWdzKSkgPT0gMAoKICAgIHBfbmFtZXMgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmZvcmJpZGRlbl9uYW1lcwoKICAgIG5vdCBpX2ludGVyZmFjZS5uYW1lIGluIHBfbmFtZXMKCiAgICBwX2h3YWRkcnMgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmZvcmJpZGRlbl9od19hZGRycwoKICAgIG5vdCBpX2ludGVyZmFjZS5od0FkZHIgaW4gcF9od2FkZHJzCgogICAgcHJpbnQoIlVwZGF0ZUludGVyZmFjZVJlcXVlc3Q6IHRydWUiKQp9CgpDbG9zZVN0ZGluUmVxdWVzdCB7CiAgICBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLkNsb3NlU3RkaW5SZXF1ZXN0ID09IHRydWUKfQoKUmVhZFN0cmVhbVJlcXVlc3QgewogICAgcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5SZWFkU3RyZWFtUmVxdWVzdCA9PSB0cnVlCn0KClVwZGF0ZUVwaGVtZXJhbE1vdW50c1JlcXVlc3QgewogICAgcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVFcGhlbWVyYWxNb3VudHNSZXF1ZXN0ID09IHRydWUKfQoKV3JpdGVTdHJlYW1SZXF1ZXN0IHsKICAgIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuV3JpdGVTdHJlYW1SZXF1ZXN0ID09IHRydWUKfQoKcG9saWN5X2RhdGEgOj0gewogICJjb250YWluZXJzIjogWwogICAgewogICAgICAiT0NJIjogewogICAgICAgICJWZXJzaW9uIjogIjEuMS4wLXJjLjEiLAogICAgICAgICJQcm9jZXNzIjogewogICAgICAgICAgIlRlcm1pbmFsIjogZmFsc2UsCiAgICAgICAgICAiVXNlciI6IHsKICAgICAgICAgICAgIlVJRCI6IDEyMywKICAgICAgICAgICAgIkdJRCI6IDY1NTM1LAogICAgICAgICAgICAiQWRkaXRpb25hbEdpZHMiOiBbXSwKICAgICAgICAgICAgIlVzZXJuYW1lIjogIiIKICAgICAgICAgIH0sCiAgICAgICAgICAiRGVwcmVjYXRlZEFyZ3MiOiBbCiAgICAgICAgICAgICIvcGF1c2UiCiAgICAgICAgICBdLAogICAgICAgICAgIkFyZ3MiOiBbCiAgICAgICAgICAgICIvcGF1c2UiCiAgICAgICAgICBdLAogICAgICAgICAgIkVudiI6IFsKICAgICAgICAgICAgIlBBVEg9L3Vzci9sb2NhbC9zYmluOi91c3IvbG9jYWwvYmluOi91c3Ivc2JpbjovdXNyL2Jpbjovc2JpbjovYmluIgogICAgICAgICAgXSwKICAgICAgICAgICJDd2QiOiAiLyIsCiAgICAgICAgICAiQ2FwYWJpbGl0aWVzIjogewogICAgICAgICAgICAiQW1iaWVudCI6IFtdLAogICAgICAgICAgICAiQm91bmRpbmciOiBbCiAgICAgICAgICAgICAgIiQoZGVmYXVsdF9jYXBzKSIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgIkVmZmVjdGl2ZSI6IFsKICAgICAgICAgICAgICAiJChkZWZhdWx0X2NhcHMpIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiSW5oZXJpdGFibGUiOiBbXSwKICAgICAgICAgICAgIlBlcm1pdHRlZCI6IFsKICAgICAgICAgICAgICAiJChkZWZhdWx0X2NhcHMpIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgIk5vTmV3UHJpdmlsZWdlcyI6IHRydWUKICAgICAgICB9LAogICAgICAgICJSb290IjogewogICAgICAgICAgIlBhdGgiOiAiJChjcGF0aCkvJChidW5kbGUtaWQpIiwKICAgICAgICAgICJSZWFkb25seSI6IHRydWUKICAgICAgICB9LAogICAgICAgICJNb3VudHMiOiBbCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvcHJvYyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAicHJvYyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJwcm9jIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAgICAgIm5vZGV2IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2RldiIsCiAgICAgICAgICAgICJzb3VyY2UiOiAidG1wZnMiLAogICAgICAgICAgICAidHlwZV8iOiAidG1wZnMiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAic3RyaWN0YXRpbWUiLAogICAgICAgICAgICAgICJtb2RlPTc1NSIsCiAgICAgICAgICAgICAgInNpemU9NjU1MzZrIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi9wdHMiLAogICAgICAgICAgICAic291cmNlIjogImRldnB0cyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJkZXZwdHMiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibmV3aW5zdGFuY2UiLAogICAgICAgICAgICAgICJwdG14bW9kZT0wNjY2IiwKICAgICAgICAgICAgICAibW9kZT0wNjIwIiwKICAgICAgICAgICAgICAiZ2lkPTUiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L3NobSIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiL3J1bi9rYXRhLWNvbnRhaW5lcnMvc2FuZGJveC9zaG0iLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvbXF1ZXVlIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJtcXVldWUiLAogICAgICAgICAgICAidHlwZV8iOiAibXF1ZXVlIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAgICAgIm5vZGV2IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL3N5cyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAic3lzZnMiLAogICAgICAgICAgICAidHlwZV8iOiAic3lzZnMiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiLAogICAgICAgICAgICAgICJybyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9ldGMvcmVzb2x2LmNvbmYiLAogICAgICAgICAgICAic291cmNlIjogIiQoc2ZwcmVmaXgpcmVzb2x2LmNvbmYkIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJybyIsCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgIm5vZGV2IiwKICAgICAgICAgICAgICAibm9leGVjIgogICAgICAgICAgICBdCiAgICAgICAgICB9CiAgICAgICAgXSwKICAgICAgICAiQW5ub3RhdGlvbnMiOiB7CiAgICAgICAgICAiaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5idW5kbGVfcGF0aCI6ICIvcnVuL2NvbnRhaW5lcmQvaW8uY29udGFpbmVyZC5ydW50aW1lLnYyLnRhc2svazhzLmlvLyQoYnVuZGxlLWlkKSIsCiAgICAgICAgICAiaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5jb250YWluZXJfdHlwZSI6ICJwb2Rfc2FuZGJveCIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLXR5cGUiOiAic2FuZGJveCIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCI6ICJeW2EtejAtOV17NjR9JCIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1sb2ctZGlyZWN0b3J5IjogIl4vdmFyL2xvZy9wb2RzLyQoc2FuZGJveC1uYW1lc3BhY2UpXyQoc2FuZGJveC1uYW1lKV9bMC05YS1mXXs4fS1bMC05YS1mXXs0fS1bMC05YS1mXXs0fS1bMC05YS1mXXs0fS1bMC05YS1mXXsxMn0kIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LW5hbWVzcGFjZSI6ICIiLAogICAgICAgICAgIm5lcmRjdGwvbmV0d29yay1uYW1lc3BhY2UiOiAiXi92YXIvcnVuL25ldG5zL2NuaS1bMC05YS1mXXs4fS1bMC05YS1mXXs0fS1bMC05YS1mXXs0fS1bMC05YS1mXXs0fS1bMC05YS1mXXsxMn0kIgogICAgICAgIH0sCiAgICAgICAgIkxpbnV4IjogewogICAgICAgICAgIk5hbWVzcGFjZXMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiVHlwZSI6ICJpcGMiLAogICAgICAgICAgICAgICJQYXRoIjogIiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJUeXBlIjogInV0cyIsCiAgICAgICAgICAgICAgIlBhdGgiOiAiIgogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgIlR5cGUiOiAibW91bnQiLAogICAgICAgICAgICAgICJQYXRoIjogIiIKICAgICAgICAgICAgfQogICAgICAgICAgXSwKICAgICAgICAgICJNYXNrZWRQYXRocyI6IFsKICAgICAgICAgICAgIi9wcm9jL2FjcGkiLAogICAgICAgICAgICAiL3Byb2MvYXNvdW5kIiwKICAgICAgICAgICAgIi9wcm9jL2tjb3JlIiwKICAgICAgICAgICAgIi9wcm9jL2tleXMiLAogICAgICAgICAgICAiL3Byb2MvbGF0ZW5jeV9zdGF0cyIsCiAgICAgICAgICAgICIvcHJvYy90aW1lcl9saXN0IiwKICAgICAgICAgICAgIi9wcm9jL3RpbWVyX3N0YXRzIiwKICAgICAgICAgICAgIi9wcm9jL3NjaGVkX2RlYnVnIiwKICAgICAgICAgICAgIi9zeXMvZmlybXdhcmUiLAogICAgICAgICAgICAiL3Byb2Mvc2NzaSIKICAgICAgICAgIF0sCiAgICAgICAgICAiUmVhZG9ubHlQYXRocyI6IFsKICAgICAgICAgICAgIi9wcm9jL2J1cyIsCiAgICAgICAgICAgICIvcHJvYy9mcyIsCiAgICAgICAgICAgICIvcHJvYy9pcnEiLAogICAgICAgICAgICAiL3Byb2Mvc3lzIiwKICAgICAgICAgICAgIi9wcm9jL3N5c3JxLXRyaWdnZXIiCiAgICAgICAgICBdLAogICAgICAgICAgIkRldmljZXMiOiBbXSwKICAgICAgICAgICJTeXNjdGwiOiB7CiAgICAgICAgICAgICJuZXQuaXB2NC5pcF91bnByaXZpbGVnZWRfcG9ydF9zdGFydCI6ICIwIiwKICAgICAgICAgICAgIm5ldC5pcHY0LnBpbmdfZ3JvdXBfcmFuZ2UiOiAiMCAyMTQ3NDgzNjQ3IgogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSwKICAgICAgInN0b3JhZ2VzIjogWwogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2gwKSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjApIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAib3ZlcmxheWZzIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJmdXNlMy5rYXRhLW92ZXJsYXkiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICI1YTVhYWQ4MDA1NWZmMjAwMTJhNTBkYzI1ZjhkZjdhMjk5MjQ0NzQzMjRkNjVmN2Q1MzA2ZWU4ZWUyN2ZmNzFkIiwKICAgICAgICAgICAgIjgxNzI1MGYxYTNlMzM2ZGE3NmY1YmQzZmE3ODRlMWIyNmQ5NTliOWMxMzE4NzY4MTViYTI2MDQwNDhiNzBjMTgiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQoY3BhdGgpLyQoYnVuZGxlLWlkKSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfQogICAgICBdLAogICAgICAiZGV2aWNlcyI6IFtdLAogICAgICAic2FuZGJveF9waWRucyI6IGZhbHNlLAogICAgICAiZXhlY19jb21tYW5kcyI6IFtdLAogICAgICAiZW52X21hcCI6IHsKICAgICAgICAiUEFUSCI6ICIvdXNyL2xvY2FsL3NiaW46L3Vzci9sb2NhbC9iaW46L3Vzci9zYmluOi91c3IvYmluOi9zYmluOi9iaW4iCiAgICAgIH0KICAgIH0sCiAgICB7CiAgICAgICJPQ0kiOiB7CiAgICAgICAgIlZlcnNpb24iOiAiMS4xLjAtcmMuMSIsCiAgICAgICAgIlByb2Nlc3MiOiB7CiAgICAgICAgICAiVGVybWluYWwiOiBmYWxzZSwKICAgICAgICAgICJVc2VyIjogewogICAgICAgICAgICAiVUlEIjogMTIzLAogICAgICAgICAgICAiR0lEIjogMCwKICAgICAgICAgICAgIkFkZGl0aW9uYWxHaWRzIjogW10sCiAgICAgICAgICAgICJVc2VybmFtZSI6ICIiCiAgICAgICAgICB9LAogICAgICAgICAgIkRlcHJlY2F0ZWRBcmdzIjogWwogICAgICAgICAgICAic2giCiAgICAgICAgICBdLAogICAgICAgICAgIkFyZ3MiOiBbCiAgICAgICAgICAgICJzaCIKICAgICAgICAgIF0sCiAgICAgICAgICAiRW52IjogWwogICAgICAgICAgICAiUEFUSD0vdXNyL2xvY2FsL3NiaW46L3Vzci9sb2NhbC9iaW46L3Vzci9zYmluOi91c3IvYmluOi9zYmluOi9iaW4iLAogICAgICAgICAgICAiSE9TVE5BTUU9JChob3N0LW5hbWUpIiwKICAgICAgICAgICAgIkpPQl9DT01QTEVUSU9OX0lOREVYPSQodmFsaWRhdGUtZnJvbS1zZXR0aW5ncykiCiAgICAgICAgICBdLAogICAgICAgICAgIkN3ZCI6ICIvIiwKICAgICAgICAgICJDYXBhYmlsaXRpZXMiOiB7CiAgICAgICAgICAgICJBbWJpZW50IjogW10sCiAgICAgICAgICAgICJCb3VuZGluZyI6IFsKICAgICAgICAgICAgICAiJChkZWZhdWx0X2NhcHMpIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiRWZmZWN0aXZlIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJJbmhlcml0YWJsZSI6IFtdLAogICAgICAgICAgICAiUGVybWl0dGVkIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICAiTm9OZXdQcml2aWxlZ2VzIjogZmFsc2UKICAgICAgICB9LAogICAgICAgICJSb290IjogewogICAgICAgICAgIlBhdGgiOiAiJChjcGF0aCkvJChidW5kbGUtaWQpIiwKICAgICAgICAgICJSZWFkb25seSI6IGZhbHNlCiAgICAgICAgfSwKICAgICAgICAiTW91bnRzIjogWwogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL3Byb2MiLAogICAgICAgICAgICAic291cmNlIjogInByb2MiLAogICAgICAgICAgICAidHlwZV8iOiAicHJvYyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYiLAogICAgICAgICAgICAic291cmNlIjogInRtcGZzIiwKICAgICAgICAgICAgInR5cGVfIjogInRtcGZzIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgInN0cmljdGF0aW1lIiwKICAgICAgICAgICAgICAibW9kZT03NTUiLAogICAgICAgICAgICAgICJzaXplPTY1NTM2ayIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvcHRzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJkZXZwdHMiLAogICAgICAgICAgICAidHlwZV8iOiAiZGV2cHRzIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAgICAgIm5ld2luc3RhbmNlIiwKICAgICAgICAgICAgICAicHRteG1vZGU9MDY2NiIsCiAgICAgICAgICAgICAgIm1vZGU9MDYyMCIsCiAgICAgICAgICAgICAgImdpZD01IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi9zaG0iLAogICAgICAgICAgICAic291cmNlIjogIi9ydW4va2F0YS1jb250YWluZXJzL3NhbmRib3gvc2htIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L21xdWV1ZSIsCiAgICAgICAgICAgICJzb3VyY2UiOiAibXF1ZXVlIiwKICAgICAgICAgICAgInR5cGVfIjogIm1xdWV1ZSIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9zeXMiLAogICAgICAgICAgICAic291cmNlIjogInN5c2ZzIiwKICAgICAgICAgICAgInR5cGVfIjogInN5c2ZzIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAgICAgIm5vZGV2IiwKICAgICAgICAgICAgICAicm8iCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvc3lzL2ZzL2Nncm91cCIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiY2dyb3VwIiwKICAgICAgICAgICAgInR5cGVfIjogImNncm91cCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIsCiAgICAgICAgICAgICAgInJlbGF0aW1lIiwKICAgICAgICAgICAgICAicm8iCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZXRjL2hvc3RzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KWhvc3RzJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJydyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvdGVybWluYXRpb24tbG9nIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KXRlcm1pbmF0aW9uLWxvZyQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicnciCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZXRjL2hvc3RuYW1lIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KWhvc3RuYW1lJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJydyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9ldGMvcmVzb2x2LmNvbmYiLAogICAgICAgICAgICAic291cmNlIjogIiQoc2ZwcmVmaXgpcmVzb2x2LmNvbmYkIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJ3IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL3Zhci9ydW4vc2VjcmV0cy9rdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50IiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KXNlcnZpY2VhY2NvdW50JCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJybyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi92YXIvcnVuL3NlY3JldHMvYXp1cmUvdG9rZW5zIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KXRva2VucyQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicm8iCiAgICAgICAgICAgIF0KICAgICAgICAgIH0KICAgICAgICBdLAogICAgICAgICJBbm5vdGF0aW9ucyI6IHsKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmJ1bmRsZV9wYXRoIjogIi9ydW4vY29udGFpbmVyZC9pby5jb250YWluZXJkLnJ1bnRpbWUudjIudGFzay9rOHMuaW8vJChidW5kbGUtaWQpIiwKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIjogInBvZF9jb250YWluZXIiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLmNvbnRhaW5lci1uYW1lIjogInNoIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSI6ICJjb250YWluZXIiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLmltYWdlLW5hbWUiOiAicmVnaXN0cnkuazhzLmlvL2UyZS10ZXN0LWltYWdlcy9idXN5Ym94OjEuMjktMiIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCI6ICJeW2EtejAtOV17NjR9JCIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1uYW1lc3BhY2UiOiAiIgogICAgICAgIH0sCiAgICAgICAgIkxpbnV4IjogewogICAgICAgICAgIk5hbWVzcGFjZXMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiVHlwZSI6ICJpcGMiLAogICAgICAgICAgICAgICJQYXRoIjogIiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJUeXBlIjogInV0cyIsCiAgICAgICAgICAgICAgIlBhdGgiOiAiIgogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgIlR5cGUiOiAibW91bnQiLAogICAgICAgICAgICAgICJQYXRoIjogIiIKICAgICAgICAgICAgfQogICAgICAgICAgXSwKICAgICAgICAgICJNYXNrZWRQYXRocyI6IFsKICAgICAgICAgICAgIi9wcm9jL2FjcGkiLAogICAgICAgICAgICAiL3Byb2Mva2NvcmUiLAogICAgICAgICAgICAiL3Byb2Mva2V5cyIsCiAgICAgICAgICAgICIvcHJvYy9sYXRlbmN5X3N0YXRzIiwKICAgICAgICAgICAgIi9wcm9jL3RpbWVyX2xpc3QiLAogICAgICAgICAgICAiL3Byb2MvdGltZXJfc3RhdHMiLAogICAgICAgICAgICAiL3Byb2Mvc2NoZWRfZGVidWciLAogICAgICAgICAgICAiL3Byb2Mvc2NzaSIsCiAgICAgICAgICAgICIvc3lzL2Zpcm13YXJlIgogICAgICAgICAgXSwKICAgICAgICAgICJSZWFkb25seVBhdGhzIjogWwogICAgICAgICAgICAiL3Byb2MvYXNvdW5kIiwKICAgICAgICAgICAgIi9wcm9jL2J1cyIsCiAgICAgICAgICAgICIvcHJvYy9mcyIsCiAgICAgICAgICAgICIvcHJvYy9pcnEiLAogICAgICAgICAgICAiL3Byb2Mvc3lzIiwKICAgICAgICAgICAgIi9wcm9jL3N5c3JxLXRyaWdnZXIiCiAgICAgICAgICBdLAogICAgICAgICAgIkRldmljZXMiOiBbXSwKICAgICAgICAgICJTeXNjdGwiOiB7CiAgICAgICAgICAgICJuZXQuaXB2NC5pcF91bnByaXZpbGVnZWRfcG9ydF9zdGFydCI6ICIwIiwKICAgICAgICAgICAgIm5ldC5pcHY0LnBpbmdfZ3JvdXBfcmFuZ2UiOiAiMCAyMTQ3NDgzNjQ3IgogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSwKICAgICAgInN0b3JhZ2VzIjogWwogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2gwKSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjApIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAib3ZlcmxheWZzIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJmdXNlMy5rYXRhLW92ZXJsYXkiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICI0ZDA2NTNmN2M3ZTNmNDliNDkwMDZhOWY0ZTgxM2FhMTE2NmM1MzJhMzRhNzY1MGFmYTZmYWE1MjI2ZjFlYzVmIiwKICAgICAgICAgICAgImJkNWJiMzg3MDlkMjk0M2EzNmEwMmU0NTRlMzRkM2Q2Y2FhMjM4NWZiMTQwZDdmMTc5N2ZkMGEyN2E5MzdkZGIiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQoY3BhdGgpLyQoYnVuZGxlLWlkKSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfQogICAgICBdLAogICAgICAiZGV2aWNlcyI6IFtdLAogICAgICAic2FuZGJveF9waWRucyI6IGZhbHNlLAogICAgICAiZXhlY19jb21tYW5kcyI6IFtdLAogICAgICAiZW52X21hcCI6IHsKICAgICAgICAiSE9TVE5BTUUiOiAiJChob3N0LW5hbWUpIiwKICAgICAgICAiSk9CX0NPTVBMRVRJT05fSU5ERVgiOiAiJCh2YWxpZGF0ZS1mcm9tLXNldHRpbmdzKSIsCiAgICAgICAgIlBBVEgiOiAiL3Vzci9sb2NhbC9zYmluOi91c3IvbG9jYWwvYmluOi91c3Ivc2JpbjovdXNyL2Jpbjovc2JpbjovYmluIgogICAgICB9CiAgICB9CiAgXSwKICAiY29tbW9uIjogewogICAgImNwYXRoIjogIi9ydW4va2F0YS1jb250YWluZXJzL3NoYXJlZC9jb250YWluZXJzIiwKICAgICJtb3VudF9zb3VyY2VfY3BhdGgiOiAiL3J1bi9rYXRhLWNvbnRhaW5lcnMvc2hhcmVkL2NvbnRhaW5lcnMiLAogICAgInNmcHJlZml4IjogIl4kKGNwYXRoKS8kKGJ1bmRsZS1pZCktW2EtejAtOV17MTZ9LSIsCiAgICAic3BhdGgiOiAiL3J1bi9rYXRhLWNvbnRhaW5lcnMvc2FuZGJveC9zdG9yYWdlIiwKICAgICJpcHY0X2EiOiAiKChbMC05XXxbMS05XVswLTldfDFbMC05XXsyfXwyWzAtNF1bMC05XXwyNVswLTVdKVxcLil7M30oWzAtOV18WzEtOV1bMC05XXwxWzAtOV17Mn18MlswLTRdWzAtOV18MjVbMC01XSkiLAogICAgImlwX3AiOiAiWzAtOV17MSw1fSIsCiAgICAic3ZjX25hbWUiOiAiW0EtWl9cXC5cXC1dKyIsCiAgICAiZG5zX2xhYmVsIjogIlthLXpBLVowLTlfXFwuXFwtXSsiLAogICAgInNfc291cmNlMSI6ICJeLi4yWzAtOV17M31fWzAtMV1bMC05XV9bMC0zXVswLTldX1swLTJdWzAtOV1fWzAtNV1bMC05XV9bMC01XVswLTldXFwuWzAtOV17MSwxMH0kIiwKICAgICJzX3NvdXJjZTIiOiAiXi4uZGF0YS8iLAogICAgImRuc19zdWJkb21haW4iOiAiXlthLXowLTldKFstYS16MC05XSpbYS16MC05XSk/JCIsCiAgICAicG9kX3VpZCI6ICJeWzAtOWEtZkEtRl17OH0tWzAtOWEtZkEtRl17NH0tWzAtOWEtZkEtRl17NH0tWzAtOWEtZkEtRl17NH0tWzAtOWEtZkEtRl17MTJ9JCIsCiAgICAiZGVmYXVsdF9jYXBzIjogWwogICAgICAiQ0FQX0NIT1dOIiwKICAgICAgIkNBUF9EQUNfT1ZFUlJJREUiLAogICAgICAiQ0FQX0ZTRVRJRCIsCiAgICAgICJDQVBfRk9XTkVSIiwKICAgICAgIkNBUF9NS05PRCIsCiAgICAgICJDQVBfTkVUX1JBVyIsCiAgICAgICJDQVBfU0VUR0lEIiwKICAgICAgIkNBUF9TRVRVSUQiLAogICAgICAiQ0FQX1NFVEZDQVAiLAogICAgICAiQ0FQX1NFVFBDQVAiLAogICAgICAiQ0FQX05FVF9CSU5EX1NFUlZJQ0UiLAogICAgICAiQ0FQX1NZU19DSFJPT1QiLAogICAgICAiQ0FQX0tJTEwiLAogICAgICAiQ0FQX0FVRElUX1dSSVRFIgogICAgXSwKICAgICJwcml2aWxlZ2VkX2NhcHMiOiBbCiAgICAgICJDQVBfQ0hPV04iLAogICAgICAiQ0FQX0RBQ19PVkVSUklERSIsCiAgICAgICJDQVBfREFDX1JFQURfU0VBUkNIIiwKICAgICAgIkNBUF9GT1dORVIiLAogICAgICAiQ0FQX0ZTRVRJRCIsCiAgICAgICJDQVBfS0lMTCIsCiAgICAgICJDQVBfU0VUR0lEIiwKICAgICAgIkNBUF9TRVRVSUQiLAogICAgICAiQ0FQX1NFVFBDQVAiLAogICAgICAiQ0FQX0xJTlVYX0lNTVVUQUJMRSIsCiAgICAgICJDQVBfTkVUX0JJTkRfU0VSVklDRSIsCiAgICAgICJDQVBfTkVUX0JST0FEQ0FTVCIsCiAgICAgICJDQVBfTkVUX0FETUlOIiwKICAgICAgIkNBUF9ORVRfUkFXIiwKICAgICAgIkNBUF9JUENfTE9DSyIsCiAgICAgICJDQVBfSVBDX09XTkVSIiwKICAgICAgIkNBUF9TWVNfTU9EVUxFIiwKICAgICAgIkNBUF9TWVNfUkFXSU8iLAogICAgICAiQ0FQX1NZU19DSFJPT1QiLAogICAgICAiQ0FQX1NZU19QVFJBQ0UiLAogICAgICAiQ0FQX1NZU19QQUNDVCIsCiAgICAgICJDQVBfU1lTX0FETUlOIiwKICAgICAgIkNBUF9TWVNfQk9PVCIsCiAgICAgICJDQVBfU1lTX05JQ0UiLAogICAgICAiQ0FQX1NZU19SRVNPVVJDRSIsCiAgICAgICJDQVBfU1lTX1RJTUUiLAogICAgICAiQ0FQX1NZU19UVFlfQ09ORklHIiwKICAgICAgIkNBUF9NS05PRCIsCiAgICAgICJDQVBfTEVBU0UiLAogICAgICAiQ0FQX0FVRElUX1dSSVRFIiwKICAgICAgIkNBUF9BVURJVF9DT05UUk9MIiwKICAgICAgIkNBUF9TRVRGQ0FQIiwKICAgICAgIkNBUF9NQUNfT1ZFUlJJREUiLAogICAgICAiQ0FQX01BQ19BRE1JTiIsCiAgICAgICJDQVBfU1lTTE9HIiwKICAgICAgIkNBUF9XQUtFX0FMQVJNIiwKICAgICAgIkNBUF9CTE9DS19TVVNQRU5EIiwKICAgICAgIkNBUF9BVURJVF9SRUFEIiwKICAgICAgIkNBUF9QRVJGTU9OIiwKICAgICAgIkNBUF9CUEYiLAogICAgICAiQ0FQX0NIRUNLUE9JTlRfUkVTVE9SRSIKICAgIF0sCiAgICAidmlydGlvX2Jsa19zdG9yYWdlX2NsYXNzZXMiOiBbCiAgICAgICJjYy1sb2NhbC1jc2kiLAogICAgICAiY2MtbWFuYWdlZC1jc2kiLAogICAgICAiY2MtbWFuYWdlZC1wcmVtaXVtLWNzaSIKICAgIF0sCiAgICAic21iX3N0b3JhZ2VfY2xhc3NlcyI6IFsKICAgICAgewogICAgICAgICJuYW1lIjogImF6dXJlZmlsZS1jc2kta2F0YS1jYyIsCiAgICAgICAgIm1vdW50X29wdGlvbnMiOiBbCiAgICAgICAgICAiZGlyX21vZGU9MDc3NyIsCiAgICAgICAgICAiZmlsZV9tb2RlPTA3NzciLAogICAgICAgICAgIm1mc3ltbGlua3MiLAogICAgICAgICAgImNhY2hlPXN0cmljdCIsCiAgICAgICAgICAibm9zaGFyZXNvY2siLAogICAgICAgICAgImFjdGltZW89MzAiLAogICAgICAgICAgIm5vYnJsIgogICAgICAgIF0KICAgICAgfQogICAgXQogIH0sCiAgInNhbmRib3giOiB7CiAgICAic3RvcmFnZXMiOiBbCiAgICAgIHsKICAgICAgICAiZHJpdmVyIjogImVwaGVtZXJhbCIsCiAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgInNvdXJjZSI6ICJzaG0iLAogICAgICAgICJmc3R5cGUiOiAidG1wZnMiLAogICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICJub2RldiIsCiAgICAgICAgICAibW9kZT0xNzc3IiwKICAgICAgICAgICJzaXplPTY3MTA4ODY0IgogICAgICAgIF0sCiAgICAgICAgIm1vdW50X3BvaW50IjogIi9ydW4va2F0YS1jb250YWluZXJzL3NhbmRib3gvc2htIiwKICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgIH0KICAgIF0KICB9LAogICJyZXF1ZXN0X2RlZmF1bHRzIjogewogICAgIkNyZWF0ZUNvbnRhaW5lclJlcXVlc3QiOiB7CiAgICAgICJhbGxvd19lbnZfcmVnZXgiOiBbCiAgICAgICAgIl5IT1NUTkFNRT0kKGRuc19sYWJlbCkkIiwKICAgICAgICAiXiQoc3ZjX25hbWUpX1BPUlRfJChpcF9wKV9UQ1A9dGNwOi8vJChpcHY0X2EpOiQoaXBfcCkkIiwKICAgICAgICAiXiQoc3ZjX25hbWUpX1BPUlRfJChpcF9wKV9UQ1BfUFJPVE89dGNwJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9QT1JUXyQoaXBfcClfVENQX1BPUlQ9JChpcF9wKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfUE9SVF8kKGlwX3ApX1RDUF9BRERSPSQoaXB2NF9hKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfU0VSVklDRV9IT1NUPSQoaXB2NF9hKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfU0VSVklDRV9QT1JUPSQoaXBfcCkkIiwKICAgICAgICAiXiQoc3ZjX25hbWUpX1NFUlZJQ0VfUE9SVF8kKGRuc19sYWJlbCk9JChpcF9wKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfUE9SVD10Y3A6Ly8kKGlwdjRfYSk6JChpcF9wKSQiLAogICAgICAgICJeQVpVUkVfQ0xJRU5UX0lEPVtBLUZhLWYwLTktXSokIiwKICAgICAgICAiXkFaVVJFX1RFTkFOVF9JRD1bQS1GYS1mMC05LV0qJCIsCiAgICAgICAgIl5BWlVSRV9GRURFUkFURURfVE9LRU5fRklMRT0vdmFyL3J1bi9zZWNyZXRzL2F6dXJlL3Rva2Vucy9henVyZS1pZGVudGl0eS10b2tlbiQiLAogICAgICAgICJeQVpVUkVfQVVUSE9SSVRZX0hPU1Q9aHR0cHM6Ly9sb2dpblxcLm1pY3Jvc29mdG9ubGluZVxcLmNvbS8kIiwKICAgICAgICAiXlRFUk09eHRlcm0kIgogICAgICBdLAogICAgICAiYWxsb3dfZW52X3JlZ2V4X21hcCI6IHsKICAgICAgICAiQ1BVX0xJTUlUIjogIl5bMC05XSskIiwKICAgICAgICAiSk9CX0NPTVBMRVRJT05fSU5ERVgiOiAiXlswLTldKiQiLAogICAgICAgICJNRU1PUllfTElNSVQiOiAiXlswLTldKyQiCiAgICAgIH0KICAgIH0sCiAgICAiQ29weUZpbGVSZXF1ZXN0IjogWwogICAgICAiJChzZnByZWZpeCkiCiAgICBdLAogICAgIkV4ZWNQcm9jZXNzUmVxdWVzdCI6IHsKICAgICAgImFsbG93ZWRfY29tbWFuZHMiOiBbXSwKICAgICAgInJlZ2V4IjogW10KICAgIH0sCiAgICAiVXBkYXRlUm91dGVzUmVxdWVzdCI6IHsKICAgICAgImZvcmJpZGRlbl9kZXZpY2VfbmFtZXMiOiBbCiAgICAgICAgImxvIgogICAgICBdLAogICAgICAiZm9yYmlkZGVuX3NvdXJjZV9yZWdleCI6IFsKICAgICAgICAiXig/OjB7MCw0fTopezAsN30wezAsM30xJCIsCiAgICAgICAgIl4xMjdcXC4oPzpbMC05XXsxLDN9XFwuKXsyfVswLTldezEsM30kIgogICAgICBdCiAgICB9LAogICAgIlVwZGF0ZUludGVyZmFjZVJlcXVlc3QiOiB7CiAgICAgICJhbGxvd19yYXdfZmxhZ3MiOiAxMjgsCiAgICAgICJmb3JiaWRkZW5fbmFtZXMiOiBbCiAgICAgICAgImxvIgogICAgICBdLAogICAgICAiZm9yYmlkZGVuX2h3X2FkZHJzIjogWwogICAgICAgICIwMDowMDowMDowMDowMDowMCIKICAgICAgXQogICAgfSwKICAgICJDbG9zZVN0ZGluUmVxdWVzdCI6IGZhbHNlLAogICAgIlJlYWRTdHJlYW1SZXF1ZXN0IjogZmFsc2UsCiAgICAiVXBkYXRlRXBoZW1lcmFsTW91bnRzUmVxdWVzdCI6IGZhbHNlLAogICAgIldyaXRlU3RyZWFtUmVxdWVzdCI6IGZhbHNlCiAgfQp9 + spec: + restartPolicy: Never + runtimeClassName: kata-cc + securityContext: + runAsUser: 123 + containers: + - name: sh + image: "registry.k8s.io/e2e-test-images/busybox:1.29-2" + command: + - sh + env: + - name: JOB_COMPLETION_INDEX + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: "metadata.annotations['batch.kubernetes.io/job-completion-index']" + backoffLimit: 4 diff --git a/src/agent/samples/policy/yaml/job/test-job2.yaml b/src/agent/samples/policy/yaml/job/test-job2.yaml new file mode 100644 index 000000000000..93a9fd8746a6 --- /dev/null +++ b/src/agent/samples/policy/yaml/job/test-job2.yaml @@ -0,0 +1,20 @@ +--- +apiVersion: batch/v1 +kind: Job +metadata: + generateName: test-job2- +spec: + template: + metadata: + name: foo2 + annotations: + io.katacontainers.config.agent.policy: IyBDb3B5cmlnaHQgKGMpIDIwMjMgTWljcm9zb2Z0IENvcnBvcmF0aW9uCiMKIyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMAojCnBhY2thZ2UgYWdlbnRfcG9saWN5CgppbXBvcnQgZnV0dXJlLmtleXdvcmRzLmluCmltcG9ydCBmdXR1cmUua2V5d29yZHMuZXZlcnkKCiMgRGVmYXVsdCB2YWx1ZXMsIHJldHVybmVkIGJ5IE9QQSB3aGVuIHJ1bGVzIGNhbm5vdCBiZSBldmFsdWF0ZWQgdG8gdHJ1ZS4KZGVmYXVsdCBBZGRBUlBOZWlnaGJvcnNSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgQWRkU3dhcFJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBDbG9zZVN0ZGluUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IENvcHlGaWxlUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IENyZWF0ZUNvbnRhaW5lclJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBDcmVhdGVTYW5kYm94UmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IERlc3Ryb3lTYW5kYm94UmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgRXhlY1Byb2Nlc3NSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgR2V0T09NRXZlbnRSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBHdWVzdERldGFpbHNSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBMaXN0SW50ZXJmYWNlc1JlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBMaXN0Um91dGVzUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IE1lbUhvdHBsdWdCeVByb2JlUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IE9ubGluZUNQVU1lbVJlcXVlc3QgOj0gdHJ1ZQpkZWZhdWx0IFBhdXNlQ29udGFpbmVyUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFJlYWRTdHJlYW1SZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgUmVtb3ZlQ29udGFpbmVyUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgUmVtb3ZlU3RhbGVWaXJ0aW9mc1NoYXJlTW91bnRzUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgUmVzZWVkUmFuZG9tRGV2UmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFJlc3VtZUNvbnRhaW5lclJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBTZXRHdWVzdERhdGVUaW1lUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFNldFBvbGljeVJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBTaWduYWxQcm9jZXNzUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgU3RhcnRDb250YWluZXJSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBTdGFydFRyYWNpbmdSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgU3RhdHNDb250YWluZXJSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBTdG9wVHJhY2luZ1JlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBUdHlXaW5SZXNpemVSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBVcGRhdGVDb250YWluZXJSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgVXBkYXRlRXBoZW1lcmFsTW91bnRzUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFVwZGF0ZUludGVyZmFjZVJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBVcGRhdGVSb3V0ZXNSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgV2FpdFByb2Nlc3NSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBXcml0ZVN0cmVhbVJlcXVlc3QgOj0gZmFsc2UKCiMgQWxsb3dSZXF1ZXN0c0ZhaWxpbmdQb2xpY3kgOj0gdHJ1ZSBjb25maWd1cmVzIHRoZSBBZ2VudCB0byAqYWxsb3cgYW55CiMgcmVxdWVzdHMgY2F1c2luZyBhIHBvbGljeSBmYWlsdXJlKi4gVGhpcyBpcyBhbiB1bnNlY3VyZSBjb25maWd1cmF0aW9uCiMgYnV0IGlzIHVzZWZ1bCBmb3IgYWxsb3dpbmcgdW5zZWN1cmUgcG9kcyB0byBzdGFydCwgdGhlbiBjb25uZWN0IHRvCiMgdGhlbSBhbmQgaW5zcGVjdCBPUEEgbG9ncyBmb3IgdGhlIHJvb3QgY2F1c2Ugb2YgYSBmYWlsdXJlLgpkZWZhdWx0IEFsbG93UmVxdWVzdHNGYWlsaW5nUG9saWN5IDo9IGZhbHNlCgojIENvbnN0YW50cwpTX05BTUVfS0VZID0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZSIKU19OQU1FU1BBQ0VfS0VZID0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZXNwYWNlIgpCVU5ETEVfSUQgPSAiW2EtejAtOV17NjR9IgoKQ3JlYXRlQ29udGFpbmVyUmVxdWVzdDo9IHJlc3AgewogICAgbm90IGlzX251bGwoaW5wdXQuZW52X21hcCkKICAgIAogICAgaV9lbnZfbWFwIDo9IGlucHV0LmVudl9tYXAKICAgIAogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBwX2Vudl9tYXAgOj0gcF9jb250YWluZXIuZW52X21hcCAgCiAgICBhbGxvd19lbnZfbWFwKHBfZW52X21hcCwgaV9lbnZfbWFwKQogICAgCiAgICBpX3Byb2Nlc3MgOj0gaW5wdXQuYmFzZS5PQ0kuUHJvY2VzcwogICAgCiAgICBwX3Byb2Nlc3MgOj0gcF9jb250YWluZXIuT0NJLlByb2Nlc3MKICAgIAogICAgYWxsb3dfYXJncyhpX3Byb2Nlc3MsIHBfcHJvY2VzcywgaV9lbnZfbWFwKQoKICAgIHJlc3AgPSBDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uKGlucHV0LmJhc2UpCiAgICBwcmludCgiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdDogdHJ1ZSIpCn0KCmFsbG93X2FyZ3MoaV9wcm9jZXNzLCBwX3Byb2Nlc3MsIGlfZW52X21hcCkgewogICAgaV9hcmdzIDo9IGlfcHJvY2Vzcy5BcmdzCiAgICBwX2FyZ3MgOj0gcF9wcm9jZXNzLkFyZ3MKICAgIHByaW50KCJhbGxvd19hcmdzOiBpX2FyZ3MgPSIsIGlfYXJncywgInBfYXJncyA9IiwgcF9hcmdzKQogICAgY291bnQoaV9hcmdzKSA9PSBjb3VudChwX2FyZ3MpCiAgICBldmVyeSBpLCBpX2FyZyBpbiBpX2FyZ3MgewogICAgICAgIHByaW50KCJhbGxvd19hcmdzOiBpX2FyZyA9IiwgaV9hcmcpCiAgICAgICAgcF9hcmdfcmVwbGFjZWQgOj0gcmVwbGFjZV9lbnZfdmFyaWFibGVzKHBfYXJnc1tpXSwgaV9lbnZfbWFwKQogICAgICAgIHByaW50KCJhbGxvd19hcmdzOiBwX2FyZ19yZXBsYWNlZCA9IiwgcF9hcmdfcmVwbGFjZWQpCiAgICAgICAgcF9hcmdfcmVwbGFjZWQyIDo9IHJlcGxhY2UocF9hcmdfcmVwbGFjZWQsICIkJCIsICIkIikKICAgICAgICBwcmludCgiYWxsb3dfYXJnczogcF9hcmdfcmVwbGFjZWQyID0iLCBwX2FyZ19yZXBsYWNlZDIpCiAgICAgICAgaV9hcmcgPT0gcF9hcmdfcmVwbGFjZWQyCiAgICB9CiAgICBwcmludCgiYWxsb3dfYXJnczogdHJ1ZSIpCn0KCmFsbG93X2FyZ3MoaV9wcm9jZXNzLCBwX3Byb2Nlc3MsIGlfZW52X21hcCkgewogICAgbm90IGlfcHJvY2Vzcy5BcmdzCiAgICBub3QgcF9wcm9jZXNzLkFyZ3MKICAgIHByaW50KCJhbGxvd19hcmdzMjogbm8gYXJncyIpCn0KCiMgdGhpcyBmdW5jdGlvbiByZXBsYWNlcyBhbGwgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyBpbiBhIHN0cmluZywgZ2l2ZW4gYSBtYXAgb2YgZW52aXJvbm1lbnQga2V5cyB0byBlbnZpcm9ubWVudCB2YWx1ZXMKIyBlZyBzdHIgPSAiZWNobyAkKENMVVNURVJfSUQpOyBlY2hvICQoTk9ERV9OQU1FKTsiCiMgZW52X21hcCA9IHsiQ0xVU1RFUl9JRCI6ICJhYmMiLCAiTk9ERV9OQU1FIiA6ICJ4eXoifQojIHJlc3VsdCA9ICJlY2hvIGFiYzsgZWNobyB4eXo7IgpyZXBsYWNlX2Vudl92YXJpYWJsZXMoc3RyLCBlbnZfbWFwKSA9IHJlc3VsdCB7CiAgICAjIG1ha2UgYW4gYXJyYXkgb2YgdGhlIGtleXMgZWcgWyJDTFVTVEVSX0lEIiwgIk5PREVfTkFNRSJdCiAgICBrZXlzIDo9IFt4IHwgc29tZSB4IGluIG9iamVjdC5rZXlzKGVudl9tYXApXQogICAgcmVzdWx0IDo9IHJlcGxhY2Vfc3RyX3JlYyhzdHIsIGVudl9tYXAsIGtleXMsIGNvdW50KGtleXMpIC0gMSkKfQoKIyBiYXNlIGNhc2UKcmVwbGFjZV9zdHJfcmVjKHN0ciwgZW52X21hcCwgYXJyX2tleXMsIGkpID0gcmVzdWx0IHsKICAgIGkgPCAwCiAgICByZXN1bHQgOj0gc3RyCn0KCiMgcmVjdXJzaXZlIHN0ZXAKcmVwbGFjZV9zdHJfcmVjKHN0ciwgZW52X21hcCwgYXJyX2tleXMsIGkpID0gcmVzdWx0IHsKICAgIGkgPj0gMAogICAga2V5IDo9IGFycl9rZXlzW2ldCiAgICBlbnZfa2V5MSA6PSBjb25jYXQoIiIsIFsiJCgiLCBrZXksICIpIl0pCiAgICAjIHJlcGxhY2UgJChWQVIpIHdpdGggdmFsdWUKICAgIG5ld19zdHIxIDo9IHJlcGxhY2Uoc3RyLCBlbnZfa2V5MSwgZW52X21hcFtrZXldKQogICAgIyByZXBsYWNlIG5leHQgZW52aXJvbm1lbnQgdmFyaWFibGUKICAgIHJlc3VsdCA9IHJlcGxhY2Vfc3RyX3JlYyhuZXdfc3RyMSwgZW52X21hcCwgYXJyX2tleXMsIGkgLSAxKQp9CgphbGxvd19lbnZfbWFwKHBfZW52X21hcCwgaV9lbnZfbWFwKSB7CiAgICBwcmludCgiYWxsb3dfZW52X21hcDogcF9lbnZfbWFwID0iLCBwX2Vudl9tYXApCiAgICBldmVyeSBlbnZfa2V5LCBlbnZfdmFsIGluIGlfZW52X21hcCB7CiAgICAgICAgcHJpbnQoImFsbG93X2VudjogZW52X2tleSA9IiwgZW52X2tleSwgImVudl92YWwgPSIsIGVudl92YWwpCiAgICAgICAgYWxsb3dfZW52X21hcF9lbnRyeShlbnZfa2V5LCBlbnZfdmFsLCBwX2Vudl9tYXApCiAgICB9CiAgICBwcmludCgiYWxsb3dfZW52X21hcDogdHJ1ZSIpCn0KCiMgQWxsb3cgZXhhY3QgbWF0Y2gKYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBpX3ZhbCA9PSBwX3ZhbAogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnk6IHRydWUiKQp9CgojIEFsbG93IHJlc291cmNlRmllbGRSZWYgdmFsdWVzIChlLmcuLCAibGltaXRzLmNwdSIpLgphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgICMgYSB2YXJpYWJsZSB3ZSBzaG91bGQgYmUgdmFsaWRhdGluZyB1c2luZyBhIHJlZ2V4IGZyb20gc2V0dGluZ3MKICAgIHBfdmFsID09ICIkKHZhbGlkYXRlLWZyb20tc2V0dGluZ3MpIgogICAgcmVnZXhfdmFsIDo9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuQ3JlYXRlQ29udGFpbmVyUmVxdWVzdC5hbGxvd19lbnZfcmVnZXhfbWFwW2tleV0KICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4X3ZhbCwgaV92YWwpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSAyOiB0cnVlIikKfQoKIyBBbGxvdyBub2RlLW5hbWUKYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChub2RlLW5hbWUpIgogICAgcmVnZXgubWF0Y2gocG9saWN5X2RhdGEuY29tbW9uLmRuc19zdWJkb21haW4gLCBpX3ZhbCkKICAgIHByaW50KCJhbGxvd19lbnZfbWFwX2VudHJ5IDM6IHRydWUiKQp9CgojIEFsbG93IGhvc3QtbmFtZQphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgIHBfdmFsID09ICIkKGhvc3QtbmFtZSkiCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24uZG5zX2xhYmVsICwgaV92YWwpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSA0OiB0cnVlIikKfQoKIyBBbGxvdyBwb2QtdWlkCmFsbG93X2Vudl9tYXBfZW50cnkoa2V5LCBpX3ZhbCwgcF9lbnZfbWFwKSB7CiAgICBwX3ZhbCA6PSBwX2Vudl9tYXBba2V5XQogICAgcF92YWwgPT0gIiQocG9kLXVpZCkiCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24ucG9kX3VpZCAsIGlfdmFsKQogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgNTogdHJ1ZSIpCn0KCiMgQWxsb3cgZmllbGRSZWYgImZpZWxkUGF0aDogc3RhdHVzLnBvZElQIiB2YWx1ZXMuCmFsbG93X2Vudl9tYXBfZW50cnkoa2V5LCBpX3ZhbCwgcF9lbnZfbWFwKSB7CiAgICBpc19pcChpX3ZhbCkKCiAgICBwX3ZhbCA6PSBwX2Vudl9tYXBba2V5XQogICAgcF92YXIgOj0gY29uY2F0KCI9IiwgW2tleSwgcF92YWxdKQogICAgYWxsb3dfcG9kX2lwX3ZhcihrZXksIHBfdmFyKQogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgNjogdHJ1ZSIpCn0KCiMgQWxsb3cgZmllbGRSZWYgImZpZWxkUGF0aDogc3RhdHVzLmhvc3RJUCIgdmFsdWVzLgphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgaXNfaXAoaV92YWwpCgogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgIHBfdmFyIDo9IGNvbmNhdCgiPSIsIFtrZXksIHBfdmFsXSkKICAgIGFsbG93X2hvc3RfaXBfdmFyKGtleSwgcF92YXIpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSA3OiB0cnVlIikKfQoKIyBNYXRjaCBpbnB1dCB3aXRoIG9uZSBvZiB0aGUgcG9saWN5IHZhcmlhYmxlcywgYWZ0ZXIgc3Vic3RpdHV0aW5nICQoc2FuZGJveC1uYW1lKS4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChzYW5kYm94LW5hbWUpIgogICAgc19uYW1lIDo9IGlucHV0LmJhc2UuT0NJLkFubm90YXRpb25zW1NfTkFNRV9LRVldCiAgICBwX3ZhcjIgOj0gcmVwbGFjZShwX3ZhbCwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHBfdmFyMiA9PSBpX3ZhbAogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgODogdHJ1ZSIpCn0KCiMgTWF0Y2ggaW5wdXQgd2l0aCBvbmUgb2YgdGhlIHBvbGljeSB2YXJpYWJsZXMsIGFmdGVyIHN1YnN0aXR1dGluZyAkKHNhbmRib3gtbmFtZXNwYWNlKS4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChzYW5kYm94LW5hbWVzcGFjZSkiCiAgICBzX25hbWVzcGFjZSA6PSBpbnB1dC5iYXNlLk9DSS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwX3ZhcjIgOj0gcmVwbGFjZShwX3ZhbCwgIiQoc2FuZGJveC1uYW1lc3BhY2UpIiwgc19uYW1lc3BhY2UpCiAgICBwX3ZhcjIgPT0gaV92YWwKICAgIHByaW50KCJhbGxvd19lbnZfbWFwX2VudHJ5IDk6IHRydWUiKQp9CgojIEFsbG93IGlucHV0IGVudiB2YXJpYWJsZXMgdGhhdCBtYXRjaCB3aXRoIGEgcmVxdWVzdF9kZWZhdWx0cyByZWdleC4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHNvbWUgcF9yZWdleDEgaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5DcmVhdGVDb250YWluZXJSZXF1ZXN0LmFsbG93X2Vudl9yZWdleAogICAgcF9yZWdleDIgOj0gcmVwbGFjZShwX3JlZ2V4MSwgIiQoaXB2NF9hKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcHY0X2EpCiAgICBwX3JlZ2V4MyA6PSByZXBsYWNlKHBfcmVnZXgyLCAiJChpcF9wKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcF9wKQogICAgcF9yZWdleDQgOj0gcmVwbGFjZShwX3JlZ2V4MywgIiQoc3ZjX25hbWUpIiwgcG9saWN5X2RhdGEuY29tbW9uLnN2Y19uYW1lKQogICAgcF9yZWdleDUgOj0gcmVwbGFjZShwX3JlZ2V4NCwgIiQoZG5zX2xhYmVsKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5kbnNfbGFiZWwpCgogICAgcmVzdWx0IDo9IGNvbmNhdCgiPSIsIFtrZXksIGlfdmFsXSkKICAgIHJlZ2V4Lm1hdGNoKHBfcmVnZXg1LCByZXN1bHQpCgogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgMTA6IHRydWUiKQp9CgpDcmVhdGVDb250YWluZXJSZXF1ZXN0Oj0gcmVzcCB7CiAgICBub3QgaW5wdXQuZW52X21hcAogICAgaV9wcm9jZXNzID0gaW5wdXQuT0NJLlByb2Nlc3MKICAgIHNfbmFtZSA9IGlucHV0Lk9DSS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBwX3Byb2Nlc3MgPSBwX2NvbnRhaW5lci5PQ0kuUHJvY2VzcwogICAgYWxsb3dfZGVwcmVjYXRlZF9hcmdzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUpCiAgICByZXNwID0gQ3JlYXRlQ29udGFpbmVyUmVxdWVzdENvbW1vbihpbnB1dCkKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0MjogdHJ1ZSIpCn0KCkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb24ocmVxKTo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgICMgQ2hlY2sgaWYgdGhlIGlucHV0IHJlcXVlc3Qgc2hvdWxkIGJlIHJlamVjdGVkIGV2ZW4gYmVmb3JlIGNoZWNraW5nIHRoZQogICAgIyBwb2xpY3lfZGF0YS5jb250YWluZXJzIGluZm9ybWF0aW9uLgogICAgYWxsb3dfY3JlYXRlX2NvbnRhaW5lcl9pbnB1dChyZXEpCgogICAgaV9vY2kgOj0gcmVxLk9DSQogICAgaV9zdG9yYWdlcyA6PSByZXEuc3RvcmFnZXMKICAgIGlfZGV2aWNlcyA6PSByZXEuZGV2aWNlcwoKICAgICMgYXJyYXkgb2YgcG9zc2libGUgc3RhdGUgb3BlcmF0aW9ucwogICAgb3BzX2J1aWxkZXIgOj0gW10KCiAgICAjIGNoZWNrIHNhbmRib3ggbmFtZQogICAgc2FuZGJveF9uYW1lID0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FX0tFWV0KICAgIGFkZF9zYW5kYm94X25hbWVfdG9fc3RhdGUgOj0gc3RhdGVfYWxsb3dzKCJzYW5kYm94X25hbWUiLCBzYW5kYm94X25hbWUpCiAgICBvcHNfYnVpbGRlcjEgOj0gY29uY2F0X29wX2lmX25vdF9udWxsKG9wc19idWlsZGVyLCBhZGRfc2FuZGJveF9uYW1lX3RvX3N0YXRlKQoKICAgICMgQ2hlY2sgaWYgYW55IGVsZW1lbnQgZnJvbSB0aGUgcG9saWN5X2RhdGEuY29udGFpbmVycyBhcnJheSBhbGxvd3MgdGhlIGlucHV0IHJlcXVlc3QuCiAgICBzb21lIHBfY29udGFpbmVyIGluIHBvbGljeV9kYXRhLmNvbnRhaW5lcnMKICAgIHByaW50KCI9PT09PT09PSBDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiB0cnlpbmcgbmV4dCBwb2xpY3kgY29udGFpbmVyIikKCiAgICBwX3BpZG5zIDo9IHBfY29udGFpbmVyLnNhbmRib3hfcGlkbnMKICAgIGlfcGlkbnMgOj0gcmVxLnNhbmRib3hfcGlkbnMKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiBwX3BpZG5zID0iLCBwX3BpZG5zLCAiaV9waWRucyA9IiwgaV9waWRucykKICAgIHBfcGlkbnMgPT0gaV9waWRucwoKICAgIHBfb2NpIDo9IHBfY29udGFpbmVyLk9DSQoKICAgICMgY2hlY2sgbmFtZXNwYWNlCiAgICBwX25hbWVzcGFjZSA6PSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBpX25hbWVzcGFjZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwcmludCAoIkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb246IHBfbmFtZXNwYWNlID0iLCBwX25hbWVzcGFjZSwgImlfbmFtZXNwYWNlID0iLCBpX25hbWVzcGFjZSkKICAgIGFkZF9uYW1lc3BhY2VfdG9fc3RhdGUgOj0gYWxsb3dfbmFtZXNwYWNlKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkKICAgIG9wc19idWlsZGVyMiA6PSBjb25jYXRfb3BfaWZfbm90X251bGwob3BzX2J1aWxkZXIxLCBhZGRfbmFtZXNwYWNlX3RvX3N0YXRlKQoKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiBwIFZlcnNpb24gPSIsIHBfb2NpLlZlcnNpb24sICJpIFZlcnNpb24gPSIsIGlfb2NpLlZlcnNpb24pCiAgICBwX29jaS5WZXJzaW9uID09IGlfb2NpLlZlcnNpb24KCiAgICBwcmludCgiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdENvbW1vbjogcCBSZWFkb25seSA9IiwgcF9vY2kuUm9vdC5SZWFkb25seSwgImkgUmVhZG9ubHkgPSIsIGlfb2NpLlJvb3QuUmVhZG9ubHkpCiAgICBwX29jaS5Sb290LlJlYWRvbmx5ID09IGlfb2NpLlJvb3QuUmVhZG9ubHkKCiAgICBhbGxvd19hbm5vKHBfb2NpLCBpX29jaSkKCiAgICBwX3N0b3JhZ2VzIDo9IHBfY29udGFpbmVyLnN0b3JhZ2VzCiAgICBhbGxvd19ieV9hbm5vKHBfb2NpLCBpX29jaSwgcF9zdG9yYWdlcywgaV9zdG9yYWdlcykKCiAgICBwX2RldmljZXMgOj0gcF9jb250YWluZXIuZGV2aWNlcwogICAgYWxsb3dfZGV2aWNlcyhwX2RldmljZXMsIGlfZGV2aWNlcykKCiAgICByZXQgOj0gYWxsb3dfbGludXgob3BzX2J1aWxkZXIyLCBwX29jaSwgaV9vY2kpCiAgICByZXQuYWxsb3dlZAoKICAgIG9wcyA6PSByZXQub3BzCgogICAgcHJpbnQoIkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb246IHRydWUiKQp9CgphbGxvd19jcmVhdGVfY29udGFpbmVyX2lucHV0KHJlcSkgewogICAgcHJpbnQoImFsbG93X2NyZWF0ZV9jb250YWluZXJfaW5wdXQ6IGlucHV0ID0iLCByZXEpCgogICAgY291bnQocmVxLnNoYXJlZF9tb3VudHMpID09IDAKICAgIGlzX251bGwocmVxLnN0cmluZ191c2VyKQoKICAgIGlfb2NpIDo9IHJlcS5PQ0kKICAgIGlzX251bGwoaV9vY2kuSG9va3MpCiAgICBpc19udWxsKGlfb2NpLlNvbGFyaXMpCiAgICBpc19udWxsKGlfb2NpLldpbmRvd3MpCgogICAgaV9saW51eCA6PSBpX29jaS5MaW51eAogICAgY291bnQoaV9saW51eC5HSURNYXBwaW5ncykgPT0gMAogICAgY291bnQoaV9saW51eC5Nb3VudExhYmVsKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlJlc291cmNlcy5EZXZpY2VzKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlJvb3Rmc1Byb3BhZ2F0aW9uKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlVJRE1hcHBpbmdzKSA9PSAwCiAgICBpc19udWxsKGlfbGludXguSW50ZWxSZHQpCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLkJsb2NrSU8pCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLk5ldHdvcmspCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLlBpZHMpCiAgICBpc19udWxsKGlfbGludXguU2VjY29tcCkKCiAgICBpX3Byb2Nlc3MgOj0gaV9vY2kuUHJvY2VzcwogICAgY291bnQoaV9wcm9jZXNzLlNlbGludXhMYWJlbCkgPT0gMAogICAgY291bnQoaV9wcm9jZXNzLlVzZXIuVXNlcm5hbWUpID09IDAKCiAgICBwcmludCgiYWxsb3dfY3JlYXRlX2NvbnRhaW5lcl9pbnB1dDogdHJ1ZSIpCn0KCmFsbG93X25hbWVzcGFjZShwX25hbWVzcGFjZSwgaV9uYW1lc3BhY2UpID0gYWRkX25hbWVzcGFjZSB7CiAgICBwX25hbWVzcGFjZSA9PSBpX25hbWVzcGFjZQogICAgYWRkX25hbWVzcGFjZSA6PSBudWxsCiAgICBwcmludCgiYWxsb3dfbmFtZXNwYWNlIDE6IGlucHV0IG5hbWVzcGFjZSBtYXRjaGVzIHBvbGljeSBkYXRhIikKfQoKYWxsb3dfbmFtZXNwYWNlKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkgPSBhZGRfbmFtZXNwYWNlIHsKICAgIHBfbmFtZXNwYWNlID09ICIiCiAgICBwcmludCgiYWxsb3dfbmFtZXNwYWNlIDI6IG5vIG5hbWVzcGFjZSBmb3VuZCBvbiBwb2xpY3kgZGF0YSIpCiAgICBhZGRfbmFtZXNwYWNlIDo9IHN0YXRlX2FsbG93cygibmFtZXNwYWNlIiwgaV9uYW1lc3BhY2UpCn0KCiMgdmFsdWUgaGFzbid0IGJlZW4gc2VlbiBiZWZvcmUsIHNhdmUgaXQgdG8gc3RhdGUKc3RhdGVfYWxsb3dzKGtleSwgdmFsdWUpID0gYWN0aW9uIHsKICBzdGF0ZSA6PSBnZXRfc3RhdGUoKQogIHByaW50KCJzdGF0ZV9hbGxvd3MgMTogc3RhdGVba2V5XSA9Iiwgc3RhdGVba2V5XSwgInZhbHVlID0iLCB2YWx1ZSkKICBub3Qgc3RhdGVba2V5XQogIHByaW50KCJzdGF0ZV9hbGxvd3MgMTogc2F2aW5nIHRvIHN0YXRlIGtleSA9Iiwga2V5LCAidmFsdWUgPSIsIHZhbHVlKQogIHBhdGggOj0gZ2V0X3N0YXRlX3BhdGgoa2V5KSAKICBhY3Rpb24gOj0gewogICAgIm9wIjogImFkZCIsCiAgICAicGF0aCI6IHBhdGgsIAogICAgInZhbHVlIjogdmFsdWUsCiAgfQp9CgojIHZhbHVlIG1hdGNoZXMgd2hhdCdzIGluIHN0YXRlLCBhbGxvdyBpdApzdGF0ZV9hbGxvd3Moa2V5LCB2YWx1ZSkgPSBhY3Rpb24gewogIHByaW50KCJzdGF0ZV9hbGxvd3MgMjogc3RhcnQiKQogIHN0YXRlIDo9IGdldF9zdGF0ZSgpCiAgcHJpbnQoInN0YXRlX2FsbG93cyAyOiBzdGF0ZVtrZXldID0iLCBzdGF0ZVtrZXldLCAidmFsdWUgPSIsIHZhbHVlKQogIHZhbHVlID09IHN0YXRlW2tleV0KICBwcmludCgic3RhdGVfYWxsb3dzIDI6IGZvdW5kIGtleSA9Iiwga2V5LCAidmFsdWUgPSIsIHZhbHVlLCAiIGluIHN0YXRlIikKICBhY3Rpb24gOj0gbnVsbAp9CgojIGhlbHBlciBmdW5jdGlvbnMgdG8gaW50ZXJhY3Qgd2l0aCB0aGUgc3RhdGUKZ2V0X3N0YXRlKCkgPSBzdGF0ZSB7CiAgc3RhdGUgOj0gZGF0YVsicHN0YXRlIl0KfQoKZ2V0X3N0YXRlX3ZhbChrZXkpID0gdmFsdWUgewogICAgc3RhdGUgOj0gZ2V0X3N0YXRlKCkKICAgIHZhbHVlIDo9IHN0YXRlW2tleV0KfQoKZ2V0X3N0YXRlX3BhdGgoa2V5KSA9IHBhdGggewogICAgIyBwcmVwZW5kICIvcHN0YXRlLyIgdG8ga2V5CiAgICBwYXRoIDo9IGNvbmNhdCgiLyIsIFsiL3BzdGF0ZSIsIGtleV0pCn0KCiMgSGVscGVyIGZ1bmN0aW9ucyB0byBjb25kaXRpb25hbGx5IGNvbmNhdGVuYXRlIG9wIGlzIG5vdCBudWxsCmNvbmNhdF9vcF9pZl9ub3RfbnVsbChvcHMsIG9wKSA9IHJlc3VsdCB7CiAgICBvcCA9PSBudWxsCiAgICByZXN1bHQgOj0gb3BzCn0KCmNvbmNhdF9vcF9pZl9ub3RfbnVsbChvcHMsIG9wKSA9IHJlc3VsdCB7CiAgICBvcCAhPSBudWxsCiAgICByZXN1bHQgOj0gYXJyYXkuY29uY2F0KG9wcywgW29wXSkKfQoKIyBSZWplY3QgdW5leHBlY3RlZCBhbm5vdGF0aW9ucy4KYWxsb3dfYW5ubyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19hbm5vIDE6IHN0YXJ0IikKCiAgICBub3QgaV9vY2kuQW5ub3RhdGlvbnMKCiAgICBwcmludCgiYWxsb3dfYW5ubyAxOiB0cnVlIikKfQphbGxvd19hbm5vKHBfb2NpLCBpX29jaSkgewogICAgcHJpbnQoImFsbG93X2Fubm8gMjogcCBBbm5vdGF0aW9ucyA9IiwgcF9vY2kuQW5ub3RhdGlvbnMpCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiBpIEFubm90YXRpb25zID0iLCBpX29jaS5Bbm5vdGF0aW9ucykKCiAgICBpX2tleXMgOj0gb2JqZWN0LmtleXMoaV9vY2kuQW5ub3RhdGlvbnMpCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiBpIGtleXMgPSIsIGlfa2V5cykKCiAgICBldmVyeSBpX2tleSBpbiBpX2tleXMgewogICAgICAgIGFsbG93X2Fubm9fa2V5KGlfa2V5LCBwX29jaSkKICAgIH0KCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiB0cnVlIikKfQoKYWxsb3dfYW5ub19rZXkoaV9rZXksIHBfb2NpKSB7CiAgICBwcmludCgiYWxsb3dfYW5ub19rZXkgMTogaSBrZXkgPSIsIGlfa2V5KQoKICAgIHN0YXJ0c3dpdGgoaV9rZXksICJpby5rdWJlcm5ldGVzLmNyaS4iKQoKICAgIHByaW50KCJhbGxvd19hbm5vX2tleSAxOiB0cnVlIikKfQphbGxvd19hbm5vX2tleShpX2tleSwgcF9vY2kpIHsKICAgIHByaW50KCJhbGxvd19hbm5vX2tleSAyOiBpIGtleSA9IiwgaV9rZXkpCgogICAgc29tZSBwX2tleSwgXyBpbiBwX29jaS5Bbm5vdGF0aW9ucwogICAgcF9rZXkgPT0gaV9rZXkKCiAgICBwcmludCgiYWxsb3dfYW5ub19rZXkgMjogdHJ1ZSIpCn0KCiMgR2V0IHRoZSB2YWx1ZSBvZiB0aGUgU19OQU1FX0tFWSBhbm5vdGF0aW9uIGFuZAojIGNvcnJlbGF0ZSBpdCB3aXRoIG90aGVyIGFubm90YXRpb25zIGFuZCBwcm9jZXNzIGZpZWxkcy4KYWxsb3dfYnlfYW5ubyhwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpIHsKICAgIHByaW50KCJhbGxvd19ieV9hbm5vIDE6IHN0YXJ0IikKCiAgICBub3QgcF9vY2kuQW5ub3RhdGlvbnNbU19OQU1FX0tFWV0KCiAgICBpX3NfbmFtZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMTogaV9zX25hbWUgPSIsIGlfc19uYW1lKQoKICAgIGlfc19uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FU1BBQ0VfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMTogaV9zX25hbWVzcGFjZSA9IiwgaV9zX25hbWVzcGFjZSkKCiAgICBhbGxvd19ieV9zYW5kYm94X25hbWUocF9vY2ksIGlfb2NpLCBwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBpX3NfbmFtZSwgaV9zX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfYnlfYW5ubyAxOiB0cnVlIikKfQphbGxvd19ieV9hbm5vKHBfb2NpLCBpX29jaSwgcF9zdG9yYWdlcywgaV9zdG9yYWdlcykgewogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMjogc3RhcnQiKQoKICAgIHBfc19uYW1lIDo9IHBfb2NpLkFubm90YXRpb25zW1NfTkFNRV9LRVldCiAgICBpX3NfbmFtZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMjogaV9zX25hbWUgPSIsIGlfc19uYW1lLCAicF9zX25hbWUgPSIsIHBfc19uYW1lKQoKICAgIGFsbG93X3NhbmRib3hfbmFtZShwX3NfbmFtZSwgaV9zX25hbWUpCgogICAgaV9zX25hbWVzcGFjZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwcmludCgiYWxsb3dfYnlfYW5ubyAyOiBpX3NfbmFtZXNwYWNlID0iLCBpX3NfbmFtZXNwYWNlKQoKICAgIGFsbG93X2J5X3NhbmRib3hfbmFtZShwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMsIGlfc19uYW1lLCBpX3NfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd19ieV9hbm5vIDI6IHRydWUiKQp9CgphbGxvd19ieV9zYW5kYm94X25hbWUocF9vY2ksIGlfb2NpLCBwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfYnlfc2FuZGJveF9uYW1lOiBzdGFydCIpCgogICAgaV9uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FU1BBQ0VfS0VZXQoKICAgIGFsbG93X2J5X2NvbnRhaW5lcl90eXBlcyhwX29jaSwgaV9vY2ksIHNfbmFtZSwgaV9uYW1lc3BhY2UpCiAgICBhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZChwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpCiAgICBhbGxvd19wcm9jZXNzKHBfb2NpLlByb2Nlc3MsIGlfb2NpLlByb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpCgogICAgcHJpbnQoImFsbG93X2J5X3NhbmRib3hfbmFtZTogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfbmFtZShwX3NfbmFtZSwgaV9zX25hbWUpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X25hbWU6IHN0YXJ0IikKICAgIHJlZ2V4Lm1hdGNoKHBfc19uYW1lLCBpX3NfbmFtZSkKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9uYW1lOiB0cnVlIikKfQoKIyBDaGVjayB0aGF0IHRoZSAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLXR5cGUiIGFuZAojICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIiBhbm5vdGF0aW9ucyBkZXNpZ25hdGUgdGhlCiMgZXhwZWN0ZWQgdHlwZSAtIGVpdGhlciBhICJzYW5kYm94IiBvciBhICJjb250YWluZXIiLiBUaGVuLCB2YWxpZGF0ZQojIG90aGVyIGFubm90YXRpb25zIGJhc2VkIG9uIHRoZSBhY3R1YWwgInNhbmRib3giIG9yICJjb250YWluZXIiIHZhbHVlCiMgZnJvbSB0aGUgaW5wdXQgY29udGFpbmVyLgphbGxvd19ieV9jb250YWluZXJfdHlwZXMocF9vY2ksIGlfb2NpLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfYnlfY29udGFpbmVyX3R5cGVzOiBjaGVja2luZyBpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSIpCgogICAgY190eXBlIDo9ICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSIKICAgIAogICAgcF9jcmlfdHlwZSA6PSBwX29jaS5Bbm5vdGF0aW9uc1tjX3R5cGVdCiAgICBpX2NyaV90eXBlIDo9IGlfb2NpLkFubm90YXRpb25zW2NfdHlwZV0KICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZXM6IHBfY3JpX3R5cGUgPSIsIHBfY3JpX3R5cGUsICJpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgcF9jcmlfdHlwZSA9PSBpX2NyaV90eXBlCgogICAgYWxsb3dfYnlfY29udGFpbmVyX3R5cGUoaV9jcmlfdHlwZSwgcF9vY2ksIGlfb2NpLCBzX25hbWUsIHNfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZXM6IHRydWUiKQp9CgphbGxvd19ieV9jb250YWluZXJfdHlwZShpX2NyaV90eXBlLCBwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAxOiBpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgaV9jcmlfdHlwZSA9PSAic2FuZGJveCIKCiAgICBpX2thdGFfdHlwZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1siaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5jb250YWluZXJfdHlwZSJdCiAgICBwcmludCgiYWxsb3dfYnlfY29udGFpbmVyX3R5cGUgMTogaV9rYXRhX3R5cGUgPSIsIGlfa2F0YV90eXBlKQogICAgaV9rYXRhX3R5cGUgPT0gInBvZF9zYW5kYm94IgoKICAgIGFsbG93X3NhbmRib3hfY29udGFpbmVyX25hbWUocF9vY2ksIGlfb2NpKQogICAgYWxsb3dfc2FuZGJveF9uZXRfbmFtZXNwYWNlKHBfb2NpLCBpX29jaSkKICAgIGFsbG93X3NhbmRib3hfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpCgogICAgcHJpbnQoImFsbG93X2J5X2NvbnRhaW5lcl90eXBlIDE6IHRydWUiKQp9CgphbGxvd19ieV9jb250YWluZXJfdHlwZShpX2NyaV90eXBlLCBwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiBpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgaV9jcmlfdHlwZSA9PSAiY29udGFpbmVyIgoKICAgIGlfa2F0YV90eXBlIDo9IGlfb2NpLkFubm90YXRpb25zWyJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIl0KICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiBpX2thdGFfdHlwZSA9IiwgaV9rYXRhX3R5cGUpCiAgICBpX2thdGFfdHlwZSA9PSAicG9kX2NvbnRhaW5lciIKCiAgICBhbGxvd19jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpCiAgICBhbGxvd19uZXRfbmFtZXNwYWNlKHBfb2NpLCBpX29jaSkKICAgIGFsbG93X2xvZ19kaXJlY3RvcnkocF9vY2ksIGlfb2NpKQoKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiB0cnVlIikKfQoKIyAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLW5hbWUiIGFubm90YXRpb24KYWxsb3dfc2FuZGJveF9jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X2NvbnRhaW5lcl9uYW1lOiBzdGFydCIpCgogICAgY29udGFpbmVyX2Fubm90YXRpb25fbWlzc2luZyhwX29jaSwgaV9vY2ksICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItbmFtZSIpCgogICAgcHJpbnQoImFsbG93X3NhbmRib3hfY29udGFpbmVyX25hbWU6IHRydWUiKQp9CgphbGxvd19jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19jb250YWluZXJfbmFtZTogc3RhcnQiKQoKICAgIGFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uKHBfb2NpLCBpX29jaSwgImlvLmt1YmVybmV0ZXMuY3JpLmNvbnRhaW5lci1uYW1lIikKCiAgICBwcmludCgiYWxsb3dfY29udGFpbmVyX25hbWU6IHRydWUiKQp9Cgpjb250YWluZXJfYW5ub3RhdGlvbl9taXNzaW5nKHBfb2NpLCBpX29jaSwga2V5KSB7CiAgICBwcmludCgiY29udGFpbmVyX2Fubm90YXRpb25fbWlzc2luZzoiLCBrZXkpCgogICAgbm90IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIG5vdCBpX29jaS5Bbm5vdGF0aW9uc1trZXldCgogICAgcHJpbnQoImNvbnRhaW5lcl9hbm5vdGF0aW9uX21pc3Npbmc6IHRydWUiKQp9CgphbGxvd19jb250YWluZXJfYW5ub3RhdGlvbihwX29jaSwgaV9vY2ksIGtleSkgewogICAgcHJpbnQoImFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uOiBrZXkgPSIsIGtleSkKCiAgICBwX3ZhbHVlIDo9IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIGlfdmFsdWUgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgcHJpbnQoImFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uOiBwX3ZhbHVlID0iLCBwX3ZhbHVlLCAiaV92YWx1ZSA9IiwgaV92YWx1ZSkKCiAgICBwX3ZhbHVlID09IGlfdmFsdWUKCiAgICBwcmludCgiYWxsb3dfY29udGFpbmVyX2Fubm90YXRpb246IHRydWUiKQp9CgojICJuZXJkY3RsL25ldHdvcmstbmFtZXNwYWNlIiBhbm5vdGF0aW9uCmFsbG93X3NhbmRib3hfbmV0X25hbWVzcGFjZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X25ldF9uYW1lc3BhY2U6IHN0YXJ0IikKCiAgICBrZXkgOj0gIm5lcmRjdGwvbmV0d29yay1uYW1lc3BhY2UiCgogICAgcF9uYW1lc3BhY2UgOj0gcF9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgaV9uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgcHJpbnQoImFsbG93X3NhbmRib3hfbmV0X25hbWVzcGFjZTogcF9uYW1lc3BhY2UgPSIsIHBfbmFtZXNwYWNlLCAiaV9uYW1lc3BhY2UgPSIsIGlfbmFtZXNwYWNlKQoKICAgIHJlZ2V4Lm1hdGNoKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9uZXRfbmFtZXNwYWNlOiB0cnVlIikKfQoKYWxsb3dfbmV0X25hbWVzcGFjZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19uZXRfbmFtZXNwYWNlOiBzdGFydCIpCgogICAga2V5IDo9ICJuZXJkY3RsL25ldHdvcmstbmFtZXNwYWNlIgoKICAgIG5vdCBwX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICBub3QgaV9vY2kuQW5ub3RhdGlvbnNba2V5XQoKICAgIHByaW50KCJhbGxvd19uZXRfbmFtZXNwYWNlOiB0cnVlIikKfQoKIyAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1sb2ctZGlyZWN0b3J5IiBhbm5vdGF0aW9uCmFsbG93X3NhbmRib3hfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X2xvZ19kaXJlY3Rvcnk6IHN0YXJ0IikKCiAgICBrZXkgOj0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbG9nLWRpcmVjdG9yeSIKCiAgICBwX2RpciA6PSBwX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICByZWdleDEgOj0gcmVwbGFjZShwX2RpciwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHJlZ2V4MiA6PSByZXBsYWNlKHJlZ2V4MSwgIiQoc2FuZGJveC1uYW1lc3BhY2UpIiwgc19uYW1lc3BhY2UpCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiByZWdleDIgPSIsIHJlZ2V4MikKCiAgICBpX2RpciA6PSBpX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiBpX2RpciA9IiwgaV9kaXIpCgogICAgcmVnZXgubWF0Y2gocmVnZXgyLCBpX2RpcikKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiB0cnVlIikKfQoKYWxsb3dfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19sb2dfZGlyZWN0b3J5OiBzdGFydCIpCgogICAga2V5IDo9ICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWxvZy1kaXJlY3RvcnkiCgogICAgbm90IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIG5vdCBpX29jaS5Bbm5vdGF0aW9uc1trZXldCgogICAgcHJpbnQoImFsbG93X2xvZ19kaXJlY3Rvcnk6IHRydWUiKQp9CgphbGxvd19kZXZpY2VzKHBfZGV2aWNlcywgaV9kZXZpY2VzKSB7CiAgICBwcmludCgiYWxsb3dfZGV2aWNlczogc3RhcnQiKQogICAgZXZlcnkgaV9kZXZpY2UgaW4gaV9kZXZpY2VzIHsKICAgICAgICBwcmludCgiYWxsb3dfZGV2aWNlczogaV9kZXZpY2UgPSIsIGlfZGV2aWNlKQogICAgICAgIHNvbWUgcF9kZXZpY2UgaW4gcF9kZXZpY2VzCiAgICAgICAgcF9kZXZpY2UuY29udGFpbmVyX3BhdGggPT0gaV9kZXZpY2UuY29udGFpbmVyX3BhdGgKICAgIH0KICAgIHByaW50KCJhbGxvd19kZXZpY2VzOiB0cnVlIikKfQoKYWxsb3dfbGludXgoc3RhdGVfb3BzLCBwX29jaSwgaV9vY2kpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIHBfbmFtZXNwYWNlcyA6PSBwX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbGludXg6IHAgbmFtZXNwYWNlcyA9IiwgcF9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlcyA6PSBpX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbGludXg6IGkgbmFtZXNwYWNlcyA9IiwgaV9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlX3dpdGhvdXRfbmV0d29yayA6PSBbb2JqIHwgb2JqIDo9IGlfbmFtZXNwYWNlc1tfXTsgb2JqLlR5cGUgIT0gIm5ldHdvcmsiXQoKICAgIHByaW50KCJhbGxvd19saW51eDogaV9uYW1lc3BhY2Vfd2l0aG91dF9uZXR3b3JrID0iLCBpX25hbWVzcGFjZV93aXRob3V0X25ldHdvcmspCgogICAgcF9uYW1lc3BhY2VzID09IGlfbmFtZXNwYWNlX3dpdGhvdXRfbmV0d29yawoKICAgIGFsbG93X21hc2tlZF9wYXRocyhwX29jaSwgaV9vY2kpCiAgICBhbGxvd19yZWFkb25seV9wYXRocyhwX29jaSwgaV9vY2kpCiAgICBhbGxvd19saW51eF9kZXZpY2VzKHBfb2NpLkxpbnV4LkRldmljZXMsIGlfb2NpLkxpbnV4LkRldmljZXMpCiAgICBhbGxvd19saW51eF9zeXNjdGwocF9vY2kuTGludXgsIGlfb2NpLkxpbnV4KQogICAgcmV0IDo9IGFsbG93X25ldHdvcmtfbmFtZXNwYWNlX3N0YXJ0KHN0YXRlX29wcywgcF9vY2ksIGlfb2NpKQogICAgcmV0LmFsbG93ZWQKCiAgICBvcHMgOj0gcmV0Lm9wcwoKICAgIHByaW50KCJhbGxvd19saW51eDogdHJ1ZSIpCn0KCiMgUmV0cmlldmUgdGhlICJuZXR3b3JrIiBuYW1lc3BhY2UgZnJvbSB0aGUgaW5wdXQgZGF0YSBhbmQgcGFzcyBpdCBvbiBmb3IgdGhlCiMgbmV0d29yayBuYW1lc3BhY2UgcG9saWN5IGNoZWNrcy4KYWxsb3dfbmV0d29ya19uYW1lc3BhY2Vfc3RhcnQoc3RhdGVfb3BzLCBwX29jaSwgaV9vY2kpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIHByaW50KCJhbGxvd19uZXR3b3JrX25hbWVzcGFjZSBzdGFydDogc3RhcnQiKQoKICAgIHBfbmFtZXNwYWNlcyA6PSBwX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IHAgbmFtZXNwYWNlcyA9IiwgcF9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlcyA6PSBpX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IGkgbmFtZXNwYWNlcyA9IiwgaV9uYW1lc3BhY2VzKQoKICAgICMgUmV0dXJuIHBhdGggb2YgdGhlICJuZXR3b3JrIiBuYW1lc3BhY2UKICAgIG5ldHdvcmtfbnMgOj0gW29iaiB8IG9iaiA6PSBpX25hbWVzcGFjZXNbX107IG9iai5UeXBlID09ICJuZXR3b3JrIl0KCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IG5ldHdvcmtfbnMgPSIsIG5ldHdvcmtfbnMpCgogICAgcmV0IDo9IGFsbG93X25ldHdvcmtfbmFtZXNwYWNlKHN0YXRlX29wcywgbmV0d29ya19ucykKICAgIHJldC5hbGxvd2VkCgogICAgb3BzIDo9IHJldC5vcHMKfQoKIyBUaGlzIHJ1bGUgaXMgd2hlbiB0aGVyZSdzIG5vIG5ldHdvcmsgbmFtZXNwYWNlIGluIHRoZSBpbnB1dCBkYXRhLgphbGxvd19uZXR3b3JrX25hbWVzcGFjZShzdGF0ZV9vcHMsIG5ldHdvcmtfbnMpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIGNvdW50KG5ldHdvcmtfbnMpID09IDAKCiAgICBuZXR3b3JrX25zX3BhdGggPSAiIgoKICAgIGFkZF9uZXR3b3JrX25hbWVzcGFjZV90b19zdGF0ZSA6PSBzdGF0ZV9hbGxvd3MoIm5ldHdvcmtfbmFtZXNwYWNlIiwgbmV0d29ya19uc19wYXRoKQogICAgb3BzIDo9IGNvbmNhdF9vcF9pZl9ub3RfbnVsbChzdGF0ZV9vcHMsIGFkZF9uZXR3b3JrX25hbWVzcGFjZV90b19zdGF0ZSkKCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2UgMTogdHJ1ZSIpCn0KCiMgVGhpcyBydWxlIGlzIHdoZW4gdGhlcmUncyBleGFjdGx5IG9uZSBuZXR3b3JrIG5hbWVzcGFjZSBpbiB0aGUgaW5wdXQgZGF0YS4KYWxsb3dfbmV0d29ya19uYW1lc3BhY2Uoc3RhdGVfb3BzLCBuZXR3b3JrX25zKSA6PSB7Im9wcyI6IG9wcywgImFsbG93ZWQiOiB0cnVlfSB7CiAgICBjb3VudChuZXR3b3JrX25zKSA9PSAxCgogICAgYWRkX25ldHdvcmtfbmFtZXNwYWNlX3RvX3N0YXRlIDo9IHN0YXRlX2FsbG93cygibmV0d29ya19uYW1lc3BhY2UiLCBuZXR3b3JrX25zWzBdLlBhdGgpCiAgICBvcHMgOj0gY29uY2F0X29wX2lmX25vdF9udWxsKHN0YXRlX29wcywgYWRkX25ldHdvcmtfbmFtZXNwYWNlX3RvX3N0YXRlKQoKICAgIHByaW50KCJhbGxvd19uZXR3b3JrX25hbWVzcGFjZSAyOiB0cnVlIikKfQoKYWxsb3dfbWFza2VkX3BhdGhzKHBfb2NpLCBpX29jaSkgewogICAgcF9wYXRocyA6PSBwX29jaS5MaW51eC5NYXNrZWRQYXRocwogICAgcHJpbnQoImFsbG93X21hc2tlZF9wYXRocyAxOiBwX3BhdGhzID0iLCBwX3BhdGhzKQoKICAgIGlfcGF0aHMgOj0gaV9vY2kuTGludXguTWFza2VkUGF0aHMKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aHMgMTogaV9wYXRocyA9IiwgaV9wYXRocykKCiAgICBhbGxvd19tYXNrZWRfcGF0aHNfYXJyYXkocF9wYXRocywgaV9wYXRocykKCiAgICBwcmludCgiYWxsb3dfbWFza2VkX3BhdGhzIDE6IHRydWUiKQp9CmFsbG93X21hc2tlZF9wYXRocyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aHMgMjogc3RhcnQiKQoKICAgIG5vdCBwX29jaS5MaW51eC5NYXNrZWRQYXRocwogICAgbm90IGlfb2NpLkxpbnV4Lk1hc2tlZFBhdGhzCgogICAgcHJpbnQoImFsbG93X21hc2tlZF9wYXRocyAyOiB0cnVlIikKfQoKIyBBbGwgdGhlIHBvbGljeSBtYXNrZWQgcGF0aHMgbXVzdCBiZSBtYXNrZWQgaW4gdGhlIGlucHV0IGRhdGEgdG9vLgojIElucHV0IGlzIGFsbG93ZWQgdG8gaGF2ZSBtb3JlIG1hc2tlZCBwYXRocyB0aGFuIHRoZSBwb2xpY3kuCmFsbG93X21hc2tlZF9wYXRoc19hcnJheShwX2FycmF5LCBpX2FycmF5KSB7CiAgICBldmVyeSBwX2VsZW0gaW4gcF9hcnJheSB7CiAgICAgICAgYWxsb3dfbWFza2VkX3BhdGgocF9lbGVtLCBpX2FycmF5KQogICAgfQp9CgphbGxvd19tYXNrZWRfcGF0aChwX2VsZW0sIGlfYXJyYXkpIHsKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aDogcF9lbGVtID0iLCBwX2VsZW0pCgogICAgc29tZSBpX2VsZW0gaW4gaV9hcnJheQogICAgcF9lbGVtID09IGlfZWxlbQoKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aDogdHJ1ZSIpCn0KCmFsbG93X3JlYWRvbmx5X3BhdGhzKHBfb2NpLCBpX29jaSkgewogICAgcF9wYXRocyA6PSBwX29jaS5MaW51eC5SZWFkb25seVBhdGhzCiAgICBwcmludCgiYWxsb3dfcmVhZG9ubHlfcGF0aHMgMTogcF9wYXRocyA9IiwgcF9wYXRocykKCiAgICBpX3BhdGhzIDo9IGlfb2NpLkxpbnV4LlJlYWRvbmx5UGF0aHMKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAxOiBpX3BhdGhzID0iLCBpX3BhdGhzKQoKICAgIGFsbG93X3JlYWRvbmx5X3BhdGhzX2FycmF5KHBfcGF0aHMsIGlfcGF0aHMsIGlfb2NpLkxpbnV4Lk1hc2tlZFBhdGhzKQoKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAxOiB0cnVlIikKfQphbGxvd19yZWFkb25seV9wYXRocyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAyOiBzdGFydCIpCgogICAgbm90IHBfb2NpLkxpbnV4LlJlYWRvbmx5UGF0aHMKICAgIG5vdCBpX29jaS5MaW51eC5SZWFkb25seVBhdGhzCgogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGhzIDI6IHRydWUiKQp9CgojIEFsbCB0aGUgcG9saWN5IHJlYWRvbmx5IHBhdGhzIG11c3QgYmUgZWl0aGVyOgojIC0gUHJlc2VudCBpbiB0aGUgaW5wdXQgcmVhZG9ubHkgcGF0aHMsIG9yCiMgLSBQcmVzZW50IGluIHRoZSBpbnB1dCBtYXNrZWQgcGF0aHMuCiMgSW5wdXQgaXMgYWxsb3dlZCB0byBoYXZlIG1vcmUgcmVhZG9ubHkgcGF0aHMgdGhhbiB0aGUgcG9saWN5LgphbGxvd19yZWFkb25seV9wYXRoc19hcnJheShwX2FycmF5LCBpX2FycmF5LCBtYXNrZWRfcGF0aHMpIHsKICAgIGV2ZXJ5IHBfZWxlbSBpbiBwX2FycmF5IHsKICAgICAgICBhbGxvd19yZWFkb25seV9wYXRoKHBfZWxlbSwgaV9hcnJheSwgbWFza2VkX3BhdGhzKQogICAgfQp9CgphbGxvd19yZWFkb25seV9wYXRoKHBfZWxlbSwgaV9hcnJheSwgbWFza2VkX3BhdGhzKSB7CiAgICBwcmludCgiYWxsb3dfcmVhZG9ubHlfcGF0aCAxOiBwX2VsZW0gPSIsIHBfZWxlbSkKCiAgICBzb21lIGlfZWxlbSBpbiBpX2FycmF5CiAgICBwX2VsZW0gPT0gaV9lbGVtCgogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGggMTogdHJ1ZSIpCn0KYWxsb3dfcmVhZG9ubHlfcGF0aChwX2VsZW0sIGlfYXJyYXksIG1hc2tlZF9wYXRocykgewogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGggMjogcF9lbGVtID0iLCBwX2VsZW0pCgogICAgc29tZSBpX21hc2tlZCBpbiBtYXNrZWRfcGF0aHMKICAgIHBfZWxlbSA9PSBpX21hc2tlZAoKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRoIDI6IHRydWUiKQp9CgphbGxvd19saW51eF9kZXZpY2VzKHBfZGV2aWNlcywgaV9kZXZpY2VzKSB7CiAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogc3RhcnQiKQogICAgZXZlcnkgaV9kZXZpY2UgaW4gaV9kZXZpY2VzIHsKICAgICAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogaV9kZXZpY2UgPSIsIGlfZGV2aWNlKQogICAgICAgIHNvbWUgcF9kZXZpY2UgaW4gcF9kZXZpY2VzCiAgICAgICAgaV9kZXZpY2UuUGF0aCA9PSBwX2RldmljZS5QYXRoCiAgICB9CiAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogdHJ1ZSIpCn0KCmFsbG93X2xpbnV4X3N5c2N0bChwX2xpbnV4LCBpX2xpbnV4KSB7CiAgICBwcmludCgiYWxsb3dfbGludXhfc3lzY3RsIDE6IHN0YXJ0IikKICAgIG5vdCBpX2xpbnV4LlN5c2N0bAogICAgcHJpbnQoImFsbG93X2xpbnV4X3N5c2N0bCAxOiB0cnVlIikKfQoKYWxsb3dfbGludXhfc3lzY3RsKHBfbGludXgsIGlfbGludXgpIHsKICAgIHByaW50KCJhbGxvd19saW51eF9zeXNjdGwgMjogc3RhcnQiKQogICAgcF9zeXNjdGwgOj0gcF9saW51eC5TeXNjdGwKICAgIGlfc3lzY3RsIDo9IGlfbGludXguU3lzY3RsCiAgICBldmVyeSBpX25hbWUsIGlfdmFsIGluIGlfc3lzY3RsIHsKICAgICAgICBwcmludCgiYWxsb3dfbGludXhfc3lzY3RsIDI6IGlfbmFtZSA9IiwgaV9uYW1lLCAiaV92YWwgPSIsIGlfdmFsKQogICAgICAgIHBfc3lzY3RsW2lfbmFtZV0gPT0gaV92YWwKICAgIH0KICAgIHByaW50KCJhbGxvd19saW51eF9zeXNjdGwgMjogdHJ1ZSIpCn0KCiMgQ2hlY2sgdGhlIGNvbnNpc3RlbmN5IG9mIHRoZSBpbnB1dCAiaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5idW5kbGVfcGF0aCIKIyBhbmQgaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCIgdmFsdWVzIHdpdGggb3RoZXIgZmllbGRzLgphbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZChwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpIHsKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogc3RhcnQiKQoKICAgIGJ1bmRsZV9wYXRoIDo9IGlfb2NpLkFubm90YXRpb25zWyJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmJ1bmRsZV9wYXRoIl0KICAgIGJ1bmRsZV9pZCA6PSByZXBsYWNlKGJ1bmRsZV9wYXRoLCAiL3J1bi9jb250YWluZXJkL2lvLmNvbnRhaW5lcmQucnVudGltZS52Mi50YXNrL2s4cy5pby8iLCAiIikKCiAgICBidW5kbGVfaWRfZm9ybWF0IDo9IGNvbmNhdCgiIiwgWyJeIiwgQlVORExFX0lELCAiJCJdKQogICAgcmVnZXgubWF0Y2goYnVuZGxlX2lkX2Zvcm1hdCwgYnVuZGxlX2lkKQoKICAgIGtleSA6PSAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCIKCiAgICBwX3JlZ2V4IDo9IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIHNhbmRib3hfaWQgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQoKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogc2FuZGJveF9pZCA9Iiwgc2FuZGJveF9pZCwgInJlZ2V4ID0iLCBwX3JlZ2V4KQogICAgcmVnZXgubWF0Y2gocF9yZWdleCwgc2FuZGJveF9pZCkKCiAgICBhbGxvd19yb290X3BhdGgocF9vY2ksIGlfb2NpLCBidW5kbGVfaWQpCgogICAgZXZlcnkgaV9tb3VudCBpbiBpX29jaS5Nb3VudHMgewogICAgICAgIGFsbG93X21vdW50KHBfb2NpLCBpX21vdW50LCBpX3N0b3JhZ2VzLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpCiAgICB9CgogICAgYWxsb3dfc3RvcmFnZXMocF9zdG9yYWdlcywgaV9zdG9yYWdlcywgYnVuZGxlX2lkLCBzYW5kYm94X2lkKQoKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogdHJ1ZSIpCn0KCmFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHBfcHJvY2VzcyA9IiwgcF9wcm9jZXNzKQogICAgcHJpbnQoImFsbG93X3Byb2Nlc3NfY29tbW9uOiBpX3Byb2Nlc3MgPSAiLCBpX3Byb2Nlc3MpCiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHNfbmFtZSA9Iiwgc19uYW1lKQoKICAgIHBfcHJvY2Vzcy5Dd2QgPT0gaV9wcm9jZXNzLkN3ZAogICAgcF9wcm9jZXNzLk5vTmV3UHJpdmlsZWdlcyA9PSBpX3Byb2Nlc3MuTm9OZXdQcml2aWxlZ2VzCgogICAgYWxsb3dfdXNlcihwX3Byb2Nlc3MsIGlfcHJvY2VzcykKICAgIGFsbG93X2VudihwX3Byb2Nlc3MsIGlfcHJvY2Vzcywgc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHRydWUiKQp9CgojIENvbXBhcmUgdGhlIE9DSSBQcm9jZXNzIGZpZWxkIG9mIGEgcG9saWN5IGNvbnRhaW5lciB3aXRoIHRoZSBpbnB1dCBPQ0kgUHJvY2VzcyBmcm9tIGEgQ3JlYXRlQ29udGFpbmVyUmVxdWVzdAphbGxvd19wcm9jZXNzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfcHJvY2Vzczogc3RhcnQiKQoKICAgIGFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgYWxsb3dfY2FwcyhwX3Byb2Nlc3MuQ2FwYWJpbGl0aWVzLCBpX3Byb2Nlc3MuQ2FwYWJpbGl0aWVzKQogICAgcF9wcm9jZXNzLlRlcm1pbmFsID09IGlfcHJvY2Vzcy5UZXJtaW5hbAoKICAgIHByaW50KCJhbGxvd19wcm9jZXNzOiB0cnVlIikKfQoKIyBDb21wYXJlIHRoZSBPQ0kgUHJvY2VzcyBmaWVsZCBvZiBhIHBvbGljeSBjb250YWluZXIgd2l0aCB0aGUgaW5wdXQgcHJvY2VzcyBmaWVsZCBmcm9tIEV4ZWNQcm9jZXNzUmVxdWVzdAphbGxvd19pbnRlcmFjdGl2ZV9wcm9jZXNzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfaW50ZXJhY3RpdmVfcHJvY2Vzczogc3RhcnQiKQoKICAgIGFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgYWxsb3dfZXhlY19jYXBzKGlfcHJvY2Vzcy5DYXBhYmlsaXRpZXMpCgogICAgIyBUaGVzZSBhcmUgY29tbWFuZHMgZW5hYmxlZCB1c2luZyBFeGVjUHJvY2Vzc1JlcXVlc3QgY29tbWFuZHMgYW5kL29yIHJlZ2V4IGZyb20gdGhlIHNldHRpbmdzIGZpbGUuCiAgICAjIFRoZXkgY2FuIGJlIGV4ZWN1dGVkIGludGVyYWN0aXZlbHkgc28gYWxsb3cgdGhlbSB0byB1c2UgYW55IHZhbHVlIGZvciBpX3Byb2Nlc3MuVGVybWluYWwuCgogICAgcHJpbnQoImFsbG93X2ludGVyYWN0aXZlX3Byb2Nlc3M6IHRydWUiKQp9CgojIENvbXBhcmUgdGhlIE9DSSBQcm9jZXNzIGZpZWxkIG9mIGEgcG9saWN5IGNvbnRhaW5lciB3aXRoIHRoZSBpbnB1dCBwcm9jZXNzIGZpZWxkIGZyb20gRXhlY1Byb2Nlc3NSZXF1ZXN0CmFsbG93X3Byb2JlX3Byb2Nlc3MocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19wcm9iZV9wcm9jZXNzOiBzdGFydCIpCgogICAgYWxsb3dfcHJvY2Vzc19jb21tb24ocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpCiAgICBhbGxvd19leGVjX2NhcHMoaV9wcm9jZXNzLkNhcGFiaWxpdGllcykKICAgIHBfcHJvY2Vzcy5UZXJtaW5hbCA9PSBpX3Byb2Nlc3MuVGVybWluYWwKCiAgICBwcmludCgiYWxsb3dfcHJvYmVfcHJvY2VzczogdHJ1ZSIpCn0KCmFsbG93X3VzZXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MpIHsKICAgIHBfdXNlciA6PSBwX3Byb2Nlc3MuVXNlcgogICAgaV91c2VyIDo9IGlfcHJvY2Vzcy5Vc2VyCgogICAgcHJpbnQoImFsbG93X3VzZXI6IGlucHV0IHVpZCA9IiwgaV91c2VyLlVJRCwgInBvbGljeSB1aWQgPSIsIHBfdXNlci5VSUQpCiAgICBwX3VzZXIuVUlEID09IGlfdXNlci5VSUQKCiAgICAjIFRPRE86IHRyYWNrIGRvd24gdGhlIHJlYXNvbiBmb3IgcmVnaXN0cnkuazhzLmlvL3BhdXNlOjMuOSBiZWluZwogICAgIyAgICAgICBleGVjdXRlZCB3aXRoIGdpZCA9IDAgZGVzcGl0ZSBoYXZpbmcgIjY1NTM1OjY1NTM1IiBpbiBpdHMgY29udGFpbmVyIGltYWdlCiAgICAjICAgICAgIGNvbmZpZy4KICAgICNwcmludCgiYWxsb3dfdXNlcjogaW5wdXQgZ2lkID0iLCBpX3VzZXIuR0lELCAicG9saWN5IGdpZCA9IiwgcF91c2VyLkdJRCkKICAgICNwX3VzZXIuR0lEID09IGlfdXNlci5HSUQKCiAgICAjIFRPRE86IGNvbXBhcmUgdGhlIGFkZGl0aW9uYWxHaWRzIGZpZWxkIHRvbyBhZnRlciBjb21wdXRpbmcgaXRzIHZhbHVlCiAgICAjIGJhc2VkIG9uIC9ldGMvcGFzc3dkIGFuZCAvZXRjL2dyb3VwIGZyb20gdGhlIGNvbnRhaW5lciBpbWFnZS4KfQoKYWxsb3dfZGVwcmVjYXRlZF9hcmdzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZ3MgMTogbm8gYXJncyIpCgogICAgbm90IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJncwogICAgbm90IGlfcHJvY2Vzcy5BcmdzCgogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAxOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZ3MocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSkgewogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiBwb2xpY3kgYXJncyA9IiwgcF9wcm9jZXNzLkRlcHJlY2F0ZWRBcmdzKQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiBpbnB1dCBhcmdzID0iLCBpX3Byb2Nlc3MuQXJncykKCiAgICBjb3VudChwX3Byb2Nlc3MuRGVwcmVjYXRlZEFyZ3MpID09IGNvdW50KGlfcHJvY2Vzcy5BcmdzKQoKICAgIGV2ZXJ5IGksIGlfYXJnIGluIGlfcHJvY2Vzcy5BcmdzIHsKICAgICAgICBhbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpCiAgICB9CgogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDE6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgcF9hcmcyIDo9IHJlcGxhY2UocF9hcmcsICIkJCIsICIkIikKICAgIHBfYXJnMiA9PSBpX2FyZwoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAxOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDI6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgIyBUT0RPOiBjYW4gJChub2RlLW5hbWUpIGJlIGhhbmRsZWQgYmV0dGVyPwogICAgY29udGFpbnMocF9hcmcsICIkKG5vZGUtbmFtZSkiKQoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAyOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDM6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgcF9hcmcyIDo9IHJlcGxhY2UocF9hcmcsICIkJCIsICIkIikKICAgIHBfYXJnMyA6PSByZXBsYWNlKHBfYXJnMiwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAzOiBwX2FyZzMgPSIsIHBfYXJnMykKICAgIHBfYXJnMyA9PSBpX2FyZwoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAzOiB0cnVlIikKfQoKIyBPQ0kgcHJvY2Vzcy5FbnYgZmllbGQKYWxsb3dfZW52KHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfZW52OiBwIGVudiA9IiwgcF9wcm9jZXNzLkVudikKICAgIHByaW50KCJhbGxvd19lbnY6IGkgZW52ID0iLCBpX3Byb2Nlc3MuRW52KQoKICAgIGV2ZXJ5IGlfdmFyIGluIGlfcHJvY2Vzcy5FbnYgewogICAgICAgIHByaW50KCJhbGxvd19lbnY6IGlfdmFyID0iLCBpX3ZhcikKICAgICAgICBhbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgfQoKICAgIHByaW50KCJhbGxvd19lbnY6IHRydWUiKQp9CgojIEFsbG93IGlucHV0IGVudiB2YXJpYWJsZXMgdGhhdCBhcmUgcHJlc2VudCBpbiB0aGUgcG9saWN5IGRhdGEgdG9vLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHBfdmFyID09IGlfdmFyCiAgICBwcmludCgiYWxsb3dfdmFyIDE6IHRydWUiKQp9CgojIE1hdGNoIGlucHV0IHdpdGggb25lIG9mIHRoZSBwb2xpY3kgdmFyaWFibGVzLCBhZnRlciBzdWJzdGl0dXRpbmcgJChzYW5kYm94LW5hbWUpLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHByaW50KCJhbGxvd192YXIgMjogcF92YXIgPSIsIHBfdmFyKQoKICAgIHBfdmFyX3NwbGl0IDo9IHNwbGl0KHBfdmFyLCAiPSIpCiAgICBjb3VudChwX3Zhcl9zcGxpdCkgPT0gMgoKICAgIHBfdmFyX3NwbGl0WzFdID09ICIkKHNhbmRib3gtbmFtZSkiCgogICAgaV92YXJfc3BsaXQgOj0gc3BsaXQoaV92YXIsICI9IikKICAgIGNvdW50KGlfdmFyX3NwbGl0KSA9PSAyCgogICAgaV92YXJfc3BsaXRbMF0gPT0gcF92YXJfc3BsaXRbMF0KICAgIHJlZ2V4Lm1hdGNoKHNfbmFtZSwgaV92YXJfc3BsaXRbMV0pCgogICAgcHJpbnQoImFsbG93X3ZhciAyOiB0cnVlIikKfQoKIyBBbGxvdyBpbnB1dCBlbnYgdmFyaWFibGVzIHRoYXQgbWF0Y2ggd2l0aCBhIHJlcXVlc3RfZGVmYXVsdHMgcmVnZXguCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHNvbWUgcF9yZWdleDEgaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5DcmVhdGVDb250YWluZXJSZXF1ZXN0LmFsbG93X2Vudl9yZWdleAogICAgcF9yZWdleDIgOj0gcmVwbGFjZShwX3JlZ2V4MSwgIiQoaXB2NF9hKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcHY0X2EpCiAgICBwX3JlZ2V4MyA6PSByZXBsYWNlKHBfcmVnZXgyLCAiJChpcF9wKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcF9wKQogICAgcF9yZWdleDQgOj0gcmVwbGFjZShwX3JlZ2V4MywgIiQoc3ZjX25hbWUpIiwgcG9saWN5X2RhdGEuY29tbW9uLnN2Y19uYW1lKQogICAgcF9yZWdleDUgOj0gcmVwbGFjZShwX3JlZ2V4NCwgIiQoZG5zX2xhYmVsKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5kbnNfbGFiZWwpCgogICAgcHJpbnQoImFsbG93X3ZhciAzOiBwX3JlZ2V4NSA9IiwgcF9yZWdleDUpCiAgICByZWdleC5tYXRjaChwX3JlZ2V4NSwgaV92YXIpCgogICAgcHJpbnQoImFsbG93X3ZhciAzOiB0cnVlIikKfQoKIyBBbGxvdyBmaWVsZFJlZiAiZmllbGRQYXRoOiBzdGF0dXMucG9kSVAiIHZhbHVlcy4KYWxsb3dfdmFyKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBpX3Zhciwgc19uYW1lLCBzX25hbWVzcGFjZSkgewogICAgbmFtZV92YWx1ZSA6PSBzcGxpdChpX3ZhciwgIj0iKQogICAgY291bnQobmFtZV92YWx1ZSkgPT0gMgogICAgaXNfaXAobmFtZV92YWx1ZVsxXSkKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIGFsbG93X3BvZF9pcF92YXIobmFtZV92YWx1ZVswXSwgcF92YXIpCgogICAgcHJpbnQoImFsbG93X3ZhciA0OiB0cnVlIikKfQoKIyBBbGxvdyBjb21tb24gZmllbGRSZWYgdmFyaWFibGVzLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBuYW1lX3ZhbHVlIDo9IHNwbGl0KGlfdmFyLCAiPSIpCiAgICBjb3VudChuYW1lX3ZhbHVlKSA9PSAyCgogICAgc29tZSBwX3ZhciBpbiBwX3Byb2Nlc3MuRW52CiAgICBwX25hbWVfdmFsdWUgOj0gc3BsaXQocF92YXIsICI9IikKICAgIGNvdW50KHBfbmFtZV92YWx1ZSkgPT0gMgoKICAgIHBfbmFtZV92YWx1ZVswXSA9PSBuYW1lX3ZhbHVlWzBdCgogICAgIyBUT0RPOiBzaG91bGQgdGhlc2UgYmUgaGFuZGxlZCBpbiBhIGRpZmZlcmVudCB3YXk/CiAgICBhbHdheXNfYWxsb3dlZCA6PSBbIiQoaG9zdC1uYW1lKSIsICIkKG5vZGUtbmFtZSkiLCAiJChwb2QtdWlkKSJdCiAgICBzb21lIGFsbG93ZWQgaW4gYWx3YXlzX2FsbG93ZWQKICAgIGNvbnRhaW5zKHBfbmFtZV92YWx1ZVsxXSwgYWxsb3dlZCkKCiAgICBwcmludCgiYWxsb3dfdmFyIDU6IHRydWUiKQp9CgojIEFsbG93IGZpZWxkUmVmICJmaWVsZFBhdGg6IHN0YXR1cy5ob3N0SVAiIHZhbHVlcy4KYWxsb3dfdmFyKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBpX3Zhciwgc19uYW1lLCBzX25hbWVzcGFjZSkgewogICAgbmFtZV92YWx1ZSA6PSBzcGxpdChpX3ZhciwgIj0iKQogICAgY291bnQobmFtZV92YWx1ZSkgPT0gMgogICAgaXNfaXAobmFtZV92YWx1ZVsxXSkKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIGFsbG93X2hvc3RfaXBfdmFyKG5hbWVfdmFsdWVbMF0sIHBfdmFyKQoKICAgIHByaW50KCJhbGxvd192YXIgNjogdHJ1ZSIpCn0KCiMgQWxsb3cgcmVzb3VyY2VGaWVsZFJlZiB2YWx1ZXMgKGUuZy4sICJsaW1pdHMuY3B1IikuCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIG5hbWVfdmFsdWUgOj0gc3BsaXQoaV92YXIsICI9IikKICAgIGNvdW50KG5hbWVfdmFsdWUpID09IDIKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHBfbmFtZV92YWx1ZSA6PSBzcGxpdChwX3ZhciwgIj0iKQogICAgY291bnQocF9uYW1lX3ZhbHVlKSA9PSAyCgogICAgcF9uYW1lX3ZhbHVlWzBdID09IG5hbWVfdmFsdWVbMF0KCiAgICAjIGEgdmFyaWFibGUgd2Ugc2hvdWxkIGJlIHZhbGlkYXRpbmcgdXNpbmcgYSByZWdleCBmcm9tIHNldHRpbmdzCiAgICBwX25hbWVfdmFsdWVbMV0gPT0gIiQodmFsaWRhdGUtZnJvbS1zZXR0aW5ncykiCgogICAgcmVnZXhfdmFsIDo9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuQ3JlYXRlQ29udGFpbmVyUmVxdWVzdC5hbGxvd19lbnZfcmVnZXhfbWFwW25hbWVfdmFsdWVbMF1dCgogICAgcHJpbnQoImFsbG93X3ZhciA3OiB2YWwgPSIsIG5hbWVfdmFsdWVbMV0pCiAgICBwcmludCgiYWxsb3dfdmFyIDc6IHJlZ2V4X3ZhbCA9IiwgcmVnZXhfdmFsKQoKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4X3ZhbCwgbmFtZV92YWx1ZVsxXSkKCiAgICBwcmludCgiYWxsb3dfdmFyIDc6IHRydWUiKQp9CgojIE1hdGNoIGlucHV0IHdpdGggb25lIG9mIHRoZSBwb2xpY3kgdmFyaWFibGVzLCBhZnRlciBzdWJzdGl0dXRpbmcgJChzYW5kYm94LW5hbWVzcGFjZSkuCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHNvbWUgcF92YXIgaW4gcF9wcm9jZXNzLkVudgogICAgcF92YXIyIDo9IHJlcGxhY2UocF92YXIsICIkKHNhbmRib3gtbmFtZXNwYWNlKSIsIHNfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd192YXIgODogcF92YXIyID0iLCBwX3ZhcjIpCiAgICBwX3ZhcjIgPT0gaV92YXIKCiAgICBwcmludCgiYWxsb3dfdmFyIDg6IHRydWUiKQp9CgphbGxvd19wb2RfaXBfdmFyKHZhcl9uYW1lLCBwX3ZhcikgewogICAgcHJpbnQoImFsbG93X3BvZF9pcF92YXI6IHZhcl9uYW1lID0iLCB2YXJfbmFtZSwgInBfdmFyID0iLCBwX3ZhcikKCiAgICBwX25hbWVfdmFsdWUgOj0gc3BsaXQocF92YXIsICI9IikKICAgIGNvdW50KHBfbmFtZV92YWx1ZSkgPT0gMgoKICAgIHBfbmFtZV92YWx1ZVswXSA9PSB2YXJfbmFtZQogICAgcF9uYW1lX3ZhbHVlWzFdID09ICIkKHBvZC1pcCkiCgogICAgcHJpbnQoImFsbG93X3BvZF9pcF92YXI6IHRydWUiKQp9CgphbGxvd19ob3N0X2lwX3Zhcih2YXJfbmFtZSwgcF92YXIpIHsKICAgIHByaW50KCJhbGxvd19ob3N0X2lwX3ZhcjogdmFyX25hbWUgPSIsIHZhcl9uYW1lLCAicF92YXIgPSIsIHBfdmFyKQoKICAgIHBfbmFtZV92YWx1ZSA6PSBzcGxpdChwX3ZhciwgIj0iKQogICAgY291bnQocF9uYW1lX3ZhbHVlKSA9PSAyCgogICAgcF9uYW1lX3ZhbHVlWzBdID09IHZhcl9uYW1lCiAgICBwX25hbWVfdmFsdWVbMV0gPT0gIiQoaG9zdC1pcCkiCgogICAgcHJpbnQoImFsbG93X2hvc3RfaXBfdmFyOiB0cnVlIikKfQoKaXNfaXAodmFsdWUpIHsKICAgIGJ5dGVzID0gc3BsaXQodmFsdWUsICIuIikKICAgIGNvdW50KGJ5dGVzKSA9PSA0CgogICAgaXNfaXBfZmlyc3RfYnl0ZShieXRlc1swXSkKICAgIGlzX2lwX290aGVyX2J5dGUoYnl0ZXNbMV0pCiAgICBpc19pcF9vdGhlcl9ieXRlKGJ5dGVzWzJdKQogICAgaXNfaXBfb3RoZXJfYnl0ZShieXRlc1szXSkKfQppc19pcF9maXJzdF9ieXRlKGNvbXBvbmVudCkgewogICAgbnVtYmVyID0gdG9fbnVtYmVyKGNvbXBvbmVudCkKICAgIG51bWJlciA+PSAxCiAgICBudW1iZXIgPD0gMjU1Cn0KaXNfaXBfb3RoZXJfYnl0ZShjb21wb25lbnQpIHsKICAgIG51bWJlciA9IHRvX251bWJlcihjb21wb25lbnQpCiAgICBudW1iZXIgPj0gMAogICAgbnVtYmVyIDw9IDI1NQp9CgojIE9DSSByb290LlBhdGgKYWxsb3dfcm9vdF9wYXRoKHBfb2NpLCBpX29jaSwgYnVuZGxlX2lkKSB7CiAgICBpX3BhdGggOj0gaV9vY2kuUm9vdC5QYXRoCiAgICBwX3BhdGgxIDo9IHBfb2NpLlJvb3QuUGF0aAogICAgcHJpbnQoImFsbG93X3Jvb3RfcGF0aDogaV9wYXRoID0iLCBpX3BhdGgsICJwX3BhdGgxID0iLCBwX3BhdGgxKQoKICAgIHBfcGF0aDIgOj0gcmVwbGFjZShwX3BhdGgxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfcm9vdF9wYXRoOiBwX3BhdGgyID0iLCBwX3BhdGgyKQoKICAgIHBfcGF0aDMgOj0gcmVwbGFjZShwX3BhdGgyLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X3Jvb3RfcGF0aDogcF9wYXRoMyA9IiwgcF9wYXRoMykKCiAgICBwX3BhdGgzID09IGlfcGF0aAoKICAgIHByaW50KCJhbGxvd19yb290X3BhdGg6IHRydWUiKQp9CgojIGRldmljZSBtb3VudHMKYWxsb3dfbW91bnQocF9vY2ksIGlfbW91bnQsIGlfc3RvcmFnZXMsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcHJpbnQoImFsbG93X21vdW50OiBpX21vdW50ID0iLCBpX21vdW50KQoKICAgIHNvbWUgcF9tb3VudCBpbiBwX29jaS5Nb3VudHMKICAgIHNvbWUgaV9zdG9yYWdlIGluIGlfc3RvcmFnZXMKCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IHBfbW91bnQgPSIsIHBfbW91bnQpCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IGlfc3RvcmFnZSA9IiwgaV9zdG9yYWdlKQoKICAgIGNoZWNrX21vdW50KHBfbW91bnQsIGlfbW91bnQsIGlfc3RvcmFnZSwgYnVuZGxlX2lkLCBzYW5kYm94X2lkKQoKICAgICMgVE9ETzogYXJlIHRoZXJlIGFueSBvdGhlciByZXF1aXJlZCBwb2xpY3kgY2hlY2tzIGZvciBtb3VudHMgLSBlLmcuLAogICAgIyAgICAgICBtdWx0aXBsZSBtb3VudHMgd2l0aCBzYW1lIHNvdXJjZSBvciBkZXN0aW5hdGlvbj8KCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IHRydWUiKQp9CgpjaGVja19tb3VudChwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcF9tb3VudCA9PSBpX21vdW50CiAgICBwcmludCgiY2hlY2tfbW91bnQgMTogdHJ1ZSIpCn0KY2hlY2tfbW91bnQocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHBfbW91bnQuZGVzdGluYXRpb24gPT0gaV9tb3VudC5kZXN0aW5hdGlvbgogICAgcF9tb3VudC50eXBlXyA9PSBpX21vdW50LnR5cGVfCiAgICBwX21vdW50Lm9wdGlvbnMgPT0gaV9tb3VudC5vcHRpb25zCgogICAgbW91bnRfc291cmNlX2FsbG93cyhwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkKCiAgICBwcmludCgiY2hlY2tfbW91bnQgMjogdHJ1ZSIpCn0KCm1vdW50X3NvdXJjZV9hbGxvd3MocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHJlZ2V4MSA6PSBwX21vdW50LnNvdXJjZQogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5tb3VudF9zb3VyY2VfY3BhdGgpCiAgICByZWdleDQgOj0gcmVwbGFjZShyZWdleDMsICIkKGJ1bmRsZS1pZCkiLCBidW5kbGVfaWQpCgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMTogcmVnZXg0ID0iLCByZWdleDQpCiAgICByZWdleC5tYXRjaChyZWdleDQsIGlfbW91bnQuc291cmNlKQoKICAgIHByaW50KCJtb3VudF9zb3VyY2VfYWxsb3dzIDE6IHRydWUiKQp9Cm1vdW50X3NvdXJjZV9hbGxvd3MocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHJlZ2V4MSA6PSBwX21vdW50LnNvdXJjZQogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5tb3VudF9zb3VyY2VfY3BhdGgpCiAgICByZWdleDQgOj0gcmVwbGFjZShyZWdleDMsICIkKHNhbmRib3gtaWQpIiwgc2FuZGJveF9pZCkKCiAgICBwcmludCgibW91bnRfc291cmNlX2FsbG93cyAyOiByZWdleDQgPSIsIHJlZ2V4NCkKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4NCwgaV9tb3VudC5zb3VyY2UpCgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMjogdHJ1ZSIpCn0KbW91bnRfc291cmNlX2FsbG93cyhwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogaV9tb3VudC5zb3VyY2UgPSIsIGlfbW91bnQuc291cmNlKQogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogaV9zdG9yYWdlLm1vdW50X3BvaW50ID0iLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCgogICAgaV9tb3VudC5zb3VyY2UgPT0gaV9zdG9yYWdlLm1vdW50X3BvaW50CgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogdHJ1ZSIpCn0KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBDcmVhdGUgY29udGFpbmVyIFN0b3JhZ2VzCgphbGxvd19zdG9yYWdlcyhwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHBfY291bnQgOj0gY291bnQocF9zdG9yYWdlcykKICAgIGlfY291bnQgOj0gY291bnQoaV9zdG9yYWdlcykKICAgIHByaW50KCJhbGxvd19zdG9yYWdlczogcF9jb3VudCA9IiwgcF9jb3VudCwgImlfY291bnQgPSIsIGlfY291bnQpCgogICAgcF9jb3VudCA9PSBpX2NvdW50CgogICAgIyBHZXQgdGhlIGNvbnRhaW5lciBpbWFnZSBsYXllciBJRHMgYW5kIHZlcml0eSByb290IGhhc2hlcywgZnJvbSB0aGUgIm92ZXJsYXlmcyIgc3RvcmFnZS4KICAgIHNvbWUgb3ZlcmxheV9zdG9yYWdlIGluIHBfc3RvcmFnZXMKICAgIG92ZXJsYXlfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIHByaW50KCJhbGxvd19zdG9yYWdlczogb3ZlcmxheV9zdG9yYWdlID0iLCBvdmVybGF5X3N0b3JhZ2UpCiAgICBjb3VudChvdmVybGF5X3N0b3JhZ2Uub3B0aW9ucykgPT0gMgoKICAgIGxheWVyX2lkcyA6PSBzcGxpdChvdmVybGF5X3N0b3JhZ2Uub3B0aW9uc1swXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiBsYXllcl9pZHMgPSIsIGxheWVyX2lkcykKCiAgICByb290X2hhc2hlcyA6PSBzcGxpdChvdmVybGF5X3N0b3JhZ2Uub3B0aW9uc1sxXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiByb290X2hhc2hlcyA9Iiwgcm9vdF9oYXNoZXMpCgogICAgZXZlcnkgaV9zdG9yYWdlIGluIGlfc3RvcmFnZXMgewogICAgICAgIGFsbG93X3N0b3JhZ2UocF9zdG9yYWdlcywgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpCiAgICB9CgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiB0cnVlIikKfQoKYWxsb3dfc3RvcmFnZShwX3N0b3JhZ2VzLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgc29tZSBwX3N0b3JhZ2UgaW4gcF9zdG9yYWdlcwoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiBwX3N0b3JhZ2UgPSIsIHBfc3RvcmFnZSkKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiBpX3N0b3JhZ2UgPSIsIGlfc3RvcmFnZSkKCiAgICBwX3N0b3JhZ2UuZHJpdmVyICAgICAgICAgICA9PSBpX3N0b3JhZ2UuZHJpdmVyCiAgICBwX3N0b3JhZ2UuZHJpdmVyX29wdGlvbnMgICA9PSBpX3N0b3JhZ2UuZHJpdmVyX29wdGlvbnMKICAgIHBfc3RvcmFnZS5mc19ncm91cCAgICAgICAgID09IGlfc3RvcmFnZS5mc19ncm91cAogICAgcF9zdG9yYWdlLmZzdHlwZSAgICAgICAgICAgPT0gaV9zdG9yYWdlLmZzdHlwZQoKICAgIGFsbG93X3N0b3JhZ2Vfc291cmNlKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKQogICAgYWxsb3dfc3RvcmFnZV9vcHRpb25zKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKQogICAgYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKQoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiB0cnVlIikKfQoKYWxsb3dfc3RvcmFnZV9zb3VyY2UocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX3NvdXJjZSAxOiBzdGFydCIpCgogICAgcF9zdG9yYWdlLnNvdXJjZSA9PSBpX3N0b3JhZ2Uuc291cmNlCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDE6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX3NvdXJjZShwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDI6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCgogICAgIyBEREREOkJCOkRELkY6IERvbWFpbjpCdXM6RGV2aWNlLkZ1bmN0aW9uCiAgICAjIGh0dHBzOi8vd3d3Lmtlcm5lbC5vcmcvZG9jL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtYnVzLXBjaQogICAgcmVnZXgubWF0Y2goYF5bYS1mMC05XXs0fTpbYS1mMC05XXsyfTpbYS1mMC05XXsyfVwuW2EtZjAtOV0kYCwgaV9zdG9yYWdlLnNvdXJjZSkKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9zb3VyY2UgMjogdHJ1ZSIpCn0KCmFsbG93X3N0b3JhZ2Vfc291cmNlKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKSB7CiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9zb3VyY2UgMzogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIGlfc3RvcmFnZS5zb3VyY2UgPT0gIm5vbmUiCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDM6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX3NvdXJjZShwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDQ6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJzbWIiCgogICAgIyBQYXR0ZXJuOiAvLzxzdG9yYWdlLWFjY291bnQtbmFtZT4uZmlsZS5jb3JlLndpbmRvd3MubmV0LzxrOHMtUFZDLW5hbWU+CiAgICAjIFN0b3JhZ2UgYWNjb3VudCBuYW1lOiBodHRwczovL2xlYXJuLm1pY3Jvc29mdC5jb20vZW4tdXMvYXp1cmUvc3RvcmFnZS9jb21tb24vc3RvcmFnZS1hY2NvdW50LW92ZXJ2aWV3I3N0b3JhZ2UtYWNjb3VudC1uYW1lCiAgICAjIEs4cyBQVkMgbmFtZTogaHR0cHM6Ly9rdWJlcm5ldGVzLmlvL2RvY3MvY29uY2VwdHMvb3ZlcnZpZXcvd29ya2luZy13aXRoLW9iamVjdHMvbmFtZXMvI2Rucy1zdWJkb21haW4tbmFtZXMKICAgIHJlZ2V4Lm1hdGNoKGBeXC9cLyhbYS16MC05XXszLDI0fSlcLmZpbGVcLmNvcmVcLndpbmRvd3NcLm5ldFwvW2EtejAtOV0oW2EtejAtOS4tXXswLDI1MX1bYS16MC05XSk/JGAsIGlfc3RvcmFnZS5zb3VyY2UpCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDQ6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMTogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgIT0gIm92ZXJsYXlmcyIKICAgIHBfc3RvcmFnZS5vcHRpb25zID09IGlfc3RvcmFnZS5vcHRpb25zCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAxOiB0cnVlIikKfQphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIGNvdW50KHBfc3RvcmFnZS5vcHRpb25zKSA9PSAyCgogICAgcG9saWN5X2lkcyA6PSBzcGxpdChwX3N0b3JhZ2Uub3B0aW9uc1swXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBwb2xpY3lfaWRzID0iLCBwb2xpY3lfaWRzKQogICAgcG9saWN5X2lkcyA9PSBsYXllcl9pZHMKCiAgICBwb2xpY3lfaGFzaGVzIDo9IHNwbGl0KHBfc3RvcmFnZS5vcHRpb25zWzFdLCAiOiIpCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IHBvbGljeV9oYXNoZXMgPSIsIHBvbGljeV9oYXNoZXMpCgogICAgcF9jb3VudCA6PSBjb3VudChwb2xpY3lfaWRzKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBwX2NvdW50ID0iLCBwX2NvdW50KQogICAgcF9jb3VudCA+PSAxCiAgICBwX2NvdW50ID09IGNvdW50KHBvbGljeV9oYXNoZXMpCgogICAgaV9jb3VudCA6PSBjb3VudChpX3N0b3JhZ2Uub3B0aW9ucykKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogaV9jb3VudCA9IiwgaV9jb3VudCkKICAgIGlfY291bnQgPT0gcF9jb3VudCArIDMKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zWzBdID0iLCBpX3N0b3JhZ2Uub3B0aW9uc1swXSkKICAgIGlfc3RvcmFnZS5vcHRpb25zWzBdID09ICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQubGF5ZXItc3JjLXByZWZpeD0vdmFyL2xpYi9jb250YWluZXJkL2lvLmNvbnRhaW5lcmQuc25hcHNob3R0ZXIudjEudGFyZGV2L2xheWVycyIKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zW2lfY291bnQgLSAyXSA9IiwgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDJdKQogICAgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDJdID09ICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQub3ZlcmxheS1ydyIKCiAgICBsb3dlcmRpciA6PSBjb25jYXQoIj0iLCBbImxvd2VyZGlyIiwgcF9zdG9yYWdlLm9wdGlvbnNbMF1dKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBsb3dlcmRpciA9IiwgbG93ZXJkaXIpCgogICAgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDFdID09IGxvd2VyZGlyCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zW2lfY291bnQgLSAxXSA9IiwgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDFdKQoKICAgIGV2ZXJ5IGksIHBvbGljeV9pZCBpbiBwb2xpY3lfaWRzIHsKICAgICAgICBhbGxvd19vdmVybGF5X2xheWVyKHBvbGljeV9pZCwgcG9saWN5X2hhc2hlc1tpXSwgaV9zdG9yYWdlLm9wdGlvbnNbaSArIDFdKQogICAgfQoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogdHJ1ZSIpCn0KYWxsb3dfc3RvcmFnZV9vcHRpb25zKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKSB7CiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDM6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCiAgICBjb3VudChwX3N0b3JhZ2Uub3B0aW9ucykgPT0gMQoKICAgIHN0YXJ0c3dpdGgocF9zdG9yYWdlLm9wdGlvbnNbMF0sICIkKGhhc2giKQogICAgaGFzaF9zdWZmaXggOj0gdHJpbV9sZWZ0KHBfc3RvcmFnZS5vcHRpb25zWzBdLCAiJChoYXNoIikKCiAgICBlbmRzd2l0aChoYXNoX3N1ZmZpeCwgIikiKQogICAgaGFzaF9pbmRleCA6PSB0cmltX3JpZ2h0KGhhc2hfc3VmZml4LCAiKSIpCiAgICBpIDo9IHRvX251bWJlcihoYXNoX2luZGV4KQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAzOiBpID0iLCBpKQoKICAgIGhhc2hfb3B0aW9uIDo9IGNvbmNhdCgiPSIsIFsiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LnJvb3QtaGFzaCIsIHJvb3RfaGFzaGVzW2ldXSkKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMzogaGFzaF9vcHRpb24gPSIsIGhhc2hfb3B0aW9uKQoKICAgIGNvdW50KGlfc3RvcmFnZS5vcHRpb25zKSA9PSA0CiAgICBpX3N0b3JhZ2Uub3B0aW9uc1swXSA9PSAicm8iCiAgICBpX3N0b3JhZ2Uub3B0aW9uc1sxXSA9PSAiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmJsb2NrX2RldmljZT1maWxlIgogICAgaV9zdG9yYWdlLm9wdGlvbnNbMl0gPT0gImlvLmthdGFjb250YWluZXJzLmZzLW9wdC5pcy1sYXllciIKICAgIGlfc3RvcmFnZS5vcHRpb25zWzNdID09IGhhc2hfb3B0aW9uCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAzOiB0cnVlIikKfQphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgNDogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gInNtYiIKICAgIHBfb3B0c19jb3VudCA6PSBjb3VudChwX3N0b3JhZ2Uub3B0aW9ucykKICAgIGlfb3B0c19jb3VudCA6PSBjb3VudChpX3N0b3JhZ2Uub3B0aW9ucykKICAgIGlfb3B0c19jb3VudCA9PSBwX29wdHNfY291bnQgKyAyCgogICAgaV9vcHRfbWF0Y2hlcyA6PSBbaSB8IGkgOj0gaWR4OyBpZHggPCBwX29wdHNfY291bnQ7IHBfc3RvcmFnZS5vcHRpb25zW2lkeF0gPT0gaV9zdG9yYWdlLm9wdGlvbnNbaWR4XV0KICAgIGNvdW50KGlfb3B0X21hdGNoZXMpID09IHBfb3B0c19jb3VudAoKICAgIHN0YXJ0c3dpdGgoaV9zdG9yYWdlLm9wdGlvbnNbaV9vcHRzX2NvdW50LTJdLCAiYWRkcj0iKQogICAgY3JlZHMgPSBzcGxpdChpX3N0b3JhZ2Uub3B0aW9uc1tpX29wdHNfY291bnQtMV0sICIsIikKICAgIGNvdW50KGNyZWRzKSA9PSAyCiAgICBzdGFydHN3aXRoKGNyZWRzWzBdLCAidXNlcm5hbWU9IikKICAgIHN0YXJ0c3dpdGgoY3JlZHNbMV0sICJwYXNzd29yZD0iKQogICAgCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDQ6IHRydWUiKQp9CgphbGxvd19vdmVybGF5X2xheWVyKHBvbGljeV9pZCwgcG9saWN5X2hhc2gsIGlfb3B0aW9uKSB7CiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogcG9saWN5X2lkID0iLCBwb2xpY3lfaWQsICJwb2xpY3lfaGFzaCA9IiwgcG9saWN5X2hhc2gpCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogaV9vcHRpb24gPSIsIGlfb3B0aW9uKQoKICAgIHN0YXJ0c3dpdGgoaV9vcHRpb24sICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQubGF5ZXI9IikKICAgIGlfdmFsdWUgOj0gcmVwbGFjZShpX29wdGlvbiwgImlvLmthdGFjb250YWluZXJzLmZzLW9wdC5sYXllcj0iLCAiIikKICAgIGlfdmFsdWVfZGVjb2RlZCA6PSBiYXNlNjQuZGVjb2RlKGlfdmFsdWUpCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogaV92YWx1ZV9kZWNvZGVkID0iLCBpX3ZhbHVlX2RlY29kZWQpCgogICAgcG9saWN5X3N1ZmZpeCA6PSBjb25jYXQoIj0iLCBbInRhcixybyxpby5rYXRhY29udGFpbmVycy5mcy1vcHQuYmxvY2tfZGV2aWNlPWZpbGUsaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmlzLWxheWVyLGlvLmthdGFjb250YWluZXJzLmZzLW9wdC5yb290LWhhc2giLCBwb2xpY3lfaGFzaF0pCiAgICBwX3ZhbHVlIDo9IGNvbmNhdCgiLCIsIFtwb2xpY3lfaWQsIHBvbGljeV9zdWZmaXhdKQogICAgcHJpbnQoImFsbG93X292ZXJsYXlfbGF5ZXI6IHBfdmFsdWUgPSIsIHBfdmFsdWUpCgogICAgcF92YWx1ZSA9PSBpX3ZhbHVlX2RlY29kZWQKCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogdHJ1ZSIpCn0KCmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAidGFyIgoKICAgIHN0YXJ0c3dpdGgocF9zdG9yYWdlLm1vdW50X3BvaW50LCAiJChsYXllciIpCiAgICBtb3VudF9zdWZmaXggOj0gdHJpbV9sZWZ0KHBfc3RvcmFnZS5tb3VudF9wb2ludCwgIiQobGF5ZXIiKQoKICAgIGVuZHN3aXRoKG1vdW50X3N1ZmZpeCwgIikiKQogICAgbGF5ZXJfaW5kZXggOj0gdHJpbV9yaWdodChtb3VudF9zdWZmaXgsICIpIikKICAgIGkgOj0gdG9fbnVtYmVyKGxheWVyX2luZGV4KQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDE6IGkgPSIsIGkpCgogICAgbGF5ZXJfaWQgOj0gbGF5ZXJfaWRzW2ldCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMTogbGF5ZXJfaWQgPSIsIGxheWVyX2lkKQoKICAgIHBfbW91bnQgOj0gY29uY2F0KCIvIiwgWyIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L2xheWVycyIsIGxheWVyX2lkXSkKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCAxOiBwX21vdW50ID0iLCBwX21vdW50KQoKICAgIHBfbW91bnQgPT0gaV9zdG9yYWdlLm1vdW50X3BvaW50CgogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDE6IHRydWUiKQp9CmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAiZnVzZTMua2F0YS1vdmVybGF5IgoKICAgIG1vdW50MSA6PSByZXBsYWNlKHBfc3RvcmFnZS5tb3VudF9wb2ludCwgIiQoY3BhdGgpIiwgcG9saWN5X2RhdGEuY29tbW9uLmNwYXRoKQogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDI6IG1vdW50MiA9IiwgbW91bnQyKQoKICAgIG1vdW50MiA9PSBpX3N0b3JhZ2UubW91bnRfcG9pbnQKCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMjogdHJ1ZSIpCn0KYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKSB7CiAgICBwX3N0b3JhZ2UuZnN0eXBlID09ICJsb2NhbCIKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQyID0iLCBtb3VudDIpCgogICAgbW91bnQzIDo9IHJlcGxhY2UobW91bnQyLCAiJChzYW5kYm94LWlkKSIsIHNhbmRib3hfaWQpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQzID0iLCBtb3VudDMpCgogICAgcmVnZXgubWF0Y2gobW91bnQzLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCgogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDM6IHRydWUiKQp9CmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAiYmluZCIKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNDogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNDogbW91bnQyID0iLCBtb3VudDIpCgogICAgbW91bnQzIDo9IHJlcGxhY2UobW91bnQyLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDQ6IG1vdW50MyA9IiwgbW91bnQzKQoKICAgIHJlZ2V4Lm1hdGNoKG1vdW50MywgaV9zdG9yYWdlLm1vdW50X3BvaW50KQoKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA0OiB0cnVlIikKfQphbGxvd19tb3VudF9wb2ludChwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgYnVuZGxlX2lkLCBzYW5kYm94X2lkLCBsYXllcl9pZHMpIHsKICAgIHBfc3RvcmFnZS5mc3R5cGUgPT0gInRtcGZzIgoKICAgIG1vdW50MSA6PSBwX3N0b3JhZ2UubW91bnRfcG9pbnQKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA1OiBtb3VudDEgPSIsIG1vdW50MSkKCiAgICByZWdleC5tYXRjaChtb3VudDEsIGlfc3RvcmFnZS5tb3VudF9wb2ludCkKCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNTogdHJ1ZSIpCn0KYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKSB7CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogaV9zdG9yYWdlLm1vdW50X3BvaW50ID0iLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCiAgICBhbGxvd19kaXJlY3Rfdm9sX2RyaXZlcihwX3N0b3JhZ2UsIGlfc3RvcmFnZSkKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChzcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQyID0iLCBtb3VudDIpCgogICAgZGlyZWN0X3ZvbF9wYXRoIDo9IGlfc3RvcmFnZS5zb3VyY2UKICAgIG1vdW50MyA6PSByZXBsYWNlKG1vdW50MiwgIiQoYjY0LWRpcmVjdC12b2wtcGF0aCkiLCBiYXNlNjR1cmwuZW5jb2RlKGRpcmVjdF92b2xfcGF0aCkpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQzID0iLCBtb3VudDMpCgogICAgbW91bnQzID09IGlfc3RvcmFnZS5tb3VudF9wb2ludAoKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA2OiB0cnVlIikKfQoKYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIocF9zdG9yYWdlLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19kaXJlY3Rfdm9sX2RyaXZlciAxOiBzdGFydCIpCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCiAgICBwcmludCgiYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIgMTogdHJ1ZSIpCn0KYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIocF9zdG9yYWdlLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19kaXJlY3Rfdm9sX2RyaXZlciAyOiBzdGFydCIpCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJzbWIiCiAgICBwcmludCgiYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIgMjogdHJ1ZSIpCn0KCiMgRXhlY1Byb2Nlc3NSZXF1ZXN0LnByb2Nlc3MuQ2FwYWJpbGl0aWVzCmFsbG93X2V4ZWNfY2FwcyhpX2NhcHMpIHsKICAgIG5vdCBpX2NhcHMuQW1iaWVudAogICAgbm90IGlfY2Fwcy5Cb3VuZGluZwogICAgbm90IGlfY2Fwcy5FZmZlY3RpdmUKICAgIG5vdCBpX2NhcHMuSW5oZXJpdGFibGUKICAgIG5vdCBpX2NhcHMuUGVybWl0dGVkCn0KCiMgT0NJLlByb2Nlc3MuQ2FwYWJpbGl0aWVzCmFsbG93X2NhcHMocF9jYXBzLCBpX2NhcHMpIHsKICAgIHByaW50KCJhbGxvd19jYXBzOiBwb2xpY3kgQW1iaWVudCA9IiwgcF9jYXBzLkFtYmllbnQpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgQW1iaWVudCA9IiwgaV9jYXBzLkFtYmllbnQpCiAgICBtYXRjaF9jYXBzKHBfY2Fwcy5BbWJpZW50LCBpX2NhcHMuQW1iaWVudCkKCiAgICBwcmludCgiYWxsb3dfY2FwczogcG9saWN5IEJvdW5kaW5nID0iLCBwX2NhcHMuQm91bmRpbmcpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgQm91bmRpbmcgPSIsIGlfY2Fwcy5Cb3VuZGluZykKICAgIG1hdGNoX2NhcHMocF9jYXBzLkJvdW5kaW5nLCBpX2NhcHMuQm91bmRpbmcpCgogICAgcHJpbnQoImFsbG93X2NhcHM6IHBvbGljeSBFZmZlY3RpdmUgPSIsIHBfY2Fwcy5FZmZlY3RpdmUpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgRWZmZWN0aXZlID0iLCBpX2NhcHMuRWZmZWN0aXZlKQogICAgbWF0Y2hfY2FwcyhwX2NhcHMuRWZmZWN0aXZlLCBpX2NhcHMuRWZmZWN0aXZlKQoKICAgIHByaW50KCJhbGxvd19jYXBzOiBwb2xpY3kgSW5oZXJpdGFibGUgPSIsIHBfY2Fwcy5Jbmhlcml0YWJsZSkKICAgIHByaW50KCJhbGxvd19jYXBzOiBpbnB1dCBJbmhlcml0YWJsZSA9IiwgaV9jYXBzLkluaGVyaXRhYmxlKQogICAgbWF0Y2hfY2FwcyhwX2NhcHMuSW5oZXJpdGFibGUsIGlfY2Fwcy5Jbmhlcml0YWJsZSkKCiAgICBwcmludCgiYWxsb3dfY2FwczogcG9saWN5IFBlcm1pdHRlZCA9IiwgcF9jYXBzLlBlcm1pdHRlZCkKICAgIHByaW50KCJhbGxvd19jYXBzOiBpbnB1dCBQZXJtaXR0ZWQgPSIsIGlfY2Fwcy5QZXJtaXR0ZWQpCiAgICBtYXRjaF9jYXBzKHBfY2Fwcy5QZXJtaXR0ZWQsIGlfY2Fwcy5QZXJtaXR0ZWQpCn0KCm1hdGNoX2NhcHMocF9jYXBzLCBpX2NhcHMpIHsKICAgIHByaW50KCJtYXRjaF9jYXBzIDE6IHN0YXJ0IikKCiAgICBwX2NhcHMgPT0gaV9jYXBzCgogICAgcHJpbnQoIm1hdGNoX2NhcHMgMTogdHJ1ZSIpCn0KbWF0Y2hfY2FwcyhwX2NhcHMsIGlfY2FwcykgewogICAgcHJpbnQoIm1hdGNoX2NhcHMgMjogc3RhcnQiKQoKICAgIGNvdW50KHBfY2FwcykgPT0gMQogICAgcF9jYXBzWzBdID09ICIkKGRlZmF1bHRfY2FwcykiCgogICAgcHJpbnQoIm1hdGNoX2NhcHMgMjogZGVmYXVsdF9jYXBzID0iLCBwb2xpY3lfZGF0YS5jb21tb24uZGVmYXVsdF9jYXBzKQogICAgcG9saWN5X2RhdGEuY29tbW9uLmRlZmF1bHRfY2FwcyA9PSBpX2NhcHMKCiAgICBwcmludCgibWF0Y2hfY2FwcyAyOiB0cnVlIikKfQptYXRjaF9jYXBzKHBfY2FwcywgaV9jYXBzKSB7CiAgICBwcmludCgibWF0Y2hfY2FwcyAzOiBzdGFydCIpCgogICAgY291bnQocF9jYXBzKSA9PSAxCiAgICBwX2NhcHNbMF0gPT0gIiQocHJpdmlsZWdlZF9jYXBzKSIKCiAgICBwcmludCgibWF0Y2hfY2FwcyAzOiBwcml2aWxlZ2VkX2NhcHMgPSIsIHBvbGljeV9kYXRhLmNvbW1vbi5wcml2aWxlZ2VkX2NhcHMpCiAgICBwb2xpY3lfZGF0YS5jb21tb24ucHJpdmlsZWdlZF9jYXBzID09IGlfY2FwcwoKICAgIHByaW50KCJtYXRjaF9jYXBzIDM6IHRydWUiKQp9CgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgpjaGVja19kaXJlY3RvcnlfdHJhdmVyc2FsKGlfcGF0aCkgewogICAgbm90IHJlZ2V4Lm1hdGNoKCIoXnwvKS4uKCR8LykiLCBpX3BhdGgpCn0KCmNoZWNrX3N5bWxpbmtfc291cmNlKGlfc3JjKSB7CiAgICBpX3NyYyA9PSAiIgogICAgcHJpbnQoImNoZWNrX3N5bWxpbmtfc291cmNlIDE6IHRydWUiKQp9CmNoZWNrX3N5bWxpbmtfc291cmNlKGlfc3JjKSB7CiAgICBpX3NyYyAhPSAiIgogICAgcHJpbnQoImNoZWNrX3N5bWxpbmtfc291cmNlIDI6IGlfc3JjID0iLCBpX3NyYykKCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24uc19zb3VyY2UxLCBpX3NyYykKCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMjogdHJ1ZSIpCn0KY2hlY2tfc3ltbGlua19zb3VyY2UoaV9zcmMpIHsKICAgIGlfc3JjICE9ICIiCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMzogaV9zcmMgPSIsIGlfc3JjKQoKICAgIHJlZ2V4Lm1hdGNoKHBvbGljeV9kYXRhLmNvbW1vbi5zX3NvdXJjZTIsIGlfc3JjKQogICAgY2hlY2tfZGlyZWN0b3J5X3RyYXZlcnNhbChpX3NyYykKCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMzogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfc3RvcmFnZXMoaV9zdG9yYWdlcykgewogICAgcHJpbnQoImFsbG93X3NhbmRib3hfc3RvcmFnZXM6IGlfc3RvcmFnZXMgPSIsIGlfc3RvcmFnZXMpCgogICAgcF9zdG9yYWdlcyA6PSBwb2xpY3lfZGF0YS5zYW5kYm94LnN0b3JhZ2VzCiAgICBldmVyeSBpX3N0b3JhZ2UgaW4gaV9zdG9yYWdlcyB7CiAgICAgICAgYWxsb3dfc2FuZGJveF9zdG9yYWdlKHBfc3RvcmFnZXMsIGlfc3RvcmFnZSkKICAgIH0KCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9zdG9yYWdlczogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfc3RvcmFnZShwX3N0b3JhZ2VzLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IGlfc3RvcmFnZSA9IiwgaV9zdG9yYWdlKQoKICAgIHNvbWUgcF9zdG9yYWdlIGluIHBfc3RvcmFnZXMKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IHBfc3RvcmFnZSA9IiwgcF9zdG9yYWdlKQogICAgaV9zdG9yYWdlID09IHBfc3RvcmFnZQoKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IHRydWUiKQp9CgpDb3B5RmlsZVJlcXVlc3QgewogICAgcHJpbnQoIkNvcHlGaWxlUmVxdWVzdDogaW5wdXQucGF0aCA9IiwgaW5wdXQucGF0aCkKCiAgICBjaGVja19zeW1saW5rX3NvdXJjZShpbnB1dC5zeW1saW5rX3NyYykKICAgIGNoZWNrX2RpcmVjdG9yeV90cmF2ZXJzYWwoaW5wdXQucGF0aCkKCiAgICBzb21lIHJlZ2V4MSBpbiBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLkNvcHlGaWxlUmVxdWVzdAogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5jcGF0aCkKICAgIHJlZ2V4NCA6PSByZXBsYWNlKHJlZ2V4MywgIiQoYnVuZGxlLWlkKSIsIEJVTkRMRV9JRCkKICAgIHByaW50KCJDb3B5RmlsZVJlcXVlc3Q6IHJlZ2V4NCA9IiwgcmVnZXg0KQoKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4NCwgaW5wdXQucGF0aCkKCiAgICBwcmludCgiQ29weUZpbGVSZXF1ZXN0OiB0cnVlIikKfQoKQ3JlYXRlU2FuZGJveFJlcXVlc3QgewogICAgcHJpbnQoIkNyZWF0ZVNhbmRib3hSZXF1ZXN0OiBpbnB1dC5ndWVzdF9ob29rX3BhdGggPSIsIGlucHV0Lmd1ZXN0X2hvb2tfcGF0aCkKICAgIGNvdW50KGlucHV0Lmd1ZXN0X2hvb2tfcGF0aCkgPT0gMAoKICAgIHByaW50KCJDcmVhdGVTYW5kYm94UmVxdWVzdDogaW5wdXQua2VybmVsX21vZHVsZXMgPSIsIGlucHV0Lmtlcm5lbF9tb2R1bGVzKQogICAgY291bnQoaW5wdXQua2VybmVsX21vZHVsZXMpID09IDAKCiAgICBpX3BpZG5zIDo9IGlucHV0LnNhbmRib3hfcGlkbnMKICAgIHByaW50KCJDcmVhdGVTYW5kYm94UmVxdWVzdDogaV9waWRucyA9IiwgaV9waWRucykKICAgIGlfcGlkbnMgPT0gZmFsc2UKICAgIGFsbG93X3NhbmRib3hfc3RvcmFnZXMoaW5wdXQuc3RvcmFnZXMpCn0KCmFsbG93X2V4ZWMocF9jb250YWluZXIsIGlfcHJvY2VzcykgewogICAgcHJpbnQoImFsbG93X2V4ZWM6IHN0YXJ0IikKCiAgICBwX29jaSA9IHBfY29udGFpbmVyLk9DSQogICAgcF9zX25hbWUgPSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc19uYW1lc3BhY2UgPSBnZXRfc3RhdGVfdmFsKCJuYW1lc3BhY2UiKQogICAgYWxsb3dfcHJvYmVfcHJvY2VzcyhwX29jaS5Qcm9jZXNzLCBpX3Byb2Nlc3MsIHBfc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfZXhlYzogdHJ1ZSIpCn0KCmFsbG93X2ludGVyYWN0aXZlX2V4ZWMocF9jb250YWluZXIsIGlfcHJvY2VzcykgewogICAgcHJpbnQoImFsbG93X2ludGVyYWN0aXZlX2V4ZWM6IHN0YXJ0IikKCiAgICBwX29jaSA9IHBfY29udGFpbmVyLk9DSQogICAgcF9zX25hbWUgPSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc19uYW1lc3BhY2UgPSBnZXRfc3RhdGVfdmFsKCJuYW1lc3BhY2UiKQogICAgYWxsb3dfaW50ZXJhY3RpdmVfcHJvY2VzcyhwX29jaS5Qcm9jZXNzLCBpX3Byb2Nlc3MsIHBfc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfaW50ZXJhY3RpdmVfZXhlYzogdHJ1ZSIpCn0KCiMgVE9ETzogc2hvdWxkIG90aGVyIEV4ZWNQcm9jZXNzUmVxdWVzdCBpbnB1dCBkYXRhIGZpZWxkcyBiZSB2YWxpZGF0ZWQgYXMgd2VsbD8KRXhlY1Byb2Nlc3NSZXF1ZXN0IHsKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMTogaW5wdXQgPSIsIGlucHV0KQoKICAgIHNvbWUgcF9jb21tYW5kIGluIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuRXhlY1Byb2Nlc3NSZXF1ZXN0LmFsbG93ZWRfY29tbWFuZHMKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMTogcF9jb21tYW5kID0iLCBwX2NvbW1hbmQpCiAgICBwX2NvbW1hbmQgPT0gaW5wdXQucHJvY2Vzcy5BcmdzCgogICAgIyBUT0RPOiBtYXRjaCBwX2NvbnRhaW5lcidzIElEIHdpdGggdGhlIGlucHV0IGNvbnRhaW5lcl9pZC4KICAgIHNvbWUgcF9jb250YWluZXIgaW4gcG9saWN5X2RhdGEuY29udGFpbmVycwogICAgYWxsb3dfaW50ZXJhY3RpdmVfZXhlYyhwX2NvbnRhaW5lciwgaW5wdXQucHJvY2VzcykKCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDE6IHRydWUiKQp9CkV4ZWNQcm9jZXNzUmVxdWVzdCB7CiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDI6IGlucHV0ID0iLCBpbnB1dCkKCiAgICAjIFRPRE86IG1hdGNoIGlucHV0IGNvbnRhaW5lciBJRCB3aXRoIGl0cyBjb3JyZXNwb25kaW5nIGNvbnRhaW5lci5leGVjX2NvbW1hbmRzLgogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBzb21lIHBfY29tbWFuZCBpbiBwX2NvbnRhaW5lci5leGVjX2NvbW1hbmRzCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDI6IHBfY29tbWFuZCA9IiwgcF9jb21tYW5kKQoKICAgICMgVE9ETzogc2hvdWxkIG90aGVyIGlucHV0IGRhdGEgZmllbGRzIGJlIHZhbGlkYXRlZCBhcyB3ZWxsPwogICAgcF9jb21tYW5kID09IGlucHV0LnByb2Nlc3MuQXJncwoKICAgIGFsbG93X2V4ZWMocF9jb250YWluZXIsIGlucHV0LnByb2Nlc3MpCgogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAyOiB0cnVlIikKfQpFeGVjUHJvY2Vzc1JlcXVlc3QgewogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAzOiBpbnB1dCA9IiwgaW5wdXQpCgogICAgaV9jb21tYW5kID0gY29uY2F0KCIgIiwgaW5wdXQucHJvY2Vzcy5BcmdzKQogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAzOiBpX2NvbW1hbmQgPSIsIGlfY29tbWFuZCkKCiAgICBzb21lIHBfcmVnZXggaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5FeGVjUHJvY2Vzc1JlcXVlc3QucmVnZXgKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMzogcF9yZWdleCA9IiwgcF9yZWdleCkKCiAgICByZWdleC5tYXRjaChwX3JlZ2V4LCBpX2NvbW1hbmQpCgogICAgIyBUT0RPOiBtYXRjaCBwX2NvbnRhaW5lcidzIElEIHdpdGggdGhlIGlucHV0IGNvbnRhaW5lcl9pZC4KICAgIHNvbWUgcF9jb250YWluZXIgaW4gcG9saWN5X2RhdGEuY29udGFpbmVycwogICAgYWxsb3dfaW50ZXJhY3RpdmVfZXhlYyhwX2NvbnRhaW5lciwgaW5wdXQucHJvY2VzcykKCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDM6IHRydWUiKQp9CgpVcGRhdGVSb3V0ZXNSZXF1ZXN0IHsKICAgIHByaW50KCJVcGRhdGVSb3V0ZXNSZXF1ZXN0OiBpbnB1dCA9IiwgaW5wdXQpCiAgICBwcmludCgiVXBkYXRlUm91dGVzUmVxdWVzdDogcG9saWN5ID0iLCBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLlVwZGF0ZVJvdXRlc1JlcXVlc3QpCgogICAgaV9yb3V0ZXMgOj0gaW5wdXQucm91dGVzLlJvdXRlcwogICAgcF9zb3VyY2VfcmVnZXggPSBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLlVwZGF0ZVJvdXRlc1JlcXVlc3QuZm9yYmlkZGVuX3NvdXJjZV9yZWdleAogICAgcF9uYW1lcyA9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuVXBkYXRlUm91dGVzUmVxdWVzdC5mb3JiaWRkZW5fZGV2aWNlX25hbWVzCgogICAgZXZlcnkgaV9yb3V0ZSBpbiBpX3JvdXRlcyB7CiAgICAgICAgcHJpbnQoImlfcm91dGUuc291cmNlID0iLCBpX3JvdXRlLnNvdXJjZSkKICAgICAgICBldmVyeSBwX3JlZ2V4IGluIHBfc291cmNlX3JlZ2V4IHsKICAgICAgICAgICAgcHJpbnQoInBfcmVnZXggPSIsIHBfcmVnZXgpCiAgICAgICAgICAgIG5vdCByZWdleC5tYXRjaChwX3JlZ2V4LCBpX3JvdXRlLnNvdXJjZSkKICAgICAgICB9CgogICAgICAgIHByaW50KCJpX3JvdXRlLmRldmljZSA9IiwgaV9yb3V0ZS5kZXZpY2UpCiAgICAgICAgbm90IGlfcm91dGUuZGV2aWNlIGluIHBfbmFtZXMKICAgIH0KCiAgICBwcmludCgiVXBkYXRlUm91dGVzUmVxdWVzdDogdHJ1ZSIpCn0KClVwZGF0ZUludGVyZmFjZVJlcXVlc3QgewogICAgcHJpbnQoIlVwZGF0ZUludGVyZmFjZVJlcXVlc3Q6IGlucHV0ID0iLCBpbnB1dCkKICAgIHByaW50KCJVcGRhdGVJbnRlcmZhY2VSZXF1ZXN0OiBwb2xpY3kgPSIsIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuVXBkYXRlSW50ZXJmYWNlUmVxdWVzdCkKCiAgICBpX2ludGVyZmFjZSA6PSBpbnB1dC5pbnRlcmZhY2UKICAgIHBfZmxhZ3MgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmFsbG93X3Jhd19mbGFncwoKICAgICMgVHlwaWNhbGx5LCBqdXN0IElGRl9OT0FSUCBpcyB1c2VkLgogICAgYml0cy5hbmQoaV9pbnRlcmZhY2UucmF3X2ZsYWdzLCBiaXRzLm5lZ2F0ZShwX2ZsYWdzKSkgPT0gMAoKICAgIHBfbmFtZXMgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmZvcmJpZGRlbl9uYW1lcwoKICAgIG5vdCBpX2ludGVyZmFjZS5uYW1lIGluIHBfbmFtZXMKCiAgICBwX2h3YWRkcnMgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmZvcmJpZGRlbl9od19hZGRycwoKICAgIG5vdCBpX2ludGVyZmFjZS5od0FkZHIgaW4gcF9od2FkZHJzCgogICAgcHJpbnQoIlVwZGF0ZUludGVyZmFjZVJlcXVlc3Q6IHRydWUiKQp9CgpDbG9zZVN0ZGluUmVxdWVzdCB7CiAgICBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLkNsb3NlU3RkaW5SZXF1ZXN0ID09IHRydWUKfQoKUmVhZFN0cmVhbVJlcXVlc3QgewogICAgcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5SZWFkU3RyZWFtUmVxdWVzdCA9PSB0cnVlCn0KClVwZGF0ZUVwaGVtZXJhbE1vdW50c1JlcXVlc3QgewogICAgcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVFcGhlbWVyYWxNb3VudHNSZXF1ZXN0ID09IHRydWUKfQoKV3JpdGVTdHJlYW1SZXF1ZXN0IHsKICAgIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuV3JpdGVTdHJlYW1SZXF1ZXN0ID09IHRydWUKfQoKcG9saWN5X2RhdGEgOj0gewogICJjb250YWluZXJzIjogWwogICAgewogICAgICAiT0NJIjogewogICAgICAgICJWZXJzaW9uIjogIjEuMS4wLXJjLjEiLAogICAgICAgICJQcm9jZXNzIjogewogICAgICAgICAgIlRlcm1pbmFsIjogZmFsc2UsCiAgICAgICAgICAiVXNlciI6IHsKICAgICAgICAgICAgIlVJRCI6IDY1NTM1LAogICAgICAgICAgICAiR0lEIjogNjU1MzUsCiAgICAgICAgICAgICJBZGRpdGlvbmFsR2lkcyI6IFtdLAogICAgICAgICAgICAiVXNlcm5hbWUiOiAiIgogICAgICAgICAgfSwKICAgICAgICAgICJEZXByZWNhdGVkQXJncyI6IFsKICAgICAgICAgICAgIi9wYXVzZSIKICAgICAgICAgIF0sCiAgICAgICAgICAiQXJncyI6IFsKICAgICAgICAgICAgIi9wYXVzZSIKICAgICAgICAgIF0sCiAgICAgICAgICAiRW52IjogWwogICAgICAgICAgICAiUEFUSD0vdXNyL2xvY2FsL3NiaW46L3Vzci9sb2NhbC9iaW46L3Vzci9zYmluOi91c3IvYmluOi9zYmluOi9iaW4iCiAgICAgICAgICBdLAogICAgICAgICAgIkN3ZCI6ICIvIiwKICAgICAgICAgICJDYXBhYmlsaXRpZXMiOiB7CiAgICAgICAgICAgICJBbWJpZW50IjogW10sCiAgICAgICAgICAgICJCb3VuZGluZyI6IFsKICAgICAgICAgICAgICAiJChkZWZhdWx0X2NhcHMpIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiRWZmZWN0aXZlIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJJbmhlcml0YWJsZSI6IFtdLAogICAgICAgICAgICAiUGVybWl0dGVkIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICAiTm9OZXdQcml2aWxlZ2VzIjogdHJ1ZQogICAgICAgIH0sCiAgICAgICAgIlJvb3QiOiB7CiAgICAgICAgICAiUGF0aCI6ICIkKGNwYXRoKS8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgIlJlYWRvbmx5IjogdHJ1ZQogICAgICAgIH0sCiAgICAgICAgIk1vdW50cyI6IFsKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9wcm9jIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJwcm9jIiwKICAgICAgICAgICAgInR5cGVfIjogInByb2MiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2IiwKICAgICAgICAgICAgInNvdXJjZSI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJzdHJpY3RhdGltZSIsCiAgICAgICAgICAgICAgIm1vZGU9NzU1IiwKICAgICAgICAgICAgICAic2l6ZT02NTUzNmsiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L3B0cyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiZGV2cHRzIiwKICAgICAgICAgICAgInR5cGVfIjogImRldnB0cyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJuZXdpbnN0YW5jZSIsCiAgICAgICAgICAgICAgInB0bXhtb2RlPTA2NjYiLAogICAgICAgICAgICAgICJtb2RlPTA2MjAiLAogICAgICAgICAgICAgICJnaWQ9NSIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvc2htIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L3NobSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi9tcXVldWUiLAogICAgICAgICAgICAic291cmNlIjogIm1xdWV1ZSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJtcXVldWUiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvc3lzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJzeXNmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJzeXNmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2V0Yy9yZXNvbHYuY29uZiIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClyZXNvbHYuY29uZiQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJvIiwKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9kZXYiLAogICAgICAgICAgICAgICJub2V4ZWMiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0KICAgICAgICBdLAogICAgICAgICJBbm5vdGF0aW9ucyI6IHsKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmJ1bmRsZV9wYXRoIjogIi9ydW4vY29udGFpbmVyZC9pby5jb250YWluZXJkLnJ1bnRpbWUudjIudGFzay9rOHMuaW8vJChidW5kbGUtaWQpIiwKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIjogInBvZF9zYW5kYm94IiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSI6ICJzYW5kYm94IiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWlkIjogIl5bYS16MC05XXs2NH0kIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWxvZy1kaXJlY3RvcnkiOiAiXi92YXIvbG9nL3BvZHMvJChzYW5kYm94LW5hbWVzcGFjZSlfJChzYW5kYm94LW5hbWUpX1swLTlhLWZdezh9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezEyfSQiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZXNwYWNlIjogIiIsCiAgICAgICAgICAibmVyZGN0bC9uZXR3b3JrLW5hbWVzcGFjZSI6ICJeL3Zhci9ydW4vbmV0bnMvY25pLVswLTlhLWZdezh9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezEyfSQiCiAgICAgICAgfSwKICAgICAgICAiTGludXgiOiB7CiAgICAgICAgICAiTmFtZXNwYWNlcyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICJUeXBlIjogImlwYyIsCiAgICAgICAgICAgICAgIlBhdGgiOiAiIgogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgIlR5cGUiOiAidXRzIiwKICAgICAgICAgICAgICAiUGF0aCI6ICIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiVHlwZSI6ICJtb3VudCIsCiAgICAgICAgICAgICAgIlBhdGgiOiAiIgogICAgICAgICAgICB9CiAgICAgICAgICBdLAogICAgICAgICAgIk1hc2tlZFBhdGhzIjogWwogICAgICAgICAgICAiL3Byb2MvYWNwaSIsCiAgICAgICAgICAgICIvcHJvYy9hc291bmQiLAogICAgICAgICAgICAiL3Byb2Mva2NvcmUiLAogICAgICAgICAgICAiL3Byb2Mva2V5cyIsCiAgICAgICAgICAgICIvcHJvYy9sYXRlbmN5X3N0YXRzIiwKICAgICAgICAgICAgIi9wcm9jL3RpbWVyX2xpc3QiLAogICAgICAgICAgICAiL3Byb2MvdGltZXJfc3RhdHMiLAogICAgICAgICAgICAiL3Byb2Mvc2NoZWRfZGVidWciLAogICAgICAgICAgICAiL3N5cy9maXJtd2FyZSIsCiAgICAgICAgICAgICIvcHJvYy9zY3NpIgogICAgICAgICAgXSwKICAgICAgICAgICJSZWFkb25seVBhdGhzIjogWwogICAgICAgICAgICAiL3Byb2MvYnVzIiwKICAgICAgICAgICAgIi9wcm9jL2ZzIiwKICAgICAgICAgICAgIi9wcm9jL2lycSIsCiAgICAgICAgICAgICIvcHJvYy9zeXMiLAogICAgICAgICAgICAiL3Byb2Mvc3lzcnEtdHJpZ2dlciIKICAgICAgICAgIF0sCiAgICAgICAgICAiRGV2aWNlcyI6IFtdLAogICAgICAgICAgIlN5c2N0bCI6IHsKICAgICAgICAgICAgIm5ldC5pcHY0LmlwX3VucHJpdmlsZWdlZF9wb3J0X3N0YXJ0IjogIjAiLAogICAgICAgICAgICAibmV0LmlwdjQucGluZ19ncm91cF9yYW5nZSI6ICIwIDIxNDc0ODM2NDciCiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9LAogICAgICAic3RvcmFnZXMiOiBbCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJibGsiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogInRhciIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIiQoaGFzaDApIgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGxheWVyMCkiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJvdmVybGF5ZnMiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogImZ1c2UzLmthdGEtb3ZlcmxheSIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIjVhNWFhZDgwMDU1ZmYyMDAxMmE1MGRjMjVmOGRmN2EyOTkyNDQ3NDMyNGQ2NWY3ZDUzMDZlZThlZTI3ZmY3MWQiLAogICAgICAgICAgICAiODE3MjUwZjFhM2UzMzZkYTc2ZjViZDNmYTc4NGUxYjI2ZDk1OWI5YzEzMTg3NjgxNWJhMjYwNDA0OGI3MGMxOCIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChjcGF0aCkvJChidW5kbGUtaWQpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9CiAgICAgIF0sCiAgICAgICJkZXZpY2VzIjogW10sCiAgICAgICJzYW5kYm94X3BpZG5zIjogZmFsc2UsCiAgICAgICJleGVjX2NvbW1hbmRzIjogW10sCiAgICAgICJlbnZfbWFwIjogewogICAgICAgICJQQVRIIjogIi91c3IvbG9jYWwvc2JpbjovdXNyL2xvY2FsL2JpbjovdXNyL3NiaW46L3Vzci9iaW46L3NiaW46L2JpbiIKICAgICAgfQogICAgfSwKICAgIHsKICAgICAgIk9DSSI6IHsKICAgICAgICAiVmVyc2lvbiI6ICIxLjEuMC1yYy4xIiwKICAgICAgICAiUHJvY2VzcyI6IHsKICAgICAgICAgICJUZXJtaW5hbCI6IGZhbHNlLAogICAgICAgICAgIlVzZXIiOiB7CiAgICAgICAgICAgICJVSUQiOiAwLAogICAgICAgICAgICAiR0lEIjogMCwKICAgICAgICAgICAgIkFkZGl0aW9uYWxHaWRzIjogW10sCiAgICAgICAgICAgICJVc2VybmFtZSI6ICIiCiAgICAgICAgICB9LAogICAgICAgICAgIkRlcHJlY2F0ZWRBcmdzIjogWwogICAgICAgICAgICAic2giCiAgICAgICAgICBdLAogICAgICAgICAgIkFyZ3MiOiBbCiAgICAgICAgICAgICJzaCIKICAgICAgICAgIF0sCiAgICAgICAgICAiRW52IjogWwogICAgICAgICAgICAiUEFUSD0vdXNyL2xvY2FsL3NiaW46L3Vzci9sb2NhbC9iaW46L3Vzci9zYmluOi91c3IvYmluOi9zYmluOi9iaW4iLAogICAgICAgICAgICAiSE9TVE5BTUU9JChob3N0LW5hbWUpIgogICAgICAgICAgXSwKICAgICAgICAgICJDd2QiOiAiLyIsCiAgICAgICAgICAiQ2FwYWJpbGl0aWVzIjogewogICAgICAgICAgICAiQW1iaWVudCI6IFtdLAogICAgICAgICAgICAiQm91bmRpbmciOiBbCiAgICAgICAgICAgICAgIiQoZGVmYXVsdF9jYXBzKSIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgIkVmZmVjdGl2ZSI6IFsKICAgICAgICAgICAgICAiJChkZWZhdWx0X2NhcHMpIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiSW5oZXJpdGFibGUiOiBbXSwKICAgICAgICAgICAgIlBlcm1pdHRlZCI6IFsKICAgICAgICAgICAgICAiJChkZWZhdWx0X2NhcHMpIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgIk5vTmV3UHJpdmlsZWdlcyI6IGZhbHNlCiAgICAgICAgfSwKICAgICAgICAiUm9vdCI6IHsKICAgICAgICAgICJQYXRoIjogIiQoY3BhdGgpLyQoYnVuZGxlLWlkKSIsCiAgICAgICAgICAiUmVhZG9ubHkiOiBmYWxzZQogICAgICAgIH0sCiAgICAgICAgIk1vdW50cyI6IFsKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9wcm9jIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJwcm9jIiwKICAgICAgICAgICAgInR5cGVfIjogInByb2MiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2IiwKICAgICAgICAgICAgInNvdXJjZSI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJzdHJpY3RhdGltZSIsCiAgICAgICAgICAgICAgIm1vZGU9NzU1IiwKICAgICAgICAgICAgICAic2l6ZT02NTUzNmsiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L3B0cyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiZGV2cHRzIiwKICAgICAgICAgICAgInR5cGVfIjogImRldnB0cyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJuZXdpbnN0YW5jZSIsCiAgICAgICAgICAgICAgInB0bXhtb2RlPTA2NjYiLAogICAgICAgICAgICAgICJtb2RlPTA2MjAiLAogICAgICAgICAgICAgICJnaWQ9NSIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvc2htIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L3NobSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi9tcXVldWUiLAogICAgICAgICAgICAic291cmNlIjogIm1xdWV1ZSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJtcXVldWUiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvc3lzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJzeXNmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJzeXNmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL3N5cy9mcy9jZ3JvdXAiLAogICAgICAgICAgICAic291cmNlIjogImNncm91cCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJjZ3JvdXAiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiLAogICAgICAgICAgICAgICJyZWxhdGltZSIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2V0Yy9ob3N0cyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClob3N0cyQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicnciCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L3Rlcm1pbmF0aW9uLWxvZyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeCl0ZXJtaW5hdGlvbi1sb2ckIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJ3IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2V0Yy9ob3N0bmFtZSIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClob3N0bmFtZSQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicnciCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZXRjL3Jlc29sdi5jb25mIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KXJlc29sdi5jb25mJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJydyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi92YXIvcnVuL3NlY3JldHMva3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudCIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClzZXJ2aWNlYWNjb3VudCQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicm8iCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvdmFyL3J1bi9zZWNyZXRzL2F6dXJlL3Rva2VucyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeCl0b2tlbnMkIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9CiAgICAgICAgXSwKICAgICAgICAiQW5ub3RhdGlvbnMiOiB7CiAgICAgICAgICAiaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5idW5kbGVfcGF0aCI6ICIvcnVuL2NvbnRhaW5lcmQvaW8uY29udGFpbmVyZC5ydW50aW1lLnYyLnRhc2svazhzLmlvLyQoYnVuZGxlLWlkKSIsCiAgICAgICAgICAiaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5jb250YWluZXJfdHlwZSI6ICJwb2RfY29udGFpbmVyIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItbmFtZSI6ICJzaCIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLXR5cGUiOiAiY29udGFpbmVyIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5pbWFnZS1uYW1lIjogInJlZ2lzdHJ5Lms4cy5pby9lMmUtdGVzdC1pbWFnZXMvYnVzeWJveDoxLjI5LTIiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtaWQiOiAiXlthLXowLTldezY0fSQiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZXNwYWNlIjogIiIKICAgICAgICB9LAogICAgICAgICJMaW51eCI6IHsKICAgICAgICAgICJOYW1lc3BhY2VzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgIlR5cGUiOiAiaXBjIiwKICAgICAgICAgICAgICAiUGF0aCI6ICIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiVHlwZSI6ICJ1dHMiLAogICAgICAgICAgICAgICJQYXRoIjogIiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJUeXBlIjogIm1vdW50IiwKICAgICAgICAgICAgICAiUGF0aCI6ICIiCiAgICAgICAgICAgIH0KICAgICAgICAgIF0sCiAgICAgICAgICAiTWFza2VkUGF0aHMiOiBbCiAgICAgICAgICAgICIvcHJvYy9hY3BpIiwKICAgICAgICAgICAgIi9wcm9jL2tjb3JlIiwKICAgICAgICAgICAgIi9wcm9jL2tleXMiLAogICAgICAgICAgICAiL3Byb2MvbGF0ZW5jeV9zdGF0cyIsCiAgICAgICAgICAgICIvcHJvYy90aW1lcl9saXN0IiwKICAgICAgICAgICAgIi9wcm9jL3RpbWVyX3N0YXRzIiwKICAgICAgICAgICAgIi9wcm9jL3NjaGVkX2RlYnVnIiwKICAgICAgICAgICAgIi9wcm9jL3Njc2kiLAogICAgICAgICAgICAiL3N5cy9maXJtd2FyZSIKICAgICAgICAgIF0sCiAgICAgICAgICAiUmVhZG9ubHlQYXRocyI6IFsKICAgICAgICAgICAgIi9wcm9jL2Fzb3VuZCIsCiAgICAgICAgICAgICIvcHJvYy9idXMiLAogICAgICAgICAgICAiL3Byb2MvZnMiLAogICAgICAgICAgICAiL3Byb2MvaXJxIiwKICAgICAgICAgICAgIi9wcm9jL3N5cyIsCiAgICAgICAgICAgICIvcHJvYy9zeXNycS10cmlnZ2VyIgogICAgICAgICAgXSwKICAgICAgICAgICJEZXZpY2VzIjogW10sCiAgICAgICAgICAiU3lzY3RsIjogewogICAgICAgICAgICAibmV0LmlwdjQuaXBfdW5wcml2aWxlZ2VkX3BvcnRfc3RhcnQiOiAiMCIsCiAgICAgICAgICAgICJuZXQuaXB2NC5waW5nX2dyb3VwX3JhbmdlIjogIjAgMjE0NzQ4MzY0NyIKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0sCiAgICAgICJzdG9yYWdlcyI6IFsKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoMCkiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXIwKSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogIm92ZXJsYXlmcyIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAiZnVzZTMua2F0YS1vdmVybGF5IiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiNGQwNjUzZjdjN2UzZjQ5YjQ5MDA2YTlmNGU4MTNhYTExNjZjNTMyYTM0YTc2NTBhZmE2ZmFhNTIyNmYxZWM1ZiIsCiAgICAgICAgICAgICJiZDViYjM4NzA5ZDI5NDNhMzZhMDJlNDU0ZTM0ZDNkNmNhYTIzODVmYjE0MGQ3ZjE3OTdmZDBhMjdhOTM3ZGRiIgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGNwYXRoKS8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0KICAgICAgXSwKICAgICAgImRldmljZXMiOiBbXSwKICAgICAgInNhbmRib3hfcGlkbnMiOiB0cnVlLAogICAgICAiZXhlY19jb21tYW5kcyI6IFtdLAogICAgICAiZW52X21hcCI6IHsKICAgICAgICAiSE9TVE5BTUUiOiAiJChob3N0LW5hbWUpIiwKICAgICAgICAiUEFUSCI6ICIvdXNyL2xvY2FsL3NiaW46L3Vzci9sb2NhbC9iaW46L3Vzci9zYmluOi91c3IvYmluOi9zYmluOi9iaW4iCiAgICAgIH0KICAgIH0KICBdLAogICJjb21tb24iOiB7CiAgICAiY3BhdGgiOiAiL3J1bi9rYXRhLWNvbnRhaW5lcnMvc2hhcmVkL2NvbnRhaW5lcnMiLAogICAgIm1vdW50X3NvdXJjZV9jcGF0aCI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zaGFyZWQvY29udGFpbmVycyIsCiAgICAic2ZwcmVmaXgiOiAiXiQoY3BhdGgpLyQoYnVuZGxlLWlkKS1bYS16MC05XXsxNn0tIiwKICAgICJzcGF0aCI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L3N0b3JhZ2UiLAogICAgImlwdjRfYSI6ICIoKFswLTldfFsxLTldWzAtOV18MVswLTldezJ9fDJbMC00XVswLTldfDI1WzAtNV0pXFwuKXszfShbMC05XXxbMS05XVswLTldfDFbMC05XXsyfXwyWzAtNF1bMC05XXwyNVswLTVdKSIsCiAgICAiaXBfcCI6ICJbMC05XXsxLDV9IiwKICAgICJzdmNfbmFtZSI6ICJbQS1aX1xcLlxcLV0rIiwKICAgICJkbnNfbGFiZWwiOiAiW2EtekEtWjAtOV9cXC5cXC1dKyIsCiAgICAic19zb3VyY2UxIjogIl4uLjJbMC05XXszfV9bMC0xXVswLTldX1swLTNdWzAtOV1fWzAtMl1bMC05XV9bMC01XVswLTldX1swLTVdWzAtOV1cXC5bMC05XXsxLDEwfSQiLAogICAgInNfc291cmNlMiI6ICJeLi5kYXRhLyIsCiAgICAiZG5zX3N1YmRvbWFpbiI6ICJeW2EtejAtOV0oWy1hLXowLTldKlthLXowLTldKT8kIiwKICAgICJwb2RfdWlkIjogIl5bMC05YS1mQS1GXXs4fS1bMC05YS1mQS1GXXs0fS1bMC05YS1mQS1GXXs0fS1bMC05YS1mQS1GXXs0fS1bMC05YS1mQS1GXXsxMn0kIiwKICAgICJkZWZhdWx0X2NhcHMiOiBbCiAgICAgICJDQVBfQ0hPV04iLAogICAgICAiQ0FQX0RBQ19PVkVSUklERSIsCiAgICAgICJDQVBfRlNFVElEIiwKICAgICAgIkNBUF9GT1dORVIiLAogICAgICAiQ0FQX01LTk9EIiwKICAgICAgIkNBUF9ORVRfUkFXIiwKICAgICAgIkNBUF9TRVRHSUQiLAogICAgICAiQ0FQX1NFVFVJRCIsCiAgICAgICJDQVBfU0VURkNBUCIsCiAgICAgICJDQVBfU0VUUENBUCIsCiAgICAgICJDQVBfTkVUX0JJTkRfU0VSVklDRSIsCiAgICAgICJDQVBfU1lTX0NIUk9PVCIsCiAgICAgICJDQVBfS0lMTCIsCiAgICAgICJDQVBfQVVESVRfV1JJVEUiCiAgICBdLAogICAgInByaXZpbGVnZWRfY2FwcyI6IFsKICAgICAgIkNBUF9DSE9XTiIsCiAgICAgICJDQVBfREFDX09WRVJSSURFIiwKICAgICAgIkNBUF9EQUNfUkVBRF9TRUFSQ0giLAogICAgICAiQ0FQX0ZPV05FUiIsCiAgICAgICJDQVBfRlNFVElEIiwKICAgICAgIkNBUF9LSUxMIiwKICAgICAgIkNBUF9TRVRHSUQiLAogICAgICAiQ0FQX1NFVFVJRCIsCiAgICAgICJDQVBfU0VUUENBUCIsCiAgICAgICJDQVBfTElOVVhfSU1NVVRBQkxFIiwKICAgICAgIkNBUF9ORVRfQklORF9TRVJWSUNFIiwKICAgICAgIkNBUF9ORVRfQlJPQURDQVNUIiwKICAgICAgIkNBUF9ORVRfQURNSU4iLAogICAgICAiQ0FQX05FVF9SQVciLAogICAgICAiQ0FQX0lQQ19MT0NLIiwKICAgICAgIkNBUF9JUENfT1dORVIiLAogICAgICAiQ0FQX1NZU19NT0RVTEUiLAogICAgICAiQ0FQX1NZU19SQVdJTyIsCiAgICAgICJDQVBfU1lTX0NIUk9PVCIsCiAgICAgICJDQVBfU1lTX1BUUkFDRSIsCiAgICAgICJDQVBfU1lTX1BBQ0NUIiwKICAgICAgIkNBUF9TWVNfQURNSU4iLAogICAgICAiQ0FQX1NZU19CT09UIiwKICAgICAgIkNBUF9TWVNfTklDRSIsCiAgICAgICJDQVBfU1lTX1JFU09VUkNFIiwKICAgICAgIkNBUF9TWVNfVElNRSIsCiAgICAgICJDQVBfU1lTX1RUWV9DT05GSUciLAogICAgICAiQ0FQX01LTk9EIiwKICAgICAgIkNBUF9MRUFTRSIsCiAgICAgICJDQVBfQVVESVRfV1JJVEUiLAogICAgICAiQ0FQX0FVRElUX0NPTlRST0wiLAogICAgICAiQ0FQX1NFVEZDQVAiLAogICAgICAiQ0FQX01BQ19PVkVSUklERSIsCiAgICAgICJDQVBfTUFDX0FETUlOIiwKICAgICAgIkNBUF9TWVNMT0ciLAogICAgICAiQ0FQX1dBS0VfQUxBUk0iLAogICAgICAiQ0FQX0JMT0NLX1NVU1BFTkQiLAogICAgICAiQ0FQX0FVRElUX1JFQUQiLAogICAgICAiQ0FQX1BFUkZNT04iLAogICAgICAiQ0FQX0JQRiIsCiAgICAgICJDQVBfQ0hFQ0tQT0lOVF9SRVNUT1JFIgogICAgXSwKICAgICJ2aXJ0aW9fYmxrX3N0b3JhZ2VfY2xhc3NlcyI6IFsKICAgICAgImNjLWxvY2FsLWNzaSIsCiAgICAgICJjYy1tYW5hZ2VkLWNzaSIsCiAgICAgICJjYy1tYW5hZ2VkLXByZW1pdW0tY3NpIgogICAgXSwKICAgICJzbWJfc3RvcmFnZV9jbGFzc2VzIjogWwogICAgICB7CiAgICAgICAgIm5hbWUiOiAiYXp1cmVmaWxlLWNzaS1rYXRhLWNjIiwKICAgICAgICAibW91bnRfb3B0aW9ucyI6IFsKICAgICAgICAgICJkaXJfbW9kZT0wNzc3IiwKICAgICAgICAgICJmaWxlX21vZGU9MDc3NyIsCiAgICAgICAgICAibWZzeW1saW5rcyIsCiAgICAgICAgICAiY2FjaGU9c3RyaWN0IiwKICAgICAgICAgICJub3NoYXJlc29jayIsCiAgICAgICAgICAiYWN0aW1lbz0zMCIsCiAgICAgICAgICAibm9icmwiCiAgICAgICAgXQogICAgICB9CiAgICBdCiAgfSwKICAic2FuZGJveCI6IHsKICAgICJzdG9yYWdlcyI6IFsKICAgICAgewogICAgICAgICJkcml2ZXIiOiAiZXBoZW1lcmFsIiwKICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAic291cmNlIjogInNobSIsCiAgICAgICAgImZzdHlwZSI6ICJ0bXBmcyIsCiAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgIm5vZGV2IiwKICAgICAgICAgICJtb2RlPTE3NzciLAogICAgICAgICAgInNpemU9NjcxMDg4NjQiCiAgICAgICAgXSwKICAgICAgICAibW91bnRfcG9pbnQiOiAiL3J1bi9rYXRhLWNvbnRhaW5lcnMvc2FuZGJveC9zaG0iLAogICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgfQogICAgXQogIH0sCiAgInJlcXVlc3RfZGVmYXVsdHMiOiB7CiAgICAiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdCI6IHsKICAgICAgImFsbG93X2Vudl9yZWdleCI6IFsKICAgICAgICAiXkhPU1ROQU1FPSQoZG5zX2xhYmVsKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfUE9SVF8kKGlwX3ApX1RDUD10Y3A6Ly8kKGlwdjRfYSk6JChpcF9wKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfUE9SVF8kKGlwX3ApX1RDUF9QUk9UTz10Y3AkIiwKICAgICAgICAiXiQoc3ZjX25hbWUpX1BPUlRfJChpcF9wKV9UQ1BfUE9SVD0kKGlwX3ApJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9QT1JUXyQoaXBfcClfVENQX0FERFI9JChpcHY0X2EpJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9TRVJWSUNFX0hPU1Q9JChpcHY0X2EpJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9TRVJWSUNFX1BPUlQ9JChpcF9wKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfU0VSVklDRV9QT1JUXyQoZG5zX2xhYmVsKT0kKGlwX3ApJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9QT1JUPXRjcDovLyQoaXB2NF9hKTokKGlwX3ApJCIsCiAgICAgICAgIl5BWlVSRV9DTElFTlRfSUQ9W0EtRmEtZjAtOS1dKiQiLAogICAgICAgICJeQVpVUkVfVEVOQU5UX0lEPVtBLUZhLWYwLTktXSokIiwKICAgICAgICAiXkFaVVJFX0ZFREVSQVRFRF9UT0tFTl9GSUxFPS92YXIvcnVuL3NlY3JldHMvYXp1cmUvdG9rZW5zL2F6dXJlLWlkZW50aXR5LXRva2VuJCIsCiAgICAgICAgIl5BWlVSRV9BVVRIT1JJVFlfSE9TVD1odHRwczovL2xvZ2luXFwubWljcm9zb2Z0b25saW5lXFwuY29tLyQiLAogICAgICAgICJeVEVSTT14dGVybSQiCiAgICAgIF0sCiAgICAgICJhbGxvd19lbnZfcmVnZXhfbWFwIjogewogICAgICAgICJDUFVfTElNSVQiOiAiXlswLTldKyQiLAogICAgICAgICJKT0JfQ09NUExFVElPTl9JTkRFWCI6ICJeWzAtOV0qJCIsCiAgICAgICAgIk1FTU9SWV9MSU1JVCI6ICJeWzAtOV0rJCIKICAgICAgfQogICAgfSwKICAgICJDb3B5RmlsZVJlcXVlc3QiOiBbCiAgICAgICIkKHNmcHJlZml4KSIKICAgIF0sCiAgICAiRXhlY1Byb2Nlc3NSZXF1ZXN0IjogewogICAgICAiYWxsb3dlZF9jb21tYW5kcyI6IFtdLAogICAgICAicmVnZXgiOiBbXQogICAgfSwKICAgICJVcGRhdGVSb3V0ZXNSZXF1ZXN0IjogewogICAgICAiZm9yYmlkZGVuX2RldmljZV9uYW1lcyI6IFsKICAgICAgICAibG8iCiAgICAgIF0sCiAgICAgICJmb3JiaWRkZW5fc291cmNlX3JlZ2V4IjogWwogICAgICAgICJeKD86MHswLDR9Oil7MCw3fTB7MCwzfTEkIiwKICAgICAgICAiXjEyN1xcLig/OlswLTldezEsM31cXC4pezJ9WzAtOV17MSwzfSQiCiAgICAgIF0KICAgIH0sCiAgICAiVXBkYXRlSW50ZXJmYWNlUmVxdWVzdCI6IHsKICAgICAgImFsbG93X3Jhd19mbGFncyI6IDEyOCwKICAgICAgImZvcmJpZGRlbl9uYW1lcyI6IFsKICAgICAgICAibG8iCiAgICAgIF0sCiAgICAgICJmb3JiaWRkZW5faHdfYWRkcnMiOiBbCiAgICAgICAgIjAwOjAwOjAwOjAwOjAwOjAwIgogICAgICBdCiAgICB9LAogICAgIkNsb3NlU3RkaW5SZXF1ZXN0IjogZmFsc2UsCiAgICAiUmVhZFN0cmVhbVJlcXVlc3QiOiBmYWxzZSwKICAgICJVcGRhdGVFcGhlbWVyYWxNb3VudHNSZXF1ZXN0IjogZmFsc2UsCiAgICAiV3JpdGVTdHJlYW1SZXF1ZXN0IjogZmFsc2UKICB9Cn0= + spec: + restartPolicy: Never + runtimeClassName: kata-cc + shareProcessNamespace: true + containers: + - name: sh + image: "registry.k8s.io/e2e-test-images/busybox:1.29-2" + command: + - sh diff --git a/src/agent/samples/policy/yaml/kubernetes/conformance/conformance-e2e.yaml b/src/agent/samples/policy/yaml/kubernetes/conformance/conformance-e2e.yaml new file mode 100644 index 000000000000..3c42065dd0be --- /dev/null +++ b/src/agent/samples/policy/yaml/kubernetes/conformance/conformance-e2e.yaml @@ -0,0 +1,83 @@ +--- +apiVersion: v1 +kind: Namespace +metadata: + name: conformance +--- +apiVersion: v1 +kind: ServiceAccount +metadata: + labels: + component: conformance + name: conformance-serviceaccount + namespace: conformance +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + labels: + component: conformance + name: conformance-serviceaccount-role +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: conformance-serviceaccount +subjects: + - kind: ServiceAccount + name: conformance-serviceaccount + namespace: conformance +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + labels: + component: conformance + name: conformance-serviceaccount +rules: + - apiGroups: + - "*" + resources: + - "*" + verbs: + - "*" + - nonResourceURLs: + - /metrics + - /logs + - /logs/* + verbs: + - get +--- +apiVersion: v1 +kind: Pod +metadata: + name: e2e-conformance-test + annotations: + io.katacontainers.config.agent.policy: IyBDb3B5cmlnaHQgKGMpIDIwMjMgTWljcm9zb2Z0IENvcnBvcmF0aW9uCiMKIyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMAojCnBhY2thZ2UgYWdlbnRfcG9saWN5CgppbXBvcnQgZnV0dXJlLmtleXdvcmRzLmluCmltcG9ydCBmdXR1cmUua2V5d29yZHMuZXZlcnkKCiMgRGVmYXVsdCB2YWx1ZXMsIHJldHVybmVkIGJ5IE9QQSB3aGVuIHJ1bGVzIGNhbm5vdCBiZSBldmFsdWF0ZWQgdG8gdHJ1ZS4KZGVmYXVsdCBBZGRBUlBOZWlnaGJvcnNSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgQWRkU3dhcFJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBDbG9zZVN0ZGluUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IENvcHlGaWxlUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IENyZWF0ZUNvbnRhaW5lclJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBDcmVhdGVTYW5kYm94UmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IERlc3Ryb3lTYW5kYm94UmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgRXhlY1Byb2Nlc3NSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgR2V0T09NRXZlbnRSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBHdWVzdERldGFpbHNSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBMaXN0SW50ZXJmYWNlc1JlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBMaXN0Um91dGVzUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IE1lbUhvdHBsdWdCeVByb2JlUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IE9ubGluZUNQVU1lbVJlcXVlc3QgOj0gdHJ1ZQpkZWZhdWx0IFBhdXNlQ29udGFpbmVyUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFJlYWRTdHJlYW1SZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgUmVtb3ZlQ29udGFpbmVyUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgUmVtb3ZlU3RhbGVWaXJ0aW9mc1NoYXJlTW91bnRzUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgUmVzZWVkUmFuZG9tRGV2UmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFJlc3VtZUNvbnRhaW5lclJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBTZXRHdWVzdERhdGVUaW1lUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFNldFBvbGljeVJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBTaWduYWxQcm9jZXNzUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgU3RhcnRDb250YWluZXJSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBTdGFydFRyYWNpbmdSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgU3RhdHNDb250YWluZXJSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBTdG9wVHJhY2luZ1JlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBUdHlXaW5SZXNpemVSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBVcGRhdGVDb250YWluZXJSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgVXBkYXRlRXBoZW1lcmFsTW91bnRzUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFVwZGF0ZUludGVyZmFjZVJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBVcGRhdGVSb3V0ZXNSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgV2FpdFByb2Nlc3NSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBXcml0ZVN0cmVhbVJlcXVlc3QgOj0gZmFsc2UKCiMgQWxsb3dSZXF1ZXN0c0ZhaWxpbmdQb2xpY3kgOj0gdHJ1ZSBjb25maWd1cmVzIHRoZSBBZ2VudCB0byAqYWxsb3cgYW55CiMgcmVxdWVzdHMgY2F1c2luZyBhIHBvbGljeSBmYWlsdXJlKi4gVGhpcyBpcyBhbiB1bnNlY3VyZSBjb25maWd1cmF0aW9uCiMgYnV0IGlzIHVzZWZ1bCBmb3IgYWxsb3dpbmcgdW5zZWN1cmUgcG9kcyB0byBzdGFydCwgdGhlbiBjb25uZWN0IHRvCiMgdGhlbSBhbmQgaW5zcGVjdCBPUEEgbG9ncyBmb3IgdGhlIHJvb3QgY2F1c2Ugb2YgYSBmYWlsdXJlLgpkZWZhdWx0IEFsbG93UmVxdWVzdHNGYWlsaW5nUG9saWN5IDo9IGZhbHNlCgojIENvbnN0YW50cwpTX05BTUVfS0VZID0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZSIKU19OQU1FU1BBQ0VfS0VZID0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZXNwYWNlIgpCVU5ETEVfSUQgPSAiW2EtejAtOV17NjR9IgoKQ3JlYXRlQ29udGFpbmVyUmVxdWVzdDo9IHJlc3AgewogICAgbm90IGlzX251bGwoaW5wdXQuZW52X21hcCkKICAgIAogICAgaV9lbnZfbWFwIDo9IGlucHV0LmVudl9tYXAKICAgIAogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBwX2Vudl9tYXAgOj0gcF9jb250YWluZXIuZW52X21hcCAgCiAgICBhbGxvd19lbnZfbWFwKHBfZW52X21hcCwgaV9lbnZfbWFwKQogICAgCiAgICBpX3Byb2Nlc3MgOj0gaW5wdXQuYmFzZS5PQ0kuUHJvY2VzcwogICAgCiAgICBwX3Byb2Nlc3MgOj0gcF9jb250YWluZXIuT0NJLlByb2Nlc3MKICAgIAogICAgYWxsb3dfYXJncyhpX3Byb2Nlc3MsIHBfcHJvY2VzcywgaV9lbnZfbWFwKQoKICAgIHJlc3AgPSBDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uKGlucHV0LmJhc2UpCiAgICBwcmludCgiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdDogdHJ1ZSIpCn0KCmFsbG93X2FyZ3MoaV9wcm9jZXNzLCBwX3Byb2Nlc3MsIGlfZW52X21hcCkgewogICAgaV9hcmdzIDo9IGlfcHJvY2Vzcy5BcmdzCiAgICBwX2FyZ3MgOj0gcF9wcm9jZXNzLkFyZ3MKICAgIHByaW50KCJhbGxvd19hcmdzOiBpX2FyZ3MgPSIsIGlfYXJncywgInBfYXJncyA9IiwgcF9hcmdzKQogICAgY291bnQoaV9hcmdzKSA9PSBjb3VudChwX2FyZ3MpCiAgICBldmVyeSBpLCBpX2FyZyBpbiBpX2FyZ3MgewogICAgICAgIHByaW50KCJhbGxvd19hcmdzOiBpX2FyZyA9IiwgaV9hcmcpCiAgICAgICAgcF9hcmdfcmVwbGFjZWQgOj0gcmVwbGFjZV9lbnZfdmFyaWFibGVzKHBfYXJnc1tpXSwgaV9lbnZfbWFwKQogICAgICAgIHByaW50KCJhbGxvd19hcmdzOiBwX2FyZ19yZXBsYWNlZCA9IiwgcF9hcmdfcmVwbGFjZWQpCiAgICAgICAgcF9hcmdfcmVwbGFjZWQyIDo9IHJlcGxhY2UocF9hcmdfcmVwbGFjZWQsICIkJCIsICIkIikKICAgICAgICBwcmludCgiYWxsb3dfYXJnczogcF9hcmdfcmVwbGFjZWQyID0iLCBwX2FyZ19yZXBsYWNlZDIpCiAgICAgICAgaV9hcmcgPT0gcF9hcmdfcmVwbGFjZWQyCiAgICB9CiAgICBwcmludCgiYWxsb3dfYXJnczogdHJ1ZSIpCn0KCmFsbG93X2FyZ3MoaV9wcm9jZXNzLCBwX3Byb2Nlc3MsIGlfZW52X21hcCkgewogICAgbm90IGlfcHJvY2Vzcy5BcmdzCiAgICBub3QgcF9wcm9jZXNzLkFyZ3MKICAgIHByaW50KCJhbGxvd19hcmdzMjogbm8gYXJncyIpCn0KCiMgdGhpcyBmdW5jdGlvbiByZXBsYWNlcyBhbGwgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyBpbiBhIHN0cmluZywgZ2l2ZW4gYSBtYXAgb2YgZW52aXJvbm1lbnQga2V5cyB0byBlbnZpcm9ubWVudCB2YWx1ZXMKIyBlZyBzdHIgPSAiZWNobyAkKENMVVNURVJfSUQpOyBlY2hvICQoTk9ERV9OQU1FKTsiCiMgZW52X21hcCA9IHsiQ0xVU1RFUl9JRCI6ICJhYmMiLCAiTk9ERV9OQU1FIiA6ICJ4eXoifQojIHJlc3VsdCA9ICJlY2hvIGFiYzsgZWNobyB4eXo7IgpyZXBsYWNlX2Vudl92YXJpYWJsZXMoc3RyLCBlbnZfbWFwKSA9IHJlc3VsdCB7CiAgICAjIG1ha2UgYW4gYXJyYXkgb2YgdGhlIGtleXMgZWcgWyJDTFVTVEVSX0lEIiwgIk5PREVfTkFNRSJdCiAgICBrZXlzIDo9IFt4IHwgc29tZSB4IGluIG9iamVjdC5rZXlzKGVudl9tYXApXQogICAgcmVzdWx0IDo9IHJlcGxhY2Vfc3RyX3JlYyhzdHIsIGVudl9tYXAsIGtleXMsIGNvdW50KGtleXMpIC0gMSkKfQoKIyBiYXNlIGNhc2UKcmVwbGFjZV9zdHJfcmVjKHN0ciwgZW52X21hcCwgYXJyX2tleXMsIGkpID0gcmVzdWx0IHsKICAgIGkgPCAwCiAgICByZXN1bHQgOj0gc3RyCn0KCiMgcmVjdXJzaXZlIHN0ZXAKcmVwbGFjZV9zdHJfcmVjKHN0ciwgZW52X21hcCwgYXJyX2tleXMsIGkpID0gcmVzdWx0IHsKICAgIGkgPj0gMAogICAga2V5IDo9IGFycl9rZXlzW2ldCiAgICBlbnZfa2V5MSA6PSBjb25jYXQoIiIsIFsiJCgiLCBrZXksICIpIl0pCiAgICAjIHJlcGxhY2UgJChWQVIpIHdpdGggdmFsdWUKICAgIG5ld19zdHIxIDo9IHJlcGxhY2Uoc3RyLCBlbnZfa2V5MSwgZW52X21hcFtrZXldKQogICAgIyByZXBsYWNlIG5leHQgZW52aXJvbm1lbnQgdmFyaWFibGUKICAgIHJlc3VsdCA9IHJlcGxhY2Vfc3RyX3JlYyhuZXdfc3RyMSwgZW52X21hcCwgYXJyX2tleXMsIGkgLSAxKQp9CgphbGxvd19lbnZfbWFwKHBfZW52X21hcCwgaV9lbnZfbWFwKSB7CiAgICBwcmludCgiYWxsb3dfZW52X21hcDogcF9lbnZfbWFwID0iLCBwX2Vudl9tYXApCiAgICBldmVyeSBlbnZfa2V5LCBlbnZfdmFsIGluIGlfZW52X21hcCB7CiAgICAgICAgcHJpbnQoImFsbG93X2VudjogZW52X2tleSA9IiwgZW52X2tleSwgImVudl92YWwgPSIsIGVudl92YWwpCiAgICAgICAgYWxsb3dfZW52X21hcF9lbnRyeShlbnZfa2V5LCBlbnZfdmFsLCBwX2Vudl9tYXApCiAgICB9CiAgICBwcmludCgiYWxsb3dfZW52X21hcDogdHJ1ZSIpCn0KCiMgQWxsb3cgZXhhY3QgbWF0Y2gKYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBpX3ZhbCA9PSBwX3ZhbAogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnk6IHRydWUiKQp9CgojIEFsbG93IHJlc291cmNlRmllbGRSZWYgdmFsdWVzIChlLmcuLCAibGltaXRzLmNwdSIpLgphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgICMgYSB2YXJpYWJsZSB3ZSBzaG91bGQgYmUgdmFsaWRhdGluZyB1c2luZyBhIHJlZ2V4IGZyb20gc2V0dGluZ3MKICAgIHBfdmFsID09ICIkKHZhbGlkYXRlLWZyb20tc2V0dGluZ3MpIgogICAgcmVnZXhfdmFsIDo9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuQ3JlYXRlQ29udGFpbmVyUmVxdWVzdC5hbGxvd19lbnZfcmVnZXhfbWFwW2tleV0KICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4X3ZhbCwgaV92YWwpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSAyOiB0cnVlIikKfQoKIyBBbGxvdyBub2RlLW5hbWUKYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChub2RlLW5hbWUpIgogICAgcmVnZXgubWF0Y2gocG9saWN5X2RhdGEuY29tbW9uLmRuc19zdWJkb21haW4gLCBpX3ZhbCkKICAgIHByaW50KCJhbGxvd19lbnZfbWFwX2VudHJ5IDM6IHRydWUiKQp9CgojIEFsbG93IGhvc3QtbmFtZQphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgIHBfdmFsID09ICIkKGhvc3QtbmFtZSkiCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24uZG5zX2xhYmVsICwgaV92YWwpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSA0OiB0cnVlIikKfQoKIyBBbGxvdyBwb2QtdWlkCmFsbG93X2Vudl9tYXBfZW50cnkoa2V5LCBpX3ZhbCwgcF9lbnZfbWFwKSB7CiAgICBwX3ZhbCA6PSBwX2Vudl9tYXBba2V5XQogICAgcF92YWwgPT0gIiQocG9kLXVpZCkiCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24ucG9kX3VpZCAsIGlfdmFsKQogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgNTogdHJ1ZSIpCn0KCiMgQWxsb3cgZmllbGRSZWYgImZpZWxkUGF0aDogc3RhdHVzLnBvZElQIiB2YWx1ZXMuCmFsbG93X2Vudl9tYXBfZW50cnkoa2V5LCBpX3ZhbCwgcF9lbnZfbWFwKSB7CiAgICBpc19pcChpX3ZhbCkKCiAgICBwX3ZhbCA6PSBwX2Vudl9tYXBba2V5XQogICAgcF92YXIgOj0gY29uY2F0KCI9IiwgW2tleSwgcF92YWxdKQogICAgYWxsb3dfcG9kX2lwX3ZhcihrZXksIHBfdmFyKQogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgNjogdHJ1ZSIpCn0KCiMgQWxsb3cgZmllbGRSZWYgImZpZWxkUGF0aDogc3RhdHVzLmhvc3RJUCIgdmFsdWVzLgphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgaXNfaXAoaV92YWwpCgogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgIHBfdmFyIDo9IGNvbmNhdCgiPSIsIFtrZXksIHBfdmFsXSkKICAgIGFsbG93X2hvc3RfaXBfdmFyKGtleSwgcF92YXIpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSA3OiB0cnVlIikKfQoKIyBNYXRjaCBpbnB1dCB3aXRoIG9uZSBvZiB0aGUgcG9saWN5IHZhcmlhYmxlcywgYWZ0ZXIgc3Vic3RpdHV0aW5nICQoc2FuZGJveC1uYW1lKS4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChzYW5kYm94LW5hbWUpIgogICAgc19uYW1lIDo9IGlucHV0LmJhc2UuT0NJLkFubm90YXRpb25zW1NfTkFNRV9LRVldCiAgICBwX3ZhcjIgOj0gcmVwbGFjZShwX3ZhbCwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHBfdmFyMiA9PSBpX3ZhbAogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgODogdHJ1ZSIpCn0KCiMgTWF0Y2ggaW5wdXQgd2l0aCBvbmUgb2YgdGhlIHBvbGljeSB2YXJpYWJsZXMsIGFmdGVyIHN1YnN0aXR1dGluZyAkKHNhbmRib3gtbmFtZXNwYWNlKS4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChzYW5kYm94LW5hbWVzcGFjZSkiCiAgICBzX25hbWVzcGFjZSA6PSBpbnB1dC5iYXNlLk9DSS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwX3ZhcjIgOj0gcmVwbGFjZShwX3ZhbCwgIiQoc2FuZGJveC1uYW1lc3BhY2UpIiwgc19uYW1lc3BhY2UpCiAgICBwX3ZhcjIgPT0gaV92YWwKICAgIHByaW50KCJhbGxvd19lbnZfbWFwX2VudHJ5IDk6IHRydWUiKQp9CgojIEFsbG93IGlucHV0IGVudiB2YXJpYWJsZXMgdGhhdCBtYXRjaCB3aXRoIGEgcmVxdWVzdF9kZWZhdWx0cyByZWdleC4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHNvbWUgcF9yZWdleDEgaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5DcmVhdGVDb250YWluZXJSZXF1ZXN0LmFsbG93X2Vudl9yZWdleAogICAgcF9yZWdleDIgOj0gcmVwbGFjZShwX3JlZ2V4MSwgIiQoaXB2NF9hKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcHY0X2EpCiAgICBwX3JlZ2V4MyA6PSByZXBsYWNlKHBfcmVnZXgyLCAiJChpcF9wKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcF9wKQogICAgcF9yZWdleDQgOj0gcmVwbGFjZShwX3JlZ2V4MywgIiQoc3ZjX25hbWUpIiwgcG9saWN5X2RhdGEuY29tbW9uLnN2Y19uYW1lKQogICAgcF9yZWdleDUgOj0gcmVwbGFjZShwX3JlZ2V4NCwgIiQoZG5zX2xhYmVsKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5kbnNfbGFiZWwpCgogICAgcmVzdWx0IDo9IGNvbmNhdCgiPSIsIFtrZXksIGlfdmFsXSkKICAgIHJlZ2V4Lm1hdGNoKHBfcmVnZXg1LCByZXN1bHQpCgogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgMTA6IHRydWUiKQp9CgpDcmVhdGVDb250YWluZXJSZXF1ZXN0Oj0gcmVzcCB7CiAgICBub3QgaW5wdXQuZW52X21hcAogICAgaV9wcm9jZXNzID0gaW5wdXQuT0NJLlByb2Nlc3MKICAgIHNfbmFtZSA9IGlucHV0Lk9DSS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBwX3Byb2Nlc3MgPSBwX2NvbnRhaW5lci5PQ0kuUHJvY2VzcwogICAgYWxsb3dfZGVwcmVjYXRlZF9hcmdzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUpCiAgICByZXNwID0gQ3JlYXRlQ29udGFpbmVyUmVxdWVzdENvbW1vbihpbnB1dCkKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0MjogdHJ1ZSIpCn0KCkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb24ocmVxKTo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgICMgQ2hlY2sgaWYgdGhlIGlucHV0IHJlcXVlc3Qgc2hvdWxkIGJlIHJlamVjdGVkIGV2ZW4gYmVmb3JlIGNoZWNraW5nIHRoZQogICAgIyBwb2xpY3lfZGF0YS5jb250YWluZXJzIGluZm9ybWF0aW9uLgogICAgYWxsb3dfY3JlYXRlX2NvbnRhaW5lcl9pbnB1dChyZXEpCgogICAgaV9vY2kgOj0gcmVxLk9DSQogICAgaV9zdG9yYWdlcyA6PSByZXEuc3RvcmFnZXMKICAgIGlfZGV2aWNlcyA6PSByZXEuZGV2aWNlcwoKICAgICMgYXJyYXkgb2YgcG9zc2libGUgc3RhdGUgb3BlcmF0aW9ucwogICAgb3BzX2J1aWxkZXIgOj0gW10KCiAgICAjIGNoZWNrIHNhbmRib3ggbmFtZQogICAgc2FuZGJveF9uYW1lID0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FX0tFWV0KICAgIGFkZF9zYW5kYm94X25hbWVfdG9fc3RhdGUgOj0gc3RhdGVfYWxsb3dzKCJzYW5kYm94X25hbWUiLCBzYW5kYm94X25hbWUpCiAgICBvcHNfYnVpbGRlcjEgOj0gY29uY2F0X29wX2lmX25vdF9udWxsKG9wc19idWlsZGVyLCBhZGRfc2FuZGJveF9uYW1lX3RvX3N0YXRlKQoKICAgICMgQ2hlY2sgaWYgYW55IGVsZW1lbnQgZnJvbSB0aGUgcG9saWN5X2RhdGEuY29udGFpbmVycyBhcnJheSBhbGxvd3MgdGhlIGlucHV0IHJlcXVlc3QuCiAgICBzb21lIHBfY29udGFpbmVyIGluIHBvbGljeV9kYXRhLmNvbnRhaW5lcnMKICAgIHByaW50KCI9PT09PT09PSBDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiB0cnlpbmcgbmV4dCBwb2xpY3kgY29udGFpbmVyIikKCiAgICBwX3BpZG5zIDo9IHBfY29udGFpbmVyLnNhbmRib3hfcGlkbnMKICAgIGlfcGlkbnMgOj0gcmVxLnNhbmRib3hfcGlkbnMKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiBwX3BpZG5zID0iLCBwX3BpZG5zLCAiaV9waWRucyA9IiwgaV9waWRucykKICAgIHBfcGlkbnMgPT0gaV9waWRucwoKICAgIHBfb2NpIDo9IHBfY29udGFpbmVyLk9DSQoKICAgICMgY2hlY2sgbmFtZXNwYWNlCiAgICBwX25hbWVzcGFjZSA6PSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBpX25hbWVzcGFjZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwcmludCAoIkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb246IHBfbmFtZXNwYWNlID0iLCBwX25hbWVzcGFjZSwgImlfbmFtZXNwYWNlID0iLCBpX25hbWVzcGFjZSkKICAgIGFkZF9uYW1lc3BhY2VfdG9fc3RhdGUgOj0gYWxsb3dfbmFtZXNwYWNlKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkKICAgIG9wc19idWlsZGVyMiA6PSBjb25jYXRfb3BfaWZfbm90X251bGwob3BzX2J1aWxkZXIxLCBhZGRfbmFtZXNwYWNlX3RvX3N0YXRlKQoKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiBwIFZlcnNpb24gPSIsIHBfb2NpLlZlcnNpb24sICJpIFZlcnNpb24gPSIsIGlfb2NpLlZlcnNpb24pCiAgICBwX29jaS5WZXJzaW9uID09IGlfb2NpLlZlcnNpb24KCiAgICBwcmludCgiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdENvbW1vbjogcCBSZWFkb25seSA9IiwgcF9vY2kuUm9vdC5SZWFkb25seSwgImkgUmVhZG9ubHkgPSIsIGlfb2NpLlJvb3QuUmVhZG9ubHkpCiAgICBwX29jaS5Sb290LlJlYWRvbmx5ID09IGlfb2NpLlJvb3QuUmVhZG9ubHkKCiAgICBhbGxvd19hbm5vKHBfb2NpLCBpX29jaSkKCiAgICBwX3N0b3JhZ2VzIDo9IHBfY29udGFpbmVyLnN0b3JhZ2VzCiAgICBhbGxvd19ieV9hbm5vKHBfb2NpLCBpX29jaSwgcF9zdG9yYWdlcywgaV9zdG9yYWdlcykKCiAgICBwX2RldmljZXMgOj0gcF9jb250YWluZXIuZGV2aWNlcwogICAgYWxsb3dfZGV2aWNlcyhwX2RldmljZXMsIGlfZGV2aWNlcykKCiAgICByZXQgOj0gYWxsb3dfbGludXgob3BzX2J1aWxkZXIyLCBwX29jaSwgaV9vY2kpCiAgICByZXQuYWxsb3dlZAoKICAgIG9wcyA6PSByZXQub3BzCgogICAgcHJpbnQoIkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb246IHRydWUiKQp9CgphbGxvd19jcmVhdGVfY29udGFpbmVyX2lucHV0KHJlcSkgewogICAgcHJpbnQoImFsbG93X2NyZWF0ZV9jb250YWluZXJfaW5wdXQ6IGlucHV0ID0iLCByZXEpCgogICAgY291bnQocmVxLnNoYXJlZF9tb3VudHMpID09IDAKICAgIGlzX251bGwocmVxLnN0cmluZ191c2VyKQoKICAgIGlfb2NpIDo9IHJlcS5PQ0kKICAgIGlzX251bGwoaV9vY2kuSG9va3MpCiAgICBpc19udWxsKGlfb2NpLlNvbGFyaXMpCiAgICBpc19udWxsKGlfb2NpLldpbmRvd3MpCgogICAgaV9saW51eCA6PSBpX29jaS5MaW51eAogICAgY291bnQoaV9saW51eC5HSURNYXBwaW5ncykgPT0gMAogICAgY291bnQoaV9saW51eC5Nb3VudExhYmVsKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlJlc291cmNlcy5EZXZpY2VzKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlJvb3Rmc1Byb3BhZ2F0aW9uKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlVJRE1hcHBpbmdzKSA9PSAwCiAgICBpc19udWxsKGlfbGludXguSW50ZWxSZHQpCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLkJsb2NrSU8pCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLk5ldHdvcmspCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLlBpZHMpCiAgICBpc19udWxsKGlfbGludXguU2VjY29tcCkKCiAgICBpX3Byb2Nlc3MgOj0gaV9vY2kuUHJvY2VzcwogICAgY291bnQoaV9wcm9jZXNzLlNlbGludXhMYWJlbCkgPT0gMAogICAgY291bnQoaV9wcm9jZXNzLlVzZXIuVXNlcm5hbWUpID09IDAKCiAgICBwcmludCgiYWxsb3dfY3JlYXRlX2NvbnRhaW5lcl9pbnB1dDogdHJ1ZSIpCn0KCmFsbG93X25hbWVzcGFjZShwX25hbWVzcGFjZSwgaV9uYW1lc3BhY2UpID0gYWRkX25hbWVzcGFjZSB7CiAgICBwX25hbWVzcGFjZSA9PSBpX25hbWVzcGFjZQogICAgYWRkX25hbWVzcGFjZSA6PSBudWxsCiAgICBwcmludCgiYWxsb3dfbmFtZXNwYWNlIDE6IGlucHV0IG5hbWVzcGFjZSBtYXRjaGVzIHBvbGljeSBkYXRhIikKfQoKYWxsb3dfbmFtZXNwYWNlKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkgPSBhZGRfbmFtZXNwYWNlIHsKICAgIHBfbmFtZXNwYWNlID09ICIiCiAgICBwcmludCgiYWxsb3dfbmFtZXNwYWNlIDI6IG5vIG5hbWVzcGFjZSBmb3VuZCBvbiBwb2xpY3kgZGF0YSIpCiAgICBhZGRfbmFtZXNwYWNlIDo9IHN0YXRlX2FsbG93cygibmFtZXNwYWNlIiwgaV9uYW1lc3BhY2UpCn0KCiMgdmFsdWUgaGFzbid0IGJlZW4gc2VlbiBiZWZvcmUsIHNhdmUgaXQgdG8gc3RhdGUKc3RhdGVfYWxsb3dzKGtleSwgdmFsdWUpID0gYWN0aW9uIHsKICBzdGF0ZSA6PSBnZXRfc3RhdGUoKQogIHByaW50KCJzdGF0ZV9hbGxvd3MgMTogc3RhdGVba2V5XSA9Iiwgc3RhdGVba2V5XSwgInZhbHVlID0iLCB2YWx1ZSkKICBub3Qgc3RhdGVba2V5XQogIHByaW50KCJzdGF0ZV9hbGxvd3MgMTogc2F2aW5nIHRvIHN0YXRlIGtleSA9Iiwga2V5LCAidmFsdWUgPSIsIHZhbHVlKQogIHBhdGggOj0gZ2V0X3N0YXRlX3BhdGgoa2V5KSAKICBhY3Rpb24gOj0gewogICAgIm9wIjogImFkZCIsCiAgICAicGF0aCI6IHBhdGgsIAogICAgInZhbHVlIjogdmFsdWUsCiAgfQp9CgojIHZhbHVlIG1hdGNoZXMgd2hhdCdzIGluIHN0YXRlLCBhbGxvdyBpdApzdGF0ZV9hbGxvd3Moa2V5LCB2YWx1ZSkgPSBhY3Rpb24gewogIHByaW50KCJzdGF0ZV9hbGxvd3MgMjogc3RhcnQiKQogIHN0YXRlIDo9IGdldF9zdGF0ZSgpCiAgcHJpbnQoInN0YXRlX2FsbG93cyAyOiBzdGF0ZVtrZXldID0iLCBzdGF0ZVtrZXldLCAidmFsdWUgPSIsIHZhbHVlKQogIHZhbHVlID09IHN0YXRlW2tleV0KICBwcmludCgic3RhdGVfYWxsb3dzIDI6IGZvdW5kIGtleSA9Iiwga2V5LCAidmFsdWUgPSIsIHZhbHVlLCAiIGluIHN0YXRlIikKICBhY3Rpb24gOj0gbnVsbAp9CgojIGhlbHBlciBmdW5jdGlvbnMgdG8gaW50ZXJhY3Qgd2l0aCB0aGUgc3RhdGUKZ2V0X3N0YXRlKCkgPSBzdGF0ZSB7CiAgc3RhdGUgOj0gZGF0YVsicHN0YXRlIl0KfQoKZ2V0X3N0YXRlX3ZhbChrZXkpID0gdmFsdWUgewogICAgc3RhdGUgOj0gZ2V0X3N0YXRlKCkKICAgIHZhbHVlIDo9IHN0YXRlW2tleV0KfQoKZ2V0X3N0YXRlX3BhdGgoa2V5KSA9IHBhdGggewogICAgIyBwcmVwZW5kICIvcHN0YXRlLyIgdG8ga2V5CiAgICBwYXRoIDo9IGNvbmNhdCgiLyIsIFsiL3BzdGF0ZSIsIGtleV0pCn0KCiMgSGVscGVyIGZ1bmN0aW9ucyB0byBjb25kaXRpb25hbGx5IGNvbmNhdGVuYXRlIG9wIGlzIG5vdCBudWxsCmNvbmNhdF9vcF9pZl9ub3RfbnVsbChvcHMsIG9wKSA9IHJlc3VsdCB7CiAgICBvcCA9PSBudWxsCiAgICByZXN1bHQgOj0gb3BzCn0KCmNvbmNhdF9vcF9pZl9ub3RfbnVsbChvcHMsIG9wKSA9IHJlc3VsdCB7CiAgICBvcCAhPSBudWxsCiAgICByZXN1bHQgOj0gYXJyYXkuY29uY2F0KG9wcywgW29wXSkKfQoKIyBSZWplY3QgdW5leHBlY3RlZCBhbm5vdGF0aW9ucy4KYWxsb3dfYW5ubyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19hbm5vIDE6IHN0YXJ0IikKCiAgICBub3QgaV9vY2kuQW5ub3RhdGlvbnMKCiAgICBwcmludCgiYWxsb3dfYW5ubyAxOiB0cnVlIikKfQphbGxvd19hbm5vKHBfb2NpLCBpX29jaSkgewogICAgcHJpbnQoImFsbG93X2Fubm8gMjogcCBBbm5vdGF0aW9ucyA9IiwgcF9vY2kuQW5ub3RhdGlvbnMpCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiBpIEFubm90YXRpb25zID0iLCBpX29jaS5Bbm5vdGF0aW9ucykKCiAgICBpX2tleXMgOj0gb2JqZWN0LmtleXMoaV9vY2kuQW5ub3RhdGlvbnMpCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiBpIGtleXMgPSIsIGlfa2V5cykKCiAgICBldmVyeSBpX2tleSBpbiBpX2tleXMgewogICAgICAgIGFsbG93X2Fubm9fa2V5KGlfa2V5LCBwX29jaSkKICAgIH0KCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiB0cnVlIikKfQoKYWxsb3dfYW5ub19rZXkoaV9rZXksIHBfb2NpKSB7CiAgICBwcmludCgiYWxsb3dfYW5ub19rZXkgMTogaSBrZXkgPSIsIGlfa2V5KQoKICAgIHN0YXJ0c3dpdGgoaV9rZXksICJpby5rdWJlcm5ldGVzLmNyaS4iKQoKICAgIHByaW50KCJhbGxvd19hbm5vX2tleSAxOiB0cnVlIikKfQphbGxvd19hbm5vX2tleShpX2tleSwgcF9vY2kpIHsKICAgIHByaW50KCJhbGxvd19hbm5vX2tleSAyOiBpIGtleSA9IiwgaV9rZXkpCgogICAgc29tZSBwX2tleSwgXyBpbiBwX29jaS5Bbm5vdGF0aW9ucwogICAgcF9rZXkgPT0gaV9rZXkKCiAgICBwcmludCgiYWxsb3dfYW5ub19rZXkgMjogdHJ1ZSIpCn0KCiMgR2V0IHRoZSB2YWx1ZSBvZiB0aGUgU19OQU1FX0tFWSBhbm5vdGF0aW9uIGFuZAojIGNvcnJlbGF0ZSBpdCB3aXRoIG90aGVyIGFubm90YXRpb25zIGFuZCBwcm9jZXNzIGZpZWxkcy4KYWxsb3dfYnlfYW5ubyhwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpIHsKICAgIHByaW50KCJhbGxvd19ieV9hbm5vIDE6IHN0YXJ0IikKCiAgICBub3QgcF9vY2kuQW5ub3RhdGlvbnNbU19OQU1FX0tFWV0KCiAgICBpX3NfbmFtZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMTogaV9zX25hbWUgPSIsIGlfc19uYW1lKQoKICAgIGlfc19uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FU1BBQ0VfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMTogaV9zX25hbWVzcGFjZSA9IiwgaV9zX25hbWVzcGFjZSkKCiAgICBhbGxvd19ieV9zYW5kYm94X25hbWUocF9vY2ksIGlfb2NpLCBwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBpX3NfbmFtZSwgaV9zX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfYnlfYW5ubyAxOiB0cnVlIikKfQphbGxvd19ieV9hbm5vKHBfb2NpLCBpX29jaSwgcF9zdG9yYWdlcywgaV9zdG9yYWdlcykgewogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMjogc3RhcnQiKQoKICAgIHBfc19uYW1lIDo9IHBfb2NpLkFubm90YXRpb25zW1NfTkFNRV9LRVldCiAgICBpX3NfbmFtZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMjogaV9zX25hbWUgPSIsIGlfc19uYW1lLCAicF9zX25hbWUgPSIsIHBfc19uYW1lKQoKICAgIGFsbG93X3NhbmRib3hfbmFtZShwX3NfbmFtZSwgaV9zX25hbWUpCgogICAgaV9zX25hbWVzcGFjZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwcmludCgiYWxsb3dfYnlfYW5ubyAyOiBpX3NfbmFtZXNwYWNlID0iLCBpX3NfbmFtZXNwYWNlKQoKICAgIGFsbG93X2J5X3NhbmRib3hfbmFtZShwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMsIGlfc19uYW1lLCBpX3NfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd19ieV9hbm5vIDI6IHRydWUiKQp9CgphbGxvd19ieV9zYW5kYm94X25hbWUocF9vY2ksIGlfb2NpLCBwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfYnlfc2FuZGJveF9uYW1lOiBzdGFydCIpCgogICAgaV9uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FU1BBQ0VfS0VZXQoKICAgIGFsbG93X2J5X2NvbnRhaW5lcl90eXBlcyhwX29jaSwgaV9vY2ksIHNfbmFtZSwgaV9uYW1lc3BhY2UpCiAgICBhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZChwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpCiAgICBhbGxvd19wcm9jZXNzKHBfb2NpLlByb2Nlc3MsIGlfb2NpLlByb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpCgogICAgcHJpbnQoImFsbG93X2J5X3NhbmRib3hfbmFtZTogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfbmFtZShwX3NfbmFtZSwgaV9zX25hbWUpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X25hbWU6IHN0YXJ0IikKICAgIHJlZ2V4Lm1hdGNoKHBfc19uYW1lLCBpX3NfbmFtZSkKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9uYW1lOiB0cnVlIikKfQoKIyBDaGVjayB0aGF0IHRoZSAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLXR5cGUiIGFuZAojICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIiBhbm5vdGF0aW9ucyBkZXNpZ25hdGUgdGhlCiMgZXhwZWN0ZWQgdHlwZSAtIGVpdGhlciBhICJzYW5kYm94IiBvciBhICJjb250YWluZXIiLiBUaGVuLCB2YWxpZGF0ZQojIG90aGVyIGFubm90YXRpb25zIGJhc2VkIG9uIHRoZSBhY3R1YWwgInNhbmRib3giIG9yICJjb250YWluZXIiIHZhbHVlCiMgZnJvbSB0aGUgaW5wdXQgY29udGFpbmVyLgphbGxvd19ieV9jb250YWluZXJfdHlwZXMocF9vY2ksIGlfb2NpLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfYnlfY29udGFpbmVyX3R5cGVzOiBjaGVja2luZyBpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSIpCgogICAgY190eXBlIDo9ICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSIKICAgIAogICAgcF9jcmlfdHlwZSA6PSBwX29jaS5Bbm5vdGF0aW9uc1tjX3R5cGVdCiAgICBpX2NyaV90eXBlIDo9IGlfb2NpLkFubm90YXRpb25zW2NfdHlwZV0KICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZXM6IHBfY3JpX3R5cGUgPSIsIHBfY3JpX3R5cGUsICJpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgcF9jcmlfdHlwZSA9PSBpX2NyaV90eXBlCgogICAgYWxsb3dfYnlfY29udGFpbmVyX3R5cGUoaV9jcmlfdHlwZSwgcF9vY2ksIGlfb2NpLCBzX25hbWUsIHNfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZXM6IHRydWUiKQp9CgphbGxvd19ieV9jb250YWluZXJfdHlwZShpX2NyaV90eXBlLCBwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAxOiBpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgaV9jcmlfdHlwZSA9PSAic2FuZGJveCIKCiAgICBpX2thdGFfdHlwZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1siaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5jb250YWluZXJfdHlwZSJdCiAgICBwcmludCgiYWxsb3dfYnlfY29udGFpbmVyX3R5cGUgMTogaV9rYXRhX3R5cGUgPSIsIGlfa2F0YV90eXBlKQogICAgaV9rYXRhX3R5cGUgPT0gInBvZF9zYW5kYm94IgoKICAgIGFsbG93X3NhbmRib3hfY29udGFpbmVyX25hbWUocF9vY2ksIGlfb2NpKQogICAgYWxsb3dfc2FuZGJveF9uZXRfbmFtZXNwYWNlKHBfb2NpLCBpX29jaSkKICAgIGFsbG93X3NhbmRib3hfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpCgogICAgcHJpbnQoImFsbG93X2J5X2NvbnRhaW5lcl90eXBlIDE6IHRydWUiKQp9CgphbGxvd19ieV9jb250YWluZXJfdHlwZShpX2NyaV90eXBlLCBwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiBpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgaV9jcmlfdHlwZSA9PSAiY29udGFpbmVyIgoKICAgIGlfa2F0YV90eXBlIDo9IGlfb2NpLkFubm90YXRpb25zWyJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIl0KICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiBpX2thdGFfdHlwZSA9IiwgaV9rYXRhX3R5cGUpCiAgICBpX2thdGFfdHlwZSA9PSAicG9kX2NvbnRhaW5lciIKCiAgICBhbGxvd19jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpCiAgICBhbGxvd19uZXRfbmFtZXNwYWNlKHBfb2NpLCBpX29jaSkKICAgIGFsbG93X2xvZ19kaXJlY3RvcnkocF9vY2ksIGlfb2NpKQoKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiB0cnVlIikKfQoKIyAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLW5hbWUiIGFubm90YXRpb24KYWxsb3dfc2FuZGJveF9jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X2NvbnRhaW5lcl9uYW1lOiBzdGFydCIpCgogICAgY29udGFpbmVyX2Fubm90YXRpb25fbWlzc2luZyhwX29jaSwgaV9vY2ksICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItbmFtZSIpCgogICAgcHJpbnQoImFsbG93X3NhbmRib3hfY29udGFpbmVyX25hbWU6IHRydWUiKQp9CgphbGxvd19jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19jb250YWluZXJfbmFtZTogc3RhcnQiKQoKICAgIGFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uKHBfb2NpLCBpX29jaSwgImlvLmt1YmVybmV0ZXMuY3JpLmNvbnRhaW5lci1uYW1lIikKCiAgICBwcmludCgiYWxsb3dfY29udGFpbmVyX25hbWU6IHRydWUiKQp9Cgpjb250YWluZXJfYW5ub3RhdGlvbl9taXNzaW5nKHBfb2NpLCBpX29jaSwga2V5KSB7CiAgICBwcmludCgiY29udGFpbmVyX2Fubm90YXRpb25fbWlzc2luZzoiLCBrZXkpCgogICAgbm90IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIG5vdCBpX29jaS5Bbm5vdGF0aW9uc1trZXldCgogICAgcHJpbnQoImNvbnRhaW5lcl9hbm5vdGF0aW9uX21pc3Npbmc6IHRydWUiKQp9CgphbGxvd19jb250YWluZXJfYW5ub3RhdGlvbihwX29jaSwgaV9vY2ksIGtleSkgewogICAgcHJpbnQoImFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uOiBrZXkgPSIsIGtleSkKCiAgICBwX3ZhbHVlIDo9IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIGlfdmFsdWUgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgcHJpbnQoImFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uOiBwX3ZhbHVlID0iLCBwX3ZhbHVlLCAiaV92YWx1ZSA9IiwgaV92YWx1ZSkKCiAgICBwX3ZhbHVlID09IGlfdmFsdWUKCiAgICBwcmludCgiYWxsb3dfY29udGFpbmVyX2Fubm90YXRpb246IHRydWUiKQp9CgojICJuZXJkY3RsL25ldHdvcmstbmFtZXNwYWNlIiBhbm5vdGF0aW9uCmFsbG93X3NhbmRib3hfbmV0X25hbWVzcGFjZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X25ldF9uYW1lc3BhY2U6IHN0YXJ0IikKCiAgICBrZXkgOj0gIm5lcmRjdGwvbmV0d29yay1uYW1lc3BhY2UiCgogICAgcF9uYW1lc3BhY2UgOj0gcF9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgaV9uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgcHJpbnQoImFsbG93X3NhbmRib3hfbmV0X25hbWVzcGFjZTogcF9uYW1lc3BhY2UgPSIsIHBfbmFtZXNwYWNlLCAiaV9uYW1lc3BhY2UgPSIsIGlfbmFtZXNwYWNlKQoKICAgIHJlZ2V4Lm1hdGNoKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9uZXRfbmFtZXNwYWNlOiB0cnVlIikKfQoKYWxsb3dfbmV0X25hbWVzcGFjZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19uZXRfbmFtZXNwYWNlOiBzdGFydCIpCgogICAga2V5IDo9ICJuZXJkY3RsL25ldHdvcmstbmFtZXNwYWNlIgoKICAgIG5vdCBwX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICBub3QgaV9vY2kuQW5ub3RhdGlvbnNba2V5XQoKICAgIHByaW50KCJhbGxvd19uZXRfbmFtZXNwYWNlOiB0cnVlIikKfQoKIyAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1sb2ctZGlyZWN0b3J5IiBhbm5vdGF0aW9uCmFsbG93X3NhbmRib3hfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X2xvZ19kaXJlY3Rvcnk6IHN0YXJ0IikKCiAgICBrZXkgOj0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbG9nLWRpcmVjdG9yeSIKCiAgICBwX2RpciA6PSBwX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICByZWdleDEgOj0gcmVwbGFjZShwX2RpciwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHJlZ2V4MiA6PSByZXBsYWNlKHJlZ2V4MSwgIiQoc2FuZGJveC1uYW1lc3BhY2UpIiwgc19uYW1lc3BhY2UpCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiByZWdleDIgPSIsIHJlZ2V4MikKCiAgICBpX2RpciA6PSBpX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiBpX2RpciA9IiwgaV9kaXIpCgogICAgcmVnZXgubWF0Y2gocmVnZXgyLCBpX2RpcikKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiB0cnVlIikKfQoKYWxsb3dfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19sb2dfZGlyZWN0b3J5OiBzdGFydCIpCgogICAga2V5IDo9ICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWxvZy1kaXJlY3RvcnkiCgogICAgbm90IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIG5vdCBpX29jaS5Bbm5vdGF0aW9uc1trZXldCgogICAgcHJpbnQoImFsbG93X2xvZ19kaXJlY3Rvcnk6IHRydWUiKQp9CgphbGxvd19kZXZpY2VzKHBfZGV2aWNlcywgaV9kZXZpY2VzKSB7CiAgICBwcmludCgiYWxsb3dfZGV2aWNlczogc3RhcnQiKQogICAgZXZlcnkgaV9kZXZpY2UgaW4gaV9kZXZpY2VzIHsKICAgICAgICBwcmludCgiYWxsb3dfZGV2aWNlczogaV9kZXZpY2UgPSIsIGlfZGV2aWNlKQogICAgICAgIHNvbWUgcF9kZXZpY2UgaW4gcF9kZXZpY2VzCiAgICAgICAgcF9kZXZpY2UuY29udGFpbmVyX3BhdGggPT0gaV9kZXZpY2UuY29udGFpbmVyX3BhdGgKICAgIH0KICAgIHByaW50KCJhbGxvd19kZXZpY2VzOiB0cnVlIikKfQoKYWxsb3dfbGludXgoc3RhdGVfb3BzLCBwX29jaSwgaV9vY2kpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIHBfbmFtZXNwYWNlcyA6PSBwX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbGludXg6IHAgbmFtZXNwYWNlcyA9IiwgcF9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlcyA6PSBpX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbGludXg6IGkgbmFtZXNwYWNlcyA9IiwgaV9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlX3dpdGhvdXRfbmV0d29yayA6PSBbb2JqIHwgb2JqIDo9IGlfbmFtZXNwYWNlc1tfXTsgb2JqLlR5cGUgIT0gIm5ldHdvcmsiXQoKICAgIHByaW50KCJhbGxvd19saW51eDogaV9uYW1lc3BhY2Vfd2l0aG91dF9uZXR3b3JrID0iLCBpX25hbWVzcGFjZV93aXRob3V0X25ldHdvcmspCgogICAgcF9uYW1lc3BhY2VzID09IGlfbmFtZXNwYWNlX3dpdGhvdXRfbmV0d29yawoKICAgIGFsbG93X21hc2tlZF9wYXRocyhwX29jaSwgaV9vY2kpCiAgICBhbGxvd19yZWFkb25seV9wYXRocyhwX29jaSwgaV9vY2kpCiAgICBhbGxvd19saW51eF9kZXZpY2VzKHBfb2NpLkxpbnV4LkRldmljZXMsIGlfb2NpLkxpbnV4LkRldmljZXMpCiAgICBhbGxvd19saW51eF9zeXNjdGwocF9vY2kuTGludXgsIGlfb2NpLkxpbnV4KQogICAgcmV0IDo9IGFsbG93X25ldHdvcmtfbmFtZXNwYWNlX3N0YXJ0KHN0YXRlX29wcywgcF9vY2ksIGlfb2NpKQogICAgcmV0LmFsbG93ZWQKCiAgICBvcHMgOj0gcmV0Lm9wcwoKICAgIHByaW50KCJhbGxvd19saW51eDogdHJ1ZSIpCn0KCiMgUmV0cmlldmUgdGhlICJuZXR3b3JrIiBuYW1lc3BhY2UgZnJvbSB0aGUgaW5wdXQgZGF0YSBhbmQgcGFzcyBpdCBvbiBmb3IgdGhlCiMgbmV0d29yayBuYW1lc3BhY2UgcG9saWN5IGNoZWNrcy4KYWxsb3dfbmV0d29ya19uYW1lc3BhY2Vfc3RhcnQoc3RhdGVfb3BzLCBwX29jaSwgaV9vY2kpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIHByaW50KCJhbGxvd19uZXR3b3JrX25hbWVzcGFjZSBzdGFydDogc3RhcnQiKQoKICAgIHBfbmFtZXNwYWNlcyA6PSBwX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IHAgbmFtZXNwYWNlcyA9IiwgcF9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlcyA6PSBpX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IGkgbmFtZXNwYWNlcyA9IiwgaV9uYW1lc3BhY2VzKQoKICAgICMgUmV0dXJuIHBhdGggb2YgdGhlICJuZXR3b3JrIiBuYW1lc3BhY2UKICAgIG5ldHdvcmtfbnMgOj0gW29iaiB8IG9iaiA6PSBpX25hbWVzcGFjZXNbX107IG9iai5UeXBlID09ICJuZXR3b3JrIl0KCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IG5ldHdvcmtfbnMgPSIsIG5ldHdvcmtfbnMpCgogICAgcmV0IDo9IGFsbG93X25ldHdvcmtfbmFtZXNwYWNlKHN0YXRlX29wcywgbmV0d29ya19ucykKICAgIHJldC5hbGxvd2VkCgogICAgb3BzIDo9IHJldC5vcHMKfQoKIyBUaGlzIHJ1bGUgaXMgd2hlbiB0aGVyZSdzIG5vIG5ldHdvcmsgbmFtZXNwYWNlIGluIHRoZSBpbnB1dCBkYXRhLgphbGxvd19uZXR3b3JrX25hbWVzcGFjZShzdGF0ZV9vcHMsIG5ldHdvcmtfbnMpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIGNvdW50KG5ldHdvcmtfbnMpID09IDAKCiAgICBuZXR3b3JrX25zX3BhdGggPSAiIgoKICAgIGFkZF9uZXR3b3JrX25hbWVzcGFjZV90b19zdGF0ZSA6PSBzdGF0ZV9hbGxvd3MoIm5ldHdvcmtfbmFtZXNwYWNlIiwgbmV0d29ya19uc19wYXRoKQogICAgb3BzIDo9IGNvbmNhdF9vcF9pZl9ub3RfbnVsbChzdGF0ZV9vcHMsIGFkZF9uZXR3b3JrX25hbWVzcGFjZV90b19zdGF0ZSkKCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2UgMTogdHJ1ZSIpCn0KCiMgVGhpcyBydWxlIGlzIHdoZW4gdGhlcmUncyBleGFjdGx5IG9uZSBuZXR3b3JrIG5hbWVzcGFjZSBpbiB0aGUgaW5wdXQgZGF0YS4KYWxsb3dfbmV0d29ya19uYW1lc3BhY2Uoc3RhdGVfb3BzLCBuZXR3b3JrX25zKSA6PSB7Im9wcyI6IG9wcywgImFsbG93ZWQiOiB0cnVlfSB7CiAgICBjb3VudChuZXR3b3JrX25zKSA9PSAxCgogICAgYWRkX25ldHdvcmtfbmFtZXNwYWNlX3RvX3N0YXRlIDo9IHN0YXRlX2FsbG93cygibmV0d29ya19uYW1lc3BhY2UiLCBuZXR3b3JrX25zWzBdLlBhdGgpCiAgICBvcHMgOj0gY29uY2F0X29wX2lmX25vdF9udWxsKHN0YXRlX29wcywgYWRkX25ldHdvcmtfbmFtZXNwYWNlX3RvX3N0YXRlKQoKICAgIHByaW50KCJhbGxvd19uZXR3b3JrX25hbWVzcGFjZSAyOiB0cnVlIikKfQoKYWxsb3dfbWFza2VkX3BhdGhzKHBfb2NpLCBpX29jaSkgewogICAgcF9wYXRocyA6PSBwX29jaS5MaW51eC5NYXNrZWRQYXRocwogICAgcHJpbnQoImFsbG93X21hc2tlZF9wYXRocyAxOiBwX3BhdGhzID0iLCBwX3BhdGhzKQoKICAgIGlfcGF0aHMgOj0gaV9vY2kuTGludXguTWFza2VkUGF0aHMKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aHMgMTogaV9wYXRocyA9IiwgaV9wYXRocykKCiAgICBhbGxvd19tYXNrZWRfcGF0aHNfYXJyYXkocF9wYXRocywgaV9wYXRocykKCiAgICBwcmludCgiYWxsb3dfbWFza2VkX3BhdGhzIDE6IHRydWUiKQp9CmFsbG93X21hc2tlZF9wYXRocyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aHMgMjogc3RhcnQiKQoKICAgIG5vdCBwX29jaS5MaW51eC5NYXNrZWRQYXRocwogICAgbm90IGlfb2NpLkxpbnV4Lk1hc2tlZFBhdGhzCgogICAgcHJpbnQoImFsbG93X21hc2tlZF9wYXRocyAyOiB0cnVlIikKfQoKIyBBbGwgdGhlIHBvbGljeSBtYXNrZWQgcGF0aHMgbXVzdCBiZSBtYXNrZWQgaW4gdGhlIGlucHV0IGRhdGEgdG9vLgojIElucHV0IGlzIGFsbG93ZWQgdG8gaGF2ZSBtb3JlIG1hc2tlZCBwYXRocyB0aGFuIHRoZSBwb2xpY3kuCmFsbG93X21hc2tlZF9wYXRoc19hcnJheShwX2FycmF5LCBpX2FycmF5KSB7CiAgICBldmVyeSBwX2VsZW0gaW4gcF9hcnJheSB7CiAgICAgICAgYWxsb3dfbWFza2VkX3BhdGgocF9lbGVtLCBpX2FycmF5KQogICAgfQp9CgphbGxvd19tYXNrZWRfcGF0aChwX2VsZW0sIGlfYXJyYXkpIHsKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aDogcF9lbGVtID0iLCBwX2VsZW0pCgogICAgc29tZSBpX2VsZW0gaW4gaV9hcnJheQogICAgcF9lbGVtID09IGlfZWxlbQoKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aDogdHJ1ZSIpCn0KCmFsbG93X3JlYWRvbmx5X3BhdGhzKHBfb2NpLCBpX29jaSkgewogICAgcF9wYXRocyA6PSBwX29jaS5MaW51eC5SZWFkb25seVBhdGhzCiAgICBwcmludCgiYWxsb3dfcmVhZG9ubHlfcGF0aHMgMTogcF9wYXRocyA9IiwgcF9wYXRocykKCiAgICBpX3BhdGhzIDo9IGlfb2NpLkxpbnV4LlJlYWRvbmx5UGF0aHMKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAxOiBpX3BhdGhzID0iLCBpX3BhdGhzKQoKICAgIGFsbG93X3JlYWRvbmx5X3BhdGhzX2FycmF5KHBfcGF0aHMsIGlfcGF0aHMsIGlfb2NpLkxpbnV4Lk1hc2tlZFBhdGhzKQoKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAxOiB0cnVlIikKfQphbGxvd19yZWFkb25seV9wYXRocyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAyOiBzdGFydCIpCgogICAgbm90IHBfb2NpLkxpbnV4LlJlYWRvbmx5UGF0aHMKICAgIG5vdCBpX29jaS5MaW51eC5SZWFkb25seVBhdGhzCgogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGhzIDI6IHRydWUiKQp9CgojIEFsbCB0aGUgcG9saWN5IHJlYWRvbmx5IHBhdGhzIG11c3QgYmUgZWl0aGVyOgojIC0gUHJlc2VudCBpbiB0aGUgaW5wdXQgcmVhZG9ubHkgcGF0aHMsIG9yCiMgLSBQcmVzZW50IGluIHRoZSBpbnB1dCBtYXNrZWQgcGF0aHMuCiMgSW5wdXQgaXMgYWxsb3dlZCB0byBoYXZlIG1vcmUgcmVhZG9ubHkgcGF0aHMgdGhhbiB0aGUgcG9saWN5LgphbGxvd19yZWFkb25seV9wYXRoc19hcnJheShwX2FycmF5LCBpX2FycmF5LCBtYXNrZWRfcGF0aHMpIHsKICAgIGV2ZXJ5IHBfZWxlbSBpbiBwX2FycmF5IHsKICAgICAgICBhbGxvd19yZWFkb25seV9wYXRoKHBfZWxlbSwgaV9hcnJheSwgbWFza2VkX3BhdGhzKQogICAgfQp9CgphbGxvd19yZWFkb25seV9wYXRoKHBfZWxlbSwgaV9hcnJheSwgbWFza2VkX3BhdGhzKSB7CiAgICBwcmludCgiYWxsb3dfcmVhZG9ubHlfcGF0aCAxOiBwX2VsZW0gPSIsIHBfZWxlbSkKCiAgICBzb21lIGlfZWxlbSBpbiBpX2FycmF5CiAgICBwX2VsZW0gPT0gaV9lbGVtCgogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGggMTogdHJ1ZSIpCn0KYWxsb3dfcmVhZG9ubHlfcGF0aChwX2VsZW0sIGlfYXJyYXksIG1hc2tlZF9wYXRocykgewogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGggMjogcF9lbGVtID0iLCBwX2VsZW0pCgogICAgc29tZSBpX21hc2tlZCBpbiBtYXNrZWRfcGF0aHMKICAgIHBfZWxlbSA9PSBpX21hc2tlZAoKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRoIDI6IHRydWUiKQp9CgphbGxvd19saW51eF9kZXZpY2VzKHBfZGV2aWNlcywgaV9kZXZpY2VzKSB7CiAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogc3RhcnQiKQogICAgZXZlcnkgaV9kZXZpY2UgaW4gaV9kZXZpY2VzIHsKICAgICAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogaV9kZXZpY2UgPSIsIGlfZGV2aWNlKQogICAgICAgIHNvbWUgcF9kZXZpY2UgaW4gcF9kZXZpY2VzCiAgICAgICAgaV9kZXZpY2UuUGF0aCA9PSBwX2RldmljZS5QYXRoCiAgICB9CiAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogdHJ1ZSIpCn0KCmFsbG93X2xpbnV4X3N5c2N0bChwX2xpbnV4LCBpX2xpbnV4KSB7CiAgICBwcmludCgiYWxsb3dfbGludXhfc3lzY3RsIDE6IHN0YXJ0IikKICAgIG5vdCBpX2xpbnV4LlN5c2N0bAogICAgcHJpbnQoImFsbG93X2xpbnV4X3N5c2N0bCAxOiB0cnVlIikKfQoKYWxsb3dfbGludXhfc3lzY3RsKHBfbGludXgsIGlfbGludXgpIHsKICAgIHByaW50KCJhbGxvd19saW51eF9zeXNjdGwgMjogc3RhcnQiKQogICAgcF9zeXNjdGwgOj0gcF9saW51eC5TeXNjdGwKICAgIGlfc3lzY3RsIDo9IGlfbGludXguU3lzY3RsCiAgICBldmVyeSBpX25hbWUsIGlfdmFsIGluIGlfc3lzY3RsIHsKICAgICAgICBwcmludCgiYWxsb3dfbGludXhfc3lzY3RsIDI6IGlfbmFtZSA9IiwgaV9uYW1lLCAiaV92YWwgPSIsIGlfdmFsKQogICAgICAgIHBfc3lzY3RsW2lfbmFtZV0gPT0gaV92YWwKICAgIH0KICAgIHByaW50KCJhbGxvd19saW51eF9zeXNjdGwgMjogdHJ1ZSIpCn0KCiMgQ2hlY2sgdGhlIGNvbnNpc3RlbmN5IG9mIHRoZSBpbnB1dCAiaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5idW5kbGVfcGF0aCIKIyBhbmQgaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCIgdmFsdWVzIHdpdGggb3RoZXIgZmllbGRzLgphbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZChwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpIHsKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogc3RhcnQiKQoKICAgIGJ1bmRsZV9wYXRoIDo9IGlfb2NpLkFubm90YXRpb25zWyJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmJ1bmRsZV9wYXRoIl0KICAgIGJ1bmRsZV9pZCA6PSByZXBsYWNlKGJ1bmRsZV9wYXRoLCAiL3J1bi9jb250YWluZXJkL2lvLmNvbnRhaW5lcmQucnVudGltZS52Mi50YXNrL2s4cy5pby8iLCAiIikKCiAgICBidW5kbGVfaWRfZm9ybWF0IDo9IGNvbmNhdCgiIiwgWyJeIiwgQlVORExFX0lELCAiJCJdKQogICAgcmVnZXgubWF0Y2goYnVuZGxlX2lkX2Zvcm1hdCwgYnVuZGxlX2lkKQoKICAgIGtleSA6PSAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCIKCiAgICBwX3JlZ2V4IDo9IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIHNhbmRib3hfaWQgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQoKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogc2FuZGJveF9pZCA9Iiwgc2FuZGJveF9pZCwgInJlZ2V4ID0iLCBwX3JlZ2V4KQogICAgcmVnZXgubWF0Y2gocF9yZWdleCwgc2FuZGJveF9pZCkKCiAgICBhbGxvd19yb290X3BhdGgocF9vY2ksIGlfb2NpLCBidW5kbGVfaWQpCgogICAgZXZlcnkgaV9tb3VudCBpbiBpX29jaS5Nb3VudHMgewogICAgICAgIGFsbG93X21vdW50KHBfb2NpLCBpX21vdW50LCBpX3N0b3JhZ2VzLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpCiAgICB9CgogICAgYWxsb3dfc3RvcmFnZXMocF9zdG9yYWdlcywgaV9zdG9yYWdlcywgYnVuZGxlX2lkLCBzYW5kYm94X2lkKQoKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogdHJ1ZSIpCn0KCmFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHBfcHJvY2VzcyA9IiwgcF9wcm9jZXNzKQogICAgcHJpbnQoImFsbG93X3Byb2Nlc3NfY29tbW9uOiBpX3Byb2Nlc3MgPSAiLCBpX3Byb2Nlc3MpCiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHNfbmFtZSA9Iiwgc19uYW1lKQoKICAgIHBfcHJvY2Vzcy5Dd2QgPT0gaV9wcm9jZXNzLkN3ZAogICAgcF9wcm9jZXNzLk5vTmV3UHJpdmlsZWdlcyA9PSBpX3Byb2Nlc3MuTm9OZXdQcml2aWxlZ2VzCgogICAgYWxsb3dfdXNlcihwX3Byb2Nlc3MsIGlfcHJvY2VzcykKICAgIGFsbG93X2VudihwX3Byb2Nlc3MsIGlfcHJvY2Vzcywgc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHRydWUiKQp9CgojIENvbXBhcmUgdGhlIE9DSSBQcm9jZXNzIGZpZWxkIG9mIGEgcG9saWN5IGNvbnRhaW5lciB3aXRoIHRoZSBpbnB1dCBPQ0kgUHJvY2VzcyBmcm9tIGEgQ3JlYXRlQ29udGFpbmVyUmVxdWVzdAphbGxvd19wcm9jZXNzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfcHJvY2Vzczogc3RhcnQiKQoKICAgIGFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgYWxsb3dfY2FwcyhwX3Byb2Nlc3MuQ2FwYWJpbGl0aWVzLCBpX3Byb2Nlc3MuQ2FwYWJpbGl0aWVzKQogICAgcF9wcm9jZXNzLlRlcm1pbmFsID09IGlfcHJvY2Vzcy5UZXJtaW5hbAoKICAgIHByaW50KCJhbGxvd19wcm9jZXNzOiB0cnVlIikKfQoKIyBDb21wYXJlIHRoZSBPQ0kgUHJvY2VzcyBmaWVsZCBvZiBhIHBvbGljeSBjb250YWluZXIgd2l0aCB0aGUgaW5wdXQgcHJvY2VzcyBmaWVsZCBmcm9tIEV4ZWNQcm9jZXNzUmVxdWVzdAphbGxvd19pbnRlcmFjdGl2ZV9wcm9jZXNzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfaW50ZXJhY3RpdmVfcHJvY2Vzczogc3RhcnQiKQoKICAgIGFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgYWxsb3dfZXhlY19jYXBzKGlfcHJvY2Vzcy5DYXBhYmlsaXRpZXMpCgogICAgIyBUaGVzZSBhcmUgY29tbWFuZHMgZW5hYmxlZCB1c2luZyBFeGVjUHJvY2Vzc1JlcXVlc3QgY29tbWFuZHMgYW5kL29yIHJlZ2V4IGZyb20gdGhlIHNldHRpbmdzIGZpbGUuCiAgICAjIFRoZXkgY2FuIGJlIGV4ZWN1dGVkIGludGVyYWN0aXZlbHkgc28gYWxsb3cgdGhlbSB0byB1c2UgYW55IHZhbHVlIGZvciBpX3Byb2Nlc3MuVGVybWluYWwuCgogICAgcHJpbnQoImFsbG93X2ludGVyYWN0aXZlX3Byb2Nlc3M6IHRydWUiKQp9CgojIENvbXBhcmUgdGhlIE9DSSBQcm9jZXNzIGZpZWxkIG9mIGEgcG9saWN5IGNvbnRhaW5lciB3aXRoIHRoZSBpbnB1dCBwcm9jZXNzIGZpZWxkIGZyb20gRXhlY1Byb2Nlc3NSZXF1ZXN0CmFsbG93X3Byb2JlX3Byb2Nlc3MocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19wcm9iZV9wcm9jZXNzOiBzdGFydCIpCgogICAgYWxsb3dfcHJvY2Vzc19jb21tb24ocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpCiAgICBhbGxvd19leGVjX2NhcHMoaV9wcm9jZXNzLkNhcGFiaWxpdGllcykKICAgIHBfcHJvY2Vzcy5UZXJtaW5hbCA9PSBpX3Byb2Nlc3MuVGVybWluYWwKCiAgICBwcmludCgiYWxsb3dfcHJvYmVfcHJvY2VzczogdHJ1ZSIpCn0KCmFsbG93X3VzZXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MpIHsKICAgIHBfdXNlciA6PSBwX3Byb2Nlc3MuVXNlcgogICAgaV91c2VyIDo9IGlfcHJvY2Vzcy5Vc2VyCgogICAgcHJpbnQoImFsbG93X3VzZXI6IGlucHV0IHVpZCA9IiwgaV91c2VyLlVJRCwgInBvbGljeSB1aWQgPSIsIHBfdXNlci5VSUQpCiAgICBwX3VzZXIuVUlEID09IGlfdXNlci5VSUQKCiAgICAjIFRPRE86IHRyYWNrIGRvd24gdGhlIHJlYXNvbiBmb3IgcmVnaXN0cnkuazhzLmlvL3BhdXNlOjMuOSBiZWluZwogICAgIyAgICAgICBleGVjdXRlZCB3aXRoIGdpZCA9IDAgZGVzcGl0ZSBoYXZpbmcgIjY1NTM1OjY1NTM1IiBpbiBpdHMgY29udGFpbmVyIGltYWdlCiAgICAjICAgICAgIGNvbmZpZy4KICAgICNwcmludCgiYWxsb3dfdXNlcjogaW5wdXQgZ2lkID0iLCBpX3VzZXIuR0lELCAicG9saWN5IGdpZCA9IiwgcF91c2VyLkdJRCkKICAgICNwX3VzZXIuR0lEID09IGlfdXNlci5HSUQKCiAgICAjIFRPRE86IGNvbXBhcmUgdGhlIGFkZGl0aW9uYWxHaWRzIGZpZWxkIHRvbyBhZnRlciBjb21wdXRpbmcgaXRzIHZhbHVlCiAgICAjIGJhc2VkIG9uIC9ldGMvcGFzc3dkIGFuZCAvZXRjL2dyb3VwIGZyb20gdGhlIGNvbnRhaW5lciBpbWFnZS4KfQoKYWxsb3dfZGVwcmVjYXRlZF9hcmdzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZ3MgMTogbm8gYXJncyIpCgogICAgbm90IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJncwogICAgbm90IGlfcHJvY2Vzcy5BcmdzCgogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAxOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZ3MocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSkgewogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiBwb2xpY3kgYXJncyA9IiwgcF9wcm9jZXNzLkRlcHJlY2F0ZWRBcmdzKQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiBpbnB1dCBhcmdzID0iLCBpX3Byb2Nlc3MuQXJncykKCiAgICBjb3VudChwX3Byb2Nlc3MuRGVwcmVjYXRlZEFyZ3MpID09IGNvdW50KGlfcHJvY2Vzcy5BcmdzKQoKICAgIGV2ZXJ5IGksIGlfYXJnIGluIGlfcHJvY2Vzcy5BcmdzIHsKICAgICAgICBhbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpCiAgICB9CgogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDE6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgcF9hcmcyIDo9IHJlcGxhY2UocF9hcmcsICIkJCIsICIkIikKICAgIHBfYXJnMiA9PSBpX2FyZwoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAxOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDI6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgIyBUT0RPOiBjYW4gJChub2RlLW5hbWUpIGJlIGhhbmRsZWQgYmV0dGVyPwogICAgY29udGFpbnMocF9hcmcsICIkKG5vZGUtbmFtZSkiKQoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAyOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDM6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgcF9hcmcyIDo9IHJlcGxhY2UocF9hcmcsICIkJCIsICIkIikKICAgIHBfYXJnMyA6PSByZXBsYWNlKHBfYXJnMiwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAzOiBwX2FyZzMgPSIsIHBfYXJnMykKICAgIHBfYXJnMyA9PSBpX2FyZwoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAzOiB0cnVlIikKfQoKIyBPQ0kgcHJvY2Vzcy5FbnYgZmllbGQKYWxsb3dfZW52KHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfZW52OiBwIGVudiA9IiwgcF9wcm9jZXNzLkVudikKICAgIHByaW50KCJhbGxvd19lbnY6IGkgZW52ID0iLCBpX3Byb2Nlc3MuRW52KQoKICAgIGV2ZXJ5IGlfdmFyIGluIGlfcHJvY2Vzcy5FbnYgewogICAgICAgIHByaW50KCJhbGxvd19lbnY6IGlfdmFyID0iLCBpX3ZhcikKICAgICAgICBhbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgfQoKICAgIHByaW50KCJhbGxvd19lbnY6IHRydWUiKQp9CgojIEFsbG93IGlucHV0IGVudiB2YXJpYWJsZXMgdGhhdCBhcmUgcHJlc2VudCBpbiB0aGUgcG9saWN5IGRhdGEgdG9vLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHBfdmFyID09IGlfdmFyCiAgICBwcmludCgiYWxsb3dfdmFyIDE6IHRydWUiKQp9CgojIE1hdGNoIGlucHV0IHdpdGggb25lIG9mIHRoZSBwb2xpY3kgdmFyaWFibGVzLCBhZnRlciBzdWJzdGl0dXRpbmcgJChzYW5kYm94LW5hbWUpLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHByaW50KCJhbGxvd192YXIgMjogcF92YXIgPSIsIHBfdmFyKQoKICAgIHBfdmFyX3NwbGl0IDo9IHNwbGl0KHBfdmFyLCAiPSIpCiAgICBjb3VudChwX3Zhcl9zcGxpdCkgPT0gMgoKICAgIHBfdmFyX3NwbGl0WzFdID09ICIkKHNhbmRib3gtbmFtZSkiCgogICAgaV92YXJfc3BsaXQgOj0gc3BsaXQoaV92YXIsICI9IikKICAgIGNvdW50KGlfdmFyX3NwbGl0KSA9PSAyCgogICAgaV92YXJfc3BsaXRbMF0gPT0gcF92YXJfc3BsaXRbMF0KICAgIHJlZ2V4Lm1hdGNoKHNfbmFtZSwgaV92YXJfc3BsaXRbMV0pCgogICAgcHJpbnQoImFsbG93X3ZhciAyOiB0cnVlIikKfQoKIyBBbGxvdyBpbnB1dCBlbnYgdmFyaWFibGVzIHRoYXQgbWF0Y2ggd2l0aCBhIHJlcXVlc3RfZGVmYXVsdHMgcmVnZXguCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHNvbWUgcF9yZWdleDEgaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5DcmVhdGVDb250YWluZXJSZXF1ZXN0LmFsbG93X2Vudl9yZWdleAogICAgcF9yZWdleDIgOj0gcmVwbGFjZShwX3JlZ2V4MSwgIiQoaXB2NF9hKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcHY0X2EpCiAgICBwX3JlZ2V4MyA6PSByZXBsYWNlKHBfcmVnZXgyLCAiJChpcF9wKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcF9wKQogICAgcF9yZWdleDQgOj0gcmVwbGFjZShwX3JlZ2V4MywgIiQoc3ZjX25hbWUpIiwgcG9saWN5X2RhdGEuY29tbW9uLnN2Y19uYW1lKQogICAgcF9yZWdleDUgOj0gcmVwbGFjZShwX3JlZ2V4NCwgIiQoZG5zX2xhYmVsKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5kbnNfbGFiZWwpCgogICAgcHJpbnQoImFsbG93X3ZhciAzOiBwX3JlZ2V4NSA9IiwgcF9yZWdleDUpCiAgICByZWdleC5tYXRjaChwX3JlZ2V4NSwgaV92YXIpCgogICAgcHJpbnQoImFsbG93X3ZhciAzOiB0cnVlIikKfQoKIyBBbGxvdyBmaWVsZFJlZiAiZmllbGRQYXRoOiBzdGF0dXMucG9kSVAiIHZhbHVlcy4KYWxsb3dfdmFyKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBpX3Zhciwgc19uYW1lLCBzX25hbWVzcGFjZSkgewogICAgbmFtZV92YWx1ZSA6PSBzcGxpdChpX3ZhciwgIj0iKQogICAgY291bnQobmFtZV92YWx1ZSkgPT0gMgogICAgaXNfaXAobmFtZV92YWx1ZVsxXSkKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIGFsbG93X3BvZF9pcF92YXIobmFtZV92YWx1ZVswXSwgcF92YXIpCgogICAgcHJpbnQoImFsbG93X3ZhciA0OiB0cnVlIikKfQoKIyBBbGxvdyBjb21tb24gZmllbGRSZWYgdmFyaWFibGVzLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBuYW1lX3ZhbHVlIDo9IHNwbGl0KGlfdmFyLCAiPSIpCiAgICBjb3VudChuYW1lX3ZhbHVlKSA9PSAyCgogICAgc29tZSBwX3ZhciBpbiBwX3Byb2Nlc3MuRW52CiAgICBwX25hbWVfdmFsdWUgOj0gc3BsaXQocF92YXIsICI9IikKICAgIGNvdW50KHBfbmFtZV92YWx1ZSkgPT0gMgoKICAgIHBfbmFtZV92YWx1ZVswXSA9PSBuYW1lX3ZhbHVlWzBdCgogICAgIyBUT0RPOiBzaG91bGQgdGhlc2UgYmUgaGFuZGxlZCBpbiBhIGRpZmZlcmVudCB3YXk/CiAgICBhbHdheXNfYWxsb3dlZCA6PSBbIiQoaG9zdC1uYW1lKSIsICIkKG5vZGUtbmFtZSkiLCAiJChwb2QtdWlkKSJdCiAgICBzb21lIGFsbG93ZWQgaW4gYWx3YXlzX2FsbG93ZWQKICAgIGNvbnRhaW5zKHBfbmFtZV92YWx1ZVsxXSwgYWxsb3dlZCkKCiAgICBwcmludCgiYWxsb3dfdmFyIDU6IHRydWUiKQp9CgojIEFsbG93IGZpZWxkUmVmICJmaWVsZFBhdGg6IHN0YXR1cy5ob3N0SVAiIHZhbHVlcy4KYWxsb3dfdmFyKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBpX3Zhciwgc19uYW1lLCBzX25hbWVzcGFjZSkgewogICAgbmFtZV92YWx1ZSA6PSBzcGxpdChpX3ZhciwgIj0iKQogICAgY291bnQobmFtZV92YWx1ZSkgPT0gMgogICAgaXNfaXAobmFtZV92YWx1ZVsxXSkKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIGFsbG93X2hvc3RfaXBfdmFyKG5hbWVfdmFsdWVbMF0sIHBfdmFyKQoKICAgIHByaW50KCJhbGxvd192YXIgNjogdHJ1ZSIpCn0KCiMgQWxsb3cgcmVzb3VyY2VGaWVsZFJlZiB2YWx1ZXMgKGUuZy4sICJsaW1pdHMuY3B1IikuCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIG5hbWVfdmFsdWUgOj0gc3BsaXQoaV92YXIsICI9IikKICAgIGNvdW50KG5hbWVfdmFsdWUpID09IDIKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHBfbmFtZV92YWx1ZSA6PSBzcGxpdChwX3ZhciwgIj0iKQogICAgY291bnQocF9uYW1lX3ZhbHVlKSA9PSAyCgogICAgcF9uYW1lX3ZhbHVlWzBdID09IG5hbWVfdmFsdWVbMF0KCiAgICAjIGEgdmFyaWFibGUgd2Ugc2hvdWxkIGJlIHZhbGlkYXRpbmcgdXNpbmcgYSByZWdleCBmcm9tIHNldHRpbmdzCiAgICBwX25hbWVfdmFsdWVbMV0gPT0gIiQodmFsaWRhdGUtZnJvbS1zZXR0aW5ncykiCgogICAgcmVnZXhfdmFsIDo9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuQ3JlYXRlQ29udGFpbmVyUmVxdWVzdC5hbGxvd19lbnZfcmVnZXhfbWFwW25hbWVfdmFsdWVbMF1dCgogICAgcHJpbnQoImFsbG93X3ZhciA3OiB2YWwgPSIsIG5hbWVfdmFsdWVbMV0pCiAgICBwcmludCgiYWxsb3dfdmFyIDc6IHJlZ2V4X3ZhbCA9IiwgcmVnZXhfdmFsKQoKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4X3ZhbCwgbmFtZV92YWx1ZVsxXSkKCiAgICBwcmludCgiYWxsb3dfdmFyIDc6IHRydWUiKQp9CgojIE1hdGNoIGlucHV0IHdpdGggb25lIG9mIHRoZSBwb2xpY3kgdmFyaWFibGVzLCBhZnRlciBzdWJzdGl0dXRpbmcgJChzYW5kYm94LW5hbWVzcGFjZSkuCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHNvbWUgcF92YXIgaW4gcF9wcm9jZXNzLkVudgogICAgcF92YXIyIDo9IHJlcGxhY2UocF92YXIsICIkKHNhbmRib3gtbmFtZXNwYWNlKSIsIHNfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd192YXIgODogcF92YXIyID0iLCBwX3ZhcjIpCiAgICBwX3ZhcjIgPT0gaV92YXIKCiAgICBwcmludCgiYWxsb3dfdmFyIDg6IHRydWUiKQp9CgphbGxvd19wb2RfaXBfdmFyKHZhcl9uYW1lLCBwX3ZhcikgewogICAgcHJpbnQoImFsbG93X3BvZF9pcF92YXI6IHZhcl9uYW1lID0iLCB2YXJfbmFtZSwgInBfdmFyID0iLCBwX3ZhcikKCiAgICBwX25hbWVfdmFsdWUgOj0gc3BsaXQocF92YXIsICI9IikKICAgIGNvdW50KHBfbmFtZV92YWx1ZSkgPT0gMgoKICAgIHBfbmFtZV92YWx1ZVswXSA9PSB2YXJfbmFtZQogICAgcF9uYW1lX3ZhbHVlWzFdID09ICIkKHBvZC1pcCkiCgogICAgcHJpbnQoImFsbG93X3BvZF9pcF92YXI6IHRydWUiKQp9CgphbGxvd19ob3N0X2lwX3Zhcih2YXJfbmFtZSwgcF92YXIpIHsKICAgIHByaW50KCJhbGxvd19ob3N0X2lwX3ZhcjogdmFyX25hbWUgPSIsIHZhcl9uYW1lLCAicF92YXIgPSIsIHBfdmFyKQoKICAgIHBfbmFtZV92YWx1ZSA6PSBzcGxpdChwX3ZhciwgIj0iKQogICAgY291bnQocF9uYW1lX3ZhbHVlKSA9PSAyCgogICAgcF9uYW1lX3ZhbHVlWzBdID09IHZhcl9uYW1lCiAgICBwX25hbWVfdmFsdWVbMV0gPT0gIiQoaG9zdC1pcCkiCgogICAgcHJpbnQoImFsbG93X2hvc3RfaXBfdmFyOiB0cnVlIikKfQoKaXNfaXAodmFsdWUpIHsKICAgIGJ5dGVzID0gc3BsaXQodmFsdWUsICIuIikKICAgIGNvdW50KGJ5dGVzKSA9PSA0CgogICAgaXNfaXBfZmlyc3RfYnl0ZShieXRlc1swXSkKICAgIGlzX2lwX290aGVyX2J5dGUoYnl0ZXNbMV0pCiAgICBpc19pcF9vdGhlcl9ieXRlKGJ5dGVzWzJdKQogICAgaXNfaXBfb3RoZXJfYnl0ZShieXRlc1szXSkKfQppc19pcF9maXJzdF9ieXRlKGNvbXBvbmVudCkgewogICAgbnVtYmVyID0gdG9fbnVtYmVyKGNvbXBvbmVudCkKICAgIG51bWJlciA+PSAxCiAgICBudW1iZXIgPD0gMjU1Cn0KaXNfaXBfb3RoZXJfYnl0ZShjb21wb25lbnQpIHsKICAgIG51bWJlciA9IHRvX251bWJlcihjb21wb25lbnQpCiAgICBudW1iZXIgPj0gMAogICAgbnVtYmVyIDw9IDI1NQp9CgojIE9DSSByb290LlBhdGgKYWxsb3dfcm9vdF9wYXRoKHBfb2NpLCBpX29jaSwgYnVuZGxlX2lkKSB7CiAgICBpX3BhdGggOj0gaV9vY2kuUm9vdC5QYXRoCiAgICBwX3BhdGgxIDo9IHBfb2NpLlJvb3QuUGF0aAogICAgcHJpbnQoImFsbG93X3Jvb3RfcGF0aDogaV9wYXRoID0iLCBpX3BhdGgsICJwX3BhdGgxID0iLCBwX3BhdGgxKQoKICAgIHBfcGF0aDIgOj0gcmVwbGFjZShwX3BhdGgxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfcm9vdF9wYXRoOiBwX3BhdGgyID0iLCBwX3BhdGgyKQoKICAgIHBfcGF0aDMgOj0gcmVwbGFjZShwX3BhdGgyLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X3Jvb3RfcGF0aDogcF9wYXRoMyA9IiwgcF9wYXRoMykKCiAgICBwX3BhdGgzID09IGlfcGF0aAoKICAgIHByaW50KCJhbGxvd19yb290X3BhdGg6IHRydWUiKQp9CgojIGRldmljZSBtb3VudHMKYWxsb3dfbW91bnQocF9vY2ksIGlfbW91bnQsIGlfc3RvcmFnZXMsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcHJpbnQoImFsbG93X21vdW50OiBpX21vdW50ID0iLCBpX21vdW50KQoKICAgIHNvbWUgcF9tb3VudCBpbiBwX29jaS5Nb3VudHMKICAgIHNvbWUgaV9zdG9yYWdlIGluIGlfc3RvcmFnZXMKCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IHBfbW91bnQgPSIsIHBfbW91bnQpCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IGlfc3RvcmFnZSA9IiwgaV9zdG9yYWdlKQoKICAgIGNoZWNrX21vdW50KHBfbW91bnQsIGlfbW91bnQsIGlfc3RvcmFnZSwgYnVuZGxlX2lkLCBzYW5kYm94X2lkKQoKICAgICMgVE9ETzogYXJlIHRoZXJlIGFueSBvdGhlciByZXF1aXJlZCBwb2xpY3kgY2hlY2tzIGZvciBtb3VudHMgLSBlLmcuLAogICAgIyAgICAgICBtdWx0aXBsZSBtb3VudHMgd2l0aCBzYW1lIHNvdXJjZSBvciBkZXN0aW5hdGlvbj8KCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IHRydWUiKQp9CgpjaGVja19tb3VudChwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcF9tb3VudCA9PSBpX21vdW50CiAgICBwcmludCgiY2hlY2tfbW91bnQgMTogdHJ1ZSIpCn0KY2hlY2tfbW91bnQocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHBfbW91bnQuZGVzdGluYXRpb24gPT0gaV9tb3VudC5kZXN0aW5hdGlvbgogICAgcF9tb3VudC50eXBlXyA9PSBpX21vdW50LnR5cGVfCiAgICBwX21vdW50Lm9wdGlvbnMgPT0gaV9tb3VudC5vcHRpb25zCgogICAgbW91bnRfc291cmNlX2FsbG93cyhwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkKCiAgICBwcmludCgiY2hlY2tfbW91bnQgMjogdHJ1ZSIpCn0KCm1vdW50X3NvdXJjZV9hbGxvd3MocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHJlZ2V4MSA6PSBwX21vdW50LnNvdXJjZQogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5tb3VudF9zb3VyY2VfY3BhdGgpCiAgICByZWdleDQgOj0gcmVwbGFjZShyZWdleDMsICIkKGJ1bmRsZS1pZCkiLCBidW5kbGVfaWQpCgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMTogcmVnZXg0ID0iLCByZWdleDQpCiAgICByZWdleC5tYXRjaChyZWdleDQsIGlfbW91bnQuc291cmNlKQoKICAgIHByaW50KCJtb3VudF9zb3VyY2VfYWxsb3dzIDE6IHRydWUiKQp9Cm1vdW50X3NvdXJjZV9hbGxvd3MocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHJlZ2V4MSA6PSBwX21vdW50LnNvdXJjZQogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5tb3VudF9zb3VyY2VfY3BhdGgpCiAgICByZWdleDQgOj0gcmVwbGFjZShyZWdleDMsICIkKHNhbmRib3gtaWQpIiwgc2FuZGJveF9pZCkKCiAgICBwcmludCgibW91bnRfc291cmNlX2FsbG93cyAyOiByZWdleDQgPSIsIHJlZ2V4NCkKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4NCwgaV9tb3VudC5zb3VyY2UpCgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMjogdHJ1ZSIpCn0KbW91bnRfc291cmNlX2FsbG93cyhwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogaV9tb3VudC5zb3VyY2UgPSIsIGlfbW91bnQuc291cmNlKQogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogaV9zdG9yYWdlLm1vdW50X3BvaW50ID0iLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCgogICAgaV9tb3VudC5zb3VyY2UgPT0gaV9zdG9yYWdlLm1vdW50X3BvaW50CgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogdHJ1ZSIpCn0KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBDcmVhdGUgY29udGFpbmVyIFN0b3JhZ2VzCgphbGxvd19zdG9yYWdlcyhwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHBfY291bnQgOj0gY291bnQocF9zdG9yYWdlcykKICAgIGlfY291bnQgOj0gY291bnQoaV9zdG9yYWdlcykKICAgIHByaW50KCJhbGxvd19zdG9yYWdlczogcF9jb3VudCA9IiwgcF9jb3VudCwgImlfY291bnQgPSIsIGlfY291bnQpCgogICAgcF9jb3VudCA9PSBpX2NvdW50CgogICAgIyBHZXQgdGhlIGNvbnRhaW5lciBpbWFnZSBsYXllciBJRHMgYW5kIHZlcml0eSByb290IGhhc2hlcywgZnJvbSB0aGUgIm92ZXJsYXlmcyIgc3RvcmFnZS4KICAgIHNvbWUgb3ZlcmxheV9zdG9yYWdlIGluIHBfc3RvcmFnZXMKICAgIG92ZXJsYXlfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIHByaW50KCJhbGxvd19zdG9yYWdlczogb3ZlcmxheV9zdG9yYWdlID0iLCBvdmVybGF5X3N0b3JhZ2UpCiAgICBjb3VudChvdmVybGF5X3N0b3JhZ2Uub3B0aW9ucykgPT0gMgoKICAgIGxheWVyX2lkcyA6PSBzcGxpdChvdmVybGF5X3N0b3JhZ2Uub3B0aW9uc1swXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiBsYXllcl9pZHMgPSIsIGxheWVyX2lkcykKCiAgICByb290X2hhc2hlcyA6PSBzcGxpdChvdmVybGF5X3N0b3JhZ2Uub3B0aW9uc1sxXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiByb290X2hhc2hlcyA9Iiwgcm9vdF9oYXNoZXMpCgogICAgZXZlcnkgaV9zdG9yYWdlIGluIGlfc3RvcmFnZXMgewogICAgICAgIGFsbG93X3N0b3JhZ2UocF9zdG9yYWdlcywgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpCiAgICB9CgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiB0cnVlIikKfQoKYWxsb3dfc3RvcmFnZShwX3N0b3JhZ2VzLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgc29tZSBwX3N0b3JhZ2UgaW4gcF9zdG9yYWdlcwoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiBwX3N0b3JhZ2UgPSIsIHBfc3RvcmFnZSkKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiBpX3N0b3JhZ2UgPSIsIGlfc3RvcmFnZSkKCiAgICBwX3N0b3JhZ2UuZHJpdmVyICAgICAgICAgICA9PSBpX3N0b3JhZ2UuZHJpdmVyCiAgICBwX3N0b3JhZ2UuZHJpdmVyX29wdGlvbnMgICA9PSBpX3N0b3JhZ2UuZHJpdmVyX29wdGlvbnMKICAgIHBfc3RvcmFnZS5mc19ncm91cCAgICAgICAgID09IGlfc3RvcmFnZS5mc19ncm91cAogICAgcF9zdG9yYWdlLmZzdHlwZSAgICAgICAgICAgPT0gaV9zdG9yYWdlLmZzdHlwZQoKICAgIGFsbG93X3N0b3JhZ2Vfc291cmNlKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKQogICAgYWxsb3dfc3RvcmFnZV9vcHRpb25zKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKQogICAgYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKQoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiB0cnVlIikKfQoKYWxsb3dfc3RvcmFnZV9zb3VyY2UocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX3NvdXJjZSAxOiBzdGFydCIpCgogICAgcF9zdG9yYWdlLnNvdXJjZSA9PSBpX3N0b3JhZ2Uuc291cmNlCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDE6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX3NvdXJjZShwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDI6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCgogICAgIyBEREREOkJCOkRELkY6IERvbWFpbjpCdXM6RGV2aWNlLkZ1bmN0aW9uCiAgICAjIGh0dHBzOi8vd3d3Lmtlcm5lbC5vcmcvZG9jL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtYnVzLXBjaQogICAgcmVnZXgubWF0Y2goYF5bYS1mMC05XXs0fTpbYS1mMC05XXsyfTpbYS1mMC05XXsyfVwuW2EtZjAtOV0kYCwgaV9zdG9yYWdlLnNvdXJjZSkKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9zb3VyY2UgMjogdHJ1ZSIpCn0KCmFsbG93X3N0b3JhZ2Vfc291cmNlKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKSB7CiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9zb3VyY2UgMzogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIGlfc3RvcmFnZS5zb3VyY2UgPT0gIm5vbmUiCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDM6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX3NvdXJjZShwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDQ6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJzbWIiCgogICAgIyBQYXR0ZXJuOiAvLzxzdG9yYWdlLWFjY291bnQtbmFtZT4uZmlsZS5jb3JlLndpbmRvd3MubmV0LzxrOHMtUFZDLW5hbWU+CiAgICAjIFN0b3JhZ2UgYWNjb3VudCBuYW1lOiBodHRwczovL2xlYXJuLm1pY3Jvc29mdC5jb20vZW4tdXMvYXp1cmUvc3RvcmFnZS9jb21tb24vc3RvcmFnZS1hY2NvdW50LW92ZXJ2aWV3I3N0b3JhZ2UtYWNjb3VudC1uYW1lCiAgICAjIEs4cyBQVkMgbmFtZTogaHR0cHM6Ly9rdWJlcm5ldGVzLmlvL2RvY3MvY29uY2VwdHMvb3ZlcnZpZXcvd29ya2luZy13aXRoLW9iamVjdHMvbmFtZXMvI2Rucy1zdWJkb21haW4tbmFtZXMKICAgIHJlZ2V4Lm1hdGNoKGBeXC9cLyhbYS16MC05XXszLDI0fSlcLmZpbGVcLmNvcmVcLndpbmRvd3NcLm5ldFwvW2EtejAtOV0oW2EtejAtOS4tXXswLDI1MX1bYS16MC05XSk/JGAsIGlfc3RvcmFnZS5zb3VyY2UpCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDQ6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMTogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgIT0gIm92ZXJsYXlmcyIKICAgIHBfc3RvcmFnZS5vcHRpb25zID09IGlfc3RvcmFnZS5vcHRpb25zCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAxOiB0cnVlIikKfQphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIGNvdW50KHBfc3RvcmFnZS5vcHRpb25zKSA9PSAyCgogICAgcG9saWN5X2lkcyA6PSBzcGxpdChwX3N0b3JhZ2Uub3B0aW9uc1swXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBwb2xpY3lfaWRzID0iLCBwb2xpY3lfaWRzKQogICAgcG9saWN5X2lkcyA9PSBsYXllcl9pZHMKCiAgICBwb2xpY3lfaGFzaGVzIDo9IHNwbGl0KHBfc3RvcmFnZS5vcHRpb25zWzFdLCAiOiIpCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IHBvbGljeV9oYXNoZXMgPSIsIHBvbGljeV9oYXNoZXMpCgogICAgcF9jb3VudCA6PSBjb3VudChwb2xpY3lfaWRzKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBwX2NvdW50ID0iLCBwX2NvdW50KQogICAgcF9jb3VudCA+PSAxCiAgICBwX2NvdW50ID09IGNvdW50KHBvbGljeV9oYXNoZXMpCgogICAgaV9jb3VudCA6PSBjb3VudChpX3N0b3JhZ2Uub3B0aW9ucykKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogaV9jb3VudCA9IiwgaV9jb3VudCkKICAgIGlfY291bnQgPT0gcF9jb3VudCArIDMKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zWzBdID0iLCBpX3N0b3JhZ2Uub3B0aW9uc1swXSkKICAgIGlfc3RvcmFnZS5vcHRpb25zWzBdID09ICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQubGF5ZXItc3JjLXByZWZpeD0vdmFyL2xpYi9jb250YWluZXJkL2lvLmNvbnRhaW5lcmQuc25hcHNob3R0ZXIudjEudGFyZGV2L2xheWVycyIKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zW2lfY291bnQgLSAyXSA9IiwgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDJdKQogICAgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDJdID09ICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQub3ZlcmxheS1ydyIKCiAgICBsb3dlcmRpciA6PSBjb25jYXQoIj0iLCBbImxvd2VyZGlyIiwgcF9zdG9yYWdlLm9wdGlvbnNbMF1dKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBsb3dlcmRpciA9IiwgbG93ZXJkaXIpCgogICAgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDFdID09IGxvd2VyZGlyCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zW2lfY291bnQgLSAxXSA9IiwgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDFdKQoKICAgIGV2ZXJ5IGksIHBvbGljeV9pZCBpbiBwb2xpY3lfaWRzIHsKICAgICAgICBhbGxvd19vdmVybGF5X2xheWVyKHBvbGljeV9pZCwgcG9saWN5X2hhc2hlc1tpXSwgaV9zdG9yYWdlLm9wdGlvbnNbaSArIDFdKQogICAgfQoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogdHJ1ZSIpCn0KYWxsb3dfc3RvcmFnZV9vcHRpb25zKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKSB7CiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDM6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCiAgICBjb3VudChwX3N0b3JhZ2Uub3B0aW9ucykgPT0gMQoKICAgIHN0YXJ0c3dpdGgocF9zdG9yYWdlLm9wdGlvbnNbMF0sICIkKGhhc2giKQogICAgaGFzaF9zdWZmaXggOj0gdHJpbV9sZWZ0KHBfc3RvcmFnZS5vcHRpb25zWzBdLCAiJChoYXNoIikKCiAgICBlbmRzd2l0aChoYXNoX3N1ZmZpeCwgIikiKQogICAgaGFzaF9pbmRleCA6PSB0cmltX3JpZ2h0KGhhc2hfc3VmZml4LCAiKSIpCiAgICBpIDo9IHRvX251bWJlcihoYXNoX2luZGV4KQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAzOiBpID0iLCBpKQoKICAgIGhhc2hfb3B0aW9uIDo9IGNvbmNhdCgiPSIsIFsiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LnJvb3QtaGFzaCIsIHJvb3RfaGFzaGVzW2ldXSkKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMzogaGFzaF9vcHRpb24gPSIsIGhhc2hfb3B0aW9uKQoKICAgIGNvdW50KGlfc3RvcmFnZS5vcHRpb25zKSA9PSA0CiAgICBpX3N0b3JhZ2Uub3B0aW9uc1swXSA9PSAicm8iCiAgICBpX3N0b3JhZ2Uub3B0aW9uc1sxXSA9PSAiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmJsb2NrX2RldmljZT1maWxlIgogICAgaV9zdG9yYWdlLm9wdGlvbnNbMl0gPT0gImlvLmthdGFjb250YWluZXJzLmZzLW9wdC5pcy1sYXllciIKICAgIGlfc3RvcmFnZS5vcHRpb25zWzNdID09IGhhc2hfb3B0aW9uCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAzOiB0cnVlIikKfQphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgNDogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gInNtYiIKICAgIHBfb3B0c19jb3VudCA6PSBjb3VudChwX3N0b3JhZ2Uub3B0aW9ucykKICAgIGlfb3B0c19jb3VudCA6PSBjb3VudChpX3N0b3JhZ2Uub3B0aW9ucykKICAgIGlfb3B0c19jb3VudCA9PSBwX29wdHNfY291bnQgKyAyCgogICAgaV9vcHRfbWF0Y2hlcyA6PSBbaSB8IGkgOj0gaWR4OyBpZHggPCBwX29wdHNfY291bnQ7IHBfc3RvcmFnZS5vcHRpb25zW2lkeF0gPT0gaV9zdG9yYWdlLm9wdGlvbnNbaWR4XV0KICAgIGNvdW50KGlfb3B0X21hdGNoZXMpID09IHBfb3B0c19jb3VudAoKICAgIHN0YXJ0c3dpdGgoaV9zdG9yYWdlLm9wdGlvbnNbaV9vcHRzX2NvdW50LTJdLCAiYWRkcj0iKQogICAgY3JlZHMgPSBzcGxpdChpX3N0b3JhZ2Uub3B0aW9uc1tpX29wdHNfY291bnQtMV0sICIsIikKICAgIGNvdW50KGNyZWRzKSA9PSAyCiAgICBzdGFydHN3aXRoKGNyZWRzWzBdLCAidXNlcm5hbWU9IikKICAgIHN0YXJ0c3dpdGgoY3JlZHNbMV0sICJwYXNzd29yZD0iKQogICAgCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDQ6IHRydWUiKQp9CgphbGxvd19vdmVybGF5X2xheWVyKHBvbGljeV9pZCwgcG9saWN5X2hhc2gsIGlfb3B0aW9uKSB7CiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogcG9saWN5X2lkID0iLCBwb2xpY3lfaWQsICJwb2xpY3lfaGFzaCA9IiwgcG9saWN5X2hhc2gpCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogaV9vcHRpb24gPSIsIGlfb3B0aW9uKQoKICAgIHN0YXJ0c3dpdGgoaV9vcHRpb24sICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQubGF5ZXI9IikKICAgIGlfdmFsdWUgOj0gcmVwbGFjZShpX29wdGlvbiwgImlvLmthdGFjb250YWluZXJzLmZzLW9wdC5sYXllcj0iLCAiIikKICAgIGlfdmFsdWVfZGVjb2RlZCA6PSBiYXNlNjQuZGVjb2RlKGlfdmFsdWUpCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogaV92YWx1ZV9kZWNvZGVkID0iLCBpX3ZhbHVlX2RlY29kZWQpCgogICAgcG9saWN5X3N1ZmZpeCA6PSBjb25jYXQoIj0iLCBbInRhcixybyxpby5rYXRhY29udGFpbmVycy5mcy1vcHQuYmxvY2tfZGV2aWNlPWZpbGUsaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmlzLWxheWVyLGlvLmthdGFjb250YWluZXJzLmZzLW9wdC5yb290LWhhc2giLCBwb2xpY3lfaGFzaF0pCiAgICBwX3ZhbHVlIDo9IGNvbmNhdCgiLCIsIFtwb2xpY3lfaWQsIHBvbGljeV9zdWZmaXhdKQogICAgcHJpbnQoImFsbG93X292ZXJsYXlfbGF5ZXI6IHBfdmFsdWUgPSIsIHBfdmFsdWUpCgogICAgcF92YWx1ZSA9PSBpX3ZhbHVlX2RlY29kZWQKCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogdHJ1ZSIpCn0KCmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAidGFyIgoKICAgIHN0YXJ0c3dpdGgocF9zdG9yYWdlLm1vdW50X3BvaW50LCAiJChsYXllciIpCiAgICBtb3VudF9zdWZmaXggOj0gdHJpbV9sZWZ0KHBfc3RvcmFnZS5tb3VudF9wb2ludCwgIiQobGF5ZXIiKQoKICAgIGVuZHN3aXRoKG1vdW50X3N1ZmZpeCwgIikiKQogICAgbGF5ZXJfaW5kZXggOj0gdHJpbV9yaWdodChtb3VudF9zdWZmaXgsICIpIikKICAgIGkgOj0gdG9fbnVtYmVyKGxheWVyX2luZGV4KQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDE6IGkgPSIsIGkpCgogICAgbGF5ZXJfaWQgOj0gbGF5ZXJfaWRzW2ldCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMTogbGF5ZXJfaWQgPSIsIGxheWVyX2lkKQoKICAgIHBfbW91bnQgOj0gY29uY2F0KCIvIiwgWyIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L2xheWVycyIsIGxheWVyX2lkXSkKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCAxOiBwX21vdW50ID0iLCBwX21vdW50KQoKICAgIHBfbW91bnQgPT0gaV9zdG9yYWdlLm1vdW50X3BvaW50CgogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDE6IHRydWUiKQp9CmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAiZnVzZTMua2F0YS1vdmVybGF5IgoKICAgIG1vdW50MSA6PSByZXBsYWNlKHBfc3RvcmFnZS5tb3VudF9wb2ludCwgIiQoY3BhdGgpIiwgcG9saWN5X2RhdGEuY29tbW9uLmNwYXRoKQogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDI6IG1vdW50MiA9IiwgbW91bnQyKQoKICAgIG1vdW50MiA9PSBpX3N0b3JhZ2UubW91bnRfcG9pbnQKCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMjogdHJ1ZSIpCn0KYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKSB7CiAgICBwX3N0b3JhZ2UuZnN0eXBlID09ICJsb2NhbCIKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQyID0iLCBtb3VudDIpCgogICAgbW91bnQzIDo9IHJlcGxhY2UobW91bnQyLCAiJChzYW5kYm94LWlkKSIsIHNhbmRib3hfaWQpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQzID0iLCBtb3VudDMpCgogICAgcmVnZXgubWF0Y2gobW91bnQzLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCgogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDM6IHRydWUiKQp9CmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAiYmluZCIKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNDogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNDogbW91bnQyID0iLCBtb3VudDIpCgogICAgbW91bnQzIDo9IHJlcGxhY2UobW91bnQyLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDQ6IG1vdW50MyA9IiwgbW91bnQzKQoKICAgIHJlZ2V4Lm1hdGNoKG1vdW50MywgaV9zdG9yYWdlLm1vdW50X3BvaW50KQoKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA0OiB0cnVlIikKfQphbGxvd19tb3VudF9wb2ludChwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgYnVuZGxlX2lkLCBzYW5kYm94X2lkLCBsYXllcl9pZHMpIHsKICAgIHBfc3RvcmFnZS5mc3R5cGUgPT0gInRtcGZzIgoKICAgIG1vdW50MSA6PSBwX3N0b3JhZ2UubW91bnRfcG9pbnQKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA1OiBtb3VudDEgPSIsIG1vdW50MSkKCiAgICByZWdleC5tYXRjaChtb3VudDEsIGlfc3RvcmFnZS5tb3VudF9wb2ludCkKCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNTogdHJ1ZSIpCn0KYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKSB7CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogaV9zdG9yYWdlLm1vdW50X3BvaW50ID0iLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCiAgICBhbGxvd19kaXJlY3Rfdm9sX2RyaXZlcihwX3N0b3JhZ2UsIGlfc3RvcmFnZSkKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChzcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQyID0iLCBtb3VudDIpCgogICAgZGlyZWN0X3ZvbF9wYXRoIDo9IGlfc3RvcmFnZS5zb3VyY2UKICAgIG1vdW50MyA6PSByZXBsYWNlKG1vdW50MiwgIiQoYjY0LWRpcmVjdC12b2wtcGF0aCkiLCBiYXNlNjR1cmwuZW5jb2RlKGRpcmVjdF92b2xfcGF0aCkpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQzID0iLCBtb3VudDMpCgogICAgbW91bnQzID09IGlfc3RvcmFnZS5tb3VudF9wb2ludAoKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA2OiB0cnVlIikKfQoKYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIocF9zdG9yYWdlLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19kaXJlY3Rfdm9sX2RyaXZlciAxOiBzdGFydCIpCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCiAgICBwcmludCgiYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIgMTogdHJ1ZSIpCn0KYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIocF9zdG9yYWdlLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19kaXJlY3Rfdm9sX2RyaXZlciAyOiBzdGFydCIpCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJzbWIiCiAgICBwcmludCgiYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIgMjogdHJ1ZSIpCn0KCiMgRXhlY1Byb2Nlc3NSZXF1ZXN0LnByb2Nlc3MuQ2FwYWJpbGl0aWVzCmFsbG93X2V4ZWNfY2FwcyhpX2NhcHMpIHsKICAgIG5vdCBpX2NhcHMuQW1iaWVudAogICAgbm90IGlfY2Fwcy5Cb3VuZGluZwogICAgbm90IGlfY2Fwcy5FZmZlY3RpdmUKICAgIG5vdCBpX2NhcHMuSW5oZXJpdGFibGUKICAgIG5vdCBpX2NhcHMuUGVybWl0dGVkCn0KCiMgT0NJLlByb2Nlc3MuQ2FwYWJpbGl0aWVzCmFsbG93X2NhcHMocF9jYXBzLCBpX2NhcHMpIHsKICAgIHByaW50KCJhbGxvd19jYXBzOiBwb2xpY3kgQW1iaWVudCA9IiwgcF9jYXBzLkFtYmllbnQpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgQW1iaWVudCA9IiwgaV9jYXBzLkFtYmllbnQpCiAgICBtYXRjaF9jYXBzKHBfY2Fwcy5BbWJpZW50LCBpX2NhcHMuQW1iaWVudCkKCiAgICBwcmludCgiYWxsb3dfY2FwczogcG9saWN5IEJvdW5kaW5nID0iLCBwX2NhcHMuQm91bmRpbmcpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgQm91bmRpbmcgPSIsIGlfY2Fwcy5Cb3VuZGluZykKICAgIG1hdGNoX2NhcHMocF9jYXBzLkJvdW5kaW5nLCBpX2NhcHMuQm91bmRpbmcpCgogICAgcHJpbnQoImFsbG93X2NhcHM6IHBvbGljeSBFZmZlY3RpdmUgPSIsIHBfY2Fwcy5FZmZlY3RpdmUpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgRWZmZWN0aXZlID0iLCBpX2NhcHMuRWZmZWN0aXZlKQogICAgbWF0Y2hfY2FwcyhwX2NhcHMuRWZmZWN0aXZlLCBpX2NhcHMuRWZmZWN0aXZlKQoKICAgIHByaW50KCJhbGxvd19jYXBzOiBwb2xpY3kgSW5oZXJpdGFibGUgPSIsIHBfY2Fwcy5Jbmhlcml0YWJsZSkKICAgIHByaW50KCJhbGxvd19jYXBzOiBpbnB1dCBJbmhlcml0YWJsZSA9IiwgaV9jYXBzLkluaGVyaXRhYmxlKQogICAgbWF0Y2hfY2FwcyhwX2NhcHMuSW5oZXJpdGFibGUsIGlfY2Fwcy5Jbmhlcml0YWJsZSkKCiAgICBwcmludCgiYWxsb3dfY2FwczogcG9saWN5IFBlcm1pdHRlZCA9IiwgcF9jYXBzLlBlcm1pdHRlZCkKICAgIHByaW50KCJhbGxvd19jYXBzOiBpbnB1dCBQZXJtaXR0ZWQgPSIsIGlfY2Fwcy5QZXJtaXR0ZWQpCiAgICBtYXRjaF9jYXBzKHBfY2Fwcy5QZXJtaXR0ZWQsIGlfY2Fwcy5QZXJtaXR0ZWQpCn0KCm1hdGNoX2NhcHMocF9jYXBzLCBpX2NhcHMpIHsKICAgIHByaW50KCJtYXRjaF9jYXBzIDE6IHN0YXJ0IikKCiAgICBwX2NhcHMgPT0gaV9jYXBzCgogICAgcHJpbnQoIm1hdGNoX2NhcHMgMTogdHJ1ZSIpCn0KbWF0Y2hfY2FwcyhwX2NhcHMsIGlfY2FwcykgewogICAgcHJpbnQoIm1hdGNoX2NhcHMgMjogc3RhcnQiKQoKICAgIGNvdW50KHBfY2FwcykgPT0gMQogICAgcF9jYXBzWzBdID09ICIkKGRlZmF1bHRfY2FwcykiCgogICAgcHJpbnQoIm1hdGNoX2NhcHMgMjogZGVmYXVsdF9jYXBzID0iLCBwb2xpY3lfZGF0YS5jb21tb24uZGVmYXVsdF9jYXBzKQogICAgcG9saWN5X2RhdGEuY29tbW9uLmRlZmF1bHRfY2FwcyA9PSBpX2NhcHMKCiAgICBwcmludCgibWF0Y2hfY2FwcyAyOiB0cnVlIikKfQptYXRjaF9jYXBzKHBfY2FwcywgaV9jYXBzKSB7CiAgICBwcmludCgibWF0Y2hfY2FwcyAzOiBzdGFydCIpCgogICAgY291bnQocF9jYXBzKSA9PSAxCiAgICBwX2NhcHNbMF0gPT0gIiQocHJpdmlsZWdlZF9jYXBzKSIKCiAgICBwcmludCgibWF0Y2hfY2FwcyAzOiBwcml2aWxlZ2VkX2NhcHMgPSIsIHBvbGljeV9kYXRhLmNvbW1vbi5wcml2aWxlZ2VkX2NhcHMpCiAgICBwb2xpY3lfZGF0YS5jb21tb24ucHJpdmlsZWdlZF9jYXBzID09IGlfY2FwcwoKICAgIHByaW50KCJtYXRjaF9jYXBzIDM6IHRydWUiKQp9CgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgpjaGVja19kaXJlY3RvcnlfdHJhdmVyc2FsKGlfcGF0aCkgewogICAgbm90IHJlZ2V4Lm1hdGNoKCIoXnwvKS4uKCR8LykiLCBpX3BhdGgpCn0KCmNoZWNrX3N5bWxpbmtfc291cmNlKGlfc3JjKSB7CiAgICBpX3NyYyA9PSAiIgogICAgcHJpbnQoImNoZWNrX3N5bWxpbmtfc291cmNlIDE6IHRydWUiKQp9CmNoZWNrX3N5bWxpbmtfc291cmNlKGlfc3JjKSB7CiAgICBpX3NyYyAhPSAiIgogICAgcHJpbnQoImNoZWNrX3N5bWxpbmtfc291cmNlIDI6IGlfc3JjID0iLCBpX3NyYykKCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24uc19zb3VyY2UxLCBpX3NyYykKCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMjogdHJ1ZSIpCn0KY2hlY2tfc3ltbGlua19zb3VyY2UoaV9zcmMpIHsKICAgIGlfc3JjICE9ICIiCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMzogaV9zcmMgPSIsIGlfc3JjKQoKICAgIHJlZ2V4Lm1hdGNoKHBvbGljeV9kYXRhLmNvbW1vbi5zX3NvdXJjZTIsIGlfc3JjKQogICAgY2hlY2tfZGlyZWN0b3J5X3RyYXZlcnNhbChpX3NyYykKCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMzogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfc3RvcmFnZXMoaV9zdG9yYWdlcykgewogICAgcHJpbnQoImFsbG93X3NhbmRib3hfc3RvcmFnZXM6IGlfc3RvcmFnZXMgPSIsIGlfc3RvcmFnZXMpCgogICAgcF9zdG9yYWdlcyA6PSBwb2xpY3lfZGF0YS5zYW5kYm94LnN0b3JhZ2VzCiAgICBldmVyeSBpX3N0b3JhZ2UgaW4gaV9zdG9yYWdlcyB7CiAgICAgICAgYWxsb3dfc2FuZGJveF9zdG9yYWdlKHBfc3RvcmFnZXMsIGlfc3RvcmFnZSkKICAgIH0KCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9zdG9yYWdlczogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfc3RvcmFnZShwX3N0b3JhZ2VzLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IGlfc3RvcmFnZSA9IiwgaV9zdG9yYWdlKQoKICAgIHNvbWUgcF9zdG9yYWdlIGluIHBfc3RvcmFnZXMKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IHBfc3RvcmFnZSA9IiwgcF9zdG9yYWdlKQogICAgaV9zdG9yYWdlID09IHBfc3RvcmFnZQoKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IHRydWUiKQp9CgpDb3B5RmlsZVJlcXVlc3QgewogICAgcHJpbnQoIkNvcHlGaWxlUmVxdWVzdDogaW5wdXQucGF0aCA9IiwgaW5wdXQucGF0aCkKCiAgICBjaGVja19zeW1saW5rX3NvdXJjZShpbnB1dC5zeW1saW5rX3NyYykKICAgIGNoZWNrX2RpcmVjdG9yeV90cmF2ZXJzYWwoaW5wdXQucGF0aCkKCiAgICBzb21lIHJlZ2V4MSBpbiBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLkNvcHlGaWxlUmVxdWVzdAogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5jcGF0aCkKICAgIHJlZ2V4NCA6PSByZXBsYWNlKHJlZ2V4MywgIiQoYnVuZGxlLWlkKSIsIEJVTkRMRV9JRCkKICAgIHByaW50KCJDb3B5RmlsZVJlcXVlc3Q6IHJlZ2V4NCA9IiwgcmVnZXg0KQoKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4NCwgaW5wdXQucGF0aCkKCiAgICBwcmludCgiQ29weUZpbGVSZXF1ZXN0OiB0cnVlIikKfQoKQ3JlYXRlU2FuZGJveFJlcXVlc3QgewogICAgcHJpbnQoIkNyZWF0ZVNhbmRib3hSZXF1ZXN0OiBpbnB1dC5ndWVzdF9ob29rX3BhdGggPSIsIGlucHV0Lmd1ZXN0X2hvb2tfcGF0aCkKICAgIGNvdW50KGlucHV0Lmd1ZXN0X2hvb2tfcGF0aCkgPT0gMAoKICAgIHByaW50KCJDcmVhdGVTYW5kYm94UmVxdWVzdDogaW5wdXQua2VybmVsX21vZHVsZXMgPSIsIGlucHV0Lmtlcm5lbF9tb2R1bGVzKQogICAgY291bnQoaW5wdXQua2VybmVsX21vZHVsZXMpID09IDAKCiAgICBpX3BpZG5zIDo9IGlucHV0LnNhbmRib3hfcGlkbnMKICAgIHByaW50KCJDcmVhdGVTYW5kYm94UmVxdWVzdDogaV9waWRucyA9IiwgaV9waWRucykKICAgIGlfcGlkbnMgPT0gZmFsc2UKICAgIGFsbG93X3NhbmRib3hfc3RvcmFnZXMoaW5wdXQuc3RvcmFnZXMpCn0KCmFsbG93X2V4ZWMocF9jb250YWluZXIsIGlfcHJvY2VzcykgewogICAgcHJpbnQoImFsbG93X2V4ZWM6IHN0YXJ0IikKCiAgICBwX29jaSA9IHBfY29udGFpbmVyLk9DSQogICAgcF9zX25hbWUgPSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc19uYW1lc3BhY2UgPSBnZXRfc3RhdGVfdmFsKCJuYW1lc3BhY2UiKQogICAgYWxsb3dfcHJvYmVfcHJvY2VzcyhwX29jaS5Qcm9jZXNzLCBpX3Byb2Nlc3MsIHBfc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfZXhlYzogdHJ1ZSIpCn0KCmFsbG93X2ludGVyYWN0aXZlX2V4ZWMocF9jb250YWluZXIsIGlfcHJvY2VzcykgewogICAgcHJpbnQoImFsbG93X2ludGVyYWN0aXZlX2V4ZWM6IHN0YXJ0IikKCiAgICBwX29jaSA9IHBfY29udGFpbmVyLk9DSQogICAgcF9zX25hbWUgPSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc19uYW1lc3BhY2UgPSBnZXRfc3RhdGVfdmFsKCJuYW1lc3BhY2UiKQogICAgYWxsb3dfaW50ZXJhY3RpdmVfcHJvY2VzcyhwX29jaS5Qcm9jZXNzLCBpX3Byb2Nlc3MsIHBfc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfaW50ZXJhY3RpdmVfZXhlYzogdHJ1ZSIpCn0KCiMgVE9ETzogc2hvdWxkIG90aGVyIEV4ZWNQcm9jZXNzUmVxdWVzdCBpbnB1dCBkYXRhIGZpZWxkcyBiZSB2YWxpZGF0ZWQgYXMgd2VsbD8KRXhlY1Byb2Nlc3NSZXF1ZXN0IHsKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMTogaW5wdXQgPSIsIGlucHV0KQoKICAgIHNvbWUgcF9jb21tYW5kIGluIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuRXhlY1Byb2Nlc3NSZXF1ZXN0LmFsbG93ZWRfY29tbWFuZHMKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMTogcF9jb21tYW5kID0iLCBwX2NvbW1hbmQpCiAgICBwX2NvbW1hbmQgPT0gaW5wdXQucHJvY2Vzcy5BcmdzCgogICAgIyBUT0RPOiBtYXRjaCBwX2NvbnRhaW5lcidzIElEIHdpdGggdGhlIGlucHV0IGNvbnRhaW5lcl9pZC4KICAgIHNvbWUgcF9jb250YWluZXIgaW4gcG9saWN5X2RhdGEuY29udGFpbmVycwogICAgYWxsb3dfaW50ZXJhY3RpdmVfZXhlYyhwX2NvbnRhaW5lciwgaW5wdXQucHJvY2VzcykKCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDE6IHRydWUiKQp9CkV4ZWNQcm9jZXNzUmVxdWVzdCB7CiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDI6IGlucHV0ID0iLCBpbnB1dCkKCiAgICAjIFRPRE86IG1hdGNoIGlucHV0IGNvbnRhaW5lciBJRCB3aXRoIGl0cyBjb3JyZXNwb25kaW5nIGNvbnRhaW5lci5leGVjX2NvbW1hbmRzLgogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBzb21lIHBfY29tbWFuZCBpbiBwX2NvbnRhaW5lci5leGVjX2NvbW1hbmRzCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDI6IHBfY29tbWFuZCA9IiwgcF9jb21tYW5kKQoKICAgICMgVE9ETzogc2hvdWxkIG90aGVyIGlucHV0IGRhdGEgZmllbGRzIGJlIHZhbGlkYXRlZCBhcyB3ZWxsPwogICAgcF9jb21tYW5kID09IGlucHV0LnByb2Nlc3MuQXJncwoKICAgIGFsbG93X2V4ZWMocF9jb250YWluZXIsIGlucHV0LnByb2Nlc3MpCgogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAyOiB0cnVlIikKfQpFeGVjUHJvY2Vzc1JlcXVlc3QgewogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAzOiBpbnB1dCA9IiwgaW5wdXQpCgogICAgaV9jb21tYW5kID0gY29uY2F0KCIgIiwgaW5wdXQucHJvY2Vzcy5BcmdzKQogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAzOiBpX2NvbW1hbmQgPSIsIGlfY29tbWFuZCkKCiAgICBzb21lIHBfcmVnZXggaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5FeGVjUHJvY2Vzc1JlcXVlc3QucmVnZXgKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMzogcF9yZWdleCA9IiwgcF9yZWdleCkKCiAgICByZWdleC5tYXRjaChwX3JlZ2V4LCBpX2NvbW1hbmQpCgogICAgIyBUT0RPOiBtYXRjaCBwX2NvbnRhaW5lcidzIElEIHdpdGggdGhlIGlucHV0IGNvbnRhaW5lcl9pZC4KICAgIHNvbWUgcF9jb250YWluZXIgaW4gcG9saWN5X2RhdGEuY29udGFpbmVycwogICAgYWxsb3dfaW50ZXJhY3RpdmVfZXhlYyhwX2NvbnRhaW5lciwgaW5wdXQucHJvY2VzcykKCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDM6IHRydWUiKQp9CgpVcGRhdGVSb3V0ZXNSZXF1ZXN0IHsKICAgIHByaW50KCJVcGRhdGVSb3V0ZXNSZXF1ZXN0OiBpbnB1dCA9IiwgaW5wdXQpCiAgICBwcmludCgiVXBkYXRlUm91dGVzUmVxdWVzdDogcG9saWN5ID0iLCBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLlVwZGF0ZVJvdXRlc1JlcXVlc3QpCgogICAgaV9yb3V0ZXMgOj0gaW5wdXQucm91dGVzLlJvdXRlcwogICAgcF9zb3VyY2VfcmVnZXggPSBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLlVwZGF0ZVJvdXRlc1JlcXVlc3QuZm9yYmlkZGVuX3NvdXJjZV9yZWdleAogICAgcF9uYW1lcyA9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuVXBkYXRlUm91dGVzUmVxdWVzdC5mb3JiaWRkZW5fZGV2aWNlX25hbWVzCgogICAgZXZlcnkgaV9yb3V0ZSBpbiBpX3JvdXRlcyB7CiAgICAgICAgcHJpbnQoImlfcm91dGUuc291cmNlID0iLCBpX3JvdXRlLnNvdXJjZSkKICAgICAgICBldmVyeSBwX3JlZ2V4IGluIHBfc291cmNlX3JlZ2V4IHsKICAgICAgICAgICAgcHJpbnQoInBfcmVnZXggPSIsIHBfcmVnZXgpCiAgICAgICAgICAgIG5vdCByZWdleC5tYXRjaChwX3JlZ2V4LCBpX3JvdXRlLnNvdXJjZSkKICAgICAgICB9CgogICAgICAgIHByaW50KCJpX3JvdXRlLmRldmljZSA9IiwgaV9yb3V0ZS5kZXZpY2UpCiAgICAgICAgbm90IGlfcm91dGUuZGV2aWNlIGluIHBfbmFtZXMKICAgIH0KCiAgICBwcmludCgiVXBkYXRlUm91dGVzUmVxdWVzdDogdHJ1ZSIpCn0KClVwZGF0ZUludGVyZmFjZVJlcXVlc3QgewogICAgcHJpbnQoIlVwZGF0ZUludGVyZmFjZVJlcXVlc3Q6IGlucHV0ID0iLCBpbnB1dCkKICAgIHByaW50KCJVcGRhdGVJbnRlcmZhY2VSZXF1ZXN0OiBwb2xpY3kgPSIsIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuVXBkYXRlSW50ZXJmYWNlUmVxdWVzdCkKCiAgICBpX2ludGVyZmFjZSA6PSBpbnB1dC5pbnRlcmZhY2UKICAgIHBfZmxhZ3MgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmFsbG93X3Jhd19mbGFncwoKICAgICMgVHlwaWNhbGx5LCBqdXN0IElGRl9OT0FSUCBpcyB1c2VkLgogICAgYml0cy5hbmQoaV9pbnRlcmZhY2UucmF3X2ZsYWdzLCBiaXRzLm5lZ2F0ZShwX2ZsYWdzKSkgPT0gMAoKICAgIHBfbmFtZXMgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmZvcmJpZGRlbl9uYW1lcwoKICAgIG5vdCBpX2ludGVyZmFjZS5uYW1lIGluIHBfbmFtZXMKCiAgICBwX2h3YWRkcnMgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmZvcmJpZGRlbl9od19hZGRycwoKICAgIG5vdCBpX2ludGVyZmFjZS5od0FkZHIgaW4gcF9od2FkZHJzCgogICAgcHJpbnQoIlVwZGF0ZUludGVyZmFjZVJlcXVlc3Q6IHRydWUiKQp9CgpDbG9zZVN0ZGluUmVxdWVzdCB7CiAgICBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLkNsb3NlU3RkaW5SZXF1ZXN0ID09IHRydWUKfQoKUmVhZFN0cmVhbVJlcXVlc3QgewogICAgcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5SZWFkU3RyZWFtUmVxdWVzdCA9PSB0cnVlCn0KClVwZGF0ZUVwaGVtZXJhbE1vdW50c1JlcXVlc3QgewogICAgcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVFcGhlbWVyYWxNb3VudHNSZXF1ZXN0ID09IHRydWUKfQoKV3JpdGVTdHJlYW1SZXF1ZXN0IHsKICAgIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuV3JpdGVTdHJlYW1SZXF1ZXN0ID09IHRydWUKfQoKcG9saWN5X2RhdGEgOj0gewogICJjb250YWluZXJzIjogWwogICAgewogICAgICAiT0NJIjogewogICAgICAgICJWZXJzaW9uIjogIjEuMS4wLXJjLjEiLAogICAgICAgICJQcm9jZXNzIjogewogICAgICAgICAgIlRlcm1pbmFsIjogZmFsc2UsCiAgICAgICAgICAiVXNlciI6IHsKICAgICAgICAgICAgIlVJRCI6IDY1NTM1LAogICAgICAgICAgICAiR0lEIjogNjU1MzUsCiAgICAgICAgICAgICJBZGRpdGlvbmFsR2lkcyI6IFtdLAogICAgICAgICAgICAiVXNlcm5hbWUiOiAiIgogICAgICAgICAgfSwKICAgICAgICAgICJEZXByZWNhdGVkQXJncyI6IFsKICAgICAgICAgICAgIi9wYXVzZSIKICAgICAgICAgIF0sCiAgICAgICAgICAiQXJncyI6IFsKICAgICAgICAgICAgIi9wYXVzZSIKICAgICAgICAgIF0sCiAgICAgICAgICAiRW52IjogWwogICAgICAgICAgICAiUEFUSD0vdXNyL2xvY2FsL3NiaW46L3Vzci9sb2NhbC9iaW46L3Vzci9zYmluOi91c3IvYmluOi9zYmluOi9iaW4iCiAgICAgICAgICBdLAogICAgICAgICAgIkN3ZCI6ICIvIiwKICAgICAgICAgICJDYXBhYmlsaXRpZXMiOiB7CiAgICAgICAgICAgICJBbWJpZW50IjogW10sCiAgICAgICAgICAgICJCb3VuZGluZyI6IFsKICAgICAgICAgICAgICAiJChkZWZhdWx0X2NhcHMpIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiRWZmZWN0aXZlIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJJbmhlcml0YWJsZSI6IFtdLAogICAgICAgICAgICAiUGVybWl0dGVkIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICAiTm9OZXdQcml2aWxlZ2VzIjogdHJ1ZQogICAgICAgIH0sCiAgICAgICAgIlJvb3QiOiB7CiAgICAgICAgICAiUGF0aCI6ICIkKGNwYXRoKS8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgIlJlYWRvbmx5IjogdHJ1ZQogICAgICAgIH0sCiAgICAgICAgIk1vdW50cyI6IFsKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9wcm9jIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJwcm9jIiwKICAgICAgICAgICAgInR5cGVfIjogInByb2MiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2IiwKICAgICAgICAgICAgInNvdXJjZSI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJzdHJpY3RhdGltZSIsCiAgICAgICAgICAgICAgIm1vZGU9NzU1IiwKICAgICAgICAgICAgICAic2l6ZT02NTUzNmsiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L3B0cyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiZGV2cHRzIiwKICAgICAgICAgICAgInR5cGVfIjogImRldnB0cyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJuZXdpbnN0YW5jZSIsCiAgICAgICAgICAgICAgInB0bXhtb2RlPTA2NjYiLAogICAgICAgICAgICAgICJtb2RlPTA2MjAiLAogICAgICAgICAgICAgICJnaWQ9NSIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvc2htIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L3NobSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi9tcXVldWUiLAogICAgICAgICAgICAic291cmNlIjogIm1xdWV1ZSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJtcXVldWUiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvc3lzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJzeXNmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJzeXNmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2V0Yy9yZXNvbHYuY29uZiIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClyZXNvbHYuY29uZiQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJvIiwKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9kZXYiLAogICAgICAgICAgICAgICJub2V4ZWMiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0KICAgICAgICBdLAogICAgICAgICJBbm5vdGF0aW9ucyI6IHsKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmJ1bmRsZV9wYXRoIjogIi9ydW4vY29udGFpbmVyZC9pby5jb250YWluZXJkLnJ1bnRpbWUudjIudGFzay9rOHMuaW8vJChidW5kbGUtaWQpIiwKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIjogInBvZF9zYW5kYm94IiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSI6ICJzYW5kYm94IiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWlkIjogIl5bYS16MC05XXs2NH0kIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWxvZy1kaXJlY3RvcnkiOiAiXi92YXIvbG9nL3BvZHMvJChzYW5kYm94LW5hbWVzcGFjZSlfJChzYW5kYm94LW5hbWUpX1swLTlhLWZdezh9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezEyfSQiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZSI6ICJeZTJlXFwtY29uZm9ybWFuY2VcXC10ZXN0JCIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1uYW1lc3BhY2UiOiAiY29uZm9ybWFuY2UiLAogICAgICAgICAgIm5lcmRjdGwvbmV0d29yay1uYW1lc3BhY2UiOiAiXi92YXIvcnVuL25ldG5zL2NuaS1bMC05YS1mXXs4fS1bMC05YS1mXXs0fS1bMC05YS1mXXs0fS1bMC05YS1mXXs0fS1bMC05YS1mXXsxMn0kIgogICAgICAgIH0sCiAgICAgICAgIkxpbnV4IjogewogICAgICAgICAgIk5hbWVzcGFjZXMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiVHlwZSI6ICJpcGMiLAogICAgICAgICAgICAgICJQYXRoIjogIiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJUeXBlIjogInV0cyIsCiAgICAgICAgICAgICAgIlBhdGgiOiAiIgogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgIlR5cGUiOiAibW91bnQiLAogICAgICAgICAgICAgICJQYXRoIjogIiIKICAgICAgICAgICAgfQogICAgICAgICAgXSwKICAgICAgICAgICJNYXNrZWRQYXRocyI6IFsKICAgICAgICAgICAgIi9wcm9jL2FjcGkiLAogICAgICAgICAgICAiL3Byb2MvYXNvdW5kIiwKICAgICAgICAgICAgIi9wcm9jL2tjb3JlIiwKICAgICAgICAgICAgIi9wcm9jL2tleXMiLAogICAgICAgICAgICAiL3Byb2MvbGF0ZW5jeV9zdGF0cyIsCiAgICAgICAgICAgICIvcHJvYy90aW1lcl9saXN0IiwKICAgICAgICAgICAgIi9wcm9jL3RpbWVyX3N0YXRzIiwKICAgICAgICAgICAgIi9wcm9jL3NjaGVkX2RlYnVnIiwKICAgICAgICAgICAgIi9zeXMvZmlybXdhcmUiLAogICAgICAgICAgICAiL3Byb2Mvc2NzaSIKICAgICAgICAgIF0sCiAgICAgICAgICAiUmVhZG9ubHlQYXRocyI6IFsKICAgICAgICAgICAgIi9wcm9jL2J1cyIsCiAgICAgICAgICAgICIvcHJvYy9mcyIsCiAgICAgICAgICAgICIvcHJvYy9pcnEiLAogICAgICAgICAgICAiL3Byb2Mvc3lzIiwKICAgICAgICAgICAgIi9wcm9jL3N5c3JxLXRyaWdnZXIiCiAgICAgICAgICBdLAogICAgICAgICAgIkRldmljZXMiOiBbXSwKICAgICAgICAgICJTeXNjdGwiOiB7CiAgICAgICAgICAgICJuZXQuaXB2NC5pcF91bnByaXZpbGVnZWRfcG9ydF9zdGFydCI6ICIwIiwKICAgICAgICAgICAgIm5ldC5pcHY0LnBpbmdfZ3JvdXBfcmFuZ2UiOiAiMCAyMTQ3NDgzNjQ3IgogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSwKICAgICAgInN0b3JhZ2VzIjogWwogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2gwKSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjApIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAib3ZlcmxheWZzIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJmdXNlMy5rYXRhLW92ZXJsYXkiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICI1YTVhYWQ4MDA1NWZmMjAwMTJhNTBkYzI1ZjhkZjdhMjk5MjQ0NzQzMjRkNjVmN2Q1MzA2ZWU4ZWUyN2ZmNzFkIiwKICAgICAgICAgICAgIjgxNzI1MGYxYTNlMzM2ZGE3NmY1YmQzZmE3ODRlMWIyNmQ5NTliOWMxMzE4NzY4MTViYTI2MDQwNDhiNzBjMTgiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQoY3BhdGgpLyQoYnVuZGxlLWlkKSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfQogICAgICBdLAogICAgICAiZGV2aWNlcyI6IFtdLAogICAgICAic2FuZGJveF9waWRucyI6IGZhbHNlLAogICAgICAiZXhlY19jb21tYW5kcyI6IFtdLAogICAgICAiZW52X21hcCI6IHsKICAgICAgICAiUEFUSCI6ICIvdXNyL2xvY2FsL3NiaW46L3Vzci9sb2NhbC9iaW46L3Vzci9zYmluOi91c3IvYmluOi9zYmluOi9iaW4iCiAgICAgIH0KICAgIH0sCiAgICB7CiAgICAgICJPQ0kiOiB7CiAgICAgICAgIlZlcnNpb24iOiAiMS4xLjAtcmMuMSIsCiAgICAgICAgIlByb2Nlc3MiOiB7CiAgICAgICAgICAiVGVybWluYWwiOiBmYWxzZSwKICAgICAgICAgICJVc2VyIjogewogICAgICAgICAgICAiVUlEIjogMCwKICAgICAgICAgICAgIkdJRCI6IDAsCiAgICAgICAgICAgICJBZGRpdGlvbmFsR2lkcyI6IFtdLAogICAgICAgICAgICAiVXNlcm5hbWUiOiAiIgogICAgICAgICAgfSwKICAgICAgICAgICJEZXByZWNhdGVkQXJncyI6IFsKICAgICAgICAgICAgInNoIgogICAgICAgICAgXSwKICAgICAgICAgICJBcmdzIjogWwogICAgICAgICAgICAic2giCiAgICAgICAgICBdLAogICAgICAgICAgIkVudiI6IFsKICAgICAgICAgICAgIlBBVEg9L3Vzci9sb2NhbC9zYmluOi91c3IvbG9jYWwvYmluOi91c3Ivc2JpbjovdXNyL2Jpbjovc2JpbjovYmluIiwKICAgICAgICAgICAgIkhPU1ROQU1FPSQoaG9zdC1uYW1lKSIsCiAgICAgICAgICAgICJFMkVfRk9DVVM9XFxbQ29uZm9ybWFuY2VcXF0iLAogICAgICAgICAgICAiRTJFX1NLSVA9IiwKICAgICAgICAgICAgIkUyRV9QUk9WSURFUj1za2VsZXRvbiIsCiAgICAgICAgICAgICJFMkVfUEFSQUxMRUw9ZmFsc2UiLAogICAgICAgICAgICAiRTJFX1ZFUkJPU0lUWT00IgogICAgICAgICAgXSwKICAgICAgICAgICJDd2QiOiAiLyIsCiAgICAgICAgICAiQ2FwYWJpbGl0aWVzIjogewogICAgICAgICAgICAiQW1iaWVudCI6IFtdLAogICAgICAgICAgICAiQm91bmRpbmciOiBbCiAgICAgICAgICAgICAgIiQoZGVmYXVsdF9jYXBzKSIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgIkVmZmVjdGl2ZSI6IFsKICAgICAgICAgICAgICAiJChkZWZhdWx0X2NhcHMpIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiSW5oZXJpdGFibGUiOiBbXSwKICAgICAgICAgICAgIlBlcm1pdHRlZCI6IFsKICAgICAgICAgICAgICAiJChkZWZhdWx0X2NhcHMpIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgIk5vTmV3UHJpdmlsZWdlcyI6IGZhbHNlCiAgICAgICAgfSwKICAgICAgICAiUm9vdCI6IHsKICAgICAgICAgICJQYXRoIjogIiQoY3BhdGgpLyQoYnVuZGxlLWlkKSIsCiAgICAgICAgICAiUmVhZG9ubHkiOiBmYWxzZQogICAgICAgIH0sCiAgICAgICAgIk1vdW50cyI6IFsKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9wcm9jIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJwcm9jIiwKICAgICAgICAgICAgInR5cGVfIjogInByb2MiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2IiwKICAgICAgICAgICAgInNvdXJjZSI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJzdHJpY3RhdGltZSIsCiAgICAgICAgICAgICAgIm1vZGU9NzU1IiwKICAgICAgICAgICAgICAic2l6ZT02NTUzNmsiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L3B0cyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiZGV2cHRzIiwKICAgICAgICAgICAgInR5cGVfIjogImRldnB0cyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJuZXdpbnN0YW5jZSIsCiAgICAgICAgICAgICAgInB0bXhtb2RlPTA2NjYiLAogICAgICAgICAgICAgICJtb2RlPTA2MjAiLAogICAgICAgICAgICAgICJnaWQ9NSIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvc2htIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L3NobSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi9tcXVldWUiLAogICAgICAgICAgICAic291cmNlIjogIm1xdWV1ZSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJtcXVldWUiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvc3lzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJzeXNmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJzeXNmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL3N5cy9mcy9jZ3JvdXAiLAogICAgICAgICAgICAic291cmNlIjogImNncm91cCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJjZ3JvdXAiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiLAogICAgICAgICAgICAgICJyZWxhdGltZSIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2V0Yy9ob3N0cyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClob3N0cyQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicnciCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L3Rlcm1pbmF0aW9uLWxvZyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeCl0ZXJtaW5hdGlvbi1sb2ckIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJ3IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2V0Yy9ob3N0bmFtZSIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClob3N0bmFtZSQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicnciCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZXRjL3Jlc29sdi5jb25mIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KXJlc29sdi5jb25mJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJydyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi92YXIvcnVuL3NlY3JldHMva3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudCIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClzZXJ2aWNlYWNjb3VudCQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicm8iCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvdmFyL3J1bi9zZWNyZXRzL2F6dXJlL3Rva2VucyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeCl0b2tlbnMkIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL3RtcC9yZXN1bHRzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KXJlc3VsdHMkIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9CiAgICAgICAgXSwKICAgICAgICAiQW5ub3RhdGlvbnMiOiB7CiAgICAgICAgICAiaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5idW5kbGVfcGF0aCI6ICIvcnVuL2NvbnRhaW5lcmQvaW8uY29udGFpbmVyZC5ydW50aW1lLnYyLnRhc2svazhzLmlvLyQoYnVuZGxlLWlkKSIsCiAgICAgICAgICAiaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5jb250YWluZXJfdHlwZSI6ICJwb2RfY29udGFpbmVyIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItbmFtZSI6ICJidXN5IiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSI6ICJjb250YWluZXIiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLmltYWdlLW5hbWUiOiAibWNyLm1pY3Jvc29mdC5jb20vYWtzL2UyZS9saWJyYXJ5LWJ1c3lib3g6bWFzdGVyLjIyMDMxNC4xLWxpbnV4LWFtZDY0IiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWlkIjogIl5bYS16MC05XXs2NH0kIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LW5hbWUiOiAiXmUyZVxcLWNvbmZvcm1hbmNlXFwtdGVzdCQiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZXNwYWNlIjogImNvbmZvcm1hbmNlIgogICAgICAgIH0sCiAgICAgICAgIkxpbnV4IjogewogICAgICAgICAgIk5hbWVzcGFjZXMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiVHlwZSI6ICJpcGMiLAogICAgICAgICAgICAgICJQYXRoIjogIiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJUeXBlIjogInV0cyIsCiAgICAgICAgICAgICAgIlBhdGgiOiAiIgogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgIlR5cGUiOiAibW91bnQiLAogICAgICAgICAgICAgICJQYXRoIjogIiIKICAgICAgICAgICAgfQogICAgICAgICAgXSwKICAgICAgICAgICJNYXNrZWRQYXRocyI6IFsKICAgICAgICAgICAgIi9wcm9jL2FjcGkiLAogICAgICAgICAgICAiL3Byb2Mva2NvcmUiLAogICAgICAgICAgICAiL3Byb2Mva2V5cyIsCiAgICAgICAgICAgICIvcHJvYy9sYXRlbmN5X3N0YXRzIiwKICAgICAgICAgICAgIi9wcm9jL3RpbWVyX2xpc3QiLAogICAgICAgICAgICAiL3Byb2MvdGltZXJfc3RhdHMiLAogICAgICAgICAgICAiL3Byb2Mvc2NoZWRfZGVidWciLAogICAgICAgICAgICAiL3Byb2Mvc2NzaSIsCiAgICAgICAgICAgICIvc3lzL2Zpcm13YXJlIgogICAgICAgICAgXSwKICAgICAgICAgICJSZWFkb25seVBhdGhzIjogWwogICAgICAgICAgICAiL3Byb2MvYXNvdW5kIiwKICAgICAgICAgICAgIi9wcm9jL2J1cyIsCiAgICAgICAgICAgICIvcHJvYy9mcyIsCiAgICAgICAgICAgICIvcHJvYy9pcnEiLAogICAgICAgICAgICAiL3Byb2Mvc3lzIiwKICAgICAgICAgICAgIi9wcm9jL3N5c3JxLXRyaWdnZXIiCiAgICAgICAgICBdLAogICAgICAgICAgIkRldmljZXMiOiBbXSwKICAgICAgICAgICJTeXNjdGwiOiB7CiAgICAgICAgICAgICJuZXQuaXB2NC5pcF91bnByaXZpbGVnZWRfcG9ydF9zdGFydCI6ICIwIiwKICAgICAgICAgICAgIm5ldC5pcHY0LnBpbmdfZ3JvdXBfcmFuZ2UiOiAiMCAyMTQ3NDgzNjQ3IgogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSwKICAgICAgInN0b3JhZ2VzIjogWwogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2gwKSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjApIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2gxKSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjEpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAib3ZlcmxheWZzIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJmdXNlMy5rYXRhLW92ZXJsYXkiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIyYzM0MmExMzdlNjkzYzc4OThhZWMzNmRhMTA0N2YxOTFkYzdjMTY4N2U2NjE5OGFkYWNjNDM5Y2Y0YWRmMzc5OjI1NzBlM2ExOWUxYmYyMGRkZGE0NTQ5OGE5NjI3ZjYxNTU1ZDJkNmMwMTQ3OWI5Yjc2NDYwYjY3OWIyN2Q1NTIiLAogICAgICAgICAgICAiODU2OGM3MGMwY2NmZTAwNTEwOTJlODE4ZGE3NjkxMTFhNTk4ODJjZDE5ZGQ3OTlkM2JjYTVmZmE4Mjc5MTA4MDpiNjQzYjYyMTc3NDg5ODM4MzBiMjZhYzE0YTM1YTMzMjJkZDUyOGMwMDk2M2VhYWRkOTFlZjU1ZjUxM2RjNzNmIgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGNwYXRoKS8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0KICAgICAgXSwKICAgICAgImRldmljZXMiOiBbXSwKICAgICAgInNhbmRib3hfcGlkbnMiOiBmYWxzZSwKICAgICAgImV4ZWNfY29tbWFuZHMiOiBbXSwKICAgICAgImVudl9tYXAiOiB7CiAgICAgICAgIkUyRV9GT0NVUyI6ICJcXFtDb25mb3JtYW5jZVxcXSIsCiAgICAgICAgIkUyRV9QQVJBTExFTCI6ICJmYWxzZSIsCiAgICAgICAgIkUyRV9QUk9WSURFUiI6ICJza2VsZXRvbiIsCiAgICAgICAgIkUyRV9TS0lQIjogIiIsCiAgICAgICAgIkUyRV9WRVJCT1NJVFkiOiAiNCIsCiAgICAgICAgIkhPU1ROQU1FIjogIiQoaG9zdC1uYW1lKSIsCiAgICAgICAgIlBBVEgiOiAiL3Vzci9sb2NhbC9zYmluOi91c3IvbG9jYWwvYmluOi91c3Ivc2JpbjovdXNyL2Jpbjovc2JpbjovYmluIgogICAgICB9CiAgICB9CiAgXSwKICAiY29tbW9uIjogewogICAgImNwYXRoIjogIi9ydW4va2F0YS1jb250YWluZXJzL3NoYXJlZC9jb250YWluZXJzIiwKICAgICJtb3VudF9zb3VyY2VfY3BhdGgiOiAiL3J1bi9rYXRhLWNvbnRhaW5lcnMvc2hhcmVkL2NvbnRhaW5lcnMiLAogICAgInNmcHJlZml4IjogIl4kKGNwYXRoKS8kKGJ1bmRsZS1pZCktW2EtejAtOV17MTZ9LSIsCiAgICAic3BhdGgiOiAiL3J1bi9rYXRhLWNvbnRhaW5lcnMvc2FuZGJveC9zdG9yYWdlIiwKICAgICJpcHY0X2EiOiAiKChbMC05XXxbMS05XVswLTldfDFbMC05XXsyfXwyWzAtNF1bMC05XXwyNVswLTVdKVxcLil7M30oWzAtOV18WzEtOV1bMC05XXwxWzAtOV17Mn18MlswLTRdWzAtOV18MjVbMC01XSkiLAogICAgImlwX3AiOiAiWzAtOV17MSw1fSIsCiAgICAic3ZjX25hbWUiOiAiW0EtWl9cXC5cXC1dKyIsCiAgICAiZG5zX2xhYmVsIjogIlthLXpBLVowLTlfXFwuXFwtXSsiLAogICAgInNfc291cmNlMSI6ICJeLi4yWzAtOV17M31fWzAtMV1bMC05XV9bMC0zXVswLTldX1swLTJdWzAtOV1fWzAtNV1bMC05XV9bMC01XVswLTldXFwuWzAtOV17MSwxMH0kIiwKICAgICJzX3NvdXJjZTIiOiAiXi4uZGF0YS8iLAogICAgImRuc19zdWJkb21haW4iOiAiXlthLXowLTldKFstYS16MC05XSpbYS16MC05XSk/JCIsCiAgICAicG9kX3VpZCI6ICJeWzAtOWEtZkEtRl17OH0tWzAtOWEtZkEtRl17NH0tWzAtOWEtZkEtRl17NH0tWzAtOWEtZkEtRl17NH0tWzAtOWEtZkEtRl17MTJ9JCIsCiAgICAiZGVmYXVsdF9jYXBzIjogWwogICAgICAiQ0FQX0NIT1dOIiwKICAgICAgIkNBUF9EQUNfT1ZFUlJJREUiLAogICAgICAiQ0FQX0ZTRVRJRCIsCiAgICAgICJDQVBfRk9XTkVSIiwKICAgICAgIkNBUF9NS05PRCIsCiAgICAgICJDQVBfTkVUX1JBVyIsCiAgICAgICJDQVBfU0VUR0lEIiwKICAgICAgIkNBUF9TRVRVSUQiLAogICAgICAiQ0FQX1NFVEZDQVAiLAogICAgICAiQ0FQX1NFVFBDQVAiLAogICAgICAiQ0FQX05FVF9CSU5EX1NFUlZJQ0UiLAogICAgICAiQ0FQX1NZU19DSFJPT1QiLAogICAgICAiQ0FQX0tJTEwiLAogICAgICAiQ0FQX0FVRElUX1dSSVRFIgogICAgXSwKICAgICJwcml2aWxlZ2VkX2NhcHMiOiBbCiAgICAgICJDQVBfQ0hPV04iLAogICAgICAiQ0FQX0RBQ19PVkVSUklERSIsCiAgICAgICJDQVBfREFDX1JFQURfU0VBUkNIIiwKICAgICAgIkNBUF9GT1dORVIiLAogICAgICAiQ0FQX0ZTRVRJRCIsCiAgICAgICJDQVBfS0lMTCIsCiAgICAgICJDQVBfU0VUR0lEIiwKICAgICAgIkNBUF9TRVRVSUQiLAogICAgICAiQ0FQX1NFVFBDQVAiLAogICAgICAiQ0FQX0xJTlVYX0lNTVVUQUJMRSIsCiAgICAgICJDQVBfTkVUX0JJTkRfU0VSVklDRSIsCiAgICAgICJDQVBfTkVUX0JST0FEQ0FTVCIsCiAgICAgICJDQVBfTkVUX0FETUlOIiwKICAgICAgIkNBUF9ORVRfUkFXIiwKICAgICAgIkNBUF9JUENfTE9DSyIsCiAgICAgICJDQVBfSVBDX09XTkVSIiwKICAgICAgIkNBUF9TWVNfTU9EVUxFIiwKICAgICAgIkNBUF9TWVNfUkFXSU8iLAogICAgICAiQ0FQX1NZU19DSFJPT1QiLAogICAgICAiQ0FQX1NZU19QVFJBQ0UiLAogICAgICAiQ0FQX1NZU19QQUNDVCIsCiAgICAgICJDQVBfU1lTX0FETUlOIiwKICAgICAgIkNBUF9TWVNfQk9PVCIsCiAgICAgICJDQVBfU1lTX05JQ0UiLAogICAgICAiQ0FQX1NZU19SRVNPVVJDRSIsCiAgICAgICJDQVBfU1lTX1RJTUUiLAogICAgICAiQ0FQX1NZU19UVFlfQ09ORklHIiwKICAgICAgIkNBUF9NS05PRCIsCiAgICAgICJDQVBfTEVBU0UiLAogICAgICAiQ0FQX0FVRElUX1dSSVRFIiwKICAgICAgIkNBUF9BVURJVF9DT05UUk9MIiwKICAgICAgIkNBUF9TRVRGQ0FQIiwKICAgICAgIkNBUF9NQUNfT1ZFUlJJREUiLAogICAgICAiQ0FQX01BQ19BRE1JTiIsCiAgICAgICJDQVBfU1lTTE9HIiwKICAgICAgIkNBUF9XQUtFX0FMQVJNIiwKICAgICAgIkNBUF9CTE9DS19TVVNQRU5EIiwKICAgICAgIkNBUF9BVURJVF9SRUFEIiwKICAgICAgIkNBUF9QRVJGTU9OIiwKICAgICAgIkNBUF9CUEYiLAogICAgICAiQ0FQX0NIRUNLUE9JTlRfUkVTVE9SRSIKICAgIF0sCiAgICAidmlydGlvX2Jsa19zdG9yYWdlX2NsYXNzZXMiOiBbCiAgICAgICJjYy1sb2NhbC1jc2kiLAogICAgICAiY2MtbWFuYWdlZC1jc2kiLAogICAgICAiY2MtbWFuYWdlZC1wcmVtaXVtLWNzaSIKICAgIF0sCiAgICAic21iX3N0b3JhZ2VfY2xhc3NlcyI6IFsKICAgICAgewogICAgICAgICJuYW1lIjogImF6dXJlZmlsZS1jc2kta2F0YS1jYyIsCiAgICAgICAgIm1vdW50X29wdGlvbnMiOiBbCiAgICAgICAgICAiZGlyX21vZGU9MDc3NyIsCiAgICAgICAgICAiZmlsZV9tb2RlPTA3NzciLAogICAgICAgICAgIm1mc3ltbGlua3MiLAogICAgICAgICAgImNhY2hlPXN0cmljdCIsCiAgICAgICAgICAibm9zaGFyZXNvY2siLAogICAgICAgICAgImFjdGltZW89MzAiLAogICAgICAgICAgIm5vYnJsIgogICAgICAgIF0KICAgICAgfQogICAgXQogIH0sCiAgInNhbmRib3giOiB7CiAgICAic3RvcmFnZXMiOiBbCiAgICAgIHsKICAgICAgICAiZHJpdmVyIjogImVwaGVtZXJhbCIsCiAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgInNvdXJjZSI6ICJzaG0iLAogICAgICAgICJmc3R5cGUiOiAidG1wZnMiLAogICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICJub2RldiIsCiAgICAgICAgICAibW9kZT0xNzc3IiwKICAgICAgICAgICJzaXplPTY3MTA4ODY0IgogICAgICAgIF0sCiAgICAgICAgIm1vdW50X3BvaW50IjogIi9ydW4va2F0YS1jb250YWluZXJzL3NhbmRib3gvc2htIiwKICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgIH0KICAgIF0KICB9LAogICJyZXF1ZXN0X2RlZmF1bHRzIjogewogICAgIkNyZWF0ZUNvbnRhaW5lclJlcXVlc3QiOiB7CiAgICAgICJhbGxvd19lbnZfcmVnZXgiOiBbCiAgICAgICAgIl5IT1NUTkFNRT0kKGRuc19sYWJlbCkkIiwKICAgICAgICAiXiQoc3ZjX25hbWUpX1BPUlRfJChpcF9wKV9UQ1A9dGNwOi8vJChpcHY0X2EpOiQoaXBfcCkkIiwKICAgICAgICAiXiQoc3ZjX25hbWUpX1BPUlRfJChpcF9wKV9UQ1BfUFJPVE89dGNwJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9QT1JUXyQoaXBfcClfVENQX1BPUlQ9JChpcF9wKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfUE9SVF8kKGlwX3ApX1RDUF9BRERSPSQoaXB2NF9hKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfU0VSVklDRV9IT1NUPSQoaXB2NF9hKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfU0VSVklDRV9QT1JUPSQoaXBfcCkkIiwKICAgICAgICAiXiQoc3ZjX25hbWUpX1NFUlZJQ0VfUE9SVF8kKGRuc19sYWJlbCk9JChpcF9wKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfUE9SVD10Y3A6Ly8kKGlwdjRfYSk6JChpcF9wKSQiLAogICAgICAgICJeQVpVUkVfQ0xJRU5UX0lEPVtBLUZhLWYwLTktXSokIiwKICAgICAgICAiXkFaVVJFX1RFTkFOVF9JRD1bQS1GYS1mMC05LV0qJCIsCiAgICAgICAgIl5BWlVSRV9GRURFUkFURURfVE9LRU5fRklMRT0vdmFyL3J1bi9zZWNyZXRzL2F6dXJlL3Rva2Vucy9henVyZS1pZGVudGl0eS10b2tlbiQiLAogICAgICAgICJeQVpVUkVfQVVUSE9SSVRZX0hPU1Q9aHR0cHM6Ly9sb2dpblxcLm1pY3Jvc29mdG9ubGluZVxcLmNvbS8kIiwKICAgICAgICAiXlRFUk09eHRlcm0kIgogICAgICBdLAogICAgICAiYWxsb3dfZW52X3JlZ2V4X21hcCI6IHsKICAgICAgICAiQ1BVX0xJTUlUIjogIl5bMC05XSskIiwKICAgICAgICAiSk9CX0NPTVBMRVRJT05fSU5ERVgiOiAiXlswLTldKiQiLAogICAgICAgICJNRU1PUllfTElNSVQiOiAiXlswLTldKyQiCiAgICAgIH0KICAgIH0sCiAgICAiQ29weUZpbGVSZXF1ZXN0IjogWwogICAgICAiJChzZnByZWZpeCkiCiAgICBdLAogICAgIkV4ZWNQcm9jZXNzUmVxdWVzdCI6IHsKICAgICAgImFsbG93ZWRfY29tbWFuZHMiOiBbXSwKICAgICAgInJlZ2V4IjogW10KICAgIH0sCiAgICAiVXBkYXRlUm91dGVzUmVxdWVzdCI6IHsKICAgICAgImZvcmJpZGRlbl9kZXZpY2VfbmFtZXMiOiBbCiAgICAgICAgImxvIgogICAgICBdLAogICAgICAiZm9yYmlkZGVuX3NvdXJjZV9yZWdleCI6IFsKICAgICAgICAiXig/OjB7MCw0fTopezAsN30wezAsM30xJCIsCiAgICAgICAgIl4xMjdcXC4oPzpbMC05XXsxLDN9XFwuKXsyfVswLTldezEsM30kIgogICAgICBdCiAgICB9LAogICAgIlVwZGF0ZUludGVyZmFjZVJlcXVlc3QiOiB7CiAgICAgICJhbGxvd19yYXdfZmxhZ3MiOiAxMjgsCiAgICAgICJmb3JiaWRkZW5fbmFtZXMiOiBbCiAgICAgICAgImxvIgogICAgICBdLAogICAgICAiZm9yYmlkZGVuX2h3X2FkZHJzIjogWwogICAgICAgICIwMDowMDowMDowMDowMDowMCIKICAgICAgXQogICAgfSwKICAgICJDbG9zZVN0ZGluUmVxdWVzdCI6IGZhbHNlLAogICAgIlJlYWRTdHJlYW1SZXF1ZXN0IjogZmFsc2UsCiAgICAiVXBkYXRlRXBoZW1lcmFsTW91bnRzUmVxdWVzdCI6IGZhbHNlLAogICAgIldyaXRlU3RyZWFtUmVxdWVzdCI6IGZhbHNlCiAgfQp9 + namespace: conformance +spec: + restartPolicy: Never + runtimeClassName: kata-cc + containers: + - name: busy + image: "mcr.microsoft.com/aks/e2e/library-busybox:master.220314.1-linux-amd64" + imagePullPolicy: IfNotPresent + volumeMounts: + - mountPath: /tmp/results + name: output-volume + readOnly: true + env: + - name: E2E_FOCUS + value: "\\[Conformance\\]" + - name: E2E_SKIP + value: "" + - name: E2E_PROVIDER + value: skeleton + - name: E2E_PARALLEL + value: "false" + - name: E2E_VERBOSITY + value: "4" + volumes: + - name: output-volume + hostPath: + path: /tmp/results + serviceAccountName: conformance-serviceaccount diff --git a/src/agent/samples/policy/yaml/kubernetes/conformance/csi-hostpath-plugin.yaml b/src/agent/samples/policy/yaml/kubernetes/conformance/csi-hostpath-plugin.yaml new file mode 100644 index 000000000000..16d1dcc5780f --- /dev/null +++ b/src/agent/samples/policy/yaml/kubernetes/conformance/csi-hostpath-plugin.yaml @@ -0,0 +1,356 @@ +--- +kind: ServiceAccount +apiVersion: v1 +metadata: + name: csi-hostpathplugin-sa + namespace: default + labels: + app.kubernetes.io/instance: hostpath.csi.k8s.io + app.kubernetes.io/part-of: csi-driver-host-path + app.kubernetes.io/name: csi-hostpathplugin + app.kubernetes.io/component: serviceaccount +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + labels: + app.kubernetes.io/instance: hostpath.csi.k8s.io + app.kubernetes.io/part-of: csi-driver-host-path + app.kubernetes.io/name: csi-hostpathplugin + app.kubernetes.io/component: attacher-cluster-role + name: csi-hostpathplugin-attacher-cluster-role +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: external-attacher-runner +subjects: + - kind: ServiceAccount + name: csi-hostpathplugin-sa + namespace: default +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + labels: + app.kubernetes.io/instance: hostpath.csi.k8s.io + app.kubernetes.io/part-of: csi-driver-host-path + app.kubernetes.io/name: csi-hostpathplugin + app.kubernetes.io/component: health-monitor-controller-cluster-role + name: csi-hostpathplugin-health-monitor-controller-cluster-role +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: external-health-monitor-controller-runner +subjects: + - kind: ServiceAccount + name: csi-hostpathplugin-sa + namespace: default +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + labels: + app.kubernetes.io/instance: hostpath.csi.k8s.io + app.kubernetes.io/part-of: csi-driver-host-path + app.kubernetes.io/name: csi-hostpathplugin + app.kubernetes.io/component: provisioner-cluster-role + name: csi-hostpathplugin-provisioner-cluster-role +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: external-provisioner-runner +subjects: + - kind: ServiceAccount + name: csi-hostpathplugin-sa + namespace: default +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + labels: + app.kubernetes.io/instance: hostpath.csi.k8s.io + app.kubernetes.io/part-of: csi-driver-host-path + app.kubernetes.io/name: csi-hostpathplugin + app.kubernetes.io/component: resizer-cluster-role + name: csi-hostpathplugin-resizer-cluster-role +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: external-resizer-runner +subjects: + - kind: ServiceAccount + name: csi-hostpathplugin-sa + namespace: default +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + labels: + app.kubernetes.io/instance: hostpath.csi.k8s.io + app.kubernetes.io/part-of: csi-driver-host-path + app.kubernetes.io/name: csi-hostpathplugin + app.kubernetes.io/component: snapshotter-cluster-role + name: csi-hostpathplugin-snapshotter-cluster-role +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: external-snapshotter-runner +subjects: + - kind: ServiceAccount + name: csi-hostpathplugin-sa + namespace: default +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: RoleBinding +metadata: + labels: + app.kubernetes.io/instance: hostpath.csi.k8s.io + app.kubernetes.io/part-of: csi-driver-host-path + app.kubernetes.io/name: csi-hostpathplugin + app.kubernetes.io/component: attacher-role + name: csi-hostpathplugin-attacher-role +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: Role + name: external-attacher-cfg +subjects: + - kind: ServiceAccount + name: csi-hostpathplugin-sa +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: RoleBinding +metadata: + labels: + app.kubernetes.io/instance: hostpath.csi.k8s.io + app.kubernetes.io/part-of: csi-driver-host-path + app.kubernetes.io/name: csi-hostpathplugin + app.kubernetes.io/component: health-monitor-controller-role + name: csi-hostpathplugin-health-monitor-controller-role +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: Role + name: external-health-monitor-controller-cfg +subjects: + - kind: ServiceAccount + name: csi-hostpathplugin-sa +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: RoleBinding +metadata: + labels: + app.kubernetes.io/instance: hostpath.csi.k8s.io + app.kubernetes.io/part-of: csi-driver-host-path + app.kubernetes.io/name: csi-hostpathplugin + app.kubernetes.io/component: provisioner-role + name: csi-hostpathplugin-provisioner-role +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: Role + name: external-provisioner-cfg +subjects: + - kind: ServiceAccount + name: csi-hostpathplugin-sa +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: RoleBinding +metadata: + labels: + app.kubernetes.io/instance: hostpath.csi.k8s.io + app.kubernetes.io/part-of: csi-driver-host-path + app.kubernetes.io/name: csi-hostpathplugin + app.kubernetes.io/component: resizer-role + name: csi-hostpathplugin-resizer-role +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: Role + name: external-resizer-cfg +subjects: + - kind: ServiceAccount + name: csi-hostpathplugin-sa +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: RoleBinding +metadata: + labels: + app.kubernetes.io/instance: hostpath.csi.k8s.io + app.kubernetes.io/part-of: csi-driver-host-path + app.kubernetes.io/name: csi-hostpathplugin + app.kubernetes.io/component: snapshotter-role + name: csi-hostpathplugin-snapshotter-role +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: Role + name: external-snapshotter-leaderelection +subjects: + - kind: ServiceAccount + name: csi-hostpathplugin-sa +--- +kind: StatefulSet +apiVersion: apps/v1 +metadata: + name: csi-hostpathplugin + labels: + app.kubernetes.io/instance: hostpath.csi.k8s.io + app.kubernetes.io/part-of: csi-driver-host-path + app.kubernetes.io/name: csi-hostpathplugin + app.kubernetes.io/component: plugin +spec: + serviceName: csi-hostpathplugin + replicas: 1 + selector: + matchLabels: + app.kubernetes.io/instance: hostpath.csi.k8s.io + app.kubernetes.io/part-of: csi-driver-host-path + app.kubernetes.io/name: csi-hostpathplugin + app.kubernetes.io/component: plugin + template: + metadata: + labels: + app.kubernetes.io/instance: hostpath.csi.k8s.io + app.kubernetes.io/part-of: csi-driver-host-path + app.kubernetes.io/name: csi-hostpathplugin + app.kubernetes.io/component: plugin + annotations: + io.katacontainers.config.agent.policy: IyBDb3B5cmlnaHQgKGMpIDIwMjMgTWljcm9zb2Z0IENvcnBvcmF0aW9uCiMKIyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMAojCnBhY2thZ2UgYWdlbnRfcG9saWN5CgppbXBvcnQgZnV0dXJlLmtleXdvcmRzLmluCmltcG9ydCBmdXR1cmUua2V5d29yZHMuZXZlcnkKCiMgRGVmYXVsdCB2YWx1ZXMsIHJldHVybmVkIGJ5IE9QQSB3aGVuIHJ1bGVzIGNhbm5vdCBiZSBldmFsdWF0ZWQgdG8gdHJ1ZS4KZGVmYXVsdCBBZGRBUlBOZWlnaGJvcnNSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgQWRkU3dhcFJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBDbG9zZVN0ZGluUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IENvcHlGaWxlUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IENyZWF0ZUNvbnRhaW5lclJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBDcmVhdGVTYW5kYm94UmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IERlc3Ryb3lTYW5kYm94UmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgRXhlY1Byb2Nlc3NSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgR2V0T09NRXZlbnRSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBHdWVzdERldGFpbHNSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBMaXN0SW50ZXJmYWNlc1JlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBMaXN0Um91dGVzUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IE1lbUhvdHBsdWdCeVByb2JlUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IE9ubGluZUNQVU1lbVJlcXVlc3QgOj0gdHJ1ZQpkZWZhdWx0IFBhdXNlQ29udGFpbmVyUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFJlYWRTdHJlYW1SZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgUmVtb3ZlQ29udGFpbmVyUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgUmVtb3ZlU3RhbGVWaXJ0aW9mc1NoYXJlTW91bnRzUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgUmVzZWVkUmFuZG9tRGV2UmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFJlc3VtZUNvbnRhaW5lclJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBTZXRHdWVzdERhdGVUaW1lUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFNldFBvbGljeVJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBTaWduYWxQcm9jZXNzUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgU3RhcnRDb250YWluZXJSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBTdGFydFRyYWNpbmdSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgU3RhdHNDb250YWluZXJSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBTdG9wVHJhY2luZ1JlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBUdHlXaW5SZXNpemVSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBVcGRhdGVDb250YWluZXJSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgVXBkYXRlRXBoZW1lcmFsTW91bnRzUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFVwZGF0ZUludGVyZmFjZVJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBVcGRhdGVSb3V0ZXNSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgV2FpdFByb2Nlc3NSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBXcml0ZVN0cmVhbVJlcXVlc3QgOj0gZmFsc2UKCiMgQWxsb3dSZXF1ZXN0c0ZhaWxpbmdQb2xpY3kgOj0gdHJ1ZSBjb25maWd1cmVzIHRoZSBBZ2VudCB0byAqYWxsb3cgYW55CiMgcmVxdWVzdHMgY2F1c2luZyBhIHBvbGljeSBmYWlsdXJlKi4gVGhpcyBpcyBhbiB1bnNlY3VyZSBjb25maWd1cmF0aW9uCiMgYnV0IGlzIHVzZWZ1bCBmb3IgYWxsb3dpbmcgdW5zZWN1cmUgcG9kcyB0byBzdGFydCwgdGhlbiBjb25uZWN0IHRvCiMgdGhlbSBhbmQgaW5zcGVjdCBPUEEgbG9ncyBmb3IgdGhlIHJvb3QgY2F1c2Ugb2YgYSBmYWlsdXJlLgpkZWZhdWx0IEFsbG93UmVxdWVzdHNGYWlsaW5nUG9saWN5IDo9IGZhbHNlCgojIENvbnN0YW50cwpTX05BTUVfS0VZID0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZSIKU19OQU1FU1BBQ0VfS0VZID0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZXNwYWNlIgpCVU5ETEVfSUQgPSAiW2EtejAtOV17NjR9IgoKQ3JlYXRlQ29udGFpbmVyUmVxdWVzdDo9IHJlc3AgewogICAgbm90IGlzX251bGwoaW5wdXQuZW52X21hcCkKICAgIAogICAgaV9lbnZfbWFwIDo9IGlucHV0LmVudl9tYXAKICAgIAogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBwX2Vudl9tYXAgOj0gcF9jb250YWluZXIuZW52X21hcCAgCiAgICBhbGxvd19lbnZfbWFwKHBfZW52X21hcCwgaV9lbnZfbWFwKQogICAgCiAgICBpX3Byb2Nlc3MgOj0gaW5wdXQuYmFzZS5PQ0kuUHJvY2VzcwogICAgCiAgICBwX3Byb2Nlc3MgOj0gcF9jb250YWluZXIuT0NJLlByb2Nlc3MKICAgIAogICAgYWxsb3dfYXJncyhpX3Byb2Nlc3MsIHBfcHJvY2VzcywgaV9lbnZfbWFwKQoKICAgIHJlc3AgPSBDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uKGlucHV0LmJhc2UpCiAgICBwcmludCgiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdDogdHJ1ZSIpCn0KCmFsbG93X2FyZ3MoaV9wcm9jZXNzLCBwX3Byb2Nlc3MsIGlfZW52X21hcCkgewogICAgaV9hcmdzIDo9IGlfcHJvY2Vzcy5BcmdzCiAgICBwX2FyZ3MgOj0gcF9wcm9jZXNzLkFyZ3MKICAgIHByaW50KCJhbGxvd19hcmdzOiBpX2FyZ3MgPSIsIGlfYXJncywgInBfYXJncyA9IiwgcF9hcmdzKQogICAgY291bnQoaV9hcmdzKSA9PSBjb3VudChwX2FyZ3MpCiAgICBldmVyeSBpLCBpX2FyZyBpbiBpX2FyZ3MgewogICAgICAgIHByaW50KCJhbGxvd19hcmdzOiBpX2FyZyA9IiwgaV9hcmcpCiAgICAgICAgcF9hcmdfcmVwbGFjZWQgOj0gcmVwbGFjZV9lbnZfdmFyaWFibGVzKHBfYXJnc1tpXSwgaV9lbnZfbWFwKQogICAgICAgIHByaW50KCJhbGxvd19hcmdzOiBwX2FyZ19yZXBsYWNlZCA9IiwgcF9hcmdfcmVwbGFjZWQpCiAgICAgICAgcF9hcmdfcmVwbGFjZWQyIDo9IHJlcGxhY2UocF9hcmdfcmVwbGFjZWQsICIkJCIsICIkIikKICAgICAgICBwcmludCgiYWxsb3dfYXJnczogcF9hcmdfcmVwbGFjZWQyID0iLCBwX2FyZ19yZXBsYWNlZDIpCiAgICAgICAgaV9hcmcgPT0gcF9hcmdfcmVwbGFjZWQyCiAgICB9CiAgICBwcmludCgiYWxsb3dfYXJnczogdHJ1ZSIpCn0KCmFsbG93X2FyZ3MoaV9wcm9jZXNzLCBwX3Byb2Nlc3MsIGlfZW52X21hcCkgewogICAgbm90IGlfcHJvY2Vzcy5BcmdzCiAgICBub3QgcF9wcm9jZXNzLkFyZ3MKICAgIHByaW50KCJhbGxvd19hcmdzMjogbm8gYXJncyIpCn0KCiMgdGhpcyBmdW5jdGlvbiByZXBsYWNlcyBhbGwgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyBpbiBhIHN0cmluZywgZ2l2ZW4gYSBtYXAgb2YgZW52aXJvbm1lbnQga2V5cyB0byBlbnZpcm9ubWVudCB2YWx1ZXMKIyBlZyBzdHIgPSAiZWNobyAkKENMVVNURVJfSUQpOyBlY2hvICQoTk9ERV9OQU1FKTsiCiMgZW52X21hcCA9IHsiQ0xVU1RFUl9JRCI6ICJhYmMiLCAiTk9ERV9OQU1FIiA6ICJ4eXoifQojIHJlc3VsdCA9ICJlY2hvIGFiYzsgZWNobyB4eXo7IgpyZXBsYWNlX2Vudl92YXJpYWJsZXMoc3RyLCBlbnZfbWFwKSA9IHJlc3VsdCB7CiAgICAjIG1ha2UgYW4gYXJyYXkgb2YgdGhlIGtleXMgZWcgWyJDTFVTVEVSX0lEIiwgIk5PREVfTkFNRSJdCiAgICBrZXlzIDo9IFt4IHwgc29tZSB4IGluIG9iamVjdC5rZXlzKGVudl9tYXApXQogICAgcmVzdWx0IDo9IHJlcGxhY2Vfc3RyX3JlYyhzdHIsIGVudl9tYXAsIGtleXMsIGNvdW50KGtleXMpIC0gMSkKfQoKIyBiYXNlIGNhc2UKcmVwbGFjZV9zdHJfcmVjKHN0ciwgZW52X21hcCwgYXJyX2tleXMsIGkpID0gcmVzdWx0IHsKICAgIGkgPCAwCiAgICByZXN1bHQgOj0gc3RyCn0KCiMgcmVjdXJzaXZlIHN0ZXAKcmVwbGFjZV9zdHJfcmVjKHN0ciwgZW52X21hcCwgYXJyX2tleXMsIGkpID0gcmVzdWx0IHsKICAgIGkgPj0gMAogICAga2V5IDo9IGFycl9rZXlzW2ldCiAgICBlbnZfa2V5MSA6PSBjb25jYXQoIiIsIFsiJCgiLCBrZXksICIpIl0pCiAgICAjIHJlcGxhY2UgJChWQVIpIHdpdGggdmFsdWUKICAgIG5ld19zdHIxIDo9IHJlcGxhY2Uoc3RyLCBlbnZfa2V5MSwgZW52X21hcFtrZXldKQogICAgIyByZXBsYWNlIG5leHQgZW52aXJvbm1lbnQgdmFyaWFibGUKICAgIHJlc3VsdCA9IHJlcGxhY2Vfc3RyX3JlYyhuZXdfc3RyMSwgZW52X21hcCwgYXJyX2tleXMsIGkgLSAxKQp9CgphbGxvd19lbnZfbWFwKHBfZW52X21hcCwgaV9lbnZfbWFwKSB7CiAgICBwcmludCgiYWxsb3dfZW52X21hcDogcF9lbnZfbWFwID0iLCBwX2Vudl9tYXApCiAgICBldmVyeSBlbnZfa2V5LCBlbnZfdmFsIGluIGlfZW52X21hcCB7CiAgICAgICAgcHJpbnQoImFsbG93X2VudjogZW52X2tleSA9IiwgZW52X2tleSwgImVudl92YWwgPSIsIGVudl92YWwpCiAgICAgICAgYWxsb3dfZW52X21hcF9lbnRyeShlbnZfa2V5LCBlbnZfdmFsLCBwX2Vudl9tYXApCiAgICB9CiAgICBwcmludCgiYWxsb3dfZW52X21hcDogdHJ1ZSIpCn0KCiMgQWxsb3cgZXhhY3QgbWF0Y2gKYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBpX3ZhbCA9PSBwX3ZhbAogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnk6IHRydWUiKQp9CgojIEFsbG93IHJlc291cmNlRmllbGRSZWYgdmFsdWVzIChlLmcuLCAibGltaXRzLmNwdSIpLgphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgICMgYSB2YXJpYWJsZSB3ZSBzaG91bGQgYmUgdmFsaWRhdGluZyB1c2luZyBhIHJlZ2V4IGZyb20gc2V0dGluZ3MKICAgIHBfdmFsID09ICIkKHZhbGlkYXRlLWZyb20tc2V0dGluZ3MpIgogICAgcmVnZXhfdmFsIDo9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuQ3JlYXRlQ29udGFpbmVyUmVxdWVzdC5hbGxvd19lbnZfcmVnZXhfbWFwW2tleV0KICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4X3ZhbCwgaV92YWwpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSAyOiB0cnVlIikKfQoKIyBBbGxvdyBub2RlLW5hbWUKYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChub2RlLW5hbWUpIgogICAgcmVnZXgubWF0Y2gocG9saWN5X2RhdGEuY29tbW9uLmRuc19zdWJkb21haW4gLCBpX3ZhbCkKICAgIHByaW50KCJhbGxvd19lbnZfbWFwX2VudHJ5IDM6IHRydWUiKQp9CgojIEFsbG93IGhvc3QtbmFtZQphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgIHBfdmFsID09ICIkKGhvc3QtbmFtZSkiCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24uZG5zX2xhYmVsICwgaV92YWwpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSA0OiB0cnVlIikKfQoKIyBBbGxvdyBwb2QtdWlkCmFsbG93X2Vudl9tYXBfZW50cnkoa2V5LCBpX3ZhbCwgcF9lbnZfbWFwKSB7CiAgICBwX3ZhbCA6PSBwX2Vudl9tYXBba2V5XQogICAgcF92YWwgPT0gIiQocG9kLXVpZCkiCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24ucG9kX3VpZCAsIGlfdmFsKQogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgNTogdHJ1ZSIpCn0KCiMgQWxsb3cgZmllbGRSZWYgImZpZWxkUGF0aDogc3RhdHVzLnBvZElQIiB2YWx1ZXMuCmFsbG93X2Vudl9tYXBfZW50cnkoa2V5LCBpX3ZhbCwgcF9lbnZfbWFwKSB7CiAgICBpc19pcChpX3ZhbCkKCiAgICBwX3ZhbCA6PSBwX2Vudl9tYXBba2V5XQogICAgcF92YXIgOj0gY29uY2F0KCI9IiwgW2tleSwgcF92YWxdKQogICAgYWxsb3dfcG9kX2lwX3ZhcihrZXksIHBfdmFyKQogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgNjogdHJ1ZSIpCn0KCiMgQWxsb3cgZmllbGRSZWYgImZpZWxkUGF0aDogc3RhdHVzLmhvc3RJUCIgdmFsdWVzLgphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgaXNfaXAoaV92YWwpCgogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgIHBfdmFyIDo9IGNvbmNhdCgiPSIsIFtrZXksIHBfdmFsXSkKICAgIGFsbG93X2hvc3RfaXBfdmFyKGtleSwgcF92YXIpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSA3OiB0cnVlIikKfQoKIyBNYXRjaCBpbnB1dCB3aXRoIG9uZSBvZiB0aGUgcG9saWN5IHZhcmlhYmxlcywgYWZ0ZXIgc3Vic3RpdHV0aW5nICQoc2FuZGJveC1uYW1lKS4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChzYW5kYm94LW5hbWUpIgogICAgc19uYW1lIDo9IGlucHV0LmJhc2UuT0NJLkFubm90YXRpb25zW1NfTkFNRV9LRVldCiAgICBwX3ZhcjIgOj0gcmVwbGFjZShwX3ZhbCwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHBfdmFyMiA9PSBpX3ZhbAogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgODogdHJ1ZSIpCn0KCiMgTWF0Y2ggaW5wdXQgd2l0aCBvbmUgb2YgdGhlIHBvbGljeSB2YXJpYWJsZXMsIGFmdGVyIHN1YnN0aXR1dGluZyAkKHNhbmRib3gtbmFtZXNwYWNlKS4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChzYW5kYm94LW5hbWVzcGFjZSkiCiAgICBzX25hbWVzcGFjZSA6PSBpbnB1dC5iYXNlLk9DSS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwX3ZhcjIgOj0gcmVwbGFjZShwX3ZhbCwgIiQoc2FuZGJveC1uYW1lc3BhY2UpIiwgc19uYW1lc3BhY2UpCiAgICBwX3ZhcjIgPT0gaV92YWwKICAgIHByaW50KCJhbGxvd19lbnZfbWFwX2VudHJ5IDk6IHRydWUiKQp9CgojIEFsbG93IGlucHV0IGVudiB2YXJpYWJsZXMgdGhhdCBtYXRjaCB3aXRoIGEgcmVxdWVzdF9kZWZhdWx0cyByZWdleC4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHNvbWUgcF9yZWdleDEgaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5DcmVhdGVDb250YWluZXJSZXF1ZXN0LmFsbG93X2Vudl9yZWdleAogICAgcF9yZWdleDIgOj0gcmVwbGFjZShwX3JlZ2V4MSwgIiQoaXB2NF9hKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcHY0X2EpCiAgICBwX3JlZ2V4MyA6PSByZXBsYWNlKHBfcmVnZXgyLCAiJChpcF9wKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcF9wKQogICAgcF9yZWdleDQgOj0gcmVwbGFjZShwX3JlZ2V4MywgIiQoc3ZjX25hbWUpIiwgcG9saWN5X2RhdGEuY29tbW9uLnN2Y19uYW1lKQogICAgcF9yZWdleDUgOj0gcmVwbGFjZShwX3JlZ2V4NCwgIiQoZG5zX2xhYmVsKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5kbnNfbGFiZWwpCgogICAgcmVzdWx0IDo9IGNvbmNhdCgiPSIsIFtrZXksIGlfdmFsXSkKICAgIHJlZ2V4Lm1hdGNoKHBfcmVnZXg1LCByZXN1bHQpCgogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgMTA6IHRydWUiKQp9CgpDcmVhdGVDb250YWluZXJSZXF1ZXN0Oj0gcmVzcCB7CiAgICBub3QgaW5wdXQuZW52X21hcAogICAgaV9wcm9jZXNzID0gaW5wdXQuT0NJLlByb2Nlc3MKICAgIHNfbmFtZSA9IGlucHV0Lk9DSS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBwX3Byb2Nlc3MgPSBwX2NvbnRhaW5lci5PQ0kuUHJvY2VzcwogICAgYWxsb3dfZGVwcmVjYXRlZF9hcmdzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUpCiAgICByZXNwID0gQ3JlYXRlQ29udGFpbmVyUmVxdWVzdENvbW1vbihpbnB1dCkKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0MjogdHJ1ZSIpCn0KCkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb24ocmVxKTo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgICMgQ2hlY2sgaWYgdGhlIGlucHV0IHJlcXVlc3Qgc2hvdWxkIGJlIHJlamVjdGVkIGV2ZW4gYmVmb3JlIGNoZWNraW5nIHRoZQogICAgIyBwb2xpY3lfZGF0YS5jb250YWluZXJzIGluZm9ybWF0aW9uLgogICAgYWxsb3dfY3JlYXRlX2NvbnRhaW5lcl9pbnB1dChyZXEpCgogICAgaV9vY2kgOj0gcmVxLk9DSQogICAgaV9zdG9yYWdlcyA6PSByZXEuc3RvcmFnZXMKICAgIGlfZGV2aWNlcyA6PSByZXEuZGV2aWNlcwoKICAgICMgYXJyYXkgb2YgcG9zc2libGUgc3RhdGUgb3BlcmF0aW9ucwogICAgb3BzX2J1aWxkZXIgOj0gW10KCiAgICAjIGNoZWNrIHNhbmRib3ggbmFtZQogICAgc2FuZGJveF9uYW1lID0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FX0tFWV0KICAgIGFkZF9zYW5kYm94X25hbWVfdG9fc3RhdGUgOj0gc3RhdGVfYWxsb3dzKCJzYW5kYm94X25hbWUiLCBzYW5kYm94X25hbWUpCiAgICBvcHNfYnVpbGRlcjEgOj0gY29uY2F0X29wX2lmX25vdF9udWxsKG9wc19idWlsZGVyLCBhZGRfc2FuZGJveF9uYW1lX3RvX3N0YXRlKQoKICAgICMgQ2hlY2sgaWYgYW55IGVsZW1lbnQgZnJvbSB0aGUgcG9saWN5X2RhdGEuY29udGFpbmVycyBhcnJheSBhbGxvd3MgdGhlIGlucHV0IHJlcXVlc3QuCiAgICBzb21lIHBfY29udGFpbmVyIGluIHBvbGljeV9kYXRhLmNvbnRhaW5lcnMKICAgIHByaW50KCI9PT09PT09PSBDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiB0cnlpbmcgbmV4dCBwb2xpY3kgY29udGFpbmVyIikKCiAgICBwX3BpZG5zIDo9IHBfY29udGFpbmVyLnNhbmRib3hfcGlkbnMKICAgIGlfcGlkbnMgOj0gcmVxLnNhbmRib3hfcGlkbnMKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiBwX3BpZG5zID0iLCBwX3BpZG5zLCAiaV9waWRucyA9IiwgaV9waWRucykKICAgIHBfcGlkbnMgPT0gaV9waWRucwoKICAgIHBfb2NpIDo9IHBfY29udGFpbmVyLk9DSQoKICAgICMgY2hlY2sgbmFtZXNwYWNlCiAgICBwX25hbWVzcGFjZSA6PSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBpX25hbWVzcGFjZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwcmludCAoIkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb246IHBfbmFtZXNwYWNlID0iLCBwX25hbWVzcGFjZSwgImlfbmFtZXNwYWNlID0iLCBpX25hbWVzcGFjZSkKICAgIGFkZF9uYW1lc3BhY2VfdG9fc3RhdGUgOj0gYWxsb3dfbmFtZXNwYWNlKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkKICAgIG9wc19idWlsZGVyMiA6PSBjb25jYXRfb3BfaWZfbm90X251bGwob3BzX2J1aWxkZXIxLCBhZGRfbmFtZXNwYWNlX3RvX3N0YXRlKQoKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiBwIFZlcnNpb24gPSIsIHBfb2NpLlZlcnNpb24sICJpIFZlcnNpb24gPSIsIGlfb2NpLlZlcnNpb24pCiAgICBwX29jaS5WZXJzaW9uID09IGlfb2NpLlZlcnNpb24KCiAgICBwcmludCgiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdENvbW1vbjogcCBSZWFkb25seSA9IiwgcF9vY2kuUm9vdC5SZWFkb25seSwgImkgUmVhZG9ubHkgPSIsIGlfb2NpLlJvb3QuUmVhZG9ubHkpCiAgICBwX29jaS5Sb290LlJlYWRvbmx5ID09IGlfb2NpLlJvb3QuUmVhZG9ubHkKCiAgICBhbGxvd19hbm5vKHBfb2NpLCBpX29jaSkKCiAgICBwX3N0b3JhZ2VzIDo9IHBfY29udGFpbmVyLnN0b3JhZ2VzCiAgICBhbGxvd19ieV9hbm5vKHBfb2NpLCBpX29jaSwgcF9zdG9yYWdlcywgaV9zdG9yYWdlcykKCiAgICBwX2RldmljZXMgOj0gcF9jb250YWluZXIuZGV2aWNlcwogICAgYWxsb3dfZGV2aWNlcyhwX2RldmljZXMsIGlfZGV2aWNlcykKCiAgICByZXQgOj0gYWxsb3dfbGludXgob3BzX2J1aWxkZXIyLCBwX29jaSwgaV9vY2kpCiAgICByZXQuYWxsb3dlZAoKICAgIG9wcyA6PSByZXQub3BzCgogICAgcHJpbnQoIkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb246IHRydWUiKQp9CgphbGxvd19jcmVhdGVfY29udGFpbmVyX2lucHV0KHJlcSkgewogICAgcHJpbnQoImFsbG93X2NyZWF0ZV9jb250YWluZXJfaW5wdXQ6IGlucHV0ID0iLCByZXEpCgogICAgY291bnQocmVxLnNoYXJlZF9tb3VudHMpID09IDAKICAgIGlzX251bGwocmVxLnN0cmluZ191c2VyKQoKICAgIGlfb2NpIDo9IHJlcS5PQ0kKICAgIGlzX251bGwoaV9vY2kuSG9va3MpCiAgICBpc19udWxsKGlfb2NpLlNvbGFyaXMpCiAgICBpc19udWxsKGlfb2NpLldpbmRvd3MpCgogICAgaV9saW51eCA6PSBpX29jaS5MaW51eAogICAgY291bnQoaV9saW51eC5HSURNYXBwaW5ncykgPT0gMAogICAgY291bnQoaV9saW51eC5Nb3VudExhYmVsKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlJlc291cmNlcy5EZXZpY2VzKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlJvb3Rmc1Byb3BhZ2F0aW9uKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlVJRE1hcHBpbmdzKSA9PSAwCiAgICBpc19udWxsKGlfbGludXguSW50ZWxSZHQpCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLkJsb2NrSU8pCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLk5ldHdvcmspCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLlBpZHMpCiAgICBpc19udWxsKGlfbGludXguU2VjY29tcCkKCiAgICBpX3Byb2Nlc3MgOj0gaV9vY2kuUHJvY2VzcwogICAgY291bnQoaV9wcm9jZXNzLlNlbGludXhMYWJlbCkgPT0gMAogICAgY291bnQoaV9wcm9jZXNzLlVzZXIuVXNlcm5hbWUpID09IDAKCiAgICBwcmludCgiYWxsb3dfY3JlYXRlX2NvbnRhaW5lcl9pbnB1dDogdHJ1ZSIpCn0KCmFsbG93X25hbWVzcGFjZShwX25hbWVzcGFjZSwgaV9uYW1lc3BhY2UpID0gYWRkX25hbWVzcGFjZSB7CiAgICBwX25hbWVzcGFjZSA9PSBpX25hbWVzcGFjZQogICAgYWRkX25hbWVzcGFjZSA6PSBudWxsCiAgICBwcmludCgiYWxsb3dfbmFtZXNwYWNlIDE6IGlucHV0IG5hbWVzcGFjZSBtYXRjaGVzIHBvbGljeSBkYXRhIikKfQoKYWxsb3dfbmFtZXNwYWNlKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkgPSBhZGRfbmFtZXNwYWNlIHsKICAgIHBfbmFtZXNwYWNlID09ICIiCiAgICBwcmludCgiYWxsb3dfbmFtZXNwYWNlIDI6IG5vIG5hbWVzcGFjZSBmb3VuZCBvbiBwb2xpY3kgZGF0YSIpCiAgICBhZGRfbmFtZXNwYWNlIDo9IHN0YXRlX2FsbG93cygibmFtZXNwYWNlIiwgaV9uYW1lc3BhY2UpCn0KCiMgdmFsdWUgaGFzbid0IGJlZW4gc2VlbiBiZWZvcmUsIHNhdmUgaXQgdG8gc3RhdGUKc3RhdGVfYWxsb3dzKGtleSwgdmFsdWUpID0gYWN0aW9uIHsKICBzdGF0ZSA6PSBnZXRfc3RhdGUoKQogIHByaW50KCJzdGF0ZV9hbGxvd3MgMTogc3RhdGVba2V5XSA9Iiwgc3RhdGVba2V5XSwgInZhbHVlID0iLCB2YWx1ZSkKICBub3Qgc3RhdGVba2V5XQogIHByaW50KCJzdGF0ZV9hbGxvd3MgMTogc2F2aW5nIHRvIHN0YXRlIGtleSA9Iiwga2V5LCAidmFsdWUgPSIsIHZhbHVlKQogIHBhdGggOj0gZ2V0X3N0YXRlX3BhdGgoa2V5KSAKICBhY3Rpb24gOj0gewogICAgIm9wIjogImFkZCIsCiAgICAicGF0aCI6IHBhdGgsIAogICAgInZhbHVlIjogdmFsdWUsCiAgfQp9CgojIHZhbHVlIG1hdGNoZXMgd2hhdCdzIGluIHN0YXRlLCBhbGxvdyBpdApzdGF0ZV9hbGxvd3Moa2V5LCB2YWx1ZSkgPSBhY3Rpb24gewogIHByaW50KCJzdGF0ZV9hbGxvd3MgMjogc3RhcnQiKQogIHN0YXRlIDo9IGdldF9zdGF0ZSgpCiAgcHJpbnQoInN0YXRlX2FsbG93cyAyOiBzdGF0ZVtrZXldID0iLCBzdGF0ZVtrZXldLCAidmFsdWUgPSIsIHZhbHVlKQogIHZhbHVlID09IHN0YXRlW2tleV0KICBwcmludCgic3RhdGVfYWxsb3dzIDI6IGZvdW5kIGtleSA9Iiwga2V5LCAidmFsdWUgPSIsIHZhbHVlLCAiIGluIHN0YXRlIikKICBhY3Rpb24gOj0gbnVsbAp9CgojIGhlbHBlciBmdW5jdGlvbnMgdG8gaW50ZXJhY3Qgd2l0aCB0aGUgc3RhdGUKZ2V0X3N0YXRlKCkgPSBzdGF0ZSB7CiAgc3RhdGUgOj0gZGF0YVsicHN0YXRlIl0KfQoKZ2V0X3N0YXRlX3ZhbChrZXkpID0gdmFsdWUgewogICAgc3RhdGUgOj0gZ2V0X3N0YXRlKCkKICAgIHZhbHVlIDo9IHN0YXRlW2tleV0KfQoKZ2V0X3N0YXRlX3BhdGgoa2V5KSA9IHBhdGggewogICAgIyBwcmVwZW5kICIvcHN0YXRlLyIgdG8ga2V5CiAgICBwYXRoIDo9IGNvbmNhdCgiLyIsIFsiL3BzdGF0ZSIsIGtleV0pCn0KCiMgSGVscGVyIGZ1bmN0aW9ucyB0byBjb25kaXRpb25hbGx5IGNvbmNhdGVuYXRlIG9wIGlzIG5vdCBudWxsCmNvbmNhdF9vcF9pZl9ub3RfbnVsbChvcHMsIG9wKSA9IHJlc3VsdCB7CiAgICBvcCA9PSBudWxsCiAgICByZXN1bHQgOj0gb3BzCn0KCmNvbmNhdF9vcF9pZl9ub3RfbnVsbChvcHMsIG9wKSA9IHJlc3VsdCB7CiAgICBvcCAhPSBudWxsCiAgICByZXN1bHQgOj0gYXJyYXkuY29uY2F0KG9wcywgW29wXSkKfQoKIyBSZWplY3QgdW5leHBlY3RlZCBhbm5vdGF0aW9ucy4KYWxsb3dfYW5ubyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19hbm5vIDE6IHN0YXJ0IikKCiAgICBub3QgaV9vY2kuQW5ub3RhdGlvbnMKCiAgICBwcmludCgiYWxsb3dfYW5ubyAxOiB0cnVlIikKfQphbGxvd19hbm5vKHBfb2NpLCBpX29jaSkgewogICAgcHJpbnQoImFsbG93X2Fubm8gMjogcCBBbm5vdGF0aW9ucyA9IiwgcF9vY2kuQW5ub3RhdGlvbnMpCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiBpIEFubm90YXRpb25zID0iLCBpX29jaS5Bbm5vdGF0aW9ucykKCiAgICBpX2tleXMgOj0gb2JqZWN0LmtleXMoaV9vY2kuQW5ub3RhdGlvbnMpCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiBpIGtleXMgPSIsIGlfa2V5cykKCiAgICBldmVyeSBpX2tleSBpbiBpX2tleXMgewogICAgICAgIGFsbG93X2Fubm9fa2V5KGlfa2V5LCBwX29jaSkKICAgIH0KCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiB0cnVlIikKfQoKYWxsb3dfYW5ub19rZXkoaV9rZXksIHBfb2NpKSB7CiAgICBwcmludCgiYWxsb3dfYW5ub19rZXkgMTogaSBrZXkgPSIsIGlfa2V5KQoKICAgIHN0YXJ0c3dpdGgoaV9rZXksICJpby5rdWJlcm5ldGVzLmNyaS4iKQoKICAgIHByaW50KCJhbGxvd19hbm5vX2tleSAxOiB0cnVlIikKfQphbGxvd19hbm5vX2tleShpX2tleSwgcF9vY2kpIHsKICAgIHByaW50KCJhbGxvd19hbm5vX2tleSAyOiBpIGtleSA9IiwgaV9rZXkpCgogICAgc29tZSBwX2tleSwgXyBpbiBwX29jaS5Bbm5vdGF0aW9ucwogICAgcF9rZXkgPT0gaV9rZXkKCiAgICBwcmludCgiYWxsb3dfYW5ub19rZXkgMjogdHJ1ZSIpCn0KCiMgR2V0IHRoZSB2YWx1ZSBvZiB0aGUgU19OQU1FX0tFWSBhbm5vdGF0aW9uIGFuZAojIGNvcnJlbGF0ZSBpdCB3aXRoIG90aGVyIGFubm90YXRpb25zIGFuZCBwcm9jZXNzIGZpZWxkcy4KYWxsb3dfYnlfYW5ubyhwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpIHsKICAgIHByaW50KCJhbGxvd19ieV9hbm5vIDE6IHN0YXJ0IikKCiAgICBub3QgcF9vY2kuQW5ub3RhdGlvbnNbU19OQU1FX0tFWV0KCiAgICBpX3NfbmFtZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMTogaV9zX25hbWUgPSIsIGlfc19uYW1lKQoKICAgIGlfc19uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FU1BBQ0VfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMTogaV9zX25hbWVzcGFjZSA9IiwgaV9zX25hbWVzcGFjZSkKCiAgICBhbGxvd19ieV9zYW5kYm94X25hbWUocF9vY2ksIGlfb2NpLCBwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBpX3NfbmFtZSwgaV9zX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfYnlfYW5ubyAxOiB0cnVlIikKfQphbGxvd19ieV9hbm5vKHBfb2NpLCBpX29jaSwgcF9zdG9yYWdlcywgaV9zdG9yYWdlcykgewogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMjogc3RhcnQiKQoKICAgIHBfc19uYW1lIDo9IHBfb2NpLkFubm90YXRpb25zW1NfTkFNRV9LRVldCiAgICBpX3NfbmFtZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMjogaV9zX25hbWUgPSIsIGlfc19uYW1lLCAicF9zX25hbWUgPSIsIHBfc19uYW1lKQoKICAgIGFsbG93X3NhbmRib3hfbmFtZShwX3NfbmFtZSwgaV9zX25hbWUpCgogICAgaV9zX25hbWVzcGFjZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwcmludCgiYWxsb3dfYnlfYW5ubyAyOiBpX3NfbmFtZXNwYWNlID0iLCBpX3NfbmFtZXNwYWNlKQoKICAgIGFsbG93X2J5X3NhbmRib3hfbmFtZShwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMsIGlfc19uYW1lLCBpX3NfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd19ieV9hbm5vIDI6IHRydWUiKQp9CgphbGxvd19ieV9zYW5kYm94X25hbWUocF9vY2ksIGlfb2NpLCBwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfYnlfc2FuZGJveF9uYW1lOiBzdGFydCIpCgogICAgaV9uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FU1BBQ0VfS0VZXQoKICAgIGFsbG93X2J5X2NvbnRhaW5lcl90eXBlcyhwX29jaSwgaV9vY2ksIHNfbmFtZSwgaV9uYW1lc3BhY2UpCiAgICBhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZChwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpCiAgICBhbGxvd19wcm9jZXNzKHBfb2NpLlByb2Nlc3MsIGlfb2NpLlByb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpCgogICAgcHJpbnQoImFsbG93X2J5X3NhbmRib3hfbmFtZTogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfbmFtZShwX3NfbmFtZSwgaV9zX25hbWUpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X25hbWU6IHN0YXJ0IikKICAgIHJlZ2V4Lm1hdGNoKHBfc19uYW1lLCBpX3NfbmFtZSkKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9uYW1lOiB0cnVlIikKfQoKIyBDaGVjayB0aGF0IHRoZSAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLXR5cGUiIGFuZAojICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIiBhbm5vdGF0aW9ucyBkZXNpZ25hdGUgdGhlCiMgZXhwZWN0ZWQgdHlwZSAtIGVpdGhlciBhICJzYW5kYm94IiBvciBhICJjb250YWluZXIiLiBUaGVuLCB2YWxpZGF0ZQojIG90aGVyIGFubm90YXRpb25zIGJhc2VkIG9uIHRoZSBhY3R1YWwgInNhbmRib3giIG9yICJjb250YWluZXIiIHZhbHVlCiMgZnJvbSB0aGUgaW5wdXQgY29udGFpbmVyLgphbGxvd19ieV9jb250YWluZXJfdHlwZXMocF9vY2ksIGlfb2NpLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfYnlfY29udGFpbmVyX3R5cGVzOiBjaGVja2luZyBpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSIpCgogICAgY190eXBlIDo9ICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSIKICAgIAogICAgcF9jcmlfdHlwZSA6PSBwX29jaS5Bbm5vdGF0aW9uc1tjX3R5cGVdCiAgICBpX2NyaV90eXBlIDo9IGlfb2NpLkFubm90YXRpb25zW2NfdHlwZV0KICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZXM6IHBfY3JpX3R5cGUgPSIsIHBfY3JpX3R5cGUsICJpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgcF9jcmlfdHlwZSA9PSBpX2NyaV90eXBlCgogICAgYWxsb3dfYnlfY29udGFpbmVyX3R5cGUoaV9jcmlfdHlwZSwgcF9vY2ksIGlfb2NpLCBzX25hbWUsIHNfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZXM6IHRydWUiKQp9CgphbGxvd19ieV9jb250YWluZXJfdHlwZShpX2NyaV90eXBlLCBwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAxOiBpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgaV9jcmlfdHlwZSA9PSAic2FuZGJveCIKCiAgICBpX2thdGFfdHlwZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1siaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5jb250YWluZXJfdHlwZSJdCiAgICBwcmludCgiYWxsb3dfYnlfY29udGFpbmVyX3R5cGUgMTogaV9rYXRhX3R5cGUgPSIsIGlfa2F0YV90eXBlKQogICAgaV9rYXRhX3R5cGUgPT0gInBvZF9zYW5kYm94IgoKICAgIGFsbG93X3NhbmRib3hfY29udGFpbmVyX25hbWUocF9vY2ksIGlfb2NpKQogICAgYWxsb3dfc2FuZGJveF9uZXRfbmFtZXNwYWNlKHBfb2NpLCBpX29jaSkKICAgIGFsbG93X3NhbmRib3hfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpCgogICAgcHJpbnQoImFsbG93X2J5X2NvbnRhaW5lcl90eXBlIDE6IHRydWUiKQp9CgphbGxvd19ieV9jb250YWluZXJfdHlwZShpX2NyaV90eXBlLCBwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiBpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgaV9jcmlfdHlwZSA9PSAiY29udGFpbmVyIgoKICAgIGlfa2F0YV90eXBlIDo9IGlfb2NpLkFubm90YXRpb25zWyJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIl0KICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiBpX2thdGFfdHlwZSA9IiwgaV9rYXRhX3R5cGUpCiAgICBpX2thdGFfdHlwZSA9PSAicG9kX2NvbnRhaW5lciIKCiAgICBhbGxvd19jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpCiAgICBhbGxvd19uZXRfbmFtZXNwYWNlKHBfb2NpLCBpX29jaSkKICAgIGFsbG93X2xvZ19kaXJlY3RvcnkocF9vY2ksIGlfb2NpKQoKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiB0cnVlIikKfQoKIyAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLW5hbWUiIGFubm90YXRpb24KYWxsb3dfc2FuZGJveF9jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X2NvbnRhaW5lcl9uYW1lOiBzdGFydCIpCgogICAgY29udGFpbmVyX2Fubm90YXRpb25fbWlzc2luZyhwX29jaSwgaV9vY2ksICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItbmFtZSIpCgogICAgcHJpbnQoImFsbG93X3NhbmRib3hfY29udGFpbmVyX25hbWU6IHRydWUiKQp9CgphbGxvd19jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19jb250YWluZXJfbmFtZTogc3RhcnQiKQoKICAgIGFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uKHBfb2NpLCBpX29jaSwgImlvLmt1YmVybmV0ZXMuY3JpLmNvbnRhaW5lci1uYW1lIikKCiAgICBwcmludCgiYWxsb3dfY29udGFpbmVyX25hbWU6IHRydWUiKQp9Cgpjb250YWluZXJfYW5ub3RhdGlvbl9taXNzaW5nKHBfb2NpLCBpX29jaSwga2V5KSB7CiAgICBwcmludCgiY29udGFpbmVyX2Fubm90YXRpb25fbWlzc2luZzoiLCBrZXkpCgogICAgbm90IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIG5vdCBpX29jaS5Bbm5vdGF0aW9uc1trZXldCgogICAgcHJpbnQoImNvbnRhaW5lcl9hbm5vdGF0aW9uX21pc3Npbmc6IHRydWUiKQp9CgphbGxvd19jb250YWluZXJfYW5ub3RhdGlvbihwX29jaSwgaV9vY2ksIGtleSkgewogICAgcHJpbnQoImFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uOiBrZXkgPSIsIGtleSkKCiAgICBwX3ZhbHVlIDo9IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIGlfdmFsdWUgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgcHJpbnQoImFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uOiBwX3ZhbHVlID0iLCBwX3ZhbHVlLCAiaV92YWx1ZSA9IiwgaV92YWx1ZSkKCiAgICBwX3ZhbHVlID09IGlfdmFsdWUKCiAgICBwcmludCgiYWxsb3dfY29udGFpbmVyX2Fubm90YXRpb246IHRydWUiKQp9CgojICJuZXJkY3RsL25ldHdvcmstbmFtZXNwYWNlIiBhbm5vdGF0aW9uCmFsbG93X3NhbmRib3hfbmV0X25hbWVzcGFjZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X25ldF9uYW1lc3BhY2U6IHN0YXJ0IikKCiAgICBrZXkgOj0gIm5lcmRjdGwvbmV0d29yay1uYW1lc3BhY2UiCgogICAgcF9uYW1lc3BhY2UgOj0gcF9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgaV9uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgcHJpbnQoImFsbG93X3NhbmRib3hfbmV0X25hbWVzcGFjZTogcF9uYW1lc3BhY2UgPSIsIHBfbmFtZXNwYWNlLCAiaV9uYW1lc3BhY2UgPSIsIGlfbmFtZXNwYWNlKQoKICAgIHJlZ2V4Lm1hdGNoKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9uZXRfbmFtZXNwYWNlOiB0cnVlIikKfQoKYWxsb3dfbmV0X25hbWVzcGFjZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19uZXRfbmFtZXNwYWNlOiBzdGFydCIpCgogICAga2V5IDo9ICJuZXJkY3RsL25ldHdvcmstbmFtZXNwYWNlIgoKICAgIG5vdCBwX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICBub3QgaV9vY2kuQW5ub3RhdGlvbnNba2V5XQoKICAgIHByaW50KCJhbGxvd19uZXRfbmFtZXNwYWNlOiB0cnVlIikKfQoKIyAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1sb2ctZGlyZWN0b3J5IiBhbm5vdGF0aW9uCmFsbG93X3NhbmRib3hfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X2xvZ19kaXJlY3Rvcnk6IHN0YXJ0IikKCiAgICBrZXkgOj0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbG9nLWRpcmVjdG9yeSIKCiAgICBwX2RpciA6PSBwX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICByZWdleDEgOj0gcmVwbGFjZShwX2RpciwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHJlZ2V4MiA6PSByZXBsYWNlKHJlZ2V4MSwgIiQoc2FuZGJveC1uYW1lc3BhY2UpIiwgc19uYW1lc3BhY2UpCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiByZWdleDIgPSIsIHJlZ2V4MikKCiAgICBpX2RpciA6PSBpX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiBpX2RpciA9IiwgaV9kaXIpCgogICAgcmVnZXgubWF0Y2gocmVnZXgyLCBpX2RpcikKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiB0cnVlIikKfQoKYWxsb3dfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19sb2dfZGlyZWN0b3J5OiBzdGFydCIpCgogICAga2V5IDo9ICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWxvZy1kaXJlY3RvcnkiCgogICAgbm90IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIG5vdCBpX29jaS5Bbm5vdGF0aW9uc1trZXldCgogICAgcHJpbnQoImFsbG93X2xvZ19kaXJlY3Rvcnk6IHRydWUiKQp9CgphbGxvd19kZXZpY2VzKHBfZGV2aWNlcywgaV9kZXZpY2VzKSB7CiAgICBwcmludCgiYWxsb3dfZGV2aWNlczogc3RhcnQiKQogICAgZXZlcnkgaV9kZXZpY2UgaW4gaV9kZXZpY2VzIHsKICAgICAgICBwcmludCgiYWxsb3dfZGV2aWNlczogaV9kZXZpY2UgPSIsIGlfZGV2aWNlKQogICAgICAgIHNvbWUgcF9kZXZpY2UgaW4gcF9kZXZpY2VzCiAgICAgICAgcF9kZXZpY2UuY29udGFpbmVyX3BhdGggPT0gaV9kZXZpY2UuY29udGFpbmVyX3BhdGgKICAgIH0KICAgIHByaW50KCJhbGxvd19kZXZpY2VzOiB0cnVlIikKfQoKYWxsb3dfbGludXgoc3RhdGVfb3BzLCBwX29jaSwgaV9vY2kpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIHBfbmFtZXNwYWNlcyA6PSBwX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbGludXg6IHAgbmFtZXNwYWNlcyA9IiwgcF9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlcyA6PSBpX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbGludXg6IGkgbmFtZXNwYWNlcyA9IiwgaV9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlX3dpdGhvdXRfbmV0d29yayA6PSBbb2JqIHwgb2JqIDo9IGlfbmFtZXNwYWNlc1tfXTsgb2JqLlR5cGUgIT0gIm5ldHdvcmsiXQoKICAgIHByaW50KCJhbGxvd19saW51eDogaV9uYW1lc3BhY2Vfd2l0aG91dF9uZXR3b3JrID0iLCBpX25hbWVzcGFjZV93aXRob3V0X25ldHdvcmspCgogICAgcF9uYW1lc3BhY2VzID09IGlfbmFtZXNwYWNlX3dpdGhvdXRfbmV0d29yawoKICAgIGFsbG93X21hc2tlZF9wYXRocyhwX29jaSwgaV9vY2kpCiAgICBhbGxvd19yZWFkb25seV9wYXRocyhwX29jaSwgaV9vY2kpCiAgICBhbGxvd19saW51eF9kZXZpY2VzKHBfb2NpLkxpbnV4LkRldmljZXMsIGlfb2NpLkxpbnV4LkRldmljZXMpCiAgICBhbGxvd19saW51eF9zeXNjdGwocF9vY2kuTGludXgsIGlfb2NpLkxpbnV4KQogICAgcmV0IDo9IGFsbG93X25ldHdvcmtfbmFtZXNwYWNlX3N0YXJ0KHN0YXRlX29wcywgcF9vY2ksIGlfb2NpKQogICAgcmV0LmFsbG93ZWQKCiAgICBvcHMgOj0gcmV0Lm9wcwoKICAgIHByaW50KCJhbGxvd19saW51eDogdHJ1ZSIpCn0KCiMgUmV0cmlldmUgdGhlICJuZXR3b3JrIiBuYW1lc3BhY2UgZnJvbSB0aGUgaW5wdXQgZGF0YSBhbmQgcGFzcyBpdCBvbiBmb3IgdGhlCiMgbmV0d29yayBuYW1lc3BhY2UgcG9saWN5IGNoZWNrcy4KYWxsb3dfbmV0d29ya19uYW1lc3BhY2Vfc3RhcnQoc3RhdGVfb3BzLCBwX29jaSwgaV9vY2kpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIHByaW50KCJhbGxvd19uZXR3b3JrX25hbWVzcGFjZSBzdGFydDogc3RhcnQiKQoKICAgIHBfbmFtZXNwYWNlcyA6PSBwX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IHAgbmFtZXNwYWNlcyA9IiwgcF9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlcyA6PSBpX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IGkgbmFtZXNwYWNlcyA9IiwgaV9uYW1lc3BhY2VzKQoKICAgICMgUmV0dXJuIHBhdGggb2YgdGhlICJuZXR3b3JrIiBuYW1lc3BhY2UKICAgIG5ldHdvcmtfbnMgOj0gW29iaiB8IG9iaiA6PSBpX25hbWVzcGFjZXNbX107IG9iai5UeXBlID09ICJuZXR3b3JrIl0KCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IG5ldHdvcmtfbnMgPSIsIG5ldHdvcmtfbnMpCgogICAgcmV0IDo9IGFsbG93X25ldHdvcmtfbmFtZXNwYWNlKHN0YXRlX29wcywgbmV0d29ya19ucykKICAgIHJldC5hbGxvd2VkCgogICAgb3BzIDo9IHJldC5vcHMKfQoKIyBUaGlzIHJ1bGUgaXMgd2hlbiB0aGVyZSdzIG5vIG5ldHdvcmsgbmFtZXNwYWNlIGluIHRoZSBpbnB1dCBkYXRhLgphbGxvd19uZXR3b3JrX25hbWVzcGFjZShzdGF0ZV9vcHMsIG5ldHdvcmtfbnMpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIGNvdW50KG5ldHdvcmtfbnMpID09IDAKCiAgICBuZXR3b3JrX25zX3BhdGggPSAiIgoKICAgIGFkZF9uZXR3b3JrX25hbWVzcGFjZV90b19zdGF0ZSA6PSBzdGF0ZV9hbGxvd3MoIm5ldHdvcmtfbmFtZXNwYWNlIiwgbmV0d29ya19uc19wYXRoKQogICAgb3BzIDo9IGNvbmNhdF9vcF9pZl9ub3RfbnVsbChzdGF0ZV9vcHMsIGFkZF9uZXR3b3JrX25hbWVzcGFjZV90b19zdGF0ZSkKCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2UgMTogdHJ1ZSIpCn0KCiMgVGhpcyBydWxlIGlzIHdoZW4gdGhlcmUncyBleGFjdGx5IG9uZSBuZXR3b3JrIG5hbWVzcGFjZSBpbiB0aGUgaW5wdXQgZGF0YS4KYWxsb3dfbmV0d29ya19uYW1lc3BhY2Uoc3RhdGVfb3BzLCBuZXR3b3JrX25zKSA6PSB7Im9wcyI6IG9wcywgImFsbG93ZWQiOiB0cnVlfSB7CiAgICBjb3VudChuZXR3b3JrX25zKSA9PSAxCgogICAgYWRkX25ldHdvcmtfbmFtZXNwYWNlX3RvX3N0YXRlIDo9IHN0YXRlX2FsbG93cygibmV0d29ya19uYW1lc3BhY2UiLCBuZXR3b3JrX25zWzBdLlBhdGgpCiAgICBvcHMgOj0gY29uY2F0X29wX2lmX25vdF9udWxsKHN0YXRlX29wcywgYWRkX25ldHdvcmtfbmFtZXNwYWNlX3RvX3N0YXRlKQoKICAgIHByaW50KCJhbGxvd19uZXR3b3JrX25hbWVzcGFjZSAyOiB0cnVlIikKfQoKYWxsb3dfbWFza2VkX3BhdGhzKHBfb2NpLCBpX29jaSkgewogICAgcF9wYXRocyA6PSBwX29jaS5MaW51eC5NYXNrZWRQYXRocwogICAgcHJpbnQoImFsbG93X21hc2tlZF9wYXRocyAxOiBwX3BhdGhzID0iLCBwX3BhdGhzKQoKICAgIGlfcGF0aHMgOj0gaV9vY2kuTGludXguTWFza2VkUGF0aHMKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aHMgMTogaV9wYXRocyA9IiwgaV9wYXRocykKCiAgICBhbGxvd19tYXNrZWRfcGF0aHNfYXJyYXkocF9wYXRocywgaV9wYXRocykKCiAgICBwcmludCgiYWxsb3dfbWFza2VkX3BhdGhzIDE6IHRydWUiKQp9CmFsbG93X21hc2tlZF9wYXRocyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aHMgMjogc3RhcnQiKQoKICAgIG5vdCBwX29jaS5MaW51eC5NYXNrZWRQYXRocwogICAgbm90IGlfb2NpLkxpbnV4Lk1hc2tlZFBhdGhzCgogICAgcHJpbnQoImFsbG93X21hc2tlZF9wYXRocyAyOiB0cnVlIikKfQoKIyBBbGwgdGhlIHBvbGljeSBtYXNrZWQgcGF0aHMgbXVzdCBiZSBtYXNrZWQgaW4gdGhlIGlucHV0IGRhdGEgdG9vLgojIElucHV0IGlzIGFsbG93ZWQgdG8gaGF2ZSBtb3JlIG1hc2tlZCBwYXRocyB0aGFuIHRoZSBwb2xpY3kuCmFsbG93X21hc2tlZF9wYXRoc19hcnJheShwX2FycmF5LCBpX2FycmF5KSB7CiAgICBldmVyeSBwX2VsZW0gaW4gcF9hcnJheSB7CiAgICAgICAgYWxsb3dfbWFza2VkX3BhdGgocF9lbGVtLCBpX2FycmF5KQogICAgfQp9CgphbGxvd19tYXNrZWRfcGF0aChwX2VsZW0sIGlfYXJyYXkpIHsKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aDogcF9lbGVtID0iLCBwX2VsZW0pCgogICAgc29tZSBpX2VsZW0gaW4gaV9hcnJheQogICAgcF9lbGVtID09IGlfZWxlbQoKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aDogdHJ1ZSIpCn0KCmFsbG93X3JlYWRvbmx5X3BhdGhzKHBfb2NpLCBpX29jaSkgewogICAgcF9wYXRocyA6PSBwX29jaS5MaW51eC5SZWFkb25seVBhdGhzCiAgICBwcmludCgiYWxsb3dfcmVhZG9ubHlfcGF0aHMgMTogcF9wYXRocyA9IiwgcF9wYXRocykKCiAgICBpX3BhdGhzIDo9IGlfb2NpLkxpbnV4LlJlYWRvbmx5UGF0aHMKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAxOiBpX3BhdGhzID0iLCBpX3BhdGhzKQoKICAgIGFsbG93X3JlYWRvbmx5X3BhdGhzX2FycmF5KHBfcGF0aHMsIGlfcGF0aHMsIGlfb2NpLkxpbnV4Lk1hc2tlZFBhdGhzKQoKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAxOiB0cnVlIikKfQphbGxvd19yZWFkb25seV9wYXRocyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAyOiBzdGFydCIpCgogICAgbm90IHBfb2NpLkxpbnV4LlJlYWRvbmx5UGF0aHMKICAgIG5vdCBpX29jaS5MaW51eC5SZWFkb25seVBhdGhzCgogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGhzIDI6IHRydWUiKQp9CgojIEFsbCB0aGUgcG9saWN5IHJlYWRvbmx5IHBhdGhzIG11c3QgYmUgZWl0aGVyOgojIC0gUHJlc2VudCBpbiB0aGUgaW5wdXQgcmVhZG9ubHkgcGF0aHMsIG9yCiMgLSBQcmVzZW50IGluIHRoZSBpbnB1dCBtYXNrZWQgcGF0aHMuCiMgSW5wdXQgaXMgYWxsb3dlZCB0byBoYXZlIG1vcmUgcmVhZG9ubHkgcGF0aHMgdGhhbiB0aGUgcG9saWN5LgphbGxvd19yZWFkb25seV9wYXRoc19hcnJheShwX2FycmF5LCBpX2FycmF5LCBtYXNrZWRfcGF0aHMpIHsKICAgIGV2ZXJ5IHBfZWxlbSBpbiBwX2FycmF5IHsKICAgICAgICBhbGxvd19yZWFkb25seV9wYXRoKHBfZWxlbSwgaV9hcnJheSwgbWFza2VkX3BhdGhzKQogICAgfQp9CgphbGxvd19yZWFkb25seV9wYXRoKHBfZWxlbSwgaV9hcnJheSwgbWFza2VkX3BhdGhzKSB7CiAgICBwcmludCgiYWxsb3dfcmVhZG9ubHlfcGF0aCAxOiBwX2VsZW0gPSIsIHBfZWxlbSkKCiAgICBzb21lIGlfZWxlbSBpbiBpX2FycmF5CiAgICBwX2VsZW0gPT0gaV9lbGVtCgogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGggMTogdHJ1ZSIpCn0KYWxsb3dfcmVhZG9ubHlfcGF0aChwX2VsZW0sIGlfYXJyYXksIG1hc2tlZF9wYXRocykgewogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGggMjogcF9lbGVtID0iLCBwX2VsZW0pCgogICAgc29tZSBpX21hc2tlZCBpbiBtYXNrZWRfcGF0aHMKICAgIHBfZWxlbSA9PSBpX21hc2tlZAoKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRoIDI6IHRydWUiKQp9CgphbGxvd19saW51eF9kZXZpY2VzKHBfZGV2aWNlcywgaV9kZXZpY2VzKSB7CiAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogc3RhcnQiKQogICAgZXZlcnkgaV9kZXZpY2UgaW4gaV9kZXZpY2VzIHsKICAgICAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogaV9kZXZpY2UgPSIsIGlfZGV2aWNlKQogICAgICAgIHNvbWUgcF9kZXZpY2UgaW4gcF9kZXZpY2VzCiAgICAgICAgaV9kZXZpY2UuUGF0aCA9PSBwX2RldmljZS5QYXRoCiAgICB9CiAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogdHJ1ZSIpCn0KCmFsbG93X2xpbnV4X3N5c2N0bChwX2xpbnV4LCBpX2xpbnV4KSB7CiAgICBwcmludCgiYWxsb3dfbGludXhfc3lzY3RsIDE6IHN0YXJ0IikKICAgIG5vdCBpX2xpbnV4LlN5c2N0bAogICAgcHJpbnQoImFsbG93X2xpbnV4X3N5c2N0bCAxOiB0cnVlIikKfQoKYWxsb3dfbGludXhfc3lzY3RsKHBfbGludXgsIGlfbGludXgpIHsKICAgIHByaW50KCJhbGxvd19saW51eF9zeXNjdGwgMjogc3RhcnQiKQogICAgcF9zeXNjdGwgOj0gcF9saW51eC5TeXNjdGwKICAgIGlfc3lzY3RsIDo9IGlfbGludXguU3lzY3RsCiAgICBldmVyeSBpX25hbWUsIGlfdmFsIGluIGlfc3lzY3RsIHsKICAgICAgICBwcmludCgiYWxsb3dfbGludXhfc3lzY3RsIDI6IGlfbmFtZSA9IiwgaV9uYW1lLCAiaV92YWwgPSIsIGlfdmFsKQogICAgICAgIHBfc3lzY3RsW2lfbmFtZV0gPT0gaV92YWwKICAgIH0KICAgIHByaW50KCJhbGxvd19saW51eF9zeXNjdGwgMjogdHJ1ZSIpCn0KCiMgQ2hlY2sgdGhlIGNvbnNpc3RlbmN5IG9mIHRoZSBpbnB1dCAiaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5idW5kbGVfcGF0aCIKIyBhbmQgaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCIgdmFsdWVzIHdpdGggb3RoZXIgZmllbGRzLgphbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZChwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpIHsKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogc3RhcnQiKQoKICAgIGJ1bmRsZV9wYXRoIDo9IGlfb2NpLkFubm90YXRpb25zWyJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmJ1bmRsZV9wYXRoIl0KICAgIGJ1bmRsZV9pZCA6PSByZXBsYWNlKGJ1bmRsZV9wYXRoLCAiL3J1bi9jb250YWluZXJkL2lvLmNvbnRhaW5lcmQucnVudGltZS52Mi50YXNrL2s4cy5pby8iLCAiIikKCiAgICBidW5kbGVfaWRfZm9ybWF0IDo9IGNvbmNhdCgiIiwgWyJeIiwgQlVORExFX0lELCAiJCJdKQogICAgcmVnZXgubWF0Y2goYnVuZGxlX2lkX2Zvcm1hdCwgYnVuZGxlX2lkKQoKICAgIGtleSA6PSAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCIKCiAgICBwX3JlZ2V4IDo9IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIHNhbmRib3hfaWQgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQoKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogc2FuZGJveF9pZCA9Iiwgc2FuZGJveF9pZCwgInJlZ2V4ID0iLCBwX3JlZ2V4KQogICAgcmVnZXgubWF0Y2gocF9yZWdleCwgc2FuZGJveF9pZCkKCiAgICBhbGxvd19yb290X3BhdGgocF9vY2ksIGlfb2NpLCBidW5kbGVfaWQpCgogICAgZXZlcnkgaV9tb3VudCBpbiBpX29jaS5Nb3VudHMgewogICAgICAgIGFsbG93X21vdW50KHBfb2NpLCBpX21vdW50LCBpX3N0b3JhZ2VzLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpCiAgICB9CgogICAgYWxsb3dfc3RvcmFnZXMocF9zdG9yYWdlcywgaV9zdG9yYWdlcywgYnVuZGxlX2lkLCBzYW5kYm94X2lkKQoKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogdHJ1ZSIpCn0KCmFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHBfcHJvY2VzcyA9IiwgcF9wcm9jZXNzKQogICAgcHJpbnQoImFsbG93X3Byb2Nlc3NfY29tbW9uOiBpX3Byb2Nlc3MgPSAiLCBpX3Byb2Nlc3MpCiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHNfbmFtZSA9Iiwgc19uYW1lKQoKICAgIHBfcHJvY2Vzcy5Dd2QgPT0gaV9wcm9jZXNzLkN3ZAogICAgcF9wcm9jZXNzLk5vTmV3UHJpdmlsZWdlcyA9PSBpX3Byb2Nlc3MuTm9OZXdQcml2aWxlZ2VzCgogICAgYWxsb3dfdXNlcihwX3Byb2Nlc3MsIGlfcHJvY2VzcykKICAgIGFsbG93X2VudihwX3Byb2Nlc3MsIGlfcHJvY2Vzcywgc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHRydWUiKQp9CgojIENvbXBhcmUgdGhlIE9DSSBQcm9jZXNzIGZpZWxkIG9mIGEgcG9saWN5IGNvbnRhaW5lciB3aXRoIHRoZSBpbnB1dCBPQ0kgUHJvY2VzcyBmcm9tIGEgQ3JlYXRlQ29udGFpbmVyUmVxdWVzdAphbGxvd19wcm9jZXNzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfcHJvY2Vzczogc3RhcnQiKQoKICAgIGFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgYWxsb3dfY2FwcyhwX3Byb2Nlc3MuQ2FwYWJpbGl0aWVzLCBpX3Byb2Nlc3MuQ2FwYWJpbGl0aWVzKQogICAgcF9wcm9jZXNzLlRlcm1pbmFsID09IGlfcHJvY2Vzcy5UZXJtaW5hbAoKICAgIHByaW50KCJhbGxvd19wcm9jZXNzOiB0cnVlIikKfQoKIyBDb21wYXJlIHRoZSBPQ0kgUHJvY2VzcyBmaWVsZCBvZiBhIHBvbGljeSBjb250YWluZXIgd2l0aCB0aGUgaW5wdXQgcHJvY2VzcyBmaWVsZCBmcm9tIEV4ZWNQcm9jZXNzUmVxdWVzdAphbGxvd19pbnRlcmFjdGl2ZV9wcm9jZXNzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfaW50ZXJhY3RpdmVfcHJvY2Vzczogc3RhcnQiKQoKICAgIGFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgYWxsb3dfZXhlY19jYXBzKGlfcHJvY2Vzcy5DYXBhYmlsaXRpZXMpCgogICAgIyBUaGVzZSBhcmUgY29tbWFuZHMgZW5hYmxlZCB1c2luZyBFeGVjUHJvY2Vzc1JlcXVlc3QgY29tbWFuZHMgYW5kL29yIHJlZ2V4IGZyb20gdGhlIHNldHRpbmdzIGZpbGUuCiAgICAjIFRoZXkgY2FuIGJlIGV4ZWN1dGVkIGludGVyYWN0aXZlbHkgc28gYWxsb3cgdGhlbSB0byB1c2UgYW55IHZhbHVlIGZvciBpX3Byb2Nlc3MuVGVybWluYWwuCgogICAgcHJpbnQoImFsbG93X2ludGVyYWN0aXZlX3Byb2Nlc3M6IHRydWUiKQp9CgojIENvbXBhcmUgdGhlIE9DSSBQcm9jZXNzIGZpZWxkIG9mIGEgcG9saWN5IGNvbnRhaW5lciB3aXRoIHRoZSBpbnB1dCBwcm9jZXNzIGZpZWxkIGZyb20gRXhlY1Byb2Nlc3NSZXF1ZXN0CmFsbG93X3Byb2JlX3Byb2Nlc3MocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19wcm9iZV9wcm9jZXNzOiBzdGFydCIpCgogICAgYWxsb3dfcHJvY2Vzc19jb21tb24ocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpCiAgICBhbGxvd19leGVjX2NhcHMoaV9wcm9jZXNzLkNhcGFiaWxpdGllcykKICAgIHBfcHJvY2Vzcy5UZXJtaW5hbCA9PSBpX3Byb2Nlc3MuVGVybWluYWwKCiAgICBwcmludCgiYWxsb3dfcHJvYmVfcHJvY2VzczogdHJ1ZSIpCn0KCmFsbG93X3VzZXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MpIHsKICAgIHBfdXNlciA6PSBwX3Byb2Nlc3MuVXNlcgogICAgaV91c2VyIDo9IGlfcHJvY2Vzcy5Vc2VyCgogICAgcHJpbnQoImFsbG93X3VzZXI6IGlucHV0IHVpZCA9IiwgaV91c2VyLlVJRCwgInBvbGljeSB1aWQgPSIsIHBfdXNlci5VSUQpCiAgICBwX3VzZXIuVUlEID09IGlfdXNlci5VSUQKCiAgICAjIFRPRE86IHRyYWNrIGRvd24gdGhlIHJlYXNvbiBmb3IgcmVnaXN0cnkuazhzLmlvL3BhdXNlOjMuOSBiZWluZwogICAgIyAgICAgICBleGVjdXRlZCB3aXRoIGdpZCA9IDAgZGVzcGl0ZSBoYXZpbmcgIjY1NTM1OjY1NTM1IiBpbiBpdHMgY29udGFpbmVyIGltYWdlCiAgICAjICAgICAgIGNvbmZpZy4KICAgICNwcmludCgiYWxsb3dfdXNlcjogaW5wdXQgZ2lkID0iLCBpX3VzZXIuR0lELCAicG9saWN5IGdpZCA9IiwgcF91c2VyLkdJRCkKICAgICNwX3VzZXIuR0lEID09IGlfdXNlci5HSUQKCiAgICAjIFRPRE86IGNvbXBhcmUgdGhlIGFkZGl0aW9uYWxHaWRzIGZpZWxkIHRvbyBhZnRlciBjb21wdXRpbmcgaXRzIHZhbHVlCiAgICAjIGJhc2VkIG9uIC9ldGMvcGFzc3dkIGFuZCAvZXRjL2dyb3VwIGZyb20gdGhlIGNvbnRhaW5lciBpbWFnZS4KfQoKYWxsb3dfZGVwcmVjYXRlZF9hcmdzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZ3MgMTogbm8gYXJncyIpCgogICAgbm90IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJncwogICAgbm90IGlfcHJvY2Vzcy5BcmdzCgogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAxOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZ3MocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSkgewogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiBwb2xpY3kgYXJncyA9IiwgcF9wcm9jZXNzLkRlcHJlY2F0ZWRBcmdzKQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiBpbnB1dCBhcmdzID0iLCBpX3Byb2Nlc3MuQXJncykKCiAgICBjb3VudChwX3Byb2Nlc3MuRGVwcmVjYXRlZEFyZ3MpID09IGNvdW50KGlfcHJvY2Vzcy5BcmdzKQoKICAgIGV2ZXJ5IGksIGlfYXJnIGluIGlfcHJvY2Vzcy5BcmdzIHsKICAgICAgICBhbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpCiAgICB9CgogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDE6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgcF9hcmcyIDo9IHJlcGxhY2UocF9hcmcsICIkJCIsICIkIikKICAgIHBfYXJnMiA9PSBpX2FyZwoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAxOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDI6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgIyBUT0RPOiBjYW4gJChub2RlLW5hbWUpIGJlIGhhbmRsZWQgYmV0dGVyPwogICAgY29udGFpbnMocF9hcmcsICIkKG5vZGUtbmFtZSkiKQoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAyOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDM6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgcF9hcmcyIDo9IHJlcGxhY2UocF9hcmcsICIkJCIsICIkIikKICAgIHBfYXJnMyA6PSByZXBsYWNlKHBfYXJnMiwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAzOiBwX2FyZzMgPSIsIHBfYXJnMykKICAgIHBfYXJnMyA9PSBpX2FyZwoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAzOiB0cnVlIikKfQoKIyBPQ0kgcHJvY2Vzcy5FbnYgZmllbGQKYWxsb3dfZW52KHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfZW52OiBwIGVudiA9IiwgcF9wcm9jZXNzLkVudikKICAgIHByaW50KCJhbGxvd19lbnY6IGkgZW52ID0iLCBpX3Byb2Nlc3MuRW52KQoKICAgIGV2ZXJ5IGlfdmFyIGluIGlfcHJvY2Vzcy5FbnYgewogICAgICAgIHByaW50KCJhbGxvd19lbnY6IGlfdmFyID0iLCBpX3ZhcikKICAgICAgICBhbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgfQoKICAgIHByaW50KCJhbGxvd19lbnY6IHRydWUiKQp9CgojIEFsbG93IGlucHV0IGVudiB2YXJpYWJsZXMgdGhhdCBhcmUgcHJlc2VudCBpbiB0aGUgcG9saWN5IGRhdGEgdG9vLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHBfdmFyID09IGlfdmFyCiAgICBwcmludCgiYWxsb3dfdmFyIDE6IHRydWUiKQp9CgojIE1hdGNoIGlucHV0IHdpdGggb25lIG9mIHRoZSBwb2xpY3kgdmFyaWFibGVzLCBhZnRlciBzdWJzdGl0dXRpbmcgJChzYW5kYm94LW5hbWUpLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHByaW50KCJhbGxvd192YXIgMjogcF92YXIgPSIsIHBfdmFyKQoKICAgIHBfdmFyX3NwbGl0IDo9IHNwbGl0KHBfdmFyLCAiPSIpCiAgICBjb3VudChwX3Zhcl9zcGxpdCkgPT0gMgoKICAgIHBfdmFyX3NwbGl0WzFdID09ICIkKHNhbmRib3gtbmFtZSkiCgogICAgaV92YXJfc3BsaXQgOj0gc3BsaXQoaV92YXIsICI9IikKICAgIGNvdW50KGlfdmFyX3NwbGl0KSA9PSAyCgogICAgaV92YXJfc3BsaXRbMF0gPT0gcF92YXJfc3BsaXRbMF0KICAgIHJlZ2V4Lm1hdGNoKHNfbmFtZSwgaV92YXJfc3BsaXRbMV0pCgogICAgcHJpbnQoImFsbG93X3ZhciAyOiB0cnVlIikKfQoKIyBBbGxvdyBpbnB1dCBlbnYgdmFyaWFibGVzIHRoYXQgbWF0Y2ggd2l0aCBhIHJlcXVlc3RfZGVmYXVsdHMgcmVnZXguCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHNvbWUgcF9yZWdleDEgaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5DcmVhdGVDb250YWluZXJSZXF1ZXN0LmFsbG93X2Vudl9yZWdleAogICAgcF9yZWdleDIgOj0gcmVwbGFjZShwX3JlZ2V4MSwgIiQoaXB2NF9hKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcHY0X2EpCiAgICBwX3JlZ2V4MyA6PSByZXBsYWNlKHBfcmVnZXgyLCAiJChpcF9wKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcF9wKQogICAgcF9yZWdleDQgOj0gcmVwbGFjZShwX3JlZ2V4MywgIiQoc3ZjX25hbWUpIiwgcG9saWN5X2RhdGEuY29tbW9uLnN2Y19uYW1lKQogICAgcF9yZWdleDUgOj0gcmVwbGFjZShwX3JlZ2V4NCwgIiQoZG5zX2xhYmVsKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5kbnNfbGFiZWwpCgogICAgcHJpbnQoImFsbG93X3ZhciAzOiBwX3JlZ2V4NSA9IiwgcF9yZWdleDUpCiAgICByZWdleC5tYXRjaChwX3JlZ2V4NSwgaV92YXIpCgogICAgcHJpbnQoImFsbG93X3ZhciAzOiB0cnVlIikKfQoKIyBBbGxvdyBmaWVsZFJlZiAiZmllbGRQYXRoOiBzdGF0dXMucG9kSVAiIHZhbHVlcy4KYWxsb3dfdmFyKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBpX3Zhciwgc19uYW1lLCBzX25hbWVzcGFjZSkgewogICAgbmFtZV92YWx1ZSA6PSBzcGxpdChpX3ZhciwgIj0iKQogICAgY291bnQobmFtZV92YWx1ZSkgPT0gMgogICAgaXNfaXAobmFtZV92YWx1ZVsxXSkKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIGFsbG93X3BvZF9pcF92YXIobmFtZV92YWx1ZVswXSwgcF92YXIpCgogICAgcHJpbnQoImFsbG93X3ZhciA0OiB0cnVlIikKfQoKIyBBbGxvdyBjb21tb24gZmllbGRSZWYgdmFyaWFibGVzLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBuYW1lX3ZhbHVlIDo9IHNwbGl0KGlfdmFyLCAiPSIpCiAgICBjb3VudChuYW1lX3ZhbHVlKSA9PSAyCgogICAgc29tZSBwX3ZhciBpbiBwX3Byb2Nlc3MuRW52CiAgICBwX25hbWVfdmFsdWUgOj0gc3BsaXQocF92YXIsICI9IikKICAgIGNvdW50KHBfbmFtZV92YWx1ZSkgPT0gMgoKICAgIHBfbmFtZV92YWx1ZVswXSA9PSBuYW1lX3ZhbHVlWzBdCgogICAgIyBUT0RPOiBzaG91bGQgdGhlc2UgYmUgaGFuZGxlZCBpbiBhIGRpZmZlcmVudCB3YXk/CiAgICBhbHdheXNfYWxsb3dlZCA6PSBbIiQoaG9zdC1uYW1lKSIsICIkKG5vZGUtbmFtZSkiLCAiJChwb2QtdWlkKSJdCiAgICBzb21lIGFsbG93ZWQgaW4gYWx3YXlzX2FsbG93ZWQKICAgIGNvbnRhaW5zKHBfbmFtZV92YWx1ZVsxXSwgYWxsb3dlZCkKCiAgICBwcmludCgiYWxsb3dfdmFyIDU6IHRydWUiKQp9CgojIEFsbG93IGZpZWxkUmVmICJmaWVsZFBhdGg6IHN0YXR1cy5ob3N0SVAiIHZhbHVlcy4KYWxsb3dfdmFyKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBpX3Zhciwgc19uYW1lLCBzX25hbWVzcGFjZSkgewogICAgbmFtZV92YWx1ZSA6PSBzcGxpdChpX3ZhciwgIj0iKQogICAgY291bnQobmFtZV92YWx1ZSkgPT0gMgogICAgaXNfaXAobmFtZV92YWx1ZVsxXSkKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIGFsbG93X2hvc3RfaXBfdmFyKG5hbWVfdmFsdWVbMF0sIHBfdmFyKQoKICAgIHByaW50KCJhbGxvd192YXIgNjogdHJ1ZSIpCn0KCiMgQWxsb3cgcmVzb3VyY2VGaWVsZFJlZiB2YWx1ZXMgKGUuZy4sICJsaW1pdHMuY3B1IikuCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIG5hbWVfdmFsdWUgOj0gc3BsaXQoaV92YXIsICI9IikKICAgIGNvdW50KG5hbWVfdmFsdWUpID09IDIKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHBfbmFtZV92YWx1ZSA6PSBzcGxpdChwX3ZhciwgIj0iKQogICAgY291bnQocF9uYW1lX3ZhbHVlKSA9PSAyCgogICAgcF9uYW1lX3ZhbHVlWzBdID09IG5hbWVfdmFsdWVbMF0KCiAgICAjIGEgdmFyaWFibGUgd2Ugc2hvdWxkIGJlIHZhbGlkYXRpbmcgdXNpbmcgYSByZWdleCBmcm9tIHNldHRpbmdzCiAgICBwX25hbWVfdmFsdWVbMV0gPT0gIiQodmFsaWRhdGUtZnJvbS1zZXR0aW5ncykiCgogICAgcmVnZXhfdmFsIDo9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuQ3JlYXRlQ29udGFpbmVyUmVxdWVzdC5hbGxvd19lbnZfcmVnZXhfbWFwW25hbWVfdmFsdWVbMF1dCgogICAgcHJpbnQoImFsbG93X3ZhciA3OiB2YWwgPSIsIG5hbWVfdmFsdWVbMV0pCiAgICBwcmludCgiYWxsb3dfdmFyIDc6IHJlZ2V4X3ZhbCA9IiwgcmVnZXhfdmFsKQoKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4X3ZhbCwgbmFtZV92YWx1ZVsxXSkKCiAgICBwcmludCgiYWxsb3dfdmFyIDc6IHRydWUiKQp9CgojIE1hdGNoIGlucHV0IHdpdGggb25lIG9mIHRoZSBwb2xpY3kgdmFyaWFibGVzLCBhZnRlciBzdWJzdGl0dXRpbmcgJChzYW5kYm94LW5hbWVzcGFjZSkuCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHNvbWUgcF92YXIgaW4gcF9wcm9jZXNzLkVudgogICAgcF92YXIyIDo9IHJlcGxhY2UocF92YXIsICIkKHNhbmRib3gtbmFtZXNwYWNlKSIsIHNfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd192YXIgODogcF92YXIyID0iLCBwX3ZhcjIpCiAgICBwX3ZhcjIgPT0gaV92YXIKCiAgICBwcmludCgiYWxsb3dfdmFyIDg6IHRydWUiKQp9CgphbGxvd19wb2RfaXBfdmFyKHZhcl9uYW1lLCBwX3ZhcikgewogICAgcHJpbnQoImFsbG93X3BvZF9pcF92YXI6IHZhcl9uYW1lID0iLCB2YXJfbmFtZSwgInBfdmFyID0iLCBwX3ZhcikKCiAgICBwX25hbWVfdmFsdWUgOj0gc3BsaXQocF92YXIsICI9IikKICAgIGNvdW50KHBfbmFtZV92YWx1ZSkgPT0gMgoKICAgIHBfbmFtZV92YWx1ZVswXSA9PSB2YXJfbmFtZQogICAgcF9uYW1lX3ZhbHVlWzFdID09ICIkKHBvZC1pcCkiCgogICAgcHJpbnQoImFsbG93X3BvZF9pcF92YXI6IHRydWUiKQp9CgphbGxvd19ob3N0X2lwX3Zhcih2YXJfbmFtZSwgcF92YXIpIHsKICAgIHByaW50KCJhbGxvd19ob3N0X2lwX3ZhcjogdmFyX25hbWUgPSIsIHZhcl9uYW1lLCAicF92YXIgPSIsIHBfdmFyKQoKICAgIHBfbmFtZV92YWx1ZSA6PSBzcGxpdChwX3ZhciwgIj0iKQogICAgY291bnQocF9uYW1lX3ZhbHVlKSA9PSAyCgogICAgcF9uYW1lX3ZhbHVlWzBdID09IHZhcl9uYW1lCiAgICBwX25hbWVfdmFsdWVbMV0gPT0gIiQoaG9zdC1pcCkiCgogICAgcHJpbnQoImFsbG93X2hvc3RfaXBfdmFyOiB0cnVlIikKfQoKaXNfaXAodmFsdWUpIHsKICAgIGJ5dGVzID0gc3BsaXQodmFsdWUsICIuIikKICAgIGNvdW50KGJ5dGVzKSA9PSA0CgogICAgaXNfaXBfZmlyc3RfYnl0ZShieXRlc1swXSkKICAgIGlzX2lwX290aGVyX2J5dGUoYnl0ZXNbMV0pCiAgICBpc19pcF9vdGhlcl9ieXRlKGJ5dGVzWzJdKQogICAgaXNfaXBfb3RoZXJfYnl0ZShieXRlc1szXSkKfQppc19pcF9maXJzdF9ieXRlKGNvbXBvbmVudCkgewogICAgbnVtYmVyID0gdG9fbnVtYmVyKGNvbXBvbmVudCkKICAgIG51bWJlciA+PSAxCiAgICBudW1iZXIgPD0gMjU1Cn0KaXNfaXBfb3RoZXJfYnl0ZShjb21wb25lbnQpIHsKICAgIG51bWJlciA9IHRvX251bWJlcihjb21wb25lbnQpCiAgICBudW1iZXIgPj0gMAogICAgbnVtYmVyIDw9IDI1NQp9CgojIE9DSSByb290LlBhdGgKYWxsb3dfcm9vdF9wYXRoKHBfb2NpLCBpX29jaSwgYnVuZGxlX2lkKSB7CiAgICBpX3BhdGggOj0gaV9vY2kuUm9vdC5QYXRoCiAgICBwX3BhdGgxIDo9IHBfb2NpLlJvb3QuUGF0aAogICAgcHJpbnQoImFsbG93X3Jvb3RfcGF0aDogaV9wYXRoID0iLCBpX3BhdGgsICJwX3BhdGgxID0iLCBwX3BhdGgxKQoKICAgIHBfcGF0aDIgOj0gcmVwbGFjZShwX3BhdGgxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfcm9vdF9wYXRoOiBwX3BhdGgyID0iLCBwX3BhdGgyKQoKICAgIHBfcGF0aDMgOj0gcmVwbGFjZShwX3BhdGgyLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X3Jvb3RfcGF0aDogcF9wYXRoMyA9IiwgcF9wYXRoMykKCiAgICBwX3BhdGgzID09IGlfcGF0aAoKICAgIHByaW50KCJhbGxvd19yb290X3BhdGg6IHRydWUiKQp9CgojIGRldmljZSBtb3VudHMKYWxsb3dfbW91bnQocF9vY2ksIGlfbW91bnQsIGlfc3RvcmFnZXMsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcHJpbnQoImFsbG93X21vdW50OiBpX21vdW50ID0iLCBpX21vdW50KQoKICAgIHNvbWUgcF9tb3VudCBpbiBwX29jaS5Nb3VudHMKICAgIHNvbWUgaV9zdG9yYWdlIGluIGlfc3RvcmFnZXMKCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IHBfbW91bnQgPSIsIHBfbW91bnQpCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IGlfc3RvcmFnZSA9IiwgaV9zdG9yYWdlKQoKICAgIGNoZWNrX21vdW50KHBfbW91bnQsIGlfbW91bnQsIGlfc3RvcmFnZSwgYnVuZGxlX2lkLCBzYW5kYm94X2lkKQoKICAgICMgVE9ETzogYXJlIHRoZXJlIGFueSBvdGhlciByZXF1aXJlZCBwb2xpY3kgY2hlY2tzIGZvciBtb3VudHMgLSBlLmcuLAogICAgIyAgICAgICBtdWx0aXBsZSBtb3VudHMgd2l0aCBzYW1lIHNvdXJjZSBvciBkZXN0aW5hdGlvbj8KCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IHRydWUiKQp9CgpjaGVja19tb3VudChwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcF9tb3VudCA9PSBpX21vdW50CiAgICBwcmludCgiY2hlY2tfbW91bnQgMTogdHJ1ZSIpCn0KY2hlY2tfbW91bnQocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHBfbW91bnQuZGVzdGluYXRpb24gPT0gaV9tb3VudC5kZXN0aW5hdGlvbgogICAgcF9tb3VudC50eXBlXyA9PSBpX21vdW50LnR5cGVfCiAgICBwX21vdW50Lm9wdGlvbnMgPT0gaV9tb3VudC5vcHRpb25zCgogICAgbW91bnRfc291cmNlX2FsbG93cyhwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkKCiAgICBwcmludCgiY2hlY2tfbW91bnQgMjogdHJ1ZSIpCn0KCm1vdW50X3NvdXJjZV9hbGxvd3MocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHJlZ2V4MSA6PSBwX21vdW50LnNvdXJjZQogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5tb3VudF9zb3VyY2VfY3BhdGgpCiAgICByZWdleDQgOj0gcmVwbGFjZShyZWdleDMsICIkKGJ1bmRsZS1pZCkiLCBidW5kbGVfaWQpCgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMTogcmVnZXg0ID0iLCByZWdleDQpCiAgICByZWdleC5tYXRjaChyZWdleDQsIGlfbW91bnQuc291cmNlKQoKICAgIHByaW50KCJtb3VudF9zb3VyY2VfYWxsb3dzIDE6IHRydWUiKQp9Cm1vdW50X3NvdXJjZV9hbGxvd3MocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHJlZ2V4MSA6PSBwX21vdW50LnNvdXJjZQogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5tb3VudF9zb3VyY2VfY3BhdGgpCiAgICByZWdleDQgOj0gcmVwbGFjZShyZWdleDMsICIkKHNhbmRib3gtaWQpIiwgc2FuZGJveF9pZCkKCiAgICBwcmludCgibW91bnRfc291cmNlX2FsbG93cyAyOiByZWdleDQgPSIsIHJlZ2V4NCkKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4NCwgaV9tb3VudC5zb3VyY2UpCgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMjogdHJ1ZSIpCn0KbW91bnRfc291cmNlX2FsbG93cyhwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogaV9tb3VudC5zb3VyY2UgPSIsIGlfbW91bnQuc291cmNlKQogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogaV9zdG9yYWdlLm1vdW50X3BvaW50ID0iLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCgogICAgaV9tb3VudC5zb3VyY2UgPT0gaV9zdG9yYWdlLm1vdW50X3BvaW50CgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogdHJ1ZSIpCn0KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBDcmVhdGUgY29udGFpbmVyIFN0b3JhZ2VzCgphbGxvd19zdG9yYWdlcyhwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHBfY291bnQgOj0gY291bnQocF9zdG9yYWdlcykKICAgIGlfY291bnQgOj0gY291bnQoaV9zdG9yYWdlcykKICAgIHByaW50KCJhbGxvd19zdG9yYWdlczogcF9jb3VudCA9IiwgcF9jb3VudCwgImlfY291bnQgPSIsIGlfY291bnQpCgogICAgcF9jb3VudCA9PSBpX2NvdW50CgogICAgIyBHZXQgdGhlIGNvbnRhaW5lciBpbWFnZSBsYXllciBJRHMgYW5kIHZlcml0eSByb290IGhhc2hlcywgZnJvbSB0aGUgIm92ZXJsYXlmcyIgc3RvcmFnZS4KICAgIHNvbWUgb3ZlcmxheV9zdG9yYWdlIGluIHBfc3RvcmFnZXMKICAgIG92ZXJsYXlfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIHByaW50KCJhbGxvd19zdG9yYWdlczogb3ZlcmxheV9zdG9yYWdlID0iLCBvdmVybGF5X3N0b3JhZ2UpCiAgICBjb3VudChvdmVybGF5X3N0b3JhZ2Uub3B0aW9ucykgPT0gMgoKICAgIGxheWVyX2lkcyA6PSBzcGxpdChvdmVybGF5X3N0b3JhZ2Uub3B0aW9uc1swXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiBsYXllcl9pZHMgPSIsIGxheWVyX2lkcykKCiAgICByb290X2hhc2hlcyA6PSBzcGxpdChvdmVybGF5X3N0b3JhZ2Uub3B0aW9uc1sxXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiByb290X2hhc2hlcyA9Iiwgcm9vdF9oYXNoZXMpCgogICAgZXZlcnkgaV9zdG9yYWdlIGluIGlfc3RvcmFnZXMgewogICAgICAgIGFsbG93X3N0b3JhZ2UocF9zdG9yYWdlcywgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpCiAgICB9CgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiB0cnVlIikKfQoKYWxsb3dfc3RvcmFnZShwX3N0b3JhZ2VzLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgc29tZSBwX3N0b3JhZ2UgaW4gcF9zdG9yYWdlcwoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiBwX3N0b3JhZ2UgPSIsIHBfc3RvcmFnZSkKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiBpX3N0b3JhZ2UgPSIsIGlfc3RvcmFnZSkKCiAgICBwX3N0b3JhZ2UuZHJpdmVyICAgICAgICAgICA9PSBpX3N0b3JhZ2UuZHJpdmVyCiAgICBwX3N0b3JhZ2UuZHJpdmVyX29wdGlvbnMgICA9PSBpX3N0b3JhZ2UuZHJpdmVyX29wdGlvbnMKICAgIHBfc3RvcmFnZS5mc19ncm91cCAgICAgICAgID09IGlfc3RvcmFnZS5mc19ncm91cAogICAgcF9zdG9yYWdlLmZzdHlwZSAgICAgICAgICAgPT0gaV9zdG9yYWdlLmZzdHlwZQoKICAgIGFsbG93X3N0b3JhZ2Vfc291cmNlKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKQogICAgYWxsb3dfc3RvcmFnZV9vcHRpb25zKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKQogICAgYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKQoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiB0cnVlIikKfQoKYWxsb3dfc3RvcmFnZV9zb3VyY2UocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX3NvdXJjZSAxOiBzdGFydCIpCgogICAgcF9zdG9yYWdlLnNvdXJjZSA9PSBpX3N0b3JhZ2Uuc291cmNlCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDE6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX3NvdXJjZShwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDI6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCgogICAgIyBEREREOkJCOkRELkY6IERvbWFpbjpCdXM6RGV2aWNlLkZ1bmN0aW9uCiAgICAjIGh0dHBzOi8vd3d3Lmtlcm5lbC5vcmcvZG9jL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtYnVzLXBjaQogICAgcmVnZXgubWF0Y2goYF5bYS1mMC05XXs0fTpbYS1mMC05XXsyfTpbYS1mMC05XXsyfVwuW2EtZjAtOV0kYCwgaV9zdG9yYWdlLnNvdXJjZSkKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9zb3VyY2UgMjogdHJ1ZSIpCn0KCmFsbG93X3N0b3JhZ2Vfc291cmNlKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKSB7CiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9zb3VyY2UgMzogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIGlfc3RvcmFnZS5zb3VyY2UgPT0gIm5vbmUiCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDM6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX3NvdXJjZShwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDQ6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJzbWIiCgogICAgIyBQYXR0ZXJuOiAvLzxzdG9yYWdlLWFjY291bnQtbmFtZT4uZmlsZS5jb3JlLndpbmRvd3MubmV0LzxrOHMtUFZDLW5hbWU+CiAgICAjIFN0b3JhZ2UgYWNjb3VudCBuYW1lOiBodHRwczovL2xlYXJuLm1pY3Jvc29mdC5jb20vZW4tdXMvYXp1cmUvc3RvcmFnZS9jb21tb24vc3RvcmFnZS1hY2NvdW50LW92ZXJ2aWV3I3N0b3JhZ2UtYWNjb3VudC1uYW1lCiAgICAjIEs4cyBQVkMgbmFtZTogaHR0cHM6Ly9rdWJlcm5ldGVzLmlvL2RvY3MvY29uY2VwdHMvb3ZlcnZpZXcvd29ya2luZy13aXRoLW9iamVjdHMvbmFtZXMvI2Rucy1zdWJkb21haW4tbmFtZXMKICAgIHJlZ2V4Lm1hdGNoKGBeXC9cLyhbYS16MC05XXszLDI0fSlcLmZpbGVcLmNvcmVcLndpbmRvd3NcLm5ldFwvW2EtejAtOV0oW2EtejAtOS4tXXswLDI1MX1bYS16MC05XSk/JGAsIGlfc3RvcmFnZS5zb3VyY2UpCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDQ6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMTogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgIT0gIm92ZXJsYXlmcyIKICAgIHBfc3RvcmFnZS5vcHRpb25zID09IGlfc3RvcmFnZS5vcHRpb25zCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAxOiB0cnVlIikKfQphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIGNvdW50KHBfc3RvcmFnZS5vcHRpb25zKSA9PSAyCgogICAgcG9saWN5X2lkcyA6PSBzcGxpdChwX3N0b3JhZ2Uub3B0aW9uc1swXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBwb2xpY3lfaWRzID0iLCBwb2xpY3lfaWRzKQogICAgcG9saWN5X2lkcyA9PSBsYXllcl9pZHMKCiAgICBwb2xpY3lfaGFzaGVzIDo9IHNwbGl0KHBfc3RvcmFnZS5vcHRpb25zWzFdLCAiOiIpCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IHBvbGljeV9oYXNoZXMgPSIsIHBvbGljeV9oYXNoZXMpCgogICAgcF9jb3VudCA6PSBjb3VudChwb2xpY3lfaWRzKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBwX2NvdW50ID0iLCBwX2NvdW50KQogICAgcF9jb3VudCA+PSAxCiAgICBwX2NvdW50ID09IGNvdW50KHBvbGljeV9oYXNoZXMpCgogICAgaV9jb3VudCA6PSBjb3VudChpX3N0b3JhZ2Uub3B0aW9ucykKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogaV9jb3VudCA9IiwgaV9jb3VudCkKICAgIGlfY291bnQgPT0gcF9jb3VudCArIDMKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zWzBdID0iLCBpX3N0b3JhZ2Uub3B0aW9uc1swXSkKICAgIGlfc3RvcmFnZS5vcHRpb25zWzBdID09ICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQubGF5ZXItc3JjLXByZWZpeD0vdmFyL2xpYi9jb250YWluZXJkL2lvLmNvbnRhaW5lcmQuc25hcHNob3R0ZXIudjEudGFyZGV2L2xheWVycyIKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zW2lfY291bnQgLSAyXSA9IiwgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDJdKQogICAgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDJdID09ICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQub3ZlcmxheS1ydyIKCiAgICBsb3dlcmRpciA6PSBjb25jYXQoIj0iLCBbImxvd2VyZGlyIiwgcF9zdG9yYWdlLm9wdGlvbnNbMF1dKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBsb3dlcmRpciA9IiwgbG93ZXJkaXIpCgogICAgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDFdID09IGxvd2VyZGlyCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zW2lfY291bnQgLSAxXSA9IiwgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDFdKQoKICAgIGV2ZXJ5IGksIHBvbGljeV9pZCBpbiBwb2xpY3lfaWRzIHsKICAgICAgICBhbGxvd19vdmVybGF5X2xheWVyKHBvbGljeV9pZCwgcG9saWN5X2hhc2hlc1tpXSwgaV9zdG9yYWdlLm9wdGlvbnNbaSArIDFdKQogICAgfQoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogdHJ1ZSIpCn0KYWxsb3dfc3RvcmFnZV9vcHRpb25zKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKSB7CiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDM6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCiAgICBjb3VudChwX3N0b3JhZ2Uub3B0aW9ucykgPT0gMQoKICAgIHN0YXJ0c3dpdGgocF9zdG9yYWdlLm9wdGlvbnNbMF0sICIkKGhhc2giKQogICAgaGFzaF9zdWZmaXggOj0gdHJpbV9sZWZ0KHBfc3RvcmFnZS5vcHRpb25zWzBdLCAiJChoYXNoIikKCiAgICBlbmRzd2l0aChoYXNoX3N1ZmZpeCwgIikiKQogICAgaGFzaF9pbmRleCA6PSB0cmltX3JpZ2h0KGhhc2hfc3VmZml4LCAiKSIpCiAgICBpIDo9IHRvX251bWJlcihoYXNoX2luZGV4KQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAzOiBpID0iLCBpKQoKICAgIGhhc2hfb3B0aW9uIDo9IGNvbmNhdCgiPSIsIFsiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LnJvb3QtaGFzaCIsIHJvb3RfaGFzaGVzW2ldXSkKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMzogaGFzaF9vcHRpb24gPSIsIGhhc2hfb3B0aW9uKQoKICAgIGNvdW50KGlfc3RvcmFnZS5vcHRpb25zKSA9PSA0CiAgICBpX3N0b3JhZ2Uub3B0aW9uc1swXSA9PSAicm8iCiAgICBpX3N0b3JhZ2Uub3B0aW9uc1sxXSA9PSAiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmJsb2NrX2RldmljZT1maWxlIgogICAgaV9zdG9yYWdlLm9wdGlvbnNbMl0gPT0gImlvLmthdGFjb250YWluZXJzLmZzLW9wdC5pcy1sYXllciIKICAgIGlfc3RvcmFnZS5vcHRpb25zWzNdID09IGhhc2hfb3B0aW9uCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAzOiB0cnVlIikKfQphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgNDogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gInNtYiIKICAgIHBfb3B0c19jb3VudCA6PSBjb3VudChwX3N0b3JhZ2Uub3B0aW9ucykKICAgIGlfb3B0c19jb3VudCA6PSBjb3VudChpX3N0b3JhZ2Uub3B0aW9ucykKICAgIGlfb3B0c19jb3VudCA9PSBwX29wdHNfY291bnQgKyAyCgogICAgaV9vcHRfbWF0Y2hlcyA6PSBbaSB8IGkgOj0gaWR4OyBpZHggPCBwX29wdHNfY291bnQ7IHBfc3RvcmFnZS5vcHRpb25zW2lkeF0gPT0gaV9zdG9yYWdlLm9wdGlvbnNbaWR4XV0KICAgIGNvdW50KGlfb3B0X21hdGNoZXMpID09IHBfb3B0c19jb3VudAoKICAgIHN0YXJ0c3dpdGgoaV9zdG9yYWdlLm9wdGlvbnNbaV9vcHRzX2NvdW50LTJdLCAiYWRkcj0iKQogICAgY3JlZHMgPSBzcGxpdChpX3N0b3JhZ2Uub3B0aW9uc1tpX29wdHNfY291bnQtMV0sICIsIikKICAgIGNvdW50KGNyZWRzKSA9PSAyCiAgICBzdGFydHN3aXRoKGNyZWRzWzBdLCAidXNlcm5hbWU9IikKICAgIHN0YXJ0c3dpdGgoY3JlZHNbMV0sICJwYXNzd29yZD0iKQogICAgCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDQ6IHRydWUiKQp9CgphbGxvd19vdmVybGF5X2xheWVyKHBvbGljeV9pZCwgcG9saWN5X2hhc2gsIGlfb3B0aW9uKSB7CiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogcG9saWN5X2lkID0iLCBwb2xpY3lfaWQsICJwb2xpY3lfaGFzaCA9IiwgcG9saWN5X2hhc2gpCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogaV9vcHRpb24gPSIsIGlfb3B0aW9uKQoKICAgIHN0YXJ0c3dpdGgoaV9vcHRpb24sICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQubGF5ZXI9IikKICAgIGlfdmFsdWUgOj0gcmVwbGFjZShpX29wdGlvbiwgImlvLmthdGFjb250YWluZXJzLmZzLW9wdC5sYXllcj0iLCAiIikKICAgIGlfdmFsdWVfZGVjb2RlZCA6PSBiYXNlNjQuZGVjb2RlKGlfdmFsdWUpCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogaV92YWx1ZV9kZWNvZGVkID0iLCBpX3ZhbHVlX2RlY29kZWQpCgogICAgcG9saWN5X3N1ZmZpeCA6PSBjb25jYXQoIj0iLCBbInRhcixybyxpby5rYXRhY29udGFpbmVycy5mcy1vcHQuYmxvY2tfZGV2aWNlPWZpbGUsaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmlzLWxheWVyLGlvLmthdGFjb250YWluZXJzLmZzLW9wdC5yb290LWhhc2giLCBwb2xpY3lfaGFzaF0pCiAgICBwX3ZhbHVlIDo9IGNvbmNhdCgiLCIsIFtwb2xpY3lfaWQsIHBvbGljeV9zdWZmaXhdKQogICAgcHJpbnQoImFsbG93X292ZXJsYXlfbGF5ZXI6IHBfdmFsdWUgPSIsIHBfdmFsdWUpCgogICAgcF92YWx1ZSA9PSBpX3ZhbHVlX2RlY29kZWQKCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogdHJ1ZSIpCn0KCmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAidGFyIgoKICAgIHN0YXJ0c3dpdGgocF9zdG9yYWdlLm1vdW50X3BvaW50LCAiJChsYXllciIpCiAgICBtb3VudF9zdWZmaXggOj0gdHJpbV9sZWZ0KHBfc3RvcmFnZS5tb3VudF9wb2ludCwgIiQobGF5ZXIiKQoKICAgIGVuZHN3aXRoKG1vdW50X3N1ZmZpeCwgIikiKQogICAgbGF5ZXJfaW5kZXggOj0gdHJpbV9yaWdodChtb3VudF9zdWZmaXgsICIpIikKICAgIGkgOj0gdG9fbnVtYmVyKGxheWVyX2luZGV4KQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDE6IGkgPSIsIGkpCgogICAgbGF5ZXJfaWQgOj0gbGF5ZXJfaWRzW2ldCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMTogbGF5ZXJfaWQgPSIsIGxheWVyX2lkKQoKICAgIHBfbW91bnQgOj0gY29uY2F0KCIvIiwgWyIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L2xheWVycyIsIGxheWVyX2lkXSkKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCAxOiBwX21vdW50ID0iLCBwX21vdW50KQoKICAgIHBfbW91bnQgPT0gaV9zdG9yYWdlLm1vdW50X3BvaW50CgogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDE6IHRydWUiKQp9CmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAiZnVzZTMua2F0YS1vdmVybGF5IgoKICAgIG1vdW50MSA6PSByZXBsYWNlKHBfc3RvcmFnZS5tb3VudF9wb2ludCwgIiQoY3BhdGgpIiwgcG9saWN5X2RhdGEuY29tbW9uLmNwYXRoKQogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDI6IG1vdW50MiA9IiwgbW91bnQyKQoKICAgIG1vdW50MiA9PSBpX3N0b3JhZ2UubW91bnRfcG9pbnQKCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMjogdHJ1ZSIpCn0KYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKSB7CiAgICBwX3N0b3JhZ2UuZnN0eXBlID09ICJsb2NhbCIKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQyID0iLCBtb3VudDIpCgogICAgbW91bnQzIDo9IHJlcGxhY2UobW91bnQyLCAiJChzYW5kYm94LWlkKSIsIHNhbmRib3hfaWQpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQzID0iLCBtb3VudDMpCgogICAgcmVnZXgubWF0Y2gobW91bnQzLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCgogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDM6IHRydWUiKQp9CmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAiYmluZCIKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNDogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNDogbW91bnQyID0iLCBtb3VudDIpCgogICAgbW91bnQzIDo9IHJlcGxhY2UobW91bnQyLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDQ6IG1vdW50MyA9IiwgbW91bnQzKQoKICAgIHJlZ2V4Lm1hdGNoKG1vdW50MywgaV9zdG9yYWdlLm1vdW50X3BvaW50KQoKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA0OiB0cnVlIikKfQphbGxvd19tb3VudF9wb2ludChwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgYnVuZGxlX2lkLCBzYW5kYm94X2lkLCBsYXllcl9pZHMpIHsKICAgIHBfc3RvcmFnZS5mc3R5cGUgPT0gInRtcGZzIgoKICAgIG1vdW50MSA6PSBwX3N0b3JhZ2UubW91bnRfcG9pbnQKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA1OiBtb3VudDEgPSIsIG1vdW50MSkKCiAgICByZWdleC5tYXRjaChtb3VudDEsIGlfc3RvcmFnZS5tb3VudF9wb2ludCkKCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNTogdHJ1ZSIpCn0KYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKSB7CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogaV9zdG9yYWdlLm1vdW50X3BvaW50ID0iLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCiAgICBhbGxvd19kaXJlY3Rfdm9sX2RyaXZlcihwX3N0b3JhZ2UsIGlfc3RvcmFnZSkKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChzcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQyID0iLCBtb3VudDIpCgogICAgZGlyZWN0X3ZvbF9wYXRoIDo9IGlfc3RvcmFnZS5zb3VyY2UKICAgIG1vdW50MyA6PSByZXBsYWNlKG1vdW50MiwgIiQoYjY0LWRpcmVjdC12b2wtcGF0aCkiLCBiYXNlNjR1cmwuZW5jb2RlKGRpcmVjdF92b2xfcGF0aCkpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQzID0iLCBtb3VudDMpCgogICAgbW91bnQzID09IGlfc3RvcmFnZS5tb3VudF9wb2ludAoKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA2OiB0cnVlIikKfQoKYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIocF9zdG9yYWdlLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19kaXJlY3Rfdm9sX2RyaXZlciAxOiBzdGFydCIpCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCiAgICBwcmludCgiYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIgMTogdHJ1ZSIpCn0KYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIocF9zdG9yYWdlLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19kaXJlY3Rfdm9sX2RyaXZlciAyOiBzdGFydCIpCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJzbWIiCiAgICBwcmludCgiYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIgMjogdHJ1ZSIpCn0KCiMgRXhlY1Byb2Nlc3NSZXF1ZXN0LnByb2Nlc3MuQ2FwYWJpbGl0aWVzCmFsbG93X2V4ZWNfY2FwcyhpX2NhcHMpIHsKICAgIG5vdCBpX2NhcHMuQW1iaWVudAogICAgbm90IGlfY2Fwcy5Cb3VuZGluZwogICAgbm90IGlfY2Fwcy5FZmZlY3RpdmUKICAgIG5vdCBpX2NhcHMuSW5oZXJpdGFibGUKICAgIG5vdCBpX2NhcHMuUGVybWl0dGVkCn0KCiMgT0NJLlByb2Nlc3MuQ2FwYWJpbGl0aWVzCmFsbG93X2NhcHMocF9jYXBzLCBpX2NhcHMpIHsKICAgIHByaW50KCJhbGxvd19jYXBzOiBwb2xpY3kgQW1iaWVudCA9IiwgcF9jYXBzLkFtYmllbnQpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgQW1iaWVudCA9IiwgaV9jYXBzLkFtYmllbnQpCiAgICBtYXRjaF9jYXBzKHBfY2Fwcy5BbWJpZW50LCBpX2NhcHMuQW1iaWVudCkKCiAgICBwcmludCgiYWxsb3dfY2FwczogcG9saWN5IEJvdW5kaW5nID0iLCBwX2NhcHMuQm91bmRpbmcpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgQm91bmRpbmcgPSIsIGlfY2Fwcy5Cb3VuZGluZykKICAgIG1hdGNoX2NhcHMocF9jYXBzLkJvdW5kaW5nLCBpX2NhcHMuQm91bmRpbmcpCgogICAgcHJpbnQoImFsbG93X2NhcHM6IHBvbGljeSBFZmZlY3RpdmUgPSIsIHBfY2Fwcy5FZmZlY3RpdmUpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgRWZmZWN0aXZlID0iLCBpX2NhcHMuRWZmZWN0aXZlKQogICAgbWF0Y2hfY2FwcyhwX2NhcHMuRWZmZWN0aXZlLCBpX2NhcHMuRWZmZWN0aXZlKQoKICAgIHByaW50KCJhbGxvd19jYXBzOiBwb2xpY3kgSW5oZXJpdGFibGUgPSIsIHBfY2Fwcy5Jbmhlcml0YWJsZSkKICAgIHByaW50KCJhbGxvd19jYXBzOiBpbnB1dCBJbmhlcml0YWJsZSA9IiwgaV9jYXBzLkluaGVyaXRhYmxlKQogICAgbWF0Y2hfY2FwcyhwX2NhcHMuSW5oZXJpdGFibGUsIGlfY2Fwcy5Jbmhlcml0YWJsZSkKCiAgICBwcmludCgiYWxsb3dfY2FwczogcG9saWN5IFBlcm1pdHRlZCA9IiwgcF9jYXBzLlBlcm1pdHRlZCkKICAgIHByaW50KCJhbGxvd19jYXBzOiBpbnB1dCBQZXJtaXR0ZWQgPSIsIGlfY2Fwcy5QZXJtaXR0ZWQpCiAgICBtYXRjaF9jYXBzKHBfY2Fwcy5QZXJtaXR0ZWQsIGlfY2Fwcy5QZXJtaXR0ZWQpCn0KCm1hdGNoX2NhcHMocF9jYXBzLCBpX2NhcHMpIHsKICAgIHByaW50KCJtYXRjaF9jYXBzIDE6IHN0YXJ0IikKCiAgICBwX2NhcHMgPT0gaV9jYXBzCgogICAgcHJpbnQoIm1hdGNoX2NhcHMgMTogdHJ1ZSIpCn0KbWF0Y2hfY2FwcyhwX2NhcHMsIGlfY2FwcykgewogICAgcHJpbnQoIm1hdGNoX2NhcHMgMjogc3RhcnQiKQoKICAgIGNvdW50KHBfY2FwcykgPT0gMQogICAgcF9jYXBzWzBdID09ICIkKGRlZmF1bHRfY2FwcykiCgogICAgcHJpbnQoIm1hdGNoX2NhcHMgMjogZGVmYXVsdF9jYXBzID0iLCBwb2xpY3lfZGF0YS5jb21tb24uZGVmYXVsdF9jYXBzKQogICAgcG9saWN5X2RhdGEuY29tbW9uLmRlZmF1bHRfY2FwcyA9PSBpX2NhcHMKCiAgICBwcmludCgibWF0Y2hfY2FwcyAyOiB0cnVlIikKfQptYXRjaF9jYXBzKHBfY2FwcywgaV9jYXBzKSB7CiAgICBwcmludCgibWF0Y2hfY2FwcyAzOiBzdGFydCIpCgogICAgY291bnQocF9jYXBzKSA9PSAxCiAgICBwX2NhcHNbMF0gPT0gIiQocHJpdmlsZWdlZF9jYXBzKSIKCiAgICBwcmludCgibWF0Y2hfY2FwcyAzOiBwcml2aWxlZ2VkX2NhcHMgPSIsIHBvbGljeV9kYXRhLmNvbW1vbi5wcml2aWxlZ2VkX2NhcHMpCiAgICBwb2xpY3lfZGF0YS5jb21tb24ucHJpdmlsZWdlZF9jYXBzID09IGlfY2FwcwoKICAgIHByaW50KCJtYXRjaF9jYXBzIDM6IHRydWUiKQp9CgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgpjaGVja19kaXJlY3RvcnlfdHJhdmVyc2FsKGlfcGF0aCkgewogICAgbm90IHJlZ2V4Lm1hdGNoKCIoXnwvKS4uKCR8LykiLCBpX3BhdGgpCn0KCmNoZWNrX3N5bWxpbmtfc291cmNlKGlfc3JjKSB7CiAgICBpX3NyYyA9PSAiIgogICAgcHJpbnQoImNoZWNrX3N5bWxpbmtfc291cmNlIDE6IHRydWUiKQp9CmNoZWNrX3N5bWxpbmtfc291cmNlKGlfc3JjKSB7CiAgICBpX3NyYyAhPSAiIgogICAgcHJpbnQoImNoZWNrX3N5bWxpbmtfc291cmNlIDI6IGlfc3JjID0iLCBpX3NyYykKCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24uc19zb3VyY2UxLCBpX3NyYykKCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMjogdHJ1ZSIpCn0KY2hlY2tfc3ltbGlua19zb3VyY2UoaV9zcmMpIHsKICAgIGlfc3JjICE9ICIiCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMzogaV9zcmMgPSIsIGlfc3JjKQoKICAgIHJlZ2V4Lm1hdGNoKHBvbGljeV9kYXRhLmNvbW1vbi5zX3NvdXJjZTIsIGlfc3JjKQogICAgY2hlY2tfZGlyZWN0b3J5X3RyYXZlcnNhbChpX3NyYykKCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMzogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfc3RvcmFnZXMoaV9zdG9yYWdlcykgewogICAgcHJpbnQoImFsbG93X3NhbmRib3hfc3RvcmFnZXM6IGlfc3RvcmFnZXMgPSIsIGlfc3RvcmFnZXMpCgogICAgcF9zdG9yYWdlcyA6PSBwb2xpY3lfZGF0YS5zYW5kYm94LnN0b3JhZ2VzCiAgICBldmVyeSBpX3N0b3JhZ2UgaW4gaV9zdG9yYWdlcyB7CiAgICAgICAgYWxsb3dfc2FuZGJveF9zdG9yYWdlKHBfc3RvcmFnZXMsIGlfc3RvcmFnZSkKICAgIH0KCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9zdG9yYWdlczogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfc3RvcmFnZShwX3N0b3JhZ2VzLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IGlfc3RvcmFnZSA9IiwgaV9zdG9yYWdlKQoKICAgIHNvbWUgcF9zdG9yYWdlIGluIHBfc3RvcmFnZXMKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IHBfc3RvcmFnZSA9IiwgcF9zdG9yYWdlKQogICAgaV9zdG9yYWdlID09IHBfc3RvcmFnZQoKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IHRydWUiKQp9CgpDb3B5RmlsZVJlcXVlc3QgewogICAgcHJpbnQoIkNvcHlGaWxlUmVxdWVzdDogaW5wdXQucGF0aCA9IiwgaW5wdXQucGF0aCkKCiAgICBjaGVja19zeW1saW5rX3NvdXJjZShpbnB1dC5zeW1saW5rX3NyYykKICAgIGNoZWNrX2RpcmVjdG9yeV90cmF2ZXJzYWwoaW5wdXQucGF0aCkKCiAgICBzb21lIHJlZ2V4MSBpbiBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLkNvcHlGaWxlUmVxdWVzdAogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5jcGF0aCkKICAgIHJlZ2V4NCA6PSByZXBsYWNlKHJlZ2V4MywgIiQoYnVuZGxlLWlkKSIsIEJVTkRMRV9JRCkKICAgIHByaW50KCJDb3B5RmlsZVJlcXVlc3Q6IHJlZ2V4NCA9IiwgcmVnZXg0KQoKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4NCwgaW5wdXQucGF0aCkKCiAgICBwcmludCgiQ29weUZpbGVSZXF1ZXN0OiB0cnVlIikKfQoKQ3JlYXRlU2FuZGJveFJlcXVlc3QgewogICAgcHJpbnQoIkNyZWF0ZVNhbmRib3hSZXF1ZXN0OiBpbnB1dC5ndWVzdF9ob29rX3BhdGggPSIsIGlucHV0Lmd1ZXN0X2hvb2tfcGF0aCkKICAgIGNvdW50KGlucHV0Lmd1ZXN0X2hvb2tfcGF0aCkgPT0gMAoKICAgIHByaW50KCJDcmVhdGVTYW5kYm94UmVxdWVzdDogaW5wdXQua2VybmVsX21vZHVsZXMgPSIsIGlucHV0Lmtlcm5lbF9tb2R1bGVzKQogICAgY291bnQoaW5wdXQua2VybmVsX21vZHVsZXMpID09IDAKCiAgICBpX3BpZG5zIDo9IGlucHV0LnNhbmRib3hfcGlkbnMKICAgIHByaW50KCJDcmVhdGVTYW5kYm94UmVxdWVzdDogaV9waWRucyA9IiwgaV9waWRucykKICAgIGlfcGlkbnMgPT0gZmFsc2UKICAgIGFsbG93X3NhbmRib3hfc3RvcmFnZXMoaW5wdXQuc3RvcmFnZXMpCn0KCmFsbG93X2V4ZWMocF9jb250YWluZXIsIGlfcHJvY2VzcykgewogICAgcHJpbnQoImFsbG93X2V4ZWM6IHN0YXJ0IikKCiAgICBwX29jaSA9IHBfY29udGFpbmVyLk9DSQogICAgcF9zX25hbWUgPSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc19uYW1lc3BhY2UgPSBnZXRfc3RhdGVfdmFsKCJuYW1lc3BhY2UiKQogICAgYWxsb3dfcHJvYmVfcHJvY2VzcyhwX29jaS5Qcm9jZXNzLCBpX3Byb2Nlc3MsIHBfc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfZXhlYzogdHJ1ZSIpCn0KCmFsbG93X2ludGVyYWN0aXZlX2V4ZWMocF9jb250YWluZXIsIGlfcHJvY2VzcykgewogICAgcHJpbnQoImFsbG93X2ludGVyYWN0aXZlX2V4ZWM6IHN0YXJ0IikKCiAgICBwX29jaSA9IHBfY29udGFpbmVyLk9DSQogICAgcF9zX25hbWUgPSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc19uYW1lc3BhY2UgPSBnZXRfc3RhdGVfdmFsKCJuYW1lc3BhY2UiKQogICAgYWxsb3dfaW50ZXJhY3RpdmVfcHJvY2VzcyhwX29jaS5Qcm9jZXNzLCBpX3Byb2Nlc3MsIHBfc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfaW50ZXJhY3RpdmVfZXhlYzogdHJ1ZSIpCn0KCiMgVE9ETzogc2hvdWxkIG90aGVyIEV4ZWNQcm9jZXNzUmVxdWVzdCBpbnB1dCBkYXRhIGZpZWxkcyBiZSB2YWxpZGF0ZWQgYXMgd2VsbD8KRXhlY1Byb2Nlc3NSZXF1ZXN0IHsKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMTogaW5wdXQgPSIsIGlucHV0KQoKICAgIHNvbWUgcF9jb21tYW5kIGluIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuRXhlY1Byb2Nlc3NSZXF1ZXN0LmFsbG93ZWRfY29tbWFuZHMKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMTogcF9jb21tYW5kID0iLCBwX2NvbW1hbmQpCiAgICBwX2NvbW1hbmQgPT0gaW5wdXQucHJvY2Vzcy5BcmdzCgogICAgIyBUT0RPOiBtYXRjaCBwX2NvbnRhaW5lcidzIElEIHdpdGggdGhlIGlucHV0IGNvbnRhaW5lcl9pZC4KICAgIHNvbWUgcF9jb250YWluZXIgaW4gcG9saWN5X2RhdGEuY29udGFpbmVycwogICAgYWxsb3dfaW50ZXJhY3RpdmVfZXhlYyhwX2NvbnRhaW5lciwgaW5wdXQucHJvY2VzcykKCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDE6IHRydWUiKQp9CkV4ZWNQcm9jZXNzUmVxdWVzdCB7CiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDI6IGlucHV0ID0iLCBpbnB1dCkKCiAgICAjIFRPRE86IG1hdGNoIGlucHV0IGNvbnRhaW5lciBJRCB3aXRoIGl0cyBjb3JyZXNwb25kaW5nIGNvbnRhaW5lci5leGVjX2NvbW1hbmRzLgogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBzb21lIHBfY29tbWFuZCBpbiBwX2NvbnRhaW5lci5leGVjX2NvbW1hbmRzCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDI6IHBfY29tbWFuZCA9IiwgcF9jb21tYW5kKQoKICAgICMgVE9ETzogc2hvdWxkIG90aGVyIGlucHV0IGRhdGEgZmllbGRzIGJlIHZhbGlkYXRlZCBhcyB3ZWxsPwogICAgcF9jb21tYW5kID09IGlucHV0LnByb2Nlc3MuQXJncwoKICAgIGFsbG93X2V4ZWMocF9jb250YWluZXIsIGlucHV0LnByb2Nlc3MpCgogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAyOiB0cnVlIikKfQpFeGVjUHJvY2Vzc1JlcXVlc3QgewogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAzOiBpbnB1dCA9IiwgaW5wdXQpCgogICAgaV9jb21tYW5kID0gY29uY2F0KCIgIiwgaW5wdXQucHJvY2Vzcy5BcmdzKQogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAzOiBpX2NvbW1hbmQgPSIsIGlfY29tbWFuZCkKCiAgICBzb21lIHBfcmVnZXggaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5FeGVjUHJvY2Vzc1JlcXVlc3QucmVnZXgKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMzogcF9yZWdleCA9IiwgcF9yZWdleCkKCiAgICByZWdleC5tYXRjaChwX3JlZ2V4LCBpX2NvbW1hbmQpCgogICAgIyBUT0RPOiBtYXRjaCBwX2NvbnRhaW5lcidzIElEIHdpdGggdGhlIGlucHV0IGNvbnRhaW5lcl9pZC4KICAgIHNvbWUgcF9jb250YWluZXIgaW4gcG9saWN5X2RhdGEuY29udGFpbmVycwogICAgYWxsb3dfaW50ZXJhY3RpdmVfZXhlYyhwX2NvbnRhaW5lciwgaW5wdXQucHJvY2VzcykKCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDM6IHRydWUiKQp9CgpVcGRhdGVSb3V0ZXNSZXF1ZXN0IHsKICAgIHByaW50KCJVcGRhdGVSb3V0ZXNSZXF1ZXN0OiBpbnB1dCA9IiwgaW5wdXQpCiAgICBwcmludCgiVXBkYXRlUm91dGVzUmVxdWVzdDogcG9saWN5ID0iLCBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLlVwZGF0ZVJvdXRlc1JlcXVlc3QpCgogICAgaV9yb3V0ZXMgOj0gaW5wdXQucm91dGVzLlJvdXRlcwogICAgcF9zb3VyY2VfcmVnZXggPSBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLlVwZGF0ZVJvdXRlc1JlcXVlc3QuZm9yYmlkZGVuX3NvdXJjZV9yZWdleAogICAgcF9uYW1lcyA9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuVXBkYXRlUm91dGVzUmVxdWVzdC5mb3JiaWRkZW5fZGV2aWNlX25hbWVzCgogICAgZXZlcnkgaV9yb3V0ZSBpbiBpX3JvdXRlcyB7CiAgICAgICAgcHJpbnQoImlfcm91dGUuc291cmNlID0iLCBpX3JvdXRlLnNvdXJjZSkKICAgICAgICBldmVyeSBwX3JlZ2V4IGluIHBfc291cmNlX3JlZ2V4IHsKICAgICAgICAgICAgcHJpbnQoInBfcmVnZXggPSIsIHBfcmVnZXgpCiAgICAgICAgICAgIG5vdCByZWdleC5tYXRjaChwX3JlZ2V4LCBpX3JvdXRlLnNvdXJjZSkKICAgICAgICB9CgogICAgICAgIHByaW50KCJpX3JvdXRlLmRldmljZSA9IiwgaV9yb3V0ZS5kZXZpY2UpCiAgICAgICAgbm90IGlfcm91dGUuZGV2aWNlIGluIHBfbmFtZXMKICAgIH0KCiAgICBwcmludCgiVXBkYXRlUm91dGVzUmVxdWVzdDogdHJ1ZSIpCn0KClVwZGF0ZUludGVyZmFjZVJlcXVlc3QgewogICAgcHJpbnQoIlVwZGF0ZUludGVyZmFjZVJlcXVlc3Q6IGlucHV0ID0iLCBpbnB1dCkKICAgIHByaW50KCJVcGRhdGVJbnRlcmZhY2VSZXF1ZXN0OiBwb2xpY3kgPSIsIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuVXBkYXRlSW50ZXJmYWNlUmVxdWVzdCkKCiAgICBpX2ludGVyZmFjZSA6PSBpbnB1dC5pbnRlcmZhY2UKICAgIHBfZmxhZ3MgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmFsbG93X3Jhd19mbGFncwoKICAgICMgVHlwaWNhbGx5LCBqdXN0IElGRl9OT0FSUCBpcyB1c2VkLgogICAgYml0cy5hbmQoaV9pbnRlcmZhY2UucmF3X2ZsYWdzLCBiaXRzLm5lZ2F0ZShwX2ZsYWdzKSkgPT0gMAoKICAgIHBfbmFtZXMgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmZvcmJpZGRlbl9uYW1lcwoKICAgIG5vdCBpX2ludGVyZmFjZS5uYW1lIGluIHBfbmFtZXMKCiAgICBwX2h3YWRkcnMgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmZvcmJpZGRlbl9od19hZGRycwoKICAgIG5vdCBpX2ludGVyZmFjZS5od0FkZHIgaW4gcF9od2FkZHJzCgogICAgcHJpbnQoIlVwZGF0ZUludGVyZmFjZVJlcXVlc3Q6IHRydWUiKQp9CgpDbG9zZVN0ZGluUmVxdWVzdCB7CiAgICBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLkNsb3NlU3RkaW5SZXF1ZXN0ID09IHRydWUKfQoKUmVhZFN0cmVhbVJlcXVlc3QgewogICAgcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5SZWFkU3RyZWFtUmVxdWVzdCA9PSB0cnVlCn0KClVwZGF0ZUVwaGVtZXJhbE1vdW50c1JlcXVlc3QgewogICAgcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVFcGhlbWVyYWxNb3VudHNSZXF1ZXN0ID09IHRydWUKfQoKV3JpdGVTdHJlYW1SZXF1ZXN0IHsKICAgIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuV3JpdGVTdHJlYW1SZXF1ZXN0ID09IHRydWUKfQoKcG9saWN5X2RhdGEgOj0gewogICJjb250YWluZXJzIjogWwogICAgewogICAgICAiT0NJIjogewogICAgICAgICJWZXJzaW9uIjogIjEuMS4wLXJjLjEiLAogICAgICAgICJQcm9jZXNzIjogewogICAgICAgICAgIlRlcm1pbmFsIjogZmFsc2UsCiAgICAgICAgICAiVXNlciI6IHsKICAgICAgICAgICAgIlVJRCI6IDY1NTM1LAogICAgICAgICAgICAiR0lEIjogNjU1MzUsCiAgICAgICAgICAgICJBZGRpdGlvbmFsR2lkcyI6IFtdLAogICAgICAgICAgICAiVXNlcm5hbWUiOiAiIgogICAgICAgICAgfSwKICAgICAgICAgICJEZXByZWNhdGVkQXJncyI6IFsKICAgICAgICAgICAgIi9wYXVzZSIKICAgICAgICAgIF0sCiAgICAgICAgICAiQXJncyI6IFsKICAgICAgICAgICAgIi9wYXVzZSIKICAgICAgICAgIF0sCiAgICAgICAgICAiRW52IjogWwogICAgICAgICAgICAiUEFUSD0vdXNyL2xvY2FsL3NiaW46L3Vzci9sb2NhbC9iaW46L3Vzci9zYmluOi91c3IvYmluOi9zYmluOi9iaW4iCiAgICAgICAgICBdLAogICAgICAgICAgIkN3ZCI6ICIvIiwKICAgICAgICAgICJDYXBhYmlsaXRpZXMiOiB7CiAgICAgICAgICAgICJBbWJpZW50IjogW10sCiAgICAgICAgICAgICJCb3VuZGluZyI6IFsKICAgICAgICAgICAgICAiJChkZWZhdWx0X2NhcHMpIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiRWZmZWN0aXZlIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJJbmhlcml0YWJsZSI6IFtdLAogICAgICAgICAgICAiUGVybWl0dGVkIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICAiTm9OZXdQcml2aWxlZ2VzIjogdHJ1ZQogICAgICAgIH0sCiAgICAgICAgIlJvb3QiOiB7CiAgICAgICAgICAiUGF0aCI6ICIkKGNwYXRoKS8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgIlJlYWRvbmx5IjogdHJ1ZQogICAgICAgIH0sCiAgICAgICAgIk1vdW50cyI6IFsKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9wcm9jIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJwcm9jIiwKICAgICAgICAgICAgInR5cGVfIjogInByb2MiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2IiwKICAgICAgICAgICAgInNvdXJjZSI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJzdHJpY3RhdGltZSIsCiAgICAgICAgICAgICAgIm1vZGU9NzU1IiwKICAgICAgICAgICAgICAic2l6ZT02NTUzNmsiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L3B0cyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiZGV2cHRzIiwKICAgICAgICAgICAgInR5cGVfIjogImRldnB0cyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJuZXdpbnN0YW5jZSIsCiAgICAgICAgICAgICAgInB0bXhtb2RlPTA2NjYiLAogICAgICAgICAgICAgICJtb2RlPTA2MjAiLAogICAgICAgICAgICAgICJnaWQ9NSIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvc2htIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L3NobSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi9tcXVldWUiLAogICAgICAgICAgICAic291cmNlIjogIm1xdWV1ZSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJtcXVldWUiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvc3lzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJzeXNmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJzeXNmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2V0Yy9yZXNvbHYuY29uZiIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClyZXNvbHYuY29uZiQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJvIiwKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9kZXYiLAogICAgICAgICAgICAgICJub2V4ZWMiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0KICAgICAgICBdLAogICAgICAgICJBbm5vdGF0aW9ucyI6IHsKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmJ1bmRsZV9wYXRoIjogIi9ydW4vY29udGFpbmVyZC9pby5jb250YWluZXJkLnJ1bnRpbWUudjIudGFzay9rOHMuaW8vJChidW5kbGUtaWQpIiwKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIjogInBvZF9zYW5kYm94IiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSI6ICJzYW5kYm94IiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWlkIjogIl5bYS16MC05XXs2NH0kIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWxvZy1kaXJlY3RvcnkiOiAiXi92YXIvbG9nL3BvZHMvJChzYW5kYm94LW5hbWVzcGFjZSlfJChzYW5kYm94LW5hbWUpX1swLTlhLWZdezh9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezEyfSQiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZXNwYWNlIjogIiIsCiAgICAgICAgICAibmVyZGN0bC9uZXR3b3JrLW5hbWVzcGFjZSI6ICJeL3Zhci9ydW4vbmV0bnMvY25pLVswLTlhLWZdezh9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezEyfSQiCiAgICAgICAgfSwKICAgICAgICAiTGludXgiOiB7CiAgICAgICAgICAiTmFtZXNwYWNlcyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICJUeXBlIjogImlwYyIsCiAgICAgICAgICAgICAgIlBhdGgiOiAiIgogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgIlR5cGUiOiAidXRzIiwKICAgICAgICAgICAgICAiUGF0aCI6ICIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiVHlwZSI6ICJtb3VudCIsCiAgICAgICAgICAgICAgIlBhdGgiOiAiIgogICAgICAgICAgICB9CiAgICAgICAgICBdLAogICAgICAgICAgIk1hc2tlZFBhdGhzIjogWwogICAgICAgICAgICAiL3Byb2MvYWNwaSIsCiAgICAgICAgICAgICIvcHJvYy9hc291bmQiLAogICAgICAgICAgICAiL3Byb2Mva2NvcmUiLAogICAgICAgICAgICAiL3Byb2Mva2V5cyIsCiAgICAgICAgICAgICIvcHJvYy9sYXRlbmN5X3N0YXRzIiwKICAgICAgICAgICAgIi9wcm9jL3RpbWVyX2xpc3QiLAogICAgICAgICAgICAiL3Byb2MvdGltZXJfc3RhdHMiLAogICAgICAgICAgICAiL3Byb2Mvc2NoZWRfZGVidWciLAogICAgICAgICAgICAiL3N5cy9maXJtd2FyZSIsCiAgICAgICAgICAgICIvcHJvYy9zY3NpIgogICAgICAgICAgXSwKICAgICAgICAgICJSZWFkb25seVBhdGhzIjogWwogICAgICAgICAgICAiL3Byb2MvYnVzIiwKICAgICAgICAgICAgIi9wcm9jL2ZzIiwKICAgICAgICAgICAgIi9wcm9jL2lycSIsCiAgICAgICAgICAgICIvcHJvYy9zeXMiLAogICAgICAgICAgICAiL3Byb2Mvc3lzcnEtdHJpZ2dlciIKICAgICAgICAgIF0sCiAgICAgICAgICAiRGV2aWNlcyI6IFtdLAogICAgICAgICAgIlN5c2N0bCI6IHsKICAgICAgICAgICAgIm5ldC5pcHY0LmlwX3VucHJpdmlsZWdlZF9wb3J0X3N0YXJ0IjogIjAiLAogICAgICAgICAgICAibmV0LmlwdjQucGluZ19ncm91cF9yYW5nZSI6ICIwIDIxNDc0ODM2NDciCiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9LAogICAgICAic3RvcmFnZXMiOiBbCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJibGsiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogInRhciIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIiQoaGFzaDApIgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGxheWVyMCkiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJvdmVybGF5ZnMiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogImZ1c2UzLmthdGEtb3ZlcmxheSIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIjVhNWFhZDgwMDU1ZmYyMDAxMmE1MGRjMjVmOGRmN2EyOTkyNDQ3NDMyNGQ2NWY3ZDUzMDZlZThlZTI3ZmY3MWQiLAogICAgICAgICAgICAiODE3MjUwZjFhM2UzMzZkYTc2ZjViZDNmYTc4NGUxYjI2ZDk1OWI5YzEzMTg3NjgxNWJhMjYwNDA0OGI3MGMxOCIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChjcGF0aCkvJChidW5kbGUtaWQpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9CiAgICAgIF0sCiAgICAgICJkZXZpY2VzIjogW10sCiAgICAgICJzYW5kYm94X3BpZG5zIjogZmFsc2UsCiAgICAgICJleGVjX2NvbW1hbmRzIjogW10sCiAgICAgICJlbnZfbWFwIjogewogICAgICAgICJQQVRIIjogIi91c3IvbG9jYWwvc2JpbjovdXNyL2xvY2FsL2JpbjovdXNyL3NiaW46L3Vzci9iaW46L3NiaW46L2JpbiIKICAgICAgfQogICAgfSwKICAgIHsKICAgICAgIk9DSSI6IHsKICAgICAgICAiVmVyc2lvbiI6ICIxLjEuMC1yYy4xIiwKICAgICAgICAiUHJvY2VzcyI6IHsKICAgICAgICAgICJUZXJtaW5hbCI6IGZhbHNlLAogICAgICAgICAgIlVzZXIiOiB7CiAgICAgICAgICAgICJVSUQiOiAwLAogICAgICAgICAgICAiR0lEIjogMCwKICAgICAgICAgICAgIkFkZGl0aW9uYWxHaWRzIjogW10sCiAgICAgICAgICAgICJVc2VybmFtZSI6ICIiCiAgICAgICAgICB9LAogICAgICAgICAgIkRlcHJlY2F0ZWRBcmdzIjogWwogICAgICAgICAgICAiL2hvc3RwYXRocGx1Z2luIiwKICAgICAgICAgICAgIi0tZHJpdmVybmFtZT1ob3N0cGF0aC5jc2kuazhzLmlvIiwKICAgICAgICAgICAgIi0tdj01IiwKICAgICAgICAgICAgIi0tZW5kcG9pbnQ9dW5peDovLy9jc2kvY3NpLnNvY2siLAogICAgICAgICAgICAiLS1ub2RlaWQ9JChub2RlLW5hbWUpIgogICAgICAgICAgXSwKICAgICAgICAgICJBcmdzIjogWwogICAgICAgICAgICAiL2hvc3RwYXRocGx1Z2luIiwKICAgICAgICAgICAgIi0tZHJpdmVybmFtZT1ob3N0cGF0aC5jc2kuazhzLmlvIiwKICAgICAgICAgICAgIi0tdj01IiwKICAgICAgICAgICAgIi0tZW5kcG9pbnQ9JChDU0lfRU5EUE9JTlQpIiwKICAgICAgICAgICAgIi0tbm9kZWlkPSQoS1VCRV9OT0RFX05BTUUpIgogICAgICAgICAgXSwKICAgICAgICAgICJFbnYiOiBbCiAgICAgICAgICAgICJQQVRIPS91c3IvbG9jYWwvc2JpbjovdXNyL2xvY2FsL2JpbjovdXNyL3NiaW46L3Vzci9iaW46L3NiaW46L2JpbiIsCiAgICAgICAgICAgICJIT1NUTkFNRT0kKGhvc3QtbmFtZSkiLAogICAgICAgICAgICAiQ1NJX0VORFBPSU5UPXVuaXg6Ly8vY3NpL2NzaS5zb2NrIiwKICAgICAgICAgICAgIktVQkVfTk9ERV9OQU1FPSQobm9kZS1uYW1lKSIKICAgICAgICAgIF0sCiAgICAgICAgICAiQ3dkIjogIi8iLAogICAgICAgICAgIkNhcGFiaWxpdGllcyI6IHsKICAgICAgICAgICAgIkFtYmllbnQiOiBbXSwKICAgICAgICAgICAgIkJvdW5kaW5nIjogWwogICAgICAgICAgICAgICIkKHByaXZpbGVnZWRfY2FwcykiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJFZmZlY3RpdmUiOiBbCiAgICAgICAgICAgICAgIiQocHJpdmlsZWdlZF9jYXBzKSIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgIkluaGVyaXRhYmxlIjogW10sCiAgICAgICAgICAgICJQZXJtaXR0ZWQiOiBbCiAgICAgICAgICAgICAgIiQocHJpdmlsZWdlZF9jYXBzKSIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgICJOb05ld1ByaXZpbGVnZXMiOiBmYWxzZQogICAgICAgIH0sCiAgICAgICAgIlJvb3QiOiB7CiAgICAgICAgICAiUGF0aCI6ICIkKGNwYXRoKS8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgIlJlYWRvbmx5IjogZmFsc2UKICAgICAgICB9LAogICAgICAgICJNb3VudHMiOiBbCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvcHJvYyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAicHJvYyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJwcm9jIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAgICAgIm5vZGV2IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2RldiIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiL2RldiIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJydyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvcHRzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJkZXZwdHMiLAogICAgICAgICAgICAidHlwZV8iOiAiZGV2cHRzIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAgICAgIm5ld2luc3RhbmNlIiwKICAgICAgICAgICAgICAicHRteG1vZGU9MDY2NiIsCiAgICAgICAgICAgICAgIm1vZGU9MDYyMCIsCiAgICAgICAgICAgICAgImdpZD01IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi9zaG0iLAogICAgICAgICAgICAic291cmNlIjogIi9ydW4va2F0YS1jb250YWluZXJzL3NhbmRib3gvc2htIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L21xdWV1ZSIsCiAgICAgICAgICAgICJzb3VyY2UiOiAibXF1ZXVlIiwKICAgICAgICAgICAgInR5cGVfIjogIm1xdWV1ZSIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9zeXMiLAogICAgICAgICAgICAic291cmNlIjogInN5c2ZzIiwKICAgICAgICAgICAgInR5cGVfIjogInN5c2ZzIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAgICAgIm5vZGV2IiwKICAgICAgICAgICAgICAicnciCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvc3lzL2ZzL2Nncm91cCIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiY2dyb3VwIiwKICAgICAgICAgICAgInR5cGVfIjogImNncm91cCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIsCiAgICAgICAgICAgICAgInJlbGF0aW1lIiwKICAgICAgICAgICAgICAicnciCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZXRjL2hvc3RzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KWhvc3RzJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJydyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvdGVybWluYXRpb24tbG9nIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KXRlcm1pbmF0aW9uLWxvZyQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicnciCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZXRjL2hvc3RuYW1lIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KWhvc3RuYW1lJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJydyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9ldGMvcmVzb2x2LmNvbmYiLAogICAgICAgICAgICAic291cmNlIjogIiQoc2ZwcmVmaXgpcmVzb2x2LmNvbmYkIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJ3IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL3Zhci9ydW4vc2VjcmV0cy9rdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50IiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KXNlcnZpY2VhY2NvdW50JCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJybyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi92YXIvcnVuL3NlY3JldHMvYXp1cmUvdG9rZW5zIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KXRva2VucyQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicm8iCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvY3NpIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KWNzaSQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicnciCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvdmFyL2xpYi9rdWJlbGV0L3BvZHMiLAogICAgICAgICAgICAic291cmNlIjogIiQoc2ZwcmVmaXgpcG9kcyQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicnciCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvdmFyL2xpYi9rdWJlbGV0L3BsdWdpbnMiLAogICAgICAgICAgICAic291cmNlIjogIiQoc2ZwcmVmaXgpcGx1Z2lucyQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicnciCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvY3NpLWRhdGEtZGlyIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KWNzaS1kYXRhLWRpciQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicnciCiAgICAgICAgICAgIF0KICAgICAgICAgIH0KICAgICAgICBdLAogICAgICAgICJBbm5vdGF0aW9ucyI6IHsKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmJ1bmRsZV9wYXRoIjogIi9ydW4vY29udGFpbmVyZC9pby5jb250YWluZXJkLnJ1bnRpbWUudjIudGFzay9rOHMuaW8vJChidW5kbGUtaWQpIiwKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIjogInBvZF9jb250YWluZXIiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLmNvbnRhaW5lci1uYW1lIjogImhvc3RwYXRoIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSI6ICJjb250YWluZXIiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLmltYWdlLW5hbWUiOiAicmVnaXN0cnkuazhzLmlvL3NpZy1zdG9yYWdlL2hvc3RwYXRocGx1Z2luOnYxLjEwLjAiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtaWQiOiAiXlthLXowLTldezY0fSQiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZXNwYWNlIjogIiIKICAgICAgICB9LAogICAgICAgICJMaW51eCI6IHsKICAgICAgICAgICJOYW1lc3BhY2VzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgIlR5cGUiOiAiaXBjIiwKICAgICAgICAgICAgICAiUGF0aCI6ICIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiVHlwZSI6ICJ1dHMiLAogICAgICAgICAgICAgICJQYXRoIjogIiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJUeXBlIjogIm1vdW50IiwKICAgICAgICAgICAgICAiUGF0aCI6ICIiCiAgICAgICAgICAgIH0KICAgICAgICAgIF0sCiAgICAgICAgICAiTWFza2VkUGF0aHMiOiBbXSwKICAgICAgICAgICJSZWFkb25seVBhdGhzIjogW10sCiAgICAgICAgICAiRGV2aWNlcyI6IFtdLAogICAgICAgICAgIlN5c2N0bCI6IHsKICAgICAgICAgICAgIm5ldC5pcHY0LmlwX3VucHJpdmlsZWdlZF9wb3J0X3N0YXJ0IjogIjAiLAogICAgICAgICAgICAibmV0LmlwdjQucGluZ19ncm91cF9yYW5nZSI6ICIwIDIxNDc0ODM2NDciCiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9LAogICAgICAic3RvcmFnZXMiOiBbCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJibGsiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogInRhciIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIiQoaGFzaDApIgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGxheWVyMCkiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJibGsiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogInRhciIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIiQoaGFzaDEpIgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGxheWVyMSkiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJibGsiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogInRhciIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIiQoaGFzaDIpIgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGxheWVyMikiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJvdmVybGF5ZnMiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogImZ1c2UzLmthdGEtb3ZlcmxheSIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgImNkY2Y0ODMyYTA2ZWM1MjhlYzM0ODBlN2M5ZmI4Y2Q2ZjA2ZWJlNTJkOWRiYTcxNTM1OTMxZGUwYjI0MGFmOTI6MTYyZDZlNWQzMzAzMzFlMjFhOTNkZmQ3Nzk1NWU0ZDBhYjZmMTUyYTkyOTdiODQwOTE3NzkyNDIzZTE3M2Y1YTo1MzgyNzM5MTVkZGU4MzU1ZTgxMTY0NzBiNzU0YzkyZDAxMTdiMTE0ZTA4N2MyMGZjMDc1NDUzNzZhNTQ4MjQyIiwKICAgICAgICAgICAgIjkyZjEyNWRkODM5ZGZjMGUzZjQyZGRiNDUyNjMxYTk4MTdkZGI3MzQ3NWZiMTdjNjQxYWU0YzdhMDdlODI5ZjU6ZTYzMzA4ZGM2OWUzM2NjOTQ5YTQxODlkZDQ2NGQwNjhmZjM5YjdkNzNkYmM2YjI2ZDkxNDlkOWQxM2UxZGQ4Yjo2MjI1MWQ4NWZkZjE4MzllNjc5NTAzZDI5NmM4YTJjYzIzYzhjNzQ5ODQ0ZDMyNDFlMDkwNTZiNTU5OTdiOTkxIgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGNwYXRoKS8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0KICAgICAgXSwKICAgICAgImRldmljZXMiOiBbXSwKICAgICAgInNhbmRib3hfcGlkbnMiOiBmYWxzZSwKICAgICAgImV4ZWNfY29tbWFuZHMiOiBbXSwKICAgICAgImVudl9tYXAiOiB7CiAgICAgICAgIkNTSV9FTkRQT0lOVCI6ICJ1bml4Oi8vL2NzaS9jc2kuc29jayIsCiAgICAgICAgIkhPU1ROQU1FIjogIiQoaG9zdC1uYW1lKSIsCiAgICAgICAgIktVQkVfTk9ERV9OQU1FIjogIiQobm9kZS1uYW1lKSIsCiAgICAgICAgIlBBVEgiOiAiL3Vzci9sb2NhbC9zYmluOi91c3IvbG9jYWwvYmluOi91c3Ivc2JpbjovdXNyL2Jpbjovc2JpbjovYmluIgogICAgICB9CiAgICB9LAogICAgewogICAgICAiT0NJIjogewogICAgICAgICJWZXJzaW9uIjogIjEuMS4wLXJjLjEiLAogICAgICAgICJQcm9jZXNzIjogewogICAgICAgICAgIlRlcm1pbmFsIjogZmFsc2UsCiAgICAgICAgICAiVXNlciI6IHsKICAgICAgICAgICAgIlVJRCI6IDAsCiAgICAgICAgICAgICJHSUQiOiAwLAogICAgICAgICAgICAiQWRkaXRpb25hbEdpZHMiOiBbXSwKICAgICAgICAgICAgIlVzZXJuYW1lIjogIiIKICAgICAgICAgIH0sCiAgICAgICAgICAiRGVwcmVjYXRlZEFyZ3MiOiBbCiAgICAgICAgICAgICIvY3NpLWV4dGVybmFsLWhlYWx0aC1tb25pdG9yLWNvbnRyb2xsZXIiLAogICAgICAgICAgICAiLS12PTUiLAogICAgICAgICAgICAiLS1jc2ktYWRkcmVzcz0vY3NpL2NzaS5zb2NrIiwKICAgICAgICAgICAgIi0tbGVhZGVyLWVsZWN0aW9uIgogICAgICAgICAgXSwKICAgICAgICAgICJBcmdzIjogWwogICAgICAgICAgICAiL2NzaS1leHRlcm5hbC1oZWFsdGgtbW9uaXRvci1jb250cm9sbGVyIiwKICAgICAgICAgICAgIi0tdj01IiwKICAgICAgICAgICAgIi0tY3NpLWFkZHJlc3M9JChBRERSRVNTKSIsCiAgICAgICAgICAgICItLWxlYWRlci1lbGVjdGlvbiIKICAgICAgICAgIF0sCiAgICAgICAgICAiRW52IjogWwogICAgICAgICAgICAiUEFUSD0vdXNyL2xvY2FsL3NiaW46L3Vzci9sb2NhbC9iaW46L3Vzci9zYmluOi91c3IvYmluOi9zYmluOi9iaW4iLAogICAgICAgICAgICAiU1NMX0NFUlRfRklMRT0vZXRjL3NzbC9jZXJ0cy9jYS1jZXJ0aWZpY2F0ZXMuY3J0IiwKICAgICAgICAgICAgIkhPU1ROQU1FPSQoaG9zdC1uYW1lKSIsCiAgICAgICAgICAgICJBRERSRVNTPS9jc2kvY3NpLnNvY2siCiAgICAgICAgICBdLAogICAgICAgICAgIkN3ZCI6ICIvIiwKICAgICAgICAgICJDYXBhYmlsaXRpZXMiOiB7CiAgICAgICAgICAgICJBbWJpZW50IjogW10sCiAgICAgICAgICAgICJCb3VuZGluZyI6IFsKICAgICAgICAgICAgICAiJChkZWZhdWx0X2NhcHMpIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiRWZmZWN0aXZlIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJJbmhlcml0YWJsZSI6IFtdLAogICAgICAgICAgICAiUGVybWl0dGVkIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICAiTm9OZXdQcml2aWxlZ2VzIjogZmFsc2UKICAgICAgICB9LAogICAgICAgICJSb290IjogewogICAgICAgICAgIlBhdGgiOiAiJChjcGF0aCkvJChidW5kbGUtaWQpIiwKICAgICAgICAgICJSZWFkb25seSI6IGZhbHNlCiAgICAgICAgfSwKICAgICAgICAiTW91bnRzIjogWwogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL3Byb2MiLAogICAgICAgICAgICAic291cmNlIjogInByb2MiLAogICAgICAgICAgICAidHlwZV8iOiAicHJvYyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYiLAogICAgICAgICAgICAic291cmNlIjogInRtcGZzIiwKICAgICAgICAgICAgInR5cGVfIjogInRtcGZzIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgInN0cmljdGF0aW1lIiwKICAgICAgICAgICAgICAibW9kZT03NTUiLAogICAgICAgICAgICAgICJzaXplPTY1NTM2ayIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvcHRzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJkZXZwdHMiLAogICAgICAgICAgICAidHlwZV8iOiAiZGV2cHRzIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAgICAgIm5ld2luc3RhbmNlIiwKICAgICAgICAgICAgICAicHRteG1vZGU9MDY2NiIsCiAgICAgICAgICAgICAgIm1vZGU9MDYyMCIsCiAgICAgICAgICAgICAgImdpZD01IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi9zaG0iLAogICAgICAgICAgICAic291cmNlIjogIi9ydW4va2F0YS1jb250YWluZXJzL3NhbmRib3gvc2htIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L21xdWV1ZSIsCiAgICAgICAgICAgICJzb3VyY2UiOiAibXF1ZXVlIiwKICAgICAgICAgICAgInR5cGVfIjogIm1xdWV1ZSIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9zeXMiLAogICAgICAgICAgICAic291cmNlIjogInN5c2ZzIiwKICAgICAgICAgICAgInR5cGVfIjogInN5c2ZzIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAgICAgIm5vZGV2IiwKICAgICAgICAgICAgICAicm8iCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvc3lzL2ZzL2Nncm91cCIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiY2dyb3VwIiwKICAgICAgICAgICAgInR5cGVfIjogImNncm91cCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIsCiAgICAgICAgICAgICAgInJlbGF0aW1lIiwKICAgICAgICAgICAgICAicm8iCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZXRjL2hvc3RzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KWhvc3RzJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJydyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvdGVybWluYXRpb24tbG9nIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KXRlcm1pbmF0aW9uLWxvZyQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicnciCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZXRjL2hvc3RuYW1lIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KWhvc3RuYW1lJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJydyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9ldGMvcmVzb2x2LmNvbmYiLAogICAgICAgICAgICAic291cmNlIjogIiQoc2ZwcmVmaXgpcmVzb2x2LmNvbmYkIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJ3IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL3Zhci9ydW4vc2VjcmV0cy9rdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50IiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KXNlcnZpY2VhY2NvdW50JCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJybyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi92YXIvcnVuL3NlY3JldHMvYXp1cmUvdG9rZW5zIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KXRva2VucyQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicm8iCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvY3NpIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KWNzaSQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicnciCiAgICAgICAgICAgIF0KICAgICAgICAgIH0KICAgICAgICBdLAogICAgICAgICJBbm5vdGF0aW9ucyI6IHsKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmJ1bmRsZV9wYXRoIjogIi9ydW4vY29udGFpbmVyZC9pby5jb250YWluZXJkLnJ1bnRpbWUudjIudGFzay9rOHMuaW8vJChidW5kbGUtaWQpIiwKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIjogInBvZF9jb250YWluZXIiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLmNvbnRhaW5lci1uYW1lIjogImNzaS1leHRlcm5hbC1oZWFsdGgtbW9uaXRvci1jb250cm9sbGVyIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSI6ICJjb250YWluZXIiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLmltYWdlLW5hbWUiOiAicmVnaXN0cnkuazhzLmlvL3NpZy1zdG9yYWdlL2NzaS1leHRlcm5hbC1oZWFsdGgtbW9uaXRvci1jb250cm9sbGVyOnYwLjcuMCIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCI6ICJeW2EtejAtOV17NjR9JCIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1uYW1lc3BhY2UiOiAiIgogICAgICAgIH0sCiAgICAgICAgIkxpbnV4IjogewogICAgICAgICAgIk5hbWVzcGFjZXMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiVHlwZSI6ICJpcGMiLAogICAgICAgICAgICAgICJQYXRoIjogIiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJUeXBlIjogInV0cyIsCiAgICAgICAgICAgICAgIlBhdGgiOiAiIgogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgIlR5cGUiOiAibW91bnQiLAogICAgICAgICAgICAgICJQYXRoIjogIiIKICAgICAgICAgICAgfQogICAgICAgICAgXSwKICAgICAgICAgICJNYXNrZWRQYXRocyI6IFsKICAgICAgICAgICAgIi9wcm9jL2FjcGkiLAogICAgICAgICAgICAiL3Byb2Mva2NvcmUiLAogICAgICAgICAgICAiL3Byb2Mva2V5cyIsCiAgICAgICAgICAgICIvcHJvYy9sYXRlbmN5X3N0YXRzIiwKICAgICAgICAgICAgIi9wcm9jL3RpbWVyX2xpc3QiLAogICAgICAgICAgICAiL3Byb2MvdGltZXJfc3RhdHMiLAogICAgICAgICAgICAiL3Byb2Mvc2NoZWRfZGVidWciLAogICAgICAgICAgICAiL3Byb2Mvc2NzaSIsCiAgICAgICAgICAgICIvc3lzL2Zpcm13YXJlIgogICAgICAgICAgXSwKICAgICAgICAgICJSZWFkb25seVBhdGhzIjogWwogICAgICAgICAgICAiL3Byb2MvYXNvdW5kIiwKICAgICAgICAgICAgIi9wcm9jL2J1cyIsCiAgICAgICAgICAgICIvcHJvYy9mcyIsCiAgICAgICAgICAgICIvcHJvYy9pcnEiLAogICAgICAgICAgICAiL3Byb2Mvc3lzIiwKICAgICAgICAgICAgIi9wcm9jL3N5c3JxLXRyaWdnZXIiCiAgICAgICAgICBdLAogICAgICAgICAgIkRldmljZXMiOiBbXSwKICAgICAgICAgICJTeXNjdGwiOiB7CiAgICAgICAgICAgICJuZXQuaXB2NC5pcF91bnByaXZpbGVnZWRfcG9ydF9zdGFydCI6ICIwIiwKICAgICAgICAgICAgIm5ldC5pcHY0LnBpbmdfZ3JvdXBfcmFuZ2UiOiAiMCAyMTQ3NDgzNjQ3IgogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSwKICAgICAgInN0b3JhZ2VzIjogWwogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2gwKSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjApIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2gxKSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjEpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAib3ZlcmxheWZzIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJmdXNlMy5rYXRhLW92ZXJsYXkiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIwMDBjZTgzZTBmOTgzNzllMWE1NWRiMWIxZWFiYTllMGM4YjM3YWM5MGRlMzdiMjAzNTA2YjI4NjVhZTcwNWQwOjlkNmMxZTlmNDZmNTQ0OGI0ZWE0NjI3YjRkZTFhNzc1YjlhZWVkYWQxMzU0MjZiZjU2MmJmMDJmOTk0NjM3YTciLAogICAgICAgICAgICAiYWNhZTU0MDBmNjJiY2EyZmI0MzRiZmM2OTliNTgyNTFhMGJiYzhiOTdkMTllNzdlNmQ2MDg5NmM3M2Y4MmY4ZjpmYmZmNWE5NDBmZDRlYmEyMDEyNTViY2EyODM4MjY4ZDFhYzk4NmMwNGNjNGY2OGY2NWQ4NDU3MTYwYjQzODdiIgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGNwYXRoKS8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0KICAgICAgXSwKICAgICAgImRldmljZXMiOiBbXSwKICAgICAgInNhbmRib3hfcGlkbnMiOiBmYWxzZSwKICAgICAgImV4ZWNfY29tbWFuZHMiOiBbXSwKICAgICAgImVudl9tYXAiOiB7CiAgICAgICAgIkFERFJFU1MiOiAiL2NzaS9jc2kuc29jayIsCiAgICAgICAgIkhPU1ROQU1FIjogIiQoaG9zdC1uYW1lKSIsCiAgICAgICAgIlBBVEgiOiAiL3Vzci9sb2NhbC9zYmluOi91c3IvbG9jYWwvYmluOi91c3Ivc2JpbjovdXNyL2Jpbjovc2JpbjovYmluIiwKICAgICAgICAiU1NMX0NFUlRfRklMRSI6ICIvZXRjL3NzbC9jZXJ0cy9jYS1jZXJ0aWZpY2F0ZXMuY3J0IgogICAgICB9CiAgICB9LAogICAgewogICAgICAiT0NJIjogewogICAgICAgICJWZXJzaW9uIjogIjEuMS4wLXJjLjEiLAogICAgICAgICJQcm9jZXNzIjogewogICAgICAgICAgIlRlcm1pbmFsIjogZmFsc2UsCiAgICAgICAgICAiVXNlciI6IHsKICAgICAgICAgICAgIlVJRCI6IDAsCiAgICAgICAgICAgICJHSUQiOiAwLAogICAgICAgICAgICAiQWRkaXRpb25hbEdpZHMiOiBbXSwKICAgICAgICAgICAgIlVzZXJuYW1lIjogIiIKICAgICAgICAgIH0sCiAgICAgICAgICAiRGVwcmVjYXRlZEFyZ3MiOiBbCiAgICAgICAgICAgICIvY3NpLW5vZGUtZHJpdmVyLXJlZ2lzdHJhciIsCiAgICAgICAgICAgICItLXY9NSIsCiAgICAgICAgICAgICItLWNzaS1hZGRyZXNzPS9jc2kvY3NpLnNvY2siLAogICAgICAgICAgICAiLS1rdWJlbGV0LXJlZ2lzdHJhdGlvbi1wYXRoPS92YXIvbGliL2t1YmVsZXQvcGx1Z2lucy9jc2ktaG9zdHBhdGgvY3NpLnNvY2siCiAgICAgICAgICBdLAogICAgICAgICAgIkFyZ3MiOiBbCiAgICAgICAgICAgICIvY3NpLW5vZGUtZHJpdmVyLXJlZ2lzdHJhciIsCiAgICAgICAgICAgICItLXY9NSIsCiAgICAgICAgICAgICItLWNzaS1hZGRyZXNzPS9jc2kvY3NpLnNvY2siLAogICAgICAgICAgICAiLS1rdWJlbGV0LXJlZ2lzdHJhdGlvbi1wYXRoPS92YXIvbGliL2t1YmVsZXQvcGx1Z2lucy9jc2ktaG9zdHBhdGgvY3NpLnNvY2siCiAgICAgICAgICBdLAogICAgICAgICAgIkVudiI6IFsKICAgICAgICAgICAgIlBBVEg9L3Vzci9sb2NhbC9zYmluOi91c3IvbG9jYWwvYmluOi91c3Ivc2JpbjovdXNyL2Jpbjovc2JpbjovYmluIiwKICAgICAgICAgICAgIlNTTF9DRVJUX0ZJTEU9L2V0Yy9zc2wvY2VydHMvY2EtY2VydGlmaWNhdGVzLmNydCIsCiAgICAgICAgICAgICJIT1NUTkFNRT0kKGhvc3QtbmFtZSkiLAogICAgICAgICAgICAiS1VCRV9OT0RFX05BTUU9JChub2RlLW5hbWUpIgogICAgICAgICAgXSwKICAgICAgICAgICJDd2QiOiAiLyIsCiAgICAgICAgICAiQ2FwYWJpbGl0aWVzIjogewogICAgICAgICAgICAiQW1iaWVudCI6IFtdLAogICAgICAgICAgICAiQm91bmRpbmciOiBbCiAgICAgICAgICAgICAgIiQocHJpdmlsZWdlZF9jYXBzKSIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgIkVmZmVjdGl2ZSI6IFsKICAgICAgICAgICAgICAiJChwcml2aWxlZ2VkX2NhcHMpIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiSW5oZXJpdGFibGUiOiBbXSwKICAgICAgICAgICAgIlBlcm1pdHRlZCI6IFsKICAgICAgICAgICAgICAiJChwcml2aWxlZ2VkX2NhcHMpIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgIk5vTmV3UHJpdmlsZWdlcyI6IGZhbHNlCiAgICAgICAgfSwKICAgICAgICAiUm9vdCI6IHsKICAgICAgICAgICJQYXRoIjogIiQoY3BhdGgpLyQoYnVuZGxlLWlkKSIsCiAgICAgICAgICAiUmVhZG9ubHkiOiBmYWxzZQogICAgICAgIH0sCiAgICAgICAgIk1vdW50cyI6IFsKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9wcm9jIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJwcm9jIiwKICAgICAgICAgICAgInR5cGVfIjogInByb2MiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2IiwKICAgICAgICAgICAgInNvdXJjZSI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJzdHJpY3RhdGltZSIsCiAgICAgICAgICAgICAgIm1vZGU9NzU1IiwKICAgICAgICAgICAgICAic2l6ZT02NTUzNmsiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L3B0cyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiZGV2cHRzIiwKICAgICAgICAgICAgInR5cGVfIjogImRldnB0cyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJuZXdpbnN0YW5jZSIsCiAgICAgICAgICAgICAgInB0bXhtb2RlPTA2NjYiLAogICAgICAgICAgICAgICJtb2RlPTA2MjAiLAogICAgICAgICAgICAgICJnaWQ9NSIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvc2htIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L3NobSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi9tcXVldWUiLAogICAgICAgICAgICAic291cmNlIjogIm1xdWV1ZSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJtcXVldWUiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvc3lzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJzeXNmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJzeXNmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIsCiAgICAgICAgICAgICAgInJ3IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL3N5cy9mcy9jZ3JvdXAiLAogICAgICAgICAgICAic291cmNlIjogImNncm91cCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJjZ3JvdXAiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiLAogICAgICAgICAgICAgICJyZWxhdGltZSIsCiAgICAgICAgICAgICAgInJ3IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2V0Yy9ob3N0cyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClob3N0cyQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicnciCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L3Rlcm1pbmF0aW9uLWxvZyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeCl0ZXJtaW5hdGlvbi1sb2ckIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJ3IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2V0Yy9ob3N0bmFtZSIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClob3N0bmFtZSQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicnciCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZXRjL3Jlc29sdi5jb25mIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KXJlc29sdi5jb25mJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJydyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi92YXIvcnVuL3NlY3JldHMva3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudCIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClzZXJ2aWNlYWNjb3VudCQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicm8iCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvdmFyL3J1bi9zZWNyZXRzL2F6dXJlL3Rva2VucyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeCl0b2tlbnMkIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2NzaSIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeCljc2kkIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJ3IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL3JlZ2lzdHJhdGlvbiIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClyZWdpc3RyYXRpb24kIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJ3IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2NzaS1kYXRhLWRpciIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeCljc2ktZGF0YS1kaXIkIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJ3IgogICAgICAgICAgICBdCiAgICAgICAgICB9CiAgICAgICAgXSwKICAgICAgICAiQW5ub3RhdGlvbnMiOiB7CiAgICAgICAgICAiaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5idW5kbGVfcGF0aCI6ICIvcnVuL2NvbnRhaW5lcmQvaW8uY29udGFpbmVyZC5ydW50aW1lLnYyLnRhc2svazhzLmlvLyQoYnVuZGxlLWlkKSIsCiAgICAgICAgICAiaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5jb250YWluZXJfdHlwZSI6ICJwb2RfY29udGFpbmVyIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItbmFtZSI6ICJub2RlLWRyaXZlci1yZWdpc3RyYXIiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLmNvbnRhaW5lci10eXBlIjogImNvbnRhaW5lciIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuaW1hZ2UtbmFtZSI6ICJyZWdpc3RyeS5rOHMuaW8vc2lnLXN0b3JhZ2UvY3NpLW5vZGUtZHJpdmVyLXJlZ2lzdHJhcjp2Mi41LjEiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtaWQiOiAiXlthLXowLTldezY0fSQiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZXNwYWNlIjogIiIKICAgICAgICB9LAogICAgICAgICJMaW51eCI6IHsKICAgICAgICAgICJOYW1lc3BhY2VzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgIlR5cGUiOiAiaXBjIiwKICAgICAgICAgICAgICAiUGF0aCI6ICIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiVHlwZSI6ICJ1dHMiLAogICAgICAgICAgICAgICJQYXRoIjogIiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJUeXBlIjogIm1vdW50IiwKICAgICAgICAgICAgICAiUGF0aCI6ICIiCiAgICAgICAgICAgIH0KICAgICAgICAgIF0sCiAgICAgICAgICAiTWFza2VkUGF0aHMiOiBbXSwKICAgICAgICAgICJSZWFkb25seVBhdGhzIjogW10sCiAgICAgICAgICAiRGV2aWNlcyI6IFtdLAogICAgICAgICAgIlN5c2N0bCI6IHsKICAgICAgICAgICAgIm5ldC5pcHY0LmlwX3VucHJpdmlsZWdlZF9wb3J0X3N0YXJ0IjogIjAiLAogICAgICAgICAgICAibmV0LmlwdjQucGluZ19ncm91cF9yYW5nZSI6ICIwIDIxNDc0ODM2NDciCiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9LAogICAgICAic3RvcmFnZXMiOiBbCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJibGsiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogInRhciIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIiQoaGFzaDApIgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGxheWVyMCkiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJibGsiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogInRhciIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIiQoaGFzaDEpIgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGxheWVyMSkiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJvdmVybGF5ZnMiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogImZ1c2UzLmthdGEtb3ZlcmxheSIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgImMzYjQwNGE3ODI2ZDdmNjk5M2U0MWI4NzFjZjNjYzU1MWJkNDIzY2E3MzhiYmM0MGZkMzIyZmZkMWUwOWNhMjA6M2MxOGYyN2RmMWQxZjI5NjA0M2Q1YjNjOGQ2MmEyOTMyYmRlY2ZmYThmZDBjZTRmMTk1YjY5NmYyNjM0NzRmNiIsCiAgICAgICAgICAgICJhZTFjMDU2OTk4ZmFmY2MzMDc4NDg1ZTAzYzFkMTlmNTkzMGM0YTQ0NGYwZmVhMmVlNTYzOWJlNmY5MDc4ZjI1OjRmM2UzOGUwZTBjMDZmODVlMmQyMTRjMGE3ODI2ZTJjMGRkYjlkMDExMzA3NmE0NmIxNWRhNTk2Mzk5ZDQ1ZGUiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQoY3BhdGgpLyQoYnVuZGxlLWlkKSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfQogICAgICBdLAogICAgICAiZGV2aWNlcyI6IFtdLAogICAgICAic2FuZGJveF9waWRucyI6IGZhbHNlLAogICAgICAiZXhlY19jb21tYW5kcyI6IFtdLAogICAgICAiZW52X21hcCI6IHsKICAgICAgICAiSE9TVE5BTUUiOiAiJChob3N0LW5hbWUpIiwKICAgICAgICAiS1VCRV9OT0RFX05BTUUiOiAiJChub2RlLW5hbWUpIiwKICAgICAgICAiUEFUSCI6ICIvdXNyL2xvY2FsL3NiaW46L3Vzci9sb2NhbC9iaW46L3Vzci9zYmluOi91c3IvYmluOi9zYmluOi9iaW4iLAogICAgICAgICJTU0xfQ0VSVF9GSUxFIjogIi9ldGMvc3NsL2NlcnRzL2NhLWNlcnRpZmljYXRlcy5jcnQiCiAgICAgIH0KICAgIH0sCiAgICB7CiAgICAgICJPQ0kiOiB7CiAgICAgICAgIlZlcnNpb24iOiAiMS4xLjAtcmMuMSIsCiAgICAgICAgIlByb2Nlc3MiOiB7CiAgICAgICAgICAiVGVybWluYWwiOiBmYWxzZSwKICAgICAgICAgICJVc2VyIjogewogICAgICAgICAgICAiVUlEIjogMCwKICAgICAgICAgICAgIkdJRCI6IDAsCiAgICAgICAgICAgICJBZGRpdGlvbmFsR2lkcyI6IFtdLAogICAgICAgICAgICAiVXNlcm5hbWUiOiAiIgogICAgICAgICAgfSwKICAgICAgICAgICJEZXByZWNhdGVkQXJncyI6IFsKICAgICAgICAgICAgIi9saXZlbmVzc3Byb2JlIiwKICAgICAgICAgICAgIi0tY3NpLWFkZHJlc3M9L2NzaS9jc2kuc29jayIsCiAgICAgICAgICAgICItLWhlYWx0aC1wb3J0PTk4OTgiCiAgICAgICAgICBdLAogICAgICAgICAgIkFyZ3MiOiBbCiAgICAgICAgICAgICIvbGl2ZW5lc3Nwcm9iZSIsCiAgICAgICAgICAgICItLWNzaS1hZGRyZXNzPS9jc2kvY3NpLnNvY2siLAogICAgICAgICAgICAiLS1oZWFsdGgtcG9ydD05ODk4IgogICAgICAgICAgXSwKICAgICAgICAgICJFbnYiOiBbCiAgICAgICAgICAgICJQQVRIPS91c3IvbG9jYWwvc2JpbjovdXNyL2xvY2FsL2JpbjovdXNyL3NiaW46L3Vzci9iaW46L3NiaW46L2JpbiIsCiAgICAgICAgICAgICJTU0xfQ0VSVF9GSUxFPS9ldGMvc3NsL2NlcnRzL2NhLWNlcnRpZmljYXRlcy5jcnQiLAogICAgICAgICAgICAiSE9TVE5BTUU9JChob3N0LW5hbWUpIgogICAgICAgICAgXSwKICAgICAgICAgICJDd2QiOiAiLyIsCiAgICAgICAgICAiQ2FwYWJpbGl0aWVzIjogewogICAgICAgICAgICAiQW1iaWVudCI6IFtdLAogICAgICAgICAgICAiQm91bmRpbmciOiBbCiAgICAgICAgICAgICAgIiQoZGVmYXVsdF9jYXBzKSIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgIkVmZmVjdGl2ZSI6IFsKICAgICAgICAgICAgICAiJChkZWZhdWx0X2NhcHMpIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiSW5oZXJpdGFibGUiOiBbXSwKICAgICAgICAgICAgIlBlcm1pdHRlZCI6IFsKICAgICAgICAgICAgICAiJChkZWZhdWx0X2NhcHMpIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgIk5vTmV3UHJpdmlsZWdlcyI6IGZhbHNlCiAgICAgICAgfSwKICAgICAgICAiUm9vdCI6IHsKICAgICAgICAgICJQYXRoIjogIiQoY3BhdGgpLyQoYnVuZGxlLWlkKSIsCiAgICAgICAgICAiUmVhZG9ubHkiOiBmYWxzZQogICAgICAgIH0sCiAgICAgICAgIk1vdW50cyI6IFsKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9wcm9jIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJwcm9jIiwKICAgICAgICAgICAgInR5cGVfIjogInByb2MiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2IiwKICAgICAgICAgICAgInNvdXJjZSI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJzdHJpY3RhdGltZSIsCiAgICAgICAgICAgICAgIm1vZGU9NzU1IiwKICAgICAgICAgICAgICAic2l6ZT02NTUzNmsiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L3B0cyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiZGV2cHRzIiwKICAgICAgICAgICAgInR5cGVfIjogImRldnB0cyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJuZXdpbnN0YW5jZSIsCiAgICAgICAgICAgICAgInB0bXhtb2RlPTA2NjYiLAogICAgICAgICAgICAgICJtb2RlPTA2MjAiLAogICAgICAgICAgICAgICJnaWQ9NSIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvc2htIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L3NobSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi9tcXVldWUiLAogICAgICAgICAgICAic291cmNlIjogIm1xdWV1ZSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJtcXVldWUiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvc3lzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJzeXNmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJzeXNmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL3N5cy9mcy9jZ3JvdXAiLAogICAgICAgICAgICAic291cmNlIjogImNncm91cCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJjZ3JvdXAiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiLAogICAgICAgICAgICAgICJyZWxhdGltZSIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2V0Yy9ob3N0cyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClob3N0cyQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicnciCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L3Rlcm1pbmF0aW9uLWxvZyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeCl0ZXJtaW5hdGlvbi1sb2ckIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJ3IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2V0Yy9ob3N0bmFtZSIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClob3N0bmFtZSQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicnciCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZXRjL3Jlc29sdi5jb25mIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KXJlc29sdi5jb25mJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJydyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi92YXIvcnVuL3NlY3JldHMva3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudCIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClzZXJ2aWNlYWNjb3VudCQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicm8iCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvdmFyL3J1bi9zZWNyZXRzL2F6dXJlL3Rva2VucyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeCl0b2tlbnMkIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2NzaSIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeCljc2kkIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJ3IgogICAgICAgICAgICBdCiAgICAgICAgICB9CiAgICAgICAgXSwKICAgICAgICAiQW5ub3RhdGlvbnMiOiB7CiAgICAgICAgICAiaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5idW5kbGVfcGF0aCI6ICIvcnVuL2NvbnRhaW5lcmQvaW8uY29udGFpbmVyZC5ydW50aW1lLnYyLnRhc2svazhzLmlvLyQoYnVuZGxlLWlkKSIsCiAgICAgICAgICAiaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5jb250YWluZXJfdHlwZSI6ICJwb2RfY29udGFpbmVyIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItbmFtZSI6ICJsaXZlbmVzcy1wcm9iZSIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLXR5cGUiOiAiY29udGFpbmVyIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5pbWFnZS1uYW1lIjogInJlZ2lzdHJ5Lms4cy5pby9zaWctc3RvcmFnZS9saXZlbmVzc3Byb2JlOnYyLjcuMCIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCI6ICJeW2EtejAtOV17NjR9JCIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1uYW1lc3BhY2UiOiAiIgogICAgICAgIH0sCiAgICAgICAgIkxpbnV4IjogewogICAgICAgICAgIk5hbWVzcGFjZXMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiVHlwZSI6ICJpcGMiLAogICAgICAgICAgICAgICJQYXRoIjogIiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJUeXBlIjogInV0cyIsCiAgICAgICAgICAgICAgIlBhdGgiOiAiIgogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgIlR5cGUiOiAibW91bnQiLAogICAgICAgICAgICAgICJQYXRoIjogIiIKICAgICAgICAgICAgfQogICAgICAgICAgXSwKICAgICAgICAgICJNYXNrZWRQYXRocyI6IFsKICAgICAgICAgICAgIi9wcm9jL2FjcGkiLAogICAgICAgICAgICAiL3Byb2Mva2NvcmUiLAogICAgICAgICAgICAiL3Byb2Mva2V5cyIsCiAgICAgICAgICAgICIvcHJvYy9sYXRlbmN5X3N0YXRzIiwKICAgICAgICAgICAgIi9wcm9jL3RpbWVyX2xpc3QiLAogICAgICAgICAgICAiL3Byb2MvdGltZXJfc3RhdHMiLAogICAgICAgICAgICAiL3Byb2Mvc2NoZWRfZGVidWciLAogICAgICAgICAgICAiL3Byb2Mvc2NzaSIsCiAgICAgICAgICAgICIvc3lzL2Zpcm13YXJlIgogICAgICAgICAgXSwKICAgICAgICAgICJSZWFkb25seVBhdGhzIjogWwogICAgICAgICAgICAiL3Byb2MvYXNvdW5kIiwKICAgICAgICAgICAgIi9wcm9jL2J1cyIsCiAgICAgICAgICAgICIvcHJvYy9mcyIsCiAgICAgICAgICAgICIvcHJvYy9pcnEiLAogICAgICAgICAgICAiL3Byb2Mvc3lzIiwKICAgICAgICAgICAgIi9wcm9jL3N5c3JxLXRyaWdnZXIiCiAgICAgICAgICBdLAogICAgICAgICAgIkRldmljZXMiOiBbXSwKICAgICAgICAgICJTeXNjdGwiOiB7CiAgICAgICAgICAgICJuZXQuaXB2NC5pcF91bnByaXZpbGVnZWRfcG9ydF9zdGFydCI6ICIwIiwKICAgICAgICAgICAgIm5ldC5pcHY0LnBpbmdfZ3JvdXBfcmFuZ2UiOiAiMCAyMTQ3NDgzNjQ3IgogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSwKICAgICAgInN0b3JhZ2VzIjogWwogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2gwKSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjApIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2gxKSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjEpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAib3ZlcmxheWZzIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJmdXNlMy5rYXRhLW92ZXJsYXkiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIwOTRiZWFlYjMxZWE5OWNiNmY5YmQ3OTliZTdhNmViNGFiZjUyMzhkYmIyMzgxZjI3MDU4MGUzNDJjM2FkNjVlOjNjMThmMjdkZjFkMWYyOTYwNDNkNWIzYzhkNjJhMjkzMmJkZWNmZmE4ZmQwY2U0ZjE5NWI2OTZmMjYzNDc0ZjYiLAogICAgICAgICAgICAiN2IwZTcwYzJlMjdhZTk1ZTNhYmY1YzVkZjdhYjJiOWI4ODc3MzVkNDFmMGEwYTVjYWMzYTk1Y2EwYzI1ODMwNDo0ZjNlMzhlMGUwYzA2Zjg1ZTJkMjE0YzBhNzgyNmUyYzBkZGI5ZDAxMTMwNzZhNDZiMTVkYTU5NjM5OWQ0NWRlIgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGNwYXRoKS8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0KICAgICAgXSwKICAgICAgImRldmljZXMiOiBbXSwKICAgICAgInNhbmRib3hfcGlkbnMiOiBmYWxzZSwKICAgICAgImV4ZWNfY29tbWFuZHMiOiBbXSwKICAgICAgImVudl9tYXAiOiB7CiAgICAgICAgIkhPU1ROQU1FIjogIiQoaG9zdC1uYW1lKSIsCiAgICAgICAgIlBBVEgiOiAiL3Vzci9sb2NhbC9zYmluOi91c3IvbG9jYWwvYmluOi91c3Ivc2JpbjovdXNyL2Jpbjovc2JpbjovYmluIiwKICAgICAgICAiU1NMX0NFUlRfRklMRSI6ICIvZXRjL3NzbC9jZXJ0cy9jYS1jZXJ0aWZpY2F0ZXMuY3J0IgogICAgICB9CiAgICB9LAogICAgewogICAgICAiT0NJIjogewogICAgICAgICJWZXJzaW9uIjogIjEuMS4wLXJjLjEiLAogICAgICAgICJQcm9jZXNzIjogewogICAgICAgICAgIlRlcm1pbmFsIjogZmFsc2UsCiAgICAgICAgICAiVXNlciI6IHsKICAgICAgICAgICAgIlVJRCI6IDAsCiAgICAgICAgICAgICJHSUQiOiAwLAogICAgICAgICAgICAiQWRkaXRpb25hbEdpZHMiOiBbXSwKICAgICAgICAgICAgIlVzZXJuYW1lIjogIiIKICAgICAgICAgIH0sCiAgICAgICAgICAiRGVwcmVjYXRlZEFyZ3MiOiBbCiAgICAgICAgICAgICIvY3NpLWF0dGFjaGVyIiwKICAgICAgICAgICAgIi0tdj01IiwKICAgICAgICAgICAgIi0tY3NpLWFkZHJlc3M9L2NzaS9jc2kuc29jayIKICAgICAgICAgIF0sCiAgICAgICAgICAiQXJncyI6IFsKICAgICAgICAgICAgIi9jc2ktYXR0YWNoZXIiLAogICAgICAgICAgICAiLS12PTUiLAogICAgICAgICAgICAiLS1jc2ktYWRkcmVzcz0vY3NpL2NzaS5zb2NrIgogICAgICAgICAgXSwKICAgICAgICAgICJFbnYiOiBbCiAgICAgICAgICAgICJQQVRIPS91c3IvbG9jYWwvc2JpbjovdXNyL2xvY2FsL2JpbjovdXNyL3NiaW46L3Vzci9iaW46L3NiaW46L2JpbiIsCiAgICAgICAgICAgICJTU0xfQ0VSVF9GSUxFPS9ldGMvc3NsL2NlcnRzL2NhLWNlcnRpZmljYXRlcy5jcnQiLAogICAgICAgICAgICAiSE9TVE5BTUU9JChob3N0LW5hbWUpIgogICAgICAgICAgXSwKICAgICAgICAgICJDd2QiOiAiLyIsCiAgICAgICAgICAiQ2FwYWJpbGl0aWVzIjogewogICAgICAgICAgICAiQW1iaWVudCI6IFtdLAogICAgICAgICAgICAiQm91bmRpbmciOiBbCiAgICAgICAgICAgICAgIiQocHJpdmlsZWdlZF9jYXBzKSIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgIkVmZmVjdGl2ZSI6IFsKICAgICAgICAgICAgICAiJChwcml2aWxlZ2VkX2NhcHMpIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiSW5oZXJpdGFibGUiOiBbXSwKICAgICAgICAgICAgIlBlcm1pdHRlZCI6IFsKICAgICAgICAgICAgICAiJChwcml2aWxlZ2VkX2NhcHMpIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgIk5vTmV3UHJpdmlsZWdlcyI6IGZhbHNlCiAgICAgICAgfSwKICAgICAgICAiUm9vdCI6IHsKICAgICAgICAgICJQYXRoIjogIiQoY3BhdGgpLyQoYnVuZGxlLWlkKSIsCiAgICAgICAgICAiUmVhZG9ubHkiOiBmYWxzZQogICAgICAgIH0sCiAgICAgICAgIk1vdW50cyI6IFsKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9wcm9jIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJwcm9jIiwKICAgICAgICAgICAgInR5cGVfIjogInByb2MiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2IiwKICAgICAgICAgICAgInNvdXJjZSI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJzdHJpY3RhdGltZSIsCiAgICAgICAgICAgICAgIm1vZGU9NzU1IiwKICAgICAgICAgICAgICAic2l6ZT02NTUzNmsiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L3B0cyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiZGV2cHRzIiwKICAgICAgICAgICAgInR5cGVfIjogImRldnB0cyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJuZXdpbnN0YW5jZSIsCiAgICAgICAgICAgICAgInB0bXhtb2RlPTA2NjYiLAogICAgICAgICAgICAgICJtb2RlPTA2MjAiLAogICAgICAgICAgICAgICJnaWQ9NSIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvc2htIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L3NobSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi9tcXVldWUiLAogICAgICAgICAgICAic291cmNlIjogIm1xdWV1ZSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJtcXVldWUiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvc3lzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJzeXNmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJzeXNmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIsCiAgICAgICAgICAgICAgInJ3IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL3N5cy9mcy9jZ3JvdXAiLAogICAgICAgICAgICAic291cmNlIjogImNncm91cCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJjZ3JvdXAiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiLAogICAgICAgICAgICAgICJyZWxhdGltZSIsCiAgICAgICAgICAgICAgInJ3IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2V0Yy9ob3N0cyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClob3N0cyQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicnciCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L3Rlcm1pbmF0aW9uLWxvZyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeCl0ZXJtaW5hdGlvbi1sb2ckIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJ3IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2V0Yy9ob3N0bmFtZSIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClob3N0bmFtZSQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicnciCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZXRjL3Jlc29sdi5jb25mIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KXJlc29sdi5jb25mJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJydyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi92YXIvcnVuL3NlY3JldHMva3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudCIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClzZXJ2aWNlYWNjb3VudCQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicm8iCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvdmFyL3J1bi9zZWNyZXRzL2F6dXJlL3Rva2VucyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeCl0b2tlbnMkIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2NzaSIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeCljc2kkIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJ3IgogICAgICAgICAgICBdCiAgICAgICAgICB9CiAgICAgICAgXSwKICAgICAgICAiQW5ub3RhdGlvbnMiOiB7CiAgICAgICAgICAiaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5idW5kbGVfcGF0aCI6ICIvcnVuL2NvbnRhaW5lcmQvaW8uY29udGFpbmVyZC5ydW50aW1lLnYyLnRhc2svazhzLmlvLyQoYnVuZGxlLWlkKSIsCiAgICAgICAgICAiaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5jb250YWluZXJfdHlwZSI6ICJwb2RfY29udGFpbmVyIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItbmFtZSI6ICJjc2ktYXR0YWNoZXIiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLmNvbnRhaW5lci10eXBlIjogImNvbnRhaW5lciIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuaW1hZ2UtbmFtZSI6ICJyZWdpc3RyeS5rOHMuaW8vc2lnLXN0b3JhZ2UvY3NpLWF0dGFjaGVyOnY0LjAuMCIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCI6ICJeW2EtejAtOV17NjR9JCIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1uYW1lc3BhY2UiOiAiIgogICAgICAgIH0sCiAgICAgICAgIkxpbnV4IjogewogICAgICAgICAgIk5hbWVzcGFjZXMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiVHlwZSI6ICJpcGMiLAogICAgICAgICAgICAgICJQYXRoIjogIiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJUeXBlIjogInV0cyIsCiAgICAgICAgICAgICAgIlBhdGgiOiAiIgogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgIlR5cGUiOiAibW91bnQiLAogICAgICAgICAgICAgICJQYXRoIjogIiIKICAgICAgICAgICAgfQogICAgICAgICAgXSwKICAgICAgICAgICJNYXNrZWRQYXRocyI6IFtdLAogICAgICAgICAgIlJlYWRvbmx5UGF0aHMiOiBbXSwKICAgICAgICAgICJEZXZpY2VzIjogW10sCiAgICAgICAgICAiU3lzY3RsIjogewogICAgICAgICAgICAibmV0LmlwdjQuaXBfdW5wcml2aWxlZ2VkX3BvcnRfc3RhcnQiOiAiMCIsCiAgICAgICAgICAgICJuZXQuaXB2NC5waW5nX2dyb3VwX3JhbmdlIjogIjAgMjE0NzQ4MzY0NyIKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0sCiAgICAgICJzdG9yYWdlcyI6IFsKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoMCkiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXIwKSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoMSkiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXIxKSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogIm92ZXJsYXlmcyIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAiZnVzZTMua2F0YS1vdmVybGF5IiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiODFmNjk2M2IxNzU1YjlmNWFlOWYyZTAyN2E0NGIxZjMyNjc5MzFlZTAwNWQxYmFjM2E4OTA5YzhiYWU3MzU5Zjo5ZDZjMWU5ZjQ2ZjU0NDhiNGVhNDYyN2I0ZGUxYTc3NWI5YWVlZGFkMTM1NDI2YmY1NjJiZjAyZjk5NDYzN2E3IiwKICAgICAgICAgICAgImNhYWQ3OGNjZDA2MWM0NjQ1ZDhjZDdjMDE1ZTlmMzlmMzM2N2Q2ZWMzODA3MjY0YWUyNGI5MjdkOTZmYzYyZmY6ZmJmZjVhOTQwZmQ0ZWJhMjAxMjU1YmNhMjgzODI2OGQxYWM5ODZjMDRjYzRmNjhmNjVkODQ1NzE2MGI0Mzg3YiIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChjcGF0aCkvJChidW5kbGUtaWQpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9CiAgICAgIF0sCiAgICAgICJkZXZpY2VzIjogW10sCiAgICAgICJzYW5kYm94X3BpZG5zIjogZmFsc2UsCiAgICAgICJleGVjX2NvbW1hbmRzIjogW10sCiAgICAgICJlbnZfbWFwIjogewogICAgICAgICJIT1NUTkFNRSI6ICIkKGhvc3QtbmFtZSkiLAogICAgICAgICJQQVRIIjogIi91c3IvbG9jYWwvc2JpbjovdXNyL2xvY2FsL2JpbjovdXNyL3NiaW46L3Vzci9iaW46L3NiaW46L2JpbiIsCiAgICAgICAgIlNTTF9DRVJUX0ZJTEUiOiAiL2V0Yy9zc2wvY2VydHMvY2EtY2VydGlmaWNhdGVzLmNydCIKICAgICAgfQogICAgfSwKICAgIHsKICAgICAgIk9DSSI6IHsKICAgICAgICAiVmVyc2lvbiI6ICIxLjEuMC1yYy4xIiwKICAgICAgICAiUHJvY2VzcyI6IHsKICAgICAgICAgICJUZXJtaW5hbCI6IGZhbHNlLAogICAgICAgICAgIlVzZXIiOiB7CiAgICAgICAgICAgICJVSUQiOiAwLAogICAgICAgICAgICAiR0lEIjogMCwKICAgICAgICAgICAgIkFkZGl0aW9uYWxHaWRzIjogW10sCiAgICAgICAgICAgICJVc2VybmFtZSI6ICIiCiAgICAgICAgICB9LAogICAgICAgICAgIkRlcHJlY2F0ZWRBcmdzIjogWwogICAgICAgICAgICAiL2NzaS1wcm92aXNpb25lciIsCiAgICAgICAgICAgICItdj01IiwKICAgICAgICAgICAgIi0tY3NpLWFkZHJlc3M9L2NzaS9jc2kuc29jayIsCiAgICAgICAgICAgICItLWZlYXR1cmUtZ2F0ZXM9VG9wb2xvZ3k9dHJ1ZSIKICAgICAgICAgIF0sCiAgICAgICAgICAiQXJncyI6IFsKICAgICAgICAgICAgIi9jc2ktcHJvdmlzaW9uZXIiLAogICAgICAgICAgICAiLXY9NSIsCiAgICAgICAgICAgICItLWNzaS1hZGRyZXNzPS9jc2kvY3NpLnNvY2siLAogICAgICAgICAgICAiLS1mZWF0dXJlLWdhdGVzPVRvcG9sb2d5PXRydWUiCiAgICAgICAgICBdLAogICAgICAgICAgIkVudiI6IFsKICAgICAgICAgICAgIlBBVEg9L3Vzci9sb2NhbC9zYmluOi91c3IvbG9jYWwvYmluOi91c3Ivc2JpbjovdXNyL2Jpbjovc2JpbjovYmluIiwKICAgICAgICAgICAgIlNTTF9DRVJUX0ZJTEU9L2V0Yy9zc2wvY2VydHMvY2EtY2VydGlmaWNhdGVzLmNydCIsCiAgICAgICAgICAgICJIT1NUTkFNRT0kKGhvc3QtbmFtZSkiCiAgICAgICAgICBdLAogICAgICAgICAgIkN3ZCI6ICIvIiwKICAgICAgICAgICJDYXBhYmlsaXRpZXMiOiB7CiAgICAgICAgICAgICJBbWJpZW50IjogW10sCiAgICAgICAgICAgICJCb3VuZGluZyI6IFsKICAgICAgICAgICAgICAiJChwcml2aWxlZ2VkX2NhcHMpIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiRWZmZWN0aXZlIjogWwogICAgICAgICAgICAgICIkKHByaXZpbGVnZWRfY2FwcykiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJJbmhlcml0YWJsZSI6IFtdLAogICAgICAgICAgICAiUGVybWl0dGVkIjogWwogICAgICAgICAgICAgICIkKHByaXZpbGVnZWRfY2FwcykiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICAiTm9OZXdQcml2aWxlZ2VzIjogZmFsc2UKICAgICAgICB9LAogICAgICAgICJSb290IjogewogICAgICAgICAgIlBhdGgiOiAiJChjcGF0aCkvJChidW5kbGUtaWQpIiwKICAgICAgICAgICJSZWFkb25seSI6IGZhbHNlCiAgICAgICAgfSwKICAgICAgICAiTW91bnRzIjogWwogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL3Byb2MiLAogICAgICAgICAgICAic291cmNlIjogInByb2MiLAogICAgICAgICAgICAidHlwZV8iOiAicHJvYyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYiLAogICAgICAgICAgICAic291cmNlIjogInRtcGZzIiwKICAgICAgICAgICAgInR5cGVfIjogInRtcGZzIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgInN0cmljdGF0aW1lIiwKICAgICAgICAgICAgICAibW9kZT03NTUiLAogICAgICAgICAgICAgICJzaXplPTY1NTM2ayIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvcHRzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJkZXZwdHMiLAogICAgICAgICAgICAidHlwZV8iOiAiZGV2cHRzIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAgICAgIm5ld2luc3RhbmNlIiwKICAgICAgICAgICAgICAicHRteG1vZGU9MDY2NiIsCiAgICAgICAgICAgICAgIm1vZGU9MDYyMCIsCiAgICAgICAgICAgICAgImdpZD01IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi9zaG0iLAogICAgICAgICAgICAic291cmNlIjogIi9ydW4va2F0YS1jb250YWluZXJzL3NhbmRib3gvc2htIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L21xdWV1ZSIsCiAgICAgICAgICAgICJzb3VyY2UiOiAibXF1ZXVlIiwKICAgICAgICAgICAgInR5cGVfIjogIm1xdWV1ZSIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9zeXMiLAogICAgICAgICAgICAic291cmNlIjogInN5c2ZzIiwKICAgICAgICAgICAgInR5cGVfIjogInN5c2ZzIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAgICAgIm5vZGV2IiwKICAgICAgICAgICAgICAicnciCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvc3lzL2ZzL2Nncm91cCIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiY2dyb3VwIiwKICAgICAgICAgICAgInR5cGVfIjogImNncm91cCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIsCiAgICAgICAgICAgICAgInJlbGF0aW1lIiwKICAgICAgICAgICAgICAicnciCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZXRjL2hvc3RzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KWhvc3RzJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJydyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvdGVybWluYXRpb24tbG9nIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KXRlcm1pbmF0aW9uLWxvZyQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicnciCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZXRjL2hvc3RuYW1lIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KWhvc3RuYW1lJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJydyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9ldGMvcmVzb2x2LmNvbmYiLAogICAgICAgICAgICAic291cmNlIjogIiQoc2ZwcmVmaXgpcmVzb2x2LmNvbmYkIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJ3IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL3Zhci9ydW4vc2VjcmV0cy9rdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50IiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KXNlcnZpY2VhY2NvdW50JCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJybyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi92YXIvcnVuL3NlY3JldHMvYXp1cmUvdG9rZW5zIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KXRva2VucyQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicm8iCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvY3NpIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KWNzaSQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicnciCiAgICAgICAgICAgIF0KICAgICAgICAgIH0KICAgICAgICBdLAogICAgICAgICJBbm5vdGF0aW9ucyI6IHsKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmJ1bmRsZV9wYXRoIjogIi9ydW4vY29udGFpbmVyZC9pby5jb250YWluZXJkLnJ1bnRpbWUudjIudGFzay9rOHMuaW8vJChidW5kbGUtaWQpIiwKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIjogInBvZF9jb250YWluZXIiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLmNvbnRhaW5lci1uYW1lIjogImNzaS1wcm92aXNpb25lciIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLXR5cGUiOiAiY29udGFpbmVyIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5pbWFnZS1uYW1lIjogInJlZ2lzdHJ5Lms4cy5pby9zaWctc3RvcmFnZS9jc2ktcHJvdmlzaW9uZXI6djMuNC4wIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWlkIjogIl5bYS16MC05XXs2NH0kIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LW5hbWVzcGFjZSI6ICIiCiAgICAgICAgfSwKICAgICAgICAiTGludXgiOiB7CiAgICAgICAgICAiTmFtZXNwYWNlcyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICJUeXBlIjogImlwYyIsCiAgICAgICAgICAgICAgIlBhdGgiOiAiIgogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgIlR5cGUiOiAidXRzIiwKICAgICAgICAgICAgICAiUGF0aCI6ICIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiVHlwZSI6ICJtb3VudCIsCiAgICAgICAgICAgICAgIlBhdGgiOiAiIgogICAgICAgICAgICB9CiAgICAgICAgICBdLAogICAgICAgICAgIk1hc2tlZFBhdGhzIjogW10sCiAgICAgICAgICAiUmVhZG9ubHlQYXRocyI6IFtdLAogICAgICAgICAgIkRldmljZXMiOiBbXSwKICAgICAgICAgICJTeXNjdGwiOiB7CiAgICAgICAgICAgICJuZXQuaXB2NC5pcF91bnByaXZpbGVnZWRfcG9ydF9zdGFydCI6ICIwIiwKICAgICAgICAgICAgIm5ldC5pcHY0LnBpbmdfZ3JvdXBfcmFuZ2UiOiAiMCAyMTQ3NDgzNjQ3IgogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSwKICAgICAgInN0b3JhZ2VzIjogWwogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2gwKSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjApIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2gxKSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjEpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAib3ZlcmxheWZzIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJmdXNlMy5rYXRhLW92ZXJsYXkiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICI2MTc4ZGEyZDk0NzQyNzFiMWMwMjFlYzAzYjU3ZDY3M2ZmOGM4ZTYyY2EzZjNjYjU3YzU3MDhiZTMwZDEyN2JmOmMyZmU2NDdjNzRkOTM4ZTRiNTA4Zjc4OGI5Zjg0MWQwNmI4Zjk3M2I0MjMzYjY2ZTRmYzRhYzcxN2Q4NWE3NmQiLAogICAgICAgICAgICAiODgzMjAwZmQ3NzgwODhhMTJiOWVmMGExZDNmNDM2NDg5ZjNhODJhNzZkMTE1YTZhMWIxNjgxNDU4NmMyZjQzYzoxYWM4YWIxMWFkNjBlODcwYzUwZDkzZjFiYzM3YzUxZDY0ODdiOGU3YWU1ZGJiNmU1MDYzYjE5YmEzMjA4NzA5IgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGNwYXRoKS8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0KICAgICAgXSwKICAgICAgImRldmljZXMiOiBbXSwKICAgICAgInNhbmRib3hfcGlkbnMiOiBmYWxzZSwKICAgICAgImV4ZWNfY29tbWFuZHMiOiBbXSwKICAgICAgImVudl9tYXAiOiB7CiAgICAgICAgIkhPU1ROQU1FIjogIiQoaG9zdC1uYW1lKSIsCiAgICAgICAgIlBBVEgiOiAiL3Vzci9sb2NhbC9zYmluOi91c3IvbG9jYWwvYmluOi91c3Ivc2JpbjovdXNyL2Jpbjovc2JpbjovYmluIiwKICAgICAgICAiU1NMX0NFUlRfRklMRSI6ICIvZXRjL3NzbC9jZXJ0cy9jYS1jZXJ0aWZpY2F0ZXMuY3J0IgogICAgICB9CiAgICB9LAogICAgewogICAgICAiT0NJIjogewogICAgICAgICJWZXJzaW9uIjogIjEuMS4wLXJjLjEiLAogICAgICAgICJQcm9jZXNzIjogewogICAgICAgICAgIlRlcm1pbmFsIjogZmFsc2UsCiAgICAgICAgICAiVXNlciI6IHsKICAgICAgICAgICAgIlVJRCI6IDAsCiAgICAgICAgICAgICJHSUQiOiAwLAogICAgICAgICAgICAiQWRkaXRpb25hbEdpZHMiOiBbXSwKICAgICAgICAgICAgIlVzZXJuYW1lIjogIiIKICAgICAgICAgIH0sCiAgICAgICAgICAiRGVwcmVjYXRlZEFyZ3MiOiBbCiAgICAgICAgICAgICIvY3NpLXNuYXBzaG90dGVyIiwKICAgICAgICAgICAgIi12PTUiLAogICAgICAgICAgICAiLS1jc2ktYWRkcmVzcz0vY3NpL2NzaS5zb2NrIgogICAgICAgICAgXSwKICAgICAgICAgICJBcmdzIjogWwogICAgICAgICAgICAiL2NzaS1zbmFwc2hvdHRlciIsCiAgICAgICAgICAgICItdj01IiwKICAgICAgICAgICAgIi0tY3NpLWFkZHJlc3M9L2NzaS9jc2kuc29jayIKICAgICAgICAgIF0sCiAgICAgICAgICAiRW52IjogWwogICAgICAgICAgICAiUEFUSD0vdXNyL2xvY2FsL3NiaW46L3Vzci9sb2NhbC9iaW46L3Vzci9zYmluOi91c3IvYmluOi9zYmluOi9iaW4iLAogICAgICAgICAgICAiU1NMX0NFUlRfRklMRT0vZXRjL3NzbC9jZXJ0cy9jYS1jZXJ0aWZpY2F0ZXMuY3J0IiwKICAgICAgICAgICAgIkhPU1ROQU1FPSQoaG9zdC1uYW1lKSIKICAgICAgICAgIF0sCiAgICAgICAgICAiQ3dkIjogIi8iLAogICAgICAgICAgIkNhcGFiaWxpdGllcyI6IHsKICAgICAgICAgICAgIkFtYmllbnQiOiBbXSwKICAgICAgICAgICAgIkJvdW5kaW5nIjogWwogICAgICAgICAgICAgICIkKHByaXZpbGVnZWRfY2FwcykiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJFZmZlY3RpdmUiOiBbCiAgICAgICAgICAgICAgIiQocHJpdmlsZWdlZF9jYXBzKSIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgIkluaGVyaXRhYmxlIjogW10sCiAgICAgICAgICAgICJQZXJtaXR0ZWQiOiBbCiAgICAgICAgICAgICAgIiQocHJpdmlsZWdlZF9jYXBzKSIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgICJOb05ld1ByaXZpbGVnZXMiOiBmYWxzZQogICAgICAgIH0sCiAgICAgICAgIlJvb3QiOiB7CiAgICAgICAgICAiUGF0aCI6ICIkKGNwYXRoKS8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgIlJlYWRvbmx5IjogZmFsc2UKICAgICAgICB9LAogICAgICAgICJNb3VudHMiOiBbCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvcHJvYyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAicHJvYyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJwcm9jIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAgICAgIm5vZGV2IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2RldiIsCiAgICAgICAgICAgICJzb3VyY2UiOiAidG1wZnMiLAogICAgICAgICAgICAidHlwZV8iOiAidG1wZnMiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAic3RyaWN0YXRpbWUiLAogICAgICAgICAgICAgICJtb2RlPTc1NSIsCiAgICAgICAgICAgICAgInNpemU9NjU1MzZrIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi9wdHMiLAogICAgICAgICAgICAic291cmNlIjogImRldnB0cyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJkZXZwdHMiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibmV3aW5zdGFuY2UiLAogICAgICAgICAgICAgICJwdG14bW9kZT0wNjY2IiwKICAgICAgICAgICAgICAibW9kZT0wNjIwIiwKICAgICAgICAgICAgICAiZ2lkPTUiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L3NobSIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiL3J1bi9rYXRhLWNvbnRhaW5lcnMvc2FuZGJveC9zaG0iLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvbXF1ZXVlIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJtcXVldWUiLAogICAgICAgICAgICAidHlwZV8iOiAibXF1ZXVlIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAgICAgIm5vZGV2IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL3N5cyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAic3lzZnMiLAogICAgICAgICAgICAidHlwZV8iOiAic3lzZnMiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiLAogICAgICAgICAgICAgICJydyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9zeXMvZnMvY2dyb3VwIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJjZ3JvdXAiLAogICAgICAgICAgICAidHlwZV8iOiAiY2dyb3VwIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAgICAgIm5vZGV2IiwKICAgICAgICAgICAgICAicmVsYXRpbWUiLAogICAgICAgICAgICAgICJydyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9ldGMvaG9zdHMiLAogICAgICAgICAgICAic291cmNlIjogIiQoc2ZwcmVmaXgpaG9zdHMkIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJ3IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi90ZXJtaW5hdGlvbi1sb2ciLAogICAgICAgICAgICAic291cmNlIjogIiQoc2ZwcmVmaXgpdGVybWluYXRpb24tbG9nJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJydyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9ldGMvaG9zdG5hbWUiLAogICAgICAgICAgICAic291cmNlIjogIiQoc2ZwcmVmaXgpaG9zdG5hbWUkIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJ3IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2V0Yy9yZXNvbHYuY29uZiIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClyZXNvbHYuY29uZiQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicnciCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvdmFyL3J1bi9zZWNyZXRzL2t1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQiLAogICAgICAgICAgICAic291cmNlIjogIiQoc2ZwcmVmaXgpc2VydmljZWFjY291bnQkIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL3Zhci9ydW4vc2VjcmV0cy9henVyZS90b2tlbnMiLAogICAgICAgICAgICAic291cmNlIjogIiQoc2ZwcmVmaXgpdG9rZW5zJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJybyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9jc2kiLAogICAgICAgICAgICAic291cmNlIjogIiQoc2ZwcmVmaXgpY3NpJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJydyIKICAgICAgICAgICAgXQogICAgICAgICAgfQogICAgICAgIF0sCiAgICAgICAgIkFubm90YXRpb25zIjogewogICAgICAgICAgImlvLmthdGFjb250YWluZXJzLnBrZy5vY2kuYnVuZGxlX3BhdGgiOiAiL3J1bi9jb250YWluZXJkL2lvLmNvbnRhaW5lcmQucnVudGltZS52Mi50YXNrL2s4cy5pby8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgImlvLmthdGFjb250YWluZXJzLnBrZy5vY2kuY29udGFpbmVyX3R5cGUiOiAicG9kX2NvbnRhaW5lciIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLW5hbWUiOiAiY3NpLXNuYXBzaG90dGVyIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSI6ICJjb250YWluZXIiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLmltYWdlLW5hbWUiOiAicmVnaXN0cnkuazhzLmlvL3NpZy1zdG9yYWdlL2NzaS1zbmFwc2hvdHRlcjp2Ni4xLjAiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtaWQiOiAiXlthLXowLTldezY0fSQiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZXNwYWNlIjogIiIKICAgICAgICB9LAogICAgICAgICJMaW51eCI6IHsKICAgICAgICAgICJOYW1lc3BhY2VzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgIlR5cGUiOiAiaXBjIiwKICAgICAgICAgICAgICAiUGF0aCI6ICIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiVHlwZSI6ICJ1dHMiLAogICAgICAgICAgICAgICJQYXRoIjogIiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJUeXBlIjogIm1vdW50IiwKICAgICAgICAgICAgICAiUGF0aCI6ICIiCiAgICAgICAgICAgIH0KICAgICAgICAgIF0sCiAgICAgICAgICAiTWFza2VkUGF0aHMiOiBbXSwKICAgICAgICAgICJSZWFkb25seVBhdGhzIjogW10sCiAgICAgICAgICAiRGV2aWNlcyI6IFtdLAogICAgICAgICAgIlN5c2N0bCI6IHsKICAgICAgICAgICAgIm5ldC5pcHY0LmlwX3VucHJpdmlsZWdlZF9wb3J0X3N0YXJ0IjogIjAiLAogICAgICAgICAgICAibmV0LmlwdjQucGluZ19ncm91cF9yYW5nZSI6ICIwIDIxNDc0ODM2NDciCiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9LAogICAgICAic3RvcmFnZXMiOiBbCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJibGsiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogInRhciIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIiQoaGFzaDApIgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGxheWVyMCkiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJibGsiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogInRhciIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIiQoaGFzaDEpIgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGxheWVyMSkiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJvdmVybGF5ZnMiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogImZ1c2UzLmthdGEtb3ZlcmxheSIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgImU1ZDdhMmUxMWUyM2ZmMTlhZDUwM2Q2N2JkOTA0Mzg3MzE0ZTk3NDk3MDBlZmY1ZTg1MDU5MDM1MjA2YmQ4NWU6OWQ2YzFlOWY0NmY1NDQ4YjRlYTQ2MjdiNGRlMWE3NzViOWFlZWRhZDEzNTQyNmJmNTYyYmYwMmY5OTQ2MzdhNyIsCiAgICAgICAgICAgICIyNDc3OTU2OTFkNGU4ZGY3ZTk5MTNlYWZjMGZhZWMwY2IwNzRkYTA4OWQ0YmM1MTJjNTE0MjFhY2IzNTdiN2M3OmZiZmY1YTk0MGZkNGViYTIwMTI1NWJjYTI4MzgyNjhkMWFjOTg2YzA0Y2M0ZjY4ZjY1ZDg0NTcxNjBiNDM4N2IiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQoY3BhdGgpLyQoYnVuZGxlLWlkKSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfQogICAgICBdLAogICAgICAiZGV2aWNlcyI6IFtdLAogICAgICAic2FuZGJveF9waWRucyI6IGZhbHNlLAogICAgICAiZXhlY19jb21tYW5kcyI6IFtdLAogICAgICAiZW52X21hcCI6IHsKICAgICAgICAiSE9TVE5BTUUiOiAiJChob3N0LW5hbWUpIiwKICAgICAgICAiUEFUSCI6ICIvdXNyL2xvY2FsL3NiaW46L3Vzci9sb2NhbC9iaW46L3Vzci9zYmluOi91c3IvYmluOi9zYmluOi9iaW4iLAogICAgICAgICJTU0xfQ0VSVF9GSUxFIjogIi9ldGMvc3NsL2NlcnRzL2NhLWNlcnRpZmljYXRlcy5jcnQiCiAgICAgIH0KICAgIH0KICBdLAogICJjb21tb24iOiB7CiAgICAiY3BhdGgiOiAiL3J1bi9rYXRhLWNvbnRhaW5lcnMvc2hhcmVkL2NvbnRhaW5lcnMiLAogICAgIm1vdW50X3NvdXJjZV9jcGF0aCI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zaGFyZWQvY29udGFpbmVycyIsCiAgICAic2ZwcmVmaXgiOiAiXiQoY3BhdGgpLyQoYnVuZGxlLWlkKS1bYS16MC05XXsxNn0tIiwKICAgICJzcGF0aCI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L3N0b3JhZ2UiLAogICAgImlwdjRfYSI6ICIoKFswLTldfFsxLTldWzAtOV18MVswLTldezJ9fDJbMC00XVswLTldfDI1WzAtNV0pXFwuKXszfShbMC05XXxbMS05XVswLTldfDFbMC05XXsyfXwyWzAtNF1bMC05XXwyNVswLTVdKSIsCiAgICAiaXBfcCI6ICJbMC05XXsxLDV9IiwKICAgICJzdmNfbmFtZSI6ICJbQS1aX1xcLlxcLV0rIiwKICAgICJkbnNfbGFiZWwiOiAiW2EtekEtWjAtOV9cXC5cXC1dKyIsCiAgICAic19zb3VyY2UxIjogIl4uLjJbMC05XXszfV9bMC0xXVswLTldX1swLTNdWzAtOV1fWzAtMl1bMC05XV9bMC01XVswLTldX1swLTVdWzAtOV1cXC5bMC05XXsxLDEwfSQiLAogICAgInNfc291cmNlMiI6ICJeLi5kYXRhLyIsCiAgICAiZG5zX3N1YmRvbWFpbiI6ICJeW2EtejAtOV0oWy1hLXowLTldKlthLXowLTldKT8kIiwKICAgICJwb2RfdWlkIjogIl5bMC05YS1mQS1GXXs4fS1bMC05YS1mQS1GXXs0fS1bMC05YS1mQS1GXXs0fS1bMC05YS1mQS1GXXs0fS1bMC05YS1mQS1GXXsxMn0kIiwKICAgICJkZWZhdWx0X2NhcHMiOiBbCiAgICAgICJDQVBfQ0hPV04iLAogICAgICAiQ0FQX0RBQ19PVkVSUklERSIsCiAgICAgICJDQVBfRlNFVElEIiwKICAgICAgIkNBUF9GT1dORVIiLAogICAgICAiQ0FQX01LTk9EIiwKICAgICAgIkNBUF9ORVRfUkFXIiwKICAgICAgIkNBUF9TRVRHSUQiLAogICAgICAiQ0FQX1NFVFVJRCIsCiAgICAgICJDQVBfU0VURkNBUCIsCiAgICAgICJDQVBfU0VUUENBUCIsCiAgICAgICJDQVBfTkVUX0JJTkRfU0VSVklDRSIsCiAgICAgICJDQVBfU1lTX0NIUk9PVCIsCiAgICAgICJDQVBfS0lMTCIsCiAgICAgICJDQVBfQVVESVRfV1JJVEUiCiAgICBdLAogICAgInByaXZpbGVnZWRfY2FwcyI6IFsKICAgICAgIkNBUF9DSE9XTiIsCiAgICAgICJDQVBfREFDX09WRVJSSURFIiwKICAgICAgIkNBUF9EQUNfUkVBRF9TRUFSQ0giLAogICAgICAiQ0FQX0ZPV05FUiIsCiAgICAgICJDQVBfRlNFVElEIiwKICAgICAgIkNBUF9LSUxMIiwKICAgICAgIkNBUF9TRVRHSUQiLAogICAgICAiQ0FQX1NFVFVJRCIsCiAgICAgICJDQVBfU0VUUENBUCIsCiAgICAgICJDQVBfTElOVVhfSU1NVVRBQkxFIiwKICAgICAgIkNBUF9ORVRfQklORF9TRVJWSUNFIiwKICAgICAgIkNBUF9ORVRfQlJPQURDQVNUIiwKICAgICAgIkNBUF9ORVRfQURNSU4iLAogICAgICAiQ0FQX05FVF9SQVciLAogICAgICAiQ0FQX0lQQ19MT0NLIiwKICAgICAgIkNBUF9JUENfT1dORVIiLAogICAgICAiQ0FQX1NZU19NT0RVTEUiLAogICAgICAiQ0FQX1NZU19SQVdJTyIsCiAgICAgICJDQVBfU1lTX0NIUk9PVCIsCiAgICAgICJDQVBfU1lTX1BUUkFDRSIsCiAgICAgICJDQVBfU1lTX1BBQ0NUIiwKICAgICAgIkNBUF9TWVNfQURNSU4iLAogICAgICAiQ0FQX1NZU19CT09UIiwKICAgICAgIkNBUF9TWVNfTklDRSIsCiAgICAgICJDQVBfU1lTX1JFU09VUkNFIiwKICAgICAgIkNBUF9TWVNfVElNRSIsCiAgICAgICJDQVBfU1lTX1RUWV9DT05GSUciLAogICAgICAiQ0FQX01LTk9EIiwKICAgICAgIkNBUF9MRUFTRSIsCiAgICAgICJDQVBfQVVESVRfV1JJVEUiLAogICAgICAiQ0FQX0FVRElUX0NPTlRST0wiLAogICAgICAiQ0FQX1NFVEZDQVAiLAogICAgICAiQ0FQX01BQ19PVkVSUklERSIsCiAgICAgICJDQVBfTUFDX0FETUlOIiwKICAgICAgIkNBUF9TWVNMT0ciLAogICAgICAiQ0FQX1dBS0VfQUxBUk0iLAogICAgICAiQ0FQX0JMT0NLX1NVU1BFTkQiLAogICAgICAiQ0FQX0FVRElUX1JFQUQiLAogICAgICAiQ0FQX1BFUkZNT04iLAogICAgICAiQ0FQX0JQRiIsCiAgICAgICJDQVBfQ0hFQ0tQT0lOVF9SRVNUT1JFIgogICAgXSwKICAgICJ2aXJ0aW9fYmxrX3N0b3JhZ2VfY2xhc3NlcyI6IFsKICAgICAgImNjLWxvY2FsLWNzaSIsCiAgICAgICJjYy1tYW5hZ2VkLWNzaSIsCiAgICAgICJjYy1tYW5hZ2VkLXByZW1pdW0tY3NpIgogICAgXSwKICAgICJzbWJfc3RvcmFnZV9jbGFzc2VzIjogWwogICAgICB7CiAgICAgICAgIm5hbWUiOiAiYXp1cmVmaWxlLWNzaS1rYXRhLWNjIiwKICAgICAgICAibW91bnRfb3B0aW9ucyI6IFsKICAgICAgICAgICJkaXJfbW9kZT0wNzc3IiwKICAgICAgICAgICJmaWxlX21vZGU9MDc3NyIsCiAgICAgICAgICAibWZzeW1saW5rcyIsCiAgICAgICAgICAiY2FjaGU9c3RyaWN0IiwKICAgICAgICAgICJub3NoYXJlc29jayIsCiAgICAgICAgICAiYWN0aW1lbz0zMCIsCiAgICAgICAgICAibm9icmwiCiAgICAgICAgXQogICAgICB9CiAgICBdCiAgfSwKICAic2FuZGJveCI6IHsKICAgICJzdG9yYWdlcyI6IFsKICAgICAgewogICAgICAgICJkcml2ZXIiOiAiZXBoZW1lcmFsIiwKICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAic291cmNlIjogInNobSIsCiAgICAgICAgImZzdHlwZSI6ICJ0bXBmcyIsCiAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgIm5vZGV2IiwKICAgICAgICAgICJtb2RlPTE3NzciLAogICAgICAgICAgInNpemU9NjcxMDg4NjQiCiAgICAgICAgXSwKICAgICAgICAibW91bnRfcG9pbnQiOiAiL3J1bi9rYXRhLWNvbnRhaW5lcnMvc2FuZGJveC9zaG0iLAogICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgfQogICAgXQogIH0sCiAgInJlcXVlc3RfZGVmYXVsdHMiOiB7CiAgICAiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdCI6IHsKICAgICAgImFsbG93X2Vudl9yZWdleCI6IFsKICAgICAgICAiXkhPU1ROQU1FPSQoZG5zX2xhYmVsKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfUE9SVF8kKGlwX3ApX1RDUD10Y3A6Ly8kKGlwdjRfYSk6JChpcF9wKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfUE9SVF8kKGlwX3ApX1RDUF9QUk9UTz10Y3AkIiwKICAgICAgICAiXiQoc3ZjX25hbWUpX1BPUlRfJChpcF9wKV9UQ1BfUE9SVD0kKGlwX3ApJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9QT1JUXyQoaXBfcClfVENQX0FERFI9JChpcHY0X2EpJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9TRVJWSUNFX0hPU1Q9JChpcHY0X2EpJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9TRVJWSUNFX1BPUlQ9JChpcF9wKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfU0VSVklDRV9QT1JUXyQoZG5zX2xhYmVsKT0kKGlwX3ApJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9QT1JUPXRjcDovLyQoaXB2NF9hKTokKGlwX3ApJCIsCiAgICAgICAgIl5BWlVSRV9DTElFTlRfSUQ9W0EtRmEtZjAtOS1dKiQiLAogICAgICAgICJeQVpVUkVfVEVOQU5UX0lEPVtBLUZhLWYwLTktXSokIiwKICAgICAgICAiXkFaVVJFX0ZFREVSQVRFRF9UT0tFTl9GSUxFPS92YXIvcnVuL3NlY3JldHMvYXp1cmUvdG9rZW5zL2F6dXJlLWlkZW50aXR5LXRva2VuJCIsCiAgICAgICAgIl5BWlVSRV9BVVRIT1JJVFlfSE9TVD1odHRwczovL2xvZ2luXFwubWljcm9zb2Z0b25saW5lXFwuY29tLyQiLAogICAgICAgICJeVEVSTT14dGVybSQiCiAgICAgIF0sCiAgICAgICJhbGxvd19lbnZfcmVnZXhfbWFwIjogewogICAgICAgICJDUFVfTElNSVQiOiAiXlswLTldKyQiLAogICAgICAgICJKT0JfQ09NUExFVElPTl9JTkRFWCI6ICJeWzAtOV0qJCIsCiAgICAgICAgIk1FTU9SWV9MSU1JVCI6ICJeWzAtOV0rJCIKICAgICAgfQogICAgfSwKICAgICJDb3B5RmlsZVJlcXVlc3QiOiBbCiAgICAgICIkKHNmcHJlZml4KSIKICAgIF0sCiAgICAiRXhlY1Byb2Nlc3NSZXF1ZXN0IjogewogICAgICAiYWxsb3dlZF9jb21tYW5kcyI6IFtdLAogICAgICAicmVnZXgiOiBbXQogICAgfSwKICAgICJVcGRhdGVSb3V0ZXNSZXF1ZXN0IjogewogICAgICAiZm9yYmlkZGVuX2RldmljZV9uYW1lcyI6IFsKICAgICAgICAibG8iCiAgICAgIF0sCiAgICAgICJmb3JiaWRkZW5fc291cmNlX3JlZ2V4IjogWwogICAgICAgICJeKD86MHswLDR9Oil7MCw3fTB7MCwzfTEkIiwKICAgICAgICAiXjEyN1xcLig/OlswLTldezEsM31cXC4pezJ9WzAtOV17MSwzfSQiCiAgICAgIF0KICAgIH0sCiAgICAiVXBkYXRlSW50ZXJmYWNlUmVxdWVzdCI6IHsKICAgICAgImFsbG93X3Jhd19mbGFncyI6IDEyOCwKICAgICAgImZvcmJpZGRlbl9uYW1lcyI6IFsKICAgICAgICAibG8iCiAgICAgIF0sCiAgICAgICJmb3JiaWRkZW5faHdfYWRkcnMiOiBbCiAgICAgICAgIjAwOjAwOjAwOjAwOjAwOjAwIgogICAgICBdCiAgICB9LAogICAgIkNsb3NlU3RkaW5SZXF1ZXN0IjogZmFsc2UsCiAgICAiUmVhZFN0cmVhbVJlcXVlc3QiOiBmYWxzZSwKICAgICJVcGRhdGVFcGhlbWVyYWxNb3VudHNSZXF1ZXN0IjogZmFsc2UsCiAgICAiV3JpdGVTdHJlYW1SZXF1ZXN0IjogZmFsc2UKICB9Cn0= + spec: + runtimeClassName: kata-cc + serviceAccountName: csi-hostpathplugin-sa + containers: + - name: hostpath + image: "registry.k8s.io/sig-storage/hostpathplugin:v1.10.0" + args: + - "--drivername=hostpath.csi.k8s.io" + - "--v=5" + - "--endpoint=$(CSI_ENDPOINT)" + - "--nodeid=$(KUBE_NODE_NAME)" + env: + - name: CSI_ENDPOINT + value: "unix:///csi/csi.sock" + - name: KUBE_NODE_NAME + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: spec.nodeName + securityContext: + privileged: true + ports: + - containerPort: 9898 + name: healthz + protocol: TCP + livenessProbe: + failureThreshold: 5 + httpGet: + path: /healthz + port: healthz + initialDelaySeconds: 10 + timeoutSeconds: 3 + periodSeconds: 2 + volumeMounts: + - mountPath: /csi + name: socket-dir + - mountPath: /var/lib/kubelet/pods + name: mountpoint-dir + - mountPath: /var/lib/kubelet/plugins + name: plugins-dir + - mountPath: /csi-data-dir + name: csi-data-dir + - mountPath: /dev + name: dev-dir + - name: csi-external-health-monitor-controller + image: "registry.k8s.io/sig-storage/csi-external-health-monitor-controller:v0.7.0" + args: + - "--v=5" + - "--csi-address=$(ADDRESS)" + - "--leader-election" + env: + - name: ADDRESS + value: /csi/csi.sock + imagePullPolicy: IfNotPresent + volumeMounts: + - name: socket-dir + mountPath: /csi + - name: node-driver-registrar + image: "registry.k8s.io/sig-storage/csi-node-driver-registrar:v2.5.1" + args: + - "--v=5" + - "--csi-address=/csi/csi.sock" + - "--kubelet-registration-path=/var/lib/kubelet/plugins/csi-hostpath/csi.sock" + securityContext: + privileged: true + env: + - name: KUBE_NODE_NAME + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: spec.nodeName + volumeMounts: + - mountPath: /csi + name: socket-dir + - mountPath: /registration + name: registration-dir + - mountPath: /csi-data-dir + name: csi-data-dir + - name: liveness-probe + volumeMounts: + - mountPath: /csi + name: socket-dir + image: "registry.k8s.io/sig-storage/livenessprobe:v2.7.0" + args: + - "--csi-address=/csi/csi.sock" + - "--health-port=9898" + - name: csi-attacher + image: "registry.k8s.io/sig-storage/csi-attacher:v4.0.0" + args: + - "--v=5" + - "--csi-address=/csi/csi.sock" + securityContext: + privileged: true + volumeMounts: + - mountPath: /csi + name: socket-dir + - name: csi-provisioner + image: "registry.k8s.io/sig-storage/csi-provisioner:v3.4.0" + args: + - "-v=5" + - "--csi-address=/csi/csi.sock" + - "--feature-gates=Topology=true" + securityContext: + privileged: true + volumeMounts: + - mountPath: /csi + name: socket-dir + - name: csi-snapshotter + image: "registry.k8s.io/sig-storage/csi-snapshotter:v6.1.0" + args: + - "-v=5" + - "--csi-address=/csi/csi.sock" + securityContext: + privileged: true + volumeMounts: + - mountPath: /csi + name: socket-dir + volumes: + - hostPath: + path: /var/lib/kubelet/plugins/csi-hostpath + type: DirectoryOrCreate + name: socket-dir + - hostPath: + path: /var/lib/kubelet/pods + type: DirectoryOrCreate + name: mountpoint-dir + - hostPath: + path: /var/lib/kubelet/plugins_registry + type: Directory + name: registration-dir + - hostPath: + path: /var/lib/kubelet/plugins + type: Directory + name: plugins-dir + - hostPath: + path: /var/lib/csi-hostpath-data/ + type: DirectoryOrCreate + name: csi-data-dir + - hostPath: + path: /dev + type: Directory + name: dev-dir diff --git a/src/agent/samples/policy/yaml/kubernetes/conformance/csi-hostpath-testing.yaml b/src/agent/samples/policy/yaml/kubernetes/conformance/csi-hostpath-testing.yaml new file mode 100644 index 000000000000..178d72e84bf1 --- /dev/null +++ b/src/agent/samples/policy/yaml/kubernetes/conformance/csi-hostpath-testing.yaml @@ -0,0 +1,77 @@ +--- +apiVersion: v1 +kind: Service +metadata: + name: hostpath-service + labels: + app.kubernetes.io/instance: hostpath.csi.k8s.io + app.kubernetes.io/part-of: csi-driver-host-path + app.kubernetes.io/name: csi-hostpath-socat + app.kubernetes.io/component: socat +spec: + type: NodePort + selector: + app.kubernetes.io/instance: hostpath.csi.k8s.io + app.kubernetes.io/part-of: csi-driver-host-path + app.kubernetes.io/name: csi-hostpath-socat + app.kubernetes.io/component: socat + ports: + - port: 10000 +--- +kind: StatefulSet +apiVersion: apps/v1 +metadata: + name: csi-hostpath-socat + labels: + app.kubernetes.io/instance: hostpath.csi.k8s.io + app.kubernetes.io/part-of: csi-driver-host-path + app.kubernetes.io/name: csi-hostpath-socat + app.kubernetes.io/component: socat +spec: + serviceName: csi-hostpath-socat + replicas: 1 + selector: + matchLabels: + app.kubernetes.io/instance: hostpath.csi.k8s.io + app.kubernetes.io/part-of: csi-driver-host-path + app.kubernetes.io/name: csi-hostpath-socat + app.kubernetes.io/component: socat + template: + metadata: + labels: + app.kubernetes.io/instance: hostpath.csi.k8s.io + app.kubernetes.io/part-of: csi-driver-host-path + app.kubernetes.io/name: csi-hostpath-socat + app.kubernetes.io/component: socat + annotations: + io.katacontainers.config.agent.policy: IyBDb3B5cmlnaHQgKGMpIDIwMjMgTWljcm9zb2Z0IENvcnBvcmF0aW9uCiMKIyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMAojCnBhY2thZ2UgYWdlbnRfcG9saWN5CgppbXBvcnQgZnV0dXJlLmtleXdvcmRzLmluCmltcG9ydCBmdXR1cmUua2V5d29yZHMuZXZlcnkKCiMgRGVmYXVsdCB2YWx1ZXMsIHJldHVybmVkIGJ5IE9QQSB3aGVuIHJ1bGVzIGNhbm5vdCBiZSBldmFsdWF0ZWQgdG8gdHJ1ZS4KZGVmYXVsdCBBZGRBUlBOZWlnaGJvcnNSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgQWRkU3dhcFJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBDbG9zZVN0ZGluUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IENvcHlGaWxlUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IENyZWF0ZUNvbnRhaW5lclJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBDcmVhdGVTYW5kYm94UmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IERlc3Ryb3lTYW5kYm94UmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgRXhlY1Byb2Nlc3NSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgR2V0T09NRXZlbnRSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBHdWVzdERldGFpbHNSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBMaXN0SW50ZXJmYWNlc1JlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBMaXN0Um91dGVzUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IE1lbUhvdHBsdWdCeVByb2JlUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IE9ubGluZUNQVU1lbVJlcXVlc3QgOj0gdHJ1ZQpkZWZhdWx0IFBhdXNlQ29udGFpbmVyUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFJlYWRTdHJlYW1SZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgUmVtb3ZlQ29udGFpbmVyUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgUmVtb3ZlU3RhbGVWaXJ0aW9mc1NoYXJlTW91bnRzUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgUmVzZWVkUmFuZG9tRGV2UmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFJlc3VtZUNvbnRhaW5lclJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBTZXRHdWVzdERhdGVUaW1lUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFNldFBvbGljeVJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBTaWduYWxQcm9jZXNzUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgU3RhcnRDb250YWluZXJSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBTdGFydFRyYWNpbmdSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgU3RhdHNDb250YWluZXJSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBTdG9wVHJhY2luZ1JlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBUdHlXaW5SZXNpemVSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBVcGRhdGVDb250YWluZXJSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgVXBkYXRlRXBoZW1lcmFsTW91bnRzUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFVwZGF0ZUludGVyZmFjZVJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBVcGRhdGVSb3V0ZXNSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgV2FpdFByb2Nlc3NSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBXcml0ZVN0cmVhbVJlcXVlc3QgOj0gZmFsc2UKCiMgQWxsb3dSZXF1ZXN0c0ZhaWxpbmdQb2xpY3kgOj0gdHJ1ZSBjb25maWd1cmVzIHRoZSBBZ2VudCB0byAqYWxsb3cgYW55CiMgcmVxdWVzdHMgY2F1c2luZyBhIHBvbGljeSBmYWlsdXJlKi4gVGhpcyBpcyBhbiB1bnNlY3VyZSBjb25maWd1cmF0aW9uCiMgYnV0IGlzIHVzZWZ1bCBmb3IgYWxsb3dpbmcgdW5zZWN1cmUgcG9kcyB0byBzdGFydCwgdGhlbiBjb25uZWN0IHRvCiMgdGhlbSBhbmQgaW5zcGVjdCBPUEEgbG9ncyBmb3IgdGhlIHJvb3QgY2F1c2Ugb2YgYSBmYWlsdXJlLgpkZWZhdWx0IEFsbG93UmVxdWVzdHNGYWlsaW5nUG9saWN5IDo9IGZhbHNlCgojIENvbnN0YW50cwpTX05BTUVfS0VZID0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZSIKU19OQU1FU1BBQ0VfS0VZID0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZXNwYWNlIgpCVU5ETEVfSUQgPSAiW2EtejAtOV17NjR9IgoKQ3JlYXRlQ29udGFpbmVyUmVxdWVzdDo9IHJlc3AgewogICAgbm90IGlzX251bGwoaW5wdXQuZW52X21hcCkKICAgIAogICAgaV9lbnZfbWFwIDo9IGlucHV0LmVudl9tYXAKICAgIAogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBwX2Vudl9tYXAgOj0gcF9jb250YWluZXIuZW52X21hcCAgCiAgICBhbGxvd19lbnZfbWFwKHBfZW52X21hcCwgaV9lbnZfbWFwKQogICAgCiAgICBpX3Byb2Nlc3MgOj0gaW5wdXQuYmFzZS5PQ0kuUHJvY2VzcwogICAgCiAgICBwX3Byb2Nlc3MgOj0gcF9jb250YWluZXIuT0NJLlByb2Nlc3MKICAgIAogICAgYWxsb3dfYXJncyhpX3Byb2Nlc3MsIHBfcHJvY2VzcywgaV9lbnZfbWFwKQoKICAgIHJlc3AgPSBDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uKGlucHV0LmJhc2UpCiAgICBwcmludCgiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdDogdHJ1ZSIpCn0KCmFsbG93X2FyZ3MoaV9wcm9jZXNzLCBwX3Byb2Nlc3MsIGlfZW52X21hcCkgewogICAgaV9hcmdzIDo9IGlfcHJvY2Vzcy5BcmdzCiAgICBwX2FyZ3MgOj0gcF9wcm9jZXNzLkFyZ3MKICAgIHByaW50KCJhbGxvd19hcmdzOiBpX2FyZ3MgPSIsIGlfYXJncywgInBfYXJncyA9IiwgcF9hcmdzKQogICAgY291bnQoaV9hcmdzKSA9PSBjb3VudChwX2FyZ3MpCiAgICBldmVyeSBpLCBpX2FyZyBpbiBpX2FyZ3MgewogICAgICAgIHByaW50KCJhbGxvd19hcmdzOiBpX2FyZyA9IiwgaV9hcmcpCiAgICAgICAgcF9hcmdfcmVwbGFjZWQgOj0gcmVwbGFjZV9lbnZfdmFyaWFibGVzKHBfYXJnc1tpXSwgaV9lbnZfbWFwKQogICAgICAgIHByaW50KCJhbGxvd19hcmdzOiBwX2FyZ19yZXBsYWNlZCA9IiwgcF9hcmdfcmVwbGFjZWQpCiAgICAgICAgcF9hcmdfcmVwbGFjZWQyIDo9IHJlcGxhY2UocF9hcmdfcmVwbGFjZWQsICIkJCIsICIkIikKICAgICAgICBwcmludCgiYWxsb3dfYXJnczogcF9hcmdfcmVwbGFjZWQyID0iLCBwX2FyZ19yZXBsYWNlZDIpCiAgICAgICAgaV9hcmcgPT0gcF9hcmdfcmVwbGFjZWQyCiAgICB9CiAgICBwcmludCgiYWxsb3dfYXJnczogdHJ1ZSIpCn0KCmFsbG93X2FyZ3MoaV9wcm9jZXNzLCBwX3Byb2Nlc3MsIGlfZW52X21hcCkgewogICAgbm90IGlfcHJvY2Vzcy5BcmdzCiAgICBub3QgcF9wcm9jZXNzLkFyZ3MKICAgIHByaW50KCJhbGxvd19hcmdzMjogbm8gYXJncyIpCn0KCiMgdGhpcyBmdW5jdGlvbiByZXBsYWNlcyBhbGwgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyBpbiBhIHN0cmluZywgZ2l2ZW4gYSBtYXAgb2YgZW52aXJvbm1lbnQga2V5cyB0byBlbnZpcm9ubWVudCB2YWx1ZXMKIyBlZyBzdHIgPSAiZWNobyAkKENMVVNURVJfSUQpOyBlY2hvICQoTk9ERV9OQU1FKTsiCiMgZW52X21hcCA9IHsiQ0xVU1RFUl9JRCI6ICJhYmMiLCAiTk9ERV9OQU1FIiA6ICJ4eXoifQojIHJlc3VsdCA9ICJlY2hvIGFiYzsgZWNobyB4eXo7IgpyZXBsYWNlX2Vudl92YXJpYWJsZXMoc3RyLCBlbnZfbWFwKSA9IHJlc3VsdCB7CiAgICAjIG1ha2UgYW4gYXJyYXkgb2YgdGhlIGtleXMgZWcgWyJDTFVTVEVSX0lEIiwgIk5PREVfTkFNRSJdCiAgICBrZXlzIDo9IFt4IHwgc29tZSB4IGluIG9iamVjdC5rZXlzKGVudl9tYXApXQogICAgcmVzdWx0IDo9IHJlcGxhY2Vfc3RyX3JlYyhzdHIsIGVudl9tYXAsIGtleXMsIGNvdW50KGtleXMpIC0gMSkKfQoKIyBiYXNlIGNhc2UKcmVwbGFjZV9zdHJfcmVjKHN0ciwgZW52X21hcCwgYXJyX2tleXMsIGkpID0gcmVzdWx0IHsKICAgIGkgPCAwCiAgICByZXN1bHQgOj0gc3RyCn0KCiMgcmVjdXJzaXZlIHN0ZXAKcmVwbGFjZV9zdHJfcmVjKHN0ciwgZW52X21hcCwgYXJyX2tleXMsIGkpID0gcmVzdWx0IHsKICAgIGkgPj0gMAogICAga2V5IDo9IGFycl9rZXlzW2ldCiAgICBlbnZfa2V5MSA6PSBjb25jYXQoIiIsIFsiJCgiLCBrZXksICIpIl0pCiAgICAjIHJlcGxhY2UgJChWQVIpIHdpdGggdmFsdWUKICAgIG5ld19zdHIxIDo9IHJlcGxhY2Uoc3RyLCBlbnZfa2V5MSwgZW52X21hcFtrZXldKQogICAgIyByZXBsYWNlIG5leHQgZW52aXJvbm1lbnQgdmFyaWFibGUKICAgIHJlc3VsdCA9IHJlcGxhY2Vfc3RyX3JlYyhuZXdfc3RyMSwgZW52X21hcCwgYXJyX2tleXMsIGkgLSAxKQp9CgphbGxvd19lbnZfbWFwKHBfZW52X21hcCwgaV9lbnZfbWFwKSB7CiAgICBwcmludCgiYWxsb3dfZW52X21hcDogcF9lbnZfbWFwID0iLCBwX2Vudl9tYXApCiAgICBldmVyeSBlbnZfa2V5LCBlbnZfdmFsIGluIGlfZW52X21hcCB7CiAgICAgICAgcHJpbnQoImFsbG93X2VudjogZW52X2tleSA9IiwgZW52X2tleSwgImVudl92YWwgPSIsIGVudl92YWwpCiAgICAgICAgYWxsb3dfZW52X21hcF9lbnRyeShlbnZfa2V5LCBlbnZfdmFsLCBwX2Vudl9tYXApCiAgICB9CiAgICBwcmludCgiYWxsb3dfZW52X21hcDogdHJ1ZSIpCn0KCiMgQWxsb3cgZXhhY3QgbWF0Y2gKYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBpX3ZhbCA9PSBwX3ZhbAogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnk6IHRydWUiKQp9CgojIEFsbG93IHJlc291cmNlRmllbGRSZWYgdmFsdWVzIChlLmcuLCAibGltaXRzLmNwdSIpLgphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgICMgYSB2YXJpYWJsZSB3ZSBzaG91bGQgYmUgdmFsaWRhdGluZyB1c2luZyBhIHJlZ2V4IGZyb20gc2V0dGluZ3MKICAgIHBfdmFsID09ICIkKHZhbGlkYXRlLWZyb20tc2V0dGluZ3MpIgogICAgcmVnZXhfdmFsIDo9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuQ3JlYXRlQ29udGFpbmVyUmVxdWVzdC5hbGxvd19lbnZfcmVnZXhfbWFwW2tleV0KICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4X3ZhbCwgaV92YWwpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSAyOiB0cnVlIikKfQoKIyBBbGxvdyBub2RlLW5hbWUKYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChub2RlLW5hbWUpIgogICAgcmVnZXgubWF0Y2gocG9saWN5X2RhdGEuY29tbW9uLmRuc19zdWJkb21haW4gLCBpX3ZhbCkKICAgIHByaW50KCJhbGxvd19lbnZfbWFwX2VudHJ5IDM6IHRydWUiKQp9CgojIEFsbG93IGhvc3QtbmFtZQphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgIHBfdmFsID09ICIkKGhvc3QtbmFtZSkiCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24uZG5zX2xhYmVsICwgaV92YWwpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSA0OiB0cnVlIikKfQoKIyBBbGxvdyBwb2QtdWlkCmFsbG93X2Vudl9tYXBfZW50cnkoa2V5LCBpX3ZhbCwgcF9lbnZfbWFwKSB7CiAgICBwX3ZhbCA6PSBwX2Vudl9tYXBba2V5XQogICAgcF92YWwgPT0gIiQocG9kLXVpZCkiCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24ucG9kX3VpZCAsIGlfdmFsKQogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgNTogdHJ1ZSIpCn0KCiMgQWxsb3cgZmllbGRSZWYgImZpZWxkUGF0aDogc3RhdHVzLnBvZElQIiB2YWx1ZXMuCmFsbG93X2Vudl9tYXBfZW50cnkoa2V5LCBpX3ZhbCwgcF9lbnZfbWFwKSB7CiAgICBpc19pcChpX3ZhbCkKCiAgICBwX3ZhbCA6PSBwX2Vudl9tYXBba2V5XQogICAgcF92YXIgOj0gY29uY2F0KCI9IiwgW2tleSwgcF92YWxdKQogICAgYWxsb3dfcG9kX2lwX3ZhcihrZXksIHBfdmFyKQogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgNjogdHJ1ZSIpCn0KCiMgQWxsb3cgZmllbGRSZWYgImZpZWxkUGF0aDogc3RhdHVzLmhvc3RJUCIgdmFsdWVzLgphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgaXNfaXAoaV92YWwpCgogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgIHBfdmFyIDo9IGNvbmNhdCgiPSIsIFtrZXksIHBfdmFsXSkKICAgIGFsbG93X2hvc3RfaXBfdmFyKGtleSwgcF92YXIpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSA3OiB0cnVlIikKfQoKIyBNYXRjaCBpbnB1dCB3aXRoIG9uZSBvZiB0aGUgcG9saWN5IHZhcmlhYmxlcywgYWZ0ZXIgc3Vic3RpdHV0aW5nICQoc2FuZGJveC1uYW1lKS4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChzYW5kYm94LW5hbWUpIgogICAgc19uYW1lIDo9IGlucHV0LmJhc2UuT0NJLkFubm90YXRpb25zW1NfTkFNRV9LRVldCiAgICBwX3ZhcjIgOj0gcmVwbGFjZShwX3ZhbCwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHBfdmFyMiA9PSBpX3ZhbAogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgODogdHJ1ZSIpCn0KCiMgTWF0Y2ggaW5wdXQgd2l0aCBvbmUgb2YgdGhlIHBvbGljeSB2YXJpYWJsZXMsIGFmdGVyIHN1YnN0aXR1dGluZyAkKHNhbmRib3gtbmFtZXNwYWNlKS4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChzYW5kYm94LW5hbWVzcGFjZSkiCiAgICBzX25hbWVzcGFjZSA6PSBpbnB1dC5iYXNlLk9DSS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwX3ZhcjIgOj0gcmVwbGFjZShwX3ZhbCwgIiQoc2FuZGJveC1uYW1lc3BhY2UpIiwgc19uYW1lc3BhY2UpCiAgICBwX3ZhcjIgPT0gaV92YWwKICAgIHByaW50KCJhbGxvd19lbnZfbWFwX2VudHJ5IDk6IHRydWUiKQp9CgojIEFsbG93IGlucHV0IGVudiB2YXJpYWJsZXMgdGhhdCBtYXRjaCB3aXRoIGEgcmVxdWVzdF9kZWZhdWx0cyByZWdleC4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHNvbWUgcF9yZWdleDEgaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5DcmVhdGVDb250YWluZXJSZXF1ZXN0LmFsbG93X2Vudl9yZWdleAogICAgcF9yZWdleDIgOj0gcmVwbGFjZShwX3JlZ2V4MSwgIiQoaXB2NF9hKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcHY0X2EpCiAgICBwX3JlZ2V4MyA6PSByZXBsYWNlKHBfcmVnZXgyLCAiJChpcF9wKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcF9wKQogICAgcF9yZWdleDQgOj0gcmVwbGFjZShwX3JlZ2V4MywgIiQoc3ZjX25hbWUpIiwgcG9saWN5X2RhdGEuY29tbW9uLnN2Y19uYW1lKQogICAgcF9yZWdleDUgOj0gcmVwbGFjZShwX3JlZ2V4NCwgIiQoZG5zX2xhYmVsKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5kbnNfbGFiZWwpCgogICAgcmVzdWx0IDo9IGNvbmNhdCgiPSIsIFtrZXksIGlfdmFsXSkKICAgIHJlZ2V4Lm1hdGNoKHBfcmVnZXg1LCByZXN1bHQpCgogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgMTA6IHRydWUiKQp9CgpDcmVhdGVDb250YWluZXJSZXF1ZXN0Oj0gcmVzcCB7CiAgICBub3QgaW5wdXQuZW52X21hcAogICAgaV9wcm9jZXNzID0gaW5wdXQuT0NJLlByb2Nlc3MKICAgIHNfbmFtZSA9IGlucHV0Lk9DSS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBwX3Byb2Nlc3MgPSBwX2NvbnRhaW5lci5PQ0kuUHJvY2VzcwogICAgYWxsb3dfZGVwcmVjYXRlZF9hcmdzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUpCiAgICByZXNwID0gQ3JlYXRlQ29udGFpbmVyUmVxdWVzdENvbW1vbihpbnB1dCkKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0MjogdHJ1ZSIpCn0KCkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb24ocmVxKTo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgICMgQ2hlY2sgaWYgdGhlIGlucHV0IHJlcXVlc3Qgc2hvdWxkIGJlIHJlamVjdGVkIGV2ZW4gYmVmb3JlIGNoZWNraW5nIHRoZQogICAgIyBwb2xpY3lfZGF0YS5jb250YWluZXJzIGluZm9ybWF0aW9uLgogICAgYWxsb3dfY3JlYXRlX2NvbnRhaW5lcl9pbnB1dChyZXEpCgogICAgaV9vY2kgOj0gcmVxLk9DSQogICAgaV9zdG9yYWdlcyA6PSByZXEuc3RvcmFnZXMKICAgIGlfZGV2aWNlcyA6PSByZXEuZGV2aWNlcwoKICAgICMgYXJyYXkgb2YgcG9zc2libGUgc3RhdGUgb3BlcmF0aW9ucwogICAgb3BzX2J1aWxkZXIgOj0gW10KCiAgICAjIGNoZWNrIHNhbmRib3ggbmFtZQogICAgc2FuZGJveF9uYW1lID0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FX0tFWV0KICAgIGFkZF9zYW5kYm94X25hbWVfdG9fc3RhdGUgOj0gc3RhdGVfYWxsb3dzKCJzYW5kYm94X25hbWUiLCBzYW5kYm94X25hbWUpCiAgICBvcHNfYnVpbGRlcjEgOj0gY29uY2F0X29wX2lmX25vdF9udWxsKG9wc19idWlsZGVyLCBhZGRfc2FuZGJveF9uYW1lX3RvX3N0YXRlKQoKICAgICMgQ2hlY2sgaWYgYW55IGVsZW1lbnQgZnJvbSB0aGUgcG9saWN5X2RhdGEuY29udGFpbmVycyBhcnJheSBhbGxvd3MgdGhlIGlucHV0IHJlcXVlc3QuCiAgICBzb21lIHBfY29udGFpbmVyIGluIHBvbGljeV9kYXRhLmNvbnRhaW5lcnMKICAgIHByaW50KCI9PT09PT09PSBDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiB0cnlpbmcgbmV4dCBwb2xpY3kgY29udGFpbmVyIikKCiAgICBwX3BpZG5zIDo9IHBfY29udGFpbmVyLnNhbmRib3hfcGlkbnMKICAgIGlfcGlkbnMgOj0gcmVxLnNhbmRib3hfcGlkbnMKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiBwX3BpZG5zID0iLCBwX3BpZG5zLCAiaV9waWRucyA9IiwgaV9waWRucykKICAgIHBfcGlkbnMgPT0gaV9waWRucwoKICAgIHBfb2NpIDo9IHBfY29udGFpbmVyLk9DSQoKICAgICMgY2hlY2sgbmFtZXNwYWNlCiAgICBwX25hbWVzcGFjZSA6PSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBpX25hbWVzcGFjZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwcmludCAoIkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb246IHBfbmFtZXNwYWNlID0iLCBwX25hbWVzcGFjZSwgImlfbmFtZXNwYWNlID0iLCBpX25hbWVzcGFjZSkKICAgIGFkZF9uYW1lc3BhY2VfdG9fc3RhdGUgOj0gYWxsb3dfbmFtZXNwYWNlKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkKICAgIG9wc19idWlsZGVyMiA6PSBjb25jYXRfb3BfaWZfbm90X251bGwob3BzX2J1aWxkZXIxLCBhZGRfbmFtZXNwYWNlX3RvX3N0YXRlKQoKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiBwIFZlcnNpb24gPSIsIHBfb2NpLlZlcnNpb24sICJpIFZlcnNpb24gPSIsIGlfb2NpLlZlcnNpb24pCiAgICBwX29jaS5WZXJzaW9uID09IGlfb2NpLlZlcnNpb24KCiAgICBwcmludCgiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdENvbW1vbjogcCBSZWFkb25seSA9IiwgcF9vY2kuUm9vdC5SZWFkb25seSwgImkgUmVhZG9ubHkgPSIsIGlfb2NpLlJvb3QuUmVhZG9ubHkpCiAgICBwX29jaS5Sb290LlJlYWRvbmx5ID09IGlfb2NpLlJvb3QuUmVhZG9ubHkKCiAgICBhbGxvd19hbm5vKHBfb2NpLCBpX29jaSkKCiAgICBwX3N0b3JhZ2VzIDo9IHBfY29udGFpbmVyLnN0b3JhZ2VzCiAgICBhbGxvd19ieV9hbm5vKHBfb2NpLCBpX29jaSwgcF9zdG9yYWdlcywgaV9zdG9yYWdlcykKCiAgICBwX2RldmljZXMgOj0gcF9jb250YWluZXIuZGV2aWNlcwogICAgYWxsb3dfZGV2aWNlcyhwX2RldmljZXMsIGlfZGV2aWNlcykKCiAgICByZXQgOj0gYWxsb3dfbGludXgob3BzX2J1aWxkZXIyLCBwX29jaSwgaV9vY2kpCiAgICByZXQuYWxsb3dlZAoKICAgIG9wcyA6PSByZXQub3BzCgogICAgcHJpbnQoIkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb246IHRydWUiKQp9CgphbGxvd19jcmVhdGVfY29udGFpbmVyX2lucHV0KHJlcSkgewogICAgcHJpbnQoImFsbG93X2NyZWF0ZV9jb250YWluZXJfaW5wdXQ6IGlucHV0ID0iLCByZXEpCgogICAgY291bnQocmVxLnNoYXJlZF9tb3VudHMpID09IDAKICAgIGlzX251bGwocmVxLnN0cmluZ191c2VyKQoKICAgIGlfb2NpIDo9IHJlcS5PQ0kKICAgIGlzX251bGwoaV9vY2kuSG9va3MpCiAgICBpc19udWxsKGlfb2NpLlNvbGFyaXMpCiAgICBpc19udWxsKGlfb2NpLldpbmRvd3MpCgogICAgaV9saW51eCA6PSBpX29jaS5MaW51eAogICAgY291bnQoaV9saW51eC5HSURNYXBwaW5ncykgPT0gMAogICAgY291bnQoaV9saW51eC5Nb3VudExhYmVsKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlJlc291cmNlcy5EZXZpY2VzKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlJvb3Rmc1Byb3BhZ2F0aW9uKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlVJRE1hcHBpbmdzKSA9PSAwCiAgICBpc19udWxsKGlfbGludXguSW50ZWxSZHQpCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLkJsb2NrSU8pCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLk5ldHdvcmspCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLlBpZHMpCiAgICBpc19udWxsKGlfbGludXguU2VjY29tcCkKCiAgICBpX3Byb2Nlc3MgOj0gaV9vY2kuUHJvY2VzcwogICAgY291bnQoaV9wcm9jZXNzLlNlbGludXhMYWJlbCkgPT0gMAogICAgY291bnQoaV9wcm9jZXNzLlVzZXIuVXNlcm5hbWUpID09IDAKCiAgICBwcmludCgiYWxsb3dfY3JlYXRlX2NvbnRhaW5lcl9pbnB1dDogdHJ1ZSIpCn0KCmFsbG93X25hbWVzcGFjZShwX25hbWVzcGFjZSwgaV9uYW1lc3BhY2UpID0gYWRkX25hbWVzcGFjZSB7CiAgICBwX25hbWVzcGFjZSA9PSBpX25hbWVzcGFjZQogICAgYWRkX25hbWVzcGFjZSA6PSBudWxsCiAgICBwcmludCgiYWxsb3dfbmFtZXNwYWNlIDE6IGlucHV0IG5hbWVzcGFjZSBtYXRjaGVzIHBvbGljeSBkYXRhIikKfQoKYWxsb3dfbmFtZXNwYWNlKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkgPSBhZGRfbmFtZXNwYWNlIHsKICAgIHBfbmFtZXNwYWNlID09ICIiCiAgICBwcmludCgiYWxsb3dfbmFtZXNwYWNlIDI6IG5vIG5hbWVzcGFjZSBmb3VuZCBvbiBwb2xpY3kgZGF0YSIpCiAgICBhZGRfbmFtZXNwYWNlIDo9IHN0YXRlX2FsbG93cygibmFtZXNwYWNlIiwgaV9uYW1lc3BhY2UpCn0KCiMgdmFsdWUgaGFzbid0IGJlZW4gc2VlbiBiZWZvcmUsIHNhdmUgaXQgdG8gc3RhdGUKc3RhdGVfYWxsb3dzKGtleSwgdmFsdWUpID0gYWN0aW9uIHsKICBzdGF0ZSA6PSBnZXRfc3RhdGUoKQogIHByaW50KCJzdGF0ZV9hbGxvd3MgMTogc3RhdGVba2V5XSA9Iiwgc3RhdGVba2V5XSwgInZhbHVlID0iLCB2YWx1ZSkKICBub3Qgc3RhdGVba2V5XQogIHByaW50KCJzdGF0ZV9hbGxvd3MgMTogc2F2aW5nIHRvIHN0YXRlIGtleSA9Iiwga2V5LCAidmFsdWUgPSIsIHZhbHVlKQogIHBhdGggOj0gZ2V0X3N0YXRlX3BhdGgoa2V5KSAKICBhY3Rpb24gOj0gewogICAgIm9wIjogImFkZCIsCiAgICAicGF0aCI6IHBhdGgsIAogICAgInZhbHVlIjogdmFsdWUsCiAgfQp9CgojIHZhbHVlIG1hdGNoZXMgd2hhdCdzIGluIHN0YXRlLCBhbGxvdyBpdApzdGF0ZV9hbGxvd3Moa2V5LCB2YWx1ZSkgPSBhY3Rpb24gewogIHByaW50KCJzdGF0ZV9hbGxvd3MgMjogc3RhcnQiKQogIHN0YXRlIDo9IGdldF9zdGF0ZSgpCiAgcHJpbnQoInN0YXRlX2FsbG93cyAyOiBzdGF0ZVtrZXldID0iLCBzdGF0ZVtrZXldLCAidmFsdWUgPSIsIHZhbHVlKQogIHZhbHVlID09IHN0YXRlW2tleV0KICBwcmludCgic3RhdGVfYWxsb3dzIDI6IGZvdW5kIGtleSA9Iiwga2V5LCAidmFsdWUgPSIsIHZhbHVlLCAiIGluIHN0YXRlIikKICBhY3Rpb24gOj0gbnVsbAp9CgojIGhlbHBlciBmdW5jdGlvbnMgdG8gaW50ZXJhY3Qgd2l0aCB0aGUgc3RhdGUKZ2V0X3N0YXRlKCkgPSBzdGF0ZSB7CiAgc3RhdGUgOj0gZGF0YVsicHN0YXRlIl0KfQoKZ2V0X3N0YXRlX3ZhbChrZXkpID0gdmFsdWUgewogICAgc3RhdGUgOj0gZ2V0X3N0YXRlKCkKICAgIHZhbHVlIDo9IHN0YXRlW2tleV0KfQoKZ2V0X3N0YXRlX3BhdGgoa2V5KSA9IHBhdGggewogICAgIyBwcmVwZW5kICIvcHN0YXRlLyIgdG8ga2V5CiAgICBwYXRoIDo9IGNvbmNhdCgiLyIsIFsiL3BzdGF0ZSIsIGtleV0pCn0KCiMgSGVscGVyIGZ1bmN0aW9ucyB0byBjb25kaXRpb25hbGx5IGNvbmNhdGVuYXRlIG9wIGlzIG5vdCBudWxsCmNvbmNhdF9vcF9pZl9ub3RfbnVsbChvcHMsIG9wKSA9IHJlc3VsdCB7CiAgICBvcCA9PSBudWxsCiAgICByZXN1bHQgOj0gb3BzCn0KCmNvbmNhdF9vcF9pZl9ub3RfbnVsbChvcHMsIG9wKSA9IHJlc3VsdCB7CiAgICBvcCAhPSBudWxsCiAgICByZXN1bHQgOj0gYXJyYXkuY29uY2F0KG9wcywgW29wXSkKfQoKIyBSZWplY3QgdW5leHBlY3RlZCBhbm5vdGF0aW9ucy4KYWxsb3dfYW5ubyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19hbm5vIDE6IHN0YXJ0IikKCiAgICBub3QgaV9vY2kuQW5ub3RhdGlvbnMKCiAgICBwcmludCgiYWxsb3dfYW5ubyAxOiB0cnVlIikKfQphbGxvd19hbm5vKHBfb2NpLCBpX29jaSkgewogICAgcHJpbnQoImFsbG93X2Fubm8gMjogcCBBbm5vdGF0aW9ucyA9IiwgcF9vY2kuQW5ub3RhdGlvbnMpCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiBpIEFubm90YXRpb25zID0iLCBpX29jaS5Bbm5vdGF0aW9ucykKCiAgICBpX2tleXMgOj0gb2JqZWN0LmtleXMoaV9vY2kuQW5ub3RhdGlvbnMpCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiBpIGtleXMgPSIsIGlfa2V5cykKCiAgICBldmVyeSBpX2tleSBpbiBpX2tleXMgewogICAgICAgIGFsbG93X2Fubm9fa2V5KGlfa2V5LCBwX29jaSkKICAgIH0KCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiB0cnVlIikKfQoKYWxsb3dfYW5ub19rZXkoaV9rZXksIHBfb2NpKSB7CiAgICBwcmludCgiYWxsb3dfYW5ub19rZXkgMTogaSBrZXkgPSIsIGlfa2V5KQoKICAgIHN0YXJ0c3dpdGgoaV9rZXksICJpby5rdWJlcm5ldGVzLmNyaS4iKQoKICAgIHByaW50KCJhbGxvd19hbm5vX2tleSAxOiB0cnVlIikKfQphbGxvd19hbm5vX2tleShpX2tleSwgcF9vY2kpIHsKICAgIHByaW50KCJhbGxvd19hbm5vX2tleSAyOiBpIGtleSA9IiwgaV9rZXkpCgogICAgc29tZSBwX2tleSwgXyBpbiBwX29jaS5Bbm5vdGF0aW9ucwogICAgcF9rZXkgPT0gaV9rZXkKCiAgICBwcmludCgiYWxsb3dfYW5ub19rZXkgMjogdHJ1ZSIpCn0KCiMgR2V0IHRoZSB2YWx1ZSBvZiB0aGUgU19OQU1FX0tFWSBhbm5vdGF0aW9uIGFuZAojIGNvcnJlbGF0ZSBpdCB3aXRoIG90aGVyIGFubm90YXRpb25zIGFuZCBwcm9jZXNzIGZpZWxkcy4KYWxsb3dfYnlfYW5ubyhwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpIHsKICAgIHByaW50KCJhbGxvd19ieV9hbm5vIDE6IHN0YXJ0IikKCiAgICBub3QgcF9vY2kuQW5ub3RhdGlvbnNbU19OQU1FX0tFWV0KCiAgICBpX3NfbmFtZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMTogaV9zX25hbWUgPSIsIGlfc19uYW1lKQoKICAgIGlfc19uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FU1BBQ0VfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMTogaV9zX25hbWVzcGFjZSA9IiwgaV9zX25hbWVzcGFjZSkKCiAgICBhbGxvd19ieV9zYW5kYm94X25hbWUocF9vY2ksIGlfb2NpLCBwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBpX3NfbmFtZSwgaV9zX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfYnlfYW5ubyAxOiB0cnVlIikKfQphbGxvd19ieV9hbm5vKHBfb2NpLCBpX29jaSwgcF9zdG9yYWdlcywgaV9zdG9yYWdlcykgewogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMjogc3RhcnQiKQoKICAgIHBfc19uYW1lIDo9IHBfb2NpLkFubm90YXRpb25zW1NfTkFNRV9LRVldCiAgICBpX3NfbmFtZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMjogaV9zX25hbWUgPSIsIGlfc19uYW1lLCAicF9zX25hbWUgPSIsIHBfc19uYW1lKQoKICAgIGFsbG93X3NhbmRib3hfbmFtZShwX3NfbmFtZSwgaV9zX25hbWUpCgogICAgaV9zX25hbWVzcGFjZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwcmludCgiYWxsb3dfYnlfYW5ubyAyOiBpX3NfbmFtZXNwYWNlID0iLCBpX3NfbmFtZXNwYWNlKQoKICAgIGFsbG93X2J5X3NhbmRib3hfbmFtZShwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMsIGlfc19uYW1lLCBpX3NfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd19ieV9hbm5vIDI6IHRydWUiKQp9CgphbGxvd19ieV9zYW5kYm94X25hbWUocF9vY2ksIGlfb2NpLCBwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfYnlfc2FuZGJveF9uYW1lOiBzdGFydCIpCgogICAgaV9uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FU1BBQ0VfS0VZXQoKICAgIGFsbG93X2J5X2NvbnRhaW5lcl90eXBlcyhwX29jaSwgaV9vY2ksIHNfbmFtZSwgaV9uYW1lc3BhY2UpCiAgICBhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZChwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpCiAgICBhbGxvd19wcm9jZXNzKHBfb2NpLlByb2Nlc3MsIGlfb2NpLlByb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpCgogICAgcHJpbnQoImFsbG93X2J5X3NhbmRib3hfbmFtZTogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfbmFtZShwX3NfbmFtZSwgaV9zX25hbWUpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X25hbWU6IHN0YXJ0IikKICAgIHJlZ2V4Lm1hdGNoKHBfc19uYW1lLCBpX3NfbmFtZSkKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9uYW1lOiB0cnVlIikKfQoKIyBDaGVjayB0aGF0IHRoZSAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLXR5cGUiIGFuZAojICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIiBhbm5vdGF0aW9ucyBkZXNpZ25hdGUgdGhlCiMgZXhwZWN0ZWQgdHlwZSAtIGVpdGhlciBhICJzYW5kYm94IiBvciBhICJjb250YWluZXIiLiBUaGVuLCB2YWxpZGF0ZQojIG90aGVyIGFubm90YXRpb25zIGJhc2VkIG9uIHRoZSBhY3R1YWwgInNhbmRib3giIG9yICJjb250YWluZXIiIHZhbHVlCiMgZnJvbSB0aGUgaW5wdXQgY29udGFpbmVyLgphbGxvd19ieV9jb250YWluZXJfdHlwZXMocF9vY2ksIGlfb2NpLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfYnlfY29udGFpbmVyX3R5cGVzOiBjaGVja2luZyBpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSIpCgogICAgY190eXBlIDo9ICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSIKICAgIAogICAgcF9jcmlfdHlwZSA6PSBwX29jaS5Bbm5vdGF0aW9uc1tjX3R5cGVdCiAgICBpX2NyaV90eXBlIDo9IGlfb2NpLkFubm90YXRpb25zW2NfdHlwZV0KICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZXM6IHBfY3JpX3R5cGUgPSIsIHBfY3JpX3R5cGUsICJpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgcF9jcmlfdHlwZSA9PSBpX2NyaV90eXBlCgogICAgYWxsb3dfYnlfY29udGFpbmVyX3R5cGUoaV9jcmlfdHlwZSwgcF9vY2ksIGlfb2NpLCBzX25hbWUsIHNfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZXM6IHRydWUiKQp9CgphbGxvd19ieV9jb250YWluZXJfdHlwZShpX2NyaV90eXBlLCBwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAxOiBpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgaV9jcmlfdHlwZSA9PSAic2FuZGJveCIKCiAgICBpX2thdGFfdHlwZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1siaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5jb250YWluZXJfdHlwZSJdCiAgICBwcmludCgiYWxsb3dfYnlfY29udGFpbmVyX3R5cGUgMTogaV9rYXRhX3R5cGUgPSIsIGlfa2F0YV90eXBlKQogICAgaV9rYXRhX3R5cGUgPT0gInBvZF9zYW5kYm94IgoKICAgIGFsbG93X3NhbmRib3hfY29udGFpbmVyX25hbWUocF9vY2ksIGlfb2NpKQogICAgYWxsb3dfc2FuZGJveF9uZXRfbmFtZXNwYWNlKHBfb2NpLCBpX29jaSkKICAgIGFsbG93X3NhbmRib3hfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpCgogICAgcHJpbnQoImFsbG93X2J5X2NvbnRhaW5lcl90eXBlIDE6IHRydWUiKQp9CgphbGxvd19ieV9jb250YWluZXJfdHlwZShpX2NyaV90eXBlLCBwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiBpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgaV9jcmlfdHlwZSA9PSAiY29udGFpbmVyIgoKICAgIGlfa2F0YV90eXBlIDo9IGlfb2NpLkFubm90YXRpb25zWyJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIl0KICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiBpX2thdGFfdHlwZSA9IiwgaV9rYXRhX3R5cGUpCiAgICBpX2thdGFfdHlwZSA9PSAicG9kX2NvbnRhaW5lciIKCiAgICBhbGxvd19jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpCiAgICBhbGxvd19uZXRfbmFtZXNwYWNlKHBfb2NpLCBpX29jaSkKICAgIGFsbG93X2xvZ19kaXJlY3RvcnkocF9vY2ksIGlfb2NpKQoKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiB0cnVlIikKfQoKIyAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLW5hbWUiIGFubm90YXRpb24KYWxsb3dfc2FuZGJveF9jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X2NvbnRhaW5lcl9uYW1lOiBzdGFydCIpCgogICAgY29udGFpbmVyX2Fubm90YXRpb25fbWlzc2luZyhwX29jaSwgaV9vY2ksICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItbmFtZSIpCgogICAgcHJpbnQoImFsbG93X3NhbmRib3hfY29udGFpbmVyX25hbWU6IHRydWUiKQp9CgphbGxvd19jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19jb250YWluZXJfbmFtZTogc3RhcnQiKQoKICAgIGFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uKHBfb2NpLCBpX29jaSwgImlvLmt1YmVybmV0ZXMuY3JpLmNvbnRhaW5lci1uYW1lIikKCiAgICBwcmludCgiYWxsb3dfY29udGFpbmVyX25hbWU6IHRydWUiKQp9Cgpjb250YWluZXJfYW5ub3RhdGlvbl9taXNzaW5nKHBfb2NpLCBpX29jaSwga2V5KSB7CiAgICBwcmludCgiY29udGFpbmVyX2Fubm90YXRpb25fbWlzc2luZzoiLCBrZXkpCgogICAgbm90IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIG5vdCBpX29jaS5Bbm5vdGF0aW9uc1trZXldCgogICAgcHJpbnQoImNvbnRhaW5lcl9hbm5vdGF0aW9uX21pc3Npbmc6IHRydWUiKQp9CgphbGxvd19jb250YWluZXJfYW5ub3RhdGlvbihwX29jaSwgaV9vY2ksIGtleSkgewogICAgcHJpbnQoImFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uOiBrZXkgPSIsIGtleSkKCiAgICBwX3ZhbHVlIDo9IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIGlfdmFsdWUgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgcHJpbnQoImFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uOiBwX3ZhbHVlID0iLCBwX3ZhbHVlLCAiaV92YWx1ZSA9IiwgaV92YWx1ZSkKCiAgICBwX3ZhbHVlID09IGlfdmFsdWUKCiAgICBwcmludCgiYWxsb3dfY29udGFpbmVyX2Fubm90YXRpb246IHRydWUiKQp9CgojICJuZXJkY3RsL25ldHdvcmstbmFtZXNwYWNlIiBhbm5vdGF0aW9uCmFsbG93X3NhbmRib3hfbmV0X25hbWVzcGFjZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X25ldF9uYW1lc3BhY2U6IHN0YXJ0IikKCiAgICBrZXkgOj0gIm5lcmRjdGwvbmV0d29yay1uYW1lc3BhY2UiCgogICAgcF9uYW1lc3BhY2UgOj0gcF9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgaV9uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgcHJpbnQoImFsbG93X3NhbmRib3hfbmV0X25hbWVzcGFjZTogcF9uYW1lc3BhY2UgPSIsIHBfbmFtZXNwYWNlLCAiaV9uYW1lc3BhY2UgPSIsIGlfbmFtZXNwYWNlKQoKICAgIHJlZ2V4Lm1hdGNoKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9uZXRfbmFtZXNwYWNlOiB0cnVlIikKfQoKYWxsb3dfbmV0X25hbWVzcGFjZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19uZXRfbmFtZXNwYWNlOiBzdGFydCIpCgogICAga2V5IDo9ICJuZXJkY3RsL25ldHdvcmstbmFtZXNwYWNlIgoKICAgIG5vdCBwX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICBub3QgaV9vY2kuQW5ub3RhdGlvbnNba2V5XQoKICAgIHByaW50KCJhbGxvd19uZXRfbmFtZXNwYWNlOiB0cnVlIikKfQoKIyAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1sb2ctZGlyZWN0b3J5IiBhbm5vdGF0aW9uCmFsbG93X3NhbmRib3hfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X2xvZ19kaXJlY3Rvcnk6IHN0YXJ0IikKCiAgICBrZXkgOj0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbG9nLWRpcmVjdG9yeSIKCiAgICBwX2RpciA6PSBwX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICByZWdleDEgOj0gcmVwbGFjZShwX2RpciwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHJlZ2V4MiA6PSByZXBsYWNlKHJlZ2V4MSwgIiQoc2FuZGJveC1uYW1lc3BhY2UpIiwgc19uYW1lc3BhY2UpCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiByZWdleDIgPSIsIHJlZ2V4MikKCiAgICBpX2RpciA6PSBpX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiBpX2RpciA9IiwgaV9kaXIpCgogICAgcmVnZXgubWF0Y2gocmVnZXgyLCBpX2RpcikKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiB0cnVlIikKfQoKYWxsb3dfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19sb2dfZGlyZWN0b3J5OiBzdGFydCIpCgogICAga2V5IDo9ICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWxvZy1kaXJlY3RvcnkiCgogICAgbm90IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIG5vdCBpX29jaS5Bbm5vdGF0aW9uc1trZXldCgogICAgcHJpbnQoImFsbG93X2xvZ19kaXJlY3Rvcnk6IHRydWUiKQp9CgphbGxvd19kZXZpY2VzKHBfZGV2aWNlcywgaV9kZXZpY2VzKSB7CiAgICBwcmludCgiYWxsb3dfZGV2aWNlczogc3RhcnQiKQogICAgZXZlcnkgaV9kZXZpY2UgaW4gaV9kZXZpY2VzIHsKICAgICAgICBwcmludCgiYWxsb3dfZGV2aWNlczogaV9kZXZpY2UgPSIsIGlfZGV2aWNlKQogICAgICAgIHNvbWUgcF9kZXZpY2UgaW4gcF9kZXZpY2VzCiAgICAgICAgcF9kZXZpY2UuY29udGFpbmVyX3BhdGggPT0gaV9kZXZpY2UuY29udGFpbmVyX3BhdGgKICAgIH0KICAgIHByaW50KCJhbGxvd19kZXZpY2VzOiB0cnVlIikKfQoKYWxsb3dfbGludXgoc3RhdGVfb3BzLCBwX29jaSwgaV9vY2kpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIHBfbmFtZXNwYWNlcyA6PSBwX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbGludXg6IHAgbmFtZXNwYWNlcyA9IiwgcF9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlcyA6PSBpX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbGludXg6IGkgbmFtZXNwYWNlcyA9IiwgaV9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlX3dpdGhvdXRfbmV0d29yayA6PSBbb2JqIHwgb2JqIDo9IGlfbmFtZXNwYWNlc1tfXTsgb2JqLlR5cGUgIT0gIm5ldHdvcmsiXQoKICAgIHByaW50KCJhbGxvd19saW51eDogaV9uYW1lc3BhY2Vfd2l0aG91dF9uZXR3b3JrID0iLCBpX25hbWVzcGFjZV93aXRob3V0X25ldHdvcmspCgogICAgcF9uYW1lc3BhY2VzID09IGlfbmFtZXNwYWNlX3dpdGhvdXRfbmV0d29yawoKICAgIGFsbG93X21hc2tlZF9wYXRocyhwX29jaSwgaV9vY2kpCiAgICBhbGxvd19yZWFkb25seV9wYXRocyhwX29jaSwgaV9vY2kpCiAgICBhbGxvd19saW51eF9kZXZpY2VzKHBfb2NpLkxpbnV4LkRldmljZXMsIGlfb2NpLkxpbnV4LkRldmljZXMpCiAgICBhbGxvd19saW51eF9zeXNjdGwocF9vY2kuTGludXgsIGlfb2NpLkxpbnV4KQogICAgcmV0IDo9IGFsbG93X25ldHdvcmtfbmFtZXNwYWNlX3N0YXJ0KHN0YXRlX29wcywgcF9vY2ksIGlfb2NpKQogICAgcmV0LmFsbG93ZWQKCiAgICBvcHMgOj0gcmV0Lm9wcwoKICAgIHByaW50KCJhbGxvd19saW51eDogdHJ1ZSIpCn0KCiMgUmV0cmlldmUgdGhlICJuZXR3b3JrIiBuYW1lc3BhY2UgZnJvbSB0aGUgaW5wdXQgZGF0YSBhbmQgcGFzcyBpdCBvbiBmb3IgdGhlCiMgbmV0d29yayBuYW1lc3BhY2UgcG9saWN5IGNoZWNrcy4KYWxsb3dfbmV0d29ya19uYW1lc3BhY2Vfc3RhcnQoc3RhdGVfb3BzLCBwX29jaSwgaV9vY2kpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIHByaW50KCJhbGxvd19uZXR3b3JrX25hbWVzcGFjZSBzdGFydDogc3RhcnQiKQoKICAgIHBfbmFtZXNwYWNlcyA6PSBwX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IHAgbmFtZXNwYWNlcyA9IiwgcF9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlcyA6PSBpX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IGkgbmFtZXNwYWNlcyA9IiwgaV9uYW1lc3BhY2VzKQoKICAgICMgUmV0dXJuIHBhdGggb2YgdGhlICJuZXR3b3JrIiBuYW1lc3BhY2UKICAgIG5ldHdvcmtfbnMgOj0gW29iaiB8IG9iaiA6PSBpX25hbWVzcGFjZXNbX107IG9iai5UeXBlID09ICJuZXR3b3JrIl0KCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IG5ldHdvcmtfbnMgPSIsIG5ldHdvcmtfbnMpCgogICAgcmV0IDo9IGFsbG93X25ldHdvcmtfbmFtZXNwYWNlKHN0YXRlX29wcywgbmV0d29ya19ucykKICAgIHJldC5hbGxvd2VkCgogICAgb3BzIDo9IHJldC5vcHMKfQoKIyBUaGlzIHJ1bGUgaXMgd2hlbiB0aGVyZSdzIG5vIG5ldHdvcmsgbmFtZXNwYWNlIGluIHRoZSBpbnB1dCBkYXRhLgphbGxvd19uZXR3b3JrX25hbWVzcGFjZShzdGF0ZV9vcHMsIG5ldHdvcmtfbnMpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIGNvdW50KG5ldHdvcmtfbnMpID09IDAKCiAgICBuZXR3b3JrX25zX3BhdGggPSAiIgoKICAgIGFkZF9uZXR3b3JrX25hbWVzcGFjZV90b19zdGF0ZSA6PSBzdGF0ZV9hbGxvd3MoIm5ldHdvcmtfbmFtZXNwYWNlIiwgbmV0d29ya19uc19wYXRoKQogICAgb3BzIDo9IGNvbmNhdF9vcF9pZl9ub3RfbnVsbChzdGF0ZV9vcHMsIGFkZF9uZXR3b3JrX25hbWVzcGFjZV90b19zdGF0ZSkKCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2UgMTogdHJ1ZSIpCn0KCiMgVGhpcyBydWxlIGlzIHdoZW4gdGhlcmUncyBleGFjdGx5IG9uZSBuZXR3b3JrIG5hbWVzcGFjZSBpbiB0aGUgaW5wdXQgZGF0YS4KYWxsb3dfbmV0d29ya19uYW1lc3BhY2Uoc3RhdGVfb3BzLCBuZXR3b3JrX25zKSA6PSB7Im9wcyI6IG9wcywgImFsbG93ZWQiOiB0cnVlfSB7CiAgICBjb3VudChuZXR3b3JrX25zKSA9PSAxCgogICAgYWRkX25ldHdvcmtfbmFtZXNwYWNlX3RvX3N0YXRlIDo9IHN0YXRlX2FsbG93cygibmV0d29ya19uYW1lc3BhY2UiLCBuZXR3b3JrX25zWzBdLlBhdGgpCiAgICBvcHMgOj0gY29uY2F0X29wX2lmX25vdF9udWxsKHN0YXRlX29wcywgYWRkX25ldHdvcmtfbmFtZXNwYWNlX3RvX3N0YXRlKQoKICAgIHByaW50KCJhbGxvd19uZXR3b3JrX25hbWVzcGFjZSAyOiB0cnVlIikKfQoKYWxsb3dfbWFza2VkX3BhdGhzKHBfb2NpLCBpX29jaSkgewogICAgcF9wYXRocyA6PSBwX29jaS5MaW51eC5NYXNrZWRQYXRocwogICAgcHJpbnQoImFsbG93X21hc2tlZF9wYXRocyAxOiBwX3BhdGhzID0iLCBwX3BhdGhzKQoKICAgIGlfcGF0aHMgOj0gaV9vY2kuTGludXguTWFza2VkUGF0aHMKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aHMgMTogaV9wYXRocyA9IiwgaV9wYXRocykKCiAgICBhbGxvd19tYXNrZWRfcGF0aHNfYXJyYXkocF9wYXRocywgaV9wYXRocykKCiAgICBwcmludCgiYWxsb3dfbWFza2VkX3BhdGhzIDE6IHRydWUiKQp9CmFsbG93X21hc2tlZF9wYXRocyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aHMgMjogc3RhcnQiKQoKICAgIG5vdCBwX29jaS5MaW51eC5NYXNrZWRQYXRocwogICAgbm90IGlfb2NpLkxpbnV4Lk1hc2tlZFBhdGhzCgogICAgcHJpbnQoImFsbG93X21hc2tlZF9wYXRocyAyOiB0cnVlIikKfQoKIyBBbGwgdGhlIHBvbGljeSBtYXNrZWQgcGF0aHMgbXVzdCBiZSBtYXNrZWQgaW4gdGhlIGlucHV0IGRhdGEgdG9vLgojIElucHV0IGlzIGFsbG93ZWQgdG8gaGF2ZSBtb3JlIG1hc2tlZCBwYXRocyB0aGFuIHRoZSBwb2xpY3kuCmFsbG93X21hc2tlZF9wYXRoc19hcnJheShwX2FycmF5LCBpX2FycmF5KSB7CiAgICBldmVyeSBwX2VsZW0gaW4gcF9hcnJheSB7CiAgICAgICAgYWxsb3dfbWFza2VkX3BhdGgocF9lbGVtLCBpX2FycmF5KQogICAgfQp9CgphbGxvd19tYXNrZWRfcGF0aChwX2VsZW0sIGlfYXJyYXkpIHsKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aDogcF9lbGVtID0iLCBwX2VsZW0pCgogICAgc29tZSBpX2VsZW0gaW4gaV9hcnJheQogICAgcF9lbGVtID09IGlfZWxlbQoKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aDogdHJ1ZSIpCn0KCmFsbG93X3JlYWRvbmx5X3BhdGhzKHBfb2NpLCBpX29jaSkgewogICAgcF9wYXRocyA6PSBwX29jaS5MaW51eC5SZWFkb25seVBhdGhzCiAgICBwcmludCgiYWxsb3dfcmVhZG9ubHlfcGF0aHMgMTogcF9wYXRocyA9IiwgcF9wYXRocykKCiAgICBpX3BhdGhzIDo9IGlfb2NpLkxpbnV4LlJlYWRvbmx5UGF0aHMKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAxOiBpX3BhdGhzID0iLCBpX3BhdGhzKQoKICAgIGFsbG93X3JlYWRvbmx5X3BhdGhzX2FycmF5KHBfcGF0aHMsIGlfcGF0aHMsIGlfb2NpLkxpbnV4Lk1hc2tlZFBhdGhzKQoKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAxOiB0cnVlIikKfQphbGxvd19yZWFkb25seV9wYXRocyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAyOiBzdGFydCIpCgogICAgbm90IHBfb2NpLkxpbnV4LlJlYWRvbmx5UGF0aHMKICAgIG5vdCBpX29jaS5MaW51eC5SZWFkb25seVBhdGhzCgogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGhzIDI6IHRydWUiKQp9CgojIEFsbCB0aGUgcG9saWN5IHJlYWRvbmx5IHBhdGhzIG11c3QgYmUgZWl0aGVyOgojIC0gUHJlc2VudCBpbiB0aGUgaW5wdXQgcmVhZG9ubHkgcGF0aHMsIG9yCiMgLSBQcmVzZW50IGluIHRoZSBpbnB1dCBtYXNrZWQgcGF0aHMuCiMgSW5wdXQgaXMgYWxsb3dlZCB0byBoYXZlIG1vcmUgcmVhZG9ubHkgcGF0aHMgdGhhbiB0aGUgcG9saWN5LgphbGxvd19yZWFkb25seV9wYXRoc19hcnJheShwX2FycmF5LCBpX2FycmF5LCBtYXNrZWRfcGF0aHMpIHsKICAgIGV2ZXJ5IHBfZWxlbSBpbiBwX2FycmF5IHsKICAgICAgICBhbGxvd19yZWFkb25seV9wYXRoKHBfZWxlbSwgaV9hcnJheSwgbWFza2VkX3BhdGhzKQogICAgfQp9CgphbGxvd19yZWFkb25seV9wYXRoKHBfZWxlbSwgaV9hcnJheSwgbWFza2VkX3BhdGhzKSB7CiAgICBwcmludCgiYWxsb3dfcmVhZG9ubHlfcGF0aCAxOiBwX2VsZW0gPSIsIHBfZWxlbSkKCiAgICBzb21lIGlfZWxlbSBpbiBpX2FycmF5CiAgICBwX2VsZW0gPT0gaV9lbGVtCgogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGggMTogdHJ1ZSIpCn0KYWxsb3dfcmVhZG9ubHlfcGF0aChwX2VsZW0sIGlfYXJyYXksIG1hc2tlZF9wYXRocykgewogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGggMjogcF9lbGVtID0iLCBwX2VsZW0pCgogICAgc29tZSBpX21hc2tlZCBpbiBtYXNrZWRfcGF0aHMKICAgIHBfZWxlbSA9PSBpX21hc2tlZAoKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRoIDI6IHRydWUiKQp9CgphbGxvd19saW51eF9kZXZpY2VzKHBfZGV2aWNlcywgaV9kZXZpY2VzKSB7CiAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogc3RhcnQiKQogICAgZXZlcnkgaV9kZXZpY2UgaW4gaV9kZXZpY2VzIHsKICAgICAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogaV9kZXZpY2UgPSIsIGlfZGV2aWNlKQogICAgICAgIHNvbWUgcF9kZXZpY2UgaW4gcF9kZXZpY2VzCiAgICAgICAgaV9kZXZpY2UuUGF0aCA9PSBwX2RldmljZS5QYXRoCiAgICB9CiAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogdHJ1ZSIpCn0KCmFsbG93X2xpbnV4X3N5c2N0bChwX2xpbnV4LCBpX2xpbnV4KSB7CiAgICBwcmludCgiYWxsb3dfbGludXhfc3lzY3RsIDE6IHN0YXJ0IikKICAgIG5vdCBpX2xpbnV4LlN5c2N0bAogICAgcHJpbnQoImFsbG93X2xpbnV4X3N5c2N0bCAxOiB0cnVlIikKfQoKYWxsb3dfbGludXhfc3lzY3RsKHBfbGludXgsIGlfbGludXgpIHsKICAgIHByaW50KCJhbGxvd19saW51eF9zeXNjdGwgMjogc3RhcnQiKQogICAgcF9zeXNjdGwgOj0gcF9saW51eC5TeXNjdGwKICAgIGlfc3lzY3RsIDo9IGlfbGludXguU3lzY3RsCiAgICBldmVyeSBpX25hbWUsIGlfdmFsIGluIGlfc3lzY3RsIHsKICAgICAgICBwcmludCgiYWxsb3dfbGludXhfc3lzY3RsIDI6IGlfbmFtZSA9IiwgaV9uYW1lLCAiaV92YWwgPSIsIGlfdmFsKQogICAgICAgIHBfc3lzY3RsW2lfbmFtZV0gPT0gaV92YWwKICAgIH0KICAgIHByaW50KCJhbGxvd19saW51eF9zeXNjdGwgMjogdHJ1ZSIpCn0KCiMgQ2hlY2sgdGhlIGNvbnNpc3RlbmN5IG9mIHRoZSBpbnB1dCAiaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5idW5kbGVfcGF0aCIKIyBhbmQgaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCIgdmFsdWVzIHdpdGggb3RoZXIgZmllbGRzLgphbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZChwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpIHsKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogc3RhcnQiKQoKICAgIGJ1bmRsZV9wYXRoIDo9IGlfb2NpLkFubm90YXRpb25zWyJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmJ1bmRsZV9wYXRoIl0KICAgIGJ1bmRsZV9pZCA6PSByZXBsYWNlKGJ1bmRsZV9wYXRoLCAiL3J1bi9jb250YWluZXJkL2lvLmNvbnRhaW5lcmQucnVudGltZS52Mi50YXNrL2s4cy5pby8iLCAiIikKCiAgICBidW5kbGVfaWRfZm9ybWF0IDo9IGNvbmNhdCgiIiwgWyJeIiwgQlVORExFX0lELCAiJCJdKQogICAgcmVnZXgubWF0Y2goYnVuZGxlX2lkX2Zvcm1hdCwgYnVuZGxlX2lkKQoKICAgIGtleSA6PSAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCIKCiAgICBwX3JlZ2V4IDo9IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIHNhbmRib3hfaWQgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQoKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogc2FuZGJveF9pZCA9Iiwgc2FuZGJveF9pZCwgInJlZ2V4ID0iLCBwX3JlZ2V4KQogICAgcmVnZXgubWF0Y2gocF9yZWdleCwgc2FuZGJveF9pZCkKCiAgICBhbGxvd19yb290X3BhdGgocF9vY2ksIGlfb2NpLCBidW5kbGVfaWQpCgogICAgZXZlcnkgaV9tb3VudCBpbiBpX29jaS5Nb3VudHMgewogICAgICAgIGFsbG93X21vdW50KHBfb2NpLCBpX21vdW50LCBpX3N0b3JhZ2VzLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpCiAgICB9CgogICAgYWxsb3dfc3RvcmFnZXMocF9zdG9yYWdlcywgaV9zdG9yYWdlcywgYnVuZGxlX2lkLCBzYW5kYm94X2lkKQoKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogdHJ1ZSIpCn0KCmFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHBfcHJvY2VzcyA9IiwgcF9wcm9jZXNzKQogICAgcHJpbnQoImFsbG93X3Byb2Nlc3NfY29tbW9uOiBpX3Byb2Nlc3MgPSAiLCBpX3Byb2Nlc3MpCiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHNfbmFtZSA9Iiwgc19uYW1lKQoKICAgIHBfcHJvY2Vzcy5Dd2QgPT0gaV9wcm9jZXNzLkN3ZAogICAgcF9wcm9jZXNzLk5vTmV3UHJpdmlsZWdlcyA9PSBpX3Byb2Nlc3MuTm9OZXdQcml2aWxlZ2VzCgogICAgYWxsb3dfdXNlcihwX3Byb2Nlc3MsIGlfcHJvY2VzcykKICAgIGFsbG93X2VudihwX3Byb2Nlc3MsIGlfcHJvY2Vzcywgc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHRydWUiKQp9CgojIENvbXBhcmUgdGhlIE9DSSBQcm9jZXNzIGZpZWxkIG9mIGEgcG9saWN5IGNvbnRhaW5lciB3aXRoIHRoZSBpbnB1dCBPQ0kgUHJvY2VzcyBmcm9tIGEgQ3JlYXRlQ29udGFpbmVyUmVxdWVzdAphbGxvd19wcm9jZXNzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfcHJvY2Vzczogc3RhcnQiKQoKICAgIGFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgYWxsb3dfY2FwcyhwX3Byb2Nlc3MuQ2FwYWJpbGl0aWVzLCBpX3Byb2Nlc3MuQ2FwYWJpbGl0aWVzKQogICAgcF9wcm9jZXNzLlRlcm1pbmFsID09IGlfcHJvY2Vzcy5UZXJtaW5hbAoKICAgIHByaW50KCJhbGxvd19wcm9jZXNzOiB0cnVlIikKfQoKIyBDb21wYXJlIHRoZSBPQ0kgUHJvY2VzcyBmaWVsZCBvZiBhIHBvbGljeSBjb250YWluZXIgd2l0aCB0aGUgaW5wdXQgcHJvY2VzcyBmaWVsZCBmcm9tIEV4ZWNQcm9jZXNzUmVxdWVzdAphbGxvd19pbnRlcmFjdGl2ZV9wcm9jZXNzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfaW50ZXJhY3RpdmVfcHJvY2Vzczogc3RhcnQiKQoKICAgIGFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgYWxsb3dfZXhlY19jYXBzKGlfcHJvY2Vzcy5DYXBhYmlsaXRpZXMpCgogICAgIyBUaGVzZSBhcmUgY29tbWFuZHMgZW5hYmxlZCB1c2luZyBFeGVjUHJvY2Vzc1JlcXVlc3QgY29tbWFuZHMgYW5kL29yIHJlZ2V4IGZyb20gdGhlIHNldHRpbmdzIGZpbGUuCiAgICAjIFRoZXkgY2FuIGJlIGV4ZWN1dGVkIGludGVyYWN0aXZlbHkgc28gYWxsb3cgdGhlbSB0byB1c2UgYW55IHZhbHVlIGZvciBpX3Byb2Nlc3MuVGVybWluYWwuCgogICAgcHJpbnQoImFsbG93X2ludGVyYWN0aXZlX3Byb2Nlc3M6IHRydWUiKQp9CgojIENvbXBhcmUgdGhlIE9DSSBQcm9jZXNzIGZpZWxkIG9mIGEgcG9saWN5IGNvbnRhaW5lciB3aXRoIHRoZSBpbnB1dCBwcm9jZXNzIGZpZWxkIGZyb20gRXhlY1Byb2Nlc3NSZXF1ZXN0CmFsbG93X3Byb2JlX3Byb2Nlc3MocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19wcm9iZV9wcm9jZXNzOiBzdGFydCIpCgogICAgYWxsb3dfcHJvY2Vzc19jb21tb24ocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpCiAgICBhbGxvd19leGVjX2NhcHMoaV9wcm9jZXNzLkNhcGFiaWxpdGllcykKICAgIHBfcHJvY2Vzcy5UZXJtaW5hbCA9PSBpX3Byb2Nlc3MuVGVybWluYWwKCiAgICBwcmludCgiYWxsb3dfcHJvYmVfcHJvY2VzczogdHJ1ZSIpCn0KCmFsbG93X3VzZXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MpIHsKICAgIHBfdXNlciA6PSBwX3Byb2Nlc3MuVXNlcgogICAgaV91c2VyIDo9IGlfcHJvY2Vzcy5Vc2VyCgogICAgcHJpbnQoImFsbG93X3VzZXI6IGlucHV0IHVpZCA9IiwgaV91c2VyLlVJRCwgInBvbGljeSB1aWQgPSIsIHBfdXNlci5VSUQpCiAgICBwX3VzZXIuVUlEID09IGlfdXNlci5VSUQKCiAgICAjIFRPRE86IHRyYWNrIGRvd24gdGhlIHJlYXNvbiBmb3IgcmVnaXN0cnkuazhzLmlvL3BhdXNlOjMuOSBiZWluZwogICAgIyAgICAgICBleGVjdXRlZCB3aXRoIGdpZCA9IDAgZGVzcGl0ZSBoYXZpbmcgIjY1NTM1OjY1NTM1IiBpbiBpdHMgY29udGFpbmVyIGltYWdlCiAgICAjICAgICAgIGNvbmZpZy4KICAgICNwcmludCgiYWxsb3dfdXNlcjogaW5wdXQgZ2lkID0iLCBpX3VzZXIuR0lELCAicG9saWN5IGdpZCA9IiwgcF91c2VyLkdJRCkKICAgICNwX3VzZXIuR0lEID09IGlfdXNlci5HSUQKCiAgICAjIFRPRE86IGNvbXBhcmUgdGhlIGFkZGl0aW9uYWxHaWRzIGZpZWxkIHRvbyBhZnRlciBjb21wdXRpbmcgaXRzIHZhbHVlCiAgICAjIGJhc2VkIG9uIC9ldGMvcGFzc3dkIGFuZCAvZXRjL2dyb3VwIGZyb20gdGhlIGNvbnRhaW5lciBpbWFnZS4KfQoKYWxsb3dfZGVwcmVjYXRlZF9hcmdzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZ3MgMTogbm8gYXJncyIpCgogICAgbm90IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJncwogICAgbm90IGlfcHJvY2Vzcy5BcmdzCgogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAxOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZ3MocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSkgewogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiBwb2xpY3kgYXJncyA9IiwgcF9wcm9jZXNzLkRlcHJlY2F0ZWRBcmdzKQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiBpbnB1dCBhcmdzID0iLCBpX3Byb2Nlc3MuQXJncykKCiAgICBjb3VudChwX3Byb2Nlc3MuRGVwcmVjYXRlZEFyZ3MpID09IGNvdW50KGlfcHJvY2Vzcy5BcmdzKQoKICAgIGV2ZXJ5IGksIGlfYXJnIGluIGlfcHJvY2Vzcy5BcmdzIHsKICAgICAgICBhbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpCiAgICB9CgogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDE6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgcF9hcmcyIDo9IHJlcGxhY2UocF9hcmcsICIkJCIsICIkIikKICAgIHBfYXJnMiA9PSBpX2FyZwoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAxOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDI6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgIyBUT0RPOiBjYW4gJChub2RlLW5hbWUpIGJlIGhhbmRsZWQgYmV0dGVyPwogICAgY29udGFpbnMocF9hcmcsICIkKG5vZGUtbmFtZSkiKQoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAyOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDM6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgcF9hcmcyIDo9IHJlcGxhY2UocF9hcmcsICIkJCIsICIkIikKICAgIHBfYXJnMyA6PSByZXBsYWNlKHBfYXJnMiwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAzOiBwX2FyZzMgPSIsIHBfYXJnMykKICAgIHBfYXJnMyA9PSBpX2FyZwoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAzOiB0cnVlIikKfQoKIyBPQ0kgcHJvY2Vzcy5FbnYgZmllbGQKYWxsb3dfZW52KHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfZW52OiBwIGVudiA9IiwgcF9wcm9jZXNzLkVudikKICAgIHByaW50KCJhbGxvd19lbnY6IGkgZW52ID0iLCBpX3Byb2Nlc3MuRW52KQoKICAgIGV2ZXJ5IGlfdmFyIGluIGlfcHJvY2Vzcy5FbnYgewogICAgICAgIHByaW50KCJhbGxvd19lbnY6IGlfdmFyID0iLCBpX3ZhcikKICAgICAgICBhbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgfQoKICAgIHByaW50KCJhbGxvd19lbnY6IHRydWUiKQp9CgojIEFsbG93IGlucHV0IGVudiB2YXJpYWJsZXMgdGhhdCBhcmUgcHJlc2VudCBpbiB0aGUgcG9saWN5IGRhdGEgdG9vLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHBfdmFyID09IGlfdmFyCiAgICBwcmludCgiYWxsb3dfdmFyIDE6IHRydWUiKQp9CgojIE1hdGNoIGlucHV0IHdpdGggb25lIG9mIHRoZSBwb2xpY3kgdmFyaWFibGVzLCBhZnRlciBzdWJzdGl0dXRpbmcgJChzYW5kYm94LW5hbWUpLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHByaW50KCJhbGxvd192YXIgMjogcF92YXIgPSIsIHBfdmFyKQoKICAgIHBfdmFyX3NwbGl0IDo9IHNwbGl0KHBfdmFyLCAiPSIpCiAgICBjb3VudChwX3Zhcl9zcGxpdCkgPT0gMgoKICAgIHBfdmFyX3NwbGl0WzFdID09ICIkKHNhbmRib3gtbmFtZSkiCgogICAgaV92YXJfc3BsaXQgOj0gc3BsaXQoaV92YXIsICI9IikKICAgIGNvdW50KGlfdmFyX3NwbGl0KSA9PSAyCgogICAgaV92YXJfc3BsaXRbMF0gPT0gcF92YXJfc3BsaXRbMF0KICAgIHJlZ2V4Lm1hdGNoKHNfbmFtZSwgaV92YXJfc3BsaXRbMV0pCgogICAgcHJpbnQoImFsbG93X3ZhciAyOiB0cnVlIikKfQoKIyBBbGxvdyBpbnB1dCBlbnYgdmFyaWFibGVzIHRoYXQgbWF0Y2ggd2l0aCBhIHJlcXVlc3RfZGVmYXVsdHMgcmVnZXguCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHNvbWUgcF9yZWdleDEgaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5DcmVhdGVDb250YWluZXJSZXF1ZXN0LmFsbG93X2Vudl9yZWdleAogICAgcF9yZWdleDIgOj0gcmVwbGFjZShwX3JlZ2V4MSwgIiQoaXB2NF9hKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcHY0X2EpCiAgICBwX3JlZ2V4MyA6PSByZXBsYWNlKHBfcmVnZXgyLCAiJChpcF9wKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcF9wKQogICAgcF9yZWdleDQgOj0gcmVwbGFjZShwX3JlZ2V4MywgIiQoc3ZjX25hbWUpIiwgcG9saWN5X2RhdGEuY29tbW9uLnN2Y19uYW1lKQogICAgcF9yZWdleDUgOj0gcmVwbGFjZShwX3JlZ2V4NCwgIiQoZG5zX2xhYmVsKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5kbnNfbGFiZWwpCgogICAgcHJpbnQoImFsbG93X3ZhciAzOiBwX3JlZ2V4NSA9IiwgcF9yZWdleDUpCiAgICByZWdleC5tYXRjaChwX3JlZ2V4NSwgaV92YXIpCgogICAgcHJpbnQoImFsbG93X3ZhciAzOiB0cnVlIikKfQoKIyBBbGxvdyBmaWVsZFJlZiAiZmllbGRQYXRoOiBzdGF0dXMucG9kSVAiIHZhbHVlcy4KYWxsb3dfdmFyKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBpX3Zhciwgc19uYW1lLCBzX25hbWVzcGFjZSkgewogICAgbmFtZV92YWx1ZSA6PSBzcGxpdChpX3ZhciwgIj0iKQogICAgY291bnQobmFtZV92YWx1ZSkgPT0gMgogICAgaXNfaXAobmFtZV92YWx1ZVsxXSkKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIGFsbG93X3BvZF9pcF92YXIobmFtZV92YWx1ZVswXSwgcF92YXIpCgogICAgcHJpbnQoImFsbG93X3ZhciA0OiB0cnVlIikKfQoKIyBBbGxvdyBjb21tb24gZmllbGRSZWYgdmFyaWFibGVzLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBuYW1lX3ZhbHVlIDo9IHNwbGl0KGlfdmFyLCAiPSIpCiAgICBjb3VudChuYW1lX3ZhbHVlKSA9PSAyCgogICAgc29tZSBwX3ZhciBpbiBwX3Byb2Nlc3MuRW52CiAgICBwX25hbWVfdmFsdWUgOj0gc3BsaXQocF92YXIsICI9IikKICAgIGNvdW50KHBfbmFtZV92YWx1ZSkgPT0gMgoKICAgIHBfbmFtZV92YWx1ZVswXSA9PSBuYW1lX3ZhbHVlWzBdCgogICAgIyBUT0RPOiBzaG91bGQgdGhlc2UgYmUgaGFuZGxlZCBpbiBhIGRpZmZlcmVudCB3YXk/CiAgICBhbHdheXNfYWxsb3dlZCA6PSBbIiQoaG9zdC1uYW1lKSIsICIkKG5vZGUtbmFtZSkiLCAiJChwb2QtdWlkKSJdCiAgICBzb21lIGFsbG93ZWQgaW4gYWx3YXlzX2FsbG93ZWQKICAgIGNvbnRhaW5zKHBfbmFtZV92YWx1ZVsxXSwgYWxsb3dlZCkKCiAgICBwcmludCgiYWxsb3dfdmFyIDU6IHRydWUiKQp9CgojIEFsbG93IGZpZWxkUmVmICJmaWVsZFBhdGg6IHN0YXR1cy5ob3N0SVAiIHZhbHVlcy4KYWxsb3dfdmFyKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBpX3Zhciwgc19uYW1lLCBzX25hbWVzcGFjZSkgewogICAgbmFtZV92YWx1ZSA6PSBzcGxpdChpX3ZhciwgIj0iKQogICAgY291bnQobmFtZV92YWx1ZSkgPT0gMgogICAgaXNfaXAobmFtZV92YWx1ZVsxXSkKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIGFsbG93X2hvc3RfaXBfdmFyKG5hbWVfdmFsdWVbMF0sIHBfdmFyKQoKICAgIHByaW50KCJhbGxvd192YXIgNjogdHJ1ZSIpCn0KCiMgQWxsb3cgcmVzb3VyY2VGaWVsZFJlZiB2YWx1ZXMgKGUuZy4sICJsaW1pdHMuY3B1IikuCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIG5hbWVfdmFsdWUgOj0gc3BsaXQoaV92YXIsICI9IikKICAgIGNvdW50KG5hbWVfdmFsdWUpID09IDIKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHBfbmFtZV92YWx1ZSA6PSBzcGxpdChwX3ZhciwgIj0iKQogICAgY291bnQocF9uYW1lX3ZhbHVlKSA9PSAyCgogICAgcF9uYW1lX3ZhbHVlWzBdID09IG5hbWVfdmFsdWVbMF0KCiAgICAjIGEgdmFyaWFibGUgd2Ugc2hvdWxkIGJlIHZhbGlkYXRpbmcgdXNpbmcgYSByZWdleCBmcm9tIHNldHRpbmdzCiAgICBwX25hbWVfdmFsdWVbMV0gPT0gIiQodmFsaWRhdGUtZnJvbS1zZXR0aW5ncykiCgogICAgcmVnZXhfdmFsIDo9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuQ3JlYXRlQ29udGFpbmVyUmVxdWVzdC5hbGxvd19lbnZfcmVnZXhfbWFwW25hbWVfdmFsdWVbMF1dCgogICAgcHJpbnQoImFsbG93X3ZhciA3OiB2YWwgPSIsIG5hbWVfdmFsdWVbMV0pCiAgICBwcmludCgiYWxsb3dfdmFyIDc6IHJlZ2V4X3ZhbCA9IiwgcmVnZXhfdmFsKQoKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4X3ZhbCwgbmFtZV92YWx1ZVsxXSkKCiAgICBwcmludCgiYWxsb3dfdmFyIDc6IHRydWUiKQp9CgojIE1hdGNoIGlucHV0IHdpdGggb25lIG9mIHRoZSBwb2xpY3kgdmFyaWFibGVzLCBhZnRlciBzdWJzdGl0dXRpbmcgJChzYW5kYm94LW5hbWVzcGFjZSkuCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHNvbWUgcF92YXIgaW4gcF9wcm9jZXNzLkVudgogICAgcF92YXIyIDo9IHJlcGxhY2UocF92YXIsICIkKHNhbmRib3gtbmFtZXNwYWNlKSIsIHNfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd192YXIgODogcF92YXIyID0iLCBwX3ZhcjIpCiAgICBwX3ZhcjIgPT0gaV92YXIKCiAgICBwcmludCgiYWxsb3dfdmFyIDg6IHRydWUiKQp9CgphbGxvd19wb2RfaXBfdmFyKHZhcl9uYW1lLCBwX3ZhcikgewogICAgcHJpbnQoImFsbG93X3BvZF9pcF92YXI6IHZhcl9uYW1lID0iLCB2YXJfbmFtZSwgInBfdmFyID0iLCBwX3ZhcikKCiAgICBwX25hbWVfdmFsdWUgOj0gc3BsaXQocF92YXIsICI9IikKICAgIGNvdW50KHBfbmFtZV92YWx1ZSkgPT0gMgoKICAgIHBfbmFtZV92YWx1ZVswXSA9PSB2YXJfbmFtZQogICAgcF9uYW1lX3ZhbHVlWzFdID09ICIkKHBvZC1pcCkiCgogICAgcHJpbnQoImFsbG93X3BvZF9pcF92YXI6IHRydWUiKQp9CgphbGxvd19ob3N0X2lwX3Zhcih2YXJfbmFtZSwgcF92YXIpIHsKICAgIHByaW50KCJhbGxvd19ob3N0X2lwX3ZhcjogdmFyX25hbWUgPSIsIHZhcl9uYW1lLCAicF92YXIgPSIsIHBfdmFyKQoKICAgIHBfbmFtZV92YWx1ZSA6PSBzcGxpdChwX3ZhciwgIj0iKQogICAgY291bnQocF9uYW1lX3ZhbHVlKSA9PSAyCgogICAgcF9uYW1lX3ZhbHVlWzBdID09IHZhcl9uYW1lCiAgICBwX25hbWVfdmFsdWVbMV0gPT0gIiQoaG9zdC1pcCkiCgogICAgcHJpbnQoImFsbG93X2hvc3RfaXBfdmFyOiB0cnVlIikKfQoKaXNfaXAodmFsdWUpIHsKICAgIGJ5dGVzID0gc3BsaXQodmFsdWUsICIuIikKICAgIGNvdW50KGJ5dGVzKSA9PSA0CgogICAgaXNfaXBfZmlyc3RfYnl0ZShieXRlc1swXSkKICAgIGlzX2lwX290aGVyX2J5dGUoYnl0ZXNbMV0pCiAgICBpc19pcF9vdGhlcl9ieXRlKGJ5dGVzWzJdKQogICAgaXNfaXBfb3RoZXJfYnl0ZShieXRlc1szXSkKfQppc19pcF9maXJzdF9ieXRlKGNvbXBvbmVudCkgewogICAgbnVtYmVyID0gdG9fbnVtYmVyKGNvbXBvbmVudCkKICAgIG51bWJlciA+PSAxCiAgICBudW1iZXIgPD0gMjU1Cn0KaXNfaXBfb3RoZXJfYnl0ZShjb21wb25lbnQpIHsKICAgIG51bWJlciA9IHRvX251bWJlcihjb21wb25lbnQpCiAgICBudW1iZXIgPj0gMAogICAgbnVtYmVyIDw9IDI1NQp9CgojIE9DSSByb290LlBhdGgKYWxsb3dfcm9vdF9wYXRoKHBfb2NpLCBpX29jaSwgYnVuZGxlX2lkKSB7CiAgICBpX3BhdGggOj0gaV9vY2kuUm9vdC5QYXRoCiAgICBwX3BhdGgxIDo9IHBfb2NpLlJvb3QuUGF0aAogICAgcHJpbnQoImFsbG93X3Jvb3RfcGF0aDogaV9wYXRoID0iLCBpX3BhdGgsICJwX3BhdGgxID0iLCBwX3BhdGgxKQoKICAgIHBfcGF0aDIgOj0gcmVwbGFjZShwX3BhdGgxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfcm9vdF9wYXRoOiBwX3BhdGgyID0iLCBwX3BhdGgyKQoKICAgIHBfcGF0aDMgOj0gcmVwbGFjZShwX3BhdGgyLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X3Jvb3RfcGF0aDogcF9wYXRoMyA9IiwgcF9wYXRoMykKCiAgICBwX3BhdGgzID09IGlfcGF0aAoKICAgIHByaW50KCJhbGxvd19yb290X3BhdGg6IHRydWUiKQp9CgojIGRldmljZSBtb3VudHMKYWxsb3dfbW91bnQocF9vY2ksIGlfbW91bnQsIGlfc3RvcmFnZXMsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcHJpbnQoImFsbG93X21vdW50OiBpX21vdW50ID0iLCBpX21vdW50KQoKICAgIHNvbWUgcF9tb3VudCBpbiBwX29jaS5Nb3VudHMKICAgIHNvbWUgaV9zdG9yYWdlIGluIGlfc3RvcmFnZXMKCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IHBfbW91bnQgPSIsIHBfbW91bnQpCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IGlfc3RvcmFnZSA9IiwgaV9zdG9yYWdlKQoKICAgIGNoZWNrX21vdW50KHBfbW91bnQsIGlfbW91bnQsIGlfc3RvcmFnZSwgYnVuZGxlX2lkLCBzYW5kYm94X2lkKQoKICAgICMgVE9ETzogYXJlIHRoZXJlIGFueSBvdGhlciByZXF1aXJlZCBwb2xpY3kgY2hlY2tzIGZvciBtb3VudHMgLSBlLmcuLAogICAgIyAgICAgICBtdWx0aXBsZSBtb3VudHMgd2l0aCBzYW1lIHNvdXJjZSBvciBkZXN0aW5hdGlvbj8KCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IHRydWUiKQp9CgpjaGVja19tb3VudChwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcF9tb3VudCA9PSBpX21vdW50CiAgICBwcmludCgiY2hlY2tfbW91bnQgMTogdHJ1ZSIpCn0KY2hlY2tfbW91bnQocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHBfbW91bnQuZGVzdGluYXRpb24gPT0gaV9tb3VudC5kZXN0aW5hdGlvbgogICAgcF9tb3VudC50eXBlXyA9PSBpX21vdW50LnR5cGVfCiAgICBwX21vdW50Lm9wdGlvbnMgPT0gaV9tb3VudC5vcHRpb25zCgogICAgbW91bnRfc291cmNlX2FsbG93cyhwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkKCiAgICBwcmludCgiY2hlY2tfbW91bnQgMjogdHJ1ZSIpCn0KCm1vdW50X3NvdXJjZV9hbGxvd3MocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHJlZ2V4MSA6PSBwX21vdW50LnNvdXJjZQogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5tb3VudF9zb3VyY2VfY3BhdGgpCiAgICByZWdleDQgOj0gcmVwbGFjZShyZWdleDMsICIkKGJ1bmRsZS1pZCkiLCBidW5kbGVfaWQpCgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMTogcmVnZXg0ID0iLCByZWdleDQpCiAgICByZWdleC5tYXRjaChyZWdleDQsIGlfbW91bnQuc291cmNlKQoKICAgIHByaW50KCJtb3VudF9zb3VyY2VfYWxsb3dzIDE6IHRydWUiKQp9Cm1vdW50X3NvdXJjZV9hbGxvd3MocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHJlZ2V4MSA6PSBwX21vdW50LnNvdXJjZQogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5tb3VudF9zb3VyY2VfY3BhdGgpCiAgICByZWdleDQgOj0gcmVwbGFjZShyZWdleDMsICIkKHNhbmRib3gtaWQpIiwgc2FuZGJveF9pZCkKCiAgICBwcmludCgibW91bnRfc291cmNlX2FsbG93cyAyOiByZWdleDQgPSIsIHJlZ2V4NCkKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4NCwgaV9tb3VudC5zb3VyY2UpCgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMjogdHJ1ZSIpCn0KbW91bnRfc291cmNlX2FsbG93cyhwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogaV9tb3VudC5zb3VyY2UgPSIsIGlfbW91bnQuc291cmNlKQogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogaV9zdG9yYWdlLm1vdW50X3BvaW50ID0iLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCgogICAgaV9tb3VudC5zb3VyY2UgPT0gaV9zdG9yYWdlLm1vdW50X3BvaW50CgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogdHJ1ZSIpCn0KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBDcmVhdGUgY29udGFpbmVyIFN0b3JhZ2VzCgphbGxvd19zdG9yYWdlcyhwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHBfY291bnQgOj0gY291bnQocF9zdG9yYWdlcykKICAgIGlfY291bnQgOj0gY291bnQoaV9zdG9yYWdlcykKICAgIHByaW50KCJhbGxvd19zdG9yYWdlczogcF9jb3VudCA9IiwgcF9jb3VudCwgImlfY291bnQgPSIsIGlfY291bnQpCgogICAgcF9jb3VudCA9PSBpX2NvdW50CgogICAgIyBHZXQgdGhlIGNvbnRhaW5lciBpbWFnZSBsYXllciBJRHMgYW5kIHZlcml0eSByb290IGhhc2hlcywgZnJvbSB0aGUgIm92ZXJsYXlmcyIgc3RvcmFnZS4KICAgIHNvbWUgb3ZlcmxheV9zdG9yYWdlIGluIHBfc3RvcmFnZXMKICAgIG92ZXJsYXlfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIHByaW50KCJhbGxvd19zdG9yYWdlczogb3ZlcmxheV9zdG9yYWdlID0iLCBvdmVybGF5X3N0b3JhZ2UpCiAgICBjb3VudChvdmVybGF5X3N0b3JhZ2Uub3B0aW9ucykgPT0gMgoKICAgIGxheWVyX2lkcyA6PSBzcGxpdChvdmVybGF5X3N0b3JhZ2Uub3B0aW9uc1swXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiBsYXllcl9pZHMgPSIsIGxheWVyX2lkcykKCiAgICByb290X2hhc2hlcyA6PSBzcGxpdChvdmVybGF5X3N0b3JhZ2Uub3B0aW9uc1sxXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiByb290X2hhc2hlcyA9Iiwgcm9vdF9oYXNoZXMpCgogICAgZXZlcnkgaV9zdG9yYWdlIGluIGlfc3RvcmFnZXMgewogICAgICAgIGFsbG93X3N0b3JhZ2UocF9zdG9yYWdlcywgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpCiAgICB9CgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiB0cnVlIikKfQoKYWxsb3dfc3RvcmFnZShwX3N0b3JhZ2VzLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgc29tZSBwX3N0b3JhZ2UgaW4gcF9zdG9yYWdlcwoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiBwX3N0b3JhZ2UgPSIsIHBfc3RvcmFnZSkKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiBpX3N0b3JhZ2UgPSIsIGlfc3RvcmFnZSkKCiAgICBwX3N0b3JhZ2UuZHJpdmVyICAgICAgICAgICA9PSBpX3N0b3JhZ2UuZHJpdmVyCiAgICBwX3N0b3JhZ2UuZHJpdmVyX29wdGlvbnMgICA9PSBpX3N0b3JhZ2UuZHJpdmVyX29wdGlvbnMKICAgIHBfc3RvcmFnZS5mc19ncm91cCAgICAgICAgID09IGlfc3RvcmFnZS5mc19ncm91cAogICAgcF9zdG9yYWdlLmZzdHlwZSAgICAgICAgICAgPT0gaV9zdG9yYWdlLmZzdHlwZQoKICAgIGFsbG93X3N0b3JhZ2Vfc291cmNlKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKQogICAgYWxsb3dfc3RvcmFnZV9vcHRpb25zKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKQogICAgYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKQoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiB0cnVlIikKfQoKYWxsb3dfc3RvcmFnZV9zb3VyY2UocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX3NvdXJjZSAxOiBzdGFydCIpCgogICAgcF9zdG9yYWdlLnNvdXJjZSA9PSBpX3N0b3JhZ2Uuc291cmNlCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDE6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX3NvdXJjZShwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDI6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCgogICAgIyBEREREOkJCOkRELkY6IERvbWFpbjpCdXM6RGV2aWNlLkZ1bmN0aW9uCiAgICAjIGh0dHBzOi8vd3d3Lmtlcm5lbC5vcmcvZG9jL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtYnVzLXBjaQogICAgcmVnZXgubWF0Y2goYF5bYS1mMC05XXs0fTpbYS1mMC05XXsyfTpbYS1mMC05XXsyfVwuW2EtZjAtOV0kYCwgaV9zdG9yYWdlLnNvdXJjZSkKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9zb3VyY2UgMjogdHJ1ZSIpCn0KCmFsbG93X3N0b3JhZ2Vfc291cmNlKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKSB7CiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9zb3VyY2UgMzogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIGlfc3RvcmFnZS5zb3VyY2UgPT0gIm5vbmUiCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDM6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX3NvdXJjZShwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDQ6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJzbWIiCgogICAgIyBQYXR0ZXJuOiAvLzxzdG9yYWdlLWFjY291bnQtbmFtZT4uZmlsZS5jb3JlLndpbmRvd3MubmV0LzxrOHMtUFZDLW5hbWU+CiAgICAjIFN0b3JhZ2UgYWNjb3VudCBuYW1lOiBodHRwczovL2xlYXJuLm1pY3Jvc29mdC5jb20vZW4tdXMvYXp1cmUvc3RvcmFnZS9jb21tb24vc3RvcmFnZS1hY2NvdW50LW92ZXJ2aWV3I3N0b3JhZ2UtYWNjb3VudC1uYW1lCiAgICAjIEs4cyBQVkMgbmFtZTogaHR0cHM6Ly9rdWJlcm5ldGVzLmlvL2RvY3MvY29uY2VwdHMvb3ZlcnZpZXcvd29ya2luZy13aXRoLW9iamVjdHMvbmFtZXMvI2Rucy1zdWJkb21haW4tbmFtZXMKICAgIHJlZ2V4Lm1hdGNoKGBeXC9cLyhbYS16MC05XXszLDI0fSlcLmZpbGVcLmNvcmVcLndpbmRvd3NcLm5ldFwvW2EtejAtOV0oW2EtejAtOS4tXXswLDI1MX1bYS16MC05XSk/JGAsIGlfc3RvcmFnZS5zb3VyY2UpCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDQ6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMTogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgIT0gIm92ZXJsYXlmcyIKICAgIHBfc3RvcmFnZS5vcHRpb25zID09IGlfc3RvcmFnZS5vcHRpb25zCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAxOiB0cnVlIikKfQphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIGNvdW50KHBfc3RvcmFnZS5vcHRpb25zKSA9PSAyCgogICAgcG9saWN5X2lkcyA6PSBzcGxpdChwX3N0b3JhZ2Uub3B0aW9uc1swXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBwb2xpY3lfaWRzID0iLCBwb2xpY3lfaWRzKQogICAgcG9saWN5X2lkcyA9PSBsYXllcl9pZHMKCiAgICBwb2xpY3lfaGFzaGVzIDo9IHNwbGl0KHBfc3RvcmFnZS5vcHRpb25zWzFdLCAiOiIpCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IHBvbGljeV9oYXNoZXMgPSIsIHBvbGljeV9oYXNoZXMpCgogICAgcF9jb3VudCA6PSBjb3VudChwb2xpY3lfaWRzKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBwX2NvdW50ID0iLCBwX2NvdW50KQogICAgcF9jb3VudCA+PSAxCiAgICBwX2NvdW50ID09IGNvdW50KHBvbGljeV9oYXNoZXMpCgogICAgaV9jb3VudCA6PSBjb3VudChpX3N0b3JhZ2Uub3B0aW9ucykKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogaV9jb3VudCA9IiwgaV9jb3VudCkKICAgIGlfY291bnQgPT0gcF9jb3VudCArIDMKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zWzBdID0iLCBpX3N0b3JhZ2Uub3B0aW9uc1swXSkKICAgIGlfc3RvcmFnZS5vcHRpb25zWzBdID09ICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQubGF5ZXItc3JjLXByZWZpeD0vdmFyL2xpYi9jb250YWluZXJkL2lvLmNvbnRhaW5lcmQuc25hcHNob3R0ZXIudjEudGFyZGV2L2xheWVycyIKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zW2lfY291bnQgLSAyXSA9IiwgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDJdKQogICAgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDJdID09ICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQub3ZlcmxheS1ydyIKCiAgICBsb3dlcmRpciA6PSBjb25jYXQoIj0iLCBbImxvd2VyZGlyIiwgcF9zdG9yYWdlLm9wdGlvbnNbMF1dKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBsb3dlcmRpciA9IiwgbG93ZXJkaXIpCgogICAgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDFdID09IGxvd2VyZGlyCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zW2lfY291bnQgLSAxXSA9IiwgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDFdKQoKICAgIGV2ZXJ5IGksIHBvbGljeV9pZCBpbiBwb2xpY3lfaWRzIHsKICAgICAgICBhbGxvd19vdmVybGF5X2xheWVyKHBvbGljeV9pZCwgcG9saWN5X2hhc2hlc1tpXSwgaV9zdG9yYWdlLm9wdGlvbnNbaSArIDFdKQogICAgfQoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogdHJ1ZSIpCn0KYWxsb3dfc3RvcmFnZV9vcHRpb25zKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKSB7CiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDM6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCiAgICBjb3VudChwX3N0b3JhZ2Uub3B0aW9ucykgPT0gMQoKICAgIHN0YXJ0c3dpdGgocF9zdG9yYWdlLm9wdGlvbnNbMF0sICIkKGhhc2giKQogICAgaGFzaF9zdWZmaXggOj0gdHJpbV9sZWZ0KHBfc3RvcmFnZS5vcHRpb25zWzBdLCAiJChoYXNoIikKCiAgICBlbmRzd2l0aChoYXNoX3N1ZmZpeCwgIikiKQogICAgaGFzaF9pbmRleCA6PSB0cmltX3JpZ2h0KGhhc2hfc3VmZml4LCAiKSIpCiAgICBpIDo9IHRvX251bWJlcihoYXNoX2luZGV4KQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAzOiBpID0iLCBpKQoKICAgIGhhc2hfb3B0aW9uIDo9IGNvbmNhdCgiPSIsIFsiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LnJvb3QtaGFzaCIsIHJvb3RfaGFzaGVzW2ldXSkKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMzogaGFzaF9vcHRpb24gPSIsIGhhc2hfb3B0aW9uKQoKICAgIGNvdW50KGlfc3RvcmFnZS5vcHRpb25zKSA9PSA0CiAgICBpX3N0b3JhZ2Uub3B0aW9uc1swXSA9PSAicm8iCiAgICBpX3N0b3JhZ2Uub3B0aW9uc1sxXSA9PSAiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmJsb2NrX2RldmljZT1maWxlIgogICAgaV9zdG9yYWdlLm9wdGlvbnNbMl0gPT0gImlvLmthdGFjb250YWluZXJzLmZzLW9wdC5pcy1sYXllciIKICAgIGlfc3RvcmFnZS5vcHRpb25zWzNdID09IGhhc2hfb3B0aW9uCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAzOiB0cnVlIikKfQphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgNDogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gInNtYiIKICAgIHBfb3B0c19jb3VudCA6PSBjb3VudChwX3N0b3JhZ2Uub3B0aW9ucykKICAgIGlfb3B0c19jb3VudCA6PSBjb3VudChpX3N0b3JhZ2Uub3B0aW9ucykKICAgIGlfb3B0c19jb3VudCA9PSBwX29wdHNfY291bnQgKyAyCgogICAgaV9vcHRfbWF0Y2hlcyA6PSBbaSB8IGkgOj0gaWR4OyBpZHggPCBwX29wdHNfY291bnQ7IHBfc3RvcmFnZS5vcHRpb25zW2lkeF0gPT0gaV9zdG9yYWdlLm9wdGlvbnNbaWR4XV0KICAgIGNvdW50KGlfb3B0X21hdGNoZXMpID09IHBfb3B0c19jb3VudAoKICAgIHN0YXJ0c3dpdGgoaV9zdG9yYWdlLm9wdGlvbnNbaV9vcHRzX2NvdW50LTJdLCAiYWRkcj0iKQogICAgY3JlZHMgPSBzcGxpdChpX3N0b3JhZ2Uub3B0aW9uc1tpX29wdHNfY291bnQtMV0sICIsIikKICAgIGNvdW50KGNyZWRzKSA9PSAyCiAgICBzdGFydHN3aXRoKGNyZWRzWzBdLCAidXNlcm5hbWU9IikKICAgIHN0YXJ0c3dpdGgoY3JlZHNbMV0sICJwYXNzd29yZD0iKQogICAgCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDQ6IHRydWUiKQp9CgphbGxvd19vdmVybGF5X2xheWVyKHBvbGljeV9pZCwgcG9saWN5X2hhc2gsIGlfb3B0aW9uKSB7CiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogcG9saWN5X2lkID0iLCBwb2xpY3lfaWQsICJwb2xpY3lfaGFzaCA9IiwgcG9saWN5X2hhc2gpCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogaV9vcHRpb24gPSIsIGlfb3B0aW9uKQoKICAgIHN0YXJ0c3dpdGgoaV9vcHRpb24sICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQubGF5ZXI9IikKICAgIGlfdmFsdWUgOj0gcmVwbGFjZShpX29wdGlvbiwgImlvLmthdGFjb250YWluZXJzLmZzLW9wdC5sYXllcj0iLCAiIikKICAgIGlfdmFsdWVfZGVjb2RlZCA6PSBiYXNlNjQuZGVjb2RlKGlfdmFsdWUpCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogaV92YWx1ZV9kZWNvZGVkID0iLCBpX3ZhbHVlX2RlY29kZWQpCgogICAgcG9saWN5X3N1ZmZpeCA6PSBjb25jYXQoIj0iLCBbInRhcixybyxpby5rYXRhY29udGFpbmVycy5mcy1vcHQuYmxvY2tfZGV2aWNlPWZpbGUsaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmlzLWxheWVyLGlvLmthdGFjb250YWluZXJzLmZzLW9wdC5yb290LWhhc2giLCBwb2xpY3lfaGFzaF0pCiAgICBwX3ZhbHVlIDo9IGNvbmNhdCgiLCIsIFtwb2xpY3lfaWQsIHBvbGljeV9zdWZmaXhdKQogICAgcHJpbnQoImFsbG93X292ZXJsYXlfbGF5ZXI6IHBfdmFsdWUgPSIsIHBfdmFsdWUpCgogICAgcF92YWx1ZSA9PSBpX3ZhbHVlX2RlY29kZWQKCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogdHJ1ZSIpCn0KCmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAidGFyIgoKICAgIHN0YXJ0c3dpdGgocF9zdG9yYWdlLm1vdW50X3BvaW50LCAiJChsYXllciIpCiAgICBtb3VudF9zdWZmaXggOj0gdHJpbV9sZWZ0KHBfc3RvcmFnZS5tb3VudF9wb2ludCwgIiQobGF5ZXIiKQoKICAgIGVuZHN3aXRoKG1vdW50X3N1ZmZpeCwgIikiKQogICAgbGF5ZXJfaW5kZXggOj0gdHJpbV9yaWdodChtb3VudF9zdWZmaXgsICIpIikKICAgIGkgOj0gdG9fbnVtYmVyKGxheWVyX2luZGV4KQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDE6IGkgPSIsIGkpCgogICAgbGF5ZXJfaWQgOj0gbGF5ZXJfaWRzW2ldCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMTogbGF5ZXJfaWQgPSIsIGxheWVyX2lkKQoKICAgIHBfbW91bnQgOj0gY29uY2F0KCIvIiwgWyIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L2xheWVycyIsIGxheWVyX2lkXSkKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCAxOiBwX21vdW50ID0iLCBwX21vdW50KQoKICAgIHBfbW91bnQgPT0gaV9zdG9yYWdlLm1vdW50X3BvaW50CgogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDE6IHRydWUiKQp9CmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAiZnVzZTMua2F0YS1vdmVybGF5IgoKICAgIG1vdW50MSA6PSByZXBsYWNlKHBfc3RvcmFnZS5tb3VudF9wb2ludCwgIiQoY3BhdGgpIiwgcG9saWN5X2RhdGEuY29tbW9uLmNwYXRoKQogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDI6IG1vdW50MiA9IiwgbW91bnQyKQoKICAgIG1vdW50MiA9PSBpX3N0b3JhZ2UubW91bnRfcG9pbnQKCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMjogdHJ1ZSIpCn0KYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKSB7CiAgICBwX3N0b3JhZ2UuZnN0eXBlID09ICJsb2NhbCIKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQyID0iLCBtb3VudDIpCgogICAgbW91bnQzIDo9IHJlcGxhY2UobW91bnQyLCAiJChzYW5kYm94LWlkKSIsIHNhbmRib3hfaWQpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQzID0iLCBtb3VudDMpCgogICAgcmVnZXgubWF0Y2gobW91bnQzLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCgogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDM6IHRydWUiKQp9CmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAiYmluZCIKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNDogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNDogbW91bnQyID0iLCBtb3VudDIpCgogICAgbW91bnQzIDo9IHJlcGxhY2UobW91bnQyLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDQ6IG1vdW50MyA9IiwgbW91bnQzKQoKICAgIHJlZ2V4Lm1hdGNoKG1vdW50MywgaV9zdG9yYWdlLm1vdW50X3BvaW50KQoKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA0OiB0cnVlIikKfQphbGxvd19tb3VudF9wb2ludChwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgYnVuZGxlX2lkLCBzYW5kYm94X2lkLCBsYXllcl9pZHMpIHsKICAgIHBfc3RvcmFnZS5mc3R5cGUgPT0gInRtcGZzIgoKICAgIG1vdW50MSA6PSBwX3N0b3JhZ2UubW91bnRfcG9pbnQKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA1OiBtb3VudDEgPSIsIG1vdW50MSkKCiAgICByZWdleC5tYXRjaChtb3VudDEsIGlfc3RvcmFnZS5tb3VudF9wb2ludCkKCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNTogdHJ1ZSIpCn0KYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKSB7CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogaV9zdG9yYWdlLm1vdW50X3BvaW50ID0iLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCiAgICBhbGxvd19kaXJlY3Rfdm9sX2RyaXZlcihwX3N0b3JhZ2UsIGlfc3RvcmFnZSkKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChzcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQyID0iLCBtb3VudDIpCgogICAgZGlyZWN0X3ZvbF9wYXRoIDo9IGlfc3RvcmFnZS5zb3VyY2UKICAgIG1vdW50MyA6PSByZXBsYWNlKG1vdW50MiwgIiQoYjY0LWRpcmVjdC12b2wtcGF0aCkiLCBiYXNlNjR1cmwuZW5jb2RlKGRpcmVjdF92b2xfcGF0aCkpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQzID0iLCBtb3VudDMpCgogICAgbW91bnQzID09IGlfc3RvcmFnZS5tb3VudF9wb2ludAoKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA2OiB0cnVlIikKfQoKYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIocF9zdG9yYWdlLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19kaXJlY3Rfdm9sX2RyaXZlciAxOiBzdGFydCIpCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCiAgICBwcmludCgiYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIgMTogdHJ1ZSIpCn0KYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIocF9zdG9yYWdlLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19kaXJlY3Rfdm9sX2RyaXZlciAyOiBzdGFydCIpCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJzbWIiCiAgICBwcmludCgiYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIgMjogdHJ1ZSIpCn0KCiMgRXhlY1Byb2Nlc3NSZXF1ZXN0LnByb2Nlc3MuQ2FwYWJpbGl0aWVzCmFsbG93X2V4ZWNfY2FwcyhpX2NhcHMpIHsKICAgIG5vdCBpX2NhcHMuQW1iaWVudAogICAgbm90IGlfY2Fwcy5Cb3VuZGluZwogICAgbm90IGlfY2Fwcy5FZmZlY3RpdmUKICAgIG5vdCBpX2NhcHMuSW5oZXJpdGFibGUKICAgIG5vdCBpX2NhcHMuUGVybWl0dGVkCn0KCiMgT0NJLlByb2Nlc3MuQ2FwYWJpbGl0aWVzCmFsbG93X2NhcHMocF9jYXBzLCBpX2NhcHMpIHsKICAgIHByaW50KCJhbGxvd19jYXBzOiBwb2xpY3kgQW1iaWVudCA9IiwgcF9jYXBzLkFtYmllbnQpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgQW1iaWVudCA9IiwgaV9jYXBzLkFtYmllbnQpCiAgICBtYXRjaF9jYXBzKHBfY2Fwcy5BbWJpZW50LCBpX2NhcHMuQW1iaWVudCkKCiAgICBwcmludCgiYWxsb3dfY2FwczogcG9saWN5IEJvdW5kaW5nID0iLCBwX2NhcHMuQm91bmRpbmcpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgQm91bmRpbmcgPSIsIGlfY2Fwcy5Cb3VuZGluZykKICAgIG1hdGNoX2NhcHMocF9jYXBzLkJvdW5kaW5nLCBpX2NhcHMuQm91bmRpbmcpCgogICAgcHJpbnQoImFsbG93X2NhcHM6IHBvbGljeSBFZmZlY3RpdmUgPSIsIHBfY2Fwcy5FZmZlY3RpdmUpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgRWZmZWN0aXZlID0iLCBpX2NhcHMuRWZmZWN0aXZlKQogICAgbWF0Y2hfY2FwcyhwX2NhcHMuRWZmZWN0aXZlLCBpX2NhcHMuRWZmZWN0aXZlKQoKICAgIHByaW50KCJhbGxvd19jYXBzOiBwb2xpY3kgSW5oZXJpdGFibGUgPSIsIHBfY2Fwcy5Jbmhlcml0YWJsZSkKICAgIHByaW50KCJhbGxvd19jYXBzOiBpbnB1dCBJbmhlcml0YWJsZSA9IiwgaV9jYXBzLkluaGVyaXRhYmxlKQogICAgbWF0Y2hfY2FwcyhwX2NhcHMuSW5oZXJpdGFibGUsIGlfY2Fwcy5Jbmhlcml0YWJsZSkKCiAgICBwcmludCgiYWxsb3dfY2FwczogcG9saWN5IFBlcm1pdHRlZCA9IiwgcF9jYXBzLlBlcm1pdHRlZCkKICAgIHByaW50KCJhbGxvd19jYXBzOiBpbnB1dCBQZXJtaXR0ZWQgPSIsIGlfY2Fwcy5QZXJtaXR0ZWQpCiAgICBtYXRjaF9jYXBzKHBfY2Fwcy5QZXJtaXR0ZWQsIGlfY2Fwcy5QZXJtaXR0ZWQpCn0KCm1hdGNoX2NhcHMocF9jYXBzLCBpX2NhcHMpIHsKICAgIHByaW50KCJtYXRjaF9jYXBzIDE6IHN0YXJ0IikKCiAgICBwX2NhcHMgPT0gaV9jYXBzCgogICAgcHJpbnQoIm1hdGNoX2NhcHMgMTogdHJ1ZSIpCn0KbWF0Y2hfY2FwcyhwX2NhcHMsIGlfY2FwcykgewogICAgcHJpbnQoIm1hdGNoX2NhcHMgMjogc3RhcnQiKQoKICAgIGNvdW50KHBfY2FwcykgPT0gMQogICAgcF9jYXBzWzBdID09ICIkKGRlZmF1bHRfY2FwcykiCgogICAgcHJpbnQoIm1hdGNoX2NhcHMgMjogZGVmYXVsdF9jYXBzID0iLCBwb2xpY3lfZGF0YS5jb21tb24uZGVmYXVsdF9jYXBzKQogICAgcG9saWN5X2RhdGEuY29tbW9uLmRlZmF1bHRfY2FwcyA9PSBpX2NhcHMKCiAgICBwcmludCgibWF0Y2hfY2FwcyAyOiB0cnVlIikKfQptYXRjaF9jYXBzKHBfY2FwcywgaV9jYXBzKSB7CiAgICBwcmludCgibWF0Y2hfY2FwcyAzOiBzdGFydCIpCgogICAgY291bnQocF9jYXBzKSA9PSAxCiAgICBwX2NhcHNbMF0gPT0gIiQocHJpdmlsZWdlZF9jYXBzKSIKCiAgICBwcmludCgibWF0Y2hfY2FwcyAzOiBwcml2aWxlZ2VkX2NhcHMgPSIsIHBvbGljeV9kYXRhLmNvbW1vbi5wcml2aWxlZ2VkX2NhcHMpCiAgICBwb2xpY3lfZGF0YS5jb21tb24ucHJpdmlsZWdlZF9jYXBzID09IGlfY2FwcwoKICAgIHByaW50KCJtYXRjaF9jYXBzIDM6IHRydWUiKQp9CgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgpjaGVja19kaXJlY3RvcnlfdHJhdmVyc2FsKGlfcGF0aCkgewogICAgbm90IHJlZ2V4Lm1hdGNoKCIoXnwvKS4uKCR8LykiLCBpX3BhdGgpCn0KCmNoZWNrX3N5bWxpbmtfc291cmNlKGlfc3JjKSB7CiAgICBpX3NyYyA9PSAiIgogICAgcHJpbnQoImNoZWNrX3N5bWxpbmtfc291cmNlIDE6IHRydWUiKQp9CmNoZWNrX3N5bWxpbmtfc291cmNlKGlfc3JjKSB7CiAgICBpX3NyYyAhPSAiIgogICAgcHJpbnQoImNoZWNrX3N5bWxpbmtfc291cmNlIDI6IGlfc3JjID0iLCBpX3NyYykKCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24uc19zb3VyY2UxLCBpX3NyYykKCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMjogdHJ1ZSIpCn0KY2hlY2tfc3ltbGlua19zb3VyY2UoaV9zcmMpIHsKICAgIGlfc3JjICE9ICIiCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMzogaV9zcmMgPSIsIGlfc3JjKQoKICAgIHJlZ2V4Lm1hdGNoKHBvbGljeV9kYXRhLmNvbW1vbi5zX3NvdXJjZTIsIGlfc3JjKQogICAgY2hlY2tfZGlyZWN0b3J5X3RyYXZlcnNhbChpX3NyYykKCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMzogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfc3RvcmFnZXMoaV9zdG9yYWdlcykgewogICAgcHJpbnQoImFsbG93X3NhbmRib3hfc3RvcmFnZXM6IGlfc3RvcmFnZXMgPSIsIGlfc3RvcmFnZXMpCgogICAgcF9zdG9yYWdlcyA6PSBwb2xpY3lfZGF0YS5zYW5kYm94LnN0b3JhZ2VzCiAgICBldmVyeSBpX3N0b3JhZ2UgaW4gaV9zdG9yYWdlcyB7CiAgICAgICAgYWxsb3dfc2FuZGJveF9zdG9yYWdlKHBfc3RvcmFnZXMsIGlfc3RvcmFnZSkKICAgIH0KCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9zdG9yYWdlczogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfc3RvcmFnZShwX3N0b3JhZ2VzLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IGlfc3RvcmFnZSA9IiwgaV9zdG9yYWdlKQoKICAgIHNvbWUgcF9zdG9yYWdlIGluIHBfc3RvcmFnZXMKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IHBfc3RvcmFnZSA9IiwgcF9zdG9yYWdlKQogICAgaV9zdG9yYWdlID09IHBfc3RvcmFnZQoKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IHRydWUiKQp9CgpDb3B5RmlsZVJlcXVlc3QgewogICAgcHJpbnQoIkNvcHlGaWxlUmVxdWVzdDogaW5wdXQucGF0aCA9IiwgaW5wdXQucGF0aCkKCiAgICBjaGVja19zeW1saW5rX3NvdXJjZShpbnB1dC5zeW1saW5rX3NyYykKICAgIGNoZWNrX2RpcmVjdG9yeV90cmF2ZXJzYWwoaW5wdXQucGF0aCkKCiAgICBzb21lIHJlZ2V4MSBpbiBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLkNvcHlGaWxlUmVxdWVzdAogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5jcGF0aCkKICAgIHJlZ2V4NCA6PSByZXBsYWNlKHJlZ2V4MywgIiQoYnVuZGxlLWlkKSIsIEJVTkRMRV9JRCkKICAgIHByaW50KCJDb3B5RmlsZVJlcXVlc3Q6IHJlZ2V4NCA9IiwgcmVnZXg0KQoKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4NCwgaW5wdXQucGF0aCkKCiAgICBwcmludCgiQ29weUZpbGVSZXF1ZXN0OiB0cnVlIikKfQoKQ3JlYXRlU2FuZGJveFJlcXVlc3QgewogICAgcHJpbnQoIkNyZWF0ZVNhbmRib3hSZXF1ZXN0OiBpbnB1dC5ndWVzdF9ob29rX3BhdGggPSIsIGlucHV0Lmd1ZXN0X2hvb2tfcGF0aCkKICAgIGNvdW50KGlucHV0Lmd1ZXN0X2hvb2tfcGF0aCkgPT0gMAoKICAgIHByaW50KCJDcmVhdGVTYW5kYm94UmVxdWVzdDogaW5wdXQua2VybmVsX21vZHVsZXMgPSIsIGlucHV0Lmtlcm5lbF9tb2R1bGVzKQogICAgY291bnQoaW5wdXQua2VybmVsX21vZHVsZXMpID09IDAKCiAgICBpX3BpZG5zIDo9IGlucHV0LnNhbmRib3hfcGlkbnMKICAgIHByaW50KCJDcmVhdGVTYW5kYm94UmVxdWVzdDogaV9waWRucyA9IiwgaV9waWRucykKICAgIGlfcGlkbnMgPT0gZmFsc2UKICAgIGFsbG93X3NhbmRib3hfc3RvcmFnZXMoaW5wdXQuc3RvcmFnZXMpCn0KCmFsbG93X2V4ZWMocF9jb250YWluZXIsIGlfcHJvY2VzcykgewogICAgcHJpbnQoImFsbG93X2V4ZWM6IHN0YXJ0IikKCiAgICBwX29jaSA9IHBfY29udGFpbmVyLk9DSQogICAgcF9zX25hbWUgPSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc19uYW1lc3BhY2UgPSBnZXRfc3RhdGVfdmFsKCJuYW1lc3BhY2UiKQogICAgYWxsb3dfcHJvYmVfcHJvY2VzcyhwX29jaS5Qcm9jZXNzLCBpX3Byb2Nlc3MsIHBfc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfZXhlYzogdHJ1ZSIpCn0KCmFsbG93X2ludGVyYWN0aXZlX2V4ZWMocF9jb250YWluZXIsIGlfcHJvY2VzcykgewogICAgcHJpbnQoImFsbG93X2ludGVyYWN0aXZlX2V4ZWM6IHN0YXJ0IikKCiAgICBwX29jaSA9IHBfY29udGFpbmVyLk9DSQogICAgcF9zX25hbWUgPSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc19uYW1lc3BhY2UgPSBnZXRfc3RhdGVfdmFsKCJuYW1lc3BhY2UiKQogICAgYWxsb3dfaW50ZXJhY3RpdmVfcHJvY2VzcyhwX29jaS5Qcm9jZXNzLCBpX3Byb2Nlc3MsIHBfc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfaW50ZXJhY3RpdmVfZXhlYzogdHJ1ZSIpCn0KCiMgVE9ETzogc2hvdWxkIG90aGVyIEV4ZWNQcm9jZXNzUmVxdWVzdCBpbnB1dCBkYXRhIGZpZWxkcyBiZSB2YWxpZGF0ZWQgYXMgd2VsbD8KRXhlY1Byb2Nlc3NSZXF1ZXN0IHsKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMTogaW5wdXQgPSIsIGlucHV0KQoKICAgIHNvbWUgcF9jb21tYW5kIGluIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuRXhlY1Byb2Nlc3NSZXF1ZXN0LmFsbG93ZWRfY29tbWFuZHMKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMTogcF9jb21tYW5kID0iLCBwX2NvbW1hbmQpCiAgICBwX2NvbW1hbmQgPT0gaW5wdXQucHJvY2Vzcy5BcmdzCgogICAgIyBUT0RPOiBtYXRjaCBwX2NvbnRhaW5lcidzIElEIHdpdGggdGhlIGlucHV0IGNvbnRhaW5lcl9pZC4KICAgIHNvbWUgcF9jb250YWluZXIgaW4gcG9saWN5X2RhdGEuY29udGFpbmVycwogICAgYWxsb3dfaW50ZXJhY3RpdmVfZXhlYyhwX2NvbnRhaW5lciwgaW5wdXQucHJvY2VzcykKCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDE6IHRydWUiKQp9CkV4ZWNQcm9jZXNzUmVxdWVzdCB7CiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDI6IGlucHV0ID0iLCBpbnB1dCkKCiAgICAjIFRPRE86IG1hdGNoIGlucHV0IGNvbnRhaW5lciBJRCB3aXRoIGl0cyBjb3JyZXNwb25kaW5nIGNvbnRhaW5lci5leGVjX2NvbW1hbmRzLgogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBzb21lIHBfY29tbWFuZCBpbiBwX2NvbnRhaW5lci5leGVjX2NvbW1hbmRzCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDI6IHBfY29tbWFuZCA9IiwgcF9jb21tYW5kKQoKICAgICMgVE9ETzogc2hvdWxkIG90aGVyIGlucHV0IGRhdGEgZmllbGRzIGJlIHZhbGlkYXRlZCBhcyB3ZWxsPwogICAgcF9jb21tYW5kID09IGlucHV0LnByb2Nlc3MuQXJncwoKICAgIGFsbG93X2V4ZWMocF9jb250YWluZXIsIGlucHV0LnByb2Nlc3MpCgogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAyOiB0cnVlIikKfQpFeGVjUHJvY2Vzc1JlcXVlc3QgewogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAzOiBpbnB1dCA9IiwgaW5wdXQpCgogICAgaV9jb21tYW5kID0gY29uY2F0KCIgIiwgaW5wdXQucHJvY2Vzcy5BcmdzKQogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAzOiBpX2NvbW1hbmQgPSIsIGlfY29tbWFuZCkKCiAgICBzb21lIHBfcmVnZXggaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5FeGVjUHJvY2Vzc1JlcXVlc3QucmVnZXgKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMzogcF9yZWdleCA9IiwgcF9yZWdleCkKCiAgICByZWdleC5tYXRjaChwX3JlZ2V4LCBpX2NvbW1hbmQpCgogICAgIyBUT0RPOiBtYXRjaCBwX2NvbnRhaW5lcidzIElEIHdpdGggdGhlIGlucHV0IGNvbnRhaW5lcl9pZC4KICAgIHNvbWUgcF9jb250YWluZXIgaW4gcG9saWN5X2RhdGEuY29udGFpbmVycwogICAgYWxsb3dfaW50ZXJhY3RpdmVfZXhlYyhwX2NvbnRhaW5lciwgaW5wdXQucHJvY2VzcykKCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDM6IHRydWUiKQp9CgpVcGRhdGVSb3V0ZXNSZXF1ZXN0IHsKICAgIHByaW50KCJVcGRhdGVSb3V0ZXNSZXF1ZXN0OiBpbnB1dCA9IiwgaW5wdXQpCiAgICBwcmludCgiVXBkYXRlUm91dGVzUmVxdWVzdDogcG9saWN5ID0iLCBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLlVwZGF0ZVJvdXRlc1JlcXVlc3QpCgogICAgaV9yb3V0ZXMgOj0gaW5wdXQucm91dGVzLlJvdXRlcwogICAgcF9zb3VyY2VfcmVnZXggPSBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLlVwZGF0ZVJvdXRlc1JlcXVlc3QuZm9yYmlkZGVuX3NvdXJjZV9yZWdleAogICAgcF9uYW1lcyA9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuVXBkYXRlUm91dGVzUmVxdWVzdC5mb3JiaWRkZW5fZGV2aWNlX25hbWVzCgogICAgZXZlcnkgaV9yb3V0ZSBpbiBpX3JvdXRlcyB7CiAgICAgICAgcHJpbnQoImlfcm91dGUuc291cmNlID0iLCBpX3JvdXRlLnNvdXJjZSkKICAgICAgICBldmVyeSBwX3JlZ2V4IGluIHBfc291cmNlX3JlZ2V4IHsKICAgICAgICAgICAgcHJpbnQoInBfcmVnZXggPSIsIHBfcmVnZXgpCiAgICAgICAgICAgIG5vdCByZWdleC5tYXRjaChwX3JlZ2V4LCBpX3JvdXRlLnNvdXJjZSkKICAgICAgICB9CgogICAgICAgIHByaW50KCJpX3JvdXRlLmRldmljZSA9IiwgaV9yb3V0ZS5kZXZpY2UpCiAgICAgICAgbm90IGlfcm91dGUuZGV2aWNlIGluIHBfbmFtZXMKICAgIH0KCiAgICBwcmludCgiVXBkYXRlUm91dGVzUmVxdWVzdDogdHJ1ZSIpCn0KClVwZGF0ZUludGVyZmFjZVJlcXVlc3QgewogICAgcHJpbnQoIlVwZGF0ZUludGVyZmFjZVJlcXVlc3Q6IGlucHV0ID0iLCBpbnB1dCkKICAgIHByaW50KCJVcGRhdGVJbnRlcmZhY2VSZXF1ZXN0OiBwb2xpY3kgPSIsIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuVXBkYXRlSW50ZXJmYWNlUmVxdWVzdCkKCiAgICBpX2ludGVyZmFjZSA6PSBpbnB1dC5pbnRlcmZhY2UKICAgIHBfZmxhZ3MgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmFsbG93X3Jhd19mbGFncwoKICAgICMgVHlwaWNhbGx5LCBqdXN0IElGRl9OT0FSUCBpcyB1c2VkLgogICAgYml0cy5hbmQoaV9pbnRlcmZhY2UucmF3X2ZsYWdzLCBiaXRzLm5lZ2F0ZShwX2ZsYWdzKSkgPT0gMAoKICAgIHBfbmFtZXMgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmZvcmJpZGRlbl9uYW1lcwoKICAgIG5vdCBpX2ludGVyZmFjZS5uYW1lIGluIHBfbmFtZXMKCiAgICBwX2h3YWRkcnMgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmZvcmJpZGRlbl9od19hZGRycwoKICAgIG5vdCBpX2ludGVyZmFjZS5od0FkZHIgaW4gcF9od2FkZHJzCgogICAgcHJpbnQoIlVwZGF0ZUludGVyZmFjZVJlcXVlc3Q6IHRydWUiKQp9CgpDbG9zZVN0ZGluUmVxdWVzdCB7CiAgICBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLkNsb3NlU3RkaW5SZXF1ZXN0ID09IHRydWUKfQoKUmVhZFN0cmVhbVJlcXVlc3QgewogICAgcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5SZWFkU3RyZWFtUmVxdWVzdCA9PSB0cnVlCn0KClVwZGF0ZUVwaGVtZXJhbE1vdW50c1JlcXVlc3QgewogICAgcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVFcGhlbWVyYWxNb3VudHNSZXF1ZXN0ID09IHRydWUKfQoKV3JpdGVTdHJlYW1SZXF1ZXN0IHsKICAgIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuV3JpdGVTdHJlYW1SZXF1ZXN0ID09IHRydWUKfQoKcG9saWN5X2RhdGEgOj0gewogICJjb250YWluZXJzIjogWwogICAgewogICAgICAiT0NJIjogewogICAgICAgICJWZXJzaW9uIjogIjEuMS4wLXJjLjEiLAogICAgICAgICJQcm9jZXNzIjogewogICAgICAgICAgIlRlcm1pbmFsIjogZmFsc2UsCiAgICAgICAgICAiVXNlciI6IHsKICAgICAgICAgICAgIlVJRCI6IDY1NTM1LAogICAgICAgICAgICAiR0lEIjogNjU1MzUsCiAgICAgICAgICAgICJBZGRpdGlvbmFsR2lkcyI6IFtdLAogICAgICAgICAgICAiVXNlcm5hbWUiOiAiIgogICAgICAgICAgfSwKICAgICAgICAgICJEZXByZWNhdGVkQXJncyI6IFsKICAgICAgICAgICAgIi9wYXVzZSIKICAgICAgICAgIF0sCiAgICAgICAgICAiQXJncyI6IFsKICAgICAgICAgICAgIi9wYXVzZSIKICAgICAgICAgIF0sCiAgICAgICAgICAiRW52IjogWwogICAgICAgICAgICAiUEFUSD0vdXNyL2xvY2FsL3NiaW46L3Vzci9sb2NhbC9iaW46L3Vzci9zYmluOi91c3IvYmluOi9zYmluOi9iaW4iCiAgICAgICAgICBdLAogICAgICAgICAgIkN3ZCI6ICIvIiwKICAgICAgICAgICJDYXBhYmlsaXRpZXMiOiB7CiAgICAgICAgICAgICJBbWJpZW50IjogW10sCiAgICAgICAgICAgICJCb3VuZGluZyI6IFsKICAgICAgICAgICAgICAiJChkZWZhdWx0X2NhcHMpIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiRWZmZWN0aXZlIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJJbmhlcml0YWJsZSI6IFtdLAogICAgICAgICAgICAiUGVybWl0dGVkIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICAiTm9OZXdQcml2aWxlZ2VzIjogdHJ1ZQogICAgICAgIH0sCiAgICAgICAgIlJvb3QiOiB7CiAgICAgICAgICAiUGF0aCI6ICIkKGNwYXRoKS8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgIlJlYWRvbmx5IjogdHJ1ZQogICAgICAgIH0sCiAgICAgICAgIk1vdW50cyI6IFsKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9wcm9jIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJwcm9jIiwKICAgICAgICAgICAgInR5cGVfIjogInByb2MiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2IiwKICAgICAgICAgICAgInNvdXJjZSI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJzdHJpY3RhdGltZSIsCiAgICAgICAgICAgICAgIm1vZGU9NzU1IiwKICAgICAgICAgICAgICAic2l6ZT02NTUzNmsiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L3B0cyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiZGV2cHRzIiwKICAgICAgICAgICAgInR5cGVfIjogImRldnB0cyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJuZXdpbnN0YW5jZSIsCiAgICAgICAgICAgICAgInB0bXhtb2RlPTA2NjYiLAogICAgICAgICAgICAgICJtb2RlPTA2MjAiLAogICAgICAgICAgICAgICJnaWQ9NSIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvc2htIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L3NobSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi9tcXVldWUiLAogICAgICAgICAgICAic291cmNlIjogIm1xdWV1ZSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJtcXVldWUiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvc3lzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJzeXNmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJzeXNmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2V0Yy9yZXNvbHYuY29uZiIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClyZXNvbHYuY29uZiQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJvIiwKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9kZXYiLAogICAgICAgICAgICAgICJub2V4ZWMiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0KICAgICAgICBdLAogICAgICAgICJBbm5vdGF0aW9ucyI6IHsKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmJ1bmRsZV9wYXRoIjogIi9ydW4vY29udGFpbmVyZC9pby5jb250YWluZXJkLnJ1bnRpbWUudjIudGFzay9rOHMuaW8vJChidW5kbGUtaWQpIiwKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIjogInBvZF9zYW5kYm94IiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSI6ICJzYW5kYm94IiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWlkIjogIl5bYS16MC05XXs2NH0kIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWxvZy1kaXJlY3RvcnkiOiAiXi92YXIvbG9nL3BvZHMvJChzYW5kYm94LW5hbWVzcGFjZSlfJChzYW5kYm94LW5hbWUpX1swLTlhLWZdezh9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezEyfSQiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZXNwYWNlIjogIiIsCiAgICAgICAgICAibmVyZGN0bC9uZXR3b3JrLW5hbWVzcGFjZSI6ICJeL3Zhci9ydW4vbmV0bnMvY25pLVswLTlhLWZdezh9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezEyfSQiCiAgICAgICAgfSwKICAgICAgICAiTGludXgiOiB7CiAgICAgICAgICAiTmFtZXNwYWNlcyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICJUeXBlIjogImlwYyIsCiAgICAgICAgICAgICAgIlBhdGgiOiAiIgogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgIlR5cGUiOiAidXRzIiwKICAgICAgICAgICAgICAiUGF0aCI6ICIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiVHlwZSI6ICJtb3VudCIsCiAgICAgICAgICAgICAgIlBhdGgiOiAiIgogICAgICAgICAgICB9CiAgICAgICAgICBdLAogICAgICAgICAgIk1hc2tlZFBhdGhzIjogWwogICAgICAgICAgICAiL3Byb2MvYWNwaSIsCiAgICAgICAgICAgICIvcHJvYy9hc291bmQiLAogICAgICAgICAgICAiL3Byb2Mva2NvcmUiLAogICAgICAgICAgICAiL3Byb2Mva2V5cyIsCiAgICAgICAgICAgICIvcHJvYy9sYXRlbmN5X3N0YXRzIiwKICAgICAgICAgICAgIi9wcm9jL3RpbWVyX2xpc3QiLAogICAgICAgICAgICAiL3Byb2MvdGltZXJfc3RhdHMiLAogICAgICAgICAgICAiL3Byb2Mvc2NoZWRfZGVidWciLAogICAgICAgICAgICAiL3N5cy9maXJtd2FyZSIsCiAgICAgICAgICAgICIvcHJvYy9zY3NpIgogICAgICAgICAgXSwKICAgICAgICAgICJSZWFkb25seVBhdGhzIjogWwogICAgICAgICAgICAiL3Byb2MvYnVzIiwKICAgICAgICAgICAgIi9wcm9jL2ZzIiwKICAgICAgICAgICAgIi9wcm9jL2lycSIsCiAgICAgICAgICAgICIvcHJvYy9zeXMiLAogICAgICAgICAgICAiL3Byb2Mvc3lzcnEtdHJpZ2dlciIKICAgICAgICAgIF0sCiAgICAgICAgICAiRGV2aWNlcyI6IFtdLAogICAgICAgICAgIlN5c2N0bCI6IHsKICAgICAgICAgICAgIm5ldC5pcHY0LmlwX3VucHJpdmlsZWdlZF9wb3J0X3N0YXJ0IjogIjAiLAogICAgICAgICAgICAibmV0LmlwdjQucGluZ19ncm91cF9yYW5nZSI6ICIwIDIxNDc0ODM2NDciCiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9LAogICAgICAic3RvcmFnZXMiOiBbCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJibGsiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogInRhciIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIiQoaGFzaDApIgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGxheWVyMCkiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJvdmVybGF5ZnMiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogImZ1c2UzLmthdGEtb3ZlcmxheSIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIjVhNWFhZDgwMDU1ZmYyMDAxMmE1MGRjMjVmOGRmN2EyOTkyNDQ3NDMyNGQ2NWY3ZDUzMDZlZThlZTI3ZmY3MWQiLAogICAgICAgICAgICAiODE3MjUwZjFhM2UzMzZkYTc2ZjViZDNmYTc4NGUxYjI2ZDk1OWI5YzEzMTg3NjgxNWJhMjYwNDA0OGI3MGMxOCIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChjcGF0aCkvJChidW5kbGUtaWQpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9CiAgICAgIF0sCiAgICAgICJkZXZpY2VzIjogW10sCiAgICAgICJzYW5kYm94X3BpZG5zIjogZmFsc2UsCiAgICAgICJleGVjX2NvbW1hbmRzIjogW10sCiAgICAgICJlbnZfbWFwIjogewogICAgICAgICJQQVRIIjogIi91c3IvbG9jYWwvc2JpbjovdXNyL2xvY2FsL2JpbjovdXNyL3NiaW46L3Vzci9iaW46L3NiaW46L2JpbiIKICAgICAgfQogICAgfSwKICAgIHsKICAgICAgIk9DSSI6IHsKICAgICAgICAiVmVyc2lvbiI6ICIxLjEuMC1yYy4xIiwKICAgICAgICAiUHJvY2VzcyI6IHsKICAgICAgICAgICJUZXJtaW5hbCI6IGZhbHNlLAogICAgICAgICAgIlVzZXIiOiB7CiAgICAgICAgICAgICJVSUQiOiAwLAogICAgICAgICAgICAiR0lEIjogMCwKICAgICAgICAgICAgIkFkZGl0aW9uYWxHaWRzIjogW10sCiAgICAgICAgICAgICJVc2VybmFtZSI6ICIiCiAgICAgICAgICB9LAogICAgICAgICAgIkRlcHJlY2F0ZWRBcmdzIjogWwogICAgICAgICAgICAic29jYXQiLAogICAgICAgICAgICAidGNwLWxpc3RlbjoxMDAwMCxmb3JrLHJldXNlYWRkciIsCiAgICAgICAgICAgICJ1bml4LWNvbm5lY3Q6L2NzaS9jc2kuc29jayIKICAgICAgICAgIF0sCiAgICAgICAgICAiQXJncyI6IFsKICAgICAgICAgICAgInNvY2F0IiwKICAgICAgICAgICAgInRjcC1saXN0ZW46MTAwMDAsZm9yayxyZXVzZWFkZHIiLAogICAgICAgICAgICAidW5peC1jb25uZWN0Oi9jc2kvY3NpLnNvY2siCiAgICAgICAgICBdLAogICAgICAgICAgIkVudiI6IFsKICAgICAgICAgICAgIlBBVEg9L3Vzci9sb2NhbC9zYmluOi91c3IvbG9jYWwvYmluOi91c3Ivc2JpbjovdXNyL2Jpbjovc2JpbjovYmluIiwKICAgICAgICAgICAgIkhPU1ROQU1FPSQoaG9zdC1uYW1lKSIKICAgICAgICAgIF0sCiAgICAgICAgICAiQ3dkIjogIi8iLAogICAgICAgICAgIkNhcGFiaWxpdGllcyI6IHsKICAgICAgICAgICAgIkFtYmllbnQiOiBbXSwKICAgICAgICAgICAgIkJvdW5kaW5nIjogWwogICAgICAgICAgICAgICIkKHByaXZpbGVnZWRfY2FwcykiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJFZmZlY3RpdmUiOiBbCiAgICAgICAgICAgICAgIiQocHJpdmlsZWdlZF9jYXBzKSIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgIkluaGVyaXRhYmxlIjogW10sCiAgICAgICAgICAgICJQZXJtaXR0ZWQiOiBbCiAgICAgICAgICAgICAgIiQocHJpdmlsZWdlZF9jYXBzKSIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgICJOb05ld1ByaXZpbGVnZXMiOiBmYWxzZQogICAgICAgIH0sCiAgICAgICAgIlJvb3QiOiB7CiAgICAgICAgICAiUGF0aCI6ICIkKGNwYXRoKS8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgIlJlYWRvbmx5IjogZmFsc2UKICAgICAgICB9LAogICAgICAgICJNb3VudHMiOiBbCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvcHJvYyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAicHJvYyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJwcm9jIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAgICAgIm5vZGV2IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2RldiIsCiAgICAgICAgICAgICJzb3VyY2UiOiAidG1wZnMiLAogICAgICAgICAgICAidHlwZV8iOiAidG1wZnMiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAic3RyaWN0YXRpbWUiLAogICAgICAgICAgICAgICJtb2RlPTc1NSIsCiAgICAgICAgICAgICAgInNpemU9NjU1MzZrIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi9wdHMiLAogICAgICAgICAgICAic291cmNlIjogImRldnB0cyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJkZXZwdHMiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibmV3aW5zdGFuY2UiLAogICAgICAgICAgICAgICJwdG14bW9kZT0wNjY2IiwKICAgICAgICAgICAgICAibW9kZT0wNjIwIiwKICAgICAgICAgICAgICAiZ2lkPTUiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L3NobSIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiL3J1bi9rYXRhLWNvbnRhaW5lcnMvc2FuZGJveC9zaG0iLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvbXF1ZXVlIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJtcXVldWUiLAogICAgICAgICAgICAidHlwZV8iOiAibXF1ZXVlIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAgICAgIm5vZGV2IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL3N5cyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAic3lzZnMiLAogICAgICAgICAgICAidHlwZV8iOiAic3lzZnMiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiLAogICAgICAgICAgICAgICJydyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9zeXMvZnMvY2dyb3VwIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJjZ3JvdXAiLAogICAgICAgICAgICAidHlwZV8iOiAiY2dyb3VwIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAgICAgIm5vZGV2IiwKICAgICAgICAgICAgICAicmVsYXRpbWUiLAogICAgICAgICAgICAgICJydyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9ldGMvaG9zdHMiLAogICAgICAgICAgICAic291cmNlIjogIiQoc2ZwcmVmaXgpaG9zdHMkIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJ3IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi90ZXJtaW5hdGlvbi1sb2ciLAogICAgICAgICAgICAic291cmNlIjogIiQoc2ZwcmVmaXgpdGVybWluYXRpb24tbG9nJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJydyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9ldGMvaG9zdG5hbWUiLAogICAgICAgICAgICAic291cmNlIjogIiQoc2ZwcmVmaXgpaG9zdG5hbWUkIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJ3IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2V0Yy9yZXNvbHYuY29uZiIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClyZXNvbHYuY29uZiQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicnciCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvdmFyL3J1bi9zZWNyZXRzL2t1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQiLAogICAgICAgICAgICAic291cmNlIjogIiQoc2ZwcmVmaXgpc2VydmljZWFjY291bnQkIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL3Zhci9ydW4vc2VjcmV0cy9henVyZS90b2tlbnMiLAogICAgICAgICAgICAic291cmNlIjogIiQoc2ZwcmVmaXgpdG9rZW5zJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJybyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9jc2kiLAogICAgICAgICAgICAic291cmNlIjogIiQoc2ZwcmVmaXgpY3NpJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJydyIKICAgICAgICAgICAgXQogICAgICAgICAgfQogICAgICAgIF0sCiAgICAgICAgIkFubm90YXRpb25zIjogewogICAgICAgICAgImlvLmthdGFjb250YWluZXJzLnBrZy5vY2kuYnVuZGxlX3BhdGgiOiAiL3J1bi9jb250YWluZXJkL2lvLmNvbnRhaW5lcmQucnVudGltZS52Mi50YXNrL2s4cy5pby8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgImlvLmthdGFjb250YWluZXJzLnBrZy5vY2kuY29udGFpbmVyX3R5cGUiOiAicG9kX2NvbnRhaW5lciIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLW5hbWUiOiAic29jYXQiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLmNvbnRhaW5lci10eXBlIjogImNvbnRhaW5lciIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuaW1hZ2UtbmFtZSI6ICJyZWdpc3RyeS5rOHMuaW8vc2lnLXN0b3JhZ2UvaG9zdHBhdGhwbHVnaW46djEuMTQuMCIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCI6ICJeW2EtejAtOV17NjR9JCIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1uYW1lc3BhY2UiOiAiIgogICAgICAgIH0sCiAgICAgICAgIkxpbnV4IjogewogICAgICAgICAgIk5hbWVzcGFjZXMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiVHlwZSI6ICJpcGMiLAogICAgICAgICAgICAgICJQYXRoIjogIiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJUeXBlIjogInV0cyIsCiAgICAgICAgICAgICAgIlBhdGgiOiAiIgogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgIlR5cGUiOiAibW91bnQiLAogICAgICAgICAgICAgICJQYXRoIjogIiIKICAgICAgICAgICAgfQogICAgICAgICAgXSwKICAgICAgICAgICJNYXNrZWRQYXRocyI6IFtdLAogICAgICAgICAgIlJlYWRvbmx5UGF0aHMiOiBbXSwKICAgICAgICAgICJEZXZpY2VzIjogW10sCiAgICAgICAgICAiU3lzY3RsIjogewogICAgICAgICAgICAibmV0LmlwdjQuaXBfdW5wcml2aWxlZ2VkX3BvcnRfc3RhcnQiOiAiMCIsCiAgICAgICAgICAgICJuZXQuaXB2NC5waW5nX2dyb3VwX3JhbmdlIjogIjAgMjE0NzQ4MzY0NyIKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0sCiAgICAgICJzdG9yYWdlcyI6IFsKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoMCkiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXIwKSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoMSkiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXIxKSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoMikiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXIyKSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogIm92ZXJsYXlmcyIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAiZnVzZTMua2F0YS1vdmVybGF5IiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiNDFkYzBlNzE2OTI1YWE2OGMyZjMwYWYyNzI5NTAxYzdhY2NkYjRlM2Y3Nzc0YTk3MDliODhlMzlhMjk2YTM2MzplM2Y0ZDkxNzRhNDM4Y2EzMTIwMjVmODgwODkyOTc3ZDVmYjljMzQ5MGM4ZjYxMTRlNzBmZjcxNDc3MDA1NmUyOmM0MWU3ZTM0ZDljMWQ0OTU5NDE3YjY1Y2I5YTE2YTdhNTAwNWQ4N2NjODdmOTY0OTkzMTcwNjQ1OGIyY2YwZjQiLAogICAgICAgICAgICAiMjA1ZjU5MmMxNGMwZTgyODU5MjNiMzg1MzQyZmU0ZmM0ZTgwYjY3YTZkNThjMjliZjdlNWRhMDA4ODhiMDZmOTpkOWFiMmEwNzhmZjM3OGNjYmU5YjZjMjQ4M2I2ZTk2YjFhMWM1Mjg5MmUyMzcyZDgxYzhiZTA1ZmY1MWJkZjNkOmJlYmY5ZDRmZjNlYTI0MTE4NzIxMzNkYmFjY2UwOTcyZTIzMzgxNWRmMTE5NTIxY2I3NGE0NDc0YmU4MGQ5ZjQiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQoY3BhdGgpLyQoYnVuZGxlLWlkKSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfQogICAgICBdLAogICAgICAiZGV2aWNlcyI6IFtdLAogICAgICAic2FuZGJveF9waWRucyI6IGZhbHNlLAogICAgICAiZXhlY19jb21tYW5kcyI6IFtdLAogICAgICAiZW52X21hcCI6IHsKICAgICAgICAiSE9TVE5BTUUiOiAiJChob3N0LW5hbWUpIiwKICAgICAgICAiUEFUSCI6ICIvdXNyL2xvY2FsL3NiaW46L3Vzci9sb2NhbC9iaW46L3Vzci9zYmluOi91c3IvYmluOi9zYmluOi9iaW4iCiAgICAgIH0KICAgIH0KICBdLAogICJjb21tb24iOiB7CiAgICAiY3BhdGgiOiAiL3J1bi9rYXRhLWNvbnRhaW5lcnMvc2hhcmVkL2NvbnRhaW5lcnMiLAogICAgIm1vdW50X3NvdXJjZV9jcGF0aCI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zaGFyZWQvY29udGFpbmVycyIsCiAgICAic2ZwcmVmaXgiOiAiXiQoY3BhdGgpLyQoYnVuZGxlLWlkKS1bYS16MC05XXsxNn0tIiwKICAgICJzcGF0aCI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L3N0b3JhZ2UiLAogICAgImlwdjRfYSI6ICIoKFswLTldfFsxLTldWzAtOV18MVswLTldezJ9fDJbMC00XVswLTldfDI1WzAtNV0pXFwuKXszfShbMC05XXxbMS05XVswLTldfDFbMC05XXsyfXwyWzAtNF1bMC05XXwyNVswLTVdKSIsCiAgICAiaXBfcCI6ICJbMC05XXsxLDV9IiwKICAgICJzdmNfbmFtZSI6ICJbQS1aX1xcLlxcLV0rIiwKICAgICJkbnNfbGFiZWwiOiAiW2EtekEtWjAtOV9cXC5cXC1dKyIsCiAgICAic19zb3VyY2UxIjogIl4uLjJbMC05XXszfV9bMC0xXVswLTldX1swLTNdWzAtOV1fWzAtMl1bMC05XV9bMC01XVswLTldX1swLTVdWzAtOV1cXC5bMC05XXsxLDEwfSQiLAogICAgInNfc291cmNlMiI6ICJeLi5kYXRhLyIsCiAgICAiZG5zX3N1YmRvbWFpbiI6ICJeW2EtejAtOV0oWy1hLXowLTldKlthLXowLTldKT8kIiwKICAgICJwb2RfdWlkIjogIl5bMC05YS1mQS1GXXs4fS1bMC05YS1mQS1GXXs0fS1bMC05YS1mQS1GXXs0fS1bMC05YS1mQS1GXXs0fS1bMC05YS1mQS1GXXsxMn0kIiwKICAgICJkZWZhdWx0X2NhcHMiOiBbCiAgICAgICJDQVBfQ0hPV04iLAogICAgICAiQ0FQX0RBQ19PVkVSUklERSIsCiAgICAgICJDQVBfRlNFVElEIiwKICAgICAgIkNBUF9GT1dORVIiLAogICAgICAiQ0FQX01LTk9EIiwKICAgICAgIkNBUF9ORVRfUkFXIiwKICAgICAgIkNBUF9TRVRHSUQiLAogICAgICAiQ0FQX1NFVFVJRCIsCiAgICAgICJDQVBfU0VURkNBUCIsCiAgICAgICJDQVBfU0VUUENBUCIsCiAgICAgICJDQVBfTkVUX0JJTkRfU0VSVklDRSIsCiAgICAgICJDQVBfU1lTX0NIUk9PVCIsCiAgICAgICJDQVBfS0lMTCIsCiAgICAgICJDQVBfQVVESVRfV1JJVEUiCiAgICBdLAogICAgInByaXZpbGVnZWRfY2FwcyI6IFsKICAgICAgIkNBUF9DSE9XTiIsCiAgICAgICJDQVBfREFDX09WRVJSSURFIiwKICAgICAgIkNBUF9EQUNfUkVBRF9TRUFSQ0giLAogICAgICAiQ0FQX0ZPV05FUiIsCiAgICAgICJDQVBfRlNFVElEIiwKICAgICAgIkNBUF9LSUxMIiwKICAgICAgIkNBUF9TRVRHSUQiLAogICAgICAiQ0FQX1NFVFVJRCIsCiAgICAgICJDQVBfU0VUUENBUCIsCiAgICAgICJDQVBfTElOVVhfSU1NVVRBQkxFIiwKICAgICAgIkNBUF9ORVRfQklORF9TRVJWSUNFIiwKICAgICAgIkNBUF9ORVRfQlJPQURDQVNUIiwKICAgICAgIkNBUF9ORVRfQURNSU4iLAogICAgICAiQ0FQX05FVF9SQVciLAogICAgICAiQ0FQX0lQQ19MT0NLIiwKICAgICAgIkNBUF9JUENfT1dORVIiLAogICAgICAiQ0FQX1NZU19NT0RVTEUiLAogICAgICAiQ0FQX1NZU19SQVdJTyIsCiAgICAgICJDQVBfU1lTX0NIUk9PVCIsCiAgICAgICJDQVBfU1lTX1BUUkFDRSIsCiAgICAgICJDQVBfU1lTX1BBQ0NUIiwKICAgICAgIkNBUF9TWVNfQURNSU4iLAogICAgICAiQ0FQX1NZU19CT09UIiwKICAgICAgIkNBUF9TWVNfTklDRSIsCiAgICAgICJDQVBfU1lTX1JFU09VUkNFIiwKICAgICAgIkNBUF9TWVNfVElNRSIsCiAgICAgICJDQVBfU1lTX1RUWV9DT05GSUciLAogICAgICAiQ0FQX01LTk9EIiwKICAgICAgIkNBUF9MRUFTRSIsCiAgICAgICJDQVBfQVVESVRfV1JJVEUiLAogICAgICAiQ0FQX0FVRElUX0NPTlRST0wiLAogICAgICAiQ0FQX1NFVEZDQVAiLAogICAgICAiQ0FQX01BQ19PVkVSUklERSIsCiAgICAgICJDQVBfTUFDX0FETUlOIiwKICAgICAgIkNBUF9TWVNMT0ciLAogICAgICAiQ0FQX1dBS0VfQUxBUk0iLAogICAgICAiQ0FQX0JMT0NLX1NVU1BFTkQiLAogICAgICAiQ0FQX0FVRElUX1JFQUQiLAogICAgICAiQ0FQX1BFUkZNT04iLAogICAgICAiQ0FQX0JQRiIsCiAgICAgICJDQVBfQ0hFQ0tQT0lOVF9SRVNUT1JFIgogICAgXSwKICAgICJ2aXJ0aW9fYmxrX3N0b3JhZ2VfY2xhc3NlcyI6IFsKICAgICAgImNjLWxvY2FsLWNzaSIsCiAgICAgICJjYy1tYW5hZ2VkLWNzaSIsCiAgICAgICJjYy1tYW5hZ2VkLXByZW1pdW0tY3NpIgogICAgXSwKICAgICJzbWJfc3RvcmFnZV9jbGFzc2VzIjogWwogICAgICB7CiAgICAgICAgIm5hbWUiOiAiYXp1cmVmaWxlLWNzaS1rYXRhLWNjIiwKICAgICAgICAibW91bnRfb3B0aW9ucyI6IFsKICAgICAgICAgICJkaXJfbW9kZT0wNzc3IiwKICAgICAgICAgICJmaWxlX21vZGU9MDc3NyIsCiAgICAgICAgICAibWZzeW1saW5rcyIsCiAgICAgICAgICAiY2FjaGU9c3RyaWN0IiwKICAgICAgICAgICJub3NoYXJlc29jayIsCiAgICAgICAgICAiYWN0aW1lbz0zMCIsCiAgICAgICAgICAibm9icmwiCiAgICAgICAgXQogICAgICB9CiAgICBdCiAgfSwKICAic2FuZGJveCI6IHsKICAgICJzdG9yYWdlcyI6IFsKICAgICAgewogICAgICAgICJkcml2ZXIiOiAiZXBoZW1lcmFsIiwKICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAic291cmNlIjogInNobSIsCiAgICAgICAgImZzdHlwZSI6ICJ0bXBmcyIsCiAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgIm5vZGV2IiwKICAgICAgICAgICJtb2RlPTE3NzciLAogICAgICAgICAgInNpemU9NjcxMDg4NjQiCiAgICAgICAgXSwKICAgICAgICAibW91bnRfcG9pbnQiOiAiL3J1bi9rYXRhLWNvbnRhaW5lcnMvc2FuZGJveC9zaG0iLAogICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgfQogICAgXQogIH0sCiAgInJlcXVlc3RfZGVmYXVsdHMiOiB7CiAgICAiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdCI6IHsKICAgICAgImFsbG93X2Vudl9yZWdleCI6IFsKICAgICAgICAiXkhPU1ROQU1FPSQoZG5zX2xhYmVsKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfUE9SVF8kKGlwX3ApX1RDUD10Y3A6Ly8kKGlwdjRfYSk6JChpcF9wKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfUE9SVF8kKGlwX3ApX1RDUF9QUk9UTz10Y3AkIiwKICAgICAgICAiXiQoc3ZjX25hbWUpX1BPUlRfJChpcF9wKV9UQ1BfUE9SVD0kKGlwX3ApJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9QT1JUXyQoaXBfcClfVENQX0FERFI9JChpcHY0X2EpJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9TRVJWSUNFX0hPU1Q9JChpcHY0X2EpJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9TRVJWSUNFX1BPUlQ9JChpcF9wKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfU0VSVklDRV9QT1JUXyQoZG5zX2xhYmVsKT0kKGlwX3ApJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9QT1JUPXRjcDovLyQoaXB2NF9hKTokKGlwX3ApJCIsCiAgICAgICAgIl5BWlVSRV9DTElFTlRfSUQ9W0EtRmEtZjAtOS1dKiQiLAogICAgICAgICJeQVpVUkVfVEVOQU5UX0lEPVtBLUZhLWYwLTktXSokIiwKICAgICAgICAiXkFaVVJFX0ZFREVSQVRFRF9UT0tFTl9GSUxFPS92YXIvcnVuL3NlY3JldHMvYXp1cmUvdG9rZW5zL2F6dXJlLWlkZW50aXR5LXRva2VuJCIsCiAgICAgICAgIl5BWlVSRV9BVVRIT1JJVFlfSE9TVD1odHRwczovL2xvZ2luXFwubWljcm9zb2Z0b25saW5lXFwuY29tLyQiLAogICAgICAgICJeVEVSTT14dGVybSQiCiAgICAgIF0sCiAgICAgICJhbGxvd19lbnZfcmVnZXhfbWFwIjogewogICAgICAgICJDUFVfTElNSVQiOiAiXlswLTldKyQiLAogICAgICAgICJKT0JfQ09NUExFVElPTl9JTkRFWCI6ICJeWzAtOV0qJCIsCiAgICAgICAgIk1FTU9SWV9MSU1JVCI6ICJeWzAtOV0rJCIKICAgICAgfQogICAgfSwKICAgICJDb3B5RmlsZVJlcXVlc3QiOiBbCiAgICAgICIkKHNmcHJlZml4KSIKICAgIF0sCiAgICAiRXhlY1Byb2Nlc3NSZXF1ZXN0IjogewogICAgICAiYWxsb3dlZF9jb21tYW5kcyI6IFtdLAogICAgICAicmVnZXgiOiBbXQogICAgfSwKICAgICJVcGRhdGVSb3V0ZXNSZXF1ZXN0IjogewogICAgICAiZm9yYmlkZGVuX2RldmljZV9uYW1lcyI6IFsKICAgICAgICAibG8iCiAgICAgIF0sCiAgICAgICJmb3JiaWRkZW5fc291cmNlX3JlZ2V4IjogWwogICAgICAgICJeKD86MHswLDR9Oil7MCw3fTB7MCwzfTEkIiwKICAgICAgICAiXjEyN1xcLig/OlswLTldezEsM31cXC4pezJ9WzAtOV17MSwzfSQiCiAgICAgIF0KICAgIH0sCiAgICAiVXBkYXRlSW50ZXJmYWNlUmVxdWVzdCI6IHsKICAgICAgImFsbG93X3Jhd19mbGFncyI6IDEyOCwKICAgICAgImZvcmJpZGRlbl9uYW1lcyI6IFsKICAgICAgICAibG8iCiAgICAgIF0sCiAgICAgICJmb3JiaWRkZW5faHdfYWRkcnMiOiBbCiAgICAgICAgIjAwOjAwOjAwOjAwOjAwOjAwIgogICAgICBdCiAgICB9LAogICAgIkNsb3NlU3RkaW5SZXF1ZXN0IjogZmFsc2UsCiAgICAiUmVhZFN0cmVhbVJlcXVlc3QiOiBmYWxzZSwKICAgICJVcGRhdGVFcGhlbWVyYWxNb3VudHNSZXF1ZXN0IjogZmFsc2UsCiAgICAiV3JpdGVTdHJlYW1SZXF1ZXN0IjogZmFsc2UKICB9Cn0= + spec: + runtimeClassName: kata-cc + affinity: + podAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchExpressions: + - key: app.kubernetes.io/instance + operator: In + values: + - hostpath.csi.k8s.io + topologyKey: kubernetes.io/hostname + containers: + - name: socat + image: "registry.k8s.io/sig-storage/hostpathplugin:v1.14.0" + command: + - socat + args: + - "tcp-listen:10000,fork,reuseaddr" + - "unix-connect:/csi/csi.sock" + securityContext: + privileged: true + volumeMounts: + - mountPath: /csi + name: socket-dir + volumes: + - hostPath: + path: /var/lib/kubelet/plugins/csi-hostpath + type: DirectoryOrCreate + name: socket-dir diff --git a/src/agent/samples/policy/yaml/kubernetes/conformance/etcd-statefulset.yaml b/src/agent/samples/policy/yaml/kubernetes/conformance/etcd-statefulset.yaml new file mode 100644 index 000000000000..4501a3ca92c1 --- /dev/null +++ b/src/agent/samples/policy/yaml/kubernetes/conformance/etcd-statefulset.yaml @@ -0,0 +1,63 @@ +--- +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: etcd + labels: + app: etcd +spec: + serviceName: etcd + replicas: 3 + selector: + matchLabels: + app: etcd + template: + metadata: + name: etcd + labels: + app: etcd + annotations: + io.katacontainers.config.agent.policy: IyBDb3B5cmlnaHQgKGMpIDIwMjMgTWljcm9zb2Z0IENvcnBvcmF0aW9uCiMKIyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMAojCnBhY2thZ2UgYWdlbnRfcG9saWN5CgppbXBvcnQgZnV0dXJlLmtleXdvcmRzLmluCmltcG9ydCBmdXR1cmUua2V5d29yZHMuZXZlcnkKCiMgRGVmYXVsdCB2YWx1ZXMsIHJldHVybmVkIGJ5IE9QQSB3aGVuIHJ1bGVzIGNhbm5vdCBiZSBldmFsdWF0ZWQgdG8gdHJ1ZS4KZGVmYXVsdCBBZGRBUlBOZWlnaGJvcnNSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgQWRkU3dhcFJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBDbG9zZVN0ZGluUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IENvcHlGaWxlUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IENyZWF0ZUNvbnRhaW5lclJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBDcmVhdGVTYW5kYm94UmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IERlc3Ryb3lTYW5kYm94UmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgRXhlY1Byb2Nlc3NSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgR2V0T09NRXZlbnRSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBHdWVzdERldGFpbHNSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBMaXN0SW50ZXJmYWNlc1JlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBMaXN0Um91dGVzUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IE1lbUhvdHBsdWdCeVByb2JlUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IE9ubGluZUNQVU1lbVJlcXVlc3QgOj0gdHJ1ZQpkZWZhdWx0IFBhdXNlQ29udGFpbmVyUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFJlYWRTdHJlYW1SZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgUmVtb3ZlQ29udGFpbmVyUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgUmVtb3ZlU3RhbGVWaXJ0aW9mc1NoYXJlTW91bnRzUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgUmVzZWVkUmFuZG9tRGV2UmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFJlc3VtZUNvbnRhaW5lclJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBTZXRHdWVzdERhdGVUaW1lUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFNldFBvbGljeVJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBTaWduYWxQcm9jZXNzUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgU3RhcnRDb250YWluZXJSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBTdGFydFRyYWNpbmdSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgU3RhdHNDb250YWluZXJSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBTdG9wVHJhY2luZ1JlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBUdHlXaW5SZXNpemVSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBVcGRhdGVDb250YWluZXJSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgVXBkYXRlRXBoZW1lcmFsTW91bnRzUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFVwZGF0ZUludGVyZmFjZVJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBVcGRhdGVSb3V0ZXNSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgV2FpdFByb2Nlc3NSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBXcml0ZVN0cmVhbVJlcXVlc3QgOj0gZmFsc2UKCiMgQWxsb3dSZXF1ZXN0c0ZhaWxpbmdQb2xpY3kgOj0gdHJ1ZSBjb25maWd1cmVzIHRoZSBBZ2VudCB0byAqYWxsb3cgYW55CiMgcmVxdWVzdHMgY2F1c2luZyBhIHBvbGljeSBmYWlsdXJlKi4gVGhpcyBpcyBhbiB1bnNlY3VyZSBjb25maWd1cmF0aW9uCiMgYnV0IGlzIHVzZWZ1bCBmb3IgYWxsb3dpbmcgdW5zZWN1cmUgcG9kcyB0byBzdGFydCwgdGhlbiBjb25uZWN0IHRvCiMgdGhlbSBhbmQgaW5zcGVjdCBPUEEgbG9ncyBmb3IgdGhlIHJvb3QgY2F1c2Ugb2YgYSBmYWlsdXJlLgpkZWZhdWx0IEFsbG93UmVxdWVzdHNGYWlsaW5nUG9saWN5IDo9IGZhbHNlCgojIENvbnN0YW50cwpTX05BTUVfS0VZID0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZSIKU19OQU1FU1BBQ0VfS0VZID0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZXNwYWNlIgpCVU5ETEVfSUQgPSAiW2EtejAtOV17NjR9IgoKQ3JlYXRlQ29udGFpbmVyUmVxdWVzdDo9IHJlc3AgewogICAgbm90IGlzX251bGwoaW5wdXQuZW52X21hcCkKICAgIAogICAgaV9lbnZfbWFwIDo9IGlucHV0LmVudl9tYXAKICAgIAogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBwX2Vudl9tYXAgOj0gcF9jb250YWluZXIuZW52X21hcCAgCiAgICBhbGxvd19lbnZfbWFwKHBfZW52X21hcCwgaV9lbnZfbWFwKQogICAgCiAgICBpX3Byb2Nlc3MgOj0gaW5wdXQuYmFzZS5PQ0kuUHJvY2VzcwogICAgCiAgICBwX3Byb2Nlc3MgOj0gcF9jb250YWluZXIuT0NJLlByb2Nlc3MKICAgIAogICAgYWxsb3dfYXJncyhpX3Byb2Nlc3MsIHBfcHJvY2VzcywgaV9lbnZfbWFwKQoKICAgIHJlc3AgPSBDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uKGlucHV0LmJhc2UpCiAgICBwcmludCgiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdDogdHJ1ZSIpCn0KCmFsbG93X2FyZ3MoaV9wcm9jZXNzLCBwX3Byb2Nlc3MsIGlfZW52X21hcCkgewogICAgaV9hcmdzIDo9IGlfcHJvY2Vzcy5BcmdzCiAgICBwX2FyZ3MgOj0gcF9wcm9jZXNzLkFyZ3MKICAgIHByaW50KCJhbGxvd19hcmdzOiBpX2FyZ3MgPSIsIGlfYXJncywgInBfYXJncyA9IiwgcF9hcmdzKQogICAgY291bnQoaV9hcmdzKSA9PSBjb3VudChwX2FyZ3MpCiAgICBldmVyeSBpLCBpX2FyZyBpbiBpX2FyZ3MgewogICAgICAgIHByaW50KCJhbGxvd19hcmdzOiBpX2FyZyA9IiwgaV9hcmcpCiAgICAgICAgcF9hcmdfcmVwbGFjZWQgOj0gcmVwbGFjZV9lbnZfdmFyaWFibGVzKHBfYXJnc1tpXSwgaV9lbnZfbWFwKQogICAgICAgIHByaW50KCJhbGxvd19hcmdzOiBwX2FyZ19yZXBsYWNlZCA9IiwgcF9hcmdfcmVwbGFjZWQpCiAgICAgICAgcF9hcmdfcmVwbGFjZWQyIDo9IHJlcGxhY2UocF9hcmdfcmVwbGFjZWQsICIkJCIsICIkIikKICAgICAgICBwcmludCgiYWxsb3dfYXJnczogcF9hcmdfcmVwbGFjZWQyID0iLCBwX2FyZ19yZXBsYWNlZDIpCiAgICAgICAgaV9hcmcgPT0gcF9hcmdfcmVwbGFjZWQyCiAgICB9CiAgICBwcmludCgiYWxsb3dfYXJnczogdHJ1ZSIpCn0KCmFsbG93X2FyZ3MoaV9wcm9jZXNzLCBwX3Byb2Nlc3MsIGlfZW52X21hcCkgewogICAgbm90IGlfcHJvY2Vzcy5BcmdzCiAgICBub3QgcF9wcm9jZXNzLkFyZ3MKICAgIHByaW50KCJhbGxvd19hcmdzMjogbm8gYXJncyIpCn0KCiMgdGhpcyBmdW5jdGlvbiByZXBsYWNlcyBhbGwgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyBpbiBhIHN0cmluZywgZ2l2ZW4gYSBtYXAgb2YgZW52aXJvbm1lbnQga2V5cyB0byBlbnZpcm9ubWVudCB2YWx1ZXMKIyBlZyBzdHIgPSAiZWNobyAkKENMVVNURVJfSUQpOyBlY2hvICQoTk9ERV9OQU1FKTsiCiMgZW52X21hcCA9IHsiQ0xVU1RFUl9JRCI6ICJhYmMiLCAiTk9ERV9OQU1FIiA6ICJ4eXoifQojIHJlc3VsdCA9ICJlY2hvIGFiYzsgZWNobyB4eXo7IgpyZXBsYWNlX2Vudl92YXJpYWJsZXMoc3RyLCBlbnZfbWFwKSA9IHJlc3VsdCB7CiAgICAjIG1ha2UgYW4gYXJyYXkgb2YgdGhlIGtleXMgZWcgWyJDTFVTVEVSX0lEIiwgIk5PREVfTkFNRSJdCiAgICBrZXlzIDo9IFt4IHwgc29tZSB4IGluIG9iamVjdC5rZXlzKGVudl9tYXApXQogICAgcmVzdWx0IDo9IHJlcGxhY2Vfc3RyX3JlYyhzdHIsIGVudl9tYXAsIGtleXMsIGNvdW50KGtleXMpIC0gMSkKfQoKIyBiYXNlIGNhc2UKcmVwbGFjZV9zdHJfcmVjKHN0ciwgZW52X21hcCwgYXJyX2tleXMsIGkpID0gcmVzdWx0IHsKICAgIGkgPCAwCiAgICByZXN1bHQgOj0gc3RyCn0KCiMgcmVjdXJzaXZlIHN0ZXAKcmVwbGFjZV9zdHJfcmVjKHN0ciwgZW52X21hcCwgYXJyX2tleXMsIGkpID0gcmVzdWx0IHsKICAgIGkgPj0gMAogICAga2V5IDo9IGFycl9rZXlzW2ldCiAgICBlbnZfa2V5MSA6PSBjb25jYXQoIiIsIFsiJCgiLCBrZXksICIpIl0pCiAgICAjIHJlcGxhY2UgJChWQVIpIHdpdGggdmFsdWUKICAgIG5ld19zdHIxIDo9IHJlcGxhY2Uoc3RyLCBlbnZfa2V5MSwgZW52X21hcFtrZXldKQogICAgIyByZXBsYWNlIG5leHQgZW52aXJvbm1lbnQgdmFyaWFibGUKICAgIHJlc3VsdCA9IHJlcGxhY2Vfc3RyX3JlYyhuZXdfc3RyMSwgZW52X21hcCwgYXJyX2tleXMsIGkgLSAxKQp9CgphbGxvd19lbnZfbWFwKHBfZW52X21hcCwgaV9lbnZfbWFwKSB7CiAgICBwcmludCgiYWxsb3dfZW52X21hcDogcF9lbnZfbWFwID0iLCBwX2Vudl9tYXApCiAgICBldmVyeSBlbnZfa2V5LCBlbnZfdmFsIGluIGlfZW52X21hcCB7CiAgICAgICAgcHJpbnQoImFsbG93X2VudjogZW52X2tleSA9IiwgZW52X2tleSwgImVudl92YWwgPSIsIGVudl92YWwpCiAgICAgICAgYWxsb3dfZW52X21hcF9lbnRyeShlbnZfa2V5LCBlbnZfdmFsLCBwX2Vudl9tYXApCiAgICB9CiAgICBwcmludCgiYWxsb3dfZW52X21hcDogdHJ1ZSIpCn0KCiMgQWxsb3cgZXhhY3QgbWF0Y2gKYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBpX3ZhbCA9PSBwX3ZhbAogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnk6IHRydWUiKQp9CgojIEFsbG93IHJlc291cmNlRmllbGRSZWYgdmFsdWVzIChlLmcuLCAibGltaXRzLmNwdSIpLgphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgICMgYSB2YXJpYWJsZSB3ZSBzaG91bGQgYmUgdmFsaWRhdGluZyB1c2luZyBhIHJlZ2V4IGZyb20gc2V0dGluZ3MKICAgIHBfdmFsID09ICIkKHZhbGlkYXRlLWZyb20tc2V0dGluZ3MpIgogICAgcmVnZXhfdmFsIDo9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuQ3JlYXRlQ29udGFpbmVyUmVxdWVzdC5hbGxvd19lbnZfcmVnZXhfbWFwW2tleV0KICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4X3ZhbCwgaV92YWwpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSAyOiB0cnVlIikKfQoKIyBBbGxvdyBub2RlLW5hbWUKYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChub2RlLW5hbWUpIgogICAgcmVnZXgubWF0Y2gocG9saWN5X2RhdGEuY29tbW9uLmRuc19zdWJkb21haW4gLCBpX3ZhbCkKICAgIHByaW50KCJhbGxvd19lbnZfbWFwX2VudHJ5IDM6IHRydWUiKQp9CgojIEFsbG93IGhvc3QtbmFtZQphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgIHBfdmFsID09ICIkKGhvc3QtbmFtZSkiCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24uZG5zX2xhYmVsICwgaV92YWwpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSA0OiB0cnVlIikKfQoKIyBBbGxvdyBwb2QtdWlkCmFsbG93X2Vudl9tYXBfZW50cnkoa2V5LCBpX3ZhbCwgcF9lbnZfbWFwKSB7CiAgICBwX3ZhbCA6PSBwX2Vudl9tYXBba2V5XQogICAgcF92YWwgPT0gIiQocG9kLXVpZCkiCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24ucG9kX3VpZCAsIGlfdmFsKQogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgNTogdHJ1ZSIpCn0KCiMgQWxsb3cgZmllbGRSZWYgImZpZWxkUGF0aDogc3RhdHVzLnBvZElQIiB2YWx1ZXMuCmFsbG93X2Vudl9tYXBfZW50cnkoa2V5LCBpX3ZhbCwgcF9lbnZfbWFwKSB7CiAgICBpc19pcChpX3ZhbCkKCiAgICBwX3ZhbCA6PSBwX2Vudl9tYXBba2V5XQogICAgcF92YXIgOj0gY29uY2F0KCI9IiwgW2tleSwgcF92YWxdKQogICAgYWxsb3dfcG9kX2lwX3ZhcihrZXksIHBfdmFyKQogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgNjogdHJ1ZSIpCn0KCiMgQWxsb3cgZmllbGRSZWYgImZpZWxkUGF0aDogc3RhdHVzLmhvc3RJUCIgdmFsdWVzLgphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgaXNfaXAoaV92YWwpCgogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgIHBfdmFyIDo9IGNvbmNhdCgiPSIsIFtrZXksIHBfdmFsXSkKICAgIGFsbG93X2hvc3RfaXBfdmFyKGtleSwgcF92YXIpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSA3OiB0cnVlIikKfQoKIyBNYXRjaCBpbnB1dCB3aXRoIG9uZSBvZiB0aGUgcG9saWN5IHZhcmlhYmxlcywgYWZ0ZXIgc3Vic3RpdHV0aW5nICQoc2FuZGJveC1uYW1lKS4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChzYW5kYm94LW5hbWUpIgogICAgc19uYW1lIDo9IGlucHV0LmJhc2UuT0NJLkFubm90YXRpb25zW1NfTkFNRV9LRVldCiAgICBwX3ZhcjIgOj0gcmVwbGFjZShwX3ZhbCwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHBfdmFyMiA9PSBpX3ZhbAogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgODogdHJ1ZSIpCn0KCiMgTWF0Y2ggaW5wdXQgd2l0aCBvbmUgb2YgdGhlIHBvbGljeSB2YXJpYWJsZXMsIGFmdGVyIHN1YnN0aXR1dGluZyAkKHNhbmRib3gtbmFtZXNwYWNlKS4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChzYW5kYm94LW5hbWVzcGFjZSkiCiAgICBzX25hbWVzcGFjZSA6PSBpbnB1dC5iYXNlLk9DSS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwX3ZhcjIgOj0gcmVwbGFjZShwX3ZhbCwgIiQoc2FuZGJveC1uYW1lc3BhY2UpIiwgc19uYW1lc3BhY2UpCiAgICBwX3ZhcjIgPT0gaV92YWwKICAgIHByaW50KCJhbGxvd19lbnZfbWFwX2VudHJ5IDk6IHRydWUiKQp9CgojIEFsbG93IGlucHV0IGVudiB2YXJpYWJsZXMgdGhhdCBtYXRjaCB3aXRoIGEgcmVxdWVzdF9kZWZhdWx0cyByZWdleC4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHNvbWUgcF9yZWdleDEgaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5DcmVhdGVDb250YWluZXJSZXF1ZXN0LmFsbG93X2Vudl9yZWdleAogICAgcF9yZWdleDIgOj0gcmVwbGFjZShwX3JlZ2V4MSwgIiQoaXB2NF9hKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcHY0X2EpCiAgICBwX3JlZ2V4MyA6PSByZXBsYWNlKHBfcmVnZXgyLCAiJChpcF9wKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcF9wKQogICAgcF9yZWdleDQgOj0gcmVwbGFjZShwX3JlZ2V4MywgIiQoc3ZjX25hbWUpIiwgcG9saWN5X2RhdGEuY29tbW9uLnN2Y19uYW1lKQogICAgcF9yZWdleDUgOj0gcmVwbGFjZShwX3JlZ2V4NCwgIiQoZG5zX2xhYmVsKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5kbnNfbGFiZWwpCgogICAgcmVzdWx0IDo9IGNvbmNhdCgiPSIsIFtrZXksIGlfdmFsXSkKICAgIHJlZ2V4Lm1hdGNoKHBfcmVnZXg1LCByZXN1bHQpCgogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgMTA6IHRydWUiKQp9CgpDcmVhdGVDb250YWluZXJSZXF1ZXN0Oj0gcmVzcCB7CiAgICBub3QgaW5wdXQuZW52X21hcAogICAgaV9wcm9jZXNzID0gaW5wdXQuT0NJLlByb2Nlc3MKICAgIHNfbmFtZSA9IGlucHV0Lk9DSS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBwX3Byb2Nlc3MgPSBwX2NvbnRhaW5lci5PQ0kuUHJvY2VzcwogICAgYWxsb3dfZGVwcmVjYXRlZF9hcmdzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUpCiAgICByZXNwID0gQ3JlYXRlQ29udGFpbmVyUmVxdWVzdENvbW1vbihpbnB1dCkKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0MjogdHJ1ZSIpCn0KCkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb24ocmVxKTo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgICMgQ2hlY2sgaWYgdGhlIGlucHV0IHJlcXVlc3Qgc2hvdWxkIGJlIHJlamVjdGVkIGV2ZW4gYmVmb3JlIGNoZWNraW5nIHRoZQogICAgIyBwb2xpY3lfZGF0YS5jb250YWluZXJzIGluZm9ybWF0aW9uLgogICAgYWxsb3dfY3JlYXRlX2NvbnRhaW5lcl9pbnB1dChyZXEpCgogICAgaV9vY2kgOj0gcmVxLk9DSQogICAgaV9zdG9yYWdlcyA6PSByZXEuc3RvcmFnZXMKICAgIGlfZGV2aWNlcyA6PSByZXEuZGV2aWNlcwoKICAgICMgYXJyYXkgb2YgcG9zc2libGUgc3RhdGUgb3BlcmF0aW9ucwogICAgb3BzX2J1aWxkZXIgOj0gW10KCiAgICAjIGNoZWNrIHNhbmRib3ggbmFtZQogICAgc2FuZGJveF9uYW1lID0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FX0tFWV0KICAgIGFkZF9zYW5kYm94X25hbWVfdG9fc3RhdGUgOj0gc3RhdGVfYWxsb3dzKCJzYW5kYm94X25hbWUiLCBzYW5kYm94X25hbWUpCiAgICBvcHNfYnVpbGRlcjEgOj0gY29uY2F0X29wX2lmX25vdF9udWxsKG9wc19idWlsZGVyLCBhZGRfc2FuZGJveF9uYW1lX3RvX3N0YXRlKQoKICAgICMgQ2hlY2sgaWYgYW55IGVsZW1lbnQgZnJvbSB0aGUgcG9saWN5X2RhdGEuY29udGFpbmVycyBhcnJheSBhbGxvd3MgdGhlIGlucHV0IHJlcXVlc3QuCiAgICBzb21lIHBfY29udGFpbmVyIGluIHBvbGljeV9kYXRhLmNvbnRhaW5lcnMKICAgIHByaW50KCI9PT09PT09PSBDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiB0cnlpbmcgbmV4dCBwb2xpY3kgY29udGFpbmVyIikKCiAgICBwX3BpZG5zIDo9IHBfY29udGFpbmVyLnNhbmRib3hfcGlkbnMKICAgIGlfcGlkbnMgOj0gcmVxLnNhbmRib3hfcGlkbnMKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiBwX3BpZG5zID0iLCBwX3BpZG5zLCAiaV9waWRucyA9IiwgaV9waWRucykKICAgIHBfcGlkbnMgPT0gaV9waWRucwoKICAgIHBfb2NpIDo9IHBfY29udGFpbmVyLk9DSQoKICAgICMgY2hlY2sgbmFtZXNwYWNlCiAgICBwX25hbWVzcGFjZSA6PSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBpX25hbWVzcGFjZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwcmludCAoIkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb246IHBfbmFtZXNwYWNlID0iLCBwX25hbWVzcGFjZSwgImlfbmFtZXNwYWNlID0iLCBpX25hbWVzcGFjZSkKICAgIGFkZF9uYW1lc3BhY2VfdG9fc3RhdGUgOj0gYWxsb3dfbmFtZXNwYWNlKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkKICAgIG9wc19idWlsZGVyMiA6PSBjb25jYXRfb3BfaWZfbm90X251bGwob3BzX2J1aWxkZXIxLCBhZGRfbmFtZXNwYWNlX3RvX3N0YXRlKQoKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiBwIFZlcnNpb24gPSIsIHBfb2NpLlZlcnNpb24sICJpIFZlcnNpb24gPSIsIGlfb2NpLlZlcnNpb24pCiAgICBwX29jaS5WZXJzaW9uID09IGlfb2NpLlZlcnNpb24KCiAgICBwcmludCgiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdENvbW1vbjogcCBSZWFkb25seSA9IiwgcF9vY2kuUm9vdC5SZWFkb25seSwgImkgUmVhZG9ubHkgPSIsIGlfb2NpLlJvb3QuUmVhZG9ubHkpCiAgICBwX29jaS5Sb290LlJlYWRvbmx5ID09IGlfb2NpLlJvb3QuUmVhZG9ubHkKCiAgICBhbGxvd19hbm5vKHBfb2NpLCBpX29jaSkKCiAgICBwX3N0b3JhZ2VzIDo9IHBfY29udGFpbmVyLnN0b3JhZ2VzCiAgICBhbGxvd19ieV9hbm5vKHBfb2NpLCBpX29jaSwgcF9zdG9yYWdlcywgaV9zdG9yYWdlcykKCiAgICBwX2RldmljZXMgOj0gcF9jb250YWluZXIuZGV2aWNlcwogICAgYWxsb3dfZGV2aWNlcyhwX2RldmljZXMsIGlfZGV2aWNlcykKCiAgICByZXQgOj0gYWxsb3dfbGludXgob3BzX2J1aWxkZXIyLCBwX29jaSwgaV9vY2kpCiAgICByZXQuYWxsb3dlZAoKICAgIG9wcyA6PSByZXQub3BzCgogICAgcHJpbnQoIkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb246IHRydWUiKQp9CgphbGxvd19jcmVhdGVfY29udGFpbmVyX2lucHV0KHJlcSkgewogICAgcHJpbnQoImFsbG93X2NyZWF0ZV9jb250YWluZXJfaW5wdXQ6IGlucHV0ID0iLCByZXEpCgogICAgY291bnQocmVxLnNoYXJlZF9tb3VudHMpID09IDAKICAgIGlzX251bGwocmVxLnN0cmluZ191c2VyKQoKICAgIGlfb2NpIDo9IHJlcS5PQ0kKICAgIGlzX251bGwoaV9vY2kuSG9va3MpCiAgICBpc19udWxsKGlfb2NpLlNvbGFyaXMpCiAgICBpc19udWxsKGlfb2NpLldpbmRvd3MpCgogICAgaV9saW51eCA6PSBpX29jaS5MaW51eAogICAgY291bnQoaV9saW51eC5HSURNYXBwaW5ncykgPT0gMAogICAgY291bnQoaV9saW51eC5Nb3VudExhYmVsKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlJlc291cmNlcy5EZXZpY2VzKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlJvb3Rmc1Byb3BhZ2F0aW9uKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlVJRE1hcHBpbmdzKSA9PSAwCiAgICBpc19udWxsKGlfbGludXguSW50ZWxSZHQpCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLkJsb2NrSU8pCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLk5ldHdvcmspCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLlBpZHMpCiAgICBpc19udWxsKGlfbGludXguU2VjY29tcCkKCiAgICBpX3Byb2Nlc3MgOj0gaV9vY2kuUHJvY2VzcwogICAgY291bnQoaV9wcm9jZXNzLlNlbGludXhMYWJlbCkgPT0gMAogICAgY291bnQoaV9wcm9jZXNzLlVzZXIuVXNlcm5hbWUpID09IDAKCiAgICBwcmludCgiYWxsb3dfY3JlYXRlX2NvbnRhaW5lcl9pbnB1dDogdHJ1ZSIpCn0KCmFsbG93X25hbWVzcGFjZShwX25hbWVzcGFjZSwgaV9uYW1lc3BhY2UpID0gYWRkX25hbWVzcGFjZSB7CiAgICBwX25hbWVzcGFjZSA9PSBpX25hbWVzcGFjZQogICAgYWRkX25hbWVzcGFjZSA6PSBudWxsCiAgICBwcmludCgiYWxsb3dfbmFtZXNwYWNlIDE6IGlucHV0IG5hbWVzcGFjZSBtYXRjaGVzIHBvbGljeSBkYXRhIikKfQoKYWxsb3dfbmFtZXNwYWNlKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkgPSBhZGRfbmFtZXNwYWNlIHsKICAgIHBfbmFtZXNwYWNlID09ICIiCiAgICBwcmludCgiYWxsb3dfbmFtZXNwYWNlIDI6IG5vIG5hbWVzcGFjZSBmb3VuZCBvbiBwb2xpY3kgZGF0YSIpCiAgICBhZGRfbmFtZXNwYWNlIDo9IHN0YXRlX2FsbG93cygibmFtZXNwYWNlIiwgaV9uYW1lc3BhY2UpCn0KCiMgdmFsdWUgaGFzbid0IGJlZW4gc2VlbiBiZWZvcmUsIHNhdmUgaXQgdG8gc3RhdGUKc3RhdGVfYWxsb3dzKGtleSwgdmFsdWUpID0gYWN0aW9uIHsKICBzdGF0ZSA6PSBnZXRfc3RhdGUoKQogIHByaW50KCJzdGF0ZV9hbGxvd3MgMTogc3RhdGVba2V5XSA9Iiwgc3RhdGVba2V5XSwgInZhbHVlID0iLCB2YWx1ZSkKICBub3Qgc3RhdGVba2V5XQogIHByaW50KCJzdGF0ZV9hbGxvd3MgMTogc2F2aW5nIHRvIHN0YXRlIGtleSA9Iiwga2V5LCAidmFsdWUgPSIsIHZhbHVlKQogIHBhdGggOj0gZ2V0X3N0YXRlX3BhdGgoa2V5KSAKICBhY3Rpb24gOj0gewogICAgIm9wIjogImFkZCIsCiAgICAicGF0aCI6IHBhdGgsIAogICAgInZhbHVlIjogdmFsdWUsCiAgfQp9CgojIHZhbHVlIG1hdGNoZXMgd2hhdCdzIGluIHN0YXRlLCBhbGxvdyBpdApzdGF0ZV9hbGxvd3Moa2V5LCB2YWx1ZSkgPSBhY3Rpb24gewogIHByaW50KCJzdGF0ZV9hbGxvd3MgMjogc3RhcnQiKQogIHN0YXRlIDo9IGdldF9zdGF0ZSgpCiAgcHJpbnQoInN0YXRlX2FsbG93cyAyOiBzdGF0ZVtrZXldID0iLCBzdGF0ZVtrZXldLCAidmFsdWUgPSIsIHZhbHVlKQogIHZhbHVlID09IHN0YXRlW2tleV0KICBwcmludCgic3RhdGVfYWxsb3dzIDI6IGZvdW5kIGtleSA9Iiwga2V5LCAidmFsdWUgPSIsIHZhbHVlLCAiIGluIHN0YXRlIikKICBhY3Rpb24gOj0gbnVsbAp9CgojIGhlbHBlciBmdW5jdGlvbnMgdG8gaW50ZXJhY3Qgd2l0aCB0aGUgc3RhdGUKZ2V0X3N0YXRlKCkgPSBzdGF0ZSB7CiAgc3RhdGUgOj0gZGF0YVsicHN0YXRlIl0KfQoKZ2V0X3N0YXRlX3ZhbChrZXkpID0gdmFsdWUgewogICAgc3RhdGUgOj0gZ2V0X3N0YXRlKCkKICAgIHZhbHVlIDo9IHN0YXRlW2tleV0KfQoKZ2V0X3N0YXRlX3BhdGgoa2V5KSA9IHBhdGggewogICAgIyBwcmVwZW5kICIvcHN0YXRlLyIgdG8ga2V5CiAgICBwYXRoIDo9IGNvbmNhdCgiLyIsIFsiL3BzdGF0ZSIsIGtleV0pCn0KCiMgSGVscGVyIGZ1bmN0aW9ucyB0byBjb25kaXRpb25hbGx5IGNvbmNhdGVuYXRlIG9wIGlzIG5vdCBudWxsCmNvbmNhdF9vcF9pZl9ub3RfbnVsbChvcHMsIG9wKSA9IHJlc3VsdCB7CiAgICBvcCA9PSBudWxsCiAgICByZXN1bHQgOj0gb3BzCn0KCmNvbmNhdF9vcF9pZl9ub3RfbnVsbChvcHMsIG9wKSA9IHJlc3VsdCB7CiAgICBvcCAhPSBudWxsCiAgICByZXN1bHQgOj0gYXJyYXkuY29uY2F0KG9wcywgW29wXSkKfQoKIyBSZWplY3QgdW5leHBlY3RlZCBhbm5vdGF0aW9ucy4KYWxsb3dfYW5ubyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19hbm5vIDE6IHN0YXJ0IikKCiAgICBub3QgaV9vY2kuQW5ub3RhdGlvbnMKCiAgICBwcmludCgiYWxsb3dfYW5ubyAxOiB0cnVlIikKfQphbGxvd19hbm5vKHBfb2NpLCBpX29jaSkgewogICAgcHJpbnQoImFsbG93X2Fubm8gMjogcCBBbm5vdGF0aW9ucyA9IiwgcF9vY2kuQW5ub3RhdGlvbnMpCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiBpIEFubm90YXRpb25zID0iLCBpX29jaS5Bbm5vdGF0aW9ucykKCiAgICBpX2tleXMgOj0gb2JqZWN0LmtleXMoaV9vY2kuQW5ub3RhdGlvbnMpCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiBpIGtleXMgPSIsIGlfa2V5cykKCiAgICBldmVyeSBpX2tleSBpbiBpX2tleXMgewogICAgICAgIGFsbG93X2Fubm9fa2V5KGlfa2V5LCBwX29jaSkKICAgIH0KCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiB0cnVlIikKfQoKYWxsb3dfYW5ub19rZXkoaV9rZXksIHBfb2NpKSB7CiAgICBwcmludCgiYWxsb3dfYW5ub19rZXkgMTogaSBrZXkgPSIsIGlfa2V5KQoKICAgIHN0YXJ0c3dpdGgoaV9rZXksICJpby5rdWJlcm5ldGVzLmNyaS4iKQoKICAgIHByaW50KCJhbGxvd19hbm5vX2tleSAxOiB0cnVlIikKfQphbGxvd19hbm5vX2tleShpX2tleSwgcF9vY2kpIHsKICAgIHByaW50KCJhbGxvd19hbm5vX2tleSAyOiBpIGtleSA9IiwgaV9rZXkpCgogICAgc29tZSBwX2tleSwgXyBpbiBwX29jaS5Bbm5vdGF0aW9ucwogICAgcF9rZXkgPT0gaV9rZXkKCiAgICBwcmludCgiYWxsb3dfYW5ub19rZXkgMjogdHJ1ZSIpCn0KCiMgR2V0IHRoZSB2YWx1ZSBvZiB0aGUgU19OQU1FX0tFWSBhbm5vdGF0aW9uIGFuZAojIGNvcnJlbGF0ZSBpdCB3aXRoIG90aGVyIGFubm90YXRpb25zIGFuZCBwcm9jZXNzIGZpZWxkcy4KYWxsb3dfYnlfYW5ubyhwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpIHsKICAgIHByaW50KCJhbGxvd19ieV9hbm5vIDE6IHN0YXJ0IikKCiAgICBub3QgcF9vY2kuQW5ub3RhdGlvbnNbU19OQU1FX0tFWV0KCiAgICBpX3NfbmFtZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMTogaV9zX25hbWUgPSIsIGlfc19uYW1lKQoKICAgIGlfc19uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FU1BBQ0VfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMTogaV9zX25hbWVzcGFjZSA9IiwgaV9zX25hbWVzcGFjZSkKCiAgICBhbGxvd19ieV9zYW5kYm94X25hbWUocF9vY2ksIGlfb2NpLCBwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBpX3NfbmFtZSwgaV9zX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfYnlfYW5ubyAxOiB0cnVlIikKfQphbGxvd19ieV9hbm5vKHBfb2NpLCBpX29jaSwgcF9zdG9yYWdlcywgaV9zdG9yYWdlcykgewogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMjogc3RhcnQiKQoKICAgIHBfc19uYW1lIDo9IHBfb2NpLkFubm90YXRpb25zW1NfTkFNRV9LRVldCiAgICBpX3NfbmFtZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMjogaV9zX25hbWUgPSIsIGlfc19uYW1lLCAicF9zX25hbWUgPSIsIHBfc19uYW1lKQoKICAgIGFsbG93X3NhbmRib3hfbmFtZShwX3NfbmFtZSwgaV9zX25hbWUpCgogICAgaV9zX25hbWVzcGFjZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwcmludCgiYWxsb3dfYnlfYW5ubyAyOiBpX3NfbmFtZXNwYWNlID0iLCBpX3NfbmFtZXNwYWNlKQoKICAgIGFsbG93X2J5X3NhbmRib3hfbmFtZShwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMsIGlfc19uYW1lLCBpX3NfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd19ieV9hbm5vIDI6IHRydWUiKQp9CgphbGxvd19ieV9zYW5kYm94X25hbWUocF9vY2ksIGlfb2NpLCBwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfYnlfc2FuZGJveF9uYW1lOiBzdGFydCIpCgogICAgaV9uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FU1BBQ0VfS0VZXQoKICAgIGFsbG93X2J5X2NvbnRhaW5lcl90eXBlcyhwX29jaSwgaV9vY2ksIHNfbmFtZSwgaV9uYW1lc3BhY2UpCiAgICBhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZChwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpCiAgICBhbGxvd19wcm9jZXNzKHBfb2NpLlByb2Nlc3MsIGlfb2NpLlByb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpCgogICAgcHJpbnQoImFsbG93X2J5X3NhbmRib3hfbmFtZTogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfbmFtZShwX3NfbmFtZSwgaV9zX25hbWUpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X25hbWU6IHN0YXJ0IikKICAgIHJlZ2V4Lm1hdGNoKHBfc19uYW1lLCBpX3NfbmFtZSkKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9uYW1lOiB0cnVlIikKfQoKIyBDaGVjayB0aGF0IHRoZSAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLXR5cGUiIGFuZAojICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIiBhbm5vdGF0aW9ucyBkZXNpZ25hdGUgdGhlCiMgZXhwZWN0ZWQgdHlwZSAtIGVpdGhlciBhICJzYW5kYm94IiBvciBhICJjb250YWluZXIiLiBUaGVuLCB2YWxpZGF0ZQojIG90aGVyIGFubm90YXRpb25zIGJhc2VkIG9uIHRoZSBhY3R1YWwgInNhbmRib3giIG9yICJjb250YWluZXIiIHZhbHVlCiMgZnJvbSB0aGUgaW5wdXQgY29udGFpbmVyLgphbGxvd19ieV9jb250YWluZXJfdHlwZXMocF9vY2ksIGlfb2NpLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfYnlfY29udGFpbmVyX3R5cGVzOiBjaGVja2luZyBpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSIpCgogICAgY190eXBlIDo9ICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSIKICAgIAogICAgcF9jcmlfdHlwZSA6PSBwX29jaS5Bbm5vdGF0aW9uc1tjX3R5cGVdCiAgICBpX2NyaV90eXBlIDo9IGlfb2NpLkFubm90YXRpb25zW2NfdHlwZV0KICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZXM6IHBfY3JpX3R5cGUgPSIsIHBfY3JpX3R5cGUsICJpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgcF9jcmlfdHlwZSA9PSBpX2NyaV90eXBlCgogICAgYWxsb3dfYnlfY29udGFpbmVyX3R5cGUoaV9jcmlfdHlwZSwgcF9vY2ksIGlfb2NpLCBzX25hbWUsIHNfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZXM6IHRydWUiKQp9CgphbGxvd19ieV9jb250YWluZXJfdHlwZShpX2NyaV90eXBlLCBwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAxOiBpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgaV9jcmlfdHlwZSA9PSAic2FuZGJveCIKCiAgICBpX2thdGFfdHlwZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1siaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5jb250YWluZXJfdHlwZSJdCiAgICBwcmludCgiYWxsb3dfYnlfY29udGFpbmVyX3R5cGUgMTogaV9rYXRhX3R5cGUgPSIsIGlfa2F0YV90eXBlKQogICAgaV9rYXRhX3R5cGUgPT0gInBvZF9zYW5kYm94IgoKICAgIGFsbG93X3NhbmRib3hfY29udGFpbmVyX25hbWUocF9vY2ksIGlfb2NpKQogICAgYWxsb3dfc2FuZGJveF9uZXRfbmFtZXNwYWNlKHBfb2NpLCBpX29jaSkKICAgIGFsbG93X3NhbmRib3hfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpCgogICAgcHJpbnQoImFsbG93X2J5X2NvbnRhaW5lcl90eXBlIDE6IHRydWUiKQp9CgphbGxvd19ieV9jb250YWluZXJfdHlwZShpX2NyaV90eXBlLCBwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiBpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgaV9jcmlfdHlwZSA9PSAiY29udGFpbmVyIgoKICAgIGlfa2F0YV90eXBlIDo9IGlfb2NpLkFubm90YXRpb25zWyJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIl0KICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiBpX2thdGFfdHlwZSA9IiwgaV9rYXRhX3R5cGUpCiAgICBpX2thdGFfdHlwZSA9PSAicG9kX2NvbnRhaW5lciIKCiAgICBhbGxvd19jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpCiAgICBhbGxvd19uZXRfbmFtZXNwYWNlKHBfb2NpLCBpX29jaSkKICAgIGFsbG93X2xvZ19kaXJlY3RvcnkocF9vY2ksIGlfb2NpKQoKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiB0cnVlIikKfQoKIyAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLW5hbWUiIGFubm90YXRpb24KYWxsb3dfc2FuZGJveF9jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X2NvbnRhaW5lcl9uYW1lOiBzdGFydCIpCgogICAgY29udGFpbmVyX2Fubm90YXRpb25fbWlzc2luZyhwX29jaSwgaV9vY2ksICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItbmFtZSIpCgogICAgcHJpbnQoImFsbG93X3NhbmRib3hfY29udGFpbmVyX25hbWU6IHRydWUiKQp9CgphbGxvd19jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19jb250YWluZXJfbmFtZTogc3RhcnQiKQoKICAgIGFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uKHBfb2NpLCBpX29jaSwgImlvLmt1YmVybmV0ZXMuY3JpLmNvbnRhaW5lci1uYW1lIikKCiAgICBwcmludCgiYWxsb3dfY29udGFpbmVyX25hbWU6IHRydWUiKQp9Cgpjb250YWluZXJfYW5ub3RhdGlvbl9taXNzaW5nKHBfb2NpLCBpX29jaSwga2V5KSB7CiAgICBwcmludCgiY29udGFpbmVyX2Fubm90YXRpb25fbWlzc2luZzoiLCBrZXkpCgogICAgbm90IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIG5vdCBpX29jaS5Bbm5vdGF0aW9uc1trZXldCgogICAgcHJpbnQoImNvbnRhaW5lcl9hbm5vdGF0aW9uX21pc3Npbmc6IHRydWUiKQp9CgphbGxvd19jb250YWluZXJfYW5ub3RhdGlvbihwX29jaSwgaV9vY2ksIGtleSkgewogICAgcHJpbnQoImFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uOiBrZXkgPSIsIGtleSkKCiAgICBwX3ZhbHVlIDo9IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIGlfdmFsdWUgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgcHJpbnQoImFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uOiBwX3ZhbHVlID0iLCBwX3ZhbHVlLCAiaV92YWx1ZSA9IiwgaV92YWx1ZSkKCiAgICBwX3ZhbHVlID09IGlfdmFsdWUKCiAgICBwcmludCgiYWxsb3dfY29udGFpbmVyX2Fubm90YXRpb246IHRydWUiKQp9CgojICJuZXJkY3RsL25ldHdvcmstbmFtZXNwYWNlIiBhbm5vdGF0aW9uCmFsbG93X3NhbmRib3hfbmV0X25hbWVzcGFjZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X25ldF9uYW1lc3BhY2U6IHN0YXJ0IikKCiAgICBrZXkgOj0gIm5lcmRjdGwvbmV0d29yay1uYW1lc3BhY2UiCgogICAgcF9uYW1lc3BhY2UgOj0gcF9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgaV9uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgcHJpbnQoImFsbG93X3NhbmRib3hfbmV0X25hbWVzcGFjZTogcF9uYW1lc3BhY2UgPSIsIHBfbmFtZXNwYWNlLCAiaV9uYW1lc3BhY2UgPSIsIGlfbmFtZXNwYWNlKQoKICAgIHJlZ2V4Lm1hdGNoKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9uZXRfbmFtZXNwYWNlOiB0cnVlIikKfQoKYWxsb3dfbmV0X25hbWVzcGFjZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19uZXRfbmFtZXNwYWNlOiBzdGFydCIpCgogICAga2V5IDo9ICJuZXJkY3RsL25ldHdvcmstbmFtZXNwYWNlIgoKICAgIG5vdCBwX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICBub3QgaV9vY2kuQW5ub3RhdGlvbnNba2V5XQoKICAgIHByaW50KCJhbGxvd19uZXRfbmFtZXNwYWNlOiB0cnVlIikKfQoKIyAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1sb2ctZGlyZWN0b3J5IiBhbm5vdGF0aW9uCmFsbG93X3NhbmRib3hfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X2xvZ19kaXJlY3Rvcnk6IHN0YXJ0IikKCiAgICBrZXkgOj0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbG9nLWRpcmVjdG9yeSIKCiAgICBwX2RpciA6PSBwX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICByZWdleDEgOj0gcmVwbGFjZShwX2RpciwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHJlZ2V4MiA6PSByZXBsYWNlKHJlZ2V4MSwgIiQoc2FuZGJveC1uYW1lc3BhY2UpIiwgc19uYW1lc3BhY2UpCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiByZWdleDIgPSIsIHJlZ2V4MikKCiAgICBpX2RpciA6PSBpX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiBpX2RpciA9IiwgaV9kaXIpCgogICAgcmVnZXgubWF0Y2gocmVnZXgyLCBpX2RpcikKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiB0cnVlIikKfQoKYWxsb3dfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19sb2dfZGlyZWN0b3J5OiBzdGFydCIpCgogICAga2V5IDo9ICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWxvZy1kaXJlY3RvcnkiCgogICAgbm90IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIG5vdCBpX29jaS5Bbm5vdGF0aW9uc1trZXldCgogICAgcHJpbnQoImFsbG93X2xvZ19kaXJlY3Rvcnk6IHRydWUiKQp9CgphbGxvd19kZXZpY2VzKHBfZGV2aWNlcywgaV9kZXZpY2VzKSB7CiAgICBwcmludCgiYWxsb3dfZGV2aWNlczogc3RhcnQiKQogICAgZXZlcnkgaV9kZXZpY2UgaW4gaV9kZXZpY2VzIHsKICAgICAgICBwcmludCgiYWxsb3dfZGV2aWNlczogaV9kZXZpY2UgPSIsIGlfZGV2aWNlKQogICAgICAgIHNvbWUgcF9kZXZpY2UgaW4gcF9kZXZpY2VzCiAgICAgICAgcF9kZXZpY2UuY29udGFpbmVyX3BhdGggPT0gaV9kZXZpY2UuY29udGFpbmVyX3BhdGgKICAgIH0KICAgIHByaW50KCJhbGxvd19kZXZpY2VzOiB0cnVlIikKfQoKYWxsb3dfbGludXgoc3RhdGVfb3BzLCBwX29jaSwgaV9vY2kpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIHBfbmFtZXNwYWNlcyA6PSBwX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbGludXg6IHAgbmFtZXNwYWNlcyA9IiwgcF9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlcyA6PSBpX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbGludXg6IGkgbmFtZXNwYWNlcyA9IiwgaV9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlX3dpdGhvdXRfbmV0d29yayA6PSBbb2JqIHwgb2JqIDo9IGlfbmFtZXNwYWNlc1tfXTsgb2JqLlR5cGUgIT0gIm5ldHdvcmsiXQoKICAgIHByaW50KCJhbGxvd19saW51eDogaV9uYW1lc3BhY2Vfd2l0aG91dF9uZXR3b3JrID0iLCBpX25hbWVzcGFjZV93aXRob3V0X25ldHdvcmspCgogICAgcF9uYW1lc3BhY2VzID09IGlfbmFtZXNwYWNlX3dpdGhvdXRfbmV0d29yawoKICAgIGFsbG93X21hc2tlZF9wYXRocyhwX29jaSwgaV9vY2kpCiAgICBhbGxvd19yZWFkb25seV9wYXRocyhwX29jaSwgaV9vY2kpCiAgICBhbGxvd19saW51eF9kZXZpY2VzKHBfb2NpLkxpbnV4LkRldmljZXMsIGlfb2NpLkxpbnV4LkRldmljZXMpCiAgICBhbGxvd19saW51eF9zeXNjdGwocF9vY2kuTGludXgsIGlfb2NpLkxpbnV4KQogICAgcmV0IDo9IGFsbG93X25ldHdvcmtfbmFtZXNwYWNlX3N0YXJ0KHN0YXRlX29wcywgcF9vY2ksIGlfb2NpKQogICAgcmV0LmFsbG93ZWQKCiAgICBvcHMgOj0gcmV0Lm9wcwoKICAgIHByaW50KCJhbGxvd19saW51eDogdHJ1ZSIpCn0KCiMgUmV0cmlldmUgdGhlICJuZXR3b3JrIiBuYW1lc3BhY2UgZnJvbSB0aGUgaW5wdXQgZGF0YSBhbmQgcGFzcyBpdCBvbiBmb3IgdGhlCiMgbmV0d29yayBuYW1lc3BhY2UgcG9saWN5IGNoZWNrcy4KYWxsb3dfbmV0d29ya19uYW1lc3BhY2Vfc3RhcnQoc3RhdGVfb3BzLCBwX29jaSwgaV9vY2kpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIHByaW50KCJhbGxvd19uZXR3b3JrX25hbWVzcGFjZSBzdGFydDogc3RhcnQiKQoKICAgIHBfbmFtZXNwYWNlcyA6PSBwX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IHAgbmFtZXNwYWNlcyA9IiwgcF9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlcyA6PSBpX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IGkgbmFtZXNwYWNlcyA9IiwgaV9uYW1lc3BhY2VzKQoKICAgICMgUmV0dXJuIHBhdGggb2YgdGhlICJuZXR3b3JrIiBuYW1lc3BhY2UKICAgIG5ldHdvcmtfbnMgOj0gW29iaiB8IG9iaiA6PSBpX25hbWVzcGFjZXNbX107IG9iai5UeXBlID09ICJuZXR3b3JrIl0KCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IG5ldHdvcmtfbnMgPSIsIG5ldHdvcmtfbnMpCgogICAgcmV0IDo9IGFsbG93X25ldHdvcmtfbmFtZXNwYWNlKHN0YXRlX29wcywgbmV0d29ya19ucykKICAgIHJldC5hbGxvd2VkCgogICAgb3BzIDo9IHJldC5vcHMKfQoKIyBUaGlzIHJ1bGUgaXMgd2hlbiB0aGVyZSdzIG5vIG5ldHdvcmsgbmFtZXNwYWNlIGluIHRoZSBpbnB1dCBkYXRhLgphbGxvd19uZXR3b3JrX25hbWVzcGFjZShzdGF0ZV9vcHMsIG5ldHdvcmtfbnMpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIGNvdW50KG5ldHdvcmtfbnMpID09IDAKCiAgICBuZXR3b3JrX25zX3BhdGggPSAiIgoKICAgIGFkZF9uZXR3b3JrX25hbWVzcGFjZV90b19zdGF0ZSA6PSBzdGF0ZV9hbGxvd3MoIm5ldHdvcmtfbmFtZXNwYWNlIiwgbmV0d29ya19uc19wYXRoKQogICAgb3BzIDo9IGNvbmNhdF9vcF9pZl9ub3RfbnVsbChzdGF0ZV9vcHMsIGFkZF9uZXR3b3JrX25hbWVzcGFjZV90b19zdGF0ZSkKCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2UgMTogdHJ1ZSIpCn0KCiMgVGhpcyBydWxlIGlzIHdoZW4gdGhlcmUncyBleGFjdGx5IG9uZSBuZXR3b3JrIG5hbWVzcGFjZSBpbiB0aGUgaW5wdXQgZGF0YS4KYWxsb3dfbmV0d29ya19uYW1lc3BhY2Uoc3RhdGVfb3BzLCBuZXR3b3JrX25zKSA6PSB7Im9wcyI6IG9wcywgImFsbG93ZWQiOiB0cnVlfSB7CiAgICBjb3VudChuZXR3b3JrX25zKSA9PSAxCgogICAgYWRkX25ldHdvcmtfbmFtZXNwYWNlX3RvX3N0YXRlIDo9IHN0YXRlX2FsbG93cygibmV0d29ya19uYW1lc3BhY2UiLCBuZXR3b3JrX25zWzBdLlBhdGgpCiAgICBvcHMgOj0gY29uY2F0X29wX2lmX25vdF9udWxsKHN0YXRlX29wcywgYWRkX25ldHdvcmtfbmFtZXNwYWNlX3RvX3N0YXRlKQoKICAgIHByaW50KCJhbGxvd19uZXR3b3JrX25hbWVzcGFjZSAyOiB0cnVlIikKfQoKYWxsb3dfbWFza2VkX3BhdGhzKHBfb2NpLCBpX29jaSkgewogICAgcF9wYXRocyA6PSBwX29jaS5MaW51eC5NYXNrZWRQYXRocwogICAgcHJpbnQoImFsbG93X21hc2tlZF9wYXRocyAxOiBwX3BhdGhzID0iLCBwX3BhdGhzKQoKICAgIGlfcGF0aHMgOj0gaV9vY2kuTGludXguTWFza2VkUGF0aHMKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aHMgMTogaV9wYXRocyA9IiwgaV9wYXRocykKCiAgICBhbGxvd19tYXNrZWRfcGF0aHNfYXJyYXkocF9wYXRocywgaV9wYXRocykKCiAgICBwcmludCgiYWxsb3dfbWFza2VkX3BhdGhzIDE6IHRydWUiKQp9CmFsbG93X21hc2tlZF9wYXRocyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aHMgMjogc3RhcnQiKQoKICAgIG5vdCBwX29jaS5MaW51eC5NYXNrZWRQYXRocwogICAgbm90IGlfb2NpLkxpbnV4Lk1hc2tlZFBhdGhzCgogICAgcHJpbnQoImFsbG93X21hc2tlZF9wYXRocyAyOiB0cnVlIikKfQoKIyBBbGwgdGhlIHBvbGljeSBtYXNrZWQgcGF0aHMgbXVzdCBiZSBtYXNrZWQgaW4gdGhlIGlucHV0IGRhdGEgdG9vLgojIElucHV0IGlzIGFsbG93ZWQgdG8gaGF2ZSBtb3JlIG1hc2tlZCBwYXRocyB0aGFuIHRoZSBwb2xpY3kuCmFsbG93X21hc2tlZF9wYXRoc19hcnJheShwX2FycmF5LCBpX2FycmF5KSB7CiAgICBldmVyeSBwX2VsZW0gaW4gcF9hcnJheSB7CiAgICAgICAgYWxsb3dfbWFza2VkX3BhdGgocF9lbGVtLCBpX2FycmF5KQogICAgfQp9CgphbGxvd19tYXNrZWRfcGF0aChwX2VsZW0sIGlfYXJyYXkpIHsKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aDogcF9lbGVtID0iLCBwX2VsZW0pCgogICAgc29tZSBpX2VsZW0gaW4gaV9hcnJheQogICAgcF9lbGVtID09IGlfZWxlbQoKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aDogdHJ1ZSIpCn0KCmFsbG93X3JlYWRvbmx5X3BhdGhzKHBfb2NpLCBpX29jaSkgewogICAgcF9wYXRocyA6PSBwX29jaS5MaW51eC5SZWFkb25seVBhdGhzCiAgICBwcmludCgiYWxsb3dfcmVhZG9ubHlfcGF0aHMgMTogcF9wYXRocyA9IiwgcF9wYXRocykKCiAgICBpX3BhdGhzIDo9IGlfb2NpLkxpbnV4LlJlYWRvbmx5UGF0aHMKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAxOiBpX3BhdGhzID0iLCBpX3BhdGhzKQoKICAgIGFsbG93X3JlYWRvbmx5X3BhdGhzX2FycmF5KHBfcGF0aHMsIGlfcGF0aHMsIGlfb2NpLkxpbnV4Lk1hc2tlZFBhdGhzKQoKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAxOiB0cnVlIikKfQphbGxvd19yZWFkb25seV9wYXRocyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAyOiBzdGFydCIpCgogICAgbm90IHBfb2NpLkxpbnV4LlJlYWRvbmx5UGF0aHMKICAgIG5vdCBpX29jaS5MaW51eC5SZWFkb25seVBhdGhzCgogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGhzIDI6IHRydWUiKQp9CgojIEFsbCB0aGUgcG9saWN5IHJlYWRvbmx5IHBhdGhzIG11c3QgYmUgZWl0aGVyOgojIC0gUHJlc2VudCBpbiB0aGUgaW5wdXQgcmVhZG9ubHkgcGF0aHMsIG9yCiMgLSBQcmVzZW50IGluIHRoZSBpbnB1dCBtYXNrZWQgcGF0aHMuCiMgSW5wdXQgaXMgYWxsb3dlZCB0byBoYXZlIG1vcmUgcmVhZG9ubHkgcGF0aHMgdGhhbiB0aGUgcG9saWN5LgphbGxvd19yZWFkb25seV9wYXRoc19hcnJheShwX2FycmF5LCBpX2FycmF5LCBtYXNrZWRfcGF0aHMpIHsKICAgIGV2ZXJ5IHBfZWxlbSBpbiBwX2FycmF5IHsKICAgICAgICBhbGxvd19yZWFkb25seV9wYXRoKHBfZWxlbSwgaV9hcnJheSwgbWFza2VkX3BhdGhzKQogICAgfQp9CgphbGxvd19yZWFkb25seV9wYXRoKHBfZWxlbSwgaV9hcnJheSwgbWFza2VkX3BhdGhzKSB7CiAgICBwcmludCgiYWxsb3dfcmVhZG9ubHlfcGF0aCAxOiBwX2VsZW0gPSIsIHBfZWxlbSkKCiAgICBzb21lIGlfZWxlbSBpbiBpX2FycmF5CiAgICBwX2VsZW0gPT0gaV9lbGVtCgogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGggMTogdHJ1ZSIpCn0KYWxsb3dfcmVhZG9ubHlfcGF0aChwX2VsZW0sIGlfYXJyYXksIG1hc2tlZF9wYXRocykgewogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGggMjogcF9lbGVtID0iLCBwX2VsZW0pCgogICAgc29tZSBpX21hc2tlZCBpbiBtYXNrZWRfcGF0aHMKICAgIHBfZWxlbSA9PSBpX21hc2tlZAoKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRoIDI6IHRydWUiKQp9CgphbGxvd19saW51eF9kZXZpY2VzKHBfZGV2aWNlcywgaV9kZXZpY2VzKSB7CiAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogc3RhcnQiKQogICAgZXZlcnkgaV9kZXZpY2UgaW4gaV9kZXZpY2VzIHsKICAgICAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogaV9kZXZpY2UgPSIsIGlfZGV2aWNlKQogICAgICAgIHNvbWUgcF9kZXZpY2UgaW4gcF9kZXZpY2VzCiAgICAgICAgaV9kZXZpY2UuUGF0aCA9PSBwX2RldmljZS5QYXRoCiAgICB9CiAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogdHJ1ZSIpCn0KCmFsbG93X2xpbnV4X3N5c2N0bChwX2xpbnV4LCBpX2xpbnV4KSB7CiAgICBwcmludCgiYWxsb3dfbGludXhfc3lzY3RsIDE6IHN0YXJ0IikKICAgIG5vdCBpX2xpbnV4LlN5c2N0bAogICAgcHJpbnQoImFsbG93X2xpbnV4X3N5c2N0bCAxOiB0cnVlIikKfQoKYWxsb3dfbGludXhfc3lzY3RsKHBfbGludXgsIGlfbGludXgpIHsKICAgIHByaW50KCJhbGxvd19saW51eF9zeXNjdGwgMjogc3RhcnQiKQogICAgcF9zeXNjdGwgOj0gcF9saW51eC5TeXNjdGwKICAgIGlfc3lzY3RsIDo9IGlfbGludXguU3lzY3RsCiAgICBldmVyeSBpX25hbWUsIGlfdmFsIGluIGlfc3lzY3RsIHsKICAgICAgICBwcmludCgiYWxsb3dfbGludXhfc3lzY3RsIDI6IGlfbmFtZSA9IiwgaV9uYW1lLCAiaV92YWwgPSIsIGlfdmFsKQogICAgICAgIHBfc3lzY3RsW2lfbmFtZV0gPT0gaV92YWwKICAgIH0KICAgIHByaW50KCJhbGxvd19saW51eF9zeXNjdGwgMjogdHJ1ZSIpCn0KCiMgQ2hlY2sgdGhlIGNvbnNpc3RlbmN5IG9mIHRoZSBpbnB1dCAiaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5idW5kbGVfcGF0aCIKIyBhbmQgaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCIgdmFsdWVzIHdpdGggb3RoZXIgZmllbGRzLgphbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZChwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpIHsKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogc3RhcnQiKQoKICAgIGJ1bmRsZV9wYXRoIDo9IGlfb2NpLkFubm90YXRpb25zWyJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmJ1bmRsZV9wYXRoIl0KICAgIGJ1bmRsZV9pZCA6PSByZXBsYWNlKGJ1bmRsZV9wYXRoLCAiL3J1bi9jb250YWluZXJkL2lvLmNvbnRhaW5lcmQucnVudGltZS52Mi50YXNrL2s4cy5pby8iLCAiIikKCiAgICBidW5kbGVfaWRfZm9ybWF0IDo9IGNvbmNhdCgiIiwgWyJeIiwgQlVORExFX0lELCAiJCJdKQogICAgcmVnZXgubWF0Y2goYnVuZGxlX2lkX2Zvcm1hdCwgYnVuZGxlX2lkKQoKICAgIGtleSA6PSAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCIKCiAgICBwX3JlZ2V4IDo9IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIHNhbmRib3hfaWQgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQoKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogc2FuZGJveF9pZCA9Iiwgc2FuZGJveF9pZCwgInJlZ2V4ID0iLCBwX3JlZ2V4KQogICAgcmVnZXgubWF0Y2gocF9yZWdleCwgc2FuZGJveF9pZCkKCiAgICBhbGxvd19yb290X3BhdGgocF9vY2ksIGlfb2NpLCBidW5kbGVfaWQpCgogICAgZXZlcnkgaV9tb3VudCBpbiBpX29jaS5Nb3VudHMgewogICAgICAgIGFsbG93X21vdW50KHBfb2NpLCBpX21vdW50LCBpX3N0b3JhZ2VzLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpCiAgICB9CgogICAgYWxsb3dfc3RvcmFnZXMocF9zdG9yYWdlcywgaV9zdG9yYWdlcywgYnVuZGxlX2lkLCBzYW5kYm94X2lkKQoKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogdHJ1ZSIpCn0KCmFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHBfcHJvY2VzcyA9IiwgcF9wcm9jZXNzKQogICAgcHJpbnQoImFsbG93X3Byb2Nlc3NfY29tbW9uOiBpX3Byb2Nlc3MgPSAiLCBpX3Byb2Nlc3MpCiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHNfbmFtZSA9Iiwgc19uYW1lKQoKICAgIHBfcHJvY2Vzcy5Dd2QgPT0gaV9wcm9jZXNzLkN3ZAogICAgcF9wcm9jZXNzLk5vTmV3UHJpdmlsZWdlcyA9PSBpX3Byb2Nlc3MuTm9OZXdQcml2aWxlZ2VzCgogICAgYWxsb3dfdXNlcihwX3Byb2Nlc3MsIGlfcHJvY2VzcykKICAgIGFsbG93X2VudihwX3Byb2Nlc3MsIGlfcHJvY2Vzcywgc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHRydWUiKQp9CgojIENvbXBhcmUgdGhlIE9DSSBQcm9jZXNzIGZpZWxkIG9mIGEgcG9saWN5IGNvbnRhaW5lciB3aXRoIHRoZSBpbnB1dCBPQ0kgUHJvY2VzcyBmcm9tIGEgQ3JlYXRlQ29udGFpbmVyUmVxdWVzdAphbGxvd19wcm9jZXNzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfcHJvY2Vzczogc3RhcnQiKQoKICAgIGFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgYWxsb3dfY2FwcyhwX3Byb2Nlc3MuQ2FwYWJpbGl0aWVzLCBpX3Byb2Nlc3MuQ2FwYWJpbGl0aWVzKQogICAgcF9wcm9jZXNzLlRlcm1pbmFsID09IGlfcHJvY2Vzcy5UZXJtaW5hbAoKICAgIHByaW50KCJhbGxvd19wcm9jZXNzOiB0cnVlIikKfQoKIyBDb21wYXJlIHRoZSBPQ0kgUHJvY2VzcyBmaWVsZCBvZiBhIHBvbGljeSBjb250YWluZXIgd2l0aCB0aGUgaW5wdXQgcHJvY2VzcyBmaWVsZCBmcm9tIEV4ZWNQcm9jZXNzUmVxdWVzdAphbGxvd19pbnRlcmFjdGl2ZV9wcm9jZXNzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfaW50ZXJhY3RpdmVfcHJvY2Vzczogc3RhcnQiKQoKICAgIGFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgYWxsb3dfZXhlY19jYXBzKGlfcHJvY2Vzcy5DYXBhYmlsaXRpZXMpCgogICAgIyBUaGVzZSBhcmUgY29tbWFuZHMgZW5hYmxlZCB1c2luZyBFeGVjUHJvY2Vzc1JlcXVlc3QgY29tbWFuZHMgYW5kL29yIHJlZ2V4IGZyb20gdGhlIHNldHRpbmdzIGZpbGUuCiAgICAjIFRoZXkgY2FuIGJlIGV4ZWN1dGVkIGludGVyYWN0aXZlbHkgc28gYWxsb3cgdGhlbSB0byB1c2UgYW55IHZhbHVlIGZvciBpX3Byb2Nlc3MuVGVybWluYWwuCgogICAgcHJpbnQoImFsbG93X2ludGVyYWN0aXZlX3Byb2Nlc3M6IHRydWUiKQp9CgojIENvbXBhcmUgdGhlIE9DSSBQcm9jZXNzIGZpZWxkIG9mIGEgcG9saWN5IGNvbnRhaW5lciB3aXRoIHRoZSBpbnB1dCBwcm9jZXNzIGZpZWxkIGZyb20gRXhlY1Byb2Nlc3NSZXF1ZXN0CmFsbG93X3Byb2JlX3Byb2Nlc3MocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19wcm9iZV9wcm9jZXNzOiBzdGFydCIpCgogICAgYWxsb3dfcHJvY2Vzc19jb21tb24ocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpCiAgICBhbGxvd19leGVjX2NhcHMoaV9wcm9jZXNzLkNhcGFiaWxpdGllcykKICAgIHBfcHJvY2Vzcy5UZXJtaW5hbCA9PSBpX3Byb2Nlc3MuVGVybWluYWwKCiAgICBwcmludCgiYWxsb3dfcHJvYmVfcHJvY2VzczogdHJ1ZSIpCn0KCmFsbG93X3VzZXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MpIHsKICAgIHBfdXNlciA6PSBwX3Byb2Nlc3MuVXNlcgogICAgaV91c2VyIDo9IGlfcHJvY2Vzcy5Vc2VyCgogICAgcHJpbnQoImFsbG93X3VzZXI6IGlucHV0IHVpZCA9IiwgaV91c2VyLlVJRCwgInBvbGljeSB1aWQgPSIsIHBfdXNlci5VSUQpCiAgICBwX3VzZXIuVUlEID09IGlfdXNlci5VSUQKCiAgICAjIFRPRE86IHRyYWNrIGRvd24gdGhlIHJlYXNvbiBmb3IgcmVnaXN0cnkuazhzLmlvL3BhdXNlOjMuOSBiZWluZwogICAgIyAgICAgICBleGVjdXRlZCB3aXRoIGdpZCA9IDAgZGVzcGl0ZSBoYXZpbmcgIjY1NTM1OjY1NTM1IiBpbiBpdHMgY29udGFpbmVyIGltYWdlCiAgICAjICAgICAgIGNvbmZpZy4KICAgICNwcmludCgiYWxsb3dfdXNlcjogaW5wdXQgZ2lkID0iLCBpX3VzZXIuR0lELCAicG9saWN5IGdpZCA9IiwgcF91c2VyLkdJRCkKICAgICNwX3VzZXIuR0lEID09IGlfdXNlci5HSUQKCiAgICAjIFRPRE86IGNvbXBhcmUgdGhlIGFkZGl0aW9uYWxHaWRzIGZpZWxkIHRvbyBhZnRlciBjb21wdXRpbmcgaXRzIHZhbHVlCiAgICAjIGJhc2VkIG9uIC9ldGMvcGFzc3dkIGFuZCAvZXRjL2dyb3VwIGZyb20gdGhlIGNvbnRhaW5lciBpbWFnZS4KfQoKYWxsb3dfZGVwcmVjYXRlZF9hcmdzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZ3MgMTogbm8gYXJncyIpCgogICAgbm90IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJncwogICAgbm90IGlfcHJvY2Vzcy5BcmdzCgogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAxOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZ3MocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSkgewogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiBwb2xpY3kgYXJncyA9IiwgcF9wcm9jZXNzLkRlcHJlY2F0ZWRBcmdzKQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiBpbnB1dCBhcmdzID0iLCBpX3Byb2Nlc3MuQXJncykKCiAgICBjb3VudChwX3Byb2Nlc3MuRGVwcmVjYXRlZEFyZ3MpID09IGNvdW50KGlfcHJvY2Vzcy5BcmdzKQoKICAgIGV2ZXJ5IGksIGlfYXJnIGluIGlfcHJvY2Vzcy5BcmdzIHsKICAgICAgICBhbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpCiAgICB9CgogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDE6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgcF9hcmcyIDo9IHJlcGxhY2UocF9hcmcsICIkJCIsICIkIikKICAgIHBfYXJnMiA9PSBpX2FyZwoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAxOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDI6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgIyBUT0RPOiBjYW4gJChub2RlLW5hbWUpIGJlIGhhbmRsZWQgYmV0dGVyPwogICAgY29udGFpbnMocF9hcmcsICIkKG5vZGUtbmFtZSkiKQoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAyOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDM6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgcF9hcmcyIDo9IHJlcGxhY2UocF9hcmcsICIkJCIsICIkIikKICAgIHBfYXJnMyA6PSByZXBsYWNlKHBfYXJnMiwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAzOiBwX2FyZzMgPSIsIHBfYXJnMykKICAgIHBfYXJnMyA9PSBpX2FyZwoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAzOiB0cnVlIikKfQoKIyBPQ0kgcHJvY2Vzcy5FbnYgZmllbGQKYWxsb3dfZW52KHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfZW52OiBwIGVudiA9IiwgcF9wcm9jZXNzLkVudikKICAgIHByaW50KCJhbGxvd19lbnY6IGkgZW52ID0iLCBpX3Byb2Nlc3MuRW52KQoKICAgIGV2ZXJ5IGlfdmFyIGluIGlfcHJvY2Vzcy5FbnYgewogICAgICAgIHByaW50KCJhbGxvd19lbnY6IGlfdmFyID0iLCBpX3ZhcikKICAgICAgICBhbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgfQoKICAgIHByaW50KCJhbGxvd19lbnY6IHRydWUiKQp9CgojIEFsbG93IGlucHV0IGVudiB2YXJpYWJsZXMgdGhhdCBhcmUgcHJlc2VudCBpbiB0aGUgcG9saWN5IGRhdGEgdG9vLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHBfdmFyID09IGlfdmFyCiAgICBwcmludCgiYWxsb3dfdmFyIDE6IHRydWUiKQp9CgojIE1hdGNoIGlucHV0IHdpdGggb25lIG9mIHRoZSBwb2xpY3kgdmFyaWFibGVzLCBhZnRlciBzdWJzdGl0dXRpbmcgJChzYW5kYm94LW5hbWUpLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHByaW50KCJhbGxvd192YXIgMjogcF92YXIgPSIsIHBfdmFyKQoKICAgIHBfdmFyX3NwbGl0IDo9IHNwbGl0KHBfdmFyLCAiPSIpCiAgICBjb3VudChwX3Zhcl9zcGxpdCkgPT0gMgoKICAgIHBfdmFyX3NwbGl0WzFdID09ICIkKHNhbmRib3gtbmFtZSkiCgogICAgaV92YXJfc3BsaXQgOj0gc3BsaXQoaV92YXIsICI9IikKICAgIGNvdW50KGlfdmFyX3NwbGl0KSA9PSAyCgogICAgaV92YXJfc3BsaXRbMF0gPT0gcF92YXJfc3BsaXRbMF0KICAgIHJlZ2V4Lm1hdGNoKHNfbmFtZSwgaV92YXJfc3BsaXRbMV0pCgogICAgcHJpbnQoImFsbG93X3ZhciAyOiB0cnVlIikKfQoKIyBBbGxvdyBpbnB1dCBlbnYgdmFyaWFibGVzIHRoYXQgbWF0Y2ggd2l0aCBhIHJlcXVlc3RfZGVmYXVsdHMgcmVnZXguCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHNvbWUgcF9yZWdleDEgaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5DcmVhdGVDb250YWluZXJSZXF1ZXN0LmFsbG93X2Vudl9yZWdleAogICAgcF9yZWdleDIgOj0gcmVwbGFjZShwX3JlZ2V4MSwgIiQoaXB2NF9hKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcHY0X2EpCiAgICBwX3JlZ2V4MyA6PSByZXBsYWNlKHBfcmVnZXgyLCAiJChpcF9wKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcF9wKQogICAgcF9yZWdleDQgOj0gcmVwbGFjZShwX3JlZ2V4MywgIiQoc3ZjX25hbWUpIiwgcG9saWN5X2RhdGEuY29tbW9uLnN2Y19uYW1lKQogICAgcF9yZWdleDUgOj0gcmVwbGFjZShwX3JlZ2V4NCwgIiQoZG5zX2xhYmVsKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5kbnNfbGFiZWwpCgogICAgcHJpbnQoImFsbG93X3ZhciAzOiBwX3JlZ2V4NSA9IiwgcF9yZWdleDUpCiAgICByZWdleC5tYXRjaChwX3JlZ2V4NSwgaV92YXIpCgogICAgcHJpbnQoImFsbG93X3ZhciAzOiB0cnVlIikKfQoKIyBBbGxvdyBmaWVsZFJlZiAiZmllbGRQYXRoOiBzdGF0dXMucG9kSVAiIHZhbHVlcy4KYWxsb3dfdmFyKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBpX3Zhciwgc19uYW1lLCBzX25hbWVzcGFjZSkgewogICAgbmFtZV92YWx1ZSA6PSBzcGxpdChpX3ZhciwgIj0iKQogICAgY291bnQobmFtZV92YWx1ZSkgPT0gMgogICAgaXNfaXAobmFtZV92YWx1ZVsxXSkKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIGFsbG93X3BvZF9pcF92YXIobmFtZV92YWx1ZVswXSwgcF92YXIpCgogICAgcHJpbnQoImFsbG93X3ZhciA0OiB0cnVlIikKfQoKIyBBbGxvdyBjb21tb24gZmllbGRSZWYgdmFyaWFibGVzLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBuYW1lX3ZhbHVlIDo9IHNwbGl0KGlfdmFyLCAiPSIpCiAgICBjb3VudChuYW1lX3ZhbHVlKSA9PSAyCgogICAgc29tZSBwX3ZhciBpbiBwX3Byb2Nlc3MuRW52CiAgICBwX25hbWVfdmFsdWUgOj0gc3BsaXQocF92YXIsICI9IikKICAgIGNvdW50KHBfbmFtZV92YWx1ZSkgPT0gMgoKICAgIHBfbmFtZV92YWx1ZVswXSA9PSBuYW1lX3ZhbHVlWzBdCgogICAgIyBUT0RPOiBzaG91bGQgdGhlc2UgYmUgaGFuZGxlZCBpbiBhIGRpZmZlcmVudCB3YXk/CiAgICBhbHdheXNfYWxsb3dlZCA6PSBbIiQoaG9zdC1uYW1lKSIsICIkKG5vZGUtbmFtZSkiLCAiJChwb2QtdWlkKSJdCiAgICBzb21lIGFsbG93ZWQgaW4gYWx3YXlzX2FsbG93ZWQKICAgIGNvbnRhaW5zKHBfbmFtZV92YWx1ZVsxXSwgYWxsb3dlZCkKCiAgICBwcmludCgiYWxsb3dfdmFyIDU6IHRydWUiKQp9CgojIEFsbG93IGZpZWxkUmVmICJmaWVsZFBhdGg6IHN0YXR1cy5ob3N0SVAiIHZhbHVlcy4KYWxsb3dfdmFyKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBpX3Zhciwgc19uYW1lLCBzX25hbWVzcGFjZSkgewogICAgbmFtZV92YWx1ZSA6PSBzcGxpdChpX3ZhciwgIj0iKQogICAgY291bnQobmFtZV92YWx1ZSkgPT0gMgogICAgaXNfaXAobmFtZV92YWx1ZVsxXSkKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIGFsbG93X2hvc3RfaXBfdmFyKG5hbWVfdmFsdWVbMF0sIHBfdmFyKQoKICAgIHByaW50KCJhbGxvd192YXIgNjogdHJ1ZSIpCn0KCiMgQWxsb3cgcmVzb3VyY2VGaWVsZFJlZiB2YWx1ZXMgKGUuZy4sICJsaW1pdHMuY3B1IikuCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIG5hbWVfdmFsdWUgOj0gc3BsaXQoaV92YXIsICI9IikKICAgIGNvdW50KG5hbWVfdmFsdWUpID09IDIKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHBfbmFtZV92YWx1ZSA6PSBzcGxpdChwX3ZhciwgIj0iKQogICAgY291bnQocF9uYW1lX3ZhbHVlKSA9PSAyCgogICAgcF9uYW1lX3ZhbHVlWzBdID09IG5hbWVfdmFsdWVbMF0KCiAgICAjIGEgdmFyaWFibGUgd2Ugc2hvdWxkIGJlIHZhbGlkYXRpbmcgdXNpbmcgYSByZWdleCBmcm9tIHNldHRpbmdzCiAgICBwX25hbWVfdmFsdWVbMV0gPT0gIiQodmFsaWRhdGUtZnJvbS1zZXR0aW5ncykiCgogICAgcmVnZXhfdmFsIDo9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuQ3JlYXRlQ29udGFpbmVyUmVxdWVzdC5hbGxvd19lbnZfcmVnZXhfbWFwW25hbWVfdmFsdWVbMF1dCgogICAgcHJpbnQoImFsbG93X3ZhciA3OiB2YWwgPSIsIG5hbWVfdmFsdWVbMV0pCiAgICBwcmludCgiYWxsb3dfdmFyIDc6IHJlZ2V4X3ZhbCA9IiwgcmVnZXhfdmFsKQoKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4X3ZhbCwgbmFtZV92YWx1ZVsxXSkKCiAgICBwcmludCgiYWxsb3dfdmFyIDc6IHRydWUiKQp9CgojIE1hdGNoIGlucHV0IHdpdGggb25lIG9mIHRoZSBwb2xpY3kgdmFyaWFibGVzLCBhZnRlciBzdWJzdGl0dXRpbmcgJChzYW5kYm94LW5hbWVzcGFjZSkuCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHNvbWUgcF92YXIgaW4gcF9wcm9jZXNzLkVudgogICAgcF92YXIyIDo9IHJlcGxhY2UocF92YXIsICIkKHNhbmRib3gtbmFtZXNwYWNlKSIsIHNfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd192YXIgODogcF92YXIyID0iLCBwX3ZhcjIpCiAgICBwX3ZhcjIgPT0gaV92YXIKCiAgICBwcmludCgiYWxsb3dfdmFyIDg6IHRydWUiKQp9CgphbGxvd19wb2RfaXBfdmFyKHZhcl9uYW1lLCBwX3ZhcikgewogICAgcHJpbnQoImFsbG93X3BvZF9pcF92YXI6IHZhcl9uYW1lID0iLCB2YXJfbmFtZSwgInBfdmFyID0iLCBwX3ZhcikKCiAgICBwX25hbWVfdmFsdWUgOj0gc3BsaXQocF92YXIsICI9IikKICAgIGNvdW50KHBfbmFtZV92YWx1ZSkgPT0gMgoKICAgIHBfbmFtZV92YWx1ZVswXSA9PSB2YXJfbmFtZQogICAgcF9uYW1lX3ZhbHVlWzFdID09ICIkKHBvZC1pcCkiCgogICAgcHJpbnQoImFsbG93X3BvZF9pcF92YXI6IHRydWUiKQp9CgphbGxvd19ob3N0X2lwX3Zhcih2YXJfbmFtZSwgcF92YXIpIHsKICAgIHByaW50KCJhbGxvd19ob3N0X2lwX3ZhcjogdmFyX25hbWUgPSIsIHZhcl9uYW1lLCAicF92YXIgPSIsIHBfdmFyKQoKICAgIHBfbmFtZV92YWx1ZSA6PSBzcGxpdChwX3ZhciwgIj0iKQogICAgY291bnQocF9uYW1lX3ZhbHVlKSA9PSAyCgogICAgcF9uYW1lX3ZhbHVlWzBdID09IHZhcl9uYW1lCiAgICBwX25hbWVfdmFsdWVbMV0gPT0gIiQoaG9zdC1pcCkiCgogICAgcHJpbnQoImFsbG93X2hvc3RfaXBfdmFyOiB0cnVlIikKfQoKaXNfaXAodmFsdWUpIHsKICAgIGJ5dGVzID0gc3BsaXQodmFsdWUsICIuIikKICAgIGNvdW50KGJ5dGVzKSA9PSA0CgogICAgaXNfaXBfZmlyc3RfYnl0ZShieXRlc1swXSkKICAgIGlzX2lwX290aGVyX2J5dGUoYnl0ZXNbMV0pCiAgICBpc19pcF9vdGhlcl9ieXRlKGJ5dGVzWzJdKQogICAgaXNfaXBfb3RoZXJfYnl0ZShieXRlc1szXSkKfQppc19pcF9maXJzdF9ieXRlKGNvbXBvbmVudCkgewogICAgbnVtYmVyID0gdG9fbnVtYmVyKGNvbXBvbmVudCkKICAgIG51bWJlciA+PSAxCiAgICBudW1iZXIgPD0gMjU1Cn0KaXNfaXBfb3RoZXJfYnl0ZShjb21wb25lbnQpIHsKICAgIG51bWJlciA9IHRvX251bWJlcihjb21wb25lbnQpCiAgICBudW1iZXIgPj0gMAogICAgbnVtYmVyIDw9IDI1NQp9CgojIE9DSSByb290LlBhdGgKYWxsb3dfcm9vdF9wYXRoKHBfb2NpLCBpX29jaSwgYnVuZGxlX2lkKSB7CiAgICBpX3BhdGggOj0gaV9vY2kuUm9vdC5QYXRoCiAgICBwX3BhdGgxIDo9IHBfb2NpLlJvb3QuUGF0aAogICAgcHJpbnQoImFsbG93X3Jvb3RfcGF0aDogaV9wYXRoID0iLCBpX3BhdGgsICJwX3BhdGgxID0iLCBwX3BhdGgxKQoKICAgIHBfcGF0aDIgOj0gcmVwbGFjZShwX3BhdGgxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfcm9vdF9wYXRoOiBwX3BhdGgyID0iLCBwX3BhdGgyKQoKICAgIHBfcGF0aDMgOj0gcmVwbGFjZShwX3BhdGgyLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X3Jvb3RfcGF0aDogcF9wYXRoMyA9IiwgcF9wYXRoMykKCiAgICBwX3BhdGgzID09IGlfcGF0aAoKICAgIHByaW50KCJhbGxvd19yb290X3BhdGg6IHRydWUiKQp9CgojIGRldmljZSBtb3VudHMKYWxsb3dfbW91bnQocF9vY2ksIGlfbW91bnQsIGlfc3RvcmFnZXMsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcHJpbnQoImFsbG93X21vdW50OiBpX21vdW50ID0iLCBpX21vdW50KQoKICAgIHNvbWUgcF9tb3VudCBpbiBwX29jaS5Nb3VudHMKICAgIHNvbWUgaV9zdG9yYWdlIGluIGlfc3RvcmFnZXMKCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IHBfbW91bnQgPSIsIHBfbW91bnQpCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IGlfc3RvcmFnZSA9IiwgaV9zdG9yYWdlKQoKICAgIGNoZWNrX21vdW50KHBfbW91bnQsIGlfbW91bnQsIGlfc3RvcmFnZSwgYnVuZGxlX2lkLCBzYW5kYm94X2lkKQoKICAgICMgVE9ETzogYXJlIHRoZXJlIGFueSBvdGhlciByZXF1aXJlZCBwb2xpY3kgY2hlY2tzIGZvciBtb3VudHMgLSBlLmcuLAogICAgIyAgICAgICBtdWx0aXBsZSBtb3VudHMgd2l0aCBzYW1lIHNvdXJjZSBvciBkZXN0aW5hdGlvbj8KCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IHRydWUiKQp9CgpjaGVja19tb3VudChwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcF9tb3VudCA9PSBpX21vdW50CiAgICBwcmludCgiY2hlY2tfbW91bnQgMTogdHJ1ZSIpCn0KY2hlY2tfbW91bnQocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHBfbW91bnQuZGVzdGluYXRpb24gPT0gaV9tb3VudC5kZXN0aW5hdGlvbgogICAgcF9tb3VudC50eXBlXyA9PSBpX21vdW50LnR5cGVfCiAgICBwX21vdW50Lm9wdGlvbnMgPT0gaV9tb3VudC5vcHRpb25zCgogICAgbW91bnRfc291cmNlX2FsbG93cyhwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkKCiAgICBwcmludCgiY2hlY2tfbW91bnQgMjogdHJ1ZSIpCn0KCm1vdW50X3NvdXJjZV9hbGxvd3MocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHJlZ2V4MSA6PSBwX21vdW50LnNvdXJjZQogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5tb3VudF9zb3VyY2VfY3BhdGgpCiAgICByZWdleDQgOj0gcmVwbGFjZShyZWdleDMsICIkKGJ1bmRsZS1pZCkiLCBidW5kbGVfaWQpCgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMTogcmVnZXg0ID0iLCByZWdleDQpCiAgICByZWdleC5tYXRjaChyZWdleDQsIGlfbW91bnQuc291cmNlKQoKICAgIHByaW50KCJtb3VudF9zb3VyY2VfYWxsb3dzIDE6IHRydWUiKQp9Cm1vdW50X3NvdXJjZV9hbGxvd3MocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHJlZ2V4MSA6PSBwX21vdW50LnNvdXJjZQogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5tb3VudF9zb3VyY2VfY3BhdGgpCiAgICByZWdleDQgOj0gcmVwbGFjZShyZWdleDMsICIkKHNhbmRib3gtaWQpIiwgc2FuZGJveF9pZCkKCiAgICBwcmludCgibW91bnRfc291cmNlX2FsbG93cyAyOiByZWdleDQgPSIsIHJlZ2V4NCkKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4NCwgaV9tb3VudC5zb3VyY2UpCgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMjogdHJ1ZSIpCn0KbW91bnRfc291cmNlX2FsbG93cyhwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogaV9tb3VudC5zb3VyY2UgPSIsIGlfbW91bnQuc291cmNlKQogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogaV9zdG9yYWdlLm1vdW50X3BvaW50ID0iLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCgogICAgaV9tb3VudC5zb3VyY2UgPT0gaV9zdG9yYWdlLm1vdW50X3BvaW50CgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogdHJ1ZSIpCn0KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBDcmVhdGUgY29udGFpbmVyIFN0b3JhZ2VzCgphbGxvd19zdG9yYWdlcyhwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHBfY291bnQgOj0gY291bnQocF9zdG9yYWdlcykKICAgIGlfY291bnQgOj0gY291bnQoaV9zdG9yYWdlcykKICAgIHByaW50KCJhbGxvd19zdG9yYWdlczogcF9jb3VudCA9IiwgcF9jb3VudCwgImlfY291bnQgPSIsIGlfY291bnQpCgogICAgcF9jb3VudCA9PSBpX2NvdW50CgogICAgIyBHZXQgdGhlIGNvbnRhaW5lciBpbWFnZSBsYXllciBJRHMgYW5kIHZlcml0eSByb290IGhhc2hlcywgZnJvbSB0aGUgIm92ZXJsYXlmcyIgc3RvcmFnZS4KICAgIHNvbWUgb3ZlcmxheV9zdG9yYWdlIGluIHBfc3RvcmFnZXMKICAgIG92ZXJsYXlfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIHByaW50KCJhbGxvd19zdG9yYWdlczogb3ZlcmxheV9zdG9yYWdlID0iLCBvdmVybGF5X3N0b3JhZ2UpCiAgICBjb3VudChvdmVybGF5X3N0b3JhZ2Uub3B0aW9ucykgPT0gMgoKICAgIGxheWVyX2lkcyA6PSBzcGxpdChvdmVybGF5X3N0b3JhZ2Uub3B0aW9uc1swXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiBsYXllcl9pZHMgPSIsIGxheWVyX2lkcykKCiAgICByb290X2hhc2hlcyA6PSBzcGxpdChvdmVybGF5X3N0b3JhZ2Uub3B0aW9uc1sxXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiByb290X2hhc2hlcyA9Iiwgcm9vdF9oYXNoZXMpCgogICAgZXZlcnkgaV9zdG9yYWdlIGluIGlfc3RvcmFnZXMgewogICAgICAgIGFsbG93X3N0b3JhZ2UocF9zdG9yYWdlcywgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpCiAgICB9CgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiB0cnVlIikKfQoKYWxsb3dfc3RvcmFnZShwX3N0b3JhZ2VzLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgc29tZSBwX3N0b3JhZ2UgaW4gcF9zdG9yYWdlcwoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiBwX3N0b3JhZ2UgPSIsIHBfc3RvcmFnZSkKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiBpX3N0b3JhZ2UgPSIsIGlfc3RvcmFnZSkKCiAgICBwX3N0b3JhZ2UuZHJpdmVyICAgICAgICAgICA9PSBpX3N0b3JhZ2UuZHJpdmVyCiAgICBwX3N0b3JhZ2UuZHJpdmVyX29wdGlvbnMgICA9PSBpX3N0b3JhZ2UuZHJpdmVyX29wdGlvbnMKICAgIHBfc3RvcmFnZS5mc19ncm91cCAgICAgICAgID09IGlfc3RvcmFnZS5mc19ncm91cAogICAgcF9zdG9yYWdlLmZzdHlwZSAgICAgICAgICAgPT0gaV9zdG9yYWdlLmZzdHlwZQoKICAgIGFsbG93X3N0b3JhZ2Vfc291cmNlKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKQogICAgYWxsb3dfc3RvcmFnZV9vcHRpb25zKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKQogICAgYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKQoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiB0cnVlIikKfQoKYWxsb3dfc3RvcmFnZV9zb3VyY2UocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX3NvdXJjZSAxOiBzdGFydCIpCgogICAgcF9zdG9yYWdlLnNvdXJjZSA9PSBpX3N0b3JhZ2Uuc291cmNlCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDE6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX3NvdXJjZShwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDI6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCgogICAgIyBEREREOkJCOkRELkY6IERvbWFpbjpCdXM6RGV2aWNlLkZ1bmN0aW9uCiAgICAjIGh0dHBzOi8vd3d3Lmtlcm5lbC5vcmcvZG9jL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtYnVzLXBjaQogICAgcmVnZXgubWF0Y2goYF5bYS1mMC05XXs0fTpbYS1mMC05XXsyfTpbYS1mMC05XXsyfVwuW2EtZjAtOV0kYCwgaV9zdG9yYWdlLnNvdXJjZSkKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9zb3VyY2UgMjogdHJ1ZSIpCn0KCmFsbG93X3N0b3JhZ2Vfc291cmNlKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKSB7CiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9zb3VyY2UgMzogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIGlfc3RvcmFnZS5zb3VyY2UgPT0gIm5vbmUiCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDM6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX3NvdXJjZShwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDQ6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJzbWIiCgogICAgIyBQYXR0ZXJuOiAvLzxzdG9yYWdlLWFjY291bnQtbmFtZT4uZmlsZS5jb3JlLndpbmRvd3MubmV0LzxrOHMtUFZDLW5hbWU+CiAgICAjIFN0b3JhZ2UgYWNjb3VudCBuYW1lOiBodHRwczovL2xlYXJuLm1pY3Jvc29mdC5jb20vZW4tdXMvYXp1cmUvc3RvcmFnZS9jb21tb24vc3RvcmFnZS1hY2NvdW50LW92ZXJ2aWV3I3N0b3JhZ2UtYWNjb3VudC1uYW1lCiAgICAjIEs4cyBQVkMgbmFtZTogaHR0cHM6Ly9rdWJlcm5ldGVzLmlvL2RvY3MvY29uY2VwdHMvb3ZlcnZpZXcvd29ya2luZy13aXRoLW9iamVjdHMvbmFtZXMvI2Rucy1zdWJkb21haW4tbmFtZXMKICAgIHJlZ2V4Lm1hdGNoKGBeXC9cLyhbYS16MC05XXszLDI0fSlcLmZpbGVcLmNvcmVcLndpbmRvd3NcLm5ldFwvW2EtejAtOV0oW2EtejAtOS4tXXswLDI1MX1bYS16MC05XSk/JGAsIGlfc3RvcmFnZS5zb3VyY2UpCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDQ6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMTogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgIT0gIm92ZXJsYXlmcyIKICAgIHBfc3RvcmFnZS5vcHRpb25zID09IGlfc3RvcmFnZS5vcHRpb25zCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAxOiB0cnVlIikKfQphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIGNvdW50KHBfc3RvcmFnZS5vcHRpb25zKSA9PSAyCgogICAgcG9saWN5X2lkcyA6PSBzcGxpdChwX3N0b3JhZ2Uub3B0aW9uc1swXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBwb2xpY3lfaWRzID0iLCBwb2xpY3lfaWRzKQogICAgcG9saWN5X2lkcyA9PSBsYXllcl9pZHMKCiAgICBwb2xpY3lfaGFzaGVzIDo9IHNwbGl0KHBfc3RvcmFnZS5vcHRpb25zWzFdLCAiOiIpCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IHBvbGljeV9oYXNoZXMgPSIsIHBvbGljeV9oYXNoZXMpCgogICAgcF9jb3VudCA6PSBjb3VudChwb2xpY3lfaWRzKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBwX2NvdW50ID0iLCBwX2NvdW50KQogICAgcF9jb3VudCA+PSAxCiAgICBwX2NvdW50ID09IGNvdW50KHBvbGljeV9oYXNoZXMpCgogICAgaV9jb3VudCA6PSBjb3VudChpX3N0b3JhZ2Uub3B0aW9ucykKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogaV9jb3VudCA9IiwgaV9jb3VudCkKICAgIGlfY291bnQgPT0gcF9jb3VudCArIDMKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zWzBdID0iLCBpX3N0b3JhZ2Uub3B0aW9uc1swXSkKICAgIGlfc3RvcmFnZS5vcHRpb25zWzBdID09ICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQubGF5ZXItc3JjLXByZWZpeD0vdmFyL2xpYi9jb250YWluZXJkL2lvLmNvbnRhaW5lcmQuc25hcHNob3R0ZXIudjEudGFyZGV2L2xheWVycyIKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zW2lfY291bnQgLSAyXSA9IiwgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDJdKQogICAgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDJdID09ICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQub3ZlcmxheS1ydyIKCiAgICBsb3dlcmRpciA6PSBjb25jYXQoIj0iLCBbImxvd2VyZGlyIiwgcF9zdG9yYWdlLm9wdGlvbnNbMF1dKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBsb3dlcmRpciA9IiwgbG93ZXJkaXIpCgogICAgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDFdID09IGxvd2VyZGlyCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zW2lfY291bnQgLSAxXSA9IiwgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDFdKQoKICAgIGV2ZXJ5IGksIHBvbGljeV9pZCBpbiBwb2xpY3lfaWRzIHsKICAgICAgICBhbGxvd19vdmVybGF5X2xheWVyKHBvbGljeV9pZCwgcG9saWN5X2hhc2hlc1tpXSwgaV9zdG9yYWdlLm9wdGlvbnNbaSArIDFdKQogICAgfQoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogdHJ1ZSIpCn0KYWxsb3dfc3RvcmFnZV9vcHRpb25zKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKSB7CiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDM6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCiAgICBjb3VudChwX3N0b3JhZ2Uub3B0aW9ucykgPT0gMQoKICAgIHN0YXJ0c3dpdGgocF9zdG9yYWdlLm9wdGlvbnNbMF0sICIkKGhhc2giKQogICAgaGFzaF9zdWZmaXggOj0gdHJpbV9sZWZ0KHBfc3RvcmFnZS5vcHRpb25zWzBdLCAiJChoYXNoIikKCiAgICBlbmRzd2l0aChoYXNoX3N1ZmZpeCwgIikiKQogICAgaGFzaF9pbmRleCA6PSB0cmltX3JpZ2h0KGhhc2hfc3VmZml4LCAiKSIpCiAgICBpIDo9IHRvX251bWJlcihoYXNoX2luZGV4KQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAzOiBpID0iLCBpKQoKICAgIGhhc2hfb3B0aW9uIDo9IGNvbmNhdCgiPSIsIFsiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LnJvb3QtaGFzaCIsIHJvb3RfaGFzaGVzW2ldXSkKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMzogaGFzaF9vcHRpb24gPSIsIGhhc2hfb3B0aW9uKQoKICAgIGNvdW50KGlfc3RvcmFnZS5vcHRpb25zKSA9PSA0CiAgICBpX3N0b3JhZ2Uub3B0aW9uc1swXSA9PSAicm8iCiAgICBpX3N0b3JhZ2Uub3B0aW9uc1sxXSA9PSAiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmJsb2NrX2RldmljZT1maWxlIgogICAgaV9zdG9yYWdlLm9wdGlvbnNbMl0gPT0gImlvLmthdGFjb250YWluZXJzLmZzLW9wdC5pcy1sYXllciIKICAgIGlfc3RvcmFnZS5vcHRpb25zWzNdID09IGhhc2hfb3B0aW9uCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAzOiB0cnVlIikKfQphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgNDogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gInNtYiIKICAgIHBfb3B0c19jb3VudCA6PSBjb3VudChwX3N0b3JhZ2Uub3B0aW9ucykKICAgIGlfb3B0c19jb3VudCA6PSBjb3VudChpX3N0b3JhZ2Uub3B0aW9ucykKICAgIGlfb3B0c19jb3VudCA9PSBwX29wdHNfY291bnQgKyAyCgogICAgaV9vcHRfbWF0Y2hlcyA6PSBbaSB8IGkgOj0gaWR4OyBpZHggPCBwX29wdHNfY291bnQ7IHBfc3RvcmFnZS5vcHRpb25zW2lkeF0gPT0gaV9zdG9yYWdlLm9wdGlvbnNbaWR4XV0KICAgIGNvdW50KGlfb3B0X21hdGNoZXMpID09IHBfb3B0c19jb3VudAoKICAgIHN0YXJ0c3dpdGgoaV9zdG9yYWdlLm9wdGlvbnNbaV9vcHRzX2NvdW50LTJdLCAiYWRkcj0iKQogICAgY3JlZHMgPSBzcGxpdChpX3N0b3JhZ2Uub3B0aW9uc1tpX29wdHNfY291bnQtMV0sICIsIikKICAgIGNvdW50KGNyZWRzKSA9PSAyCiAgICBzdGFydHN3aXRoKGNyZWRzWzBdLCAidXNlcm5hbWU9IikKICAgIHN0YXJ0c3dpdGgoY3JlZHNbMV0sICJwYXNzd29yZD0iKQogICAgCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDQ6IHRydWUiKQp9CgphbGxvd19vdmVybGF5X2xheWVyKHBvbGljeV9pZCwgcG9saWN5X2hhc2gsIGlfb3B0aW9uKSB7CiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogcG9saWN5X2lkID0iLCBwb2xpY3lfaWQsICJwb2xpY3lfaGFzaCA9IiwgcG9saWN5X2hhc2gpCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogaV9vcHRpb24gPSIsIGlfb3B0aW9uKQoKICAgIHN0YXJ0c3dpdGgoaV9vcHRpb24sICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQubGF5ZXI9IikKICAgIGlfdmFsdWUgOj0gcmVwbGFjZShpX29wdGlvbiwgImlvLmthdGFjb250YWluZXJzLmZzLW9wdC5sYXllcj0iLCAiIikKICAgIGlfdmFsdWVfZGVjb2RlZCA6PSBiYXNlNjQuZGVjb2RlKGlfdmFsdWUpCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogaV92YWx1ZV9kZWNvZGVkID0iLCBpX3ZhbHVlX2RlY29kZWQpCgogICAgcG9saWN5X3N1ZmZpeCA6PSBjb25jYXQoIj0iLCBbInRhcixybyxpby5rYXRhY29udGFpbmVycy5mcy1vcHQuYmxvY2tfZGV2aWNlPWZpbGUsaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmlzLWxheWVyLGlvLmthdGFjb250YWluZXJzLmZzLW9wdC5yb290LWhhc2giLCBwb2xpY3lfaGFzaF0pCiAgICBwX3ZhbHVlIDo9IGNvbmNhdCgiLCIsIFtwb2xpY3lfaWQsIHBvbGljeV9zdWZmaXhdKQogICAgcHJpbnQoImFsbG93X292ZXJsYXlfbGF5ZXI6IHBfdmFsdWUgPSIsIHBfdmFsdWUpCgogICAgcF92YWx1ZSA9PSBpX3ZhbHVlX2RlY29kZWQKCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogdHJ1ZSIpCn0KCmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAidGFyIgoKICAgIHN0YXJ0c3dpdGgocF9zdG9yYWdlLm1vdW50X3BvaW50LCAiJChsYXllciIpCiAgICBtb3VudF9zdWZmaXggOj0gdHJpbV9sZWZ0KHBfc3RvcmFnZS5tb3VudF9wb2ludCwgIiQobGF5ZXIiKQoKICAgIGVuZHN3aXRoKG1vdW50X3N1ZmZpeCwgIikiKQogICAgbGF5ZXJfaW5kZXggOj0gdHJpbV9yaWdodChtb3VudF9zdWZmaXgsICIpIikKICAgIGkgOj0gdG9fbnVtYmVyKGxheWVyX2luZGV4KQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDE6IGkgPSIsIGkpCgogICAgbGF5ZXJfaWQgOj0gbGF5ZXJfaWRzW2ldCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMTogbGF5ZXJfaWQgPSIsIGxheWVyX2lkKQoKICAgIHBfbW91bnQgOj0gY29uY2F0KCIvIiwgWyIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L2xheWVycyIsIGxheWVyX2lkXSkKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCAxOiBwX21vdW50ID0iLCBwX21vdW50KQoKICAgIHBfbW91bnQgPT0gaV9zdG9yYWdlLm1vdW50X3BvaW50CgogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDE6IHRydWUiKQp9CmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAiZnVzZTMua2F0YS1vdmVybGF5IgoKICAgIG1vdW50MSA6PSByZXBsYWNlKHBfc3RvcmFnZS5tb3VudF9wb2ludCwgIiQoY3BhdGgpIiwgcG9saWN5X2RhdGEuY29tbW9uLmNwYXRoKQogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDI6IG1vdW50MiA9IiwgbW91bnQyKQoKICAgIG1vdW50MiA9PSBpX3N0b3JhZ2UubW91bnRfcG9pbnQKCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMjogdHJ1ZSIpCn0KYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKSB7CiAgICBwX3N0b3JhZ2UuZnN0eXBlID09ICJsb2NhbCIKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQyID0iLCBtb3VudDIpCgogICAgbW91bnQzIDo9IHJlcGxhY2UobW91bnQyLCAiJChzYW5kYm94LWlkKSIsIHNhbmRib3hfaWQpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQzID0iLCBtb3VudDMpCgogICAgcmVnZXgubWF0Y2gobW91bnQzLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCgogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDM6IHRydWUiKQp9CmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAiYmluZCIKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNDogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNDogbW91bnQyID0iLCBtb3VudDIpCgogICAgbW91bnQzIDo9IHJlcGxhY2UobW91bnQyLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDQ6IG1vdW50MyA9IiwgbW91bnQzKQoKICAgIHJlZ2V4Lm1hdGNoKG1vdW50MywgaV9zdG9yYWdlLm1vdW50X3BvaW50KQoKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA0OiB0cnVlIikKfQphbGxvd19tb3VudF9wb2ludChwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgYnVuZGxlX2lkLCBzYW5kYm94X2lkLCBsYXllcl9pZHMpIHsKICAgIHBfc3RvcmFnZS5mc3R5cGUgPT0gInRtcGZzIgoKICAgIG1vdW50MSA6PSBwX3N0b3JhZ2UubW91bnRfcG9pbnQKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA1OiBtb3VudDEgPSIsIG1vdW50MSkKCiAgICByZWdleC5tYXRjaChtb3VudDEsIGlfc3RvcmFnZS5tb3VudF9wb2ludCkKCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNTogdHJ1ZSIpCn0KYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKSB7CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogaV9zdG9yYWdlLm1vdW50X3BvaW50ID0iLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCiAgICBhbGxvd19kaXJlY3Rfdm9sX2RyaXZlcihwX3N0b3JhZ2UsIGlfc3RvcmFnZSkKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChzcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQyID0iLCBtb3VudDIpCgogICAgZGlyZWN0X3ZvbF9wYXRoIDo9IGlfc3RvcmFnZS5zb3VyY2UKICAgIG1vdW50MyA6PSByZXBsYWNlKG1vdW50MiwgIiQoYjY0LWRpcmVjdC12b2wtcGF0aCkiLCBiYXNlNjR1cmwuZW5jb2RlKGRpcmVjdF92b2xfcGF0aCkpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQzID0iLCBtb3VudDMpCgogICAgbW91bnQzID09IGlfc3RvcmFnZS5tb3VudF9wb2ludAoKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA2OiB0cnVlIikKfQoKYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIocF9zdG9yYWdlLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19kaXJlY3Rfdm9sX2RyaXZlciAxOiBzdGFydCIpCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCiAgICBwcmludCgiYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIgMTogdHJ1ZSIpCn0KYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIocF9zdG9yYWdlLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19kaXJlY3Rfdm9sX2RyaXZlciAyOiBzdGFydCIpCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJzbWIiCiAgICBwcmludCgiYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIgMjogdHJ1ZSIpCn0KCiMgRXhlY1Byb2Nlc3NSZXF1ZXN0LnByb2Nlc3MuQ2FwYWJpbGl0aWVzCmFsbG93X2V4ZWNfY2FwcyhpX2NhcHMpIHsKICAgIG5vdCBpX2NhcHMuQW1iaWVudAogICAgbm90IGlfY2Fwcy5Cb3VuZGluZwogICAgbm90IGlfY2Fwcy5FZmZlY3RpdmUKICAgIG5vdCBpX2NhcHMuSW5oZXJpdGFibGUKICAgIG5vdCBpX2NhcHMuUGVybWl0dGVkCn0KCiMgT0NJLlByb2Nlc3MuQ2FwYWJpbGl0aWVzCmFsbG93X2NhcHMocF9jYXBzLCBpX2NhcHMpIHsKICAgIHByaW50KCJhbGxvd19jYXBzOiBwb2xpY3kgQW1iaWVudCA9IiwgcF9jYXBzLkFtYmllbnQpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgQW1iaWVudCA9IiwgaV9jYXBzLkFtYmllbnQpCiAgICBtYXRjaF9jYXBzKHBfY2Fwcy5BbWJpZW50LCBpX2NhcHMuQW1iaWVudCkKCiAgICBwcmludCgiYWxsb3dfY2FwczogcG9saWN5IEJvdW5kaW5nID0iLCBwX2NhcHMuQm91bmRpbmcpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgQm91bmRpbmcgPSIsIGlfY2Fwcy5Cb3VuZGluZykKICAgIG1hdGNoX2NhcHMocF9jYXBzLkJvdW5kaW5nLCBpX2NhcHMuQm91bmRpbmcpCgogICAgcHJpbnQoImFsbG93X2NhcHM6IHBvbGljeSBFZmZlY3RpdmUgPSIsIHBfY2Fwcy5FZmZlY3RpdmUpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgRWZmZWN0aXZlID0iLCBpX2NhcHMuRWZmZWN0aXZlKQogICAgbWF0Y2hfY2FwcyhwX2NhcHMuRWZmZWN0aXZlLCBpX2NhcHMuRWZmZWN0aXZlKQoKICAgIHByaW50KCJhbGxvd19jYXBzOiBwb2xpY3kgSW5oZXJpdGFibGUgPSIsIHBfY2Fwcy5Jbmhlcml0YWJsZSkKICAgIHByaW50KCJhbGxvd19jYXBzOiBpbnB1dCBJbmhlcml0YWJsZSA9IiwgaV9jYXBzLkluaGVyaXRhYmxlKQogICAgbWF0Y2hfY2FwcyhwX2NhcHMuSW5oZXJpdGFibGUsIGlfY2Fwcy5Jbmhlcml0YWJsZSkKCiAgICBwcmludCgiYWxsb3dfY2FwczogcG9saWN5IFBlcm1pdHRlZCA9IiwgcF9jYXBzLlBlcm1pdHRlZCkKICAgIHByaW50KCJhbGxvd19jYXBzOiBpbnB1dCBQZXJtaXR0ZWQgPSIsIGlfY2Fwcy5QZXJtaXR0ZWQpCiAgICBtYXRjaF9jYXBzKHBfY2Fwcy5QZXJtaXR0ZWQsIGlfY2Fwcy5QZXJtaXR0ZWQpCn0KCm1hdGNoX2NhcHMocF9jYXBzLCBpX2NhcHMpIHsKICAgIHByaW50KCJtYXRjaF9jYXBzIDE6IHN0YXJ0IikKCiAgICBwX2NhcHMgPT0gaV9jYXBzCgogICAgcHJpbnQoIm1hdGNoX2NhcHMgMTogdHJ1ZSIpCn0KbWF0Y2hfY2FwcyhwX2NhcHMsIGlfY2FwcykgewogICAgcHJpbnQoIm1hdGNoX2NhcHMgMjogc3RhcnQiKQoKICAgIGNvdW50KHBfY2FwcykgPT0gMQogICAgcF9jYXBzWzBdID09ICIkKGRlZmF1bHRfY2FwcykiCgogICAgcHJpbnQoIm1hdGNoX2NhcHMgMjogZGVmYXVsdF9jYXBzID0iLCBwb2xpY3lfZGF0YS5jb21tb24uZGVmYXVsdF9jYXBzKQogICAgcG9saWN5X2RhdGEuY29tbW9uLmRlZmF1bHRfY2FwcyA9PSBpX2NhcHMKCiAgICBwcmludCgibWF0Y2hfY2FwcyAyOiB0cnVlIikKfQptYXRjaF9jYXBzKHBfY2FwcywgaV9jYXBzKSB7CiAgICBwcmludCgibWF0Y2hfY2FwcyAzOiBzdGFydCIpCgogICAgY291bnQocF9jYXBzKSA9PSAxCiAgICBwX2NhcHNbMF0gPT0gIiQocHJpdmlsZWdlZF9jYXBzKSIKCiAgICBwcmludCgibWF0Y2hfY2FwcyAzOiBwcml2aWxlZ2VkX2NhcHMgPSIsIHBvbGljeV9kYXRhLmNvbW1vbi5wcml2aWxlZ2VkX2NhcHMpCiAgICBwb2xpY3lfZGF0YS5jb21tb24ucHJpdmlsZWdlZF9jYXBzID09IGlfY2FwcwoKICAgIHByaW50KCJtYXRjaF9jYXBzIDM6IHRydWUiKQp9CgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgpjaGVja19kaXJlY3RvcnlfdHJhdmVyc2FsKGlfcGF0aCkgewogICAgbm90IHJlZ2V4Lm1hdGNoKCIoXnwvKS4uKCR8LykiLCBpX3BhdGgpCn0KCmNoZWNrX3N5bWxpbmtfc291cmNlKGlfc3JjKSB7CiAgICBpX3NyYyA9PSAiIgogICAgcHJpbnQoImNoZWNrX3N5bWxpbmtfc291cmNlIDE6IHRydWUiKQp9CmNoZWNrX3N5bWxpbmtfc291cmNlKGlfc3JjKSB7CiAgICBpX3NyYyAhPSAiIgogICAgcHJpbnQoImNoZWNrX3N5bWxpbmtfc291cmNlIDI6IGlfc3JjID0iLCBpX3NyYykKCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24uc19zb3VyY2UxLCBpX3NyYykKCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMjogdHJ1ZSIpCn0KY2hlY2tfc3ltbGlua19zb3VyY2UoaV9zcmMpIHsKICAgIGlfc3JjICE9ICIiCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMzogaV9zcmMgPSIsIGlfc3JjKQoKICAgIHJlZ2V4Lm1hdGNoKHBvbGljeV9kYXRhLmNvbW1vbi5zX3NvdXJjZTIsIGlfc3JjKQogICAgY2hlY2tfZGlyZWN0b3J5X3RyYXZlcnNhbChpX3NyYykKCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMzogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfc3RvcmFnZXMoaV9zdG9yYWdlcykgewogICAgcHJpbnQoImFsbG93X3NhbmRib3hfc3RvcmFnZXM6IGlfc3RvcmFnZXMgPSIsIGlfc3RvcmFnZXMpCgogICAgcF9zdG9yYWdlcyA6PSBwb2xpY3lfZGF0YS5zYW5kYm94LnN0b3JhZ2VzCiAgICBldmVyeSBpX3N0b3JhZ2UgaW4gaV9zdG9yYWdlcyB7CiAgICAgICAgYWxsb3dfc2FuZGJveF9zdG9yYWdlKHBfc3RvcmFnZXMsIGlfc3RvcmFnZSkKICAgIH0KCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9zdG9yYWdlczogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfc3RvcmFnZShwX3N0b3JhZ2VzLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IGlfc3RvcmFnZSA9IiwgaV9zdG9yYWdlKQoKICAgIHNvbWUgcF9zdG9yYWdlIGluIHBfc3RvcmFnZXMKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IHBfc3RvcmFnZSA9IiwgcF9zdG9yYWdlKQogICAgaV9zdG9yYWdlID09IHBfc3RvcmFnZQoKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IHRydWUiKQp9CgpDb3B5RmlsZVJlcXVlc3QgewogICAgcHJpbnQoIkNvcHlGaWxlUmVxdWVzdDogaW5wdXQucGF0aCA9IiwgaW5wdXQucGF0aCkKCiAgICBjaGVja19zeW1saW5rX3NvdXJjZShpbnB1dC5zeW1saW5rX3NyYykKICAgIGNoZWNrX2RpcmVjdG9yeV90cmF2ZXJzYWwoaW5wdXQucGF0aCkKCiAgICBzb21lIHJlZ2V4MSBpbiBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLkNvcHlGaWxlUmVxdWVzdAogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5jcGF0aCkKICAgIHJlZ2V4NCA6PSByZXBsYWNlKHJlZ2V4MywgIiQoYnVuZGxlLWlkKSIsIEJVTkRMRV9JRCkKICAgIHByaW50KCJDb3B5RmlsZVJlcXVlc3Q6IHJlZ2V4NCA9IiwgcmVnZXg0KQoKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4NCwgaW5wdXQucGF0aCkKCiAgICBwcmludCgiQ29weUZpbGVSZXF1ZXN0OiB0cnVlIikKfQoKQ3JlYXRlU2FuZGJveFJlcXVlc3QgewogICAgcHJpbnQoIkNyZWF0ZVNhbmRib3hSZXF1ZXN0OiBpbnB1dC5ndWVzdF9ob29rX3BhdGggPSIsIGlucHV0Lmd1ZXN0X2hvb2tfcGF0aCkKICAgIGNvdW50KGlucHV0Lmd1ZXN0X2hvb2tfcGF0aCkgPT0gMAoKICAgIHByaW50KCJDcmVhdGVTYW5kYm94UmVxdWVzdDogaW5wdXQua2VybmVsX21vZHVsZXMgPSIsIGlucHV0Lmtlcm5lbF9tb2R1bGVzKQogICAgY291bnQoaW5wdXQua2VybmVsX21vZHVsZXMpID09IDAKCiAgICBpX3BpZG5zIDo9IGlucHV0LnNhbmRib3hfcGlkbnMKICAgIHByaW50KCJDcmVhdGVTYW5kYm94UmVxdWVzdDogaV9waWRucyA9IiwgaV9waWRucykKICAgIGlfcGlkbnMgPT0gZmFsc2UKICAgIGFsbG93X3NhbmRib3hfc3RvcmFnZXMoaW5wdXQuc3RvcmFnZXMpCn0KCmFsbG93X2V4ZWMocF9jb250YWluZXIsIGlfcHJvY2VzcykgewogICAgcHJpbnQoImFsbG93X2V4ZWM6IHN0YXJ0IikKCiAgICBwX29jaSA9IHBfY29udGFpbmVyLk9DSQogICAgcF9zX25hbWUgPSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc19uYW1lc3BhY2UgPSBnZXRfc3RhdGVfdmFsKCJuYW1lc3BhY2UiKQogICAgYWxsb3dfcHJvYmVfcHJvY2VzcyhwX29jaS5Qcm9jZXNzLCBpX3Byb2Nlc3MsIHBfc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfZXhlYzogdHJ1ZSIpCn0KCmFsbG93X2ludGVyYWN0aXZlX2V4ZWMocF9jb250YWluZXIsIGlfcHJvY2VzcykgewogICAgcHJpbnQoImFsbG93X2ludGVyYWN0aXZlX2V4ZWM6IHN0YXJ0IikKCiAgICBwX29jaSA9IHBfY29udGFpbmVyLk9DSQogICAgcF9zX25hbWUgPSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc19uYW1lc3BhY2UgPSBnZXRfc3RhdGVfdmFsKCJuYW1lc3BhY2UiKQogICAgYWxsb3dfaW50ZXJhY3RpdmVfcHJvY2VzcyhwX29jaS5Qcm9jZXNzLCBpX3Byb2Nlc3MsIHBfc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfaW50ZXJhY3RpdmVfZXhlYzogdHJ1ZSIpCn0KCiMgVE9ETzogc2hvdWxkIG90aGVyIEV4ZWNQcm9jZXNzUmVxdWVzdCBpbnB1dCBkYXRhIGZpZWxkcyBiZSB2YWxpZGF0ZWQgYXMgd2VsbD8KRXhlY1Byb2Nlc3NSZXF1ZXN0IHsKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMTogaW5wdXQgPSIsIGlucHV0KQoKICAgIHNvbWUgcF9jb21tYW5kIGluIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuRXhlY1Byb2Nlc3NSZXF1ZXN0LmFsbG93ZWRfY29tbWFuZHMKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMTogcF9jb21tYW5kID0iLCBwX2NvbW1hbmQpCiAgICBwX2NvbW1hbmQgPT0gaW5wdXQucHJvY2Vzcy5BcmdzCgogICAgIyBUT0RPOiBtYXRjaCBwX2NvbnRhaW5lcidzIElEIHdpdGggdGhlIGlucHV0IGNvbnRhaW5lcl9pZC4KICAgIHNvbWUgcF9jb250YWluZXIgaW4gcG9saWN5X2RhdGEuY29udGFpbmVycwogICAgYWxsb3dfaW50ZXJhY3RpdmVfZXhlYyhwX2NvbnRhaW5lciwgaW5wdXQucHJvY2VzcykKCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDE6IHRydWUiKQp9CkV4ZWNQcm9jZXNzUmVxdWVzdCB7CiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDI6IGlucHV0ID0iLCBpbnB1dCkKCiAgICAjIFRPRE86IG1hdGNoIGlucHV0IGNvbnRhaW5lciBJRCB3aXRoIGl0cyBjb3JyZXNwb25kaW5nIGNvbnRhaW5lci5leGVjX2NvbW1hbmRzLgogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBzb21lIHBfY29tbWFuZCBpbiBwX2NvbnRhaW5lci5leGVjX2NvbW1hbmRzCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDI6IHBfY29tbWFuZCA9IiwgcF9jb21tYW5kKQoKICAgICMgVE9ETzogc2hvdWxkIG90aGVyIGlucHV0IGRhdGEgZmllbGRzIGJlIHZhbGlkYXRlZCBhcyB3ZWxsPwogICAgcF9jb21tYW5kID09IGlucHV0LnByb2Nlc3MuQXJncwoKICAgIGFsbG93X2V4ZWMocF9jb250YWluZXIsIGlucHV0LnByb2Nlc3MpCgogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAyOiB0cnVlIikKfQpFeGVjUHJvY2Vzc1JlcXVlc3QgewogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAzOiBpbnB1dCA9IiwgaW5wdXQpCgogICAgaV9jb21tYW5kID0gY29uY2F0KCIgIiwgaW5wdXQucHJvY2Vzcy5BcmdzKQogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAzOiBpX2NvbW1hbmQgPSIsIGlfY29tbWFuZCkKCiAgICBzb21lIHBfcmVnZXggaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5FeGVjUHJvY2Vzc1JlcXVlc3QucmVnZXgKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMzogcF9yZWdleCA9IiwgcF9yZWdleCkKCiAgICByZWdleC5tYXRjaChwX3JlZ2V4LCBpX2NvbW1hbmQpCgogICAgIyBUT0RPOiBtYXRjaCBwX2NvbnRhaW5lcidzIElEIHdpdGggdGhlIGlucHV0IGNvbnRhaW5lcl9pZC4KICAgIHNvbWUgcF9jb250YWluZXIgaW4gcG9saWN5X2RhdGEuY29udGFpbmVycwogICAgYWxsb3dfaW50ZXJhY3RpdmVfZXhlYyhwX2NvbnRhaW5lciwgaW5wdXQucHJvY2VzcykKCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDM6IHRydWUiKQp9CgpVcGRhdGVSb3V0ZXNSZXF1ZXN0IHsKICAgIHByaW50KCJVcGRhdGVSb3V0ZXNSZXF1ZXN0OiBpbnB1dCA9IiwgaW5wdXQpCiAgICBwcmludCgiVXBkYXRlUm91dGVzUmVxdWVzdDogcG9saWN5ID0iLCBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLlVwZGF0ZVJvdXRlc1JlcXVlc3QpCgogICAgaV9yb3V0ZXMgOj0gaW5wdXQucm91dGVzLlJvdXRlcwogICAgcF9zb3VyY2VfcmVnZXggPSBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLlVwZGF0ZVJvdXRlc1JlcXVlc3QuZm9yYmlkZGVuX3NvdXJjZV9yZWdleAogICAgcF9uYW1lcyA9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuVXBkYXRlUm91dGVzUmVxdWVzdC5mb3JiaWRkZW5fZGV2aWNlX25hbWVzCgogICAgZXZlcnkgaV9yb3V0ZSBpbiBpX3JvdXRlcyB7CiAgICAgICAgcHJpbnQoImlfcm91dGUuc291cmNlID0iLCBpX3JvdXRlLnNvdXJjZSkKICAgICAgICBldmVyeSBwX3JlZ2V4IGluIHBfc291cmNlX3JlZ2V4IHsKICAgICAgICAgICAgcHJpbnQoInBfcmVnZXggPSIsIHBfcmVnZXgpCiAgICAgICAgICAgIG5vdCByZWdleC5tYXRjaChwX3JlZ2V4LCBpX3JvdXRlLnNvdXJjZSkKICAgICAgICB9CgogICAgICAgIHByaW50KCJpX3JvdXRlLmRldmljZSA9IiwgaV9yb3V0ZS5kZXZpY2UpCiAgICAgICAgbm90IGlfcm91dGUuZGV2aWNlIGluIHBfbmFtZXMKICAgIH0KCiAgICBwcmludCgiVXBkYXRlUm91dGVzUmVxdWVzdDogdHJ1ZSIpCn0KClVwZGF0ZUludGVyZmFjZVJlcXVlc3QgewogICAgcHJpbnQoIlVwZGF0ZUludGVyZmFjZVJlcXVlc3Q6IGlucHV0ID0iLCBpbnB1dCkKICAgIHByaW50KCJVcGRhdGVJbnRlcmZhY2VSZXF1ZXN0OiBwb2xpY3kgPSIsIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuVXBkYXRlSW50ZXJmYWNlUmVxdWVzdCkKCiAgICBpX2ludGVyZmFjZSA6PSBpbnB1dC5pbnRlcmZhY2UKICAgIHBfZmxhZ3MgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmFsbG93X3Jhd19mbGFncwoKICAgICMgVHlwaWNhbGx5LCBqdXN0IElGRl9OT0FSUCBpcyB1c2VkLgogICAgYml0cy5hbmQoaV9pbnRlcmZhY2UucmF3X2ZsYWdzLCBiaXRzLm5lZ2F0ZShwX2ZsYWdzKSkgPT0gMAoKICAgIHBfbmFtZXMgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmZvcmJpZGRlbl9uYW1lcwoKICAgIG5vdCBpX2ludGVyZmFjZS5uYW1lIGluIHBfbmFtZXMKCiAgICBwX2h3YWRkcnMgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmZvcmJpZGRlbl9od19hZGRycwoKICAgIG5vdCBpX2ludGVyZmFjZS5od0FkZHIgaW4gcF9od2FkZHJzCgogICAgcHJpbnQoIlVwZGF0ZUludGVyZmFjZVJlcXVlc3Q6IHRydWUiKQp9CgpDbG9zZVN0ZGluUmVxdWVzdCB7CiAgICBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLkNsb3NlU3RkaW5SZXF1ZXN0ID09IHRydWUKfQoKUmVhZFN0cmVhbVJlcXVlc3QgewogICAgcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5SZWFkU3RyZWFtUmVxdWVzdCA9PSB0cnVlCn0KClVwZGF0ZUVwaGVtZXJhbE1vdW50c1JlcXVlc3QgewogICAgcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVFcGhlbWVyYWxNb3VudHNSZXF1ZXN0ID09IHRydWUKfQoKV3JpdGVTdHJlYW1SZXF1ZXN0IHsKICAgIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuV3JpdGVTdHJlYW1SZXF1ZXN0ID09IHRydWUKfQoKcG9saWN5X2RhdGEgOj0gewogICJjb250YWluZXJzIjogWwogICAgewogICAgICAiT0NJIjogewogICAgICAgICJWZXJzaW9uIjogIjEuMS4wLXJjLjEiLAogICAgICAgICJQcm9jZXNzIjogewogICAgICAgICAgIlRlcm1pbmFsIjogZmFsc2UsCiAgICAgICAgICAiVXNlciI6IHsKICAgICAgICAgICAgIlVJRCI6IDY1NTM1LAogICAgICAgICAgICAiR0lEIjogNjU1MzUsCiAgICAgICAgICAgICJBZGRpdGlvbmFsR2lkcyI6IFtdLAogICAgICAgICAgICAiVXNlcm5hbWUiOiAiIgogICAgICAgICAgfSwKICAgICAgICAgICJEZXByZWNhdGVkQXJncyI6IFsKICAgICAgICAgICAgIi9wYXVzZSIKICAgICAgICAgIF0sCiAgICAgICAgICAiQXJncyI6IFsKICAgICAgICAgICAgIi9wYXVzZSIKICAgICAgICAgIF0sCiAgICAgICAgICAiRW52IjogWwogICAgICAgICAgICAiUEFUSD0vdXNyL2xvY2FsL3NiaW46L3Vzci9sb2NhbC9iaW46L3Vzci9zYmluOi91c3IvYmluOi9zYmluOi9iaW4iCiAgICAgICAgICBdLAogICAgICAgICAgIkN3ZCI6ICIvIiwKICAgICAgICAgICJDYXBhYmlsaXRpZXMiOiB7CiAgICAgICAgICAgICJBbWJpZW50IjogW10sCiAgICAgICAgICAgICJCb3VuZGluZyI6IFsKICAgICAgICAgICAgICAiJChkZWZhdWx0X2NhcHMpIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiRWZmZWN0aXZlIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJJbmhlcml0YWJsZSI6IFtdLAogICAgICAgICAgICAiUGVybWl0dGVkIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICAiTm9OZXdQcml2aWxlZ2VzIjogdHJ1ZQogICAgICAgIH0sCiAgICAgICAgIlJvb3QiOiB7CiAgICAgICAgICAiUGF0aCI6ICIkKGNwYXRoKS8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgIlJlYWRvbmx5IjogdHJ1ZQogICAgICAgIH0sCiAgICAgICAgIk1vdW50cyI6IFsKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9wcm9jIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJwcm9jIiwKICAgICAgICAgICAgInR5cGVfIjogInByb2MiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2IiwKICAgICAgICAgICAgInNvdXJjZSI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJzdHJpY3RhdGltZSIsCiAgICAgICAgICAgICAgIm1vZGU9NzU1IiwKICAgICAgICAgICAgICAic2l6ZT02NTUzNmsiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L3B0cyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiZGV2cHRzIiwKICAgICAgICAgICAgInR5cGVfIjogImRldnB0cyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJuZXdpbnN0YW5jZSIsCiAgICAgICAgICAgICAgInB0bXhtb2RlPTA2NjYiLAogICAgICAgICAgICAgICJtb2RlPTA2MjAiLAogICAgICAgICAgICAgICJnaWQ9NSIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvc2htIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L3NobSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi9tcXVldWUiLAogICAgICAgICAgICAic291cmNlIjogIm1xdWV1ZSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJtcXVldWUiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvc3lzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJzeXNmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJzeXNmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2V0Yy9yZXNvbHYuY29uZiIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClyZXNvbHYuY29uZiQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJvIiwKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9kZXYiLAogICAgICAgICAgICAgICJub2V4ZWMiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0KICAgICAgICBdLAogICAgICAgICJBbm5vdGF0aW9ucyI6IHsKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmJ1bmRsZV9wYXRoIjogIi9ydW4vY29udGFpbmVyZC9pby5jb250YWluZXJkLnJ1bnRpbWUudjIudGFzay9rOHMuaW8vJChidW5kbGUtaWQpIiwKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIjogInBvZF9zYW5kYm94IiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSI6ICJzYW5kYm94IiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWlkIjogIl5bYS16MC05XXs2NH0kIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWxvZy1kaXJlY3RvcnkiOiAiXi92YXIvbG9nL3BvZHMvJChzYW5kYm94LW5hbWVzcGFjZSlfJChzYW5kYm94LW5hbWUpX1swLTlhLWZdezh9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezEyfSQiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZXNwYWNlIjogIiIsCiAgICAgICAgICAibmVyZGN0bC9uZXR3b3JrLW5hbWVzcGFjZSI6ICJeL3Zhci9ydW4vbmV0bnMvY25pLVswLTlhLWZdezh9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezEyfSQiCiAgICAgICAgfSwKICAgICAgICAiTGludXgiOiB7CiAgICAgICAgICAiTmFtZXNwYWNlcyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICJUeXBlIjogImlwYyIsCiAgICAgICAgICAgICAgIlBhdGgiOiAiIgogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgIlR5cGUiOiAidXRzIiwKICAgICAgICAgICAgICAiUGF0aCI6ICIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiVHlwZSI6ICJtb3VudCIsCiAgICAgICAgICAgICAgIlBhdGgiOiAiIgogICAgICAgICAgICB9CiAgICAgICAgICBdLAogICAgICAgICAgIk1hc2tlZFBhdGhzIjogWwogICAgICAgICAgICAiL3Byb2MvYWNwaSIsCiAgICAgICAgICAgICIvcHJvYy9hc291bmQiLAogICAgICAgICAgICAiL3Byb2Mva2NvcmUiLAogICAgICAgICAgICAiL3Byb2Mva2V5cyIsCiAgICAgICAgICAgICIvcHJvYy9sYXRlbmN5X3N0YXRzIiwKICAgICAgICAgICAgIi9wcm9jL3RpbWVyX2xpc3QiLAogICAgICAgICAgICAiL3Byb2MvdGltZXJfc3RhdHMiLAogICAgICAgICAgICAiL3Byb2Mvc2NoZWRfZGVidWciLAogICAgICAgICAgICAiL3N5cy9maXJtd2FyZSIsCiAgICAgICAgICAgICIvcHJvYy9zY3NpIgogICAgICAgICAgXSwKICAgICAgICAgICJSZWFkb25seVBhdGhzIjogWwogICAgICAgICAgICAiL3Byb2MvYnVzIiwKICAgICAgICAgICAgIi9wcm9jL2ZzIiwKICAgICAgICAgICAgIi9wcm9jL2lycSIsCiAgICAgICAgICAgICIvcHJvYy9zeXMiLAogICAgICAgICAgICAiL3Byb2Mvc3lzcnEtdHJpZ2dlciIKICAgICAgICAgIF0sCiAgICAgICAgICAiRGV2aWNlcyI6IFtdLAogICAgICAgICAgIlN5c2N0bCI6IHsKICAgICAgICAgICAgIm5ldC5pcHY0LmlwX3VucHJpdmlsZWdlZF9wb3J0X3N0YXJ0IjogIjAiLAogICAgICAgICAgICAibmV0LmlwdjQucGluZ19ncm91cF9yYW5nZSI6ICIwIDIxNDc0ODM2NDciCiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9LAogICAgICAic3RvcmFnZXMiOiBbCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJibGsiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogInRhciIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIiQoaGFzaDApIgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGxheWVyMCkiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJvdmVybGF5ZnMiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogImZ1c2UzLmthdGEtb3ZlcmxheSIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIjVhNWFhZDgwMDU1ZmYyMDAxMmE1MGRjMjVmOGRmN2EyOTkyNDQ3NDMyNGQ2NWY3ZDUzMDZlZThlZTI3ZmY3MWQiLAogICAgICAgICAgICAiODE3MjUwZjFhM2UzMzZkYTc2ZjViZDNmYTc4NGUxYjI2ZDk1OWI5YzEzMTg3NjgxNWJhMjYwNDA0OGI3MGMxOCIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChjcGF0aCkvJChidW5kbGUtaWQpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9CiAgICAgIF0sCiAgICAgICJkZXZpY2VzIjogW10sCiAgICAgICJzYW5kYm94X3BpZG5zIjogZmFsc2UsCiAgICAgICJleGVjX2NvbW1hbmRzIjogW10sCiAgICAgICJlbnZfbWFwIjogewogICAgICAgICJQQVRIIjogIi91c3IvbG9jYWwvc2JpbjovdXNyL2xvY2FsL2JpbjovdXNyL3NiaW46L3Vzci9iaW46L3NiaW46L2JpbiIKICAgICAgfQogICAgfSwKICAgIHsKICAgICAgIk9DSSI6IHsKICAgICAgICAiVmVyc2lvbiI6ICIxLjEuMC1yYy4xIiwKICAgICAgICAiUHJvY2VzcyI6IHsKICAgICAgICAgICJUZXJtaW5hbCI6IGZhbHNlLAogICAgICAgICAgIlVzZXIiOiB7CiAgICAgICAgICAgICJVSUQiOiAwLAogICAgICAgICAgICAiR0lEIjogMCwKICAgICAgICAgICAgIkFkZGl0aW9uYWxHaWRzIjogW10sCiAgICAgICAgICAgICJVc2VybmFtZSI6ICIiCiAgICAgICAgICB9LAogICAgICAgICAgIkRlcHJlY2F0ZWRBcmdzIjogWwogICAgICAgICAgICAiL2Jpbi9zaCIsCiAgICAgICAgICAgICItZWMiLAogICAgICAgICAgICAiSE9TVE5BTUU9JChob3N0bmFtZSlcblxuIyBzdG9yZSBtZW1iZXIgaWQgaW50byBQVkMgZm9yIGxhdGVyIG1lbWJlciByZXBsYWNlbWVudFxuY29sbGVjdF9tZW1iZXIoKSB7XG4gICAgd2hpbGUgISBldGNkY3RsIG1lbWJlciBsaXN0ICY+L2Rldi9udWxsOyBkbyBzbGVlcCAxOyBkb25lXG4gICAgZXRjZGN0bCBtZW1iZXIgbGlzdCB8IGdyZXAgaHR0cDovLyR7SE9TVE5BTUV9LiR7U0VUX05BTUV9OjIzODAgfCBjdXQgLWQnOicgLWYxIHwgY3V0IC1kJ1snIC1mMSA+IC92YXIvcnVuL2V0Y2QvbWVtYmVyX2lkXG4gICAgZXhpdCAwXG59XG5cbmVwcygpIHtcbiAgICBFUFM9XCJcIlxuICAgIGZvciBpIGluICQoc2VxIDAgJCgoJHtJTklUSUFMX0NMVVNURVJfU0laRX0gLSAxKSkpOyBkb1xuICAgICAgICBFUFM9XCIke0VQU30ke0VQUzorLH1odHRwOi8vJHtTRVRfTkFNRX0tJHtpfS4ke1NFVF9OQU1FfToyMzc5XCJcbiAgICBkb25lXG4gICAgZWNobyAke0VQU31cbn1cblxubWVtYmVyX2hhc2goKSB7XG4gICAgZXRjZGN0bCBtZW1iZXIgbGlzdCB8IGdyZXAgaHR0cDovLyR7SE9TVE5BTUV9LiR7U0VUX05BTUV9OjIzODAgfCBjdXQgLWQnOicgLWYxIHwgY3V0IC1kJ1snIC1mMVxufVxuXG4jIHJlLWpvaW5pbmcgYWZ0ZXIgZmFpbHVyZT9cbmlmIFsgLWUgL3Zhci9ydW4vZXRjZC9kZWZhdWx0LmV0Y2QgXTsgdGhlblxuICAgIGVjaG8gXCJSZS1qb2luaW5nIGV0Y2QgbWVtYmVyXCJcbiAgICBtZW1iZXJfaWQ9JChjYXQgL3Zhci9ydW4vZXRjZC9tZW1iZXJfaWQpXG5cbiAgICAjIHJlLWpvaW4gbWVtYmVyXG4gICAgRVRDRENUTF9FTkRQT0lOVD0kKGVwcykgZXRjZGN0bCBtZW1iZXIgdXBkYXRlICR7bWVtYmVyX2lkfSBodHRwOi8vJHtIT1NUTkFNRX0uJHtTRVRfTkFNRX06MjM4MFxuICAgIGV4ZWMgZXRjZCAtLW5hbWUgJHtIT1NUTkFNRX0gXFxcbiAgICAgICAgLS1saXN0ZW4tcGVlci11cmxzIGh0dHA6Ly8ke0hPU1ROQU1FfS4ke1NFVF9OQU1FfToyMzgwIFxcXG4gICAgICAgIC0tbGlzdGVuLWNsaWVudC11cmxzIGh0dHA6Ly8ke0hPU1ROQU1FfS4ke1NFVF9OQU1FfToyMzc5LGh0dHA6Ly8xMjcuMC4wLjE6MjM3OSBcXFxuICAgICAgICAtLWFkdmVydGlzZS1jbGllbnQtdXJscyBodHRwOi8vJHtIT1NUTkFNRX0uJHtTRVRfTkFNRX06MjM3OSBcXFxuICAgICAgICAtLWRhdGEtZGlyIC92YXIvcnVuL2V0Y2QvZGVmYXVsdC5ldGNkXG5maVxuXG4jIGV0Y2QtU0VUX0lEXG5TRVRfSUQ9JHtIT1NUTkFNRTo1OiR7I0hPU1ROQU1FfX1cblxuIyBhZGRpbmcgYSBuZXcgbWVtYmVyIHRvIGV4aXN0aW5nIGNsdXN0ZXIgKGFzc3VtaW5nIGFsbCBpbml0aWFsIHBvZHMgYXJlIGF2YWlsYWJsZSlcbmlmIFsgXCIke1NFVF9JRH1cIiAtZ2UgJHtJTklUSUFMX0NMVVNURVJfU0laRX0gXTsgdGhlblxuICAgIGV4cG9ydCBFVENEQ1RMX0VORFBPSU5UPSQoZXBzKVxuXG4gICAgIyBtZW1iZXIgYWxyZWFkeSBhZGRlZD9cbiAgICBNRU1CRVJfSEFTSD0kKG1lbWJlcl9oYXNoKVxuICAgIGlmIFsgLW4gXCIke01FTUJFUl9IQVNIfVwiIF07IHRoZW5cbiAgICAgICAgIyB0aGUgbWVtYmVyIGhhc2ggZXhpc3RzIGJ1dCBmb3Igc29tZSByZWFzb24gZXRjZCBmYWlsZWRcbiAgICAgICAgIyBhcyB0aGUgZGF0YWRpciBoYXMgbm90IGJlIGNyZWF0ZWQsIHdlIGNhbiByZW1vdmUgdGhlIG1lbWJlclxuICAgICAgICAjIGFuZCByZXRyaWV2ZSBuZXcgaGFzaFxuICAgICAgICBldGNkY3RsIG1lbWJlciByZW1vdmUgJHtNRU1CRVJfSEFTSH1cbiAgICBmaVxuXG4gICAgZWNobyBcIkFkZGluZyBuZXcgbWVtYmVyXCJcbiAgICBldGNkY3RsIG1lbWJlciBhZGQgJHtIT1NUTkFNRX0gaHR0cDovLyR7SE9TVE5BTUV9LiR7U0VUX05BTUV9OjIzODAgfCBncmVwIFwiXkVUQ0RfXCIgPiAvdmFyL3J1bi9ldGNkL25ld19tZW1iZXJfZW52c1xuXG4gICAgaWYgWyAkPyAtbmUgMCBdOyB0aGVuXG4gICAgICAgIGVjaG8gXCJFeGl0aW5nXCJcbiAgICAgICAgcm0gLWYgL3Zhci9ydW4vZXRjZC9uZXdfbWVtYmVyX2VudnNcbiAgICAgICAgZXhpdCAxXG4gICAgZmlcblxuICAgIGNhdCAvdmFyL3J1bi9ldGNkL25ld19tZW1iZXJfZW52c1xuICAgIHNvdXJjZSAvdmFyL3J1bi9ldGNkL25ld19tZW1iZXJfZW52c1xuXG4gICAgY29sbGVjdF9tZW1iZXIgJlxuXG4gICAgZXhlYyBldGNkIC0tbmFtZSAke0hPU1ROQU1FfSBcXFxuICAgICAgICAtLWxpc3Rlbi1wZWVyLXVybHMgaHR0cDovLyR7SE9TVE5BTUV9LiR7U0VUX05BTUV9OjIzODAgXFxcbiAgICAgICAgLS1saXN0ZW4tY2xpZW50LXVybHMgaHR0cDovLyR7SE9TVE5BTUV9LiR7U0VUX05BTUV9OjIzNzksaHR0cDovLzEyNy4wLjAuMToyMzc5IFxcXG4gICAgICAgIC0tYWR2ZXJ0aXNlLWNsaWVudC11cmxzIGh0dHA6Ly8ke0hPU1ROQU1FfS4ke1NFVF9OQU1FfToyMzc5IFxcXG4gICAgICAgIC0tZGF0YS1kaXIgL3Zhci9ydW4vZXRjZC9kZWZhdWx0LmV0Y2QgXFxcbiAgICAgICAgLS1pbml0aWFsLWFkdmVydGlzZS1wZWVyLXVybHMgaHR0cDovLyR7SE9TVE5BTUV9LiR7U0VUX05BTUV9OjIzODAgXFxcbiAgICAgICAgLS1pbml0aWFsLWNsdXN0ZXIgJHtFVENEX0lOSVRJQUxfQ0xVU1RFUn0gXFxcbiAgICAgICAgLS1pbml0aWFsLWNsdXN0ZXItc3RhdGUgJHtFVENEX0lOSVRJQUxfQ0xVU1RFUl9TVEFURX1cbmZpXG5cbmZvciBpIGluICQoc2VxIDAgJCgoJHtJTklUSUFMX0NMVVNURVJfU0laRX0gLSAxKSkpOyBkb1xuICAgIHdoaWxlIHRydWU7IGRvXG4gICAgICAgIGVjaG8gXCJXYWl0aW5nIGZvciAke1NFVF9OQU1FfS0ke2l9LiR7U0VUX05BTUV9IHRvIGNvbWUgdXBcIlxuICAgICAgICBwaW5nIC1XIDEgLWMgMSAke1NFVF9OQU1FfS0ke2l9LiR7U0VUX05BTUV9ID4gL2Rldi9udWxsICYmIGJyZWFrXG4gICAgICAgIHNsZWVwIDFzXG4gICAgZG9uZVxuZG9uZVxuXG5QRUVSUz1cIlwiXG5mb3IgaSBpbiAkKHNlcSAwICQoKCR7SU5JVElBTF9DTFVTVEVSX1NJWkV9IC0gMSkpKTsgZG9cbiAgICBQRUVSUz1cIiR7UEVFUlN9JHtQRUVSUzorLH0ke1NFVF9OQU1FfS0ke2l9PWh0dHA6Ly8ke1NFVF9OQU1FfS0ke2l9LiR7U0VUX05BTUV9OjIzODBcIlxuZG9uZVxuXG5jb2xsZWN0X21lbWJlciAmXG5cbiMgam9pbiBtZW1iZXJcbmV4ZWMgZXRjZCAtLW5hbWUgJHtIT1NUTkFNRX0gXFxcbiAgICAtLWluaXRpYWwtYWR2ZXJ0aXNlLXBlZXItdXJscyBodHRwOi8vJHtIT1NUTkFNRX0uJHtTRVRfTkFNRX06MjM4MCBcXFxuICAgIC0tbGlzdGVuLXBlZXItdXJscyBodHRwOi8vJHtIT1NUTkFNRX0uJHtTRVRfTkFNRX06MjM4MCBcXFxuICAgIC0tbGlzdGVuLWNsaWVudC11cmxzIGh0dHA6Ly8ke0hPU1ROQU1FfS4ke1NFVF9OQU1FfToyMzc5LGh0dHA6Ly8xMjcuMC4wLjE6MjM3OSBcXFxuICAgIC0tYWR2ZXJ0aXNlLWNsaWVudC11cmxzIGh0dHA6Ly8ke0hPU1ROQU1FfS4ke1NFVF9OQU1FfToyMzc5IFxcXG4gICAgLS1pbml0aWFsLWNsdXN0ZXItdG9rZW4gZXRjZC1jbHVzdGVyLTEgXFxcbiAgICAtLWluaXRpYWwtY2x1c3RlciAke1BFRVJTfSBcXFxuICAgIC0taW5pdGlhbC1jbHVzdGVyLXN0YXRlIG5ldyBcXFxuICAgIC0tZGF0YS1kaXIgL3Zhci9ydW4vZXRjZC9kZWZhdWx0LmV0Y2RcbiIKICAgICAgICAgIF0sCiAgICAgICAgICAiQXJncyI6IFsKICAgICAgICAgICAgIi9iaW4vc2giLAogICAgICAgICAgICAiLWVjIiwKICAgICAgICAgICAgIkhPU1ROQU1FPSQoaG9zdG5hbWUpXG5cbiMgc3RvcmUgbWVtYmVyIGlkIGludG8gUFZDIGZvciBsYXRlciBtZW1iZXIgcmVwbGFjZW1lbnRcbmNvbGxlY3RfbWVtYmVyKCkge1xuICAgIHdoaWxlICEgZXRjZGN0bCBtZW1iZXIgbGlzdCAmPi9kZXYvbnVsbDsgZG8gc2xlZXAgMTsgZG9uZVxuICAgIGV0Y2RjdGwgbWVtYmVyIGxpc3QgfCBncmVwIGh0dHA6Ly8ke0hPU1ROQU1FfS4ke1NFVF9OQU1FfToyMzgwIHwgY3V0IC1kJzonIC1mMSB8IGN1dCAtZCdbJyAtZjEgPiAvdmFyL3J1bi9ldGNkL21lbWJlcl9pZFxuICAgIGV4aXQgMFxufVxuXG5lcHMoKSB7XG4gICAgRVBTPVwiXCJcbiAgICBmb3IgaSBpbiAkKHNlcSAwICQoKCR7SU5JVElBTF9DTFVTVEVSX1NJWkV9IC0gMSkpKTsgZG9cbiAgICAgICAgRVBTPVwiJHtFUFN9JHtFUFM6Kyx9aHR0cDovLyR7U0VUX05BTUV9LSR7aX0uJHtTRVRfTkFNRX06MjM3OVwiXG4gICAgZG9uZVxuICAgIGVjaG8gJHtFUFN9XG59XG5cbm1lbWJlcl9oYXNoKCkge1xuICAgIGV0Y2RjdGwgbWVtYmVyIGxpc3QgfCBncmVwIGh0dHA6Ly8ke0hPU1ROQU1FfS4ke1NFVF9OQU1FfToyMzgwIHwgY3V0IC1kJzonIC1mMSB8IGN1dCAtZCdbJyAtZjFcbn1cblxuIyByZS1qb2luaW5nIGFmdGVyIGZhaWx1cmU/XG5pZiBbIC1lIC92YXIvcnVuL2V0Y2QvZGVmYXVsdC5ldGNkIF07IHRoZW5cbiAgICBlY2hvIFwiUmUtam9pbmluZyBldGNkIG1lbWJlclwiXG4gICAgbWVtYmVyX2lkPSQoY2F0IC92YXIvcnVuL2V0Y2QvbWVtYmVyX2lkKVxuXG4gICAgIyByZS1qb2luIG1lbWJlclxuICAgIEVUQ0RDVExfRU5EUE9JTlQ9JChlcHMpIGV0Y2RjdGwgbWVtYmVyIHVwZGF0ZSAke21lbWJlcl9pZH0gaHR0cDovLyR7SE9TVE5BTUV9LiR7U0VUX05BTUV9OjIzODBcbiAgICBleGVjIGV0Y2QgLS1uYW1lICR7SE9TVE5BTUV9IFxcXG4gICAgICAgIC0tbGlzdGVuLXBlZXItdXJscyBodHRwOi8vJHtIT1NUTkFNRX0uJHtTRVRfTkFNRX06MjM4MCBcXFxuICAgICAgICAtLWxpc3Rlbi1jbGllbnQtdXJscyBodHRwOi8vJHtIT1NUTkFNRX0uJHtTRVRfTkFNRX06MjM3OSxodHRwOi8vMTI3LjAuMC4xOjIzNzkgXFxcbiAgICAgICAgLS1hZHZlcnRpc2UtY2xpZW50LXVybHMgaHR0cDovLyR7SE9TVE5BTUV9LiR7U0VUX05BTUV9OjIzNzkgXFxcbiAgICAgICAgLS1kYXRhLWRpciAvdmFyL3J1bi9ldGNkL2RlZmF1bHQuZXRjZFxuZmlcblxuIyBldGNkLVNFVF9JRFxuU0VUX0lEPSR7SE9TVE5BTUU6NTokeyNIT1NUTkFNRX19XG5cbiMgYWRkaW5nIGEgbmV3IG1lbWJlciB0byBleGlzdGluZyBjbHVzdGVyIChhc3N1bWluZyBhbGwgaW5pdGlhbCBwb2RzIGFyZSBhdmFpbGFibGUpXG5pZiBbIFwiJHtTRVRfSUR9XCIgLWdlICR7SU5JVElBTF9DTFVTVEVSX1NJWkV9IF07IHRoZW5cbiAgICBleHBvcnQgRVRDRENUTF9FTkRQT0lOVD0kKGVwcylcblxuICAgICMgbWVtYmVyIGFscmVhZHkgYWRkZWQ/XG4gICAgTUVNQkVSX0hBU0g9JChtZW1iZXJfaGFzaClcbiAgICBpZiBbIC1uIFwiJHtNRU1CRVJfSEFTSH1cIiBdOyB0aGVuXG4gICAgICAgICMgdGhlIG1lbWJlciBoYXNoIGV4aXN0cyBidXQgZm9yIHNvbWUgcmVhc29uIGV0Y2QgZmFpbGVkXG4gICAgICAgICMgYXMgdGhlIGRhdGFkaXIgaGFzIG5vdCBiZSBjcmVhdGVkLCB3ZSBjYW4gcmVtb3ZlIHRoZSBtZW1iZXJcbiAgICAgICAgIyBhbmQgcmV0cmlldmUgbmV3IGhhc2hcbiAgICAgICAgZXRjZGN0bCBtZW1iZXIgcmVtb3ZlICR7TUVNQkVSX0hBU0h9XG4gICAgZmlcblxuICAgIGVjaG8gXCJBZGRpbmcgbmV3IG1lbWJlclwiXG4gICAgZXRjZGN0bCBtZW1iZXIgYWRkICR7SE9TVE5BTUV9IGh0dHA6Ly8ke0hPU1ROQU1FfS4ke1NFVF9OQU1FfToyMzgwIHwgZ3JlcCBcIl5FVENEX1wiID4gL3Zhci9ydW4vZXRjZC9uZXdfbWVtYmVyX2VudnNcblxuICAgIGlmIFsgJD8gLW5lIDAgXTsgdGhlblxuICAgICAgICBlY2hvIFwiRXhpdGluZ1wiXG4gICAgICAgIHJtIC1mIC92YXIvcnVuL2V0Y2QvbmV3X21lbWJlcl9lbnZzXG4gICAgICAgIGV4aXQgMVxuICAgIGZpXG5cbiAgICBjYXQgL3Zhci9ydW4vZXRjZC9uZXdfbWVtYmVyX2VudnNcbiAgICBzb3VyY2UgL3Zhci9ydW4vZXRjZC9uZXdfbWVtYmVyX2VudnNcblxuICAgIGNvbGxlY3RfbWVtYmVyICZcblxuICAgIGV4ZWMgZXRjZCAtLW5hbWUgJHtIT1NUTkFNRX0gXFxcbiAgICAgICAgLS1saXN0ZW4tcGVlci11cmxzIGh0dHA6Ly8ke0hPU1ROQU1FfS4ke1NFVF9OQU1FfToyMzgwIFxcXG4gICAgICAgIC0tbGlzdGVuLWNsaWVudC11cmxzIGh0dHA6Ly8ke0hPU1ROQU1FfS4ke1NFVF9OQU1FfToyMzc5LGh0dHA6Ly8xMjcuMC4wLjE6MjM3OSBcXFxuICAgICAgICAtLWFkdmVydGlzZS1jbGllbnQtdXJscyBodHRwOi8vJHtIT1NUTkFNRX0uJHtTRVRfTkFNRX06MjM3OSBcXFxuICAgICAgICAtLWRhdGEtZGlyIC92YXIvcnVuL2V0Y2QvZGVmYXVsdC5ldGNkIFxcXG4gICAgICAgIC0taW5pdGlhbC1hZHZlcnRpc2UtcGVlci11cmxzIGh0dHA6Ly8ke0hPU1ROQU1FfS4ke1NFVF9OQU1FfToyMzgwIFxcXG4gICAgICAgIC0taW5pdGlhbC1jbHVzdGVyICR7RVRDRF9JTklUSUFMX0NMVVNURVJ9IFxcXG4gICAgICAgIC0taW5pdGlhbC1jbHVzdGVyLXN0YXRlICR7RVRDRF9JTklUSUFMX0NMVVNURVJfU1RBVEV9XG5maVxuXG5mb3IgaSBpbiAkKHNlcSAwICQoKCR7SU5JVElBTF9DTFVTVEVSX1NJWkV9IC0gMSkpKTsgZG9cbiAgICB3aGlsZSB0cnVlOyBkb1xuICAgICAgICBlY2hvIFwiV2FpdGluZyBmb3IgJHtTRVRfTkFNRX0tJHtpfS4ke1NFVF9OQU1FfSB0byBjb21lIHVwXCJcbiAgICAgICAgcGluZyAtVyAxIC1jIDEgJHtTRVRfTkFNRX0tJHtpfS4ke1NFVF9OQU1FfSA+IC9kZXYvbnVsbCAmJiBicmVha1xuICAgICAgICBzbGVlcCAxc1xuICAgIGRvbmVcbmRvbmVcblxuUEVFUlM9XCJcIlxuZm9yIGkgaW4gJChzZXEgMCAkKCgke0lOSVRJQUxfQ0xVU1RFUl9TSVpFfSAtIDEpKSk7IGRvXG4gICAgUEVFUlM9XCIke1BFRVJTfSR7UEVFUlM6Kyx9JHtTRVRfTkFNRX0tJHtpfT1odHRwOi8vJHtTRVRfTkFNRX0tJHtpfS4ke1NFVF9OQU1FfToyMzgwXCJcbmRvbmVcblxuY29sbGVjdF9tZW1iZXIgJlxuXG4jIGpvaW4gbWVtYmVyXG5leGVjIGV0Y2QgLS1uYW1lICR7SE9TVE5BTUV9IFxcXG4gICAgLS1pbml0aWFsLWFkdmVydGlzZS1wZWVyLXVybHMgaHR0cDovLyR7SE9TVE5BTUV9LiR7U0VUX05BTUV9OjIzODAgXFxcbiAgICAtLWxpc3Rlbi1wZWVyLXVybHMgaHR0cDovLyR7SE9TVE5BTUV9LiR7U0VUX05BTUV9OjIzODAgXFxcbiAgICAtLWxpc3Rlbi1jbGllbnQtdXJscyBodHRwOi8vJHtIT1NUTkFNRX0uJHtTRVRfTkFNRX06MjM3OSxodHRwOi8vMTI3LjAuMC4xOjIzNzkgXFxcbiAgICAtLWFkdmVydGlzZS1jbGllbnQtdXJscyBodHRwOi8vJHtIT1NUTkFNRX0uJHtTRVRfTkFNRX06MjM3OSBcXFxuICAgIC0taW5pdGlhbC1jbHVzdGVyLXRva2VuIGV0Y2QtY2x1c3Rlci0xIFxcXG4gICAgLS1pbml0aWFsLWNsdXN0ZXIgJHtQRUVSU30gXFxcbiAgICAtLWluaXRpYWwtY2x1c3Rlci1zdGF0ZSBuZXcgXFxcbiAgICAtLWRhdGEtZGlyIC92YXIvcnVuL2V0Y2QvZGVmYXVsdC5ldGNkXG4iCiAgICAgICAgICBdLAogICAgICAgICAgIkVudiI6IFsKICAgICAgICAgICAgIlBBVEg9L3Vzci9sb2NhbC9zYmluOi91c3IvbG9jYWwvYmluOi91c3Ivc2JpbjovdXNyL2Jpbjovc2JpbjovYmluIiwKICAgICAgICAgICAgIkhPU1ROQU1FPSQoaG9zdC1uYW1lKSIsCiAgICAgICAgICAgICJJTklUSUFMX0NMVVNURVJfU0laRT0zIiwKICAgICAgICAgICAgIlNFVF9OQU1FPWV0Y2QiCiAgICAgICAgICBdLAogICAgICAgICAgIkN3ZCI6ICIvIiwKICAgICAgICAgICJDYXBhYmlsaXRpZXMiOiB7CiAgICAgICAgICAgICJBbWJpZW50IjogW10sCiAgICAgICAgICAgICJCb3VuZGluZyI6IFsKICAgICAgICAgICAgICAiJChkZWZhdWx0X2NhcHMpIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiRWZmZWN0aXZlIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJJbmhlcml0YWJsZSI6IFtdLAogICAgICAgICAgICAiUGVybWl0dGVkIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICAiTm9OZXdQcml2aWxlZ2VzIjogZmFsc2UKICAgICAgICB9LAogICAgICAgICJSb290IjogewogICAgICAgICAgIlBhdGgiOiAiJChjcGF0aCkvJChidW5kbGUtaWQpIiwKICAgICAgICAgICJSZWFkb25seSI6IGZhbHNlCiAgICAgICAgfSwKICAgICAgICAiTW91bnRzIjogWwogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL3Byb2MiLAogICAgICAgICAgICAic291cmNlIjogInByb2MiLAogICAgICAgICAgICAidHlwZV8iOiAicHJvYyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYiLAogICAgICAgICAgICAic291cmNlIjogInRtcGZzIiwKICAgICAgICAgICAgInR5cGVfIjogInRtcGZzIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgInN0cmljdGF0aW1lIiwKICAgICAgICAgICAgICAibW9kZT03NTUiLAogICAgICAgICAgICAgICJzaXplPTY1NTM2ayIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvcHRzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJkZXZwdHMiLAogICAgICAgICAgICAidHlwZV8iOiAiZGV2cHRzIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAgICAgIm5ld2luc3RhbmNlIiwKICAgICAgICAgICAgICAicHRteG1vZGU9MDY2NiIsCiAgICAgICAgICAgICAgIm1vZGU9MDYyMCIsCiAgICAgICAgICAgICAgImdpZD01IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi9zaG0iLAogICAgICAgICAgICAic291cmNlIjogIi9ydW4va2F0YS1jb250YWluZXJzL3NhbmRib3gvc2htIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L21xdWV1ZSIsCiAgICAgICAgICAgICJzb3VyY2UiOiAibXF1ZXVlIiwKICAgICAgICAgICAgInR5cGVfIjogIm1xdWV1ZSIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9zeXMiLAogICAgICAgICAgICAic291cmNlIjogInN5c2ZzIiwKICAgICAgICAgICAgInR5cGVfIjogInN5c2ZzIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAgICAgIm5vZGV2IiwKICAgICAgICAgICAgICAicm8iCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvc3lzL2ZzL2Nncm91cCIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiY2dyb3VwIiwKICAgICAgICAgICAgInR5cGVfIjogImNncm91cCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIsCiAgICAgICAgICAgICAgInJlbGF0aW1lIiwKICAgICAgICAgICAgICAicm8iCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZXRjL2hvc3RzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KWhvc3RzJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJydyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvdGVybWluYXRpb24tbG9nIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KXRlcm1pbmF0aW9uLWxvZyQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicnciCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZXRjL2hvc3RuYW1lIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KWhvc3RuYW1lJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJydyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9ldGMvcmVzb2x2LmNvbmYiLAogICAgICAgICAgICAic291cmNlIjogIiQoc2ZwcmVmaXgpcmVzb2x2LmNvbmYkIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJ3IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL3Zhci9ydW4vc2VjcmV0cy9rdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50IiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KXNlcnZpY2VhY2NvdW50JCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJybyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi92YXIvcnVuL3NlY3JldHMvYXp1cmUvdG9rZW5zIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KXRva2VucyQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicm8iCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvdmFyL3J1bi9ldGNkIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KWV0Y2QkIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJ3IgogICAgICAgICAgICBdCiAgICAgICAgICB9CiAgICAgICAgXSwKICAgICAgICAiQW5ub3RhdGlvbnMiOiB7CiAgICAgICAgICAiaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5idW5kbGVfcGF0aCI6ICIvcnVuL2NvbnRhaW5lcmQvaW8uY29udGFpbmVyZC5ydW50aW1lLnYyLnRhc2svazhzLmlvLyQoYnVuZGxlLWlkKSIsCiAgICAgICAgICAiaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5jb250YWluZXJfdHlwZSI6ICJwb2RfY29udGFpbmVyIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItbmFtZSI6ICJldGNkIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSI6ICJjb250YWluZXIiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLmltYWdlLW5hbWUiOiAicmVnaXN0cnkuazhzLmlvL2V0Y2Q6My4yLjI0IiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWlkIjogIl5bYS16MC05XXs2NH0kIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LW5hbWVzcGFjZSI6ICIiCiAgICAgICAgfSwKICAgICAgICAiTGludXgiOiB7CiAgICAgICAgICAiTmFtZXNwYWNlcyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICJUeXBlIjogImlwYyIsCiAgICAgICAgICAgICAgIlBhdGgiOiAiIgogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgIlR5cGUiOiAidXRzIiwKICAgICAgICAgICAgICAiUGF0aCI6ICIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiVHlwZSI6ICJtb3VudCIsCiAgICAgICAgICAgICAgIlBhdGgiOiAiIgogICAgICAgICAgICB9CiAgICAgICAgICBdLAogICAgICAgICAgIk1hc2tlZFBhdGhzIjogWwogICAgICAgICAgICAiL3Byb2MvYWNwaSIsCiAgICAgICAgICAgICIvcHJvYy9rY29yZSIsCiAgICAgICAgICAgICIvcHJvYy9rZXlzIiwKICAgICAgICAgICAgIi9wcm9jL2xhdGVuY3lfc3RhdHMiLAogICAgICAgICAgICAiL3Byb2MvdGltZXJfbGlzdCIsCiAgICAgICAgICAgICIvcHJvYy90aW1lcl9zdGF0cyIsCiAgICAgICAgICAgICIvcHJvYy9zY2hlZF9kZWJ1ZyIsCiAgICAgICAgICAgICIvcHJvYy9zY3NpIiwKICAgICAgICAgICAgIi9zeXMvZmlybXdhcmUiCiAgICAgICAgICBdLAogICAgICAgICAgIlJlYWRvbmx5UGF0aHMiOiBbCiAgICAgICAgICAgICIvcHJvYy9hc291bmQiLAogICAgICAgICAgICAiL3Byb2MvYnVzIiwKICAgICAgICAgICAgIi9wcm9jL2ZzIiwKICAgICAgICAgICAgIi9wcm9jL2lycSIsCiAgICAgICAgICAgICIvcHJvYy9zeXMiLAogICAgICAgICAgICAiL3Byb2Mvc3lzcnEtdHJpZ2dlciIKICAgICAgICAgIF0sCiAgICAgICAgICAiRGV2aWNlcyI6IFtdLAogICAgICAgICAgIlN5c2N0bCI6IHsKICAgICAgICAgICAgIm5ldC5pcHY0LmlwX3VucHJpdmlsZWdlZF9wb3J0X3N0YXJ0IjogIjAiLAogICAgICAgICAgICAibmV0LmlwdjQucGluZ19ncm91cF9yYW5nZSI6ICIwIDIxNDc0ODM2NDciCiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9LAogICAgICAic3RvcmFnZXMiOiBbCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJibGsiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogInRhciIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIiQoaGFzaDApIgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGxheWVyMCkiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJibGsiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogInRhciIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIiQoaGFzaDEpIgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGxheWVyMSkiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJibGsiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogInRhciIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIiQoaGFzaDIpIgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGxheWVyMikiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJvdmVybGF5ZnMiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogImZ1c2UzLmthdGEtb3ZlcmxheSIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgImRjNTNkNTI2Y2NlNGJmMmE5NzYxOWNjMjhhNjdjNzJkYjk3OGFmYmM2NzI3MzZkZjlkMTA0ZTBkYTk1ZGUwNWM6ODQ2NDgzMmIyZDYzOWIwZmEyZjg4MDcxYmViYWM5NDZjYjBmMzMyMTA3OGU0ZTAxZDIwY2Q4ZjA0NTc2YjI3ZDozMzFkNDZiMmJmNGNjOGNjMzlhZDc0ODUzMzE1ZTRiNDU5ZWRhM2RlZDdmYTc2NDNkNDM5YzU3MjA2ZGExMzkwIiwKICAgICAgICAgICAgImI5ZDY1NmRiN2UyYWRlZjQyOGFlNmE5OTQ0ZDc3N2QyNDYzOGVhNjg4ZWMzOGQxOThjZWYyYzZlMjE2ZjQ0ZTg6YjAwNTY2YjczODFmMTYzZjQyNjM4MjQyYTg2ZTUxOTkzZjQ4NDI3NTI2MTJkNzliNmJlN2Q2YTdiNWQxZmRmNTpkYWJmYTgzMzNjZDhiMDM4ZDJiYjY0MjQ3MTdjNjkyMjE4ODJkMjdhMjdjZTM2Yzk5ZDY2MGY2MTkwMmQwMDM4IgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGNwYXRoKS8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0KICAgICAgXSwKICAgICAgImRldmljZXMiOiBbXSwKICAgICAgInNhbmRib3hfcGlkbnMiOiBmYWxzZSwKICAgICAgImV4ZWNfY29tbWFuZHMiOiBbCiAgICAgICAgWwogICAgICAgICAgIi9iaW4vc2giLAogICAgICAgICAgIi1lYyIsCiAgICAgICAgICAiRVBTPVwiXCJcbmZvciBpIGluICQoc2VxIDAgJCgoJHtJTklUSUFMX0NMVVNURVJfU0laRX0gLSAxKSkpOyBkb1xuICAgIEVQUz1cIiR7RVBTfSR7RVBTOissfWh0dHA6Ly8ke1NFVF9OQU1FfS0ke2l9LiR7U0VUX05BTUV9OjIzNzlcIlxuZG9uZVxuXG5IT1NUTkFNRT0kKGhvc3RuYW1lKVxuXG5tZW1iZXJfaGFzaCgpIHtcbiAgICBldGNkY3RsIG1lbWJlciBsaXN0IHwgZ3JlcCBodHRwOi8vJHtIT1NUTkFNRX0uJHtTRVRfTkFNRX06MjM4MCB8IGN1dCAtZCc6JyAtZjEgfCBjdXQgLWQnWycgLWYxXG59XG5cbmVjaG8gXCJSZW1vdmluZyAke0hPU1ROQU1FfSBmcm9tIGV0Y2QgY2x1c3RlclwiXG5cbkVUQ0RDVExfRU5EUE9JTlQ9JHtFUFN9IGV0Y2RjdGwgbWVtYmVyIHJlbW92ZSAkKG1lbWJlcl9oYXNoKVxuaWYgWyAkPyAtZXEgMCBdOyB0aGVuXG4gICAgIyBSZW1vdmUgZXZlcnl0aGluZyBvdGhlcndpc2UgdGhlIGNsdXN0ZXIgd2lsbCBubyBsb25nZXIgc2NhbGUtdXBcbiAgICBybSAtcmYgL3Zhci9ydW4vZXRjZC8qXG5maVxuIgogICAgICAgIF0KICAgICAgXSwKICAgICAgImVudl9tYXAiOiB7CiAgICAgICAgIkhPU1ROQU1FIjogIiQoaG9zdC1uYW1lKSIsCiAgICAgICAgIklOSVRJQUxfQ0xVU1RFUl9TSVpFIjogIjMiLAogICAgICAgICJQQVRIIjogIi91c3IvbG9jYWwvc2JpbjovdXNyL2xvY2FsL2JpbjovdXNyL3NiaW46L3Vzci9iaW46L3NiaW46L2JpbiIsCiAgICAgICAgIlNFVF9OQU1FIjogImV0Y2QiCiAgICAgIH0KICAgIH0KICBdLAogICJjb21tb24iOiB7CiAgICAiY3BhdGgiOiAiL3J1bi9rYXRhLWNvbnRhaW5lcnMvc2hhcmVkL2NvbnRhaW5lcnMiLAogICAgIm1vdW50X3NvdXJjZV9jcGF0aCI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zaGFyZWQvY29udGFpbmVycyIsCiAgICAic2ZwcmVmaXgiOiAiXiQoY3BhdGgpLyQoYnVuZGxlLWlkKS1bYS16MC05XXsxNn0tIiwKICAgICJzcGF0aCI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L3N0b3JhZ2UiLAogICAgImlwdjRfYSI6ICIoKFswLTldfFsxLTldWzAtOV18MVswLTldezJ9fDJbMC00XVswLTldfDI1WzAtNV0pXFwuKXszfShbMC05XXxbMS05XVswLTldfDFbMC05XXsyfXwyWzAtNF1bMC05XXwyNVswLTVdKSIsCiAgICAiaXBfcCI6ICJbMC05XXsxLDV9IiwKICAgICJzdmNfbmFtZSI6ICJbQS1aX1xcLlxcLV0rIiwKICAgICJkbnNfbGFiZWwiOiAiW2EtekEtWjAtOV9cXC5cXC1dKyIsCiAgICAic19zb3VyY2UxIjogIl4uLjJbMC05XXszfV9bMC0xXVswLTldX1swLTNdWzAtOV1fWzAtMl1bMC05XV9bMC01XVswLTldX1swLTVdWzAtOV1cXC5bMC05XXsxLDEwfSQiLAogICAgInNfc291cmNlMiI6ICJeLi5kYXRhLyIsCiAgICAiZG5zX3N1YmRvbWFpbiI6ICJeW2EtejAtOV0oWy1hLXowLTldKlthLXowLTldKT8kIiwKICAgICJwb2RfdWlkIjogIl5bMC05YS1mQS1GXXs4fS1bMC05YS1mQS1GXXs0fS1bMC05YS1mQS1GXXs0fS1bMC05YS1mQS1GXXs0fS1bMC05YS1mQS1GXXsxMn0kIiwKICAgICJkZWZhdWx0X2NhcHMiOiBbCiAgICAgICJDQVBfQ0hPV04iLAogICAgICAiQ0FQX0RBQ19PVkVSUklERSIsCiAgICAgICJDQVBfRlNFVElEIiwKICAgICAgIkNBUF9GT1dORVIiLAogICAgICAiQ0FQX01LTk9EIiwKICAgICAgIkNBUF9ORVRfUkFXIiwKICAgICAgIkNBUF9TRVRHSUQiLAogICAgICAiQ0FQX1NFVFVJRCIsCiAgICAgICJDQVBfU0VURkNBUCIsCiAgICAgICJDQVBfU0VUUENBUCIsCiAgICAgICJDQVBfTkVUX0JJTkRfU0VSVklDRSIsCiAgICAgICJDQVBfU1lTX0NIUk9PVCIsCiAgICAgICJDQVBfS0lMTCIsCiAgICAgICJDQVBfQVVESVRfV1JJVEUiCiAgICBdLAogICAgInByaXZpbGVnZWRfY2FwcyI6IFsKICAgICAgIkNBUF9DSE9XTiIsCiAgICAgICJDQVBfREFDX09WRVJSSURFIiwKICAgICAgIkNBUF9EQUNfUkVBRF9TRUFSQ0giLAogICAgICAiQ0FQX0ZPV05FUiIsCiAgICAgICJDQVBfRlNFVElEIiwKICAgICAgIkNBUF9LSUxMIiwKICAgICAgIkNBUF9TRVRHSUQiLAogICAgICAiQ0FQX1NFVFVJRCIsCiAgICAgICJDQVBfU0VUUENBUCIsCiAgICAgICJDQVBfTElOVVhfSU1NVVRBQkxFIiwKICAgICAgIkNBUF9ORVRfQklORF9TRVJWSUNFIiwKICAgICAgIkNBUF9ORVRfQlJPQURDQVNUIiwKICAgICAgIkNBUF9ORVRfQURNSU4iLAogICAgICAiQ0FQX05FVF9SQVciLAogICAgICAiQ0FQX0lQQ19MT0NLIiwKICAgICAgIkNBUF9JUENfT1dORVIiLAogICAgICAiQ0FQX1NZU19NT0RVTEUiLAogICAgICAiQ0FQX1NZU19SQVdJTyIsCiAgICAgICJDQVBfU1lTX0NIUk9PVCIsCiAgICAgICJDQVBfU1lTX1BUUkFDRSIsCiAgICAgICJDQVBfU1lTX1BBQ0NUIiwKICAgICAgIkNBUF9TWVNfQURNSU4iLAogICAgICAiQ0FQX1NZU19CT09UIiwKICAgICAgIkNBUF9TWVNfTklDRSIsCiAgICAgICJDQVBfU1lTX1JFU09VUkNFIiwKICAgICAgIkNBUF9TWVNfVElNRSIsCiAgICAgICJDQVBfU1lTX1RUWV9DT05GSUciLAogICAgICAiQ0FQX01LTk9EIiwKICAgICAgIkNBUF9MRUFTRSIsCiAgICAgICJDQVBfQVVESVRfV1JJVEUiLAogICAgICAiQ0FQX0FVRElUX0NPTlRST0wiLAogICAgICAiQ0FQX1NFVEZDQVAiLAogICAgICAiQ0FQX01BQ19PVkVSUklERSIsCiAgICAgICJDQVBfTUFDX0FETUlOIiwKICAgICAgIkNBUF9TWVNMT0ciLAogICAgICAiQ0FQX1dBS0VfQUxBUk0iLAogICAgICAiQ0FQX0JMT0NLX1NVU1BFTkQiLAogICAgICAiQ0FQX0FVRElUX1JFQUQiLAogICAgICAiQ0FQX1BFUkZNT04iLAogICAgICAiQ0FQX0JQRiIsCiAgICAgICJDQVBfQ0hFQ0tQT0lOVF9SRVNUT1JFIgogICAgXSwKICAgICJ2aXJ0aW9fYmxrX3N0b3JhZ2VfY2xhc3NlcyI6IFsKICAgICAgImNjLWxvY2FsLWNzaSIsCiAgICAgICJjYy1tYW5hZ2VkLWNzaSIsCiAgICAgICJjYy1tYW5hZ2VkLXByZW1pdW0tY3NpIgogICAgXSwKICAgICJzbWJfc3RvcmFnZV9jbGFzc2VzIjogWwogICAgICB7CiAgICAgICAgIm5hbWUiOiAiYXp1cmVmaWxlLWNzaS1rYXRhLWNjIiwKICAgICAgICAibW91bnRfb3B0aW9ucyI6IFsKICAgICAgICAgICJkaXJfbW9kZT0wNzc3IiwKICAgICAgICAgICJmaWxlX21vZGU9MDc3NyIsCiAgICAgICAgICAibWZzeW1saW5rcyIsCiAgICAgICAgICAiY2FjaGU9c3RyaWN0IiwKICAgICAgICAgICJub3NoYXJlc29jayIsCiAgICAgICAgICAiYWN0aW1lbz0zMCIsCiAgICAgICAgICAibm9icmwiCiAgICAgICAgXQogICAgICB9CiAgICBdCiAgfSwKICAic2FuZGJveCI6IHsKICAgICJzdG9yYWdlcyI6IFsKICAgICAgewogICAgICAgICJkcml2ZXIiOiAiZXBoZW1lcmFsIiwKICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAic291cmNlIjogInNobSIsCiAgICAgICAgImZzdHlwZSI6ICJ0bXBmcyIsCiAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgIm5vZGV2IiwKICAgICAgICAgICJtb2RlPTE3NzciLAogICAgICAgICAgInNpemU9NjcxMDg4NjQiCiAgICAgICAgXSwKICAgICAgICAibW91bnRfcG9pbnQiOiAiL3J1bi9rYXRhLWNvbnRhaW5lcnMvc2FuZGJveC9zaG0iLAogICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgfQogICAgXQogIH0sCiAgInJlcXVlc3RfZGVmYXVsdHMiOiB7CiAgICAiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdCI6IHsKICAgICAgImFsbG93X2Vudl9yZWdleCI6IFsKICAgICAgICAiXkhPU1ROQU1FPSQoZG5zX2xhYmVsKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfUE9SVF8kKGlwX3ApX1RDUD10Y3A6Ly8kKGlwdjRfYSk6JChpcF9wKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfUE9SVF8kKGlwX3ApX1RDUF9QUk9UTz10Y3AkIiwKICAgICAgICAiXiQoc3ZjX25hbWUpX1BPUlRfJChpcF9wKV9UQ1BfUE9SVD0kKGlwX3ApJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9QT1JUXyQoaXBfcClfVENQX0FERFI9JChpcHY0X2EpJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9TRVJWSUNFX0hPU1Q9JChpcHY0X2EpJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9TRVJWSUNFX1BPUlQ9JChpcF9wKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfU0VSVklDRV9QT1JUXyQoZG5zX2xhYmVsKT0kKGlwX3ApJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9QT1JUPXRjcDovLyQoaXB2NF9hKTokKGlwX3ApJCIsCiAgICAgICAgIl5BWlVSRV9DTElFTlRfSUQ9W0EtRmEtZjAtOS1dKiQiLAogICAgICAgICJeQVpVUkVfVEVOQU5UX0lEPVtBLUZhLWYwLTktXSokIiwKICAgICAgICAiXkFaVVJFX0ZFREVSQVRFRF9UT0tFTl9GSUxFPS92YXIvcnVuL3NlY3JldHMvYXp1cmUvdG9rZW5zL2F6dXJlLWlkZW50aXR5LXRva2VuJCIsCiAgICAgICAgIl5BWlVSRV9BVVRIT1JJVFlfSE9TVD1odHRwczovL2xvZ2luXFwubWljcm9zb2Z0b25saW5lXFwuY29tLyQiLAogICAgICAgICJeVEVSTT14dGVybSQiCiAgICAgIF0sCiAgICAgICJhbGxvd19lbnZfcmVnZXhfbWFwIjogewogICAgICAgICJDUFVfTElNSVQiOiAiXlswLTldKyQiLAogICAgICAgICJKT0JfQ09NUExFVElPTl9JTkRFWCI6ICJeWzAtOV0qJCIsCiAgICAgICAgIk1FTU9SWV9MSU1JVCI6ICJeWzAtOV0rJCIKICAgICAgfQogICAgfSwKICAgICJDb3B5RmlsZVJlcXVlc3QiOiBbCiAgICAgICIkKHNmcHJlZml4KSIKICAgIF0sCiAgICAiRXhlY1Byb2Nlc3NSZXF1ZXN0IjogewogICAgICAiYWxsb3dlZF9jb21tYW5kcyI6IFtdLAogICAgICAicmVnZXgiOiBbXQogICAgfSwKICAgICJVcGRhdGVSb3V0ZXNSZXF1ZXN0IjogewogICAgICAiZm9yYmlkZGVuX2RldmljZV9uYW1lcyI6IFsKICAgICAgICAibG8iCiAgICAgIF0sCiAgICAgICJmb3JiaWRkZW5fc291cmNlX3JlZ2V4IjogWwogICAgICAgICJeKD86MHswLDR9Oil7MCw3fTB7MCwzfTEkIiwKICAgICAgICAiXjEyN1xcLig/OlswLTldezEsM31cXC4pezJ9WzAtOV17MSwzfSQiCiAgICAgIF0KICAgIH0sCiAgICAiVXBkYXRlSW50ZXJmYWNlUmVxdWVzdCI6IHsKICAgICAgImFsbG93X3Jhd19mbGFncyI6IDEyOCwKICAgICAgImZvcmJpZGRlbl9uYW1lcyI6IFsKICAgICAgICAibG8iCiAgICAgIF0sCiAgICAgICJmb3JiaWRkZW5faHdfYWRkcnMiOiBbCiAgICAgICAgIjAwOjAwOjAwOjAwOjAwOjAwIgogICAgICBdCiAgICB9LAogICAgIkNsb3NlU3RkaW5SZXF1ZXN0IjogZmFsc2UsCiAgICAiUmVhZFN0cmVhbVJlcXVlc3QiOiBmYWxzZSwKICAgICJVcGRhdGVFcGhlbWVyYWxNb3VudHNSZXF1ZXN0IjogZmFsc2UsCiAgICAiV3JpdGVTdHJlYW1SZXF1ZXN0IjogZmFsc2UKICB9Cn0= + spec: + runtimeClassName: kata-cc + containers: + - name: etcd + image: "registry.k8s.io/etcd:3.2.24" + imagePullPolicy: Always + volumeMounts: + - mountPath: /var/run/etcd + name: datadir + env: + - name: INITIAL_CLUSTER_SIZE + value: "3" + - name: SET_NAME + value: etcd + resources: + requests: + cpu: 100m + memory: 512Mi + ports: + - containerPort: 2380 + name: peer + - containerPort: 2379 + name: client + command: + - /bin/sh + - "-ec" + - "HOSTNAME=$(hostname)\n\n# store member id into PVC for later member replacement\ncollect_member() {\n while ! etcdctl member list &>/dev/null; do sleep 1; done\n etcdctl member list | grep http://${HOSTNAME}.${SET_NAME}:2380 | cut -d':' -f1 | cut -d'[' -f1 > /var/run/etcd/member_id\n exit 0\n}\n\neps() {\n EPS=\"\"\n for i in $(seq 0 $((${INITIAL_CLUSTER_SIZE} - 1))); do\n EPS=\"${EPS}${EPS:+,}http://${SET_NAME}-${i}.${SET_NAME}:2379\"\n done\n echo ${EPS}\n}\n\nmember_hash() {\n etcdctl member list | grep http://${HOSTNAME}.${SET_NAME}:2380 | cut -d':' -f1 | cut -d'[' -f1\n}\n\n# re-joining after failure?\nif [ -e /var/run/etcd/default.etcd ]; then\n echo \"Re-joining etcd member\"\n member_id=$(cat /var/run/etcd/member_id)\n\n # re-join member\n ETCDCTL_ENDPOINT=$(eps) etcdctl member update ${member_id} http://${HOSTNAME}.${SET_NAME}:2380\n exec etcd --name ${HOSTNAME} \\\n --listen-peer-urls http://${HOSTNAME}.${SET_NAME}:2380 \\\n --listen-client-urls http://${HOSTNAME}.${SET_NAME}:2379,http://127.0.0.1:2379 \\\n --advertise-client-urls http://${HOSTNAME}.${SET_NAME}:2379 \\\n --data-dir /var/run/etcd/default.etcd\nfi\n\n# etcd-SET_ID\nSET_ID=${HOSTNAME:5:${#HOSTNAME}}\n\n# adding a new member to existing cluster (assuming all initial pods are available)\nif [ \"${SET_ID}\" -ge ${INITIAL_CLUSTER_SIZE} ]; then\n export ETCDCTL_ENDPOINT=$(eps)\n\n # member already added?\n MEMBER_HASH=$(member_hash)\n if [ -n \"${MEMBER_HASH}\" ]; then\n # the member hash exists but for some reason etcd failed\n # as the datadir has not be created, we can remove the member\n # and retrieve new hash\n etcdctl member remove ${MEMBER_HASH}\n fi\n\n echo \"Adding new member\"\n etcdctl member add ${HOSTNAME} http://${HOSTNAME}.${SET_NAME}:2380 | grep \"^ETCD_\" > /var/run/etcd/new_member_envs\n\n if [ $? -ne 0 ]; then\n echo \"Exiting\"\n rm -f /var/run/etcd/new_member_envs\n exit 1\n fi\n\n cat /var/run/etcd/new_member_envs\n source /var/run/etcd/new_member_envs\n\n collect_member &\n\n exec etcd --name ${HOSTNAME} \\\n --listen-peer-urls http://${HOSTNAME}.${SET_NAME}:2380 \\\n --listen-client-urls http://${HOSTNAME}.${SET_NAME}:2379,http://127.0.0.1:2379 \\\n --advertise-client-urls http://${HOSTNAME}.${SET_NAME}:2379 \\\n --data-dir /var/run/etcd/default.etcd \\\n --initial-advertise-peer-urls http://${HOSTNAME}.${SET_NAME}:2380 \\\n --initial-cluster ${ETCD_INITIAL_CLUSTER} \\\n --initial-cluster-state ${ETCD_INITIAL_CLUSTER_STATE}\nfi\n\nfor i in $(seq 0 $((${INITIAL_CLUSTER_SIZE} - 1))); do\n while true; do\n echo \"Waiting for ${SET_NAME}-${i}.${SET_NAME} to come up\"\n ping -W 1 -c 1 ${SET_NAME}-${i}.${SET_NAME} > /dev/null && break\n sleep 1s\n done\ndone\n\nPEERS=\"\"\nfor i in $(seq 0 $((${INITIAL_CLUSTER_SIZE} - 1))); do\n PEERS=\"${PEERS}${PEERS:+,}${SET_NAME}-${i}=http://${SET_NAME}-${i}.${SET_NAME}:2380\"\ndone\n\ncollect_member &\n\n# join member\nexec etcd --name ${HOSTNAME} \\\n --initial-advertise-peer-urls http://${HOSTNAME}.${SET_NAME}:2380 \\\n --listen-peer-urls http://${HOSTNAME}.${SET_NAME}:2380 \\\n --listen-client-urls http://${HOSTNAME}.${SET_NAME}:2379,http://127.0.0.1:2379 \\\n --advertise-client-urls http://${HOSTNAME}.${SET_NAME}:2379 \\\n --initial-cluster-token etcd-cluster-1 \\\n --initial-cluster ${PEERS} \\\n --initial-cluster-state new \\\n --data-dir /var/run/etcd/default.etcd\n" + lifecycle: + preStop: + exec: + command: + - /bin/sh + - "-ec" + - "EPS=\"\"\nfor i in $(seq 0 $((${INITIAL_CLUSTER_SIZE} - 1))); do\n EPS=\"${EPS}${EPS:+,}http://${SET_NAME}-${i}.${SET_NAME}:2379\"\ndone\n\nHOSTNAME=$(hostname)\n\nmember_hash() {\n etcdctl member list | grep http://${HOSTNAME}.${SET_NAME}:2380 | cut -d':' -f1 | cut -d'[' -f1\n}\n\necho \"Removing ${HOSTNAME} from etcd cluster\"\n\nETCDCTL_ENDPOINT=${EPS} etcdctl member remove $(member_hash)\nif [ $? -eq 0 ]; then\n # Remove everything otherwise the cluster will no longer scale-up\n rm -rf /var/run/etcd/*\nfi\n" + volumeClaimTemplates: + - metadata: + name: datadir + spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi diff --git a/src/agent/samples/policy/yaml/kubernetes/conformance/hello-populator-deploy.yaml b/src/agent/samples/policy/yaml/kubernetes/conformance/hello-populator-deploy.yaml new file mode 100644 index 000000000000..d7c4426af18b --- /dev/null +++ b/src/agent/samples/policy/yaml/kubernetes/conformance/hello-populator-deploy.yaml @@ -0,0 +1,107 @@ +--- +apiVersion: v1 +kind: Namespace +metadata: + name: hello +--- +apiVersion: v1 +kind: ServiceAccount +metadata: + name: hello-account + namespace: hello +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + name: hello-role +rules: + - apiGroups: + - "" + resources: + - persistentvolumes + verbs: + - get + - list + - watch + - patch + - apiGroups: + - "" + resources: + - persistentvolumeclaims + verbs: + - get + - list + - watch + - patch + - create + - delete + - apiGroups: + - "" + resources: + - pods + verbs: + - get + - list + - watch + - create + - delete + - apiGroups: + - storage.k8s.io + resources: + - storageclasses + verbs: + - get + - list + - watch + - apiGroups: + - hello.example.com + resources: + - hellos + verbs: + - get + - list + - watch +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + name: hello-binding +subjects: + - kind: ServiceAccount + name: hello-account + namespace: hello +roleRef: + kind: ClusterRole + name: hello-role + apiGroup: rbac.authorization.k8s.io +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: hello-populator + namespace: hello +spec: + selector: + matchLabels: + app: hello + template: + metadata: + labels: + app: hello + annotations: + io.katacontainers.config.agent.policy: IyBDb3B5cmlnaHQgKGMpIDIwMjMgTWljcm9zb2Z0IENvcnBvcmF0aW9uCiMKIyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMAojCnBhY2thZ2UgYWdlbnRfcG9saWN5CgppbXBvcnQgZnV0dXJlLmtleXdvcmRzLmluCmltcG9ydCBmdXR1cmUua2V5d29yZHMuZXZlcnkKCiMgRGVmYXVsdCB2YWx1ZXMsIHJldHVybmVkIGJ5IE9QQSB3aGVuIHJ1bGVzIGNhbm5vdCBiZSBldmFsdWF0ZWQgdG8gdHJ1ZS4KZGVmYXVsdCBBZGRBUlBOZWlnaGJvcnNSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgQWRkU3dhcFJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBDbG9zZVN0ZGluUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IENvcHlGaWxlUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IENyZWF0ZUNvbnRhaW5lclJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBDcmVhdGVTYW5kYm94UmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IERlc3Ryb3lTYW5kYm94UmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgRXhlY1Byb2Nlc3NSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgR2V0T09NRXZlbnRSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBHdWVzdERldGFpbHNSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBMaXN0SW50ZXJmYWNlc1JlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBMaXN0Um91dGVzUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IE1lbUhvdHBsdWdCeVByb2JlUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IE9ubGluZUNQVU1lbVJlcXVlc3QgOj0gdHJ1ZQpkZWZhdWx0IFBhdXNlQ29udGFpbmVyUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFJlYWRTdHJlYW1SZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgUmVtb3ZlQ29udGFpbmVyUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgUmVtb3ZlU3RhbGVWaXJ0aW9mc1NoYXJlTW91bnRzUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgUmVzZWVkUmFuZG9tRGV2UmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFJlc3VtZUNvbnRhaW5lclJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBTZXRHdWVzdERhdGVUaW1lUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFNldFBvbGljeVJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBTaWduYWxQcm9jZXNzUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgU3RhcnRDb250YWluZXJSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBTdGFydFRyYWNpbmdSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgU3RhdHNDb250YWluZXJSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBTdG9wVHJhY2luZ1JlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBUdHlXaW5SZXNpemVSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBVcGRhdGVDb250YWluZXJSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgVXBkYXRlRXBoZW1lcmFsTW91bnRzUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFVwZGF0ZUludGVyZmFjZVJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBVcGRhdGVSb3V0ZXNSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgV2FpdFByb2Nlc3NSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBXcml0ZVN0cmVhbVJlcXVlc3QgOj0gZmFsc2UKCiMgQWxsb3dSZXF1ZXN0c0ZhaWxpbmdQb2xpY3kgOj0gdHJ1ZSBjb25maWd1cmVzIHRoZSBBZ2VudCB0byAqYWxsb3cgYW55CiMgcmVxdWVzdHMgY2F1c2luZyBhIHBvbGljeSBmYWlsdXJlKi4gVGhpcyBpcyBhbiB1bnNlY3VyZSBjb25maWd1cmF0aW9uCiMgYnV0IGlzIHVzZWZ1bCBmb3IgYWxsb3dpbmcgdW5zZWN1cmUgcG9kcyB0byBzdGFydCwgdGhlbiBjb25uZWN0IHRvCiMgdGhlbSBhbmQgaW5zcGVjdCBPUEEgbG9ncyBmb3IgdGhlIHJvb3QgY2F1c2Ugb2YgYSBmYWlsdXJlLgpkZWZhdWx0IEFsbG93UmVxdWVzdHNGYWlsaW5nUG9saWN5IDo9IGZhbHNlCgojIENvbnN0YW50cwpTX05BTUVfS0VZID0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZSIKU19OQU1FU1BBQ0VfS0VZID0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZXNwYWNlIgpCVU5ETEVfSUQgPSAiW2EtejAtOV17NjR9IgoKQ3JlYXRlQ29udGFpbmVyUmVxdWVzdDo9IHJlc3AgewogICAgbm90IGlzX251bGwoaW5wdXQuZW52X21hcCkKICAgIAogICAgaV9lbnZfbWFwIDo9IGlucHV0LmVudl9tYXAKICAgIAogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBwX2Vudl9tYXAgOj0gcF9jb250YWluZXIuZW52X21hcCAgCiAgICBhbGxvd19lbnZfbWFwKHBfZW52X21hcCwgaV9lbnZfbWFwKQogICAgCiAgICBpX3Byb2Nlc3MgOj0gaW5wdXQuYmFzZS5PQ0kuUHJvY2VzcwogICAgCiAgICBwX3Byb2Nlc3MgOj0gcF9jb250YWluZXIuT0NJLlByb2Nlc3MKICAgIAogICAgYWxsb3dfYXJncyhpX3Byb2Nlc3MsIHBfcHJvY2VzcywgaV9lbnZfbWFwKQoKICAgIHJlc3AgPSBDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uKGlucHV0LmJhc2UpCiAgICBwcmludCgiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdDogdHJ1ZSIpCn0KCmFsbG93X2FyZ3MoaV9wcm9jZXNzLCBwX3Byb2Nlc3MsIGlfZW52X21hcCkgewogICAgaV9hcmdzIDo9IGlfcHJvY2Vzcy5BcmdzCiAgICBwX2FyZ3MgOj0gcF9wcm9jZXNzLkFyZ3MKICAgIHByaW50KCJhbGxvd19hcmdzOiBpX2FyZ3MgPSIsIGlfYXJncywgInBfYXJncyA9IiwgcF9hcmdzKQogICAgY291bnQoaV9hcmdzKSA9PSBjb3VudChwX2FyZ3MpCiAgICBldmVyeSBpLCBpX2FyZyBpbiBpX2FyZ3MgewogICAgICAgIHByaW50KCJhbGxvd19hcmdzOiBpX2FyZyA9IiwgaV9hcmcpCiAgICAgICAgcF9hcmdfcmVwbGFjZWQgOj0gcmVwbGFjZV9lbnZfdmFyaWFibGVzKHBfYXJnc1tpXSwgaV9lbnZfbWFwKQogICAgICAgIHByaW50KCJhbGxvd19hcmdzOiBwX2FyZ19yZXBsYWNlZCA9IiwgcF9hcmdfcmVwbGFjZWQpCiAgICAgICAgcF9hcmdfcmVwbGFjZWQyIDo9IHJlcGxhY2UocF9hcmdfcmVwbGFjZWQsICIkJCIsICIkIikKICAgICAgICBwcmludCgiYWxsb3dfYXJnczogcF9hcmdfcmVwbGFjZWQyID0iLCBwX2FyZ19yZXBsYWNlZDIpCiAgICAgICAgaV9hcmcgPT0gcF9hcmdfcmVwbGFjZWQyCiAgICB9CiAgICBwcmludCgiYWxsb3dfYXJnczogdHJ1ZSIpCn0KCmFsbG93X2FyZ3MoaV9wcm9jZXNzLCBwX3Byb2Nlc3MsIGlfZW52X21hcCkgewogICAgbm90IGlfcHJvY2Vzcy5BcmdzCiAgICBub3QgcF9wcm9jZXNzLkFyZ3MKICAgIHByaW50KCJhbGxvd19hcmdzMjogbm8gYXJncyIpCn0KCiMgdGhpcyBmdW5jdGlvbiByZXBsYWNlcyBhbGwgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyBpbiBhIHN0cmluZywgZ2l2ZW4gYSBtYXAgb2YgZW52aXJvbm1lbnQga2V5cyB0byBlbnZpcm9ubWVudCB2YWx1ZXMKIyBlZyBzdHIgPSAiZWNobyAkKENMVVNURVJfSUQpOyBlY2hvICQoTk9ERV9OQU1FKTsiCiMgZW52X21hcCA9IHsiQ0xVU1RFUl9JRCI6ICJhYmMiLCAiTk9ERV9OQU1FIiA6ICJ4eXoifQojIHJlc3VsdCA9ICJlY2hvIGFiYzsgZWNobyB4eXo7IgpyZXBsYWNlX2Vudl92YXJpYWJsZXMoc3RyLCBlbnZfbWFwKSA9IHJlc3VsdCB7CiAgICAjIG1ha2UgYW4gYXJyYXkgb2YgdGhlIGtleXMgZWcgWyJDTFVTVEVSX0lEIiwgIk5PREVfTkFNRSJdCiAgICBrZXlzIDo9IFt4IHwgc29tZSB4IGluIG9iamVjdC5rZXlzKGVudl9tYXApXQogICAgcmVzdWx0IDo9IHJlcGxhY2Vfc3RyX3JlYyhzdHIsIGVudl9tYXAsIGtleXMsIGNvdW50KGtleXMpIC0gMSkKfQoKIyBiYXNlIGNhc2UKcmVwbGFjZV9zdHJfcmVjKHN0ciwgZW52X21hcCwgYXJyX2tleXMsIGkpID0gcmVzdWx0IHsKICAgIGkgPCAwCiAgICByZXN1bHQgOj0gc3RyCn0KCiMgcmVjdXJzaXZlIHN0ZXAKcmVwbGFjZV9zdHJfcmVjKHN0ciwgZW52X21hcCwgYXJyX2tleXMsIGkpID0gcmVzdWx0IHsKICAgIGkgPj0gMAogICAga2V5IDo9IGFycl9rZXlzW2ldCiAgICBlbnZfa2V5MSA6PSBjb25jYXQoIiIsIFsiJCgiLCBrZXksICIpIl0pCiAgICAjIHJlcGxhY2UgJChWQVIpIHdpdGggdmFsdWUKICAgIG5ld19zdHIxIDo9IHJlcGxhY2Uoc3RyLCBlbnZfa2V5MSwgZW52X21hcFtrZXldKQogICAgIyByZXBsYWNlIG5leHQgZW52aXJvbm1lbnQgdmFyaWFibGUKICAgIHJlc3VsdCA9IHJlcGxhY2Vfc3RyX3JlYyhuZXdfc3RyMSwgZW52X21hcCwgYXJyX2tleXMsIGkgLSAxKQp9CgphbGxvd19lbnZfbWFwKHBfZW52X21hcCwgaV9lbnZfbWFwKSB7CiAgICBwcmludCgiYWxsb3dfZW52X21hcDogcF9lbnZfbWFwID0iLCBwX2Vudl9tYXApCiAgICBldmVyeSBlbnZfa2V5LCBlbnZfdmFsIGluIGlfZW52X21hcCB7CiAgICAgICAgcHJpbnQoImFsbG93X2VudjogZW52X2tleSA9IiwgZW52X2tleSwgImVudl92YWwgPSIsIGVudl92YWwpCiAgICAgICAgYWxsb3dfZW52X21hcF9lbnRyeShlbnZfa2V5LCBlbnZfdmFsLCBwX2Vudl9tYXApCiAgICB9CiAgICBwcmludCgiYWxsb3dfZW52X21hcDogdHJ1ZSIpCn0KCiMgQWxsb3cgZXhhY3QgbWF0Y2gKYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBpX3ZhbCA9PSBwX3ZhbAogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnk6IHRydWUiKQp9CgojIEFsbG93IHJlc291cmNlRmllbGRSZWYgdmFsdWVzIChlLmcuLCAibGltaXRzLmNwdSIpLgphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgICMgYSB2YXJpYWJsZSB3ZSBzaG91bGQgYmUgdmFsaWRhdGluZyB1c2luZyBhIHJlZ2V4IGZyb20gc2V0dGluZ3MKICAgIHBfdmFsID09ICIkKHZhbGlkYXRlLWZyb20tc2V0dGluZ3MpIgogICAgcmVnZXhfdmFsIDo9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuQ3JlYXRlQ29udGFpbmVyUmVxdWVzdC5hbGxvd19lbnZfcmVnZXhfbWFwW2tleV0KICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4X3ZhbCwgaV92YWwpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSAyOiB0cnVlIikKfQoKIyBBbGxvdyBub2RlLW5hbWUKYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChub2RlLW5hbWUpIgogICAgcmVnZXgubWF0Y2gocG9saWN5X2RhdGEuY29tbW9uLmRuc19zdWJkb21haW4gLCBpX3ZhbCkKICAgIHByaW50KCJhbGxvd19lbnZfbWFwX2VudHJ5IDM6IHRydWUiKQp9CgojIEFsbG93IGhvc3QtbmFtZQphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgIHBfdmFsID09ICIkKGhvc3QtbmFtZSkiCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24uZG5zX2xhYmVsICwgaV92YWwpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSA0OiB0cnVlIikKfQoKIyBBbGxvdyBwb2QtdWlkCmFsbG93X2Vudl9tYXBfZW50cnkoa2V5LCBpX3ZhbCwgcF9lbnZfbWFwKSB7CiAgICBwX3ZhbCA6PSBwX2Vudl9tYXBba2V5XQogICAgcF92YWwgPT0gIiQocG9kLXVpZCkiCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24ucG9kX3VpZCAsIGlfdmFsKQogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgNTogdHJ1ZSIpCn0KCiMgQWxsb3cgZmllbGRSZWYgImZpZWxkUGF0aDogc3RhdHVzLnBvZElQIiB2YWx1ZXMuCmFsbG93X2Vudl9tYXBfZW50cnkoa2V5LCBpX3ZhbCwgcF9lbnZfbWFwKSB7CiAgICBpc19pcChpX3ZhbCkKCiAgICBwX3ZhbCA6PSBwX2Vudl9tYXBba2V5XQogICAgcF92YXIgOj0gY29uY2F0KCI9IiwgW2tleSwgcF92YWxdKQogICAgYWxsb3dfcG9kX2lwX3ZhcihrZXksIHBfdmFyKQogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgNjogdHJ1ZSIpCn0KCiMgQWxsb3cgZmllbGRSZWYgImZpZWxkUGF0aDogc3RhdHVzLmhvc3RJUCIgdmFsdWVzLgphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgaXNfaXAoaV92YWwpCgogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgIHBfdmFyIDo9IGNvbmNhdCgiPSIsIFtrZXksIHBfdmFsXSkKICAgIGFsbG93X2hvc3RfaXBfdmFyKGtleSwgcF92YXIpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSA3OiB0cnVlIikKfQoKIyBNYXRjaCBpbnB1dCB3aXRoIG9uZSBvZiB0aGUgcG9saWN5IHZhcmlhYmxlcywgYWZ0ZXIgc3Vic3RpdHV0aW5nICQoc2FuZGJveC1uYW1lKS4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChzYW5kYm94LW5hbWUpIgogICAgc19uYW1lIDo9IGlucHV0LmJhc2UuT0NJLkFubm90YXRpb25zW1NfTkFNRV9LRVldCiAgICBwX3ZhcjIgOj0gcmVwbGFjZShwX3ZhbCwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHBfdmFyMiA9PSBpX3ZhbAogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgODogdHJ1ZSIpCn0KCiMgTWF0Y2ggaW5wdXQgd2l0aCBvbmUgb2YgdGhlIHBvbGljeSB2YXJpYWJsZXMsIGFmdGVyIHN1YnN0aXR1dGluZyAkKHNhbmRib3gtbmFtZXNwYWNlKS4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChzYW5kYm94LW5hbWVzcGFjZSkiCiAgICBzX25hbWVzcGFjZSA6PSBpbnB1dC5iYXNlLk9DSS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwX3ZhcjIgOj0gcmVwbGFjZShwX3ZhbCwgIiQoc2FuZGJveC1uYW1lc3BhY2UpIiwgc19uYW1lc3BhY2UpCiAgICBwX3ZhcjIgPT0gaV92YWwKICAgIHByaW50KCJhbGxvd19lbnZfbWFwX2VudHJ5IDk6IHRydWUiKQp9CgojIEFsbG93IGlucHV0IGVudiB2YXJpYWJsZXMgdGhhdCBtYXRjaCB3aXRoIGEgcmVxdWVzdF9kZWZhdWx0cyByZWdleC4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHNvbWUgcF9yZWdleDEgaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5DcmVhdGVDb250YWluZXJSZXF1ZXN0LmFsbG93X2Vudl9yZWdleAogICAgcF9yZWdleDIgOj0gcmVwbGFjZShwX3JlZ2V4MSwgIiQoaXB2NF9hKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcHY0X2EpCiAgICBwX3JlZ2V4MyA6PSByZXBsYWNlKHBfcmVnZXgyLCAiJChpcF9wKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcF9wKQogICAgcF9yZWdleDQgOj0gcmVwbGFjZShwX3JlZ2V4MywgIiQoc3ZjX25hbWUpIiwgcG9saWN5X2RhdGEuY29tbW9uLnN2Y19uYW1lKQogICAgcF9yZWdleDUgOj0gcmVwbGFjZShwX3JlZ2V4NCwgIiQoZG5zX2xhYmVsKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5kbnNfbGFiZWwpCgogICAgcmVzdWx0IDo9IGNvbmNhdCgiPSIsIFtrZXksIGlfdmFsXSkKICAgIHJlZ2V4Lm1hdGNoKHBfcmVnZXg1LCByZXN1bHQpCgogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgMTA6IHRydWUiKQp9CgpDcmVhdGVDb250YWluZXJSZXF1ZXN0Oj0gcmVzcCB7CiAgICBub3QgaW5wdXQuZW52X21hcAogICAgaV9wcm9jZXNzID0gaW5wdXQuT0NJLlByb2Nlc3MKICAgIHNfbmFtZSA9IGlucHV0Lk9DSS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBwX3Byb2Nlc3MgPSBwX2NvbnRhaW5lci5PQ0kuUHJvY2VzcwogICAgYWxsb3dfZGVwcmVjYXRlZF9hcmdzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUpCiAgICByZXNwID0gQ3JlYXRlQ29udGFpbmVyUmVxdWVzdENvbW1vbihpbnB1dCkKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0MjogdHJ1ZSIpCn0KCkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb24ocmVxKTo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgICMgQ2hlY2sgaWYgdGhlIGlucHV0IHJlcXVlc3Qgc2hvdWxkIGJlIHJlamVjdGVkIGV2ZW4gYmVmb3JlIGNoZWNraW5nIHRoZQogICAgIyBwb2xpY3lfZGF0YS5jb250YWluZXJzIGluZm9ybWF0aW9uLgogICAgYWxsb3dfY3JlYXRlX2NvbnRhaW5lcl9pbnB1dChyZXEpCgogICAgaV9vY2kgOj0gcmVxLk9DSQogICAgaV9zdG9yYWdlcyA6PSByZXEuc3RvcmFnZXMKICAgIGlfZGV2aWNlcyA6PSByZXEuZGV2aWNlcwoKICAgICMgYXJyYXkgb2YgcG9zc2libGUgc3RhdGUgb3BlcmF0aW9ucwogICAgb3BzX2J1aWxkZXIgOj0gW10KCiAgICAjIGNoZWNrIHNhbmRib3ggbmFtZQogICAgc2FuZGJveF9uYW1lID0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FX0tFWV0KICAgIGFkZF9zYW5kYm94X25hbWVfdG9fc3RhdGUgOj0gc3RhdGVfYWxsb3dzKCJzYW5kYm94X25hbWUiLCBzYW5kYm94X25hbWUpCiAgICBvcHNfYnVpbGRlcjEgOj0gY29uY2F0X29wX2lmX25vdF9udWxsKG9wc19idWlsZGVyLCBhZGRfc2FuZGJveF9uYW1lX3RvX3N0YXRlKQoKICAgICMgQ2hlY2sgaWYgYW55IGVsZW1lbnQgZnJvbSB0aGUgcG9saWN5X2RhdGEuY29udGFpbmVycyBhcnJheSBhbGxvd3MgdGhlIGlucHV0IHJlcXVlc3QuCiAgICBzb21lIHBfY29udGFpbmVyIGluIHBvbGljeV9kYXRhLmNvbnRhaW5lcnMKICAgIHByaW50KCI9PT09PT09PSBDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiB0cnlpbmcgbmV4dCBwb2xpY3kgY29udGFpbmVyIikKCiAgICBwX3BpZG5zIDo9IHBfY29udGFpbmVyLnNhbmRib3hfcGlkbnMKICAgIGlfcGlkbnMgOj0gcmVxLnNhbmRib3hfcGlkbnMKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiBwX3BpZG5zID0iLCBwX3BpZG5zLCAiaV9waWRucyA9IiwgaV9waWRucykKICAgIHBfcGlkbnMgPT0gaV9waWRucwoKICAgIHBfb2NpIDo9IHBfY29udGFpbmVyLk9DSQoKICAgICMgY2hlY2sgbmFtZXNwYWNlCiAgICBwX25hbWVzcGFjZSA6PSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBpX25hbWVzcGFjZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwcmludCAoIkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb246IHBfbmFtZXNwYWNlID0iLCBwX25hbWVzcGFjZSwgImlfbmFtZXNwYWNlID0iLCBpX25hbWVzcGFjZSkKICAgIGFkZF9uYW1lc3BhY2VfdG9fc3RhdGUgOj0gYWxsb3dfbmFtZXNwYWNlKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkKICAgIG9wc19idWlsZGVyMiA6PSBjb25jYXRfb3BfaWZfbm90X251bGwob3BzX2J1aWxkZXIxLCBhZGRfbmFtZXNwYWNlX3RvX3N0YXRlKQoKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiBwIFZlcnNpb24gPSIsIHBfb2NpLlZlcnNpb24sICJpIFZlcnNpb24gPSIsIGlfb2NpLlZlcnNpb24pCiAgICBwX29jaS5WZXJzaW9uID09IGlfb2NpLlZlcnNpb24KCiAgICBwcmludCgiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdENvbW1vbjogcCBSZWFkb25seSA9IiwgcF9vY2kuUm9vdC5SZWFkb25seSwgImkgUmVhZG9ubHkgPSIsIGlfb2NpLlJvb3QuUmVhZG9ubHkpCiAgICBwX29jaS5Sb290LlJlYWRvbmx5ID09IGlfb2NpLlJvb3QuUmVhZG9ubHkKCiAgICBhbGxvd19hbm5vKHBfb2NpLCBpX29jaSkKCiAgICBwX3N0b3JhZ2VzIDo9IHBfY29udGFpbmVyLnN0b3JhZ2VzCiAgICBhbGxvd19ieV9hbm5vKHBfb2NpLCBpX29jaSwgcF9zdG9yYWdlcywgaV9zdG9yYWdlcykKCiAgICBwX2RldmljZXMgOj0gcF9jb250YWluZXIuZGV2aWNlcwogICAgYWxsb3dfZGV2aWNlcyhwX2RldmljZXMsIGlfZGV2aWNlcykKCiAgICByZXQgOj0gYWxsb3dfbGludXgob3BzX2J1aWxkZXIyLCBwX29jaSwgaV9vY2kpCiAgICByZXQuYWxsb3dlZAoKICAgIG9wcyA6PSByZXQub3BzCgogICAgcHJpbnQoIkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb246IHRydWUiKQp9CgphbGxvd19jcmVhdGVfY29udGFpbmVyX2lucHV0KHJlcSkgewogICAgcHJpbnQoImFsbG93X2NyZWF0ZV9jb250YWluZXJfaW5wdXQ6IGlucHV0ID0iLCByZXEpCgogICAgY291bnQocmVxLnNoYXJlZF9tb3VudHMpID09IDAKICAgIGlzX251bGwocmVxLnN0cmluZ191c2VyKQoKICAgIGlfb2NpIDo9IHJlcS5PQ0kKICAgIGlzX251bGwoaV9vY2kuSG9va3MpCiAgICBpc19udWxsKGlfb2NpLlNvbGFyaXMpCiAgICBpc19udWxsKGlfb2NpLldpbmRvd3MpCgogICAgaV9saW51eCA6PSBpX29jaS5MaW51eAogICAgY291bnQoaV9saW51eC5HSURNYXBwaW5ncykgPT0gMAogICAgY291bnQoaV9saW51eC5Nb3VudExhYmVsKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlJlc291cmNlcy5EZXZpY2VzKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlJvb3Rmc1Byb3BhZ2F0aW9uKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlVJRE1hcHBpbmdzKSA9PSAwCiAgICBpc19udWxsKGlfbGludXguSW50ZWxSZHQpCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLkJsb2NrSU8pCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLk5ldHdvcmspCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLlBpZHMpCiAgICBpc19udWxsKGlfbGludXguU2VjY29tcCkKCiAgICBpX3Byb2Nlc3MgOj0gaV9vY2kuUHJvY2VzcwogICAgY291bnQoaV9wcm9jZXNzLlNlbGludXhMYWJlbCkgPT0gMAogICAgY291bnQoaV9wcm9jZXNzLlVzZXIuVXNlcm5hbWUpID09IDAKCiAgICBwcmludCgiYWxsb3dfY3JlYXRlX2NvbnRhaW5lcl9pbnB1dDogdHJ1ZSIpCn0KCmFsbG93X25hbWVzcGFjZShwX25hbWVzcGFjZSwgaV9uYW1lc3BhY2UpID0gYWRkX25hbWVzcGFjZSB7CiAgICBwX25hbWVzcGFjZSA9PSBpX25hbWVzcGFjZQogICAgYWRkX25hbWVzcGFjZSA6PSBudWxsCiAgICBwcmludCgiYWxsb3dfbmFtZXNwYWNlIDE6IGlucHV0IG5hbWVzcGFjZSBtYXRjaGVzIHBvbGljeSBkYXRhIikKfQoKYWxsb3dfbmFtZXNwYWNlKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkgPSBhZGRfbmFtZXNwYWNlIHsKICAgIHBfbmFtZXNwYWNlID09ICIiCiAgICBwcmludCgiYWxsb3dfbmFtZXNwYWNlIDI6IG5vIG5hbWVzcGFjZSBmb3VuZCBvbiBwb2xpY3kgZGF0YSIpCiAgICBhZGRfbmFtZXNwYWNlIDo9IHN0YXRlX2FsbG93cygibmFtZXNwYWNlIiwgaV9uYW1lc3BhY2UpCn0KCiMgdmFsdWUgaGFzbid0IGJlZW4gc2VlbiBiZWZvcmUsIHNhdmUgaXQgdG8gc3RhdGUKc3RhdGVfYWxsb3dzKGtleSwgdmFsdWUpID0gYWN0aW9uIHsKICBzdGF0ZSA6PSBnZXRfc3RhdGUoKQogIHByaW50KCJzdGF0ZV9hbGxvd3MgMTogc3RhdGVba2V5XSA9Iiwgc3RhdGVba2V5XSwgInZhbHVlID0iLCB2YWx1ZSkKICBub3Qgc3RhdGVba2V5XQogIHByaW50KCJzdGF0ZV9hbGxvd3MgMTogc2F2aW5nIHRvIHN0YXRlIGtleSA9Iiwga2V5LCAidmFsdWUgPSIsIHZhbHVlKQogIHBhdGggOj0gZ2V0X3N0YXRlX3BhdGgoa2V5KSAKICBhY3Rpb24gOj0gewogICAgIm9wIjogImFkZCIsCiAgICAicGF0aCI6IHBhdGgsIAogICAgInZhbHVlIjogdmFsdWUsCiAgfQp9CgojIHZhbHVlIG1hdGNoZXMgd2hhdCdzIGluIHN0YXRlLCBhbGxvdyBpdApzdGF0ZV9hbGxvd3Moa2V5LCB2YWx1ZSkgPSBhY3Rpb24gewogIHByaW50KCJzdGF0ZV9hbGxvd3MgMjogc3RhcnQiKQogIHN0YXRlIDo9IGdldF9zdGF0ZSgpCiAgcHJpbnQoInN0YXRlX2FsbG93cyAyOiBzdGF0ZVtrZXldID0iLCBzdGF0ZVtrZXldLCAidmFsdWUgPSIsIHZhbHVlKQogIHZhbHVlID09IHN0YXRlW2tleV0KICBwcmludCgic3RhdGVfYWxsb3dzIDI6IGZvdW5kIGtleSA9Iiwga2V5LCAidmFsdWUgPSIsIHZhbHVlLCAiIGluIHN0YXRlIikKICBhY3Rpb24gOj0gbnVsbAp9CgojIGhlbHBlciBmdW5jdGlvbnMgdG8gaW50ZXJhY3Qgd2l0aCB0aGUgc3RhdGUKZ2V0X3N0YXRlKCkgPSBzdGF0ZSB7CiAgc3RhdGUgOj0gZGF0YVsicHN0YXRlIl0KfQoKZ2V0X3N0YXRlX3ZhbChrZXkpID0gdmFsdWUgewogICAgc3RhdGUgOj0gZ2V0X3N0YXRlKCkKICAgIHZhbHVlIDo9IHN0YXRlW2tleV0KfQoKZ2V0X3N0YXRlX3BhdGgoa2V5KSA9IHBhdGggewogICAgIyBwcmVwZW5kICIvcHN0YXRlLyIgdG8ga2V5CiAgICBwYXRoIDo9IGNvbmNhdCgiLyIsIFsiL3BzdGF0ZSIsIGtleV0pCn0KCiMgSGVscGVyIGZ1bmN0aW9ucyB0byBjb25kaXRpb25hbGx5IGNvbmNhdGVuYXRlIG9wIGlzIG5vdCBudWxsCmNvbmNhdF9vcF9pZl9ub3RfbnVsbChvcHMsIG9wKSA9IHJlc3VsdCB7CiAgICBvcCA9PSBudWxsCiAgICByZXN1bHQgOj0gb3BzCn0KCmNvbmNhdF9vcF9pZl9ub3RfbnVsbChvcHMsIG9wKSA9IHJlc3VsdCB7CiAgICBvcCAhPSBudWxsCiAgICByZXN1bHQgOj0gYXJyYXkuY29uY2F0KG9wcywgW29wXSkKfQoKIyBSZWplY3QgdW5leHBlY3RlZCBhbm5vdGF0aW9ucy4KYWxsb3dfYW5ubyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19hbm5vIDE6IHN0YXJ0IikKCiAgICBub3QgaV9vY2kuQW5ub3RhdGlvbnMKCiAgICBwcmludCgiYWxsb3dfYW5ubyAxOiB0cnVlIikKfQphbGxvd19hbm5vKHBfb2NpLCBpX29jaSkgewogICAgcHJpbnQoImFsbG93X2Fubm8gMjogcCBBbm5vdGF0aW9ucyA9IiwgcF9vY2kuQW5ub3RhdGlvbnMpCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiBpIEFubm90YXRpb25zID0iLCBpX29jaS5Bbm5vdGF0aW9ucykKCiAgICBpX2tleXMgOj0gb2JqZWN0LmtleXMoaV9vY2kuQW5ub3RhdGlvbnMpCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiBpIGtleXMgPSIsIGlfa2V5cykKCiAgICBldmVyeSBpX2tleSBpbiBpX2tleXMgewogICAgICAgIGFsbG93X2Fubm9fa2V5KGlfa2V5LCBwX29jaSkKICAgIH0KCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiB0cnVlIikKfQoKYWxsb3dfYW5ub19rZXkoaV9rZXksIHBfb2NpKSB7CiAgICBwcmludCgiYWxsb3dfYW5ub19rZXkgMTogaSBrZXkgPSIsIGlfa2V5KQoKICAgIHN0YXJ0c3dpdGgoaV9rZXksICJpby5rdWJlcm5ldGVzLmNyaS4iKQoKICAgIHByaW50KCJhbGxvd19hbm5vX2tleSAxOiB0cnVlIikKfQphbGxvd19hbm5vX2tleShpX2tleSwgcF9vY2kpIHsKICAgIHByaW50KCJhbGxvd19hbm5vX2tleSAyOiBpIGtleSA9IiwgaV9rZXkpCgogICAgc29tZSBwX2tleSwgXyBpbiBwX29jaS5Bbm5vdGF0aW9ucwogICAgcF9rZXkgPT0gaV9rZXkKCiAgICBwcmludCgiYWxsb3dfYW5ub19rZXkgMjogdHJ1ZSIpCn0KCiMgR2V0IHRoZSB2YWx1ZSBvZiB0aGUgU19OQU1FX0tFWSBhbm5vdGF0aW9uIGFuZAojIGNvcnJlbGF0ZSBpdCB3aXRoIG90aGVyIGFubm90YXRpb25zIGFuZCBwcm9jZXNzIGZpZWxkcy4KYWxsb3dfYnlfYW5ubyhwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpIHsKICAgIHByaW50KCJhbGxvd19ieV9hbm5vIDE6IHN0YXJ0IikKCiAgICBub3QgcF9vY2kuQW5ub3RhdGlvbnNbU19OQU1FX0tFWV0KCiAgICBpX3NfbmFtZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMTogaV9zX25hbWUgPSIsIGlfc19uYW1lKQoKICAgIGlfc19uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FU1BBQ0VfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMTogaV9zX25hbWVzcGFjZSA9IiwgaV9zX25hbWVzcGFjZSkKCiAgICBhbGxvd19ieV9zYW5kYm94X25hbWUocF9vY2ksIGlfb2NpLCBwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBpX3NfbmFtZSwgaV9zX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfYnlfYW5ubyAxOiB0cnVlIikKfQphbGxvd19ieV9hbm5vKHBfb2NpLCBpX29jaSwgcF9zdG9yYWdlcywgaV9zdG9yYWdlcykgewogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMjogc3RhcnQiKQoKICAgIHBfc19uYW1lIDo9IHBfb2NpLkFubm90YXRpb25zW1NfTkFNRV9LRVldCiAgICBpX3NfbmFtZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMjogaV9zX25hbWUgPSIsIGlfc19uYW1lLCAicF9zX25hbWUgPSIsIHBfc19uYW1lKQoKICAgIGFsbG93X3NhbmRib3hfbmFtZShwX3NfbmFtZSwgaV9zX25hbWUpCgogICAgaV9zX25hbWVzcGFjZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwcmludCgiYWxsb3dfYnlfYW5ubyAyOiBpX3NfbmFtZXNwYWNlID0iLCBpX3NfbmFtZXNwYWNlKQoKICAgIGFsbG93X2J5X3NhbmRib3hfbmFtZShwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMsIGlfc19uYW1lLCBpX3NfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd19ieV9hbm5vIDI6IHRydWUiKQp9CgphbGxvd19ieV9zYW5kYm94X25hbWUocF9vY2ksIGlfb2NpLCBwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfYnlfc2FuZGJveF9uYW1lOiBzdGFydCIpCgogICAgaV9uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FU1BBQ0VfS0VZXQoKICAgIGFsbG93X2J5X2NvbnRhaW5lcl90eXBlcyhwX29jaSwgaV9vY2ksIHNfbmFtZSwgaV9uYW1lc3BhY2UpCiAgICBhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZChwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpCiAgICBhbGxvd19wcm9jZXNzKHBfb2NpLlByb2Nlc3MsIGlfb2NpLlByb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpCgogICAgcHJpbnQoImFsbG93X2J5X3NhbmRib3hfbmFtZTogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfbmFtZShwX3NfbmFtZSwgaV9zX25hbWUpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X25hbWU6IHN0YXJ0IikKICAgIHJlZ2V4Lm1hdGNoKHBfc19uYW1lLCBpX3NfbmFtZSkKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9uYW1lOiB0cnVlIikKfQoKIyBDaGVjayB0aGF0IHRoZSAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLXR5cGUiIGFuZAojICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIiBhbm5vdGF0aW9ucyBkZXNpZ25hdGUgdGhlCiMgZXhwZWN0ZWQgdHlwZSAtIGVpdGhlciBhICJzYW5kYm94IiBvciBhICJjb250YWluZXIiLiBUaGVuLCB2YWxpZGF0ZQojIG90aGVyIGFubm90YXRpb25zIGJhc2VkIG9uIHRoZSBhY3R1YWwgInNhbmRib3giIG9yICJjb250YWluZXIiIHZhbHVlCiMgZnJvbSB0aGUgaW5wdXQgY29udGFpbmVyLgphbGxvd19ieV9jb250YWluZXJfdHlwZXMocF9vY2ksIGlfb2NpLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfYnlfY29udGFpbmVyX3R5cGVzOiBjaGVja2luZyBpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSIpCgogICAgY190eXBlIDo9ICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSIKICAgIAogICAgcF9jcmlfdHlwZSA6PSBwX29jaS5Bbm5vdGF0aW9uc1tjX3R5cGVdCiAgICBpX2NyaV90eXBlIDo9IGlfb2NpLkFubm90YXRpb25zW2NfdHlwZV0KICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZXM6IHBfY3JpX3R5cGUgPSIsIHBfY3JpX3R5cGUsICJpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgcF9jcmlfdHlwZSA9PSBpX2NyaV90eXBlCgogICAgYWxsb3dfYnlfY29udGFpbmVyX3R5cGUoaV9jcmlfdHlwZSwgcF9vY2ksIGlfb2NpLCBzX25hbWUsIHNfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZXM6IHRydWUiKQp9CgphbGxvd19ieV9jb250YWluZXJfdHlwZShpX2NyaV90eXBlLCBwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAxOiBpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgaV9jcmlfdHlwZSA9PSAic2FuZGJveCIKCiAgICBpX2thdGFfdHlwZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1siaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5jb250YWluZXJfdHlwZSJdCiAgICBwcmludCgiYWxsb3dfYnlfY29udGFpbmVyX3R5cGUgMTogaV9rYXRhX3R5cGUgPSIsIGlfa2F0YV90eXBlKQogICAgaV9rYXRhX3R5cGUgPT0gInBvZF9zYW5kYm94IgoKICAgIGFsbG93X3NhbmRib3hfY29udGFpbmVyX25hbWUocF9vY2ksIGlfb2NpKQogICAgYWxsb3dfc2FuZGJveF9uZXRfbmFtZXNwYWNlKHBfb2NpLCBpX29jaSkKICAgIGFsbG93X3NhbmRib3hfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpCgogICAgcHJpbnQoImFsbG93X2J5X2NvbnRhaW5lcl90eXBlIDE6IHRydWUiKQp9CgphbGxvd19ieV9jb250YWluZXJfdHlwZShpX2NyaV90eXBlLCBwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiBpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgaV9jcmlfdHlwZSA9PSAiY29udGFpbmVyIgoKICAgIGlfa2F0YV90eXBlIDo9IGlfb2NpLkFubm90YXRpb25zWyJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIl0KICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiBpX2thdGFfdHlwZSA9IiwgaV9rYXRhX3R5cGUpCiAgICBpX2thdGFfdHlwZSA9PSAicG9kX2NvbnRhaW5lciIKCiAgICBhbGxvd19jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpCiAgICBhbGxvd19uZXRfbmFtZXNwYWNlKHBfb2NpLCBpX29jaSkKICAgIGFsbG93X2xvZ19kaXJlY3RvcnkocF9vY2ksIGlfb2NpKQoKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiB0cnVlIikKfQoKIyAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLW5hbWUiIGFubm90YXRpb24KYWxsb3dfc2FuZGJveF9jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X2NvbnRhaW5lcl9uYW1lOiBzdGFydCIpCgogICAgY29udGFpbmVyX2Fubm90YXRpb25fbWlzc2luZyhwX29jaSwgaV9vY2ksICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItbmFtZSIpCgogICAgcHJpbnQoImFsbG93X3NhbmRib3hfY29udGFpbmVyX25hbWU6IHRydWUiKQp9CgphbGxvd19jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19jb250YWluZXJfbmFtZTogc3RhcnQiKQoKICAgIGFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uKHBfb2NpLCBpX29jaSwgImlvLmt1YmVybmV0ZXMuY3JpLmNvbnRhaW5lci1uYW1lIikKCiAgICBwcmludCgiYWxsb3dfY29udGFpbmVyX25hbWU6IHRydWUiKQp9Cgpjb250YWluZXJfYW5ub3RhdGlvbl9taXNzaW5nKHBfb2NpLCBpX29jaSwga2V5KSB7CiAgICBwcmludCgiY29udGFpbmVyX2Fubm90YXRpb25fbWlzc2luZzoiLCBrZXkpCgogICAgbm90IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIG5vdCBpX29jaS5Bbm5vdGF0aW9uc1trZXldCgogICAgcHJpbnQoImNvbnRhaW5lcl9hbm5vdGF0aW9uX21pc3Npbmc6IHRydWUiKQp9CgphbGxvd19jb250YWluZXJfYW5ub3RhdGlvbihwX29jaSwgaV9vY2ksIGtleSkgewogICAgcHJpbnQoImFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uOiBrZXkgPSIsIGtleSkKCiAgICBwX3ZhbHVlIDo9IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIGlfdmFsdWUgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgcHJpbnQoImFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uOiBwX3ZhbHVlID0iLCBwX3ZhbHVlLCAiaV92YWx1ZSA9IiwgaV92YWx1ZSkKCiAgICBwX3ZhbHVlID09IGlfdmFsdWUKCiAgICBwcmludCgiYWxsb3dfY29udGFpbmVyX2Fubm90YXRpb246IHRydWUiKQp9CgojICJuZXJkY3RsL25ldHdvcmstbmFtZXNwYWNlIiBhbm5vdGF0aW9uCmFsbG93X3NhbmRib3hfbmV0X25hbWVzcGFjZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X25ldF9uYW1lc3BhY2U6IHN0YXJ0IikKCiAgICBrZXkgOj0gIm5lcmRjdGwvbmV0d29yay1uYW1lc3BhY2UiCgogICAgcF9uYW1lc3BhY2UgOj0gcF9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgaV9uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgcHJpbnQoImFsbG93X3NhbmRib3hfbmV0X25hbWVzcGFjZTogcF9uYW1lc3BhY2UgPSIsIHBfbmFtZXNwYWNlLCAiaV9uYW1lc3BhY2UgPSIsIGlfbmFtZXNwYWNlKQoKICAgIHJlZ2V4Lm1hdGNoKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9uZXRfbmFtZXNwYWNlOiB0cnVlIikKfQoKYWxsb3dfbmV0X25hbWVzcGFjZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19uZXRfbmFtZXNwYWNlOiBzdGFydCIpCgogICAga2V5IDo9ICJuZXJkY3RsL25ldHdvcmstbmFtZXNwYWNlIgoKICAgIG5vdCBwX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICBub3QgaV9vY2kuQW5ub3RhdGlvbnNba2V5XQoKICAgIHByaW50KCJhbGxvd19uZXRfbmFtZXNwYWNlOiB0cnVlIikKfQoKIyAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1sb2ctZGlyZWN0b3J5IiBhbm5vdGF0aW9uCmFsbG93X3NhbmRib3hfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X2xvZ19kaXJlY3Rvcnk6IHN0YXJ0IikKCiAgICBrZXkgOj0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbG9nLWRpcmVjdG9yeSIKCiAgICBwX2RpciA6PSBwX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICByZWdleDEgOj0gcmVwbGFjZShwX2RpciwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHJlZ2V4MiA6PSByZXBsYWNlKHJlZ2V4MSwgIiQoc2FuZGJveC1uYW1lc3BhY2UpIiwgc19uYW1lc3BhY2UpCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiByZWdleDIgPSIsIHJlZ2V4MikKCiAgICBpX2RpciA6PSBpX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiBpX2RpciA9IiwgaV9kaXIpCgogICAgcmVnZXgubWF0Y2gocmVnZXgyLCBpX2RpcikKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiB0cnVlIikKfQoKYWxsb3dfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19sb2dfZGlyZWN0b3J5OiBzdGFydCIpCgogICAga2V5IDo9ICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWxvZy1kaXJlY3RvcnkiCgogICAgbm90IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIG5vdCBpX29jaS5Bbm5vdGF0aW9uc1trZXldCgogICAgcHJpbnQoImFsbG93X2xvZ19kaXJlY3Rvcnk6IHRydWUiKQp9CgphbGxvd19kZXZpY2VzKHBfZGV2aWNlcywgaV9kZXZpY2VzKSB7CiAgICBwcmludCgiYWxsb3dfZGV2aWNlczogc3RhcnQiKQogICAgZXZlcnkgaV9kZXZpY2UgaW4gaV9kZXZpY2VzIHsKICAgICAgICBwcmludCgiYWxsb3dfZGV2aWNlczogaV9kZXZpY2UgPSIsIGlfZGV2aWNlKQogICAgICAgIHNvbWUgcF9kZXZpY2UgaW4gcF9kZXZpY2VzCiAgICAgICAgcF9kZXZpY2UuY29udGFpbmVyX3BhdGggPT0gaV9kZXZpY2UuY29udGFpbmVyX3BhdGgKICAgIH0KICAgIHByaW50KCJhbGxvd19kZXZpY2VzOiB0cnVlIikKfQoKYWxsb3dfbGludXgoc3RhdGVfb3BzLCBwX29jaSwgaV9vY2kpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIHBfbmFtZXNwYWNlcyA6PSBwX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbGludXg6IHAgbmFtZXNwYWNlcyA9IiwgcF9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlcyA6PSBpX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbGludXg6IGkgbmFtZXNwYWNlcyA9IiwgaV9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlX3dpdGhvdXRfbmV0d29yayA6PSBbb2JqIHwgb2JqIDo9IGlfbmFtZXNwYWNlc1tfXTsgb2JqLlR5cGUgIT0gIm5ldHdvcmsiXQoKICAgIHByaW50KCJhbGxvd19saW51eDogaV9uYW1lc3BhY2Vfd2l0aG91dF9uZXR3b3JrID0iLCBpX25hbWVzcGFjZV93aXRob3V0X25ldHdvcmspCgogICAgcF9uYW1lc3BhY2VzID09IGlfbmFtZXNwYWNlX3dpdGhvdXRfbmV0d29yawoKICAgIGFsbG93X21hc2tlZF9wYXRocyhwX29jaSwgaV9vY2kpCiAgICBhbGxvd19yZWFkb25seV9wYXRocyhwX29jaSwgaV9vY2kpCiAgICBhbGxvd19saW51eF9kZXZpY2VzKHBfb2NpLkxpbnV4LkRldmljZXMsIGlfb2NpLkxpbnV4LkRldmljZXMpCiAgICBhbGxvd19saW51eF9zeXNjdGwocF9vY2kuTGludXgsIGlfb2NpLkxpbnV4KQogICAgcmV0IDo9IGFsbG93X25ldHdvcmtfbmFtZXNwYWNlX3N0YXJ0KHN0YXRlX29wcywgcF9vY2ksIGlfb2NpKQogICAgcmV0LmFsbG93ZWQKCiAgICBvcHMgOj0gcmV0Lm9wcwoKICAgIHByaW50KCJhbGxvd19saW51eDogdHJ1ZSIpCn0KCiMgUmV0cmlldmUgdGhlICJuZXR3b3JrIiBuYW1lc3BhY2UgZnJvbSB0aGUgaW5wdXQgZGF0YSBhbmQgcGFzcyBpdCBvbiBmb3IgdGhlCiMgbmV0d29yayBuYW1lc3BhY2UgcG9saWN5IGNoZWNrcy4KYWxsb3dfbmV0d29ya19uYW1lc3BhY2Vfc3RhcnQoc3RhdGVfb3BzLCBwX29jaSwgaV9vY2kpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIHByaW50KCJhbGxvd19uZXR3b3JrX25hbWVzcGFjZSBzdGFydDogc3RhcnQiKQoKICAgIHBfbmFtZXNwYWNlcyA6PSBwX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IHAgbmFtZXNwYWNlcyA9IiwgcF9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlcyA6PSBpX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IGkgbmFtZXNwYWNlcyA9IiwgaV9uYW1lc3BhY2VzKQoKICAgICMgUmV0dXJuIHBhdGggb2YgdGhlICJuZXR3b3JrIiBuYW1lc3BhY2UKICAgIG5ldHdvcmtfbnMgOj0gW29iaiB8IG9iaiA6PSBpX25hbWVzcGFjZXNbX107IG9iai5UeXBlID09ICJuZXR3b3JrIl0KCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IG5ldHdvcmtfbnMgPSIsIG5ldHdvcmtfbnMpCgogICAgcmV0IDo9IGFsbG93X25ldHdvcmtfbmFtZXNwYWNlKHN0YXRlX29wcywgbmV0d29ya19ucykKICAgIHJldC5hbGxvd2VkCgogICAgb3BzIDo9IHJldC5vcHMKfQoKIyBUaGlzIHJ1bGUgaXMgd2hlbiB0aGVyZSdzIG5vIG5ldHdvcmsgbmFtZXNwYWNlIGluIHRoZSBpbnB1dCBkYXRhLgphbGxvd19uZXR3b3JrX25hbWVzcGFjZShzdGF0ZV9vcHMsIG5ldHdvcmtfbnMpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIGNvdW50KG5ldHdvcmtfbnMpID09IDAKCiAgICBuZXR3b3JrX25zX3BhdGggPSAiIgoKICAgIGFkZF9uZXR3b3JrX25hbWVzcGFjZV90b19zdGF0ZSA6PSBzdGF0ZV9hbGxvd3MoIm5ldHdvcmtfbmFtZXNwYWNlIiwgbmV0d29ya19uc19wYXRoKQogICAgb3BzIDo9IGNvbmNhdF9vcF9pZl9ub3RfbnVsbChzdGF0ZV9vcHMsIGFkZF9uZXR3b3JrX25hbWVzcGFjZV90b19zdGF0ZSkKCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2UgMTogdHJ1ZSIpCn0KCiMgVGhpcyBydWxlIGlzIHdoZW4gdGhlcmUncyBleGFjdGx5IG9uZSBuZXR3b3JrIG5hbWVzcGFjZSBpbiB0aGUgaW5wdXQgZGF0YS4KYWxsb3dfbmV0d29ya19uYW1lc3BhY2Uoc3RhdGVfb3BzLCBuZXR3b3JrX25zKSA6PSB7Im9wcyI6IG9wcywgImFsbG93ZWQiOiB0cnVlfSB7CiAgICBjb3VudChuZXR3b3JrX25zKSA9PSAxCgogICAgYWRkX25ldHdvcmtfbmFtZXNwYWNlX3RvX3N0YXRlIDo9IHN0YXRlX2FsbG93cygibmV0d29ya19uYW1lc3BhY2UiLCBuZXR3b3JrX25zWzBdLlBhdGgpCiAgICBvcHMgOj0gY29uY2F0X29wX2lmX25vdF9udWxsKHN0YXRlX29wcywgYWRkX25ldHdvcmtfbmFtZXNwYWNlX3RvX3N0YXRlKQoKICAgIHByaW50KCJhbGxvd19uZXR3b3JrX25hbWVzcGFjZSAyOiB0cnVlIikKfQoKYWxsb3dfbWFza2VkX3BhdGhzKHBfb2NpLCBpX29jaSkgewogICAgcF9wYXRocyA6PSBwX29jaS5MaW51eC5NYXNrZWRQYXRocwogICAgcHJpbnQoImFsbG93X21hc2tlZF9wYXRocyAxOiBwX3BhdGhzID0iLCBwX3BhdGhzKQoKICAgIGlfcGF0aHMgOj0gaV9vY2kuTGludXguTWFza2VkUGF0aHMKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aHMgMTogaV9wYXRocyA9IiwgaV9wYXRocykKCiAgICBhbGxvd19tYXNrZWRfcGF0aHNfYXJyYXkocF9wYXRocywgaV9wYXRocykKCiAgICBwcmludCgiYWxsb3dfbWFza2VkX3BhdGhzIDE6IHRydWUiKQp9CmFsbG93X21hc2tlZF9wYXRocyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aHMgMjogc3RhcnQiKQoKICAgIG5vdCBwX29jaS5MaW51eC5NYXNrZWRQYXRocwogICAgbm90IGlfb2NpLkxpbnV4Lk1hc2tlZFBhdGhzCgogICAgcHJpbnQoImFsbG93X21hc2tlZF9wYXRocyAyOiB0cnVlIikKfQoKIyBBbGwgdGhlIHBvbGljeSBtYXNrZWQgcGF0aHMgbXVzdCBiZSBtYXNrZWQgaW4gdGhlIGlucHV0IGRhdGEgdG9vLgojIElucHV0IGlzIGFsbG93ZWQgdG8gaGF2ZSBtb3JlIG1hc2tlZCBwYXRocyB0aGFuIHRoZSBwb2xpY3kuCmFsbG93X21hc2tlZF9wYXRoc19hcnJheShwX2FycmF5LCBpX2FycmF5KSB7CiAgICBldmVyeSBwX2VsZW0gaW4gcF9hcnJheSB7CiAgICAgICAgYWxsb3dfbWFza2VkX3BhdGgocF9lbGVtLCBpX2FycmF5KQogICAgfQp9CgphbGxvd19tYXNrZWRfcGF0aChwX2VsZW0sIGlfYXJyYXkpIHsKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aDogcF9lbGVtID0iLCBwX2VsZW0pCgogICAgc29tZSBpX2VsZW0gaW4gaV9hcnJheQogICAgcF9lbGVtID09IGlfZWxlbQoKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aDogdHJ1ZSIpCn0KCmFsbG93X3JlYWRvbmx5X3BhdGhzKHBfb2NpLCBpX29jaSkgewogICAgcF9wYXRocyA6PSBwX29jaS5MaW51eC5SZWFkb25seVBhdGhzCiAgICBwcmludCgiYWxsb3dfcmVhZG9ubHlfcGF0aHMgMTogcF9wYXRocyA9IiwgcF9wYXRocykKCiAgICBpX3BhdGhzIDo9IGlfb2NpLkxpbnV4LlJlYWRvbmx5UGF0aHMKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAxOiBpX3BhdGhzID0iLCBpX3BhdGhzKQoKICAgIGFsbG93X3JlYWRvbmx5X3BhdGhzX2FycmF5KHBfcGF0aHMsIGlfcGF0aHMsIGlfb2NpLkxpbnV4Lk1hc2tlZFBhdGhzKQoKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAxOiB0cnVlIikKfQphbGxvd19yZWFkb25seV9wYXRocyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAyOiBzdGFydCIpCgogICAgbm90IHBfb2NpLkxpbnV4LlJlYWRvbmx5UGF0aHMKICAgIG5vdCBpX29jaS5MaW51eC5SZWFkb25seVBhdGhzCgogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGhzIDI6IHRydWUiKQp9CgojIEFsbCB0aGUgcG9saWN5IHJlYWRvbmx5IHBhdGhzIG11c3QgYmUgZWl0aGVyOgojIC0gUHJlc2VudCBpbiB0aGUgaW5wdXQgcmVhZG9ubHkgcGF0aHMsIG9yCiMgLSBQcmVzZW50IGluIHRoZSBpbnB1dCBtYXNrZWQgcGF0aHMuCiMgSW5wdXQgaXMgYWxsb3dlZCB0byBoYXZlIG1vcmUgcmVhZG9ubHkgcGF0aHMgdGhhbiB0aGUgcG9saWN5LgphbGxvd19yZWFkb25seV9wYXRoc19hcnJheShwX2FycmF5LCBpX2FycmF5LCBtYXNrZWRfcGF0aHMpIHsKICAgIGV2ZXJ5IHBfZWxlbSBpbiBwX2FycmF5IHsKICAgICAgICBhbGxvd19yZWFkb25seV9wYXRoKHBfZWxlbSwgaV9hcnJheSwgbWFza2VkX3BhdGhzKQogICAgfQp9CgphbGxvd19yZWFkb25seV9wYXRoKHBfZWxlbSwgaV9hcnJheSwgbWFza2VkX3BhdGhzKSB7CiAgICBwcmludCgiYWxsb3dfcmVhZG9ubHlfcGF0aCAxOiBwX2VsZW0gPSIsIHBfZWxlbSkKCiAgICBzb21lIGlfZWxlbSBpbiBpX2FycmF5CiAgICBwX2VsZW0gPT0gaV9lbGVtCgogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGggMTogdHJ1ZSIpCn0KYWxsb3dfcmVhZG9ubHlfcGF0aChwX2VsZW0sIGlfYXJyYXksIG1hc2tlZF9wYXRocykgewogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGggMjogcF9lbGVtID0iLCBwX2VsZW0pCgogICAgc29tZSBpX21hc2tlZCBpbiBtYXNrZWRfcGF0aHMKICAgIHBfZWxlbSA9PSBpX21hc2tlZAoKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRoIDI6IHRydWUiKQp9CgphbGxvd19saW51eF9kZXZpY2VzKHBfZGV2aWNlcywgaV9kZXZpY2VzKSB7CiAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogc3RhcnQiKQogICAgZXZlcnkgaV9kZXZpY2UgaW4gaV9kZXZpY2VzIHsKICAgICAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogaV9kZXZpY2UgPSIsIGlfZGV2aWNlKQogICAgICAgIHNvbWUgcF9kZXZpY2UgaW4gcF9kZXZpY2VzCiAgICAgICAgaV9kZXZpY2UuUGF0aCA9PSBwX2RldmljZS5QYXRoCiAgICB9CiAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogdHJ1ZSIpCn0KCmFsbG93X2xpbnV4X3N5c2N0bChwX2xpbnV4LCBpX2xpbnV4KSB7CiAgICBwcmludCgiYWxsb3dfbGludXhfc3lzY3RsIDE6IHN0YXJ0IikKICAgIG5vdCBpX2xpbnV4LlN5c2N0bAogICAgcHJpbnQoImFsbG93X2xpbnV4X3N5c2N0bCAxOiB0cnVlIikKfQoKYWxsb3dfbGludXhfc3lzY3RsKHBfbGludXgsIGlfbGludXgpIHsKICAgIHByaW50KCJhbGxvd19saW51eF9zeXNjdGwgMjogc3RhcnQiKQogICAgcF9zeXNjdGwgOj0gcF9saW51eC5TeXNjdGwKICAgIGlfc3lzY3RsIDo9IGlfbGludXguU3lzY3RsCiAgICBldmVyeSBpX25hbWUsIGlfdmFsIGluIGlfc3lzY3RsIHsKICAgICAgICBwcmludCgiYWxsb3dfbGludXhfc3lzY3RsIDI6IGlfbmFtZSA9IiwgaV9uYW1lLCAiaV92YWwgPSIsIGlfdmFsKQogICAgICAgIHBfc3lzY3RsW2lfbmFtZV0gPT0gaV92YWwKICAgIH0KICAgIHByaW50KCJhbGxvd19saW51eF9zeXNjdGwgMjogdHJ1ZSIpCn0KCiMgQ2hlY2sgdGhlIGNvbnNpc3RlbmN5IG9mIHRoZSBpbnB1dCAiaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5idW5kbGVfcGF0aCIKIyBhbmQgaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCIgdmFsdWVzIHdpdGggb3RoZXIgZmllbGRzLgphbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZChwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpIHsKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogc3RhcnQiKQoKICAgIGJ1bmRsZV9wYXRoIDo9IGlfb2NpLkFubm90YXRpb25zWyJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmJ1bmRsZV9wYXRoIl0KICAgIGJ1bmRsZV9pZCA6PSByZXBsYWNlKGJ1bmRsZV9wYXRoLCAiL3J1bi9jb250YWluZXJkL2lvLmNvbnRhaW5lcmQucnVudGltZS52Mi50YXNrL2s4cy5pby8iLCAiIikKCiAgICBidW5kbGVfaWRfZm9ybWF0IDo9IGNvbmNhdCgiIiwgWyJeIiwgQlVORExFX0lELCAiJCJdKQogICAgcmVnZXgubWF0Y2goYnVuZGxlX2lkX2Zvcm1hdCwgYnVuZGxlX2lkKQoKICAgIGtleSA6PSAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCIKCiAgICBwX3JlZ2V4IDo9IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIHNhbmRib3hfaWQgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQoKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogc2FuZGJveF9pZCA9Iiwgc2FuZGJveF9pZCwgInJlZ2V4ID0iLCBwX3JlZ2V4KQogICAgcmVnZXgubWF0Y2gocF9yZWdleCwgc2FuZGJveF9pZCkKCiAgICBhbGxvd19yb290X3BhdGgocF9vY2ksIGlfb2NpLCBidW5kbGVfaWQpCgogICAgZXZlcnkgaV9tb3VudCBpbiBpX29jaS5Nb3VudHMgewogICAgICAgIGFsbG93X21vdW50KHBfb2NpLCBpX21vdW50LCBpX3N0b3JhZ2VzLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpCiAgICB9CgogICAgYWxsb3dfc3RvcmFnZXMocF9zdG9yYWdlcywgaV9zdG9yYWdlcywgYnVuZGxlX2lkLCBzYW5kYm94X2lkKQoKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogdHJ1ZSIpCn0KCmFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHBfcHJvY2VzcyA9IiwgcF9wcm9jZXNzKQogICAgcHJpbnQoImFsbG93X3Byb2Nlc3NfY29tbW9uOiBpX3Byb2Nlc3MgPSAiLCBpX3Byb2Nlc3MpCiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHNfbmFtZSA9Iiwgc19uYW1lKQoKICAgIHBfcHJvY2Vzcy5Dd2QgPT0gaV9wcm9jZXNzLkN3ZAogICAgcF9wcm9jZXNzLk5vTmV3UHJpdmlsZWdlcyA9PSBpX3Byb2Nlc3MuTm9OZXdQcml2aWxlZ2VzCgogICAgYWxsb3dfdXNlcihwX3Byb2Nlc3MsIGlfcHJvY2VzcykKICAgIGFsbG93X2VudihwX3Byb2Nlc3MsIGlfcHJvY2Vzcywgc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHRydWUiKQp9CgojIENvbXBhcmUgdGhlIE9DSSBQcm9jZXNzIGZpZWxkIG9mIGEgcG9saWN5IGNvbnRhaW5lciB3aXRoIHRoZSBpbnB1dCBPQ0kgUHJvY2VzcyBmcm9tIGEgQ3JlYXRlQ29udGFpbmVyUmVxdWVzdAphbGxvd19wcm9jZXNzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfcHJvY2Vzczogc3RhcnQiKQoKICAgIGFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgYWxsb3dfY2FwcyhwX3Byb2Nlc3MuQ2FwYWJpbGl0aWVzLCBpX3Byb2Nlc3MuQ2FwYWJpbGl0aWVzKQogICAgcF9wcm9jZXNzLlRlcm1pbmFsID09IGlfcHJvY2Vzcy5UZXJtaW5hbAoKICAgIHByaW50KCJhbGxvd19wcm9jZXNzOiB0cnVlIikKfQoKIyBDb21wYXJlIHRoZSBPQ0kgUHJvY2VzcyBmaWVsZCBvZiBhIHBvbGljeSBjb250YWluZXIgd2l0aCB0aGUgaW5wdXQgcHJvY2VzcyBmaWVsZCBmcm9tIEV4ZWNQcm9jZXNzUmVxdWVzdAphbGxvd19pbnRlcmFjdGl2ZV9wcm9jZXNzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfaW50ZXJhY3RpdmVfcHJvY2Vzczogc3RhcnQiKQoKICAgIGFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgYWxsb3dfZXhlY19jYXBzKGlfcHJvY2Vzcy5DYXBhYmlsaXRpZXMpCgogICAgIyBUaGVzZSBhcmUgY29tbWFuZHMgZW5hYmxlZCB1c2luZyBFeGVjUHJvY2Vzc1JlcXVlc3QgY29tbWFuZHMgYW5kL29yIHJlZ2V4IGZyb20gdGhlIHNldHRpbmdzIGZpbGUuCiAgICAjIFRoZXkgY2FuIGJlIGV4ZWN1dGVkIGludGVyYWN0aXZlbHkgc28gYWxsb3cgdGhlbSB0byB1c2UgYW55IHZhbHVlIGZvciBpX3Byb2Nlc3MuVGVybWluYWwuCgogICAgcHJpbnQoImFsbG93X2ludGVyYWN0aXZlX3Byb2Nlc3M6IHRydWUiKQp9CgojIENvbXBhcmUgdGhlIE9DSSBQcm9jZXNzIGZpZWxkIG9mIGEgcG9saWN5IGNvbnRhaW5lciB3aXRoIHRoZSBpbnB1dCBwcm9jZXNzIGZpZWxkIGZyb20gRXhlY1Byb2Nlc3NSZXF1ZXN0CmFsbG93X3Byb2JlX3Byb2Nlc3MocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19wcm9iZV9wcm9jZXNzOiBzdGFydCIpCgogICAgYWxsb3dfcHJvY2Vzc19jb21tb24ocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpCiAgICBhbGxvd19leGVjX2NhcHMoaV9wcm9jZXNzLkNhcGFiaWxpdGllcykKICAgIHBfcHJvY2Vzcy5UZXJtaW5hbCA9PSBpX3Byb2Nlc3MuVGVybWluYWwKCiAgICBwcmludCgiYWxsb3dfcHJvYmVfcHJvY2VzczogdHJ1ZSIpCn0KCmFsbG93X3VzZXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MpIHsKICAgIHBfdXNlciA6PSBwX3Byb2Nlc3MuVXNlcgogICAgaV91c2VyIDo9IGlfcHJvY2Vzcy5Vc2VyCgogICAgcHJpbnQoImFsbG93X3VzZXI6IGlucHV0IHVpZCA9IiwgaV91c2VyLlVJRCwgInBvbGljeSB1aWQgPSIsIHBfdXNlci5VSUQpCiAgICBwX3VzZXIuVUlEID09IGlfdXNlci5VSUQKCiAgICAjIFRPRE86IHRyYWNrIGRvd24gdGhlIHJlYXNvbiBmb3IgcmVnaXN0cnkuazhzLmlvL3BhdXNlOjMuOSBiZWluZwogICAgIyAgICAgICBleGVjdXRlZCB3aXRoIGdpZCA9IDAgZGVzcGl0ZSBoYXZpbmcgIjY1NTM1OjY1NTM1IiBpbiBpdHMgY29udGFpbmVyIGltYWdlCiAgICAjICAgICAgIGNvbmZpZy4KICAgICNwcmludCgiYWxsb3dfdXNlcjogaW5wdXQgZ2lkID0iLCBpX3VzZXIuR0lELCAicG9saWN5IGdpZCA9IiwgcF91c2VyLkdJRCkKICAgICNwX3VzZXIuR0lEID09IGlfdXNlci5HSUQKCiAgICAjIFRPRE86IGNvbXBhcmUgdGhlIGFkZGl0aW9uYWxHaWRzIGZpZWxkIHRvbyBhZnRlciBjb21wdXRpbmcgaXRzIHZhbHVlCiAgICAjIGJhc2VkIG9uIC9ldGMvcGFzc3dkIGFuZCAvZXRjL2dyb3VwIGZyb20gdGhlIGNvbnRhaW5lciBpbWFnZS4KfQoKYWxsb3dfZGVwcmVjYXRlZF9hcmdzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZ3MgMTogbm8gYXJncyIpCgogICAgbm90IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJncwogICAgbm90IGlfcHJvY2Vzcy5BcmdzCgogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAxOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZ3MocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSkgewogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiBwb2xpY3kgYXJncyA9IiwgcF9wcm9jZXNzLkRlcHJlY2F0ZWRBcmdzKQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiBpbnB1dCBhcmdzID0iLCBpX3Byb2Nlc3MuQXJncykKCiAgICBjb3VudChwX3Byb2Nlc3MuRGVwcmVjYXRlZEFyZ3MpID09IGNvdW50KGlfcHJvY2Vzcy5BcmdzKQoKICAgIGV2ZXJ5IGksIGlfYXJnIGluIGlfcHJvY2Vzcy5BcmdzIHsKICAgICAgICBhbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpCiAgICB9CgogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDE6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgcF9hcmcyIDo9IHJlcGxhY2UocF9hcmcsICIkJCIsICIkIikKICAgIHBfYXJnMiA9PSBpX2FyZwoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAxOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDI6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgIyBUT0RPOiBjYW4gJChub2RlLW5hbWUpIGJlIGhhbmRsZWQgYmV0dGVyPwogICAgY29udGFpbnMocF9hcmcsICIkKG5vZGUtbmFtZSkiKQoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAyOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDM6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgcF9hcmcyIDo9IHJlcGxhY2UocF9hcmcsICIkJCIsICIkIikKICAgIHBfYXJnMyA6PSByZXBsYWNlKHBfYXJnMiwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAzOiBwX2FyZzMgPSIsIHBfYXJnMykKICAgIHBfYXJnMyA9PSBpX2FyZwoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAzOiB0cnVlIikKfQoKIyBPQ0kgcHJvY2Vzcy5FbnYgZmllbGQKYWxsb3dfZW52KHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfZW52OiBwIGVudiA9IiwgcF9wcm9jZXNzLkVudikKICAgIHByaW50KCJhbGxvd19lbnY6IGkgZW52ID0iLCBpX3Byb2Nlc3MuRW52KQoKICAgIGV2ZXJ5IGlfdmFyIGluIGlfcHJvY2Vzcy5FbnYgewogICAgICAgIHByaW50KCJhbGxvd19lbnY6IGlfdmFyID0iLCBpX3ZhcikKICAgICAgICBhbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgfQoKICAgIHByaW50KCJhbGxvd19lbnY6IHRydWUiKQp9CgojIEFsbG93IGlucHV0IGVudiB2YXJpYWJsZXMgdGhhdCBhcmUgcHJlc2VudCBpbiB0aGUgcG9saWN5IGRhdGEgdG9vLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHBfdmFyID09IGlfdmFyCiAgICBwcmludCgiYWxsb3dfdmFyIDE6IHRydWUiKQp9CgojIE1hdGNoIGlucHV0IHdpdGggb25lIG9mIHRoZSBwb2xpY3kgdmFyaWFibGVzLCBhZnRlciBzdWJzdGl0dXRpbmcgJChzYW5kYm94LW5hbWUpLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHByaW50KCJhbGxvd192YXIgMjogcF92YXIgPSIsIHBfdmFyKQoKICAgIHBfdmFyX3NwbGl0IDo9IHNwbGl0KHBfdmFyLCAiPSIpCiAgICBjb3VudChwX3Zhcl9zcGxpdCkgPT0gMgoKICAgIHBfdmFyX3NwbGl0WzFdID09ICIkKHNhbmRib3gtbmFtZSkiCgogICAgaV92YXJfc3BsaXQgOj0gc3BsaXQoaV92YXIsICI9IikKICAgIGNvdW50KGlfdmFyX3NwbGl0KSA9PSAyCgogICAgaV92YXJfc3BsaXRbMF0gPT0gcF92YXJfc3BsaXRbMF0KICAgIHJlZ2V4Lm1hdGNoKHNfbmFtZSwgaV92YXJfc3BsaXRbMV0pCgogICAgcHJpbnQoImFsbG93X3ZhciAyOiB0cnVlIikKfQoKIyBBbGxvdyBpbnB1dCBlbnYgdmFyaWFibGVzIHRoYXQgbWF0Y2ggd2l0aCBhIHJlcXVlc3RfZGVmYXVsdHMgcmVnZXguCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHNvbWUgcF9yZWdleDEgaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5DcmVhdGVDb250YWluZXJSZXF1ZXN0LmFsbG93X2Vudl9yZWdleAogICAgcF9yZWdleDIgOj0gcmVwbGFjZShwX3JlZ2V4MSwgIiQoaXB2NF9hKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcHY0X2EpCiAgICBwX3JlZ2V4MyA6PSByZXBsYWNlKHBfcmVnZXgyLCAiJChpcF9wKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcF9wKQogICAgcF9yZWdleDQgOj0gcmVwbGFjZShwX3JlZ2V4MywgIiQoc3ZjX25hbWUpIiwgcG9saWN5X2RhdGEuY29tbW9uLnN2Y19uYW1lKQogICAgcF9yZWdleDUgOj0gcmVwbGFjZShwX3JlZ2V4NCwgIiQoZG5zX2xhYmVsKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5kbnNfbGFiZWwpCgogICAgcHJpbnQoImFsbG93X3ZhciAzOiBwX3JlZ2V4NSA9IiwgcF9yZWdleDUpCiAgICByZWdleC5tYXRjaChwX3JlZ2V4NSwgaV92YXIpCgogICAgcHJpbnQoImFsbG93X3ZhciAzOiB0cnVlIikKfQoKIyBBbGxvdyBmaWVsZFJlZiAiZmllbGRQYXRoOiBzdGF0dXMucG9kSVAiIHZhbHVlcy4KYWxsb3dfdmFyKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBpX3Zhciwgc19uYW1lLCBzX25hbWVzcGFjZSkgewogICAgbmFtZV92YWx1ZSA6PSBzcGxpdChpX3ZhciwgIj0iKQogICAgY291bnQobmFtZV92YWx1ZSkgPT0gMgogICAgaXNfaXAobmFtZV92YWx1ZVsxXSkKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIGFsbG93X3BvZF9pcF92YXIobmFtZV92YWx1ZVswXSwgcF92YXIpCgogICAgcHJpbnQoImFsbG93X3ZhciA0OiB0cnVlIikKfQoKIyBBbGxvdyBjb21tb24gZmllbGRSZWYgdmFyaWFibGVzLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBuYW1lX3ZhbHVlIDo9IHNwbGl0KGlfdmFyLCAiPSIpCiAgICBjb3VudChuYW1lX3ZhbHVlKSA9PSAyCgogICAgc29tZSBwX3ZhciBpbiBwX3Byb2Nlc3MuRW52CiAgICBwX25hbWVfdmFsdWUgOj0gc3BsaXQocF92YXIsICI9IikKICAgIGNvdW50KHBfbmFtZV92YWx1ZSkgPT0gMgoKICAgIHBfbmFtZV92YWx1ZVswXSA9PSBuYW1lX3ZhbHVlWzBdCgogICAgIyBUT0RPOiBzaG91bGQgdGhlc2UgYmUgaGFuZGxlZCBpbiBhIGRpZmZlcmVudCB3YXk/CiAgICBhbHdheXNfYWxsb3dlZCA6PSBbIiQoaG9zdC1uYW1lKSIsICIkKG5vZGUtbmFtZSkiLCAiJChwb2QtdWlkKSJdCiAgICBzb21lIGFsbG93ZWQgaW4gYWx3YXlzX2FsbG93ZWQKICAgIGNvbnRhaW5zKHBfbmFtZV92YWx1ZVsxXSwgYWxsb3dlZCkKCiAgICBwcmludCgiYWxsb3dfdmFyIDU6IHRydWUiKQp9CgojIEFsbG93IGZpZWxkUmVmICJmaWVsZFBhdGg6IHN0YXR1cy5ob3N0SVAiIHZhbHVlcy4KYWxsb3dfdmFyKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBpX3Zhciwgc19uYW1lLCBzX25hbWVzcGFjZSkgewogICAgbmFtZV92YWx1ZSA6PSBzcGxpdChpX3ZhciwgIj0iKQogICAgY291bnQobmFtZV92YWx1ZSkgPT0gMgogICAgaXNfaXAobmFtZV92YWx1ZVsxXSkKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIGFsbG93X2hvc3RfaXBfdmFyKG5hbWVfdmFsdWVbMF0sIHBfdmFyKQoKICAgIHByaW50KCJhbGxvd192YXIgNjogdHJ1ZSIpCn0KCiMgQWxsb3cgcmVzb3VyY2VGaWVsZFJlZiB2YWx1ZXMgKGUuZy4sICJsaW1pdHMuY3B1IikuCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIG5hbWVfdmFsdWUgOj0gc3BsaXQoaV92YXIsICI9IikKICAgIGNvdW50KG5hbWVfdmFsdWUpID09IDIKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHBfbmFtZV92YWx1ZSA6PSBzcGxpdChwX3ZhciwgIj0iKQogICAgY291bnQocF9uYW1lX3ZhbHVlKSA9PSAyCgogICAgcF9uYW1lX3ZhbHVlWzBdID09IG5hbWVfdmFsdWVbMF0KCiAgICAjIGEgdmFyaWFibGUgd2Ugc2hvdWxkIGJlIHZhbGlkYXRpbmcgdXNpbmcgYSByZWdleCBmcm9tIHNldHRpbmdzCiAgICBwX25hbWVfdmFsdWVbMV0gPT0gIiQodmFsaWRhdGUtZnJvbS1zZXR0aW5ncykiCgogICAgcmVnZXhfdmFsIDo9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuQ3JlYXRlQ29udGFpbmVyUmVxdWVzdC5hbGxvd19lbnZfcmVnZXhfbWFwW25hbWVfdmFsdWVbMF1dCgogICAgcHJpbnQoImFsbG93X3ZhciA3OiB2YWwgPSIsIG5hbWVfdmFsdWVbMV0pCiAgICBwcmludCgiYWxsb3dfdmFyIDc6IHJlZ2V4X3ZhbCA9IiwgcmVnZXhfdmFsKQoKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4X3ZhbCwgbmFtZV92YWx1ZVsxXSkKCiAgICBwcmludCgiYWxsb3dfdmFyIDc6IHRydWUiKQp9CgojIE1hdGNoIGlucHV0IHdpdGggb25lIG9mIHRoZSBwb2xpY3kgdmFyaWFibGVzLCBhZnRlciBzdWJzdGl0dXRpbmcgJChzYW5kYm94LW5hbWVzcGFjZSkuCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHNvbWUgcF92YXIgaW4gcF9wcm9jZXNzLkVudgogICAgcF92YXIyIDo9IHJlcGxhY2UocF92YXIsICIkKHNhbmRib3gtbmFtZXNwYWNlKSIsIHNfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd192YXIgODogcF92YXIyID0iLCBwX3ZhcjIpCiAgICBwX3ZhcjIgPT0gaV92YXIKCiAgICBwcmludCgiYWxsb3dfdmFyIDg6IHRydWUiKQp9CgphbGxvd19wb2RfaXBfdmFyKHZhcl9uYW1lLCBwX3ZhcikgewogICAgcHJpbnQoImFsbG93X3BvZF9pcF92YXI6IHZhcl9uYW1lID0iLCB2YXJfbmFtZSwgInBfdmFyID0iLCBwX3ZhcikKCiAgICBwX25hbWVfdmFsdWUgOj0gc3BsaXQocF92YXIsICI9IikKICAgIGNvdW50KHBfbmFtZV92YWx1ZSkgPT0gMgoKICAgIHBfbmFtZV92YWx1ZVswXSA9PSB2YXJfbmFtZQogICAgcF9uYW1lX3ZhbHVlWzFdID09ICIkKHBvZC1pcCkiCgogICAgcHJpbnQoImFsbG93X3BvZF9pcF92YXI6IHRydWUiKQp9CgphbGxvd19ob3N0X2lwX3Zhcih2YXJfbmFtZSwgcF92YXIpIHsKICAgIHByaW50KCJhbGxvd19ob3N0X2lwX3ZhcjogdmFyX25hbWUgPSIsIHZhcl9uYW1lLCAicF92YXIgPSIsIHBfdmFyKQoKICAgIHBfbmFtZV92YWx1ZSA6PSBzcGxpdChwX3ZhciwgIj0iKQogICAgY291bnQocF9uYW1lX3ZhbHVlKSA9PSAyCgogICAgcF9uYW1lX3ZhbHVlWzBdID09IHZhcl9uYW1lCiAgICBwX25hbWVfdmFsdWVbMV0gPT0gIiQoaG9zdC1pcCkiCgogICAgcHJpbnQoImFsbG93X2hvc3RfaXBfdmFyOiB0cnVlIikKfQoKaXNfaXAodmFsdWUpIHsKICAgIGJ5dGVzID0gc3BsaXQodmFsdWUsICIuIikKICAgIGNvdW50KGJ5dGVzKSA9PSA0CgogICAgaXNfaXBfZmlyc3RfYnl0ZShieXRlc1swXSkKICAgIGlzX2lwX290aGVyX2J5dGUoYnl0ZXNbMV0pCiAgICBpc19pcF9vdGhlcl9ieXRlKGJ5dGVzWzJdKQogICAgaXNfaXBfb3RoZXJfYnl0ZShieXRlc1szXSkKfQppc19pcF9maXJzdF9ieXRlKGNvbXBvbmVudCkgewogICAgbnVtYmVyID0gdG9fbnVtYmVyKGNvbXBvbmVudCkKICAgIG51bWJlciA+PSAxCiAgICBudW1iZXIgPD0gMjU1Cn0KaXNfaXBfb3RoZXJfYnl0ZShjb21wb25lbnQpIHsKICAgIG51bWJlciA9IHRvX251bWJlcihjb21wb25lbnQpCiAgICBudW1iZXIgPj0gMAogICAgbnVtYmVyIDw9IDI1NQp9CgojIE9DSSByb290LlBhdGgKYWxsb3dfcm9vdF9wYXRoKHBfb2NpLCBpX29jaSwgYnVuZGxlX2lkKSB7CiAgICBpX3BhdGggOj0gaV9vY2kuUm9vdC5QYXRoCiAgICBwX3BhdGgxIDo9IHBfb2NpLlJvb3QuUGF0aAogICAgcHJpbnQoImFsbG93X3Jvb3RfcGF0aDogaV9wYXRoID0iLCBpX3BhdGgsICJwX3BhdGgxID0iLCBwX3BhdGgxKQoKICAgIHBfcGF0aDIgOj0gcmVwbGFjZShwX3BhdGgxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfcm9vdF9wYXRoOiBwX3BhdGgyID0iLCBwX3BhdGgyKQoKICAgIHBfcGF0aDMgOj0gcmVwbGFjZShwX3BhdGgyLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X3Jvb3RfcGF0aDogcF9wYXRoMyA9IiwgcF9wYXRoMykKCiAgICBwX3BhdGgzID09IGlfcGF0aAoKICAgIHByaW50KCJhbGxvd19yb290X3BhdGg6IHRydWUiKQp9CgojIGRldmljZSBtb3VudHMKYWxsb3dfbW91bnQocF9vY2ksIGlfbW91bnQsIGlfc3RvcmFnZXMsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcHJpbnQoImFsbG93X21vdW50OiBpX21vdW50ID0iLCBpX21vdW50KQoKICAgIHNvbWUgcF9tb3VudCBpbiBwX29jaS5Nb3VudHMKICAgIHNvbWUgaV9zdG9yYWdlIGluIGlfc3RvcmFnZXMKCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IHBfbW91bnQgPSIsIHBfbW91bnQpCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IGlfc3RvcmFnZSA9IiwgaV9zdG9yYWdlKQoKICAgIGNoZWNrX21vdW50KHBfbW91bnQsIGlfbW91bnQsIGlfc3RvcmFnZSwgYnVuZGxlX2lkLCBzYW5kYm94X2lkKQoKICAgICMgVE9ETzogYXJlIHRoZXJlIGFueSBvdGhlciByZXF1aXJlZCBwb2xpY3kgY2hlY2tzIGZvciBtb3VudHMgLSBlLmcuLAogICAgIyAgICAgICBtdWx0aXBsZSBtb3VudHMgd2l0aCBzYW1lIHNvdXJjZSBvciBkZXN0aW5hdGlvbj8KCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IHRydWUiKQp9CgpjaGVja19tb3VudChwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcF9tb3VudCA9PSBpX21vdW50CiAgICBwcmludCgiY2hlY2tfbW91bnQgMTogdHJ1ZSIpCn0KY2hlY2tfbW91bnQocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHBfbW91bnQuZGVzdGluYXRpb24gPT0gaV9tb3VudC5kZXN0aW5hdGlvbgogICAgcF9tb3VudC50eXBlXyA9PSBpX21vdW50LnR5cGVfCiAgICBwX21vdW50Lm9wdGlvbnMgPT0gaV9tb3VudC5vcHRpb25zCgogICAgbW91bnRfc291cmNlX2FsbG93cyhwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkKCiAgICBwcmludCgiY2hlY2tfbW91bnQgMjogdHJ1ZSIpCn0KCm1vdW50X3NvdXJjZV9hbGxvd3MocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHJlZ2V4MSA6PSBwX21vdW50LnNvdXJjZQogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5tb3VudF9zb3VyY2VfY3BhdGgpCiAgICByZWdleDQgOj0gcmVwbGFjZShyZWdleDMsICIkKGJ1bmRsZS1pZCkiLCBidW5kbGVfaWQpCgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMTogcmVnZXg0ID0iLCByZWdleDQpCiAgICByZWdleC5tYXRjaChyZWdleDQsIGlfbW91bnQuc291cmNlKQoKICAgIHByaW50KCJtb3VudF9zb3VyY2VfYWxsb3dzIDE6IHRydWUiKQp9Cm1vdW50X3NvdXJjZV9hbGxvd3MocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHJlZ2V4MSA6PSBwX21vdW50LnNvdXJjZQogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5tb3VudF9zb3VyY2VfY3BhdGgpCiAgICByZWdleDQgOj0gcmVwbGFjZShyZWdleDMsICIkKHNhbmRib3gtaWQpIiwgc2FuZGJveF9pZCkKCiAgICBwcmludCgibW91bnRfc291cmNlX2FsbG93cyAyOiByZWdleDQgPSIsIHJlZ2V4NCkKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4NCwgaV9tb3VudC5zb3VyY2UpCgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMjogdHJ1ZSIpCn0KbW91bnRfc291cmNlX2FsbG93cyhwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogaV9tb3VudC5zb3VyY2UgPSIsIGlfbW91bnQuc291cmNlKQogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogaV9zdG9yYWdlLm1vdW50X3BvaW50ID0iLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCgogICAgaV9tb3VudC5zb3VyY2UgPT0gaV9zdG9yYWdlLm1vdW50X3BvaW50CgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogdHJ1ZSIpCn0KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBDcmVhdGUgY29udGFpbmVyIFN0b3JhZ2VzCgphbGxvd19zdG9yYWdlcyhwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHBfY291bnQgOj0gY291bnQocF9zdG9yYWdlcykKICAgIGlfY291bnQgOj0gY291bnQoaV9zdG9yYWdlcykKICAgIHByaW50KCJhbGxvd19zdG9yYWdlczogcF9jb3VudCA9IiwgcF9jb3VudCwgImlfY291bnQgPSIsIGlfY291bnQpCgogICAgcF9jb3VudCA9PSBpX2NvdW50CgogICAgIyBHZXQgdGhlIGNvbnRhaW5lciBpbWFnZSBsYXllciBJRHMgYW5kIHZlcml0eSByb290IGhhc2hlcywgZnJvbSB0aGUgIm92ZXJsYXlmcyIgc3RvcmFnZS4KICAgIHNvbWUgb3ZlcmxheV9zdG9yYWdlIGluIHBfc3RvcmFnZXMKICAgIG92ZXJsYXlfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIHByaW50KCJhbGxvd19zdG9yYWdlczogb3ZlcmxheV9zdG9yYWdlID0iLCBvdmVybGF5X3N0b3JhZ2UpCiAgICBjb3VudChvdmVybGF5X3N0b3JhZ2Uub3B0aW9ucykgPT0gMgoKICAgIGxheWVyX2lkcyA6PSBzcGxpdChvdmVybGF5X3N0b3JhZ2Uub3B0aW9uc1swXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiBsYXllcl9pZHMgPSIsIGxheWVyX2lkcykKCiAgICByb290X2hhc2hlcyA6PSBzcGxpdChvdmVybGF5X3N0b3JhZ2Uub3B0aW9uc1sxXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiByb290X2hhc2hlcyA9Iiwgcm9vdF9oYXNoZXMpCgogICAgZXZlcnkgaV9zdG9yYWdlIGluIGlfc3RvcmFnZXMgewogICAgICAgIGFsbG93X3N0b3JhZ2UocF9zdG9yYWdlcywgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpCiAgICB9CgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiB0cnVlIikKfQoKYWxsb3dfc3RvcmFnZShwX3N0b3JhZ2VzLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgc29tZSBwX3N0b3JhZ2UgaW4gcF9zdG9yYWdlcwoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiBwX3N0b3JhZ2UgPSIsIHBfc3RvcmFnZSkKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiBpX3N0b3JhZ2UgPSIsIGlfc3RvcmFnZSkKCiAgICBwX3N0b3JhZ2UuZHJpdmVyICAgICAgICAgICA9PSBpX3N0b3JhZ2UuZHJpdmVyCiAgICBwX3N0b3JhZ2UuZHJpdmVyX29wdGlvbnMgICA9PSBpX3N0b3JhZ2UuZHJpdmVyX29wdGlvbnMKICAgIHBfc3RvcmFnZS5mc19ncm91cCAgICAgICAgID09IGlfc3RvcmFnZS5mc19ncm91cAogICAgcF9zdG9yYWdlLmZzdHlwZSAgICAgICAgICAgPT0gaV9zdG9yYWdlLmZzdHlwZQoKICAgIGFsbG93X3N0b3JhZ2Vfc291cmNlKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKQogICAgYWxsb3dfc3RvcmFnZV9vcHRpb25zKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKQogICAgYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKQoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiB0cnVlIikKfQoKYWxsb3dfc3RvcmFnZV9zb3VyY2UocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX3NvdXJjZSAxOiBzdGFydCIpCgogICAgcF9zdG9yYWdlLnNvdXJjZSA9PSBpX3N0b3JhZ2Uuc291cmNlCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDE6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX3NvdXJjZShwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDI6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCgogICAgIyBEREREOkJCOkRELkY6IERvbWFpbjpCdXM6RGV2aWNlLkZ1bmN0aW9uCiAgICAjIGh0dHBzOi8vd3d3Lmtlcm5lbC5vcmcvZG9jL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtYnVzLXBjaQogICAgcmVnZXgubWF0Y2goYF5bYS1mMC05XXs0fTpbYS1mMC05XXsyfTpbYS1mMC05XXsyfVwuW2EtZjAtOV0kYCwgaV9zdG9yYWdlLnNvdXJjZSkKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9zb3VyY2UgMjogdHJ1ZSIpCn0KCmFsbG93X3N0b3JhZ2Vfc291cmNlKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKSB7CiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9zb3VyY2UgMzogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIGlfc3RvcmFnZS5zb3VyY2UgPT0gIm5vbmUiCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDM6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX3NvdXJjZShwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDQ6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJzbWIiCgogICAgIyBQYXR0ZXJuOiAvLzxzdG9yYWdlLWFjY291bnQtbmFtZT4uZmlsZS5jb3JlLndpbmRvd3MubmV0LzxrOHMtUFZDLW5hbWU+CiAgICAjIFN0b3JhZ2UgYWNjb3VudCBuYW1lOiBodHRwczovL2xlYXJuLm1pY3Jvc29mdC5jb20vZW4tdXMvYXp1cmUvc3RvcmFnZS9jb21tb24vc3RvcmFnZS1hY2NvdW50LW92ZXJ2aWV3I3N0b3JhZ2UtYWNjb3VudC1uYW1lCiAgICAjIEs4cyBQVkMgbmFtZTogaHR0cHM6Ly9rdWJlcm5ldGVzLmlvL2RvY3MvY29uY2VwdHMvb3ZlcnZpZXcvd29ya2luZy13aXRoLW9iamVjdHMvbmFtZXMvI2Rucy1zdWJkb21haW4tbmFtZXMKICAgIHJlZ2V4Lm1hdGNoKGBeXC9cLyhbYS16MC05XXszLDI0fSlcLmZpbGVcLmNvcmVcLndpbmRvd3NcLm5ldFwvW2EtejAtOV0oW2EtejAtOS4tXXswLDI1MX1bYS16MC05XSk/JGAsIGlfc3RvcmFnZS5zb3VyY2UpCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDQ6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMTogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgIT0gIm92ZXJsYXlmcyIKICAgIHBfc3RvcmFnZS5vcHRpb25zID09IGlfc3RvcmFnZS5vcHRpb25zCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAxOiB0cnVlIikKfQphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIGNvdW50KHBfc3RvcmFnZS5vcHRpb25zKSA9PSAyCgogICAgcG9saWN5X2lkcyA6PSBzcGxpdChwX3N0b3JhZ2Uub3B0aW9uc1swXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBwb2xpY3lfaWRzID0iLCBwb2xpY3lfaWRzKQogICAgcG9saWN5X2lkcyA9PSBsYXllcl9pZHMKCiAgICBwb2xpY3lfaGFzaGVzIDo9IHNwbGl0KHBfc3RvcmFnZS5vcHRpb25zWzFdLCAiOiIpCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IHBvbGljeV9oYXNoZXMgPSIsIHBvbGljeV9oYXNoZXMpCgogICAgcF9jb3VudCA6PSBjb3VudChwb2xpY3lfaWRzKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBwX2NvdW50ID0iLCBwX2NvdW50KQogICAgcF9jb3VudCA+PSAxCiAgICBwX2NvdW50ID09IGNvdW50KHBvbGljeV9oYXNoZXMpCgogICAgaV9jb3VudCA6PSBjb3VudChpX3N0b3JhZ2Uub3B0aW9ucykKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogaV9jb3VudCA9IiwgaV9jb3VudCkKICAgIGlfY291bnQgPT0gcF9jb3VudCArIDMKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zWzBdID0iLCBpX3N0b3JhZ2Uub3B0aW9uc1swXSkKICAgIGlfc3RvcmFnZS5vcHRpb25zWzBdID09ICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQubGF5ZXItc3JjLXByZWZpeD0vdmFyL2xpYi9jb250YWluZXJkL2lvLmNvbnRhaW5lcmQuc25hcHNob3R0ZXIudjEudGFyZGV2L2xheWVycyIKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zW2lfY291bnQgLSAyXSA9IiwgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDJdKQogICAgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDJdID09ICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQub3ZlcmxheS1ydyIKCiAgICBsb3dlcmRpciA6PSBjb25jYXQoIj0iLCBbImxvd2VyZGlyIiwgcF9zdG9yYWdlLm9wdGlvbnNbMF1dKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBsb3dlcmRpciA9IiwgbG93ZXJkaXIpCgogICAgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDFdID09IGxvd2VyZGlyCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zW2lfY291bnQgLSAxXSA9IiwgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDFdKQoKICAgIGV2ZXJ5IGksIHBvbGljeV9pZCBpbiBwb2xpY3lfaWRzIHsKICAgICAgICBhbGxvd19vdmVybGF5X2xheWVyKHBvbGljeV9pZCwgcG9saWN5X2hhc2hlc1tpXSwgaV9zdG9yYWdlLm9wdGlvbnNbaSArIDFdKQogICAgfQoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogdHJ1ZSIpCn0KYWxsb3dfc3RvcmFnZV9vcHRpb25zKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKSB7CiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDM6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCiAgICBjb3VudChwX3N0b3JhZ2Uub3B0aW9ucykgPT0gMQoKICAgIHN0YXJ0c3dpdGgocF9zdG9yYWdlLm9wdGlvbnNbMF0sICIkKGhhc2giKQogICAgaGFzaF9zdWZmaXggOj0gdHJpbV9sZWZ0KHBfc3RvcmFnZS5vcHRpb25zWzBdLCAiJChoYXNoIikKCiAgICBlbmRzd2l0aChoYXNoX3N1ZmZpeCwgIikiKQogICAgaGFzaF9pbmRleCA6PSB0cmltX3JpZ2h0KGhhc2hfc3VmZml4LCAiKSIpCiAgICBpIDo9IHRvX251bWJlcihoYXNoX2luZGV4KQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAzOiBpID0iLCBpKQoKICAgIGhhc2hfb3B0aW9uIDo9IGNvbmNhdCgiPSIsIFsiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LnJvb3QtaGFzaCIsIHJvb3RfaGFzaGVzW2ldXSkKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMzogaGFzaF9vcHRpb24gPSIsIGhhc2hfb3B0aW9uKQoKICAgIGNvdW50KGlfc3RvcmFnZS5vcHRpb25zKSA9PSA0CiAgICBpX3N0b3JhZ2Uub3B0aW9uc1swXSA9PSAicm8iCiAgICBpX3N0b3JhZ2Uub3B0aW9uc1sxXSA9PSAiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmJsb2NrX2RldmljZT1maWxlIgogICAgaV9zdG9yYWdlLm9wdGlvbnNbMl0gPT0gImlvLmthdGFjb250YWluZXJzLmZzLW9wdC5pcy1sYXllciIKICAgIGlfc3RvcmFnZS5vcHRpb25zWzNdID09IGhhc2hfb3B0aW9uCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAzOiB0cnVlIikKfQphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgNDogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gInNtYiIKICAgIHBfb3B0c19jb3VudCA6PSBjb3VudChwX3N0b3JhZ2Uub3B0aW9ucykKICAgIGlfb3B0c19jb3VudCA6PSBjb3VudChpX3N0b3JhZ2Uub3B0aW9ucykKICAgIGlfb3B0c19jb3VudCA9PSBwX29wdHNfY291bnQgKyAyCgogICAgaV9vcHRfbWF0Y2hlcyA6PSBbaSB8IGkgOj0gaWR4OyBpZHggPCBwX29wdHNfY291bnQ7IHBfc3RvcmFnZS5vcHRpb25zW2lkeF0gPT0gaV9zdG9yYWdlLm9wdGlvbnNbaWR4XV0KICAgIGNvdW50KGlfb3B0X21hdGNoZXMpID09IHBfb3B0c19jb3VudAoKICAgIHN0YXJ0c3dpdGgoaV9zdG9yYWdlLm9wdGlvbnNbaV9vcHRzX2NvdW50LTJdLCAiYWRkcj0iKQogICAgY3JlZHMgPSBzcGxpdChpX3N0b3JhZ2Uub3B0aW9uc1tpX29wdHNfY291bnQtMV0sICIsIikKICAgIGNvdW50KGNyZWRzKSA9PSAyCiAgICBzdGFydHN3aXRoKGNyZWRzWzBdLCAidXNlcm5hbWU9IikKICAgIHN0YXJ0c3dpdGgoY3JlZHNbMV0sICJwYXNzd29yZD0iKQogICAgCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDQ6IHRydWUiKQp9CgphbGxvd19vdmVybGF5X2xheWVyKHBvbGljeV9pZCwgcG9saWN5X2hhc2gsIGlfb3B0aW9uKSB7CiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogcG9saWN5X2lkID0iLCBwb2xpY3lfaWQsICJwb2xpY3lfaGFzaCA9IiwgcG9saWN5X2hhc2gpCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogaV9vcHRpb24gPSIsIGlfb3B0aW9uKQoKICAgIHN0YXJ0c3dpdGgoaV9vcHRpb24sICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQubGF5ZXI9IikKICAgIGlfdmFsdWUgOj0gcmVwbGFjZShpX29wdGlvbiwgImlvLmthdGFjb250YWluZXJzLmZzLW9wdC5sYXllcj0iLCAiIikKICAgIGlfdmFsdWVfZGVjb2RlZCA6PSBiYXNlNjQuZGVjb2RlKGlfdmFsdWUpCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogaV92YWx1ZV9kZWNvZGVkID0iLCBpX3ZhbHVlX2RlY29kZWQpCgogICAgcG9saWN5X3N1ZmZpeCA6PSBjb25jYXQoIj0iLCBbInRhcixybyxpby5rYXRhY29udGFpbmVycy5mcy1vcHQuYmxvY2tfZGV2aWNlPWZpbGUsaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmlzLWxheWVyLGlvLmthdGFjb250YWluZXJzLmZzLW9wdC5yb290LWhhc2giLCBwb2xpY3lfaGFzaF0pCiAgICBwX3ZhbHVlIDo9IGNvbmNhdCgiLCIsIFtwb2xpY3lfaWQsIHBvbGljeV9zdWZmaXhdKQogICAgcHJpbnQoImFsbG93X292ZXJsYXlfbGF5ZXI6IHBfdmFsdWUgPSIsIHBfdmFsdWUpCgogICAgcF92YWx1ZSA9PSBpX3ZhbHVlX2RlY29kZWQKCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogdHJ1ZSIpCn0KCmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAidGFyIgoKICAgIHN0YXJ0c3dpdGgocF9zdG9yYWdlLm1vdW50X3BvaW50LCAiJChsYXllciIpCiAgICBtb3VudF9zdWZmaXggOj0gdHJpbV9sZWZ0KHBfc3RvcmFnZS5tb3VudF9wb2ludCwgIiQobGF5ZXIiKQoKICAgIGVuZHN3aXRoKG1vdW50X3N1ZmZpeCwgIikiKQogICAgbGF5ZXJfaW5kZXggOj0gdHJpbV9yaWdodChtb3VudF9zdWZmaXgsICIpIikKICAgIGkgOj0gdG9fbnVtYmVyKGxheWVyX2luZGV4KQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDE6IGkgPSIsIGkpCgogICAgbGF5ZXJfaWQgOj0gbGF5ZXJfaWRzW2ldCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMTogbGF5ZXJfaWQgPSIsIGxheWVyX2lkKQoKICAgIHBfbW91bnQgOj0gY29uY2F0KCIvIiwgWyIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L2xheWVycyIsIGxheWVyX2lkXSkKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCAxOiBwX21vdW50ID0iLCBwX21vdW50KQoKICAgIHBfbW91bnQgPT0gaV9zdG9yYWdlLm1vdW50X3BvaW50CgogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDE6IHRydWUiKQp9CmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAiZnVzZTMua2F0YS1vdmVybGF5IgoKICAgIG1vdW50MSA6PSByZXBsYWNlKHBfc3RvcmFnZS5tb3VudF9wb2ludCwgIiQoY3BhdGgpIiwgcG9saWN5X2RhdGEuY29tbW9uLmNwYXRoKQogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDI6IG1vdW50MiA9IiwgbW91bnQyKQoKICAgIG1vdW50MiA9PSBpX3N0b3JhZ2UubW91bnRfcG9pbnQKCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMjogdHJ1ZSIpCn0KYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKSB7CiAgICBwX3N0b3JhZ2UuZnN0eXBlID09ICJsb2NhbCIKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQyID0iLCBtb3VudDIpCgogICAgbW91bnQzIDo9IHJlcGxhY2UobW91bnQyLCAiJChzYW5kYm94LWlkKSIsIHNhbmRib3hfaWQpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQzID0iLCBtb3VudDMpCgogICAgcmVnZXgubWF0Y2gobW91bnQzLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCgogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDM6IHRydWUiKQp9CmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAiYmluZCIKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNDogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNDogbW91bnQyID0iLCBtb3VudDIpCgogICAgbW91bnQzIDo9IHJlcGxhY2UobW91bnQyLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDQ6IG1vdW50MyA9IiwgbW91bnQzKQoKICAgIHJlZ2V4Lm1hdGNoKG1vdW50MywgaV9zdG9yYWdlLm1vdW50X3BvaW50KQoKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA0OiB0cnVlIikKfQphbGxvd19tb3VudF9wb2ludChwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgYnVuZGxlX2lkLCBzYW5kYm94X2lkLCBsYXllcl9pZHMpIHsKICAgIHBfc3RvcmFnZS5mc3R5cGUgPT0gInRtcGZzIgoKICAgIG1vdW50MSA6PSBwX3N0b3JhZ2UubW91bnRfcG9pbnQKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA1OiBtb3VudDEgPSIsIG1vdW50MSkKCiAgICByZWdleC5tYXRjaChtb3VudDEsIGlfc3RvcmFnZS5tb3VudF9wb2ludCkKCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNTogdHJ1ZSIpCn0KYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKSB7CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogaV9zdG9yYWdlLm1vdW50X3BvaW50ID0iLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCiAgICBhbGxvd19kaXJlY3Rfdm9sX2RyaXZlcihwX3N0b3JhZ2UsIGlfc3RvcmFnZSkKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChzcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQyID0iLCBtb3VudDIpCgogICAgZGlyZWN0X3ZvbF9wYXRoIDo9IGlfc3RvcmFnZS5zb3VyY2UKICAgIG1vdW50MyA6PSByZXBsYWNlKG1vdW50MiwgIiQoYjY0LWRpcmVjdC12b2wtcGF0aCkiLCBiYXNlNjR1cmwuZW5jb2RlKGRpcmVjdF92b2xfcGF0aCkpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQzID0iLCBtb3VudDMpCgogICAgbW91bnQzID09IGlfc3RvcmFnZS5tb3VudF9wb2ludAoKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA2OiB0cnVlIikKfQoKYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIocF9zdG9yYWdlLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19kaXJlY3Rfdm9sX2RyaXZlciAxOiBzdGFydCIpCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCiAgICBwcmludCgiYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIgMTogdHJ1ZSIpCn0KYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIocF9zdG9yYWdlLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19kaXJlY3Rfdm9sX2RyaXZlciAyOiBzdGFydCIpCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJzbWIiCiAgICBwcmludCgiYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIgMjogdHJ1ZSIpCn0KCiMgRXhlY1Byb2Nlc3NSZXF1ZXN0LnByb2Nlc3MuQ2FwYWJpbGl0aWVzCmFsbG93X2V4ZWNfY2FwcyhpX2NhcHMpIHsKICAgIG5vdCBpX2NhcHMuQW1iaWVudAogICAgbm90IGlfY2Fwcy5Cb3VuZGluZwogICAgbm90IGlfY2Fwcy5FZmZlY3RpdmUKICAgIG5vdCBpX2NhcHMuSW5oZXJpdGFibGUKICAgIG5vdCBpX2NhcHMuUGVybWl0dGVkCn0KCiMgT0NJLlByb2Nlc3MuQ2FwYWJpbGl0aWVzCmFsbG93X2NhcHMocF9jYXBzLCBpX2NhcHMpIHsKICAgIHByaW50KCJhbGxvd19jYXBzOiBwb2xpY3kgQW1iaWVudCA9IiwgcF9jYXBzLkFtYmllbnQpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgQW1iaWVudCA9IiwgaV9jYXBzLkFtYmllbnQpCiAgICBtYXRjaF9jYXBzKHBfY2Fwcy5BbWJpZW50LCBpX2NhcHMuQW1iaWVudCkKCiAgICBwcmludCgiYWxsb3dfY2FwczogcG9saWN5IEJvdW5kaW5nID0iLCBwX2NhcHMuQm91bmRpbmcpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgQm91bmRpbmcgPSIsIGlfY2Fwcy5Cb3VuZGluZykKICAgIG1hdGNoX2NhcHMocF9jYXBzLkJvdW5kaW5nLCBpX2NhcHMuQm91bmRpbmcpCgogICAgcHJpbnQoImFsbG93X2NhcHM6IHBvbGljeSBFZmZlY3RpdmUgPSIsIHBfY2Fwcy5FZmZlY3RpdmUpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgRWZmZWN0aXZlID0iLCBpX2NhcHMuRWZmZWN0aXZlKQogICAgbWF0Y2hfY2FwcyhwX2NhcHMuRWZmZWN0aXZlLCBpX2NhcHMuRWZmZWN0aXZlKQoKICAgIHByaW50KCJhbGxvd19jYXBzOiBwb2xpY3kgSW5oZXJpdGFibGUgPSIsIHBfY2Fwcy5Jbmhlcml0YWJsZSkKICAgIHByaW50KCJhbGxvd19jYXBzOiBpbnB1dCBJbmhlcml0YWJsZSA9IiwgaV9jYXBzLkluaGVyaXRhYmxlKQogICAgbWF0Y2hfY2FwcyhwX2NhcHMuSW5oZXJpdGFibGUsIGlfY2Fwcy5Jbmhlcml0YWJsZSkKCiAgICBwcmludCgiYWxsb3dfY2FwczogcG9saWN5IFBlcm1pdHRlZCA9IiwgcF9jYXBzLlBlcm1pdHRlZCkKICAgIHByaW50KCJhbGxvd19jYXBzOiBpbnB1dCBQZXJtaXR0ZWQgPSIsIGlfY2Fwcy5QZXJtaXR0ZWQpCiAgICBtYXRjaF9jYXBzKHBfY2Fwcy5QZXJtaXR0ZWQsIGlfY2Fwcy5QZXJtaXR0ZWQpCn0KCm1hdGNoX2NhcHMocF9jYXBzLCBpX2NhcHMpIHsKICAgIHByaW50KCJtYXRjaF9jYXBzIDE6IHN0YXJ0IikKCiAgICBwX2NhcHMgPT0gaV9jYXBzCgogICAgcHJpbnQoIm1hdGNoX2NhcHMgMTogdHJ1ZSIpCn0KbWF0Y2hfY2FwcyhwX2NhcHMsIGlfY2FwcykgewogICAgcHJpbnQoIm1hdGNoX2NhcHMgMjogc3RhcnQiKQoKICAgIGNvdW50KHBfY2FwcykgPT0gMQogICAgcF9jYXBzWzBdID09ICIkKGRlZmF1bHRfY2FwcykiCgogICAgcHJpbnQoIm1hdGNoX2NhcHMgMjogZGVmYXVsdF9jYXBzID0iLCBwb2xpY3lfZGF0YS5jb21tb24uZGVmYXVsdF9jYXBzKQogICAgcG9saWN5X2RhdGEuY29tbW9uLmRlZmF1bHRfY2FwcyA9PSBpX2NhcHMKCiAgICBwcmludCgibWF0Y2hfY2FwcyAyOiB0cnVlIikKfQptYXRjaF9jYXBzKHBfY2FwcywgaV9jYXBzKSB7CiAgICBwcmludCgibWF0Y2hfY2FwcyAzOiBzdGFydCIpCgogICAgY291bnQocF9jYXBzKSA9PSAxCiAgICBwX2NhcHNbMF0gPT0gIiQocHJpdmlsZWdlZF9jYXBzKSIKCiAgICBwcmludCgibWF0Y2hfY2FwcyAzOiBwcml2aWxlZ2VkX2NhcHMgPSIsIHBvbGljeV9kYXRhLmNvbW1vbi5wcml2aWxlZ2VkX2NhcHMpCiAgICBwb2xpY3lfZGF0YS5jb21tb24ucHJpdmlsZWdlZF9jYXBzID09IGlfY2FwcwoKICAgIHByaW50KCJtYXRjaF9jYXBzIDM6IHRydWUiKQp9CgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgpjaGVja19kaXJlY3RvcnlfdHJhdmVyc2FsKGlfcGF0aCkgewogICAgbm90IHJlZ2V4Lm1hdGNoKCIoXnwvKS4uKCR8LykiLCBpX3BhdGgpCn0KCmNoZWNrX3N5bWxpbmtfc291cmNlKGlfc3JjKSB7CiAgICBpX3NyYyA9PSAiIgogICAgcHJpbnQoImNoZWNrX3N5bWxpbmtfc291cmNlIDE6IHRydWUiKQp9CmNoZWNrX3N5bWxpbmtfc291cmNlKGlfc3JjKSB7CiAgICBpX3NyYyAhPSAiIgogICAgcHJpbnQoImNoZWNrX3N5bWxpbmtfc291cmNlIDI6IGlfc3JjID0iLCBpX3NyYykKCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24uc19zb3VyY2UxLCBpX3NyYykKCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMjogdHJ1ZSIpCn0KY2hlY2tfc3ltbGlua19zb3VyY2UoaV9zcmMpIHsKICAgIGlfc3JjICE9ICIiCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMzogaV9zcmMgPSIsIGlfc3JjKQoKICAgIHJlZ2V4Lm1hdGNoKHBvbGljeV9kYXRhLmNvbW1vbi5zX3NvdXJjZTIsIGlfc3JjKQogICAgY2hlY2tfZGlyZWN0b3J5X3RyYXZlcnNhbChpX3NyYykKCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMzogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfc3RvcmFnZXMoaV9zdG9yYWdlcykgewogICAgcHJpbnQoImFsbG93X3NhbmRib3hfc3RvcmFnZXM6IGlfc3RvcmFnZXMgPSIsIGlfc3RvcmFnZXMpCgogICAgcF9zdG9yYWdlcyA6PSBwb2xpY3lfZGF0YS5zYW5kYm94LnN0b3JhZ2VzCiAgICBldmVyeSBpX3N0b3JhZ2UgaW4gaV9zdG9yYWdlcyB7CiAgICAgICAgYWxsb3dfc2FuZGJveF9zdG9yYWdlKHBfc3RvcmFnZXMsIGlfc3RvcmFnZSkKICAgIH0KCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9zdG9yYWdlczogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfc3RvcmFnZShwX3N0b3JhZ2VzLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IGlfc3RvcmFnZSA9IiwgaV9zdG9yYWdlKQoKICAgIHNvbWUgcF9zdG9yYWdlIGluIHBfc3RvcmFnZXMKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IHBfc3RvcmFnZSA9IiwgcF9zdG9yYWdlKQogICAgaV9zdG9yYWdlID09IHBfc3RvcmFnZQoKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IHRydWUiKQp9CgpDb3B5RmlsZVJlcXVlc3QgewogICAgcHJpbnQoIkNvcHlGaWxlUmVxdWVzdDogaW5wdXQucGF0aCA9IiwgaW5wdXQucGF0aCkKCiAgICBjaGVja19zeW1saW5rX3NvdXJjZShpbnB1dC5zeW1saW5rX3NyYykKICAgIGNoZWNrX2RpcmVjdG9yeV90cmF2ZXJzYWwoaW5wdXQucGF0aCkKCiAgICBzb21lIHJlZ2V4MSBpbiBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLkNvcHlGaWxlUmVxdWVzdAogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5jcGF0aCkKICAgIHJlZ2V4NCA6PSByZXBsYWNlKHJlZ2V4MywgIiQoYnVuZGxlLWlkKSIsIEJVTkRMRV9JRCkKICAgIHByaW50KCJDb3B5RmlsZVJlcXVlc3Q6IHJlZ2V4NCA9IiwgcmVnZXg0KQoKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4NCwgaW5wdXQucGF0aCkKCiAgICBwcmludCgiQ29weUZpbGVSZXF1ZXN0OiB0cnVlIikKfQoKQ3JlYXRlU2FuZGJveFJlcXVlc3QgewogICAgcHJpbnQoIkNyZWF0ZVNhbmRib3hSZXF1ZXN0OiBpbnB1dC5ndWVzdF9ob29rX3BhdGggPSIsIGlucHV0Lmd1ZXN0X2hvb2tfcGF0aCkKICAgIGNvdW50KGlucHV0Lmd1ZXN0X2hvb2tfcGF0aCkgPT0gMAoKICAgIHByaW50KCJDcmVhdGVTYW5kYm94UmVxdWVzdDogaW5wdXQua2VybmVsX21vZHVsZXMgPSIsIGlucHV0Lmtlcm5lbF9tb2R1bGVzKQogICAgY291bnQoaW5wdXQua2VybmVsX21vZHVsZXMpID09IDAKCiAgICBpX3BpZG5zIDo9IGlucHV0LnNhbmRib3hfcGlkbnMKICAgIHByaW50KCJDcmVhdGVTYW5kYm94UmVxdWVzdDogaV9waWRucyA9IiwgaV9waWRucykKICAgIGlfcGlkbnMgPT0gZmFsc2UKICAgIGFsbG93X3NhbmRib3hfc3RvcmFnZXMoaW5wdXQuc3RvcmFnZXMpCn0KCmFsbG93X2V4ZWMocF9jb250YWluZXIsIGlfcHJvY2VzcykgewogICAgcHJpbnQoImFsbG93X2V4ZWM6IHN0YXJ0IikKCiAgICBwX29jaSA9IHBfY29udGFpbmVyLk9DSQogICAgcF9zX25hbWUgPSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc19uYW1lc3BhY2UgPSBnZXRfc3RhdGVfdmFsKCJuYW1lc3BhY2UiKQogICAgYWxsb3dfcHJvYmVfcHJvY2VzcyhwX29jaS5Qcm9jZXNzLCBpX3Byb2Nlc3MsIHBfc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfZXhlYzogdHJ1ZSIpCn0KCmFsbG93X2ludGVyYWN0aXZlX2V4ZWMocF9jb250YWluZXIsIGlfcHJvY2VzcykgewogICAgcHJpbnQoImFsbG93X2ludGVyYWN0aXZlX2V4ZWM6IHN0YXJ0IikKCiAgICBwX29jaSA9IHBfY29udGFpbmVyLk9DSQogICAgcF9zX25hbWUgPSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc19uYW1lc3BhY2UgPSBnZXRfc3RhdGVfdmFsKCJuYW1lc3BhY2UiKQogICAgYWxsb3dfaW50ZXJhY3RpdmVfcHJvY2VzcyhwX29jaS5Qcm9jZXNzLCBpX3Byb2Nlc3MsIHBfc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfaW50ZXJhY3RpdmVfZXhlYzogdHJ1ZSIpCn0KCiMgVE9ETzogc2hvdWxkIG90aGVyIEV4ZWNQcm9jZXNzUmVxdWVzdCBpbnB1dCBkYXRhIGZpZWxkcyBiZSB2YWxpZGF0ZWQgYXMgd2VsbD8KRXhlY1Byb2Nlc3NSZXF1ZXN0IHsKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMTogaW5wdXQgPSIsIGlucHV0KQoKICAgIHNvbWUgcF9jb21tYW5kIGluIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuRXhlY1Byb2Nlc3NSZXF1ZXN0LmFsbG93ZWRfY29tbWFuZHMKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMTogcF9jb21tYW5kID0iLCBwX2NvbW1hbmQpCiAgICBwX2NvbW1hbmQgPT0gaW5wdXQucHJvY2Vzcy5BcmdzCgogICAgIyBUT0RPOiBtYXRjaCBwX2NvbnRhaW5lcidzIElEIHdpdGggdGhlIGlucHV0IGNvbnRhaW5lcl9pZC4KICAgIHNvbWUgcF9jb250YWluZXIgaW4gcG9saWN5X2RhdGEuY29udGFpbmVycwogICAgYWxsb3dfaW50ZXJhY3RpdmVfZXhlYyhwX2NvbnRhaW5lciwgaW5wdXQucHJvY2VzcykKCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDE6IHRydWUiKQp9CkV4ZWNQcm9jZXNzUmVxdWVzdCB7CiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDI6IGlucHV0ID0iLCBpbnB1dCkKCiAgICAjIFRPRE86IG1hdGNoIGlucHV0IGNvbnRhaW5lciBJRCB3aXRoIGl0cyBjb3JyZXNwb25kaW5nIGNvbnRhaW5lci5leGVjX2NvbW1hbmRzLgogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBzb21lIHBfY29tbWFuZCBpbiBwX2NvbnRhaW5lci5leGVjX2NvbW1hbmRzCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDI6IHBfY29tbWFuZCA9IiwgcF9jb21tYW5kKQoKICAgICMgVE9ETzogc2hvdWxkIG90aGVyIGlucHV0IGRhdGEgZmllbGRzIGJlIHZhbGlkYXRlZCBhcyB3ZWxsPwogICAgcF9jb21tYW5kID09IGlucHV0LnByb2Nlc3MuQXJncwoKICAgIGFsbG93X2V4ZWMocF9jb250YWluZXIsIGlucHV0LnByb2Nlc3MpCgogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAyOiB0cnVlIikKfQpFeGVjUHJvY2Vzc1JlcXVlc3QgewogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAzOiBpbnB1dCA9IiwgaW5wdXQpCgogICAgaV9jb21tYW5kID0gY29uY2F0KCIgIiwgaW5wdXQucHJvY2Vzcy5BcmdzKQogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAzOiBpX2NvbW1hbmQgPSIsIGlfY29tbWFuZCkKCiAgICBzb21lIHBfcmVnZXggaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5FeGVjUHJvY2Vzc1JlcXVlc3QucmVnZXgKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMzogcF9yZWdleCA9IiwgcF9yZWdleCkKCiAgICByZWdleC5tYXRjaChwX3JlZ2V4LCBpX2NvbW1hbmQpCgogICAgIyBUT0RPOiBtYXRjaCBwX2NvbnRhaW5lcidzIElEIHdpdGggdGhlIGlucHV0IGNvbnRhaW5lcl9pZC4KICAgIHNvbWUgcF9jb250YWluZXIgaW4gcG9saWN5X2RhdGEuY29udGFpbmVycwogICAgYWxsb3dfaW50ZXJhY3RpdmVfZXhlYyhwX2NvbnRhaW5lciwgaW5wdXQucHJvY2VzcykKCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDM6IHRydWUiKQp9CgpVcGRhdGVSb3V0ZXNSZXF1ZXN0IHsKICAgIHByaW50KCJVcGRhdGVSb3V0ZXNSZXF1ZXN0OiBpbnB1dCA9IiwgaW5wdXQpCiAgICBwcmludCgiVXBkYXRlUm91dGVzUmVxdWVzdDogcG9saWN5ID0iLCBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLlVwZGF0ZVJvdXRlc1JlcXVlc3QpCgogICAgaV9yb3V0ZXMgOj0gaW5wdXQucm91dGVzLlJvdXRlcwogICAgcF9zb3VyY2VfcmVnZXggPSBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLlVwZGF0ZVJvdXRlc1JlcXVlc3QuZm9yYmlkZGVuX3NvdXJjZV9yZWdleAogICAgcF9uYW1lcyA9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuVXBkYXRlUm91dGVzUmVxdWVzdC5mb3JiaWRkZW5fZGV2aWNlX25hbWVzCgogICAgZXZlcnkgaV9yb3V0ZSBpbiBpX3JvdXRlcyB7CiAgICAgICAgcHJpbnQoImlfcm91dGUuc291cmNlID0iLCBpX3JvdXRlLnNvdXJjZSkKICAgICAgICBldmVyeSBwX3JlZ2V4IGluIHBfc291cmNlX3JlZ2V4IHsKICAgICAgICAgICAgcHJpbnQoInBfcmVnZXggPSIsIHBfcmVnZXgpCiAgICAgICAgICAgIG5vdCByZWdleC5tYXRjaChwX3JlZ2V4LCBpX3JvdXRlLnNvdXJjZSkKICAgICAgICB9CgogICAgICAgIHByaW50KCJpX3JvdXRlLmRldmljZSA9IiwgaV9yb3V0ZS5kZXZpY2UpCiAgICAgICAgbm90IGlfcm91dGUuZGV2aWNlIGluIHBfbmFtZXMKICAgIH0KCiAgICBwcmludCgiVXBkYXRlUm91dGVzUmVxdWVzdDogdHJ1ZSIpCn0KClVwZGF0ZUludGVyZmFjZVJlcXVlc3QgewogICAgcHJpbnQoIlVwZGF0ZUludGVyZmFjZVJlcXVlc3Q6IGlucHV0ID0iLCBpbnB1dCkKICAgIHByaW50KCJVcGRhdGVJbnRlcmZhY2VSZXF1ZXN0OiBwb2xpY3kgPSIsIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuVXBkYXRlSW50ZXJmYWNlUmVxdWVzdCkKCiAgICBpX2ludGVyZmFjZSA6PSBpbnB1dC5pbnRlcmZhY2UKICAgIHBfZmxhZ3MgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmFsbG93X3Jhd19mbGFncwoKICAgICMgVHlwaWNhbGx5LCBqdXN0IElGRl9OT0FSUCBpcyB1c2VkLgogICAgYml0cy5hbmQoaV9pbnRlcmZhY2UucmF3X2ZsYWdzLCBiaXRzLm5lZ2F0ZShwX2ZsYWdzKSkgPT0gMAoKICAgIHBfbmFtZXMgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmZvcmJpZGRlbl9uYW1lcwoKICAgIG5vdCBpX2ludGVyZmFjZS5uYW1lIGluIHBfbmFtZXMKCiAgICBwX2h3YWRkcnMgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmZvcmJpZGRlbl9od19hZGRycwoKICAgIG5vdCBpX2ludGVyZmFjZS5od0FkZHIgaW4gcF9od2FkZHJzCgogICAgcHJpbnQoIlVwZGF0ZUludGVyZmFjZVJlcXVlc3Q6IHRydWUiKQp9CgpDbG9zZVN0ZGluUmVxdWVzdCB7CiAgICBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLkNsb3NlU3RkaW5SZXF1ZXN0ID09IHRydWUKfQoKUmVhZFN0cmVhbVJlcXVlc3QgewogICAgcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5SZWFkU3RyZWFtUmVxdWVzdCA9PSB0cnVlCn0KClVwZGF0ZUVwaGVtZXJhbE1vdW50c1JlcXVlc3QgewogICAgcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVFcGhlbWVyYWxNb3VudHNSZXF1ZXN0ID09IHRydWUKfQoKV3JpdGVTdHJlYW1SZXF1ZXN0IHsKICAgIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuV3JpdGVTdHJlYW1SZXF1ZXN0ID09IHRydWUKfQoKcG9saWN5X2RhdGEgOj0gewogICJjb250YWluZXJzIjogWwogICAgewogICAgICAiT0NJIjogewogICAgICAgICJWZXJzaW9uIjogIjEuMS4wLXJjLjEiLAogICAgICAgICJQcm9jZXNzIjogewogICAgICAgICAgIlRlcm1pbmFsIjogZmFsc2UsCiAgICAgICAgICAiVXNlciI6IHsKICAgICAgICAgICAgIlVJRCI6IDY1NTM1LAogICAgICAgICAgICAiR0lEIjogNjU1MzUsCiAgICAgICAgICAgICJBZGRpdGlvbmFsR2lkcyI6IFtdLAogICAgICAgICAgICAiVXNlcm5hbWUiOiAiIgogICAgICAgICAgfSwKICAgICAgICAgICJEZXByZWNhdGVkQXJncyI6IFsKICAgICAgICAgICAgIi9wYXVzZSIKICAgICAgICAgIF0sCiAgICAgICAgICAiQXJncyI6IFsKICAgICAgICAgICAgIi9wYXVzZSIKICAgICAgICAgIF0sCiAgICAgICAgICAiRW52IjogWwogICAgICAgICAgICAiUEFUSD0vdXNyL2xvY2FsL3NiaW46L3Vzci9sb2NhbC9iaW46L3Vzci9zYmluOi91c3IvYmluOi9zYmluOi9iaW4iCiAgICAgICAgICBdLAogICAgICAgICAgIkN3ZCI6ICIvIiwKICAgICAgICAgICJDYXBhYmlsaXRpZXMiOiB7CiAgICAgICAgICAgICJBbWJpZW50IjogW10sCiAgICAgICAgICAgICJCb3VuZGluZyI6IFsKICAgICAgICAgICAgICAiJChkZWZhdWx0X2NhcHMpIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiRWZmZWN0aXZlIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJJbmhlcml0YWJsZSI6IFtdLAogICAgICAgICAgICAiUGVybWl0dGVkIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICAiTm9OZXdQcml2aWxlZ2VzIjogdHJ1ZQogICAgICAgIH0sCiAgICAgICAgIlJvb3QiOiB7CiAgICAgICAgICAiUGF0aCI6ICIkKGNwYXRoKS8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgIlJlYWRvbmx5IjogdHJ1ZQogICAgICAgIH0sCiAgICAgICAgIk1vdW50cyI6IFsKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9wcm9jIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJwcm9jIiwKICAgICAgICAgICAgInR5cGVfIjogInByb2MiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2IiwKICAgICAgICAgICAgInNvdXJjZSI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJzdHJpY3RhdGltZSIsCiAgICAgICAgICAgICAgIm1vZGU9NzU1IiwKICAgICAgICAgICAgICAic2l6ZT02NTUzNmsiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L3B0cyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiZGV2cHRzIiwKICAgICAgICAgICAgInR5cGVfIjogImRldnB0cyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJuZXdpbnN0YW5jZSIsCiAgICAgICAgICAgICAgInB0bXhtb2RlPTA2NjYiLAogICAgICAgICAgICAgICJtb2RlPTA2MjAiLAogICAgICAgICAgICAgICJnaWQ9NSIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvc2htIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L3NobSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi9tcXVldWUiLAogICAgICAgICAgICAic291cmNlIjogIm1xdWV1ZSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJtcXVldWUiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvc3lzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJzeXNmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJzeXNmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2V0Yy9yZXNvbHYuY29uZiIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClyZXNvbHYuY29uZiQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJvIiwKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9kZXYiLAogICAgICAgICAgICAgICJub2V4ZWMiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0KICAgICAgICBdLAogICAgICAgICJBbm5vdGF0aW9ucyI6IHsKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmJ1bmRsZV9wYXRoIjogIi9ydW4vY29udGFpbmVyZC9pby5jb250YWluZXJkLnJ1bnRpbWUudjIudGFzay9rOHMuaW8vJChidW5kbGUtaWQpIiwKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIjogInBvZF9zYW5kYm94IiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSI6ICJzYW5kYm94IiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWlkIjogIl5bYS16MC05XXs2NH0kIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWxvZy1kaXJlY3RvcnkiOiAiXi92YXIvbG9nL3BvZHMvJChzYW5kYm94LW5hbWVzcGFjZSlfJChzYW5kYm94LW5hbWUpX1swLTlhLWZdezh9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezEyfSQiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZXNwYWNlIjogImhlbGxvIiwKICAgICAgICAgICJuZXJkY3RsL25ldHdvcmstbmFtZXNwYWNlIjogIl4vdmFyL3J1bi9uZXRucy9jbmktWzAtOWEtZl17OH0tWzAtOWEtZl17NH0tWzAtOWEtZl17NH0tWzAtOWEtZl17NH0tWzAtOWEtZl17MTJ9JCIKICAgICAgICB9LAogICAgICAgICJMaW51eCI6IHsKICAgICAgICAgICJOYW1lc3BhY2VzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgIlR5cGUiOiAiaXBjIiwKICAgICAgICAgICAgICAiUGF0aCI6ICIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiVHlwZSI6ICJ1dHMiLAogICAgICAgICAgICAgICJQYXRoIjogIiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJUeXBlIjogIm1vdW50IiwKICAgICAgICAgICAgICAiUGF0aCI6ICIiCiAgICAgICAgICAgIH0KICAgICAgICAgIF0sCiAgICAgICAgICAiTWFza2VkUGF0aHMiOiBbCiAgICAgICAgICAgICIvcHJvYy9hY3BpIiwKICAgICAgICAgICAgIi9wcm9jL2Fzb3VuZCIsCiAgICAgICAgICAgICIvcHJvYy9rY29yZSIsCiAgICAgICAgICAgICIvcHJvYy9rZXlzIiwKICAgICAgICAgICAgIi9wcm9jL2xhdGVuY3lfc3RhdHMiLAogICAgICAgICAgICAiL3Byb2MvdGltZXJfbGlzdCIsCiAgICAgICAgICAgICIvcHJvYy90aW1lcl9zdGF0cyIsCiAgICAgICAgICAgICIvcHJvYy9zY2hlZF9kZWJ1ZyIsCiAgICAgICAgICAgICIvc3lzL2Zpcm13YXJlIiwKICAgICAgICAgICAgIi9wcm9jL3Njc2kiCiAgICAgICAgICBdLAogICAgICAgICAgIlJlYWRvbmx5UGF0aHMiOiBbCiAgICAgICAgICAgICIvcHJvYy9idXMiLAogICAgICAgICAgICAiL3Byb2MvZnMiLAogICAgICAgICAgICAiL3Byb2MvaXJxIiwKICAgICAgICAgICAgIi9wcm9jL3N5cyIsCiAgICAgICAgICAgICIvcHJvYy9zeXNycS10cmlnZ2VyIgogICAgICAgICAgXSwKICAgICAgICAgICJEZXZpY2VzIjogW10sCiAgICAgICAgICAiU3lzY3RsIjogewogICAgICAgICAgICAibmV0LmlwdjQuaXBfdW5wcml2aWxlZ2VkX3BvcnRfc3RhcnQiOiAiMCIsCiAgICAgICAgICAgICJuZXQuaXB2NC5waW5nX2dyb3VwX3JhbmdlIjogIjAgMjE0NzQ4MzY0NyIKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0sCiAgICAgICJzdG9yYWdlcyI6IFsKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoMCkiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXIwKSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogIm92ZXJsYXlmcyIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAiZnVzZTMua2F0YS1vdmVybGF5IiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiNWE1YWFkODAwNTVmZjIwMDEyYTUwZGMyNWY4ZGY3YTI5OTI0NDc0MzI0ZDY1ZjdkNTMwNmVlOGVlMjdmZjcxZCIsCiAgICAgICAgICAgICI4MTcyNTBmMWEzZTMzNmRhNzZmNWJkM2ZhNzg0ZTFiMjZkOTU5YjljMTMxODc2ODE1YmEyNjA0MDQ4YjcwYzE4IgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGNwYXRoKS8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0KICAgICAgXSwKICAgICAgImRldmljZXMiOiBbXSwKICAgICAgInNhbmRib3hfcGlkbnMiOiBmYWxzZSwKICAgICAgImV4ZWNfY29tbWFuZHMiOiBbXSwKICAgICAgImVudl9tYXAiOiB7CiAgICAgICAgIlBBVEgiOiAiL3Vzci9sb2NhbC9zYmluOi91c3IvbG9jYWwvYmluOi91c3Ivc2JpbjovdXNyL2Jpbjovc2JpbjovYmluIgogICAgICB9CiAgICB9LAogICAgewogICAgICAiT0NJIjogewogICAgICAgICJWZXJzaW9uIjogIjEuMS4wLXJjLjEiLAogICAgICAgICJQcm9jZXNzIjogewogICAgICAgICAgIlRlcm1pbmFsIjogZmFsc2UsCiAgICAgICAgICAiVXNlciI6IHsKICAgICAgICAgICAgIlVJRCI6IDAsCiAgICAgICAgICAgICJHSUQiOiAwLAogICAgICAgICAgICAiQWRkaXRpb25hbEdpZHMiOiBbXSwKICAgICAgICAgICAgIlVzZXJuYW1lIjogIiIKICAgICAgICAgIH0sCiAgICAgICAgICAiRGVwcmVjYXRlZEFyZ3MiOiBbCiAgICAgICAgICAgICIvaGVsbG8tcG9wdWxhdG9yIiwKICAgICAgICAgICAgIi0tbW9kZT1jb250cm9sbGVyIiwKICAgICAgICAgICAgIi0taW1hZ2UtbmFtZT1yZWdpc3RyeS5rOHMuaW8vc2lnLXN0b3JhZ2UvaGVsbG8tcG9wdWxhdG9yOnYxLjAuMSIsCiAgICAgICAgICAgICItLWh0dHAtZW5kcG9pbnQ9OjgwODAiCiAgICAgICAgICBdLAogICAgICAgICAgIkFyZ3MiOiBbCiAgICAgICAgICAgICIvaGVsbG8tcG9wdWxhdG9yIiwKICAgICAgICAgICAgIi0tbW9kZT1jb250cm9sbGVyIiwKICAgICAgICAgICAgIi0taW1hZ2UtbmFtZT1yZWdpc3RyeS5rOHMuaW8vc2lnLXN0b3JhZ2UvaGVsbG8tcG9wdWxhdG9yOnYxLjAuMSIsCiAgICAgICAgICAgICItLWh0dHAtZW5kcG9pbnQ9OjgwODAiCiAgICAgICAgICBdLAogICAgICAgICAgIkVudiI6IFsKICAgICAgICAgICAgIlBBVEg9L3Vzci9sb2NhbC9zYmluOi91c3IvbG9jYWwvYmluOi91c3Ivc2JpbjovdXNyL2Jpbjovc2JpbjovYmluIiwKICAgICAgICAgICAgIlNTTF9DRVJUX0ZJTEU9L2V0Yy9zc2wvY2VydHMvY2EtY2VydGlmaWNhdGVzLmNydCIsCiAgICAgICAgICAgICJIT1NUTkFNRT0kKGhvc3QtbmFtZSkiCiAgICAgICAgICBdLAogICAgICAgICAgIkN3ZCI6ICIvIiwKICAgICAgICAgICJDYXBhYmlsaXRpZXMiOiB7CiAgICAgICAgICAgICJBbWJpZW50IjogW10sCiAgICAgICAgICAgICJCb3VuZGluZyI6IFsKICAgICAgICAgICAgICAiJChkZWZhdWx0X2NhcHMpIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiRWZmZWN0aXZlIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJJbmhlcml0YWJsZSI6IFtdLAogICAgICAgICAgICAiUGVybWl0dGVkIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICAiTm9OZXdQcml2aWxlZ2VzIjogZmFsc2UKICAgICAgICB9LAogICAgICAgICJSb290IjogewogICAgICAgICAgIlBhdGgiOiAiJChjcGF0aCkvJChidW5kbGUtaWQpIiwKICAgICAgICAgICJSZWFkb25seSI6IGZhbHNlCiAgICAgICAgfSwKICAgICAgICAiTW91bnRzIjogWwogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL3Byb2MiLAogICAgICAgICAgICAic291cmNlIjogInByb2MiLAogICAgICAgICAgICAidHlwZV8iOiAicHJvYyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYiLAogICAgICAgICAgICAic291cmNlIjogInRtcGZzIiwKICAgICAgICAgICAgInR5cGVfIjogInRtcGZzIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgInN0cmljdGF0aW1lIiwKICAgICAgICAgICAgICAibW9kZT03NTUiLAogICAgICAgICAgICAgICJzaXplPTY1NTM2ayIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvcHRzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJkZXZwdHMiLAogICAgICAgICAgICAidHlwZV8iOiAiZGV2cHRzIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAgICAgIm5ld2luc3RhbmNlIiwKICAgICAgICAgICAgICAicHRteG1vZGU9MDY2NiIsCiAgICAgICAgICAgICAgIm1vZGU9MDYyMCIsCiAgICAgICAgICAgICAgImdpZD01IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi9zaG0iLAogICAgICAgICAgICAic291cmNlIjogIi9ydW4va2F0YS1jb250YWluZXJzL3NhbmRib3gvc2htIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L21xdWV1ZSIsCiAgICAgICAgICAgICJzb3VyY2UiOiAibXF1ZXVlIiwKICAgICAgICAgICAgInR5cGVfIjogIm1xdWV1ZSIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9zeXMiLAogICAgICAgICAgICAic291cmNlIjogInN5c2ZzIiwKICAgICAgICAgICAgInR5cGVfIjogInN5c2ZzIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAgICAgIm5vZGV2IiwKICAgICAgICAgICAgICAicm8iCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvc3lzL2ZzL2Nncm91cCIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiY2dyb3VwIiwKICAgICAgICAgICAgInR5cGVfIjogImNncm91cCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIsCiAgICAgICAgICAgICAgInJlbGF0aW1lIiwKICAgICAgICAgICAgICAicm8iCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZXRjL2hvc3RzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KWhvc3RzJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJydyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvdGVybWluYXRpb24tbG9nIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KXRlcm1pbmF0aW9uLWxvZyQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicnciCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZXRjL2hvc3RuYW1lIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KWhvc3RuYW1lJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJydyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9ldGMvcmVzb2x2LmNvbmYiLAogICAgICAgICAgICAic291cmNlIjogIiQoc2ZwcmVmaXgpcmVzb2x2LmNvbmYkIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJ3IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL3Zhci9ydW4vc2VjcmV0cy9rdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50IiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KXNlcnZpY2VhY2NvdW50JCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJybyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi92YXIvcnVuL3NlY3JldHMvYXp1cmUvdG9rZW5zIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KXRva2VucyQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicm8iCiAgICAgICAgICAgIF0KICAgICAgICAgIH0KICAgICAgICBdLAogICAgICAgICJBbm5vdGF0aW9ucyI6IHsKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmJ1bmRsZV9wYXRoIjogIi9ydW4vY29udGFpbmVyZC9pby5jb250YWluZXJkLnJ1bnRpbWUudjIudGFzay9rOHMuaW8vJChidW5kbGUtaWQpIiwKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIjogInBvZF9jb250YWluZXIiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLmNvbnRhaW5lci1uYW1lIjogImhlbGxvIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSI6ICJjb250YWluZXIiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLmltYWdlLW5hbWUiOiAicmVnaXN0cnkuazhzLmlvL3NpZy1zdG9yYWdlL2hlbGxvLXBvcHVsYXRvcjp2MS4wLjEiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtaWQiOiAiXlthLXowLTldezY0fSQiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZXNwYWNlIjogImhlbGxvIgogICAgICAgIH0sCiAgICAgICAgIkxpbnV4IjogewogICAgICAgICAgIk5hbWVzcGFjZXMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiVHlwZSI6ICJpcGMiLAogICAgICAgICAgICAgICJQYXRoIjogIiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJUeXBlIjogInV0cyIsCiAgICAgICAgICAgICAgIlBhdGgiOiAiIgogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgIlR5cGUiOiAibW91bnQiLAogICAgICAgICAgICAgICJQYXRoIjogIiIKICAgICAgICAgICAgfQogICAgICAgICAgXSwKICAgICAgICAgICJNYXNrZWRQYXRocyI6IFsKICAgICAgICAgICAgIi9wcm9jL2FjcGkiLAogICAgICAgICAgICAiL3Byb2Mva2NvcmUiLAogICAgICAgICAgICAiL3Byb2Mva2V5cyIsCiAgICAgICAgICAgICIvcHJvYy9sYXRlbmN5X3N0YXRzIiwKICAgICAgICAgICAgIi9wcm9jL3RpbWVyX2xpc3QiLAogICAgICAgICAgICAiL3Byb2MvdGltZXJfc3RhdHMiLAogICAgICAgICAgICAiL3Byb2Mvc2NoZWRfZGVidWciLAogICAgICAgICAgICAiL3Byb2Mvc2NzaSIsCiAgICAgICAgICAgICIvc3lzL2Zpcm13YXJlIgogICAgICAgICAgXSwKICAgICAgICAgICJSZWFkb25seVBhdGhzIjogWwogICAgICAgICAgICAiL3Byb2MvYXNvdW5kIiwKICAgICAgICAgICAgIi9wcm9jL2J1cyIsCiAgICAgICAgICAgICIvcHJvYy9mcyIsCiAgICAgICAgICAgICIvcHJvYy9pcnEiLAogICAgICAgICAgICAiL3Byb2Mvc3lzIiwKICAgICAgICAgICAgIi9wcm9jL3N5c3JxLXRyaWdnZXIiCiAgICAgICAgICBdLAogICAgICAgICAgIkRldmljZXMiOiBbXSwKICAgICAgICAgICJTeXNjdGwiOiB7CiAgICAgICAgICAgICJuZXQuaXB2NC5pcF91bnByaXZpbGVnZWRfcG9ydF9zdGFydCI6ICIwIiwKICAgICAgICAgICAgIm5ldC5pcHY0LnBpbmdfZ3JvdXBfcmFuZ2UiOiAiMCAyMTQ3NDgzNjQ3IgogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSwKICAgICAgInN0b3JhZ2VzIjogWwogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2gwKSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjApIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2gxKSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjEpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAib3ZlcmxheWZzIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJmdXNlMy5rYXRhLW92ZXJsYXkiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIwNGQ5N2ViZGE4YzRjOWNhZGYyZTlmMWY2NGIyNWY3ZmZmY2JmMzQ0M2I0Y2JhYTJlMTJiMTU0ZDYxMGEyZWQzOjNjMThmMjdkZjFkMWYyOTYwNDNkNWIzYzhkNjJhMjkzMmJkZWNmZmE4ZmQwY2U0ZjE5NWI2OTZmMjYzNDc0ZjYiLAogICAgICAgICAgICAiM2NhMzkyOTk0Zjc0MmM2ZTJkZjIwZWMyMzA0ZTM1ZDBmNDdkYTVlOWFkNWFhYWY2MDljYzFhZjAzNjVkNmY3MDo0ZjNlMzhlMGUwYzA2Zjg1ZTJkMjE0YzBhNzgyNmUyYzBkZGI5ZDAxMTMwNzZhNDZiMTVkYTU5NjM5OWQ0NWRlIgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGNwYXRoKS8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0KICAgICAgXSwKICAgICAgImRldmljZXMiOiBbXSwKICAgICAgInNhbmRib3hfcGlkbnMiOiBmYWxzZSwKICAgICAgImV4ZWNfY29tbWFuZHMiOiBbXSwKICAgICAgImVudl9tYXAiOiB7CiAgICAgICAgIkhPU1ROQU1FIjogIiQoaG9zdC1uYW1lKSIsCiAgICAgICAgIlBBVEgiOiAiL3Vzci9sb2NhbC9zYmluOi91c3IvbG9jYWwvYmluOi91c3Ivc2JpbjovdXNyL2Jpbjovc2JpbjovYmluIiwKICAgICAgICAiU1NMX0NFUlRfRklMRSI6ICIvZXRjL3NzbC9jZXJ0cy9jYS1jZXJ0aWZpY2F0ZXMuY3J0IgogICAgICB9CiAgICB9CiAgXSwKICAiY29tbW9uIjogewogICAgImNwYXRoIjogIi9ydW4va2F0YS1jb250YWluZXJzL3NoYXJlZC9jb250YWluZXJzIiwKICAgICJtb3VudF9zb3VyY2VfY3BhdGgiOiAiL3J1bi9rYXRhLWNvbnRhaW5lcnMvc2hhcmVkL2NvbnRhaW5lcnMiLAogICAgInNmcHJlZml4IjogIl4kKGNwYXRoKS8kKGJ1bmRsZS1pZCktW2EtejAtOV17MTZ9LSIsCiAgICAic3BhdGgiOiAiL3J1bi9rYXRhLWNvbnRhaW5lcnMvc2FuZGJveC9zdG9yYWdlIiwKICAgICJpcHY0X2EiOiAiKChbMC05XXxbMS05XVswLTldfDFbMC05XXsyfXwyWzAtNF1bMC05XXwyNVswLTVdKVxcLil7M30oWzAtOV18WzEtOV1bMC05XXwxWzAtOV17Mn18MlswLTRdWzAtOV18MjVbMC01XSkiLAogICAgImlwX3AiOiAiWzAtOV17MSw1fSIsCiAgICAic3ZjX25hbWUiOiAiW0EtWl9cXC5cXC1dKyIsCiAgICAiZG5zX2xhYmVsIjogIlthLXpBLVowLTlfXFwuXFwtXSsiLAogICAgInNfc291cmNlMSI6ICJeLi4yWzAtOV17M31fWzAtMV1bMC05XV9bMC0zXVswLTldX1swLTJdWzAtOV1fWzAtNV1bMC05XV9bMC01XVswLTldXFwuWzAtOV17MSwxMH0kIiwKICAgICJzX3NvdXJjZTIiOiAiXi4uZGF0YS8iLAogICAgImRuc19zdWJkb21haW4iOiAiXlthLXowLTldKFstYS16MC05XSpbYS16MC05XSk/JCIsCiAgICAicG9kX3VpZCI6ICJeWzAtOWEtZkEtRl17OH0tWzAtOWEtZkEtRl17NH0tWzAtOWEtZkEtRl17NH0tWzAtOWEtZkEtRl17NH0tWzAtOWEtZkEtRl17MTJ9JCIsCiAgICAiZGVmYXVsdF9jYXBzIjogWwogICAgICAiQ0FQX0NIT1dOIiwKICAgICAgIkNBUF9EQUNfT1ZFUlJJREUiLAogICAgICAiQ0FQX0ZTRVRJRCIsCiAgICAgICJDQVBfRk9XTkVSIiwKICAgICAgIkNBUF9NS05PRCIsCiAgICAgICJDQVBfTkVUX1JBVyIsCiAgICAgICJDQVBfU0VUR0lEIiwKICAgICAgIkNBUF9TRVRVSUQiLAogICAgICAiQ0FQX1NFVEZDQVAiLAogICAgICAiQ0FQX1NFVFBDQVAiLAogICAgICAiQ0FQX05FVF9CSU5EX1NFUlZJQ0UiLAogICAgICAiQ0FQX1NZU19DSFJPT1QiLAogICAgICAiQ0FQX0tJTEwiLAogICAgICAiQ0FQX0FVRElUX1dSSVRFIgogICAgXSwKICAgICJwcml2aWxlZ2VkX2NhcHMiOiBbCiAgICAgICJDQVBfQ0hPV04iLAogICAgICAiQ0FQX0RBQ19PVkVSUklERSIsCiAgICAgICJDQVBfREFDX1JFQURfU0VBUkNIIiwKICAgICAgIkNBUF9GT1dORVIiLAogICAgICAiQ0FQX0ZTRVRJRCIsCiAgICAgICJDQVBfS0lMTCIsCiAgICAgICJDQVBfU0VUR0lEIiwKICAgICAgIkNBUF9TRVRVSUQiLAogICAgICAiQ0FQX1NFVFBDQVAiLAogICAgICAiQ0FQX0xJTlVYX0lNTVVUQUJMRSIsCiAgICAgICJDQVBfTkVUX0JJTkRfU0VSVklDRSIsCiAgICAgICJDQVBfTkVUX0JST0FEQ0FTVCIsCiAgICAgICJDQVBfTkVUX0FETUlOIiwKICAgICAgIkNBUF9ORVRfUkFXIiwKICAgICAgIkNBUF9JUENfTE9DSyIsCiAgICAgICJDQVBfSVBDX09XTkVSIiwKICAgICAgIkNBUF9TWVNfTU9EVUxFIiwKICAgICAgIkNBUF9TWVNfUkFXSU8iLAogICAgICAiQ0FQX1NZU19DSFJPT1QiLAogICAgICAiQ0FQX1NZU19QVFJBQ0UiLAogICAgICAiQ0FQX1NZU19QQUNDVCIsCiAgICAgICJDQVBfU1lTX0FETUlOIiwKICAgICAgIkNBUF9TWVNfQk9PVCIsCiAgICAgICJDQVBfU1lTX05JQ0UiLAogICAgICAiQ0FQX1NZU19SRVNPVVJDRSIsCiAgICAgICJDQVBfU1lTX1RJTUUiLAogICAgICAiQ0FQX1NZU19UVFlfQ09ORklHIiwKICAgICAgIkNBUF9NS05PRCIsCiAgICAgICJDQVBfTEVBU0UiLAogICAgICAiQ0FQX0FVRElUX1dSSVRFIiwKICAgICAgIkNBUF9BVURJVF9DT05UUk9MIiwKICAgICAgIkNBUF9TRVRGQ0FQIiwKICAgICAgIkNBUF9NQUNfT1ZFUlJJREUiLAogICAgICAiQ0FQX01BQ19BRE1JTiIsCiAgICAgICJDQVBfU1lTTE9HIiwKICAgICAgIkNBUF9XQUtFX0FMQVJNIiwKICAgICAgIkNBUF9CTE9DS19TVVNQRU5EIiwKICAgICAgIkNBUF9BVURJVF9SRUFEIiwKICAgICAgIkNBUF9QRVJGTU9OIiwKICAgICAgIkNBUF9CUEYiLAogICAgICAiQ0FQX0NIRUNLUE9JTlRfUkVTVE9SRSIKICAgIF0sCiAgICAidmlydGlvX2Jsa19zdG9yYWdlX2NsYXNzZXMiOiBbCiAgICAgICJjYy1sb2NhbC1jc2kiLAogICAgICAiY2MtbWFuYWdlZC1jc2kiLAogICAgICAiY2MtbWFuYWdlZC1wcmVtaXVtLWNzaSIKICAgIF0sCiAgICAic21iX3N0b3JhZ2VfY2xhc3NlcyI6IFsKICAgICAgewogICAgICAgICJuYW1lIjogImF6dXJlZmlsZS1jc2kta2F0YS1jYyIsCiAgICAgICAgIm1vdW50X29wdGlvbnMiOiBbCiAgICAgICAgICAiZGlyX21vZGU9MDc3NyIsCiAgICAgICAgICAiZmlsZV9tb2RlPTA3NzciLAogICAgICAgICAgIm1mc3ltbGlua3MiLAogICAgICAgICAgImNhY2hlPXN0cmljdCIsCiAgICAgICAgICAibm9zaGFyZXNvY2siLAogICAgICAgICAgImFjdGltZW89MzAiLAogICAgICAgICAgIm5vYnJsIgogICAgICAgIF0KICAgICAgfQogICAgXQogIH0sCiAgInNhbmRib3giOiB7CiAgICAic3RvcmFnZXMiOiBbCiAgICAgIHsKICAgICAgICAiZHJpdmVyIjogImVwaGVtZXJhbCIsCiAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgInNvdXJjZSI6ICJzaG0iLAogICAgICAgICJmc3R5cGUiOiAidG1wZnMiLAogICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICJub2RldiIsCiAgICAgICAgICAibW9kZT0xNzc3IiwKICAgICAgICAgICJzaXplPTY3MTA4ODY0IgogICAgICAgIF0sCiAgICAgICAgIm1vdW50X3BvaW50IjogIi9ydW4va2F0YS1jb250YWluZXJzL3NhbmRib3gvc2htIiwKICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgIH0KICAgIF0KICB9LAogICJyZXF1ZXN0X2RlZmF1bHRzIjogewogICAgIkNyZWF0ZUNvbnRhaW5lclJlcXVlc3QiOiB7CiAgICAgICJhbGxvd19lbnZfcmVnZXgiOiBbCiAgICAgICAgIl5IT1NUTkFNRT0kKGRuc19sYWJlbCkkIiwKICAgICAgICAiXiQoc3ZjX25hbWUpX1BPUlRfJChpcF9wKV9UQ1A9dGNwOi8vJChpcHY0X2EpOiQoaXBfcCkkIiwKICAgICAgICAiXiQoc3ZjX25hbWUpX1BPUlRfJChpcF9wKV9UQ1BfUFJPVE89dGNwJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9QT1JUXyQoaXBfcClfVENQX1BPUlQ9JChpcF9wKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfUE9SVF8kKGlwX3ApX1RDUF9BRERSPSQoaXB2NF9hKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfU0VSVklDRV9IT1NUPSQoaXB2NF9hKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfU0VSVklDRV9QT1JUPSQoaXBfcCkkIiwKICAgICAgICAiXiQoc3ZjX25hbWUpX1NFUlZJQ0VfUE9SVF8kKGRuc19sYWJlbCk9JChpcF9wKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfUE9SVD10Y3A6Ly8kKGlwdjRfYSk6JChpcF9wKSQiLAogICAgICAgICJeQVpVUkVfQ0xJRU5UX0lEPVtBLUZhLWYwLTktXSokIiwKICAgICAgICAiXkFaVVJFX1RFTkFOVF9JRD1bQS1GYS1mMC05LV0qJCIsCiAgICAgICAgIl5BWlVSRV9GRURFUkFURURfVE9LRU5fRklMRT0vdmFyL3J1bi9zZWNyZXRzL2F6dXJlL3Rva2Vucy9henVyZS1pZGVudGl0eS10b2tlbiQiLAogICAgICAgICJeQVpVUkVfQVVUSE9SSVRZX0hPU1Q9aHR0cHM6Ly9sb2dpblxcLm1pY3Jvc29mdG9ubGluZVxcLmNvbS8kIiwKICAgICAgICAiXlRFUk09eHRlcm0kIgogICAgICBdLAogICAgICAiYWxsb3dfZW52X3JlZ2V4X21hcCI6IHsKICAgICAgICAiQ1BVX0xJTUlUIjogIl5bMC05XSskIiwKICAgICAgICAiSk9CX0NPTVBMRVRJT05fSU5ERVgiOiAiXlswLTldKiQiLAogICAgICAgICJNRU1PUllfTElNSVQiOiAiXlswLTldKyQiCiAgICAgIH0KICAgIH0sCiAgICAiQ29weUZpbGVSZXF1ZXN0IjogWwogICAgICAiJChzZnByZWZpeCkiCiAgICBdLAogICAgIkV4ZWNQcm9jZXNzUmVxdWVzdCI6IHsKICAgICAgImFsbG93ZWRfY29tbWFuZHMiOiBbXSwKICAgICAgInJlZ2V4IjogW10KICAgIH0sCiAgICAiVXBkYXRlUm91dGVzUmVxdWVzdCI6IHsKICAgICAgImZvcmJpZGRlbl9kZXZpY2VfbmFtZXMiOiBbCiAgICAgICAgImxvIgogICAgICBdLAogICAgICAiZm9yYmlkZGVuX3NvdXJjZV9yZWdleCI6IFsKICAgICAgICAiXig/OjB7MCw0fTopezAsN30wezAsM30xJCIsCiAgICAgICAgIl4xMjdcXC4oPzpbMC05XXsxLDN9XFwuKXsyfVswLTldezEsM30kIgogICAgICBdCiAgICB9LAogICAgIlVwZGF0ZUludGVyZmFjZVJlcXVlc3QiOiB7CiAgICAgICJhbGxvd19yYXdfZmxhZ3MiOiAxMjgsCiAgICAgICJmb3JiaWRkZW5fbmFtZXMiOiBbCiAgICAgICAgImxvIgogICAgICBdLAogICAgICAiZm9yYmlkZGVuX2h3X2FkZHJzIjogWwogICAgICAgICIwMDowMDowMDowMDowMDowMCIKICAgICAgXQogICAgfSwKICAgICJDbG9zZVN0ZGluUmVxdWVzdCI6IGZhbHNlLAogICAgIlJlYWRTdHJlYW1SZXF1ZXN0IjogZmFsc2UsCiAgICAiVXBkYXRlRXBoZW1lcmFsTW91bnRzUmVxdWVzdCI6IGZhbHNlLAogICAgIldyaXRlU3RyZWFtUmVxdWVzdCI6IGZhbHNlCiAgfQp9 + spec: + runtimeClassName: kata-cc + serviceAccount: hello-account + containers: + - name: hello + image: "registry.k8s.io/sig-storage/hello-populator:v1.0.1" + imagePullPolicy: IfNotPresent + args: + - "--mode=controller" + - "--image-name=registry.k8s.io/sig-storage/hello-populator:v1.0.1" + - "--http-endpoint=:8080" + ports: + - containerPort: 8080 + name: http-endpoint + protocol: TCP diff --git a/src/agent/samples/policy/yaml/kubernetes/conformance/netexecrc.yaml b/src/agent/samples/policy/yaml/kubernetes/conformance/netexecrc.yaml new file mode 100644 index 000000000000..767b29c19040 --- /dev/null +++ b/src/agent/samples/policy/yaml/kubernetes/conformance/netexecrc.yaml @@ -0,0 +1,26 @@ +--- +apiVersion: v1 +kind: ReplicationController +metadata: + name: netexec +spec: + replicas: 1 + template: + metadata: + labels: + app: netexec + annotations: + io.katacontainers.config.agent.policy: IyBDb3B5cmlnaHQgKGMpIDIwMjMgTWljcm9zb2Z0IENvcnBvcmF0aW9uCiMKIyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMAojCnBhY2thZ2UgYWdlbnRfcG9saWN5CgppbXBvcnQgZnV0dXJlLmtleXdvcmRzLmluCmltcG9ydCBmdXR1cmUua2V5d29yZHMuZXZlcnkKCiMgRGVmYXVsdCB2YWx1ZXMsIHJldHVybmVkIGJ5IE9QQSB3aGVuIHJ1bGVzIGNhbm5vdCBiZSBldmFsdWF0ZWQgdG8gdHJ1ZS4KZGVmYXVsdCBBZGRBUlBOZWlnaGJvcnNSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgQWRkU3dhcFJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBDbG9zZVN0ZGluUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IENvcHlGaWxlUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IENyZWF0ZUNvbnRhaW5lclJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBDcmVhdGVTYW5kYm94UmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IERlc3Ryb3lTYW5kYm94UmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgRXhlY1Byb2Nlc3NSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgR2V0T09NRXZlbnRSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBHdWVzdERldGFpbHNSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBMaXN0SW50ZXJmYWNlc1JlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBMaXN0Um91dGVzUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IE1lbUhvdHBsdWdCeVByb2JlUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IE9ubGluZUNQVU1lbVJlcXVlc3QgOj0gdHJ1ZQpkZWZhdWx0IFBhdXNlQ29udGFpbmVyUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFJlYWRTdHJlYW1SZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgUmVtb3ZlQ29udGFpbmVyUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgUmVtb3ZlU3RhbGVWaXJ0aW9mc1NoYXJlTW91bnRzUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgUmVzZWVkUmFuZG9tRGV2UmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFJlc3VtZUNvbnRhaW5lclJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBTZXRHdWVzdERhdGVUaW1lUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFNldFBvbGljeVJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBTaWduYWxQcm9jZXNzUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgU3RhcnRDb250YWluZXJSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBTdGFydFRyYWNpbmdSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgU3RhdHNDb250YWluZXJSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBTdG9wVHJhY2luZ1JlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBUdHlXaW5SZXNpemVSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBVcGRhdGVDb250YWluZXJSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgVXBkYXRlRXBoZW1lcmFsTW91bnRzUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFVwZGF0ZUludGVyZmFjZVJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBVcGRhdGVSb3V0ZXNSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgV2FpdFByb2Nlc3NSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBXcml0ZVN0cmVhbVJlcXVlc3QgOj0gZmFsc2UKCiMgQWxsb3dSZXF1ZXN0c0ZhaWxpbmdQb2xpY3kgOj0gdHJ1ZSBjb25maWd1cmVzIHRoZSBBZ2VudCB0byAqYWxsb3cgYW55CiMgcmVxdWVzdHMgY2F1c2luZyBhIHBvbGljeSBmYWlsdXJlKi4gVGhpcyBpcyBhbiB1bnNlY3VyZSBjb25maWd1cmF0aW9uCiMgYnV0IGlzIHVzZWZ1bCBmb3IgYWxsb3dpbmcgdW5zZWN1cmUgcG9kcyB0byBzdGFydCwgdGhlbiBjb25uZWN0IHRvCiMgdGhlbSBhbmQgaW5zcGVjdCBPUEEgbG9ncyBmb3IgdGhlIHJvb3QgY2F1c2Ugb2YgYSBmYWlsdXJlLgpkZWZhdWx0IEFsbG93UmVxdWVzdHNGYWlsaW5nUG9saWN5IDo9IGZhbHNlCgojIENvbnN0YW50cwpTX05BTUVfS0VZID0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZSIKU19OQU1FU1BBQ0VfS0VZID0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZXNwYWNlIgpCVU5ETEVfSUQgPSAiW2EtejAtOV17NjR9IgoKQ3JlYXRlQ29udGFpbmVyUmVxdWVzdDo9IHJlc3AgewogICAgbm90IGlzX251bGwoaW5wdXQuZW52X21hcCkKICAgIAogICAgaV9lbnZfbWFwIDo9IGlucHV0LmVudl9tYXAKICAgIAogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBwX2Vudl9tYXAgOj0gcF9jb250YWluZXIuZW52X21hcCAgCiAgICBhbGxvd19lbnZfbWFwKHBfZW52X21hcCwgaV9lbnZfbWFwKQogICAgCiAgICBpX3Byb2Nlc3MgOj0gaW5wdXQuYmFzZS5PQ0kuUHJvY2VzcwogICAgCiAgICBwX3Byb2Nlc3MgOj0gcF9jb250YWluZXIuT0NJLlByb2Nlc3MKICAgIAogICAgYWxsb3dfYXJncyhpX3Byb2Nlc3MsIHBfcHJvY2VzcywgaV9lbnZfbWFwKQoKICAgIHJlc3AgPSBDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uKGlucHV0LmJhc2UpCiAgICBwcmludCgiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdDogdHJ1ZSIpCn0KCmFsbG93X2FyZ3MoaV9wcm9jZXNzLCBwX3Byb2Nlc3MsIGlfZW52X21hcCkgewogICAgaV9hcmdzIDo9IGlfcHJvY2Vzcy5BcmdzCiAgICBwX2FyZ3MgOj0gcF9wcm9jZXNzLkFyZ3MKICAgIHByaW50KCJhbGxvd19hcmdzOiBpX2FyZ3MgPSIsIGlfYXJncywgInBfYXJncyA9IiwgcF9hcmdzKQogICAgY291bnQoaV9hcmdzKSA9PSBjb3VudChwX2FyZ3MpCiAgICBldmVyeSBpLCBpX2FyZyBpbiBpX2FyZ3MgewogICAgICAgIHByaW50KCJhbGxvd19hcmdzOiBpX2FyZyA9IiwgaV9hcmcpCiAgICAgICAgcF9hcmdfcmVwbGFjZWQgOj0gcmVwbGFjZV9lbnZfdmFyaWFibGVzKHBfYXJnc1tpXSwgaV9lbnZfbWFwKQogICAgICAgIHByaW50KCJhbGxvd19hcmdzOiBwX2FyZ19yZXBsYWNlZCA9IiwgcF9hcmdfcmVwbGFjZWQpCiAgICAgICAgcF9hcmdfcmVwbGFjZWQyIDo9IHJlcGxhY2UocF9hcmdfcmVwbGFjZWQsICIkJCIsICIkIikKICAgICAgICBwcmludCgiYWxsb3dfYXJnczogcF9hcmdfcmVwbGFjZWQyID0iLCBwX2FyZ19yZXBsYWNlZDIpCiAgICAgICAgaV9hcmcgPT0gcF9hcmdfcmVwbGFjZWQyCiAgICB9CiAgICBwcmludCgiYWxsb3dfYXJnczogdHJ1ZSIpCn0KCmFsbG93X2FyZ3MoaV9wcm9jZXNzLCBwX3Byb2Nlc3MsIGlfZW52X21hcCkgewogICAgbm90IGlfcHJvY2Vzcy5BcmdzCiAgICBub3QgcF9wcm9jZXNzLkFyZ3MKICAgIHByaW50KCJhbGxvd19hcmdzMjogbm8gYXJncyIpCn0KCiMgdGhpcyBmdW5jdGlvbiByZXBsYWNlcyBhbGwgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyBpbiBhIHN0cmluZywgZ2l2ZW4gYSBtYXAgb2YgZW52aXJvbm1lbnQga2V5cyB0byBlbnZpcm9ubWVudCB2YWx1ZXMKIyBlZyBzdHIgPSAiZWNobyAkKENMVVNURVJfSUQpOyBlY2hvICQoTk9ERV9OQU1FKTsiCiMgZW52X21hcCA9IHsiQ0xVU1RFUl9JRCI6ICJhYmMiLCAiTk9ERV9OQU1FIiA6ICJ4eXoifQojIHJlc3VsdCA9ICJlY2hvIGFiYzsgZWNobyB4eXo7IgpyZXBsYWNlX2Vudl92YXJpYWJsZXMoc3RyLCBlbnZfbWFwKSA9IHJlc3VsdCB7CiAgICAjIG1ha2UgYW4gYXJyYXkgb2YgdGhlIGtleXMgZWcgWyJDTFVTVEVSX0lEIiwgIk5PREVfTkFNRSJdCiAgICBrZXlzIDo9IFt4IHwgc29tZSB4IGluIG9iamVjdC5rZXlzKGVudl9tYXApXQogICAgcmVzdWx0IDo9IHJlcGxhY2Vfc3RyX3JlYyhzdHIsIGVudl9tYXAsIGtleXMsIGNvdW50KGtleXMpIC0gMSkKfQoKIyBiYXNlIGNhc2UKcmVwbGFjZV9zdHJfcmVjKHN0ciwgZW52X21hcCwgYXJyX2tleXMsIGkpID0gcmVzdWx0IHsKICAgIGkgPCAwCiAgICByZXN1bHQgOj0gc3RyCn0KCiMgcmVjdXJzaXZlIHN0ZXAKcmVwbGFjZV9zdHJfcmVjKHN0ciwgZW52X21hcCwgYXJyX2tleXMsIGkpID0gcmVzdWx0IHsKICAgIGkgPj0gMAogICAga2V5IDo9IGFycl9rZXlzW2ldCiAgICBlbnZfa2V5MSA6PSBjb25jYXQoIiIsIFsiJCgiLCBrZXksICIpIl0pCiAgICAjIHJlcGxhY2UgJChWQVIpIHdpdGggdmFsdWUKICAgIG5ld19zdHIxIDo9IHJlcGxhY2Uoc3RyLCBlbnZfa2V5MSwgZW52X21hcFtrZXldKQogICAgIyByZXBsYWNlIG5leHQgZW52aXJvbm1lbnQgdmFyaWFibGUKICAgIHJlc3VsdCA9IHJlcGxhY2Vfc3RyX3JlYyhuZXdfc3RyMSwgZW52X21hcCwgYXJyX2tleXMsIGkgLSAxKQp9CgphbGxvd19lbnZfbWFwKHBfZW52X21hcCwgaV9lbnZfbWFwKSB7CiAgICBwcmludCgiYWxsb3dfZW52X21hcDogcF9lbnZfbWFwID0iLCBwX2Vudl9tYXApCiAgICBldmVyeSBlbnZfa2V5LCBlbnZfdmFsIGluIGlfZW52X21hcCB7CiAgICAgICAgcHJpbnQoImFsbG93X2VudjogZW52X2tleSA9IiwgZW52X2tleSwgImVudl92YWwgPSIsIGVudl92YWwpCiAgICAgICAgYWxsb3dfZW52X21hcF9lbnRyeShlbnZfa2V5LCBlbnZfdmFsLCBwX2Vudl9tYXApCiAgICB9CiAgICBwcmludCgiYWxsb3dfZW52X21hcDogdHJ1ZSIpCn0KCiMgQWxsb3cgZXhhY3QgbWF0Y2gKYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBpX3ZhbCA9PSBwX3ZhbAogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnk6IHRydWUiKQp9CgojIEFsbG93IHJlc291cmNlRmllbGRSZWYgdmFsdWVzIChlLmcuLCAibGltaXRzLmNwdSIpLgphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgICMgYSB2YXJpYWJsZSB3ZSBzaG91bGQgYmUgdmFsaWRhdGluZyB1c2luZyBhIHJlZ2V4IGZyb20gc2V0dGluZ3MKICAgIHBfdmFsID09ICIkKHZhbGlkYXRlLWZyb20tc2V0dGluZ3MpIgogICAgcmVnZXhfdmFsIDo9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuQ3JlYXRlQ29udGFpbmVyUmVxdWVzdC5hbGxvd19lbnZfcmVnZXhfbWFwW2tleV0KICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4X3ZhbCwgaV92YWwpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSAyOiB0cnVlIikKfQoKIyBBbGxvdyBub2RlLW5hbWUKYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChub2RlLW5hbWUpIgogICAgcmVnZXgubWF0Y2gocG9saWN5X2RhdGEuY29tbW9uLmRuc19zdWJkb21haW4gLCBpX3ZhbCkKICAgIHByaW50KCJhbGxvd19lbnZfbWFwX2VudHJ5IDM6IHRydWUiKQp9CgojIEFsbG93IGhvc3QtbmFtZQphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgIHBfdmFsID09ICIkKGhvc3QtbmFtZSkiCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24uZG5zX2xhYmVsICwgaV92YWwpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSA0OiB0cnVlIikKfQoKIyBBbGxvdyBwb2QtdWlkCmFsbG93X2Vudl9tYXBfZW50cnkoa2V5LCBpX3ZhbCwgcF9lbnZfbWFwKSB7CiAgICBwX3ZhbCA6PSBwX2Vudl9tYXBba2V5XQogICAgcF92YWwgPT0gIiQocG9kLXVpZCkiCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24ucG9kX3VpZCAsIGlfdmFsKQogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgNTogdHJ1ZSIpCn0KCiMgQWxsb3cgZmllbGRSZWYgImZpZWxkUGF0aDogc3RhdHVzLnBvZElQIiB2YWx1ZXMuCmFsbG93X2Vudl9tYXBfZW50cnkoa2V5LCBpX3ZhbCwgcF9lbnZfbWFwKSB7CiAgICBpc19pcChpX3ZhbCkKCiAgICBwX3ZhbCA6PSBwX2Vudl9tYXBba2V5XQogICAgcF92YXIgOj0gY29uY2F0KCI9IiwgW2tleSwgcF92YWxdKQogICAgYWxsb3dfcG9kX2lwX3ZhcihrZXksIHBfdmFyKQogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgNjogdHJ1ZSIpCn0KCiMgQWxsb3cgZmllbGRSZWYgImZpZWxkUGF0aDogc3RhdHVzLmhvc3RJUCIgdmFsdWVzLgphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgaXNfaXAoaV92YWwpCgogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgIHBfdmFyIDo9IGNvbmNhdCgiPSIsIFtrZXksIHBfdmFsXSkKICAgIGFsbG93X2hvc3RfaXBfdmFyKGtleSwgcF92YXIpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSA3OiB0cnVlIikKfQoKIyBNYXRjaCBpbnB1dCB3aXRoIG9uZSBvZiB0aGUgcG9saWN5IHZhcmlhYmxlcywgYWZ0ZXIgc3Vic3RpdHV0aW5nICQoc2FuZGJveC1uYW1lKS4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChzYW5kYm94LW5hbWUpIgogICAgc19uYW1lIDo9IGlucHV0LmJhc2UuT0NJLkFubm90YXRpb25zW1NfTkFNRV9LRVldCiAgICBwX3ZhcjIgOj0gcmVwbGFjZShwX3ZhbCwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHBfdmFyMiA9PSBpX3ZhbAogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgODogdHJ1ZSIpCn0KCiMgTWF0Y2ggaW5wdXQgd2l0aCBvbmUgb2YgdGhlIHBvbGljeSB2YXJpYWJsZXMsIGFmdGVyIHN1YnN0aXR1dGluZyAkKHNhbmRib3gtbmFtZXNwYWNlKS4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChzYW5kYm94LW5hbWVzcGFjZSkiCiAgICBzX25hbWVzcGFjZSA6PSBpbnB1dC5iYXNlLk9DSS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwX3ZhcjIgOj0gcmVwbGFjZShwX3ZhbCwgIiQoc2FuZGJveC1uYW1lc3BhY2UpIiwgc19uYW1lc3BhY2UpCiAgICBwX3ZhcjIgPT0gaV92YWwKICAgIHByaW50KCJhbGxvd19lbnZfbWFwX2VudHJ5IDk6IHRydWUiKQp9CgojIEFsbG93IGlucHV0IGVudiB2YXJpYWJsZXMgdGhhdCBtYXRjaCB3aXRoIGEgcmVxdWVzdF9kZWZhdWx0cyByZWdleC4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHNvbWUgcF9yZWdleDEgaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5DcmVhdGVDb250YWluZXJSZXF1ZXN0LmFsbG93X2Vudl9yZWdleAogICAgcF9yZWdleDIgOj0gcmVwbGFjZShwX3JlZ2V4MSwgIiQoaXB2NF9hKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcHY0X2EpCiAgICBwX3JlZ2V4MyA6PSByZXBsYWNlKHBfcmVnZXgyLCAiJChpcF9wKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcF9wKQogICAgcF9yZWdleDQgOj0gcmVwbGFjZShwX3JlZ2V4MywgIiQoc3ZjX25hbWUpIiwgcG9saWN5X2RhdGEuY29tbW9uLnN2Y19uYW1lKQogICAgcF9yZWdleDUgOj0gcmVwbGFjZShwX3JlZ2V4NCwgIiQoZG5zX2xhYmVsKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5kbnNfbGFiZWwpCgogICAgcmVzdWx0IDo9IGNvbmNhdCgiPSIsIFtrZXksIGlfdmFsXSkKICAgIHJlZ2V4Lm1hdGNoKHBfcmVnZXg1LCByZXN1bHQpCgogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgMTA6IHRydWUiKQp9CgpDcmVhdGVDb250YWluZXJSZXF1ZXN0Oj0gcmVzcCB7CiAgICBub3QgaW5wdXQuZW52X21hcAogICAgaV9wcm9jZXNzID0gaW5wdXQuT0NJLlByb2Nlc3MKICAgIHNfbmFtZSA9IGlucHV0Lk9DSS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBwX3Byb2Nlc3MgPSBwX2NvbnRhaW5lci5PQ0kuUHJvY2VzcwogICAgYWxsb3dfZGVwcmVjYXRlZF9hcmdzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUpCiAgICByZXNwID0gQ3JlYXRlQ29udGFpbmVyUmVxdWVzdENvbW1vbihpbnB1dCkKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0MjogdHJ1ZSIpCn0KCkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb24ocmVxKTo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgICMgQ2hlY2sgaWYgdGhlIGlucHV0IHJlcXVlc3Qgc2hvdWxkIGJlIHJlamVjdGVkIGV2ZW4gYmVmb3JlIGNoZWNraW5nIHRoZQogICAgIyBwb2xpY3lfZGF0YS5jb250YWluZXJzIGluZm9ybWF0aW9uLgogICAgYWxsb3dfY3JlYXRlX2NvbnRhaW5lcl9pbnB1dChyZXEpCgogICAgaV9vY2kgOj0gcmVxLk9DSQogICAgaV9zdG9yYWdlcyA6PSByZXEuc3RvcmFnZXMKICAgIGlfZGV2aWNlcyA6PSByZXEuZGV2aWNlcwoKICAgICMgYXJyYXkgb2YgcG9zc2libGUgc3RhdGUgb3BlcmF0aW9ucwogICAgb3BzX2J1aWxkZXIgOj0gW10KCiAgICAjIGNoZWNrIHNhbmRib3ggbmFtZQogICAgc2FuZGJveF9uYW1lID0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FX0tFWV0KICAgIGFkZF9zYW5kYm94X25hbWVfdG9fc3RhdGUgOj0gc3RhdGVfYWxsb3dzKCJzYW5kYm94X25hbWUiLCBzYW5kYm94X25hbWUpCiAgICBvcHNfYnVpbGRlcjEgOj0gY29uY2F0X29wX2lmX25vdF9udWxsKG9wc19idWlsZGVyLCBhZGRfc2FuZGJveF9uYW1lX3RvX3N0YXRlKQoKICAgICMgQ2hlY2sgaWYgYW55IGVsZW1lbnQgZnJvbSB0aGUgcG9saWN5X2RhdGEuY29udGFpbmVycyBhcnJheSBhbGxvd3MgdGhlIGlucHV0IHJlcXVlc3QuCiAgICBzb21lIHBfY29udGFpbmVyIGluIHBvbGljeV9kYXRhLmNvbnRhaW5lcnMKICAgIHByaW50KCI9PT09PT09PSBDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiB0cnlpbmcgbmV4dCBwb2xpY3kgY29udGFpbmVyIikKCiAgICBwX3BpZG5zIDo9IHBfY29udGFpbmVyLnNhbmRib3hfcGlkbnMKICAgIGlfcGlkbnMgOj0gcmVxLnNhbmRib3hfcGlkbnMKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiBwX3BpZG5zID0iLCBwX3BpZG5zLCAiaV9waWRucyA9IiwgaV9waWRucykKICAgIHBfcGlkbnMgPT0gaV9waWRucwoKICAgIHBfb2NpIDo9IHBfY29udGFpbmVyLk9DSQoKICAgICMgY2hlY2sgbmFtZXNwYWNlCiAgICBwX25hbWVzcGFjZSA6PSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBpX25hbWVzcGFjZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwcmludCAoIkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb246IHBfbmFtZXNwYWNlID0iLCBwX25hbWVzcGFjZSwgImlfbmFtZXNwYWNlID0iLCBpX25hbWVzcGFjZSkKICAgIGFkZF9uYW1lc3BhY2VfdG9fc3RhdGUgOj0gYWxsb3dfbmFtZXNwYWNlKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkKICAgIG9wc19idWlsZGVyMiA6PSBjb25jYXRfb3BfaWZfbm90X251bGwob3BzX2J1aWxkZXIxLCBhZGRfbmFtZXNwYWNlX3RvX3N0YXRlKQoKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiBwIFZlcnNpb24gPSIsIHBfb2NpLlZlcnNpb24sICJpIFZlcnNpb24gPSIsIGlfb2NpLlZlcnNpb24pCiAgICBwX29jaS5WZXJzaW9uID09IGlfb2NpLlZlcnNpb24KCiAgICBwcmludCgiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdENvbW1vbjogcCBSZWFkb25seSA9IiwgcF9vY2kuUm9vdC5SZWFkb25seSwgImkgUmVhZG9ubHkgPSIsIGlfb2NpLlJvb3QuUmVhZG9ubHkpCiAgICBwX29jaS5Sb290LlJlYWRvbmx5ID09IGlfb2NpLlJvb3QuUmVhZG9ubHkKCiAgICBhbGxvd19hbm5vKHBfb2NpLCBpX29jaSkKCiAgICBwX3N0b3JhZ2VzIDo9IHBfY29udGFpbmVyLnN0b3JhZ2VzCiAgICBhbGxvd19ieV9hbm5vKHBfb2NpLCBpX29jaSwgcF9zdG9yYWdlcywgaV9zdG9yYWdlcykKCiAgICBwX2RldmljZXMgOj0gcF9jb250YWluZXIuZGV2aWNlcwogICAgYWxsb3dfZGV2aWNlcyhwX2RldmljZXMsIGlfZGV2aWNlcykKCiAgICByZXQgOj0gYWxsb3dfbGludXgob3BzX2J1aWxkZXIyLCBwX29jaSwgaV9vY2kpCiAgICByZXQuYWxsb3dlZAoKICAgIG9wcyA6PSByZXQub3BzCgogICAgcHJpbnQoIkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb246IHRydWUiKQp9CgphbGxvd19jcmVhdGVfY29udGFpbmVyX2lucHV0KHJlcSkgewogICAgcHJpbnQoImFsbG93X2NyZWF0ZV9jb250YWluZXJfaW5wdXQ6IGlucHV0ID0iLCByZXEpCgogICAgY291bnQocmVxLnNoYXJlZF9tb3VudHMpID09IDAKICAgIGlzX251bGwocmVxLnN0cmluZ191c2VyKQoKICAgIGlfb2NpIDo9IHJlcS5PQ0kKICAgIGlzX251bGwoaV9vY2kuSG9va3MpCiAgICBpc19udWxsKGlfb2NpLlNvbGFyaXMpCiAgICBpc19udWxsKGlfb2NpLldpbmRvd3MpCgogICAgaV9saW51eCA6PSBpX29jaS5MaW51eAogICAgY291bnQoaV9saW51eC5HSURNYXBwaW5ncykgPT0gMAogICAgY291bnQoaV9saW51eC5Nb3VudExhYmVsKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlJlc291cmNlcy5EZXZpY2VzKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlJvb3Rmc1Byb3BhZ2F0aW9uKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlVJRE1hcHBpbmdzKSA9PSAwCiAgICBpc19udWxsKGlfbGludXguSW50ZWxSZHQpCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLkJsb2NrSU8pCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLk5ldHdvcmspCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLlBpZHMpCiAgICBpc19udWxsKGlfbGludXguU2VjY29tcCkKCiAgICBpX3Byb2Nlc3MgOj0gaV9vY2kuUHJvY2VzcwogICAgY291bnQoaV9wcm9jZXNzLlNlbGludXhMYWJlbCkgPT0gMAogICAgY291bnQoaV9wcm9jZXNzLlVzZXIuVXNlcm5hbWUpID09IDAKCiAgICBwcmludCgiYWxsb3dfY3JlYXRlX2NvbnRhaW5lcl9pbnB1dDogdHJ1ZSIpCn0KCmFsbG93X25hbWVzcGFjZShwX25hbWVzcGFjZSwgaV9uYW1lc3BhY2UpID0gYWRkX25hbWVzcGFjZSB7CiAgICBwX25hbWVzcGFjZSA9PSBpX25hbWVzcGFjZQogICAgYWRkX25hbWVzcGFjZSA6PSBudWxsCiAgICBwcmludCgiYWxsb3dfbmFtZXNwYWNlIDE6IGlucHV0IG5hbWVzcGFjZSBtYXRjaGVzIHBvbGljeSBkYXRhIikKfQoKYWxsb3dfbmFtZXNwYWNlKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkgPSBhZGRfbmFtZXNwYWNlIHsKICAgIHBfbmFtZXNwYWNlID09ICIiCiAgICBwcmludCgiYWxsb3dfbmFtZXNwYWNlIDI6IG5vIG5hbWVzcGFjZSBmb3VuZCBvbiBwb2xpY3kgZGF0YSIpCiAgICBhZGRfbmFtZXNwYWNlIDo9IHN0YXRlX2FsbG93cygibmFtZXNwYWNlIiwgaV9uYW1lc3BhY2UpCn0KCiMgdmFsdWUgaGFzbid0IGJlZW4gc2VlbiBiZWZvcmUsIHNhdmUgaXQgdG8gc3RhdGUKc3RhdGVfYWxsb3dzKGtleSwgdmFsdWUpID0gYWN0aW9uIHsKICBzdGF0ZSA6PSBnZXRfc3RhdGUoKQogIHByaW50KCJzdGF0ZV9hbGxvd3MgMTogc3RhdGVba2V5XSA9Iiwgc3RhdGVba2V5XSwgInZhbHVlID0iLCB2YWx1ZSkKICBub3Qgc3RhdGVba2V5XQogIHByaW50KCJzdGF0ZV9hbGxvd3MgMTogc2F2aW5nIHRvIHN0YXRlIGtleSA9Iiwga2V5LCAidmFsdWUgPSIsIHZhbHVlKQogIHBhdGggOj0gZ2V0X3N0YXRlX3BhdGgoa2V5KSAKICBhY3Rpb24gOj0gewogICAgIm9wIjogImFkZCIsCiAgICAicGF0aCI6IHBhdGgsIAogICAgInZhbHVlIjogdmFsdWUsCiAgfQp9CgojIHZhbHVlIG1hdGNoZXMgd2hhdCdzIGluIHN0YXRlLCBhbGxvdyBpdApzdGF0ZV9hbGxvd3Moa2V5LCB2YWx1ZSkgPSBhY3Rpb24gewogIHByaW50KCJzdGF0ZV9hbGxvd3MgMjogc3RhcnQiKQogIHN0YXRlIDo9IGdldF9zdGF0ZSgpCiAgcHJpbnQoInN0YXRlX2FsbG93cyAyOiBzdGF0ZVtrZXldID0iLCBzdGF0ZVtrZXldLCAidmFsdWUgPSIsIHZhbHVlKQogIHZhbHVlID09IHN0YXRlW2tleV0KICBwcmludCgic3RhdGVfYWxsb3dzIDI6IGZvdW5kIGtleSA9Iiwga2V5LCAidmFsdWUgPSIsIHZhbHVlLCAiIGluIHN0YXRlIikKICBhY3Rpb24gOj0gbnVsbAp9CgojIGhlbHBlciBmdW5jdGlvbnMgdG8gaW50ZXJhY3Qgd2l0aCB0aGUgc3RhdGUKZ2V0X3N0YXRlKCkgPSBzdGF0ZSB7CiAgc3RhdGUgOj0gZGF0YVsicHN0YXRlIl0KfQoKZ2V0X3N0YXRlX3ZhbChrZXkpID0gdmFsdWUgewogICAgc3RhdGUgOj0gZ2V0X3N0YXRlKCkKICAgIHZhbHVlIDo9IHN0YXRlW2tleV0KfQoKZ2V0X3N0YXRlX3BhdGgoa2V5KSA9IHBhdGggewogICAgIyBwcmVwZW5kICIvcHN0YXRlLyIgdG8ga2V5CiAgICBwYXRoIDo9IGNvbmNhdCgiLyIsIFsiL3BzdGF0ZSIsIGtleV0pCn0KCiMgSGVscGVyIGZ1bmN0aW9ucyB0byBjb25kaXRpb25hbGx5IGNvbmNhdGVuYXRlIG9wIGlzIG5vdCBudWxsCmNvbmNhdF9vcF9pZl9ub3RfbnVsbChvcHMsIG9wKSA9IHJlc3VsdCB7CiAgICBvcCA9PSBudWxsCiAgICByZXN1bHQgOj0gb3BzCn0KCmNvbmNhdF9vcF9pZl9ub3RfbnVsbChvcHMsIG9wKSA9IHJlc3VsdCB7CiAgICBvcCAhPSBudWxsCiAgICByZXN1bHQgOj0gYXJyYXkuY29uY2F0KG9wcywgW29wXSkKfQoKIyBSZWplY3QgdW5leHBlY3RlZCBhbm5vdGF0aW9ucy4KYWxsb3dfYW5ubyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19hbm5vIDE6IHN0YXJ0IikKCiAgICBub3QgaV9vY2kuQW5ub3RhdGlvbnMKCiAgICBwcmludCgiYWxsb3dfYW5ubyAxOiB0cnVlIikKfQphbGxvd19hbm5vKHBfb2NpLCBpX29jaSkgewogICAgcHJpbnQoImFsbG93X2Fubm8gMjogcCBBbm5vdGF0aW9ucyA9IiwgcF9vY2kuQW5ub3RhdGlvbnMpCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiBpIEFubm90YXRpb25zID0iLCBpX29jaS5Bbm5vdGF0aW9ucykKCiAgICBpX2tleXMgOj0gb2JqZWN0LmtleXMoaV9vY2kuQW5ub3RhdGlvbnMpCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiBpIGtleXMgPSIsIGlfa2V5cykKCiAgICBldmVyeSBpX2tleSBpbiBpX2tleXMgewogICAgICAgIGFsbG93X2Fubm9fa2V5KGlfa2V5LCBwX29jaSkKICAgIH0KCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiB0cnVlIikKfQoKYWxsb3dfYW5ub19rZXkoaV9rZXksIHBfb2NpKSB7CiAgICBwcmludCgiYWxsb3dfYW5ub19rZXkgMTogaSBrZXkgPSIsIGlfa2V5KQoKICAgIHN0YXJ0c3dpdGgoaV9rZXksICJpby5rdWJlcm5ldGVzLmNyaS4iKQoKICAgIHByaW50KCJhbGxvd19hbm5vX2tleSAxOiB0cnVlIikKfQphbGxvd19hbm5vX2tleShpX2tleSwgcF9vY2kpIHsKICAgIHByaW50KCJhbGxvd19hbm5vX2tleSAyOiBpIGtleSA9IiwgaV9rZXkpCgogICAgc29tZSBwX2tleSwgXyBpbiBwX29jaS5Bbm5vdGF0aW9ucwogICAgcF9rZXkgPT0gaV9rZXkKCiAgICBwcmludCgiYWxsb3dfYW5ub19rZXkgMjogdHJ1ZSIpCn0KCiMgR2V0IHRoZSB2YWx1ZSBvZiB0aGUgU19OQU1FX0tFWSBhbm5vdGF0aW9uIGFuZAojIGNvcnJlbGF0ZSBpdCB3aXRoIG90aGVyIGFubm90YXRpb25zIGFuZCBwcm9jZXNzIGZpZWxkcy4KYWxsb3dfYnlfYW5ubyhwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpIHsKICAgIHByaW50KCJhbGxvd19ieV9hbm5vIDE6IHN0YXJ0IikKCiAgICBub3QgcF9vY2kuQW5ub3RhdGlvbnNbU19OQU1FX0tFWV0KCiAgICBpX3NfbmFtZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMTogaV9zX25hbWUgPSIsIGlfc19uYW1lKQoKICAgIGlfc19uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FU1BBQ0VfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMTogaV9zX25hbWVzcGFjZSA9IiwgaV9zX25hbWVzcGFjZSkKCiAgICBhbGxvd19ieV9zYW5kYm94X25hbWUocF9vY2ksIGlfb2NpLCBwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBpX3NfbmFtZSwgaV9zX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfYnlfYW5ubyAxOiB0cnVlIikKfQphbGxvd19ieV9hbm5vKHBfb2NpLCBpX29jaSwgcF9zdG9yYWdlcywgaV9zdG9yYWdlcykgewogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMjogc3RhcnQiKQoKICAgIHBfc19uYW1lIDo9IHBfb2NpLkFubm90YXRpb25zW1NfTkFNRV9LRVldCiAgICBpX3NfbmFtZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMjogaV9zX25hbWUgPSIsIGlfc19uYW1lLCAicF9zX25hbWUgPSIsIHBfc19uYW1lKQoKICAgIGFsbG93X3NhbmRib3hfbmFtZShwX3NfbmFtZSwgaV9zX25hbWUpCgogICAgaV9zX25hbWVzcGFjZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwcmludCgiYWxsb3dfYnlfYW5ubyAyOiBpX3NfbmFtZXNwYWNlID0iLCBpX3NfbmFtZXNwYWNlKQoKICAgIGFsbG93X2J5X3NhbmRib3hfbmFtZShwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMsIGlfc19uYW1lLCBpX3NfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd19ieV9hbm5vIDI6IHRydWUiKQp9CgphbGxvd19ieV9zYW5kYm94X25hbWUocF9vY2ksIGlfb2NpLCBwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfYnlfc2FuZGJveF9uYW1lOiBzdGFydCIpCgogICAgaV9uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FU1BBQ0VfS0VZXQoKICAgIGFsbG93X2J5X2NvbnRhaW5lcl90eXBlcyhwX29jaSwgaV9vY2ksIHNfbmFtZSwgaV9uYW1lc3BhY2UpCiAgICBhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZChwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpCiAgICBhbGxvd19wcm9jZXNzKHBfb2NpLlByb2Nlc3MsIGlfb2NpLlByb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpCgogICAgcHJpbnQoImFsbG93X2J5X3NhbmRib3hfbmFtZTogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfbmFtZShwX3NfbmFtZSwgaV9zX25hbWUpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X25hbWU6IHN0YXJ0IikKICAgIHJlZ2V4Lm1hdGNoKHBfc19uYW1lLCBpX3NfbmFtZSkKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9uYW1lOiB0cnVlIikKfQoKIyBDaGVjayB0aGF0IHRoZSAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLXR5cGUiIGFuZAojICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIiBhbm5vdGF0aW9ucyBkZXNpZ25hdGUgdGhlCiMgZXhwZWN0ZWQgdHlwZSAtIGVpdGhlciBhICJzYW5kYm94IiBvciBhICJjb250YWluZXIiLiBUaGVuLCB2YWxpZGF0ZQojIG90aGVyIGFubm90YXRpb25zIGJhc2VkIG9uIHRoZSBhY3R1YWwgInNhbmRib3giIG9yICJjb250YWluZXIiIHZhbHVlCiMgZnJvbSB0aGUgaW5wdXQgY29udGFpbmVyLgphbGxvd19ieV9jb250YWluZXJfdHlwZXMocF9vY2ksIGlfb2NpLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfYnlfY29udGFpbmVyX3R5cGVzOiBjaGVja2luZyBpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSIpCgogICAgY190eXBlIDo9ICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSIKICAgIAogICAgcF9jcmlfdHlwZSA6PSBwX29jaS5Bbm5vdGF0aW9uc1tjX3R5cGVdCiAgICBpX2NyaV90eXBlIDo9IGlfb2NpLkFubm90YXRpb25zW2NfdHlwZV0KICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZXM6IHBfY3JpX3R5cGUgPSIsIHBfY3JpX3R5cGUsICJpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgcF9jcmlfdHlwZSA9PSBpX2NyaV90eXBlCgogICAgYWxsb3dfYnlfY29udGFpbmVyX3R5cGUoaV9jcmlfdHlwZSwgcF9vY2ksIGlfb2NpLCBzX25hbWUsIHNfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZXM6IHRydWUiKQp9CgphbGxvd19ieV9jb250YWluZXJfdHlwZShpX2NyaV90eXBlLCBwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAxOiBpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgaV9jcmlfdHlwZSA9PSAic2FuZGJveCIKCiAgICBpX2thdGFfdHlwZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1siaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5jb250YWluZXJfdHlwZSJdCiAgICBwcmludCgiYWxsb3dfYnlfY29udGFpbmVyX3R5cGUgMTogaV9rYXRhX3R5cGUgPSIsIGlfa2F0YV90eXBlKQogICAgaV9rYXRhX3R5cGUgPT0gInBvZF9zYW5kYm94IgoKICAgIGFsbG93X3NhbmRib3hfY29udGFpbmVyX25hbWUocF9vY2ksIGlfb2NpKQogICAgYWxsb3dfc2FuZGJveF9uZXRfbmFtZXNwYWNlKHBfb2NpLCBpX29jaSkKICAgIGFsbG93X3NhbmRib3hfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpCgogICAgcHJpbnQoImFsbG93X2J5X2NvbnRhaW5lcl90eXBlIDE6IHRydWUiKQp9CgphbGxvd19ieV9jb250YWluZXJfdHlwZShpX2NyaV90eXBlLCBwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiBpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgaV9jcmlfdHlwZSA9PSAiY29udGFpbmVyIgoKICAgIGlfa2F0YV90eXBlIDo9IGlfb2NpLkFubm90YXRpb25zWyJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIl0KICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiBpX2thdGFfdHlwZSA9IiwgaV9rYXRhX3R5cGUpCiAgICBpX2thdGFfdHlwZSA9PSAicG9kX2NvbnRhaW5lciIKCiAgICBhbGxvd19jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpCiAgICBhbGxvd19uZXRfbmFtZXNwYWNlKHBfb2NpLCBpX29jaSkKICAgIGFsbG93X2xvZ19kaXJlY3RvcnkocF9vY2ksIGlfb2NpKQoKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiB0cnVlIikKfQoKIyAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLW5hbWUiIGFubm90YXRpb24KYWxsb3dfc2FuZGJveF9jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X2NvbnRhaW5lcl9uYW1lOiBzdGFydCIpCgogICAgY29udGFpbmVyX2Fubm90YXRpb25fbWlzc2luZyhwX29jaSwgaV9vY2ksICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItbmFtZSIpCgogICAgcHJpbnQoImFsbG93X3NhbmRib3hfY29udGFpbmVyX25hbWU6IHRydWUiKQp9CgphbGxvd19jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19jb250YWluZXJfbmFtZTogc3RhcnQiKQoKICAgIGFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uKHBfb2NpLCBpX29jaSwgImlvLmt1YmVybmV0ZXMuY3JpLmNvbnRhaW5lci1uYW1lIikKCiAgICBwcmludCgiYWxsb3dfY29udGFpbmVyX25hbWU6IHRydWUiKQp9Cgpjb250YWluZXJfYW5ub3RhdGlvbl9taXNzaW5nKHBfb2NpLCBpX29jaSwga2V5KSB7CiAgICBwcmludCgiY29udGFpbmVyX2Fubm90YXRpb25fbWlzc2luZzoiLCBrZXkpCgogICAgbm90IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIG5vdCBpX29jaS5Bbm5vdGF0aW9uc1trZXldCgogICAgcHJpbnQoImNvbnRhaW5lcl9hbm5vdGF0aW9uX21pc3Npbmc6IHRydWUiKQp9CgphbGxvd19jb250YWluZXJfYW5ub3RhdGlvbihwX29jaSwgaV9vY2ksIGtleSkgewogICAgcHJpbnQoImFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uOiBrZXkgPSIsIGtleSkKCiAgICBwX3ZhbHVlIDo9IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIGlfdmFsdWUgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgcHJpbnQoImFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uOiBwX3ZhbHVlID0iLCBwX3ZhbHVlLCAiaV92YWx1ZSA9IiwgaV92YWx1ZSkKCiAgICBwX3ZhbHVlID09IGlfdmFsdWUKCiAgICBwcmludCgiYWxsb3dfY29udGFpbmVyX2Fubm90YXRpb246IHRydWUiKQp9CgojICJuZXJkY3RsL25ldHdvcmstbmFtZXNwYWNlIiBhbm5vdGF0aW9uCmFsbG93X3NhbmRib3hfbmV0X25hbWVzcGFjZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X25ldF9uYW1lc3BhY2U6IHN0YXJ0IikKCiAgICBrZXkgOj0gIm5lcmRjdGwvbmV0d29yay1uYW1lc3BhY2UiCgogICAgcF9uYW1lc3BhY2UgOj0gcF9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgaV9uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgcHJpbnQoImFsbG93X3NhbmRib3hfbmV0X25hbWVzcGFjZTogcF9uYW1lc3BhY2UgPSIsIHBfbmFtZXNwYWNlLCAiaV9uYW1lc3BhY2UgPSIsIGlfbmFtZXNwYWNlKQoKICAgIHJlZ2V4Lm1hdGNoKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9uZXRfbmFtZXNwYWNlOiB0cnVlIikKfQoKYWxsb3dfbmV0X25hbWVzcGFjZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19uZXRfbmFtZXNwYWNlOiBzdGFydCIpCgogICAga2V5IDo9ICJuZXJkY3RsL25ldHdvcmstbmFtZXNwYWNlIgoKICAgIG5vdCBwX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICBub3QgaV9vY2kuQW5ub3RhdGlvbnNba2V5XQoKICAgIHByaW50KCJhbGxvd19uZXRfbmFtZXNwYWNlOiB0cnVlIikKfQoKIyAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1sb2ctZGlyZWN0b3J5IiBhbm5vdGF0aW9uCmFsbG93X3NhbmRib3hfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X2xvZ19kaXJlY3Rvcnk6IHN0YXJ0IikKCiAgICBrZXkgOj0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbG9nLWRpcmVjdG9yeSIKCiAgICBwX2RpciA6PSBwX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICByZWdleDEgOj0gcmVwbGFjZShwX2RpciwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHJlZ2V4MiA6PSByZXBsYWNlKHJlZ2V4MSwgIiQoc2FuZGJveC1uYW1lc3BhY2UpIiwgc19uYW1lc3BhY2UpCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiByZWdleDIgPSIsIHJlZ2V4MikKCiAgICBpX2RpciA6PSBpX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiBpX2RpciA9IiwgaV9kaXIpCgogICAgcmVnZXgubWF0Y2gocmVnZXgyLCBpX2RpcikKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiB0cnVlIikKfQoKYWxsb3dfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19sb2dfZGlyZWN0b3J5OiBzdGFydCIpCgogICAga2V5IDo9ICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWxvZy1kaXJlY3RvcnkiCgogICAgbm90IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIG5vdCBpX29jaS5Bbm5vdGF0aW9uc1trZXldCgogICAgcHJpbnQoImFsbG93X2xvZ19kaXJlY3Rvcnk6IHRydWUiKQp9CgphbGxvd19kZXZpY2VzKHBfZGV2aWNlcywgaV9kZXZpY2VzKSB7CiAgICBwcmludCgiYWxsb3dfZGV2aWNlczogc3RhcnQiKQogICAgZXZlcnkgaV9kZXZpY2UgaW4gaV9kZXZpY2VzIHsKICAgICAgICBwcmludCgiYWxsb3dfZGV2aWNlczogaV9kZXZpY2UgPSIsIGlfZGV2aWNlKQogICAgICAgIHNvbWUgcF9kZXZpY2UgaW4gcF9kZXZpY2VzCiAgICAgICAgcF9kZXZpY2UuY29udGFpbmVyX3BhdGggPT0gaV9kZXZpY2UuY29udGFpbmVyX3BhdGgKICAgIH0KICAgIHByaW50KCJhbGxvd19kZXZpY2VzOiB0cnVlIikKfQoKYWxsb3dfbGludXgoc3RhdGVfb3BzLCBwX29jaSwgaV9vY2kpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIHBfbmFtZXNwYWNlcyA6PSBwX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbGludXg6IHAgbmFtZXNwYWNlcyA9IiwgcF9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlcyA6PSBpX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbGludXg6IGkgbmFtZXNwYWNlcyA9IiwgaV9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlX3dpdGhvdXRfbmV0d29yayA6PSBbb2JqIHwgb2JqIDo9IGlfbmFtZXNwYWNlc1tfXTsgb2JqLlR5cGUgIT0gIm5ldHdvcmsiXQoKICAgIHByaW50KCJhbGxvd19saW51eDogaV9uYW1lc3BhY2Vfd2l0aG91dF9uZXR3b3JrID0iLCBpX25hbWVzcGFjZV93aXRob3V0X25ldHdvcmspCgogICAgcF9uYW1lc3BhY2VzID09IGlfbmFtZXNwYWNlX3dpdGhvdXRfbmV0d29yawoKICAgIGFsbG93X21hc2tlZF9wYXRocyhwX29jaSwgaV9vY2kpCiAgICBhbGxvd19yZWFkb25seV9wYXRocyhwX29jaSwgaV9vY2kpCiAgICBhbGxvd19saW51eF9kZXZpY2VzKHBfb2NpLkxpbnV4LkRldmljZXMsIGlfb2NpLkxpbnV4LkRldmljZXMpCiAgICBhbGxvd19saW51eF9zeXNjdGwocF9vY2kuTGludXgsIGlfb2NpLkxpbnV4KQogICAgcmV0IDo9IGFsbG93X25ldHdvcmtfbmFtZXNwYWNlX3N0YXJ0KHN0YXRlX29wcywgcF9vY2ksIGlfb2NpKQogICAgcmV0LmFsbG93ZWQKCiAgICBvcHMgOj0gcmV0Lm9wcwoKICAgIHByaW50KCJhbGxvd19saW51eDogdHJ1ZSIpCn0KCiMgUmV0cmlldmUgdGhlICJuZXR3b3JrIiBuYW1lc3BhY2UgZnJvbSB0aGUgaW5wdXQgZGF0YSBhbmQgcGFzcyBpdCBvbiBmb3IgdGhlCiMgbmV0d29yayBuYW1lc3BhY2UgcG9saWN5IGNoZWNrcy4KYWxsb3dfbmV0d29ya19uYW1lc3BhY2Vfc3RhcnQoc3RhdGVfb3BzLCBwX29jaSwgaV9vY2kpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIHByaW50KCJhbGxvd19uZXR3b3JrX25hbWVzcGFjZSBzdGFydDogc3RhcnQiKQoKICAgIHBfbmFtZXNwYWNlcyA6PSBwX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IHAgbmFtZXNwYWNlcyA9IiwgcF9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlcyA6PSBpX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IGkgbmFtZXNwYWNlcyA9IiwgaV9uYW1lc3BhY2VzKQoKICAgICMgUmV0dXJuIHBhdGggb2YgdGhlICJuZXR3b3JrIiBuYW1lc3BhY2UKICAgIG5ldHdvcmtfbnMgOj0gW29iaiB8IG9iaiA6PSBpX25hbWVzcGFjZXNbX107IG9iai5UeXBlID09ICJuZXR3b3JrIl0KCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IG5ldHdvcmtfbnMgPSIsIG5ldHdvcmtfbnMpCgogICAgcmV0IDo9IGFsbG93X25ldHdvcmtfbmFtZXNwYWNlKHN0YXRlX29wcywgbmV0d29ya19ucykKICAgIHJldC5hbGxvd2VkCgogICAgb3BzIDo9IHJldC5vcHMKfQoKIyBUaGlzIHJ1bGUgaXMgd2hlbiB0aGVyZSdzIG5vIG5ldHdvcmsgbmFtZXNwYWNlIGluIHRoZSBpbnB1dCBkYXRhLgphbGxvd19uZXR3b3JrX25hbWVzcGFjZShzdGF0ZV9vcHMsIG5ldHdvcmtfbnMpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIGNvdW50KG5ldHdvcmtfbnMpID09IDAKCiAgICBuZXR3b3JrX25zX3BhdGggPSAiIgoKICAgIGFkZF9uZXR3b3JrX25hbWVzcGFjZV90b19zdGF0ZSA6PSBzdGF0ZV9hbGxvd3MoIm5ldHdvcmtfbmFtZXNwYWNlIiwgbmV0d29ya19uc19wYXRoKQogICAgb3BzIDo9IGNvbmNhdF9vcF9pZl9ub3RfbnVsbChzdGF0ZV9vcHMsIGFkZF9uZXR3b3JrX25hbWVzcGFjZV90b19zdGF0ZSkKCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2UgMTogdHJ1ZSIpCn0KCiMgVGhpcyBydWxlIGlzIHdoZW4gdGhlcmUncyBleGFjdGx5IG9uZSBuZXR3b3JrIG5hbWVzcGFjZSBpbiB0aGUgaW5wdXQgZGF0YS4KYWxsb3dfbmV0d29ya19uYW1lc3BhY2Uoc3RhdGVfb3BzLCBuZXR3b3JrX25zKSA6PSB7Im9wcyI6IG9wcywgImFsbG93ZWQiOiB0cnVlfSB7CiAgICBjb3VudChuZXR3b3JrX25zKSA9PSAxCgogICAgYWRkX25ldHdvcmtfbmFtZXNwYWNlX3RvX3N0YXRlIDo9IHN0YXRlX2FsbG93cygibmV0d29ya19uYW1lc3BhY2UiLCBuZXR3b3JrX25zWzBdLlBhdGgpCiAgICBvcHMgOj0gY29uY2F0X29wX2lmX25vdF9udWxsKHN0YXRlX29wcywgYWRkX25ldHdvcmtfbmFtZXNwYWNlX3RvX3N0YXRlKQoKICAgIHByaW50KCJhbGxvd19uZXR3b3JrX25hbWVzcGFjZSAyOiB0cnVlIikKfQoKYWxsb3dfbWFza2VkX3BhdGhzKHBfb2NpLCBpX29jaSkgewogICAgcF9wYXRocyA6PSBwX29jaS5MaW51eC5NYXNrZWRQYXRocwogICAgcHJpbnQoImFsbG93X21hc2tlZF9wYXRocyAxOiBwX3BhdGhzID0iLCBwX3BhdGhzKQoKICAgIGlfcGF0aHMgOj0gaV9vY2kuTGludXguTWFza2VkUGF0aHMKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aHMgMTogaV9wYXRocyA9IiwgaV9wYXRocykKCiAgICBhbGxvd19tYXNrZWRfcGF0aHNfYXJyYXkocF9wYXRocywgaV9wYXRocykKCiAgICBwcmludCgiYWxsb3dfbWFza2VkX3BhdGhzIDE6IHRydWUiKQp9CmFsbG93X21hc2tlZF9wYXRocyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aHMgMjogc3RhcnQiKQoKICAgIG5vdCBwX29jaS5MaW51eC5NYXNrZWRQYXRocwogICAgbm90IGlfb2NpLkxpbnV4Lk1hc2tlZFBhdGhzCgogICAgcHJpbnQoImFsbG93X21hc2tlZF9wYXRocyAyOiB0cnVlIikKfQoKIyBBbGwgdGhlIHBvbGljeSBtYXNrZWQgcGF0aHMgbXVzdCBiZSBtYXNrZWQgaW4gdGhlIGlucHV0IGRhdGEgdG9vLgojIElucHV0IGlzIGFsbG93ZWQgdG8gaGF2ZSBtb3JlIG1hc2tlZCBwYXRocyB0aGFuIHRoZSBwb2xpY3kuCmFsbG93X21hc2tlZF9wYXRoc19hcnJheShwX2FycmF5LCBpX2FycmF5KSB7CiAgICBldmVyeSBwX2VsZW0gaW4gcF9hcnJheSB7CiAgICAgICAgYWxsb3dfbWFza2VkX3BhdGgocF9lbGVtLCBpX2FycmF5KQogICAgfQp9CgphbGxvd19tYXNrZWRfcGF0aChwX2VsZW0sIGlfYXJyYXkpIHsKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aDogcF9lbGVtID0iLCBwX2VsZW0pCgogICAgc29tZSBpX2VsZW0gaW4gaV9hcnJheQogICAgcF9lbGVtID09IGlfZWxlbQoKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aDogdHJ1ZSIpCn0KCmFsbG93X3JlYWRvbmx5X3BhdGhzKHBfb2NpLCBpX29jaSkgewogICAgcF9wYXRocyA6PSBwX29jaS5MaW51eC5SZWFkb25seVBhdGhzCiAgICBwcmludCgiYWxsb3dfcmVhZG9ubHlfcGF0aHMgMTogcF9wYXRocyA9IiwgcF9wYXRocykKCiAgICBpX3BhdGhzIDo9IGlfb2NpLkxpbnV4LlJlYWRvbmx5UGF0aHMKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAxOiBpX3BhdGhzID0iLCBpX3BhdGhzKQoKICAgIGFsbG93X3JlYWRvbmx5X3BhdGhzX2FycmF5KHBfcGF0aHMsIGlfcGF0aHMsIGlfb2NpLkxpbnV4Lk1hc2tlZFBhdGhzKQoKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAxOiB0cnVlIikKfQphbGxvd19yZWFkb25seV9wYXRocyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAyOiBzdGFydCIpCgogICAgbm90IHBfb2NpLkxpbnV4LlJlYWRvbmx5UGF0aHMKICAgIG5vdCBpX29jaS5MaW51eC5SZWFkb25seVBhdGhzCgogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGhzIDI6IHRydWUiKQp9CgojIEFsbCB0aGUgcG9saWN5IHJlYWRvbmx5IHBhdGhzIG11c3QgYmUgZWl0aGVyOgojIC0gUHJlc2VudCBpbiB0aGUgaW5wdXQgcmVhZG9ubHkgcGF0aHMsIG9yCiMgLSBQcmVzZW50IGluIHRoZSBpbnB1dCBtYXNrZWQgcGF0aHMuCiMgSW5wdXQgaXMgYWxsb3dlZCB0byBoYXZlIG1vcmUgcmVhZG9ubHkgcGF0aHMgdGhhbiB0aGUgcG9saWN5LgphbGxvd19yZWFkb25seV9wYXRoc19hcnJheShwX2FycmF5LCBpX2FycmF5LCBtYXNrZWRfcGF0aHMpIHsKICAgIGV2ZXJ5IHBfZWxlbSBpbiBwX2FycmF5IHsKICAgICAgICBhbGxvd19yZWFkb25seV9wYXRoKHBfZWxlbSwgaV9hcnJheSwgbWFza2VkX3BhdGhzKQogICAgfQp9CgphbGxvd19yZWFkb25seV9wYXRoKHBfZWxlbSwgaV9hcnJheSwgbWFza2VkX3BhdGhzKSB7CiAgICBwcmludCgiYWxsb3dfcmVhZG9ubHlfcGF0aCAxOiBwX2VsZW0gPSIsIHBfZWxlbSkKCiAgICBzb21lIGlfZWxlbSBpbiBpX2FycmF5CiAgICBwX2VsZW0gPT0gaV9lbGVtCgogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGggMTogdHJ1ZSIpCn0KYWxsb3dfcmVhZG9ubHlfcGF0aChwX2VsZW0sIGlfYXJyYXksIG1hc2tlZF9wYXRocykgewogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGggMjogcF9lbGVtID0iLCBwX2VsZW0pCgogICAgc29tZSBpX21hc2tlZCBpbiBtYXNrZWRfcGF0aHMKICAgIHBfZWxlbSA9PSBpX21hc2tlZAoKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRoIDI6IHRydWUiKQp9CgphbGxvd19saW51eF9kZXZpY2VzKHBfZGV2aWNlcywgaV9kZXZpY2VzKSB7CiAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogc3RhcnQiKQogICAgZXZlcnkgaV9kZXZpY2UgaW4gaV9kZXZpY2VzIHsKICAgICAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogaV9kZXZpY2UgPSIsIGlfZGV2aWNlKQogICAgICAgIHNvbWUgcF9kZXZpY2UgaW4gcF9kZXZpY2VzCiAgICAgICAgaV9kZXZpY2UuUGF0aCA9PSBwX2RldmljZS5QYXRoCiAgICB9CiAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogdHJ1ZSIpCn0KCmFsbG93X2xpbnV4X3N5c2N0bChwX2xpbnV4LCBpX2xpbnV4KSB7CiAgICBwcmludCgiYWxsb3dfbGludXhfc3lzY3RsIDE6IHN0YXJ0IikKICAgIG5vdCBpX2xpbnV4LlN5c2N0bAogICAgcHJpbnQoImFsbG93X2xpbnV4X3N5c2N0bCAxOiB0cnVlIikKfQoKYWxsb3dfbGludXhfc3lzY3RsKHBfbGludXgsIGlfbGludXgpIHsKICAgIHByaW50KCJhbGxvd19saW51eF9zeXNjdGwgMjogc3RhcnQiKQogICAgcF9zeXNjdGwgOj0gcF9saW51eC5TeXNjdGwKICAgIGlfc3lzY3RsIDo9IGlfbGludXguU3lzY3RsCiAgICBldmVyeSBpX25hbWUsIGlfdmFsIGluIGlfc3lzY3RsIHsKICAgICAgICBwcmludCgiYWxsb3dfbGludXhfc3lzY3RsIDI6IGlfbmFtZSA9IiwgaV9uYW1lLCAiaV92YWwgPSIsIGlfdmFsKQogICAgICAgIHBfc3lzY3RsW2lfbmFtZV0gPT0gaV92YWwKICAgIH0KICAgIHByaW50KCJhbGxvd19saW51eF9zeXNjdGwgMjogdHJ1ZSIpCn0KCiMgQ2hlY2sgdGhlIGNvbnNpc3RlbmN5IG9mIHRoZSBpbnB1dCAiaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5idW5kbGVfcGF0aCIKIyBhbmQgaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCIgdmFsdWVzIHdpdGggb3RoZXIgZmllbGRzLgphbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZChwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpIHsKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogc3RhcnQiKQoKICAgIGJ1bmRsZV9wYXRoIDo9IGlfb2NpLkFubm90YXRpb25zWyJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmJ1bmRsZV9wYXRoIl0KICAgIGJ1bmRsZV9pZCA6PSByZXBsYWNlKGJ1bmRsZV9wYXRoLCAiL3J1bi9jb250YWluZXJkL2lvLmNvbnRhaW5lcmQucnVudGltZS52Mi50YXNrL2s4cy5pby8iLCAiIikKCiAgICBidW5kbGVfaWRfZm9ybWF0IDo9IGNvbmNhdCgiIiwgWyJeIiwgQlVORExFX0lELCAiJCJdKQogICAgcmVnZXgubWF0Y2goYnVuZGxlX2lkX2Zvcm1hdCwgYnVuZGxlX2lkKQoKICAgIGtleSA6PSAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCIKCiAgICBwX3JlZ2V4IDo9IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIHNhbmRib3hfaWQgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQoKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogc2FuZGJveF9pZCA9Iiwgc2FuZGJveF9pZCwgInJlZ2V4ID0iLCBwX3JlZ2V4KQogICAgcmVnZXgubWF0Y2gocF9yZWdleCwgc2FuZGJveF9pZCkKCiAgICBhbGxvd19yb290X3BhdGgocF9vY2ksIGlfb2NpLCBidW5kbGVfaWQpCgogICAgZXZlcnkgaV9tb3VudCBpbiBpX29jaS5Nb3VudHMgewogICAgICAgIGFsbG93X21vdW50KHBfb2NpLCBpX21vdW50LCBpX3N0b3JhZ2VzLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpCiAgICB9CgogICAgYWxsb3dfc3RvcmFnZXMocF9zdG9yYWdlcywgaV9zdG9yYWdlcywgYnVuZGxlX2lkLCBzYW5kYm94X2lkKQoKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogdHJ1ZSIpCn0KCmFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHBfcHJvY2VzcyA9IiwgcF9wcm9jZXNzKQogICAgcHJpbnQoImFsbG93X3Byb2Nlc3NfY29tbW9uOiBpX3Byb2Nlc3MgPSAiLCBpX3Byb2Nlc3MpCiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHNfbmFtZSA9Iiwgc19uYW1lKQoKICAgIHBfcHJvY2Vzcy5Dd2QgPT0gaV9wcm9jZXNzLkN3ZAogICAgcF9wcm9jZXNzLk5vTmV3UHJpdmlsZWdlcyA9PSBpX3Byb2Nlc3MuTm9OZXdQcml2aWxlZ2VzCgogICAgYWxsb3dfdXNlcihwX3Byb2Nlc3MsIGlfcHJvY2VzcykKICAgIGFsbG93X2VudihwX3Byb2Nlc3MsIGlfcHJvY2Vzcywgc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHRydWUiKQp9CgojIENvbXBhcmUgdGhlIE9DSSBQcm9jZXNzIGZpZWxkIG9mIGEgcG9saWN5IGNvbnRhaW5lciB3aXRoIHRoZSBpbnB1dCBPQ0kgUHJvY2VzcyBmcm9tIGEgQ3JlYXRlQ29udGFpbmVyUmVxdWVzdAphbGxvd19wcm9jZXNzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfcHJvY2Vzczogc3RhcnQiKQoKICAgIGFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgYWxsb3dfY2FwcyhwX3Byb2Nlc3MuQ2FwYWJpbGl0aWVzLCBpX3Byb2Nlc3MuQ2FwYWJpbGl0aWVzKQogICAgcF9wcm9jZXNzLlRlcm1pbmFsID09IGlfcHJvY2Vzcy5UZXJtaW5hbAoKICAgIHByaW50KCJhbGxvd19wcm9jZXNzOiB0cnVlIikKfQoKIyBDb21wYXJlIHRoZSBPQ0kgUHJvY2VzcyBmaWVsZCBvZiBhIHBvbGljeSBjb250YWluZXIgd2l0aCB0aGUgaW5wdXQgcHJvY2VzcyBmaWVsZCBmcm9tIEV4ZWNQcm9jZXNzUmVxdWVzdAphbGxvd19pbnRlcmFjdGl2ZV9wcm9jZXNzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfaW50ZXJhY3RpdmVfcHJvY2Vzczogc3RhcnQiKQoKICAgIGFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgYWxsb3dfZXhlY19jYXBzKGlfcHJvY2Vzcy5DYXBhYmlsaXRpZXMpCgogICAgIyBUaGVzZSBhcmUgY29tbWFuZHMgZW5hYmxlZCB1c2luZyBFeGVjUHJvY2Vzc1JlcXVlc3QgY29tbWFuZHMgYW5kL29yIHJlZ2V4IGZyb20gdGhlIHNldHRpbmdzIGZpbGUuCiAgICAjIFRoZXkgY2FuIGJlIGV4ZWN1dGVkIGludGVyYWN0aXZlbHkgc28gYWxsb3cgdGhlbSB0byB1c2UgYW55IHZhbHVlIGZvciBpX3Byb2Nlc3MuVGVybWluYWwuCgogICAgcHJpbnQoImFsbG93X2ludGVyYWN0aXZlX3Byb2Nlc3M6IHRydWUiKQp9CgojIENvbXBhcmUgdGhlIE9DSSBQcm9jZXNzIGZpZWxkIG9mIGEgcG9saWN5IGNvbnRhaW5lciB3aXRoIHRoZSBpbnB1dCBwcm9jZXNzIGZpZWxkIGZyb20gRXhlY1Byb2Nlc3NSZXF1ZXN0CmFsbG93X3Byb2JlX3Byb2Nlc3MocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19wcm9iZV9wcm9jZXNzOiBzdGFydCIpCgogICAgYWxsb3dfcHJvY2Vzc19jb21tb24ocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpCiAgICBhbGxvd19leGVjX2NhcHMoaV9wcm9jZXNzLkNhcGFiaWxpdGllcykKICAgIHBfcHJvY2Vzcy5UZXJtaW5hbCA9PSBpX3Byb2Nlc3MuVGVybWluYWwKCiAgICBwcmludCgiYWxsb3dfcHJvYmVfcHJvY2VzczogdHJ1ZSIpCn0KCmFsbG93X3VzZXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MpIHsKICAgIHBfdXNlciA6PSBwX3Byb2Nlc3MuVXNlcgogICAgaV91c2VyIDo9IGlfcHJvY2Vzcy5Vc2VyCgogICAgcHJpbnQoImFsbG93X3VzZXI6IGlucHV0IHVpZCA9IiwgaV91c2VyLlVJRCwgInBvbGljeSB1aWQgPSIsIHBfdXNlci5VSUQpCiAgICBwX3VzZXIuVUlEID09IGlfdXNlci5VSUQKCiAgICAjIFRPRE86IHRyYWNrIGRvd24gdGhlIHJlYXNvbiBmb3IgcmVnaXN0cnkuazhzLmlvL3BhdXNlOjMuOSBiZWluZwogICAgIyAgICAgICBleGVjdXRlZCB3aXRoIGdpZCA9IDAgZGVzcGl0ZSBoYXZpbmcgIjY1NTM1OjY1NTM1IiBpbiBpdHMgY29udGFpbmVyIGltYWdlCiAgICAjICAgICAgIGNvbmZpZy4KICAgICNwcmludCgiYWxsb3dfdXNlcjogaW5wdXQgZ2lkID0iLCBpX3VzZXIuR0lELCAicG9saWN5IGdpZCA9IiwgcF91c2VyLkdJRCkKICAgICNwX3VzZXIuR0lEID09IGlfdXNlci5HSUQKCiAgICAjIFRPRE86IGNvbXBhcmUgdGhlIGFkZGl0aW9uYWxHaWRzIGZpZWxkIHRvbyBhZnRlciBjb21wdXRpbmcgaXRzIHZhbHVlCiAgICAjIGJhc2VkIG9uIC9ldGMvcGFzc3dkIGFuZCAvZXRjL2dyb3VwIGZyb20gdGhlIGNvbnRhaW5lciBpbWFnZS4KfQoKYWxsb3dfZGVwcmVjYXRlZF9hcmdzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZ3MgMTogbm8gYXJncyIpCgogICAgbm90IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJncwogICAgbm90IGlfcHJvY2Vzcy5BcmdzCgogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAxOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZ3MocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSkgewogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiBwb2xpY3kgYXJncyA9IiwgcF9wcm9jZXNzLkRlcHJlY2F0ZWRBcmdzKQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiBpbnB1dCBhcmdzID0iLCBpX3Byb2Nlc3MuQXJncykKCiAgICBjb3VudChwX3Byb2Nlc3MuRGVwcmVjYXRlZEFyZ3MpID09IGNvdW50KGlfcHJvY2Vzcy5BcmdzKQoKICAgIGV2ZXJ5IGksIGlfYXJnIGluIGlfcHJvY2Vzcy5BcmdzIHsKICAgICAgICBhbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpCiAgICB9CgogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDE6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgcF9hcmcyIDo9IHJlcGxhY2UocF9hcmcsICIkJCIsICIkIikKICAgIHBfYXJnMiA9PSBpX2FyZwoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAxOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDI6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgIyBUT0RPOiBjYW4gJChub2RlLW5hbWUpIGJlIGhhbmRsZWQgYmV0dGVyPwogICAgY29udGFpbnMocF9hcmcsICIkKG5vZGUtbmFtZSkiKQoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAyOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDM6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgcF9hcmcyIDo9IHJlcGxhY2UocF9hcmcsICIkJCIsICIkIikKICAgIHBfYXJnMyA6PSByZXBsYWNlKHBfYXJnMiwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAzOiBwX2FyZzMgPSIsIHBfYXJnMykKICAgIHBfYXJnMyA9PSBpX2FyZwoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAzOiB0cnVlIikKfQoKIyBPQ0kgcHJvY2Vzcy5FbnYgZmllbGQKYWxsb3dfZW52KHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfZW52OiBwIGVudiA9IiwgcF9wcm9jZXNzLkVudikKICAgIHByaW50KCJhbGxvd19lbnY6IGkgZW52ID0iLCBpX3Byb2Nlc3MuRW52KQoKICAgIGV2ZXJ5IGlfdmFyIGluIGlfcHJvY2Vzcy5FbnYgewogICAgICAgIHByaW50KCJhbGxvd19lbnY6IGlfdmFyID0iLCBpX3ZhcikKICAgICAgICBhbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgfQoKICAgIHByaW50KCJhbGxvd19lbnY6IHRydWUiKQp9CgojIEFsbG93IGlucHV0IGVudiB2YXJpYWJsZXMgdGhhdCBhcmUgcHJlc2VudCBpbiB0aGUgcG9saWN5IGRhdGEgdG9vLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHBfdmFyID09IGlfdmFyCiAgICBwcmludCgiYWxsb3dfdmFyIDE6IHRydWUiKQp9CgojIE1hdGNoIGlucHV0IHdpdGggb25lIG9mIHRoZSBwb2xpY3kgdmFyaWFibGVzLCBhZnRlciBzdWJzdGl0dXRpbmcgJChzYW5kYm94LW5hbWUpLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHByaW50KCJhbGxvd192YXIgMjogcF92YXIgPSIsIHBfdmFyKQoKICAgIHBfdmFyX3NwbGl0IDo9IHNwbGl0KHBfdmFyLCAiPSIpCiAgICBjb3VudChwX3Zhcl9zcGxpdCkgPT0gMgoKICAgIHBfdmFyX3NwbGl0WzFdID09ICIkKHNhbmRib3gtbmFtZSkiCgogICAgaV92YXJfc3BsaXQgOj0gc3BsaXQoaV92YXIsICI9IikKICAgIGNvdW50KGlfdmFyX3NwbGl0KSA9PSAyCgogICAgaV92YXJfc3BsaXRbMF0gPT0gcF92YXJfc3BsaXRbMF0KICAgIHJlZ2V4Lm1hdGNoKHNfbmFtZSwgaV92YXJfc3BsaXRbMV0pCgogICAgcHJpbnQoImFsbG93X3ZhciAyOiB0cnVlIikKfQoKIyBBbGxvdyBpbnB1dCBlbnYgdmFyaWFibGVzIHRoYXQgbWF0Y2ggd2l0aCBhIHJlcXVlc3RfZGVmYXVsdHMgcmVnZXguCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHNvbWUgcF9yZWdleDEgaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5DcmVhdGVDb250YWluZXJSZXF1ZXN0LmFsbG93X2Vudl9yZWdleAogICAgcF9yZWdleDIgOj0gcmVwbGFjZShwX3JlZ2V4MSwgIiQoaXB2NF9hKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcHY0X2EpCiAgICBwX3JlZ2V4MyA6PSByZXBsYWNlKHBfcmVnZXgyLCAiJChpcF9wKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcF9wKQogICAgcF9yZWdleDQgOj0gcmVwbGFjZShwX3JlZ2V4MywgIiQoc3ZjX25hbWUpIiwgcG9saWN5X2RhdGEuY29tbW9uLnN2Y19uYW1lKQogICAgcF9yZWdleDUgOj0gcmVwbGFjZShwX3JlZ2V4NCwgIiQoZG5zX2xhYmVsKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5kbnNfbGFiZWwpCgogICAgcHJpbnQoImFsbG93X3ZhciAzOiBwX3JlZ2V4NSA9IiwgcF9yZWdleDUpCiAgICByZWdleC5tYXRjaChwX3JlZ2V4NSwgaV92YXIpCgogICAgcHJpbnQoImFsbG93X3ZhciAzOiB0cnVlIikKfQoKIyBBbGxvdyBmaWVsZFJlZiAiZmllbGRQYXRoOiBzdGF0dXMucG9kSVAiIHZhbHVlcy4KYWxsb3dfdmFyKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBpX3Zhciwgc19uYW1lLCBzX25hbWVzcGFjZSkgewogICAgbmFtZV92YWx1ZSA6PSBzcGxpdChpX3ZhciwgIj0iKQogICAgY291bnQobmFtZV92YWx1ZSkgPT0gMgogICAgaXNfaXAobmFtZV92YWx1ZVsxXSkKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIGFsbG93X3BvZF9pcF92YXIobmFtZV92YWx1ZVswXSwgcF92YXIpCgogICAgcHJpbnQoImFsbG93X3ZhciA0OiB0cnVlIikKfQoKIyBBbGxvdyBjb21tb24gZmllbGRSZWYgdmFyaWFibGVzLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBuYW1lX3ZhbHVlIDo9IHNwbGl0KGlfdmFyLCAiPSIpCiAgICBjb3VudChuYW1lX3ZhbHVlKSA9PSAyCgogICAgc29tZSBwX3ZhciBpbiBwX3Byb2Nlc3MuRW52CiAgICBwX25hbWVfdmFsdWUgOj0gc3BsaXQocF92YXIsICI9IikKICAgIGNvdW50KHBfbmFtZV92YWx1ZSkgPT0gMgoKICAgIHBfbmFtZV92YWx1ZVswXSA9PSBuYW1lX3ZhbHVlWzBdCgogICAgIyBUT0RPOiBzaG91bGQgdGhlc2UgYmUgaGFuZGxlZCBpbiBhIGRpZmZlcmVudCB3YXk/CiAgICBhbHdheXNfYWxsb3dlZCA6PSBbIiQoaG9zdC1uYW1lKSIsICIkKG5vZGUtbmFtZSkiLCAiJChwb2QtdWlkKSJdCiAgICBzb21lIGFsbG93ZWQgaW4gYWx3YXlzX2FsbG93ZWQKICAgIGNvbnRhaW5zKHBfbmFtZV92YWx1ZVsxXSwgYWxsb3dlZCkKCiAgICBwcmludCgiYWxsb3dfdmFyIDU6IHRydWUiKQp9CgojIEFsbG93IGZpZWxkUmVmICJmaWVsZFBhdGg6IHN0YXR1cy5ob3N0SVAiIHZhbHVlcy4KYWxsb3dfdmFyKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBpX3Zhciwgc19uYW1lLCBzX25hbWVzcGFjZSkgewogICAgbmFtZV92YWx1ZSA6PSBzcGxpdChpX3ZhciwgIj0iKQogICAgY291bnQobmFtZV92YWx1ZSkgPT0gMgogICAgaXNfaXAobmFtZV92YWx1ZVsxXSkKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIGFsbG93X2hvc3RfaXBfdmFyKG5hbWVfdmFsdWVbMF0sIHBfdmFyKQoKICAgIHByaW50KCJhbGxvd192YXIgNjogdHJ1ZSIpCn0KCiMgQWxsb3cgcmVzb3VyY2VGaWVsZFJlZiB2YWx1ZXMgKGUuZy4sICJsaW1pdHMuY3B1IikuCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIG5hbWVfdmFsdWUgOj0gc3BsaXQoaV92YXIsICI9IikKICAgIGNvdW50KG5hbWVfdmFsdWUpID09IDIKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHBfbmFtZV92YWx1ZSA6PSBzcGxpdChwX3ZhciwgIj0iKQogICAgY291bnQocF9uYW1lX3ZhbHVlKSA9PSAyCgogICAgcF9uYW1lX3ZhbHVlWzBdID09IG5hbWVfdmFsdWVbMF0KCiAgICAjIGEgdmFyaWFibGUgd2Ugc2hvdWxkIGJlIHZhbGlkYXRpbmcgdXNpbmcgYSByZWdleCBmcm9tIHNldHRpbmdzCiAgICBwX25hbWVfdmFsdWVbMV0gPT0gIiQodmFsaWRhdGUtZnJvbS1zZXR0aW5ncykiCgogICAgcmVnZXhfdmFsIDo9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuQ3JlYXRlQ29udGFpbmVyUmVxdWVzdC5hbGxvd19lbnZfcmVnZXhfbWFwW25hbWVfdmFsdWVbMF1dCgogICAgcHJpbnQoImFsbG93X3ZhciA3OiB2YWwgPSIsIG5hbWVfdmFsdWVbMV0pCiAgICBwcmludCgiYWxsb3dfdmFyIDc6IHJlZ2V4X3ZhbCA9IiwgcmVnZXhfdmFsKQoKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4X3ZhbCwgbmFtZV92YWx1ZVsxXSkKCiAgICBwcmludCgiYWxsb3dfdmFyIDc6IHRydWUiKQp9CgojIE1hdGNoIGlucHV0IHdpdGggb25lIG9mIHRoZSBwb2xpY3kgdmFyaWFibGVzLCBhZnRlciBzdWJzdGl0dXRpbmcgJChzYW5kYm94LW5hbWVzcGFjZSkuCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHNvbWUgcF92YXIgaW4gcF9wcm9jZXNzLkVudgogICAgcF92YXIyIDo9IHJlcGxhY2UocF92YXIsICIkKHNhbmRib3gtbmFtZXNwYWNlKSIsIHNfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd192YXIgODogcF92YXIyID0iLCBwX3ZhcjIpCiAgICBwX3ZhcjIgPT0gaV92YXIKCiAgICBwcmludCgiYWxsb3dfdmFyIDg6IHRydWUiKQp9CgphbGxvd19wb2RfaXBfdmFyKHZhcl9uYW1lLCBwX3ZhcikgewogICAgcHJpbnQoImFsbG93X3BvZF9pcF92YXI6IHZhcl9uYW1lID0iLCB2YXJfbmFtZSwgInBfdmFyID0iLCBwX3ZhcikKCiAgICBwX25hbWVfdmFsdWUgOj0gc3BsaXQocF92YXIsICI9IikKICAgIGNvdW50KHBfbmFtZV92YWx1ZSkgPT0gMgoKICAgIHBfbmFtZV92YWx1ZVswXSA9PSB2YXJfbmFtZQogICAgcF9uYW1lX3ZhbHVlWzFdID09ICIkKHBvZC1pcCkiCgogICAgcHJpbnQoImFsbG93X3BvZF9pcF92YXI6IHRydWUiKQp9CgphbGxvd19ob3N0X2lwX3Zhcih2YXJfbmFtZSwgcF92YXIpIHsKICAgIHByaW50KCJhbGxvd19ob3N0X2lwX3ZhcjogdmFyX25hbWUgPSIsIHZhcl9uYW1lLCAicF92YXIgPSIsIHBfdmFyKQoKICAgIHBfbmFtZV92YWx1ZSA6PSBzcGxpdChwX3ZhciwgIj0iKQogICAgY291bnQocF9uYW1lX3ZhbHVlKSA9PSAyCgogICAgcF9uYW1lX3ZhbHVlWzBdID09IHZhcl9uYW1lCiAgICBwX25hbWVfdmFsdWVbMV0gPT0gIiQoaG9zdC1pcCkiCgogICAgcHJpbnQoImFsbG93X2hvc3RfaXBfdmFyOiB0cnVlIikKfQoKaXNfaXAodmFsdWUpIHsKICAgIGJ5dGVzID0gc3BsaXQodmFsdWUsICIuIikKICAgIGNvdW50KGJ5dGVzKSA9PSA0CgogICAgaXNfaXBfZmlyc3RfYnl0ZShieXRlc1swXSkKICAgIGlzX2lwX290aGVyX2J5dGUoYnl0ZXNbMV0pCiAgICBpc19pcF9vdGhlcl9ieXRlKGJ5dGVzWzJdKQogICAgaXNfaXBfb3RoZXJfYnl0ZShieXRlc1szXSkKfQppc19pcF9maXJzdF9ieXRlKGNvbXBvbmVudCkgewogICAgbnVtYmVyID0gdG9fbnVtYmVyKGNvbXBvbmVudCkKICAgIG51bWJlciA+PSAxCiAgICBudW1iZXIgPD0gMjU1Cn0KaXNfaXBfb3RoZXJfYnl0ZShjb21wb25lbnQpIHsKICAgIG51bWJlciA9IHRvX251bWJlcihjb21wb25lbnQpCiAgICBudW1iZXIgPj0gMAogICAgbnVtYmVyIDw9IDI1NQp9CgojIE9DSSByb290LlBhdGgKYWxsb3dfcm9vdF9wYXRoKHBfb2NpLCBpX29jaSwgYnVuZGxlX2lkKSB7CiAgICBpX3BhdGggOj0gaV9vY2kuUm9vdC5QYXRoCiAgICBwX3BhdGgxIDo9IHBfb2NpLlJvb3QuUGF0aAogICAgcHJpbnQoImFsbG93X3Jvb3RfcGF0aDogaV9wYXRoID0iLCBpX3BhdGgsICJwX3BhdGgxID0iLCBwX3BhdGgxKQoKICAgIHBfcGF0aDIgOj0gcmVwbGFjZShwX3BhdGgxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfcm9vdF9wYXRoOiBwX3BhdGgyID0iLCBwX3BhdGgyKQoKICAgIHBfcGF0aDMgOj0gcmVwbGFjZShwX3BhdGgyLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X3Jvb3RfcGF0aDogcF9wYXRoMyA9IiwgcF9wYXRoMykKCiAgICBwX3BhdGgzID09IGlfcGF0aAoKICAgIHByaW50KCJhbGxvd19yb290X3BhdGg6IHRydWUiKQp9CgojIGRldmljZSBtb3VudHMKYWxsb3dfbW91bnQocF9vY2ksIGlfbW91bnQsIGlfc3RvcmFnZXMsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcHJpbnQoImFsbG93X21vdW50OiBpX21vdW50ID0iLCBpX21vdW50KQoKICAgIHNvbWUgcF9tb3VudCBpbiBwX29jaS5Nb3VudHMKICAgIHNvbWUgaV9zdG9yYWdlIGluIGlfc3RvcmFnZXMKCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IHBfbW91bnQgPSIsIHBfbW91bnQpCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IGlfc3RvcmFnZSA9IiwgaV9zdG9yYWdlKQoKICAgIGNoZWNrX21vdW50KHBfbW91bnQsIGlfbW91bnQsIGlfc3RvcmFnZSwgYnVuZGxlX2lkLCBzYW5kYm94X2lkKQoKICAgICMgVE9ETzogYXJlIHRoZXJlIGFueSBvdGhlciByZXF1aXJlZCBwb2xpY3kgY2hlY2tzIGZvciBtb3VudHMgLSBlLmcuLAogICAgIyAgICAgICBtdWx0aXBsZSBtb3VudHMgd2l0aCBzYW1lIHNvdXJjZSBvciBkZXN0aW5hdGlvbj8KCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IHRydWUiKQp9CgpjaGVja19tb3VudChwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcF9tb3VudCA9PSBpX21vdW50CiAgICBwcmludCgiY2hlY2tfbW91bnQgMTogdHJ1ZSIpCn0KY2hlY2tfbW91bnQocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHBfbW91bnQuZGVzdGluYXRpb24gPT0gaV9tb3VudC5kZXN0aW5hdGlvbgogICAgcF9tb3VudC50eXBlXyA9PSBpX21vdW50LnR5cGVfCiAgICBwX21vdW50Lm9wdGlvbnMgPT0gaV9tb3VudC5vcHRpb25zCgogICAgbW91bnRfc291cmNlX2FsbG93cyhwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkKCiAgICBwcmludCgiY2hlY2tfbW91bnQgMjogdHJ1ZSIpCn0KCm1vdW50X3NvdXJjZV9hbGxvd3MocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHJlZ2V4MSA6PSBwX21vdW50LnNvdXJjZQogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5tb3VudF9zb3VyY2VfY3BhdGgpCiAgICByZWdleDQgOj0gcmVwbGFjZShyZWdleDMsICIkKGJ1bmRsZS1pZCkiLCBidW5kbGVfaWQpCgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMTogcmVnZXg0ID0iLCByZWdleDQpCiAgICByZWdleC5tYXRjaChyZWdleDQsIGlfbW91bnQuc291cmNlKQoKICAgIHByaW50KCJtb3VudF9zb3VyY2VfYWxsb3dzIDE6IHRydWUiKQp9Cm1vdW50X3NvdXJjZV9hbGxvd3MocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHJlZ2V4MSA6PSBwX21vdW50LnNvdXJjZQogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5tb3VudF9zb3VyY2VfY3BhdGgpCiAgICByZWdleDQgOj0gcmVwbGFjZShyZWdleDMsICIkKHNhbmRib3gtaWQpIiwgc2FuZGJveF9pZCkKCiAgICBwcmludCgibW91bnRfc291cmNlX2FsbG93cyAyOiByZWdleDQgPSIsIHJlZ2V4NCkKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4NCwgaV9tb3VudC5zb3VyY2UpCgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMjogdHJ1ZSIpCn0KbW91bnRfc291cmNlX2FsbG93cyhwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogaV9tb3VudC5zb3VyY2UgPSIsIGlfbW91bnQuc291cmNlKQogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogaV9zdG9yYWdlLm1vdW50X3BvaW50ID0iLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCgogICAgaV9tb3VudC5zb3VyY2UgPT0gaV9zdG9yYWdlLm1vdW50X3BvaW50CgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogdHJ1ZSIpCn0KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBDcmVhdGUgY29udGFpbmVyIFN0b3JhZ2VzCgphbGxvd19zdG9yYWdlcyhwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHBfY291bnQgOj0gY291bnQocF9zdG9yYWdlcykKICAgIGlfY291bnQgOj0gY291bnQoaV9zdG9yYWdlcykKICAgIHByaW50KCJhbGxvd19zdG9yYWdlczogcF9jb3VudCA9IiwgcF9jb3VudCwgImlfY291bnQgPSIsIGlfY291bnQpCgogICAgcF9jb3VudCA9PSBpX2NvdW50CgogICAgIyBHZXQgdGhlIGNvbnRhaW5lciBpbWFnZSBsYXllciBJRHMgYW5kIHZlcml0eSByb290IGhhc2hlcywgZnJvbSB0aGUgIm92ZXJsYXlmcyIgc3RvcmFnZS4KICAgIHNvbWUgb3ZlcmxheV9zdG9yYWdlIGluIHBfc3RvcmFnZXMKICAgIG92ZXJsYXlfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIHByaW50KCJhbGxvd19zdG9yYWdlczogb3ZlcmxheV9zdG9yYWdlID0iLCBvdmVybGF5X3N0b3JhZ2UpCiAgICBjb3VudChvdmVybGF5X3N0b3JhZ2Uub3B0aW9ucykgPT0gMgoKICAgIGxheWVyX2lkcyA6PSBzcGxpdChvdmVybGF5X3N0b3JhZ2Uub3B0aW9uc1swXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiBsYXllcl9pZHMgPSIsIGxheWVyX2lkcykKCiAgICByb290X2hhc2hlcyA6PSBzcGxpdChvdmVybGF5X3N0b3JhZ2Uub3B0aW9uc1sxXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiByb290X2hhc2hlcyA9Iiwgcm9vdF9oYXNoZXMpCgogICAgZXZlcnkgaV9zdG9yYWdlIGluIGlfc3RvcmFnZXMgewogICAgICAgIGFsbG93X3N0b3JhZ2UocF9zdG9yYWdlcywgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpCiAgICB9CgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiB0cnVlIikKfQoKYWxsb3dfc3RvcmFnZShwX3N0b3JhZ2VzLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgc29tZSBwX3N0b3JhZ2UgaW4gcF9zdG9yYWdlcwoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiBwX3N0b3JhZ2UgPSIsIHBfc3RvcmFnZSkKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiBpX3N0b3JhZ2UgPSIsIGlfc3RvcmFnZSkKCiAgICBwX3N0b3JhZ2UuZHJpdmVyICAgICAgICAgICA9PSBpX3N0b3JhZ2UuZHJpdmVyCiAgICBwX3N0b3JhZ2UuZHJpdmVyX29wdGlvbnMgICA9PSBpX3N0b3JhZ2UuZHJpdmVyX29wdGlvbnMKICAgIHBfc3RvcmFnZS5mc19ncm91cCAgICAgICAgID09IGlfc3RvcmFnZS5mc19ncm91cAogICAgcF9zdG9yYWdlLmZzdHlwZSAgICAgICAgICAgPT0gaV9zdG9yYWdlLmZzdHlwZQoKICAgIGFsbG93X3N0b3JhZ2Vfc291cmNlKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKQogICAgYWxsb3dfc3RvcmFnZV9vcHRpb25zKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKQogICAgYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKQoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiB0cnVlIikKfQoKYWxsb3dfc3RvcmFnZV9zb3VyY2UocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX3NvdXJjZSAxOiBzdGFydCIpCgogICAgcF9zdG9yYWdlLnNvdXJjZSA9PSBpX3N0b3JhZ2Uuc291cmNlCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDE6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX3NvdXJjZShwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDI6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCgogICAgIyBEREREOkJCOkRELkY6IERvbWFpbjpCdXM6RGV2aWNlLkZ1bmN0aW9uCiAgICAjIGh0dHBzOi8vd3d3Lmtlcm5lbC5vcmcvZG9jL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtYnVzLXBjaQogICAgcmVnZXgubWF0Y2goYF5bYS1mMC05XXs0fTpbYS1mMC05XXsyfTpbYS1mMC05XXsyfVwuW2EtZjAtOV0kYCwgaV9zdG9yYWdlLnNvdXJjZSkKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9zb3VyY2UgMjogdHJ1ZSIpCn0KCmFsbG93X3N0b3JhZ2Vfc291cmNlKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKSB7CiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9zb3VyY2UgMzogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIGlfc3RvcmFnZS5zb3VyY2UgPT0gIm5vbmUiCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDM6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX3NvdXJjZShwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDQ6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJzbWIiCgogICAgIyBQYXR0ZXJuOiAvLzxzdG9yYWdlLWFjY291bnQtbmFtZT4uZmlsZS5jb3JlLndpbmRvd3MubmV0LzxrOHMtUFZDLW5hbWU+CiAgICAjIFN0b3JhZ2UgYWNjb3VudCBuYW1lOiBodHRwczovL2xlYXJuLm1pY3Jvc29mdC5jb20vZW4tdXMvYXp1cmUvc3RvcmFnZS9jb21tb24vc3RvcmFnZS1hY2NvdW50LW92ZXJ2aWV3I3N0b3JhZ2UtYWNjb3VudC1uYW1lCiAgICAjIEs4cyBQVkMgbmFtZTogaHR0cHM6Ly9rdWJlcm5ldGVzLmlvL2RvY3MvY29uY2VwdHMvb3ZlcnZpZXcvd29ya2luZy13aXRoLW9iamVjdHMvbmFtZXMvI2Rucy1zdWJkb21haW4tbmFtZXMKICAgIHJlZ2V4Lm1hdGNoKGBeXC9cLyhbYS16MC05XXszLDI0fSlcLmZpbGVcLmNvcmVcLndpbmRvd3NcLm5ldFwvW2EtejAtOV0oW2EtejAtOS4tXXswLDI1MX1bYS16MC05XSk/JGAsIGlfc3RvcmFnZS5zb3VyY2UpCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDQ6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMTogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgIT0gIm92ZXJsYXlmcyIKICAgIHBfc3RvcmFnZS5vcHRpb25zID09IGlfc3RvcmFnZS5vcHRpb25zCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAxOiB0cnVlIikKfQphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIGNvdW50KHBfc3RvcmFnZS5vcHRpb25zKSA9PSAyCgogICAgcG9saWN5X2lkcyA6PSBzcGxpdChwX3N0b3JhZ2Uub3B0aW9uc1swXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBwb2xpY3lfaWRzID0iLCBwb2xpY3lfaWRzKQogICAgcG9saWN5X2lkcyA9PSBsYXllcl9pZHMKCiAgICBwb2xpY3lfaGFzaGVzIDo9IHNwbGl0KHBfc3RvcmFnZS5vcHRpb25zWzFdLCAiOiIpCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IHBvbGljeV9oYXNoZXMgPSIsIHBvbGljeV9oYXNoZXMpCgogICAgcF9jb3VudCA6PSBjb3VudChwb2xpY3lfaWRzKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBwX2NvdW50ID0iLCBwX2NvdW50KQogICAgcF9jb3VudCA+PSAxCiAgICBwX2NvdW50ID09IGNvdW50KHBvbGljeV9oYXNoZXMpCgogICAgaV9jb3VudCA6PSBjb3VudChpX3N0b3JhZ2Uub3B0aW9ucykKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogaV9jb3VudCA9IiwgaV9jb3VudCkKICAgIGlfY291bnQgPT0gcF9jb3VudCArIDMKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zWzBdID0iLCBpX3N0b3JhZ2Uub3B0aW9uc1swXSkKICAgIGlfc3RvcmFnZS5vcHRpb25zWzBdID09ICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQubGF5ZXItc3JjLXByZWZpeD0vdmFyL2xpYi9jb250YWluZXJkL2lvLmNvbnRhaW5lcmQuc25hcHNob3R0ZXIudjEudGFyZGV2L2xheWVycyIKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zW2lfY291bnQgLSAyXSA9IiwgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDJdKQogICAgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDJdID09ICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQub3ZlcmxheS1ydyIKCiAgICBsb3dlcmRpciA6PSBjb25jYXQoIj0iLCBbImxvd2VyZGlyIiwgcF9zdG9yYWdlLm9wdGlvbnNbMF1dKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBsb3dlcmRpciA9IiwgbG93ZXJkaXIpCgogICAgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDFdID09IGxvd2VyZGlyCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zW2lfY291bnQgLSAxXSA9IiwgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDFdKQoKICAgIGV2ZXJ5IGksIHBvbGljeV9pZCBpbiBwb2xpY3lfaWRzIHsKICAgICAgICBhbGxvd19vdmVybGF5X2xheWVyKHBvbGljeV9pZCwgcG9saWN5X2hhc2hlc1tpXSwgaV9zdG9yYWdlLm9wdGlvbnNbaSArIDFdKQogICAgfQoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogdHJ1ZSIpCn0KYWxsb3dfc3RvcmFnZV9vcHRpb25zKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKSB7CiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDM6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCiAgICBjb3VudChwX3N0b3JhZ2Uub3B0aW9ucykgPT0gMQoKICAgIHN0YXJ0c3dpdGgocF9zdG9yYWdlLm9wdGlvbnNbMF0sICIkKGhhc2giKQogICAgaGFzaF9zdWZmaXggOj0gdHJpbV9sZWZ0KHBfc3RvcmFnZS5vcHRpb25zWzBdLCAiJChoYXNoIikKCiAgICBlbmRzd2l0aChoYXNoX3N1ZmZpeCwgIikiKQogICAgaGFzaF9pbmRleCA6PSB0cmltX3JpZ2h0KGhhc2hfc3VmZml4LCAiKSIpCiAgICBpIDo9IHRvX251bWJlcihoYXNoX2luZGV4KQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAzOiBpID0iLCBpKQoKICAgIGhhc2hfb3B0aW9uIDo9IGNvbmNhdCgiPSIsIFsiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LnJvb3QtaGFzaCIsIHJvb3RfaGFzaGVzW2ldXSkKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMzogaGFzaF9vcHRpb24gPSIsIGhhc2hfb3B0aW9uKQoKICAgIGNvdW50KGlfc3RvcmFnZS5vcHRpb25zKSA9PSA0CiAgICBpX3N0b3JhZ2Uub3B0aW9uc1swXSA9PSAicm8iCiAgICBpX3N0b3JhZ2Uub3B0aW9uc1sxXSA9PSAiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmJsb2NrX2RldmljZT1maWxlIgogICAgaV9zdG9yYWdlLm9wdGlvbnNbMl0gPT0gImlvLmthdGFjb250YWluZXJzLmZzLW9wdC5pcy1sYXllciIKICAgIGlfc3RvcmFnZS5vcHRpb25zWzNdID09IGhhc2hfb3B0aW9uCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAzOiB0cnVlIikKfQphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgNDogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gInNtYiIKICAgIHBfb3B0c19jb3VudCA6PSBjb3VudChwX3N0b3JhZ2Uub3B0aW9ucykKICAgIGlfb3B0c19jb3VudCA6PSBjb3VudChpX3N0b3JhZ2Uub3B0aW9ucykKICAgIGlfb3B0c19jb3VudCA9PSBwX29wdHNfY291bnQgKyAyCgogICAgaV9vcHRfbWF0Y2hlcyA6PSBbaSB8IGkgOj0gaWR4OyBpZHggPCBwX29wdHNfY291bnQ7IHBfc3RvcmFnZS5vcHRpb25zW2lkeF0gPT0gaV9zdG9yYWdlLm9wdGlvbnNbaWR4XV0KICAgIGNvdW50KGlfb3B0X21hdGNoZXMpID09IHBfb3B0c19jb3VudAoKICAgIHN0YXJ0c3dpdGgoaV9zdG9yYWdlLm9wdGlvbnNbaV9vcHRzX2NvdW50LTJdLCAiYWRkcj0iKQogICAgY3JlZHMgPSBzcGxpdChpX3N0b3JhZ2Uub3B0aW9uc1tpX29wdHNfY291bnQtMV0sICIsIikKICAgIGNvdW50KGNyZWRzKSA9PSAyCiAgICBzdGFydHN3aXRoKGNyZWRzWzBdLCAidXNlcm5hbWU9IikKICAgIHN0YXJ0c3dpdGgoY3JlZHNbMV0sICJwYXNzd29yZD0iKQogICAgCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDQ6IHRydWUiKQp9CgphbGxvd19vdmVybGF5X2xheWVyKHBvbGljeV9pZCwgcG9saWN5X2hhc2gsIGlfb3B0aW9uKSB7CiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogcG9saWN5X2lkID0iLCBwb2xpY3lfaWQsICJwb2xpY3lfaGFzaCA9IiwgcG9saWN5X2hhc2gpCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogaV9vcHRpb24gPSIsIGlfb3B0aW9uKQoKICAgIHN0YXJ0c3dpdGgoaV9vcHRpb24sICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQubGF5ZXI9IikKICAgIGlfdmFsdWUgOj0gcmVwbGFjZShpX29wdGlvbiwgImlvLmthdGFjb250YWluZXJzLmZzLW9wdC5sYXllcj0iLCAiIikKICAgIGlfdmFsdWVfZGVjb2RlZCA6PSBiYXNlNjQuZGVjb2RlKGlfdmFsdWUpCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogaV92YWx1ZV9kZWNvZGVkID0iLCBpX3ZhbHVlX2RlY29kZWQpCgogICAgcG9saWN5X3N1ZmZpeCA6PSBjb25jYXQoIj0iLCBbInRhcixybyxpby5rYXRhY29udGFpbmVycy5mcy1vcHQuYmxvY2tfZGV2aWNlPWZpbGUsaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmlzLWxheWVyLGlvLmthdGFjb250YWluZXJzLmZzLW9wdC5yb290LWhhc2giLCBwb2xpY3lfaGFzaF0pCiAgICBwX3ZhbHVlIDo9IGNvbmNhdCgiLCIsIFtwb2xpY3lfaWQsIHBvbGljeV9zdWZmaXhdKQogICAgcHJpbnQoImFsbG93X292ZXJsYXlfbGF5ZXI6IHBfdmFsdWUgPSIsIHBfdmFsdWUpCgogICAgcF92YWx1ZSA9PSBpX3ZhbHVlX2RlY29kZWQKCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogdHJ1ZSIpCn0KCmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAidGFyIgoKICAgIHN0YXJ0c3dpdGgocF9zdG9yYWdlLm1vdW50X3BvaW50LCAiJChsYXllciIpCiAgICBtb3VudF9zdWZmaXggOj0gdHJpbV9sZWZ0KHBfc3RvcmFnZS5tb3VudF9wb2ludCwgIiQobGF5ZXIiKQoKICAgIGVuZHN3aXRoKG1vdW50X3N1ZmZpeCwgIikiKQogICAgbGF5ZXJfaW5kZXggOj0gdHJpbV9yaWdodChtb3VudF9zdWZmaXgsICIpIikKICAgIGkgOj0gdG9fbnVtYmVyKGxheWVyX2luZGV4KQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDE6IGkgPSIsIGkpCgogICAgbGF5ZXJfaWQgOj0gbGF5ZXJfaWRzW2ldCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMTogbGF5ZXJfaWQgPSIsIGxheWVyX2lkKQoKICAgIHBfbW91bnQgOj0gY29uY2F0KCIvIiwgWyIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L2xheWVycyIsIGxheWVyX2lkXSkKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCAxOiBwX21vdW50ID0iLCBwX21vdW50KQoKICAgIHBfbW91bnQgPT0gaV9zdG9yYWdlLm1vdW50X3BvaW50CgogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDE6IHRydWUiKQp9CmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAiZnVzZTMua2F0YS1vdmVybGF5IgoKICAgIG1vdW50MSA6PSByZXBsYWNlKHBfc3RvcmFnZS5tb3VudF9wb2ludCwgIiQoY3BhdGgpIiwgcG9saWN5X2RhdGEuY29tbW9uLmNwYXRoKQogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDI6IG1vdW50MiA9IiwgbW91bnQyKQoKICAgIG1vdW50MiA9PSBpX3N0b3JhZ2UubW91bnRfcG9pbnQKCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMjogdHJ1ZSIpCn0KYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKSB7CiAgICBwX3N0b3JhZ2UuZnN0eXBlID09ICJsb2NhbCIKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQyID0iLCBtb3VudDIpCgogICAgbW91bnQzIDo9IHJlcGxhY2UobW91bnQyLCAiJChzYW5kYm94LWlkKSIsIHNhbmRib3hfaWQpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQzID0iLCBtb3VudDMpCgogICAgcmVnZXgubWF0Y2gobW91bnQzLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCgogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDM6IHRydWUiKQp9CmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAiYmluZCIKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNDogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNDogbW91bnQyID0iLCBtb3VudDIpCgogICAgbW91bnQzIDo9IHJlcGxhY2UobW91bnQyLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDQ6IG1vdW50MyA9IiwgbW91bnQzKQoKICAgIHJlZ2V4Lm1hdGNoKG1vdW50MywgaV9zdG9yYWdlLm1vdW50X3BvaW50KQoKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA0OiB0cnVlIikKfQphbGxvd19tb3VudF9wb2ludChwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgYnVuZGxlX2lkLCBzYW5kYm94X2lkLCBsYXllcl9pZHMpIHsKICAgIHBfc3RvcmFnZS5mc3R5cGUgPT0gInRtcGZzIgoKICAgIG1vdW50MSA6PSBwX3N0b3JhZ2UubW91bnRfcG9pbnQKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA1OiBtb3VudDEgPSIsIG1vdW50MSkKCiAgICByZWdleC5tYXRjaChtb3VudDEsIGlfc3RvcmFnZS5tb3VudF9wb2ludCkKCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNTogdHJ1ZSIpCn0KYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKSB7CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogaV9zdG9yYWdlLm1vdW50X3BvaW50ID0iLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCiAgICBhbGxvd19kaXJlY3Rfdm9sX2RyaXZlcihwX3N0b3JhZ2UsIGlfc3RvcmFnZSkKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChzcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQyID0iLCBtb3VudDIpCgogICAgZGlyZWN0X3ZvbF9wYXRoIDo9IGlfc3RvcmFnZS5zb3VyY2UKICAgIG1vdW50MyA6PSByZXBsYWNlKG1vdW50MiwgIiQoYjY0LWRpcmVjdC12b2wtcGF0aCkiLCBiYXNlNjR1cmwuZW5jb2RlKGRpcmVjdF92b2xfcGF0aCkpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQzID0iLCBtb3VudDMpCgogICAgbW91bnQzID09IGlfc3RvcmFnZS5tb3VudF9wb2ludAoKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA2OiB0cnVlIikKfQoKYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIocF9zdG9yYWdlLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19kaXJlY3Rfdm9sX2RyaXZlciAxOiBzdGFydCIpCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCiAgICBwcmludCgiYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIgMTogdHJ1ZSIpCn0KYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIocF9zdG9yYWdlLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19kaXJlY3Rfdm9sX2RyaXZlciAyOiBzdGFydCIpCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJzbWIiCiAgICBwcmludCgiYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIgMjogdHJ1ZSIpCn0KCiMgRXhlY1Byb2Nlc3NSZXF1ZXN0LnByb2Nlc3MuQ2FwYWJpbGl0aWVzCmFsbG93X2V4ZWNfY2FwcyhpX2NhcHMpIHsKICAgIG5vdCBpX2NhcHMuQW1iaWVudAogICAgbm90IGlfY2Fwcy5Cb3VuZGluZwogICAgbm90IGlfY2Fwcy5FZmZlY3RpdmUKICAgIG5vdCBpX2NhcHMuSW5oZXJpdGFibGUKICAgIG5vdCBpX2NhcHMuUGVybWl0dGVkCn0KCiMgT0NJLlByb2Nlc3MuQ2FwYWJpbGl0aWVzCmFsbG93X2NhcHMocF9jYXBzLCBpX2NhcHMpIHsKICAgIHByaW50KCJhbGxvd19jYXBzOiBwb2xpY3kgQW1iaWVudCA9IiwgcF9jYXBzLkFtYmllbnQpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgQW1iaWVudCA9IiwgaV9jYXBzLkFtYmllbnQpCiAgICBtYXRjaF9jYXBzKHBfY2Fwcy5BbWJpZW50LCBpX2NhcHMuQW1iaWVudCkKCiAgICBwcmludCgiYWxsb3dfY2FwczogcG9saWN5IEJvdW5kaW5nID0iLCBwX2NhcHMuQm91bmRpbmcpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgQm91bmRpbmcgPSIsIGlfY2Fwcy5Cb3VuZGluZykKICAgIG1hdGNoX2NhcHMocF9jYXBzLkJvdW5kaW5nLCBpX2NhcHMuQm91bmRpbmcpCgogICAgcHJpbnQoImFsbG93X2NhcHM6IHBvbGljeSBFZmZlY3RpdmUgPSIsIHBfY2Fwcy5FZmZlY3RpdmUpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgRWZmZWN0aXZlID0iLCBpX2NhcHMuRWZmZWN0aXZlKQogICAgbWF0Y2hfY2FwcyhwX2NhcHMuRWZmZWN0aXZlLCBpX2NhcHMuRWZmZWN0aXZlKQoKICAgIHByaW50KCJhbGxvd19jYXBzOiBwb2xpY3kgSW5oZXJpdGFibGUgPSIsIHBfY2Fwcy5Jbmhlcml0YWJsZSkKICAgIHByaW50KCJhbGxvd19jYXBzOiBpbnB1dCBJbmhlcml0YWJsZSA9IiwgaV9jYXBzLkluaGVyaXRhYmxlKQogICAgbWF0Y2hfY2FwcyhwX2NhcHMuSW5oZXJpdGFibGUsIGlfY2Fwcy5Jbmhlcml0YWJsZSkKCiAgICBwcmludCgiYWxsb3dfY2FwczogcG9saWN5IFBlcm1pdHRlZCA9IiwgcF9jYXBzLlBlcm1pdHRlZCkKICAgIHByaW50KCJhbGxvd19jYXBzOiBpbnB1dCBQZXJtaXR0ZWQgPSIsIGlfY2Fwcy5QZXJtaXR0ZWQpCiAgICBtYXRjaF9jYXBzKHBfY2Fwcy5QZXJtaXR0ZWQsIGlfY2Fwcy5QZXJtaXR0ZWQpCn0KCm1hdGNoX2NhcHMocF9jYXBzLCBpX2NhcHMpIHsKICAgIHByaW50KCJtYXRjaF9jYXBzIDE6IHN0YXJ0IikKCiAgICBwX2NhcHMgPT0gaV9jYXBzCgogICAgcHJpbnQoIm1hdGNoX2NhcHMgMTogdHJ1ZSIpCn0KbWF0Y2hfY2FwcyhwX2NhcHMsIGlfY2FwcykgewogICAgcHJpbnQoIm1hdGNoX2NhcHMgMjogc3RhcnQiKQoKICAgIGNvdW50KHBfY2FwcykgPT0gMQogICAgcF9jYXBzWzBdID09ICIkKGRlZmF1bHRfY2FwcykiCgogICAgcHJpbnQoIm1hdGNoX2NhcHMgMjogZGVmYXVsdF9jYXBzID0iLCBwb2xpY3lfZGF0YS5jb21tb24uZGVmYXVsdF9jYXBzKQogICAgcG9saWN5X2RhdGEuY29tbW9uLmRlZmF1bHRfY2FwcyA9PSBpX2NhcHMKCiAgICBwcmludCgibWF0Y2hfY2FwcyAyOiB0cnVlIikKfQptYXRjaF9jYXBzKHBfY2FwcywgaV9jYXBzKSB7CiAgICBwcmludCgibWF0Y2hfY2FwcyAzOiBzdGFydCIpCgogICAgY291bnQocF9jYXBzKSA9PSAxCiAgICBwX2NhcHNbMF0gPT0gIiQocHJpdmlsZWdlZF9jYXBzKSIKCiAgICBwcmludCgibWF0Y2hfY2FwcyAzOiBwcml2aWxlZ2VkX2NhcHMgPSIsIHBvbGljeV9kYXRhLmNvbW1vbi5wcml2aWxlZ2VkX2NhcHMpCiAgICBwb2xpY3lfZGF0YS5jb21tb24ucHJpdmlsZWdlZF9jYXBzID09IGlfY2FwcwoKICAgIHByaW50KCJtYXRjaF9jYXBzIDM6IHRydWUiKQp9CgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgpjaGVja19kaXJlY3RvcnlfdHJhdmVyc2FsKGlfcGF0aCkgewogICAgbm90IHJlZ2V4Lm1hdGNoKCIoXnwvKS4uKCR8LykiLCBpX3BhdGgpCn0KCmNoZWNrX3N5bWxpbmtfc291cmNlKGlfc3JjKSB7CiAgICBpX3NyYyA9PSAiIgogICAgcHJpbnQoImNoZWNrX3N5bWxpbmtfc291cmNlIDE6IHRydWUiKQp9CmNoZWNrX3N5bWxpbmtfc291cmNlKGlfc3JjKSB7CiAgICBpX3NyYyAhPSAiIgogICAgcHJpbnQoImNoZWNrX3N5bWxpbmtfc291cmNlIDI6IGlfc3JjID0iLCBpX3NyYykKCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24uc19zb3VyY2UxLCBpX3NyYykKCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMjogdHJ1ZSIpCn0KY2hlY2tfc3ltbGlua19zb3VyY2UoaV9zcmMpIHsKICAgIGlfc3JjICE9ICIiCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMzogaV9zcmMgPSIsIGlfc3JjKQoKICAgIHJlZ2V4Lm1hdGNoKHBvbGljeV9kYXRhLmNvbW1vbi5zX3NvdXJjZTIsIGlfc3JjKQogICAgY2hlY2tfZGlyZWN0b3J5X3RyYXZlcnNhbChpX3NyYykKCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMzogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfc3RvcmFnZXMoaV9zdG9yYWdlcykgewogICAgcHJpbnQoImFsbG93X3NhbmRib3hfc3RvcmFnZXM6IGlfc3RvcmFnZXMgPSIsIGlfc3RvcmFnZXMpCgogICAgcF9zdG9yYWdlcyA6PSBwb2xpY3lfZGF0YS5zYW5kYm94LnN0b3JhZ2VzCiAgICBldmVyeSBpX3N0b3JhZ2UgaW4gaV9zdG9yYWdlcyB7CiAgICAgICAgYWxsb3dfc2FuZGJveF9zdG9yYWdlKHBfc3RvcmFnZXMsIGlfc3RvcmFnZSkKICAgIH0KCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9zdG9yYWdlczogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfc3RvcmFnZShwX3N0b3JhZ2VzLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IGlfc3RvcmFnZSA9IiwgaV9zdG9yYWdlKQoKICAgIHNvbWUgcF9zdG9yYWdlIGluIHBfc3RvcmFnZXMKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IHBfc3RvcmFnZSA9IiwgcF9zdG9yYWdlKQogICAgaV9zdG9yYWdlID09IHBfc3RvcmFnZQoKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IHRydWUiKQp9CgpDb3B5RmlsZVJlcXVlc3QgewogICAgcHJpbnQoIkNvcHlGaWxlUmVxdWVzdDogaW5wdXQucGF0aCA9IiwgaW5wdXQucGF0aCkKCiAgICBjaGVja19zeW1saW5rX3NvdXJjZShpbnB1dC5zeW1saW5rX3NyYykKICAgIGNoZWNrX2RpcmVjdG9yeV90cmF2ZXJzYWwoaW5wdXQucGF0aCkKCiAgICBzb21lIHJlZ2V4MSBpbiBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLkNvcHlGaWxlUmVxdWVzdAogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5jcGF0aCkKICAgIHJlZ2V4NCA6PSByZXBsYWNlKHJlZ2V4MywgIiQoYnVuZGxlLWlkKSIsIEJVTkRMRV9JRCkKICAgIHByaW50KCJDb3B5RmlsZVJlcXVlc3Q6IHJlZ2V4NCA9IiwgcmVnZXg0KQoKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4NCwgaW5wdXQucGF0aCkKCiAgICBwcmludCgiQ29weUZpbGVSZXF1ZXN0OiB0cnVlIikKfQoKQ3JlYXRlU2FuZGJveFJlcXVlc3QgewogICAgcHJpbnQoIkNyZWF0ZVNhbmRib3hSZXF1ZXN0OiBpbnB1dC5ndWVzdF9ob29rX3BhdGggPSIsIGlucHV0Lmd1ZXN0X2hvb2tfcGF0aCkKICAgIGNvdW50KGlucHV0Lmd1ZXN0X2hvb2tfcGF0aCkgPT0gMAoKICAgIHByaW50KCJDcmVhdGVTYW5kYm94UmVxdWVzdDogaW5wdXQua2VybmVsX21vZHVsZXMgPSIsIGlucHV0Lmtlcm5lbF9tb2R1bGVzKQogICAgY291bnQoaW5wdXQua2VybmVsX21vZHVsZXMpID09IDAKCiAgICBpX3BpZG5zIDo9IGlucHV0LnNhbmRib3hfcGlkbnMKICAgIHByaW50KCJDcmVhdGVTYW5kYm94UmVxdWVzdDogaV9waWRucyA9IiwgaV9waWRucykKICAgIGlfcGlkbnMgPT0gZmFsc2UKICAgIGFsbG93X3NhbmRib3hfc3RvcmFnZXMoaW5wdXQuc3RvcmFnZXMpCn0KCmFsbG93X2V4ZWMocF9jb250YWluZXIsIGlfcHJvY2VzcykgewogICAgcHJpbnQoImFsbG93X2V4ZWM6IHN0YXJ0IikKCiAgICBwX29jaSA9IHBfY29udGFpbmVyLk9DSQogICAgcF9zX25hbWUgPSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc19uYW1lc3BhY2UgPSBnZXRfc3RhdGVfdmFsKCJuYW1lc3BhY2UiKQogICAgYWxsb3dfcHJvYmVfcHJvY2VzcyhwX29jaS5Qcm9jZXNzLCBpX3Byb2Nlc3MsIHBfc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfZXhlYzogdHJ1ZSIpCn0KCmFsbG93X2ludGVyYWN0aXZlX2V4ZWMocF9jb250YWluZXIsIGlfcHJvY2VzcykgewogICAgcHJpbnQoImFsbG93X2ludGVyYWN0aXZlX2V4ZWM6IHN0YXJ0IikKCiAgICBwX29jaSA9IHBfY29udGFpbmVyLk9DSQogICAgcF9zX25hbWUgPSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc19uYW1lc3BhY2UgPSBnZXRfc3RhdGVfdmFsKCJuYW1lc3BhY2UiKQogICAgYWxsb3dfaW50ZXJhY3RpdmVfcHJvY2VzcyhwX29jaS5Qcm9jZXNzLCBpX3Byb2Nlc3MsIHBfc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfaW50ZXJhY3RpdmVfZXhlYzogdHJ1ZSIpCn0KCiMgVE9ETzogc2hvdWxkIG90aGVyIEV4ZWNQcm9jZXNzUmVxdWVzdCBpbnB1dCBkYXRhIGZpZWxkcyBiZSB2YWxpZGF0ZWQgYXMgd2VsbD8KRXhlY1Byb2Nlc3NSZXF1ZXN0IHsKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMTogaW5wdXQgPSIsIGlucHV0KQoKICAgIHNvbWUgcF9jb21tYW5kIGluIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuRXhlY1Byb2Nlc3NSZXF1ZXN0LmFsbG93ZWRfY29tbWFuZHMKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMTogcF9jb21tYW5kID0iLCBwX2NvbW1hbmQpCiAgICBwX2NvbW1hbmQgPT0gaW5wdXQucHJvY2Vzcy5BcmdzCgogICAgIyBUT0RPOiBtYXRjaCBwX2NvbnRhaW5lcidzIElEIHdpdGggdGhlIGlucHV0IGNvbnRhaW5lcl9pZC4KICAgIHNvbWUgcF9jb250YWluZXIgaW4gcG9saWN5X2RhdGEuY29udGFpbmVycwogICAgYWxsb3dfaW50ZXJhY3RpdmVfZXhlYyhwX2NvbnRhaW5lciwgaW5wdXQucHJvY2VzcykKCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDE6IHRydWUiKQp9CkV4ZWNQcm9jZXNzUmVxdWVzdCB7CiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDI6IGlucHV0ID0iLCBpbnB1dCkKCiAgICAjIFRPRE86IG1hdGNoIGlucHV0IGNvbnRhaW5lciBJRCB3aXRoIGl0cyBjb3JyZXNwb25kaW5nIGNvbnRhaW5lci5leGVjX2NvbW1hbmRzLgogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBzb21lIHBfY29tbWFuZCBpbiBwX2NvbnRhaW5lci5leGVjX2NvbW1hbmRzCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDI6IHBfY29tbWFuZCA9IiwgcF9jb21tYW5kKQoKICAgICMgVE9ETzogc2hvdWxkIG90aGVyIGlucHV0IGRhdGEgZmllbGRzIGJlIHZhbGlkYXRlZCBhcyB3ZWxsPwogICAgcF9jb21tYW5kID09IGlucHV0LnByb2Nlc3MuQXJncwoKICAgIGFsbG93X2V4ZWMocF9jb250YWluZXIsIGlucHV0LnByb2Nlc3MpCgogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAyOiB0cnVlIikKfQpFeGVjUHJvY2Vzc1JlcXVlc3QgewogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAzOiBpbnB1dCA9IiwgaW5wdXQpCgogICAgaV9jb21tYW5kID0gY29uY2F0KCIgIiwgaW5wdXQucHJvY2Vzcy5BcmdzKQogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAzOiBpX2NvbW1hbmQgPSIsIGlfY29tbWFuZCkKCiAgICBzb21lIHBfcmVnZXggaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5FeGVjUHJvY2Vzc1JlcXVlc3QucmVnZXgKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMzogcF9yZWdleCA9IiwgcF9yZWdleCkKCiAgICByZWdleC5tYXRjaChwX3JlZ2V4LCBpX2NvbW1hbmQpCgogICAgIyBUT0RPOiBtYXRjaCBwX2NvbnRhaW5lcidzIElEIHdpdGggdGhlIGlucHV0IGNvbnRhaW5lcl9pZC4KICAgIHNvbWUgcF9jb250YWluZXIgaW4gcG9saWN5X2RhdGEuY29udGFpbmVycwogICAgYWxsb3dfaW50ZXJhY3RpdmVfZXhlYyhwX2NvbnRhaW5lciwgaW5wdXQucHJvY2VzcykKCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDM6IHRydWUiKQp9CgpVcGRhdGVSb3V0ZXNSZXF1ZXN0IHsKICAgIHByaW50KCJVcGRhdGVSb3V0ZXNSZXF1ZXN0OiBpbnB1dCA9IiwgaW5wdXQpCiAgICBwcmludCgiVXBkYXRlUm91dGVzUmVxdWVzdDogcG9saWN5ID0iLCBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLlVwZGF0ZVJvdXRlc1JlcXVlc3QpCgogICAgaV9yb3V0ZXMgOj0gaW5wdXQucm91dGVzLlJvdXRlcwogICAgcF9zb3VyY2VfcmVnZXggPSBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLlVwZGF0ZVJvdXRlc1JlcXVlc3QuZm9yYmlkZGVuX3NvdXJjZV9yZWdleAogICAgcF9uYW1lcyA9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuVXBkYXRlUm91dGVzUmVxdWVzdC5mb3JiaWRkZW5fZGV2aWNlX25hbWVzCgogICAgZXZlcnkgaV9yb3V0ZSBpbiBpX3JvdXRlcyB7CiAgICAgICAgcHJpbnQoImlfcm91dGUuc291cmNlID0iLCBpX3JvdXRlLnNvdXJjZSkKICAgICAgICBldmVyeSBwX3JlZ2V4IGluIHBfc291cmNlX3JlZ2V4IHsKICAgICAgICAgICAgcHJpbnQoInBfcmVnZXggPSIsIHBfcmVnZXgpCiAgICAgICAgICAgIG5vdCByZWdleC5tYXRjaChwX3JlZ2V4LCBpX3JvdXRlLnNvdXJjZSkKICAgICAgICB9CgogICAgICAgIHByaW50KCJpX3JvdXRlLmRldmljZSA9IiwgaV9yb3V0ZS5kZXZpY2UpCiAgICAgICAgbm90IGlfcm91dGUuZGV2aWNlIGluIHBfbmFtZXMKICAgIH0KCiAgICBwcmludCgiVXBkYXRlUm91dGVzUmVxdWVzdDogdHJ1ZSIpCn0KClVwZGF0ZUludGVyZmFjZVJlcXVlc3QgewogICAgcHJpbnQoIlVwZGF0ZUludGVyZmFjZVJlcXVlc3Q6IGlucHV0ID0iLCBpbnB1dCkKICAgIHByaW50KCJVcGRhdGVJbnRlcmZhY2VSZXF1ZXN0OiBwb2xpY3kgPSIsIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuVXBkYXRlSW50ZXJmYWNlUmVxdWVzdCkKCiAgICBpX2ludGVyZmFjZSA6PSBpbnB1dC5pbnRlcmZhY2UKICAgIHBfZmxhZ3MgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmFsbG93X3Jhd19mbGFncwoKICAgICMgVHlwaWNhbGx5LCBqdXN0IElGRl9OT0FSUCBpcyB1c2VkLgogICAgYml0cy5hbmQoaV9pbnRlcmZhY2UucmF3X2ZsYWdzLCBiaXRzLm5lZ2F0ZShwX2ZsYWdzKSkgPT0gMAoKICAgIHBfbmFtZXMgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmZvcmJpZGRlbl9uYW1lcwoKICAgIG5vdCBpX2ludGVyZmFjZS5uYW1lIGluIHBfbmFtZXMKCiAgICBwX2h3YWRkcnMgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmZvcmJpZGRlbl9od19hZGRycwoKICAgIG5vdCBpX2ludGVyZmFjZS5od0FkZHIgaW4gcF9od2FkZHJzCgogICAgcHJpbnQoIlVwZGF0ZUludGVyZmFjZVJlcXVlc3Q6IHRydWUiKQp9CgpDbG9zZVN0ZGluUmVxdWVzdCB7CiAgICBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLkNsb3NlU3RkaW5SZXF1ZXN0ID09IHRydWUKfQoKUmVhZFN0cmVhbVJlcXVlc3QgewogICAgcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5SZWFkU3RyZWFtUmVxdWVzdCA9PSB0cnVlCn0KClVwZGF0ZUVwaGVtZXJhbE1vdW50c1JlcXVlc3QgewogICAgcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVFcGhlbWVyYWxNb3VudHNSZXF1ZXN0ID09IHRydWUKfQoKV3JpdGVTdHJlYW1SZXF1ZXN0IHsKICAgIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuV3JpdGVTdHJlYW1SZXF1ZXN0ID09IHRydWUKfQoKcG9saWN5X2RhdGEgOj0gewogICJjb250YWluZXJzIjogWwogICAgewogICAgICAiT0NJIjogewogICAgICAgICJWZXJzaW9uIjogIjEuMS4wLXJjLjEiLAogICAgICAgICJQcm9jZXNzIjogewogICAgICAgICAgIlRlcm1pbmFsIjogZmFsc2UsCiAgICAgICAgICAiVXNlciI6IHsKICAgICAgICAgICAgIlVJRCI6IDEsCiAgICAgICAgICAgICJHSUQiOiA2NTUzNSwKICAgICAgICAgICAgIkFkZGl0aW9uYWxHaWRzIjogW10sCiAgICAgICAgICAgICJVc2VybmFtZSI6ICIiCiAgICAgICAgICB9LAogICAgICAgICAgIkRlcHJlY2F0ZWRBcmdzIjogWwogICAgICAgICAgICAiL3BhdXNlIgogICAgICAgICAgXSwKICAgICAgICAgICJBcmdzIjogWwogICAgICAgICAgICAiL3BhdXNlIgogICAgICAgICAgXSwKICAgICAgICAgICJFbnYiOiBbCiAgICAgICAgICAgICJQQVRIPS91c3IvbG9jYWwvc2JpbjovdXNyL2xvY2FsL2JpbjovdXNyL3NiaW46L3Vzci9iaW46L3NiaW46L2JpbiIKICAgICAgICAgIF0sCiAgICAgICAgICAiQ3dkIjogIi8iLAogICAgICAgICAgIkNhcGFiaWxpdGllcyI6IHsKICAgICAgICAgICAgIkFtYmllbnQiOiBbXSwKICAgICAgICAgICAgIkJvdW5kaW5nIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJFZmZlY3RpdmUiOiBbCiAgICAgICAgICAgICAgIiQoZGVmYXVsdF9jYXBzKSIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgIkluaGVyaXRhYmxlIjogW10sCiAgICAgICAgICAgICJQZXJtaXR0ZWQiOiBbCiAgICAgICAgICAgICAgIiQoZGVmYXVsdF9jYXBzKSIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgICJOb05ld1ByaXZpbGVnZXMiOiB0cnVlCiAgICAgICAgfSwKICAgICAgICAiUm9vdCI6IHsKICAgICAgICAgICJQYXRoIjogIiQoY3BhdGgpLyQoYnVuZGxlLWlkKSIsCiAgICAgICAgICAiUmVhZG9ubHkiOiB0cnVlCiAgICAgICAgfSwKICAgICAgICAiTW91bnRzIjogWwogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL3Byb2MiLAogICAgICAgICAgICAic291cmNlIjogInByb2MiLAogICAgICAgICAgICAidHlwZV8iOiAicHJvYyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYiLAogICAgICAgICAgICAic291cmNlIjogInRtcGZzIiwKICAgICAgICAgICAgInR5cGVfIjogInRtcGZzIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgInN0cmljdGF0aW1lIiwKICAgICAgICAgICAgICAibW9kZT03NTUiLAogICAgICAgICAgICAgICJzaXplPTY1NTM2ayIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvcHRzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJkZXZwdHMiLAogICAgICAgICAgICAidHlwZV8iOiAiZGV2cHRzIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAgICAgIm5ld2luc3RhbmNlIiwKICAgICAgICAgICAgICAicHRteG1vZGU9MDY2NiIsCiAgICAgICAgICAgICAgIm1vZGU9MDYyMCIsCiAgICAgICAgICAgICAgImdpZD01IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi9zaG0iLAogICAgICAgICAgICAic291cmNlIjogIi9ydW4va2F0YS1jb250YWluZXJzL3NhbmRib3gvc2htIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L21xdWV1ZSIsCiAgICAgICAgICAgICJzb3VyY2UiOiAibXF1ZXVlIiwKICAgICAgICAgICAgInR5cGVfIjogIm1xdWV1ZSIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9zeXMiLAogICAgICAgICAgICAic291cmNlIjogInN5c2ZzIiwKICAgICAgICAgICAgInR5cGVfIjogInN5c2ZzIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAgICAgIm5vZGV2IiwKICAgICAgICAgICAgICAicm8iCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZXRjL3Jlc29sdi5jb25mIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KXJlc29sdi5jb25mJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicm8iLAogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2RldiIsCiAgICAgICAgICAgICAgIm5vZXhlYyIKICAgICAgICAgICAgXQogICAgICAgICAgfQogICAgICAgIF0sCiAgICAgICAgIkFubm90YXRpb25zIjogewogICAgICAgICAgImlvLmthdGFjb250YWluZXJzLnBrZy5vY2kuYnVuZGxlX3BhdGgiOiAiL3J1bi9jb250YWluZXJkL2lvLmNvbnRhaW5lcmQucnVudGltZS52Mi50YXNrL2s4cy5pby8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgImlvLmthdGFjb250YWluZXJzLnBrZy5vY2kuY29udGFpbmVyX3R5cGUiOiAicG9kX3NhbmRib3giLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLmNvbnRhaW5lci10eXBlIjogInNhbmRib3giLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtaWQiOiAiXlthLXowLTldezY0fSQiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbG9nLWRpcmVjdG9yeSI6ICJeL3Zhci9sb2cvcG9kcy8kKHNhbmRib3gtbmFtZXNwYWNlKV8kKHNhbmRib3gtbmFtZSlfWzAtOWEtZl17OH0tWzAtOWEtZl17NH0tWzAtOWEtZl17NH0tWzAtOWEtZl17NH0tWzAtOWEtZl17MTJ9JCIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1uYW1lc3BhY2UiOiAiIiwKICAgICAgICAgICJuZXJkY3RsL25ldHdvcmstbmFtZXNwYWNlIjogIl4vdmFyL3J1bi9uZXRucy9jbmktWzAtOWEtZl17OH0tWzAtOWEtZl17NH0tWzAtOWEtZl17NH0tWzAtOWEtZl17NH0tWzAtOWEtZl17MTJ9JCIKICAgICAgICB9LAogICAgICAgICJMaW51eCI6IHsKICAgICAgICAgICJOYW1lc3BhY2VzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgIlR5cGUiOiAiaXBjIiwKICAgICAgICAgICAgICAiUGF0aCI6ICIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiVHlwZSI6ICJ1dHMiLAogICAgICAgICAgICAgICJQYXRoIjogIiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJUeXBlIjogIm1vdW50IiwKICAgICAgICAgICAgICAiUGF0aCI6ICIiCiAgICAgICAgICAgIH0KICAgICAgICAgIF0sCiAgICAgICAgICAiTWFza2VkUGF0aHMiOiBbCiAgICAgICAgICAgICIvcHJvYy9hY3BpIiwKICAgICAgICAgICAgIi9wcm9jL2Fzb3VuZCIsCiAgICAgICAgICAgICIvcHJvYy9rY29yZSIsCiAgICAgICAgICAgICIvcHJvYy9rZXlzIiwKICAgICAgICAgICAgIi9wcm9jL2xhdGVuY3lfc3RhdHMiLAogICAgICAgICAgICAiL3Byb2MvdGltZXJfbGlzdCIsCiAgICAgICAgICAgICIvcHJvYy90aW1lcl9zdGF0cyIsCiAgICAgICAgICAgICIvcHJvYy9zY2hlZF9kZWJ1ZyIsCiAgICAgICAgICAgICIvc3lzL2Zpcm13YXJlIiwKICAgICAgICAgICAgIi9wcm9jL3Njc2kiCiAgICAgICAgICBdLAogICAgICAgICAgIlJlYWRvbmx5UGF0aHMiOiBbCiAgICAgICAgICAgICIvcHJvYy9idXMiLAogICAgICAgICAgICAiL3Byb2MvZnMiLAogICAgICAgICAgICAiL3Byb2MvaXJxIiwKICAgICAgICAgICAgIi9wcm9jL3N5cyIsCiAgICAgICAgICAgICIvcHJvYy9zeXNycS10cmlnZ2VyIgogICAgICAgICAgXSwKICAgICAgICAgICJEZXZpY2VzIjogW10sCiAgICAgICAgICAiU3lzY3RsIjogewogICAgICAgICAgICAibmV0LmlwdjQuaXBfdW5wcml2aWxlZ2VkX3BvcnRfc3RhcnQiOiAiMCIsCiAgICAgICAgICAgICJuZXQuaXB2NC5waW5nX2dyb3VwX3JhbmdlIjogIjAgMjE0NzQ4MzY0NyIKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0sCiAgICAgICJzdG9yYWdlcyI6IFsKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoMCkiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXIwKSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogIm92ZXJsYXlmcyIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAiZnVzZTMua2F0YS1vdmVybGF5IiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiNWE1YWFkODAwNTVmZjIwMDEyYTUwZGMyNWY4ZGY3YTI5OTI0NDc0MzI0ZDY1ZjdkNTMwNmVlOGVlMjdmZjcxZCIsCiAgICAgICAgICAgICI4MTcyNTBmMWEzZTMzNmRhNzZmNWJkM2ZhNzg0ZTFiMjZkOTU5YjljMTMxODc2ODE1YmEyNjA0MDQ4YjcwYzE4IgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGNwYXRoKS8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0KICAgICAgXSwKICAgICAgImRldmljZXMiOiBbXSwKICAgICAgInNhbmRib3hfcGlkbnMiOiBmYWxzZSwKICAgICAgImV4ZWNfY29tbWFuZHMiOiBbXSwKICAgICAgImVudl9tYXAiOiB7CiAgICAgICAgIlBBVEgiOiAiL3Vzci9sb2NhbC9zYmluOi91c3IvbG9jYWwvYmluOi91c3Ivc2JpbjovdXNyL2Jpbjovc2JpbjovYmluIgogICAgICB9CiAgICB9LAogICAgewogICAgICAiT0NJIjogewogICAgICAgICJWZXJzaW9uIjogIjEuMS4wLXJjLjEiLAogICAgICAgICJQcm9jZXNzIjogewogICAgICAgICAgIlRlcm1pbmFsIjogZmFsc2UsCiAgICAgICAgICAiVXNlciI6IHsKICAgICAgICAgICAgIlVJRCI6IDEsCiAgICAgICAgICAgICJHSUQiOiAwLAogICAgICAgICAgICAiQWRkaXRpb25hbEdpZHMiOiBbXSwKICAgICAgICAgICAgIlVzZXJuYW1lIjogIiIKICAgICAgICAgIH0sCiAgICAgICAgICAiRGVwcmVjYXRlZEFyZ3MiOiBbCiAgICAgICAgICAgICIvYWduaG9zdCIsCiAgICAgICAgICAgICJuZXRleGVjIgogICAgICAgICAgXSwKICAgICAgICAgICJBcmdzIjogWwogICAgICAgICAgICAiL2Fnbmhvc3QiLAogICAgICAgICAgICAibmV0ZXhlYyIKICAgICAgICAgIF0sCiAgICAgICAgICAiRW52IjogWwogICAgICAgICAgICAiUEFUSD0vdXNyL2xvY2FsL3NiaW46L3Vzci9sb2NhbC9iaW46L3Vzci9zYmluOi91c3IvYmluOi9zYmluOi9iaW4iLAogICAgICAgICAgICAiSE9TVE5BTUU9JChob3N0LW5hbWUpIgogICAgICAgICAgXSwKICAgICAgICAgICJDd2QiOiAiLyIsCiAgICAgICAgICAiQ2FwYWJpbGl0aWVzIjogewogICAgICAgICAgICAiQW1iaWVudCI6IFtdLAogICAgICAgICAgICAiQm91bmRpbmciOiBbCiAgICAgICAgICAgICAgIiQoZGVmYXVsdF9jYXBzKSIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgIkVmZmVjdGl2ZSI6IFsKICAgICAgICAgICAgICAiJChkZWZhdWx0X2NhcHMpIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiSW5oZXJpdGFibGUiOiBbXSwKICAgICAgICAgICAgIlBlcm1pdHRlZCI6IFsKICAgICAgICAgICAgICAiJChkZWZhdWx0X2NhcHMpIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgIk5vTmV3UHJpdmlsZWdlcyI6IGZhbHNlCiAgICAgICAgfSwKICAgICAgICAiUm9vdCI6IHsKICAgICAgICAgICJQYXRoIjogIiQoY3BhdGgpLyQoYnVuZGxlLWlkKSIsCiAgICAgICAgICAiUmVhZG9ubHkiOiBmYWxzZQogICAgICAgIH0sCiAgICAgICAgIk1vdW50cyI6IFsKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9wcm9jIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJwcm9jIiwKICAgICAgICAgICAgInR5cGVfIjogInByb2MiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2IiwKICAgICAgICAgICAgInNvdXJjZSI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJzdHJpY3RhdGltZSIsCiAgICAgICAgICAgICAgIm1vZGU9NzU1IiwKICAgICAgICAgICAgICAic2l6ZT02NTUzNmsiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L3B0cyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiZGV2cHRzIiwKICAgICAgICAgICAgInR5cGVfIjogImRldnB0cyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJuZXdpbnN0YW5jZSIsCiAgICAgICAgICAgICAgInB0bXhtb2RlPTA2NjYiLAogICAgICAgICAgICAgICJtb2RlPTA2MjAiLAogICAgICAgICAgICAgICJnaWQ9NSIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvc2htIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L3NobSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi9tcXVldWUiLAogICAgICAgICAgICAic291cmNlIjogIm1xdWV1ZSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJtcXVldWUiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvc3lzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJzeXNmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJzeXNmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL3N5cy9mcy9jZ3JvdXAiLAogICAgICAgICAgICAic291cmNlIjogImNncm91cCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJjZ3JvdXAiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiLAogICAgICAgICAgICAgICJyZWxhdGltZSIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2V0Yy9ob3N0cyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClob3N0cyQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicnciCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L3Rlcm1pbmF0aW9uLWxvZyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeCl0ZXJtaW5hdGlvbi1sb2ckIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJ3IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2V0Yy9ob3N0bmFtZSIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClob3N0bmFtZSQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicnciCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZXRjL3Jlc29sdi5jb25mIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KXJlc29sdi5jb25mJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJydyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi92YXIvcnVuL3NlY3JldHMva3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudCIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClzZXJ2aWNlYWNjb3VudCQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicm8iCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvdmFyL3J1bi9zZWNyZXRzL2F6dXJlL3Rva2VucyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeCl0b2tlbnMkIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9CiAgICAgICAgXSwKICAgICAgICAiQW5ub3RhdGlvbnMiOiB7CiAgICAgICAgICAiaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5idW5kbGVfcGF0aCI6ICIvcnVuL2NvbnRhaW5lcmQvaW8uY29udGFpbmVyZC5ydW50aW1lLnYyLnRhc2svazhzLmlvLyQoYnVuZGxlLWlkKSIsCiAgICAgICAgICAiaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5jb250YWluZXJfdHlwZSI6ICJwb2RfY29udGFpbmVyIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItbmFtZSI6ICJuZXRleGVjIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSI6ICJjb250YWluZXIiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLmltYWdlLW5hbWUiOiAicmVnaXN0cnkuazhzLmlvL2UyZS10ZXN0LWltYWdlcy9hZ25ob3N0OjIuMzIiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtaWQiOiAiXlthLXowLTldezY0fSQiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZXNwYWNlIjogIiIKICAgICAgICB9LAogICAgICAgICJMaW51eCI6IHsKICAgICAgICAgICJOYW1lc3BhY2VzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgIlR5cGUiOiAiaXBjIiwKICAgICAgICAgICAgICAiUGF0aCI6ICIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiVHlwZSI6ICJ1dHMiLAogICAgICAgICAgICAgICJQYXRoIjogIiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJUeXBlIjogIm1vdW50IiwKICAgICAgICAgICAgICAiUGF0aCI6ICIiCiAgICAgICAgICAgIH0KICAgICAgICAgIF0sCiAgICAgICAgICAiTWFza2VkUGF0aHMiOiBbCiAgICAgICAgICAgICIvcHJvYy9hY3BpIiwKICAgICAgICAgICAgIi9wcm9jL2tjb3JlIiwKICAgICAgICAgICAgIi9wcm9jL2tleXMiLAogICAgICAgICAgICAiL3Byb2MvbGF0ZW5jeV9zdGF0cyIsCiAgICAgICAgICAgICIvcHJvYy90aW1lcl9saXN0IiwKICAgICAgICAgICAgIi9wcm9jL3RpbWVyX3N0YXRzIiwKICAgICAgICAgICAgIi9wcm9jL3NjaGVkX2RlYnVnIiwKICAgICAgICAgICAgIi9wcm9jL3Njc2kiLAogICAgICAgICAgICAiL3N5cy9maXJtd2FyZSIKICAgICAgICAgIF0sCiAgICAgICAgICAiUmVhZG9ubHlQYXRocyI6IFsKICAgICAgICAgICAgIi9wcm9jL2Fzb3VuZCIsCiAgICAgICAgICAgICIvcHJvYy9idXMiLAogICAgICAgICAgICAiL3Byb2MvZnMiLAogICAgICAgICAgICAiL3Byb2MvaXJxIiwKICAgICAgICAgICAgIi9wcm9jL3N5cyIsCiAgICAgICAgICAgICIvcHJvYy9zeXNycS10cmlnZ2VyIgogICAgICAgICAgXSwKICAgICAgICAgICJEZXZpY2VzIjogW10sCiAgICAgICAgICAiU3lzY3RsIjogewogICAgICAgICAgICAibmV0LmlwdjQuaXBfdW5wcml2aWxlZ2VkX3BvcnRfc3RhcnQiOiAiMCIsCiAgICAgICAgICAgICJuZXQuaXB2NC5waW5nX2dyb3VwX3JhbmdlIjogIjAgMjE0NzQ4MzY0NyIKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0sCiAgICAgICJzdG9yYWdlcyI6IFsKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoMCkiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXIwKSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoMSkiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXIxKSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoMikiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXIyKSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoMykiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXIzKSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoNCkiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXI0KSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoNSkiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXI1KSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoNikiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXI2KSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoNykiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXI3KSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoOCkiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXI4KSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogIm92ZXJsYXlmcyIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAiZnVzZTMua2F0YS1vdmVybGF5IiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiMDNhZWJlOWFlMGE3YzU4OTljNDk1MjBmYjBjZDY4ZTAwOTJmODAxMDBiMzNhNWRkYTIyMTk1YjZjYzA3MTQzNjozZjAwY2VlODU0NjhlMmEwMWNkZjEwMDE0NWQ3MTcxZTg2Yjg5ZDhiNzM3NTIyYWY3MTNjYjgyYmM2YmFkMjNjOjUzMTkxODNlZTU4NjBmZTQ3ZGM0MzkwMTExZjNhMTIwYjk0ZDJlNGQ0ZTU2OTFkMTQ4ZWFlMzY1MWVmZDBiYmQ6MjZkYzdhMDljZjg1MmQ4ZGExNDQzM2MzYTU1MTdiZTFlMTI2NDNmMmQ2ZWVjYWIxMmIwMmRjMTlmNjIzOWIyNjoxN2ZjMWY4Njg3MjUzZjUxMTg2NzAxOGFkNjc5NGM4NGY4ZmVhYjBlZmQ2YTQ5MGFlMDY1YWM2ZTFmOGMyNzYxOjAzMzY2YTczM2QyYjM5MmRlOWFlM2EwYWRiNjM3OTkwMzNiOTIxMmZhNzUwY2M1NDk0NzY3NWYwZWM0OTA2MDA6NjA2N2NmNDUwNDQ1N2NhMmFhZWU4M2UwOTJiMmNkOGExM2M0N2RjOGIzNzU4NWJhZWQyMjViN2VjZWU0MjVhNjplYzA3MTRkYjlhMjk2MTIwZWViMGQxMzQ5NGVkNDllMDBkZjVkMzc3N2VlNmFjNTgwZjNiNmYzMjAxMGJjYzc2OjE5MDQ3M2E3YWY5MTEyNWMyYWFhODM5ZWRhNjE2OWJiYTU1ZGRhM2IwODNhYTY3MWI4ZjBmMmI0ZDc3YTkzNTkiLAogICAgICAgICAgICAiN2YyMjYzNzQzMjc1MGY1MDU2YmU3OTUzOGM1NDFlNzE3NWEzODk2MWY4MjI4NzkwMGRjMzEyNjczNWUxZmEzYTpjZTNmYjQ0NjI5MzczYTNmYTE4YTQyN2FiMmU1OWZlMDNhZDU1NDlmYjRlMzdmZTIzMDhlOWI2NzUyZDc0NGE3OmRjYmNmNTg3MDNlOTMwMWEzNGVmM2E2ZTI4MWFiMTcxYjUzYTk1YTY3OTEwZTViYThhMzVlMGZkMGVmYjFmYTg6NjVjNWU4M2UwZGEwYzE1ZDEyZjRmZmM2NDUwOWI3MWU0YjQ5OTM5ZjI0NzUyOTUzNTk1NTNkMzdlYTVjYmY1ZTo2YTEzMjE0Y2IwMjExOTJkY2E4ZjdhNWQzMjA0YTFkOTM0ZGRkMjlkNDI2ZDAxZWFhNGMwZjg3YjUwNDQyY2Y5OjEyMzFkOWI1ZDFiMDcwYTA5MGQ4ZmEwNzRiODRjMTBlOWU4M2JhZjVkN2M0MTZhNTg4YWNkYjkyMGM1MTM0MGM6ZTJhZmNkOTkzNjYyYjNiYzI2MDQ4MjdkZWMyNmRlMzA4N2ZkMTY5ZjAzODI4MzUzZmY1NjM5OTQ2NTljMzVlZTo0OGQzODc2NGZmNzEzNjBkMTA4MGNhMTI0MGJhZTE0MGVmNjJjZjNhNzg3NjUyNTIxNTZmNWRkMTUyN2YwZWIyOjQ3YjY2OWU1YTczMDNjZDEzYmM4ZmJkOTI0ZTQyYTI1YWJlZDNhZTFhZmZmOWI1YzYyOTI2ZjdjZTc3YjA1NGEiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQoY3BhdGgpLyQoYnVuZGxlLWlkKSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfQogICAgICBdLAogICAgICAiZGV2aWNlcyI6IFtdLAogICAgICAic2FuZGJveF9waWRucyI6IGZhbHNlLAogICAgICAiZXhlY19jb21tYW5kcyI6IFtdLAogICAgICAiZW52X21hcCI6IHsKICAgICAgICAiSE9TVE5BTUUiOiAiJChob3N0LW5hbWUpIiwKICAgICAgICAiUEFUSCI6ICIvdXNyL2xvY2FsL3NiaW46L3Vzci9sb2NhbC9iaW46L3Vzci9zYmluOi91c3IvYmluOi9zYmluOi9iaW4iCiAgICAgIH0KICAgIH0KICBdLAogICJjb21tb24iOiB7CiAgICAiY3BhdGgiOiAiL3J1bi9rYXRhLWNvbnRhaW5lcnMvc2hhcmVkL2NvbnRhaW5lcnMiLAogICAgIm1vdW50X3NvdXJjZV9jcGF0aCI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zaGFyZWQvY29udGFpbmVycyIsCiAgICAic2ZwcmVmaXgiOiAiXiQoY3BhdGgpLyQoYnVuZGxlLWlkKS1bYS16MC05XXsxNn0tIiwKICAgICJzcGF0aCI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L3N0b3JhZ2UiLAogICAgImlwdjRfYSI6ICIoKFswLTldfFsxLTldWzAtOV18MVswLTldezJ9fDJbMC00XVswLTldfDI1WzAtNV0pXFwuKXszfShbMC05XXxbMS05XVswLTldfDFbMC05XXsyfXwyWzAtNF1bMC05XXwyNVswLTVdKSIsCiAgICAiaXBfcCI6ICJbMC05XXsxLDV9IiwKICAgICJzdmNfbmFtZSI6ICJbQS1aX1xcLlxcLV0rIiwKICAgICJkbnNfbGFiZWwiOiAiW2EtekEtWjAtOV9cXC5cXC1dKyIsCiAgICAic19zb3VyY2UxIjogIl4uLjJbMC05XXszfV9bMC0xXVswLTldX1swLTNdWzAtOV1fWzAtMl1bMC05XV9bMC01XVswLTldX1swLTVdWzAtOV1cXC5bMC05XXsxLDEwfSQiLAogICAgInNfc291cmNlMiI6ICJeLi5kYXRhLyIsCiAgICAiZG5zX3N1YmRvbWFpbiI6ICJeW2EtejAtOV0oWy1hLXowLTldKlthLXowLTldKT8kIiwKICAgICJwb2RfdWlkIjogIl5bMC05YS1mQS1GXXs4fS1bMC05YS1mQS1GXXs0fS1bMC05YS1mQS1GXXs0fS1bMC05YS1mQS1GXXs0fS1bMC05YS1mQS1GXXsxMn0kIiwKICAgICJkZWZhdWx0X2NhcHMiOiBbCiAgICAgICJDQVBfQ0hPV04iLAogICAgICAiQ0FQX0RBQ19PVkVSUklERSIsCiAgICAgICJDQVBfRlNFVElEIiwKICAgICAgIkNBUF9GT1dORVIiLAogICAgICAiQ0FQX01LTk9EIiwKICAgICAgIkNBUF9ORVRfUkFXIiwKICAgICAgIkNBUF9TRVRHSUQiLAogICAgICAiQ0FQX1NFVFVJRCIsCiAgICAgICJDQVBfU0VURkNBUCIsCiAgICAgICJDQVBfU0VUUENBUCIsCiAgICAgICJDQVBfTkVUX0JJTkRfU0VSVklDRSIsCiAgICAgICJDQVBfU1lTX0NIUk9PVCIsCiAgICAgICJDQVBfS0lMTCIsCiAgICAgICJDQVBfQVVESVRfV1JJVEUiCiAgICBdLAogICAgInByaXZpbGVnZWRfY2FwcyI6IFsKICAgICAgIkNBUF9DSE9XTiIsCiAgICAgICJDQVBfREFDX09WRVJSSURFIiwKICAgICAgIkNBUF9EQUNfUkVBRF9TRUFSQ0giLAogICAgICAiQ0FQX0ZPV05FUiIsCiAgICAgICJDQVBfRlNFVElEIiwKICAgICAgIkNBUF9LSUxMIiwKICAgICAgIkNBUF9TRVRHSUQiLAogICAgICAiQ0FQX1NFVFVJRCIsCiAgICAgICJDQVBfU0VUUENBUCIsCiAgICAgICJDQVBfTElOVVhfSU1NVVRBQkxFIiwKICAgICAgIkNBUF9ORVRfQklORF9TRVJWSUNFIiwKICAgICAgIkNBUF9ORVRfQlJPQURDQVNUIiwKICAgICAgIkNBUF9ORVRfQURNSU4iLAogICAgICAiQ0FQX05FVF9SQVciLAogICAgICAiQ0FQX0lQQ19MT0NLIiwKICAgICAgIkNBUF9JUENfT1dORVIiLAogICAgICAiQ0FQX1NZU19NT0RVTEUiLAogICAgICAiQ0FQX1NZU19SQVdJTyIsCiAgICAgICJDQVBfU1lTX0NIUk9PVCIsCiAgICAgICJDQVBfU1lTX1BUUkFDRSIsCiAgICAgICJDQVBfU1lTX1BBQ0NUIiwKICAgICAgIkNBUF9TWVNfQURNSU4iLAogICAgICAiQ0FQX1NZU19CT09UIiwKICAgICAgIkNBUF9TWVNfTklDRSIsCiAgICAgICJDQVBfU1lTX1JFU09VUkNFIiwKICAgICAgIkNBUF9TWVNfVElNRSIsCiAgICAgICJDQVBfU1lTX1RUWV9DT05GSUciLAogICAgICAiQ0FQX01LTk9EIiwKICAgICAgIkNBUF9MRUFTRSIsCiAgICAgICJDQVBfQVVESVRfV1JJVEUiLAogICAgICAiQ0FQX0FVRElUX0NPTlRST0wiLAogICAgICAiQ0FQX1NFVEZDQVAiLAogICAgICAiQ0FQX01BQ19PVkVSUklERSIsCiAgICAgICJDQVBfTUFDX0FETUlOIiwKICAgICAgIkNBUF9TWVNMT0ciLAogICAgICAiQ0FQX1dBS0VfQUxBUk0iLAogICAgICAiQ0FQX0JMT0NLX1NVU1BFTkQiLAogICAgICAiQ0FQX0FVRElUX1JFQUQiLAogICAgICAiQ0FQX1BFUkZNT04iLAogICAgICAiQ0FQX0JQRiIsCiAgICAgICJDQVBfQ0hFQ0tQT0lOVF9SRVNUT1JFIgogICAgXSwKICAgICJ2aXJ0aW9fYmxrX3N0b3JhZ2VfY2xhc3NlcyI6IFsKICAgICAgImNjLWxvY2FsLWNzaSIsCiAgICAgICJjYy1tYW5hZ2VkLWNzaSIsCiAgICAgICJjYy1tYW5hZ2VkLXByZW1pdW0tY3NpIgogICAgXSwKICAgICJzbWJfc3RvcmFnZV9jbGFzc2VzIjogWwogICAgICB7CiAgICAgICAgIm5hbWUiOiAiYXp1cmVmaWxlLWNzaS1rYXRhLWNjIiwKICAgICAgICAibW91bnRfb3B0aW9ucyI6IFsKICAgICAgICAgICJkaXJfbW9kZT0wNzc3IiwKICAgICAgICAgICJmaWxlX21vZGU9MDc3NyIsCiAgICAgICAgICAibWZzeW1saW5rcyIsCiAgICAgICAgICAiY2FjaGU9c3RyaWN0IiwKICAgICAgICAgICJub3NoYXJlc29jayIsCiAgICAgICAgICAiYWN0aW1lbz0zMCIsCiAgICAgICAgICAibm9icmwiCiAgICAgICAgXQogICAgICB9CiAgICBdCiAgfSwKICAic2FuZGJveCI6IHsKICAgICJzdG9yYWdlcyI6IFsKICAgICAgewogICAgICAgICJkcml2ZXIiOiAiZXBoZW1lcmFsIiwKICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAic291cmNlIjogInNobSIsCiAgICAgICAgImZzdHlwZSI6ICJ0bXBmcyIsCiAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgIm5vZGV2IiwKICAgICAgICAgICJtb2RlPTE3NzciLAogICAgICAgICAgInNpemU9NjcxMDg4NjQiCiAgICAgICAgXSwKICAgICAgICAibW91bnRfcG9pbnQiOiAiL3J1bi9rYXRhLWNvbnRhaW5lcnMvc2FuZGJveC9zaG0iLAogICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgfQogICAgXQogIH0sCiAgInJlcXVlc3RfZGVmYXVsdHMiOiB7CiAgICAiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdCI6IHsKICAgICAgImFsbG93X2Vudl9yZWdleCI6IFsKICAgICAgICAiXkhPU1ROQU1FPSQoZG5zX2xhYmVsKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfUE9SVF8kKGlwX3ApX1RDUD10Y3A6Ly8kKGlwdjRfYSk6JChpcF9wKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfUE9SVF8kKGlwX3ApX1RDUF9QUk9UTz10Y3AkIiwKICAgICAgICAiXiQoc3ZjX25hbWUpX1BPUlRfJChpcF9wKV9UQ1BfUE9SVD0kKGlwX3ApJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9QT1JUXyQoaXBfcClfVENQX0FERFI9JChpcHY0X2EpJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9TRVJWSUNFX0hPU1Q9JChpcHY0X2EpJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9TRVJWSUNFX1BPUlQ9JChpcF9wKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfU0VSVklDRV9QT1JUXyQoZG5zX2xhYmVsKT0kKGlwX3ApJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9QT1JUPXRjcDovLyQoaXB2NF9hKTokKGlwX3ApJCIsCiAgICAgICAgIl5BWlVSRV9DTElFTlRfSUQ9W0EtRmEtZjAtOS1dKiQiLAogICAgICAgICJeQVpVUkVfVEVOQU5UX0lEPVtBLUZhLWYwLTktXSokIiwKICAgICAgICAiXkFaVVJFX0ZFREVSQVRFRF9UT0tFTl9GSUxFPS92YXIvcnVuL3NlY3JldHMvYXp1cmUvdG9rZW5zL2F6dXJlLWlkZW50aXR5LXRva2VuJCIsCiAgICAgICAgIl5BWlVSRV9BVVRIT1JJVFlfSE9TVD1odHRwczovL2xvZ2luXFwubWljcm9zb2Z0b25saW5lXFwuY29tLyQiLAogICAgICAgICJeVEVSTT14dGVybSQiCiAgICAgIF0sCiAgICAgICJhbGxvd19lbnZfcmVnZXhfbWFwIjogewogICAgICAgICJDUFVfTElNSVQiOiAiXlswLTldKyQiLAogICAgICAgICJKT0JfQ09NUExFVElPTl9JTkRFWCI6ICJeWzAtOV0qJCIsCiAgICAgICAgIk1FTU9SWV9MSU1JVCI6ICJeWzAtOV0rJCIKICAgICAgfQogICAgfSwKICAgICJDb3B5RmlsZVJlcXVlc3QiOiBbCiAgICAgICIkKHNmcHJlZml4KSIKICAgIF0sCiAgICAiRXhlY1Byb2Nlc3NSZXF1ZXN0IjogewogICAgICAiYWxsb3dlZF9jb21tYW5kcyI6IFtdLAogICAgICAicmVnZXgiOiBbXQogICAgfSwKICAgICJVcGRhdGVSb3V0ZXNSZXF1ZXN0IjogewogICAgICAiZm9yYmlkZGVuX2RldmljZV9uYW1lcyI6IFsKICAgICAgICAibG8iCiAgICAgIF0sCiAgICAgICJmb3JiaWRkZW5fc291cmNlX3JlZ2V4IjogWwogICAgICAgICJeKD86MHswLDR9Oil7MCw3fTB7MCwzfTEkIiwKICAgICAgICAiXjEyN1xcLig/OlswLTldezEsM31cXC4pezJ9WzAtOV17MSwzfSQiCiAgICAgIF0KICAgIH0sCiAgICAiVXBkYXRlSW50ZXJmYWNlUmVxdWVzdCI6IHsKICAgICAgImFsbG93X3Jhd19mbGFncyI6IDEyOCwKICAgICAgImZvcmJpZGRlbl9uYW1lcyI6IFsKICAgICAgICAibG8iCiAgICAgIF0sCiAgICAgICJmb3JiaWRkZW5faHdfYWRkcnMiOiBbCiAgICAgICAgIjAwOjAwOjAwOjAwOjAwOjAwIgogICAgICBdCiAgICB9LAogICAgIkNsb3NlU3RkaW5SZXF1ZXN0IjogZmFsc2UsCiAgICAiUmVhZFN0cmVhbVJlcXVlc3QiOiBmYWxzZSwKICAgICJVcGRhdGVFcGhlbWVyYWxNb3VudHNSZXF1ZXN0IjogZmFsc2UsCiAgICAiV3JpdGVTdHJlYW1SZXF1ZXN0IjogZmFsc2UKICB9Cn0= + spec: + runtimeClassName: kata-cc + securityContext: + runAsUser: 1 + containers: + - name: netexec + image: "registry.k8s.io/e2e-test-images/agnhost:2.32" + ports: + - containerPort: 8080 + hostPort: 81 + command: + - /agnhost + - netexec diff --git a/src/agent/samples/policy/yaml/kubernetes/conformance2/ingress-http-rc.yaml b/src/agent/samples/policy/yaml/kubernetes/conformance2/ingress-http-rc.yaml new file mode 100644 index 000000000000..0586decfcd3e --- /dev/null +++ b/src/agent/samples/policy/yaml/kubernetes/conformance2/ingress-http-rc.yaml @@ -0,0 +1,32 @@ +--- +apiVersion: v1 +kind: ReplicationController +metadata: + name: echoheaders +spec: + replicas: 1 + template: + metadata: + labels: + app: echoheaders + annotations: + io.katacontainers.config.agent.policy: IyBDb3B5cmlnaHQgKGMpIDIwMjMgTWljcm9zb2Z0IENvcnBvcmF0aW9uCiMKIyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMAojCnBhY2thZ2UgYWdlbnRfcG9saWN5CgppbXBvcnQgZnV0dXJlLmtleXdvcmRzLmluCmltcG9ydCBmdXR1cmUua2V5d29yZHMuZXZlcnkKCiMgRGVmYXVsdCB2YWx1ZXMsIHJldHVybmVkIGJ5IE9QQSB3aGVuIHJ1bGVzIGNhbm5vdCBiZSBldmFsdWF0ZWQgdG8gdHJ1ZS4KZGVmYXVsdCBBZGRBUlBOZWlnaGJvcnNSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgQWRkU3dhcFJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBDbG9zZVN0ZGluUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IENvcHlGaWxlUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IENyZWF0ZUNvbnRhaW5lclJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBDcmVhdGVTYW5kYm94UmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IERlc3Ryb3lTYW5kYm94UmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgRXhlY1Byb2Nlc3NSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgR2V0T09NRXZlbnRSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBHdWVzdERldGFpbHNSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBMaXN0SW50ZXJmYWNlc1JlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBMaXN0Um91dGVzUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IE1lbUhvdHBsdWdCeVByb2JlUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IE9ubGluZUNQVU1lbVJlcXVlc3QgOj0gdHJ1ZQpkZWZhdWx0IFBhdXNlQ29udGFpbmVyUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFJlYWRTdHJlYW1SZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgUmVtb3ZlQ29udGFpbmVyUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgUmVtb3ZlU3RhbGVWaXJ0aW9mc1NoYXJlTW91bnRzUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgUmVzZWVkUmFuZG9tRGV2UmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFJlc3VtZUNvbnRhaW5lclJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBTZXRHdWVzdERhdGVUaW1lUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFNldFBvbGljeVJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBTaWduYWxQcm9jZXNzUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgU3RhcnRDb250YWluZXJSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBTdGFydFRyYWNpbmdSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgU3RhdHNDb250YWluZXJSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBTdG9wVHJhY2luZ1JlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBUdHlXaW5SZXNpemVSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBVcGRhdGVDb250YWluZXJSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgVXBkYXRlRXBoZW1lcmFsTW91bnRzUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFVwZGF0ZUludGVyZmFjZVJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBVcGRhdGVSb3V0ZXNSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgV2FpdFByb2Nlc3NSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBXcml0ZVN0cmVhbVJlcXVlc3QgOj0gZmFsc2UKCiMgQWxsb3dSZXF1ZXN0c0ZhaWxpbmdQb2xpY3kgOj0gdHJ1ZSBjb25maWd1cmVzIHRoZSBBZ2VudCB0byAqYWxsb3cgYW55CiMgcmVxdWVzdHMgY2F1c2luZyBhIHBvbGljeSBmYWlsdXJlKi4gVGhpcyBpcyBhbiB1bnNlY3VyZSBjb25maWd1cmF0aW9uCiMgYnV0IGlzIHVzZWZ1bCBmb3IgYWxsb3dpbmcgdW5zZWN1cmUgcG9kcyB0byBzdGFydCwgdGhlbiBjb25uZWN0IHRvCiMgdGhlbSBhbmQgaW5zcGVjdCBPUEEgbG9ncyBmb3IgdGhlIHJvb3QgY2F1c2Ugb2YgYSBmYWlsdXJlLgpkZWZhdWx0IEFsbG93UmVxdWVzdHNGYWlsaW5nUG9saWN5IDo9IGZhbHNlCgojIENvbnN0YW50cwpTX05BTUVfS0VZID0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZSIKU19OQU1FU1BBQ0VfS0VZID0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZXNwYWNlIgpCVU5ETEVfSUQgPSAiW2EtejAtOV17NjR9IgoKQ3JlYXRlQ29udGFpbmVyUmVxdWVzdDo9IHJlc3AgewogICAgbm90IGlzX251bGwoaW5wdXQuZW52X21hcCkKICAgIAogICAgaV9lbnZfbWFwIDo9IGlucHV0LmVudl9tYXAKICAgIAogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBwX2Vudl9tYXAgOj0gcF9jb250YWluZXIuZW52X21hcCAgCiAgICBhbGxvd19lbnZfbWFwKHBfZW52X21hcCwgaV9lbnZfbWFwKQogICAgCiAgICBpX3Byb2Nlc3MgOj0gaW5wdXQuYmFzZS5PQ0kuUHJvY2VzcwogICAgCiAgICBwX3Byb2Nlc3MgOj0gcF9jb250YWluZXIuT0NJLlByb2Nlc3MKICAgIAogICAgYWxsb3dfYXJncyhpX3Byb2Nlc3MsIHBfcHJvY2VzcywgaV9lbnZfbWFwKQoKICAgIHJlc3AgPSBDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uKGlucHV0LmJhc2UpCiAgICBwcmludCgiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdDogdHJ1ZSIpCn0KCmFsbG93X2FyZ3MoaV9wcm9jZXNzLCBwX3Byb2Nlc3MsIGlfZW52X21hcCkgewogICAgaV9hcmdzIDo9IGlfcHJvY2Vzcy5BcmdzCiAgICBwX2FyZ3MgOj0gcF9wcm9jZXNzLkFyZ3MKICAgIHByaW50KCJhbGxvd19hcmdzOiBpX2FyZ3MgPSIsIGlfYXJncywgInBfYXJncyA9IiwgcF9hcmdzKQogICAgY291bnQoaV9hcmdzKSA9PSBjb3VudChwX2FyZ3MpCiAgICBldmVyeSBpLCBpX2FyZyBpbiBpX2FyZ3MgewogICAgICAgIHByaW50KCJhbGxvd19hcmdzOiBpX2FyZyA9IiwgaV9hcmcpCiAgICAgICAgcF9hcmdfcmVwbGFjZWQgOj0gcmVwbGFjZV9lbnZfdmFyaWFibGVzKHBfYXJnc1tpXSwgaV9lbnZfbWFwKQogICAgICAgIHByaW50KCJhbGxvd19hcmdzOiBwX2FyZ19yZXBsYWNlZCA9IiwgcF9hcmdfcmVwbGFjZWQpCiAgICAgICAgcF9hcmdfcmVwbGFjZWQyIDo9IHJlcGxhY2UocF9hcmdfcmVwbGFjZWQsICIkJCIsICIkIikKICAgICAgICBwcmludCgiYWxsb3dfYXJnczogcF9hcmdfcmVwbGFjZWQyID0iLCBwX2FyZ19yZXBsYWNlZDIpCiAgICAgICAgaV9hcmcgPT0gcF9hcmdfcmVwbGFjZWQyCiAgICB9CiAgICBwcmludCgiYWxsb3dfYXJnczogdHJ1ZSIpCn0KCmFsbG93X2FyZ3MoaV9wcm9jZXNzLCBwX3Byb2Nlc3MsIGlfZW52X21hcCkgewogICAgbm90IGlfcHJvY2Vzcy5BcmdzCiAgICBub3QgcF9wcm9jZXNzLkFyZ3MKICAgIHByaW50KCJhbGxvd19hcmdzMjogbm8gYXJncyIpCn0KCiMgdGhpcyBmdW5jdGlvbiByZXBsYWNlcyBhbGwgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyBpbiBhIHN0cmluZywgZ2l2ZW4gYSBtYXAgb2YgZW52aXJvbm1lbnQga2V5cyB0byBlbnZpcm9ubWVudCB2YWx1ZXMKIyBlZyBzdHIgPSAiZWNobyAkKENMVVNURVJfSUQpOyBlY2hvICQoTk9ERV9OQU1FKTsiCiMgZW52X21hcCA9IHsiQ0xVU1RFUl9JRCI6ICJhYmMiLCAiTk9ERV9OQU1FIiA6ICJ4eXoifQojIHJlc3VsdCA9ICJlY2hvIGFiYzsgZWNobyB4eXo7IgpyZXBsYWNlX2Vudl92YXJpYWJsZXMoc3RyLCBlbnZfbWFwKSA9IHJlc3VsdCB7CiAgICAjIG1ha2UgYW4gYXJyYXkgb2YgdGhlIGtleXMgZWcgWyJDTFVTVEVSX0lEIiwgIk5PREVfTkFNRSJdCiAgICBrZXlzIDo9IFt4IHwgc29tZSB4IGluIG9iamVjdC5rZXlzKGVudl9tYXApXQogICAgcmVzdWx0IDo9IHJlcGxhY2Vfc3RyX3JlYyhzdHIsIGVudl9tYXAsIGtleXMsIGNvdW50KGtleXMpIC0gMSkKfQoKIyBiYXNlIGNhc2UKcmVwbGFjZV9zdHJfcmVjKHN0ciwgZW52X21hcCwgYXJyX2tleXMsIGkpID0gcmVzdWx0IHsKICAgIGkgPCAwCiAgICByZXN1bHQgOj0gc3RyCn0KCiMgcmVjdXJzaXZlIHN0ZXAKcmVwbGFjZV9zdHJfcmVjKHN0ciwgZW52X21hcCwgYXJyX2tleXMsIGkpID0gcmVzdWx0IHsKICAgIGkgPj0gMAogICAga2V5IDo9IGFycl9rZXlzW2ldCiAgICBlbnZfa2V5MSA6PSBjb25jYXQoIiIsIFsiJCgiLCBrZXksICIpIl0pCiAgICAjIHJlcGxhY2UgJChWQVIpIHdpdGggdmFsdWUKICAgIG5ld19zdHIxIDo9IHJlcGxhY2Uoc3RyLCBlbnZfa2V5MSwgZW52X21hcFtrZXldKQogICAgIyByZXBsYWNlIG5leHQgZW52aXJvbm1lbnQgdmFyaWFibGUKICAgIHJlc3VsdCA9IHJlcGxhY2Vfc3RyX3JlYyhuZXdfc3RyMSwgZW52X21hcCwgYXJyX2tleXMsIGkgLSAxKQp9CgphbGxvd19lbnZfbWFwKHBfZW52X21hcCwgaV9lbnZfbWFwKSB7CiAgICBwcmludCgiYWxsb3dfZW52X21hcDogcF9lbnZfbWFwID0iLCBwX2Vudl9tYXApCiAgICBldmVyeSBlbnZfa2V5LCBlbnZfdmFsIGluIGlfZW52X21hcCB7CiAgICAgICAgcHJpbnQoImFsbG93X2VudjogZW52X2tleSA9IiwgZW52X2tleSwgImVudl92YWwgPSIsIGVudl92YWwpCiAgICAgICAgYWxsb3dfZW52X21hcF9lbnRyeShlbnZfa2V5LCBlbnZfdmFsLCBwX2Vudl9tYXApCiAgICB9CiAgICBwcmludCgiYWxsb3dfZW52X21hcDogdHJ1ZSIpCn0KCiMgQWxsb3cgZXhhY3QgbWF0Y2gKYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBpX3ZhbCA9PSBwX3ZhbAogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnk6IHRydWUiKQp9CgojIEFsbG93IHJlc291cmNlRmllbGRSZWYgdmFsdWVzIChlLmcuLCAibGltaXRzLmNwdSIpLgphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgICMgYSB2YXJpYWJsZSB3ZSBzaG91bGQgYmUgdmFsaWRhdGluZyB1c2luZyBhIHJlZ2V4IGZyb20gc2V0dGluZ3MKICAgIHBfdmFsID09ICIkKHZhbGlkYXRlLWZyb20tc2V0dGluZ3MpIgogICAgcmVnZXhfdmFsIDo9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuQ3JlYXRlQ29udGFpbmVyUmVxdWVzdC5hbGxvd19lbnZfcmVnZXhfbWFwW2tleV0KICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4X3ZhbCwgaV92YWwpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSAyOiB0cnVlIikKfQoKIyBBbGxvdyBub2RlLW5hbWUKYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChub2RlLW5hbWUpIgogICAgcmVnZXgubWF0Y2gocG9saWN5X2RhdGEuY29tbW9uLmRuc19zdWJkb21haW4gLCBpX3ZhbCkKICAgIHByaW50KCJhbGxvd19lbnZfbWFwX2VudHJ5IDM6IHRydWUiKQp9CgojIEFsbG93IGhvc3QtbmFtZQphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgIHBfdmFsID09ICIkKGhvc3QtbmFtZSkiCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24uZG5zX2xhYmVsICwgaV92YWwpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSA0OiB0cnVlIikKfQoKIyBBbGxvdyBwb2QtdWlkCmFsbG93X2Vudl9tYXBfZW50cnkoa2V5LCBpX3ZhbCwgcF9lbnZfbWFwKSB7CiAgICBwX3ZhbCA6PSBwX2Vudl9tYXBba2V5XQogICAgcF92YWwgPT0gIiQocG9kLXVpZCkiCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24ucG9kX3VpZCAsIGlfdmFsKQogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgNTogdHJ1ZSIpCn0KCiMgQWxsb3cgZmllbGRSZWYgImZpZWxkUGF0aDogc3RhdHVzLnBvZElQIiB2YWx1ZXMuCmFsbG93X2Vudl9tYXBfZW50cnkoa2V5LCBpX3ZhbCwgcF9lbnZfbWFwKSB7CiAgICBpc19pcChpX3ZhbCkKCiAgICBwX3ZhbCA6PSBwX2Vudl9tYXBba2V5XQogICAgcF92YXIgOj0gY29uY2F0KCI9IiwgW2tleSwgcF92YWxdKQogICAgYWxsb3dfcG9kX2lwX3ZhcihrZXksIHBfdmFyKQogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgNjogdHJ1ZSIpCn0KCiMgQWxsb3cgZmllbGRSZWYgImZpZWxkUGF0aDogc3RhdHVzLmhvc3RJUCIgdmFsdWVzLgphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgaXNfaXAoaV92YWwpCgogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgIHBfdmFyIDo9IGNvbmNhdCgiPSIsIFtrZXksIHBfdmFsXSkKICAgIGFsbG93X2hvc3RfaXBfdmFyKGtleSwgcF92YXIpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSA3OiB0cnVlIikKfQoKIyBNYXRjaCBpbnB1dCB3aXRoIG9uZSBvZiB0aGUgcG9saWN5IHZhcmlhYmxlcywgYWZ0ZXIgc3Vic3RpdHV0aW5nICQoc2FuZGJveC1uYW1lKS4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChzYW5kYm94LW5hbWUpIgogICAgc19uYW1lIDo9IGlucHV0LmJhc2UuT0NJLkFubm90YXRpb25zW1NfTkFNRV9LRVldCiAgICBwX3ZhcjIgOj0gcmVwbGFjZShwX3ZhbCwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHBfdmFyMiA9PSBpX3ZhbAogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgODogdHJ1ZSIpCn0KCiMgTWF0Y2ggaW5wdXQgd2l0aCBvbmUgb2YgdGhlIHBvbGljeSB2YXJpYWJsZXMsIGFmdGVyIHN1YnN0aXR1dGluZyAkKHNhbmRib3gtbmFtZXNwYWNlKS4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChzYW5kYm94LW5hbWVzcGFjZSkiCiAgICBzX25hbWVzcGFjZSA6PSBpbnB1dC5iYXNlLk9DSS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwX3ZhcjIgOj0gcmVwbGFjZShwX3ZhbCwgIiQoc2FuZGJveC1uYW1lc3BhY2UpIiwgc19uYW1lc3BhY2UpCiAgICBwX3ZhcjIgPT0gaV92YWwKICAgIHByaW50KCJhbGxvd19lbnZfbWFwX2VudHJ5IDk6IHRydWUiKQp9CgojIEFsbG93IGlucHV0IGVudiB2YXJpYWJsZXMgdGhhdCBtYXRjaCB3aXRoIGEgcmVxdWVzdF9kZWZhdWx0cyByZWdleC4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHNvbWUgcF9yZWdleDEgaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5DcmVhdGVDb250YWluZXJSZXF1ZXN0LmFsbG93X2Vudl9yZWdleAogICAgcF9yZWdleDIgOj0gcmVwbGFjZShwX3JlZ2V4MSwgIiQoaXB2NF9hKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcHY0X2EpCiAgICBwX3JlZ2V4MyA6PSByZXBsYWNlKHBfcmVnZXgyLCAiJChpcF9wKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcF9wKQogICAgcF9yZWdleDQgOj0gcmVwbGFjZShwX3JlZ2V4MywgIiQoc3ZjX25hbWUpIiwgcG9saWN5X2RhdGEuY29tbW9uLnN2Y19uYW1lKQogICAgcF9yZWdleDUgOj0gcmVwbGFjZShwX3JlZ2V4NCwgIiQoZG5zX2xhYmVsKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5kbnNfbGFiZWwpCgogICAgcmVzdWx0IDo9IGNvbmNhdCgiPSIsIFtrZXksIGlfdmFsXSkKICAgIHJlZ2V4Lm1hdGNoKHBfcmVnZXg1LCByZXN1bHQpCgogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgMTA6IHRydWUiKQp9CgpDcmVhdGVDb250YWluZXJSZXF1ZXN0Oj0gcmVzcCB7CiAgICBub3QgaW5wdXQuZW52X21hcAogICAgaV9wcm9jZXNzID0gaW5wdXQuT0NJLlByb2Nlc3MKICAgIHNfbmFtZSA9IGlucHV0Lk9DSS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBwX3Byb2Nlc3MgPSBwX2NvbnRhaW5lci5PQ0kuUHJvY2VzcwogICAgYWxsb3dfZGVwcmVjYXRlZF9hcmdzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUpCiAgICByZXNwID0gQ3JlYXRlQ29udGFpbmVyUmVxdWVzdENvbW1vbihpbnB1dCkKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0MjogdHJ1ZSIpCn0KCkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb24ocmVxKTo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgICMgQ2hlY2sgaWYgdGhlIGlucHV0IHJlcXVlc3Qgc2hvdWxkIGJlIHJlamVjdGVkIGV2ZW4gYmVmb3JlIGNoZWNraW5nIHRoZQogICAgIyBwb2xpY3lfZGF0YS5jb250YWluZXJzIGluZm9ybWF0aW9uLgogICAgYWxsb3dfY3JlYXRlX2NvbnRhaW5lcl9pbnB1dChyZXEpCgogICAgaV9vY2kgOj0gcmVxLk9DSQogICAgaV9zdG9yYWdlcyA6PSByZXEuc3RvcmFnZXMKICAgIGlfZGV2aWNlcyA6PSByZXEuZGV2aWNlcwoKICAgICMgYXJyYXkgb2YgcG9zc2libGUgc3RhdGUgb3BlcmF0aW9ucwogICAgb3BzX2J1aWxkZXIgOj0gW10KCiAgICAjIGNoZWNrIHNhbmRib3ggbmFtZQogICAgc2FuZGJveF9uYW1lID0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FX0tFWV0KICAgIGFkZF9zYW5kYm94X25hbWVfdG9fc3RhdGUgOj0gc3RhdGVfYWxsb3dzKCJzYW5kYm94X25hbWUiLCBzYW5kYm94X25hbWUpCiAgICBvcHNfYnVpbGRlcjEgOj0gY29uY2F0X29wX2lmX25vdF9udWxsKG9wc19idWlsZGVyLCBhZGRfc2FuZGJveF9uYW1lX3RvX3N0YXRlKQoKICAgICMgQ2hlY2sgaWYgYW55IGVsZW1lbnQgZnJvbSB0aGUgcG9saWN5X2RhdGEuY29udGFpbmVycyBhcnJheSBhbGxvd3MgdGhlIGlucHV0IHJlcXVlc3QuCiAgICBzb21lIHBfY29udGFpbmVyIGluIHBvbGljeV9kYXRhLmNvbnRhaW5lcnMKICAgIHByaW50KCI9PT09PT09PSBDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiB0cnlpbmcgbmV4dCBwb2xpY3kgY29udGFpbmVyIikKCiAgICBwX3BpZG5zIDo9IHBfY29udGFpbmVyLnNhbmRib3hfcGlkbnMKICAgIGlfcGlkbnMgOj0gcmVxLnNhbmRib3hfcGlkbnMKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiBwX3BpZG5zID0iLCBwX3BpZG5zLCAiaV9waWRucyA9IiwgaV9waWRucykKICAgIHBfcGlkbnMgPT0gaV9waWRucwoKICAgIHBfb2NpIDo9IHBfY29udGFpbmVyLk9DSQoKICAgICMgY2hlY2sgbmFtZXNwYWNlCiAgICBwX25hbWVzcGFjZSA6PSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBpX25hbWVzcGFjZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwcmludCAoIkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb246IHBfbmFtZXNwYWNlID0iLCBwX25hbWVzcGFjZSwgImlfbmFtZXNwYWNlID0iLCBpX25hbWVzcGFjZSkKICAgIGFkZF9uYW1lc3BhY2VfdG9fc3RhdGUgOj0gYWxsb3dfbmFtZXNwYWNlKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkKICAgIG9wc19idWlsZGVyMiA6PSBjb25jYXRfb3BfaWZfbm90X251bGwob3BzX2J1aWxkZXIxLCBhZGRfbmFtZXNwYWNlX3RvX3N0YXRlKQoKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiBwIFZlcnNpb24gPSIsIHBfb2NpLlZlcnNpb24sICJpIFZlcnNpb24gPSIsIGlfb2NpLlZlcnNpb24pCiAgICBwX29jaS5WZXJzaW9uID09IGlfb2NpLlZlcnNpb24KCiAgICBwcmludCgiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdENvbW1vbjogcCBSZWFkb25seSA9IiwgcF9vY2kuUm9vdC5SZWFkb25seSwgImkgUmVhZG9ubHkgPSIsIGlfb2NpLlJvb3QuUmVhZG9ubHkpCiAgICBwX29jaS5Sb290LlJlYWRvbmx5ID09IGlfb2NpLlJvb3QuUmVhZG9ubHkKCiAgICBhbGxvd19hbm5vKHBfb2NpLCBpX29jaSkKCiAgICBwX3N0b3JhZ2VzIDo9IHBfY29udGFpbmVyLnN0b3JhZ2VzCiAgICBhbGxvd19ieV9hbm5vKHBfb2NpLCBpX29jaSwgcF9zdG9yYWdlcywgaV9zdG9yYWdlcykKCiAgICBwX2RldmljZXMgOj0gcF9jb250YWluZXIuZGV2aWNlcwogICAgYWxsb3dfZGV2aWNlcyhwX2RldmljZXMsIGlfZGV2aWNlcykKCiAgICByZXQgOj0gYWxsb3dfbGludXgob3BzX2J1aWxkZXIyLCBwX29jaSwgaV9vY2kpCiAgICByZXQuYWxsb3dlZAoKICAgIG9wcyA6PSByZXQub3BzCgogICAgcHJpbnQoIkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb246IHRydWUiKQp9CgphbGxvd19jcmVhdGVfY29udGFpbmVyX2lucHV0KHJlcSkgewogICAgcHJpbnQoImFsbG93X2NyZWF0ZV9jb250YWluZXJfaW5wdXQ6IGlucHV0ID0iLCByZXEpCgogICAgY291bnQocmVxLnNoYXJlZF9tb3VudHMpID09IDAKICAgIGlzX251bGwocmVxLnN0cmluZ191c2VyKQoKICAgIGlfb2NpIDo9IHJlcS5PQ0kKICAgIGlzX251bGwoaV9vY2kuSG9va3MpCiAgICBpc19udWxsKGlfb2NpLlNvbGFyaXMpCiAgICBpc19udWxsKGlfb2NpLldpbmRvd3MpCgogICAgaV9saW51eCA6PSBpX29jaS5MaW51eAogICAgY291bnQoaV9saW51eC5HSURNYXBwaW5ncykgPT0gMAogICAgY291bnQoaV9saW51eC5Nb3VudExhYmVsKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlJlc291cmNlcy5EZXZpY2VzKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlJvb3Rmc1Byb3BhZ2F0aW9uKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlVJRE1hcHBpbmdzKSA9PSAwCiAgICBpc19udWxsKGlfbGludXguSW50ZWxSZHQpCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLkJsb2NrSU8pCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLk5ldHdvcmspCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLlBpZHMpCiAgICBpc19udWxsKGlfbGludXguU2VjY29tcCkKCiAgICBpX3Byb2Nlc3MgOj0gaV9vY2kuUHJvY2VzcwogICAgY291bnQoaV9wcm9jZXNzLlNlbGludXhMYWJlbCkgPT0gMAogICAgY291bnQoaV9wcm9jZXNzLlVzZXIuVXNlcm5hbWUpID09IDAKCiAgICBwcmludCgiYWxsb3dfY3JlYXRlX2NvbnRhaW5lcl9pbnB1dDogdHJ1ZSIpCn0KCmFsbG93X25hbWVzcGFjZShwX25hbWVzcGFjZSwgaV9uYW1lc3BhY2UpID0gYWRkX25hbWVzcGFjZSB7CiAgICBwX25hbWVzcGFjZSA9PSBpX25hbWVzcGFjZQogICAgYWRkX25hbWVzcGFjZSA6PSBudWxsCiAgICBwcmludCgiYWxsb3dfbmFtZXNwYWNlIDE6IGlucHV0IG5hbWVzcGFjZSBtYXRjaGVzIHBvbGljeSBkYXRhIikKfQoKYWxsb3dfbmFtZXNwYWNlKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkgPSBhZGRfbmFtZXNwYWNlIHsKICAgIHBfbmFtZXNwYWNlID09ICIiCiAgICBwcmludCgiYWxsb3dfbmFtZXNwYWNlIDI6IG5vIG5hbWVzcGFjZSBmb3VuZCBvbiBwb2xpY3kgZGF0YSIpCiAgICBhZGRfbmFtZXNwYWNlIDo9IHN0YXRlX2FsbG93cygibmFtZXNwYWNlIiwgaV9uYW1lc3BhY2UpCn0KCiMgdmFsdWUgaGFzbid0IGJlZW4gc2VlbiBiZWZvcmUsIHNhdmUgaXQgdG8gc3RhdGUKc3RhdGVfYWxsb3dzKGtleSwgdmFsdWUpID0gYWN0aW9uIHsKICBzdGF0ZSA6PSBnZXRfc3RhdGUoKQogIHByaW50KCJzdGF0ZV9hbGxvd3MgMTogc3RhdGVba2V5XSA9Iiwgc3RhdGVba2V5XSwgInZhbHVlID0iLCB2YWx1ZSkKICBub3Qgc3RhdGVba2V5XQogIHByaW50KCJzdGF0ZV9hbGxvd3MgMTogc2F2aW5nIHRvIHN0YXRlIGtleSA9Iiwga2V5LCAidmFsdWUgPSIsIHZhbHVlKQogIHBhdGggOj0gZ2V0X3N0YXRlX3BhdGgoa2V5KSAKICBhY3Rpb24gOj0gewogICAgIm9wIjogImFkZCIsCiAgICAicGF0aCI6IHBhdGgsIAogICAgInZhbHVlIjogdmFsdWUsCiAgfQp9CgojIHZhbHVlIG1hdGNoZXMgd2hhdCdzIGluIHN0YXRlLCBhbGxvdyBpdApzdGF0ZV9hbGxvd3Moa2V5LCB2YWx1ZSkgPSBhY3Rpb24gewogIHByaW50KCJzdGF0ZV9hbGxvd3MgMjogc3RhcnQiKQogIHN0YXRlIDo9IGdldF9zdGF0ZSgpCiAgcHJpbnQoInN0YXRlX2FsbG93cyAyOiBzdGF0ZVtrZXldID0iLCBzdGF0ZVtrZXldLCAidmFsdWUgPSIsIHZhbHVlKQogIHZhbHVlID09IHN0YXRlW2tleV0KICBwcmludCgic3RhdGVfYWxsb3dzIDI6IGZvdW5kIGtleSA9Iiwga2V5LCAidmFsdWUgPSIsIHZhbHVlLCAiIGluIHN0YXRlIikKICBhY3Rpb24gOj0gbnVsbAp9CgojIGhlbHBlciBmdW5jdGlvbnMgdG8gaW50ZXJhY3Qgd2l0aCB0aGUgc3RhdGUKZ2V0X3N0YXRlKCkgPSBzdGF0ZSB7CiAgc3RhdGUgOj0gZGF0YVsicHN0YXRlIl0KfQoKZ2V0X3N0YXRlX3ZhbChrZXkpID0gdmFsdWUgewogICAgc3RhdGUgOj0gZ2V0X3N0YXRlKCkKICAgIHZhbHVlIDo9IHN0YXRlW2tleV0KfQoKZ2V0X3N0YXRlX3BhdGgoa2V5KSA9IHBhdGggewogICAgIyBwcmVwZW5kICIvcHN0YXRlLyIgdG8ga2V5CiAgICBwYXRoIDo9IGNvbmNhdCgiLyIsIFsiL3BzdGF0ZSIsIGtleV0pCn0KCiMgSGVscGVyIGZ1bmN0aW9ucyB0byBjb25kaXRpb25hbGx5IGNvbmNhdGVuYXRlIG9wIGlzIG5vdCBudWxsCmNvbmNhdF9vcF9pZl9ub3RfbnVsbChvcHMsIG9wKSA9IHJlc3VsdCB7CiAgICBvcCA9PSBudWxsCiAgICByZXN1bHQgOj0gb3BzCn0KCmNvbmNhdF9vcF9pZl9ub3RfbnVsbChvcHMsIG9wKSA9IHJlc3VsdCB7CiAgICBvcCAhPSBudWxsCiAgICByZXN1bHQgOj0gYXJyYXkuY29uY2F0KG9wcywgW29wXSkKfQoKIyBSZWplY3QgdW5leHBlY3RlZCBhbm5vdGF0aW9ucy4KYWxsb3dfYW5ubyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19hbm5vIDE6IHN0YXJ0IikKCiAgICBub3QgaV9vY2kuQW5ub3RhdGlvbnMKCiAgICBwcmludCgiYWxsb3dfYW5ubyAxOiB0cnVlIikKfQphbGxvd19hbm5vKHBfb2NpLCBpX29jaSkgewogICAgcHJpbnQoImFsbG93X2Fubm8gMjogcCBBbm5vdGF0aW9ucyA9IiwgcF9vY2kuQW5ub3RhdGlvbnMpCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiBpIEFubm90YXRpb25zID0iLCBpX29jaS5Bbm5vdGF0aW9ucykKCiAgICBpX2tleXMgOj0gb2JqZWN0LmtleXMoaV9vY2kuQW5ub3RhdGlvbnMpCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiBpIGtleXMgPSIsIGlfa2V5cykKCiAgICBldmVyeSBpX2tleSBpbiBpX2tleXMgewogICAgICAgIGFsbG93X2Fubm9fa2V5KGlfa2V5LCBwX29jaSkKICAgIH0KCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiB0cnVlIikKfQoKYWxsb3dfYW5ub19rZXkoaV9rZXksIHBfb2NpKSB7CiAgICBwcmludCgiYWxsb3dfYW5ub19rZXkgMTogaSBrZXkgPSIsIGlfa2V5KQoKICAgIHN0YXJ0c3dpdGgoaV9rZXksICJpby5rdWJlcm5ldGVzLmNyaS4iKQoKICAgIHByaW50KCJhbGxvd19hbm5vX2tleSAxOiB0cnVlIikKfQphbGxvd19hbm5vX2tleShpX2tleSwgcF9vY2kpIHsKICAgIHByaW50KCJhbGxvd19hbm5vX2tleSAyOiBpIGtleSA9IiwgaV9rZXkpCgogICAgc29tZSBwX2tleSwgXyBpbiBwX29jaS5Bbm5vdGF0aW9ucwogICAgcF9rZXkgPT0gaV9rZXkKCiAgICBwcmludCgiYWxsb3dfYW5ub19rZXkgMjogdHJ1ZSIpCn0KCiMgR2V0IHRoZSB2YWx1ZSBvZiB0aGUgU19OQU1FX0tFWSBhbm5vdGF0aW9uIGFuZAojIGNvcnJlbGF0ZSBpdCB3aXRoIG90aGVyIGFubm90YXRpb25zIGFuZCBwcm9jZXNzIGZpZWxkcy4KYWxsb3dfYnlfYW5ubyhwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpIHsKICAgIHByaW50KCJhbGxvd19ieV9hbm5vIDE6IHN0YXJ0IikKCiAgICBub3QgcF9vY2kuQW5ub3RhdGlvbnNbU19OQU1FX0tFWV0KCiAgICBpX3NfbmFtZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMTogaV9zX25hbWUgPSIsIGlfc19uYW1lKQoKICAgIGlfc19uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FU1BBQ0VfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMTogaV9zX25hbWVzcGFjZSA9IiwgaV9zX25hbWVzcGFjZSkKCiAgICBhbGxvd19ieV9zYW5kYm94X25hbWUocF9vY2ksIGlfb2NpLCBwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBpX3NfbmFtZSwgaV9zX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfYnlfYW5ubyAxOiB0cnVlIikKfQphbGxvd19ieV9hbm5vKHBfb2NpLCBpX29jaSwgcF9zdG9yYWdlcywgaV9zdG9yYWdlcykgewogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMjogc3RhcnQiKQoKICAgIHBfc19uYW1lIDo9IHBfb2NpLkFubm90YXRpb25zW1NfTkFNRV9LRVldCiAgICBpX3NfbmFtZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMjogaV9zX25hbWUgPSIsIGlfc19uYW1lLCAicF9zX25hbWUgPSIsIHBfc19uYW1lKQoKICAgIGFsbG93X3NhbmRib3hfbmFtZShwX3NfbmFtZSwgaV9zX25hbWUpCgogICAgaV9zX25hbWVzcGFjZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwcmludCgiYWxsb3dfYnlfYW5ubyAyOiBpX3NfbmFtZXNwYWNlID0iLCBpX3NfbmFtZXNwYWNlKQoKICAgIGFsbG93X2J5X3NhbmRib3hfbmFtZShwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMsIGlfc19uYW1lLCBpX3NfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd19ieV9hbm5vIDI6IHRydWUiKQp9CgphbGxvd19ieV9zYW5kYm94X25hbWUocF9vY2ksIGlfb2NpLCBwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfYnlfc2FuZGJveF9uYW1lOiBzdGFydCIpCgogICAgaV9uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FU1BBQ0VfS0VZXQoKICAgIGFsbG93X2J5X2NvbnRhaW5lcl90eXBlcyhwX29jaSwgaV9vY2ksIHNfbmFtZSwgaV9uYW1lc3BhY2UpCiAgICBhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZChwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpCiAgICBhbGxvd19wcm9jZXNzKHBfb2NpLlByb2Nlc3MsIGlfb2NpLlByb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpCgogICAgcHJpbnQoImFsbG93X2J5X3NhbmRib3hfbmFtZTogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfbmFtZShwX3NfbmFtZSwgaV9zX25hbWUpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X25hbWU6IHN0YXJ0IikKICAgIHJlZ2V4Lm1hdGNoKHBfc19uYW1lLCBpX3NfbmFtZSkKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9uYW1lOiB0cnVlIikKfQoKIyBDaGVjayB0aGF0IHRoZSAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLXR5cGUiIGFuZAojICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIiBhbm5vdGF0aW9ucyBkZXNpZ25hdGUgdGhlCiMgZXhwZWN0ZWQgdHlwZSAtIGVpdGhlciBhICJzYW5kYm94IiBvciBhICJjb250YWluZXIiLiBUaGVuLCB2YWxpZGF0ZQojIG90aGVyIGFubm90YXRpb25zIGJhc2VkIG9uIHRoZSBhY3R1YWwgInNhbmRib3giIG9yICJjb250YWluZXIiIHZhbHVlCiMgZnJvbSB0aGUgaW5wdXQgY29udGFpbmVyLgphbGxvd19ieV9jb250YWluZXJfdHlwZXMocF9vY2ksIGlfb2NpLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfYnlfY29udGFpbmVyX3R5cGVzOiBjaGVja2luZyBpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSIpCgogICAgY190eXBlIDo9ICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSIKICAgIAogICAgcF9jcmlfdHlwZSA6PSBwX29jaS5Bbm5vdGF0aW9uc1tjX3R5cGVdCiAgICBpX2NyaV90eXBlIDo9IGlfb2NpLkFubm90YXRpb25zW2NfdHlwZV0KICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZXM6IHBfY3JpX3R5cGUgPSIsIHBfY3JpX3R5cGUsICJpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgcF9jcmlfdHlwZSA9PSBpX2NyaV90eXBlCgogICAgYWxsb3dfYnlfY29udGFpbmVyX3R5cGUoaV9jcmlfdHlwZSwgcF9vY2ksIGlfb2NpLCBzX25hbWUsIHNfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZXM6IHRydWUiKQp9CgphbGxvd19ieV9jb250YWluZXJfdHlwZShpX2NyaV90eXBlLCBwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAxOiBpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgaV9jcmlfdHlwZSA9PSAic2FuZGJveCIKCiAgICBpX2thdGFfdHlwZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1siaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5jb250YWluZXJfdHlwZSJdCiAgICBwcmludCgiYWxsb3dfYnlfY29udGFpbmVyX3R5cGUgMTogaV9rYXRhX3R5cGUgPSIsIGlfa2F0YV90eXBlKQogICAgaV9rYXRhX3R5cGUgPT0gInBvZF9zYW5kYm94IgoKICAgIGFsbG93X3NhbmRib3hfY29udGFpbmVyX25hbWUocF9vY2ksIGlfb2NpKQogICAgYWxsb3dfc2FuZGJveF9uZXRfbmFtZXNwYWNlKHBfb2NpLCBpX29jaSkKICAgIGFsbG93X3NhbmRib3hfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpCgogICAgcHJpbnQoImFsbG93X2J5X2NvbnRhaW5lcl90eXBlIDE6IHRydWUiKQp9CgphbGxvd19ieV9jb250YWluZXJfdHlwZShpX2NyaV90eXBlLCBwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiBpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgaV9jcmlfdHlwZSA9PSAiY29udGFpbmVyIgoKICAgIGlfa2F0YV90eXBlIDo9IGlfb2NpLkFubm90YXRpb25zWyJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIl0KICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiBpX2thdGFfdHlwZSA9IiwgaV9rYXRhX3R5cGUpCiAgICBpX2thdGFfdHlwZSA9PSAicG9kX2NvbnRhaW5lciIKCiAgICBhbGxvd19jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpCiAgICBhbGxvd19uZXRfbmFtZXNwYWNlKHBfb2NpLCBpX29jaSkKICAgIGFsbG93X2xvZ19kaXJlY3RvcnkocF9vY2ksIGlfb2NpKQoKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiB0cnVlIikKfQoKIyAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLW5hbWUiIGFubm90YXRpb24KYWxsb3dfc2FuZGJveF9jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X2NvbnRhaW5lcl9uYW1lOiBzdGFydCIpCgogICAgY29udGFpbmVyX2Fubm90YXRpb25fbWlzc2luZyhwX29jaSwgaV9vY2ksICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItbmFtZSIpCgogICAgcHJpbnQoImFsbG93X3NhbmRib3hfY29udGFpbmVyX25hbWU6IHRydWUiKQp9CgphbGxvd19jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19jb250YWluZXJfbmFtZTogc3RhcnQiKQoKICAgIGFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uKHBfb2NpLCBpX29jaSwgImlvLmt1YmVybmV0ZXMuY3JpLmNvbnRhaW5lci1uYW1lIikKCiAgICBwcmludCgiYWxsb3dfY29udGFpbmVyX25hbWU6IHRydWUiKQp9Cgpjb250YWluZXJfYW5ub3RhdGlvbl9taXNzaW5nKHBfb2NpLCBpX29jaSwga2V5KSB7CiAgICBwcmludCgiY29udGFpbmVyX2Fubm90YXRpb25fbWlzc2luZzoiLCBrZXkpCgogICAgbm90IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIG5vdCBpX29jaS5Bbm5vdGF0aW9uc1trZXldCgogICAgcHJpbnQoImNvbnRhaW5lcl9hbm5vdGF0aW9uX21pc3Npbmc6IHRydWUiKQp9CgphbGxvd19jb250YWluZXJfYW5ub3RhdGlvbihwX29jaSwgaV9vY2ksIGtleSkgewogICAgcHJpbnQoImFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uOiBrZXkgPSIsIGtleSkKCiAgICBwX3ZhbHVlIDo9IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIGlfdmFsdWUgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgcHJpbnQoImFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uOiBwX3ZhbHVlID0iLCBwX3ZhbHVlLCAiaV92YWx1ZSA9IiwgaV92YWx1ZSkKCiAgICBwX3ZhbHVlID09IGlfdmFsdWUKCiAgICBwcmludCgiYWxsb3dfY29udGFpbmVyX2Fubm90YXRpb246IHRydWUiKQp9CgojICJuZXJkY3RsL25ldHdvcmstbmFtZXNwYWNlIiBhbm5vdGF0aW9uCmFsbG93X3NhbmRib3hfbmV0X25hbWVzcGFjZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X25ldF9uYW1lc3BhY2U6IHN0YXJ0IikKCiAgICBrZXkgOj0gIm5lcmRjdGwvbmV0d29yay1uYW1lc3BhY2UiCgogICAgcF9uYW1lc3BhY2UgOj0gcF9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgaV9uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgcHJpbnQoImFsbG93X3NhbmRib3hfbmV0X25hbWVzcGFjZTogcF9uYW1lc3BhY2UgPSIsIHBfbmFtZXNwYWNlLCAiaV9uYW1lc3BhY2UgPSIsIGlfbmFtZXNwYWNlKQoKICAgIHJlZ2V4Lm1hdGNoKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9uZXRfbmFtZXNwYWNlOiB0cnVlIikKfQoKYWxsb3dfbmV0X25hbWVzcGFjZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19uZXRfbmFtZXNwYWNlOiBzdGFydCIpCgogICAga2V5IDo9ICJuZXJkY3RsL25ldHdvcmstbmFtZXNwYWNlIgoKICAgIG5vdCBwX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICBub3QgaV9vY2kuQW5ub3RhdGlvbnNba2V5XQoKICAgIHByaW50KCJhbGxvd19uZXRfbmFtZXNwYWNlOiB0cnVlIikKfQoKIyAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1sb2ctZGlyZWN0b3J5IiBhbm5vdGF0aW9uCmFsbG93X3NhbmRib3hfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X2xvZ19kaXJlY3Rvcnk6IHN0YXJ0IikKCiAgICBrZXkgOj0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbG9nLWRpcmVjdG9yeSIKCiAgICBwX2RpciA6PSBwX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICByZWdleDEgOj0gcmVwbGFjZShwX2RpciwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHJlZ2V4MiA6PSByZXBsYWNlKHJlZ2V4MSwgIiQoc2FuZGJveC1uYW1lc3BhY2UpIiwgc19uYW1lc3BhY2UpCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiByZWdleDIgPSIsIHJlZ2V4MikKCiAgICBpX2RpciA6PSBpX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiBpX2RpciA9IiwgaV9kaXIpCgogICAgcmVnZXgubWF0Y2gocmVnZXgyLCBpX2RpcikKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiB0cnVlIikKfQoKYWxsb3dfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19sb2dfZGlyZWN0b3J5OiBzdGFydCIpCgogICAga2V5IDo9ICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWxvZy1kaXJlY3RvcnkiCgogICAgbm90IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIG5vdCBpX29jaS5Bbm5vdGF0aW9uc1trZXldCgogICAgcHJpbnQoImFsbG93X2xvZ19kaXJlY3Rvcnk6IHRydWUiKQp9CgphbGxvd19kZXZpY2VzKHBfZGV2aWNlcywgaV9kZXZpY2VzKSB7CiAgICBwcmludCgiYWxsb3dfZGV2aWNlczogc3RhcnQiKQogICAgZXZlcnkgaV9kZXZpY2UgaW4gaV9kZXZpY2VzIHsKICAgICAgICBwcmludCgiYWxsb3dfZGV2aWNlczogaV9kZXZpY2UgPSIsIGlfZGV2aWNlKQogICAgICAgIHNvbWUgcF9kZXZpY2UgaW4gcF9kZXZpY2VzCiAgICAgICAgcF9kZXZpY2UuY29udGFpbmVyX3BhdGggPT0gaV9kZXZpY2UuY29udGFpbmVyX3BhdGgKICAgIH0KICAgIHByaW50KCJhbGxvd19kZXZpY2VzOiB0cnVlIikKfQoKYWxsb3dfbGludXgoc3RhdGVfb3BzLCBwX29jaSwgaV9vY2kpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIHBfbmFtZXNwYWNlcyA6PSBwX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbGludXg6IHAgbmFtZXNwYWNlcyA9IiwgcF9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlcyA6PSBpX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbGludXg6IGkgbmFtZXNwYWNlcyA9IiwgaV9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlX3dpdGhvdXRfbmV0d29yayA6PSBbb2JqIHwgb2JqIDo9IGlfbmFtZXNwYWNlc1tfXTsgb2JqLlR5cGUgIT0gIm5ldHdvcmsiXQoKICAgIHByaW50KCJhbGxvd19saW51eDogaV9uYW1lc3BhY2Vfd2l0aG91dF9uZXR3b3JrID0iLCBpX25hbWVzcGFjZV93aXRob3V0X25ldHdvcmspCgogICAgcF9uYW1lc3BhY2VzID09IGlfbmFtZXNwYWNlX3dpdGhvdXRfbmV0d29yawoKICAgIGFsbG93X21hc2tlZF9wYXRocyhwX29jaSwgaV9vY2kpCiAgICBhbGxvd19yZWFkb25seV9wYXRocyhwX29jaSwgaV9vY2kpCiAgICBhbGxvd19saW51eF9kZXZpY2VzKHBfb2NpLkxpbnV4LkRldmljZXMsIGlfb2NpLkxpbnV4LkRldmljZXMpCiAgICBhbGxvd19saW51eF9zeXNjdGwocF9vY2kuTGludXgsIGlfb2NpLkxpbnV4KQogICAgcmV0IDo9IGFsbG93X25ldHdvcmtfbmFtZXNwYWNlX3N0YXJ0KHN0YXRlX29wcywgcF9vY2ksIGlfb2NpKQogICAgcmV0LmFsbG93ZWQKCiAgICBvcHMgOj0gcmV0Lm9wcwoKICAgIHByaW50KCJhbGxvd19saW51eDogdHJ1ZSIpCn0KCiMgUmV0cmlldmUgdGhlICJuZXR3b3JrIiBuYW1lc3BhY2UgZnJvbSB0aGUgaW5wdXQgZGF0YSBhbmQgcGFzcyBpdCBvbiBmb3IgdGhlCiMgbmV0d29yayBuYW1lc3BhY2UgcG9saWN5IGNoZWNrcy4KYWxsb3dfbmV0d29ya19uYW1lc3BhY2Vfc3RhcnQoc3RhdGVfb3BzLCBwX29jaSwgaV9vY2kpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIHByaW50KCJhbGxvd19uZXR3b3JrX25hbWVzcGFjZSBzdGFydDogc3RhcnQiKQoKICAgIHBfbmFtZXNwYWNlcyA6PSBwX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IHAgbmFtZXNwYWNlcyA9IiwgcF9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlcyA6PSBpX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IGkgbmFtZXNwYWNlcyA9IiwgaV9uYW1lc3BhY2VzKQoKICAgICMgUmV0dXJuIHBhdGggb2YgdGhlICJuZXR3b3JrIiBuYW1lc3BhY2UKICAgIG5ldHdvcmtfbnMgOj0gW29iaiB8IG9iaiA6PSBpX25hbWVzcGFjZXNbX107IG9iai5UeXBlID09ICJuZXR3b3JrIl0KCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IG5ldHdvcmtfbnMgPSIsIG5ldHdvcmtfbnMpCgogICAgcmV0IDo9IGFsbG93X25ldHdvcmtfbmFtZXNwYWNlKHN0YXRlX29wcywgbmV0d29ya19ucykKICAgIHJldC5hbGxvd2VkCgogICAgb3BzIDo9IHJldC5vcHMKfQoKIyBUaGlzIHJ1bGUgaXMgd2hlbiB0aGVyZSdzIG5vIG5ldHdvcmsgbmFtZXNwYWNlIGluIHRoZSBpbnB1dCBkYXRhLgphbGxvd19uZXR3b3JrX25hbWVzcGFjZShzdGF0ZV9vcHMsIG5ldHdvcmtfbnMpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIGNvdW50KG5ldHdvcmtfbnMpID09IDAKCiAgICBuZXR3b3JrX25zX3BhdGggPSAiIgoKICAgIGFkZF9uZXR3b3JrX25hbWVzcGFjZV90b19zdGF0ZSA6PSBzdGF0ZV9hbGxvd3MoIm5ldHdvcmtfbmFtZXNwYWNlIiwgbmV0d29ya19uc19wYXRoKQogICAgb3BzIDo9IGNvbmNhdF9vcF9pZl9ub3RfbnVsbChzdGF0ZV9vcHMsIGFkZF9uZXR3b3JrX25hbWVzcGFjZV90b19zdGF0ZSkKCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2UgMTogdHJ1ZSIpCn0KCiMgVGhpcyBydWxlIGlzIHdoZW4gdGhlcmUncyBleGFjdGx5IG9uZSBuZXR3b3JrIG5hbWVzcGFjZSBpbiB0aGUgaW5wdXQgZGF0YS4KYWxsb3dfbmV0d29ya19uYW1lc3BhY2Uoc3RhdGVfb3BzLCBuZXR3b3JrX25zKSA6PSB7Im9wcyI6IG9wcywgImFsbG93ZWQiOiB0cnVlfSB7CiAgICBjb3VudChuZXR3b3JrX25zKSA9PSAxCgogICAgYWRkX25ldHdvcmtfbmFtZXNwYWNlX3RvX3N0YXRlIDo9IHN0YXRlX2FsbG93cygibmV0d29ya19uYW1lc3BhY2UiLCBuZXR3b3JrX25zWzBdLlBhdGgpCiAgICBvcHMgOj0gY29uY2F0X29wX2lmX25vdF9udWxsKHN0YXRlX29wcywgYWRkX25ldHdvcmtfbmFtZXNwYWNlX3RvX3N0YXRlKQoKICAgIHByaW50KCJhbGxvd19uZXR3b3JrX25hbWVzcGFjZSAyOiB0cnVlIikKfQoKYWxsb3dfbWFza2VkX3BhdGhzKHBfb2NpLCBpX29jaSkgewogICAgcF9wYXRocyA6PSBwX29jaS5MaW51eC5NYXNrZWRQYXRocwogICAgcHJpbnQoImFsbG93X21hc2tlZF9wYXRocyAxOiBwX3BhdGhzID0iLCBwX3BhdGhzKQoKICAgIGlfcGF0aHMgOj0gaV9vY2kuTGludXguTWFza2VkUGF0aHMKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aHMgMTogaV9wYXRocyA9IiwgaV9wYXRocykKCiAgICBhbGxvd19tYXNrZWRfcGF0aHNfYXJyYXkocF9wYXRocywgaV9wYXRocykKCiAgICBwcmludCgiYWxsb3dfbWFza2VkX3BhdGhzIDE6IHRydWUiKQp9CmFsbG93X21hc2tlZF9wYXRocyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aHMgMjogc3RhcnQiKQoKICAgIG5vdCBwX29jaS5MaW51eC5NYXNrZWRQYXRocwogICAgbm90IGlfb2NpLkxpbnV4Lk1hc2tlZFBhdGhzCgogICAgcHJpbnQoImFsbG93X21hc2tlZF9wYXRocyAyOiB0cnVlIikKfQoKIyBBbGwgdGhlIHBvbGljeSBtYXNrZWQgcGF0aHMgbXVzdCBiZSBtYXNrZWQgaW4gdGhlIGlucHV0IGRhdGEgdG9vLgojIElucHV0IGlzIGFsbG93ZWQgdG8gaGF2ZSBtb3JlIG1hc2tlZCBwYXRocyB0aGFuIHRoZSBwb2xpY3kuCmFsbG93X21hc2tlZF9wYXRoc19hcnJheShwX2FycmF5LCBpX2FycmF5KSB7CiAgICBldmVyeSBwX2VsZW0gaW4gcF9hcnJheSB7CiAgICAgICAgYWxsb3dfbWFza2VkX3BhdGgocF9lbGVtLCBpX2FycmF5KQogICAgfQp9CgphbGxvd19tYXNrZWRfcGF0aChwX2VsZW0sIGlfYXJyYXkpIHsKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aDogcF9lbGVtID0iLCBwX2VsZW0pCgogICAgc29tZSBpX2VsZW0gaW4gaV9hcnJheQogICAgcF9lbGVtID09IGlfZWxlbQoKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aDogdHJ1ZSIpCn0KCmFsbG93X3JlYWRvbmx5X3BhdGhzKHBfb2NpLCBpX29jaSkgewogICAgcF9wYXRocyA6PSBwX29jaS5MaW51eC5SZWFkb25seVBhdGhzCiAgICBwcmludCgiYWxsb3dfcmVhZG9ubHlfcGF0aHMgMTogcF9wYXRocyA9IiwgcF9wYXRocykKCiAgICBpX3BhdGhzIDo9IGlfb2NpLkxpbnV4LlJlYWRvbmx5UGF0aHMKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAxOiBpX3BhdGhzID0iLCBpX3BhdGhzKQoKICAgIGFsbG93X3JlYWRvbmx5X3BhdGhzX2FycmF5KHBfcGF0aHMsIGlfcGF0aHMsIGlfb2NpLkxpbnV4Lk1hc2tlZFBhdGhzKQoKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAxOiB0cnVlIikKfQphbGxvd19yZWFkb25seV9wYXRocyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAyOiBzdGFydCIpCgogICAgbm90IHBfb2NpLkxpbnV4LlJlYWRvbmx5UGF0aHMKICAgIG5vdCBpX29jaS5MaW51eC5SZWFkb25seVBhdGhzCgogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGhzIDI6IHRydWUiKQp9CgojIEFsbCB0aGUgcG9saWN5IHJlYWRvbmx5IHBhdGhzIG11c3QgYmUgZWl0aGVyOgojIC0gUHJlc2VudCBpbiB0aGUgaW5wdXQgcmVhZG9ubHkgcGF0aHMsIG9yCiMgLSBQcmVzZW50IGluIHRoZSBpbnB1dCBtYXNrZWQgcGF0aHMuCiMgSW5wdXQgaXMgYWxsb3dlZCB0byBoYXZlIG1vcmUgcmVhZG9ubHkgcGF0aHMgdGhhbiB0aGUgcG9saWN5LgphbGxvd19yZWFkb25seV9wYXRoc19hcnJheShwX2FycmF5LCBpX2FycmF5LCBtYXNrZWRfcGF0aHMpIHsKICAgIGV2ZXJ5IHBfZWxlbSBpbiBwX2FycmF5IHsKICAgICAgICBhbGxvd19yZWFkb25seV9wYXRoKHBfZWxlbSwgaV9hcnJheSwgbWFza2VkX3BhdGhzKQogICAgfQp9CgphbGxvd19yZWFkb25seV9wYXRoKHBfZWxlbSwgaV9hcnJheSwgbWFza2VkX3BhdGhzKSB7CiAgICBwcmludCgiYWxsb3dfcmVhZG9ubHlfcGF0aCAxOiBwX2VsZW0gPSIsIHBfZWxlbSkKCiAgICBzb21lIGlfZWxlbSBpbiBpX2FycmF5CiAgICBwX2VsZW0gPT0gaV9lbGVtCgogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGggMTogdHJ1ZSIpCn0KYWxsb3dfcmVhZG9ubHlfcGF0aChwX2VsZW0sIGlfYXJyYXksIG1hc2tlZF9wYXRocykgewogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGggMjogcF9lbGVtID0iLCBwX2VsZW0pCgogICAgc29tZSBpX21hc2tlZCBpbiBtYXNrZWRfcGF0aHMKICAgIHBfZWxlbSA9PSBpX21hc2tlZAoKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRoIDI6IHRydWUiKQp9CgphbGxvd19saW51eF9kZXZpY2VzKHBfZGV2aWNlcywgaV9kZXZpY2VzKSB7CiAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogc3RhcnQiKQogICAgZXZlcnkgaV9kZXZpY2UgaW4gaV9kZXZpY2VzIHsKICAgICAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogaV9kZXZpY2UgPSIsIGlfZGV2aWNlKQogICAgICAgIHNvbWUgcF9kZXZpY2UgaW4gcF9kZXZpY2VzCiAgICAgICAgaV9kZXZpY2UuUGF0aCA9PSBwX2RldmljZS5QYXRoCiAgICB9CiAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogdHJ1ZSIpCn0KCmFsbG93X2xpbnV4X3N5c2N0bChwX2xpbnV4LCBpX2xpbnV4KSB7CiAgICBwcmludCgiYWxsb3dfbGludXhfc3lzY3RsIDE6IHN0YXJ0IikKICAgIG5vdCBpX2xpbnV4LlN5c2N0bAogICAgcHJpbnQoImFsbG93X2xpbnV4X3N5c2N0bCAxOiB0cnVlIikKfQoKYWxsb3dfbGludXhfc3lzY3RsKHBfbGludXgsIGlfbGludXgpIHsKICAgIHByaW50KCJhbGxvd19saW51eF9zeXNjdGwgMjogc3RhcnQiKQogICAgcF9zeXNjdGwgOj0gcF9saW51eC5TeXNjdGwKICAgIGlfc3lzY3RsIDo9IGlfbGludXguU3lzY3RsCiAgICBldmVyeSBpX25hbWUsIGlfdmFsIGluIGlfc3lzY3RsIHsKICAgICAgICBwcmludCgiYWxsb3dfbGludXhfc3lzY3RsIDI6IGlfbmFtZSA9IiwgaV9uYW1lLCAiaV92YWwgPSIsIGlfdmFsKQogICAgICAgIHBfc3lzY3RsW2lfbmFtZV0gPT0gaV92YWwKICAgIH0KICAgIHByaW50KCJhbGxvd19saW51eF9zeXNjdGwgMjogdHJ1ZSIpCn0KCiMgQ2hlY2sgdGhlIGNvbnNpc3RlbmN5IG9mIHRoZSBpbnB1dCAiaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5idW5kbGVfcGF0aCIKIyBhbmQgaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCIgdmFsdWVzIHdpdGggb3RoZXIgZmllbGRzLgphbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZChwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpIHsKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogc3RhcnQiKQoKICAgIGJ1bmRsZV9wYXRoIDo9IGlfb2NpLkFubm90YXRpb25zWyJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmJ1bmRsZV9wYXRoIl0KICAgIGJ1bmRsZV9pZCA6PSByZXBsYWNlKGJ1bmRsZV9wYXRoLCAiL3J1bi9jb250YWluZXJkL2lvLmNvbnRhaW5lcmQucnVudGltZS52Mi50YXNrL2s4cy5pby8iLCAiIikKCiAgICBidW5kbGVfaWRfZm9ybWF0IDo9IGNvbmNhdCgiIiwgWyJeIiwgQlVORExFX0lELCAiJCJdKQogICAgcmVnZXgubWF0Y2goYnVuZGxlX2lkX2Zvcm1hdCwgYnVuZGxlX2lkKQoKICAgIGtleSA6PSAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCIKCiAgICBwX3JlZ2V4IDo9IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIHNhbmRib3hfaWQgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQoKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogc2FuZGJveF9pZCA9Iiwgc2FuZGJveF9pZCwgInJlZ2V4ID0iLCBwX3JlZ2V4KQogICAgcmVnZXgubWF0Y2gocF9yZWdleCwgc2FuZGJveF9pZCkKCiAgICBhbGxvd19yb290X3BhdGgocF9vY2ksIGlfb2NpLCBidW5kbGVfaWQpCgogICAgZXZlcnkgaV9tb3VudCBpbiBpX29jaS5Nb3VudHMgewogICAgICAgIGFsbG93X21vdW50KHBfb2NpLCBpX21vdW50LCBpX3N0b3JhZ2VzLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpCiAgICB9CgogICAgYWxsb3dfc3RvcmFnZXMocF9zdG9yYWdlcywgaV9zdG9yYWdlcywgYnVuZGxlX2lkLCBzYW5kYm94X2lkKQoKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogdHJ1ZSIpCn0KCmFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHBfcHJvY2VzcyA9IiwgcF9wcm9jZXNzKQogICAgcHJpbnQoImFsbG93X3Byb2Nlc3NfY29tbW9uOiBpX3Byb2Nlc3MgPSAiLCBpX3Byb2Nlc3MpCiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHNfbmFtZSA9Iiwgc19uYW1lKQoKICAgIHBfcHJvY2Vzcy5Dd2QgPT0gaV9wcm9jZXNzLkN3ZAogICAgcF9wcm9jZXNzLk5vTmV3UHJpdmlsZWdlcyA9PSBpX3Byb2Nlc3MuTm9OZXdQcml2aWxlZ2VzCgogICAgYWxsb3dfdXNlcihwX3Byb2Nlc3MsIGlfcHJvY2VzcykKICAgIGFsbG93X2VudihwX3Byb2Nlc3MsIGlfcHJvY2Vzcywgc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHRydWUiKQp9CgojIENvbXBhcmUgdGhlIE9DSSBQcm9jZXNzIGZpZWxkIG9mIGEgcG9saWN5IGNvbnRhaW5lciB3aXRoIHRoZSBpbnB1dCBPQ0kgUHJvY2VzcyBmcm9tIGEgQ3JlYXRlQ29udGFpbmVyUmVxdWVzdAphbGxvd19wcm9jZXNzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfcHJvY2Vzczogc3RhcnQiKQoKICAgIGFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgYWxsb3dfY2FwcyhwX3Byb2Nlc3MuQ2FwYWJpbGl0aWVzLCBpX3Byb2Nlc3MuQ2FwYWJpbGl0aWVzKQogICAgcF9wcm9jZXNzLlRlcm1pbmFsID09IGlfcHJvY2Vzcy5UZXJtaW5hbAoKICAgIHByaW50KCJhbGxvd19wcm9jZXNzOiB0cnVlIikKfQoKIyBDb21wYXJlIHRoZSBPQ0kgUHJvY2VzcyBmaWVsZCBvZiBhIHBvbGljeSBjb250YWluZXIgd2l0aCB0aGUgaW5wdXQgcHJvY2VzcyBmaWVsZCBmcm9tIEV4ZWNQcm9jZXNzUmVxdWVzdAphbGxvd19pbnRlcmFjdGl2ZV9wcm9jZXNzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfaW50ZXJhY3RpdmVfcHJvY2Vzczogc3RhcnQiKQoKICAgIGFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgYWxsb3dfZXhlY19jYXBzKGlfcHJvY2Vzcy5DYXBhYmlsaXRpZXMpCgogICAgIyBUaGVzZSBhcmUgY29tbWFuZHMgZW5hYmxlZCB1c2luZyBFeGVjUHJvY2Vzc1JlcXVlc3QgY29tbWFuZHMgYW5kL29yIHJlZ2V4IGZyb20gdGhlIHNldHRpbmdzIGZpbGUuCiAgICAjIFRoZXkgY2FuIGJlIGV4ZWN1dGVkIGludGVyYWN0aXZlbHkgc28gYWxsb3cgdGhlbSB0byB1c2UgYW55IHZhbHVlIGZvciBpX3Byb2Nlc3MuVGVybWluYWwuCgogICAgcHJpbnQoImFsbG93X2ludGVyYWN0aXZlX3Byb2Nlc3M6IHRydWUiKQp9CgojIENvbXBhcmUgdGhlIE9DSSBQcm9jZXNzIGZpZWxkIG9mIGEgcG9saWN5IGNvbnRhaW5lciB3aXRoIHRoZSBpbnB1dCBwcm9jZXNzIGZpZWxkIGZyb20gRXhlY1Byb2Nlc3NSZXF1ZXN0CmFsbG93X3Byb2JlX3Byb2Nlc3MocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19wcm9iZV9wcm9jZXNzOiBzdGFydCIpCgogICAgYWxsb3dfcHJvY2Vzc19jb21tb24ocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpCiAgICBhbGxvd19leGVjX2NhcHMoaV9wcm9jZXNzLkNhcGFiaWxpdGllcykKICAgIHBfcHJvY2Vzcy5UZXJtaW5hbCA9PSBpX3Byb2Nlc3MuVGVybWluYWwKCiAgICBwcmludCgiYWxsb3dfcHJvYmVfcHJvY2VzczogdHJ1ZSIpCn0KCmFsbG93X3VzZXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MpIHsKICAgIHBfdXNlciA6PSBwX3Byb2Nlc3MuVXNlcgogICAgaV91c2VyIDo9IGlfcHJvY2Vzcy5Vc2VyCgogICAgcHJpbnQoImFsbG93X3VzZXI6IGlucHV0IHVpZCA9IiwgaV91c2VyLlVJRCwgInBvbGljeSB1aWQgPSIsIHBfdXNlci5VSUQpCiAgICBwX3VzZXIuVUlEID09IGlfdXNlci5VSUQKCiAgICAjIFRPRE86IHRyYWNrIGRvd24gdGhlIHJlYXNvbiBmb3IgcmVnaXN0cnkuazhzLmlvL3BhdXNlOjMuOSBiZWluZwogICAgIyAgICAgICBleGVjdXRlZCB3aXRoIGdpZCA9IDAgZGVzcGl0ZSBoYXZpbmcgIjY1NTM1OjY1NTM1IiBpbiBpdHMgY29udGFpbmVyIGltYWdlCiAgICAjICAgICAgIGNvbmZpZy4KICAgICNwcmludCgiYWxsb3dfdXNlcjogaW5wdXQgZ2lkID0iLCBpX3VzZXIuR0lELCAicG9saWN5IGdpZCA9IiwgcF91c2VyLkdJRCkKICAgICNwX3VzZXIuR0lEID09IGlfdXNlci5HSUQKCiAgICAjIFRPRE86IGNvbXBhcmUgdGhlIGFkZGl0aW9uYWxHaWRzIGZpZWxkIHRvbyBhZnRlciBjb21wdXRpbmcgaXRzIHZhbHVlCiAgICAjIGJhc2VkIG9uIC9ldGMvcGFzc3dkIGFuZCAvZXRjL2dyb3VwIGZyb20gdGhlIGNvbnRhaW5lciBpbWFnZS4KfQoKYWxsb3dfZGVwcmVjYXRlZF9hcmdzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZ3MgMTogbm8gYXJncyIpCgogICAgbm90IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJncwogICAgbm90IGlfcHJvY2Vzcy5BcmdzCgogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAxOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZ3MocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSkgewogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiBwb2xpY3kgYXJncyA9IiwgcF9wcm9jZXNzLkRlcHJlY2F0ZWRBcmdzKQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiBpbnB1dCBhcmdzID0iLCBpX3Byb2Nlc3MuQXJncykKCiAgICBjb3VudChwX3Byb2Nlc3MuRGVwcmVjYXRlZEFyZ3MpID09IGNvdW50KGlfcHJvY2Vzcy5BcmdzKQoKICAgIGV2ZXJ5IGksIGlfYXJnIGluIGlfcHJvY2Vzcy5BcmdzIHsKICAgICAgICBhbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpCiAgICB9CgogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDE6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgcF9hcmcyIDo9IHJlcGxhY2UocF9hcmcsICIkJCIsICIkIikKICAgIHBfYXJnMiA9PSBpX2FyZwoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAxOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDI6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgIyBUT0RPOiBjYW4gJChub2RlLW5hbWUpIGJlIGhhbmRsZWQgYmV0dGVyPwogICAgY29udGFpbnMocF9hcmcsICIkKG5vZGUtbmFtZSkiKQoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAyOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDM6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgcF9hcmcyIDo9IHJlcGxhY2UocF9hcmcsICIkJCIsICIkIikKICAgIHBfYXJnMyA6PSByZXBsYWNlKHBfYXJnMiwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAzOiBwX2FyZzMgPSIsIHBfYXJnMykKICAgIHBfYXJnMyA9PSBpX2FyZwoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAzOiB0cnVlIikKfQoKIyBPQ0kgcHJvY2Vzcy5FbnYgZmllbGQKYWxsb3dfZW52KHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfZW52OiBwIGVudiA9IiwgcF9wcm9jZXNzLkVudikKICAgIHByaW50KCJhbGxvd19lbnY6IGkgZW52ID0iLCBpX3Byb2Nlc3MuRW52KQoKICAgIGV2ZXJ5IGlfdmFyIGluIGlfcHJvY2Vzcy5FbnYgewogICAgICAgIHByaW50KCJhbGxvd19lbnY6IGlfdmFyID0iLCBpX3ZhcikKICAgICAgICBhbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgfQoKICAgIHByaW50KCJhbGxvd19lbnY6IHRydWUiKQp9CgojIEFsbG93IGlucHV0IGVudiB2YXJpYWJsZXMgdGhhdCBhcmUgcHJlc2VudCBpbiB0aGUgcG9saWN5IGRhdGEgdG9vLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHBfdmFyID09IGlfdmFyCiAgICBwcmludCgiYWxsb3dfdmFyIDE6IHRydWUiKQp9CgojIE1hdGNoIGlucHV0IHdpdGggb25lIG9mIHRoZSBwb2xpY3kgdmFyaWFibGVzLCBhZnRlciBzdWJzdGl0dXRpbmcgJChzYW5kYm94LW5hbWUpLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHByaW50KCJhbGxvd192YXIgMjogcF92YXIgPSIsIHBfdmFyKQoKICAgIHBfdmFyX3NwbGl0IDo9IHNwbGl0KHBfdmFyLCAiPSIpCiAgICBjb3VudChwX3Zhcl9zcGxpdCkgPT0gMgoKICAgIHBfdmFyX3NwbGl0WzFdID09ICIkKHNhbmRib3gtbmFtZSkiCgogICAgaV92YXJfc3BsaXQgOj0gc3BsaXQoaV92YXIsICI9IikKICAgIGNvdW50KGlfdmFyX3NwbGl0KSA9PSAyCgogICAgaV92YXJfc3BsaXRbMF0gPT0gcF92YXJfc3BsaXRbMF0KICAgIHJlZ2V4Lm1hdGNoKHNfbmFtZSwgaV92YXJfc3BsaXRbMV0pCgogICAgcHJpbnQoImFsbG93X3ZhciAyOiB0cnVlIikKfQoKIyBBbGxvdyBpbnB1dCBlbnYgdmFyaWFibGVzIHRoYXQgbWF0Y2ggd2l0aCBhIHJlcXVlc3RfZGVmYXVsdHMgcmVnZXguCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHNvbWUgcF9yZWdleDEgaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5DcmVhdGVDb250YWluZXJSZXF1ZXN0LmFsbG93X2Vudl9yZWdleAogICAgcF9yZWdleDIgOj0gcmVwbGFjZShwX3JlZ2V4MSwgIiQoaXB2NF9hKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcHY0X2EpCiAgICBwX3JlZ2V4MyA6PSByZXBsYWNlKHBfcmVnZXgyLCAiJChpcF9wKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcF9wKQogICAgcF9yZWdleDQgOj0gcmVwbGFjZShwX3JlZ2V4MywgIiQoc3ZjX25hbWUpIiwgcG9saWN5X2RhdGEuY29tbW9uLnN2Y19uYW1lKQogICAgcF9yZWdleDUgOj0gcmVwbGFjZShwX3JlZ2V4NCwgIiQoZG5zX2xhYmVsKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5kbnNfbGFiZWwpCgogICAgcHJpbnQoImFsbG93X3ZhciAzOiBwX3JlZ2V4NSA9IiwgcF9yZWdleDUpCiAgICByZWdleC5tYXRjaChwX3JlZ2V4NSwgaV92YXIpCgogICAgcHJpbnQoImFsbG93X3ZhciAzOiB0cnVlIikKfQoKIyBBbGxvdyBmaWVsZFJlZiAiZmllbGRQYXRoOiBzdGF0dXMucG9kSVAiIHZhbHVlcy4KYWxsb3dfdmFyKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBpX3Zhciwgc19uYW1lLCBzX25hbWVzcGFjZSkgewogICAgbmFtZV92YWx1ZSA6PSBzcGxpdChpX3ZhciwgIj0iKQogICAgY291bnQobmFtZV92YWx1ZSkgPT0gMgogICAgaXNfaXAobmFtZV92YWx1ZVsxXSkKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIGFsbG93X3BvZF9pcF92YXIobmFtZV92YWx1ZVswXSwgcF92YXIpCgogICAgcHJpbnQoImFsbG93X3ZhciA0OiB0cnVlIikKfQoKIyBBbGxvdyBjb21tb24gZmllbGRSZWYgdmFyaWFibGVzLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBuYW1lX3ZhbHVlIDo9IHNwbGl0KGlfdmFyLCAiPSIpCiAgICBjb3VudChuYW1lX3ZhbHVlKSA9PSAyCgogICAgc29tZSBwX3ZhciBpbiBwX3Byb2Nlc3MuRW52CiAgICBwX25hbWVfdmFsdWUgOj0gc3BsaXQocF92YXIsICI9IikKICAgIGNvdW50KHBfbmFtZV92YWx1ZSkgPT0gMgoKICAgIHBfbmFtZV92YWx1ZVswXSA9PSBuYW1lX3ZhbHVlWzBdCgogICAgIyBUT0RPOiBzaG91bGQgdGhlc2UgYmUgaGFuZGxlZCBpbiBhIGRpZmZlcmVudCB3YXk/CiAgICBhbHdheXNfYWxsb3dlZCA6PSBbIiQoaG9zdC1uYW1lKSIsICIkKG5vZGUtbmFtZSkiLCAiJChwb2QtdWlkKSJdCiAgICBzb21lIGFsbG93ZWQgaW4gYWx3YXlzX2FsbG93ZWQKICAgIGNvbnRhaW5zKHBfbmFtZV92YWx1ZVsxXSwgYWxsb3dlZCkKCiAgICBwcmludCgiYWxsb3dfdmFyIDU6IHRydWUiKQp9CgojIEFsbG93IGZpZWxkUmVmICJmaWVsZFBhdGg6IHN0YXR1cy5ob3N0SVAiIHZhbHVlcy4KYWxsb3dfdmFyKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBpX3Zhciwgc19uYW1lLCBzX25hbWVzcGFjZSkgewogICAgbmFtZV92YWx1ZSA6PSBzcGxpdChpX3ZhciwgIj0iKQogICAgY291bnQobmFtZV92YWx1ZSkgPT0gMgogICAgaXNfaXAobmFtZV92YWx1ZVsxXSkKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIGFsbG93X2hvc3RfaXBfdmFyKG5hbWVfdmFsdWVbMF0sIHBfdmFyKQoKICAgIHByaW50KCJhbGxvd192YXIgNjogdHJ1ZSIpCn0KCiMgQWxsb3cgcmVzb3VyY2VGaWVsZFJlZiB2YWx1ZXMgKGUuZy4sICJsaW1pdHMuY3B1IikuCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIG5hbWVfdmFsdWUgOj0gc3BsaXQoaV92YXIsICI9IikKICAgIGNvdW50KG5hbWVfdmFsdWUpID09IDIKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHBfbmFtZV92YWx1ZSA6PSBzcGxpdChwX3ZhciwgIj0iKQogICAgY291bnQocF9uYW1lX3ZhbHVlKSA9PSAyCgogICAgcF9uYW1lX3ZhbHVlWzBdID09IG5hbWVfdmFsdWVbMF0KCiAgICAjIGEgdmFyaWFibGUgd2Ugc2hvdWxkIGJlIHZhbGlkYXRpbmcgdXNpbmcgYSByZWdleCBmcm9tIHNldHRpbmdzCiAgICBwX25hbWVfdmFsdWVbMV0gPT0gIiQodmFsaWRhdGUtZnJvbS1zZXR0aW5ncykiCgogICAgcmVnZXhfdmFsIDo9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuQ3JlYXRlQ29udGFpbmVyUmVxdWVzdC5hbGxvd19lbnZfcmVnZXhfbWFwW25hbWVfdmFsdWVbMF1dCgogICAgcHJpbnQoImFsbG93X3ZhciA3OiB2YWwgPSIsIG5hbWVfdmFsdWVbMV0pCiAgICBwcmludCgiYWxsb3dfdmFyIDc6IHJlZ2V4X3ZhbCA9IiwgcmVnZXhfdmFsKQoKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4X3ZhbCwgbmFtZV92YWx1ZVsxXSkKCiAgICBwcmludCgiYWxsb3dfdmFyIDc6IHRydWUiKQp9CgojIE1hdGNoIGlucHV0IHdpdGggb25lIG9mIHRoZSBwb2xpY3kgdmFyaWFibGVzLCBhZnRlciBzdWJzdGl0dXRpbmcgJChzYW5kYm94LW5hbWVzcGFjZSkuCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHNvbWUgcF92YXIgaW4gcF9wcm9jZXNzLkVudgogICAgcF92YXIyIDo9IHJlcGxhY2UocF92YXIsICIkKHNhbmRib3gtbmFtZXNwYWNlKSIsIHNfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd192YXIgODogcF92YXIyID0iLCBwX3ZhcjIpCiAgICBwX3ZhcjIgPT0gaV92YXIKCiAgICBwcmludCgiYWxsb3dfdmFyIDg6IHRydWUiKQp9CgphbGxvd19wb2RfaXBfdmFyKHZhcl9uYW1lLCBwX3ZhcikgewogICAgcHJpbnQoImFsbG93X3BvZF9pcF92YXI6IHZhcl9uYW1lID0iLCB2YXJfbmFtZSwgInBfdmFyID0iLCBwX3ZhcikKCiAgICBwX25hbWVfdmFsdWUgOj0gc3BsaXQocF92YXIsICI9IikKICAgIGNvdW50KHBfbmFtZV92YWx1ZSkgPT0gMgoKICAgIHBfbmFtZV92YWx1ZVswXSA9PSB2YXJfbmFtZQogICAgcF9uYW1lX3ZhbHVlWzFdID09ICIkKHBvZC1pcCkiCgogICAgcHJpbnQoImFsbG93X3BvZF9pcF92YXI6IHRydWUiKQp9CgphbGxvd19ob3N0X2lwX3Zhcih2YXJfbmFtZSwgcF92YXIpIHsKICAgIHByaW50KCJhbGxvd19ob3N0X2lwX3ZhcjogdmFyX25hbWUgPSIsIHZhcl9uYW1lLCAicF92YXIgPSIsIHBfdmFyKQoKICAgIHBfbmFtZV92YWx1ZSA6PSBzcGxpdChwX3ZhciwgIj0iKQogICAgY291bnQocF9uYW1lX3ZhbHVlKSA9PSAyCgogICAgcF9uYW1lX3ZhbHVlWzBdID09IHZhcl9uYW1lCiAgICBwX25hbWVfdmFsdWVbMV0gPT0gIiQoaG9zdC1pcCkiCgogICAgcHJpbnQoImFsbG93X2hvc3RfaXBfdmFyOiB0cnVlIikKfQoKaXNfaXAodmFsdWUpIHsKICAgIGJ5dGVzID0gc3BsaXQodmFsdWUsICIuIikKICAgIGNvdW50KGJ5dGVzKSA9PSA0CgogICAgaXNfaXBfZmlyc3RfYnl0ZShieXRlc1swXSkKICAgIGlzX2lwX290aGVyX2J5dGUoYnl0ZXNbMV0pCiAgICBpc19pcF9vdGhlcl9ieXRlKGJ5dGVzWzJdKQogICAgaXNfaXBfb3RoZXJfYnl0ZShieXRlc1szXSkKfQppc19pcF9maXJzdF9ieXRlKGNvbXBvbmVudCkgewogICAgbnVtYmVyID0gdG9fbnVtYmVyKGNvbXBvbmVudCkKICAgIG51bWJlciA+PSAxCiAgICBudW1iZXIgPD0gMjU1Cn0KaXNfaXBfb3RoZXJfYnl0ZShjb21wb25lbnQpIHsKICAgIG51bWJlciA9IHRvX251bWJlcihjb21wb25lbnQpCiAgICBudW1iZXIgPj0gMAogICAgbnVtYmVyIDw9IDI1NQp9CgojIE9DSSByb290LlBhdGgKYWxsb3dfcm9vdF9wYXRoKHBfb2NpLCBpX29jaSwgYnVuZGxlX2lkKSB7CiAgICBpX3BhdGggOj0gaV9vY2kuUm9vdC5QYXRoCiAgICBwX3BhdGgxIDo9IHBfb2NpLlJvb3QuUGF0aAogICAgcHJpbnQoImFsbG93X3Jvb3RfcGF0aDogaV9wYXRoID0iLCBpX3BhdGgsICJwX3BhdGgxID0iLCBwX3BhdGgxKQoKICAgIHBfcGF0aDIgOj0gcmVwbGFjZShwX3BhdGgxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfcm9vdF9wYXRoOiBwX3BhdGgyID0iLCBwX3BhdGgyKQoKICAgIHBfcGF0aDMgOj0gcmVwbGFjZShwX3BhdGgyLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X3Jvb3RfcGF0aDogcF9wYXRoMyA9IiwgcF9wYXRoMykKCiAgICBwX3BhdGgzID09IGlfcGF0aAoKICAgIHByaW50KCJhbGxvd19yb290X3BhdGg6IHRydWUiKQp9CgojIGRldmljZSBtb3VudHMKYWxsb3dfbW91bnQocF9vY2ksIGlfbW91bnQsIGlfc3RvcmFnZXMsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcHJpbnQoImFsbG93X21vdW50OiBpX21vdW50ID0iLCBpX21vdW50KQoKICAgIHNvbWUgcF9tb3VudCBpbiBwX29jaS5Nb3VudHMKICAgIHNvbWUgaV9zdG9yYWdlIGluIGlfc3RvcmFnZXMKCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IHBfbW91bnQgPSIsIHBfbW91bnQpCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IGlfc3RvcmFnZSA9IiwgaV9zdG9yYWdlKQoKICAgIGNoZWNrX21vdW50KHBfbW91bnQsIGlfbW91bnQsIGlfc3RvcmFnZSwgYnVuZGxlX2lkLCBzYW5kYm94X2lkKQoKICAgICMgVE9ETzogYXJlIHRoZXJlIGFueSBvdGhlciByZXF1aXJlZCBwb2xpY3kgY2hlY2tzIGZvciBtb3VudHMgLSBlLmcuLAogICAgIyAgICAgICBtdWx0aXBsZSBtb3VudHMgd2l0aCBzYW1lIHNvdXJjZSBvciBkZXN0aW5hdGlvbj8KCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IHRydWUiKQp9CgpjaGVja19tb3VudChwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcF9tb3VudCA9PSBpX21vdW50CiAgICBwcmludCgiY2hlY2tfbW91bnQgMTogdHJ1ZSIpCn0KY2hlY2tfbW91bnQocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHBfbW91bnQuZGVzdGluYXRpb24gPT0gaV9tb3VudC5kZXN0aW5hdGlvbgogICAgcF9tb3VudC50eXBlXyA9PSBpX21vdW50LnR5cGVfCiAgICBwX21vdW50Lm9wdGlvbnMgPT0gaV9tb3VudC5vcHRpb25zCgogICAgbW91bnRfc291cmNlX2FsbG93cyhwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkKCiAgICBwcmludCgiY2hlY2tfbW91bnQgMjogdHJ1ZSIpCn0KCm1vdW50X3NvdXJjZV9hbGxvd3MocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHJlZ2V4MSA6PSBwX21vdW50LnNvdXJjZQogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5tb3VudF9zb3VyY2VfY3BhdGgpCiAgICByZWdleDQgOj0gcmVwbGFjZShyZWdleDMsICIkKGJ1bmRsZS1pZCkiLCBidW5kbGVfaWQpCgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMTogcmVnZXg0ID0iLCByZWdleDQpCiAgICByZWdleC5tYXRjaChyZWdleDQsIGlfbW91bnQuc291cmNlKQoKICAgIHByaW50KCJtb3VudF9zb3VyY2VfYWxsb3dzIDE6IHRydWUiKQp9Cm1vdW50X3NvdXJjZV9hbGxvd3MocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHJlZ2V4MSA6PSBwX21vdW50LnNvdXJjZQogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5tb3VudF9zb3VyY2VfY3BhdGgpCiAgICByZWdleDQgOj0gcmVwbGFjZShyZWdleDMsICIkKHNhbmRib3gtaWQpIiwgc2FuZGJveF9pZCkKCiAgICBwcmludCgibW91bnRfc291cmNlX2FsbG93cyAyOiByZWdleDQgPSIsIHJlZ2V4NCkKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4NCwgaV9tb3VudC5zb3VyY2UpCgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMjogdHJ1ZSIpCn0KbW91bnRfc291cmNlX2FsbG93cyhwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogaV9tb3VudC5zb3VyY2UgPSIsIGlfbW91bnQuc291cmNlKQogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogaV9zdG9yYWdlLm1vdW50X3BvaW50ID0iLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCgogICAgaV9tb3VudC5zb3VyY2UgPT0gaV9zdG9yYWdlLm1vdW50X3BvaW50CgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogdHJ1ZSIpCn0KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBDcmVhdGUgY29udGFpbmVyIFN0b3JhZ2VzCgphbGxvd19zdG9yYWdlcyhwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHBfY291bnQgOj0gY291bnQocF9zdG9yYWdlcykKICAgIGlfY291bnQgOj0gY291bnQoaV9zdG9yYWdlcykKICAgIHByaW50KCJhbGxvd19zdG9yYWdlczogcF9jb3VudCA9IiwgcF9jb3VudCwgImlfY291bnQgPSIsIGlfY291bnQpCgogICAgcF9jb3VudCA9PSBpX2NvdW50CgogICAgIyBHZXQgdGhlIGNvbnRhaW5lciBpbWFnZSBsYXllciBJRHMgYW5kIHZlcml0eSByb290IGhhc2hlcywgZnJvbSB0aGUgIm92ZXJsYXlmcyIgc3RvcmFnZS4KICAgIHNvbWUgb3ZlcmxheV9zdG9yYWdlIGluIHBfc3RvcmFnZXMKICAgIG92ZXJsYXlfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIHByaW50KCJhbGxvd19zdG9yYWdlczogb3ZlcmxheV9zdG9yYWdlID0iLCBvdmVybGF5X3N0b3JhZ2UpCiAgICBjb3VudChvdmVybGF5X3N0b3JhZ2Uub3B0aW9ucykgPT0gMgoKICAgIGxheWVyX2lkcyA6PSBzcGxpdChvdmVybGF5X3N0b3JhZ2Uub3B0aW9uc1swXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiBsYXllcl9pZHMgPSIsIGxheWVyX2lkcykKCiAgICByb290X2hhc2hlcyA6PSBzcGxpdChvdmVybGF5X3N0b3JhZ2Uub3B0aW9uc1sxXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiByb290X2hhc2hlcyA9Iiwgcm9vdF9oYXNoZXMpCgogICAgZXZlcnkgaV9zdG9yYWdlIGluIGlfc3RvcmFnZXMgewogICAgICAgIGFsbG93X3N0b3JhZ2UocF9zdG9yYWdlcywgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpCiAgICB9CgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiB0cnVlIikKfQoKYWxsb3dfc3RvcmFnZShwX3N0b3JhZ2VzLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgc29tZSBwX3N0b3JhZ2UgaW4gcF9zdG9yYWdlcwoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiBwX3N0b3JhZ2UgPSIsIHBfc3RvcmFnZSkKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiBpX3N0b3JhZ2UgPSIsIGlfc3RvcmFnZSkKCiAgICBwX3N0b3JhZ2UuZHJpdmVyICAgICAgICAgICA9PSBpX3N0b3JhZ2UuZHJpdmVyCiAgICBwX3N0b3JhZ2UuZHJpdmVyX29wdGlvbnMgICA9PSBpX3N0b3JhZ2UuZHJpdmVyX29wdGlvbnMKICAgIHBfc3RvcmFnZS5mc19ncm91cCAgICAgICAgID09IGlfc3RvcmFnZS5mc19ncm91cAogICAgcF9zdG9yYWdlLmZzdHlwZSAgICAgICAgICAgPT0gaV9zdG9yYWdlLmZzdHlwZQoKICAgIGFsbG93X3N0b3JhZ2Vfc291cmNlKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKQogICAgYWxsb3dfc3RvcmFnZV9vcHRpb25zKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKQogICAgYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKQoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiB0cnVlIikKfQoKYWxsb3dfc3RvcmFnZV9zb3VyY2UocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX3NvdXJjZSAxOiBzdGFydCIpCgogICAgcF9zdG9yYWdlLnNvdXJjZSA9PSBpX3N0b3JhZ2Uuc291cmNlCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDE6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX3NvdXJjZShwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDI6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCgogICAgIyBEREREOkJCOkRELkY6IERvbWFpbjpCdXM6RGV2aWNlLkZ1bmN0aW9uCiAgICAjIGh0dHBzOi8vd3d3Lmtlcm5lbC5vcmcvZG9jL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtYnVzLXBjaQogICAgcmVnZXgubWF0Y2goYF5bYS1mMC05XXs0fTpbYS1mMC05XXsyfTpbYS1mMC05XXsyfVwuW2EtZjAtOV0kYCwgaV9zdG9yYWdlLnNvdXJjZSkKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9zb3VyY2UgMjogdHJ1ZSIpCn0KCmFsbG93X3N0b3JhZ2Vfc291cmNlKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKSB7CiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9zb3VyY2UgMzogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIGlfc3RvcmFnZS5zb3VyY2UgPT0gIm5vbmUiCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDM6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX3NvdXJjZShwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDQ6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJzbWIiCgogICAgIyBQYXR0ZXJuOiAvLzxzdG9yYWdlLWFjY291bnQtbmFtZT4uZmlsZS5jb3JlLndpbmRvd3MubmV0LzxrOHMtUFZDLW5hbWU+CiAgICAjIFN0b3JhZ2UgYWNjb3VudCBuYW1lOiBodHRwczovL2xlYXJuLm1pY3Jvc29mdC5jb20vZW4tdXMvYXp1cmUvc3RvcmFnZS9jb21tb24vc3RvcmFnZS1hY2NvdW50LW92ZXJ2aWV3I3N0b3JhZ2UtYWNjb3VudC1uYW1lCiAgICAjIEs4cyBQVkMgbmFtZTogaHR0cHM6Ly9rdWJlcm5ldGVzLmlvL2RvY3MvY29uY2VwdHMvb3ZlcnZpZXcvd29ya2luZy13aXRoLW9iamVjdHMvbmFtZXMvI2Rucy1zdWJkb21haW4tbmFtZXMKICAgIHJlZ2V4Lm1hdGNoKGBeXC9cLyhbYS16MC05XXszLDI0fSlcLmZpbGVcLmNvcmVcLndpbmRvd3NcLm5ldFwvW2EtejAtOV0oW2EtejAtOS4tXXswLDI1MX1bYS16MC05XSk/JGAsIGlfc3RvcmFnZS5zb3VyY2UpCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDQ6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMTogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgIT0gIm92ZXJsYXlmcyIKICAgIHBfc3RvcmFnZS5vcHRpb25zID09IGlfc3RvcmFnZS5vcHRpb25zCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAxOiB0cnVlIikKfQphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIGNvdW50KHBfc3RvcmFnZS5vcHRpb25zKSA9PSAyCgogICAgcG9saWN5X2lkcyA6PSBzcGxpdChwX3N0b3JhZ2Uub3B0aW9uc1swXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBwb2xpY3lfaWRzID0iLCBwb2xpY3lfaWRzKQogICAgcG9saWN5X2lkcyA9PSBsYXllcl9pZHMKCiAgICBwb2xpY3lfaGFzaGVzIDo9IHNwbGl0KHBfc3RvcmFnZS5vcHRpb25zWzFdLCAiOiIpCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IHBvbGljeV9oYXNoZXMgPSIsIHBvbGljeV9oYXNoZXMpCgogICAgcF9jb3VudCA6PSBjb3VudChwb2xpY3lfaWRzKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBwX2NvdW50ID0iLCBwX2NvdW50KQogICAgcF9jb3VudCA+PSAxCiAgICBwX2NvdW50ID09IGNvdW50KHBvbGljeV9oYXNoZXMpCgogICAgaV9jb3VudCA6PSBjb3VudChpX3N0b3JhZ2Uub3B0aW9ucykKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogaV9jb3VudCA9IiwgaV9jb3VudCkKICAgIGlfY291bnQgPT0gcF9jb3VudCArIDMKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zWzBdID0iLCBpX3N0b3JhZ2Uub3B0aW9uc1swXSkKICAgIGlfc3RvcmFnZS5vcHRpb25zWzBdID09ICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQubGF5ZXItc3JjLXByZWZpeD0vdmFyL2xpYi9jb250YWluZXJkL2lvLmNvbnRhaW5lcmQuc25hcHNob3R0ZXIudjEudGFyZGV2L2xheWVycyIKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zW2lfY291bnQgLSAyXSA9IiwgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDJdKQogICAgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDJdID09ICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQub3ZlcmxheS1ydyIKCiAgICBsb3dlcmRpciA6PSBjb25jYXQoIj0iLCBbImxvd2VyZGlyIiwgcF9zdG9yYWdlLm9wdGlvbnNbMF1dKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBsb3dlcmRpciA9IiwgbG93ZXJkaXIpCgogICAgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDFdID09IGxvd2VyZGlyCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zW2lfY291bnQgLSAxXSA9IiwgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDFdKQoKICAgIGV2ZXJ5IGksIHBvbGljeV9pZCBpbiBwb2xpY3lfaWRzIHsKICAgICAgICBhbGxvd19vdmVybGF5X2xheWVyKHBvbGljeV9pZCwgcG9saWN5X2hhc2hlc1tpXSwgaV9zdG9yYWdlLm9wdGlvbnNbaSArIDFdKQogICAgfQoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogdHJ1ZSIpCn0KYWxsb3dfc3RvcmFnZV9vcHRpb25zKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKSB7CiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDM6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCiAgICBjb3VudChwX3N0b3JhZ2Uub3B0aW9ucykgPT0gMQoKICAgIHN0YXJ0c3dpdGgocF9zdG9yYWdlLm9wdGlvbnNbMF0sICIkKGhhc2giKQogICAgaGFzaF9zdWZmaXggOj0gdHJpbV9sZWZ0KHBfc3RvcmFnZS5vcHRpb25zWzBdLCAiJChoYXNoIikKCiAgICBlbmRzd2l0aChoYXNoX3N1ZmZpeCwgIikiKQogICAgaGFzaF9pbmRleCA6PSB0cmltX3JpZ2h0KGhhc2hfc3VmZml4LCAiKSIpCiAgICBpIDo9IHRvX251bWJlcihoYXNoX2luZGV4KQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAzOiBpID0iLCBpKQoKICAgIGhhc2hfb3B0aW9uIDo9IGNvbmNhdCgiPSIsIFsiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LnJvb3QtaGFzaCIsIHJvb3RfaGFzaGVzW2ldXSkKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMzogaGFzaF9vcHRpb24gPSIsIGhhc2hfb3B0aW9uKQoKICAgIGNvdW50KGlfc3RvcmFnZS5vcHRpb25zKSA9PSA0CiAgICBpX3N0b3JhZ2Uub3B0aW9uc1swXSA9PSAicm8iCiAgICBpX3N0b3JhZ2Uub3B0aW9uc1sxXSA9PSAiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmJsb2NrX2RldmljZT1maWxlIgogICAgaV9zdG9yYWdlLm9wdGlvbnNbMl0gPT0gImlvLmthdGFjb250YWluZXJzLmZzLW9wdC5pcy1sYXllciIKICAgIGlfc3RvcmFnZS5vcHRpb25zWzNdID09IGhhc2hfb3B0aW9uCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAzOiB0cnVlIikKfQphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgNDogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gInNtYiIKICAgIHBfb3B0c19jb3VudCA6PSBjb3VudChwX3N0b3JhZ2Uub3B0aW9ucykKICAgIGlfb3B0c19jb3VudCA6PSBjb3VudChpX3N0b3JhZ2Uub3B0aW9ucykKICAgIGlfb3B0c19jb3VudCA9PSBwX29wdHNfY291bnQgKyAyCgogICAgaV9vcHRfbWF0Y2hlcyA6PSBbaSB8IGkgOj0gaWR4OyBpZHggPCBwX29wdHNfY291bnQ7IHBfc3RvcmFnZS5vcHRpb25zW2lkeF0gPT0gaV9zdG9yYWdlLm9wdGlvbnNbaWR4XV0KICAgIGNvdW50KGlfb3B0X21hdGNoZXMpID09IHBfb3B0c19jb3VudAoKICAgIHN0YXJ0c3dpdGgoaV9zdG9yYWdlLm9wdGlvbnNbaV9vcHRzX2NvdW50LTJdLCAiYWRkcj0iKQogICAgY3JlZHMgPSBzcGxpdChpX3N0b3JhZ2Uub3B0aW9uc1tpX29wdHNfY291bnQtMV0sICIsIikKICAgIGNvdW50KGNyZWRzKSA9PSAyCiAgICBzdGFydHN3aXRoKGNyZWRzWzBdLCAidXNlcm5hbWU9IikKICAgIHN0YXJ0c3dpdGgoY3JlZHNbMV0sICJwYXNzd29yZD0iKQogICAgCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDQ6IHRydWUiKQp9CgphbGxvd19vdmVybGF5X2xheWVyKHBvbGljeV9pZCwgcG9saWN5X2hhc2gsIGlfb3B0aW9uKSB7CiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogcG9saWN5X2lkID0iLCBwb2xpY3lfaWQsICJwb2xpY3lfaGFzaCA9IiwgcG9saWN5X2hhc2gpCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogaV9vcHRpb24gPSIsIGlfb3B0aW9uKQoKICAgIHN0YXJ0c3dpdGgoaV9vcHRpb24sICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQubGF5ZXI9IikKICAgIGlfdmFsdWUgOj0gcmVwbGFjZShpX29wdGlvbiwgImlvLmthdGFjb250YWluZXJzLmZzLW9wdC5sYXllcj0iLCAiIikKICAgIGlfdmFsdWVfZGVjb2RlZCA6PSBiYXNlNjQuZGVjb2RlKGlfdmFsdWUpCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogaV92YWx1ZV9kZWNvZGVkID0iLCBpX3ZhbHVlX2RlY29kZWQpCgogICAgcG9saWN5X3N1ZmZpeCA6PSBjb25jYXQoIj0iLCBbInRhcixybyxpby5rYXRhY29udGFpbmVycy5mcy1vcHQuYmxvY2tfZGV2aWNlPWZpbGUsaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmlzLWxheWVyLGlvLmthdGFjb250YWluZXJzLmZzLW9wdC5yb290LWhhc2giLCBwb2xpY3lfaGFzaF0pCiAgICBwX3ZhbHVlIDo9IGNvbmNhdCgiLCIsIFtwb2xpY3lfaWQsIHBvbGljeV9zdWZmaXhdKQogICAgcHJpbnQoImFsbG93X292ZXJsYXlfbGF5ZXI6IHBfdmFsdWUgPSIsIHBfdmFsdWUpCgogICAgcF92YWx1ZSA9PSBpX3ZhbHVlX2RlY29kZWQKCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogdHJ1ZSIpCn0KCmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAidGFyIgoKICAgIHN0YXJ0c3dpdGgocF9zdG9yYWdlLm1vdW50X3BvaW50LCAiJChsYXllciIpCiAgICBtb3VudF9zdWZmaXggOj0gdHJpbV9sZWZ0KHBfc3RvcmFnZS5tb3VudF9wb2ludCwgIiQobGF5ZXIiKQoKICAgIGVuZHN3aXRoKG1vdW50X3N1ZmZpeCwgIikiKQogICAgbGF5ZXJfaW5kZXggOj0gdHJpbV9yaWdodChtb3VudF9zdWZmaXgsICIpIikKICAgIGkgOj0gdG9fbnVtYmVyKGxheWVyX2luZGV4KQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDE6IGkgPSIsIGkpCgogICAgbGF5ZXJfaWQgOj0gbGF5ZXJfaWRzW2ldCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMTogbGF5ZXJfaWQgPSIsIGxheWVyX2lkKQoKICAgIHBfbW91bnQgOj0gY29uY2F0KCIvIiwgWyIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L2xheWVycyIsIGxheWVyX2lkXSkKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCAxOiBwX21vdW50ID0iLCBwX21vdW50KQoKICAgIHBfbW91bnQgPT0gaV9zdG9yYWdlLm1vdW50X3BvaW50CgogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDE6IHRydWUiKQp9CmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAiZnVzZTMua2F0YS1vdmVybGF5IgoKICAgIG1vdW50MSA6PSByZXBsYWNlKHBfc3RvcmFnZS5tb3VudF9wb2ludCwgIiQoY3BhdGgpIiwgcG9saWN5X2RhdGEuY29tbW9uLmNwYXRoKQogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDI6IG1vdW50MiA9IiwgbW91bnQyKQoKICAgIG1vdW50MiA9PSBpX3N0b3JhZ2UubW91bnRfcG9pbnQKCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMjogdHJ1ZSIpCn0KYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKSB7CiAgICBwX3N0b3JhZ2UuZnN0eXBlID09ICJsb2NhbCIKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQyID0iLCBtb3VudDIpCgogICAgbW91bnQzIDo9IHJlcGxhY2UobW91bnQyLCAiJChzYW5kYm94LWlkKSIsIHNhbmRib3hfaWQpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQzID0iLCBtb3VudDMpCgogICAgcmVnZXgubWF0Y2gobW91bnQzLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCgogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDM6IHRydWUiKQp9CmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAiYmluZCIKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNDogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNDogbW91bnQyID0iLCBtb3VudDIpCgogICAgbW91bnQzIDo9IHJlcGxhY2UobW91bnQyLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDQ6IG1vdW50MyA9IiwgbW91bnQzKQoKICAgIHJlZ2V4Lm1hdGNoKG1vdW50MywgaV9zdG9yYWdlLm1vdW50X3BvaW50KQoKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA0OiB0cnVlIikKfQphbGxvd19tb3VudF9wb2ludChwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgYnVuZGxlX2lkLCBzYW5kYm94X2lkLCBsYXllcl9pZHMpIHsKICAgIHBfc3RvcmFnZS5mc3R5cGUgPT0gInRtcGZzIgoKICAgIG1vdW50MSA6PSBwX3N0b3JhZ2UubW91bnRfcG9pbnQKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA1OiBtb3VudDEgPSIsIG1vdW50MSkKCiAgICByZWdleC5tYXRjaChtb3VudDEsIGlfc3RvcmFnZS5tb3VudF9wb2ludCkKCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNTogdHJ1ZSIpCn0KYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKSB7CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogaV9zdG9yYWdlLm1vdW50X3BvaW50ID0iLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCiAgICBhbGxvd19kaXJlY3Rfdm9sX2RyaXZlcihwX3N0b3JhZ2UsIGlfc3RvcmFnZSkKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChzcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQyID0iLCBtb3VudDIpCgogICAgZGlyZWN0X3ZvbF9wYXRoIDo9IGlfc3RvcmFnZS5zb3VyY2UKICAgIG1vdW50MyA6PSByZXBsYWNlKG1vdW50MiwgIiQoYjY0LWRpcmVjdC12b2wtcGF0aCkiLCBiYXNlNjR1cmwuZW5jb2RlKGRpcmVjdF92b2xfcGF0aCkpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQzID0iLCBtb3VudDMpCgogICAgbW91bnQzID09IGlfc3RvcmFnZS5tb3VudF9wb2ludAoKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA2OiB0cnVlIikKfQoKYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIocF9zdG9yYWdlLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19kaXJlY3Rfdm9sX2RyaXZlciAxOiBzdGFydCIpCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCiAgICBwcmludCgiYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIgMTogdHJ1ZSIpCn0KYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIocF9zdG9yYWdlLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19kaXJlY3Rfdm9sX2RyaXZlciAyOiBzdGFydCIpCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJzbWIiCiAgICBwcmludCgiYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIgMjogdHJ1ZSIpCn0KCiMgRXhlY1Byb2Nlc3NSZXF1ZXN0LnByb2Nlc3MuQ2FwYWJpbGl0aWVzCmFsbG93X2V4ZWNfY2FwcyhpX2NhcHMpIHsKICAgIG5vdCBpX2NhcHMuQW1iaWVudAogICAgbm90IGlfY2Fwcy5Cb3VuZGluZwogICAgbm90IGlfY2Fwcy5FZmZlY3RpdmUKICAgIG5vdCBpX2NhcHMuSW5oZXJpdGFibGUKICAgIG5vdCBpX2NhcHMuUGVybWl0dGVkCn0KCiMgT0NJLlByb2Nlc3MuQ2FwYWJpbGl0aWVzCmFsbG93X2NhcHMocF9jYXBzLCBpX2NhcHMpIHsKICAgIHByaW50KCJhbGxvd19jYXBzOiBwb2xpY3kgQW1iaWVudCA9IiwgcF9jYXBzLkFtYmllbnQpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgQW1iaWVudCA9IiwgaV9jYXBzLkFtYmllbnQpCiAgICBtYXRjaF9jYXBzKHBfY2Fwcy5BbWJpZW50LCBpX2NhcHMuQW1iaWVudCkKCiAgICBwcmludCgiYWxsb3dfY2FwczogcG9saWN5IEJvdW5kaW5nID0iLCBwX2NhcHMuQm91bmRpbmcpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgQm91bmRpbmcgPSIsIGlfY2Fwcy5Cb3VuZGluZykKICAgIG1hdGNoX2NhcHMocF9jYXBzLkJvdW5kaW5nLCBpX2NhcHMuQm91bmRpbmcpCgogICAgcHJpbnQoImFsbG93X2NhcHM6IHBvbGljeSBFZmZlY3RpdmUgPSIsIHBfY2Fwcy5FZmZlY3RpdmUpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgRWZmZWN0aXZlID0iLCBpX2NhcHMuRWZmZWN0aXZlKQogICAgbWF0Y2hfY2FwcyhwX2NhcHMuRWZmZWN0aXZlLCBpX2NhcHMuRWZmZWN0aXZlKQoKICAgIHByaW50KCJhbGxvd19jYXBzOiBwb2xpY3kgSW5oZXJpdGFibGUgPSIsIHBfY2Fwcy5Jbmhlcml0YWJsZSkKICAgIHByaW50KCJhbGxvd19jYXBzOiBpbnB1dCBJbmhlcml0YWJsZSA9IiwgaV9jYXBzLkluaGVyaXRhYmxlKQogICAgbWF0Y2hfY2FwcyhwX2NhcHMuSW5oZXJpdGFibGUsIGlfY2Fwcy5Jbmhlcml0YWJsZSkKCiAgICBwcmludCgiYWxsb3dfY2FwczogcG9saWN5IFBlcm1pdHRlZCA9IiwgcF9jYXBzLlBlcm1pdHRlZCkKICAgIHByaW50KCJhbGxvd19jYXBzOiBpbnB1dCBQZXJtaXR0ZWQgPSIsIGlfY2Fwcy5QZXJtaXR0ZWQpCiAgICBtYXRjaF9jYXBzKHBfY2Fwcy5QZXJtaXR0ZWQsIGlfY2Fwcy5QZXJtaXR0ZWQpCn0KCm1hdGNoX2NhcHMocF9jYXBzLCBpX2NhcHMpIHsKICAgIHByaW50KCJtYXRjaF9jYXBzIDE6IHN0YXJ0IikKCiAgICBwX2NhcHMgPT0gaV9jYXBzCgogICAgcHJpbnQoIm1hdGNoX2NhcHMgMTogdHJ1ZSIpCn0KbWF0Y2hfY2FwcyhwX2NhcHMsIGlfY2FwcykgewogICAgcHJpbnQoIm1hdGNoX2NhcHMgMjogc3RhcnQiKQoKICAgIGNvdW50KHBfY2FwcykgPT0gMQogICAgcF9jYXBzWzBdID09ICIkKGRlZmF1bHRfY2FwcykiCgogICAgcHJpbnQoIm1hdGNoX2NhcHMgMjogZGVmYXVsdF9jYXBzID0iLCBwb2xpY3lfZGF0YS5jb21tb24uZGVmYXVsdF9jYXBzKQogICAgcG9saWN5X2RhdGEuY29tbW9uLmRlZmF1bHRfY2FwcyA9PSBpX2NhcHMKCiAgICBwcmludCgibWF0Y2hfY2FwcyAyOiB0cnVlIikKfQptYXRjaF9jYXBzKHBfY2FwcywgaV9jYXBzKSB7CiAgICBwcmludCgibWF0Y2hfY2FwcyAzOiBzdGFydCIpCgogICAgY291bnQocF9jYXBzKSA9PSAxCiAgICBwX2NhcHNbMF0gPT0gIiQocHJpdmlsZWdlZF9jYXBzKSIKCiAgICBwcmludCgibWF0Y2hfY2FwcyAzOiBwcml2aWxlZ2VkX2NhcHMgPSIsIHBvbGljeV9kYXRhLmNvbW1vbi5wcml2aWxlZ2VkX2NhcHMpCiAgICBwb2xpY3lfZGF0YS5jb21tb24ucHJpdmlsZWdlZF9jYXBzID09IGlfY2FwcwoKICAgIHByaW50KCJtYXRjaF9jYXBzIDM6IHRydWUiKQp9CgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgpjaGVja19kaXJlY3RvcnlfdHJhdmVyc2FsKGlfcGF0aCkgewogICAgbm90IHJlZ2V4Lm1hdGNoKCIoXnwvKS4uKCR8LykiLCBpX3BhdGgpCn0KCmNoZWNrX3N5bWxpbmtfc291cmNlKGlfc3JjKSB7CiAgICBpX3NyYyA9PSAiIgogICAgcHJpbnQoImNoZWNrX3N5bWxpbmtfc291cmNlIDE6IHRydWUiKQp9CmNoZWNrX3N5bWxpbmtfc291cmNlKGlfc3JjKSB7CiAgICBpX3NyYyAhPSAiIgogICAgcHJpbnQoImNoZWNrX3N5bWxpbmtfc291cmNlIDI6IGlfc3JjID0iLCBpX3NyYykKCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24uc19zb3VyY2UxLCBpX3NyYykKCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMjogdHJ1ZSIpCn0KY2hlY2tfc3ltbGlua19zb3VyY2UoaV9zcmMpIHsKICAgIGlfc3JjICE9ICIiCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMzogaV9zcmMgPSIsIGlfc3JjKQoKICAgIHJlZ2V4Lm1hdGNoKHBvbGljeV9kYXRhLmNvbW1vbi5zX3NvdXJjZTIsIGlfc3JjKQogICAgY2hlY2tfZGlyZWN0b3J5X3RyYXZlcnNhbChpX3NyYykKCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMzogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfc3RvcmFnZXMoaV9zdG9yYWdlcykgewogICAgcHJpbnQoImFsbG93X3NhbmRib3hfc3RvcmFnZXM6IGlfc3RvcmFnZXMgPSIsIGlfc3RvcmFnZXMpCgogICAgcF9zdG9yYWdlcyA6PSBwb2xpY3lfZGF0YS5zYW5kYm94LnN0b3JhZ2VzCiAgICBldmVyeSBpX3N0b3JhZ2UgaW4gaV9zdG9yYWdlcyB7CiAgICAgICAgYWxsb3dfc2FuZGJveF9zdG9yYWdlKHBfc3RvcmFnZXMsIGlfc3RvcmFnZSkKICAgIH0KCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9zdG9yYWdlczogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfc3RvcmFnZShwX3N0b3JhZ2VzLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IGlfc3RvcmFnZSA9IiwgaV9zdG9yYWdlKQoKICAgIHNvbWUgcF9zdG9yYWdlIGluIHBfc3RvcmFnZXMKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IHBfc3RvcmFnZSA9IiwgcF9zdG9yYWdlKQogICAgaV9zdG9yYWdlID09IHBfc3RvcmFnZQoKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IHRydWUiKQp9CgpDb3B5RmlsZVJlcXVlc3QgewogICAgcHJpbnQoIkNvcHlGaWxlUmVxdWVzdDogaW5wdXQucGF0aCA9IiwgaW5wdXQucGF0aCkKCiAgICBjaGVja19zeW1saW5rX3NvdXJjZShpbnB1dC5zeW1saW5rX3NyYykKICAgIGNoZWNrX2RpcmVjdG9yeV90cmF2ZXJzYWwoaW5wdXQucGF0aCkKCiAgICBzb21lIHJlZ2V4MSBpbiBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLkNvcHlGaWxlUmVxdWVzdAogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5jcGF0aCkKICAgIHJlZ2V4NCA6PSByZXBsYWNlKHJlZ2V4MywgIiQoYnVuZGxlLWlkKSIsIEJVTkRMRV9JRCkKICAgIHByaW50KCJDb3B5RmlsZVJlcXVlc3Q6IHJlZ2V4NCA9IiwgcmVnZXg0KQoKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4NCwgaW5wdXQucGF0aCkKCiAgICBwcmludCgiQ29weUZpbGVSZXF1ZXN0OiB0cnVlIikKfQoKQ3JlYXRlU2FuZGJveFJlcXVlc3QgewogICAgcHJpbnQoIkNyZWF0ZVNhbmRib3hSZXF1ZXN0OiBpbnB1dC5ndWVzdF9ob29rX3BhdGggPSIsIGlucHV0Lmd1ZXN0X2hvb2tfcGF0aCkKICAgIGNvdW50KGlucHV0Lmd1ZXN0X2hvb2tfcGF0aCkgPT0gMAoKICAgIHByaW50KCJDcmVhdGVTYW5kYm94UmVxdWVzdDogaW5wdXQua2VybmVsX21vZHVsZXMgPSIsIGlucHV0Lmtlcm5lbF9tb2R1bGVzKQogICAgY291bnQoaW5wdXQua2VybmVsX21vZHVsZXMpID09IDAKCiAgICBpX3BpZG5zIDo9IGlucHV0LnNhbmRib3hfcGlkbnMKICAgIHByaW50KCJDcmVhdGVTYW5kYm94UmVxdWVzdDogaV9waWRucyA9IiwgaV9waWRucykKICAgIGlfcGlkbnMgPT0gZmFsc2UKICAgIGFsbG93X3NhbmRib3hfc3RvcmFnZXMoaW5wdXQuc3RvcmFnZXMpCn0KCmFsbG93X2V4ZWMocF9jb250YWluZXIsIGlfcHJvY2VzcykgewogICAgcHJpbnQoImFsbG93X2V4ZWM6IHN0YXJ0IikKCiAgICBwX29jaSA9IHBfY29udGFpbmVyLk9DSQogICAgcF9zX25hbWUgPSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc19uYW1lc3BhY2UgPSBnZXRfc3RhdGVfdmFsKCJuYW1lc3BhY2UiKQogICAgYWxsb3dfcHJvYmVfcHJvY2VzcyhwX29jaS5Qcm9jZXNzLCBpX3Byb2Nlc3MsIHBfc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfZXhlYzogdHJ1ZSIpCn0KCmFsbG93X2ludGVyYWN0aXZlX2V4ZWMocF9jb250YWluZXIsIGlfcHJvY2VzcykgewogICAgcHJpbnQoImFsbG93X2ludGVyYWN0aXZlX2V4ZWM6IHN0YXJ0IikKCiAgICBwX29jaSA9IHBfY29udGFpbmVyLk9DSQogICAgcF9zX25hbWUgPSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc19uYW1lc3BhY2UgPSBnZXRfc3RhdGVfdmFsKCJuYW1lc3BhY2UiKQogICAgYWxsb3dfaW50ZXJhY3RpdmVfcHJvY2VzcyhwX29jaS5Qcm9jZXNzLCBpX3Byb2Nlc3MsIHBfc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfaW50ZXJhY3RpdmVfZXhlYzogdHJ1ZSIpCn0KCiMgVE9ETzogc2hvdWxkIG90aGVyIEV4ZWNQcm9jZXNzUmVxdWVzdCBpbnB1dCBkYXRhIGZpZWxkcyBiZSB2YWxpZGF0ZWQgYXMgd2VsbD8KRXhlY1Byb2Nlc3NSZXF1ZXN0IHsKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMTogaW5wdXQgPSIsIGlucHV0KQoKICAgIHNvbWUgcF9jb21tYW5kIGluIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuRXhlY1Byb2Nlc3NSZXF1ZXN0LmFsbG93ZWRfY29tbWFuZHMKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMTogcF9jb21tYW5kID0iLCBwX2NvbW1hbmQpCiAgICBwX2NvbW1hbmQgPT0gaW5wdXQucHJvY2Vzcy5BcmdzCgogICAgIyBUT0RPOiBtYXRjaCBwX2NvbnRhaW5lcidzIElEIHdpdGggdGhlIGlucHV0IGNvbnRhaW5lcl9pZC4KICAgIHNvbWUgcF9jb250YWluZXIgaW4gcG9saWN5X2RhdGEuY29udGFpbmVycwogICAgYWxsb3dfaW50ZXJhY3RpdmVfZXhlYyhwX2NvbnRhaW5lciwgaW5wdXQucHJvY2VzcykKCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDE6IHRydWUiKQp9CkV4ZWNQcm9jZXNzUmVxdWVzdCB7CiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDI6IGlucHV0ID0iLCBpbnB1dCkKCiAgICAjIFRPRE86IG1hdGNoIGlucHV0IGNvbnRhaW5lciBJRCB3aXRoIGl0cyBjb3JyZXNwb25kaW5nIGNvbnRhaW5lci5leGVjX2NvbW1hbmRzLgogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBzb21lIHBfY29tbWFuZCBpbiBwX2NvbnRhaW5lci5leGVjX2NvbW1hbmRzCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDI6IHBfY29tbWFuZCA9IiwgcF9jb21tYW5kKQoKICAgICMgVE9ETzogc2hvdWxkIG90aGVyIGlucHV0IGRhdGEgZmllbGRzIGJlIHZhbGlkYXRlZCBhcyB3ZWxsPwogICAgcF9jb21tYW5kID09IGlucHV0LnByb2Nlc3MuQXJncwoKICAgIGFsbG93X2V4ZWMocF9jb250YWluZXIsIGlucHV0LnByb2Nlc3MpCgogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAyOiB0cnVlIikKfQpFeGVjUHJvY2Vzc1JlcXVlc3QgewogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAzOiBpbnB1dCA9IiwgaW5wdXQpCgogICAgaV9jb21tYW5kID0gY29uY2F0KCIgIiwgaW5wdXQucHJvY2Vzcy5BcmdzKQogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAzOiBpX2NvbW1hbmQgPSIsIGlfY29tbWFuZCkKCiAgICBzb21lIHBfcmVnZXggaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5FeGVjUHJvY2Vzc1JlcXVlc3QucmVnZXgKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMzogcF9yZWdleCA9IiwgcF9yZWdleCkKCiAgICByZWdleC5tYXRjaChwX3JlZ2V4LCBpX2NvbW1hbmQpCgogICAgIyBUT0RPOiBtYXRjaCBwX2NvbnRhaW5lcidzIElEIHdpdGggdGhlIGlucHV0IGNvbnRhaW5lcl9pZC4KICAgIHNvbWUgcF9jb250YWluZXIgaW4gcG9saWN5X2RhdGEuY29udGFpbmVycwogICAgYWxsb3dfaW50ZXJhY3RpdmVfZXhlYyhwX2NvbnRhaW5lciwgaW5wdXQucHJvY2VzcykKCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDM6IHRydWUiKQp9CgpVcGRhdGVSb3V0ZXNSZXF1ZXN0IHsKICAgIHByaW50KCJVcGRhdGVSb3V0ZXNSZXF1ZXN0OiBpbnB1dCA9IiwgaW5wdXQpCiAgICBwcmludCgiVXBkYXRlUm91dGVzUmVxdWVzdDogcG9saWN5ID0iLCBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLlVwZGF0ZVJvdXRlc1JlcXVlc3QpCgogICAgaV9yb3V0ZXMgOj0gaW5wdXQucm91dGVzLlJvdXRlcwogICAgcF9zb3VyY2VfcmVnZXggPSBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLlVwZGF0ZVJvdXRlc1JlcXVlc3QuZm9yYmlkZGVuX3NvdXJjZV9yZWdleAogICAgcF9uYW1lcyA9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuVXBkYXRlUm91dGVzUmVxdWVzdC5mb3JiaWRkZW5fZGV2aWNlX25hbWVzCgogICAgZXZlcnkgaV9yb3V0ZSBpbiBpX3JvdXRlcyB7CiAgICAgICAgcHJpbnQoImlfcm91dGUuc291cmNlID0iLCBpX3JvdXRlLnNvdXJjZSkKICAgICAgICBldmVyeSBwX3JlZ2V4IGluIHBfc291cmNlX3JlZ2V4IHsKICAgICAgICAgICAgcHJpbnQoInBfcmVnZXggPSIsIHBfcmVnZXgpCiAgICAgICAgICAgIG5vdCByZWdleC5tYXRjaChwX3JlZ2V4LCBpX3JvdXRlLnNvdXJjZSkKICAgICAgICB9CgogICAgICAgIHByaW50KCJpX3JvdXRlLmRldmljZSA9IiwgaV9yb3V0ZS5kZXZpY2UpCiAgICAgICAgbm90IGlfcm91dGUuZGV2aWNlIGluIHBfbmFtZXMKICAgIH0KCiAgICBwcmludCgiVXBkYXRlUm91dGVzUmVxdWVzdDogdHJ1ZSIpCn0KClVwZGF0ZUludGVyZmFjZVJlcXVlc3QgewogICAgcHJpbnQoIlVwZGF0ZUludGVyZmFjZVJlcXVlc3Q6IGlucHV0ID0iLCBpbnB1dCkKICAgIHByaW50KCJVcGRhdGVJbnRlcmZhY2VSZXF1ZXN0OiBwb2xpY3kgPSIsIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuVXBkYXRlSW50ZXJmYWNlUmVxdWVzdCkKCiAgICBpX2ludGVyZmFjZSA6PSBpbnB1dC5pbnRlcmZhY2UKICAgIHBfZmxhZ3MgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmFsbG93X3Jhd19mbGFncwoKICAgICMgVHlwaWNhbGx5LCBqdXN0IElGRl9OT0FSUCBpcyB1c2VkLgogICAgYml0cy5hbmQoaV9pbnRlcmZhY2UucmF3X2ZsYWdzLCBiaXRzLm5lZ2F0ZShwX2ZsYWdzKSkgPT0gMAoKICAgIHBfbmFtZXMgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmZvcmJpZGRlbl9uYW1lcwoKICAgIG5vdCBpX2ludGVyZmFjZS5uYW1lIGluIHBfbmFtZXMKCiAgICBwX2h3YWRkcnMgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmZvcmJpZGRlbl9od19hZGRycwoKICAgIG5vdCBpX2ludGVyZmFjZS5od0FkZHIgaW4gcF9od2FkZHJzCgogICAgcHJpbnQoIlVwZGF0ZUludGVyZmFjZVJlcXVlc3Q6IHRydWUiKQp9CgpDbG9zZVN0ZGluUmVxdWVzdCB7CiAgICBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLkNsb3NlU3RkaW5SZXF1ZXN0ID09IHRydWUKfQoKUmVhZFN0cmVhbVJlcXVlc3QgewogICAgcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5SZWFkU3RyZWFtUmVxdWVzdCA9PSB0cnVlCn0KClVwZGF0ZUVwaGVtZXJhbE1vdW50c1JlcXVlc3QgewogICAgcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVFcGhlbWVyYWxNb3VudHNSZXF1ZXN0ID09IHRydWUKfQoKV3JpdGVTdHJlYW1SZXF1ZXN0IHsKICAgIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuV3JpdGVTdHJlYW1SZXF1ZXN0ID09IHRydWUKfQoKcG9saWN5X2RhdGEgOj0gewogICJjb250YWluZXJzIjogWwogICAgewogICAgICAiT0NJIjogewogICAgICAgICJWZXJzaW9uIjogIjEuMS4wLXJjLjEiLAogICAgICAgICJQcm9jZXNzIjogewogICAgICAgICAgIlRlcm1pbmFsIjogZmFsc2UsCiAgICAgICAgICAiVXNlciI6IHsKICAgICAgICAgICAgIlVJRCI6IDY1NTM1LAogICAgICAgICAgICAiR0lEIjogNjU1MzUsCiAgICAgICAgICAgICJBZGRpdGlvbmFsR2lkcyI6IFtdLAogICAgICAgICAgICAiVXNlcm5hbWUiOiAiIgogICAgICAgICAgfSwKICAgICAgICAgICJEZXByZWNhdGVkQXJncyI6IFsKICAgICAgICAgICAgIi9wYXVzZSIKICAgICAgICAgIF0sCiAgICAgICAgICAiQXJncyI6IFsKICAgICAgICAgICAgIi9wYXVzZSIKICAgICAgICAgIF0sCiAgICAgICAgICAiRW52IjogWwogICAgICAgICAgICAiUEFUSD0vdXNyL2xvY2FsL3NiaW46L3Vzci9sb2NhbC9iaW46L3Vzci9zYmluOi91c3IvYmluOi9zYmluOi9iaW4iCiAgICAgICAgICBdLAogICAgICAgICAgIkN3ZCI6ICIvIiwKICAgICAgICAgICJDYXBhYmlsaXRpZXMiOiB7CiAgICAgICAgICAgICJBbWJpZW50IjogW10sCiAgICAgICAgICAgICJCb3VuZGluZyI6IFsKICAgICAgICAgICAgICAiJChkZWZhdWx0X2NhcHMpIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiRWZmZWN0aXZlIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJJbmhlcml0YWJsZSI6IFtdLAogICAgICAgICAgICAiUGVybWl0dGVkIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICAiTm9OZXdQcml2aWxlZ2VzIjogdHJ1ZQogICAgICAgIH0sCiAgICAgICAgIlJvb3QiOiB7CiAgICAgICAgICAiUGF0aCI6ICIkKGNwYXRoKS8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgIlJlYWRvbmx5IjogdHJ1ZQogICAgICAgIH0sCiAgICAgICAgIk1vdW50cyI6IFsKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9wcm9jIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJwcm9jIiwKICAgICAgICAgICAgInR5cGVfIjogInByb2MiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2IiwKICAgICAgICAgICAgInNvdXJjZSI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJzdHJpY3RhdGltZSIsCiAgICAgICAgICAgICAgIm1vZGU9NzU1IiwKICAgICAgICAgICAgICAic2l6ZT02NTUzNmsiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L3B0cyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiZGV2cHRzIiwKICAgICAgICAgICAgInR5cGVfIjogImRldnB0cyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJuZXdpbnN0YW5jZSIsCiAgICAgICAgICAgICAgInB0bXhtb2RlPTA2NjYiLAogICAgICAgICAgICAgICJtb2RlPTA2MjAiLAogICAgICAgICAgICAgICJnaWQ9NSIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvc2htIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L3NobSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi9tcXVldWUiLAogICAgICAgICAgICAic291cmNlIjogIm1xdWV1ZSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJtcXVldWUiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvc3lzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJzeXNmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJzeXNmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2V0Yy9yZXNvbHYuY29uZiIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClyZXNvbHYuY29uZiQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJvIiwKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9kZXYiLAogICAgICAgICAgICAgICJub2V4ZWMiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0KICAgICAgICBdLAogICAgICAgICJBbm5vdGF0aW9ucyI6IHsKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmJ1bmRsZV9wYXRoIjogIi9ydW4vY29udGFpbmVyZC9pby5jb250YWluZXJkLnJ1bnRpbWUudjIudGFzay9rOHMuaW8vJChidW5kbGUtaWQpIiwKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIjogInBvZF9zYW5kYm94IiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSI6ICJzYW5kYm94IiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWlkIjogIl5bYS16MC05XXs2NH0kIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWxvZy1kaXJlY3RvcnkiOiAiXi92YXIvbG9nL3BvZHMvJChzYW5kYm94LW5hbWVzcGFjZSlfJChzYW5kYm94LW5hbWUpX1swLTlhLWZdezh9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezEyfSQiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZXNwYWNlIjogIiIsCiAgICAgICAgICAibmVyZGN0bC9uZXR3b3JrLW5hbWVzcGFjZSI6ICJeL3Zhci9ydW4vbmV0bnMvY25pLVswLTlhLWZdezh9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezEyfSQiCiAgICAgICAgfSwKICAgICAgICAiTGludXgiOiB7CiAgICAgICAgICAiTmFtZXNwYWNlcyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICJUeXBlIjogImlwYyIsCiAgICAgICAgICAgICAgIlBhdGgiOiAiIgogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgIlR5cGUiOiAidXRzIiwKICAgICAgICAgICAgICAiUGF0aCI6ICIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiVHlwZSI6ICJtb3VudCIsCiAgICAgICAgICAgICAgIlBhdGgiOiAiIgogICAgICAgICAgICB9CiAgICAgICAgICBdLAogICAgICAgICAgIk1hc2tlZFBhdGhzIjogWwogICAgICAgICAgICAiL3Byb2MvYWNwaSIsCiAgICAgICAgICAgICIvcHJvYy9hc291bmQiLAogICAgICAgICAgICAiL3Byb2Mva2NvcmUiLAogICAgICAgICAgICAiL3Byb2Mva2V5cyIsCiAgICAgICAgICAgICIvcHJvYy9sYXRlbmN5X3N0YXRzIiwKICAgICAgICAgICAgIi9wcm9jL3RpbWVyX2xpc3QiLAogICAgICAgICAgICAiL3Byb2MvdGltZXJfc3RhdHMiLAogICAgICAgICAgICAiL3Byb2Mvc2NoZWRfZGVidWciLAogICAgICAgICAgICAiL3N5cy9maXJtd2FyZSIsCiAgICAgICAgICAgICIvcHJvYy9zY3NpIgogICAgICAgICAgXSwKICAgICAgICAgICJSZWFkb25seVBhdGhzIjogWwogICAgICAgICAgICAiL3Byb2MvYnVzIiwKICAgICAgICAgICAgIi9wcm9jL2ZzIiwKICAgICAgICAgICAgIi9wcm9jL2lycSIsCiAgICAgICAgICAgICIvcHJvYy9zeXMiLAogICAgICAgICAgICAiL3Byb2Mvc3lzcnEtdHJpZ2dlciIKICAgICAgICAgIF0sCiAgICAgICAgICAiRGV2aWNlcyI6IFtdLAogICAgICAgICAgIlN5c2N0bCI6IHsKICAgICAgICAgICAgIm5ldC5pcHY0LmlwX3VucHJpdmlsZWdlZF9wb3J0X3N0YXJ0IjogIjAiLAogICAgICAgICAgICAibmV0LmlwdjQucGluZ19ncm91cF9yYW5nZSI6ICIwIDIxNDc0ODM2NDciCiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9LAogICAgICAic3RvcmFnZXMiOiBbCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJibGsiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogInRhciIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIiQoaGFzaDApIgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGxheWVyMCkiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJvdmVybGF5ZnMiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogImZ1c2UzLmthdGEtb3ZlcmxheSIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIjVhNWFhZDgwMDU1ZmYyMDAxMmE1MGRjMjVmOGRmN2EyOTkyNDQ3NDMyNGQ2NWY3ZDUzMDZlZThlZTI3ZmY3MWQiLAogICAgICAgICAgICAiODE3MjUwZjFhM2UzMzZkYTc2ZjViZDNmYTc4NGUxYjI2ZDk1OWI5YzEzMTg3NjgxNWJhMjYwNDA0OGI3MGMxOCIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChjcGF0aCkvJChidW5kbGUtaWQpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9CiAgICAgIF0sCiAgICAgICJkZXZpY2VzIjogW10sCiAgICAgICJzYW5kYm94X3BpZG5zIjogZmFsc2UsCiAgICAgICJleGVjX2NvbW1hbmRzIjogW10sCiAgICAgICJlbnZfbWFwIjogewogICAgICAgICJQQVRIIjogIi91c3IvbG9jYWwvc2JpbjovdXNyL2xvY2FsL2JpbjovdXNyL3NiaW46L3Vzci9iaW46L3NiaW46L2JpbiIKICAgICAgfQogICAgfSwKICAgIHsKICAgICAgIk9DSSI6IHsKICAgICAgICAiVmVyc2lvbiI6ICIxLjEuMC1yYy4xIiwKICAgICAgICAiUHJvY2VzcyI6IHsKICAgICAgICAgICJUZXJtaW5hbCI6IGZhbHNlLAogICAgICAgICAgIlVzZXIiOiB7CiAgICAgICAgICAgICJVSUQiOiAwLAogICAgICAgICAgICAiR0lEIjogMCwKICAgICAgICAgICAgIkFkZGl0aW9uYWxHaWRzIjogW10sCiAgICAgICAgICAgICJVc2VybmFtZSI6ICIiCiAgICAgICAgICB9LAogICAgICAgICAgIkRlcHJlY2F0ZWRBcmdzIjogWwogICAgICAgICAgICAiL2Fnbmhvc3QiLAogICAgICAgICAgICAibmV0ZXhlYyIsCiAgICAgICAgICAgICItLWh0dHAtcG9ydD04MDgwIgogICAgICAgICAgXSwKICAgICAgICAgICJBcmdzIjogWwogICAgICAgICAgICAiL2Fnbmhvc3QiLAogICAgICAgICAgICAibmV0ZXhlYyIsCiAgICAgICAgICAgICItLWh0dHAtcG9ydD04MDgwIgogICAgICAgICAgXSwKICAgICAgICAgICJFbnYiOiBbCiAgICAgICAgICAgICJQQVRIPS91c3IvbG9jYWwvc2JpbjovdXNyL2xvY2FsL2JpbjovdXNyL3NiaW46L3Vzci9iaW46L3NiaW46L2JpbiIsCiAgICAgICAgICAgICJIT1NUTkFNRT0kKGhvc3QtbmFtZSkiCiAgICAgICAgICBdLAogICAgICAgICAgIkN3ZCI6ICIvIiwKICAgICAgICAgICJDYXBhYmlsaXRpZXMiOiB7CiAgICAgICAgICAgICJBbWJpZW50IjogW10sCiAgICAgICAgICAgICJCb3VuZGluZyI6IFsKICAgICAgICAgICAgICAiJChkZWZhdWx0X2NhcHMpIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiRWZmZWN0aXZlIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJJbmhlcml0YWJsZSI6IFtdLAogICAgICAgICAgICAiUGVybWl0dGVkIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICAiTm9OZXdQcml2aWxlZ2VzIjogZmFsc2UKICAgICAgICB9LAogICAgICAgICJSb290IjogewogICAgICAgICAgIlBhdGgiOiAiJChjcGF0aCkvJChidW5kbGUtaWQpIiwKICAgICAgICAgICJSZWFkb25seSI6IGZhbHNlCiAgICAgICAgfSwKICAgICAgICAiTW91bnRzIjogWwogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL3Byb2MiLAogICAgICAgICAgICAic291cmNlIjogInByb2MiLAogICAgICAgICAgICAidHlwZV8iOiAicHJvYyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYiLAogICAgICAgICAgICAic291cmNlIjogInRtcGZzIiwKICAgICAgICAgICAgInR5cGVfIjogInRtcGZzIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgInN0cmljdGF0aW1lIiwKICAgICAgICAgICAgICAibW9kZT03NTUiLAogICAgICAgICAgICAgICJzaXplPTY1NTM2ayIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvcHRzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJkZXZwdHMiLAogICAgICAgICAgICAidHlwZV8iOiAiZGV2cHRzIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAgICAgIm5ld2luc3RhbmNlIiwKICAgICAgICAgICAgICAicHRteG1vZGU9MDY2NiIsCiAgICAgICAgICAgICAgIm1vZGU9MDYyMCIsCiAgICAgICAgICAgICAgImdpZD01IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi9zaG0iLAogICAgICAgICAgICAic291cmNlIjogIi9ydW4va2F0YS1jb250YWluZXJzL3NhbmRib3gvc2htIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L21xdWV1ZSIsCiAgICAgICAgICAgICJzb3VyY2UiOiAibXF1ZXVlIiwKICAgICAgICAgICAgInR5cGVfIjogIm1xdWV1ZSIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9zeXMiLAogICAgICAgICAgICAic291cmNlIjogInN5c2ZzIiwKICAgICAgICAgICAgInR5cGVfIjogInN5c2ZzIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAgICAgIm5vZGV2IiwKICAgICAgICAgICAgICAicm8iCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvc3lzL2ZzL2Nncm91cCIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiY2dyb3VwIiwKICAgICAgICAgICAgInR5cGVfIjogImNncm91cCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIsCiAgICAgICAgICAgICAgInJlbGF0aW1lIiwKICAgICAgICAgICAgICAicm8iCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZXRjL2hvc3RzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KWhvc3RzJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJydyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvdGVybWluYXRpb24tbG9nIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KXRlcm1pbmF0aW9uLWxvZyQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicnciCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZXRjL2hvc3RuYW1lIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KWhvc3RuYW1lJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJydyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9ldGMvcmVzb2x2LmNvbmYiLAogICAgICAgICAgICAic291cmNlIjogIiQoc2ZwcmVmaXgpcmVzb2x2LmNvbmYkIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJ3IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL3Zhci9ydW4vc2VjcmV0cy9rdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50IiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KXNlcnZpY2VhY2NvdW50JCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJybyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi92YXIvcnVuL3NlY3JldHMvYXp1cmUvdG9rZW5zIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KXRva2VucyQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicm8iCiAgICAgICAgICAgIF0KICAgICAgICAgIH0KICAgICAgICBdLAogICAgICAgICJBbm5vdGF0aW9ucyI6IHsKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmJ1bmRsZV9wYXRoIjogIi9ydW4vY29udGFpbmVyZC9pby5jb250YWluZXJkLnJ1bnRpbWUudjIudGFzay9rOHMuaW8vJChidW5kbGUtaWQpIiwKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIjogInBvZF9jb250YWluZXIiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLmNvbnRhaW5lci1uYW1lIjogImVjaG9oZWFkZXJzIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSI6ICJjb250YWluZXIiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLmltYWdlLW5hbWUiOiAicmVnaXN0cnkuazhzLmlvL2UyZS10ZXN0LWltYWdlcy9hZ25ob3N0OjIuNDEiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtaWQiOiAiXlthLXowLTldezY0fSQiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZXNwYWNlIjogIiIKICAgICAgICB9LAogICAgICAgICJMaW51eCI6IHsKICAgICAgICAgICJOYW1lc3BhY2VzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgIlR5cGUiOiAiaXBjIiwKICAgICAgICAgICAgICAiUGF0aCI6ICIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiVHlwZSI6ICJ1dHMiLAogICAgICAgICAgICAgICJQYXRoIjogIiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJUeXBlIjogIm1vdW50IiwKICAgICAgICAgICAgICAiUGF0aCI6ICIiCiAgICAgICAgICAgIH0KICAgICAgICAgIF0sCiAgICAgICAgICAiTWFza2VkUGF0aHMiOiBbCiAgICAgICAgICAgICIvcHJvYy9hY3BpIiwKICAgICAgICAgICAgIi9wcm9jL2tjb3JlIiwKICAgICAgICAgICAgIi9wcm9jL2tleXMiLAogICAgICAgICAgICAiL3Byb2MvbGF0ZW5jeV9zdGF0cyIsCiAgICAgICAgICAgICIvcHJvYy90aW1lcl9saXN0IiwKICAgICAgICAgICAgIi9wcm9jL3RpbWVyX3N0YXRzIiwKICAgICAgICAgICAgIi9wcm9jL3NjaGVkX2RlYnVnIiwKICAgICAgICAgICAgIi9wcm9jL3Njc2kiLAogICAgICAgICAgICAiL3N5cy9maXJtd2FyZSIKICAgICAgICAgIF0sCiAgICAgICAgICAiUmVhZG9ubHlQYXRocyI6IFsKICAgICAgICAgICAgIi9wcm9jL2Fzb3VuZCIsCiAgICAgICAgICAgICIvcHJvYy9idXMiLAogICAgICAgICAgICAiL3Byb2MvZnMiLAogICAgICAgICAgICAiL3Byb2MvaXJxIiwKICAgICAgICAgICAgIi9wcm9jL3N5cyIsCiAgICAgICAgICAgICIvcHJvYy9zeXNycS10cmlnZ2VyIgogICAgICAgICAgXSwKICAgICAgICAgICJEZXZpY2VzIjogW10sCiAgICAgICAgICAiU3lzY3RsIjogewogICAgICAgICAgICAibmV0LmlwdjQuaXBfdW5wcml2aWxlZ2VkX3BvcnRfc3RhcnQiOiAiMCIsCiAgICAgICAgICAgICJuZXQuaXB2NC5waW5nX2dyb3VwX3JhbmdlIjogIjAgMjE0NzQ4MzY0NyIKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0sCiAgICAgICJzdG9yYWdlcyI6IFsKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoMCkiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXIwKSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoMSkiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXIxKSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoMikiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXIyKSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoMykiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXIzKSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoNCkiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXI0KSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoNSkiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXI1KSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoNikiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXI2KSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoNykiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXI3KSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoOCkiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXI4KSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogIm92ZXJsYXlmcyIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAiZnVzZTMua2F0YS1vdmVybGF5IiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiMmQxMDdkMjc4NTE3YTA2MWFmNjEwYjkzODRkMmM2YTE3OTkzNzUzOTUyNTNmMWE1NmZjMzk2NmIzMmUyNDliMjplZjEyMTAwYzQzZDgwMzY4ZjRiNWE0NDA3MTc2ZjBhMGY2YzIyYjUxYjU3ODlhMWUyOTZjOGExOWYzMmRkMjlhOjI5MDcyYjMzYzVhNzdiNGZmYjc0MWUxMTc4OGE5NzRmOTk2ZTM0NjY2YzdlZWQyOWRiYjNkYjk4ZDEyM2U5Mzg6NDQ1M2I5NzY0ZWNkYTgzNWEzYjJhZWY4NWRmZjM3MTI3MjcyOGU5MDdmMDcwYTBlNTAxNjIwZGM5MDk0YzM2Mzo3YzE1M2VhNzMzMTlmNGNjYTc3NzgxMjg1NzU5NjQ3ZDQzMTQzMWI2MWIxYzllYTljMDE3YTM1MDgxMGJjNjgxOmZmNWYyMzE1MTFhYzZkNWJjZjNiNjdmOGQ1ZGY3YzFmMDg4YzUxNjJkZDM0NDMwYmM2MDVlMjJjNjA2NGQ2OTU6NzAzYjI3YmUzYTcwMTI2MDMzN2Q1MjUxMDgwMmIzNmM1NWFlOWQ4MDNmN2QzMWYzYTg1OGM4YzViNzg3NjI4ZjpiNTY5YjUyZDA2OGQyOGQ2OGVhOWVjNTkzODMyNmE0OWI0NjU2MTVkZjc3YzRhYzhmYmRiOTNkNjYwOTJhMTE5OmRhNTk4MGE3ZTM0MzQ0MDlkYTEyMzI0MTdhMWQxY2MwMjk2N2I2MmEwOTk1MDJjYWNkMTNjYzJlMzQyMDZmYTQiLAogICAgICAgICAgICAiNDNkZjZmNTQ4YzFjY2JmODNhNzg2YjY5NGFjZGNjOTllODBlNTU1ZWNlMTdlOWNlZDU0OGZlNjcwNTE2MTQzMzpkZTJiN2Q2YTFmNjNiOWM3ZDVmNmExNDAyZGI1MGU4MjFiMzgxMTI0ZTk5NTk3YTVjZmFkOTgwNWJmYmE2OGUxOjM2YjlkYTFhNDE3ZDc4ZTg1NjhkNDNlNDM4NTg1Y2Q5ODJhOWZkOTdlZmJlMTFmOGM3ZWUzYzEzMTkyNmIxZWE6MmJiOGI2NjU3ZmFhNmVhMzkxYTUwODcwMjNmOTUyYjI4MGQzMGFmZjc1MTYxYWFkN2I5MDU3YzU3ODFhMjgxOTo0MWFhODdmMzA1ZGZmNmUyNTZjMDY2ZjQxOTUxMDgzOThmZGZmMDI4MWIyMDk5YTZhMWNkNGM4ZTdhNTI2NmNhOjhkZjdiOWEwNmY0MTI3Mzk1ZWJiN2JjMWY2OWY3YmFlZmM4NmJiY2NmZDRlMDc2NzFhMDM1MzVlZmEwZDExNDU6YjExZWMyMjkwNTk3NTk3MTM1YTkxZGY4NDgxMjg3NDdiYTc2OGFkM2ZjYWYwYmI3NTBiMjkyMTZlMmUzYzJkMTo3ZmE4ZGFmY2FiZWQ0YzY5ODI1YzNlY2FkNDllMTdhYTRkZjUwNmY2Zjk4N2EzZDYyNzM5ODkwMzVjMWI4NjYzOjI1NGM1MzE0ODczYzI3YThkZTNkYjUzNDdmNTZlYmQ5ZWIyYmY0NmNjODgxMmE0MzYxMWY5OGUzOGFjMzdiYTIiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQoY3BhdGgpLyQoYnVuZGxlLWlkKSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfQogICAgICBdLAogICAgICAiZGV2aWNlcyI6IFtdLAogICAgICAic2FuZGJveF9waWRucyI6IGZhbHNlLAogICAgICAiZXhlY19jb21tYW5kcyI6IFtdLAogICAgICAiZW52X21hcCI6IHsKICAgICAgICAiSE9TVE5BTUUiOiAiJChob3N0LW5hbWUpIiwKICAgICAgICAiUEFUSCI6ICIvdXNyL2xvY2FsL3NiaW46L3Vzci9sb2NhbC9iaW46L3Vzci9zYmluOi91c3IvYmluOi9zYmluOi9iaW4iCiAgICAgIH0KICAgIH0KICBdLAogICJjb21tb24iOiB7CiAgICAiY3BhdGgiOiAiL3J1bi9rYXRhLWNvbnRhaW5lcnMvc2hhcmVkL2NvbnRhaW5lcnMiLAogICAgIm1vdW50X3NvdXJjZV9jcGF0aCI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zaGFyZWQvY29udGFpbmVycyIsCiAgICAic2ZwcmVmaXgiOiAiXiQoY3BhdGgpLyQoYnVuZGxlLWlkKS1bYS16MC05XXsxNn0tIiwKICAgICJzcGF0aCI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L3N0b3JhZ2UiLAogICAgImlwdjRfYSI6ICIoKFswLTldfFsxLTldWzAtOV18MVswLTldezJ9fDJbMC00XVswLTldfDI1WzAtNV0pXFwuKXszfShbMC05XXxbMS05XVswLTldfDFbMC05XXsyfXwyWzAtNF1bMC05XXwyNVswLTVdKSIsCiAgICAiaXBfcCI6ICJbMC05XXsxLDV9IiwKICAgICJzdmNfbmFtZSI6ICJbQS1aX1xcLlxcLV0rIiwKICAgICJkbnNfbGFiZWwiOiAiW2EtekEtWjAtOV9cXC5cXC1dKyIsCiAgICAic19zb3VyY2UxIjogIl4uLjJbMC05XXszfV9bMC0xXVswLTldX1swLTNdWzAtOV1fWzAtMl1bMC05XV9bMC01XVswLTldX1swLTVdWzAtOV1cXC5bMC05XXsxLDEwfSQiLAogICAgInNfc291cmNlMiI6ICJeLi5kYXRhLyIsCiAgICAiZG5zX3N1YmRvbWFpbiI6ICJeW2EtejAtOV0oWy1hLXowLTldKlthLXowLTldKT8kIiwKICAgICJwb2RfdWlkIjogIl5bMC05YS1mQS1GXXs4fS1bMC05YS1mQS1GXXs0fS1bMC05YS1mQS1GXXs0fS1bMC05YS1mQS1GXXs0fS1bMC05YS1mQS1GXXsxMn0kIiwKICAgICJkZWZhdWx0X2NhcHMiOiBbCiAgICAgICJDQVBfQ0hPV04iLAogICAgICAiQ0FQX0RBQ19PVkVSUklERSIsCiAgICAgICJDQVBfRlNFVElEIiwKICAgICAgIkNBUF9GT1dORVIiLAogICAgICAiQ0FQX01LTk9EIiwKICAgICAgIkNBUF9ORVRfUkFXIiwKICAgICAgIkNBUF9TRVRHSUQiLAogICAgICAiQ0FQX1NFVFVJRCIsCiAgICAgICJDQVBfU0VURkNBUCIsCiAgICAgICJDQVBfU0VUUENBUCIsCiAgICAgICJDQVBfTkVUX0JJTkRfU0VSVklDRSIsCiAgICAgICJDQVBfU1lTX0NIUk9PVCIsCiAgICAgICJDQVBfS0lMTCIsCiAgICAgICJDQVBfQVVESVRfV1JJVEUiCiAgICBdLAogICAgInByaXZpbGVnZWRfY2FwcyI6IFsKICAgICAgIkNBUF9DSE9XTiIsCiAgICAgICJDQVBfREFDX09WRVJSSURFIiwKICAgICAgIkNBUF9EQUNfUkVBRF9TRUFSQ0giLAogICAgICAiQ0FQX0ZPV05FUiIsCiAgICAgICJDQVBfRlNFVElEIiwKICAgICAgIkNBUF9LSUxMIiwKICAgICAgIkNBUF9TRVRHSUQiLAogICAgICAiQ0FQX1NFVFVJRCIsCiAgICAgICJDQVBfU0VUUENBUCIsCiAgICAgICJDQVBfTElOVVhfSU1NVVRBQkxFIiwKICAgICAgIkNBUF9ORVRfQklORF9TRVJWSUNFIiwKICAgICAgIkNBUF9ORVRfQlJPQURDQVNUIiwKICAgICAgIkNBUF9ORVRfQURNSU4iLAogICAgICAiQ0FQX05FVF9SQVciLAogICAgICAiQ0FQX0lQQ19MT0NLIiwKICAgICAgIkNBUF9JUENfT1dORVIiLAogICAgICAiQ0FQX1NZU19NT0RVTEUiLAogICAgICAiQ0FQX1NZU19SQVdJTyIsCiAgICAgICJDQVBfU1lTX0NIUk9PVCIsCiAgICAgICJDQVBfU1lTX1BUUkFDRSIsCiAgICAgICJDQVBfU1lTX1BBQ0NUIiwKICAgICAgIkNBUF9TWVNfQURNSU4iLAogICAgICAiQ0FQX1NZU19CT09UIiwKICAgICAgIkNBUF9TWVNfTklDRSIsCiAgICAgICJDQVBfU1lTX1JFU09VUkNFIiwKICAgICAgIkNBUF9TWVNfVElNRSIsCiAgICAgICJDQVBfU1lTX1RUWV9DT05GSUciLAogICAgICAiQ0FQX01LTk9EIiwKICAgICAgIkNBUF9MRUFTRSIsCiAgICAgICJDQVBfQVVESVRfV1JJVEUiLAogICAgICAiQ0FQX0FVRElUX0NPTlRST0wiLAogICAgICAiQ0FQX1NFVEZDQVAiLAogICAgICAiQ0FQX01BQ19PVkVSUklERSIsCiAgICAgICJDQVBfTUFDX0FETUlOIiwKICAgICAgIkNBUF9TWVNMT0ciLAogICAgICAiQ0FQX1dBS0VfQUxBUk0iLAogICAgICAiQ0FQX0JMT0NLX1NVU1BFTkQiLAogICAgICAiQ0FQX0FVRElUX1JFQUQiLAogICAgICAiQ0FQX1BFUkZNT04iLAogICAgICAiQ0FQX0JQRiIsCiAgICAgICJDQVBfQ0hFQ0tQT0lOVF9SRVNUT1JFIgogICAgXSwKICAgICJ2aXJ0aW9fYmxrX3N0b3JhZ2VfY2xhc3NlcyI6IFsKICAgICAgImNjLWxvY2FsLWNzaSIsCiAgICAgICJjYy1tYW5hZ2VkLWNzaSIsCiAgICAgICJjYy1tYW5hZ2VkLXByZW1pdW0tY3NpIgogICAgXSwKICAgICJzbWJfc3RvcmFnZV9jbGFzc2VzIjogWwogICAgICB7CiAgICAgICAgIm5hbWUiOiAiYXp1cmVmaWxlLWNzaS1rYXRhLWNjIiwKICAgICAgICAibW91bnRfb3B0aW9ucyI6IFsKICAgICAgICAgICJkaXJfbW9kZT0wNzc3IiwKICAgICAgICAgICJmaWxlX21vZGU9MDc3NyIsCiAgICAgICAgICAibWZzeW1saW5rcyIsCiAgICAgICAgICAiY2FjaGU9c3RyaWN0IiwKICAgICAgICAgICJub3NoYXJlc29jayIsCiAgICAgICAgICAiYWN0aW1lbz0zMCIsCiAgICAgICAgICAibm9icmwiCiAgICAgICAgXQogICAgICB9CiAgICBdCiAgfSwKICAic2FuZGJveCI6IHsKICAgICJzdG9yYWdlcyI6IFsKICAgICAgewogICAgICAgICJkcml2ZXIiOiAiZXBoZW1lcmFsIiwKICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAic291cmNlIjogInNobSIsCiAgICAgICAgImZzdHlwZSI6ICJ0bXBmcyIsCiAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgIm5vZGV2IiwKICAgICAgICAgICJtb2RlPTE3NzciLAogICAgICAgICAgInNpemU9NjcxMDg4NjQiCiAgICAgICAgXSwKICAgICAgICAibW91bnRfcG9pbnQiOiAiL3J1bi9rYXRhLWNvbnRhaW5lcnMvc2FuZGJveC9zaG0iLAogICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgfQogICAgXQogIH0sCiAgInJlcXVlc3RfZGVmYXVsdHMiOiB7CiAgICAiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdCI6IHsKICAgICAgImFsbG93X2Vudl9yZWdleCI6IFsKICAgICAgICAiXkhPU1ROQU1FPSQoZG5zX2xhYmVsKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfUE9SVF8kKGlwX3ApX1RDUD10Y3A6Ly8kKGlwdjRfYSk6JChpcF9wKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfUE9SVF8kKGlwX3ApX1RDUF9QUk9UTz10Y3AkIiwKICAgICAgICAiXiQoc3ZjX25hbWUpX1BPUlRfJChpcF9wKV9UQ1BfUE9SVD0kKGlwX3ApJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9QT1JUXyQoaXBfcClfVENQX0FERFI9JChpcHY0X2EpJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9TRVJWSUNFX0hPU1Q9JChpcHY0X2EpJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9TRVJWSUNFX1BPUlQ9JChpcF9wKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfU0VSVklDRV9QT1JUXyQoZG5zX2xhYmVsKT0kKGlwX3ApJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9QT1JUPXRjcDovLyQoaXB2NF9hKTokKGlwX3ApJCIsCiAgICAgICAgIl5BWlVSRV9DTElFTlRfSUQ9W0EtRmEtZjAtOS1dKiQiLAogICAgICAgICJeQVpVUkVfVEVOQU5UX0lEPVtBLUZhLWYwLTktXSokIiwKICAgICAgICAiXkFaVVJFX0ZFREVSQVRFRF9UT0tFTl9GSUxFPS92YXIvcnVuL3NlY3JldHMvYXp1cmUvdG9rZW5zL2F6dXJlLWlkZW50aXR5LXRva2VuJCIsCiAgICAgICAgIl5BWlVSRV9BVVRIT1JJVFlfSE9TVD1odHRwczovL2xvZ2luXFwubWljcm9zb2Z0b25saW5lXFwuY29tLyQiLAogICAgICAgICJeVEVSTT14dGVybSQiCiAgICAgIF0sCiAgICAgICJhbGxvd19lbnZfcmVnZXhfbWFwIjogewogICAgICAgICJDUFVfTElNSVQiOiAiXlswLTldKyQiLAogICAgICAgICJKT0JfQ09NUExFVElPTl9JTkRFWCI6ICJeWzAtOV0qJCIsCiAgICAgICAgIk1FTU9SWV9MSU1JVCI6ICJeWzAtOV0rJCIKICAgICAgfQogICAgfSwKICAgICJDb3B5RmlsZVJlcXVlc3QiOiBbCiAgICAgICIkKHNmcHJlZml4KSIKICAgIF0sCiAgICAiRXhlY1Byb2Nlc3NSZXF1ZXN0IjogewogICAgICAiYWxsb3dlZF9jb21tYW5kcyI6IFtdLAogICAgICAicmVnZXgiOiBbXQogICAgfSwKICAgICJVcGRhdGVSb3V0ZXNSZXF1ZXN0IjogewogICAgICAiZm9yYmlkZGVuX2RldmljZV9uYW1lcyI6IFsKICAgICAgICAibG8iCiAgICAgIF0sCiAgICAgICJmb3JiaWRkZW5fc291cmNlX3JlZ2V4IjogWwogICAgICAgICJeKD86MHswLDR9Oil7MCw3fTB7MCwzfTEkIiwKICAgICAgICAiXjEyN1xcLig/OlswLTldezEsM31cXC4pezJ9WzAtOV17MSwzfSQiCiAgICAgIF0KICAgIH0sCiAgICAiVXBkYXRlSW50ZXJmYWNlUmVxdWVzdCI6IHsKICAgICAgImFsbG93X3Jhd19mbGFncyI6IDEyOCwKICAgICAgImZvcmJpZGRlbl9uYW1lcyI6IFsKICAgICAgICAibG8iCiAgICAgIF0sCiAgICAgICJmb3JiaWRkZW5faHdfYWRkcnMiOiBbCiAgICAgICAgIjAwOjAwOjAwOjAwOjAwOjAwIgogICAgICBdCiAgICB9LAogICAgIkNsb3NlU3RkaW5SZXF1ZXN0IjogZmFsc2UsCiAgICAiUmVhZFN0cmVhbVJlcXVlc3QiOiBmYWxzZSwKICAgICJVcGRhdGVFcGhlbWVyYWxNb3VudHNSZXF1ZXN0IjogZmFsc2UsCiAgICAiV3JpdGVTdHJlYW1SZXF1ZXN0IjogZmFsc2UKICB9Cn0= + spec: + runtimeClassName: kata-cc + containers: + - name: echoheaders + image: "registry.k8s.io/e2e-test-images/agnhost:2.41" + command: + - /agnhost + - netexec + - "--http-port=8080" + ports: + - containerPort: 8080 + readinessProbe: + httpGet: + path: /healthz + port: 8080 + periodSeconds: 1 + timeoutSeconds: 1 + successThreshold: 1 + failureThreshold: 10 diff --git a/src/agent/samples/policy/yaml/kubernetes/conformance2/ingress-http2-rc.yaml b/src/agent/samples/policy/yaml/kubernetes/conformance2/ingress-http2-rc.yaml new file mode 100644 index 000000000000..393289e84eed --- /dev/null +++ b/src/agent/samples/policy/yaml/kubernetes/conformance2/ingress-http2-rc.yaml @@ -0,0 +1,29 @@ +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: echoheaders +spec: + replicas: 1 + selector: + matchLabels: + app: echoheaders + template: + metadata: + labels: + app: echoheaders + annotations: + io.katacontainers.config.agent.policy: IyBDb3B5cmlnaHQgKGMpIDIwMjMgTWljcm9zb2Z0IENvcnBvcmF0aW9uCiMKIyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMAojCnBhY2thZ2UgYWdlbnRfcG9saWN5CgppbXBvcnQgZnV0dXJlLmtleXdvcmRzLmluCmltcG9ydCBmdXR1cmUua2V5d29yZHMuZXZlcnkKCiMgRGVmYXVsdCB2YWx1ZXMsIHJldHVybmVkIGJ5IE9QQSB3aGVuIHJ1bGVzIGNhbm5vdCBiZSBldmFsdWF0ZWQgdG8gdHJ1ZS4KZGVmYXVsdCBBZGRBUlBOZWlnaGJvcnNSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgQWRkU3dhcFJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBDbG9zZVN0ZGluUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IENvcHlGaWxlUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IENyZWF0ZUNvbnRhaW5lclJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBDcmVhdGVTYW5kYm94UmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IERlc3Ryb3lTYW5kYm94UmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgRXhlY1Byb2Nlc3NSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgR2V0T09NRXZlbnRSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBHdWVzdERldGFpbHNSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBMaXN0SW50ZXJmYWNlc1JlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBMaXN0Um91dGVzUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IE1lbUhvdHBsdWdCeVByb2JlUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IE9ubGluZUNQVU1lbVJlcXVlc3QgOj0gdHJ1ZQpkZWZhdWx0IFBhdXNlQ29udGFpbmVyUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFJlYWRTdHJlYW1SZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgUmVtb3ZlQ29udGFpbmVyUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgUmVtb3ZlU3RhbGVWaXJ0aW9mc1NoYXJlTW91bnRzUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgUmVzZWVkUmFuZG9tRGV2UmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFJlc3VtZUNvbnRhaW5lclJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBTZXRHdWVzdERhdGVUaW1lUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFNldFBvbGljeVJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBTaWduYWxQcm9jZXNzUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgU3RhcnRDb250YWluZXJSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBTdGFydFRyYWNpbmdSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgU3RhdHNDb250YWluZXJSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBTdG9wVHJhY2luZ1JlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBUdHlXaW5SZXNpemVSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBVcGRhdGVDb250YWluZXJSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgVXBkYXRlRXBoZW1lcmFsTW91bnRzUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFVwZGF0ZUludGVyZmFjZVJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBVcGRhdGVSb3V0ZXNSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgV2FpdFByb2Nlc3NSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBXcml0ZVN0cmVhbVJlcXVlc3QgOj0gZmFsc2UKCiMgQWxsb3dSZXF1ZXN0c0ZhaWxpbmdQb2xpY3kgOj0gdHJ1ZSBjb25maWd1cmVzIHRoZSBBZ2VudCB0byAqYWxsb3cgYW55CiMgcmVxdWVzdHMgY2F1c2luZyBhIHBvbGljeSBmYWlsdXJlKi4gVGhpcyBpcyBhbiB1bnNlY3VyZSBjb25maWd1cmF0aW9uCiMgYnV0IGlzIHVzZWZ1bCBmb3IgYWxsb3dpbmcgdW5zZWN1cmUgcG9kcyB0byBzdGFydCwgdGhlbiBjb25uZWN0IHRvCiMgdGhlbSBhbmQgaW5zcGVjdCBPUEEgbG9ncyBmb3IgdGhlIHJvb3QgY2F1c2Ugb2YgYSBmYWlsdXJlLgpkZWZhdWx0IEFsbG93UmVxdWVzdHNGYWlsaW5nUG9saWN5IDo9IGZhbHNlCgojIENvbnN0YW50cwpTX05BTUVfS0VZID0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZSIKU19OQU1FU1BBQ0VfS0VZID0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZXNwYWNlIgpCVU5ETEVfSUQgPSAiW2EtejAtOV17NjR9IgoKQ3JlYXRlQ29udGFpbmVyUmVxdWVzdDo9IHJlc3AgewogICAgbm90IGlzX251bGwoaW5wdXQuZW52X21hcCkKICAgIAogICAgaV9lbnZfbWFwIDo9IGlucHV0LmVudl9tYXAKICAgIAogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBwX2Vudl9tYXAgOj0gcF9jb250YWluZXIuZW52X21hcCAgCiAgICBhbGxvd19lbnZfbWFwKHBfZW52X21hcCwgaV9lbnZfbWFwKQogICAgCiAgICBpX3Byb2Nlc3MgOj0gaW5wdXQuYmFzZS5PQ0kuUHJvY2VzcwogICAgCiAgICBwX3Byb2Nlc3MgOj0gcF9jb250YWluZXIuT0NJLlByb2Nlc3MKICAgIAogICAgYWxsb3dfYXJncyhpX3Byb2Nlc3MsIHBfcHJvY2VzcywgaV9lbnZfbWFwKQoKICAgIHJlc3AgPSBDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uKGlucHV0LmJhc2UpCiAgICBwcmludCgiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdDogdHJ1ZSIpCn0KCmFsbG93X2FyZ3MoaV9wcm9jZXNzLCBwX3Byb2Nlc3MsIGlfZW52X21hcCkgewogICAgaV9hcmdzIDo9IGlfcHJvY2Vzcy5BcmdzCiAgICBwX2FyZ3MgOj0gcF9wcm9jZXNzLkFyZ3MKICAgIHByaW50KCJhbGxvd19hcmdzOiBpX2FyZ3MgPSIsIGlfYXJncywgInBfYXJncyA9IiwgcF9hcmdzKQogICAgY291bnQoaV9hcmdzKSA9PSBjb3VudChwX2FyZ3MpCiAgICBldmVyeSBpLCBpX2FyZyBpbiBpX2FyZ3MgewogICAgICAgIHByaW50KCJhbGxvd19hcmdzOiBpX2FyZyA9IiwgaV9hcmcpCiAgICAgICAgcF9hcmdfcmVwbGFjZWQgOj0gcmVwbGFjZV9lbnZfdmFyaWFibGVzKHBfYXJnc1tpXSwgaV9lbnZfbWFwKQogICAgICAgIHByaW50KCJhbGxvd19hcmdzOiBwX2FyZ19yZXBsYWNlZCA9IiwgcF9hcmdfcmVwbGFjZWQpCiAgICAgICAgcF9hcmdfcmVwbGFjZWQyIDo9IHJlcGxhY2UocF9hcmdfcmVwbGFjZWQsICIkJCIsICIkIikKICAgICAgICBwcmludCgiYWxsb3dfYXJnczogcF9hcmdfcmVwbGFjZWQyID0iLCBwX2FyZ19yZXBsYWNlZDIpCiAgICAgICAgaV9hcmcgPT0gcF9hcmdfcmVwbGFjZWQyCiAgICB9CiAgICBwcmludCgiYWxsb3dfYXJnczogdHJ1ZSIpCn0KCmFsbG93X2FyZ3MoaV9wcm9jZXNzLCBwX3Byb2Nlc3MsIGlfZW52X21hcCkgewogICAgbm90IGlfcHJvY2Vzcy5BcmdzCiAgICBub3QgcF9wcm9jZXNzLkFyZ3MKICAgIHByaW50KCJhbGxvd19hcmdzMjogbm8gYXJncyIpCn0KCiMgdGhpcyBmdW5jdGlvbiByZXBsYWNlcyBhbGwgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyBpbiBhIHN0cmluZywgZ2l2ZW4gYSBtYXAgb2YgZW52aXJvbm1lbnQga2V5cyB0byBlbnZpcm9ubWVudCB2YWx1ZXMKIyBlZyBzdHIgPSAiZWNobyAkKENMVVNURVJfSUQpOyBlY2hvICQoTk9ERV9OQU1FKTsiCiMgZW52X21hcCA9IHsiQ0xVU1RFUl9JRCI6ICJhYmMiLCAiTk9ERV9OQU1FIiA6ICJ4eXoifQojIHJlc3VsdCA9ICJlY2hvIGFiYzsgZWNobyB4eXo7IgpyZXBsYWNlX2Vudl92YXJpYWJsZXMoc3RyLCBlbnZfbWFwKSA9IHJlc3VsdCB7CiAgICAjIG1ha2UgYW4gYXJyYXkgb2YgdGhlIGtleXMgZWcgWyJDTFVTVEVSX0lEIiwgIk5PREVfTkFNRSJdCiAgICBrZXlzIDo9IFt4IHwgc29tZSB4IGluIG9iamVjdC5rZXlzKGVudl9tYXApXQogICAgcmVzdWx0IDo9IHJlcGxhY2Vfc3RyX3JlYyhzdHIsIGVudl9tYXAsIGtleXMsIGNvdW50KGtleXMpIC0gMSkKfQoKIyBiYXNlIGNhc2UKcmVwbGFjZV9zdHJfcmVjKHN0ciwgZW52X21hcCwgYXJyX2tleXMsIGkpID0gcmVzdWx0IHsKICAgIGkgPCAwCiAgICByZXN1bHQgOj0gc3RyCn0KCiMgcmVjdXJzaXZlIHN0ZXAKcmVwbGFjZV9zdHJfcmVjKHN0ciwgZW52X21hcCwgYXJyX2tleXMsIGkpID0gcmVzdWx0IHsKICAgIGkgPj0gMAogICAga2V5IDo9IGFycl9rZXlzW2ldCiAgICBlbnZfa2V5MSA6PSBjb25jYXQoIiIsIFsiJCgiLCBrZXksICIpIl0pCiAgICAjIHJlcGxhY2UgJChWQVIpIHdpdGggdmFsdWUKICAgIG5ld19zdHIxIDo9IHJlcGxhY2Uoc3RyLCBlbnZfa2V5MSwgZW52X21hcFtrZXldKQogICAgIyByZXBsYWNlIG5leHQgZW52aXJvbm1lbnQgdmFyaWFibGUKICAgIHJlc3VsdCA9IHJlcGxhY2Vfc3RyX3JlYyhuZXdfc3RyMSwgZW52X21hcCwgYXJyX2tleXMsIGkgLSAxKQp9CgphbGxvd19lbnZfbWFwKHBfZW52X21hcCwgaV9lbnZfbWFwKSB7CiAgICBwcmludCgiYWxsb3dfZW52X21hcDogcF9lbnZfbWFwID0iLCBwX2Vudl9tYXApCiAgICBldmVyeSBlbnZfa2V5LCBlbnZfdmFsIGluIGlfZW52X21hcCB7CiAgICAgICAgcHJpbnQoImFsbG93X2VudjogZW52X2tleSA9IiwgZW52X2tleSwgImVudl92YWwgPSIsIGVudl92YWwpCiAgICAgICAgYWxsb3dfZW52X21hcF9lbnRyeShlbnZfa2V5LCBlbnZfdmFsLCBwX2Vudl9tYXApCiAgICB9CiAgICBwcmludCgiYWxsb3dfZW52X21hcDogdHJ1ZSIpCn0KCiMgQWxsb3cgZXhhY3QgbWF0Y2gKYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBpX3ZhbCA9PSBwX3ZhbAogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnk6IHRydWUiKQp9CgojIEFsbG93IHJlc291cmNlRmllbGRSZWYgdmFsdWVzIChlLmcuLCAibGltaXRzLmNwdSIpLgphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgICMgYSB2YXJpYWJsZSB3ZSBzaG91bGQgYmUgdmFsaWRhdGluZyB1c2luZyBhIHJlZ2V4IGZyb20gc2V0dGluZ3MKICAgIHBfdmFsID09ICIkKHZhbGlkYXRlLWZyb20tc2V0dGluZ3MpIgogICAgcmVnZXhfdmFsIDo9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuQ3JlYXRlQ29udGFpbmVyUmVxdWVzdC5hbGxvd19lbnZfcmVnZXhfbWFwW2tleV0KICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4X3ZhbCwgaV92YWwpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSAyOiB0cnVlIikKfQoKIyBBbGxvdyBub2RlLW5hbWUKYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChub2RlLW5hbWUpIgogICAgcmVnZXgubWF0Y2gocG9saWN5X2RhdGEuY29tbW9uLmRuc19zdWJkb21haW4gLCBpX3ZhbCkKICAgIHByaW50KCJhbGxvd19lbnZfbWFwX2VudHJ5IDM6IHRydWUiKQp9CgojIEFsbG93IGhvc3QtbmFtZQphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgIHBfdmFsID09ICIkKGhvc3QtbmFtZSkiCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24uZG5zX2xhYmVsICwgaV92YWwpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSA0OiB0cnVlIikKfQoKIyBBbGxvdyBwb2QtdWlkCmFsbG93X2Vudl9tYXBfZW50cnkoa2V5LCBpX3ZhbCwgcF9lbnZfbWFwKSB7CiAgICBwX3ZhbCA6PSBwX2Vudl9tYXBba2V5XQogICAgcF92YWwgPT0gIiQocG9kLXVpZCkiCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24ucG9kX3VpZCAsIGlfdmFsKQogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgNTogdHJ1ZSIpCn0KCiMgQWxsb3cgZmllbGRSZWYgImZpZWxkUGF0aDogc3RhdHVzLnBvZElQIiB2YWx1ZXMuCmFsbG93X2Vudl9tYXBfZW50cnkoa2V5LCBpX3ZhbCwgcF9lbnZfbWFwKSB7CiAgICBpc19pcChpX3ZhbCkKCiAgICBwX3ZhbCA6PSBwX2Vudl9tYXBba2V5XQogICAgcF92YXIgOj0gY29uY2F0KCI9IiwgW2tleSwgcF92YWxdKQogICAgYWxsb3dfcG9kX2lwX3ZhcihrZXksIHBfdmFyKQogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgNjogdHJ1ZSIpCn0KCiMgQWxsb3cgZmllbGRSZWYgImZpZWxkUGF0aDogc3RhdHVzLmhvc3RJUCIgdmFsdWVzLgphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgaXNfaXAoaV92YWwpCgogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgIHBfdmFyIDo9IGNvbmNhdCgiPSIsIFtrZXksIHBfdmFsXSkKICAgIGFsbG93X2hvc3RfaXBfdmFyKGtleSwgcF92YXIpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSA3OiB0cnVlIikKfQoKIyBNYXRjaCBpbnB1dCB3aXRoIG9uZSBvZiB0aGUgcG9saWN5IHZhcmlhYmxlcywgYWZ0ZXIgc3Vic3RpdHV0aW5nICQoc2FuZGJveC1uYW1lKS4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChzYW5kYm94LW5hbWUpIgogICAgc19uYW1lIDo9IGlucHV0LmJhc2UuT0NJLkFubm90YXRpb25zW1NfTkFNRV9LRVldCiAgICBwX3ZhcjIgOj0gcmVwbGFjZShwX3ZhbCwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHBfdmFyMiA9PSBpX3ZhbAogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgODogdHJ1ZSIpCn0KCiMgTWF0Y2ggaW5wdXQgd2l0aCBvbmUgb2YgdGhlIHBvbGljeSB2YXJpYWJsZXMsIGFmdGVyIHN1YnN0aXR1dGluZyAkKHNhbmRib3gtbmFtZXNwYWNlKS4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChzYW5kYm94LW5hbWVzcGFjZSkiCiAgICBzX25hbWVzcGFjZSA6PSBpbnB1dC5iYXNlLk9DSS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwX3ZhcjIgOj0gcmVwbGFjZShwX3ZhbCwgIiQoc2FuZGJveC1uYW1lc3BhY2UpIiwgc19uYW1lc3BhY2UpCiAgICBwX3ZhcjIgPT0gaV92YWwKICAgIHByaW50KCJhbGxvd19lbnZfbWFwX2VudHJ5IDk6IHRydWUiKQp9CgojIEFsbG93IGlucHV0IGVudiB2YXJpYWJsZXMgdGhhdCBtYXRjaCB3aXRoIGEgcmVxdWVzdF9kZWZhdWx0cyByZWdleC4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHNvbWUgcF9yZWdleDEgaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5DcmVhdGVDb250YWluZXJSZXF1ZXN0LmFsbG93X2Vudl9yZWdleAogICAgcF9yZWdleDIgOj0gcmVwbGFjZShwX3JlZ2V4MSwgIiQoaXB2NF9hKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcHY0X2EpCiAgICBwX3JlZ2V4MyA6PSByZXBsYWNlKHBfcmVnZXgyLCAiJChpcF9wKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcF9wKQogICAgcF9yZWdleDQgOj0gcmVwbGFjZShwX3JlZ2V4MywgIiQoc3ZjX25hbWUpIiwgcG9saWN5X2RhdGEuY29tbW9uLnN2Y19uYW1lKQogICAgcF9yZWdleDUgOj0gcmVwbGFjZShwX3JlZ2V4NCwgIiQoZG5zX2xhYmVsKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5kbnNfbGFiZWwpCgogICAgcmVzdWx0IDo9IGNvbmNhdCgiPSIsIFtrZXksIGlfdmFsXSkKICAgIHJlZ2V4Lm1hdGNoKHBfcmVnZXg1LCByZXN1bHQpCgogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgMTA6IHRydWUiKQp9CgpDcmVhdGVDb250YWluZXJSZXF1ZXN0Oj0gcmVzcCB7CiAgICBub3QgaW5wdXQuZW52X21hcAogICAgaV9wcm9jZXNzID0gaW5wdXQuT0NJLlByb2Nlc3MKICAgIHNfbmFtZSA9IGlucHV0Lk9DSS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBwX3Byb2Nlc3MgPSBwX2NvbnRhaW5lci5PQ0kuUHJvY2VzcwogICAgYWxsb3dfZGVwcmVjYXRlZF9hcmdzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUpCiAgICByZXNwID0gQ3JlYXRlQ29udGFpbmVyUmVxdWVzdENvbW1vbihpbnB1dCkKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0MjogdHJ1ZSIpCn0KCkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb24ocmVxKTo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgICMgQ2hlY2sgaWYgdGhlIGlucHV0IHJlcXVlc3Qgc2hvdWxkIGJlIHJlamVjdGVkIGV2ZW4gYmVmb3JlIGNoZWNraW5nIHRoZQogICAgIyBwb2xpY3lfZGF0YS5jb250YWluZXJzIGluZm9ybWF0aW9uLgogICAgYWxsb3dfY3JlYXRlX2NvbnRhaW5lcl9pbnB1dChyZXEpCgogICAgaV9vY2kgOj0gcmVxLk9DSQogICAgaV9zdG9yYWdlcyA6PSByZXEuc3RvcmFnZXMKICAgIGlfZGV2aWNlcyA6PSByZXEuZGV2aWNlcwoKICAgICMgYXJyYXkgb2YgcG9zc2libGUgc3RhdGUgb3BlcmF0aW9ucwogICAgb3BzX2J1aWxkZXIgOj0gW10KCiAgICAjIGNoZWNrIHNhbmRib3ggbmFtZQogICAgc2FuZGJveF9uYW1lID0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FX0tFWV0KICAgIGFkZF9zYW5kYm94X25hbWVfdG9fc3RhdGUgOj0gc3RhdGVfYWxsb3dzKCJzYW5kYm94X25hbWUiLCBzYW5kYm94X25hbWUpCiAgICBvcHNfYnVpbGRlcjEgOj0gY29uY2F0X29wX2lmX25vdF9udWxsKG9wc19idWlsZGVyLCBhZGRfc2FuZGJveF9uYW1lX3RvX3N0YXRlKQoKICAgICMgQ2hlY2sgaWYgYW55IGVsZW1lbnQgZnJvbSB0aGUgcG9saWN5X2RhdGEuY29udGFpbmVycyBhcnJheSBhbGxvd3MgdGhlIGlucHV0IHJlcXVlc3QuCiAgICBzb21lIHBfY29udGFpbmVyIGluIHBvbGljeV9kYXRhLmNvbnRhaW5lcnMKICAgIHByaW50KCI9PT09PT09PSBDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiB0cnlpbmcgbmV4dCBwb2xpY3kgY29udGFpbmVyIikKCiAgICBwX3BpZG5zIDo9IHBfY29udGFpbmVyLnNhbmRib3hfcGlkbnMKICAgIGlfcGlkbnMgOj0gcmVxLnNhbmRib3hfcGlkbnMKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiBwX3BpZG5zID0iLCBwX3BpZG5zLCAiaV9waWRucyA9IiwgaV9waWRucykKICAgIHBfcGlkbnMgPT0gaV9waWRucwoKICAgIHBfb2NpIDo9IHBfY29udGFpbmVyLk9DSQoKICAgICMgY2hlY2sgbmFtZXNwYWNlCiAgICBwX25hbWVzcGFjZSA6PSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBpX25hbWVzcGFjZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwcmludCAoIkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb246IHBfbmFtZXNwYWNlID0iLCBwX25hbWVzcGFjZSwgImlfbmFtZXNwYWNlID0iLCBpX25hbWVzcGFjZSkKICAgIGFkZF9uYW1lc3BhY2VfdG9fc3RhdGUgOj0gYWxsb3dfbmFtZXNwYWNlKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkKICAgIG9wc19idWlsZGVyMiA6PSBjb25jYXRfb3BfaWZfbm90X251bGwob3BzX2J1aWxkZXIxLCBhZGRfbmFtZXNwYWNlX3RvX3N0YXRlKQoKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiBwIFZlcnNpb24gPSIsIHBfb2NpLlZlcnNpb24sICJpIFZlcnNpb24gPSIsIGlfb2NpLlZlcnNpb24pCiAgICBwX29jaS5WZXJzaW9uID09IGlfb2NpLlZlcnNpb24KCiAgICBwcmludCgiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdENvbW1vbjogcCBSZWFkb25seSA9IiwgcF9vY2kuUm9vdC5SZWFkb25seSwgImkgUmVhZG9ubHkgPSIsIGlfb2NpLlJvb3QuUmVhZG9ubHkpCiAgICBwX29jaS5Sb290LlJlYWRvbmx5ID09IGlfb2NpLlJvb3QuUmVhZG9ubHkKCiAgICBhbGxvd19hbm5vKHBfb2NpLCBpX29jaSkKCiAgICBwX3N0b3JhZ2VzIDo9IHBfY29udGFpbmVyLnN0b3JhZ2VzCiAgICBhbGxvd19ieV9hbm5vKHBfb2NpLCBpX29jaSwgcF9zdG9yYWdlcywgaV9zdG9yYWdlcykKCiAgICBwX2RldmljZXMgOj0gcF9jb250YWluZXIuZGV2aWNlcwogICAgYWxsb3dfZGV2aWNlcyhwX2RldmljZXMsIGlfZGV2aWNlcykKCiAgICByZXQgOj0gYWxsb3dfbGludXgob3BzX2J1aWxkZXIyLCBwX29jaSwgaV9vY2kpCiAgICByZXQuYWxsb3dlZAoKICAgIG9wcyA6PSByZXQub3BzCgogICAgcHJpbnQoIkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb246IHRydWUiKQp9CgphbGxvd19jcmVhdGVfY29udGFpbmVyX2lucHV0KHJlcSkgewogICAgcHJpbnQoImFsbG93X2NyZWF0ZV9jb250YWluZXJfaW5wdXQ6IGlucHV0ID0iLCByZXEpCgogICAgY291bnQocmVxLnNoYXJlZF9tb3VudHMpID09IDAKICAgIGlzX251bGwocmVxLnN0cmluZ191c2VyKQoKICAgIGlfb2NpIDo9IHJlcS5PQ0kKICAgIGlzX251bGwoaV9vY2kuSG9va3MpCiAgICBpc19udWxsKGlfb2NpLlNvbGFyaXMpCiAgICBpc19udWxsKGlfb2NpLldpbmRvd3MpCgogICAgaV9saW51eCA6PSBpX29jaS5MaW51eAogICAgY291bnQoaV9saW51eC5HSURNYXBwaW5ncykgPT0gMAogICAgY291bnQoaV9saW51eC5Nb3VudExhYmVsKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlJlc291cmNlcy5EZXZpY2VzKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlJvb3Rmc1Byb3BhZ2F0aW9uKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlVJRE1hcHBpbmdzKSA9PSAwCiAgICBpc19udWxsKGlfbGludXguSW50ZWxSZHQpCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLkJsb2NrSU8pCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLk5ldHdvcmspCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLlBpZHMpCiAgICBpc19udWxsKGlfbGludXguU2VjY29tcCkKCiAgICBpX3Byb2Nlc3MgOj0gaV9vY2kuUHJvY2VzcwogICAgY291bnQoaV9wcm9jZXNzLlNlbGludXhMYWJlbCkgPT0gMAogICAgY291bnQoaV9wcm9jZXNzLlVzZXIuVXNlcm5hbWUpID09IDAKCiAgICBwcmludCgiYWxsb3dfY3JlYXRlX2NvbnRhaW5lcl9pbnB1dDogdHJ1ZSIpCn0KCmFsbG93X25hbWVzcGFjZShwX25hbWVzcGFjZSwgaV9uYW1lc3BhY2UpID0gYWRkX25hbWVzcGFjZSB7CiAgICBwX25hbWVzcGFjZSA9PSBpX25hbWVzcGFjZQogICAgYWRkX25hbWVzcGFjZSA6PSBudWxsCiAgICBwcmludCgiYWxsb3dfbmFtZXNwYWNlIDE6IGlucHV0IG5hbWVzcGFjZSBtYXRjaGVzIHBvbGljeSBkYXRhIikKfQoKYWxsb3dfbmFtZXNwYWNlKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkgPSBhZGRfbmFtZXNwYWNlIHsKICAgIHBfbmFtZXNwYWNlID09ICIiCiAgICBwcmludCgiYWxsb3dfbmFtZXNwYWNlIDI6IG5vIG5hbWVzcGFjZSBmb3VuZCBvbiBwb2xpY3kgZGF0YSIpCiAgICBhZGRfbmFtZXNwYWNlIDo9IHN0YXRlX2FsbG93cygibmFtZXNwYWNlIiwgaV9uYW1lc3BhY2UpCn0KCiMgdmFsdWUgaGFzbid0IGJlZW4gc2VlbiBiZWZvcmUsIHNhdmUgaXQgdG8gc3RhdGUKc3RhdGVfYWxsb3dzKGtleSwgdmFsdWUpID0gYWN0aW9uIHsKICBzdGF0ZSA6PSBnZXRfc3RhdGUoKQogIHByaW50KCJzdGF0ZV9hbGxvd3MgMTogc3RhdGVba2V5XSA9Iiwgc3RhdGVba2V5XSwgInZhbHVlID0iLCB2YWx1ZSkKICBub3Qgc3RhdGVba2V5XQogIHByaW50KCJzdGF0ZV9hbGxvd3MgMTogc2F2aW5nIHRvIHN0YXRlIGtleSA9Iiwga2V5LCAidmFsdWUgPSIsIHZhbHVlKQogIHBhdGggOj0gZ2V0X3N0YXRlX3BhdGgoa2V5KSAKICBhY3Rpb24gOj0gewogICAgIm9wIjogImFkZCIsCiAgICAicGF0aCI6IHBhdGgsIAogICAgInZhbHVlIjogdmFsdWUsCiAgfQp9CgojIHZhbHVlIG1hdGNoZXMgd2hhdCdzIGluIHN0YXRlLCBhbGxvdyBpdApzdGF0ZV9hbGxvd3Moa2V5LCB2YWx1ZSkgPSBhY3Rpb24gewogIHByaW50KCJzdGF0ZV9hbGxvd3MgMjogc3RhcnQiKQogIHN0YXRlIDo9IGdldF9zdGF0ZSgpCiAgcHJpbnQoInN0YXRlX2FsbG93cyAyOiBzdGF0ZVtrZXldID0iLCBzdGF0ZVtrZXldLCAidmFsdWUgPSIsIHZhbHVlKQogIHZhbHVlID09IHN0YXRlW2tleV0KICBwcmludCgic3RhdGVfYWxsb3dzIDI6IGZvdW5kIGtleSA9Iiwga2V5LCAidmFsdWUgPSIsIHZhbHVlLCAiIGluIHN0YXRlIikKICBhY3Rpb24gOj0gbnVsbAp9CgojIGhlbHBlciBmdW5jdGlvbnMgdG8gaW50ZXJhY3Qgd2l0aCB0aGUgc3RhdGUKZ2V0X3N0YXRlKCkgPSBzdGF0ZSB7CiAgc3RhdGUgOj0gZGF0YVsicHN0YXRlIl0KfQoKZ2V0X3N0YXRlX3ZhbChrZXkpID0gdmFsdWUgewogICAgc3RhdGUgOj0gZ2V0X3N0YXRlKCkKICAgIHZhbHVlIDo9IHN0YXRlW2tleV0KfQoKZ2V0X3N0YXRlX3BhdGgoa2V5KSA9IHBhdGggewogICAgIyBwcmVwZW5kICIvcHN0YXRlLyIgdG8ga2V5CiAgICBwYXRoIDo9IGNvbmNhdCgiLyIsIFsiL3BzdGF0ZSIsIGtleV0pCn0KCiMgSGVscGVyIGZ1bmN0aW9ucyB0byBjb25kaXRpb25hbGx5IGNvbmNhdGVuYXRlIG9wIGlzIG5vdCBudWxsCmNvbmNhdF9vcF9pZl9ub3RfbnVsbChvcHMsIG9wKSA9IHJlc3VsdCB7CiAgICBvcCA9PSBudWxsCiAgICByZXN1bHQgOj0gb3BzCn0KCmNvbmNhdF9vcF9pZl9ub3RfbnVsbChvcHMsIG9wKSA9IHJlc3VsdCB7CiAgICBvcCAhPSBudWxsCiAgICByZXN1bHQgOj0gYXJyYXkuY29uY2F0KG9wcywgW29wXSkKfQoKIyBSZWplY3QgdW5leHBlY3RlZCBhbm5vdGF0aW9ucy4KYWxsb3dfYW5ubyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19hbm5vIDE6IHN0YXJ0IikKCiAgICBub3QgaV9vY2kuQW5ub3RhdGlvbnMKCiAgICBwcmludCgiYWxsb3dfYW5ubyAxOiB0cnVlIikKfQphbGxvd19hbm5vKHBfb2NpLCBpX29jaSkgewogICAgcHJpbnQoImFsbG93X2Fubm8gMjogcCBBbm5vdGF0aW9ucyA9IiwgcF9vY2kuQW5ub3RhdGlvbnMpCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiBpIEFubm90YXRpb25zID0iLCBpX29jaS5Bbm5vdGF0aW9ucykKCiAgICBpX2tleXMgOj0gb2JqZWN0LmtleXMoaV9vY2kuQW5ub3RhdGlvbnMpCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiBpIGtleXMgPSIsIGlfa2V5cykKCiAgICBldmVyeSBpX2tleSBpbiBpX2tleXMgewogICAgICAgIGFsbG93X2Fubm9fa2V5KGlfa2V5LCBwX29jaSkKICAgIH0KCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiB0cnVlIikKfQoKYWxsb3dfYW5ub19rZXkoaV9rZXksIHBfb2NpKSB7CiAgICBwcmludCgiYWxsb3dfYW5ub19rZXkgMTogaSBrZXkgPSIsIGlfa2V5KQoKICAgIHN0YXJ0c3dpdGgoaV9rZXksICJpby5rdWJlcm5ldGVzLmNyaS4iKQoKICAgIHByaW50KCJhbGxvd19hbm5vX2tleSAxOiB0cnVlIikKfQphbGxvd19hbm5vX2tleShpX2tleSwgcF9vY2kpIHsKICAgIHByaW50KCJhbGxvd19hbm5vX2tleSAyOiBpIGtleSA9IiwgaV9rZXkpCgogICAgc29tZSBwX2tleSwgXyBpbiBwX29jaS5Bbm5vdGF0aW9ucwogICAgcF9rZXkgPT0gaV9rZXkKCiAgICBwcmludCgiYWxsb3dfYW5ub19rZXkgMjogdHJ1ZSIpCn0KCiMgR2V0IHRoZSB2YWx1ZSBvZiB0aGUgU19OQU1FX0tFWSBhbm5vdGF0aW9uIGFuZAojIGNvcnJlbGF0ZSBpdCB3aXRoIG90aGVyIGFubm90YXRpb25zIGFuZCBwcm9jZXNzIGZpZWxkcy4KYWxsb3dfYnlfYW5ubyhwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpIHsKICAgIHByaW50KCJhbGxvd19ieV9hbm5vIDE6IHN0YXJ0IikKCiAgICBub3QgcF9vY2kuQW5ub3RhdGlvbnNbU19OQU1FX0tFWV0KCiAgICBpX3NfbmFtZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMTogaV9zX25hbWUgPSIsIGlfc19uYW1lKQoKICAgIGlfc19uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FU1BBQ0VfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMTogaV9zX25hbWVzcGFjZSA9IiwgaV9zX25hbWVzcGFjZSkKCiAgICBhbGxvd19ieV9zYW5kYm94X25hbWUocF9vY2ksIGlfb2NpLCBwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBpX3NfbmFtZSwgaV9zX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfYnlfYW5ubyAxOiB0cnVlIikKfQphbGxvd19ieV9hbm5vKHBfb2NpLCBpX29jaSwgcF9zdG9yYWdlcywgaV9zdG9yYWdlcykgewogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMjogc3RhcnQiKQoKICAgIHBfc19uYW1lIDo9IHBfb2NpLkFubm90YXRpb25zW1NfTkFNRV9LRVldCiAgICBpX3NfbmFtZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMjogaV9zX25hbWUgPSIsIGlfc19uYW1lLCAicF9zX25hbWUgPSIsIHBfc19uYW1lKQoKICAgIGFsbG93X3NhbmRib3hfbmFtZShwX3NfbmFtZSwgaV9zX25hbWUpCgogICAgaV9zX25hbWVzcGFjZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwcmludCgiYWxsb3dfYnlfYW5ubyAyOiBpX3NfbmFtZXNwYWNlID0iLCBpX3NfbmFtZXNwYWNlKQoKICAgIGFsbG93X2J5X3NhbmRib3hfbmFtZShwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMsIGlfc19uYW1lLCBpX3NfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd19ieV9hbm5vIDI6IHRydWUiKQp9CgphbGxvd19ieV9zYW5kYm94X25hbWUocF9vY2ksIGlfb2NpLCBwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfYnlfc2FuZGJveF9uYW1lOiBzdGFydCIpCgogICAgaV9uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FU1BBQ0VfS0VZXQoKICAgIGFsbG93X2J5X2NvbnRhaW5lcl90eXBlcyhwX29jaSwgaV9vY2ksIHNfbmFtZSwgaV9uYW1lc3BhY2UpCiAgICBhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZChwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpCiAgICBhbGxvd19wcm9jZXNzKHBfb2NpLlByb2Nlc3MsIGlfb2NpLlByb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpCgogICAgcHJpbnQoImFsbG93X2J5X3NhbmRib3hfbmFtZTogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfbmFtZShwX3NfbmFtZSwgaV9zX25hbWUpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X25hbWU6IHN0YXJ0IikKICAgIHJlZ2V4Lm1hdGNoKHBfc19uYW1lLCBpX3NfbmFtZSkKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9uYW1lOiB0cnVlIikKfQoKIyBDaGVjayB0aGF0IHRoZSAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLXR5cGUiIGFuZAojICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIiBhbm5vdGF0aW9ucyBkZXNpZ25hdGUgdGhlCiMgZXhwZWN0ZWQgdHlwZSAtIGVpdGhlciBhICJzYW5kYm94IiBvciBhICJjb250YWluZXIiLiBUaGVuLCB2YWxpZGF0ZQojIG90aGVyIGFubm90YXRpb25zIGJhc2VkIG9uIHRoZSBhY3R1YWwgInNhbmRib3giIG9yICJjb250YWluZXIiIHZhbHVlCiMgZnJvbSB0aGUgaW5wdXQgY29udGFpbmVyLgphbGxvd19ieV9jb250YWluZXJfdHlwZXMocF9vY2ksIGlfb2NpLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfYnlfY29udGFpbmVyX3R5cGVzOiBjaGVja2luZyBpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSIpCgogICAgY190eXBlIDo9ICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSIKICAgIAogICAgcF9jcmlfdHlwZSA6PSBwX29jaS5Bbm5vdGF0aW9uc1tjX3R5cGVdCiAgICBpX2NyaV90eXBlIDo9IGlfb2NpLkFubm90YXRpb25zW2NfdHlwZV0KICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZXM6IHBfY3JpX3R5cGUgPSIsIHBfY3JpX3R5cGUsICJpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgcF9jcmlfdHlwZSA9PSBpX2NyaV90eXBlCgogICAgYWxsb3dfYnlfY29udGFpbmVyX3R5cGUoaV9jcmlfdHlwZSwgcF9vY2ksIGlfb2NpLCBzX25hbWUsIHNfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZXM6IHRydWUiKQp9CgphbGxvd19ieV9jb250YWluZXJfdHlwZShpX2NyaV90eXBlLCBwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAxOiBpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgaV9jcmlfdHlwZSA9PSAic2FuZGJveCIKCiAgICBpX2thdGFfdHlwZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1siaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5jb250YWluZXJfdHlwZSJdCiAgICBwcmludCgiYWxsb3dfYnlfY29udGFpbmVyX3R5cGUgMTogaV9rYXRhX3R5cGUgPSIsIGlfa2F0YV90eXBlKQogICAgaV9rYXRhX3R5cGUgPT0gInBvZF9zYW5kYm94IgoKICAgIGFsbG93X3NhbmRib3hfY29udGFpbmVyX25hbWUocF9vY2ksIGlfb2NpKQogICAgYWxsb3dfc2FuZGJveF9uZXRfbmFtZXNwYWNlKHBfb2NpLCBpX29jaSkKICAgIGFsbG93X3NhbmRib3hfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpCgogICAgcHJpbnQoImFsbG93X2J5X2NvbnRhaW5lcl90eXBlIDE6IHRydWUiKQp9CgphbGxvd19ieV9jb250YWluZXJfdHlwZShpX2NyaV90eXBlLCBwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiBpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgaV9jcmlfdHlwZSA9PSAiY29udGFpbmVyIgoKICAgIGlfa2F0YV90eXBlIDo9IGlfb2NpLkFubm90YXRpb25zWyJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIl0KICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiBpX2thdGFfdHlwZSA9IiwgaV9rYXRhX3R5cGUpCiAgICBpX2thdGFfdHlwZSA9PSAicG9kX2NvbnRhaW5lciIKCiAgICBhbGxvd19jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpCiAgICBhbGxvd19uZXRfbmFtZXNwYWNlKHBfb2NpLCBpX29jaSkKICAgIGFsbG93X2xvZ19kaXJlY3RvcnkocF9vY2ksIGlfb2NpKQoKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiB0cnVlIikKfQoKIyAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLW5hbWUiIGFubm90YXRpb24KYWxsb3dfc2FuZGJveF9jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X2NvbnRhaW5lcl9uYW1lOiBzdGFydCIpCgogICAgY29udGFpbmVyX2Fubm90YXRpb25fbWlzc2luZyhwX29jaSwgaV9vY2ksICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItbmFtZSIpCgogICAgcHJpbnQoImFsbG93X3NhbmRib3hfY29udGFpbmVyX25hbWU6IHRydWUiKQp9CgphbGxvd19jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19jb250YWluZXJfbmFtZTogc3RhcnQiKQoKICAgIGFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uKHBfb2NpLCBpX29jaSwgImlvLmt1YmVybmV0ZXMuY3JpLmNvbnRhaW5lci1uYW1lIikKCiAgICBwcmludCgiYWxsb3dfY29udGFpbmVyX25hbWU6IHRydWUiKQp9Cgpjb250YWluZXJfYW5ub3RhdGlvbl9taXNzaW5nKHBfb2NpLCBpX29jaSwga2V5KSB7CiAgICBwcmludCgiY29udGFpbmVyX2Fubm90YXRpb25fbWlzc2luZzoiLCBrZXkpCgogICAgbm90IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIG5vdCBpX29jaS5Bbm5vdGF0aW9uc1trZXldCgogICAgcHJpbnQoImNvbnRhaW5lcl9hbm5vdGF0aW9uX21pc3Npbmc6IHRydWUiKQp9CgphbGxvd19jb250YWluZXJfYW5ub3RhdGlvbihwX29jaSwgaV9vY2ksIGtleSkgewogICAgcHJpbnQoImFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uOiBrZXkgPSIsIGtleSkKCiAgICBwX3ZhbHVlIDo9IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIGlfdmFsdWUgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgcHJpbnQoImFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uOiBwX3ZhbHVlID0iLCBwX3ZhbHVlLCAiaV92YWx1ZSA9IiwgaV92YWx1ZSkKCiAgICBwX3ZhbHVlID09IGlfdmFsdWUKCiAgICBwcmludCgiYWxsb3dfY29udGFpbmVyX2Fubm90YXRpb246IHRydWUiKQp9CgojICJuZXJkY3RsL25ldHdvcmstbmFtZXNwYWNlIiBhbm5vdGF0aW9uCmFsbG93X3NhbmRib3hfbmV0X25hbWVzcGFjZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X25ldF9uYW1lc3BhY2U6IHN0YXJ0IikKCiAgICBrZXkgOj0gIm5lcmRjdGwvbmV0d29yay1uYW1lc3BhY2UiCgogICAgcF9uYW1lc3BhY2UgOj0gcF9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgaV9uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgcHJpbnQoImFsbG93X3NhbmRib3hfbmV0X25hbWVzcGFjZTogcF9uYW1lc3BhY2UgPSIsIHBfbmFtZXNwYWNlLCAiaV9uYW1lc3BhY2UgPSIsIGlfbmFtZXNwYWNlKQoKICAgIHJlZ2V4Lm1hdGNoKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9uZXRfbmFtZXNwYWNlOiB0cnVlIikKfQoKYWxsb3dfbmV0X25hbWVzcGFjZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19uZXRfbmFtZXNwYWNlOiBzdGFydCIpCgogICAga2V5IDo9ICJuZXJkY3RsL25ldHdvcmstbmFtZXNwYWNlIgoKICAgIG5vdCBwX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICBub3QgaV9vY2kuQW5ub3RhdGlvbnNba2V5XQoKICAgIHByaW50KCJhbGxvd19uZXRfbmFtZXNwYWNlOiB0cnVlIikKfQoKIyAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1sb2ctZGlyZWN0b3J5IiBhbm5vdGF0aW9uCmFsbG93X3NhbmRib3hfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X2xvZ19kaXJlY3Rvcnk6IHN0YXJ0IikKCiAgICBrZXkgOj0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbG9nLWRpcmVjdG9yeSIKCiAgICBwX2RpciA6PSBwX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICByZWdleDEgOj0gcmVwbGFjZShwX2RpciwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHJlZ2V4MiA6PSByZXBsYWNlKHJlZ2V4MSwgIiQoc2FuZGJveC1uYW1lc3BhY2UpIiwgc19uYW1lc3BhY2UpCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiByZWdleDIgPSIsIHJlZ2V4MikKCiAgICBpX2RpciA6PSBpX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiBpX2RpciA9IiwgaV9kaXIpCgogICAgcmVnZXgubWF0Y2gocmVnZXgyLCBpX2RpcikKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiB0cnVlIikKfQoKYWxsb3dfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19sb2dfZGlyZWN0b3J5OiBzdGFydCIpCgogICAga2V5IDo9ICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWxvZy1kaXJlY3RvcnkiCgogICAgbm90IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIG5vdCBpX29jaS5Bbm5vdGF0aW9uc1trZXldCgogICAgcHJpbnQoImFsbG93X2xvZ19kaXJlY3Rvcnk6IHRydWUiKQp9CgphbGxvd19kZXZpY2VzKHBfZGV2aWNlcywgaV9kZXZpY2VzKSB7CiAgICBwcmludCgiYWxsb3dfZGV2aWNlczogc3RhcnQiKQogICAgZXZlcnkgaV9kZXZpY2UgaW4gaV9kZXZpY2VzIHsKICAgICAgICBwcmludCgiYWxsb3dfZGV2aWNlczogaV9kZXZpY2UgPSIsIGlfZGV2aWNlKQogICAgICAgIHNvbWUgcF9kZXZpY2UgaW4gcF9kZXZpY2VzCiAgICAgICAgcF9kZXZpY2UuY29udGFpbmVyX3BhdGggPT0gaV9kZXZpY2UuY29udGFpbmVyX3BhdGgKICAgIH0KICAgIHByaW50KCJhbGxvd19kZXZpY2VzOiB0cnVlIikKfQoKYWxsb3dfbGludXgoc3RhdGVfb3BzLCBwX29jaSwgaV9vY2kpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIHBfbmFtZXNwYWNlcyA6PSBwX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbGludXg6IHAgbmFtZXNwYWNlcyA9IiwgcF9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlcyA6PSBpX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbGludXg6IGkgbmFtZXNwYWNlcyA9IiwgaV9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlX3dpdGhvdXRfbmV0d29yayA6PSBbb2JqIHwgb2JqIDo9IGlfbmFtZXNwYWNlc1tfXTsgb2JqLlR5cGUgIT0gIm5ldHdvcmsiXQoKICAgIHByaW50KCJhbGxvd19saW51eDogaV9uYW1lc3BhY2Vfd2l0aG91dF9uZXR3b3JrID0iLCBpX25hbWVzcGFjZV93aXRob3V0X25ldHdvcmspCgogICAgcF9uYW1lc3BhY2VzID09IGlfbmFtZXNwYWNlX3dpdGhvdXRfbmV0d29yawoKICAgIGFsbG93X21hc2tlZF9wYXRocyhwX29jaSwgaV9vY2kpCiAgICBhbGxvd19yZWFkb25seV9wYXRocyhwX29jaSwgaV9vY2kpCiAgICBhbGxvd19saW51eF9kZXZpY2VzKHBfb2NpLkxpbnV4LkRldmljZXMsIGlfb2NpLkxpbnV4LkRldmljZXMpCiAgICBhbGxvd19saW51eF9zeXNjdGwocF9vY2kuTGludXgsIGlfb2NpLkxpbnV4KQogICAgcmV0IDo9IGFsbG93X25ldHdvcmtfbmFtZXNwYWNlX3N0YXJ0KHN0YXRlX29wcywgcF9vY2ksIGlfb2NpKQogICAgcmV0LmFsbG93ZWQKCiAgICBvcHMgOj0gcmV0Lm9wcwoKICAgIHByaW50KCJhbGxvd19saW51eDogdHJ1ZSIpCn0KCiMgUmV0cmlldmUgdGhlICJuZXR3b3JrIiBuYW1lc3BhY2UgZnJvbSB0aGUgaW5wdXQgZGF0YSBhbmQgcGFzcyBpdCBvbiBmb3IgdGhlCiMgbmV0d29yayBuYW1lc3BhY2UgcG9saWN5IGNoZWNrcy4KYWxsb3dfbmV0d29ya19uYW1lc3BhY2Vfc3RhcnQoc3RhdGVfb3BzLCBwX29jaSwgaV9vY2kpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIHByaW50KCJhbGxvd19uZXR3b3JrX25hbWVzcGFjZSBzdGFydDogc3RhcnQiKQoKICAgIHBfbmFtZXNwYWNlcyA6PSBwX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IHAgbmFtZXNwYWNlcyA9IiwgcF9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlcyA6PSBpX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IGkgbmFtZXNwYWNlcyA9IiwgaV9uYW1lc3BhY2VzKQoKICAgICMgUmV0dXJuIHBhdGggb2YgdGhlICJuZXR3b3JrIiBuYW1lc3BhY2UKICAgIG5ldHdvcmtfbnMgOj0gW29iaiB8IG9iaiA6PSBpX25hbWVzcGFjZXNbX107IG9iai5UeXBlID09ICJuZXR3b3JrIl0KCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IG5ldHdvcmtfbnMgPSIsIG5ldHdvcmtfbnMpCgogICAgcmV0IDo9IGFsbG93X25ldHdvcmtfbmFtZXNwYWNlKHN0YXRlX29wcywgbmV0d29ya19ucykKICAgIHJldC5hbGxvd2VkCgogICAgb3BzIDo9IHJldC5vcHMKfQoKIyBUaGlzIHJ1bGUgaXMgd2hlbiB0aGVyZSdzIG5vIG5ldHdvcmsgbmFtZXNwYWNlIGluIHRoZSBpbnB1dCBkYXRhLgphbGxvd19uZXR3b3JrX25hbWVzcGFjZShzdGF0ZV9vcHMsIG5ldHdvcmtfbnMpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIGNvdW50KG5ldHdvcmtfbnMpID09IDAKCiAgICBuZXR3b3JrX25zX3BhdGggPSAiIgoKICAgIGFkZF9uZXR3b3JrX25hbWVzcGFjZV90b19zdGF0ZSA6PSBzdGF0ZV9hbGxvd3MoIm5ldHdvcmtfbmFtZXNwYWNlIiwgbmV0d29ya19uc19wYXRoKQogICAgb3BzIDo9IGNvbmNhdF9vcF9pZl9ub3RfbnVsbChzdGF0ZV9vcHMsIGFkZF9uZXR3b3JrX25hbWVzcGFjZV90b19zdGF0ZSkKCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2UgMTogdHJ1ZSIpCn0KCiMgVGhpcyBydWxlIGlzIHdoZW4gdGhlcmUncyBleGFjdGx5IG9uZSBuZXR3b3JrIG5hbWVzcGFjZSBpbiB0aGUgaW5wdXQgZGF0YS4KYWxsb3dfbmV0d29ya19uYW1lc3BhY2Uoc3RhdGVfb3BzLCBuZXR3b3JrX25zKSA6PSB7Im9wcyI6IG9wcywgImFsbG93ZWQiOiB0cnVlfSB7CiAgICBjb3VudChuZXR3b3JrX25zKSA9PSAxCgogICAgYWRkX25ldHdvcmtfbmFtZXNwYWNlX3RvX3N0YXRlIDo9IHN0YXRlX2FsbG93cygibmV0d29ya19uYW1lc3BhY2UiLCBuZXR3b3JrX25zWzBdLlBhdGgpCiAgICBvcHMgOj0gY29uY2F0X29wX2lmX25vdF9udWxsKHN0YXRlX29wcywgYWRkX25ldHdvcmtfbmFtZXNwYWNlX3RvX3N0YXRlKQoKICAgIHByaW50KCJhbGxvd19uZXR3b3JrX25hbWVzcGFjZSAyOiB0cnVlIikKfQoKYWxsb3dfbWFza2VkX3BhdGhzKHBfb2NpLCBpX29jaSkgewogICAgcF9wYXRocyA6PSBwX29jaS5MaW51eC5NYXNrZWRQYXRocwogICAgcHJpbnQoImFsbG93X21hc2tlZF9wYXRocyAxOiBwX3BhdGhzID0iLCBwX3BhdGhzKQoKICAgIGlfcGF0aHMgOj0gaV9vY2kuTGludXguTWFza2VkUGF0aHMKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aHMgMTogaV9wYXRocyA9IiwgaV9wYXRocykKCiAgICBhbGxvd19tYXNrZWRfcGF0aHNfYXJyYXkocF9wYXRocywgaV9wYXRocykKCiAgICBwcmludCgiYWxsb3dfbWFza2VkX3BhdGhzIDE6IHRydWUiKQp9CmFsbG93X21hc2tlZF9wYXRocyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aHMgMjogc3RhcnQiKQoKICAgIG5vdCBwX29jaS5MaW51eC5NYXNrZWRQYXRocwogICAgbm90IGlfb2NpLkxpbnV4Lk1hc2tlZFBhdGhzCgogICAgcHJpbnQoImFsbG93X21hc2tlZF9wYXRocyAyOiB0cnVlIikKfQoKIyBBbGwgdGhlIHBvbGljeSBtYXNrZWQgcGF0aHMgbXVzdCBiZSBtYXNrZWQgaW4gdGhlIGlucHV0IGRhdGEgdG9vLgojIElucHV0IGlzIGFsbG93ZWQgdG8gaGF2ZSBtb3JlIG1hc2tlZCBwYXRocyB0aGFuIHRoZSBwb2xpY3kuCmFsbG93X21hc2tlZF9wYXRoc19hcnJheShwX2FycmF5LCBpX2FycmF5KSB7CiAgICBldmVyeSBwX2VsZW0gaW4gcF9hcnJheSB7CiAgICAgICAgYWxsb3dfbWFza2VkX3BhdGgocF9lbGVtLCBpX2FycmF5KQogICAgfQp9CgphbGxvd19tYXNrZWRfcGF0aChwX2VsZW0sIGlfYXJyYXkpIHsKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aDogcF9lbGVtID0iLCBwX2VsZW0pCgogICAgc29tZSBpX2VsZW0gaW4gaV9hcnJheQogICAgcF9lbGVtID09IGlfZWxlbQoKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aDogdHJ1ZSIpCn0KCmFsbG93X3JlYWRvbmx5X3BhdGhzKHBfb2NpLCBpX29jaSkgewogICAgcF9wYXRocyA6PSBwX29jaS5MaW51eC5SZWFkb25seVBhdGhzCiAgICBwcmludCgiYWxsb3dfcmVhZG9ubHlfcGF0aHMgMTogcF9wYXRocyA9IiwgcF9wYXRocykKCiAgICBpX3BhdGhzIDo9IGlfb2NpLkxpbnV4LlJlYWRvbmx5UGF0aHMKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAxOiBpX3BhdGhzID0iLCBpX3BhdGhzKQoKICAgIGFsbG93X3JlYWRvbmx5X3BhdGhzX2FycmF5KHBfcGF0aHMsIGlfcGF0aHMsIGlfb2NpLkxpbnV4Lk1hc2tlZFBhdGhzKQoKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAxOiB0cnVlIikKfQphbGxvd19yZWFkb25seV9wYXRocyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAyOiBzdGFydCIpCgogICAgbm90IHBfb2NpLkxpbnV4LlJlYWRvbmx5UGF0aHMKICAgIG5vdCBpX29jaS5MaW51eC5SZWFkb25seVBhdGhzCgogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGhzIDI6IHRydWUiKQp9CgojIEFsbCB0aGUgcG9saWN5IHJlYWRvbmx5IHBhdGhzIG11c3QgYmUgZWl0aGVyOgojIC0gUHJlc2VudCBpbiB0aGUgaW5wdXQgcmVhZG9ubHkgcGF0aHMsIG9yCiMgLSBQcmVzZW50IGluIHRoZSBpbnB1dCBtYXNrZWQgcGF0aHMuCiMgSW5wdXQgaXMgYWxsb3dlZCB0byBoYXZlIG1vcmUgcmVhZG9ubHkgcGF0aHMgdGhhbiB0aGUgcG9saWN5LgphbGxvd19yZWFkb25seV9wYXRoc19hcnJheShwX2FycmF5LCBpX2FycmF5LCBtYXNrZWRfcGF0aHMpIHsKICAgIGV2ZXJ5IHBfZWxlbSBpbiBwX2FycmF5IHsKICAgICAgICBhbGxvd19yZWFkb25seV9wYXRoKHBfZWxlbSwgaV9hcnJheSwgbWFza2VkX3BhdGhzKQogICAgfQp9CgphbGxvd19yZWFkb25seV9wYXRoKHBfZWxlbSwgaV9hcnJheSwgbWFza2VkX3BhdGhzKSB7CiAgICBwcmludCgiYWxsb3dfcmVhZG9ubHlfcGF0aCAxOiBwX2VsZW0gPSIsIHBfZWxlbSkKCiAgICBzb21lIGlfZWxlbSBpbiBpX2FycmF5CiAgICBwX2VsZW0gPT0gaV9lbGVtCgogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGggMTogdHJ1ZSIpCn0KYWxsb3dfcmVhZG9ubHlfcGF0aChwX2VsZW0sIGlfYXJyYXksIG1hc2tlZF9wYXRocykgewogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGggMjogcF9lbGVtID0iLCBwX2VsZW0pCgogICAgc29tZSBpX21hc2tlZCBpbiBtYXNrZWRfcGF0aHMKICAgIHBfZWxlbSA9PSBpX21hc2tlZAoKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRoIDI6IHRydWUiKQp9CgphbGxvd19saW51eF9kZXZpY2VzKHBfZGV2aWNlcywgaV9kZXZpY2VzKSB7CiAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogc3RhcnQiKQogICAgZXZlcnkgaV9kZXZpY2UgaW4gaV9kZXZpY2VzIHsKICAgICAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogaV9kZXZpY2UgPSIsIGlfZGV2aWNlKQogICAgICAgIHNvbWUgcF9kZXZpY2UgaW4gcF9kZXZpY2VzCiAgICAgICAgaV9kZXZpY2UuUGF0aCA9PSBwX2RldmljZS5QYXRoCiAgICB9CiAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogdHJ1ZSIpCn0KCmFsbG93X2xpbnV4X3N5c2N0bChwX2xpbnV4LCBpX2xpbnV4KSB7CiAgICBwcmludCgiYWxsb3dfbGludXhfc3lzY3RsIDE6IHN0YXJ0IikKICAgIG5vdCBpX2xpbnV4LlN5c2N0bAogICAgcHJpbnQoImFsbG93X2xpbnV4X3N5c2N0bCAxOiB0cnVlIikKfQoKYWxsb3dfbGludXhfc3lzY3RsKHBfbGludXgsIGlfbGludXgpIHsKICAgIHByaW50KCJhbGxvd19saW51eF9zeXNjdGwgMjogc3RhcnQiKQogICAgcF9zeXNjdGwgOj0gcF9saW51eC5TeXNjdGwKICAgIGlfc3lzY3RsIDo9IGlfbGludXguU3lzY3RsCiAgICBldmVyeSBpX25hbWUsIGlfdmFsIGluIGlfc3lzY3RsIHsKICAgICAgICBwcmludCgiYWxsb3dfbGludXhfc3lzY3RsIDI6IGlfbmFtZSA9IiwgaV9uYW1lLCAiaV92YWwgPSIsIGlfdmFsKQogICAgICAgIHBfc3lzY3RsW2lfbmFtZV0gPT0gaV92YWwKICAgIH0KICAgIHByaW50KCJhbGxvd19saW51eF9zeXNjdGwgMjogdHJ1ZSIpCn0KCiMgQ2hlY2sgdGhlIGNvbnNpc3RlbmN5IG9mIHRoZSBpbnB1dCAiaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5idW5kbGVfcGF0aCIKIyBhbmQgaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCIgdmFsdWVzIHdpdGggb3RoZXIgZmllbGRzLgphbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZChwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpIHsKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogc3RhcnQiKQoKICAgIGJ1bmRsZV9wYXRoIDo9IGlfb2NpLkFubm90YXRpb25zWyJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmJ1bmRsZV9wYXRoIl0KICAgIGJ1bmRsZV9pZCA6PSByZXBsYWNlKGJ1bmRsZV9wYXRoLCAiL3J1bi9jb250YWluZXJkL2lvLmNvbnRhaW5lcmQucnVudGltZS52Mi50YXNrL2s4cy5pby8iLCAiIikKCiAgICBidW5kbGVfaWRfZm9ybWF0IDo9IGNvbmNhdCgiIiwgWyJeIiwgQlVORExFX0lELCAiJCJdKQogICAgcmVnZXgubWF0Y2goYnVuZGxlX2lkX2Zvcm1hdCwgYnVuZGxlX2lkKQoKICAgIGtleSA6PSAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCIKCiAgICBwX3JlZ2V4IDo9IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIHNhbmRib3hfaWQgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQoKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogc2FuZGJveF9pZCA9Iiwgc2FuZGJveF9pZCwgInJlZ2V4ID0iLCBwX3JlZ2V4KQogICAgcmVnZXgubWF0Y2gocF9yZWdleCwgc2FuZGJveF9pZCkKCiAgICBhbGxvd19yb290X3BhdGgocF9vY2ksIGlfb2NpLCBidW5kbGVfaWQpCgogICAgZXZlcnkgaV9tb3VudCBpbiBpX29jaS5Nb3VudHMgewogICAgICAgIGFsbG93X21vdW50KHBfb2NpLCBpX21vdW50LCBpX3N0b3JhZ2VzLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpCiAgICB9CgogICAgYWxsb3dfc3RvcmFnZXMocF9zdG9yYWdlcywgaV9zdG9yYWdlcywgYnVuZGxlX2lkLCBzYW5kYm94X2lkKQoKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogdHJ1ZSIpCn0KCmFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHBfcHJvY2VzcyA9IiwgcF9wcm9jZXNzKQogICAgcHJpbnQoImFsbG93X3Byb2Nlc3NfY29tbW9uOiBpX3Byb2Nlc3MgPSAiLCBpX3Byb2Nlc3MpCiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHNfbmFtZSA9Iiwgc19uYW1lKQoKICAgIHBfcHJvY2Vzcy5Dd2QgPT0gaV9wcm9jZXNzLkN3ZAogICAgcF9wcm9jZXNzLk5vTmV3UHJpdmlsZWdlcyA9PSBpX3Byb2Nlc3MuTm9OZXdQcml2aWxlZ2VzCgogICAgYWxsb3dfdXNlcihwX3Byb2Nlc3MsIGlfcHJvY2VzcykKICAgIGFsbG93X2VudihwX3Byb2Nlc3MsIGlfcHJvY2Vzcywgc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHRydWUiKQp9CgojIENvbXBhcmUgdGhlIE9DSSBQcm9jZXNzIGZpZWxkIG9mIGEgcG9saWN5IGNvbnRhaW5lciB3aXRoIHRoZSBpbnB1dCBPQ0kgUHJvY2VzcyBmcm9tIGEgQ3JlYXRlQ29udGFpbmVyUmVxdWVzdAphbGxvd19wcm9jZXNzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfcHJvY2Vzczogc3RhcnQiKQoKICAgIGFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgYWxsb3dfY2FwcyhwX3Byb2Nlc3MuQ2FwYWJpbGl0aWVzLCBpX3Byb2Nlc3MuQ2FwYWJpbGl0aWVzKQogICAgcF9wcm9jZXNzLlRlcm1pbmFsID09IGlfcHJvY2Vzcy5UZXJtaW5hbAoKICAgIHByaW50KCJhbGxvd19wcm9jZXNzOiB0cnVlIikKfQoKIyBDb21wYXJlIHRoZSBPQ0kgUHJvY2VzcyBmaWVsZCBvZiBhIHBvbGljeSBjb250YWluZXIgd2l0aCB0aGUgaW5wdXQgcHJvY2VzcyBmaWVsZCBmcm9tIEV4ZWNQcm9jZXNzUmVxdWVzdAphbGxvd19pbnRlcmFjdGl2ZV9wcm9jZXNzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfaW50ZXJhY3RpdmVfcHJvY2Vzczogc3RhcnQiKQoKICAgIGFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgYWxsb3dfZXhlY19jYXBzKGlfcHJvY2Vzcy5DYXBhYmlsaXRpZXMpCgogICAgIyBUaGVzZSBhcmUgY29tbWFuZHMgZW5hYmxlZCB1c2luZyBFeGVjUHJvY2Vzc1JlcXVlc3QgY29tbWFuZHMgYW5kL29yIHJlZ2V4IGZyb20gdGhlIHNldHRpbmdzIGZpbGUuCiAgICAjIFRoZXkgY2FuIGJlIGV4ZWN1dGVkIGludGVyYWN0aXZlbHkgc28gYWxsb3cgdGhlbSB0byB1c2UgYW55IHZhbHVlIGZvciBpX3Byb2Nlc3MuVGVybWluYWwuCgogICAgcHJpbnQoImFsbG93X2ludGVyYWN0aXZlX3Byb2Nlc3M6IHRydWUiKQp9CgojIENvbXBhcmUgdGhlIE9DSSBQcm9jZXNzIGZpZWxkIG9mIGEgcG9saWN5IGNvbnRhaW5lciB3aXRoIHRoZSBpbnB1dCBwcm9jZXNzIGZpZWxkIGZyb20gRXhlY1Byb2Nlc3NSZXF1ZXN0CmFsbG93X3Byb2JlX3Byb2Nlc3MocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19wcm9iZV9wcm9jZXNzOiBzdGFydCIpCgogICAgYWxsb3dfcHJvY2Vzc19jb21tb24ocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpCiAgICBhbGxvd19leGVjX2NhcHMoaV9wcm9jZXNzLkNhcGFiaWxpdGllcykKICAgIHBfcHJvY2Vzcy5UZXJtaW5hbCA9PSBpX3Byb2Nlc3MuVGVybWluYWwKCiAgICBwcmludCgiYWxsb3dfcHJvYmVfcHJvY2VzczogdHJ1ZSIpCn0KCmFsbG93X3VzZXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MpIHsKICAgIHBfdXNlciA6PSBwX3Byb2Nlc3MuVXNlcgogICAgaV91c2VyIDo9IGlfcHJvY2Vzcy5Vc2VyCgogICAgcHJpbnQoImFsbG93X3VzZXI6IGlucHV0IHVpZCA9IiwgaV91c2VyLlVJRCwgInBvbGljeSB1aWQgPSIsIHBfdXNlci5VSUQpCiAgICBwX3VzZXIuVUlEID09IGlfdXNlci5VSUQKCiAgICAjIFRPRE86IHRyYWNrIGRvd24gdGhlIHJlYXNvbiBmb3IgcmVnaXN0cnkuazhzLmlvL3BhdXNlOjMuOSBiZWluZwogICAgIyAgICAgICBleGVjdXRlZCB3aXRoIGdpZCA9IDAgZGVzcGl0ZSBoYXZpbmcgIjY1NTM1OjY1NTM1IiBpbiBpdHMgY29udGFpbmVyIGltYWdlCiAgICAjICAgICAgIGNvbmZpZy4KICAgICNwcmludCgiYWxsb3dfdXNlcjogaW5wdXQgZ2lkID0iLCBpX3VzZXIuR0lELCAicG9saWN5IGdpZCA9IiwgcF91c2VyLkdJRCkKICAgICNwX3VzZXIuR0lEID09IGlfdXNlci5HSUQKCiAgICAjIFRPRE86IGNvbXBhcmUgdGhlIGFkZGl0aW9uYWxHaWRzIGZpZWxkIHRvbyBhZnRlciBjb21wdXRpbmcgaXRzIHZhbHVlCiAgICAjIGJhc2VkIG9uIC9ldGMvcGFzc3dkIGFuZCAvZXRjL2dyb3VwIGZyb20gdGhlIGNvbnRhaW5lciBpbWFnZS4KfQoKYWxsb3dfZGVwcmVjYXRlZF9hcmdzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZ3MgMTogbm8gYXJncyIpCgogICAgbm90IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJncwogICAgbm90IGlfcHJvY2Vzcy5BcmdzCgogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAxOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZ3MocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSkgewogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiBwb2xpY3kgYXJncyA9IiwgcF9wcm9jZXNzLkRlcHJlY2F0ZWRBcmdzKQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiBpbnB1dCBhcmdzID0iLCBpX3Byb2Nlc3MuQXJncykKCiAgICBjb3VudChwX3Byb2Nlc3MuRGVwcmVjYXRlZEFyZ3MpID09IGNvdW50KGlfcHJvY2Vzcy5BcmdzKQoKICAgIGV2ZXJ5IGksIGlfYXJnIGluIGlfcHJvY2Vzcy5BcmdzIHsKICAgICAgICBhbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpCiAgICB9CgogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDE6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgcF9hcmcyIDo9IHJlcGxhY2UocF9hcmcsICIkJCIsICIkIikKICAgIHBfYXJnMiA9PSBpX2FyZwoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAxOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDI6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgIyBUT0RPOiBjYW4gJChub2RlLW5hbWUpIGJlIGhhbmRsZWQgYmV0dGVyPwogICAgY29udGFpbnMocF9hcmcsICIkKG5vZGUtbmFtZSkiKQoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAyOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDM6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgcF9hcmcyIDo9IHJlcGxhY2UocF9hcmcsICIkJCIsICIkIikKICAgIHBfYXJnMyA6PSByZXBsYWNlKHBfYXJnMiwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAzOiBwX2FyZzMgPSIsIHBfYXJnMykKICAgIHBfYXJnMyA9PSBpX2FyZwoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAzOiB0cnVlIikKfQoKIyBPQ0kgcHJvY2Vzcy5FbnYgZmllbGQKYWxsb3dfZW52KHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfZW52OiBwIGVudiA9IiwgcF9wcm9jZXNzLkVudikKICAgIHByaW50KCJhbGxvd19lbnY6IGkgZW52ID0iLCBpX3Byb2Nlc3MuRW52KQoKICAgIGV2ZXJ5IGlfdmFyIGluIGlfcHJvY2Vzcy5FbnYgewogICAgICAgIHByaW50KCJhbGxvd19lbnY6IGlfdmFyID0iLCBpX3ZhcikKICAgICAgICBhbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgfQoKICAgIHByaW50KCJhbGxvd19lbnY6IHRydWUiKQp9CgojIEFsbG93IGlucHV0IGVudiB2YXJpYWJsZXMgdGhhdCBhcmUgcHJlc2VudCBpbiB0aGUgcG9saWN5IGRhdGEgdG9vLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHBfdmFyID09IGlfdmFyCiAgICBwcmludCgiYWxsb3dfdmFyIDE6IHRydWUiKQp9CgojIE1hdGNoIGlucHV0IHdpdGggb25lIG9mIHRoZSBwb2xpY3kgdmFyaWFibGVzLCBhZnRlciBzdWJzdGl0dXRpbmcgJChzYW5kYm94LW5hbWUpLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHByaW50KCJhbGxvd192YXIgMjogcF92YXIgPSIsIHBfdmFyKQoKICAgIHBfdmFyX3NwbGl0IDo9IHNwbGl0KHBfdmFyLCAiPSIpCiAgICBjb3VudChwX3Zhcl9zcGxpdCkgPT0gMgoKICAgIHBfdmFyX3NwbGl0WzFdID09ICIkKHNhbmRib3gtbmFtZSkiCgogICAgaV92YXJfc3BsaXQgOj0gc3BsaXQoaV92YXIsICI9IikKICAgIGNvdW50KGlfdmFyX3NwbGl0KSA9PSAyCgogICAgaV92YXJfc3BsaXRbMF0gPT0gcF92YXJfc3BsaXRbMF0KICAgIHJlZ2V4Lm1hdGNoKHNfbmFtZSwgaV92YXJfc3BsaXRbMV0pCgogICAgcHJpbnQoImFsbG93X3ZhciAyOiB0cnVlIikKfQoKIyBBbGxvdyBpbnB1dCBlbnYgdmFyaWFibGVzIHRoYXQgbWF0Y2ggd2l0aCBhIHJlcXVlc3RfZGVmYXVsdHMgcmVnZXguCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHNvbWUgcF9yZWdleDEgaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5DcmVhdGVDb250YWluZXJSZXF1ZXN0LmFsbG93X2Vudl9yZWdleAogICAgcF9yZWdleDIgOj0gcmVwbGFjZShwX3JlZ2V4MSwgIiQoaXB2NF9hKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcHY0X2EpCiAgICBwX3JlZ2V4MyA6PSByZXBsYWNlKHBfcmVnZXgyLCAiJChpcF9wKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcF9wKQogICAgcF9yZWdleDQgOj0gcmVwbGFjZShwX3JlZ2V4MywgIiQoc3ZjX25hbWUpIiwgcG9saWN5X2RhdGEuY29tbW9uLnN2Y19uYW1lKQogICAgcF9yZWdleDUgOj0gcmVwbGFjZShwX3JlZ2V4NCwgIiQoZG5zX2xhYmVsKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5kbnNfbGFiZWwpCgogICAgcHJpbnQoImFsbG93X3ZhciAzOiBwX3JlZ2V4NSA9IiwgcF9yZWdleDUpCiAgICByZWdleC5tYXRjaChwX3JlZ2V4NSwgaV92YXIpCgogICAgcHJpbnQoImFsbG93X3ZhciAzOiB0cnVlIikKfQoKIyBBbGxvdyBmaWVsZFJlZiAiZmllbGRQYXRoOiBzdGF0dXMucG9kSVAiIHZhbHVlcy4KYWxsb3dfdmFyKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBpX3Zhciwgc19uYW1lLCBzX25hbWVzcGFjZSkgewogICAgbmFtZV92YWx1ZSA6PSBzcGxpdChpX3ZhciwgIj0iKQogICAgY291bnQobmFtZV92YWx1ZSkgPT0gMgogICAgaXNfaXAobmFtZV92YWx1ZVsxXSkKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIGFsbG93X3BvZF9pcF92YXIobmFtZV92YWx1ZVswXSwgcF92YXIpCgogICAgcHJpbnQoImFsbG93X3ZhciA0OiB0cnVlIikKfQoKIyBBbGxvdyBjb21tb24gZmllbGRSZWYgdmFyaWFibGVzLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBuYW1lX3ZhbHVlIDo9IHNwbGl0KGlfdmFyLCAiPSIpCiAgICBjb3VudChuYW1lX3ZhbHVlKSA9PSAyCgogICAgc29tZSBwX3ZhciBpbiBwX3Byb2Nlc3MuRW52CiAgICBwX25hbWVfdmFsdWUgOj0gc3BsaXQocF92YXIsICI9IikKICAgIGNvdW50KHBfbmFtZV92YWx1ZSkgPT0gMgoKICAgIHBfbmFtZV92YWx1ZVswXSA9PSBuYW1lX3ZhbHVlWzBdCgogICAgIyBUT0RPOiBzaG91bGQgdGhlc2UgYmUgaGFuZGxlZCBpbiBhIGRpZmZlcmVudCB3YXk/CiAgICBhbHdheXNfYWxsb3dlZCA6PSBbIiQoaG9zdC1uYW1lKSIsICIkKG5vZGUtbmFtZSkiLCAiJChwb2QtdWlkKSJdCiAgICBzb21lIGFsbG93ZWQgaW4gYWx3YXlzX2FsbG93ZWQKICAgIGNvbnRhaW5zKHBfbmFtZV92YWx1ZVsxXSwgYWxsb3dlZCkKCiAgICBwcmludCgiYWxsb3dfdmFyIDU6IHRydWUiKQp9CgojIEFsbG93IGZpZWxkUmVmICJmaWVsZFBhdGg6IHN0YXR1cy5ob3N0SVAiIHZhbHVlcy4KYWxsb3dfdmFyKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBpX3Zhciwgc19uYW1lLCBzX25hbWVzcGFjZSkgewogICAgbmFtZV92YWx1ZSA6PSBzcGxpdChpX3ZhciwgIj0iKQogICAgY291bnQobmFtZV92YWx1ZSkgPT0gMgogICAgaXNfaXAobmFtZV92YWx1ZVsxXSkKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIGFsbG93X2hvc3RfaXBfdmFyKG5hbWVfdmFsdWVbMF0sIHBfdmFyKQoKICAgIHByaW50KCJhbGxvd192YXIgNjogdHJ1ZSIpCn0KCiMgQWxsb3cgcmVzb3VyY2VGaWVsZFJlZiB2YWx1ZXMgKGUuZy4sICJsaW1pdHMuY3B1IikuCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIG5hbWVfdmFsdWUgOj0gc3BsaXQoaV92YXIsICI9IikKICAgIGNvdW50KG5hbWVfdmFsdWUpID09IDIKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHBfbmFtZV92YWx1ZSA6PSBzcGxpdChwX3ZhciwgIj0iKQogICAgY291bnQocF9uYW1lX3ZhbHVlKSA9PSAyCgogICAgcF9uYW1lX3ZhbHVlWzBdID09IG5hbWVfdmFsdWVbMF0KCiAgICAjIGEgdmFyaWFibGUgd2Ugc2hvdWxkIGJlIHZhbGlkYXRpbmcgdXNpbmcgYSByZWdleCBmcm9tIHNldHRpbmdzCiAgICBwX25hbWVfdmFsdWVbMV0gPT0gIiQodmFsaWRhdGUtZnJvbS1zZXR0aW5ncykiCgogICAgcmVnZXhfdmFsIDo9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuQ3JlYXRlQ29udGFpbmVyUmVxdWVzdC5hbGxvd19lbnZfcmVnZXhfbWFwW25hbWVfdmFsdWVbMF1dCgogICAgcHJpbnQoImFsbG93X3ZhciA3OiB2YWwgPSIsIG5hbWVfdmFsdWVbMV0pCiAgICBwcmludCgiYWxsb3dfdmFyIDc6IHJlZ2V4X3ZhbCA9IiwgcmVnZXhfdmFsKQoKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4X3ZhbCwgbmFtZV92YWx1ZVsxXSkKCiAgICBwcmludCgiYWxsb3dfdmFyIDc6IHRydWUiKQp9CgojIE1hdGNoIGlucHV0IHdpdGggb25lIG9mIHRoZSBwb2xpY3kgdmFyaWFibGVzLCBhZnRlciBzdWJzdGl0dXRpbmcgJChzYW5kYm94LW5hbWVzcGFjZSkuCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHNvbWUgcF92YXIgaW4gcF9wcm9jZXNzLkVudgogICAgcF92YXIyIDo9IHJlcGxhY2UocF92YXIsICIkKHNhbmRib3gtbmFtZXNwYWNlKSIsIHNfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd192YXIgODogcF92YXIyID0iLCBwX3ZhcjIpCiAgICBwX3ZhcjIgPT0gaV92YXIKCiAgICBwcmludCgiYWxsb3dfdmFyIDg6IHRydWUiKQp9CgphbGxvd19wb2RfaXBfdmFyKHZhcl9uYW1lLCBwX3ZhcikgewogICAgcHJpbnQoImFsbG93X3BvZF9pcF92YXI6IHZhcl9uYW1lID0iLCB2YXJfbmFtZSwgInBfdmFyID0iLCBwX3ZhcikKCiAgICBwX25hbWVfdmFsdWUgOj0gc3BsaXQocF92YXIsICI9IikKICAgIGNvdW50KHBfbmFtZV92YWx1ZSkgPT0gMgoKICAgIHBfbmFtZV92YWx1ZVswXSA9PSB2YXJfbmFtZQogICAgcF9uYW1lX3ZhbHVlWzFdID09ICIkKHBvZC1pcCkiCgogICAgcHJpbnQoImFsbG93X3BvZF9pcF92YXI6IHRydWUiKQp9CgphbGxvd19ob3N0X2lwX3Zhcih2YXJfbmFtZSwgcF92YXIpIHsKICAgIHByaW50KCJhbGxvd19ob3N0X2lwX3ZhcjogdmFyX25hbWUgPSIsIHZhcl9uYW1lLCAicF92YXIgPSIsIHBfdmFyKQoKICAgIHBfbmFtZV92YWx1ZSA6PSBzcGxpdChwX3ZhciwgIj0iKQogICAgY291bnQocF9uYW1lX3ZhbHVlKSA9PSAyCgogICAgcF9uYW1lX3ZhbHVlWzBdID09IHZhcl9uYW1lCiAgICBwX25hbWVfdmFsdWVbMV0gPT0gIiQoaG9zdC1pcCkiCgogICAgcHJpbnQoImFsbG93X2hvc3RfaXBfdmFyOiB0cnVlIikKfQoKaXNfaXAodmFsdWUpIHsKICAgIGJ5dGVzID0gc3BsaXQodmFsdWUsICIuIikKICAgIGNvdW50KGJ5dGVzKSA9PSA0CgogICAgaXNfaXBfZmlyc3RfYnl0ZShieXRlc1swXSkKICAgIGlzX2lwX290aGVyX2J5dGUoYnl0ZXNbMV0pCiAgICBpc19pcF9vdGhlcl9ieXRlKGJ5dGVzWzJdKQogICAgaXNfaXBfb3RoZXJfYnl0ZShieXRlc1szXSkKfQppc19pcF9maXJzdF9ieXRlKGNvbXBvbmVudCkgewogICAgbnVtYmVyID0gdG9fbnVtYmVyKGNvbXBvbmVudCkKICAgIG51bWJlciA+PSAxCiAgICBudW1iZXIgPD0gMjU1Cn0KaXNfaXBfb3RoZXJfYnl0ZShjb21wb25lbnQpIHsKICAgIG51bWJlciA9IHRvX251bWJlcihjb21wb25lbnQpCiAgICBudW1iZXIgPj0gMAogICAgbnVtYmVyIDw9IDI1NQp9CgojIE9DSSByb290LlBhdGgKYWxsb3dfcm9vdF9wYXRoKHBfb2NpLCBpX29jaSwgYnVuZGxlX2lkKSB7CiAgICBpX3BhdGggOj0gaV9vY2kuUm9vdC5QYXRoCiAgICBwX3BhdGgxIDo9IHBfb2NpLlJvb3QuUGF0aAogICAgcHJpbnQoImFsbG93X3Jvb3RfcGF0aDogaV9wYXRoID0iLCBpX3BhdGgsICJwX3BhdGgxID0iLCBwX3BhdGgxKQoKICAgIHBfcGF0aDIgOj0gcmVwbGFjZShwX3BhdGgxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfcm9vdF9wYXRoOiBwX3BhdGgyID0iLCBwX3BhdGgyKQoKICAgIHBfcGF0aDMgOj0gcmVwbGFjZShwX3BhdGgyLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X3Jvb3RfcGF0aDogcF9wYXRoMyA9IiwgcF9wYXRoMykKCiAgICBwX3BhdGgzID09IGlfcGF0aAoKICAgIHByaW50KCJhbGxvd19yb290X3BhdGg6IHRydWUiKQp9CgojIGRldmljZSBtb3VudHMKYWxsb3dfbW91bnQocF9vY2ksIGlfbW91bnQsIGlfc3RvcmFnZXMsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcHJpbnQoImFsbG93X21vdW50OiBpX21vdW50ID0iLCBpX21vdW50KQoKICAgIHNvbWUgcF9tb3VudCBpbiBwX29jaS5Nb3VudHMKICAgIHNvbWUgaV9zdG9yYWdlIGluIGlfc3RvcmFnZXMKCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IHBfbW91bnQgPSIsIHBfbW91bnQpCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IGlfc3RvcmFnZSA9IiwgaV9zdG9yYWdlKQoKICAgIGNoZWNrX21vdW50KHBfbW91bnQsIGlfbW91bnQsIGlfc3RvcmFnZSwgYnVuZGxlX2lkLCBzYW5kYm94X2lkKQoKICAgICMgVE9ETzogYXJlIHRoZXJlIGFueSBvdGhlciByZXF1aXJlZCBwb2xpY3kgY2hlY2tzIGZvciBtb3VudHMgLSBlLmcuLAogICAgIyAgICAgICBtdWx0aXBsZSBtb3VudHMgd2l0aCBzYW1lIHNvdXJjZSBvciBkZXN0aW5hdGlvbj8KCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IHRydWUiKQp9CgpjaGVja19tb3VudChwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcF9tb3VudCA9PSBpX21vdW50CiAgICBwcmludCgiY2hlY2tfbW91bnQgMTogdHJ1ZSIpCn0KY2hlY2tfbW91bnQocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHBfbW91bnQuZGVzdGluYXRpb24gPT0gaV9tb3VudC5kZXN0aW5hdGlvbgogICAgcF9tb3VudC50eXBlXyA9PSBpX21vdW50LnR5cGVfCiAgICBwX21vdW50Lm9wdGlvbnMgPT0gaV9tb3VudC5vcHRpb25zCgogICAgbW91bnRfc291cmNlX2FsbG93cyhwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkKCiAgICBwcmludCgiY2hlY2tfbW91bnQgMjogdHJ1ZSIpCn0KCm1vdW50X3NvdXJjZV9hbGxvd3MocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHJlZ2V4MSA6PSBwX21vdW50LnNvdXJjZQogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5tb3VudF9zb3VyY2VfY3BhdGgpCiAgICByZWdleDQgOj0gcmVwbGFjZShyZWdleDMsICIkKGJ1bmRsZS1pZCkiLCBidW5kbGVfaWQpCgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMTogcmVnZXg0ID0iLCByZWdleDQpCiAgICByZWdleC5tYXRjaChyZWdleDQsIGlfbW91bnQuc291cmNlKQoKICAgIHByaW50KCJtb3VudF9zb3VyY2VfYWxsb3dzIDE6IHRydWUiKQp9Cm1vdW50X3NvdXJjZV9hbGxvd3MocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHJlZ2V4MSA6PSBwX21vdW50LnNvdXJjZQogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5tb3VudF9zb3VyY2VfY3BhdGgpCiAgICByZWdleDQgOj0gcmVwbGFjZShyZWdleDMsICIkKHNhbmRib3gtaWQpIiwgc2FuZGJveF9pZCkKCiAgICBwcmludCgibW91bnRfc291cmNlX2FsbG93cyAyOiByZWdleDQgPSIsIHJlZ2V4NCkKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4NCwgaV9tb3VudC5zb3VyY2UpCgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMjogdHJ1ZSIpCn0KbW91bnRfc291cmNlX2FsbG93cyhwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogaV9tb3VudC5zb3VyY2UgPSIsIGlfbW91bnQuc291cmNlKQogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogaV9zdG9yYWdlLm1vdW50X3BvaW50ID0iLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCgogICAgaV9tb3VudC5zb3VyY2UgPT0gaV9zdG9yYWdlLm1vdW50X3BvaW50CgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogdHJ1ZSIpCn0KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBDcmVhdGUgY29udGFpbmVyIFN0b3JhZ2VzCgphbGxvd19zdG9yYWdlcyhwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHBfY291bnQgOj0gY291bnQocF9zdG9yYWdlcykKICAgIGlfY291bnQgOj0gY291bnQoaV9zdG9yYWdlcykKICAgIHByaW50KCJhbGxvd19zdG9yYWdlczogcF9jb3VudCA9IiwgcF9jb3VudCwgImlfY291bnQgPSIsIGlfY291bnQpCgogICAgcF9jb3VudCA9PSBpX2NvdW50CgogICAgIyBHZXQgdGhlIGNvbnRhaW5lciBpbWFnZSBsYXllciBJRHMgYW5kIHZlcml0eSByb290IGhhc2hlcywgZnJvbSB0aGUgIm92ZXJsYXlmcyIgc3RvcmFnZS4KICAgIHNvbWUgb3ZlcmxheV9zdG9yYWdlIGluIHBfc3RvcmFnZXMKICAgIG92ZXJsYXlfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIHByaW50KCJhbGxvd19zdG9yYWdlczogb3ZlcmxheV9zdG9yYWdlID0iLCBvdmVybGF5X3N0b3JhZ2UpCiAgICBjb3VudChvdmVybGF5X3N0b3JhZ2Uub3B0aW9ucykgPT0gMgoKICAgIGxheWVyX2lkcyA6PSBzcGxpdChvdmVybGF5X3N0b3JhZ2Uub3B0aW9uc1swXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiBsYXllcl9pZHMgPSIsIGxheWVyX2lkcykKCiAgICByb290X2hhc2hlcyA6PSBzcGxpdChvdmVybGF5X3N0b3JhZ2Uub3B0aW9uc1sxXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiByb290X2hhc2hlcyA9Iiwgcm9vdF9oYXNoZXMpCgogICAgZXZlcnkgaV9zdG9yYWdlIGluIGlfc3RvcmFnZXMgewogICAgICAgIGFsbG93X3N0b3JhZ2UocF9zdG9yYWdlcywgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpCiAgICB9CgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiB0cnVlIikKfQoKYWxsb3dfc3RvcmFnZShwX3N0b3JhZ2VzLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgc29tZSBwX3N0b3JhZ2UgaW4gcF9zdG9yYWdlcwoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiBwX3N0b3JhZ2UgPSIsIHBfc3RvcmFnZSkKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiBpX3N0b3JhZ2UgPSIsIGlfc3RvcmFnZSkKCiAgICBwX3N0b3JhZ2UuZHJpdmVyICAgICAgICAgICA9PSBpX3N0b3JhZ2UuZHJpdmVyCiAgICBwX3N0b3JhZ2UuZHJpdmVyX29wdGlvbnMgICA9PSBpX3N0b3JhZ2UuZHJpdmVyX29wdGlvbnMKICAgIHBfc3RvcmFnZS5mc19ncm91cCAgICAgICAgID09IGlfc3RvcmFnZS5mc19ncm91cAogICAgcF9zdG9yYWdlLmZzdHlwZSAgICAgICAgICAgPT0gaV9zdG9yYWdlLmZzdHlwZQoKICAgIGFsbG93X3N0b3JhZ2Vfc291cmNlKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKQogICAgYWxsb3dfc3RvcmFnZV9vcHRpb25zKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKQogICAgYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKQoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiB0cnVlIikKfQoKYWxsb3dfc3RvcmFnZV9zb3VyY2UocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX3NvdXJjZSAxOiBzdGFydCIpCgogICAgcF9zdG9yYWdlLnNvdXJjZSA9PSBpX3N0b3JhZ2Uuc291cmNlCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDE6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX3NvdXJjZShwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDI6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCgogICAgIyBEREREOkJCOkRELkY6IERvbWFpbjpCdXM6RGV2aWNlLkZ1bmN0aW9uCiAgICAjIGh0dHBzOi8vd3d3Lmtlcm5lbC5vcmcvZG9jL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtYnVzLXBjaQogICAgcmVnZXgubWF0Y2goYF5bYS1mMC05XXs0fTpbYS1mMC05XXsyfTpbYS1mMC05XXsyfVwuW2EtZjAtOV0kYCwgaV9zdG9yYWdlLnNvdXJjZSkKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9zb3VyY2UgMjogdHJ1ZSIpCn0KCmFsbG93X3N0b3JhZ2Vfc291cmNlKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKSB7CiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9zb3VyY2UgMzogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIGlfc3RvcmFnZS5zb3VyY2UgPT0gIm5vbmUiCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDM6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX3NvdXJjZShwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDQ6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJzbWIiCgogICAgIyBQYXR0ZXJuOiAvLzxzdG9yYWdlLWFjY291bnQtbmFtZT4uZmlsZS5jb3JlLndpbmRvd3MubmV0LzxrOHMtUFZDLW5hbWU+CiAgICAjIFN0b3JhZ2UgYWNjb3VudCBuYW1lOiBodHRwczovL2xlYXJuLm1pY3Jvc29mdC5jb20vZW4tdXMvYXp1cmUvc3RvcmFnZS9jb21tb24vc3RvcmFnZS1hY2NvdW50LW92ZXJ2aWV3I3N0b3JhZ2UtYWNjb3VudC1uYW1lCiAgICAjIEs4cyBQVkMgbmFtZTogaHR0cHM6Ly9rdWJlcm5ldGVzLmlvL2RvY3MvY29uY2VwdHMvb3ZlcnZpZXcvd29ya2luZy13aXRoLW9iamVjdHMvbmFtZXMvI2Rucy1zdWJkb21haW4tbmFtZXMKICAgIHJlZ2V4Lm1hdGNoKGBeXC9cLyhbYS16MC05XXszLDI0fSlcLmZpbGVcLmNvcmVcLndpbmRvd3NcLm5ldFwvW2EtejAtOV0oW2EtejAtOS4tXXswLDI1MX1bYS16MC05XSk/JGAsIGlfc3RvcmFnZS5zb3VyY2UpCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDQ6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMTogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgIT0gIm92ZXJsYXlmcyIKICAgIHBfc3RvcmFnZS5vcHRpb25zID09IGlfc3RvcmFnZS5vcHRpb25zCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAxOiB0cnVlIikKfQphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIGNvdW50KHBfc3RvcmFnZS5vcHRpb25zKSA9PSAyCgogICAgcG9saWN5X2lkcyA6PSBzcGxpdChwX3N0b3JhZ2Uub3B0aW9uc1swXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBwb2xpY3lfaWRzID0iLCBwb2xpY3lfaWRzKQogICAgcG9saWN5X2lkcyA9PSBsYXllcl9pZHMKCiAgICBwb2xpY3lfaGFzaGVzIDo9IHNwbGl0KHBfc3RvcmFnZS5vcHRpb25zWzFdLCAiOiIpCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IHBvbGljeV9oYXNoZXMgPSIsIHBvbGljeV9oYXNoZXMpCgogICAgcF9jb3VudCA6PSBjb3VudChwb2xpY3lfaWRzKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBwX2NvdW50ID0iLCBwX2NvdW50KQogICAgcF9jb3VudCA+PSAxCiAgICBwX2NvdW50ID09IGNvdW50KHBvbGljeV9oYXNoZXMpCgogICAgaV9jb3VudCA6PSBjb3VudChpX3N0b3JhZ2Uub3B0aW9ucykKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogaV9jb3VudCA9IiwgaV9jb3VudCkKICAgIGlfY291bnQgPT0gcF9jb3VudCArIDMKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zWzBdID0iLCBpX3N0b3JhZ2Uub3B0aW9uc1swXSkKICAgIGlfc3RvcmFnZS5vcHRpb25zWzBdID09ICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQubGF5ZXItc3JjLXByZWZpeD0vdmFyL2xpYi9jb250YWluZXJkL2lvLmNvbnRhaW5lcmQuc25hcHNob3R0ZXIudjEudGFyZGV2L2xheWVycyIKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zW2lfY291bnQgLSAyXSA9IiwgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDJdKQogICAgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDJdID09ICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQub3ZlcmxheS1ydyIKCiAgICBsb3dlcmRpciA6PSBjb25jYXQoIj0iLCBbImxvd2VyZGlyIiwgcF9zdG9yYWdlLm9wdGlvbnNbMF1dKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBsb3dlcmRpciA9IiwgbG93ZXJkaXIpCgogICAgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDFdID09IGxvd2VyZGlyCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zW2lfY291bnQgLSAxXSA9IiwgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDFdKQoKICAgIGV2ZXJ5IGksIHBvbGljeV9pZCBpbiBwb2xpY3lfaWRzIHsKICAgICAgICBhbGxvd19vdmVybGF5X2xheWVyKHBvbGljeV9pZCwgcG9saWN5X2hhc2hlc1tpXSwgaV9zdG9yYWdlLm9wdGlvbnNbaSArIDFdKQogICAgfQoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogdHJ1ZSIpCn0KYWxsb3dfc3RvcmFnZV9vcHRpb25zKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKSB7CiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDM6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCiAgICBjb3VudChwX3N0b3JhZ2Uub3B0aW9ucykgPT0gMQoKICAgIHN0YXJ0c3dpdGgocF9zdG9yYWdlLm9wdGlvbnNbMF0sICIkKGhhc2giKQogICAgaGFzaF9zdWZmaXggOj0gdHJpbV9sZWZ0KHBfc3RvcmFnZS5vcHRpb25zWzBdLCAiJChoYXNoIikKCiAgICBlbmRzd2l0aChoYXNoX3N1ZmZpeCwgIikiKQogICAgaGFzaF9pbmRleCA6PSB0cmltX3JpZ2h0KGhhc2hfc3VmZml4LCAiKSIpCiAgICBpIDo9IHRvX251bWJlcihoYXNoX2luZGV4KQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAzOiBpID0iLCBpKQoKICAgIGhhc2hfb3B0aW9uIDo9IGNvbmNhdCgiPSIsIFsiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LnJvb3QtaGFzaCIsIHJvb3RfaGFzaGVzW2ldXSkKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMzogaGFzaF9vcHRpb24gPSIsIGhhc2hfb3B0aW9uKQoKICAgIGNvdW50KGlfc3RvcmFnZS5vcHRpb25zKSA9PSA0CiAgICBpX3N0b3JhZ2Uub3B0aW9uc1swXSA9PSAicm8iCiAgICBpX3N0b3JhZ2Uub3B0aW9uc1sxXSA9PSAiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmJsb2NrX2RldmljZT1maWxlIgogICAgaV9zdG9yYWdlLm9wdGlvbnNbMl0gPT0gImlvLmthdGFjb250YWluZXJzLmZzLW9wdC5pcy1sYXllciIKICAgIGlfc3RvcmFnZS5vcHRpb25zWzNdID09IGhhc2hfb3B0aW9uCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAzOiB0cnVlIikKfQphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgNDogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gInNtYiIKICAgIHBfb3B0c19jb3VudCA6PSBjb3VudChwX3N0b3JhZ2Uub3B0aW9ucykKICAgIGlfb3B0c19jb3VudCA6PSBjb3VudChpX3N0b3JhZ2Uub3B0aW9ucykKICAgIGlfb3B0c19jb3VudCA9PSBwX29wdHNfY291bnQgKyAyCgogICAgaV9vcHRfbWF0Y2hlcyA6PSBbaSB8IGkgOj0gaWR4OyBpZHggPCBwX29wdHNfY291bnQ7IHBfc3RvcmFnZS5vcHRpb25zW2lkeF0gPT0gaV9zdG9yYWdlLm9wdGlvbnNbaWR4XV0KICAgIGNvdW50KGlfb3B0X21hdGNoZXMpID09IHBfb3B0c19jb3VudAoKICAgIHN0YXJ0c3dpdGgoaV9zdG9yYWdlLm9wdGlvbnNbaV9vcHRzX2NvdW50LTJdLCAiYWRkcj0iKQogICAgY3JlZHMgPSBzcGxpdChpX3N0b3JhZ2Uub3B0aW9uc1tpX29wdHNfY291bnQtMV0sICIsIikKICAgIGNvdW50KGNyZWRzKSA9PSAyCiAgICBzdGFydHN3aXRoKGNyZWRzWzBdLCAidXNlcm5hbWU9IikKICAgIHN0YXJ0c3dpdGgoY3JlZHNbMV0sICJwYXNzd29yZD0iKQogICAgCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDQ6IHRydWUiKQp9CgphbGxvd19vdmVybGF5X2xheWVyKHBvbGljeV9pZCwgcG9saWN5X2hhc2gsIGlfb3B0aW9uKSB7CiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogcG9saWN5X2lkID0iLCBwb2xpY3lfaWQsICJwb2xpY3lfaGFzaCA9IiwgcG9saWN5X2hhc2gpCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogaV9vcHRpb24gPSIsIGlfb3B0aW9uKQoKICAgIHN0YXJ0c3dpdGgoaV9vcHRpb24sICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQubGF5ZXI9IikKICAgIGlfdmFsdWUgOj0gcmVwbGFjZShpX29wdGlvbiwgImlvLmthdGFjb250YWluZXJzLmZzLW9wdC5sYXllcj0iLCAiIikKICAgIGlfdmFsdWVfZGVjb2RlZCA6PSBiYXNlNjQuZGVjb2RlKGlfdmFsdWUpCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogaV92YWx1ZV9kZWNvZGVkID0iLCBpX3ZhbHVlX2RlY29kZWQpCgogICAgcG9saWN5X3N1ZmZpeCA6PSBjb25jYXQoIj0iLCBbInRhcixybyxpby5rYXRhY29udGFpbmVycy5mcy1vcHQuYmxvY2tfZGV2aWNlPWZpbGUsaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmlzLWxheWVyLGlvLmthdGFjb250YWluZXJzLmZzLW9wdC5yb290LWhhc2giLCBwb2xpY3lfaGFzaF0pCiAgICBwX3ZhbHVlIDo9IGNvbmNhdCgiLCIsIFtwb2xpY3lfaWQsIHBvbGljeV9zdWZmaXhdKQogICAgcHJpbnQoImFsbG93X292ZXJsYXlfbGF5ZXI6IHBfdmFsdWUgPSIsIHBfdmFsdWUpCgogICAgcF92YWx1ZSA9PSBpX3ZhbHVlX2RlY29kZWQKCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogdHJ1ZSIpCn0KCmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAidGFyIgoKICAgIHN0YXJ0c3dpdGgocF9zdG9yYWdlLm1vdW50X3BvaW50LCAiJChsYXllciIpCiAgICBtb3VudF9zdWZmaXggOj0gdHJpbV9sZWZ0KHBfc3RvcmFnZS5tb3VudF9wb2ludCwgIiQobGF5ZXIiKQoKICAgIGVuZHN3aXRoKG1vdW50X3N1ZmZpeCwgIikiKQogICAgbGF5ZXJfaW5kZXggOj0gdHJpbV9yaWdodChtb3VudF9zdWZmaXgsICIpIikKICAgIGkgOj0gdG9fbnVtYmVyKGxheWVyX2luZGV4KQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDE6IGkgPSIsIGkpCgogICAgbGF5ZXJfaWQgOj0gbGF5ZXJfaWRzW2ldCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMTogbGF5ZXJfaWQgPSIsIGxheWVyX2lkKQoKICAgIHBfbW91bnQgOj0gY29uY2F0KCIvIiwgWyIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L2xheWVycyIsIGxheWVyX2lkXSkKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCAxOiBwX21vdW50ID0iLCBwX21vdW50KQoKICAgIHBfbW91bnQgPT0gaV9zdG9yYWdlLm1vdW50X3BvaW50CgogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDE6IHRydWUiKQp9CmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAiZnVzZTMua2F0YS1vdmVybGF5IgoKICAgIG1vdW50MSA6PSByZXBsYWNlKHBfc3RvcmFnZS5tb3VudF9wb2ludCwgIiQoY3BhdGgpIiwgcG9saWN5X2RhdGEuY29tbW9uLmNwYXRoKQogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDI6IG1vdW50MiA9IiwgbW91bnQyKQoKICAgIG1vdW50MiA9PSBpX3N0b3JhZ2UubW91bnRfcG9pbnQKCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMjogdHJ1ZSIpCn0KYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKSB7CiAgICBwX3N0b3JhZ2UuZnN0eXBlID09ICJsb2NhbCIKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQyID0iLCBtb3VudDIpCgogICAgbW91bnQzIDo9IHJlcGxhY2UobW91bnQyLCAiJChzYW5kYm94LWlkKSIsIHNhbmRib3hfaWQpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQzID0iLCBtb3VudDMpCgogICAgcmVnZXgubWF0Y2gobW91bnQzLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCgogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDM6IHRydWUiKQp9CmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAiYmluZCIKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNDogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNDogbW91bnQyID0iLCBtb3VudDIpCgogICAgbW91bnQzIDo9IHJlcGxhY2UobW91bnQyLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDQ6IG1vdW50MyA9IiwgbW91bnQzKQoKICAgIHJlZ2V4Lm1hdGNoKG1vdW50MywgaV9zdG9yYWdlLm1vdW50X3BvaW50KQoKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA0OiB0cnVlIikKfQphbGxvd19tb3VudF9wb2ludChwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgYnVuZGxlX2lkLCBzYW5kYm94X2lkLCBsYXllcl9pZHMpIHsKICAgIHBfc3RvcmFnZS5mc3R5cGUgPT0gInRtcGZzIgoKICAgIG1vdW50MSA6PSBwX3N0b3JhZ2UubW91bnRfcG9pbnQKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA1OiBtb3VudDEgPSIsIG1vdW50MSkKCiAgICByZWdleC5tYXRjaChtb3VudDEsIGlfc3RvcmFnZS5tb3VudF9wb2ludCkKCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNTogdHJ1ZSIpCn0KYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKSB7CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogaV9zdG9yYWdlLm1vdW50X3BvaW50ID0iLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCiAgICBhbGxvd19kaXJlY3Rfdm9sX2RyaXZlcihwX3N0b3JhZ2UsIGlfc3RvcmFnZSkKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChzcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQyID0iLCBtb3VudDIpCgogICAgZGlyZWN0X3ZvbF9wYXRoIDo9IGlfc3RvcmFnZS5zb3VyY2UKICAgIG1vdW50MyA6PSByZXBsYWNlKG1vdW50MiwgIiQoYjY0LWRpcmVjdC12b2wtcGF0aCkiLCBiYXNlNjR1cmwuZW5jb2RlKGRpcmVjdF92b2xfcGF0aCkpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQzID0iLCBtb3VudDMpCgogICAgbW91bnQzID09IGlfc3RvcmFnZS5tb3VudF9wb2ludAoKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA2OiB0cnVlIikKfQoKYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIocF9zdG9yYWdlLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19kaXJlY3Rfdm9sX2RyaXZlciAxOiBzdGFydCIpCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCiAgICBwcmludCgiYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIgMTogdHJ1ZSIpCn0KYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIocF9zdG9yYWdlLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19kaXJlY3Rfdm9sX2RyaXZlciAyOiBzdGFydCIpCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJzbWIiCiAgICBwcmludCgiYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIgMjogdHJ1ZSIpCn0KCiMgRXhlY1Byb2Nlc3NSZXF1ZXN0LnByb2Nlc3MuQ2FwYWJpbGl0aWVzCmFsbG93X2V4ZWNfY2FwcyhpX2NhcHMpIHsKICAgIG5vdCBpX2NhcHMuQW1iaWVudAogICAgbm90IGlfY2Fwcy5Cb3VuZGluZwogICAgbm90IGlfY2Fwcy5FZmZlY3RpdmUKICAgIG5vdCBpX2NhcHMuSW5oZXJpdGFibGUKICAgIG5vdCBpX2NhcHMuUGVybWl0dGVkCn0KCiMgT0NJLlByb2Nlc3MuQ2FwYWJpbGl0aWVzCmFsbG93X2NhcHMocF9jYXBzLCBpX2NhcHMpIHsKICAgIHByaW50KCJhbGxvd19jYXBzOiBwb2xpY3kgQW1iaWVudCA9IiwgcF9jYXBzLkFtYmllbnQpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgQW1iaWVudCA9IiwgaV9jYXBzLkFtYmllbnQpCiAgICBtYXRjaF9jYXBzKHBfY2Fwcy5BbWJpZW50LCBpX2NhcHMuQW1iaWVudCkKCiAgICBwcmludCgiYWxsb3dfY2FwczogcG9saWN5IEJvdW5kaW5nID0iLCBwX2NhcHMuQm91bmRpbmcpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgQm91bmRpbmcgPSIsIGlfY2Fwcy5Cb3VuZGluZykKICAgIG1hdGNoX2NhcHMocF9jYXBzLkJvdW5kaW5nLCBpX2NhcHMuQm91bmRpbmcpCgogICAgcHJpbnQoImFsbG93X2NhcHM6IHBvbGljeSBFZmZlY3RpdmUgPSIsIHBfY2Fwcy5FZmZlY3RpdmUpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgRWZmZWN0aXZlID0iLCBpX2NhcHMuRWZmZWN0aXZlKQogICAgbWF0Y2hfY2FwcyhwX2NhcHMuRWZmZWN0aXZlLCBpX2NhcHMuRWZmZWN0aXZlKQoKICAgIHByaW50KCJhbGxvd19jYXBzOiBwb2xpY3kgSW5oZXJpdGFibGUgPSIsIHBfY2Fwcy5Jbmhlcml0YWJsZSkKICAgIHByaW50KCJhbGxvd19jYXBzOiBpbnB1dCBJbmhlcml0YWJsZSA9IiwgaV9jYXBzLkluaGVyaXRhYmxlKQogICAgbWF0Y2hfY2FwcyhwX2NhcHMuSW5oZXJpdGFibGUsIGlfY2Fwcy5Jbmhlcml0YWJsZSkKCiAgICBwcmludCgiYWxsb3dfY2FwczogcG9saWN5IFBlcm1pdHRlZCA9IiwgcF9jYXBzLlBlcm1pdHRlZCkKICAgIHByaW50KCJhbGxvd19jYXBzOiBpbnB1dCBQZXJtaXR0ZWQgPSIsIGlfY2Fwcy5QZXJtaXR0ZWQpCiAgICBtYXRjaF9jYXBzKHBfY2Fwcy5QZXJtaXR0ZWQsIGlfY2Fwcy5QZXJtaXR0ZWQpCn0KCm1hdGNoX2NhcHMocF9jYXBzLCBpX2NhcHMpIHsKICAgIHByaW50KCJtYXRjaF9jYXBzIDE6IHN0YXJ0IikKCiAgICBwX2NhcHMgPT0gaV9jYXBzCgogICAgcHJpbnQoIm1hdGNoX2NhcHMgMTogdHJ1ZSIpCn0KbWF0Y2hfY2FwcyhwX2NhcHMsIGlfY2FwcykgewogICAgcHJpbnQoIm1hdGNoX2NhcHMgMjogc3RhcnQiKQoKICAgIGNvdW50KHBfY2FwcykgPT0gMQogICAgcF9jYXBzWzBdID09ICIkKGRlZmF1bHRfY2FwcykiCgogICAgcHJpbnQoIm1hdGNoX2NhcHMgMjogZGVmYXVsdF9jYXBzID0iLCBwb2xpY3lfZGF0YS5jb21tb24uZGVmYXVsdF9jYXBzKQogICAgcG9saWN5X2RhdGEuY29tbW9uLmRlZmF1bHRfY2FwcyA9PSBpX2NhcHMKCiAgICBwcmludCgibWF0Y2hfY2FwcyAyOiB0cnVlIikKfQptYXRjaF9jYXBzKHBfY2FwcywgaV9jYXBzKSB7CiAgICBwcmludCgibWF0Y2hfY2FwcyAzOiBzdGFydCIpCgogICAgY291bnQocF9jYXBzKSA9PSAxCiAgICBwX2NhcHNbMF0gPT0gIiQocHJpdmlsZWdlZF9jYXBzKSIKCiAgICBwcmludCgibWF0Y2hfY2FwcyAzOiBwcml2aWxlZ2VkX2NhcHMgPSIsIHBvbGljeV9kYXRhLmNvbW1vbi5wcml2aWxlZ2VkX2NhcHMpCiAgICBwb2xpY3lfZGF0YS5jb21tb24ucHJpdmlsZWdlZF9jYXBzID09IGlfY2FwcwoKICAgIHByaW50KCJtYXRjaF9jYXBzIDM6IHRydWUiKQp9CgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgpjaGVja19kaXJlY3RvcnlfdHJhdmVyc2FsKGlfcGF0aCkgewogICAgbm90IHJlZ2V4Lm1hdGNoKCIoXnwvKS4uKCR8LykiLCBpX3BhdGgpCn0KCmNoZWNrX3N5bWxpbmtfc291cmNlKGlfc3JjKSB7CiAgICBpX3NyYyA9PSAiIgogICAgcHJpbnQoImNoZWNrX3N5bWxpbmtfc291cmNlIDE6IHRydWUiKQp9CmNoZWNrX3N5bWxpbmtfc291cmNlKGlfc3JjKSB7CiAgICBpX3NyYyAhPSAiIgogICAgcHJpbnQoImNoZWNrX3N5bWxpbmtfc291cmNlIDI6IGlfc3JjID0iLCBpX3NyYykKCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24uc19zb3VyY2UxLCBpX3NyYykKCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMjogdHJ1ZSIpCn0KY2hlY2tfc3ltbGlua19zb3VyY2UoaV9zcmMpIHsKICAgIGlfc3JjICE9ICIiCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMzogaV9zcmMgPSIsIGlfc3JjKQoKICAgIHJlZ2V4Lm1hdGNoKHBvbGljeV9kYXRhLmNvbW1vbi5zX3NvdXJjZTIsIGlfc3JjKQogICAgY2hlY2tfZGlyZWN0b3J5X3RyYXZlcnNhbChpX3NyYykKCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMzogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfc3RvcmFnZXMoaV9zdG9yYWdlcykgewogICAgcHJpbnQoImFsbG93X3NhbmRib3hfc3RvcmFnZXM6IGlfc3RvcmFnZXMgPSIsIGlfc3RvcmFnZXMpCgogICAgcF9zdG9yYWdlcyA6PSBwb2xpY3lfZGF0YS5zYW5kYm94LnN0b3JhZ2VzCiAgICBldmVyeSBpX3N0b3JhZ2UgaW4gaV9zdG9yYWdlcyB7CiAgICAgICAgYWxsb3dfc2FuZGJveF9zdG9yYWdlKHBfc3RvcmFnZXMsIGlfc3RvcmFnZSkKICAgIH0KCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9zdG9yYWdlczogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfc3RvcmFnZShwX3N0b3JhZ2VzLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IGlfc3RvcmFnZSA9IiwgaV9zdG9yYWdlKQoKICAgIHNvbWUgcF9zdG9yYWdlIGluIHBfc3RvcmFnZXMKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IHBfc3RvcmFnZSA9IiwgcF9zdG9yYWdlKQogICAgaV9zdG9yYWdlID09IHBfc3RvcmFnZQoKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IHRydWUiKQp9CgpDb3B5RmlsZVJlcXVlc3QgewogICAgcHJpbnQoIkNvcHlGaWxlUmVxdWVzdDogaW5wdXQucGF0aCA9IiwgaW5wdXQucGF0aCkKCiAgICBjaGVja19zeW1saW5rX3NvdXJjZShpbnB1dC5zeW1saW5rX3NyYykKICAgIGNoZWNrX2RpcmVjdG9yeV90cmF2ZXJzYWwoaW5wdXQucGF0aCkKCiAgICBzb21lIHJlZ2V4MSBpbiBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLkNvcHlGaWxlUmVxdWVzdAogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5jcGF0aCkKICAgIHJlZ2V4NCA6PSByZXBsYWNlKHJlZ2V4MywgIiQoYnVuZGxlLWlkKSIsIEJVTkRMRV9JRCkKICAgIHByaW50KCJDb3B5RmlsZVJlcXVlc3Q6IHJlZ2V4NCA9IiwgcmVnZXg0KQoKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4NCwgaW5wdXQucGF0aCkKCiAgICBwcmludCgiQ29weUZpbGVSZXF1ZXN0OiB0cnVlIikKfQoKQ3JlYXRlU2FuZGJveFJlcXVlc3QgewogICAgcHJpbnQoIkNyZWF0ZVNhbmRib3hSZXF1ZXN0OiBpbnB1dC5ndWVzdF9ob29rX3BhdGggPSIsIGlucHV0Lmd1ZXN0X2hvb2tfcGF0aCkKICAgIGNvdW50KGlucHV0Lmd1ZXN0X2hvb2tfcGF0aCkgPT0gMAoKICAgIHByaW50KCJDcmVhdGVTYW5kYm94UmVxdWVzdDogaW5wdXQua2VybmVsX21vZHVsZXMgPSIsIGlucHV0Lmtlcm5lbF9tb2R1bGVzKQogICAgY291bnQoaW5wdXQua2VybmVsX21vZHVsZXMpID09IDAKCiAgICBpX3BpZG5zIDo9IGlucHV0LnNhbmRib3hfcGlkbnMKICAgIHByaW50KCJDcmVhdGVTYW5kYm94UmVxdWVzdDogaV9waWRucyA9IiwgaV9waWRucykKICAgIGlfcGlkbnMgPT0gZmFsc2UKICAgIGFsbG93X3NhbmRib3hfc3RvcmFnZXMoaW5wdXQuc3RvcmFnZXMpCn0KCmFsbG93X2V4ZWMocF9jb250YWluZXIsIGlfcHJvY2VzcykgewogICAgcHJpbnQoImFsbG93X2V4ZWM6IHN0YXJ0IikKCiAgICBwX29jaSA9IHBfY29udGFpbmVyLk9DSQogICAgcF9zX25hbWUgPSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc19uYW1lc3BhY2UgPSBnZXRfc3RhdGVfdmFsKCJuYW1lc3BhY2UiKQogICAgYWxsb3dfcHJvYmVfcHJvY2VzcyhwX29jaS5Qcm9jZXNzLCBpX3Byb2Nlc3MsIHBfc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfZXhlYzogdHJ1ZSIpCn0KCmFsbG93X2ludGVyYWN0aXZlX2V4ZWMocF9jb250YWluZXIsIGlfcHJvY2VzcykgewogICAgcHJpbnQoImFsbG93X2ludGVyYWN0aXZlX2V4ZWM6IHN0YXJ0IikKCiAgICBwX29jaSA9IHBfY29udGFpbmVyLk9DSQogICAgcF9zX25hbWUgPSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc19uYW1lc3BhY2UgPSBnZXRfc3RhdGVfdmFsKCJuYW1lc3BhY2UiKQogICAgYWxsb3dfaW50ZXJhY3RpdmVfcHJvY2VzcyhwX29jaS5Qcm9jZXNzLCBpX3Byb2Nlc3MsIHBfc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfaW50ZXJhY3RpdmVfZXhlYzogdHJ1ZSIpCn0KCiMgVE9ETzogc2hvdWxkIG90aGVyIEV4ZWNQcm9jZXNzUmVxdWVzdCBpbnB1dCBkYXRhIGZpZWxkcyBiZSB2YWxpZGF0ZWQgYXMgd2VsbD8KRXhlY1Byb2Nlc3NSZXF1ZXN0IHsKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMTogaW5wdXQgPSIsIGlucHV0KQoKICAgIHNvbWUgcF9jb21tYW5kIGluIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuRXhlY1Byb2Nlc3NSZXF1ZXN0LmFsbG93ZWRfY29tbWFuZHMKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMTogcF9jb21tYW5kID0iLCBwX2NvbW1hbmQpCiAgICBwX2NvbW1hbmQgPT0gaW5wdXQucHJvY2Vzcy5BcmdzCgogICAgIyBUT0RPOiBtYXRjaCBwX2NvbnRhaW5lcidzIElEIHdpdGggdGhlIGlucHV0IGNvbnRhaW5lcl9pZC4KICAgIHNvbWUgcF9jb250YWluZXIgaW4gcG9saWN5X2RhdGEuY29udGFpbmVycwogICAgYWxsb3dfaW50ZXJhY3RpdmVfZXhlYyhwX2NvbnRhaW5lciwgaW5wdXQucHJvY2VzcykKCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDE6IHRydWUiKQp9CkV4ZWNQcm9jZXNzUmVxdWVzdCB7CiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDI6IGlucHV0ID0iLCBpbnB1dCkKCiAgICAjIFRPRE86IG1hdGNoIGlucHV0IGNvbnRhaW5lciBJRCB3aXRoIGl0cyBjb3JyZXNwb25kaW5nIGNvbnRhaW5lci5leGVjX2NvbW1hbmRzLgogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBzb21lIHBfY29tbWFuZCBpbiBwX2NvbnRhaW5lci5leGVjX2NvbW1hbmRzCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDI6IHBfY29tbWFuZCA9IiwgcF9jb21tYW5kKQoKICAgICMgVE9ETzogc2hvdWxkIG90aGVyIGlucHV0IGRhdGEgZmllbGRzIGJlIHZhbGlkYXRlZCBhcyB3ZWxsPwogICAgcF9jb21tYW5kID09IGlucHV0LnByb2Nlc3MuQXJncwoKICAgIGFsbG93X2V4ZWMocF9jb250YWluZXIsIGlucHV0LnByb2Nlc3MpCgogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAyOiB0cnVlIikKfQpFeGVjUHJvY2Vzc1JlcXVlc3QgewogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAzOiBpbnB1dCA9IiwgaW5wdXQpCgogICAgaV9jb21tYW5kID0gY29uY2F0KCIgIiwgaW5wdXQucHJvY2Vzcy5BcmdzKQogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAzOiBpX2NvbW1hbmQgPSIsIGlfY29tbWFuZCkKCiAgICBzb21lIHBfcmVnZXggaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5FeGVjUHJvY2Vzc1JlcXVlc3QucmVnZXgKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMzogcF9yZWdleCA9IiwgcF9yZWdleCkKCiAgICByZWdleC5tYXRjaChwX3JlZ2V4LCBpX2NvbW1hbmQpCgogICAgIyBUT0RPOiBtYXRjaCBwX2NvbnRhaW5lcidzIElEIHdpdGggdGhlIGlucHV0IGNvbnRhaW5lcl9pZC4KICAgIHNvbWUgcF9jb250YWluZXIgaW4gcG9saWN5X2RhdGEuY29udGFpbmVycwogICAgYWxsb3dfaW50ZXJhY3RpdmVfZXhlYyhwX2NvbnRhaW5lciwgaW5wdXQucHJvY2VzcykKCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDM6IHRydWUiKQp9CgpVcGRhdGVSb3V0ZXNSZXF1ZXN0IHsKICAgIHByaW50KCJVcGRhdGVSb3V0ZXNSZXF1ZXN0OiBpbnB1dCA9IiwgaW5wdXQpCiAgICBwcmludCgiVXBkYXRlUm91dGVzUmVxdWVzdDogcG9saWN5ID0iLCBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLlVwZGF0ZVJvdXRlc1JlcXVlc3QpCgogICAgaV9yb3V0ZXMgOj0gaW5wdXQucm91dGVzLlJvdXRlcwogICAgcF9zb3VyY2VfcmVnZXggPSBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLlVwZGF0ZVJvdXRlc1JlcXVlc3QuZm9yYmlkZGVuX3NvdXJjZV9yZWdleAogICAgcF9uYW1lcyA9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuVXBkYXRlUm91dGVzUmVxdWVzdC5mb3JiaWRkZW5fZGV2aWNlX25hbWVzCgogICAgZXZlcnkgaV9yb3V0ZSBpbiBpX3JvdXRlcyB7CiAgICAgICAgcHJpbnQoImlfcm91dGUuc291cmNlID0iLCBpX3JvdXRlLnNvdXJjZSkKICAgICAgICBldmVyeSBwX3JlZ2V4IGluIHBfc291cmNlX3JlZ2V4IHsKICAgICAgICAgICAgcHJpbnQoInBfcmVnZXggPSIsIHBfcmVnZXgpCiAgICAgICAgICAgIG5vdCByZWdleC5tYXRjaChwX3JlZ2V4LCBpX3JvdXRlLnNvdXJjZSkKICAgICAgICB9CgogICAgICAgIHByaW50KCJpX3JvdXRlLmRldmljZSA9IiwgaV9yb3V0ZS5kZXZpY2UpCiAgICAgICAgbm90IGlfcm91dGUuZGV2aWNlIGluIHBfbmFtZXMKICAgIH0KCiAgICBwcmludCgiVXBkYXRlUm91dGVzUmVxdWVzdDogdHJ1ZSIpCn0KClVwZGF0ZUludGVyZmFjZVJlcXVlc3QgewogICAgcHJpbnQoIlVwZGF0ZUludGVyZmFjZVJlcXVlc3Q6IGlucHV0ID0iLCBpbnB1dCkKICAgIHByaW50KCJVcGRhdGVJbnRlcmZhY2VSZXF1ZXN0OiBwb2xpY3kgPSIsIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuVXBkYXRlSW50ZXJmYWNlUmVxdWVzdCkKCiAgICBpX2ludGVyZmFjZSA6PSBpbnB1dC5pbnRlcmZhY2UKICAgIHBfZmxhZ3MgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmFsbG93X3Jhd19mbGFncwoKICAgICMgVHlwaWNhbGx5LCBqdXN0IElGRl9OT0FSUCBpcyB1c2VkLgogICAgYml0cy5hbmQoaV9pbnRlcmZhY2UucmF3X2ZsYWdzLCBiaXRzLm5lZ2F0ZShwX2ZsYWdzKSkgPT0gMAoKICAgIHBfbmFtZXMgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmZvcmJpZGRlbl9uYW1lcwoKICAgIG5vdCBpX2ludGVyZmFjZS5uYW1lIGluIHBfbmFtZXMKCiAgICBwX2h3YWRkcnMgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmZvcmJpZGRlbl9od19hZGRycwoKICAgIG5vdCBpX2ludGVyZmFjZS5od0FkZHIgaW4gcF9od2FkZHJzCgogICAgcHJpbnQoIlVwZGF0ZUludGVyZmFjZVJlcXVlc3Q6IHRydWUiKQp9CgpDbG9zZVN0ZGluUmVxdWVzdCB7CiAgICBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLkNsb3NlU3RkaW5SZXF1ZXN0ID09IHRydWUKfQoKUmVhZFN0cmVhbVJlcXVlc3QgewogICAgcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5SZWFkU3RyZWFtUmVxdWVzdCA9PSB0cnVlCn0KClVwZGF0ZUVwaGVtZXJhbE1vdW50c1JlcXVlc3QgewogICAgcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVFcGhlbWVyYWxNb3VudHNSZXF1ZXN0ID09IHRydWUKfQoKV3JpdGVTdHJlYW1SZXF1ZXN0IHsKICAgIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuV3JpdGVTdHJlYW1SZXF1ZXN0ID09IHRydWUKfQoKcG9saWN5X2RhdGEgOj0gewogICJjb250YWluZXJzIjogWwogICAgewogICAgICAiT0NJIjogewogICAgICAgICJWZXJzaW9uIjogIjEuMS4wLXJjLjEiLAogICAgICAgICJQcm9jZXNzIjogewogICAgICAgICAgIlRlcm1pbmFsIjogZmFsc2UsCiAgICAgICAgICAiVXNlciI6IHsKICAgICAgICAgICAgIlVJRCI6IDY1NTM1LAogICAgICAgICAgICAiR0lEIjogNjU1MzUsCiAgICAgICAgICAgICJBZGRpdGlvbmFsR2lkcyI6IFtdLAogICAgICAgICAgICAiVXNlcm5hbWUiOiAiIgogICAgICAgICAgfSwKICAgICAgICAgICJEZXByZWNhdGVkQXJncyI6IFsKICAgICAgICAgICAgIi9wYXVzZSIKICAgICAgICAgIF0sCiAgICAgICAgICAiQXJncyI6IFsKICAgICAgICAgICAgIi9wYXVzZSIKICAgICAgICAgIF0sCiAgICAgICAgICAiRW52IjogWwogICAgICAgICAgICAiUEFUSD0vdXNyL2xvY2FsL3NiaW46L3Vzci9sb2NhbC9iaW46L3Vzci9zYmluOi91c3IvYmluOi9zYmluOi9iaW4iCiAgICAgICAgICBdLAogICAgICAgICAgIkN3ZCI6ICIvIiwKICAgICAgICAgICJDYXBhYmlsaXRpZXMiOiB7CiAgICAgICAgICAgICJBbWJpZW50IjogW10sCiAgICAgICAgICAgICJCb3VuZGluZyI6IFsKICAgICAgICAgICAgICAiJChkZWZhdWx0X2NhcHMpIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiRWZmZWN0aXZlIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJJbmhlcml0YWJsZSI6IFtdLAogICAgICAgICAgICAiUGVybWl0dGVkIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICAiTm9OZXdQcml2aWxlZ2VzIjogdHJ1ZQogICAgICAgIH0sCiAgICAgICAgIlJvb3QiOiB7CiAgICAgICAgICAiUGF0aCI6ICIkKGNwYXRoKS8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgIlJlYWRvbmx5IjogdHJ1ZQogICAgICAgIH0sCiAgICAgICAgIk1vdW50cyI6IFsKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9wcm9jIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJwcm9jIiwKICAgICAgICAgICAgInR5cGVfIjogInByb2MiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2IiwKICAgICAgICAgICAgInNvdXJjZSI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJzdHJpY3RhdGltZSIsCiAgICAgICAgICAgICAgIm1vZGU9NzU1IiwKICAgICAgICAgICAgICAic2l6ZT02NTUzNmsiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L3B0cyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiZGV2cHRzIiwKICAgICAgICAgICAgInR5cGVfIjogImRldnB0cyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJuZXdpbnN0YW5jZSIsCiAgICAgICAgICAgICAgInB0bXhtb2RlPTA2NjYiLAogICAgICAgICAgICAgICJtb2RlPTA2MjAiLAogICAgICAgICAgICAgICJnaWQ9NSIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvc2htIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L3NobSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi9tcXVldWUiLAogICAgICAgICAgICAic291cmNlIjogIm1xdWV1ZSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJtcXVldWUiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvc3lzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJzeXNmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJzeXNmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2V0Yy9yZXNvbHYuY29uZiIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClyZXNvbHYuY29uZiQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJvIiwKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9kZXYiLAogICAgICAgICAgICAgICJub2V4ZWMiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0KICAgICAgICBdLAogICAgICAgICJBbm5vdGF0aW9ucyI6IHsKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmJ1bmRsZV9wYXRoIjogIi9ydW4vY29udGFpbmVyZC9pby5jb250YWluZXJkLnJ1bnRpbWUudjIudGFzay9rOHMuaW8vJChidW5kbGUtaWQpIiwKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIjogInBvZF9zYW5kYm94IiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSI6ICJzYW5kYm94IiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWlkIjogIl5bYS16MC05XXs2NH0kIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWxvZy1kaXJlY3RvcnkiOiAiXi92YXIvbG9nL3BvZHMvJChzYW5kYm94LW5hbWVzcGFjZSlfJChzYW5kYm94LW5hbWUpX1swLTlhLWZdezh9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezEyfSQiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZXNwYWNlIjogIiIsCiAgICAgICAgICAibmVyZGN0bC9uZXR3b3JrLW5hbWVzcGFjZSI6ICJeL3Zhci9ydW4vbmV0bnMvY25pLVswLTlhLWZdezh9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezEyfSQiCiAgICAgICAgfSwKICAgICAgICAiTGludXgiOiB7CiAgICAgICAgICAiTmFtZXNwYWNlcyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICJUeXBlIjogImlwYyIsCiAgICAgICAgICAgICAgIlBhdGgiOiAiIgogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgIlR5cGUiOiAidXRzIiwKICAgICAgICAgICAgICAiUGF0aCI6ICIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiVHlwZSI6ICJtb3VudCIsCiAgICAgICAgICAgICAgIlBhdGgiOiAiIgogICAgICAgICAgICB9CiAgICAgICAgICBdLAogICAgICAgICAgIk1hc2tlZFBhdGhzIjogWwogICAgICAgICAgICAiL3Byb2MvYWNwaSIsCiAgICAgICAgICAgICIvcHJvYy9hc291bmQiLAogICAgICAgICAgICAiL3Byb2Mva2NvcmUiLAogICAgICAgICAgICAiL3Byb2Mva2V5cyIsCiAgICAgICAgICAgICIvcHJvYy9sYXRlbmN5X3N0YXRzIiwKICAgICAgICAgICAgIi9wcm9jL3RpbWVyX2xpc3QiLAogICAgICAgICAgICAiL3Byb2MvdGltZXJfc3RhdHMiLAogICAgICAgICAgICAiL3Byb2Mvc2NoZWRfZGVidWciLAogICAgICAgICAgICAiL3N5cy9maXJtd2FyZSIsCiAgICAgICAgICAgICIvcHJvYy9zY3NpIgogICAgICAgICAgXSwKICAgICAgICAgICJSZWFkb25seVBhdGhzIjogWwogICAgICAgICAgICAiL3Byb2MvYnVzIiwKICAgICAgICAgICAgIi9wcm9jL2ZzIiwKICAgICAgICAgICAgIi9wcm9jL2lycSIsCiAgICAgICAgICAgICIvcHJvYy9zeXMiLAogICAgICAgICAgICAiL3Byb2Mvc3lzcnEtdHJpZ2dlciIKICAgICAgICAgIF0sCiAgICAgICAgICAiRGV2aWNlcyI6IFtdLAogICAgICAgICAgIlN5c2N0bCI6IHsKICAgICAgICAgICAgIm5ldC5pcHY0LmlwX3VucHJpdmlsZWdlZF9wb3J0X3N0YXJ0IjogIjAiLAogICAgICAgICAgICAibmV0LmlwdjQucGluZ19ncm91cF9yYW5nZSI6ICIwIDIxNDc0ODM2NDciCiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9LAogICAgICAic3RvcmFnZXMiOiBbCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJibGsiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogInRhciIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIiQoaGFzaDApIgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGxheWVyMCkiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJvdmVybGF5ZnMiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogImZ1c2UzLmthdGEtb3ZlcmxheSIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIjVhNWFhZDgwMDU1ZmYyMDAxMmE1MGRjMjVmOGRmN2EyOTkyNDQ3NDMyNGQ2NWY3ZDUzMDZlZThlZTI3ZmY3MWQiLAogICAgICAgICAgICAiODE3MjUwZjFhM2UzMzZkYTc2ZjViZDNmYTc4NGUxYjI2ZDk1OWI5YzEzMTg3NjgxNWJhMjYwNDA0OGI3MGMxOCIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChjcGF0aCkvJChidW5kbGUtaWQpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9CiAgICAgIF0sCiAgICAgICJkZXZpY2VzIjogW10sCiAgICAgICJzYW5kYm94X3BpZG5zIjogZmFsc2UsCiAgICAgICJleGVjX2NvbW1hbmRzIjogW10sCiAgICAgICJlbnZfbWFwIjogewogICAgICAgICJQQVRIIjogIi91c3IvbG9jYWwvc2JpbjovdXNyL2xvY2FsL2JpbjovdXNyL3NiaW46L3Vzci9iaW46L3NiaW46L2JpbiIKICAgICAgfQogICAgfSwKICAgIHsKICAgICAgIk9DSSI6IHsKICAgICAgICAiVmVyc2lvbiI6ICIxLjEuMC1yYy4xIiwKICAgICAgICAiUHJvY2VzcyI6IHsKICAgICAgICAgICJUZXJtaW5hbCI6IGZhbHNlLAogICAgICAgICAgIlVzZXIiOiB7CiAgICAgICAgICAgICJVSUQiOiAwLAogICAgICAgICAgICAiR0lEIjogMCwKICAgICAgICAgICAgIkFkZGl0aW9uYWxHaWRzIjogW10sCiAgICAgICAgICAgICJVc2VybmFtZSI6ICIiCiAgICAgICAgICB9LAogICAgICAgICAgIkRlcHJlY2F0ZWRBcmdzIjogWwogICAgICAgICAgICAiL2Fnbmhvc3QiLAogICAgICAgICAgICAibmV0ZXhlYyIsCiAgICAgICAgICAgICItLWh0dHAtcG9ydD04NDQzIiwKICAgICAgICAgICAgIi0tdGxzLWNlcnQtZmlsZT0vbG9jYWxob3N0LmNydCIsCiAgICAgICAgICAgICItLXRscy1wcml2YXRlLWtleS1maWxlPS9sb2NhbGhvc3Qua2V5IgogICAgICAgICAgXSwKICAgICAgICAgICJBcmdzIjogWwogICAgICAgICAgICAiL2Fnbmhvc3QiLAogICAgICAgICAgICAibmV0ZXhlYyIsCiAgICAgICAgICAgICItLWh0dHAtcG9ydD04NDQzIiwKICAgICAgICAgICAgIi0tdGxzLWNlcnQtZmlsZT0vbG9jYWxob3N0LmNydCIsCiAgICAgICAgICAgICItLXRscy1wcml2YXRlLWtleS1maWxlPS9sb2NhbGhvc3Qua2V5IgogICAgICAgICAgXSwKICAgICAgICAgICJFbnYiOiBbCiAgICAgICAgICAgICJQQVRIPS91c3IvbG9jYWwvc2JpbjovdXNyL2xvY2FsL2JpbjovdXNyL3NiaW46L3Vzci9iaW46L3NiaW46L2JpbiIsCiAgICAgICAgICAgICJIT1NUTkFNRT0kKGhvc3QtbmFtZSkiCiAgICAgICAgICBdLAogICAgICAgICAgIkN3ZCI6ICIvIiwKICAgICAgICAgICJDYXBhYmlsaXRpZXMiOiB7CiAgICAgICAgICAgICJBbWJpZW50IjogW10sCiAgICAgICAgICAgICJCb3VuZGluZyI6IFsKICAgICAgICAgICAgICAiJChkZWZhdWx0X2NhcHMpIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiRWZmZWN0aXZlIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJJbmhlcml0YWJsZSI6IFtdLAogICAgICAgICAgICAiUGVybWl0dGVkIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICAiTm9OZXdQcml2aWxlZ2VzIjogZmFsc2UKICAgICAgICB9LAogICAgICAgICJSb290IjogewogICAgICAgICAgIlBhdGgiOiAiJChjcGF0aCkvJChidW5kbGUtaWQpIiwKICAgICAgICAgICJSZWFkb25seSI6IGZhbHNlCiAgICAgICAgfSwKICAgICAgICAiTW91bnRzIjogWwogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL3Byb2MiLAogICAgICAgICAgICAic291cmNlIjogInByb2MiLAogICAgICAgICAgICAidHlwZV8iOiAicHJvYyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYiLAogICAgICAgICAgICAic291cmNlIjogInRtcGZzIiwKICAgICAgICAgICAgInR5cGVfIjogInRtcGZzIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgInN0cmljdGF0aW1lIiwKICAgICAgICAgICAgICAibW9kZT03NTUiLAogICAgICAgICAgICAgICJzaXplPTY1NTM2ayIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvcHRzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJkZXZwdHMiLAogICAgICAgICAgICAidHlwZV8iOiAiZGV2cHRzIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAgICAgIm5ld2luc3RhbmNlIiwKICAgICAgICAgICAgICAicHRteG1vZGU9MDY2NiIsCiAgICAgICAgICAgICAgIm1vZGU9MDYyMCIsCiAgICAgICAgICAgICAgImdpZD01IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi9zaG0iLAogICAgICAgICAgICAic291cmNlIjogIi9ydW4va2F0YS1jb250YWluZXJzL3NhbmRib3gvc2htIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L21xdWV1ZSIsCiAgICAgICAgICAgICJzb3VyY2UiOiAibXF1ZXVlIiwKICAgICAgICAgICAgInR5cGVfIjogIm1xdWV1ZSIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9zeXMiLAogICAgICAgICAgICAic291cmNlIjogInN5c2ZzIiwKICAgICAgICAgICAgInR5cGVfIjogInN5c2ZzIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAgICAgIm5vZGV2IiwKICAgICAgICAgICAgICAicm8iCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvc3lzL2ZzL2Nncm91cCIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiY2dyb3VwIiwKICAgICAgICAgICAgInR5cGVfIjogImNncm91cCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIsCiAgICAgICAgICAgICAgInJlbGF0aW1lIiwKICAgICAgICAgICAgICAicm8iCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZXRjL2hvc3RzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KWhvc3RzJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJydyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvdGVybWluYXRpb24tbG9nIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KXRlcm1pbmF0aW9uLWxvZyQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicnciCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZXRjL2hvc3RuYW1lIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KWhvc3RuYW1lJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJydyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9ldGMvcmVzb2x2LmNvbmYiLAogICAgICAgICAgICAic291cmNlIjogIiQoc2ZwcmVmaXgpcmVzb2x2LmNvbmYkIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJ3IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL3Zhci9ydW4vc2VjcmV0cy9rdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50IiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KXNlcnZpY2VhY2NvdW50JCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJybyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi92YXIvcnVuL3NlY3JldHMvYXp1cmUvdG9rZW5zIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KXRva2VucyQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicm8iCiAgICAgICAgICAgIF0KICAgICAgICAgIH0KICAgICAgICBdLAogICAgICAgICJBbm5vdGF0aW9ucyI6IHsKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmJ1bmRsZV9wYXRoIjogIi9ydW4vY29udGFpbmVyZC9pby5jb250YWluZXJkLnJ1bnRpbWUudjIudGFzay9rOHMuaW8vJChidW5kbGUtaWQpIiwKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIjogInBvZF9jb250YWluZXIiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLmNvbnRhaW5lci1uYW1lIjogImVjaG9oZWFkZXJzIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSI6ICJjb250YWluZXIiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLmltYWdlLW5hbWUiOiAicmVnaXN0cnkuazhzLmlvL2UyZS10ZXN0LWltYWdlcy9hZ25ob3N0OjIuNDAiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtaWQiOiAiXlthLXowLTldezY0fSQiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZXNwYWNlIjogIiIKICAgICAgICB9LAogICAgICAgICJMaW51eCI6IHsKICAgICAgICAgICJOYW1lc3BhY2VzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgIlR5cGUiOiAiaXBjIiwKICAgICAgICAgICAgICAiUGF0aCI6ICIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiVHlwZSI6ICJ1dHMiLAogICAgICAgICAgICAgICJQYXRoIjogIiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJUeXBlIjogIm1vdW50IiwKICAgICAgICAgICAgICAiUGF0aCI6ICIiCiAgICAgICAgICAgIH0KICAgICAgICAgIF0sCiAgICAgICAgICAiTWFza2VkUGF0aHMiOiBbCiAgICAgICAgICAgICIvcHJvYy9hY3BpIiwKICAgICAgICAgICAgIi9wcm9jL2tjb3JlIiwKICAgICAgICAgICAgIi9wcm9jL2tleXMiLAogICAgICAgICAgICAiL3Byb2MvbGF0ZW5jeV9zdGF0cyIsCiAgICAgICAgICAgICIvcHJvYy90aW1lcl9saXN0IiwKICAgICAgICAgICAgIi9wcm9jL3RpbWVyX3N0YXRzIiwKICAgICAgICAgICAgIi9wcm9jL3NjaGVkX2RlYnVnIiwKICAgICAgICAgICAgIi9wcm9jL3Njc2kiLAogICAgICAgICAgICAiL3N5cy9maXJtd2FyZSIKICAgICAgICAgIF0sCiAgICAgICAgICAiUmVhZG9ubHlQYXRocyI6IFsKICAgICAgICAgICAgIi9wcm9jL2Fzb3VuZCIsCiAgICAgICAgICAgICIvcHJvYy9idXMiLAogICAgICAgICAgICAiL3Byb2MvZnMiLAogICAgICAgICAgICAiL3Byb2MvaXJxIiwKICAgICAgICAgICAgIi9wcm9jL3N5cyIsCiAgICAgICAgICAgICIvcHJvYy9zeXNycS10cmlnZ2VyIgogICAgICAgICAgXSwKICAgICAgICAgICJEZXZpY2VzIjogW10sCiAgICAgICAgICAiU3lzY3RsIjogewogICAgICAgICAgICAibmV0LmlwdjQuaXBfdW5wcml2aWxlZ2VkX3BvcnRfc3RhcnQiOiAiMCIsCiAgICAgICAgICAgICJuZXQuaXB2NC5waW5nX2dyb3VwX3JhbmdlIjogIjAgMjE0NzQ4MzY0NyIKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0sCiAgICAgICJzdG9yYWdlcyI6IFsKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoMCkiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXIwKSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoMSkiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXIxKSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoMikiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXIyKSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoMykiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXIzKSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoNCkiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXI0KSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoNSkiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXI1KSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoNikiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXI2KSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoNykiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXI3KSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoOCkiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXI4KSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogIm92ZXJsYXlmcyIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAiZnVzZTMua2F0YS1vdmVybGF5IiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiMDQzNmQ5Mzk5MzRhMjliM2Q1OTc5MzUzNGZmOTNlMTk5Zjk0MzhmOWI5NDFlMTNhZTYzMjE1ZjE2N2M0OTNiODpiZjFjN2YxZjlmN2Y5OTVhYTk2YjBjMGViNTQzOTJkYjRlYzc3OTNlZWI1MzJiNDM4MmI1M2Y3MDA0NDQ2MzVmOjEyNzYyNjJiOTEwNGYxODY3MDQxMGNjYWU1M2JhMzJjM2QyMTk1ZWIxMTdjZWRhZmI2N2YyNTliODljZDRkN2E6Y2Y1NDMyMWYwOWNlNDk3OTNiMTNmMGExYjlmMjVjODY5M2Q0NDY2ZDRjMTg1MWRmMjZlNWM3ZWYyODJlMTg1NjphNzA0ZmIwMDZlOTY3YWY5ODExMTJmNDYxODZiZjZiM2RjM2RmYzlmMWVkNjI2MTRlZTlmZGM4MTEzMDU3NGRlOjZhNzBkN2FkZGU0YmYzNTdlNDczNGQ0ZmFkODgxNjA5MjAwZmEzZWJiMjc5MmYyYmFjMGUzYmNhODMxYjRjMjI6ZTIyNGU1M2ZjY2FkYTdjOTYyNzE0YjM4ZmM2YjQzZWVjNTU2NGVkMzUwMWI1MzE4ODQxMmRlYzU1Y2E5ZTRjMTplZWY2NTNmOTVjYTMyNjUyYjg3ZTY3NmMwYTM3YzBmMjA0ZTU4MTQ1ZDg2NmI0YzY4YmUwZWYzZGQzNmI0MjExOmRhNTk4MGE3ZTM0MzQ0MDlkYTEyMzI0MTdhMWQxY2MwMjk2N2I2MmEwOTk1MDJjYWNkMTNjYzJlMzQyMDZmYTQiLAogICAgICAgICAgICAiMTFlYmM1M2RmY2YwMDhkZGFjZjQ1ZWU2NjM5ZGI1OGRmNDY2ZWQ3OTc1ZTAxMGI0N2EyMTYyMmQ2NzA0OGY2MDo4MzUyMmEzODhmZGY3YTIwZTVjMDU1YjNkOGRhN2E3NzI2ZmIwNGI3MTZiN2M1MjI4YmUzOTllNzgyMjA0NGI5OjZjN2VhMGY2YzQ4MTE3ZWYwYjVhMjVkMDhlNzAzMzE5NDY2NTU5NGFhYWQxODJjNWQ3MjI2Nzg4ZTc3OWJmMDg6NTY4ZDkxMTFiNTc5YTllYjY2MWVkNzk3OGVjYjQ5YjAzNTFmOGZiN2M5ODcxMjkwYmU0ZWMzYjVmODVhMDdhOTpjMGNkZTQwOTFlMjBiYjI2NGM1OTI4ZmNjZjNlMzE1N2Y4ODBkODY0ZGYzZmMzMjFiYjlmNmI1YzM1ZjllNGU0OjM1OTkyZTJjYWJhOTYyZmMwZDNjYmIyMmYyMzhiYmU1MmJlMGQ1NDRiM2IzYTllYjI4N2Q2YmZkOTdmYTdkZjI6YjExZWMyMjkwNTk3NTk3MTM1YTkxZGY4NDgxMjg3NDdiYTc2OGFkM2ZjYWYwYmI3NTBiMjkyMTZlMmUzYzJkMTphZjMxZTY1MWVkZDFmMjViZDgzOTQzNGI2ZDYwNTYyYmNiZDkwNzFlYzUxNmY0MWM2YjJlZmIyOWU4NDBjNDNlOjI1NGM1MzE0ODczYzI3YThkZTNkYjUzNDdmNTZlYmQ5ZWIyYmY0NmNjODgxMmE0MzYxMWY5OGUzOGFjMzdiYTIiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQoY3BhdGgpLyQoYnVuZGxlLWlkKSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfQogICAgICBdLAogICAgICAiZGV2aWNlcyI6IFtdLAogICAgICAic2FuZGJveF9waWRucyI6IGZhbHNlLAogICAgICAiZXhlY19jb21tYW5kcyI6IFtdLAogICAgICAiZW52X21hcCI6IHsKICAgICAgICAiSE9TVE5BTUUiOiAiJChob3N0LW5hbWUpIiwKICAgICAgICAiUEFUSCI6ICIvdXNyL2xvY2FsL3NiaW46L3Vzci9sb2NhbC9iaW46L3Vzci9zYmluOi91c3IvYmluOi9zYmluOi9iaW4iCiAgICAgIH0KICAgIH0KICBdLAogICJjb21tb24iOiB7CiAgICAiY3BhdGgiOiAiL3J1bi9rYXRhLWNvbnRhaW5lcnMvc2hhcmVkL2NvbnRhaW5lcnMiLAogICAgIm1vdW50X3NvdXJjZV9jcGF0aCI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zaGFyZWQvY29udGFpbmVycyIsCiAgICAic2ZwcmVmaXgiOiAiXiQoY3BhdGgpLyQoYnVuZGxlLWlkKS1bYS16MC05XXsxNn0tIiwKICAgICJzcGF0aCI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L3N0b3JhZ2UiLAogICAgImlwdjRfYSI6ICIoKFswLTldfFsxLTldWzAtOV18MVswLTldezJ9fDJbMC00XVswLTldfDI1WzAtNV0pXFwuKXszfShbMC05XXxbMS05XVswLTldfDFbMC05XXsyfXwyWzAtNF1bMC05XXwyNVswLTVdKSIsCiAgICAiaXBfcCI6ICJbMC05XXsxLDV9IiwKICAgICJzdmNfbmFtZSI6ICJbQS1aX1xcLlxcLV0rIiwKICAgICJkbnNfbGFiZWwiOiAiW2EtekEtWjAtOV9cXC5cXC1dKyIsCiAgICAic19zb3VyY2UxIjogIl4uLjJbMC05XXszfV9bMC0xXVswLTldX1swLTNdWzAtOV1fWzAtMl1bMC05XV9bMC01XVswLTldX1swLTVdWzAtOV1cXC5bMC05XXsxLDEwfSQiLAogICAgInNfc291cmNlMiI6ICJeLi5kYXRhLyIsCiAgICAiZG5zX3N1YmRvbWFpbiI6ICJeW2EtejAtOV0oWy1hLXowLTldKlthLXowLTldKT8kIiwKICAgICJwb2RfdWlkIjogIl5bMC05YS1mQS1GXXs4fS1bMC05YS1mQS1GXXs0fS1bMC05YS1mQS1GXXs0fS1bMC05YS1mQS1GXXs0fS1bMC05YS1mQS1GXXsxMn0kIiwKICAgICJkZWZhdWx0X2NhcHMiOiBbCiAgICAgICJDQVBfQ0hPV04iLAogICAgICAiQ0FQX0RBQ19PVkVSUklERSIsCiAgICAgICJDQVBfRlNFVElEIiwKICAgICAgIkNBUF9GT1dORVIiLAogICAgICAiQ0FQX01LTk9EIiwKICAgICAgIkNBUF9ORVRfUkFXIiwKICAgICAgIkNBUF9TRVRHSUQiLAogICAgICAiQ0FQX1NFVFVJRCIsCiAgICAgICJDQVBfU0VURkNBUCIsCiAgICAgICJDQVBfU0VUUENBUCIsCiAgICAgICJDQVBfTkVUX0JJTkRfU0VSVklDRSIsCiAgICAgICJDQVBfU1lTX0NIUk9PVCIsCiAgICAgICJDQVBfS0lMTCIsCiAgICAgICJDQVBfQVVESVRfV1JJVEUiCiAgICBdLAogICAgInByaXZpbGVnZWRfY2FwcyI6IFsKICAgICAgIkNBUF9DSE9XTiIsCiAgICAgICJDQVBfREFDX09WRVJSSURFIiwKICAgICAgIkNBUF9EQUNfUkVBRF9TRUFSQ0giLAogICAgICAiQ0FQX0ZPV05FUiIsCiAgICAgICJDQVBfRlNFVElEIiwKICAgICAgIkNBUF9LSUxMIiwKICAgICAgIkNBUF9TRVRHSUQiLAogICAgICAiQ0FQX1NFVFVJRCIsCiAgICAgICJDQVBfU0VUUENBUCIsCiAgICAgICJDQVBfTElOVVhfSU1NVVRBQkxFIiwKICAgICAgIkNBUF9ORVRfQklORF9TRVJWSUNFIiwKICAgICAgIkNBUF9ORVRfQlJPQURDQVNUIiwKICAgICAgIkNBUF9ORVRfQURNSU4iLAogICAgICAiQ0FQX05FVF9SQVciLAogICAgICAiQ0FQX0lQQ19MT0NLIiwKICAgICAgIkNBUF9JUENfT1dORVIiLAogICAgICAiQ0FQX1NZU19NT0RVTEUiLAogICAgICAiQ0FQX1NZU19SQVdJTyIsCiAgICAgICJDQVBfU1lTX0NIUk9PVCIsCiAgICAgICJDQVBfU1lTX1BUUkFDRSIsCiAgICAgICJDQVBfU1lTX1BBQ0NUIiwKICAgICAgIkNBUF9TWVNfQURNSU4iLAogICAgICAiQ0FQX1NZU19CT09UIiwKICAgICAgIkNBUF9TWVNfTklDRSIsCiAgICAgICJDQVBfU1lTX1JFU09VUkNFIiwKICAgICAgIkNBUF9TWVNfVElNRSIsCiAgICAgICJDQVBfU1lTX1RUWV9DT05GSUciLAogICAgICAiQ0FQX01LTk9EIiwKICAgICAgIkNBUF9MRUFTRSIsCiAgICAgICJDQVBfQVVESVRfV1JJVEUiLAogICAgICAiQ0FQX0FVRElUX0NPTlRST0wiLAogICAgICAiQ0FQX1NFVEZDQVAiLAogICAgICAiQ0FQX01BQ19PVkVSUklERSIsCiAgICAgICJDQVBfTUFDX0FETUlOIiwKICAgICAgIkNBUF9TWVNMT0ciLAogICAgICAiQ0FQX1dBS0VfQUxBUk0iLAogICAgICAiQ0FQX0JMT0NLX1NVU1BFTkQiLAogICAgICAiQ0FQX0FVRElUX1JFQUQiLAogICAgICAiQ0FQX1BFUkZNT04iLAogICAgICAiQ0FQX0JQRiIsCiAgICAgICJDQVBfQ0hFQ0tQT0lOVF9SRVNUT1JFIgogICAgXSwKICAgICJ2aXJ0aW9fYmxrX3N0b3JhZ2VfY2xhc3NlcyI6IFsKICAgICAgImNjLWxvY2FsLWNzaSIsCiAgICAgICJjYy1tYW5hZ2VkLWNzaSIsCiAgICAgICJjYy1tYW5hZ2VkLXByZW1pdW0tY3NpIgogICAgXSwKICAgICJzbWJfc3RvcmFnZV9jbGFzc2VzIjogWwogICAgICB7CiAgICAgICAgIm5hbWUiOiAiYXp1cmVmaWxlLWNzaS1rYXRhLWNjIiwKICAgICAgICAibW91bnRfb3B0aW9ucyI6IFsKICAgICAgICAgICJkaXJfbW9kZT0wNzc3IiwKICAgICAgICAgICJmaWxlX21vZGU9MDc3NyIsCiAgICAgICAgICAibWZzeW1saW5rcyIsCiAgICAgICAgICAiY2FjaGU9c3RyaWN0IiwKICAgICAgICAgICJub3NoYXJlc29jayIsCiAgICAgICAgICAiYWN0aW1lbz0zMCIsCiAgICAgICAgICAibm9icmwiCiAgICAgICAgXQogICAgICB9CiAgICBdCiAgfSwKICAic2FuZGJveCI6IHsKICAgICJzdG9yYWdlcyI6IFsKICAgICAgewogICAgICAgICJkcml2ZXIiOiAiZXBoZW1lcmFsIiwKICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAic291cmNlIjogInNobSIsCiAgICAgICAgImZzdHlwZSI6ICJ0bXBmcyIsCiAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgIm5vZGV2IiwKICAgICAgICAgICJtb2RlPTE3NzciLAogICAgICAgICAgInNpemU9NjcxMDg4NjQiCiAgICAgICAgXSwKICAgICAgICAibW91bnRfcG9pbnQiOiAiL3J1bi9rYXRhLWNvbnRhaW5lcnMvc2FuZGJveC9zaG0iLAogICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgfQogICAgXQogIH0sCiAgInJlcXVlc3RfZGVmYXVsdHMiOiB7CiAgICAiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdCI6IHsKICAgICAgImFsbG93X2Vudl9yZWdleCI6IFsKICAgICAgICAiXkhPU1ROQU1FPSQoZG5zX2xhYmVsKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfUE9SVF8kKGlwX3ApX1RDUD10Y3A6Ly8kKGlwdjRfYSk6JChpcF9wKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfUE9SVF8kKGlwX3ApX1RDUF9QUk9UTz10Y3AkIiwKICAgICAgICAiXiQoc3ZjX25hbWUpX1BPUlRfJChpcF9wKV9UQ1BfUE9SVD0kKGlwX3ApJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9QT1JUXyQoaXBfcClfVENQX0FERFI9JChpcHY0X2EpJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9TRVJWSUNFX0hPU1Q9JChpcHY0X2EpJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9TRVJWSUNFX1BPUlQ9JChpcF9wKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfU0VSVklDRV9QT1JUXyQoZG5zX2xhYmVsKT0kKGlwX3ApJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9QT1JUPXRjcDovLyQoaXB2NF9hKTokKGlwX3ApJCIsCiAgICAgICAgIl5BWlVSRV9DTElFTlRfSUQ9W0EtRmEtZjAtOS1dKiQiLAogICAgICAgICJeQVpVUkVfVEVOQU5UX0lEPVtBLUZhLWYwLTktXSokIiwKICAgICAgICAiXkFaVVJFX0ZFREVSQVRFRF9UT0tFTl9GSUxFPS92YXIvcnVuL3NlY3JldHMvYXp1cmUvdG9rZW5zL2F6dXJlLWlkZW50aXR5LXRva2VuJCIsCiAgICAgICAgIl5BWlVSRV9BVVRIT1JJVFlfSE9TVD1odHRwczovL2xvZ2luXFwubWljcm9zb2Z0b25saW5lXFwuY29tLyQiLAogICAgICAgICJeVEVSTT14dGVybSQiCiAgICAgIF0sCiAgICAgICJhbGxvd19lbnZfcmVnZXhfbWFwIjogewogICAgICAgICJDUFVfTElNSVQiOiAiXlswLTldKyQiLAogICAgICAgICJKT0JfQ09NUExFVElPTl9JTkRFWCI6ICJeWzAtOV0qJCIsCiAgICAgICAgIk1FTU9SWV9MSU1JVCI6ICJeWzAtOV0rJCIKICAgICAgfQogICAgfSwKICAgICJDb3B5RmlsZVJlcXVlc3QiOiBbCiAgICAgICIkKHNmcHJlZml4KSIKICAgIF0sCiAgICAiRXhlY1Byb2Nlc3NSZXF1ZXN0IjogewogICAgICAiYWxsb3dlZF9jb21tYW5kcyI6IFtdLAogICAgICAicmVnZXgiOiBbXQogICAgfSwKICAgICJVcGRhdGVSb3V0ZXNSZXF1ZXN0IjogewogICAgICAiZm9yYmlkZGVuX2RldmljZV9uYW1lcyI6IFsKICAgICAgICAibG8iCiAgICAgIF0sCiAgICAgICJmb3JiaWRkZW5fc291cmNlX3JlZ2V4IjogWwogICAgICAgICJeKD86MHswLDR9Oil7MCw3fTB7MCwzfTEkIiwKICAgICAgICAiXjEyN1xcLig/OlswLTldezEsM31cXC4pezJ9WzAtOV17MSwzfSQiCiAgICAgIF0KICAgIH0sCiAgICAiVXBkYXRlSW50ZXJmYWNlUmVxdWVzdCI6IHsKICAgICAgImFsbG93X3Jhd19mbGFncyI6IDEyOCwKICAgICAgImZvcmJpZGRlbl9uYW1lcyI6IFsKICAgICAgICAibG8iCiAgICAgIF0sCiAgICAgICJmb3JiaWRkZW5faHdfYWRkcnMiOiBbCiAgICAgICAgIjAwOjAwOjAwOjAwOjAwOjAwIgogICAgICBdCiAgICB9LAogICAgIkNsb3NlU3RkaW5SZXF1ZXN0IjogZmFsc2UsCiAgICAiUmVhZFN0cmVhbVJlcXVlc3QiOiBmYWxzZSwKICAgICJVcGRhdGVFcGhlbWVyYWxNb3VudHNSZXF1ZXN0IjogZmFsc2UsCiAgICAiV3JpdGVTdHJlYW1SZXF1ZXN0IjogZmFsc2UKICB9Cn0= + spec: + runtimeClassName: kata-cc + containers: + - name: echoheaders + image: "registry.k8s.io/e2e-test-images/agnhost:2.40" + command: + - /agnhost + - netexec + - "--http-port=8443" + - "--tls-cert-file=/localhost.crt" + - "--tls-private-key-file=/localhost.key" + ports: + - containerPort: 8443 diff --git a/src/agent/samples/policy/yaml/kubernetes/conformance2/ingress-multiple-certs-rc.yaml b/src/agent/samples/policy/yaml/kubernetes/conformance2/ingress-multiple-certs-rc.yaml new file mode 100644 index 000000000000..1adb0fd8519f --- /dev/null +++ b/src/agent/samples/policy/yaml/kubernetes/conformance2/ingress-multiple-certs-rc.yaml @@ -0,0 +1,26 @@ +--- +apiVersion: v1 +kind: ReplicationController +metadata: + name: echoheaders-https +spec: + replicas: 2 + template: + metadata: + labels: + app: echoheaders-https + annotations: + io.katacontainers.config.agent.policy: IyBDb3B5cmlnaHQgKGMpIDIwMjMgTWljcm9zb2Z0IENvcnBvcmF0aW9uCiMKIyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMAojCnBhY2thZ2UgYWdlbnRfcG9saWN5CgppbXBvcnQgZnV0dXJlLmtleXdvcmRzLmluCmltcG9ydCBmdXR1cmUua2V5d29yZHMuZXZlcnkKCiMgRGVmYXVsdCB2YWx1ZXMsIHJldHVybmVkIGJ5IE9QQSB3aGVuIHJ1bGVzIGNhbm5vdCBiZSBldmFsdWF0ZWQgdG8gdHJ1ZS4KZGVmYXVsdCBBZGRBUlBOZWlnaGJvcnNSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgQWRkU3dhcFJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBDbG9zZVN0ZGluUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IENvcHlGaWxlUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IENyZWF0ZUNvbnRhaW5lclJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBDcmVhdGVTYW5kYm94UmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IERlc3Ryb3lTYW5kYm94UmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgRXhlY1Byb2Nlc3NSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgR2V0T09NRXZlbnRSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBHdWVzdERldGFpbHNSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBMaXN0SW50ZXJmYWNlc1JlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBMaXN0Um91dGVzUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IE1lbUhvdHBsdWdCeVByb2JlUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IE9ubGluZUNQVU1lbVJlcXVlc3QgOj0gdHJ1ZQpkZWZhdWx0IFBhdXNlQ29udGFpbmVyUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFJlYWRTdHJlYW1SZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgUmVtb3ZlQ29udGFpbmVyUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgUmVtb3ZlU3RhbGVWaXJ0aW9mc1NoYXJlTW91bnRzUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgUmVzZWVkUmFuZG9tRGV2UmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFJlc3VtZUNvbnRhaW5lclJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBTZXRHdWVzdERhdGVUaW1lUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFNldFBvbGljeVJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBTaWduYWxQcm9jZXNzUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgU3RhcnRDb250YWluZXJSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBTdGFydFRyYWNpbmdSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgU3RhdHNDb250YWluZXJSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBTdG9wVHJhY2luZ1JlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBUdHlXaW5SZXNpemVSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBVcGRhdGVDb250YWluZXJSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgVXBkYXRlRXBoZW1lcmFsTW91bnRzUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFVwZGF0ZUludGVyZmFjZVJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBVcGRhdGVSb3V0ZXNSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgV2FpdFByb2Nlc3NSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBXcml0ZVN0cmVhbVJlcXVlc3QgOj0gZmFsc2UKCiMgQWxsb3dSZXF1ZXN0c0ZhaWxpbmdQb2xpY3kgOj0gdHJ1ZSBjb25maWd1cmVzIHRoZSBBZ2VudCB0byAqYWxsb3cgYW55CiMgcmVxdWVzdHMgY2F1c2luZyBhIHBvbGljeSBmYWlsdXJlKi4gVGhpcyBpcyBhbiB1bnNlY3VyZSBjb25maWd1cmF0aW9uCiMgYnV0IGlzIHVzZWZ1bCBmb3IgYWxsb3dpbmcgdW5zZWN1cmUgcG9kcyB0byBzdGFydCwgdGhlbiBjb25uZWN0IHRvCiMgdGhlbSBhbmQgaW5zcGVjdCBPUEEgbG9ncyBmb3IgdGhlIHJvb3QgY2F1c2Ugb2YgYSBmYWlsdXJlLgpkZWZhdWx0IEFsbG93UmVxdWVzdHNGYWlsaW5nUG9saWN5IDo9IGZhbHNlCgojIENvbnN0YW50cwpTX05BTUVfS0VZID0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZSIKU19OQU1FU1BBQ0VfS0VZID0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZXNwYWNlIgpCVU5ETEVfSUQgPSAiW2EtejAtOV17NjR9IgoKQ3JlYXRlQ29udGFpbmVyUmVxdWVzdDo9IHJlc3AgewogICAgbm90IGlzX251bGwoaW5wdXQuZW52X21hcCkKICAgIAogICAgaV9lbnZfbWFwIDo9IGlucHV0LmVudl9tYXAKICAgIAogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBwX2Vudl9tYXAgOj0gcF9jb250YWluZXIuZW52X21hcCAgCiAgICBhbGxvd19lbnZfbWFwKHBfZW52X21hcCwgaV9lbnZfbWFwKQogICAgCiAgICBpX3Byb2Nlc3MgOj0gaW5wdXQuYmFzZS5PQ0kuUHJvY2VzcwogICAgCiAgICBwX3Byb2Nlc3MgOj0gcF9jb250YWluZXIuT0NJLlByb2Nlc3MKICAgIAogICAgYWxsb3dfYXJncyhpX3Byb2Nlc3MsIHBfcHJvY2VzcywgaV9lbnZfbWFwKQoKICAgIHJlc3AgPSBDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uKGlucHV0LmJhc2UpCiAgICBwcmludCgiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdDogdHJ1ZSIpCn0KCmFsbG93X2FyZ3MoaV9wcm9jZXNzLCBwX3Byb2Nlc3MsIGlfZW52X21hcCkgewogICAgaV9hcmdzIDo9IGlfcHJvY2Vzcy5BcmdzCiAgICBwX2FyZ3MgOj0gcF9wcm9jZXNzLkFyZ3MKICAgIHByaW50KCJhbGxvd19hcmdzOiBpX2FyZ3MgPSIsIGlfYXJncywgInBfYXJncyA9IiwgcF9hcmdzKQogICAgY291bnQoaV9hcmdzKSA9PSBjb3VudChwX2FyZ3MpCiAgICBldmVyeSBpLCBpX2FyZyBpbiBpX2FyZ3MgewogICAgICAgIHByaW50KCJhbGxvd19hcmdzOiBpX2FyZyA9IiwgaV9hcmcpCiAgICAgICAgcF9hcmdfcmVwbGFjZWQgOj0gcmVwbGFjZV9lbnZfdmFyaWFibGVzKHBfYXJnc1tpXSwgaV9lbnZfbWFwKQogICAgICAgIHByaW50KCJhbGxvd19hcmdzOiBwX2FyZ19yZXBsYWNlZCA9IiwgcF9hcmdfcmVwbGFjZWQpCiAgICAgICAgcF9hcmdfcmVwbGFjZWQyIDo9IHJlcGxhY2UocF9hcmdfcmVwbGFjZWQsICIkJCIsICIkIikKICAgICAgICBwcmludCgiYWxsb3dfYXJnczogcF9hcmdfcmVwbGFjZWQyID0iLCBwX2FyZ19yZXBsYWNlZDIpCiAgICAgICAgaV9hcmcgPT0gcF9hcmdfcmVwbGFjZWQyCiAgICB9CiAgICBwcmludCgiYWxsb3dfYXJnczogdHJ1ZSIpCn0KCmFsbG93X2FyZ3MoaV9wcm9jZXNzLCBwX3Byb2Nlc3MsIGlfZW52X21hcCkgewogICAgbm90IGlfcHJvY2Vzcy5BcmdzCiAgICBub3QgcF9wcm9jZXNzLkFyZ3MKICAgIHByaW50KCJhbGxvd19hcmdzMjogbm8gYXJncyIpCn0KCiMgdGhpcyBmdW5jdGlvbiByZXBsYWNlcyBhbGwgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyBpbiBhIHN0cmluZywgZ2l2ZW4gYSBtYXAgb2YgZW52aXJvbm1lbnQga2V5cyB0byBlbnZpcm9ubWVudCB2YWx1ZXMKIyBlZyBzdHIgPSAiZWNobyAkKENMVVNURVJfSUQpOyBlY2hvICQoTk9ERV9OQU1FKTsiCiMgZW52X21hcCA9IHsiQ0xVU1RFUl9JRCI6ICJhYmMiLCAiTk9ERV9OQU1FIiA6ICJ4eXoifQojIHJlc3VsdCA9ICJlY2hvIGFiYzsgZWNobyB4eXo7IgpyZXBsYWNlX2Vudl92YXJpYWJsZXMoc3RyLCBlbnZfbWFwKSA9IHJlc3VsdCB7CiAgICAjIG1ha2UgYW4gYXJyYXkgb2YgdGhlIGtleXMgZWcgWyJDTFVTVEVSX0lEIiwgIk5PREVfTkFNRSJdCiAgICBrZXlzIDo9IFt4IHwgc29tZSB4IGluIG9iamVjdC5rZXlzKGVudl9tYXApXQogICAgcmVzdWx0IDo9IHJlcGxhY2Vfc3RyX3JlYyhzdHIsIGVudl9tYXAsIGtleXMsIGNvdW50KGtleXMpIC0gMSkKfQoKIyBiYXNlIGNhc2UKcmVwbGFjZV9zdHJfcmVjKHN0ciwgZW52X21hcCwgYXJyX2tleXMsIGkpID0gcmVzdWx0IHsKICAgIGkgPCAwCiAgICByZXN1bHQgOj0gc3RyCn0KCiMgcmVjdXJzaXZlIHN0ZXAKcmVwbGFjZV9zdHJfcmVjKHN0ciwgZW52X21hcCwgYXJyX2tleXMsIGkpID0gcmVzdWx0IHsKICAgIGkgPj0gMAogICAga2V5IDo9IGFycl9rZXlzW2ldCiAgICBlbnZfa2V5MSA6PSBjb25jYXQoIiIsIFsiJCgiLCBrZXksICIpIl0pCiAgICAjIHJlcGxhY2UgJChWQVIpIHdpdGggdmFsdWUKICAgIG5ld19zdHIxIDo9IHJlcGxhY2Uoc3RyLCBlbnZfa2V5MSwgZW52X21hcFtrZXldKQogICAgIyByZXBsYWNlIG5leHQgZW52aXJvbm1lbnQgdmFyaWFibGUKICAgIHJlc3VsdCA9IHJlcGxhY2Vfc3RyX3JlYyhuZXdfc3RyMSwgZW52X21hcCwgYXJyX2tleXMsIGkgLSAxKQp9CgphbGxvd19lbnZfbWFwKHBfZW52X21hcCwgaV9lbnZfbWFwKSB7CiAgICBwcmludCgiYWxsb3dfZW52X21hcDogcF9lbnZfbWFwID0iLCBwX2Vudl9tYXApCiAgICBldmVyeSBlbnZfa2V5LCBlbnZfdmFsIGluIGlfZW52X21hcCB7CiAgICAgICAgcHJpbnQoImFsbG93X2VudjogZW52X2tleSA9IiwgZW52X2tleSwgImVudl92YWwgPSIsIGVudl92YWwpCiAgICAgICAgYWxsb3dfZW52X21hcF9lbnRyeShlbnZfa2V5LCBlbnZfdmFsLCBwX2Vudl9tYXApCiAgICB9CiAgICBwcmludCgiYWxsb3dfZW52X21hcDogdHJ1ZSIpCn0KCiMgQWxsb3cgZXhhY3QgbWF0Y2gKYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBpX3ZhbCA9PSBwX3ZhbAogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnk6IHRydWUiKQp9CgojIEFsbG93IHJlc291cmNlRmllbGRSZWYgdmFsdWVzIChlLmcuLCAibGltaXRzLmNwdSIpLgphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgICMgYSB2YXJpYWJsZSB3ZSBzaG91bGQgYmUgdmFsaWRhdGluZyB1c2luZyBhIHJlZ2V4IGZyb20gc2V0dGluZ3MKICAgIHBfdmFsID09ICIkKHZhbGlkYXRlLWZyb20tc2V0dGluZ3MpIgogICAgcmVnZXhfdmFsIDo9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuQ3JlYXRlQ29udGFpbmVyUmVxdWVzdC5hbGxvd19lbnZfcmVnZXhfbWFwW2tleV0KICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4X3ZhbCwgaV92YWwpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSAyOiB0cnVlIikKfQoKIyBBbGxvdyBub2RlLW5hbWUKYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChub2RlLW5hbWUpIgogICAgcmVnZXgubWF0Y2gocG9saWN5X2RhdGEuY29tbW9uLmRuc19zdWJkb21haW4gLCBpX3ZhbCkKICAgIHByaW50KCJhbGxvd19lbnZfbWFwX2VudHJ5IDM6IHRydWUiKQp9CgojIEFsbG93IGhvc3QtbmFtZQphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgIHBfdmFsID09ICIkKGhvc3QtbmFtZSkiCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24uZG5zX2xhYmVsICwgaV92YWwpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSA0OiB0cnVlIikKfQoKIyBBbGxvdyBwb2QtdWlkCmFsbG93X2Vudl9tYXBfZW50cnkoa2V5LCBpX3ZhbCwgcF9lbnZfbWFwKSB7CiAgICBwX3ZhbCA6PSBwX2Vudl9tYXBba2V5XQogICAgcF92YWwgPT0gIiQocG9kLXVpZCkiCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24ucG9kX3VpZCAsIGlfdmFsKQogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgNTogdHJ1ZSIpCn0KCiMgQWxsb3cgZmllbGRSZWYgImZpZWxkUGF0aDogc3RhdHVzLnBvZElQIiB2YWx1ZXMuCmFsbG93X2Vudl9tYXBfZW50cnkoa2V5LCBpX3ZhbCwgcF9lbnZfbWFwKSB7CiAgICBpc19pcChpX3ZhbCkKCiAgICBwX3ZhbCA6PSBwX2Vudl9tYXBba2V5XQogICAgcF92YXIgOj0gY29uY2F0KCI9IiwgW2tleSwgcF92YWxdKQogICAgYWxsb3dfcG9kX2lwX3ZhcihrZXksIHBfdmFyKQogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgNjogdHJ1ZSIpCn0KCiMgQWxsb3cgZmllbGRSZWYgImZpZWxkUGF0aDogc3RhdHVzLmhvc3RJUCIgdmFsdWVzLgphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgaXNfaXAoaV92YWwpCgogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgIHBfdmFyIDo9IGNvbmNhdCgiPSIsIFtrZXksIHBfdmFsXSkKICAgIGFsbG93X2hvc3RfaXBfdmFyKGtleSwgcF92YXIpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSA3OiB0cnVlIikKfQoKIyBNYXRjaCBpbnB1dCB3aXRoIG9uZSBvZiB0aGUgcG9saWN5IHZhcmlhYmxlcywgYWZ0ZXIgc3Vic3RpdHV0aW5nICQoc2FuZGJveC1uYW1lKS4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChzYW5kYm94LW5hbWUpIgogICAgc19uYW1lIDo9IGlucHV0LmJhc2UuT0NJLkFubm90YXRpb25zW1NfTkFNRV9LRVldCiAgICBwX3ZhcjIgOj0gcmVwbGFjZShwX3ZhbCwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHBfdmFyMiA9PSBpX3ZhbAogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgODogdHJ1ZSIpCn0KCiMgTWF0Y2ggaW5wdXQgd2l0aCBvbmUgb2YgdGhlIHBvbGljeSB2YXJpYWJsZXMsIGFmdGVyIHN1YnN0aXR1dGluZyAkKHNhbmRib3gtbmFtZXNwYWNlKS4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChzYW5kYm94LW5hbWVzcGFjZSkiCiAgICBzX25hbWVzcGFjZSA6PSBpbnB1dC5iYXNlLk9DSS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwX3ZhcjIgOj0gcmVwbGFjZShwX3ZhbCwgIiQoc2FuZGJveC1uYW1lc3BhY2UpIiwgc19uYW1lc3BhY2UpCiAgICBwX3ZhcjIgPT0gaV92YWwKICAgIHByaW50KCJhbGxvd19lbnZfbWFwX2VudHJ5IDk6IHRydWUiKQp9CgojIEFsbG93IGlucHV0IGVudiB2YXJpYWJsZXMgdGhhdCBtYXRjaCB3aXRoIGEgcmVxdWVzdF9kZWZhdWx0cyByZWdleC4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHNvbWUgcF9yZWdleDEgaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5DcmVhdGVDb250YWluZXJSZXF1ZXN0LmFsbG93X2Vudl9yZWdleAogICAgcF9yZWdleDIgOj0gcmVwbGFjZShwX3JlZ2V4MSwgIiQoaXB2NF9hKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcHY0X2EpCiAgICBwX3JlZ2V4MyA6PSByZXBsYWNlKHBfcmVnZXgyLCAiJChpcF9wKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcF9wKQogICAgcF9yZWdleDQgOj0gcmVwbGFjZShwX3JlZ2V4MywgIiQoc3ZjX25hbWUpIiwgcG9saWN5X2RhdGEuY29tbW9uLnN2Y19uYW1lKQogICAgcF9yZWdleDUgOj0gcmVwbGFjZShwX3JlZ2V4NCwgIiQoZG5zX2xhYmVsKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5kbnNfbGFiZWwpCgogICAgcmVzdWx0IDo9IGNvbmNhdCgiPSIsIFtrZXksIGlfdmFsXSkKICAgIHJlZ2V4Lm1hdGNoKHBfcmVnZXg1LCByZXN1bHQpCgogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgMTA6IHRydWUiKQp9CgpDcmVhdGVDb250YWluZXJSZXF1ZXN0Oj0gcmVzcCB7CiAgICBub3QgaW5wdXQuZW52X21hcAogICAgaV9wcm9jZXNzID0gaW5wdXQuT0NJLlByb2Nlc3MKICAgIHNfbmFtZSA9IGlucHV0Lk9DSS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBwX3Byb2Nlc3MgPSBwX2NvbnRhaW5lci5PQ0kuUHJvY2VzcwogICAgYWxsb3dfZGVwcmVjYXRlZF9hcmdzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUpCiAgICByZXNwID0gQ3JlYXRlQ29udGFpbmVyUmVxdWVzdENvbW1vbihpbnB1dCkKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0MjogdHJ1ZSIpCn0KCkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb24ocmVxKTo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgICMgQ2hlY2sgaWYgdGhlIGlucHV0IHJlcXVlc3Qgc2hvdWxkIGJlIHJlamVjdGVkIGV2ZW4gYmVmb3JlIGNoZWNraW5nIHRoZQogICAgIyBwb2xpY3lfZGF0YS5jb250YWluZXJzIGluZm9ybWF0aW9uLgogICAgYWxsb3dfY3JlYXRlX2NvbnRhaW5lcl9pbnB1dChyZXEpCgogICAgaV9vY2kgOj0gcmVxLk9DSQogICAgaV9zdG9yYWdlcyA6PSByZXEuc3RvcmFnZXMKICAgIGlfZGV2aWNlcyA6PSByZXEuZGV2aWNlcwoKICAgICMgYXJyYXkgb2YgcG9zc2libGUgc3RhdGUgb3BlcmF0aW9ucwogICAgb3BzX2J1aWxkZXIgOj0gW10KCiAgICAjIGNoZWNrIHNhbmRib3ggbmFtZQogICAgc2FuZGJveF9uYW1lID0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FX0tFWV0KICAgIGFkZF9zYW5kYm94X25hbWVfdG9fc3RhdGUgOj0gc3RhdGVfYWxsb3dzKCJzYW5kYm94X25hbWUiLCBzYW5kYm94X25hbWUpCiAgICBvcHNfYnVpbGRlcjEgOj0gY29uY2F0X29wX2lmX25vdF9udWxsKG9wc19idWlsZGVyLCBhZGRfc2FuZGJveF9uYW1lX3RvX3N0YXRlKQoKICAgICMgQ2hlY2sgaWYgYW55IGVsZW1lbnQgZnJvbSB0aGUgcG9saWN5X2RhdGEuY29udGFpbmVycyBhcnJheSBhbGxvd3MgdGhlIGlucHV0IHJlcXVlc3QuCiAgICBzb21lIHBfY29udGFpbmVyIGluIHBvbGljeV9kYXRhLmNvbnRhaW5lcnMKICAgIHByaW50KCI9PT09PT09PSBDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiB0cnlpbmcgbmV4dCBwb2xpY3kgY29udGFpbmVyIikKCiAgICBwX3BpZG5zIDo9IHBfY29udGFpbmVyLnNhbmRib3hfcGlkbnMKICAgIGlfcGlkbnMgOj0gcmVxLnNhbmRib3hfcGlkbnMKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiBwX3BpZG5zID0iLCBwX3BpZG5zLCAiaV9waWRucyA9IiwgaV9waWRucykKICAgIHBfcGlkbnMgPT0gaV9waWRucwoKICAgIHBfb2NpIDo9IHBfY29udGFpbmVyLk9DSQoKICAgICMgY2hlY2sgbmFtZXNwYWNlCiAgICBwX25hbWVzcGFjZSA6PSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBpX25hbWVzcGFjZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwcmludCAoIkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb246IHBfbmFtZXNwYWNlID0iLCBwX25hbWVzcGFjZSwgImlfbmFtZXNwYWNlID0iLCBpX25hbWVzcGFjZSkKICAgIGFkZF9uYW1lc3BhY2VfdG9fc3RhdGUgOj0gYWxsb3dfbmFtZXNwYWNlKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkKICAgIG9wc19idWlsZGVyMiA6PSBjb25jYXRfb3BfaWZfbm90X251bGwob3BzX2J1aWxkZXIxLCBhZGRfbmFtZXNwYWNlX3RvX3N0YXRlKQoKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiBwIFZlcnNpb24gPSIsIHBfb2NpLlZlcnNpb24sICJpIFZlcnNpb24gPSIsIGlfb2NpLlZlcnNpb24pCiAgICBwX29jaS5WZXJzaW9uID09IGlfb2NpLlZlcnNpb24KCiAgICBwcmludCgiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdENvbW1vbjogcCBSZWFkb25seSA9IiwgcF9vY2kuUm9vdC5SZWFkb25seSwgImkgUmVhZG9ubHkgPSIsIGlfb2NpLlJvb3QuUmVhZG9ubHkpCiAgICBwX29jaS5Sb290LlJlYWRvbmx5ID09IGlfb2NpLlJvb3QuUmVhZG9ubHkKCiAgICBhbGxvd19hbm5vKHBfb2NpLCBpX29jaSkKCiAgICBwX3N0b3JhZ2VzIDo9IHBfY29udGFpbmVyLnN0b3JhZ2VzCiAgICBhbGxvd19ieV9hbm5vKHBfb2NpLCBpX29jaSwgcF9zdG9yYWdlcywgaV9zdG9yYWdlcykKCiAgICBwX2RldmljZXMgOj0gcF9jb250YWluZXIuZGV2aWNlcwogICAgYWxsb3dfZGV2aWNlcyhwX2RldmljZXMsIGlfZGV2aWNlcykKCiAgICByZXQgOj0gYWxsb3dfbGludXgob3BzX2J1aWxkZXIyLCBwX29jaSwgaV9vY2kpCiAgICByZXQuYWxsb3dlZAoKICAgIG9wcyA6PSByZXQub3BzCgogICAgcHJpbnQoIkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb246IHRydWUiKQp9CgphbGxvd19jcmVhdGVfY29udGFpbmVyX2lucHV0KHJlcSkgewogICAgcHJpbnQoImFsbG93X2NyZWF0ZV9jb250YWluZXJfaW5wdXQ6IGlucHV0ID0iLCByZXEpCgogICAgY291bnQocmVxLnNoYXJlZF9tb3VudHMpID09IDAKICAgIGlzX251bGwocmVxLnN0cmluZ191c2VyKQoKICAgIGlfb2NpIDo9IHJlcS5PQ0kKICAgIGlzX251bGwoaV9vY2kuSG9va3MpCiAgICBpc19udWxsKGlfb2NpLlNvbGFyaXMpCiAgICBpc19udWxsKGlfb2NpLldpbmRvd3MpCgogICAgaV9saW51eCA6PSBpX29jaS5MaW51eAogICAgY291bnQoaV9saW51eC5HSURNYXBwaW5ncykgPT0gMAogICAgY291bnQoaV9saW51eC5Nb3VudExhYmVsKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlJlc291cmNlcy5EZXZpY2VzKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlJvb3Rmc1Byb3BhZ2F0aW9uKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlVJRE1hcHBpbmdzKSA9PSAwCiAgICBpc19udWxsKGlfbGludXguSW50ZWxSZHQpCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLkJsb2NrSU8pCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLk5ldHdvcmspCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLlBpZHMpCiAgICBpc19udWxsKGlfbGludXguU2VjY29tcCkKCiAgICBpX3Byb2Nlc3MgOj0gaV9vY2kuUHJvY2VzcwogICAgY291bnQoaV9wcm9jZXNzLlNlbGludXhMYWJlbCkgPT0gMAogICAgY291bnQoaV9wcm9jZXNzLlVzZXIuVXNlcm5hbWUpID09IDAKCiAgICBwcmludCgiYWxsb3dfY3JlYXRlX2NvbnRhaW5lcl9pbnB1dDogdHJ1ZSIpCn0KCmFsbG93X25hbWVzcGFjZShwX25hbWVzcGFjZSwgaV9uYW1lc3BhY2UpID0gYWRkX25hbWVzcGFjZSB7CiAgICBwX25hbWVzcGFjZSA9PSBpX25hbWVzcGFjZQogICAgYWRkX25hbWVzcGFjZSA6PSBudWxsCiAgICBwcmludCgiYWxsb3dfbmFtZXNwYWNlIDE6IGlucHV0IG5hbWVzcGFjZSBtYXRjaGVzIHBvbGljeSBkYXRhIikKfQoKYWxsb3dfbmFtZXNwYWNlKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkgPSBhZGRfbmFtZXNwYWNlIHsKICAgIHBfbmFtZXNwYWNlID09ICIiCiAgICBwcmludCgiYWxsb3dfbmFtZXNwYWNlIDI6IG5vIG5hbWVzcGFjZSBmb3VuZCBvbiBwb2xpY3kgZGF0YSIpCiAgICBhZGRfbmFtZXNwYWNlIDo9IHN0YXRlX2FsbG93cygibmFtZXNwYWNlIiwgaV9uYW1lc3BhY2UpCn0KCiMgdmFsdWUgaGFzbid0IGJlZW4gc2VlbiBiZWZvcmUsIHNhdmUgaXQgdG8gc3RhdGUKc3RhdGVfYWxsb3dzKGtleSwgdmFsdWUpID0gYWN0aW9uIHsKICBzdGF0ZSA6PSBnZXRfc3RhdGUoKQogIHByaW50KCJzdGF0ZV9hbGxvd3MgMTogc3RhdGVba2V5XSA9Iiwgc3RhdGVba2V5XSwgInZhbHVlID0iLCB2YWx1ZSkKICBub3Qgc3RhdGVba2V5XQogIHByaW50KCJzdGF0ZV9hbGxvd3MgMTogc2F2aW5nIHRvIHN0YXRlIGtleSA9Iiwga2V5LCAidmFsdWUgPSIsIHZhbHVlKQogIHBhdGggOj0gZ2V0X3N0YXRlX3BhdGgoa2V5KSAKICBhY3Rpb24gOj0gewogICAgIm9wIjogImFkZCIsCiAgICAicGF0aCI6IHBhdGgsIAogICAgInZhbHVlIjogdmFsdWUsCiAgfQp9CgojIHZhbHVlIG1hdGNoZXMgd2hhdCdzIGluIHN0YXRlLCBhbGxvdyBpdApzdGF0ZV9hbGxvd3Moa2V5LCB2YWx1ZSkgPSBhY3Rpb24gewogIHByaW50KCJzdGF0ZV9hbGxvd3MgMjogc3RhcnQiKQogIHN0YXRlIDo9IGdldF9zdGF0ZSgpCiAgcHJpbnQoInN0YXRlX2FsbG93cyAyOiBzdGF0ZVtrZXldID0iLCBzdGF0ZVtrZXldLCAidmFsdWUgPSIsIHZhbHVlKQogIHZhbHVlID09IHN0YXRlW2tleV0KICBwcmludCgic3RhdGVfYWxsb3dzIDI6IGZvdW5kIGtleSA9Iiwga2V5LCAidmFsdWUgPSIsIHZhbHVlLCAiIGluIHN0YXRlIikKICBhY3Rpb24gOj0gbnVsbAp9CgojIGhlbHBlciBmdW5jdGlvbnMgdG8gaW50ZXJhY3Qgd2l0aCB0aGUgc3RhdGUKZ2V0X3N0YXRlKCkgPSBzdGF0ZSB7CiAgc3RhdGUgOj0gZGF0YVsicHN0YXRlIl0KfQoKZ2V0X3N0YXRlX3ZhbChrZXkpID0gdmFsdWUgewogICAgc3RhdGUgOj0gZ2V0X3N0YXRlKCkKICAgIHZhbHVlIDo9IHN0YXRlW2tleV0KfQoKZ2V0X3N0YXRlX3BhdGgoa2V5KSA9IHBhdGggewogICAgIyBwcmVwZW5kICIvcHN0YXRlLyIgdG8ga2V5CiAgICBwYXRoIDo9IGNvbmNhdCgiLyIsIFsiL3BzdGF0ZSIsIGtleV0pCn0KCiMgSGVscGVyIGZ1bmN0aW9ucyB0byBjb25kaXRpb25hbGx5IGNvbmNhdGVuYXRlIG9wIGlzIG5vdCBudWxsCmNvbmNhdF9vcF9pZl9ub3RfbnVsbChvcHMsIG9wKSA9IHJlc3VsdCB7CiAgICBvcCA9PSBudWxsCiAgICByZXN1bHQgOj0gb3BzCn0KCmNvbmNhdF9vcF9pZl9ub3RfbnVsbChvcHMsIG9wKSA9IHJlc3VsdCB7CiAgICBvcCAhPSBudWxsCiAgICByZXN1bHQgOj0gYXJyYXkuY29uY2F0KG9wcywgW29wXSkKfQoKIyBSZWplY3QgdW5leHBlY3RlZCBhbm5vdGF0aW9ucy4KYWxsb3dfYW5ubyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19hbm5vIDE6IHN0YXJ0IikKCiAgICBub3QgaV9vY2kuQW5ub3RhdGlvbnMKCiAgICBwcmludCgiYWxsb3dfYW5ubyAxOiB0cnVlIikKfQphbGxvd19hbm5vKHBfb2NpLCBpX29jaSkgewogICAgcHJpbnQoImFsbG93X2Fubm8gMjogcCBBbm5vdGF0aW9ucyA9IiwgcF9vY2kuQW5ub3RhdGlvbnMpCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiBpIEFubm90YXRpb25zID0iLCBpX29jaS5Bbm5vdGF0aW9ucykKCiAgICBpX2tleXMgOj0gb2JqZWN0LmtleXMoaV9vY2kuQW5ub3RhdGlvbnMpCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiBpIGtleXMgPSIsIGlfa2V5cykKCiAgICBldmVyeSBpX2tleSBpbiBpX2tleXMgewogICAgICAgIGFsbG93X2Fubm9fa2V5KGlfa2V5LCBwX29jaSkKICAgIH0KCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiB0cnVlIikKfQoKYWxsb3dfYW5ub19rZXkoaV9rZXksIHBfb2NpKSB7CiAgICBwcmludCgiYWxsb3dfYW5ub19rZXkgMTogaSBrZXkgPSIsIGlfa2V5KQoKICAgIHN0YXJ0c3dpdGgoaV9rZXksICJpby5rdWJlcm5ldGVzLmNyaS4iKQoKICAgIHByaW50KCJhbGxvd19hbm5vX2tleSAxOiB0cnVlIikKfQphbGxvd19hbm5vX2tleShpX2tleSwgcF9vY2kpIHsKICAgIHByaW50KCJhbGxvd19hbm5vX2tleSAyOiBpIGtleSA9IiwgaV9rZXkpCgogICAgc29tZSBwX2tleSwgXyBpbiBwX29jaS5Bbm5vdGF0aW9ucwogICAgcF9rZXkgPT0gaV9rZXkKCiAgICBwcmludCgiYWxsb3dfYW5ub19rZXkgMjogdHJ1ZSIpCn0KCiMgR2V0IHRoZSB2YWx1ZSBvZiB0aGUgU19OQU1FX0tFWSBhbm5vdGF0aW9uIGFuZAojIGNvcnJlbGF0ZSBpdCB3aXRoIG90aGVyIGFubm90YXRpb25zIGFuZCBwcm9jZXNzIGZpZWxkcy4KYWxsb3dfYnlfYW5ubyhwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpIHsKICAgIHByaW50KCJhbGxvd19ieV9hbm5vIDE6IHN0YXJ0IikKCiAgICBub3QgcF9vY2kuQW5ub3RhdGlvbnNbU19OQU1FX0tFWV0KCiAgICBpX3NfbmFtZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMTogaV9zX25hbWUgPSIsIGlfc19uYW1lKQoKICAgIGlfc19uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FU1BBQ0VfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMTogaV9zX25hbWVzcGFjZSA9IiwgaV9zX25hbWVzcGFjZSkKCiAgICBhbGxvd19ieV9zYW5kYm94X25hbWUocF9vY2ksIGlfb2NpLCBwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBpX3NfbmFtZSwgaV9zX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfYnlfYW5ubyAxOiB0cnVlIikKfQphbGxvd19ieV9hbm5vKHBfb2NpLCBpX29jaSwgcF9zdG9yYWdlcywgaV9zdG9yYWdlcykgewogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMjogc3RhcnQiKQoKICAgIHBfc19uYW1lIDo9IHBfb2NpLkFubm90YXRpb25zW1NfTkFNRV9LRVldCiAgICBpX3NfbmFtZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMjogaV9zX25hbWUgPSIsIGlfc19uYW1lLCAicF9zX25hbWUgPSIsIHBfc19uYW1lKQoKICAgIGFsbG93X3NhbmRib3hfbmFtZShwX3NfbmFtZSwgaV9zX25hbWUpCgogICAgaV9zX25hbWVzcGFjZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwcmludCgiYWxsb3dfYnlfYW5ubyAyOiBpX3NfbmFtZXNwYWNlID0iLCBpX3NfbmFtZXNwYWNlKQoKICAgIGFsbG93X2J5X3NhbmRib3hfbmFtZShwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMsIGlfc19uYW1lLCBpX3NfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd19ieV9hbm5vIDI6IHRydWUiKQp9CgphbGxvd19ieV9zYW5kYm94X25hbWUocF9vY2ksIGlfb2NpLCBwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfYnlfc2FuZGJveF9uYW1lOiBzdGFydCIpCgogICAgaV9uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FU1BBQ0VfS0VZXQoKICAgIGFsbG93X2J5X2NvbnRhaW5lcl90eXBlcyhwX29jaSwgaV9vY2ksIHNfbmFtZSwgaV9uYW1lc3BhY2UpCiAgICBhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZChwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpCiAgICBhbGxvd19wcm9jZXNzKHBfb2NpLlByb2Nlc3MsIGlfb2NpLlByb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpCgogICAgcHJpbnQoImFsbG93X2J5X3NhbmRib3hfbmFtZTogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfbmFtZShwX3NfbmFtZSwgaV9zX25hbWUpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X25hbWU6IHN0YXJ0IikKICAgIHJlZ2V4Lm1hdGNoKHBfc19uYW1lLCBpX3NfbmFtZSkKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9uYW1lOiB0cnVlIikKfQoKIyBDaGVjayB0aGF0IHRoZSAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLXR5cGUiIGFuZAojICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIiBhbm5vdGF0aW9ucyBkZXNpZ25hdGUgdGhlCiMgZXhwZWN0ZWQgdHlwZSAtIGVpdGhlciBhICJzYW5kYm94IiBvciBhICJjb250YWluZXIiLiBUaGVuLCB2YWxpZGF0ZQojIG90aGVyIGFubm90YXRpb25zIGJhc2VkIG9uIHRoZSBhY3R1YWwgInNhbmRib3giIG9yICJjb250YWluZXIiIHZhbHVlCiMgZnJvbSB0aGUgaW5wdXQgY29udGFpbmVyLgphbGxvd19ieV9jb250YWluZXJfdHlwZXMocF9vY2ksIGlfb2NpLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfYnlfY29udGFpbmVyX3R5cGVzOiBjaGVja2luZyBpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSIpCgogICAgY190eXBlIDo9ICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSIKICAgIAogICAgcF9jcmlfdHlwZSA6PSBwX29jaS5Bbm5vdGF0aW9uc1tjX3R5cGVdCiAgICBpX2NyaV90eXBlIDo9IGlfb2NpLkFubm90YXRpb25zW2NfdHlwZV0KICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZXM6IHBfY3JpX3R5cGUgPSIsIHBfY3JpX3R5cGUsICJpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgcF9jcmlfdHlwZSA9PSBpX2NyaV90eXBlCgogICAgYWxsb3dfYnlfY29udGFpbmVyX3R5cGUoaV9jcmlfdHlwZSwgcF9vY2ksIGlfb2NpLCBzX25hbWUsIHNfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZXM6IHRydWUiKQp9CgphbGxvd19ieV9jb250YWluZXJfdHlwZShpX2NyaV90eXBlLCBwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAxOiBpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgaV9jcmlfdHlwZSA9PSAic2FuZGJveCIKCiAgICBpX2thdGFfdHlwZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1siaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5jb250YWluZXJfdHlwZSJdCiAgICBwcmludCgiYWxsb3dfYnlfY29udGFpbmVyX3R5cGUgMTogaV9rYXRhX3R5cGUgPSIsIGlfa2F0YV90eXBlKQogICAgaV9rYXRhX3R5cGUgPT0gInBvZF9zYW5kYm94IgoKICAgIGFsbG93X3NhbmRib3hfY29udGFpbmVyX25hbWUocF9vY2ksIGlfb2NpKQogICAgYWxsb3dfc2FuZGJveF9uZXRfbmFtZXNwYWNlKHBfb2NpLCBpX29jaSkKICAgIGFsbG93X3NhbmRib3hfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpCgogICAgcHJpbnQoImFsbG93X2J5X2NvbnRhaW5lcl90eXBlIDE6IHRydWUiKQp9CgphbGxvd19ieV9jb250YWluZXJfdHlwZShpX2NyaV90eXBlLCBwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiBpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgaV9jcmlfdHlwZSA9PSAiY29udGFpbmVyIgoKICAgIGlfa2F0YV90eXBlIDo9IGlfb2NpLkFubm90YXRpb25zWyJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIl0KICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiBpX2thdGFfdHlwZSA9IiwgaV9rYXRhX3R5cGUpCiAgICBpX2thdGFfdHlwZSA9PSAicG9kX2NvbnRhaW5lciIKCiAgICBhbGxvd19jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpCiAgICBhbGxvd19uZXRfbmFtZXNwYWNlKHBfb2NpLCBpX29jaSkKICAgIGFsbG93X2xvZ19kaXJlY3RvcnkocF9vY2ksIGlfb2NpKQoKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiB0cnVlIikKfQoKIyAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLW5hbWUiIGFubm90YXRpb24KYWxsb3dfc2FuZGJveF9jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X2NvbnRhaW5lcl9uYW1lOiBzdGFydCIpCgogICAgY29udGFpbmVyX2Fubm90YXRpb25fbWlzc2luZyhwX29jaSwgaV9vY2ksICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItbmFtZSIpCgogICAgcHJpbnQoImFsbG93X3NhbmRib3hfY29udGFpbmVyX25hbWU6IHRydWUiKQp9CgphbGxvd19jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19jb250YWluZXJfbmFtZTogc3RhcnQiKQoKICAgIGFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uKHBfb2NpLCBpX29jaSwgImlvLmt1YmVybmV0ZXMuY3JpLmNvbnRhaW5lci1uYW1lIikKCiAgICBwcmludCgiYWxsb3dfY29udGFpbmVyX25hbWU6IHRydWUiKQp9Cgpjb250YWluZXJfYW5ub3RhdGlvbl9taXNzaW5nKHBfb2NpLCBpX29jaSwga2V5KSB7CiAgICBwcmludCgiY29udGFpbmVyX2Fubm90YXRpb25fbWlzc2luZzoiLCBrZXkpCgogICAgbm90IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIG5vdCBpX29jaS5Bbm5vdGF0aW9uc1trZXldCgogICAgcHJpbnQoImNvbnRhaW5lcl9hbm5vdGF0aW9uX21pc3Npbmc6IHRydWUiKQp9CgphbGxvd19jb250YWluZXJfYW5ub3RhdGlvbihwX29jaSwgaV9vY2ksIGtleSkgewogICAgcHJpbnQoImFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uOiBrZXkgPSIsIGtleSkKCiAgICBwX3ZhbHVlIDo9IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIGlfdmFsdWUgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgcHJpbnQoImFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uOiBwX3ZhbHVlID0iLCBwX3ZhbHVlLCAiaV92YWx1ZSA9IiwgaV92YWx1ZSkKCiAgICBwX3ZhbHVlID09IGlfdmFsdWUKCiAgICBwcmludCgiYWxsb3dfY29udGFpbmVyX2Fubm90YXRpb246IHRydWUiKQp9CgojICJuZXJkY3RsL25ldHdvcmstbmFtZXNwYWNlIiBhbm5vdGF0aW9uCmFsbG93X3NhbmRib3hfbmV0X25hbWVzcGFjZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X25ldF9uYW1lc3BhY2U6IHN0YXJ0IikKCiAgICBrZXkgOj0gIm5lcmRjdGwvbmV0d29yay1uYW1lc3BhY2UiCgogICAgcF9uYW1lc3BhY2UgOj0gcF9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgaV9uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgcHJpbnQoImFsbG93X3NhbmRib3hfbmV0X25hbWVzcGFjZTogcF9uYW1lc3BhY2UgPSIsIHBfbmFtZXNwYWNlLCAiaV9uYW1lc3BhY2UgPSIsIGlfbmFtZXNwYWNlKQoKICAgIHJlZ2V4Lm1hdGNoKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9uZXRfbmFtZXNwYWNlOiB0cnVlIikKfQoKYWxsb3dfbmV0X25hbWVzcGFjZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19uZXRfbmFtZXNwYWNlOiBzdGFydCIpCgogICAga2V5IDo9ICJuZXJkY3RsL25ldHdvcmstbmFtZXNwYWNlIgoKICAgIG5vdCBwX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICBub3QgaV9vY2kuQW5ub3RhdGlvbnNba2V5XQoKICAgIHByaW50KCJhbGxvd19uZXRfbmFtZXNwYWNlOiB0cnVlIikKfQoKIyAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1sb2ctZGlyZWN0b3J5IiBhbm5vdGF0aW9uCmFsbG93X3NhbmRib3hfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X2xvZ19kaXJlY3Rvcnk6IHN0YXJ0IikKCiAgICBrZXkgOj0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbG9nLWRpcmVjdG9yeSIKCiAgICBwX2RpciA6PSBwX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICByZWdleDEgOj0gcmVwbGFjZShwX2RpciwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHJlZ2V4MiA6PSByZXBsYWNlKHJlZ2V4MSwgIiQoc2FuZGJveC1uYW1lc3BhY2UpIiwgc19uYW1lc3BhY2UpCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiByZWdleDIgPSIsIHJlZ2V4MikKCiAgICBpX2RpciA6PSBpX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiBpX2RpciA9IiwgaV9kaXIpCgogICAgcmVnZXgubWF0Y2gocmVnZXgyLCBpX2RpcikKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiB0cnVlIikKfQoKYWxsb3dfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19sb2dfZGlyZWN0b3J5OiBzdGFydCIpCgogICAga2V5IDo9ICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWxvZy1kaXJlY3RvcnkiCgogICAgbm90IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIG5vdCBpX29jaS5Bbm5vdGF0aW9uc1trZXldCgogICAgcHJpbnQoImFsbG93X2xvZ19kaXJlY3Rvcnk6IHRydWUiKQp9CgphbGxvd19kZXZpY2VzKHBfZGV2aWNlcywgaV9kZXZpY2VzKSB7CiAgICBwcmludCgiYWxsb3dfZGV2aWNlczogc3RhcnQiKQogICAgZXZlcnkgaV9kZXZpY2UgaW4gaV9kZXZpY2VzIHsKICAgICAgICBwcmludCgiYWxsb3dfZGV2aWNlczogaV9kZXZpY2UgPSIsIGlfZGV2aWNlKQogICAgICAgIHNvbWUgcF9kZXZpY2UgaW4gcF9kZXZpY2VzCiAgICAgICAgcF9kZXZpY2UuY29udGFpbmVyX3BhdGggPT0gaV9kZXZpY2UuY29udGFpbmVyX3BhdGgKICAgIH0KICAgIHByaW50KCJhbGxvd19kZXZpY2VzOiB0cnVlIikKfQoKYWxsb3dfbGludXgoc3RhdGVfb3BzLCBwX29jaSwgaV9vY2kpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIHBfbmFtZXNwYWNlcyA6PSBwX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbGludXg6IHAgbmFtZXNwYWNlcyA9IiwgcF9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlcyA6PSBpX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbGludXg6IGkgbmFtZXNwYWNlcyA9IiwgaV9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlX3dpdGhvdXRfbmV0d29yayA6PSBbb2JqIHwgb2JqIDo9IGlfbmFtZXNwYWNlc1tfXTsgb2JqLlR5cGUgIT0gIm5ldHdvcmsiXQoKICAgIHByaW50KCJhbGxvd19saW51eDogaV9uYW1lc3BhY2Vfd2l0aG91dF9uZXR3b3JrID0iLCBpX25hbWVzcGFjZV93aXRob3V0X25ldHdvcmspCgogICAgcF9uYW1lc3BhY2VzID09IGlfbmFtZXNwYWNlX3dpdGhvdXRfbmV0d29yawoKICAgIGFsbG93X21hc2tlZF9wYXRocyhwX29jaSwgaV9vY2kpCiAgICBhbGxvd19yZWFkb25seV9wYXRocyhwX29jaSwgaV9vY2kpCiAgICBhbGxvd19saW51eF9kZXZpY2VzKHBfb2NpLkxpbnV4LkRldmljZXMsIGlfb2NpLkxpbnV4LkRldmljZXMpCiAgICBhbGxvd19saW51eF9zeXNjdGwocF9vY2kuTGludXgsIGlfb2NpLkxpbnV4KQogICAgcmV0IDo9IGFsbG93X25ldHdvcmtfbmFtZXNwYWNlX3N0YXJ0KHN0YXRlX29wcywgcF9vY2ksIGlfb2NpKQogICAgcmV0LmFsbG93ZWQKCiAgICBvcHMgOj0gcmV0Lm9wcwoKICAgIHByaW50KCJhbGxvd19saW51eDogdHJ1ZSIpCn0KCiMgUmV0cmlldmUgdGhlICJuZXR3b3JrIiBuYW1lc3BhY2UgZnJvbSB0aGUgaW5wdXQgZGF0YSBhbmQgcGFzcyBpdCBvbiBmb3IgdGhlCiMgbmV0d29yayBuYW1lc3BhY2UgcG9saWN5IGNoZWNrcy4KYWxsb3dfbmV0d29ya19uYW1lc3BhY2Vfc3RhcnQoc3RhdGVfb3BzLCBwX29jaSwgaV9vY2kpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIHByaW50KCJhbGxvd19uZXR3b3JrX25hbWVzcGFjZSBzdGFydDogc3RhcnQiKQoKICAgIHBfbmFtZXNwYWNlcyA6PSBwX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IHAgbmFtZXNwYWNlcyA9IiwgcF9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlcyA6PSBpX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IGkgbmFtZXNwYWNlcyA9IiwgaV9uYW1lc3BhY2VzKQoKICAgICMgUmV0dXJuIHBhdGggb2YgdGhlICJuZXR3b3JrIiBuYW1lc3BhY2UKICAgIG5ldHdvcmtfbnMgOj0gW29iaiB8IG9iaiA6PSBpX25hbWVzcGFjZXNbX107IG9iai5UeXBlID09ICJuZXR3b3JrIl0KCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IG5ldHdvcmtfbnMgPSIsIG5ldHdvcmtfbnMpCgogICAgcmV0IDo9IGFsbG93X25ldHdvcmtfbmFtZXNwYWNlKHN0YXRlX29wcywgbmV0d29ya19ucykKICAgIHJldC5hbGxvd2VkCgogICAgb3BzIDo9IHJldC5vcHMKfQoKIyBUaGlzIHJ1bGUgaXMgd2hlbiB0aGVyZSdzIG5vIG5ldHdvcmsgbmFtZXNwYWNlIGluIHRoZSBpbnB1dCBkYXRhLgphbGxvd19uZXR3b3JrX25hbWVzcGFjZShzdGF0ZV9vcHMsIG5ldHdvcmtfbnMpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIGNvdW50KG5ldHdvcmtfbnMpID09IDAKCiAgICBuZXR3b3JrX25zX3BhdGggPSAiIgoKICAgIGFkZF9uZXR3b3JrX25hbWVzcGFjZV90b19zdGF0ZSA6PSBzdGF0ZV9hbGxvd3MoIm5ldHdvcmtfbmFtZXNwYWNlIiwgbmV0d29ya19uc19wYXRoKQogICAgb3BzIDo9IGNvbmNhdF9vcF9pZl9ub3RfbnVsbChzdGF0ZV9vcHMsIGFkZF9uZXR3b3JrX25hbWVzcGFjZV90b19zdGF0ZSkKCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2UgMTogdHJ1ZSIpCn0KCiMgVGhpcyBydWxlIGlzIHdoZW4gdGhlcmUncyBleGFjdGx5IG9uZSBuZXR3b3JrIG5hbWVzcGFjZSBpbiB0aGUgaW5wdXQgZGF0YS4KYWxsb3dfbmV0d29ya19uYW1lc3BhY2Uoc3RhdGVfb3BzLCBuZXR3b3JrX25zKSA6PSB7Im9wcyI6IG9wcywgImFsbG93ZWQiOiB0cnVlfSB7CiAgICBjb3VudChuZXR3b3JrX25zKSA9PSAxCgogICAgYWRkX25ldHdvcmtfbmFtZXNwYWNlX3RvX3N0YXRlIDo9IHN0YXRlX2FsbG93cygibmV0d29ya19uYW1lc3BhY2UiLCBuZXR3b3JrX25zWzBdLlBhdGgpCiAgICBvcHMgOj0gY29uY2F0X29wX2lmX25vdF9udWxsKHN0YXRlX29wcywgYWRkX25ldHdvcmtfbmFtZXNwYWNlX3RvX3N0YXRlKQoKICAgIHByaW50KCJhbGxvd19uZXR3b3JrX25hbWVzcGFjZSAyOiB0cnVlIikKfQoKYWxsb3dfbWFza2VkX3BhdGhzKHBfb2NpLCBpX29jaSkgewogICAgcF9wYXRocyA6PSBwX29jaS5MaW51eC5NYXNrZWRQYXRocwogICAgcHJpbnQoImFsbG93X21hc2tlZF9wYXRocyAxOiBwX3BhdGhzID0iLCBwX3BhdGhzKQoKICAgIGlfcGF0aHMgOj0gaV9vY2kuTGludXguTWFza2VkUGF0aHMKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aHMgMTogaV9wYXRocyA9IiwgaV9wYXRocykKCiAgICBhbGxvd19tYXNrZWRfcGF0aHNfYXJyYXkocF9wYXRocywgaV9wYXRocykKCiAgICBwcmludCgiYWxsb3dfbWFza2VkX3BhdGhzIDE6IHRydWUiKQp9CmFsbG93X21hc2tlZF9wYXRocyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aHMgMjogc3RhcnQiKQoKICAgIG5vdCBwX29jaS5MaW51eC5NYXNrZWRQYXRocwogICAgbm90IGlfb2NpLkxpbnV4Lk1hc2tlZFBhdGhzCgogICAgcHJpbnQoImFsbG93X21hc2tlZF9wYXRocyAyOiB0cnVlIikKfQoKIyBBbGwgdGhlIHBvbGljeSBtYXNrZWQgcGF0aHMgbXVzdCBiZSBtYXNrZWQgaW4gdGhlIGlucHV0IGRhdGEgdG9vLgojIElucHV0IGlzIGFsbG93ZWQgdG8gaGF2ZSBtb3JlIG1hc2tlZCBwYXRocyB0aGFuIHRoZSBwb2xpY3kuCmFsbG93X21hc2tlZF9wYXRoc19hcnJheShwX2FycmF5LCBpX2FycmF5KSB7CiAgICBldmVyeSBwX2VsZW0gaW4gcF9hcnJheSB7CiAgICAgICAgYWxsb3dfbWFza2VkX3BhdGgocF9lbGVtLCBpX2FycmF5KQogICAgfQp9CgphbGxvd19tYXNrZWRfcGF0aChwX2VsZW0sIGlfYXJyYXkpIHsKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aDogcF9lbGVtID0iLCBwX2VsZW0pCgogICAgc29tZSBpX2VsZW0gaW4gaV9hcnJheQogICAgcF9lbGVtID09IGlfZWxlbQoKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aDogdHJ1ZSIpCn0KCmFsbG93X3JlYWRvbmx5X3BhdGhzKHBfb2NpLCBpX29jaSkgewogICAgcF9wYXRocyA6PSBwX29jaS5MaW51eC5SZWFkb25seVBhdGhzCiAgICBwcmludCgiYWxsb3dfcmVhZG9ubHlfcGF0aHMgMTogcF9wYXRocyA9IiwgcF9wYXRocykKCiAgICBpX3BhdGhzIDo9IGlfb2NpLkxpbnV4LlJlYWRvbmx5UGF0aHMKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAxOiBpX3BhdGhzID0iLCBpX3BhdGhzKQoKICAgIGFsbG93X3JlYWRvbmx5X3BhdGhzX2FycmF5KHBfcGF0aHMsIGlfcGF0aHMsIGlfb2NpLkxpbnV4Lk1hc2tlZFBhdGhzKQoKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAxOiB0cnVlIikKfQphbGxvd19yZWFkb25seV9wYXRocyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAyOiBzdGFydCIpCgogICAgbm90IHBfb2NpLkxpbnV4LlJlYWRvbmx5UGF0aHMKICAgIG5vdCBpX29jaS5MaW51eC5SZWFkb25seVBhdGhzCgogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGhzIDI6IHRydWUiKQp9CgojIEFsbCB0aGUgcG9saWN5IHJlYWRvbmx5IHBhdGhzIG11c3QgYmUgZWl0aGVyOgojIC0gUHJlc2VudCBpbiB0aGUgaW5wdXQgcmVhZG9ubHkgcGF0aHMsIG9yCiMgLSBQcmVzZW50IGluIHRoZSBpbnB1dCBtYXNrZWQgcGF0aHMuCiMgSW5wdXQgaXMgYWxsb3dlZCB0byBoYXZlIG1vcmUgcmVhZG9ubHkgcGF0aHMgdGhhbiB0aGUgcG9saWN5LgphbGxvd19yZWFkb25seV9wYXRoc19hcnJheShwX2FycmF5LCBpX2FycmF5LCBtYXNrZWRfcGF0aHMpIHsKICAgIGV2ZXJ5IHBfZWxlbSBpbiBwX2FycmF5IHsKICAgICAgICBhbGxvd19yZWFkb25seV9wYXRoKHBfZWxlbSwgaV9hcnJheSwgbWFza2VkX3BhdGhzKQogICAgfQp9CgphbGxvd19yZWFkb25seV9wYXRoKHBfZWxlbSwgaV9hcnJheSwgbWFza2VkX3BhdGhzKSB7CiAgICBwcmludCgiYWxsb3dfcmVhZG9ubHlfcGF0aCAxOiBwX2VsZW0gPSIsIHBfZWxlbSkKCiAgICBzb21lIGlfZWxlbSBpbiBpX2FycmF5CiAgICBwX2VsZW0gPT0gaV9lbGVtCgogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGggMTogdHJ1ZSIpCn0KYWxsb3dfcmVhZG9ubHlfcGF0aChwX2VsZW0sIGlfYXJyYXksIG1hc2tlZF9wYXRocykgewogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGggMjogcF9lbGVtID0iLCBwX2VsZW0pCgogICAgc29tZSBpX21hc2tlZCBpbiBtYXNrZWRfcGF0aHMKICAgIHBfZWxlbSA9PSBpX21hc2tlZAoKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRoIDI6IHRydWUiKQp9CgphbGxvd19saW51eF9kZXZpY2VzKHBfZGV2aWNlcywgaV9kZXZpY2VzKSB7CiAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogc3RhcnQiKQogICAgZXZlcnkgaV9kZXZpY2UgaW4gaV9kZXZpY2VzIHsKICAgICAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogaV9kZXZpY2UgPSIsIGlfZGV2aWNlKQogICAgICAgIHNvbWUgcF9kZXZpY2UgaW4gcF9kZXZpY2VzCiAgICAgICAgaV9kZXZpY2UuUGF0aCA9PSBwX2RldmljZS5QYXRoCiAgICB9CiAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogdHJ1ZSIpCn0KCmFsbG93X2xpbnV4X3N5c2N0bChwX2xpbnV4LCBpX2xpbnV4KSB7CiAgICBwcmludCgiYWxsb3dfbGludXhfc3lzY3RsIDE6IHN0YXJ0IikKICAgIG5vdCBpX2xpbnV4LlN5c2N0bAogICAgcHJpbnQoImFsbG93X2xpbnV4X3N5c2N0bCAxOiB0cnVlIikKfQoKYWxsb3dfbGludXhfc3lzY3RsKHBfbGludXgsIGlfbGludXgpIHsKICAgIHByaW50KCJhbGxvd19saW51eF9zeXNjdGwgMjogc3RhcnQiKQogICAgcF9zeXNjdGwgOj0gcF9saW51eC5TeXNjdGwKICAgIGlfc3lzY3RsIDo9IGlfbGludXguU3lzY3RsCiAgICBldmVyeSBpX25hbWUsIGlfdmFsIGluIGlfc3lzY3RsIHsKICAgICAgICBwcmludCgiYWxsb3dfbGludXhfc3lzY3RsIDI6IGlfbmFtZSA9IiwgaV9uYW1lLCAiaV92YWwgPSIsIGlfdmFsKQogICAgICAgIHBfc3lzY3RsW2lfbmFtZV0gPT0gaV92YWwKICAgIH0KICAgIHByaW50KCJhbGxvd19saW51eF9zeXNjdGwgMjogdHJ1ZSIpCn0KCiMgQ2hlY2sgdGhlIGNvbnNpc3RlbmN5IG9mIHRoZSBpbnB1dCAiaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5idW5kbGVfcGF0aCIKIyBhbmQgaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCIgdmFsdWVzIHdpdGggb3RoZXIgZmllbGRzLgphbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZChwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpIHsKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogc3RhcnQiKQoKICAgIGJ1bmRsZV9wYXRoIDo9IGlfb2NpLkFubm90YXRpb25zWyJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmJ1bmRsZV9wYXRoIl0KICAgIGJ1bmRsZV9pZCA6PSByZXBsYWNlKGJ1bmRsZV9wYXRoLCAiL3J1bi9jb250YWluZXJkL2lvLmNvbnRhaW5lcmQucnVudGltZS52Mi50YXNrL2s4cy5pby8iLCAiIikKCiAgICBidW5kbGVfaWRfZm9ybWF0IDo9IGNvbmNhdCgiIiwgWyJeIiwgQlVORExFX0lELCAiJCJdKQogICAgcmVnZXgubWF0Y2goYnVuZGxlX2lkX2Zvcm1hdCwgYnVuZGxlX2lkKQoKICAgIGtleSA6PSAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCIKCiAgICBwX3JlZ2V4IDo9IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIHNhbmRib3hfaWQgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQoKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogc2FuZGJveF9pZCA9Iiwgc2FuZGJveF9pZCwgInJlZ2V4ID0iLCBwX3JlZ2V4KQogICAgcmVnZXgubWF0Y2gocF9yZWdleCwgc2FuZGJveF9pZCkKCiAgICBhbGxvd19yb290X3BhdGgocF9vY2ksIGlfb2NpLCBidW5kbGVfaWQpCgogICAgZXZlcnkgaV9tb3VudCBpbiBpX29jaS5Nb3VudHMgewogICAgICAgIGFsbG93X21vdW50KHBfb2NpLCBpX21vdW50LCBpX3N0b3JhZ2VzLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpCiAgICB9CgogICAgYWxsb3dfc3RvcmFnZXMocF9zdG9yYWdlcywgaV9zdG9yYWdlcywgYnVuZGxlX2lkLCBzYW5kYm94X2lkKQoKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogdHJ1ZSIpCn0KCmFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHBfcHJvY2VzcyA9IiwgcF9wcm9jZXNzKQogICAgcHJpbnQoImFsbG93X3Byb2Nlc3NfY29tbW9uOiBpX3Byb2Nlc3MgPSAiLCBpX3Byb2Nlc3MpCiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHNfbmFtZSA9Iiwgc19uYW1lKQoKICAgIHBfcHJvY2Vzcy5Dd2QgPT0gaV9wcm9jZXNzLkN3ZAogICAgcF9wcm9jZXNzLk5vTmV3UHJpdmlsZWdlcyA9PSBpX3Byb2Nlc3MuTm9OZXdQcml2aWxlZ2VzCgogICAgYWxsb3dfdXNlcihwX3Byb2Nlc3MsIGlfcHJvY2VzcykKICAgIGFsbG93X2VudihwX3Byb2Nlc3MsIGlfcHJvY2Vzcywgc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHRydWUiKQp9CgojIENvbXBhcmUgdGhlIE9DSSBQcm9jZXNzIGZpZWxkIG9mIGEgcG9saWN5IGNvbnRhaW5lciB3aXRoIHRoZSBpbnB1dCBPQ0kgUHJvY2VzcyBmcm9tIGEgQ3JlYXRlQ29udGFpbmVyUmVxdWVzdAphbGxvd19wcm9jZXNzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfcHJvY2Vzczogc3RhcnQiKQoKICAgIGFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgYWxsb3dfY2FwcyhwX3Byb2Nlc3MuQ2FwYWJpbGl0aWVzLCBpX3Byb2Nlc3MuQ2FwYWJpbGl0aWVzKQogICAgcF9wcm9jZXNzLlRlcm1pbmFsID09IGlfcHJvY2Vzcy5UZXJtaW5hbAoKICAgIHByaW50KCJhbGxvd19wcm9jZXNzOiB0cnVlIikKfQoKIyBDb21wYXJlIHRoZSBPQ0kgUHJvY2VzcyBmaWVsZCBvZiBhIHBvbGljeSBjb250YWluZXIgd2l0aCB0aGUgaW5wdXQgcHJvY2VzcyBmaWVsZCBmcm9tIEV4ZWNQcm9jZXNzUmVxdWVzdAphbGxvd19pbnRlcmFjdGl2ZV9wcm9jZXNzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfaW50ZXJhY3RpdmVfcHJvY2Vzczogc3RhcnQiKQoKICAgIGFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgYWxsb3dfZXhlY19jYXBzKGlfcHJvY2Vzcy5DYXBhYmlsaXRpZXMpCgogICAgIyBUaGVzZSBhcmUgY29tbWFuZHMgZW5hYmxlZCB1c2luZyBFeGVjUHJvY2Vzc1JlcXVlc3QgY29tbWFuZHMgYW5kL29yIHJlZ2V4IGZyb20gdGhlIHNldHRpbmdzIGZpbGUuCiAgICAjIFRoZXkgY2FuIGJlIGV4ZWN1dGVkIGludGVyYWN0aXZlbHkgc28gYWxsb3cgdGhlbSB0byB1c2UgYW55IHZhbHVlIGZvciBpX3Byb2Nlc3MuVGVybWluYWwuCgogICAgcHJpbnQoImFsbG93X2ludGVyYWN0aXZlX3Byb2Nlc3M6IHRydWUiKQp9CgojIENvbXBhcmUgdGhlIE9DSSBQcm9jZXNzIGZpZWxkIG9mIGEgcG9saWN5IGNvbnRhaW5lciB3aXRoIHRoZSBpbnB1dCBwcm9jZXNzIGZpZWxkIGZyb20gRXhlY1Byb2Nlc3NSZXF1ZXN0CmFsbG93X3Byb2JlX3Byb2Nlc3MocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19wcm9iZV9wcm9jZXNzOiBzdGFydCIpCgogICAgYWxsb3dfcHJvY2Vzc19jb21tb24ocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpCiAgICBhbGxvd19leGVjX2NhcHMoaV9wcm9jZXNzLkNhcGFiaWxpdGllcykKICAgIHBfcHJvY2Vzcy5UZXJtaW5hbCA9PSBpX3Byb2Nlc3MuVGVybWluYWwKCiAgICBwcmludCgiYWxsb3dfcHJvYmVfcHJvY2VzczogdHJ1ZSIpCn0KCmFsbG93X3VzZXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MpIHsKICAgIHBfdXNlciA6PSBwX3Byb2Nlc3MuVXNlcgogICAgaV91c2VyIDo9IGlfcHJvY2Vzcy5Vc2VyCgogICAgcHJpbnQoImFsbG93X3VzZXI6IGlucHV0IHVpZCA9IiwgaV91c2VyLlVJRCwgInBvbGljeSB1aWQgPSIsIHBfdXNlci5VSUQpCiAgICBwX3VzZXIuVUlEID09IGlfdXNlci5VSUQKCiAgICAjIFRPRE86IHRyYWNrIGRvd24gdGhlIHJlYXNvbiBmb3IgcmVnaXN0cnkuazhzLmlvL3BhdXNlOjMuOSBiZWluZwogICAgIyAgICAgICBleGVjdXRlZCB3aXRoIGdpZCA9IDAgZGVzcGl0ZSBoYXZpbmcgIjY1NTM1OjY1NTM1IiBpbiBpdHMgY29udGFpbmVyIGltYWdlCiAgICAjICAgICAgIGNvbmZpZy4KICAgICNwcmludCgiYWxsb3dfdXNlcjogaW5wdXQgZ2lkID0iLCBpX3VzZXIuR0lELCAicG9saWN5IGdpZCA9IiwgcF91c2VyLkdJRCkKICAgICNwX3VzZXIuR0lEID09IGlfdXNlci5HSUQKCiAgICAjIFRPRE86IGNvbXBhcmUgdGhlIGFkZGl0aW9uYWxHaWRzIGZpZWxkIHRvbyBhZnRlciBjb21wdXRpbmcgaXRzIHZhbHVlCiAgICAjIGJhc2VkIG9uIC9ldGMvcGFzc3dkIGFuZCAvZXRjL2dyb3VwIGZyb20gdGhlIGNvbnRhaW5lciBpbWFnZS4KfQoKYWxsb3dfZGVwcmVjYXRlZF9hcmdzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZ3MgMTogbm8gYXJncyIpCgogICAgbm90IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJncwogICAgbm90IGlfcHJvY2Vzcy5BcmdzCgogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAxOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZ3MocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSkgewogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiBwb2xpY3kgYXJncyA9IiwgcF9wcm9jZXNzLkRlcHJlY2F0ZWRBcmdzKQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiBpbnB1dCBhcmdzID0iLCBpX3Byb2Nlc3MuQXJncykKCiAgICBjb3VudChwX3Byb2Nlc3MuRGVwcmVjYXRlZEFyZ3MpID09IGNvdW50KGlfcHJvY2Vzcy5BcmdzKQoKICAgIGV2ZXJ5IGksIGlfYXJnIGluIGlfcHJvY2Vzcy5BcmdzIHsKICAgICAgICBhbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpCiAgICB9CgogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDE6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgcF9hcmcyIDo9IHJlcGxhY2UocF9hcmcsICIkJCIsICIkIikKICAgIHBfYXJnMiA9PSBpX2FyZwoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAxOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDI6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgIyBUT0RPOiBjYW4gJChub2RlLW5hbWUpIGJlIGhhbmRsZWQgYmV0dGVyPwogICAgY29udGFpbnMocF9hcmcsICIkKG5vZGUtbmFtZSkiKQoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAyOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDM6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgcF9hcmcyIDo9IHJlcGxhY2UocF9hcmcsICIkJCIsICIkIikKICAgIHBfYXJnMyA6PSByZXBsYWNlKHBfYXJnMiwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAzOiBwX2FyZzMgPSIsIHBfYXJnMykKICAgIHBfYXJnMyA9PSBpX2FyZwoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAzOiB0cnVlIikKfQoKIyBPQ0kgcHJvY2Vzcy5FbnYgZmllbGQKYWxsb3dfZW52KHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfZW52OiBwIGVudiA9IiwgcF9wcm9jZXNzLkVudikKICAgIHByaW50KCJhbGxvd19lbnY6IGkgZW52ID0iLCBpX3Byb2Nlc3MuRW52KQoKICAgIGV2ZXJ5IGlfdmFyIGluIGlfcHJvY2Vzcy5FbnYgewogICAgICAgIHByaW50KCJhbGxvd19lbnY6IGlfdmFyID0iLCBpX3ZhcikKICAgICAgICBhbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgfQoKICAgIHByaW50KCJhbGxvd19lbnY6IHRydWUiKQp9CgojIEFsbG93IGlucHV0IGVudiB2YXJpYWJsZXMgdGhhdCBhcmUgcHJlc2VudCBpbiB0aGUgcG9saWN5IGRhdGEgdG9vLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHBfdmFyID09IGlfdmFyCiAgICBwcmludCgiYWxsb3dfdmFyIDE6IHRydWUiKQp9CgojIE1hdGNoIGlucHV0IHdpdGggb25lIG9mIHRoZSBwb2xpY3kgdmFyaWFibGVzLCBhZnRlciBzdWJzdGl0dXRpbmcgJChzYW5kYm94LW5hbWUpLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHByaW50KCJhbGxvd192YXIgMjogcF92YXIgPSIsIHBfdmFyKQoKICAgIHBfdmFyX3NwbGl0IDo9IHNwbGl0KHBfdmFyLCAiPSIpCiAgICBjb3VudChwX3Zhcl9zcGxpdCkgPT0gMgoKICAgIHBfdmFyX3NwbGl0WzFdID09ICIkKHNhbmRib3gtbmFtZSkiCgogICAgaV92YXJfc3BsaXQgOj0gc3BsaXQoaV92YXIsICI9IikKICAgIGNvdW50KGlfdmFyX3NwbGl0KSA9PSAyCgogICAgaV92YXJfc3BsaXRbMF0gPT0gcF92YXJfc3BsaXRbMF0KICAgIHJlZ2V4Lm1hdGNoKHNfbmFtZSwgaV92YXJfc3BsaXRbMV0pCgogICAgcHJpbnQoImFsbG93X3ZhciAyOiB0cnVlIikKfQoKIyBBbGxvdyBpbnB1dCBlbnYgdmFyaWFibGVzIHRoYXQgbWF0Y2ggd2l0aCBhIHJlcXVlc3RfZGVmYXVsdHMgcmVnZXguCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHNvbWUgcF9yZWdleDEgaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5DcmVhdGVDb250YWluZXJSZXF1ZXN0LmFsbG93X2Vudl9yZWdleAogICAgcF9yZWdleDIgOj0gcmVwbGFjZShwX3JlZ2V4MSwgIiQoaXB2NF9hKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcHY0X2EpCiAgICBwX3JlZ2V4MyA6PSByZXBsYWNlKHBfcmVnZXgyLCAiJChpcF9wKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcF9wKQogICAgcF9yZWdleDQgOj0gcmVwbGFjZShwX3JlZ2V4MywgIiQoc3ZjX25hbWUpIiwgcG9saWN5X2RhdGEuY29tbW9uLnN2Y19uYW1lKQogICAgcF9yZWdleDUgOj0gcmVwbGFjZShwX3JlZ2V4NCwgIiQoZG5zX2xhYmVsKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5kbnNfbGFiZWwpCgogICAgcHJpbnQoImFsbG93X3ZhciAzOiBwX3JlZ2V4NSA9IiwgcF9yZWdleDUpCiAgICByZWdleC5tYXRjaChwX3JlZ2V4NSwgaV92YXIpCgogICAgcHJpbnQoImFsbG93X3ZhciAzOiB0cnVlIikKfQoKIyBBbGxvdyBmaWVsZFJlZiAiZmllbGRQYXRoOiBzdGF0dXMucG9kSVAiIHZhbHVlcy4KYWxsb3dfdmFyKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBpX3Zhciwgc19uYW1lLCBzX25hbWVzcGFjZSkgewogICAgbmFtZV92YWx1ZSA6PSBzcGxpdChpX3ZhciwgIj0iKQogICAgY291bnQobmFtZV92YWx1ZSkgPT0gMgogICAgaXNfaXAobmFtZV92YWx1ZVsxXSkKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIGFsbG93X3BvZF9pcF92YXIobmFtZV92YWx1ZVswXSwgcF92YXIpCgogICAgcHJpbnQoImFsbG93X3ZhciA0OiB0cnVlIikKfQoKIyBBbGxvdyBjb21tb24gZmllbGRSZWYgdmFyaWFibGVzLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBuYW1lX3ZhbHVlIDo9IHNwbGl0KGlfdmFyLCAiPSIpCiAgICBjb3VudChuYW1lX3ZhbHVlKSA9PSAyCgogICAgc29tZSBwX3ZhciBpbiBwX3Byb2Nlc3MuRW52CiAgICBwX25hbWVfdmFsdWUgOj0gc3BsaXQocF92YXIsICI9IikKICAgIGNvdW50KHBfbmFtZV92YWx1ZSkgPT0gMgoKICAgIHBfbmFtZV92YWx1ZVswXSA9PSBuYW1lX3ZhbHVlWzBdCgogICAgIyBUT0RPOiBzaG91bGQgdGhlc2UgYmUgaGFuZGxlZCBpbiBhIGRpZmZlcmVudCB3YXk/CiAgICBhbHdheXNfYWxsb3dlZCA6PSBbIiQoaG9zdC1uYW1lKSIsICIkKG5vZGUtbmFtZSkiLCAiJChwb2QtdWlkKSJdCiAgICBzb21lIGFsbG93ZWQgaW4gYWx3YXlzX2FsbG93ZWQKICAgIGNvbnRhaW5zKHBfbmFtZV92YWx1ZVsxXSwgYWxsb3dlZCkKCiAgICBwcmludCgiYWxsb3dfdmFyIDU6IHRydWUiKQp9CgojIEFsbG93IGZpZWxkUmVmICJmaWVsZFBhdGg6IHN0YXR1cy5ob3N0SVAiIHZhbHVlcy4KYWxsb3dfdmFyKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBpX3Zhciwgc19uYW1lLCBzX25hbWVzcGFjZSkgewogICAgbmFtZV92YWx1ZSA6PSBzcGxpdChpX3ZhciwgIj0iKQogICAgY291bnQobmFtZV92YWx1ZSkgPT0gMgogICAgaXNfaXAobmFtZV92YWx1ZVsxXSkKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIGFsbG93X2hvc3RfaXBfdmFyKG5hbWVfdmFsdWVbMF0sIHBfdmFyKQoKICAgIHByaW50KCJhbGxvd192YXIgNjogdHJ1ZSIpCn0KCiMgQWxsb3cgcmVzb3VyY2VGaWVsZFJlZiB2YWx1ZXMgKGUuZy4sICJsaW1pdHMuY3B1IikuCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIG5hbWVfdmFsdWUgOj0gc3BsaXQoaV92YXIsICI9IikKICAgIGNvdW50KG5hbWVfdmFsdWUpID09IDIKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHBfbmFtZV92YWx1ZSA6PSBzcGxpdChwX3ZhciwgIj0iKQogICAgY291bnQocF9uYW1lX3ZhbHVlKSA9PSAyCgogICAgcF9uYW1lX3ZhbHVlWzBdID09IG5hbWVfdmFsdWVbMF0KCiAgICAjIGEgdmFyaWFibGUgd2Ugc2hvdWxkIGJlIHZhbGlkYXRpbmcgdXNpbmcgYSByZWdleCBmcm9tIHNldHRpbmdzCiAgICBwX25hbWVfdmFsdWVbMV0gPT0gIiQodmFsaWRhdGUtZnJvbS1zZXR0aW5ncykiCgogICAgcmVnZXhfdmFsIDo9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuQ3JlYXRlQ29udGFpbmVyUmVxdWVzdC5hbGxvd19lbnZfcmVnZXhfbWFwW25hbWVfdmFsdWVbMF1dCgogICAgcHJpbnQoImFsbG93X3ZhciA3OiB2YWwgPSIsIG5hbWVfdmFsdWVbMV0pCiAgICBwcmludCgiYWxsb3dfdmFyIDc6IHJlZ2V4X3ZhbCA9IiwgcmVnZXhfdmFsKQoKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4X3ZhbCwgbmFtZV92YWx1ZVsxXSkKCiAgICBwcmludCgiYWxsb3dfdmFyIDc6IHRydWUiKQp9CgojIE1hdGNoIGlucHV0IHdpdGggb25lIG9mIHRoZSBwb2xpY3kgdmFyaWFibGVzLCBhZnRlciBzdWJzdGl0dXRpbmcgJChzYW5kYm94LW5hbWVzcGFjZSkuCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHNvbWUgcF92YXIgaW4gcF9wcm9jZXNzLkVudgogICAgcF92YXIyIDo9IHJlcGxhY2UocF92YXIsICIkKHNhbmRib3gtbmFtZXNwYWNlKSIsIHNfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd192YXIgODogcF92YXIyID0iLCBwX3ZhcjIpCiAgICBwX3ZhcjIgPT0gaV92YXIKCiAgICBwcmludCgiYWxsb3dfdmFyIDg6IHRydWUiKQp9CgphbGxvd19wb2RfaXBfdmFyKHZhcl9uYW1lLCBwX3ZhcikgewogICAgcHJpbnQoImFsbG93X3BvZF9pcF92YXI6IHZhcl9uYW1lID0iLCB2YXJfbmFtZSwgInBfdmFyID0iLCBwX3ZhcikKCiAgICBwX25hbWVfdmFsdWUgOj0gc3BsaXQocF92YXIsICI9IikKICAgIGNvdW50KHBfbmFtZV92YWx1ZSkgPT0gMgoKICAgIHBfbmFtZV92YWx1ZVswXSA9PSB2YXJfbmFtZQogICAgcF9uYW1lX3ZhbHVlWzFdID09ICIkKHBvZC1pcCkiCgogICAgcHJpbnQoImFsbG93X3BvZF9pcF92YXI6IHRydWUiKQp9CgphbGxvd19ob3N0X2lwX3Zhcih2YXJfbmFtZSwgcF92YXIpIHsKICAgIHByaW50KCJhbGxvd19ob3N0X2lwX3ZhcjogdmFyX25hbWUgPSIsIHZhcl9uYW1lLCAicF92YXIgPSIsIHBfdmFyKQoKICAgIHBfbmFtZV92YWx1ZSA6PSBzcGxpdChwX3ZhciwgIj0iKQogICAgY291bnQocF9uYW1lX3ZhbHVlKSA9PSAyCgogICAgcF9uYW1lX3ZhbHVlWzBdID09IHZhcl9uYW1lCiAgICBwX25hbWVfdmFsdWVbMV0gPT0gIiQoaG9zdC1pcCkiCgogICAgcHJpbnQoImFsbG93X2hvc3RfaXBfdmFyOiB0cnVlIikKfQoKaXNfaXAodmFsdWUpIHsKICAgIGJ5dGVzID0gc3BsaXQodmFsdWUsICIuIikKICAgIGNvdW50KGJ5dGVzKSA9PSA0CgogICAgaXNfaXBfZmlyc3RfYnl0ZShieXRlc1swXSkKICAgIGlzX2lwX290aGVyX2J5dGUoYnl0ZXNbMV0pCiAgICBpc19pcF9vdGhlcl9ieXRlKGJ5dGVzWzJdKQogICAgaXNfaXBfb3RoZXJfYnl0ZShieXRlc1szXSkKfQppc19pcF9maXJzdF9ieXRlKGNvbXBvbmVudCkgewogICAgbnVtYmVyID0gdG9fbnVtYmVyKGNvbXBvbmVudCkKICAgIG51bWJlciA+PSAxCiAgICBudW1iZXIgPD0gMjU1Cn0KaXNfaXBfb3RoZXJfYnl0ZShjb21wb25lbnQpIHsKICAgIG51bWJlciA9IHRvX251bWJlcihjb21wb25lbnQpCiAgICBudW1iZXIgPj0gMAogICAgbnVtYmVyIDw9IDI1NQp9CgojIE9DSSByb290LlBhdGgKYWxsb3dfcm9vdF9wYXRoKHBfb2NpLCBpX29jaSwgYnVuZGxlX2lkKSB7CiAgICBpX3BhdGggOj0gaV9vY2kuUm9vdC5QYXRoCiAgICBwX3BhdGgxIDo9IHBfb2NpLlJvb3QuUGF0aAogICAgcHJpbnQoImFsbG93X3Jvb3RfcGF0aDogaV9wYXRoID0iLCBpX3BhdGgsICJwX3BhdGgxID0iLCBwX3BhdGgxKQoKICAgIHBfcGF0aDIgOj0gcmVwbGFjZShwX3BhdGgxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfcm9vdF9wYXRoOiBwX3BhdGgyID0iLCBwX3BhdGgyKQoKICAgIHBfcGF0aDMgOj0gcmVwbGFjZShwX3BhdGgyLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X3Jvb3RfcGF0aDogcF9wYXRoMyA9IiwgcF9wYXRoMykKCiAgICBwX3BhdGgzID09IGlfcGF0aAoKICAgIHByaW50KCJhbGxvd19yb290X3BhdGg6IHRydWUiKQp9CgojIGRldmljZSBtb3VudHMKYWxsb3dfbW91bnQocF9vY2ksIGlfbW91bnQsIGlfc3RvcmFnZXMsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcHJpbnQoImFsbG93X21vdW50OiBpX21vdW50ID0iLCBpX21vdW50KQoKICAgIHNvbWUgcF9tb3VudCBpbiBwX29jaS5Nb3VudHMKICAgIHNvbWUgaV9zdG9yYWdlIGluIGlfc3RvcmFnZXMKCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IHBfbW91bnQgPSIsIHBfbW91bnQpCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IGlfc3RvcmFnZSA9IiwgaV9zdG9yYWdlKQoKICAgIGNoZWNrX21vdW50KHBfbW91bnQsIGlfbW91bnQsIGlfc3RvcmFnZSwgYnVuZGxlX2lkLCBzYW5kYm94X2lkKQoKICAgICMgVE9ETzogYXJlIHRoZXJlIGFueSBvdGhlciByZXF1aXJlZCBwb2xpY3kgY2hlY2tzIGZvciBtb3VudHMgLSBlLmcuLAogICAgIyAgICAgICBtdWx0aXBsZSBtb3VudHMgd2l0aCBzYW1lIHNvdXJjZSBvciBkZXN0aW5hdGlvbj8KCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IHRydWUiKQp9CgpjaGVja19tb3VudChwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcF9tb3VudCA9PSBpX21vdW50CiAgICBwcmludCgiY2hlY2tfbW91bnQgMTogdHJ1ZSIpCn0KY2hlY2tfbW91bnQocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHBfbW91bnQuZGVzdGluYXRpb24gPT0gaV9tb3VudC5kZXN0aW5hdGlvbgogICAgcF9tb3VudC50eXBlXyA9PSBpX21vdW50LnR5cGVfCiAgICBwX21vdW50Lm9wdGlvbnMgPT0gaV9tb3VudC5vcHRpb25zCgogICAgbW91bnRfc291cmNlX2FsbG93cyhwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkKCiAgICBwcmludCgiY2hlY2tfbW91bnQgMjogdHJ1ZSIpCn0KCm1vdW50X3NvdXJjZV9hbGxvd3MocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHJlZ2V4MSA6PSBwX21vdW50LnNvdXJjZQogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5tb3VudF9zb3VyY2VfY3BhdGgpCiAgICByZWdleDQgOj0gcmVwbGFjZShyZWdleDMsICIkKGJ1bmRsZS1pZCkiLCBidW5kbGVfaWQpCgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMTogcmVnZXg0ID0iLCByZWdleDQpCiAgICByZWdleC5tYXRjaChyZWdleDQsIGlfbW91bnQuc291cmNlKQoKICAgIHByaW50KCJtb3VudF9zb3VyY2VfYWxsb3dzIDE6IHRydWUiKQp9Cm1vdW50X3NvdXJjZV9hbGxvd3MocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHJlZ2V4MSA6PSBwX21vdW50LnNvdXJjZQogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5tb3VudF9zb3VyY2VfY3BhdGgpCiAgICByZWdleDQgOj0gcmVwbGFjZShyZWdleDMsICIkKHNhbmRib3gtaWQpIiwgc2FuZGJveF9pZCkKCiAgICBwcmludCgibW91bnRfc291cmNlX2FsbG93cyAyOiByZWdleDQgPSIsIHJlZ2V4NCkKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4NCwgaV9tb3VudC5zb3VyY2UpCgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMjogdHJ1ZSIpCn0KbW91bnRfc291cmNlX2FsbG93cyhwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogaV9tb3VudC5zb3VyY2UgPSIsIGlfbW91bnQuc291cmNlKQogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogaV9zdG9yYWdlLm1vdW50X3BvaW50ID0iLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCgogICAgaV9tb3VudC5zb3VyY2UgPT0gaV9zdG9yYWdlLm1vdW50X3BvaW50CgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogdHJ1ZSIpCn0KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBDcmVhdGUgY29udGFpbmVyIFN0b3JhZ2VzCgphbGxvd19zdG9yYWdlcyhwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHBfY291bnQgOj0gY291bnQocF9zdG9yYWdlcykKICAgIGlfY291bnQgOj0gY291bnQoaV9zdG9yYWdlcykKICAgIHByaW50KCJhbGxvd19zdG9yYWdlczogcF9jb3VudCA9IiwgcF9jb3VudCwgImlfY291bnQgPSIsIGlfY291bnQpCgogICAgcF9jb3VudCA9PSBpX2NvdW50CgogICAgIyBHZXQgdGhlIGNvbnRhaW5lciBpbWFnZSBsYXllciBJRHMgYW5kIHZlcml0eSByb290IGhhc2hlcywgZnJvbSB0aGUgIm92ZXJsYXlmcyIgc3RvcmFnZS4KICAgIHNvbWUgb3ZlcmxheV9zdG9yYWdlIGluIHBfc3RvcmFnZXMKICAgIG92ZXJsYXlfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIHByaW50KCJhbGxvd19zdG9yYWdlczogb3ZlcmxheV9zdG9yYWdlID0iLCBvdmVybGF5X3N0b3JhZ2UpCiAgICBjb3VudChvdmVybGF5X3N0b3JhZ2Uub3B0aW9ucykgPT0gMgoKICAgIGxheWVyX2lkcyA6PSBzcGxpdChvdmVybGF5X3N0b3JhZ2Uub3B0aW9uc1swXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiBsYXllcl9pZHMgPSIsIGxheWVyX2lkcykKCiAgICByb290X2hhc2hlcyA6PSBzcGxpdChvdmVybGF5X3N0b3JhZ2Uub3B0aW9uc1sxXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiByb290X2hhc2hlcyA9Iiwgcm9vdF9oYXNoZXMpCgogICAgZXZlcnkgaV9zdG9yYWdlIGluIGlfc3RvcmFnZXMgewogICAgICAgIGFsbG93X3N0b3JhZ2UocF9zdG9yYWdlcywgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpCiAgICB9CgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiB0cnVlIikKfQoKYWxsb3dfc3RvcmFnZShwX3N0b3JhZ2VzLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgc29tZSBwX3N0b3JhZ2UgaW4gcF9zdG9yYWdlcwoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiBwX3N0b3JhZ2UgPSIsIHBfc3RvcmFnZSkKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiBpX3N0b3JhZ2UgPSIsIGlfc3RvcmFnZSkKCiAgICBwX3N0b3JhZ2UuZHJpdmVyICAgICAgICAgICA9PSBpX3N0b3JhZ2UuZHJpdmVyCiAgICBwX3N0b3JhZ2UuZHJpdmVyX29wdGlvbnMgICA9PSBpX3N0b3JhZ2UuZHJpdmVyX29wdGlvbnMKICAgIHBfc3RvcmFnZS5mc19ncm91cCAgICAgICAgID09IGlfc3RvcmFnZS5mc19ncm91cAogICAgcF9zdG9yYWdlLmZzdHlwZSAgICAgICAgICAgPT0gaV9zdG9yYWdlLmZzdHlwZQoKICAgIGFsbG93X3N0b3JhZ2Vfc291cmNlKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKQogICAgYWxsb3dfc3RvcmFnZV9vcHRpb25zKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKQogICAgYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKQoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiB0cnVlIikKfQoKYWxsb3dfc3RvcmFnZV9zb3VyY2UocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX3NvdXJjZSAxOiBzdGFydCIpCgogICAgcF9zdG9yYWdlLnNvdXJjZSA9PSBpX3N0b3JhZ2Uuc291cmNlCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDE6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX3NvdXJjZShwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDI6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCgogICAgIyBEREREOkJCOkRELkY6IERvbWFpbjpCdXM6RGV2aWNlLkZ1bmN0aW9uCiAgICAjIGh0dHBzOi8vd3d3Lmtlcm5lbC5vcmcvZG9jL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtYnVzLXBjaQogICAgcmVnZXgubWF0Y2goYF5bYS1mMC05XXs0fTpbYS1mMC05XXsyfTpbYS1mMC05XXsyfVwuW2EtZjAtOV0kYCwgaV9zdG9yYWdlLnNvdXJjZSkKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9zb3VyY2UgMjogdHJ1ZSIpCn0KCmFsbG93X3N0b3JhZ2Vfc291cmNlKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKSB7CiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9zb3VyY2UgMzogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIGlfc3RvcmFnZS5zb3VyY2UgPT0gIm5vbmUiCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDM6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX3NvdXJjZShwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDQ6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJzbWIiCgogICAgIyBQYXR0ZXJuOiAvLzxzdG9yYWdlLWFjY291bnQtbmFtZT4uZmlsZS5jb3JlLndpbmRvd3MubmV0LzxrOHMtUFZDLW5hbWU+CiAgICAjIFN0b3JhZ2UgYWNjb3VudCBuYW1lOiBodHRwczovL2xlYXJuLm1pY3Jvc29mdC5jb20vZW4tdXMvYXp1cmUvc3RvcmFnZS9jb21tb24vc3RvcmFnZS1hY2NvdW50LW92ZXJ2aWV3I3N0b3JhZ2UtYWNjb3VudC1uYW1lCiAgICAjIEs4cyBQVkMgbmFtZTogaHR0cHM6Ly9rdWJlcm5ldGVzLmlvL2RvY3MvY29uY2VwdHMvb3ZlcnZpZXcvd29ya2luZy13aXRoLW9iamVjdHMvbmFtZXMvI2Rucy1zdWJkb21haW4tbmFtZXMKICAgIHJlZ2V4Lm1hdGNoKGBeXC9cLyhbYS16MC05XXszLDI0fSlcLmZpbGVcLmNvcmVcLndpbmRvd3NcLm5ldFwvW2EtejAtOV0oW2EtejAtOS4tXXswLDI1MX1bYS16MC05XSk/JGAsIGlfc3RvcmFnZS5zb3VyY2UpCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDQ6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMTogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgIT0gIm92ZXJsYXlmcyIKICAgIHBfc3RvcmFnZS5vcHRpb25zID09IGlfc3RvcmFnZS5vcHRpb25zCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAxOiB0cnVlIikKfQphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIGNvdW50KHBfc3RvcmFnZS5vcHRpb25zKSA9PSAyCgogICAgcG9saWN5X2lkcyA6PSBzcGxpdChwX3N0b3JhZ2Uub3B0aW9uc1swXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBwb2xpY3lfaWRzID0iLCBwb2xpY3lfaWRzKQogICAgcG9saWN5X2lkcyA9PSBsYXllcl9pZHMKCiAgICBwb2xpY3lfaGFzaGVzIDo9IHNwbGl0KHBfc3RvcmFnZS5vcHRpb25zWzFdLCAiOiIpCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IHBvbGljeV9oYXNoZXMgPSIsIHBvbGljeV9oYXNoZXMpCgogICAgcF9jb3VudCA6PSBjb3VudChwb2xpY3lfaWRzKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBwX2NvdW50ID0iLCBwX2NvdW50KQogICAgcF9jb3VudCA+PSAxCiAgICBwX2NvdW50ID09IGNvdW50KHBvbGljeV9oYXNoZXMpCgogICAgaV9jb3VudCA6PSBjb3VudChpX3N0b3JhZ2Uub3B0aW9ucykKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogaV9jb3VudCA9IiwgaV9jb3VudCkKICAgIGlfY291bnQgPT0gcF9jb3VudCArIDMKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zWzBdID0iLCBpX3N0b3JhZ2Uub3B0aW9uc1swXSkKICAgIGlfc3RvcmFnZS5vcHRpb25zWzBdID09ICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQubGF5ZXItc3JjLXByZWZpeD0vdmFyL2xpYi9jb250YWluZXJkL2lvLmNvbnRhaW5lcmQuc25hcHNob3R0ZXIudjEudGFyZGV2L2xheWVycyIKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zW2lfY291bnQgLSAyXSA9IiwgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDJdKQogICAgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDJdID09ICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQub3ZlcmxheS1ydyIKCiAgICBsb3dlcmRpciA6PSBjb25jYXQoIj0iLCBbImxvd2VyZGlyIiwgcF9zdG9yYWdlLm9wdGlvbnNbMF1dKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBsb3dlcmRpciA9IiwgbG93ZXJkaXIpCgogICAgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDFdID09IGxvd2VyZGlyCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zW2lfY291bnQgLSAxXSA9IiwgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDFdKQoKICAgIGV2ZXJ5IGksIHBvbGljeV9pZCBpbiBwb2xpY3lfaWRzIHsKICAgICAgICBhbGxvd19vdmVybGF5X2xheWVyKHBvbGljeV9pZCwgcG9saWN5X2hhc2hlc1tpXSwgaV9zdG9yYWdlLm9wdGlvbnNbaSArIDFdKQogICAgfQoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogdHJ1ZSIpCn0KYWxsb3dfc3RvcmFnZV9vcHRpb25zKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKSB7CiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDM6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCiAgICBjb3VudChwX3N0b3JhZ2Uub3B0aW9ucykgPT0gMQoKICAgIHN0YXJ0c3dpdGgocF9zdG9yYWdlLm9wdGlvbnNbMF0sICIkKGhhc2giKQogICAgaGFzaF9zdWZmaXggOj0gdHJpbV9sZWZ0KHBfc3RvcmFnZS5vcHRpb25zWzBdLCAiJChoYXNoIikKCiAgICBlbmRzd2l0aChoYXNoX3N1ZmZpeCwgIikiKQogICAgaGFzaF9pbmRleCA6PSB0cmltX3JpZ2h0KGhhc2hfc3VmZml4LCAiKSIpCiAgICBpIDo9IHRvX251bWJlcihoYXNoX2luZGV4KQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAzOiBpID0iLCBpKQoKICAgIGhhc2hfb3B0aW9uIDo9IGNvbmNhdCgiPSIsIFsiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LnJvb3QtaGFzaCIsIHJvb3RfaGFzaGVzW2ldXSkKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMzogaGFzaF9vcHRpb24gPSIsIGhhc2hfb3B0aW9uKQoKICAgIGNvdW50KGlfc3RvcmFnZS5vcHRpb25zKSA9PSA0CiAgICBpX3N0b3JhZ2Uub3B0aW9uc1swXSA9PSAicm8iCiAgICBpX3N0b3JhZ2Uub3B0aW9uc1sxXSA9PSAiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmJsb2NrX2RldmljZT1maWxlIgogICAgaV9zdG9yYWdlLm9wdGlvbnNbMl0gPT0gImlvLmthdGFjb250YWluZXJzLmZzLW9wdC5pcy1sYXllciIKICAgIGlfc3RvcmFnZS5vcHRpb25zWzNdID09IGhhc2hfb3B0aW9uCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAzOiB0cnVlIikKfQphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgNDogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gInNtYiIKICAgIHBfb3B0c19jb3VudCA6PSBjb3VudChwX3N0b3JhZ2Uub3B0aW9ucykKICAgIGlfb3B0c19jb3VudCA6PSBjb3VudChpX3N0b3JhZ2Uub3B0aW9ucykKICAgIGlfb3B0c19jb3VudCA9PSBwX29wdHNfY291bnQgKyAyCgogICAgaV9vcHRfbWF0Y2hlcyA6PSBbaSB8IGkgOj0gaWR4OyBpZHggPCBwX29wdHNfY291bnQ7IHBfc3RvcmFnZS5vcHRpb25zW2lkeF0gPT0gaV9zdG9yYWdlLm9wdGlvbnNbaWR4XV0KICAgIGNvdW50KGlfb3B0X21hdGNoZXMpID09IHBfb3B0c19jb3VudAoKICAgIHN0YXJ0c3dpdGgoaV9zdG9yYWdlLm9wdGlvbnNbaV9vcHRzX2NvdW50LTJdLCAiYWRkcj0iKQogICAgY3JlZHMgPSBzcGxpdChpX3N0b3JhZ2Uub3B0aW9uc1tpX29wdHNfY291bnQtMV0sICIsIikKICAgIGNvdW50KGNyZWRzKSA9PSAyCiAgICBzdGFydHN3aXRoKGNyZWRzWzBdLCAidXNlcm5hbWU9IikKICAgIHN0YXJ0c3dpdGgoY3JlZHNbMV0sICJwYXNzd29yZD0iKQogICAgCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDQ6IHRydWUiKQp9CgphbGxvd19vdmVybGF5X2xheWVyKHBvbGljeV9pZCwgcG9saWN5X2hhc2gsIGlfb3B0aW9uKSB7CiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogcG9saWN5X2lkID0iLCBwb2xpY3lfaWQsICJwb2xpY3lfaGFzaCA9IiwgcG9saWN5X2hhc2gpCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogaV9vcHRpb24gPSIsIGlfb3B0aW9uKQoKICAgIHN0YXJ0c3dpdGgoaV9vcHRpb24sICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQubGF5ZXI9IikKICAgIGlfdmFsdWUgOj0gcmVwbGFjZShpX29wdGlvbiwgImlvLmthdGFjb250YWluZXJzLmZzLW9wdC5sYXllcj0iLCAiIikKICAgIGlfdmFsdWVfZGVjb2RlZCA6PSBiYXNlNjQuZGVjb2RlKGlfdmFsdWUpCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogaV92YWx1ZV9kZWNvZGVkID0iLCBpX3ZhbHVlX2RlY29kZWQpCgogICAgcG9saWN5X3N1ZmZpeCA6PSBjb25jYXQoIj0iLCBbInRhcixybyxpby5rYXRhY29udGFpbmVycy5mcy1vcHQuYmxvY2tfZGV2aWNlPWZpbGUsaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmlzLWxheWVyLGlvLmthdGFjb250YWluZXJzLmZzLW9wdC5yb290LWhhc2giLCBwb2xpY3lfaGFzaF0pCiAgICBwX3ZhbHVlIDo9IGNvbmNhdCgiLCIsIFtwb2xpY3lfaWQsIHBvbGljeV9zdWZmaXhdKQogICAgcHJpbnQoImFsbG93X292ZXJsYXlfbGF5ZXI6IHBfdmFsdWUgPSIsIHBfdmFsdWUpCgogICAgcF92YWx1ZSA9PSBpX3ZhbHVlX2RlY29kZWQKCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogdHJ1ZSIpCn0KCmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAidGFyIgoKICAgIHN0YXJ0c3dpdGgocF9zdG9yYWdlLm1vdW50X3BvaW50LCAiJChsYXllciIpCiAgICBtb3VudF9zdWZmaXggOj0gdHJpbV9sZWZ0KHBfc3RvcmFnZS5tb3VudF9wb2ludCwgIiQobGF5ZXIiKQoKICAgIGVuZHN3aXRoKG1vdW50X3N1ZmZpeCwgIikiKQogICAgbGF5ZXJfaW5kZXggOj0gdHJpbV9yaWdodChtb3VudF9zdWZmaXgsICIpIikKICAgIGkgOj0gdG9fbnVtYmVyKGxheWVyX2luZGV4KQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDE6IGkgPSIsIGkpCgogICAgbGF5ZXJfaWQgOj0gbGF5ZXJfaWRzW2ldCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMTogbGF5ZXJfaWQgPSIsIGxheWVyX2lkKQoKICAgIHBfbW91bnQgOj0gY29uY2F0KCIvIiwgWyIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L2xheWVycyIsIGxheWVyX2lkXSkKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCAxOiBwX21vdW50ID0iLCBwX21vdW50KQoKICAgIHBfbW91bnQgPT0gaV9zdG9yYWdlLm1vdW50X3BvaW50CgogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDE6IHRydWUiKQp9CmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAiZnVzZTMua2F0YS1vdmVybGF5IgoKICAgIG1vdW50MSA6PSByZXBsYWNlKHBfc3RvcmFnZS5tb3VudF9wb2ludCwgIiQoY3BhdGgpIiwgcG9saWN5X2RhdGEuY29tbW9uLmNwYXRoKQogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDI6IG1vdW50MiA9IiwgbW91bnQyKQoKICAgIG1vdW50MiA9PSBpX3N0b3JhZ2UubW91bnRfcG9pbnQKCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMjogdHJ1ZSIpCn0KYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKSB7CiAgICBwX3N0b3JhZ2UuZnN0eXBlID09ICJsb2NhbCIKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQyID0iLCBtb3VudDIpCgogICAgbW91bnQzIDo9IHJlcGxhY2UobW91bnQyLCAiJChzYW5kYm94LWlkKSIsIHNhbmRib3hfaWQpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQzID0iLCBtb3VudDMpCgogICAgcmVnZXgubWF0Y2gobW91bnQzLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCgogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDM6IHRydWUiKQp9CmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAiYmluZCIKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNDogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNDogbW91bnQyID0iLCBtb3VudDIpCgogICAgbW91bnQzIDo9IHJlcGxhY2UobW91bnQyLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDQ6IG1vdW50MyA9IiwgbW91bnQzKQoKICAgIHJlZ2V4Lm1hdGNoKG1vdW50MywgaV9zdG9yYWdlLm1vdW50X3BvaW50KQoKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA0OiB0cnVlIikKfQphbGxvd19tb3VudF9wb2ludChwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgYnVuZGxlX2lkLCBzYW5kYm94X2lkLCBsYXllcl9pZHMpIHsKICAgIHBfc3RvcmFnZS5mc3R5cGUgPT0gInRtcGZzIgoKICAgIG1vdW50MSA6PSBwX3N0b3JhZ2UubW91bnRfcG9pbnQKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA1OiBtb3VudDEgPSIsIG1vdW50MSkKCiAgICByZWdleC5tYXRjaChtb3VudDEsIGlfc3RvcmFnZS5tb3VudF9wb2ludCkKCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNTogdHJ1ZSIpCn0KYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKSB7CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogaV9zdG9yYWdlLm1vdW50X3BvaW50ID0iLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCiAgICBhbGxvd19kaXJlY3Rfdm9sX2RyaXZlcihwX3N0b3JhZ2UsIGlfc3RvcmFnZSkKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChzcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQyID0iLCBtb3VudDIpCgogICAgZGlyZWN0X3ZvbF9wYXRoIDo9IGlfc3RvcmFnZS5zb3VyY2UKICAgIG1vdW50MyA6PSByZXBsYWNlKG1vdW50MiwgIiQoYjY0LWRpcmVjdC12b2wtcGF0aCkiLCBiYXNlNjR1cmwuZW5jb2RlKGRpcmVjdF92b2xfcGF0aCkpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQzID0iLCBtb3VudDMpCgogICAgbW91bnQzID09IGlfc3RvcmFnZS5tb3VudF9wb2ludAoKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA2OiB0cnVlIikKfQoKYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIocF9zdG9yYWdlLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19kaXJlY3Rfdm9sX2RyaXZlciAxOiBzdGFydCIpCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCiAgICBwcmludCgiYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIgMTogdHJ1ZSIpCn0KYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIocF9zdG9yYWdlLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19kaXJlY3Rfdm9sX2RyaXZlciAyOiBzdGFydCIpCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJzbWIiCiAgICBwcmludCgiYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIgMjogdHJ1ZSIpCn0KCiMgRXhlY1Byb2Nlc3NSZXF1ZXN0LnByb2Nlc3MuQ2FwYWJpbGl0aWVzCmFsbG93X2V4ZWNfY2FwcyhpX2NhcHMpIHsKICAgIG5vdCBpX2NhcHMuQW1iaWVudAogICAgbm90IGlfY2Fwcy5Cb3VuZGluZwogICAgbm90IGlfY2Fwcy5FZmZlY3RpdmUKICAgIG5vdCBpX2NhcHMuSW5oZXJpdGFibGUKICAgIG5vdCBpX2NhcHMuUGVybWl0dGVkCn0KCiMgT0NJLlByb2Nlc3MuQ2FwYWJpbGl0aWVzCmFsbG93X2NhcHMocF9jYXBzLCBpX2NhcHMpIHsKICAgIHByaW50KCJhbGxvd19jYXBzOiBwb2xpY3kgQW1iaWVudCA9IiwgcF9jYXBzLkFtYmllbnQpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgQW1iaWVudCA9IiwgaV9jYXBzLkFtYmllbnQpCiAgICBtYXRjaF9jYXBzKHBfY2Fwcy5BbWJpZW50LCBpX2NhcHMuQW1iaWVudCkKCiAgICBwcmludCgiYWxsb3dfY2FwczogcG9saWN5IEJvdW5kaW5nID0iLCBwX2NhcHMuQm91bmRpbmcpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgQm91bmRpbmcgPSIsIGlfY2Fwcy5Cb3VuZGluZykKICAgIG1hdGNoX2NhcHMocF9jYXBzLkJvdW5kaW5nLCBpX2NhcHMuQm91bmRpbmcpCgogICAgcHJpbnQoImFsbG93X2NhcHM6IHBvbGljeSBFZmZlY3RpdmUgPSIsIHBfY2Fwcy5FZmZlY3RpdmUpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgRWZmZWN0aXZlID0iLCBpX2NhcHMuRWZmZWN0aXZlKQogICAgbWF0Y2hfY2FwcyhwX2NhcHMuRWZmZWN0aXZlLCBpX2NhcHMuRWZmZWN0aXZlKQoKICAgIHByaW50KCJhbGxvd19jYXBzOiBwb2xpY3kgSW5oZXJpdGFibGUgPSIsIHBfY2Fwcy5Jbmhlcml0YWJsZSkKICAgIHByaW50KCJhbGxvd19jYXBzOiBpbnB1dCBJbmhlcml0YWJsZSA9IiwgaV9jYXBzLkluaGVyaXRhYmxlKQogICAgbWF0Y2hfY2FwcyhwX2NhcHMuSW5oZXJpdGFibGUsIGlfY2Fwcy5Jbmhlcml0YWJsZSkKCiAgICBwcmludCgiYWxsb3dfY2FwczogcG9saWN5IFBlcm1pdHRlZCA9IiwgcF9jYXBzLlBlcm1pdHRlZCkKICAgIHByaW50KCJhbGxvd19jYXBzOiBpbnB1dCBQZXJtaXR0ZWQgPSIsIGlfY2Fwcy5QZXJtaXR0ZWQpCiAgICBtYXRjaF9jYXBzKHBfY2Fwcy5QZXJtaXR0ZWQsIGlfY2Fwcy5QZXJtaXR0ZWQpCn0KCm1hdGNoX2NhcHMocF9jYXBzLCBpX2NhcHMpIHsKICAgIHByaW50KCJtYXRjaF9jYXBzIDE6IHN0YXJ0IikKCiAgICBwX2NhcHMgPT0gaV9jYXBzCgogICAgcHJpbnQoIm1hdGNoX2NhcHMgMTogdHJ1ZSIpCn0KbWF0Y2hfY2FwcyhwX2NhcHMsIGlfY2FwcykgewogICAgcHJpbnQoIm1hdGNoX2NhcHMgMjogc3RhcnQiKQoKICAgIGNvdW50KHBfY2FwcykgPT0gMQogICAgcF9jYXBzWzBdID09ICIkKGRlZmF1bHRfY2FwcykiCgogICAgcHJpbnQoIm1hdGNoX2NhcHMgMjogZGVmYXVsdF9jYXBzID0iLCBwb2xpY3lfZGF0YS5jb21tb24uZGVmYXVsdF9jYXBzKQogICAgcG9saWN5X2RhdGEuY29tbW9uLmRlZmF1bHRfY2FwcyA9PSBpX2NhcHMKCiAgICBwcmludCgibWF0Y2hfY2FwcyAyOiB0cnVlIikKfQptYXRjaF9jYXBzKHBfY2FwcywgaV9jYXBzKSB7CiAgICBwcmludCgibWF0Y2hfY2FwcyAzOiBzdGFydCIpCgogICAgY291bnQocF9jYXBzKSA9PSAxCiAgICBwX2NhcHNbMF0gPT0gIiQocHJpdmlsZWdlZF9jYXBzKSIKCiAgICBwcmludCgibWF0Y2hfY2FwcyAzOiBwcml2aWxlZ2VkX2NhcHMgPSIsIHBvbGljeV9kYXRhLmNvbW1vbi5wcml2aWxlZ2VkX2NhcHMpCiAgICBwb2xpY3lfZGF0YS5jb21tb24ucHJpdmlsZWdlZF9jYXBzID09IGlfY2FwcwoKICAgIHByaW50KCJtYXRjaF9jYXBzIDM6IHRydWUiKQp9CgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgpjaGVja19kaXJlY3RvcnlfdHJhdmVyc2FsKGlfcGF0aCkgewogICAgbm90IHJlZ2V4Lm1hdGNoKCIoXnwvKS4uKCR8LykiLCBpX3BhdGgpCn0KCmNoZWNrX3N5bWxpbmtfc291cmNlKGlfc3JjKSB7CiAgICBpX3NyYyA9PSAiIgogICAgcHJpbnQoImNoZWNrX3N5bWxpbmtfc291cmNlIDE6IHRydWUiKQp9CmNoZWNrX3N5bWxpbmtfc291cmNlKGlfc3JjKSB7CiAgICBpX3NyYyAhPSAiIgogICAgcHJpbnQoImNoZWNrX3N5bWxpbmtfc291cmNlIDI6IGlfc3JjID0iLCBpX3NyYykKCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24uc19zb3VyY2UxLCBpX3NyYykKCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMjogdHJ1ZSIpCn0KY2hlY2tfc3ltbGlua19zb3VyY2UoaV9zcmMpIHsKICAgIGlfc3JjICE9ICIiCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMzogaV9zcmMgPSIsIGlfc3JjKQoKICAgIHJlZ2V4Lm1hdGNoKHBvbGljeV9kYXRhLmNvbW1vbi5zX3NvdXJjZTIsIGlfc3JjKQogICAgY2hlY2tfZGlyZWN0b3J5X3RyYXZlcnNhbChpX3NyYykKCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMzogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfc3RvcmFnZXMoaV9zdG9yYWdlcykgewogICAgcHJpbnQoImFsbG93X3NhbmRib3hfc3RvcmFnZXM6IGlfc3RvcmFnZXMgPSIsIGlfc3RvcmFnZXMpCgogICAgcF9zdG9yYWdlcyA6PSBwb2xpY3lfZGF0YS5zYW5kYm94LnN0b3JhZ2VzCiAgICBldmVyeSBpX3N0b3JhZ2UgaW4gaV9zdG9yYWdlcyB7CiAgICAgICAgYWxsb3dfc2FuZGJveF9zdG9yYWdlKHBfc3RvcmFnZXMsIGlfc3RvcmFnZSkKICAgIH0KCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9zdG9yYWdlczogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfc3RvcmFnZShwX3N0b3JhZ2VzLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IGlfc3RvcmFnZSA9IiwgaV9zdG9yYWdlKQoKICAgIHNvbWUgcF9zdG9yYWdlIGluIHBfc3RvcmFnZXMKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IHBfc3RvcmFnZSA9IiwgcF9zdG9yYWdlKQogICAgaV9zdG9yYWdlID09IHBfc3RvcmFnZQoKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IHRydWUiKQp9CgpDb3B5RmlsZVJlcXVlc3QgewogICAgcHJpbnQoIkNvcHlGaWxlUmVxdWVzdDogaW5wdXQucGF0aCA9IiwgaW5wdXQucGF0aCkKCiAgICBjaGVja19zeW1saW5rX3NvdXJjZShpbnB1dC5zeW1saW5rX3NyYykKICAgIGNoZWNrX2RpcmVjdG9yeV90cmF2ZXJzYWwoaW5wdXQucGF0aCkKCiAgICBzb21lIHJlZ2V4MSBpbiBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLkNvcHlGaWxlUmVxdWVzdAogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5jcGF0aCkKICAgIHJlZ2V4NCA6PSByZXBsYWNlKHJlZ2V4MywgIiQoYnVuZGxlLWlkKSIsIEJVTkRMRV9JRCkKICAgIHByaW50KCJDb3B5RmlsZVJlcXVlc3Q6IHJlZ2V4NCA9IiwgcmVnZXg0KQoKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4NCwgaW5wdXQucGF0aCkKCiAgICBwcmludCgiQ29weUZpbGVSZXF1ZXN0OiB0cnVlIikKfQoKQ3JlYXRlU2FuZGJveFJlcXVlc3QgewogICAgcHJpbnQoIkNyZWF0ZVNhbmRib3hSZXF1ZXN0OiBpbnB1dC5ndWVzdF9ob29rX3BhdGggPSIsIGlucHV0Lmd1ZXN0X2hvb2tfcGF0aCkKICAgIGNvdW50KGlucHV0Lmd1ZXN0X2hvb2tfcGF0aCkgPT0gMAoKICAgIHByaW50KCJDcmVhdGVTYW5kYm94UmVxdWVzdDogaW5wdXQua2VybmVsX21vZHVsZXMgPSIsIGlucHV0Lmtlcm5lbF9tb2R1bGVzKQogICAgY291bnQoaW5wdXQua2VybmVsX21vZHVsZXMpID09IDAKCiAgICBpX3BpZG5zIDo9IGlucHV0LnNhbmRib3hfcGlkbnMKICAgIHByaW50KCJDcmVhdGVTYW5kYm94UmVxdWVzdDogaV9waWRucyA9IiwgaV9waWRucykKICAgIGlfcGlkbnMgPT0gZmFsc2UKICAgIGFsbG93X3NhbmRib3hfc3RvcmFnZXMoaW5wdXQuc3RvcmFnZXMpCn0KCmFsbG93X2V4ZWMocF9jb250YWluZXIsIGlfcHJvY2VzcykgewogICAgcHJpbnQoImFsbG93X2V4ZWM6IHN0YXJ0IikKCiAgICBwX29jaSA9IHBfY29udGFpbmVyLk9DSQogICAgcF9zX25hbWUgPSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc19uYW1lc3BhY2UgPSBnZXRfc3RhdGVfdmFsKCJuYW1lc3BhY2UiKQogICAgYWxsb3dfcHJvYmVfcHJvY2VzcyhwX29jaS5Qcm9jZXNzLCBpX3Byb2Nlc3MsIHBfc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfZXhlYzogdHJ1ZSIpCn0KCmFsbG93X2ludGVyYWN0aXZlX2V4ZWMocF9jb250YWluZXIsIGlfcHJvY2VzcykgewogICAgcHJpbnQoImFsbG93X2ludGVyYWN0aXZlX2V4ZWM6IHN0YXJ0IikKCiAgICBwX29jaSA9IHBfY29udGFpbmVyLk9DSQogICAgcF9zX25hbWUgPSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc19uYW1lc3BhY2UgPSBnZXRfc3RhdGVfdmFsKCJuYW1lc3BhY2UiKQogICAgYWxsb3dfaW50ZXJhY3RpdmVfcHJvY2VzcyhwX29jaS5Qcm9jZXNzLCBpX3Byb2Nlc3MsIHBfc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfaW50ZXJhY3RpdmVfZXhlYzogdHJ1ZSIpCn0KCiMgVE9ETzogc2hvdWxkIG90aGVyIEV4ZWNQcm9jZXNzUmVxdWVzdCBpbnB1dCBkYXRhIGZpZWxkcyBiZSB2YWxpZGF0ZWQgYXMgd2VsbD8KRXhlY1Byb2Nlc3NSZXF1ZXN0IHsKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMTogaW5wdXQgPSIsIGlucHV0KQoKICAgIHNvbWUgcF9jb21tYW5kIGluIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuRXhlY1Byb2Nlc3NSZXF1ZXN0LmFsbG93ZWRfY29tbWFuZHMKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMTogcF9jb21tYW5kID0iLCBwX2NvbW1hbmQpCiAgICBwX2NvbW1hbmQgPT0gaW5wdXQucHJvY2Vzcy5BcmdzCgogICAgIyBUT0RPOiBtYXRjaCBwX2NvbnRhaW5lcidzIElEIHdpdGggdGhlIGlucHV0IGNvbnRhaW5lcl9pZC4KICAgIHNvbWUgcF9jb250YWluZXIgaW4gcG9saWN5X2RhdGEuY29udGFpbmVycwogICAgYWxsb3dfaW50ZXJhY3RpdmVfZXhlYyhwX2NvbnRhaW5lciwgaW5wdXQucHJvY2VzcykKCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDE6IHRydWUiKQp9CkV4ZWNQcm9jZXNzUmVxdWVzdCB7CiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDI6IGlucHV0ID0iLCBpbnB1dCkKCiAgICAjIFRPRE86IG1hdGNoIGlucHV0IGNvbnRhaW5lciBJRCB3aXRoIGl0cyBjb3JyZXNwb25kaW5nIGNvbnRhaW5lci5leGVjX2NvbW1hbmRzLgogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBzb21lIHBfY29tbWFuZCBpbiBwX2NvbnRhaW5lci5leGVjX2NvbW1hbmRzCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDI6IHBfY29tbWFuZCA9IiwgcF9jb21tYW5kKQoKICAgICMgVE9ETzogc2hvdWxkIG90aGVyIGlucHV0IGRhdGEgZmllbGRzIGJlIHZhbGlkYXRlZCBhcyB3ZWxsPwogICAgcF9jb21tYW5kID09IGlucHV0LnByb2Nlc3MuQXJncwoKICAgIGFsbG93X2V4ZWMocF9jb250YWluZXIsIGlucHV0LnByb2Nlc3MpCgogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAyOiB0cnVlIikKfQpFeGVjUHJvY2Vzc1JlcXVlc3QgewogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAzOiBpbnB1dCA9IiwgaW5wdXQpCgogICAgaV9jb21tYW5kID0gY29uY2F0KCIgIiwgaW5wdXQucHJvY2Vzcy5BcmdzKQogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAzOiBpX2NvbW1hbmQgPSIsIGlfY29tbWFuZCkKCiAgICBzb21lIHBfcmVnZXggaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5FeGVjUHJvY2Vzc1JlcXVlc3QucmVnZXgKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMzogcF9yZWdleCA9IiwgcF9yZWdleCkKCiAgICByZWdleC5tYXRjaChwX3JlZ2V4LCBpX2NvbW1hbmQpCgogICAgIyBUT0RPOiBtYXRjaCBwX2NvbnRhaW5lcidzIElEIHdpdGggdGhlIGlucHV0IGNvbnRhaW5lcl9pZC4KICAgIHNvbWUgcF9jb250YWluZXIgaW4gcG9saWN5X2RhdGEuY29udGFpbmVycwogICAgYWxsb3dfaW50ZXJhY3RpdmVfZXhlYyhwX2NvbnRhaW5lciwgaW5wdXQucHJvY2VzcykKCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDM6IHRydWUiKQp9CgpVcGRhdGVSb3V0ZXNSZXF1ZXN0IHsKICAgIHByaW50KCJVcGRhdGVSb3V0ZXNSZXF1ZXN0OiBpbnB1dCA9IiwgaW5wdXQpCiAgICBwcmludCgiVXBkYXRlUm91dGVzUmVxdWVzdDogcG9saWN5ID0iLCBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLlVwZGF0ZVJvdXRlc1JlcXVlc3QpCgogICAgaV9yb3V0ZXMgOj0gaW5wdXQucm91dGVzLlJvdXRlcwogICAgcF9zb3VyY2VfcmVnZXggPSBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLlVwZGF0ZVJvdXRlc1JlcXVlc3QuZm9yYmlkZGVuX3NvdXJjZV9yZWdleAogICAgcF9uYW1lcyA9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuVXBkYXRlUm91dGVzUmVxdWVzdC5mb3JiaWRkZW5fZGV2aWNlX25hbWVzCgogICAgZXZlcnkgaV9yb3V0ZSBpbiBpX3JvdXRlcyB7CiAgICAgICAgcHJpbnQoImlfcm91dGUuc291cmNlID0iLCBpX3JvdXRlLnNvdXJjZSkKICAgICAgICBldmVyeSBwX3JlZ2V4IGluIHBfc291cmNlX3JlZ2V4IHsKICAgICAgICAgICAgcHJpbnQoInBfcmVnZXggPSIsIHBfcmVnZXgpCiAgICAgICAgICAgIG5vdCByZWdleC5tYXRjaChwX3JlZ2V4LCBpX3JvdXRlLnNvdXJjZSkKICAgICAgICB9CgogICAgICAgIHByaW50KCJpX3JvdXRlLmRldmljZSA9IiwgaV9yb3V0ZS5kZXZpY2UpCiAgICAgICAgbm90IGlfcm91dGUuZGV2aWNlIGluIHBfbmFtZXMKICAgIH0KCiAgICBwcmludCgiVXBkYXRlUm91dGVzUmVxdWVzdDogdHJ1ZSIpCn0KClVwZGF0ZUludGVyZmFjZVJlcXVlc3QgewogICAgcHJpbnQoIlVwZGF0ZUludGVyZmFjZVJlcXVlc3Q6IGlucHV0ID0iLCBpbnB1dCkKICAgIHByaW50KCJVcGRhdGVJbnRlcmZhY2VSZXF1ZXN0OiBwb2xpY3kgPSIsIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuVXBkYXRlSW50ZXJmYWNlUmVxdWVzdCkKCiAgICBpX2ludGVyZmFjZSA6PSBpbnB1dC5pbnRlcmZhY2UKICAgIHBfZmxhZ3MgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmFsbG93X3Jhd19mbGFncwoKICAgICMgVHlwaWNhbGx5LCBqdXN0IElGRl9OT0FSUCBpcyB1c2VkLgogICAgYml0cy5hbmQoaV9pbnRlcmZhY2UucmF3X2ZsYWdzLCBiaXRzLm5lZ2F0ZShwX2ZsYWdzKSkgPT0gMAoKICAgIHBfbmFtZXMgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmZvcmJpZGRlbl9uYW1lcwoKICAgIG5vdCBpX2ludGVyZmFjZS5uYW1lIGluIHBfbmFtZXMKCiAgICBwX2h3YWRkcnMgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmZvcmJpZGRlbl9od19hZGRycwoKICAgIG5vdCBpX2ludGVyZmFjZS5od0FkZHIgaW4gcF9od2FkZHJzCgogICAgcHJpbnQoIlVwZGF0ZUludGVyZmFjZVJlcXVlc3Q6IHRydWUiKQp9CgpDbG9zZVN0ZGluUmVxdWVzdCB7CiAgICBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLkNsb3NlU3RkaW5SZXF1ZXN0ID09IHRydWUKfQoKUmVhZFN0cmVhbVJlcXVlc3QgewogICAgcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5SZWFkU3RyZWFtUmVxdWVzdCA9PSB0cnVlCn0KClVwZGF0ZUVwaGVtZXJhbE1vdW50c1JlcXVlc3QgewogICAgcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVFcGhlbWVyYWxNb3VudHNSZXF1ZXN0ID09IHRydWUKfQoKV3JpdGVTdHJlYW1SZXF1ZXN0IHsKICAgIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuV3JpdGVTdHJlYW1SZXF1ZXN0ID09IHRydWUKfQoKcG9saWN5X2RhdGEgOj0gewogICJjb250YWluZXJzIjogWwogICAgewogICAgICAiT0NJIjogewogICAgICAgICJWZXJzaW9uIjogIjEuMS4wLXJjLjEiLAogICAgICAgICJQcm9jZXNzIjogewogICAgICAgICAgIlRlcm1pbmFsIjogZmFsc2UsCiAgICAgICAgICAiVXNlciI6IHsKICAgICAgICAgICAgIlVJRCI6IDY1NTM1LAogICAgICAgICAgICAiR0lEIjogNjU1MzUsCiAgICAgICAgICAgICJBZGRpdGlvbmFsR2lkcyI6IFtdLAogICAgICAgICAgICAiVXNlcm5hbWUiOiAiIgogICAgICAgICAgfSwKICAgICAgICAgICJEZXByZWNhdGVkQXJncyI6IFsKICAgICAgICAgICAgIi9wYXVzZSIKICAgICAgICAgIF0sCiAgICAgICAgICAiQXJncyI6IFsKICAgICAgICAgICAgIi9wYXVzZSIKICAgICAgICAgIF0sCiAgICAgICAgICAiRW52IjogWwogICAgICAgICAgICAiUEFUSD0vdXNyL2xvY2FsL3NiaW46L3Vzci9sb2NhbC9iaW46L3Vzci9zYmluOi91c3IvYmluOi9zYmluOi9iaW4iCiAgICAgICAgICBdLAogICAgICAgICAgIkN3ZCI6ICIvIiwKICAgICAgICAgICJDYXBhYmlsaXRpZXMiOiB7CiAgICAgICAgICAgICJBbWJpZW50IjogW10sCiAgICAgICAgICAgICJCb3VuZGluZyI6IFsKICAgICAgICAgICAgICAiJChkZWZhdWx0X2NhcHMpIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiRWZmZWN0aXZlIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJJbmhlcml0YWJsZSI6IFtdLAogICAgICAgICAgICAiUGVybWl0dGVkIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICAiTm9OZXdQcml2aWxlZ2VzIjogdHJ1ZQogICAgICAgIH0sCiAgICAgICAgIlJvb3QiOiB7CiAgICAgICAgICAiUGF0aCI6ICIkKGNwYXRoKS8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgIlJlYWRvbmx5IjogdHJ1ZQogICAgICAgIH0sCiAgICAgICAgIk1vdW50cyI6IFsKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9wcm9jIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJwcm9jIiwKICAgICAgICAgICAgInR5cGVfIjogInByb2MiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2IiwKICAgICAgICAgICAgInNvdXJjZSI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJzdHJpY3RhdGltZSIsCiAgICAgICAgICAgICAgIm1vZGU9NzU1IiwKICAgICAgICAgICAgICAic2l6ZT02NTUzNmsiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L3B0cyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiZGV2cHRzIiwKICAgICAgICAgICAgInR5cGVfIjogImRldnB0cyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJuZXdpbnN0YW5jZSIsCiAgICAgICAgICAgICAgInB0bXhtb2RlPTA2NjYiLAogICAgICAgICAgICAgICJtb2RlPTA2MjAiLAogICAgICAgICAgICAgICJnaWQ9NSIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvc2htIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L3NobSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi9tcXVldWUiLAogICAgICAgICAgICAic291cmNlIjogIm1xdWV1ZSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJtcXVldWUiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvc3lzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJzeXNmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJzeXNmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2V0Yy9yZXNvbHYuY29uZiIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClyZXNvbHYuY29uZiQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJvIiwKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9kZXYiLAogICAgICAgICAgICAgICJub2V4ZWMiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0KICAgICAgICBdLAogICAgICAgICJBbm5vdGF0aW9ucyI6IHsKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmJ1bmRsZV9wYXRoIjogIi9ydW4vY29udGFpbmVyZC9pby5jb250YWluZXJkLnJ1bnRpbWUudjIudGFzay9rOHMuaW8vJChidW5kbGUtaWQpIiwKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIjogInBvZF9zYW5kYm94IiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSI6ICJzYW5kYm94IiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWlkIjogIl5bYS16MC05XXs2NH0kIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWxvZy1kaXJlY3RvcnkiOiAiXi92YXIvbG9nL3BvZHMvJChzYW5kYm94LW5hbWVzcGFjZSlfJChzYW5kYm94LW5hbWUpX1swLTlhLWZdezh9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezEyfSQiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZXNwYWNlIjogIiIsCiAgICAgICAgICAibmVyZGN0bC9uZXR3b3JrLW5hbWVzcGFjZSI6ICJeL3Zhci9ydW4vbmV0bnMvY25pLVswLTlhLWZdezh9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezEyfSQiCiAgICAgICAgfSwKICAgICAgICAiTGludXgiOiB7CiAgICAgICAgICAiTmFtZXNwYWNlcyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICJUeXBlIjogImlwYyIsCiAgICAgICAgICAgICAgIlBhdGgiOiAiIgogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgIlR5cGUiOiAidXRzIiwKICAgICAgICAgICAgICAiUGF0aCI6ICIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiVHlwZSI6ICJtb3VudCIsCiAgICAgICAgICAgICAgIlBhdGgiOiAiIgogICAgICAgICAgICB9CiAgICAgICAgICBdLAogICAgICAgICAgIk1hc2tlZFBhdGhzIjogWwogICAgICAgICAgICAiL3Byb2MvYWNwaSIsCiAgICAgICAgICAgICIvcHJvYy9hc291bmQiLAogICAgICAgICAgICAiL3Byb2Mva2NvcmUiLAogICAgICAgICAgICAiL3Byb2Mva2V5cyIsCiAgICAgICAgICAgICIvcHJvYy9sYXRlbmN5X3N0YXRzIiwKICAgICAgICAgICAgIi9wcm9jL3RpbWVyX2xpc3QiLAogICAgICAgICAgICAiL3Byb2MvdGltZXJfc3RhdHMiLAogICAgICAgICAgICAiL3Byb2Mvc2NoZWRfZGVidWciLAogICAgICAgICAgICAiL3N5cy9maXJtd2FyZSIsCiAgICAgICAgICAgICIvcHJvYy9zY3NpIgogICAgICAgICAgXSwKICAgICAgICAgICJSZWFkb25seVBhdGhzIjogWwogICAgICAgICAgICAiL3Byb2MvYnVzIiwKICAgICAgICAgICAgIi9wcm9jL2ZzIiwKICAgICAgICAgICAgIi9wcm9jL2lycSIsCiAgICAgICAgICAgICIvcHJvYy9zeXMiLAogICAgICAgICAgICAiL3Byb2Mvc3lzcnEtdHJpZ2dlciIKICAgICAgICAgIF0sCiAgICAgICAgICAiRGV2aWNlcyI6IFtdLAogICAgICAgICAgIlN5c2N0bCI6IHsKICAgICAgICAgICAgIm5ldC5pcHY0LmlwX3VucHJpdmlsZWdlZF9wb3J0X3N0YXJ0IjogIjAiLAogICAgICAgICAgICAibmV0LmlwdjQucGluZ19ncm91cF9yYW5nZSI6ICIwIDIxNDc0ODM2NDciCiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9LAogICAgICAic3RvcmFnZXMiOiBbCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJibGsiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogInRhciIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIiQoaGFzaDApIgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGxheWVyMCkiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJvdmVybGF5ZnMiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogImZ1c2UzLmthdGEtb3ZlcmxheSIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIjVhNWFhZDgwMDU1ZmYyMDAxMmE1MGRjMjVmOGRmN2EyOTkyNDQ3NDMyNGQ2NWY3ZDUzMDZlZThlZTI3ZmY3MWQiLAogICAgICAgICAgICAiODE3MjUwZjFhM2UzMzZkYTc2ZjViZDNmYTc4NGUxYjI2ZDk1OWI5YzEzMTg3NjgxNWJhMjYwNDA0OGI3MGMxOCIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChjcGF0aCkvJChidW5kbGUtaWQpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9CiAgICAgIF0sCiAgICAgICJkZXZpY2VzIjogW10sCiAgICAgICJzYW5kYm94X3BpZG5zIjogZmFsc2UsCiAgICAgICJleGVjX2NvbW1hbmRzIjogW10sCiAgICAgICJlbnZfbWFwIjogewogICAgICAgICJQQVRIIjogIi91c3IvbG9jYWwvc2JpbjovdXNyL2xvY2FsL2JpbjovdXNyL3NiaW46L3Vzci9iaW46L3NiaW46L2JpbiIKICAgICAgfQogICAgfSwKICAgIHsKICAgICAgIk9DSSI6IHsKICAgICAgICAiVmVyc2lvbiI6ICIxLjEuMC1yYy4xIiwKICAgICAgICAiUHJvY2VzcyI6IHsKICAgICAgICAgICJUZXJtaW5hbCI6IGZhbHNlLAogICAgICAgICAgIlVzZXIiOiB7CiAgICAgICAgICAgICJVSUQiOiAwLAogICAgICAgICAgICAiR0lEIjogMCwKICAgICAgICAgICAgIkFkZGl0aW9uYWxHaWRzIjogW10sCiAgICAgICAgICAgICJVc2VybmFtZSI6ICIiCiAgICAgICAgICB9LAogICAgICAgICAgIkRlcHJlY2F0ZWRBcmdzIjogWwogICAgICAgICAgICAiL2Fnbmhvc3QiLAogICAgICAgICAgICAibmV0ZXhlYyIsCiAgICAgICAgICAgICItLWh0dHAtcG9ydD04MDgwIiwKICAgICAgICAgICAgIi0tdGxzLWNlcnQtZmlsZT0vbG9jYWxob3N0LmNydCIsCiAgICAgICAgICAgICItLXRscy1wcml2YXRlLWtleS1maWxlPS9sb2NhbGhvc3Qua2V5IgogICAgICAgICAgXSwKICAgICAgICAgICJBcmdzIjogWwogICAgICAgICAgICAiL2Fnbmhvc3QiLAogICAgICAgICAgICAibmV0ZXhlYyIsCiAgICAgICAgICAgICItLWh0dHAtcG9ydD04MDgwIiwKICAgICAgICAgICAgIi0tdGxzLWNlcnQtZmlsZT0vbG9jYWxob3N0LmNydCIsCiAgICAgICAgICAgICItLXRscy1wcml2YXRlLWtleS1maWxlPS9sb2NhbGhvc3Qua2V5IgogICAgICAgICAgXSwKICAgICAgICAgICJFbnYiOiBbCiAgICAgICAgICAgICJQQVRIPS91c3IvbG9jYWwvc2JpbjovdXNyL2xvY2FsL2JpbjovdXNyL3NiaW46L3Vzci9iaW46L3NiaW46L2JpbiIsCiAgICAgICAgICAgICJIT1NUTkFNRT0kKGhvc3QtbmFtZSkiCiAgICAgICAgICBdLAogICAgICAgICAgIkN3ZCI6ICIvIiwKICAgICAgICAgICJDYXBhYmlsaXRpZXMiOiB7CiAgICAgICAgICAgICJBbWJpZW50IjogW10sCiAgICAgICAgICAgICJCb3VuZGluZyI6IFsKICAgICAgICAgICAgICAiJChkZWZhdWx0X2NhcHMpIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiRWZmZWN0aXZlIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJJbmhlcml0YWJsZSI6IFtdLAogICAgICAgICAgICAiUGVybWl0dGVkIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICAiTm9OZXdQcml2aWxlZ2VzIjogZmFsc2UKICAgICAgICB9LAogICAgICAgICJSb290IjogewogICAgICAgICAgIlBhdGgiOiAiJChjcGF0aCkvJChidW5kbGUtaWQpIiwKICAgICAgICAgICJSZWFkb25seSI6IGZhbHNlCiAgICAgICAgfSwKICAgICAgICAiTW91bnRzIjogWwogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL3Byb2MiLAogICAgICAgICAgICAic291cmNlIjogInByb2MiLAogICAgICAgICAgICAidHlwZV8iOiAicHJvYyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYiLAogICAgICAgICAgICAic291cmNlIjogInRtcGZzIiwKICAgICAgICAgICAgInR5cGVfIjogInRtcGZzIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgInN0cmljdGF0aW1lIiwKICAgICAgICAgICAgICAibW9kZT03NTUiLAogICAgICAgICAgICAgICJzaXplPTY1NTM2ayIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvcHRzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJkZXZwdHMiLAogICAgICAgICAgICAidHlwZV8iOiAiZGV2cHRzIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAgICAgIm5ld2luc3RhbmNlIiwKICAgICAgICAgICAgICAicHRteG1vZGU9MDY2NiIsCiAgICAgICAgICAgICAgIm1vZGU9MDYyMCIsCiAgICAgICAgICAgICAgImdpZD01IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi9zaG0iLAogICAgICAgICAgICAic291cmNlIjogIi9ydW4va2F0YS1jb250YWluZXJzL3NhbmRib3gvc2htIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L21xdWV1ZSIsCiAgICAgICAgICAgICJzb3VyY2UiOiAibXF1ZXVlIiwKICAgICAgICAgICAgInR5cGVfIjogIm1xdWV1ZSIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9zeXMiLAogICAgICAgICAgICAic291cmNlIjogInN5c2ZzIiwKICAgICAgICAgICAgInR5cGVfIjogInN5c2ZzIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAgICAgIm5vZGV2IiwKICAgICAgICAgICAgICAicm8iCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvc3lzL2ZzL2Nncm91cCIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiY2dyb3VwIiwKICAgICAgICAgICAgInR5cGVfIjogImNncm91cCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIsCiAgICAgICAgICAgICAgInJlbGF0aW1lIiwKICAgICAgICAgICAgICAicm8iCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZXRjL2hvc3RzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KWhvc3RzJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJydyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvdGVybWluYXRpb24tbG9nIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KXRlcm1pbmF0aW9uLWxvZyQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicnciCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZXRjL2hvc3RuYW1lIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KWhvc3RuYW1lJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJydyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9ldGMvcmVzb2x2LmNvbmYiLAogICAgICAgICAgICAic291cmNlIjogIiQoc2ZwcmVmaXgpcmVzb2x2LmNvbmYkIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJ3IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL3Zhci9ydW4vc2VjcmV0cy9rdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50IiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KXNlcnZpY2VhY2NvdW50JCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJybyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi92YXIvcnVuL3NlY3JldHMvYXp1cmUvdG9rZW5zIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KXRva2VucyQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicm8iCiAgICAgICAgICAgIF0KICAgICAgICAgIH0KICAgICAgICBdLAogICAgICAgICJBbm5vdGF0aW9ucyI6IHsKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmJ1bmRsZV9wYXRoIjogIi9ydW4vY29udGFpbmVyZC9pby5jb250YWluZXJkLnJ1bnRpbWUudjIudGFzay9rOHMuaW8vJChidW5kbGUtaWQpIiwKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIjogInBvZF9jb250YWluZXIiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLmNvbnRhaW5lci1uYW1lIjogImVjaG9oZWFkZXJzLWh0dHBzIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSI6ICJjb250YWluZXIiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLmltYWdlLW5hbWUiOiAicmVnaXN0cnkuazhzLmlvL2UyZS10ZXN0LWltYWdlcy9hZ25ob3N0OjIuNDEiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtaWQiOiAiXlthLXowLTldezY0fSQiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZXNwYWNlIjogIiIKICAgICAgICB9LAogICAgICAgICJMaW51eCI6IHsKICAgICAgICAgICJOYW1lc3BhY2VzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgIlR5cGUiOiAiaXBjIiwKICAgICAgICAgICAgICAiUGF0aCI6ICIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiVHlwZSI6ICJ1dHMiLAogICAgICAgICAgICAgICJQYXRoIjogIiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJUeXBlIjogIm1vdW50IiwKICAgICAgICAgICAgICAiUGF0aCI6ICIiCiAgICAgICAgICAgIH0KICAgICAgICAgIF0sCiAgICAgICAgICAiTWFza2VkUGF0aHMiOiBbCiAgICAgICAgICAgICIvcHJvYy9hY3BpIiwKICAgICAgICAgICAgIi9wcm9jL2tjb3JlIiwKICAgICAgICAgICAgIi9wcm9jL2tleXMiLAogICAgICAgICAgICAiL3Byb2MvbGF0ZW5jeV9zdGF0cyIsCiAgICAgICAgICAgICIvcHJvYy90aW1lcl9saXN0IiwKICAgICAgICAgICAgIi9wcm9jL3RpbWVyX3N0YXRzIiwKICAgICAgICAgICAgIi9wcm9jL3NjaGVkX2RlYnVnIiwKICAgICAgICAgICAgIi9wcm9jL3Njc2kiLAogICAgICAgICAgICAiL3N5cy9maXJtd2FyZSIKICAgICAgICAgIF0sCiAgICAgICAgICAiUmVhZG9ubHlQYXRocyI6IFsKICAgICAgICAgICAgIi9wcm9jL2Fzb3VuZCIsCiAgICAgICAgICAgICIvcHJvYy9idXMiLAogICAgICAgICAgICAiL3Byb2MvZnMiLAogICAgICAgICAgICAiL3Byb2MvaXJxIiwKICAgICAgICAgICAgIi9wcm9jL3N5cyIsCiAgICAgICAgICAgICIvcHJvYy9zeXNycS10cmlnZ2VyIgogICAgICAgICAgXSwKICAgICAgICAgICJEZXZpY2VzIjogW10sCiAgICAgICAgICAiU3lzY3RsIjogewogICAgICAgICAgICAibmV0LmlwdjQuaXBfdW5wcml2aWxlZ2VkX3BvcnRfc3RhcnQiOiAiMCIsCiAgICAgICAgICAgICJuZXQuaXB2NC5waW5nX2dyb3VwX3JhbmdlIjogIjAgMjE0NzQ4MzY0NyIKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0sCiAgICAgICJzdG9yYWdlcyI6IFsKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoMCkiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXIwKSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoMSkiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXIxKSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoMikiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXIyKSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoMykiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXIzKSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoNCkiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXI0KSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoNSkiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXI1KSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoNikiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXI2KSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoNykiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXI3KSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoOCkiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXI4KSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogIm92ZXJsYXlmcyIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAiZnVzZTMua2F0YS1vdmVybGF5IiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiMmQxMDdkMjc4NTE3YTA2MWFmNjEwYjkzODRkMmM2YTE3OTkzNzUzOTUyNTNmMWE1NmZjMzk2NmIzMmUyNDliMjplZjEyMTAwYzQzZDgwMzY4ZjRiNWE0NDA3MTc2ZjBhMGY2YzIyYjUxYjU3ODlhMWUyOTZjOGExOWYzMmRkMjlhOjI5MDcyYjMzYzVhNzdiNGZmYjc0MWUxMTc4OGE5NzRmOTk2ZTM0NjY2YzdlZWQyOWRiYjNkYjk4ZDEyM2U5Mzg6NDQ1M2I5NzY0ZWNkYTgzNWEzYjJhZWY4NWRmZjM3MTI3MjcyOGU5MDdmMDcwYTBlNTAxNjIwZGM5MDk0YzM2Mzo3YzE1M2VhNzMzMTlmNGNjYTc3NzgxMjg1NzU5NjQ3ZDQzMTQzMWI2MWIxYzllYTljMDE3YTM1MDgxMGJjNjgxOmZmNWYyMzE1MTFhYzZkNWJjZjNiNjdmOGQ1ZGY3YzFmMDg4YzUxNjJkZDM0NDMwYmM2MDVlMjJjNjA2NGQ2OTU6NzAzYjI3YmUzYTcwMTI2MDMzN2Q1MjUxMDgwMmIzNmM1NWFlOWQ4MDNmN2QzMWYzYTg1OGM4YzViNzg3NjI4ZjpiNTY5YjUyZDA2OGQyOGQ2OGVhOWVjNTkzODMyNmE0OWI0NjU2MTVkZjc3YzRhYzhmYmRiOTNkNjYwOTJhMTE5OmRhNTk4MGE3ZTM0MzQ0MDlkYTEyMzI0MTdhMWQxY2MwMjk2N2I2MmEwOTk1MDJjYWNkMTNjYzJlMzQyMDZmYTQiLAogICAgICAgICAgICAiNDNkZjZmNTQ4YzFjY2JmODNhNzg2YjY5NGFjZGNjOTllODBlNTU1ZWNlMTdlOWNlZDU0OGZlNjcwNTE2MTQzMzpkZTJiN2Q2YTFmNjNiOWM3ZDVmNmExNDAyZGI1MGU4MjFiMzgxMTI0ZTk5NTk3YTVjZmFkOTgwNWJmYmE2OGUxOjM2YjlkYTFhNDE3ZDc4ZTg1NjhkNDNlNDM4NTg1Y2Q5ODJhOWZkOTdlZmJlMTFmOGM3ZWUzYzEzMTkyNmIxZWE6MmJiOGI2NjU3ZmFhNmVhMzkxYTUwODcwMjNmOTUyYjI4MGQzMGFmZjc1MTYxYWFkN2I5MDU3YzU3ODFhMjgxOTo0MWFhODdmMzA1ZGZmNmUyNTZjMDY2ZjQxOTUxMDgzOThmZGZmMDI4MWIyMDk5YTZhMWNkNGM4ZTdhNTI2NmNhOjhkZjdiOWEwNmY0MTI3Mzk1ZWJiN2JjMWY2OWY3YmFlZmM4NmJiY2NmZDRlMDc2NzFhMDM1MzVlZmEwZDExNDU6YjExZWMyMjkwNTk3NTk3MTM1YTkxZGY4NDgxMjg3NDdiYTc2OGFkM2ZjYWYwYmI3NTBiMjkyMTZlMmUzYzJkMTo3ZmE4ZGFmY2FiZWQ0YzY5ODI1YzNlY2FkNDllMTdhYTRkZjUwNmY2Zjk4N2EzZDYyNzM5ODkwMzVjMWI4NjYzOjI1NGM1MzE0ODczYzI3YThkZTNkYjUzNDdmNTZlYmQ5ZWIyYmY0NmNjODgxMmE0MzYxMWY5OGUzOGFjMzdiYTIiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQoY3BhdGgpLyQoYnVuZGxlLWlkKSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfQogICAgICBdLAogICAgICAiZGV2aWNlcyI6IFtdLAogICAgICAic2FuZGJveF9waWRucyI6IGZhbHNlLAogICAgICAiZXhlY19jb21tYW5kcyI6IFtdLAogICAgICAiZW52X21hcCI6IHsKICAgICAgICAiSE9TVE5BTUUiOiAiJChob3N0LW5hbWUpIiwKICAgICAgICAiUEFUSCI6ICIvdXNyL2xvY2FsL3NiaW46L3Vzci9sb2NhbC9iaW46L3Vzci9zYmluOi91c3IvYmluOi9zYmluOi9iaW4iCiAgICAgIH0KICAgIH0KICBdLAogICJjb21tb24iOiB7CiAgICAiY3BhdGgiOiAiL3J1bi9rYXRhLWNvbnRhaW5lcnMvc2hhcmVkL2NvbnRhaW5lcnMiLAogICAgIm1vdW50X3NvdXJjZV9jcGF0aCI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zaGFyZWQvY29udGFpbmVycyIsCiAgICAic2ZwcmVmaXgiOiAiXiQoY3BhdGgpLyQoYnVuZGxlLWlkKS1bYS16MC05XXsxNn0tIiwKICAgICJzcGF0aCI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L3N0b3JhZ2UiLAogICAgImlwdjRfYSI6ICIoKFswLTldfFsxLTldWzAtOV18MVswLTldezJ9fDJbMC00XVswLTldfDI1WzAtNV0pXFwuKXszfShbMC05XXxbMS05XVswLTldfDFbMC05XXsyfXwyWzAtNF1bMC05XXwyNVswLTVdKSIsCiAgICAiaXBfcCI6ICJbMC05XXsxLDV9IiwKICAgICJzdmNfbmFtZSI6ICJbQS1aX1xcLlxcLV0rIiwKICAgICJkbnNfbGFiZWwiOiAiW2EtekEtWjAtOV9cXC5cXC1dKyIsCiAgICAic19zb3VyY2UxIjogIl4uLjJbMC05XXszfV9bMC0xXVswLTldX1swLTNdWzAtOV1fWzAtMl1bMC05XV9bMC01XVswLTldX1swLTVdWzAtOV1cXC5bMC05XXsxLDEwfSQiLAogICAgInNfc291cmNlMiI6ICJeLi5kYXRhLyIsCiAgICAiZG5zX3N1YmRvbWFpbiI6ICJeW2EtejAtOV0oWy1hLXowLTldKlthLXowLTldKT8kIiwKICAgICJwb2RfdWlkIjogIl5bMC05YS1mQS1GXXs4fS1bMC05YS1mQS1GXXs0fS1bMC05YS1mQS1GXXs0fS1bMC05YS1mQS1GXXs0fS1bMC05YS1mQS1GXXsxMn0kIiwKICAgICJkZWZhdWx0X2NhcHMiOiBbCiAgICAgICJDQVBfQ0hPV04iLAogICAgICAiQ0FQX0RBQ19PVkVSUklERSIsCiAgICAgICJDQVBfRlNFVElEIiwKICAgICAgIkNBUF9GT1dORVIiLAogICAgICAiQ0FQX01LTk9EIiwKICAgICAgIkNBUF9ORVRfUkFXIiwKICAgICAgIkNBUF9TRVRHSUQiLAogICAgICAiQ0FQX1NFVFVJRCIsCiAgICAgICJDQVBfU0VURkNBUCIsCiAgICAgICJDQVBfU0VUUENBUCIsCiAgICAgICJDQVBfTkVUX0JJTkRfU0VSVklDRSIsCiAgICAgICJDQVBfU1lTX0NIUk9PVCIsCiAgICAgICJDQVBfS0lMTCIsCiAgICAgICJDQVBfQVVESVRfV1JJVEUiCiAgICBdLAogICAgInByaXZpbGVnZWRfY2FwcyI6IFsKICAgICAgIkNBUF9DSE9XTiIsCiAgICAgICJDQVBfREFDX09WRVJSSURFIiwKICAgICAgIkNBUF9EQUNfUkVBRF9TRUFSQ0giLAogICAgICAiQ0FQX0ZPV05FUiIsCiAgICAgICJDQVBfRlNFVElEIiwKICAgICAgIkNBUF9LSUxMIiwKICAgICAgIkNBUF9TRVRHSUQiLAogICAgICAiQ0FQX1NFVFVJRCIsCiAgICAgICJDQVBfU0VUUENBUCIsCiAgICAgICJDQVBfTElOVVhfSU1NVVRBQkxFIiwKICAgICAgIkNBUF9ORVRfQklORF9TRVJWSUNFIiwKICAgICAgIkNBUF9ORVRfQlJPQURDQVNUIiwKICAgICAgIkNBUF9ORVRfQURNSU4iLAogICAgICAiQ0FQX05FVF9SQVciLAogICAgICAiQ0FQX0lQQ19MT0NLIiwKICAgICAgIkNBUF9JUENfT1dORVIiLAogICAgICAiQ0FQX1NZU19NT0RVTEUiLAogICAgICAiQ0FQX1NZU19SQVdJTyIsCiAgICAgICJDQVBfU1lTX0NIUk9PVCIsCiAgICAgICJDQVBfU1lTX1BUUkFDRSIsCiAgICAgICJDQVBfU1lTX1BBQ0NUIiwKICAgICAgIkNBUF9TWVNfQURNSU4iLAogICAgICAiQ0FQX1NZU19CT09UIiwKICAgICAgIkNBUF9TWVNfTklDRSIsCiAgICAgICJDQVBfU1lTX1JFU09VUkNFIiwKICAgICAgIkNBUF9TWVNfVElNRSIsCiAgICAgICJDQVBfU1lTX1RUWV9DT05GSUciLAogICAgICAiQ0FQX01LTk9EIiwKICAgICAgIkNBUF9MRUFTRSIsCiAgICAgICJDQVBfQVVESVRfV1JJVEUiLAogICAgICAiQ0FQX0FVRElUX0NPTlRST0wiLAogICAgICAiQ0FQX1NFVEZDQVAiLAogICAgICAiQ0FQX01BQ19PVkVSUklERSIsCiAgICAgICJDQVBfTUFDX0FETUlOIiwKICAgICAgIkNBUF9TWVNMT0ciLAogICAgICAiQ0FQX1dBS0VfQUxBUk0iLAogICAgICAiQ0FQX0JMT0NLX1NVU1BFTkQiLAogICAgICAiQ0FQX0FVRElUX1JFQUQiLAogICAgICAiQ0FQX1BFUkZNT04iLAogICAgICAiQ0FQX0JQRiIsCiAgICAgICJDQVBfQ0hFQ0tQT0lOVF9SRVNUT1JFIgogICAgXSwKICAgICJ2aXJ0aW9fYmxrX3N0b3JhZ2VfY2xhc3NlcyI6IFsKICAgICAgImNjLWxvY2FsLWNzaSIsCiAgICAgICJjYy1tYW5hZ2VkLWNzaSIsCiAgICAgICJjYy1tYW5hZ2VkLXByZW1pdW0tY3NpIgogICAgXSwKICAgICJzbWJfc3RvcmFnZV9jbGFzc2VzIjogWwogICAgICB7CiAgICAgICAgIm5hbWUiOiAiYXp1cmVmaWxlLWNzaS1rYXRhLWNjIiwKICAgICAgICAibW91bnRfb3B0aW9ucyI6IFsKICAgICAgICAgICJkaXJfbW9kZT0wNzc3IiwKICAgICAgICAgICJmaWxlX21vZGU9MDc3NyIsCiAgICAgICAgICAibWZzeW1saW5rcyIsCiAgICAgICAgICAiY2FjaGU9c3RyaWN0IiwKICAgICAgICAgICJub3NoYXJlc29jayIsCiAgICAgICAgICAiYWN0aW1lbz0zMCIsCiAgICAgICAgICAibm9icmwiCiAgICAgICAgXQogICAgICB9CiAgICBdCiAgfSwKICAic2FuZGJveCI6IHsKICAgICJzdG9yYWdlcyI6IFsKICAgICAgewogICAgICAgICJkcml2ZXIiOiAiZXBoZW1lcmFsIiwKICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAic291cmNlIjogInNobSIsCiAgICAgICAgImZzdHlwZSI6ICJ0bXBmcyIsCiAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgIm5vZGV2IiwKICAgICAgICAgICJtb2RlPTE3NzciLAogICAgICAgICAgInNpemU9NjcxMDg4NjQiCiAgICAgICAgXSwKICAgICAgICAibW91bnRfcG9pbnQiOiAiL3J1bi9rYXRhLWNvbnRhaW5lcnMvc2FuZGJveC9zaG0iLAogICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgfQogICAgXQogIH0sCiAgInJlcXVlc3RfZGVmYXVsdHMiOiB7CiAgICAiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdCI6IHsKICAgICAgImFsbG93X2Vudl9yZWdleCI6IFsKICAgICAgICAiXkhPU1ROQU1FPSQoZG5zX2xhYmVsKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfUE9SVF8kKGlwX3ApX1RDUD10Y3A6Ly8kKGlwdjRfYSk6JChpcF9wKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfUE9SVF8kKGlwX3ApX1RDUF9QUk9UTz10Y3AkIiwKICAgICAgICAiXiQoc3ZjX25hbWUpX1BPUlRfJChpcF9wKV9UQ1BfUE9SVD0kKGlwX3ApJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9QT1JUXyQoaXBfcClfVENQX0FERFI9JChpcHY0X2EpJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9TRVJWSUNFX0hPU1Q9JChpcHY0X2EpJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9TRVJWSUNFX1BPUlQ9JChpcF9wKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfU0VSVklDRV9QT1JUXyQoZG5zX2xhYmVsKT0kKGlwX3ApJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9QT1JUPXRjcDovLyQoaXB2NF9hKTokKGlwX3ApJCIsCiAgICAgICAgIl5BWlVSRV9DTElFTlRfSUQ9W0EtRmEtZjAtOS1dKiQiLAogICAgICAgICJeQVpVUkVfVEVOQU5UX0lEPVtBLUZhLWYwLTktXSokIiwKICAgICAgICAiXkFaVVJFX0ZFREVSQVRFRF9UT0tFTl9GSUxFPS92YXIvcnVuL3NlY3JldHMvYXp1cmUvdG9rZW5zL2F6dXJlLWlkZW50aXR5LXRva2VuJCIsCiAgICAgICAgIl5BWlVSRV9BVVRIT1JJVFlfSE9TVD1odHRwczovL2xvZ2luXFwubWljcm9zb2Z0b25saW5lXFwuY29tLyQiLAogICAgICAgICJeVEVSTT14dGVybSQiCiAgICAgIF0sCiAgICAgICJhbGxvd19lbnZfcmVnZXhfbWFwIjogewogICAgICAgICJDUFVfTElNSVQiOiAiXlswLTldKyQiLAogICAgICAgICJKT0JfQ09NUExFVElPTl9JTkRFWCI6ICJeWzAtOV0qJCIsCiAgICAgICAgIk1FTU9SWV9MSU1JVCI6ICJeWzAtOV0rJCIKICAgICAgfQogICAgfSwKICAgICJDb3B5RmlsZVJlcXVlc3QiOiBbCiAgICAgICIkKHNmcHJlZml4KSIKICAgIF0sCiAgICAiRXhlY1Byb2Nlc3NSZXF1ZXN0IjogewogICAgICAiYWxsb3dlZF9jb21tYW5kcyI6IFtdLAogICAgICAicmVnZXgiOiBbXQogICAgfSwKICAgICJVcGRhdGVSb3V0ZXNSZXF1ZXN0IjogewogICAgICAiZm9yYmlkZGVuX2RldmljZV9uYW1lcyI6IFsKICAgICAgICAibG8iCiAgICAgIF0sCiAgICAgICJmb3JiaWRkZW5fc291cmNlX3JlZ2V4IjogWwogICAgICAgICJeKD86MHswLDR9Oil7MCw3fTB7MCwzfTEkIiwKICAgICAgICAiXjEyN1xcLig/OlswLTldezEsM31cXC4pezJ9WzAtOV17MSwzfSQiCiAgICAgIF0KICAgIH0sCiAgICAiVXBkYXRlSW50ZXJmYWNlUmVxdWVzdCI6IHsKICAgICAgImFsbG93X3Jhd19mbGFncyI6IDEyOCwKICAgICAgImZvcmJpZGRlbl9uYW1lcyI6IFsKICAgICAgICAibG8iCiAgICAgIF0sCiAgICAgICJmb3JiaWRkZW5faHdfYWRkcnMiOiBbCiAgICAgICAgIjAwOjAwOjAwOjAwOjAwOjAwIgogICAgICBdCiAgICB9LAogICAgIkNsb3NlU3RkaW5SZXF1ZXN0IjogZmFsc2UsCiAgICAiUmVhZFN0cmVhbVJlcXVlc3QiOiBmYWxzZSwKICAgICJVcGRhdGVFcGhlbWVyYWxNb3VudHNSZXF1ZXN0IjogZmFsc2UsCiAgICAiV3JpdGVTdHJlYW1SZXF1ZXN0IjogZmFsc2UKICB9Cn0= + spec: + runtimeClassName: kata-cc + containers: + - name: echoheaders-https + image: "registry.k8s.io/e2e-test-images/agnhost:2.41" + command: + - /agnhost + - netexec + - "--http-port=8080" + - "--tls-cert-file=/localhost.crt" + - "--tls-private-key-file=/localhost.key" + ports: + - containerPort: 8080 diff --git a/src/agent/samples/policy/yaml/kubernetes/conformance2/ingress-nginx-rc.yaml b/src/agent/samples/policy/yaml/kubernetes/conformance2/ingress-nginx-rc.yaml new file mode 100644 index 000000000000..0b5d9db79992 --- /dev/null +++ b/src/agent/samples/policy/yaml/kubernetes/conformance2/ingress-nginx-rc.yaml @@ -0,0 +1,83 @@ +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: RoleBinding +metadata: + name: role-binding +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: Role + name: default-role +subjects: + - kind: ServiceAccount + name: default + namespace: default +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: Role +metadata: + name: default-role + namespace: default +rules: + - apiGroups: + - "" + resources: + - pods + verbs: + - get +--- +apiVersion: v1 +kind: ReplicationController +metadata: + name: nginx-ingress-controller + labels: + k8s-app: nginx-ingress-lb +spec: + replicas: 1 + selector: + k8s-app: nginx-ingress-lb + template: + metadata: + labels: + k8s-app: nginx-ingress-lb + name: nginx-ingress-lb + annotations: + io.katacontainers.config.agent.policy: IyBDb3B5cmlnaHQgKGMpIDIwMjMgTWljcm9zb2Z0IENvcnBvcmF0aW9uCiMKIyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMAojCnBhY2thZ2UgYWdlbnRfcG9saWN5CgppbXBvcnQgZnV0dXJlLmtleXdvcmRzLmluCmltcG9ydCBmdXR1cmUua2V5d29yZHMuZXZlcnkKCiMgRGVmYXVsdCB2YWx1ZXMsIHJldHVybmVkIGJ5IE9QQSB3aGVuIHJ1bGVzIGNhbm5vdCBiZSBldmFsdWF0ZWQgdG8gdHJ1ZS4KZGVmYXVsdCBBZGRBUlBOZWlnaGJvcnNSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgQWRkU3dhcFJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBDbG9zZVN0ZGluUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IENvcHlGaWxlUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IENyZWF0ZUNvbnRhaW5lclJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBDcmVhdGVTYW5kYm94UmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IERlc3Ryb3lTYW5kYm94UmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgRXhlY1Byb2Nlc3NSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgR2V0T09NRXZlbnRSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBHdWVzdERldGFpbHNSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBMaXN0SW50ZXJmYWNlc1JlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBMaXN0Um91dGVzUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IE1lbUhvdHBsdWdCeVByb2JlUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IE9ubGluZUNQVU1lbVJlcXVlc3QgOj0gdHJ1ZQpkZWZhdWx0IFBhdXNlQ29udGFpbmVyUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFJlYWRTdHJlYW1SZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgUmVtb3ZlQ29udGFpbmVyUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgUmVtb3ZlU3RhbGVWaXJ0aW9mc1NoYXJlTW91bnRzUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgUmVzZWVkUmFuZG9tRGV2UmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFJlc3VtZUNvbnRhaW5lclJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBTZXRHdWVzdERhdGVUaW1lUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFNldFBvbGljeVJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBTaWduYWxQcm9jZXNzUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgU3RhcnRDb250YWluZXJSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBTdGFydFRyYWNpbmdSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgU3RhdHNDb250YWluZXJSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBTdG9wVHJhY2luZ1JlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBUdHlXaW5SZXNpemVSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBVcGRhdGVDb250YWluZXJSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgVXBkYXRlRXBoZW1lcmFsTW91bnRzUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFVwZGF0ZUludGVyZmFjZVJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBVcGRhdGVSb3V0ZXNSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgV2FpdFByb2Nlc3NSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBXcml0ZVN0cmVhbVJlcXVlc3QgOj0gZmFsc2UKCiMgQWxsb3dSZXF1ZXN0c0ZhaWxpbmdQb2xpY3kgOj0gdHJ1ZSBjb25maWd1cmVzIHRoZSBBZ2VudCB0byAqYWxsb3cgYW55CiMgcmVxdWVzdHMgY2F1c2luZyBhIHBvbGljeSBmYWlsdXJlKi4gVGhpcyBpcyBhbiB1bnNlY3VyZSBjb25maWd1cmF0aW9uCiMgYnV0IGlzIHVzZWZ1bCBmb3IgYWxsb3dpbmcgdW5zZWN1cmUgcG9kcyB0byBzdGFydCwgdGhlbiBjb25uZWN0IHRvCiMgdGhlbSBhbmQgaW5zcGVjdCBPUEEgbG9ncyBmb3IgdGhlIHJvb3QgY2F1c2Ugb2YgYSBmYWlsdXJlLgpkZWZhdWx0IEFsbG93UmVxdWVzdHNGYWlsaW5nUG9saWN5IDo9IGZhbHNlCgojIENvbnN0YW50cwpTX05BTUVfS0VZID0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZSIKU19OQU1FU1BBQ0VfS0VZID0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZXNwYWNlIgpCVU5ETEVfSUQgPSAiW2EtejAtOV17NjR9IgoKQ3JlYXRlQ29udGFpbmVyUmVxdWVzdDo9IHJlc3AgewogICAgbm90IGlzX251bGwoaW5wdXQuZW52X21hcCkKICAgIAogICAgaV9lbnZfbWFwIDo9IGlucHV0LmVudl9tYXAKICAgIAogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBwX2Vudl9tYXAgOj0gcF9jb250YWluZXIuZW52X21hcCAgCiAgICBhbGxvd19lbnZfbWFwKHBfZW52X21hcCwgaV9lbnZfbWFwKQogICAgCiAgICBpX3Byb2Nlc3MgOj0gaW5wdXQuYmFzZS5PQ0kuUHJvY2VzcwogICAgCiAgICBwX3Byb2Nlc3MgOj0gcF9jb250YWluZXIuT0NJLlByb2Nlc3MKICAgIAogICAgYWxsb3dfYXJncyhpX3Byb2Nlc3MsIHBfcHJvY2VzcywgaV9lbnZfbWFwKQoKICAgIHJlc3AgPSBDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uKGlucHV0LmJhc2UpCiAgICBwcmludCgiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdDogdHJ1ZSIpCn0KCmFsbG93X2FyZ3MoaV9wcm9jZXNzLCBwX3Byb2Nlc3MsIGlfZW52X21hcCkgewogICAgaV9hcmdzIDo9IGlfcHJvY2Vzcy5BcmdzCiAgICBwX2FyZ3MgOj0gcF9wcm9jZXNzLkFyZ3MKICAgIHByaW50KCJhbGxvd19hcmdzOiBpX2FyZ3MgPSIsIGlfYXJncywgInBfYXJncyA9IiwgcF9hcmdzKQogICAgY291bnQoaV9hcmdzKSA9PSBjb3VudChwX2FyZ3MpCiAgICBldmVyeSBpLCBpX2FyZyBpbiBpX2FyZ3MgewogICAgICAgIHByaW50KCJhbGxvd19hcmdzOiBpX2FyZyA9IiwgaV9hcmcpCiAgICAgICAgcF9hcmdfcmVwbGFjZWQgOj0gcmVwbGFjZV9lbnZfdmFyaWFibGVzKHBfYXJnc1tpXSwgaV9lbnZfbWFwKQogICAgICAgIHByaW50KCJhbGxvd19hcmdzOiBwX2FyZ19yZXBsYWNlZCA9IiwgcF9hcmdfcmVwbGFjZWQpCiAgICAgICAgcF9hcmdfcmVwbGFjZWQyIDo9IHJlcGxhY2UocF9hcmdfcmVwbGFjZWQsICIkJCIsICIkIikKICAgICAgICBwcmludCgiYWxsb3dfYXJnczogcF9hcmdfcmVwbGFjZWQyID0iLCBwX2FyZ19yZXBsYWNlZDIpCiAgICAgICAgaV9hcmcgPT0gcF9hcmdfcmVwbGFjZWQyCiAgICB9CiAgICBwcmludCgiYWxsb3dfYXJnczogdHJ1ZSIpCn0KCmFsbG93X2FyZ3MoaV9wcm9jZXNzLCBwX3Byb2Nlc3MsIGlfZW52X21hcCkgewogICAgbm90IGlfcHJvY2Vzcy5BcmdzCiAgICBub3QgcF9wcm9jZXNzLkFyZ3MKICAgIHByaW50KCJhbGxvd19hcmdzMjogbm8gYXJncyIpCn0KCiMgdGhpcyBmdW5jdGlvbiByZXBsYWNlcyBhbGwgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyBpbiBhIHN0cmluZywgZ2l2ZW4gYSBtYXAgb2YgZW52aXJvbm1lbnQga2V5cyB0byBlbnZpcm9ubWVudCB2YWx1ZXMKIyBlZyBzdHIgPSAiZWNobyAkKENMVVNURVJfSUQpOyBlY2hvICQoTk9ERV9OQU1FKTsiCiMgZW52X21hcCA9IHsiQ0xVU1RFUl9JRCI6ICJhYmMiLCAiTk9ERV9OQU1FIiA6ICJ4eXoifQojIHJlc3VsdCA9ICJlY2hvIGFiYzsgZWNobyB4eXo7IgpyZXBsYWNlX2Vudl92YXJpYWJsZXMoc3RyLCBlbnZfbWFwKSA9IHJlc3VsdCB7CiAgICAjIG1ha2UgYW4gYXJyYXkgb2YgdGhlIGtleXMgZWcgWyJDTFVTVEVSX0lEIiwgIk5PREVfTkFNRSJdCiAgICBrZXlzIDo9IFt4IHwgc29tZSB4IGluIG9iamVjdC5rZXlzKGVudl9tYXApXQogICAgcmVzdWx0IDo9IHJlcGxhY2Vfc3RyX3JlYyhzdHIsIGVudl9tYXAsIGtleXMsIGNvdW50KGtleXMpIC0gMSkKfQoKIyBiYXNlIGNhc2UKcmVwbGFjZV9zdHJfcmVjKHN0ciwgZW52X21hcCwgYXJyX2tleXMsIGkpID0gcmVzdWx0IHsKICAgIGkgPCAwCiAgICByZXN1bHQgOj0gc3RyCn0KCiMgcmVjdXJzaXZlIHN0ZXAKcmVwbGFjZV9zdHJfcmVjKHN0ciwgZW52X21hcCwgYXJyX2tleXMsIGkpID0gcmVzdWx0IHsKICAgIGkgPj0gMAogICAga2V5IDo9IGFycl9rZXlzW2ldCiAgICBlbnZfa2V5MSA6PSBjb25jYXQoIiIsIFsiJCgiLCBrZXksICIpIl0pCiAgICAjIHJlcGxhY2UgJChWQVIpIHdpdGggdmFsdWUKICAgIG5ld19zdHIxIDo9IHJlcGxhY2Uoc3RyLCBlbnZfa2V5MSwgZW52X21hcFtrZXldKQogICAgIyByZXBsYWNlIG5leHQgZW52aXJvbm1lbnQgdmFyaWFibGUKICAgIHJlc3VsdCA9IHJlcGxhY2Vfc3RyX3JlYyhuZXdfc3RyMSwgZW52X21hcCwgYXJyX2tleXMsIGkgLSAxKQp9CgphbGxvd19lbnZfbWFwKHBfZW52X21hcCwgaV9lbnZfbWFwKSB7CiAgICBwcmludCgiYWxsb3dfZW52X21hcDogcF9lbnZfbWFwID0iLCBwX2Vudl9tYXApCiAgICBldmVyeSBlbnZfa2V5LCBlbnZfdmFsIGluIGlfZW52X21hcCB7CiAgICAgICAgcHJpbnQoImFsbG93X2VudjogZW52X2tleSA9IiwgZW52X2tleSwgImVudl92YWwgPSIsIGVudl92YWwpCiAgICAgICAgYWxsb3dfZW52X21hcF9lbnRyeShlbnZfa2V5LCBlbnZfdmFsLCBwX2Vudl9tYXApCiAgICB9CiAgICBwcmludCgiYWxsb3dfZW52X21hcDogdHJ1ZSIpCn0KCiMgQWxsb3cgZXhhY3QgbWF0Y2gKYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBpX3ZhbCA9PSBwX3ZhbAogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnk6IHRydWUiKQp9CgojIEFsbG93IHJlc291cmNlRmllbGRSZWYgdmFsdWVzIChlLmcuLCAibGltaXRzLmNwdSIpLgphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgICMgYSB2YXJpYWJsZSB3ZSBzaG91bGQgYmUgdmFsaWRhdGluZyB1c2luZyBhIHJlZ2V4IGZyb20gc2V0dGluZ3MKICAgIHBfdmFsID09ICIkKHZhbGlkYXRlLWZyb20tc2V0dGluZ3MpIgogICAgcmVnZXhfdmFsIDo9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuQ3JlYXRlQ29udGFpbmVyUmVxdWVzdC5hbGxvd19lbnZfcmVnZXhfbWFwW2tleV0KICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4X3ZhbCwgaV92YWwpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSAyOiB0cnVlIikKfQoKIyBBbGxvdyBub2RlLW5hbWUKYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChub2RlLW5hbWUpIgogICAgcmVnZXgubWF0Y2gocG9saWN5X2RhdGEuY29tbW9uLmRuc19zdWJkb21haW4gLCBpX3ZhbCkKICAgIHByaW50KCJhbGxvd19lbnZfbWFwX2VudHJ5IDM6IHRydWUiKQp9CgojIEFsbG93IGhvc3QtbmFtZQphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgIHBfdmFsID09ICIkKGhvc3QtbmFtZSkiCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24uZG5zX2xhYmVsICwgaV92YWwpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSA0OiB0cnVlIikKfQoKIyBBbGxvdyBwb2QtdWlkCmFsbG93X2Vudl9tYXBfZW50cnkoa2V5LCBpX3ZhbCwgcF9lbnZfbWFwKSB7CiAgICBwX3ZhbCA6PSBwX2Vudl9tYXBba2V5XQogICAgcF92YWwgPT0gIiQocG9kLXVpZCkiCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24ucG9kX3VpZCAsIGlfdmFsKQogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgNTogdHJ1ZSIpCn0KCiMgQWxsb3cgZmllbGRSZWYgImZpZWxkUGF0aDogc3RhdHVzLnBvZElQIiB2YWx1ZXMuCmFsbG93X2Vudl9tYXBfZW50cnkoa2V5LCBpX3ZhbCwgcF9lbnZfbWFwKSB7CiAgICBpc19pcChpX3ZhbCkKCiAgICBwX3ZhbCA6PSBwX2Vudl9tYXBba2V5XQogICAgcF92YXIgOj0gY29uY2F0KCI9IiwgW2tleSwgcF92YWxdKQogICAgYWxsb3dfcG9kX2lwX3ZhcihrZXksIHBfdmFyKQogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgNjogdHJ1ZSIpCn0KCiMgQWxsb3cgZmllbGRSZWYgImZpZWxkUGF0aDogc3RhdHVzLmhvc3RJUCIgdmFsdWVzLgphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgaXNfaXAoaV92YWwpCgogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgIHBfdmFyIDo9IGNvbmNhdCgiPSIsIFtrZXksIHBfdmFsXSkKICAgIGFsbG93X2hvc3RfaXBfdmFyKGtleSwgcF92YXIpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSA3OiB0cnVlIikKfQoKIyBNYXRjaCBpbnB1dCB3aXRoIG9uZSBvZiB0aGUgcG9saWN5IHZhcmlhYmxlcywgYWZ0ZXIgc3Vic3RpdHV0aW5nICQoc2FuZGJveC1uYW1lKS4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChzYW5kYm94LW5hbWUpIgogICAgc19uYW1lIDo9IGlucHV0LmJhc2UuT0NJLkFubm90YXRpb25zW1NfTkFNRV9LRVldCiAgICBwX3ZhcjIgOj0gcmVwbGFjZShwX3ZhbCwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHBfdmFyMiA9PSBpX3ZhbAogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgODogdHJ1ZSIpCn0KCiMgTWF0Y2ggaW5wdXQgd2l0aCBvbmUgb2YgdGhlIHBvbGljeSB2YXJpYWJsZXMsIGFmdGVyIHN1YnN0aXR1dGluZyAkKHNhbmRib3gtbmFtZXNwYWNlKS4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChzYW5kYm94LW5hbWVzcGFjZSkiCiAgICBzX25hbWVzcGFjZSA6PSBpbnB1dC5iYXNlLk9DSS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwX3ZhcjIgOj0gcmVwbGFjZShwX3ZhbCwgIiQoc2FuZGJveC1uYW1lc3BhY2UpIiwgc19uYW1lc3BhY2UpCiAgICBwX3ZhcjIgPT0gaV92YWwKICAgIHByaW50KCJhbGxvd19lbnZfbWFwX2VudHJ5IDk6IHRydWUiKQp9CgojIEFsbG93IGlucHV0IGVudiB2YXJpYWJsZXMgdGhhdCBtYXRjaCB3aXRoIGEgcmVxdWVzdF9kZWZhdWx0cyByZWdleC4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHNvbWUgcF9yZWdleDEgaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5DcmVhdGVDb250YWluZXJSZXF1ZXN0LmFsbG93X2Vudl9yZWdleAogICAgcF9yZWdleDIgOj0gcmVwbGFjZShwX3JlZ2V4MSwgIiQoaXB2NF9hKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcHY0X2EpCiAgICBwX3JlZ2V4MyA6PSByZXBsYWNlKHBfcmVnZXgyLCAiJChpcF9wKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcF9wKQogICAgcF9yZWdleDQgOj0gcmVwbGFjZShwX3JlZ2V4MywgIiQoc3ZjX25hbWUpIiwgcG9saWN5X2RhdGEuY29tbW9uLnN2Y19uYW1lKQogICAgcF9yZWdleDUgOj0gcmVwbGFjZShwX3JlZ2V4NCwgIiQoZG5zX2xhYmVsKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5kbnNfbGFiZWwpCgogICAgcmVzdWx0IDo9IGNvbmNhdCgiPSIsIFtrZXksIGlfdmFsXSkKICAgIHJlZ2V4Lm1hdGNoKHBfcmVnZXg1LCByZXN1bHQpCgogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgMTA6IHRydWUiKQp9CgpDcmVhdGVDb250YWluZXJSZXF1ZXN0Oj0gcmVzcCB7CiAgICBub3QgaW5wdXQuZW52X21hcAogICAgaV9wcm9jZXNzID0gaW5wdXQuT0NJLlByb2Nlc3MKICAgIHNfbmFtZSA9IGlucHV0Lk9DSS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBwX3Byb2Nlc3MgPSBwX2NvbnRhaW5lci5PQ0kuUHJvY2VzcwogICAgYWxsb3dfZGVwcmVjYXRlZF9hcmdzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUpCiAgICByZXNwID0gQ3JlYXRlQ29udGFpbmVyUmVxdWVzdENvbW1vbihpbnB1dCkKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0MjogdHJ1ZSIpCn0KCkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb24ocmVxKTo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgICMgQ2hlY2sgaWYgdGhlIGlucHV0IHJlcXVlc3Qgc2hvdWxkIGJlIHJlamVjdGVkIGV2ZW4gYmVmb3JlIGNoZWNraW5nIHRoZQogICAgIyBwb2xpY3lfZGF0YS5jb250YWluZXJzIGluZm9ybWF0aW9uLgogICAgYWxsb3dfY3JlYXRlX2NvbnRhaW5lcl9pbnB1dChyZXEpCgogICAgaV9vY2kgOj0gcmVxLk9DSQogICAgaV9zdG9yYWdlcyA6PSByZXEuc3RvcmFnZXMKICAgIGlfZGV2aWNlcyA6PSByZXEuZGV2aWNlcwoKICAgICMgYXJyYXkgb2YgcG9zc2libGUgc3RhdGUgb3BlcmF0aW9ucwogICAgb3BzX2J1aWxkZXIgOj0gW10KCiAgICAjIGNoZWNrIHNhbmRib3ggbmFtZQogICAgc2FuZGJveF9uYW1lID0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FX0tFWV0KICAgIGFkZF9zYW5kYm94X25hbWVfdG9fc3RhdGUgOj0gc3RhdGVfYWxsb3dzKCJzYW5kYm94X25hbWUiLCBzYW5kYm94X25hbWUpCiAgICBvcHNfYnVpbGRlcjEgOj0gY29uY2F0X29wX2lmX25vdF9udWxsKG9wc19idWlsZGVyLCBhZGRfc2FuZGJveF9uYW1lX3RvX3N0YXRlKQoKICAgICMgQ2hlY2sgaWYgYW55IGVsZW1lbnQgZnJvbSB0aGUgcG9saWN5X2RhdGEuY29udGFpbmVycyBhcnJheSBhbGxvd3MgdGhlIGlucHV0IHJlcXVlc3QuCiAgICBzb21lIHBfY29udGFpbmVyIGluIHBvbGljeV9kYXRhLmNvbnRhaW5lcnMKICAgIHByaW50KCI9PT09PT09PSBDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiB0cnlpbmcgbmV4dCBwb2xpY3kgY29udGFpbmVyIikKCiAgICBwX3BpZG5zIDo9IHBfY29udGFpbmVyLnNhbmRib3hfcGlkbnMKICAgIGlfcGlkbnMgOj0gcmVxLnNhbmRib3hfcGlkbnMKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiBwX3BpZG5zID0iLCBwX3BpZG5zLCAiaV9waWRucyA9IiwgaV9waWRucykKICAgIHBfcGlkbnMgPT0gaV9waWRucwoKICAgIHBfb2NpIDo9IHBfY29udGFpbmVyLk9DSQoKICAgICMgY2hlY2sgbmFtZXNwYWNlCiAgICBwX25hbWVzcGFjZSA6PSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBpX25hbWVzcGFjZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwcmludCAoIkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb246IHBfbmFtZXNwYWNlID0iLCBwX25hbWVzcGFjZSwgImlfbmFtZXNwYWNlID0iLCBpX25hbWVzcGFjZSkKICAgIGFkZF9uYW1lc3BhY2VfdG9fc3RhdGUgOj0gYWxsb3dfbmFtZXNwYWNlKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkKICAgIG9wc19idWlsZGVyMiA6PSBjb25jYXRfb3BfaWZfbm90X251bGwob3BzX2J1aWxkZXIxLCBhZGRfbmFtZXNwYWNlX3RvX3N0YXRlKQoKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiBwIFZlcnNpb24gPSIsIHBfb2NpLlZlcnNpb24sICJpIFZlcnNpb24gPSIsIGlfb2NpLlZlcnNpb24pCiAgICBwX29jaS5WZXJzaW9uID09IGlfb2NpLlZlcnNpb24KCiAgICBwcmludCgiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdENvbW1vbjogcCBSZWFkb25seSA9IiwgcF9vY2kuUm9vdC5SZWFkb25seSwgImkgUmVhZG9ubHkgPSIsIGlfb2NpLlJvb3QuUmVhZG9ubHkpCiAgICBwX29jaS5Sb290LlJlYWRvbmx5ID09IGlfb2NpLlJvb3QuUmVhZG9ubHkKCiAgICBhbGxvd19hbm5vKHBfb2NpLCBpX29jaSkKCiAgICBwX3N0b3JhZ2VzIDo9IHBfY29udGFpbmVyLnN0b3JhZ2VzCiAgICBhbGxvd19ieV9hbm5vKHBfb2NpLCBpX29jaSwgcF9zdG9yYWdlcywgaV9zdG9yYWdlcykKCiAgICBwX2RldmljZXMgOj0gcF9jb250YWluZXIuZGV2aWNlcwogICAgYWxsb3dfZGV2aWNlcyhwX2RldmljZXMsIGlfZGV2aWNlcykKCiAgICByZXQgOj0gYWxsb3dfbGludXgob3BzX2J1aWxkZXIyLCBwX29jaSwgaV9vY2kpCiAgICByZXQuYWxsb3dlZAoKICAgIG9wcyA6PSByZXQub3BzCgogICAgcHJpbnQoIkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb246IHRydWUiKQp9CgphbGxvd19jcmVhdGVfY29udGFpbmVyX2lucHV0KHJlcSkgewogICAgcHJpbnQoImFsbG93X2NyZWF0ZV9jb250YWluZXJfaW5wdXQ6IGlucHV0ID0iLCByZXEpCgogICAgY291bnQocmVxLnNoYXJlZF9tb3VudHMpID09IDAKICAgIGlzX251bGwocmVxLnN0cmluZ191c2VyKQoKICAgIGlfb2NpIDo9IHJlcS5PQ0kKICAgIGlzX251bGwoaV9vY2kuSG9va3MpCiAgICBpc19udWxsKGlfb2NpLlNvbGFyaXMpCiAgICBpc19udWxsKGlfb2NpLldpbmRvd3MpCgogICAgaV9saW51eCA6PSBpX29jaS5MaW51eAogICAgY291bnQoaV9saW51eC5HSURNYXBwaW5ncykgPT0gMAogICAgY291bnQoaV9saW51eC5Nb3VudExhYmVsKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlJlc291cmNlcy5EZXZpY2VzKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlJvb3Rmc1Byb3BhZ2F0aW9uKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlVJRE1hcHBpbmdzKSA9PSAwCiAgICBpc19udWxsKGlfbGludXguSW50ZWxSZHQpCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLkJsb2NrSU8pCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLk5ldHdvcmspCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLlBpZHMpCiAgICBpc19udWxsKGlfbGludXguU2VjY29tcCkKCiAgICBpX3Byb2Nlc3MgOj0gaV9vY2kuUHJvY2VzcwogICAgY291bnQoaV9wcm9jZXNzLlNlbGludXhMYWJlbCkgPT0gMAogICAgY291bnQoaV9wcm9jZXNzLlVzZXIuVXNlcm5hbWUpID09IDAKCiAgICBwcmludCgiYWxsb3dfY3JlYXRlX2NvbnRhaW5lcl9pbnB1dDogdHJ1ZSIpCn0KCmFsbG93X25hbWVzcGFjZShwX25hbWVzcGFjZSwgaV9uYW1lc3BhY2UpID0gYWRkX25hbWVzcGFjZSB7CiAgICBwX25hbWVzcGFjZSA9PSBpX25hbWVzcGFjZQogICAgYWRkX25hbWVzcGFjZSA6PSBudWxsCiAgICBwcmludCgiYWxsb3dfbmFtZXNwYWNlIDE6IGlucHV0IG5hbWVzcGFjZSBtYXRjaGVzIHBvbGljeSBkYXRhIikKfQoKYWxsb3dfbmFtZXNwYWNlKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkgPSBhZGRfbmFtZXNwYWNlIHsKICAgIHBfbmFtZXNwYWNlID09ICIiCiAgICBwcmludCgiYWxsb3dfbmFtZXNwYWNlIDI6IG5vIG5hbWVzcGFjZSBmb3VuZCBvbiBwb2xpY3kgZGF0YSIpCiAgICBhZGRfbmFtZXNwYWNlIDo9IHN0YXRlX2FsbG93cygibmFtZXNwYWNlIiwgaV9uYW1lc3BhY2UpCn0KCiMgdmFsdWUgaGFzbid0IGJlZW4gc2VlbiBiZWZvcmUsIHNhdmUgaXQgdG8gc3RhdGUKc3RhdGVfYWxsb3dzKGtleSwgdmFsdWUpID0gYWN0aW9uIHsKICBzdGF0ZSA6PSBnZXRfc3RhdGUoKQogIHByaW50KCJzdGF0ZV9hbGxvd3MgMTogc3RhdGVba2V5XSA9Iiwgc3RhdGVba2V5XSwgInZhbHVlID0iLCB2YWx1ZSkKICBub3Qgc3RhdGVba2V5XQogIHByaW50KCJzdGF0ZV9hbGxvd3MgMTogc2F2aW5nIHRvIHN0YXRlIGtleSA9Iiwga2V5LCAidmFsdWUgPSIsIHZhbHVlKQogIHBhdGggOj0gZ2V0X3N0YXRlX3BhdGgoa2V5KSAKICBhY3Rpb24gOj0gewogICAgIm9wIjogImFkZCIsCiAgICAicGF0aCI6IHBhdGgsIAogICAgInZhbHVlIjogdmFsdWUsCiAgfQp9CgojIHZhbHVlIG1hdGNoZXMgd2hhdCdzIGluIHN0YXRlLCBhbGxvdyBpdApzdGF0ZV9hbGxvd3Moa2V5LCB2YWx1ZSkgPSBhY3Rpb24gewogIHByaW50KCJzdGF0ZV9hbGxvd3MgMjogc3RhcnQiKQogIHN0YXRlIDo9IGdldF9zdGF0ZSgpCiAgcHJpbnQoInN0YXRlX2FsbG93cyAyOiBzdGF0ZVtrZXldID0iLCBzdGF0ZVtrZXldLCAidmFsdWUgPSIsIHZhbHVlKQogIHZhbHVlID09IHN0YXRlW2tleV0KICBwcmludCgic3RhdGVfYWxsb3dzIDI6IGZvdW5kIGtleSA9Iiwga2V5LCAidmFsdWUgPSIsIHZhbHVlLCAiIGluIHN0YXRlIikKICBhY3Rpb24gOj0gbnVsbAp9CgojIGhlbHBlciBmdW5jdGlvbnMgdG8gaW50ZXJhY3Qgd2l0aCB0aGUgc3RhdGUKZ2V0X3N0YXRlKCkgPSBzdGF0ZSB7CiAgc3RhdGUgOj0gZGF0YVsicHN0YXRlIl0KfQoKZ2V0X3N0YXRlX3ZhbChrZXkpID0gdmFsdWUgewogICAgc3RhdGUgOj0gZ2V0X3N0YXRlKCkKICAgIHZhbHVlIDo9IHN0YXRlW2tleV0KfQoKZ2V0X3N0YXRlX3BhdGgoa2V5KSA9IHBhdGggewogICAgIyBwcmVwZW5kICIvcHN0YXRlLyIgdG8ga2V5CiAgICBwYXRoIDo9IGNvbmNhdCgiLyIsIFsiL3BzdGF0ZSIsIGtleV0pCn0KCiMgSGVscGVyIGZ1bmN0aW9ucyB0byBjb25kaXRpb25hbGx5IGNvbmNhdGVuYXRlIG9wIGlzIG5vdCBudWxsCmNvbmNhdF9vcF9pZl9ub3RfbnVsbChvcHMsIG9wKSA9IHJlc3VsdCB7CiAgICBvcCA9PSBudWxsCiAgICByZXN1bHQgOj0gb3BzCn0KCmNvbmNhdF9vcF9pZl9ub3RfbnVsbChvcHMsIG9wKSA9IHJlc3VsdCB7CiAgICBvcCAhPSBudWxsCiAgICByZXN1bHQgOj0gYXJyYXkuY29uY2F0KG9wcywgW29wXSkKfQoKIyBSZWplY3QgdW5leHBlY3RlZCBhbm5vdGF0aW9ucy4KYWxsb3dfYW5ubyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19hbm5vIDE6IHN0YXJ0IikKCiAgICBub3QgaV9vY2kuQW5ub3RhdGlvbnMKCiAgICBwcmludCgiYWxsb3dfYW5ubyAxOiB0cnVlIikKfQphbGxvd19hbm5vKHBfb2NpLCBpX29jaSkgewogICAgcHJpbnQoImFsbG93X2Fubm8gMjogcCBBbm5vdGF0aW9ucyA9IiwgcF9vY2kuQW5ub3RhdGlvbnMpCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiBpIEFubm90YXRpb25zID0iLCBpX29jaS5Bbm5vdGF0aW9ucykKCiAgICBpX2tleXMgOj0gb2JqZWN0LmtleXMoaV9vY2kuQW5ub3RhdGlvbnMpCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiBpIGtleXMgPSIsIGlfa2V5cykKCiAgICBldmVyeSBpX2tleSBpbiBpX2tleXMgewogICAgICAgIGFsbG93X2Fubm9fa2V5KGlfa2V5LCBwX29jaSkKICAgIH0KCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiB0cnVlIikKfQoKYWxsb3dfYW5ub19rZXkoaV9rZXksIHBfb2NpKSB7CiAgICBwcmludCgiYWxsb3dfYW5ub19rZXkgMTogaSBrZXkgPSIsIGlfa2V5KQoKICAgIHN0YXJ0c3dpdGgoaV9rZXksICJpby5rdWJlcm5ldGVzLmNyaS4iKQoKICAgIHByaW50KCJhbGxvd19hbm5vX2tleSAxOiB0cnVlIikKfQphbGxvd19hbm5vX2tleShpX2tleSwgcF9vY2kpIHsKICAgIHByaW50KCJhbGxvd19hbm5vX2tleSAyOiBpIGtleSA9IiwgaV9rZXkpCgogICAgc29tZSBwX2tleSwgXyBpbiBwX29jaS5Bbm5vdGF0aW9ucwogICAgcF9rZXkgPT0gaV9rZXkKCiAgICBwcmludCgiYWxsb3dfYW5ub19rZXkgMjogdHJ1ZSIpCn0KCiMgR2V0IHRoZSB2YWx1ZSBvZiB0aGUgU19OQU1FX0tFWSBhbm5vdGF0aW9uIGFuZAojIGNvcnJlbGF0ZSBpdCB3aXRoIG90aGVyIGFubm90YXRpb25zIGFuZCBwcm9jZXNzIGZpZWxkcy4KYWxsb3dfYnlfYW5ubyhwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpIHsKICAgIHByaW50KCJhbGxvd19ieV9hbm5vIDE6IHN0YXJ0IikKCiAgICBub3QgcF9vY2kuQW5ub3RhdGlvbnNbU19OQU1FX0tFWV0KCiAgICBpX3NfbmFtZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMTogaV9zX25hbWUgPSIsIGlfc19uYW1lKQoKICAgIGlfc19uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FU1BBQ0VfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMTogaV9zX25hbWVzcGFjZSA9IiwgaV9zX25hbWVzcGFjZSkKCiAgICBhbGxvd19ieV9zYW5kYm94X25hbWUocF9vY2ksIGlfb2NpLCBwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBpX3NfbmFtZSwgaV9zX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfYnlfYW5ubyAxOiB0cnVlIikKfQphbGxvd19ieV9hbm5vKHBfb2NpLCBpX29jaSwgcF9zdG9yYWdlcywgaV9zdG9yYWdlcykgewogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMjogc3RhcnQiKQoKICAgIHBfc19uYW1lIDo9IHBfb2NpLkFubm90YXRpb25zW1NfTkFNRV9LRVldCiAgICBpX3NfbmFtZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMjogaV9zX25hbWUgPSIsIGlfc19uYW1lLCAicF9zX25hbWUgPSIsIHBfc19uYW1lKQoKICAgIGFsbG93X3NhbmRib3hfbmFtZShwX3NfbmFtZSwgaV9zX25hbWUpCgogICAgaV9zX25hbWVzcGFjZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwcmludCgiYWxsb3dfYnlfYW5ubyAyOiBpX3NfbmFtZXNwYWNlID0iLCBpX3NfbmFtZXNwYWNlKQoKICAgIGFsbG93X2J5X3NhbmRib3hfbmFtZShwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMsIGlfc19uYW1lLCBpX3NfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd19ieV9hbm5vIDI6IHRydWUiKQp9CgphbGxvd19ieV9zYW5kYm94X25hbWUocF9vY2ksIGlfb2NpLCBwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfYnlfc2FuZGJveF9uYW1lOiBzdGFydCIpCgogICAgaV9uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FU1BBQ0VfS0VZXQoKICAgIGFsbG93X2J5X2NvbnRhaW5lcl90eXBlcyhwX29jaSwgaV9vY2ksIHNfbmFtZSwgaV9uYW1lc3BhY2UpCiAgICBhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZChwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpCiAgICBhbGxvd19wcm9jZXNzKHBfb2NpLlByb2Nlc3MsIGlfb2NpLlByb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpCgogICAgcHJpbnQoImFsbG93X2J5X3NhbmRib3hfbmFtZTogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfbmFtZShwX3NfbmFtZSwgaV9zX25hbWUpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X25hbWU6IHN0YXJ0IikKICAgIHJlZ2V4Lm1hdGNoKHBfc19uYW1lLCBpX3NfbmFtZSkKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9uYW1lOiB0cnVlIikKfQoKIyBDaGVjayB0aGF0IHRoZSAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLXR5cGUiIGFuZAojICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIiBhbm5vdGF0aW9ucyBkZXNpZ25hdGUgdGhlCiMgZXhwZWN0ZWQgdHlwZSAtIGVpdGhlciBhICJzYW5kYm94IiBvciBhICJjb250YWluZXIiLiBUaGVuLCB2YWxpZGF0ZQojIG90aGVyIGFubm90YXRpb25zIGJhc2VkIG9uIHRoZSBhY3R1YWwgInNhbmRib3giIG9yICJjb250YWluZXIiIHZhbHVlCiMgZnJvbSB0aGUgaW5wdXQgY29udGFpbmVyLgphbGxvd19ieV9jb250YWluZXJfdHlwZXMocF9vY2ksIGlfb2NpLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfYnlfY29udGFpbmVyX3R5cGVzOiBjaGVja2luZyBpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSIpCgogICAgY190eXBlIDo9ICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSIKICAgIAogICAgcF9jcmlfdHlwZSA6PSBwX29jaS5Bbm5vdGF0aW9uc1tjX3R5cGVdCiAgICBpX2NyaV90eXBlIDo9IGlfb2NpLkFubm90YXRpb25zW2NfdHlwZV0KICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZXM6IHBfY3JpX3R5cGUgPSIsIHBfY3JpX3R5cGUsICJpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgcF9jcmlfdHlwZSA9PSBpX2NyaV90eXBlCgogICAgYWxsb3dfYnlfY29udGFpbmVyX3R5cGUoaV9jcmlfdHlwZSwgcF9vY2ksIGlfb2NpLCBzX25hbWUsIHNfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZXM6IHRydWUiKQp9CgphbGxvd19ieV9jb250YWluZXJfdHlwZShpX2NyaV90eXBlLCBwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAxOiBpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgaV9jcmlfdHlwZSA9PSAic2FuZGJveCIKCiAgICBpX2thdGFfdHlwZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1siaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5jb250YWluZXJfdHlwZSJdCiAgICBwcmludCgiYWxsb3dfYnlfY29udGFpbmVyX3R5cGUgMTogaV9rYXRhX3R5cGUgPSIsIGlfa2F0YV90eXBlKQogICAgaV9rYXRhX3R5cGUgPT0gInBvZF9zYW5kYm94IgoKICAgIGFsbG93X3NhbmRib3hfY29udGFpbmVyX25hbWUocF9vY2ksIGlfb2NpKQogICAgYWxsb3dfc2FuZGJveF9uZXRfbmFtZXNwYWNlKHBfb2NpLCBpX29jaSkKICAgIGFsbG93X3NhbmRib3hfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpCgogICAgcHJpbnQoImFsbG93X2J5X2NvbnRhaW5lcl90eXBlIDE6IHRydWUiKQp9CgphbGxvd19ieV9jb250YWluZXJfdHlwZShpX2NyaV90eXBlLCBwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiBpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgaV9jcmlfdHlwZSA9PSAiY29udGFpbmVyIgoKICAgIGlfa2F0YV90eXBlIDo9IGlfb2NpLkFubm90YXRpb25zWyJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIl0KICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiBpX2thdGFfdHlwZSA9IiwgaV9rYXRhX3R5cGUpCiAgICBpX2thdGFfdHlwZSA9PSAicG9kX2NvbnRhaW5lciIKCiAgICBhbGxvd19jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpCiAgICBhbGxvd19uZXRfbmFtZXNwYWNlKHBfb2NpLCBpX29jaSkKICAgIGFsbG93X2xvZ19kaXJlY3RvcnkocF9vY2ksIGlfb2NpKQoKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiB0cnVlIikKfQoKIyAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLW5hbWUiIGFubm90YXRpb24KYWxsb3dfc2FuZGJveF9jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X2NvbnRhaW5lcl9uYW1lOiBzdGFydCIpCgogICAgY29udGFpbmVyX2Fubm90YXRpb25fbWlzc2luZyhwX29jaSwgaV9vY2ksICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItbmFtZSIpCgogICAgcHJpbnQoImFsbG93X3NhbmRib3hfY29udGFpbmVyX25hbWU6IHRydWUiKQp9CgphbGxvd19jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19jb250YWluZXJfbmFtZTogc3RhcnQiKQoKICAgIGFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uKHBfb2NpLCBpX29jaSwgImlvLmt1YmVybmV0ZXMuY3JpLmNvbnRhaW5lci1uYW1lIikKCiAgICBwcmludCgiYWxsb3dfY29udGFpbmVyX25hbWU6IHRydWUiKQp9Cgpjb250YWluZXJfYW5ub3RhdGlvbl9taXNzaW5nKHBfb2NpLCBpX29jaSwga2V5KSB7CiAgICBwcmludCgiY29udGFpbmVyX2Fubm90YXRpb25fbWlzc2luZzoiLCBrZXkpCgogICAgbm90IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIG5vdCBpX29jaS5Bbm5vdGF0aW9uc1trZXldCgogICAgcHJpbnQoImNvbnRhaW5lcl9hbm5vdGF0aW9uX21pc3Npbmc6IHRydWUiKQp9CgphbGxvd19jb250YWluZXJfYW5ub3RhdGlvbihwX29jaSwgaV9vY2ksIGtleSkgewogICAgcHJpbnQoImFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uOiBrZXkgPSIsIGtleSkKCiAgICBwX3ZhbHVlIDo9IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIGlfdmFsdWUgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgcHJpbnQoImFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uOiBwX3ZhbHVlID0iLCBwX3ZhbHVlLCAiaV92YWx1ZSA9IiwgaV92YWx1ZSkKCiAgICBwX3ZhbHVlID09IGlfdmFsdWUKCiAgICBwcmludCgiYWxsb3dfY29udGFpbmVyX2Fubm90YXRpb246IHRydWUiKQp9CgojICJuZXJkY3RsL25ldHdvcmstbmFtZXNwYWNlIiBhbm5vdGF0aW9uCmFsbG93X3NhbmRib3hfbmV0X25hbWVzcGFjZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X25ldF9uYW1lc3BhY2U6IHN0YXJ0IikKCiAgICBrZXkgOj0gIm5lcmRjdGwvbmV0d29yay1uYW1lc3BhY2UiCgogICAgcF9uYW1lc3BhY2UgOj0gcF9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgaV9uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgcHJpbnQoImFsbG93X3NhbmRib3hfbmV0X25hbWVzcGFjZTogcF9uYW1lc3BhY2UgPSIsIHBfbmFtZXNwYWNlLCAiaV9uYW1lc3BhY2UgPSIsIGlfbmFtZXNwYWNlKQoKICAgIHJlZ2V4Lm1hdGNoKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9uZXRfbmFtZXNwYWNlOiB0cnVlIikKfQoKYWxsb3dfbmV0X25hbWVzcGFjZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19uZXRfbmFtZXNwYWNlOiBzdGFydCIpCgogICAga2V5IDo9ICJuZXJkY3RsL25ldHdvcmstbmFtZXNwYWNlIgoKICAgIG5vdCBwX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICBub3QgaV9vY2kuQW5ub3RhdGlvbnNba2V5XQoKICAgIHByaW50KCJhbGxvd19uZXRfbmFtZXNwYWNlOiB0cnVlIikKfQoKIyAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1sb2ctZGlyZWN0b3J5IiBhbm5vdGF0aW9uCmFsbG93X3NhbmRib3hfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X2xvZ19kaXJlY3Rvcnk6IHN0YXJ0IikKCiAgICBrZXkgOj0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbG9nLWRpcmVjdG9yeSIKCiAgICBwX2RpciA6PSBwX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICByZWdleDEgOj0gcmVwbGFjZShwX2RpciwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHJlZ2V4MiA6PSByZXBsYWNlKHJlZ2V4MSwgIiQoc2FuZGJveC1uYW1lc3BhY2UpIiwgc19uYW1lc3BhY2UpCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiByZWdleDIgPSIsIHJlZ2V4MikKCiAgICBpX2RpciA6PSBpX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiBpX2RpciA9IiwgaV9kaXIpCgogICAgcmVnZXgubWF0Y2gocmVnZXgyLCBpX2RpcikKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiB0cnVlIikKfQoKYWxsb3dfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19sb2dfZGlyZWN0b3J5OiBzdGFydCIpCgogICAga2V5IDo9ICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWxvZy1kaXJlY3RvcnkiCgogICAgbm90IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIG5vdCBpX29jaS5Bbm5vdGF0aW9uc1trZXldCgogICAgcHJpbnQoImFsbG93X2xvZ19kaXJlY3Rvcnk6IHRydWUiKQp9CgphbGxvd19kZXZpY2VzKHBfZGV2aWNlcywgaV9kZXZpY2VzKSB7CiAgICBwcmludCgiYWxsb3dfZGV2aWNlczogc3RhcnQiKQogICAgZXZlcnkgaV9kZXZpY2UgaW4gaV9kZXZpY2VzIHsKICAgICAgICBwcmludCgiYWxsb3dfZGV2aWNlczogaV9kZXZpY2UgPSIsIGlfZGV2aWNlKQogICAgICAgIHNvbWUgcF9kZXZpY2UgaW4gcF9kZXZpY2VzCiAgICAgICAgcF9kZXZpY2UuY29udGFpbmVyX3BhdGggPT0gaV9kZXZpY2UuY29udGFpbmVyX3BhdGgKICAgIH0KICAgIHByaW50KCJhbGxvd19kZXZpY2VzOiB0cnVlIikKfQoKYWxsb3dfbGludXgoc3RhdGVfb3BzLCBwX29jaSwgaV9vY2kpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIHBfbmFtZXNwYWNlcyA6PSBwX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbGludXg6IHAgbmFtZXNwYWNlcyA9IiwgcF9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlcyA6PSBpX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbGludXg6IGkgbmFtZXNwYWNlcyA9IiwgaV9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlX3dpdGhvdXRfbmV0d29yayA6PSBbb2JqIHwgb2JqIDo9IGlfbmFtZXNwYWNlc1tfXTsgb2JqLlR5cGUgIT0gIm5ldHdvcmsiXQoKICAgIHByaW50KCJhbGxvd19saW51eDogaV9uYW1lc3BhY2Vfd2l0aG91dF9uZXR3b3JrID0iLCBpX25hbWVzcGFjZV93aXRob3V0X25ldHdvcmspCgogICAgcF9uYW1lc3BhY2VzID09IGlfbmFtZXNwYWNlX3dpdGhvdXRfbmV0d29yawoKICAgIGFsbG93X21hc2tlZF9wYXRocyhwX29jaSwgaV9vY2kpCiAgICBhbGxvd19yZWFkb25seV9wYXRocyhwX29jaSwgaV9vY2kpCiAgICBhbGxvd19saW51eF9kZXZpY2VzKHBfb2NpLkxpbnV4LkRldmljZXMsIGlfb2NpLkxpbnV4LkRldmljZXMpCiAgICBhbGxvd19saW51eF9zeXNjdGwocF9vY2kuTGludXgsIGlfb2NpLkxpbnV4KQogICAgcmV0IDo9IGFsbG93X25ldHdvcmtfbmFtZXNwYWNlX3N0YXJ0KHN0YXRlX29wcywgcF9vY2ksIGlfb2NpKQogICAgcmV0LmFsbG93ZWQKCiAgICBvcHMgOj0gcmV0Lm9wcwoKICAgIHByaW50KCJhbGxvd19saW51eDogdHJ1ZSIpCn0KCiMgUmV0cmlldmUgdGhlICJuZXR3b3JrIiBuYW1lc3BhY2UgZnJvbSB0aGUgaW5wdXQgZGF0YSBhbmQgcGFzcyBpdCBvbiBmb3IgdGhlCiMgbmV0d29yayBuYW1lc3BhY2UgcG9saWN5IGNoZWNrcy4KYWxsb3dfbmV0d29ya19uYW1lc3BhY2Vfc3RhcnQoc3RhdGVfb3BzLCBwX29jaSwgaV9vY2kpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIHByaW50KCJhbGxvd19uZXR3b3JrX25hbWVzcGFjZSBzdGFydDogc3RhcnQiKQoKICAgIHBfbmFtZXNwYWNlcyA6PSBwX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IHAgbmFtZXNwYWNlcyA9IiwgcF9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlcyA6PSBpX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IGkgbmFtZXNwYWNlcyA9IiwgaV9uYW1lc3BhY2VzKQoKICAgICMgUmV0dXJuIHBhdGggb2YgdGhlICJuZXR3b3JrIiBuYW1lc3BhY2UKICAgIG5ldHdvcmtfbnMgOj0gW29iaiB8IG9iaiA6PSBpX25hbWVzcGFjZXNbX107IG9iai5UeXBlID09ICJuZXR3b3JrIl0KCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IG5ldHdvcmtfbnMgPSIsIG5ldHdvcmtfbnMpCgogICAgcmV0IDo9IGFsbG93X25ldHdvcmtfbmFtZXNwYWNlKHN0YXRlX29wcywgbmV0d29ya19ucykKICAgIHJldC5hbGxvd2VkCgogICAgb3BzIDo9IHJldC5vcHMKfQoKIyBUaGlzIHJ1bGUgaXMgd2hlbiB0aGVyZSdzIG5vIG5ldHdvcmsgbmFtZXNwYWNlIGluIHRoZSBpbnB1dCBkYXRhLgphbGxvd19uZXR3b3JrX25hbWVzcGFjZShzdGF0ZV9vcHMsIG5ldHdvcmtfbnMpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIGNvdW50KG5ldHdvcmtfbnMpID09IDAKCiAgICBuZXR3b3JrX25zX3BhdGggPSAiIgoKICAgIGFkZF9uZXR3b3JrX25hbWVzcGFjZV90b19zdGF0ZSA6PSBzdGF0ZV9hbGxvd3MoIm5ldHdvcmtfbmFtZXNwYWNlIiwgbmV0d29ya19uc19wYXRoKQogICAgb3BzIDo9IGNvbmNhdF9vcF9pZl9ub3RfbnVsbChzdGF0ZV9vcHMsIGFkZF9uZXR3b3JrX25hbWVzcGFjZV90b19zdGF0ZSkKCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2UgMTogdHJ1ZSIpCn0KCiMgVGhpcyBydWxlIGlzIHdoZW4gdGhlcmUncyBleGFjdGx5IG9uZSBuZXR3b3JrIG5hbWVzcGFjZSBpbiB0aGUgaW5wdXQgZGF0YS4KYWxsb3dfbmV0d29ya19uYW1lc3BhY2Uoc3RhdGVfb3BzLCBuZXR3b3JrX25zKSA6PSB7Im9wcyI6IG9wcywgImFsbG93ZWQiOiB0cnVlfSB7CiAgICBjb3VudChuZXR3b3JrX25zKSA9PSAxCgogICAgYWRkX25ldHdvcmtfbmFtZXNwYWNlX3RvX3N0YXRlIDo9IHN0YXRlX2FsbG93cygibmV0d29ya19uYW1lc3BhY2UiLCBuZXR3b3JrX25zWzBdLlBhdGgpCiAgICBvcHMgOj0gY29uY2F0X29wX2lmX25vdF9udWxsKHN0YXRlX29wcywgYWRkX25ldHdvcmtfbmFtZXNwYWNlX3RvX3N0YXRlKQoKICAgIHByaW50KCJhbGxvd19uZXR3b3JrX25hbWVzcGFjZSAyOiB0cnVlIikKfQoKYWxsb3dfbWFza2VkX3BhdGhzKHBfb2NpLCBpX29jaSkgewogICAgcF9wYXRocyA6PSBwX29jaS5MaW51eC5NYXNrZWRQYXRocwogICAgcHJpbnQoImFsbG93X21hc2tlZF9wYXRocyAxOiBwX3BhdGhzID0iLCBwX3BhdGhzKQoKICAgIGlfcGF0aHMgOj0gaV9vY2kuTGludXguTWFza2VkUGF0aHMKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aHMgMTogaV9wYXRocyA9IiwgaV9wYXRocykKCiAgICBhbGxvd19tYXNrZWRfcGF0aHNfYXJyYXkocF9wYXRocywgaV9wYXRocykKCiAgICBwcmludCgiYWxsb3dfbWFza2VkX3BhdGhzIDE6IHRydWUiKQp9CmFsbG93X21hc2tlZF9wYXRocyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aHMgMjogc3RhcnQiKQoKICAgIG5vdCBwX29jaS5MaW51eC5NYXNrZWRQYXRocwogICAgbm90IGlfb2NpLkxpbnV4Lk1hc2tlZFBhdGhzCgogICAgcHJpbnQoImFsbG93X21hc2tlZF9wYXRocyAyOiB0cnVlIikKfQoKIyBBbGwgdGhlIHBvbGljeSBtYXNrZWQgcGF0aHMgbXVzdCBiZSBtYXNrZWQgaW4gdGhlIGlucHV0IGRhdGEgdG9vLgojIElucHV0IGlzIGFsbG93ZWQgdG8gaGF2ZSBtb3JlIG1hc2tlZCBwYXRocyB0aGFuIHRoZSBwb2xpY3kuCmFsbG93X21hc2tlZF9wYXRoc19hcnJheShwX2FycmF5LCBpX2FycmF5KSB7CiAgICBldmVyeSBwX2VsZW0gaW4gcF9hcnJheSB7CiAgICAgICAgYWxsb3dfbWFza2VkX3BhdGgocF9lbGVtLCBpX2FycmF5KQogICAgfQp9CgphbGxvd19tYXNrZWRfcGF0aChwX2VsZW0sIGlfYXJyYXkpIHsKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aDogcF9lbGVtID0iLCBwX2VsZW0pCgogICAgc29tZSBpX2VsZW0gaW4gaV9hcnJheQogICAgcF9lbGVtID09IGlfZWxlbQoKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aDogdHJ1ZSIpCn0KCmFsbG93X3JlYWRvbmx5X3BhdGhzKHBfb2NpLCBpX29jaSkgewogICAgcF9wYXRocyA6PSBwX29jaS5MaW51eC5SZWFkb25seVBhdGhzCiAgICBwcmludCgiYWxsb3dfcmVhZG9ubHlfcGF0aHMgMTogcF9wYXRocyA9IiwgcF9wYXRocykKCiAgICBpX3BhdGhzIDo9IGlfb2NpLkxpbnV4LlJlYWRvbmx5UGF0aHMKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAxOiBpX3BhdGhzID0iLCBpX3BhdGhzKQoKICAgIGFsbG93X3JlYWRvbmx5X3BhdGhzX2FycmF5KHBfcGF0aHMsIGlfcGF0aHMsIGlfb2NpLkxpbnV4Lk1hc2tlZFBhdGhzKQoKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAxOiB0cnVlIikKfQphbGxvd19yZWFkb25seV9wYXRocyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAyOiBzdGFydCIpCgogICAgbm90IHBfb2NpLkxpbnV4LlJlYWRvbmx5UGF0aHMKICAgIG5vdCBpX29jaS5MaW51eC5SZWFkb25seVBhdGhzCgogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGhzIDI6IHRydWUiKQp9CgojIEFsbCB0aGUgcG9saWN5IHJlYWRvbmx5IHBhdGhzIG11c3QgYmUgZWl0aGVyOgojIC0gUHJlc2VudCBpbiB0aGUgaW5wdXQgcmVhZG9ubHkgcGF0aHMsIG9yCiMgLSBQcmVzZW50IGluIHRoZSBpbnB1dCBtYXNrZWQgcGF0aHMuCiMgSW5wdXQgaXMgYWxsb3dlZCB0byBoYXZlIG1vcmUgcmVhZG9ubHkgcGF0aHMgdGhhbiB0aGUgcG9saWN5LgphbGxvd19yZWFkb25seV9wYXRoc19hcnJheShwX2FycmF5LCBpX2FycmF5LCBtYXNrZWRfcGF0aHMpIHsKICAgIGV2ZXJ5IHBfZWxlbSBpbiBwX2FycmF5IHsKICAgICAgICBhbGxvd19yZWFkb25seV9wYXRoKHBfZWxlbSwgaV9hcnJheSwgbWFza2VkX3BhdGhzKQogICAgfQp9CgphbGxvd19yZWFkb25seV9wYXRoKHBfZWxlbSwgaV9hcnJheSwgbWFza2VkX3BhdGhzKSB7CiAgICBwcmludCgiYWxsb3dfcmVhZG9ubHlfcGF0aCAxOiBwX2VsZW0gPSIsIHBfZWxlbSkKCiAgICBzb21lIGlfZWxlbSBpbiBpX2FycmF5CiAgICBwX2VsZW0gPT0gaV9lbGVtCgogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGggMTogdHJ1ZSIpCn0KYWxsb3dfcmVhZG9ubHlfcGF0aChwX2VsZW0sIGlfYXJyYXksIG1hc2tlZF9wYXRocykgewogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGggMjogcF9lbGVtID0iLCBwX2VsZW0pCgogICAgc29tZSBpX21hc2tlZCBpbiBtYXNrZWRfcGF0aHMKICAgIHBfZWxlbSA9PSBpX21hc2tlZAoKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRoIDI6IHRydWUiKQp9CgphbGxvd19saW51eF9kZXZpY2VzKHBfZGV2aWNlcywgaV9kZXZpY2VzKSB7CiAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogc3RhcnQiKQogICAgZXZlcnkgaV9kZXZpY2UgaW4gaV9kZXZpY2VzIHsKICAgICAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogaV9kZXZpY2UgPSIsIGlfZGV2aWNlKQogICAgICAgIHNvbWUgcF9kZXZpY2UgaW4gcF9kZXZpY2VzCiAgICAgICAgaV9kZXZpY2UuUGF0aCA9PSBwX2RldmljZS5QYXRoCiAgICB9CiAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogdHJ1ZSIpCn0KCmFsbG93X2xpbnV4X3N5c2N0bChwX2xpbnV4LCBpX2xpbnV4KSB7CiAgICBwcmludCgiYWxsb3dfbGludXhfc3lzY3RsIDE6IHN0YXJ0IikKICAgIG5vdCBpX2xpbnV4LlN5c2N0bAogICAgcHJpbnQoImFsbG93X2xpbnV4X3N5c2N0bCAxOiB0cnVlIikKfQoKYWxsb3dfbGludXhfc3lzY3RsKHBfbGludXgsIGlfbGludXgpIHsKICAgIHByaW50KCJhbGxvd19saW51eF9zeXNjdGwgMjogc3RhcnQiKQogICAgcF9zeXNjdGwgOj0gcF9saW51eC5TeXNjdGwKICAgIGlfc3lzY3RsIDo9IGlfbGludXguU3lzY3RsCiAgICBldmVyeSBpX25hbWUsIGlfdmFsIGluIGlfc3lzY3RsIHsKICAgICAgICBwcmludCgiYWxsb3dfbGludXhfc3lzY3RsIDI6IGlfbmFtZSA9IiwgaV9uYW1lLCAiaV92YWwgPSIsIGlfdmFsKQogICAgICAgIHBfc3lzY3RsW2lfbmFtZV0gPT0gaV92YWwKICAgIH0KICAgIHByaW50KCJhbGxvd19saW51eF9zeXNjdGwgMjogdHJ1ZSIpCn0KCiMgQ2hlY2sgdGhlIGNvbnNpc3RlbmN5IG9mIHRoZSBpbnB1dCAiaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5idW5kbGVfcGF0aCIKIyBhbmQgaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCIgdmFsdWVzIHdpdGggb3RoZXIgZmllbGRzLgphbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZChwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpIHsKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogc3RhcnQiKQoKICAgIGJ1bmRsZV9wYXRoIDo9IGlfb2NpLkFubm90YXRpb25zWyJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmJ1bmRsZV9wYXRoIl0KICAgIGJ1bmRsZV9pZCA6PSByZXBsYWNlKGJ1bmRsZV9wYXRoLCAiL3J1bi9jb250YWluZXJkL2lvLmNvbnRhaW5lcmQucnVudGltZS52Mi50YXNrL2s4cy5pby8iLCAiIikKCiAgICBidW5kbGVfaWRfZm9ybWF0IDo9IGNvbmNhdCgiIiwgWyJeIiwgQlVORExFX0lELCAiJCJdKQogICAgcmVnZXgubWF0Y2goYnVuZGxlX2lkX2Zvcm1hdCwgYnVuZGxlX2lkKQoKICAgIGtleSA6PSAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCIKCiAgICBwX3JlZ2V4IDo9IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIHNhbmRib3hfaWQgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQoKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogc2FuZGJveF9pZCA9Iiwgc2FuZGJveF9pZCwgInJlZ2V4ID0iLCBwX3JlZ2V4KQogICAgcmVnZXgubWF0Y2gocF9yZWdleCwgc2FuZGJveF9pZCkKCiAgICBhbGxvd19yb290X3BhdGgocF9vY2ksIGlfb2NpLCBidW5kbGVfaWQpCgogICAgZXZlcnkgaV9tb3VudCBpbiBpX29jaS5Nb3VudHMgewogICAgICAgIGFsbG93X21vdW50KHBfb2NpLCBpX21vdW50LCBpX3N0b3JhZ2VzLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpCiAgICB9CgogICAgYWxsb3dfc3RvcmFnZXMocF9zdG9yYWdlcywgaV9zdG9yYWdlcywgYnVuZGxlX2lkLCBzYW5kYm94X2lkKQoKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogdHJ1ZSIpCn0KCmFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHBfcHJvY2VzcyA9IiwgcF9wcm9jZXNzKQogICAgcHJpbnQoImFsbG93X3Byb2Nlc3NfY29tbW9uOiBpX3Byb2Nlc3MgPSAiLCBpX3Byb2Nlc3MpCiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHNfbmFtZSA9Iiwgc19uYW1lKQoKICAgIHBfcHJvY2Vzcy5Dd2QgPT0gaV9wcm9jZXNzLkN3ZAogICAgcF9wcm9jZXNzLk5vTmV3UHJpdmlsZWdlcyA9PSBpX3Byb2Nlc3MuTm9OZXdQcml2aWxlZ2VzCgogICAgYWxsb3dfdXNlcihwX3Byb2Nlc3MsIGlfcHJvY2VzcykKICAgIGFsbG93X2VudihwX3Byb2Nlc3MsIGlfcHJvY2Vzcywgc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHRydWUiKQp9CgojIENvbXBhcmUgdGhlIE9DSSBQcm9jZXNzIGZpZWxkIG9mIGEgcG9saWN5IGNvbnRhaW5lciB3aXRoIHRoZSBpbnB1dCBPQ0kgUHJvY2VzcyBmcm9tIGEgQ3JlYXRlQ29udGFpbmVyUmVxdWVzdAphbGxvd19wcm9jZXNzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfcHJvY2Vzczogc3RhcnQiKQoKICAgIGFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgYWxsb3dfY2FwcyhwX3Byb2Nlc3MuQ2FwYWJpbGl0aWVzLCBpX3Byb2Nlc3MuQ2FwYWJpbGl0aWVzKQogICAgcF9wcm9jZXNzLlRlcm1pbmFsID09IGlfcHJvY2Vzcy5UZXJtaW5hbAoKICAgIHByaW50KCJhbGxvd19wcm9jZXNzOiB0cnVlIikKfQoKIyBDb21wYXJlIHRoZSBPQ0kgUHJvY2VzcyBmaWVsZCBvZiBhIHBvbGljeSBjb250YWluZXIgd2l0aCB0aGUgaW5wdXQgcHJvY2VzcyBmaWVsZCBmcm9tIEV4ZWNQcm9jZXNzUmVxdWVzdAphbGxvd19pbnRlcmFjdGl2ZV9wcm9jZXNzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfaW50ZXJhY3RpdmVfcHJvY2Vzczogc3RhcnQiKQoKICAgIGFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgYWxsb3dfZXhlY19jYXBzKGlfcHJvY2Vzcy5DYXBhYmlsaXRpZXMpCgogICAgIyBUaGVzZSBhcmUgY29tbWFuZHMgZW5hYmxlZCB1c2luZyBFeGVjUHJvY2Vzc1JlcXVlc3QgY29tbWFuZHMgYW5kL29yIHJlZ2V4IGZyb20gdGhlIHNldHRpbmdzIGZpbGUuCiAgICAjIFRoZXkgY2FuIGJlIGV4ZWN1dGVkIGludGVyYWN0aXZlbHkgc28gYWxsb3cgdGhlbSB0byB1c2UgYW55IHZhbHVlIGZvciBpX3Byb2Nlc3MuVGVybWluYWwuCgogICAgcHJpbnQoImFsbG93X2ludGVyYWN0aXZlX3Byb2Nlc3M6IHRydWUiKQp9CgojIENvbXBhcmUgdGhlIE9DSSBQcm9jZXNzIGZpZWxkIG9mIGEgcG9saWN5IGNvbnRhaW5lciB3aXRoIHRoZSBpbnB1dCBwcm9jZXNzIGZpZWxkIGZyb20gRXhlY1Byb2Nlc3NSZXF1ZXN0CmFsbG93X3Byb2JlX3Byb2Nlc3MocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19wcm9iZV9wcm9jZXNzOiBzdGFydCIpCgogICAgYWxsb3dfcHJvY2Vzc19jb21tb24ocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpCiAgICBhbGxvd19leGVjX2NhcHMoaV9wcm9jZXNzLkNhcGFiaWxpdGllcykKICAgIHBfcHJvY2Vzcy5UZXJtaW5hbCA9PSBpX3Byb2Nlc3MuVGVybWluYWwKCiAgICBwcmludCgiYWxsb3dfcHJvYmVfcHJvY2VzczogdHJ1ZSIpCn0KCmFsbG93X3VzZXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MpIHsKICAgIHBfdXNlciA6PSBwX3Byb2Nlc3MuVXNlcgogICAgaV91c2VyIDo9IGlfcHJvY2Vzcy5Vc2VyCgogICAgcHJpbnQoImFsbG93X3VzZXI6IGlucHV0IHVpZCA9IiwgaV91c2VyLlVJRCwgInBvbGljeSB1aWQgPSIsIHBfdXNlci5VSUQpCiAgICBwX3VzZXIuVUlEID09IGlfdXNlci5VSUQKCiAgICAjIFRPRE86IHRyYWNrIGRvd24gdGhlIHJlYXNvbiBmb3IgcmVnaXN0cnkuazhzLmlvL3BhdXNlOjMuOSBiZWluZwogICAgIyAgICAgICBleGVjdXRlZCB3aXRoIGdpZCA9IDAgZGVzcGl0ZSBoYXZpbmcgIjY1NTM1OjY1NTM1IiBpbiBpdHMgY29udGFpbmVyIGltYWdlCiAgICAjICAgICAgIGNvbmZpZy4KICAgICNwcmludCgiYWxsb3dfdXNlcjogaW5wdXQgZ2lkID0iLCBpX3VzZXIuR0lELCAicG9saWN5IGdpZCA9IiwgcF91c2VyLkdJRCkKICAgICNwX3VzZXIuR0lEID09IGlfdXNlci5HSUQKCiAgICAjIFRPRE86IGNvbXBhcmUgdGhlIGFkZGl0aW9uYWxHaWRzIGZpZWxkIHRvbyBhZnRlciBjb21wdXRpbmcgaXRzIHZhbHVlCiAgICAjIGJhc2VkIG9uIC9ldGMvcGFzc3dkIGFuZCAvZXRjL2dyb3VwIGZyb20gdGhlIGNvbnRhaW5lciBpbWFnZS4KfQoKYWxsb3dfZGVwcmVjYXRlZF9hcmdzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZ3MgMTogbm8gYXJncyIpCgogICAgbm90IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJncwogICAgbm90IGlfcHJvY2Vzcy5BcmdzCgogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAxOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZ3MocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSkgewogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiBwb2xpY3kgYXJncyA9IiwgcF9wcm9jZXNzLkRlcHJlY2F0ZWRBcmdzKQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiBpbnB1dCBhcmdzID0iLCBpX3Byb2Nlc3MuQXJncykKCiAgICBjb3VudChwX3Byb2Nlc3MuRGVwcmVjYXRlZEFyZ3MpID09IGNvdW50KGlfcHJvY2Vzcy5BcmdzKQoKICAgIGV2ZXJ5IGksIGlfYXJnIGluIGlfcHJvY2Vzcy5BcmdzIHsKICAgICAgICBhbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpCiAgICB9CgogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDE6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgcF9hcmcyIDo9IHJlcGxhY2UocF9hcmcsICIkJCIsICIkIikKICAgIHBfYXJnMiA9PSBpX2FyZwoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAxOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDI6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgIyBUT0RPOiBjYW4gJChub2RlLW5hbWUpIGJlIGhhbmRsZWQgYmV0dGVyPwogICAgY29udGFpbnMocF9hcmcsICIkKG5vZGUtbmFtZSkiKQoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAyOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDM6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgcF9hcmcyIDo9IHJlcGxhY2UocF9hcmcsICIkJCIsICIkIikKICAgIHBfYXJnMyA6PSByZXBsYWNlKHBfYXJnMiwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAzOiBwX2FyZzMgPSIsIHBfYXJnMykKICAgIHBfYXJnMyA9PSBpX2FyZwoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAzOiB0cnVlIikKfQoKIyBPQ0kgcHJvY2Vzcy5FbnYgZmllbGQKYWxsb3dfZW52KHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfZW52OiBwIGVudiA9IiwgcF9wcm9jZXNzLkVudikKICAgIHByaW50KCJhbGxvd19lbnY6IGkgZW52ID0iLCBpX3Byb2Nlc3MuRW52KQoKICAgIGV2ZXJ5IGlfdmFyIGluIGlfcHJvY2Vzcy5FbnYgewogICAgICAgIHByaW50KCJhbGxvd19lbnY6IGlfdmFyID0iLCBpX3ZhcikKICAgICAgICBhbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgfQoKICAgIHByaW50KCJhbGxvd19lbnY6IHRydWUiKQp9CgojIEFsbG93IGlucHV0IGVudiB2YXJpYWJsZXMgdGhhdCBhcmUgcHJlc2VudCBpbiB0aGUgcG9saWN5IGRhdGEgdG9vLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHBfdmFyID09IGlfdmFyCiAgICBwcmludCgiYWxsb3dfdmFyIDE6IHRydWUiKQp9CgojIE1hdGNoIGlucHV0IHdpdGggb25lIG9mIHRoZSBwb2xpY3kgdmFyaWFibGVzLCBhZnRlciBzdWJzdGl0dXRpbmcgJChzYW5kYm94LW5hbWUpLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHByaW50KCJhbGxvd192YXIgMjogcF92YXIgPSIsIHBfdmFyKQoKICAgIHBfdmFyX3NwbGl0IDo9IHNwbGl0KHBfdmFyLCAiPSIpCiAgICBjb3VudChwX3Zhcl9zcGxpdCkgPT0gMgoKICAgIHBfdmFyX3NwbGl0WzFdID09ICIkKHNhbmRib3gtbmFtZSkiCgogICAgaV92YXJfc3BsaXQgOj0gc3BsaXQoaV92YXIsICI9IikKICAgIGNvdW50KGlfdmFyX3NwbGl0KSA9PSAyCgogICAgaV92YXJfc3BsaXRbMF0gPT0gcF92YXJfc3BsaXRbMF0KICAgIHJlZ2V4Lm1hdGNoKHNfbmFtZSwgaV92YXJfc3BsaXRbMV0pCgogICAgcHJpbnQoImFsbG93X3ZhciAyOiB0cnVlIikKfQoKIyBBbGxvdyBpbnB1dCBlbnYgdmFyaWFibGVzIHRoYXQgbWF0Y2ggd2l0aCBhIHJlcXVlc3RfZGVmYXVsdHMgcmVnZXguCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHNvbWUgcF9yZWdleDEgaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5DcmVhdGVDb250YWluZXJSZXF1ZXN0LmFsbG93X2Vudl9yZWdleAogICAgcF9yZWdleDIgOj0gcmVwbGFjZShwX3JlZ2V4MSwgIiQoaXB2NF9hKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcHY0X2EpCiAgICBwX3JlZ2V4MyA6PSByZXBsYWNlKHBfcmVnZXgyLCAiJChpcF9wKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcF9wKQogICAgcF9yZWdleDQgOj0gcmVwbGFjZShwX3JlZ2V4MywgIiQoc3ZjX25hbWUpIiwgcG9saWN5X2RhdGEuY29tbW9uLnN2Y19uYW1lKQogICAgcF9yZWdleDUgOj0gcmVwbGFjZShwX3JlZ2V4NCwgIiQoZG5zX2xhYmVsKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5kbnNfbGFiZWwpCgogICAgcHJpbnQoImFsbG93X3ZhciAzOiBwX3JlZ2V4NSA9IiwgcF9yZWdleDUpCiAgICByZWdleC5tYXRjaChwX3JlZ2V4NSwgaV92YXIpCgogICAgcHJpbnQoImFsbG93X3ZhciAzOiB0cnVlIikKfQoKIyBBbGxvdyBmaWVsZFJlZiAiZmllbGRQYXRoOiBzdGF0dXMucG9kSVAiIHZhbHVlcy4KYWxsb3dfdmFyKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBpX3Zhciwgc19uYW1lLCBzX25hbWVzcGFjZSkgewogICAgbmFtZV92YWx1ZSA6PSBzcGxpdChpX3ZhciwgIj0iKQogICAgY291bnQobmFtZV92YWx1ZSkgPT0gMgogICAgaXNfaXAobmFtZV92YWx1ZVsxXSkKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIGFsbG93X3BvZF9pcF92YXIobmFtZV92YWx1ZVswXSwgcF92YXIpCgogICAgcHJpbnQoImFsbG93X3ZhciA0OiB0cnVlIikKfQoKIyBBbGxvdyBjb21tb24gZmllbGRSZWYgdmFyaWFibGVzLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBuYW1lX3ZhbHVlIDo9IHNwbGl0KGlfdmFyLCAiPSIpCiAgICBjb3VudChuYW1lX3ZhbHVlKSA9PSAyCgogICAgc29tZSBwX3ZhciBpbiBwX3Byb2Nlc3MuRW52CiAgICBwX25hbWVfdmFsdWUgOj0gc3BsaXQocF92YXIsICI9IikKICAgIGNvdW50KHBfbmFtZV92YWx1ZSkgPT0gMgoKICAgIHBfbmFtZV92YWx1ZVswXSA9PSBuYW1lX3ZhbHVlWzBdCgogICAgIyBUT0RPOiBzaG91bGQgdGhlc2UgYmUgaGFuZGxlZCBpbiBhIGRpZmZlcmVudCB3YXk/CiAgICBhbHdheXNfYWxsb3dlZCA6PSBbIiQoaG9zdC1uYW1lKSIsICIkKG5vZGUtbmFtZSkiLCAiJChwb2QtdWlkKSJdCiAgICBzb21lIGFsbG93ZWQgaW4gYWx3YXlzX2FsbG93ZWQKICAgIGNvbnRhaW5zKHBfbmFtZV92YWx1ZVsxXSwgYWxsb3dlZCkKCiAgICBwcmludCgiYWxsb3dfdmFyIDU6IHRydWUiKQp9CgojIEFsbG93IGZpZWxkUmVmICJmaWVsZFBhdGg6IHN0YXR1cy5ob3N0SVAiIHZhbHVlcy4KYWxsb3dfdmFyKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBpX3Zhciwgc19uYW1lLCBzX25hbWVzcGFjZSkgewogICAgbmFtZV92YWx1ZSA6PSBzcGxpdChpX3ZhciwgIj0iKQogICAgY291bnQobmFtZV92YWx1ZSkgPT0gMgogICAgaXNfaXAobmFtZV92YWx1ZVsxXSkKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIGFsbG93X2hvc3RfaXBfdmFyKG5hbWVfdmFsdWVbMF0sIHBfdmFyKQoKICAgIHByaW50KCJhbGxvd192YXIgNjogdHJ1ZSIpCn0KCiMgQWxsb3cgcmVzb3VyY2VGaWVsZFJlZiB2YWx1ZXMgKGUuZy4sICJsaW1pdHMuY3B1IikuCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIG5hbWVfdmFsdWUgOj0gc3BsaXQoaV92YXIsICI9IikKICAgIGNvdW50KG5hbWVfdmFsdWUpID09IDIKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHBfbmFtZV92YWx1ZSA6PSBzcGxpdChwX3ZhciwgIj0iKQogICAgY291bnQocF9uYW1lX3ZhbHVlKSA9PSAyCgogICAgcF9uYW1lX3ZhbHVlWzBdID09IG5hbWVfdmFsdWVbMF0KCiAgICAjIGEgdmFyaWFibGUgd2Ugc2hvdWxkIGJlIHZhbGlkYXRpbmcgdXNpbmcgYSByZWdleCBmcm9tIHNldHRpbmdzCiAgICBwX25hbWVfdmFsdWVbMV0gPT0gIiQodmFsaWRhdGUtZnJvbS1zZXR0aW5ncykiCgogICAgcmVnZXhfdmFsIDo9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuQ3JlYXRlQ29udGFpbmVyUmVxdWVzdC5hbGxvd19lbnZfcmVnZXhfbWFwW25hbWVfdmFsdWVbMF1dCgogICAgcHJpbnQoImFsbG93X3ZhciA3OiB2YWwgPSIsIG5hbWVfdmFsdWVbMV0pCiAgICBwcmludCgiYWxsb3dfdmFyIDc6IHJlZ2V4X3ZhbCA9IiwgcmVnZXhfdmFsKQoKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4X3ZhbCwgbmFtZV92YWx1ZVsxXSkKCiAgICBwcmludCgiYWxsb3dfdmFyIDc6IHRydWUiKQp9CgojIE1hdGNoIGlucHV0IHdpdGggb25lIG9mIHRoZSBwb2xpY3kgdmFyaWFibGVzLCBhZnRlciBzdWJzdGl0dXRpbmcgJChzYW5kYm94LW5hbWVzcGFjZSkuCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHNvbWUgcF92YXIgaW4gcF9wcm9jZXNzLkVudgogICAgcF92YXIyIDo9IHJlcGxhY2UocF92YXIsICIkKHNhbmRib3gtbmFtZXNwYWNlKSIsIHNfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd192YXIgODogcF92YXIyID0iLCBwX3ZhcjIpCiAgICBwX3ZhcjIgPT0gaV92YXIKCiAgICBwcmludCgiYWxsb3dfdmFyIDg6IHRydWUiKQp9CgphbGxvd19wb2RfaXBfdmFyKHZhcl9uYW1lLCBwX3ZhcikgewogICAgcHJpbnQoImFsbG93X3BvZF9pcF92YXI6IHZhcl9uYW1lID0iLCB2YXJfbmFtZSwgInBfdmFyID0iLCBwX3ZhcikKCiAgICBwX25hbWVfdmFsdWUgOj0gc3BsaXQocF92YXIsICI9IikKICAgIGNvdW50KHBfbmFtZV92YWx1ZSkgPT0gMgoKICAgIHBfbmFtZV92YWx1ZVswXSA9PSB2YXJfbmFtZQogICAgcF9uYW1lX3ZhbHVlWzFdID09ICIkKHBvZC1pcCkiCgogICAgcHJpbnQoImFsbG93X3BvZF9pcF92YXI6IHRydWUiKQp9CgphbGxvd19ob3N0X2lwX3Zhcih2YXJfbmFtZSwgcF92YXIpIHsKICAgIHByaW50KCJhbGxvd19ob3N0X2lwX3ZhcjogdmFyX25hbWUgPSIsIHZhcl9uYW1lLCAicF92YXIgPSIsIHBfdmFyKQoKICAgIHBfbmFtZV92YWx1ZSA6PSBzcGxpdChwX3ZhciwgIj0iKQogICAgY291bnQocF9uYW1lX3ZhbHVlKSA9PSAyCgogICAgcF9uYW1lX3ZhbHVlWzBdID09IHZhcl9uYW1lCiAgICBwX25hbWVfdmFsdWVbMV0gPT0gIiQoaG9zdC1pcCkiCgogICAgcHJpbnQoImFsbG93X2hvc3RfaXBfdmFyOiB0cnVlIikKfQoKaXNfaXAodmFsdWUpIHsKICAgIGJ5dGVzID0gc3BsaXQodmFsdWUsICIuIikKICAgIGNvdW50KGJ5dGVzKSA9PSA0CgogICAgaXNfaXBfZmlyc3RfYnl0ZShieXRlc1swXSkKICAgIGlzX2lwX290aGVyX2J5dGUoYnl0ZXNbMV0pCiAgICBpc19pcF9vdGhlcl9ieXRlKGJ5dGVzWzJdKQogICAgaXNfaXBfb3RoZXJfYnl0ZShieXRlc1szXSkKfQppc19pcF9maXJzdF9ieXRlKGNvbXBvbmVudCkgewogICAgbnVtYmVyID0gdG9fbnVtYmVyKGNvbXBvbmVudCkKICAgIG51bWJlciA+PSAxCiAgICBudW1iZXIgPD0gMjU1Cn0KaXNfaXBfb3RoZXJfYnl0ZShjb21wb25lbnQpIHsKICAgIG51bWJlciA9IHRvX251bWJlcihjb21wb25lbnQpCiAgICBudW1iZXIgPj0gMAogICAgbnVtYmVyIDw9IDI1NQp9CgojIE9DSSByb290LlBhdGgKYWxsb3dfcm9vdF9wYXRoKHBfb2NpLCBpX29jaSwgYnVuZGxlX2lkKSB7CiAgICBpX3BhdGggOj0gaV9vY2kuUm9vdC5QYXRoCiAgICBwX3BhdGgxIDo9IHBfb2NpLlJvb3QuUGF0aAogICAgcHJpbnQoImFsbG93X3Jvb3RfcGF0aDogaV9wYXRoID0iLCBpX3BhdGgsICJwX3BhdGgxID0iLCBwX3BhdGgxKQoKICAgIHBfcGF0aDIgOj0gcmVwbGFjZShwX3BhdGgxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfcm9vdF9wYXRoOiBwX3BhdGgyID0iLCBwX3BhdGgyKQoKICAgIHBfcGF0aDMgOj0gcmVwbGFjZShwX3BhdGgyLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X3Jvb3RfcGF0aDogcF9wYXRoMyA9IiwgcF9wYXRoMykKCiAgICBwX3BhdGgzID09IGlfcGF0aAoKICAgIHByaW50KCJhbGxvd19yb290X3BhdGg6IHRydWUiKQp9CgojIGRldmljZSBtb3VudHMKYWxsb3dfbW91bnQocF9vY2ksIGlfbW91bnQsIGlfc3RvcmFnZXMsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcHJpbnQoImFsbG93X21vdW50OiBpX21vdW50ID0iLCBpX21vdW50KQoKICAgIHNvbWUgcF9tb3VudCBpbiBwX29jaS5Nb3VudHMKICAgIHNvbWUgaV9zdG9yYWdlIGluIGlfc3RvcmFnZXMKCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IHBfbW91bnQgPSIsIHBfbW91bnQpCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IGlfc3RvcmFnZSA9IiwgaV9zdG9yYWdlKQoKICAgIGNoZWNrX21vdW50KHBfbW91bnQsIGlfbW91bnQsIGlfc3RvcmFnZSwgYnVuZGxlX2lkLCBzYW5kYm94X2lkKQoKICAgICMgVE9ETzogYXJlIHRoZXJlIGFueSBvdGhlciByZXF1aXJlZCBwb2xpY3kgY2hlY2tzIGZvciBtb3VudHMgLSBlLmcuLAogICAgIyAgICAgICBtdWx0aXBsZSBtb3VudHMgd2l0aCBzYW1lIHNvdXJjZSBvciBkZXN0aW5hdGlvbj8KCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IHRydWUiKQp9CgpjaGVja19tb3VudChwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcF9tb3VudCA9PSBpX21vdW50CiAgICBwcmludCgiY2hlY2tfbW91bnQgMTogdHJ1ZSIpCn0KY2hlY2tfbW91bnQocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHBfbW91bnQuZGVzdGluYXRpb24gPT0gaV9tb3VudC5kZXN0aW5hdGlvbgogICAgcF9tb3VudC50eXBlXyA9PSBpX21vdW50LnR5cGVfCiAgICBwX21vdW50Lm9wdGlvbnMgPT0gaV9tb3VudC5vcHRpb25zCgogICAgbW91bnRfc291cmNlX2FsbG93cyhwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkKCiAgICBwcmludCgiY2hlY2tfbW91bnQgMjogdHJ1ZSIpCn0KCm1vdW50X3NvdXJjZV9hbGxvd3MocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHJlZ2V4MSA6PSBwX21vdW50LnNvdXJjZQogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5tb3VudF9zb3VyY2VfY3BhdGgpCiAgICByZWdleDQgOj0gcmVwbGFjZShyZWdleDMsICIkKGJ1bmRsZS1pZCkiLCBidW5kbGVfaWQpCgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMTogcmVnZXg0ID0iLCByZWdleDQpCiAgICByZWdleC5tYXRjaChyZWdleDQsIGlfbW91bnQuc291cmNlKQoKICAgIHByaW50KCJtb3VudF9zb3VyY2VfYWxsb3dzIDE6IHRydWUiKQp9Cm1vdW50X3NvdXJjZV9hbGxvd3MocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHJlZ2V4MSA6PSBwX21vdW50LnNvdXJjZQogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5tb3VudF9zb3VyY2VfY3BhdGgpCiAgICByZWdleDQgOj0gcmVwbGFjZShyZWdleDMsICIkKHNhbmRib3gtaWQpIiwgc2FuZGJveF9pZCkKCiAgICBwcmludCgibW91bnRfc291cmNlX2FsbG93cyAyOiByZWdleDQgPSIsIHJlZ2V4NCkKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4NCwgaV9tb3VudC5zb3VyY2UpCgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMjogdHJ1ZSIpCn0KbW91bnRfc291cmNlX2FsbG93cyhwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogaV9tb3VudC5zb3VyY2UgPSIsIGlfbW91bnQuc291cmNlKQogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogaV9zdG9yYWdlLm1vdW50X3BvaW50ID0iLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCgogICAgaV9tb3VudC5zb3VyY2UgPT0gaV9zdG9yYWdlLm1vdW50X3BvaW50CgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogdHJ1ZSIpCn0KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBDcmVhdGUgY29udGFpbmVyIFN0b3JhZ2VzCgphbGxvd19zdG9yYWdlcyhwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHBfY291bnQgOj0gY291bnQocF9zdG9yYWdlcykKICAgIGlfY291bnQgOj0gY291bnQoaV9zdG9yYWdlcykKICAgIHByaW50KCJhbGxvd19zdG9yYWdlczogcF9jb3VudCA9IiwgcF9jb3VudCwgImlfY291bnQgPSIsIGlfY291bnQpCgogICAgcF9jb3VudCA9PSBpX2NvdW50CgogICAgIyBHZXQgdGhlIGNvbnRhaW5lciBpbWFnZSBsYXllciBJRHMgYW5kIHZlcml0eSByb290IGhhc2hlcywgZnJvbSB0aGUgIm92ZXJsYXlmcyIgc3RvcmFnZS4KICAgIHNvbWUgb3ZlcmxheV9zdG9yYWdlIGluIHBfc3RvcmFnZXMKICAgIG92ZXJsYXlfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIHByaW50KCJhbGxvd19zdG9yYWdlczogb3ZlcmxheV9zdG9yYWdlID0iLCBvdmVybGF5X3N0b3JhZ2UpCiAgICBjb3VudChvdmVybGF5X3N0b3JhZ2Uub3B0aW9ucykgPT0gMgoKICAgIGxheWVyX2lkcyA6PSBzcGxpdChvdmVybGF5X3N0b3JhZ2Uub3B0aW9uc1swXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiBsYXllcl9pZHMgPSIsIGxheWVyX2lkcykKCiAgICByb290X2hhc2hlcyA6PSBzcGxpdChvdmVybGF5X3N0b3JhZ2Uub3B0aW9uc1sxXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiByb290X2hhc2hlcyA9Iiwgcm9vdF9oYXNoZXMpCgogICAgZXZlcnkgaV9zdG9yYWdlIGluIGlfc3RvcmFnZXMgewogICAgICAgIGFsbG93X3N0b3JhZ2UocF9zdG9yYWdlcywgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpCiAgICB9CgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiB0cnVlIikKfQoKYWxsb3dfc3RvcmFnZShwX3N0b3JhZ2VzLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgc29tZSBwX3N0b3JhZ2UgaW4gcF9zdG9yYWdlcwoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiBwX3N0b3JhZ2UgPSIsIHBfc3RvcmFnZSkKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiBpX3N0b3JhZ2UgPSIsIGlfc3RvcmFnZSkKCiAgICBwX3N0b3JhZ2UuZHJpdmVyICAgICAgICAgICA9PSBpX3N0b3JhZ2UuZHJpdmVyCiAgICBwX3N0b3JhZ2UuZHJpdmVyX29wdGlvbnMgICA9PSBpX3N0b3JhZ2UuZHJpdmVyX29wdGlvbnMKICAgIHBfc3RvcmFnZS5mc19ncm91cCAgICAgICAgID09IGlfc3RvcmFnZS5mc19ncm91cAogICAgcF9zdG9yYWdlLmZzdHlwZSAgICAgICAgICAgPT0gaV9zdG9yYWdlLmZzdHlwZQoKICAgIGFsbG93X3N0b3JhZ2Vfc291cmNlKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKQogICAgYWxsb3dfc3RvcmFnZV9vcHRpb25zKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKQogICAgYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKQoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiB0cnVlIikKfQoKYWxsb3dfc3RvcmFnZV9zb3VyY2UocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX3NvdXJjZSAxOiBzdGFydCIpCgogICAgcF9zdG9yYWdlLnNvdXJjZSA9PSBpX3N0b3JhZ2Uuc291cmNlCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDE6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX3NvdXJjZShwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDI6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCgogICAgIyBEREREOkJCOkRELkY6IERvbWFpbjpCdXM6RGV2aWNlLkZ1bmN0aW9uCiAgICAjIGh0dHBzOi8vd3d3Lmtlcm5lbC5vcmcvZG9jL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtYnVzLXBjaQogICAgcmVnZXgubWF0Y2goYF5bYS1mMC05XXs0fTpbYS1mMC05XXsyfTpbYS1mMC05XXsyfVwuW2EtZjAtOV0kYCwgaV9zdG9yYWdlLnNvdXJjZSkKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9zb3VyY2UgMjogdHJ1ZSIpCn0KCmFsbG93X3N0b3JhZ2Vfc291cmNlKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKSB7CiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9zb3VyY2UgMzogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIGlfc3RvcmFnZS5zb3VyY2UgPT0gIm5vbmUiCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDM6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX3NvdXJjZShwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDQ6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJzbWIiCgogICAgIyBQYXR0ZXJuOiAvLzxzdG9yYWdlLWFjY291bnQtbmFtZT4uZmlsZS5jb3JlLndpbmRvd3MubmV0LzxrOHMtUFZDLW5hbWU+CiAgICAjIFN0b3JhZ2UgYWNjb3VudCBuYW1lOiBodHRwczovL2xlYXJuLm1pY3Jvc29mdC5jb20vZW4tdXMvYXp1cmUvc3RvcmFnZS9jb21tb24vc3RvcmFnZS1hY2NvdW50LW92ZXJ2aWV3I3N0b3JhZ2UtYWNjb3VudC1uYW1lCiAgICAjIEs4cyBQVkMgbmFtZTogaHR0cHM6Ly9rdWJlcm5ldGVzLmlvL2RvY3MvY29uY2VwdHMvb3ZlcnZpZXcvd29ya2luZy13aXRoLW9iamVjdHMvbmFtZXMvI2Rucy1zdWJkb21haW4tbmFtZXMKICAgIHJlZ2V4Lm1hdGNoKGBeXC9cLyhbYS16MC05XXszLDI0fSlcLmZpbGVcLmNvcmVcLndpbmRvd3NcLm5ldFwvW2EtejAtOV0oW2EtejAtOS4tXXswLDI1MX1bYS16MC05XSk/JGAsIGlfc3RvcmFnZS5zb3VyY2UpCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDQ6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMTogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgIT0gIm92ZXJsYXlmcyIKICAgIHBfc3RvcmFnZS5vcHRpb25zID09IGlfc3RvcmFnZS5vcHRpb25zCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAxOiB0cnVlIikKfQphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIGNvdW50KHBfc3RvcmFnZS5vcHRpb25zKSA9PSAyCgogICAgcG9saWN5X2lkcyA6PSBzcGxpdChwX3N0b3JhZ2Uub3B0aW9uc1swXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBwb2xpY3lfaWRzID0iLCBwb2xpY3lfaWRzKQogICAgcG9saWN5X2lkcyA9PSBsYXllcl9pZHMKCiAgICBwb2xpY3lfaGFzaGVzIDo9IHNwbGl0KHBfc3RvcmFnZS5vcHRpb25zWzFdLCAiOiIpCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IHBvbGljeV9oYXNoZXMgPSIsIHBvbGljeV9oYXNoZXMpCgogICAgcF9jb3VudCA6PSBjb3VudChwb2xpY3lfaWRzKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBwX2NvdW50ID0iLCBwX2NvdW50KQogICAgcF9jb3VudCA+PSAxCiAgICBwX2NvdW50ID09IGNvdW50KHBvbGljeV9oYXNoZXMpCgogICAgaV9jb3VudCA6PSBjb3VudChpX3N0b3JhZ2Uub3B0aW9ucykKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogaV9jb3VudCA9IiwgaV9jb3VudCkKICAgIGlfY291bnQgPT0gcF9jb3VudCArIDMKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zWzBdID0iLCBpX3N0b3JhZ2Uub3B0aW9uc1swXSkKICAgIGlfc3RvcmFnZS5vcHRpb25zWzBdID09ICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQubGF5ZXItc3JjLXByZWZpeD0vdmFyL2xpYi9jb250YWluZXJkL2lvLmNvbnRhaW5lcmQuc25hcHNob3R0ZXIudjEudGFyZGV2L2xheWVycyIKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zW2lfY291bnQgLSAyXSA9IiwgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDJdKQogICAgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDJdID09ICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQub3ZlcmxheS1ydyIKCiAgICBsb3dlcmRpciA6PSBjb25jYXQoIj0iLCBbImxvd2VyZGlyIiwgcF9zdG9yYWdlLm9wdGlvbnNbMF1dKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBsb3dlcmRpciA9IiwgbG93ZXJkaXIpCgogICAgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDFdID09IGxvd2VyZGlyCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zW2lfY291bnQgLSAxXSA9IiwgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDFdKQoKICAgIGV2ZXJ5IGksIHBvbGljeV9pZCBpbiBwb2xpY3lfaWRzIHsKICAgICAgICBhbGxvd19vdmVybGF5X2xheWVyKHBvbGljeV9pZCwgcG9saWN5X2hhc2hlc1tpXSwgaV9zdG9yYWdlLm9wdGlvbnNbaSArIDFdKQogICAgfQoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogdHJ1ZSIpCn0KYWxsb3dfc3RvcmFnZV9vcHRpb25zKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKSB7CiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDM6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCiAgICBjb3VudChwX3N0b3JhZ2Uub3B0aW9ucykgPT0gMQoKICAgIHN0YXJ0c3dpdGgocF9zdG9yYWdlLm9wdGlvbnNbMF0sICIkKGhhc2giKQogICAgaGFzaF9zdWZmaXggOj0gdHJpbV9sZWZ0KHBfc3RvcmFnZS5vcHRpb25zWzBdLCAiJChoYXNoIikKCiAgICBlbmRzd2l0aChoYXNoX3N1ZmZpeCwgIikiKQogICAgaGFzaF9pbmRleCA6PSB0cmltX3JpZ2h0KGhhc2hfc3VmZml4LCAiKSIpCiAgICBpIDo9IHRvX251bWJlcihoYXNoX2luZGV4KQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAzOiBpID0iLCBpKQoKICAgIGhhc2hfb3B0aW9uIDo9IGNvbmNhdCgiPSIsIFsiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LnJvb3QtaGFzaCIsIHJvb3RfaGFzaGVzW2ldXSkKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMzogaGFzaF9vcHRpb24gPSIsIGhhc2hfb3B0aW9uKQoKICAgIGNvdW50KGlfc3RvcmFnZS5vcHRpb25zKSA9PSA0CiAgICBpX3N0b3JhZ2Uub3B0aW9uc1swXSA9PSAicm8iCiAgICBpX3N0b3JhZ2Uub3B0aW9uc1sxXSA9PSAiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmJsb2NrX2RldmljZT1maWxlIgogICAgaV9zdG9yYWdlLm9wdGlvbnNbMl0gPT0gImlvLmthdGFjb250YWluZXJzLmZzLW9wdC5pcy1sYXllciIKICAgIGlfc3RvcmFnZS5vcHRpb25zWzNdID09IGhhc2hfb3B0aW9uCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAzOiB0cnVlIikKfQphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgNDogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gInNtYiIKICAgIHBfb3B0c19jb3VudCA6PSBjb3VudChwX3N0b3JhZ2Uub3B0aW9ucykKICAgIGlfb3B0c19jb3VudCA6PSBjb3VudChpX3N0b3JhZ2Uub3B0aW9ucykKICAgIGlfb3B0c19jb3VudCA9PSBwX29wdHNfY291bnQgKyAyCgogICAgaV9vcHRfbWF0Y2hlcyA6PSBbaSB8IGkgOj0gaWR4OyBpZHggPCBwX29wdHNfY291bnQ7IHBfc3RvcmFnZS5vcHRpb25zW2lkeF0gPT0gaV9zdG9yYWdlLm9wdGlvbnNbaWR4XV0KICAgIGNvdW50KGlfb3B0X21hdGNoZXMpID09IHBfb3B0c19jb3VudAoKICAgIHN0YXJ0c3dpdGgoaV9zdG9yYWdlLm9wdGlvbnNbaV9vcHRzX2NvdW50LTJdLCAiYWRkcj0iKQogICAgY3JlZHMgPSBzcGxpdChpX3N0b3JhZ2Uub3B0aW9uc1tpX29wdHNfY291bnQtMV0sICIsIikKICAgIGNvdW50KGNyZWRzKSA9PSAyCiAgICBzdGFydHN3aXRoKGNyZWRzWzBdLCAidXNlcm5hbWU9IikKICAgIHN0YXJ0c3dpdGgoY3JlZHNbMV0sICJwYXNzd29yZD0iKQogICAgCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDQ6IHRydWUiKQp9CgphbGxvd19vdmVybGF5X2xheWVyKHBvbGljeV9pZCwgcG9saWN5X2hhc2gsIGlfb3B0aW9uKSB7CiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogcG9saWN5X2lkID0iLCBwb2xpY3lfaWQsICJwb2xpY3lfaGFzaCA9IiwgcG9saWN5X2hhc2gpCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogaV9vcHRpb24gPSIsIGlfb3B0aW9uKQoKICAgIHN0YXJ0c3dpdGgoaV9vcHRpb24sICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQubGF5ZXI9IikKICAgIGlfdmFsdWUgOj0gcmVwbGFjZShpX29wdGlvbiwgImlvLmthdGFjb250YWluZXJzLmZzLW9wdC5sYXllcj0iLCAiIikKICAgIGlfdmFsdWVfZGVjb2RlZCA6PSBiYXNlNjQuZGVjb2RlKGlfdmFsdWUpCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogaV92YWx1ZV9kZWNvZGVkID0iLCBpX3ZhbHVlX2RlY29kZWQpCgogICAgcG9saWN5X3N1ZmZpeCA6PSBjb25jYXQoIj0iLCBbInRhcixybyxpby5rYXRhY29udGFpbmVycy5mcy1vcHQuYmxvY2tfZGV2aWNlPWZpbGUsaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmlzLWxheWVyLGlvLmthdGFjb250YWluZXJzLmZzLW9wdC5yb290LWhhc2giLCBwb2xpY3lfaGFzaF0pCiAgICBwX3ZhbHVlIDo9IGNvbmNhdCgiLCIsIFtwb2xpY3lfaWQsIHBvbGljeV9zdWZmaXhdKQogICAgcHJpbnQoImFsbG93X292ZXJsYXlfbGF5ZXI6IHBfdmFsdWUgPSIsIHBfdmFsdWUpCgogICAgcF92YWx1ZSA9PSBpX3ZhbHVlX2RlY29kZWQKCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogdHJ1ZSIpCn0KCmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAidGFyIgoKICAgIHN0YXJ0c3dpdGgocF9zdG9yYWdlLm1vdW50X3BvaW50LCAiJChsYXllciIpCiAgICBtb3VudF9zdWZmaXggOj0gdHJpbV9sZWZ0KHBfc3RvcmFnZS5tb3VudF9wb2ludCwgIiQobGF5ZXIiKQoKICAgIGVuZHN3aXRoKG1vdW50X3N1ZmZpeCwgIikiKQogICAgbGF5ZXJfaW5kZXggOj0gdHJpbV9yaWdodChtb3VudF9zdWZmaXgsICIpIikKICAgIGkgOj0gdG9fbnVtYmVyKGxheWVyX2luZGV4KQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDE6IGkgPSIsIGkpCgogICAgbGF5ZXJfaWQgOj0gbGF5ZXJfaWRzW2ldCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMTogbGF5ZXJfaWQgPSIsIGxheWVyX2lkKQoKICAgIHBfbW91bnQgOj0gY29uY2F0KCIvIiwgWyIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L2xheWVycyIsIGxheWVyX2lkXSkKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCAxOiBwX21vdW50ID0iLCBwX21vdW50KQoKICAgIHBfbW91bnQgPT0gaV9zdG9yYWdlLm1vdW50X3BvaW50CgogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDE6IHRydWUiKQp9CmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAiZnVzZTMua2F0YS1vdmVybGF5IgoKICAgIG1vdW50MSA6PSByZXBsYWNlKHBfc3RvcmFnZS5tb3VudF9wb2ludCwgIiQoY3BhdGgpIiwgcG9saWN5X2RhdGEuY29tbW9uLmNwYXRoKQogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDI6IG1vdW50MiA9IiwgbW91bnQyKQoKICAgIG1vdW50MiA9PSBpX3N0b3JhZ2UubW91bnRfcG9pbnQKCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMjogdHJ1ZSIpCn0KYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKSB7CiAgICBwX3N0b3JhZ2UuZnN0eXBlID09ICJsb2NhbCIKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQyID0iLCBtb3VudDIpCgogICAgbW91bnQzIDo9IHJlcGxhY2UobW91bnQyLCAiJChzYW5kYm94LWlkKSIsIHNhbmRib3hfaWQpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQzID0iLCBtb3VudDMpCgogICAgcmVnZXgubWF0Y2gobW91bnQzLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCgogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDM6IHRydWUiKQp9CmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAiYmluZCIKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNDogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNDogbW91bnQyID0iLCBtb3VudDIpCgogICAgbW91bnQzIDo9IHJlcGxhY2UobW91bnQyLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDQ6IG1vdW50MyA9IiwgbW91bnQzKQoKICAgIHJlZ2V4Lm1hdGNoKG1vdW50MywgaV9zdG9yYWdlLm1vdW50X3BvaW50KQoKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA0OiB0cnVlIikKfQphbGxvd19tb3VudF9wb2ludChwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgYnVuZGxlX2lkLCBzYW5kYm94X2lkLCBsYXllcl9pZHMpIHsKICAgIHBfc3RvcmFnZS5mc3R5cGUgPT0gInRtcGZzIgoKICAgIG1vdW50MSA6PSBwX3N0b3JhZ2UubW91bnRfcG9pbnQKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA1OiBtb3VudDEgPSIsIG1vdW50MSkKCiAgICByZWdleC5tYXRjaChtb3VudDEsIGlfc3RvcmFnZS5tb3VudF9wb2ludCkKCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNTogdHJ1ZSIpCn0KYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKSB7CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogaV9zdG9yYWdlLm1vdW50X3BvaW50ID0iLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCiAgICBhbGxvd19kaXJlY3Rfdm9sX2RyaXZlcihwX3N0b3JhZ2UsIGlfc3RvcmFnZSkKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChzcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQyID0iLCBtb3VudDIpCgogICAgZGlyZWN0X3ZvbF9wYXRoIDo9IGlfc3RvcmFnZS5zb3VyY2UKICAgIG1vdW50MyA6PSByZXBsYWNlKG1vdW50MiwgIiQoYjY0LWRpcmVjdC12b2wtcGF0aCkiLCBiYXNlNjR1cmwuZW5jb2RlKGRpcmVjdF92b2xfcGF0aCkpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQzID0iLCBtb3VudDMpCgogICAgbW91bnQzID09IGlfc3RvcmFnZS5tb3VudF9wb2ludAoKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA2OiB0cnVlIikKfQoKYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIocF9zdG9yYWdlLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19kaXJlY3Rfdm9sX2RyaXZlciAxOiBzdGFydCIpCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCiAgICBwcmludCgiYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIgMTogdHJ1ZSIpCn0KYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIocF9zdG9yYWdlLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19kaXJlY3Rfdm9sX2RyaXZlciAyOiBzdGFydCIpCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJzbWIiCiAgICBwcmludCgiYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIgMjogdHJ1ZSIpCn0KCiMgRXhlY1Byb2Nlc3NSZXF1ZXN0LnByb2Nlc3MuQ2FwYWJpbGl0aWVzCmFsbG93X2V4ZWNfY2FwcyhpX2NhcHMpIHsKICAgIG5vdCBpX2NhcHMuQW1iaWVudAogICAgbm90IGlfY2Fwcy5Cb3VuZGluZwogICAgbm90IGlfY2Fwcy5FZmZlY3RpdmUKICAgIG5vdCBpX2NhcHMuSW5oZXJpdGFibGUKICAgIG5vdCBpX2NhcHMuUGVybWl0dGVkCn0KCiMgT0NJLlByb2Nlc3MuQ2FwYWJpbGl0aWVzCmFsbG93X2NhcHMocF9jYXBzLCBpX2NhcHMpIHsKICAgIHByaW50KCJhbGxvd19jYXBzOiBwb2xpY3kgQW1iaWVudCA9IiwgcF9jYXBzLkFtYmllbnQpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgQW1iaWVudCA9IiwgaV9jYXBzLkFtYmllbnQpCiAgICBtYXRjaF9jYXBzKHBfY2Fwcy5BbWJpZW50LCBpX2NhcHMuQW1iaWVudCkKCiAgICBwcmludCgiYWxsb3dfY2FwczogcG9saWN5IEJvdW5kaW5nID0iLCBwX2NhcHMuQm91bmRpbmcpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgQm91bmRpbmcgPSIsIGlfY2Fwcy5Cb3VuZGluZykKICAgIG1hdGNoX2NhcHMocF9jYXBzLkJvdW5kaW5nLCBpX2NhcHMuQm91bmRpbmcpCgogICAgcHJpbnQoImFsbG93X2NhcHM6IHBvbGljeSBFZmZlY3RpdmUgPSIsIHBfY2Fwcy5FZmZlY3RpdmUpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgRWZmZWN0aXZlID0iLCBpX2NhcHMuRWZmZWN0aXZlKQogICAgbWF0Y2hfY2FwcyhwX2NhcHMuRWZmZWN0aXZlLCBpX2NhcHMuRWZmZWN0aXZlKQoKICAgIHByaW50KCJhbGxvd19jYXBzOiBwb2xpY3kgSW5oZXJpdGFibGUgPSIsIHBfY2Fwcy5Jbmhlcml0YWJsZSkKICAgIHByaW50KCJhbGxvd19jYXBzOiBpbnB1dCBJbmhlcml0YWJsZSA9IiwgaV9jYXBzLkluaGVyaXRhYmxlKQogICAgbWF0Y2hfY2FwcyhwX2NhcHMuSW5oZXJpdGFibGUsIGlfY2Fwcy5Jbmhlcml0YWJsZSkKCiAgICBwcmludCgiYWxsb3dfY2FwczogcG9saWN5IFBlcm1pdHRlZCA9IiwgcF9jYXBzLlBlcm1pdHRlZCkKICAgIHByaW50KCJhbGxvd19jYXBzOiBpbnB1dCBQZXJtaXR0ZWQgPSIsIGlfY2Fwcy5QZXJtaXR0ZWQpCiAgICBtYXRjaF9jYXBzKHBfY2Fwcy5QZXJtaXR0ZWQsIGlfY2Fwcy5QZXJtaXR0ZWQpCn0KCm1hdGNoX2NhcHMocF9jYXBzLCBpX2NhcHMpIHsKICAgIHByaW50KCJtYXRjaF9jYXBzIDE6IHN0YXJ0IikKCiAgICBwX2NhcHMgPT0gaV9jYXBzCgogICAgcHJpbnQoIm1hdGNoX2NhcHMgMTogdHJ1ZSIpCn0KbWF0Y2hfY2FwcyhwX2NhcHMsIGlfY2FwcykgewogICAgcHJpbnQoIm1hdGNoX2NhcHMgMjogc3RhcnQiKQoKICAgIGNvdW50KHBfY2FwcykgPT0gMQogICAgcF9jYXBzWzBdID09ICIkKGRlZmF1bHRfY2FwcykiCgogICAgcHJpbnQoIm1hdGNoX2NhcHMgMjogZGVmYXVsdF9jYXBzID0iLCBwb2xpY3lfZGF0YS5jb21tb24uZGVmYXVsdF9jYXBzKQogICAgcG9saWN5X2RhdGEuY29tbW9uLmRlZmF1bHRfY2FwcyA9PSBpX2NhcHMKCiAgICBwcmludCgibWF0Y2hfY2FwcyAyOiB0cnVlIikKfQptYXRjaF9jYXBzKHBfY2FwcywgaV9jYXBzKSB7CiAgICBwcmludCgibWF0Y2hfY2FwcyAzOiBzdGFydCIpCgogICAgY291bnQocF9jYXBzKSA9PSAxCiAgICBwX2NhcHNbMF0gPT0gIiQocHJpdmlsZWdlZF9jYXBzKSIKCiAgICBwcmludCgibWF0Y2hfY2FwcyAzOiBwcml2aWxlZ2VkX2NhcHMgPSIsIHBvbGljeV9kYXRhLmNvbW1vbi5wcml2aWxlZ2VkX2NhcHMpCiAgICBwb2xpY3lfZGF0YS5jb21tb24ucHJpdmlsZWdlZF9jYXBzID09IGlfY2FwcwoKICAgIHByaW50KCJtYXRjaF9jYXBzIDM6IHRydWUiKQp9CgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgpjaGVja19kaXJlY3RvcnlfdHJhdmVyc2FsKGlfcGF0aCkgewogICAgbm90IHJlZ2V4Lm1hdGNoKCIoXnwvKS4uKCR8LykiLCBpX3BhdGgpCn0KCmNoZWNrX3N5bWxpbmtfc291cmNlKGlfc3JjKSB7CiAgICBpX3NyYyA9PSAiIgogICAgcHJpbnQoImNoZWNrX3N5bWxpbmtfc291cmNlIDE6IHRydWUiKQp9CmNoZWNrX3N5bWxpbmtfc291cmNlKGlfc3JjKSB7CiAgICBpX3NyYyAhPSAiIgogICAgcHJpbnQoImNoZWNrX3N5bWxpbmtfc291cmNlIDI6IGlfc3JjID0iLCBpX3NyYykKCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24uc19zb3VyY2UxLCBpX3NyYykKCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMjogdHJ1ZSIpCn0KY2hlY2tfc3ltbGlua19zb3VyY2UoaV9zcmMpIHsKICAgIGlfc3JjICE9ICIiCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMzogaV9zcmMgPSIsIGlfc3JjKQoKICAgIHJlZ2V4Lm1hdGNoKHBvbGljeV9kYXRhLmNvbW1vbi5zX3NvdXJjZTIsIGlfc3JjKQogICAgY2hlY2tfZGlyZWN0b3J5X3RyYXZlcnNhbChpX3NyYykKCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMzogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfc3RvcmFnZXMoaV9zdG9yYWdlcykgewogICAgcHJpbnQoImFsbG93X3NhbmRib3hfc3RvcmFnZXM6IGlfc3RvcmFnZXMgPSIsIGlfc3RvcmFnZXMpCgogICAgcF9zdG9yYWdlcyA6PSBwb2xpY3lfZGF0YS5zYW5kYm94LnN0b3JhZ2VzCiAgICBldmVyeSBpX3N0b3JhZ2UgaW4gaV9zdG9yYWdlcyB7CiAgICAgICAgYWxsb3dfc2FuZGJveF9zdG9yYWdlKHBfc3RvcmFnZXMsIGlfc3RvcmFnZSkKICAgIH0KCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9zdG9yYWdlczogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfc3RvcmFnZShwX3N0b3JhZ2VzLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IGlfc3RvcmFnZSA9IiwgaV9zdG9yYWdlKQoKICAgIHNvbWUgcF9zdG9yYWdlIGluIHBfc3RvcmFnZXMKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IHBfc3RvcmFnZSA9IiwgcF9zdG9yYWdlKQogICAgaV9zdG9yYWdlID09IHBfc3RvcmFnZQoKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IHRydWUiKQp9CgpDb3B5RmlsZVJlcXVlc3QgewogICAgcHJpbnQoIkNvcHlGaWxlUmVxdWVzdDogaW5wdXQucGF0aCA9IiwgaW5wdXQucGF0aCkKCiAgICBjaGVja19zeW1saW5rX3NvdXJjZShpbnB1dC5zeW1saW5rX3NyYykKICAgIGNoZWNrX2RpcmVjdG9yeV90cmF2ZXJzYWwoaW5wdXQucGF0aCkKCiAgICBzb21lIHJlZ2V4MSBpbiBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLkNvcHlGaWxlUmVxdWVzdAogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5jcGF0aCkKICAgIHJlZ2V4NCA6PSByZXBsYWNlKHJlZ2V4MywgIiQoYnVuZGxlLWlkKSIsIEJVTkRMRV9JRCkKICAgIHByaW50KCJDb3B5RmlsZVJlcXVlc3Q6IHJlZ2V4NCA9IiwgcmVnZXg0KQoKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4NCwgaW5wdXQucGF0aCkKCiAgICBwcmludCgiQ29weUZpbGVSZXF1ZXN0OiB0cnVlIikKfQoKQ3JlYXRlU2FuZGJveFJlcXVlc3QgewogICAgcHJpbnQoIkNyZWF0ZVNhbmRib3hSZXF1ZXN0OiBpbnB1dC5ndWVzdF9ob29rX3BhdGggPSIsIGlucHV0Lmd1ZXN0X2hvb2tfcGF0aCkKICAgIGNvdW50KGlucHV0Lmd1ZXN0X2hvb2tfcGF0aCkgPT0gMAoKICAgIHByaW50KCJDcmVhdGVTYW5kYm94UmVxdWVzdDogaW5wdXQua2VybmVsX21vZHVsZXMgPSIsIGlucHV0Lmtlcm5lbF9tb2R1bGVzKQogICAgY291bnQoaW5wdXQua2VybmVsX21vZHVsZXMpID09IDAKCiAgICBpX3BpZG5zIDo9IGlucHV0LnNhbmRib3hfcGlkbnMKICAgIHByaW50KCJDcmVhdGVTYW5kYm94UmVxdWVzdDogaV9waWRucyA9IiwgaV9waWRucykKICAgIGlfcGlkbnMgPT0gZmFsc2UKICAgIGFsbG93X3NhbmRib3hfc3RvcmFnZXMoaW5wdXQuc3RvcmFnZXMpCn0KCmFsbG93X2V4ZWMocF9jb250YWluZXIsIGlfcHJvY2VzcykgewogICAgcHJpbnQoImFsbG93X2V4ZWM6IHN0YXJ0IikKCiAgICBwX29jaSA9IHBfY29udGFpbmVyLk9DSQogICAgcF9zX25hbWUgPSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc19uYW1lc3BhY2UgPSBnZXRfc3RhdGVfdmFsKCJuYW1lc3BhY2UiKQogICAgYWxsb3dfcHJvYmVfcHJvY2VzcyhwX29jaS5Qcm9jZXNzLCBpX3Byb2Nlc3MsIHBfc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfZXhlYzogdHJ1ZSIpCn0KCmFsbG93X2ludGVyYWN0aXZlX2V4ZWMocF9jb250YWluZXIsIGlfcHJvY2VzcykgewogICAgcHJpbnQoImFsbG93X2ludGVyYWN0aXZlX2V4ZWM6IHN0YXJ0IikKCiAgICBwX29jaSA9IHBfY29udGFpbmVyLk9DSQogICAgcF9zX25hbWUgPSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc19uYW1lc3BhY2UgPSBnZXRfc3RhdGVfdmFsKCJuYW1lc3BhY2UiKQogICAgYWxsb3dfaW50ZXJhY3RpdmVfcHJvY2VzcyhwX29jaS5Qcm9jZXNzLCBpX3Byb2Nlc3MsIHBfc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfaW50ZXJhY3RpdmVfZXhlYzogdHJ1ZSIpCn0KCiMgVE9ETzogc2hvdWxkIG90aGVyIEV4ZWNQcm9jZXNzUmVxdWVzdCBpbnB1dCBkYXRhIGZpZWxkcyBiZSB2YWxpZGF0ZWQgYXMgd2VsbD8KRXhlY1Byb2Nlc3NSZXF1ZXN0IHsKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMTogaW5wdXQgPSIsIGlucHV0KQoKICAgIHNvbWUgcF9jb21tYW5kIGluIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuRXhlY1Byb2Nlc3NSZXF1ZXN0LmFsbG93ZWRfY29tbWFuZHMKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMTogcF9jb21tYW5kID0iLCBwX2NvbW1hbmQpCiAgICBwX2NvbW1hbmQgPT0gaW5wdXQucHJvY2Vzcy5BcmdzCgogICAgIyBUT0RPOiBtYXRjaCBwX2NvbnRhaW5lcidzIElEIHdpdGggdGhlIGlucHV0IGNvbnRhaW5lcl9pZC4KICAgIHNvbWUgcF9jb250YWluZXIgaW4gcG9saWN5X2RhdGEuY29udGFpbmVycwogICAgYWxsb3dfaW50ZXJhY3RpdmVfZXhlYyhwX2NvbnRhaW5lciwgaW5wdXQucHJvY2VzcykKCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDE6IHRydWUiKQp9CkV4ZWNQcm9jZXNzUmVxdWVzdCB7CiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDI6IGlucHV0ID0iLCBpbnB1dCkKCiAgICAjIFRPRE86IG1hdGNoIGlucHV0IGNvbnRhaW5lciBJRCB3aXRoIGl0cyBjb3JyZXNwb25kaW5nIGNvbnRhaW5lci5leGVjX2NvbW1hbmRzLgogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBzb21lIHBfY29tbWFuZCBpbiBwX2NvbnRhaW5lci5leGVjX2NvbW1hbmRzCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDI6IHBfY29tbWFuZCA9IiwgcF9jb21tYW5kKQoKICAgICMgVE9ETzogc2hvdWxkIG90aGVyIGlucHV0IGRhdGEgZmllbGRzIGJlIHZhbGlkYXRlZCBhcyB3ZWxsPwogICAgcF9jb21tYW5kID09IGlucHV0LnByb2Nlc3MuQXJncwoKICAgIGFsbG93X2V4ZWMocF9jb250YWluZXIsIGlucHV0LnByb2Nlc3MpCgogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAyOiB0cnVlIikKfQpFeGVjUHJvY2Vzc1JlcXVlc3QgewogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAzOiBpbnB1dCA9IiwgaW5wdXQpCgogICAgaV9jb21tYW5kID0gY29uY2F0KCIgIiwgaW5wdXQucHJvY2Vzcy5BcmdzKQogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAzOiBpX2NvbW1hbmQgPSIsIGlfY29tbWFuZCkKCiAgICBzb21lIHBfcmVnZXggaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5FeGVjUHJvY2Vzc1JlcXVlc3QucmVnZXgKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMzogcF9yZWdleCA9IiwgcF9yZWdleCkKCiAgICByZWdleC5tYXRjaChwX3JlZ2V4LCBpX2NvbW1hbmQpCgogICAgIyBUT0RPOiBtYXRjaCBwX2NvbnRhaW5lcidzIElEIHdpdGggdGhlIGlucHV0IGNvbnRhaW5lcl9pZC4KICAgIHNvbWUgcF9jb250YWluZXIgaW4gcG9saWN5X2RhdGEuY29udGFpbmVycwogICAgYWxsb3dfaW50ZXJhY3RpdmVfZXhlYyhwX2NvbnRhaW5lciwgaW5wdXQucHJvY2VzcykKCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDM6IHRydWUiKQp9CgpVcGRhdGVSb3V0ZXNSZXF1ZXN0IHsKICAgIHByaW50KCJVcGRhdGVSb3V0ZXNSZXF1ZXN0OiBpbnB1dCA9IiwgaW5wdXQpCiAgICBwcmludCgiVXBkYXRlUm91dGVzUmVxdWVzdDogcG9saWN5ID0iLCBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLlVwZGF0ZVJvdXRlc1JlcXVlc3QpCgogICAgaV9yb3V0ZXMgOj0gaW5wdXQucm91dGVzLlJvdXRlcwogICAgcF9zb3VyY2VfcmVnZXggPSBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLlVwZGF0ZVJvdXRlc1JlcXVlc3QuZm9yYmlkZGVuX3NvdXJjZV9yZWdleAogICAgcF9uYW1lcyA9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuVXBkYXRlUm91dGVzUmVxdWVzdC5mb3JiaWRkZW5fZGV2aWNlX25hbWVzCgogICAgZXZlcnkgaV9yb3V0ZSBpbiBpX3JvdXRlcyB7CiAgICAgICAgcHJpbnQoImlfcm91dGUuc291cmNlID0iLCBpX3JvdXRlLnNvdXJjZSkKICAgICAgICBldmVyeSBwX3JlZ2V4IGluIHBfc291cmNlX3JlZ2V4IHsKICAgICAgICAgICAgcHJpbnQoInBfcmVnZXggPSIsIHBfcmVnZXgpCiAgICAgICAgICAgIG5vdCByZWdleC5tYXRjaChwX3JlZ2V4LCBpX3JvdXRlLnNvdXJjZSkKICAgICAgICB9CgogICAgICAgIHByaW50KCJpX3JvdXRlLmRldmljZSA9IiwgaV9yb3V0ZS5kZXZpY2UpCiAgICAgICAgbm90IGlfcm91dGUuZGV2aWNlIGluIHBfbmFtZXMKICAgIH0KCiAgICBwcmludCgiVXBkYXRlUm91dGVzUmVxdWVzdDogdHJ1ZSIpCn0KClVwZGF0ZUludGVyZmFjZVJlcXVlc3QgewogICAgcHJpbnQoIlVwZGF0ZUludGVyZmFjZVJlcXVlc3Q6IGlucHV0ID0iLCBpbnB1dCkKICAgIHByaW50KCJVcGRhdGVJbnRlcmZhY2VSZXF1ZXN0OiBwb2xpY3kgPSIsIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuVXBkYXRlSW50ZXJmYWNlUmVxdWVzdCkKCiAgICBpX2ludGVyZmFjZSA6PSBpbnB1dC5pbnRlcmZhY2UKICAgIHBfZmxhZ3MgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmFsbG93X3Jhd19mbGFncwoKICAgICMgVHlwaWNhbGx5LCBqdXN0IElGRl9OT0FSUCBpcyB1c2VkLgogICAgYml0cy5hbmQoaV9pbnRlcmZhY2UucmF3X2ZsYWdzLCBiaXRzLm5lZ2F0ZShwX2ZsYWdzKSkgPT0gMAoKICAgIHBfbmFtZXMgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmZvcmJpZGRlbl9uYW1lcwoKICAgIG5vdCBpX2ludGVyZmFjZS5uYW1lIGluIHBfbmFtZXMKCiAgICBwX2h3YWRkcnMgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmZvcmJpZGRlbl9od19hZGRycwoKICAgIG5vdCBpX2ludGVyZmFjZS5od0FkZHIgaW4gcF9od2FkZHJzCgogICAgcHJpbnQoIlVwZGF0ZUludGVyZmFjZVJlcXVlc3Q6IHRydWUiKQp9CgpDbG9zZVN0ZGluUmVxdWVzdCB7CiAgICBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLkNsb3NlU3RkaW5SZXF1ZXN0ID09IHRydWUKfQoKUmVhZFN0cmVhbVJlcXVlc3QgewogICAgcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5SZWFkU3RyZWFtUmVxdWVzdCA9PSB0cnVlCn0KClVwZGF0ZUVwaGVtZXJhbE1vdW50c1JlcXVlc3QgewogICAgcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVFcGhlbWVyYWxNb3VudHNSZXF1ZXN0ID09IHRydWUKfQoKV3JpdGVTdHJlYW1SZXF1ZXN0IHsKICAgIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuV3JpdGVTdHJlYW1SZXF1ZXN0ID09IHRydWUKfQoKcG9saWN5X2RhdGEgOj0gewogICJjb250YWluZXJzIjogWwogICAgewogICAgICAiT0NJIjogewogICAgICAgICJWZXJzaW9uIjogIjEuMS4wLXJjLjEiLAogICAgICAgICJQcm9jZXNzIjogewogICAgICAgICAgIlRlcm1pbmFsIjogZmFsc2UsCiAgICAgICAgICAiVXNlciI6IHsKICAgICAgICAgICAgIlVJRCI6IDY1NTM1LAogICAgICAgICAgICAiR0lEIjogNjU1MzUsCiAgICAgICAgICAgICJBZGRpdGlvbmFsR2lkcyI6IFtdLAogICAgICAgICAgICAiVXNlcm5hbWUiOiAiIgogICAgICAgICAgfSwKICAgICAgICAgICJEZXByZWNhdGVkQXJncyI6IFsKICAgICAgICAgICAgIi9wYXVzZSIKICAgICAgICAgIF0sCiAgICAgICAgICAiQXJncyI6IFsKICAgICAgICAgICAgIi9wYXVzZSIKICAgICAgICAgIF0sCiAgICAgICAgICAiRW52IjogWwogICAgICAgICAgICAiUEFUSD0vdXNyL2xvY2FsL3NiaW46L3Vzci9sb2NhbC9iaW46L3Vzci9zYmluOi91c3IvYmluOi9zYmluOi9iaW4iCiAgICAgICAgICBdLAogICAgICAgICAgIkN3ZCI6ICIvIiwKICAgICAgICAgICJDYXBhYmlsaXRpZXMiOiB7CiAgICAgICAgICAgICJBbWJpZW50IjogW10sCiAgICAgICAgICAgICJCb3VuZGluZyI6IFsKICAgICAgICAgICAgICAiJChkZWZhdWx0X2NhcHMpIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiRWZmZWN0aXZlIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJJbmhlcml0YWJsZSI6IFtdLAogICAgICAgICAgICAiUGVybWl0dGVkIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICAiTm9OZXdQcml2aWxlZ2VzIjogdHJ1ZQogICAgICAgIH0sCiAgICAgICAgIlJvb3QiOiB7CiAgICAgICAgICAiUGF0aCI6ICIkKGNwYXRoKS8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgIlJlYWRvbmx5IjogdHJ1ZQogICAgICAgIH0sCiAgICAgICAgIk1vdW50cyI6IFsKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9wcm9jIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJwcm9jIiwKICAgICAgICAgICAgInR5cGVfIjogInByb2MiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2IiwKICAgICAgICAgICAgInNvdXJjZSI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJzdHJpY3RhdGltZSIsCiAgICAgICAgICAgICAgIm1vZGU9NzU1IiwKICAgICAgICAgICAgICAic2l6ZT02NTUzNmsiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L3B0cyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiZGV2cHRzIiwKICAgICAgICAgICAgInR5cGVfIjogImRldnB0cyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJuZXdpbnN0YW5jZSIsCiAgICAgICAgICAgICAgInB0bXhtb2RlPTA2NjYiLAogICAgICAgICAgICAgICJtb2RlPTA2MjAiLAogICAgICAgICAgICAgICJnaWQ9NSIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvc2htIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L3NobSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi9tcXVldWUiLAogICAgICAgICAgICAic291cmNlIjogIm1xdWV1ZSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJtcXVldWUiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvc3lzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJzeXNmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJzeXNmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2V0Yy9yZXNvbHYuY29uZiIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClyZXNvbHYuY29uZiQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJvIiwKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9kZXYiLAogICAgICAgICAgICAgICJub2V4ZWMiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0KICAgICAgICBdLAogICAgICAgICJBbm5vdGF0aW9ucyI6IHsKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmJ1bmRsZV9wYXRoIjogIi9ydW4vY29udGFpbmVyZC9pby5jb250YWluZXJkLnJ1bnRpbWUudjIudGFzay9rOHMuaW8vJChidW5kbGUtaWQpIiwKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIjogInBvZF9zYW5kYm94IiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSI6ICJzYW5kYm94IiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWlkIjogIl5bYS16MC05XXs2NH0kIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWxvZy1kaXJlY3RvcnkiOiAiXi92YXIvbG9nL3BvZHMvJChzYW5kYm94LW5hbWVzcGFjZSlfJChzYW5kYm94LW5hbWUpX1swLTlhLWZdezh9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezEyfSQiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZXNwYWNlIjogIiIsCiAgICAgICAgICAibmVyZGN0bC9uZXR3b3JrLW5hbWVzcGFjZSI6ICJeL3Zhci9ydW4vbmV0bnMvY25pLVswLTlhLWZdezh9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezEyfSQiCiAgICAgICAgfSwKICAgICAgICAiTGludXgiOiB7CiAgICAgICAgICAiTmFtZXNwYWNlcyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICJUeXBlIjogImlwYyIsCiAgICAgICAgICAgICAgIlBhdGgiOiAiIgogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgIlR5cGUiOiAidXRzIiwKICAgICAgICAgICAgICAiUGF0aCI6ICIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiVHlwZSI6ICJtb3VudCIsCiAgICAgICAgICAgICAgIlBhdGgiOiAiIgogICAgICAgICAgICB9CiAgICAgICAgICBdLAogICAgICAgICAgIk1hc2tlZFBhdGhzIjogWwogICAgICAgICAgICAiL3Byb2MvYWNwaSIsCiAgICAgICAgICAgICIvcHJvYy9hc291bmQiLAogICAgICAgICAgICAiL3Byb2Mva2NvcmUiLAogICAgICAgICAgICAiL3Byb2Mva2V5cyIsCiAgICAgICAgICAgICIvcHJvYy9sYXRlbmN5X3N0YXRzIiwKICAgICAgICAgICAgIi9wcm9jL3RpbWVyX2xpc3QiLAogICAgICAgICAgICAiL3Byb2MvdGltZXJfc3RhdHMiLAogICAgICAgICAgICAiL3Byb2Mvc2NoZWRfZGVidWciLAogICAgICAgICAgICAiL3N5cy9maXJtd2FyZSIsCiAgICAgICAgICAgICIvcHJvYy9zY3NpIgogICAgICAgICAgXSwKICAgICAgICAgICJSZWFkb25seVBhdGhzIjogWwogICAgICAgICAgICAiL3Byb2MvYnVzIiwKICAgICAgICAgICAgIi9wcm9jL2ZzIiwKICAgICAgICAgICAgIi9wcm9jL2lycSIsCiAgICAgICAgICAgICIvcHJvYy9zeXMiLAogICAgICAgICAgICAiL3Byb2Mvc3lzcnEtdHJpZ2dlciIKICAgICAgICAgIF0sCiAgICAgICAgICAiRGV2aWNlcyI6IFtdLAogICAgICAgICAgIlN5c2N0bCI6IHsKICAgICAgICAgICAgIm5ldC5pcHY0LmlwX3VucHJpdmlsZWdlZF9wb3J0X3N0YXJ0IjogIjAiLAogICAgICAgICAgICAibmV0LmlwdjQucGluZ19ncm91cF9yYW5nZSI6ICIwIDIxNDc0ODM2NDciCiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9LAogICAgICAic3RvcmFnZXMiOiBbCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJibGsiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogInRhciIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIiQoaGFzaDApIgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGxheWVyMCkiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJvdmVybGF5ZnMiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogImZ1c2UzLmthdGEtb3ZlcmxheSIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIjVhNWFhZDgwMDU1ZmYyMDAxMmE1MGRjMjVmOGRmN2EyOTkyNDQ3NDMyNGQ2NWY3ZDUzMDZlZThlZTI3ZmY3MWQiLAogICAgICAgICAgICAiODE3MjUwZjFhM2UzMzZkYTc2ZjViZDNmYTc4NGUxYjI2ZDk1OWI5YzEzMTg3NjgxNWJhMjYwNDA0OGI3MGMxOCIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChjcGF0aCkvJChidW5kbGUtaWQpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9CiAgICAgIF0sCiAgICAgICJkZXZpY2VzIjogW10sCiAgICAgICJzYW5kYm94X3BpZG5zIjogZmFsc2UsCiAgICAgICJleGVjX2NvbW1hbmRzIjogW10sCiAgICAgICJlbnZfbWFwIjogewogICAgICAgICJQQVRIIjogIi91c3IvbG9jYWwvc2JpbjovdXNyL2xvY2FsL2JpbjovdXNyL3NiaW46L3Vzci9iaW46L3NiaW46L2JpbiIKICAgICAgfQogICAgfSwKICAgIHsKICAgICAgIk9DSSI6IHsKICAgICAgICAiVmVyc2lvbiI6ICIxLjEuMC1yYy4xIiwKICAgICAgICAiUHJvY2VzcyI6IHsKICAgICAgICAgICJUZXJtaW5hbCI6IGZhbHNlLAogICAgICAgICAgIlVzZXIiOiB7CiAgICAgICAgICAgICJVSUQiOiAxMDEsCiAgICAgICAgICAgICJHSUQiOiAxMDEsCiAgICAgICAgICAgICJBZGRpdGlvbmFsR2lkcyI6IFtdLAogICAgICAgICAgICAiVXNlcm5hbWUiOiAiIgogICAgICAgICAgfSwKICAgICAgICAgICJEZXByZWNhdGVkQXJncyI6IFsKICAgICAgICAgICAgIi91c3IvYmluL2R1bWItaW5pdCIsCiAgICAgICAgICAgICItLSIsCiAgICAgICAgICAgICIvbmdpbngtaW5ncmVzcy1jb250cm9sbGVyIiwKICAgICAgICAgICAgIi0tZWxlY3Rpb24taWQ9aW5ncmVzcy1jb250cm9sbGVyLWxlYWRlciIsCiAgICAgICAgICAgICItLWluZ3Jlc3MtY2xhc3M9bmdpbngiCiAgICAgICAgICBdLAogICAgICAgICAgIkFyZ3MiOiBbCiAgICAgICAgICAgICIvdXNyL2Jpbi9kdW1iLWluaXQiLAogICAgICAgICAgICAiLS0iLAogICAgICAgICAgICAiL25naW54LWluZ3Jlc3MtY29udHJvbGxlciIsCiAgICAgICAgICAgICItLWVsZWN0aW9uLWlkPWluZ3Jlc3MtY29udHJvbGxlci1sZWFkZXIiLAogICAgICAgICAgICAiLS1pbmdyZXNzLWNsYXNzPW5naW54IgogICAgICAgICAgXSwKICAgICAgICAgICJFbnYiOiBbCiAgICAgICAgICAgICJQQVRIPS91c3IvbG9jYWwvc2JpbjovdXNyL2xvY2FsL2JpbjovdXNyL3NiaW46L3Vzci9iaW46L3NiaW46L2JpbjovdXNyL2xvY2FsL2x1YWppdC9iaW46L3Vzci9sb2NhbC9uZ2lueC9zYmluOi91c3IvbG9jYWwvbmdpbngvYmluIiwKICAgICAgICAgICAgIkxVQV9QQVRIPS91c3IvbG9jYWwvc2hhcmUvbHVhaml0LTIuMS4wLWJldGEzLz8ubHVhOy91c3IvbG9jYWwvc2hhcmUvbHVhLzUuMS8/Lmx1YTsvdXNyL2xvY2FsL2xpYi9sdWEvPy5sdWE7OyIsCiAgICAgICAgICAgICJMVUFfQ1BBVEg9L3Vzci9sb2NhbC9saWIvbHVhLz8vPy5zbzsvdXNyL2xvY2FsL2xpYi9sdWEvPy5zbzs7IiwKICAgICAgICAgICAgIkhPU1ROQU1FPSQoaG9zdC1uYW1lKSIsCiAgICAgICAgICAgICJQT0RfTkFNRT0kKHNhbmRib3gtbmFtZSkiLAogICAgICAgICAgICAiUE9EX05BTUVTUEFDRT0kKHNhbmRib3gtbmFtZXNwYWNlKSIKICAgICAgICAgIF0sCiAgICAgICAgICAiQ3dkIjogIi9ldGMvbmdpbngiLAogICAgICAgICAgIkNhcGFiaWxpdGllcyI6IHsKICAgICAgICAgICAgIkFtYmllbnQiOiBbXSwKICAgICAgICAgICAgIkJvdW5kaW5nIjogWwogICAgICAgICAgICAgICJDQVBfTkVUX0JJTkRfU0VSVklDRSIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgIkVmZmVjdGl2ZSI6IFsKICAgICAgICAgICAgICAiQ0FQX05FVF9CSU5EX1NFUlZJQ0UiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJJbmhlcml0YWJsZSI6IFtdLAogICAgICAgICAgICAiUGVybWl0dGVkIjogWwogICAgICAgICAgICAgICJDQVBfTkVUX0JJTkRfU0VSVklDRSIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgICJOb05ld1ByaXZpbGVnZXMiOiBmYWxzZQogICAgICAgIH0sCiAgICAgICAgIlJvb3QiOiB7CiAgICAgICAgICAiUGF0aCI6ICIkKGNwYXRoKS8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgIlJlYWRvbmx5IjogZmFsc2UKICAgICAgICB9LAogICAgICAgICJNb3VudHMiOiBbCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvcHJvYyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAicHJvYyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJwcm9jIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAgICAgIm5vZGV2IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2RldiIsCiAgICAgICAgICAgICJzb3VyY2UiOiAidG1wZnMiLAogICAgICAgICAgICAidHlwZV8iOiAidG1wZnMiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAic3RyaWN0YXRpbWUiLAogICAgICAgICAgICAgICJtb2RlPTc1NSIsCiAgICAgICAgICAgICAgInNpemU9NjU1MzZrIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi9wdHMiLAogICAgICAgICAgICAic291cmNlIjogImRldnB0cyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJkZXZwdHMiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibmV3aW5zdGFuY2UiLAogICAgICAgICAgICAgICJwdG14bW9kZT0wNjY2IiwKICAgICAgICAgICAgICAibW9kZT0wNjIwIiwKICAgICAgICAgICAgICAiZ2lkPTUiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L3NobSIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiL3J1bi9rYXRhLWNvbnRhaW5lcnMvc2FuZGJveC9zaG0iLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvbXF1ZXVlIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJtcXVldWUiLAogICAgICAgICAgICAidHlwZV8iOiAibXF1ZXVlIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAgICAgIm5vZGV2IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL3N5cyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAic3lzZnMiLAogICAgICAgICAgICAidHlwZV8iOiAic3lzZnMiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiLAogICAgICAgICAgICAgICJybyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9zeXMvZnMvY2dyb3VwIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJjZ3JvdXAiLAogICAgICAgICAgICAidHlwZV8iOiAiY2dyb3VwIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAgICAgIm5vZGV2IiwKICAgICAgICAgICAgICAicmVsYXRpbWUiLAogICAgICAgICAgICAgICJybyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9ldGMvaG9zdHMiLAogICAgICAgICAgICAic291cmNlIjogIiQoc2ZwcmVmaXgpaG9zdHMkIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJ3IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi90ZXJtaW5hdGlvbi1sb2ciLAogICAgICAgICAgICAic291cmNlIjogIiQoc2ZwcmVmaXgpdGVybWluYXRpb24tbG9nJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJydyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9ldGMvaG9zdG5hbWUiLAogICAgICAgICAgICAic291cmNlIjogIiQoc2ZwcmVmaXgpaG9zdG5hbWUkIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJ3IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2V0Yy9yZXNvbHYuY29uZiIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClyZXNvbHYuY29uZiQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicnciCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvdmFyL3J1bi9zZWNyZXRzL2t1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQiLAogICAgICAgICAgICAic291cmNlIjogIiQoc2ZwcmVmaXgpc2VydmljZWFjY291bnQkIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL3Zhci9ydW4vc2VjcmV0cy9henVyZS90b2tlbnMiLAogICAgICAgICAgICAic291cmNlIjogIiQoc2ZwcmVmaXgpdG9rZW5zJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJybyIKICAgICAgICAgICAgXQogICAgICAgICAgfQogICAgICAgIF0sCiAgICAgICAgIkFubm90YXRpb25zIjogewogICAgICAgICAgImlvLmthdGFjb250YWluZXJzLnBrZy5vY2kuYnVuZGxlX3BhdGgiOiAiL3J1bi9jb250YWluZXJkL2lvLmNvbnRhaW5lcmQucnVudGltZS52Mi50YXNrL2s4cy5pby8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgImlvLmthdGFjb250YWluZXJzLnBrZy5vY2kuY29udGFpbmVyX3R5cGUiOiAicG9kX2NvbnRhaW5lciIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLW5hbWUiOiAibmdpbngtaW5ncmVzcy1sYiIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLXR5cGUiOiAiY29udGFpbmVyIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5pbWFnZS1uYW1lIjogInJlZ2lzdHJ5Lms4cy5pby9pbmdyZXNzLW5naW54L2NvbnRyb2xsZXI6djAuNDYuMCIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCI6ICJeW2EtejAtOV17NjR9JCIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1uYW1lc3BhY2UiOiAiIgogICAgICAgIH0sCiAgICAgICAgIkxpbnV4IjogewogICAgICAgICAgIk5hbWVzcGFjZXMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiVHlwZSI6ICJpcGMiLAogICAgICAgICAgICAgICJQYXRoIjogIiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJUeXBlIjogInV0cyIsCiAgICAgICAgICAgICAgIlBhdGgiOiAiIgogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgIlR5cGUiOiAibW91bnQiLAogICAgICAgICAgICAgICJQYXRoIjogIiIKICAgICAgICAgICAgfQogICAgICAgICAgXSwKICAgICAgICAgICJNYXNrZWRQYXRocyI6IFsKICAgICAgICAgICAgIi9wcm9jL2FjcGkiLAogICAgICAgICAgICAiL3Byb2Mva2NvcmUiLAogICAgICAgICAgICAiL3Byb2Mva2V5cyIsCiAgICAgICAgICAgICIvcHJvYy9sYXRlbmN5X3N0YXRzIiwKICAgICAgICAgICAgIi9wcm9jL3RpbWVyX2xpc3QiLAogICAgICAgICAgICAiL3Byb2MvdGltZXJfc3RhdHMiLAogICAgICAgICAgICAiL3Byb2Mvc2NoZWRfZGVidWciLAogICAgICAgICAgICAiL3Byb2Mvc2NzaSIsCiAgICAgICAgICAgICIvc3lzL2Zpcm13YXJlIgogICAgICAgICAgXSwKICAgICAgICAgICJSZWFkb25seVBhdGhzIjogWwogICAgICAgICAgICAiL3Byb2MvYXNvdW5kIiwKICAgICAgICAgICAgIi9wcm9jL2J1cyIsCiAgICAgICAgICAgICIvcHJvYy9mcyIsCiAgICAgICAgICAgICIvcHJvYy9pcnEiLAogICAgICAgICAgICAiL3Byb2Mvc3lzIiwKICAgICAgICAgICAgIi9wcm9jL3N5c3JxLXRyaWdnZXIiCiAgICAgICAgICBdLAogICAgICAgICAgIkRldmljZXMiOiBbXSwKICAgICAgICAgICJTeXNjdGwiOiB7CiAgICAgICAgICAgICJuZXQuaXB2NC5pcF91bnByaXZpbGVnZWRfcG9ydF9zdGFydCI6ICIwIiwKICAgICAgICAgICAgIm5ldC5pcHY0LnBpbmdfZ3JvdXBfcmFuZ2UiOiAiMCAyMTQ3NDgzNjQ3IgogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSwKICAgICAgInN0b3JhZ2VzIjogWwogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2gwKSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjApIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2gxKSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjEpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2gyKSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjIpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2gzKSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjMpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2g0KSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjQpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2g1KSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjUpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2g2KSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjYpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2g3KSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjcpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2g4KSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjgpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2g5KSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjkpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2gxMCkiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXIxMCkiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJibGsiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogInRhciIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIiQoaGFzaDExKSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjExKSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoMTIpIgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGxheWVyMTIpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2gxMykiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXIxMykiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJvdmVybGF5ZnMiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogImZ1c2UzLmthdGEtb3ZlcmxheSIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgImVlMDk3Nzg0ZTU3OGE0ZGQwMjg0YzBhZTU2OWNkOWJkMjUzOWRmNjI1YTUyNGI0MGU1MWNiYmUzYWViZjhlYmM6NmJlYmE4ZWExYzZkYTM0MWIxMDc4YzVkMjAxYTBkYzQ3MWU5YWM3YWRiYzNjMzlkM2Y0Njc4NzJiOWI2NDY2ODpkNzE4M2YzNzFlYWE4ZTM4NTZmMmQ0NjhkN2FmNzI3NGNlY2M3OGM0YjQ2ZmE2ODEwNjkwODMzNGZiYjU5ZjczOjcyYTE4YjE0NzRiZGMwZjA2MDdiYzhjZTYxYzc3ZTZjZWRmMjQ2OTlkMjYzMjI2NDczZmQ4MjBjMzkzOWY2ZDY6NDRmZGU1YmE4NDIyOWJjNzY3ZjUwNjUwMDE5MWYyNDQ2ZjEyNWM4MGY4OGFjZTdiZDJjMThmNDViNDBhYWYzMzo2NjNkM2RlZWQzNDg1ZWFiZDZiMTUzNWRhZmU2ZGRiMjY5MDA3MDI0ZWRlN2RlNGI2OTI4MjMwZjM2ZGY1M2IyOjA3MzNkZGM2MDE4M2EzZjM3ODZiNDUwMGEwNzcxNDNiZTA5OWNhMmUwODJjOThiZWNiMzAwNzBkMTJlYjM1NDY6Yjk3YjAyOTMxZmNiZGVlMTM2MmFjNTI0M2YyYWMwMTNmOTRjNjRhZTI0YTgyMGY0MDI0YzJmMmJlZGVkYmQ2YTo4MDJiOGI3ZGZlYTE0MWUzNDJmNjVmOTYyOGMxYWFhZGQwNjVjNTA1M2E2OTEzNDY2NWRhZDg5MDA4MmJiYWQ5OmM2ZjVlMTkzNTJjNzJiY2FmNTFlZDc1MmI3OGE4NzZiYTlhMTI4NjlmMDIyOTQyNDRhNDk4NjQ1MzExODIxOGY6ZmMzM2U3NmJjOGYxNDMyNzlhZDRkMjAxMGRkNTQ3ZTk4YTZkMDQxNTM4NjFiN2Q4ODEwMjZjN2Q5OWNlNDg2ODpjMjkzMTcyYzcyNWEyZmJkMTkxMzdkODc1MWVmYjA0YTc3YmIxMjE5YjY5NGJjNjE5YjM3MzdiMGEzYmEyZTY5OjZiODExMzY0NmRiMGI2OTAzMjgzY2VmMThiMmZkODFlYTE2NjkyYzg5MzZhZjkwMDdjZjhlZjA3N2QzYzRiN2U6MjgxMmU1MjhlMmUyYjM0MmZiZTIyZTQ2NTBjMzQzZDc2OWVmZWU4YTA1OTAyYTFjZWIxNWQ1ODhhZjMxNGQ1YiIsCiAgICAgICAgICAgICJmN2ViYWMyNzBiYWY2MTQwNWU3NjNiYjNiNGViY2JkYzU4YzZjNmYxNTgxMTFkZmJkYzRhNzYzOTUyOGZhY2Y0OmIzMzNhNThiMzIyZGJkZjc2MmQ0ZWU5MmU0MjUyY2E0MGYzM2I5YjEzYWUzYTc4NGVhOWZlZWE1Mzk2OTZhOWE6MmJjNjFiZmQxYTc5NTRhM2RkMWQ1MmVkNzJlOTA5MzNmYjFjZDA3YzhmYjViY2I2ODhhZTYxNzM1NTQ3ZGRiMzpkZWI0M2M5MTRmMDkyYzNlMmQxN2Q2ZjEzZjEwNGZlNzMyM2UzMTRjYjJkODYwODA1MWU1MDdlOWJiMmEzM2FjOjg2MDlmNjFhMWE1OWQwYWI2NzM0MzQyZWNjYjJkMzk0YjE5NDljNDczMTFhMzkyODdkZDlhNWIzYzkwNjIzNTM6OGJkZWUxMGQ2ODYxMmY0NWM4NTlkNDYzOTMzNWM3NWQwMDQ3MGUyZjdjMjk2NzQ0NDk3Mzc3YjBjOGM4NDkzYjpiN2E4N2ZkNGM0M2MyZWUyOTNkZTMxMTMyY2U1ZGMyYjRjMmY2YmRjYWM3YjRlMWRiZWZhYmE2ODEwZTQ1ZDMwOjg1MTNhM2VkZDgyNDQzNDU4OWQ4ZWI3NTY3ZjA3ZjI5NjBlMmRhZWEzYzQ3NGU4NDlhYzAyYjU1OWI3NGVkNzc6YTliODU2MzgxZDdmNDFiZGU3ZWRhOGM5NDE5ZDYwNWEzNzMyNDEzYmQ5YzIzMDFhMmE2ZjdkMDg2M2FmMWQwMDpjYTJlM2VlOWYzNWIwZWQ0YjQzOTc2OTE1MTBkNTViYjgyMTZmOGI1NTM5OGQwNjM4N2VmZTdkNDZhNjlkNmJmOmRhNzg1NTQ4NTNmYjM5OWQ5YTI0ZGYyZjAzMmQ0M2U0MWExOTY0YTBmNzk4NjMxOTc5MjMxNjlkOGMwODVmNmQ6YmYxMWY3ZDQ3OTY2MmRkZmRlM2NmZWU5OTdjOGQzNzI0ODliMmUwMTM4NjRkMWY2NmUyMTk0MjZmM2QwM2UwMjphZTcwYzllYmE2MDBjMGZlMzJjZTBhZjUxZTQ1MTkxYjI5NzZlYWNkYmQ0ZDY4Y2VhYzgyMjhmYmRlMjBhM2I2OjQzYjgwM2NiMDJkNWIxMWFjOWY4NDllYWE1ODI1OGFlZDczZjU3YWUxN2M5OTlhMDIzODY0ZGJjYjI2ZWMwZjEiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQoY3BhdGgpLyQoYnVuZGxlLWlkKSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfQogICAgICBdLAogICAgICAiZGV2aWNlcyI6IFtdLAogICAgICAic2FuZGJveF9waWRucyI6IGZhbHNlLAogICAgICAiZXhlY19jb21tYW5kcyI6IFtdLAogICAgICAiZW52X21hcCI6IHsKICAgICAgICAiSE9TVE5BTUUiOiAiJChob3N0LW5hbWUpIiwKICAgICAgICAiTFVBX0NQQVRIIjogIi91c3IvbG9jYWwvbGliL2x1YS8/Lz8uc287L3Vzci9sb2NhbC9saWIvbHVhLz8uc287OyIsCiAgICAgICAgIkxVQV9QQVRIIjogIi91c3IvbG9jYWwvc2hhcmUvbHVhaml0LTIuMS4wLWJldGEzLz8ubHVhOy91c3IvbG9jYWwvc2hhcmUvbHVhLzUuMS8/Lmx1YTsvdXNyL2xvY2FsL2xpYi9sdWEvPy5sdWE7OyIsCiAgICAgICAgIlBBVEgiOiAiL3Vzci9sb2NhbC9zYmluOi91c3IvbG9jYWwvYmluOi91c3Ivc2JpbjovdXNyL2Jpbjovc2JpbjovYmluOi91c3IvbG9jYWwvbHVhaml0L2JpbjovdXNyL2xvY2FsL25naW54L3NiaW46L3Vzci9sb2NhbC9uZ2lueC9iaW4iLAogICAgICAgICJQT0RfTkFNRSI6ICIkKHNhbmRib3gtbmFtZSkiLAogICAgICAgICJQT0RfTkFNRVNQQUNFIjogIiQoc2FuZGJveC1uYW1lc3BhY2UpIgogICAgICB9CiAgICB9CiAgXSwKICAiY29tbW9uIjogewogICAgImNwYXRoIjogIi9ydW4va2F0YS1jb250YWluZXJzL3NoYXJlZC9jb250YWluZXJzIiwKICAgICJtb3VudF9zb3VyY2VfY3BhdGgiOiAiL3J1bi9rYXRhLWNvbnRhaW5lcnMvc2hhcmVkL2NvbnRhaW5lcnMiLAogICAgInNmcHJlZml4IjogIl4kKGNwYXRoKS8kKGJ1bmRsZS1pZCktW2EtejAtOV17MTZ9LSIsCiAgICAic3BhdGgiOiAiL3J1bi9rYXRhLWNvbnRhaW5lcnMvc2FuZGJveC9zdG9yYWdlIiwKICAgICJpcHY0X2EiOiAiKChbMC05XXxbMS05XVswLTldfDFbMC05XXsyfXwyWzAtNF1bMC05XXwyNVswLTVdKVxcLil7M30oWzAtOV18WzEtOV1bMC05XXwxWzAtOV17Mn18MlswLTRdWzAtOV18MjVbMC01XSkiLAogICAgImlwX3AiOiAiWzAtOV17MSw1fSIsCiAgICAic3ZjX25hbWUiOiAiW0EtWl9cXC5cXC1dKyIsCiAgICAiZG5zX2xhYmVsIjogIlthLXpBLVowLTlfXFwuXFwtXSsiLAogICAgInNfc291cmNlMSI6ICJeLi4yWzAtOV17M31fWzAtMV1bMC05XV9bMC0zXVswLTldX1swLTJdWzAtOV1fWzAtNV1bMC05XV9bMC01XVswLTldXFwuWzAtOV17MSwxMH0kIiwKICAgICJzX3NvdXJjZTIiOiAiXi4uZGF0YS8iLAogICAgImRuc19zdWJkb21haW4iOiAiXlthLXowLTldKFstYS16MC05XSpbYS16MC05XSk/JCIsCiAgICAicG9kX3VpZCI6ICJeWzAtOWEtZkEtRl17OH0tWzAtOWEtZkEtRl17NH0tWzAtOWEtZkEtRl17NH0tWzAtOWEtZkEtRl17NH0tWzAtOWEtZkEtRl17MTJ9JCIsCiAgICAiZGVmYXVsdF9jYXBzIjogWwogICAgICAiQ0FQX0NIT1dOIiwKICAgICAgIkNBUF9EQUNfT1ZFUlJJREUiLAogICAgICAiQ0FQX0ZTRVRJRCIsCiAgICAgICJDQVBfRk9XTkVSIiwKICAgICAgIkNBUF9NS05PRCIsCiAgICAgICJDQVBfTkVUX1JBVyIsCiAgICAgICJDQVBfU0VUR0lEIiwKICAgICAgIkNBUF9TRVRVSUQiLAogICAgICAiQ0FQX1NFVEZDQVAiLAogICAgICAiQ0FQX1NFVFBDQVAiLAogICAgICAiQ0FQX05FVF9CSU5EX1NFUlZJQ0UiLAogICAgICAiQ0FQX1NZU19DSFJPT1QiLAogICAgICAiQ0FQX0tJTEwiLAogICAgICAiQ0FQX0FVRElUX1dSSVRFIgogICAgXSwKICAgICJwcml2aWxlZ2VkX2NhcHMiOiBbCiAgICAgICJDQVBfQ0hPV04iLAogICAgICAiQ0FQX0RBQ19PVkVSUklERSIsCiAgICAgICJDQVBfREFDX1JFQURfU0VBUkNIIiwKICAgICAgIkNBUF9GT1dORVIiLAogICAgICAiQ0FQX0ZTRVRJRCIsCiAgICAgICJDQVBfS0lMTCIsCiAgICAgICJDQVBfU0VUR0lEIiwKICAgICAgIkNBUF9TRVRVSUQiLAogICAgICAiQ0FQX1NFVFBDQVAiLAogICAgICAiQ0FQX0xJTlVYX0lNTVVUQUJMRSIsCiAgICAgICJDQVBfTkVUX0JJTkRfU0VSVklDRSIsCiAgICAgICJDQVBfTkVUX0JST0FEQ0FTVCIsCiAgICAgICJDQVBfTkVUX0FETUlOIiwKICAgICAgIkNBUF9ORVRfUkFXIiwKICAgICAgIkNBUF9JUENfTE9DSyIsCiAgICAgICJDQVBfSVBDX09XTkVSIiwKICAgICAgIkNBUF9TWVNfTU9EVUxFIiwKICAgICAgIkNBUF9TWVNfUkFXSU8iLAogICAgICAiQ0FQX1NZU19DSFJPT1QiLAogICAgICAiQ0FQX1NZU19QVFJBQ0UiLAogICAgICAiQ0FQX1NZU19QQUNDVCIsCiAgICAgICJDQVBfU1lTX0FETUlOIiwKICAgICAgIkNBUF9TWVNfQk9PVCIsCiAgICAgICJDQVBfU1lTX05JQ0UiLAogICAgICAiQ0FQX1NZU19SRVNPVVJDRSIsCiAgICAgICJDQVBfU1lTX1RJTUUiLAogICAgICAiQ0FQX1NZU19UVFlfQ09ORklHIiwKICAgICAgIkNBUF9NS05PRCIsCiAgICAgICJDQVBfTEVBU0UiLAogICAgICAiQ0FQX0FVRElUX1dSSVRFIiwKICAgICAgIkNBUF9BVURJVF9DT05UUk9MIiwKICAgICAgIkNBUF9TRVRGQ0FQIiwKICAgICAgIkNBUF9NQUNfT1ZFUlJJREUiLAogICAgICAiQ0FQX01BQ19BRE1JTiIsCiAgICAgICJDQVBfU1lTTE9HIiwKICAgICAgIkNBUF9XQUtFX0FMQVJNIiwKICAgICAgIkNBUF9CTE9DS19TVVNQRU5EIiwKICAgICAgIkNBUF9BVURJVF9SRUFEIiwKICAgICAgIkNBUF9QRVJGTU9OIiwKICAgICAgIkNBUF9CUEYiLAogICAgICAiQ0FQX0NIRUNLUE9JTlRfUkVTVE9SRSIKICAgIF0sCiAgICAidmlydGlvX2Jsa19zdG9yYWdlX2NsYXNzZXMiOiBbCiAgICAgICJjYy1sb2NhbC1jc2kiLAogICAgICAiY2MtbWFuYWdlZC1jc2kiLAogICAgICAiY2MtbWFuYWdlZC1wcmVtaXVtLWNzaSIKICAgIF0sCiAgICAic21iX3N0b3JhZ2VfY2xhc3NlcyI6IFsKICAgICAgewogICAgICAgICJuYW1lIjogImF6dXJlZmlsZS1jc2kta2F0YS1jYyIsCiAgICAgICAgIm1vdW50X29wdGlvbnMiOiBbCiAgICAgICAgICAiZGlyX21vZGU9MDc3NyIsCiAgICAgICAgICAiZmlsZV9tb2RlPTA3NzciLAogICAgICAgICAgIm1mc3ltbGlua3MiLAogICAgICAgICAgImNhY2hlPXN0cmljdCIsCiAgICAgICAgICAibm9zaGFyZXNvY2siLAogICAgICAgICAgImFjdGltZW89MzAiLAogICAgICAgICAgIm5vYnJsIgogICAgICAgIF0KICAgICAgfQogICAgXQogIH0sCiAgInNhbmRib3giOiB7CiAgICAic3RvcmFnZXMiOiBbCiAgICAgIHsKICAgICAgICAiZHJpdmVyIjogImVwaGVtZXJhbCIsCiAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgInNvdXJjZSI6ICJzaG0iLAogICAgICAgICJmc3R5cGUiOiAidG1wZnMiLAogICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICJub2RldiIsCiAgICAgICAgICAibW9kZT0xNzc3IiwKICAgICAgICAgICJzaXplPTY3MTA4ODY0IgogICAgICAgIF0sCiAgICAgICAgIm1vdW50X3BvaW50IjogIi9ydW4va2F0YS1jb250YWluZXJzL3NhbmRib3gvc2htIiwKICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgIH0KICAgIF0KICB9LAogICJyZXF1ZXN0X2RlZmF1bHRzIjogewogICAgIkNyZWF0ZUNvbnRhaW5lclJlcXVlc3QiOiB7CiAgICAgICJhbGxvd19lbnZfcmVnZXgiOiBbCiAgICAgICAgIl5IT1NUTkFNRT0kKGRuc19sYWJlbCkkIiwKICAgICAgICAiXiQoc3ZjX25hbWUpX1BPUlRfJChpcF9wKV9UQ1A9dGNwOi8vJChpcHY0X2EpOiQoaXBfcCkkIiwKICAgICAgICAiXiQoc3ZjX25hbWUpX1BPUlRfJChpcF9wKV9UQ1BfUFJPVE89dGNwJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9QT1JUXyQoaXBfcClfVENQX1BPUlQ9JChpcF9wKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfUE9SVF8kKGlwX3ApX1RDUF9BRERSPSQoaXB2NF9hKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfU0VSVklDRV9IT1NUPSQoaXB2NF9hKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfU0VSVklDRV9QT1JUPSQoaXBfcCkkIiwKICAgICAgICAiXiQoc3ZjX25hbWUpX1NFUlZJQ0VfUE9SVF8kKGRuc19sYWJlbCk9JChpcF9wKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfUE9SVD10Y3A6Ly8kKGlwdjRfYSk6JChpcF9wKSQiLAogICAgICAgICJeQVpVUkVfQ0xJRU5UX0lEPVtBLUZhLWYwLTktXSokIiwKICAgICAgICAiXkFaVVJFX1RFTkFOVF9JRD1bQS1GYS1mMC05LV0qJCIsCiAgICAgICAgIl5BWlVSRV9GRURFUkFURURfVE9LRU5fRklMRT0vdmFyL3J1bi9zZWNyZXRzL2F6dXJlL3Rva2Vucy9henVyZS1pZGVudGl0eS10b2tlbiQiLAogICAgICAgICJeQVpVUkVfQVVUSE9SSVRZX0hPU1Q9aHR0cHM6Ly9sb2dpblxcLm1pY3Jvc29mdG9ubGluZVxcLmNvbS8kIiwKICAgICAgICAiXlRFUk09eHRlcm0kIgogICAgICBdLAogICAgICAiYWxsb3dfZW52X3JlZ2V4X21hcCI6IHsKICAgICAgICAiQ1BVX0xJTUlUIjogIl5bMC05XSskIiwKICAgICAgICAiSk9CX0NPTVBMRVRJT05fSU5ERVgiOiAiXlswLTldKiQiLAogICAgICAgICJNRU1PUllfTElNSVQiOiAiXlswLTldKyQiCiAgICAgIH0KICAgIH0sCiAgICAiQ29weUZpbGVSZXF1ZXN0IjogWwogICAgICAiJChzZnByZWZpeCkiCiAgICBdLAogICAgIkV4ZWNQcm9jZXNzUmVxdWVzdCI6IHsKICAgICAgImFsbG93ZWRfY29tbWFuZHMiOiBbXSwKICAgICAgInJlZ2V4IjogW10KICAgIH0sCiAgICAiVXBkYXRlUm91dGVzUmVxdWVzdCI6IHsKICAgICAgImZvcmJpZGRlbl9kZXZpY2VfbmFtZXMiOiBbCiAgICAgICAgImxvIgogICAgICBdLAogICAgICAiZm9yYmlkZGVuX3NvdXJjZV9yZWdleCI6IFsKICAgICAgICAiXig/OjB7MCw0fTopezAsN30wezAsM30xJCIsCiAgICAgICAgIl4xMjdcXC4oPzpbMC05XXsxLDN9XFwuKXsyfVswLTldezEsM30kIgogICAgICBdCiAgICB9LAogICAgIlVwZGF0ZUludGVyZmFjZVJlcXVlc3QiOiB7CiAgICAgICJhbGxvd19yYXdfZmxhZ3MiOiAxMjgsCiAgICAgICJmb3JiaWRkZW5fbmFtZXMiOiBbCiAgICAgICAgImxvIgogICAgICBdLAogICAgICAiZm9yYmlkZGVuX2h3X2FkZHJzIjogWwogICAgICAgICIwMDowMDowMDowMDowMDowMCIKICAgICAgXQogICAgfSwKICAgICJDbG9zZVN0ZGluUmVxdWVzdCI6IGZhbHNlLAogICAgIlJlYWRTdHJlYW1SZXF1ZXN0IjogZmFsc2UsCiAgICAiVXBkYXRlRXBoZW1lcmFsTW91bnRzUmVxdWVzdCI6IGZhbHNlLAogICAgIldyaXRlU3RyZWFtUmVxdWVzdCI6IGZhbHNlCiAgfQp9 + spec: + runtimeClassName: kata-cc + terminationGracePeriodSeconds: 0 + containers: + - image: "registry.k8s.io/ingress-nginx/controller:v0.46.0" + args: + - /nginx-ingress-controller + - "--election-id=ingress-controller-leader" + - "--ingress-class=nginx" + securityContext: + capabilities: + drop: + - ALL + add: + - NET_BIND_SERVICE + runAsUser: 101 + allowPrivilegeEscalation: true + livenessProbe: + httpGet: + path: /healthz + port: 10254 + scheme: HTTP + initialDelaySeconds: 30 + timeoutSeconds: 5 + name: nginx-ingress-lb + env: + - name: POD_NAME + valueFrom: + fieldRef: + fieldPath: metadata.name + - name: POD_NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace + ports: + - containerPort: 80 + hostPort: 80 + - containerPort: 443 + hostPort: 443 diff --git a/src/agent/samples/policy/yaml/kubernetes/conformance2/ingress-static-ip-rc.yaml b/src/agent/samples/policy/yaml/kubernetes/conformance2/ingress-static-ip-rc.yaml new file mode 100644 index 000000000000..76d5d17eac30 --- /dev/null +++ b/src/agent/samples/policy/yaml/kubernetes/conformance2/ingress-static-ip-rc.yaml @@ -0,0 +1,26 @@ +--- +apiVersion: v1 +kind: ReplicationController +metadata: + name: echoheaders-https-static-ip +spec: + replicas: 2 + template: + metadata: + labels: + app: echoheaders-https + annotations: + io.katacontainers.config.agent.policy: IyBDb3B5cmlnaHQgKGMpIDIwMjMgTWljcm9zb2Z0IENvcnBvcmF0aW9uCiMKIyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMAojCnBhY2thZ2UgYWdlbnRfcG9saWN5CgppbXBvcnQgZnV0dXJlLmtleXdvcmRzLmluCmltcG9ydCBmdXR1cmUua2V5d29yZHMuZXZlcnkKCiMgRGVmYXVsdCB2YWx1ZXMsIHJldHVybmVkIGJ5IE9QQSB3aGVuIHJ1bGVzIGNhbm5vdCBiZSBldmFsdWF0ZWQgdG8gdHJ1ZS4KZGVmYXVsdCBBZGRBUlBOZWlnaGJvcnNSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgQWRkU3dhcFJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBDbG9zZVN0ZGluUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IENvcHlGaWxlUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IENyZWF0ZUNvbnRhaW5lclJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBDcmVhdGVTYW5kYm94UmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IERlc3Ryb3lTYW5kYm94UmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgRXhlY1Byb2Nlc3NSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgR2V0T09NRXZlbnRSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBHdWVzdERldGFpbHNSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBMaXN0SW50ZXJmYWNlc1JlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBMaXN0Um91dGVzUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IE1lbUhvdHBsdWdCeVByb2JlUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IE9ubGluZUNQVU1lbVJlcXVlc3QgOj0gdHJ1ZQpkZWZhdWx0IFBhdXNlQ29udGFpbmVyUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFJlYWRTdHJlYW1SZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgUmVtb3ZlQ29udGFpbmVyUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgUmVtb3ZlU3RhbGVWaXJ0aW9mc1NoYXJlTW91bnRzUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgUmVzZWVkUmFuZG9tRGV2UmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFJlc3VtZUNvbnRhaW5lclJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBTZXRHdWVzdERhdGVUaW1lUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFNldFBvbGljeVJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBTaWduYWxQcm9jZXNzUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgU3RhcnRDb250YWluZXJSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBTdGFydFRyYWNpbmdSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgU3RhdHNDb250YWluZXJSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBTdG9wVHJhY2luZ1JlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBUdHlXaW5SZXNpemVSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBVcGRhdGVDb250YWluZXJSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgVXBkYXRlRXBoZW1lcmFsTW91bnRzUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFVwZGF0ZUludGVyZmFjZVJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBVcGRhdGVSb3V0ZXNSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgV2FpdFByb2Nlc3NSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBXcml0ZVN0cmVhbVJlcXVlc3QgOj0gZmFsc2UKCiMgQWxsb3dSZXF1ZXN0c0ZhaWxpbmdQb2xpY3kgOj0gdHJ1ZSBjb25maWd1cmVzIHRoZSBBZ2VudCB0byAqYWxsb3cgYW55CiMgcmVxdWVzdHMgY2F1c2luZyBhIHBvbGljeSBmYWlsdXJlKi4gVGhpcyBpcyBhbiB1bnNlY3VyZSBjb25maWd1cmF0aW9uCiMgYnV0IGlzIHVzZWZ1bCBmb3IgYWxsb3dpbmcgdW5zZWN1cmUgcG9kcyB0byBzdGFydCwgdGhlbiBjb25uZWN0IHRvCiMgdGhlbSBhbmQgaW5zcGVjdCBPUEEgbG9ncyBmb3IgdGhlIHJvb3QgY2F1c2Ugb2YgYSBmYWlsdXJlLgpkZWZhdWx0IEFsbG93UmVxdWVzdHNGYWlsaW5nUG9saWN5IDo9IGZhbHNlCgojIENvbnN0YW50cwpTX05BTUVfS0VZID0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZSIKU19OQU1FU1BBQ0VfS0VZID0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZXNwYWNlIgpCVU5ETEVfSUQgPSAiW2EtejAtOV17NjR9IgoKQ3JlYXRlQ29udGFpbmVyUmVxdWVzdDo9IHJlc3AgewogICAgbm90IGlzX251bGwoaW5wdXQuZW52X21hcCkKICAgIAogICAgaV9lbnZfbWFwIDo9IGlucHV0LmVudl9tYXAKICAgIAogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBwX2Vudl9tYXAgOj0gcF9jb250YWluZXIuZW52X21hcCAgCiAgICBhbGxvd19lbnZfbWFwKHBfZW52X21hcCwgaV9lbnZfbWFwKQogICAgCiAgICBpX3Byb2Nlc3MgOj0gaW5wdXQuYmFzZS5PQ0kuUHJvY2VzcwogICAgCiAgICBwX3Byb2Nlc3MgOj0gcF9jb250YWluZXIuT0NJLlByb2Nlc3MKICAgIAogICAgYWxsb3dfYXJncyhpX3Byb2Nlc3MsIHBfcHJvY2VzcywgaV9lbnZfbWFwKQoKICAgIHJlc3AgPSBDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uKGlucHV0LmJhc2UpCiAgICBwcmludCgiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdDogdHJ1ZSIpCn0KCmFsbG93X2FyZ3MoaV9wcm9jZXNzLCBwX3Byb2Nlc3MsIGlfZW52X21hcCkgewogICAgaV9hcmdzIDo9IGlfcHJvY2Vzcy5BcmdzCiAgICBwX2FyZ3MgOj0gcF9wcm9jZXNzLkFyZ3MKICAgIHByaW50KCJhbGxvd19hcmdzOiBpX2FyZ3MgPSIsIGlfYXJncywgInBfYXJncyA9IiwgcF9hcmdzKQogICAgY291bnQoaV9hcmdzKSA9PSBjb3VudChwX2FyZ3MpCiAgICBldmVyeSBpLCBpX2FyZyBpbiBpX2FyZ3MgewogICAgICAgIHByaW50KCJhbGxvd19hcmdzOiBpX2FyZyA9IiwgaV9hcmcpCiAgICAgICAgcF9hcmdfcmVwbGFjZWQgOj0gcmVwbGFjZV9lbnZfdmFyaWFibGVzKHBfYXJnc1tpXSwgaV9lbnZfbWFwKQogICAgICAgIHByaW50KCJhbGxvd19hcmdzOiBwX2FyZ19yZXBsYWNlZCA9IiwgcF9hcmdfcmVwbGFjZWQpCiAgICAgICAgcF9hcmdfcmVwbGFjZWQyIDo9IHJlcGxhY2UocF9hcmdfcmVwbGFjZWQsICIkJCIsICIkIikKICAgICAgICBwcmludCgiYWxsb3dfYXJnczogcF9hcmdfcmVwbGFjZWQyID0iLCBwX2FyZ19yZXBsYWNlZDIpCiAgICAgICAgaV9hcmcgPT0gcF9hcmdfcmVwbGFjZWQyCiAgICB9CiAgICBwcmludCgiYWxsb3dfYXJnczogdHJ1ZSIpCn0KCmFsbG93X2FyZ3MoaV9wcm9jZXNzLCBwX3Byb2Nlc3MsIGlfZW52X21hcCkgewogICAgbm90IGlfcHJvY2Vzcy5BcmdzCiAgICBub3QgcF9wcm9jZXNzLkFyZ3MKICAgIHByaW50KCJhbGxvd19hcmdzMjogbm8gYXJncyIpCn0KCiMgdGhpcyBmdW5jdGlvbiByZXBsYWNlcyBhbGwgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyBpbiBhIHN0cmluZywgZ2l2ZW4gYSBtYXAgb2YgZW52aXJvbm1lbnQga2V5cyB0byBlbnZpcm9ubWVudCB2YWx1ZXMKIyBlZyBzdHIgPSAiZWNobyAkKENMVVNURVJfSUQpOyBlY2hvICQoTk9ERV9OQU1FKTsiCiMgZW52X21hcCA9IHsiQ0xVU1RFUl9JRCI6ICJhYmMiLCAiTk9ERV9OQU1FIiA6ICJ4eXoifQojIHJlc3VsdCA9ICJlY2hvIGFiYzsgZWNobyB4eXo7IgpyZXBsYWNlX2Vudl92YXJpYWJsZXMoc3RyLCBlbnZfbWFwKSA9IHJlc3VsdCB7CiAgICAjIG1ha2UgYW4gYXJyYXkgb2YgdGhlIGtleXMgZWcgWyJDTFVTVEVSX0lEIiwgIk5PREVfTkFNRSJdCiAgICBrZXlzIDo9IFt4IHwgc29tZSB4IGluIG9iamVjdC5rZXlzKGVudl9tYXApXQogICAgcmVzdWx0IDo9IHJlcGxhY2Vfc3RyX3JlYyhzdHIsIGVudl9tYXAsIGtleXMsIGNvdW50KGtleXMpIC0gMSkKfQoKIyBiYXNlIGNhc2UKcmVwbGFjZV9zdHJfcmVjKHN0ciwgZW52X21hcCwgYXJyX2tleXMsIGkpID0gcmVzdWx0IHsKICAgIGkgPCAwCiAgICByZXN1bHQgOj0gc3RyCn0KCiMgcmVjdXJzaXZlIHN0ZXAKcmVwbGFjZV9zdHJfcmVjKHN0ciwgZW52X21hcCwgYXJyX2tleXMsIGkpID0gcmVzdWx0IHsKICAgIGkgPj0gMAogICAga2V5IDo9IGFycl9rZXlzW2ldCiAgICBlbnZfa2V5MSA6PSBjb25jYXQoIiIsIFsiJCgiLCBrZXksICIpIl0pCiAgICAjIHJlcGxhY2UgJChWQVIpIHdpdGggdmFsdWUKICAgIG5ld19zdHIxIDo9IHJlcGxhY2Uoc3RyLCBlbnZfa2V5MSwgZW52X21hcFtrZXldKQogICAgIyByZXBsYWNlIG5leHQgZW52aXJvbm1lbnQgdmFyaWFibGUKICAgIHJlc3VsdCA9IHJlcGxhY2Vfc3RyX3JlYyhuZXdfc3RyMSwgZW52X21hcCwgYXJyX2tleXMsIGkgLSAxKQp9CgphbGxvd19lbnZfbWFwKHBfZW52X21hcCwgaV9lbnZfbWFwKSB7CiAgICBwcmludCgiYWxsb3dfZW52X21hcDogcF9lbnZfbWFwID0iLCBwX2Vudl9tYXApCiAgICBldmVyeSBlbnZfa2V5LCBlbnZfdmFsIGluIGlfZW52X21hcCB7CiAgICAgICAgcHJpbnQoImFsbG93X2VudjogZW52X2tleSA9IiwgZW52X2tleSwgImVudl92YWwgPSIsIGVudl92YWwpCiAgICAgICAgYWxsb3dfZW52X21hcF9lbnRyeShlbnZfa2V5LCBlbnZfdmFsLCBwX2Vudl9tYXApCiAgICB9CiAgICBwcmludCgiYWxsb3dfZW52X21hcDogdHJ1ZSIpCn0KCiMgQWxsb3cgZXhhY3QgbWF0Y2gKYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBpX3ZhbCA9PSBwX3ZhbAogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnk6IHRydWUiKQp9CgojIEFsbG93IHJlc291cmNlRmllbGRSZWYgdmFsdWVzIChlLmcuLCAibGltaXRzLmNwdSIpLgphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgICMgYSB2YXJpYWJsZSB3ZSBzaG91bGQgYmUgdmFsaWRhdGluZyB1c2luZyBhIHJlZ2V4IGZyb20gc2V0dGluZ3MKICAgIHBfdmFsID09ICIkKHZhbGlkYXRlLWZyb20tc2V0dGluZ3MpIgogICAgcmVnZXhfdmFsIDo9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuQ3JlYXRlQ29udGFpbmVyUmVxdWVzdC5hbGxvd19lbnZfcmVnZXhfbWFwW2tleV0KICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4X3ZhbCwgaV92YWwpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSAyOiB0cnVlIikKfQoKIyBBbGxvdyBub2RlLW5hbWUKYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChub2RlLW5hbWUpIgogICAgcmVnZXgubWF0Y2gocG9saWN5X2RhdGEuY29tbW9uLmRuc19zdWJkb21haW4gLCBpX3ZhbCkKICAgIHByaW50KCJhbGxvd19lbnZfbWFwX2VudHJ5IDM6IHRydWUiKQp9CgojIEFsbG93IGhvc3QtbmFtZQphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgIHBfdmFsID09ICIkKGhvc3QtbmFtZSkiCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24uZG5zX2xhYmVsICwgaV92YWwpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSA0OiB0cnVlIikKfQoKIyBBbGxvdyBwb2QtdWlkCmFsbG93X2Vudl9tYXBfZW50cnkoa2V5LCBpX3ZhbCwgcF9lbnZfbWFwKSB7CiAgICBwX3ZhbCA6PSBwX2Vudl9tYXBba2V5XQogICAgcF92YWwgPT0gIiQocG9kLXVpZCkiCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24ucG9kX3VpZCAsIGlfdmFsKQogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgNTogdHJ1ZSIpCn0KCiMgQWxsb3cgZmllbGRSZWYgImZpZWxkUGF0aDogc3RhdHVzLnBvZElQIiB2YWx1ZXMuCmFsbG93X2Vudl9tYXBfZW50cnkoa2V5LCBpX3ZhbCwgcF9lbnZfbWFwKSB7CiAgICBpc19pcChpX3ZhbCkKCiAgICBwX3ZhbCA6PSBwX2Vudl9tYXBba2V5XQogICAgcF92YXIgOj0gY29uY2F0KCI9IiwgW2tleSwgcF92YWxdKQogICAgYWxsb3dfcG9kX2lwX3ZhcihrZXksIHBfdmFyKQogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgNjogdHJ1ZSIpCn0KCiMgQWxsb3cgZmllbGRSZWYgImZpZWxkUGF0aDogc3RhdHVzLmhvc3RJUCIgdmFsdWVzLgphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgaXNfaXAoaV92YWwpCgogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgIHBfdmFyIDo9IGNvbmNhdCgiPSIsIFtrZXksIHBfdmFsXSkKICAgIGFsbG93X2hvc3RfaXBfdmFyKGtleSwgcF92YXIpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSA3OiB0cnVlIikKfQoKIyBNYXRjaCBpbnB1dCB3aXRoIG9uZSBvZiB0aGUgcG9saWN5IHZhcmlhYmxlcywgYWZ0ZXIgc3Vic3RpdHV0aW5nICQoc2FuZGJveC1uYW1lKS4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChzYW5kYm94LW5hbWUpIgogICAgc19uYW1lIDo9IGlucHV0LmJhc2UuT0NJLkFubm90YXRpb25zW1NfTkFNRV9LRVldCiAgICBwX3ZhcjIgOj0gcmVwbGFjZShwX3ZhbCwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHBfdmFyMiA9PSBpX3ZhbAogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgODogdHJ1ZSIpCn0KCiMgTWF0Y2ggaW5wdXQgd2l0aCBvbmUgb2YgdGhlIHBvbGljeSB2YXJpYWJsZXMsIGFmdGVyIHN1YnN0aXR1dGluZyAkKHNhbmRib3gtbmFtZXNwYWNlKS4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChzYW5kYm94LW5hbWVzcGFjZSkiCiAgICBzX25hbWVzcGFjZSA6PSBpbnB1dC5iYXNlLk9DSS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwX3ZhcjIgOj0gcmVwbGFjZShwX3ZhbCwgIiQoc2FuZGJveC1uYW1lc3BhY2UpIiwgc19uYW1lc3BhY2UpCiAgICBwX3ZhcjIgPT0gaV92YWwKICAgIHByaW50KCJhbGxvd19lbnZfbWFwX2VudHJ5IDk6IHRydWUiKQp9CgojIEFsbG93IGlucHV0IGVudiB2YXJpYWJsZXMgdGhhdCBtYXRjaCB3aXRoIGEgcmVxdWVzdF9kZWZhdWx0cyByZWdleC4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHNvbWUgcF9yZWdleDEgaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5DcmVhdGVDb250YWluZXJSZXF1ZXN0LmFsbG93X2Vudl9yZWdleAogICAgcF9yZWdleDIgOj0gcmVwbGFjZShwX3JlZ2V4MSwgIiQoaXB2NF9hKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcHY0X2EpCiAgICBwX3JlZ2V4MyA6PSByZXBsYWNlKHBfcmVnZXgyLCAiJChpcF9wKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcF9wKQogICAgcF9yZWdleDQgOj0gcmVwbGFjZShwX3JlZ2V4MywgIiQoc3ZjX25hbWUpIiwgcG9saWN5X2RhdGEuY29tbW9uLnN2Y19uYW1lKQogICAgcF9yZWdleDUgOj0gcmVwbGFjZShwX3JlZ2V4NCwgIiQoZG5zX2xhYmVsKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5kbnNfbGFiZWwpCgogICAgcmVzdWx0IDo9IGNvbmNhdCgiPSIsIFtrZXksIGlfdmFsXSkKICAgIHJlZ2V4Lm1hdGNoKHBfcmVnZXg1LCByZXN1bHQpCgogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgMTA6IHRydWUiKQp9CgpDcmVhdGVDb250YWluZXJSZXF1ZXN0Oj0gcmVzcCB7CiAgICBub3QgaW5wdXQuZW52X21hcAogICAgaV9wcm9jZXNzID0gaW5wdXQuT0NJLlByb2Nlc3MKICAgIHNfbmFtZSA9IGlucHV0Lk9DSS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBwX3Byb2Nlc3MgPSBwX2NvbnRhaW5lci5PQ0kuUHJvY2VzcwogICAgYWxsb3dfZGVwcmVjYXRlZF9hcmdzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUpCiAgICByZXNwID0gQ3JlYXRlQ29udGFpbmVyUmVxdWVzdENvbW1vbihpbnB1dCkKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0MjogdHJ1ZSIpCn0KCkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb24ocmVxKTo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgICMgQ2hlY2sgaWYgdGhlIGlucHV0IHJlcXVlc3Qgc2hvdWxkIGJlIHJlamVjdGVkIGV2ZW4gYmVmb3JlIGNoZWNraW5nIHRoZQogICAgIyBwb2xpY3lfZGF0YS5jb250YWluZXJzIGluZm9ybWF0aW9uLgogICAgYWxsb3dfY3JlYXRlX2NvbnRhaW5lcl9pbnB1dChyZXEpCgogICAgaV9vY2kgOj0gcmVxLk9DSQogICAgaV9zdG9yYWdlcyA6PSByZXEuc3RvcmFnZXMKICAgIGlfZGV2aWNlcyA6PSByZXEuZGV2aWNlcwoKICAgICMgYXJyYXkgb2YgcG9zc2libGUgc3RhdGUgb3BlcmF0aW9ucwogICAgb3BzX2J1aWxkZXIgOj0gW10KCiAgICAjIGNoZWNrIHNhbmRib3ggbmFtZQogICAgc2FuZGJveF9uYW1lID0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FX0tFWV0KICAgIGFkZF9zYW5kYm94X25hbWVfdG9fc3RhdGUgOj0gc3RhdGVfYWxsb3dzKCJzYW5kYm94X25hbWUiLCBzYW5kYm94X25hbWUpCiAgICBvcHNfYnVpbGRlcjEgOj0gY29uY2F0X29wX2lmX25vdF9udWxsKG9wc19idWlsZGVyLCBhZGRfc2FuZGJveF9uYW1lX3RvX3N0YXRlKQoKICAgICMgQ2hlY2sgaWYgYW55IGVsZW1lbnQgZnJvbSB0aGUgcG9saWN5X2RhdGEuY29udGFpbmVycyBhcnJheSBhbGxvd3MgdGhlIGlucHV0IHJlcXVlc3QuCiAgICBzb21lIHBfY29udGFpbmVyIGluIHBvbGljeV9kYXRhLmNvbnRhaW5lcnMKICAgIHByaW50KCI9PT09PT09PSBDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiB0cnlpbmcgbmV4dCBwb2xpY3kgY29udGFpbmVyIikKCiAgICBwX3BpZG5zIDo9IHBfY29udGFpbmVyLnNhbmRib3hfcGlkbnMKICAgIGlfcGlkbnMgOj0gcmVxLnNhbmRib3hfcGlkbnMKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiBwX3BpZG5zID0iLCBwX3BpZG5zLCAiaV9waWRucyA9IiwgaV9waWRucykKICAgIHBfcGlkbnMgPT0gaV9waWRucwoKICAgIHBfb2NpIDo9IHBfY29udGFpbmVyLk9DSQoKICAgICMgY2hlY2sgbmFtZXNwYWNlCiAgICBwX25hbWVzcGFjZSA6PSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBpX25hbWVzcGFjZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwcmludCAoIkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb246IHBfbmFtZXNwYWNlID0iLCBwX25hbWVzcGFjZSwgImlfbmFtZXNwYWNlID0iLCBpX25hbWVzcGFjZSkKICAgIGFkZF9uYW1lc3BhY2VfdG9fc3RhdGUgOj0gYWxsb3dfbmFtZXNwYWNlKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkKICAgIG9wc19idWlsZGVyMiA6PSBjb25jYXRfb3BfaWZfbm90X251bGwob3BzX2J1aWxkZXIxLCBhZGRfbmFtZXNwYWNlX3RvX3N0YXRlKQoKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiBwIFZlcnNpb24gPSIsIHBfb2NpLlZlcnNpb24sICJpIFZlcnNpb24gPSIsIGlfb2NpLlZlcnNpb24pCiAgICBwX29jaS5WZXJzaW9uID09IGlfb2NpLlZlcnNpb24KCiAgICBwcmludCgiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdENvbW1vbjogcCBSZWFkb25seSA9IiwgcF9vY2kuUm9vdC5SZWFkb25seSwgImkgUmVhZG9ubHkgPSIsIGlfb2NpLlJvb3QuUmVhZG9ubHkpCiAgICBwX29jaS5Sb290LlJlYWRvbmx5ID09IGlfb2NpLlJvb3QuUmVhZG9ubHkKCiAgICBhbGxvd19hbm5vKHBfb2NpLCBpX29jaSkKCiAgICBwX3N0b3JhZ2VzIDo9IHBfY29udGFpbmVyLnN0b3JhZ2VzCiAgICBhbGxvd19ieV9hbm5vKHBfb2NpLCBpX29jaSwgcF9zdG9yYWdlcywgaV9zdG9yYWdlcykKCiAgICBwX2RldmljZXMgOj0gcF9jb250YWluZXIuZGV2aWNlcwogICAgYWxsb3dfZGV2aWNlcyhwX2RldmljZXMsIGlfZGV2aWNlcykKCiAgICByZXQgOj0gYWxsb3dfbGludXgob3BzX2J1aWxkZXIyLCBwX29jaSwgaV9vY2kpCiAgICByZXQuYWxsb3dlZAoKICAgIG9wcyA6PSByZXQub3BzCgogICAgcHJpbnQoIkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb246IHRydWUiKQp9CgphbGxvd19jcmVhdGVfY29udGFpbmVyX2lucHV0KHJlcSkgewogICAgcHJpbnQoImFsbG93X2NyZWF0ZV9jb250YWluZXJfaW5wdXQ6IGlucHV0ID0iLCByZXEpCgogICAgY291bnQocmVxLnNoYXJlZF9tb3VudHMpID09IDAKICAgIGlzX251bGwocmVxLnN0cmluZ191c2VyKQoKICAgIGlfb2NpIDo9IHJlcS5PQ0kKICAgIGlzX251bGwoaV9vY2kuSG9va3MpCiAgICBpc19udWxsKGlfb2NpLlNvbGFyaXMpCiAgICBpc19udWxsKGlfb2NpLldpbmRvd3MpCgogICAgaV9saW51eCA6PSBpX29jaS5MaW51eAogICAgY291bnQoaV9saW51eC5HSURNYXBwaW5ncykgPT0gMAogICAgY291bnQoaV9saW51eC5Nb3VudExhYmVsKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlJlc291cmNlcy5EZXZpY2VzKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlJvb3Rmc1Byb3BhZ2F0aW9uKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlVJRE1hcHBpbmdzKSA9PSAwCiAgICBpc19udWxsKGlfbGludXguSW50ZWxSZHQpCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLkJsb2NrSU8pCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLk5ldHdvcmspCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLlBpZHMpCiAgICBpc19udWxsKGlfbGludXguU2VjY29tcCkKCiAgICBpX3Byb2Nlc3MgOj0gaV9vY2kuUHJvY2VzcwogICAgY291bnQoaV9wcm9jZXNzLlNlbGludXhMYWJlbCkgPT0gMAogICAgY291bnQoaV9wcm9jZXNzLlVzZXIuVXNlcm5hbWUpID09IDAKCiAgICBwcmludCgiYWxsb3dfY3JlYXRlX2NvbnRhaW5lcl9pbnB1dDogdHJ1ZSIpCn0KCmFsbG93X25hbWVzcGFjZShwX25hbWVzcGFjZSwgaV9uYW1lc3BhY2UpID0gYWRkX25hbWVzcGFjZSB7CiAgICBwX25hbWVzcGFjZSA9PSBpX25hbWVzcGFjZQogICAgYWRkX25hbWVzcGFjZSA6PSBudWxsCiAgICBwcmludCgiYWxsb3dfbmFtZXNwYWNlIDE6IGlucHV0IG5hbWVzcGFjZSBtYXRjaGVzIHBvbGljeSBkYXRhIikKfQoKYWxsb3dfbmFtZXNwYWNlKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkgPSBhZGRfbmFtZXNwYWNlIHsKICAgIHBfbmFtZXNwYWNlID09ICIiCiAgICBwcmludCgiYWxsb3dfbmFtZXNwYWNlIDI6IG5vIG5hbWVzcGFjZSBmb3VuZCBvbiBwb2xpY3kgZGF0YSIpCiAgICBhZGRfbmFtZXNwYWNlIDo9IHN0YXRlX2FsbG93cygibmFtZXNwYWNlIiwgaV9uYW1lc3BhY2UpCn0KCiMgdmFsdWUgaGFzbid0IGJlZW4gc2VlbiBiZWZvcmUsIHNhdmUgaXQgdG8gc3RhdGUKc3RhdGVfYWxsb3dzKGtleSwgdmFsdWUpID0gYWN0aW9uIHsKICBzdGF0ZSA6PSBnZXRfc3RhdGUoKQogIHByaW50KCJzdGF0ZV9hbGxvd3MgMTogc3RhdGVba2V5XSA9Iiwgc3RhdGVba2V5XSwgInZhbHVlID0iLCB2YWx1ZSkKICBub3Qgc3RhdGVba2V5XQogIHByaW50KCJzdGF0ZV9hbGxvd3MgMTogc2F2aW5nIHRvIHN0YXRlIGtleSA9Iiwga2V5LCAidmFsdWUgPSIsIHZhbHVlKQogIHBhdGggOj0gZ2V0X3N0YXRlX3BhdGgoa2V5KSAKICBhY3Rpb24gOj0gewogICAgIm9wIjogImFkZCIsCiAgICAicGF0aCI6IHBhdGgsIAogICAgInZhbHVlIjogdmFsdWUsCiAgfQp9CgojIHZhbHVlIG1hdGNoZXMgd2hhdCdzIGluIHN0YXRlLCBhbGxvdyBpdApzdGF0ZV9hbGxvd3Moa2V5LCB2YWx1ZSkgPSBhY3Rpb24gewogIHByaW50KCJzdGF0ZV9hbGxvd3MgMjogc3RhcnQiKQogIHN0YXRlIDo9IGdldF9zdGF0ZSgpCiAgcHJpbnQoInN0YXRlX2FsbG93cyAyOiBzdGF0ZVtrZXldID0iLCBzdGF0ZVtrZXldLCAidmFsdWUgPSIsIHZhbHVlKQogIHZhbHVlID09IHN0YXRlW2tleV0KICBwcmludCgic3RhdGVfYWxsb3dzIDI6IGZvdW5kIGtleSA9Iiwga2V5LCAidmFsdWUgPSIsIHZhbHVlLCAiIGluIHN0YXRlIikKICBhY3Rpb24gOj0gbnVsbAp9CgojIGhlbHBlciBmdW5jdGlvbnMgdG8gaW50ZXJhY3Qgd2l0aCB0aGUgc3RhdGUKZ2V0X3N0YXRlKCkgPSBzdGF0ZSB7CiAgc3RhdGUgOj0gZGF0YVsicHN0YXRlIl0KfQoKZ2V0X3N0YXRlX3ZhbChrZXkpID0gdmFsdWUgewogICAgc3RhdGUgOj0gZ2V0X3N0YXRlKCkKICAgIHZhbHVlIDo9IHN0YXRlW2tleV0KfQoKZ2V0X3N0YXRlX3BhdGgoa2V5KSA9IHBhdGggewogICAgIyBwcmVwZW5kICIvcHN0YXRlLyIgdG8ga2V5CiAgICBwYXRoIDo9IGNvbmNhdCgiLyIsIFsiL3BzdGF0ZSIsIGtleV0pCn0KCiMgSGVscGVyIGZ1bmN0aW9ucyB0byBjb25kaXRpb25hbGx5IGNvbmNhdGVuYXRlIG9wIGlzIG5vdCBudWxsCmNvbmNhdF9vcF9pZl9ub3RfbnVsbChvcHMsIG9wKSA9IHJlc3VsdCB7CiAgICBvcCA9PSBudWxsCiAgICByZXN1bHQgOj0gb3BzCn0KCmNvbmNhdF9vcF9pZl9ub3RfbnVsbChvcHMsIG9wKSA9IHJlc3VsdCB7CiAgICBvcCAhPSBudWxsCiAgICByZXN1bHQgOj0gYXJyYXkuY29uY2F0KG9wcywgW29wXSkKfQoKIyBSZWplY3QgdW5leHBlY3RlZCBhbm5vdGF0aW9ucy4KYWxsb3dfYW5ubyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19hbm5vIDE6IHN0YXJ0IikKCiAgICBub3QgaV9vY2kuQW5ub3RhdGlvbnMKCiAgICBwcmludCgiYWxsb3dfYW5ubyAxOiB0cnVlIikKfQphbGxvd19hbm5vKHBfb2NpLCBpX29jaSkgewogICAgcHJpbnQoImFsbG93X2Fubm8gMjogcCBBbm5vdGF0aW9ucyA9IiwgcF9vY2kuQW5ub3RhdGlvbnMpCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiBpIEFubm90YXRpb25zID0iLCBpX29jaS5Bbm5vdGF0aW9ucykKCiAgICBpX2tleXMgOj0gb2JqZWN0LmtleXMoaV9vY2kuQW5ub3RhdGlvbnMpCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiBpIGtleXMgPSIsIGlfa2V5cykKCiAgICBldmVyeSBpX2tleSBpbiBpX2tleXMgewogICAgICAgIGFsbG93X2Fubm9fa2V5KGlfa2V5LCBwX29jaSkKICAgIH0KCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiB0cnVlIikKfQoKYWxsb3dfYW5ub19rZXkoaV9rZXksIHBfb2NpKSB7CiAgICBwcmludCgiYWxsb3dfYW5ub19rZXkgMTogaSBrZXkgPSIsIGlfa2V5KQoKICAgIHN0YXJ0c3dpdGgoaV9rZXksICJpby5rdWJlcm5ldGVzLmNyaS4iKQoKICAgIHByaW50KCJhbGxvd19hbm5vX2tleSAxOiB0cnVlIikKfQphbGxvd19hbm5vX2tleShpX2tleSwgcF9vY2kpIHsKICAgIHByaW50KCJhbGxvd19hbm5vX2tleSAyOiBpIGtleSA9IiwgaV9rZXkpCgogICAgc29tZSBwX2tleSwgXyBpbiBwX29jaS5Bbm5vdGF0aW9ucwogICAgcF9rZXkgPT0gaV9rZXkKCiAgICBwcmludCgiYWxsb3dfYW5ub19rZXkgMjogdHJ1ZSIpCn0KCiMgR2V0IHRoZSB2YWx1ZSBvZiB0aGUgU19OQU1FX0tFWSBhbm5vdGF0aW9uIGFuZAojIGNvcnJlbGF0ZSBpdCB3aXRoIG90aGVyIGFubm90YXRpb25zIGFuZCBwcm9jZXNzIGZpZWxkcy4KYWxsb3dfYnlfYW5ubyhwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpIHsKICAgIHByaW50KCJhbGxvd19ieV9hbm5vIDE6IHN0YXJ0IikKCiAgICBub3QgcF9vY2kuQW5ub3RhdGlvbnNbU19OQU1FX0tFWV0KCiAgICBpX3NfbmFtZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMTogaV9zX25hbWUgPSIsIGlfc19uYW1lKQoKICAgIGlfc19uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FU1BBQ0VfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMTogaV9zX25hbWVzcGFjZSA9IiwgaV9zX25hbWVzcGFjZSkKCiAgICBhbGxvd19ieV9zYW5kYm94X25hbWUocF9vY2ksIGlfb2NpLCBwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBpX3NfbmFtZSwgaV9zX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfYnlfYW5ubyAxOiB0cnVlIikKfQphbGxvd19ieV9hbm5vKHBfb2NpLCBpX29jaSwgcF9zdG9yYWdlcywgaV9zdG9yYWdlcykgewogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMjogc3RhcnQiKQoKICAgIHBfc19uYW1lIDo9IHBfb2NpLkFubm90YXRpb25zW1NfTkFNRV9LRVldCiAgICBpX3NfbmFtZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMjogaV9zX25hbWUgPSIsIGlfc19uYW1lLCAicF9zX25hbWUgPSIsIHBfc19uYW1lKQoKICAgIGFsbG93X3NhbmRib3hfbmFtZShwX3NfbmFtZSwgaV9zX25hbWUpCgogICAgaV9zX25hbWVzcGFjZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwcmludCgiYWxsb3dfYnlfYW5ubyAyOiBpX3NfbmFtZXNwYWNlID0iLCBpX3NfbmFtZXNwYWNlKQoKICAgIGFsbG93X2J5X3NhbmRib3hfbmFtZShwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMsIGlfc19uYW1lLCBpX3NfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd19ieV9hbm5vIDI6IHRydWUiKQp9CgphbGxvd19ieV9zYW5kYm94X25hbWUocF9vY2ksIGlfb2NpLCBwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfYnlfc2FuZGJveF9uYW1lOiBzdGFydCIpCgogICAgaV9uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FU1BBQ0VfS0VZXQoKICAgIGFsbG93X2J5X2NvbnRhaW5lcl90eXBlcyhwX29jaSwgaV9vY2ksIHNfbmFtZSwgaV9uYW1lc3BhY2UpCiAgICBhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZChwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpCiAgICBhbGxvd19wcm9jZXNzKHBfb2NpLlByb2Nlc3MsIGlfb2NpLlByb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpCgogICAgcHJpbnQoImFsbG93X2J5X3NhbmRib3hfbmFtZTogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfbmFtZShwX3NfbmFtZSwgaV9zX25hbWUpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X25hbWU6IHN0YXJ0IikKICAgIHJlZ2V4Lm1hdGNoKHBfc19uYW1lLCBpX3NfbmFtZSkKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9uYW1lOiB0cnVlIikKfQoKIyBDaGVjayB0aGF0IHRoZSAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLXR5cGUiIGFuZAojICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIiBhbm5vdGF0aW9ucyBkZXNpZ25hdGUgdGhlCiMgZXhwZWN0ZWQgdHlwZSAtIGVpdGhlciBhICJzYW5kYm94IiBvciBhICJjb250YWluZXIiLiBUaGVuLCB2YWxpZGF0ZQojIG90aGVyIGFubm90YXRpb25zIGJhc2VkIG9uIHRoZSBhY3R1YWwgInNhbmRib3giIG9yICJjb250YWluZXIiIHZhbHVlCiMgZnJvbSB0aGUgaW5wdXQgY29udGFpbmVyLgphbGxvd19ieV9jb250YWluZXJfdHlwZXMocF9vY2ksIGlfb2NpLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfYnlfY29udGFpbmVyX3R5cGVzOiBjaGVja2luZyBpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSIpCgogICAgY190eXBlIDo9ICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSIKICAgIAogICAgcF9jcmlfdHlwZSA6PSBwX29jaS5Bbm5vdGF0aW9uc1tjX3R5cGVdCiAgICBpX2NyaV90eXBlIDo9IGlfb2NpLkFubm90YXRpb25zW2NfdHlwZV0KICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZXM6IHBfY3JpX3R5cGUgPSIsIHBfY3JpX3R5cGUsICJpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgcF9jcmlfdHlwZSA9PSBpX2NyaV90eXBlCgogICAgYWxsb3dfYnlfY29udGFpbmVyX3R5cGUoaV9jcmlfdHlwZSwgcF9vY2ksIGlfb2NpLCBzX25hbWUsIHNfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZXM6IHRydWUiKQp9CgphbGxvd19ieV9jb250YWluZXJfdHlwZShpX2NyaV90eXBlLCBwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAxOiBpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgaV9jcmlfdHlwZSA9PSAic2FuZGJveCIKCiAgICBpX2thdGFfdHlwZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1siaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5jb250YWluZXJfdHlwZSJdCiAgICBwcmludCgiYWxsb3dfYnlfY29udGFpbmVyX3R5cGUgMTogaV9rYXRhX3R5cGUgPSIsIGlfa2F0YV90eXBlKQogICAgaV9rYXRhX3R5cGUgPT0gInBvZF9zYW5kYm94IgoKICAgIGFsbG93X3NhbmRib3hfY29udGFpbmVyX25hbWUocF9vY2ksIGlfb2NpKQogICAgYWxsb3dfc2FuZGJveF9uZXRfbmFtZXNwYWNlKHBfb2NpLCBpX29jaSkKICAgIGFsbG93X3NhbmRib3hfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpCgogICAgcHJpbnQoImFsbG93X2J5X2NvbnRhaW5lcl90eXBlIDE6IHRydWUiKQp9CgphbGxvd19ieV9jb250YWluZXJfdHlwZShpX2NyaV90eXBlLCBwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiBpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgaV9jcmlfdHlwZSA9PSAiY29udGFpbmVyIgoKICAgIGlfa2F0YV90eXBlIDo9IGlfb2NpLkFubm90YXRpb25zWyJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIl0KICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiBpX2thdGFfdHlwZSA9IiwgaV9rYXRhX3R5cGUpCiAgICBpX2thdGFfdHlwZSA9PSAicG9kX2NvbnRhaW5lciIKCiAgICBhbGxvd19jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpCiAgICBhbGxvd19uZXRfbmFtZXNwYWNlKHBfb2NpLCBpX29jaSkKICAgIGFsbG93X2xvZ19kaXJlY3RvcnkocF9vY2ksIGlfb2NpKQoKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiB0cnVlIikKfQoKIyAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLW5hbWUiIGFubm90YXRpb24KYWxsb3dfc2FuZGJveF9jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X2NvbnRhaW5lcl9uYW1lOiBzdGFydCIpCgogICAgY29udGFpbmVyX2Fubm90YXRpb25fbWlzc2luZyhwX29jaSwgaV9vY2ksICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItbmFtZSIpCgogICAgcHJpbnQoImFsbG93X3NhbmRib3hfY29udGFpbmVyX25hbWU6IHRydWUiKQp9CgphbGxvd19jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19jb250YWluZXJfbmFtZTogc3RhcnQiKQoKICAgIGFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uKHBfb2NpLCBpX29jaSwgImlvLmt1YmVybmV0ZXMuY3JpLmNvbnRhaW5lci1uYW1lIikKCiAgICBwcmludCgiYWxsb3dfY29udGFpbmVyX25hbWU6IHRydWUiKQp9Cgpjb250YWluZXJfYW5ub3RhdGlvbl9taXNzaW5nKHBfb2NpLCBpX29jaSwga2V5KSB7CiAgICBwcmludCgiY29udGFpbmVyX2Fubm90YXRpb25fbWlzc2luZzoiLCBrZXkpCgogICAgbm90IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIG5vdCBpX29jaS5Bbm5vdGF0aW9uc1trZXldCgogICAgcHJpbnQoImNvbnRhaW5lcl9hbm5vdGF0aW9uX21pc3Npbmc6IHRydWUiKQp9CgphbGxvd19jb250YWluZXJfYW5ub3RhdGlvbihwX29jaSwgaV9vY2ksIGtleSkgewogICAgcHJpbnQoImFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uOiBrZXkgPSIsIGtleSkKCiAgICBwX3ZhbHVlIDo9IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIGlfdmFsdWUgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgcHJpbnQoImFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uOiBwX3ZhbHVlID0iLCBwX3ZhbHVlLCAiaV92YWx1ZSA9IiwgaV92YWx1ZSkKCiAgICBwX3ZhbHVlID09IGlfdmFsdWUKCiAgICBwcmludCgiYWxsb3dfY29udGFpbmVyX2Fubm90YXRpb246IHRydWUiKQp9CgojICJuZXJkY3RsL25ldHdvcmstbmFtZXNwYWNlIiBhbm5vdGF0aW9uCmFsbG93X3NhbmRib3hfbmV0X25hbWVzcGFjZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X25ldF9uYW1lc3BhY2U6IHN0YXJ0IikKCiAgICBrZXkgOj0gIm5lcmRjdGwvbmV0d29yay1uYW1lc3BhY2UiCgogICAgcF9uYW1lc3BhY2UgOj0gcF9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgaV9uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgcHJpbnQoImFsbG93X3NhbmRib3hfbmV0X25hbWVzcGFjZTogcF9uYW1lc3BhY2UgPSIsIHBfbmFtZXNwYWNlLCAiaV9uYW1lc3BhY2UgPSIsIGlfbmFtZXNwYWNlKQoKICAgIHJlZ2V4Lm1hdGNoKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9uZXRfbmFtZXNwYWNlOiB0cnVlIikKfQoKYWxsb3dfbmV0X25hbWVzcGFjZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19uZXRfbmFtZXNwYWNlOiBzdGFydCIpCgogICAga2V5IDo9ICJuZXJkY3RsL25ldHdvcmstbmFtZXNwYWNlIgoKICAgIG5vdCBwX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICBub3QgaV9vY2kuQW5ub3RhdGlvbnNba2V5XQoKICAgIHByaW50KCJhbGxvd19uZXRfbmFtZXNwYWNlOiB0cnVlIikKfQoKIyAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1sb2ctZGlyZWN0b3J5IiBhbm5vdGF0aW9uCmFsbG93X3NhbmRib3hfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X2xvZ19kaXJlY3Rvcnk6IHN0YXJ0IikKCiAgICBrZXkgOj0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbG9nLWRpcmVjdG9yeSIKCiAgICBwX2RpciA6PSBwX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICByZWdleDEgOj0gcmVwbGFjZShwX2RpciwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHJlZ2V4MiA6PSByZXBsYWNlKHJlZ2V4MSwgIiQoc2FuZGJveC1uYW1lc3BhY2UpIiwgc19uYW1lc3BhY2UpCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiByZWdleDIgPSIsIHJlZ2V4MikKCiAgICBpX2RpciA6PSBpX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiBpX2RpciA9IiwgaV9kaXIpCgogICAgcmVnZXgubWF0Y2gocmVnZXgyLCBpX2RpcikKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiB0cnVlIikKfQoKYWxsb3dfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19sb2dfZGlyZWN0b3J5OiBzdGFydCIpCgogICAga2V5IDo9ICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWxvZy1kaXJlY3RvcnkiCgogICAgbm90IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIG5vdCBpX29jaS5Bbm5vdGF0aW9uc1trZXldCgogICAgcHJpbnQoImFsbG93X2xvZ19kaXJlY3Rvcnk6IHRydWUiKQp9CgphbGxvd19kZXZpY2VzKHBfZGV2aWNlcywgaV9kZXZpY2VzKSB7CiAgICBwcmludCgiYWxsb3dfZGV2aWNlczogc3RhcnQiKQogICAgZXZlcnkgaV9kZXZpY2UgaW4gaV9kZXZpY2VzIHsKICAgICAgICBwcmludCgiYWxsb3dfZGV2aWNlczogaV9kZXZpY2UgPSIsIGlfZGV2aWNlKQogICAgICAgIHNvbWUgcF9kZXZpY2UgaW4gcF9kZXZpY2VzCiAgICAgICAgcF9kZXZpY2UuY29udGFpbmVyX3BhdGggPT0gaV9kZXZpY2UuY29udGFpbmVyX3BhdGgKICAgIH0KICAgIHByaW50KCJhbGxvd19kZXZpY2VzOiB0cnVlIikKfQoKYWxsb3dfbGludXgoc3RhdGVfb3BzLCBwX29jaSwgaV9vY2kpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIHBfbmFtZXNwYWNlcyA6PSBwX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbGludXg6IHAgbmFtZXNwYWNlcyA9IiwgcF9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlcyA6PSBpX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbGludXg6IGkgbmFtZXNwYWNlcyA9IiwgaV9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlX3dpdGhvdXRfbmV0d29yayA6PSBbb2JqIHwgb2JqIDo9IGlfbmFtZXNwYWNlc1tfXTsgb2JqLlR5cGUgIT0gIm5ldHdvcmsiXQoKICAgIHByaW50KCJhbGxvd19saW51eDogaV9uYW1lc3BhY2Vfd2l0aG91dF9uZXR3b3JrID0iLCBpX25hbWVzcGFjZV93aXRob3V0X25ldHdvcmspCgogICAgcF9uYW1lc3BhY2VzID09IGlfbmFtZXNwYWNlX3dpdGhvdXRfbmV0d29yawoKICAgIGFsbG93X21hc2tlZF9wYXRocyhwX29jaSwgaV9vY2kpCiAgICBhbGxvd19yZWFkb25seV9wYXRocyhwX29jaSwgaV9vY2kpCiAgICBhbGxvd19saW51eF9kZXZpY2VzKHBfb2NpLkxpbnV4LkRldmljZXMsIGlfb2NpLkxpbnV4LkRldmljZXMpCiAgICBhbGxvd19saW51eF9zeXNjdGwocF9vY2kuTGludXgsIGlfb2NpLkxpbnV4KQogICAgcmV0IDo9IGFsbG93X25ldHdvcmtfbmFtZXNwYWNlX3N0YXJ0KHN0YXRlX29wcywgcF9vY2ksIGlfb2NpKQogICAgcmV0LmFsbG93ZWQKCiAgICBvcHMgOj0gcmV0Lm9wcwoKICAgIHByaW50KCJhbGxvd19saW51eDogdHJ1ZSIpCn0KCiMgUmV0cmlldmUgdGhlICJuZXR3b3JrIiBuYW1lc3BhY2UgZnJvbSB0aGUgaW5wdXQgZGF0YSBhbmQgcGFzcyBpdCBvbiBmb3IgdGhlCiMgbmV0d29yayBuYW1lc3BhY2UgcG9saWN5IGNoZWNrcy4KYWxsb3dfbmV0d29ya19uYW1lc3BhY2Vfc3RhcnQoc3RhdGVfb3BzLCBwX29jaSwgaV9vY2kpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIHByaW50KCJhbGxvd19uZXR3b3JrX25hbWVzcGFjZSBzdGFydDogc3RhcnQiKQoKICAgIHBfbmFtZXNwYWNlcyA6PSBwX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IHAgbmFtZXNwYWNlcyA9IiwgcF9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlcyA6PSBpX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IGkgbmFtZXNwYWNlcyA9IiwgaV9uYW1lc3BhY2VzKQoKICAgICMgUmV0dXJuIHBhdGggb2YgdGhlICJuZXR3b3JrIiBuYW1lc3BhY2UKICAgIG5ldHdvcmtfbnMgOj0gW29iaiB8IG9iaiA6PSBpX25hbWVzcGFjZXNbX107IG9iai5UeXBlID09ICJuZXR3b3JrIl0KCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IG5ldHdvcmtfbnMgPSIsIG5ldHdvcmtfbnMpCgogICAgcmV0IDo9IGFsbG93X25ldHdvcmtfbmFtZXNwYWNlKHN0YXRlX29wcywgbmV0d29ya19ucykKICAgIHJldC5hbGxvd2VkCgogICAgb3BzIDo9IHJldC5vcHMKfQoKIyBUaGlzIHJ1bGUgaXMgd2hlbiB0aGVyZSdzIG5vIG5ldHdvcmsgbmFtZXNwYWNlIGluIHRoZSBpbnB1dCBkYXRhLgphbGxvd19uZXR3b3JrX25hbWVzcGFjZShzdGF0ZV9vcHMsIG5ldHdvcmtfbnMpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIGNvdW50KG5ldHdvcmtfbnMpID09IDAKCiAgICBuZXR3b3JrX25zX3BhdGggPSAiIgoKICAgIGFkZF9uZXR3b3JrX25hbWVzcGFjZV90b19zdGF0ZSA6PSBzdGF0ZV9hbGxvd3MoIm5ldHdvcmtfbmFtZXNwYWNlIiwgbmV0d29ya19uc19wYXRoKQogICAgb3BzIDo9IGNvbmNhdF9vcF9pZl9ub3RfbnVsbChzdGF0ZV9vcHMsIGFkZF9uZXR3b3JrX25hbWVzcGFjZV90b19zdGF0ZSkKCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2UgMTogdHJ1ZSIpCn0KCiMgVGhpcyBydWxlIGlzIHdoZW4gdGhlcmUncyBleGFjdGx5IG9uZSBuZXR3b3JrIG5hbWVzcGFjZSBpbiB0aGUgaW5wdXQgZGF0YS4KYWxsb3dfbmV0d29ya19uYW1lc3BhY2Uoc3RhdGVfb3BzLCBuZXR3b3JrX25zKSA6PSB7Im9wcyI6IG9wcywgImFsbG93ZWQiOiB0cnVlfSB7CiAgICBjb3VudChuZXR3b3JrX25zKSA9PSAxCgogICAgYWRkX25ldHdvcmtfbmFtZXNwYWNlX3RvX3N0YXRlIDo9IHN0YXRlX2FsbG93cygibmV0d29ya19uYW1lc3BhY2UiLCBuZXR3b3JrX25zWzBdLlBhdGgpCiAgICBvcHMgOj0gY29uY2F0X29wX2lmX25vdF9udWxsKHN0YXRlX29wcywgYWRkX25ldHdvcmtfbmFtZXNwYWNlX3RvX3N0YXRlKQoKICAgIHByaW50KCJhbGxvd19uZXR3b3JrX25hbWVzcGFjZSAyOiB0cnVlIikKfQoKYWxsb3dfbWFza2VkX3BhdGhzKHBfb2NpLCBpX29jaSkgewogICAgcF9wYXRocyA6PSBwX29jaS5MaW51eC5NYXNrZWRQYXRocwogICAgcHJpbnQoImFsbG93X21hc2tlZF9wYXRocyAxOiBwX3BhdGhzID0iLCBwX3BhdGhzKQoKICAgIGlfcGF0aHMgOj0gaV9vY2kuTGludXguTWFza2VkUGF0aHMKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aHMgMTogaV9wYXRocyA9IiwgaV9wYXRocykKCiAgICBhbGxvd19tYXNrZWRfcGF0aHNfYXJyYXkocF9wYXRocywgaV9wYXRocykKCiAgICBwcmludCgiYWxsb3dfbWFza2VkX3BhdGhzIDE6IHRydWUiKQp9CmFsbG93X21hc2tlZF9wYXRocyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aHMgMjogc3RhcnQiKQoKICAgIG5vdCBwX29jaS5MaW51eC5NYXNrZWRQYXRocwogICAgbm90IGlfb2NpLkxpbnV4Lk1hc2tlZFBhdGhzCgogICAgcHJpbnQoImFsbG93X21hc2tlZF9wYXRocyAyOiB0cnVlIikKfQoKIyBBbGwgdGhlIHBvbGljeSBtYXNrZWQgcGF0aHMgbXVzdCBiZSBtYXNrZWQgaW4gdGhlIGlucHV0IGRhdGEgdG9vLgojIElucHV0IGlzIGFsbG93ZWQgdG8gaGF2ZSBtb3JlIG1hc2tlZCBwYXRocyB0aGFuIHRoZSBwb2xpY3kuCmFsbG93X21hc2tlZF9wYXRoc19hcnJheShwX2FycmF5LCBpX2FycmF5KSB7CiAgICBldmVyeSBwX2VsZW0gaW4gcF9hcnJheSB7CiAgICAgICAgYWxsb3dfbWFza2VkX3BhdGgocF9lbGVtLCBpX2FycmF5KQogICAgfQp9CgphbGxvd19tYXNrZWRfcGF0aChwX2VsZW0sIGlfYXJyYXkpIHsKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aDogcF9lbGVtID0iLCBwX2VsZW0pCgogICAgc29tZSBpX2VsZW0gaW4gaV9hcnJheQogICAgcF9lbGVtID09IGlfZWxlbQoKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aDogdHJ1ZSIpCn0KCmFsbG93X3JlYWRvbmx5X3BhdGhzKHBfb2NpLCBpX29jaSkgewogICAgcF9wYXRocyA6PSBwX29jaS5MaW51eC5SZWFkb25seVBhdGhzCiAgICBwcmludCgiYWxsb3dfcmVhZG9ubHlfcGF0aHMgMTogcF9wYXRocyA9IiwgcF9wYXRocykKCiAgICBpX3BhdGhzIDo9IGlfb2NpLkxpbnV4LlJlYWRvbmx5UGF0aHMKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAxOiBpX3BhdGhzID0iLCBpX3BhdGhzKQoKICAgIGFsbG93X3JlYWRvbmx5X3BhdGhzX2FycmF5KHBfcGF0aHMsIGlfcGF0aHMsIGlfb2NpLkxpbnV4Lk1hc2tlZFBhdGhzKQoKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAxOiB0cnVlIikKfQphbGxvd19yZWFkb25seV9wYXRocyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAyOiBzdGFydCIpCgogICAgbm90IHBfb2NpLkxpbnV4LlJlYWRvbmx5UGF0aHMKICAgIG5vdCBpX29jaS5MaW51eC5SZWFkb25seVBhdGhzCgogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGhzIDI6IHRydWUiKQp9CgojIEFsbCB0aGUgcG9saWN5IHJlYWRvbmx5IHBhdGhzIG11c3QgYmUgZWl0aGVyOgojIC0gUHJlc2VudCBpbiB0aGUgaW5wdXQgcmVhZG9ubHkgcGF0aHMsIG9yCiMgLSBQcmVzZW50IGluIHRoZSBpbnB1dCBtYXNrZWQgcGF0aHMuCiMgSW5wdXQgaXMgYWxsb3dlZCB0byBoYXZlIG1vcmUgcmVhZG9ubHkgcGF0aHMgdGhhbiB0aGUgcG9saWN5LgphbGxvd19yZWFkb25seV9wYXRoc19hcnJheShwX2FycmF5LCBpX2FycmF5LCBtYXNrZWRfcGF0aHMpIHsKICAgIGV2ZXJ5IHBfZWxlbSBpbiBwX2FycmF5IHsKICAgICAgICBhbGxvd19yZWFkb25seV9wYXRoKHBfZWxlbSwgaV9hcnJheSwgbWFza2VkX3BhdGhzKQogICAgfQp9CgphbGxvd19yZWFkb25seV9wYXRoKHBfZWxlbSwgaV9hcnJheSwgbWFza2VkX3BhdGhzKSB7CiAgICBwcmludCgiYWxsb3dfcmVhZG9ubHlfcGF0aCAxOiBwX2VsZW0gPSIsIHBfZWxlbSkKCiAgICBzb21lIGlfZWxlbSBpbiBpX2FycmF5CiAgICBwX2VsZW0gPT0gaV9lbGVtCgogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGggMTogdHJ1ZSIpCn0KYWxsb3dfcmVhZG9ubHlfcGF0aChwX2VsZW0sIGlfYXJyYXksIG1hc2tlZF9wYXRocykgewogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGggMjogcF9lbGVtID0iLCBwX2VsZW0pCgogICAgc29tZSBpX21hc2tlZCBpbiBtYXNrZWRfcGF0aHMKICAgIHBfZWxlbSA9PSBpX21hc2tlZAoKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRoIDI6IHRydWUiKQp9CgphbGxvd19saW51eF9kZXZpY2VzKHBfZGV2aWNlcywgaV9kZXZpY2VzKSB7CiAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogc3RhcnQiKQogICAgZXZlcnkgaV9kZXZpY2UgaW4gaV9kZXZpY2VzIHsKICAgICAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogaV9kZXZpY2UgPSIsIGlfZGV2aWNlKQogICAgICAgIHNvbWUgcF9kZXZpY2UgaW4gcF9kZXZpY2VzCiAgICAgICAgaV9kZXZpY2UuUGF0aCA9PSBwX2RldmljZS5QYXRoCiAgICB9CiAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogdHJ1ZSIpCn0KCmFsbG93X2xpbnV4X3N5c2N0bChwX2xpbnV4LCBpX2xpbnV4KSB7CiAgICBwcmludCgiYWxsb3dfbGludXhfc3lzY3RsIDE6IHN0YXJ0IikKICAgIG5vdCBpX2xpbnV4LlN5c2N0bAogICAgcHJpbnQoImFsbG93X2xpbnV4X3N5c2N0bCAxOiB0cnVlIikKfQoKYWxsb3dfbGludXhfc3lzY3RsKHBfbGludXgsIGlfbGludXgpIHsKICAgIHByaW50KCJhbGxvd19saW51eF9zeXNjdGwgMjogc3RhcnQiKQogICAgcF9zeXNjdGwgOj0gcF9saW51eC5TeXNjdGwKICAgIGlfc3lzY3RsIDo9IGlfbGludXguU3lzY3RsCiAgICBldmVyeSBpX25hbWUsIGlfdmFsIGluIGlfc3lzY3RsIHsKICAgICAgICBwcmludCgiYWxsb3dfbGludXhfc3lzY3RsIDI6IGlfbmFtZSA9IiwgaV9uYW1lLCAiaV92YWwgPSIsIGlfdmFsKQogICAgICAgIHBfc3lzY3RsW2lfbmFtZV0gPT0gaV92YWwKICAgIH0KICAgIHByaW50KCJhbGxvd19saW51eF9zeXNjdGwgMjogdHJ1ZSIpCn0KCiMgQ2hlY2sgdGhlIGNvbnNpc3RlbmN5IG9mIHRoZSBpbnB1dCAiaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5idW5kbGVfcGF0aCIKIyBhbmQgaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCIgdmFsdWVzIHdpdGggb3RoZXIgZmllbGRzLgphbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZChwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpIHsKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogc3RhcnQiKQoKICAgIGJ1bmRsZV9wYXRoIDo9IGlfb2NpLkFubm90YXRpb25zWyJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmJ1bmRsZV9wYXRoIl0KICAgIGJ1bmRsZV9pZCA6PSByZXBsYWNlKGJ1bmRsZV9wYXRoLCAiL3J1bi9jb250YWluZXJkL2lvLmNvbnRhaW5lcmQucnVudGltZS52Mi50YXNrL2s4cy5pby8iLCAiIikKCiAgICBidW5kbGVfaWRfZm9ybWF0IDo9IGNvbmNhdCgiIiwgWyJeIiwgQlVORExFX0lELCAiJCJdKQogICAgcmVnZXgubWF0Y2goYnVuZGxlX2lkX2Zvcm1hdCwgYnVuZGxlX2lkKQoKICAgIGtleSA6PSAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCIKCiAgICBwX3JlZ2V4IDo9IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIHNhbmRib3hfaWQgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQoKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogc2FuZGJveF9pZCA9Iiwgc2FuZGJveF9pZCwgInJlZ2V4ID0iLCBwX3JlZ2V4KQogICAgcmVnZXgubWF0Y2gocF9yZWdleCwgc2FuZGJveF9pZCkKCiAgICBhbGxvd19yb290X3BhdGgocF9vY2ksIGlfb2NpLCBidW5kbGVfaWQpCgogICAgZXZlcnkgaV9tb3VudCBpbiBpX29jaS5Nb3VudHMgewogICAgICAgIGFsbG93X21vdW50KHBfb2NpLCBpX21vdW50LCBpX3N0b3JhZ2VzLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpCiAgICB9CgogICAgYWxsb3dfc3RvcmFnZXMocF9zdG9yYWdlcywgaV9zdG9yYWdlcywgYnVuZGxlX2lkLCBzYW5kYm94X2lkKQoKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogdHJ1ZSIpCn0KCmFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHBfcHJvY2VzcyA9IiwgcF9wcm9jZXNzKQogICAgcHJpbnQoImFsbG93X3Byb2Nlc3NfY29tbW9uOiBpX3Byb2Nlc3MgPSAiLCBpX3Byb2Nlc3MpCiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHNfbmFtZSA9Iiwgc19uYW1lKQoKICAgIHBfcHJvY2Vzcy5Dd2QgPT0gaV9wcm9jZXNzLkN3ZAogICAgcF9wcm9jZXNzLk5vTmV3UHJpdmlsZWdlcyA9PSBpX3Byb2Nlc3MuTm9OZXdQcml2aWxlZ2VzCgogICAgYWxsb3dfdXNlcihwX3Byb2Nlc3MsIGlfcHJvY2VzcykKICAgIGFsbG93X2VudihwX3Byb2Nlc3MsIGlfcHJvY2Vzcywgc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHRydWUiKQp9CgojIENvbXBhcmUgdGhlIE9DSSBQcm9jZXNzIGZpZWxkIG9mIGEgcG9saWN5IGNvbnRhaW5lciB3aXRoIHRoZSBpbnB1dCBPQ0kgUHJvY2VzcyBmcm9tIGEgQ3JlYXRlQ29udGFpbmVyUmVxdWVzdAphbGxvd19wcm9jZXNzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfcHJvY2Vzczogc3RhcnQiKQoKICAgIGFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgYWxsb3dfY2FwcyhwX3Byb2Nlc3MuQ2FwYWJpbGl0aWVzLCBpX3Byb2Nlc3MuQ2FwYWJpbGl0aWVzKQogICAgcF9wcm9jZXNzLlRlcm1pbmFsID09IGlfcHJvY2Vzcy5UZXJtaW5hbAoKICAgIHByaW50KCJhbGxvd19wcm9jZXNzOiB0cnVlIikKfQoKIyBDb21wYXJlIHRoZSBPQ0kgUHJvY2VzcyBmaWVsZCBvZiBhIHBvbGljeSBjb250YWluZXIgd2l0aCB0aGUgaW5wdXQgcHJvY2VzcyBmaWVsZCBmcm9tIEV4ZWNQcm9jZXNzUmVxdWVzdAphbGxvd19pbnRlcmFjdGl2ZV9wcm9jZXNzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfaW50ZXJhY3RpdmVfcHJvY2Vzczogc3RhcnQiKQoKICAgIGFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgYWxsb3dfZXhlY19jYXBzKGlfcHJvY2Vzcy5DYXBhYmlsaXRpZXMpCgogICAgIyBUaGVzZSBhcmUgY29tbWFuZHMgZW5hYmxlZCB1c2luZyBFeGVjUHJvY2Vzc1JlcXVlc3QgY29tbWFuZHMgYW5kL29yIHJlZ2V4IGZyb20gdGhlIHNldHRpbmdzIGZpbGUuCiAgICAjIFRoZXkgY2FuIGJlIGV4ZWN1dGVkIGludGVyYWN0aXZlbHkgc28gYWxsb3cgdGhlbSB0byB1c2UgYW55IHZhbHVlIGZvciBpX3Byb2Nlc3MuVGVybWluYWwuCgogICAgcHJpbnQoImFsbG93X2ludGVyYWN0aXZlX3Byb2Nlc3M6IHRydWUiKQp9CgojIENvbXBhcmUgdGhlIE9DSSBQcm9jZXNzIGZpZWxkIG9mIGEgcG9saWN5IGNvbnRhaW5lciB3aXRoIHRoZSBpbnB1dCBwcm9jZXNzIGZpZWxkIGZyb20gRXhlY1Byb2Nlc3NSZXF1ZXN0CmFsbG93X3Byb2JlX3Byb2Nlc3MocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19wcm9iZV9wcm9jZXNzOiBzdGFydCIpCgogICAgYWxsb3dfcHJvY2Vzc19jb21tb24ocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpCiAgICBhbGxvd19leGVjX2NhcHMoaV9wcm9jZXNzLkNhcGFiaWxpdGllcykKICAgIHBfcHJvY2Vzcy5UZXJtaW5hbCA9PSBpX3Byb2Nlc3MuVGVybWluYWwKCiAgICBwcmludCgiYWxsb3dfcHJvYmVfcHJvY2VzczogdHJ1ZSIpCn0KCmFsbG93X3VzZXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MpIHsKICAgIHBfdXNlciA6PSBwX3Byb2Nlc3MuVXNlcgogICAgaV91c2VyIDo9IGlfcHJvY2Vzcy5Vc2VyCgogICAgcHJpbnQoImFsbG93X3VzZXI6IGlucHV0IHVpZCA9IiwgaV91c2VyLlVJRCwgInBvbGljeSB1aWQgPSIsIHBfdXNlci5VSUQpCiAgICBwX3VzZXIuVUlEID09IGlfdXNlci5VSUQKCiAgICAjIFRPRE86IHRyYWNrIGRvd24gdGhlIHJlYXNvbiBmb3IgcmVnaXN0cnkuazhzLmlvL3BhdXNlOjMuOSBiZWluZwogICAgIyAgICAgICBleGVjdXRlZCB3aXRoIGdpZCA9IDAgZGVzcGl0ZSBoYXZpbmcgIjY1NTM1OjY1NTM1IiBpbiBpdHMgY29udGFpbmVyIGltYWdlCiAgICAjICAgICAgIGNvbmZpZy4KICAgICNwcmludCgiYWxsb3dfdXNlcjogaW5wdXQgZ2lkID0iLCBpX3VzZXIuR0lELCAicG9saWN5IGdpZCA9IiwgcF91c2VyLkdJRCkKICAgICNwX3VzZXIuR0lEID09IGlfdXNlci5HSUQKCiAgICAjIFRPRE86IGNvbXBhcmUgdGhlIGFkZGl0aW9uYWxHaWRzIGZpZWxkIHRvbyBhZnRlciBjb21wdXRpbmcgaXRzIHZhbHVlCiAgICAjIGJhc2VkIG9uIC9ldGMvcGFzc3dkIGFuZCAvZXRjL2dyb3VwIGZyb20gdGhlIGNvbnRhaW5lciBpbWFnZS4KfQoKYWxsb3dfZGVwcmVjYXRlZF9hcmdzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZ3MgMTogbm8gYXJncyIpCgogICAgbm90IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJncwogICAgbm90IGlfcHJvY2Vzcy5BcmdzCgogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAxOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZ3MocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSkgewogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiBwb2xpY3kgYXJncyA9IiwgcF9wcm9jZXNzLkRlcHJlY2F0ZWRBcmdzKQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiBpbnB1dCBhcmdzID0iLCBpX3Byb2Nlc3MuQXJncykKCiAgICBjb3VudChwX3Byb2Nlc3MuRGVwcmVjYXRlZEFyZ3MpID09IGNvdW50KGlfcHJvY2Vzcy5BcmdzKQoKICAgIGV2ZXJ5IGksIGlfYXJnIGluIGlfcHJvY2Vzcy5BcmdzIHsKICAgICAgICBhbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpCiAgICB9CgogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDE6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgcF9hcmcyIDo9IHJlcGxhY2UocF9hcmcsICIkJCIsICIkIikKICAgIHBfYXJnMiA9PSBpX2FyZwoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAxOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDI6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgIyBUT0RPOiBjYW4gJChub2RlLW5hbWUpIGJlIGhhbmRsZWQgYmV0dGVyPwogICAgY29udGFpbnMocF9hcmcsICIkKG5vZGUtbmFtZSkiKQoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAyOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDM6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgcF9hcmcyIDo9IHJlcGxhY2UocF9hcmcsICIkJCIsICIkIikKICAgIHBfYXJnMyA6PSByZXBsYWNlKHBfYXJnMiwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAzOiBwX2FyZzMgPSIsIHBfYXJnMykKICAgIHBfYXJnMyA9PSBpX2FyZwoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAzOiB0cnVlIikKfQoKIyBPQ0kgcHJvY2Vzcy5FbnYgZmllbGQKYWxsb3dfZW52KHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfZW52OiBwIGVudiA9IiwgcF9wcm9jZXNzLkVudikKICAgIHByaW50KCJhbGxvd19lbnY6IGkgZW52ID0iLCBpX3Byb2Nlc3MuRW52KQoKICAgIGV2ZXJ5IGlfdmFyIGluIGlfcHJvY2Vzcy5FbnYgewogICAgICAgIHByaW50KCJhbGxvd19lbnY6IGlfdmFyID0iLCBpX3ZhcikKICAgICAgICBhbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgfQoKICAgIHByaW50KCJhbGxvd19lbnY6IHRydWUiKQp9CgojIEFsbG93IGlucHV0IGVudiB2YXJpYWJsZXMgdGhhdCBhcmUgcHJlc2VudCBpbiB0aGUgcG9saWN5IGRhdGEgdG9vLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHBfdmFyID09IGlfdmFyCiAgICBwcmludCgiYWxsb3dfdmFyIDE6IHRydWUiKQp9CgojIE1hdGNoIGlucHV0IHdpdGggb25lIG9mIHRoZSBwb2xpY3kgdmFyaWFibGVzLCBhZnRlciBzdWJzdGl0dXRpbmcgJChzYW5kYm94LW5hbWUpLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHByaW50KCJhbGxvd192YXIgMjogcF92YXIgPSIsIHBfdmFyKQoKICAgIHBfdmFyX3NwbGl0IDo9IHNwbGl0KHBfdmFyLCAiPSIpCiAgICBjb3VudChwX3Zhcl9zcGxpdCkgPT0gMgoKICAgIHBfdmFyX3NwbGl0WzFdID09ICIkKHNhbmRib3gtbmFtZSkiCgogICAgaV92YXJfc3BsaXQgOj0gc3BsaXQoaV92YXIsICI9IikKICAgIGNvdW50KGlfdmFyX3NwbGl0KSA9PSAyCgogICAgaV92YXJfc3BsaXRbMF0gPT0gcF92YXJfc3BsaXRbMF0KICAgIHJlZ2V4Lm1hdGNoKHNfbmFtZSwgaV92YXJfc3BsaXRbMV0pCgogICAgcHJpbnQoImFsbG93X3ZhciAyOiB0cnVlIikKfQoKIyBBbGxvdyBpbnB1dCBlbnYgdmFyaWFibGVzIHRoYXQgbWF0Y2ggd2l0aCBhIHJlcXVlc3RfZGVmYXVsdHMgcmVnZXguCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHNvbWUgcF9yZWdleDEgaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5DcmVhdGVDb250YWluZXJSZXF1ZXN0LmFsbG93X2Vudl9yZWdleAogICAgcF9yZWdleDIgOj0gcmVwbGFjZShwX3JlZ2V4MSwgIiQoaXB2NF9hKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcHY0X2EpCiAgICBwX3JlZ2V4MyA6PSByZXBsYWNlKHBfcmVnZXgyLCAiJChpcF9wKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcF9wKQogICAgcF9yZWdleDQgOj0gcmVwbGFjZShwX3JlZ2V4MywgIiQoc3ZjX25hbWUpIiwgcG9saWN5X2RhdGEuY29tbW9uLnN2Y19uYW1lKQogICAgcF9yZWdleDUgOj0gcmVwbGFjZShwX3JlZ2V4NCwgIiQoZG5zX2xhYmVsKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5kbnNfbGFiZWwpCgogICAgcHJpbnQoImFsbG93X3ZhciAzOiBwX3JlZ2V4NSA9IiwgcF9yZWdleDUpCiAgICByZWdleC5tYXRjaChwX3JlZ2V4NSwgaV92YXIpCgogICAgcHJpbnQoImFsbG93X3ZhciAzOiB0cnVlIikKfQoKIyBBbGxvdyBmaWVsZFJlZiAiZmllbGRQYXRoOiBzdGF0dXMucG9kSVAiIHZhbHVlcy4KYWxsb3dfdmFyKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBpX3Zhciwgc19uYW1lLCBzX25hbWVzcGFjZSkgewogICAgbmFtZV92YWx1ZSA6PSBzcGxpdChpX3ZhciwgIj0iKQogICAgY291bnQobmFtZV92YWx1ZSkgPT0gMgogICAgaXNfaXAobmFtZV92YWx1ZVsxXSkKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIGFsbG93X3BvZF9pcF92YXIobmFtZV92YWx1ZVswXSwgcF92YXIpCgogICAgcHJpbnQoImFsbG93X3ZhciA0OiB0cnVlIikKfQoKIyBBbGxvdyBjb21tb24gZmllbGRSZWYgdmFyaWFibGVzLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBuYW1lX3ZhbHVlIDo9IHNwbGl0KGlfdmFyLCAiPSIpCiAgICBjb3VudChuYW1lX3ZhbHVlKSA9PSAyCgogICAgc29tZSBwX3ZhciBpbiBwX3Byb2Nlc3MuRW52CiAgICBwX25hbWVfdmFsdWUgOj0gc3BsaXQocF92YXIsICI9IikKICAgIGNvdW50KHBfbmFtZV92YWx1ZSkgPT0gMgoKICAgIHBfbmFtZV92YWx1ZVswXSA9PSBuYW1lX3ZhbHVlWzBdCgogICAgIyBUT0RPOiBzaG91bGQgdGhlc2UgYmUgaGFuZGxlZCBpbiBhIGRpZmZlcmVudCB3YXk/CiAgICBhbHdheXNfYWxsb3dlZCA6PSBbIiQoaG9zdC1uYW1lKSIsICIkKG5vZGUtbmFtZSkiLCAiJChwb2QtdWlkKSJdCiAgICBzb21lIGFsbG93ZWQgaW4gYWx3YXlzX2FsbG93ZWQKICAgIGNvbnRhaW5zKHBfbmFtZV92YWx1ZVsxXSwgYWxsb3dlZCkKCiAgICBwcmludCgiYWxsb3dfdmFyIDU6IHRydWUiKQp9CgojIEFsbG93IGZpZWxkUmVmICJmaWVsZFBhdGg6IHN0YXR1cy5ob3N0SVAiIHZhbHVlcy4KYWxsb3dfdmFyKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBpX3Zhciwgc19uYW1lLCBzX25hbWVzcGFjZSkgewogICAgbmFtZV92YWx1ZSA6PSBzcGxpdChpX3ZhciwgIj0iKQogICAgY291bnQobmFtZV92YWx1ZSkgPT0gMgogICAgaXNfaXAobmFtZV92YWx1ZVsxXSkKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIGFsbG93X2hvc3RfaXBfdmFyKG5hbWVfdmFsdWVbMF0sIHBfdmFyKQoKICAgIHByaW50KCJhbGxvd192YXIgNjogdHJ1ZSIpCn0KCiMgQWxsb3cgcmVzb3VyY2VGaWVsZFJlZiB2YWx1ZXMgKGUuZy4sICJsaW1pdHMuY3B1IikuCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIG5hbWVfdmFsdWUgOj0gc3BsaXQoaV92YXIsICI9IikKICAgIGNvdW50KG5hbWVfdmFsdWUpID09IDIKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHBfbmFtZV92YWx1ZSA6PSBzcGxpdChwX3ZhciwgIj0iKQogICAgY291bnQocF9uYW1lX3ZhbHVlKSA9PSAyCgogICAgcF9uYW1lX3ZhbHVlWzBdID09IG5hbWVfdmFsdWVbMF0KCiAgICAjIGEgdmFyaWFibGUgd2Ugc2hvdWxkIGJlIHZhbGlkYXRpbmcgdXNpbmcgYSByZWdleCBmcm9tIHNldHRpbmdzCiAgICBwX25hbWVfdmFsdWVbMV0gPT0gIiQodmFsaWRhdGUtZnJvbS1zZXR0aW5ncykiCgogICAgcmVnZXhfdmFsIDo9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuQ3JlYXRlQ29udGFpbmVyUmVxdWVzdC5hbGxvd19lbnZfcmVnZXhfbWFwW25hbWVfdmFsdWVbMF1dCgogICAgcHJpbnQoImFsbG93X3ZhciA3OiB2YWwgPSIsIG5hbWVfdmFsdWVbMV0pCiAgICBwcmludCgiYWxsb3dfdmFyIDc6IHJlZ2V4X3ZhbCA9IiwgcmVnZXhfdmFsKQoKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4X3ZhbCwgbmFtZV92YWx1ZVsxXSkKCiAgICBwcmludCgiYWxsb3dfdmFyIDc6IHRydWUiKQp9CgojIE1hdGNoIGlucHV0IHdpdGggb25lIG9mIHRoZSBwb2xpY3kgdmFyaWFibGVzLCBhZnRlciBzdWJzdGl0dXRpbmcgJChzYW5kYm94LW5hbWVzcGFjZSkuCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHNvbWUgcF92YXIgaW4gcF9wcm9jZXNzLkVudgogICAgcF92YXIyIDo9IHJlcGxhY2UocF92YXIsICIkKHNhbmRib3gtbmFtZXNwYWNlKSIsIHNfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd192YXIgODogcF92YXIyID0iLCBwX3ZhcjIpCiAgICBwX3ZhcjIgPT0gaV92YXIKCiAgICBwcmludCgiYWxsb3dfdmFyIDg6IHRydWUiKQp9CgphbGxvd19wb2RfaXBfdmFyKHZhcl9uYW1lLCBwX3ZhcikgewogICAgcHJpbnQoImFsbG93X3BvZF9pcF92YXI6IHZhcl9uYW1lID0iLCB2YXJfbmFtZSwgInBfdmFyID0iLCBwX3ZhcikKCiAgICBwX25hbWVfdmFsdWUgOj0gc3BsaXQocF92YXIsICI9IikKICAgIGNvdW50KHBfbmFtZV92YWx1ZSkgPT0gMgoKICAgIHBfbmFtZV92YWx1ZVswXSA9PSB2YXJfbmFtZQogICAgcF9uYW1lX3ZhbHVlWzFdID09ICIkKHBvZC1pcCkiCgogICAgcHJpbnQoImFsbG93X3BvZF9pcF92YXI6IHRydWUiKQp9CgphbGxvd19ob3N0X2lwX3Zhcih2YXJfbmFtZSwgcF92YXIpIHsKICAgIHByaW50KCJhbGxvd19ob3N0X2lwX3ZhcjogdmFyX25hbWUgPSIsIHZhcl9uYW1lLCAicF92YXIgPSIsIHBfdmFyKQoKICAgIHBfbmFtZV92YWx1ZSA6PSBzcGxpdChwX3ZhciwgIj0iKQogICAgY291bnQocF9uYW1lX3ZhbHVlKSA9PSAyCgogICAgcF9uYW1lX3ZhbHVlWzBdID09IHZhcl9uYW1lCiAgICBwX25hbWVfdmFsdWVbMV0gPT0gIiQoaG9zdC1pcCkiCgogICAgcHJpbnQoImFsbG93X2hvc3RfaXBfdmFyOiB0cnVlIikKfQoKaXNfaXAodmFsdWUpIHsKICAgIGJ5dGVzID0gc3BsaXQodmFsdWUsICIuIikKICAgIGNvdW50KGJ5dGVzKSA9PSA0CgogICAgaXNfaXBfZmlyc3RfYnl0ZShieXRlc1swXSkKICAgIGlzX2lwX290aGVyX2J5dGUoYnl0ZXNbMV0pCiAgICBpc19pcF9vdGhlcl9ieXRlKGJ5dGVzWzJdKQogICAgaXNfaXBfb3RoZXJfYnl0ZShieXRlc1szXSkKfQppc19pcF9maXJzdF9ieXRlKGNvbXBvbmVudCkgewogICAgbnVtYmVyID0gdG9fbnVtYmVyKGNvbXBvbmVudCkKICAgIG51bWJlciA+PSAxCiAgICBudW1iZXIgPD0gMjU1Cn0KaXNfaXBfb3RoZXJfYnl0ZShjb21wb25lbnQpIHsKICAgIG51bWJlciA9IHRvX251bWJlcihjb21wb25lbnQpCiAgICBudW1iZXIgPj0gMAogICAgbnVtYmVyIDw9IDI1NQp9CgojIE9DSSByb290LlBhdGgKYWxsb3dfcm9vdF9wYXRoKHBfb2NpLCBpX29jaSwgYnVuZGxlX2lkKSB7CiAgICBpX3BhdGggOj0gaV9vY2kuUm9vdC5QYXRoCiAgICBwX3BhdGgxIDo9IHBfb2NpLlJvb3QuUGF0aAogICAgcHJpbnQoImFsbG93X3Jvb3RfcGF0aDogaV9wYXRoID0iLCBpX3BhdGgsICJwX3BhdGgxID0iLCBwX3BhdGgxKQoKICAgIHBfcGF0aDIgOj0gcmVwbGFjZShwX3BhdGgxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfcm9vdF9wYXRoOiBwX3BhdGgyID0iLCBwX3BhdGgyKQoKICAgIHBfcGF0aDMgOj0gcmVwbGFjZShwX3BhdGgyLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X3Jvb3RfcGF0aDogcF9wYXRoMyA9IiwgcF9wYXRoMykKCiAgICBwX3BhdGgzID09IGlfcGF0aAoKICAgIHByaW50KCJhbGxvd19yb290X3BhdGg6IHRydWUiKQp9CgojIGRldmljZSBtb3VudHMKYWxsb3dfbW91bnQocF9vY2ksIGlfbW91bnQsIGlfc3RvcmFnZXMsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcHJpbnQoImFsbG93X21vdW50OiBpX21vdW50ID0iLCBpX21vdW50KQoKICAgIHNvbWUgcF9tb3VudCBpbiBwX29jaS5Nb3VudHMKICAgIHNvbWUgaV9zdG9yYWdlIGluIGlfc3RvcmFnZXMKCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IHBfbW91bnQgPSIsIHBfbW91bnQpCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IGlfc3RvcmFnZSA9IiwgaV9zdG9yYWdlKQoKICAgIGNoZWNrX21vdW50KHBfbW91bnQsIGlfbW91bnQsIGlfc3RvcmFnZSwgYnVuZGxlX2lkLCBzYW5kYm94X2lkKQoKICAgICMgVE9ETzogYXJlIHRoZXJlIGFueSBvdGhlciByZXF1aXJlZCBwb2xpY3kgY2hlY2tzIGZvciBtb3VudHMgLSBlLmcuLAogICAgIyAgICAgICBtdWx0aXBsZSBtb3VudHMgd2l0aCBzYW1lIHNvdXJjZSBvciBkZXN0aW5hdGlvbj8KCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IHRydWUiKQp9CgpjaGVja19tb3VudChwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcF9tb3VudCA9PSBpX21vdW50CiAgICBwcmludCgiY2hlY2tfbW91bnQgMTogdHJ1ZSIpCn0KY2hlY2tfbW91bnQocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHBfbW91bnQuZGVzdGluYXRpb24gPT0gaV9tb3VudC5kZXN0aW5hdGlvbgogICAgcF9tb3VudC50eXBlXyA9PSBpX21vdW50LnR5cGVfCiAgICBwX21vdW50Lm9wdGlvbnMgPT0gaV9tb3VudC5vcHRpb25zCgogICAgbW91bnRfc291cmNlX2FsbG93cyhwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkKCiAgICBwcmludCgiY2hlY2tfbW91bnQgMjogdHJ1ZSIpCn0KCm1vdW50X3NvdXJjZV9hbGxvd3MocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHJlZ2V4MSA6PSBwX21vdW50LnNvdXJjZQogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5tb3VudF9zb3VyY2VfY3BhdGgpCiAgICByZWdleDQgOj0gcmVwbGFjZShyZWdleDMsICIkKGJ1bmRsZS1pZCkiLCBidW5kbGVfaWQpCgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMTogcmVnZXg0ID0iLCByZWdleDQpCiAgICByZWdleC5tYXRjaChyZWdleDQsIGlfbW91bnQuc291cmNlKQoKICAgIHByaW50KCJtb3VudF9zb3VyY2VfYWxsb3dzIDE6IHRydWUiKQp9Cm1vdW50X3NvdXJjZV9hbGxvd3MocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHJlZ2V4MSA6PSBwX21vdW50LnNvdXJjZQogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5tb3VudF9zb3VyY2VfY3BhdGgpCiAgICByZWdleDQgOj0gcmVwbGFjZShyZWdleDMsICIkKHNhbmRib3gtaWQpIiwgc2FuZGJveF9pZCkKCiAgICBwcmludCgibW91bnRfc291cmNlX2FsbG93cyAyOiByZWdleDQgPSIsIHJlZ2V4NCkKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4NCwgaV9tb3VudC5zb3VyY2UpCgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMjogdHJ1ZSIpCn0KbW91bnRfc291cmNlX2FsbG93cyhwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogaV9tb3VudC5zb3VyY2UgPSIsIGlfbW91bnQuc291cmNlKQogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogaV9zdG9yYWdlLm1vdW50X3BvaW50ID0iLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCgogICAgaV9tb3VudC5zb3VyY2UgPT0gaV9zdG9yYWdlLm1vdW50X3BvaW50CgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogdHJ1ZSIpCn0KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBDcmVhdGUgY29udGFpbmVyIFN0b3JhZ2VzCgphbGxvd19zdG9yYWdlcyhwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHBfY291bnQgOj0gY291bnQocF9zdG9yYWdlcykKICAgIGlfY291bnQgOj0gY291bnQoaV9zdG9yYWdlcykKICAgIHByaW50KCJhbGxvd19zdG9yYWdlczogcF9jb3VudCA9IiwgcF9jb3VudCwgImlfY291bnQgPSIsIGlfY291bnQpCgogICAgcF9jb3VudCA9PSBpX2NvdW50CgogICAgIyBHZXQgdGhlIGNvbnRhaW5lciBpbWFnZSBsYXllciBJRHMgYW5kIHZlcml0eSByb290IGhhc2hlcywgZnJvbSB0aGUgIm92ZXJsYXlmcyIgc3RvcmFnZS4KICAgIHNvbWUgb3ZlcmxheV9zdG9yYWdlIGluIHBfc3RvcmFnZXMKICAgIG92ZXJsYXlfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIHByaW50KCJhbGxvd19zdG9yYWdlczogb3ZlcmxheV9zdG9yYWdlID0iLCBvdmVybGF5X3N0b3JhZ2UpCiAgICBjb3VudChvdmVybGF5X3N0b3JhZ2Uub3B0aW9ucykgPT0gMgoKICAgIGxheWVyX2lkcyA6PSBzcGxpdChvdmVybGF5X3N0b3JhZ2Uub3B0aW9uc1swXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiBsYXllcl9pZHMgPSIsIGxheWVyX2lkcykKCiAgICByb290X2hhc2hlcyA6PSBzcGxpdChvdmVybGF5X3N0b3JhZ2Uub3B0aW9uc1sxXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiByb290X2hhc2hlcyA9Iiwgcm9vdF9oYXNoZXMpCgogICAgZXZlcnkgaV9zdG9yYWdlIGluIGlfc3RvcmFnZXMgewogICAgICAgIGFsbG93X3N0b3JhZ2UocF9zdG9yYWdlcywgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpCiAgICB9CgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiB0cnVlIikKfQoKYWxsb3dfc3RvcmFnZShwX3N0b3JhZ2VzLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgc29tZSBwX3N0b3JhZ2UgaW4gcF9zdG9yYWdlcwoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiBwX3N0b3JhZ2UgPSIsIHBfc3RvcmFnZSkKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiBpX3N0b3JhZ2UgPSIsIGlfc3RvcmFnZSkKCiAgICBwX3N0b3JhZ2UuZHJpdmVyICAgICAgICAgICA9PSBpX3N0b3JhZ2UuZHJpdmVyCiAgICBwX3N0b3JhZ2UuZHJpdmVyX29wdGlvbnMgICA9PSBpX3N0b3JhZ2UuZHJpdmVyX29wdGlvbnMKICAgIHBfc3RvcmFnZS5mc19ncm91cCAgICAgICAgID09IGlfc3RvcmFnZS5mc19ncm91cAogICAgcF9zdG9yYWdlLmZzdHlwZSAgICAgICAgICAgPT0gaV9zdG9yYWdlLmZzdHlwZQoKICAgIGFsbG93X3N0b3JhZ2Vfc291cmNlKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKQogICAgYWxsb3dfc3RvcmFnZV9vcHRpb25zKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKQogICAgYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKQoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiB0cnVlIikKfQoKYWxsb3dfc3RvcmFnZV9zb3VyY2UocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX3NvdXJjZSAxOiBzdGFydCIpCgogICAgcF9zdG9yYWdlLnNvdXJjZSA9PSBpX3N0b3JhZ2Uuc291cmNlCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDE6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX3NvdXJjZShwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDI6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCgogICAgIyBEREREOkJCOkRELkY6IERvbWFpbjpCdXM6RGV2aWNlLkZ1bmN0aW9uCiAgICAjIGh0dHBzOi8vd3d3Lmtlcm5lbC5vcmcvZG9jL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtYnVzLXBjaQogICAgcmVnZXgubWF0Y2goYF5bYS1mMC05XXs0fTpbYS1mMC05XXsyfTpbYS1mMC05XXsyfVwuW2EtZjAtOV0kYCwgaV9zdG9yYWdlLnNvdXJjZSkKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9zb3VyY2UgMjogdHJ1ZSIpCn0KCmFsbG93X3N0b3JhZ2Vfc291cmNlKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKSB7CiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9zb3VyY2UgMzogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIGlfc3RvcmFnZS5zb3VyY2UgPT0gIm5vbmUiCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDM6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX3NvdXJjZShwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDQ6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJzbWIiCgogICAgIyBQYXR0ZXJuOiAvLzxzdG9yYWdlLWFjY291bnQtbmFtZT4uZmlsZS5jb3JlLndpbmRvd3MubmV0LzxrOHMtUFZDLW5hbWU+CiAgICAjIFN0b3JhZ2UgYWNjb3VudCBuYW1lOiBodHRwczovL2xlYXJuLm1pY3Jvc29mdC5jb20vZW4tdXMvYXp1cmUvc3RvcmFnZS9jb21tb24vc3RvcmFnZS1hY2NvdW50LW92ZXJ2aWV3I3N0b3JhZ2UtYWNjb3VudC1uYW1lCiAgICAjIEs4cyBQVkMgbmFtZTogaHR0cHM6Ly9rdWJlcm5ldGVzLmlvL2RvY3MvY29uY2VwdHMvb3ZlcnZpZXcvd29ya2luZy13aXRoLW9iamVjdHMvbmFtZXMvI2Rucy1zdWJkb21haW4tbmFtZXMKICAgIHJlZ2V4Lm1hdGNoKGBeXC9cLyhbYS16MC05XXszLDI0fSlcLmZpbGVcLmNvcmVcLndpbmRvd3NcLm5ldFwvW2EtejAtOV0oW2EtejAtOS4tXXswLDI1MX1bYS16MC05XSk/JGAsIGlfc3RvcmFnZS5zb3VyY2UpCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDQ6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMTogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgIT0gIm92ZXJsYXlmcyIKICAgIHBfc3RvcmFnZS5vcHRpb25zID09IGlfc3RvcmFnZS5vcHRpb25zCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAxOiB0cnVlIikKfQphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIGNvdW50KHBfc3RvcmFnZS5vcHRpb25zKSA9PSAyCgogICAgcG9saWN5X2lkcyA6PSBzcGxpdChwX3N0b3JhZ2Uub3B0aW9uc1swXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBwb2xpY3lfaWRzID0iLCBwb2xpY3lfaWRzKQogICAgcG9saWN5X2lkcyA9PSBsYXllcl9pZHMKCiAgICBwb2xpY3lfaGFzaGVzIDo9IHNwbGl0KHBfc3RvcmFnZS5vcHRpb25zWzFdLCAiOiIpCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IHBvbGljeV9oYXNoZXMgPSIsIHBvbGljeV9oYXNoZXMpCgogICAgcF9jb3VudCA6PSBjb3VudChwb2xpY3lfaWRzKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBwX2NvdW50ID0iLCBwX2NvdW50KQogICAgcF9jb3VudCA+PSAxCiAgICBwX2NvdW50ID09IGNvdW50KHBvbGljeV9oYXNoZXMpCgogICAgaV9jb3VudCA6PSBjb3VudChpX3N0b3JhZ2Uub3B0aW9ucykKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogaV9jb3VudCA9IiwgaV9jb3VudCkKICAgIGlfY291bnQgPT0gcF9jb3VudCArIDMKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zWzBdID0iLCBpX3N0b3JhZ2Uub3B0aW9uc1swXSkKICAgIGlfc3RvcmFnZS5vcHRpb25zWzBdID09ICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQubGF5ZXItc3JjLXByZWZpeD0vdmFyL2xpYi9jb250YWluZXJkL2lvLmNvbnRhaW5lcmQuc25hcHNob3R0ZXIudjEudGFyZGV2L2xheWVycyIKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zW2lfY291bnQgLSAyXSA9IiwgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDJdKQogICAgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDJdID09ICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQub3ZlcmxheS1ydyIKCiAgICBsb3dlcmRpciA6PSBjb25jYXQoIj0iLCBbImxvd2VyZGlyIiwgcF9zdG9yYWdlLm9wdGlvbnNbMF1dKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBsb3dlcmRpciA9IiwgbG93ZXJkaXIpCgogICAgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDFdID09IGxvd2VyZGlyCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zW2lfY291bnQgLSAxXSA9IiwgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDFdKQoKICAgIGV2ZXJ5IGksIHBvbGljeV9pZCBpbiBwb2xpY3lfaWRzIHsKICAgICAgICBhbGxvd19vdmVybGF5X2xheWVyKHBvbGljeV9pZCwgcG9saWN5X2hhc2hlc1tpXSwgaV9zdG9yYWdlLm9wdGlvbnNbaSArIDFdKQogICAgfQoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogdHJ1ZSIpCn0KYWxsb3dfc3RvcmFnZV9vcHRpb25zKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKSB7CiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDM6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCiAgICBjb3VudChwX3N0b3JhZ2Uub3B0aW9ucykgPT0gMQoKICAgIHN0YXJ0c3dpdGgocF9zdG9yYWdlLm9wdGlvbnNbMF0sICIkKGhhc2giKQogICAgaGFzaF9zdWZmaXggOj0gdHJpbV9sZWZ0KHBfc3RvcmFnZS5vcHRpb25zWzBdLCAiJChoYXNoIikKCiAgICBlbmRzd2l0aChoYXNoX3N1ZmZpeCwgIikiKQogICAgaGFzaF9pbmRleCA6PSB0cmltX3JpZ2h0KGhhc2hfc3VmZml4LCAiKSIpCiAgICBpIDo9IHRvX251bWJlcihoYXNoX2luZGV4KQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAzOiBpID0iLCBpKQoKICAgIGhhc2hfb3B0aW9uIDo9IGNvbmNhdCgiPSIsIFsiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LnJvb3QtaGFzaCIsIHJvb3RfaGFzaGVzW2ldXSkKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMzogaGFzaF9vcHRpb24gPSIsIGhhc2hfb3B0aW9uKQoKICAgIGNvdW50KGlfc3RvcmFnZS5vcHRpb25zKSA9PSA0CiAgICBpX3N0b3JhZ2Uub3B0aW9uc1swXSA9PSAicm8iCiAgICBpX3N0b3JhZ2Uub3B0aW9uc1sxXSA9PSAiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmJsb2NrX2RldmljZT1maWxlIgogICAgaV9zdG9yYWdlLm9wdGlvbnNbMl0gPT0gImlvLmthdGFjb250YWluZXJzLmZzLW9wdC5pcy1sYXllciIKICAgIGlfc3RvcmFnZS5vcHRpb25zWzNdID09IGhhc2hfb3B0aW9uCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAzOiB0cnVlIikKfQphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgNDogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gInNtYiIKICAgIHBfb3B0c19jb3VudCA6PSBjb3VudChwX3N0b3JhZ2Uub3B0aW9ucykKICAgIGlfb3B0c19jb3VudCA6PSBjb3VudChpX3N0b3JhZ2Uub3B0aW9ucykKICAgIGlfb3B0c19jb3VudCA9PSBwX29wdHNfY291bnQgKyAyCgogICAgaV9vcHRfbWF0Y2hlcyA6PSBbaSB8IGkgOj0gaWR4OyBpZHggPCBwX29wdHNfY291bnQ7IHBfc3RvcmFnZS5vcHRpb25zW2lkeF0gPT0gaV9zdG9yYWdlLm9wdGlvbnNbaWR4XV0KICAgIGNvdW50KGlfb3B0X21hdGNoZXMpID09IHBfb3B0c19jb3VudAoKICAgIHN0YXJ0c3dpdGgoaV9zdG9yYWdlLm9wdGlvbnNbaV9vcHRzX2NvdW50LTJdLCAiYWRkcj0iKQogICAgY3JlZHMgPSBzcGxpdChpX3N0b3JhZ2Uub3B0aW9uc1tpX29wdHNfY291bnQtMV0sICIsIikKICAgIGNvdW50KGNyZWRzKSA9PSAyCiAgICBzdGFydHN3aXRoKGNyZWRzWzBdLCAidXNlcm5hbWU9IikKICAgIHN0YXJ0c3dpdGgoY3JlZHNbMV0sICJwYXNzd29yZD0iKQogICAgCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDQ6IHRydWUiKQp9CgphbGxvd19vdmVybGF5X2xheWVyKHBvbGljeV9pZCwgcG9saWN5X2hhc2gsIGlfb3B0aW9uKSB7CiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogcG9saWN5X2lkID0iLCBwb2xpY3lfaWQsICJwb2xpY3lfaGFzaCA9IiwgcG9saWN5X2hhc2gpCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogaV9vcHRpb24gPSIsIGlfb3B0aW9uKQoKICAgIHN0YXJ0c3dpdGgoaV9vcHRpb24sICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQubGF5ZXI9IikKICAgIGlfdmFsdWUgOj0gcmVwbGFjZShpX29wdGlvbiwgImlvLmthdGFjb250YWluZXJzLmZzLW9wdC5sYXllcj0iLCAiIikKICAgIGlfdmFsdWVfZGVjb2RlZCA6PSBiYXNlNjQuZGVjb2RlKGlfdmFsdWUpCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogaV92YWx1ZV9kZWNvZGVkID0iLCBpX3ZhbHVlX2RlY29kZWQpCgogICAgcG9saWN5X3N1ZmZpeCA6PSBjb25jYXQoIj0iLCBbInRhcixybyxpby5rYXRhY29udGFpbmVycy5mcy1vcHQuYmxvY2tfZGV2aWNlPWZpbGUsaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmlzLWxheWVyLGlvLmthdGFjb250YWluZXJzLmZzLW9wdC5yb290LWhhc2giLCBwb2xpY3lfaGFzaF0pCiAgICBwX3ZhbHVlIDo9IGNvbmNhdCgiLCIsIFtwb2xpY3lfaWQsIHBvbGljeV9zdWZmaXhdKQogICAgcHJpbnQoImFsbG93X292ZXJsYXlfbGF5ZXI6IHBfdmFsdWUgPSIsIHBfdmFsdWUpCgogICAgcF92YWx1ZSA9PSBpX3ZhbHVlX2RlY29kZWQKCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogdHJ1ZSIpCn0KCmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAidGFyIgoKICAgIHN0YXJ0c3dpdGgocF9zdG9yYWdlLm1vdW50X3BvaW50LCAiJChsYXllciIpCiAgICBtb3VudF9zdWZmaXggOj0gdHJpbV9sZWZ0KHBfc3RvcmFnZS5tb3VudF9wb2ludCwgIiQobGF5ZXIiKQoKICAgIGVuZHN3aXRoKG1vdW50X3N1ZmZpeCwgIikiKQogICAgbGF5ZXJfaW5kZXggOj0gdHJpbV9yaWdodChtb3VudF9zdWZmaXgsICIpIikKICAgIGkgOj0gdG9fbnVtYmVyKGxheWVyX2luZGV4KQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDE6IGkgPSIsIGkpCgogICAgbGF5ZXJfaWQgOj0gbGF5ZXJfaWRzW2ldCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMTogbGF5ZXJfaWQgPSIsIGxheWVyX2lkKQoKICAgIHBfbW91bnQgOj0gY29uY2F0KCIvIiwgWyIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L2xheWVycyIsIGxheWVyX2lkXSkKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCAxOiBwX21vdW50ID0iLCBwX21vdW50KQoKICAgIHBfbW91bnQgPT0gaV9zdG9yYWdlLm1vdW50X3BvaW50CgogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDE6IHRydWUiKQp9CmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAiZnVzZTMua2F0YS1vdmVybGF5IgoKICAgIG1vdW50MSA6PSByZXBsYWNlKHBfc3RvcmFnZS5tb3VudF9wb2ludCwgIiQoY3BhdGgpIiwgcG9saWN5X2RhdGEuY29tbW9uLmNwYXRoKQogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDI6IG1vdW50MiA9IiwgbW91bnQyKQoKICAgIG1vdW50MiA9PSBpX3N0b3JhZ2UubW91bnRfcG9pbnQKCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMjogdHJ1ZSIpCn0KYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKSB7CiAgICBwX3N0b3JhZ2UuZnN0eXBlID09ICJsb2NhbCIKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQyID0iLCBtb3VudDIpCgogICAgbW91bnQzIDo9IHJlcGxhY2UobW91bnQyLCAiJChzYW5kYm94LWlkKSIsIHNhbmRib3hfaWQpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQzID0iLCBtb3VudDMpCgogICAgcmVnZXgubWF0Y2gobW91bnQzLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCgogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDM6IHRydWUiKQp9CmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAiYmluZCIKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNDogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNDogbW91bnQyID0iLCBtb3VudDIpCgogICAgbW91bnQzIDo9IHJlcGxhY2UobW91bnQyLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDQ6IG1vdW50MyA9IiwgbW91bnQzKQoKICAgIHJlZ2V4Lm1hdGNoKG1vdW50MywgaV9zdG9yYWdlLm1vdW50X3BvaW50KQoKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA0OiB0cnVlIikKfQphbGxvd19tb3VudF9wb2ludChwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgYnVuZGxlX2lkLCBzYW5kYm94X2lkLCBsYXllcl9pZHMpIHsKICAgIHBfc3RvcmFnZS5mc3R5cGUgPT0gInRtcGZzIgoKICAgIG1vdW50MSA6PSBwX3N0b3JhZ2UubW91bnRfcG9pbnQKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA1OiBtb3VudDEgPSIsIG1vdW50MSkKCiAgICByZWdleC5tYXRjaChtb3VudDEsIGlfc3RvcmFnZS5tb3VudF9wb2ludCkKCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNTogdHJ1ZSIpCn0KYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKSB7CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogaV9zdG9yYWdlLm1vdW50X3BvaW50ID0iLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCiAgICBhbGxvd19kaXJlY3Rfdm9sX2RyaXZlcihwX3N0b3JhZ2UsIGlfc3RvcmFnZSkKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChzcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQyID0iLCBtb3VudDIpCgogICAgZGlyZWN0X3ZvbF9wYXRoIDo9IGlfc3RvcmFnZS5zb3VyY2UKICAgIG1vdW50MyA6PSByZXBsYWNlKG1vdW50MiwgIiQoYjY0LWRpcmVjdC12b2wtcGF0aCkiLCBiYXNlNjR1cmwuZW5jb2RlKGRpcmVjdF92b2xfcGF0aCkpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQzID0iLCBtb3VudDMpCgogICAgbW91bnQzID09IGlfc3RvcmFnZS5tb3VudF9wb2ludAoKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA2OiB0cnVlIikKfQoKYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIocF9zdG9yYWdlLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19kaXJlY3Rfdm9sX2RyaXZlciAxOiBzdGFydCIpCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCiAgICBwcmludCgiYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIgMTogdHJ1ZSIpCn0KYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIocF9zdG9yYWdlLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19kaXJlY3Rfdm9sX2RyaXZlciAyOiBzdGFydCIpCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJzbWIiCiAgICBwcmludCgiYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIgMjogdHJ1ZSIpCn0KCiMgRXhlY1Byb2Nlc3NSZXF1ZXN0LnByb2Nlc3MuQ2FwYWJpbGl0aWVzCmFsbG93X2V4ZWNfY2FwcyhpX2NhcHMpIHsKICAgIG5vdCBpX2NhcHMuQW1iaWVudAogICAgbm90IGlfY2Fwcy5Cb3VuZGluZwogICAgbm90IGlfY2Fwcy5FZmZlY3RpdmUKICAgIG5vdCBpX2NhcHMuSW5oZXJpdGFibGUKICAgIG5vdCBpX2NhcHMuUGVybWl0dGVkCn0KCiMgT0NJLlByb2Nlc3MuQ2FwYWJpbGl0aWVzCmFsbG93X2NhcHMocF9jYXBzLCBpX2NhcHMpIHsKICAgIHByaW50KCJhbGxvd19jYXBzOiBwb2xpY3kgQW1iaWVudCA9IiwgcF9jYXBzLkFtYmllbnQpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgQW1iaWVudCA9IiwgaV9jYXBzLkFtYmllbnQpCiAgICBtYXRjaF9jYXBzKHBfY2Fwcy5BbWJpZW50LCBpX2NhcHMuQW1iaWVudCkKCiAgICBwcmludCgiYWxsb3dfY2FwczogcG9saWN5IEJvdW5kaW5nID0iLCBwX2NhcHMuQm91bmRpbmcpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgQm91bmRpbmcgPSIsIGlfY2Fwcy5Cb3VuZGluZykKICAgIG1hdGNoX2NhcHMocF9jYXBzLkJvdW5kaW5nLCBpX2NhcHMuQm91bmRpbmcpCgogICAgcHJpbnQoImFsbG93X2NhcHM6IHBvbGljeSBFZmZlY3RpdmUgPSIsIHBfY2Fwcy5FZmZlY3RpdmUpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgRWZmZWN0aXZlID0iLCBpX2NhcHMuRWZmZWN0aXZlKQogICAgbWF0Y2hfY2FwcyhwX2NhcHMuRWZmZWN0aXZlLCBpX2NhcHMuRWZmZWN0aXZlKQoKICAgIHByaW50KCJhbGxvd19jYXBzOiBwb2xpY3kgSW5oZXJpdGFibGUgPSIsIHBfY2Fwcy5Jbmhlcml0YWJsZSkKICAgIHByaW50KCJhbGxvd19jYXBzOiBpbnB1dCBJbmhlcml0YWJsZSA9IiwgaV9jYXBzLkluaGVyaXRhYmxlKQogICAgbWF0Y2hfY2FwcyhwX2NhcHMuSW5oZXJpdGFibGUsIGlfY2Fwcy5Jbmhlcml0YWJsZSkKCiAgICBwcmludCgiYWxsb3dfY2FwczogcG9saWN5IFBlcm1pdHRlZCA9IiwgcF9jYXBzLlBlcm1pdHRlZCkKICAgIHByaW50KCJhbGxvd19jYXBzOiBpbnB1dCBQZXJtaXR0ZWQgPSIsIGlfY2Fwcy5QZXJtaXR0ZWQpCiAgICBtYXRjaF9jYXBzKHBfY2Fwcy5QZXJtaXR0ZWQsIGlfY2Fwcy5QZXJtaXR0ZWQpCn0KCm1hdGNoX2NhcHMocF9jYXBzLCBpX2NhcHMpIHsKICAgIHByaW50KCJtYXRjaF9jYXBzIDE6IHN0YXJ0IikKCiAgICBwX2NhcHMgPT0gaV9jYXBzCgogICAgcHJpbnQoIm1hdGNoX2NhcHMgMTogdHJ1ZSIpCn0KbWF0Y2hfY2FwcyhwX2NhcHMsIGlfY2FwcykgewogICAgcHJpbnQoIm1hdGNoX2NhcHMgMjogc3RhcnQiKQoKICAgIGNvdW50KHBfY2FwcykgPT0gMQogICAgcF9jYXBzWzBdID09ICIkKGRlZmF1bHRfY2FwcykiCgogICAgcHJpbnQoIm1hdGNoX2NhcHMgMjogZGVmYXVsdF9jYXBzID0iLCBwb2xpY3lfZGF0YS5jb21tb24uZGVmYXVsdF9jYXBzKQogICAgcG9saWN5X2RhdGEuY29tbW9uLmRlZmF1bHRfY2FwcyA9PSBpX2NhcHMKCiAgICBwcmludCgibWF0Y2hfY2FwcyAyOiB0cnVlIikKfQptYXRjaF9jYXBzKHBfY2FwcywgaV9jYXBzKSB7CiAgICBwcmludCgibWF0Y2hfY2FwcyAzOiBzdGFydCIpCgogICAgY291bnQocF9jYXBzKSA9PSAxCiAgICBwX2NhcHNbMF0gPT0gIiQocHJpdmlsZWdlZF9jYXBzKSIKCiAgICBwcmludCgibWF0Y2hfY2FwcyAzOiBwcml2aWxlZ2VkX2NhcHMgPSIsIHBvbGljeV9kYXRhLmNvbW1vbi5wcml2aWxlZ2VkX2NhcHMpCiAgICBwb2xpY3lfZGF0YS5jb21tb24ucHJpdmlsZWdlZF9jYXBzID09IGlfY2FwcwoKICAgIHByaW50KCJtYXRjaF9jYXBzIDM6IHRydWUiKQp9CgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgpjaGVja19kaXJlY3RvcnlfdHJhdmVyc2FsKGlfcGF0aCkgewogICAgbm90IHJlZ2V4Lm1hdGNoKCIoXnwvKS4uKCR8LykiLCBpX3BhdGgpCn0KCmNoZWNrX3N5bWxpbmtfc291cmNlKGlfc3JjKSB7CiAgICBpX3NyYyA9PSAiIgogICAgcHJpbnQoImNoZWNrX3N5bWxpbmtfc291cmNlIDE6IHRydWUiKQp9CmNoZWNrX3N5bWxpbmtfc291cmNlKGlfc3JjKSB7CiAgICBpX3NyYyAhPSAiIgogICAgcHJpbnQoImNoZWNrX3N5bWxpbmtfc291cmNlIDI6IGlfc3JjID0iLCBpX3NyYykKCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24uc19zb3VyY2UxLCBpX3NyYykKCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMjogdHJ1ZSIpCn0KY2hlY2tfc3ltbGlua19zb3VyY2UoaV9zcmMpIHsKICAgIGlfc3JjICE9ICIiCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMzogaV9zcmMgPSIsIGlfc3JjKQoKICAgIHJlZ2V4Lm1hdGNoKHBvbGljeV9kYXRhLmNvbW1vbi5zX3NvdXJjZTIsIGlfc3JjKQogICAgY2hlY2tfZGlyZWN0b3J5X3RyYXZlcnNhbChpX3NyYykKCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMzogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfc3RvcmFnZXMoaV9zdG9yYWdlcykgewogICAgcHJpbnQoImFsbG93X3NhbmRib3hfc3RvcmFnZXM6IGlfc3RvcmFnZXMgPSIsIGlfc3RvcmFnZXMpCgogICAgcF9zdG9yYWdlcyA6PSBwb2xpY3lfZGF0YS5zYW5kYm94LnN0b3JhZ2VzCiAgICBldmVyeSBpX3N0b3JhZ2UgaW4gaV9zdG9yYWdlcyB7CiAgICAgICAgYWxsb3dfc2FuZGJveF9zdG9yYWdlKHBfc3RvcmFnZXMsIGlfc3RvcmFnZSkKICAgIH0KCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9zdG9yYWdlczogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfc3RvcmFnZShwX3N0b3JhZ2VzLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IGlfc3RvcmFnZSA9IiwgaV9zdG9yYWdlKQoKICAgIHNvbWUgcF9zdG9yYWdlIGluIHBfc3RvcmFnZXMKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IHBfc3RvcmFnZSA9IiwgcF9zdG9yYWdlKQogICAgaV9zdG9yYWdlID09IHBfc3RvcmFnZQoKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IHRydWUiKQp9CgpDb3B5RmlsZVJlcXVlc3QgewogICAgcHJpbnQoIkNvcHlGaWxlUmVxdWVzdDogaW5wdXQucGF0aCA9IiwgaW5wdXQucGF0aCkKCiAgICBjaGVja19zeW1saW5rX3NvdXJjZShpbnB1dC5zeW1saW5rX3NyYykKICAgIGNoZWNrX2RpcmVjdG9yeV90cmF2ZXJzYWwoaW5wdXQucGF0aCkKCiAgICBzb21lIHJlZ2V4MSBpbiBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLkNvcHlGaWxlUmVxdWVzdAogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5jcGF0aCkKICAgIHJlZ2V4NCA6PSByZXBsYWNlKHJlZ2V4MywgIiQoYnVuZGxlLWlkKSIsIEJVTkRMRV9JRCkKICAgIHByaW50KCJDb3B5RmlsZVJlcXVlc3Q6IHJlZ2V4NCA9IiwgcmVnZXg0KQoKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4NCwgaW5wdXQucGF0aCkKCiAgICBwcmludCgiQ29weUZpbGVSZXF1ZXN0OiB0cnVlIikKfQoKQ3JlYXRlU2FuZGJveFJlcXVlc3QgewogICAgcHJpbnQoIkNyZWF0ZVNhbmRib3hSZXF1ZXN0OiBpbnB1dC5ndWVzdF9ob29rX3BhdGggPSIsIGlucHV0Lmd1ZXN0X2hvb2tfcGF0aCkKICAgIGNvdW50KGlucHV0Lmd1ZXN0X2hvb2tfcGF0aCkgPT0gMAoKICAgIHByaW50KCJDcmVhdGVTYW5kYm94UmVxdWVzdDogaW5wdXQua2VybmVsX21vZHVsZXMgPSIsIGlucHV0Lmtlcm5lbF9tb2R1bGVzKQogICAgY291bnQoaW5wdXQua2VybmVsX21vZHVsZXMpID09IDAKCiAgICBpX3BpZG5zIDo9IGlucHV0LnNhbmRib3hfcGlkbnMKICAgIHByaW50KCJDcmVhdGVTYW5kYm94UmVxdWVzdDogaV9waWRucyA9IiwgaV9waWRucykKICAgIGlfcGlkbnMgPT0gZmFsc2UKICAgIGFsbG93X3NhbmRib3hfc3RvcmFnZXMoaW5wdXQuc3RvcmFnZXMpCn0KCmFsbG93X2V4ZWMocF9jb250YWluZXIsIGlfcHJvY2VzcykgewogICAgcHJpbnQoImFsbG93X2V4ZWM6IHN0YXJ0IikKCiAgICBwX29jaSA9IHBfY29udGFpbmVyLk9DSQogICAgcF9zX25hbWUgPSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc19uYW1lc3BhY2UgPSBnZXRfc3RhdGVfdmFsKCJuYW1lc3BhY2UiKQogICAgYWxsb3dfcHJvYmVfcHJvY2VzcyhwX29jaS5Qcm9jZXNzLCBpX3Byb2Nlc3MsIHBfc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfZXhlYzogdHJ1ZSIpCn0KCmFsbG93X2ludGVyYWN0aXZlX2V4ZWMocF9jb250YWluZXIsIGlfcHJvY2VzcykgewogICAgcHJpbnQoImFsbG93X2ludGVyYWN0aXZlX2V4ZWM6IHN0YXJ0IikKCiAgICBwX29jaSA9IHBfY29udGFpbmVyLk9DSQogICAgcF9zX25hbWUgPSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc19uYW1lc3BhY2UgPSBnZXRfc3RhdGVfdmFsKCJuYW1lc3BhY2UiKQogICAgYWxsb3dfaW50ZXJhY3RpdmVfcHJvY2VzcyhwX29jaS5Qcm9jZXNzLCBpX3Byb2Nlc3MsIHBfc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfaW50ZXJhY3RpdmVfZXhlYzogdHJ1ZSIpCn0KCiMgVE9ETzogc2hvdWxkIG90aGVyIEV4ZWNQcm9jZXNzUmVxdWVzdCBpbnB1dCBkYXRhIGZpZWxkcyBiZSB2YWxpZGF0ZWQgYXMgd2VsbD8KRXhlY1Byb2Nlc3NSZXF1ZXN0IHsKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMTogaW5wdXQgPSIsIGlucHV0KQoKICAgIHNvbWUgcF9jb21tYW5kIGluIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuRXhlY1Byb2Nlc3NSZXF1ZXN0LmFsbG93ZWRfY29tbWFuZHMKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMTogcF9jb21tYW5kID0iLCBwX2NvbW1hbmQpCiAgICBwX2NvbW1hbmQgPT0gaW5wdXQucHJvY2Vzcy5BcmdzCgogICAgIyBUT0RPOiBtYXRjaCBwX2NvbnRhaW5lcidzIElEIHdpdGggdGhlIGlucHV0IGNvbnRhaW5lcl9pZC4KICAgIHNvbWUgcF9jb250YWluZXIgaW4gcG9saWN5X2RhdGEuY29udGFpbmVycwogICAgYWxsb3dfaW50ZXJhY3RpdmVfZXhlYyhwX2NvbnRhaW5lciwgaW5wdXQucHJvY2VzcykKCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDE6IHRydWUiKQp9CkV4ZWNQcm9jZXNzUmVxdWVzdCB7CiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDI6IGlucHV0ID0iLCBpbnB1dCkKCiAgICAjIFRPRE86IG1hdGNoIGlucHV0IGNvbnRhaW5lciBJRCB3aXRoIGl0cyBjb3JyZXNwb25kaW5nIGNvbnRhaW5lci5leGVjX2NvbW1hbmRzLgogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBzb21lIHBfY29tbWFuZCBpbiBwX2NvbnRhaW5lci5leGVjX2NvbW1hbmRzCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDI6IHBfY29tbWFuZCA9IiwgcF9jb21tYW5kKQoKICAgICMgVE9ETzogc2hvdWxkIG90aGVyIGlucHV0IGRhdGEgZmllbGRzIGJlIHZhbGlkYXRlZCBhcyB3ZWxsPwogICAgcF9jb21tYW5kID09IGlucHV0LnByb2Nlc3MuQXJncwoKICAgIGFsbG93X2V4ZWMocF9jb250YWluZXIsIGlucHV0LnByb2Nlc3MpCgogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAyOiB0cnVlIikKfQpFeGVjUHJvY2Vzc1JlcXVlc3QgewogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAzOiBpbnB1dCA9IiwgaW5wdXQpCgogICAgaV9jb21tYW5kID0gY29uY2F0KCIgIiwgaW5wdXQucHJvY2Vzcy5BcmdzKQogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAzOiBpX2NvbW1hbmQgPSIsIGlfY29tbWFuZCkKCiAgICBzb21lIHBfcmVnZXggaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5FeGVjUHJvY2Vzc1JlcXVlc3QucmVnZXgKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMzogcF9yZWdleCA9IiwgcF9yZWdleCkKCiAgICByZWdleC5tYXRjaChwX3JlZ2V4LCBpX2NvbW1hbmQpCgogICAgIyBUT0RPOiBtYXRjaCBwX2NvbnRhaW5lcidzIElEIHdpdGggdGhlIGlucHV0IGNvbnRhaW5lcl9pZC4KICAgIHNvbWUgcF9jb250YWluZXIgaW4gcG9saWN5X2RhdGEuY29udGFpbmVycwogICAgYWxsb3dfaW50ZXJhY3RpdmVfZXhlYyhwX2NvbnRhaW5lciwgaW5wdXQucHJvY2VzcykKCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDM6IHRydWUiKQp9CgpVcGRhdGVSb3V0ZXNSZXF1ZXN0IHsKICAgIHByaW50KCJVcGRhdGVSb3V0ZXNSZXF1ZXN0OiBpbnB1dCA9IiwgaW5wdXQpCiAgICBwcmludCgiVXBkYXRlUm91dGVzUmVxdWVzdDogcG9saWN5ID0iLCBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLlVwZGF0ZVJvdXRlc1JlcXVlc3QpCgogICAgaV9yb3V0ZXMgOj0gaW5wdXQucm91dGVzLlJvdXRlcwogICAgcF9zb3VyY2VfcmVnZXggPSBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLlVwZGF0ZVJvdXRlc1JlcXVlc3QuZm9yYmlkZGVuX3NvdXJjZV9yZWdleAogICAgcF9uYW1lcyA9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuVXBkYXRlUm91dGVzUmVxdWVzdC5mb3JiaWRkZW5fZGV2aWNlX25hbWVzCgogICAgZXZlcnkgaV9yb3V0ZSBpbiBpX3JvdXRlcyB7CiAgICAgICAgcHJpbnQoImlfcm91dGUuc291cmNlID0iLCBpX3JvdXRlLnNvdXJjZSkKICAgICAgICBldmVyeSBwX3JlZ2V4IGluIHBfc291cmNlX3JlZ2V4IHsKICAgICAgICAgICAgcHJpbnQoInBfcmVnZXggPSIsIHBfcmVnZXgpCiAgICAgICAgICAgIG5vdCByZWdleC5tYXRjaChwX3JlZ2V4LCBpX3JvdXRlLnNvdXJjZSkKICAgICAgICB9CgogICAgICAgIHByaW50KCJpX3JvdXRlLmRldmljZSA9IiwgaV9yb3V0ZS5kZXZpY2UpCiAgICAgICAgbm90IGlfcm91dGUuZGV2aWNlIGluIHBfbmFtZXMKICAgIH0KCiAgICBwcmludCgiVXBkYXRlUm91dGVzUmVxdWVzdDogdHJ1ZSIpCn0KClVwZGF0ZUludGVyZmFjZVJlcXVlc3QgewogICAgcHJpbnQoIlVwZGF0ZUludGVyZmFjZVJlcXVlc3Q6IGlucHV0ID0iLCBpbnB1dCkKICAgIHByaW50KCJVcGRhdGVJbnRlcmZhY2VSZXF1ZXN0OiBwb2xpY3kgPSIsIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuVXBkYXRlSW50ZXJmYWNlUmVxdWVzdCkKCiAgICBpX2ludGVyZmFjZSA6PSBpbnB1dC5pbnRlcmZhY2UKICAgIHBfZmxhZ3MgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmFsbG93X3Jhd19mbGFncwoKICAgICMgVHlwaWNhbGx5LCBqdXN0IElGRl9OT0FSUCBpcyB1c2VkLgogICAgYml0cy5hbmQoaV9pbnRlcmZhY2UucmF3X2ZsYWdzLCBiaXRzLm5lZ2F0ZShwX2ZsYWdzKSkgPT0gMAoKICAgIHBfbmFtZXMgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmZvcmJpZGRlbl9uYW1lcwoKICAgIG5vdCBpX2ludGVyZmFjZS5uYW1lIGluIHBfbmFtZXMKCiAgICBwX2h3YWRkcnMgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmZvcmJpZGRlbl9od19hZGRycwoKICAgIG5vdCBpX2ludGVyZmFjZS5od0FkZHIgaW4gcF9od2FkZHJzCgogICAgcHJpbnQoIlVwZGF0ZUludGVyZmFjZVJlcXVlc3Q6IHRydWUiKQp9CgpDbG9zZVN0ZGluUmVxdWVzdCB7CiAgICBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLkNsb3NlU3RkaW5SZXF1ZXN0ID09IHRydWUKfQoKUmVhZFN0cmVhbVJlcXVlc3QgewogICAgcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5SZWFkU3RyZWFtUmVxdWVzdCA9PSB0cnVlCn0KClVwZGF0ZUVwaGVtZXJhbE1vdW50c1JlcXVlc3QgewogICAgcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVFcGhlbWVyYWxNb3VudHNSZXF1ZXN0ID09IHRydWUKfQoKV3JpdGVTdHJlYW1SZXF1ZXN0IHsKICAgIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuV3JpdGVTdHJlYW1SZXF1ZXN0ID09IHRydWUKfQoKcG9saWN5X2RhdGEgOj0gewogICJjb250YWluZXJzIjogWwogICAgewogICAgICAiT0NJIjogewogICAgICAgICJWZXJzaW9uIjogIjEuMS4wLXJjLjEiLAogICAgICAgICJQcm9jZXNzIjogewogICAgICAgICAgIlRlcm1pbmFsIjogZmFsc2UsCiAgICAgICAgICAiVXNlciI6IHsKICAgICAgICAgICAgIlVJRCI6IDY1NTM1LAogICAgICAgICAgICAiR0lEIjogNjU1MzUsCiAgICAgICAgICAgICJBZGRpdGlvbmFsR2lkcyI6IFtdLAogICAgICAgICAgICAiVXNlcm5hbWUiOiAiIgogICAgICAgICAgfSwKICAgICAgICAgICJEZXByZWNhdGVkQXJncyI6IFsKICAgICAgICAgICAgIi9wYXVzZSIKICAgICAgICAgIF0sCiAgICAgICAgICAiQXJncyI6IFsKICAgICAgICAgICAgIi9wYXVzZSIKICAgICAgICAgIF0sCiAgICAgICAgICAiRW52IjogWwogICAgICAgICAgICAiUEFUSD0vdXNyL2xvY2FsL3NiaW46L3Vzci9sb2NhbC9iaW46L3Vzci9zYmluOi91c3IvYmluOi9zYmluOi9iaW4iCiAgICAgICAgICBdLAogICAgICAgICAgIkN3ZCI6ICIvIiwKICAgICAgICAgICJDYXBhYmlsaXRpZXMiOiB7CiAgICAgICAgICAgICJBbWJpZW50IjogW10sCiAgICAgICAgICAgICJCb3VuZGluZyI6IFsKICAgICAgICAgICAgICAiJChkZWZhdWx0X2NhcHMpIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiRWZmZWN0aXZlIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJJbmhlcml0YWJsZSI6IFtdLAogICAgICAgICAgICAiUGVybWl0dGVkIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICAiTm9OZXdQcml2aWxlZ2VzIjogdHJ1ZQogICAgICAgIH0sCiAgICAgICAgIlJvb3QiOiB7CiAgICAgICAgICAiUGF0aCI6ICIkKGNwYXRoKS8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgIlJlYWRvbmx5IjogdHJ1ZQogICAgICAgIH0sCiAgICAgICAgIk1vdW50cyI6IFsKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9wcm9jIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJwcm9jIiwKICAgICAgICAgICAgInR5cGVfIjogInByb2MiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2IiwKICAgICAgICAgICAgInNvdXJjZSI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJzdHJpY3RhdGltZSIsCiAgICAgICAgICAgICAgIm1vZGU9NzU1IiwKICAgICAgICAgICAgICAic2l6ZT02NTUzNmsiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L3B0cyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiZGV2cHRzIiwKICAgICAgICAgICAgInR5cGVfIjogImRldnB0cyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJuZXdpbnN0YW5jZSIsCiAgICAgICAgICAgICAgInB0bXhtb2RlPTA2NjYiLAogICAgICAgICAgICAgICJtb2RlPTA2MjAiLAogICAgICAgICAgICAgICJnaWQ9NSIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvc2htIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L3NobSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi9tcXVldWUiLAogICAgICAgICAgICAic291cmNlIjogIm1xdWV1ZSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJtcXVldWUiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvc3lzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJzeXNmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJzeXNmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2V0Yy9yZXNvbHYuY29uZiIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClyZXNvbHYuY29uZiQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJvIiwKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9kZXYiLAogICAgICAgICAgICAgICJub2V4ZWMiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0KICAgICAgICBdLAogICAgICAgICJBbm5vdGF0aW9ucyI6IHsKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmJ1bmRsZV9wYXRoIjogIi9ydW4vY29udGFpbmVyZC9pby5jb250YWluZXJkLnJ1bnRpbWUudjIudGFzay9rOHMuaW8vJChidW5kbGUtaWQpIiwKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIjogInBvZF9zYW5kYm94IiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSI6ICJzYW5kYm94IiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWlkIjogIl5bYS16MC05XXs2NH0kIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWxvZy1kaXJlY3RvcnkiOiAiXi92YXIvbG9nL3BvZHMvJChzYW5kYm94LW5hbWVzcGFjZSlfJChzYW5kYm94LW5hbWUpX1swLTlhLWZdezh9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezEyfSQiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZXNwYWNlIjogIiIsCiAgICAgICAgICAibmVyZGN0bC9uZXR3b3JrLW5hbWVzcGFjZSI6ICJeL3Zhci9ydW4vbmV0bnMvY25pLVswLTlhLWZdezh9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezEyfSQiCiAgICAgICAgfSwKICAgICAgICAiTGludXgiOiB7CiAgICAgICAgICAiTmFtZXNwYWNlcyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICJUeXBlIjogImlwYyIsCiAgICAgICAgICAgICAgIlBhdGgiOiAiIgogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgIlR5cGUiOiAidXRzIiwKICAgICAgICAgICAgICAiUGF0aCI6ICIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiVHlwZSI6ICJtb3VudCIsCiAgICAgICAgICAgICAgIlBhdGgiOiAiIgogICAgICAgICAgICB9CiAgICAgICAgICBdLAogICAgICAgICAgIk1hc2tlZFBhdGhzIjogWwogICAgICAgICAgICAiL3Byb2MvYWNwaSIsCiAgICAgICAgICAgICIvcHJvYy9hc291bmQiLAogICAgICAgICAgICAiL3Byb2Mva2NvcmUiLAogICAgICAgICAgICAiL3Byb2Mva2V5cyIsCiAgICAgICAgICAgICIvcHJvYy9sYXRlbmN5X3N0YXRzIiwKICAgICAgICAgICAgIi9wcm9jL3RpbWVyX2xpc3QiLAogICAgICAgICAgICAiL3Byb2MvdGltZXJfc3RhdHMiLAogICAgICAgICAgICAiL3Byb2Mvc2NoZWRfZGVidWciLAogICAgICAgICAgICAiL3N5cy9maXJtd2FyZSIsCiAgICAgICAgICAgICIvcHJvYy9zY3NpIgogICAgICAgICAgXSwKICAgICAgICAgICJSZWFkb25seVBhdGhzIjogWwogICAgICAgICAgICAiL3Byb2MvYnVzIiwKICAgICAgICAgICAgIi9wcm9jL2ZzIiwKICAgICAgICAgICAgIi9wcm9jL2lycSIsCiAgICAgICAgICAgICIvcHJvYy9zeXMiLAogICAgICAgICAgICAiL3Byb2Mvc3lzcnEtdHJpZ2dlciIKICAgICAgICAgIF0sCiAgICAgICAgICAiRGV2aWNlcyI6IFtdLAogICAgICAgICAgIlN5c2N0bCI6IHsKICAgICAgICAgICAgIm5ldC5pcHY0LmlwX3VucHJpdmlsZWdlZF9wb3J0X3N0YXJ0IjogIjAiLAogICAgICAgICAgICAibmV0LmlwdjQucGluZ19ncm91cF9yYW5nZSI6ICIwIDIxNDc0ODM2NDciCiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9LAogICAgICAic3RvcmFnZXMiOiBbCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJibGsiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogInRhciIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIiQoaGFzaDApIgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGxheWVyMCkiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJvdmVybGF5ZnMiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogImZ1c2UzLmthdGEtb3ZlcmxheSIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIjVhNWFhZDgwMDU1ZmYyMDAxMmE1MGRjMjVmOGRmN2EyOTkyNDQ3NDMyNGQ2NWY3ZDUzMDZlZThlZTI3ZmY3MWQiLAogICAgICAgICAgICAiODE3MjUwZjFhM2UzMzZkYTc2ZjViZDNmYTc4NGUxYjI2ZDk1OWI5YzEzMTg3NjgxNWJhMjYwNDA0OGI3MGMxOCIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChjcGF0aCkvJChidW5kbGUtaWQpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9CiAgICAgIF0sCiAgICAgICJkZXZpY2VzIjogW10sCiAgICAgICJzYW5kYm94X3BpZG5zIjogZmFsc2UsCiAgICAgICJleGVjX2NvbW1hbmRzIjogW10sCiAgICAgICJlbnZfbWFwIjogewogICAgICAgICJQQVRIIjogIi91c3IvbG9jYWwvc2JpbjovdXNyL2xvY2FsL2JpbjovdXNyL3NiaW46L3Vzci9iaW46L3NiaW46L2JpbiIKICAgICAgfQogICAgfSwKICAgIHsKICAgICAgIk9DSSI6IHsKICAgICAgICAiVmVyc2lvbiI6ICIxLjEuMC1yYy4xIiwKICAgICAgICAiUHJvY2VzcyI6IHsKICAgICAgICAgICJUZXJtaW5hbCI6IGZhbHNlLAogICAgICAgICAgIlVzZXIiOiB7CiAgICAgICAgICAgICJVSUQiOiAwLAogICAgICAgICAgICAiR0lEIjogMCwKICAgICAgICAgICAgIkFkZGl0aW9uYWxHaWRzIjogW10sCiAgICAgICAgICAgICJVc2VybmFtZSI6ICIiCiAgICAgICAgICB9LAogICAgICAgICAgIkRlcHJlY2F0ZWRBcmdzIjogWwogICAgICAgICAgICAiL2Fnbmhvc3QiLAogICAgICAgICAgICAibmV0ZXhlYyIsCiAgICAgICAgICAgICItLWh0dHAtcG9ydD04MDgwIiwKICAgICAgICAgICAgIi0tdGxzLWNlcnQtZmlsZT0vbG9jYWxob3N0LmNydCIsCiAgICAgICAgICAgICItLXRscy1wcml2YXRlLWtleS1maWxlPS9sb2NhbGhvc3Qua2V5IgogICAgICAgICAgXSwKICAgICAgICAgICJBcmdzIjogWwogICAgICAgICAgICAiL2Fnbmhvc3QiLAogICAgICAgICAgICAibmV0ZXhlYyIsCiAgICAgICAgICAgICItLWh0dHAtcG9ydD04MDgwIiwKICAgICAgICAgICAgIi0tdGxzLWNlcnQtZmlsZT0vbG9jYWxob3N0LmNydCIsCiAgICAgICAgICAgICItLXRscy1wcml2YXRlLWtleS1maWxlPS9sb2NhbGhvc3Qua2V5IgogICAgICAgICAgXSwKICAgICAgICAgICJFbnYiOiBbCiAgICAgICAgICAgICJQQVRIPS91c3IvbG9jYWwvc2JpbjovdXNyL2xvY2FsL2JpbjovdXNyL3NiaW46L3Vzci9iaW46L3NiaW46L2JpbiIsCiAgICAgICAgICAgICJIT1NUTkFNRT0kKGhvc3QtbmFtZSkiCiAgICAgICAgICBdLAogICAgICAgICAgIkN3ZCI6ICIvIiwKICAgICAgICAgICJDYXBhYmlsaXRpZXMiOiB7CiAgICAgICAgICAgICJBbWJpZW50IjogW10sCiAgICAgICAgICAgICJCb3VuZGluZyI6IFsKICAgICAgICAgICAgICAiJChkZWZhdWx0X2NhcHMpIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiRWZmZWN0aXZlIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJJbmhlcml0YWJsZSI6IFtdLAogICAgICAgICAgICAiUGVybWl0dGVkIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICAiTm9OZXdQcml2aWxlZ2VzIjogZmFsc2UKICAgICAgICB9LAogICAgICAgICJSb290IjogewogICAgICAgICAgIlBhdGgiOiAiJChjcGF0aCkvJChidW5kbGUtaWQpIiwKICAgICAgICAgICJSZWFkb25seSI6IGZhbHNlCiAgICAgICAgfSwKICAgICAgICAiTW91bnRzIjogWwogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL3Byb2MiLAogICAgICAgICAgICAic291cmNlIjogInByb2MiLAogICAgICAgICAgICAidHlwZV8iOiAicHJvYyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYiLAogICAgICAgICAgICAic291cmNlIjogInRtcGZzIiwKICAgICAgICAgICAgInR5cGVfIjogInRtcGZzIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgInN0cmljdGF0aW1lIiwKICAgICAgICAgICAgICAibW9kZT03NTUiLAogICAgICAgICAgICAgICJzaXplPTY1NTM2ayIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvcHRzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJkZXZwdHMiLAogICAgICAgICAgICAidHlwZV8iOiAiZGV2cHRzIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAgICAgIm5ld2luc3RhbmNlIiwKICAgICAgICAgICAgICAicHRteG1vZGU9MDY2NiIsCiAgICAgICAgICAgICAgIm1vZGU9MDYyMCIsCiAgICAgICAgICAgICAgImdpZD01IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi9zaG0iLAogICAgICAgICAgICAic291cmNlIjogIi9ydW4va2F0YS1jb250YWluZXJzL3NhbmRib3gvc2htIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L21xdWV1ZSIsCiAgICAgICAgICAgICJzb3VyY2UiOiAibXF1ZXVlIiwKICAgICAgICAgICAgInR5cGVfIjogIm1xdWV1ZSIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9zeXMiLAogICAgICAgICAgICAic291cmNlIjogInN5c2ZzIiwKICAgICAgICAgICAgInR5cGVfIjogInN5c2ZzIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAgICAgIm5vZGV2IiwKICAgICAgICAgICAgICAicm8iCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvc3lzL2ZzL2Nncm91cCIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiY2dyb3VwIiwKICAgICAgICAgICAgInR5cGVfIjogImNncm91cCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIsCiAgICAgICAgICAgICAgInJlbGF0aW1lIiwKICAgICAgICAgICAgICAicm8iCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZXRjL2hvc3RzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KWhvc3RzJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJydyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvdGVybWluYXRpb24tbG9nIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KXRlcm1pbmF0aW9uLWxvZyQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicnciCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZXRjL2hvc3RuYW1lIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KWhvc3RuYW1lJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJydyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9ldGMvcmVzb2x2LmNvbmYiLAogICAgICAgICAgICAic291cmNlIjogIiQoc2ZwcmVmaXgpcmVzb2x2LmNvbmYkIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJ3IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL3Zhci9ydW4vc2VjcmV0cy9rdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50IiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KXNlcnZpY2VhY2NvdW50JCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJybyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi92YXIvcnVuL3NlY3JldHMvYXp1cmUvdG9rZW5zIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KXRva2VucyQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicm8iCiAgICAgICAgICAgIF0KICAgICAgICAgIH0KICAgICAgICBdLAogICAgICAgICJBbm5vdGF0aW9ucyI6IHsKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmJ1bmRsZV9wYXRoIjogIi9ydW4vY29udGFpbmVyZC9pby5jb250YWluZXJkLnJ1bnRpbWUudjIudGFzay9rOHMuaW8vJChidW5kbGUtaWQpIiwKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIjogInBvZF9jb250YWluZXIiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLmNvbnRhaW5lci1uYW1lIjogImVjaG9oZWFkZXJzLWh0dHBzIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSI6ICJjb250YWluZXIiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLmltYWdlLW5hbWUiOiAicmVnaXN0cnkuazhzLmlvL2UyZS10ZXN0LWltYWdlcy9hZ25ob3N0OjIuNDAiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtaWQiOiAiXlthLXowLTldezY0fSQiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZXNwYWNlIjogIiIKICAgICAgICB9LAogICAgICAgICJMaW51eCI6IHsKICAgICAgICAgICJOYW1lc3BhY2VzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgIlR5cGUiOiAiaXBjIiwKICAgICAgICAgICAgICAiUGF0aCI6ICIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiVHlwZSI6ICJ1dHMiLAogICAgICAgICAgICAgICJQYXRoIjogIiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJUeXBlIjogIm1vdW50IiwKICAgICAgICAgICAgICAiUGF0aCI6ICIiCiAgICAgICAgICAgIH0KICAgICAgICAgIF0sCiAgICAgICAgICAiTWFza2VkUGF0aHMiOiBbCiAgICAgICAgICAgICIvcHJvYy9hY3BpIiwKICAgICAgICAgICAgIi9wcm9jL2tjb3JlIiwKICAgICAgICAgICAgIi9wcm9jL2tleXMiLAogICAgICAgICAgICAiL3Byb2MvbGF0ZW5jeV9zdGF0cyIsCiAgICAgICAgICAgICIvcHJvYy90aW1lcl9saXN0IiwKICAgICAgICAgICAgIi9wcm9jL3RpbWVyX3N0YXRzIiwKICAgICAgICAgICAgIi9wcm9jL3NjaGVkX2RlYnVnIiwKICAgICAgICAgICAgIi9wcm9jL3Njc2kiLAogICAgICAgICAgICAiL3N5cy9maXJtd2FyZSIKICAgICAgICAgIF0sCiAgICAgICAgICAiUmVhZG9ubHlQYXRocyI6IFsKICAgICAgICAgICAgIi9wcm9jL2Fzb3VuZCIsCiAgICAgICAgICAgICIvcHJvYy9idXMiLAogICAgICAgICAgICAiL3Byb2MvZnMiLAogICAgICAgICAgICAiL3Byb2MvaXJxIiwKICAgICAgICAgICAgIi9wcm9jL3N5cyIsCiAgICAgICAgICAgICIvcHJvYy9zeXNycS10cmlnZ2VyIgogICAgICAgICAgXSwKICAgICAgICAgICJEZXZpY2VzIjogW10sCiAgICAgICAgICAiU3lzY3RsIjogewogICAgICAgICAgICAibmV0LmlwdjQuaXBfdW5wcml2aWxlZ2VkX3BvcnRfc3RhcnQiOiAiMCIsCiAgICAgICAgICAgICJuZXQuaXB2NC5waW5nX2dyb3VwX3JhbmdlIjogIjAgMjE0NzQ4MzY0NyIKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0sCiAgICAgICJzdG9yYWdlcyI6IFsKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoMCkiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXIwKSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoMSkiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXIxKSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoMikiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXIyKSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoMykiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXIzKSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoNCkiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXI0KSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoNSkiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXI1KSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoNikiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXI2KSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoNykiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXI3KSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoOCkiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXI4KSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogIm92ZXJsYXlmcyIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAiZnVzZTMua2F0YS1vdmVybGF5IiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiMDQzNmQ5Mzk5MzRhMjliM2Q1OTc5MzUzNGZmOTNlMTk5Zjk0MzhmOWI5NDFlMTNhZTYzMjE1ZjE2N2M0OTNiODpiZjFjN2YxZjlmN2Y5OTVhYTk2YjBjMGViNTQzOTJkYjRlYzc3OTNlZWI1MzJiNDM4MmI1M2Y3MDA0NDQ2MzVmOjEyNzYyNjJiOTEwNGYxODY3MDQxMGNjYWU1M2JhMzJjM2QyMTk1ZWIxMTdjZWRhZmI2N2YyNTliODljZDRkN2E6Y2Y1NDMyMWYwOWNlNDk3OTNiMTNmMGExYjlmMjVjODY5M2Q0NDY2ZDRjMTg1MWRmMjZlNWM3ZWYyODJlMTg1NjphNzA0ZmIwMDZlOTY3YWY5ODExMTJmNDYxODZiZjZiM2RjM2RmYzlmMWVkNjI2MTRlZTlmZGM4MTEzMDU3NGRlOjZhNzBkN2FkZGU0YmYzNTdlNDczNGQ0ZmFkODgxNjA5MjAwZmEzZWJiMjc5MmYyYmFjMGUzYmNhODMxYjRjMjI6ZTIyNGU1M2ZjY2FkYTdjOTYyNzE0YjM4ZmM2YjQzZWVjNTU2NGVkMzUwMWI1MzE4ODQxMmRlYzU1Y2E5ZTRjMTplZWY2NTNmOTVjYTMyNjUyYjg3ZTY3NmMwYTM3YzBmMjA0ZTU4MTQ1ZDg2NmI0YzY4YmUwZWYzZGQzNmI0MjExOmRhNTk4MGE3ZTM0MzQ0MDlkYTEyMzI0MTdhMWQxY2MwMjk2N2I2MmEwOTk1MDJjYWNkMTNjYzJlMzQyMDZmYTQiLAogICAgICAgICAgICAiMTFlYmM1M2RmY2YwMDhkZGFjZjQ1ZWU2NjM5ZGI1OGRmNDY2ZWQ3OTc1ZTAxMGI0N2EyMTYyMmQ2NzA0OGY2MDo4MzUyMmEzODhmZGY3YTIwZTVjMDU1YjNkOGRhN2E3NzI2ZmIwNGI3MTZiN2M1MjI4YmUzOTllNzgyMjA0NGI5OjZjN2VhMGY2YzQ4MTE3ZWYwYjVhMjVkMDhlNzAzMzE5NDY2NTU5NGFhYWQxODJjNWQ3MjI2Nzg4ZTc3OWJmMDg6NTY4ZDkxMTFiNTc5YTllYjY2MWVkNzk3OGVjYjQ5YjAzNTFmOGZiN2M5ODcxMjkwYmU0ZWMzYjVmODVhMDdhOTpjMGNkZTQwOTFlMjBiYjI2NGM1OTI4ZmNjZjNlMzE1N2Y4ODBkODY0ZGYzZmMzMjFiYjlmNmI1YzM1ZjllNGU0OjM1OTkyZTJjYWJhOTYyZmMwZDNjYmIyMmYyMzhiYmU1MmJlMGQ1NDRiM2IzYTllYjI4N2Q2YmZkOTdmYTdkZjI6YjExZWMyMjkwNTk3NTk3MTM1YTkxZGY4NDgxMjg3NDdiYTc2OGFkM2ZjYWYwYmI3NTBiMjkyMTZlMmUzYzJkMTphZjMxZTY1MWVkZDFmMjViZDgzOTQzNGI2ZDYwNTYyYmNiZDkwNzFlYzUxNmY0MWM2YjJlZmIyOWU4NDBjNDNlOjI1NGM1MzE0ODczYzI3YThkZTNkYjUzNDdmNTZlYmQ5ZWIyYmY0NmNjODgxMmE0MzYxMWY5OGUzOGFjMzdiYTIiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQoY3BhdGgpLyQoYnVuZGxlLWlkKSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfQogICAgICBdLAogICAgICAiZGV2aWNlcyI6IFtdLAogICAgICAic2FuZGJveF9waWRucyI6IGZhbHNlLAogICAgICAiZXhlY19jb21tYW5kcyI6IFtdLAogICAgICAiZW52X21hcCI6IHsKICAgICAgICAiSE9TVE5BTUUiOiAiJChob3N0LW5hbWUpIiwKICAgICAgICAiUEFUSCI6ICIvdXNyL2xvY2FsL3NiaW46L3Vzci9sb2NhbC9iaW46L3Vzci9zYmluOi91c3IvYmluOi9zYmluOi9iaW4iCiAgICAgIH0KICAgIH0KICBdLAogICJjb21tb24iOiB7CiAgICAiY3BhdGgiOiAiL3J1bi9rYXRhLWNvbnRhaW5lcnMvc2hhcmVkL2NvbnRhaW5lcnMiLAogICAgIm1vdW50X3NvdXJjZV9jcGF0aCI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zaGFyZWQvY29udGFpbmVycyIsCiAgICAic2ZwcmVmaXgiOiAiXiQoY3BhdGgpLyQoYnVuZGxlLWlkKS1bYS16MC05XXsxNn0tIiwKICAgICJzcGF0aCI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L3N0b3JhZ2UiLAogICAgImlwdjRfYSI6ICIoKFswLTldfFsxLTldWzAtOV18MVswLTldezJ9fDJbMC00XVswLTldfDI1WzAtNV0pXFwuKXszfShbMC05XXxbMS05XVswLTldfDFbMC05XXsyfXwyWzAtNF1bMC05XXwyNVswLTVdKSIsCiAgICAiaXBfcCI6ICJbMC05XXsxLDV9IiwKICAgICJzdmNfbmFtZSI6ICJbQS1aX1xcLlxcLV0rIiwKICAgICJkbnNfbGFiZWwiOiAiW2EtekEtWjAtOV9cXC5cXC1dKyIsCiAgICAic19zb3VyY2UxIjogIl4uLjJbMC05XXszfV9bMC0xXVswLTldX1swLTNdWzAtOV1fWzAtMl1bMC05XV9bMC01XVswLTldX1swLTVdWzAtOV1cXC5bMC05XXsxLDEwfSQiLAogICAgInNfc291cmNlMiI6ICJeLi5kYXRhLyIsCiAgICAiZG5zX3N1YmRvbWFpbiI6ICJeW2EtejAtOV0oWy1hLXowLTldKlthLXowLTldKT8kIiwKICAgICJwb2RfdWlkIjogIl5bMC05YS1mQS1GXXs4fS1bMC05YS1mQS1GXXs0fS1bMC05YS1mQS1GXXs0fS1bMC05YS1mQS1GXXs0fS1bMC05YS1mQS1GXXsxMn0kIiwKICAgICJkZWZhdWx0X2NhcHMiOiBbCiAgICAgICJDQVBfQ0hPV04iLAogICAgICAiQ0FQX0RBQ19PVkVSUklERSIsCiAgICAgICJDQVBfRlNFVElEIiwKICAgICAgIkNBUF9GT1dORVIiLAogICAgICAiQ0FQX01LTk9EIiwKICAgICAgIkNBUF9ORVRfUkFXIiwKICAgICAgIkNBUF9TRVRHSUQiLAogICAgICAiQ0FQX1NFVFVJRCIsCiAgICAgICJDQVBfU0VURkNBUCIsCiAgICAgICJDQVBfU0VUUENBUCIsCiAgICAgICJDQVBfTkVUX0JJTkRfU0VSVklDRSIsCiAgICAgICJDQVBfU1lTX0NIUk9PVCIsCiAgICAgICJDQVBfS0lMTCIsCiAgICAgICJDQVBfQVVESVRfV1JJVEUiCiAgICBdLAogICAgInByaXZpbGVnZWRfY2FwcyI6IFsKICAgICAgIkNBUF9DSE9XTiIsCiAgICAgICJDQVBfREFDX09WRVJSSURFIiwKICAgICAgIkNBUF9EQUNfUkVBRF9TRUFSQ0giLAogICAgICAiQ0FQX0ZPV05FUiIsCiAgICAgICJDQVBfRlNFVElEIiwKICAgICAgIkNBUF9LSUxMIiwKICAgICAgIkNBUF9TRVRHSUQiLAogICAgICAiQ0FQX1NFVFVJRCIsCiAgICAgICJDQVBfU0VUUENBUCIsCiAgICAgICJDQVBfTElOVVhfSU1NVVRBQkxFIiwKICAgICAgIkNBUF9ORVRfQklORF9TRVJWSUNFIiwKICAgICAgIkNBUF9ORVRfQlJPQURDQVNUIiwKICAgICAgIkNBUF9ORVRfQURNSU4iLAogICAgICAiQ0FQX05FVF9SQVciLAogICAgICAiQ0FQX0lQQ19MT0NLIiwKICAgICAgIkNBUF9JUENfT1dORVIiLAogICAgICAiQ0FQX1NZU19NT0RVTEUiLAogICAgICAiQ0FQX1NZU19SQVdJTyIsCiAgICAgICJDQVBfU1lTX0NIUk9PVCIsCiAgICAgICJDQVBfU1lTX1BUUkFDRSIsCiAgICAgICJDQVBfU1lTX1BBQ0NUIiwKICAgICAgIkNBUF9TWVNfQURNSU4iLAogICAgICAiQ0FQX1NZU19CT09UIiwKICAgICAgIkNBUF9TWVNfTklDRSIsCiAgICAgICJDQVBfU1lTX1JFU09VUkNFIiwKICAgICAgIkNBUF9TWVNfVElNRSIsCiAgICAgICJDQVBfU1lTX1RUWV9DT05GSUciLAogICAgICAiQ0FQX01LTk9EIiwKICAgICAgIkNBUF9MRUFTRSIsCiAgICAgICJDQVBfQVVESVRfV1JJVEUiLAogICAgICAiQ0FQX0FVRElUX0NPTlRST0wiLAogICAgICAiQ0FQX1NFVEZDQVAiLAogICAgICAiQ0FQX01BQ19PVkVSUklERSIsCiAgICAgICJDQVBfTUFDX0FETUlOIiwKICAgICAgIkNBUF9TWVNMT0ciLAogICAgICAiQ0FQX1dBS0VfQUxBUk0iLAogICAgICAiQ0FQX0JMT0NLX1NVU1BFTkQiLAogICAgICAiQ0FQX0FVRElUX1JFQUQiLAogICAgICAiQ0FQX1BFUkZNT04iLAogICAgICAiQ0FQX0JQRiIsCiAgICAgICJDQVBfQ0hFQ0tQT0lOVF9SRVNUT1JFIgogICAgXSwKICAgICJ2aXJ0aW9fYmxrX3N0b3JhZ2VfY2xhc3NlcyI6IFsKICAgICAgImNjLWxvY2FsLWNzaSIsCiAgICAgICJjYy1tYW5hZ2VkLWNzaSIsCiAgICAgICJjYy1tYW5hZ2VkLXByZW1pdW0tY3NpIgogICAgXSwKICAgICJzbWJfc3RvcmFnZV9jbGFzc2VzIjogWwogICAgICB7CiAgICAgICAgIm5hbWUiOiAiYXp1cmVmaWxlLWNzaS1rYXRhLWNjIiwKICAgICAgICAibW91bnRfb3B0aW9ucyI6IFsKICAgICAgICAgICJkaXJfbW9kZT0wNzc3IiwKICAgICAgICAgICJmaWxlX21vZGU9MDc3NyIsCiAgICAgICAgICAibWZzeW1saW5rcyIsCiAgICAgICAgICAiY2FjaGU9c3RyaWN0IiwKICAgICAgICAgICJub3NoYXJlc29jayIsCiAgICAgICAgICAiYWN0aW1lbz0zMCIsCiAgICAgICAgICAibm9icmwiCiAgICAgICAgXQogICAgICB9CiAgICBdCiAgfSwKICAic2FuZGJveCI6IHsKICAgICJzdG9yYWdlcyI6IFsKICAgICAgewogICAgICAgICJkcml2ZXIiOiAiZXBoZW1lcmFsIiwKICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAic291cmNlIjogInNobSIsCiAgICAgICAgImZzdHlwZSI6ICJ0bXBmcyIsCiAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgIm5vZGV2IiwKICAgICAgICAgICJtb2RlPTE3NzciLAogICAgICAgICAgInNpemU9NjcxMDg4NjQiCiAgICAgICAgXSwKICAgICAgICAibW91bnRfcG9pbnQiOiAiL3J1bi9rYXRhLWNvbnRhaW5lcnMvc2FuZGJveC9zaG0iLAogICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgfQogICAgXQogIH0sCiAgInJlcXVlc3RfZGVmYXVsdHMiOiB7CiAgICAiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdCI6IHsKICAgICAgImFsbG93X2Vudl9yZWdleCI6IFsKICAgICAgICAiXkhPU1ROQU1FPSQoZG5zX2xhYmVsKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfUE9SVF8kKGlwX3ApX1RDUD10Y3A6Ly8kKGlwdjRfYSk6JChpcF9wKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfUE9SVF8kKGlwX3ApX1RDUF9QUk9UTz10Y3AkIiwKICAgICAgICAiXiQoc3ZjX25hbWUpX1BPUlRfJChpcF9wKV9UQ1BfUE9SVD0kKGlwX3ApJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9QT1JUXyQoaXBfcClfVENQX0FERFI9JChpcHY0X2EpJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9TRVJWSUNFX0hPU1Q9JChpcHY0X2EpJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9TRVJWSUNFX1BPUlQ9JChpcF9wKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfU0VSVklDRV9QT1JUXyQoZG5zX2xhYmVsKT0kKGlwX3ApJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9QT1JUPXRjcDovLyQoaXB2NF9hKTokKGlwX3ApJCIsCiAgICAgICAgIl5BWlVSRV9DTElFTlRfSUQ9W0EtRmEtZjAtOS1dKiQiLAogICAgICAgICJeQVpVUkVfVEVOQU5UX0lEPVtBLUZhLWYwLTktXSokIiwKICAgICAgICAiXkFaVVJFX0ZFREVSQVRFRF9UT0tFTl9GSUxFPS92YXIvcnVuL3NlY3JldHMvYXp1cmUvdG9rZW5zL2F6dXJlLWlkZW50aXR5LXRva2VuJCIsCiAgICAgICAgIl5BWlVSRV9BVVRIT1JJVFlfSE9TVD1odHRwczovL2xvZ2luXFwubWljcm9zb2Z0b25saW5lXFwuY29tLyQiLAogICAgICAgICJeVEVSTT14dGVybSQiCiAgICAgIF0sCiAgICAgICJhbGxvd19lbnZfcmVnZXhfbWFwIjogewogICAgICAgICJDUFVfTElNSVQiOiAiXlswLTldKyQiLAogICAgICAgICJKT0JfQ09NUExFVElPTl9JTkRFWCI6ICJeWzAtOV0qJCIsCiAgICAgICAgIk1FTU9SWV9MSU1JVCI6ICJeWzAtOV0rJCIKICAgICAgfQogICAgfSwKICAgICJDb3B5RmlsZVJlcXVlc3QiOiBbCiAgICAgICIkKHNmcHJlZml4KSIKICAgIF0sCiAgICAiRXhlY1Byb2Nlc3NSZXF1ZXN0IjogewogICAgICAiYWxsb3dlZF9jb21tYW5kcyI6IFtdLAogICAgICAicmVnZXgiOiBbXQogICAgfSwKICAgICJVcGRhdGVSb3V0ZXNSZXF1ZXN0IjogewogICAgICAiZm9yYmlkZGVuX2RldmljZV9uYW1lcyI6IFsKICAgICAgICAibG8iCiAgICAgIF0sCiAgICAgICJmb3JiaWRkZW5fc291cmNlX3JlZ2V4IjogWwogICAgICAgICJeKD86MHswLDR9Oil7MCw3fTB7MCwzfTEkIiwKICAgICAgICAiXjEyN1xcLig/OlswLTldezEsM31cXC4pezJ9WzAtOV17MSwzfSQiCiAgICAgIF0KICAgIH0sCiAgICAiVXBkYXRlSW50ZXJmYWNlUmVxdWVzdCI6IHsKICAgICAgImFsbG93X3Jhd19mbGFncyI6IDEyOCwKICAgICAgImZvcmJpZGRlbl9uYW1lcyI6IFsKICAgICAgICAibG8iCiAgICAgIF0sCiAgICAgICJmb3JiaWRkZW5faHdfYWRkcnMiOiBbCiAgICAgICAgIjAwOjAwOjAwOjAwOjAwOjAwIgogICAgICBdCiAgICB9LAogICAgIkNsb3NlU3RkaW5SZXF1ZXN0IjogZmFsc2UsCiAgICAiUmVhZFN0cmVhbVJlcXVlc3QiOiBmYWxzZSwKICAgICJVcGRhdGVFcGhlbWVyYWxNb3VudHNSZXF1ZXN0IjogZmFsc2UsCiAgICAiV3JpdGVTdHJlYW1SZXF1ZXN0IjogZmFsc2UKICB9Cn0= + spec: + runtimeClassName: kata-cc + containers: + - name: echoheaders-https + image: "registry.k8s.io/e2e-test-images/agnhost:2.40" + command: + - /agnhost + - netexec + - "--http-port=8080" + - "--tls-cert-file=/localhost.crt" + - "--tls-private-key-file=/localhost.key" + ports: + - containerPort: 8080 diff --git a/src/agent/samples/policy/yaml/kubernetes/fixtures/appsv1deployment.yaml b/src/agent/samples/policy/yaml/kubernetes/fixtures/appsv1deployment.yaml new file mode 100644 index 000000000000..4b21c1c294af --- /dev/null +++ b/src/agent/samples/policy/yaml/kubernetes/fixtures/appsv1deployment.yaml @@ -0,0 +1,25 @@ +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: expose-test-deployment + labels: + name: expose-test-deployment +spec: + replicas: 3 + selector: + matchLabels: + name: nginx + template: + metadata: + labels: + name: nginx + annotations: + io.katacontainers.config.agent.policy: IyBDb3B5cmlnaHQgKGMpIDIwMjMgTWljcm9zb2Z0IENvcnBvcmF0aW9uCiMKIyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMAojCnBhY2thZ2UgYWdlbnRfcG9saWN5CgppbXBvcnQgZnV0dXJlLmtleXdvcmRzLmluCmltcG9ydCBmdXR1cmUua2V5d29yZHMuZXZlcnkKCiMgRGVmYXVsdCB2YWx1ZXMsIHJldHVybmVkIGJ5IE9QQSB3aGVuIHJ1bGVzIGNhbm5vdCBiZSBldmFsdWF0ZWQgdG8gdHJ1ZS4KZGVmYXVsdCBBZGRBUlBOZWlnaGJvcnNSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgQWRkU3dhcFJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBDbG9zZVN0ZGluUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IENvcHlGaWxlUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IENyZWF0ZUNvbnRhaW5lclJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBDcmVhdGVTYW5kYm94UmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IERlc3Ryb3lTYW5kYm94UmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgRXhlY1Byb2Nlc3NSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgR2V0T09NRXZlbnRSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBHdWVzdERldGFpbHNSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBMaXN0SW50ZXJmYWNlc1JlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBMaXN0Um91dGVzUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IE1lbUhvdHBsdWdCeVByb2JlUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IE9ubGluZUNQVU1lbVJlcXVlc3QgOj0gdHJ1ZQpkZWZhdWx0IFBhdXNlQ29udGFpbmVyUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFJlYWRTdHJlYW1SZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgUmVtb3ZlQ29udGFpbmVyUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgUmVtb3ZlU3RhbGVWaXJ0aW9mc1NoYXJlTW91bnRzUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgUmVzZWVkUmFuZG9tRGV2UmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFJlc3VtZUNvbnRhaW5lclJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBTZXRHdWVzdERhdGVUaW1lUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFNldFBvbGljeVJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBTaWduYWxQcm9jZXNzUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgU3RhcnRDb250YWluZXJSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBTdGFydFRyYWNpbmdSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgU3RhdHNDb250YWluZXJSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBTdG9wVHJhY2luZ1JlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBUdHlXaW5SZXNpemVSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBVcGRhdGVDb250YWluZXJSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgVXBkYXRlRXBoZW1lcmFsTW91bnRzUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFVwZGF0ZUludGVyZmFjZVJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBVcGRhdGVSb3V0ZXNSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgV2FpdFByb2Nlc3NSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBXcml0ZVN0cmVhbVJlcXVlc3QgOj0gZmFsc2UKCiMgQWxsb3dSZXF1ZXN0c0ZhaWxpbmdQb2xpY3kgOj0gdHJ1ZSBjb25maWd1cmVzIHRoZSBBZ2VudCB0byAqYWxsb3cgYW55CiMgcmVxdWVzdHMgY2F1c2luZyBhIHBvbGljeSBmYWlsdXJlKi4gVGhpcyBpcyBhbiB1bnNlY3VyZSBjb25maWd1cmF0aW9uCiMgYnV0IGlzIHVzZWZ1bCBmb3IgYWxsb3dpbmcgdW5zZWN1cmUgcG9kcyB0byBzdGFydCwgdGhlbiBjb25uZWN0IHRvCiMgdGhlbSBhbmQgaW5zcGVjdCBPUEEgbG9ncyBmb3IgdGhlIHJvb3QgY2F1c2Ugb2YgYSBmYWlsdXJlLgpkZWZhdWx0IEFsbG93UmVxdWVzdHNGYWlsaW5nUG9saWN5IDo9IGZhbHNlCgojIENvbnN0YW50cwpTX05BTUVfS0VZID0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZSIKU19OQU1FU1BBQ0VfS0VZID0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZXNwYWNlIgpCVU5ETEVfSUQgPSAiW2EtejAtOV17NjR9IgoKQ3JlYXRlQ29udGFpbmVyUmVxdWVzdDo9IHJlc3AgewogICAgbm90IGlzX251bGwoaW5wdXQuZW52X21hcCkKICAgIAogICAgaV9lbnZfbWFwIDo9IGlucHV0LmVudl9tYXAKICAgIAogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBwX2Vudl9tYXAgOj0gcF9jb250YWluZXIuZW52X21hcCAgCiAgICBhbGxvd19lbnZfbWFwKHBfZW52X21hcCwgaV9lbnZfbWFwKQogICAgCiAgICBpX3Byb2Nlc3MgOj0gaW5wdXQuYmFzZS5PQ0kuUHJvY2VzcwogICAgCiAgICBwX3Byb2Nlc3MgOj0gcF9jb250YWluZXIuT0NJLlByb2Nlc3MKICAgIAogICAgYWxsb3dfYXJncyhpX3Byb2Nlc3MsIHBfcHJvY2VzcywgaV9lbnZfbWFwKQoKICAgIHJlc3AgPSBDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uKGlucHV0LmJhc2UpCiAgICBwcmludCgiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdDogdHJ1ZSIpCn0KCmFsbG93X2FyZ3MoaV9wcm9jZXNzLCBwX3Byb2Nlc3MsIGlfZW52X21hcCkgewogICAgaV9hcmdzIDo9IGlfcHJvY2Vzcy5BcmdzCiAgICBwX2FyZ3MgOj0gcF9wcm9jZXNzLkFyZ3MKICAgIHByaW50KCJhbGxvd19hcmdzOiBpX2FyZ3MgPSIsIGlfYXJncywgInBfYXJncyA9IiwgcF9hcmdzKQogICAgY291bnQoaV9hcmdzKSA9PSBjb3VudChwX2FyZ3MpCiAgICBldmVyeSBpLCBpX2FyZyBpbiBpX2FyZ3MgewogICAgICAgIHByaW50KCJhbGxvd19hcmdzOiBpX2FyZyA9IiwgaV9hcmcpCiAgICAgICAgcF9hcmdfcmVwbGFjZWQgOj0gcmVwbGFjZV9lbnZfdmFyaWFibGVzKHBfYXJnc1tpXSwgaV9lbnZfbWFwKQogICAgICAgIHByaW50KCJhbGxvd19hcmdzOiBwX2FyZ19yZXBsYWNlZCA9IiwgcF9hcmdfcmVwbGFjZWQpCiAgICAgICAgcF9hcmdfcmVwbGFjZWQyIDo9IHJlcGxhY2UocF9hcmdfcmVwbGFjZWQsICIkJCIsICIkIikKICAgICAgICBwcmludCgiYWxsb3dfYXJnczogcF9hcmdfcmVwbGFjZWQyID0iLCBwX2FyZ19yZXBsYWNlZDIpCiAgICAgICAgaV9hcmcgPT0gcF9hcmdfcmVwbGFjZWQyCiAgICB9CiAgICBwcmludCgiYWxsb3dfYXJnczogdHJ1ZSIpCn0KCmFsbG93X2FyZ3MoaV9wcm9jZXNzLCBwX3Byb2Nlc3MsIGlfZW52X21hcCkgewogICAgbm90IGlfcHJvY2Vzcy5BcmdzCiAgICBub3QgcF9wcm9jZXNzLkFyZ3MKICAgIHByaW50KCJhbGxvd19hcmdzMjogbm8gYXJncyIpCn0KCiMgdGhpcyBmdW5jdGlvbiByZXBsYWNlcyBhbGwgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyBpbiBhIHN0cmluZywgZ2l2ZW4gYSBtYXAgb2YgZW52aXJvbm1lbnQga2V5cyB0byBlbnZpcm9ubWVudCB2YWx1ZXMKIyBlZyBzdHIgPSAiZWNobyAkKENMVVNURVJfSUQpOyBlY2hvICQoTk9ERV9OQU1FKTsiCiMgZW52X21hcCA9IHsiQ0xVU1RFUl9JRCI6ICJhYmMiLCAiTk9ERV9OQU1FIiA6ICJ4eXoifQojIHJlc3VsdCA9ICJlY2hvIGFiYzsgZWNobyB4eXo7IgpyZXBsYWNlX2Vudl92YXJpYWJsZXMoc3RyLCBlbnZfbWFwKSA9IHJlc3VsdCB7CiAgICAjIG1ha2UgYW4gYXJyYXkgb2YgdGhlIGtleXMgZWcgWyJDTFVTVEVSX0lEIiwgIk5PREVfTkFNRSJdCiAgICBrZXlzIDo9IFt4IHwgc29tZSB4IGluIG9iamVjdC5rZXlzKGVudl9tYXApXQogICAgcmVzdWx0IDo9IHJlcGxhY2Vfc3RyX3JlYyhzdHIsIGVudl9tYXAsIGtleXMsIGNvdW50KGtleXMpIC0gMSkKfQoKIyBiYXNlIGNhc2UKcmVwbGFjZV9zdHJfcmVjKHN0ciwgZW52X21hcCwgYXJyX2tleXMsIGkpID0gcmVzdWx0IHsKICAgIGkgPCAwCiAgICByZXN1bHQgOj0gc3RyCn0KCiMgcmVjdXJzaXZlIHN0ZXAKcmVwbGFjZV9zdHJfcmVjKHN0ciwgZW52X21hcCwgYXJyX2tleXMsIGkpID0gcmVzdWx0IHsKICAgIGkgPj0gMAogICAga2V5IDo9IGFycl9rZXlzW2ldCiAgICBlbnZfa2V5MSA6PSBjb25jYXQoIiIsIFsiJCgiLCBrZXksICIpIl0pCiAgICAjIHJlcGxhY2UgJChWQVIpIHdpdGggdmFsdWUKICAgIG5ld19zdHIxIDo9IHJlcGxhY2Uoc3RyLCBlbnZfa2V5MSwgZW52X21hcFtrZXldKQogICAgIyByZXBsYWNlIG5leHQgZW52aXJvbm1lbnQgdmFyaWFibGUKICAgIHJlc3VsdCA9IHJlcGxhY2Vfc3RyX3JlYyhuZXdfc3RyMSwgZW52X21hcCwgYXJyX2tleXMsIGkgLSAxKQp9CgphbGxvd19lbnZfbWFwKHBfZW52X21hcCwgaV9lbnZfbWFwKSB7CiAgICBwcmludCgiYWxsb3dfZW52X21hcDogcF9lbnZfbWFwID0iLCBwX2Vudl9tYXApCiAgICBldmVyeSBlbnZfa2V5LCBlbnZfdmFsIGluIGlfZW52X21hcCB7CiAgICAgICAgcHJpbnQoImFsbG93X2VudjogZW52X2tleSA9IiwgZW52X2tleSwgImVudl92YWwgPSIsIGVudl92YWwpCiAgICAgICAgYWxsb3dfZW52X21hcF9lbnRyeShlbnZfa2V5LCBlbnZfdmFsLCBwX2Vudl9tYXApCiAgICB9CiAgICBwcmludCgiYWxsb3dfZW52X21hcDogdHJ1ZSIpCn0KCiMgQWxsb3cgZXhhY3QgbWF0Y2gKYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBpX3ZhbCA9PSBwX3ZhbAogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnk6IHRydWUiKQp9CgojIEFsbG93IHJlc291cmNlRmllbGRSZWYgdmFsdWVzIChlLmcuLCAibGltaXRzLmNwdSIpLgphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgICMgYSB2YXJpYWJsZSB3ZSBzaG91bGQgYmUgdmFsaWRhdGluZyB1c2luZyBhIHJlZ2V4IGZyb20gc2V0dGluZ3MKICAgIHBfdmFsID09ICIkKHZhbGlkYXRlLWZyb20tc2V0dGluZ3MpIgogICAgcmVnZXhfdmFsIDo9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuQ3JlYXRlQ29udGFpbmVyUmVxdWVzdC5hbGxvd19lbnZfcmVnZXhfbWFwW2tleV0KICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4X3ZhbCwgaV92YWwpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSAyOiB0cnVlIikKfQoKIyBBbGxvdyBub2RlLW5hbWUKYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChub2RlLW5hbWUpIgogICAgcmVnZXgubWF0Y2gocG9saWN5X2RhdGEuY29tbW9uLmRuc19zdWJkb21haW4gLCBpX3ZhbCkKICAgIHByaW50KCJhbGxvd19lbnZfbWFwX2VudHJ5IDM6IHRydWUiKQp9CgojIEFsbG93IGhvc3QtbmFtZQphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgIHBfdmFsID09ICIkKGhvc3QtbmFtZSkiCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24uZG5zX2xhYmVsICwgaV92YWwpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSA0OiB0cnVlIikKfQoKIyBBbGxvdyBwb2QtdWlkCmFsbG93X2Vudl9tYXBfZW50cnkoa2V5LCBpX3ZhbCwgcF9lbnZfbWFwKSB7CiAgICBwX3ZhbCA6PSBwX2Vudl9tYXBba2V5XQogICAgcF92YWwgPT0gIiQocG9kLXVpZCkiCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24ucG9kX3VpZCAsIGlfdmFsKQogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgNTogdHJ1ZSIpCn0KCiMgQWxsb3cgZmllbGRSZWYgImZpZWxkUGF0aDogc3RhdHVzLnBvZElQIiB2YWx1ZXMuCmFsbG93X2Vudl9tYXBfZW50cnkoa2V5LCBpX3ZhbCwgcF9lbnZfbWFwKSB7CiAgICBpc19pcChpX3ZhbCkKCiAgICBwX3ZhbCA6PSBwX2Vudl9tYXBba2V5XQogICAgcF92YXIgOj0gY29uY2F0KCI9IiwgW2tleSwgcF92YWxdKQogICAgYWxsb3dfcG9kX2lwX3ZhcihrZXksIHBfdmFyKQogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgNjogdHJ1ZSIpCn0KCiMgQWxsb3cgZmllbGRSZWYgImZpZWxkUGF0aDogc3RhdHVzLmhvc3RJUCIgdmFsdWVzLgphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgaXNfaXAoaV92YWwpCgogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgIHBfdmFyIDo9IGNvbmNhdCgiPSIsIFtrZXksIHBfdmFsXSkKICAgIGFsbG93X2hvc3RfaXBfdmFyKGtleSwgcF92YXIpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSA3OiB0cnVlIikKfQoKIyBNYXRjaCBpbnB1dCB3aXRoIG9uZSBvZiB0aGUgcG9saWN5IHZhcmlhYmxlcywgYWZ0ZXIgc3Vic3RpdHV0aW5nICQoc2FuZGJveC1uYW1lKS4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChzYW5kYm94LW5hbWUpIgogICAgc19uYW1lIDo9IGlucHV0LmJhc2UuT0NJLkFubm90YXRpb25zW1NfTkFNRV9LRVldCiAgICBwX3ZhcjIgOj0gcmVwbGFjZShwX3ZhbCwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHBfdmFyMiA9PSBpX3ZhbAogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgODogdHJ1ZSIpCn0KCiMgTWF0Y2ggaW5wdXQgd2l0aCBvbmUgb2YgdGhlIHBvbGljeSB2YXJpYWJsZXMsIGFmdGVyIHN1YnN0aXR1dGluZyAkKHNhbmRib3gtbmFtZXNwYWNlKS4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChzYW5kYm94LW5hbWVzcGFjZSkiCiAgICBzX25hbWVzcGFjZSA6PSBpbnB1dC5iYXNlLk9DSS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwX3ZhcjIgOj0gcmVwbGFjZShwX3ZhbCwgIiQoc2FuZGJveC1uYW1lc3BhY2UpIiwgc19uYW1lc3BhY2UpCiAgICBwX3ZhcjIgPT0gaV92YWwKICAgIHByaW50KCJhbGxvd19lbnZfbWFwX2VudHJ5IDk6IHRydWUiKQp9CgojIEFsbG93IGlucHV0IGVudiB2YXJpYWJsZXMgdGhhdCBtYXRjaCB3aXRoIGEgcmVxdWVzdF9kZWZhdWx0cyByZWdleC4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHNvbWUgcF9yZWdleDEgaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5DcmVhdGVDb250YWluZXJSZXF1ZXN0LmFsbG93X2Vudl9yZWdleAogICAgcF9yZWdleDIgOj0gcmVwbGFjZShwX3JlZ2V4MSwgIiQoaXB2NF9hKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcHY0X2EpCiAgICBwX3JlZ2V4MyA6PSByZXBsYWNlKHBfcmVnZXgyLCAiJChpcF9wKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcF9wKQogICAgcF9yZWdleDQgOj0gcmVwbGFjZShwX3JlZ2V4MywgIiQoc3ZjX25hbWUpIiwgcG9saWN5X2RhdGEuY29tbW9uLnN2Y19uYW1lKQogICAgcF9yZWdleDUgOj0gcmVwbGFjZShwX3JlZ2V4NCwgIiQoZG5zX2xhYmVsKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5kbnNfbGFiZWwpCgogICAgcmVzdWx0IDo9IGNvbmNhdCgiPSIsIFtrZXksIGlfdmFsXSkKICAgIHJlZ2V4Lm1hdGNoKHBfcmVnZXg1LCByZXN1bHQpCgogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgMTA6IHRydWUiKQp9CgpDcmVhdGVDb250YWluZXJSZXF1ZXN0Oj0gcmVzcCB7CiAgICBub3QgaW5wdXQuZW52X21hcAogICAgaV9wcm9jZXNzID0gaW5wdXQuT0NJLlByb2Nlc3MKICAgIHNfbmFtZSA9IGlucHV0Lk9DSS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBwX3Byb2Nlc3MgPSBwX2NvbnRhaW5lci5PQ0kuUHJvY2VzcwogICAgYWxsb3dfZGVwcmVjYXRlZF9hcmdzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUpCiAgICByZXNwID0gQ3JlYXRlQ29udGFpbmVyUmVxdWVzdENvbW1vbihpbnB1dCkKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0MjogdHJ1ZSIpCn0KCkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb24ocmVxKTo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgICMgQ2hlY2sgaWYgdGhlIGlucHV0IHJlcXVlc3Qgc2hvdWxkIGJlIHJlamVjdGVkIGV2ZW4gYmVmb3JlIGNoZWNraW5nIHRoZQogICAgIyBwb2xpY3lfZGF0YS5jb250YWluZXJzIGluZm9ybWF0aW9uLgogICAgYWxsb3dfY3JlYXRlX2NvbnRhaW5lcl9pbnB1dChyZXEpCgogICAgaV9vY2kgOj0gcmVxLk9DSQogICAgaV9zdG9yYWdlcyA6PSByZXEuc3RvcmFnZXMKICAgIGlfZGV2aWNlcyA6PSByZXEuZGV2aWNlcwoKICAgICMgYXJyYXkgb2YgcG9zc2libGUgc3RhdGUgb3BlcmF0aW9ucwogICAgb3BzX2J1aWxkZXIgOj0gW10KCiAgICAjIGNoZWNrIHNhbmRib3ggbmFtZQogICAgc2FuZGJveF9uYW1lID0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FX0tFWV0KICAgIGFkZF9zYW5kYm94X25hbWVfdG9fc3RhdGUgOj0gc3RhdGVfYWxsb3dzKCJzYW5kYm94X25hbWUiLCBzYW5kYm94X25hbWUpCiAgICBvcHNfYnVpbGRlcjEgOj0gY29uY2F0X29wX2lmX25vdF9udWxsKG9wc19idWlsZGVyLCBhZGRfc2FuZGJveF9uYW1lX3RvX3N0YXRlKQoKICAgICMgQ2hlY2sgaWYgYW55IGVsZW1lbnQgZnJvbSB0aGUgcG9saWN5X2RhdGEuY29udGFpbmVycyBhcnJheSBhbGxvd3MgdGhlIGlucHV0IHJlcXVlc3QuCiAgICBzb21lIHBfY29udGFpbmVyIGluIHBvbGljeV9kYXRhLmNvbnRhaW5lcnMKICAgIHByaW50KCI9PT09PT09PSBDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiB0cnlpbmcgbmV4dCBwb2xpY3kgY29udGFpbmVyIikKCiAgICBwX3BpZG5zIDo9IHBfY29udGFpbmVyLnNhbmRib3hfcGlkbnMKICAgIGlfcGlkbnMgOj0gcmVxLnNhbmRib3hfcGlkbnMKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiBwX3BpZG5zID0iLCBwX3BpZG5zLCAiaV9waWRucyA9IiwgaV9waWRucykKICAgIHBfcGlkbnMgPT0gaV9waWRucwoKICAgIHBfb2NpIDo9IHBfY29udGFpbmVyLk9DSQoKICAgICMgY2hlY2sgbmFtZXNwYWNlCiAgICBwX25hbWVzcGFjZSA6PSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBpX25hbWVzcGFjZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwcmludCAoIkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb246IHBfbmFtZXNwYWNlID0iLCBwX25hbWVzcGFjZSwgImlfbmFtZXNwYWNlID0iLCBpX25hbWVzcGFjZSkKICAgIGFkZF9uYW1lc3BhY2VfdG9fc3RhdGUgOj0gYWxsb3dfbmFtZXNwYWNlKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkKICAgIG9wc19idWlsZGVyMiA6PSBjb25jYXRfb3BfaWZfbm90X251bGwob3BzX2J1aWxkZXIxLCBhZGRfbmFtZXNwYWNlX3RvX3N0YXRlKQoKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiBwIFZlcnNpb24gPSIsIHBfb2NpLlZlcnNpb24sICJpIFZlcnNpb24gPSIsIGlfb2NpLlZlcnNpb24pCiAgICBwX29jaS5WZXJzaW9uID09IGlfb2NpLlZlcnNpb24KCiAgICBwcmludCgiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdENvbW1vbjogcCBSZWFkb25seSA9IiwgcF9vY2kuUm9vdC5SZWFkb25seSwgImkgUmVhZG9ubHkgPSIsIGlfb2NpLlJvb3QuUmVhZG9ubHkpCiAgICBwX29jaS5Sb290LlJlYWRvbmx5ID09IGlfb2NpLlJvb3QuUmVhZG9ubHkKCiAgICBhbGxvd19hbm5vKHBfb2NpLCBpX29jaSkKCiAgICBwX3N0b3JhZ2VzIDo9IHBfY29udGFpbmVyLnN0b3JhZ2VzCiAgICBhbGxvd19ieV9hbm5vKHBfb2NpLCBpX29jaSwgcF9zdG9yYWdlcywgaV9zdG9yYWdlcykKCiAgICBwX2RldmljZXMgOj0gcF9jb250YWluZXIuZGV2aWNlcwogICAgYWxsb3dfZGV2aWNlcyhwX2RldmljZXMsIGlfZGV2aWNlcykKCiAgICByZXQgOj0gYWxsb3dfbGludXgob3BzX2J1aWxkZXIyLCBwX29jaSwgaV9vY2kpCiAgICByZXQuYWxsb3dlZAoKICAgIG9wcyA6PSByZXQub3BzCgogICAgcHJpbnQoIkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb246IHRydWUiKQp9CgphbGxvd19jcmVhdGVfY29udGFpbmVyX2lucHV0KHJlcSkgewogICAgcHJpbnQoImFsbG93X2NyZWF0ZV9jb250YWluZXJfaW5wdXQ6IGlucHV0ID0iLCByZXEpCgogICAgY291bnQocmVxLnNoYXJlZF9tb3VudHMpID09IDAKICAgIGlzX251bGwocmVxLnN0cmluZ191c2VyKQoKICAgIGlfb2NpIDo9IHJlcS5PQ0kKICAgIGlzX251bGwoaV9vY2kuSG9va3MpCiAgICBpc19udWxsKGlfb2NpLlNvbGFyaXMpCiAgICBpc19udWxsKGlfb2NpLldpbmRvd3MpCgogICAgaV9saW51eCA6PSBpX29jaS5MaW51eAogICAgY291bnQoaV9saW51eC5HSURNYXBwaW5ncykgPT0gMAogICAgY291bnQoaV9saW51eC5Nb3VudExhYmVsKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlJlc291cmNlcy5EZXZpY2VzKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlJvb3Rmc1Byb3BhZ2F0aW9uKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlVJRE1hcHBpbmdzKSA9PSAwCiAgICBpc19udWxsKGlfbGludXguSW50ZWxSZHQpCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLkJsb2NrSU8pCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLk5ldHdvcmspCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLlBpZHMpCiAgICBpc19udWxsKGlfbGludXguU2VjY29tcCkKCiAgICBpX3Byb2Nlc3MgOj0gaV9vY2kuUHJvY2VzcwogICAgY291bnQoaV9wcm9jZXNzLlNlbGludXhMYWJlbCkgPT0gMAogICAgY291bnQoaV9wcm9jZXNzLlVzZXIuVXNlcm5hbWUpID09IDAKCiAgICBwcmludCgiYWxsb3dfY3JlYXRlX2NvbnRhaW5lcl9pbnB1dDogdHJ1ZSIpCn0KCmFsbG93X25hbWVzcGFjZShwX25hbWVzcGFjZSwgaV9uYW1lc3BhY2UpID0gYWRkX25hbWVzcGFjZSB7CiAgICBwX25hbWVzcGFjZSA9PSBpX25hbWVzcGFjZQogICAgYWRkX25hbWVzcGFjZSA6PSBudWxsCiAgICBwcmludCgiYWxsb3dfbmFtZXNwYWNlIDE6IGlucHV0IG5hbWVzcGFjZSBtYXRjaGVzIHBvbGljeSBkYXRhIikKfQoKYWxsb3dfbmFtZXNwYWNlKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkgPSBhZGRfbmFtZXNwYWNlIHsKICAgIHBfbmFtZXNwYWNlID09ICIiCiAgICBwcmludCgiYWxsb3dfbmFtZXNwYWNlIDI6IG5vIG5hbWVzcGFjZSBmb3VuZCBvbiBwb2xpY3kgZGF0YSIpCiAgICBhZGRfbmFtZXNwYWNlIDo9IHN0YXRlX2FsbG93cygibmFtZXNwYWNlIiwgaV9uYW1lc3BhY2UpCn0KCiMgdmFsdWUgaGFzbid0IGJlZW4gc2VlbiBiZWZvcmUsIHNhdmUgaXQgdG8gc3RhdGUKc3RhdGVfYWxsb3dzKGtleSwgdmFsdWUpID0gYWN0aW9uIHsKICBzdGF0ZSA6PSBnZXRfc3RhdGUoKQogIHByaW50KCJzdGF0ZV9hbGxvd3MgMTogc3RhdGVba2V5XSA9Iiwgc3RhdGVba2V5XSwgInZhbHVlID0iLCB2YWx1ZSkKICBub3Qgc3RhdGVba2V5XQogIHByaW50KCJzdGF0ZV9hbGxvd3MgMTogc2F2aW5nIHRvIHN0YXRlIGtleSA9Iiwga2V5LCAidmFsdWUgPSIsIHZhbHVlKQogIHBhdGggOj0gZ2V0X3N0YXRlX3BhdGgoa2V5KSAKICBhY3Rpb24gOj0gewogICAgIm9wIjogImFkZCIsCiAgICAicGF0aCI6IHBhdGgsIAogICAgInZhbHVlIjogdmFsdWUsCiAgfQp9CgojIHZhbHVlIG1hdGNoZXMgd2hhdCdzIGluIHN0YXRlLCBhbGxvdyBpdApzdGF0ZV9hbGxvd3Moa2V5LCB2YWx1ZSkgPSBhY3Rpb24gewogIHByaW50KCJzdGF0ZV9hbGxvd3MgMjogc3RhcnQiKQogIHN0YXRlIDo9IGdldF9zdGF0ZSgpCiAgcHJpbnQoInN0YXRlX2FsbG93cyAyOiBzdGF0ZVtrZXldID0iLCBzdGF0ZVtrZXldLCAidmFsdWUgPSIsIHZhbHVlKQogIHZhbHVlID09IHN0YXRlW2tleV0KICBwcmludCgic3RhdGVfYWxsb3dzIDI6IGZvdW5kIGtleSA9Iiwga2V5LCAidmFsdWUgPSIsIHZhbHVlLCAiIGluIHN0YXRlIikKICBhY3Rpb24gOj0gbnVsbAp9CgojIGhlbHBlciBmdW5jdGlvbnMgdG8gaW50ZXJhY3Qgd2l0aCB0aGUgc3RhdGUKZ2V0X3N0YXRlKCkgPSBzdGF0ZSB7CiAgc3RhdGUgOj0gZGF0YVsicHN0YXRlIl0KfQoKZ2V0X3N0YXRlX3ZhbChrZXkpID0gdmFsdWUgewogICAgc3RhdGUgOj0gZ2V0X3N0YXRlKCkKICAgIHZhbHVlIDo9IHN0YXRlW2tleV0KfQoKZ2V0X3N0YXRlX3BhdGgoa2V5KSA9IHBhdGggewogICAgIyBwcmVwZW5kICIvcHN0YXRlLyIgdG8ga2V5CiAgICBwYXRoIDo9IGNvbmNhdCgiLyIsIFsiL3BzdGF0ZSIsIGtleV0pCn0KCiMgSGVscGVyIGZ1bmN0aW9ucyB0byBjb25kaXRpb25hbGx5IGNvbmNhdGVuYXRlIG9wIGlzIG5vdCBudWxsCmNvbmNhdF9vcF9pZl9ub3RfbnVsbChvcHMsIG9wKSA9IHJlc3VsdCB7CiAgICBvcCA9PSBudWxsCiAgICByZXN1bHQgOj0gb3BzCn0KCmNvbmNhdF9vcF9pZl9ub3RfbnVsbChvcHMsIG9wKSA9IHJlc3VsdCB7CiAgICBvcCAhPSBudWxsCiAgICByZXN1bHQgOj0gYXJyYXkuY29uY2F0KG9wcywgW29wXSkKfQoKIyBSZWplY3QgdW5leHBlY3RlZCBhbm5vdGF0aW9ucy4KYWxsb3dfYW5ubyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19hbm5vIDE6IHN0YXJ0IikKCiAgICBub3QgaV9vY2kuQW5ub3RhdGlvbnMKCiAgICBwcmludCgiYWxsb3dfYW5ubyAxOiB0cnVlIikKfQphbGxvd19hbm5vKHBfb2NpLCBpX29jaSkgewogICAgcHJpbnQoImFsbG93X2Fubm8gMjogcCBBbm5vdGF0aW9ucyA9IiwgcF9vY2kuQW5ub3RhdGlvbnMpCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiBpIEFubm90YXRpb25zID0iLCBpX29jaS5Bbm5vdGF0aW9ucykKCiAgICBpX2tleXMgOj0gb2JqZWN0LmtleXMoaV9vY2kuQW5ub3RhdGlvbnMpCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiBpIGtleXMgPSIsIGlfa2V5cykKCiAgICBldmVyeSBpX2tleSBpbiBpX2tleXMgewogICAgICAgIGFsbG93X2Fubm9fa2V5KGlfa2V5LCBwX29jaSkKICAgIH0KCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiB0cnVlIikKfQoKYWxsb3dfYW5ub19rZXkoaV9rZXksIHBfb2NpKSB7CiAgICBwcmludCgiYWxsb3dfYW5ub19rZXkgMTogaSBrZXkgPSIsIGlfa2V5KQoKICAgIHN0YXJ0c3dpdGgoaV9rZXksICJpby5rdWJlcm5ldGVzLmNyaS4iKQoKICAgIHByaW50KCJhbGxvd19hbm5vX2tleSAxOiB0cnVlIikKfQphbGxvd19hbm5vX2tleShpX2tleSwgcF9vY2kpIHsKICAgIHByaW50KCJhbGxvd19hbm5vX2tleSAyOiBpIGtleSA9IiwgaV9rZXkpCgogICAgc29tZSBwX2tleSwgXyBpbiBwX29jaS5Bbm5vdGF0aW9ucwogICAgcF9rZXkgPT0gaV9rZXkKCiAgICBwcmludCgiYWxsb3dfYW5ub19rZXkgMjogdHJ1ZSIpCn0KCiMgR2V0IHRoZSB2YWx1ZSBvZiB0aGUgU19OQU1FX0tFWSBhbm5vdGF0aW9uIGFuZAojIGNvcnJlbGF0ZSBpdCB3aXRoIG90aGVyIGFubm90YXRpb25zIGFuZCBwcm9jZXNzIGZpZWxkcy4KYWxsb3dfYnlfYW5ubyhwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpIHsKICAgIHByaW50KCJhbGxvd19ieV9hbm5vIDE6IHN0YXJ0IikKCiAgICBub3QgcF9vY2kuQW5ub3RhdGlvbnNbU19OQU1FX0tFWV0KCiAgICBpX3NfbmFtZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMTogaV9zX25hbWUgPSIsIGlfc19uYW1lKQoKICAgIGlfc19uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FU1BBQ0VfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMTogaV9zX25hbWVzcGFjZSA9IiwgaV9zX25hbWVzcGFjZSkKCiAgICBhbGxvd19ieV9zYW5kYm94X25hbWUocF9vY2ksIGlfb2NpLCBwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBpX3NfbmFtZSwgaV9zX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfYnlfYW5ubyAxOiB0cnVlIikKfQphbGxvd19ieV9hbm5vKHBfb2NpLCBpX29jaSwgcF9zdG9yYWdlcywgaV9zdG9yYWdlcykgewogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMjogc3RhcnQiKQoKICAgIHBfc19uYW1lIDo9IHBfb2NpLkFubm90YXRpb25zW1NfTkFNRV9LRVldCiAgICBpX3NfbmFtZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMjogaV9zX25hbWUgPSIsIGlfc19uYW1lLCAicF9zX25hbWUgPSIsIHBfc19uYW1lKQoKICAgIGFsbG93X3NhbmRib3hfbmFtZShwX3NfbmFtZSwgaV9zX25hbWUpCgogICAgaV9zX25hbWVzcGFjZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwcmludCgiYWxsb3dfYnlfYW5ubyAyOiBpX3NfbmFtZXNwYWNlID0iLCBpX3NfbmFtZXNwYWNlKQoKICAgIGFsbG93X2J5X3NhbmRib3hfbmFtZShwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMsIGlfc19uYW1lLCBpX3NfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd19ieV9hbm5vIDI6IHRydWUiKQp9CgphbGxvd19ieV9zYW5kYm94X25hbWUocF9vY2ksIGlfb2NpLCBwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfYnlfc2FuZGJveF9uYW1lOiBzdGFydCIpCgogICAgaV9uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FU1BBQ0VfS0VZXQoKICAgIGFsbG93X2J5X2NvbnRhaW5lcl90eXBlcyhwX29jaSwgaV9vY2ksIHNfbmFtZSwgaV9uYW1lc3BhY2UpCiAgICBhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZChwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpCiAgICBhbGxvd19wcm9jZXNzKHBfb2NpLlByb2Nlc3MsIGlfb2NpLlByb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpCgogICAgcHJpbnQoImFsbG93X2J5X3NhbmRib3hfbmFtZTogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfbmFtZShwX3NfbmFtZSwgaV9zX25hbWUpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X25hbWU6IHN0YXJ0IikKICAgIHJlZ2V4Lm1hdGNoKHBfc19uYW1lLCBpX3NfbmFtZSkKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9uYW1lOiB0cnVlIikKfQoKIyBDaGVjayB0aGF0IHRoZSAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLXR5cGUiIGFuZAojICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIiBhbm5vdGF0aW9ucyBkZXNpZ25hdGUgdGhlCiMgZXhwZWN0ZWQgdHlwZSAtIGVpdGhlciBhICJzYW5kYm94IiBvciBhICJjb250YWluZXIiLiBUaGVuLCB2YWxpZGF0ZQojIG90aGVyIGFubm90YXRpb25zIGJhc2VkIG9uIHRoZSBhY3R1YWwgInNhbmRib3giIG9yICJjb250YWluZXIiIHZhbHVlCiMgZnJvbSB0aGUgaW5wdXQgY29udGFpbmVyLgphbGxvd19ieV9jb250YWluZXJfdHlwZXMocF9vY2ksIGlfb2NpLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfYnlfY29udGFpbmVyX3R5cGVzOiBjaGVja2luZyBpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSIpCgogICAgY190eXBlIDo9ICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSIKICAgIAogICAgcF9jcmlfdHlwZSA6PSBwX29jaS5Bbm5vdGF0aW9uc1tjX3R5cGVdCiAgICBpX2NyaV90eXBlIDo9IGlfb2NpLkFubm90YXRpb25zW2NfdHlwZV0KICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZXM6IHBfY3JpX3R5cGUgPSIsIHBfY3JpX3R5cGUsICJpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgcF9jcmlfdHlwZSA9PSBpX2NyaV90eXBlCgogICAgYWxsb3dfYnlfY29udGFpbmVyX3R5cGUoaV9jcmlfdHlwZSwgcF9vY2ksIGlfb2NpLCBzX25hbWUsIHNfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZXM6IHRydWUiKQp9CgphbGxvd19ieV9jb250YWluZXJfdHlwZShpX2NyaV90eXBlLCBwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAxOiBpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgaV9jcmlfdHlwZSA9PSAic2FuZGJveCIKCiAgICBpX2thdGFfdHlwZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1siaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5jb250YWluZXJfdHlwZSJdCiAgICBwcmludCgiYWxsb3dfYnlfY29udGFpbmVyX3R5cGUgMTogaV9rYXRhX3R5cGUgPSIsIGlfa2F0YV90eXBlKQogICAgaV9rYXRhX3R5cGUgPT0gInBvZF9zYW5kYm94IgoKICAgIGFsbG93X3NhbmRib3hfY29udGFpbmVyX25hbWUocF9vY2ksIGlfb2NpKQogICAgYWxsb3dfc2FuZGJveF9uZXRfbmFtZXNwYWNlKHBfb2NpLCBpX29jaSkKICAgIGFsbG93X3NhbmRib3hfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpCgogICAgcHJpbnQoImFsbG93X2J5X2NvbnRhaW5lcl90eXBlIDE6IHRydWUiKQp9CgphbGxvd19ieV9jb250YWluZXJfdHlwZShpX2NyaV90eXBlLCBwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiBpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgaV9jcmlfdHlwZSA9PSAiY29udGFpbmVyIgoKICAgIGlfa2F0YV90eXBlIDo9IGlfb2NpLkFubm90YXRpb25zWyJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIl0KICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiBpX2thdGFfdHlwZSA9IiwgaV9rYXRhX3R5cGUpCiAgICBpX2thdGFfdHlwZSA9PSAicG9kX2NvbnRhaW5lciIKCiAgICBhbGxvd19jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpCiAgICBhbGxvd19uZXRfbmFtZXNwYWNlKHBfb2NpLCBpX29jaSkKICAgIGFsbG93X2xvZ19kaXJlY3RvcnkocF9vY2ksIGlfb2NpKQoKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiB0cnVlIikKfQoKIyAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLW5hbWUiIGFubm90YXRpb24KYWxsb3dfc2FuZGJveF9jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X2NvbnRhaW5lcl9uYW1lOiBzdGFydCIpCgogICAgY29udGFpbmVyX2Fubm90YXRpb25fbWlzc2luZyhwX29jaSwgaV9vY2ksICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItbmFtZSIpCgogICAgcHJpbnQoImFsbG93X3NhbmRib3hfY29udGFpbmVyX25hbWU6IHRydWUiKQp9CgphbGxvd19jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19jb250YWluZXJfbmFtZTogc3RhcnQiKQoKICAgIGFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uKHBfb2NpLCBpX29jaSwgImlvLmt1YmVybmV0ZXMuY3JpLmNvbnRhaW5lci1uYW1lIikKCiAgICBwcmludCgiYWxsb3dfY29udGFpbmVyX25hbWU6IHRydWUiKQp9Cgpjb250YWluZXJfYW5ub3RhdGlvbl9taXNzaW5nKHBfb2NpLCBpX29jaSwga2V5KSB7CiAgICBwcmludCgiY29udGFpbmVyX2Fubm90YXRpb25fbWlzc2luZzoiLCBrZXkpCgogICAgbm90IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIG5vdCBpX29jaS5Bbm5vdGF0aW9uc1trZXldCgogICAgcHJpbnQoImNvbnRhaW5lcl9hbm5vdGF0aW9uX21pc3Npbmc6IHRydWUiKQp9CgphbGxvd19jb250YWluZXJfYW5ub3RhdGlvbihwX29jaSwgaV9vY2ksIGtleSkgewogICAgcHJpbnQoImFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uOiBrZXkgPSIsIGtleSkKCiAgICBwX3ZhbHVlIDo9IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIGlfdmFsdWUgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgcHJpbnQoImFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uOiBwX3ZhbHVlID0iLCBwX3ZhbHVlLCAiaV92YWx1ZSA9IiwgaV92YWx1ZSkKCiAgICBwX3ZhbHVlID09IGlfdmFsdWUKCiAgICBwcmludCgiYWxsb3dfY29udGFpbmVyX2Fubm90YXRpb246IHRydWUiKQp9CgojICJuZXJkY3RsL25ldHdvcmstbmFtZXNwYWNlIiBhbm5vdGF0aW9uCmFsbG93X3NhbmRib3hfbmV0X25hbWVzcGFjZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X25ldF9uYW1lc3BhY2U6IHN0YXJ0IikKCiAgICBrZXkgOj0gIm5lcmRjdGwvbmV0d29yay1uYW1lc3BhY2UiCgogICAgcF9uYW1lc3BhY2UgOj0gcF9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgaV9uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgcHJpbnQoImFsbG93X3NhbmRib3hfbmV0X25hbWVzcGFjZTogcF9uYW1lc3BhY2UgPSIsIHBfbmFtZXNwYWNlLCAiaV9uYW1lc3BhY2UgPSIsIGlfbmFtZXNwYWNlKQoKICAgIHJlZ2V4Lm1hdGNoKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9uZXRfbmFtZXNwYWNlOiB0cnVlIikKfQoKYWxsb3dfbmV0X25hbWVzcGFjZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19uZXRfbmFtZXNwYWNlOiBzdGFydCIpCgogICAga2V5IDo9ICJuZXJkY3RsL25ldHdvcmstbmFtZXNwYWNlIgoKICAgIG5vdCBwX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICBub3QgaV9vY2kuQW5ub3RhdGlvbnNba2V5XQoKICAgIHByaW50KCJhbGxvd19uZXRfbmFtZXNwYWNlOiB0cnVlIikKfQoKIyAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1sb2ctZGlyZWN0b3J5IiBhbm5vdGF0aW9uCmFsbG93X3NhbmRib3hfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X2xvZ19kaXJlY3Rvcnk6IHN0YXJ0IikKCiAgICBrZXkgOj0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbG9nLWRpcmVjdG9yeSIKCiAgICBwX2RpciA6PSBwX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICByZWdleDEgOj0gcmVwbGFjZShwX2RpciwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHJlZ2V4MiA6PSByZXBsYWNlKHJlZ2V4MSwgIiQoc2FuZGJveC1uYW1lc3BhY2UpIiwgc19uYW1lc3BhY2UpCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiByZWdleDIgPSIsIHJlZ2V4MikKCiAgICBpX2RpciA6PSBpX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiBpX2RpciA9IiwgaV9kaXIpCgogICAgcmVnZXgubWF0Y2gocmVnZXgyLCBpX2RpcikKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiB0cnVlIikKfQoKYWxsb3dfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19sb2dfZGlyZWN0b3J5OiBzdGFydCIpCgogICAga2V5IDo9ICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWxvZy1kaXJlY3RvcnkiCgogICAgbm90IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIG5vdCBpX29jaS5Bbm5vdGF0aW9uc1trZXldCgogICAgcHJpbnQoImFsbG93X2xvZ19kaXJlY3Rvcnk6IHRydWUiKQp9CgphbGxvd19kZXZpY2VzKHBfZGV2aWNlcywgaV9kZXZpY2VzKSB7CiAgICBwcmludCgiYWxsb3dfZGV2aWNlczogc3RhcnQiKQogICAgZXZlcnkgaV9kZXZpY2UgaW4gaV9kZXZpY2VzIHsKICAgICAgICBwcmludCgiYWxsb3dfZGV2aWNlczogaV9kZXZpY2UgPSIsIGlfZGV2aWNlKQogICAgICAgIHNvbWUgcF9kZXZpY2UgaW4gcF9kZXZpY2VzCiAgICAgICAgcF9kZXZpY2UuY29udGFpbmVyX3BhdGggPT0gaV9kZXZpY2UuY29udGFpbmVyX3BhdGgKICAgIH0KICAgIHByaW50KCJhbGxvd19kZXZpY2VzOiB0cnVlIikKfQoKYWxsb3dfbGludXgoc3RhdGVfb3BzLCBwX29jaSwgaV9vY2kpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIHBfbmFtZXNwYWNlcyA6PSBwX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbGludXg6IHAgbmFtZXNwYWNlcyA9IiwgcF9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlcyA6PSBpX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbGludXg6IGkgbmFtZXNwYWNlcyA9IiwgaV9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlX3dpdGhvdXRfbmV0d29yayA6PSBbb2JqIHwgb2JqIDo9IGlfbmFtZXNwYWNlc1tfXTsgb2JqLlR5cGUgIT0gIm5ldHdvcmsiXQoKICAgIHByaW50KCJhbGxvd19saW51eDogaV9uYW1lc3BhY2Vfd2l0aG91dF9uZXR3b3JrID0iLCBpX25hbWVzcGFjZV93aXRob3V0X25ldHdvcmspCgogICAgcF9uYW1lc3BhY2VzID09IGlfbmFtZXNwYWNlX3dpdGhvdXRfbmV0d29yawoKICAgIGFsbG93X21hc2tlZF9wYXRocyhwX29jaSwgaV9vY2kpCiAgICBhbGxvd19yZWFkb25seV9wYXRocyhwX29jaSwgaV9vY2kpCiAgICBhbGxvd19saW51eF9kZXZpY2VzKHBfb2NpLkxpbnV4LkRldmljZXMsIGlfb2NpLkxpbnV4LkRldmljZXMpCiAgICBhbGxvd19saW51eF9zeXNjdGwocF9vY2kuTGludXgsIGlfb2NpLkxpbnV4KQogICAgcmV0IDo9IGFsbG93X25ldHdvcmtfbmFtZXNwYWNlX3N0YXJ0KHN0YXRlX29wcywgcF9vY2ksIGlfb2NpKQogICAgcmV0LmFsbG93ZWQKCiAgICBvcHMgOj0gcmV0Lm9wcwoKICAgIHByaW50KCJhbGxvd19saW51eDogdHJ1ZSIpCn0KCiMgUmV0cmlldmUgdGhlICJuZXR3b3JrIiBuYW1lc3BhY2UgZnJvbSB0aGUgaW5wdXQgZGF0YSBhbmQgcGFzcyBpdCBvbiBmb3IgdGhlCiMgbmV0d29yayBuYW1lc3BhY2UgcG9saWN5IGNoZWNrcy4KYWxsb3dfbmV0d29ya19uYW1lc3BhY2Vfc3RhcnQoc3RhdGVfb3BzLCBwX29jaSwgaV9vY2kpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIHByaW50KCJhbGxvd19uZXR3b3JrX25hbWVzcGFjZSBzdGFydDogc3RhcnQiKQoKICAgIHBfbmFtZXNwYWNlcyA6PSBwX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IHAgbmFtZXNwYWNlcyA9IiwgcF9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlcyA6PSBpX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IGkgbmFtZXNwYWNlcyA9IiwgaV9uYW1lc3BhY2VzKQoKICAgICMgUmV0dXJuIHBhdGggb2YgdGhlICJuZXR3b3JrIiBuYW1lc3BhY2UKICAgIG5ldHdvcmtfbnMgOj0gW29iaiB8IG9iaiA6PSBpX25hbWVzcGFjZXNbX107IG9iai5UeXBlID09ICJuZXR3b3JrIl0KCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IG5ldHdvcmtfbnMgPSIsIG5ldHdvcmtfbnMpCgogICAgcmV0IDo9IGFsbG93X25ldHdvcmtfbmFtZXNwYWNlKHN0YXRlX29wcywgbmV0d29ya19ucykKICAgIHJldC5hbGxvd2VkCgogICAgb3BzIDo9IHJldC5vcHMKfQoKIyBUaGlzIHJ1bGUgaXMgd2hlbiB0aGVyZSdzIG5vIG5ldHdvcmsgbmFtZXNwYWNlIGluIHRoZSBpbnB1dCBkYXRhLgphbGxvd19uZXR3b3JrX25hbWVzcGFjZShzdGF0ZV9vcHMsIG5ldHdvcmtfbnMpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIGNvdW50KG5ldHdvcmtfbnMpID09IDAKCiAgICBuZXR3b3JrX25zX3BhdGggPSAiIgoKICAgIGFkZF9uZXR3b3JrX25hbWVzcGFjZV90b19zdGF0ZSA6PSBzdGF0ZV9hbGxvd3MoIm5ldHdvcmtfbmFtZXNwYWNlIiwgbmV0d29ya19uc19wYXRoKQogICAgb3BzIDo9IGNvbmNhdF9vcF9pZl9ub3RfbnVsbChzdGF0ZV9vcHMsIGFkZF9uZXR3b3JrX25hbWVzcGFjZV90b19zdGF0ZSkKCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2UgMTogdHJ1ZSIpCn0KCiMgVGhpcyBydWxlIGlzIHdoZW4gdGhlcmUncyBleGFjdGx5IG9uZSBuZXR3b3JrIG5hbWVzcGFjZSBpbiB0aGUgaW5wdXQgZGF0YS4KYWxsb3dfbmV0d29ya19uYW1lc3BhY2Uoc3RhdGVfb3BzLCBuZXR3b3JrX25zKSA6PSB7Im9wcyI6IG9wcywgImFsbG93ZWQiOiB0cnVlfSB7CiAgICBjb3VudChuZXR3b3JrX25zKSA9PSAxCgogICAgYWRkX25ldHdvcmtfbmFtZXNwYWNlX3RvX3N0YXRlIDo9IHN0YXRlX2FsbG93cygibmV0d29ya19uYW1lc3BhY2UiLCBuZXR3b3JrX25zWzBdLlBhdGgpCiAgICBvcHMgOj0gY29uY2F0X29wX2lmX25vdF9udWxsKHN0YXRlX29wcywgYWRkX25ldHdvcmtfbmFtZXNwYWNlX3RvX3N0YXRlKQoKICAgIHByaW50KCJhbGxvd19uZXR3b3JrX25hbWVzcGFjZSAyOiB0cnVlIikKfQoKYWxsb3dfbWFza2VkX3BhdGhzKHBfb2NpLCBpX29jaSkgewogICAgcF9wYXRocyA6PSBwX29jaS5MaW51eC5NYXNrZWRQYXRocwogICAgcHJpbnQoImFsbG93X21hc2tlZF9wYXRocyAxOiBwX3BhdGhzID0iLCBwX3BhdGhzKQoKICAgIGlfcGF0aHMgOj0gaV9vY2kuTGludXguTWFza2VkUGF0aHMKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aHMgMTogaV9wYXRocyA9IiwgaV9wYXRocykKCiAgICBhbGxvd19tYXNrZWRfcGF0aHNfYXJyYXkocF9wYXRocywgaV9wYXRocykKCiAgICBwcmludCgiYWxsb3dfbWFza2VkX3BhdGhzIDE6IHRydWUiKQp9CmFsbG93X21hc2tlZF9wYXRocyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aHMgMjogc3RhcnQiKQoKICAgIG5vdCBwX29jaS5MaW51eC5NYXNrZWRQYXRocwogICAgbm90IGlfb2NpLkxpbnV4Lk1hc2tlZFBhdGhzCgogICAgcHJpbnQoImFsbG93X21hc2tlZF9wYXRocyAyOiB0cnVlIikKfQoKIyBBbGwgdGhlIHBvbGljeSBtYXNrZWQgcGF0aHMgbXVzdCBiZSBtYXNrZWQgaW4gdGhlIGlucHV0IGRhdGEgdG9vLgojIElucHV0IGlzIGFsbG93ZWQgdG8gaGF2ZSBtb3JlIG1hc2tlZCBwYXRocyB0aGFuIHRoZSBwb2xpY3kuCmFsbG93X21hc2tlZF9wYXRoc19hcnJheShwX2FycmF5LCBpX2FycmF5KSB7CiAgICBldmVyeSBwX2VsZW0gaW4gcF9hcnJheSB7CiAgICAgICAgYWxsb3dfbWFza2VkX3BhdGgocF9lbGVtLCBpX2FycmF5KQogICAgfQp9CgphbGxvd19tYXNrZWRfcGF0aChwX2VsZW0sIGlfYXJyYXkpIHsKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aDogcF9lbGVtID0iLCBwX2VsZW0pCgogICAgc29tZSBpX2VsZW0gaW4gaV9hcnJheQogICAgcF9lbGVtID09IGlfZWxlbQoKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aDogdHJ1ZSIpCn0KCmFsbG93X3JlYWRvbmx5X3BhdGhzKHBfb2NpLCBpX29jaSkgewogICAgcF9wYXRocyA6PSBwX29jaS5MaW51eC5SZWFkb25seVBhdGhzCiAgICBwcmludCgiYWxsb3dfcmVhZG9ubHlfcGF0aHMgMTogcF9wYXRocyA9IiwgcF9wYXRocykKCiAgICBpX3BhdGhzIDo9IGlfb2NpLkxpbnV4LlJlYWRvbmx5UGF0aHMKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAxOiBpX3BhdGhzID0iLCBpX3BhdGhzKQoKICAgIGFsbG93X3JlYWRvbmx5X3BhdGhzX2FycmF5KHBfcGF0aHMsIGlfcGF0aHMsIGlfb2NpLkxpbnV4Lk1hc2tlZFBhdGhzKQoKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAxOiB0cnVlIikKfQphbGxvd19yZWFkb25seV9wYXRocyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAyOiBzdGFydCIpCgogICAgbm90IHBfb2NpLkxpbnV4LlJlYWRvbmx5UGF0aHMKICAgIG5vdCBpX29jaS5MaW51eC5SZWFkb25seVBhdGhzCgogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGhzIDI6IHRydWUiKQp9CgojIEFsbCB0aGUgcG9saWN5IHJlYWRvbmx5IHBhdGhzIG11c3QgYmUgZWl0aGVyOgojIC0gUHJlc2VudCBpbiB0aGUgaW5wdXQgcmVhZG9ubHkgcGF0aHMsIG9yCiMgLSBQcmVzZW50IGluIHRoZSBpbnB1dCBtYXNrZWQgcGF0aHMuCiMgSW5wdXQgaXMgYWxsb3dlZCB0byBoYXZlIG1vcmUgcmVhZG9ubHkgcGF0aHMgdGhhbiB0aGUgcG9saWN5LgphbGxvd19yZWFkb25seV9wYXRoc19hcnJheShwX2FycmF5LCBpX2FycmF5LCBtYXNrZWRfcGF0aHMpIHsKICAgIGV2ZXJ5IHBfZWxlbSBpbiBwX2FycmF5IHsKICAgICAgICBhbGxvd19yZWFkb25seV9wYXRoKHBfZWxlbSwgaV9hcnJheSwgbWFza2VkX3BhdGhzKQogICAgfQp9CgphbGxvd19yZWFkb25seV9wYXRoKHBfZWxlbSwgaV9hcnJheSwgbWFza2VkX3BhdGhzKSB7CiAgICBwcmludCgiYWxsb3dfcmVhZG9ubHlfcGF0aCAxOiBwX2VsZW0gPSIsIHBfZWxlbSkKCiAgICBzb21lIGlfZWxlbSBpbiBpX2FycmF5CiAgICBwX2VsZW0gPT0gaV9lbGVtCgogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGggMTogdHJ1ZSIpCn0KYWxsb3dfcmVhZG9ubHlfcGF0aChwX2VsZW0sIGlfYXJyYXksIG1hc2tlZF9wYXRocykgewogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGggMjogcF9lbGVtID0iLCBwX2VsZW0pCgogICAgc29tZSBpX21hc2tlZCBpbiBtYXNrZWRfcGF0aHMKICAgIHBfZWxlbSA9PSBpX21hc2tlZAoKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRoIDI6IHRydWUiKQp9CgphbGxvd19saW51eF9kZXZpY2VzKHBfZGV2aWNlcywgaV9kZXZpY2VzKSB7CiAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogc3RhcnQiKQogICAgZXZlcnkgaV9kZXZpY2UgaW4gaV9kZXZpY2VzIHsKICAgICAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogaV9kZXZpY2UgPSIsIGlfZGV2aWNlKQogICAgICAgIHNvbWUgcF9kZXZpY2UgaW4gcF9kZXZpY2VzCiAgICAgICAgaV9kZXZpY2UuUGF0aCA9PSBwX2RldmljZS5QYXRoCiAgICB9CiAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogdHJ1ZSIpCn0KCmFsbG93X2xpbnV4X3N5c2N0bChwX2xpbnV4LCBpX2xpbnV4KSB7CiAgICBwcmludCgiYWxsb3dfbGludXhfc3lzY3RsIDE6IHN0YXJ0IikKICAgIG5vdCBpX2xpbnV4LlN5c2N0bAogICAgcHJpbnQoImFsbG93X2xpbnV4X3N5c2N0bCAxOiB0cnVlIikKfQoKYWxsb3dfbGludXhfc3lzY3RsKHBfbGludXgsIGlfbGludXgpIHsKICAgIHByaW50KCJhbGxvd19saW51eF9zeXNjdGwgMjogc3RhcnQiKQogICAgcF9zeXNjdGwgOj0gcF9saW51eC5TeXNjdGwKICAgIGlfc3lzY3RsIDo9IGlfbGludXguU3lzY3RsCiAgICBldmVyeSBpX25hbWUsIGlfdmFsIGluIGlfc3lzY3RsIHsKICAgICAgICBwcmludCgiYWxsb3dfbGludXhfc3lzY3RsIDI6IGlfbmFtZSA9IiwgaV9uYW1lLCAiaV92YWwgPSIsIGlfdmFsKQogICAgICAgIHBfc3lzY3RsW2lfbmFtZV0gPT0gaV92YWwKICAgIH0KICAgIHByaW50KCJhbGxvd19saW51eF9zeXNjdGwgMjogdHJ1ZSIpCn0KCiMgQ2hlY2sgdGhlIGNvbnNpc3RlbmN5IG9mIHRoZSBpbnB1dCAiaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5idW5kbGVfcGF0aCIKIyBhbmQgaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCIgdmFsdWVzIHdpdGggb3RoZXIgZmllbGRzLgphbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZChwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpIHsKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogc3RhcnQiKQoKICAgIGJ1bmRsZV9wYXRoIDo9IGlfb2NpLkFubm90YXRpb25zWyJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmJ1bmRsZV9wYXRoIl0KICAgIGJ1bmRsZV9pZCA6PSByZXBsYWNlKGJ1bmRsZV9wYXRoLCAiL3J1bi9jb250YWluZXJkL2lvLmNvbnRhaW5lcmQucnVudGltZS52Mi50YXNrL2s4cy5pby8iLCAiIikKCiAgICBidW5kbGVfaWRfZm9ybWF0IDo9IGNvbmNhdCgiIiwgWyJeIiwgQlVORExFX0lELCAiJCJdKQogICAgcmVnZXgubWF0Y2goYnVuZGxlX2lkX2Zvcm1hdCwgYnVuZGxlX2lkKQoKICAgIGtleSA6PSAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCIKCiAgICBwX3JlZ2V4IDo9IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIHNhbmRib3hfaWQgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQoKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogc2FuZGJveF9pZCA9Iiwgc2FuZGJveF9pZCwgInJlZ2V4ID0iLCBwX3JlZ2V4KQogICAgcmVnZXgubWF0Y2gocF9yZWdleCwgc2FuZGJveF9pZCkKCiAgICBhbGxvd19yb290X3BhdGgocF9vY2ksIGlfb2NpLCBidW5kbGVfaWQpCgogICAgZXZlcnkgaV9tb3VudCBpbiBpX29jaS5Nb3VudHMgewogICAgICAgIGFsbG93X21vdW50KHBfb2NpLCBpX21vdW50LCBpX3N0b3JhZ2VzLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpCiAgICB9CgogICAgYWxsb3dfc3RvcmFnZXMocF9zdG9yYWdlcywgaV9zdG9yYWdlcywgYnVuZGxlX2lkLCBzYW5kYm94X2lkKQoKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogdHJ1ZSIpCn0KCmFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHBfcHJvY2VzcyA9IiwgcF9wcm9jZXNzKQogICAgcHJpbnQoImFsbG93X3Byb2Nlc3NfY29tbW9uOiBpX3Byb2Nlc3MgPSAiLCBpX3Byb2Nlc3MpCiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHNfbmFtZSA9Iiwgc19uYW1lKQoKICAgIHBfcHJvY2Vzcy5Dd2QgPT0gaV9wcm9jZXNzLkN3ZAogICAgcF9wcm9jZXNzLk5vTmV3UHJpdmlsZWdlcyA9PSBpX3Byb2Nlc3MuTm9OZXdQcml2aWxlZ2VzCgogICAgYWxsb3dfdXNlcihwX3Byb2Nlc3MsIGlfcHJvY2VzcykKICAgIGFsbG93X2VudihwX3Byb2Nlc3MsIGlfcHJvY2Vzcywgc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHRydWUiKQp9CgojIENvbXBhcmUgdGhlIE9DSSBQcm9jZXNzIGZpZWxkIG9mIGEgcG9saWN5IGNvbnRhaW5lciB3aXRoIHRoZSBpbnB1dCBPQ0kgUHJvY2VzcyBmcm9tIGEgQ3JlYXRlQ29udGFpbmVyUmVxdWVzdAphbGxvd19wcm9jZXNzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfcHJvY2Vzczogc3RhcnQiKQoKICAgIGFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgYWxsb3dfY2FwcyhwX3Byb2Nlc3MuQ2FwYWJpbGl0aWVzLCBpX3Byb2Nlc3MuQ2FwYWJpbGl0aWVzKQogICAgcF9wcm9jZXNzLlRlcm1pbmFsID09IGlfcHJvY2Vzcy5UZXJtaW5hbAoKICAgIHByaW50KCJhbGxvd19wcm9jZXNzOiB0cnVlIikKfQoKIyBDb21wYXJlIHRoZSBPQ0kgUHJvY2VzcyBmaWVsZCBvZiBhIHBvbGljeSBjb250YWluZXIgd2l0aCB0aGUgaW5wdXQgcHJvY2VzcyBmaWVsZCBmcm9tIEV4ZWNQcm9jZXNzUmVxdWVzdAphbGxvd19pbnRlcmFjdGl2ZV9wcm9jZXNzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfaW50ZXJhY3RpdmVfcHJvY2Vzczogc3RhcnQiKQoKICAgIGFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgYWxsb3dfZXhlY19jYXBzKGlfcHJvY2Vzcy5DYXBhYmlsaXRpZXMpCgogICAgIyBUaGVzZSBhcmUgY29tbWFuZHMgZW5hYmxlZCB1c2luZyBFeGVjUHJvY2Vzc1JlcXVlc3QgY29tbWFuZHMgYW5kL29yIHJlZ2V4IGZyb20gdGhlIHNldHRpbmdzIGZpbGUuCiAgICAjIFRoZXkgY2FuIGJlIGV4ZWN1dGVkIGludGVyYWN0aXZlbHkgc28gYWxsb3cgdGhlbSB0byB1c2UgYW55IHZhbHVlIGZvciBpX3Byb2Nlc3MuVGVybWluYWwuCgogICAgcHJpbnQoImFsbG93X2ludGVyYWN0aXZlX3Byb2Nlc3M6IHRydWUiKQp9CgojIENvbXBhcmUgdGhlIE9DSSBQcm9jZXNzIGZpZWxkIG9mIGEgcG9saWN5IGNvbnRhaW5lciB3aXRoIHRoZSBpbnB1dCBwcm9jZXNzIGZpZWxkIGZyb20gRXhlY1Byb2Nlc3NSZXF1ZXN0CmFsbG93X3Byb2JlX3Byb2Nlc3MocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19wcm9iZV9wcm9jZXNzOiBzdGFydCIpCgogICAgYWxsb3dfcHJvY2Vzc19jb21tb24ocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpCiAgICBhbGxvd19leGVjX2NhcHMoaV9wcm9jZXNzLkNhcGFiaWxpdGllcykKICAgIHBfcHJvY2Vzcy5UZXJtaW5hbCA9PSBpX3Byb2Nlc3MuVGVybWluYWwKCiAgICBwcmludCgiYWxsb3dfcHJvYmVfcHJvY2VzczogdHJ1ZSIpCn0KCmFsbG93X3VzZXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MpIHsKICAgIHBfdXNlciA6PSBwX3Byb2Nlc3MuVXNlcgogICAgaV91c2VyIDo9IGlfcHJvY2Vzcy5Vc2VyCgogICAgcHJpbnQoImFsbG93X3VzZXI6IGlucHV0IHVpZCA9IiwgaV91c2VyLlVJRCwgInBvbGljeSB1aWQgPSIsIHBfdXNlci5VSUQpCiAgICBwX3VzZXIuVUlEID09IGlfdXNlci5VSUQKCiAgICAjIFRPRE86IHRyYWNrIGRvd24gdGhlIHJlYXNvbiBmb3IgcmVnaXN0cnkuazhzLmlvL3BhdXNlOjMuOSBiZWluZwogICAgIyAgICAgICBleGVjdXRlZCB3aXRoIGdpZCA9IDAgZGVzcGl0ZSBoYXZpbmcgIjY1NTM1OjY1NTM1IiBpbiBpdHMgY29udGFpbmVyIGltYWdlCiAgICAjICAgICAgIGNvbmZpZy4KICAgICNwcmludCgiYWxsb3dfdXNlcjogaW5wdXQgZ2lkID0iLCBpX3VzZXIuR0lELCAicG9saWN5IGdpZCA9IiwgcF91c2VyLkdJRCkKICAgICNwX3VzZXIuR0lEID09IGlfdXNlci5HSUQKCiAgICAjIFRPRE86IGNvbXBhcmUgdGhlIGFkZGl0aW9uYWxHaWRzIGZpZWxkIHRvbyBhZnRlciBjb21wdXRpbmcgaXRzIHZhbHVlCiAgICAjIGJhc2VkIG9uIC9ldGMvcGFzc3dkIGFuZCAvZXRjL2dyb3VwIGZyb20gdGhlIGNvbnRhaW5lciBpbWFnZS4KfQoKYWxsb3dfZGVwcmVjYXRlZF9hcmdzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZ3MgMTogbm8gYXJncyIpCgogICAgbm90IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJncwogICAgbm90IGlfcHJvY2Vzcy5BcmdzCgogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAxOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZ3MocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSkgewogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiBwb2xpY3kgYXJncyA9IiwgcF9wcm9jZXNzLkRlcHJlY2F0ZWRBcmdzKQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiBpbnB1dCBhcmdzID0iLCBpX3Byb2Nlc3MuQXJncykKCiAgICBjb3VudChwX3Byb2Nlc3MuRGVwcmVjYXRlZEFyZ3MpID09IGNvdW50KGlfcHJvY2Vzcy5BcmdzKQoKICAgIGV2ZXJ5IGksIGlfYXJnIGluIGlfcHJvY2Vzcy5BcmdzIHsKICAgICAgICBhbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpCiAgICB9CgogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDE6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgcF9hcmcyIDo9IHJlcGxhY2UocF9hcmcsICIkJCIsICIkIikKICAgIHBfYXJnMiA9PSBpX2FyZwoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAxOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDI6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgIyBUT0RPOiBjYW4gJChub2RlLW5hbWUpIGJlIGhhbmRsZWQgYmV0dGVyPwogICAgY29udGFpbnMocF9hcmcsICIkKG5vZGUtbmFtZSkiKQoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAyOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDM6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgcF9hcmcyIDo9IHJlcGxhY2UocF9hcmcsICIkJCIsICIkIikKICAgIHBfYXJnMyA6PSByZXBsYWNlKHBfYXJnMiwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAzOiBwX2FyZzMgPSIsIHBfYXJnMykKICAgIHBfYXJnMyA9PSBpX2FyZwoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAzOiB0cnVlIikKfQoKIyBPQ0kgcHJvY2Vzcy5FbnYgZmllbGQKYWxsb3dfZW52KHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfZW52OiBwIGVudiA9IiwgcF9wcm9jZXNzLkVudikKICAgIHByaW50KCJhbGxvd19lbnY6IGkgZW52ID0iLCBpX3Byb2Nlc3MuRW52KQoKICAgIGV2ZXJ5IGlfdmFyIGluIGlfcHJvY2Vzcy5FbnYgewogICAgICAgIHByaW50KCJhbGxvd19lbnY6IGlfdmFyID0iLCBpX3ZhcikKICAgICAgICBhbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgfQoKICAgIHByaW50KCJhbGxvd19lbnY6IHRydWUiKQp9CgojIEFsbG93IGlucHV0IGVudiB2YXJpYWJsZXMgdGhhdCBhcmUgcHJlc2VudCBpbiB0aGUgcG9saWN5IGRhdGEgdG9vLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHBfdmFyID09IGlfdmFyCiAgICBwcmludCgiYWxsb3dfdmFyIDE6IHRydWUiKQp9CgojIE1hdGNoIGlucHV0IHdpdGggb25lIG9mIHRoZSBwb2xpY3kgdmFyaWFibGVzLCBhZnRlciBzdWJzdGl0dXRpbmcgJChzYW5kYm94LW5hbWUpLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHByaW50KCJhbGxvd192YXIgMjogcF92YXIgPSIsIHBfdmFyKQoKICAgIHBfdmFyX3NwbGl0IDo9IHNwbGl0KHBfdmFyLCAiPSIpCiAgICBjb3VudChwX3Zhcl9zcGxpdCkgPT0gMgoKICAgIHBfdmFyX3NwbGl0WzFdID09ICIkKHNhbmRib3gtbmFtZSkiCgogICAgaV92YXJfc3BsaXQgOj0gc3BsaXQoaV92YXIsICI9IikKICAgIGNvdW50KGlfdmFyX3NwbGl0KSA9PSAyCgogICAgaV92YXJfc3BsaXRbMF0gPT0gcF92YXJfc3BsaXRbMF0KICAgIHJlZ2V4Lm1hdGNoKHNfbmFtZSwgaV92YXJfc3BsaXRbMV0pCgogICAgcHJpbnQoImFsbG93X3ZhciAyOiB0cnVlIikKfQoKIyBBbGxvdyBpbnB1dCBlbnYgdmFyaWFibGVzIHRoYXQgbWF0Y2ggd2l0aCBhIHJlcXVlc3RfZGVmYXVsdHMgcmVnZXguCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHNvbWUgcF9yZWdleDEgaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5DcmVhdGVDb250YWluZXJSZXF1ZXN0LmFsbG93X2Vudl9yZWdleAogICAgcF9yZWdleDIgOj0gcmVwbGFjZShwX3JlZ2V4MSwgIiQoaXB2NF9hKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcHY0X2EpCiAgICBwX3JlZ2V4MyA6PSByZXBsYWNlKHBfcmVnZXgyLCAiJChpcF9wKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcF9wKQogICAgcF9yZWdleDQgOj0gcmVwbGFjZShwX3JlZ2V4MywgIiQoc3ZjX25hbWUpIiwgcG9saWN5X2RhdGEuY29tbW9uLnN2Y19uYW1lKQogICAgcF9yZWdleDUgOj0gcmVwbGFjZShwX3JlZ2V4NCwgIiQoZG5zX2xhYmVsKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5kbnNfbGFiZWwpCgogICAgcHJpbnQoImFsbG93X3ZhciAzOiBwX3JlZ2V4NSA9IiwgcF9yZWdleDUpCiAgICByZWdleC5tYXRjaChwX3JlZ2V4NSwgaV92YXIpCgogICAgcHJpbnQoImFsbG93X3ZhciAzOiB0cnVlIikKfQoKIyBBbGxvdyBmaWVsZFJlZiAiZmllbGRQYXRoOiBzdGF0dXMucG9kSVAiIHZhbHVlcy4KYWxsb3dfdmFyKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBpX3Zhciwgc19uYW1lLCBzX25hbWVzcGFjZSkgewogICAgbmFtZV92YWx1ZSA6PSBzcGxpdChpX3ZhciwgIj0iKQogICAgY291bnQobmFtZV92YWx1ZSkgPT0gMgogICAgaXNfaXAobmFtZV92YWx1ZVsxXSkKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIGFsbG93X3BvZF9pcF92YXIobmFtZV92YWx1ZVswXSwgcF92YXIpCgogICAgcHJpbnQoImFsbG93X3ZhciA0OiB0cnVlIikKfQoKIyBBbGxvdyBjb21tb24gZmllbGRSZWYgdmFyaWFibGVzLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBuYW1lX3ZhbHVlIDo9IHNwbGl0KGlfdmFyLCAiPSIpCiAgICBjb3VudChuYW1lX3ZhbHVlKSA9PSAyCgogICAgc29tZSBwX3ZhciBpbiBwX3Byb2Nlc3MuRW52CiAgICBwX25hbWVfdmFsdWUgOj0gc3BsaXQocF92YXIsICI9IikKICAgIGNvdW50KHBfbmFtZV92YWx1ZSkgPT0gMgoKICAgIHBfbmFtZV92YWx1ZVswXSA9PSBuYW1lX3ZhbHVlWzBdCgogICAgIyBUT0RPOiBzaG91bGQgdGhlc2UgYmUgaGFuZGxlZCBpbiBhIGRpZmZlcmVudCB3YXk/CiAgICBhbHdheXNfYWxsb3dlZCA6PSBbIiQoaG9zdC1uYW1lKSIsICIkKG5vZGUtbmFtZSkiLCAiJChwb2QtdWlkKSJdCiAgICBzb21lIGFsbG93ZWQgaW4gYWx3YXlzX2FsbG93ZWQKICAgIGNvbnRhaW5zKHBfbmFtZV92YWx1ZVsxXSwgYWxsb3dlZCkKCiAgICBwcmludCgiYWxsb3dfdmFyIDU6IHRydWUiKQp9CgojIEFsbG93IGZpZWxkUmVmICJmaWVsZFBhdGg6IHN0YXR1cy5ob3N0SVAiIHZhbHVlcy4KYWxsb3dfdmFyKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBpX3Zhciwgc19uYW1lLCBzX25hbWVzcGFjZSkgewogICAgbmFtZV92YWx1ZSA6PSBzcGxpdChpX3ZhciwgIj0iKQogICAgY291bnQobmFtZV92YWx1ZSkgPT0gMgogICAgaXNfaXAobmFtZV92YWx1ZVsxXSkKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIGFsbG93X2hvc3RfaXBfdmFyKG5hbWVfdmFsdWVbMF0sIHBfdmFyKQoKICAgIHByaW50KCJhbGxvd192YXIgNjogdHJ1ZSIpCn0KCiMgQWxsb3cgcmVzb3VyY2VGaWVsZFJlZiB2YWx1ZXMgKGUuZy4sICJsaW1pdHMuY3B1IikuCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIG5hbWVfdmFsdWUgOj0gc3BsaXQoaV92YXIsICI9IikKICAgIGNvdW50KG5hbWVfdmFsdWUpID09IDIKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHBfbmFtZV92YWx1ZSA6PSBzcGxpdChwX3ZhciwgIj0iKQogICAgY291bnQocF9uYW1lX3ZhbHVlKSA9PSAyCgogICAgcF9uYW1lX3ZhbHVlWzBdID09IG5hbWVfdmFsdWVbMF0KCiAgICAjIGEgdmFyaWFibGUgd2Ugc2hvdWxkIGJlIHZhbGlkYXRpbmcgdXNpbmcgYSByZWdleCBmcm9tIHNldHRpbmdzCiAgICBwX25hbWVfdmFsdWVbMV0gPT0gIiQodmFsaWRhdGUtZnJvbS1zZXR0aW5ncykiCgogICAgcmVnZXhfdmFsIDo9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuQ3JlYXRlQ29udGFpbmVyUmVxdWVzdC5hbGxvd19lbnZfcmVnZXhfbWFwW25hbWVfdmFsdWVbMF1dCgogICAgcHJpbnQoImFsbG93X3ZhciA3OiB2YWwgPSIsIG5hbWVfdmFsdWVbMV0pCiAgICBwcmludCgiYWxsb3dfdmFyIDc6IHJlZ2V4X3ZhbCA9IiwgcmVnZXhfdmFsKQoKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4X3ZhbCwgbmFtZV92YWx1ZVsxXSkKCiAgICBwcmludCgiYWxsb3dfdmFyIDc6IHRydWUiKQp9CgojIE1hdGNoIGlucHV0IHdpdGggb25lIG9mIHRoZSBwb2xpY3kgdmFyaWFibGVzLCBhZnRlciBzdWJzdGl0dXRpbmcgJChzYW5kYm94LW5hbWVzcGFjZSkuCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHNvbWUgcF92YXIgaW4gcF9wcm9jZXNzLkVudgogICAgcF92YXIyIDo9IHJlcGxhY2UocF92YXIsICIkKHNhbmRib3gtbmFtZXNwYWNlKSIsIHNfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd192YXIgODogcF92YXIyID0iLCBwX3ZhcjIpCiAgICBwX3ZhcjIgPT0gaV92YXIKCiAgICBwcmludCgiYWxsb3dfdmFyIDg6IHRydWUiKQp9CgphbGxvd19wb2RfaXBfdmFyKHZhcl9uYW1lLCBwX3ZhcikgewogICAgcHJpbnQoImFsbG93X3BvZF9pcF92YXI6IHZhcl9uYW1lID0iLCB2YXJfbmFtZSwgInBfdmFyID0iLCBwX3ZhcikKCiAgICBwX25hbWVfdmFsdWUgOj0gc3BsaXQocF92YXIsICI9IikKICAgIGNvdW50KHBfbmFtZV92YWx1ZSkgPT0gMgoKICAgIHBfbmFtZV92YWx1ZVswXSA9PSB2YXJfbmFtZQogICAgcF9uYW1lX3ZhbHVlWzFdID09ICIkKHBvZC1pcCkiCgogICAgcHJpbnQoImFsbG93X3BvZF9pcF92YXI6IHRydWUiKQp9CgphbGxvd19ob3N0X2lwX3Zhcih2YXJfbmFtZSwgcF92YXIpIHsKICAgIHByaW50KCJhbGxvd19ob3N0X2lwX3ZhcjogdmFyX25hbWUgPSIsIHZhcl9uYW1lLCAicF92YXIgPSIsIHBfdmFyKQoKICAgIHBfbmFtZV92YWx1ZSA6PSBzcGxpdChwX3ZhciwgIj0iKQogICAgY291bnQocF9uYW1lX3ZhbHVlKSA9PSAyCgogICAgcF9uYW1lX3ZhbHVlWzBdID09IHZhcl9uYW1lCiAgICBwX25hbWVfdmFsdWVbMV0gPT0gIiQoaG9zdC1pcCkiCgogICAgcHJpbnQoImFsbG93X2hvc3RfaXBfdmFyOiB0cnVlIikKfQoKaXNfaXAodmFsdWUpIHsKICAgIGJ5dGVzID0gc3BsaXQodmFsdWUsICIuIikKICAgIGNvdW50KGJ5dGVzKSA9PSA0CgogICAgaXNfaXBfZmlyc3RfYnl0ZShieXRlc1swXSkKICAgIGlzX2lwX290aGVyX2J5dGUoYnl0ZXNbMV0pCiAgICBpc19pcF9vdGhlcl9ieXRlKGJ5dGVzWzJdKQogICAgaXNfaXBfb3RoZXJfYnl0ZShieXRlc1szXSkKfQppc19pcF9maXJzdF9ieXRlKGNvbXBvbmVudCkgewogICAgbnVtYmVyID0gdG9fbnVtYmVyKGNvbXBvbmVudCkKICAgIG51bWJlciA+PSAxCiAgICBudW1iZXIgPD0gMjU1Cn0KaXNfaXBfb3RoZXJfYnl0ZShjb21wb25lbnQpIHsKICAgIG51bWJlciA9IHRvX251bWJlcihjb21wb25lbnQpCiAgICBudW1iZXIgPj0gMAogICAgbnVtYmVyIDw9IDI1NQp9CgojIE9DSSByb290LlBhdGgKYWxsb3dfcm9vdF9wYXRoKHBfb2NpLCBpX29jaSwgYnVuZGxlX2lkKSB7CiAgICBpX3BhdGggOj0gaV9vY2kuUm9vdC5QYXRoCiAgICBwX3BhdGgxIDo9IHBfb2NpLlJvb3QuUGF0aAogICAgcHJpbnQoImFsbG93X3Jvb3RfcGF0aDogaV9wYXRoID0iLCBpX3BhdGgsICJwX3BhdGgxID0iLCBwX3BhdGgxKQoKICAgIHBfcGF0aDIgOj0gcmVwbGFjZShwX3BhdGgxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfcm9vdF9wYXRoOiBwX3BhdGgyID0iLCBwX3BhdGgyKQoKICAgIHBfcGF0aDMgOj0gcmVwbGFjZShwX3BhdGgyLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X3Jvb3RfcGF0aDogcF9wYXRoMyA9IiwgcF9wYXRoMykKCiAgICBwX3BhdGgzID09IGlfcGF0aAoKICAgIHByaW50KCJhbGxvd19yb290X3BhdGg6IHRydWUiKQp9CgojIGRldmljZSBtb3VudHMKYWxsb3dfbW91bnQocF9vY2ksIGlfbW91bnQsIGlfc3RvcmFnZXMsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcHJpbnQoImFsbG93X21vdW50OiBpX21vdW50ID0iLCBpX21vdW50KQoKICAgIHNvbWUgcF9tb3VudCBpbiBwX29jaS5Nb3VudHMKICAgIHNvbWUgaV9zdG9yYWdlIGluIGlfc3RvcmFnZXMKCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IHBfbW91bnQgPSIsIHBfbW91bnQpCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IGlfc3RvcmFnZSA9IiwgaV9zdG9yYWdlKQoKICAgIGNoZWNrX21vdW50KHBfbW91bnQsIGlfbW91bnQsIGlfc3RvcmFnZSwgYnVuZGxlX2lkLCBzYW5kYm94X2lkKQoKICAgICMgVE9ETzogYXJlIHRoZXJlIGFueSBvdGhlciByZXF1aXJlZCBwb2xpY3kgY2hlY2tzIGZvciBtb3VudHMgLSBlLmcuLAogICAgIyAgICAgICBtdWx0aXBsZSBtb3VudHMgd2l0aCBzYW1lIHNvdXJjZSBvciBkZXN0aW5hdGlvbj8KCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IHRydWUiKQp9CgpjaGVja19tb3VudChwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcF9tb3VudCA9PSBpX21vdW50CiAgICBwcmludCgiY2hlY2tfbW91bnQgMTogdHJ1ZSIpCn0KY2hlY2tfbW91bnQocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHBfbW91bnQuZGVzdGluYXRpb24gPT0gaV9tb3VudC5kZXN0aW5hdGlvbgogICAgcF9tb3VudC50eXBlXyA9PSBpX21vdW50LnR5cGVfCiAgICBwX21vdW50Lm9wdGlvbnMgPT0gaV9tb3VudC5vcHRpb25zCgogICAgbW91bnRfc291cmNlX2FsbG93cyhwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkKCiAgICBwcmludCgiY2hlY2tfbW91bnQgMjogdHJ1ZSIpCn0KCm1vdW50X3NvdXJjZV9hbGxvd3MocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHJlZ2V4MSA6PSBwX21vdW50LnNvdXJjZQogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5tb3VudF9zb3VyY2VfY3BhdGgpCiAgICByZWdleDQgOj0gcmVwbGFjZShyZWdleDMsICIkKGJ1bmRsZS1pZCkiLCBidW5kbGVfaWQpCgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMTogcmVnZXg0ID0iLCByZWdleDQpCiAgICByZWdleC5tYXRjaChyZWdleDQsIGlfbW91bnQuc291cmNlKQoKICAgIHByaW50KCJtb3VudF9zb3VyY2VfYWxsb3dzIDE6IHRydWUiKQp9Cm1vdW50X3NvdXJjZV9hbGxvd3MocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHJlZ2V4MSA6PSBwX21vdW50LnNvdXJjZQogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5tb3VudF9zb3VyY2VfY3BhdGgpCiAgICByZWdleDQgOj0gcmVwbGFjZShyZWdleDMsICIkKHNhbmRib3gtaWQpIiwgc2FuZGJveF9pZCkKCiAgICBwcmludCgibW91bnRfc291cmNlX2FsbG93cyAyOiByZWdleDQgPSIsIHJlZ2V4NCkKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4NCwgaV9tb3VudC5zb3VyY2UpCgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMjogdHJ1ZSIpCn0KbW91bnRfc291cmNlX2FsbG93cyhwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogaV9tb3VudC5zb3VyY2UgPSIsIGlfbW91bnQuc291cmNlKQogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogaV9zdG9yYWdlLm1vdW50X3BvaW50ID0iLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCgogICAgaV9tb3VudC5zb3VyY2UgPT0gaV9zdG9yYWdlLm1vdW50X3BvaW50CgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogdHJ1ZSIpCn0KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBDcmVhdGUgY29udGFpbmVyIFN0b3JhZ2VzCgphbGxvd19zdG9yYWdlcyhwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHBfY291bnQgOj0gY291bnQocF9zdG9yYWdlcykKICAgIGlfY291bnQgOj0gY291bnQoaV9zdG9yYWdlcykKICAgIHByaW50KCJhbGxvd19zdG9yYWdlczogcF9jb3VudCA9IiwgcF9jb3VudCwgImlfY291bnQgPSIsIGlfY291bnQpCgogICAgcF9jb3VudCA9PSBpX2NvdW50CgogICAgIyBHZXQgdGhlIGNvbnRhaW5lciBpbWFnZSBsYXllciBJRHMgYW5kIHZlcml0eSByb290IGhhc2hlcywgZnJvbSB0aGUgIm92ZXJsYXlmcyIgc3RvcmFnZS4KICAgIHNvbWUgb3ZlcmxheV9zdG9yYWdlIGluIHBfc3RvcmFnZXMKICAgIG92ZXJsYXlfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIHByaW50KCJhbGxvd19zdG9yYWdlczogb3ZlcmxheV9zdG9yYWdlID0iLCBvdmVybGF5X3N0b3JhZ2UpCiAgICBjb3VudChvdmVybGF5X3N0b3JhZ2Uub3B0aW9ucykgPT0gMgoKICAgIGxheWVyX2lkcyA6PSBzcGxpdChvdmVybGF5X3N0b3JhZ2Uub3B0aW9uc1swXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiBsYXllcl9pZHMgPSIsIGxheWVyX2lkcykKCiAgICByb290X2hhc2hlcyA6PSBzcGxpdChvdmVybGF5X3N0b3JhZ2Uub3B0aW9uc1sxXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiByb290X2hhc2hlcyA9Iiwgcm9vdF9oYXNoZXMpCgogICAgZXZlcnkgaV9zdG9yYWdlIGluIGlfc3RvcmFnZXMgewogICAgICAgIGFsbG93X3N0b3JhZ2UocF9zdG9yYWdlcywgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpCiAgICB9CgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiB0cnVlIikKfQoKYWxsb3dfc3RvcmFnZShwX3N0b3JhZ2VzLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgc29tZSBwX3N0b3JhZ2UgaW4gcF9zdG9yYWdlcwoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiBwX3N0b3JhZ2UgPSIsIHBfc3RvcmFnZSkKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiBpX3N0b3JhZ2UgPSIsIGlfc3RvcmFnZSkKCiAgICBwX3N0b3JhZ2UuZHJpdmVyICAgICAgICAgICA9PSBpX3N0b3JhZ2UuZHJpdmVyCiAgICBwX3N0b3JhZ2UuZHJpdmVyX29wdGlvbnMgICA9PSBpX3N0b3JhZ2UuZHJpdmVyX29wdGlvbnMKICAgIHBfc3RvcmFnZS5mc19ncm91cCAgICAgICAgID09IGlfc3RvcmFnZS5mc19ncm91cAogICAgcF9zdG9yYWdlLmZzdHlwZSAgICAgICAgICAgPT0gaV9zdG9yYWdlLmZzdHlwZQoKICAgIGFsbG93X3N0b3JhZ2Vfc291cmNlKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKQogICAgYWxsb3dfc3RvcmFnZV9vcHRpb25zKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKQogICAgYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKQoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiB0cnVlIikKfQoKYWxsb3dfc3RvcmFnZV9zb3VyY2UocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX3NvdXJjZSAxOiBzdGFydCIpCgogICAgcF9zdG9yYWdlLnNvdXJjZSA9PSBpX3N0b3JhZ2Uuc291cmNlCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDE6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX3NvdXJjZShwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDI6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCgogICAgIyBEREREOkJCOkRELkY6IERvbWFpbjpCdXM6RGV2aWNlLkZ1bmN0aW9uCiAgICAjIGh0dHBzOi8vd3d3Lmtlcm5lbC5vcmcvZG9jL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtYnVzLXBjaQogICAgcmVnZXgubWF0Y2goYF5bYS1mMC05XXs0fTpbYS1mMC05XXsyfTpbYS1mMC05XXsyfVwuW2EtZjAtOV0kYCwgaV9zdG9yYWdlLnNvdXJjZSkKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9zb3VyY2UgMjogdHJ1ZSIpCn0KCmFsbG93X3N0b3JhZ2Vfc291cmNlKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKSB7CiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9zb3VyY2UgMzogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIGlfc3RvcmFnZS5zb3VyY2UgPT0gIm5vbmUiCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDM6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX3NvdXJjZShwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDQ6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJzbWIiCgogICAgIyBQYXR0ZXJuOiAvLzxzdG9yYWdlLWFjY291bnQtbmFtZT4uZmlsZS5jb3JlLndpbmRvd3MubmV0LzxrOHMtUFZDLW5hbWU+CiAgICAjIFN0b3JhZ2UgYWNjb3VudCBuYW1lOiBodHRwczovL2xlYXJuLm1pY3Jvc29mdC5jb20vZW4tdXMvYXp1cmUvc3RvcmFnZS9jb21tb24vc3RvcmFnZS1hY2NvdW50LW92ZXJ2aWV3I3N0b3JhZ2UtYWNjb3VudC1uYW1lCiAgICAjIEs4cyBQVkMgbmFtZTogaHR0cHM6Ly9rdWJlcm5ldGVzLmlvL2RvY3MvY29uY2VwdHMvb3ZlcnZpZXcvd29ya2luZy13aXRoLW9iamVjdHMvbmFtZXMvI2Rucy1zdWJkb21haW4tbmFtZXMKICAgIHJlZ2V4Lm1hdGNoKGBeXC9cLyhbYS16MC05XXszLDI0fSlcLmZpbGVcLmNvcmVcLndpbmRvd3NcLm5ldFwvW2EtejAtOV0oW2EtejAtOS4tXXswLDI1MX1bYS16MC05XSk/JGAsIGlfc3RvcmFnZS5zb3VyY2UpCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDQ6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMTogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgIT0gIm92ZXJsYXlmcyIKICAgIHBfc3RvcmFnZS5vcHRpb25zID09IGlfc3RvcmFnZS5vcHRpb25zCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAxOiB0cnVlIikKfQphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIGNvdW50KHBfc3RvcmFnZS5vcHRpb25zKSA9PSAyCgogICAgcG9saWN5X2lkcyA6PSBzcGxpdChwX3N0b3JhZ2Uub3B0aW9uc1swXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBwb2xpY3lfaWRzID0iLCBwb2xpY3lfaWRzKQogICAgcG9saWN5X2lkcyA9PSBsYXllcl9pZHMKCiAgICBwb2xpY3lfaGFzaGVzIDo9IHNwbGl0KHBfc3RvcmFnZS5vcHRpb25zWzFdLCAiOiIpCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IHBvbGljeV9oYXNoZXMgPSIsIHBvbGljeV9oYXNoZXMpCgogICAgcF9jb3VudCA6PSBjb3VudChwb2xpY3lfaWRzKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBwX2NvdW50ID0iLCBwX2NvdW50KQogICAgcF9jb3VudCA+PSAxCiAgICBwX2NvdW50ID09IGNvdW50KHBvbGljeV9oYXNoZXMpCgogICAgaV9jb3VudCA6PSBjb3VudChpX3N0b3JhZ2Uub3B0aW9ucykKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogaV9jb3VudCA9IiwgaV9jb3VudCkKICAgIGlfY291bnQgPT0gcF9jb3VudCArIDMKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zWzBdID0iLCBpX3N0b3JhZ2Uub3B0aW9uc1swXSkKICAgIGlfc3RvcmFnZS5vcHRpb25zWzBdID09ICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQubGF5ZXItc3JjLXByZWZpeD0vdmFyL2xpYi9jb250YWluZXJkL2lvLmNvbnRhaW5lcmQuc25hcHNob3R0ZXIudjEudGFyZGV2L2xheWVycyIKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zW2lfY291bnQgLSAyXSA9IiwgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDJdKQogICAgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDJdID09ICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQub3ZlcmxheS1ydyIKCiAgICBsb3dlcmRpciA6PSBjb25jYXQoIj0iLCBbImxvd2VyZGlyIiwgcF9zdG9yYWdlLm9wdGlvbnNbMF1dKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBsb3dlcmRpciA9IiwgbG93ZXJkaXIpCgogICAgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDFdID09IGxvd2VyZGlyCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zW2lfY291bnQgLSAxXSA9IiwgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDFdKQoKICAgIGV2ZXJ5IGksIHBvbGljeV9pZCBpbiBwb2xpY3lfaWRzIHsKICAgICAgICBhbGxvd19vdmVybGF5X2xheWVyKHBvbGljeV9pZCwgcG9saWN5X2hhc2hlc1tpXSwgaV9zdG9yYWdlLm9wdGlvbnNbaSArIDFdKQogICAgfQoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogdHJ1ZSIpCn0KYWxsb3dfc3RvcmFnZV9vcHRpb25zKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKSB7CiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDM6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCiAgICBjb3VudChwX3N0b3JhZ2Uub3B0aW9ucykgPT0gMQoKICAgIHN0YXJ0c3dpdGgocF9zdG9yYWdlLm9wdGlvbnNbMF0sICIkKGhhc2giKQogICAgaGFzaF9zdWZmaXggOj0gdHJpbV9sZWZ0KHBfc3RvcmFnZS5vcHRpb25zWzBdLCAiJChoYXNoIikKCiAgICBlbmRzd2l0aChoYXNoX3N1ZmZpeCwgIikiKQogICAgaGFzaF9pbmRleCA6PSB0cmltX3JpZ2h0KGhhc2hfc3VmZml4LCAiKSIpCiAgICBpIDo9IHRvX251bWJlcihoYXNoX2luZGV4KQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAzOiBpID0iLCBpKQoKICAgIGhhc2hfb3B0aW9uIDo9IGNvbmNhdCgiPSIsIFsiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LnJvb3QtaGFzaCIsIHJvb3RfaGFzaGVzW2ldXSkKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMzogaGFzaF9vcHRpb24gPSIsIGhhc2hfb3B0aW9uKQoKICAgIGNvdW50KGlfc3RvcmFnZS5vcHRpb25zKSA9PSA0CiAgICBpX3N0b3JhZ2Uub3B0aW9uc1swXSA9PSAicm8iCiAgICBpX3N0b3JhZ2Uub3B0aW9uc1sxXSA9PSAiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmJsb2NrX2RldmljZT1maWxlIgogICAgaV9zdG9yYWdlLm9wdGlvbnNbMl0gPT0gImlvLmthdGFjb250YWluZXJzLmZzLW9wdC5pcy1sYXllciIKICAgIGlfc3RvcmFnZS5vcHRpb25zWzNdID09IGhhc2hfb3B0aW9uCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAzOiB0cnVlIikKfQphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgNDogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gInNtYiIKICAgIHBfb3B0c19jb3VudCA6PSBjb3VudChwX3N0b3JhZ2Uub3B0aW9ucykKICAgIGlfb3B0c19jb3VudCA6PSBjb3VudChpX3N0b3JhZ2Uub3B0aW9ucykKICAgIGlfb3B0c19jb3VudCA9PSBwX29wdHNfY291bnQgKyAyCgogICAgaV9vcHRfbWF0Y2hlcyA6PSBbaSB8IGkgOj0gaWR4OyBpZHggPCBwX29wdHNfY291bnQ7IHBfc3RvcmFnZS5vcHRpb25zW2lkeF0gPT0gaV9zdG9yYWdlLm9wdGlvbnNbaWR4XV0KICAgIGNvdW50KGlfb3B0X21hdGNoZXMpID09IHBfb3B0c19jb3VudAoKICAgIHN0YXJ0c3dpdGgoaV9zdG9yYWdlLm9wdGlvbnNbaV9vcHRzX2NvdW50LTJdLCAiYWRkcj0iKQogICAgY3JlZHMgPSBzcGxpdChpX3N0b3JhZ2Uub3B0aW9uc1tpX29wdHNfY291bnQtMV0sICIsIikKICAgIGNvdW50KGNyZWRzKSA9PSAyCiAgICBzdGFydHN3aXRoKGNyZWRzWzBdLCAidXNlcm5hbWU9IikKICAgIHN0YXJ0c3dpdGgoY3JlZHNbMV0sICJwYXNzd29yZD0iKQogICAgCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDQ6IHRydWUiKQp9CgphbGxvd19vdmVybGF5X2xheWVyKHBvbGljeV9pZCwgcG9saWN5X2hhc2gsIGlfb3B0aW9uKSB7CiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogcG9saWN5X2lkID0iLCBwb2xpY3lfaWQsICJwb2xpY3lfaGFzaCA9IiwgcG9saWN5X2hhc2gpCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogaV9vcHRpb24gPSIsIGlfb3B0aW9uKQoKICAgIHN0YXJ0c3dpdGgoaV9vcHRpb24sICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQubGF5ZXI9IikKICAgIGlfdmFsdWUgOj0gcmVwbGFjZShpX29wdGlvbiwgImlvLmthdGFjb250YWluZXJzLmZzLW9wdC5sYXllcj0iLCAiIikKICAgIGlfdmFsdWVfZGVjb2RlZCA6PSBiYXNlNjQuZGVjb2RlKGlfdmFsdWUpCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogaV92YWx1ZV9kZWNvZGVkID0iLCBpX3ZhbHVlX2RlY29kZWQpCgogICAgcG9saWN5X3N1ZmZpeCA6PSBjb25jYXQoIj0iLCBbInRhcixybyxpby5rYXRhY29udGFpbmVycy5mcy1vcHQuYmxvY2tfZGV2aWNlPWZpbGUsaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmlzLWxheWVyLGlvLmthdGFjb250YWluZXJzLmZzLW9wdC5yb290LWhhc2giLCBwb2xpY3lfaGFzaF0pCiAgICBwX3ZhbHVlIDo9IGNvbmNhdCgiLCIsIFtwb2xpY3lfaWQsIHBvbGljeV9zdWZmaXhdKQogICAgcHJpbnQoImFsbG93X292ZXJsYXlfbGF5ZXI6IHBfdmFsdWUgPSIsIHBfdmFsdWUpCgogICAgcF92YWx1ZSA9PSBpX3ZhbHVlX2RlY29kZWQKCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogdHJ1ZSIpCn0KCmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAidGFyIgoKICAgIHN0YXJ0c3dpdGgocF9zdG9yYWdlLm1vdW50X3BvaW50LCAiJChsYXllciIpCiAgICBtb3VudF9zdWZmaXggOj0gdHJpbV9sZWZ0KHBfc3RvcmFnZS5tb3VudF9wb2ludCwgIiQobGF5ZXIiKQoKICAgIGVuZHN3aXRoKG1vdW50X3N1ZmZpeCwgIikiKQogICAgbGF5ZXJfaW5kZXggOj0gdHJpbV9yaWdodChtb3VudF9zdWZmaXgsICIpIikKICAgIGkgOj0gdG9fbnVtYmVyKGxheWVyX2luZGV4KQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDE6IGkgPSIsIGkpCgogICAgbGF5ZXJfaWQgOj0gbGF5ZXJfaWRzW2ldCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMTogbGF5ZXJfaWQgPSIsIGxheWVyX2lkKQoKICAgIHBfbW91bnQgOj0gY29uY2F0KCIvIiwgWyIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L2xheWVycyIsIGxheWVyX2lkXSkKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCAxOiBwX21vdW50ID0iLCBwX21vdW50KQoKICAgIHBfbW91bnQgPT0gaV9zdG9yYWdlLm1vdW50X3BvaW50CgogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDE6IHRydWUiKQp9CmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAiZnVzZTMua2F0YS1vdmVybGF5IgoKICAgIG1vdW50MSA6PSByZXBsYWNlKHBfc3RvcmFnZS5tb3VudF9wb2ludCwgIiQoY3BhdGgpIiwgcG9saWN5X2RhdGEuY29tbW9uLmNwYXRoKQogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDI6IG1vdW50MiA9IiwgbW91bnQyKQoKICAgIG1vdW50MiA9PSBpX3N0b3JhZ2UubW91bnRfcG9pbnQKCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMjogdHJ1ZSIpCn0KYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKSB7CiAgICBwX3N0b3JhZ2UuZnN0eXBlID09ICJsb2NhbCIKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQyID0iLCBtb3VudDIpCgogICAgbW91bnQzIDo9IHJlcGxhY2UobW91bnQyLCAiJChzYW5kYm94LWlkKSIsIHNhbmRib3hfaWQpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQzID0iLCBtb3VudDMpCgogICAgcmVnZXgubWF0Y2gobW91bnQzLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCgogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDM6IHRydWUiKQp9CmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAiYmluZCIKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNDogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNDogbW91bnQyID0iLCBtb3VudDIpCgogICAgbW91bnQzIDo9IHJlcGxhY2UobW91bnQyLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDQ6IG1vdW50MyA9IiwgbW91bnQzKQoKICAgIHJlZ2V4Lm1hdGNoKG1vdW50MywgaV9zdG9yYWdlLm1vdW50X3BvaW50KQoKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA0OiB0cnVlIikKfQphbGxvd19tb3VudF9wb2ludChwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgYnVuZGxlX2lkLCBzYW5kYm94X2lkLCBsYXllcl9pZHMpIHsKICAgIHBfc3RvcmFnZS5mc3R5cGUgPT0gInRtcGZzIgoKICAgIG1vdW50MSA6PSBwX3N0b3JhZ2UubW91bnRfcG9pbnQKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA1OiBtb3VudDEgPSIsIG1vdW50MSkKCiAgICByZWdleC5tYXRjaChtb3VudDEsIGlfc3RvcmFnZS5tb3VudF9wb2ludCkKCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNTogdHJ1ZSIpCn0KYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKSB7CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogaV9zdG9yYWdlLm1vdW50X3BvaW50ID0iLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCiAgICBhbGxvd19kaXJlY3Rfdm9sX2RyaXZlcihwX3N0b3JhZ2UsIGlfc3RvcmFnZSkKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChzcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQyID0iLCBtb3VudDIpCgogICAgZGlyZWN0X3ZvbF9wYXRoIDo9IGlfc3RvcmFnZS5zb3VyY2UKICAgIG1vdW50MyA6PSByZXBsYWNlKG1vdW50MiwgIiQoYjY0LWRpcmVjdC12b2wtcGF0aCkiLCBiYXNlNjR1cmwuZW5jb2RlKGRpcmVjdF92b2xfcGF0aCkpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQzID0iLCBtb3VudDMpCgogICAgbW91bnQzID09IGlfc3RvcmFnZS5tb3VudF9wb2ludAoKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA2OiB0cnVlIikKfQoKYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIocF9zdG9yYWdlLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19kaXJlY3Rfdm9sX2RyaXZlciAxOiBzdGFydCIpCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCiAgICBwcmludCgiYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIgMTogdHJ1ZSIpCn0KYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIocF9zdG9yYWdlLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19kaXJlY3Rfdm9sX2RyaXZlciAyOiBzdGFydCIpCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJzbWIiCiAgICBwcmludCgiYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIgMjogdHJ1ZSIpCn0KCiMgRXhlY1Byb2Nlc3NSZXF1ZXN0LnByb2Nlc3MuQ2FwYWJpbGl0aWVzCmFsbG93X2V4ZWNfY2FwcyhpX2NhcHMpIHsKICAgIG5vdCBpX2NhcHMuQW1iaWVudAogICAgbm90IGlfY2Fwcy5Cb3VuZGluZwogICAgbm90IGlfY2Fwcy5FZmZlY3RpdmUKICAgIG5vdCBpX2NhcHMuSW5oZXJpdGFibGUKICAgIG5vdCBpX2NhcHMuUGVybWl0dGVkCn0KCiMgT0NJLlByb2Nlc3MuQ2FwYWJpbGl0aWVzCmFsbG93X2NhcHMocF9jYXBzLCBpX2NhcHMpIHsKICAgIHByaW50KCJhbGxvd19jYXBzOiBwb2xpY3kgQW1iaWVudCA9IiwgcF9jYXBzLkFtYmllbnQpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgQW1iaWVudCA9IiwgaV9jYXBzLkFtYmllbnQpCiAgICBtYXRjaF9jYXBzKHBfY2Fwcy5BbWJpZW50LCBpX2NhcHMuQW1iaWVudCkKCiAgICBwcmludCgiYWxsb3dfY2FwczogcG9saWN5IEJvdW5kaW5nID0iLCBwX2NhcHMuQm91bmRpbmcpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgQm91bmRpbmcgPSIsIGlfY2Fwcy5Cb3VuZGluZykKICAgIG1hdGNoX2NhcHMocF9jYXBzLkJvdW5kaW5nLCBpX2NhcHMuQm91bmRpbmcpCgogICAgcHJpbnQoImFsbG93X2NhcHM6IHBvbGljeSBFZmZlY3RpdmUgPSIsIHBfY2Fwcy5FZmZlY3RpdmUpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgRWZmZWN0aXZlID0iLCBpX2NhcHMuRWZmZWN0aXZlKQogICAgbWF0Y2hfY2FwcyhwX2NhcHMuRWZmZWN0aXZlLCBpX2NhcHMuRWZmZWN0aXZlKQoKICAgIHByaW50KCJhbGxvd19jYXBzOiBwb2xpY3kgSW5oZXJpdGFibGUgPSIsIHBfY2Fwcy5Jbmhlcml0YWJsZSkKICAgIHByaW50KCJhbGxvd19jYXBzOiBpbnB1dCBJbmhlcml0YWJsZSA9IiwgaV9jYXBzLkluaGVyaXRhYmxlKQogICAgbWF0Y2hfY2FwcyhwX2NhcHMuSW5oZXJpdGFibGUsIGlfY2Fwcy5Jbmhlcml0YWJsZSkKCiAgICBwcmludCgiYWxsb3dfY2FwczogcG9saWN5IFBlcm1pdHRlZCA9IiwgcF9jYXBzLlBlcm1pdHRlZCkKICAgIHByaW50KCJhbGxvd19jYXBzOiBpbnB1dCBQZXJtaXR0ZWQgPSIsIGlfY2Fwcy5QZXJtaXR0ZWQpCiAgICBtYXRjaF9jYXBzKHBfY2Fwcy5QZXJtaXR0ZWQsIGlfY2Fwcy5QZXJtaXR0ZWQpCn0KCm1hdGNoX2NhcHMocF9jYXBzLCBpX2NhcHMpIHsKICAgIHByaW50KCJtYXRjaF9jYXBzIDE6IHN0YXJ0IikKCiAgICBwX2NhcHMgPT0gaV9jYXBzCgogICAgcHJpbnQoIm1hdGNoX2NhcHMgMTogdHJ1ZSIpCn0KbWF0Y2hfY2FwcyhwX2NhcHMsIGlfY2FwcykgewogICAgcHJpbnQoIm1hdGNoX2NhcHMgMjogc3RhcnQiKQoKICAgIGNvdW50KHBfY2FwcykgPT0gMQogICAgcF9jYXBzWzBdID09ICIkKGRlZmF1bHRfY2FwcykiCgogICAgcHJpbnQoIm1hdGNoX2NhcHMgMjogZGVmYXVsdF9jYXBzID0iLCBwb2xpY3lfZGF0YS5jb21tb24uZGVmYXVsdF9jYXBzKQogICAgcG9saWN5X2RhdGEuY29tbW9uLmRlZmF1bHRfY2FwcyA9PSBpX2NhcHMKCiAgICBwcmludCgibWF0Y2hfY2FwcyAyOiB0cnVlIikKfQptYXRjaF9jYXBzKHBfY2FwcywgaV9jYXBzKSB7CiAgICBwcmludCgibWF0Y2hfY2FwcyAzOiBzdGFydCIpCgogICAgY291bnQocF9jYXBzKSA9PSAxCiAgICBwX2NhcHNbMF0gPT0gIiQocHJpdmlsZWdlZF9jYXBzKSIKCiAgICBwcmludCgibWF0Y2hfY2FwcyAzOiBwcml2aWxlZ2VkX2NhcHMgPSIsIHBvbGljeV9kYXRhLmNvbW1vbi5wcml2aWxlZ2VkX2NhcHMpCiAgICBwb2xpY3lfZGF0YS5jb21tb24ucHJpdmlsZWdlZF9jYXBzID09IGlfY2FwcwoKICAgIHByaW50KCJtYXRjaF9jYXBzIDM6IHRydWUiKQp9CgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgpjaGVja19kaXJlY3RvcnlfdHJhdmVyc2FsKGlfcGF0aCkgewogICAgbm90IHJlZ2V4Lm1hdGNoKCIoXnwvKS4uKCR8LykiLCBpX3BhdGgpCn0KCmNoZWNrX3N5bWxpbmtfc291cmNlKGlfc3JjKSB7CiAgICBpX3NyYyA9PSAiIgogICAgcHJpbnQoImNoZWNrX3N5bWxpbmtfc291cmNlIDE6IHRydWUiKQp9CmNoZWNrX3N5bWxpbmtfc291cmNlKGlfc3JjKSB7CiAgICBpX3NyYyAhPSAiIgogICAgcHJpbnQoImNoZWNrX3N5bWxpbmtfc291cmNlIDI6IGlfc3JjID0iLCBpX3NyYykKCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24uc19zb3VyY2UxLCBpX3NyYykKCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMjogdHJ1ZSIpCn0KY2hlY2tfc3ltbGlua19zb3VyY2UoaV9zcmMpIHsKICAgIGlfc3JjICE9ICIiCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMzogaV9zcmMgPSIsIGlfc3JjKQoKICAgIHJlZ2V4Lm1hdGNoKHBvbGljeV9kYXRhLmNvbW1vbi5zX3NvdXJjZTIsIGlfc3JjKQogICAgY2hlY2tfZGlyZWN0b3J5X3RyYXZlcnNhbChpX3NyYykKCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMzogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfc3RvcmFnZXMoaV9zdG9yYWdlcykgewogICAgcHJpbnQoImFsbG93X3NhbmRib3hfc3RvcmFnZXM6IGlfc3RvcmFnZXMgPSIsIGlfc3RvcmFnZXMpCgogICAgcF9zdG9yYWdlcyA6PSBwb2xpY3lfZGF0YS5zYW5kYm94LnN0b3JhZ2VzCiAgICBldmVyeSBpX3N0b3JhZ2UgaW4gaV9zdG9yYWdlcyB7CiAgICAgICAgYWxsb3dfc2FuZGJveF9zdG9yYWdlKHBfc3RvcmFnZXMsIGlfc3RvcmFnZSkKICAgIH0KCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9zdG9yYWdlczogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfc3RvcmFnZShwX3N0b3JhZ2VzLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IGlfc3RvcmFnZSA9IiwgaV9zdG9yYWdlKQoKICAgIHNvbWUgcF9zdG9yYWdlIGluIHBfc3RvcmFnZXMKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IHBfc3RvcmFnZSA9IiwgcF9zdG9yYWdlKQogICAgaV9zdG9yYWdlID09IHBfc3RvcmFnZQoKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IHRydWUiKQp9CgpDb3B5RmlsZVJlcXVlc3QgewogICAgcHJpbnQoIkNvcHlGaWxlUmVxdWVzdDogaW5wdXQucGF0aCA9IiwgaW5wdXQucGF0aCkKCiAgICBjaGVja19zeW1saW5rX3NvdXJjZShpbnB1dC5zeW1saW5rX3NyYykKICAgIGNoZWNrX2RpcmVjdG9yeV90cmF2ZXJzYWwoaW5wdXQucGF0aCkKCiAgICBzb21lIHJlZ2V4MSBpbiBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLkNvcHlGaWxlUmVxdWVzdAogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5jcGF0aCkKICAgIHJlZ2V4NCA6PSByZXBsYWNlKHJlZ2V4MywgIiQoYnVuZGxlLWlkKSIsIEJVTkRMRV9JRCkKICAgIHByaW50KCJDb3B5RmlsZVJlcXVlc3Q6IHJlZ2V4NCA9IiwgcmVnZXg0KQoKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4NCwgaW5wdXQucGF0aCkKCiAgICBwcmludCgiQ29weUZpbGVSZXF1ZXN0OiB0cnVlIikKfQoKQ3JlYXRlU2FuZGJveFJlcXVlc3QgewogICAgcHJpbnQoIkNyZWF0ZVNhbmRib3hSZXF1ZXN0OiBpbnB1dC5ndWVzdF9ob29rX3BhdGggPSIsIGlucHV0Lmd1ZXN0X2hvb2tfcGF0aCkKICAgIGNvdW50KGlucHV0Lmd1ZXN0X2hvb2tfcGF0aCkgPT0gMAoKICAgIHByaW50KCJDcmVhdGVTYW5kYm94UmVxdWVzdDogaW5wdXQua2VybmVsX21vZHVsZXMgPSIsIGlucHV0Lmtlcm5lbF9tb2R1bGVzKQogICAgY291bnQoaW5wdXQua2VybmVsX21vZHVsZXMpID09IDAKCiAgICBpX3BpZG5zIDo9IGlucHV0LnNhbmRib3hfcGlkbnMKICAgIHByaW50KCJDcmVhdGVTYW5kYm94UmVxdWVzdDogaV9waWRucyA9IiwgaV9waWRucykKICAgIGlfcGlkbnMgPT0gZmFsc2UKICAgIGFsbG93X3NhbmRib3hfc3RvcmFnZXMoaW5wdXQuc3RvcmFnZXMpCn0KCmFsbG93X2V4ZWMocF9jb250YWluZXIsIGlfcHJvY2VzcykgewogICAgcHJpbnQoImFsbG93X2V4ZWM6IHN0YXJ0IikKCiAgICBwX29jaSA9IHBfY29udGFpbmVyLk9DSQogICAgcF9zX25hbWUgPSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc19uYW1lc3BhY2UgPSBnZXRfc3RhdGVfdmFsKCJuYW1lc3BhY2UiKQogICAgYWxsb3dfcHJvYmVfcHJvY2VzcyhwX29jaS5Qcm9jZXNzLCBpX3Byb2Nlc3MsIHBfc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfZXhlYzogdHJ1ZSIpCn0KCmFsbG93X2ludGVyYWN0aXZlX2V4ZWMocF9jb250YWluZXIsIGlfcHJvY2VzcykgewogICAgcHJpbnQoImFsbG93X2ludGVyYWN0aXZlX2V4ZWM6IHN0YXJ0IikKCiAgICBwX29jaSA9IHBfY29udGFpbmVyLk9DSQogICAgcF9zX25hbWUgPSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc19uYW1lc3BhY2UgPSBnZXRfc3RhdGVfdmFsKCJuYW1lc3BhY2UiKQogICAgYWxsb3dfaW50ZXJhY3RpdmVfcHJvY2VzcyhwX29jaS5Qcm9jZXNzLCBpX3Byb2Nlc3MsIHBfc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfaW50ZXJhY3RpdmVfZXhlYzogdHJ1ZSIpCn0KCiMgVE9ETzogc2hvdWxkIG90aGVyIEV4ZWNQcm9jZXNzUmVxdWVzdCBpbnB1dCBkYXRhIGZpZWxkcyBiZSB2YWxpZGF0ZWQgYXMgd2VsbD8KRXhlY1Byb2Nlc3NSZXF1ZXN0IHsKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMTogaW5wdXQgPSIsIGlucHV0KQoKICAgIHNvbWUgcF9jb21tYW5kIGluIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuRXhlY1Byb2Nlc3NSZXF1ZXN0LmFsbG93ZWRfY29tbWFuZHMKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMTogcF9jb21tYW5kID0iLCBwX2NvbW1hbmQpCiAgICBwX2NvbW1hbmQgPT0gaW5wdXQucHJvY2Vzcy5BcmdzCgogICAgIyBUT0RPOiBtYXRjaCBwX2NvbnRhaW5lcidzIElEIHdpdGggdGhlIGlucHV0IGNvbnRhaW5lcl9pZC4KICAgIHNvbWUgcF9jb250YWluZXIgaW4gcG9saWN5X2RhdGEuY29udGFpbmVycwogICAgYWxsb3dfaW50ZXJhY3RpdmVfZXhlYyhwX2NvbnRhaW5lciwgaW5wdXQucHJvY2VzcykKCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDE6IHRydWUiKQp9CkV4ZWNQcm9jZXNzUmVxdWVzdCB7CiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDI6IGlucHV0ID0iLCBpbnB1dCkKCiAgICAjIFRPRE86IG1hdGNoIGlucHV0IGNvbnRhaW5lciBJRCB3aXRoIGl0cyBjb3JyZXNwb25kaW5nIGNvbnRhaW5lci5leGVjX2NvbW1hbmRzLgogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBzb21lIHBfY29tbWFuZCBpbiBwX2NvbnRhaW5lci5leGVjX2NvbW1hbmRzCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDI6IHBfY29tbWFuZCA9IiwgcF9jb21tYW5kKQoKICAgICMgVE9ETzogc2hvdWxkIG90aGVyIGlucHV0IGRhdGEgZmllbGRzIGJlIHZhbGlkYXRlZCBhcyB3ZWxsPwogICAgcF9jb21tYW5kID09IGlucHV0LnByb2Nlc3MuQXJncwoKICAgIGFsbG93X2V4ZWMocF9jb250YWluZXIsIGlucHV0LnByb2Nlc3MpCgogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAyOiB0cnVlIikKfQpFeGVjUHJvY2Vzc1JlcXVlc3QgewogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAzOiBpbnB1dCA9IiwgaW5wdXQpCgogICAgaV9jb21tYW5kID0gY29uY2F0KCIgIiwgaW5wdXQucHJvY2Vzcy5BcmdzKQogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAzOiBpX2NvbW1hbmQgPSIsIGlfY29tbWFuZCkKCiAgICBzb21lIHBfcmVnZXggaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5FeGVjUHJvY2Vzc1JlcXVlc3QucmVnZXgKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMzogcF9yZWdleCA9IiwgcF9yZWdleCkKCiAgICByZWdleC5tYXRjaChwX3JlZ2V4LCBpX2NvbW1hbmQpCgogICAgIyBUT0RPOiBtYXRjaCBwX2NvbnRhaW5lcidzIElEIHdpdGggdGhlIGlucHV0IGNvbnRhaW5lcl9pZC4KICAgIHNvbWUgcF9jb250YWluZXIgaW4gcG9saWN5X2RhdGEuY29udGFpbmVycwogICAgYWxsb3dfaW50ZXJhY3RpdmVfZXhlYyhwX2NvbnRhaW5lciwgaW5wdXQucHJvY2VzcykKCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDM6IHRydWUiKQp9CgpVcGRhdGVSb3V0ZXNSZXF1ZXN0IHsKICAgIHByaW50KCJVcGRhdGVSb3V0ZXNSZXF1ZXN0OiBpbnB1dCA9IiwgaW5wdXQpCiAgICBwcmludCgiVXBkYXRlUm91dGVzUmVxdWVzdDogcG9saWN5ID0iLCBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLlVwZGF0ZVJvdXRlc1JlcXVlc3QpCgogICAgaV9yb3V0ZXMgOj0gaW5wdXQucm91dGVzLlJvdXRlcwogICAgcF9zb3VyY2VfcmVnZXggPSBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLlVwZGF0ZVJvdXRlc1JlcXVlc3QuZm9yYmlkZGVuX3NvdXJjZV9yZWdleAogICAgcF9uYW1lcyA9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuVXBkYXRlUm91dGVzUmVxdWVzdC5mb3JiaWRkZW5fZGV2aWNlX25hbWVzCgogICAgZXZlcnkgaV9yb3V0ZSBpbiBpX3JvdXRlcyB7CiAgICAgICAgcHJpbnQoImlfcm91dGUuc291cmNlID0iLCBpX3JvdXRlLnNvdXJjZSkKICAgICAgICBldmVyeSBwX3JlZ2V4IGluIHBfc291cmNlX3JlZ2V4IHsKICAgICAgICAgICAgcHJpbnQoInBfcmVnZXggPSIsIHBfcmVnZXgpCiAgICAgICAgICAgIG5vdCByZWdleC5tYXRjaChwX3JlZ2V4LCBpX3JvdXRlLnNvdXJjZSkKICAgICAgICB9CgogICAgICAgIHByaW50KCJpX3JvdXRlLmRldmljZSA9IiwgaV9yb3V0ZS5kZXZpY2UpCiAgICAgICAgbm90IGlfcm91dGUuZGV2aWNlIGluIHBfbmFtZXMKICAgIH0KCiAgICBwcmludCgiVXBkYXRlUm91dGVzUmVxdWVzdDogdHJ1ZSIpCn0KClVwZGF0ZUludGVyZmFjZVJlcXVlc3QgewogICAgcHJpbnQoIlVwZGF0ZUludGVyZmFjZVJlcXVlc3Q6IGlucHV0ID0iLCBpbnB1dCkKICAgIHByaW50KCJVcGRhdGVJbnRlcmZhY2VSZXF1ZXN0OiBwb2xpY3kgPSIsIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuVXBkYXRlSW50ZXJmYWNlUmVxdWVzdCkKCiAgICBpX2ludGVyZmFjZSA6PSBpbnB1dC5pbnRlcmZhY2UKICAgIHBfZmxhZ3MgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmFsbG93X3Jhd19mbGFncwoKICAgICMgVHlwaWNhbGx5LCBqdXN0IElGRl9OT0FSUCBpcyB1c2VkLgogICAgYml0cy5hbmQoaV9pbnRlcmZhY2UucmF3X2ZsYWdzLCBiaXRzLm5lZ2F0ZShwX2ZsYWdzKSkgPT0gMAoKICAgIHBfbmFtZXMgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmZvcmJpZGRlbl9uYW1lcwoKICAgIG5vdCBpX2ludGVyZmFjZS5uYW1lIGluIHBfbmFtZXMKCiAgICBwX2h3YWRkcnMgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmZvcmJpZGRlbl9od19hZGRycwoKICAgIG5vdCBpX2ludGVyZmFjZS5od0FkZHIgaW4gcF9od2FkZHJzCgogICAgcHJpbnQoIlVwZGF0ZUludGVyZmFjZVJlcXVlc3Q6IHRydWUiKQp9CgpDbG9zZVN0ZGluUmVxdWVzdCB7CiAgICBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLkNsb3NlU3RkaW5SZXF1ZXN0ID09IHRydWUKfQoKUmVhZFN0cmVhbVJlcXVlc3QgewogICAgcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5SZWFkU3RyZWFtUmVxdWVzdCA9PSB0cnVlCn0KClVwZGF0ZUVwaGVtZXJhbE1vdW50c1JlcXVlc3QgewogICAgcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVFcGhlbWVyYWxNb3VudHNSZXF1ZXN0ID09IHRydWUKfQoKV3JpdGVTdHJlYW1SZXF1ZXN0IHsKICAgIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuV3JpdGVTdHJlYW1SZXF1ZXN0ID09IHRydWUKfQoKcG9saWN5X2RhdGEgOj0gewogICJjb250YWluZXJzIjogWwogICAgewogICAgICAiT0NJIjogewogICAgICAgICJWZXJzaW9uIjogIjEuMS4wLXJjLjEiLAogICAgICAgICJQcm9jZXNzIjogewogICAgICAgICAgIlRlcm1pbmFsIjogZmFsc2UsCiAgICAgICAgICAiVXNlciI6IHsKICAgICAgICAgICAgIlVJRCI6IDY1NTM1LAogICAgICAgICAgICAiR0lEIjogNjU1MzUsCiAgICAgICAgICAgICJBZGRpdGlvbmFsR2lkcyI6IFtdLAogICAgICAgICAgICAiVXNlcm5hbWUiOiAiIgogICAgICAgICAgfSwKICAgICAgICAgICJEZXByZWNhdGVkQXJncyI6IFsKICAgICAgICAgICAgIi9wYXVzZSIKICAgICAgICAgIF0sCiAgICAgICAgICAiQXJncyI6IFsKICAgICAgICAgICAgIi9wYXVzZSIKICAgICAgICAgIF0sCiAgICAgICAgICAiRW52IjogWwogICAgICAgICAgICAiUEFUSD0vdXNyL2xvY2FsL3NiaW46L3Vzci9sb2NhbC9iaW46L3Vzci9zYmluOi91c3IvYmluOi9zYmluOi9iaW4iCiAgICAgICAgICBdLAogICAgICAgICAgIkN3ZCI6ICIvIiwKICAgICAgICAgICJDYXBhYmlsaXRpZXMiOiB7CiAgICAgICAgICAgICJBbWJpZW50IjogW10sCiAgICAgICAgICAgICJCb3VuZGluZyI6IFsKICAgICAgICAgICAgICAiJChkZWZhdWx0X2NhcHMpIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiRWZmZWN0aXZlIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJJbmhlcml0YWJsZSI6IFtdLAogICAgICAgICAgICAiUGVybWl0dGVkIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICAiTm9OZXdQcml2aWxlZ2VzIjogdHJ1ZQogICAgICAgIH0sCiAgICAgICAgIlJvb3QiOiB7CiAgICAgICAgICAiUGF0aCI6ICIkKGNwYXRoKS8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgIlJlYWRvbmx5IjogdHJ1ZQogICAgICAgIH0sCiAgICAgICAgIk1vdW50cyI6IFsKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9wcm9jIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJwcm9jIiwKICAgICAgICAgICAgInR5cGVfIjogInByb2MiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2IiwKICAgICAgICAgICAgInNvdXJjZSI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJzdHJpY3RhdGltZSIsCiAgICAgICAgICAgICAgIm1vZGU9NzU1IiwKICAgICAgICAgICAgICAic2l6ZT02NTUzNmsiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L3B0cyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiZGV2cHRzIiwKICAgICAgICAgICAgInR5cGVfIjogImRldnB0cyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJuZXdpbnN0YW5jZSIsCiAgICAgICAgICAgICAgInB0bXhtb2RlPTA2NjYiLAogICAgICAgICAgICAgICJtb2RlPTA2MjAiLAogICAgICAgICAgICAgICJnaWQ9NSIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvc2htIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L3NobSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi9tcXVldWUiLAogICAgICAgICAgICAic291cmNlIjogIm1xdWV1ZSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJtcXVldWUiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvc3lzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJzeXNmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJzeXNmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2V0Yy9yZXNvbHYuY29uZiIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClyZXNvbHYuY29uZiQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJvIiwKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9kZXYiLAogICAgICAgICAgICAgICJub2V4ZWMiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0KICAgICAgICBdLAogICAgICAgICJBbm5vdGF0aW9ucyI6IHsKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmJ1bmRsZV9wYXRoIjogIi9ydW4vY29udGFpbmVyZC9pby5jb250YWluZXJkLnJ1bnRpbWUudjIudGFzay9rOHMuaW8vJChidW5kbGUtaWQpIiwKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIjogInBvZF9zYW5kYm94IiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSI6ICJzYW5kYm94IiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWlkIjogIl5bYS16MC05XXs2NH0kIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWxvZy1kaXJlY3RvcnkiOiAiXi92YXIvbG9nL3BvZHMvJChzYW5kYm94LW5hbWVzcGFjZSlfJChzYW5kYm94LW5hbWUpX1swLTlhLWZdezh9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezEyfSQiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZXNwYWNlIjogIiIsCiAgICAgICAgICAibmVyZGN0bC9uZXR3b3JrLW5hbWVzcGFjZSI6ICJeL3Zhci9ydW4vbmV0bnMvY25pLVswLTlhLWZdezh9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezEyfSQiCiAgICAgICAgfSwKICAgICAgICAiTGludXgiOiB7CiAgICAgICAgICAiTmFtZXNwYWNlcyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICJUeXBlIjogImlwYyIsCiAgICAgICAgICAgICAgIlBhdGgiOiAiIgogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgIlR5cGUiOiAidXRzIiwKICAgICAgICAgICAgICAiUGF0aCI6ICIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiVHlwZSI6ICJtb3VudCIsCiAgICAgICAgICAgICAgIlBhdGgiOiAiIgogICAgICAgICAgICB9CiAgICAgICAgICBdLAogICAgICAgICAgIk1hc2tlZFBhdGhzIjogWwogICAgICAgICAgICAiL3Byb2MvYWNwaSIsCiAgICAgICAgICAgICIvcHJvYy9hc291bmQiLAogICAgICAgICAgICAiL3Byb2Mva2NvcmUiLAogICAgICAgICAgICAiL3Byb2Mva2V5cyIsCiAgICAgICAgICAgICIvcHJvYy9sYXRlbmN5X3N0YXRzIiwKICAgICAgICAgICAgIi9wcm9jL3RpbWVyX2xpc3QiLAogICAgICAgICAgICAiL3Byb2MvdGltZXJfc3RhdHMiLAogICAgICAgICAgICAiL3Byb2Mvc2NoZWRfZGVidWciLAogICAgICAgICAgICAiL3N5cy9maXJtd2FyZSIsCiAgICAgICAgICAgICIvcHJvYy9zY3NpIgogICAgICAgICAgXSwKICAgICAgICAgICJSZWFkb25seVBhdGhzIjogWwogICAgICAgICAgICAiL3Byb2MvYnVzIiwKICAgICAgICAgICAgIi9wcm9jL2ZzIiwKICAgICAgICAgICAgIi9wcm9jL2lycSIsCiAgICAgICAgICAgICIvcHJvYy9zeXMiLAogICAgICAgICAgICAiL3Byb2Mvc3lzcnEtdHJpZ2dlciIKICAgICAgICAgIF0sCiAgICAgICAgICAiRGV2aWNlcyI6IFtdLAogICAgICAgICAgIlN5c2N0bCI6IHsKICAgICAgICAgICAgIm5ldC5pcHY0LmlwX3VucHJpdmlsZWdlZF9wb3J0X3N0YXJ0IjogIjAiLAogICAgICAgICAgICAibmV0LmlwdjQucGluZ19ncm91cF9yYW5nZSI6ICIwIDIxNDc0ODM2NDciCiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9LAogICAgICAic3RvcmFnZXMiOiBbCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJibGsiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogInRhciIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIiQoaGFzaDApIgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGxheWVyMCkiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJvdmVybGF5ZnMiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogImZ1c2UzLmthdGEtb3ZlcmxheSIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIjVhNWFhZDgwMDU1ZmYyMDAxMmE1MGRjMjVmOGRmN2EyOTkyNDQ3NDMyNGQ2NWY3ZDUzMDZlZThlZTI3ZmY3MWQiLAogICAgICAgICAgICAiODE3MjUwZjFhM2UzMzZkYTc2ZjViZDNmYTc4NGUxYjI2ZDk1OWI5YzEzMTg3NjgxNWJhMjYwNDA0OGI3MGMxOCIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChjcGF0aCkvJChidW5kbGUtaWQpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9CiAgICAgIF0sCiAgICAgICJkZXZpY2VzIjogW10sCiAgICAgICJzYW5kYm94X3BpZG5zIjogZmFsc2UsCiAgICAgICJleGVjX2NvbW1hbmRzIjogW10sCiAgICAgICJlbnZfbWFwIjogewogICAgICAgICJQQVRIIjogIi91c3IvbG9jYWwvc2JpbjovdXNyL2xvY2FsL2JpbjovdXNyL3NiaW46L3Vzci9iaW46L3NiaW46L2JpbiIKICAgICAgfQogICAgfSwKICAgIHsKICAgICAgIk9DSSI6IHsKICAgICAgICAiVmVyc2lvbiI6ICIxLjEuMC1yYy4xIiwKICAgICAgICAiUHJvY2VzcyI6IHsKICAgICAgICAgICJUZXJtaW5hbCI6IGZhbHNlLAogICAgICAgICAgIlVzZXIiOiB7CiAgICAgICAgICAgICJVSUQiOiAwLAogICAgICAgICAgICAiR0lEIjogMCwKICAgICAgICAgICAgIkFkZGl0aW9uYWxHaWRzIjogW10sCiAgICAgICAgICAgICJVc2VybmFtZSI6ICIiCiAgICAgICAgICB9LAogICAgICAgICAgIkRlcHJlY2F0ZWRBcmdzIjogWwogICAgICAgICAgICAibmdpbngiLAogICAgICAgICAgICAiLWciLAogICAgICAgICAgICAiZGFlbW9uIG9mZjsiCiAgICAgICAgICBdLAogICAgICAgICAgIkFyZ3MiOiBbCiAgICAgICAgICAgICJuZ2lueCIsCiAgICAgICAgICAgICItZyIsCiAgICAgICAgICAgICJkYWVtb24gb2ZmOyIKICAgICAgICAgIF0sCiAgICAgICAgICAiRW52IjogWwogICAgICAgICAgICAiUEFUSD0vdXNyL2xvY2FsL3NiaW46L3Vzci9sb2NhbC9iaW46L3Vzci9zYmluOi91c3IvYmluOi9zYmluOi9iaW4iLAogICAgICAgICAgICAiSE9TVE5BTUU9JChob3N0LW5hbWUpIgogICAgICAgICAgXSwKICAgICAgICAgICJDd2QiOiAiLyIsCiAgICAgICAgICAiQ2FwYWJpbGl0aWVzIjogewogICAgICAgICAgICAiQW1iaWVudCI6IFtdLAogICAgICAgICAgICAiQm91bmRpbmciOiBbCiAgICAgICAgICAgICAgIiQoZGVmYXVsdF9jYXBzKSIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgIkVmZmVjdGl2ZSI6IFsKICAgICAgICAgICAgICAiJChkZWZhdWx0X2NhcHMpIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiSW5oZXJpdGFibGUiOiBbXSwKICAgICAgICAgICAgIlBlcm1pdHRlZCI6IFsKICAgICAgICAgICAgICAiJChkZWZhdWx0X2NhcHMpIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgIk5vTmV3UHJpdmlsZWdlcyI6IGZhbHNlCiAgICAgICAgfSwKICAgICAgICAiUm9vdCI6IHsKICAgICAgICAgICJQYXRoIjogIiQoY3BhdGgpLyQoYnVuZGxlLWlkKSIsCiAgICAgICAgICAiUmVhZG9ubHkiOiBmYWxzZQogICAgICAgIH0sCiAgICAgICAgIk1vdW50cyI6IFsKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9wcm9jIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJwcm9jIiwKICAgICAgICAgICAgInR5cGVfIjogInByb2MiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2IiwKICAgICAgICAgICAgInNvdXJjZSI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJzdHJpY3RhdGltZSIsCiAgICAgICAgICAgICAgIm1vZGU9NzU1IiwKICAgICAgICAgICAgICAic2l6ZT02NTUzNmsiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L3B0cyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiZGV2cHRzIiwKICAgICAgICAgICAgInR5cGVfIjogImRldnB0cyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJuZXdpbnN0YW5jZSIsCiAgICAgICAgICAgICAgInB0bXhtb2RlPTA2NjYiLAogICAgICAgICAgICAgICJtb2RlPTA2MjAiLAogICAgICAgICAgICAgICJnaWQ9NSIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvc2htIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L3NobSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi9tcXVldWUiLAogICAgICAgICAgICAic291cmNlIjogIm1xdWV1ZSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJtcXVldWUiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvc3lzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJzeXNmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJzeXNmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL3N5cy9mcy9jZ3JvdXAiLAogICAgICAgICAgICAic291cmNlIjogImNncm91cCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJjZ3JvdXAiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiLAogICAgICAgICAgICAgICJyZWxhdGltZSIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2V0Yy9ob3N0cyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClob3N0cyQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicnciCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L3Rlcm1pbmF0aW9uLWxvZyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeCl0ZXJtaW5hdGlvbi1sb2ckIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJ3IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2V0Yy9ob3N0bmFtZSIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClob3N0bmFtZSQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicnciCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZXRjL3Jlc29sdi5jb25mIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KXJlc29sdi5jb25mJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJydyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi92YXIvcnVuL3NlY3JldHMva3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudCIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClzZXJ2aWNlYWNjb3VudCQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicm8iCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvdmFyL3J1bi9zZWNyZXRzL2F6dXJlL3Rva2VucyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeCl0b2tlbnMkIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9CiAgICAgICAgXSwKICAgICAgICAiQW5ub3RhdGlvbnMiOiB7CiAgICAgICAgICAiaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5idW5kbGVfcGF0aCI6ICIvcnVuL2NvbnRhaW5lcmQvaW8uY29udGFpbmVyZC5ydW50aW1lLnYyLnRhc2svazhzLmlvLyQoYnVuZGxlLWlkKSIsCiAgICAgICAgICAiaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5jb250YWluZXJfdHlwZSI6ICJwb2RfY29udGFpbmVyIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItbmFtZSI6ICJuZ2lueCIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLXR5cGUiOiAiY29udGFpbmVyIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5pbWFnZS1uYW1lIjogIm1hcmluZXJjb25mcG9kc3Rlc3QuYXp1cmVjci5pby9henVyZWxpbnV4L2Jhc2Uvbmdpbng6MS4yNSIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCI6ICJeW2EtejAtOV17NjR9JCIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1uYW1lc3BhY2UiOiAiIgogICAgICAgIH0sCiAgICAgICAgIkxpbnV4IjogewogICAgICAgICAgIk5hbWVzcGFjZXMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiVHlwZSI6ICJpcGMiLAogICAgICAgICAgICAgICJQYXRoIjogIiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJUeXBlIjogInV0cyIsCiAgICAgICAgICAgICAgIlBhdGgiOiAiIgogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgIlR5cGUiOiAibW91bnQiLAogICAgICAgICAgICAgICJQYXRoIjogIiIKICAgICAgICAgICAgfQogICAgICAgICAgXSwKICAgICAgICAgICJNYXNrZWRQYXRocyI6IFsKICAgICAgICAgICAgIi9wcm9jL2FjcGkiLAogICAgICAgICAgICAiL3Byb2Mva2NvcmUiLAogICAgICAgICAgICAiL3Byb2Mva2V5cyIsCiAgICAgICAgICAgICIvcHJvYy9sYXRlbmN5X3N0YXRzIiwKICAgICAgICAgICAgIi9wcm9jL3RpbWVyX2xpc3QiLAogICAgICAgICAgICAiL3Byb2MvdGltZXJfc3RhdHMiLAogICAgICAgICAgICAiL3Byb2Mvc2NoZWRfZGVidWciLAogICAgICAgICAgICAiL3Byb2Mvc2NzaSIsCiAgICAgICAgICAgICIvc3lzL2Zpcm13YXJlIgogICAgICAgICAgXSwKICAgICAgICAgICJSZWFkb25seVBhdGhzIjogWwogICAgICAgICAgICAiL3Byb2MvYXNvdW5kIiwKICAgICAgICAgICAgIi9wcm9jL2J1cyIsCiAgICAgICAgICAgICIvcHJvYy9mcyIsCiAgICAgICAgICAgICIvcHJvYy9pcnEiLAogICAgICAgICAgICAiL3Byb2Mvc3lzIiwKICAgICAgICAgICAgIi9wcm9jL3N5c3JxLXRyaWdnZXIiCiAgICAgICAgICBdLAogICAgICAgICAgIkRldmljZXMiOiBbXSwKICAgICAgICAgICJTeXNjdGwiOiB7CiAgICAgICAgICAgICJuZXQuaXB2NC5pcF91bnByaXZpbGVnZWRfcG9ydF9zdGFydCI6ICIwIiwKICAgICAgICAgICAgIm5ldC5pcHY0LnBpbmdfZ3JvdXBfcmFuZ2UiOiAiMCAyMTQ3NDgzNjQ3IgogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSwKICAgICAgInN0b3JhZ2VzIjogWwogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2gwKSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjApIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2gxKSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjEpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2gyKSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjIpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2gzKSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjMpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2g0KSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjQpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAib3ZlcmxheWZzIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJmdXNlMy5rYXRhLW92ZXJsYXkiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICI4YmZiYmE3Njk2NjM2NTI0MDRhNjRhMjNhN2VlYWI3OTQzOGRhZWQ3MWFjY2YzMjlhNDBhNGY2OGVmYWYwZmY0OjhjYzdhZmJjZGQwNGYxN2FmZjhmNmQ0OTM1ZTRmNTRhMWY1YWRkNDdkY2E1MTZlOGQzNTQ1M2YxZjQyMTgxNjc6OTAzMGU2MGFhOGQ4YWI5YzI3ZjA1MWUyYzc4NWE1NDlkOGFlYzE4ODgxNjk5ZWFiMzIwYTA0MDlmN2ZkYmUzOTozNmFmOWMwODE0NmU2ZDI1MWQ1MTNlNTllNWExYzYyZDYyY2ZiOWViZTg1NmQ3NTM5NGJlZmRkZWNlNzQ4NGMxOjAxNjVhMGMwNzg2NTc3NWRlYTgzYTQ1MTdjMTI1ZmYzMGMxZTJjMWEwOThlN2NiY2U3YmNhZmUyYjcxOTljYmMiLAogICAgICAgICAgICAiMjQ5ZWY1NWZjZDQxMWM1YTgwNTRhYmI2MGU3MTUxMTVkNTk5ZWJiZTY4MmQ2Yjc0YmUzYmQxOTI3MjQ4ODVjMTo1MDJiNTM3MjAxYzcxMTVlZjBkMTcxNTMwYzdjZjVjMGU1MTE3NTRlOWM5NWYwNTk0MWVjMjdkMTVjOWUwMTk4OjQ4YWExMThmZGZkYTlhMzAzODdlOTBlMDY2MWYyYjViNmM4ZTg3MzU0ZDFmYTlhMzdiZjU4NTEzYWMzZTQ1MTI6OWY2MjU0NjRjN2IzNGE1NTM2ZjQzMWY1ZDI5NDYzNDNkMjcyNTgwZTM2NDQ2ZGRiMTJiMDQwMTYyZTU0M2NlMTpkNDQ5MWVhMTg4NzEwNWVmMDYwMWY0ZTVmYTM5ODNmZmU1N2Q3YTU3ZWU4ZjZiMDM3MDkxZjQyMThjMWE2MzU4IgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGNwYXRoKS8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0KICAgICAgXSwKICAgICAgImRldmljZXMiOiBbXSwKICAgICAgInNhbmRib3hfcGlkbnMiOiBmYWxzZSwKICAgICAgImV4ZWNfY29tbWFuZHMiOiBbXSwKICAgICAgImVudl9tYXAiOiB7CiAgICAgICAgIkhPU1ROQU1FIjogIiQoaG9zdC1uYW1lKSIsCiAgICAgICAgIlBBVEgiOiAiL3Vzci9sb2NhbC9zYmluOi91c3IvbG9jYWwvYmluOi91c3Ivc2JpbjovdXNyL2Jpbjovc2JpbjovYmluIgogICAgICB9CiAgICB9CiAgXSwKICAiY29tbW9uIjogewogICAgImNwYXRoIjogIi9ydW4va2F0YS1jb250YWluZXJzL3NoYXJlZC9jb250YWluZXJzIiwKICAgICJtb3VudF9zb3VyY2VfY3BhdGgiOiAiL3J1bi9rYXRhLWNvbnRhaW5lcnMvc2hhcmVkL2NvbnRhaW5lcnMiLAogICAgInNmcHJlZml4IjogIl4kKGNwYXRoKS8kKGJ1bmRsZS1pZCktW2EtejAtOV17MTZ9LSIsCiAgICAic3BhdGgiOiAiL3J1bi9rYXRhLWNvbnRhaW5lcnMvc2FuZGJveC9zdG9yYWdlIiwKICAgICJpcHY0X2EiOiAiKChbMC05XXxbMS05XVswLTldfDFbMC05XXsyfXwyWzAtNF1bMC05XXwyNVswLTVdKVxcLil7M30oWzAtOV18WzEtOV1bMC05XXwxWzAtOV17Mn18MlswLTRdWzAtOV18MjVbMC01XSkiLAogICAgImlwX3AiOiAiWzAtOV17MSw1fSIsCiAgICAic3ZjX25hbWUiOiAiW0EtWl9cXC5cXC1dKyIsCiAgICAiZG5zX2xhYmVsIjogIlthLXpBLVowLTlfXFwuXFwtXSsiLAogICAgInNfc291cmNlMSI6ICJeLi4yWzAtOV17M31fWzAtMV1bMC05XV9bMC0zXVswLTldX1swLTJdWzAtOV1fWzAtNV1bMC05XV9bMC01XVswLTldXFwuWzAtOV17MSwxMH0kIiwKICAgICJzX3NvdXJjZTIiOiAiXi4uZGF0YS8iLAogICAgImRuc19zdWJkb21haW4iOiAiXlthLXowLTldKFstYS16MC05XSpbYS16MC05XSk/JCIsCiAgICAicG9kX3VpZCI6ICJeWzAtOWEtZkEtRl17OH0tWzAtOWEtZkEtRl17NH0tWzAtOWEtZkEtRl17NH0tWzAtOWEtZkEtRl17NH0tWzAtOWEtZkEtRl17MTJ9JCIsCiAgICAiZGVmYXVsdF9jYXBzIjogWwogICAgICAiQ0FQX0NIT1dOIiwKICAgICAgIkNBUF9EQUNfT1ZFUlJJREUiLAogICAgICAiQ0FQX0ZTRVRJRCIsCiAgICAgICJDQVBfRk9XTkVSIiwKICAgICAgIkNBUF9NS05PRCIsCiAgICAgICJDQVBfTkVUX1JBVyIsCiAgICAgICJDQVBfU0VUR0lEIiwKICAgICAgIkNBUF9TRVRVSUQiLAogICAgICAiQ0FQX1NFVEZDQVAiLAogICAgICAiQ0FQX1NFVFBDQVAiLAogICAgICAiQ0FQX05FVF9CSU5EX1NFUlZJQ0UiLAogICAgICAiQ0FQX1NZU19DSFJPT1QiLAogICAgICAiQ0FQX0tJTEwiLAogICAgICAiQ0FQX0FVRElUX1dSSVRFIgogICAgXSwKICAgICJwcml2aWxlZ2VkX2NhcHMiOiBbCiAgICAgICJDQVBfQ0hPV04iLAogICAgICAiQ0FQX0RBQ19PVkVSUklERSIsCiAgICAgICJDQVBfREFDX1JFQURfU0VBUkNIIiwKICAgICAgIkNBUF9GT1dORVIiLAogICAgICAiQ0FQX0ZTRVRJRCIsCiAgICAgICJDQVBfS0lMTCIsCiAgICAgICJDQVBfU0VUR0lEIiwKICAgICAgIkNBUF9TRVRVSUQiLAogICAgICAiQ0FQX1NFVFBDQVAiLAogICAgICAiQ0FQX0xJTlVYX0lNTVVUQUJMRSIsCiAgICAgICJDQVBfTkVUX0JJTkRfU0VSVklDRSIsCiAgICAgICJDQVBfTkVUX0JST0FEQ0FTVCIsCiAgICAgICJDQVBfTkVUX0FETUlOIiwKICAgICAgIkNBUF9ORVRfUkFXIiwKICAgICAgIkNBUF9JUENfTE9DSyIsCiAgICAgICJDQVBfSVBDX09XTkVSIiwKICAgICAgIkNBUF9TWVNfTU9EVUxFIiwKICAgICAgIkNBUF9TWVNfUkFXSU8iLAogICAgICAiQ0FQX1NZU19DSFJPT1QiLAogICAgICAiQ0FQX1NZU19QVFJBQ0UiLAogICAgICAiQ0FQX1NZU19QQUNDVCIsCiAgICAgICJDQVBfU1lTX0FETUlOIiwKICAgICAgIkNBUF9TWVNfQk9PVCIsCiAgICAgICJDQVBfU1lTX05JQ0UiLAogICAgICAiQ0FQX1NZU19SRVNPVVJDRSIsCiAgICAgICJDQVBfU1lTX1RJTUUiLAogICAgICAiQ0FQX1NZU19UVFlfQ09ORklHIiwKICAgICAgIkNBUF9NS05PRCIsCiAgICAgICJDQVBfTEVBU0UiLAogICAgICAiQ0FQX0FVRElUX1dSSVRFIiwKICAgICAgIkNBUF9BVURJVF9DT05UUk9MIiwKICAgICAgIkNBUF9TRVRGQ0FQIiwKICAgICAgIkNBUF9NQUNfT1ZFUlJJREUiLAogICAgICAiQ0FQX01BQ19BRE1JTiIsCiAgICAgICJDQVBfU1lTTE9HIiwKICAgICAgIkNBUF9XQUtFX0FMQVJNIiwKICAgICAgIkNBUF9CTE9DS19TVVNQRU5EIiwKICAgICAgIkNBUF9BVURJVF9SRUFEIiwKICAgICAgIkNBUF9QRVJGTU9OIiwKICAgICAgIkNBUF9CUEYiLAogICAgICAiQ0FQX0NIRUNLUE9JTlRfUkVTVE9SRSIKICAgIF0sCiAgICAidmlydGlvX2Jsa19zdG9yYWdlX2NsYXNzZXMiOiBbCiAgICAgICJjYy1sb2NhbC1jc2kiLAogICAgICAiY2MtbWFuYWdlZC1jc2kiLAogICAgICAiY2MtbWFuYWdlZC1wcmVtaXVtLWNzaSIKICAgIF0sCiAgICAic21iX3N0b3JhZ2VfY2xhc3NlcyI6IFsKICAgICAgewogICAgICAgICJuYW1lIjogImF6dXJlZmlsZS1jc2kta2F0YS1jYyIsCiAgICAgICAgIm1vdW50X29wdGlvbnMiOiBbCiAgICAgICAgICAiZGlyX21vZGU9MDc3NyIsCiAgICAgICAgICAiZmlsZV9tb2RlPTA3NzciLAogICAgICAgICAgIm1mc3ltbGlua3MiLAogICAgICAgICAgImNhY2hlPXN0cmljdCIsCiAgICAgICAgICAibm9zaGFyZXNvY2siLAogICAgICAgICAgImFjdGltZW89MzAiLAogICAgICAgICAgIm5vYnJsIgogICAgICAgIF0KICAgICAgfQogICAgXQogIH0sCiAgInNhbmRib3giOiB7CiAgICAic3RvcmFnZXMiOiBbCiAgICAgIHsKICAgICAgICAiZHJpdmVyIjogImVwaGVtZXJhbCIsCiAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgInNvdXJjZSI6ICJzaG0iLAogICAgICAgICJmc3R5cGUiOiAidG1wZnMiLAogICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICJub2RldiIsCiAgICAgICAgICAibW9kZT0xNzc3IiwKICAgICAgICAgICJzaXplPTY3MTA4ODY0IgogICAgICAgIF0sCiAgICAgICAgIm1vdW50X3BvaW50IjogIi9ydW4va2F0YS1jb250YWluZXJzL3NhbmRib3gvc2htIiwKICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgIH0KICAgIF0KICB9LAogICJyZXF1ZXN0X2RlZmF1bHRzIjogewogICAgIkNyZWF0ZUNvbnRhaW5lclJlcXVlc3QiOiB7CiAgICAgICJhbGxvd19lbnZfcmVnZXgiOiBbCiAgICAgICAgIl5IT1NUTkFNRT0kKGRuc19sYWJlbCkkIiwKICAgICAgICAiXiQoc3ZjX25hbWUpX1BPUlRfJChpcF9wKV9UQ1A9dGNwOi8vJChpcHY0X2EpOiQoaXBfcCkkIiwKICAgICAgICAiXiQoc3ZjX25hbWUpX1BPUlRfJChpcF9wKV9UQ1BfUFJPVE89dGNwJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9QT1JUXyQoaXBfcClfVENQX1BPUlQ9JChpcF9wKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfUE9SVF8kKGlwX3ApX1RDUF9BRERSPSQoaXB2NF9hKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfU0VSVklDRV9IT1NUPSQoaXB2NF9hKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfU0VSVklDRV9QT1JUPSQoaXBfcCkkIiwKICAgICAgICAiXiQoc3ZjX25hbWUpX1NFUlZJQ0VfUE9SVF8kKGRuc19sYWJlbCk9JChpcF9wKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfUE9SVD10Y3A6Ly8kKGlwdjRfYSk6JChpcF9wKSQiLAogICAgICAgICJeQVpVUkVfQ0xJRU5UX0lEPVtBLUZhLWYwLTktXSokIiwKICAgICAgICAiXkFaVVJFX1RFTkFOVF9JRD1bQS1GYS1mMC05LV0qJCIsCiAgICAgICAgIl5BWlVSRV9GRURFUkFURURfVE9LRU5fRklMRT0vdmFyL3J1bi9zZWNyZXRzL2F6dXJlL3Rva2Vucy9henVyZS1pZGVudGl0eS10b2tlbiQiLAogICAgICAgICJeQVpVUkVfQVVUSE9SSVRZX0hPU1Q9aHR0cHM6Ly9sb2dpblxcLm1pY3Jvc29mdG9ubGluZVxcLmNvbS8kIiwKICAgICAgICAiXlRFUk09eHRlcm0kIgogICAgICBdLAogICAgICAiYWxsb3dfZW52X3JlZ2V4X21hcCI6IHsKICAgICAgICAiQ1BVX0xJTUlUIjogIl5bMC05XSskIiwKICAgICAgICAiSk9CX0NPTVBMRVRJT05fSU5ERVgiOiAiXlswLTldKiQiLAogICAgICAgICJNRU1PUllfTElNSVQiOiAiXlswLTldKyQiCiAgICAgIH0KICAgIH0sCiAgICAiQ29weUZpbGVSZXF1ZXN0IjogWwogICAgICAiJChzZnByZWZpeCkiCiAgICBdLAogICAgIkV4ZWNQcm9jZXNzUmVxdWVzdCI6IHsKICAgICAgImFsbG93ZWRfY29tbWFuZHMiOiBbXSwKICAgICAgInJlZ2V4IjogW10KICAgIH0sCiAgICAiVXBkYXRlUm91dGVzUmVxdWVzdCI6IHsKICAgICAgImZvcmJpZGRlbl9kZXZpY2VfbmFtZXMiOiBbCiAgICAgICAgImxvIgogICAgICBdLAogICAgICAiZm9yYmlkZGVuX3NvdXJjZV9yZWdleCI6IFsKICAgICAgICAiXig/OjB7MCw0fTopezAsN30wezAsM30xJCIsCiAgICAgICAgIl4xMjdcXC4oPzpbMC05XXsxLDN9XFwuKXsyfVswLTldezEsM30kIgogICAgICBdCiAgICB9LAogICAgIlVwZGF0ZUludGVyZmFjZVJlcXVlc3QiOiB7CiAgICAgICJhbGxvd19yYXdfZmxhZ3MiOiAxMjgsCiAgICAgICJmb3JiaWRkZW5fbmFtZXMiOiBbCiAgICAgICAgImxvIgogICAgICBdLAogICAgICAiZm9yYmlkZGVuX2h3X2FkZHJzIjogWwogICAgICAgICIwMDowMDowMDowMDowMDowMCIKICAgICAgXQogICAgfSwKICAgICJDbG9zZVN0ZGluUmVxdWVzdCI6IGZhbHNlLAogICAgIlJlYWRTdHJlYW1SZXF1ZXN0IjogZmFsc2UsCiAgICAiVXBkYXRlRXBoZW1lcmFsTW91bnRzUmVxdWVzdCI6IGZhbHNlLAogICAgIldyaXRlU3RyZWFtUmVxdWVzdCI6IGZhbHNlCiAgfQp9 + spec: + runtimeClassName: kata-cc + containers: + - name: nginx + image: "marinerconfpodstest.azurecr.io/azurelinux/base/nginx:1.25" + ports: + - containerPort: 80 diff --git a/src/agent/samples/policy/yaml/kubernetes/fixtures/daemon.yaml b/src/agent/samples/policy/yaml/kubernetes/fixtures/daemon.yaml new file mode 100644 index 000000000000..cd2baa5e3405 --- /dev/null +++ b/src/agent/samples/policy/yaml/kubernetes/fixtures/daemon.yaml @@ -0,0 +1,36 @@ +--- +apiVersion: apps/v1 +kind: DaemonSet +metadata: + name: prometheus-node-exporter +spec: + selector: + matchLabels: + daemon: prom-node-exp + katacontainers.io/kata-runtime: "true" + template: + metadata: + name: prometheus-node-exporter + labels: + daemon: prom-node-exp + katacontainers.io/kata-runtime: "true" + annotations: + io.katacontainers.config.agent.policy: IyBDb3B5cmlnaHQgKGMpIDIwMjMgTWljcm9zb2Z0IENvcnBvcmF0aW9uCiMKIyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMAojCnBhY2thZ2UgYWdlbnRfcG9saWN5CgppbXBvcnQgZnV0dXJlLmtleXdvcmRzLmluCmltcG9ydCBmdXR1cmUua2V5d29yZHMuZXZlcnkKCiMgRGVmYXVsdCB2YWx1ZXMsIHJldHVybmVkIGJ5IE9QQSB3aGVuIHJ1bGVzIGNhbm5vdCBiZSBldmFsdWF0ZWQgdG8gdHJ1ZS4KZGVmYXVsdCBBZGRBUlBOZWlnaGJvcnNSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgQWRkU3dhcFJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBDbG9zZVN0ZGluUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IENvcHlGaWxlUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IENyZWF0ZUNvbnRhaW5lclJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBDcmVhdGVTYW5kYm94UmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IERlc3Ryb3lTYW5kYm94UmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgRXhlY1Byb2Nlc3NSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgR2V0T09NRXZlbnRSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBHdWVzdERldGFpbHNSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBMaXN0SW50ZXJmYWNlc1JlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBMaXN0Um91dGVzUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IE1lbUhvdHBsdWdCeVByb2JlUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IE9ubGluZUNQVU1lbVJlcXVlc3QgOj0gdHJ1ZQpkZWZhdWx0IFBhdXNlQ29udGFpbmVyUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFJlYWRTdHJlYW1SZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgUmVtb3ZlQ29udGFpbmVyUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgUmVtb3ZlU3RhbGVWaXJ0aW9mc1NoYXJlTW91bnRzUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgUmVzZWVkUmFuZG9tRGV2UmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFJlc3VtZUNvbnRhaW5lclJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBTZXRHdWVzdERhdGVUaW1lUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFNldFBvbGljeVJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBTaWduYWxQcm9jZXNzUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgU3RhcnRDb250YWluZXJSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBTdGFydFRyYWNpbmdSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgU3RhdHNDb250YWluZXJSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBTdG9wVHJhY2luZ1JlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBUdHlXaW5SZXNpemVSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBVcGRhdGVDb250YWluZXJSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgVXBkYXRlRXBoZW1lcmFsTW91bnRzUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFVwZGF0ZUludGVyZmFjZVJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBVcGRhdGVSb3V0ZXNSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgV2FpdFByb2Nlc3NSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBXcml0ZVN0cmVhbVJlcXVlc3QgOj0gZmFsc2UKCiMgQWxsb3dSZXF1ZXN0c0ZhaWxpbmdQb2xpY3kgOj0gdHJ1ZSBjb25maWd1cmVzIHRoZSBBZ2VudCB0byAqYWxsb3cgYW55CiMgcmVxdWVzdHMgY2F1c2luZyBhIHBvbGljeSBmYWlsdXJlKi4gVGhpcyBpcyBhbiB1bnNlY3VyZSBjb25maWd1cmF0aW9uCiMgYnV0IGlzIHVzZWZ1bCBmb3IgYWxsb3dpbmcgdW5zZWN1cmUgcG9kcyB0byBzdGFydCwgdGhlbiBjb25uZWN0IHRvCiMgdGhlbSBhbmQgaW5zcGVjdCBPUEEgbG9ncyBmb3IgdGhlIHJvb3QgY2F1c2Ugb2YgYSBmYWlsdXJlLgpkZWZhdWx0IEFsbG93UmVxdWVzdHNGYWlsaW5nUG9saWN5IDo9IGZhbHNlCgojIENvbnN0YW50cwpTX05BTUVfS0VZID0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZSIKU19OQU1FU1BBQ0VfS0VZID0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZXNwYWNlIgpCVU5ETEVfSUQgPSAiW2EtejAtOV17NjR9IgoKQ3JlYXRlQ29udGFpbmVyUmVxdWVzdDo9IHJlc3AgewogICAgbm90IGlzX251bGwoaW5wdXQuZW52X21hcCkKICAgIAogICAgaV9lbnZfbWFwIDo9IGlucHV0LmVudl9tYXAKICAgIAogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBwX2Vudl9tYXAgOj0gcF9jb250YWluZXIuZW52X21hcCAgCiAgICBhbGxvd19lbnZfbWFwKHBfZW52X21hcCwgaV9lbnZfbWFwKQogICAgCiAgICBpX3Byb2Nlc3MgOj0gaW5wdXQuYmFzZS5PQ0kuUHJvY2VzcwogICAgCiAgICBwX3Byb2Nlc3MgOj0gcF9jb250YWluZXIuT0NJLlByb2Nlc3MKICAgIAogICAgYWxsb3dfYXJncyhpX3Byb2Nlc3MsIHBfcHJvY2VzcywgaV9lbnZfbWFwKQoKICAgIHJlc3AgPSBDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uKGlucHV0LmJhc2UpCiAgICBwcmludCgiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdDogdHJ1ZSIpCn0KCmFsbG93X2FyZ3MoaV9wcm9jZXNzLCBwX3Byb2Nlc3MsIGlfZW52X21hcCkgewogICAgaV9hcmdzIDo9IGlfcHJvY2Vzcy5BcmdzCiAgICBwX2FyZ3MgOj0gcF9wcm9jZXNzLkFyZ3MKICAgIHByaW50KCJhbGxvd19hcmdzOiBpX2FyZ3MgPSIsIGlfYXJncywgInBfYXJncyA9IiwgcF9hcmdzKQogICAgY291bnQoaV9hcmdzKSA9PSBjb3VudChwX2FyZ3MpCiAgICBldmVyeSBpLCBpX2FyZyBpbiBpX2FyZ3MgewogICAgICAgIHByaW50KCJhbGxvd19hcmdzOiBpX2FyZyA9IiwgaV9hcmcpCiAgICAgICAgcF9hcmdfcmVwbGFjZWQgOj0gcmVwbGFjZV9lbnZfdmFyaWFibGVzKHBfYXJnc1tpXSwgaV9lbnZfbWFwKQogICAgICAgIHByaW50KCJhbGxvd19hcmdzOiBwX2FyZ19yZXBsYWNlZCA9IiwgcF9hcmdfcmVwbGFjZWQpCiAgICAgICAgcF9hcmdfcmVwbGFjZWQyIDo9IHJlcGxhY2UocF9hcmdfcmVwbGFjZWQsICIkJCIsICIkIikKICAgICAgICBwcmludCgiYWxsb3dfYXJnczogcF9hcmdfcmVwbGFjZWQyID0iLCBwX2FyZ19yZXBsYWNlZDIpCiAgICAgICAgaV9hcmcgPT0gcF9hcmdfcmVwbGFjZWQyCiAgICB9CiAgICBwcmludCgiYWxsb3dfYXJnczogdHJ1ZSIpCn0KCmFsbG93X2FyZ3MoaV9wcm9jZXNzLCBwX3Byb2Nlc3MsIGlfZW52X21hcCkgewogICAgbm90IGlfcHJvY2Vzcy5BcmdzCiAgICBub3QgcF9wcm9jZXNzLkFyZ3MKICAgIHByaW50KCJhbGxvd19hcmdzMjogbm8gYXJncyIpCn0KCiMgdGhpcyBmdW5jdGlvbiByZXBsYWNlcyBhbGwgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyBpbiBhIHN0cmluZywgZ2l2ZW4gYSBtYXAgb2YgZW52aXJvbm1lbnQga2V5cyB0byBlbnZpcm9ubWVudCB2YWx1ZXMKIyBlZyBzdHIgPSAiZWNobyAkKENMVVNURVJfSUQpOyBlY2hvICQoTk9ERV9OQU1FKTsiCiMgZW52X21hcCA9IHsiQ0xVU1RFUl9JRCI6ICJhYmMiLCAiTk9ERV9OQU1FIiA6ICJ4eXoifQojIHJlc3VsdCA9ICJlY2hvIGFiYzsgZWNobyB4eXo7IgpyZXBsYWNlX2Vudl92YXJpYWJsZXMoc3RyLCBlbnZfbWFwKSA9IHJlc3VsdCB7CiAgICAjIG1ha2UgYW4gYXJyYXkgb2YgdGhlIGtleXMgZWcgWyJDTFVTVEVSX0lEIiwgIk5PREVfTkFNRSJdCiAgICBrZXlzIDo9IFt4IHwgc29tZSB4IGluIG9iamVjdC5rZXlzKGVudl9tYXApXQogICAgcmVzdWx0IDo9IHJlcGxhY2Vfc3RyX3JlYyhzdHIsIGVudl9tYXAsIGtleXMsIGNvdW50KGtleXMpIC0gMSkKfQoKIyBiYXNlIGNhc2UKcmVwbGFjZV9zdHJfcmVjKHN0ciwgZW52X21hcCwgYXJyX2tleXMsIGkpID0gcmVzdWx0IHsKICAgIGkgPCAwCiAgICByZXN1bHQgOj0gc3RyCn0KCiMgcmVjdXJzaXZlIHN0ZXAKcmVwbGFjZV9zdHJfcmVjKHN0ciwgZW52X21hcCwgYXJyX2tleXMsIGkpID0gcmVzdWx0IHsKICAgIGkgPj0gMAogICAga2V5IDo9IGFycl9rZXlzW2ldCiAgICBlbnZfa2V5MSA6PSBjb25jYXQoIiIsIFsiJCgiLCBrZXksICIpIl0pCiAgICAjIHJlcGxhY2UgJChWQVIpIHdpdGggdmFsdWUKICAgIG5ld19zdHIxIDo9IHJlcGxhY2Uoc3RyLCBlbnZfa2V5MSwgZW52X21hcFtrZXldKQogICAgIyByZXBsYWNlIG5leHQgZW52aXJvbm1lbnQgdmFyaWFibGUKICAgIHJlc3VsdCA9IHJlcGxhY2Vfc3RyX3JlYyhuZXdfc3RyMSwgZW52X21hcCwgYXJyX2tleXMsIGkgLSAxKQp9CgphbGxvd19lbnZfbWFwKHBfZW52X21hcCwgaV9lbnZfbWFwKSB7CiAgICBwcmludCgiYWxsb3dfZW52X21hcDogcF9lbnZfbWFwID0iLCBwX2Vudl9tYXApCiAgICBldmVyeSBlbnZfa2V5LCBlbnZfdmFsIGluIGlfZW52X21hcCB7CiAgICAgICAgcHJpbnQoImFsbG93X2VudjogZW52X2tleSA9IiwgZW52X2tleSwgImVudl92YWwgPSIsIGVudl92YWwpCiAgICAgICAgYWxsb3dfZW52X21hcF9lbnRyeShlbnZfa2V5LCBlbnZfdmFsLCBwX2Vudl9tYXApCiAgICB9CiAgICBwcmludCgiYWxsb3dfZW52X21hcDogdHJ1ZSIpCn0KCiMgQWxsb3cgZXhhY3QgbWF0Y2gKYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBpX3ZhbCA9PSBwX3ZhbAogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnk6IHRydWUiKQp9CgojIEFsbG93IHJlc291cmNlRmllbGRSZWYgdmFsdWVzIChlLmcuLCAibGltaXRzLmNwdSIpLgphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgICMgYSB2YXJpYWJsZSB3ZSBzaG91bGQgYmUgdmFsaWRhdGluZyB1c2luZyBhIHJlZ2V4IGZyb20gc2V0dGluZ3MKICAgIHBfdmFsID09ICIkKHZhbGlkYXRlLWZyb20tc2V0dGluZ3MpIgogICAgcmVnZXhfdmFsIDo9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuQ3JlYXRlQ29udGFpbmVyUmVxdWVzdC5hbGxvd19lbnZfcmVnZXhfbWFwW2tleV0KICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4X3ZhbCwgaV92YWwpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSAyOiB0cnVlIikKfQoKIyBBbGxvdyBub2RlLW5hbWUKYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChub2RlLW5hbWUpIgogICAgcmVnZXgubWF0Y2gocG9saWN5X2RhdGEuY29tbW9uLmRuc19zdWJkb21haW4gLCBpX3ZhbCkKICAgIHByaW50KCJhbGxvd19lbnZfbWFwX2VudHJ5IDM6IHRydWUiKQp9CgojIEFsbG93IGhvc3QtbmFtZQphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgIHBfdmFsID09ICIkKGhvc3QtbmFtZSkiCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24uZG5zX2xhYmVsICwgaV92YWwpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSA0OiB0cnVlIikKfQoKIyBBbGxvdyBwb2QtdWlkCmFsbG93X2Vudl9tYXBfZW50cnkoa2V5LCBpX3ZhbCwgcF9lbnZfbWFwKSB7CiAgICBwX3ZhbCA6PSBwX2Vudl9tYXBba2V5XQogICAgcF92YWwgPT0gIiQocG9kLXVpZCkiCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24ucG9kX3VpZCAsIGlfdmFsKQogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgNTogdHJ1ZSIpCn0KCiMgQWxsb3cgZmllbGRSZWYgImZpZWxkUGF0aDogc3RhdHVzLnBvZElQIiB2YWx1ZXMuCmFsbG93X2Vudl9tYXBfZW50cnkoa2V5LCBpX3ZhbCwgcF9lbnZfbWFwKSB7CiAgICBpc19pcChpX3ZhbCkKCiAgICBwX3ZhbCA6PSBwX2Vudl9tYXBba2V5XQogICAgcF92YXIgOj0gY29uY2F0KCI9IiwgW2tleSwgcF92YWxdKQogICAgYWxsb3dfcG9kX2lwX3ZhcihrZXksIHBfdmFyKQogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgNjogdHJ1ZSIpCn0KCiMgQWxsb3cgZmllbGRSZWYgImZpZWxkUGF0aDogc3RhdHVzLmhvc3RJUCIgdmFsdWVzLgphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgaXNfaXAoaV92YWwpCgogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgIHBfdmFyIDo9IGNvbmNhdCgiPSIsIFtrZXksIHBfdmFsXSkKICAgIGFsbG93X2hvc3RfaXBfdmFyKGtleSwgcF92YXIpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSA3OiB0cnVlIikKfQoKIyBNYXRjaCBpbnB1dCB3aXRoIG9uZSBvZiB0aGUgcG9saWN5IHZhcmlhYmxlcywgYWZ0ZXIgc3Vic3RpdHV0aW5nICQoc2FuZGJveC1uYW1lKS4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChzYW5kYm94LW5hbWUpIgogICAgc19uYW1lIDo9IGlucHV0LmJhc2UuT0NJLkFubm90YXRpb25zW1NfTkFNRV9LRVldCiAgICBwX3ZhcjIgOj0gcmVwbGFjZShwX3ZhbCwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHBfdmFyMiA9PSBpX3ZhbAogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgODogdHJ1ZSIpCn0KCiMgTWF0Y2ggaW5wdXQgd2l0aCBvbmUgb2YgdGhlIHBvbGljeSB2YXJpYWJsZXMsIGFmdGVyIHN1YnN0aXR1dGluZyAkKHNhbmRib3gtbmFtZXNwYWNlKS4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChzYW5kYm94LW5hbWVzcGFjZSkiCiAgICBzX25hbWVzcGFjZSA6PSBpbnB1dC5iYXNlLk9DSS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwX3ZhcjIgOj0gcmVwbGFjZShwX3ZhbCwgIiQoc2FuZGJveC1uYW1lc3BhY2UpIiwgc19uYW1lc3BhY2UpCiAgICBwX3ZhcjIgPT0gaV92YWwKICAgIHByaW50KCJhbGxvd19lbnZfbWFwX2VudHJ5IDk6IHRydWUiKQp9CgojIEFsbG93IGlucHV0IGVudiB2YXJpYWJsZXMgdGhhdCBtYXRjaCB3aXRoIGEgcmVxdWVzdF9kZWZhdWx0cyByZWdleC4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHNvbWUgcF9yZWdleDEgaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5DcmVhdGVDb250YWluZXJSZXF1ZXN0LmFsbG93X2Vudl9yZWdleAogICAgcF9yZWdleDIgOj0gcmVwbGFjZShwX3JlZ2V4MSwgIiQoaXB2NF9hKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcHY0X2EpCiAgICBwX3JlZ2V4MyA6PSByZXBsYWNlKHBfcmVnZXgyLCAiJChpcF9wKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcF9wKQogICAgcF9yZWdleDQgOj0gcmVwbGFjZShwX3JlZ2V4MywgIiQoc3ZjX25hbWUpIiwgcG9saWN5X2RhdGEuY29tbW9uLnN2Y19uYW1lKQogICAgcF9yZWdleDUgOj0gcmVwbGFjZShwX3JlZ2V4NCwgIiQoZG5zX2xhYmVsKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5kbnNfbGFiZWwpCgogICAgcmVzdWx0IDo9IGNvbmNhdCgiPSIsIFtrZXksIGlfdmFsXSkKICAgIHJlZ2V4Lm1hdGNoKHBfcmVnZXg1LCByZXN1bHQpCgogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgMTA6IHRydWUiKQp9CgpDcmVhdGVDb250YWluZXJSZXF1ZXN0Oj0gcmVzcCB7CiAgICBub3QgaW5wdXQuZW52X21hcAogICAgaV9wcm9jZXNzID0gaW5wdXQuT0NJLlByb2Nlc3MKICAgIHNfbmFtZSA9IGlucHV0Lk9DSS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBwX3Byb2Nlc3MgPSBwX2NvbnRhaW5lci5PQ0kuUHJvY2VzcwogICAgYWxsb3dfZGVwcmVjYXRlZF9hcmdzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUpCiAgICByZXNwID0gQ3JlYXRlQ29udGFpbmVyUmVxdWVzdENvbW1vbihpbnB1dCkKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0MjogdHJ1ZSIpCn0KCkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb24ocmVxKTo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgICMgQ2hlY2sgaWYgdGhlIGlucHV0IHJlcXVlc3Qgc2hvdWxkIGJlIHJlamVjdGVkIGV2ZW4gYmVmb3JlIGNoZWNraW5nIHRoZQogICAgIyBwb2xpY3lfZGF0YS5jb250YWluZXJzIGluZm9ybWF0aW9uLgogICAgYWxsb3dfY3JlYXRlX2NvbnRhaW5lcl9pbnB1dChyZXEpCgogICAgaV9vY2kgOj0gcmVxLk9DSQogICAgaV9zdG9yYWdlcyA6PSByZXEuc3RvcmFnZXMKICAgIGlfZGV2aWNlcyA6PSByZXEuZGV2aWNlcwoKICAgICMgYXJyYXkgb2YgcG9zc2libGUgc3RhdGUgb3BlcmF0aW9ucwogICAgb3BzX2J1aWxkZXIgOj0gW10KCiAgICAjIGNoZWNrIHNhbmRib3ggbmFtZQogICAgc2FuZGJveF9uYW1lID0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FX0tFWV0KICAgIGFkZF9zYW5kYm94X25hbWVfdG9fc3RhdGUgOj0gc3RhdGVfYWxsb3dzKCJzYW5kYm94X25hbWUiLCBzYW5kYm94X25hbWUpCiAgICBvcHNfYnVpbGRlcjEgOj0gY29uY2F0X29wX2lmX25vdF9udWxsKG9wc19idWlsZGVyLCBhZGRfc2FuZGJveF9uYW1lX3RvX3N0YXRlKQoKICAgICMgQ2hlY2sgaWYgYW55IGVsZW1lbnQgZnJvbSB0aGUgcG9saWN5X2RhdGEuY29udGFpbmVycyBhcnJheSBhbGxvd3MgdGhlIGlucHV0IHJlcXVlc3QuCiAgICBzb21lIHBfY29udGFpbmVyIGluIHBvbGljeV9kYXRhLmNvbnRhaW5lcnMKICAgIHByaW50KCI9PT09PT09PSBDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiB0cnlpbmcgbmV4dCBwb2xpY3kgY29udGFpbmVyIikKCiAgICBwX3BpZG5zIDo9IHBfY29udGFpbmVyLnNhbmRib3hfcGlkbnMKICAgIGlfcGlkbnMgOj0gcmVxLnNhbmRib3hfcGlkbnMKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiBwX3BpZG5zID0iLCBwX3BpZG5zLCAiaV9waWRucyA9IiwgaV9waWRucykKICAgIHBfcGlkbnMgPT0gaV9waWRucwoKICAgIHBfb2NpIDo9IHBfY29udGFpbmVyLk9DSQoKICAgICMgY2hlY2sgbmFtZXNwYWNlCiAgICBwX25hbWVzcGFjZSA6PSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBpX25hbWVzcGFjZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwcmludCAoIkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb246IHBfbmFtZXNwYWNlID0iLCBwX25hbWVzcGFjZSwgImlfbmFtZXNwYWNlID0iLCBpX25hbWVzcGFjZSkKICAgIGFkZF9uYW1lc3BhY2VfdG9fc3RhdGUgOj0gYWxsb3dfbmFtZXNwYWNlKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkKICAgIG9wc19idWlsZGVyMiA6PSBjb25jYXRfb3BfaWZfbm90X251bGwob3BzX2J1aWxkZXIxLCBhZGRfbmFtZXNwYWNlX3RvX3N0YXRlKQoKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiBwIFZlcnNpb24gPSIsIHBfb2NpLlZlcnNpb24sICJpIFZlcnNpb24gPSIsIGlfb2NpLlZlcnNpb24pCiAgICBwX29jaS5WZXJzaW9uID09IGlfb2NpLlZlcnNpb24KCiAgICBwcmludCgiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdENvbW1vbjogcCBSZWFkb25seSA9IiwgcF9vY2kuUm9vdC5SZWFkb25seSwgImkgUmVhZG9ubHkgPSIsIGlfb2NpLlJvb3QuUmVhZG9ubHkpCiAgICBwX29jaS5Sb290LlJlYWRvbmx5ID09IGlfb2NpLlJvb3QuUmVhZG9ubHkKCiAgICBhbGxvd19hbm5vKHBfb2NpLCBpX29jaSkKCiAgICBwX3N0b3JhZ2VzIDo9IHBfY29udGFpbmVyLnN0b3JhZ2VzCiAgICBhbGxvd19ieV9hbm5vKHBfb2NpLCBpX29jaSwgcF9zdG9yYWdlcywgaV9zdG9yYWdlcykKCiAgICBwX2RldmljZXMgOj0gcF9jb250YWluZXIuZGV2aWNlcwogICAgYWxsb3dfZGV2aWNlcyhwX2RldmljZXMsIGlfZGV2aWNlcykKCiAgICByZXQgOj0gYWxsb3dfbGludXgob3BzX2J1aWxkZXIyLCBwX29jaSwgaV9vY2kpCiAgICByZXQuYWxsb3dlZAoKICAgIG9wcyA6PSByZXQub3BzCgogICAgcHJpbnQoIkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb246IHRydWUiKQp9CgphbGxvd19jcmVhdGVfY29udGFpbmVyX2lucHV0KHJlcSkgewogICAgcHJpbnQoImFsbG93X2NyZWF0ZV9jb250YWluZXJfaW5wdXQ6IGlucHV0ID0iLCByZXEpCgogICAgY291bnQocmVxLnNoYXJlZF9tb3VudHMpID09IDAKICAgIGlzX251bGwocmVxLnN0cmluZ191c2VyKQoKICAgIGlfb2NpIDo9IHJlcS5PQ0kKICAgIGlzX251bGwoaV9vY2kuSG9va3MpCiAgICBpc19udWxsKGlfb2NpLlNvbGFyaXMpCiAgICBpc19udWxsKGlfb2NpLldpbmRvd3MpCgogICAgaV9saW51eCA6PSBpX29jaS5MaW51eAogICAgY291bnQoaV9saW51eC5HSURNYXBwaW5ncykgPT0gMAogICAgY291bnQoaV9saW51eC5Nb3VudExhYmVsKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlJlc291cmNlcy5EZXZpY2VzKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlJvb3Rmc1Byb3BhZ2F0aW9uKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlVJRE1hcHBpbmdzKSA9PSAwCiAgICBpc19udWxsKGlfbGludXguSW50ZWxSZHQpCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLkJsb2NrSU8pCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLk5ldHdvcmspCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLlBpZHMpCiAgICBpc19udWxsKGlfbGludXguU2VjY29tcCkKCiAgICBpX3Byb2Nlc3MgOj0gaV9vY2kuUHJvY2VzcwogICAgY291bnQoaV9wcm9jZXNzLlNlbGludXhMYWJlbCkgPT0gMAogICAgY291bnQoaV9wcm9jZXNzLlVzZXIuVXNlcm5hbWUpID09IDAKCiAgICBwcmludCgiYWxsb3dfY3JlYXRlX2NvbnRhaW5lcl9pbnB1dDogdHJ1ZSIpCn0KCmFsbG93X25hbWVzcGFjZShwX25hbWVzcGFjZSwgaV9uYW1lc3BhY2UpID0gYWRkX25hbWVzcGFjZSB7CiAgICBwX25hbWVzcGFjZSA9PSBpX25hbWVzcGFjZQogICAgYWRkX25hbWVzcGFjZSA6PSBudWxsCiAgICBwcmludCgiYWxsb3dfbmFtZXNwYWNlIDE6IGlucHV0IG5hbWVzcGFjZSBtYXRjaGVzIHBvbGljeSBkYXRhIikKfQoKYWxsb3dfbmFtZXNwYWNlKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkgPSBhZGRfbmFtZXNwYWNlIHsKICAgIHBfbmFtZXNwYWNlID09ICIiCiAgICBwcmludCgiYWxsb3dfbmFtZXNwYWNlIDI6IG5vIG5hbWVzcGFjZSBmb3VuZCBvbiBwb2xpY3kgZGF0YSIpCiAgICBhZGRfbmFtZXNwYWNlIDo9IHN0YXRlX2FsbG93cygibmFtZXNwYWNlIiwgaV9uYW1lc3BhY2UpCn0KCiMgdmFsdWUgaGFzbid0IGJlZW4gc2VlbiBiZWZvcmUsIHNhdmUgaXQgdG8gc3RhdGUKc3RhdGVfYWxsb3dzKGtleSwgdmFsdWUpID0gYWN0aW9uIHsKICBzdGF0ZSA6PSBnZXRfc3RhdGUoKQogIHByaW50KCJzdGF0ZV9hbGxvd3MgMTogc3RhdGVba2V5XSA9Iiwgc3RhdGVba2V5XSwgInZhbHVlID0iLCB2YWx1ZSkKICBub3Qgc3RhdGVba2V5XQogIHByaW50KCJzdGF0ZV9hbGxvd3MgMTogc2F2aW5nIHRvIHN0YXRlIGtleSA9Iiwga2V5LCAidmFsdWUgPSIsIHZhbHVlKQogIHBhdGggOj0gZ2V0X3N0YXRlX3BhdGgoa2V5KSAKICBhY3Rpb24gOj0gewogICAgIm9wIjogImFkZCIsCiAgICAicGF0aCI6IHBhdGgsIAogICAgInZhbHVlIjogdmFsdWUsCiAgfQp9CgojIHZhbHVlIG1hdGNoZXMgd2hhdCdzIGluIHN0YXRlLCBhbGxvdyBpdApzdGF0ZV9hbGxvd3Moa2V5LCB2YWx1ZSkgPSBhY3Rpb24gewogIHByaW50KCJzdGF0ZV9hbGxvd3MgMjogc3RhcnQiKQogIHN0YXRlIDo9IGdldF9zdGF0ZSgpCiAgcHJpbnQoInN0YXRlX2FsbG93cyAyOiBzdGF0ZVtrZXldID0iLCBzdGF0ZVtrZXldLCAidmFsdWUgPSIsIHZhbHVlKQogIHZhbHVlID09IHN0YXRlW2tleV0KICBwcmludCgic3RhdGVfYWxsb3dzIDI6IGZvdW5kIGtleSA9Iiwga2V5LCAidmFsdWUgPSIsIHZhbHVlLCAiIGluIHN0YXRlIikKICBhY3Rpb24gOj0gbnVsbAp9CgojIGhlbHBlciBmdW5jdGlvbnMgdG8gaW50ZXJhY3Qgd2l0aCB0aGUgc3RhdGUKZ2V0X3N0YXRlKCkgPSBzdGF0ZSB7CiAgc3RhdGUgOj0gZGF0YVsicHN0YXRlIl0KfQoKZ2V0X3N0YXRlX3ZhbChrZXkpID0gdmFsdWUgewogICAgc3RhdGUgOj0gZ2V0X3N0YXRlKCkKICAgIHZhbHVlIDo9IHN0YXRlW2tleV0KfQoKZ2V0X3N0YXRlX3BhdGgoa2V5KSA9IHBhdGggewogICAgIyBwcmVwZW5kICIvcHN0YXRlLyIgdG8ga2V5CiAgICBwYXRoIDo9IGNvbmNhdCgiLyIsIFsiL3BzdGF0ZSIsIGtleV0pCn0KCiMgSGVscGVyIGZ1bmN0aW9ucyB0byBjb25kaXRpb25hbGx5IGNvbmNhdGVuYXRlIG9wIGlzIG5vdCBudWxsCmNvbmNhdF9vcF9pZl9ub3RfbnVsbChvcHMsIG9wKSA9IHJlc3VsdCB7CiAgICBvcCA9PSBudWxsCiAgICByZXN1bHQgOj0gb3BzCn0KCmNvbmNhdF9vcF9pZl9ub3RfbnVsbChvcHMsIG9wKSA9IHJlc3VsdCB7CiAgICBvcCAhPSBudWxsCiAgICByZXN1bHQgOj0gYXJyYXkuY29uY2F0KG9wcywgW29wXSkKfQoKIyBSZWplY3QgdW5leHBlY3RlZCBhbm5vdGF0aW9ucy4KYWxsb3dfYW5ubyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19hbm5vIDE6IHN0YXJ0IikKCiAgICBub3QgaV9vY2kuQW5ub3RhdGlvbnMKCiAgICBwcmludCgiYWxsb3dfYW5ubyAxOiB0cnVlIikKfQphbGxvd19hbm5vKHBfb2NpLCBpX29jaSkgewogICAgcHJpbnQoImFsbG93X2Fubm8gMjogcCBBbm5vdGF0aW9ucyA9IiwgcF9vY2kuQW5ub3RhdGlvbnMpCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiBpIEFubm90YXRpb25zID0iLCBpX29jaS5Bbm5vdGF0aW9ucykKCiAgICBpX2tleXMgOj0gb2JqZWN0LmtleXMoaV9vY2kuQW5ub3RhdGlvbnMpCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiBpIGtleXMgPSIsIGlfa2V5cykKCiAgICBldmVyeSBpX2tleSBpbiBpX2tleXMgewogICAgICAgIGFsbG93X2Fubm9fa2V5KGlfa2V5LCBwX29jaSkKICAgIH0KCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiB0cnVlIikKfQoKYWxsb3dfYW5ub19rZXkoaV9rZXksIHBfb2NpKSB7CiAgICBwcmludCgiYWxsb3dfYW5ub19rZXkgMTogaSBrZXkgPSIsIGlfa2V5KQoKICAgIHN0YXJ0c3dpdGgoaV9rZXksICJpby5rdWJlcm5ldGVzLmNyaS4iKQoKICAgIHByaW50KCJhbGxvd19hbm5vX2tleSAxOiB0cnVlIikKfQphbGxvd19hbm5vX2tleShpX2tleSwgcF9vY2kpIHsKICAgIHByaW50KCJhbGxvd19hbm5vX2tleSAyOiBpIGtleSA9IiwgaV9rZXkpCgogICAgc29tZSBwX2tleSwgXyBpbiBwX29jaS5Bbm5vdGF0aW9ucwogICAgcF9rZXkgPT0gaV9rZXkKCiAgICBwcmludCgiYWxsb3dfYW5ub19rZXkgMjogdHJ1ZSIpCn0KCiMgR2V0IHRoZSB2YWx1ZSBvZiB0aGUgU19OQU1FX0tFWSBhbm5vdGF0aW9uIGFuZAojIGNvcnJlbGF0ZSBpdCB3aXRoIG90aGVyIGFubm90YXRpb25zIGFuZCBwcm9jZXNzIGZpZWxkcy4KYWxsb3dfYnlfYW5ubyhwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpIHsKICAgIHByaW50KCJhbGxvd19ieV9hbm5vIDE6IHN0YXJ0IikKCiAgICBub3QgcF9vY2kuQW5ub3RhdGlvbnNbU19OQU1FX0tFWV0KCiAgICBpX3NfbmFtZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMTogaV9zX25hbWUgPSIsIGlfc19uYW1lKQoKICAgIGlfc19uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FU1BBQ0VfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMTogaV9zX25hbWVzcGFjZSA9IiwgaV9zX25hbWVzcGFjZSkKCiAgICBhbGxvd19ieV9zYW5kYm94X25hbWUocF9vY2ksIGlfb2NpLCBwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBpX3NfbmFtZSwgaV9zX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfYnlfYW5ubyAxOiB0cnVlIikKfQphbGxvd19ieV9hbm5vKHBfb2NpLCBpX29jaSwgcF9zdG9yYWdlcywgaV9zdG9yYWdlcykgewogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMjogc3RhcnQiKQoKICAgIHBfc19uYW1lIDo9IHBfb2NpLkFubm90YXRpb25zW1NfTkFNRV9LRVldCiAgICBpX3NfbmFtZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMjogaV9zX25hbWUgPSIsIGlfc19uYW1lLCAicF9zX25hbWUgPSIsIHBfc19uYW1lKQoKICAgIGFsbG93X3NhbmRib3hfbmFtZShwX3NfbmFtZSwgaV9zX25hbWUpCgogICAgaV9zX25hbWVzcGFjZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwcmludCgiYWxsb3dfYnlfYW5ubyAyOiBpX3NfbmFtZXNwYWNlID0iLCBpX3NfbmFtZXNwYWNlKQoKICAgIGFsbG93X2J5X3NhbmRib3hfbmFtZShwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMsIGlfc19uYW1lLCBpX3NfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd19ieV9hbm5vIDI6IHRydWUiKQp9CgphbGxvd19ieV9zYW5kYm94X25hbWUocF9vY2ksIGlfb2NpLCBwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfYnlfc2FuZGJveF9uYW1lOiBzdGFydCIpCgogICAgaV9uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FU1BBQ0VfS0VZXQoKICAgIGFsbG93X2J5X2NvbnRhaW5lcl90eXBlcyhwX29jaSwgaV9vY2ksIHNfbmFtZSwgaV9uYW1lc3BhY2UpCiAgICBhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZChwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpCiAgICBhbGxvd19wcm9jZXNzKHBfb2NpLlByb2Nlc3MsIGlfb2NpLlByb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpCgogICAgcHJpbnQoImFsbG93X2J5X3NhbmRib3hfbmFtZTogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfbmFtZShwX3NfbmFtZSwgaV9zX25hbWUpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X25hbWU6IHN0YXJ0IikKICAgIHJlZ2V4Lm1hdGNoKHBfc19uYW1lLCBpX3NfbmFtZSkKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9uYW1lOiB0cnVlIikKfQoKIyBDaGVjayB0aGF0IHRoZSAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLXR5cGUiIGFuZAojICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIiBhbm5vdGF0aW9ucyBkZXNpZ25hdGUgdGhlCiMgZXhwZWN0ZWQgdHlwZSAtIGVpdGhlciBhICJzYW5kYm94IiBvciBhICJjb250YWluZXIiLiBUaGVuLCB2YWxpZGF0ZQojIG90aGVyIGFubm90YXRpb25zIGJhc2VkIG9uIHRoZSBhY3R1YWwgInNhbmRib3giIG9yICJjb250YWluZXIiIHZhbHVlCiMgZnJvbSB0aGUgaW5wdXQgY29udGFpbmVyLgphbGxvd19ieV9jb250YWluZXJfdHlwZXMocF9vY2ksIGlfb2NpLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfYnlfY29udGFpbmVyX3R5cGVzOiBjaGVja2luZyBpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSIpCgogICAgY190eXBlIDo9ICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSIKICAgIAogICAgcF9jcmlfdHlwZSA6PSBwX29jaS5Bbm5vdGF0aW9uc1tjX3R5cGVdCiAgICBpX2NyaV90eXBlIDo9IGlfb2NpLkFubm90YXRpb25zW2NfdHlwZV0KICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZXM6IHBfY3JpX3R5cGUgPSIsIHBfY3JpX3R5cGUsICJpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgcF9jcmlfdHlwZSA9PSBpX2NyaV90eXBlCgogICAgYWxsb3dfYnlfY29udGFpbmVyX3R5cGUoaV9jcmlfdHlwZSwgcF9vY2ksIGlfb2NpLCBzX25hbWUsIHNfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZXM6IHRydWUiKQp9CgphbGxvd19ieV9jb250YWluZXJfdHlwZShpX2NyaV90eXBlLCBwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAxOiBpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgaV9jcmlfdHlwZSA9PSAic2FuZGJveCIKCiAgICBpX2thdGFfdHlwZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1siaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5jb250YWluZXJfdHlwZSJdCiAgICBwcmludCgiYWxsb3dfYnlfY29udGFpbmVyX3R5cGUgMTogaV9rYXRhX3R5cGUgPSIsIGlfa2F0YV90eXBlKQogICAgaV9rYXRhX3R5cGUgPT0gInBvZF9zYW5kYm94IgoKICAgIGFsbG93X3NhbmRib3hfY29udGFpbmVyX25hbWUocF9vY2ksIGlfb2NpKQogICAgYWxsb3dfc2FuZGJveF9uZXRfbmFtZXNwYWNlKHBfb2NpLCBpX29jaSkKICAgIGFsbG93X3NhbmRib3hfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpCgogICAgcHJpbnQoImFsbG93X2J5X2NvbnRhaW5lcl90eXBlIDE6IHRydWUiKQp9CgphbGxvd19ieV9jb250YWluZXJfdHlwZShpX2NyaV90eXBlLCBwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiBpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgaV9jcmlfdHlwZSA9PSAiY29udGFpbmVyIgoKICAgIGlfa2F0YV90eXBlIDo9IGlfb2NpLkFubm90YXRpb25zWyJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIl0KICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiBpX2thdGFfdHlwZSA9IiwgaV9rYXRhX3R5cGUpCiAgICBpX2thdGFfdHlwZSA9PSAicG9kX2NvbnRhaW5lciIKCiAgICBhbGxvd19jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpCiAgICBhbGxvd19uZXRfbmFtZXNwYWNlKHBfb2NpLCBpX29jaSkKICAgIGFsbG93X2xvZ19kaXJlY3RvcnkocF9vY2ksIGlfb2NpKQoKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiB0cnVlIikKfQoKIyAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLW5hbWUiIGFubm90YXRpb24KYWxsb3dfc2FuZGJveF9jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X2NvbnRhaW5lcl9uYW1lOiBzdGFydCIpCgogICAgY29udGFpbmVyX2Fubm90YXRpb25fbWlzc2luZyhwX29jaSwgaV9vY2ksICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItbmFtZSIpCgogICAgcHJpbnQoImFsbG93X3NhbmRib3hfY29udGFpbmVyX25hbWU6IHRydWUiKQp9CgphbGxvd19jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19jb250YWluZXJfbmFtZTogc3RhcnQiKQoKICAgIGFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uKHBfb2NpLCBpX29jaSwgImlvLmt1YmVybmV0ZXMuY3JpLmNvbnRhaW5lci1uYW1lIikKCiAgICBwcmludCgiYWxsb3dfY29udGFpbmVyX25hbWU6IHRydWUiKQp9Cgpjb250YWluZXJfYW5ub3RhdGlvbl9taXNzaW5nKHBfb2NpLCBpX29jaSwga2V5KSB7CiAgICBwcmludCgiY29udGFpbmVyX2Fubm90YXRpb25fbWlzc2luZzoiLCBrZXkpCgogICAgbm90IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIG5vdCBpX29jaS5Bbm5vdGF0aW9uc1trZXldCgogICAgcHJpbnQoImNvbnRhaW5lcl9hbm5vdGF0aW9uX21pc3Npbmc6IHRydWUiKQp9CgphbGxvd19jb250YWluZXJfYW5ub3RhdGlvbihwX29jaSwgaV9vY2ksIGtleSkgewogICAgcHJpbnQoImFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uOiBrZXkgPSIsIGtleSkKCiAgICBwX3ZhbHVlIDo9IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIGlfdmFsdWUgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgcHJpbnQoImFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uOiBwX3ZhbHVlID0iLCBwX3ZhbHVlLCAiaV92YWx1ZSA9IiwgaV92YWx1ZSkKCiAgICBwX3ZhbHVlID09IGlfdmFsdWUKCiAgICBwcmludCgiYWxsb3dfY29udGFpbmVyX2Fubm90YXRpb246IHRydWUiKQp9CgojICJuZXJkY3RsL25ldHdvcmstbmFtZXNwYWNlIiBhbm5vdGF0aW9uCmFsbG93X3NhbmRib3hfbmV0X25hbWVzcGFjZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X25ldF9uYW1lc3BhY2U6IHN0YXJ0IikKCiAgICBrZXkgOj0gIm5lcmRjdGwvbmV0d29yay1uYW1lc3BhY2UiCgogICAgcF9uYW1lc3BhY2UgOj0gcF9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgaV9uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgcHJpbnQoImFsbG93X3NhbmRib3hfbmV0X25hbWVzcGFjZTogcF9uYW1lc3BhY2UgPSIsIHBfbmFtZXNwYWNlLCAiaV9uYW1lc3BhY2UgPSIsIGlfbmFtZXNwYWNlKQoKICAgIHJlZ2V4Lm1hdGNoKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9uZXRfbmFtZXNwYWNlOiB0cnVlIikKfQoKYWxsb3dfbmV0X25hbWVzcGFjZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19uZXRfbmFtZXNwYWNlOiBzdGFydCIpCgogICAga2V5IDo9ICJuZXJkY3RsL25ldHdvcmstbmFtZXNwYWNlIgoKICAgIG5vdCBwX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICBub3QgaV9vY2kuQW5ub3RhdGlvbnNba2V5XQoKICAgIHByaW50KCJhbGxvd19uZXRfbmFtZXNwYWNlOiB0cnVlIikKfQoKIyAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1sb2ctZGlyZWN0b3J5IiBhbm5vdGF0aW9uCmFsbG93X3NhbmRib3hfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X2xvZ19kaXJlY3Rvcnk6IHN0YXJ0IikKCiAgICBrZXkgOj0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbG9nLWRpcmVjdG9yeSIKCiAgICBwX2RpciA6PSBwX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICByZWdleDEgOj0gcmVwbGFjZShwX2RpciwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHJlZ2V4MiA6PSByZXBsYWNlKHJlZ2V4MSwgIiQoc2FuZGJveC1uYW1lc3BhY2UpIiwgc19uYW1lc3BhY2UpCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiByZWdleDIgPSIsIHJlZ2V4MikKCiAgICBpX2RpciA6PSBpX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiBpX2RpciA9IiwgaV9kaXIpCgogICAgcmVnZXgubWF0Y2gocmVnZXgyLCBpX2RpcikKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiB0cnVlIikKfQoKYWxsb3dfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19sb2dfZGlyZWN0b3J5OiBzdGFydCIpCgogICAga2V5IDo9ICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWxvZy1kaXJlY3RvcnkiCgogICAgbm90IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIG5vdCBpX29jaS5Bbm5vdGF0aW9uc1trZXldCgogICAgcHJpbnQoImFsbG93X2xvZ19kaXJlY3Rvcnk6IHRydWUiKQp9CgphbGxvd19kZXZpY2VzKHBfZGV2aWNlcywgaV9kZXZpY2VzKSB7CiAgICBwcmludCgiYWxsb3dfZGV2aWNlczogc3RhcnQiKQogICAgZXZlcnkgaV9kZXZpY2UgaW4gaV9kZXZpY2VzIHsKICAgICAgICBwcmludCgiYWxsb3dfZGV2aWNlczogaV9kZXZpY2UgPSIsIGlfZGV2aWNlKQogICAgICAgIHNvbWUgcF9kZXZpY2UgaW4gcF9kZXZpY2VzCiAgICAgICAgcF9kZXZpY2UuY29udGFpbmVyX3BhdGggPT0gaV9kZXZpY2UuY29udGFpbmVyX3BhdGgKICAgIH0KICAgIHByaW50KCJhbGxvd19kZXZpY2VzOiB0cnVlIikKfQoKYWxsb3dfbGludXgoc3RhdGVfb3BzLCBwX29jaSwgaV9vY2kpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIHBfbmFtZXNwYWNlcyA6PSBwX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbGludXg6IHAgbmFtZXNwYWNlcyA9IiwgcF9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlcyA6PSBpX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbGludXg6IGkgbmFtZXNwYWNlcyA9IiwgaV9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlX3dpdGhvdXRfbmV0d29yayA6PSBbb2JqIHwgb2JqIDo9IGlfbmFtZXNwYWNlc1tfXTsgb2JqLlR5cGUgIT0gIm5ldHdvcmsiXQoKICAgIHByaW50KCJhbGxvd19saW51eDogaV9uYW1lc3BhY2Vfd2l0aG91dF9uZXR3b3JrID0iLCBpX25hbWVzcGFjZV93aXRob3V0X25ldHdvcmspCgogICAgcF9uYW1lc3BhY2VzID09IGlfbmFtZXNwYWNlX3dpdGhvdXRfbmV0d29yawoKICAgIGFsbG93X21hc2tlZF9wYXRocyhwX29jaSwgaV9vY2kpCiAgICBhbGxvd19yZWFkb25seV9wYXRocyhwX29jaSwgaV9vY2kpCiAgICBhbGxvd19saW51eF9kZXZpY2VzKHBfb2NpLkxpbnV4LkRldmljZXMsIGlfb2NpLkxpbnV4LkRldmljZXMpCiAgICBhbGxvd19saW51eF9zeXNjdGwocF9vY2kuTGludXgsIGlfb2NpLkxpbnV4KQogICAgcmV0IDo9IGFsbG93X25ldHdvcmtfbmFtZXNwYWNlX3N0YXJ0KHN0YXRlX29wcywgcF9vY2ksIGlfb2NpKQogICAgcmV0LmFsbG93ZWQKCiAgICBvcHMgOj0gcmV0Lm9wcwoKICAgIHByaW50KCJhbGxvd19saW51eDogdHJ1ZSIpCn0KCiMgUmV0cmlldmUgdGhlICJuZXR3b3JrIiBuYW1lc3BhY2UgZnJvbSB0aGUgaW5wdXQgZGF0YSBhbmQgcGFzcyBpdCBvbiBmb3IgdGhlCiMgbmV0d29yayBuYW1lc3BhY2UgcG9saWN5IGNoZWNrcy4KYWxsb3dfbmV0d29ya19uYW1lc3BhY2Vfc3RhcnQoc3RhdGVfb3BzLCBwX29jaSwgaV9vY2kpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIHByaW50KCJhbGxvd19uZXR3b3JrX25hbWVzcGFjZSBzdGFydDogc3RhcnQiKQoKICAgIHBfbmFtZXNwYWNlcyA6PSBwX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IHAgbmFtZXNwYWNlcyA9IiwgcF9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlcyA6PSBpX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IGkgbmFtZXNwYWNlcyA9IiwgaV9uYW1lc3BhY2VzKQoKICAgICMgUmV0dXJuIHBhdGggb2YgdGhlICJuZXR3b3JrIiBuYW1lc3BhY2UKICAgIG5ldHdvcmtfbnMgOj0gW29iaiB8IG9iaiA6PSBpX25hbWVzcGFjZXNbX107IG9iai5UeXBlID09ICJuZXR3b3JrIl0KCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IG5ldHdvcmtfbnMgPSIsIG5ldHdvcmtfbnMpCgogICAgcmV0IDo9IGFsbG93X25ldHdvcmtfbmFtZXNwYWNlKHN0YXRlX29wcywgbmV0d29ya19ucykKICAgIHJldC5hbGxvd2VkCgogICAgb3BzIDo9IHJldC5vcHMKfQoKIyBUaGlzIHJ1bGUgaXMgd2hlbiB0aGVyZSdzIG5vIG5ldHdvcmsgbmFtZXNwYWNlIGluIHRoZSBpbnB1dCBkYXRhLgphbGxvd19uZXR3b3JrX25hbWVzcGFjZShzdGF0ZV9vcHMsIG5ldHdvcmtfbnMpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIGNvdW50KG5ldHdvcmtfbnMpID09IDAKCiAgICBuZXR3b3JrX25zX3BhdGggPSAiIgoKICAgIGFkZF9uZXR3b3JrX25hbWVzcGFjZV90b19zdGF0ZSA6PSBzdGF0ZV9hbGxvd3MoIm5ldHdvcmtfbmFtZXNwYWNlIiwgbmV0d29ya19uc19wYXRoKQogICAgb3BzIDo9IGNvbmNhdF9vcF9pZl9ub3RfbnVsbChzdGF0ZV9vcHMsIGFkZF9uZXR3b3JrX25hbWVzcGFjZV90b19zdGF0ZSkKCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2UgMTogdHJ1ZSIpCn0KCiMgVGhpcyBydWxlIGlzIHdoZW4gdGhlcmUncyBleGFjdGx5IG9uZSBuZXR3b3JrIG5hbWVzcGFjZSBpbiB0aGUgaW5wdXQgZGF0YS4KYWxsb3dfbmV0d29ya19uYW1lc3BhY2Uoc3RhdGVfb3BzLCBuZXR3b3JrX25zKSA6PSB7Im9wcyI6IG9wcywgImFsbG93ZWQiOiB0cnVlfSB7CiAgICBjb3VudChuZXR3b3JrX25zKSA9PSAxCgogICAgYWRkX25ldHdvcmtfbmFtZXNwYWNlX3RvX3N0YXRlIDo9IHN0YXRlX2FsbG93cygibmV0d29ya19uYW1lc3BhY2UiLCBuZXR3b3JrX25zWzBdLlBhdGgpCiAgICBvcHMgOj0gY29uY2F0X29wX2lmX25vdF9udWxsKHN0YXRlX29wcywgYWRkX25ldHdvcmtfbmFtZXNwYWNlX3RvX3N0YXRlKQoKICAgIHByaW50KCJhbGxvd19uZXR3b3JrX25hbWVzcGFjZSAyOiB0cnVlIikKfQoKYWxsb3dfbWFza2VkX3BhdGhzKHBfb2NpLCBpX29jaSkgewogICAgcF9wYXRocyA6PSBwX29jaS5MaW51eC5NYXNrZWRQYXRocwogICAgcHJpbnQoImFsbG93X21hc2tlZF9wYXRocyAxOiBwX3BhdGhzID0iLCBwX3BhdGhzKQoKICAgIGlfcGF0aHMgOj0gaV9vY2kuTGludXguTWFza2VkUGF0aHMKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aHMgMTogaV9wYXRocyA9IiwgaV9wYXRocykKCiAgICBhbGxvd19tYXNrZWRfcGF0aHNfYXJyYXkocF9wYXRocywgaV9wYXRocykKCiAgICBwcmludCgiYWxsb3dfbWFza2VkX3BhdGhzIDE6IHRydWUiKQp9CmFsbG93X21hc2tlZF9wYXRocyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aHMgMjogc3RhcnQiKQoKICAgIG5vdCBwX29jaS5MaW51eC5NYXNrZWRQYXRocwogICAgbm90IGlfb2NpLkxpbnV4Lk1hc2tlZFBhdGhzCgogICAgcHJpbnQoImFsbG93X21hc2tlZF9wYXRocyAyOiB0cnVlIikKfQoKIyBBbGwgdGhlIHBvbGljeSBtYXNrZWQgcGF0aHMgbXVzdCBiZSBtYXNrZWQgaW4gdGhlIGlucHV0IGRhdGEgdG9vLgojIElucHV0IGlzIGFsbG93ZWQgdG8gaGF2ZSBtb3JlIG1hc2tlZCBwYXRocyB0aGFuIHRoZSBwb2xpY3kuCmFsbG93X21hc2tlZF9wYXRoc19hcnJheShwX2FycmF5LCBpX2FycmF5KSB7CiAgICBldmVyeSBwX2VsZW0gaW4gcF9hcnJheSB7CiAgICAgICAgYWxsb3dfbWFza2VkX3BhdGgocF9lbGVtLCBpX2FycmF5KQogICAgfQp9CgphbGxvd19tYXNrZWRfcGF0aChwX2VsZW0sIGlfYXJyYXkpIHsKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aDogcF9lbGVtID0iLCBwX2VsZW0pCgogICAgc29tZSBpX2VsZW0gaW4gaV9hcnJheQogICAgcF9lbGVtID09IGlfZWxlbQoKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aDogdHJ1ZSIpCn0KCmFsbG93X3JlYWRvbmx5X3BhdGhzKHBfb2NpLCBpX29jaSkgewogICAgcF9wYXRocyA6PSBwX29jaS5MaW51eC5SZWFkb25seVBhdGhzCiAgICBwcmludCgiYWxsb3dfcmVhZG9ubHlfcGF0aHMgMTogcF9wYXRocyA9IiwgcF9wYXRocykKCiAgICBpX3BhdGhzIDo9IGlfb2NpLkxpbnV4LlJlYWRvbmx5UGF0aHMKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAxOiBpX3BhdGhzID0iLCBpX3BhdGhzKQoKICAgIGFsbG93X3JlYWRvbmx5X3BhdGhzX2FycmF5KHBfcGF0aHMsIGlfcGF0aHMsIGlfb2NpLkxpbnV4Lk1hc2tlZFBhdGhzKQoKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAxOiB0cnVlIikKfQphbGxvd19yZWFkb25seV9wYXRocyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAyOiBzdGFydCIpCgogICAgbm90IHBfb2NpLkxpbnV4LlJlYWRvbmx5UGF0aHMKICAgIG5vdCBpX29jaS5MaW51eC5SZWFkb25seVBhdGhzCgogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGhzIDI6IHRydWUiKQp9CgojIEFsbCB0aGUgcG9saWN5IHJlYWRvbmx5IHBhdGhzIG11c3QgYmUgZWl0aGVyOgojIC0gUHJlc2VudCBpbiB0aGUgaW5wdXQgcmVhZG9ubHkgcGF0aHMsIG9yCiMgLSBQcmVzZW50IGluIHRoZSBpbnB1dCBtYXNrZWQgcGF0aHMuCiMgSW5wdXQgaXMgYWxsb3dlZCB0byBoYXZlIG1vcmUgcmVhZG9ubHkgcGF0aHMgdGhhbiB0aGUgcG9saWN5LgphbGxvd19yZWFkb25seV9wYXRoc19hcnJheShwX2FycmF5LCBpX2FycmF5LCBtYXNrZWRfcGF0aHMpIHsKICAgIGV2ZXJ5IHBfZWxlbSBpbiBwX2FycmF5IHsKICAgICAgICBhbGxvd19yZWFkb25seV9wYXRoKHBfZWxlbSwgaV9hcnJheSwgbWFza2VkX3BhdGhzKQogICAgfQp9CgphbGxvd19yZWFkb25seV9wYXRoKHBfZWxlbSwgaV9hcnJheSwgbWFza2VkX3BhdGhzKSB7CiAgICBwcmludCgiYWxsb3dfcmVhZG9ubHlfcGF0aCAxOiBwX2VsZW0gPSIsIHBfZWxlbSkKCiAgICBzb21lIGlfZWxlbSBpbiBpX2FycmF5CiAgICBwX2VsZW0gPT0gaV9lbGVtCgogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGggMTogdHJ1ZSIpCn0KYWxsb3dfcmVhZG9ubHlfcGF0aChwX2VsZW0sIGlfYXJyYXksIG1hc2tlZF9wYXRocykgewogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGggMjogcF9lbGVtID0iLCBwX2VsZW0pCgogICAgc29tZSBpX21hc2tlZCBpbiBtYXNrZWRfcGF0aHMKICAgIHBfZWxlbSA9PSBpX21hc2tlZAoKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRoIDI6IHRydWUiKQp9CgphbGxvd19saW51eF9kZXZpY2VzKHBfZGV2aWNlcywgaV9kZXZpY2VzKSB7CiAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogc3RhcnQiKQogICAgZXZlcnkgaV9kZXZpY2UgaW4gaV9kZXZpY2VzIHsKICAgICAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogaV9kZXZpY2UgPSIsIGlfZGV2aWNlKQogICAgICAgIHNvbWUgcF9kZXZpY2UgaW4gcF9kZXZpY2VzCiAgICAgICAgaV9kZXZpY2UuUGF0aCA9PSBwX2RldmljZS5QYXRoCiAgICB9CiAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogdHJ1ZSIpCn0KCmFsbG93X2xpbnV4X3N5c2N0bChwX2xpbnV4LCBpX2xpbnV4KSB7CiAgICBwcmludCgiYWxsb3dfbGludXhfc3lzY3RsIDE6IHN0YXJ0IikKICAgIG5vdCBpX2xpbnV4LlN5c2N0bAogICAgcHJpbnQoImFsbG93X2xpbnV4X3N5c2N0bCAxOiB0cnVlIikKfQoKYWxsb3dfbGludXhfc3lzY3RsKHBfbGludXgsIGlfbGludXgpIHsKICAgIHByaW50KCJhbGxvd19saW51eF9zeXNjdGwgMjogc3RhcnQiKQogICAgcF9zeXNjdGwgOj0gcF9saW51eC5TeXNjdGwKICAgIGlfc3lzY3RsIDo9IGlfbGludXguU3lzY3RsCiAgICBldmVyeSBpX25hbWUsIGlfdmFsIGluIGlfc3lzY3RsIHsKICAgICAgICBwcmludCgiYWxsb3dfbGludXhfc3lzY3RsIDI6IGlfbmFtZSA9IiwgaV9uYW1lLCAiaV92YWwgPSIsIGlfdmFsKQogICAgICAgIHBfc3lzY3RsW2lfbmFtZV0gPT0gaV92YWwKICAgIH0KICAgIHByaW50KCJhbGxvd19saW51eF9zeXNjdGwgMjogdHJ1ZSIpCn0KCiMgQ2hlY2sgdGhlIGNvbnNpc3RlbmN5IG9mIHRoZSBpbnB1dCAiaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5idW5kbGVfcGF0aCIKIyBhbmQgaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCIgdmFsdWVzIHdpdGggb3RoZXIgZmllbGRzLgphbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZChwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpIHsKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogc3RhcnQiKQoKICAgIGJ1bmRsZV9wYXRoIDo9IGlfb2NpLkFubm90YXRpb25zWyJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmJ1bmRsZV9wYXRoIl0KICAgIGJ1bmRsZV9pZCA6PSByZXBsYWNlKGJ1bmRsZV9wYXRoLCAiL3J1bi9jb250YWluZXJkL2lvLmNvbnRhaW5lcmQucnVudGltZS52Mi50YXNrL2s4cy5pby8iLCAiIikKCiAgICBidW5kbGVfaWRfZm9ybWF0IDo9IGNvbmNhdCgiIiwgWyJeIiwgQlVORExFX0lELCAiJCJdKQogICAgcmVnZXgubWF0Y2goYnVuZGxlX2lkX2Zvcm1hdCwgYnVuZGxlX2lkKQoKICAgIGtleSA6PSAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCIKCiAgICBwX3JlZ2V4IDo9IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIHNhbmRib3hfaWQgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQoKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogc2FuZGJveF9pZCA9Iiwgc2FuZGJveF9pZCwgInJlZ2V4ID0iLCBwX3JlZ2V4KQogICAgcmVnZXgubWF0Y2gocF9yZWdleCwgc2FuZGJveF9pZCkKCiAgICBhbGxvd19yb290X3BhdGgocF9vY2ksIGlfb2NpLCBidW5kbGVfaWQpCgogICAgZXZlcnkgaV9tb3VudCBpbiBpX29jaS5Nb3VudHMgewogICAgICAgIGFsbG93X21vdW50KHBfb2NpLCBpX21vdW50LCBpX3N0b3JhZ2VzLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpCiAgICB9CgogICAgYWxsb3dfc3RvcmFnZXMocF9zdG9yYWdlcywgaV9zdG9yYWdlcywgYnVuZGxlX2lkLCBzYW5kYm94X2lkKQoKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogdHJ1ZSIpCn0KCmFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHBfcHJvY2VzcyA9IiwgcF9wcm9jZXNzKQogICAgcHJpbnQoImFsbG93X3Byb2Nlc3NfY29tbW9uOiBpX3Byb2Nlc3MgPSAiLCBpX3Byb2Nlc3MpCiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHNfbmFtZSA9Iiwgc19uYW1lKQoKICAgIHBfcHJvY2Vzcy5Dd2QgPT0gaV9wcm9jZXNzLkN3ZAogICAgcF9wcm9jZXNzLk5vTmV3UHJpdmlsZWdlcyA9PSBpX3Byb2Nlc3MuTm9OZXdQcml2aWxlZ2VzCgogICAgYWxsb3dfdXNlcihwX3Byb2Nlc3MsIGlfcHJvY2VzcykKICAgIGFsbG93X2VudihwX3Byb2Nlc3MsIGlfcHJvY2Vzcywgc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHRydWUiKQp9CgojIENvbXBhcmUgdGhlIE9DSSBQcm9jZXNzIGZpZWxkIG9mIGEgcG9saWN5IGNvbnRhaW5lciB3aXRoIHRoZSBpbnB1dCBPQ0kgUHJvY2VzcyBmcm9tIGEgQ3JlYXRlQ29udGFpbmVyUmVxdWVzdAphbGxvd19wcm9jZXNzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfcHJvY2Vzczogc3RhcnQiKQoKICAgIGFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgYWxsb3dfY2FwcyhwX3Byb2Nlc3MuQ2FwYWJpbGl0aWVzLCBpX3Byb2Nlc3MuQ2FwYWJpbGl0aWVzKQogICAgcF9wcm9jZXNzLlRlcm1pbmFsID09IGlfcHJvY2Vzcy5UZXJtaW5hbAoKICAgIHByaW50KCJhbGxvd19wcm9jZXNzOiB0cnVlIikKfQoKIyBDb21wYXJlIHRoZSBPQ0kgUHJvY2VzcyBmaWVsZCBvZiBhIHBvbGljeSBjb250YWluZXIgd2l0aCB0aGUgaW5wdXQgcHJvY2VzcyBmaWVsZCBmcm9tIEV4ZWNQcm9jZXNzUmVxdWVzdAphbGxvd19pbnRlcmFjdGl2ZV9wcm9jZXNzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfaW50ZXJhY3RpdmVfcHJvY2Vzczogc3RhcnQiKQoKICAgIGFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgYWxsb3dfZXhlY19jYXBzKGlfcHJvY2Vzcy5DYXBhYmlsaXRpZXMpCgogICAgIyBUaGVzZSBhcmUgY29tbWFuZHMgZW5hYmxlZCB1c2luZyBFeGVjUHJvY2Vzc1JlcXVlc3QgY29tbWFuZHMgYW5kL29yIHJlZ2V4IGZyb20gdGhlIHNldHRpbmdzIGZpbGUuCiAgICAjIFRoZXkgY2FuIGJlIGV4ZWN1dGVkIGludGVyYWN0aXZlbHkgc28gYWxsb3cgdGhlbSB0byB1c2UgYW55IHZhbHVlIGZvciBpX3Byb2Nlc3MuVGVybWluYWwuCgogICAgcHJpbnQoImFsbG93X2ludGVyYWN0aXZlX3Byb2Nlc3M6IHRydWUiKQp9CgojIENvbXBhcmUgdGhlIE9DSSBQcm9jZXNzIGZpZWxkIG9mIGEgcG9saWN5IGNvbnRhaW5lciB3aXRoIHRoZSBpbnB1dCBwcm9jZXNzIGZpZWxkIGZyb20gRXhlY1Byb2Nlc3NSZXF1ZXN0CmFsbG93X3Byb2JlX3Byb2Nlc3MocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19wcm9iZV9wcm9jZXNzOiBzdGFydCIpCgogICAgYWxsb3dfcHJvY2Vzc19jb21tb24ocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpCiAgICBhbGxvd19leGVjX2NhcHMoaV9wcm9jZXNzLkNhcGFiaWxpdGllcykKICAgIHBfcHJvY2Vzcy5UZXJtaW5hbCA9PSBpX3Byb2Nlc3MuVGVybWluYWwKCiAgICBwcmludCgiYWxsb3dfcHJvYmVfcHJvY2VzczogdHJ1ZSIpCn0KCmFsbG93X3VzZXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MpIHsKICAgIHBfdXNlciA6PSBwX3Byb2Nlc3MuVXNlcgogICAgaV91c2VyIDo9IGlfcHJvY2Vzcy5Vc2VyCgogICAgcHJpbnQoImFsbG93X3VzZXI6IGlucHV0IHVpZCA9IiwgaV91c2VyLlVJRCwgInBvbGljeSB1aWQgPSIsIHBfdXNlci5VSUQpCiAgICBwX3VzZXIuVUlEID09IGlfdXNlci5VSUQKCiAgICAjIFRPRE86IHRyYWNrIGRvd24gdGhlIHJlYXNvbiBmb3IgcmVnaXN0cnkuazhzLmlvL3BhdXNlOjMuOSBiZWluZwogICAgIyAgICAgICBleGVjdXRlZCB3aXRoIGdpZCA9IDAgZGVzcGl0ZSBoYXZpbmcgIjY1NTM1OjY1NTM1IiBpbiBpdHMgY29udGFpbmVyIGltYWdlCiAgICAjICAgICAgIGNvbmZpZy4KICAgICNwcmludCgiYWxsb3dfdXNlcjogaW5wdXQgZ2lkID0iLCBpX3VzZXIuR0lELCAicG9saWN5IGdpZCA9IiwgcF91c2VyLkdJRCkKICAgICNwX3VzZXIuR0lEID09IGlfdXNlci5HSUQKCiAgICAjIFRPRE86IGNvbXBhcmUgdGhlIGFkZGl0aW9uYWxHaWRzIGZpZWxkIHRvbyBhZnRlciBjb21wdXRpbmcgaXRzIHZhbHVlCiAgICAjIGJhc2VkIG9uIC9ldGMvcGFzc3dkIGFuZCAvZXRjL2dyb3VwIGZyb20gdGhlIGNvbnRhaW5lciBpbWFnZS4KfQoKYWxsb3dfZGVwcmVjYXRlZF9hcmdzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZ3MgMTogbm8gYXJncyIpCgogICAgbm90IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJncwogICAgbm90IGlfcHJvY2Vzcy5BcmdzCgogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAxOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZ3MocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSkgewogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiBwb2xpY3kgYXJncyA9IiwgcF9wcm9jZXNzLkRlcHJlY2F0ZWRBcmdzKQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiBpbnB1dCBhcmdzID0iLCBpX3Byb2Nlc3MuQXJncykKCiAgICBjb3VudChwX3Byb2Nlc3MuRGVwcmVjYXRlZEFyZ3MpID09IGNvdW50KGlfcHJvY2Vzcy5BcmdzKQoKICAgIGV2ZXJ5IGksIGlfYXJnIGluIGlfcHJvY2Vzcy5BcmdzIHsKICAgICAgICBhbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpCiAgICB9CgogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDE6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgcF9hcmcyIDo9IHJlcGxhY2UocF9hcmcsICIkJCIsICIkIikKICAgIHBfYXJnMiA9PSBpX2FyZwoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAxOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDI6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgIyBUT0RPOiBjYW4gJChub2RlLW5hbWUpIGJlIGhhbmRsZWQgYmV0dGVyPwogICAgY29udGFpbnMocF9hcmcsICIkKG5vZGUtbmFtZSkiKQoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAyOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDM6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgcF9hcmcyIDo9IHJlcGxhY2UocF9hcmcsICIkJCIsICIkIikKICAgIHBfYXJnMyA6PSByZXBsYWNlKHBfYXJnMiwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAzOiBwX2FyZzMgPSIsIHBfYXJnMykKICAgIHBfYXJnMyA9PSBpX2FyZwoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAzOiB0cnVlIikKfQoKIyBPQ0kgcHJvY2Vzcy5FbnYgZmllbGQKYWxsb3dfZW52KHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfZW52OiBwIGVudiA9IiwgcF9wcm9jZXNzLkVudikKICAgIHByaW50KCJhbGxvd19lbnY6IGkgZW52ID0iLCBpX3Byb2Nlc3MuRW52KQoKICAgIGV2ZXJ5IGlfdmFyIGluIGlfcHJvY2Vzcy5FbnYgewogICAgICAgIHByaW50KCJhbGxvd19lbnY6IGlfdmFyID0iLCBpX3ZhcikKICAgICAgICBhbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgfQoKICAgIHByaW50KCJhbGxvd19lbnY6IHRydWUiKQp9CgojIEFsbG93IGlucHV0IGVudiB2YXJpYWJsZXMgdGhhdCBhcmUgcHJlc2VudCBpbiB0aGUgcG9saWN5IGRhdGEgdG9vLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHBfdmFyID09IGlfdmFyCiAgICBwcmludCgiYWxsb3dfdmFyIDE6IHRydWUiKQp9CgojIE1hdGNoIGlucHV0IHdpdGggb25lIG9mIHRoZSBwb2xpY3kgdmFyaWFibGVzLCBhZnRlciBzdWJzdGl0dXRpbmcgJChzYW5kYm94LW5hbWUpLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHByaW50KCJhbGxvd192YXIgMjogcF92YXIgPSIsIHBfdmFyKQoKICAgIHBfdmFyX3NwbGl0IDo9IHNwbGl0KHBfdmFyLCAiPSIpCiAgICBjb3VudChwX3Zhcl9zcGxpdCkgPT0gMgoKICAgIHBfdmFyX3NwbGl0WzFdID09ICIkKHNhbmRib3gtbmFtZSkiCgogICAgaV92YXJfc3BsaXQgOj0gc3BsaXQoaV92YXIsICI9IikKICAgIGNvdW50KGlfdmFyX3NwbGl0KSA9PSAyCgogICAgaV92YXJfc3BsaXRbMF0gPT0gcF92YXJfc3BsaXRbMF0KICAgIHJlZ2V4Lm1hdGNoKHNfbmFtZSwgaV92YXJfc3BsaXRbMV0pCgogICAgcHJpbnQoImFsbG93X3ZhciAyOiB0cnVlIikKfQoKIyBBbGxvdyBpbnB1dCBlbnYgdmFyaWFibGVzIHRoYXQgbWF0Y2ggd2l0aCBhIHJlcXVlc3RfZGVmYXVsdHMgcmVnZXguCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHNvbWUgcF9yZWdleDEgaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5DcmVhdGVDb250YWluZXJSZXF1ZXN0LmFsbG93X2Vudl9yZWdleAogICAgcF9yZWdleDIgOj0gcmVwbGFjZShwX3JlZ2V4MSwgIiQoaXB2NF9hKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcHY0X2EpCiAgICBwX3JlZ2V4MyA6PSByZXBsYWNlKHBfcmVnZXgyLCAiJChpcF9wKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcF9wKQogICAgcF9yZWdleDQgOj0gcmVwbGFjZShwX3JlZ2V4MywgIiQoc3ZjX25hbWUpIiwgcG9saWN5X2RhdGEuY29tbW9uLnN2Y19uYW1lKQogICAgcF9yZWdleDUgOj0gcmVwbGFjZShwX3JlZ2V4NCwgIiQoZG5zX2xhYmVsKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5kbnNfbGFiZWwpCgogICAgcHJpbnQoImFsbG93X3ZhciAzOiBwX3JlZ2V4NSA9IiwgcF9yZWdleDUpCiAgICByZWdleC5tYXRjaChwX3JlZ2V4NSwgaV92YXIpCgogICAgcHJpbnQoImFsbG93X3ZhciAzOiB0cnVlIikKfQoKIyBBbGxvdyBmaWVsZFJlZiAiZmllbGRQYXRoOiBzdGF0dXMucG9kSVAiIHZhbHVlcy4KYWxsb3dfdmFyKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBpX3Zhciwgc19uYW1lLCBzX25hbWVzcGFjZSkgewogICAgbmFtZV92YWx1ZSA6PSBzcGxpdChpX3ZhciwgIj0iKQogICAgY291bnQobmFtZV92YWx1ZSkgPT0gMgogICAgaXNfaXAobmFtZV92YWx1ZVsxXSkKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIGFsbG93X3BvZF9pcF92YXIobmFtZV92YWx1ZVswXSwgcF92YXIpCgogICAgcHJpbnQoImFsbG93X3ZhciA0OiB0cnVlIikKfQoKIyBBbGxvdyBjb21tb24gZmllbGRSZWYgdmFyaWFibGVzLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBuYW1lX3ZhbHVlIDo9IHNwbGl0KGlfdmFyLCAiPSIpCiAgICBjb3VudChuYW1lX3ZhbHVlKSA9PSAyCgogICAgc29tZSBwX3ZhciBpbiBwX3Byb2Nlc3MuRW52CiAgICBwX25hbWVfdmFsdWUgOj0gc3BsaXQocF92YXIsICI9IikKICAgIGNvdW50KHBfbmFtZV92YWx1ZSkgPT0gMgoKICAgIHBfbmFtZV92YWx1ZVswXSA9PSBuYW1lX3ZhbHVlWzBdCgogICAgIyBUT0RPOiBzaG91bGQgdGhlc2UgYmUgaGFuZGxlZCBpbiBhIGRpZmZlcmVudCB3YXk/CiAgICBhbHdheXNfYWxsb3dlZCA6PSBbIiQoaG9zdC1uYW1lKSIsICIkKG5vZGUtbmFtZSkiLCAiJChwb2QtdWlkKSJdCiAgICBzb21lIGFsbG93ZWQgaW4gYWx3YXlzX2FsbG93ZWQKICAgIGNvbnRhaW5zKHBfbmFtZV92YWx1ZVsxXSwgYWxsb3dlZCkKCiAgICBwcmludCgiYWxsb3dfdmFyIDU6IHRydWUiKQp9CgojIEFsbG93IGZpZWxkUmVmICJmaWVsZFBhdGg6IHN0YXR1cy5ob3N0SVAiIHZhbHVlcy4KYWxsb3dfdmFyKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBpX3Zhciwgc19uYW1lLCBzX25hbWVzcGFjZSkgewogICAgbmFtZV92YWx1ZSA6PSBzcGxpdChpX3ZhciwgIj0iKQogICAgY291bnQobmFtZV92YWx1ZSkgPT0gMgogICAgaXNfaXAobmFtZV92YWx1ZVsxXSkKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIGFsbG93X2hvc3RfaXBfdmFyKG5hbWVfdmFsdWVbMF0sIHBfdmFyKQoKICAgIHByaW50KCJhbGxvd192YXIgNjogdHJ1ZSIpCn0KCiMgQWxsb3cgcmVzb3VyY2VGaWVsZFJlZiB2YWx1ZXMgKGUuZy4sICJsaW1pdHMuY3B1IikuCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIG5hbWVfdmFsdWUgOj0gc3BsaXQoaV92YXIsICI9IikKICAgIGNvdW50KG5hbWVfdmFsdWUpID09IDIKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHBfbmFtZV92YWx1ZSA6PSBzcGxpdChwX3ZhciwgIj0iKQogICAgY291bnQocF9uYW1lX3ZhbHVlKSA9PSAyCgogICAgcF9uYW1lX3ZhbHVlWzBdID09IG5hbWVfdmFsdWVbMF0KCiAgICAjIGEgdmFyaWFibGUgd2Ugc2hvdWxkIGJlIHZhbGlkYXRpbmcgdXNpbmcgYSByZWdleCBmcm9tIHNldHRpbmdzCiAgICBwX25hbWVfdmFsdWVbMV0gPT0gIiQodmFsaWRhdGUtZnJvbS1zZXR0aW5ncykiCgogICAgcmVnZXhfdmFsIDo9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuQ3JlYXRlQ29udGFpbmVyUmVxdWVzdC5hbGxvd19lbnZfcmVnZXhfbWFwW25hbWVfdmFsdWVbMF1dCgogICAgcHJpbnQoImFsbG93X3ZhciA3OiB2YWwgPSIsIG5hbWVfdmFsdWVbMV0pCiAgICBwcmludCgiYWxsb3dfdmFyIDc6IHJlZ2V4X3ZhbCA9IiwgcmVnZXhfdmFsKQoKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4X3ZhbCwgbmFtZV92YWx1ZVsxXSkKCiAgICBwcmludCgiYWxsb3dfdmFyIDc6IHRydWUiKQp9CgojIE1hdGNoIGlucHV0IHdpdGggb25lIG9mIHRoZSBwb2xpY3kgdmFyaWFibGVzLCBhZnRlciBzdWJzdGl0dXRpbmcgJChzYW5kYm94LW5hbWVzcGFjZSkuCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHNvbWUgcF92YXIgaW4gcF9wcm9jZXNzLkVudgogICAgcF92YXIyIDo9IHJlcGxhY2UocF92YXIsICIkKHNhbmRib3gtbmFtZXNwYWNlKSIsIHNfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd192YXIgODogcF92YXIyID0iLCBwX3ZhcjIpCiAgICBwX3ZhcjIgPT0gaV92YXIKCiAgICBwcmludCgiYWxsb3dfdmFyIDg6IHRydWUiKQp9CgphbGxvd19wb2RfaXBfdmFyKHZhcl9uYW1lLCBwX3ZhcikgewogICAgcHJpbnQoImFsbG93X3BvZF9pcF92YXI6IHZhcl9uYW1lID0iLCB2YXJfbmFtZSwgInBfdmFyID0iLCBwX3ZhcikKCiAgICBwX25hbWVfdmFsdWUgOj0gc3BsaXQocF92YXIsICI9IikKICAgIGNvdW50KHBfbmFtZV92YWx1ZSkgPT0gMgoKICAgIHBfbmFtZV92YWx1ZVswXSA9PSB2YXJfbmFtZQogICAgcF9uYW1lX3ZhbHVlWzFdID09ICIkKHBvZC1pcCkiCgogICAgcHJpbnQoImFsbG93X3BvZF9pcF92YXI6IHRydWUiKQp9CgphbGxvd19ob3N0X2lwX3Zhcih2YXJfbmFtZSwgcF92YXIpIHsKICAgIHByaW50KCJhbGxvd19ob3N0X2lwX3ZhcjogdmFyX25hbWUgPSIsIHZhcl9uYW1lLCAicF92YXIgPSIsIHBfdmFyKQoKICAgIHBfbmFtZV92YWx1ZSA6PSBzcGxpdChwX3ZhciwgIj0iKQogICAgY291bnQocF9uYW1lX3ZhbHVlKSA9PSAyCgogICAgcF9uYW1lX3ZhbHVlWzBdID09IHZhcl9uYW1lCiAgICBwX25hbWVfdmFsdWVbMV0gPT0gIiQoaG9zdC1pcCkiCgogICAgcHJpbnQoImFsbG93X2hvc3RfaXBfdmFyOiB0cnVlIikKfQoKaXNfaXAodmFsdWUpIHsKICAgIGJ5dGVzID0gc3BsaXQodmFsdWUsICIuIikKICAgIGNvdW50KGJ5dGVzKSA9PSA0CgogICAgaXNfaXBfZmlyc3RfYnl0ZShieXRlc1swXSkKICAgIGlzX2lwX290aGVyX2J5dGUoYnl0ZXNbMV0pCiAgICBpc19pcF9vdGhlcl9ieXRlKGJ5dGVzWzJdKQogICAgaXNfaXBfb3RoZXJfYnl0ZShieXRlc1szXSkKfQppc19pcF9maXJzdF9ieXRlKGNvbXBvbmVudCkgewogICAgbnVtYmVyID0gdG9fbnVtYmVyKGNvbXBvbmVudCkKICAgIG51bWJlciA+PSAxCiAgICBudW1iZXIgPD0gMjU1Cn0KaXNfaXBfb3RoZXJfYnl0ZShjb21wb25lbnQpIHsKICAgIG51bWJlciA9IHRvX251bWJlcihjb21wb25lbnQpCiAgICBudW1iZXIgPj0gMAogICAgbnVtYmVyIDw9IDI1NQp9CgojIE9DSSByb290LlBhdGgKYWxsb3dfcm9vdF9wYXRoKHBfb2NpLCBpX29jaSwgYnVuZGxlX2lkKSB7CiAgICBpX3BhdGggOj0gaV9vY2kuUm9vdC5QYXRoCiAgICBwX3BhdGgxIDo9IHBfb2NpLlJvb3QuUGF0aAogICAgcHJpbnQoImFsbG93X3Jvb3RfcGF0aDogaV9wYXRoID0iLCBpX3BhdGgsICJwX3BhdGgxID0iLCBwX3BhdGgxKQoKICAgIHBfcGF0aDIgOj0gcmVwbGFjZShwX3BhdGgxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfcm9vdF9wYXRoOiBwX3BhdGgyID0iLCBwX3BhdGgyKQoKICAgIHBfcGF0aDMgOj0gcmVwbGFjZShwX3BhdGgyLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X3Jvb3RfcGF0aDogcF9wYXRoMyA9IiwgcF9wYXRoMykKCiAgICBwX3BhdGgzID09IGlfcGF0aAoKICAgIHByaW50KCJhbGxvd19yb290X3BhdGg6IHRydWUiKQp9CgojIGRldmljZSBtb3VudHMKYWxsb3dfbW91bnQocF9vY2ksIGlfbW91bnQsIGlfc3RvcmFnZXMsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcHJpbnQoImFsbG93X21vdW50OiBpX21vdW50ID0iLCBpX21vdW50KQoKICAgIHNvbWUgcF9tb3VudCBpbiBwX29jaS5Nb3VudHMKICAgIHNvbWUgaV9zdG9yYWdlIGluIGlfc3RvcmFnZXMKCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IHBfbW91bnQgPSIsIHBfbW91bnQpCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IGlfc3RvcmFnZSA9IiwgaV9zdG9yYWdlKQoKICAgIGNoZWNrX21vdW50KHBfbW91bnQsIGlfbW91bnQsIGlfc3RvcmFnZSwgYnVuZGxlX2lkLCBzYW5kYm94X2lkKQoKICAgICMgVE9ETzogYXJlIHRoZXJlIGFueSBvdGhlciByZXF1aXJlZCBwb2xpY3kgY2hlY2tzIGZvciBtb3VudHMgLSBlLmcuLAogICAgIyAgICAgICBtdWx0aXBsZSBtb3VudHMgd2l0aCBzYW1lIHNvdXJjZSBvciBkZXN0aW5hdGlvbj8KCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IHRydWUiKQp9CgpjaGVja19tb3VudChwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcF9tb3VudCA9PSBpX21vdW50CiAgICBwcmludCgiY2hlY2tfbW91bnQgMTogdHJ1ZSIpCn0KY2hlY2tfbW91bnQocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHBfbW91bnQuZGVzdGluYXRpb24gPT0gaV9tb3VudC5kZXN0aW5hdGlvbgogICAgcF9tb3VudC50eXBlXyA9PSBpX21vdW50LnR5cGVfCiAgICBwX21vdW50Lm9wdGlvbnMgPT0gaV9tb3VudC5vcHRpb25zCgogICAgbW91bnRfc291cmNlX2FsbG93cyhwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkKCiAgICBwcmludCgiY2hlY2tfbW91bnQgMjogdHJ1ZSIpCn0KCm1vdW50X3NvdXJjZV9hbGxvd3MocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHJlZ2V4MSA6PSBwX21vdW50LnNvdXJjZQogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5tb3VudF9zb3VyY2VfY3BhdGgpCiAgICByZWdleDQgOj0gcmVwbGFjZShyZWdleDMsICIkKGJ1bmRsZS1pZCkiLCBidW5kbGVfaWQpCgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMTogcmVnZXg0ID0iLCByZWdleDQpCiAgICByZWdleC5tYXRjaChyZWdleDQsIGlfbW91bnQuc291cmNlKQoKICAgIHByaW50KCJtb3VudF9zb3VyY2VfYWxsb3dzIDE6IHRydWUiKQp9Cm1vdW50X3NvdXJjZV9hbGxvd3MocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHJlZ2V4MSA6PSBwX21vdW50LnNvdXJjZQogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5tb3VudF9zb3VyY2VfY3BhdGgpCiAgICByZWdleDQgOj0gcmVwbGFjZShyZWdleDMsICIkKHNhbmRib3gtaWQpIiwgc2FuZGJveF9pZCkKCiAgICBwcmludCgibW91bnRfc291cmNlX2FsbG93cyAyOiByZWdleDQgPSIsIHJlZ2V4NCkKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4NCwgaV9tb3VudC5zb3VyY2UpCgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMjogdHJ1ZSIpCn0KbW91bnRfc291cmNlX2FsbG93cyhwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogaV9tb3VudC5zb3VyY2UgPSIsIGlfbW91bnQuc291cmNlKQogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogaV9zdG9yYWdlLm1vdW50X3BvaW50ID0iLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCgogICAgaV9tb3VudC5zb3VyY2UgPT0gaV9zdG9yYWdlLm1vdW50X3BvaW50CgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogdHJ1ZSIpCn0KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBDcmVhdGUgY29udGFpbmVyIFN0b3JhZ2VzCgphbGxvd19zdG9yYWdlcyhwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHBfY291bnQgOj0gY291bnQocF9zdG9yYWdlcykKICAgIGlfY291bnQgOj0gY291bnQoaV9zdG9yYWdlcykKICAgIHByaW50KCJhbGxvd19zdG9yYWdlczogcF9jb3VudCA9IiwgcF9jb3VudCwgImlfY291bnQgPSIsIGlfY291bnQpCgogICAgcF9jb3VudCA9PSBpX2NvdW50CgogICAgIyBHZXQgdGhlIGNvbnRhaW5lciBpbWFnZSBsYXllciBJRHMgYW5kIHZlcml0eSByb290IGhhc2hlcywgZnJvbSB0aGUgIm92ZXJsYXlmcyIgc3RvcmFnZS4KICAgIHNvbWUgb3ZlcmxheV9zdG9yYWdlIGluIHBfc3RvcmFnZXMKICAgIG92ZXJsYXlfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIHByaW50KCJhbGxvd19zdG9yYWdlczogb3ZlcmxheV9zdG9yYWdlID0iLCBvdmVybGF5X3N0b3JhZ2UpCiAgICBjb3VudChvdmVybGF5X3N0b3JhZ2Uub3B0aW9ucykgPT0gMgoKICAgIGxheWVyX2lkcyA6PSBzcGxpdChvdmVybGF5X3N0b3JhZ2Uub3B0aW9uc1swXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiBsYXllcl9pZHMgPSIsIGxheWVyX2lkcykKCiAgICByb290X2hhc2hlcyA6PSBzcGxpdChvdmVybGF5X3N0b3JhZ2Uub3B0aW9uc1sxXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiByb290X2hhc2hlcyA9Iiwgcm9vdF9oYXNoZXMpCgogICAgZXZlcnkgaV9zdG9yYWdlIGluIGlfc3RvcmFnZXMgewogICAgICAgIGFsbG93X3N0b3JhZ2UocF9zdG9yYWdlcywgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpCiAgICB9CgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiB0cnVlIikKfQoKYWxsb3dfc3RvcmFnZShwX3N0b3JhZ2VzLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgc29tZSBwX3N0b3JhZ2UgaW4gcF9zdG9yYWdlcwoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiBwX3N0b3JhZ2UgPSIsIHBfc3RvcmFnZSkKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiBpX3N0b3JhZ2UgPSIsIGlfc3RvcmFnZSkKCiAgICBwX3N0b3JhZ2UuZHJpdmVyICAgICAgICAgICA9PSBpX3N0b3JhZ2UuZHJpdmVyCiAgICBwX3N0b3JhZ2UuZHJpdmVyX29wdGlvbnMgICA9PSBpX3N0b3JhZ2UuZHJpdmVyX29wdGlvbnMKICAgIHBfc3RvcmFnZS5mc19ncm91cCAgICAgICAgID09IGlfc3RvcmFnZS5mc19ncm91cAogICAgcF9zdG9yYWdlLmZzdHlwZSAgICAgICAgICAgPT0gaV9zdG9yYWdlLmZzdHlwZQoKICAgIGFsbG93X3N0b3JhZ2Vfc291cmNlKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKQogICAgYWxsb3dfc3RvcmFnZV9vcHRpb25zKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKQogICAgYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKQoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiB0cnVlIikKfQoKYWxsb3dfc3RvcmFnZV9zb3VyY2UocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX3NvdXJjZSAxOiBzdGFydCIpCgogICAgcF9zdG9yYWdlLnNvdXJjZSA9PSBpX3N0b3JhZ2Uuc291cmNlCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDE6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX3NvdXJjZShwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDI6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCgogICAgIyBEREREOkJCOkRELkY6IERvbWFpbjpCdXM6RGV2aWNlLkZ1bmN0aW9uCiAgICAjIGh0dHBzOi8vd3d3Lmtlcm5lbC5vcmcvZG9jL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtYnVzLXBjaQogICAgcmVnZXgubWF0Y2goYF5bYS1mMC05XXs0fTpbYS1mMC05XXsyfTpbYS1mMC05XXsyfVwuW2EtZjAtOV0kYCwgaV9zdG9yYWdlLnNvdXJjZSkKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9zb3VyY2UgMjogdHJ1ZSIpCn0KCmFsbG93X3N0b3JhZ2Vfc291cmNlKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKSB7CiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9zb3VyY2UgMzogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIGlfc3RvcmFnZS5zb3VyY2UgPT0gIm5vbmUiCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDM6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX3NvdXJjZShwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDQ6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJzbWIiCgogICAgIyBQYXR0ZXJuOiAvLzxzdG9yYWdlLWFjY291bnQtbmFtZT4uZmlsZS5jb3JlLndpbmRvd3MubmV0LzxrOHMtUFZDLW5hbWU+CiAgICAjIFN0b3JhZ2UgYWNjb3VudCBuYW1lOiBodHRwczovL2xlYXJuLm1pY3Jvc29mdC5jb20vZW4tdXMvYXp1cmUvc3RvcmFnZS9jb21tb24vc3RvcmFnZS1hY2NvdW50LW92ZXJ2aWV3I3N0b3JhZ2UtYWNjb3VudC1uYW1lCiAgICAjIEs4cyBQVkMgbmFtZTogaHR0cHM6Ly9rdWJlcm5ldGVzLmlvL2RvY3MvY29uY2VwdHMvb3ZlcnZpZXcvd29ya2luZy13aXRoLW9iamVjdHMvbmFtZXMvI2Rucy1zdWJkb21haW4tbmFtZXMKICAgIHJlZ2V4Lm1hdGNoKGBeXC9cLyhbYS16MC05XXszLDI0fSlcLmZpbGVcLmNvcmVcLndpbmRvd3NcLm5ldFwvW2EtejAtOV0oW2EtejAtOS4tXXswLDI1MX1bYS16MC05XSk/JGAsIGlfc3RvcmFnZS5zb3VyY2UpCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDQ6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMTogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgIT0gIm92ZXJsYXlmcyIKICAgIHBfc3RvcmFnZS5vcHRpb25zID09IGlfc3RvcmFnZS5vcHRpb25zCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAxOiB0cnVlIikKfQphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIGNvdW50KHBfc3RvcmFnZS5vcHRpb25zKSA9PSAyCgogICAgcG9saWN5X2lkcyA6PSBzcGxpdChwX3N0b3JhZ2Uub3B0aW9uc1swXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBwb2xpY3lfaWRzID0iLCBwb2xpY3lfaWRzKQogICAgcG9saWN5X2lkcyA9PSBsYXllcl9pZHMKCiAgICBwb2xpY3lfaGFzaGVzIDo9IHNwbGl0KHBfc3RvcmFnZS5vcHRpb25zWzFdLCAiOiIpCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IHBvbGljeV9oYXNoZXMgPSIsIHBvbGljeV9oYXNoZXMpCgogICAgcF9jb3VudCA6PSBjb3VudChwb2xpY3lfaWRzKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBwX2NvdW50ID0iLCBwX2NvdW50KQogICAgcF9jb3VudCA+PSAxCiAgICBwX2NvdW50ID09IGNvdW50KHBvbGljeV9oYXNoZXMpCgogICAgaV9jb3VudCA6PSBjb3VudChpX3N0b3JhZ2Uub3B0aW9ucykKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogaV9jb3VudCA9IiwgaV9jb3VudCkKICAgIGlfY291bnQgPT0gcF9jb3VudCArIDMKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zWzBdID0iLCBpX3N0b3JhZ2Uub3B0aW9uc1swXSkKICAgIGlfc3RvcmFnZS5vcHRpb25zWzBdID09ICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQubGF5ZXItc3JjLXByZWZpeD0vdmFyL2xpYi9jb250YWluZXJkL2lvLmNvbnRhaW5lcmQuc25hcHNob3R0ZXIudjEudGFyZGV2L2xheWVycyIKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zW2lfY291bnQgLSAyXSA9IiwgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDJdKQogICAgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDJdID09ICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQub3ZlcmxheS1ydyIKCiAgICBsb3dlcmRpciA6PSBjb25jYXQoIj0iLCBbImxvd2VyZGlyIiwgcF9zdG9yYWdlLm9wdGlvbnNbMF1dKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBsb3dlcmRpciA9IiwgbG93ZXJkaXIpCgogICAgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDFdID09IGxvd2VyZGlyCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zW2lfY291bnQgLSAxXSA9IiwgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDFdKQoKICAgIGV2ZXJ5IGksIHBvbGljeV9pZCBpbiBwb2xpY3lfaWRzIHsKICAgICAgICBhbGxvd19vdmVybGF5X2xheWVyKHBvbGljeV9pZCwgcG9saWN5X2hhc2hlc1tpXSwgaV9zdG9yYWdlLm9wdGlvbnNbaSArIDFdKQogICAgfQoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogdHJ1ZSIpCn0KYWxsb3dfc3RvcmFnZV9vcHRpb25zKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKSB7CiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDM6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCiAgICBjb3VudChwX3N0b3JhZ2Uub3B0aW9ucykgPT0gMQoKICAgIHN0YXJ0c3dpdGgocF9zdG9yYWdlLm9wdGlvbnNbMF0sICIkKGhhc2giKQogICAgaGFzaF9zdWZmaXggOj0gdHJpbV9sZWZ0KHBfc3RvcmFnZS5vcHRpb25zWzBdLCAiJChoYXNoIikKCiAgICBlbmRzd2l0aChoYXNoX3N1ZmZpeCwgIikiKQogICAgaGFzaF9pbmRleCA6PSB0cmltX3JpZ2h0KGhhc2hfc3VmZml4LCAiKSIpCiAgICBpIDo9IHRvX251bWJlcihoYXNoX2luZGV4KQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAzOiBpID0iLCBpKQoKICAgIGhhc2hfb3B0aW9uIDo9IGNvbmNhdCgiPSIsIFsiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LnJvb3QtaGFzaCIsIHJvb3RfaGFzaGVzW2ldXSkKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMzogaGFzaF9vcHRpb24gPSIsIGhhc2hfb3B0aW9uKQoKICAgIGNvdW50KGlfc3RvcmFnZS5vcHRpb25zKSA9PSA0CiAgICBpX3N0b3JhZ2Uub3B0aW9uc1swXSA9PSAicm8iCiAgICBpX3N0b3JhZ2Uub3B0aW9uc1sxXSA9PSAiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmJsb2NrX2RldmljZT1maWxlIgogICAgaV9zdG9yYWdlLm9wdGlvbnNbMl0gPT0gImlvLmthdGFjb250YWluZXJzLmZzLW9wdC5pcy1sYXllciIKICAgIGlfc3RvcmFnZS5vcHRpb25zWzNdID09IGhhc2hfb3B0aW9uCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAzOiB0cnVlIikKfQphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgNDogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gInNtYiIKICAgIHBfb3B0c19jb3VudCA6PSBjb3VudChwX3N0b3JhZ2Uub3B0aW9ucykKICAgIGlfb3B0c19jb3VudCA6PSBjb3VudChpX3N0b3JhZ2Uub3B0aW9ucykKICAgIGlfb3B0c19jb3VudCA9PSBwX29wdHNfY291bnQgKyAyCgogICAgaV9vcHRfbWF0Y2hlcyA6PSBbaSB8IGkgOj0gaWR4OyBpZHggPCBwX29wdHNfY291bnQ7IHBfc3RvcmFnZS5vcHRpb25zW2lkeF0gPT0gaV9zdG9yYWdlLm9wdGlvbnNbaWR4XV0KICAgIGNvdW50KGlfb3B0X21hdGNoZXMpID09IHBfb3B0c19jb3VudAoKICAgIHN0YXJ0c3dpdGgoaV9zdG9yYWdlLm9wdGlvbnNbaV9vcHRzX2NvdW50LTJdLCAiYWRkcj0iKQogICAgY3JlZHMgPSBzcGxpdChpX3N0b3JhZ2Uub3B0aW9uc1tpX29wdHNfY291bnQtMV0sICIsIikKICAgIGNvdW50KGNyZWRzKSA9PSAyCiAgICBzdGFydHN3aXRoKGNyZWRzWzBdLCAidXNlcm5hbWU9IikKICAgIHN0YXJ0c3dpdGgoY3JlZHNbMV0sICJwYXNzd29yZD0iKQogICAgCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDQ6IHRydWUiKQp9CgphbGxvd19vdmVybGF5X2xheWVyKHBvbGljeV9pZCwgcG9saWN5X2hhc2gsIGlfb3B0aW9uKSB7CiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogcG9saWN5X2lkID0iLCBwb2xpY3lfaWQsICJwb2xpY3lfaGFzaCA9IiwgcG9saWN5X2hhc2gpCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogaV9vcHRpb24gPSIsIGlfb3B0aW9uKQoKICAgIHN0YXJ0c3dpdGgoaV9vcHRpb24sICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQubGF5ZXI9IikKICAgIGlfdmFsdWUgOj0gcmVwbGFjZShpX29wdGlvbiwgImlvLmthdGFjb250YWluZXJzLmZzLW9wdC5sYXllcj0iLCAiIikKICAgIGlfdmFsdWVfZGVjb2RlZCA6PSBiYXNlNjQuZGVjb2RlKGlfdmFsdWUpCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogaV92YWx1ZV9kZWNvZGVkID0iLCBpX3ZhbHVlX2RlY29kZWQpCgogICAgcG9saWN5X3N1ZmZpeCA6PSBjb25jYXQoIj0iLCBbInRhcixybyxpby5rYXRhY29udGFpbmVycy5mcy1vcHQuYmxvY2tfZGV2aWNlPWZpbGUsaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmlzLWxheWVyLGlvLmthdGFjb250YWluZXJzLmZzLW9wdC5yb290LWhhc2giLCBwb2xpY3lfaGFzaF0pCiAgICBwX3ZhbHVlIDo9IGNvbmNhdCgiLCIsIFtwb2xpY3lfaWQsIHBvbGljeV9zdWZmaXhdKQogICAgcHJpbnQoImFsbG93X292ZXJsYXlfbGF5ZXI6IHBfdmFsdWUgPSIsIHBfdmFsdWUpCgogICAgcF92YWx1ZSA9PSBpX3ZhbHVlX2RlY29kZWQKCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogdHJ1ZSIpCn0KCmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAidGFyIgoKICAgIHN0YXJ0c3dpdGgocF9zdG9yYWdlLm1vdW50X3BvaW50LCAiJChsYXllciIpCiAgICBtb3VudF9zdWZmaXggOj0gdHJpbV9sZWZ0KHBfc3RvcmFnZS5tb3VudF9wb2ludCwgIiQobGF5ZXIiKQoKICAgIGVuZHN3aXRoKG1vdW50X3N1ZmZpeCwgIikiKQogICAgbGF5ZXJfaW5kZXggOj0gdHJpbV9yaWdodChtb3VudF9zdWZmaXgsICIpIikKICAgIGkgOj0gdG9fbnVtYmVyKGxheWVyX2luZGV4KQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDE6IGkgPSIsIGkpCgogICAgbGF5ZXJfaWQgOj0gbGF5ZXJfaWRzW2ldCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMTogbGF5ZXJfaWQgPSIsIGxheWVyX2lkKQoKICAgIHBfbW91bnQgOj0gY29uY2F0KCIvIiwgWyIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L2xheWVycyIsIGxheWVyX2lkXSkKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCAxOiBwX21vdW50ID0iLCBwX21vdW50KQoKICAgIHBfbW91bnQgPT0gaV9zdG9yYWdlLm1vdW50X3BvaW50CgogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDE6IHRydWUiKQp9CmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAiZnVzZTMua2F0YS1vdmVybGF5IgoKICAgIG1vdW50MSA6PSByZXBsYWNlKHBfc3RvcmFnZS5tb3VudF9wb2ludCwgIiQoY3BhdGgpIiwgcG9saWN5X2RhdGEuY29tbW9uLmNwYXRoKQogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDI6IG1vdW50MiA9IiwgbW91bnQyKQoKICAgIG1vdW50MiA9PSBpX3N0b3JhZ2UubW91bnRfcG9pbnQKCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMjogdHJ1ZSIpCn0KYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKSB7CiAgICBwX3N0b3JhZ2UuZnN0eXBlID09ICJsb2NhbCIKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQyID0iLCBtb3VudDIpCgogICAgbW91bnQzIDo9IHJlcGxhY2UobW91bnQyLCAiJChzYW5kYm94LWlkKSIsIHNhbmRib3hfaWQpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQzID0iLCBtb3VudDMpCgogICAgcmVnZXgubWF0Y2gobW91bnQzLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCgogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDM6IHRydWUiKQp9CmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAiYmluZCIKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNDogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNDogbW91bnQyID0iLCBtb3VudDIpCgogICAgbW91bnQzIDo9IHJlcGxhY2UobW91bnQyLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDQ6IG1vdW50MyA9IiwgbW91bnQzKQoKICAgIHJlZ2V4Lm1hdGNoKG1vdW50MywgaV9zdG9yYWdlLm1vdW50X3BvaW50KQoKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA0OiB0cnVlIikKfQphbGxvd19tb3VudF9wb2ludChwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgYnVuZGxlX2lkLCBzYW5kYm94X2lkLCBsYXllcl9pZHMpIHsKICAgIHBfc3RvcmFnZS5mc3R5cGUgPT0gInRtcGZzIgoKICAgIG1vdW50MSA6PSBwX3N0b3JhZ2UubW91bnRfcG9pbnQKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA1OiBtb3VudDEgPSIsIG1vdW50MSkKCiAgICByZWdleC5tYXRjaChtb3VudDEsIGlfc3RvcmFnZS5tb3VudF9wb2ludCkKCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNTogdHJ1ZSIpCn0KYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKSB7CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogaV9zdG9yYWdlLm1vdW50X3BvaW50ID0iLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCiAgICBhbGxvd19kaXJlY3Rfdm9sX2RyaXZlcihwX3N0b3JhZ2UsIGlfc3RvcmFnZSkKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChzcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQyID0iLCBtb3VudDIpCgogICAgZGlyZWN0X3ZvbF9wYXRoIDo9IGlfc3RvcmFnZS5zb3VyY2UKICAgIG1vdW50MyA6PSByZXBsYWNlKG1vdW50MiwgIiQoYjY0LWRpcmVjdC12b2wtcGF0aCkiLCBiYXNlNjR1cmwuZW5jb2RlKGRpcmVjdF92b2xfcGF0aCkpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQzID0iLCBtb3VudDMpCgogICAgbW91bnQzID09IGlfc3RvcmFnZS5tb3VudF9wb2ludAoKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA2OiB0cnVlIikKfQoKYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIocF9zdG9yYWdlLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19kaXJlY3Rfdm9sX2RyaXZlciAxOiBzdGFydCIpCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCiAgICBwcmludCgiYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIgMTogdHJ1ZSIpCn0KYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIocF9zdG9yYWdlLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19kaXJlY3Rfdm9sX2RyaXZlciAyOiBzdGFydCIpCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJzbWIiCiAgICBwcmludCgiYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIgMjogdHJ1ZSIpCn0KCiMgRXhlY1Byb2Nlc3NSZXF1ZXN0LnByb2Nlc3MuQ2FwYWJpbGl0aWVzCmFsbG93X2V4ZWNfY2FwcyhpX2NhcHMpIHsKICAgIG5vdCBpX2NhcHMuQW1iaWVudAogICAgbm90IGlfY2Fwcy5Cb3VuZGluZwogICAgbm90IGlfY2Fwcy5FZmZlY3RpdmUKICAgIG5vdCBpX2NhcHMuSW5oZXJpdGFibGUKICAgIG5vdCBpX2NhcHMuUGVybWl0dGVkCn0KCiMgT0NJLlByb2Nlc3MuQ2FwYWJpbGl0aWVzCmFsbG93X2NhcHMocF9jYXBzLCBpX2NhcHMpIHsKICAgIHByaW50KCJhbGxvd19jYXBzOiBwb2xpY3kgQW1iaWVudCA9IiwgcF9jYXBzLkFtYmllbnQpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgQW1iaWVudCA9IiwgaV9jYXBzLkFtYmllbnQpCiAgICBtYXRjaF9jYXBzKHBfY2Fwcy5BbWJpZW50LCBpX2NhcHMuQW1iaWVudCkKCiAgICBwcmludCgiYWxsb3dfY2FwczogcG9saWN5IEJvdW5kaW5nID0iLCBwX2NhcHMuQm91bmRpbmcpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgQm91bmRpbmcgPSIsIGlfY2Fwcy5Cb3VuZGluZykKICAgIG1hdGNoX2NhcHMocF9jYXBzLkJvdW5kaW5nLCBpX2NhcHMuQm91bmRpbmcpCgogICAgcHJpbnQoImFsbG93X2NhcHM6IHBvbGljeSBFZmZlY3RpdmUgPSIsIHBfY2Fwcy5FZmZlY3RpdmUpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgRWZmZWN0aXZlID0iLCBpX2NhcHMuRWZmZWN0aXZlKQogICAgbWF0Y2hfY2FwcyhwX2NhcHMuRWZmZWN0aXZlLCBpX2NhcHMuRWZmZWN0aXZlKQoKICAgIHByaW50KCJhbGxvd19jYXBzOiBwb2xpY3kgSW5oZXJpdGFibGUgPSIsIHBfY2Fwcy5Jbmhlcml0YWJsZSkKICAgIHByaW50KCJhbGxvd19jYXBzOiBpbnB1dCBJbmhlcml0YWJsZSA9IiwgaV9jYXBzLkluaGVyaXRhYmxlKQogICAgbWF0Y2hfY2FwcyhwX2NhcHMuSW5oZXJpdGFibGUsIGlfY2Fwcy5Jbmhlcml0YWJsZSkKCiAgICBwcmludCgiYWxsb3dfY2FwczogcG9saWN5IFBlcm1pdHRlZCA9IiwgcF9jYXBzLlBlcm1pdHRlZCkKICAgIHByaW50KCJhbGxvd19jYXBzOiBpbnB1dCBQZXJtaXR0ZWQgPSIsIGlfY2Fwcy5QZXJtaXR0ZWQpCiAgICBtYXRjaF9jYXBzKHBfY2Fwcy5QZXJtaXR0ZWQsIGlfY2Fwcy5QZXJtaXR0ZWQpCn0KCm1hdGNoX2NhcHMocF9jYXBzLCBpX2NhcHMpIHsKICAgIHByaW50KCJtYXRjaF9jYXBzIDE6IHN0YXJ0IikKCiAgICBwX2NhcHMgPT0gaV9jYXBzCgogICAgcHJpbnQoIm1hdGNoX2NhcHMgMTogdHJ1ZSIpCn0KbWF0Y2hfY2FwcyhwX2NhcHMsIGlfY2FwcykgewogICAgcHJpbnQoIm1hdGNoX2NhcHMgMjogc3RhcnQiKQoKICAgIGNvdW50KHBfY2FwcykgPT0gMQogICAgcF9jYXBzWzBdID09ICIkKGRlZmF1bHRfY2FwcykiCgogICAgcHJpbnQoIm1hdGNoX2NhcHMgMjogZGVmYXVsdF9jYXBzID0iLCBwb2xpY3lfZGF0YS5jb21tb24uZGVmYXVsdF9jYXBzKQogICAgcG9saWN5X2RhdGEuY29tbW9uLmRlZmF1bHRfY2FwcyA9PSBpX2NhcHMKCiAgICBwcmludCgibWF0Y2hfY2FwcyAyOiB0cnVlIikKfQptYXRjaF9jYXBzKHBfY2FwcywgaV9jYXBzKSB7CiAgICBwcmludCgibWF0Y2hfY2FwcyAzOiBzdGFydCIpCgogICAgY291bnQocF9jYXBzKSA9PSAxCiAgICBwX2NhcHNbMF0gPT0gIiQocHJpdmlsZWdlZF9jYXBzKSIKCiAgICBwcmludCgibWF0Y2hfY2FwcyAzOiBwcml2aWxlZ2VkX2NhcHMgPSIsIHBvbGljeV9kYXRhLmNvbW1vbi5wcml2aWxlZ2VkX2NhcHMpCiAgICBwb2xpY3lfZGF0YS5jb21tb24ucHJpdmlsZWdlZF9jYXBzID09IGlfY2FwcwoKICAgIHByaW50KCJtYXRjaF9jYXBzIDM6IHRydWUiKQp9CgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgpjaGVja19kaXJlY3RvcnlfdHJhdmVyc2FsKGlfcGF0aCkgewogICAgbm90IHJlZ2V4Lm1hdGNoKCIoXnwvKS4uKCR8LykiLCBpX3BhdGgpCn0KCmNoZWNrX3N5bWxpbmtfc291cmNlKGlfc3JjKSB7CiAgICBpX3NyYyA9PSAiIgogICAgcHJpbnQoImNoZWNrX3N5bWxpbmtfc291cmNlIDE6IHRydWUiKQp9CmNoZWNrX3N5bWxpbmtfc291cmNlKGlfc3JjKSB7CiAgICBpX3NyYyAhPSAiIgogICAgcHJpbnQoImNoZWNrX3N5bWxpbmtfc291cmNlIDI6IGlfc3JjID0iLCBpX3NyYykKCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24uc19zb3VyY2UxLCBpX3NyYykKCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMjogdHJ1ZSIpCn0KY2hlY2tfc3ltbGlua19zb3VyY2UoaV9zcmMpIHsKICAgIGlfc3JjICE9ICIiCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMzogaV9zcmMgPSIsIGlfc3JjKQoKICAgIHJlZ2V4Lm1hdGNoKHBvbGljeV9kYXRhLmNvbW1vbi5zX3NvdXJjZTIsIGlfc3JjKQogICAgY2hlY2tfZGlyZWN0b3J5X3RyYXZlcnNhbChpX3NyYykKCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMzogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfc3RvcmFnZXMoaV9zdG9yYWdlcykgewogICAgcHJpbnQoImFsbG93X3NhbmRib3hfc3RvcmFnZXM6IGlfc3RvcmFnZXMgPSIsIGlfc3RvcmFnZXMpCgogICAgcF9zdG9yYWdlcyA6PSBwb2xpY3lfZGF0YS5zYW5kYm94LnN0b3JhZ2VzCiAgICBldmVyeSBpX3N0b3JhZ2UgaW4gaV9zdG9yYWdlcyB7CiAgICAgICAgYWxsb3dfc2FuZGJveF9zdG9yYWdlKHBfc3RvcmFnZXMsIGlfc3RvcmFnZSkKICAgIH0KCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9zdG9yYWdlczogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfc3RvcmFnZShwX3N0b3JhZ2VzLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IGlfc3RvcmFnZSA9IiwgaV9zdG9yYWdlKQoKICAgIHNvbWUgcF9zdG9yYWdlIGluIHBfc3RvcmFnZXMKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IHBfc3RvcmFnZSA9IiwgcF9zdG9yYWdlKQogICAgaV9zdG9yYWdlID09IHBfc3RvcmFnZQoKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IHRydWUiKQp9CgpDb3B5RmlsZVJlcXVlc3QgewogICAgcHJpbnQoIkNvcHlGaWxlUmVxdWVzdDogaW5wdXQucGF0aCA9IiwgaW5wdXQucGF0aCkKCiAgICBjaGVja19zeW1saW5rX3NvdXJjZShpbnB1dC5zeW1saW5rX3NyYykKICAgIGNoZWNrX2RpcmVjdG9yeV90cmF2ZXJzYWwoaW5wdXQucGF0aCkKCiAgICBzb21lIHJlZ2V4MSBpbiBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLkNvcHlGaWxlUmVxdWVzdAogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5jcGF0aCkKICAgIHJlZ2V4NCA6PSByZXBsYWNlKHJlZ2V4MywgIiQoYnVuZGxlLWlkKSIsIEJVTkRMRV9JRCkKICAgIHByaW50KCJDb3B5RmlsZVJlcXVlc3Q6IHJlZ2V4NCA9IiwgcmVnZXg0KQoKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4NCwgaW5wdXQucGF0aCkKCiAgICBwcmludCgiQ29weUZpbGVSZXF1ZXN0OiB0cnVlIikKfQoKQ3JlYXRlU2FuZGJveFJlcXVlc3QgewogICAgcHJpbnQoIkNyZWF0ZVNhbmRib3hSZXF1ZXN0OiBpbnB1dC5ndWVzdF9ob29rX3BhdGggPSIsIGlucHV0Lmd1ZXN0X2hvb2tfcGF0aCkKICAgIGNvdW50KGlucHV0Lmd1ZXN0X2hvb2tfcGF0aCkgPT0gMAoKICAgIHByaW50KCJDcmVhdGVTYW5kYm94UmVxdWVzdDogaW5wdXQua2VybmVsX21vZHVsZXMgPSIsIGlucHV0Lmtlcm5lbF9tb2R1bGVzKQogICAgY291bnQoaW5wdXQua2VybmVsX21vZHVsZXMpID09IDAKCiAgICBpX3BpZG5zIDo9IGlucHV0LnNhbmRib3hfcGlkbnMKICAgIHByaW50KCJDcmVhdGVTYW5kYm94UmVxdWVzdDogaV9waWRucyA9IiwgaV9waWRucykKICAgIGlfcGlkbnMgPT0gZmFsc2UKICAgIGFsbG93X3NhbmRib3hfc3RvcmFnZXMoaW5wdXQuc3RvcmFnZXMpCn0KCmFsbG93X2V4ZWMocF9jb250YWluZXIsIGlfcHJvY2VzcykgewogICAgcHJpbnQoImFsbG93X2V4ZWM6IHN0YXJ0IikKCiAgICBwX29jaSA9IHBfY29udGFpbmVyLk9DSQogICAgcF9zX25hbWUgPSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc19uYW1lc3BhY2UgPSBnZXRfc3RhdGVfdmFsKCJuYW1lc3BhY2UiKQogICAgYWxsb3dfcHJvYmVfcHJvY2VzcyhwX29jaS5Qcm9jZXNzLCBpX3Byb2Nlc3MsIHBfc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfZXhlYzogdHJ1ZSIpCn0KCmFsbG93X2ludGVyYWN0aXZlX2V4ZWMocF9jb250YWluZXIsIGlfcHJvY2VzcykgewogICAgcHJpbnQoImFsbG93X2ludGVyYWN0aXZlX2V4ZWM6IHN0YXJ0IikKCiAgICBwX29jaSA9IHBfY29udGFpbmVyLk9DSQogICAgcF9zX25hbWUgPSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc19uYW1lc3BhY2UgPSBnZXRfc3RhdGVfdmFsKCJuYW1lc3BhY2UiKQogICAgYWxsb3dfaW50ZXJhY3RpdmVfcHJvY2VzcyhwX29jaS5Qcm9jZXNzLCBpX3Byb2Nlc3MsIHBfc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfaW50ZXJhY3RpdmVfZXhlYzogdHJ1ZSIpCn0KCiMgVE9ETzogc2hvdWxkIG90aGVyIEV4ZWNQcm9jZXNzUmVxdWVzdCBpbnB1dCBkYXRhIGZpZWxkcyBiZSB2YWxpZGF0ZWQgYXMgd2VsbD8KRXhlY1Byb2Nlc3NSZXF1ZXN0IHsKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMTogaW5wdXQgPSIsIGlucHV0KQoKICAgIHNvbWUgcF9jb21tYW5kIGluIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuRXhlY1Byb2Nlc3NSZXF1ZXN0LmFsbG93ZWRfY29tbWFuZHMKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMTogcF9jb21tYW5kID0iLCBwX2NvbW1hbmQpCiAgICBwX2NvbW1hbmQgPT0gaW5wdXQucHJvY2Vzcy5BcmdzCgogICAgIyBUT0RPOiBtYXRjaCBwX2NvbnRhaW5lcidzIElEIHdpdGggdGhlIGlucHV0IGNvbnRhaW5lcl9pZC4KICAgIHNvbWUgcF9jb250YWluZXIgaW4gcG9saWN5X2RhdGEuY29udGFpbmVycwogICAgYWxsb3dfaW50ZXJhY3RpdmVfZXhlYyhwX2NvbnRhaW5lciwgaW5wdXQucHJvY2VzcykKCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDE6IHRydWUiKQp9CkV4ZWNQcm9jZXNzUmVxdWVzdCB7CiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDI6IGlucHV0ID0iLCBpbnB1dCkKCiAgICAjIFRPRE86IG1hdGNoIGlucHV0IGNvbnRhaW5lciBJRCB3aXRoIGl0cyBjb3JyZXNwb25kaW5nIGNvbnRhaW5lci5leGVjX2NvbW1hbmRzLgogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBzb21lIHBfY29tbWFuZCBpbiBwX2NvbnRhaW5lci5leGVjX2NvbW1hbmRzCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDI6IHBfY29tbWFuZCA9IiwgcF9jb21tYW5kKQoKICAgICMgVE9ETzogc2hvdWxkIG90aGVyIGlucHV0IGRhdGEgZmllbGRzIGJlIHZhbGlkYXRlZCBhcyB3ZWxsPwogICAgcF9jb21tYW5kID09IGlucHV0LnByb2Nlc3MuQXJncwoKICAgIGFsbG93X2V4ZWMocF9jb250YWluZXIsIGlucHV0LnByb2Nlc3MpCgogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAyOiB0cnVlIikKfQpFeGVjUHJvY2Vzc1JlcXVlc3QgewogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAzOiBpbnB1dCA9IiwgaW5wdXQpCgogICAgaV9jb21tYW5kID0gY29uY2F0KCIgIiwgaW5wdXQucHJvY2Vzcy5BcmdzKQogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAzOiBpX2NvbW1hbmQgPSIsIGlfY29tbWFuZCkKCiAgICBzb21lIHBfcmVnZXggaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5FeGVjUHJvY2Vzc1JlcXVlc3QucmVnZXgKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMzogcF9yZWdleCA9IiwgcF9yZWdleCkKCiAgICByZWdleC5tYXRjaChwX3JlZ2V4LCBpX2NvbW1hbmQpCgogICAgIyBUT0RPOiBtYXRjaCBwX2NvbnRhaW5lcidzIElEIHdpdGggdGhlIGlucHV0IGNvbnRhaW5lcl9pZC4KICAgIHNvbWUgcF9jb250YWluZXIgaW4gcG9saWN5X2RhdGEuY29udGFpbmVycwogICAgYWxsb3dfaW50ZXJhY3RpdmVfZXhlYyhwX2NvbnRhaW5lciwgaW5wdXQucHJvY2VzcykKCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDM6IHRydWUiKQp9CgpVcGRhdGVSb3V0ZXNSZXF1ZXN0IHsKICAgIHByaW50KCJVcGRhdGVSb3V0ZXNSZXF1ZXN0OiBpbnB1dCA9IiwgaW5wdXQpCiAgICBwcmludCgiVXBkYXRlUm91dGVzUmVxdWVzdDogcG9saWN5ID0iLCBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLlVwZGF0ZVJvdXRlc1JlcXVlc3QpCgogICAgaV9yb3V0ZXMgOj0gaW5wdXQucm91dGVzLlJvdXRlcwogICAgcF9zb3VyY2VfcmVnZXggPSBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLlVwZGF0ZVJvdXRlc1JlcXVlc3QuZm9yYmlkZGVuX3NvdXJjZV9yZWdleAogICAgcF9uYW1lcyA9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuVXBkYXRlUm91dGVzUmVxdWVzdC5mb3JiaWRkZW5fZGV2aWNlX25hbWVzCgogICAgZXZlcnkgaV9yb3V0ZSBpbiBpX3JvdXRlcyB7CiAgICAgICAgcHJpbnQoImlfcm91dGUuc291cmNlID0iLCBpX3JvdXRlLnNvdXJjZSkKICAgICAgICBldmVyeSBwX3JlZ2V4IGluIHBfc291cmNlX3JlZ2V4IHsKICAgICAgICAgICAgcHJpbnQoInBfcmVnZXggPSIsIHBfcmVnZXgpCiAgICAgICAgICAgIG5vdCByZWdleC5tYXRjaChwX3JlZ2V4LCBpX3JvdXRlLnNvdXJjZSkKICAgICAgICB9CgogICAgICAgIHByaW50KCJpX3JvdXRlLmRldmljZSA9IiwgaV9yb3V0ZS5kZXZpY2UpCiAgICAgICAgbm90IGlfcm91dGUuZGV2aWNlIGluIHBfbmFtZXMKICAgIH0KCiAgICBwcmludCgiVXBkYXRlUm91dGVzUmVxdWVzdDogdHJ1ZSIpCn0KClVwZGF0ZUludGVyZmFjZVJlcXVlc3QgewogICAgcHJpbnQoIlVwZGF0ZUludGVyZmFjZVJlcXVlc3Q6IGlucHV0ID0iLCBpbnB1dCkKICAgIHByaW50KCJVcGRhdGVJbnRlcmZhY2VSZXF1ZXN0OiBwb2xpY3kgPSIsIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuVXBkYXRlSW50ZXJmYWNlUmVxdWVzdCkKCiAgICBpX2ludGVyZmFjZSA6PSBpbnB1dC5pbnRlcmZhY2UKICAgIHBfZmxhZ3MgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmFsbG93X3Jhd19mbGFncwoKICAgICMgVHlwaWNhbGx5LCBqdXN0IElGRl9OT0FSUCBpcyB1c2VkLgogICAgYml0cy5hbmQoaV9pbnRlcmZhY2UucmF3X2ZsYWdzLCBiaXRzLm5lZ2F0ZShwX2ZsYWdzKSkgPT0gMAoKICAgIHBfbmFtZXMgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmZvcmJpZGRlbl9uYW1lcwoKICAgIG5vdCBpX2ludGVyZmFjZS5uYW1lIGluIHBfbmFtZXMKCiAgICBwX2h3YWRkcnMgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmZvcmJpZGRlbl9od19hZGRycwoKICAgIG5vdCBpX2ludGVyZmFjZS5od0FkZHIgaW4gcF9od2FkZHJzCgogICAgcHJpbnQoIlVwZGF0ZUludGVyZmFjZVJlcXVlc3Q6IHRydWUiKQp9CgpDbG9zZVN0ZGluUmVxdWVzdCB7CiAgICBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLkNsb3NlU3RkaW5SZXF1ZXN0ID09IHRydWUKfQoKUmVhZFN0cmVhbVJlcXVlc3QgewogICAgcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5SZWFkU3RyZWFtUmVxdWVzdCA9PSB0cnVlCn0KClVwZGF0ZUVwaGVtZXJhbE1vdW50c1JlcXVlc3QgewogICAgcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVFcGhlbWVyYWxNb3VudHNSZXF1ZXN0ID09IHRydWUKfQoKV3JpdGVTdHJlYW1SZXF1ZXN0IHsKICAgIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuV3JpdGVTdHJlYW1SZXF1ZXN0ID09IHRydWUKfQoKcG9saWN5X2RhdGEgOj0gewogICJjb250YWluZXJzIjogWwogICAgewogICAgICAiT0NJIjogewogICAgICAgICJWZXJzaW9uIjogIjEuMS4wLXJjLjEiLAogICAgICAgICJQcm9jZXNzIjogewogICAgICAgICAgIlRlcm1pbmFsIjogZmFsc2UsCiAgICAgICAgICAiVXNlciI6IHsKICAgICAgICAgICAgIlVJRCI6IDEwMDAsCiAgICAgICAgICAgICJHSUQiOiA2NTUzNSwKICAgICAgICAgICAgIkFkZGl0aW9uYWxHaWRzIjogW10sCiAgICAgICAgICAgICJVc2VybmFtZSI6ICIiCiAgICAgICAgICB9LAogICAgICAgICAgIkRlcHJlY2F0ZWRBcmdzIjogWwogICAgICAgICAgICAiL3BhdXNlIgogICAgICAgICAgXSwKICAgICAgICAgICJBcmdzIjogWwogICAgICAgICAgICAiL3BhdXNlIgogICAgICAgICAgXSwKICAgICAgICAgICJFbnYiOiBbCiAgICAgICAgICAgICJQQVRIPS91c3IvbG9jYWwvc2JpbjovdXNyL2xvY2FsL2JpbjovdXNyL3NiaW46L3Vzci9iaW46L3NiaW46L2JpbiIKICAgICAgICAgIF0sCiAgICAgICAgICAiQ3dkIjogIi8iLAogICAgICAgICAgIkNhcGFiaWxpdGllcyI6IHsKICAgICAgICAgICAgIkFtYmllbnQiOiBbXSwKICAgICAgICAgICAgIkJvdW5kaW5nIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJFZmZlY3RpdmUiOiBbCiAgICAgICAgICAgICAgIiQoZGVmYXVsdF9jYXBzKSIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgIkluaGVyaXRhYmxlIjogW10sCiAgICAgICAgICAgICJQZXJtaXR0ZWQiOiBbCiAgICAgICAgICAgICAgIiQoZGVmYXVsdF9jYXBzKSIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgICJOb05ld1ByaXZpbGVnZXMiOiB0cnVlCiAgICAgICAgfSwKICAgICAgICAiUm9vdCI6IHsKICAgICAgICAgICJQYXRoIjogIiQoY3BhdGgpLyQoYnVuZGxlLWlkKSIsCiAgICAgICAgICAiUmVhZG9ubHkiOiB0cnVlCiAgICAgICAgfSwKICAgICAgICAiTW91bnRzIjogWwogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL3Byb2MiLAogICAgICAgICAgICAic291cmNlIjogInByb2MiLAogICAgICAgICAgICAidHlwZV8iOiAicHJvYyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYiLAogICAgICAgICAgICAic291cmNlIjogInRtcGZzIiwKICAgICAgICAgICAgInR5cGVfIjogInRtcGZzIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgInN0cmljdGF0aW1lIiwKICAgICAgICAgICAgICAibW9kZT03NTUiLAogICAgICAgICAgICAgICJzaXplPTY1NTM2ayIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvcHRzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJkZXZwdHMiLAogICAgICAgICAgICAidHlwZV8iOiAiZGV2cHRzIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAgICAgIm5ld2luc3RhbmNlIiwKICAgICAgICAgICAgICAicHRteG1vZGU9MDY2NiIsCiAgICAgICAgICAgICAgIm1vZGU9MDYyMCIsCiAgICAgICAgICAgICAgImdpZD01IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi9zaG0iLAogICAgICAgICAgICAic291cmNlIjogIi9ydW4va2F0YS1jb250YWluZXJzL3NhbmRib3gvc2htIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L21xdWV1ZSIsCiAgICAgICAgICAgICJzb3VyY2UiOiAibXF1ZXVlIiwKICAgICAgICAgICAgInR5cGVfIjogIm1xdWV1ZSIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9zeXMiLAogICAgICAgICAgICAic291cmNlIjogInN5c2ZzIiwKICAgICAgICAgICAgInR5cGVfIjogInN5c2ZzIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAgICAgIm5vZGV2IiwKICAgICAgICAgICAgICAicm8iCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZXRjL3Jlc29sdi5jb25mIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KXJlc29sdi5jb25mJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicm8iLAogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2RldiIsCiAgICAgICAgICAgICAgIm5vZXhlYyIKICAgICAgICAgICAgXQogICAgICAgICAgfQogICAgICAgIF0sCiAgICAgICAgIkFubm90YXRpb25zIjogewogICAgICAgICAgImlvLmthdGFjb250YWluZXJzLnBrZy5vY2kuYnVuZGxlX3BhdGgiOiAiL3J1bi9jb250YWluZXJkL2lvLmNvbnRhaW5lcmQucnVudGltZS52Mi50YXNrL2s4cy5pby8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgImlvLmthdGFjb250YWluZXJzLnBrZy5vY2kuY29udGFpbmVyX3R5cGUiOiAicG9kX3NhbmRib3giLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLmNvbnRhaW5lci10eXBlIjogInNhbmRib3giLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtaWQiOiAiXlthLXowLTldezY0fSQiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbG9nLWRpcmVjdG9yeSI6ICJeL3Zhci9sb2cvcG9kcy8kKHNhbmRib3gtbmFtZXNwYWNlKV8kKHNhbmRib3gtbmFtZSlfWzAtOWEtZl17OH0tWzAtOWEtZl17NH0tWzAtOWEtZl17NH0tWzAtOWEtZl17NH0tWzAtOWEtZl17MTJ9JCIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1uYW1lc3BhY2UiOiAiIiwKICAgICAgICAgICJuZXJkY3RsL25ldHdvcmstbmFtZXNwYWNlIjogIl4vdmFyL3J1bi9uZXRucy9jbmktWzAtOWEtZl17OH0tWzAtOWEtZl17NH0tWzAtOWEtZl17NH0tWzAtOWEtZl17NH0tWzAtOWEtZl17MTJ9JCIKICAgICAgICB9LAogICAgICAgICJMaW51eCI6IHsKICAgICAgICAgICJOYW1lc3BhY2VzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgIlR5cGUiOiAiaXBjIiwKICAgICAgICAgICAgICAiUGF0aCI6ICIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiVHlwZSI6ICJ1dHMiLAogICAgICAgICAgICAgICJQYXRoIjogIiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJUeXBlIjogIm1vdW50IiwKICAgICAgICAgICAgICAiUGF0aCI6ICIiCiAgICAgICAgICAgIH0KICAgICAgICAgIF0sCiAgICAgICAgICAiTWFza2VkUGF0aHMiOiBbCiAgICAgICAgICAgICIvcHJvYy9hY3BpIiwKICAgICAgICAgICAgIi9wcm9jL2Fzb3VuZCIsCiAgICAgICAgICAgICIvcHJvYy9rY29yZSIsCiAgICAgICAgICAgICIvcHJvYy9rZXlzIiwKICAgICAgICAgICAgIi9wcm9jL2xhdGVuY3lfc3RhdHMiLAogICAgICAgICAgICAiL3Byb2MvdGltZXJfbGlzdCIsCiAgICAgICAgICAgICIvcHJvYy90aW1lcl9zdGF0cyIsCiAgICAgICAgICAgICIvcHJvYy9zY2hlZF9kZWJ1ZyIsCiAgICAgICAgICAgICIvc3lzL2Zpcm13YXJlIiwKICAgICAgICAgICAgIi9wcm9jL3Njc2kiCiAgICAgICAgICBdLAogICAgICAgICAgIlJlYWRvbmx5UGF0aHMiOiBbCiAgICAgICAgICAgICIvcHJvYy9idXMiLAogICAgICAgICAgICAiL3Byb2MvZnMiLAogICAgICAgICAgICAiL3Byb2MvaXJxIiwKICAgICAgICAgICAgIi9wcm9jL3N5cyIsCiAgICAgICAgICAgICIvcHJvYy9zeXNycS10cmlnZ2VyIgogICAgICAgICAgXSwKICAgICAgICAgICJEZXZpY2VzIjogW10sCiAgICAgICAgICAiU3lzY3RsIjogewogICAgICAgICAgICAibmV0LmlwdjQuaXBfdW5wcml2aWxlZ2VkX3BvcnRfc3RhcnQiOiAiMCIsCiAgICAgICAgICAgICJuZXQuaXB2NC5waW5nX2dyb3VwX3JhbmdlIjogIjAgMjE0NzQ4MzY0NyIKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0sCiAgICAgICJzdG9yYWdlcyI6IFsKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoMCkiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXIwKSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogIm92ZXJsYXlmcyIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAiZnVzZTMua2F0YS1vdmVybGF5IiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiNWE1YWFkODAwNTVmZjIwMDEyYTUwZGMyNWY4ZGY3YTI5OTI0NDc0MzI0ZDY1ZjdkNTMwNmVlOGVlMjdmZjcxZCIsCiAgICAgICAgICAgICI4MTcyNTBmMWEzZTMzNmRhNzZmNWJkM2ZhNzg0ZTFiMjZkOTU5YjljMTMxODc2ODE1YmEyNjA0MDQ4YjcwYzE4IgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGNwYXRoKS8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0KICAgICAgXSwKICAgICAgImRldmljZXMiOiBbXSwKICAgICAgInNhbmRib3hfcGlkbnMiOiBmYWxzZSwKICAgICAgImV4ZWNfY29tbWFuZHMiOiBbXSwKICAgICAgImVudl9tYXAiOiB7CiAgICAgICAgIlBBVEgiOiAiL3Vzci9sb2NhbC9zYmluOi91c3IvbG9jYWwvYmluOi91c3Ivc2JpbjovdXNyL2Jpbjovc2JpbjovYmluIgogICAgICB9CiAgICB9LAogICAgewogICAgICAiT0NJIjogewogICAgICAgICJWZXJzaW9uIjogIjEuMS4wLXJjLjEiLAogICAgICAgICJQcm9jZXNzIjogewogICAgICAgICAgIlRlcm1pbmFsIjogZmFsc2UsCiAgICAgICAgICAiVXNlciI6IHsKICAgICAgICAgICAgIlVJRCI6IDEwMDAsCiAgICAgICAgICAgICJHSUQiOiAwLAogICAgICAgICAgICAiQWRkaXRpb25hbEdpZHMiOiBbXSwKICAgICAgICAgICAgIlVzZXJuYW1lIjogIiIKICAgICAgICAgIH0sCiAgICAgICAgICAiRGVwcmVjYXRlZEFyZ3MiOiBbCiAgICAgICAgICAgICJzaCIKICAgICAgICAgIF0sCiAgICAgICAgICAiQXJncyI6IFsKICAgICAgICAgICAgInNoIgogICAgICAgICAgXSwKICAgICAgICAgICJFbnYiOiBbCiAgICAgICAgICAgICJQQVRIPS91c3IvbG9jYWwvc2JpbjovdXNyL2xvY2FsL2JpbjovdXNyL3NiaW46L3Vzci9iaW46L3NiaW46L2JpbiIsCiAgICAgICAgICAgICJIT1NUTkFNRT0kKGhvc3QtbmFtZSkiCiAgICAgICAgICBdLAogICAgICAgICAgIkN3ZCI6ICIvIiwKICAgICAgICAgICJDYXBhYmlsaXRpZXMiOiB7CiAgICAgICAgICAgICJBbWJpZW50IjogW10sCiAgICAgICAgICAgICJCb3VuZGluZyI6IFsKICAgICAgICAgICAgICAiJChkZWZhdWx0X2NhcHMpIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiRWZmZWN0aXZlIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJJbmhlcml0YWJsZSI6IFtdLAogICAgICAgICAgICAiUGVybWl0dGVkIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICAiTm9OZXdQcml2aWxlZ2VzIjogZmFsc2UKICAgICAgICB9LAogICAgICAgICJSb290IjogewogICAgICAgICAgIlBhdGgiOiAiJChjcGF0aCkvJChidW5kbGUtaWQpIiwKICAgICAgICAgICJSZWFkb25seSI6IGZhbHNlCiAgICAgICAgfSwKICAgICAgICAiTW91bnRzIjogWwogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL3Byb2MiLAogICAgICAgICAgICAic291cmNlIjogInByb2MiLAogICAgICAgICAgICAidHlwZV8iOiAicHJvYyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYiLAogICAgICAgICAgICAic291cmNlIjogInRtcGZzIiwKICAgICAgICAgICAgInR5cGVfIjogInRtcGZzIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgInN0cmljdGF0aW1lIiwKICAgICAgICAgICAgICAibW9kZT03NTUiLAogICAgICAgICAgICAgICJzaXplPTY1NTM2ayIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvcHRzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJkZXZwdHMiLAogICAgICAgICAgICAidHlwZV8iOiAiZGV2cHRzIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAgICAgIm5ld2luc3RhbmNlIiwKICAgICAgICAgICAgICAicHRteG1vZGU9MDY2NiIsCiAgICAgICAgICAgICAgIm1vZGU9MDYyMCIsCiAgICAgICAgICAgICAgImdpZD01IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi9zaG0iLAogICAgICAgICAgICAic291cmNlIjogIi9ydW4va2F0YS1jb250YWluZXJzL3NhbmRib3gvc2htIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L21xdWV1ZSIsCiAgICAgICAgICAgICJzb3VyY2UiOiAibXF1ZXVlIiwKICAgICAgICAgICAgInR5cGVfIjogIm1xdWV1ZSIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9zeXMiLAogICAgICAgICAgICAic291cmNlIjogInN5c2ZzIiwKICAgICAgICAgICAgInR5cGVfIjogInN5c2ZzIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAgICAgIm5vZGV2IiwKICAgICAgICAgICAgICAicm8iCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvc3lzL2ZzL2Nncm91cCIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiY2dyb3VwIiwKICAgICAgICAgICAgInR5cGVfIjogImNncm91cCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIsCiAgICAgICAgICAgICAgInJlbGF0aW1lIiwKICAgICAgICAgICAgICAicm8iCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZXRjL2hvc3RzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KWhvc3RzJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJydyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvdGVybWluYXRpb24tbG9nIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KXRlcm1pbmF0aW9uLWxvZyQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicnciCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZXRjL2hvc3RuYW1lIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KWhvc3RuYW1lJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJydyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9ldGMvcmVzb2x2LmNvbmYiLAogICAgICAgICAgICAic291cmNlIjogIiQoc2ZwcmVmaXgpcmVzb2x2LmNvbmYkIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJ3IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL3Zhci9ydW4vc2VjcmV0cy9rdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50IiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KXNlcnZpY2VhY2NvdW50JCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJybyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi92YXIvcnVuL3NlY3JldHMvYXp1cmUvdG9rZW5zIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KXRva2VucyQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicm8iCiAgICAgICAgICAgIF0KICAgICAgICAgIH0KICAgICAgICBdLAogICAgICAgICJBbm5vdGF0aW9ucyI6IHsKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmJ1bmRsZV9wYXRoIjogIi9ydW4vY29udGFpbmVyZC9pby5jb250YWluZXJkLnJ1bnRpbWUudjIudGFzay9rOHMuaW8vJChidW5kbGUtaWQpIiwKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIjogInBvZF9jb250YWluZXIiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLmNvbnRhaW5lci1uYW1lIjogImMiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLmNvbnRhaW5lci10eXBlIjogImNvbnRhaW5lciIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuaW1hZ2UtbmFtZSI6ICJtY3IubWljcm9zb2Z0LmNvbS9ha3MvZTJlL2xpYnJhcnktYnVzeWJveDptYXN0ZXIuMjIwMzE0LjEtbGludXgtYW1kNjQiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtaWQiOiAiXlthLXowLTldezY0fSQiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZXNwYWNlIjogIiIKICAgICAgICB9LAogICAgICAgICJMaW51eCI6IHsKICAgICAgICAgICJOYW1lc3BhY2VzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgIlR5cGUiOiAiaXBjIiwKICAgICAgICAgICAgICAiUGF0aCI6ICIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiVHlwZSI6ICJ1dHMiLAogICAgICAgICAgICAgICJQYXRoIjogIiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJUeXBlIjogIm1vdW50IiwKICAgICAgICAgICAgICAiUGF0aCI6ICIiCiAgICAgICAgICAgIH0KICAgICAgICAgIF0sCiAgICAgICAgICAiTWFza2VkUGF0aHMiOiBbCiAgICAgICAgICAgICIvcHJvYy9hY3BpIiwKICAgICAgICAgICAgIi9wcm9jL2tjb3JlIiwKICAgICAgICAgICAgIi9wcm9jL2tleXMiLAogICAgICAgICAgICAiL3Byb2MvbGF0ZW5jeV9zdGF0cyIsCiAgICAgICAgICAgICIvcHJvYy90aW1lcl9saXN0IiwKICAgICAgICAgICAgIi9wcm9jL3RpbWVyX3N0YXRzIiwKICAgICAgICAgICAgIi9wcm9jL3NjaGVkX2RlYnVnIiwKICAgICAgICAgICAgIi9wcm9jL3Njc2kiLAogICAgICAgICAgICAiL3N5cy9maXJtd2FyZSIKICAgICAgICAgIF0sCiAgICAgICAgICAiUmVhZG9ubHlQYXRocyI6IFsKICAgICAgICAgICAgIi9wcm9jL2Fzb3VuZCIsCiAgICAgICAgICAgICIvcHJvYy9idXMiLAogICAgICAgICAgICAiL3Byb2MvZnMiLAogICAgICAgICAgICAiL3Byb2MvaXJxIiwKICAgICAgICAgICAgIi9wcm9jL3N5cyIsCiAgICAgICAgICAgICIvcHJvYy9zeXNycS10cmlnZ2VyIgogICAgICAgICAgXSwKICAgICAgICAgICJEZXZpY2VzIjogW10sCiAgICAgICAgICAiU3lzY3RsIjogewogICAgICAgICAgICAibmV0LmlwdjQuaXBfdW5wcml2aWxlZ2VkX3BvcnRfc3RhcnQiOiAiMCIsCiAgICAgICAgICAgICJuZXQuaXB2NC5waW5nX2dyb3VwX3JhbmdlIjogIjAgMjE0NzQ4MzY0NyIKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0sCiAgICAgICJzdG9yYWdlcyI6IFsKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoMCkiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXIwKSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoMSkiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXIxKSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogIm92ZXJsYXlmcyIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAiZnVzZTMua2F0YS1vdmVybGF5IiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiMmMzNDJhMTM3ZTY5M2M3ODk4YWVjMzZkYTEwNDdmMTkxZGM3YzE2ODdlNjYxOThhZGFjYzQzOWNmNGFkZjM3OToyNTcwZTNhMTllMWJmMjBkZGRhNDU0OThhOTYyN2Y2MTU1NWQyZDZjMDE0NzliOWI3NjQ2MGI2NzliMjdkNTUyIiwKICAgICAgICAgICAgIjg1NjhjNzBjMGNjZmUwMDUxMDkyZTgxOGRhNzY5MTExYTU5ODgyY2QxOWRkNzk5ZDNiY2E1ZmZhODI3OTEwODA6YjY0M2I2MjE3NzQ4OTgzODMwYjI2YWMxNGEzNWEzMzIyZGQ1MjhjMDA5NjNlYWFkZDkxZWY1NWY1MTNkYzczZiIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChjcGF0aCkvJChidW5kbGUtaWQpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9CiAgICAgIF0sCiAgICAgICJkZXZpY2VzIjogW10sCiAgICAgICJzYW5kYm94X3BpZG5zIjogZmFsc2UsCiAgICAgICJleGVjX2NvbW1hbmRzIjogW10sCiAgICAgICJlbnZfbWFwIjogewogICAgICAgICJIT1NUTkFNRSI6ICIkKGhvc3QtbmFtZSkiLAogICAgICAgICJQQVRIIjogIi91c3IvbG9jYWwvc2JpbjovdXNyL2xvY2FsL2JpbjovdXNyL3NiaW46L3Vzci9iaW46L3NiaW46L2JpbiIKICAgICAgfQogICAgfQogIF0sCiAgImNvbW1vbiI6IHsKICAgICJjcGF0aCI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zaGFyZWQvY29udGFpbmVycyIsCiAgICAibW91bnRfc291cmNlX2NwYXRoIjogIi9ydW4va2F0YS1jb250YWluZXJzL3NoYXJlZC9jb250YWluZXJzIiwKICAgICJzZnByZWZpeCI6ICJeJChjcGF0aCkvJChidW5kbGUtaWQpLVthLXowLTldezE2fS0iLAogICAgInNwYXRoIjogIi9ydW4va2F0YS1jb250YWluZXJzL3NhbmRib3gvc3RvcmFnZSIsCiAgICAiaXB2NF9hIjogIigoWzAtOV18WzEtOV1bMC05XXwxWzAtOV17Mn18MlswLTRdWzAtOV18MjVbMC01XSlcXC4pezN9KFswLTldfFsxLTldWzAtOV18MVswLTldezJ9fDJbMC00XVswLTldfDI1WzAtNV0pIiwKICAgICJpcF9wIjogIlswLTldezEsNX0iLAogICAgInN2Y19uYW1lIjogIltBLVpfXFwuXFwtXSsiLAogICAgImRuc19sYWJlbCI6ICJbYS16QS1aMC05X1xcLlxcLV0rIiwKICAgICJzX3NvdXJjZTEiOiAiXi4uMlswLTldezN9X1swLTFdWzAtOV1fWzAtM11bMC05XV9bMC0yXVswLTldX1swLTVdWzAtOV1fWzAtNV1bMC05XVxcLlswLTldezEsMTB9JCIsCiAgICAic19zb3VyY2UyIjogIl4uLmRhdGEvIiwKICAgICJkbnNfc3ViZG9tYWluIjogIl5bYS16MC05XShbLWEtejAtOV0qW2EtejAtOV0pPyQiLAogICAgInBvZF91aWQiOiAiXlswLTlhLWZBLUZdezh9LVswLTlhLWZBLUZdezR9LVswLTlhLWZBLUZdezR9LVswLTlhLWZBLUZdezR9LVswLTlhLWZBLUZdezEyfSQiLAogICAgImRlZmF1bHRfY2FwcyI6IFsKICAgICAgIkNBUF9DSE9XTiIsCiAgICAgICJDQVBfREFDX09WRVJSSURFIiwKICAgICAgIkNBUF9GU0VUSUQiLAogICAgICAiQ0FQX0ZPV05FUiIsCiAgICAgICJDQVBfTUtOT0QiLAogICAgICAiQ0FQX05FVF9SQVciLAogICAgICAiQ0FQX1NFVEdJRCIsCiAgICAgICJDQVBfU0VUVUlEIiwKICAgICAgIkNBUF9TRVRGQ0FQIiwKICAgICAgIkNBUF9TRVRQQ0FQIiwKICAgICAgIkNBUF9ORVRfQklORF9TRVJWSUNFIiwKICAgICAgIkNBUF9TWVNfQ0hST09UIiwKICAgICAgIkNBUF9LSUxMIiwKICAgICAgIkNBUF9BVURJVF9XUklURSIKICAgIF0sCiAgICAicHJpdmlsZWdlZF9jYXBzIjogWwogICAgICAiQ0FQX0NIT1dOIiwKICAgICAgIkNBUF9EQUNfT1ZFUlJJREUiLAogICAgICAiQ0FQX0RBQ19SRUFEX1NFQVJDSCIsCiAgICAgICJDQVBfRk9XTkVSIiwKICAgICAgIkNBUF9GU0VUSUQiLAogICAgICAiQ0FQX0tJTEwiLAogICAgICAiQ0FQX1NFVEdJRCIsCiAgICAgICJDQVBfU0VUVUlEIiwKICAgICAgIkNBUF9TRVRQQ0FQIiwKICAgICAgIkNBUF9MSU5VWF9JTU1VVEFCTEUiLAogICAgICAiQ0FQX05FVF9CSU5EX1NFUlZJQ0UiLAogICAgICAiQ0FQX05FVF9CUk9BRENBU1QiLAogICAgICAiQ0FQX05FVF9BRE1JTiIsCiAgICAgICJDQVBfTkVUX1JBVyIsCiAgICAgICJDQVBfSVBDX0xPQ0siLAogICAgICAiQ0FQX0lQQ19PV05FUiIsCiAgICAgICJDQVBfU1lTX01PRFVMRSIsCiAgICAgICJDQVBfU1lTX1JBV0lPIiwKICAgICAgIkNBUF9TWVNfQ0hST09UIiwKICAgICAgIkNBUF9TWVNfUFRSQUNFIiwKICAgICAgIkNBUF9TWVNfUEFDQ1QiLAogICAgICAiQ0FQX1NZU19BRE1JTiIsCiAgICAgICJDQVBfU1lTX0JPT1QiLAogICAgICAiQ0FQX1NZU19OSUNFIiwKICAgICAgIkNBUF9TWVNfUkVTT1VSQ0UiLAogICAgICAiQ0FQX1NZU19USU1FIiwKICAgICAgIkNBUF9TWVNfVFRZX0NPTkZJRyIsCiAgICAgICJDQVBfTUtOT0QiLAogICAgICAiQ0FQX0xFQVNFIiwKICAgICAgIkNBUF9BVURJVF9XUklURSIsCiAgICAgICJDQVBfQVVESVRfQ09OVFJPTCIsCiAgICAgICJDQVBfU0VURkNBUCIsCiAgICAgICJDQVBfTUFDX09WRVJSSURFIiwKICAgICAgIkNBUF9NQUNfQURNSU4iLAogICAgICAiQ0FQX1NZU0xPRyIsCiAgICAgICJDQVBfV0FLRV9BTEFSTSIsCiAgICAgICJDQVBfQkxPQ0tfU1VTUEVORCIsCiAgICAgICJDQVBfQVVESVRfUkVBRCIsCiAgICAgICJDQVBfUEVSRk1PTiIsCiAgICAgICJDQVBfQlBGIiwKICAgICAgIkNBUF9DSEVDS1BPSU5UX1JFU1RPUkUiCiAgICBdLAogICAgInZpcnRpb19ibGtfc3RvcmFnZV9jbGFzc2VzIjogWwogICAgICAiY2MtbG9jYWwtY3NpIiwKICAgICAgImNjLW1hbmFnZWQtY3NpIiwKICAgICAgImNjLW1hbmFnZWQtcHJlbWl1bS1jc2kiCiAgICBdLAogICAgInNtYl9zdG9yYWdlX2NsYXNzZXMiOiBbCiAgICAgIHsKICAgICAgICAibmFtZSI6ICJhenVyZWZpbGUtY3NpLWthdGEtY2MiLAogICAgICAgICJtb3VudF9vcHRpb25zIjogWwogICAgICAgICAgImRpcl9tb2RlPTA3NzciLAogICAgICAgICAgImZpbGVfbW9kZT0wNzc3IiwKICAgICAgICAgICJtZnN5bWxpbmtzIiwKICAgICAgICAgICJjYWNoZT1zdHJpY3QiLAogICAgICAgICAgIm5vc2hhcmVzb2NrIiwKICAgICAgICAgICJhY3RpbWVvPTMwIiwKICAgICAgICAgICJub2JybCIKICAgICAgICBdCiAgICAgIH0KICAgIF0KICB9LAogICJzYW5kYm94IjogewogICAgInN0b3JhZ2VzIjogWwogICAgICB7CiAgICAgICAgImRyaXZlciI6ICJlcGhlbWVyYWwiLAogICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICJzb3VyY2UiOiAic2htIiwKICAgICAgICAiZnN0eXBlIjogInRtcGZzIiwKICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAibm9kZXYiLAogICAgICAgICAgIm1vZGU9MTc3NyIsCiAgICAgICAgICAic2l6ZT02NzEwODg2NCIKICAgICAgICBdLAogICAgICAgICJtb3VudF9wb2ludCI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L3NobSIsCiAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICB9CiAgICBdCiAgfSwKICAicmVxdWVzdF9kZWZhdWx0cyI6IHsKICAgICJDcmVhdGVDb250YWluZXJSZXF1ZXN0IjogewogICAgICAiYWxsb3dfZW52X3JlZ2V4IjogWwogICAgICAgICJeSE9TVE5BTUU9JChkbnNfbGFiZWwpJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9QT1JUXyQoaXBfcClfVENQPXRjcDovLyQoaXB2NF9hKTokKGlwX3ApJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9QT1JUXyQoaXBfcClfVENQX1BST1RPPXRjcCQiLAogICAgICAgICJeJChzdmNfbmFtZSlfUE9SVF8kKGlwX3ApX1RDUF9QT1JUPSQoaXBfcCkkIiwKICAgICAgICAiXiQoc3ZjX25hbWUpX1BPUlRfJChpcF9wKV9UQ1BfQUREUj0kKGlwdjRfYSkkIiwKICAgICAgICAiXiQoc3ZjX25hbWUpX1NFUlZJQ0VfSE9TVD0kKGlwdjRfYSkkIiwKICAgICAgICAiXiQoc3ZjX25hbWUpX1NFUlZJQ0VfUE9SVD0kKGlwX3ApJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9TRVJWSUNFX1BPUlRfJChkbnNfbGFiZWwpPSQoaXBfcCkkIiwKICAgICAgICAiXiQoc3ZjX25hbWUpX1BPUlQ9dGNwOi8vJChpcHY0X2EpOiQoaXBfcCkkIiwKICAgICAgICAiXkFaVVJFX0NMSUVOVF9JRD1bQS1GYS1mMC05LV0qJCIsCiAgICAgICAgIl5BWlVSRV9URU5BTlRfSUQ9W0EtRmEtZjAtOS1dKiQiLAogICAgICAgICJeQVpVUkVfRkVERVJBVEVEX1RPS0VOX0ZJTEU9L3Zhci9ydW4vc2VjcmV0cy9henVyZS90b2tlbnMvYXp1cmUtaWRlbnRpdHktdG9rZW4kIiwKICAgICAgICAiXkFaVVJFX0FVVEhPUklUWV9IT1NUPWh0dHBzOi8vbG9naW5cXC5taWNyb3NvZnRvbmxpbmVcXC5jb20vJCIsCiAgICAgICAgIl5URVJNPXh0ZXJtJCIKICAgICAgXSwKICAgICAgImFsbG93X2Vudl9yZWdleF9tYXAiOiB7CiAgICAgICAgIkNQVV9MSU1JVCI6ICJeWzAtOV0rJCIsCiAgICAgICAgIkpPQl9DT01QTEVUSU9OX0lOREVYIjogIl5bMC05XSokIiwKICAgICAgICAiTUVNT1JZX0xJTUlUIjogIl5bMC05XSskIgogICAgICB9CiAgICB9LAogICAgIkNvcHlGaWxlUmVxdWVzdCI6IFsKICAgICAgIiQoc2ZwcmVmaXgpIgogICAgXSwKICAgICJFeGVjUHJvY2Vzc1JlcXVlc3QiOiB7CiAgICAgICJhbGxvd2VkX2NvbW1hbmRzIjogW10sCiAgICAgICJyZWdleCI6IFtdCiAgICB9LAogICAgIlVwZGF0ZVJvdXRlc1JlcXVlc3QiOiB7CiAgICAgICJmb3JiaWRkZW5fZGV2aWNlX25hbWVzIjogWwogICAgICAgICJsbyIKICAgICAgXSwKICAgICAgImZvcmJpZGRlbl9zb3VyY2VfcmVnZXgiOiBbCiAgICAgICAgIl4oPzowezAsNH06KXswLDd9MHswLDN9MSQiLAogICAgICAgICJeMTI3XFwuKD86WzAtOV17MSwzfVxcLil7Mn1bMC05XXsxLDN9JCIKICAgICAgXQogICAgfSwKICAgICJVcGRhdGVJbnRlcmZhY2VSZXF1ZXN0IjogewogICAgICAiYWxsb3dfcmF3X2ZsYWdzIjogMTI4LAogICAgICAiZm9yYmlkZGVuX25hbWVzIjogWwogICAgICAgICJsbyIKICAgICAgXSwKICAgICAgImZvcmJpZGRlbl9od19hZGRycyI6IFsKICAgICAgICAiMDA6MDA6MDA6MDA6MDA6MDAiCiAgICAgIF0KICAgIH0sCiAgICAiQ2xvc2VTdGRpblJlcXVlc3QiOiBmYWxzZSwKICAgICJSZWFkU3RyZWFtUmVxdWVzdCI6IGZhbHNlLAogICAgIlVwZGF0ZUVwaGVtZXJhbE1vdW50c1JlcXVlc3QiOiBmYWxzZSwKICAgICJXcml0ZVN0cmVhbVJlcXVlc3QiOiBmYWxzZQogIH0KfQ== + spec: + runtimeClassName: kata-cc + securityContext: + runAsUser: 1000 + tolerations: + - key: node-role.kubernetes.io/control-plane + operator: Exists + effect: NoSchedule + - key: node-role.kubernetes.io/master + operator: Exists + effect: NoSchedule + containers: + - name: c + image: "mcr.microsoft.com/aks/e2e/library-busybox:master.220314.1-linux-amd64" + ports: + - containerPort: 9090 + hostPort: 9090 + name: serverport diff --git a/src/agent/samples/policy/yaml/kubernetes/fixtures/deploy-clientside.yaml b/src/agent/samples/policy/yaml/kubernetes/fixtures/deploy-clientside.yaml new file mode 100644 index 000000000000..e76793a78cc8 --- /dev/null +++ b/src/agent/samples/policy/yaml/kubernetes/fixtures/deploy-clientside.yaml @@ -0,0 +1,24 @@ +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: nginx-deployment + labels: + name: nginx +spec: + selector: + matchLabels: + name: nginx + strategy: + type: Recreate + template: + metadata: + labels: + name: nginx + annotations: + io.katacontainers.config.agent.policy: IyBDb3B5cmlnaHQgKGMpIDIwMjMgTWljcm9zb2Z0IENvcnBvcmF0aW9uCiMKIyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMAojCnBhY2thZ2UgYWdlbnRfcG9saWN5CgppbXBvcnQgZnV0dXJlLmtleXdvcmRzLmluCmltcG9ydCBmdXR1cmUua2V5d29yZHMuZXZlcnkKCiMgRGVmYXVsdCB2YWx1ZXMsIHJldHVybmVkIGJ5IE9QQSB3aGVuIHJ1bGVzIGNhbm5vdCBiZSBldmFsdWF0ZWQgdG8gdHJ1ZS4KZGVmYXVsdCBBZGRBUlBOZWlnaGJvcnNSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgQWRkU3dhcFJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBDbG9zZVN0ZGluUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IENvcHlGaWxlUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IENyZWF0ZUNvbnRhaW5lclJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBDcmVhdGVTYW5kYm94UmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IERlc3Ryb3lTYW5kYm94UmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgRXhlY1Byb2Nlc3NSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgR2V0T09NRXZlbnRSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBHdWVzdERldGFpbHNSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBMaXN0SW50ZXJmYWNlc1JlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBMaXN0Um91dGVzUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IE1lbUhvdHBsdWdCeVByb2JlUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IE9ubGluZUNQVU1lbVJlcXVlc3QgOj0gdHJ1ZQpkZWZhdWx0IFBhdXNlQ29udGFpbmVyUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFJlYWRTdHJlYW1SZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgUmVtb3ZlQ29udGFpbmVyUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgUmVtb3ZlU3RhbGVWaXJ0aW9mc1NoYXJlTW91bnRzUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgUmVzZWVkUmFuZG9tRGV2UmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFJlc3VtZUNvbnRhaW5lclJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBTZXRHdWVzdERhdGVUaW1lUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFNldFBvbGljeVJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBTaWduYWxQcm9jZXNzUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgU3RhcnRDb250YWluZXJSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBTdGFydFRyYWNpbmdSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgU3RhdHNDb250YWluZXJSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBTdG9wVHJhY2luZ1JlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBUdHlXaW5SZXNpemVSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBVcGRhdGVDb250YWluZXJSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgVXBkYXRlRXBoZW1lcmFsTW91bnRzUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFVwZGF0ZUludGVyZmFjZVJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBVcGRhdGVSb3V0ZXNSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgV2FpdFByb2Nlc3NSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBXcml0ZVN0cmVhbVJlcXVlc3QgOj0gZmFsc2UKCiMgQWxsb3dSZXF1ZXN0c0ZhaWxpbmdQb2xpY3kgOj0gdHJ1ZSBjb25maWd1cmVzIHRoZSBBZ2VudCB0byAqYWxsb3cgYW55CiMgcmVxdWVzdHMgY2F1c2luZyBhIHBvbGljeSBmYWlsdXJlKi4gVGhpcyBpcyBhbiB1bnNlY3VyZSBjb25maWd1cmF0aW9uCiMgYnV0IGlzIHVzZWZ1bCBmb3IgYWxsb3dpbmcgdW5zZWN1cmUgcG9kcyB0byBzdGFydCwgdGhlbiBjb25uZWN0IHRvCiMgdGhlbSBhbmQgaW5zcGVjdCBPUEEgbG9ncyBmb3IgdGhlIHJvb3QgY2F1c2Ugb2YgYSBmYWlsdXJlLgpkZWZhdWx0IEFsbG93UmVxdWVzdHNGYWlsaW5nUG9saWN5IDo9IGZhbHNlCgojIENvbnN0YW50cwpTX05BTUVfS0VZID0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZSIKU19OQU1FU1BBQ0VfS0VZID0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZXNwYWNlIgpCVU5ETEVfSUQgPSAiW2EtejAtOV17NjR9IgoKQ3JlYXRlQ29udGFpbmVyUmVxdWVzdDo9IHJlc3AgewogICAgbm90IGlzX251bGwoaW5wdXQuZW52X21hcCkKICAgIAogICAgaV9lbnZfbWFwIDo9IGlucHV0LmVudl9tYXAKICAgIAogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBwX2Vudl9tYXAgOj0gcF9jb250YWluZXIuZW52X21hcCAgCiAgICBhbGxvd19lbnZfbWFwKHBfZW52X21hcCwgaV9lbnZfbWFwKQogICAgCiAgICBpX3Byb2Nlc3MgOj0gaW5wdXQuYmFzZS5PQ0kuUHJvY2VzcwogICAgCiAgICBwX3Byb2Nlc3MgOj0gcF9jb250YWluZXIuT0NJLlByb2Nlc3MKICAgIAogICAgYWxsb3dfYXJncyhpX3Byb2Nlc3MsIHBfcHJvY2VzcywgaV9lbnZfbWFwKQoKICAgIHJlc3AgPSBDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uKGlucHV0LmJhc2UpCiAgICBwcmludCgiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdDogdHJ1ZSIpCn0KCmFsbG93X2FyZ3MoaV9wcm9jZXNzLCBwX3Byb2Nlc3MsIGlfZW52X21hcCkgewogICAgaV9hcmdzIDo9IGlfcHJvY2Vzcy5BcmdzCiAgICBwX2FyZ3MgOj0gcF9wcm9jZXNzLkFyZ3MKICAgIHByaW50KCJhbGxvd19hcmdzOiBpX2FyZ3MgPSIsIGlfYXJncywgInBfYXJncyA9IiwgcF9hcmdzKQogICAgY291bnQoaV9hcmdzKSA9PSBjb3VudChwX2FyZ3MpCiAgICBldmVyeSBpLCBpX2FyZyBpbiBpX2FyZ3MgewogICAgICAgIHByaW50KCJhbGxvd19hcmdzOiBpX2FyZyA9IiwgaV9hcmcpCiAgICAgICAgcF9hcmdfcmVwbGFjZWQgOj0gcmVwbGFjZV9lbnZfdmFyaWFibGVzKHBfYXJnc1tpXSwgaV9lbnZfbWFwKQogICAgICAgIHByaW50KCJhbGxvd19hcmdzOiBwX2FyZ19yZXBsYWNlZCA9IiwgcF9hcmdfcmVwbGFjZWQpCiAgICAgICAgcF9hcmdfcmVwbGFjZWQyIDo9IHJlcGxhY2UocF9hcmdfcmVwbGFjZWQsICIkJCIsICIkIikKICAgICAgICBwcmludCgiYWxsb3dfYXJnczogcF9hcmdfcmVwbGFjZWQyID0iLCBwX2FyZ19yZXBsYWNlZDIpCiAgICAgICAgaV9hcmcgPT0gcF9hcmdfcmVwbGFjZWQyCiAgICB9CiAgICBwcmludCgiYWxsb3dfYXJnczogdHJ1ZSIpCn0KCmFsbG93X2FyZ3MoaV9wcm9jZXNzLCBwX3Byb2Nlc3MsIGlfZW52X21hcCkgewogICAgbm90IGlfcHJvY2Vzcy5BcmdzCiAgICBub3QgcF9wcm9jZXNzLkFyZ3MKICAgIHByaW50KCJhbGxvd19hcmdzMjogbm8gYXJncyIpCn0KCiMgdGhpcyBmdW5jdGlvbiByZXBsYWNlcyBhbGwgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyBpbiBhIHN0cmluZywgZ2l2ZW4gYSBtYXAgb2YgZW52aXJvbm1lbnQga2V5cyB0byBlbnZpcm9ubWVudCB2YWx1ZXMKIyBlZyBzdHIgPSAiZWNobyAkKENMVVNURVJfSUQpOyBlY2hvICQoTk9ERV9OQU1FKTsiCiMgZW52X21hcCA9IHsiQ0xVU1RFUl9JRCI6ICJhYmMiLCAiTk9ERV9OQU1FIiA6ICJ4eXoifQojIHJlc3VsdCA9ICJlY2hvIGFiYzsgZWNobyB4eXo7IgpyZXBsYWNlX2Vudl92YXJpYWJsZXMoc3RyLCBlbnZfbWFwKSA9IHJlc3VsdCB7CiAgICAjIG1ha2UgYW4gYXJyYXkgb2YgdGhlIGtleXMgZWcgWyJDTFVTVEVSX0lEIiwgIk5PREVfTkFNRSJdCiAgICBrZXlzIDo9IFt4IHwgc29tZSB4IGluIG9iamVjdC5rZXlzKGVudl9tYXApXQogICAgcmVzdWx0IDo9IHJlcGxhY2Vfc3RyX3JlYyhzdHIsIGVudl9tYXAsIGtleXMsIGNvdW50KGtleXMpIC0gMSkKfQoKIyBiYXNlIGNhc2UKcmVwbGFjZV9zdHJfcmVjKHN0ciwgZW52X21hcCwgYXJyX2tleXMsIGkpID0gcmVzdWx0IHsKICAgIGkgPCAwCiAgICByZXN1bHQgOj0gc3RyCn0KCiMgcmVjdXJzaXZlIHN0ZXAKcmVwbGFjZV9zdHJfcmVjKHN0ciwgZW52X21hcCwgYXJyX2tleXMsIGkpID0gcmVzdWx0IHsKICAgIGkgPj0gMAogICAga2V5IDo9IGFycl9rZXlzW2ldCiAgICBlbnZfa2V5MSA6PSBjb25jYXQoIiIsIFsiJCgiLCBrZXksICIpIl0pCiAgICAjIHJlcGxhY2UgJChWQVIpIHdpdGggdmFsdWUKICAgIG5ld19zdHIxIDo9IHJlcGxhY2Uoc3RyLCBlbnZfa2V5MSwgZW52X21hcFtrZXldKQogICAgIyByZXBsYWNlIG5leHQgZW52aXJvbm1lbnQgdmFyaWFibGUKICAgIHJlc3VsdCA9IHJlcGxhY2Vfc3RyX3JlYyhuZXdfc3RyMSwgZW52X21hcCwgYXJyX2tleXMsIGkgLSAxKQp9CgphbGxvd19lbnZfbWFwKHBfZW52X21hcCwgaV9lbnZfbWFwKSB7CiAgICBwcmludCgiYWxsb3dfZW52X21hcDogcF9lbnZfbWFwID0iLCBwX2Vudl9tYXApCiAgICBldmVyeSBlbnZfa2V5LCBlbnZfdmFsIGluIGlfZW52X21hcCB7CiAgICAgICAgcHJpbnQoImFsbG93X2VudjogZW52X2tleSA9IiwgZW52X2tleSwgImVudl92YWwgPSIsIGVudl92YWwpCiAgICAgICAgYWxsb3dfZW52X21hcF9lbnRyeShlbnZfa2V5LCBlbnZfdmFsLCBwX2Vudl9tYXApCiAgICB9CiAgICBwcmludCgiYWxsb3dfZW52X21hcDogdHJ1ZSIpCn0KCiMgQWxsb3cgZXhhY3QgbWF0Y2gKYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBpX3ZhbCA9PSBwX3ZhbAogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnk6IHRydWUiKQp9CgojIEFsbG93IHJlc291cmNlRmllbGRSZWYgdmFsdWVzIChlLmcuLCAibGltaXRzLmNwdSIpLgphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgICMgYSB2YXJpYWJsZSB3ZSBzaG91bGQgYmUgdmFsaWRhdGluZyB1c2luZyBhIHJlZ2V4IGZyb20gc2V0dGluZ3MKICAgIHBfdmFsID09ICIkKHZhbGlkYXRlLWZyb20tc2V0dGluZ3MpIgogICAgcmVnZXhfdmFsIDo9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuQ3JlYXRlQ29udGFpbmVyUmVxdWVzdC5hbGxvd19lbnZfcmVnZXhfbWFwW2tleV0KICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4X3ZhbCwgaV92YWwpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSAyOiB0cnVlIikKfQoKIyBBbGxvdyBub2RlLW5hbWUKYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChub2RlLW5hbWUpIgogICAgcmVnZXgubWF0Y2gocG9saWN5X2RhdGEuY29tbW9uLmRuc19zdWJkb21haW4gLCBpX3ZhbCkKICAgIHByaW50KCJhbGxvd19lbnZfbWFwX2VudHJ5IDM6IHRydWUiKQp9CgojIEFsbG93IGhvc3QtbmFtZQphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgIHBfdmFsID09ICIkKGhvc3QtbmFtZSkiCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24uZG5zX2xhYmVsICwgaV92YWwpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSA0OiB0cnVlIikKfQoKIyBBbGxvdyBwb2QtdWlkCmFsbG93X2Vudl9tYXBfZW50cnkoa2V5LCBpX3ZhbCwgcF9lbnZfbWFwKSB7CiAgICBwX3ZhbCA6PSBwX2Vudl9tYXBba2V5XQogICAgcF92YWwgPT0gIiQocG9kLXVpZCkiCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24ucG9kX3VpZCAsIGlfdmFsKQogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgNTogdHJ1ZSIpCn0KCiMgQWxsb3cgZmllbGRSZWYgImZpZWxkUGF0aDogc3RhdHVzLnBvZElQIiB2YWx1ZXMuCmFsbG93X2Vudl9tYXBfZW50cnkoa2V5LCBpX3ZhbCwgcF9lbnZfbWFwKSB7CiAgICBpc19pcChpX3ZhbCkKCiAgICBwX3ZhbCA6PSBwX2Vudl9tYXBba2V5XQogICAgcF92YXIgOj0gY29uY2F0KCI9IiwgW2tleSwgcF92YWxdKQogICAgYWxsb3dfcG9kX2lwX3ZhcihrZXksIHBfdmFyKQogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgNjogdHJ1ZSIpCn0KCiMgQWxsb3cgZmllbGRSZWYgImZpZWxkUGF0aDogc3RhdHVzLmhvc3RJUCIgdmFsdWVzLgphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgaXNfaXAoaV92YWwpCgogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgIHBfdmFyIDo9IGNvbmNhdCgiPSIsIFtrZXksIHBfdmFsXSkKICAgIGFsbG93X2hvc3RfaXBfdmFyKGtleSwgcF92YXIpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSA3OiB0cnVlIikKfQoKIyBNYXRjaCBpbnB1dCB3aXRoIG9uZSBvZiB0aGUgcG9saWN5IHZhcmlhYmxlcywgYWZ0ZXIgc3Vic3RpdHV0aW5nICQoc2FuZGJveC1uYW1lKS4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChzYW5kYm94LW5hbWUpIgogICAgc19uYW1lIDo9IGlucHV0LmJhc2UuT0NJLkFubm90YXRpb25zW1NfTkFNRV9LRVldCiAgICBwX3ZhcjIgOj0gcmVwbGFjZShwX3ZhbCwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHBfdmFyMiA9PSBpX3ZhbAogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgODogdHJ1ZSIpCn0KCiMgTWF0Y2ggaW5wdXQgd2l0aCBvbmUgb2YgdGhlIHBvbGljeSB2YXJpYWJsZXMsIGFmdGVyIHN1YnN0aXR1dGluZyAkKHNhbmRib3gtbmFtZXNwYWNlKS4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChzYW5kYm94LW5hbWVzcGFjZSkiCiAgICBzX25hbWVzcGFjZSA6PSBpbnB1dC5iYXNlLk9DSS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwX3ZhcjIgOj0gcmVwbGFjZShwX3ZhbCwgIiQoc2FuZGJveC1uYW1lc3BhY2UpIiwgc19uYW1lc3BhY2UpCiAgICBwX3ZhcjIgPT0gaV92YWwKICAgIHByaW50KCJhbGxvd19lbnZfbWFwX2VudHJ5IDk6IHRydWUiKQp9CgojIEFsbG93IGlucHV0IGVudiB2YXJpYWJsZXMgdGhhdCBtYXRjaCB3aXRoIGEgcmVxdWVzdF9kZWZhdWx0cyByZWdleC4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHNvbWUgcF9yZWdleDEgaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5DcmVhdGVDb250YWluZXJSZXF1ZXN0LmFsbG93X2Vudl9yZWdleAogICAgcF9yZWdleDIgOj0gcmVwbGFjZShwX3JlZ2V4MSwgIiQoaXB2NF9hKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcHY0X2EpCiAgICBwX3JlZ2V4MyA6PSByZXBsYWNlKHBfcmVnZXgyLCAiJChpcF9wKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcF9wKQogICAgcF9yZWdleDQgOj0gcmVwbGFjZShwX3JlZ2V4MywgIiQoc3ZjX25hbWUpIiwgcG9saWN5X2RhdGEuY29tbW9uLnN2Y19uYW1lKQogICAgcF9yZWdleDUgOj0gcmVwbGFjZShwX3JlZ2V4NCwgIiQoZG5zX2xhYmVsKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5kbnNfbGFiZWwpCgogICAgcmVzdWx0IDo9IGNvbmNhdCgiPSIsIFtrZXksIGlfdmFsXSkKICAgIHJlZ2V4Lm1hdGNoKHBfcmVnZXg1LCByZXN1bHQpCgogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgMTA6IHRydWUiKQp9CgpDcmVhdGVDb250YWluZXJSZXF1ZXN0Oj0gcmVzcCB7CiAgICBub3QgaW5wdXQuZW52X21hcAogICAgaV9wcm9jZXNzID0gaW5wdXQuT0NJLlByb2Nlc3MKICAgIHNfbmFtZSA9IGlucHV0Lk9DSS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBwX3Byb2Nlc3MgPSBwX2NvbnRhaW5lci5PQ0kuUHJvY2VzcwogICAgYWxsb3dfZGVwcmVjYXRlZF9hcmdzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUpCiAgICByZXNwID0gQ3JlYXRlQ29udGFpbmVyUmVxdWVzdENvbW1vbihpbnB1dCkKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0MjogdHJ1ZSIpCn0KCkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb24ocmVxKTo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgICMgQ2hlY2sgaWYgdGhlIGlucHV0IHJlcXVlc3Qgc2hvdWxkIGJlIHJlamVjdGVkIGV2ZW4gYmVmb3JlIGNoZWNraW5nIHRoZQogICAgIyBwb2xpY3lfZGF0YS5jb250YWluZXJzIGluZm9ybWF0aW9uLgogICAgYWxsb3dfY3JlYXRlX2NvbnRhaW5lcl9pbnB1dChyZXEpCgogICAgaV9vY2kgOj0gcmVxLk9DSQogICAgaV9zdG9yYWdlcyA6PSByZXEuc3RvcmFnZXMKICAgIGlfZGV2aWNlcyA6PSByZXEuZGV2aWNlcwoKICAgICMgYXJyYXkgb2YgcG9zc2libGUgc3RhdGUgb3BlcmF0aW9ucwogICAgb3BzX2J1aWxkZXIgOj0gW10KCiAgICAjIGNoZWNrIHNhbmRib3ggbmFtZQogICAgc2FuZGJveF9uYW1lID0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FX0tFWV0KICAgIGFkZF9zYW5kYm94X25hbWVfdG9fc3RhdGUgOj0gc3RhdGVfYWxsb3dzKCJzYW5kYm94X25hbWUiLCBzYW5kYm94X25hbWUpCiAgICBvcHNfYnVpbGRlcjEgOj0gY29uY2F0X29wX2lmX25vdF9udWxsKG9wc19idWlsZGVyLCBhZGRfc2FuZGJveF9uYW1lX3RvX3N0YXRlKQoKICAgICMgQ2hlY2sgaWYgYW55IGVsZW1lbnQgZnJvbSB0aGUgcG9saWN5X2RhdGEuY29udGFpbmVycyBhcnJheSBhbGxvd3MgdGhlIGlucHV0IHJlcXVlc3QuCiAgICBzb21lIHBfY29udGFpbmVyIGluIHBvbGljeV9kYXRhLmNvbnRhaW5lcnMKICAgIHByaW50KCI9PT09PT09PSBDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiB0cnlpbmcgbmV4dCBwb2xpY3kgY29udGFpbmVyIikKCiAgICBwX3BpZG5zIDo9IHBfY29udGFpbmVyLnNhbmRib3hfcGlkbnMKICAgIGlfcGlkbnMgOj0gcmVxLnNhbmRib3hfcGlkbnMKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiBwX3BpZG5zID0iLCBwX3BpZG5zLCAiaV9waWRucyA9IiwgaV9waWRucykKICAgIHBfcGlkbnMgPT0gaV9waWRucwoKICAgIHBfb2NpIDo9IHBfY29udGFpbmVyLk9DSQoKICAgICMgY2hlY2sgbmFtZXNwYWNlCiAgICBwX25hbWVzcGFjZSA6PSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBpX25hbWVzcGFjZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwcmludCAoIkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb246IHBfbmFtZXNwYWNlID0iLCBwX25hbWVzcGFjZSwgImlfbmFtZXNwYWNlID0iLCBpX25hbWVzcGFjZSkKICAgIGFkZF9uYW1lc3BhY2VfdG9fc3RhdGUgOj0gYWxsb3dfbmFtZXNwYWNlKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkKICAgIG9wc19idWlsZGVyMiA6PSBjb25jYXRfb3BfaWZfbm90X251bGwob3BzX2J1aWxkZXIxLCBhZGRfbmFtZXNwYWNlX3RvX3N0YXRlKQoKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiBwIFZlcnNpb24gPSIsIHBfb2NpLlZlcnNpb24sICJpIFZlcnNpb24gPSIsIGlfb2NpLlZlcnNpb24pCiAgICBwX29jaS5WZXJzaW9uID09IGlfb2NpLlZlcnNpb24KCiAgICBwcmludCgiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdENvbW1vbjogcCBSZWFkb25seSA9IiwgcF9vY2kuUm9vdC5SZWFkb25seSwgImkgUmVhZG9ubHkgPSIsIGlfb2NpLlJvb3QuUmVhZG9ubHkpCiAgICBwX29jaS5Sb290LlJlYWRvbmx5ID09IGlfb2NpLlJvb3QuUmVhZG9ubHkKCiAgICBhbGxvd19hbm5vKHBfb2NpLCBpX29jaSkKCiAgICBwX3N0b3JhZ2VzIDo9IHBfY29udGFpbmVyLnN0b3JhZ2VzCiAgICBhbGxvd19ieV9hbm5vKHBfb2NpLCBpX29jaSwgcF9zdG9yYWdlcywgaV9zdG9yYWdlcykKCiAgICBwX2RldmljZXMgOj0gcF9jb250YWluZXIuZGV2aWNlcwogICAgYWxsb3dfZGV2aWNlcyhwX2RldmljZXMsIGlfZGV2aWNlcykKCiAgICByZXQgOj0gYWxsb3dfbGludXgob3BzX2J1aWxkZXIyLCBwX29jaSwgaV9vY2kpCiAgICByZXQuYWxsb3dlZAoKICAgIG9wcyA6PSByZXQub3BzCgogICAgcHJpbnQoIkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb246IHRydWUiKQp9CgphbGxvd19jcmVhdGVfY29udGFpbmVyX2lucHV0KHJlcSkgewogICAgcHJpbnQoImFsbG93X2NyZWF0ZV9jb250YWluZXJfaW5wdXQ6IGlucHV0ID0iLCByZXEpCgogICAgY291bnQocmVxLnNoYXJlZF9tb3VudHMpID09IDAKICAgIGlzX251bGwocmVxLnN0cmluZ191c2VyKQoKICAgIGlfb2NpIDo9IHJlcS5PQ0kKICAgIGlzX251bGwoaV9vY2kuSG9va3MpCiAgICBpc19udWxsKGlfb2NpLlNvbGFyaXMpCiAgICBpc19udWxsKGlfb2NpLldpbmRvd3MpCgogICAgaV9saW51eCA6PSBpX29jaS5MaW51eAogICAgY291bnQoaV9saW51eC5HSURNYXBwaW5ncykgPT0gMAogICAgY291bnQoaV9saW51eC5Nb3VudExhYmVsKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlJlc291cmNlcy5EZXZpY2VzKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlJvb3Rmc1Byb3BhZ2F0aW9uKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlVJRE1hcHBpbmdzKSA9PSAwCiAgICBpc19udWxsKGlfbGludXguSW50ZWxSZHQpCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLkJsb2NrSU8pCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLk5ldHdvcmspCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLlBpZHMpCiAgICBpc19udWxsKGlfbGludXguU2VjY29tcCkKCiAgICBpX3Byb2Nlc3MgOj0gaV9vY2kuUHJvY2VzcwogICAgY291bnQoaV9wcm9jZXNzLlNlbGludXhMYWJlbCkgPT0gMAogICAgY291bnQoaV9wcm9jZXNzLlVzZXIuVXNlcm5hbWUpID09IDAKCiAgICBwcmludCgiYWxsb3dfY3JlYXRlX2NvbnRhaW5lcl9pbnB1dDogdHJ1ZSIpCn0KCmFsbG93X25hbWVzcGFjZShwX25hbWVzcGFjZSwgaV9uYW1lc3BhY2UpID0gYWRkX25hbWVzcGFjZSB7CiAgICBwX25hbWVzcGFjZSA9PSBpX25hbWVzcGFjZQogICAgYWRkX25hbWVzcGFjZSA6PSBudWxsCiAgICBwcmludCgiYWxsb3dfbmFtZXNwYWNlIDE6IGlucHV0IG5hbWVzcGFjZSBtYXRjaGVzIHBvbGljeSBkYXRhIikKfQoKYWxsb3dfbmFtZXNwYWNlKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkgPSBhZGRfbmFtZXNwYWNlIHsKICAgIHBfbmFtZXNwYWNlID09ICIiCiAgICBwcmludCgiYWxsb3dfbmFtZXNwYWNlIDI6IG5vIG5hbWVzcGFjZSBmb3VuZCBvbiBwb2xpY3kgZGF0YSIpCiAgICBhZGRfbmFtZXNwYWNlIDo9IHN0YXRlX2FsbG93cygibmFtZXNwYWNlIiwgaV9uYW1lc3BhY2UpCn0KCiMgdmFsdWUgaGFzbid0IGJlZW4gc2VlbiBiZWZvcmUsIHNhdmUgaXQgdG8gc3RhdGUKc3RhdGVfYWxsb3dzKGtleSwgdmFsdWUpID0gYWN0aW9uIHsKICBzdGF0ZSA6PSBnZXRfc3RhdGUoKQogIHByaW50KCJzdGF0ZV9hbGxvd3MgMTogc3RhdGVba2V5XSA9Iiwgc3RhdGVba2V5XSwgInZhbHVlID0iLCB2YWx1ZSkKICBub3Qgc3RhdGVba2V5XQogIHByaW50KCJzdGF0ZV9hbGxvd3MgMTogc2F2aW5nIHRvIHN0YXRlIGtleSA9Iiwga2V5LCAidmFsdWUgPSIsIHZhbHVlKQogIHBhdGggOj0gZ2V0X3N0YXRlX3BhdGgoa2V5KSAKICBhY3Rpb24gOj0gewogICAgIm9wIjogImFkZCIsCiAgICAicGF0aCI6IHBhdGgsIAogICAgInZhbHVlIjogdmFsdWUsCiAgfQp9CgojIHZhbHVlIG1hdGNoZXMgd2hhdCdzIGluIHN0YXRlLCBhbGxvdyBpdApzdGF0ZV9hbGxvd3Moa2V5LCB2YWx1ZSkgPSBhY3Rpb24gewogIHByaW50KCJzdGF0ZV9hbGxvd3MgMjogc3RhcnQiKQogIHN0YXRlIDo9IGdldF9zdGF0ZSgpCiAgcHJpbnQoInN0YXRlX2FsbG93cyAyOiBzdGF0ZVtrZXldID0iLCBzdGF0ZVtrZXldLCAidmFsdWUgPSIsIHZhbHVlKQogIHZhbHVlID09IHN0YXRlW2tleV0KICBwcmludCgic3RhdGVfYWxsb3dzIDI6IGZvdW5kIGtleSA9Iiwga2V5LCAidmFsdWUgPSIsIHZhbHVlLCAiIGluIHN0YXRlIikKICBhY3Rpb24gOj0gbnVsbAp9CgojIGhlbHBlciBmdW5jdGlvbnMgdG8gaW50ZXJhY3Qgd2l0aCB0aGUgc3RhdGUKZ2V0X3N0YXRlKCkgPSBzdGF0ZSB7CiAgc3RhdGUgOj0gZGF0YVsicHN0YXRlIl0KfQoKZ2V0X3N0YXRlX3ZhbChrZXkpID0gdmFsdWUgewogICAgc3RhdGUgOj0gZ2V0X3N0YXRlKCkKICAgIHZhbHVlIDo9IHN0YXRlW2tleV0KfQoKZ2V0X3N0YXRlX3BhdGgoa2V5KSA9IHBhdGggewogICAgIyBwcmVwZW5kICIvcHN0YXRlLyIgdG8ga2V5CiAgICBwYXRoIDo9IGNvbmNhdCgiLyIsIFsiL3BzdGF0ZSIsIGtleV0pCn0KCiMgSGVscGVyIGZ1bmN0aW9ucyB0byBjb25kaXRpb25hbGx5IGNvbmNhdGVuYXRlIG9wIGlzIG5vdCBudWxsCmNvbmNhdF9vcF9pZl9ub3RfbnVsbChvcHMsIG9wKSA9IHJlc3VsdCB7CiAgICBvcCA9PSBudWxsCiAgICByZXN1bHQgOj0gb3BzCn0KCmNvbmNhdF9vcF9pZl9ub3RfbnVsbChvcHMsIG9wKSA9IHJlc3VsdCB7CiAgICBvcCAhPSBudWxsCiAgICByZXN1bHQgOj0gYXJyYXkuY29uY2F0KG9wcywgW29wXSkKfQoKIyBSZWplY3QgdW5leHBlY3RlZCBhbm5vdGF0aW9ucy4KYWxsb3dfYW5ubyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19hbm5vIDE6IHN0YXJ0IikKCiAgICBub3QgaV9vY2kuQW5ub3RhdGlvbnMKCiAgICBwcmludCgiYWxsb3dfYW5ubyAxOiB0cnVlIikKfQphbGxvd19hbm5vKHBfb2NpLCBpX29jaSkgewogICAgcHJpbnQoImFsbG93X2Fubm8gMjogcCBBbm5vdGF0aW9ucyA9IiwgcF9vY2kuQW5ub3RhdGlvbnMpCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiBpIEFubm90YXRpb25zID0iLCBpX29jaS5Bbm5vdGF0aW9ucykKCiAgICBpX2tleXMgOj0gb2JqZWN0LmtleXMoaV9vY2kuQW5ub3RhdGlvbnMpCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiBpIGtleXMgPSIsIGlfa2V5cykKCiAgICBldmVyeSBpX2tleSBpbiBpX2tleXMgewogICAgICAgIGFsbG93X2Fubm9fa2V5KGlfa2V5LCBwX29jaSkKICAgIH0KCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiB0cnVlIikKfQoKYWxsb3dfYW5ub19rZXkoaV9rZXksIHBfb2NpKSB7CiAgICBwcmludCgiYWxsb3dfYW5ub19rZXkgMTogaSBrZXkgPSIsIGlfa2V5KQoKICAgIHN0YXJ0c3dpdGgoaV9rZXksICJpby5rdWJlcm5ldGVzLmNyaS4iKQoKICAgIHByaW50KCJhbGxvd19hbm5vX2tleSAxOiB0cnVlIikKfQphbGxvd19hbm5vX2tleShpX2tleSwgcF9vY2kpIHsKICAgIHByaW50KCJhbGxvd19hbm5vX2tleSAyOiBpIGtleSA9IiwgaV9rZXkpCgogICAgc29tZSBwX2tleSwgXyBpbiBwX29jaS5Bbm5vdGF0aW9ucwogICAgcF9rZXkgPT0gaV9rZXkKCiAgICBwcmludCgiYWxsb3dfYW5ub19rZXkgMjogdHJ1ZSIpCn0KCiMgR2V0IHRoZSB2YWx1ZSBvZiB0aGUgU19OQU1FX0tFWSBhbm5vdGF0aW9uIGFuZAojIGNvcnJlbGF0ZSBpdCB3aXRoIG90aGVyIGFubm90YXRpb25zIGFuZCBwcm9jZXNzIGZpZWxkcy4KYWxsb3dfYnlfYW5ubyhwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpIHsKICAgIHByaW50KCJhbGxvd19ieV9hbm5vIDE6IHN0YXJ0IikKCiAgICBub3QgcF9vY2kuQW5ub3RhdGlvbnNbU19OQU1FX0tFWV0KCiAgICBpX3NfbmFtZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMTogaV9zX25hbWUgPSIsIGlfc19uYW1lKQoKICAgIGlfc19uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FU1BBQ0VfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMTogaV9zX25hbWVzcGFjZSA9IiwgaV9zX25hbWVzcGFjZSkKCiAgICBhbGxvd19ieV9zYW5kYm94X25hbWUocF9vY2ksIGlfb2NpLCBwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBpX3NfbmFtZSwgaV9zX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfYnlfYW5ubyAxOiB0cnVlIikKfQphbGxvd19ieV9hbm5vKHBfb2NpLCBpX29jaSwgcF9zdG9yYWdlcywgaV9zdG9yYWdlcykgewogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMjogc3RhcnQiKQoKICAgIHBfc19uYW1lIDo9IHBfb2NpLkFubm90YXRpb25zW1NfTkFNRV9LRVldCiAgICBpX3NfbmFtZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMjogaV9zX25hbWUgPSIsIGlfc19uYW1lLCAicF9zX25hbWUgPSIsIHBfc19uYW1lKQoKICAgIGFsbG93X3NhbmRib3hfbmFtZShwX3NfbmFtZSwgaV9zX25hbWUpCgogICAgaV9zX25hbWVzcGFjZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwcmludCgiYWxsb3dfYnlfYW5ubyAyOiBpX3NfbmFtZXNwYWNlID0iLCBpX3NfbmFtZXNwYWNlKQoKICAgIGFsbG93X2J5X3NhbmRib3hfbmFtZShwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMsIGlfc19uYW1lLCBpX3NfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd19ieV9hbm5vIDI6IHRydWUiKQp9CgphbGxvd19ieV9zYW5kYm94X25hbWUocF9vY2ksIGlfb2NpLCBwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfYnlfc2FuZGJveF9uYW1lOiBzdGFydCIpCgogICAgaV9uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FU1BBQ0VfS0VZXQoKICAgIGFsbG93X2J5X2NvbnRhaW5lcl90eXBlcyhwX29jaSwgaV9vY2ksIHNfbmFtZSwgaV9uYW1lc3BhY2UpCiAgICBhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZChwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpCiAgICBhbGxvd19wcm9jZXNzKHBfb2NpLlByb2Nlc3MsIGlfb2NpLlByb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpCgogICAgcHJpbnQoImFsbG93X2J5X3NhbmRib3hfbmFtZTogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfbmFtZShwX3NfbmFtZSwgaV9zX25hbWUpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X25hbWU6IHN0YXJ0IikKICAgIHJlZ2V4Lm1hdGNoKHBfc19uYW1lLCBpX3NfbmFtZSkKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9uYW1lOiB0cnVlIikKfQoKIyBDaGVjayB0aGF0IHRoZSAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLXR5cGUiIGFuZAojICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIiBhbm5vdGF0aW9ucyBkZXNpZ25hdGUgdGhlCiMgZXhwZWN0ZWQgdHlwZSAtIGVpdGhlciBhICJzYW5kYm94IiBvciBhICJjb250YWluZXIiLiBUaGVuLCB2YWxpZGF0ZQojIG90aGVyIGFubm90YXRpb25zIGJhc2VkIG9uIHRoZSBhY3R1YWwgInNhbmRib3giIG9yICJjb250YWluZXIiIHZhbHVlCiMgZnJvbSB0aGUgaW5wdXQgY29udGFpbmVyLgphbGxvd19ieV9jb250YWluZXJfdHlwZXMocF9vY2ksIGlfb2NpLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfYnlfY29udGFpbmVyX3R5cGVzOiBjaGVja2luZyBpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSIpCgogICAgY190eXBlIDo9ICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSIKICAgIAogICAgcF9jcmlfdHlwZSA6PSBwX29jaS5Bbm5vdGF0aW9uc1tjX3R5cGVdCiAgICBpX2NyaV90eXBlIDo9IGlfb2NpLkFubm90YXRpb25zW2NfdHlwZV0KICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZXM6IHBfY3JpX3R5cGUgPSIsIHBfY3JpX3R5cGUsICJpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgcF9jcmlfdHlwZSA9PSBpX2NyaV90eXBlCgogICAgYWxsb3dfYnlfY29udGFpbmVyX3R5cGUoaV9jcmlfdHlwZSwgcF9vY2ksIGlfb2NpLCBzX25hbWUsIHNfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZXM6IHRydWUiKQp9CgphbGxvd19ieV9jb250YWluZXJfdHlwZShpX2NyaV90eXBlLCBwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAxOiBpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgaV9jcmlfdHlwZSA9PSAic2FuZGJveCIKCiAgICBpX2thdGFfdHlwZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1siaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5jb250YWluZXJfdHlwZSJdCiAgICBwcmludCgiYWxsb3dfYnlfY29udGFpbmVyX3R5cGUgMTogaV9rYXRhX3R5cGUgPSIsIGlfa2F0YV90eXBlKQogICAgaV9rYXRhX3R5cGUgPT0gInBvZF9zYW5kYm94IgoKICAgIGFsbG93X3NhbmRib3hfY29udGFpbmVyX25hbWUocF9vY2ksIGlfb2NpKQogICAgYWxsb3dfc2FuZGJveF9uZXRfbmFtZXNwYWNlKHBfb2NpLCBpX29jaSkKICAgIGFsbG93X3NhbmRib3hfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpCgogICAgcHJpbnQoImFsbG93X2J5X2NvbnRhaW5lcl90eXBlIDE6IHRydWUiKQp9CgphbGxvd19ieV9jb250YWluZXJfdHlwZShpX2NyaV90eXBlLCBwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiBpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgaV9jcmlfdHlwZSA9PSAiY29udGFpbmVyIgoKICAgIGlfa2F0YV90eXBlIDo9IGlfb2NpLkFubm90YXRpb25zWyJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIl0KICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiBpX2thdGFfdHlwZSA9IiwgaV9rYXRhX3R5cGUpCiAgICBpX2thdGFfdHlwZSA9PSAicG9kX2NvbnRhaW5lciIKCiAgICBhbGxvd19jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpCiAgICBhbGxvd19uZXRfbmFtZXNwYWNlKHBfb2NpLCBpX29jaSkKICAgIGFsbG93X2xvZ19kaXJlY3RvcnkocF9vY2ksIGlfb2NpKQoKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiB0cnVlIikKfQoKIyAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLW5hbWUiIGFubm90YXRpb24KYWxsb3dfc2FuZGJveF9jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X2NvbnRhaW5lcl9uYW1lOiBzdGFydCIpCgogICAgY29udGFpbmVyX2Fubm90YXRpb25fbWlzc2luZyhwX29jaSwgaV9vY2ksICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItbmFtZSIpCgogICAgcHJpbnQoImFsbG93X3NhbmRib3hfY29udGFpbmVyX25hbWU6IHRydWUiKQp9CgphbGxvd19jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19jb250YWluZXJfbmFtZTogc3RhcnQiKQoKICAgIGFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uKHBfb2NpLCBpX29jaSwgImlvLmt1YmVybmV0ZXMuY3JpLmNvbnRhaW5lci1uYW1lIikKCiAgICBwcmludCgiYWxsb3dfY29udGFpbmVyX25hbWU6IHRydWUiKQp9Cgpjb250YWluZXJfYW5ub3RhdGlvbl9taXNzaW5nKHBfb2NpLCBpX29jaSwga2V5KSB7CiAgICBwcmludCgiY29udGFpbmVyX2Fubm90YXRpb25fbWlzc2luZzoiLCBrZXkpCgogICAgbm90IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIG5vdCBpX29jaS5Bbm5vdGF0aW9uc1trZXldCgogICAgcHJpbnQoImNvbnRhaW5lcl9hbm5vdGF0aW9uX21pc3Npbmc6IHRydWUiKQp9CgphbGxvd19jb250YWluZXJfYW5ub3RhdGlvbihwX29jaSwgaV9vY2ksIGtleSkgewogICAgcHJpbnQoImFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uOiBrZXkgPSIsIGtleSkKCiAgICBwX3ZhbHVlIDo9IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIGlfdmFsdWUgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgcHJpbnQoImFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uOiBwX3ZhbHVlID0iLCBwX3ZhbHVlLCAiaV92YWx1ZSA9IiwgaV92YWx1ZSkKCiAgICBwX3ZhbHVlID09IGlfdmFsdWUKCiAgICBwcmludCgiYWxsb3dfY29udGFpbmVyX2Fubm90YXRpb246IHRydWUiKQp9CgojICJuZXJkY3RsL25ldHdvcmstbmFtZXNwYWNlIiBhbm5vdGF0aW9uCmFsbG93X3NhbmRib3hfbmV0X25hbWVzcGFjZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X25ldF9uYW1lc3BhY2U6IHN0YXJ0IikKCiAgICBrZXkgOj0gIm5lcmRjdGwvbmV0d29yay1uYW1lc3BhY2UiCgogICAgcF9uYW1lc3BhY2UgOj0gcF9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgaV9uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgcHJpbnQoImFsbG93X3NhbmRib3hfbmV0X25hbWVzcGFjZTogcF9uYW1lc3BhY2UgPSIsIHBfbmFtZXNwYWNlLCAiaV9uYW1lc3BhY2UgPSIsIGlfbmFtZXNwYWNlKQoKICAgIHJlZ2V4Lm1hdGNoKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9uZXRfbmFtZXNwYWNlOiB0cnVlIikKfQoKYWxsb3dfbmV0X25hbWVzcGFjZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19uZXRfbmFtZXNwYWNlOiBzdGFydCIpCgogICAga2V5IDo9ICJuZXJkY3RsL25ldHdvcmstbmFtZXNwYWNlIgoKICAgIG5vdCBwX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICBub3QgaV9vY2kuQW5ub3RhdGlvbnNba2V5XQoKICAgIHByaW50KCJhbGxvd19uZXRfbmFtZXNwYWNlOiB0cnVlIikKfQoKIyAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1sb2ctZGlyZWN0b3J5IiBhbm5vdGF0aW9uCmFsbG93X3NhbmRib3hfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X2xvZ19kaXJlY3Rvcnk6IHN0YXJ0IikKCiAgICBrZXkgOj0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbG9nLWRpcmVjdG9yeSIKCiAgICBwX2RpciA6PSBwX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICByZWdleDEgOj0gcmVwbGFjZShwX2RpciwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHJlZ2V4MiA6PSByZXBsYWNlKHJlZ2V4MSwgIiQoc2FuZGJveC1uYW1lc3BhY2UpIiwgc19uYW1lc3BhY2UpCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiByZWdleDIgPSIsIHJlZ2V4MikKCiAgICBpX2RpciA6PSBpX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiBpX2RpciA9IiwgaV9kaXIpCgogICAgcmVnZXgubWF0Y2gocmVnZXgyLCBpX2RpcikKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiB0cnVlIikKfQoKYWxsb3dfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19sb2dfZGlyZWN0b3J5OiBzdGFydCIpCgogICAga2V5IDo9ICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWxvZy1kaXJlY3RvcnkiCgogICAgbm90IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIG5vdCBpX29jaS5Bbm5vdGF0aW9uc1trZXldCgogICAgcHJpbnQoImFsbG93X2xvZ19kaXJlY3Rvcnk6IHRydWUiKQp9CgphbGxvd19kZXZpY2VzKHBfZGV2aWNlcywgaV9kZXZpY2VzKSB7CiAgICBwcmludCgiYWxsb3dfZGV2aWNlczogc3RhcnQiKQogICAgZXZlcnkgaV9kZXZpY2UgaW4gaV9kZXZpY2VzIHsKICAgICAgICBwcmludCgiYWxsb3dfZGV2aWNlczogaV9kZXZpY2UgPSIsIGlfZGV2aWNlKQogICAgICAgIHNvbWUgcF9kZXZpY2UgaW4gcF9kZXZpY2VzCiAgICAgICAgcF9kZXZpY2UuY29udGFpbmVyX3BhdGggPT0gaV9kZXZpY2UuY29udGFpbmVyX3BhdGgKICAgIH0KICAgIHByaW50KCJhbGxvd19kZXZpY2VzOiB0cnVlIikKfQoKYWxsb3dfbGludXgoc3RhdGVfb3BzLCBwX29jaSwgaV9vY2kpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIHBfbmFtZXNwYWNlcyA6PSBwX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbGludXg6IHAgbmFtZXNwYWNlcyA9IiwgcF9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlcyA6PSBpX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbGludXg6IGkgbmFtZXNwYWNlcyA9IiwgaV9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlX3dpdGhvdXRfbmV0d29yayA6PSBbb2JqIHwgb2JqIDo9IGlfbmFtZXNwYWNlc1tfXTsgb2JqLlR5cGUgIT0gIm5ldHdvcmsiXQoKICAgIHByaW50KCJhbGxvd19saW51eDogaV9uYW1lc3BhY2Vfd2l0aG91dF9uZXR3b3JrID0iLCBpX25hbWVzcGFjZV93aXRob3V0X25ldHdvcmspCgogICAgcF9uYW1lc3BhY2VzID09IGlfbmFtZXNwYWNlX3dpdGhvdXRfbmV0d29yawoKICAgIGFsbG93X21hc2tlZF9wYXRocyhwX29jaSwgaV9vY2kpCiAgICBhbGxvd19yZWFkb25seV9wYXRocyhwX29jaSwgaV9vY2kpCiAgICBhbGxvd19saW51eF9kZXZpY2VzKHBfb2NpLkxpbnV4LkRldmljZXMsIGlfb2NpLkxpbnV4LkRldmljZXMpCiAgICBhbGxvd19saW51eF9zeXNjdGwocF9vY2kuTGludXgsIGlfb2NpLkxpbnV4KQogICAgcmV0IDo9IGFsbG93X25ldHdvcmtfbmFtZXNwYWNlX3N0YXJ0KHN0YXRlX29wcywgcF9vY2ksIGlfb2NpKQogICAgcmV0LmFsbG93ZWQKCiAgICBvcHMgOj0gcmV0Lm9wcwoKICAgIHByaW50KCJhbGxvd19saW51eDogdHJ1ZSIpCn0KCiMgUmV0cmlldmUgdGhlICJuZXR3b3JrIiBuYW1lc3BhY2UgZnJvbSB0aGUgaW5wdXQgZGF0YSBhbmQgcGFzcyBpdCBvbiBmb3IgdGhlCiMgbmV0d29yayBuYW1lc3BhY2UgcG9saWN5IGNoZWNrcy4KYWxsb3dfbmV0d29ya19uYW1lc3BhY2Vfc3RhcnQoc3RhdGVfb3BzLCBwX29jaSwgaV9vY2kpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIHByaW50KCJhbGxvd19uZXR3b3JrX25hbWVzcGFjZSBzdGFydDogc3RhcnQiKQoKICAgIHBfbmFtZXNwYWNlcyA6PSBwX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IHAgbmFtZXNwYWNlcyA9IiwgcF9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlcyA6PSBpX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IGkgbmFtZXNwYWNlcyA9IiwgaV9uYW1lc3BhY2VzKQoKICAgICMgUmV0dXJuIHBhdGggb2YgdGhlICJuZXR3b3JrIiBuYW1lc3BhY2UKICAgIG5ldHdvcmtfbnMgOj0gW29iaiB8IG9iaiA6PSBpX25hbWVzcGFjZXNbX107IG9iai5UeXBlID09ICJuZXR3b3JrIl0KCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IG5ldHdvcmtfbnMgPSIsIG5ldHdvcmtfbnMpCgogICAgcmV0IDo9IGFsbG93X25ldHdvcmtfbmFtZXNwYWNlKHN0YXRlX29wcywgbmV0d29ya19ucykKICAgIHJldC5hbGxvd2VkCgogICAgb3BzIDo9IHJldC5vcHMKfQoKIyBUaGlzIHJ1bGUgaXMgd2hlbiB0aGVyZSdzIG5vIG5ldHdvcmsgbmFtZXNwYWNlIGluIHRoZSBpbnB1dCBkYXRhLgphbGxvd19uZXR3b3JrX25hbWVzcGFjZShzdGF0ZV9vcHMsIG5ldHdvcmtfbnMpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIGNvdW50KG5ldHdvcmtfbnMpID09IDAKCiAgICBuZXR3b3JrX25zX3BhdGggPSAiIgoKICAgIGFkZF9uZXR3b3JrX25hbWVzcGFjZV90b19zdGF0ZSA6PSBzdGF0ZV9hbGxvd3MoIm5ldHdvcmtfbmFtZXNwYWNlIiwgbmV0d29ya19uc19wYXRoKQogICAgb3BzIDo9IGNvbmNhdF9vcF9pZl9ub3RfbnVsbChzdGF0ZV9vcHMsIGFkZF9uZXR3b3JrX25hbWVzcGFjZV90b19zdGF0ZSkKCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2UgMTogdHJ1ZSIpCn0KCiMgVGhpcyBydWxlIGlzIHdoZW4gdGhlcmUncyBleGFjdGx5IG9uZSBuZXR3b3JrIG5hbWVzcGFjZSBpbiB0aGUgaW5wdXQgZGF0YS4KYWxsb3dfbmV0d29ya19uYW1lc3BhY2Uoc3RhdGVfb3BzLCBuZXR3b3JrX25zKSA6PSB7Im9wcyI6IG9wcywgImFsbG93ZWQiOiB0cnVlfSB7CiAgICBjb3VudChuZXR3b3JrX25zKSA9PSAxCgogICAgYWRkX25ldHdvcmtfbmFtZXNwYWNlX3RvX3N0YXRlIDo9IHN0YXRlX2FsbG93cygibmV0d29ya19uYW1lc3BhY2UiLCBuZXR3b3JrX25zWzBdLlBhdGgpCiAgICBvcHMgOj0gY29uY2F0X29wX2lmX25vdF9udWxsKHN0YXRlX29wcywgYWRkX25ldHdvcmtfbmFtZXNwYWNlX3RvX3N0YXRlKQoKICAgIHByaW50KCJhbGxvd19uZXR3b3JrX25hbWVzcGFjZSAyOiB0cnVlIikKfQoKYWxsb3dfbWFza2VkX3BhdGhzKHBfb2NpLCBpX29jaSkgewogICAgcF9wYXRocyA6PSBwX29jaS5MaW51eC5NYXNrZWRQYXRocwogICAgcHJpbnQoImFsbG93X21hc2tlZF9wYXRocyAxOiBwX3BhdGhzID0iLCBwX3BhdGhzKQoKICAgIGlfcGF0aHMgOj0gaV9vY2kuTGludXguTWFza2VkUGF0aHMKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aHMgMTogaV9wYXRocyA9IiwgaV9wYXRocykKCiAgICBhbGxvd19tYXNrZWRfcGF0aHNfYXJyYXkocF9wYXRocywgaV9wYXRocykKCiAgICBwcmludCgiYWxsb3dfbWFza2VkX3BhdGhzIDE6IHRydWUiKQp9CmFsbG93X21hc2tlZF9wYXRocyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aHMgMjogc3RhcnQiKQoKICAgIG5vdCBwX29jaS5MaW51eC5NYXNrZWRQYXRocwogICAgbm90IGlfb2NpLkxpbnV4Lk1hc2tlZFBhdGhzCgogICAgcHJpbnQoImFsbG93X21hc2tlZF9wYXRocyAyOiB0cnVlIikKfQoKIyBBbGwgdGhlIHBvbGljeSBtYXNrZWQgcGF0aHMgbXVzdCBiZSBtYXNrZWQgaW4gdGhlIGlucHV0IGRhdGEgdG9vLgojIElucHV0IGlzIGFsbG93ZWQgdG8gaGF2ZSBtb3JlIG1hc2tlZCBwYXRocyB0aGFuIHRoZSBwb2xpY3kuCmFsbG93X21hc2tlZF9wYXRoc19hcnJheShwX2FycmF5LCBpX2FycmF5KSB7CiAgICBldmVyeSBwX2VsZW0gaW4gcF9hcnJheSB7CiAgICAgICAgYWxsb3dfbWFza2VkX3BhdGgocF9lbGVtLCBpX2FycmF5KQogICAgfQp9CgphbGxvd19tYXNrZWRfcGF0aChwX2VsZW0sIGlfYXJyYXkpIHsKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aDogcF9lbGVtID0iLCBwX2VsZW0pCgogICAgc29tZSBpX2VsZW0gaW4gaV9hcnJheQogICAgcF9lbGVtID09IGlfZWxlbQoKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aDogdHJ1ZSIpCn0KCmFsbG93X3JlYWRvbmx5X3BhdGhzKHBfb2NpLCBpX29jaSkgewogICAgcF9wYXRocyA6PSBwX29jaS5MaW51eC5SZWFkb25seVBhdGhzCiAgICBwcmludCgiYWxsb3dfcmVhZG9ubHlfcGF0aHMgMTogcF9wYXRocyA9IiwgcF9wYXRocykKCiAgICBpX3BhdGhzIDo9IGlfb2NpLkxpbnV4LlJlYWRvbmx5UGF0aHMKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAxOiBpX3BhdGhzID0iLCBpX3BhdGhzKQoKICAgIGFsbG93X3JlYWRvbmx5X3BhdGhzX2FycmF5KHBfcGF0aHMsIGlfcGF0aHMsIGlfb2NpLkxpbnV4Lk1hc2tlZFBhdGhzKQoKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAxOiB0cnVlIikKfQphbGxvd19yZWFkb25seV9wYXRocyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAyOiBzdGFydCIpCgogICAgbm90IHBfb2NpLkxpbnV4LlJlYWRvbmx5UGF0aHMKICAgIG5vdCBpX29jaS5MaW51eC5SZWFkb25seVBhdGhzCgogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGhzIDI6IHRydWUiKQp9CgojIEFsbCB0aGUgcG9saWN5IHJlYWRvbmx5IHBhdGhzIG11c3QgYmUgZWl0aGVyOgojIC0gUHJlc2VudCBpbiB0aGUgaW5wdXQgcmVhZG9ubHkgcGF0aHMsIG9yCiMgLSBQcmVzZW50IGluIHRoZSBpbnB1dCBtYXNrZWQgcGF0aHMuCiMgSW5wdXQgaXMgYWxsb3dlZCB0byBoYXZlIG1vcmUgcmVhZG9ubHkgcGF0aHMgdGhhbiB0aGUgcG9saWN5LgphbGxvd19yZWFkb25seV9wYXRoc19hcnJheShwX2FycmF5LCBpX2FycmF5LCBtYXNrZWRfcGF0aHMpIHsKICAgIGV2ZXJ5IHBfZWxlbSBpbiBwX2FycmF5IHsKICAgICAgICBhbGxvd19yZWFkb25seV9wYXRoKHBfZWxlbSwgaV9hcnJheSwgbWFza2VkX3BhdGhzKQogICAgfQp9CgphbGxvd19yZWFkb25seV9wYXRoKHBfZWxlbSwgaV9hcnJheSwgbWFza2VkX3BhdGhzKSB7CiAgICBwcmludCgiYWxsb3dfcmVhZG9ubHlfcGF0aCAxOiBwX2VsZW0gPSIsIHBfZWxlbSkKCiAgICBzb21lIGlfZWxlbSBpbiBpX2FycmF5CiAgICBwX2VsZW0gPT0gaV9lbGVtCgogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGggMTogdHJ1ZSIpCn0KYWxsb3dfcmVhZG9ubHlfcGF0aChwX2VsZW0sIGlfYXJyYXksIG1hc2tlZF9wYXRocykgewogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGggMjogcF9lbGVtID0iLCBwX2VsZW0pCgogICAgc29tZSBpX21hc2tlZCBpbiBtYXNrZWRfcGF0aHMKICAgIHBfZWxlbSA9PSBpX21hc2tlZAoKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRoIDI6IHRydWUiKQp9CgphbGxvd19saW51eF9kZXZpY2VzKHBfZGV2aWNlcywgaV9kZXZpY2VzKSB7CiAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogc3RhcnQiKQogICAgZXZlcnkgaV9kZXZpY2UgaW4gaV9kZXZpY2VzIHsKICAgICAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogaV9kZXZpY2UgPSIsIGlfZGV2aWNlKQogICAgICAgIHNvbWUgcF9kZXZpY2UgaW4gcF9kZXZpY2VzCiAgICAgICAgaV9kZXZpY2UuUGF0aCA9PSBwX2RldmljZS5QYXRoCiAgICB9CiAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogdHJ1ZSIpCn0KCmFsbG93X2xpbnV4X3N5c2N0bChwX2xpbnV4LCBpX2xpbnV4KSB7CiAgICBwcmludCgiYWxsb3dfbGludXhfc3lzY3RsIDE6IHN0YXJ0IikKICAgIG5vdCBpX2xpbnV4LlN5c2N0bAogICAgcHJpbnQoImFsbG93X2xpbnV4X3N5c2N0bCAxOiB0cnVlIikKfQoKYWxsb3dfbGludXhfc3lzY3RsKHBfbGludXgsIGlfbGludXgpIHsKICAgIHByaW50KCJhbGxvd19saW51eF9zeXNjdGwgMjogc3RhcnQiKQogICAgcF9zeXNjdGwgOj0gcF9saW51eC5TeXNjdGwKICAgIGlfc3lzY3RsIDo9IGlfbGludXguU3lzY3RsCiAgICBldmVyeSBpX25hbWUsIGlfdmFsIGluIGlfc3lzY3RsIHsKICAgICAgICBwcmludCgiYWxsb3dfbGludXhfc3lzY3RsIDI6IGlfbmFtZSA9IiwgaV9uYW1lLCAiaV92YWwgPSIsIGlfdmFsKQogICAgICAgIHBfc3lzY3RsW2lfbmFtZV0gPT0gaV92YWwKICAgIH0KICAgIHByaW50KCJhbGxvd19saW51eF9zeXNjdGwgMjogdHJ1ZSIpCn0KCiMgQ2hlY2sgdGhlIGNvbnNpc3RlbmN5IG9mIHRoZSBpbnB1dCAiaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5idW5kbGVfcGF0aCIKIyBhbmQgaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCIgdmFsdWVzIHdpdGggb3RoZXIgZmllbGRzLgphbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZChwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpIHsKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogc3RhcnQiKQoKICAgIGJ1bmRsZV9wYXRoIDo9IGlfb2NpLkFubm90YXRpb25zWyJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmJ1bmRsZV9wYXRoIl0KICAgIGJ1bmRsZV9pZCA6PSByZXBsYWNlKGJ1bmRsZV9wYXRoLCAiL3J1bi9jb250YWluZXJkL2lvLmNvbnRhaW5lcmQucnVudGltZS52Mi50YXNrL2s4cy5pby8iLCAiIikKCiAgICBidW5kbGVfaWRfZm9ybWF0IDo9IGNvbmNhdCgiIiwgWyJeIiwgQlVORExFX0lELCAiJCJdKQogICAgcmVnZXgubWF0Y2goYnVuZGxlX2lkX2Zvcm1hdCwgYnVuZGxlX2lkKQoKICAgIGtleSA6PSAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCIKCiAgICBwX3JlZ2V4IDo9IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIHNhbmRib3hfaWQgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQoKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogc2FuZGJveF9pZCA9Iiwgc2FuZGJveF9pZCwgInJlZ2V4ID0iLCBwX3JlZ2V4KQogICAgcmVnZXgubWF0Y2gocF9yZWdleCwgc2FuZGJveF9pZCkKCiAgICBhbGxvd19yb290X3BhdGgocF9vY2ksIGlfb2NpLCBidW5kbGVfaWQpCgogICAgZXZlcnkgaV9tb3VudCBpbiBpX29jaS5Nb3VudHMgewogICAgICAgIGFsbG93X21vdW50KHBfb2NpLCBpX21vdW50LCBpX3N0b3JhZ2VzLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpCiAgICB9CgogICAgYWxsb3dfc3RvcmFnZXMocF9zdG9yYWdlcywgaV9zdG9yYWdlcywgYnVuZGxlX2lkLCBzYW5kYm94X2lkKQoKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogdHJ1ZSIpCn0KCmFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHBfcHJvY2VzcyA9IiwgcF9wcm9jZXNzKQogICAgcHJpbnQoImFsbG93X3Byb2Nlc3NfY29tbW9uOiBpX3Byb2Nlc3MgPSAiLCBpX3Byb2Nlc3MpCiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHNfbmFtZSA9Iiwgc19uYW1lKQoKICAgIHBfcHJvY2Vzcy5Dd2QgPT0gaV9wcm9jZXNzLkN3ZAogICAgcF9wcm9jZXNzLk5vTmV3UHJpdmlsZWdlcyA9PSBpX3Byb2Nlc3MuTm9OZXdQcml2aWxlZ2VzCgogICAgYWxsb3dfdXNlcihwX3Byb2Nlc3MsIGlfcHJvY2VzcykKICAgIGFsbG93X2VudihwX3Byb2Nlc3MsIGlfcHJvY2Vzcywgc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHRydWUiKQp9CgojIENvbXBhcmUgdGhlIE9DSSBQcm9jZXNzIGZpZWxkIG9mIGEgcG9saWN5IGNvbnRhaW5lciB3aXRoIHRoZSBpbnB1dCBPQ0kgUHJvY2VzcyBmcm9tIGEgQ3JlYXRlQ29udGFpbmVyUmVxdWVzdAphbGxvd19wcm9jZXNzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfcHJvY2Vzczogc3RhcnQiKQoKICAgIGFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgYWxsb3dfY2FwcyhwX3Byb2Nlc3MuQ2FwYWJpbGl0aWVzLCBpX3Byb2Nlc3MuQ2FwYWJpbGl0aWVzKQogICAgcF9wcm9jZXNzLlRlcm1pbmFsID09IGlfcHJvY2Vzcy5UZXJtaW5hbAoKICAgIHByaW50KCJhbGxvd19wcm9jZXNzOiB0cnVlIikKfQoKIyBDb21wYXJlIHRoZSBPQ0kgUHJvY2VzcyBmaWVsZCBvZiBhIHBvbGljeSBjb250YWluZXIgd2l0aCB0aGUgaW5wdXQgcHJvY2VzcyBmaWVsZCBmcm9tIEV4ZWNQcm9jZXNzUmVxdWVzdAphbGxvd19pbnRlcmFjdGl2ZV9wcm9jZXNzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfaW50ZXJhY3RpdmVfcHJvY2Vzczogc3RhcnQiKQoKICAgIGFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgYWxsb3dfZXhlY19jYXBzKGlfcHJvY2Vzcy5DYXBhYmlsaXRpZXMpCgogICAgIyBUaGVzZSBhcmUgY29tbWFuZHMgZW5hYmxlZCB1c2luZyBFeGVjUHJvY2Vzc1JlcXVlc3QgY29tbWFuZHMgYW5kL29yIHJlZ2V4IGZyb20gdGhlIHNldHRpbmdzIGZpbGUuCiAgICAjIFRoZXkgY2FuIGJlIGV4ZWN1dGVkIGludGVyYWN0aXZlbHkgc28gYWxsb3cgdGhlbSB0byB1c2UgYW55IHZhbHVlIGZvciBpX3Byb2Nlc3MuVGVybWluYWwuCgogICAgcHJpbnQoImFsbG93X2ludGVyYWN0aXZlX3Byb2Nlc3M6IHRydWUiKQp9CgojIENvbXBhcmUgdGhlIE9DSSBQcm9jZXNzIGZpZWxkIG9mIGEgcG9saWN5IGNvbnRhaW5lciB3aXRoIHRoZSBpbnB1dCBwcm9jZXNzIGZpZWxkIGZyb20gRXhlY1Byb2Nlc3NSZXF1ZXN0CmFsbG93X3Byb2JlX3Byb2Nlc3MocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19wcm9iZV9wcm9jZXNzOiBzdGFydCIpCgogICAgYWxsb3dfcHJvY2Vzc19jb21tb24ocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpCiAgICBhbGxvd19leGVjX2NhcHMoaV9wcm9jZXNzLkNhcGFiaWxpdGllcykKICAgIHBfcHJvY2Vzcy5UZXJtaW5hbCA9PSBpX3Byb2Nlc3MuVGVybWluYWwKCiAgICBwcmludCgiYWxsb3dfcHJvYmVfcHJvY2VzczogdHJ1ZSIpCn0KCmFsbG93X3VzZXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MpIHsKICAgIHBfdXNlciA6PSBwX3Byb2Nlc3MuVXNlcgogICAgaV91c2VyIDo9IGlfcHJvY2Vzcy5Vc2VyCgogICAgcHJpbnQoImFsbG93X3VzZXI6IGlucHV0IHVpZCA9IiwgaV91c2VyLlVJRCwgInBvbGljeSB1aWQgPSIsIHBfdXNlci5VSUQpCiAgICBwX3VzZXIuVUlEID09IGlfdXNlci5VSUQKCiAgICAjIFRPRE86IHRyYWNrIGRvd24gdGhlIHJlYXNvbiBmb3IgcmVnaXN0cnkuazhzLmlvL3BhdXNlOjMuOSBiZWluZwogICAgIyAgICAgICBleGVjdXRlZCB3aXRoIGdpZCA9IDAgZGVzcGl0ZSBoYXZpbmcgIjY1NTM1OjY1NTM1IiBpbiBpdHMgY29udGFpbmVyIGltYWdlCiAgICAjICAgICAgIGNvbmZpZy4KICAgICNwcmludCgiYWxsb3dfdXNlcjogaW5wdXQgZ2lkID0iLCBpX3VzZXIuR0lELCAicG9saWN5IGdpZCA9IiwgcF91c2VyLkdJRCkKICAgICNwX3VzZXIuR0lEID09IGlfdXNlci5HSUQKCiAgICAjIFRPRE86IGNvbXBhcmUgdGhlIGFkZGl0aW9uYWxHaWRzIGZpZWxkIHRvbyBhZnRlciBjb21wdXRpbmcgaXRzIHZhbHVlCiAgICAjIGJhc2VkIG9uIC9ldGMvcGFzc3dkIGFuZCAvZXRjL2dyb3VwIGZyb20gdGhlIGNvbnRhaW5lciBpbWFnZS4KfQoKYWxsb3dfZGVwcmVjYXRlZF9hcmdzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZ3MgMTogbm8gYXJncyIpCgogICAgbm90IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJncwogICAgbm90IGlfcHJvY2Vzcy5BcmdzCgogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAxOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZ3MocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSkgewogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiBwb2xpY3kgYXJncyA9IiwgcF9wcm9jZXNzLkRlcHJlY2F0ZWRBcmdzKQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiBpbnB1dCBhcmdzID0iLCBpX3Byb2Nlc3MuQXJncykKCiAgICBjb3VudChwX3Byb2Nlc3MuRGVwcmVjYXRlZEFyZ3MpID09IGNvdW50KGlfcHJvY2Vzcy5BcmdzKQoKICAgIGV2ZXJ5IGksIGlfYXJnIGluIGlfcHJvY2Vzcy5BcmdzIHsKICAgICAgICBhbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpCiAgICB9CgogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDE6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgcF9hcmcyIDo9IHJlcGxhY2UocF9hcmcsICIkJCIsICIkIikKICAgIHBfYXJnMiA9PSBpX2FyZwoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAxOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDI6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgIyBUT0RPOiBjYW4gJChub2RlLW5hbWUpIGJlIGhhbmRsZWQgYmV0dGVyPwogICAgY29udGFpbnMocF9hcmcsICIkKG5vZGUtbmFtZSkiKQoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAyOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDM6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgcF9hcmcyIDo9IHJlcGxhY2UocF9hcmcsICIkJCIsICIkIikKICAgIHBfYXJnMyA6PSByZXBsYWNlKHBfYXJnMiwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAzOiBwX2FyZzMgPSIsIHBfYXJnMykKICAgIHBfYXJnMyA9PSBpX2FyZwoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAzOiB0cnVlIikKfQoKIyBPQ0kgcHJvY2Vzcy5FbnYgZmllbGQKYWxsb3dfZW52KHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfZW52OiBwIGVudiA9IiwgcF9wcm9jZXNzLkVudikKICAgIHByaW50KCJhbGxvd19lbnY6IGkgZW52ID0iLCBpX3Byb2Nlc3MuRW52KQoKICAgIGV2ZXJ5IGlfdmFyIGluIGlfcHJvY2Vzcy5FbnYgewogICAgICAgIHByaW50KCJhbGxvd19lbnY6IGlfdmFyID0iLCBpX3ZhcikKICAgICAgICBhbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgfQoKICAgIHByaW50KCJhbGxvd19lbnY6IHRydWUiKQp9CgojIEFsbG93IGlucHV0IGVudiB2YXJpYWJsZXMgdGhhdCBhcmUgcHJlc2VudCBpbiB0aGUgcG9saWN5IGRhdGEgdG9vLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHBfdmFyID09IGlfdmFyCiAgICBwcmludCgiYWxsb3dfdmFyIDE6IHRydWUiKQp9CgojIE1hdGNoIGlucHV0IHdpdGggb25lIG9mIHRoZSBwb2xpY3kgdmFyaWFibGVzLCBhZnRlciBzdWJzdGl0dXRpbmcgJChzYW5kYm94LW5hbWUpLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHByaW50KCJhbGxvd192YXIgMjogcF92YXIgPSIsIHBfdmFyKQoKICAgIHBfdmFyX3NwbGl0IDo9IHNwbGl0KHBfdmFyLCAiPSIpCiAgICBjb3VudChwX3Zhcl9zcGxpdCkgPT0gMgoKICAgIHBfdmFyX3NwbGl0WzFdID09ICIkKHNhbmRib3gtbmFtZSkiCgogICAgaV92YXJfc3BsaXQgOj0gc3BsaXQoaV92YXIsICI9IikKICAgIGNvdW50KGlfdmFyX3NwbGl0KSA9PSAyCgogICAgaV92YXJfc3BsaXRbMF0gPT0gcF92YXJfc3BsaXRbMF0KICAgIHJlZ2V4Lm1hdGNoKHNfbmFtZSwgaV92YXJfc3BsaXRbMV0pCgogICAgcHJpbnQoImFsbG93X3ZhciAyOiB0cnVlIikKfQoKIyBBbGxvdyBpbnB1dCBlbnYgdmFyaWFibGVzIHRoYXQgbWF0Y2ggd2l0aCBhIHJlcXVlc3RfZGVmYXVsdHMgcmVnZXguCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHNvbWUgcF9yZWdleDEgaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5DcmVhdGVDb250YWluZXJSZXF1ZXN0LmFsbG93X2Vudl9yZWdleAogICAgcF9yZWdleDIgOj0gcmVwbGFjZShwX3JlZ2V4MSwgIiQoaXB2NF9hKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcHY0X2EpCiAgICBwX3JlZ2V4MyA6PSByZXBsYWNlKHBfcmVnZXgyLCAiJChpcF9wKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcF9wKQogICAgcF9yZWdleDQgOj0gcmVwbGFjZShwX3JlZ2V4MywgIiQoc3ZjX25hbWUpIiwgcG9saWN5X2RhdGEuY29tbW9uLnN2Y19uYW1lKQogICAgcF9yZWdleDUgOj0gcmVwbGFjZShwX3JlZ2V4NCwgIiQoZG5zX2xhYmVsKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5kbnNfbGFiZWwpCgogICAgcHJpbnQoImFsbG93X3ZhciAzOiBwX3JlZ2V4NSA9IiwgcF9yZWdleDUpCiAgICByZWdleC5tYXRjaChwX3JlZ2V4NSwgaV92YXIpCgogICAgcHJpbnQoImFsbG93X3ZhciAzOiB0cnVlIikKfQoKIyBBbGxvdyBmaWVsZFJlZiAiZmllbGRQYXRoOiBzdGF0dXMucG9kSVAiIHZhbHVlcy4KYWxsb3dfdmFyKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBpX3Zhciwgc19uYW1lLCBzX25hbWVzcGFjZSkgewogICAgbmFtZV92YWx1ZSA6PSBzcGxpdChpX3ZhciwgIj0iKQogICAgY291bnQobmFtZV92YWx1ZSkgPT0gMgogICAgaXNfaXAobmFtZV92YWx1ZVsxXSkKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIGFsbG93X3BvZF9pcF92YXIobmFtZV92YWx1ZVswXSwgcF92YXIpCgogICAgcHJpbnQoImFsbG93X3ZhciA0OiB0cnVlIikKfQoKIyBBbGxvdyBjb21tb24gZmllbGRSZWYgdmFyaWFibGVzLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBuYW1lX3ZhbHVlIDo9IHNwbGl0KGlfdmFyLCAiPSIpCiAgICBjb3VudChuYW1lX3ZhbHVlKSA9PSAyCgogICAgc29tZSBwX3ZhciBpbiBwX3Byb2Nlc3MuRW52CiAgICBwX25hbWVfdmFsdWUgOj0gc3BsaXQocF92YXIsICI9IikKICAgIGNvdW50KHBfbmFtZV92YWx1ZSkgPT0gMgoKICAgIHBfbmFtZV92YWx1ZVswXSA9PSBuYW1lX3ZhbHVlWzBdCgogICAgIyBUT0RPOiBzaG91bGQgdGhlc2UgYmUgaGFuZGxlZCBpbiBhIGRpZmZlcmVudCB3YXk/CiAgICBhbHdheXNfYWxsb3dlZCA6PSBbIiQoaG9zdC1uYW1lKSIsICIkKG5vZGUtbmFtZSkiLCAiJChwb2QtdWlkKSJdCiAgICBzb21lIGFsbG93ZWQgaW4gYWx3YXlzX2FsbG93ZWQKICAgIGNvbnRhaW5zKHBfbmFtZV92YWx1ZVsxXSwgYWxsb3dlZCkKCiAgICBwcmludCgiYWxsb3dfdmFyIDU6IHRydWUiKQp9CgojIEFsbG93IGZpZWxkUmVmICJmaWVsZFBhdGg6IHN0YXR1cy5ob3N0SVAiIHZhbHVlcy4KYWxsb3dfdmFyKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBpX3Zhciwgc19uYW1lLCBzX25hbWVzcGFjZSkgewogICAgbmFtZV92YWx1ZSA6PSBzcGxpdChpX3ZhciwgIj0iKQogICAgY291bnQobmFtZV92YWx1ZSkgPT0gMgogICAgaXNfaXAobmFtZV92YWx1ZVsxXSkKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIGFsbG93X2hvc3RfaXBfdmFyKG5hbWVfdmFsdWVbMF0sIHBfdmFyKQoKICAgIHByaW50KCJhbGxvd192YXIgNjogdHJ1ZSIpCn0KCiMgQWxsb3cgcmVzb3VyY2VGaWVsZFJlZiB2YWx1ZXMgKGUuZy4sICJsaW1pdHMuY3B1IikuCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIG5hbWVfdmFsdWUgOj0gc3BsaXQoaV92YXIsICI9IikKICAgIGNvdW50KG5hbWVfdmFsdWUpID09IDIKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHBfbmFtZV92YWx1ZSA6PSBzcGxpdChwX3ZhciwgIj0iKQogICAgY291bnQocF9uYW1lX3ZhbHVlKSA9PSAyCgogICAgcF9uYW1lX3ZhbHVlWzBdID09IG5hbWVfdmFsdWVbMF0KCiAgICAjIGEgdmFyaWFibGUgd2Ugc2hvdWxkIGJlIHZhbGlkYXRpbmcgdXNpbmcgYSByZWdleCBmcm9tIHNldHRpbmdzCiAgICBwX25hbWVfdmFsdWVbMV0gPT0gIiQodmFsaWRhdGUtZnJvbS1zZXR0aW5ncykiCgogICAgcmVnZXhfdmFsIDo9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuQ3JlYXRlQ29udGFpbmVyUmVxdWVzdC5hbGxvd19lbnZfcmVnZXhfbWFwW25hbWVfdmFsdWVbMF1dCgogICAgcHJpbnQoImFsbG93X3ZhciA3OiB2YWwgPSIsIG5hbWVfdmFsdWVbMV0pCiAgICBwcmludCgiYWxsb3dfdmFyIDc6IHJlZ2V4X3ZhbCA9IiwgcmVnZXhfdmFsKQoKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4X3ZhbCwgbmFtZV92YWx1ZVsxXSkKCiAgICBwcmludCgiYWxsb3dfdmFyIDc6IHRydWUiKQp9CgojIE1hdGNoIGlucHV0IHdpdGggb25lIG9mIHRoZSBwb2xpY3kgdmFyaWFibGVzLCBhZnRlciBzdWJzdGl0dXRpbmcgJChzYW5kYm94LW5hbWVzcGFjZSkuCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHNvbWUgcF92YXIgaW4gcF9wcm9jZXNzLkVudgogICAgcF92YXIyIDo9IHJlcGxhY2UocF92YXIsICIkKHNhbmRib3gtbmFtZXNwYWNlKSIsIHNfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd192YXIgODogcF92YXIyID0iLCBwX3ZhcjIpCiAgICBwX3ZhcjIgPT0gaV92YXIKCiAgICBwcmludCgiYWxsb3dfdmFyIDg6IHRydWUiKQp9CgphbGxvd19wb2RfaXBfdmFyKHZhcl9uYW1lLCBwX3ZhcikgewogICAgcHJpbnQoImFsbG93X3BvZF9pcF92YXI6IHZhcl9uYW1lID0iLCB2YXJfbmFtZSwgInBfdmFyID0iLCBwX3ZhcikKCiAgICBwX25hbWVfdmFsdWUgOj0gc3BsaXQocF92YXIsICI9IikKICAgIGNvdW50KHBfbmFtZV92YWx1ZSkgPT0gMgoKICAgIHBfbmFtZV92YWx1ZVswXSA9PSB2YXJfbmFtZQogICAgcF9uYW1lX3ZhbHVlWzFdID09ICIkKHBvZC1pcCkiCgogICAgcHJpbnQoImFsbG93X3BvZF9pcF92YXI6IHRydWUiKQp9CgphbGxvd19ob3N0X2lwX3Zhcih2YXJfbmFtZSwgcF92YXIpIHsKICAgIHByaW50KCJhbGxvd19ob3N0X2lwX3ZhcjogdmFyX25hbWUgPSIsIHZhcl9uYW1lLCAicF92YXIgPSIsIHBfdmFyKQoKICAgIHBfbmFtZV92YWx1ZSA6PSBzcGxpdChwX3ZhciwgIj0iKQogICAgY291bnQocF9uYW1lX3ZhbHVlKSA9PSAyCgogICAgcF9uYW1lX3ZhbHVlWzBdID09IHZhcl9uYW1lCiAgICBwX25hbWVfdmFsdWVbMV0gPT0gIiQoaG9zdC1pcCkiCgogICAgcHJpbnQoImFsbG93X2hvc3RfaXBfdmFyOiB0cnVlIikKfQoKaXNfaXAodmFsdWUpIHsKICAgIGJ5dGVzID0gc3BsaXQodmFsdWUsICIuIikKICAgIGNvdW50KGJ5dGVzKSA9PSA0CgogICAgaXNfaXBfZmlyc3RfYnl0ZShieXRlc1swXSkKICAgIGlzX2lwX290aGVyX2J5dGUoYnl0ZXNbMV0pCiAgICBpc19pcF9vdGhlcl9ieXRlKGJ5dGVzWzJdKQogICAgaXNfaXBfb3RoZXJfYnl0ZShieXRlc1szXSkKfQppc19pcF9maXJzdF9ieXRlKGNvbXBvbmVudCkgewogICAgbnVtYmVyID0gdG9fbnVtYmVyKGNvbXBvbmVudCkKICAgIG51bWJlciA+PSAxCiAgICBudW1iZXIgPD0gMjU1Cn0KaXNfaXBfb3RoZXJfYnl0ZShjb21wb25lbnQpIHsKICAgIG51bWJlciA9IHRvX251bWJlcihjb21wb25lbnQpCiAgICBudW1iZXIgPj0gMAogICAgbnVtYmVyIDw9IDI1NQp9CgojIE9DSSByb290LlBhdGgKYWxsb3dfcm9vdF9wYXRoKHBfb2NpLCBpX29jaSwgYnVuZGxlX2lkKSB7CiAgICBpX3BhdGggOj0gaV9vY2kuUm9vdC5QYXRoCiAgICBwX3BhdGgxIDo9IHBfb2NpLlJvb3QuUGF0aAogICAgcHJpbnQoImFsbG93X3Jvb3RfcGF0aDogaV9wYXRoID0iLCBpX3BhdGgsICJwX3BhdGgxID0iLCBwX3BhdGgxKQoKICAgIHBfcGF0aDIgOj0gcmVwbGFjZShwX3BhdGgxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfcm9vdF9wYXRoOiBwX3BhdGgyID0iLCBwX3BhdGgyKQoKICAgIHBfcGF0aDMgOj0gcmVwbGFjZShwX3BhdGgyLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X3Jvb3RfcGF0aDogcF9wYXRoMyA9IiwgcF9wYXRoMykKCiAgICBwX3BhdGgzID09IGlfcGF0aAoKICAgIHByaW50KCJhbGxvd19yb290X3BhdGg6IHRydWUiKQp9CgojIGRldmljZSBtb3VudHMKYWxsb3dfbW91bnQocF9vY2ksIGlfbW91bnQsIGlfc3RvcmFnZXMsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcHJpbnQoImFsbG93X21vdW50OiBpX21vdW50ID0iLCBpX21vdW50KQoKICAgIHNvbWUgcF9tb3VudCBpbiBwX29jaS5Nb3VudHMKICAgIHNvbWUgaV9zdG9yYWdlIGluIGlfc3RvcmFnZXMKCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IHBfbW91bnQgPSIsIHBfbW91bnQpCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IGlfc3RvcmFnZSA9IiwgaV9zdG9yYWdlKQoKICAgIGNoZWNrX21vdW50KHBfbW91bnQsIGlfbW91bnQsIGlfc3RvcmFnZSwgYnVuZGxlX2lkLCBzYW5kYm94X2lkKQoKICAgICMgVE9ETzogYXJlIHRoZXJlIGFueSBvdGhlciByZXF1aXJlZCBwb2xpY3kgY2hlY2tzIGZvciBtb3VudHMgLSBlLmcuLAogICAgIyAgICAgICBtdWx0aXBsZSBtb3VudHMgd2l0aCBzYW1lIHNvdXJjZSBvciBkZXN0aW5hdGlvbj8KCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IHRydWUiKQp9CgpjaGVja19tb3VudChwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcF9tb3VudCA9PSBpX21vdW50CiAgICBwcmludCgiY2hlY2tfbW91bnQgMTogdHJ1ZSIpCn0KY2hlY2tfbW91bnQocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHBfbW91bnQuZGVzdGluYXRpb24gPT0gaV9tb3VudC5kZXN0aW5hdGlvbgogICAgcF9tb3VudC50eXBlXyA9PSBpX21vdW50LnR5cGVfCiAgICBwX21vdW50Lm9wdGlvbnMgPT0gaV9tb3VudC5vcHRpb25zCgogICAgbW91bnRfc291cmNlX2FsbG93cyhwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkKCiAgICBwcmludCgiY2hlY2tfbW91bnQgMjogdHJ1ZSIpCn0KCm1vdW50X3NvdXJjZV9hbGxvd3MocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHJlZ2V4MSA6PSBwX21vdW50LnNvdXJjZQogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5tb3VudF9zb3VyY2VfY3BhdGgpCiAgICByZWdleDQgOj0gcmVwbGFjZShyZWdleDMsICIkKGJ1bmRsZS1pZCkiLCBidW5kbGVfaWQpCgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMTogcmVnZXg0ID0iLCByZWdleDQpCiAgICByZWdleC5tYXRjaChyZWdleDQsIGlfbW91bnQuc291cmNlKQoKICAgIHByaW50KCJtb3VudF9zb3VyY2VfYWxsb3dzIDE6IHRydWUiKQp9Cm1vdW50X3NvdXJjZV9hbGxvd3MocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHJlZ2V4MSA6PSBwX21vdW50LnNvdXJjZQogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5tb3VudF9zb3VyY2VfY3BhdGgpCiAgICByZWdleDQgOj0gcmVwbGFjZShyZWdleDMsICIkKHNhbmRib3gtaWQpIiwgc2FuZGJveF9pZCkKCiAgICBwcmludCgibW91bnRfc291cmNlX2FsbG93cyAyOiByZWdleDQgPSIsIHJlZ2V4NCkKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4NCwgaV9tb3VudC5zb3VyY2UpCgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMjogdHJ1ZSIpCn0KbW91bnRfc291cmNlX2FsbG93cyhwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogaV9tb3VudC5zb3VyY2UgPSIsIGlfbW91bnQuc291cmNlKQogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogaV9zdG9yYWdlLm1vdW50X3BvaW50ID0iLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCgogICAgaV9tb3VudC5zb3VyY2UgPT0gaV9zdG9yYWdlLm1vdW50X3BvaW50CgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogdHJ1ZSIpCn0KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBDcmVhdGUgY29udGFpbmVyIFN0b3JhZ2VzCgphbGxvd19zdG9yYWdlcyhwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHBfY291bnQgOj0gY291bnQocF9zdG9yYWdlcykKICAgIGlfY291bnQgOj0gY291bnQoaV9zdG9yYWdlcykKICAgIHByaW50KCJhbGxvd19zdG9yYWdlczogcF9jb3VudCA9IiwgcF9jb3VudCwgImlfY291bnQgPSIsIGlfY291bnQpCgogICAgcF9jb3VudCA9PSBpX2NvdW50CgogICAgIyBHZXQgdGhlIGNvbnRhaW5lciBpbWFnZSBsYXllciBJRHMgYW5kIHZlcml0eSByb290IGhhc2hlcywgZnJvbSB0aGUgIm92ZXJsYXlmcyIgc3RvcmFnZS4KICAgIHNvbWUgb3ZlcmxheV9zdG9yYWdlIGluIHBfc3RvcmFnZXMKICAgIG92ZXJsYXlfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIHByaW50KCJhbGxvd19zdG9yYWdlczogb3ZlcmxheV9zdG9yYWdlID0iLCBvdmVybGF5X3N0b3JhZ2UpCiAgICBjb3VudChvdmVybGF5X3N0b3JhZ2Uub3B0aW9ucykgPT0gMgoKICAgIGxheWVyX2lkcyA6PSBzcGxpdChvdmVybGF5X3N0b3JhZ2Uub3B0aW9uc1swXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiBsYXllcl9pZHMgPSIsIGxheWVyX2lkcykKCiAgICByb290X2hhc2hlcyA6PSBzcGxpdChvdmVybGF5X3N0b3JhZ2Uub3B0aW9uc1sxXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiByb290X2hhc2hlcyA9Iiwgcm9vdF9oYXNoZXMpCgogICAgZXZlcnkgaV9zdG9yYWdlIGluIGlfc3RvcmFnZXMgewogICAgICAgIGFsbG93X3N0b3JhZ2UocF9zdG9yYWdlcywgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpCiAgICB9CgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiB0cnVlIikKfQoKYWxsb3dfc3RvcmFnZShwX3N0b3JhZ2VzLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgc29tZSBwX3N0b3JhZ2UgaW4gcF9zdG9yYWdlcwoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiBwX3N0b3JhZ2UgPSIsIHBfc3RvcmFnZSkKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiBpX3N0b3JhZ2UgPSIsIGlfc3RvcmFnZSkKCiAgICBwX3N0b3JhZ2UuZHJpdmVyICAgICAgICAgICA9PSBpX3N0b3JhZ2UuZHJpdmVyCiAgICBwX3N0b3JhZ2UuZHJpdmVyX29wdGlvbnMgICA9PSBpX3N0b3JhZ2UuZHJpdmVyX29wdGlvbnMKICAgIHBfc3RvcmFnZS5mc19ncm91cCAgICAgICAgID09IGlfc3RvcmFnZS5mc19ncm91cAogICAgcF9zdG9yYWdlLmZzdHlwZSAgICAgICAgICAgPT0gaV9zdG9yYWdlLmZzdHlwZQoKICAgIGFsbG93X3N0b3JhZ2Vfc291cmNlKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKQogICAgYWxsb3dfc3RvcmFnZV9vcHRpb25zKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKQogICAgYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKQoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiB0cnVlIikKfQoKYWxsb3dfc3RvcmFnZV9zb3VyY2UocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX3NvdXJjZSAxOiBzdGFydCIpCgogICAgcF9zdG9yYWdlLnNvdXJjZSA9PSBpX3N0b3JhZ2Uuc291cmNlCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDE6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX3NvdXJjZShwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDI6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCgogICAgIyBEREREOkJCOkRELkY6IERvbWFpbjpCdXM6RGV2aWNlLkZ1bmN0aW9uCiAgICAjIGh0dHBzOi8vd3d3Lmtlcm5lbC5vcmcvZG9jL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtYnVzLXBjaQogICAgcmVnZXgubWF0Y2goYF5bYS1mMC05XXs0fTpbYS1mMC05XXsyfTpbYS1mMC05XXsyfVwuW2EtZjAtOV0kYCwgaV9zdG9yYWdlLnNvdXJjZSkKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9zb3VyY2UgMjogdHJ1ZSIpCn0KCmFsbG93X3N0b3JhZ2Vfc291cmNlKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKSB7CiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9zb3VyY2UgMzogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIGlfc3RvcmFnZS5zb3VyY2UgPT0gIm5vbmUiCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDM6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX3NvdXJjZShwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDQ6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJzbWIiCgogICAgIyBQYXR0ZXJuOiAvLzxzdG9yYWdlLWFjY291bnQtbmFtZT4uZmlsZS5jb3JlLndpbmRvd3MubmV0LzxrOHMtUFZDLW5hbWU+CiAgICAjIFN0b3JhZ2UgYWNjb3VudCBuYW1lOiBodHRwczovL2xlYXJuLm1pY3Jvc29mdC5jb20vZW4tdXMvYXp1cmUvc3RvcmFnZS9jb21tb24vc3RvcmFnZS1hY2NvdW50LW92ZXJ2aWV3I3N0b3JhZ2UtYWNjb3VudC1uYW1lCiAgICAjIEs4cyBQVkMgbmFtZTogaHR0cHM6Ly9rdWJlcm5ldGVzLmlvL2RvY3MvY29uY2VwdHMvb3ZlcnZpZXcvd29ya2luZy13aXRoLW9iamVjdHMvbmFtZXMvI2Rucy1zdWJkb21haW4tbmFtZXMKICAgIHJlZ2V4Lm1hdGNoKGBeXC9cLyhbYS16MC05XXszLDI0fSlcLmZpbGVcLmNvcmVcLndpbmRvd3NcLm5ldFwvW2EtejAtOV0oW2EtejAtOS4tXXswLDI1MX1bYS16MC05XSk/JGAsIGlfc3RvcmFnZS5zb3VyY2UpCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDQ6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMTogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgIT0gIm92ZXJsYXlmcyIKICAgIHBfc3RvcmFnZS5vcHRpb25zID09IGlfc3RvcmFnZS5vcHRpb25zCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAxOiB0cnVlIikKfQphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIGNvdW50KHBfc3RvcmFnZS5vcHRpb25zKSA9PSAyCgogICAgcG9saWN5X2lkcyA6PSBzcGxpdChwX3N0b3JhZ2Uub3B0aW9uc1swXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBwb2xpY3lfaWRzID0iLCBwb2xpY3lfaWRzKQogICAgcG9saWN5X2lkcyA9PSBsYXllcl9pZHMKCiAgICBwb2xpY3lfaGFzaGVzIDo9IHNwbGl0KHBfc3RvcmFnZS5vcHRpb25zWzFdLCAiOiIpCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IHBvbGljeV9oYXNoZXMgPSIsIHBvbGljeV9oYXNoZXMpCgogICAgcF9jb3VudCA6PSBjb3VudChwb2xpY3lfaWRzKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBwX2NvdW50ID0iLCBwX2NvdW50KQogICAgcF9jb3VudCA+PSAxCiAgICBwX2NvdW50ID09IGNvdW50KHBvbGljeV9oYXNoZXMpCgogICAgaV9jb3VudCA6PSBjb3VudChpX3N0b3JhZ2Uub3B0aW9ucykKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogaV9jb3VudCA9IiwgaV9jb3VudCkKICAgIGlfY291bnQgPT0gcF9jb3VudCArIDMKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zWzBdID0iLCBpX3N0b3JhZ2Uub3B0aW9uc1swXSkKICAgIGlfc3RvcmFnZS5vcHRpb25zWzBdID09ICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQubGF5ZXItc3JjLXByZWZpeD0vdmFyL2xpYi9jb250YWluZXJkL2lvLmNvbnRhaW5lcmQuc25hcHNob3R0ZXIudjEudGFyZGV2L2xheWVycyIKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zW2lfY291bnQgLSAyXSA9IiwgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDJdKQogICAgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDJdID09ICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQub3ZlcmxheS1ydyIKCiAgICBsb3dlcmRpciA6PSBjb25jYXQoIj0iLCBbImxvd2VyZGlyIiwgcF9zdG9yYWdlLm9wdGlvbnNbMF1dKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBsb3dlcmRpciA9IiwgbG93ZXJkaXIpCgogICAgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDFdID09IGxvd2VyZGlyCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zW2lfY291bnQgLSAxXSA9IiwgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDFdKQoKICAgIGV2ZXJ5IGksIHBvbGljeV9pZCBpbiBwb2xpY3lfaWRzIHsKICAgICAgICBhbGxvd19vdmVybGF5X2xheWVyKHBvbGljeV9pZCwgcG9saWN5X2hhc2hlc1tpXSwgaV9zdG9yYWdlLm9wdGlvbnNbaSArIDFdKQogICAgfQoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogdHJ1ZSIpCn0KYWxsb3dfc3RvcmFnZV9vcHRpb25zKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKSB7CiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDM6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCiAgICBjb3VudChwX3N0b3JhZ2Uub3B0aW9ucykgPT0gMQoKICAgIHN0YXJ0c3dpdGgocF9zdG9yYWdlLm9wdGlvbnNbMF0sICIkKGhhc2giKQogICAgaGFzaF9zdWZmaXggOj0gdHJpbV9sZWZ0KHBfc3RvcmFnZS5vcHRpb25zWzBdLCAiJChoYXNoIikKCiAgICBlbmRzd2l0aChoYXNoX3N1ZmZpeCwgIikiKQogICAgaGFzaF9pbmRleCA6PSB0cmltX3JpZ2h0KGhhc2hfc3VmZml4LCAiKSIpCiAgICBpIDo9IHRvX251bWJlcihoYXNoX2luZGV4KQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAzOiBpID0iLCBpKQoKICAgIGhhc2hfb3B0aW9uIDo9IGNvbmNhdCgiPSIsIFsiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LnJvb3QtaGFzaCIsIHJvb3RfaGFzaGVzW2ldXSkKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMzogaGFzaF9vcHRpb24gPSIsIGhhc2hfb3B0aW9uKQoKICAgIGNvdW50KGlfc3RvcmFnZS5vcHRpb25zKSA9PSA0CiAgICBpX3N0b3JhZ2Uub3B0aW9uc1swXSA9PSAicm8iCiAgICBpX3N0b3JhZ2Uub3B0aW9uc1sxXSA9PSAiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmJsb2NrX2RldmljZT1maWxlIgogICAgaV9zdG9yYWdlLm9wdGlvbnNbMl0gPT0gImlvLmthdGFjb250YWluZXJzLmZzLW9wdC5pcy1sYXllciIKICAgIGlfc3RvcmFnZS5vcHRpb25zWzNdID09IGhhc2hfb3B0aW9uCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAzOiB0cnVlIikKfQphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgNDogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gInNtYiIKICAgIHBfb3B0c19jb3VudCA6PSBjb3VudChwX3N0b3JhZ2Uub3B0aW9ucykKICAgIGlfb3B0c19jb3VudCA6PSBjb3VudChpX3N0b3JhZ2Uub3B0aW9ucykKICAgIGlfb3B0c19jb3VudCA9PSBwX29wdHNfY291bnQgKyAyCgogICAgaV9vcHRfbWF0Y2hlcyA6PSBbaSB8IGkgOj0gaWR4OyBpZHggPCBwX29wdHNfY291bnQ7IHBfc3RvcmFnZS5vcHRpb25zW2lkeF0gPT0gaV9zdG9yYWdlLm9wdGlvbnNbaWR4XV0KICAgIGNvdW50KGlfb3B0X21hdGNoZXMpID09IHBfb3B0c19jb3VudAoKICAgIHN0YXJ0c3dpdGgoaV9zdG9yYWdlLm9wdGlvbnNbaV9vcHRzX2NvdW50LTJdLCAiYWRkcj0iKQogICAgY3JlZHMgPSBzcGxpdChpX3N0b3JhZ2Uub3B0aW9uc1tpX29wdHNfY291bnQtMV0sICIsIikKICAgIGNvdW50KGNyZWRzKSA9PSAyCiAgICBzdGFydHN3aXRoKGNyZWRzWzBdLCAidXNlcm5hbWU9IikKICAgIHN0YXJ0c3dpdGgoY3JlZHNbMV0sICJwYXNzd29yZD0iKQogICAgCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDQ6IHRydWUiKQp9CgphbGxvd19vdmVybGF5X2xheWVyKHBvbGljeV9pZCwgcG9saWN5X2hhc2gsIGlfb3B0aW9uKSB7CiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogcG9saWN5X2lkID0iLCBwb2xpY3lfaWQsICJwb2xpY3lfaGFzaCA9IiwgcG9saWN5X2hhc2gpCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogaV9vcHRpb24gPSIsIGlfb3B0aW9uKQoKICAgIHN0YXJ0c3dpdGgoaV9vcHRpb24sICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQubGF5ZXI9IikKICAgIGlfdmFsdWUgOj0gcmVwbGFjZShpX29wdGlvbiwgImlvLmthdGFjb250YWluZXJzLmZzLW9wdC5sYXllcj0iLCAiIikKICAgIGlfdmFsdWVfZGVjb2RlZCA6PSBiYXNlNjQuZGVjb2RlKGlfdmFsdWUpCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogaV92YWx1ZV9kZWNvZGVkID0iLCBpX3ZhbHVlX2RlY29kZWQpCgogICAgcG9saWN5X3N1ZmZpeCA6PSBjb25jYXQoIj0iLCBbInRhcixybyxpby5rYXRhY29udGFpbmVycy5mcy1vcHQuYmxvY2tfZGV2aWNlPWZpbGUsaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmlzLWxheWVyLGlvLmthdGFjb250YWluZXJzLmZzLW9wdC5yb290LWhhc2giLCBwb2xpY3lfaGFzaF0pCiAgICBwX3ZhbHVlIDo9IGNvbmNhdCgiLCIsIFtwb2xpY3lfaWQsIHBvbGljeV9zdWZmaXhdKQogICAgcHJpbnQoImFsbG93X292ZXJsYXlfbGF5ZXI6IHBfdmFsdWUgPSIsIHBfdmFsdWUpCgogICAgcF92YWx1ZSA9PSBpX3ZhbHVlX2RlY29kZWQKCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogdHJ1ZSIpCn0KCmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAidGFyIgoKICAgIHN0YXJ0c3dpdGgocF9zdG9yYWdlLm1vdW50X3BvaW50LCAiJChsYXllciIpCiAgICBtb3VudF9zdWZmaXggOj0gdHJpbV9sZWZ0KHBfc3RvcmFnZS5tb3VudF9wb2ludCwgIiQobGF5ZXIiKQoKICAgIGVuZHN3aXRoKG1vdW50X3N1ZmZpeCwgIikiKQogICAgbGF5ZXJfaW5kZXggOj0gdHJpbV9yaWdodChtb3VudF9zdWZmaXgsICIpIikKICAgIGkgOj0gdG9fbnVtYmVyKGxheWVyX2luZGV4KQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDE6IGkgPSIsIGkpCgogICAgbGF5ZXJfaWQgOj0gbGF5ZXJfaWRzW2ldCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMTogbGF5ZXJfaWQgPSIsIGxheWVyX2lkKQoKICAgIHBfbW91bnQgOj0gY29uY2F0KCIvIiwgWyIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L2xheWVycyIsIGxheWVyX2lkXSkKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCAxOiBwX21vdW50ID0iLCBwX21vdW50KQoKICAgIHBfbW91bnQgPT0gaV9zdG9yYWdlLm1vdW50X3BvaW50CgogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDE6IHRydWUiKQp9CmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAiZnVzZTMua2F0YS1vdmVybGF5IgoKICAgIG1vdW50MSA6PSByZXBsYWNlKHBfc3RvcmFnZS5tb3VudF9wb2ludCwgIiQoY3BhdGgpIiwgcG9saWN5X2RhdGEuY29tbW9uLmNwYXRoKQogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDI6IG1vdW50MiA9IiwgbW91bnQyKQoKICAgIG1vdW50MiA9PSBpX3N0b3JhZ2UubW91bnRfcG9pbnQKCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMjogdHJ1ZSIpCn0KYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKSB7CiAgICBwX3N0b3JhZ2UuZnN0eXBlID09ICJsb2NhbCIKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQyID0iLCBtb3VudDIpCgogICAgbW91bnQzIDo9IHJlcGxhY2UobW91bnQyLCAiJChzYW5kYm94LWlkKSIsIHNhbmRib3hfaWQpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQzID0iLCBtb3VudDMpCgogICAgcmVnZXgubWF0Y2gobW91bnQzLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCgogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDM6IHRydWUiKQp9CmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAiYmluZCIKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNDogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNDogbW91bnQyID0iLCBtb3VudDIpCgogICAgbW91bnQzIDo9IHJlcGxhY2UobW91bnQyLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDQ6IG1vdW50MyA9IiwgbW91bnQzKQoKICAgIHJlZ2V4Lm1hdGNoKG1vdW50MywgaV9zdG9yYWdlLm1vdW50X3BvaW50KQoKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA0OiB0cnVlIikKfQphbGxvd19tb3VudF9wb2ludChwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgYnVuZGxlX2lkLCBzYW5kYm94X2lkLCBsYXllcl9pZHMpIHsKICAgIHBfc3RvcmFnZS5mc3R5cGUgPT0gInRtcGZzIgoKICAgIG1vdW50MSA6PSBwX3N0b3JhZ2UubW91bnRfcG9pbnQKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA1OiBtb3VudDEgPSIsIG1vdW50MSkKCiAgICByZWdleC5tYXRjaChtb3VudDEsIGlfc3RvcmFnZS5tb3VudF9wb2ludCkKCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNTogdHJ1ZSIpCn0KYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKSB7CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogaV9zdG9yYWdlLm1vdW50X3BvaW50ID0iLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCiAgICBhbGxvd19kaXJlY3Rfdm9sX2RyaXZlcihwX3N0b3JhZ2UsIGlfc3RvcmFnZSkKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChzcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQyID0iLCBtb3VudDIpCgogICAgZGlyZWN0X3ZvbF9wYXRoIDo9IGlfc3RvcmFnZS5zb3VyY2UKICAgIG1vdW50MyA6PSByZXBsYWNlKG1vdW50MiwgIiQoYjY0LWRpcmVjdC12b2wtcGF0aCkiLCBiYXNlNjR1cmwuZW5jb2RlKGRpcmVjdF92b2xfcGF0aCkpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQzID0iLCBtb3VudDMpCgogICAgbW91bnQzID09IGlfc3RvcmFnZS5tb3VudF9wb2ludAoKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA2OiB0cnVlIikKfQoKYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIocF9zdG9yYWdlLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19kaXJlY3Rfdm9sX2RyaXZlciAxOiBzdGFydCIpCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCiAgICBwcmludCgiYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIgMTogdHJ1ZSIpCn0KYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIocF9zdG9yYWdlLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19kaXJlY3Rfdm9sX2RyaXZlciAyOiBzdGFydCIpCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJzbWIiCiAgICBwcmludCgiYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIgMjogdHJ1ZSIpCn0KCiMgRXhlY1Byb2Nlc3NSZXF1ZXN0LnByb2Nlc3MuQ2FwYWJpbGl0aWVzCmFsbG93X2V4ZWNfY2FwcyhpX2NhcHMpIHsKICAgIG5vdCBpX2NhcHMuQW1iaWVudAogICAgbm90IGlfY2Fwcy5Cb3VuZGluZwogICAgbm90IGlfY2Fwcy5FZmZlY3RpdmUKICAgIG5vdCBpX2NhcHMuSW5oZXJpdGFibGUKICAgIG5vdCBpX2NhcHMuUGVybWl0dGVkCn0KCiMgT0NJLlByb2Nlc3MuQ2FwYWJpbGl0aWVzCmFsbG93X2NhcHMocF9jYXBzLCBpX2NhcHMpIHsKICAgIHByaW50KCJhbGxvd19jYXBzOiBwb2xpY3kgQW1iaWVudCA9IiwgcF9jYXBzLkFtYmllbnQpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgQW1iaWVudCA9IiwgaV9jYXBzLkFtYmllbnQpCiAgICBtYXRjaF9jYXBzKHBfY2Fwcy5BbWJpZW50LCBpX2NhcHMuQW1iaWVudCkKCiAgICBwcmludCgiYWxsb3dfY2FwczogcG9saWN5IEJvdW5kaW5nID0iLCBwX2NhcHMuQm91bmRpbmcpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgQm91bmRpbmcgPSIsIGlfY2Fwcy5Cb3VuZGluZykKICAgIG1hdGNoX2NhcHMocF9jYXBzLkJvdW5kaW5nLCBpX2NhcHMuQm91bmRpbmcpCgogICAgcHJpbnQoImFsbG93X2NhcHM6IHBvbGljeSBFZmZlY3RpdmUgPSIsIHBfY2Fwcy5FZmZlY3RpdmUpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgRWZmZWN0aXZlID0iLCBpX2NhcHMuRWZmZWN0aXZlKQogICAgbWF0Y2hfY2FwcyhwX2NhcHMuRWZmZWN0aXZlLCBpX2NhcHMuRWZmZWN0aXZlKQoKICAgIHByaW50KCJhbGxvd19jYXBzOiBwb2xpY3kgSW5oZXJpdGFibGUgPSIsIHBfY2Fwcy5Jbmhlcml0YWJsZSkKICAgIHByaW50KCJhbGxvd19jYXBzOiBpbnB1dCBJbmhlcml0YWJsZSA9IiwgaV9jYXBzLkluaGVyaXRhYmxlKQogICAgbWF0Y2hfY2FwcyhwX2NhcHMuSW5oZXJpdGFibGUsIGlfY2Fwcy5Jbmhlcml0YWJsZSkKCiAgICBwcmludCgiYWxsb3dfY2FwczogcG9saWN5IFBlcm1pdHRlZCA9IiwgcF9jYXBzLlBlcm1pdHRlZCkKICAgIHByaW50KCJhbGxvd19jYXBzOiBpbnB1dCBQZXJtaXR0ZWQgPSIsIGlfY2Fwcy5QZXJtaXR0ZWQpCiAgICBtYXRjaF9jYXBzKHBfY2Fwcy5QZXJtaXR0ZWQsIGlfY2Fwcy5QZXJtaXR0ZWQpCn0KCm1hdGNoX2NhcHMocF9jYXBzLCBpX2NhcHMpIHsKICAgIHByaW50KCJtYXRjaF9jYXBzIDE6IHN0YXJ0IikKCiAgICBwX2NhcHMgPT0gaV9jYXBzCgogICAgcHJpbnQoIm1hdGNoX2NhcHMgMTogdHJ1ZSIpCn0KbWF0Y2hfY2FwcyhwX2NhcHMsIGlfY2FwcykgewogICAgcHJpbnQoIm1hdGNoX2NhcHMgMjogc3RhcnQiKQoKICAgIGNvdW50KHBfY2FwcykgPT0gMQogICAgcF9jYXBzWzBdID09ICIkKGRlZmF1bHRfY2FwcykiCgogICAgcHJpbnQoIm1hdGNoX2NhcHMgMjogZGVmYXVsdF9jYXBzID0iLCBwb2xpY3lfZGF0YS5jb21tb24uZGVmYXVsdF9jYXBzKQogICAgcG9saWN5X2RhdGEuY29tbW9uLmRlZmF1bHRfY2FwcyA9PSBpX2NhcHMKCiAgICBwcmludCgibWF0Y2hfY2FwcyAyOiB0cnVlIikKfQptYXRjaF9jYXBzKHBfY2FwcywgaV9jYXBzKSB7CiAgICBwcmludCgibWF0Y2hfY2FwcyAzOiBzdGFydCIpCgogICAgY291bnQocF9jYXBzKSA9PSAxCiAgICBwX2NhcHNbMF0gPT0gIiQocHJpdmlsZWdlZF9jYXBzKSIKCiAgICBwcmludCgibWF0Y2hfY2FwcyAzOiBwcml2aWxlZ2VkX2NhcHMgPSIsIHBvbGljeV9kYXRhLmNvbW1vbi5wcml2aWxlZ2VkX2NhcHMpCiAgICBwb2xpY3lfZGF0YS5jb21tb24ucHJpdmlsZWdlZF9jYXBzID09IGlfY2FwcwoKICAgIHByaW50KCJtYXRjaF9jYXBzIDM6IHRydWUiKQp9CgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgpjaGVja19kaXJlY3RvcnlfdHJhdmVyc2FsKGlfcGF0aCkgewogICAgbm90IHJlZ2V4Lm1hdGNoKCIoXnwvKS4uKCR8LykiLCBpX3BhdGgpCn0KCmNoZWNrX3N5bWxpbmtfc291cmNlKGlfc3JjKSB7CiAgICBpX3NyYyA9PSAiIgogICAgcHJpbnQoImNoZWNrX3N5bWxpbmtfc291cmNlIDE6IHRydWUiKQp9CmNoZWNrX3N5bWxpbmtfc291cmNlKGlfc3JjKSB7CiAgICBpX3NyYyAhPSAiIgogICAgcHJpbnQoImNoZWNrX3N5bWxpbmtfc291cmNlIDI6IGlfc3JjID0iLCBpX3NyYykKCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24uc19zb3VyY2UxLCBpX3NyYykKCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMjogdHJ1ZSIpCn0KY2hlY2tfc3ltbGlua19zb3VyY2UoaV9zcmMpIHsKICAgIGlfc3JjICE9ICIiCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMzogaV9zcmMgPSIsIGlfc3JjKQoKICAgIHJlZ2V4Lm1hdGNoKHBvbGljeV9kYXRhLmNvbW1vbi5zX3NvdXJjZTIsIGlfc3JjKQogICAgY2hlY2tfZGlyZWN0b3J5X3RyYXZlcnNhbChpX3NyYykKCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMzogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfc3RvcmFnZXMoaV9zdG9yYWdlcykgewogICAgcHJpbnQoImFsbG93X3NhbmRib3hfc3RvcmFnZXM6IGlfc3RvcmFnZXMgPSIsIGlfc3RvcmFnZXMpCgogICAgcF9zdG9yYWdlcyA6PSBwb2xpY3lfZGF0YS5zYW5kYm94LnN0b3JhZ2VzCiAgICBldmVyeSBpX3N0b3JhZ2UgaW4gaV9zdG9yYWdlcyB7CiAgICAgICAgYWxsb3dfc2FuZGJveF9zdG9yYWdlKHBfc3RvcmFnZXMsIGlfc3RvcmFnZSkKICAgIH0KCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9zdG9yYWdlczogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfc3RvcmFnZShwX3N0b3JhZ2VzLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IGlfc3RvcmFnZSA9IiwgaV9zdG9yYWdlKQoKICAgIHNvbWUgcF9zdG9yYWdlIGluIHBfc3RvcmFnZXMKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IHBfc3RvcmFnZSA9IiwgcF9zdG9yYWdlKQogICAgaV9zdG9yYWdlID09IHBfc3RvcmFnZQoKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IHRydWUiKQp9CgpDb3B5RmlsZVJlcXVlc3QgewogICAgcHJpbnQoIkNvcHlGaWxlUmVxdWVzdDogaW5wdXQucGF0aCA9IiwgaW5wdXQucGF0aCkKCiAgICBjaGVja19zeW1saW5rX3NvdXJjZShpbnB1dC5zeW1saW5rX3NyYykKICAgIGNoZWNrX2RpcmVjdG9yeV90cmF2ZXJzYWwoaW5wdXQucGF0aCkKCiAgICBzb21lIHJlZ2V4MSBpbiBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLkNvcHlGaWxlUmVxdWVzdAogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5jcGF0aCkKICAgIHJlZ2V4NCA6PSByZXBsYWNlKHJlZ2V4MywgIiQoYnVuZGxlLWlkKSIsIEJVTkRMRV9JRCkKICAgIHByaW50KCJDb3B5RmlsZVJlcXVlc3Q6IHJlZ2V4NCA9IiwgcmVnZXg0KQoKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4NCwgaW5wdXQucGF0aCkKCiAgICBwcmludCgiQ29weUZpbGVSZXF1ZXN0OiB0cnVlIikKfQoKQ3JlYXRlU2FuZGJveFJlcXVlc3QgewogICAgcHJpbnQoIkNyZWF0ZVNhbmRib3hSZXF1ZXN0OiBpbnB1dC5ndWVzdF9ob29rX3BhdGggPSIsIGlucHV0Lmd1ZXN0X2hvb2tfcGF0aCkKICAgIGNvdW50KGlucHV0Lmd1ZXN0X2hvb2tfcGF0aCkgPT0gMAoKICAgIHByaW50KCJDcmVhdGVTYW5kYm94UmVxdWVzdDogaW5wdXQua2VybmVsX21vZHVsZXMgPSIsIGlucHV0Lmtlcm5lbF9tb2R1bGVzKQogICAgY291bnQoaW5wdXQua2VybmVsX21vZHVsZXMpID09IDAKCiAgICBpX3BpZG5zIDo9IGlucHV0LnNhbmRib3hfcGlkbnMKICAgIHByaW50KCJDcmVhdGVTYW5kYm94UmVxdWVzdDogaV9waWRucyA9IiwgaV9waWRucykKICAgIGlfcGlkbnMgPT0gZmFsc2UKICAgIGFsbG93X3NhbmRib3hfc3RvcmFnZXMoaW5wdXQuc3RvcmFnZXMpCn0KCmFsbG93X2V4ZWMocF9jb250YWluZXIsIGlfcHJvY2VzcykgewogICAgcHJpbnQoImFsbG93X2V4ZWM6IHN0YXJ0IikKCiAgICBwX29jaSA9IHBfY29udGFpbmVyLk9DSQogICAgcF9zX25hbWUgPSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc19uYW1lc3BhY2UgPSBnZXRfc3RhdGVfdmFsKCJuYW1lc3BhY2UiKQogICAgYWxsb3dfcHJvYmVfcHJvY2VzcyhwX29jaS5Qcm9jZXNzLCBpX3Byb2Nlc3MsIHBfc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfZXhlYzogdHJ1ZSIpCn0KCmFsbG93X2ludGVyYWN0aXZlX2V4ZWMocF9jb250YWluZXIsIGlfcHJvY2VzcykgewogICAgcHJpbnQoImFsbG93X2ludGVyYWN0aXZlX2V4ZWM6IHN0YXJ0IikKCiAgICBwX29jaSA9IHBfY29udGFpbmVyLk9DSQogICAgcF9zX25hbWUgPSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc19uYW1lc3BhY2UgPSBnZXRfc3RhdGVfdmFsKCJuYW1lc3BhY2UiKQogICAgYWxsb3dfaW50ZXJhY3RpdmVfcHJvY2VzcyhwX29jaS5Qcm9jZXNzLCBpX3Byb2Nlc3MsIHBfc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfaW50ZXJhY3RpdmVfZXhlYzogdHJ1ZSIpCn0KCiMgVE9ETzogc2hvdWxkIG90aGVyIEV4ZWNQcm9jZXNzUmVxdWVzdCBpbnB1dCBkYXRhIGZpZWxkcyBiZSB2YWxpZGF0ZWQgYXMgd2VsbD8KRXhlY1Byb2Nlc3NSZXF1ZXN0IHsKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMTogaW5wdXQgPSIsIGlucHV0KQoKICAgIHNvbWUgcF9jb21tYW5kIGluIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuRXhlY1Byb2Nlc3NSZXF1ZXN0LmFsbG93ZWRfY29tbWFuZHMKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMTogcF9jb21tYW5kID0iLCBwX2NvbW1hbmQpCiAgICBwX2NvbW1hbmQgPT0gaW5wdXQucHJvY2Vzcy5BcmdzCgogICAgIyBUT0RPOiBtYXRjaCBwX2NvbnRhaW5lcidzIElEIHdpdGggdGhlIGlucHV0IGNvbnRhaW5lcl9pZC4KICAgIHNvbWUgcF9jb250YWluZXIgaW4gcG9saWN5X2RhdGEuY29udGFpbmVycwogICAgYWxsb3dfaW50ZXJhY3RpdmVfZXhlYyhwX2NvbnRhaW5lciwgaW5wdXQucHJvY2VzcykKCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDE6IHRydWUiKQp9CkV4ZWNQcm9jZXNzUmVxdWVzdCB7CiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDI6IGlucHV0ID0iLCBpbnB1dCkKCiAgICAjIFRPRE86IG1hdGNoIGlucHV0IGNvbnRhaW5lciBJRCB3aXRoIGl0cyBjb3JyZXNwb25kaW5nIGNvbnRhaW5lci5leGVjX2NvbW1hbmRzLgogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBzb21lIHBfY29tbWFuZCBpbiBwX2NvbnRhaW5lci5leGVjX2NvbW1hbmRzCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDI6IHBfY29tbWFuZCA9IiwgcF9jb21tYW5kKQoKICAgICMgVE9ETzogc2hvdWxkIG90aGVyIGlucHV0IGRhdGEgZmllbGRzIGJlIHZhbGlkYXRlZCBhcyB3ZWxsPwogICAgcF9jb21tYW5kID09IGlucHV0LnByb2Nlc3MuQXJncwoKICAgIGFsbG93X2V4ZWMocF9jb250YWluZXIsIGlucHV0LnByb2Nlc3MpCgogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAyOiB0cnVlIikKfQpFeGVjUHJvY2Vzc1JlcXVlc3QgewogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAzOiBpbnB1dCA9IiwgaW5wdXQpCgogICAgaV9jb21tYW5kID0gY29uY2F0KCIgIiwgaW5wdXQucHJvY2Vzcy5BcmdzKQogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAzOiBpX2NvbW1hbmQgPSIsIGlfY29tbWFuZCkKCiAgICBzb21lIHBfcmVnZXggaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5FeGVjUHJvY2Vzc1JlcXVlc3QucmVnZXgKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMzogcF9yZWdleCA9IiwgcF9yZWdleCkKCiAgICByZWdleC5tYXRjaChwX3JlZ2V4LCBpX2NvbW1hbmQpCgogICAgIyBUT0RPOiBtYXRjaCBwX2NvbnRhaW5lcidzIElEIHdpdGggdGhlIGlucHV0IGNvbnRhaW5lcl9pZC4KICAgIHNvbWUgcF9jb250YWluZXIgaW4gcG9saWN5X2RhdGEuY29udGFpbmVycwogICAgYWxsb3dfaW50ZXJhY3RpdmVfZXhlYyhwX2NvbnRhaW5lciwgaW5wdXQucHJvY2VzcykKCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDM6IHRydWUiKQp9CgpVcGRhdGVSb3V0ZXNSZXF1ZXN0IHsKICAgIHByaW50KCJVcGRhdGVSb3V0ZXNSZXF1ZXN0OiBpbnB1dCA9IiwgaW5wdXQpCiAgICBwcmludCgiVXBkYXRlUm91dGVzUmVxdWVzdDogcG9saWN5ID0iLCBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLlVwZGF0ZVJvdXRlc1JlcXVlc3QpCgogICAgaV9yb3V0ZXMgOj0gaW5wdXQucm91dGVzLlJvdXRlcwogICAgcF9zb3VyY2VfcmVnZXggPSBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLlVwZGF0ZVJvdXRlc1JlcXVlc3QuZm9yYmlkZGVuX3NvdXJjZV9yZWdleAogICAgcF9uYW1lcyA9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuVXBkYXRlUm91dGVzUmVxdWVzdC5mb3JiaWRkZW5fZGV2aWNlX25hbWVzCgogICAgZXZlcnkgaV9yb3V0ZSBpbiBpX3JvdXRlcyB7CiAgICAgICAgcHJpbnQoImlfcm91dGUuc291cmNlID0iLCBpX3JvdXRlLnNvdXJjZSkKICAgICAgICBldmVyeSBwX3JlZ2V4IGluIHBfc291cmNlX3JlZ2V4IHsKICAgICAgICAgICAgcHJpbnQoInBfcmVnZXggPSIsIHBfcmVnZXgpCiAgICAgICAgICAgIG5vdCByZWdleC5tYXRjaChwX3JlZ2V4LCBpX3JvdXRlLnNvdXJjZSkKICAgICAgICB9CgogICAgICAgIHByaW50KCJpX3JvdXRlLmRldmljZSA9IiwgaV9yb3V0ZS5kZXZpY2UpCiAgICAgICAgbm90IGlfcm91dGUuZGV2aWNlIGluIHBfbmFtZXMKICAgIH0KCiAgICBwcmludCgiVXBkYXRlUm91dGVzUmVxdWVzdDogdHJ1ZSIpCn0KClVwZGF0ZUludGVyZmFjZVJlcXVlc3QgewogICAgcHJpbnQoIlVwZGF0ZUludGVyZmFjZVJlcXVlc3Q6IGlucHV0ID0iLCBpbnB1dCkKICAgIHByaW50KCJVcGRhdGVJbnRlcmZhY2VSZXF1ZXN0OiBwb2xpY3kgPSIsIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuVXBkYXRlSW50ZXJmYWNlUmVxdWVzdCkKCiAgICBpX2ludGVyZmFjZSA6PSBpbnB1dC5pbnRlcmZhY2UKICAgIHBfZmxhZ3MgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmFsbG93X3Jhd19mbGFncwoKICAgICMgVHlwaWNhbGx5LCBqdXN0IElGRl9OT0FSUCBpcyB1c2VkLgogICAgYml0cy5hbmQoaV9pbnRlcmZhY2UucmF3X2ZsYWdzLCBiaXRzLm5lZ2F0ZShwX2ZsYWdzKSkgPT0gMAoKICAgIHBfbmFtZXMgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmZvcmJpZGRlbl9uYW1lcwoKICAgIG5vdCBpX2ludGVyZmFjZS5uYW1lIGluIHBfbmFtZXMKCiAgICBwX2h3YWRkcnMgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmZvcmJpZGRlbl9od19hZGRycwoKICAgIG5vdCBpX2ludGVyZmFjZS5od0FkZHIgaW4gcF9od2FkZHJzCgogICAgcHJpbnQoIlVwZGF0ZUludGVyZmFjZVJlcXVlc3Q6IHRydWUiKQp9CgpDbG9zZVN0ZGluUmVxdWVzdCB7CiAgICBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLkNsb3NlU3RkaW5SZXF1ZXN0ID09IHRydWUKfQoKUmVhZFN0cmVhbVJlcXVlc3QgewogICAgcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5SZWFkU3RyZWFtUmVxdWVzdCA9PSB0cnVlCn0KClVwZGF0ZUVwaGVtZXJhbE1vdW50c1JlcXVlc3QgewogICAgcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVFcGhlbWVyYWxNb3VudHNSZXF1ZXN0ID09IHRydWUKfQoKV3JpdGVTdHJlYW1SZXF1ZXN0IHsKICAgIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuV3JpdGVTdHJlYW1SZXF1ZXN0ID09IHRydWUKfQoKcG9saWN5X2RhdGEgOj0gewogICJjb250YWluZXJzIjogWwogICAgewogICAgICAiT0NJIjogewogICAgICAgICJWZXJzaW9uIjogIjEuMS4wLXJjLjEiLAogICAgICAgICJQcm9jZXNzIjogewogICAgICAgICAgIlRlcm1pbmFsIjogZmFsc2UsCiAgICAgICAgICAiVXNlciI6IHsKICAgICAgICAgICAgIlVJRCI6IDY1NTM1LAogICAgICAgICAgICAiR0lEIjogNjU1MzUsCiAgICAgICAgICAgICJBZGRpdGlvbmFsR2lkcyI6IFtdLAogICAgICAgICAgICAiVXNlcm5hbWUiOiAiIgogICAgICAgICAgfSwKICAgICAgICAgICJEZXByZWNhdGVkQXJncyI6IFsKICAgICAgICAgICAgIi9wYXVzZSIKICAgICAgICAgIF0sCiAgICAgICAgICAiQXJncyI6IFsKICAgICAgICAgICAgIi9wYXVzZSIKICAgICAgICAgIF0sCiAgICAgICAgICAiRW52IjogWwogICAgICAgICAgICAiUEFUSD0vdXNyL2xvY2FsL3NiaW46L3Vzci9sb2NhbC9iaW46L3Vzci9zYmluOi91c3IvYmluOi9zYmluOi9iaW4iCiAgICAgICAgICBdLAogICAgICAgICAgIkN3ZCI6ICIvIiwKICAgICAgICAgICJDYXBhYmlsaXRpZXMiOiB7CiAgICAgICAgICAgICJBbWJpZW50IjogW10sCiAgICAgICAgICAgICJCb3VuZGluZyI6IFsKICAgICAgICAgICAgICAiJChkZWZhdWx0X2NhcHMpIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiRWZmZWN0aXZlIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJJbmhlcml0YWJsZSI6IFtdLAogICAgICAgICAgICAiUGVybWl0dGVkIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICAiTm9OZXdQcml2aWxlZ2VzIjogdHJ1ZQogICAgICAgIH0sCiAgICAgICAgIlJvb3QiOiB7CiAgICAgICAgICAiUGF0aCI6ICIkKGNwYXRoKS8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgIlJlYWRvbmx5IjogdHJ1ZQogICAgICAgIH0sCiAgICAgICAgIk1vdW50cyI6IFsKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9wcm9jIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJwcm9jIiwKICAgICAgICAgICAgInR5cGVfIjogInByb2MiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2IiwKICAgICAgICAgICAgInNvdXJjZSI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJzdHJpY3RhdGltZSIsCiAgICAgICAgICAgICAgIm1vZGU9NzU1IiwKICAgICAgICAgICAgICAic2l6ZT02NTUzNmsiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L3B0cyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiZGV2cHRzIiwKICAgICAgICAgICAgInR5cGVfIjogImRldnB0cyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJuZXdpbnN0YW5jZSIsCiAgICAgICAgICAgICAgInB0bXhtb2RlPTA2NjYiLAogICAgICAgICAgICAgICJtb2RlPTA2MjAiLAogICAgICAgICAgICAgICJnaWQ9NSIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvc2htIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L3NobSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi9tcXVldWUiLAogICAgICAgICAgICAic291cmNlIjogIm1xdWV1ZSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJtcXVldWUiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvc3lzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJzeXNmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJzeXNmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2V0Yy9yZXNvbHYuY29uZiIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClyZXNvbHYuY29uZiQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJvIiwKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9kZXYiLAogICAgICAgICAgICAgICJub2V4ZWMiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0KICAgICAgICBdLAogICAgICAgICJBbm5vdGF0aW9ucyI6IHsKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmJ1bmRsZV9wYXRoIjogIi9ydW4vY29udGFpbmVyZC9pby5jb250YWluZXJkLnJ1bnRpbWUudjIudGFzay9rOHMuaW8vJChidW5kbGUtaWQpIiwKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIjogInBvZF9zYW5kYm94IiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSI6ICJzYW5kYm94IiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWlkIjogIl5bYS16MC05XXs2NH0kIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWxvZy1kaXJlY3RvcnkiOiAiXi92YXIvbG9nL3BvZHMvJChzYW5kYm94LW5hbWVzcGFjZSlfJChzYW5kYm94LW5hbWUpX1swLTlhLWZdezh9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezEyfSQiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZXNwYWNlIjogIiIsCiAgICAgICAgICAibmVyZGN0bC9uZXR3b3JrLW5hbWVzcGFjZSI6ICJeL3Zhci9ydW4vbmV0bnMvY25pLVswLTlhLWZdezh9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezEyfSQiCiAgICAgICAgfSwKICAgICAgICAiTGludXgiOiB7CiAgICAgICAgICAiTmFtZXNwYWNlcyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICJUeXBlIjogImlwYyIsCiAgICAgICAgICAgICAgIlBhdGgiOiAiIgogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgIlR5cGUiOiAidXRzIiwKICAgICAgICAgICAgICAiUGF0aCI6ICIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiVHlwZSI6ICJtb3VudCIsCiAgICAgICAgICAgICAgIlBhdGgiOiAiIgogICAgICAgICAgICB9CiAgICAgICAgICBdLAogICAgICAgICAgIk1hc2tlZFBhdGhzIjogWwogICAgICAgICAgICAiL3Byb2MvYWNwaSIsCiAgICAgICAgICAgICIvcHJvYy9hc291bmQiLAogICAgICAgICAgICAiL3Byb2Mva2NvcmUiLAogICAgICAgICAgICAiL3Byb2Mva2V5cyIsCiAgICAgICAgICAgICIvcHJvYy9sYXRlbmN5X3N0YXRzIiwKICAgICAgICAgICAgIi9wcm9jL3RpbWVyX2xpc3QiLAogICAgICAgICAgICAiL3Byb2MvdGltZXJfc3RhdHMiLAogICAgICAgICAgICAiL3Byb2Mvc2NoZWRfZGVidWciLAogICAgICAgICAgICAiL3N5cy9maXJtd2FyZSIsCiAgICAgICAgICAgICIvcHJvYy9zY3NpIgogICAgICAgICAgXSwKICAgICAgICAgICJSZWFkb25seVBhdGhzIjogWwogICAgICAgICAgICAiL3Byb2MvYnVzIiwKICAgICAgICAgICAgIi9wcm9jL2ZzIiwKICAgICAgICAgICAgIi9wcm9jL2lycSIsCiAgICAgICAgICAgICIvcHJvYy9zeXMiLAogICAgICAgICAgICAiL3Byb2Mvc3lzcnEtdHJpZ2dlciIKICAgICAgICAgIF0sCiAgICAgICAgICAiRGV2aWNlcyI6IFtdLAogICAgICAgICAgIlN5c2N0bCI6IHsKICAgICAgICAgICAgIm5ldC5pcHY0LmlwX3VucHJpdmlsZWdlZF9wb3J0X3N0YXJ0IjogIjAiLAogICAgICAgICAgICAibmV0LmlwdjQucGluZ19ncm91cF9yYW5nZSI6ICIwIDIxNDc0ODM2NDciCiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9LAogICAgICAic3RvcmFnZXMiOiBbCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJibGsiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogInRhciIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIiQoaGFzaDApIgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGxheWVyMCkiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJvdmVybGF5ZnMiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogImZ1c2UzLmthdGEtb3ZlcmxheSIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIjVhNWFhZDgwMDU1ZmYyMDAxMmE1MGRjMjVmOGRmN2EyOTkyNDQ3NDMyNGQ2NWY3ZDUzMDZlZThlZTI3ZmY3MWQiLAogICAgICAgICAgICAiODE3MjUwZjFhM2UzMzZkYTc2ZjViZDNmYTc4NGUxYjI2ZDk1OWI5YzEzMTg3NjgxNWJhMjYwNDA0OGI3MGMxOCIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChjcGF0aCkvJChidW5kbGUtaWQpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9CiAgICAgIF0sCiAgICAgICJkZXZpY2VzIjogW10sCiAgICAgICJzYW5kYm94X3BpZG5zIjogZmFsc2UsCiAgICAgICJleGVjX2NvbW1hbmRzIjogW10sCiAgICAgICJlbnZfbWFwIjogewogICAgICAgICJQQVRIIjogIi91c3IvbG9jYWwvc2JpbjovdXNyL2xvY2FsL2JpbjovdXNyL3NiaW46L3Vzci9iaW46L3NiaW46L2JpbiIKICAgICAgfQogICAgfSwKICAgIHsKICAgICAgIk9DSSI6IHsKICAgICAgICAiVmVyc2lvbiI6ICIxLjEuMC1yYy4xIiwKICAgICAgICAiUHJvY2VzcyI6IHsKICAgICAgICAgICJUZXJtaW5hbCI6IGZhbHNlLAogICAgICAgICAgIlVzZXIiOiB7CiAgICAgICAgICAgICJVSUQiOiAwLAogICAgICAgICAgICAiR0lEIjogMCwKICAgICAgICAgICAgIkFkZGl0aW9uYWxHaWRzIjogW10sCiAgICAgICAgICAgICJVc2VybmFtZSI6ICIiCiAgICAgICAgICB9LAogICAgICAgICAgIkRlcHJlY2F0ZWRBcmdzIjogWwogICAgICAgICAgICAibmdpbngiLAogICAgICAgICAgICAiLWciLAogICAgICAgICAgICAiZGFlbW9uIG9mZjsiCiAgICAgICAgICBdLAogICAgICAgICAgIkFyZ3MiOiBbCiAgICAgICAgICAgICJuZ2lueCIsCiAgICAgICAgICAgICItZyIsCiAgICAgICAgICAgICJkYWVtb24gb2ZmOyIKICAgICAgICAgIF0sCiAgICAgICAgICAiRW52IjogWwogICAgICAgICAgICAiUEFUSD0vdXNyL2xvY2FsL3NiaW46L3Vzci9sb2NhbC9iaW46L3Vzci9zYmluOi91c3IvYmluOi9zYmluOi9iaW4iLAogICAgICAgICAgICAiSE9TVE5BTUU9JChob3N0LW5hbWUpIgogICAgICAgICAgXSwKICAgICAgICAgICJDd2QiOiAiLyIsCiAgICAgICAgICAiQ2FwYWJpbGl0aWVzIjogewogICAgICAgICAgICAiQW1iaWVudCI6IFtdLAogICAgICAgICAgICAiQm91bmRpbmciOiBbCiAgICAgICAgICAgICAgIiQoZGVmYXVsdF9jYXBzKSIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgIkVmZmVjdGl2ZSI6IFsKICAgICAgICAgICAgICAiJChkZWZhdWx0X2NhcHMpIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiSW5oZXJpdGFibGUiOiBbXSwKICAgICAgICAgICAgIlBlcm1pdHRlZCI6IFsKICAgICAgICAgICAgICAiJChkZWZhdWx0X2NhcHMpIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgIk5vTmV3UHJpdmlsZWdlcyI6IGZhbHNlCiAgICAgICAgfSwKICAgICAgICAiUm9vdCI6IHsKICAgICAgICAgICJQYXRoIjogIiQoY3BhdGgpLyQoYnVuZGxlLWlkKSIsCiAgICAgICAgICAiUmVhZG9ubHkiOiBmYWxzZQogICAgICAgIH0sCiAgICAgICAgIk1vdW50cyI6IFsKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9wcm9jIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJwcm9jIiwKICAgICAgICAgICAgInR5cGVfIjogInByb2MiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2IiwKICAgICAgICAgICAgInNvdXJjZSI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJzdHJpY3RhdGltZSIsCiAgICAgICAgICAgICAgIm1vZGU9NzU1IiwKICAgICAgICAgICAgICAic2l6ZT02NTUzNmsiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L3B0cyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiZGV2cHRzIiwKICAgICAgICAgICAgInR5cGVfIjogImRldnB0cyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJuZXdpbnN0YW5jZSIsCiAgICAgICAgICAgICAgInB0bXhtb2RlPTA2NjYiLAogICAgICAgICAgICAgICJtb2RlPTA2MjAiLAogICAgICAgICAgICAgICJnaWQ9NSIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvc2htIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L3NobSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi9tcXVldWUiLAogICAgICAgICAgICAic291cmNlIjogIm1xdWV1ZSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJtcXVldWUiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvc3lzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJzeXNmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJzeXNmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL3N5cy9mcy9jZ3JvdXAiLAogICAgICAgICAgICAic291cmNlIjogImNncm91cCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJjZ3JvdXAiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiLAogICAgICAgICAgICAgICJyZWxhdGltZSIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2V0Yy9ob3N0cyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClob3N0cyQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicnciCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L3Rlcm1pbmF0aW9uLWxvZyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeCl0ZXJtaW5hdGlvbi1sb2ckIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJ3IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2V0Yy9ob3N0bmFtZSIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClob3N0bmFtZSQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicnciCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZXRjL3Jlc29sdi5jb25mIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KXJlc29sdi5jb25mJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJydyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi92YXIvcnVuL3NlY3JldHMva3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudCIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClzZXJ2aWNlYWNjb3VudCQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicm8iCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvdmFyL3J1bi9zZWNyZXRzL2F6dXJlL3Rva2VucyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeCl0b2tlbnMkIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9CiAgICAgICAgXSwKICAgICAgICAiQW5ub3RhdGlvbnMiOiB7CiAgICAgICAgICAiaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5idW5kbGVfcGF0aCI6ICIvcnVuL2NvbnRhaW5lcmQvaW8uY29udGFpbmVyZC5ydW50aW1lLnYyLnRhc2svazhzLmlvLyQoYnVuZGxlLWlkKSIsCiAgICAgICAgICAiaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5jb250YWluZXJfdHlwZSI6ICJwb2RfY29udGFpbmVyIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItbmFtZSI6ICJuZ2lueCIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLXR5cGUiOiAiY29udGFpbmVyIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5pbWFnZS1uYW1lIjogIm1hcmluZXJjb25mcG9kc3Rlc3QuYXp1cmVjci5pby9henVyZWxpbnV4L2Jhc2Uvbmdpbng6MS4yNSIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCI6ICJeW2EtejAtOV17NjR9JCIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1uYW1lc3BhY2UiOiAiIgogICAgICAgIH0sCiAgICAgICAgIkxpbnV4IjogewogICAgICAgICAgIk5hbWVzcGFjZXMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiVHlwZSI6ICJpcGMiLAogICAgICAgICAgICAgICJQYXRoIjogIiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJUeXBlIjogInV0cyIsCiAgICAgICAgICAgICAgIlBhdGgiOiAiIgogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgIlR5cGUiOiAibW91bnQiLAogICAgICAgICAgICAgICJQYXRoIjogIiIKICAgICAgICAgICAgfQogICAgICAgICAgXSwKICAgICAgICAgICJNYXNrZWRQYXRocyI6IFsKICAgICAgICAgICAgIi9wcm9jL2FjcGkiLAogICAgICAgICAgICAiL3Byb2Mva2NvcmUiLAogICAgICAgICAgICAiL3Byb2Mva2V5cyIsCiAgICAgICAgICAgICIvcHJvYy9sYXRlbmN5X3N0YXRzIiwKICAgICAgICAgICAgIi9wcm9jL3RpbWVyX2xpc3QiLAogICAgICAgICAgICAiL3Byb2MvdGltZXJfc3RhdHMiLAogICAgICAgICAgICAiL3Byb2Mvc2NoZWRfZGVidWciLAogICAgICAgICAgICAiL3Byb2Mvc2NzaSIsCiAgICAgICAgICAgICIvc3lzL2Zpcm13YXJlIgogICAgICAgICAgXSwKICAgICAgICAgICJSZWFkb25seVBhdGhzIjogWwogICAgICAgICAgICAiL3Byb2MvYXNvdW5kIiwKICAgICAgICAgICAgIi9wcm9jL2J1cyIsCiAgICAgICAgICAgICIvcHJvYy9mcyIsCiAgICAgICAgICAgICIvcHJvYy9pcnEiLAogICAgICAgICAgICAiL3Byb2Mvc3lzIiwKICAgICAgICAgICAgIi9wcm9jL3N5c3JxLXRyaWdnZXIiCiAgICAgICAgICBdLAogICAgICAgICAgIkRldmljZXMiOiBbXSwKICAgICAgICAgICJTeXNjdGwiOiB7CiAgICAgICAgICAgICJuZXQuaXB2NC5pcF91bnByaXZpbGVnZWRfcG9ydF9zdGFydCI6ICIwIiwKICAgICAgICAgICAgIm5ldC5pcHY0LnBpbmdfZ3JvdXBfcmFuZ2UiOiAiMCAyMTQ3NDgzNjQ3IgogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSwKICAgICAgInN0b3JhZ2VzIjogWwogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2gwKSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjApIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2gxKSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjEpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2gyKSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjIpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2gzKSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjMpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2g0KSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjQpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAib3ZlcmxheWZzIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJmdXNlMy5rYXRhLW92ZXJsYXkiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICI4YmZiYmE3Njk2NjM2NTI0MDRhNjRhMjNhN2VlYWI3OTQzOGRhZWQ3MWFjY2YzMjlhNDBhNGY2OGVmYWYwZmY0OjhjYzdhZmJjZGQwNGYxN2FmZjhmNmQ0OTM1ZTRmNTRhMWY1YWRkNDdkY2E1MTZlOGQzNTQ1M2YxZjQyMTgxNjc6OTAzMGU2MGFhOGQ4YWI5YzI3ZjA1MWUyYzc4NWE1NDlkOGFlYzE4ODgxNjk5ZWFiMzIwYTA0MDlmN2ZkYmUzOTozNmFmOWMwODE0NmU2ZDI1MWQ1MTNlNTllNWExYzYyZDYyY2ZiOWViZTg1NmQ3NTM5NGJlZmRkZWNlNzQ4NGMxOjAxNjVhMGMwNzg2NTc3NWRlYTgzYTQ1MTdjMTI1ZmYzMGMxZTJjMWEwOThlN2NiY2U3YmNhZmUyYjcxOTljYmMiLAogICAgICAgICAgICAiMjQ5ZWY1NWZjZDQxMWM1YTgwNTRhYmI2MGU3MTUxMTVkNTk5ZWJiZTY4MmQ2Yjc0YmUzYmQxOTI3MjQ4ODVjMTo1MDJiNTM3MjAxYzcxMTVlZjBkMTcxNTMwYzdjZjVjMGU1MTE3NTRlOWM5NWYwNTk0MWVjMjdkMTVjOWUwMTk4OjQ4YWExMThmZGZkYTlhMzAzODdlOTBlMDY2MWYyYjViNmM4ZTg3MzU0ZDFmYTlhMzdiZjU4NTEzYWMzZTQ1MTI6OWY2MjU0NjRjN2IzNGE1NTM2ZjQzMWY1ZDI5NDYzNDNkMjcyNTgwZTM2NDQ2ZGRiMTJiMDQwMTYyZTU0M2NlMTpkNDQ5MWVhMTg4NzEwNWVmMDYwMWY0ZTVmYTM5ODNmZmU1N2Q3YTU3ZWU4ZjZiMDM3MDkxZjQyMThjMWE2MzU4IgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGNwYXRoKS8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0KICAgICAgXSwKICAgICAgImRldmljZXMiOiBbXSwKICAgICAgInNhbmRib3hfcGlkbnMiOiBmYWxzZSwKICAgICAgImV4ZWNfY29tbWFuZHMiOiBbXSwKICAgICAgImVudl9tYXAiOiB7CiAgICAgICAgIkhPU1ROQU1FIjogIiQoaG9zdC1uYW1lKSIsCiAgICAgICAgIlBBVEgiOiAiL3Vzci9sb2NhbC9zYmluOi91c3IvbG9jYWwvYmluOi91c3Ivc2JpbjovdXNyL2Jpbjovc2JpbjovYmluIgogICAgICB9CiAgICB9CiAgXSwKICAiY29tbW9uIjogewogICAgImNwYXRoIjogIi9ydW4va2F0YS1jb250YWluZXJzL3NoYXJlZC9jb250YWluZXJzIiwKICAgICJtb3VudF9zb3VyY2VfY3BhdGgiOiAiL3J1bi9rYXRhLWNvbnRhaW5lcnMvc2hhcmVkL2NvbnRhaW5lcnMiLAogICAgInNmcHJlZml4IjogIl4kKGNwYXRoKS8kKGJ1bmRsZS1pZCktW2EtejAtOV17MTZ9LSIsCiAgICAic3BhdGgiOiAiL3J1bi9rYXRhLWNvbnRhaW5lcnMvc2FuZGJveC9zdG9yYWdlIiwKICAgICJpcHY0X2EiOiAiKChbMC05XXxbMS05XVswLTldfDFbMC05XXsyfXwyWzAtNF1bMC05XXwyNVswLTVdKVxcLil7M30oWzAtOV18WzEtOV1bMC05XXwxWzAtOV17Mn18MlswLTRdWzAtOV18MjVbMC01XSkiLAogICAgImlwX3AiOiAiWzAtOV17MSw1fSIsCiAgICAic3ZjX25hbWUiOiAiW0EtWl9cXC5cXC1dKyIsCiAgICAiZG5zX2xhYmVsIjogIlthLXpBLVowLTlfXFwuXFwtXSsiLAogICAgInNfc291cmNlMSI6ICJeLi4yWzAtOV17M31fWzAtMV1bMC05XV9bMC0zXVswLTldX1swLTJdWzAtOV1fWzAtNV1bMC05XV9bMC01XVswLTldXFwuWzAtOV17MSwxMH0kIiwKICAgICJzX3NvdXJjZTIiOiAiXi4uZGF0YS8iLAogICAgImRuc19zdWJkb21haW4iOiAiXlthLXowLTldKFstYS16MC05XSpbYS16MC05XSk/JCIsCiAgICAicG9kX3VpZCI6ICJeWzAtOWEtZkEtRl17OH0tWzAtOWEtZkEtRl17NH0tWzAtOWEtZkEtRl17NH0tWzAtOWEtZkEtRl17NH0tWzAtOWEtZkEtRl17MTJ9JCIsCiAgICAiZGVmYXVsdF9jYXBzIjogWwogICAgICAiQ0FQX0NIT1dOIiwKICAgICAgIkNBUF9EQUNfT1ZFUlJJREUiLAogICAgICAiQ0FQX0ZTRVRJRCIsCiAgICAgICJDQVBfRk9XTkVSIiwKICAgICAgIkNBUF9NS05PRCIsCiAgICAgICJDQVBfTkVUX1JBVyIsCiAgICAgICJDQVBfU0VUR0lEIiwKICAgICAgIkNBUF9TRVRVSUQiLAogICAgICAiQ0FQX1NFVEZDQVAiLAogICAgICAiQ0FQX1NFVFBDQVAiLAogICAgICAiQ0FQX05FVF9CSU5EX1NFUlZJQ0UiLAogICAgICAiQ0FQX1NZU19DSFJPT1QiLAogICAgICAiQ0FQX0tJTEwiLAogICAgICAiQ0FQX0FVRElUX1dSSVRFIgogICAgXSwKICAgICJwcml2aWxlZ2VkX2NhcHMiOiBbCiAgICAgICJDQVBfQ0hPV04iLAogICAgICAiQ0FQX0RBQ19PVkVSUklERSIsCiAgICAgICJDQVBfREFDX1JFQURfU0VBUkNIIiwKICAgICAgIkNBUF9GT1dORVIiLAogICAgICAiQ0FQX0ZTRVRJRCIsCiAgICAgICJDQVBfS0lMTCIsCiAgICAgICJDQVBfU0VUR0lEIiwKICAgICAgIkNBUF9TRVRVSUQiLAogICAgICAiQ0FQX1NFVFBDQVAiLAogICAgICAiQ0FQX0xJTlVYX0lNTVVUQUJMRSIsCiAgICAgICJDQVBfTkVUX0JJTkRfU0VSVklDRSIsCiAgICAgICJDQVBfTkVUX0JST0FEQ0FTVCIsCiAgICAgICJDQVBfTkVUX0FETUlOIiwKICAgICAgIkNBUF9ORVRfUkFXIiwKICAgICAgIkNBUF9JUENfTE9DSyIsCiAgICAgICJDQVBfSVBDX09XTkVSIiwKICAgICAgIkNBUF9TWVNfTU9EVUxFIiwKICAgICAgIkNBUF9TWVNfUkFXSU8iLAogICAgICAiQ0FQX1NZU19DSFJPT1QiLAogICAgICAiQ0FQX1NZU19QVFJBQ0UiLAogICAgICAiQ0FQX1NZU19QQUNDVCIsCiAgICAgICJDQVBfU1lTX0FETUlOIiwKICAgICAgIkNBUF9TWVNfQk9PVCIsCiAgICAgICJDQVBfU1lTX05JQ0UiLAogICAgICAiQ0FQX1NZU19SRVNPVVJDRSIsCiAgICAgICJDQVBfU1lTX1RJTUUiLAogICAgICAiQ0FQX1NZU19UVFlfQ09ORklHIiwKICAgICAgIkNBUF9NS05PRCIsCiAgICAgICJDQVBfTEVBU0UiLAogICAgICAiQ0FQX0FVRElUX1dSSVRFIiwKICAgICAgIkNBUF9BVURJVF9DT05UUk9MIiwKICAgICAgIkNBUF9TRVRGQ0FQIiwKICAgICAgIkNBUF9NQUNfT1ZFUlJJREUiLAogICAgICAiQ0FQX01BQ19BRE1JTiIsCiAgICAgICJDQVBfU1lTTE9HIiwKICAgICAgIkNBUF9XQUtFX0FMQVJNIiwKICAgICAgIkNBUF9CTE9DS19TVVNQRU5EIiwKICAgICAgIkNBUF9BVURJVF9SRUFEIiwKICAgICAgIkNBUF9QRVJGTU9OIiwKICAgICAgIkNBUF9CUEYiLAogICAgICAiQ0FQX0NIRUNLUE9JTlRfUkVTVE9SRSIKICAgIF0sCiAgICAidmlydGlvX2Jsa19zdG9yYWdlX2NsYXNzZXMiOiBbCiAgICAgICJjYy1sb2NhbC1jc2kiLAogICAgICAiY2MtbWFuYWdlZC1jc2kiLAogICAgICAiY2MtbWFuYWdlZC1wcmVtaXVtLWNzaSIKICAgIF0sCiAgICAic21iX3N0b3JhZ2VfY2xhc3NlcyI6IFsKICAgICAgewogICAgICAgICJuYW1lIjogImF6dXJlZmlsZS1jc2kta2F0YS1jYyIsCiAgICAgICAgIm1vdW50X29wdGlvbnMiOiBbCiAgICAgICAgICAiZGlyX21vZGU9MDc3NyIsCiAgICAgICAgICAiZmlsZV9tb2RlPTA3NzciLAogICAgICAgICAgIm1mc3ltbGlua3MiLAogICAgICAgICAgImNhY2hlPXN0cmljdCIsCiAgICAgICAgICAibm9zaGFyZXNvY2siLAogICAgICAgICAgImFjdGltZW89MzAiLAogICAgICAgICAgIm5vYnJsIgogICAgICAgIF0KICAgICAgfQogICAgXQogIH0sCiAgInNhbmRib3giOiB7CiAgICAic3RvcmFnZXMiOiBbCiAgICAgIHsKICAgICAgICAiZHJpdmVyIjogImVwaGVtZXJhbCIsCiAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgInNvdXJjZSI6ICJzaG0iLAogICAgICAgICJmc3R5cGUiOiAidG1wZnMiLAogICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICJub2RldiIsCiAgICAgICAgICAibW9kZT0xNzc3IiwKICAgICAgICAgICJzaXplPTY3MTA4ODY0IgogICAgICAgIF0sCiAgICAgICAgIm1vdW50X3BvaW50IjogIi9ydW4va2F0YS1jb250YWluZXJzL3NhbmRib3gvc2htIiwKICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgIH0KICAgIF0KICB9LAogICJyZXF1ZXN0X2RlZmF1bHRzIjogewogICAgIkNyZWF0ZUNvbnRhaW5lclJlcXVlc3QiOiB7CiAgICAgICJhbGxvd19lbnZfcmVnZXgiOiBbCiAgICAgICAgIl5IT1NUTkFNRT0kKGRuc19sYWJlbCkkIiwKICAgICAgICAiXiQoc3ZjX25hbWUpX1BPUlRfJChpcF9wKV9UQ1A9dGNwOi8vJChpcHY0X2EpOiQoaXBfcCkkIiwKICAgICAgICAiXiQoc3ZjX25hbWUpX1BPUlRfJChpcF9wKV9UQ1BfUFJPVE89dGNwJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9QT1JUXyQoaXBfcClfVENQX1BPUlQ9JChpcF9wKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfUE9SVF8kKGlwX3ApX1RDUF9BRERSPSQoaXB2NF9hKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfU0VSVklDRV9IT1NUPSQoaXB2NF9hKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfU0VSVklDRV9QT1JUPSQoaXBfcCkkIiwKICAgICAgICAiXiQoc3ZjX25hbWUpX1NFUlZJQ0VfUE9SVF8kKGRuc19sYWJlbCk9JChpcF9wKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfUE9SVD10Y3A6Ly8kKGlwdjRfYSk6JChpcF9wKSQiLAogICAgICAgICJeQVpVUkVfQ0xJRU5UX0lEPVtBLUZhLWYwLTktXSokIiwKICAgICAgICAiXkFaVVJFX1RFTkFOVF9JRD1bQS1GYS1mMC05LV0qJCIsCiAgICAgICAgIl5BWlVSRV9GRURFUkFURURfVE9LRU5fRklMRT0vdmFyL3J1bi9zZWNyZXRzL2F6dXJlL3Rva2Vucy9henVyZS1pZGVudGl0eS10b2tlbiQiLAogICAgICAgICJeQVpVUkVfQVVUSE9SSVRZX0hPU1Q9aHR0cHM6Ly9sb2dpblxcLm1pY3Jvc29mdG9ubGluZVxcLmNvbS8kIiwKICAgICAgICAiXlRFUk09eHRlcm0kIgogICAgICBdLAogICAgICAiYWxsb3dfZW52X3JlZ2V4X21hcCI6IHsKICAgICAgICAiQ1BVX0xJTUlUIjogIl5bMC05XSskIiwKICAgICAgICAiSk9CX0NPTVBMRVRJT05fSU5ERVgiOiAiXlswLTldKiQiLAogICAgICAgICJNRU1PUllfTElNSVQiOiAiXlswLTldKyQiCiAgICAgIH0KICAgIH0sCiAgICAiQ29weUZpbGVSZXF1ZXN0IjogWwogICAgICAiJChzZnByZWZpeCkiCiAgICBdLAogICAgIkV4ZWNQcm9jZXNzUmVxdWVzdCI6IHsKICAgICAgImFsbG93ZWRfY29tbWFuZHMiOiBbXSwKICAgICAgInJlZ2V4IjogW10KICAgIH0sCiAgICAiVXBkYXRlUm91dGVzUmVxdWVzdCI6IHsKICAgICAgImZvcmJpZGRlbl9kZXZpY2VfbmFtZXMiOiBbCiAgICAgICAgImxvIgogICAgICBdLAogICAgICAiZm9yYmlkZGVuX3NvdXJjZV9yZWdleCI6IFsKICAgICAgICAiXig/OjB7MCw0fTopezAsN30wezAsM30xJCIsCiAgICAgICAgIl4xMjdcXC4oPzpbMC05XXsxLDN9XFwuKXsyfVswLTldezEsM30kIgogICAgICBdCiAgICB9LAogICAgIlVwZGF0ZUludGVyZmFjZVJlcXVlc3QiOiB7CiAgICAgICJhbGxvd19yYXdfZmxhZ3MiOiAxMjgsCiAgICAgICJmb3JiaWRkZW5fbmFtZXMiOiBbCiAgICAgICAgImxvIgogICAgICBdLAogICAgICAiZm9yYmlkZGVuX2h3X2FkZHJzIjogWwogICAgICAgICIwMDowMDowMDowMDowMDowMCIKICAgICAgXQogICAgfSwKICAgICJDbG9zZVN0ZGluUmVxdWVzdCI6IGZhbHNlLAogICAgIlJlYWRTdHJlYW1SZXF1ZXN0IjogZmFsc2UsCiAgICAiVXBkYXRlRXBoZW1lcmFsTW91bnRzUmVxdWVzdCI6IGZhbHNlLAogICAgIldyaXRlU3RyZWFtUmVxdWVzdCI6IGZhbHNlCiAgfQp9 + spec: + runtimeClassName: kata-cc + containers: + - name: nginx + image: "marinerconfpodstest.azurecr.io/azurelinux/base/nginx:1.25" diff --git a/src/agent/samples/policy/yaml/kubernetes/fixtures/job.yaml b/src/agent/samples/policy/yaml/kubernetes/fixtures/job.yaml new file mode 100644 index 000000000000..c6417eb5aef4 --- /dev/null +++ b/src/agent/samples/policy/yaml/kubernetes/fixtures/job.yaml @@ -0,0 +1,23 @@ +--- +apiVersion: batch/v1 +kind: Job +metadata: + name: pi +spec: + template: + metadata: + name: pi + annotations: + io.katacontainers.config.agent.policy: IyBDb3B5cmlnaHQgKGMpIDIwMjMgTWljcm9zb2Z0IENvcnBvcmF0aW9uCiMKIyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMAojCnBhY2thZ2UgYWdlbnRfcG9saWN5CgppbXBvcnQgZnV0dXJlLmtleXdvcmRzLmluCmltcG9ydCBmdXR1cmUua2V5d29yZHMuZXZlcnkKCiMgRGVmYXVsdCB2YWx1ZXMsIHJldHVybmVkIGJ5IE9QQSB3aGVuIHJ1bGVzIGNhbm5vdCBiZSBldmFsdWF0ZWQgdG8gdHJ1ZS4KZGVmYXVsdCBBZGRBUlBOZWlnaGJvcnNSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgQWRkU3dhcFJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBDbG9zZVN0ZGluUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IENvcHlGaWxlUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IENyZWF0ZUNvbnRhaW5lclJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBDcmVhdGVTYW5kYm94UmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IERlc3Ryb3lTYW5kYm94UmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgRXhlY1Byb2Nlc3NSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgR2V0T09NRXZlbnRSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBHdWVzdERldGFpbHNSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBMaXN0SW50ZXJmYWNlc1JlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBMaXN0Um91dGVzUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IE1lbUhvdHBsdWdCeVByb2JlUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IE9ubGluZUNQVU1lbVJlcXVlc3QgOj0gdHJ1ZQpkZWZhdWx0IFBhdXNlQ29udGFpbmVyUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFJlYWRTdHJlYW1SZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgUmVtb3ZlQ29udGFpbmVyUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgUmVtb3ZlU3RhbGVWaXJ0aW9mc1NoYXJlTW91bnRzUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgUmVzZWVkUmFuZG9tRGV2UmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFJlc3VtZUNvbnRhaW5lclJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBTZXRHdWVzdERhdGVUaW1lUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFNldFBvbGljeVJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBTaWduYWxQcm9jZXNzUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgU3RhcnRDb250YWluZXJSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBTdGFydFRyYWNpbmdSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgU3RhdHNDb250YWluZXJSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBTdG9wVHJhY2luZ1JlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBUdHlXaW5SZXNpemVSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBVcGRhdGVDb250YWluZXJSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgVXBkYXRlRXBoZW1lcmFsTW91bnRzUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFVwZGF0ZUludGVyZmFjZVJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBVcGRhdGVSb3V0ZXNSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgV2FpdFByb2Nlc3NSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBXcml0ZVN0cmVhbVJlcXVlc3QgOj0gZmFsc2UKCiMgQWxsb3dSZXF1ZXN0c0ZhaWxpbmdQb2xpY3kgOj0gdHJ1ZSBjb25maWd1cmVzIHRoZSBBZ2VudCB0byAqYWxsb3cgYW55CiMgcmVxdWVzdHMgY2F1c2luZyBhIHBvbGljeSBmYWlsdXJlKi4gVGhpcyBpcyBhbiB1bnNlY3VyZSBjb25maWd1cmF0aW9uCiMgYnV0IGlzIHVzZWZ1bCBmb3IgYWxsb3dpbmcgdW5zZWN1cmUgcG9kcyB0byBzdGFydCwgdGhlbiBjb25uZWN0IHRvCiMgdGhlbSBhbmQgaW5zcGVjdCBPUEEgbG9ncyBmb3IgdGhlIHJvb3QgY2F1c2Ugb2YgYSBmYWlsdXJlLgpkZWZhdWx0IEFsbG93UmVxdWVzdHNGYWlsaW5nUG9saWN5IDo9IGZhbHNlCgojIENvbnN0YW50cwpTX05BTUVfS0VZID0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZSIKU19OQU1FU1BBQ0VfS0VZID0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZXNwYWNlIgpCVU5ETEVfSUQgPSAiW2EtejAtOV17NjR9IgoKQ3JlYXRlQ29udGFpbmVyUmVxdWVzdDo9IHJlc3AgewogICAgbm90IGlzX251bGwoaW5wdXQuZW52X21hcCkKICAgIAogICAgaV9lbnZfbWFwIDo9IGlucHV0LmVudl9tYXAKICAgIAogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBwX2Vudl9tYXAgOj0gcF9jb250YWluZXIuZW52X21hcCAgCiAgICBhbGxvd19lbnZfbWFwKHBfZW52X21hcCwgaV9lbnZfbWFwKQogICAgCiAgICBpX3Byb2Nlc3MgOj0gaW5wdXQuYmFzZS5PQ0kuUHJvY2VzcwogICAgCiAgICBwX3Byb2Nlc3MgOj0gcF9jb250YWluZXIuT0NJLlByb2Nlc3MKICAgIAogICAgYWxsb3dfYXJncyhpX3Byb2Nlc3MsIHBfcHJvY2VzcywgaV9lbnZfbWFwKQoKICAgIHJlc3AgPSBDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uKGlucHV0LmJhc2UpCiAgICBwcmludCgiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdDogdHJ1ZSIpCn0KCmFsbG93X2FyZ3MoaV9wcm9jZXNzLCBwX3Byb2Nlc3MsIGlfZW52X21hcCkgewogICAgaV9hcmdzIDo9IGlfcHJvY2Vzcy5BcmdzCiAgICBwX2FyZ3MgOj0gcF9wcm9jZXNzLkFyZ3MKICAgIHByaW50KCJhbGxvd19hcmdzOiBpX2FyZ3MgPSIsIGlfYXJncywgInBfYXJncyA9IiwgcF9hcmdzKQogICAgY291bnQoaV9hcmdzKSA9PSBjb3VudChwX2FyZ3MpCiAgICBldmVyeSBpLCBpX2FyZyBpbiBpX2FyZ3MgewogICAgICAgIHByaW50KCJhbGxvd19hcmdzOiBpX2FyZyA9IiwgaV9hcmcpCiAgICAgICAgcF9hcmdfcmVwbGFjZWQgOj0gcmVwbGFjZV9lbnZfdmFyaWFibGVzKHBfYXJnc1tpXSwgaV9lbnZfbWFwKQogICAgICAgIHByaW50KCJhbGxvd19hcmdzOiBwX2FyZ19yZXBsYWNlZCA9IiwgcF9hcmdfcmVwbGFjZWQpCiAgICAgICAgcF9hcmdfcmVwbGFjZWQyIDo9IHJlcGxhY2UocF9hcmdfcmVwbGFjZWQsICIkJCIsICIkIikKICAgICAgICBwcmludCgiYWxsb3dfYXJnczogcF9hcmdfcmVwbGFjZWQyID0iLCBwX2FyZ19yZXBsYWNlZDIpCiAgICAgICAgaV9hcmcgPT0gcF9hcmdfcmVwbGFjZWQyCiAgICB9CiAgICBwcmludCgiYWxsb3dfYXJnczogdHJ1ZSIpCn0KCmFsbG93X2FyZ3MoaV9wcm9jZXNzLCBwX3Byb2Nlc3MsIGlfZW52X21hcCkgewogICAgbm90IGlfcHJvY2Vzcy5BcmdzCiAgICBub3QgcF9wcm9jZXNzLkFyZ3MKICAgIHByaW50KCJhbGxvd19hcmdzMjogbm8gYXJncyIpCn0KCiMgdGhpcyBmdW5jdGlvbiByZXBsYWNlcyBhbGwgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyBpbiBhIHN0cmluZywgZ2l2ZW4gYSBtYXAgb2YgZW52aXJvbm1lbnQga2V5cyB0byBlbnZpcm9ubWVudCB2YWx1ZXMKIyBlZyBzdHIgPSAiZWNobyAkKENMVVNURVJfSUQpOyBlY2hvICQoTk9ERV9OQU1FKTsiCiMgZW52X21hcCA9IHsiQ0xVU1RFUl9JRCI6ICJhYmMiLCAiTk9ERV9OQU1FIiA6ICJ4eXoifQojIHJlc3VsdCA9ICJlY2hvIGFiYzsgZWNobyB4eXo7IgpyZXBsYWNlX2Vudl92YXJpYWJsZXMoc3RyLCBlbnZfbWFwKSA9IHJlc3VsdCB7CiAgICAjIG1ha2UgYW4gYXJyYXkgb2YgdGhlIGtleXMgZWcgWyJDTFVTVEVSX0lEIiwgIk5PREVfTkFNRSJdCiAgICBrZXlzIDo9IFt4IHwgc29tZSB4IGluIG9iamVjdC5rZXlzKGVudl9tYXApXQogICAgcmVzdWx0IDo9IHJlcGxhY2Vfc3RyX3JlYyhzdHIsIGVudl9tYXAsIGtleXMsIGNvdW50KGtleXMpIC0gMSkKfQoKIyBiYXNlIGNhc2UKcmVwbGFjZV9zdHJfcmVjKHN0ciwgZW52X21hcCwgYXJyX2tleXMsIGkpID0gcmVzdWx0IHsKICAgIGkgPCAwCiAgICByZXN1bHQgOj0gc3RyCn0KCiMgcmVjdXJzaXZlIHN0ZXAKcmVwbGFjZV9zdHJfcmVjKHN0ciwgZW52X21hcCwgYXJyX2tleXMsIGkpID0gcmVzdWx0IHsKICAgIGkgPj0gMAogICAga2V5IDo9IGFycl9rZXlzW2ldCiAgICBlbnZfa2V5MSA6PSBjb25jYXQoIiIsIFsiJCgiLCBrZXksICIpIl0pCiAgICAjIHJlcGxhY2UgJChWQVIpIHdpdGggdmFsdWUKICAgIG5ld19zdHIxIDo9IHJlcGxhY2Uoc3RyLCBlbnZfa2V5MSwgZW52X21hcFtrZXldKQogICAgIyByZXBsYWNlIG5leHQgZW52aXJvbm1lbnQgdmFyaWFibGUKICAgIHJlc3VsdCA9IHJlcGxhY2Vfc3RyX3JlYyhuZXdfc3RyMSwgZW52X21hcCwgYXJyX2tleXMsIGkgLSAxKQp9CgphbGxvd19lbnZfbWFwKHBfZW52X21hcCwgaV9lbnZfbWFwKSB7CiAgICBwcmludCgiYWxsb3dfZW52X21hcDogcF9lbnZfbWFwID0iLCBwX2Vudl9tYXApCiAgICBldmVyeSBlbnZfa2V5LCBlbnZfdmFsIGluIGlfZW52X21hcCB7CiAgICAgICAgcHJpbnQoImFsbG93X2VudjogZW52X2tleSA9IiwgZW52X2tleSwgImVudl92YWwgPSIsIGVudl92YWwpCiAgICAgICAgYWxsb3dfZW52X21hcF9lbnRyeShlbnZfa2V5LCBlbnZfdmFsLCBwX2Vudl9tYXApCiAgICB9CiAgICBwcmludCgiYWxsb3dfZW52X21hcDogdHJ1ZSIpCn0KCiMgQWxsb3cgZXhhY3QgbWF0Y2gKYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBpX3ZhbCA9PSBwX3ZhbAogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnk6IHRydWUiKQp9CgojIEFsbG93IHJlc291cmNlRmllbGRSZWYgdmFsdWVzIChlLmcuLCAibGltaXRzLmNwdSIpLgphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgICMgYSB2YXJpYWJsZSB3ZSBzaG91bGQgYmUgdmFsaWRhdGluZyB1c2luZyBhIHJlZ2V4IGZyb20gc2V0dGluZ3MKICAgIHBfdmFsID09ICIkKHZhbGlkYXRlLWZyb20tc2V0dGluZ3MpIgogICAgcmVnZXhfdmFsIDo9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuQ3JlYXRlQ29udGFpbmVyUmVxdWVzdC5hbGxvd19lbnZfcmVnZXhfbWFwW2tleV0KICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4X3ZhbCwgaV92YWwpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSAyOiB0cnVlIikKfQoKIyBBbGxvdyBub2RlLW5hbWUKYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChub2RlLW5hbWUpIgogICAgcmVnZXgubWF0Y2gocG9saWN5X2RhdGEuY29tbW9uLmRuc19zdWJkb21haW4gLCBpX3ZhbCkKICAgIHByaW50KCJhbGxvd19lbnZfbWFwX2VudHJ5IDM6IHRydWUiKQp9CgojIEFsbG93IGhvc3QtbmFtZQphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgIHBfdmFsID09ICIkKGhvc3QtbmFtZSkiCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24uZG5zX2xhYmVsICwgaV92YWwpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSA0OiB0cnVlIikKfQoKIyBBbGxvdyBwb2QtdWlkCmFsbG93X2Vudl9tYXBfZW50cnkoa2V5LCBpX3ZhbCwgcF9lbnZfbWFwKSB7CiAgICBwX3ZhbCA6PSBwX2Vudl9tYXBba2V5XQogICAgcF92YWwgPT0gIiQocG9kLXVpZCkiCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24ucG9kX3VpZCAsIGlfdmFsKQogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgNTogdHJ1ZSIpCn0KCiMgQWxsb3cgZmllbGRSZWYgImZpZWxkUGF0aDogc3RhdHVzLnBvZElQIiB2YWx1ZXMuCmFsbG93X2Vudl9tYXBfZW50cnkoa2V5LCBpX3ZhbCwgcF9lbnZfbWFwKSB7CiAgICBpc19pcChpX3ZhbCkKCiAgICBwX3ZhbCA6PSBwX2Vudl9tYXBba2V5XQogICAgcF92YXIgOj0gY29uY2F0KCI9IiwgW2tleSwgcF92YWxdKQogICAgYWxsb3dfcG9kX2lwX3ZhcihrZXksIHBfdmFyKQogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgNjogdHJ1ZSIpCn0KCiMgQWxsb3cgZmllbGRSZWYgImZpZWxkUGF0aDogc3RhdHVzLmhvc3RJUCIgdmFsdWVzLgphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgaXNfaXAoaV92YWwpCgogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgIHBfdmFyIDo9IGNvbmNhdCgiPSIsIFtrZXksIHBfdmFsXSkKICAgIGFsbG93X2hvc3RfaXBfdmFyKGtleSwgcF92YXIpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSA3OiB0cnVlIikKfQoKIyBNYXRjaCBpbnB1dCB3aXRoIG9uZSBvZiB0aGUgcG9saWN5IHZhcmlhYmxlcywgYWZ0ZXIgc3Vic3RpdHV0aW5nICQoc2FuZGJveC1uYW1lKS4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChzYW5kYm94LW5hbWUpIgogICAgc19uYW1lIDo9IGlucHV0LmJhc2UuT0NJLkFubm90YXRpb25zW1NfTkFNRV9LRVldCiAgICBwX3ZhcjIgOj0gcmVwbGFjZShwX3ZhbCwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHBfdmFyMiA9PSBpX3ZhbAogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgODogdHJ1ZSIpCn0KCiMgTWF0Y2ggaW5wdXQgd2l0aCBvbmUgb2YgdGhlIHBvbGljeSB2YXJpYWJsZXMsIGFmdGVyIHN1YnN0aXR1dGluZyAkKHNhbmRib3gtbmFtZXNwYWNlKS4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChzYW5kYm94LW5hbWVzcGFjZSkiCiAgICBzX25hbWVzcGFjZSA6PSBpbnB1dC5iYXNlLk9DSS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwX3ZhcjIgOj0gcmVwbGFjZShwX3ZhbCwgIiQoc2FuZGJveC1uYW1lc3BhY2UpIiwgc19uYW1lc3BhY2UpCiAgICBwX3ZhcjIgPT0gaV92YWwKICAgIHByaW50KCJhbGxvd19lbnZfbWFwX2VudHJ5IDk6IHRydWUiKQp9CgojIEFsbG93IGlucHV0IGVudiB2YXJpYWJsZXMgdGhhdCBtYXRjaCB3aXRoIGEgcmVxdWVzdF9kZWZhdWx0cyByZWdleC4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHNvbWUgcF9yZWdleDEgaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5DcmVhdGVDb250YWluZXJSZXF1ZXN0LmFsbG93X2Vudl9yZWdleAogICAgcF9yZWdleDIgOj0gcmVwbGFjZShwX3JlZ2V4MSwgIiQoaXB2NF9hKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcHY0X2EpCiAgICBwX3JlZ2V4MyA6PSByZXBsYWNlKHBfcmVnZXgyLCAiJChpcF9wKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcF9wKQogICAgcF9yZWdleDQgOj0gcmVwbGFjZShwX3JlZ2V4MywgIiQoc3ZjX25hbWUpIiwgcG9saWN5X2RhdGEuY29tbW9uLnN2Y19uYW1lKQogICAgcF9yZWdleDUgOj0gcmVwbGFjZShwX3JlZ2V4NCwgIiQoZG5zX2xhYmVsKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5kbnNfbGFiZWwpCgogICAgcmVzdWx0IDo9IGNvbmNhdCgiPSIsIFtrZXksIGlfdmFsXSkKICAgIHJlZ2V4Lm1hdGNoKHBfcmVnZXg1LCByZXN1bHQpCgogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgMTA6IHRydWUiKQp9CgpDcmVhdGVDb250YWluZXJSZXF1ZXN0Oj0gcmVzcCB7CiAgICBub3QgaW5wdXQuZW52X21hcAogICAgaV9wcm9jZXNzID0gaW5wdXQuT0NJLlByb2Nlc3MKICAgIHNfbmFtZSA9IGlucHV0Lk9DSS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBwX3Byb2Nlc3MgPSBwX2NvbnRhaW5lci5PQ0kuUHJvY2VzcwogICAgYWxsb3dfZGVwcmVjYXRlZF9hcmdzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUpCiAgICByZXNwID0gQ3JlYXRlQ29udGFpbmVyUmVxdWVzdENvbW1vbihpbnB1dCkKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0MjogdHJ1ZSIpCn0KCkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb24ocmVxKTo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgICMgQ2hlY2sgaWYgdGhlIGlucHV0IHJlcXVlc3Qgc2hvdWxkIGJlIHJlamVjdGVkIGV2ZW4gYmVmb3JlIGNoZWNraW5nIHRoZQogICAgIyBwb2xpY3lfZGF0YS5jb250YWluZXJzIGluZm9ybWF0aW9uLgogICAgYWxsb3dfY3JlYXRlX2NvbnRhaW5lcl9pbnB1dChyZXEpCgogICAgaV9vY2kgOj0gcmVxLk9DSQogICAgaV9zdG9yYWdlcyA6PSByZXEuc3RvcmFnZXMKICAgIGlfZGV2aWNlcyA6PSByZXEuZGV2aWNlcwoKICAgICMgYXJyYXkgb2YgcG9zc2libGUgc3RhdGUgb3BlcmF0aW9ucwogICAgb3BzX2J1aWxkZXIgOj0gW10KCiAgICAjIGNoZWNrIHNhbmRib3ggbmFtZQogICAgc2FuZGJveF9uYW1lID0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FX0tFWV0KICAgIGFkZF9zYW5kYm94X25hbWVfdG9fc3RhdGUgOj0gc3RhdGVfYWxsb3dzKCJzYW5kYm94X25hbWUiLCBzYW5kYm94X25hbWUpCiAgICBvcHNfYnVpbGRlcjEgOj0gY29uY2F0X29wX2lmX25vdF9udWxsKG9wc19idWlsZGVyLCBhZGRfc2FuZGJveF9uYW1lX3RvX3N0YXRlKQoKICAgICMgQ2hlY2sgaWYgYW55IGVsZW1lbnQgZnJvbSB0aGUgcG9saWN5X2RhdGEuY29udGFpbmVycyBhcnJheSBhbGxvd3MgdGhlIGlucHV0IHJlcXVlc3QuCiAgICBzb21lIHBfY29udGFpbmVyIGluIHBvbGljeV9kYXRhLmNvbnRhaW5lcnMKICAgIHByaW50KCI9PT09PT09PSBDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiB0cnlpbmcgbmV4dCBwb2xpY3kgY29udGFpbmVyIikKCiAgICBwX3BpZG5zIDo9IHBfY29udGFpbmVyLnNhbmRib3hfcGlkbnMKICAgIGlfcGlkbnMgOj0gcmVxLnNhbmRib3hfcGlkbnMKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiBwX3BpZG5zID0iLCBwX3BpZG5zLCAiaV9waWRucyA9IiwgaV9waWRucykKICAgIHBfcGlkbnMgPT0gaV9waWRucwoKICAgIHBfb2NpIDo9IHBfY29udGFpbmVyLk9DSQoKICAgICMgY2hlY2sgbmFtZXNwYWNlCiAgICBwX25hbWVzcGFjZSA6PSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBpX25hbWVzcGFjZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwcmludCAoIkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb246IHBfbmFtZXNwYWNlID0iLCBwX25hbWVzcGFjZSwgImlfbmFtZXNwYWNlID0iLCBpX25hbWVzcGFjZSkKICAgIGFkZF9uYW1lc3BhY2VfdG9fc3RhdGUgOj0gYWxsb3dfbmFtZXNwYWNlKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkKICAgIG9wc19idWlsZGVyMiA6PSBjb25jYXRfb3BfaWZfbm90X251bGwob3BzX2J1aWxkZXIxLCBhZGRfbmFtZXNwYWNlX3RvX3N0YXRlKQoKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiBwIFZlcnNpb24gPSIsIHBfb2NpLlZlcnNpb24sICJpIFZlcnNpb24gPSIsIGlfb2NpLlZlcnNpb24pCiAgICBwX29jaS5WZXJzaW9uID09IGlfb2NpLlZlcnNpb24KCiAgICBwcmludCgiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdENvbW1vbjogcCBSZWFkb25seSA9IiwgcF9vY2kuUm9vdC5SZWFkb25seSwgImkgUmVhZG9ubHkgPSIsIGlfb2NpLlJvb3QuUmVhZG9ubHkpCiAgICBwX29jaS5Sb290LlJlYWRvbmx5ID09IGlfb2NpLlJvb3QuUmVhZG9ubHkKCiAgICBhbGxvd19hbm5vKHBfb2NpLCBpX29jaSkKCiAgICBwX3N0b3JhZ2VzIDo9IHBfY29udGFpbmVyLnN0b3JhZ2VzCiAgICBhbGxvd19ieV9hbm5vKHBfb2NpLCBpX29jaSwgcF9zdG9yYWdlcywgaV9zdG9yYWdlcykKCiAgICBwX2RldmljZXMgOj0gcF9jb250YWluZXIuZGV2aWNlcwogICAgYWxsb3dfZGV2aWNlcyhwX2RldmljZXMsIGlfZGV2aWNlcykKCiAgICByZXQgOj0gYWxsb3dfbGludXgob3BzX2J1aWxkZXIyLCBwX29jaSwgaV9vY2kpCiAgICByZXQuYWxsb3dlZAoKICAgIG9wcyA6PSByZXQub3BzCgogICAgcHJpbnQoIkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb246IHRydWUiKQp9CgphbGxvd19jcmVhdGVfY29udGFpbmVyX2lucHV0KHJlcSkgewogICAgcHJpbnQoImFsbG93X2NyZWF0ZV9jb250YWluZXJfaW5wdXQ6IGlucHV0ID0iLCByZXEpCgogICAgY291bnQocmVxLnNoYXJlZF9tb3VudHMpID09IDAKICAgIGlzX251bGwocmVxLnN0cmluZ191c2VyKQoKICAgIGlfb2NpIDo9IHJlcS5PQ0kKICAgIGlzX251bGwoaV9vY2kuSG9va3MpCiAgICBpc19udWxsKGlfb2NpLlNvbGFyaXMpCiAgICBpc19udWxsKGlfb2NpLldpbmRvd3MpCgogICAgaV9saW51eCA6PSBpX29jaS5MaW51eAogICAgY291bnQoaV9saW51eC5HSURNYXBwaW5ncykgPT0gMAogICAgY291bnQoaV9saW51eC5Nb3VudExhYmVsKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlJlc291cmNlcy5EZXZpY2VzKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlJvb3Rmc1Byb3BhZ2F0aW9uKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlVJRE1hcHBpbmdzKSA9PSAwCiAgICBpc19udWxsKGlfbGludXguSW50ZWxSZHQpCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLkJsb2NrSU8pCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLk5ldHdvcmspCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLlBpZHMpCiAgICBpc19udWxsKGlfbGludXguU2VjY29tcCkKCiAgICBpX3Byb2Nlc3MgOj0gaV9vY2kuUHJvY2VzcwogICAgY291bnQoaV9wcm9jZXNzLlNlbGludXhMYWJlbCkgPT0gMAogICAgY291bnQoaV9wcm9jZXNzLlVzZXIuVXNlcm5hbWUpID09IDAKCiAgICBwcmludCgiYWxsb3dfY3JlYXRlX2NvbnRhaW5lcl9pbnB1dDogdHJ1ZSIpCn0KCmFsbG93X25hbWVzcGFjZShwX25hbWVzcGFjZSwgaV9uYW1lc3BhY2UpID0gYWRkX25hbWVzcGFjZSB7CiAgICBwX25hbWVzcGFjZSA9PSBpX25hbWVzcGFjZQogICAgYWRkX25hbWVzcGFjZSA6PSBudWxsCiAgICBwcmludCgiYWxsb3dfbmFtZXNwYWNlIDE6IGlucHV0IG5hbWVzcGFjZSBtYXRjaGVzIHBvbGljeSBkYXRhIikKfQoKYWxsb3dfbmFtZXNwYWNlKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkgPSBhZGRfbmFtZXNwYWNlIHsKICAgIHBfbmFtZXNwYWNlID09ICIiCiAgICBwcmludCgiYWxsb3dfbmFtZXNwYWNlIDI6IG5vIG5hbWVzcGFjZSBmb3VuZCBvbiBwb2xpY3kgZGF0YSIpCiAgICBhZGRfbmFtZXNwYWNlIDo9IHN0YXRlX2FsbG93cygibmFtZXNwYWNlIiwgaV9uYW1lc3BhY2UpCn0KCiMgdmFsdWUgaGFzbid0IGJlZW4gc2VlbiBiZWZvcmUsIHNhdmUgaXQgdG8gc3RhdGUKc3RhdGVfYWxsb3dzKGtleSwgdmFsdWUpID0gYWN0aW9uIHsKICBzdGF0ZSA6PSBnZXRfc3RhdGUoKQogIHByaW50KCJzdGF0ZV9hbGxvd3MgMTogc3RhdGVba2V5XSA9Iiwgc3RhdGVba2V5XSwgInZhbHVlID0iLCB2YWx1ZSkKICBub3Qgc3RhdGVba2V5XQogIHByaW50KCJzdGF0ZV9hbGxvd3MgMTogc2F2aW5nIHRvIHN0YXRlIGtleSA9Iiwga2V5LCAidmFsdWUgPSIsIHZhbHVlKQogIHBhdGggOj0gZ2V0X3N0YXRlX3BhdGgoa2V5KSAKICBhY3Rpb24gOj0gewogICAgIm9wIjogImFkZCIsCiAgICAicGF0aCI6IHBhdGgsIAogICAgInZhbHVlIjogdmFsdWUsCiAgfQp9CgojIHZhbHVlIG1hdGNoZXMgd2hhdCdzIGluIHN0YXRlLCBhbGxvdyBpdApzdGF0ZV9hbGxvd3Moa2V5LCB2YWx1ZSkgPSBhY3Rpb24gewogIHByaW50KCJzdGF0ZV9hbGxvd3MgMjogc3RhcnQiKQogIHN0YXRlIDo9IGdldF9zdGF0ZSgpCiAgcHJpbnQoInN0YXRlX2FsbG93cyAyOiBzdGF0ZVtrZXldID0iLCBzdGF0ZVtrZXldLCAidmFsdWUgPSIsIHZhbHVlKQogIHZhbHVlID09IHN0YXRlW2tleV0KICBwcmludCgic3RhdGVfYWxsb3dzIDI6IGZvdW5kIGtleSA9Iiwga2V5LCAidmFsdWUgPSIsIHZhbHVlLCAiIGluIHN0YXRlIikKICBhY3Rpb24gOj0gbnVsbAp9CgojIGhlbHBlciBmdW5jdGlvbnMgdG8gaW50ZXJhY3Qgd2l0aCB0aGUgc3RhdGUKZ2V0X3N0YXRlKCkgPSBzdGF0ZSB7CiAgc3RhdGUgOj0gZGF0YVsicHN0YXRlIl0KfQoKZ2V0X3N0YXRlX3ZhbChrZXkpID0gdmFsdWUgewogICAgc3RhdGUgOj0gZ2V0X3N0YXRlKCkKICAgIHZhbHVlIDo9IHN0YXRlW2tleV0KfQoKZ2V0X3N0YXRlX3BhdGgoa2V5KSA9IHBhdGggewogICAgIyBwcmVwZW5kICIvcHN0YXRlLyIgdG8ga2V5CiAgICBwYXRoIDo9IGNvbmNhdCgiLyIsIFsiL3BzdGF0ZSIsIGtleV0pCn0KCiMgSGVscGVyIGZ1bmN0aW9ucyB0byBjb25kaXRpb25hbGx5IGNvbmNhdGVuYXRlIG9wIGlzIG5vdCBudWxsCmNvbmNhdF9vcF9pZl9ub3RfbnVsbChvcHMsIG9wKSA9IHJlc3VsdCB7CiAgICBvcCA9PSBudWxsCiAgICByZXN1bHQgOj0gb3BzCn0KCmNvbmNhdF9vcF9pZl9ub3RfbnVsbChvcHMsIG9wKSA9IHJlc3VsdCB7CiAgICBvcCAhPSBudWxsCiAgICByZXN1bHQgOj0gYXJyYXkuY29uY2F0KG9wcywgW29wXSkKfQoKIyBSZWplY3QgdW5leHBlY3RlZCBhbm5vdGF0aW9ucy4KYWxsb3dfYW5ubyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19hbm5vIDE6IHN0YXJ0IikKCiAgICBub3QgaV9vY2kuQW5ub3RhdGlvbnMKCiAgICBwcmludCgiYWxsb3dfYW5ubyAxOiB0cnVlIikKfQphbGxvd19hbm5vKHBfb2NpLCBpX29jaSkgewogICAgcHJpbnQoImFsbG93X2Fubm8gMjogcCBBbm5vdGF0aW9ucyA9IiwgcF9vY2kuQW5ub3RhdGlvbnMpCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiBpIEFubm90YXRpb25zID0iLCBpX29jaS5Bbm5vdGF0aW9ucykKCiAgICBpX2tleXMgOj0gb2JqZWN0LmtleXMoaV9vY2kuQW5ub3RhdGlvbnMpCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiBpIGtleXMgPSIsIGlfa2V5cykKCiAgICBldmVyeSBpX2tleSBpbiBpX2tleXMgewogICAgICAgIGFsbG93X2Fubm9fa2V5KGlfa2V5LCBwX29jaSkKICAgIH0KCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiB0cnVlIikKfQoKYWxsb3dfYW5ub19rZXkoaV9rZXksIHBfb2NpKSB7CiAgICBwcmludCgiYWxsb3dfYW5ub19rZXkgMTogaSBrZXkgPSIsIGlfa2V5KQoKICAgIHN0YXJ0c3dpdGgoaV9rZXksICJpby5rdWJlcm5ldGVzLmNyaS4iKQoKICAgIHByaW50KCJhbGxvd19hbm5vX2tleSAxOiB0cnVlIikKfQphbGxvd19hbm5vX2tleShpX2tleSwgcF9vY2kpIHsKICAgIHByaW50KCJhbGxvd19hbm5vX2tleSAyOiBpIGtleSA9IiwgaV9rZXkpCgogICAgc29tZSBwX2tleSwgXyBpbiBwX29jaS5Bbm5vdGF0aW9ucwogICAgcF9rZXkgPT0gaV9rZXkKCiAgICBwcmludCgiYWxsb3dfYW5ub19rZXkgMjogdHJ1ZSIpCn0KCiMgR2V0IHRoZSB2YWx1ZSBvZiB0aGUgU19OQU1FX0tFWSBhbm5vdGF0aW9uIGFuZAojIGNvcnJlbGF0ZSBpdCB3aXRoIG90aGVyIGFubm90YXRpb25zIGFuZCBwcm9jZXNzIGZpZWxkcy4KYWxsb3dfYnlfYW5ubyhwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpIHsKICAgIHByaW50KCJhbGxvd19ieV9hbm5vIDE6IHN0YXJ0IikKCiAgICBub3QgcF9vY2kuQW5ub3RhdGlvbnNbU19OQU1FX0tFWV0KCiAgICBpX3NfbmFtZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMTogaV9zX25hbWUgPSIsIGlfc19uYW1lKQoKICAgIGlfc19uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FU1BBQ0VfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMTogaV9zX25hbWVzcGFjZSA9IiwgaV9zX25hbWVzcGFjZSkKCiAgICBhbGxvd19ieV9zYW5kYm94X25hbWUocF9vY2ksIGlfb2NpLCBwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBpX3NfbmFtZSwgaV9zX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfYnlfYW5ubyAxOiB0cnVlIikKfQphbGxvd19ieV9hbm5vKHBfb2NpLCBpX29jaSwgcF9zdG9yYWdlcywgaV9zdG9yYWdlcykgewogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMjogc3RhcnQiKQoKICAgIHBfc19uYW1lIDo9IHBfb2NpLkFubm90YXRpb25zW1NfTkFNRV9LRVldCiAgICBpX3NfbmFtZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMjogaV9zX25hbWUgPSIsIGlfc19uYW1lLCAicF9zX25hbWUgPSIsIHBfc19uYW1lKQoKICAgIGFsbG93X3NhbmRib3hfbmFtZShwX3NfbmFtZSwgaV9zX25hbWUpCgogICAgaV9zX25hbWVzcGFjZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwcmludCgiYWxsb3dfYnlfYW5ubyAyOiBpX3NfbmFtZXNwYWNlID0iLCBpX3NfbmFtZXNwYWNlKQoKICAgIGFsbG93X2J5X3NhbmRib3hfbmFtZShwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMsIGlfc19uYW1lLCBpX3NfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd19ieV9hbm5vIDI6IHRydWUiKQp9CgphbGxvd19ieV9zYW5kYm94X25hbWUocF9vY2ksIGlfb2NpLCBwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfYnlfc2FuZGJveF9uYW1lOiBzdGFydCIpCgogICAgaV9uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FU1BBQ0VfS0VZXQoKICAgIGFsbG93X2J5X2NvbnRhaW5lcl90eXBlcyhwX29jaSwgaV9vY2ksIHNfbmFtZSwgaV9uYW1lc3BhY2UpCiAgICBhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZChwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpCiAgICBhbGxvd19wcm9jZXNzKHBfb2NpLlByb2Nlc3MsIGlfb2NpLlByb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpCgogICAgcHJpbnQoImFsbG93X2J5X3NhbmRib3hfbmFtZTogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfbmFtZShwX3NfbmFtZSwgaV9zX25hbWUpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X25hbWU6IHN0YXJ0IikKICAgIHJlZ2V4Lm1hdGNoKHBfc19uYW1lLCBpX3NfbmFtZSkKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9uYW1lOiB0cnVlIikKfQoKIyBDaGVjayB0aGF0IHRoZSAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLXR5cGUiIGFuZAojICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIiBhbm5vdGF0aW9ucyBkZXNpZ25hdGUgdGhlCiMgZXhwZWN0ZWQgdHlwZSAtIGVpdGhlciBhICJzYW5kYm94IiBvciBhICJjb250YWluZXIiLiBUaGVuLCB2YWxpZGF0ZQojIG90aGVyIGFubm90YXRpb25zIGJhc2VkIG9uIHRoZSBhY3R1YWwgInNhbmRib3giIG9yICJjb250YWluZXIiIHZhbHVlCiMgZnJvbSB0aGUgaW5wdXQgY29udGFpbmVyLgphbGxvd19ieV9jb250YWluZXJfdHlwZXMocF9vY2ksIGlfb2NpLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfYnlfY29udGFpbmVyX3R5cGVzOiBjaGVja2luZyBpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSIpCgogICAgY190eXBlIDo9ICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSIKICAgIAogICAgcF9jcmlfdHlwZSA6PSBwX29jaS5Bbm5vdGF0aW9uc1tjX3R5cGVdCiAgICBpX2NyaV90eXBlIDo9IGlfb2NpLkFubm90YXRpb25zW2NfdHlwZV0KICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZXM6IHBfY3JpX3R5cGUgPSIsIHBfY3JpX3R5cGUsICJpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgcF9jcmlfdHlwZSA9PSBpX2NyaV90eXBlCgogICAgYWxsb3dfYnlfY29udGFpbmVyX3R5cGUoaV9jcmlfdHlwZSwgcF9vY2ksIGlfb2NpLCBzX25hbWUsIHNfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZXM6IHRydWUiKQp9CgphbGxvd19ieV9jb250YWluZXJfdHlwZShpX2NyaV90eXBlLCBwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAxOiBpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgaV9jcmlfdHlwZSA9PSAic2FuZGJveCIKCiAgICBpX2thdGFfdHlwZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1siaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5jb250YWluZXJfdHlwZSJdCiAgICBwcmludCgiYWxsb3dfYnlfY29udGFpbmVyX3R5cGUgMTogaV9rYXRhX3R5cGUgPSIsIGlfa2F0YV90eXBlKQogICAgaV9rYXRhX3R5cGUgPT0gInBvZF9zYW5kYm94IgoKICAgIGFsbG93X3NhbmRib3hfY29udGFpbmVyX25hbWUocF9vY2ksIGlfb2NpKQogICAgYWxsb3dfc2FuZGJveF9uZXRfbmFtZXNwYWNlKHBfb2NpLCBpX29jaSkKICAgIGFsbG93X3NhbmRib3hfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpCgogICAgcHJpbnQoImFsbG93X2J5X2NvbnRhaW5lcl90eXBlIDE6IHRydWUiKQp9CgphbGxvd19ieV9jb250YWluZXJfdHlwZShpX2NyaV90eXBlLCBwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiBpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgaV9jcmlfdHlwZSA9PSAiY29udGFpbmVyIgoKICAgIGlfa2F0YV90eXBlIDo9IGlfb2NpLkFubm90YXRpb25zWyJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIl0KICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiBpX2thdGFfdHlwZSA9IiwgaV9rYXRhX3R5cGUpCiAgICBpX2thdGFfdHlwZSA9PSAicG9kX2NvbnRhaW5lciIKCiAgICBhbGxvd19jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpCiAgICBhbGxvd19uZXRfbmFtZXNwYWNlKHBfb2NpLCBpX29jaSkKICAgIGFsbG93X2xvZ19kaXJlY3RvcnkocF9vY2ksIGlfb2NpKQoKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiB0cnVlIikKfQoKIyAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLW5hbWUiIGFubm90YXRpb24KYWxsb3dfc2FuZGJveF9jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X2NvbnRhaW5lcl9uYW1lOiBzdGFydCIpCgogICAgY29udGFpbmVyX2Fubm90YXRpb25fbWlzc2luZyhwX29jaSwgaV9vY2ksICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItbmFtZSIpCgogICAgcHJpbnQoImFsbG93X3NhbmRib3hfY29udGFpbmVyX25hbWU6IHRydWUiKQp9CgphbGxvd19jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19jb250YWluZXJfbmFtZTogc3RhcnQiKQoKICAgIGFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uKHBfb2NpLCBpX29jaSwgImlvLmt1YmVybmV0ZXMuY3JpLmNvbnRhaW5lci1uYW1lIikKCiAgICBwcmludCgiYWxsb3dfY29udGFpbmVyX25hbWU6IHRydWUiKQp9Cgpjb250YWluZXJfYW5ub3RhdGlvbl9taXNzaW5nKHBfb2NpLCBpX29jaSwga2V5KSB7CiAgICBwcmludCgiY29udGFpbmVyX2Fubm90YXRpb25fbWlzc2luZzoiLCBrZXkpCgogICAgbm90IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIG5vdCBpX29jaS5Bbm5vdGF0aW9uc1trZXldCgogICAgcHJpbnQoImNvbnRhaW5lcl9hbm5vdGF0aW9uX21pc3Npbmc6IHRydWUiKQp9CgphbGxvd19jb250YWluZXJfYW5ub3RhdGlvbihwX29jaSwgaV9vY2ksIGtleSkgewogICAgcHJpbnQoImFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uOiBrZXkgPSIsIGtleSkKCiAgICBwX3ZhbHVlIDo9IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIGlfdmFsdWUgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgcHJpbnQoImFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uOiBwX3ZhbHVlID0iLCBwX3ZhbHVlLCAiaV92YWx1ZSA9IiwgaV92YWx1ZSkKCiAgICBwX3ZhbHVlID09IGlfdmFsdWUKCiAgICBwcmludCgiYWxsb3dfY29udGFpbmVyX2Fubm90YXRpb246IHRydWUiKQp9CgojICJuZXJkY3RsL25ldHdvcmstbmFtZXNwYWNlIiBhbm5vdGF0aW9uCmFsbG93X3NhbmRib3hfbmV0X25hbWVzcGFjZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X25ldF9uYW1lc3BhY2U6IHN0YXJ0IikKCiAgICBrZXkgOj0gIm5lcmRjdGwvbmV0d29yay1uYW1lc3BhY2UiCgogICAgcF9uYW1lc3BhY2UgOj0gcF9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgaV9uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgcHJpbnQoImFsbG93X3NhbmRib3hfbmV0X25hbWVzcGFjZTogcF9uYW1lc3BhY2UgPSIsIHBfbmFtZXNwYWNlLCAiaV9uYW1lc3BhY2UgPSIsIGlfbmFtZXNwYWNlKQoKICAgIHJlZ2V4Lm1hdGNoKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9uZXRfbmFtZXNwYWNlOiB0cnVlIikKfQoKYWxsb3dfbmV0X25hbWVzcGFjZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19uZXRfbmFtZXNwYWNlOiBzdGFydCIpCgogICAga2V5IDo9ICJuZXJkY3RsL25ldHdvcmstbmFtZXNwYWNlIgoKICAgIG5vdCBwX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICBub3QgaV9vY2kuQW5ub3RhdGlvbnNba2V5XQoKICAgIHByaW50KCJhbGxvd19uZXRfbmFtZXNwYWNlOiB0cnVlIikKfQoKIyAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1sb2ctZGlyZWN0b3J5IiBhbm5vdGF0aW9uCmFsbG93X3NhbmRib3hfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X2xvZ19kaXJlY3Rvcnk6IHN0YXJ0IikKCiAgICBrZXkgOj0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbG9nLWRpcmVjdG9yeSIKCiAgICBwX2RpciA6PSBwX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICByZWdleDEgOj0gcmVwbGFjZShwX2RpciwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHJlZ2V4MiA6PSByZXBsYWNlKHJlZ2V4MSwgIiQoc2FuZGJveC1uYW1lc3BhY2UpIiwgc19uYW1lc3BhY2UpCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiByZWdleDIgPSIsIHJlZ2V4MikKCiAgICBpX2RpciA6PSBpX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiBpX2RpciA9IiwgaV9kaXIpCgogICAgcmVnZXgubWF0Y2gocmVnZXgyLCBpX2RpcikKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiB0cnVlIikKfQoKYWxsb3dfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19sb2dfZGlyZWN0b3J5OiBzdGFydCIpCgogICAga2V5IDo9ICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWxvZy1kaXJlY3RvcnkiCgogICAgbm90IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIG5vdCBpX29jaS5Bbm5vdGF0aW9uc1trZXldCgogICAgcHJpbnQoImFsbG93X2xvZ19kaXJlY3Rvcnk6IHRydWUiKQp9CgphbGxvd19kZXZpY2VzKHBfZGV2aWNlcywgaV9kZXZpY2VzKSB7CiAgICBwcmludCgiYWxsb3dfZGV2aWNlczogc3RhcnQiKQogICAgZXZlcnkgaV9kZXZpY2UgaW4gaV9kZXZpY2VzIHsKICAgICAgICBwcmludCgiYWxsb3dfZGV2aWNlczogaV9kZXZpY2UgPSIsIGlfZGV2aWNlKQogICAgICAgIHNvbWUgcF9kZXZpY2UgaW4gcF9kZXZpY2VzCiAgICAgICAgcF9kZXZpY2UuY29udGFpbmVyX3BhdGggPT0gaV9kZXZpY2UuY29udGFpbmVyX3BhdGgKICAgIH0KICAgIHByaW50KCJhbGxvd19kZXZpY2VzOiB0cnVlIikKfQoKYWxsb3dfbGludXgoc3RhdGVfb3BzLCBwX29jaSwgaV9vY2kpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIHBfbmFtZXNwYWNlcyA6PSBwX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbGludXg6IHAgbmFtZXNwYWNlcyA9IiwgcF9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlcyA6PSBpX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbGludXg6IGkgbmFtZXNwYWNlcyA9IiwgaV9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlX3dpdGhvdXRfbmV0d29yayA6PSBbb2JqIHwgb2JqIDo9IGlfbmFtZXNwYWNlc1tfXTsgb2JqLlR5cGUgIT0gIm5ldHdvcmsiXQoKICAgIHByaW50KCJhbGxvd19saW51eDogaV9uYW1lc3BhY2Vfd2l0aG91dF9uZXR3b3JrID0iLCBpX25hbWVzcGFjZV93aXRob3V0X25ldHdvcmspCgogICAgcF9uYW1lc3BhY2VzID09IGlfbmFtZXNwYWNlX3dpdGhvdXRfbmV0d29yawoKICAgIGFsbG93X21hc2tlZF9wYXRocyhwX29jaSwgaV9vY2kpCiAgICBhbGxvd19yZWFkb25seV9wYXRocyhwX29jaSwgaV9vY2kpCiAgICBhbGxvd19saW51eF9kZXZpY2VzKHBfb2NpLkxpbnV4LkRldmljZXMsIGlfb2NpLkxpbnV4LkRldmljZXMpCiAgICBhbGxvd19saW51eF9zeXNjdGwocF9vY2kuTGludXgsIGlfb2NpLkxpbnV4KQogICAgcmV0IDo9IGFsbG93X25ldHdvcmtfbmFtZXNwYWNlX3N0YXJ0KHN0YXRlX29wcywgcF9vY2ksIGlfb2NpKQogICAgcmV0LmFsbG93ZWQKCiAgICBvcHMgOj0gcmV0Lm9wcwoKICAgIHByaW50KCJhbGxvd19saW51eDogdHJ1ZSIpCn0KCiMgUmV0cmlldmUgdGhlICJuZXR3b3JrIiBuYW1lc3BhY2UgZnJvbSB0aGUgaW5wdXQgZGF0YSBhbmQgcGFzcyBpdCBvbiBmb3IgdGhlCiMgbmV0d29yayBuYW1lc3BhY2UgcG9saWN5IGNoZWNrcy4KYWxsb3dfbmV0d29ya19uYW1lc3BhY2Vfc3RhcnQoc3RhdGVfb3BzLCBwX29jaSwgaV9vY2kpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIHByaW50KCJhbGxvd19uZXR3b3JrX25hbWVzcGFjZSBzdGFydDogc3RhcnQiKQoKICAgIHBfbmFtZXNwYWNlcyA6PSBwX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IHAgbmFtZXNwYWNlcyA9IiwgcF9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlcyA6PSBpX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IGkgbmFtZXNwYWNlcyA9IiwgaV9uYW1lc3BhY2VzKQoKICAgICMgUmV0dXJuIHBhdGggb2YgdGhlICJuZXR3b3JrIiBuYW1lc3BhY2UKICAgIG5ldHdvcmtfbnMgOj0gW29iaiB8IG9iaiA6PSBpX25hbWVzcGFjZXNbX107IG9iai5UeXBlID09ICJuZXR3b3JrIl0KCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IG5ldHdvcmtfbnMgPSIsIG5ldHdvcmtfbnMpCgogICAgcmV0IDo9IGFsbG93X25ldHdvcmtfbmFtZXNwYWNlKHN0YXRlX29wcywgbmV0d29ya19ucykKICAgIHJldC5hbGxvd2VkCgogICAgb3BzIDo9IHJldC5vcHMKfQoKIyBUaGlzIHJ1bGUgaXMgd2hlbiB0aGVyZSdzIG5vIG5ldHdvcmsgbmFtZXNwYWNlIGluIHRoZSBpbnB1dCBkYXRhLgphbGxvd19uZXR3b3JrX25hbWVzcGFjZShzdGF0ZV9vcHMsIG5ldHdvcmtfbnMpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIGNvdW50KG5ldHdvcmtfbnMpID09IDAKCiAgICBuZXR3b3JrX25zX3BhdGggPSAiIgoKICAgIGFkZF9uZXR3b3JrX25hbWVzcGFjZV90b19zdGF0ZSA6PSBzdGF0ZV9hbGxvd3MoIm5ldHdvcmtfbmFtZXNwYWNlIiwgbmV0d29ya19uc19wYXRoKQogICAgb3BzIDo9IGNvbmNhdF9vcF9pZl9ub3RfbnVsbChzdGF0ZV9vcHMsIGFkZF9uZXR3b3JrX25hbWVzcGFjZV90b19zdGF0ZSkKCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2UgMTogdHJ1ZSIpCn0KCiMgVGhpcyBydWxlIGlzIHdoZW4gdGhlcmUncyBleGFjdGx5IG9uZSBuZXR3b3JrIG5hbWVzcGFjZSBpbiB0aGUgaW5wdXQgZGF0YS4KYWxsb3dfbmV0d29ya19uYW1lc3BhY2Uoc3RhdGVfb3BzLCBuZXR3b3JrX25zKSA6PSB7Im9wcyI6IG9wcywgImFsbG93ZWQiOiB0cnVlfSB7CiAgICBjb3VudChuZXR3b3JrX25zKSA9PSAxCgogICAgYWRkX25ldHdvcmtfbmFtZXNwYWNlX3RvX3N0YXRlIDo9IHN0YXRlX2FsbG93cygibmV0d29ya19uYW1lc3BhY2UiLCBuZXR3b3JrX25zWzBdLlBhdGgpCiAgICBvcHMgOj0gY29uY2F0X29wX2lmX25vdF9udWxsKHN0YXRlX29wcywgYWRkX25ldHdvcmtfbmFtZXNwYWNlX3RvX3N0YXRlKQoKICAgIHByaW50KCJhbGxvd19uZXR3b3JrX25hbWVzcGFjZSAyOiB0cnVlIikKfQoKYWxsb3dfbWFza2VkX3BhdGhzKHBfb2NpLCBpX29jaSkgewogICAgcF9wYXRocyA6PSBwX29jaS5MaW51eC5NYXNrZWRQYXRocwogICAgcHJpbnQoImFsbG93X21hc2tlZF9wYXRocyAxOiBwX3BhdGhzID0iLCBwX3BhdGhzKQoKICAgIGlfcGF0aHMgOj0gaV9vY2kuTGludXguTWFza2VkUGF0aHMKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aHMgMTogaV9wYXRocyA9IiwgaV9wYXRocykKCiAgICBhbGxvd19tYXNrZWRfcGF0aHNfYXJyYXkocF9wYXRocywgaV9wYXRocykKCiAgICBwcmludCgiYWxsb3dfbWFza2VkX3BhdGhzIDE6IHRydWUiKQp9CmFsbG93X21hc2tlZF9wYXRocyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aHMgMjogc3RhcnQiKQoKICAgIG5vdCBwX29jaS5MaW51eC5NYXNrZWRQYXRocwogICAgbm90IGlfb2NpLkxpbnV4Lk1hc2tlZFBhdGhzCgogICAgcHJpbnQoImFsbG93X21hc2tlZF9wYXRocyAyOiB0cnVlIikKfQoKIyBBbGwgdGhlIHBvbGljeSBtYXNrZWQgcGF0aHMgbXVzdCBiZSBtYXNrZWQgaW4gdGhlIGlucHV0IGRhdGEgdG9vLgojIElucHV0IGlzIGFsbG93ZWQgdG8gaGF2ZSBtb3JlIG1hc2tlZCBwYXRocyB0aGFuIHRoZSBwb2xpY3kuCmFsbG93X21hc2tlZF9wYXRoc19hcnJheShwX2FycmF5LCBpX2FycmF5KSB7CiAgICBldmVyeSBwX2VsZW0gaW4gcF9hcnJheSB7CiAgICAgICAgYWxsb3dfbWFza2VkX3BhdGgocF9lbGVtLCBpX2FycmF5KQogICAgfQp9CgphbGxvd19tYXNrZWRfcGF0aChwX2VsZW0sIGlfYXJyYXkpIHsKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aDogcF9lbGVtID0iLCBwX2VsZW0pCgogICAgc29tZSBpX2VsZW0gaW4gaV9hcnJheQogICAgcF9lbGVtID09IGlfZWxlbQoKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aDogdHJ1ZSIpCn0KCmFsbG93X3JlYWRvbmx5X3BhdGhzKHBfb2NpLCBpX29jaSkgewogICAgcF9wYXRocyA6PSBwX29jaS5MaW51eC5SZWFkb25seVBhdGhzCiAgICBwcmludCgiYWxsb3dfcmVhZG9ubHlfcGF0aHMgMTogcF9wYXRocyA9IiwgcF9wYXRocykKCiAgICBpX3BhdGhzIDo9IGlfb2NpLkxpbnV4LlJlYWRvbmx5UGF0aHMKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAxOiBpX3BhdGhzID0iLCBpX3BhdGhzKQoKICAgIGFsbG93X3JlYWRvbmx5X3BhdGhzX2FycmF5KHBfcGF0aHMsIGlfcGF0aHMsIGlfb2NpLkxpbnV4Lk1hc2tlZFBhdGhzKQoKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAxOiB0cnVlIikKfQphbGxvd19yZWFkb25seV9wYXRocyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAyOiBzdGFydCIpCgogICAgbm90IHBfb2NpLkxpbnV4LlJlYWRvbmx5UGF0aHMKICAgIG5vdCBpX29jaS5MaW51eC5SZWFkb25seVBhdGhzCgogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGhzIDI6IHRydWUiKQp9CgojIEFsbCB0aGUgcG9saWN5IHJlYWRvbmx5IHBhdGhzIG11c3QgYmUgZWl0aGVyOgojIC0gUHJlc2VudCBpbiB0aGUgaW5wdXQgcmVhZG9ubHkgcGF0aHMsIG9yCiMgLSBQcmVzZW50IGluIHRoZSBpbnB1dCBtYXNrZWQgcGF0aHMuCiMgSW5wdXQgaXMgYWxsb3dlZCB0byBoYXZlIG1vcmUgcmVhZG9ubHkgcGF0aHMgdGhhbiB0aGUgcG9saWN5LgphbGxvd19yZWFkb25seV9wYXRoc19hcnJheShwX2FycmF5LCBpX2FycmF5LCBtYXNrZWRfcGF0aHMpIHsKICAgIGV2ZXJ5IHBfZWxlbSBpbiBwX2FycmF5IHsKICAgICAgICBhbGxvd19yZWFkb25seV9wYXRoKHBfZWxlbSwgaV9hcnJheSwgbWFza2VkX3BhdGhzKQogICAgfQp9CgphbGxvd19yZWFkb25seV9wYXRoKHBfZWxlbSwgaV9hcnJheSwgbWFza2VkX3BhdGhzKSB7CiAgICBwcmludCgiYWxsb3dfcmVhZG9ubHlfcGF0aCAxOiBwX2VsZW0gPSIsIHBfZWxlbSkKCiAgICBzb21lIGlfZWxlbSBpbiBpX2FycmF5CiAgICBwX2VsZW0gPT0gaV9lbGVtCgogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGggMTogdHJ1ZSIpCn0KYWxsb3dfcmVhZG9ubHlfcGF0aChwX2VsZW0sIGlfYXJyYXksIG1hc2tlZF9wYXRocykgewogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGggMjogcF9lbGVtID0iLCBwX2VsZW0pCgogICAgc29tZSBpX21hc2tlZCBpbiBtYXNrZWRfcGF0aHMKICAgIHBfZWxlbSA9PSBpX21hc2tlZAoKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRoIDI6IHRydWUiKQp9CgphbGxvd19saW51eF9kZXZpY2VzKHBfZGV2aWNlcywgaV9kZXZpY2VzKSB7CiAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogc3RhcnQiKQogICAgZXZlcnkgaV9kZXZpY2UgaW4gaV9kZXZpY2VzIHsKICAgICAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogaV9kZXZpY2UgPSIsIGlfZGV2aWNlKQogICAgICAgIHNvbWUgcF9kZXZpY2UgaW4gcF9kZXZpY2VzCiAgICAgICAgaV9kZXZpY2UuUGF0aCA9PSBwX2RldmljZS5QYXRoCiAgICB9CiAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogdHJ1ZSIpCn0KCmFsbG93X2xpbnV4X3N5c2N0bChwX2xpbnV4LCBpX2xpbnV4KSB7CiAgICBwcmludCgiYWxsb3dfbGludXhfc3lzY3RsIDE6IHN0YXJ0IikKICAgIG5vdCBpX2xpbnV4LlN5c2N0bAogICAgcHJpbnQoImFsbG93X2xpbnV4X3N5c2N0bCAxOiB0cnVlIikKfQoKYWxsb3dfbGludXhfc3lzY3RsKHBfbGludXgsIGlfbGludXgpIHsKICAgIHByaW50KCJhbGxvd19saW51eF9zeXNjdGwgMjogc3RhcnQiKQogICAgcF9zeXNjdGwgOj0gcF9saW51eC5TeXNjdGwKICAgIGlfc3lzY3RsIDo9IGlfbGludXguU3lzY3RsCiAgICBldmVyeSBpX25hbWUsIGlfdmFsIGluIGlfc3lzY3RsIHsKICAgICAgICBwcmludCgiYWxsb3dfbGludXhfc3lzY3RsIDI6IGlfbmFtZSA9IiwgaV9uYW1lLCAiaV92YWwgPSIsIGlfdmFsKQogICAgICAgIHBfc3lzY3RsW2lfbmFtZV0gPT0gaV92YWwKICAgIH0KICAgIHByaW50KCJhbGxvd19saW51eF9zeXNjdGwgMjogdHJ1ZSIpCn0KCiMgQ2hlY2sgdGhlIGNvbnNpc3RlbmN5IG9mIHRoZSBpbnB1dCAiaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5idW5kbGVfcGF0aCIKIyBhbmQgaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCIgdmFsdWVzIHdpdGggb3RoZXIgZmllbGRzLgphbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZChwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpIHsKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogc3RhcnQiKQoKICAgIGJ1bmRsZV9wYXRoIDo9IGlfb2NpLkFubm90YXRpb25zWyJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmJ1bmRsZV9wYXRoIl0KICAgIGJ1bmRsZV9pZCA6PSByZXBsYWNlKGJ1bmRsZV9wYXRoLCAiL3J1bi9jb250YWluZXJkL2lvLmNvbnRhaW5lcmQucnVudGltZS52Mi50YXNrL2s4cy5pby8iLCAiIikKCiAgICBidW5kbGVfaWRfZm9ybWF0IDo9IGNvbmNhdCgiIiwgWyJeIiwgQlVORExFX0lELCAiJCJdKQogICAgcmVnZXgubWF0Y2goYnVuZGxlX2lkX2Zvcm1hdCwgYnVuZGxlX2lkKQoKICAgIGtleSA6PSAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCIKCiAgICBwX3JlZ2V4IDo9IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIHNhbmRib3hfaWQgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQoKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogc2FuZGJveF9pZCA9Iiwgc2FuZGJveF9pZCwgInJlZ2V4ID0iLCBwX3JlZ2V4KQogICAgcmVnZXgubWF0Y2gocF9yZWdleCwgc2FuZGJveF9pZCkKCiAgICBhbGxvd19yb290X3BhdGgocF9vY2ksIGlfb2NpLCBidW5kbGVfaWQpCgogICAgZXZlcnkgaV9tb3VudCBpbiBpX29jaS5Nb3VudHMgewogICAgICAgIGFsbG93X21vdW50KHBfb2NpLCBpX21vdW50LCBpX3N0b3JhZ2VzLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpCiAgICB9CgogICAgYWxsb3dfc3RvcmFnZXMocF9zdG9yYWdlcywgaV9zdG9yYWdlcywgYnVuZGxlX2lkLCBzYW5kYm94X2lkKQoKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogdHJ1ZSIpCn0KCmFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHBfcHJvY2VzcyA9IiwgcF9wcm9jZXNzKQogICAgcHJpbnQoImFsbG93X3Byb2Nlc3NfY29tbW9uOiBpX3Byb2Nlc3MgPSAiLCBpX3Byb2Nlc3MpCiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHNfbmFtZSA9Iiwgc19uYW1lKQoKICAgIHBfcHJvY2Vzcy5Dd2QgPT0gaV9wcm9jZXNzLkN3ZAogICAgcF9wcm9jZXNzLk5vTmV3UHJpdmlsZWdlcyA9PSBpX3Byb2Nlc3MuTm9OZXdQcml2aWxlZ2VzCgogICAgYWxsb3dfdXNlcihwX3Byb2Nlc3MsIGlfcHJvY2VzcykKICAgIGFsbG93X2VudihwX3Byb2Nlc3MsIGlfcHJvY2Vzcywgc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHRydWUiKQp9CgojIENvbXBhcmUgdGhlIE9DSSBQcm9jZXNzIGZpZWxkIG9mIGEgcG9saWN5IGNvbnRhaW5lciB3aXRoIHRoZSBpbnB1dCBPQ0kgUHJvY2VzcyBmcm9tIGEgQ3JlYXRlQ29udGFpbmVyUmVxdWVzdAphbGxvd19wcm9jZXNzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfcHJvY2Vzczogc3RhcnQiKQoKICAgIGFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgYWxsb3dfY2FwcyhwX3Byb2Nlc3MuQ2FwYWJpbGl0aWVzLCBpX3Byb2Nlc3MuQ2FwYWJpbGl0aWVzKQogICAgcF9wcm9jZXNzLlRlcm1pbmFsID09IGlfcHJvY2Vzcy5UZXJtaW5hbAoKICAgIHByaW50KCJhbGxvd19wcm9jZXNzOiB0cnVlIikKfQoKIyBDb21wYXJlIHRoZSBPQ0kgUHJvY2VzcyBmaWVsZCBvZiBhIHBvbGljeSBjb250YWluZXIgd2l0aCB0aGUgaW5wdXQgcHJvY2VzcyBmaWVsZCBmcm9tIEV4ZWNQcm9jZXNzUmVxdWVzdAphbGxvd19pbnRlcmFjdGl2ZV9wcm9jZXNzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfaW50ZXJhY3RpdmVfcHJvY2Vzczogc3RhcnQiKQoKICAgIGFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgYWxsb3dfZXhlY19jYXBzKGlfcHJvY2Vzcy5DYXBhYmlsaXRpZXMpCgogICAgIyBUaGVzZSBhcmUgY29tbWFuZHMgZW5hYmxlZCB1c2luZyBFeGVjUHJvY2Vzc1JlcXVlc3QgY29tbWFuZHMgYW5kL29yIHJlZ2V4IGZyb20gdGhlIHNldHRpbmdzIGZpbGUuCiAgICAjIFRoZXkgY2FuIGJlIGV4ZWN1dGVkIGludGVyYWN0aXZlbHkgc28gYWxsb3cgdGhlbSB0byB1c2UgYW55IHZhbHVlIGZvciBpX3Byb2Nlc3MuVGVybWluYWwuCgogICAgcHJpbnQoImFsbG93X2ludGVyYWN0aXZlX3Byb2Nlc3M6IHRydWUiKQp9CgojIENvbXBhcmUgdGhlIE9DSSBQcm9jZXNzIGZpZWxkIG9mIGEgcG9saWN5IGNvbnRhaW5lciB3aXRoIHRoZSBpbnB1dCBwcm9jZXNzIGZpZWxkIGZyb20gRXhlY1Byb2Nlc3NSZXF1ZXN0CmFsbG93X3Byb2JlX3Byb2Nlc3MocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19wcm9iZV9wcm9jZXNzOiBzdGFydCIpCgogICAgYWxsb3dfcHJvY2Vzc19jb21tb24ocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpCiAgICBhbGxvd19leGVjX2NhcHMoaV9wcm9jZXNzLkNhcGFiaWxpdGllcykKICAgIHBfcHJvY2Vzcy5UZXJtaW5hbCA9PSBpX3Byb2Nlc3MuVGVybWluYWwKCiAgICBwcmludCgiYWxsb3dfcHJvYmVfcHJvY2VzczogdHJ1ZSIpCn0KCmFsbG93X3VzZXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MpIHsKICAgIHBfdXNlciA6PSBwX3Byb2Nlc3MuVXNlcgogICAgaV91c2VyIDo9IGlfcHJvY2Vzcy5Vc2VyCgogICAgcHJpbnQoImFsbG93X3VzZXI6IGlucHV0IHVpZCA9IiwgaV91c2VyLlVJRCwgInBvbGljeSB1aWQgPSIsIHBfdXNlci5VSUQpCiAgICBwX3VzZXIuVUlEID09IGlfdXNlci5VSUQKCiAgICAjIFRPRE86IHRyYWNrIGRvd24gdGhlIHJlYXNvbiBmb3IgcmVnaXN0cnkuazhzLmlvL3BhdXNlOjMuOSBiZWluZwogICAgIyAgICAgICBleGVjdXRlZCB3aXRoIGdpZCA9IDAgZGVzcGl0ZSBoYXZpbmcgIjY1NTM1OjY1NTM1IiBpbiBpdHMgY29udGFpbmVyIGltYWdlCiAgICAjICAgICAgIGNvbmZpZy4KICAgICNwcmludCgiYWxsb3dfdXNlcjogaW5wdXQgZ2lkID0iLCBpX3VzZXIuR0lELCAicG9saWN5IGdpZCA9IiwgcF91c2VyLkdJRCkKICAgICNwX3VzZXIuR0lEID09IGlfdXNlci5HSUQKCiAgICAjIFRPRE86IGNvbXBhcmUgdGhlIGFkZGl0aW9uYWxHaWRzIGZpZWxkIHRvbyBhZnRlciBjb21wdXRpbmcgaXRzIHZhbHVlCiAgICAjIGJhc2VkIG9uIC9ldGMvcGFzc3dkIGFuZCAvZXRjL2dyb3VwIGZyb20gdGhlIGNvbnRhaW5lciBpbWFnZS4KfQoKYWxsb3dfZGVwcmVjYXRlZF9hcmdzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZ3MgMTogbm8gYXJncyIpCgogICAgbm90IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJncwogICAgbm90IGlfcHJvY2Vzcy5BcmdzCgogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAxOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZ3MocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSkgewogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiBwb2xpY3kgYXJncyA9IiwgcF9wcm9jZXNzLkRlcHJlY2F0ZWRBcmdzKQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiBpbnB1dCBhcmdzID0iLCBpX3Byb2Nlc3MuQXJncykKCiAgICBjb3VudChwX3Byb2Nlc3MuRGVwcmVjYXRlZEFyZ3MpID09IGNvdW50KGlfcHJvY2Vzcy5BcmdzKQoKICAgIGV2ZXJ5IGksIGlfYXJnIGluIGlfcHJvY2Vzcy5BcmdzIHsKICAgICAgICBhbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpCiAgICB9CgogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDE6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgcF9hcmcyIDo9IHJlcGxhY2UocF9hcmcsICIkJCIsICIkIikKICAgIHBfYXJnMiA9PSBpX2FyZwoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAxOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDI6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgIyBUT0RPOiBjYW4gJChub2RlLW5hbWUpIGJlIGhhbmRsZWQgYmV0dGVyPwogICAgY29udGFpbnMocF9hcmcsICIkKG5vZGUtbmFtZSkiKQoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAyOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDM6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgcF9hcmcyIDo9IHJlcGxhY2UocF9hcmcsICIkJCIsICIkIikKICAgIHBfYXJnMyA6PSByZXBsYWNlKHBfYXJnMiwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAzOiBwX2FyZzMgPSIsIHBfYXJnMykKICAgIHBfYXJnMyA9PSBpX2FyZwoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAzOiB0cnVlIikKfQoKIyBPQ0kgcHJvY2Vzcy5FbnYgZmllbGQKYWxsb3dfZW52KHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfZW52OiBwIGVudiA9IiwgcF9wcm9jZXNzLkVudikKICAgIHByaW50KCJhbGxvd19lbnY6IGkgZW52ID0iLCBpX3Byb2Nlc3MuRW52KQoKICAgIGV2ZXJ5IGlfdmFyIGluIGlfcHJvY2Vzcy5FbnYgewogICAgICAgIHByaW50KCJhbGxvd19lbnY6IGlfdmFyID0iLCBpX3ZhcikKICAgICAgICBhbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgfQoKICAgIHByaW50KCJhbGxvd19lbnY6IHRydWUiKQp9CgojIEFsbG93IGlucHV0IGVudiB2YXJpYWJsZXMgdGhhdCBhcmUgcHJlc2VudCBpbiB0aGUgcG9saWN5IGRhdGEgdG9vLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHBfdmFyID09IGlfdmFyCiAgICBwcmludCgiYWxsb3dfdmFyIDE6IHRydWUiKQp9CgojIE1hdGNoIGlucHV0IHdpdGggb25lIG9mIHRoZSBwb2xpY3kgdmFyaWFibGVzLCBhZnRlciBzdWJzdGl0dXRpbmcgJChzYW5kYm94LW5hbWUpLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHByaW50KCJhbGxvd192YXIgMjogcF92YXIgPSIsIHBfdmFyKQoKICAgIHBfdmFyX3NwbGl0IDo9IHNwbGl0KHBfdmFyLCAiPSIpCiAgICBjb3VudChwX3Zhcl9zcGxpdCkgPT0gMgoKICAgIHBfdmFyX3NwbGl0WzFdID09ICIkKHNhbmRib3gtbmFtZSkiCgogICAgaV92YXJfc3BsaXQgOj0gc3BsaXQoaV92YXIsICI9IikKICAgIGNvdW50KGlfdmFyX3NwbGl0KSA9PSAyCgogICAgaV92YXJfc3BsaXRbMF0gPT0gcF92YXJfc3BsaXRbMF0KICAgIHJlZ2V4Lm1hdGNoKHNfbmFtZSwgaV92YXJfc3BsaXRbMV0pCgogICAgcHJpbnQoImFsbG93X3ZhciAyOiB0cnVlIikKfQoKIyBBbGxvdyBpbnB1dCBlbnYgdmFyaWFibGVzIHRoYXQgbWF0Y2ggd2l0aCBhIHJlcXVlc3RfZGVmYXVsdHMgcmVnZXguCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHNvbWUgcF9yZWdleDEgaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5DcmVhdGVDb250YWluZXJSZXF1ZXN0LmFsbG93X2Vudl9yZWdleAogICAgcF9yZWdleDIgOj0gcmVwbGFjZShwX3JlZ2V4MSwgIiQoaXB2NF9hKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcHY0X2EpCiAgICBwX3JlZ2V4MyA6PSByZXBsYWNlKHBfcmVnZXgyLCAiJChpcF9wKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcF9wKQogICAgcF9yZWdleDQgOj0gcmVwbGFjZShwX3JlZ2V4MywgIiQoc3ZjX25hbWUpIiwgcG9saWN5X2RhdGEuY29tbW9uLnN2Y19uYW1lKQogICAgcF9yZWdleDUgOj0gcmVwbGFjZShwX3JlZ2V4NCwgIiQoZG5zX2xhYmVsKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5kbnNfbGFiZWwpCgogICAgcHJpbnQoImFsbG93X3ZhciAzOiBwX3JlZ2V4NSA9IiwgcF9yZWdleDUpCiAgICByZWdleC5tYXRjaChwX3JlZ2V4NSwgaV92YXIpCgogICAgcHJpbnQoImFsbG93X3ZhciAzOiB0cnVlIikKfQoKIyBBbGxvdyBmaWVsZFJlZiAiZmllbGRQYXRoOiBzdGF0dXMucG9kSVAiIHZhbHVlcy4KYWxsb3dfdmFyKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBpX3Zhciwgc19uYW1lLCBzX25hbWVzcGFjZSkgewogICAgbmFtZV92YWx1ZSA6PSBzcGxpdChpX3ZhciwgIj0iKQogICAgY291bnQobmFtZV92YWx1ZSkgPT0gMgogICAgaXNfaXAobmFtZV92YWx1ZVsxXSkKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIGFsbG93X3BvZF9pcF92YXIobmFtZV92YWx1ZVswXSwgcF92YXIpCgogICAgcHJpbnQoImFsbG93X3ZhciA0OiB0cnVlIikKfQoKIyBBbGxvdyBjb21tb24gZmllbGRSZWYgdmFyaWFibGVzLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBuYW1lX3ZhbHVlIDo9IHNwbGl0KGlfdmFyLCAiPSIpCiAgICBjb3VudChuYW1lX3ZhbHVlKSA9PSAyCgogICAgc29tZSBwX3ZhciBpbiBwX3Byb2Nlc3MuRW52CiAgICBwX25hbWVfdmFsdWUgOj0gc3BsaXQocF92YXIsICI9IikKICAgIGNvdW50KHBfbmFtZV92YWx1ZSkgPT0gMgoKICAgIHBfbmFtZV92YWx1ZVswXSA9PSBuYW1lX3ZhbHVlWzBdCgogICAgIyBUT0RPOiBzaG91bGQgdGhlc2UgYmUgaGFuZGxlZCBpbiBhIGRpZmZlcmVudCB3YXk/CiAgICBhbHdheXNfYWxsb3dlZCA6PSBbIiQoaG9zdC1uYW1lKSIsICIkKG5vZGUtbmFtZSkiLCAiJChwb2QtdWlkKSJdCiAgICBzb21lIGFsbG93ZWQgaW4gYWx3YXlzX2FsbG93ZWQKICAgIGNvbnRhaW5zKHBfbmFtZV92YWx1ZVsxXSwgYWxsb3dlZCkKCiAgICBwcmludCgiYWxsb3dfdmFyIDU6IHRydWUiKQp9CgojIEFsbG93IGZpZWxkUmVmICJmaWVsZFBhdGg6IHN0YXR1cy5ob3N0SVAiIHZhbHVlcy4KYWxsb3dfdmFyKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBpX3Zhciwgc19uYW1lLCBzX25hbWVzcGFjZSkgewogICAgbmFtZV92YWx1ZSA6PSBzcGxpdChpX3ZhciwgIj0iKQogICAgY291bnQobmFtZV92YWx1ZSkgPT0gMgogICAgaXNfaXAobmFtZV92YWx1ZVsxXSkKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIGFsbG93X2hvc3RfaXBfdmFyKG5hbWVfdmFsdWVbMF0sIHBfdmFyKQoKICAgIHByaW50KCJhbGxvd192YXIgNjogdHJ1ZSIpCn0KCiMgQWxsb3cgcmVzb3VyY2VGaWVsZFJlZiB2YWx1ZXMgKGUuZy4sICJsaW1pdHMuY3B1IikuCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIG5hbWVfdmFsdWUgOj0gc3BsaXQoaV92YXIsICI9IikKICAgIGNvdW50KG5hbWVfdmFsdWUpID09IDIKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHBfbmFtZV92YWx1ZSA6PSBzcGxpdChwX3ZhciwgIj0iKQogICAgY291bnQocF9uYW1lX3ZhbHVlKSA9PSAyCgogICAgcF9uYW1lX3ZhbHVlWzBdID09IG5hbWVfdmFsdWVbMF0KCiAgICAjIGEgdmFyaWFibGUgd2Ugc2hvdWxkIGJlIHZhbGlkYXRpbmcgdXNpbmcgYSByZWdleCBmcm9tIHNldHRpbmdzCiAgICBwX25hbWVfdmFsdWVbMV0gPT0gIiQodmFsaWRhdGUtZnJvbS1zZXR0aW5ncykiCgogICAgcmVnZXhfdmFsIDo9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuQ3JlYXRlQ29udGFpbmVyUmVxdWVzdC5hbGxvd19lbnZfcmVnZXhfbWFwW25hbWVfdmFsdWVbMF1dCgogICAgcHJpbnQoImFsbG93X3ZhciA3OiB2YWwgPSIsIG5hbWVfdmFsdWVbMV0pCiAgICBwcmludCgiYWxsb3dfdmFyIDc6IHJlZ2V4X3ZhbCA9IiwgcmVnZXhfdmFsKQoKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4X3ZhbCwgbmFtZV92YWx1ZVsxXSkKCiAgICBwcmludCgiYWxsb3dfdmFyIDc6IHRydWUiKQp9CgojIE1hdGNoIGlucHV0IHdpdGggb25lIG9mIHRoZSBwb2xpY3kgdmFyaWFibGVzLCBhZnRlciBzdWJzdGl0dXRpbmcgJChzYW5kYm94LW5hbWVzcGFjZSkuCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHNvbWUgcF92YXIgaW4gcF9wcm9jZXNzLkVudgogICAgcF92YXIyIDo9IHJlcGxhY2UocF92YXIsICIkKHNhbmRib3gtbmFtZXNwYWNlKSIsIHNfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd192YXIgODogcF92YXIyID0iLCBwX3ZhcjIpCiAgICBwX3ZhcjIgPT0gaV92YXIKCiAgICBwcmludCgiYWxsb3dfdmFyIDg6IHRydWUiKQp9CgphbGxvd19wb2RfaXBfdmFyKHZhcl9uYW1lLCBwX3ZhcikgewogICAgcHJpbnQoImFsbG93X3BvZF9pcF92YXI6IHZhcl9uYW1lID0iLCB2YXJfbmFtZSwgInBfdmFyID0iLCBwX3ZhcikKCiAgICBwX25hbWVfdmFsdWUgOj0gc3BsaXQocF92YXIsICI9IikKICAgIGNvdW50KHBfbmFtZV92YWx1ZSkgPT0gMgoKICAgIHBfbmFtZV92YWx1ZVswXSA9PSB2YXJfbmFtZQogICAgcF9uYW1lX3ZhbHVlWzFdID09ICIkKHBvZC1pcCkiCgogICAgcHJpbnQoImFsbG93X3BvZF9pcF92YXI6IHRydWUiKQp9CgphbGxvd19ob3N0X2lwX3Zhcih2YXJfbmFtZSwgcF92YXIpIHsKICAgIHByaW50KCJhbGxvd19ob3N0X2lwX3ZhcjogdmFyX25hbWUgPSIsIHZhcl9uYW1lLCAicF92YXIgPSIsIHBfdmFyKQoKICAgIHBfbmFtZV92YWx1ZSA6PSBzcGxpdChwX3ZhciwgIj0iKQogICAgY291bnQocF9uYW1lX3ZhbHVlKSA9PSAyCgogICAgcF9uYW1lX3ZhbHVlWzBdID09IHZhcl9uYW1lCiAgICBwX25hbWVfdmFsdWVbMV0gPT0gIiQoaG9zdC1pcCkiCgogICAgcHJpbnQoImFsbG93X2hvc3RfaXBfdmFyOiB0cnVlIikKfQoKaXNfaXAodmFsdWUpIHsKICAgIGJ5dGVzID0gc3BsaXQodmFsdWUsICIuIikKICAgIGNvdW50KGJ5dGVzKSA9PSA0CgogICAgaXNfaXBfZmlyc3RfYnl0ZShieXRlc1swXSkKICAgIGlzX2lwX290aGVyX2J5dGUoYnl0ZXNbMV0pCiAgICBpc19pcF9vdGhlcl9ieXRlKGJ5dGVzWzJdKQogICAgaXNfaXBfb3RoZXJfYnl0ZShieXRlc1szXSkKfQppc19pcF9maXJzdF9ieXRlKGNvbXBvbmVudCkgewogICAgbnVtYmVyID0gdG9fbnVtYmVyKGNvbXBvbmVudCkKICAgIG51bWJlciA+PSAxCiAgICBudW1iZXIgPD0gMjU1Cn0KaXNfaXBfb3RoZXJfYnl0ZShjb21wb25lbnQpIHsKICAgIG51bWJlciA9IHRvX251bWJlcihjb21wb25lbnQpCiAgICBudW1iZXIgPj0gMAogICAgbnVtYmVyIDw9IDI1NQp9CgojIE9DSSByb290LlBhdGgKYWxsb3dfcm9vdF9wYXRoKHBfb2NpLCBpX29jaSwgYnVuZGxlX2lkKSB7CiAgICBpX3BhdGggOj0gaV9vY2kuUm9vdC5QYXRoCiAgICBwX3BhdGgxIDo9IHBfb2NpLlJvb3QuUGF0aAogICAgcHJpbnQoImFsbG93X3Jvb3RfcGF0aDogaV9wYXRoID0iLCBpX3BhdGgsICJwX3BhdGgxID0iLCBwX3BhdGgxKQoKICAgIHBfcGF0aDIgOj0gcmVwbGFjZShwX3BhdGgxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfcm9vdF9wYXRoOiBwX3BhdGgyID0iLCBwX3BhdGgyKQoKICAgIHBfcGF0aDMgOj0gcmVwbGFjZShwX3BhdGgyLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X3Jvb3RfcGF0aDogcF9wYXRoMyA9IiwgcF9wYXRoMykKCiAgICBwX3BhdGgzID09IGlfcGF0aAoKICAgIHByaW50KCJhbGxvd19yb290X3BhdGg6IHRydWUiKQp9CgojIGRldmljZSBtb3VudHMKYWxsb3dfbW91bnQocF9vY2ksIGlfbW91bnQsIGlfc3RvcmFnZXMsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcHJpbnQoImFsbG93X21vdW50OiBpX21vdW50ID0iLCBpX21vdW50KQoKICAgIHNvbWUgcF9tb3VudCBpbiBwX29jaS5Nb3VudHMKICAgIHNvbWUgaV9zdG9yYWdlIGluIGlfc3RvcmFnZXMKCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IHBfbW91bnQgPSIsIHBfbW91bnQpCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IGlfc3RvcmFnZSA9IiwgaV9zdG9yYWdlKQoKICAgIGNoZWNrX21vdW50KHBfbW91bnQsIGlfbW91bnQsIGlfc3RvcmFnZSwgYnVuZGxlX2lkLCBzYW5kYm94X2lkKQoKICAgICMgVE9ETzogYXJlIHRoZXJlIGFueSBvdGhlciByZXF1aXJlZCBwb2xpY3kgY2hlY2tzIGZvciBtb3VudHMgLSBlLmcuLAogICAgIyAgICAgICBtdWx0aXBsZSBtb3VudHMgd2l0aCBzYW1lIHNvdXJjZSBvciBkZXN0aW5hdGlvbj8KCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IHRydWUiKQp9CgpjaGVja19tb3VudChwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcF9tb3VudCA9PSBpX21vdW50CiAgICBwcmludCgiY2hlY2tfbW91bnQgMTogdHJ1ZSIpCn0KY2hlY2tfbW91bnQocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHBfbW91bnQuZGVzdGluYXRpb24gPT0gaV9tb3VudC5kZXN0aW5hdGlvbgogICAgcF9tb3VudC50eXBlXyA9PSBpX21vdW50LnR5cGVfCiAgICBwX21vdW50Lm9wdGlvbnMgPT0gaV9tb3VudC5vcHRpb25zCgogICAgbW91bnRfc291cmNlX2FsbG93cyhwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkKCiAgICBwcmludCgiY2hlY2tfbW91bnQgMjogdHJ1ZSIpCn0KCm1vdW50X3NvdXJjZV9hbGxvd3MocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHJlZ2V4MSA6PSBwX21vdW50LnNvdXJjZQogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5tb3VudF9zb3VyY2VfY3BhdGgpCiAgICByZWdleDQgOj0gcmVwbGFjZShyZWdleDMsICIkKGJ1bmRsZS1pZCkiLCBidW5kbGVfaWQpCgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMTogcmVnZXg0ID0iLCByZWdleDQpCiAgICByZWdleC5tYXRjaChyZWdleDQsIGlfbW91bnQuc291cmNlKQoKICAgIHByaW50KCJtb3VudF9zb3VyY2VfYWxsb3dzIDE6IHRydWUiKQp9Cm1vdW50X3NvdXJjZV9hbGxvd3MocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHJlZ2V4MSA6PSBwX21vdW50LnNvdXJjZQogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5tb3VudF9zb3VyY2VfY3BhdGgpCiAgICByZWdleDQgOj0gcmVwbGFjZShyZWdleDMsICIkKHNhbmRib3gtaWQpIiwgc2FuZGJveF9pZCkKCiAgICBwcmludCgibW91bnRfc291cmNlX2FsbG93cyAyOiByZWdleDQgPSIsIHJlZ2V4NCkKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4NCwgaV9tb3VudC5zb3VyY2UpCgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMjogdHJ1ZSIpCn0KbW91bnRfc291cmNlX2FsbG93cyhwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogaV9tb3VudC5zb3VyY2UgPSIsIGlfbW91bnQuc291cmNlKQogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogaV9zdG9yYWdlLm1vdW50X3BvaW50ID0iLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCgogICAgaV9tb3VudC5zb3VyY2UgPT0gaV9zdG9yYWdlLm1vdW50X3BvaW50CgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogdHJ1ZSIpCn0KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBDcmVhdGUgY29udGFpbmVyIFN0b3JhZ2VzCgphbGxvd19zdG9yYWdlcyhwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHBfY291bnQgOj0gY291bnQocF9zdG9yYWdlcykKICAgIGlfY291bnQgOj0gY291bnQoaV9zdG9yYWdlcykKICAgIHByaW50KCJhbGxvd19zdG9yYWdlczogcF9jb3VudCA9IiwgcF9jb3VudCwgImlfY291bnQgPSIsIGlfY291bnQpCgogICAgcF9jb3VudCA9PSBpX2NvdW50CgogICAgIyBHZXQgdGhlIGNvbnRhaW5lciBpbWFnZSBsYXllciBJRHMgYW5kIHZlcml0eSByb290IGhhc2hlcywgZnJvbSB0aGUgIm92ZXJsYXlmcyIgc3RvcmFnZS4KICAgIHNvbWUgb3ZlcmxheV9zdG9yYWdlIGluIHBfc3RvcmFnZXMKICAgIG92ZXJsYXlfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIHByaW50KCJhbGxvd19zdG9yYWdlczogb3ZlcmxheV9zdG9yYWdlID0iLCBvdmVybGF5X3N0b3JhZ2UpCiAgICBjb3VudChvdmVybGF5X3N0b3JhZ2Uub3B0aW9ucykgPT0gMgoKICAgIGxheWVyX2lkcyA6PSBzcGxpdChvdmVybGF5X3N0b3JhZ2Uub3B0aW9uc1swXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiBsYXllcl9pZHMgPSIsIGxheWVyX2lkcykKCiAgICByb290X2hhc2hlcyA6PSBzcGxpdChvdmVybGF5X3N0b3JhZ2Uub3B0aW9uc1sxXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiByb290X2hhc2hlcyA9Iiwgcm9vdF9oYXNoZXMpCgogICAgZXZlcnkgaV9zdG9yYWdlIGluIGlfc3RvcmFnZXMgewogICAgICAgIGFsbG93X3N0b3JhZ2UocF9zdG9yYWdlcywgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpCiAgICB9CgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiB0cnVlIikKfQoKYWxsb3dfc3RvcmFnZShwX3N0b3JhZ2VzLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgc29tZSBwX3N0b3JhZ2UgaW4gcF9zdG9yYWdlcwoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiBwX3N0b3JhZ2UgPSIsIHBfc3RvcmFnZSkKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiBpX3N0b3JhZ2UgPSIsIGlfc3RvcmFnZSkKCiAgICBwX3N0b3JhZ2UuZHJpdmVyICAgICAgICAgICA9PSBpX3N0b3JhZ2UuZHJpdmVyCiAgICBwX3N0b3JhZ2UuZHJpdmVyX29wdGlvbnMgICA9PSBpX3N0b3JhZ2UuZHJpdmVyX29wdGlvbnMKICAgIHBfc3RvcmFnZS5mc19ncm91cCAgICAgICAgID09IGlfc3RvcmFnZS5mc19ncm91cAogICAgcF9zdG9yYWdlLmZzdHlwZSAgICAgICAgICAgPT0gaV9zdG9yYWdlLmZzdHlwZQoKICAgIGFsbG93X3N0b3JhZ2Vfc291cmNlKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKQogICAgYWxsb3dfc3RvcmFnZV9vcHRpb25zKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKQogICAgYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKQoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiB0cnVlIikKfQoKYWxsb3dfc3RvcmFnZV9zb3VyY2UocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX3NvdXJjZSAxOiBzdGFydCIpCgogICAgcF9zdG9yYWdlLnNvdXJjZSA9PSBpX3N0b3JhZ2Uuc291cmNlCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDE6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX3NvdXJjZShwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDI6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCgogICAgIyBEREREOkJCOkRELkY6IERvbWFpbjpCdXM6RGV2aWNlLkZ1bmN0aW9uCiAgICAjIGh0dHBzOi8vd3d3Lmtlcm5lbC5vcmcvZG9jL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtYnVzLXBjaQogICAgcmVnZXgubWF0Y2goYF5bYS1mMC05XXs0fTpbYS1mMC05XXsyfTpbYS1mMC05XXsyfVwuW2EtZjAtOV0kYCwgaV9zdG9yYWdlLnNvdXJjZSkKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9zb3VyY2UgMjogdHJ1ZSIpCn0KCmFsbG93X3N0b3JhZ2Vfc291cmNlKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKSB7CiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9zb3VyY2UgMzogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIGlfc3RvcmFnZS5zb3VyY2UgPT0gIm5vbmUiCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDM6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX3NvdXJjZShwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDQ6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJzbWIiCgogICAgIyBQYXR0ZXJuOiAvLzxzdG9yYWdlLWFjY291bnQtbmFtZT4uZmlsZS5jb3JlLndpbmRvd3MubmV0LzxrOHMtUFZDLW5hbWU+CiAgICAjIFN0b3JhZ2UgYWNjb3VudCBuYW1lOiBodHRwczovL2xlYXJuLm1pY3Jvc29mdC5jb20vZW4tdXMvYXp1cmUvc3RvcmFnZS9jb21tb24vc3RvcmFnZS1hY2NvdW50LW92ZXJ2aWV3I3N0b3JhZ2UtYWNjb3VudC1uYW1lCiAgICAjIEs4cyBQVkMgbmFtZTogaHR0cHM6Ly9rdWJlcm5ldGVzLmlvL2RvY3MvY29uY2VwdHMvb3ZlcnZpZXcvd29ya2luZy13aXRoLW9iamVjdHMvbmFtZXMvI2Rucy1zdWJkb21haW4tbmFtZXMKICAgIHJlZ2V4Lm1hdGNoKGBeXC9cLyhbYS16MC05XXszLDI0fSlcLmZpbGVcLmNvcmVcLndpbmRvd3NcLm5ldFwvW2EtejAtOV0oW2EtejAtOS4tXXswLDI1MX1bYS16MC05XSk/JGAsIGlfc3RvcmFnZS5zb3VyY2UpCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDQ6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMTogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgIT0gIm92ZXJsYXlmcyIKICAgIHBfc3RvcmFnZS5vcHRpb25zID09IGlfc3RvcmFnZS5vcHRpb25zCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAxOiB0cnVlIikKfQphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIGNvdW50KHBfc3RvcmFnZS5vcHRpb25zKSA9PSAyCgogICAgcG9saWN5X2lkcyA6PSBzcGxpdChwX3N0b3JhZ2Uub3B0aW9uc1swXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBwb2xpY3lfaWRzID0iLCBwb2xpY3lfaWRzKQogICAgcG9saWN5X2lkcyA9PSBsYXllcl9pZHMKCiAgICBwb2xpY3lfaGFzaGVzIDo9IHNwbGl0KHBfc3RvcmFnZS5vcHRpb25zWzFdLCAiOiIpCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IHBvbGljeV9oYXNoZXMgPSIsIHBvbGljeV9oYXNoZXMpCgogICAgcF9jb3VudCA6PSBjb3VudChwb2xpY3lfaWRzKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBwX2NvdW50ID0iLCBwX2NvdW50KQogICAgcF9jb3VudCA+PSAxCiAgICBwX2NvdW50ID09IGNvdW50KHBvbGljeV9oYXNoZXMpCgogICAgaV9jb3VudCA6PSBjb3VudChpX3N0b3JhZ2Uub3B0aW9ucykKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogaV9jb3VudCA9IiwgaV9jb3VudCkKICAgIGlfY291bnQgPT0gcF9jb3VudCArIDMKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zWzBdID0iLCBpX3N0b3JhZ2Uub3B0aW9uc1swXSkKICAgIGlfc3RvcmFnZS5vcHRpb25zWzBdID09ICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQubGF5ZXItc3JjLXByZWZpeD0vdmFyL2xpYi9jb250YWluZXJkL2lvLmNvbnRhaW5lcmQuc25hcHNob3R0ZXIudjEudGFyZGV2L2xheWVycyIKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zW2lfY291bnQgLSAyXSA9IiwgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDJdKQogICAgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDJdID09ICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQub3ZlcmxheS1ydyIKCiAgICBsb3dlcmRpciA6PSBjb25jYXQoIj0iLCBbImxvd2VyZGlyIiwgcF9zdG9yYWdlLm9wdGlvbnNbMF1dKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBsb3dlcmRpciA9IiwgbG93ZXJkaXIpCgogICAgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDFdID09IGxvd2VyZGlyCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zW2lfY291bnQgLSAxXSA9IiwgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDFdKQoKICAgIGV2ZXJ5IGksIHBvbGljeV9pZCBpbiBwb2xpY3lfaWRzIHsKICAgICAgICBhbGxvd19vdmVybGF5X2xheWVyKHBvbGljeV9pZCwgcG9saWN5X2hhc2hlc1tpXSwgaV9zdG9yYWdlLm9wdGlvbnNbaSArIDFdKQogICAgfQoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogdHJ1ZSIpCn0KYWxsb3dfc3RvcmFnZV9vcHRpb25zKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKSB7CiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDM6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCiAgICBjb3VudChwX3N0b3JhZ2Uub3B0aW9ucykgPT0gMQoKICAgIHN0YXJ0c3dpdGgocF9zdG9yYWdlLm9wdGlvbnNbMF0sICIkKGhhc2giKQogICAgaGFzaF9zdWZmaXggOj0gdHJpbV9sZWZ0KHBfc3RvcmFnZS5vcHRpb25zWzBdLCAiJChoYXNoIikKCiAgICBlbmRzd2l0aChoYXNoX3N1ZmZpeCwgIikiKQogICAgaGFzaF9pbmRleCA6PSB0cmltX3JpZ2h0KGhhc2hfc3VmZml4LCAiKSIpCiAgICBpIDo9IHRvX251bWJlcihoYXNoX2luZGV4KQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAzOiBpID0iLCBpKQoKICAgIGhhc2hfb3B0aW9uIDo9IGNvbmNhdCgiPSIsIFsiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LnJvb3QtaGFzaCIsIHJvb3RfaGFzaGVzW2ldXSkKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMzogaGFzaF9vcHRpb24gPSIsIGhhc2hfb3B0aW9uKQoKICAgIGNvdW50KGlfc3RvcmFnZS5vcHRpb25zKSA9PSA0CiAgICBpX3N0b3JhZ2Uub3B0aW9uc1swXSA9PSAicm8iCiAgICBpX3N0b3JhZ2Uub3B0aW9uc1sxXSA9PSAiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmJsb2NrX2RldmljZT1maWxlIgogICAgaV9zdG9yYWdlLm9wdGlvbnNbMl0gPT0gImlvLmthdGFjb250YWluZXJzLmZzLW9wdC5pcy1sYXllciIKICAgIGlfc3RvcmFnZS5vcHRpb25zWzNdID09IGhhc2hfb3B0aW9uCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAzOiB0cnVlIikKfQphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgNDogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gInNtYiIKICAgIHBfb3B0c19jb3VudCA6PSBjb3VudChwX3N0b3JhZ2Uub3B0aW9ucykKICAgIGlfb3B0c19jb3VudCA6PSBjb3VudChpX3N0b3JhZ2Uub3B0aW9ucykKICAgIGlfb3B0c19jb3VudCA9PSBwX29wdHNfY291bnQgKyAyCgogICAgaV9vcHRfbWF0Y2hlcyA6PSBbaSB8IGkgOj0gaWR4OyBpZHggPCBwX29wdHNfY291bnQ7IHBfc3RvcmFnZS5vcHRpb25zW2lkeF0gPT0gaV9zdG9yYWdlLm9wdGlvbnNbaWR4XV0KICAgIGNvdW50KGlfb3B0X21hdGNoZXMpID09IHBfb3B0c19jb3VudAoKICAgIHN0YXJ0c3dpdGgoaV9zdG9yYWdlLm9wdGlvbnNbaV9vcHRzX2NvdW50LTJdLCAiYWRkcj0iKQogICAgY3JlZHMgPSBzcGxpdChpX3N0b3JhZ2Uub3B0aW9uc1tpX29wdHNfY291bnQtMV0sICIsIikKICAgIGNvdW50KGNyZWRzKSA9PSAyCiAgICBzdGFydHN3aXRoKGNyZWRzWzBdLCAidXNlcm5hbWU9IikKICAgIHN0YXJ0c3dpdGgoY3JlZHNbMV0sICJwYXNzd29yZD0iKQogICAgCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDQ6IHRydWUiKQp9CgphbGxvd19vdmVybGF5X2xheWVyKHBvbGljeV9pZCwgcG9saWN5X2hhc2gsIGlfb3B0aW9uKSB7CiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogcG9saWN5X2lkID0iLCBwb2xpY3lfaWQsICJwb2xpY3lfaGFzaCA9IiwgcG9saWN5X2hhc2gpCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogaV9vcHRpb24gPSIsIGlfb3B0aW9uKQoKICAgIHN0YXJ0c3dpdGgoaV9vcHRpb24sICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQubGF5ZXI9IikKICAgIGlfdmFsdWUgOj0gcmVwbGFjZShpX29wdGlvbiwgImlvLmthdGFjb250YWluZXJzLmZzLW9wdC5sYXllcj0iLCAiIikKICAgIGlfdmFsdWVfZGVjb2RlZCA6PSBiYXNlNjQuZGVjb2RlKGlfdmFsdWUpCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogaV92YWx1ZV9kZWNvZGVkID0iLCBpX3ZhbHVlX2RlY29kZWQpCgogICAgcG9saWN5X3N1ZmZpeCA6PSBjb25jYXQoIj0iLCBbInRhcixybyxpby5rYXRhY29udGFpbmVycy5mcy1vcHQuYmxvY2tfZGV2aWNlPWZpbGUsaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmlzLWxheWVyLGlvLmthdGFjb250YWluZXJzLmZzLW9wdC5yb290LWhhc2giLCBwb2xpY3lfaGFzaF0pCiAgICBwX3ZhbHVlIDo9IGNvbmNhdCgiLCIsIFtwb2xpY3lfaWQsIHBvbGljeV9zdWZmaXhdKQogICAgcHJpbnQoImFsbG93X292ZXJsYXlfbGF5ZXI6IHBfdmFsdWUgPSIsIHBfdmFsdWUpCgogICAgcF92YWx1ZSA9PSBpX3ZhbHVlX2RlY29kZWQKCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogdHJ1ZSIpCn0KCmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAidGFyIgoKICAgIHN0YXJ0c3dpdGgocF9zdG9yYWdlLm1vdW50X3BvaW50LCAiJChsYXllciIpCiAgICBtb3VudF9zdWZmaXggOj0gdHJpbV9sZWZ0KHBfc3RvcmFnZS5tb3VudF9wb2ludCwgIiQobGF5ZXIiKQoKICAgIGVuZHN3aXRoKG1vdW50X3N1ZmZpeCwgIikiKQogICAgbGF5ZXJfaW5kZXggOj0gdHJpbV9yaWdodChtb3VudF9zdWZmaXgsICIpIikKICAgIGkgOj0gdG9fbnVtYmVyKGxheWVyX2luZGV4KQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDE6IGkgPSIsIGkpCgogICAgbGF5ZXJfaWQgOj0gbGF5ZXJfaWRzW2ldCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMTogbGF5ZXJfaWQgPSIsIGxheWVyX2lkKQoKICAgIHBfbW91bnQgOj0gY29uY2F0KCIvIiwgWyIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L2xheWVycyIsIGxheWVyX2lkXSkKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCAxOiBwX21vdW50ID0iLCBwX21vdW50KQoKICAgIHBfbW91bnQgPT0gaV9zdG9yYWdlLm1vdW50X3BvaW50CgogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDE6IHRydWUiKQp9CmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAiZnVzZTMua2F0YS1vdmVybGF5IgoKICAgIG1vdW50MSA6PSByZXBsYWNlKHBfc3RvcmFnZS5tb3VudF9wb2ludCwgIiQoY3BhdGgpIiwgcG9saWN5X2RhdGEuY29tbW9uLmNwYXRoKQogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDI6IG1vdW50MiA9IiwgbW91bnQyKQoKICAgIG1vdW50MiA9PSBpX3N0b3JhZ2UubW91bnRfcG9pbnQKCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMjogdHJ1ZSIpCn0KYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKSB7CiAgICBwX3N0b3JhZ2UuZnN0eXBlID09ICJsb2NhbCIKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQyID0iLCBtb3VudDIpCgogICAgbW91bnQzIDo9IHJlcGxhY2UobW91bnQyLCAiJChzYW5kYm94LWlkKSIsIHNhbmRib3hfaWQpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQzID0iLCBtb3VudDMpCgogICAgcmVnZXgubWF0Y2gobW91bnQzLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCgogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDM6IHRydWUiKQp9CmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAiYmluZCIKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNDogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNDogbW91bnQyID0iLCBtb3VudDIpCgogICAgbW91bnQzIDo9IHJlcGxhY2UobW91bnQyLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDQ6IG1vdW50MyA9IiwgbW91bnQzKQoKICAgIHJlZ2V4Lm1hdGNoKG1vdW50MywgaV9zdG9yYWdlLm1vdW50X3BvaW50KQoKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA0OiB0cnVlIikKfQphbGxvd19tb3VudF9wb2ludChwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgYnVuZGxlX2lkLCBzYW5kYm94X2lkLCBsYXllcl9pZHMpIHsKICAgIHBfc3RvcmFnZS5mc3R5cGUgPT0gInRtcGZzIgoKICAgIG1vdW50MSA6PSBwX3N0b3JhZ2UubW91bnRfcG9pbnQKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA1OiBtb3VudDEgPSIsIG1vdW50MSkKCiAgICByZWdleC5tYXRjaChtb3VudDEsIGlfc3RvcmFnZS5tb3VudF9wb2ludCkKCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNTogdHJ1ZSIpCn0KYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKSB7CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogaV9zdG9yYWdlLm1vdW50X3BvaW50ID0iLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCiAgICBhbGxvd19kaXJlY3Rfdm9sX2RyaXZlcihwX3N0b3JhZ2UsIGlfc3RvcmFnZSkKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChzcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQyID0iLCBtb3VudDIpCgogICAgZGlyZWN0X3ZvbF9wYXRoIDo9IGlfc3RvcmFnZS5zb3VyY2UKICAgIG1vdW50MyA6PSByZXBsYWNlKG1vdW50MiwgIiQoYjY0LWRpcmVjdC12b2wtcGF0aCkiLCBiYXNlNjR1cmwuZW5jb2RlKGRpcmVjdF92b2xfcGF0aCkpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQzID0iLCBtb3VudDMpCgogICAgbW91bnQzID09IGlfc3RvcmFnZS5tb3VudF9wb2ludAoKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA2OiB0cnVlIikKfQoKYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIocF9zdG9yYWdlLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19kaXJlY3Rfdm9sX2RyaXZlciAxOiBzdGFydCIpCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCiAgICBwcmludCgiYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIgMTogdHJ1ZSIpCn0KYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIocF9zdG9yYWdlLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19kaXJlY3Rfdm9sX2RyaXZlciAyOiBzdGFydCIpCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJzbWIiCiAgICBwcmludCgiYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIgMjogdHJ1ZSIpCn0KCiMgRXhlY1Byb2Nlc3NSZXF1ZXN0LnByb2Nlc3MuQ2FwYWJpbGl0aWVzCmFsbG93X2V4ZWNfY2FwcyhpX2NhcHMpIHsKICAgIG5vdCBpX2NhcHMuQW1iaWVudAogICAgbm90IGlfY2Fwcy5Cb3VuZGluZwogICAgbm90IGlfY2Fwcy5FZmZlY3RpdmUKICAgIG5vdCBpX2NhcHMuSW5oZXJpdGFibGUKICAgIG5vdCBpX2NhcHMuUGVybWl0dGVkCn0KCiMgT0NJLlByb2Nlc3MuQ2FwYWJpbGl0aWVzCmFsbG93X2NhcHMocF9jYXBzLCBpX2NhcHMpIHsKICAgIHByaW50KCJhbGxvd19jYXBzOiBwb2xpY3kgQW1iaWVudCA9IiwgcF9jYXBzLkFtYmllbnQpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgQW1iaWVudCA9IiwgaV9jYXBzLkFtYmllbnQpCiAgICBtYXRjaF9jYXBzKHBfY2Fwcy5BbWJpZW50LCBpX2NhcHMuQW1iaWVudCkKCiAgICBwcmludCgiYWxsb3dfY2FwczogcG9saWN5IEJvdW5kaW5nID0iLCBwX2NhcHMuQm91bmRpbmcpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgQm91bmRpbmcgPSIsIGlfY2Fwcy5Cb3VuZGluZykKICAgIG1hdGNoX2NhcHMocF9jYXBzLkJvdW5kaW5nLCBpX2NhcHMuQm91bmRpbmcpCgogICAgcHJpbnQoImFsbG93X2NhcHM6IHBvbGljeSBFZmZlY3RpdmUgPSIsIHBfY2Fwcy5FZmZlY3RpdmUpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgRWZmZWN0aXZlID0iLCBpX2NhcHMuRWZmZWN0aXZlKQogICAgbWF0Y2hfY2FwcyhwX2NhcHMuRWZmZWN0aXZlLCBpX2NhcHMuRWZmZWN0aXZlKQoKICAgIHByaW50KCJhbGxvd19jYXBzOiBwb2xpY3kgSW5oZXJpdGFibGUgPSIsIHBfY2Fwcy5Jbmhlcml0YWJsZSkKICAgIHByaW50KCJhbGxvd19jYXBzOiBpbnB1dCBJbmhlcml0YWJsZSA9IiwgaV9jYXBzLkluaGVyaXRhYmxlKQogICAgbWF0Y2hfY2FwcyhwX2NhcHMuSW5oZXJpdGFibGUsIGlfY2Fwcy5Jbmhlcml0YWJsZSkKCiAgICBwcmludCgiYWxsb3dfY2FwczogcG9saWN5IFBlcm1pdHRlZCA9IiwgcF9jYXBzLlBlcm1pdHRlZCkKICAgIHByaW50KCJhbGxvd19jYXBzOiBpbnB1dCBQZXJtaXR0ZWQgPSIsIGlfY2Fwcy5QZXJtaXR0ZWQpCiAgICBtYXRjaF9jYXBzKHBfY2Fwcy5QZXJtaXR0ZWQsIGlfY2Fwcy5QZXJtaXR0ZWQpCn0KCm1hdGNoX2NhcHMocF9jYXBzLCBpX2NhcHMpIHsKICAgIHByaW50KCJtYXRjaF9jYXBzIDE6IHN0YXJ0IikKCiAgICBwX2NhcHMgPT0gaV9jYXBzCgogICAgcHJpbnQoIm1hdGNoX2NhcHMgMTogdHJ1ZSIpCn0KbWF0Y2hfY2FwcyhwX2NhcHMsIGlfY2FwcykgewogICAgcHJpbnQoIm1hdGNoX2NhcHMgMjogc3RhcnQiKQoKICAgIGNvdW50KHBfY2FwcykgPT0gMQogICAgcF9jYXBzWzBdID09ICIkKGRlZmF1bHRfY2FwcykiCgogICAgcHJpbnQoIm1hdGNoX2NhcHMgMjogZGVmYXVsdF9jYXBzID0iLCBwb2xpY3lfZGF0YS5jb21tb24uZGVmYXVsdF9jYXBzKQogICAgcG9saWN5X2RhdGEuY29tbW9uLmRlZmF1bHRfY2FwcyA9PSBpX2NhcHMKCiAgICBwcmludCgibWF0Y2hfY2FwcyAyOiB0cnVlIikKfQptYXRjaF9jYXBzKHBfY2FwcywgaV9jYXBzKSB7CiAgICBwcmludCgibWF0Y2hfY2FwcyAzOiBzdGFydCIpCgogICAgY291bnQocF9jYXBzKSA9PSAxCiAgICBwX2NhcHNbMF0gPT0gIiQocHJpdmlsZWdlZF9jYXBzKSIKCiAgICBwcmludCgibWF0Y2hfY2FwcyAzOiBwcml2aWxlZ2VkX2NhcHMgPSIsIHBvbGljeV9kYXRhLmNvbW1vbi5wcml2aWxlZ2VkX2NhcHMpCiAgICBwb2xpY3lfZGF0YS5jb21tb24ucHJpdmlsZWdlZF9jYXBzID09IGlfY2FwcwoKICAgIHByaW50KCJtYXRjaF9jYXBzIDM6IHRydWUiKQp9CgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgpjaGVja19kaXJlY3RvcnlfdHJhdmVyc2FsKGlfcGF0aCkgewogICAgbm90IHJlZ2V4Lm1hdGNoKCIoXnwvKS4uKCR8LykiLCBpX3BhdGgpCn0KCmNoZWNrX3N5bWxpbmtfc291cmNlKGlfc3JjKSB7CiAgICBpX3NyYyA9PSAiIgogICAgcHJpbnQoImNoZWNrX3N5bWxpbmtfc291cmNlIDE6IHRydWUiKQp9CmNoZWNrX3N5bWxpbmtfc291cmNlKGlfc3JjKSB7CiAgICBpX3NyYyAhPSAiIgogICAgcHJpbnQoImNoZWNrX3N5bWxpbmtfc291cmNlIDI6IGlfc3JjID0iLCBpX3NyYykKCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24uc19zb3VyY2UxLCBpX3NyYykKCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMjogdHJ1ZSIpCn0KY2hlY2tfc3ltbGlua19zb3VyY2UoaV9zcmMpIHsKICAgIGlfc3JjICE9ICIiCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMzogaV9zcmMgPSIsIGlfc3JjKQoKICAgIHJlZ2V4Lm1hdGNoKHBvbGljeV9kYXRhLmNvbW1vbi5zX3NvdXJjZTIsIGlfc3JjKQogICAgY2hlY2tfZGlyZWN0b3J5X3RyYXZlcnNhbChpX3NyYykKCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMzogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfc3RvcmFnZXMoaV9zdG9yYWdlcykgewogICAgcHJpbnQoImFsbG93X3NhbmRib3hfc3RvcmFnZXM6IGlfc3RvcmFnZXMgPSIsIGlfc3RvcmFnZXMpCgogICAgcF9zdG9yYWdlcyA6PSBwb2xpY3lfZGF0YS5zYW5kYm94LnN0b3JhZ2VzCiAgICBldmVyeSBpX3N0b3JhZ2UgaW4gaV9zdG9yYWdlcyB7CiAgICAgICAgYWxsb3dfc2FuZGJveF9zdG9yYWdlKHBfc3RvcmFnZXMsIGlfc3RvcmFnZSkKICAgIH0KCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9zdG9yYWdlczogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfc3RvcmFnZShwX3N0b3JhZ2VzLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IGlfc3RvcmFnZSA9IiwgaV9zdG9yYWdlKQoKICAgIHNvbWUgcF9zdG9yYWdlIGluIHBfc3RvcmFnZXMKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IHBfc3RvcmFnZSA9IiwgcF9zdG9yYWdlKQogICAgaV9zdG9yYWdlID09IHBfc3RvcmFnZQoKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IHRydWUiKQp9CgpDb3B5RmlsZVJlcXVlc3QgewogICAgcHJpbnQoIkNvcHlGaWxlUmVxdWVzdDogaW5wdXQucGF0aCA9IiwgaW5wdXQucGF0aCkKCiAgICBjaGVja19zeW1saW5rX3NvdXJjZShpbnB1dC5zeW1saW5rX3NyYykKICAgIGNoZWNrX2RpcmVjdG9yeV90cmF2ZXJzYWwoaW5wdXQucGF0aCkKCiAgICBzb21lIHJlZ2V4MSBpbiBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLkNvcHlGaWxlUmVxdWVzdAogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5jcGF0aCkKICAgIHJlZ2V4NCA6PSByZXBsYWNlKHJlZ2V4MywgIiQoYnVuZGxlLWlkKSIsIEJVTkRMRV9JRCkKICAgIHByaW50KCJDb3B5RmlsZVJlcXVlc3Q6IHJlZ2V4NCA9IiwgcmVnZXg0KQoKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4NCwgaW5wdXQucGF0aCkKCiAgICBwcmludCgiQ29weUZpbGVSZXF1ZXN0OiB0cnVlIikKfQoKQ3JlYXRlU2FuZGJveFJlcXVlc3QgewogICAgcHJpbnQoIkNyZWF0ZVNhbmRib3hSZXF1ZXN0OiBpbnB1dC5ndWVzdF9ob29rX3BhdGggPSIsIGlucHV0Lmd1ZXN0X2hvb2tfcGF0aCkKICAgIGNvdW50KGlucHV0Lmd1ZXN0X2hvb2tfcGF0aCkgPT0gMAoKICAgIHByaW50KCJDcmVhdGVTYW5kYm94UmVxdWVzdDogaW5wdXQua2VybmVsX21vZHVsZXMgPSIsIGlucHV0Lmtlcm5lbF9tb2R1bGVzKQogICAgY291bnQoaW5wdXQua2VybmVsX21vZHVsZXMpID09IDAKCiAgICBpX3BpZG5zIDo9IGlucHV0LnNhbmRib3hfcGlkbnMKICAgIHByaW50KCJDcmVhdGVTYW5kYm94UmVxdWVzdDogaV9waWRucyA9IiwgaV9waWRucykKICAgIGlfcGlkbnMgPT0gZmFsc2UKICAgIGFsbG93X3NhbmRib3hfc3RvcmFnZXMoaW5wdXQuc3RvcmFnZXMpCn0KCmFsbG93X2V4ZWMocF9jb250YWluZXIsIGlfcHJvY2VzcykgewogICAgcHJpbnQoImFsbG93X2V4ZWM6IHN0YXJ0IikKCiAgICBwX29jaSA9IHBfY29udGFpbmVyLk9DSQogICAgcF9zX25hbWUgPSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc19uYW1lc3BhY2UgPSBnZXRfc3RhdGVfdmFsKCJuYW1lc3BhY2UiKQogICAgYWxsb3dfcHJvYmVfcHJvY2VzcyhwX29jaS5Qcm9jZXNzLCBpX3Byb2Nlc3MsIHBfc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfZXhlYzogdHJ1ZSIpCn0KCmFsbG93X2ludGVyYWN0aXZlX2V4ZWMocF9jb250YWluZXIsIGlfcHJvY2VzcykgewogICAgcHJpbnQoImFsbG93X2ludGVyYWN0aXZlX2V4ZWM6IHN0YXJ0IikKCiAgICBwX29jaSA9IHBfY29udGFpbmVyLk9DSQogICAgcF9zX25hbWUgPSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc19uYW1lc3BhY2UgPSBnZXRfc3RhdGVfdmFsKCJuYW1lc3BhY2UiKQogICAgYWxsb3dfaW50ZXJhY3RpdmVfcHJvY2VzcyhwX29jaS5Qcm9jZXNzLCBpX3Byb2Nlc3MsIHBfc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfaW50ZXJhY3RpdmVfZXhlYzogdHJ1ZSIpCn0KCiMgVE9ETzogc2hvdWxkIG90aGVyIEV4ZWNQcm9jZXNzUmVxdWVzdCBpbnB1dCBkYXRhIGZpZWxkcyBiZSB2YWxpZGF0ZWQgYXMgd2VsbD8KRXhlY1Byb2Nlc3NSZXF1ZXN0IHsKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMTogaW5wdXQgPSIsIGlucHV0KQoKICAgIHNvbWUgcF9jb21tYW5kIGluIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuRXhlY1Byb2Nlc3NSZXF1ZXN0LmFsbG93ZWRfY29tbWFuZHMKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMTogcF9jb21tYW5kID0iLCBwX2NvbW1hbmQpCiAgICBwX2NvbW1hbmQgPT0gaW5wdXQucHJvY2Vzcy5BcmdzCgogICAgIyBUT0RPOiBtYXRjaCBwX2NvbnRhaW5lcidzIElEIHdpdGggdGhlIGlucHV0IGNvbnRhaW5lcl9pZC4KICAgIHNvbWUgcF9jb250YWluZXIgaW4gcG9saWN5X2RhdGEuY29udGFpbmVycwogICAgYWxsb3dfaW50ZXJhY3RpdmVfZXhlYyhwX2NvbnRhaW5lciwgaW5wdXQucHJvY2VzcykKCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDE6IHRydWUiKQp9CkV4ZWNQcm9jZXNzUmVxdWVzdCB7CiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDI6IGlucHV0ID0iLCBpbnB1dCkKCiAgICAjIFRPRE86IG1hdGNoIGlucHV0IGNvbnRhaW5lciBJRCB3aXRoIGl0cyBjb3JyZXNwb25kaW5nIGNvbnRhaW5lci5leGVjX2NvbW1hbmRzLgogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBzb21lIHBfY29tbWFuZCBpbiBwX2NvbnRhaW5lci5leGVjX2NvbW1hbmRzCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDI6IHBfY29tbWFuZCA9IiwgcF9jb21tYW5kKQoKICAgICMgVE9ETzogc2hvdWxkIG90aGVyIGlucHV0IGRhdGEgZmllbGRzIGJlIHZhbGlkYXRlZCBhcyB3ZWxsPwogICAgcF9jb21tYW5kID09IGlucHV0LnByb2Nlc3MuQXJncwoKICAgIGFsbG93X2V4ZWMocF9jb250YWluZXIsIGlucHV0LnByb2Nlc3MpCgogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAyOiB0cnVlIikKfQpFeGVjUHJvY2Vzc1JlcXVlc3QgewogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAzOiBpbnB1dCA9IiwgaW5wdXQpCgogICAgaV9jb21tYW5kID0gY29uY2F0KCIgIiwgaW5wdXQucHJvY2Vzcy5BcmdzKQogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAzOiBpX2NvbW1hbmQgPSIsIGlfY29tbWFuZCkKCiAgICBzb21lIHBfcmVnZXggaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5FeGVjUHJvY2Vzc1JlcXVlc3QucmVnZXgKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMzogcF9yZWdleCA9IiwgcF9yZWdleCkKCiAgICByZWdleC5tYXRjaChwX3JlZ2V4LCBpX2NvbW1hbmQpCgogICAgIyBUT0RPOiBtYXRjaCBwX2NvbnRhaW5lcidzIElEIHdpdGggdGhlIGlucHV0IGNvbnRhaW5lcl9pZC4KICAgIHNvbWUgcF9jb250YWluZXIgaW4gcG9saWN5X2RhdGEuY29udGFpbmVycwogICAgYWxsb3dfaW50ZXJhY3RpdmVfZXhlYyhwX2NvbnRhaW5lciwgaW5wdXQucHJvY2VzcykKCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDM6IHRydWUiKQp9CgpVcGRhdGVSb3V0ZXNSZXF1ZXN0IHsKICAgIHByaW50KCJVcGRhdGVSb3V0ZXNSZXF1ZXN0OiBpbnB1dCA9IiwgaW5wdXQpCiAgICBwcmludCgiVXBkYXRlUm91dGVzUmVxdWVzdDogcG9saWN5ID0iLCBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLlVwZGF0ZVJvdXRlc1JlcXVlc3QpCgogICAgaV9yb3V0ZXMgOj0gaW5wdXQucm91dGVzLlJvdXRlcwogICAgcF9zb3VyY2VfcmVnZXggPSBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLlVwZGF0ZVJvdXRlc1JlcXVlc3QuZm9yYmlkZGVuX3NvdXJjZV9yZWdleAogICAgcF9uYW1lcyA9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuVXBkYXRlUm91dGVzUmVxdWVzdC5mb3JiaWRkZW5fZGV2aWNlX25hbWVzCgogICAgZXZlcnkgaV9yb3V0ZSBpbiBpX3JvdXRlcyB7CiAgICAgICAgcHJpbnQoImlfcm91dGUuc291cmNlID0iLCBpX3JvdXRlLnNvdXJjZSkKICAgICAgICBldmVyeSBwX3JlZ2V4IGluIHBfc291cmNlX3JlZ2V4IHsKICAgICAgICAgICAgcHJpbnQoInBfcmVnZXggPSIsIHBfcmVnZXgpCiAgICAgICAgICAgIG5vdCByZWdleC5tYXRjaChwX3JlZ2V4LCBpX3JvdXRlLnNvdXJjZSkKICAgICAgICB9CgogICAgICAgIHByaW50KCJpX3JvdXRlLmRldmljZSA9IiwgaV9yb3V0ZS5kZXZpY2UpCiAgICAgICAgbm90IGlfcm91dGUuZGV2aWNlIGluIHBfbmFtZXMKICAgIH0KCiAgICBwcmludCgiVXBkYXRlUm91dGVzUmVxdWVzdDogdHJ1ZSIpCn0KClVwZGF0ZUludGVyZmFjZVJlcXVlc3QgewogICAgcHJpbnQoIlVwZGF0ZUludGVyZmFjZVJlcXVlc3Q6IGlucHV0ID0iLCBpbnB1dCkKICAgIHByaW50KCJVcGRhdGVJbnRlcmZhY2VSZXF1ZXN0OiBwb2xpY3kgPSIsIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuVXBkYXRlSW50ZXJmYWNlUmVxdWVzdCkKCiAgICBpX2ludGVyZmFjZSA6PSBpbnB1dC5pbnRlcmZhY2UKICAgIHBfZmxhZ3MgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmFsbG93X3Jhd19mbGFncwoKICAgICMgVHlwaWNhbGx5LCBqdXN0IElGRl9OT0FSUCBpcyB1c2VkLgogICAgYml0cy5hbmQoaV9pbnRlcmZhY2UucmF3X2ZsYWdzLCBiaXRzLm5lZ2F0ZShwX2ZsYWdzKSkgPT0gMAoKICAgIHBfbmFtZXMgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmZvcmJpZGRlbl9uYW1lcwoKICAgIG5vdCBpX2ludGVyZmFjZS5uYW1lIGluIHBfbmFtZXMKCiAgICBwX2h3YWRkcnMgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmZvcmJpZGRlbl9od19hZGRycwoKICAgIG5vdCBpX2ludGVyZmFjZS5od0FkZHIgaW4gcF9od2FkZHJzCgogICAgcHJpbnQoIlVwZGF0ZUludGVyZmFjZVJlcXVlc3Q6IHRydWUiKQp9CgpDbG9zZVN0ZGluUmVxdWVzdCB7CiAgICBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLkNsb3NlU3RkaW5SZXF1ZXN0ID09IHRydWUKfQoKUmVhZFN0cmVhbVJlcXVlc3QgewogICAgcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5SZWFkU3RyZWFtUmVxdWVzdCA9PSB0cnVlCn0KClVwZGF0ZUVwaGVtZXJhbE1vdW50c1JlcXVlc3QgewogICAgcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVFcGhlbWVyYWxNb3VudHNSZXF1ZXN0ID09IHRydWUKfQoKV3JpdGVTdHJlYW1SZXF1ZXN0IHsKICAgIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuV3JpdGVTdHJlYW1SZXF1ZXN0ID09IHRydWUKfQoKcG9saWN5X2RhdGEgOj0gewogICJjb250YWluZXJzIjogWwogICAgewogICAgICAiT0NJIjogewogICAgICAgICJWZXJzaW9uIjogIjEuMS4wLXJjLjEiLAogICAgICAgICJQcm9jZXNzIjogewogICAgICAgICAgIlRlcm1pbmFsIjogZmFsc2UsCiAgICAgICAgICAiVXNlciI6IHsKICAgICAgICAgICAgIlVJRCI6IDY1NTM1LAogICAgICAgICAgICAiR0lEIjogNjU1MzUsCiAgICAgICAgICAgICJBZGRpdGlvbmFsR2lkcyI6IFtdLAogICAgICAgICAgICAiVXNlcm5hbWUiOiAiIgogICAgICAgICAgfSwKICAgICAgICAgICJEZXByZWNhdGVkQXJncyI6IFsKICAgICAgICAgICAgIi9wYXVzZSIKICAgICAgICAgIF0sCiAgICAgICAgICAiQXJncyI6IFsKICAgICAgICAgICAgIi9wYXVzZSIKICAgICAgICAgIF0sCiAgICAgICAgICAiRW52IjogWwogICAgICAgICAgICAiUEFUSD0vdXNyL2xvY2FsL3NiaW46L3Vzci9sb2NhbC9iaW46L3Vzci9zYmluOi91c3IvYmluOi9zYmluOi9iaW4iCiAgICAgICAgICBdLAogICAgICAgICAgIkN3ZCI6ICIvIiwKICAgICAgICAgICJDYXBhYmlsaXRpZXMiOiB7CiAgICAgICAgICAgICJBbWJpZW50IjogW10sCiAgICAgICAgICAgICJCb3VuZGluZyI6IFsKICAgICAgICAgICAgICAiJChkZWZhdWx0X2NhcHMpIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiRWZmZWN0aXZlIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJJbmhlcml0YWJsZSI6IFtdLAogICAgICAgICAgICAiUGVybWl0dGVkIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICAiTm9OZXdQcml2aWxlZ2VzIjogdHJ1ZQogICAgICAgIH0sCiAgICAgICAgIlJvb3QiOiB7CiAgICAgICAgICAiUGF0aCI6ICIkKGNwYXRoKS8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgIlJlYWRvbmx5IjogdHJ1ZQogICAgICAgIH0sCiAgICAgICAgIk1vdW50cyI6IFsKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9wcm9jIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJwcm9jIiwKICAgICAgICAgICAgInR5cGVfIjogInByb2MiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2IiwKICAgICAgICAgICAgInNvdXJjZSI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJzdHJpY3RhdGltZSIsCiAgICAgICAgICAgICAgIm1vZGU9NzU1IiwKICAgICAgICAgICAgICAic2l6ZT02NTUzNmsiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L3B0cyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiZGV2cHRzIiwKICAgICAgICAgICAgInR5cGVfIjogImRldnB0cyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJuZXdpbnN0YW5jZSIsCiAgICAgICAgICAgICAgInB0bXhtb2RlPTA2NjYiLAogICAgICAgICAgICAgICJtb2RlPTA2MjAiLAogICAgICAgICAgICAgICJnaWQ9NSIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvc2htIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L3NobSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi9tcXVldWUiLAogICAgICAgICAgICAic291cmNlIjogIm1xdWV1ZSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJtcXVldWUiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvc3lzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJzeXNmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJzeXNmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2V0Yy9yZXNvbHYuY29uZiIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClyZXNvbHYuY29uZiQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJvIiwKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9kZXYiLAogICAgICAgICAgICAgICJub2V4ZWMiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0KICAgICAgICBdLAogICAgICAgICJBbm5vdGF0aW9ucyI6IHsKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmJ1bmRsZV9wYXRoIjogIi9ydW4vY29udGFpbmVyZC9pby5jb250YWluZXJkLnJ1bnRpbWUudjIudGFzay9rOHMuaW8vJChidW5kbGUtaWQpIiwKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIjogInBvZF9zYW5kYm94IiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSI6ICJzYW5kYm94IiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWlkIjogIl5bYS16MC05XXs2NH0kIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWxvZy1kaXJlY3RvcnkiOiAiXi92YXIvbG9nL3BvZHMvJChzYW5kYm94LW5hbWVzcGFjZSlfJChzYW5kYm94LW5hbWUpX1swLTlhLWZdezh9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezEyfSQiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZXNwYWNlIjogIiIsCiAgICAgICAgICAibmVyZGN0bC9uZXR3b3JrLW5hbWVzcGFjZSI6ICJeL3Zhci9ydW4vbmV0bnMvY25pLVswLTlhLWZdezh9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezEyfSQiCiAgICAgICAgfSwKICAgICAgICAiTGludXgiOiB7CiAgICAgICAgICAiTmFtZXNwYWNlcyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICJUeXBlIjogImlwYyIsCiAgICAgICAgICAgICAgIlBhdGgiOiAiIgogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgIlR5cGUiOiAidXRzIiwKICAgICAgICAgICAgICAiUGF0aCI6ICIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiVHlwZSI6ICJtb3VudCIsCiAgICAgICAgICAgICAgIlBhdGgiOiAiIgogICAgICAgICAgICB9CiAgICAgICAgICBdLAogICAgICAgICAgIk1hc2tlZFBhdGhzIjogWwogICAgICAgICAgICAiL3Byb2MvYWNwaSIsCiAgICAgICAgICAgICIvcHJvYy9hc291bmQiLAogICAgICAgICAgICAiL3Byb2Mva2NvcmUiLAogICAgICAgICAgICAiL3Byb2Mva2V5cyIsCiAgICAgICAgICAgICIvcHJvYy9sYXRlbmN5X3N0YXRzIiwKICAgICAgICAgICAgIi9wcm9jL3RpbWVyX2xpc3QiLAogICAgICAgICAgICAiL3Byb2MvdGltZXJfc3RhdHMiLAogICAgICAgICAgICAiL3Byb2Mvc2NoZWRfZGVidWciLAogICAgICAgICAgICAiL3N5cy9maXJtd2FyZSIsCiAgICAgICAgICAgICIvcHJvYy9zY3NpIgogICAgICAgICAgXSwKICAgICAgICAgICJSZWFkb25seVBhdGhzIjogWwogICAgICAgICAgICAiL3Byb2MvYnVzIiwKICAgICAgICAgICAgIi9wcm9jL2ZzIiwKICAgICAgICAgICAgIi9wcm9jL2lycSIsCiAgICAgICAgICAgICIvcHJvYy9zeXMiLAogICAgICAgICAgICAiL3Byb2Mvc3lzcnEtdHJpZ2dlciIKICAgICAgICAgIF0sCiAgICAgICAgICAiRGV2aWNlcyI6IFtdLAogICAgICAgICAgIlN5c2N0bCI6IHsKICAgICAgICAgICAgIm5ldC5pcHY0LmlwX3VucHJpdmlsZWdlZF9wb3J0X3N0YXJ0IjogIjAiLAogICAgICAgICAgICAibmV0LmlwdjQucGluZ19ncm91cF9yYW5nZSI6ICIwIDIxNDc0ODM2NDciCiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9LAogICAgICAic3RvcmFnZXMiOiBbCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJibGsiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogInRhciIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIiQoaGFzaDApIgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGxheWVyMCkiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJvdmVybGF5ZnMiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogImZ1c2UzLmthdGEtb3ZlcmxheSIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIjVhNWFhZDgwMDU1ZmYyMDAxMmE1MGRjMjVmOGRmN2EyOTkyNDQ3NDMyNGQ2NWY3ZDUzMDZlZThlZTI3ZmY3MWQiLAogICAgICAgICAgICAiODE3MjUwZjFhM2UzMzZkYTc2ZjViZDNmYTc4NGUxYjI2ZDk1OWI5YzEzMTg3NjgxNWJhMjYwNDA0OGI3MGMxOCIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChjcGF0aCkvJChidW5kbGUtaWQpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9CiAgICAgIF0sCiAgICAgICJkZXZpY2VzIjogW10sCiAgICAgICJzYW5kYm94X3BpZG5zIjogZmFsc2UsCiAgICAgICJleGVjX2NvbW1hbmRzIjogW10sCiAgICAgICJlbnZfbWFwIjogewogICAgICAgICJQQVRIIjogIi91c3IvbG9jYWwvc2JpbjovdXNyL2xvY2FsL2JpbjovdXNyL3NiaW46L3Vzci9iaW46L3NiaW46L2JpbiIKICAgICAgfQogICAgfSwKICAgIHsKICAgICAgIk9DSSI6IHsKICAgICAgICAiVmVyc2lvbiI6ICIxLjEuMC1yYy4xIiwKICAgICAgICAiUHJvY2VzcyI6IHsKICAgICAgICAgICJUZXJtaW5hbCI6IGZhbHNlLAogICAgICAgICAgIlVzZXIiOiB7CiAgICAgICAgICAgICJVSUQiOiAwLAogICAgICAgICAgICAiR0lEIjogMCwKICAgICAgICAgICAgIkFkZGl0aW9uYWxHaWRzIjogW10sCiAgICAgICAgICAgICJVc2VybmFtZSI6ICIiCiAgICAgICAgICB9LAogICAgICAgICAgIkRlcHJlY2F0ZWRBcmdzIjogWwogICAgICAgICAgICAicGVybCIsCiAgICAgICAgICAgICItTWJpZ251bT1icGkiLAogICAgICAgICAgICAiLXdsZSIsCiAgICAgICAgICAgICJwcmludCBicGkoMjAwMCkiCiAgICAgICAgICBdLAogICAgICAgICAgIkFyZ3MiOiBbCiAgICAgICAgICAgICJwZXJsIiwKICAgICAgICAgICAgIi1NYmlnbnVtPWJwaSIsCiAgICAgICAgICAgICItd2xlIiwKICAgICAgICAgICAgInByaW50IGJwaSgyMDAwKSIKICAgICAgICAgIF0sCiAgICAgICAgICAiRW52IjogWwogICAgICAgICAgICAiUEFUSD0vdXNyL2xvY2FsL3NiaW46L3Vzci9sb2NhbC9iaW46L3Vzci9zYmluOi91c3IvYmluOi9zYmluOi9iaW4iLAogICAgICAgICAgICAiSE9TVE5BTUU9JChob3N0LW5hbWUpIgogICAgICAgICAgXSwKICAgICAgICAgICJDd2QiOiAiLyIsCiAgICAgICAgICAiQ2FwYWJpbGl0aWVzIjogewogICAgICAgICAgICAiQW1iaWVudCI6IFtdLAogICAgICAgICAgICAiQm91bmRpbmciOiBbCiAgICAgICAgICAgICAgIiQoZGVmYXVsdF9jYXBzKSIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgIkVmZmVjdGl2ZSI6IFsKICAgICAgICAgICAgICAiJChkZWZhdWx0X2NhcHMpIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiSW5oZXJpdGFibGUiOiBbXSwKICAgICAgICAgICAgIlBlcm1pdHRlZCI6IFsKICAgICAgICAgICAgICAiJChkZWZhdWx0X2NhcHMpIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgIk5vTmV3UHJpdmlsZWdlcyI6IGZhbHNlCiAgICAgICAgfSwKICAgICAgICAiUm9vdCI6IHsKICAgICAgICAgICJQYXRoIjogIiQoY3BhdGgpLyQoYnVuZGxlLWlkKSIsCiAgICAgICAgICAiUmVhZG9ubHkiOiBmYWxzZQogICAgICAgIH0sCiAgICAgICAgIk1vdW50cyI6IFsKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9wcm9jIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJwcm9jIiwKICAgICAgICAgICAgInR5cGVfIjogInByb2MiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2IiwKICAgICAgICAgICAgInNvdXJjZSI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJzdHJpY3RhdGltZSIsCiAgICAgICAgICAgICAgIm1vZGU9NzU1IiwKICAgICAgICAgICAgICAic2l6ZT02NTUzNmsiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L3B0cyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiZGV2cHRzIiwKICAgICAgICAgICAgInR5cGVfIjogImRldnB0cyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJuZXdpbnN0YW5jZSIsCiAgICAgICAgICAgICAgInB0bXhtb2RlPTA2NjYiLAogICAgICAgICAgICAgICJtb2RlPTA2MjAiLAogICAgICAgICAgICAgICJnaWQ9NSIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvc2htIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L3NobSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi9tcXVldWUiLAogICAgICAgICAgICAic291cmNlIjogIm1xdWV1ZSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJtcXVldWUiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvc3lzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJzeXNmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJzeXNmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL3N5cy9mcy9jZ3JvdXAiLAogICAgICAgICAgICAic291cmNlIjogImNncm91cCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJjZ3JvdXAiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiLAogICAgICAgICAgICAgICJyZWxhdGltZSIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2V0Yy9ob3N0cyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClob3N0cyQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicnciCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L3Rlcm1pbmF0aW9uLWxvZyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeCl0ZXJtaW5hdGlvbi1sb2ckIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJ3IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2V0Yy9ob3N0bmFtZSIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClob3N0bmFtZSQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicnciCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZXRjL3Jlc29sdi5jb25mIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KXJlc29sdi5jb25mJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJydyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi92YXIvcnVuL3NlY3JldHMva3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudCIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClzZXJ2aWNlYWNjb3VudCQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicm8iCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvdmFyL3J1bi9zZWNyZXRzL2F6dXJlL3Rva2VucyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeCl0b2tlbnMkIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9CiAgICAgICAgXSwKICAgICAgICAiQW5ub3RhdGlvbnMiOiB7CiAgICAgICAgICAiaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5idW5kbGVfcGF0aCI6ICIvcnVuL2NvbnRhaW5lcmQvaW8uY29udGFpbmVyZC5ydW50aW1lLnYyLnRhc2svazhzLmlvLyQoYnVuZGxlLWlkKSIsCiAgICAgICAgICAiaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5jb250YWluZXJfdHlwZSI6ICJwb2RfY29udGFpbmVyIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItbmFtZSI6ICJwaSIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLXR5cGUiOiAiY29udGFpbmVyIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5pbWFnZS1uYW1lIjogIm1jci5taWNyb3NvZnQuY29tL2FjYy9zYW1wbGVzL2FjYy1wZXJsOjEuMCIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCI6ICJeW2EtejAtOV17NjR9JCIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1uYW1lc3BhY2UiOiAiIgogICAgICAgIH0sCiAgICAgICAgIkxpbnV4IjogewogICAgICAgICAgIk5hbWVzcGFjZXMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiVHlwZSI6ICJpcGMiLAogICAgICAgICAgICAgICJQYXRoIjogIiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJUeXBlIjogInV0cyIsCiAgICAgICAgICAgICAgIlBhdGgiOiAiIgogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgIlR5cGUiOiAibW91bnQiLAogICAgICAgICAgICAgICJQYXRoIjogIiIKICAgICAgICAgICAgfQogICAgICAgICAgXSwKICAgICAgICAgICJNYXNrZWRQYXRocyI6IFsKICAgICAgICAgICAgIi9wcm9jL2FjcGkiLAogICAgICAgICAgICAiL3Byb2Mva2NvcmUiLAogICAgICAgICAgICAiL3Byb2Mva2V5cyIsCiAgICAgICAgICAgICIvcHJvYy9sYXRlbmN5X3N0YXRzIiwKICAgICAgICAgICAgIi9wcm9jL3RpbWVyX2xpc3QiLAogICAgICAgICAgICAiL3Byb2MvdGltZXJfc3RhdHMiLAogICAgICAgICAgICAiL3Byb2Mvc2NoZWRfZGVidWciLAogICAgICAgICAgICAiL3Byb2Mvc2NzaSIsCiAgICAgICAgICAgICIvc3lzL2Zpcm13YXJlIgogICAgICAgICAgXSwKICAgICAgICAgICJSZWFkb25seVBhdGhzIjogWwogICAgICAgICAgICAiL3Byb2MvYXNvdW5kIiwKICAgICAgICAgICAgIi9wcm9jL2J1cyIsCiAgICAgICAgICAgICIvcHJvYy9mcyIsCiAgICAgICAgICAgICIvcHJvYy9pcnEiLAogICAgICAgICAgICAiL3Byb2Mvc3lzIiwKICAgICAgICAgICAgIi9wcm9jL3N5c3JxLXRyaWdnZXIiCiAgICAgICAgICBdLAogICAgICAgICAgIkRldmljZXMiOiBbXSwKICAgICAgICAgICJTeXNjdGwiOiB7CiAgICAgICAgICAgICJuZXQuaXB2NC5pcF91bnByaXZpbGVnZWRfcG9ydF9zdGFydCI6ICIwIiwKICAgICAgICAgICAgIm5ldC5pcHY0LnBpbmdfZ3JvdXBfcmFuZ2UiOiAiMCAyMTQ3NDgzNjQ3IgogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSwKICAgICAgInN0b3JhZ2VzIjogWwogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2gwKSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjApIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2gxKSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjEpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2gyKSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjIpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2gzKSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjMpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2g0KSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjQpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2g1KSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjUpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2g2KSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjYpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAib3ZlcmxheWZzIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJmdXNlMy5rYXRhLW92ZXJsYXkiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICJjNjc1MDMyZTViMGVmOGU0NzI2NTg1ZDk5YWU3YTI0YTYyMDkzOWJjNzI1YTM1ZDQ1ZDAxZDYzM2NjNWIzOTg1Ojk1YzAyNzY0ZDViY2VhNjg2NTllYjM1OWM4ODE3MTM2NGUzMzExYjg0OWVmZTkyMzg0MWVhMmQ2NzY2OTViNDA6MGYyYmQ5ZTA4ZjU5N2M2MzViNjZmODY2MWU1MWMwN2YzZDE4NmY2OGM5ZTNkNmQ2MDk5ODNiMmJkYTIyMTk3NDo4ZDVlMWYwNWE3YjA0M2E2MjE5MTM0YTMyNzFhNzYzZGMzMjUyZWQ5ODVkMDdhM2Q1MWY5OWVkYjhiMDAwOTQ3OjcwOGM1NzRhODQ4MzM4ZjY2MGMzNTUzYmQxOGY0ZjQyZjNmYTgzZmZiMWRjZjZkM2E5ZGY1NjdiNjExZWU5NDQ6MDc1ODFjOWZmOTUwNGJhMDZjM2E2YjNkNDAyZTcxZTU0OThmZGU4MTI2N2FmY2I5MmE4Mzg5MTRiZjY5OTUxMjowZTA4MDQxNzU4NWIzMjM1ZjcwNTRlNGVhZDZmMjEwNTMyODM0MDkxY2RhYWUyYjZiNzM0NjE2ZGNhOGIyNzk1IiwKICAgICAgICAgICAgIjM1YmFhODlkYTRjMjFiYWQ4N2UwODBhZjRmZWNmZWZkNDNhZjU2NGVmYTZlY2E2MTY5OTY0MWYxMWNhYTBjZWE6NDU3ODBlYjI2YjRkZjkwMmQxOTNiYjk5MjlkNGMxMmQ5ZDI1MGE5MDhiZDk1MDA2M2UwMmUwNzEwNGIxYTAyNDpjMWFkYWUyZDczNWNjMzJhY2IxNjBiMjJiYjc5MTM3NDIxZDM4YmJhYjAyMmZhZGM5ZDkxOTU3ZDJiNjZiMTc0OmE5OGZjMGRjZDBiYTdjMmI2N2JlZDZmZGQ2MWE0OGNmMTkzODZlMDdhNWJlZTM4Y2JiNTZjY2U1ODBiMzE0NmI6NDIwZDRkYTg1YzE1OTE1M2Q1ZmM2ZjQ0YWRiOTk2MTE3ZTAxODVkMDVjYTg5MzU1ZDhkZGNhOGQ3YjJiODlhZDo0MWE5MGFiNGNmMGJiZGYyNDllMjJlMzcxYmM1MDM1YmJkNWRiMjk5OWNhMmMxY2Y4MzRjMDc0ZTExYmQ5M2VjOjA5NzMxYTM0ODc3YzE5YTJkZDRlZGUyZGQyOWFjZjJlNjBiN2U5NWEzNzFmODY1YWE3ZmI4ZDJlY2NhNjI1MmYiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQoY3BhdGgpLyQoYnVuZGxlLWlkKSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfQogICAgICBdLAogICAgICAiZGV2aWNlcyI6IFtdLAogICAgICAic2FuZGJveF9waWRucyI6IGZhbHNlLAogICAgICAiZXhlY19jb21tYW5kcyI6IFtdLAogICAgICAiZW52X21hcCI6IHsKICAgICAgICAiSE9TVE5BTUUiOiAiJChob3N0LW5hbWUpIiwKICAgICAgICAiUEFUSCI6ICIvdXNyL2xvY2FsL3NiaW46L3Vzci9sb2NhbC9iaW46L3Vzci9zYmluOi91c3IvYmluOi9zYmluOi9iaW4iCiAgICAgIH0KICAgIH0KICBdLAogICJjb21tb24iOiB7CiAgICAiY3BhdGgiOiAiL3J1bi9rYXRhLWNvbnRhaW5lcnMvc2hhcmVkL2NvbnRhaW5lcnMiLAogICAgIm1vdW50X3NvdXJjZV9jcGF0aCI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zaGFyZWQvY29udGFpbmVycyIsCiAgICAic2ZwcmVmaXgiOiAiXiQoY3BhdGgpLyQoYnVuZGxlLWlkKS1bYS16MC05XXsxNn0tIiwKICAgICJzcGF0aCI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L3N0b3JhZ2UiLAogICAgImlwdjRfYSI6ICIoKFswLTldfFsxLTldWzAtOV18MVswLTldezJ9fDJbMC00XVswLTldfDI1WzAtNV0pXFwuKXszfShbMC05XXxbMS05XVswLTldfDFbMC05XXsyfXwyWzAtNF1bMC05XXwyNVswLTVdKSIsCiAgICAiaXBfcCI6ICJbMC05XXsxLDV9IiwKICAgICJzdmNfbmFtZSI6ICJbQS1aX1xcLlxcLV0rIiwKICAgICJkbnNfbGFiZWwiOiAiW2EtekEtWjAtOV9cXC5cXC1dKyIsCiAgICAic19zb3VyY2UxIjogIl4uLjJbMC05XXszfV9bMC0xXVswLTldX1swLTNdWzAtOV1fWzAtMl1bMC05XV9bMC01XVswLTldX1swLTVdWzAtOV1cXC5bMC05XXsxLDEwfSQiLAogICAgInNfc291cmNlMiI6ICJeLi5kYXRhLyIsCiAgICAiZG5zX3N1YmRvbWFpbiI6ICJeW2EtejAtOV0oWy1hLXowLTldKlthLXowLTldKT8kIiwKICAgICJwb2RfdWlkIjogIl5bMC05YS1mQS1GXXs4fS1bMC05YS1mQS1GXXs0fS1bMC05YS1mQS1GXXs0fS1bMC05YS1mQS1GXXs0fS1bMC05YS1mQS1GXXsxMn0kIiwKICAgICJkZWZhdWx0X2NhcHMiOiBbCiAgICAgICJDQVBfQ0hPV04iLAogICAgICAiQ0FQX0RBQ19PVkVSUklERSIsCiAgICAgICJDQVBfRlNFVElEIiwKICAgICAgIkNBUF9GT1dORVIiLAogICAgICAiQ0FQX01LTk9EIiwKICAgICAgIkNBUF9ORVRfUkFXIiwKICAgICAgIkNBUF9TRVRHSUQiLAogICAgICAiQ0FQX1NFVFVJRCIsCiAgICAgICJDQVBfU0VURkNBUCIsCiAgICAgICJDQVBfU0VUUENBUCIsCiAgICAgICJDQVBfTkVUX0JJTkRfU0VSVklDRSIsCiAgICAgICJDQVBfU1lTX0NIUk9PVCIsCiAgICAgICJDQVBfS0lMTCIsCiAgICAgICJDQVBfQVVESVRfV1JJVEUiCiAgICBdLAogICAgInByaXZpbGVnZWRfY2FwcyI6IFsKICAgICAgIkNBUF9DSE9XTiIsCiAgICAgICJDQVBfREFDX09WRVJSSURFIiwKICAgICAgIkNBUF9EQUNfUkVBRF9TRUFSQ0giLAogICAgICAiQ0FQX0ZPV05FUiIsCiAgICAgICJDQVBfRlNFVElEIiwKICAgICAgIkNBUF9LSUxMIiwKICAgICAgIkNBUF9TRVRHSUQiLAogICAgICAiQ0FQX1NFVFVJRCIsCiAgICAgICJDQVBfU0VUUENBUCIsCiAgICAgICJDQVBfTElOVVhfSU1NVVRBQkxFIiwKICAgICAgIkNBUF9ORVRfQklORF9TRVJWSUNFIiwKICAgICAgIkNBUF9ORVRfQlJPQURDQVNUIiwKICAgICAgIkNBUF9ORVRfQURNSU4iLAogICAgICAiQ0FQX05FVF9SQVciLAogICAgICAiQ0FQX0lQQ19MT0NLIiwKICAgICAgIkNBUF9JUENfT1dORVIiLAogICAgICAiQ0FQX1NZU19NT0RVTEUiLAogICAgICAiQ0FQX1NZU19SQVdJTyIsCiAgICAgICJDQVBfU1lTX0NIUk9PVCIsCiAgICAgICJDQVBfU1lTX1BUUkFDRSIsCiAgICAgICJDQVBfU1lTX1BBQ0NUIiwKICAgICAgIkNBUF9TWVNfQURNSU4iLAogICAgICAiQ0FQX1NZU19CT09UIiwKICAgICAgIkNBUF9TWVNfTklDRSIsCiAgICAgICJDQVBfU1lTX1JFU09VUkNFIiwKICAgICAgIkNBUF9TWVNfVElNRSIsCiAgICAgICJDQVBfU1lTX1RUWV9DT05GSUciLAogICAgICAiQ0FQX01LTk9EIiwKICAgICAgIkNBUF9MRUFTRSIsCiAgICAgICJDQVBfQVVESVRfV1JJVEUiLAogICAgICAiQ0FQX0FVRElUX0NPTlRST0wiLAogICAgICAiQ0FQX1NFVEZDQVAiLAogICAgICAiQ0FQX01BQ19PVkVSUklERSIsCiAgICAgICJDQVBfTUFDX0FETUlOIiwKICAgICAgIkNBUF9TWVNMT0ciLAogICAgICAiQ0FQX1dBS0VfQUxBUk0iLAogICAgICAiQ0FQX0JMT0NLX1NVU1BFTkQiLAogICAgICAiQ0FQX0FVRElUX1JFQUQiLAogICAgICAiQ0FQX1BFUkZNT04iLAogICAgICAiQ0FQX0JQRiIsCiAgICAgICJDQVBfQ0hFQ0tQT0lOVF9SRVNUT1JFIgogICAgXSwKICAgICJ2aXJ0aW9fYmxrX3N0b3JhZ2VfY2xhc3NlcyI6IFsKICAgICAgImNjLWxvY2FsLWNzaSIsCiAgICAgICJjYy1tYW5hZ2VkLWNzaSIsCiAgICAgICJjYy1tYW5hZ2VkLXByZW1pdW0tY3NpIgogICAgXSwKICAgICJzbWJfc3RvcmFnZV9jbGFzc2VzIjogWwogICAgICB7CiAgICAgICAgIm5hbWUiOiAiYXp1cmVmaWxlLWNzaS1rYXRhLWNjIiwKICAgICAgICAibW91bnRfb3B0aW9ucyI6IFsKICAgICAgICAgICJkaXJfbW9kZT0wNzc3IiwKICAgICAgICAgICJmaWxlX21vZGU9MDc3NyIsCiAgICAgICAgICAibWZzeW1saW5rcyIsCiAgICAgICAgICAiY2FjaGU9c3RyaWN0IiwKICAgICAgICAgICJub3NoYXJlc29jayIsCiAgICAgICAgICAiYWN0aW1lbz0zMCIsCiAgICAgICAgICAibm9icmwiCiAgICAgICAgXQogICAgICB9CiAgICBdCiAgfSwKICAic2FuZGJveCI6IHsKICAgICJzdG9yYWdlcyI6IFsKICAgICAgewogICAgICAgICJkcml2ZXIiOiAiZXBoZW1lcmFsIiwKICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAic291cmNlIjogInNobSIsCiAgICAgICAgImZzdHlwZSI6ICJ0bXBmcyIsCiAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgIm5vZGV2IiwKICAgICAgICAgICJtb2RlPTE3NzciLAogICAgICAgICAgInNpemU9NjcxMDg4NjQiCiAgICAgICAgXSwKICAgICAgICAibW91bnRfcG9pbnQiOiAiL3J1bi9rYXRhLWNvbnRhaW5lcnMvc2FuZGJveC9zaG0iLAogICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgfQogICAgXQogIH0sCiAgInJlcXVlc3RfZGVmYXVsdHMiOiB7CiAgICAiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdCI6IHsKICAgICAgImFsbG93X2Vudl9yZWdleCI6IFsKICAgICAgICAiXkhPU1ROQU1FPSQoZG5zX2xhYmVsKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfUE9SVF8kKGlwX3ApX1RDUD10Y3A6Ly8kKGlwdjRfYSk6JChpcF9wKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfUE9SVF8kKGlwX3ApX1RDUF9QUk9UTz10Y3AkIiwKICAgICAgICAiXiQoc3ZjX25hbWUpX1BPUlRfJChpcF9wKV9UQ1BfUE9SVD0kKGlwX3ApJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9QT1JUXyQoaXBfcClfVENQX0FERFI9JChpcHY0X2EpJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9TRVJWSUNFX0hPU1Q9JChpcHY0X2EpJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9TRVJWSUNFX1BPUlQ9JChpcF9wKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfU0VSVklDRV9QT1JUXyQoZG5zX2xhYmVsKT0kKGlwX3ApJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9QT1JUPXRjcDovLyQoaXB2NF9hKTokKGlwX3ApJCIsCiAgICAgICAgIl5BWlVSRV9DTElFTlRfSUQ9W0EtRmEtZjAtOS1dKiQiLAogICAgICAgICJeQVpVUkVfVEVOQU5UX0lEPVtBLUZhLWYwLTktXSokIiwKICAgICAgICAiXkFaVVJFX0ZFREVSQVRFRF9UT0tFTl9GSUxFPS92YXIvcnVuL3NlY3JldHMvYXp1cmUvdG9rZW5zL2F6dXJlLWlkZW50aXR5LXRva2VuJCIsCiAgICAgICAgIl5BWlVSRV9BVVRIT1JJVFlfSE9TVD1odHRwczovL2xvZ2luXFwubWljcm9zb2Z0b25saW5lXFwuY29tLyQiLAogICAgICAgICJeVEVSTT14dGVybSQiCiAgICAgIF0sCiAgICAgICJhbGxvd19lbnZfcmVnZXhfbWFwIjogewogICAgICAgICJDUFVfTElNSVQiOiAiXlswLTldKyQiLAogICAgICAgICJKT0JfQ09NUExFVElPTl9JTkRFWCI6ICJeWzAtOV0qJCIsCiAgICAgICAgIk1FTU9SWV9MSU1JVCI6ICJeWzAtOV0rJCIKICAgICAgfQogICAgfSwKICAgICJDb3B5RmlsZVJlcXVlc3QiOiBbCiAgICAgICIkKHNmcHJlZml4KSIKICAgIF0sCiAgICAiRXhlY1Byb2Nlc3NSZXF1ZXN0IjogewogICAgICAiYWxsb3dlZF9jb21tYW5kcyI6IFtdLAogICAgICAicmVnZXgiOiBbXQogICAgfSwKICAgICJVcGRhdGVSb3V0ZXNSZXF1ZXN0IjogewogICAgICAiZm9yYmlkZGVuX2RldmljZV9uYW1lcyI6IFsKICAgICAgICAibG8iCiAgICAgIF0sCiAgICAgICJmb3JiaWRkZW5fc291cmNlX3JlZ2V4IjogWwogICAgICAgICJeKD86MHswLDR9Oil7MCw3fTB7MCwzfTEkIiwKICAgICAgICAiXjEyN1xcLig/OlswLTldezEsM31cXC4pezJ9WzAtOV17MSwzfSQiCiAgICAgIF0KICAgIH0sCiAgICAiVXBkYXRlSW50ZXJmYWNlUmVxdWVzdCI6IHsKICAgICAgImFsbG93X3Jhd19mbGFncyI6IDEyOCwKICAgICAgImZvcmJpZGRlbl9uYW1lcyI6IFsKICAgICAgICAibG8iCiAgICAgIF0sCiAgICAgICJmb3JiaWRkZW5faHdfYWRkcnMiOiBbCiAgICAgICAgIjAwOjAwOjAwOjAwOjAwOjAwIgogICAgICBdCiAgICB9LAogICAgIkNsb3NlU3RkaW5SZXF1ZXN0IjogZmFsc2UsCiAgICAiUmVhZFN0cmVhbVJlcXVlc3QiOiBmYWxzZSwKICAgICJVcGRhdGVFcGhlbWVyYWxNb3VudHNSZXF1ZXN0IjogZmFsc2UsCiAgICAiV3JpdGVTdHJlYW1SZXF1ZXN0IjogZmFsc2UKICB9Cn0= + spec: + restartPolicy: Never + runtimeClassName: kata-cc + containers: + - name: pi + image: "mcr.microsoft.com/acc/samples/acc-perl:1.0" + command: + - perl + - "-Mbignum=bpi" + - "-wle" + - print bpi(2000) + backoffLimit: 4 diff --git a/src/agent/samples/policy/yaml/kubernetes/fixtures/limits.yaml b/src/agent/samples/policy/yaml/kubernetes/fixtures/limits.yaml new file mode 100644 index 000000000000..46f8a6bf601c --- /dev/null +++ b/src/agent/samples/policy/yaml/kubernetes/fixtures/limits.yaml @@ -0,0 +1,27 @@ +--- +apiVersion: v1 +kind: LimitRange +metadata: + name: mylimits +spec: + limits: + - max: + cpu: "2" + memory: 1Gi + min: + cpu: 200m + memory: 6Mi + type: Pod + - default: + cpu: 300m + memory: 200Mi + defaultRequest: + cpu: 200m + memory: 100Mi + max: + cpu: "2" + memory: 1Gi + min: + cpu: 100m + memory: 3Mi + type: Container diff --git a/src/agent/samples/policy/yaml/kubernetes/fixtures/multi-resource-yaml.yaml b/src/agent/samples/policy/yaml/kubernetes/fixtures/multi-resource-yaml.yaml new file mode 100644 index 000000000000..354c3000a0b2 --- /dev/null +++ b/src/agent/samples/policy/yaml/kubernetes/fixtures/multi-resource-yaml.yaml @@ -0,0 +1,40 @@ +--- +apiVersion: v1 +kind: ReplicationController +metadata: + name: first-rc +spec: + replicas: 1 + selector: + app: mock + template: + metadata: + labels: + app: mock + annotations: + io.katacontainers.config.agent.policy: IyBDb3B5cmlnaHQgKGMpIDIwMjMgTWljcm9zb2Z0IENvcnBvcmF0aW9uCiMKIyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMAojCnBhY2thZ2UgYWdlbnRfcG9saWN5CgppbXBvcnQgZnV0dXJlLmtleXdvcmRzLmluCmltcG9ydCBmdXR1cmUua2V5d29yZHMuZXZlcnkKCiMgRGVmYXVsdCB2YWx1ZXMsIHJldHVybmVkIGJ5IE9QQSB3aGVuIHJ1bGVzIGNhbm5vdCBiZSBldmFsdWF0ZWQgdG8gdHJ1ZS4KZGVmYXVsdCBBZGRBUlBOZWlnaGJvcnNSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgQWRkU3dhcFJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBDbG9zZVN0ZGluUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IENvcHlGaWxlUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IENyZWF0ZUNvbnRhaW5lclJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBDcmVhdGVTYW5kYm94UmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IERlc3Ryb3lTYW5kYm94UmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgRXhlY1Byb2Nlc3NSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgR2V0T09NRXZlbnRSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBHdWVzdERldGFpbHNSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBMaXN0SW50ZXJmYWNlc1JlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBMaXN0Um91dGVzUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IE1lbUhvdHBsdWdCeVByb2JlUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IE9ubGluZUNQVU1lbVJlcXVlc3QgOj0gdHJ1ZQpkZWZhdWx0IFBhdXNlQ29udGFpbmVyUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFJlYWRTdHJlYW1SZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgUmVtb3ZlQ29udGFpbmVyUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgUmVtb3ZlU3RhbGVWaXJ0aW9mc1NoYXJlTW91bnRzUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgUmVzZWVkUmFuZG9tRGV2UmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFJlc3VtZUNvbnRhaW5lclJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBTZXRHdWVzdERhdGVUaW1lUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFNldFBvbGljeVJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBTaWduYWxQcm9jZXNzUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgU3RhcnRDb250YWluZXJSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBTdGFydFRyYWNpbmdSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgU3RhdHNDb250YWluZXJSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBTdG9wVHJhY2luZ1JlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBUdHlXaW5SZXNpemVSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBVcGRhdGVDb250YWluZXJSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgVXBkYXRlRXBoZW1lcmFsTW91bnRzUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFVwZGF0ZUludGVyZmFjZVJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBVcGRhdGVSb3V0ZXNSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgV2FpdFByb2Nlc3NSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBXcml0ZVN0cmVhbVJlcXVlc3QgOj0gZmFsc2UKCiMgQWxsb3dSZXF1ZXN0c0ZhaWxpbmdQb2xpY3kgOj0gdHJ1ZSBjb25maWd1cmVzIHRoZSBBZ2VudCB0byAqYWxsb3cgYW55CiMgcmVxdWVzdHMgY2F1c2luZyBhIHBvbGljeSBmYWlsdXJlKi4gVGhpcyBpcyBhbiB1bnNlY3VyZSBjb25maWd1cmF0aW9uCiMgYnV0IGlzIHVzZWZ1bCBmb3IgYWxsb3dpbmcgdW5zZWN1cmUgcG9kcyB0byBzdGFydCwgdGhlbiBjb25uZWN0IHRvCiMgdGhlbSBhbmQgaW5zcGVjdCBPUEEgbG9ncyBmb3IgdGhlIHJvb3QgY2F1c2Ugb2YgYSBmYWlsdXJlLgpkZWZhdWx0IEFsbG93UmVxdWVzdHNGYWlsaW5nUG9saWN5IDo9IGZhbHNlCgojIENvbnN0YW50cwpTX05BTUVfS0VZID0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZSIKU19OQU1FU1BBQ0VfS0VZID0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZXNwYWNlIgpCVU5ETEVfSUQgPSAiW2EtejAtOV17NjR9IgoKQ3JlYXRlQ29udGFpbmVyUmVxdWVzdDo9IHJlc3AgewogICAgbm90IGlzX251bGwoaW5wdXQuZW52X21hcCkKICAgIAogICAgaV9lbnZfbWFwIDo9IGlucHV0LmVudl9tYXAKICAgIAogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBwX2Vudl9tYXAgOj0gcF9jb250YWluZXIuZW52X21hcCAgCiAgICBhbGxvd19lbnZfbWFwKHBfZW52X21hcCwgaV9lbnZfbWFwKQogICAgCiAgICBpX3Byb2Nlc3MgOj0gaW5wdXQuYmFzZS5PQ0kuUHJvY2VzcwogICAgCiAgICBwX3Byb2Nlc3MgOj0gcF9jb250YWluZXIuT0NJLlByb2Nlc3MKICAgIAogICAgYWxsb3dfYXJncyhpX3Byb2Nlc3MsIHBfcHJvY2VzcywgaV9lbnZfbWFwKQoKICAgIHJlc3AgPSBDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uKGlucHV0LmJhc2UpCiAgICBwcmludCgiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdDogdHJ1ZSIpCn0KCmFsbG93X2FyZ3MoaV9wcm9jZXNzLCBwX3Byb2Nlc3MsIGlfZW52X21hcCkgewogICAgaV9hcmdzIDo9IGlfcHJvY2Vzcy5BcmdzCiAgICBwX2FyZ3MgOj0gcF9wcm9jZXNzLkFyZ3MKICAgIHByaW50KCJhbGxvd19hcmdzOiBpX2FyZ3MgPSIsIGlfYXJncywgInBfYXJncyA9IiwgcF9hcmdzKQogICAgY291bnQoaV9hcmdzKSA9PSBjb3VudChwX2FyZ3MpCiAgICBldmVyeSBpLCBpX2FyZyBpbiBpX2FyZ3MgewogICAgICAgIHByaW50KCJhbGxvd19hcmdzOiBpX2FyZyA9IiwgaV9hcmcpCiAgICAgICAgcF9hcmdfcmVwbGFjZWQgOj0gcmVwbGFjZV9lbnZfdmFyaWFibGVzKHBfYXJnc1tpXSwgaV9lbnZfbWFwKQogICAgICAgIHByaW50KCJhbGxvd19hcmdzOiBwX2FyZ19yZXBsYWNlZCA9IiwgcF9hcmdfcmVwbGFjZWQpCiAgICAgICAgcF9hcmdfcmVwbGFjZWQyIDo9IHJlcGxhY2UocF9hcmdfcmVwbGFjZWQsICIkJCIsICIkIikKICAgICAgICBwcmludCgiYWxsb3dfYXJnczogcF9hcmdfcmVwbGFjZWQyID0iLCBwX2FyZ19yZXBsYWNlZDIpCiAgICAgICAgaV9hcmcgPT0gcF9hcmdfcmVwbGFjZWQyCiAgICB9CiAgICBwcmludCgiYWxsb3dfYXJnczogdHJ1ZSIpCn0KCmFsbG93X2FyZ3MoaV9wcm9jZXNzLCBwX3Byb2Nlc3MsIGlfZW52X21hcCkgewogICAgbm90IGlfcHJvY2Vzcy5BcmdzCiAgICBub3QgcF9wcm9jZXNzLkFyZ3MKICAgIHByaW50KCJhbGxvd19hcmdzMjogbm8gYXJncyIpCn0KCiMgdGhpcyBmdW5jdGlvbiByZXBsYWNlcyBhbGwgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyBpbiBhIHN0cmluZywgZ2l2ZW4gYSBtYXAgb2YgZW52aXJvbm1lbnQga2V5cyB0byBlbnZpcm9ubWVudCB2YWx1ZXMKIyBlZyBzdHIgPSAiZWNobyAkKENMVVNURVJfSUQpOyBlY2hvICQoTk9ERV9OQU1FKTsiCiMgZW52X21hcCA9IHsiQ0xVU1RFUl9JRCI6ICJhYmMiLCAiTk9ERV9OQU1FIiA6ICJ4eXoifQojIHJlc3VsdCA9ICJlY2hvIGFiYzsgZWNobyB4eXo7IgpyZXBsYWNlX2Vudl92YXJpYWJsZXMoc3RyLCBlbnZfbWFwKSA9IHJlc3VsdCB7CiAgICAjIG1ha2UgYW4gYXJyYXkgb2YgdGhlIGtleXMgZWcgWyJDTFVTVEVSX0lEIiwgIk5PREVfTkFNRSJdCiAgICBrZXlzIDo9IFt4IHwgc29tZSB4IGluIG9iamVjdC5rZXlzKGVudl9tYXApXQogICAgcmVzdWx0IDo9IHJlcGxhY2Vfc3RyX3JlYyhzdHIsIGVudl9tYXAsIGtleXMsIGNvdW50KGtleXMpIC0gMSkKfQoKIyBiYXNlIGNhc2UKcmVwbGFjZV9zdHJfcmVjKHN0ciwgZW52X21hcCwgYXJyX2tleXMsIGkpID0gcmVzdWx0IHsKICAgIGkgPCAwCiAgICByZXN1bHQgOj0gc3RyCn0KCiMgcmVjdXJzaXZlIHN0ZXAKcmVwbGFjZV9zdHJfcmVjKHN0ciwgZW52X21hcCwgYXJyX2tleXMsIGkpID0gcmVzdWx0IHsKICAgIGkgPj0gMAogICAga2V5IDo9IGFycl9rZXlzW2ldCiAgICBlbnZfa2V5MSA6PSBjb25jYXQoIiIsIFsiJCgiLCBrZXksICIpIl0pCiAgICAjIHJlcGxhY2UgJChWQVIpIHdpdGggdmFsdWUKICAgIG5ld19zdHIxIDo9IHJlcGxhY2Uoc3RyLCBlbnZfa2V5MSwgZW52X21hcFtrZXldKQogICAgIyByZXBsYWNlIG5leHQgZW52aXJvbm1lbnQgdmFyaWFibGUKICAgIHJlc3VsdCA9IHJlcGxhY2Vfc3RyX3JlYyhuZXdfc3RyMSwgZW52X21hcCwgYXJyX2tleXMsIGkgLSAxKQp9CgphbGxvd19lbnZfbWFwKHBfZW52X21hcCwgaV9lbnZfbWFwKSB7CiAgICBwcmludCgiYWxsb3dfZW52X21hcDogcF9lbnZfbWFwID0iLCBwX2Vudl9tYXApCiAgICBldmVyeSBlbnZfa2V5LCBlbnZfdmFsIGluIGlfZW52X21hcCB7CiAgICAgICAgcHJpbnQoImFsbG93X2VudjogZW52X2tleSA9IiwgZW52X2tleSwgImVudl92YWwgPSIsIGVudl92YWwpCiAgICAgICAgYWxsb3dfZW52X21hcF9lbnRyeShlbnZfa2V5LCBlbnZfdmFsLCBwX2Vudl9tYXApCiAgICB9CiAgICBwcmludCgiYWxsb3dfZW52X21hcDogdHJ1ZSIpCn0KCiMgQWxsb3cgZXhhY3QgbWF0Y2gKYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBpX3ZhbCA9PSBwX3ZhbAogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnk6IHRydWUiKQp9CgojIEFsbG93IHJlc291cmNlRmllbGRSZWYgdmFsdWVzIChlLmcuLCAibGltaXRzLmNwdSIpLgphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgICMgYSB2YXJpYWJsZSB3ZSBzaG91bGQgYmUgdmFsaWRhdGluZyB1c2luZyBhIHJlZ2V4IGZyb20gc2V0dGluZ3MKICAgIHBfdmFsID09ICIkKHZhbGlkYXRlLWZyb20tc2V0dGluZ3MpIgogICAgcmVnZXhfdmFsIDo9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuQ3JlYXRlQ29udGFpbmVyUmVxdWVzdC5hbGxvd19lbnZfcmVnZXhfbWFwW2tleV0KICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4X3ZhbCwgaV92YWwpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSAyOiB0cnVlIikKfQoKIyBBbGxvdyBub2RlLW5hbWUKYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChub2RlLW5hbWUpIgogICAgcmVnZXgubWF0Y2gocG9saWN5X2RhdGEuY29tbW9uLmRuc19zdWJkb21haW4gLCBpX3ZhbCkKICAgIHByaW50KCJhbGxvd19lbnZfbWFwX2VudHJ5IDM6IHRydWUiKQp9CgojIEFsbG93IGhvc3QtbmFtZQphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgIHBfdmFsID09ICIkKGhvc3QtbmFtZSkiCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24uZG5zX2xhYmVsICwgaV92YWwpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSA0OiB0cnVlIikKfQoKIyBBbGxvdyBwb2QtdWlkCmFsbG93X2Vudl9tYXBfZW50cnkoa2V5LCBpX3ZhbCwgcF9lbnZfbWFwKSB7CiAgICBwX3ZhbCA6PSBwX2Vudl9tYXBba2V5XQogICAgcF92YWwgPT0gIiQocG9kLXVpZCkiCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24ucG9kX3VpZCAsIGlfdmFsKQogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgNTogdHJ1ZSIpCn0KCiMgQWxsb3cgZmllbGRSZWYgImZpZWxkUGF0aDogc3RhdHVzLnBvZElQIiB2YWx1ZXMuCmFsbG93X2Vudl9tYXBfZW50cnkoa2V5LCBpX3ZhbCwgcF9lbnZfbWFwKSB7CiAgICBpc19pcChpX3ZhbCkKCiAgICBwX3ZhbCA6PSBwX2Vudl9tYXBba2V5XQogICAgcF92YXIgOj0gY29uY2F0KCI9IiwgW2tleSwgcF92YWxdKQogICAgYWxsb3dfcG9kX2lwX3ZhcihrZXksIHBfdmFyKQogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgNjogdHJ1ZSIpCn0KCiMgQWxsb3cgZmllbGRSZWYgImZpZWxkUGF0aDogc3RhdHVzLmhvc3RJUCIgdmFsdWVzLgphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgaXNfaXAoaV92YWwpCgogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgIHBfdmFyIDo9IGNvbmNhdCgiPSIsIFtrZXksIHBfdmFsXSkKICAgIGFsbG93X2hvc3RfaXBfdmFyKGtleSwgcF92YXIpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSA3OiB0cnVlIikKfQoKIyBNYXRjaCBpbnB1dCB3aXRoIG9uZSBvZiB0aGUgcG9saWN5IHZhcmlhYmxlcywgYWZ0ZXIgc3Vic3RpdHV0aW5nICQoc2FuZGJveC1uYW1lKS4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChzYW5kYm94LW5hbWUpIgogICAgc19uYW1lIDo9IGlucHV0LmJhc2UuT0NJLkFubm90YXRpb25zW1NfTkFNRV9LRVldCiAgICBwX3ZhcjIgOj0gcmVwbGFjZShwX3ZhbCwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHBfdmFyMiA9PSBpX3ZhbAogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgODogdHJ1ZSIpCn0KCiMgTWF0Y2ggaW5wdXQgd2l0aCBvbmUgb2YgdGhlIHBvbGljeSB2YXJpYWJsZXMsIGFmdGVyIHN1YnN0aXR1dGluZyAkKHNhbmRib3gtbmFtZXNwYWNlKS4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChzYW5kYm94LW5hbWVzcGFjZSkiCiAgICBzX25hbWVzcGFjZSA6PSBpbnB1dC5iYXNlLk9DSS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwX3ZhcjIgOj0gcmVwbGFjZShwX3ZhbCwgIiQoc2FuZGJveC1uYW1lc3BhY2UpIiwgc19uYW1lc3BhY2UpCiAgICBwX3ZhcjIgPT0gaV92YWwKICAgIHByaW50KCJhbGxvd19lbnZfbWFwX2VudHJ5IDk6IHRydWUiKQp9CgojIEFsbG93IGlucHV0IGVudiB2YXJpYWJsZXMgdGhhdCBtYXRjaCB3aXRoIGEgcmVxdWVzdF9kZWZhdWx0cyByZWdleC4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHNvbWUgcF9yZWdleDEgaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5DcmVhdGVDb250YWluZXJSZXF1ZXN0LmFsbG93X2Vudl9yZWdleAogICAgcF9yZWdleDIgOj0gcmVwbGFjZShwX3JlZ2V4MSwgIiQoaXB2NF9hKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcHY0X2EpCiAgICBwX3JlZ2V4MyA6PSByZXBsYWNlKHBfcmVnZXgyLCAiJChpcF9wKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcF9wKQogICAgcF9yZWdleDQgOj0gcmVwbGFjZShwX3JlZ2V4MywgIiQoc3ZjX25hbWUpIiwgcG9saWN5X2RhdGEuY29tbW9uLnN2Y19uYW1lKQogICAgcF9yZWdleDUgOj0gcmVwbGFjZShwX3JlZ2V4NCwgIiQoZG5zX2xhYmVsKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5kbnNfbGFiZWwpCgogICAgcmVzdWx0IDo9IGNvbmNhdCgiPSIsIFtrZXksIGlfdmFsXSkKICAgIHJlZ2V4Lm1hdGNoKHBfcmVnZXg1LCByZXN1bHQpCgogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgMTA6IHRydWUiKQp9CgpDcmVhdGVDb250YWluZXJSZXF1ZXN0Oj0gcmVzcCB7CiAgICBub3QgaW5wdXQuZW52X21hcAogICAgaV9wcm9jZXNzID0gaW5wdXQuT0NJLlByb2Nlc3MKICAgIHNfbmFtZSA9IGlucHV0Lk9DSS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBwX3Byb2Nlc3MgPSBwX2NvbnRhaW5lci5PQ0kuUHJvY2VzcwogICAgYWxsb3dfZGVwcmVjYXRlZF9hcmdzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUpCiAgICByZXNwID0gQ3JlYXRlQ29udGFpbmVyUmVxdWVzdENvbW1vbihpbnB1dCkKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0MjogdHJ1ZSIpCn0KCkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb24ocmVxKTo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgICMgQ2hlY2sgaWYgdGhlIGlucHV0IHJlcXVlc3Qgc2hvdWxkIGJlIHJlamVjdGVkIGV2ZW4gYmVmb3JlIGNoZWNraW5nIHRoZQogICAgIyBwb2xpY3lfZGF0YS5jb250YWluZXJzIGluZm9ybWF0aW9uLgogICAgYWxsb3dfY3JlYXRlX2NvbnRhaW5lcl9pbnB1dChyZXEpCgogICAgaV9vY2kgOj0gcmVxLk9DSQogICAgaV9zdG9yYWdlcyA6PSByZXEuc3RvcmFnZXMKICAgIGlfZGV2aWNlcyA6PSByZXEuZGV2aWNlcwoKICAgICMgYXJyYXkgb2YgcG9zc2libGUgc3RhdGUgb3BlcmF0aW9ucwogICAgb3BzX2J1aWxkZXIgOj0gW10KCiAgICAjIGNoZWNrIHNhbmRib3ggbmFtZQogICAgc2FuZGJveF9uYW1lID0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FX0tFWV0KICAgIGFkZF9zYW5kYm94X25hbWVfdG9fc3RhdGUgOj0gc3RhdGVfYWxsb3dzKCJzYW5kYm94X25hbWUiLCBzYW5kYm94X25hbWUpCiAgICBvcHNfYnVpbGRlcjEgOj0gY29uY2F0X29wX2lmX25vdF9udWxsKG9wc19idWlsZGVyLCBhZGRfc2FuZGJveF9uYW1lX3RvX3N0YXRlKQoKICAgICMgQ2hlY2sgaWYgYW55IGVsZW1lbnQgZnJvbSB0aGUgcG9saWN5X2RhdGEuY29udGFpbmVycyBhcnJheSBhbGxvd3MgdGhlIGlucHV0IHJlcXVlc3QuCiAgICBzb21lIHBfY29udGFpbmVyIGluIHBvbGljeV9kYXRhLmNvbnRhaW5lcnMKICAgIHByaW50KCI9PT09PT09PSBDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiB0cnlpbmcgbmV4dCBwb2xpY3kgY29udGFpbmVyIikKCiAgICBwX3BpZG5zIDo9IHBfY29udGFpbmVyLnNhbmRib3hfcGlkbnMKICAgIGlfcGlkbnMgOj0gcmVxLnNhbmRib3hfcGlkbnMKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiBwX3BpZG5zID0iLCBwX3BpZG5zLCAiaV9waWRucyA9IiwgaV9waWRucykKICAgIHBfcGlkbnMgPT0gaV9waWRucwoKICAgIHBfb2NpIDo9IHBfY29udGFpbmVyLk9DSQoKICAgICMgY2hlY2sgbmFtZXNwYWNlCiAgICBwX25hbWVzcGFjZSA6PSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBpX25hbWVzcGFjZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwcmludCAoIkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb246IHBfbmFtZXNwYWNlID0iLCBwX25hbWVzcGFjZSwgImlfbmFtZXNwYWNlID0iLCBpX25hbWVzcGFjZSkKICAgIGFkZF9uYW1lc3BhY2VfdG9fc3RhdGUgOj0gYWxsb3dfbmFtZXNwYWNlKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkKICAgIG9wc19idWlsZGVyMiA6PSBjb25jYXRfb3BfaWZfbm90X251bGwob3BzX2J1aWxkZXIxLCBhZGRfbmFtZXNwYWNlX3RvX3N0YXRlKQoKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiBwIFZlcnNpb24gPSIsIHBfb2NpLlZlcnNpb24sICJpIFZlcnNpb24gPSIsIGlfb2NpLlZlcnNpb24pCiAgICBwX29jaS5WZXJzaW9uID09IGlfb2NpLlZlcnNpb24KCiAgICBwcmludCgiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdENvbW1vbjogcCBSZWFkb25seSA9IiwgcF9vY2kuUm9vdC5SZWFkb25seSwgImkgUmVhZG9ubHkgPSIsIGlfb2NpLlJvb3QuUmVhZG9ubHkpCiAgICBwX29jaS5Sb290LlJlYWRvbmx5ID09IGlfb2NpLlJvb3QuUmVhZG9ubHkKCiAgICBhbGxvd19hbm5vKHBfb2NpLCBpX29jaSkKCiAgICBwX3N0b3JhZ2VzIDo9IHBfY29udGFpbmVyLnN0b3JhZ2VzCiAgICBhbGxvd19ieV9hbm5vKHBfb2NpLCBpX29jaSwgcF9zdG9yYWdlcywgaV9zdG9yYWdlcykKCiAgICBwX2RldmljZXMgOj0gcF9jb250YWluZXIuZGV2aWNlcwogICAgYWxsb3dfZGV2aWNlcyhwX2RldmljZXMsIGlfZGV2aWNlcykKCiAgICByZXQgOj0gYWxsb3dfbGludXgob3BzX2J1aWxkZXIyLCBwX29jaSwgaV9vY2kpCiAgICByZXQuYWxsb3dlZAoKICAgIG9wcyA6PSByZXQub3BzCgogICAgcHJpbnQoIkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb246IHRydWUiKQp9CgphbGxvd19jcmVhdGVfY29udGFpbmVyX2lucHV0KHJlcSkgewogICAgcHJpbnQoImFsbG93X2NyZWF0ZV9jb250YWluZXJfaW5wdXQ6IGlucHV0ID0iLCByZXEpCgogICAgY291bnQocmVxLnNoYXJlZF9tb3VudHMpID09IDAKICAgIGlzX251bGwocmVxLnN0cmluZ191c2VyKQoKICAgIGlfb2NpIDo9IHJlcS5PQ0kKICAgIGlzX251bGwoaV9vY2kuSG9va3MpCiAgICBpc19udWxsKGlfb2NpLlNvbGFyaXMpCiAgICBpc19udWxsKGlfb2NpLldpbmRvd3MpCgogICAgaV9saW51eCA6PSBpX29jaS5MaW51eAogICAgY291bnQoaV9saW51eC5HSURNYXBwaW5ncykgPT0gMAogICAgY291bnQoaV9saW51eC5Nb3VudExhYmVsKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlJlc291cmNlcy5EZXZpY2VzKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlJvb3Rmc1Byb3BhZ2F0aW9uKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlVJRE1hcHBpbmdzKSA9PSAwCiAgICBpc19udWxsKGlfbGludXguSW50ZWxSZHQpCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLkJsb2NrSU8pCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLk5ldHdvcmspCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLlBpZHMpCiAgICBpc19udWxsKGlfbGludXguU2VjY29tcCkKCiAgICBpX3Byb2Nlc3MgOj0gaV9vY2kuUHJvY2VzcwogICAgY291bnQoaV9wcm9jZXNzLlNlbGludXhMYWJlbCkgPT0gMAogICAgY291bnQoaV9wcm9jZXNzLlVzZXIuVXNlcm5hbWUpID09IDAKCiAgICBwcmludCgiYWxsb3dfY3JlYXRlX2NvbnRhaW5lcl9pbnB1dDogdHJ1ZSIpCn0KCmFsbG93X25hbWVzcGFjZShwX25hbWVzcGFjZSwgaV9uYW1lc3BhY2UpID0gYWRkX25hbWVzcGFjZSB7CiAgICBwX25hbWVzcGFjZSA9PSBpX25hbWVzcGFjZQogICAgYWRkX25hbWVzcGFjZSA6PSBudWxsCiAgICBwcmludCgiYWxsb3dfbmFtZXNwYWNlIDE6IGlucHV0IG5hbWVzcGFjZSBtYXRjaGVzIHBvbGljeSBkYXRhIikKfQoKYWxsb3dfbmFtZXNwYWNlKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkgPSBhZGRfbmFtZXNwYWNlIHsKICAgIHBfbmFtZXNwYWNlID09ICIiCiAgICBwcmludCgiYWxsb3dfbmFtZXNwYWNlIDI6IG5vIG5hbWVzcGFjZSBmb3VuZCBvbiBwb2xpY3kgZGF0YSIpCiAgICBhZGRfbmFtZXNwYWNlIDo9IHN0YXRlX2FsbG93cygibmFtZXNwYWNlIiwgaV9uYW1lc3BhY2UpCn0KCiMgdmFsdWUgaGFzbid0IGJlZW4gc2VlbiBiZWZvcmUsIHNhdmUgaXQgdG8gc3RhdGUKc3RhdGVfYWxsb3dzKGtleSwgdmFsdWUpID0gYWN0aW9uIHsKICBzdGF0ZSA6PSBnZXRfc3RhdGUoKQogIHByaW50KCJzdGF0ZV9hbGxvd3MgMTogc3RhdGVba2V5XSA9Iiwgc3RhdGVba2V5XSwgInZhbHVlID0iLCB2YWx1ZSkKICBub3Qgc3RhdGVba2V5XQogIHByaW50KCJzdGF0ZV9hbGxvd3MgMTogc2F2aW5nIHRvIHN0YXRlIGtleSA9Iiwga2V5LCAidmFsdWUgPSIsIHZhbHVlKQogIHBhdGggOj0gZ2V0X3N0YXRlX3BhdGgoa2V5KSAKICBhY3Rpb24gOj0gewogICAgIm9wIjogImFkZCIsCiAgICAicGF0aCI6IHBhdGgsIAogICAgInZhbHVlIjogdmFsdWUsCiAgfQp9CgojIHZhbHVlIG1hdGNoZXMgd2hhdCdzIGluIHN0YXRlLCBhbGxvdyBpdApzdGF0ZV9hbGxvd3Moa2V5LCB2YWx1ZSkgPSBhY3Rpb24gewogIHByaW50KCJzdGF0ZV9hbGxvd3MgMjogc3RhcnQiKQogIHN0YXRlIDo9IGdldF9zdGF0ZSgpCiAgcHJpbnQoInN0YXRlX2FsbG93cyAyOiBzdGF0ZVtrZXldID0iLCBzdGF0ZVtrZXldLCAidmFsdWUgPSIsIHZhbHVlKQogIHZhbHVlID09IHN0YXRlW2tleV0KICBwcmludCgic3RhdGVfYWxsb3dzIDI6IGZvdW5kIGtleSA9Iiwga2V5LCAidmFsdWUgPSIsIHZhbHVlLCAiIGluIHN0YXRlIikKICBhY3Rpb24gOj0gbnVsbAp9CgojIGhlbHBlciBmdW5jdGlvbnMgdG8gaW50ZXJhY3Qgd2l0aCB0aGUgc3RhdGUKZ2V0X3N0YXRlKCkgPSBzdGF0ZSB7CiAgc3RhdGUgOj0gZGF0YVsicHN0YXRlIl0KfQoKZ2V0X3N0YXRlX3ZhbChrZXkpID0gdmFsdWUgewogICAgc3RhdGUgOj0gZ2V0X3N0YXRlKCkKICAgIHZhbHVlIDo9IHN0YXRlW2tleV0KfQoKZ2V0X3N0YXRlX3BhdGgoa2V5KSA9IHBhdGggewogICAgIyBwcmVwZW5kICIvcHN0YXRlLyIgdG8ga2V5CiAgICBwYXRoIDo9IGNvbmNhdCgiLyIsIFsiL3BzdGF0ZSIsIGtleV0pCn0KCiMgSGVscGVyIGZ1bmN0aW9ucyB0byBjb25kaXRpb25hbGx5IGNvbmNhdGVuYXRlIG9wIGlzIG5vdCBudWxsCmNvbmNhdF9vcF9pZl9ub3RfbnVsbChvcHMsIG9wKSA9IHJlc3VsdCB7CiAgICBvcCA9PSBudWxsCiAgICByZXN1bHQgOj0gb3BzCn0KCmNvbmNhdF9vcF9pZl9ub3RfbnVsbChvcHMsIG9wKSA9IHJlc3VsdCB7CiAgICBvcCAhPSBudWxsCiAgICByZXN1bHQgOj0gYXJyYXkuY29uY2F0KG9wcywgW29wXSkKfQoKIyBSZWplY3QgdW5leHBlY3RlZCBhbm5vdGF0aW9ucy4KYWxsb3dfYW5ubyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19hbm5vIDE6IHN0YXJ0IikKCiAgICBub3QgaV9vY2kuQW5ub3RhdGlvbnMKCiAgICBwcmludCgiYWxsb3dfYW5ubyAxOiB0cnVlIikKfQphbGxvd19hbm5vKHBfb2NpLCBpX29jaSkgewogICAgcHJpbnQoImFsbG93X2Fubm8gMjogcCBBbm5vdGF0aW9ucyA9IiwgcF9vY2kuQW5ub3RhdGlvbnMpCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiBpIEFubm90YXRpb25zID0iLCBpX29jaS5Bbm5vdGF0aW9ucykKCiAgICBpX2tleXMgOj0gb2JqZWN0LmtleXMoaV9vY2kuQW5ub3RhdGlvbnMpCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiBpIGtleXMgPSIsIGlfa2V5cykKCiAgICBldmVyeSBpX2tleSBpbiBpX2tleXMgewogICAgICAgIGFsbG93X2Fubm9fa2V5KGlfa2V5LCBwX29jaSkKICAgIH0KCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiB0cnVlIikKfQoKYWxsb3dfYW5ub19rZXkoaV9rZXksIHBfb2NpKSB7CiAgICBwcmludCgiYWxsb3dfYW5ub19rZXkgMTogaSBrZXkgPSIsIGlfa2V5KQoKICAgIHN0YXJ0c3dpdGgoaV9rZXksICJpby5rdWJlcm5ldGVzLmNyaS4iKQoKICAgIHByaW50KCJhbGxvd19hbm5vX2tleSAxOiB0cnVlIikKfQphbGxvd19hbm5vX2tleShpX2tleSwgcF9vY2kpIHsKICAgIHByaW50KCJhbGxvd19hbm5vX2tleSAyOiBpIGtleSA9IiwgaV9rZXkpCgogICAgc29tZSBwX2tleSwgXyBpbiBwX29jaS5Bbm5vdGF0aW9ucwogICAgcF9rZXkgPT0gaV9rZXkKCiAgICBwcmludCgiYWxsb3dfYW5ub19rZXkgMjogdHJ1ZSIpCn0KCiMgR2V0IHRoZSB2YWx1ZSBvZiB0aGUgU19OQU1FX0tFWSBhbm5vdGF0aW9uIGFuZAojIGNvcnJlbGF0ZSBpdCB3aXRoIG90aGVyIGFubm90YXRpb25zIGFuZCBwcm9jZXNzIGZpZWxkcy4KYWxsb3dfYnlfYW5ubyhwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpIHsKICAgIHByaW50KCJhbGxvd19ieV9hbm5vIDE6IHN0YXJ0IikKCiAgICBub3QgcF9vY2kuQW5ub3RhdGlvbnNbU19OQU1FX0tFWV0KCiAgICBpX3NfbmFtZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMTogaV9zX25hbWUgPSIsIGlfc19uYW1lKQoKICAgIGlfc19uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FU1BBQ0VfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMTogaV9zX25hbWVzcGFjZSA9IiwgaV9zX25hbWVzcGFjZSkKCiAgICBhbGxvd19ieV9zYW5kYm94X25hbWUocF9vY2ksIGlfb2NpLCBwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBpX3NfbmFtZSwgaV9zX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfYnlfYW5ubyAxOiB0cnVlIikKfQphbGxvd19ieV9hbm5vKHBfb2NpLCBpX29jaSwgcF9zdG9yYWdlcywgaV9zdG9yYWdlcykgewogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMjogc3RhcnQiKQoKICAgIHBfc19uYW1lIDo9IHBfb2NpLkFubm90YXRpb25zW1NfTkFNRV9LRVldCiAgICBpX3NfbmFtZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMjogaV9zX25hbWUgPSIsIGlfc19uYW1lLCAicF9zX25hbWUgPSIsIHBfc19uYW1lKQoKICAgIGFsbG93X3NhbmRib3hfbmFtZShwX3NfbmFtZSwgaV9zX25hbWUpCgogICAgaV9zX25hbWVzcGFjZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwcmludCgiYWxsb3dfYnlfYW5ubyAyOiBpX3NfbmFtZXNwYWNlID0iLCBpX3NfbmFtZXNwYWNlKQoKICAgIGFsbG93X2J5X3NhbmRib3hfbmFtZShwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMsIGlfc19uYW1lLCBpX3NfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd19ieV9hbm5vIDI6IHRydWUiKQp9CgphbGxvd19ieV9zYW5kYm94X25hbWUocF9vY2ksIGlfb2NpLCBwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfYnlfc2FuZGJveF9uYW1lOiBzdGFydCIpCgogICAgaV9uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FU1BBQ0VfS0VZXQoKICAgIGFsbG93X2J5X2NvbnRhaW5lcl90eXBlcyhwX29jaSwgaV9vY2ksIHNfbmFtZSwgaV9uYW1lc3BhY2UpCiAgICBhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZChwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpCiAgICBhbGxvd19wcm9jZXNzKHBfb2NpLlByb2Nlc3MsIGlfb2NpLlByb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpCgogICAgcHJpbnQoImFsbG93X2J5X3NhbmRib3hfbmFtZTogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfbmFtZShwX3NfbmFtZSwgaV9zX25hbWUpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X25hbWU6IHN0YXJ0IikKICAgIHJlZ2V4Lm1hdGNoKHBfc19uYW1lLCBpX3NfbmFtZSkKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9uYW1lOiB0cnVlIikKfQoKIyBDaGVjayB0aGF0IHRoZSAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLXR5cGUiIGFuZAojICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIiBhbm5vdGF0aW9ucyBkZXNpZ25hdGUgdGhlCiMgZXhwZWN0ZWQgdHlwZSAtIGVpdGhlciBhICJzYW5kYm94IiBvciBhICJjb250YWluZXIiLiBUaGVuLCB2YWxpZGF0ZQojIG90aGVyIGFubm90YXRpb25zIGJhc2VkIG9uIHRoZSBhY3R1YWwgInNhbmRib3giIG9yICJjb250YWluZXIiIHZhbHVlCiMgZnJvbSB0aGUgaW5wdXQgY29udGFpbmVyLgphbGxvd19ieV9jb250YWluZXJfdHlwZXMocF9vY2ksIGlfb2NpLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfYnlfY29udGFpbmVyX3R5cGVzOiBjaGVja2luZyBpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSIpCgogICAgY190eXBlIDo9ICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSIKICAgIAogICAgcF9jcmlfdHlwZSA6PSBwX29jaS5Bbm5vdGF0aW9uc1tjX3R5cGVdCiAgICBpX2NyaV90eXBlIDo9IGlfb2NpLkFubm90YXRpb25zW2NfdHlwZV0KICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZXM6IHBfY3JpX3R5cGUgPSIsIHBfY3JpX3R5cGUsICJpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgcF9jcmlfdHlwZSA9PSBpX2NyaV90eXBlCgogICAgYWxsb3dfYnlfY29udGFpbmVyX3R5cGUoaV9jcmlfdHlwZSwgcF9vY2ksIGlfb2NpLCBzX25hbWUsIHNfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZXM6IHRydWUiKQp9CgphbGxvd19ieV9jb250YWluZXJfdHlwZShpX2NyaV90eXBlLCBwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAxOiBpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgaV9jcmlfdHlwZSA9PSAic2FuZGJveCIKCiAgICBpX2thdGFfdHlwZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1siaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5jb250YWluZXJfdHlwZSJdCiAgICBwcmludCgiYWxsb3dfYnlfY29udGFpbmVyX3R5cGUgMTogaV9rYXRhX3R5cGUgPSIsIGlfa2F0YV90eXBlKQogICAgaV9rYXRhX3R5cGUgPT0gInBvZF9zYW5kYm94IgoKICAgIGFsbG93X3NhbmRib3hfY29udGFpbmVyX25hbWUocF9vY2ksIGlfb2NpKQogICAgYWxsb3dfc2FuZGJveF9uZXRfbmFtZXNwYWNlKHBfb2NpLCBpX29jaSkKICAgIGFsbG93X3NhbmRib3hfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpCgogICAgcHJpbnQoImFsbG93X2J5X2NvbnRhaW5lcl90eXBlIDE6IHRydWUiKQp9CgphbGxvd19ieV9jb250YWluZXJfdHlwZShpX2NyaV90eXBlLCBwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiBpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgaV9jcmlfdHlwZSA9PSAiY29udGFpbmVyIgoKICAgIGlfa2F0YV90eXBlIDo9IGlfb2NpLkFubm90YXRpb25zWyJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIl0KICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiBpX2thdGFfdHlwZSA9IiwgaV9rYXRhX3R5cGUpCiAgICBpX2thdGFfdHlwZSA9PSAicG9kX2NvbnRhaW5lciIKCiAgICBhbGxvd19jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpCiAgICBhbGxvd19uZXRfbmFtZXNwYWNlKHBfb2NpLCBpX29jaSkKICAgIGFsbG93X2xvZ19kaXJlY3RvcnkocF9vY2ksIGlfb2NpKQoKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiB0cnVlIikKfQoKIyAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLW5hbWUiIGFubm90YXRpb24KYWxsb3dfc2FuZGJveF9jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X2NvbnRhaW5lcl9uYW1lOiBzdGFydCIpCgogICAgY29udGFpbmVyX2Fubm90YXRpb25fbWlzc2luZyhwX29jaSwgaV9vY2ksICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItbmFtZSIpCgogICAgcHJpbnQoImFsbG93X3NhbmRib3hfY29udGFpbmVyX25hbWU6IHRydWUiKQp9CgphbGxvd19jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19jb250YWluZXJfbmFtZTogc3RhcnQiKQoKICAgIGFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uKHBfb2NpLCBpX29jaSwgImlvLmt1YmVybmV0ZXMuY3JpLmNvbnRhaW5lci1uYW1lIikKCiAgICBwcmludCgiYWxsb3dfY29udGFpbmVyX25hbWU6IHRydWUiKQp9Cgpjb250YWluZXJfYW5ub3RhdGlvbl9taXNzaW5nKHBfb2NpLCBpX29jaSwga2V5KSB7CiAgICBwcmludCgiY29udGFpbmVyX2Fubm90YXRpb25fbWlzc2luZzoiLCBrZXkpCgogICAgbm90IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIG5vdCBpX29jaS5Bbm5vdGF0aW9uc1trZXldCgogICAgcHJpbnQoImNvbnRhaW5lcl9hbm5vdGF0aW9uX21pc3Npbmc6IHRydWUiKQp9CgphbGxvd19jb250YWluZXJfYW5ub3RhdGlvbihwX29jaSwgaV9vY2ksIGtleSkgewogICAgcHJpbnQoImFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uOiBrZXkgPSIsIGtleSkKCiAgICBwX3ZhbHVlIDo9IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIGlfdmFsdWUgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgcHJpbnQoImFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uOiBwX3ZhbHVlID0iLCBwX3ZhbHVlLCAiaV92YWx1ZSA9IiwgaV92YWx1ZSkKCiAgICBwX3ZhbHVlID09IGlfdmFsdWUKCiAgICBwcmludCgiYWxsb3dfY29udGFpbmVyX2Fubm90YXRpb246IHRydWUiKQp9CgojICJuZXJkY3RsL25ldHdvcmstbmFtZXNwYWNlIiBhbm5vdGF0aW9uCmFsbG93X3NhbmRib3hfbmV0X25hbWVzcGFjZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X25ldF9uYW1lc3BhY2U6IHN0YXJ0IikKCiAgICBrZXkgOj0gIm5lcmRjdGwvbmV0d29yay1uYW1lc3BhY2UiCgogICAgcF9uYW1lc3BhY2UgOj0gcF9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgaV9uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgcHJpbnQoImFsbG93X3NhbmRib3hfbmV0X25hbWVzcGFjZTogcF9uYW1lc3BhY2UgPSIsIHBfbmFtZXNwYWNlLCAiaV9uYW1lc3BhY2UgPSIsIGlfbmFtZXNwYWNlKQoKICAgIHJlZ2V4Lm1hdGNoKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9uZXRfbmFtZXNwYWNlOiB0cnVlIikKfQoKYWxsb3dfbmV0X25hbWVzcGFjZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19uZXRfbmFtZXNwYWNlOiBzdGFydCIpCgogICAga2V5IDo9ICJuZXJkY3RsL25ldHdvcmstbmFtZXNwYWNlIgoKICAgIG5vdCBwX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICBub3QgaV9vY2kuQW5ub3RhdGlvbnNba2V5XQoKICAgIHByaW50KCJhbGxvd19uZXRfbmFtZXNwYWNlOiB0cnVlIikKfQoKIyAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1sb2ctZGlyZWN0b3J5IiBhbm5vdGF0aW9uCmFsbG93X3NhbmRib3hfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X2xvZ19kaXJlY3Rvcnk6IHN0YXJ0IikKCiAgICBrZXkgOj0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbG9nLWRpcmVjdG9yeSIKCiAgICBwX2RpciA6PSBwX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICByZWdleDEgOj0gcmVwbGFjZShwX2RpciwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHJlZ2V4MiA6PSByZXBsYWNlKHJlZ2V4MSwgIiQoc2FuZGJveC1uYW1lc3BhY2UpIiwgc19uYW1lc3BhY2UpCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiByZWdleDIgPSIsIHJlZ2V4MikKCiAgICBpX2RpciA6PSBpX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiBpX2RpciA9IiwgaV9kaXIpCgogICAgcmVnZXgubWF0Y2gocmVnZXgyLCBpX2RpcikKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiB0cnVlIikKfQoKYWxsb3dfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19sb2dfZGlyZWN0b3J5OiBzdGFydCIpCgogICAga2V5IDo9ICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWxvZy1kaXJlY3RvcnkiCgogICAgbm90IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIG5vdCBpX29jaS5Bbm5vdGF0aW9uc1trZXldCgogICAgcHJpbnQoImFsbG93X2xvZ19kaXJlY3Rvcnk6IHRydWUiKQp9CgphbGxvd19kZXZpY2VzKHBfZGV2aWNlcywgaV9kZXZpY2VzKSB7CiAgICBwcmludCgiYWxsb3dfZGV2aWNlczogc3RhcnQiKQogICAgZXZlcnkgaV9kZXZpY2UgaW4gaV9kZXZpY2VzIHsKICAgICAgICBwcmludCgiYWxsb3dfZGV2aWNlczogaV9kZXZpY2UgPSIsIGlfZGV2aWNlKQogICAgICAgIHNvbWUgcF9kZXZpY2UgaW4gcF9kZXZpY2VzCiAgICAgICAgcF9kZXZpY2UuY29udGFpbmVyX3BhdGggPT0gaV9kZXZpY2UuY29udGFpbmVyX3BhdGgKICAgIH0KICAgIHByaW50KCJhbGxvd19kZXZpY2VzOiB0cnVlIikKfQoKYWxsb3dfbGludXgoc3RhdGVfb3BzLCBwX29jaSwgaV9vY2kpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIHBfbmFtZXNwYWNlcyA6PSBwX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbGludXg6IHAgbmFtZXNwYWNlcyA9IiwgcF9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlcyA6PSBpX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbGludXg6IGkgbmFtZXNwYWNlcyA9IiwgaV9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlX3dpdGhvdXRfbmV0d29yayA6PSBbb2JqIHwgb2JqIDo9IGlfbmFtZXNwYWNlc1tfXTsgb2JqLlR5cGUgIT0gIm5ldHdvcmsiXQoKICAgIHByaW50KCJhbGxvd19saW51eDogaV9uYW1lc3BhY2Vfd2l0aG91dF9uZXR3b3JrID0iLCBpX25hbWVzcGFjZV93aXRob3V0X25ldHdvcmspCgogICAgcF9uYW1lc3BhY2VzID09IGlfbmFtZXNwYWNlX3dpdGhvdXRfbmV0d29yawoKICAgIGFsbG93X21hc2tlZF9wYXRocyhwX29jaSwgaV9vY2kpCiAgICBhbGxvd19yZWFkb25seV9wYXRocyhwX29jaSwgaV9vY2kpCiAgICBhbGxvd19saW51eF9kZXZpY2VzKHBfb2NpLkxpbnV4LkRldmljZXMsIGlfb2NpLkxpbnV4LkRldmljZXMpCiAgICBhbGxvd19saW51eF9zeXNjdGwocF9vY2kuTGludXgsIGlfb2NpLkxpbnV4KQogICAgcmV0IDo9IGFsbG93X25ldHdvcmtfbmFtZXNwYWNlX3N0YXJ0KHN0YXRlX29wcywgcF9vY2ksIGlfb2NpKQogICAgcmV0LmFsbG93ZWQKCiAgICBvcHMgOj0gcmV0Lm9wcwoKICAgIHByaW50KCJhbGxvd19saW51eDogdHJ1ZSIpCn0KCiMgUmV0cmlldmUgdGhlICJuZXR3b3JrIiBuYW1lc3BhY2UgZnJvbSB0aGUgaW5wdXQgZGF0YSBhbmQgcGFzcyBpdCBvbiBmb3IgdGhlCiMgbmV0d29yayBuYW1lc3BhY2UgcG9saWN5IGNoZWNrcy4KYWxsb3dfbmV0d29ya19uYW1lc3BhY2Vfc3RhcnQoc3RhdGVfb3BzLCBwX29jaSwgaV9vY2kpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIHByaW50KCJhbGxvd19uZXR3b3JrX25hbWVzcGFjZSBzdGFydDogc3RhcnQiKQoKICAgIHBfbmFtZXNwYWNlcyA6PSBwX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IHAgbmFtZXNwYWNlcyA9IiwgcF9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlcyA6PSBpX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IGkgbmFtZXNwYWNlcyA9IiwgaV9uYW1lc3BhY2VzKQoKICAgICMgUmV0dXJuIHBhdGggb2YgdGhlICJuZXR3b3JrIiBuYW1lc3BhY2UKICAgIG5ldHdvcmtfbnMgOj0gW29iaiB8IG9iaiA6PSBpX25hbWVzcGFjZXNbX107IG9iai5UeXBlID09ICJuZXR3b3JrIl0KCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IG5ldHdvcmtfbnMgPSIsIG5ldHdvcmtfbnMpCgogICAgcmV0IDo9IGFsbG93X25ldHdvcmtfbmFtZXNwYWNlKHN0YXRlX29wcywgbmV0d29ya19ucykKICAgIHJldC5hbGxvd2VkCgogICAgb3BzIDo9IHJldC5vcHMKfQoKIyBUaGlzIHJ1bGUgaXMgd2hlbiB0aGVyZSdzIG5vIG5ldHdvcmsgbmFtZXNwYWNlIGluIHRoZSBpbnB1dCBkYXRhLgphbGxvd19uZXR3b3JrX25hbWVzcGFjZShzdGF0ZV9vcHMsIG5ldHdvcmtfbnMpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIGNvdW50KG5ldHdvcmtfbnMpID09IDAKCiAgICBuZXR3b3JrX25zX3BhdGggPSAiIgoKICAgIGFkZF9uZXR3b3JrX25hbWVzcGFjZV90b19zdGF0ZSA6PSBzdGF0ZV9hbGxvd3MoIm5ldHdvcmtfbmFtZXNwYWNlIiwgbmV0d29ya19uc19wYXRoKQogICAgb3BzIDo9IGNvbmNhdF9vcF9pZl9ub3RfbnVsbChzdGF0ZV9vcHMsIGFkZF9uZXR3b3JrX25hbWVzcGFjZV90b19zdGF0ZSkKCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2UgMTogdHJ1ZSIpCn0KCiMgVGhpcyBydWxlIGlzIHdoZW4gdGhlcmUncyBleGFjdGx5IG9uZSBuZXR3b3JrIG5hbWVzcGFjZSBpbiB0aGUgaW5wdXQgZGF0YS4KYWxsb3dfbmV0d29ya19uYW1lc3BhY2Uoc3RhdGVfb3BzLCBuZXR3b3JrX25zKSA6PSB7Im9wcyI6IG9wcywgImFsbG93ZWQiOiB0cnVlfSB7CiAgICBjb3VudChuZXR3b3JrX25zKSA9PSAxCgogICAgYWRkX25ldHdvcmtfbmFtZXNwYWNlX3RvX3N0YXRlIDo9IHN0YXRlX2FsbG93cygibmV0d29ya19uYW1lc3BhY2UiLCBuZXR3b3JrX25zWzBdLlBhdGgpCiAgICBvcHMgOj0gY29uY2F0X29wX2lmX25vdF9udWxsKHN0YXRlX29wcywgYWRkX25ldHdvcmtfbmFtZXNwYWNlX3RvX3N0YXRlKQoKICAgIHByaW50KCJhbGxvd19uZXR3b3JrX25hbWVzcGFjZSAyOiB0cnVlIikKfQoKYWxsb3dfbWFza2VkX3BhdGhzKHBfb2NpLCBpX29jaSkgewogICAgcF9wYXRocyA6PSBwX29jaS5MaW51eC5NYXNrZWRQYXRocwogICAgcHJpbnQoImFsbG93X21hc2tlZF9wYXRocyAxOiBwX3BhdGhzID0iLCBwX3BhdGhzKQoKICAgIGlfcGF0aHMgOj0gaV9vY2kuTGludXguTWFza2VkUGF0aHMKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aHMgMTogaV9wYXRocyA9IiwgaV9wYXRocykKCiAgICBhbGxvd19tYXNrZWRfcGF0aHNfYXJyYXkocF9wYXRocywgaV9wYXRocykKCiAgICBwcmludCgiYWxsb3dfbWFza2VkX3BhdGhzIDE6IHRydWUiKQp9CmFsbG93X21hc2tlZF9wYXRocyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aHMgMjogc3RhcnQiKQoKICAgIG5vdCBwX29jaS5MaW51eC5NYXNrZWRQYXRocwogICAgbm90IGlfb2NpLkxpbnV4Lk1hc2tlZFBhdGhzCgogICAgcHJpbnQoImFsbG93X21hc2tlZF9wYXRocyAyOiB0cnVlIikKfQoKIyBBbGwgdGhlIHBvbGljeSBtYXNrZWQgcGF0aHMgbXVzdCBiZSBtYXNrZWQgaW4gdGhlIGlucHV0IGRhdGEgdG9vLgojIElucHV0IGlzIGFsbG93ZWQgdG8gaGF2ZSBtb3JlIG1hc2tlZCBwYXRocyB0aGFuIHRoZSBwb2xpY3kuCmFsbG93X21hc2tlZF9wYXRoc19hcnJheShwX2FycmF5LCBpX2FycmF5KSB7CiAgICBldmVyeSBwX2VsZW0gaW4gcF9hcnJheSB7CiAgICAgICAgYWxsb3dfbWFza2VkX3BhdGgocF9lbGVtLCBpX2FycmF5KQogICAgfQp9CgphbGxvd19tYXNrZWRfcGF0aChwX2VsZW0sIGlfYXJyYXkpIHsKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aDogcF9lbGVtID0iLCBwX2VsZW0pCgogICAgc29tZSBpX2VsZW0gaW4gaV9hcnJheQogICAgcF9lbGVtID09IGlfZWxlbQoKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aDogdHJ1ZSIpCn0KCmFsbG93X3JlYWRvbmx5X3BhdGhzKHBfb2NpLCBpX29jaSkgewogICAgcF9wYXRocyA6PSBwX29jaS5MaW51eC5SZWFkb25seVBhdGhzCiAgICBwcmludCgiYWxsb3dfcmVhZG9ubHlfcGF0aHMgMTogcF9wYXRocyA9IiwgcF9wYXRocykKCiAgICBpX3BhdGhzIDo9IGlfb2NpLkxpbnV4LlJlYWRvbmx5UGF0aHMKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAxOiBpX3BhdGhzID0iLCBpX3BhdGhzKQoKICAgIGFsbG93X3JlYWRvbmx5X3BhdGhzX2FycmF5KHBfcGF0aHMsIGlfcGF0aHMsIGlfb2NpLkxpbnV4Lk1hc2tlZFBhdGhzKQoKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAxOiB0cnVlIikKfQphbGxvd19yZWFkb25seV9wYXRocyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAyOiBzdGFydCIpCgogICAgbm90IHBfb2NpLkxpbnV4LlJlYWRvbmx5UGF0aHMKICAgIG5vdCBpX29jaS5MaW51eC5SZWFkb25seVBhdGhzCgogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGhzIDI6IHRydWUiKQp9CgojIEFsbCB0aGUgcG9saWN5IHJlYWRvbmx5IHBhdGhzIG11c3QgYmUgZWl0aGVyOgojIC0gUHJlc2VudCBpbiB0aGUgaW5wdXQgcmVhZG9ubHkgcGF0aHMsIG9yCiMgLSBQcmVzZW50IGluIHRoZSBpbnB1dCBtYXNrZWQgcGF0aHMuCiMgSW5wdXQgaXMgYWxsb3dlZCB0byBoYXZlIG1vcmUgcmVhZG9ubHkgcGF0aHMgdGhhbiB0aGUgcG9saWN5LgphbGxvd19yZWFkb25seV9wYXRoc19hcnJheShwX2FycmF5LCBpX2FycmF5LCBtYXNrZWRfcGF0aHMpIHsKICAgIGV2ZXJ5IHBfZWxlbSBpbiBwX2FycmF5IHsKICAgICAgICBhbGxvd19yZWFkb25seV9wYXRoKHBfZWxlbSwgaV9hcnJheSwgbWFza2VkX3BhdGhzKQogICAgfQp9CgphbGxvd19yZWFkb25seV9wYXRoKHBfZWxlbSwgaV9hcnJheSwgbWFza2VkX3BhdGhzKSB7CiAgICBwcmludCgiYWxsb3dfcmVhZG9ubHlfcGF0aCAxOiBwX2VsZW0gPSIsIHBfZWxlbSkKCiAgICBzb21lIGlfZWxlbSBpbiBpX2FycmF5CiAgICBwX2VsZW0gPT0gaV9lbGVtCgogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGggMTogdHJ1ZSIpCn0KYWxsb3dfcmVhZG9ubHlfcGF0aChwX2VsZW0sIGlfYXJyYXksIG1hc2tlZF9wYXRocykgewogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGggMjogcF9lbGVtID0iLCBwX2VsZW0pCgogICAgc29tZSBpX21hc2tlZCBpbiBtYXNrZWRfcGF0aHMKICAgIHBfZWxlbSA9PSBpX21hc2tlZAoKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRoIDI6IHRydWUiKQp9CgphbGxvd19saW51eF9kZXZpY2VzKHBfZGV2aWNlcywgaV9kZXZpY2VzKSB7CiAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogc3RhcnQiKQogICAgZXZlcnkgaV9kZXZpY2UgaW4gaV9kZXZpY2VzIHsKICAgICAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogaV9kZXZpY2UgPSIsIGlfZGV2aWNlKQogICAgICAgIHNvbWUgcF9kZXZpY2UgaW4gcF9kZXZpY2VzCiAgICAgICAgaV9kZXZpY2UuUGF0aCA9PSBwX2RldmljZS5QYXRoCiAgICB9CiAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogdHJ1ZSIpCn0KCmFsbG93X2xpbnV4X3N5c2N0bChwX2xpbnV4LCBpX2xpbnV4KSB7CiAgICBwcmludCgiYWxsb3dfbGludXhfc3lzY3RsIDE6IHN0YXJ0IikKICAgIG5vdCBpX2xpbnV4LlN5c2N0bAogICAgcHJpbnQoImFsbG93X2xpbnV4X3N5c2N0bCAxOiB0cnVlIikKfQoKYWxsb3dfbGludXhfc3lzY3RsKHBfbGludXgsIGlfbGludXgpIHsKICAgIHByaW50KCJhbGxvd19saW51eF9zeXNjdGwgMjogc3RhcnQiKQogICAgcF9zeXNjdGwgOj0gcF9saW51eC5TeXNjdGwKICAgIGlfc3lzY3RsIDo9IGlfbGludXguU3lzY3RsCiAgICBldmVyeSBpX25hbWUsIGlfdmFsIGluIGlfc3lzY3RsIHsKICAgICAgICBwcmludCgiYWxsb3dfbGludXhfc3lzY3RsIDI6IGlfbmFtZSA9IiwgaV9uYW1lLCAiaV92YWwgPSIsIGlfdmFsKQogICAgICAgIHBfc3lzY3RsW2lfbmFtZV0gPT0gaV92YWwKICAgIH0KICAgIHByaW50KCJhbGxvd19saW51eF9zeXNjdGwgMjogdHJ1ZSIpCn0KCiMgQ2hlY2sgdGhlIGNvbnNpc3RlbmN5IG9mIHRoZSBpbnB1dCAiaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5idW5kbGVfcGF0aCIKIyBhbmQgaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCIgdmFsdWVzIHdpdGggb3RoZXIgZmllbGRzLgphbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZChwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpIHsKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogc3RhcnQiKQoKICAgIGJ1bmRsZV9wYXRoIDo9IGlfb2NpLkFubm90YXRpb25zWyJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmJ1bmRsZV9wYXRoIl0KICAgIGJ1bmRsZV9pZCA6PSByZXBsYWNlKGJ1bmRsZV9wYXRoLCAiL3J1bi9jb250YWluZXJkL2lvLmNvbnRhaW5lcmQucnVudGltZS52Mi50YXNrL2s4cy5pby8iLCAiIikKCiAgICBidW5kbGVfaWRfZm9ybWF0IDo9IGNvbmNhdCgiIiwgWyJeIiwgQlVORExFX0lELCAiJCJdKQogICAgcmVnZXgubWF0Y2goYnVuZGxlX2lkX2Zvcm1hdCwgYnVuZGxlX2lkKQoKICAgIGtleSA6PSAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCIKCiAgICBwX3JlZ2V4IDo9IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIHNhbmRib3hfaWQgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQoKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogc2FuZGJveF9pZCA9Iiwgc2FuZGJveF9pZCwgInJlZ2V4ID0iLCBwX3JlZ2V4KQogICAgcmVnZXgubWF0Y2gocF9yZWdleCwgc2FuZGJveF9pZCkKCiAgICBhbGxvd19yb290X3BhdGgocF9vY2ksIGlfb2NpLCBidW5kbGVfaWQpCgogICAgZXZlcnkgaV9tb3VudCBpbiBpX29jaS5Nb3VudHMgewogICAgICAgIGFsbG93X21vdW50KHBfb2NpLCBpX21vdW50LCBpX3N0b3JhZ2VzLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpCiAgICB9CgogICAgYWxsb3dfc3RvcmFnZXMocF9zdG9yYWdlcywgaV9zdG9yYWdlcywgYnVuZGxlX2lkLCBzYW5kYm94X2lkKQoKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogdHJ1ZSIpCn0KCmFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHBfcHJvY2VzcyA9IiwgcF9wcm9jZXNzKQogICAgcHJpbnQoImFsbG93X3Byb2Nlc3NfY29tbW9uOiBpX3Byb2Nlc3MgPSAiLCBpX3Byb2Nlc3MpCiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHNfbmFtZSA9Iiwgc19uYW1lKQoKICAgIHBfcHJvY2Vzcy5Dd2QgPT0gaV9wcm9jZXNzLkN3ZAogICAgcF9wcm9jZXNzLk5vTmV3UHJpdmlsZWdlcyA9PSBpX3Byb2Nlc3MuTm9OZXdQcml2aWxlZ2VzCgogICAgYWxsb3dfdXNlcihwX3Byb2Nlc3MsIGlfcHJvY2VzcykKICAgIGFsbG93X2VudihwX3Byb2Nlc3MsIGlfcHJvY2Vzcywgc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHRydWUiKQp9CgojIENvbXBhcmUgdGhlIE9DSSBQcm9jZXNzIGZpZWxkIG9mIGEgcG9saWN5IGNvbnRhaW5lciB3aXRoIHRoZSBpbnB1dCBPQ0kgUHJvY2VzcyBmcm9tIGEgQ3JlYXRlQ29udGFpbmVyUmVxdWVzdAphbGxvd19wcm9jZXNzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfcHJvY2Vzczogc3RhcnQiKQoKICAgIGFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgYWxsb3dfY2FwcyhwX3Byb2Nlc3MuQ2FwYWJpbGl0aWVzLCBpX3Byb2Nlc3MuQ2FwYWJpbGl0aWVzKQogICAgcF9wcm9jZXNzLlRlcm1pbmFsID09IGlfcHJvY2Vzcy5UZXJtaW5hbAoKICAgIHByaW50KCJhbGxvd19wcm9jZXNzOiB0cnVlIikKfQoKIyBDb21wYXJlIHRoZSBPQ0kgUHJvY2VzcyBmaWVsZCBvZiBhIHBvbGljeSBjb250YWluZXIgd2l0aCB0aGUgaW5wdXQgcHJvY2VzcyBmaWVsZCBmcm9tIEV4ZWNQcm9jZXNzUmVxdWVzdAphbGxvd19pbnRlcmFjdGl2ZV9wcm9jZXNzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfaW50ZXJhY3RpdmVfcHJvY2Vzczogc3RhcnQiKQoKICAgIGFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgYWxsb3dfZXhlY19jYXBzKGlfcHJvY2Vzcy5DYXBhYmlsaXRpZXMpCgogICAgIyBUaGVzZSBhcmUgY29tbWFuZHMgZW5hYmxlZCB1c2luZyBFeGVjUHJvY2Vzc1JlcXVlc3QgY29tbWFuZHMgYW5kL29yIHJlZ2V4IGZyb20gdGhlIHNldHRpbmdzIGZpbGUuCiAgICAjIFRoZXkgY2FuIGJlIGV4ZWN1dGVkIGludGVyYWN0aXZlbHkgc28gYWxsb3cgdGhlbSB0byB1c2UgYW55IHZhbHVlIGZvciBpX3Byb2Nlc3MuVGVybWluYWwuCgogICAgcHJpbnQoImFsbG93X2ludGVyYWN0aXZlX3Byb2Nlc3M6IHRydWUiKQp9CgojIENvbXBhcmUgdGhlIE9DSSBQcm9jZXNzIGZpZWxkIG9mIGEgcG9saWN5IGNvbnRhaW5lciB3aXRoIHRoZSBpbnB1dCBwcm9jZXNzIGZpZWxkIGZyb20gRXhlY1Byb2Nlc3NSZXF1ZXN0CmFsbG93X3Byb2JlX3Byb2Nlc3MocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19wcm9iZV9wcm9jZXNzOiBzdGFydCIpCgogICAgYWxsb3dfcHJvY2Vzc19jb21tb24ocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpCiAgICBhbGxvd19leGVjX2NhcHMoaV9wcm9jZXNzLkNhcGFiaWxpdGllcykKICAgIHBfcHJvY2Vzcy5UZXJtaW5hbCA9PSBpX3Byb2Nlc3MuVGVybWluYWwKCiAgICBwcmludCgiYWxsb3dfcHJvYmVfcHJvY2VzczogdHJ1ZSIpCn0KCmFsbG93X3VzZXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MpIHsKICAgIHBfdXNlciA6PSBwX3Byb2Nlc3MuVXNlcgogICAgaV91c2VyIDo9IGlfcHJvY2Vzcy5Vc2VyCgogICAgcHJpbnQoImFsbG93X3VzZXI6IGlucHV0IHVpZCA9IiwgaV91c2VyLlVJRCwgInBvbGljeSB1aWQgPSIsIHBfdXNlci5VSUQpCiAgICBwX3VzZXIuVUlEID09IGlfdXNlci5VSUQKCiAgICAjIFRPRE86IHRyYWNrIGRvd24gdGhlIHJlYXNvbiBmb3IgcmVnaXN0cnkuazhzLmlvL3BhdXNlOjMuOSBiZWluZwogICAgIyAgICAgICBleGVjdXRlZCB3aXRoIGdpZCA9IDAgZGVzcGl0ZSBoYXZpbmcgIjY1NTM1OjY1NTM1IiBpbiBpdHMgY29udGFpbmVyIGltYWdlCiAgICAjICAgICAgIGNvbmZpZy4KICAgICNwcmludCgiYWxsb3dfdXNlcjogaW5wdXQgZ2lkID0iLCBpX3VzZXIuR0lELCAicG9saWN5IGdpZCA9IiwgcF91c2VyLkdJRCkKICAgICNwX3VzZXIuR0lEID09IGlfdXNlci5HSUQKCiAgICAjIFRPRE86IGNvbXBhcmUgdGhlIGFkZGl0aW9uYWxHaWRzIGZpZWxkIHRvbyBhZnRlciBjb21wdXRpbmcgaXRzIHZhbHVlCiAgICAjIGJhc2VkIG9uIC9ldGMvcGFzc3dkIGFuZCAvZXRjL2dyb3VwIGZyb20gdGhlIGNvbnRhaW5lciBpbWFnZS4KfQoKYWxsb3dfZGVwcmVjYXRlZF9hcmdzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZ3MgMTogbm8gYXJncyIpCgogICAgbm90IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJncwogICAgbm90IGlfcHJvY2Vzcy5BcmdzCgogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAxOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZ3MocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSkgewogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiBwb2xpY3kgYXJncyA9IiwgcF9wcm9jZXNzLkRlcHJlY2F0ZWRBcmdzKQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiBpbnB1dCBhcmdzID0iLCBpX3Byb2Nlc3MuQXJncykKCiAgICBjb3VudChwX3Byb2Nlc3MuRGVwcmVjYXRlZEFyZ3MpID09IGNvdW50KGlfcHJvY2Vzcy5BcmdzKQoKICAgIGV2ZXJ5IGksIGlfYXJnIGluIGlfcHJvY2Vzcy5BcmdzIHsKICAgICAgICBhbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpCiAgICB9CgogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDE6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgcF9hcmcyIDo9IHJlcGxhY2UocF9hcmcsICIkJCIsICIkIikKICAgIHBfYXJnMiA9PSBpX2FyZwoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAxOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDI6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgIyBUT0RPOiBjYW4gJChub2RlLW5hbWUpIGJlIGhhbmRsZWQgYmV0dGVyPwogICAgY29udGFpbnMocF9hcmcsICIkKG5vZGUtbmFtZSkiKQoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAyOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDM6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgcF9hcmcyIDo9IHJlcGxhY2UocF9hcmcsICIkJCIsICIkIikKICAgIHBfYXJnMyA6PSByZXBsYWNlKHBfYXJnMiwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAzOiBwX2FyZzMgPSIsIHBfYXJnMykKICAgIHBfYXJnMyA9PSBpX2FyZwoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAzOiB0cnVlIikKfQoKIyBPQ0kgcHJvY2Vzcy5FbnYgZmllbGQKYWxsb3dfZW52KHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfZW52OiBwIGVudiA9IiwgcF9wcm9jZXNzLkVudikKICAgIHByaW50KCJhbGxvd19lbnY6IGkgZW52ID0iLCBpX3Byb2Nlc3MuRW52KQoKICAgIGV2ZXJ5IGlfdmFyIGluIGlfcHJvY2Vzcy5FbnYgewogICAgICAgIHByaW50KCJhbGxvd19lbnY6IGlfdmFyID0iLCBpX3ZhcikKICAgICAgICBhbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgfQoKICAgIHByaW50KCJhbGxvd19lbnY6IHRydWUiKQp9CgojIEFsbG93IGlucHV0IGVudiB2YXJpYWJsZXMgdGhhdCBhcmUgcHJlc2VudCBpbiB0aGUgcG9saWN5IGRhdGEgdG9vLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHBfdmFyID09IGlfdmFyCiAgICBwcmludCgiYWxsb3dfdmFyIDE6IHRydWUiKQp9CgojIE1hdGNoIGlucHV0IHdpdGggb25lIG9mIHRoZSBwb2xpY3kgdmFyaWFibGVzLCBhZnRlciBzdWJzdGl0dXRpbmcgJChzYW5kYm94LW5hbWUpLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHByaW50KCJhbGxvd192YXIgMjogcF92YXIgPSIsIHBfdmFyKQoKICAgIHBfdmFyX3NwbGl0IDo9IHNwbGl0KHBfdmFyLCAiPSIpCiAgICBjb3VudChwX3Zhcl9zcGxpdCkgPT0gMgoKICAgIHBfdmFyX3NwbGl0WzFdID09ICIkKHNhbmRib3gtbmFtZSkiCgogICAgaV92YXJfc3BsaXQgOj0gc3BsaXQoaV92YXIsICI9IikKICAgIGNvdW50KGlfdmFyX3NwbGl0KSA9PSAyCgogICAgaV92YXJfc3BsaXRbMF0gPT0gcF92YXJfc3BsaXRbMF0KICAgIHJlZ2V4Lm1hdGNoKHNfbmFtZSwgaV92YXJfc3BsaXRbMV0pCgogICAgcHJpbnQoImFsbG93X3ZhciAyOiB0cnVlIikKfQoKIyBBbGxvdyBpbnB1dCBlbnYgdmFyaWFibGVzIHRoYXQgbWF0Y2ggd2l0aCBhIHJlcXVlc3RfZGVmYXVsdHMgcmVnZXguCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHNvbWUgcF9yZWdleDEgaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5DcmVhdGVDb250YWluZXJSZXF1ZXN0LmFsbG93X2Vudl9yZWdleAogICAgcF9yZWdleDIgOj0gcmVwbGFjZShwX3JlZ2V4MSwgIiQoaXB2NF9hKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcHY0X2EpCiAgICBwX3JlZ2V4MyA6PSByZXBsYWNlKHBfcmVnZXgyLCAiJChpcF9wKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcF9wKQogICAgcF9yZWdleDQgOj0gcmVwbGFjZShwX3JlZ2V4MywgIiQoc3ZjX25hbWUpIiwgcG9saWN5X2RhdGEuY29tbW9uLnN2Y19uYW1lKQogICAgcF9yZWdleDUgOj0gcmVwbGFjZShwX3JlZ2V4NCwgIiQoZG5zX2xhYmVsKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5kbnNfbGFiZWwpCgogICAgcHJpbnQoImFsbG93X3ZhciAzOiBwX3JlZ2V4NSA9IiwgcF9yZWdleDUpCiAgICByZWdleC5tYXRjaChwX3JlZ2V4NSwgaV92YXIpCgogICAgcHJpbnQoImFsbG93X3ZhciAzOiB0cnVlIikKfQoKIyBBbGxvdyBmaWVsZFJlZiAiZmllbGRQYXRoOiBzdGF0dXMucG9kSVAiIHZhbHVlcy4KYWxsb3dfdmFyKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBpX3Zhciwgc19uYW1lLCBzX25hbWVzcGFjZSkgewogICAgbmFtZV92YWx1ZSA6PSBzcGxpdChpX3ZhciwgIj0iKQogICAgY291bnQobmFtZV92YWx1ZSkgPT0gMgogICAgaXNfaXAobmFtZV92YWx1ZVsxXSkKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIGFsbG93X3BvZF9pcF92YXIobmFtZV92YWx1ZVswXSwgcF92YXIpCgogICAgcHJpbnQoImFsbG93X3ZhciA0OiB0cnVlIikKfQoKIyBBbGxvdyBjb21tb24gZmllbGRSZWYgdmFyaWFibGVzLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBuYW1lX3ZhbHVlIDo9IHNwbGl0KGlfdmFyLCAiPSIpCiAgICBjb3VudChuYW1lX3ZhbHVlKSA9PSAyCgogICAgc29tZSBwX3ZhciBpbiBwX3Byb2Nlc3MuRW52CiAgICBwX25hbWVfdmFsdWUgOj0gc3BsaXQocF92YXIsICI9IikKICAgIGNvdW50KHBfbmFtZV92YWx1ZSkgPT0gMgoKICAgIHBfbmFtZV92YWx1ZVswXSA9PSBuYW1lX3ZhbHVlWzBdCgogICAgIyBUT0RPOiBzaG91bGQgdGhlc2UgYmUgaGFuZGxlZCBpbiBhIGRpZmZlcmVudCB3YXk/CiAgICBhbHdheXNfYWxsb3dlZCA6PSBbIiQoaG9zdC1uYW1lKSIsICIkKG5vZGUtbmFtZSkiLCAiJChwb2QtdWlkKSJdCiAgICBzb21lIGFsbG93ZWQgaW4gYWx3YXlzX2FsbG93ZWQKICAgIGNvbnRhaW5zKHBfbmFtZV92YWx1ZVsxXSwgYWxsb3dlZCkKCiAgICBwcmludCgiYWxsb3dfdmFyIDU6IHRydWUiKQp9CgojIEFsbG93IGZpZWxkUmVmICJmaWVsZFBhdGg6IHN0YXR1cy5ob3N0SVAiIHZhbHVlcy4KYWxsb3dfdmFyKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBpX3Zhciwgc19uYW1lLCBzX25hbWVzcGFjZSkgewogICAgbmFtZV92YWx1ZSA6PSBzcGxpdChpX3ZhciwgIj0iKQogICAgY291bnQobmFtZV92YWx1ZSkgPT0gMgogICAgaXNfaXAobmFtZV92YWx1ZVsxXSkKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIGFsbG93X2hvc3RfaXBfdmFyKG5hbWVfdmFsdWVbMF0sIHBfdmFyKQoKICAgIHByaW50KCJhbGxvd192YXIgNjogdHJ1ZSIpCn0KCiMgQWxsb3cgcmVzb3VyY2VGaWVsZFJlZiB2YWx1ZXMgKGUuZy4sICJsaW1pdHMuY3B1IikuCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIG5hbWVfdmFsdWUgOj0gc3BsaXQoaV92YXIsICI9IikKICAgIGNvdW50KG5hbWVfdmFsdWUpID09IDIKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHBfbmFtZV92YWx1ZSA6PSBzcGxpdChwX3ZhciwgIj0iKQogICAgY291bnQocF9uYW1lX3ZhbHVlKSA9PSAyCgogICAgcF9uYW1lX3ZhbHVlWzBdID09IG5hbWVfdmFsdWVbMF0KCiAgICAjIGEgdmFyaWFibGUgd2Ugc2hvdWxkIGJlIHZhbGlkYXRpbmcgdXNpbmcgYSByZWdleCBmcm9tIHNldHRpbmdzCiAgICBwX25hbWVfdmFsdWVbMV0gPT0gIiQodmFsaWRhdGUtZnJvbS1zZXR0aW5ncykiCgogICAgcmVnZXhfdmFsIDo9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuQ3JlYXRlQ29udGFpbmVyUmVxdWVzdC5hbGxvd19lbnZfcmVnZXhfbWFwW25hbWVfdmFsdWVbMF1dCgogICAgcHJpbnQoImFsbG93X3ZhciA3OiB2YWwgPSIsIG5hbWVfdmFsdWVbMV0pCiAgICBwcmludCgiYWxsb3dfdmFyIDc6IHJlZ2V4X3ZhbCA9IiwgcmVnZXhfdmFsKQoKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4X3ZhbCwgbmFtZV92YWx1ZVsxXSkKCiAgICBwcmludCgiYWxsb3dfdmFyIDc6IHRydWUiKQp9CgojIE1hdGNoIGlucHV0IHdpdGggb25lIG9mIHRoZSBwb2xpY3kgdmFyaWFibGVzLCBhZnRlciBzdWJzdGl0dXRpbmcgJChzYW5kYm94LW5hbWVzcGFjZSkuCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHNvbWUgcF92YXIgaW4gcF9wcm9jZXNzLkVudgogICAgcF92YXIyIDo9IHJlcGxhY2UocF92YXIsICIkKHNhbmRib3gtbmFtZXNwYWNlKSIsIHNfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd192YXIgODogcF92YXIyID0iLCBwX3ZhcjIpCiAgICBwX3ZhcjIgPT0gaV92YXIKCiAgICBwcmludCgiYWxsb3dfdmFyIDg6IHRydWUiKQp9CgphbGxvd19wb2RfaXBfdmFyKHZhcl9uYW1lLCBwX3ZhcikgewogICAgcHJpbnQoImFsbG93X3BvZF9pcF92YXI6IHZhcl9uYW1lID0iLCB2YXJfbmFtZSwgInBfdmFyID0iLCBwX3ZhcikKCiAgICBwX25hbWVfdmFsdWUgOj0gc3BsaXQocF92YXIsICI9IikKICAgIGNvdW50KHBfbmFtZV92YWx1ZSkgPT0gMgoKICAgIHBfbmFtZV92YWx1ZVswXSA9PSB2YXJfbmFtZQogICAgcF9uYW1lX3ZhbHVlWzFdID09ICIkKHBvZC1pcCkiCgogICAgcHJpbnQoImFsbG93X3BvZF9pcF92YXI6IHRydWUiKQp9CgphbGxvd19ob3N0X2lwX3Zhcih2YXJfbmFtZSwgcF92YXIpIHsKICAgIHByaW50KCJhbGxvd19ob3N0X2lwX3ZhcjogdmFyX25hbWUgPSIsIHZhcl9uYW1lLCAicF92YXIgPSIsIHBfdmFyKQoKICAgIHBfbmFtZV92YWx1ZSA6PSBzcGxpdChwX3ZhciwgIj0iKQogICAgY291bnQocF9uYW1lX3ZhbHVlKSA9PSAyCgogICAgcF9uYW1lX3ZhbHVlWzBdID09IHZhcl9uYW1lCiAgICBwX25hbWVfdmFsdWVbMV0gPT0gIiQoaG9zdC1pcCkiCgogICAgcHJpbnQoImFsbG93X2hvc3RfaXBfdmFyOiB0cnVlIikKfQoKaXNfaXAodmFsdWUpIHsKICAgIGJ5dGVzID0gc3BsaXQodmFsdWUsICIuIikKICAgIGNvdW50KGJ5dGVzKSA9PSA0CgogICAgaXNfaXBfZmlyc3RfYnl0ZShieXRlc1swXSkKICAgIGlzX2lwX290aGVyX2J5dGUoYnl0ZXNbMV0pCiAgICBpc19pcF9vdGhlcl9ieXRlKGJ5dGVzWzJdKQogICAgaXNfaXBfb3RoZXJfYnl0ZShieXRlc1szXSkKfQppc19pcF9maXJzdF9ieXRlKGNvbXBvbmVudCkgewogICAgbnVtYmVyID0gdG9fbnVtYmVyKGNvbXBvbmVudCkKICAgIG51bWJlciA+PSAxCiAgICBudW1iZXIgPD0gMjU1Cn0KaXNfaXBfb3RoZXJfYnl0ZShjb21wb25lbnQpIHsKICAgIG51bWJlciA9IHRvX251bWJlcihjb21wb25lbnQpCiAgICBudW1iZXIgPj0gMAogICAgbnVtYmVyIDw9IDI1NQp9CgojIE9DSSByb290LlBhdGgKYWxsb3dfcm9vdF9wYXRoKHBfb2NpLCBpX29jaSwgYnVuZGxlX2lkKSB7CiAgICBpX3BhdGggOj0gaV9vY2kuUm9vdC5QYXRoCiAgICBwX3BhdGgxIDo9IHBfb2NpLlJvb3QuUGF0aAogICAgcHJpbnQoImFsbG93X3Jvb3RfcGF0aDogaV9wYXRoID0iLCBpX3BhdGgsICJwX3BhdGgxID0iLCBwX3BhdGgxKQoKICAgIHBfcGF0aDIgOj0gcmVwbGFjZShwX3BhdGgxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfcm9vdF9wYXRoOiBwX3BhdGgyID0iLCBwX3BhdGgyKQoKICAgIHBfcGF0aDMgOj0gcmVwbGFjZShwX3BhdGgyLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X3Jvb3RfcGF0aDogcF9wYXRoMyA9IiwgcF9wYXRoMykKCiAgICBwX3BhdGgzID09IGlfcGF0aAoKICAgIHByaW50KCJhbGxvd19yb290X3BhdGg6IHRydWUiKQp9CgojIGRldmljZSBtb3VudHMKYWxsb3dfbW91bnQocF9vY2ksIGlfbW91bnQsIGlfc3RvcmFnZXMsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcHJpbnQoImFsbG93X21vdW50OiBpX21vdW50ID0iLCBpX21vdW50KQoKICAgIHNvbWUgcF9tb3VudCBpbiBwX29jaS5Nb3VudHMKICAgIHNvbWUgaV9zdG9yYWdlIGluIGlfc3RvcmFnZXMKCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IHBfbW91bnQgPSIsIHBfbW91bnQpCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IGlfc3RvcmFnZSA9IiwgaV9zdG9yYWdlKQoKICAgIGNoZWNrX21vdW50KHBfbW91bnQsIGlfbW91bnQsIGlfc3RvcmFnZSwgYnVuZGxlX2lkLCBzYW5kYm94X2lkKQoKICAgICMgVE9ETzogYXJlIHRoZXJlIGFueSBvdGhlciByZXF1aXJlZCBwb2xpY3kgY2hlY2tzIGZvciBtb3VudHMgLSBlLmcuLAogICAgIyAgICAgICBtdWx0aXBsZSBtb3VudHMgd2l0aCBzYW1lIHNvdXJjZSBvciBkZXN0aW5hdGlvbj8KCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IHRydWUiKQp9CgpjaGVja19tb3VudChwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcF9tb3VudCA9PSBpX21vdW50CiAgICBwcmludCgiY2hlY2tfbW91bnQgMTogdHJ1ZSIpCn0KY2hlY2tfbW91bnQocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHBfbW91bnQuZGVzdGluYXRpb24gPT0gaV9tb3VudC5kZXN0aW5hdGlvbgogICAgcF9tb3VudC50eXBlXyA9PSBpX21vdW50LnR5cGVfCiAgICBwX21vdW50Lm9wdGlvbnMgPT0gaV9tb3VudC5vcHRpb25zCgogICAgbW91bnRfc291cmNlX2FsbG93cyhwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkKCiAgICBwcmludCgiY2hlY2tfbW91bnQgMjogdHJ1ZSIpCn0KCm1vdW50X3NvdXJjZV9hbGxvd3MocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHJlZ2V4MSA6PSBwX21vdW50LnNvdXJjZQogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5tb3VudF9zb3VyY2VfY3BhdGgpCiAgICByZWdleDQgOj0gcmVwbGFjZShyZWdleDMsICIkKGJ1bmRsZS1pZCkiLCBidW5kbGVfaWQpCgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMTogcmVnZXg0ID0iLCByZWdleDQpCiAgICByZWdleC5tYXRjaChyZWdleDQsIGlfbW91bnQuc291cmNlKQoKICAgIHByaW50KCJtb3VudF9zb3VyY2VfYWxsb3dzIDE6IHRydWUiKQp9Cm1vdW50X3NvdXJjZV9hbGxvd3MocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHJlZ2V4MSA6PSBwX21vdW50LnNvdXJjZQogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5tb3VudF9zb3VyY2VfY3BhdGgpCiAgICByZWdleDQgOj0gcmVwbGFjZShyZWdleDMsICIkKHNhbmRib3gtaWQpIiwgc2FuZGJveF9pZCkKCiAgICBwcmludCgibW91bnRfc291cmNlX2FsbG93cyAyOiByZWdleDQgPSIsIHJlZ2V4NCkKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4NCwgaV9tb3VudC5zb3VyY2UpCgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMjogdHJ1ZSIpCn0KbW91bnRfc291cmNlX2FsbG93cyhwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogaV9tb3VudC5zb3VyY2UgPSIsIGlfbW91bnQuc291cmNlKQogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogaV9zdG9yYWdlLm1vdW50X3BvaW50ID0iLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCgogICAgaV9tb3VudC5zb3VyY2UgPT0gaV9zdG9yYWdlLm1vdW50X3BvaW50CgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogdHJ1ZSIpCn0KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBDcmVhdGUgY29udGFpbmVyIFN0b3JhZ2VzCgphbGxvd19zdG9yYWdlcyhwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHBfY291bnQgOj0gY291bnQocF9zdG9yYWdlcykKICAgIGlfY291bnQgOj0gY291bnQoaV9zdG9yYWdlcykKICAgIHByaW50KCJhbGxvd19zdG9yYWdlczogcF9jb3VudCA9IiwgcF9jb3VudCwgImlfY291bnQgPSIsIGlfY291bnQpCgogICAgcF9jb3VudCA9PSBpX2NvdW50CgogICAgIyBHZXQgdGhlIGNvbnRhaW5lciBpbWFnZSBsYXllciBJRHMgYW5kIHZlcml0eSByb290IGhhc2hlcywgZnJvbSB0aGUgIm92ZXJsYXlmcyIgc3RvcmFnZS4KICAgIHNvbWUgb3ZlcmxheV9zdG9yYWdlIGluIHBfc3RvcmFnZXMKICAgIG92ZXJsYXlfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIHByaW50KCJhbGxvd19zdG9yYWdlczogb3ZlcmxheV9zdG9yYWdlID0iLCBvdmVybGF5X3N0b3JhZ2UpCiAgICBjb3VudChvdmVybGF5X3N0b3JhZ2Uub3B0aW9ucykgPT0gMgoKICAgIGxheWVyX2lkcyA6PSBzcGxpdChvdmVybGF5X3N0b3JhZ2Uub3B0aW9uc1swXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiBsYXllcl9pZHMgPSIsIGxheWVyX2lkcykKCiAgICByb290X2hhc2hlcyA6PSBzcGxpdChvdmVybGF5X3N0b3JhZ2Uub3B0aW9uc1sxXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiByb290X2hhc2hlcyA9Iiwgcm9vdF9oYXNoZXMpCgogICAgZXZlcnkgaV9zdG9yYWdlIGluIGlfc3RvcmFnZXMgewogICAgICAgIGFsbG93X3N0b3JhZ2UocF9zdG9yYWdlcywgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpCiAgICB9CgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiB0cnVlIikKfQoKYWxsb3dfc3RvcmFnZShwX3N0b3JhZ2VzLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgc29tZSBwX3N0b3JhZ2UgaW4gcF9zdG9yYWdlcwoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiBwX3N0b3JhZ2UgPSIsIHBfc3RvcmFnZSkKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiBpX3N0b3JhZ2UgPSIsIGlfc3RvcmFnZSkKCiAgICBwX3N0b3JhZ2UuZHJpdmVyICAgICAgICAgICA9PSBpX3N0b3JhZ2UuZHJpdmVyCiAgICBwX3N0b3JhZ2UuZHJpdmVyX29wdGlvbnMgICA9PSBpX3N0b3JhZ2UuZHJpdmVyX29wdGlvbnMKICAgIHBfc3RvcmFnZS5mc19ncm91cCAgICAgICAgID09IGlfc3RvcmFnZS5mc19ncm91cAogICAgcF9zdG9yYWdlLmZzdHlwZSAgICAgICAgICAgPT0gaV9zdG9yYWdlLmZzdHlwZQoKICAgIGFsbG93X3N0b3JhZ2Vfc291cmNlKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKQogICAgYWxsb3dfc3RvcmFnZV9vcHRpb25zKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKQogICAgYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKQoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiB0cnVlIikKfQoKYWxsb3dfc3RvcmFnZV9zb3VyY2UocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX3NvdXJjZSAxOiBzdGFydCIpCgogICAgcF9zdG9yYWdlLnNvdXJjZSA9PSBpX3N0b3JhZ2Uuc291cmNlCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDE6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX3NvdXJjZShwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDI6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCgogICAgIyBEREREOkJCOkRELkY6IERvbWFpbjpCdXM6RGV2aWNlLkZ1bmN0aW9uCiAgICAjIGh0dHBzOi8vd3d3Lmtlcm5lbC5vcmcvZG9jL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtYnVzLXBjaQogICAgcmVnZXgubWF0Y2goYF5bYS1mMC05XXs0fTpbYS1mMC05XXsyfTpbYS1mMC05XXsyfVwuW2EtZjAtOV0kYCwgaV9zdG9yYWdlLnNvdXJjZSkKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9zb3VyY2UgMjogdHJ1ZSIpCn0KCmFsbG93X3N0b3JhZ2Vfc291cmNlKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKSB7CiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9zb3VyY2UgMzogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIGlfc3RvcmFnZS5zb3VyY2UgPT0gIm5vbmUiCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDM6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX3NvdXJjZShwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDQ6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJzbWIiCgogICAgIyBQYXR0ZXJuOiAvLzxzdG9yYWdlLWFjY291bnQtbmFtZT4uZmlsZS5jb3JlLndpbmRvd3MubmV0LzxrOHMtUFZDLW5hbWU+CiAgICAjIFN0b3JhZ2UgYWNjb3VudCBuYW1lOiBodHRwczovL2xlYXJuLm1pY3Jvc29mdC5jb20vZW4tdXMvYXp1cmUvc3RvcmFnZS9jb21tb24vc3RvcmFnZS1hY2NvdW50LW92ZXJ2aWV3I3N0b3JhZ2UtYWNjb3VudC1uYW1lCiAgICAjIEs4cyBQVkMgbmFtZTogaHR0cHM6Ly9rdWJlcm5ldGVzLmlvL2RvY3MvY29uY2VwdHMvb3ZlcnZpZXcvd29ya2luZy13aXRoLW9iamVjdHMvbmFtZXMvI2Rucy1zdWJkb21haW4tbmFtZXMKICAgIHJlZ2V4Lm1hdGNoKGBeXC9cLyhbYS16MC05XXszLDI0fSlcLmZpbGVcLmNvcmVcLndpbmRvd3NcLm5ldFwvW2EtejAtOV0oW2EtejAtOS4tXXswLDI1MX1bYS16MC05XSk/JGAsIGlfc3RvcmFnZS5zb3VyY2UpCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDQ6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMTogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgIT0gIm92ZXJsYXlmcyIKICAgIHBfc3RvcmFnZS5vcHRpb25zID09IGlfc3RvcmFnZS5vcHRpb25zCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAxOiB0cnVlIikKfQphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIGNvdW50KHBfc3RvcmFnZS5vcHRpb25zKSA9PSAyCgogICAgcG9saWN5X2lkcyA6PSBzcGxpdChwX3N0b3JhZ2Uub3B0aW9uc1swXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBwb2xpY3lfaWRzID0iLCBwb2xpY3lfaWRzKQogICAgcG9saWN5X2lkcyA9PSBsYXllcl9pZHMKCiAgICBwb2xpY3lfaGFzaGVzIDo9IHNwbGl0KHBfc3RvcmFnZS5vcHRpb25zWzFdLCAiOiIpCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IHBvbGljeV9oYXNoZXMgPSIsIHBvbGljeV9oYXNoZXMpCgogICAgcF9jb3VudCA6PSBjb3VudChwb2xpY3lfaWRzKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBwX2NvdW50ID0iLCBwX2NvdW50KQogICAgcF9jb3VudCA+PSAxCiAgICBwX2NvdW50ID09IGNvdW50KHBvbGljeV9oYXNoZXMpCgogICAgaV9jb3VudCA6PSBjb3VudChpX3N0b3JhZ2Uub3B0aW9ucykKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogaV9jb3VudCA9IiwgaV9jb3VudCkKICAgIGlfY291bnQgPT0gcF9jb3VudCArIDMKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zWzBdID0iLCBpX3N0b3JhZ2Uub3B0aW9uc1swXSkKICAgIGlfc3RvcmFnZS5vcHRpb25zWzBdID09ICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQubGF5ZXItc3JjLXByZWZpeD0vdmFyL2xpYi9jb250YWluZXJkL2lvLmNvbnRhaW5lcmQuc25hcHNob3R0ZXIudjEudGFyZGV2L2xheWVycyIKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zW2lfY291bnQgLSAyXSA9IiwgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDJdKQogICAgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDJdID09ICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQub3ZlcmxheS1ydyIKCiAgICBsb3dlcmRpciA6PSBjb25jYXQoIj0iLCBbImxvd2VyZGlyIiwgcF9zdG9yYWdlLm9wdGlvbnNbMF1dKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBsb3dlcmRpciA9IiwgbG93ZXJkaXIpCgogICAgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDFdID09IGxvd2VyZGlyCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zW2lfY291bnQgLSAxXSA9IiwgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDFdKQoKICAgIGV2ZXJ5IGksIHBvbGljeV9pZCBpbiBwb2xpY3lfaWRzIHsKICAgICAgICBhbGxvd19vdmVybGF5X2xheWVyKHBvbGljeV9pZCwgcG9saWN5X2hhc2hlc1tpXSwgaV9zdG9yYWdlLm9wdGlvbnNbaSArIDFdKQogICAgfQoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogdHJ1ZSIpCn0KYWxsb3dfc3RvcmFnZV9vcHRpb25zKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKSB7CiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDM6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCiAgICBjb3VudChwX3N0b3JhZ2Uub3B0aW9ucykgPT0gMQoKICAgIHN0YXJ0c3dpdGgocF9zdG9yYWdlLm9wdGlvbnNbMF0sICIkKGhhc2giKQogICAgaGFzaF9zdWZmaXggOj0gdHJpbV9sZWZ0KHBfc3RvcmFnZS5vcHRpb25zWzBdLCAiJChoYXNoIikKCiAgICBlbmRzd2l0aChoYXNoX3N1ZmZpeCwgIikiKQogICAgaGFzaF9pbmRleCA6PSB0cmltX3JpZ2h0KGhhc2hfc3VmZml4LCAiKSIpCiAgICBpIDo9IHRvX251bWJlcihoYXNoX2luZGV4KQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAzOiBpID0iLCBpKQoKICAgIGhhc2hfb3B0aW9uIDo9IGNvbmNhdCgiPSIsIFsiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LnJvb3QtaGFzaCIsIHJvb3RfaGFzaGVzW2ldXSkKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMzogaGFzaF9vcHRpb24gPSIsIGhhc2hfb3B0aW9uKQoKICAgIGNvdW50KGlfc3RvcmFnZS5vcHRpb25zKSA9PSA0CiAgICBpX3N0b3JhZ2Uub3B0aW9uc1swXSA9PSAicm8iCiAgICBpX3N0b3JhZ2Uub3B0aW9uc1sxXSA9PSAiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmJsb2NrX2RldmljZT1maWxlIgogICAgaV9zdG9yYWdlLm9wdGlvbnNbMl0gPT0gImlvLmthdGFjb250YWluZXJzLmZzLW9wdC5pcy1sYXllciIKICAgIGlfc3RvcmFnZS5vcHRpb25zWzNdID09IGhhc2hfb3B0aW9uCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAzOiB0cnVlIikKfQphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgNDogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gInNtYiIKICAgIHBfb3B0c19jb3VudCA6PSBjb3VudChwX3N0b3JhZ2Uub3B0aW9ucykKICAgIGlfb3B0c19jb3VudCA6PSBjb3VudChpX3N0b3JhZ2Uub3B0aW9ucykKICAgIGlfb3B0c19jb3VudCA9PSBwX29wdHNfY291bnQgKyAyCgogICAgaV9vcHRfbWF0Y2hlcyA6PSBbaSB8IGkgOj0gaWR4OyBpZHggPCBwX29wdHNfY291bnQ7IHBfc3RvcmFnZS5vcHRpb25zW2lkeF0gPT0gaV9zdG9yYWdlLm9wdGlvbnNbaWR4XV0KICAgIGNvdW50KGlfb3B0X21hdGNoZXMpID09IHBfb3B0c19jb3VudAoKICAgIHN0YXJ0c3dpdGgoaV9zdG9yYWdlLm9wdGlvbnNbaV9vcHRzX2NvdW50LTJdLCAiYWRkcj0iKQogICAgY3JlZHMgPSBzcGxpdChpX3N0b3JhZ2Uub3B0aW9uc1tpX29wdHNfY291bnQtMV0sICIsIikKICAgIGNvdW50KGNyZWRzKSA9PSAyCiAgICBzdGFydHN3aXRoKGNyZWRzWzBdLCAidXNlcm5hbWU9IikKICAgIHN0YXJ0c3dpdGgoY3JlZHNbMV0sICJwYXNzd29yZD0iKQogICAgCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDQ6IHRydWUiKQp9CgphbGxvd19vdmVybGF5X2xheWVyKHBvbGljeV9pZCwgcG9saWN5X2hhc2gsIGlfb3B0aW9uKSB7CiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogcG9saWN5X2lkID0iLCBwb2xpY3lfaWQsICJwb2xpY3lfaGFzaCA9IiwgcG9saWN5X2hhc2gpCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogaV9vcHRpb24gPSIsIGlfb3B0aW9uKQoKICAgIHN0YXJ0c3dpdGgoaV9vcHRpb24sICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQubGF5ZXI9IikKICAgIGlfdmFsdWUgOj0gcmVwbGFjZShpX29wdGlvbiwgImlvLmthdGFjb250YWluZXJzLmZzLW9wdC5sYXllcj0iLCAiIikKICAgIGlfdmFsdWVfZGVjb2RlZCA6PSBiYXNlNjQuZGVjb2RlKGlfdmFsdWUpCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogaV92YWx1ZV9kZWNvZGVkID0iLCBpX3ZhbHVlX2RlY29kZWQpCgogICAgcG9saWN5X3N1ZmZpeCA6PSBjb25jYXQoIj0iLCBbInRhcixybyxpby5rYXRhY29udGFpbmVycy5mcy1vcHQuYmxvY2tfZGV2aWNlPWZpbGUsaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmlzLWxheWVyLGlvLmthdGFjb250YWluZXJzLmZzLW9wdC5yb290LWhhc2giLCBwb2xpY3lfaGFzaF0pCiAgICBwX3ZhbHVlIDo9IGNvbmNhdCgiLCIsIFtwb2xpY3lfaWQsIHBvbGljeV9zdWZmaXhdKQogICAgcHJpbnQoImFsbG93X292ZXJsYXlfbGF5ZXI6IHBfdmFsdWUgPSIsIHBfdmFsdWUpCgogICAgcF92YWx1ZSA9PSBpX3ZhbHVlX2RlY29kZWQKCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogdHJ1ZSIpCn0KCmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAidGFyIgoKICAgIHN0YXJ0c3dpdGgocF9zdG9yYWdlLm1vdW50X3BvaW50LCAiJChsYXllciIpCiAgICBtb3VudF9zdWZmaXggOj0gdHJpbV9sZWZ0KHBfc3RvcmFnZS5tb3VudF9wb2ludCwgIiQobGF5ZXIiKQoKICAgIGVuZHN3aXRoKG1vdW50X3N1ZmZpeCwgIikiKQogICAgbGF5ZXJfaW5kZXggOj0gdHJpbV9yaWdodChtb3VudF9zdWZmaXgsICIpIikKICAgIGkgOj0gdG9fbnVtYmVyKGxheWVyX2luZGV4KQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDE6IGkgPSIsIGkpCgogICAgbGF5ZXJfaWQgOj0gbGF5ZXJfaWRzW2ldCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMTogbGF5ZXJfaWQgPSIsIGxheWVyX2lkKQoKICAgIHBfbW91bnQgOj0gY29uY2F0KCIvIiwgWyIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L2xheWVycyIsIGxheWVyX2lkXSkKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCAxOiBwX21vdW50ID0iLCBwX21vdW50KQoKICAgIHBfbW91bnQgPT0gaV9zdG9yYWdlLm1vdW50X3BvaW50CgogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDE6IHRydWUiKQp9CmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAiZnVzZTMua2F0YS1vdmVybGF5IgoKICAgIG1vdW50MSA6PSByZXBsYWNlKHBfc3RvcmFnZS5tb3VudF9wb2ludCwgIiQoY3BhdGgpIiwgcG9saWN5X2RhdGEuY29tbW9uLmNwYXRoKQogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDI6IG1vdW50MiA9IiwgbW91bnQyKQoKICAgIG1vdW50MiA9PSBpX3N0b3JhZ2UubW91bnRfcG9pbnQKCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMjogdHJ1ZSIpCn0KYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKSB7CiAgICBwX3N0b3JhZ2UuZnN0eXBlID09ICJsb2NhbCIKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQyID0iLCBtb3VudDIpCgogICAgbW91bnQzIDo9IHJlcGxhY2UobW91bnQyLCAiJChzYW5kYm94LWlkKSIsIHNhbmRib3hfaWQpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQzID0iLCBtb3VudDMpCgogICAgcmVnZXgubWF0Y2gobW91bnQzLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCgogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDM6IHRydWUiKQp9CmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAiYmluZCIKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNDogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNDogbW91bnQyID0iLCBtb3VudDIpCgogICAgbW91bnQzIDo9IHJlcGxhY2UobW91bnQyLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDQ6IG1vdW50MyA9IiwgbW91bnQzKQoKICAgIHJlZ2V4Lm1hdGNoKG1vdW50MywgaV9zdG9yYWdlLm1vdW50X3BvaW50KQoKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA0OiB0cnVlIikKfQphbGxvd19tb3VudF9wb2ludChwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgYnVuZGxlX2lkLCBzYW5kYm94X2lkLCBsYXllcl9pZHMpIHsKICAgIHBfc3RvcmFnZS5mc3R5cGUgPT0gInRtcGZzIgoKICAgIG1vdW50MSA6PSBwX3N0b3JhZ2UubW91bnRfcG9pbnQKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA1OiBtb3VudDEgPSIsIG1vdW50MSkKCiAgICByZWdleC5tYXRjaChtb3VudDEsIGlfc3RvcmFnZS5tb3VudF9wb2ludCkKCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNTogdHJ1ZSIpCn0KYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKSB7CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogaV9zdG9yYWdlLm1vdW50X3BvaW50ID0iLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCiAgICBhbGxvd19kaXJlY3Rfdm9sX2RyaXZlcihwX3N0b3JhZ2UsIGlfc3RvcmFnZSkKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChzcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQyID0iLCBtb3VudDIpCgogICAgZGlyZWN0X3ZvbF9wYXRoIDo9IGlfc3RvcmFnZS5zb3VyY2UKICAgIG1vdW50MyA6PSByZXBsYWNlKG1vdW50MiwgIiQoYjY0LWRpcmVjdC12b2wtcGF0aCkiLCBiYXNlNjR1cmwuZW5jb2RlKGRpcmVjdF92b2xfcGF0aCkpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQzID0iLCBtb3VudDMpCgogICAgbW91bnQzID09IGlfc3RvcmFnZS5tb3VudF9wb2ludAoKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA2OiB0cnVlIikKfQoKYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIocF9zdG9yYWdlLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19kaXJlY3Rfdm9sX2RyaXZlciAxOiBzdGFydCIpCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCiAgICBwcmludCgiYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIgMTogdHJ1ZSIpCn0KYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIocF9zdG9yYWdlLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19kaXJlY3Rfdm9sX2RyaXZlciAyOiBzdGFydCIpCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJzbWIiCiAgICBwcmludCgiYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIgMjogdHJ1ZSIpCn0KCiMgRXhlY1Byb2Nlc3NSZXF1ZXN0LnByb2Nlc3MuQ2FwYWJpbGl0aWVzCmFsbG93X2V4ZWNfY2FwcyhpX2NhcHMpIHsKICAgIG5vdCBpX2NhcHMuQW1iaWVudAogICAgbm90IGlfY2Fwcy5Cb3VuZGluZwogICAgbm90IGlfY2Fwcy5FZmZlY3RpdmUKICAgIG5vdCBpX2NhcHMuSW5oZXJpdGFibGUKICAgIG5vdCBpX2NhcHMuUGVybWl0dGVkCn0KCiMgT0NJLlByb2Nlc3MuQ2FwYWJpbGl0aWVzCmFsbG93X2NhcHMocF9jYXBzLCBpX2NhcHMpIHsKICAgIHByaW50KCJhbGxvd19jYXBzOiBwb2xpY3kgQW1iaWVudCA9IiwgcF9jYXBzLkFtYmllbnQpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgQW1iaWVudCA9IiwgaV9jYXBzLkFtYmllbnQpCiAgICBtYXRjaF9jYXBzKHBfY2Fwcy5BbWJpZW50LCBpX2NhcHMuQW1iaWVudCkKCiAgICBwcmludCgiYWxsb3dfY2FwczogcG9saWN5IEJvdW5kaW5nID0iLCBwX2NhcHMuQm91bmRpbmcpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgQm91bmRpbmcgPSIsIGlfY2Fwcy5Cb3VuZGluZykKICAgIG1hdGNoX2NhcHMocF9jYXBzLkJvdW5kaW5nLCBpX2NhcHMuQm91bmRpbmcpCgogICAgcHJpbnQoImFsbG93X2NhcHM6IHBvbGljeSBFZmZlY3RpdmUgPSIsIHBfY2Fwcy5FZmZlY3RpdmUpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgRWZmZWN0aXZlID0iLCBpX2NhcHMuRWZmZWN0aXZlKQogICAgbWF0Y2hfY2FwcyhwX2NhcHMuRWZmZWN0aXZlLCBpX2NhcHMuRWZmZWN0aXZlKQoKICAgIHByaW50KCJhbGxvd19jYXBzOiBwb2xpY3kgSW5oZXJpdGFibGUgPSIsIHBfY2Fwcy5Jbmhlcml0YWJsZSkKICAgIHByaW50KCJhbGxvd19jYXBzOiBpbnB1dCBJbmhlcml0YWJsZSA9IiwgaV9jYXBzLkluaGVyaXRhYmxlKQogICAgbWF0Y2hfY2FwcyhwX2NhcHMuSW5oZXJpdGFibGUsIGlfY2Fwcy5Jbmhlcml0YWJsZSkKCiAgICBwcmludCgiYWxsb3dfY2FwczogcG9saWN5IFBlcm1pdHRlZCA9IiwgcF9jYXBzLlBlcm1pdHRlZCkKICAgIHByaW50KCJhbGxvd19jYXBzOiBpbnB1dCBQZXJtaXR0ZWQgPSIsIGlfY2Fwcy5QZXJtaXR0ZWQpCiAgICBtYXRjaF9jYXBzKHBfY2Fwcy5QZXJtaXR0ZWQsIGlfY2Fwcy5QZXJtaXR0ZWQpCn0KCm1hdGNoX2NhcHMocF9jYXBzLCBpX2NhcHMpIHsKICAgIHByaW50KCJtYXRjaF9jYXBzIDE6IHN0YXJ0IikKCiAgICBwX2NhcHMgPT0gaV9jYXBzCgogICAgcHJpbnQoIm1hdGNoX2NhcHMgMTogdHJ1ZSIpCn0KbWF0Y2hfY2FwcyhwX2NhcHMsIGlfY2FwcykgewogICAgcHJpbnQoIm1hdGNoX2NhcHMgMjogc3RhcnQiKQoKICAgIGNvdW50KHBfY2FwcykgPT0gMQogICAgcF9jYXBzWzBdID09ICIkKGRlZmF1bHRfY2FwcykiCgogICAgcHJpbnQoIm1hdGNoX2NhcHMgMjogZGVmYXVsdF9jYXBzID0iLCBwb2xpY3lfZGF0YS5jb21tb24uZGVmYXVsdF9jYXBzKQogICAgcG9saWN5X2RhdGEuY29tbW9uLmRlZmF1bHRfY2FwcyA9PSBpX2NhcHMKCiAgICBwcmludCgibWF0Y2hfY2FwcyAyOiB0cnVlIikKfQptYXRjaF9jYXBzKHBfY2FwcywgaV9jYXBzKSB7CiAgICBwcmludCgibWF0Y2hfY2FwcyAzOiBzdGFydCIpCgogICAgY291bnQocF9jYXBzKSA9PSAxCiAgICBwX2NhcHNbMF0gPT0gIiQocHJpdmlsZWdlZF9jYXBzKSIKCiAgICBwcmludCgibWF0Y2hfY2FwcyAzOiBwcml2aWxlZ2VkX2NhcHMgPSIsIHBvbGljeV9kYXRhLmNvbW1vbi5wcml2aWxlZ2VkX2NhcHMpCiAgICBwb2xpY3lfZGF0YS5jb21tb24ucHJpdmlsZWdlZF9jYXBzID09IGlfY2FwcwoKICAgIHByaW50KCJtYXRjaF9jYXBzIDM6IHRydWUiKQp9CgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgpjaGVja19kaXJlY3RvcnlfdHJhdmVyc2FsKGlfcGF0aCkgewogICAgbm90IHJlZ2V4Lm1hdGNoKCIoXnwvKS4uKCR8LykiLCBpX3BhdGgpCn0KCmNoZWNrX3N5bWxpbmtfc291cmNlKGlfc3JjKSB7CiAgICBpX3NyYyA9PSAiIgogICAgcHJpbnQoImNoZWNrX3N5bWxpbmtfc291cmNlIDE6IHRydWUiKQp9CmNoZWNrX3N5bWxpbmtfc291cmNlKGlfc3JjKSB7CiAgICBpX3NyYyAhPSAiIgogICAgcHJpbnQoImNoZWNrX3N5bWxpbmtfc291cmNlIDI6IGlfc3JjID0iLCBpX3NyYykKCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24uc19zb3VyY2UxLCBpX3NyYykKCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMjogdHJ1ZSIpCn0KY2hlY2tfc3ltbGlua19zb3VyY2UoaV9zcmMpIHsKICAgIGlfc3JjICE9ICIiCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMzogaV9zcmMgPSIsIGlfc3JjKQoKICAgIHJlZ2V4Lm1hdGNoKHBvbGljeV9kYXRhLmNvbW1vbi5zX3NvdXJjZTIsIGlfc3JjKQogICAgY2hlY2tfZGlyZWN0b3J5X3RyYXZlcnNhbChpX3NyYykKCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMzogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfc3RvcmFnZXMoaV9zdG9yYWdlcykgewogICAgcHJpbnQoImFsbG93X3NhbmRib3hfc3RvcmFnZXM6IGlfc3RvcmFnZXMgPSIsIGlfc3RvcmFnZXMpCgogICAgcF9zdG9yYWdlcyA6PSBwb2xpY3lfZGF0YS5zYW5kYm94LnN0b3JhZ2VzCiAgICBldmVyeSBpX3N0b3JhZ2UgaW4gaV9zdG9yYWdlcyB7CiAgICAgICAgYWxsb3dfc2FuZGJveF9zdG9yYWdlKHBfc3RvcmFnZXMsIGlfc3RvcmFnZSkKICAgIH0KCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9zdG9yYWdlczogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfc3RvcmFnZShwX3N0b3JhZ2VzLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IGlfc3RvcmFnZSA9IiwgaV9zdG9yYWdlKQoKICAgIHNvbWUgcF9zdG9yYWdlIGluIHBfc3RvcmFnZXMKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IHBfc3RvcmFnZSA9IiwgcF9zdG9yYWdlKQogICAgaV9zdG9yYWdlID09IHBfc3RvcmFnZQoKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IHRydWUiKQp9CgpDb3B5RmlsZVJlcXVlc3QgewogICAgcHJpbnQoIkNvcHlGaWxlUmVxdWVzdDogaW5wdXQucGF0aCA9IiwgaW5wdXQucGF0aCkKCiAgICBjaGVja19zeW1saW5rX3NvdXJjZShpbnB1dC5zeW1saW5rX3NyYykKICAgIGNoZWNrX2RpcmVjdG9yeV90cmF2ZXJzYWwoaW5wdXQucGF0aCkKCiAgICBzb21lIHJlZ2V4MSBpbiBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLkNvcHlGaWxlUmVxdWVzdAogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5jcGF0aCkKICAgIHJlZ2V4NCA6PSByZXBsYWNlKHJlZ2V4MywgIiQoYnVuZGxlLWlkKSIsIEJVTkRMRV9JRCkKICAgIHByaW50KCJDb3B5RmlsZVJlcXVlc3Q6IHJlZ2V4NCA9IiwgcmVnZXg0KQoKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4NCwgaW5wdXQucGF0aCkKCiAgICBwcmludCgiQ29weUZpbGVSZXF1ZXN0OiB0cnVlIikKfQoKQ3JlYXRlU2FuZGJveFJlcXVlc3QgewogICAgcHJpbnQoIkNyZWF0ZVNhbmRib3hSZXF1ZXN0OiBpbnB1dC5ndWVzdF9ob29rX3BhdGggPSIsIGlucHV0Lmd1ZXN0X2hvb2tfcGF0aCkKICAgIGNvdW50KGlucHV0Lmd1ZXN0X2hvb2tfcGF0aCkgPT0gMAoKICAgIHByaW50KCJDcmVhdGVTYW5kYm94UmVxdWVzdDogaW5wdXQua2VybmVsX21vZHVsZXMgPSIsIGlucHV0Lmtlcm5lbF9tb2R1bGVzKQogICAgY291bnQoaW5wdXQua2VybmVsX21vZHVsZXMpID09IDAKCiAgICBpX3BpZG5zIDo9IGlucHV0LnNhbmRib3hfcGlkbnMKICAgIHByaW50KCJDcmVhdGVTYW5kYm94UmVxdWVzdDogaV9waWRucyA9IiwgaV9waWRucykKICAgIGlfcGlkbnMgPT0gZmFsc2UKICAgIGFsbG93X3NhbmRib3hfc3RvcmFnZXMoaW5wdXQuc3RvcmFnZXMpCn0KCmFsbG93X2V4ZWMocF9jb250YWluZXIsIGlfcHJvY2VzcykgewogICAgcHJpbnQoImFsbG93X2V4ZWM6IHN0YXJ0IikKCiAgICBwX29jaSA9IHBfY29udGFpbmVyLk9DSQogICAgcF9zX25hbWUgPSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc19uYW1lc3BhY2UgPSBnZXRfc3RhdGVfdmFsKCJuYW1lc3BhY2UiKQogICAgYWxsb3dfcHJvYmVfcHJvY2VzcyhwX29jaS5Qcm9jZXNzLCBpX3Byb2Nlc3MsIHBfc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfZXhlYzogdHJ1ZSIpCn0KCmFsbG93X2ludGVyYWN0aXZlX2V4ZWMocF9jb250YWluZXIsIGlfcHJvY2VzcykgewogICAgcHJpbnQoImFsbG93X2ludGVyYWN0aXZlX2V4ZWM6IHN0YXJ0IikKCiAgICBwX29jaSA9IHBfY29udGFpbmVyLk9DSQogICAgcF9zX25hbWUgPSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc19uYW1lc3BhY2UgPSBnZXRfc3RhdGVfdmFsKCJuYW1lc3BhY2UiKQogICAgYWxsb3dfaW50ZXJhY3RpdmVfcHJvY2VzcyhwX29jaS5Qcm9jZXNzLCBpX3Byb2Nlc3MsIHBfc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfaW50ZXJhY3RpdmVfZXhlYzogdHJ1ZSIpCn0KCiMgVE9ETzogc2hvdWxkIG90aGVyIEV4ZWNQcm9jZXNzUmVxdWVzdCBpbnB1dCBkYXRhIGZpZWxkcyBiZSB2YWxpZGF0ZWQgYXMgd2VsbD8KRXhlY1Byb2Nlc3NSZXF1ZXN0IHsKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMTogaW5wdXQgPSIsIGlucHV0KQoKICAgIHNvbWUgcF9jb21tYW5kIGluIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuRXhlY1Byb2Nlc3NSZXF1ZXN0LmFsbG93ZWRfY29tbWFuZHMKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMTogcF9jb21tYW5kID0iLCBwX2NvbW1hbmQpCiAgICBwX2NvbW1hbmQgPT0gaW5wdXQucHJvY2Vzcy5BcmdzCgogICAgIyBUT0RPOiBtYXRjaCBwX2NvbnRhaW5lcidzIElEIHdpdGggdGhlIGlucHV0IGNvbnRhaW5lcl9pZC4KICAgIHNvbWUgcF9jb250YWluZXIgaW4gcG9saWN5X2RhdGEuY29udGFpbmVycwogICAgYWxsb3dfaW50ZXJhY3RpdmVfZXhlYyhwX2NvbnRhaW5lciwgaW5wdXQucHJvY2VzcykKCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDE6IHRydWUiKQp9CkV4ZWNQcm9jZXNzUmVxdWVzdCB7CiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDI6IGlucHV0ID0iLCBpbnB1dCkKCiAgICAjIFRPRE86IG1hdGNoIGlucHV0IGNvbnRhaW5lciBJRCB3aXRoIGl0cyBjb3JyZXNwb25kaW5nIGNvbnRhaW5lci5leGVjX2NvbW1hbmRzLgogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBzb21lIHBfY29tbWFuZCBpbiBwX2NvbnRhaW5lci5leGVjX2NvbW1hbmRzCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDI6IHBfY29tbWFuZCA9IiwgcF9jb21tYW5kKQoKICAgICMgVE9ETzogc2hvdWxkIG90aGVyIGlucHV0IGRhdGEgZmllbGRzIGJlIHZhbGlkYXRlZCBhcyB3ZWxsPwogICAgcF9jb21tYW5kID09IGlucHV0LnByb2Nlc3MuQXJncwoKICAgIGFsbG93X2V4ZWMocF9jb250YWluZXIsIGlucHV0LnByb2Nlc3MpCgogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAyOiB0cnVlIikKfQpFeGVjUHJvY2Vzc1JlcXVlc3QgewogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAzOiBpbnB1dCA9IiwgaW5wdXQpCgogICAgaV9jb21tYW5kID0gY29uY2F0KCIgIiwgaW5wdXQucHJvY2Vzcy5BcmdzKQogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAzOiBpX2NvbW1hbmQgPSIsIGlfY29tbWFuZCkKCiAgICBzb21lIHBfcmVnZXggaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5FeGVjUHJvY2Vzc1JlcXVlc3QucmVnZXgKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMzogcF9yZWdleCA9IiwgcF9yZWdleCkKCiAgICByZWdleC5tYXRjaChwX3JlZ2V4LCBpX2NvbW1hbmQpCgogICAgIyBUT0RPOiBtYXRjaCBwX2NvbnRhaW5lcidzIElEIHdpdGggdGhlIGlucHV0IGNvbnRhaW5lcl9pZC4KICAgIHNvbWUgcF9jb250YWluZXIgaW4gcG9saWN5X2RhdGEuY29udGFpbmVycwogICAgYWxsb3dfaW50ZXJhY3RpdmVfZXhlYyhwX2NvbnRhaW5lciwgaW5wdXQucHJvY2VzcykKCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDM6IHRydWUiKQp9CgpVcGRhdGVSb3V0ZXNSZXF1ZXN0IHsKICAgIHByaW50KCJVcGRhdGVSb3V0ZXNSZXF1ZXN0OiBpbnB1dCA9IiwgaW5wdXQpCiAgICBwcmludCgiVXBkYXRlUm91dGVzUmVxdWVzdDogcG9saWN5ID0iLCBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLlVwZGF0ZVJvdXRlc1JlcXVlc3QpCgogICAgaV9yb3V0ZXMgOj0gaW5wdXQucm91dGVzLlJvdXRlcwogICAgcF9zb3VyY2VfcmVnZXggPSBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLlVwZGF0ZVJvdXRlc1JlcXVlc3QuZm9yYmlkZGVuX3NvdXJjZV9yZWdleAogICAgcF9uYW1lcyA9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuVXBkYXRlUm91dGVzUmVxdWVzdC5mb3JiaWRkZW5fZGV2aWNlX25hbWVzCgogICAgZXZlcnkgaV9yb3V0ZSBpbiBpX3JvdXRlcyB7CiAgICAgICAgcHJpbnQoImlfcm91dGUuc291cmNlID0iLCBpX3JvdXRlLnNvdXJjZSkKICAgICAgICBldmVyeSBwX3JlZ2V4IGluIHBfc291cmNlX3JlZ2V4IHsKICAgICAgICAgICAgcHJpbnQoInBfcmVnZXggPSIsIHBfcmVnZXgpCiAgICAgICAgICAgIG5vdCByZWdleC5tYXRjaChwX3JlZ2V4LCBpX3JvdXRlLnNvdXJjZSkKICAgICAgICB9CgogICAgICAgIHByaW50KCJpX3JvdXRlLmRldmljZSA9IiwgaV9yb3V0ZS5kZXZpY2UpCiAgICAgICAgbm90IGlfcm91dGUuZGV2aWNlIGluIHBfbmFtZXMKICAgIH0KCiAgICBwcmludCgiVXBkYXRlUm91dGVzUmVxdWVzdDogdHJ1ZSIpCn0KClVwZGF0ZUludGVyZmFjZVJlcXVlc3QgewogICAgcHJpbnQoIlVwZGF0ZUludGVyZmFjZVJlcXVlc3Q6IGlucHV0ID0iLCBpbnB1dCkKICAgIHByaW50KCJVcGRhdGVJbnRlcmZhY2VSZXF1ZXN0OiBwb2xpY3kgPSIsIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuVXBkYXRlSW50ZXJmYWNlUmVxdWVzdCkKCiAgICBpX2ludGVyZmFjZSA6PSBpbnB1dC5pbnRlcmZhY2UKICAgIHBfZmxhZ3MgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmFsbG93X3Jhd19mbGFncwoKICAgICMgVHlwaWNhbGx5LCBqdXN0IElGRl9OT0FSUCBpcyB1c2VkLgogICAgYml0cy5hbmQoaV9pbnRlcmZhY2UucmF3X2ZsYWdzLCBiaXRzLm5lZ2F0ZShwX2ZsYWdzKSkgPT0gMAoKICAgIHBfbmFtZXMgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmZvcmJpZGRlbl9uYW1lcwoKICAgIG5vdCBpX2ludGVyZmFjZS5uYW1lIGluIHBfbmFtZXMKCiAgICBwX2h3YWRkcnMgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmZvcmJpZGRlbl9od19hZGRycwoKICAgIG5vdCBpX2ludGVyZmFjZS5od0FkZHIgaW4gcF9od2FkZHJzCgogICAgcHJpbnQoIlVwZGF0ZUludGVyZmFjZVJlcXVlc3Q6IHRydWUiKQp9CgpDbG9zZVN0ZGluUmVxdWVzdCB7CiAgICBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLkNsb3NlU3RkaW5SZXF1ZXN0ID09IHRydWUKfQoKUmVhZFN0cmVhbVJlcXVlc3QgewogICAgcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5SZWFkU3RyZWFtUmVxdWVzdCA9PSB0cnVlCn0KClVwZGF0ZUVwaGVtZXJhbE1vdW50c1JlcXVlc3QgewogICAgcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVFcGhlbWVyYWxNb3VudHNSZXF1ZXN0ID09IHRydWUKfQoKV3JpdGVTdHJlYW1SZXF1ZXN0IHsKICAgIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuV3JpdGVTdHJlYW1SZXF1ZXN0ID09IHRydWUKfQoKcG9saWN5X2RhdGEgOj0gewogICJjb250YWluZXJzIjogWwogICAgewogICAgICAiT0NJIjogewogICAgICAgICJWZXJzaW9uIjogIjEuMS4wLXJjLjEiLAogICAgICAgICJQcm9jZXNzIjogewogICAgICAgICAgIlRlcm1pbmFsIjogZmFsc2UsCiAgICAgICAgICAiVXNlciI6IHsKICAgICAgICAgICAgIlVJRCI6IDY1NTM1LAogICAgICAgICAgICAiR0lEIjogNjU1MzUsCiAgICAgICAgICAgICJBZGRpdGlvbmFsR2lkcyI6IFtdLAogICAgICAgICAgICAiVXNlcm5hbWUiOiAiIgogICAgICAgICAgfSwKICAgICAgICAgICJEZXByZWNhdGVkQXJncyI6IFsKICAgICAgICAgICAgIi9wYXVzZSIKICAgICAgICAgIF0sCiAgICAgICAgICAiQXJncyI6IFsKICAgICAgICAgICAgIi9wYXVzZSIKICAgICAgICAgIF0sCiAgICAgICAgICAiRW52IjogWwogICAgICAgICAgICAiUEFUSD0vdXNyL2xvY2FsL3NiaW46L3Vzci9sb2NhbC9iaW46L3Vzci9zYmluOi91c3IvYmluOi9zYmluOi9iaW4iCiAgICAgICAgICBdLAogICAgICAgICAgIkN3ZCI6ICIvIiwKICAgICAgICAgICJDYXBhYmlsaXRpZXMiOiB7CiAgICAgICAgICAgICJBbWJpZW50IjogW10sCiAgICAgICAgICAgICJCb3VuZGluZyI6IFsKICAgICAgICAgICAgICAiJChkZWZhdWx0X2NhcHMpIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiRWZmZWN0aXZlIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJJbmhlcml0YWJsZSI6IFtdLAogICAgICAgICAgICAiUGVybWl0dGVkIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICAiTm9OZXdQcml2aWxlZ2VzIjogdHJ1ZQogICAgICAgIH0sCiAgICAgICAgIlJvb3QiOiB7CiAgICAgICAgICAiUGF0aCI6ICIkKGNwYXRoKS8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgIlJlYWRvbmx5IjogdHJ1ZQogICAgICAgIH0sCiAgICAgICAgIk1vdW50cyI6IFsKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9wcm9jIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJwcm9jIiwKICAgICAgICAgICAgInR5cGVfIjogInByb2MiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2IiwKICAgICAgICAgICAgInNvdXJjZSI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJzdHJpY3RhdGltZSIsCiAgICAgICAgICAgICAgIm1vZGU9NzU1IiwKICAgICAgICAgICAgICAic2l6ZT02NTUzNmsiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L3B0cyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiZGV2cHRzIiwKICAgICAgICAgICAgInR5cGVfIjogImRldnB0cyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJuZXdpbnN0YW5jZSIsCiAgICAgICAgICAgICAgInB0bXhtb2RlPTA2NjYiLAogICAgICAgICAgICAgICJtb2RlPTA2MjAiLAogICAgICAgICAgICAgICJnaWQ9NSIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvc2htIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L3NobSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi9tcXVldWUiLAogICAgICAgICAgICAic291cmNlIjogIm1xdWV1ZSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJtcXVldWUiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvc3lzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJzeXNmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJzeXNmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2V0Yy9yZXNvbHYuY29uZiIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClyZXNvbHYuY29uZiQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJvIiwKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9kZXYiLAogICAgICAgICAgICAgICJub2V4ZWMiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0KICAgICAgICBdLAogICAgICAgICJBbm5vdGF0aW9ucyI6IHsKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmJ1bmRsZV9wYXRoIjogIi9ydW4vY29udGFpbmVyZC9pby5jb250YWluZXJkLnJ1bnRpbWUudjIudGFzay9rOHMuaW8vJChidW5kbGUtaWQpIiwKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIjogInBvZF9zYW5kYm94IiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSI6ICJzYW5kYm94IiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWlkIjogIl5bYS16MC05XXs2NH0kIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWxvZy1kaXJlY3RvcnkiOiAiXi92YXIvbG9nL3BvZHMvJChzYW5kYm94LW5hbWVzcGFjZSlfJChzYW5kYm94LW5hbWUpX1swLTlhLWZdezh9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezEyfSQiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZXNwYWNlIjogIiIsCiAgICAgICAgICAibmVyZGN0bC9uZXR3b3JrLW5hbWVzcGFjZSI6ICJeL3Zhci9ydW4vbmV0bnMvY25pLVswLTlhLWZdezh9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezEyfSQiCiAgICAgICAgfSwKICAgICAgICAiTGludXgiOiB7CiAgICAgICAgICAiTmFtZXNwYWNlcyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICJUeXBlIjogImlwYyIsCiAgICAgICAgICAgICAgIlBhdGgiOiAiIgogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgIlR5cGUiOiAidXRzIiwKICAgICAgICAgICAgICAiUGF0aCI6ICIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiVHlwZSI6ICJtb3VudCIsCiAgICAgICAgICAgICAgIlBhdGgiOiAiIgogICAgICAgICAgICB9CiAgICAgICAgICBdLAogICAgICAgICAgIk1hc2tlZFBhdGhzIjogWwogICAgICAgICAgICAiL3Byb2MvYWNwaSIsCiAgICAgICAgICAgICIvcHJvYy9hc291bmQiLAogICAgICAgICAgICAiL3Byb2Mva2NvcmUiLAogICAgICAgICAgICAiL3Byb2Mva2V5cyIsCiAgICAgICAgICAgICIvcHJvYy9sYXRlbmN5X3N0YXRzIiwKICAgICAgICAgICAgIi9wcm9jL3RpbWVyX2xpc3QiLAogICAgICAgICAgICAiL3Byb2MvdGltZXJfc3RhdHMiLAogICAgICAgICAgICAiL3Byb2Mvc2NoZWRfZGVidWciLAogICAgICAgICAgICAiL3N5cy9maXJtd2FyZSIsCiAgICAgICAgICAgICIvcHJvYy9zY3NpIgogICAgICAgICAgXSwKICAgICAgICAgICJSZWFkb25seVBhdGhzIjogWwogICAgICAgICAgICAiL3Byb2MvYnVzIiwKICAgICAgICAgICAgIi9wcm9jL2ZzIiwKICAgICAgICAgICAgIi9wcm9jL2lycSIsCiAgICAgICAgICAgICIvcHJvYy9zeXMiLAogICAgICAgICAgICAiL3Byb2Mvc3lzcnEtdHJpZ2dlciIKICAgICAgICAgIF0sCiAgICAgICAgICAiRGV2aWNlcyI6IFtdLAogICAgICAgICAgIlN5c2N0bCI6IHsKICAgICAgICAgICAgIm5ldC5pcHY0LmlwX3VucHJpdmlsZWdlZF9wb3J0X3N0YXJ0IjogIjAiLAogICAgICAgICAgICAibmV0LmlwdjQucGluZ19ncm91cF9yYW5nZSI6ICIwIDIxNDc0ODM2NDciCiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9LAogICAgICAic3RvcmFnZXMiOiBbCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJibGsiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogInRhciIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIiQoaGFzaDApIgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGxheWVyMCkiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJvdmVybGF5ZnMiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogImZ1c2UzLmthdGEtb3ZlcmxheSIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIjVhNWFhZDgwMDU1ZmYyMDAxMmE1MGRjMjVmOGRmN2EyOTkyNDQ3NDMyNGQ2NWY3ZDUzMDZlZThlZTI3ZmY3MWQiLAogICAgICAgICAgICAiODE3MjUwZjFhM2UzMzZkYTc2ZjViZDNmYTc4NGUxYjI2ZDk1OWI5YzEzMTg3NjgxNWJhMjYwNDA0OGI3MGMxOCIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChjcGF0aCkvJChidW5kbGUtaWQpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9CiAgICAgIF0sCiAgICAgICJkZXZpY2VzIjogW10sCiAgICAgICJzYW5kYm94X3BpZG5zIjogZmFsc2UsCiAgICAgICJleGVjX2NvbW1hbmRzIjogW10sCiAgICAgICJlbnZfbWFwIjogewogICAgICAgICJQQVRIIjogIi91c3IvbG9jYWwvc2JpbjovdXNyL2xvY2FsL2JpbjovdXNyL3NiaW46L3Vzci9iaW46L3NiaW46L2JpbiIKICAgICAgfQogICAgfSwKICAgIHsKICAgICAgIk9DSSI6IHsKICAgICAgICAiVmVyc2lvbiI6ICIxLjEuMC1yYy4xIiwKICAgICAgICAiUHJvY2VzcyI6IHsKICAgICAgICAgICJUZXJtaW5hbCI6IGZhbHNlLAogICAgICAgICAgIlVzZXIiOiB7CiAgICAgICAgICAgICJVSUQiOiA2NTUzNSwKICAgICAgICAgICAgIkdJRCI6IDY1NTM1LAogICAgICAgICAgICAiQWRkaXRpb25hbEdpZHMiOiBbXSwKICAgICAgICAgICAgIlVzZXJuYW1lIjogIiIKICAgICAgICAgIH0sCiAgICAgICAgICAiRGVwcmVjYXRlZEFyZ3MiOiBbCiAgICAgICAgICAgICIvcGF1c2UiCiAgICAgICAgICBdLAogICAgICAgICAgIkFyZ3MiOiBbCiAgICAgICAgICAgICIvcGF1c2UiCiAgICAgICAgICBdLAogICAgICAgICAgIkVudiI6IFsKICAgICAgICAgICAgIlBBVEg9L3Vzci9sb2NhbC9zYmluOi91c3IvbG9jYWwvYmluOi91c3Ivc2JpbjovdXNyL2Jpbjovc2JpbjovYmluIiwKICAgICAgICAgICAgIkhPU1ROQU1FPSQoaG9zdC1uYW1lKSIKICAgICAgICAgIF0sCiAgICAgICAgICAiQ3dkIjogIi8iLAogICAgICAgICAgIkNhcGFiaWxpdGllcyI6IHsKICAgICAgICAgICAgIkFtYmllbnQiOiBbXSwKICAgICAgICAgICAgIkJvdW5kaW5nIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJFZmZlY3RpdmUiOiBbCiAgICAgICAgICAgICAgIiQoZGVmYXVsdF9jYXBzKSIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgIkluaGVyaXRhYmxlIjogW10sCiAgICAgICAgICAgICJQZXJtaXR0ZWQiOiBbCiAgICAgICAgICAgICAgIiQoZGVmYXVsdF9jYXBzKSIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgICJOb05ld1ByaXZpbGVnZXMiOiBmYWxzZQogICAgICAgIH0sCiAgICAgICAgIlJvb3QiOiB7CiAgICAgICAgICAiUGF0aCI6ICIkKGNwYXRoKS8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgIlJlYWRvbmx5IjogZmFsc2UKICAgICAgICB9LAogICAgICAgICJNb3VudHMiOiBbCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvcHJvYyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAicHJvYyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJwcm9jIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAgICAgIm5vZGV2IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2RldiIsCiAgICAgICAgICAgICJzb3VyY2UiOiAidG1wZnMiLAogICAgICAgICAgICAidHlwZV8iOiAidG1wZnMiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAic3RyaWN0YXRpbWUiLAogICAgICAgICAgICAgICJtb2RlPTc1NSIsCiAgICAgICAgICAgICAgInNpemU9NjU1MzZrIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi9wdHMiLAogICAgICAgICAgICAic291cmNlIjogImRldnB0cyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJkZXZwdHMiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibmV3aW5zdGFuY2UiLAogICAgICAgICAgICAgICJwdG14bW9kZT0wNjY2IiwKICAgICAgICAgICAgICAibW9kZT0wNjIwIiwKICAgICAgICAgICAgICAiZ2lkPTUiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L3NobSIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiL3J1bi9rYXRhLWNvbnRhaW5lcnMvc2FuZGJveC9zaG0iLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvbXF1ZXVlIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJtcXVldWUiLAogICAgICAgICAgICAidHlwZV8iOiAibXF1ZXVlIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAgICAgIm5vZGV2IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL3N5cyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAic3lzZnMiLAogICAgICAgICAgICAidHlwZV8iOiAic3lzZnMiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiLAogICAgICAgICAgICAgICJybyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9zeXMvZnMvY2dyb3VwIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJjZ3JvdXAiLAogICAgICAgICAgICAidHlwZV8iOiAiY2dyb3VwIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAgICAgIm5vZGV2IiwKICAgICAgICAgICAgICAicmVsYXRpbWUiLAogICAgICAgICAgICAgICJybyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9ldGMvaG9zdHMiLAogICAgICAgICAgICAic291cmNlIjogIiQoc2ZwcmVmaXgpaG9zdHMkIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJ3IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi90ZXJtaW5hdGlvbi1sb2ciLAogICAgICAgICAgICAic291cmNlIjogIiQoc2ZwcmVmaXgpdGVybWluYXRpb24tbG9nJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJydyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9ldGMvaG9zdG5hbWUiLAogICAgICAgICAgICAic291cmNlIjogIiQoc2ZwcmVmaXgpaG9zdG5hbWUkIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJ3IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2V0Yy9yZXNvbHYuY29uZiIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClyZXNvbHYuY29uZiQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicnciCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvdmFyL3J1bi9zZWNyZXRzL2t1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQiLAogICAgICAgICAgICAic291cmNlIjogIiQoc2ZwcmVmaXgpc2VydmljZWFjY291bnQkIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL3Zhci9ydW4vc2VjcmV0cy9henVyZS90b2tlbnMiLAogICAgICAgICAgICAic291cmNlIjogIiQoc2ZwcmVmaXgpdG9rZW5zJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJybyIKICAgICAgICAgICAgXQogICAgICAgICAgfQogICAgICAgIF0sCiAgICAgICAgIkFubm90YXRpb25zIjogewogICAgICAgICAgImlvLmthdGFjb250YWluZXJzLnBrZy5vY2kuYnVuZGxlX3BhdGgiOiAiL3J1bi9jb250YWluZXJkL2lvLmNvbnRhaW5lcmQucnVudGltZS52Mi50YXNrL2s4cy5pby8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgImlvLmthdGFjb250YWluZXJzLnBrZy5vY2kuY29udGFpbmVyX3R5cGUiOiAicG9kX2NvbnRhaW5lciIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLW5hbWUiOiAibW9jay1jb250YWluZXIiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLmNvbnRhaW5lci10eXBlIjogImNvbnRhaW5lciIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuaW1hZ2UtbmFtZSI6ICJyZWdpc3RyeS5rOHMuaW8vcGF1c2U6My45IiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWlkIjogIl5bYS16MC05XXs2NH0kIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LW5hbWVzcGFjZSI6ICIiCiAgICAgICAgfSwKICAgICAgICAiTGludXgiOiB7CiAgICAgICAgICAiTmFtZXNwYWNlcyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICJUeXBlIjogImlwYyIsCiAgICAgICAgICAgICAgIlBhdGgiOiAiIgogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgIlR5cGUiOiAidXRzIiwKICAgICAgICAgICAgICAiUGF0aCI6ICIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiVHlwZSI6ICJtb3VudCIsCiAgICAgICAgICAgICAgIlBhdGgiOiAiIgogICAgICAgICAgICB9CiAgICAgICAgICBdLAogICAgICAgICAgIk1hc2tlZFBhdGhzIjogWwogICAgICAgICAgICAiL3Byb2MvYWNwaSIsCiAgICAgICAgICAgICIvcHJvYy9rY29yZSIsCiAgICAgICAgICAgICIvcHJvYy9rZXlzIiwKICAgICAgICAgICAgIi9wcm9jL2xhdGVuY3lfc3RhdHMiLAogICAgICAgICAgICAiL3Byb2MvdGltZXJfbGlzdCIsCiAgICAgICAgICAgICIvcHJvYy90aW1lcl9zdGF0cyIsCiAgICAgICAgICAgICIvcHJvYy9zY2hlZF9kZWJ1ZyIsCiAgICAgICAgICAgICIvcHJvYy9zY3NpIiwKICAgICAgICAgICAgIi9zeXMvZmlybXdhcmUiCiAgICAgICAgICBdLAogICAgICAgICAgIlJlYWRvbmx5UGF0aHMiOiBbCiAgICAgICAgICAgICIvcHJvYy9hc291bmQiLAogICAgICAgICAgICAiL3Byb2MvYnVzIiwKICAgICAgICAgICAgIi9wcm9jL2ZzIiwKICAgICAgICAgICAgIi9wcm9jL2lycSIsCiAgICAgICAgICAgICIvcHJvYy9zeXMiLAogICAgICAgICAgICAiL3Byb2Mvc3lzcnEtdHJpZ2dlciIKICAgICAgICAgIF0sCiAgICAgICAgICAiRGV2aWNlcyI6IFtdLAogICAgICAgICAgIlN5c2N0bCI6IHsKICAgICAgICAgICAgIm5ldC5pcHY0LmlwX3VucHJpdmlsZWdlZF9wb3J0X3N0YXJ0IjogIjAiLAogICAgICAgICAgICAibmV0LmlwdjQucGluZ19ncm91cF9yYW5nZSI6ICIwIDIxNDc0ODM2NDciCiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9LAogICAgICAic3RvcmFnZXMiOiBbCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJibGsiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogInRhciIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIiQoaGFzaDApIgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGxheWVyMCkiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJvdmVybGF5ZnMiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogImZ1c2UzLmthdGEtb3ZlcmxheSIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgImQwMzQwMGUyNGI3ZGY1M2FhMjkzOTU5YTVmNmZiYTgyZjAxZTczYjk5NmVlYjMzMDljMmY3MzY4YTI1OWE2NDUiLAogICAgICAgICAgICAiYWFjZTgzNDRkODRjNjRiMTQxZDQ4MjRhOWJjNDJjN2Y3NjY2MTljYzVlZmM3MTA3MmFmYzdhZjFkZmE2NjY1MCIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChjcGF0aCkvJChidW5kbGUtaWQpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9CiAgICAgIF0sCiAgICAgICJkZXZpY2VzIjogW10sCiAgICAgICJzYW5kYm94X3BpZG5zIjogZmFsc2UsCiAgICAgICJleGVjX2NvbW1hbmRzIjogW10sCiAgICAgICJlbnZfbWFwIjogewogICAgICAgICJIT1NUTkFNRSI6ICIkKGhvc3QtbmFtZSkiLAogICAgICAgICJQQVRIIjogIi91c3IvbG9jYWwvc2JpbjovdXNyL2xvY2FsL2JpbjovdXNyL3NiaW46L3Vzci9iaW46L3NiaW46L2JpbiIKICAgICAgfQogICAgfQogIF0sCiAgImNvbW1vbiI6IHsKICAgICJjcGF0aCI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zaGFyZWQvY29udGFpbmVycyIsCiAgICAibW91bnRfc291cmNlX2NwYXRoIjogIi9ydW4va2F0YS1jb250YWluZXJzL3NoYXJlZC9jb250YWluZXJzIiwKICAgICJzZnByZWZpeCI6ICJeJChjcGF0aCkvJChidW5kbGUtaWQpLVthLXowLTldezE2fS0iLAogICAgInNwYXRoIjogIi9ydW4va2F0YS1jb250YWluZXJzL3NhbmRib3gvc3RvcmFnZSIsCiAgICAiaXB2NF9hIjogIigoWzAtOV18WzEtOV1bMC05XXwxWzAtOV17Mn18MlswLTRdWzAtOV18MjVbMC01XSlcXC4pezN9KFswLTldfFsxLTldWzAtOV18MVswLTldezJ9fDJbMC00XVswLTldfDI1WzAtNV0pIiwKICAgICJpcF9wIjogIlswLTldezEsNX0iLAogICAgInN2Y19uYW1lIjogIltBLVpfXFwuXFwtXSsiLAogICAgImRuc19sYWJlbCI6ICJbYS16QS1aMC05X1xcLlxcLV0rIiwKICAgICJzX3NvdXJjZTEiOiAiXi4uMlswLTldezN9X1swLTFdWzAtOV1fWzAtM11bMC05XV9bMC0yXVswLTldX1swLTVdWzAtOV1fWzAtNV1bMC05XVxcLlswLTldezEsMTB9JCIsCiAgICAic19zb3VyY2UyIjogIl4uLmRhdGEvIiwKICAgICJkbnNfc3ViZG9tYWluIjogIl5bYS16MC05XShbLWEtejAtOV0qW2EtejAtOV0pPyQiLAogICAgInBvZF91aWQiOiAiXlswLTlhLWZBLUZdezh9LVswLTlhLWZBLUZdezR9LVswLTlhLWZBLUZdezR9LVswLTlhLWZBLUZdezR9LVswLTlhLWZBLUZdezEyfSQiLAogICAgImRlZmF1bHRfY2FwcyI6IFsKICAgICAgIkNBUF9DSE9XTiIsCiAgICAgICJDQVBfREFDX09WRVJSSURFIiwKICAgICAgIkNBUF9GU0VUSUQiLAogICAgICAiQ0FQX0ZPV05FUiIsCiAgICAgICJDQVBfTUtOT0QiLAogICAgICAiQ0FQX05FVF9SQVciLAogICAgICAiQ0FQX1NFVEdJRCIsCiAgICAgICJDQVBfU0VUVUlEIiwKICAgICAgIkNBUF9TRVRGQ0FQIiwKICAgICAgIkNBUF9TRVRQQ0FQIiwKICAgICAgIkNBUF9ORVRfQklORF9TRVJWSUNFIiwKICAgICAgIkNBUF9TWVNfQ0hST09UIiwKICAgICAgIkNBUF9LSUxMIiwKICAgICAgIkNBUF9BVURJVF9XUklURSIKICAgIF0sCiAgICAicHJpdmlsZWdlZF9jYXBzIjogWwogICAgICAiQ0FQX0NIT1dOIiwKICAgICAgIkNBUF9EQUNfT1ZFUlJJREUiLAogICAgICAiQ0FQX0RBQ19SRUFEX1NFQVJDSCIsCiAgICAgICJDQVBfRk9XTkVSIiwKICAgICAgIkNBUF9GU0VUSUQiLAogICAgICAiQ0FQX0tJTEwiLAogICAgICAiQ0FQX1NFVEdJRCIsCiAgICAgICJDQVBfU0VUVUlEIiwKICAgICAgIkNBUF9TRVRQQ0FQIiwKICAgICAgIkNBUF9MSU5VWF9JTU1VVEFCTEUiLAogICAgICAiQ0FQX05FVF9CSU5EX1NFUlZJQ0UiLAogICAgICAiQ0FQX05FVF9CUk9BRENBU1QiLAogICAgICAiQ0FQX05FVF9BRE1JTiIsCiAgICAgICJDQVBfTkVUX1JBVyIsCiAgICAgICJDQVBfSVBDX0xPQ0siLAogICAgICAiQ0FQX0lQQ19PV05FUiIsCiAgICAgICJDQVBfU1lTX01PRFVMRSIsCiAgICAgICJDQVBfU1lTX1JBV0lPIiwKICAgICAgIkNBUF9TWVNfQ0hST09UIiwKICAgICAgIkNBUF9TWVNfUFRSQUNFIiwKICAgICAgIkNBUF9TWVNfUEFDQ1QiLAogICAgICAiQ0FQX1NZU19BRE1JTiIsCiAgICAgICJDQVBfU1lTX0JPT1QiLAogICAgICAiQ0FQX1NZU19OSUNFIiwKICAgICAgIkNBUF9TWVNfUkVTT1VSQ0UiLAogICAgICAiQ0FQX1NZU19USU1FIiwKICAgICAgIkNBUF9TWVNfVFRZX0NPTkZJRyIsCiAgICAgICJDQVBfTUtOT0QiLAogICAgICAiQ0FQX0xFQVNFIiwKICAgICAgIkNBUF9BVURJVF9XUklURSIsCiAgICAgICJDQVBfQVVESVRfQ09OVFJPTCIsCiAgICAgICJDQVBfU0VURkNBUCIsCiAgICAgICJDQVBfTUFDX09WRVJSSURFIiwKICAgICAgIkNBUF9NQUNfQURNSU4iLAogICAgICAiQ0FQX1NZU0xPRyIsCiAgICAgICJDQVBfV0FLRV9BTEFSTSIsCiAgICAgICJDQVBfQkxPQ0tfU1VTUEVORCIsCiAgICAgICJDQVBfQVVESVRfUkVBRCIsCiAgICAgICJDQVBfUEVSRk1PTiIsCiAgICAgICJDQVBfQlBGIiwKICAgICAgIkNBUF9DSEVDS1BPSU5UX1JFU1RPUkUiCiAgICBdLAogICAgInZpcnRpb19ibGtfc3RvcmFnZV9jbGFzc2VzIjogWwogICAgICAiY2MtbG9jYWwtY3NpIiwKICAgICAgImNjLW1hbmFnZWQtY3NpIiwKICAgICAgImNjLW1hbmFnZWQtcHJlbWl1bS1jc2kiCiAgICBdLAogICAgInNtYl9zdG9yYWdlX2NsYXNzZXMiOiBbCiAgICAgIHsKICAgICAgICAibmFtZSI6ICJhenVyZWZpbGUtY3NpLWthdGEtY2MiLAogICAgICAgICJtb3VudF9vcHRpb25zIjogWwogICAgICAgICAgImRpcl9tb2RlPTA3NzciLAogICAgICAgICAgImZpbGVfbW9kZT0wNzc3IiwKICAgICAgICAgICJtZnN5bWxpbmtzIiwKICAgICAgICAgICJjYWNoZT1zdHJpY3QiLAogICAgICAgICAgIm5vc2hhcmVzb2NrIiwKICAgICAgICAgICJhY3RpbWVvPTMwIiwKICAgICAgICAgICJub2JybCIKICAgICAgICBdCiAgICAgIH0KICAgIF0KICB9LAogICJzYW5kYm94IjogewogICAgInN0b3JhZ2VzIjogWwogICAgICB7CiAgICAgICAgImRyaXZlciI6ICJlcGhlbWVyYWwiLAogICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICJzb3VyY2UiOiAic2htIiwKICAgICAgICAiZnN0eXBlIjogInRtcGZzIiwKICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAibm9kZXYiLAogICAgICAgICAgIm1vZGU9MTc3NyIsCiAgICAgICAgICAic2l6ZT02NzEwODg2NCIKICAgICAgICBdLAogICAgICAgICJtb3VudF9wb2ludCI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L3NobSIsCiAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICB9CiAgICBdCiAgfSwKICAicmVxdWVzdF9kZWZhdWx0cyI6IHsKICAgICJDcmVhdGVDb250YWluZXJSZXF1ZXN0IjogewogICAgICAiYWxsb3dfZW52X3JlZ2V4IjogWwogICAgICAgICJeSE9TVE5BTUU9JChkbnNfbGFiZWwpJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9QT1JUXyQoaXBfcClfVENQPXRjcDovLyQoaXB2NF9hKTokKGlwX3ApJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9QT1JUXyQoaXBfcClfVENQX1BST1RPPXRjcCQiLAogICAgICAgICJeJChzdmNfbmFtZSlfUE9SVF8kKGlwX3ApX1RDUF9QT1JUPSQoaXBfcCkkIiwKICAgICAgICAiXiQoc3ZjX25hbWUpX1BPUlRfJChpcF9wKV9UQ1BfQUREUj0kKGlwdjRfYSkkIiwKICAgICAgICAiXiQoc3ZjX25hbWUpX1NFUlZJQ0VfSE9TVD0kKGlwdjRfYSkkIiwKICAgICAgICAiXiQoc3ZjX25hbWUpX1NFUlZJQ0VfUE9SVD0kKGlwX3ApJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9TRVJWSUNFX1BPUlRfJChkbnNfbGFiZWwpPSQoaXBfcCkkIiwKICAgICAgICAiXiQoc3ZjX25hbWUpX1BPUlQ9dGNwOi8vJChpcHY0X2EpOiQoaXBfcCkkIiwKICAgICAgICAiXkFaVVJFX0NMSUVOVF9JRD1bQS1GYS1mMC05LV0qJCIsCiAgICAgICAgIl5BWlVSRV9URU5BTlRfSUQ9W0EtRmEtZjAtOS1dKiQiLAogICAgICAgICJeQVpVUkVfRkVERVJBVEVEX1RPS0VOX0ZJTEU9L3Zhci9ydW4vc2VjcmV0cy9henVyZS90b2tlbnMvYXp1cmUtaWRlbnRpdHktdG9rZW4kIiwKICAgICAgICAiXkFaVVJFX0FVVEhPUklUWV9IT1NUPWh0dHBzOi8vbG9naW5cXC5taWNyb3NvZnRvbmxpbmVcXC5jb20vJCIsCiAgICAgICAgIl5URVJNPXh0ZXJtJCIKICAgICAgXSwKICAgICAgImFsbG93X2Vudl9yZWdleF9tYXAiOiB7CiAgICAgICAgIkNQVV9MSU1JVCI6ICJeWzAtOV0rJCIsCiAgICAgICAgIkpPQl9DT01QTEVUSU9OX0lOREVYIjogIl5bMC05XSokIiwKICAgICAgICAiTUVNT1JZX0xJTUlUIjogIl5bMC05XSskIgogICAgICB9CiAgICB9LAogICAgIkNvcHlGaWxlUmVxdWVzdCI6IFsKICAgICAgIiQoc2ZwcmVmaXgpIgogICAgXSwKICAgICJFeGVjUHJvY2Vzc1JlcXVlc3QiOiB7CiAgICAgICJhbGxvd2VkX2NvbW1hbmRzIjogW10sCiAgICAgICJyZWdleCI6IFtdCiAgICB9LAogICAgIlVwZGF0ZVJvdXRlc1JlcXVlc3QiOiB7CiAgICAgICJmb3JiaWRkZW5fZGV2aWNlX25hbWVzIjogWwogICAgICAgICJsbyIKICAgICAgXSwKICAgICAgImZvcmJpZGRlbl9zb3VyY2VfcmVnZXgiOiBbCiAgICAgICAgIl4oPzowezAsNH06KXswLDd9MHswLDN9MSQiLAogICAgICAgICJeMTI3XFwuKD86WzAtOV17MSwzfVxcLil7Mn1bMC05XXsxLDN9JCIKICAgICAgXQogICAgfSwKICAgICJVcGRhdGVJbnRlcmZhY2VSZXF1ZXN0IjogewogICAgICAiYWxsb3dfcmF3X2ZsYWdzIjogMTI4LAogICAgICAiZm9yYmlkZGVuX25hbWVzIjogWwogICAgICAgICJsbyIKICAgICAgXSwKICAgICAgImZvcmJpZGRlbl9od19hZGRycyI6IFsKICAgICAgICAiMDA6MDA6MDA6MDA6MDA6MDAiCiAgICAgIF0KICAgIH0sCiAgICAiQ2xvc2VTdGRpblJlcXVlc3QiOiBmYWxzZSwKICAgICJSZWFkU3RyZWFtUmVxdWVzdCI6IGZhbHNlLAogICAgIlVwZGF0ZUVwaGVtZXJhbE1vdW50c1JlcXVlc3QiOiBmYWxzZSwKICAgICJXcml0ZVN0cmVhbVJlcXVlc3QiOiBmYWxzZQogIH0KfQ== + spec: + runtimeClassName: kata-cc + containers: + - name: mock-container + image: "registry.k8s.io/pause:3.9" +--- +apiVersion: v1 +kind: ReplicationController +metadata: + name: second-rc +spec: + replicas: 1 + selector: + app: mock + template: + metadata: + labels: + app: mock + annotations: + io.katacontainers.config.agent.policy: IyBDb3B5cmlnaHQgKGMpIDIwMjMgTWljcm9zb2Z0IENvcnBvcmF0aW9uCiMKIyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMAojCnBhY2thZ2UgYWdlbnRfcG9saWN5CgppbXBvcnQgZnV0dXJlLmtleXdvcmRzLmluCmltcG9ydCBmdXR1cmUua2V5d29yZHMuZXZlcnkKCiMgRGVmYXVsdCB2YWx1ZXMsIHJldHVybmVkIGJ5IE9QQSB3aGVuIHJ1bGVzIGNhbm5vdCBiZSBldmFsdWF0ZWQgdG8gdHJ1ZS4KZGVmYXVsdCBBZGRBUlBOZWlnaGJvcnNSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgQWRkU3dhcFJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBDbG9zZVN0ZGluUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IENvcHlGaWxlUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IENyZWF0ZUNvbnRhaW5lclJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBDcmVhdGVTYW5kYm94UmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IERlc3Ryb3lTYW5kYm94UmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgRXhlY1Byb2Nlc3NSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgR2V0T09NRXZlbnRSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBHdWVzdERldGFpbHNSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBMaXN0SW50ZXJmYWNlc1JlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBMaXN0Um91dGVzUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IE1lbUhvdHBsdWdCeVByb2JlUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IE9ubGluZUNQVU1lbVJlcXVlc3QgOj0gdHJ1ZQpkZWZhdWx0IFBhdXNlQ29udGFpbmVyUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFJlYWRTdHJlYW1SZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgUmVtb3ZlQ29udGFpbmVyUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgUmVtb3ZlU3RhbGVWaXJ0aW9mc1NoYXJlTW91bnRzUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgUmVzZWVkUmFuZG9tRGV2UmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFJlc3VtZUNvbnRhaW5lclJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBTZXRHdWVzdERhdGVUaW1lUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFNldFBvbGljeVJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBTaWduYWxQcm9jZXNzUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgU3RhcnRDb250YWluZXJSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBTdGFydFRyYWNpbmdSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgU3RhdHNDb250YWluZXJSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBTdG9wVHJhY2luZ1JlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBUdHlXaW5SZXNpemVSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBVcGRhdGVDb250YWluZXJSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgVXBkYXRlRXBoZW1lcmFsTW91bnRzUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFVwZGF0ZUludGVyZmFjZVJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBVcGRhdGVSb3V0ZXNSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgV2FpdFByb2Nlc3NSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBXcml0ZVN0cmVhbVJlcXVlc3QgOj0gZmFsc2UKCiMgQWxsb3dSZXF1ZXN0c0ZhaWxpbmdQb2xpY3kgOj0gdHJ1ZSBjb25maWd1cmVzIHRoZSBBZ2VudCB0byAqYWxsb3cgYW55CiMgcmVxdWVzdHMgY2F1c2luZyBhIHBvbGljeSBmYWlsdXJlKi4gVGhpcyBpcyBhbiB1bnNlY3VyZSBjb25maWd1cmF0aW9uCiMgYnV0IGlzIHVzZWZ1bCBmb3IgYWxsb3dpbmcgdW5zZWN1cmUgcG9kcyB0byBzdGFydCwgdGhlbiBjb25uZWN0IHRvCiMgdGhlbSBhbmQgaW5zcGVjdCBPUEEgbG9ncyBmb3IgdGhlIHJvb3QgY2F1c2Ugb2YgYSBmYWlsdXJlLgpkZWZhdWx0IEFsbG93UmVxdWVzdHNGYWlsaW5nUG9saWN5IDo9IGZhbHNlCgojIENvbnN0YW50cwpTX05BTUVfS0VZID0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZSIKU19OQU1FU1BBQ0VfS0VZID0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZXNwYWNlIgpCVU5ETEVfSUQgPSAiW2EtejAtOV17NjR9IgoKQ3JlYXRlQ29udGFpbmVyUmVxdWVzdDo9IHJlc3AgewogICAgbm90IGlzX251bGwoaW5wdXQuZW52X21hcCkKICAgIAogICAgaV9lbnZfbWFwIDo9IGlucHV0LmVudl9tYXAKICAgIAogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBwX2Vudl9tYXAgOj0gcF9jb250YWluZXIuZW52X21hcCAgCiAgICBhbGxvd19lbnZfbWFwKHBfZW52X21hcCwgaV9lbnZfbWFwKQogICAgCiAgICBpX3Byb2Nlc3MgOj0gaW5wdXQuYmFzZS5PQ0kuUHJvY2VzcwogICAgCiAgICBwX3Byb2Nlc3MgOj0gcF9jb250YWluZXIuT0NJLlByb2Nlc3MKICAgIAogICAgYWxsb3dfYXJncyhpX3Byb2Nlc3MsIHBfcHJvY2VzcywgaV9lbnZfbWFwKQoKICAgIHJlc3AgPSBDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uKGlucHV0LmJhc2UpCiAgICBwcmludCgiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdDogdHJ1ZSIpCn0KCmFsbG93X2FyZ3MoaV9wcm9jZXNzLCBwX3Byb2Nlc3MsIGlfZW52X21hcCkgewogICAgaV9hcmdzIDo9IGlfcHJvY2Vzcy5BcmdzCiAgICBwX2FyZ3MgOj0gcF9wcm9jZXNzLkFyZ3MKICAgIHByaW50KCJhbGxvd19hcmdzOiBpX2FyZ3MgPSIsIGlfYXJncywgInBfYXJncyA9IiwgcF9hcmdzKQogICAgY291bnQoaV9hcmdzKSA9PSBjb3VudChwX2FyZ3MpCiAgICBldmVyeSBpLCBpX2FyZyBpbiBpX2FyZ3MgewogICAgICAgIHByaW50KCJhbGxvd19hcmdzOiBpX2FyZyA9IiwgaV9hcmcpCiAgICAgICAgcF9hcmdfcmVwbGFjZWQgOj0gcmVwbGFjZV9lbnZfdmFyaWFibGVzKHBfYXJnc1tpXSwgaV9lbnZfbWFwKQogICAgICAgIHByaW50KCJhbGxvd19hcmdzOiBwX2FyZ19yZXBsYWNlZCA9IiwgcF9hcmdfcmVwbGFjZWQpCiAgICAgICAgcF9hcmdfcmVwbGFjZWQyIDo9IHJlcGxhY2UocF9hcmdfcmVwbGFjZWQsICIkJCIsICIkIikKICAgICAgICBwcmludCgiYWxsb3dfYXJnczogcF9hcmdfcmVwbGFjZWQyID0iLCBwX2FyZ19yZXBsYWNlZDIpCiAgICAgICAgaV9hcmcgPT0gcF9hcmdfcmVwbGFjZWQyCiAgICB9CiAgICBwcmludCgiYWxsb3dfYXJnczogdHJ1ZSIpCn0KCmFsbG93X2FyZ3MoaV9wcm9jZXNzLCBwX3Byb2Nlc3MsIGlfZW52X21hcCkgewogICAgbm90IGlfcHJvY2Vzcy5BcmdzCiAgICBub3QgcF9wcm9jZXNzLkFyZ3MKICAgIHByaW50KCJhbGxvd19hcmdzMjogbm8gYXJncyIpCn0KCiMgdGhpcyBmdW5jdGlvbiByZXBsYWNlcyBhbGwgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyBpbiBhIHN0cmluZywgZ2l2ZW4gYSBtYXAgb2YgZW52aXJvbm1lbnQga2V5cyB0byBlbnZpcm9ubWVudCB2YWx1ZXMKIyBlZyBzdHIgPSAiZWNobyAkKENMVVNURVJfSUQpOyBlY2hvICQoTk9ERV9OQU1FKTsiCiMgZW52X21hcCA9IHsiQ0xVU1RFUl9JRCI6ICJhYmMiLCAiTk9ERV9OQU1FIiA6ICJ4eXoifQojIHJlc3VsdCA9ICJlY2hvIGFiYzsgZWNobyB4eXo7IgpyZXBsYWNlX2Vudl92YXJpYWJsZXMoc3RyLCBlbnZfbWFwKSA9IHJlc3VsdCB7CiAgICAjIG1ha2UgYW4gYXJyYXkgb2YgdGhlIGtleXMgZWcgWyJDTFVTVEVSX0lEIiwgIk5PREVfTkFNRSJdCiAgICBrZXlzIDo9IFt4IHwgc29tZSB4IGluIG9iamVjdC5rZXlzKGVudl9tYXApXQogICAgcmVzdWx0IDo9IHJlcGxhY2Vfc3RyX3JlYyhzdHIsIGVudl9tYXAsIGtleXMsIGNvdW50KGtleXMpIC0gMSkKfQoKIyBiYXNlIGNhc2UKcmVwbGFjZV9zdHJfcmVjKHN0ciwgZW52X21hcCwgYXJyX2tleXMsIGkpID0gcmVzdWx0IHsKICAgIGkgPCAwCiAgICByZXN1bHQgOj0gc3RyCn0KCiMgcmVjdXJzaXZlIHN0ZXAKcmVwbGFjZV9zdHJfcmVjKHN0ciwgZW52X21hcCwgYXJyX2tleXMsIGkpID0gcmVzdWx0IHsKICAgIGkgPj0gMAogICAga2V5IDo9IGFycl9rZXlzW2ldCiAgICBlbnZfa2V5MSA6PSBjb25jYXQoIiIsIFsiJCgiLCBrZXksICIpIl0pCiAgICAjIHJlcGxhY2UgJChWQVIpIHdpdGggdmFsdWUKICAgIG5ld19zdHIxIDo9IHJlcGxhY2Uoc3RyLCBlbnZfa2V5MSwgZW52X21hcFtrZXldKQogICAgIyByZXBsYWNlIG5leHQgZW52aXJvbm1lbnQgdmFyaWFibGUKICAgIHJlc3VsdCA9IHJlcGxhY2Vfc3RyX3JlYyhuZXdfc3RyMSwgZW52X21hcCwgYXJyX2tleXMsIGkgLSAxKQp9CgphbGxvd19lbnZfbWFwKHBfZW52X21hcCwgaV9lbnZfbWFwKSB7CiAgICBwcmludCgiYWxsb3dfZW52X21hcDogcF9lbnZfbWFwID0iLCBwX2Vudl9tYXApCiAgICBldmVyeSBlbnZfa2V5LCBlbnZfdmFsIGluIGlfZW52X21hcCB7CiAgICAgICAgcHJpbnQoImFsbG93X2VudjogZW52X2tleSA9IiwgZW52X2tleSwgImVudl92YWwgPSIsIGVudl92YWwpCiAgICAgICAgYWxsb3dfZW52X21hcF9lbnRyeShlbnZfa2V5LCBlbnZfdmFsLCBwX2Vudl9tYXApCiAgICB9CiAgICBwcmludCgiYWxsb3dfZW52X21hcDogdHJ1ZSIpCn0KCiMgQWxsb3cgZXhhY3QgbWF0Y2gKYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBpX3ZhbCA9PSBwX3ZhbAogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnk6IHRydWUiKQp9CgojIEFsbG93IHJlc291cmNlRmllbGRSZWYgdmFsdWVzIChlLmcuLCAibGltaXRzLmNwdSIpLgphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgICMgYSB2YXJpYWJsZSB3ZSBzaG91bGQgYmUgdmFsaWRhdGluZyB1c2luZyBhIHJlZ2V4IGZyb20gc2V0dGluZ3MKICAgIHBfdmFsID09ICIkKHZhbGlkYXRlLWZyb20tc2V0dGluZ3MpIgogICAgcmVnZXhfdmFsIDo9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuQ3JlYXRlQ29udGFpbmVyUmVxdWVzdC5hbGxvd19lbnZfcmVnZXhfbWFwW2tleV0KICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4X3ZhbCwgaV92YWwpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSAyOiB0cnVlIikKfQoKIyBBbGxvdyBub2RlLW5hbWUKYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChub2RlLW5hbWUpIgogICAgcmVnZXgubWF0Y2gocG9saWN5X2RhdGEuY29tbW9uLmRuc19zdWJkb21haW4gLCBpX3ZhbCkKICAgIHByaW50KCJhbGxvd19lbnZfbWFwX2VudHJ5IDM6IHRydWUiKQp9CgojIEFsbG93IGhvc3QtbmFtZQphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgIHBfdmFsID09ICIkKGhvc3QtbmFtZSkiCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24uZG5zX2xhYmVsICwgaV92YWwpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSA0OiB0cnVlIikKfQoKIyBBbGxvdyBwb2QtdWlkCmFsbG93X2Vudl9tYXBfZW50cnkoa2V5LCBpX3ZhbCwgcF9lbnZfbWFwKSB7CiAgICBwX3ZhbCA6PSBwX2Vudl9tYXBba2V5XQogICAgcF92YWwgPT0gIiQocG9kLXVpZCkiCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24ucG9kX3VpZCAsIGlfdmFsKQogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgNTogdHJ1ZSIpCn0KCiMgQWxsb3cgZmllbGRSZWYgImZpZWxkUGF0aDogc3RhdHVzLnBvZElQIiB2YWx1ZXMuCmFsbG93X2Vudl9tYXBfZW50cnkoa2V5LCBpX3ZhbCwgcF9lbnZfbWFwKSB7CiAgICBpc19pcChpX3ZhbCkKCiAgICBwX3ZhbCA6PSBwX2Vudl9tYXBba2V5XQogICAgcF92YXIgOj0gY29uY2F0KCI9IiwgW2tleSwgcF92YWxdKQogICAgYWxsb3dfcG9kX2lwX3ZhcihrZXksIHBfdmFyKQogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgNjogdHJ1ZSIpCn0KCiMgQWxsb3cgZmllbGRSZWYgImZpZWxkUGF0aDogc3RhdHVzLmhvc3RJUCIgdmFsdWVzLgphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgaXNfaXAoaV92YWwpCgogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgIHBfdmFyIDo9IGNvbmNhdCgiPSIsIFtrZXksIHBfdmFsXSkKICAgIGFsbG93X2hvc3RfaXBfdmFyKGtleSwgcF92YXIpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSA3OiB0cnVlIikKfQoKIyBNYXRjaCBpbnB1dCB3aXRoIG9uZSBvZiB0aGUgcG9saWN5IHZhcmlhYmxlcywgYWZ0ZXIgc3Vic3RpdHV0aW5nICQoc2FuZGJveC1uYW1lKS4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChzYW5kYm94LW5hbWUpIgogICAgc19uYW1lIDo9IGlucHV0LmJhc2UuT0NJLkFubm90YXRpb25zW1NfTkFNRV9LRVldCiAgICBwX3ZhcjIgOj0gcmVwbGFjZShwX3ZhbCwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHBfdmFyMiA9PSBpX3ZhbAogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgODogdHJ1ZSIpCn0KCiMgTWF0Y2ggaW5wdXQgd2l0aCBvbmUgb2YgdGhlIHBvbGljeSB2YXJpYWJsZXMsIGFmdGVyIHN1YnN0aXR1dGluZyAkKHNhbmRib3gtbmFtZXNwYWNlKS4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChzYW5kYm94LW5hbWVzcGFjZSkiCiAgICBzX25hbWVzcGFjZSA6PSBpbnB1dC5iYXNlLk9DSS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwX3ZhcjIgOj0gcmVwbGFjZShwX3ZhbCwgIiQoc2FuZGJveC1uYW1lc3BhY2UpIiwgc19uYW1lc3BhY2UpCiAgICBwX3ZhcjIgPT0gaV92YWwKICAgIHByaW50KCJhbGxvd19lbnZfbWFwX2VudHJ5IDk6IHRydWUiKQp9CgojIEFsbG93IGlucHV0IGVudiB2YXJpYWJsZXMgdGhhdCBtYXRjaCB3aXRoIGEgcmVxdWVzdF9kZWZhdWx0cyByZWdleC4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHNvbWUgcF9yZWdleDEgaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5DcmVhdGVDb250YWluZXJSZXF1ZXN0LmFsbG93X2Vudl9yZWdleAogICAgcF9yZWdleDIgOj0gcmVwbGFjZShwX3JlZ2V4MSwgIiQoaXB2NF9hKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcHY0X2EpCiAgICBwX3JlZ2V4MyA6PSByZXBsYWNlKHBfcmVnZXgyLCAiJChpcF9wKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcF9wKQogICAgcF9yZWdleDQgOj0gcmVwbGFjZShwX3JlZ2V4MywgIiQoc3ZjX25hbWUpIiwgcG9saWN5X2RhdGEuY29tbW9uLnN2Y19uYW1lKQogICAgcF9yZWdleDUgOj0gcmVwbGFjZShwX3JlZ2V4NCwgIiQoZG5zX2xhYmVsKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5kbnNfbGFiZWwpCgogICAgcmVzdWx0IDo9IGNvbmNhdCgiPSIsIFtrZXksIGlfdmFsXSkKICAgIHJlZ2V4Lm1hdGNoKHBfcmVnZXg1LCByZXN1bHQpCgogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgMTA6IHRydWUiKQp9CgpDcmVhdGVDb250YWluZXJSZXF1ZXN0Oj0gcmVzcCB7CiAgICBub3QgaW5wdXQuZW52X21hcAogICAgaV9wcm9jZXNzID0gaW5wdXQuT0NJLlByb2Nlc3MKICAgIHNfbmFtZSA9IGlucHV0Lk9DSS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBwX3Byb2Nlc3MgPSBwX2NvbnRhaW5lci5PQ0kuUHJvY2VzcwogICAgYWxsb3dfZGVwcmVjYXRlZF9hcmdzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUpCiAgICByZXNwID0gQ3JlYXRlQ29udGFpbmVyUmVxdWVzdENvbW1vbihpbnB1dCkKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0MjogdHJ1ZSIpCn0KCkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb24ocmVxKTo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgICMgQ2hlY2sgaWYgdGhlIGlucHV0IHJlcXVlc3Qgc2hvdWxkIGJlIHJlamVjdGVkIGV2ZW4gYmVmb3JlIGNoZWNraW5nIHRoZQogICAgIyBwb2xpY3lfZGF0YS5jb250YWluZXJzIGluZm9ybWF0aW9uLgogICAgYWxsb3dfY3JlYXRlX2NvbnRhaW5lcl9pbnB1dChyZXEpCgogICAgaV9vY2kgOj0gcmVxLk9DSQogICAgaV9zdG9yYWdlcyA6PSByZXEuc3RvcmFnZXMKICAgIGlfZGV2aWNlcyA6PSByZXEuZGV2aWNlcwoKICAgICMgYXJyYXkgb2YgcG9zc2libGUgc3RhdGUgb3BlcmF0aW9ucwogICAgb3BzX2J1aWxkZXIgOj0gW10KCiAgICAjIGNoZWNrIHNhbmRib3ggbmFtZQogICAgc2FuZGJveF9uYW1lID0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FX0tFWV0KICAgIGFkZF9zYW5kYm94X25hbWVfdG9fc3RhdGUgOj0gc3RhdGVfYWxsb3dzKCJzYW5kYm94X25hbWUiLCBzYW5kYm94X25hbWUpCiAgICBvcHNfYnVpbGRlcjEgOj0gY29uY2F0X29wX2lmX25vdF9udWxsKG9wc19idWlsZGVyLCBhZGRfc2FuZGJveF9uYW1lX3RvX3N0YXRlKQoKICAgICMgQ2hlY2sgaWYgYW55IGVsZW1lbnQgZnJvbSB0aGUgcG9saWN5X2RhdGEuY29udGFpbmVycyBhcnJheSBhbGxvd3MgdGhlIGlucHV0IHJlcXVlc3QuCiAgICBzb21lIHBfY29udGFpbmVyIGluIHBvbGljeV9kYXRhLmNvbnRhaW5lcnMKICAgIHByaW50KCI9PT09PT09PSBDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiB0cnlpbmcgbmV4dCBwb2xpY3kgY29udGFpbmVyIikKCiAgICBwX3BpZG5zIDo9IHBfY29udGFpbmVyLnNhbmRib3hfcGlkbnMKICAgIGlfcGlkbnMgOj0gcmVxLnNhbmRib3hfcGlkbnMKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiBwX3BpZG5zID0iLCBwX3BpZG5zLCAiaV9waWRucyA9IiwgaV9waWRucykKICAgIHBfcGlkbnMgPT0gaV9waWRucwoKICAgIHBfb2NpIDo9IHBfY29udGFpbmVyLk9DSQoKICAgICMgY2hlY2sgbmFtZXNwYWNlCiAgICBwX25hbWVzcGFjZSA6PSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBpX25hbWVzcGFjZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwcmludCAoIkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb246IHBfbmFtZXNwYWNlID0iLCBwX25hbWVzcGFjZSwgImlfbmFtZXNwYWNlID0iLCBpX25hbWVzcGFjZSkKICAgIGFkZF9uYW1lc3BhY2VfdG9fc3RhdGUgOj0gYWxsb3dfbmFtZXNwYWNlKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkKICAgIG9wc19idWlsZGVyMiA6PSBjb25jYXRfb3BfaWZfbm90X251bGwob3BzX2J1aWxkZXIxLCBhZGRfbmFtZXNwYWNlX3RvX3N0YXRlKQoKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiBwIFZlcnNpb24gPSIsIHBfb2NpLlZlcnNpb24sICJpIFZlcnNpb24gPSIsIGlfb2NpLlZlcnNpb24pCiAgICBwX29jaS5WZXJzaW9uID09IGlfb2NpLlZlcnNpb24KCiAgICBwcmludCgiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdENvbW1vbjogcCBSZWFkb25seSA9IiwgcF9vY2kuUm9vdC5SZWFkb25seSwgImkgUmVhZG9ubHkgPSIsIGlfb2NpLlJvb3QuUmVhZG9ubHkpCiAgICBwX29jaS5Sb290LlJlYWRvbmx5ID09IGlfb2NpLlJvb3QuUmVhZG9ubHkKCiAgICBhbGxvd19hbm5vKHBfb2NpLCBpX29jaSkKCiAgICBwX3N0b3JhZ2VzIDo9IHBfY29udGFpbmVyLnN0b3JhZ2VzCiAgICBhbGxvd19ieV9hbm5vKHBfb2NpLCBpX29jaSwgcF9zdG9yYWdlcywgaV9zdG9yYWdlcykKCiAgICBwX2RldmljZXMgOj0gcF9jb250YWluZXIuZGV2aWNlcwogICAgYWxsb3dfZGV2aWNlcyhwX2RldmljZXMsIGlfZGV2aWNlcykKCiAgICByZXQgOj0gYWxsb3dfbGludXgob3BzX2J1aWxkZXIyLCBwX29jaSwgaV9vY2kpCiAgICByZXQuYWxsb3dlZAoKICAgIG9wcyA6PSByZXQub3BzCgogICAgcHJpbnQoIkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb246IHRydWUiKQp9CgphbGxvd19jcmVhdGVfY29udGFpbmVyX2lucHV0KHJlcSkgewogICAgcHJpbnQoImFsbG93X2NyZWF0ZV9jb250YWluZXJfaW5wdXQ6IGlucHV0ID0iLCByZXEpCgogICAgY291bnQocmVxLnNoYXJlZF9tb3VudHMpID09IDAKICAgIGlzX251bGwocmVxLnN0cmluZ191c2VyKQoKICAgIGlfb2NpIDo9IHJlcS5PQ0kKICAgIGlzX251bGwoaV9vY2kuSG9va3MpCiAgICBpc19udWxsKGlfb2NpLlNvbGFyaXMpCiAgICBpc19udWxsKGlfb2NpLldpbmRvd3MpCgogICAgaV9saW51eCA6PSBpX29jaS5MaW51eAogICAgY291bnQoaV9saW51eC5HSURNYXBwaW5ncykgPT0gMAogICAgY291bnQoaV9saW51eC5Nb3VudExhYmVsKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlJlc291cmNlcy5EZXZpY2VzKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlJvb3Rmc1Byb3BhZ2F0aW9uKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlVJRE1hcHBpbmdzKSA9PSAwCiAgICBpc19udWxsKGlfbGludXguSW50ZWxSZHQpCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLkJsb2NrSU8pCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLk5ldHdvcmspCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLlBpZHMpCiAgICBpc19udWxsKGlfbGludXguU2VjY29tcCkKCiAgICBpX3Byb2Nlc3MgOj0gaV9vY2kuUHJvY2VzcwogICAgY291bnQoaV9wcm9jZXNzLlNlbGludXhMYWJlbCkgPT0gMAogICAgY291bnQoaV9wcm9jZXNzLlVzZXIuVXNlcm5hbWUpID09IDAKCiAgICBwcmludCgiYWxsb3dfY3JlYXRlX2NvbnRhaW5lcl9pbnB1dDogdHJ1ZSIpCn0KCmFsbG93X25hbWVzcGFjZShwX25hbWVzcGFjZSwgaV9uYW1lc3BhY2UpID0gYWRkX25hbWVzcGFjZSB7CiAgICBwX25hbWVzcGFjZSA9PSBpX25hbWVzcGFjZQogICAgYWRkX25hbWVzcGFjZSA6PSBudWxsCiAgICBwcmludCgiYWxsb3dfbmFtZXNwYWNlIDE6IGlucHV0IG5hbWVzcGFjZSBtYXRjaGVzIHBvbGljeSBkYXRhIikKfQoKYWxsb3dfbmFtZXNwYWNlKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkgPSBhZGRfbmFtZXNwYWNlIHsKICAgIHBfbmFtZXNwYWNlID09ICIiCiAgICBwcmludCgiYWxsb3dfbmFtZXNwYWNlIDI6IG5vIG5hbWVzcGFjZSBmb3VuZCBvbiBwb2xpY3kgZGF0YSIpCiAgICBhZGRfbmFtZXNwYWNlIDo9IHN0YXRlX2FsbG93cygibmFtZXNwYWNlIiwgaV9uYW1lc3BhY2UpCn0KCiMgdmFsdWUgaGFzbid0IGJlZW4gc2VlbiBiZWZvcmUsIHNhdmUgaXQgdG8gc3RhdGUKc3RhdGVfYWxsb3dzKGtleSwgdmFsdWUpID0gYWN0aW9uIHsKICBzdGF0ZSA6PSBnZXRfc3RhdGUoKQogIHByaW50KCJzdGF0ZV9hbGxvd3MgMTogc3RhdGVba2V5XSA9Iiwgc3RhdGVba2V5XSwgInZhbHVlID0iLCB2YWx1ZSkKICBub3Qgc3RhdGVba2V5XQogIHByaW50KCJzdGF0ZV9hbGxvd3MgMTogc2F2aW5nIHRvIHN0YXRlIGtleSA9Iiwga2V5LCAidmFsdWUgPSIsIHZhbHVlKQogIHBhdGggOj0gZ2V0X3N0YXRlX3BhdGgoa2V5KSAKICBhY3Rpb24gOj0gewogICAgIm9wIjogImFkZCIsCiAgICAicGF0aCI6IHBhdGgsIAogICAgInZhbHVlIjogdmFsdWUsCiAgfQp9CgojIHZhbHVlIG1hdGNoZXMgd2hhdCdzIGluIHN0YXRlLCBhbGxvdyBpdApzdGF0ZV9hbGxvd3Moa2V5LCB2YWx1ZSkgPSBhY3Rpb24gewogIHByaW50KCJzdGF0ZV9hbGxvd3MgMjogc3RhcnQiKQogIHN0YXRlIDo9IGdldF9zdGF0ZSgpCiAgcHJpbnQoInN0YXRlX2FsbG93cyAyOiBzdGF0ZVtrZXldID0iLCBzdGF0ZVtrZXldLCAidmFsdWUgPSIsIHZhbHVlKQogIHZhbHVlID09IHN0YXRlW2tleV0KICBwcmludCgic3RhdGVfYWxsb3dzIDI6IGZvdW5kIGtleSA9Iiwga2V5LCAidmFsdWUgPSIsIHZhbHVlLCAiIGluIHN0YXRlIikKICBhY3Rpb24gOj0gbnVsbAp9CgojIGhlbHBlciBmdW5jdGlvbnMgdG8gaW50ZXJhY3Qgd2l0aCB0aGUgc3RhdGUKZ2V0X3N0YXRlKCkgPSBzdGF0ZSB7CiAgc3RhdGUgOj0gZGF0YVsicHN0YXRlIl0KfQoKZ2V0X3N0YXRlX3ZhbChrZXkpID0gdmFsdWUgewogICAgc3RhdGUgOj0gZ2V0X3N0YXRlKCkKICAgIHZhbHVlIDo9IHN0YXRlW2tleV0KfQoKZ2V0X3N0YXRlX3BhdGgoa2V5KSA9IHBhdGggewogICAgIyBwcmVwZW5kICIvcHN0YXRlLyIgdG8ga2V5CiAgICBwYXRoIDo9IGNvbmNhdCgiLyIsIFsiL3BzdGF0ZSIsIGtleV0pCn0KCiMgSGVscGVyIGZ1bmN0aW9ucyB0byBjb25kaXRpb25hbGx5IGNvbmNhdGVuYXRlIG9wIGlzIG5vdCBudWxsCmNvbmNhdF9vcF9pZl9ub3RfbnVsbChvcHMsIG9wKSA9IHJlc3VsdCB7CiAgICBvcCA9PSBudWxsCiAgICByZXN1bHQgOj0gb3BzCn0KCmNvbmNhdF9vcF9pZl9ub3RfbnVsbChvcHMsIG9wKSA9IHJlc3VsdCB7CiAgICBvcCAhPSBudWxsCiAgICByZXN1bHQgOj0gYXJyYXkuY29uY2F0KG9wcywgW29wXSkKfQoKIyBSZWplY3QgdW5leHBlY3RlZCBhbm5vdGF0aW9ucy4KYWxsb3dfYW5ubyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19hbm5vIDE6IHN0YXJ0IikKCiAgICBub3QgaV9vY2kuQW5ub3RhdGlvbnMKCiAgICBwcmludCgiYWxsb3dfYW5ubyAxOiB0cnVlIikKfQphbGxvd19hbm5vKHBfb2NpLCBpX29jaSkgewogICAgcHJpbnQoImFsbG93X2Fubm8gMjogcCBBbm5vdGF0aW9ucyA9IiwgcF9vY2kuQW5ub3RhdGlvbnMpCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiBpIEFubm90YXRpb25zID0iLCBpX29jaS5Bbm5vdGF0aW9ucykKCiAgICBpX2tleXMgOj0gb2JqZWN0LmtleXMoaV9vY2kuQW5ub3RhdGlvbnMpCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiBpIGtleXMgPSIsIGlfa2V5cykKCiAgICBldmVyeSBpX2tleSBpbiBpX2tleXMgewogICAgICAgIGFsbG93X2Fubm9fa2V5KGlfa2V5LCBwX29jaSkKICAgIH0KCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiB0cnVlIikKfQoKYWxsb3dfYW5ub19rZXkoaV9rZXksIHBfb2NpKSB7CiAgICBwcmludCgiYWxsb3dfYW5ub19rZXkgMTogaSBrZXkgPSIsIGlfa2V5KQoKICAgIHN0YXJ0c3dpdGgoaV9rZXksICJpby5rdWJlcm5ldGVzLmNyaS4iKQoKICAgIHByaW50KCJhbGxvd19hbm5vX2tleSAxOiB0cnVlIikKfQphbGxvd19hbm5vX2tleShpX2tleSwgcF9vY2kpIHsKICAgIHByaW50KCJhbGxvd19hbm5vX2tleSAyOiBpIGtleSA9IiwgaV9rZXkpCgogICAgc29tZSBwX2tleSwgXyBpbiBwX29jaS5Bbm5vdGF0aW9ucwogICAgcF9rZXkgPT0gaV9rZXkKCiAgICBwcmludCgiYWxsb3dfYW5ub19rZXkgMjogdHJ1ZSIpCn0KCiMgR2V0IHRoZSB2YWx1ZSBvZiB0aGUgU19OQU1FX0tFWSBhbm5vdGF0aW9uIGFuZAojIGNvcnJlbGF0ZSBpdCB3aXRoIG90aGVyIGFubm90YXRpb25zIGFuZCBwcm9jZXNzIGZpZWxkcy4KYWxsb3dfYnlfYW5ubyhwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpIHsKICAgIHByaW50KCJhbGxvd19ieV9hbm5vIDE6IHN0YXJ0IikKCiAgICBub3QgcF9vY2kuQW5ub3RhdGlvbnNbU19OQU1FX0tFWV0KCiAgICBpX3NfbmFtZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMTogaV9zX25hbWUgPSIsIGlfc19uYW1lKQoKICAgIGlfc19uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FU1BBQ0VfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMTogaV9zX25hbWVzcGFjZSA9IiwgaV9zX25hbWVzcGFjZSkKCiAgICBhbGxvd19ieV9zYW5kYm94X25hbWUocF9vY2ksIGlfb2NpLCBwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBpX3NfbmFtZSwgaV9zX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfYnlfYW5ubyAxOiB0cnVlIikKfQphbGxvd19ieV9hbm5vKHBfb2NpLCBpX29jaSwgcF9zdG9yYWdlcywgaV9zdG9yYWdlcykgewogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMjogc3RhcnQiKQoKICAgIHBfc19uYW1lIDo9IHBfb2NpLkFubm90YXRpb25zW1NfTkFNRV9LRVldCiAgICBpX3NfbmFtZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMjogaV9zX25hbWUgPSIsIGlfc19uYW1lLCAicF9zX25hbWUgPSIsIHBfc19uYW1lKQoKICAgIGFsbG93X3NhbmRib3hfbmFtZShwX3NfbmFtZSwgaV9zX25hbWUpCgogICAgaV9zX25hbWVzcGFjZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwcmludCgiYWxsb3dfYnlfYW5ubyAyOiBpX3NfbmFtZXNwYWNlID0iLCBpX3NfbmFtZXNwYWNlKQoKICAgIGFsbG93X2J5X3NhbmRib3hfbmFtZShwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMsIGlfc19uYW1lLCBpX3NfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd19ieV9hbm5vIDI6IHRydWUiKQp9CgphbGxvd19ieV9zYW5kYm94X25hbWUocF9vY2ksIGlfb2NpLCBwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfYnlfc2FuZGJveF9uYW1lOiBzdGFydCIpCgogICAgaV9uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FU1BBQ0VfS0VZXQoKICAgIGFsbG93X2J5X2NvbnRhaW5lcl90eXBlcyhwX29jaSwgaV9vY2ksIHNfbmFtZSwgaV9uYW1lc3BhY2UpCiAgICBhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZChwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpCiAgICBhbGxvd19wcm9jZXNzKHBfb2NpLlByb2Nlc3MsIGlfb2NpLlByb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpCgogICAgcHJpbnQoImFsbG93X2J5X3NhbmRib3hfbmFtZTogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfbmFtZShwX3NfbmFtZSwgaV9zX25hbWUpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X25hbWU6IHN0YXJ0IikKICAgIHJlZ2V4Lm1hdGNoKHBfc19uYW1lLCBpX3NfbmFtZSkKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9uYW1lOiB0cnVlIikKfQoKIyBDaGVjayB0aGF0IHRoZSAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLXR5cGUiIGFuZAojICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIiBhbm5vdGF0aW9ucyBkZXNpZ25hdGUgdGhlCiMgZXhwZWN0ZWQgdHlwZSAtIGVpdGhlciBhICJzYW5kYm94IiBvciBhICJjb250YWluZXIiLiBUaGVuLCB2YWxpZGF0ZQojIG90aGVyIGFubm90YXRpb25zIGJhc2VkIG9uIHRoZSBhY3R1YWwgInNhbmRib3giIG9yICJjb250YWluZXIiIHZhbHVlCiMgZnJvbSB0aGUgaW5wdXQgY29udGFpbmVyLgphbGxvd19ieV9jb250YWluZXJfdHlwZXMocF9vY2ksIGlfb2NpLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfYnlfY29udGFpbmVyX3R5cGVzOiBjaGVja2luZyBpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSIpCgogICAgY190eXBlIDo9ICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSIKICAgIAogICAgcF9jcmlfdHlwZSA6PSBwX29jaS5Bbm5vdGF0aW9uc1tjX3R5cGVdCiAgICBpX2NyaV90eXBlIDo9IGlfb2NpLkFubm90YXRpb25zW2NfdHlwZV0KICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZXM6IHBfY3JpX3R5cGUgPSIsIHBfY3JpX3R5cGUsICJpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgcF9jcmlfdHlwZSA9PSBpX2NyaV90eXBlCgogICAgYWxsb3dfYnlfY29udGFpbmVyX3R5cGUoaV9jcmlfdHlwZSwgcF9vY2ksIGlfb2NpLCBzX25hbWUsIHNfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZXM6IHRydWUiKQp9CgphbGxvd19ieV9jb250YWluZXJfdHlwZShpX2NyaV90eXBlLCBwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAxOiBpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgaV9jcmlfdHlwZSA9PSAic2FuZGJveCIKCiAgICBpX2thdGFfdHlwZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1siaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5jb250YWluZXJfdHlwZSJdCiAgICBwcmludCgiYWxsb3dfYnlfY29udGFpbmVyX3R5cGUgMTogaV9rYXRhX3R5cGUgPSIsIGlfa2F0YV90eXBlKQogICAgaV9rYXRhX3R5cGUgPT0gInBvZF9zYW5kYm94IgoKICAgIGFsbG93X3NhbmRib3hfY29udGFpbmVyX25hbWUocF9vY2ksIGlfb2NpKQogICAgYWxsb3dfc2FuZGJveF9uZXRfbmFtZXNwYWNlKHBfb2NpLCBpX29jaSkKICAgIGFsbG93X3NhbmRib3hfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpCgogICAgcHJpbnQoImFsbG93X2J5X2NvbnRhaW5lcl90eXBlIDE6IHRydWUiKQp9CgphbGxvd19ieV9jb250YWluZXJfdHlwZShpX2NyaV90eXBlLCBwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiBpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgaV9jcmlfdHlwZSA9PSAiY29udGFpbmVyIgoKICAgIGlfa2F0YV90eXBlIDo9IGlfb2NpLkFubm90YXRpb25zWyJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIl0KICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiBpX2thdGFfdHlwZSA9IiwgaV9rYXRhX3R5cGUpCiAgICBpX2thdGFfdHlwZSA9PSAicG9kX2NvbnRhaW5lciIKCiAgICBhbGxvd19jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpCiAgICBhbGxvd19uZXRfbmFtZXNwYWNlKHBfb2NpLCBpX29jaSkKICAgIGFsbG93X2xvZ19kaXJlY3RvcnkocF9vY2ksIGlfb2NpKQoKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiB0cnVlIikKfQoKIyAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLW5hbWUiIGFubm90YXRpb24KYWxsb3dfc2FuZGJveF9jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X2NvbnRhaW5lcl9uYW1lOiBzdGFydCIpCgogICAgY29udGFpbmVyX2Fubm90YXRpb25fbWlzc2luZyhwX29jaSwgaV9vY2ksICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItbmFtZSIpCgogICAgcHJpbnQoImFsbG93X3NhbmRib3hfY29udGFpbmVyX25hbWU6IHRydWUiKQp9CgphbGxvd19jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19jb250YWluZXJfbmFtZTogc3RhcnQiKQoKICAgIGFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uKHBfb2NpLCBpX29jaSwgImlvLmt1YmVybmV0ZXMuY3JpLmNvbnRhaW5lci1uYW1lIikKCiAgICBwcmludCgiYWxsb3dfY29udGFpbmVyX25hbWU6IHRydWUiKQp9Cgpjb250YWluZXJfYW5ub3RhdGlvbl9taXNzaW5nKHBfb2NpLCBpX29jaSwga2V5KSB7CiAgICBwcmludCgiY29udGFpbmVyX2Fubm90YXRpb25fbWlzc2luZzoiLCBrZXkpCgogICAgbm90IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIG5vdCBpX29jaS5Bbm5vdGF0aW9uc1trZXldCgogICAgcHJpbnQoImNvbnRhaW5lcl9hbm5vdGF0aW9uX21pc3Npbmc6IHRydWUiKQp9CgphbGxvd19jb250YWluZXJfYW5ub3RhdGlvbihwX29jaSwgaV9vY2ksIGtleSkgewogICAgcHJpbnQoImFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uOiBrZXkgPSIsIGtleSkKCiAgICBwX3ZhbHVlIDo9IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIGlfdmFsdWUgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgcHJpbnQoImFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uOiBwX3ZhbHVlID0iLCBwX3ZhbHVlLCAiaV92YWx1ZSA9IiwgaV92YWx1ZSkKCiAgICBwX3ZhbHVlID09IGlfdmFsdWUKCiAgICBwcmludCgiYWxsb3dfY29udGFpbmVyX2Fubm90YXRpb246IHRydWUiKQp9CgojICJuZXJkY3RsL25ldHdvcmstbmFtZXNwYWNlIiBhbm5vdGF0aW9uCmFsbG93X3NhbmRib3hfbmV0X25hbWVzcGFjZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X25ldF9uYW1lc3BhY2U6IHN0YXJ0IikKCiAgICBrZXkgOj0gIm5lcmRjdGwvbmV0d29yay1uYW1lc3BhY2UiCgogICAgcF9uYW1lc3BhY2UgOj0gcF9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgaV9uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgcHJpbnQoImFsbG93X3NhbmRib3hfbmV0X25hbWVzcGFjZTogcF9uYW1lc3BhY2UgPSIsIHBfbmFtZXNwYWNlLCAiaV9uYW1lc3BhY2UgPSIsIGlfbmFtZXNwYWNlKQoKICAgIHJlZ2V4Lm1hdGNoKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9uZXRfbmFtZXNwYWNlOiB0cnVlIikKfQoKYWxsb3dfbmV0X25hbWVzcGFjZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19uZXRfbmFtZXNwYWNlOiBzdGFydCIpCgogICAga2V5IDo9ICJuZXJkY3RsL25ldHdvcmstbmFtZXNwYWNlIgoKICAgIG5vdCBwX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICBub3QgaV9vY2kuQW5ub3RhdGlvbnNba2V5XQoKICAgIHByaW50KCJhbGxvd19uZXRfbmFtZXNwYWNlOiB0cnVlIikKfQoKIyAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1sb2ctZGlyZWN0b3J5IiBhbm5vdGF0aW9uCmFsbG93X3NhbmRib3hfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X2xvZ19kaXJlY3Rvcnk6IHN0YXJ0IikKCiAgICBrZXkgOj0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbG9nLWRpcmVjdG9yeSIKCiAgICBwX2RpciA6PSBwX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICByZWdleDEgOj0gcmVwbGFjZShwX2RpciwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHJlZ2V4MiA6PSByZXBsYWNlKHJlZ2V4MSwgIiQoc2FuZGJveC1uYW1lc3BhY2UpIiwgc19uYW1lc3BhY2UpCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiByZWdleDIgPSIsIHJlZ2V4MikKCiAgICBpX2RpciA6PSBpX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiBpX2RpciA9IiwgaV9kaXIpCgogICAgcmVnZXgubWF0Y2gocmVnZXgyLCBpX2RpcikKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiB0cnVlIikKfQoKYWxsb3dfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19sb2dfZGlyZWN0b3J5OiBzdGFydCIpCgogICAga2V5IDo9ICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWxvZy1kaXJlY3RvcnkiCgogICAgbm90IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIG5vdCBpX29jaS5Bbm5vdGF0aW9uc1trZXldCgogICAgcHJpbnQoImFsbG93X2xvZ19kaXJlY3Rvcnk6IHRydWUiKQp9CgphbGxvd19kZXZpY2VzKHBfZGV2aWNlcywgaV9kZXZpY2VzKSB7CiAgICBwcmludCgiYWxsb3dfZGV2aWNlczogc3RhcnQiKQogICAgZXZlcnkgaV9kZXZpY2UgaW4gaV9kZXZpY2VzIHsKICAgICAgICBwcmludCgiYWxsb3dfZGV2aWNlczogaV9kZXZpY2UgPSIsIGlfZGV2aWNlKQogICAgICAgIHNvbWUgcF9kZXZpY2UgaW4gcF9kZXZpY2VzCiAgICAgICAgcF9kZXZpY2UuY29udGFpbmVyX3BhdGggPT0gaV9kZXZpY2UuY29udGFpbmVyX3BhdGgKICAgIH0KICAgIHByaW50KCJhbGxvd19kZXZpY2VzOiB0cnVlIikKfQoKYWxsb3dfbGludXgoc3RhdGVfb3BzLCBwX29jaSwgaV9vY2kpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIHBfbmFtZXNwYWNlcyA6PSBwX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbGludXg6IHAgbmFtZXNwYWNlcyA9IiwgcF9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlcyA6PSBpX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbGludXg6IGkgbmFtZXNwYWNlcyA9IiwgaV9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlX3dpdGhvdXRfbmV0d29yayA6PSBbb2JqIHwgb2JqIDo9IGlfbmFtZXNwYWNlc1tfXTsgb2JqLlR5cGUgIT0gIm5ldHdvcmsiXQoKICAgIHByaW50KCJhbGxvd19saW51eDogaV9uYW1lc3BhY2Vfd2l0aG91dF9uZXR3b3JrID0iLCBpX25hbWVzcGFjZV93aXRob3V0X25ldHdvcmspCgogICAgcF9uYW1lc3BhY2VzID09IGlfbmFtZXNwYWNlX3dpdGhvdXRfbmV0d29yawoKICAgIGFsbG93X21hc2tlZF9wYXRocyhwX29jaSwgaV9vY2kpCiAgICBhbGxvd19yZWFkb25seV9wYXRocyhwX29jaSwgaV9vY2kpCiAgICBhbGxvd19saW51eF9kZXZpY2VzKHBfb2NpLkxpbnV4LkRldmljZXMsIGlfb2NpLkxpbnV4LkRldmljZXMpCiAgICBhbGxvd19saW51eF9zeXNjdGwocF9vY2kuTGludXgsIGlfb2NpLkxpbnV4KQogICAgcmV0IDo9IGFsbG93X25ldHdvcmtfbmFtZXNwYWNlX3N0YXJ0KHN0YXRlX29wcywgcF9vY2ksIGlfb2NpKQogICAgcmV0LmFsbG93ZWQKCiAgICBvcHMgOj0gcmV0Lm9wcwoKICAgIHByaW50KCJhbGxvd19saW51eDogdHJ1ZSIpCn0KCiMgUmV0cmlldmUgdGhlICJuZXR3b3JrIiBuYW1lc3BhY2UgZnJvbSB0aGUgaW5wdXQgZGF0YSBhbmQgcGFzcyBpdCBvbiBmb3IgdGhlCiMgbmV0d29yayBuYW1lc3BhY2UgcG9saWN5IGNoZWNrcy4KYWxsb3dfbmV0d29ya19uYW1lc3BhY2Vfc3RhcnQoc3RhdGVfb3BzLCBwX29jaSwgaV9vY2kpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIHByaW50KCJhbGxvd19uZXR3b3JrX25hbWVzcGFjZSBzdGFydDogc3RhcnQiKQoKICAgIHBfbmFtZXNwYWNlcyA6PSBwX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IHAgbmFtZXNwYWNlcyA9IiwgcF9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlcyA6PSBpX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IGkgbmFtZXNwYWNlcyA9IiwgaV9uYW1lc3BhY2VzKQoKICAgICMgUmV0dXJuIHBhdGggb2YgdGhlICJuZXR3b3JrIiBuYW1lc3BhY2UKICAgIG5ldHdvcmtfbnMgOj0gW29iaiB8IG9iaiA6PSBpX25hbWVzcGFjZXNbX107IG9iai5UeXBlID09ICJuZXR3b3JrIl0KCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IG5ldHdvcmtfbnMgPSIsIG5ldHdvcmtfbnMpCgogICAgcmV0IDo9IGFsbG93X25ldHdvcmtfbmFtZXNwYWNlKHN0YXRlX29wcywgbmV0d29ya19ucykKICAgIHJldC5hbGxvd2VkCgogICAgb3BzIDo9IHJldC5vcHMKfQoKIyBUaGlzIHJ1bGUgaXMgd2hlbiB0aGVyZSdzIG5vIG5ldHdvcmsgbmFtZXNwYWNlIGluIHRoZSBpbnB1dCBkYXRhLgphbGxvd19uZXR3b3JrX25hbWVzcGFjZShzdGF0ZV9vcHMsIG5ldHdvcmtfbnMpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIGNvdW50KG5ldHdvcmtfbnMpID09IDAKCiAgICBuZXR3b3JrX25zX3BhdGggPSAiIgoKICAgIGFkZF9uZXR3b3JrX25hbWVzcGFjZV90b19zdGF0ZSA6PSBzdGF0ZV9hbGxvd3MoIm5ldHdvcmtfbmFtZXNwYWNlIiwgbmV0d29ya19uc19wYXRoKQogICAgb3BzIDo9IGNvbmNhdF9vcF9pZl9ub3RfbnVsbChzdGF0ZV9vcHMsIGFkZF9uZXR3b3JrX25hbWVzcGFjZV90b19zdGF0ZSkKCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2UgMTogdHJ1ZSIpCn0KCiMgVGhpcyBydWxlIGlzIHdoZW4gdGhlcmUncyBleGFjdGx5IG9uZSBuZXR3b3JrIG5hbWVzcGFjZSBpbiB0aGUgaW5wdXQgZGF0YS4KYWxsb3dfbmV0d29ya19uYW1lc3BhY2Uoc3RhdGVfb3BzLCBuZXR3b3JrX25zKSA6PSB7Im9wcyI6IG9wcywgImFsbG93ZWQiOiB0cnVlfSB7CiAgICBjb3VudChuZXR3b3JrX25zKSA9PSAxCgogICAgYWRkX25ldHdvcmtfbmFtZXNwYWNlX3RvX3N0YXRlIDo9IHN0YXRlX2FsbG93cygibmV0d29ya19uYW1lc3BhY2UiLCBuZXR3b3JrX25zWzBdLlBhdGgpCiAgICBvcHMgOj0gY29uY2F0X29wX2lmX25vdF9udWxsKHN0YXRlX29wcywgYWRkX25ldHdvcmtfbmFtZXNwYWNlX3RvX3N0YXRlKQoKICAgIHByaW50KCJhbGxvd19uZXR3b3JrX25hbWVzcGFjZSAyOiB0cnVlIikKfQoKYWxsb3dfbWFza2VkX3BhdGhzKHBfb2NpLCBpX29jaSkgewogICAgcF9wYXRocyA6PSBwX29jaS5MaW51eC5NYXNrZWRQYXRocwogICAgcHJpbnQoImFsbG93X21hc2tlZF9wYXRocyAxOiBwX3BhdGhzID0iLCBwX3BhdGhzKQoKICAgIGlfcGF0aHMgOj0gaV9vY2kuTGludXguTWFza2VkUGF0aHMKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aHMgMTogaV9wYXRocyA9IiwgaV9wYXRocykKCiAgICBhbGxvd19tYXNrZWRfcGF0aHNfYXJyYXkocF9wYXRocywgaV9wYXRocykKCiAgICBwcmludCgiYWxsb3dfbWFza2VkX3BhdGhzIDE6IHRydWUiKQp9CmFsbG93X21hc2tlZF9wYXRocyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aHMgMjogc3RhcnQiKQoKICAgIG5vdCBwX29jaS5MaW51eC5NYXNrZWRQYXRocwogICAgbm90IGlfb2NpLkxpbnV4Lk1hc2tlZFBhdGhzCgogICAgcHJpbnQoImFsbG93X21hc2tlZF9wYXRocyAyOiB0cnVlIikKfQoKIyBBbGwgdGhlIHBvbGljeSBtYXNrZWQgcGF0aHMgbXVzdCBiZSBtYXNrZWQgaW4gdGhlIGlucHV0IGRhdGEgdG9vLgojIElucHV0IGlzIGFsbG93ZWQgdG8gaGF2ZSBtb3JlIG1hc2tlZCBwYXRocyB0aGFuIHRoZSBwb2xpY3kuCmFsbG93X21hc2tlZF9wYXRoc19hcnJheShwX2FycmF5LCBpX2FycmF5KSB7CiAgICBldmVyeSBwX2VsZW0gaW4gcF9hcnJheSB7CiAgICAgICAgYWxsb3dfbWFza2VkX3BhdGgocF9lbGVtLCBpX2FycmF5KQogICAgfQp9CgphbGxvd19tYXNrZWRfcGF0aChwX2VsZW0sIGlfYXJyYXkpIHsKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aDogcF9lbGVtID0iLCBwX2VsZW0pCgogICAgc29tZSBpX2VsZW0gaW4gaV9hcnJheQogICAgcF9lbGVtID09IGlfZWxlbQoKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aDogdHJ1ZSIpCn0KCmFsbG93X3JlYWRvbmx5X3BhdGhzKHBfb2NpLCBpX29jaSkgewogICAgcF9wYXRocyA6PSBwX29jaS5MaW51eC5SZWFkb25seVBhdGhzCiAgICBwcmludCgiYWxsb3dfcmVhZG9ubHlfcGF0aHMgMTogcF9wYXRocyA9IiwgcF9wYXRocykKCiAgICBpX3BhdGhzIDo9IGlfb2NpLkxpbnV4LlJlYWRvbmx5UGF0aHMKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAxOiBpX3BhdGhzID0iLCBpX3BhdGhzKQoKICAgIGFsbG93X3JlYWRvbmx5X3BhdGhzX2FycmF5KHBfcGF0aHMsIGlfcGF0aHMsIGlfb2NpLkxpbnV4Lk1hc2tlZFBhdGhzKQoKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAxOiB0cnVlIikKfQphbGxvd19yZWFkb25seV9wYXRocyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAyOiBzdGFydCIpCgogICAgbm90IHBfb2NpLkxpbnV4LlJlYWRvbmx5UGF0aHMKICAgIG5vdCBpX29jaS5MaW51eC5SZWFkb25seVBhdGhzCgogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGhzIDI6IHRydWUiKQp9CgojIEFsbCB0aGUgcG9saWN5IHJlYWRvbmx5IHBhdGhzIG11c3QgYmUgZWl0aGVyOgojIC0gUHJlc2VudCBpbiB0aGUgaW5wdXQgcmVhZG9ubHkgcGF0aHMsIG9yCiMgLSBQcmVzZW50IGluIHRoZSBpbnB1dCBtYXNrZWQgcGF0aHMuCiMgSW5wdXQgaXMgYWxsb3dlZCB0byBoYXZlIG1vcmUgcmVhZG9ubHkgcGF0aHMgdGhhbiB0aGUgcG9saWN5LgphbGxvd19yZWFkb25seV9wYXRoc19hcnJheShwX2FycmF5LCBpX2FycmF5LCBtYXNrZWRfcGF0aHMpIHsKICAgIGV2ZXJ5IHBfZWxlbSBpbiBwX2FycmF5IHsKICAgICAgICBhbGxvd19yZWFkb25seV9wYXRoKHBfZWxlbSwgaV9hcnJheSwgbWFza2VkX3BhdGhzKQogICAgfQp9CgphbGxvd19yZWFkb25seV9wYXRoKHBfZWxlbSwgaV9hcnJheSwgbWFza2VkX3BhdGhzKSB7CiAgICBwcmludCgiYWxsb3dfcmVhZG9ubHlfcGF0aCAxOiBwX2VsZW0gPSIsIHBfZWxlbSkKCiAgICBzb21lIGlfZWxlbSBpbiBpX2FycmF5CiAgICBwX2VsZW0gPT0gaV9lbGVtCgogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGggMTogdHJ1ZSIpCn0KYWxsb3dfcmVhZG9ubHlfcGF0aChwX2VsZW0sIGlfYXJyYXksIG1hc2tlZF9wYXRocykgewogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGggMjogcF9lbGVtID0iLCBwX2VsZW0pCgogICAgc29tZSBpX21hc2tlZCBpbiBtYXNrZWRfcGF0aHMKICAgIHBfZWxlbSA9PSBpX21hc2tlZAoKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRoIDI6IHRydWUiKQp9CgphbGxvd19saW51eF9kZXZpY2VzKHBfZGV2aWNlcywgaV9kZXZpY2VzKSB7CiAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogc3RhcnQiKQogICAgZXZlcnkgaV9kZXZpY2UgaW4gaV9kZXZpY2VzIHsKICAgICAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogaV9kZXZpY2UgPSIsIGlfZGV2aWNlKQogICAgICAgIHNvbWUgcF9kZXZpY2UgaW4gcF9kZXZpY2VzCiAgICAgICAgaV9kZXZpY2UuUGF0aCA9PSBwX2RldmljZS5QYXRoCiAgICB9CiAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogdHJ1ZSIpCn0KCmFsbG93X2xpbnV4X3N5c2N0bChwX2xpbnV4LCBpX2xpbnV4KSB7CiAgICBwcmludCgiYWxsb3dfbGludXhfc3lzY3RsIDE6IHN0YXJ0IikKICAgIG5vdCBpX2xpbnV4LlN5c2N0bAogICAgcHJpbnQoImFsbG93X2xpbnV4X3N5c2N0bCAxOiB0cnVlIikKfQoKYWxsb3dfbGludXhfc3lzY3RsKHBfbGludXgsIGlfbGludXgpIHsKICAgIHByaW50KCJhbGxvd19saW51eF9zeXNjdGwgMjogc3RhcnQiKQogICAgcF9zeXNjdGwgOj0gcF9saW51eC5TeXNjdGwKICAgIGlfc3lzY3RsIDo9IGlfbGludXguU3lzY3RsCiAgICBldmVyeSBpX25hbWUsIGlfdmFsIGluIGlfc3lzY3RsIHsKICAgICAgICBwcmludCgiYWxsb3dfbGludXhfc3lzY3RsIDI6IGlfbmFtZSA9IiwgaV9uYW1lLCAiaV92YWwgPSIsIGlfdmFsKQogICAgICAgIHBfc3lzY3RsW2lfbmFtZV0gPT0gaV92YWwKICAgIH0KICAgIHByaW50KCJhbGxvd19saW51eF9zeXNjdGwgMjogdHJ1ZSIpCn0KCiMgQ2hlY2sgdGhlIGNvbnNpc3RlbmN5IG9mIHRoZSBpbnB1dCAiaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5idW5kbGVfcGF0aCIKIyBhbmQgaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCIgdmFsdWVzIHdpdGggb3RoZXIgZmllbGRzLgphbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZChwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpIHsKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogc3RhcnQiKQoKICAgIGJ1bmRsZV9wYXRoIDo9IGlfb2NpLkFubm90YXRpb25zWyJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmJ1bmRsZV9wYXRoIl0KICAgIGJ1bmRsZV9pZCA6PSByZXBsYWNlKGJ1bmRsZV9wYXRoLCAiL3J1bi9jb250YWluZXJkL2lvLmNvbnRhaW5lcmQucnVudGltZS52Mi50YXNrL2s4cy5pby8iLCAiIikKCiAgICBidW5kbGVfaWRfZm9ybWF0IDo9IGNvbmNhdCgiIiwgWyJeIiwgQlVORExFX0lELCAiJCJdKQogICAgcmVnZXgubWF0Y2goYnVuZGxlX2lkX2Zvcm1hdCwgYnVuZGxlX2lkKQoKICAgIGtleSA6PSAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCIKCiAgICBwX3JlZ2V4IDo9IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIHNhbmRib3hfaWQgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQoKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogc2FuZGJveF9pZCA9Iiwgc2FuZGJveF9pZCwgInJlZ2V4ID0iLCBwX3JlZ2V4KQogICAgcmVnZXgubWF0Y2gocF9yZWdleCwgc2FuZGJveF9pZCkKCiAgICBhbGxvd19yb290X3BhdGgocF9vY2ksIGlfb2NpLCBidW5kbGVfaWQpCgogICAgZXZlcnkgaV9tb3VudCBpbiBpX29jaS5Nb3VudHMgewogICAgICAgIGFsbG93X21vdW50KHBfb2NpLCBpX21vdW50LCBpX3N0b3JhZ2VzLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpCiAgICB9CgogICAgYWxsb3dfc3RvcmFnZXMocF9zdG9yYWdlcywgaV9zdG9yYWdlcywgYnVuZGxlX2lkLCBzYW5kYm94X2lkKQoKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogdHJ1ZSIpCn0KCmFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHBfcHJvY2VzcyA9IiwgcF9wcm9jZXNzKQogICAgcHJpbnQoImFsbG93X3Byb2Nlc3NfY29tbW9uOiBpX3Byb2Nlc3MgPSAiLCBpX3Byb2Nlc3MpCiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHNfbmFtZSA9Iiwgc19uYW1lKQoKICAgIHBfcHJvY2Vzcy5Dd2QgPT0gaV9wcm9jZXNzLkN3ZAogICAgcF9wcm9jZXNzLk5vTmV3UHJpdmlsZWdlcyA9PSBpX3Byb2Nlc3MuTm9OZXdQcml2aWxlZ2VzCgogICAgYWxsb3dfdXNlcihwX3Byb2Nlc3MsIGlfcHJvY2VzcykKICAgIGFsbG93X2VudihwX3Byb2Nlc3MsIGlfcHJvY2Vzcywgc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHRydWUiKQp9CgojIENvbXBhcmUgdGhlIE9DSSBQcm9jZXNzIGZpZWxkIG9mIGEgcG9saWN5IGNvbnRhaW5lciB3aXRoIHRoZSBpbnB1dCBPQ0kgUHJvY2VzcyBmcm9tIGEgQ3JlYXRlQ29udGFpbmVyUmVxdWVzdAphbGxvd19wcm9jZXNzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfcHJvY2Vzczogc3RhcnQiKQoKICAgIGFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgYWxsb3dfY2FwcyhwX3Byb2Nlc3MuQ2FwYWJpbGl0aWVzLCBpX3Byb2Nlc3MuQ2FwYWJpbGl0aWVzKQogICAgcF9wcm9jZXNzLlRlcm1pbmFsID09IGlfcHJvY2Vzcy5UZXJtaW5hbAoKICAgIHByaW50KCJhbGxvd19wcm9jZXNzOiB0cnVlIikKfQoKIyBDb21wYXJlIHRoZSBPQ0kgUHJvY2VzcyBmaWVsZCBvZiBhIHBvbGljeSBjb250YWluZXIgd2l0aCB0aGUgaW5wdXQgcHJvY2VzcyBmaWVsZCBmcm9tIEV4ZWNQcm9jZXNzUmVxdWVzdAphbGxvd19pbnRlcmFjdGl2ZV9wcm9jZXNzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfaW50ZXJhY3RpdmVfcHJvY2Vzczogc3RhcnQiKQoKICAgIGFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgYWxsb3dfZXhlY19jYXBzKGlfcHJvY2Vzcy5DYXBhYmlsaXRpZXMpCgogICAgIyBUaGVzZSBhcmUgY29tbWFuZHMgZW5hYmxlZCB1c2luZyBFeGVjUHJvY2Vzc1JlcXVlc3QgY29tbWFuZHMgYW5kL29yIHJlZ2V4IGZyb20gdGhlIHNldHRpbmdzIGZpbGUuCiAgICAjIFRoZXkgY2FuIGJlIGV4ZWN1dGVkIGludGVyYWN0aXZlbHkgc28gYWxsb3cgdGhlbSB0byB1c2UgYW55IHZhbHVlIGZvciBpX3Byb2Nlc3MuVGVybWluYWwuCgogICAgcHJpbnQoImFsbG93X2ludGVyYWN0aXZlX3Byb2Nlc3M6IHRydWUiKQp9CgojIENvbXBhcmUgdGhlIE9DSSBQcm9jZXNzIGZpZWxkIG9mIGEgcG9saWN5IGNvbnRhaW5lciB3aXRoIHRoZSBpbnB1dCBwcm9jZXNzIGZpZWxkIGZyb20gRXhlY1Byb2Nlc3NSZXF1ZXN0CmFsbG93X3Byb2JlX3Byb2Nlc3MocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19wcm9iZV9wcm9jZXNzOiBzdGFydCIpCgogICAgYWxsb3dfcHJvY2Vzc19jb21tb24ocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpCiAgICBhbGxvd19leGVjX2NhcHMoaV9wcm9jZXNzLkNhcGFiaWxpdGllcykKICAgIHBfcHJvY2Vzcy5UZXJtaW5hbCA9PSBpX3Byb2Nlc3MuVGVybWluYWwKCiAgICBwcmludCgiYWxsb3dfcHJvYmVfcHJvY2VzczogdHJ1ZSIpCn0KCmFsbG93X3VzZXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MpIHsKICAgIHBfdXNlciA6PSBwX3Byb2Nlc3MuVXNlcgogICAgaV91c2VyIDo9IGlfcHJvY2Vzcy5Vc2VyCgogICAgcHJpbnQoImFsbG93X3VzZXI6IGlucHV0IHVpZCA9IiwgaV91c2VyLlVJRCwgInBvbGljeSB1aWQgPSIsIHBfdXNlci5VSUQpCiAgICBwX3VzZXIuVUlEID09IGlfdXNlci5VSUQKCiAgICAjIFRPRE86IHRyYWNrIGRvd24gdGhlIHJlYXNvbiBmb3IgcmVnaXN0cnkuazhzLmlvL3BhdXNlOjMuOSBiZWluZwogICAgIyAgICAgICBleGVjdXRlZCB3aXRoIGdpZCA9IDAgZGVzcGl0ZSBoYXZpbmcgIjY1NTM1OjY1NTM1IiBpbiBpdHMgY29udGFpbmVyIGltYWdlCiAgICAjICAgICAgIGNvbmZpZy4KICAgICNwcmludCgiYWxsb3dfdXNlcjogaW5wdXQgZ2lkID0iLCBpX3VzZXIuR0lELCAicG9saWN5IGdpZCA9IiwgcF91c2VyLkdJRCkKICAgICNwX3VzZXIuR0lEID09IGlfdXNlci5HSUQKCiAgICAjIFRPRE86IGNvbXBhcmUgdGhlIGFkZGl0aW9uYWxHaWRzIGZpZWxkIHRvbyBhZnRlciBjb21wdXRpbmcgaXRzIHZhbHVlCiAgICAjIGJhc2VkIG9uIC9ldGMvcGFzc3dkIGFuZCAvZXRjL2dyb3VwIGZyb20gdGhlIGNvbnRhaW5lciBpbWFnZS4KfQoKYWxsb3dfZGVwcmVjYXRlZF9hcmdzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZ3MgMTogbm8gYXJncyIpCgogICAgbm90IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJncwogICAgbm90IGlfcHJvY2Vzcy5BcmdzCgogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAxOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZ3MocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSkgewogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiBwb2xpY3kgYXJncyA9IiwgcF9wcm9jZXNzLkRlcHJlY2F0ZWRBcmdzKQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiBpbnB1dCBhcmdzID0iLCBpX3Byb2Nlc3MuQXJncykKCiAgICBjb3VudChwX3Byb2Nlc3MuRGVwcmVjYXRlZEFyZ3MpID09IGNvdW50KGlfcHJvY2Vzcy5BcmdzKQoKICAgIGV2ZXJ5IGksIGlfYXJnIGluIGlfcHJvY2Vzcy5BcmdzIHsKICAgICAgICBhbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpCiAgICB9CgogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDE6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgcF9hcmcyIDo9IHJlcGxhY2UocF9hcmcsICIkJCIsICIkIikKICAgIHBfYXJnMiA9PSBpX2FyZwoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAxOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDI6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgIyBUT0RPOiBjYW4gJChub2RlLW5hbWUpIGJlIGhhbmRsZWQgYmV0dGVyPwogICAgY29udGFpbnMocF9hcmcsICIkKG5vZGUtbmFtZSkiKQoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAyOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDM6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgcF9hcmcyIDo9IHJlcGxhY2UocF9hcmcsICIkJCIsICIkIikKICAgIHBfYXJnMyA6PSByZXBsYWNlKHBfYXJnMiwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAzOiBwX2FyZzMgPSIsIHBfYXJnMykKICAgIHBfYXJnMyA9PSBpX2FyZwoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAzOiB0cnVlIikKfQoKIyBPQ0kgcHJvY2Vzcy5FbnYgZmllbGQKYWxsb3dfZW52KHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfZW52OiBwIGVudiA9IiwgcF9wcm9jZXNzLkVudikKICAgIHByaW50KCJhbGxvd19lbnY6IGkgZW52ID0iLCBpX3Byb2Nlc3MuRW52KQoKICAgIGV2ZXJ5IGlfdmFyIGluIGlfcHJvY2Vzcy5FbnYgewogICAgICAgIHByaW50KCJhbGxvd19lbnY6IGlfdmFyID0iLCBpX3ZhcikKICAgICAgICBhbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgfQoKICAgIHByaW50KCJhbGxvd19lbnY6IHRydWUiKQp9CgojIEFsbG93IGlucHV0IGVudiB2YXJpYWJsZXMgdGhhdCBhcmUgcHJlc2VudCBpbiB0aGUgcG9saWN5IGRhdGEgdG9vLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHBfdmFyID09IGlfdmFyCiAgICBwcmludCgiYWxsb3dfdmFyIDE6IHRydWUiKQp9CgojIE1hdGNoIGlucHV0IHdpdGggb25lIG9mIHRoZSBwb2xpY3kgdmFyaWFibGVzLCBhZnRlciBzdWJzdGl0dXRpbmcgJChzYW5kYm94LW5hbWUpLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHByaW50KCJhbGxvd192YXIgMjogcF92YXIgPSIsIHBfdmFyKQoKICAgIHBfdmFyX3NwbGl0IDo9IHNwbGl0KHBfdmFyLCAiPSIpCiAgICBjb3VudChwX3Zhcl9zcGxpdCkgPT0gMgoKICAgIHBfdmFyX3NwbGl0WzFdID09ICIkKHNhbmRib3gtbmFtZSkiCgogICAgaV92YXJfc3BsaXQgOj0gc3BsaXQoaV92YXIsICI9IikKICAgIGNvdW50KGlfdmFyX3NwbGl0KSA9PSAyCgogICAgaV92YXJfc3BsaXRbMF0gPT0gcF92YXJfc3BsaXRbMF0KICAgIHJlZ2V4Lm1hdGNoKHNfbmFtZSwgaV92YXJfc3BsaXRbMV0pCgogICAgcHJpbnQoImFsbG93X3ZhciAyOiB0cnVlIikKfQoKIyBBbGxvdyBpbnB1dCBlbnYgdmFyaWFibGVzIHRoYXQgbWF0Y2ggd2l0aCBhIHJlcXVlc3RfZGVmYXVsdHMgcmVnZXguCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHNvbWUgcF9yZWdleDEgaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5DcmVhdGVDb250YWluZXJSZXF1ZXN0LmFsbG93X2Vudl9yZWdleAogICAgcF9yZWdleDIgOj0gcmVwbGFjZShwX3JlZ2V4MSwgIiQoaXB2NF9hKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcHY0X2EpCiAgICBwX3JlZ2V4MyA6PSByZXBsYWNlKHBfcmVnZXgyLCAiJChpcF9wKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcF9wKQogICAgcF9yZWdleDQgOj0gcmVwbGFjZShwX3JlZ2V4MywgIiQoc3ZjX25hbWUpIiwgcG9saWN5X2RhdGEuY29tbW9uLnN2Y19uYW1lKQogICAgcF9yZWdleDUgOj0gcmVwbGFjZShwX3JlZ2V4NCwgIiQoZG5zX2xhYmVsKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5kbnNfbGFiZWwpCgogICAgcHJpbnQoImFsbG93X3ZhciAzOiBwX3JlZ2V4NSA9IiwgcF9yZWdleDUpCiAgICByZWdleC5tYXRjaChwX3JlZ2V4NSwgaV92YXIpCgogICAgcHJpbnQoImFsbG93X3ZhciAzOiB0cnVlIikKfQoKIyBBbGxvdyBmaWVsZFJlZiAiZmllbGRQYXRoOiBzdGF0dXMucG9kSVAiIHZhbHVlcy4KYWxsb3dfdmFyKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBpX3Zhciwgc19uYW1lLCBzX25hbWVzcGFjZSkgewogICAgbmFtZV92YWx1ZSA6PSBzcGxpdChpX3ZhciwgIj0iKQogICAgY291bnQobmFtZV92YWx1ZSkgPT0gMgogICAgaXNfaXAobmFtZV92YWx1ZVsxXSkKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIGFsbG93X3BvZF9pcF92YXIobmFtZV92YWx1ZVswXSwgcF92YXIpCgogICAgcHJpbnQoImFsbG93X3ZhciA0OiB0cnVlIikKfQoKIyBBbGxvdyBjb21tb24gZmllbGRSZWYgdmFyaWFibGVzLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBuYW1lX3ZhbHVlIDo9IHNwbGl0KGlfdmFyLCAiPSIpCiAgICBjb3VudChuYW1lX3ZhbHVlKSA9PSAyCgogICAgc29tZSBwX3ZhciBpbiBwX3Byb2Nlc3MuRW52CiAgICBwX25hbWVfdmFsdWUgOj0gc3BsaXQocF92YXIsICI9IikKICAgIGNvdW50KHBfbmFtZV92YWx1ZSkgPT0gMgoKICAgIHBfbmFtZV92YWx1ZVswXSA9PSBuYW1lX3ZhbHVlWzBdCgogICAgIyBUT0RPOiBzaG91bGQgdGhlc2UgYmUgaGFuZGxlZCBpbiBhIGRpZmZlcmVudCB3YXk/CiAgICBhbHdheXNfYWxsb3dlZCA6PSBbIiQoaG9zdC1uYW1lKSIsICIkKG5vZGUtbmFtZSkiLCAiJChwb2QtdWlkKSJdCiAgICBzb21lIGFsbG93ZWQgaW4gYWx3YXlzX2FsbG93ZWQKICAgIGNvbnRhaW5zKHBfbmFtZV92YWx1ZVsxXSwgYWxsb3dlZCkKCiAgICBwcmludCgiYWxsb3dfdmFyIDU6IHRydWUiKQp9CgojIEFsbG93IGZpZWxkUmVmICJmaWVsZFBhdGg6IHN0YXR1cy5ob3N0SVAiIHZhbHVlcy4KYWxsb3dfdmFyKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBpX3Zhciwgc19uYW1lLCBzX25hbWVzcGFjZSkgewogICAgbmFtZV92YWx1ZSA6PSBzcGxpdChpX3ZhciwgIj0iKQogICAgY291bnQobmFtZV92YWx1ZSkgPT0gMgogICAgaXNfaXAobmFtZV92YWx1ZVsxXSkKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIGFsbG93X2hvc3RfaXBfdmFyKG5hbWVfdmFsdWVbMF0sIHBfdmFyKQoKICAgIHByaW50KCJhbGxvd192YXIgNjogdHJ1ZSIpCn0KCiMgQWxsb3cgcmVzb3VyY2VGaWVsZFJlZiB2YWx1ZXMgKGUuZy4sICJsaW1pdHMuY3B1IikuCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIG5hbWVfdmFsdWUgOj0gc3BsaXQoaV92YXIsICI9IikKICAgIGNvdW50KG5hbWVfdmFsdWUpID09IDIKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHBfbmFtZV92YWx1ZSA6PSBzcGxpdChwX3ZhciwgIj0iKQogICAgY291bnQocF9uYW1lX3ZhbHVlKSA9PSAyCgogICAgcF9uYW1lX3ZhbHVlWzBdID09IG5hbWVfdmFsdWVbMF0KCiAgICAjIGEgdmFyaWFibGUgd2Ugc2hvdWxkIGJlIHZhbGlkYXRpbmcgdXNpbmcgYSByZWdleCBmcm9tIHNldHRpbmdzCiAgICBwX25hbWVfdmFsdWVbMV0gPT0gIiQodmFsaWRhdGUtZnJvbS1zZXR0aW5ncykiCgogICAgcmVnZXhfdmFsIDo9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuQ3JlYXRlQ29udGFpbmVyUmVxdWVzdC5hbGxvd19lbnZfcmVnZXhfbWFwW25hbWVfdmFsdWVbMF1dCgogICAgcHJpbnQoImFsbG93X3ZhciA3OiB2YWwgPSIsIG5hbWVfdmFsdWVbMV0pCiAgICBwcmludCgiYWxsb3dfdmFyIDc6IHJlZ2V4X3ZhbCA9IiwgcmVnZXhfdmFsKQoKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4X3ZhbCwgbmFtZV92YWx1ZVsxXSkKCiAgICBwcmludCgiYWxsb3dfdmFyIDc6IHRydWUiKQp9CgojIE1hdGNoIGlucHV0IHdpdGggb25lIG9mIHRoZSBwb2xpY3kgdmFyaWFibGVzLCBhZnRlciBzdWJzdGl0dXRpbmcgJChzYW5kYm94LW5hbWVzcGFjZSkuCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHNvbWUgcF92YXIgaW4gcF9wcm9jZXNzLkVudgogICAgcF92YXIyIDo9IHJlcGxhY2UocF92YXIsICIkKHNhbmRib3gtbmFtZXNwYWNlKSIsIHNfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd192YXIgODogcF92YXIyID0iLCBwX3ZhcjIpCiAgICBwX3ZhcjIgPT0gaV92YXIKCiAgICBwcmludCgiYWxsb3dfdmFyIDg6IHRydWUiKQp9CgphbGxvd19wb2RfaXBfdmFyKHZhcl9uYW1lLCBwX3ZhcikgewogICAgcHJpbnQoImFsbG93X3BvZF9pcF92YXI6IHZhcl9uYW1lID0iLCB2YXJfbmFtZSwgInBfdmFyID0iLCBwX3ZhcikKCiAgICBwX25hbWVfdmFsdWUgOj0gc3BsaXQocF92YXIsICI9IikKICAgIGNvdW50KHBfbmFtZV92YWx1ZSkgPT0gMgoKICAgIHBfbmFtZV92YWx1ZVswXSA9PSB2YXJfbmFtZQogICAgcF9uYW1lX3ZhbHVlWzFdID09ICIkKHBvZC1pcCkiCgogICAgcHJpbnQoImFsbG93X3BvZF9pcF92YXI6IHRydWUiKQp9CgphbGxvd19ob3N0X2lwX3Zhcih2YXJfbmFtZSwgcF92YXIpIHsKICAgIHByaW50KCJhbGxvd19ob3N0X2lwX3ZhcjogdmFyX25hbWUgPSIsIHZhcl9uYW1lLCAicF92YXIgPSIsIHBfdmFyKQoKICAgIHBfbmFtZV92YWx1ZSA6PSBzcGxpdChwX3ZhciwgIj0iKQogICAgY291bnQocF9uYW1lX3ZhbHVlKSA9PSAyCgogICAgcF9uYW1lX3ZhbHVlWzBdID09IHZhcl9uYW1lCiAgICBwX25hbWVfdmFsdWVbMV0gPT0gIiQoaG9zdC1pcCkiCgogICAgcHJpbnQoImFsbG93X2hvc3RfaXBfdmFyOiB0cnVlIikKfQoKaXNfaXAodmFsdWUpIHsKICAgIGJ5dGVzID0gc3BsaXQodmFsdWUsICIuIikKICAgIGNvdW50KGJ5dGVzKSA9PSA0CgogICAgaXNfaXBfZmlyc3RfYnl0ZShieXRlc1swXSkKICAgIGlzX2lwX290aGVyX2J5dGUoYnl0ZXNbMV0pCiAgICBpc19pcF9vdGhlcl9ieXRlKGJ5dGVzWzJdKQogICAgaXNfaXBfb3RoZXJfYnl0ZShieXRlc1szXSkKfQppc19pcF9maXJzdF9ieXRlKGNvbXBvbmVudCkgewogICAgbnVtYmVyID0gdG9fbnVtYmVyKGNvbXBvbmVudCkKICAgIG51bWJlciA+PSAxCiAgICBudW1iZXIgPD0gMjU1Cn0KaXNfaXBfb3RoZXJfYnl0ZShjb21wb25lbnQpIHsKICAgIG51bWJlciA9IHRvX251bWJlcihjb21wb25lbnQpCiAgICBudW1iZXIgPj0gMAogICAgbnVtYmVyIDw9IDI1NQp9CgojIE9DSSByb290LlBhdGgKYWxsb3dfcm9vdF9wYXRoKHBfb2NpLCBpX29jaSwgYnVuZGxlX2lkKSB7CiAgICBpX3BhdGggOj0gaV9vY2kuUm9vdC5QYXRoCiAgICBwX3BhdGgxIDo9IHBfb2NpLlJvb3QuUGF0aAogICAgcHJpbnQoImFsbG93X3Jvb3RfcGF0aDogaV9wYXRoID0iLCBpX3BhdGgsICJwX3BhdGgxID0iLCBwX3BhdGgxKQoKICAgIHBfcGF0aDIgOj0gcmVwbGFjZShwX3BhdGgxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfcm9vdF9wYXRoOiBwX3BhdGgyID0iLCBwX3BhdGgyKQoKICAgIHBfcGF0aDMgOj0gcmVwbGFjZShwX3BhdGgyLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X3Jvb3RfcGF0aDogcF9wYXRoMyA9IiwgcF9wYXRoMykKCiAgICBwX3BhdGgzID09IGlfcGF0aAoKICAgIHByaW50KCJhbGxvd19yb290X3BhdGg6IHRydWUiKQp9CgojIGRldmljZSBtb3VudHMKYWxsb3dfbW91bnQocF9vY2ksIGlfbW91bnQsIGlfc3RvcmFnZXMsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcHJpbnQoImFsbG93X21vdW50OiBpX21vdW50ID0iLCBpX21vdW50KQoKICAgIHNvbWUgcF9tb3VudCBpbiBwX29jaS5Nb3VudHMKICAgIHNvbWUgaV9zdG9yYWdlIGluIGlfc3RvcmFnZXMKCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IHBfbW91bnQgPSIsIHBfbW91bnQpCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IGlfc3RvcmFnZSA9IiwgaV9zdG9yYWdlKQoKICAgIGNoZWNrX21vdW50KHBfbW91bnQsIGlfbW91bnQsIGlfc3RvcmFnZSwgYnVuZGxlX2lkLCBzYW5kYm94X2lkKQoKICAgICMgVE9ETzogYXJlIHRoZXJlIGFueSBvdGhlciByZXF1aXJlZCBwb2xpY3kgY2hlY2tzIGZvciBtb3VudHMgLSBlLmcuLAogICAgIyAgICAgICBtdWx0aXBsZSBtb3VudHMgd2l0aCBzYW1lIHNvdXJjZSBvciBkZXN0aW5hdGlvbj8KCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IHRydWUiKQp9CgpjaGVja19tb3VudChwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcF9tb3VudCA9PSBpX21vdW50CiAgICBwcmludCgiY2hlY2tfbW91bnQgMTogdHJ1ZSIpCn0KY2hlY2tfbW91bnQocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHBfbW91bnQuZGVzdGluYXRpb24gPT0gaV9tb3VudC5kZXN0aW5hdGlvbgogICAgcF9tb3VudC50eXBlXyA9PSBpX21vdW50LnR5cGVfCiAgICBwX21vdW50Lm9wdGlvbnMgPT0gaV9tb3VudC5vcHRpb25zCgogICAgbW91bnRfc291cmNlX2FsbG93cyhwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkKCiAgICBwcmludCgiY2hlY2tfbW91bnQgMjogdHJ1ZSIpCn0KCm1vdW50X3NvdXJjZV9hbGxvd3MocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHJlZ2V4MSA6PSBwX21vdW50LnNvdXJjZQogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5tb3VudF9zb3VyY2VfY3BhdGgpCiAgICByZWdleDQgOj0gcmVwbGFjZShyZWdleDMsICIkKGJ1bmRsZS1pZCkiLCBidW5kbGVfaWQpCgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMTogcmVnZXg0ID0iLCByZWdleDQpCiAgICByZWdleC5tYXRjaChyZWdleDQsIGlfbW91bnQuc291cmNlKQoKICAgIHByaW50KCJtb3VudF9zb3VyY2VfYWxsb3dzIDE6IHRydWUiKQp9Cm1vdW50X3NvdXJjZV9hbGxvd3MocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHJlZ2V4MSA6PSBwX21vdW50LnNvdXJjZQogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5tb3VudF9zb3VyY2VfY3BhdGgpCiAgICByZWdleDQgOj0gcmVwbGFjZShyZWdleDMsICIkKHNhbmRib3gtaWQpIiwgc2FuZGJveF9pZCkKCiAgICBwcmludCgibW91bnRfc291cmNlX2FsbG93cyAyOiByZWdleDQgPSIsIHJlZ2V4NCkKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4NCwgaV9tb3VudC5zb3VyY2UpCgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMjogdHJ1ZSIpCn0KbW91bnRfc291cmNlX2FsbG93cyhwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogaV9tb3VudC5zb3VyY2UgPSIsIGlfbW91bnQuc291cmNlKQogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogaV9zdG9yYWdlLm1vdW50X3BvaW50ID0iLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCgogICAgaV9tb3VudC5zb3VyY2UgPT0gaV9zdG9yYWdlLm1vdW50X3BvaW50CgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogdHJ1ZSIpCn0KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBDcmVhdGUgY29udGFpbmVyIFN0b3JhZ2VzCgphbGxvd19zdG9yYWdlcyhwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHBfY291bnQgOj0gY291bnQocF9zdG9yYWdlcykKICAgIGlfY291bnQgOj0gY291bnQoaV9zdG9yYWdlcykKICAgIHByaW50KCJhbGxvd19zdG9yYWdlczogcF9jb3VudCA9IiwgcF9jb3VudCwgImlfY291bnQgPSIsIGlfY291bnQpCgogICAgcF9jb3VudCA9PSBpX2NvdW50CgogICAgIyBHZXQgdGhlIGNvbnRhaW5lciBpbWFnZSBsYXllciBJRHMgYW5kIHZlcml0eSByb290IGhhc2hlcywgZnJvbSB0aGUgIm92ZXJsYXlmcyIgc3RvcmFnZS4KICAgIHNvbWUgb3ZlcmxheV9zdG9yYWdlIGluIHBfc3RvcmFnZXMKICAgIG92ZXJsYXlfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIHByaW50KCJhbGxvd19zdG9yYWdlczogb3ZlcmxheV9zdG9yYWdlID0iLCBvdmVybGF5X3N0b3JhZ2UpCiAgICBjb3VudChvdmVybGF5X3N0b3JhZ2Uub3B0aW9ucykgPT0gMgoKICAgIGxheWVyX2lkcyA6PSBzcGxpdChvdmVybGF5X3N0b3JhZ2Uub3B0aW9uc1swXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiBsYXllcl9pZHMgPSIsIGxheWVyX2lkcykKCiAgICByb290X2hhc2hlcyA6PSBzcGxpdChvdmVybGF5X3N0b3JhZ2Uub3B0aW9uc1sxXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiByb290X2hhc2hlcyA9Iiwgcm9vdF9oYXNoZXMpCgogICAgZXZlcnkgaV9zdG9yYWdlIGluIGlfc3RvcmFnZXMgewogICAgICAgIGFsbG93X3N0b3JhZ2UocF9zdG9yYWdlcywgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpCiAgICB9CgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiB0cnVlIikKfQoKYWxsb3dfc3RvcmFnZShwX3N0b3JhZ2VzLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgc29tZSBwX3N0b3JhZ2UgaW4gcF9zdG9yYWdlcwoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiBwX3N0b3JhZ2UgPSIsIHBfc3RvcmFnZSkKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiBpX3N0b3JhZ2UgPSIsIGlfc3RvcmFnZSkKCiAgICBwX3N0b3JhZ2UuZHJpdmVyICAgICAgICAgICA9PSBpX3N0b3JhZ2UuZHJpdmVyCiAgICBwX3N0b3JhZ2UuZHJpdmVyX29wdGlvbnMgICA9PSBpX3N0b3JhZ2UuZHJpdmVyX29wdGlvbnMKICAgIHBfc3RvcmFnZS5mc19ncm91cCAgICAgICAgID09IGlfc3RvcmFnZS5mc19ncm91cAogICAgcF9zdG9yYWdlLmZzdHlwZSAgICAgICAgICAgPT0gaV9zdG9yYWdlLmZzdHlwZQoKICAgIGFsbG93X3N0b3JhZ2Vfc291cmNlKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKQogICAgYWxsb3dfc3RvcmFnZV9vcHRpb25zKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKQogICAgYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKQoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiB0cnVlIikKfQoKYWxsb3dfc3RvcmFnZV9zb3VyY2UocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX3NvdXJjZSAxOiBzdGFydCIpCgogICAgcF9zdG9yYWdlLnNvdXJjZSA9PSBpX3N0b3JhZ2Uuc291cmNlCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDE6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX3NvdXJjZShwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDI6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCgogICAgIyBEREREOkJCOkRELkY6IERvbWFpbjpCdXM6RGV2aWNlLkZ1bmN0aW9uCiAgICAjIGh0dHBzOi8vd3d3Lmtlcm5lbC5vcmcvZG9jL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtYnVzLXBjaQogICAgcmVnZXgubWF0Y2goYF5bYS1mMC05XXs0fTpbYS1mMC05XXsyfTpbYS1mMC05XXsyfVwuW2EtZjAtOV0kYCwgaV9zdG9yYWdlLnNvdXJjZSkKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9zb3VyY2UgMjogdHJ1ZSIpCn0KCmFsbG93X3N0b3JhZ2Vfc291cmNlKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKSB7CiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9zb3VyY2UgMzogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIGlfc3RvcmFnZS5zb3VyY2UgPT0gIm5vbmUiCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDM6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX3NvdXJjZShwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDQ6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJzbWIiCgogICAgIyBQYXR0ZXJuOiAvLzxzdG9yYWdlLWFjY291bnQtbmFtZT4uZmlsZS5jb3JlLndpbmRvd3MubmV0LzxrOHMtUFZDLW5hbWU+CiAgICAjIFN0b3JhZ2UgYWNjb3VudCBuYW1lOiBodHRwczovL2xlYXJuLm1pY3Jvc29mdC5jb20vZW4tdXMvYXp1cmUvc3RvcmFnZS9jb21tb24vc3RvcmFnZS1hY2NvdW50LW92ZXJ2aWV3I3N0b3JhZ2UtYWNjb3VudC1uYW1lCiAgICAjIEs4cyBQVkMgbmFtZTogaHR0cHM6Ly9rdWJlcm5ldGVzLmlvL2RvY3MvY29uY2VwdHMvb3ZlcnZpZXcvd29ya2luZy13aXRoLW9iamVjdHMvbmFtZXMvI2Rucy1zdWJkb21haW4tbmFtZXMKICAgIHJlZ2V4Lm1hdGNoKGBeXC9cLyhbYS16MC05XXszLDI0fSlcLmZpbGVcLmNvcmVcLndpbmRvd3NcLm5ldFwvW2EtejAtOV0oW2EtejAtOS4tXXswLDI1MX1bYS16MC05XSk/JGAsIGlfc3RvcmFnZS5zb3VyY2UpCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDQ6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMTogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgIT0gIm92ZXJsYXlmcyIKICAgIHBfc3RvcmFnZS5vcHRpb25zID09IGlfc3RvcmFnZS5vcHRpb25zCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAxOiB0cnVlIikKfQphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIGNvdW50KHBfc3RvcmFnZS5vcHRpb25zKSA9PSAyCgogICAgcG9saWN5X2lkcyA6PSBzcGxpdChwX3N0b3JhZ2Uub3B0aW9uc1swXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBwb2xpY3lfaWRzID0iLCBwb2xpY3lfaWRzKQogICAgcG9saWN5X2lkcyA9PSBsYXllcl9pZHMKCiAgICBwb2xpY3lfaGFzaGVzIDo9IHNwbGl0KHBfc3RvcmFnZS5vcHRpb25zWzFdLCAiOiIpCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IHBvbGljeV9oYXNoZXMgPSIsIHBvbGljeV9oYXNoZXMpCgogICAgcF9jb3VudCA6PSBjb3VudChwb2xpY3lfaWRzKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBwX2NvdW50ID0iLCBwX2NvdW50KQogICAgcF9jb3VudCA+PSAxCiAgICBwX2NvdW50ID09IGNvdW50KHBvbGljeV9oYXNoZXMpCgogICAgaV9jb3VudCA6PSBjb3VudChpX3N0b3JhZ2Uub3B0aW9ucykKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogaV9jb3VudCA9IiwgaV9jb3VudCkKICAgIGlfY291bnQgPT0gcF9jb3VudCArIDMKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zWzBdID0iLCBpX3N0b3JhZ2Uub3B0aW9uc1swXSkKICAgIGlfc3RvcmFnZS5vcHRpb25zWzBdID09ICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQubGF5ZXItc3JjLXByZWZpeD0vdmFyL2xpYi9jb250YWluZXJkL2lvLmNvbnRhaW5lcmQuc25hcHNob3R0ZXIudjEudGFyZGV2L2xheWVycyIKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zW2lfY291bnQgLSAyXSA9IiwgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDJdKQogICAgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDJdID09ICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQub3ZlcmxheS1ydyIKCiAgICBsb3dlcmRpciA6PSBjb25jYXQoIj0iLCBbImxvd2VyZGlyIiwgcF9zdG9yYWdlLm9wdGlvbnNbMF1dKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBsb3dlcmRpciA9IiwgbG93ZXJkaXIpCgogICAgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDFdID09IGxvd2VyZGlyCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zW2lfY291bnQgLSAxXSA9IiwgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDFdKQoKICAgIGV2ZXJ5IGksIHBvbGljeV9pZCBpbiBwb2xpY3lfaWRzIHsKICAgICAgICBhbGxvd19vdmVybGF5X2xheWVyKHBvbGljeV9pZCwgcG9saWN5X2hhc2hlc1tpXSwgaV9zdG9yYWdlLm9wdGlvbnNbaSArIDFdKQogICAgfQoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogdHJ1ZSIpCn0KYWxsb3dfc3RvcmFnZV9vcHRpb25zKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKSB7CiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDM6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCiAgICBjb3VudChwX3N0b3JhZ2Uub3B0aW9ucykgPT0gMQoKICAgIHN0YXJ0c3dpdGgocF9zdG9yYWdlLm9wdGlvbnNbMF0sICIkKGhhc2giKQogICAgaGFzaF9zdWZmaXggOj0gdHJpbV9sZWZ0KHBfc3RvcmFnZS5vcHRpb25zWzBdLCAiJChoYXNoIikKCiAgICBlbmRzd2l0aChoYXNoX3N1ZmZpeCwgIikiKQogICAgaGFzaF9pbmRleCA6PSB0cmltX3JpZ2h0KGhhc2hfc3VmZml4LCAiKSIpCiAgICBpIDo9IHRvX251bWJlcihoYXNoX2luZGV4KQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAzOiBpID0iLCBpKQoKICAgIGhhc2hfb3B0aW9uIDo9IGNvbmNhdCgiPSIsIFsiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LnJvb3QtaGFzaCIsIHJvb3RfaGFzaGVzW2ldXSkKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMzogaGFzaF9vcHRpb24gPSIsIGhhc2hfb3B0aW9uKQoKICAgIGNvdW50KGlfc3RvcmFnZS5vcHRpb25zKSA9PSA0CiAgICBpX3N0b3JhZ2Uub3B0aW9uc1swXSA9PSAicm8iCiAgICBpX3N0b3JhZ2Uub3B0aW9uc1sxXSA9PSAiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmJsb2NrX2RldmljZT1maWxlIgogICAgaV9zdG9yYWdlLm9wdGlvbnNbMl0gPT0gImlvLmthdGFjb250YWluZXJzLmZzLW9wdC5pcy1sYXllciIKICAgIGlfc3RvcmFnZS5vcHRpb25zWzNdID09IGhhc2hfb3B0aW9uCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAzOiB0cnVlIikKfQphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgNDogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gInNtYiIKICAgIHBfb3B0c19jb3VudCA6PSBjb3VudChwX3N0b3JhZ2Uub3B0aW9ucykKICAgIGlfb3B0c19jb3VudCA6PSBjb3VudChpX3N0b3JhZ2Uub3B0aW9ucykKICAgIGlfb3B0c19jb3VudCA9PSBwX29wdHNfY291bnQgKyAyCgogICAgaV9vcHRfbWF0Y2hlcyA6PSBbaSB8IGkgOj0gaWR4OyBpZHggPCBwX29wdHNfY291bnQ7IHBfc3RvcmFnZS5vcHRpb25zW2lkeF0gPT0gaV9zdG9yYWdlLm9wdGlvbnNbaWR4XV0KICAgIGNvdW50KGlfb3B0X21hdGNoZXMpID09IHBfb3B0c19jb3VudAoKICAgIHN0YXJ0c3dpdGgoaV9zdG9yYWdlLm9wdGlvbnNbaV9vcHRzX2NvdW50LTJdLCAiYWRkcj0iKQogICAgY3JlZHMgPSBzcGxpdChpX3N0b3JhZ2Uub3B0aW9uc1tpX29wdHNfY291bnQtMV0sICIsIikKICAgIGNvdW50KGNyZWRzKSA9PSAyCiAgICBzdGFydHN3aXRoKGNyZWRzWzBdLCAidXNlcm5hbWU9IikKICAgIHN0YXJ0c3dpdGgoY3JlZHNbMV0sICJwYXNzd29yZD0iKQogICAgCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDQ6IHRydWUiKQp9CgphbGxvd19vdmVybGF5X2xheWVyKHBvbGljeV9pZCwgcG9saWN5X2hhc2gsIGlfb3B0aW9uKSB7CiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogcG9saWN5X2lkID0iLCBwb2xpY3lfaWQsICJwb2xpY3lfaGFzaCA9IiwgcG9saWN5X2hhc2gpCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogaV9vcHRpb24gPSIsIGlfb3B0aW9uKQoKICAgIHN0YXJ0c3dpdGgoaV9vcHRpb24sICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQubGF5ZXI9IikKICAgIGlfdmFsdWUgOj0gcmVwbGFjZShpX29wdGlvbiwgImlvLmthdGFjb250YWluZXJzLmZzLW9wdC5sYXllcj0iLCAiIikKICAgIGlfdmFsdWVfZGVjb2RlZCA6PSBiYXNlNjQuZGVjb2RlKGlfdmFsdWUpCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogaV92YWx1ZV9kZWNvZGVkID0iLCBpX3ZhbHVlX2RlY29kZWQpCgogICAgcG9saWN5X3N1ZmZpeCA6PSBjb25jYXQoIj0iLCBbInRhcixybyxpby5rYXRhY29udGFpbmVycy5mcy1vcHQuYmxvY2tfZGV2aWNlPWZpbGUsaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmlzLWxheWVyLGlvLmthdGFjb250YWluZXJzLmZzLW9wdC5yb290LWhhc2giLCBwb2xpY3lfaGFzaF0pCiAgICBwX3ZhbHVlIDo9IGNvbmNhdCgiLCIsIFtwb2xpY3lfaWQsIHBvbGljeV9zdWZmaXhdKQogICAgcHJpbnQoImFsbG93X292ZXJsYXlfbGF5ZXI6IHBfdmFsdWUgPSIsIHBfdmFsdWUpCgogICAgcF92YWx1ZSA9PSBpX3ZhbHVlX2RlY29kZWQKCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogdHJ1ZSIpCn0KCmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAidGFyIgoKICAgIHN0YXJ0c3dpdGgocF9zdG9yYWdlLm1vdW50X3BvaW50LCAiJChsYXllciIpCiAgICBtb3VudF9zdWZmaXggOj0gdHJpbV9sZWZ0KHBfc3RvcmFnZS5tb3VudF9wb2ludCwgIiQobGF5ZXIiKQoKICAgIGVuZHN3aXRoKG1vdW50X3N1ZmZpeCwgIikiKQogICAgbGF5ZXJfaW5kZXggOj0gdHJpbV9yaWdodChtb3VudF9zdWZmaXgsICIpIikKICAgIGkgOj0gdG9fbnVtYmVyKGxheWVyX2luZGV4KQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDE6IGkgPSIsIGkpCgogICAgbGF5ZXJfaWQgOj0gbGF5ZXJfaWRzW2ldCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMTogbGF5ZXJfaWQgPSIsIGxheWVyX2lkKQoKICAgIHBfbW91bnQgOj0gY29uY2F0KCIvIiwgWyIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L2xheWVycyIsIGxheWVyX2lkXSkKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCAxOiBwX21vdW50ID0iLCBwX21vdW50KQoKICAgIHBfbW91bnQgPT0gaV9zdG9yYWdlLm1vdW50X3BvaW50CgogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDE6IHRydWUiKQp9CmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAiZnVzZTMua2F0YS1vdmVybGF5IgoKICAgIG1vdW50MSA6PSByZXBsYWNlKHBfc3RvcmFnZS5tb3VudF9wb2ludCwgIiQoY3BhdGgpIiwgcG9saWN5X2RhdGEuY29tbW9uLmNwYXRoKQogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDI6IG1vdW50MiA9IiwgbW91bnQyKQoKICAgIG1vdW50MiA9PSBpX3N0b3JhZ2UubW91bnRfcG9pbnQKCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMjogdHJ1ZSIpCn0KYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKSB7CiAgICBwX3N0b3JhZ2UuZnN0eXBlID09ICJsb2NhbCIKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQyID0iLCBtb3VudDIpCgogICAgbW91bnQzIDo9IHJlcGxhY2UobW91bnQyLCAiJChzYW5kYm94LWlkKSIsIHNhbmRib3hfaWQpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQzID0iLCBtb3VudDMpCgogICAgcmVnZXgubWF0Y2gobW91bnQzLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCgogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDM6IHRydWUiKQp9CmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAiYmluZCIKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNDogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNDogbW91bnQyID0iLCBtb3VudDIpCgogICAgbW91bnQzIDo9IHJlcGxhY2UobW91bnQyLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDQ6IG1vdW50MyA9IiwgbW91bnQzKQoKICAgIHJlZ2V4Lm1hdGNoKG1vdW50MywgaV9zdG9yYWdlLm1vdW50X3BvaW50KQoKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA0OiB0cnVlIikKfQphbGxvd19tb3VudF9wb2ludChwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgYnVuZGxlX2lkLCBzYW5kYm94X2lkLCBsYXllcl9pZHMpIHsKICAgIHBfc3RvcmFnZS5mc3R5cGUgPT0gInRtcGZzIgoKICAgIG1vdW50MSA6PSBwX3N0b3JhZ2UubW91bnRfcG9pbnQKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA1OiBtb3VudDEgPSIsIG1vdW50MSkKCiAgICByZWdleC5tYXRjaChtb3VudDEsIGlfc3RvcmFnZS5tb3VudF9wb2ludCkKCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNTogdHJ1ZSIpCn0KYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKSB7CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogaV9zdG9yYWdlLm1vdW50X3BvaW50ID0iLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCiAgICBhbGxvd19kaXJlY3Rfdm9sX2RyaXZlcihwX3N0b3JhZ2UsIGlfc3RvcmFnZSkKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChzcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQyID0iLCBtb3VudDIpCgogICAgZGlyZWN0X3ZvbF9wYXRoIDo9IGlfc3RvcmFnZS5zb3VyY2UKICAgIG1vdW50MyA6PSByZXBsYWNlKG1vdW50MiwgIiQoYjY0LWRpcmVjdC12b2wtcGF0aCkiLCBiYXNlNjR1cmwuZW5jb2RlKGRpcmVjdF92b2xfcGF0aCkpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQzID0iLCBtb3VudDMpCgogICAgbW91bnQzID09IGlfc3RvcmFnZS5tb3VudF9wb2ludAoKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA2OiB0cnVlIikKfQoKYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIocF9zdG9yYWdlLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19kaXJlY3Rfdm9sX2RyaXZlciAxOiBzdGFydCIpCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCiAgICBwcmludCgiYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIgMTogdHJ1ZSIpCn0KYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIocF9zdG9yYWdlLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19kaXJlY3Rfdm9sX2RyaXZlciAyOiBzdGFydCIpCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJzbWIiCiAgICBwcmludCgiYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIgMjogdHJ1ZSIpCn0KCiMgRXhlY1Byb2Nlc3NSZXF1ZXN0LnByb2Nlc3MuQ2FwYWJpbGl0aWVzCmFsbG93X2V4ZWNfY2FwcyhpX2NhcHMpIHsKICAgIG5vdCBpX2NhcHMuQW1iaWVudAogICAgbm90IGlfY2Fwcy5Cb3VuZGluZwogICAgbm90IGlfY2Fwcy5FZmZlY3RpdmUKICAgIG5vdCBpX2NhcHMuSW5oZXJpdGFibGUKICAgIG5vdCBpX2NhcHMuUGVybWl0dGVkCn0KCiMgT0NJLlByb2Nlc3MuQ2FwYWJpbGl0aWVzCmFsbG93X2NhcHMocF9jYXBzLCBpX2NhcHMpIHsKICAgIHByaW50KCJhbGxvd19jYXBzOiBwb2xpY3kgQW1iaWVudCA9IiwgcF9jYXBzLkFtYmllbnQpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgQW1iaWVudCA9IiwgaV9jYXBzLkFtYmllbnQpCiAgICBtYXRjaF9jYXBzKHBfY2Fwcy5BbWJpZW50LCBpX2NhcHMuQW1iaWVudCkKCiAgICBwcmludCgiYWxsb3dfY2FwczogcG9saWN5IEJvdW5kaW5nID0iLCBwX2NhcHMuQm91bmRpbmcpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgQm91bmRpbmcgPSIsIGlfY2Fwcy5Cb3VuZGluZykKICAgIG1hdGNoX2NhcHMocF9jYXBzLkJvdW5kaW5nLCBpX2NhcHMuQm91bmRpbmcpCgogICAgcHJpbnQoImFsbG93X2NhcHM6IHBvbGljeSBFZmZlY3RpdmUgPSIsIHBfY2Fwcy5FZmZlY3RpdmUpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgRWZmZWN0aXZlID0iLCBpX2NhcHMuRWZmZWN0aXZlKQogICAgbWF0Y2hfY2FwcyhwX2NhcHMuRWZmZWN0aXZlLCBpX2NhcHMuRWZmZWN0aXZlKQoKICAgIHByaW50KCJhbGxvd19jYXBzOiBwb2xpY3kgSW5oZXJpdGFibGUgPSIsIHBfY2Fwcy5Jbmhlcml0YWJsZSkKICAgIHByaW50KCJhbGxvd19jYXBzOiBpbnB1dCBJbmhlcml0YWJsZSA9IiwgaV9jYXBzLkluaGVyaXRhYmxlKQogICAgbWF0Y2hfY2FwcyhwX2NhcHMuSW5oZXJpdGFibGUsIGlfY2Fwcy5Jbmhlcml0YWJsZSkKCiAgICBwcmludCgiYWxsb3dfY2FwczogcG9saWN5IFBlcm1pdHRlZCA9IiwgcF9jYXBzLlBlcm1pdHRlZCkKICAgIHByaW50KCJhbGxvd19jYXBzOiBpbnB1dCBQZXJtaXR0ZWQgPSIsIGlfY2Fwcy5QZXJtaXR0ZWQpCiAgICBtYXRjaF9jYXBzKHBfY2Fwcy5QZXJtaXR0ZWQsIGlfY2Fwcy5QZXJtaXR0ZWQpCn0KCm1hdGNoX2NhcHMocF9jYXBzLCBpX2NhcHMpIHsKICAgIHByaW50KCJtYXRjaF9jYXBzIDE6IHN0YXJ0IikKCiAgICBwX2NhcHMgPT0gaV9jYXBzCgogICAgcHJpbnQoIm1hdGNoX2NhcHMgMTogdHJ1ZSIpCn0KbWF0Y2hfY2FwcyhwX2NhcHMsIGlfY2FwcykgewogICAgcHJpbnQoIm1hdGNoX2NhcHMgMjogc3RhcnQiKQoKICAgIGNvdW50KHBfY2FwcykgPT0gMQogICAgcF9jYXBzWzBdID09ICIkKGRlZmF1bHRfY2FwcykiCgogICAgcHJpbnQoIm1hdGNoX2NhcHMgMjogZGVmYXVsdF9jYXBzID0iLCBwb2xpY3lfZGF0YS5jb21tb24uZGVmYXVsdF9jYXBzKQogICAgcG9saWN5X2RhdGEuY29tbW9uLmRlZmF1bHRfY2FwcyA9PSBpX2NhcHMKCiAgICBwcmludCgibWF0Y2hfY2FwcyAyOiB0cnVlIikKfQptYXRjaF9jYXBzKHBfY2FwcywgaV9jYXBzKSB7CiAgICBwcmludCgibWF0Y2hfY2FwcyAzOiBzdGFydCIpCgogICAgY291bnQocF9jYXBzKSA9PSAxCiAgICBwX2NhcHNbMF0gPT0gIiQocHJpdmlsZWdlZF9jYXBzKSIKCiAgICBwcmludCgibWF0Y2hfY2FwcyAzOiBwcml2aWxlZ2VkX2NhcHMgPSIsIHBvbGljeV9kYXRhLmNvbW1vbi5wcml2aWxlZ2VkX2NhcHMpCiAgICBwb2xpY3lfZGF0YS5jb21tb24ucHJpdmlsZWdlZF9jYXBzID09IGlfY2FwcwoKICAgIHByaW50KCJtYXRjaF9jYXBzIDM6IHRydWUiKQp9CgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgpjaGVja19kaXJlY3RvcnlfdHJhdmVyc2FsKGlfcGF0aCkgewogICAgbm90IHJlZ2V4Lm1hdGNoKCIoXnwvKS4uKCR8LykiLCBpX3BhdGgpCn0KCmNoZWNrX3N5bWxpbmtfc291cmNlKGlfc3JjKSB7CiAgICBpX3NyYyA9PSAiIgogICAgcHJpbnQoImNoZWNrX3N5bWxpbmtfc291cmNlIDE6IHRydWUiKQp9CmNoZWNrX3N5bWxpbmtfc291cmNlKGlfc3JjKSB7CiAgICBpX3NyYyAhPSAiIgogICAgcHJpbnQoImNoZWNrX3N5bWxpbmtfc291cmNlIDI6IGlfc3JjID0iLCBpX3NyYykKCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24uc19zb3VyY2UxLCBpX3NyYykKCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMjogdHJ1ZSIpCn0KY2hlY2tfc3ltbGlua19zb3VyY2UoaV9zcmMpIHsKICAgIGlfc3JjICE9ICIiCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMzogaV9zcmMgPSIsIGlfc3JjKQoKICAgIHJlZ2V4Lm1hdGNoKHBvbGljeV9kYXRhLmNvbW1vbi5zX3NvdXJjZTIsIGlfc3JjKQogICAgY2hlY2tfZGlyZWN0b3J5X3RyYXZlcnNhbChpX3NyYykKCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMzogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfc3RvcmFnZXMoaV9zdG9yYWdlcykgewogICAgcHJpbnQoImFsbG93X3NhbmRib3hfc3RvcmFnZXM6IGlfc3RvcmFnZXMgPSIsIGlfc3RvcmFnZXMpCgogICAgcF9zdG9yYWdlcyA6PSBwb2xpY3lfZGF0YS5zYW5kYm94LnN0b3JhZ2VzCiAgICBldmVyeSBpX3N0b3JhZ2UgaW4gaV9zdG9yYWdlcyB7CiAgICAgICAgYWxsb3dfc2FuZGJveF9zdG9yYWdlKHBfc3RvcmFnZXMsIGlfc3RvcmFnZSkKICAgIH0KCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9zdG9yYWdlczogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfc3RvcmFnZShwX3N0b3JhZ2VzLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IGlfc3RvcmFnZSA9IiwgaV9zdG9yYWdlKQoKICAgIHNvbWUgcF9zdG9yYWdlIGluIHBfc3RvcmFnZXMKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IHBfc3RvcmFnZSA9IiwgcF9zdG9yYWdlKQogICAgaV9zdG9yYWdlID09IHBfc3RvcmFnZQoKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IHRydWUiKQp9CgpDb3B5RmlsZVJlcXVlc3QgewogICAgcHJpbnQoIkNvcHlGaWxlUmVxdWVzdDogaW5wdXQucGF0aCA9IiwgaW5wdXQucGF0aCkKCiAgICBjaGVja19zeW1saW5rX3NvdXJjZShpbnB1dC5zeW1saW5rX3NyYykKICAgIGNoZWNrX2RpcmVjdG9yeV90cmF2ZXJzYWwoaW5wdXQucGF0aCkKCiAgICBzb21lIHJlZ2V4MSBpbiBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLkNvcHlGaWxlUmVxdWVzdAogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5jcGF0aCkKICAgIHJlZ2V4NCA6PSByZXBsYWNlKHJlZ2V4MywgIiQoYnVuZGxlLWlkKSIsIEJVTkRMRV9JRCkKICAgIHByaW50KCJDb3B5RmlsZVJlcXVlc3Q6IHJlZ2V4NCA9IiwgcmVnZXg0KQoKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4NCwgaW5wdXQucGF0aCkKCiAgICBwcmludCgiQ29weUZpbGVSZXF1ZXN0OiB0cnVlIikKfQoKQ3JlYXRlU2FuZGJveFJlcXVlc3QgewogICAgcHJpbnQoIkNyZWF0ZVNhbmRib3hSZXF1ZXN0OiBpbnB1dC5ndWVzdF9ob29rX3BhdGggPSIsIGlucHV0Lmd1ZXN0X2hvb2tfcGF0aCkKICAgIGNvdW50KGlucHV0Lmd1ZXN0X2hvb2tfcGF0aCkgPT0gMAoKICAgIHByaW50KCJDcmVhdGVTYW5kYm94UmVxdWVzdDogaW5wdXQua2VybmVsX21vZHVsZXMgPSIsIGlucHV0Lmtlcm5lbF9tb2R1bGVzKQogICAgY291bnQoaW5wdXQua2VybmVsX21vZHVsZXMpID09IDAKCiAgICBpX3BpZG5zIDo9IGlucHV0LnNhbmRib3hfcGlkbnMKICAgIHByaW50KCJDcmVhdGVTYW5kYm94UmVxdWVzdDogaV9waWRucyA9IiwgaV9waWRucykKICAgIGlfcGlkbnMgPT0gZmFsc2UKICAgIGFsbG93X3NhbmRib3hfc3RvcmFnZXMoaW5wdXQuc3RvcmFnZXMpCn0KCmFsbG93X2V4ZWMocF9jb250YWluZXIsIGlfcHJvY2VzcykgewogICAgcHJpbnQoImFsbG93X2V4ZWM6IHN0YXJ0IikKCiAgICBwX29jaSA9IHBfY29udGFpbmVyLk9DSQogICAgcF9zX25hbWUgPSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc19uYW1lc3BhY2UgPSBnZXRfc3RhdGVfdmFsKCJuYW1lc3BhY2UiKQogICAgYWxsb3dfcHJvYmVfcHJvY2VzcyhwX29jaS5Qcm9jZXNzLCBpX3Byb2Nlc3MsIHBfc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfZXhlYzogdHJ1ZSIpCn0KCmFsbG93X2ludGVyYWN0aXZlX2V4ZWMocF9jb250YWluZXIsIGlfcHJvY2VzcykgewogICAgcHJpbnQoImFsbG93X2ludGVyYWN0aXZlX2V4ZWM6IHN0YXJ0IikKCiAgICBwX29jaSA9IHBfY29udGFpbmVyLk9DSQogICAgcF9zX25hbWUgPSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc19uYW1lc3BhY2UgPSBnZXRfc3RhdGVfdmFsKCJuYW1lc3BhY2UiKQogICAgYWxsb3dfaW50ZXJhY3RpdmVfcHJvY2VzcyhwX29jaS5Qcm9jZXNzLCBpX3Byb2Nlc3MsIHBfc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfaW50ZXJhY3RpdmVfZXhlYzogdHJ1ZSIpCn0KCiMgVE9ETzogc2hvdWxkIG90aGVyIEV4ZWNQcm9jZXNzUmVxdWVzdCBpbnB1dCBkYXRhIGZpZWxkcyBiZSB2YWxpZGF0ZWQgYXMgd2VsbD8KRXhlY1Byb2Nlc3NSZXF1ZXN0IHsKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMTogaW5wdXQgPSIsIGlucHV0KQoKICAgIHNvbWUgcF9jb21tYW5kIGluIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuRXhlY1Byb2Nlc3NSZXF1ZXN0LmFsbG93ZWRfY29tbWFuZHMKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMTogcF9jb21tYW5kID0iLCBwX2NvbW1hbmQpCiAgICBwX2NvbW1hbmQgPT0gaW5wdXQucHJvY2Vzcy5BcmdzCgogICAgIyBUT0RPOiBtYXRjaCBwX2NvbnRhaW5lcidzIElEIHdpdGggdGhlIGlucHV0IGNvbnRhaW5lcl9pZC4KICAgIHNvbWUgcF9jb250YWluZXIgaW4gcG9saWN5X2RhdGEuY29udGFpbmVycwogICAgYWxsb3dfaW50ZXJhY3RpdmVfZXhlYyhwX2NvbnRhaW5lciwgaW5wdXQucHJvY2VzcykKCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDE6IHRydWUiKQp9CkV4ZWNQcm9jZXNzUmVxdWVzdCB7CiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDI6IGlucHV0ID0iLCBpbnB1dCkKCiAgICAjIFRPRE86IG1hdGNoIGlucHV0IGNvbnRhaW5lciBJRCB3aXRoIGl0cyBjb3JyZXNwb25kaW5nIGNvbnRhaW5lci5leGVjX2NvbW1hbmRzLgogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBzb21lIHBfY29tbWFuZCBpbiBwX2NvbnRhaW5lci5leGVjX2NvbW1hbmRzCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDI6IHBfY29tbWFuZCA9IiwgcF9jb21tYW5kKQoKICAgICMgVE9ETzogc2hvdWxkIG90aGVyIGlucHV0IGRhdGEgZmllbGRzIGJlIHZhbGlkYXRlZCBhcyB3ZWxsPwogICAgcF9jb21tYW5kID09IGlucHV0LnByb2Nlc3MuQXJncwoKICAgIGFsbG93X2V4ZWMocF9jb250YWluZXIsIGlucHV0LnByb2Nlc3MpCgogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAyOiB0cnVlIikKfQpFeGVjUHJvY2Vzc1JlcXVlc3QgewogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAzOiBpbnB1dCA9IiwgaW5wdXQpCgogICAgaV9jb21tYW5kID0gY29uY2F0KCIgIiwgaW5wdXQucHJvY2Vzcy5BcmdzKQogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAzOiBpX2NvbW1hbmQgPSIsIGlfY29tbWFuZCkKCiAgICBzb21lIHBfcmVnZXggaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5FeGVjUHJvY2Vzc1JlcXVlc3QucmVnZXgKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMzogcF9yZWdleCA9IiwgcF9yZWdleCkKCiAgICByZWdleC5tYXRjaChwX3JlZ2V4LCBpX2NvbW1hbmQpCgogICAgIyBUT0RPOiBtYXRjaCBwX2NvbnRhaW5lcidzIElEIHdpdGggdGhlIGlucHV0IGNvbnRhaW5lcl9pZC4KICAgIHNvbWUgcF9jb250YWluZXIgaW4gcG9saWN5X2RhdGEuY29udGFpbmVycwogICAgYWxsb3dfaW50ZXJhY3RpdmVfZXhlYyhwX2NvbnRhaW5lciwgaW5wdXQucHJvY2VzcykKCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDM6IHRydWUiKQp9CgpVcGRhdGVSb3V0ZXNSZXF1ZXN0IHsKICAgIHByaW50KCJVcGRhdGVSb3V0ZXNSZXF1ZXN0OiBpbnB1dCA9IiwgaW5wdXQpCiAgICBwcmludCgiVXBkYXRlUm91dGVzUmVxdWVzdDogcG9saWN5ID0iLCBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLlVwZGF0ZVJvdXRlc1JlcXVlc3QpCgogICAgaV9yb3V0ZXMgOj0gaW5wdXQucm91dGVzLlJvdXRlcwogICAgcF9zb3VyY2VfcmVnZXggPSBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLlVwZGF0ZVJvdXRlc1JlcXVlc3QuZm9yYmlkZGVuX3NvdXJjZV9yZWdleAogICAgcF9uYW1lcyA9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuVXBkYXRlUm91dGVzUmVxdWVzdC5mb3JiaWRkZW5fZGV2aWNlX25hbWVzCgogICAgZXZlcnkgaV9yb3V0ZSBpbiBpX3JvdXRlcyB7CiAgICAgICAgcHJpbnQoImlfcm91dGUuc291cmNlID0iLCBpX3JvdXRlLnNvdXJjZSkKICAgICAgICBldmVyeSBwX3JlZ2V4IGluIHBfc291cmNlX3JlZ2V4IHsKICAgICAgICAgICAgcHJpbnQoInBfcmVnZXggPSIsIHBfcmVnZXgpCiAgICAgICAgICAgIG5vdCByZWdleC5tYXRjaChwX3JlZ2V4LCBpX3JvdXRlLnNvdXJjZSkKICAgICAgICB9CgogICAgICAgIHByaW50KCJpX3JvdXRlLmRldmljZSA9IiwgaV9yb3V0ZS5kZXZpY2UpCiAgICAgICAgbm90IGlfcm91dGUuZGV2aWNlIGluIHBfbmFtZXMKICAgIH0KCiAgICBwcmludCgiVXBkYXRlUm91dGVzUmVxdWVzdDogdHJ1ZSIpCn0KClVwZGF0ZUludGVyZmFjZVJlcXVlc3QgewogICAgcHJpbnQoIlVwZGF0ZUludGVyZmFjZVJlcXVlc3Q6IGlucHV0ID0iLCBpbnB1dCkKICAgIHByaW50KCJVcGRhdGVJbnRlcmZhY2VSZXF1ZXN0OiBwb2xpY3kgPSIsIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuVXBkYXRlSW50ZXJmYWNlUmVxdWVzdCkKCiAgICBpX2ludGVyZmFjZSA6PSBpbnB1dC5pbnRlcmZhY2UKICAgIHBfZmxhZ3MgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmFsbG93X3Jhd19mbGFncwoKICAgICMgVHlwaWNhbGx5LCBqdXN0IElGRl9OT0FSUCBpcyB1c2VkLgogICAgYml0cy5hbmQoaV9pbnRlcmZhY2UucmF3X2ZsYWdzLCBiaXRzLm5lZ2F0ZShwX2ZsYWdzKSkgPT0gMAoKICAgIHBfbmFtZXMgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmZvcmJpZGRlbl9uYW1lcwoKICAgIG5vdCBpX2ludGVyZmFjZS5uYW1lIGluIHBfbmFtZXMKCiAgICBwX2h3YWRkcnMgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmZvcmJpZGRlbl9od19hZGRycwoKICAgIG5vdCBpX2ludGVyZmFjZS5od0FkZHIgaW4gcF9od2FkZHJzCgogICAgcHJpbnQoIlVwZGF0ZUludGVyZmFjZVJlcXVlc3Q6IHRydWUiKQp9CgpDbG9zZVN0ZGluUmVxdWVzdCB7CiAgICBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLkNsb3NlU3RkaW5SZXF1ZXN0ID09IHRydWUKfQoKUmVhZFN0cmVhbVJlcXVlc3QgewogICAgcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5SZWFkU3RyZWFtUmVxdWVzdCA9PSB0cnVlCn0KClVwZGF0ZUVwaGVtZXJhbE1vdW50c1JlcXVlc3QgewogICAgcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVFcGhlbWVyYWxNb3VudHNSZXF1ZXN0ID09IHRydWUKfQoKV3JpdGVTdHJlYW1SZXF1ZXN0IHsKICAgIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuV3JpdGVTdHJlYW1SZXF1ZXN0ID09IHRydWUKfQoKcG9saWN5X2RhdGEgOj0gewogICJjb250YWluZXJzIjogWwogICAgewogICAgICAiT0NJIjogewogICAgICAgICJWZXJzaW9uIjogIjEuMS4wLXJjLjEiLAogICAgICAgICJQcm9jZXNzIjogewogICAgICAgICAgIlRlcm1pbmFsIjogZmFsc2UsCiAgICAgICAgICAiVXNlciI6IHsKICAgICAgICAgICAgIlVJRCI6IDY1NTM1LAogICAgICAgICAgICAiR0lEIjogNjU1MzUsCiAgICAgICAgICAgICJBZGRpdGlvbmFsR2lkcyI6IFtdLAogICAgICAgICAgICAiVXNlcm5hbWUiOiAiIgogICAgICAgICAgfSwKICAgICAgICAgICJEZXByZWNhdGVkQXJncyI6IFsKICAgICAgICAgICAgIi9wYXVzZSIKICAgICAgICAgIF0sCiAgICAgICAgICAiQXJncyI6IFsKICAgICAgICAgICAgIi9wYXVzZSIKICAgICAgICAgIF0sCiAgICAgICAgICAiRW52IjogWwogICAgICAgICAgICAiUEFUSD0vdXNyL2xvY2FsL3NiaW46L3Vzci9sb2NhbC9iaW46L3Vzci9zYmluOi91c3IvYmluOi9zYmluOi9iaW4iCiAgICAgICAgICBdLAogICAgICAgICAgIkN3ZCI6ICIvIiwKICAgICAgICAgICJDYXBhYmlsaXRpZXMiOiB7CiAgICAgICAgICAgICJBbWJpZW50IjogW10sCiAgICAgICAgICAgICJCb3VuZGluZyI6IFsKICAgICAgICAgICAgICAiJChkZWZhdWx0X2NhcHMpIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiRWZmZWN0aXZlIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJJbmhlcml0YWJsZSI6IFtdLAogICAgICAgICAgICAiUGVybWl0dGVkIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICAiTm9OZXdQcml2aWxlZ2VzIjogdHJ1ZQogICAgICAgIH0sCiAgICAgICAgIlJvb3QiOiB7CiAgICAgICAgICAiUGF0aCI6ICIkKGNwYXRoKS8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgIlJlYWRvbmx5IjogdHJ1ZQogICAgICAgIH0sCiAgICAgICAgIk1vdW50cyI6IFsKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9wcm9jIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJwcm9jIiwKICAgICAgICAgICAgInR5cGVfIjogInByb2MiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2IiwKICAgICAgICAgICAgInNvdXJjZSI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJzdHJpY3RhdGltZSIsCiAgICAgICAgICAgICAgIm1vZGU9NzU1IiwKICAgICAgICAgICAgICAic2l6ZT02NTUzNmsiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L3B0cyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiZGV2cHRzIiwKICAgICAgICAgICAgInR5cGVfIjogImRldnB0cyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJuZXdpbnN0YW5jZSIsCiAgICAgICAgICAgICAgInB0bXhtb2RlPTA2NjYiLAogICAgICAgICAgICAgICJtb2RlPTA2MjAiLAogICAgICAgICAgICAgICJnaWQ9NSIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvc2htIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L3NobSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi9tcXVldWUiLAogICAgICAgICAgICAic291cmNlIjogIm1xdWV1ZSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJtcXVldWUiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvc3lzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJzeXNmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJzeXNmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2V0Yy9yZXNvbHYuY29uZiIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClyZXNvbHYuY29uZiQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJvIiwKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9kZXYiLAogICAgICAgICAgICAgICJub2V4ZWMiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0KICAgICAgICBdLAogICAgICAgICJBbm5vdGF0aW9ucyI6IHsKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmJ1bmRsZV9wYXRoIjogIi9ydW4vY29udGFpbmVyZC9pby5jb250YWluZXJkLnJ1bnRpbWUudjIudGFzay9rOHMuaW8vJChidW5kbGUtaWQpIiwKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIjogInBvZF9zYW5kYm94IiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSI6ICJzYW5kYm94IiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWlkIjogIl5bYS16MC05XXs2NH0kIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWxvZy1kaXJlY3RvcnkiOiAiXi92YXIvbG9nL3BvZHMvJChzYW5kYm94LW5hbWVzcGFjZSlfJChzYW5kYm94LW5hbWUpX1swLTlhLWZdezh9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezEyfSQiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZXNwYWNlIjogIiIsCiAgICAgICAgICAibmVyZGN0bC9uZXR3b3JrLW5hbWVzcGFjZSI6ICJeL3Zhci9ydW4vbmV0bnMvY25pLVswLTlhLWZdezh9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezEyfSQiCiAgICAgICAgfSwKICAgICAgICAiTGludXgiOiB7CiAgICAgICAgICAiTmFtZXNwYWNlcyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICJUeXBlIjogImlwYyIsCiAgICAgICAgICAgICAgIlBhdGgiOiAiIgogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgIlR5cGUiOiAidXRzIiwKICAgICAgICAgICAgICAiUGF0aCI6ICIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiVHlwZSI6ICJtb3VudCIsCiAgICAgICAgICAgICAgIlBhdGgiOiAiIgogICAgICAgICAgICB9CiAgICAgICAgICBdLAogICAgICAgICAgIk1hc2tlZFBhdGhzIjogWwogICAgICAgICAgICAiL3Byb2MvYWNwaSIsCiAgICAgICAgICAgICIvcHJvYy9hc291bmQiLAogICAgICAgICAgICAiL3Byb2Mva2NvcmUiLAogICAgICAgICAgICAiL3Byb2Mva2V5cyIsCiAgICAgICAgICAgICIvcHJvYy9sYXRlbmN5X3N0YXRzIiwKICAgICAgICAgICAgIi9wcm9jL3RpbWVyX2xpc3QiLAogICAgICAgICAgICAiL3Byb2MvdGltZXJfc3RhdHMiLAogICAgICAgICAgICAiL3Byb2Mvc2NoZWRfZGVidWciLAogICAgICAgICAgICAiL3N5cy9maXJtd2FyZSIsCiAgICAgICAgICAgICIvcHJvYy9zY3NpIgogICAgICAgICAgXSwKICAgICAgICAgICJSZWFkb25seVBhdGhzIjogWwogICAgICAgICAgICAiL3Byb2MvYnVzIiwKICAgICAgICAgICAgIi9wcm9jL2ZzIiwKICAgICAgICAgICAgIi9wcm9jL2lycSIsCiAgICAgICAgICAgICIvcHJvYy9zeXMiLAogICAgICAgICAgICAiL3Byb2Mvc3lzcnEtdHJpZ2dlciIKICAgICAgICAgIF0sCiAgICAgICAgICAiRGV2aWNlcyI6IFtdLAogICAgICAgICAgIlN5c2N0bCI6IHsKICAgICAgICAgICAgIm5ldC5pcHY0LmlwX3VucHJpdmlsZWdlZF9wb3J0X3N0YXJ0IjogIjAiLAogICAgICAgICAgICAibmV0LmlwdjQucGluZ19ncm91cF9yYW5nZSI6ICIwIDIxNDc0ODM2NDciCiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9LAogICAgICAic3RvcmFnZXMiOiBbCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJibGsiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogInRhciIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIiQoaGFzaDApIgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGxheWVyMCkiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJvdmVybGF5ZnMiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogImZ1c2UzLmthdGEtb3ZlcmxheSIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIjVhNWFhZDgwMDU1ZmYyMDAxMmE1MGRjMjVmOGRmN2EyOTkyNDQ3NDMyNGQ2NWY3ZDUzMDZlZThlZTI3ZmY3MWQiLAogICAgICAgICAgICAiODE3MjUwZjFhM2UzMzZkYTc2ZjViZDNmYTc4NGUxYjI2ZDk1OWI5YzEzMTg3NjgxNWJhMjYwNDA0OGI3MGMxOCIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChjcGF0aCkvJChidW5kbGUtaWQpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9CiAgICAgIF0sCiAgICAgICJkZXZpY2VzIjogW10sCiAgICAgICJzYW5kYm94X3BpZG5zIjogZmFsc2UsCiAgICAgICJleGVjX2NvbW1hbmRzIjogW10sCiAgICAgICJlbnZfbWFwIjogewogICAgICAgICJQQVRIIjogIi91c3IvbG9jYWwvc2JpbjovdXNyL2xvY2FsL2JpbjovdXNyL3NiaW46L3Vzci9iaW46L3NiaW46L2JpbiIKICAgICAgfQogICAgfSwKICAgIHsKICAgICAgIk9DSSI6IHsKICAgICAgICAiVmVyc2lvbiI6ICIxLjEuMC1yYy4xIiwKICAgICAgICAiUHJvY2VzcyI6IHsKICAgICAgICAgICJUZXJtaW5hbCI6IGZhbHNlLAogICAgICAgICAgIlVzZXIiOiB7CiAgICAgICAgICAgICJVSUQiOiA2NTUzNSwKICAgICAgICAgICAgIkdJRCI6IDY1NTM1LAogICAgICAgICAgICAiQWRkaXRpb25hbEdpZHMiOiBbXSwKICAgICAgICAgICAgIlVzZXJuYW1lIjogIiIKICAgICAgICAgIH0sCiAgICAgICAgICAiRGVwcmVjYXRlZEFyZ3MiOiBbCiAgICAgICAgICAgICIvcGF1c2UiCiAgICAgICAgICBdLAogICAgICAgICAgIkFyZ3MiOiBbCiAgICAgICAgICAgICIvcGF1c2UiCiAgICAgICAgICBdLAogICAgICAgICAgIkVudiI6IFsKICAgICAgICAgICAgIlBBVEg9L3Vzci9sb2NhbC9zYmluOi91c3IvbG9jYWwvYmluOi91c3Ivc2JpbjovdXNyL2Jpbjovc2JpbjovYmluIiwKICAgICAgICAgICAgIkhPU1ROQU1FPSQoaG9zdC1uYW1lKSIKICAgICAgICAgIF0sCiAgICAgICAgICAiQ3dkIjogIi8iLAogICAgICAgICAgIkNhcGFiaWxpdGllcyI6IHsKICAgICAgICAgICAgIkFtYmllbnQiOiBbXSwKICAgICAgICAgICAgIkJvdW5kaW5nIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJFZmZlY3RpdmUiOiBbCiAgICAgICAgICAgICAgIiQoZGVmYXVsdF9jYXBzKSIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgIkluaGVyaXRhYmxlIjogW10sCiAgICAgICAgICAgICJQZXJtaXR0ZWQiOiBbCiAgICAgICAgICAgICAgIiQoZGVmYXVsdF9jYXBzKSIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgICJOb05ld1ByaXZpbGVnZXMiOiBmYWxzZQogICAgICAgIH0sCiAgICAgICAgIlJvb3QiOiB7CiAgICAgICAgICAiUGF0aCI6ICIkKGNwYXRoKS8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgIlJlYWRvbmx5IjogZmFsc2UKICAgICAgICB9LAogICAgICAgICJNb3VudHMiOiBbCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvcHJvYyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAicHJvYyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJwcm9jIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAgICAgIm5vZGV2IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2RldiIsCiAgICAgICAgICAgICJzb3VyY2UiOiAidG1wZnMiLAogICAgICAgICAgICAidHlwZV8iOiAidG1wZnMiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAic3RyaWN0YXRpbWUiLAogICAgICAgICAgICAgICJtb2RlPTc1NSIsCiAgICAgICAgICAgICAgInNpemU9NjU1MzZrIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi9wdHMiLAogICAgICAgICAgICAic291cmNlIjogImRldnB0cyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJkZXZwdHMiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibmV3aW5zdGFuY2UiLAogICAgICAgICAgICAgICJwdG14bW9kZT0wNjY2IiwKICAgICAgICAgICAgICAibW9kZT0wNjIwIiwKICAgICAgICAgICAgICAiZ2lkPTUiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L3NobSIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiL3J1bi9rYXRhLWNvbnRhaW5lcnMvc2FuZGJveC9zaG0iLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvbXF1ZXVlIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJtcXVldWUiLAogICAgICAgICAgICAidHlwZV8iOiAibXF1ZXVlIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAgICAgIm5vZGV2IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL3N5cyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAic3lzZnMiLAogICAgICAgICAgICAidHlwZV8iOiAic3lzZnMiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiLAogICAgICAgICAgICAgICJybyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9zeXMvZnMvY2dyb3VwIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJjZ3JvdXAiLAogICAgICAgICAgICAidHlwZV8iOiAiY2dyb3VwIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAgICAgIm5vZGV2IiwKICAgICAgICAgICAgICAicmVsYXRpbWUiLAogICAgICAgICAgICAgICJybyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9ldGMvaG9zdHMiLAogICAgICAgICAgICAic291cmNlIjogIiQoc2ZwcmVmaXgpaG9zdHMkIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJ3IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi90ZXJtaW5hdGlvbi1sb2ciLAogICAgICAgICAgICAic291cmNlIjogIiQoc2ZwcmVmaXgpdGVybWluYXRpb24tbG9nJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJydyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9ldGMvaG9zdG5hbWUiLAogICAgICAgICAgICAic291cmNlIjogIiQoc2ZwcmVmaXgpaG9zdG5hbWUkIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJ3IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2V0Yy9yZXNvbHYuY29uZiIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClyZXNvbHYuY29uZiQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicnciCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvdmFyL3J1bi9zZWNyZXRzL2t1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQiLAogICAgICAgICAgICAic291cmNlIjogIiQoc2ZwcmVmaXgpc2VydmljZWFjY291bnQkIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL3Zhci9ydW4vc2VjcmV0cy9henVyZS90b2tlbnMiLAogICAgICAgICAgICAic291cmNlIjogIiQoc2ZwcmVmaXgpdG9rZW5zJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJybyIKICAgICAgICAgICAgXQogICAgICAgICAgfQogICAgICAgIF0sCiAgICAgICAgIkFubm90YXRpb25zIjogewogICAgICAgICAgImlvLmthdGFjb250YWluZXJzLnBrZy5vY2kuYnVuZGxlX3BhdGgiOiAiL3J1bi9jb250YWluZXJkL2lvLmNvbnRhaW5lcmQucnVudGltZS52Mi50YXNrL2s4cy5pby8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgImlvLmthdGFjb250YWluZXJzLnBrZy5vY2kuY29udGFpbmVyX3R5cGUiOiAicG9kX2NvbnRhaW5lciIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLW5hbWUiOiAibW9jay1jb250YWluZXIiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLmNvbnRhaW5lci10eXBlIjogImNvbnRhaW5lciIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuaW1hZ2UtbmFtZSI6ICJyZWdpc3RyeS5rOHMuaW8vcGF1c2U6My45IiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWlkIjogIl5bYS16MC05XXs2NH0kIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LW5hbWVzcGFjZSI6ICIiCiAgICAgICAgfSwKICAgICAgICAiTGludXgiOiB7CiAgICAgICAgICAiTmFtZXNwYWNlcyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICJUeXBlIjogImlwYyIsCiAgICAgICAgICAgICAgIlBhdGgiOiAiIgogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgIlR5cGUiOiAidXRzIiwKICAgICAgICAgICAgICAiUGF0aCI6ICIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiVHlwZSI6ICJtb3VudCIsCiAgICAgICAgICAgICAgIlBhdGgiOiAiIgogICAgICAgICAgICB9CiAgICAgICAgICBdLAogICAgICAgICAgIk1hc2tlZFBhdGhzIjogWwogICAgICAgICAgICAiL3Byb2MvYWNwaSIsCiAgICAgICAgICAgICIvcHJvYy9rY29yZSIsCiAgICAgICAgICAgICIvcHJvYy9rZXlzIiwKICAgICAgICAgICAgIi9wcm9jL2xhdGVuY3lfc3RhdHMiLAogICAgICAgICAgICAiL3Byb2MvdGltZXJfbGlzdCIsCiAgICAgICAgICAgICIvcHJvYy90aW1lcl9zdGF0cyIsCiAgICAgICAgICAgICIvcHJvYy9zY2hlZF9kZWJ1ZyIsCiAgICAgICAgICAgICIvcHJvYy9zY3NpIiwKICAgICAgICAgICAgIi9zeXMvZmlybXdhcmUiCiAgICAgICAgICBdLAogICAgICAgICAgIlJlYWRvbmx5UGF0aHMiOiBbCiAgICAgICAgICAgICIvcHJvYy9hc291bmQiLAogICAgICAgICAgICAiL3Byb2MvYnVzIiwKICAgICAgICAgICAgIi9wcm9jL2ZzIiwKICAgICAgICAgICAgIi9wcm9jL2lycSIsCiAgICAgICAgICAgICIvcHJvYy9zeXMiLAogICAgICAgICAgICAiL3Byb2Mvc3lzcnEtdHJpZ2dlciIKICAgICAgICAgIF0sCiAgICAgICAgICAiRGV2aWNlcyI6IFtdLAogICAgICAgICAgIlN5c2N0bCI6IHsKICAgICAgICAgICAgIm5ldC5pcHY0LmlwX3VucHJpdmlsZWdlZF9wb3J0X3N0YXJ0IjogIjAiLAogICAgICAgICAgICAibmV0LmlwdjQucGluZ19ncm91cF9yYW5nZSI6ICIwIDIxNDc0ODM2NDciCiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9LAogICAgICAic3RvcmFnZXMiOiBbCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJibGsiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogInRhciIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIiQoaGFzaDApIgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGxheWVyMCkiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJvdmVybGF5ZnMiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogImZ1c2UzLmthdGEtb3ZlcmxheSIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgImQwMzQwMGUyNGI3ZGY1M2FhMjkzOTU5YTVmNmZiYTgyZjAxZTczYjk5NmVlYjMzMDljMmY3MzY4YTI1OWE2NDUiLAogICAgICAgICAgICAiYWFjZTgzNDRkODRjNjRiMTQxZDQ4MjRhOWJjNDJjN2Y3NjY2MTljYzVlZmM3MTA3MmFmYzdhZjFkZmE2NjY1MCIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChjcGF0aCkvJChidW5kbGUtaWQpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9CiAgICAgIF0sCiAgICAgICJkZXZpY2VzIjogW10sCiAgICAgICJzYW5kYm94X3BpZG5zIjogZmFsc2UsCiAgICAgICJleGVjX2NvbW1hbmRzIjogW10sCiAgICAgICJlbnZfbWFwIjogewogICAgICAgICJIT1NUTkFNRSI6ICIkKGhvc3QtbmFtZSkiLAogICAgICAgICJQQVRIIjogIi91c3IvbG9jYWwvc2JpbjovdXNyL2xvY2FsL2JpbjovdXNyL3NiaW46L3Vzci9iaW46L3NiaW46L2JpbiIKICAgICAgfQogICAgfQogIF0sCiAgImNvbW1vbiI6IHsKICAgICJjcGF0aCI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zaGFyZWQvY29udGFpbmVycyIsCiAgICAibW91bnRfc291cmNlX2NwYXRoIjogIi9ydW4va2F0YS1jb250YWluZXJzL3NoYXJlZC9jb250YWluZXJzIiwKICAgICJzZnByZWZpeCI6ICJeJChjcGF0aCkvJChidW5kbGUtaWQpLVthLXowLTldezE2fS0iLAogICAgInNwYXRoIjogIi9ydW4va2F0YS1jb250YWluZXJzL3NhbmRib3gvc3RvcmFnZSIsCiAgICAiaXB2NF9hIjogIigoWzAtOV18WzEtOV1bMC05XXwxWzAtOV17Mn18MlswLTRdWzAtOV18MjVbMC01XSlcXC4pezN9KFswLTldfFsxLTldWzAtOV18MVswLTldezJ9fDJbMC00XVswLTldfDI1WzAtNV0pIiwKICAgICJpcF9wIjogIlswLTldezEsNX0iLAogICAgInN2Y19uYW1lIjogIltBLVpfXFwuXFwtXSsiLAogICAgImRuc19sYWJlbCI6ICJbYS16QS1aMC05X1xcLlxcLV0rIiwKICAgICJzX3NvdXJjZTEiOiAiXi4uMlswLTldezN9X1swLTFdWzAtOV1fWzAtM11bMC05XV9bMC0yXVswLTldX1swLTVdWzAtOV1fWzAtNV1bMC05XVxcLlswLTldezEsMTB9JCIsCiAgICAic19zb3VyY2UyIjogIl4uLmRhdGEvIiwKICAgICJkbnNfc3ViZG9tYWluIjogIl5bYS16MC05XShbLWEtejAtOV0qW2EtejAtOV0pPyQiLAogICAgInBvZF91aWQiOiAiXlswLTlhLWZBLUZdezh9LVswLTlhLWZBLUZdezR9LVswLTlhLWZBLUZdezR9LVswLTlhLWZBLUZdezR9LVswLTlhLWZBLUZdezEyfSQiLAogICAgImRlZmF1bHRfY2FwcyI6IFsKICAgICAgIkNBUF9DSE9XTiIsCiAgICAgICJDQVBfREFDX09WRVJSSURFIiwKICAgICAgIkNBUF9GU0VUSUQiLAogICAgICAiQ0FQX0ZPV05FUiIsCiAgICAgICJDQVBfTUtOT0QiLAogICAgICAiQ0FQX05FVF9SQVciLAogICAgICAiQ0FQX1NFVEdJRCIsCiAgICAgICJDQVBfU0VUVUlEIiwKICAgICAgIkNBUF9TRVRGQ0FQIiwKICAgICAgIkNBUF9TRVRQQ0FQIiwKICAgICAgIkNBUF9ORVRfQklORF9TRVJWSUNFIiwKICAgICAgIkNBUF9TWVNfQ0hST09UIiwKICAgICAgIkNBUF9LSUxMIiwKICAgICAgIkNBUF9BVURJVF9XUklURSIKICAgIF0sCiAgICAicHJpdmlsZWdlZF9jYXBzIjogWwogICAgICAiQ0FQX0NIT1dOIiwKICAgICAgIkNBUF9EQUNfT1ZFUlJJREUiLAogICAgICAiQ0FQX0RBQ19SRUFEX1NFQVJDSCIsCiAgICAgICJDQVBfRk9XTkVSIiwKICAgICAgIkNBUF9GU0VUSUQiLAogICAgICAiQ0FQX0tJTEwiLAogICAgICAiQ0FQX1NFVEdJRCIsCiAgICAgICJDQVBfU0VUVUlEIiwKICAgICAgIkNBUF9TRVRQQ0FQIiwKICAgICAgIkNBUF9MSU5VWF9JTU1VVEFCTEUiLAogICAgICAiQ0FQX05FVF9CSU5EX1NFUlZJQ0UiLAogICAgICAiQ0FQX05FVF9CUk9BRENBU1QiLAogICAgICAiQ0FQX05FVF9BRE1JTiIsCiAgICAgICJDQVBfTkVUX1JBVyIsCiAgICAgICJDQVBfSVBDX0xPQ0siLAogICAgICAiQ0FQX0lQQ19PV05FUiIsCiAgICAgICJDQVBfU1lTX01PRFVMRSIsCiAgICAgICJDQVBfU1lTX1JBV0lPIiwKICAgICAgIkNBUF9TWVNfQ0hST09UIiwKICAgICAgIkNBUF9TWVNfUFRSQUNFIiwKICAgICAgIkNBUF9TWVNfUEFDQ1QiLAogICAgICAiQ0FQX1NZU19BRE1JTiIsCiAgICAgICJDQVBfU1lTX0JPT1QiLAogICAgICAiQ0FQX1NZU19OSUNFIiwKICAgICAgIkNBUF9TWVNfUkVTT1VSQ0UiLAogICAgICAiQ0FQX1NZU19USU1FIiwKICAgICAgIkNBUF9TWVNfVFRZX0NPTkZJRyIsCiAgICAgICJDQVBfTUtOT0QiLAogICAgICAiQ0FQX0xFQVNFIiwKICAgICAgIkNBUF9BVURJVF9XUklURSIsCiAgICAgICJDQVBfQVVESVRfQ09OVFJPTCIsCiAgICAgICJDQVBfU0VURkNBUCIsCiAgICAgICJDQVBfTUFDX09WRVJSSURFIiwKICAgICAgIkNBUF9NQUNfQURNSU4iLAogICAgICAiQ0FQX1NZU0xPRyIsCiAgICAgICJDQVBfV0FLRV9BTEFSTSIsCiAgICAgICJDQVBfQkxPQ0tfU1VTUEVORCIsCiAgICAgICJDQVBfQVVESVRfUkVBRCIsCiAgICAgICJDQVBfUEVSRk1PTiIsCiAgICAgICJDQVBfQlBGIiwKICAgICAgIkNBUF9DSEVDS1BPSU5UX1JFU1RPUkUiCiAgICBdLAogICAgInZpcnRpb19ibGtfc3RvcmFnZV9jbGFzc2VzIjogWwogICAgICAiY2MtbG9jYWwtY3NpIiwKICAgICAgImNjLW1hbmFnZWQtY3NpIiwKICAgICAgImNjLW1hbmFnZWQtcHJlbWl1bS1jc2kiCiAgICBdLAogICAgInNtYl9zdG9yYWdlX2NsYXNzZXMiOiBbCiAgICAgIHsKICAgICAgICAibmFtZSI6ICJhenVyZWZpbGUtY3NpLWthdGEtY2MiLAogICAgICAgICJtb3VudF9vcHRpb25zIjogWwogICAgICAgICAgImRpcl9tb2RlPTA3NzciLAogICAgICAgICAgImZpbGVfbW9kZT0wNzc3IiwKICAgICAgICAgICJtZnN5bWxpbmtzIiwKICAgICAgICAgICJjYWNoZT1zdHJpY3QiLAogICAgICAgICAgIm5vc2hhcmVzb2NrIiwKICAgICAgICAgICJhY3RpbWVvPTMwIiwKICAgICAgICAgICJub2JybCIKICAgICAgICBdCiAgICAgIH0KICAgIF0KICB9LAogICJzYW5kYm94IjogewogICAgInN0b3JhZ2VzIjogWwogICAgICB7CiAgICAgICAgImRyaXZlciI6ICJlcGhlbWVyYWwiLAogICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICJzb3VyY2UiOiAic2htIiwKICAgICAgICAiZnN0eXBlIjogInRtcGZzIiwKICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAibm9kZXYiLAogICAgICAgICAgIm1vZGU9MTc3NyIsCiAgICAgICAgICAic2l6ZT02NzEwODg2NCIKICAgICAgICBdLAogICAgICAgICJtb3VudF9wb2ludCI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L3NobSIsCiAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICB9CiAgICBdCiAgfSwKICAicmVxdWVzdF9kZWZhdWx0cyI6IHsKICAgICJDcmVhdGVDb250YWluZXJSZXF1ZXN0IjogewogICAgICAiYWxsb3dfZW52X3JlZ2V4IjogWwogICAgICAgICJeSE9TVE5BTUU9JChkbnNfbGFiZWwpJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9QT1JUXyQoaXBfcClfVENQPXRjcDovLyQoaXB2NF9hKTokKGlwX3ApJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9QT1JUXyQoaXBfcClfVENQX1BST1RPPXRjcCQiLAogICAgICAgICJeJChzdmNfbmFtZSlfUE9SVF8kKGlwX3ApX1RDUF9QT1JUPSQoaXBfcCkkIiwKICAgICAgICAiXiQoc3ZjX25hbWUpX1BPUlRfJChpcF9wKV9UQ1BfQUREUj0kKGlwdjRfYSkkIiwKICAgICAgICAiXiQoc3ZjX25hbWUpX1NFUlZJQ0VfSE9TVD0kKGlwdjRfYSkkIiwKICAgICAgICAiXiQoc3ZjX25hbWUpX1NFUlZJQ0VfUE9SVD0kKGlwX3ApJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9TRVJWSUNFX1BPUlRfJChkbnNfbGFiZWwpPSQoaXBfcCkkIiwKICAgICAgICAiXiQoc3ZjX25hbWUpX1BPUlQ9dGNwOi8vJChpcHY0X2EpOiQoaXBfcCkkIiwKICAgICAgICAiXkFaVVJFX0NMSUVOVF9JRD1bQS1GYS1mMC05LV0qJCIsCiAgICAgICAgIl5BWlVSRV9URU5BTlRfSUQ9W0EtRmEtZjAtOS1dKiQiLAogICAgICAgICJeQVpVUkVfRkVERVJBVEVEX1RPS0VOX0ZJTEU9L3Zhci9ydW4vc2VjcmV0cy9henVyZS90b2tlbnMvYXp1cmUtaWRlbnRpdHktdG9rZW4kIiwKICAgICAgICAiXkFaVVJFX0FVVEhPUklUWV9IT1NUPWh0dHBzOi8vbG9naW5cXC5taWNyb3NvZnRvbmxpbmVcXC5jb20vJCIsCiAgICAgICAgIl5URVJNPXh0ZXJtJCIKICAgICAgXSwKICAgICAgImFsbG93X2Vudl9yZWdleF9tYXAiOiB7CiAgICAgICAgIkNQVV9MSU1JVCI6ICJeWzAtOV0rJCIsCiAgICAgICAgIkpPQl9DT01QTEVUSU9OX0lOREVYIjogIl5bMC05XSokIiwKICAgICAgICAiTUVNT1JZX0xJTUlUIjogIl5bMC05XSskIgogICAgICB9CiAgICB9LAogICAgIkNvcHlGaWxlUmVxdWVzdCI6IFsKICAgICAgIiQoc2ZwcmVmaXgpIgogICAgXSwKICAgICJFeGVjUHJvY2Vzc1JlcXVlc3QiOiB7CiAgICAgICJhbGxvd2VkX2NvbW1hbmRzIjogW10sCiAgICAgICJyZWdleCI6IFtdCiAgICB9LAogICAgIlVwZGF0ZVJvdXRlc1JlcXVlc3QiOiB7CiAgICAgICJmb3JiaWRkZW5fZGV2aWNlX25hbWVzIjogWwogICAgICAgICJsbyIKICAgICAgXSwKICAgICAgImZvcmJpZGRlbl9zb3VyY2VfcmVnZXgiOiBbCiAgICAgICAgIl4oPzowezAsNH06KXswLDd9MHswLDN9MSQiLAogICAgICAgICJeMTI3XFwuKD86WzAtOV17MSwzfVxcLil7Mn1bMC05XXsxLDN9JCIKICAgICAgXQogICAgfSwKICAgICJVcGRhdGVJbnRlcmZhY2VSZXF1ZXN0IjogewogICAgICAiYWxsb3dfcmF3X2ZsYWdzIjogMTI4LAogICAgICAiZm9yYmlkZGVuX25hbWVzIjogWwogICAgICAgICJsbyIKICAgICAgXSwKICAgICAgImZvcmJpZGRlbl9od19hZGRycyI6IFsKICAgICAgICAiMDA6MDA6MDA6MDA6MDA6MDAiCiAgICAgIF0KICAgIH0sCiAgICAiQ2xvc2VTdGRpblJlcXVlc3QiOiBmYWxzZSwKICAgICJSZWFkU3RyZWFtUmVxdWVzdCI6IGZhbHNlLAogICAgIlVwZGF0ZUVwaGVtZXJhbE1vdW50c1JlcXVlc3QiOiBmYWxzZSwKICAgICJXcml0ZVN0cmVhbVJlcXVlc3QiOiBmYWxzZQogIH0KfQ== + spec: + runtimeClassName: kata-cc + containers: + - name: mock-container + image: "registry.k8s.io/pause:3.9" diff --git a/src/agent/samples/policy/yaml/kubernetes/fixtures/namespace.yaml b/src/agent/samples/policy/yaml/kubernetes/fixtures/namespace.yaml new file mode 100644 index 000000000000..7f432a0a16c7 --- /dev/null +++ b/src/agent/samples/policy/yaml/kubernetes/fixtures/namespace.yaml @@ -0,0 +1,5 @@ +--- +apiVersion: v1 +kind: Namespace +metadata: + name: limit-example diff --git a/src/agent/samples/policy/yaml/kubernetes/fixtures/quota.yaml b/src/agent/samples/policy/yaml/kubernetes/fixtures/quota.yaml new file mode 100644 index 000000000000..1725758df743 --- /dev/null +++ b/src/agent/samples/policy/yaml/kubernetes/fixtures/quota.yaml @@ -0,0 +1,15 @@ +--- +apiVersion: v1 +kind: ResourceQuota +metadata: + name: quota +spec: + hard: + cpu: "20" + memory: 1Gi + persistentvolumeclaims: "10" + pods: "10" + replicationcontrollers: "20" + resourcequotas: "1" + secrets: "10" + services: "5" diff --git a/src/agent/samples/policy/yaml/kubernetes/fixtures/rc-lastapplied.yaml b/src/agent/samples/policy/yaml/kubernetes/fixtures/rc-lastapplied.yaml new file mode 100644 index 000000000000..9af5874a18c9 --- /dev/null +++ b/src/agent/samples/policy/yaml/kubernetes/fixtures/rc-lastapplied.yaml @@ -0,0 +1,24 @@ +--- +apiVersion: v1 +kind: ReplicationController +metadata: + name: test-rc + labels: + name: test-rc + annotations: + kubectl.kubernetes.io/last-applied-configuration: "{\"test\":1234}\n" +spec: + replicas: 1 + template: + metadata: + labels: + name: test-rc + annotations: + io.katacontainers.config.agent.policy: IyBDb3B5cmlnaHQgKGMpIDIwMjMgTWljcm9zb2Z0IENvcnBvcmF0aW9uCiMKIyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMAojCnBhY2thZ2UgYWdlbnRfcG9saWN5CgppbXBvcnQgZnV0dXJlLmtleXdvcmRzLmluCmltcG9ydCBmdXR1cmUua2V5d29yZHMuZXZlcnkKCiMgRGVmYXVsdCB2YWx1ZXMsIHJldHVybmVkIGJ5IE9QQSB3aGVuIHJ1bGVzIGNhbm5vdCBiZSBldmFsdWF0ZWQgdG8gdHJ1ZS4KZGVmYXVsdCBBZGRBUlBOZWlnaGJvcnNSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgQWRkU3dhcFJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBDbG9zZVN0ZGluUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IENvcHlGaWxlUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IENyZWF0ZUNvbnRhaW5lclJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBDcmVhdGVTYW5kYm94UmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IERlc3Ryb3lTYW5kYm94UmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgRXhlY1Byb2Nlc3NSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgR2V0T09NRXZlbnRSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBHdWVzdERldGFpbHNSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBMaXN0SW50ZXJmYWNlc1JlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBMaXN0Um91dGVzUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IE1lbUhvdHBsdWdCeVByb2JlUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IE9ubGluZUNQVU1lbVJlcXVlc3QgOj0gdHJ1ZQpkZWZhdWx0IFBhdXNlQ29udGFpbmVyUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFJlYWRTdHJlYW1SZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgUmVtb3ZlQ29udGFpbmVyUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgUmVtb3ZlU3RhbGVWaXJ0aW9mc1NoYXJlTW91bnRzUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgUmVzZWVkUmFuZG9tRGV2UmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFJlc3VtZUNvbnRhaW5lclJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBTZXRHdWVzdERhdGVUaW1lUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFNldFBvbGljeVJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBTaWduYWxQcm9jZXNzUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgU3RhcnRDb250YWluZXJSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBTdGFydFRyYWNpbmdSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgU3RhdHNDb250YWluZXJSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBTdG9wVHJhY2luZ1JlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBUdHlXaW5SZXNpemVSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBVcGRhdGVDb250YWluZXJSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgVXBkYXRlRXBoZW1lcmFsTW91bnRzUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFVwZGF0ZUludGVyZmFjZVJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBVcGRhdGVSb3V0ZXNSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgV2FpdFByb2Nlc3NSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBXcml0ZVN0cmVhbVJlcXVlc3QgOj0gZmFsc2UKCiMgQWxsb3dSZXF1ZXN0c0ZhaWxpbmdQb2xpY3kgOj0gdHJ1ZSBjb25maWd1cmVzIHRoZSBBZ2VudCB0byAqYWxsb3cgYW55CiMgcmVxdWVzdHMgY2F1c2luZyBhIHBvbGljeSBmYWlsdXJlKi4gVGhpcyBpcyBhbiB1bnNlY3VyZSBjb25maWd1cmF0aW9uCiMgYnV0IGlzIHVzZWZ1bCBmb3IgYWxsb3dpbmcgdW5zZWN1cmUgcG9kcyB0byBzdGFydCwgdGhlbiBjb25uZWN0IHRvCiMgdGhlbSBhbmQgaW5zcGVjdCBPUEEgbG9ncyBmb3IgdGhlIHJvb3QgY2F1c2Ugb2YgYSBmYWlsdXJlLgpkZWZhdWx0IEFsbG93UmVxdWVzdHNGYWlsaW5nUG9saWN5IDo9IGZhbHNlCgojIENvbnN0YW50cwpTX05BTUVfS0VZID0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZSIKU19OQU1FU1BBQ0VfS0VZID0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZXNwYWNlIgpCVU5ETEVfSUQgPSAiW2EtejAtOV17NjR9IgoKQ3JlYXRlQ29udGFpbmVyUmVxdWVzdDo9IHJlc3AgewogICAgbm90IGlzX251bGwoaW5wdXQuZW52X21hcCkKICAgIAogICAgaV9lbnZfbWFwIDo9IGlucHV0LmVudl9tYXAKICAgIAogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBwX2Vudl9tYXAgOj0gcF9jb250YWluZXIuZW52X21hcCAgCiAgICBhbGxvd19lbnZfbWFwKHBfZW52X21hcCwgaV9lbnZfbWFwKQogICAgCiAgICBpX3Byb2Nlc3MgOj0gaW5wdXQuYmFzZS5PQ0kuUHJvY2VzcwogICAgCiAgICBwX3Byb2Nlc3MgOj0gcF9jb250YWluZXIuT0NJLlByb2Nlc3MKICAgIAogICAgYWxsb3dfYXJncyhpX3Byb2Nlc3MsIHBfcHJvY2VzcywgaV9lbnZfbWFwKQoKICAgIHJlc3AgPSBDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uKGlucHV0LmJhc2UpCiAgICBwcmludCgiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdDogdHJ1ZSIpCn0KCmFsbG93X2FyZ3MoaV9wcm9jZXNzLCBwX3Byb2Nlc3MsIGlfZW52X21hcCkgewogICAgaV9hcmdzIDo9IGlfcHJvY2Vzcy5BcmdzCiAgICBwX2FyZ3MgOj0gcF9wcm9jZXNzLkFyZ3MKICAgIHByaW50KCJhbGxvd19hcmdzOiBpX2FyZ3MgPSIsIGlfYXJncywgInBfYXJncyA9IiwgcF9hcmdzKQogICAgY291bnQoaV9hcmdzKSA9PSBjb3VudChwX2FyZ3MpCiAgICBldmVyeSBpLCBpX2FyZyBpbiBpX2FyZ3MgewogICAgICAgIHByaW50KCJhbGxvd19hcmdzOiBpX2FyZyA9IiwgaV9hcmcpCiAgICAgICAgcF9hcmdfcmVwbGFjZWQgOj0gcmVwbGFjZV9lbnZfdmFyaWFibGVzKHBfYXJnc1tpXSwgaV9lbnZfbWFwKQogICAgICAgIHByaW50KCJhbGxvd19hcmdzOiBwX2FyZ19yZXBsYWNlZCA9IiwgcF9hcmdfcmVwbGFjZWQpCiAgICAgICAgcF9hcmdfcmVwbGFjZWQyIDo9IHJlcGxhY2UocF9hcmdfcmVwbGFjZWQsICIkJCIsICIkIikKICAgICAgICBwcmludCgiYWxsb3dfYXJnczogcF9hcmdfcmVwbGFjZWQyID0iLCBwX2FyZ19yZXBsYWNlZDIpCiAgICAgICAgaV9hcmcgPT0gcF9hcmdfcmVwbGFjZWQyCiAgICB9CiAgICBwcmludCgiYWxsb3dfYXJnczogdHJ1ZSIpCn0KCmFsbG93X2FyZ3MoaV9wcm9jZXNzLCBwX3Byb2Nlc3MsIGlfZW52X21hcCkgewogICAgbm90IGlfcHJvY2Vzcy5BcmdzCiAgICBub3QgcF9wcm9jZXNzLkFyZ3MKICAgIHByaW50KCJhbGxvd19hcmdzMjogbm8gYXJncyIpCn0KCiMgdGhpcyBmdW5jdGlvbiByZXBsYWNlcyBhbGwgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyBpbiBhIHN0cmluZywgZ2l2ZW4gYSBtYXAgb2YgZW52aXJvbm1lbnQga2V5cyB0byBlbnZpcm9ubWVudCB2YWx1ZXMKIyBlZyBzdHIgPSAiZWNobyAkKENMVVNURVJfSUQpOyBlY2hvICQoTk9ERV9OQU1FKTsiCiMgZW52X21hcCA9IHsiQ0xVU1RFUl9JRCI6ICJhYmMiLCAiTk9ERV9OQU1FIiA6ICJ4eXoifQojIHJlc3VsdCA9ICJlY2hvIGFiYzsgZWNobyB4eXo7IgpyZXBsYWNlX2Vudl92YXJpYWJsZXMoc3RyLCBlbnZfbWFwKSA9IHJlc3VsdCB7CiAgICAjIG1ha2UgYW4gYXJyYXkgb2YgdGhlIGtleXMgZWcgWyJDTFVTVEVSX0lEIiwgIk5PREVfTkFNRSJdCiAgICBrZXlzIDo9IFt4IHwgc29tZSB4IGluIG9iamVjdC5rZXlzKGVudl9tYXApXQogICAgcmVzdWx0IDo9IHJlcGxhY2Vfc3RyX3JlYyhzdHIsIGVudl9tYXAsIGtleXMsIGNvdW50KGtleXMpIC0gMSkKfQoKIyBiYXNlIGNhc2UKcmVwbGFjZV9zdHJfcmVjKHN0ciwgZW52X21hcCwgYXJyX2tleXMsIGkpID0gcmVzdWx0IHsKICAgIGkgPCAwCiAgICByZXN1bHQgOj0gc3RyCn0KCiMgcmVjdXJzaXZlIHN0ZXAKcmVwbGFjZV9zdHJfcmVjKHN0ciwgZW52X21hcCwgYXJyX2tleXMsIGkpID0gcmVzdWx0IHsKICAgIGkgPj0gMAogICAga2V5IDo9IGFycl9rZXlzW2ldCiAgICBlbnZfa2V5MSA6PSBjb25jYXQoIiIsIFsiJCgiLCBrZXksICIpIl0pCiAgICAjIHJlcGxhY2UgJChWQVIpIHdpdGggdmFsdWUKICAgIG5ld19zdHIxIDo9IHJlcGxhY2Uoc3RyLCBlbnZfa2V5MSwgZW52X21hcFtrZXldKQogICAgIyByZXBsYWNlIG5leHQgZW52aXJvbm1lbnQgdmFyaWFibGUKICAgIHJlc3VsdCA9IHJlcGxhY2Vfc3RyX3JlYyhuZXdfc3RyMSwgZW52X21hcCwgYXJyX2tleXMsIGkgLSAxKQp9CgphbGxvd19lbnZfbWFwKHBfZW52X21hcCwgaV9lbnZfbWFwKSB7CiAgICBwcmludCgiYWxsb3dfZW52X21hcDogcF9lbnZfbWFwID0iLCBwX2Vudl9tYXApCiAgICBldmVyeSBlbnZfa2V5LCBlbnZfdmFsIGluIGlfZW52X21hcCB7CiAgICAgICAgcHJpbnQoImFsbG93X2VudjogZW52X2tleSA9IiwgZW52X2tleSwgImVudl92YWwgPSIsIGVudl92YWwpCiAgICAgICAgYWxsb3dfZW52X21hcF9lbnRyeShlbnZfa2V5LCBlbnZfdmFsLCBwX2Vudl9tYXApCiAgICB9CiAgICBwcmludCgiYWxsb3dfZW52X21hcDogdHJ1ZSIpCn0KCiMgQWxsb3cgZXhhY3QgbWF0Y2gKYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBpX3ZhbCA9PSBwX3ZhbAogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnk6IHRydWUiKQp9CgojIEFsbG93IHJlc291cmNlRmllbGRSZWYgdmFsdWVzIChlLmcuLCAibGltaXRzLmNwdSIpLgphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgICMgYSB2YXJpYWJsZSB3ZSBzaG91bGQgYmUgdmFsaWRhdGluZyB1c2luZyBhIHJlZ2V4IGZyb20gc2V0dGluZ3MKICAgIHBfdmFsID09ICIkKHZhbGlkYXRlLWZyb20tc2V0dGluZ3MpIgogICAgcmVnZXhfdmFsIDo9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuQ3JlYXRlQ29udGFpbmVyUmVxdWVzdC5hbGxvd19lbnZfcmVnZXhfbWFwW2tleV0KICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4X3ZhbCwgaV92YWwpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSAyOiB0cnVlIikKfQoKIyBBbGxvdyBub2RlLW5hbWUKYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChub2RlLW5hbWUpIgogICAgcmVnZXgubWF0Y2gocG9saWN5X2RhdGEuY29tbW9uLmRuc19zdWJkb21haW4gLCBpX3ZhbCkKICAgIHByaW50KCJhbGxvd19lbnZfbWFwX2VudHJ5IDM6IHRydWUiKQp9CgojIEFsbG93IGhvc3QtbmFtZQphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgIHBfdmFsID09ICIkKGhvc3QtbmFtZSkiCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24uZG5zX2xhYmVsICwgaV92YWwpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSA0OiB0cnVlIikKfQoKIyBBbGxvdyBwb2QtdWlkCmFsbG93X2Vudl9tYXBfZW50cnkoa2V5LCBpX3ZhbCwgcF9lbnZfbWFwKSB7CiAgICBwX3ZhbCA6PSBwX2Vudl9tYXBba2V5XQogICAgcF92YWwgPT0gIiQocG9kLXVpZCkiCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24ucG9kX3VpZCAsIGlfdmFsKQogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgNTogdHJ1ZSIpCn0KCiMgQWxsb3cgZmllbGRSZWYgImZpZWxkUGF0aDogc3RhdHVzLnBvZElQIiB2YWx1ZXMuCmFsbG93X2Vudl9tYXBfZW50cnkoa2V5LCBpX3ZhbCwgcF9lbnZfbWFwKSB7CiAgICBpc19pcChpX3ZhbCkKCiAgICBwX3ZhbCA6PSBwX2Vudl9tYXBba2V5XQogICAgcF92YXIgOj0gY29uY2F0KCI9IiwgW2tleSwgcF92YWxdKQogICAgYWxsb3dfcG9kX2lwX3ZhcihrZXksIHBfdmFyKQogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgNjogdHJ1ZSIpCn0KCiMgQWxsb3cgZmllbGRSZWYgImZpZWxkUGF0aDogc3RhdHVzLmhvc3RJUCIgdmFsdWVzLgphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgaXNfaXAoaV92YWwpCgogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgIHBfdmFyIDo9IGNvbmNhdCgiPSIsIFtrZXksIHBfdmFsXSkKICAgIGFsbG93X2hvc3RfaXBfdmFyKGtleSwgcF92YXIpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSA3OiB0cnVlIikKfQoKIyBNYXRjaCBpbnB1dCB3aXRoIG9uZSBvZiB0aGUgcG9saWN5IHZhcmlhYmxlcywgYWZ0ZXIgc3Vic3RpdHV0aW5nICQoc2FuZGJveC1uYW1lKS4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChzYW5kYm94LW5hbWUpIgogICAgc19uYW1lIDo9IGlucHV0LmJhc2UuT0NJLkFubm90YXRpb25zW1NfTkFNRV9LRVldCiAgICBwX3ZhcjIgOj0gcmVwbGFjZShwX3ZhbCwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHBfdmFyMiA9PSBpX3ZhbAogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgODogdHJ1ZSIpCn0KCiMgTWF0Y2ggaW5wdXQgd2l0aCBvbmUgb2YgdGhlIHBvbGljeSB2YXJpYWJsZXMsIGFmdGVyIHN1YnN0aXR1dGluZyAkKHNhbmRib3gtbmFtZXNwYWNlKS4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChzYW5kYm94LW5hbWVzcGFjZSkiCiAgICBzX25hbWVzcGFjZSA6PSBpbnB1dC5iYXNlLk9DSS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwX3ZhcjIgOj0gcmVwbGFjZShwX3ZhbCwgIiQoc2FuZGJveC1uYW1lc3BhY2UpIiwgc19uYW1lc3BhY2UpCiAgICBwX3ZhcjIgPT0gaV92YWwKICAgIHByaW50KCJhbGxvd19lbnZfbWFwX2VudHJ5IDk6IHRydWUiKQp9CgojIEFsbG93IGlucHV0IGVudiB2YXJpYWJsZXMgdGhhdCBtYXRjaCB3aXRoIGEgcmVxdWVzdF9kZWZhdWx0cyByZWdleC4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHNvbWUgcF9yZWdleDEgaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5DcmVhdGVDb250YWluZXJSZXF1ZXN0LmFsbG93X2Vudl9yZWdleAogICAgcF9yZWdleDIgOj0gcmVwbGFjZShwX3JlZ2V4MSwgIiQoaXB2NF9hKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcHY0X2EpCiAgICBwX3JlZ2V4MyA6PSByZXBsYWNlKHBfcmVnZXgyLCAiJChpcF9wKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcF9wKQogICAgcF9yZWdleDQgOj0gcmVwbGFjZShwX3JlZ2V4MywgIiQoc3ZjX25hbWUpIiwgcG9saWN5X2RhdGEuY29tbW9uLnN2Y19uYW1lKQogICAgcF9yZWdleDUgOj0gcmVwbGFjZShwX3JlZ2V4NCwgIiQoZG5zX2xhYmVsKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5kbnNfbGFiZWwpCgogICAgcmVzdWx0IDo9IGNvbmNhdCgiPSIsIFtrZXksIGlfdmFsXSkKICAgIHJlZ2V4Lm1hdGNoKHBfcmVnZXg1LCByZXN1bHQpCgogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgMTA6IHRydWUiKQp9CgpDcmVhdGVDb250YWluZXJSZXF1ZXN0Oj0gcmVzcCB7CiAgICBub3QgaW5wdXQuZW52X21hcAogICAgaV9wcm9jZXNzID0gaW5wdXQuT0NJLlByb2Nlc3MKICAgIHNfbmFtZSA9IGlucHV0Lk9DSS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBwX3Byb2Nlc3MgPSBwX2NvbnRhaW5lci5PQ0kuUHJvY2VzcwogICAgYWxsb3dfZGVwcmVjYXRlZF9hcmdzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUpCiAgICByZXNwID0gQ3JlYXRlQ29udGFpbmVyUmVxdWVzdENvbW1vbihpbnB1dCkKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0MjogdHJ1ZSIpCn0KCkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb24ocmVxKTo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgICMgQ2hlY2sgaWYgdGhlIGlucHV0IHJlcXVlc3Qgc2hvdWxkIGJlIHJlamVjdGVkIGV2ZW4gYmVmb3JlIGNoZWNraW5nIHRoZQogICAgIyBwb2xpY3lfZGF0YS5jb250YWluZXJzIGluZm9ybWF0aW9uLgogICAgYWxsb3dfY3JlYXRlX2NvbnRhaW5lcl9pbnB1dChyZXEpCgogICAgaV9vY2kgOj0gcmVxLk9DSQogICAgaV9zdG9yYWdlcyA6PSByZXEuc3RvcmFnZXMKICAgIGlfZGV2aWNlcyA6PSByZXEuZGV2aWNlcwoKICAgICMgYXJyYXkgb2YgcG9zc2libGUgc3RhdGUgb3BlcmF0aW9ucwogICAgb3BzX2J1aWxkZXIgOj0gW10KCiAgICAjIGNoZWNrIHNhbmRib3ggbmFtZQogICAgc2FuZGJveF9uYW1lID0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FX0tFWV0KICAgIGFkZF9zYW5kYm94X25hbWVfdG9fc3RhdGUgOj0gc3RhdGVfYWxsb3dzKCJzYW5kYm94X25hbWUiLCBzYW5kYm94X25hbWUpCiAgICBvcHNfYnVpbGRlcjEgOj0gY29uY2F0X29wX2lmX25vdF9udWxsKG9wc19idWlsZGVyLCBhZGRfc2FuZGJveF9uYW1lX3RvX3N0YXRlKQoKICAgICMgQ2hlY2sgaWYgYW55IGVsZW1lbnQgZnJvbSB0aGUgcG9saWN5X2RhdGEuY29udGFpbmVycyBhcnJheSBhbGxvd3MgdGhlIGlucHV0IHJlcXVlc3QuCiAgICBzb21lIHBfY29udGFpbmVyIGluIHBvbGljeV9kYXRhLmNvbnRhaW5lcnMKICAgIHByaW50KCI9PT09PT09PSBDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiB0cnlpbmcgbmV4dCBwb2xpY3kgY29udGFpbmVyIikKCiAgICBwX3BpZG5zIDo9IHBfY29udGFpbmVyLnNhbmRib3hfcGlkbnMKICAgIGlfcGlkbnMgOj0gcmVxLnNhbmRib3hfcGlkbnMKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiBwX3BpZG5zID0iLCBwX3BpZG5zLCAiaV9waWRucyA9IiwgaV9waWRucykKICAgIHBfcGlkbnMgPT0gaV9waWRucwoKICAgIHBfb2NpIDo9IHBfY29udGFpbmVyLk9DSQoKICAgICMgY2hlY2sgbmFtZXNwYWNlCiAgICBwX25hbWVzcGFjZSA6PSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBpX25hbWVzcGFjZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwcmludCAoIkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb246IHBfbmFtZXNwYWNlID0iLCBwX25hbWVzcGFjZSwgImlfbmFtZXNwYWNlID0iLCBpX25hbWVzcGFjZSkKICAgIGFkZF9uYW1lc3BhY2VfdG9fc3RhdGUgOj0gYWxsb3dfbmFtZXNwYWNlKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkKICAgIG9wc19idWlsZGVyMiA6PSBjb25jYXRfb3BfaWZfbm90X251bGwob3BzX2J1aWxkZXIxLCBhZGRfbmFtZXNwYWNlX3RvX3N0YXRlKQoKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiBwIFZlcnNpb24gPSIsIHBfb2NpLlZlcnNpb24sICJpIFZlcnNpb24gPSIsIGlfb2NpLlZlcnNpb24pCiAgICBwX29jaS5WZXJzaW9uID09IGlfb2NpLlZlcnNpb24KCiAgICBwcmludCgiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdENvbW1vbjogcCBSZWFkb25seSA9IiwgcF9vY2kuUm9vdC5SZWFkb25seSwgImkgUmVhZG9ubHkgPSIsIGlfb2NpLlJvb3QuUmVhZG9ubHkpCiAgICBwX29jaS5Sb290LlJlYWRvbmx5ID09IGlfb2NpLlJvb3QuUmVhZG9ubHkKCiAgICBhbGxvd19hbm5vKHBfb2NpLCBpX29jaSkKCiAgICBwX3N0b3JhZ2VzIDo9IHBfY29udGFpbmVyLnN0b3JhZ2VzCiAgICBhbGxvd19ieV9hbm5vKHBfb2NpLCBpX29jaSwgcF9zdG9yYWdlcywgaV9zdG9yYWdlcykKCiAgICBwX2RldmljZXMgOj0gcF9jb250YWluZXIuZGV2aWNlcwogICAgYWxsb3dfZGV2aWNlcyhwX2RldmljZXMsIGlfZGV2aWNlcykKCiAgICByZXQgOj0gYWxsb3dfbGludXgob3BzX2J1aWxkZXIyLCBwX29jaSwgaV9vY2kpCiAgICByZXQuYWxsb3dlZAoKICAgIG9wcyA6PSByZXQub3BzCgogICAgcHJpbnQoIkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb246IHRydWUiKQp9CgphbGxvd19jcmVhdGVfY29udGFpbmVyX2lucHV0KHJlcSkgewogICAgcHJpbnQoImFsbG93X2NyZWF0ZV9jb250YWluZXJfaW5wdXQ6IGlucHV0ID0iLCByZXEpCgogICAgY291bnQocmVxLnNoYXJlZF9tb3VudHMpID09IDAKICAgIGlzX251bGwocmVxLnN0cmluZ191c2VyKQoKICAgIGlfb2NpIDo9IHJlcS5PQ0kKICAgIGlzX251bGwoaV9vY2kuSG9va3MpCiAgICBpc19udWxsKGlfb2NpLlNvbGFyaXMpCiAgICBpc19udWxsKGlfb2NpLldpbmRvd3MpCgogICAgaV9saW51eCA6PSBpX29jaS5MaW51eAogICAgY291bnQoaV9saW51eC5HSURNYXBwaW5ncykgPT0gMAogICAgY291bnQoaV9saW51eC5Nb3VudExhYmVsKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlJlc291cmNlcy5EZXZpY2VzKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlJvb3Rmc1Byb3BhZ2F0aW9uKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlVJRE1hcHBpbmdzKSA9PSAwCiAgICBpc19udWxsKGlfbGludXguSW50ZWxSZHQpCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLkJsb2NrSU8pCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLk5ldHdvcmspCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLlBpZHMpCiAgICBpc19udWxsKGlfbGludXguU2VjY29tcCkKCiAgICBpX3Byb2Nlc3MgOj0gaV9vY2kuUHJvY2VzcwogICAgY291bnQoaV9wcm9jZXNzLlNlbGludXhMYWJlbCkgPT0gMAogICAgY291bnQoaV9wcm9jZXNzLlVzZXIuVXNlcm5hbWUpID09IDAKCiAgICBwcmludCgiYWxsb3dfY3JlYXRlX2NvbnRhaW5lcl9pbnB1dDogdHJ1ZSIpCn0KCmFsbG93X25hbWVzcGFjZShwX25hbWVzcGFjZSwgaV9uYW1lc3BhY2UpID0gYWRkX25hbWVzcGFjZSB7CiAgICBwX25hbWVzcGFjZSA9PSBpX25hbWVzcGFjZQogICAgYWRkX25hbWVzcGFjZSA6PSBudWxsCiAgICBwcmludCgiYWxsb3dfbmFtZXNwYWNlIDE6IGlucHV0IG5hbWVzcGFjZSBtYXRjaGVzIHBvbGljeSBkYXRhIikKfQoKYWxsb3dfbmFtZXNwYWNlKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkgPSBhZGRfbmFtZXNwYWNlIHsKICAgIHBfbmFtZXNwYWNlID09ICIiCiAgICBwcmludCgiYWxsb3dfbmFtZXNwYWNlIDI6IG5vIG5hbWVzcGFjZSBmb3VuZCBvbiBwb2xpY3kgZGF0YSIpCiAgICBhZGRfbmFtZXNwYWNlIDo9IHN0YXRlX2FsbG93cygibmFtZXNwYWNlIiwgaV9uYW1lc3BhY2UpCn0KCiMgdmFsdWUgaGFzbid0IGJlZW4gc2VlbiBiZWZvcmUsIHNhdmUgaXQgdG8gc3RhdGUKc3RhdGVfYWxsb3dzKGtleSwgdmFsdWUpID0gYWN0aW9uIHsKICBzdGF0ZSA6PSBnZXRfc3RhdGUoKQogIHByaW50KCJzdGF0ZV9hbGxvd3MgMTogc3RhdGVba2V5XSA9Iiwgc3RhdGVba2V5XSwgInZhbHVlID0iLCB2YWx1ZSkKICBub3Qgc3RhdGVba2V5XQogIHByaW50KCJzdGF0ZV9hbGxvd3MgMTogc2F2aW5nIHRvIHN0YXRlIGtleSA9Iiwga2V5LCAidmFsdWUgPSIsIHZhbHVlKQogIHBhdGggOj0gZ2V0X3N0YXRlX3BhdGgoa2V5KSAKICBhY3Rpb24gOj0gewogICAgIm9wIjogImFkZCIsCiAgICAicGF0aCI6IHBhdGgsIAogICAgInZhbHVlIjogdmFsdWUsCiAgfQp9CgojIHZhbHVlIG1hdGNoZXMgd2hhdCdzIGluIHN0YXRlLCBhbGxvdyBpdApzdGF0ZV9hbGxvd3Moa2V5LCB2YWx1ZSkgPSBhY3Rpb24gewogIHByaW50KCJzdGF0ZV9hbGxvd3MgMjogc3RhcnQiKQogIHN0YXRlIDo9IGdldF9zdGF0ZSgpCiAgcHJpbnQoInN0YXRlX2FsbG93cyAyOiBzdGF0ZVtrZXldID0iLCBzdGF0ZVtrZXldLCAidmFsdWUgPSIsIHZhbHVlKQogIHZhbHVlID09IHN0YXRlW2tleV0KICBwcmludCgic3RhdGVfYWxsb3dzIDI6IGZvdW5kIGtleSA9Iiwga2V5LCAidmFsdWUgPSIsIHZhbHVlLCAiIGluIHN0YXRlIikKICBhY3Rpb24gOj0gbnVsbAp9CgojIGhlbHBlciBmdW5jdGlvbnMgdG8gaW50ZXJhY3Qgd2l0aCB0aGUgc3RhdGUKZ2V0X3N0YXRlKCkgPSBzdGF0ZSB7CiAgc3RhdGUgOj0gZGF0YVsicHN0YXRlIl0KfQoKZ2V0X3N0YXRlX3ZhbChrZXkpID0gdmFsdWUgewogICAgc3RhdGUgOj0gZ2V0X3N0YXRlKCkKICAgIHZhbHVlIDo9IHN0YXRlW2tleV0KfQoKZ2V0X3N0YXRlX3BhdGgoa2V5KSA9IHBhdGggewogICAgIyBwcmVwZW5kICIvcHN0YXRlLyIgdG8ga2V5CiAgICBwYXRoIDo9IGNvbmNhdCgiLyIsIFsiL3BzdGF0ZSIsIGtleV0pCn0KCiMgSGVscGVyIGZ1bmN0aW9ucyB0byBjb25kaXRpb25hbGx5IGNvbmNhdGVuYXRlIG9wIGlzIG5vdCBudWxsCmNvbmNhdF9vcF9pZl9ub3RfbnVsbChvcHMsIG9wKSA9IHJlc3VsdCB7CiAgICBvcCA9PSBudWxsCiAgICByZXN1bHQgOj0gb3BzCn0KCmNvbmNhdF9vcF9pZl9ub3RfbnVsbChvcHMsIG9wKSA9IHJlc3VsdCB7CiAgICBvcCAhPSBudWxsCiAgICByZXN1bHQgOj0gYXJyYXkuY29uY2F0KG9wcywgW29wXSkKfQoKIyBSZWplY3QgdW5leHBlY3RlZCBhbm5vdGF0aW9ucy4KYWxsb3dfYW5ubyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19hbm5vIDE6IHN0YXJ0IikKCiAgICBub3QgaV9vY2kuQW5ub3RhdGlvbnMKCiAgICBwcmludCgiYWxsb3dfYW5ubyAxOiB0cnVlIikKfQphbGxvd19hbm5vKHBfb2NpLCBpX29jaSkgewogICAgcHJpbnQoImFsbG93X2Fubm8gMjogcCBBbm5vdGF0aW9ucyA9IiwgcF9vY2kuQW5ub3RhdGlvbnMpCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiBpIEFubm90YXRpb25zID0iLCBpX29jaS5Bbm5vdGF0aW9ucykKCiAgICBpX2tleXMgOj0gb2JqZWN0LmtleXMoaV9vY2kuQW5ub3RhdGlvbnMpCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiBpIGtleXMgPSIsIGlfa2V5cykKCiAgICBldmVyeSBpX2tleSBpbiBpX2tleXMgewogICAgICAgIGFsbG93X2Fubm9fa2V5KGlfa2V5LCBwX29jaSkKICAgIH0KCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiB0cnVlIikKfQoKYWxsb3dfYW5ub19rZXkoaV9rZXksIHBfb2NpKSB7CiAgICBwcmludCgiYWxsb3dfYW5ub19rZXkgMTogaSBrZXkgPSIsIGlfa2V5KQoKICAgIHN0YXJ0c3dpdGgoaV9rZXksICJpby5rdWJlcm5ldGVzLmNyaS4iKQoKICAgIHByaW50KCJhbGxvd19hbm5vX2tleSAxOiB0cnVlIikKfQphbGxvd19hbm5vX2tleShpX2tleSwgcF9vY2kpIHsKICAgIHByaW50KCJhbGxvd19hbm5vX2tleSAyOiBpIGtleSA9IiwgaV9rZXkpCgogICAgc29tZSBwX2tleSwgXyBpbiBwX29jaS5Bbm5vdGF0aW9ucwogICAgcF9rZXkgPT0gaV9rZXkKCiAgICBwcmludCgiYWxsb3dfYW5ub19rZXkgMjogdHJ1ZSIpCn0KCiMgR2V0IHRoZSB2YWx1ZSBvZiB0aGUgU19OQU1FX0tFWSBhbm5vdGF0aW9uIGFuZAojIGNvcnJlbGF0ZSBpdCB3aXRoIG90aGVyIGFubm90YXRpb25zIGFuZCBwcm9jZXNzIGZpZWxkcy4KYWxsb3dfYnlfYW5ubyhwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpIHsKICAgIHByaW50KCJhbGxvd19ieV9hbm5vIDE6IHN0YXJ0IikKCiAgICBub3QgcF9vY2kuQW5ub3RhdGlvbnNbU19OQU1FX0tFWV0KCiAgICBpX3NfbmFtZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMTogaV9zX25hbWUgPSIsIGlfc19uYW1lKQoKICAgIGlfc19uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FU1BBQ0VfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMTogaV9zX25hbWVzcGFjZSA9IiwgaV9zX25hbWVzcGFjZSkKCiAgICBhbGxvd19ieV9zYW5kYm94X25hbWUocF9vY2ksIGlfb2NpLCBwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBpX3NfbmFtZSwgaV9zX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfYnlfYW5ubyAxOiB0cnVlIikKfQphbGxvd19ieV9hbm5vKHBfb2NpLCBpX29jaSwgcF9zdG9yYWdlcywgaV9zdG9yYWdlcykgewogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMjogc3RhcnQiKQoKICAgIHBfc19uYW1lIDo9IHBfb2NpLkFubm90YXRpb25zW1NfTkFNRV9LRVldCiAgICBpX3NfbmFtZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMjogaV9zX25hbWUgPSIsIGlfc19uYW1lLCAicF9zX25hbWUgPSIsIHBfc19uYW1lKQoKICAgIGFsbG93X3NhbmRib3hfbmFtZShwX3NfbmFtZSwgaV9zX25hbWUpCgogICAgaV9zX25hbWVzcGFjZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwcmludCgiYWxsb3dfYnlfYW5ubyAyOiBpX3NfbmFtZXNwYWNlID0iLCBpX3NfbmFtZXNwYWNlKQoKICAgIGFsbG93X2J5X3NhbmRib3hfbmFtZShwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMsIGlfc19uYW1lLCBpX3NfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd19ieV9hbm5vIDI6IHRydWUiKQp9CgphbGxvd19ieV9zYW5kYm94X25hbWUocF9vY2ksIGlfb2NpLCBwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfYnlfc2FuZGJveF9uYW1lOiBzdGFydCIpCgogICAgaV9uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FU1BBQ0VfS0VZXQoKICAgIGFsbG93X2J5X2NvbnRhaW5lcl90eXBlcyhwX29jaSwgaV9vY2ksIHNfbmFtZSwgaV9uYW1lc3BhY2UpCiAgICBhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZChwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpCiAgICBhbGxvd19wcm9jZXNzKHBfb2NpLlByb2Nlc3MsIGlfb2NpLlByb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpCgogICAgcHJpbnQoImFsbG93X2J5X3NhbmRib3hfbmFtZTogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfbmFtZShwX3NfbmFtZSwgaV9zX25hbWUpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X25hbWU6IHN0YXJ0IikKICAgIHJlZ2V4Lm1hdGNoKHBfc19uYW1lLCBpX3NfbmFtZSkKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9uYW1lOiB0cnVlIikKfQoKIyBDaGVjayB0aGF0IHRoZSAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLXR5cGUiIGFuZAojICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIiBhbm5vdGF0aW9ucyBkZXNpZ25hdGUgdGhlCiMgZXhwZWN0ZWQgdHlwZSAtIGVpdGhlciBhICJzYW5kYm94IiBvciBhICJjb250YWluZXIiLiBUaGVuLCB2YWxpZGF0ZQojIG90aGVyIGFubm90YXRpb25zIGJhc2VkIG9uIHRoZSBhY3R1YWwgInNhbmRib3giIG9yICJjb250YWluZXIiIHZhbHVlCiMgZnJvbSB0aGUgaW5wdXQgY29udGFpbmVyLgphbGxvd19ieV9jb250YWluZXJfdHlwZXMocF9vY2ksIGlfb2NpLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfYnlfY29udGFpbmVyX3R5cGVzOiBjaGVja2luZyBpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSIpCgogICAgY190eXBlIDo9ICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSIKICAgIAogICAgcF9jcmlfdHlwZSA6PSBwX29jaS5Bbm5vdGF0aW9uc1tjX3R5cGVdCiAgICBpX2NyaV90eXBlIDo9IGlfb2NpLkFubm90YXRpb25zW2NfdHlwZV0KICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZXM6IHBfY3JpX3R5cGUgPSIsIHBfY3JpX3R5cGUsICJpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgcF9jcmlfdHlwZSA9PSBpX2NyaV90eXBlCgogICAgYWxsb3dfYnlfY29udGFpbmVyX3R5cGUoaV9jcmlfdHlwZSwgcF9vY2ksIGlfb2NpLCBzX25hbWUsIHNfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZXM6IHRydWUiKQp9CgphbGxvd19ieV9jb250YWluZXJfdHlwZShpX2NyaV90eXBlLCBwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAxOiBpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgaV9jcmlfdHlwZSA9PSAic2FuZGJveCIKCiAgICBpX2thdGFfdHlwZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1siaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5jb250YWluZXJfdHlwZSJdCiAgICBwcmludCgiYWxsb3dfYnlfY29udGFpbmVyX3R5cGUgMTogaV9rYXRhX3R5cGUgPSIsIGlfa2F0YV90eXBlKQogICAgaV9rYXRhX3R5cGUgPT0gInBvZF9zYW5kYm94IgoKICAgIGFsbG93X3NhbmRib3hfY29udGFpbmVyX25hbWUocF9vY2ksIGlfb2NpKQogICAgYWxsb3dfc2FuZGJveF9uZXRfbmFtZXNwYWNlKHBfb2NpLCBpX29jaSkKICAgIGFsbG93X3NhbmRib3hfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpCgogICAgcHJpbnQoImFsbG93X2J5X2NvbnRhaW5lcl90eXBlIDE6IHRydWUiKQp9CgphbGxvd19ieV9jb250YWluZXJfdHlwZShpX2NyaV90eXBlLCBwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiBpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgaV9jcmlfdHlwZSA9PSAiY29udGFpbmVyIgoKICAgIGlfa2F0YV90eXBlIDo9IGlfb2NpLkFubm90YXRpb25zWyJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIl0KICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiBpX2thdGFfdHlwZSA9IiwgaV9rYXRhX3R5cGUpCiAgICBpX2thdGFfdHlwZSA9PSAicG9kX2NvbnRhaW5lciIKCiAgICBhbGxvd19jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpCiAgICBhbGxvd19uZXRfbmFtZXNwYWNlKHBfb2NpLCBpX29jaSkKICAgIGFsbG93X2xvZ19kaXJlY3RvcnkocF9vY2ksIGlfb2NpKQoKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiB0cnVlIikKfQoKIyAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLW5hbWUiIGFubm90YXRpb24KYWxsb3dfc2FuZGJveF9jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X2NvbnRhaW5lcl9uYW1lOiBzdGFydCIpCgogICAgY29udGFpbmVyX2Fubm90YXRpb25fbWlzc2luZyhwX29jaSwgaV9vY2ksICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItbmFtZSIpCgogICAgcHJpbnQoImFsbG93X3NhbmRib3hfY29udGFpbmVyX25hbWU6IHRydWUiKQp9CgphbGxvd19jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19jb250YWluZXJfbmFtZTogc3RhcnQiKQoKICAgIGFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uKHBfb2NpLCBpX29jaSwgImlvLmt1YmVybmV0ZXMuY3JpLmNvbnRhaW5lci1uYW1lIikKCiAgICBwcmludCgiYWxsb3dfY29udGFpbmVyX25hbWU6IHRydWUiKQp9Cgpjb250YWluZXJfYW5ub3RhdGlvbl9taXNzaW5nKHBfb2NpLCBpX29jaSwga2V5KSB7CiAgICBwcmludCgiY29udGFpbmVyX2Fubm90YXRpb25fbWlzc2luZzoiLCBrZXkpCgogICAgbm90IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIG5vdCBpX29jaS5Bbm5vdGF0aW9uc1trZXldCgogICAgcHJpbnQoImNvbnRhaW5lcl9hbm5vdGF0aW9uX21pc3Npbmc6IHRydWUiKQp9CgphbGxvd19jb250YWluZXJfYW5ub3RhdGlvbihwX29jaSwgaV9vY2ksIGtleSkgewogICAgcHJpbnQoImFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uOiBrZXkgPSIsIGtleSkKCiAgICBwX3ZhbHVlIDo9IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIGlfdmFsdWUgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgcHJpbnQoImFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uOiBwX3ZhbHVlID0iLCBwX3ZhbHVlLCAiaV92YWx1ZSA9IiwgaV92YWx1ZSkKCiAgICBwX3ZhbHVlID09IGlfdmFsdWUKCiAgICBwcmludCgiYWxsb3dfY29udGFpbmVyX2Fubm90YXRpb246IHRydWUiKQp9CgojICJuZXJkY3RsL25ldHdvcmstbmFtZXNwYWNlIiBhbm5vdGF0aW9uCmFsbG93X3NhbmRib3hfbmV0X25hbWVzcGFjZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X25ldF9uYW1lc3BhY2U6IHN0YXJ0IikKCiAgICBrZXkgOj0gIm5lcmRjdGwvbmV0d29yay1uYW1lc3BhY2UiCgogICAgcF9uYW1lc3BhY2UgOj0gcF9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgaV9uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgcHJpbnQoImFsbG93X3NhbmRib3hfbmV0X25hbWVzcGFjZTogcF9uYW1lc3BhY2UgPSIsIHBfbmFtZXNwYWNlLCAiaV9uYW1lc3BhY2UgPSIsIGlfbmFtZXNwYWNlKQoKICAgIHJlZ2V4Lm1hdGNoKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9uZXRfbmFtZXNwYWNlOiB0cnVlIikKfQoKYWxsb3dfbmV0X25hbWVzcGFjZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19uZXRfbmFtZXNwYWNlOiBzdGFydCIpCgogICAga2V5IDo9ICJuZXJkY3RsL25ldHdvcmstbmFtZXNwYWNlIgoKICAgIG5vdCBwX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICBub3QgaV9vY2kuQW5ub3RhdGlvbnNba2V5XQoKICAgIHByaW50KCJhbGxvd19uZXRfbmFtZXNwYWNlOiB0cnVlIikKfQoKIyAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1sb2ctZGlyZWN0b3J5IiBhbm5vdGF0aW9uCmFsbG93X3NhbmRib3hfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X2xvZ19kaXJlY3Rvcnk6IHN0YXJ0IikKCiAgICBrZXkgOj0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbG9nLWRpcmVjdG9yeSIKCiAgICBwX2RpciA6PSBwX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICByZWdleDEgOj0gcmVwbGFjZShwX2RpciwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHJlZ2V4MiA6PSByZXBsYWNlKHJlZ2V4MSwgIiQoc2FuZGJveC1uYW1lc3BhY2UpIiwgc19uYW1lc3BhY2UpCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiByZWdleDIgPSIsIHJlZ2V4MikKCiAgICBpX2RpciA6PSBpX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiBpX2RpciA9IiwgaV9kaXIpCgogICAgcmVnZXgubWF0Y2gocmVnZXgyLCBpX2RpcikKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiB0cnVlIikKfQoKYWxsb3dfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19sb2dfZGlyZWN0b3J5OiBzdGFydCIpCgogICAga2V5IDo9ICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWxvZy1kaXJlY3RvcnkiCgogICAgbm90IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIG5vdCBpX29jaS5Bbm5vdGF0aW9uc1trZXldCgogICAgcHJpbnQoImFsbG93X2xvZ19kaXJlY3Rvcnk6IHRydWUiKQp9CgphbGxvd19kZXZpY2VzKHBfZGV2aWNlcywgaV9kZXZpY2VzKSB7CiAgICBwcmludCgiYWxsb3dfZGV2aWNlczogc3RhcnQiKQogICAgZXZlcnkgaV9kZXZpY2UgaW4gaV9kZXZpY2VzIHsKICAgICAgICBwcmludCgiYWxsb3dfZGV2aWNlczogaV9kZXZpY2UgPSIsIGlfZGV2aWNlKQogICAgICAgIHNvbWUgcF9kZXZpY2UgaW4gcF9kZXZpY2VzCiAgICAgICAgcF9kZXZpY2UuY29udGFpbmVyX3BhdGggPT0gaV9kZXZpY2UuY29udGFpbmVyX3BhdGgKICAgIH0KICAgIHByaW50KCJhbGxvd19kZXZpY2VzOiB0cnVlIikKfQoKYWxsb3dfbGludXgoc3RhdGVfb3BzLCBwX29jaSwgaV9vY2kpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIHBfbmFtZXNwYWNlcyA6PSBwX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbGludXg6IHAgbmFtZXNwYWNlcyA9IiwgcF9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlcyA6PSBpX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbGludXg6IGkgbmFtZXNwYWNlcyA9IiwgaV9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlX3dpdGhvdXRfbmV0d29yayA6PSBbb2JqIHwgb2JqIDo9IGlfbmFtZXNwYWNlc1tfXTsgb2JqLlR5cGUgIT0gIm5ldHdvcmsiXQoKICAgIHByaW50KCJhbGxvd19saW51eDogaV9uYW1lc3BhY2Vfd2l0aG91dF9uZXR3b3JrID0iLCBpX25hbWVzcGFjZV93aXRob3V0X25ldHdvcmspCgogICAgcF9uYW1lc3BhY2VzID09IGlfbmFtZXNwYWNlX3dpdGhvdXRfbmV0d29yawoKICAgIGFsbG93X21hc2tlZF9wYXRocyhwX29jaSwgaV9vY2kpCiAgICBhbGxvd19yZWFkb25seV9wYXRocyhwX29jaSwgaV9vY2kpCiAgICBhbGxvd19saW51eF9kZXZpY2VzKHBfb2NpLkxpbnV4LkRldmljZXMsIGlfb2NpLkxpbnV4LkRldmljZXMpCiAgICBhbGxvd19saW51eF9zeXNjdGwocF9vY2kuTGludXgsIGlfb2NpLkxpbnV4KQogICAgcmV0IDo9IGFsbG93X25ldHdvcmtfbmFtZXNwYWNlX3N0YXJ0KHN0YXRlX29wcywgcF9vY2ksIGlfb2NpKQogICAgcmV0LmFsbG93ZWQKCiAgICBvcHMgOj0gcmV0Lm9wcwoKICAgIHByaW50KCJhbGxvd19saW51eDogdHJ1ZSIpCn0KCiMgUmV0cmlldmUgdGhlICJuZXR3b3JrIiBuYW1lc3BhY2UgZnJvbSB0aGUgaW5wdXQgZGF0YSBhbmQgcGFzcyBpdCBvbiBmb3IgdGhlCiMgbmV0d29yayBuYW1lc3BhY2UgcG9saWN5IGNoZWNrcy4KYWxsb3dfbmV0d29ya19uYW1lc3BhY2Vfc3RhcnQoc3RhdGVfb3BzLCBwX29jaSwgaV9vY2kpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIHByaW50KCJhbGxvd19uZXR3b3JrX25hbWVzcGFjZSBzdGFydDogc3RhcnQiKQoKICAgIHBfbmFtZXNwYWNlcyA6PSBwX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IHAgbmFtZXNwYWNlcyA9IiwgcF9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlcyA6PSBpX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IGkgbmFtZXNwYWNlcyA9IiwgaV9uYW1lc3BhY2VzKQoKICAgICMgUmV0dXJuIHBhdGggb2YgdGhlICJuZXR3b3JrIiBuYW1lc3BhY2UKICAgIG5ldHdvcmtfbnMgOj0gW29iaiB8IG9iaiA6PSBpX25hbWVzcGFjZXNbX107IG9iai5UeXBlID09ICJuZXR3b3JrIl0KCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IG5ldHdvcmtfbnMgPSIsIG5ldHdvcmtfbnMpCgogICAgcmV0IDo9IGFsbG93X25ldHdvcmtfbmFtZXNwYWNlKHN0YXRlX29wcywgbmV0d29ya19ucykKICAgIHJldC5hbGxvd2VkCgogICAgb3BzIDo9IHJldC5vcHMKfQoKIyBUaGlzIHJ1bGUgaXMgd2hlbiB0aGVyZSdzIG5vIG5ldHdvcmsgbmFtZXNwYWNlIGluIHRoZSBpbnB1dCBkYXRhLgphbGxvd19uZXR3b3JrX25hbWVzcGFjZShzdGF0ZV9vcHMsIG5ldHdvcmtfbnMpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIGNvdW50KG5ldHdvcmtfbnMpID09IDAKCiAgICBuZXR3b3JrX25zX3BhdGggPSAiIgoKICAgIGFkZF9uZXR3b3JrX25hbWVzcGFjZV90b19zdGF0ZSA6PSBzdGF0ZV9hbGxvd3MoIm5ldHdvcmtfbmFtZXNwYWNlIiwgbmV0d29ya19uc19wYXRoKQogICAgb3BzIDo9IGNvbmNhdF9vcF9pZl9ub3RfbnVsbChzdGF0ZV9vcHMsIGFkZF9uZXR3b3JrX25hbWVzcGFjZV90b19zdGF0ZSkKCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2UgMTogdHJ1ZSIpCn0KCiMgVGhpcyBydWxlIGlzIHdoZW4gdGhlcmUncyBleGFjdGx5IG9uZSBuZXR3b3JrIG5hbWVzcGFjZSBpbiB0aGUgaW5wdXQgZGF0YS4KYWxsb3dfbmV0d29ya19uYW1lc3BhY2Uoc3RhdGVfb3BzLCBuZXR3b3JrX25zKSA6PSB7Im9wcyI6IG9wcywgImFsbG93ZWQiOiB0cnVlfSB7CiAgICBjb3VudChuZXR3b3JrX25zKSA9PSAxCgogICAgYWRkX25ldHdvcmtfbmFtZXNwYWNlX3RvX3N0YXRlIDo9IHN0YXRlX2FsbG93cygibmV0d29ya19uYW1lc3BhY2UiLCBuZXR3b3JrX25zWzBdLlBhdGgpCiAgICBvcHMgOj0gY29uY2F0X29wX2lmX25vdF9udWxsKHN0YXRlX29wcywgYWRkX25ldHdvcmtfbmFtZXNwYWNlX3RvX3N0YXRlKQoKICAgIHByaW50KCJhbGxvd19uZXR3b3JrX25hbWVzcGFjZSAyOiB0cnVlIikKfQoKYWxsb3dfbWFza2VkX3BhdGhzKHBfb2NpLCBpX29jaSkgewogICAgcF9wYXRocyA6PSBwX29jaS5MaW51eC5NYXNrZWRQYXRocwogICAgcHJpbnQoImFsbG93X21hc2tlZF9wYXRocyAxOiBwX3BhdGhzID0iLCBwX3BhdGhzKQoKICAgIGlfcGF0aHMgOj0gaV9vY2kuTGludXguTWFza2VkUGF0aHMKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aHMgMTogaV9wYXRocyA9IiwgaV9wYXRocykKCiAgICBhbGxvd19tYXNrZWRfcGF0aHNfYXJyYXkocF9wYXRocywgaV9wYXRocykKCiAgICBwcmludCgiYWxsb3dfbWFza2VkX3BhdGhzIDE6IHRydWUiKQp9CmFsbG93X21hc2tlZF9wYXRocyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aHMgMjogc3RhcnQiKQoKICAgIG5vdCBwX29jaS5MaW51eC5NYXNrZWRQYXRocwogICAgbm90IGlfb2NpLkxpbnV4Lk1hc2tlZFBhdGhzCgogICAgcHJpbnQoImFsbG93X21hc2tlZF9wYXRocyAyOiB0cnVlIikKfQoKIyBBbGwgdGhlIHBvbGljeSBtYXNrZWQgcGF0aHMgbXVzdCBiZSBtYXNrZWQgaW4gdGhlIGlucHV0IGRhdGEgdG9vLgojIElucHV0IGlzIGFsbG93ZWQgdG8gaGF2ZSBtb3JlIG1hc2tlZCBwYXRocyB0aGFuIHRoZSBwb2xpY3kuCmFsbG93X21hc2tlZF9wYXRoc19hcnJheShwX2FycmF5LCBpX2FycmF5KSB7CiAgICBldmVyeSBwX2VsZW0gaW4gcF9hcnJheSB7CiAgICAgICAgYWxsb3dfbWFza2VkX3BhdGgocF9lbGVtLCBpX2FycmF5KQogICAgfQp9CgphbGxvd19tYXNrZWRfcGF0aChwX2VsZW0sIGlfYXJyYXkpIHsKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aDogcF9lbGVtID0iLCBwX2VsZW0pCgogICAgc29tZSBpX2VsZW0gaW4gaV9hcnJheQogICAgcF9lbGVtID09IGlfZWxlbQoKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aDogdHJ1ZSIpCn0KCmFsbG93X3JlYWRvbmx5X3BhdGhzKHBfb2NpLCBpX29jaSkgewogICAgcF9wYXRocyA6PSBwX29jaS5MaW51eC5SZWFkb25seVBhdGhzCiAgICBwcmludCgiYWxsb3dfcmVhZG9ubHlfcGF0aHMgMTogcF9wYXRocyA9IiwgcF9wYXRocykKCiAgICBpX3BhdGhzIDo9IGlfb2NpLkxpbnV4LlJlYWRvbmx5UGF0aHMKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAxOiBpX3BhdGhzID0iLCBpX3BhdGhzKQoKICAgIGFsbG93X3JlYWRvbmx5X3BhdGhzX2FycmF5KHBfcGF0aHMsIGlfcGF0aHMsIGlfb2NpLkxpbnV4Lk1hc2tlZFBhdGhzKQoKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAxOiB0cnVlIikKfQphbGxvd19yZWFkb25seV9wYXRocyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAyOiBzdGFydCIpCgogICAgbm90IHBfb2NpLkxpbnV4LlJlYWRvbmx5UGF0aHMKICAgIG5vdCBpX29jaS5MaW51eC5SZWFkb25seVBhdGhzCgogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGhzIDI6IHRydWUiKQp9CgojIEFsbCB0aGUgcG9saWN5IHJlYWRvbmx5IHBhdGhzIG11c3QgYmUgZWl0aGVyOgojIC0gUHJlc2VudCBpbiB0aGUgaW5wdXQgcmVhZG9ubHkgcGF0aHMsIG9yCiMgLSBQcmVzZW50IGluIHRoZSBpbnB1dCBtYXNrZWQgcGF0aHMuCiMgSW5wdXQgaXMgYWxsb3dlZCB0byBoYXZlIG1vcmUgcmVhZG9ubHkgcGF0aHMgdGhhbiB0aGUgcG9saWN5LgphbGxvd19yZWFkb25seV9wYXRoc19hcnJheShwX2FycmF5LCBpX2FycmF5LCBtYXNrZWRfcGF0aHMpIHsKICAgIGV2ZXJ5IHBfZWxlbSBpbiBwX2FycmF5IHsKICAgICAgICBhbGxvd19yZWFkb25seV9wYXRoKHBfZWxlbSwgaV9hcnJheSwgbWFza2VkX3BhdGhzKQogICAgfQp9CgphbGxvd19yZWFkb25seV9wYXRoKHBfZWxlbSwgaV9hcnJheSwgbWFza2VkX3BhdGhzKSB7CiAgICBwcmludCgiYWxsb3dfcmVhZG9ubHlfcGF0aCAxOiBwX2VsZW0gPSIsIHBfZWxlbSkKCiAgICBzb21lIGlfZWxlbSBpbiBpX2FycmF5CiAgICBwX2VsZW0gPT0gaV9lbGVtCgogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGggMTogdHJ1ZSIpCn0KYWxsb3dfcmVhZG9ubHlfcGF0aChwX2VsZW0sIGlfYXJyYXksIG1hc2tlZF9wYXRocykgewogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGggMjogcF9lbGVtID0iLCBwX2VsZW0pCgogICAgc29tZSBpX21hc2tlZCBpbiBtYXNrZWRfcGF0aHMKICAgIHBfZWxlbSA9PSBpX21hc2tlZAoKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRoIDI6IHRydWUiKQp9CgphbGxvd19saW51eF9kZXZpY2VzKHBfZGV2aWNlcywgaV9kZXZpY2VzKSB7CiAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogc3RhcnQiKQogICAgZXZlcnkgaV9kZXZpY2UgaW4gaV9kZXZpY2VzIHsKICAgICAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogaV9kZXZpY2UgPSIsIGlfZGV2aWNlKQogICAgICAgIHNvbWUgcF9kZXZpY2UgaW4gcF9kZXZpY2VzCiAgICAgICAgaV9kZXZpY2UuUGF0aCA9PSBwX2RldmljZS5QYXRoCiAgICB9CiAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogdHJ1ZSIpCn0KCmFsbG93X2xpbnV4X3N5c2N0bChwX2xpbnV4LCBpX2xpbnV4KSB7CiAgICBwcmludCgiYWxsb3dfbGludXhfc3lzY3RsIDE6IHN0YXJ0IikKICAgIG5vdCBpX2xpbnV4LlN5c2N0bAogICAgcHJpbnQoImFsbG93X2xpbnV4X3N5c2N0bCAxOiB0cnVlIikKfQoKYWxsb3dfbGludXhfc3lzY3RsKHBfbGludXgsIGlfbGludXgpIHsKICAgIHByaW50KCJhbGxvd19saW51eF9zeXNjdGwgMjogc3RhcnQiKQogICAgcF9zeXNjdGwgOj0gcF9saW51eC5TeXNjdGwKICAgIGlfc3lzY3RsIDo9IGlfbGludXguU3lzY3RsCiAgICBldmVyeSBpX25hbWUsIGlfdmFsIGluIGlfc3lzY3RsIHsKICAgICAgICBwcmludCgiYWxsb3dfbGludXhfc3lzY3RsIDI6IGlfbmFtZSA9IiwgaV9uYW1lLCAiaV92YWwgPSIsIGlfdmFsKQogICAgICAgIHBfc3lzY3RsW2lfbmFtZV0gPT0gaV92YWwKICAgIH0KICAgIHByaW50KCJhbGxvd19saW51eF9zeXNjdGwgMjogdHJ1ZSIpCn0KCiMgQ2hlY2sgdGhlIGNvbnNpc3RlbmN5IG9mIHRoZSBpbnB1dCAiaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5idW5kbGVfcGF0aCIKIyBhbmQgaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCIgdmFsdWVzIHdpdGggb3RoZXIgZmllbGRzLgphbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZChwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpIHsKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogc3RhcnQiKQoKICAgIGJ1bmRsZV9wYXRoIDo9IGlfb2NpLkFubm90YXRpb25zWyJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmJ1bmRsZV9wYXRoIl0KICAgIGJ1bmRsZV9pZCA6PSByZXBsYWNlKGJ1bmRsZV9wYXRoLCAiL3J1bi9jb250YWluZXJkL2lvLmNvbnRhaW5lcmQucnVudGltZS52Mi50YXNrL2s4cy5pby8iLCAiIikKCiAgICBidW5kbGVfaWRfZm9ybWF0IDo9IGNvbmNhdCgiIiwgWyJeIiwgQlVORExFX0lELCAiJCJdKQogICAgcmVnZXgubWF0Y2goYnVuZGxlX2lkX2Zvcm1hdCwgYnVuZGxlX2lkKQoKICAgIGtleSA6PSAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCIKCiAgICBwX3JlZ2V4IDo9IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIHNhbmRib3hfaWQgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQoKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogc2FuZGJveF9pZCA9Iiwgc2FuZGJveF9pZCwgInJlZ2V4ID0iLCBwX3JlZ2V4KQogICAgcmVnZXgubWF0Y2gocF9yZWdleCwgc2FuZGJveF9pZCkKCiAgICBhbGxvd19yb290X3BhdGgocF9vY2ksIGlfb2NpLCBidW5kbGVfaWQpCgogICAgZXZlcnkgaV9tb3VudCBpbiBpX29jaS5Nb3VudHMgewogICAgICAgIGFsbG93X21vdW50KHBfb2NpLCBpX21vdW50LCBpX3N0b3JhZ2VzLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpCiAgICB9CgogICAgYWxsb3dfc3RvcmFnZXMocF9zdG9yYWdlcywgaV9zdG9yYWdlcywgYnVuZGxlX2lkLCBzYW5kYm94X2lkKQoKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogdHJ1ZSIpCn0KCmFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHBfcHJvY2VzcyA9IiwgcF9wcm9jZXNzKQogICAgcHJpbnQoImFsbG93X3Byb2Nlc3NfY29tbW9uOiBpX3Byb2Nlc3MgPSAiLCBpX3Byb2Nlc3MpCiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHNfbmFtZSA9Iiwgc19uYW1lKQoKICAgIHBfcHJvY2Vzcy5Dd2QgPT0gaV9wcm9jZXNzLkN3ZAogICAgcF9wcm9jZXNzLk5vTmV3UHJpdmlsZWdlcyA9PSBpX3Byb2Nlc3MuTm9OZXdQcml2aWxlZ2VzCgogICAgYWxsb3dfdXNlcihwX3Byb2Nlc3MsIGlfcHJvY2VzcykKICAgIGFsbG93X2VudihwX3Byb2Nlc3MsIGlfcHJvY2Vzcywgc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHRydWUiKQp9CgojIENvbXBhcmUgdGhlIE9DSSBQcm9jZXNzIGZpZWxkIG9mIGEgcG9saWN5IGNvbnRhaW5lciB3aXRoIHRoZSBpbnB1dCBPQ0kgUHJvY2VzcyBmcm9tIGEgQ3JlYXRlQ29udGFpbmVyUmVxdWVzdAphbGxvd19wcm9jZXNzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfcHJvY2Vzczogc3RhcnQiKQoKICAgIGFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgYWxsb3dfY2FwcyhwX3Byb2Nlc3MuQ2FwYWJpbGl0aWVzLCBpX3Byb2Nlc3MuQ2FwYWJpbGl0aWVzKQogICAgcF9wcm9jZXNzLlRlcm1pbmFsID09IGlfcHJvY2Vzcy5UZXJtaW5hbAoKICAgIHByaW50KCJhbGxvd19wcm9jZXNzOiB0cnVlIikKfQoKIyBDb21wYXJlIHRoZSBPQ0kgUHJvY2VzcyBmaWVsZCBvZiBhIHBvbGljeSBjb250YWluZXIgd2l0aCB0aGUgaW5wdXQgcHJvY2VzcyBmaWVsZCBmcm9tIEV4ZWNQcm9jZXNzUmVxdWVzdAphbGxvd19pbnRlcmFjdGl2ZV9wcm9jZXNzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfaW50ZXJhY3RpdmVfcHJvY2Vzczogc3RhcnQiKQoKICAgIGFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgYWxsb3dfZXhlY19jYXBzKGlfcHJvY2Vzcy5DYXBhYmlsaXRpZXMpCgogICAgIyBUaGVzZSBhcmUgY29tbWFuZHMgZW5hYmxlZCB1c2luZyBFeGVjUHJvY2Vzc1JlcXVlc3QgY29tbWFuZHMgYW5kL29yIHJlZ2V4IGZyb20gdGhlIHNldHRpbmdzIGZpbGUuCiAgICAjIFRoZXkgY2FuIGJlIGV4ZWN1dGVkIGludGVyYWN0aXZlbHkgc28gYWxsb3cgdGhlbSB0byB1c2UgYW55IHZhbHVlIGZvciBpX3Byb2Nlc3MuVGVybWluYWwuCgogICAgcHJpbnQoImFsbG93X2ludGVyYWN0aXZlX3Byb2Nlc3M6IHRydWUiKQp9CgojIENvbXBhcmUgdGhlIE9DSSBQcm9jZXNzIGZpZWxkIG9mIGEgcG9saWN5IGNvbnRhaW5lciB3aXRoIHRoZSBpbnB1dCBwcm9jZXNzIGZpZWxkIGZyb20gRXhlY1Byb2Nlc3NSZXF1ZXN0CmFsbG93X3Byb2JlX3Byb2Nlc3MocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19wcm9iZV9wcm9jZXNzOiBzdGFydCIpCgogICAgYWxsb3dfcHJvY2Vzc19jb21tb24ocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpCiAgICBhbGxvd19leGVjX2NhcHMoaV9wcm9jZXNzLkNhcGFiaWxpdGllcykKICAgIHBfcHJvY2Vzcy5UZXJtaW5hbCA9PSBpX3Byb2Nlc3MuVGVybWluYWwKCiAgICBwcmludCgiYWxsb3dfcHJvYmVfcHJvY2VzczogdHJ1ZSIpCn0KCmFsbG93X3VzZXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MpIHsKICAgIHBfdXNlciA6PSBwX3Byb2Nlc3MuVXNlcgogICAgaV91c2VyIDo9IGlfcHJvY2Vzcy5Vc2VyCgogICAgcHJpbnQoImFsbG93X3VzZXI6IGlucHV0IHVpZCA9IiwgaV91c2VyLlVJRCwgInBvbGljeSB1aWQgPSIsIHBfdXNlci5VSUQpCiAgICBwX3VzZXIuVUlEID09IGlfdXNlci5VSUQKCiAgICAjIFRPRE86IHRyYWNrIGRvd24gdGhlIHJlYXNvbiBmb3IgcmVnaXN0cnkuazhzLmlvL3BhdXNlOjMuOSBiZWluZwogICAgIyAgICAgICBleGVjdXRlZCB3aXRoIGdpZCA9IDAgZGVzcGl0ZSBoYXZpbmcgIjY1NTM1OjY1NTM1IiBpbiBpdHMgY29udGFpbmVyIGltYWdlCiAgICAjICAgICAgIGNvbmZpZy4KICAgICNwcmludCgiYWxsb3dfdXNlcjogaW5wdXQgZ2lkID0iLCBpX3VzZXIuR0lELCAicG9saWN5IGdpZCA9IiwgcF91c2VyLkdJRCkKICAgICNwX3VzZXIuR0lEID09IGlfdXNlci5HSUQKCiAgICAjIFRPRE86IGNvbXBhcmUgdGhlIGFkZGl0aW9uYWxHaWRzIGZpZWxkIHRvbyBhZnRlciBjb21wdXRpbmcgaXRzIHZhbHVlCiAgICAjIGJhc2VkIG9uIC9ldGMvcGFzc3dkIGFuZCAvZXRjL2dyb3VwIGZyb20gdGhlIGNvbnRhaW5lciBpbWFnZS4KfQoKYWxsb3dfZGVwcmVjYXRlZF9hcmdzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZ3MgMTogbm8gYXJncyIpCgogICAgbm90IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJncwogICAgbm90IGlfcHJvY2Vzcy5BcmdzCgogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAxOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZ3MocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSkgewogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiBwb2xpY3kgYXJncyA9IiwgcF9wcm9jZXNzLkRlcHJlY2F0ZWRBcmdzKQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiBpbnB1dCBhcmdzID0iLCBpX3Byb2Nlc3MuQXJncykKCiAgICBjb3VudChwX3Byb2Nlc3MuRGVwcmVjYXRlZEFyZ3MpID09IGNvdW50KGlfcHJvY2Vzcy5BcmdzKQoKICAgIGV2ZXJ5IGksIGlfYXJnIGluIGlfcHJvY2Vzcy5BcmdzIHsKICAgICAgICBhbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpCiAgICB9CgogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDE6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgcF9hcmcyIDo9IHJlcGxhY2UocF9hcmcsICIkJCIsICIkIikKICAgIHBfYXJnMiA9PSBpX2FyZwoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAxOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDI6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgIyBUT0RPOiBjYW4gJChub2RlLW5hbWUpIGJlIGhhbmRsZWQgYmV0dGVyPwogICAgY29udGFpbnMocF9hcmcsICIkKG5vZGUtbmFtZSkiKQoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAyOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDM6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgcF9hcmcyIDo9IHJlcGxhY2UocF9hcmcsICIkJCIsICIkIikKICAgIHBfYXJnMyA6PSByZXBsYWNlKHBfYXJnMiwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAzOiBwX2FyZzMgPSIsIHBfYXJnMykKICAgIHBfYXJnMyA9PSBpX2FyZwoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAzOiB0cnVlIikKfQoKIyBPQ0kgcHJvY2Vzcy5FbnYgZmllbGQKYWxsb3dfZW52KHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfZW52OiBwIGVudiA9IiwgcF9wcm9jZXNzLkVudikKICAgIHByaW50KCJhbGxvd19lbnY6IGkgZW52ID0iLCBpX3Byb2Nlc3MuRW52KQoKICAgIGV2ZXJ5IGlfdmFyIGluIGlfcHJvY2Vzcy5FbnYgewogICAgICAgIHByaW50KCJhbGxvd19lbnY6IGlfdmFyID0iLCBpX3ZhcikKICAgICAgICBhbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgfQoKICAgIHByaW50KCJhbGxvd19lbnY6IHRydWUiKQp9CgojIEFsbG93IGlucHV0IGVudiB2YXJpYWJsZXMgdGhhdCBhcmUgcHJlc2VudCBpbiB0aGUgcG9saWN5IGRhdGEgdG9vLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHBfdmFyID09IGlfdmFyCiAgICBwcmludCgiYWxsb3dfdmFyIDE6IHRydWUiKQp9CgojIE1hdGNoIGlucHV0IHdpdGggb25lIG9mIHRoZSBwb2xpY3kgdmFyaWFibGVzLCBhZnRlciBzdWJzdGl0dXRpbmcgJChzYW5kYm94LW5hbWUpLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHByaW50KCJhbGxvd192YXIgMjogcF92YXIgPSIsIHBfdmFyKQoKICAgIHBfdmFyX3NwbGl0IDo9IHNwbGl0KHBfdmFyLCAiPSIpCiAgICBjb3VudChwX3Zhcl9zcGxpdCkgPT0gMgoKICAgIHBfdmFyX3NwbGl0WzFdID09ICIkKHNhbmRib3gtbmFtZSkiCgogICAgaV92YXJfc3BsaXQgOj0gc3BsaXQoaV92YXIsICI9IikKICAgIGNvdW50KGlfdmFyX3NwbGl0KSA9PSAyCgogICAgaV92YXJfc3BsaXRbMF0gPT0gcF92YXJfc3BsaXRbMF0KICAgIHJlZ2V4Lm1hdGNoKHNfbmFtZSwgaV92YXJfc3BsaXRbMV0pCgogICAgcHJpbnQoImFsbG93X3ZhciAyOiB0cnVlIikKfQoKIyBBbGxvdyBpbnB1dCBlbnYgdmFyaWFibGVzIHRoYXQgbWF0Y2ggd2l0aCBhIHJlcXVlc3RfZGVmYXVsdHMgcmVnZXguCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHNvbWUgcF9yZWdleDEgaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5DcmVhdGVDb250YWluZXJSZXF1ZXN0LmFsbG93X2Vudl9yZWdleAogICAgcF9yZWdleDIgOj0gcmVwbGFjZShwX3JlZ2V4MSwgIiQoaXB2NF9hKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcHY0X2EpCiAgICBwX3JlZ2V4MyA6PSByZXBsYWNlKHBfcmVnZXgyLCAiJChpcF9wKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcF9wKQogICAgcF9yZWdleDQgOj0gcmVwbGFjZShwX3JlZ2V4MywgIiQoc3ZjX25hbWUpIiwgcG9saWN5X2RhdGEuY29tbW9uLnN2Y19uYW1lKQogICAgcF9yZWdleDUgOj0gcmVwbGFjZShwX3JlZ2V4NCwgIiQoZG5zX2xhYmVsKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5kbnNfbGFiZWwpCgogICAgcHJpbnQoImFsbG93X3ZhciAzOiBwX3JlZ2V4NSA9IiwgcF9yZWdleDUpCiAgICByZWdleC5tYXRjaChwX3JlZ2V4NSwgaV92YXIpCgogICAgcHJpbnQoImFsbG93X3ZhciAzOiB0cnVlIikKfQoKIyBBbGxvdyBmaWVsZFJlZiAiZmllbGRQYXRoOiBzdGF0dXMucG9kSVAiIHZhbHVlcy4KYWxsb3dfdmFyKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBpX3Zhciwgc19uYW1lLCBzX25hbWVzcGFjZSkgewogICAgbmFtZV92YWx1ZSA6PSBzcGxpdChpX3ZhciwgIj0iKQogICAgY291bnQobmFtZV92YWx1ZSkgPT0gMgogICAgaXNfaXAobmFtZV92YWx1ZVsxXSkKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIGFsbG93X3BvZF9pcF92YXIobmFtZV92YWx1ZVswXSwgcF92YXIpCgogICAgcHJpbnQoImFsbG93X3ZhciA0OiB0cnVlIikKfQoKIyBBbGxvdyBjb21tb24gZmllbGRSZWYgdmFyaWFibGVzLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBuYW1lX3ZhbHVlIDo9IHNwbGl0KGlfdmFyLCAiPSIpCiAgICBjb3VudChuYW1lX3ZhbHVlKSA9PSAyCgogICAgc29tZSBwX3ZhciBpbiBwX3Byb2Nlc3MuRW52CiAgICBwX25hbWVfdmFsdWUgOj0gc3BsaXQocF92YXIsICI9IikKICAgIGNvdW50KHBfbmFtZV92YWx1ZSkgPT0gMgoKICAgIHBfbmFtZV92YWx1ZVswXSA9PSBuYW1lX3ZhbHVlWzBdCgogICAgIyBUT0RPOiBzaG91bGQgdGhlc2UgYmUgaGFuZGxlZCBpbiBhIGRpZmZlcmVudCB3YXk/CiAgICBhbHdheXNfYWxsb3dlZCA6PSBbIiQoaG9zdC1uYW1lKSIsICIkKG5vZGUtbmFtZSkiLCAiJChwb2QtdWlkKSJdCiAgICBzb21lIGFsbG93ZWQgaW4gYWx3YXlzX2FsbG93ZWQKICAgIGNvbnRhaW5zKHBfbmFtZV92YWx1ZVsxXSwgYWxsb3dlZCkKCiAgICBwcmludCgiYWxsb3dfdmFyIDU6IHRydWUiKQp9CgojIEFsbG93IGZpZWxkUmVmICJmaWVsZFBhdGg6IHN0YXR1cy5ob3N0SVAiIHZhbHVlcy4KYWxsb3dfdmFyKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBpX3Zhciwgc19uYW1lLCBzX25hbWVzcGFjZSkgewogICAgbmFtZV92YWx1ZSA6PSBzcGxpdChpX3ZhciwgIj0iKQogICAgY291bnQobmFtZV92YWx1ZSkgPT0gMgogICAgaXNfaXAobmFtZV92YWx1ZVsxXSkKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIGFsbG93X2hvc3RfaXBfdmFyKG5hbWVfdmFsdWVbMF0sIHBfdmFyKQoKICAgIHByaW50KCJhbGxvd192YXIgNjogdHJ1ZSIpCn0KCiMgQWxsb3cgcmVzb3VyY2VGaWVsZFJlZiB2YWx1ZXMgKGUuZy4sICJsaW1pdHMuY3B1IikuCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIG5hbWVfdmFsdWUgOj0gc3BsaXQoaV92YXIsICI9IikKICAgIGNvdW50KG5hbWVfdmFsdWUpID09IDIKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHBfbmFtZV92YWx1ZSA6PSBzcGxpdChwX3ZhciwgIj0iKQogICAgY291bnQocF9uYW1lX3ZhbHVlKSA9PSAyCgogICAgcF9uYW1lX3ZhbHVlWzBdID09IG5hbWVfdmFsdWVbMF0KCiAgICAjIGEgdmFyaWFibGUgd2Ugc2hvdWxkIGJlIHZhbGlkYXRpbmcgdXNpbmcgYSByZWdleCBmcm9tIHNldHRpbmdzCiAgICBwX25hbWVfdmFsdWVbMV0gPT0gIiQodmFsaWRhdGUtZnJvbS1zZXR0aW5ncykiCgogICAgcmVnZXhfdmFsIDo9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuQ3JlYXRlQ29udGFpbmVyUmVxdWVzdC5hbGxvd19lbnZfcmVnZXhfbWFwW25hbWVfdmFsdWVbMF1dCgogICAgcHJpbnQoImFsbG93X3ZhciA3OiB2YWwgPSIsIG5hbWVfdmFsdWVbMV0pCiAgICBwcmludCgiYWxsb3dfdmFyIDc6IHJlZ2V4X3ZhbCA9IiwgcmVnZXhfdmFsKQoKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4X3ZhbCwgbmFtZV92YWx1ZVsxXSkKCiAgICBwcmludCgiYWxsb3dfdmFyIDc6IHRydWUiKQp9CgojIE1hdGNoIGlucHV0IHdpdGggb25lIG9mIHRoZSBwb2xpY3kgdmFyaWFibGVzLCBhZnRlciBzdWJzdGl0dXRpbmcgJChzYW5kYm94LW5hbWVzcGFjZSkuCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHNvbWUgcF92YXIgaW4gcF9wcm9jZXNzLkVudgogICAgcF92YXIyIDo9IHJlcGxhY2UocF92YXIsICIkKHNhbmRib3gtbmFtZXNwYWNlKSIsIHNfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd192YXIgODogcF92YXIyID0iLCBwX3ZhcjIpCiAgICBwX3ZhcjIgPT0gaV92YXIKCiAgICBwcmludCgiYWxsb3dfdmFyIDg6IHRydWUiKQp9CgphbGxvd19wb2RfaXBfdmFyKHZhcl9uYW1lLCBwX3ZhcikgewogICAgcHJpbnQoImFsbG93X3BvZF9pcF92YXI6IHZhcl9uYW1lID0iLCB2YXJfbmFtZSwgInBfdmFyID0iLCBwX3ZhcikKCiAgICBwX25hbWVfdmFsdWUgOj0gc3BsaXQocF92YXIsICI9IikKICAgIGNvdW50KHBfbmFtZV92YWx1ZSkgPT0gMgoKICAgIHBfbmFtZV92YWx1ZVswXSA9PSB2YXJfbmFtZQogICAgcF9uYW1lX3ZhbHVlWzFdID09ICIkKHBvZC1pcCkiCgogICAgcHJpbnQoImFsbG93X3BvZF9pcF92YXI6IHRydWUiKQp9CgphbGxvd19ob3N0X2lwX3Zhcih2YXJfbmFtZSwgcF92YXIpIHsKICAgIHByaW50KCJhbGxvd19ob3N0X2lwX3ZhcjogdmFyX25hbWUgPSIsIHZhcl9uYW1lLCAicF92YXIgPSIsIHBfdmFyKQoKICAgIHBfbmFtZV92YWx1ZSA6PSBzcGxpdChwX3ZhciwgIj0iKQogICAgY291bnQocF9uYW1lX3ZhbHVlKSA9PSAyCgogICAgcF9uYW1lX3ZhbHVlWzBdID09IHZhcl9uYW1lCiAgICBwX25hbWVfdmFsdWVbMV0gPT0gIiQoaG9zdC1pcCkiCgogICAgcHJpbnQoImFsbG93X2hvc3RfaXBfdmFyOiB0cnVlIikKfQoKaXNfaXAodmFsdWUpIHsKICAgIGJ5dGVzID0gc3BsaXQodmFsdWUsICIuIikKICAgIGNvdW50KGJ5dGVzKSA9PSA0CgogICAgaXNfaXBfZmlyc3RfYnl0ZShieXRlc1swXSkKICAgIGlzX2lwX290aGVyX2J5dGUoYnl0ZXNbMV0pCiAgICBpc19pcF9vdGhlcl9ieXRlKGJ5dGVzWzJdKQogICAgaXNfaXBfb3RoZXJfYnl0ZShieXRlc1szXSkKfQppc19pcF9maXJzdF9ieXRlKGNvbXBvbmVudCkgewogICAgbnVtYmVyID0gdG9fbnVtYmVyKGNvbXBvbmVudCkKICAgIG51bWJlciA+PSAxCiAgICBudW1iZXIgPD0gMjU1Cn0KaXNfaXBfb3RoZXJfYnl0ZShjb21wb25lbnQpIHsKICAgIG51bWJlciA9IHRvX251bWJlcihjb21wb25lbnQpCiAgICBudW1iZXIgPj0gMAogICAgbnVtYmVyIDw9IDI1NQp9CgojIE9DSSByb290LlBhdGgKYWxsb3dfcm9vdF9wYXRoKHBfb2NpLCBpX29jaSwgYnVuZGxlX2lkKSB7CiAgICBpX3BhdGggOj0gaV9vY2kuUm9vdC5QYXRoCiAgICBwX3BhdGgxIDo9IHBfb2NpLlJvb3QuUGF0aAogICAgcHJpbnQoImFsbG93X3Jvb3RfcGF0aDogaV9wYXRoID0iLCBpX3BhdGgsICJwX3BhdGgxID0iLCBwX3BhdGgxKQoKICAgIHBfcGF0aDIgOj0gcmVwbGFjZShwX3BhdGgxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfcm9vdF9wYXRoOiBwX3BhdGgyID0iLCBwX3BhdGgyKQoKICAgIHBfcGF0aDMgOj0gcmVwbGFjZShwX3BhdGgyLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X3Jvb3RfcGF0aDogcF9wYXRoMyA9IiwgcF9wYXRoMykKCiAgICBwX3BhdGgzID09IGlfcGF0aAoKICAgIHByaW50KCJhbGxvd19yb290X3BhdGg6IHRydWUiKQp9CgojIGRldmljZSBtb3VudHMKYWxsb3dfbW91bnQocF9vY2ksIGlfbW91bnQsIGlfc3RvcmFnZXMsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcHJpbnQoImFsbG93X21vdW50OiBpX21vdW50ID0iLCBpX21vdW50KQoKICAgIHNvbWUgcF9tb3VudCBpbiBwX29jaS5Nb3VudHMKICAgIHNvbWUgaV9zdG9yYWdlIGluIGlfc3RvcmFnZXMKCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IHBfbW91bnQgPSIsIHBfbW91bnQpCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IGlfc3RvcmFnZSA9IiwgaV9zdG9yYWdlKQoKICAgIGNoZWNrX21vdW50KHBfbW91bnQsIGlfbW91bnQsIGlfc3RvcmFnZSwgYnVuZGxlX2lkLCBzYW5kYm94X2lkKQoKICAgICMgVE9ETzogYXJlIHRoZXJlIGFueSBvdGhlciByZXF1aXJlZCBwb2xpY3kgY2hlY2tzIGZvciBtb3VudHMgLSBlLmcuLAogICAgIyAgICAgICBtdWx0aXBsZSBtb3VudHMgd2l0aCBzYW1lIHNvdXJjZSBvciBkZXN0aW5hdGlvbj8KCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IHRydWUiKQp9CgpjaGVja19tb3VudChwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcF9tb3VudCA9PSBpX21vdW50CiAgICBwcmludCgiY2hlY2tfbW91bnQgMTogdHJ1ZSIpCn0KY2hlY2tfbW91bnQocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHBfbW91bnQuZGVzdGluYXRpb24gPT0gaV9tb3VudC5kZXN0aW5hdGlvbgogICAgcF9tb3VudC50eXBlXyA9PSBpX21vdW50LnR5cGVfCiAgICBwX21vdW50Lm9wdGlvbnMgPT0gaV9tb3VudC5vcHRpb25zCgogICAgbW91bnRfc291cmNlX2FsbG93cyhwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkKCiAgICBwcmludCgiY2hlY2tfbW91bnQgMjogdHJ1ZSIpCn0KCm1vdW50X3NvdXJjZV9hbGxvd3MocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHJlZ2V4MSA6PSBwX21vdW50LnNvdXJjZQogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5tb3VudF9zb3VyY2VfY3BhdGgpCiAgICByZWdleDQgOj0gcmVwbGFjZShyZWdleDMsICIkKGJ1bmRsZS1pZCkiLCBidW5kbGVfaWQpCgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMTogcmVnZXg0ID0iLCByZWdleDQpCiAgICByZWdleC5tYXRjaChyZWdleDQsIGlfbW91bnQuc291cmNlKQoKICAgIHByaW50KCJtb3VudF9zb3VyY2VfYWxsb3dzIDE6IHRydWUiKQp9Cm1vdW50X3NvdXJjZV9hbGxvd3MocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHJlZ2V4MSA6PSBwX21vdW50LnNvdXJjZQogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5tb3VudF9zb3VyY2VfY3BhdGgpCiAgICByZWdleDQgOj0gcmVwbGFjZShyZWdleDMsICIkKHNhbmRib3gtaWQpIiwgc2FuZGJveF9pZCkKCiAgICBwcmludCgibW91bnRfc291cmNlX2FsbG93cyAyOiByZWdleDQgPSIsIHJlZ2V4NCkKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4NCwgaV9tb3VudC5zb3VyY2UpCgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMjogdHJ1ZSIpCn0KbW91bnRfc291cmNlX2FsbG93cyhwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogaV9tb3VudC5zb3VyY2UgPSIsIGlfbW91bnQuc291cmNlKQogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogaV9zdG9yYWdlLm1vdW50X3BvaW50ID0iLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCgogICAgaV9tb3VudC5zb3VyY2UgPT0gaV9zdG9yYWdlLm1vdW50X3BvaW50CgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogdHJ1ZSIpCn0KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBDcmVhdGUgY29udGFpbmVyIFN0b3JhZ2VzCgphbGxvd19zdG9yYWdlcyhwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHBfY291bnQgOj0gY291bnQocF9zdG9yYWdlcykKICAgIGlfY291bnQgOj0gY291bnQoaV9zdG9yYWdlcykKICAgIHByaW50KCJhbGxvd19zdG9yYWdlczogcF9jb3VudCA9IiwgcF9jb3VudCwgImlfY291bnQgPSIsIGlfY291bnQpCgogICAgcF9jb3VudCA9PSBpX2NvdW50CgogICAgIyBHZXQgdGhlIGNvbnRhaW5lciBpbWFnZSBsYXllciBJRHMgYW5kIHZlcml0eSByb290IGhhc2hlcywgZnJvbSB0aGUgIm92ZXJsYXlmcyIgc3RvcmFnZS4KICAgIHNvbWUgb3ZlcmxheV9zdG9yYWdlIGluIHBfc3RvcmFnZXMKICAgIG92ZXJsYXlfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIHByaW50KCJhbGxvd19zdG9yYWdlczogb3ZlcmxheV9zdG9yYWdlID0iLCBvdmVybGF5X3N0b3JhZ2UpCiAgICBjb3VudChvdmVybGF5X3N0b3JhZ2Uub3B0aW9ucykgPT0gMgoKICAgIGxheWVyX2lkcyA6PSBzcGxpdChvdmVybGF5X3N0b3JhZ2Uub3B0aW9uc1swXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiBsYXllcl9pZHMgPSIsIGxheWVyX2lkcykKCiAgICByb290X2hhc2hlcyA6PSBzcGxpdChvdmVybGF5X3N0b3JhZ2Uub3B0aW9uc1sxXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiByb290X2hhc2hlcyA9Iiwgcm9vdF9oYXNoZXMpCgogICAgZXZlcnkgaV9zdG9yYWdlIGluIGlfc3RvcmFnZXMgewogICAgICAgIGFsbG93X3N0b3JhZ2UocF9zdG9yYWdlcywgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpCiAgICB9CgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiB0cnVlIikKfQoKYWxsb3dfc3RvcmFnZShwX3N0b3JhZ2VzLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgc29tZSBwX3N0b3JhZ2UgaW4gcF9zdG9yYWdlcwoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiBwX3N0b3JhZ2UgPSIsIHBfc3RvcmFnZSkKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiBpX3N0b3JhZ2UgPSIsIGlfc3RvcmFnZSkKCiAgICBwX3N0b3JhZ2UuZHJpdmVyICAgICAgICAgICA9PSBpX3N0b3JhZ2UuZHJpdmVyCiAgICBwX3N0b3JhZ2UuZHJpdmVyX29wdGlvbnMgICA9PSBpX3N0b3JhZ2UuZHJpdmVyX29wdGlvbnMKICAgIHBfc3RvcmFnZS5mc19ncm91cCAgICAgICAgID09IGlfc3RvcmFnZS5mc19ncm91cAogICAgcF9zdG9yYWdlLmZzdHlwZSAgICAgICAgICAgPT0gaV9zdG9yYWdlLmZzdHlwZQoKICAgIGFsbG93X3N0b3JhZ2Vfc291cmNlKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKQogICAgYWxsb3dfc3RvcmFnZV9vcHRpb25zKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKQogICAgYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKQoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiB0cnVlIikKfQoKYWxsb3dfc3RvcmFnZV9zb3VyY2UocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX3NvdXJjZSAxOiBzdGFydCIpCgogICAgcF9zdG9yYWdlLnNvdXJjZSA9PSBpX3N0b3JhZ2Uuc291cmNlCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDE6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX3NvdXJjZShwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDI6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCgogICAgIyBEREREOkJCOkRELkY6IERvbWFpbjpCdXM6RGV2aWNlLkZ1bmN0aW9uCiAgICAjIGh0dHBzOi8vd3d3Lmtlcm5lbC5vcmcvZG9jL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtYnVzLXBjaQogICAgcmVnZXgubWF0Y2goYF5bYS1mMC05XXs0fTpbYS1mMC05XXsyfTpbYS1mMC05XXsyfVwuW2EtZjAtOV0kYCwgaV9zdG9yYWdlLnNvdXJjZSkKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9zb3VyY2UgMjogdHJ1ZSIpCn0KCmFsbG93X3N0b3JhZ2Vfc291cmNlKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKSB7CiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9zb3VyY2UgMzogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIGlfc3RvcmFnZS5zb3VyY2UgPT0gIm5vbmUiCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDM6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX3NvdXJjZShwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDQ6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJzbWIiCgogICAgIyBQYXR0ZXJuOiAvLzxzdG9yYWdlLWFjY291bnQtbmFtZT4uZmlsZS5jb3JlLndpbmRvd3MubmV0LzxrOHMtUFZDLW5hbWU+CiAgICAjIFN0b3JhZ2UgYWNjb3VudCBuYW1lOiBodHRwczovL2xlYXJuLm1pY3Jvc29mdC5jb20vZW4tdXMvYXp1cmUvc3RvcmFnZS9jb21tb24vc3RvcmFnZS1hY2NvdW50LW92ZXJ2aWV3I3N0b3JhZ2UtYWNjb3VudC1uYW1lCiAgICAjIEs4cyBQVkMgbmFtZTogaHR0cHM6Ly9rdWJlcm5ldGVzLmlvL2RvY3MvY29uY2VwdHMvb3ZlcnZpZXcvd29ya2luZy13aXRoLW9iamVjdHMvbmFtZXMvI2Rucy1zdWJkb21haW4tbmFtZXMKICAgIHJlZ2V4Lm1hdGNoKGBeXC9cLyhbYS16MC05XXszLDI0fSlcLmZpbGVcLmNvcmVcLndpbmRvd3NcLm5ldFwvW2EtejAtOV0oW2EtejAtOS4tXXswLDI1MX1bYS16MC05XSk/JGAsIGlfc3RvcmFnZS5zb3VyY2UpCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDQ6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMTogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgIT0gIm92ZXJsYXlmcyIKICAgIHBfc3RvcmFnZS5vcHRpb25zID09IGlfc3RvcmFnZS5vcHRpb25zCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAxOiB0cnVlIikKfQphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIGNvdW50KHBfc3RvcmFnZS5vcHRpb25zKSA9PSAyCgogICAgcG9saWN5X2lkcyA6PSBzcGxpdChwX3N0b3JhZ2Uub3B0aW9uc1swXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBwb2xpY3lfaWRzID0iLCBwb2xpY3lfaWRzKQogICAgcG9saWN5X2lkcyA9PSBsYXllcl9pZHMKCiAgICBwb2xpY3lfaGFzaGVzIDo9IHNwbGl0KHBfc3RvcmFnZS5vcHRpb25zWzFdLCAiOiIpCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IHBvbGljeV9oYXNoZXMgPSIsIHBvbGljeV9oYXNoZXMpCgogICAgcF9jb3VudCA6PSBjb3VudChwb2xpY3lfaWRzKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBwX2NvdW50ID0iLCBwX2NvdW50KQogICAgcF9jb3VudCA+PSAxCiAgICBwX2NvdW50ID09IGNvdW50KHBvbGljeV9oYXNoZXMpCgogICAgaV9jb3VudCA6PSBjb3VudChpX3N0b3JhZ2Uub3B0aW9ucykKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogaV9jb3VudCA9IiwgaV9jb3VudCkKICAgIGlfY291bnQgPT0gcF9jb3VudCArIDMKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zWzBdID0iLCBpX3N0b3JhZ2Uub3B0aW9uc1swXSkKICAgIGlfc3RvcmFnZS5vcHRpb25zWzBdID09ICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQubGF5ZXItc3JjLXByZWZpeD0vdmFyL2xpYi9jb250YWluZXJkL2lvLmNvbnRhaW5lcmQuc25hcHNob3R0ZXIudjEudGFyZGV2L2xheWVycyIKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zW2lfY291bnQgLSAyXSA9IiwgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDJdKQogICAgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDJdID09ICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQub3ZlcmxheS1ydyIKCiAgICBsb3dlcmRpciA6PSBjb25jYXQoIj0iLCBbImxvd2VyZGlyIiwgcF9zdG9yYWdlLm9wdGlvbnNbMF1dKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBsb3dlcmRpciA9IiwgbG93ZXJkaXIpCgogICAgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDFdID09IGxvd2VyZGlyCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zW2lfY291bnQgLSAxXSA9IiwgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDFdKQoKICAgIGV2ZXJ5IGksIHBvbGljeV9pZCBpbiBwb2xpY3lfaWRzIHsKICAgICAgICBhbGxvd19vdmVybGF5X2xheWVyKHBvbGljeV9pZCwgcG9saWN5X2hhc2hlc1tpXSwgaV9zdG9yYWdlLm9wdGlvbnNbaSArIDFdKQogICAgfQoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogdHJ1ZSIpCn0KYWxsb3dfc3RvcmFnZV9vcHRpb25zKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKSB7CiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDM6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCiAgICBjb3VudChwX3N0b3JhZ2Uub3B0aW9ucykgPT0gMQoKICAgIHN0YXJ0c3dpdGgocF9zdG9yYWdlLm9wdGlvbnNbMF0sICIkKGhhc2giKQogICAgaGFzaF9zdWZmaXggOj0gdHJpbV9sZWZ0KHBfc3RvcmFnZS5vcHRpb25zWzBdLCAiJChoYXNoIikKCiAgICBlbmRzd2l0aChoYXNoX3N1ZmZpeCwgIikiKQogICAgaGFzaF9pbmRleCA6PSB0cmltX3JpZ2h0KGhhc2hfc3VmZml4LCAiKSIpCiAgICBpIDo9IHRvX251bWJlcihoYXNoX2luZGV4KQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAzOiBpID0iLCBpKQoKICAgIGhhc2hfb3B0aW9uIDo9IGNvbmNhdCgiPSIsIFsiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LnJvb3QtaGFzaCIsIHJvb3RfaGFzaGVzW2ldXSkKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMzogaGFzaF9vcHRpb24gPSIsIGhhc2hfb3B0aW9uKQoKICAgIGNvdW50KGlfc3RvcmFnZS5vcHRpb25zKSA9PSA0CiAgICBpX3N0b3JhZ2Uub3B0aW9uc1swXSA9PSAicm8iCiAgICBpX3N0b3JhZ2Uub3B0aW9uc1sxXSA9PSAiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmJsb2NrX2RldmljZT1maWxlIgogICAgaV9zdG9yYWdlLm9wdGlvbnNbMl0gPT0gImlvLmthdGFjb250YWluZXJzLmZzLW9wdC5pcy1sYXllciIKICAgIGlfc3RvcmFnZS5vcHRpb25zWzNdID09IGhhc2hfb3B0aW9uCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAzOiB0cnVlIikKfQphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgNDogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gInNtYiIKICAgIHBfb3B0c19jb3VudCA6PSBjb3VudChwX3N0b3JhZ2Uub3B0aW9ucykKICAgIGlfb3B0c19jb3VudCA6PSBjb3VudChpX3N0b3JhZ2Uub3B0aW9ucykKICAgIGlfb3B0c19jb3VudCA9PSBwX29wdHNfY291bnQgKyAyCgogICAgaV9vcHRfbWF0Y2hlcyA6PSBbaSB8IGkgOj0gaWR4OyBpZHggPCBwX29wdHNfY291bnQ7IHBfc3RvcmFnZS5vcHRpb25zW2lkeF0gPT0gaV9zdG9yYWdlLm9wdGlvbnNbaWR4XV0KICAgIGNvdW50KGlfb3B0X21hdGNoZXMpID09IHBfb3B0c19jb3VudAoKICAgIHN0YXJ0c3dpdGgoaV9zdG9yYWdlLm9wdGlvbnNbaV9vcHRzX2NvdW50LTJdLCAiYWRkcj0iKQogICAgY3JlZHMgPSBzcGxpdChpX3N0b3JhZ2Uub3B0aW9uc1tpX29wdHNfY291bnQtMV0sICIsIikKICAgIGNvdW50KGNyZWRzKSA9PSAyCiAgICBzdGFydHN3aXRoKGNyZWRzWzBdLCAidXNlcm5hbWU9IikKICAgIHN0YXJ0c3dpdGgoY3JlZHNbMV0sICJwYXNzd29yZD0iKQogICAgCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDQ6IHRydWUiKQp9CgphbGxvd19vdmVybGF5X2xheWVyKHBvbGljeV9pZCwgcG9saWN5X2hhc2gsIGlfb3B0aW9uKSB7CiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogcG9saWN5X2lkID0iLCBwb2xpY3lfaWQsICJwb2xpY3lfaGFzaCA9IiwgcG9saWN5X2hhc2gpCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogaV9vcHRpb24gPSIsIGlfb3B0aW9uKQoKICAgIHN0YXJ0c3dpdGgoaV9vcHRpb24sICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQubGF5ZXI9IikKICAgIGlfdmFsdWUgOj0gcmVwbGFjZShpX29wdGlvbiwgImlvLmthdGFjb250YWluZXJzLmZzLW9wdC5sYXllcj0iLCAiIikKICAgIGlfdmFsdWVfZGVjb2RlZCA6PSBiYXNlNjQuZGVjb2RlKGlfdmFsdWUpCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogaV92YWx1ZV9kZWNvZGVkID0iLCBpX3ZhbHVlX2RlY29kZWQpCgogICAgcG9saWN5X3N1ZmZpeCA6PSBjb25jYXQoIj0iLCBbInRhcixybyxpby5rYXRhY29udGFpbmVycy5mcy1vcHQuYmxvY2tfZGV2aWNlPWZpbGUsaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmlzLWxheWVyLGlvLmthdGFjb250YWluZXJzLmZzLW9wdC5yb290LWhhc2giLCBwb2xpY3lfaGFzaF0pCiAgICBwX3ZhbHVlIDo9IGNvbmNhdCgiLCIsIFtwb2xpY3lfaWQsIHBvbGljeV9zdWZmaXhdKQogICAgcHJpbnQoImFsbG93X292ZXJsYXlfbGF5ZXI6IHBfdmFsdWUgPSIsIHBfdmFsdWUpCgogICAgcF92YWx1ZSA9PSBpX3ZhbHVlX2RlY29kZWQKCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogdHJ1ZSIpCn0KCmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAidGFyIgoKICAgIHN0YXJ0c3dpdGgocF9zdG9yYWdlLm1vdW50X3BvaW50LCAiJChsYXllciIpCiAgICBtb3VudF9zdWZmaXggOj0gdHJpbV9sZWZ0KHBfc3RvcmFnZS5tb3VudF9wb2ludCwgIiQobGF5ZXIiKQoKICAgIGVuZHN3aXRoKG1vdW50X3N1ZmZpeCwgIikiKQogICAgbGF5ZXJfaW5kZXggOj0gdHJpbV9yaWdodChtb3VudF9zdWZmaXgsICIpIikKICAgIGkgOj0gdG9fbnVtYmVyKGxheWVyX2luZGV4KQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDE6IGkgPSIsIGkpCgogICAgbGF5ZXJfaWQgOj0gbGF5ZXJfaWRzW2ldCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMTogbGF5ZXJfaWQgPSIsIGxheWVyX2lkKQoKICAgIHBfbW91bnQgOj0gY29uY2F0KCIvIiwgWyIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L2xheWVycyIsIGxheWVyX2lkXSkKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCAxOiBwX21vdW50ID0iLCBwX21vdW50KQoKICAgIHBfbW91bnQgPT0gaV9zdG9yYWdlLm1vdW50X3BvaW50CgogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDE6IHRydWUiKQp9CmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAiZnVzZTMua2F0YS1vdmVybGF5IgoKICAgIG1vdW50MSA6PSByZXBsYWNlKHBfc3RvcmFnZS5tb3VudF9wb2ludCwgIiQoY3BhdGgpIiwgcG9saWN5X2RhdGEuY29tbW9uLmNwYXRoKQogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDI6IG1vdW50MiA9IiwgbW91bnQyKQoKICAgIG1vdW50MiA9PSBpX3N0b3JhZ2UubW91bnRfcG9pbnQKCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMjogdHJ1ZSIpCn0KYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKSB7CiAgICBwX3N0b3JhZ2UuZnN0eXBlID09ICJsb2NhbCIKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQyID0iLCBtb3VudDIpCgogICAgbW91bnQzIDo9IHJlcGxhY2UobW91bnQyLCAiJChzYW5kYm94LWlkKSIsIHNhbmRib3hfaWQpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQzID0iLCBtb3VudDMpCgogICAgcmVnZXgubWF0Y2gobW91bnQzLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCgogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDM6IHRydWUiKQp9CmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAiYmluZCIKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNDogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNDogbW91bnQyID0iLCBtb3VudDIpCgogICAgbW91bnQzIDo9IHJlcGxhY2UobW91bnQyLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDQ6IG1vdW50MyA9IiwgbW91bnQzKQoKICAgIHJlZ2V4Lm1hdGNoKG1vdW50MywgaV9zdG9yYWdlLm1vdW50X3BvaW50KQoKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA0OiB0cnVlIikKfQphbGxvd19tb3VudF9wb2ludChwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgYnVuZGxlX2lkLCBzYW5kYm94X2lkLCBsYXllcl9pZHMpIHsKICAgIHBfc3RvcmFnZS5mc3R5cGUgPT0gInRtcGZzIgoKICAgIG1vdW50MSA6PSBwX3N0b3JhZ2UubW91bnRfcG9pbnQKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA1OiBtb3VudDEgPSIsIG1vdW50MSkKCiAgICByZWdleC5tYXRjaChtb3VudDEsIGlfc3RvcmFnZS5tb3VudF9wb2ludCkKCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNTogdHJ1ZSIpCn0KYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKSB7CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogaV9zdG9yYWdlLm1vdW50X3BvaW50ID0iLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCiAgICBhbGxvd19kaXJlY3Rfdm9sX2RyaXZlcihwX3N0b3JhZ2UsIGlfc3RvcmFnZSkKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChzcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQyID0iLCBtb3VudDIpCgogICAgZGlyZWN0X3ZvbF9wYXRoIDo9IGlfc3RvcmFnZS5zb3VyY2UKICAgIG1vdW50MyA6PSByZXBsYWNlKG1vdW50MiwgIiQoYjY0LWRpcmVjdC12b2wtcGF0aCkiLCBiYXNlNjR1cmwuZW5jb2RlKGRpcmVjdF92b2xfcGF0aCkpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQzID0iLCBtb3VudDMpCgogICAgbW91bnQzID09IGlfc3RvcmFnZS5tb3VudF9wb2ludAoKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA2OiB0cnVlIikKfQoKYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIocF9zdG9yYWdlLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19kaXJlY3Rfdm9sX2RyaXZlciAxOiBzdGFydCIpCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCiAgICBwcmludCgiYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIgMTogdHJ1ZSIpCn0KYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIocF9zdG9yYWdlLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19kaXJlY3Rfdm9sX2RyaXZlciAyOiBzdGFydCIpCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJzbWIiCiAgICBwcmludCgiYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIgMjogdHJ1ZSIpCn0KCiMgRXhlY1Byb2Nlc3NSZXF1ZXN0LnByb2Nlc3MuQ2FwYWJpbGl0aWVzCmFsbG93X2V4ZWNfY2FwcyhpX2NhcHMpIHsKICAgIG5vdCBpX2NhcHMuQW1iaWVudAogICAgbm90IGlfY2Fwcy5Cb3VuZGluZwogICAgbm90IGlfY2Fwcy5FZmZlY3RpdmUKICAgIG5vdCBpX2NhcHMuSW5oZXJpdGFibGUKICAgIG5vdCBpX2NhcHMuUGVybWl0dGVkCn0KCiMgT0NJLlByb2Nlc3MuQ2FwYWJpbGl0aWVzCmFsbG93X2NhcHMocF9jYXBzLCBpX2NhcHMpIHsKICAgIHByaW50KCJhbGxvd19jYXBzOiBwb2xpY3kgQW1iaWVudCA9IiwgcF9jYXBzLkFtYmllbnQpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgQW1iaWVudCA9IiwgaV9jYXBzLkFtYmllbnQpCiAgICBtYXRjaF9jYXBzKHBfY2Fwcy5BbWJpZW50LCBpX2NhcHMuQW1iaWVudCkKCiAgICBwcmludCgiYWxsb3dfY2FwczogcG9saWN5IEJvdW5kaW5nID0iLCBwX2NhcHMuQm91bmRpbmcpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgQm91bmRpbmcgPSIsIGlfY2Fwcy5Cb3VuZGluZykKICAgIG1hdGNoX2NhcHMocF9jYXBzLkJvdW5kaW5nLCBpX2NhcHMuQm91bmRpbmcpCgogICAgcHJpbnQoImFsbG93X2NhcHM6IHBvbGljeSBFZmZlY3RpdmUgPSIsIHBfY2Fwcy5FZmZlY3RpdmUpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgRWZmZWN0aXZlID0iLCBpX2NhcHMuRWZmZWN0aXZlKQogICAgbWF0Y2hfY2FwcyhwX2NhcHMuRWZmZWN0aXZlLCBpX2NhcHMuRWZmZWN0aXZlKQoKICAgIHByaW50KCJhbGxvd19jYXBzOiBwb2xpY3kgSW5oZXJpdGFibGUgPSIsIHBfY2Fwcy5Jbmhlcml0YWJsZSkKICAgIHByaW50KCJhbGxvd19jYXBzOiBpbnB1dCBJbmhlcml0YWJsZSA9IiwgaV9jYXBzLkluaGVyaXRhYmxlKQogICAgbWF0Y2hfY2FwcyhwX2NhcHMuSW5oZXJpdGFibGUsIGlfY2Fwcy5Jbmhlcml0YWJsZSkKCiAgICBwcmludCgiYWxsb3dfY2FwczogcG9saWN5IFBlcm1pdHRlZCA9IiwgcF9jYXBzLlBlcm1pdHRlZCkKICAgIHByaW50KCJhbGxvd19jYXBzOiBpbnB1dCBQZXJtaXR0ZWQgPSIsIGlfY2Fwcy5QZXJtaXR0ZWQpCiAgICBtYXRjaF9jYXBzKHBfY2Fwcy5QZXJtaXR0ZWQsIGlfY2Fwcy5QZXJtaXR0ZWQpCn0KCm1hdGNoX2NhcHMocF9jYXBzLCBpX2NhcHMpIHsKICAgIHByaW50KCJtYXRjaF9jYXBzIDE6IHN0YXJ0IikKCiAgICBwX2NhcHMgPT0gaV9jYXBzCgogICAgcHJpbnQoIm1hdGNoX2NhcHMgMTogdHJ1ZSIpCn0KbWF0Y2hfY2FwcyhwX2NhcHMsIGlfY2FwcykgewogICAgcHJpbnQoIm1hdGNoX2NhcHMgMjogc3RhcnQiKQoKICAgIGNvdW50KHBfY2FwcykgPT0gMQogICAgcF9jYXBzWzBdID09ICIkKGRlZmF1bHRfY2FwcykiCgogICAgcHJpbnQoIm1hdGNoX2NhcHMgMjogZGVmYXVsdF9jYXBzID0iLCBwb2xpY3lfZGF0YS5jb21tb24uZGVmYXVsdF9jYXBzKQogICAgcG9saWN5X2RhdGEuY29tbW9uLmRlZmF1bHRfY2FwcyA9PSBpX2NhcHMKCiAgICBwcmludCgibWF0Y2hfY2FwcyAyOiB0cnVlIikKfQptYXRjaF9jYXBzKHBfY2FwcywgaV9jYXBzKSB7CiAgICBwcmludCgibWF0Y2hfY2FwcyAzOiBzdGFydCIpCgogICAgY291bnQocF9jYXBzKSA9PSAxCiAgICBwX2NhcHNbMF0gPT0gIiQocHJpdmlsZWdlZF9jYXBzKSIKCiAgICBwcmludCgibWF0Y2hfY2FwcyAzOiBwcml2aWxlZ2VkX2NhcHMgPSIsIHBvbGljeV9kYXRhLmNvbW1vbi5wcml2aWxlZ2VkX2NhcHMpCiAgICBwb2xpY3lfZGF0YS5jb21tb24ucHJpdmlsZWdlZF9jYXBzID09IGlfY2FwcwoKICAgIHByaW50KCJtYXRjaF9jYXBzIDM6IHRydWUiKQp9CgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgpjaGVja19kaXJlY3RvcnlfdHJhdmVyc2FsKGlfcGF0aCkgewogICAgbm90IHJlZ2V4Lm1hdGNoKCIoXnwvKS4uKCR8LykiLCBpX3BhdGgpCn0KCmNoZWNrX3N5bWxpbmtfc291cmNlKGlfc3JjKSB7CiAgICBpX3NyYyA9PSAiIgogICAgcHJpbnQoImNoZWNrX3N5bWxpbmtfc291cmNlIDE6IHRydWUiKQp9CmNoZWNrX3N5bWxpbmtfc291cmNlKGlfc3JjKSB7CiAgICBpX3NyYyAhPSAiIgogICAgcHJpbnQoImNoZWNrX3N5bWxpbmtfc291cmNlIDI6IGlfc3JjID0iLCBpX3NyYykKCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24uc19zb3VyY2UxLCBpX3NyYykKCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMjogdHJ1ZSIpCn0KY2hlY2tfc3ltbGlua19zb3VyY2UoaV9zcmMpIHsKICAgIGlfc3JjICE9ICIiCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMzogaV9zcmMgPSIsIGlfc3JjKQoKICAgIHJlZ2V4Lm1hdGNoKHBvbGljeV9kYXRhLmNvbW1vbi5zX3NvdXJjZTIsIGlfc3JjKQogICAgY2hlY2tfZGlyZWN0b3J5X3RyYXZlcnNhbChpX3NyYykKCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMzogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfc3RvcmFnZXMoaV9zdG9yYWdlcykgewogICAgcHJpbnQoImFsbG93X3NhbmRib3hfc3RvcmFnZXM6IGlfc3RvcmFnZXMgPSIsIGlfc3RvcmFnZXMpCgogICAgcF9zdG9yYWdlcyA6PSBwb2xpY3lfZGF0YS5zYW5kYm94LnN0b3JhZ2VzCiAgICBldmVyeSBpX3N0b3JhZ2UgaW4gaV9zdG9yYWdlcyB7CiAgICAgICAgYWxsb3dfc2FuZGJveF9zdG9yYWdlKHBfc3RvcmFnZXMsIGlfc3RvcmFnZSkKICAgIH0KCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9zdG9yYWdlczogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfc3RvcmFnZShwX3N0b3JhZ2VzLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IGlfc3RvcmFnZSA9IiwgaV9zdG9yYWdlKQoKICAgIHNvbWUgcF9zdG9yYWdlIGluIHBfc3RvcmFnZXMKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IHBfc3RvcmFnZSA9IiwgcF9zdG9yYWdlKQogICAgaV9zdG9yYWdlID09IHBfc3RvcmFnZQoKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IHRydWUiKQp9CgpDb3B5RmlsZVJlcXVlc3QgewogICAgcHJpbnQoIkNvcHlGaWxlUmVxdWVzdDogaW5wdXQucGF0aCA9IiwgaW5wdXQucGF0aCkKCiAgICBjaGVja19zeW1saW5rX3NvdXJjZShpbnB1dC5zeW1saW5rX3NyYykKICAgIGNoZWNrX2RpcmVjdG9yeV90cmF2ZXJzYWwoaW5wdXQucGF0aCkKCiAgICBzb21lIHJlZ2V4MSBpbiBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLkNvcHlGaWxlUmVxdWVzdAogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5jcGF0aCkKICAgIHJlZ2V4NCA6PSByZXBsYWNlKHJlZ2V4MywgIiQoYnVuZGxlLWlkKSIsIEJVTkRMRV9JRCkKICAgIHByaW50KCJDb3B5RmlsZVJlcXVlc3Q6IHJlZ2V4NCA9IiwgcmVnZXg0KQoKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4NCwgaW5wdXQucGF0aCkKCiAgICBwcmludCgiQ29weUZpbGVSZXF1ZXN0OiB0cnVlIikKfQoKQ3JlYXRlU2FuZGJveFJlcXVlc3QgewogICAgcHJpbnQoIkNyZWF0ZVNhbmRib3hSZXF1ZXN0OiBpbnB1dC5ndWVzdF9ob29rX3BhdGggPSIsIGlucHV0Lmd1ZXN0X2hvb2tfcGF0aCkKICAgIGNvdW50KGlucHV0Lmd1ZXN0X2hvb2tfcGF0aCkgPT0gMAoKICAgIHByaW50KCJDcmVhdGVTYW5kYm94UmVxdWVzdDogaW5wdXQua2VybmVsX21vZHVsZXMgPSIsIGlucHV0Lmtlcm5lbF9tb2R1bGVzKQogICAgY291bnQoaW5wdXQua2VybmVsX21vZHVsZXMpID09IDAKCiAgICBpX3BpZG5zIDo9IGlucHV0LnNhbmRib3hfcGlkbnMKICAgIHByaW50KCJDcmVhdGVTYW5kYm94UmVxdWVzdDogaV9waWRucyA9IiwgaV9waWRucykKICAgIGlfcGlkbnMgPT0gZmFsc2UKICAgIGFsbG93X3NhbmRib3hfc3RvcmFnZXMoaW5wdXQuc3RvcmFnZXMpCn0KCmFsbG93X2V4ZWMocF9jb250YWluZXIsIGlfcHJvY2VzcykgewogICAgcHJpbnQoImFsbG93X2V4ZWM6IHN0YXJ0IikKCiAgICBwX29jaSA9IHBfY29udGFpbmVyLk9DSQogICAgcF9zX25hbWUgPSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc19uYW1lc3BhY2UgPSBnZXRfc3RhdGVfdmFsKCJuYW1lc3BhY2UiKQogICAgYWxsb3dfcHJvYmVfcHJvY2VzcyhwX29jaS5Qcm9jZXNzLCBpX3Byb2Nlc3MsIHBfc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfZXhlYzogdHJ1ZSIpCn0KCmFsbG93X2ludGVyYWN0aXZlX2V4ZWMocF9jb250YWluZXIsIGlfcHJvY2VzcykgewogICAgcHJpbnQoImFsbG93X2ludGVyYWN0aXZlX2V4ZWM6IHN0YXJ0IikKCiAgICBwX29jaSA9IHBfY29udGFpbmVyLk9DSQogICAgcF9zX25hbWUgPSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc19uYW1lc3BhY2UgPSBnZXRfc3RhdGVfdmFsKCJuYW1lc3BhY2UiKQogICAgYWxsb3dfaW50ZXJhY3RpdmVfcHJvY2VzcyhwX29jaS5Qcm9jZXNzLCBpX3Byb2Nlc3MsIHBfc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfaW50ZXJhY3RpdmVfZXhlYzogdHJ1ZSIpCn0KCiMgVE9ETzogc2hvdWxkIG90aGVyIEV4ZWNQcm9jZXNzUmVxdWVzdCBpbnB1dCBkYXRhIGZpZWxkcyBiZSB2YWxpZGF0ZWQgYXMgd2VsbD8KRXhlY1Byb2Nlc3NSZXF1ZXN0IHsKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMTogaW5wdXQgPSIsIGlucHV0KQoKICAgIHNvbWUgcF9jb21tYW5kIGluIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuRXhlY1Byb2Nlc3NSZXF1ZXN0LmFsbG93ZWRfY29tbWFuZHMKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMTogcF9jb21tYW5kID0iLCBwX2NvbW1hbmQpCiAgICBwX2NvbW1hbmQgPT0gaW5wdXQucHJvY2Vzcy5BcmdzCgogICAgIyBUT0RPOiBtYXRjaCBwX2NvbnRhaW5lcidzIElEIHdpdGggdGhlIGlucHV0IGNvbnRhaW5lcl9pZC4KICAgIHNvbWUgcF9jb250YWluZXIgaW4gcG9saWN5X2RhdGEuY29udGFpbmVycwogICAgYWxsb3dfaW50ZXJhY3RpdmVfZXhlYyhwX2NvbnRhaW5lciwgaW5wdXQucHJvY2VzcykKCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDE6IHRydWUiKQp9CkV4ZWNQcm9jZXNzUmVxdWVzdCB7CiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDI6IGlucHV0ID0iLCBpbnB1dCkKCiAgICAjIFRPRE86IG1hdGNoIGlucHV0IGNvbnRhaW5lciBJRCB3aXRoIGl0cyBjb3JyZXNwb25kaW5nIGNvbnRhaW5lci5leGVjX2NvbW1hbmRzLgogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBzb21lIHBfY29tbWFuZCBpbiBwX2NvbnRhaW5lci5leGVjX2NvbW1hbmRzCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDI6IHBfY29tbWFuZCA9IiwgcF9jb21tYW5kKQoKICAgICMgVE9ETzogc2hvdWxkIG90aGVyIGlucHV0IGRhdGEgZmllbGRzIGJlIHZhbGlkYXRlZCBhcyB3ZWxsPwogICAgcF9jb21tYW5kID09IGlucHV0LnByb2Nlc3MuQXJncwoKICAgIGFsbG93X2V4ZWMocF9jb250YWluZXIsIGlucHV0LnByb2Nlc3MpCgogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAyOiB0cnVlIikKfQpFeGVjUHJvY2Vzc1JlcXVlc3QgewogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAzOiBpbnB1dCA9IiwgaW5wdXQpCgogICAgaV9jb21tYW5kID0gY29uY2F0KCIgIiwgaW5wdXQucHJvY2Vzcy5BcmdzKQogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAzOiBpX2NvbW1hbmQgPSIsIGlfY29tbWFuZCkKCiAgICBzb21lIHBfcmVnZXggaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5FeGVjUHJvY2Vzc1JlcXVlc3QucmVnZXgKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMzogcF9yZWdleCA9IiwgcF9yZWdleCkKCiAgICByZWdleC5tYXRjaChwX3JlZ2V4LCBpX2NvbW1hbmQpCgogICAgIyBUT0RPOiBtYXRjaCBwX2NvbnRhaW5lcidzIElEIHdpdGggdGhlIGlucHV0IGNvbnRhaW5lcl9pZC4KICAgIHNvbWUgcF9jb250YWluZXIgaW4gcG9saWN5X2RhdGEuY29udGFpbmVycwogICAgYWxsb3dfaW50ZXJhY3RpdmVfZXhlYyhwX2NvbnRhaW5lciwgaW5wdXQucHJvY2VzcykKCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDM6IHRydWUiKQp9CgpVcGRhdGVSb3V0ZXNSZXF1ZXN0IHsKICAgIHByaW50KCJVcGRhdGVSb3V0ZXNSZXF1ZXN0OiBpbnB1dCA9IiwgaW5wdXQpCiAgICBwcmludCgiVXBkYXRlUm91dGVzUmVxdWVzdDogcG9saWN5ID0iLCBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLlVwZGF0ZVJvdXRlc1JlcXVlc3QpCgogICAgaV9yb3V0ZXMgOj0gaW5wdXQucm91dGVzLlJvdXRlcwogICAgcF9zb3VyY2VfcmVnZXggPSBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLlVwZGF0ZVJvdXRlc1JlcXVlc3QuZm9yYmlkZGVuX3NvdXJjZV9yZWdleAogICAgcF9uYW1lcyA9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuVXBkYXRlUm91dGVzUmVxdWVzdC5mb3JiaWRkZW5fZGV2aWNlX25hbWVzCgogICAgZXZlcnkgaV9yb3V0ZSBpbiBpX3JvdXRlcyB7CiAgICAgICAgcHJpbnQoImlfcm91dGUuc291cmNlID0iLCBpX3JvdXRlLnNvdXJjZSkKICAgICAgICBldmVyeSBwX3JlZ2V4IGluIHBfc291cmNlX3JlZ2V4IHsKICAgICAgICAgICAgcHJpbnQoInBfcmVnZXggPSIsIHBfcmVnZXgpCiAgICAgICAgICAgIG5vdCByZWdleC5tYXRjaChwX3JlZ2V4LCBpX3JvdXRlLnNvdXJjZSkKICAgICAgICB9CgogICAgICAgIHByaW50KCJpX3JvdXRlLmRldmljZSA9IiwgaV9yb3V0ZS5kZXZpY2UpCiAgICAgICAgbm90IGlfcm91dGUuZGV2aWNlIGluIHBfbmFtZXMKICAgIH0KCiAgICBwcmludCgiVXBkYXRlUm91dGVzUmVxdWVzdDogdHJ1ZSIpCn0KClVwZGF0ZUludGVyZmFjZVJlcXVlc3QgewogICAgcHJpbnQoIlVwZGF0ZUludGVyZmFjZVJlcXVlc3Q6IGlucHV0ID0iLCBpbnB1dCkKICAgIHByaW50KCJVcGRhdGVJbnRlcmZhY2VSZXF1ZXN0OiBwb2xpY3kgPSIsIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuVXBkYXRlSW50ZXJmYWNlUmVxdWVzdCkKCiAgICBpX2ludGVyZmFjZSA6PSBpbnB1dC5pbnRlcmZhY2UKICAgIHBfZmxhZ3MgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmFsbG93X3Jhd19mbGFncwoKICAgICMgVHlwaWNhbGx5LCBqdXN0IElGRl9OT0FSUCBpcyB1c2VkLgogICAgYml0cy5hbmQoaV9pbnRlcmZhY2UucmF3X2ZsYWdzLCBiaXRzLm5lZ2F0ZShwX2ZsYWdzKSkgPT0gMAoKICAgIHBfbmFtZXMgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmZvcmJpZGRlbl9uYW1lcwoKICAgIG5vdCBpX2ludGVyZmFjZS5uYW1lIGluIHBfbmFtZXMKCiAgICBwX2h3YWRkcnMgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmZvcmJpZGRlbl9od19hZGRycwoKICAgIG5vdCBpX2ludGVyZmFjZS5od0FkZHIgaW4gcF9od2FkZHJzCgogICAgcHJpbnQoIlVwZGF0ZUludGVyZmFjZVJlcXVlc3Q6IHRydWUiKQp9CgpDbG9zZVN0ZGluUmVxdWVzdCB7CiAgICBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLkNsb3NlU3RkaW5SZXF1ZXN0ID09IHRydWUKfQoKUmVhZFN0cmVhbVJlcXVlc3QgewogICAgcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5SZWFkU3RyZWFtUmVxdWVzdCA9PSB0cnVlCn0KClVwZGF0ZUVwaGVtZXJhbE1vdW50c1JlcXVlc3QgewogICAgcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVFcGhlbWVyYWxNb3VudHNSZXF1ZXN0ID09IHRydWUKfQoKV3JpdGVTdHJlYW1SZXF1ZXN0IHsKICAgIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuV3JpdGVTdHJlYW1SZXF1ZXN0ID09IHRydWUKfQoKcG9saWN5X2RhdGEgOj0gewogICJjb250YWluZXJzIjogWwogICAgewogICAgICAiT0NJIjogewogICAgICAgICJWZXJzaW9uIjogIjEuMS4wLXJjLjEiLAogICAgICAgICJQcm9jZXNzIjogewogICAgICAgICAgIlRlcm1pbmFsIjogZmFsc2UsCiAgICAgICAgICAiVXNlciI6IHsKICAgICAgICAgICAgIlVJRCI6IDY1NTM1LAogICAgICAgICAgICAiR0lEIjogNjU1MzUsCiAgICAgICAgICAgICJBZGRpdGlvbmFsR2lkcyI6IFtdLAogICAgICAgICAgICAiVXNlcm5hbWUiOiAiIgogICAgICAgICAgfSwKICAgICAgICAgICJEZXByZWNhdGVkQXJncyI6IFsKICAgICAgICAgICAgIi9wYXVzZSIKICAgICAgICAgIF0sCiAgICAgICAgICAiQXJncyI6IFsKICAgICAgICAgICAgIi9wYXVzZSIKICAgICAgICAgIF0sCiAgICAgICAgICAiRW52IjogWwogICAgICAgICAgICAiUEFUSD0vdXNyL2xvY2FsL3NiaW46L3Vzci9sb2NhbC9iaW46L3Vzci9zYmluOi91c3IvYmluOi9zYmluOi9iaW4iCiAgICAgICAgICBdLAogICAgICAgICAgIkN3ZCI6ICIvIiwKICAgICAgICAgICJDYXBhYmlsaXRpZXMiOiB7CiAgICAgICAgICAgICJBbWJpZW50IjogW10sCiAgICAgICAgICAgICJCb3VuZGluZyI6IFsKICAgICAgICAgICAgICAiJChkZWZhdWx0X2NhcHMpIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiRWZmZWN0aXZlIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJJbmhlcml0YWJsZSI6IFtdLAogICAgICAgICAgICAiUGVybWl0dGVkIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICAiTm9OZXdQcml2aWxlZ2VzIjogdHJ1ZQogICAgICAgIH0sCiAgICAgICAgIlJvb3QiOiB7CiAgICAgICAgICAiUGF0aCI6ICIkKGNwYXRoKS8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgIlJlYWRvbmx5IjogdHJ1ZQogICAgICAgIH0sCiAgICAgICAgIk1vdW50cyI6IFsKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9wcm9jIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJwcm9jIiwKICAgICAgICAgICAgInR5cGVfIjogInByb2MiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2IiwKICAgICAgICAgICAgInNvdXJjZSI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJzdHJpY3RhdGltZSIsCiAgICAgICAgICAgICAgIm1vZGU9NzU1IiwKICAgICAgICAgICAgICAic2l6ZT02NTUzNmsiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L3B0cyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiZGV2cHRzIiwKICAgICAgICAgICAgInR5cGVfIjogImRldnB0cyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJuZXdpbnN0YW5jZSIsCiAgICAgICAgICAgICAgInB0bXhtb2RlPTA2NjYiLAogICAgICAgICAgICAgICJtb2RlPTA2MjAiLAogICAgICAgICAgICAgICJnaWQ9NSIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvc2htIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L3NobSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi9tcXVldWUiLAogICAgICAgICAgICAic291cmNlIjogIm1xdWV1ZSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJtcXVldWUiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvc3lzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJzeXNmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJzeXNmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2V0Yy9yZXNvbHYuY29uZiIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClyZXNvbHYuY29uZiQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJvIiwKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9kZXYiLAogICAgICAgICAgICAgICJub2V4ZWMiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0KICAgICAgICBdLAogICAgICAgICJBbm5vdGF0aW9ucyI6IHsKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmJ1bmRsZV9wYXRoIjogIi9ydW4vY29udGFpbmVyZC9pby5jb250YWluZXJkLnJ1bnRpbWUudjIudGFzay9rOHMuaW8vJChidW5kbGUtaWQpIiwKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIjogInBvZF9zYW5kYm94IiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSI6ICJzYW5kYm94IiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWlkIjogIl5bYS16MC05XXs2NH0kIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWxvZy1kaXJlY3RvcnkiOiAiXi92YXIvbG9nL3BvZHMvJChzYW5kYm94LW5hbWVzcGFjZSlfJChzYW5kYm94LW5hbWUpX1swLTlhLWZdezh9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezEyfSQiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZXNwYWNlIjogIiIsCiAgICAgICAgICAibmVyZGN0bC9uZXR3b3JrLW5hbWVzcGFjZSI6ICJeL3Zhci9ydW4vbmV0bnMvY25pLVswLTlhLWZdezh9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezEyfSQiCiAgICAgICAgfSwKICAgICAgICAiTGludXgiOiB7CiAgICAgICAgICAiTmFtZXNwYWNlcyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICJUeXBlIjogImlwYyIsCiAgICAgICAgICAgICAgIlBhdGgiOiAiIgogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgIlR5cGUiOiAidXRzIiwKICAgICAgICAgICAgICAiUGF0aCI6ICIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiVHlwZSI6ICJtb3VudCIsCiAgICAgICAgICAgICAgIlBhdGgiOiAiIgogICAgICAgICAgICB9CiAgICAgICAgICBdLAogICAgICAgICAgIk1hc2tlZFBhdGhzIjogWwogICAgICAgICAgICAiL3Byb2MvYWNwaSIsCiAgICAgICAgICAgICIvcHJvYy9hc291bmQiLAogICAgICAgICAgICAiL3Byb2Mva2NvcmUiLAogICAgICAgICAgICAiL3Byb2Mva2V5cyIsCiAgICAgICAgICAgICIvcHJvYy9sYXRlbmN5X3N0YXRzIiwKICAgICAgICAgICAgIi9wcm9jL3RpbWVyX2xpc3QiLAogICAgICAgICAgICAiL3Byb2MvdGltZXJfc3RhdHMiLAogICAgICAgICAgICAiL3Byb2Mvc2NoZWRfZGVidWciLAogICAgICAgICAgICAiL3N5cy9maXJtd2FyZSIsCiAgICAgICAgICAgICIvcHJvYy9zY3NpIgogICAgICAgICAgXSwKICAgICAgICAgICJSZWFkb25seVBhdGhzIjogWwogICAgICAgICAgICAiL3Byb2MvYnVzIiwKICAgICAgICAgICAgIi9wcm9jL2ZzIiwKICAgICAgICAgICAgIi9wcm9jL2lycSIsCiAgICAgICAgICAgICIvcHJvYy9zeXMiLAogICAgICAgICAgICAiL3Byb2Mvc3lzcnEtdHJpZ2dlciIKICAgICAgICAgIF0sCiAgICAgICAgICAiRGV2aWNlcyI6IFtdLAogICAgICAgICAgIlN5c2N0bCI6IHsKICAgICAgICAgICAgIm5ldC5pcHY0LmlwX3VucHJpdmlsZWdlZF9wb3J0X3N0YXJ0IjogIjAiLAogICAgICAgICAgICAibmV0LmlwdjQucGluZ19ncm91cF9yYW5nZSI6ICIwIDIxNDc0ODM2NDciCiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9LAogICAgICAic3RvcmFnZXMiOiBbCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJibGsiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogInRhciIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIiQoaGFzaDApIgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGxheWVyMCkiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJvdmVybGF5ZnMiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogImZ1c2UzLmthdGEtb3ZlcmxheSIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIjVhNWFhZDgwMDU1ZmYyMDAxMmE1MGRjMjVmOGRmN2EyOTkyNDQ3NDMyNGQ2NWY3ZDUzMDZlZThlZTI3ZmY3MWQiLAogICAgICAgICAgICAiODE3MjUwZjFhM2UzMzZkYTc2ZjViZDNmYTc4NGUxYjI2ZDk1OWI5YzEzMTg3NjgxNWJhMjYwNDA0OGI3MGMxOCIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChjcGF0aCkvJChidW5kbGUtaWQpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9CiAgICAgIF0sCiAgICAgICJkZXZpY2VzIjogW10sCiAgICAgICJzYW5kYm94X3BpZG5zIjogZmFsc2UsCiAgICAgICJleGVjX2NvbW1hbmRzIjogW10sCiAgICAgICJlbnZfbWFwIjogewogICAgICAgICJQQVRIIjogIi91c3IvbG9jYWwvc2JpbjovdXNyL2xvY2FsL2JpbjovdXNyL3NiaW46L3Vzci9iaW46L3NiaW46L2JpbiIKICAgICAgfQogICAgfSwKICAgIHsKICAgICAgIk9DSSI6IHsKICAgICAgICAiVmVyc2lvbiI6ICIxLjEuMC1yYy4xIiwKICAgICAgICAiUHJvY2VzcyI6IHsKICAgICAgICAgICJUZXJtaW5hbCI6IGZhbHNlLAogICAgICAgICAgIlVzZXIiOiB7CiAgICAgICAgICAgICJVSUQiOiAwLAogICAgICAgICAgICAiR0lEIjogMCwKICAgICAgICAgICAgIkFkZGl0aW9uYWxHaWRzIjogW10sCiAgICAgICAgICAgICJVc2VybmFtZSI6ICIiCiAgICAgICAgICB9LAogICAgICAgICAgIkRlcHJlY2F0ZWRBcmdzIjogWwogICAgICAgICAgICAibmdpbngiLAogICAgICAgICAgICAiLWciLAogICAgICAgICAgICAiZGFlbW9uIG9mZjsiCiAgICAgICAgICBdLAogICAgICAgICAgIkFyZ3MiOiBbCiAgICAgICAgICAgICJuZ2lueCIsCiAgICAgICAgICAgICItZyIsCiAgICAgICAgICAgICJkYWVtb24gb2ZmOyIKICAgICAgICAgIF0sCiAgICAgICAgICAiRW52IjogWwogICAgICAgICAgICAiUEFUSD0vdXNyL2xvY2FsL3NiaW46L3Vzci9sb2NhbC9iaW46L3Vzci9zYmluOi91c3IvYmluOi9zYmluOi9iaW4iLAogICAgICAgICAgICAiSE9TVE5BTUU9JChob3N0LW5hbWUpIgogICAgICAgICAgXSwKICAgICAgICAgICJDd2QiOiAiLyIsCiAgICAgICAgICAiQ2FwYWJpbGl0aWVzIjogewogICAgICAgICAgICAiQW1iaWVudCI6IFtdLAogICAgICAgICAgICAiQm91bmRpbmciOiBbCiAgICAgICAgICAgICAgIiQoZGVmYXVsdF9jYXBzKSIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgIkVmZmVjdGl2ZSI6IFsKICAgICAgICAgICAgICAiJChkZWZhdWx0X2NhcHMpIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiSW5oZXJpdGFibGUiOiBbXSwKICAgICAgICAgICAgIlBlcm1pdHRlZCI6IFsKICAgICAgICAgICAgICAiJChkZWZhdWx0X2NhcHMpIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgIk5vTmV3UHJpdmlsZWdlcyI6IGZhbHNlCiAgICAgICAgfSwKICAgICAgICAiUm9vdCI6IHsKICAgICAgICAgICJQYXRoIjogIiQoY3BhdGgpLyQoYnVuZGxlLWlkKSIsCiAgICAgICAgICAiUmVhZG9ubHkiOiBmYWxzZQogICAgICAgIH0sCiAgICAgICAgIk1vdW50cyI6IFsKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9wcm9jIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJwcm9jIiwKICAgICAgICAgICAgInR5cGVfIjogInByb2MiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2IiwKICAgICAgICAgICAgInNvdXJjZSI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJzdHJpY3RhdGltZSIsCiAgICAgICAgICAgICAgIm1vZGU9NzU1IiwKICAgICAgICAgICAgICAic2l6ZT02NTUzNmsiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L3B0cyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiZGV2cHRzIiwKICAgICAgICAgICAgInR5cGVfIjogImRldnB0cyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJuZXdpbnN0YW5jZSIsCiAgICAgICAgICAgICAgInB0bXhtb2RlPTA2NjYiLAogICAgICAgICAgICAgICJtb2RlPTA2MjAiLAogICAgICAgICAgICAgICJnaWQ9NSIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvc2htIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L3NobSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi9tcXVldWUiLAogICAgICAgICAgICAic291cmNlIjogIm1xdWV1ZSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJtcXVldWUiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvc3lzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJzeXNmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJzeXNmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL3N5cy9mcy9jZ3JvdXAiLAogICAgICAgICAgICAic291cmNlIjogImNncm91cCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJjZ3JvdXAiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiLAogICAgICAgICAgICAgICJyZWxhdGltZSIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2V0Yy9ob3N0cyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClob3N0cyQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicnciCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L3Rlcm1pbmF0aW9uLWxvZyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeCl0ZXJtaW5hdGlvbi1sb2ckIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJ3IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2V0Yy9ob3N0bmFtZSIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClob3N0bmFtZSQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicnciCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZXRjL3Jlc29sdi5jb25mIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KXJlc29sdi5jb25mJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJydyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi92YXIvcnVuL3NlY3JldHMva3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudCIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClzZXJ2aWNlYWNjb3VudCQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicm8iCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvdmFyL3J1bi9zZWNyZXRzL2F6dXJlL3Rva2VucyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeCl0b2tlbnMkIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9CiAgICAgICAgXSwKICAgICAgICAiQW5ub3RhdGlvbnMiOiB7CiAgICAgICAgICAiaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5idW5kbGVfcGF0aCI6ICIvcnVuL2NvbnRhaW5lcmQvaW8uY29udGFpbmVyZC5ydW50aW1lLnYyLnRhc2svazhzLmlvLyQoYnVuZGxlLWlkKSIsCiAgICAgICAgICAiaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5jb250YWluZXJfdHlwZSI6ICJwb2RfY29udGFpbmVyIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItbmFtZSI6ICJ0ZXN0LXJjIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSI6ICJjb250YWluZXIiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLmltYWdlLW5hbWUiOiAibWFyaW5lcmNvbmZwb2RzdGVzdC5henVyZWNyLmlvL2F6dXJlbGludXgvYmFzZS9uZ2lueDoxLjI1IiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWlkIjogIl5bYS16MC05XXs2NH0kIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LW5hbWVzcGFjZSI6ICIiCiAgICAgICAgfSwKICAgICAgICAiTGludXgiOiB7CiAgICAgICAgICAiTmFtZXNwYWNlcyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICJUeXBlIjogImlwYyIsCiAgICAgICAgICAgICAgIlBhdGgiOiAiIgogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgIlR5cGUiOiAidXRzIiwKICAgICAgICAgICAgICAiUGF0aCI6ICIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiVHlwZSI6ICJtb3VudCIsCiAgICAgICAgICAgICAgIlBhdGgiOiAiIgogICAgICAgICAgICB9CiAgICAgICAgICBdLAogICAgICAgICAgIk1hc2tlZFBhdGhzIjogWwogICAgICAgICAgICAiL3Byb2MvYWNwaSIsCiAgICAgICAgICAgICIvcHJvYy9rY29yZSIsCiAgICAgICAgICAgICIvcHJvYy9rZXlzIiwKICAgICAgICAgICAgIi9wcm9jL2xhdGVuY3lfc3RhdHMiLAogICAgICAgICAgICAiL3Byb2MvdGltZXJfbGlzdCIsCiAgICAgICAgICAgICIvcHJvYy90aW1lcl9zdGF0cyIsCiAgICAgICAgICAgICIvcHJvYy9zY2hlZF9kZWJ1ZyIsCiAgICAgICAgICAgICIvcHJvYy9zY3NpIiwKICAgICAgICAgICAgIi9zeXMvZmlybXdhcmUiCiAgICAgICAgICBdLAogICAgICAgICAgIlJlYWRvbmx5UGF0aHMiOiBbCiAgICAgICAgICAgICIvcHJvYy9hc291bmQiLAogICAgICAgICAgICAiL3Byb2MvYnVzIiwKICAgICAgICAgICAgIi9wcm9jL2ZzIiwKICAgICAgICAgICAgIi9wcm9jL2lycSIsCiAgICAgICAgICAgICIvcHJvYy9zeXMiLAogICAgICAgICAgICAiL3Byb2Mvc3lzcnEtdHJpZ2dlciIKICAgICAgICAgIF0sCiAgICAgICAgICAiRGV2aWNlcyI6IFtdLAogICAgICAgICAgIlN5c2N0bCI6IHsKICAgICAgICAgICAgIm5ldC5pcHY0LmlwX3VucHJpdmlsZWdlZF9wb3J0X3N0YXJ0IjogIjAiLAogICAgICAgICAgICAibmV0LmlwdjQucGluZ19ncm91cF9yYW5nZSI6ICIwIDIxNDc0ODM2NDciCiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9LAogICAgICAic3RvcmFnZXMiOiBbCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJibGsiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogInRhciIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIiQoaGFzaDApIgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGxheWVyMCkiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJibGsiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogInRhciIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIiQoaGFzaDEpIgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGxheWVyMSkiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJibGsiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogInRhciIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIiQoaGFzaDIpIgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGxheWVyMikiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJibGsiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogInRhciIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIiQoaGFzaDMpIgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGxheWVyMykiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJibGsiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogInRhciIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIiQoaGFzaDQpIgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGxheWVyNCkiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJvdmVybGF5ZnMiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogImZ1c2UzLmthdGEtb3ZlcmxheSIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIjhiZmJiYTc2OTY2MzY1MjQwNGE2NGEyM2E3ZWVhYjc5NDM4ZGFlZDcxYWNjZjMyOWE0MGE0ZjY4ZWZhZjBmZjQ6OGNjN2FmYmNkZDA0ZjE3YWZmOGY2ZDQ5MzVlNGY1NGExZjVhZGQ0N2RjYTUxNmU4ZDM1NDUzZjFmNDIxODE2Nzo5MDMwZTYwYWE4ZDhhYjljMjdmMDUxZTJjNzg1YTU0OWQ4YWVjMTg4ODE2OTllYWIzMjBhMDQwOWY3ZmRiZTM5OjM2YWY5YzA4MTQ2ZTZkMjUxZDUxM2U1OWU1YTFjNjJkNjJjZmI5ZWJlODU2ZDc1Mzk0YmVmZGRlY2U3NDg0YzE6MDE2NWEwYzA3ODY1Nzc1ZGVhODNhNDUxN2MxMjVmZjMwYzFlMmMxYTA5OGU3Y2JjZTdiY2FmZTJiNzE5OWNiYyIsCiAgICAgICAgICAgICIyNDllZjU1ZmNkNDExYzVhODA1NGFiYjYwZTcxNTExNWQ1OTllYmJlNjgyZDZiNzRiZTNiZDE5MjcyNDg4NWMxOjUwMmI1MzcyMDFjNzExNWVmMGQxNzE1MzBjN2NmNWMwZTUxMTc1NGU5Yzk1ZjA1OTQxZWMyN2QxNWM5ZTAxOTg6NDhhYTExOGZkZmRhOWEzMDM4N2U5MGUwNjYxZjJiNWI2YzhlODczNTRkMWZhOWEzN2JmNTg1MTNhYzNlNDUxMjo5ZjYyNTQ2NGM3YjM0YTU1MzZmNDMxZjVkMjk0NjM0M2QyNzI1ODBlMzY0NDZkZGIxMmIwNDAxNjJlNTQzY2UxOmQ0NDkxZWExODg3MTA1ZWYwNjAxZjRlNWZhMzk4M2ZmZTU3ZDdhNTdlZThmNmIwMzcwOTFmNDIxOGMxYTYzNTgiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQoY3BhdGgpLyQoYnVuZGxlLWlkKSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfQogICAgICBdLAogICAgICAiZGV2aWNlcyI6IFtdLAogICAgICAic2FuZGJveF9waWRucyI6IGZhbHNlLAogICAgICAiZXhlY19jb21tYW5kcyI6IFtdLAogICAgICAiZW52X21hcCI6IHsKICAgICAgICAiSE9TVE5BTUUiOiAiJChob3N0LW5hbWUpIiwKICAgICAgICAiUEFUSCI6ICIvdXNyL2xvY2FsL3NiaW46L3Vzci9sb2NhbC9iaW46L3Vzci9zYmluOi91c3IvYmluOi9zYmluOi9iaW4iCiAgICAgIH0KICAgIH0KICBdLAogICJjb21tb24iOiB7CiAgICAiY3BhdGgiOiAiL3J1bi9rYXRhLWNvbnRhaW5lcnMvc2hhcmVkL2NvbnRhaW5lcnMiLAogICAgIm1vdW50X3NvdXJjZV9jcGF0aCI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zaGFyZWQvY29udGFpbmVycyIsCiAgICAic2ZwcmVmaXgiOiAiXiQoY3BhdGgpLyQoYnVuZGxlLWlkKS1bYS16MC05XXsxNn0tIiwKICAgICJzcGF0aCI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L3N0b3JhZ2UiLAogICAgImlwdjRfYSI6ICIoKFswLTldfFsxLTldWzAtOV18MVswLTldezJ9fDJbMC00XVswLTldfDI1WzAtNV0pXFwuKXszfShbMC05XXxbMS05XVswLTldfDFbMC05XXsyfXwyWzAtNF1bMC05XXwyNVswLTVdKSIsCiAgICAiaXBfcCI6ICJbMC05XXsxLDV9IiwKICAgICJzdmNfbmFtZSI6ICJbQS1aX1xcLlxcLV0rIiwKICAgICJkbnNfbGFiZWwiOiAiW2EtekEtWjAtOV9cXC5cXC1dKyIsCiAgICAic19zb3VyY2UxIjogIl4uLjJbMC05XXszfV9bMC0xXVswLTldX1swLTNdWzAtOV1fWzAtMl1bMC05XV9bMC01XVswLTldX1swLTVdWzAtOV1cXC5bMC05XXsxLDEwfSQiLAogICAgInNfc291cmNlMiI6ICJeLi5kYXRhLyIsCiAgICAiZG5zX3N1YmRvbWFpbiI6ICJeW2EtejAtOV0oWy1hLXowLTldKlthLXowLTldKT8kIiwKICAgICJwb2RfdWlkIjogIl5bMC05YS1mQS1GXXs4fS1bMC05YS1mQS1GXXs0fS1bMC05YS1mQS1GXXs0fS1bMC05YS1mQS1GXXs0fS1bMC05YS1mQS1GXXsxMn0kIiwKICAgICJkZWZhdWx0X2NhcHMiOiBbCiAgICAgICJDQVBfQ0hPV04iLAogICAgICAiQ0FQX0RBQ19PVkVSUklERSIsCiAgICAgICJDQVBfRlNFVElEIiwKICAgICAgIkNBUF9GT1dORVIiLAogICAgICAiQ0FQX01LTk9EIiwKICAgICAgIkNBUF9ORVRfUkFXIiwKICAgICAgIkNBUF9TRVRHSUQiLAogICAgICAiQ0FQX1NFVFVJRCIsCiAgICAgICJDQVBfU0VURkNBUCIsCiAgICAgICJDQVBfU0VUUENBUCIsCiAgICAgICJDQVBfTkVUX0JJTkRfU0VSVklDRSIsCiAgICAgICJDQVBfU1lTX0NIUk9PVCIsCiAgICAgICJDQVBfS0lMTCIsCiAgICAgICJDQVBfQVVESVRfV1JJVEUiCiAgICBdLAogICAgInByaXZpbGVnZWRfY2FwcyI6IFsKICAgICAgIkNBUF9DSE9XTiIsCiAgICAgICJDQVBfREFDX09WRVJSSURFIiwKICAgICAgIkNBUF9EQUNfUkVBRF9TRUFSQ0giLAogICAgICAiQ0FQX0ZPV05FUiIsCiAgICAgICJDQVBfRlNFVElEIiwKICAgICAgIkNBUF9LSUxMIiwKICAgICAgIkNBUF9TRVRHSUQiLAogICAgICAiQ0FQX1NFVFVJRCIsCiAgICAgICJDQVBfU0VUUENBUCIsCiAgICAgICJDQVBfTElOVVhfSU1NVVRBQkxFIiwKICAgICAgIkNBUF9ORVRfQklORF9TRVJWSUNFIiwKICAgICAgIkNBUF9ORVRfQlJPQURDQVNUIiwKICAgICAgIkNBUF9ORVRfQURNSU4iLAogICAgICAiQ0FQX05FVF9SQVciLAogICAgICAiQ0FQX0lQQ19MT0NLIiwKICAgICAgIkNBUF9JUENfT1dORVIiLAogICAgICAiQ0FQX1NZU19NT0RVTEUiLAogICAgICAiQ0FQX1NZU19SQVdJTyIsCiAgICAgICJDQVBfU1lTX0NIUk9PVCIsCiAgICAgICJDQVBfU1lTX1BUUkFDRSIsCiAgICAgICJDQVBfU1lTX1BBQ0NUIiwKICAgICAgIkNBUF9TWVNfQURNSU4iLAogICAgICAiQ0FQX1NZU19CT09UIiwKICAgICAgIkNBUF9TWVNfTklDRSIsCiAgICAgICJDQVBfU1lTX1JFU09VUkNFIiwKICAgICAgIkNBUF9TWVNfVElNRSIsCiAgICAgICJDQVBfU1lTX1RUWV9DT05GSUciLAogICAgICAiQ0FQX01LTk9EIiwKICAgICAgIkNBUF9MRUFTRSIsCiAgICAgICJDQVBfQVVESVRfV1JJVEUiLAogICAgICAiQ0FQX0FVRElUX0NPTlRST0wiLAogICAgICAiQ0FQX1NFVEZDQVAiLAogICAgICAiQ0FQX01BQ19PVkVSUklERSIsCiAgICAgICJDQVBfTUFDX0FETUlOIiwKICAgICAgIkNBUF9TWVNMT0ciLAogICAgICAiQ0FQX1dBS0VfQUxBUk0iLAogICAgICAiQ0FQX0JMT0NLX1NVU1BFTkQiLAogICAgICAiQ0FQX0FVRElUX1JFQUQiLAogICAgICAiQ0FQX1BFUkZNT04iLAogICAgICAiQ0FQX0JQRiIsCiAgICAgICJDQVBfQ0hFQ0tQT0lOVF9SRVNUT1JFIgogICAgXSwKICAgICJ2aXJ0aW9fYmxrX3N0b3JhZ2VfY2xhc3NlcyI6IFsKICAgICAgImNjLWxvY2FsLWNzaSIsCiAgICAgICJjYy1tYW5hZ2VkLWNzaSIsCiAgICAgICJjYy1tYW5hZ2VkLXByZW1pdW0tY3NpIgogICAgXSwKICAgICJzbWJfc3RvcmFnZV9jbGFzc2VzIjogWwogICAgICB7CiAgICAgICAgIm5hbWUiOiAiYXp1cmVmaWxlLWNzaS1rYXRhLWNjIiwKICAgICAgICAibW91bnRfb3B0aW9ucyI6IFsKICAgICAgICAgICJkaXJfbW9kZT0wNzc3IiwKICAgICAgICAgICJmaWxlX21vZGU9MDc3NyIsCiAgICAgICAgICAibWZzeW1saW5rcyIsCiAgICAgICAgICAiY2FjaGU9c3RyaWN0IiwKICAgICAgICAgICJub3NoYXJlc29jayIsCiAgICAgICAgICAiYWN0aW1lbz0zMCIsCiAgICAgICAgICAibm9icmwiCiAgICAgICAgXQogICAgICB9CiAgICBdCiAgfSwKICAic2FuZGJveCI6IHsKICAgICJzdG9yYWdlcyI6IFsKICAgICAgewogICAgICAgICJkcml2ZXIiOiAiZXBoZW1lcmFsIiwKICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAic291cmNlIjogInNobSIsCiAgICAgICAgImZzdHlwZSI6ICJ0bXBmcyIsCiAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgIm5vZGV2IiwKICAgICAgICAgICJtb2RlPTE3NzciLAogICAgICAgICAgInNpemU9NjcxMDg4NjQiCiAgICAgICAgXSwKICAgICAgICAibW91bnRfcG9pbnQiOiAiL3J1bi9rYXRhLWNvbnRhaW5lcnMvc2FuZGJveC9zaG0iLAogICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgfQogICAgXQogIH0sCiAgInJlcXVlc3RfZGVmYXVsdHMiOiB7CiAgICAiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdCI6IHsKICAgICAgImFsbG93X2Vudl9yZWdleCI6IFsKICAgICAgICAiXkhPU1ROQU1FPSQoZG5zX2xhYmVsKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfUE9SVF8kKGlwX3ApX1RDUD10Y3A6Ly8kKGlwdjRfYSk6JChpcF9wKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfUE9SVF8kKGlwX3ApX1RDUF9QUk9UTz10Y3AkIiwKICAgICAgICAiXiQoc3ZjX25hbWUpX1BPUlRfJChpcF9wKV9UQ1BfUE9SVD0kKGlwX3ApJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9QT1JUXyQoaXBfcClfVENQX0FERFI9JChpcHY0X2EpJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9TRVJWSUNFX0hPU1Q9JChpcHY0X2EpJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9TRVJWSUNFX1BPUlQ9JChpcF9wKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfU0VSVklDRV9QT1JUXyQoZG5zX2xhYmVsKT0kKGlwX3ApJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9QT1JUPXRjcDovLyQoaXB2NF9hKTokKGlwX3ApJCIsCiAgICAgICAgIl5BWlVSRV9DTElFTlRfSUQ9W0EtRmEtZjAtOS1dKiQiLAogICAgICAgICJeQVpVUkVfVEVOQU5UX0lEPVtBLUZhLWYwLTktXSokIiwKICAgICAgICAiXkFaVVJFX0ZFREVSQVRFRF9UT0tFTl9GSUxFPS92YXIvcnVuL3NlY3JldHMvYXp1cmUvdG9rZW5zL2F6dXJlLWlkZW50aXR5LXRva2VuJCIsCiAgICAgICAgIl5BWlVSRV9BVVRIT1JJVFlfSE9TVD1odHRwczovL2xvZ2luXFwubWljcm9zb2Z0b25saW5lXFwuY29tLyQiLAogICAgICAgICJeVEVSTT14dGVybSQiCiAgICAgIF0sCiAgICAgICJhbGxvd19lbnZfcmVnZXhfbWFwIjogewogICAgICAgICJDUFVfTElNSVQiOiAiXlswLTldKyQiLAogICAgICAgICJKT0JfQ09NUExFVElPTl9JTkRFWCI6ICJeWzAtOV0qJCIsCiAgICAgICAgIk1FTU9SWV9MSU1JVCI6ICJeWzAtOV0rJCIKICAgICAgfQogICAgfSwKICAgICJDb3B5RmlsZVJlcXVlc3QiOiBbCiAgICAgICIkKHNmcHJlZml4KSIKICAgIF0sCiAgICAiRXhlY1Byb2Nlc3NSZXF1ZXN0IjogewogICAgICAiYWxsb3dlZF9jb21tYW5kcyI6IFtdLAogICAgICAicmVnZXgiOiBbXQogICAgfSwKICAgICJVcGRhdGVSb3V0ZXNSZXF1ZXN0IjogewogICAgICAiZm9yYmlkZGVuX2RldmljZV9uYW1lcyI6IFsKICAgICAgICAibG8iCiAgICAgIF0sCiAgICAgICJmb3JiaWRkZW5fc291cmNlX3JlZ2V4IjogWwogICAgICAgICJeKD86MHswLDR9Oil7MCw3fTB7MCwzfTEkIiwKICAgICAgICAiXjEyN1xcLig/OlswLTldezEsM31cXC4pezJ9WzAtOV17MSwzfSQiCiAgICAgIF0KICAgIH0sCiAgICAiVXBkYXRlSW50ZXJmYWNlUmVxdWVzdCI6IHsKICAgICAgImFsbG93X3Jhd19mbGFncyI6IDEyOCwKICAgICAgImZvcmJpZGRlbl9uYW1lcyI6IFsKICAgICAgICAibG8iCiAgICAgIF0sCiAgICAgICJmb3JiaWRkZW5faHdfYWRkcnMiOiBbCiAgICAgICAgIjAwOjAwOjAwOjAwOjAwOjAwIgogICAgICBdCiAgICB9LAogICAgIkNsb3NlU3RkaW5SZXF1ZXN0IjogZmFsc2UsCiAgICAiUmVhZFN0cmVhbVJlcXVlc3QiOiBmYWxzZSwKICAgICJVcGRhdGVFcGhlbWVyYWxNb3VudHNSZXF1ZXN0IjogZmFsc2UsCiAgICAiV3JpdGVTdHJlYW1SZXF1ZXN0IjogZmFsc2UKICB9Cn0= + spec: + runtimeClassName: kata-cc + containers: + - name: test-rc + image: "marinerconfpodstest.azurecr.io/azurelinux/base/nginx:1.25" + ports: + - containerPort: 80 diff --git a/src/agent/samples/policy/yaml/kubernetes/fixtures/rc-noexist.yaml b/src/agent/samples/policy/yaml/kubernetes/fixtures/rc-noexist.yaml new file mode 100644 index 000000000000..7eec6a61d0bf --- /dev/null +++ b/src/agent/samples/policy/yaml/kubernetes/fixtures/rc-noexist.yaml @@ -0,0 +1,29 @@ +--- +apiVersion: v1 +kind: ReplicationController +metadata: + name: no-exist + labels: + name: no-exist +spec: + replicas: 1 + template: + metadata: + labels: + name: no-exist + annotations: + io.katacontainers.config.agent.policy: IyBDb3B5cmlnaHQgKGMpIDIwMjMgTWljcm9zb2Z0IENvcnBvcmF0aW9uCiMKIyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMAojCnBhY2thZ2UgYWdlbnRfcG9saWN5CgppbXBvcnQgZnV0dXJlLmtleXdvcmRzLmluCmltcG9ydCBmdXR1cmUua2V5d29yZHMuZXZlcnkKCiMgRGVmYXVsdCB2YWx1ZXMsIHJldHVybmVkIGJ5IE9QQSB3aGVuIHJ1bGVzIGNhbm5vdCBiZSBldmFsdWF0ZWQgdG8gdHJ1ZS4KZGVmYXVsdCBBZGRBUlBOZWlnaGJvcnNSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgQWRkU3dhcFJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBDbG9zZVN0ZGluUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IENvcHlGaWxlUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IENyZWF0ZUNvbnRhaW5lclJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBDcmVhdGVTYW5kYm94UmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IERlc3Ryb3lTYW5kYm94UmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgRXhlY1Byb2Nlc3NSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgR2V0T09NRXZlbnRSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBHdWVzdERldGFpbHNSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBMaXN0SW50ZXJmYWNlc1JlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBMaXN0Um91dGVzUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IE1lbUhvdHBsdWdCeVByb2JlUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IE9ubGluZUNQVU1lbVJlcXVlc3QgOj0gdHJ1ZQpkZWZhdWx0IFBhdXNlQ29udGFpbmVyUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFJlYWRTdHJlYW1SZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgUmVtb3ZlQ29udGFpbmVyUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgUmVtb3ZlU3RhbGVWaXJ0aW9mc1NoYXJlTW91bnRzUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgUmVzZWVkUmFuZG9tRGV2UmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFJlc3VtZUNvbnRhaW5lclJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBTZXRHdWVzdERhdGVUaW1lUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFNldFBvbGljeVJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBTaWduYWxQcm9jZXNzUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgU3RhcnRDb250YWluZXJSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBTdGFydFRyYWNpbmdSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgU3RhdHNDb250YWluZXJSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBTdG9wVHJhY2luZ1JlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBUdHlXaW5SZXNpemVSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBVcGRhdGVDb250YWluZXJSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgVXBkYXRlRXBoZW1lcmFsTW91bnRzUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFVwZGF0ZUludGVyZmFjZVJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBVcGRhdGVSb3V0ZXNSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgV2FpdFByb2Nlc3NSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBXcml0ZVN0cmVhbVJlcXVlc3QgOj0gZmFsc2UKCiMgQWxsb3dSZXF1ZXN0c0ZhaWxpbmdQb2xpY3kgOj0gdHJ1ZSBjb25maWd1cmVzIHRoZSBBZ2VudCB0byAqYWxsb3cgYW55CiMgcmVxdWVzdHMgY2F1c2luZyBhIHBvbGljeSBmYWlsdXJlKi4gVGhpcyBpcyBhbiB1bnNlY3VyZSBjb25maWd1cmF0aW9uCiMgYnV0IGlzIHVzZWZ1bCBmb3IgYWxsb3dpbmcgdW5zZWN1cmUgcG9kcyB0byBzdGFydCwgdGhlbiBjb25uZWN0IHRvCiMgdGhlbSBhbmQgaW5zcGVjdCBPUEEgbG9ncyBmb3IgdGhlIHJvb3QgY2F1c2Ugb2YgYSBmYWlsdXJlLgpkZWZhdWx0IEFsbG93UmVxdWVzdHNGYWlsaW5nUG9saWN5IDo9IGZhbHNlCgojIENvbnN0YW50cwpTX05BTUVfS0VZID0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZSIKU19OQU1FU1BBQ0VfS0VZID0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZXNwYWNlIgpCVU5ETEVfSUQgPSAiW2EtejAtOV17NjR9IgoKQ3JlYXRlQ29udGFpbmVyUmVxdWVzdDo9IHJlc3AgewogICAgbm90IGlzX251bGwoaW5wdXQuZW52X21hcCkKICAgIAogICAgaV9lbnZfbWFwIDo9IGlucHV0LmVudl9tYXAKICAgIAogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBwX2Vudl9tYXAgOj0gcF9jb250YWluZXIuZW52X21hcCAgCiAgICBhbGxvd19lbnZfbWFwKHBfZW52X21hcCwgaV9lbnZfbWFwKQogICAgCiAgICBpX3Byb2Nlc3MgOj0gaW5wdXQuYmFzZS5PQ0kuUHJvY2VzcwogICAgCiAgICBwX3Byb2Nlc3MgOj0gcF9jb250YWluZXIuT0NJLlByb2Nlc3MKICAgIAogICAgYWxsb3dfYXJncyhpX3Byb2Nlc3MsIHBfcHJvY2VzcywgaV9lbnZfbWFwKQoKICAgIHJlc3AgPSBDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uKGlucHV0LmJhc2UpCiAgICBwcmludCgiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdDogdHJ1ZSIpCn0KCmFsbG93X2FyZ3MoaV9wcm9jZXNzLCBwX3Byb2Nlc3MsIGlfZW52X21hcCkgewogICAgaV9hcmdzIDo9IGlfcHJvY2Vzcy5BcmdzCiAgICBwX2FyZ3MgOj0gcF9wcm9jZXNzLkFyZ3MKICAgIHByaW50KCJhbGxvd19hcmdzOiBpX2FyZ3MgPSIsIGlfYXJncywgInBfYXJncyA9IiwgcF9hcmdzKQogICAgY291bnQoaV9hcmdzKSA9PSBjb3VudChwX2FyZ3MpCiAgICBldmVyeSBpLCBpX2FyZyBpbiBpX2FyZ3MgewogICAgICAgIHByaW50KCJhbGxvd19hcmdzOiBpX2FyZyA9IiwgaV9hcmcpCiAgICAgICAgcF9hcmdfcmVwbGFjZWQgOj0gcmVwbGFjZV9lbnZfdmFyaWFibGVzKHBfYXJnc1tpXSwgaV9lbnZfbWFwKQogICAgICAgIHByaW50KCJhbGxvd19hcmdzOiBwX2FyZ19yZXBsYWNlZCA9IiwgcF9hcmdfcmVwbGFjZWQpCiAgICAgICAgcF9hcmdfcmVwbGFjZWQyIDo9IHJlcGxhY2UocF9hcmdfcmVwbGFjZWQsICIkJCIsICIkIikKICAgICAgICBwcmludCgiYWxsb3dfYXJnczogcF9hcmdfcmVwbGFjZWQyID0iLCBwX2FyZ19yZXBsYWNlZDIpCiAgICAgICAgaV9hcmcgPT0gcF9hcmdfcmVwbGFjZWQyCiAgICB9CiAgICBwcmludCgiYWxsb3dfYXJnczogdHJ1ZSIpCn0KCmFsbG93X2FyZ3MoaV9wcm9jZXNzLCBwX3Byb2Nlc3MsIGlfZW52X21hcCkgewogICAgbm90IGlfcHJvY2Vzcy5BcmdzCiAgICBub3QgcF9wcm9jZXNzLkFyZ3MKICAgIHByaW50KCJhbGxvd19hcmdzMjogbm8gYXJncyIpCn0KCiMgdGhpcyBmdW5jdGlvbiByZXBsYWNlcyBhbGwgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyBpbiBhIHN0cmluZywgZ2l2ZW4gYSBtYXAgb2YgZW52aXJvbm1lbnQga2V5cyB0byBlbnZpcm9ubWVudCB2YWx1ZXMKIyBlZyBzdHIgPSAiZWNobyAkKENMVVNURVJfSUQpOyBlY2hvICQoTk9ERV9OQU1FKTsiCiMgZW52X21hcCA9IHsiQ0xVU1RFUl9JRCI6ICJhYmMiLCAiTk9ERV9OQU1FIiA6ICJ4eXoifQojIHJlc3VsdCA9ICJlY2hvIGFiYzsgZWNobyB4eXo7IgpyZXBsYWNlX2Vudl92YXJpYWJsZXMoc3RyLCBlbnZfbWFwKSA9IHJlc3VsdCB7CiAgICAjIG1ha2UgYW4gYXJyYXkgb2YgdGhlIGtleXMgZWcgWyJDTFVTVEVSX0lEIiwgIk5PREVfTkFNRSJdCiAgICBrZXlzIDo9IFt4IHwgc29tZSB4IGluIG9iamVjdC5rZXlzKGVudl9tYXApXQogICAgcmVzdWx0IDo9IHJlcGxhY2Vfc3RyX3JlYyhzdHIsIGVudl9tYXAsIGtleXMsIGNvdW50KGtleXMpIC0gMSkKfQoKIyBiYXNlIGNhc2UKcmVwbGFjZV9zdHJfcmVjKHN0ciwgZW52X21hcCwgYXJyX2tleXMsIGkpID0gcmVzdWx0IHsKICAgIGkgPCAwCiAgICByZXN1bHQgOj0gc3RyCn0KCiMgcmVjdXJzaXZlIHN0ZXAKcmVwbGFjZV9zdHJfcmVjKHN0ciwgZW52X21hcCwgYXJyX2tleXMsIGkpID0gcmVzdWx0IHsKICAgIGkgPj0gMAogICAga2V5IDo9IGFycl9rZXlzW2ldCiAgICBlbnZfa2V5MSA6PSBjb25jYXQoIiIsIFsiJCgiLCBrZXksICIpIl0pCiAgICAjIHJlcGxhY2UgJChWQVIpIHdpdGggdmFsdWUKICAgIG5ld19zdHIxIDo9IHJlcGxhY2Uoc3RyLCBlbnZfa2V5MSwgZW52X21hcFtrZXldKQogICAgIyByZXBsYWNlIG5leHQgZW52aXJvbm1lbnQgdmFyaWFibGUKICAgIHJlc3VsdCA9IHJlcGxhY2Vfc3RyX3JlYyhuZXdfc3RyMSwgZW52X21hcCwgYXJyX2tleXMsIGkgLSAxKQp9CgphbGxvd19lbnZfbWFwKHBfZW52X21hcCwgaV9lbnZfbWFwKSB7CiAgICBwcmludCgiYWxsb3dfZW52X21hcDogcF9lbnZfbWFwID0iLCBwX2Vudl9tYXApCiAgICBldmVyeSBlbnZfa2V5LCBlbnZfdmFsIGluIGlfZW52X21hcCB7CiAgICAgICAgcHJpbnQoImFsbG93X2VudjogZW52X2tleSA9IiwgZW52X2tleSwgImVudl92YWwgPSIsIGVudl92YWwpCiAgICAgICAgYWxsb3dfZW52X21hcF9lbnRyeShlbnZfa2V5LCBlbnZfdmFsLCBwX2Vudl9tYXApCiAgICB9CiAgICBwcmludCgiYWxsb3dfZW52X21hcDogdHJ1ZSIpCn0KCiMgQWxsb3cgZXhhY3QgbWF0Y2gKYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBpX3ZhbCA9PSBwX3ZhbAogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnk6IHRydWUiKQp9CgojIEFsbG93IHJlc291cmNlRmllbGRSZWYgdmFsdWVzIChlLmcuLCAibGltaXRzLmNwdSIpLgphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgICMgYSB2YXJpYWJsZSB3ZSBzaG91bGQgYmUgdmFsaWRhdGluZyB1c2luZyBhIHJlZ2V4IGZyb20gc2V0dGluZ3MKICAgIHBfdmFsID09ICIkKHZhbGlkYXRlLWZyb20tc2V0dGluZ3MpIgogICAgcmVnZXhfdmFsIDo9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuQ3JlYXRlQ29udGFpbmVyUmVxdWVzdC5hbGxvd19lbnZfcmVnZXhfbWFwW2tleV0KICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4X3ZhbCwgaV92YWwpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSAyOiB0cnVlIikKfQoKIyBBbGxvdyBub2RlLW5hbWUKYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChub2RlLW5hbWUpIgogICAgcmVnZXgubWF0Y2gocG9saWN5X2RhdGEuY29tbW9uLmRuc19zdWJkb21haW4gLCBpX3ZhbCkKICAgIHByaW50KCJhbGxvd19lbnZfbWFwX2VudHJ5IDM6IHRydWUiKQp9CgojIEFsbG93IGhvc3QtbmFtZQphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgIHBfdmFsID09ICIkKGhvc3QtbmFtZSkiCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24uZG5zX2xhYmVsICwgaV92YWwpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSA0OiB0cnVlIikKfQoKIyBBbGxvdyBwb2QtdWlkCmFsbG93X2Vudl9tYXBfZW50cnkoa2V5LCBpX3ZhbCwgcF9lbnZfbWFwKSB7CiAgICBwX3ZhbCA6PSBwX2Vudl9tYXBba2V5XQogICAgcF92YWwgPT0gIiQocG9kLXVpZCkiCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24ucG9kX3VpZCAsIGlfdmFsKQogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgNTogdHJ1ZSIpCn0KCiMgQWxsb3cgZmllbGRSZWYgImZpZWxkUGF0aDogc3RhdHVzLnBvZElQIiB2YWx1ZXMuCmFsbG93X2Vudl9tYXBfZW50cnkoa2V5LCBpX3ZhbCwgcF9lbnZfbWFwKSB7CiAgICBpc19pcChpX3ZhbCkKCiAgICBwX3ZhbCA6PSBwX2Vudl9tYXBba2V5XQogICAgcF92YXIgOj0gY29uY2F0KCI9IiwgW2tleSwgcF92YWxdKQogICAgYWxsb3dfcG9kX2lwX3ZhcihrZXksIHBfdmFyKQogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgNjogdHJ1ZSIpCn0KCiMgQWxsb3cgZmllbGRSZWYgImZpZWxkUGF0aDogc3RhdHVzLmhvc3RJUCIgdmFsdWVzLgphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgaXNfaXAoaV92YWwpCgogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgIHBfdmFyIDo9IGNvbmNhdCgiPSIsIFtrZXksIHBfdmFsXSkKICAgIGFsbG93X2hvc3RfaXBfdmFyKGtleSwgcF92YXIpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSA3OiB0cnVlIikKfQoKIyBNYXRjaCBpbnB1dCB3aXRoIG9uZSBvZiB0aGUgcG9saWN5IHZhcmlhYmxlcywgYWZ0ZXIgc3Vic3RpdHV0aW5nICQoc2FuZGJveC1uYW1lKS4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChzYW5kYm94LW5hbWUpIgogICAgc19uYW1lIDo9IGlucHV0LmJhc2UuT0NJLkFubm90YXRpb25zW1NfTkFNRV9LRVldCiAgICBwX3ZhcjIgOj0gcmVwbGFjZShwX3ZhbCwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHBfdmFyMiA9PSBpX3ZhbAogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgODogdHJ1ZSIpCn0KCiMgTWF0Y2ggaW5wdXQgd2l0aCBvbmUgb2YgdGhlIHBvbGljeSB2YXJpYWJsZXMsIGFmdGVyIHN1YnN0aXR1dGluZyAkKHNhbmRib3gtbmFtZXNwYWNlKS4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChzYW5kYm94LW5hbWVzcGFjZSkiCiAgICBzX25hbWVzcGFjZSA6PSBpbnB1dC5iYXNlLk9DSS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwX3ZhcjIgOj0gcmVwbGFjZShwX3ZhbCwgIiQoc2FuZGJveC1uYW1lc3BhY2UpIiwgc19uYW1lc3BhY2UpCiAgICBwX3ZhcjIgPT0gaV92YWwKICAgIHByaW50KCJhbGxvd19lbnZfbWFwX2VudHJ5IDk6IHRydWUiKQp9CgojIEFsbG93IGlucHV0IGVudiB2YXJpYWJsZXMgdGhhdCBtYXRjaCB3aXRoIGEgcmVxdWVzdF9kZWZhdWx0cyByZWdleC4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHNvbWUgcF9yZWdleDEgaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5DcmVhdGVDb250YWluZXJSZXF1ZXN0LmFsbG93X2Vudl9yZWdleAogICAgcF9yZWdleDIgOj0gcmVwbGFjZShwX3JlZ2V4MSwgIiQoaXB2NF9hKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcHY0X2EpCiAgICBwX3JlZ2V4MyA6PSByZXBsYWNlKHBfcmVnZXgyLCAiJChpcF9wKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcF9wKQogICAgcF9yZWdleDQgOj0gcmVwbGFjZShwX3JlZ2V4MywgIiQoc3ZjX25hbWUpIiwgcG9saWN5X2RhdGEuY29tbW9uLnN2Y19uYW1lKQogICAgcF9yZWdleDUgOj0gcmVwbGFjZShwX3JlZ2V4NCwgIiQoZG5zX2xhYmVsKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5kbnNfbGFiZWwpCgogICAgcmVzdWx0IDo9IGNvbmNhdCgiPSIsIFtrZXksIGlfdmFsXSkKICAgIHJlZ2V4Lm1hdGNoKHBfcmVnZXg1LCByZXN1bHQpCgogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgMTA6IHRydWUiKQp9CgpDcmVhdGVDb250YWluZXJSZXF1ZXN0Oj0gcmVzcCB7CiAgICBub3QgaW5wdXQuZW52X21hcAogICAgaV9wcm9jZXNzID0gaW5wdXQuT0NJLlByb2Nlc3MKICAgIHNfbmFtZSA9IGlucHV0Lk9DSS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBwX3Byb2Nlc3MgPSBwX2NvbnRhaW5lci5PQ0kuUHJvY2VzcwogICAgYWxsb3dfZGVwcmVjYXRlZF9hcmdzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUpCiAgICByZXNwID0gQ3JlYXRlQ29udGFpbmVyUmVxdWVzdENvbW1vbihpbnB1dCkKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0MjogdHJ1ZSIpCn0KCkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb24ocmVxKTo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgICMgQ2hlY2sgaWYgdGhlIGlucHV0IHJlcXVlc3Qgc2hvdWxkIGJlIHJlamVjdGVkIGV2ZW4gYmVmb3JlIGNoZWNraW5nIHRoZQogICAgIyBwb2xpY3lfZGF0YS5jb250YWluZXJzIGluZm9ybWF0aW9uLgogICAgYWxsb3dfY3JlYXRlX2NvbnRhaW5lcl9pbnB1dChyZXEpCgogICAgaV9vY2kgOj0gcmVxLk9DSQogICAgaV9zdG9yYWdlcyA6PSByZXEuc3RvcmFnZXMKICAgIGlfZGV2aWNlcyA6PSByZXEuZGV2aWNlcwoKICAgICMgYXJyYXkgb2YgcG9zc2libGUgc3RhdGUgb3BlcmF0aW9ucwogICAgb3BzX2J1aWxkZXIgOj0gW10KCiAgICAjIGNoZWNrIHNhbmRib3ggbmFtZQogICAgc2FuZGJveF9uYW1lID0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FX0tFWV0KICAgIGFkZF9zYW5kYm94X25hbWVfdG9fc3RhdGUgOj0gc3RhdGVfYWxsb3dzKCJzYW5kYm94X25hbWUiLCBzYW5kYm94X25hbWUpCiAgICBvcHNfYnVpbGRlcjEgOj0gY29uY2F0X29wX2lmX25vdF9udWxsKG9wc19idWlsZGVyLCBhZGRfc2FuZGJveF9uYW1lX3RvX3N0YXRlKQoKICAgICMgQ2hlY2sgaWYgYW55IGVsZW1lbnQgZnJvbSB0aGUgcG9saWN5X2RhdGEuY29udGFpbmVycyBhcnJheSBhbGxvd3MgdGhlIGlucHV0IHJlcXVlc3QuCiAgICBzb21lIHBfY29udGFpbmVyIGluIHBvbGljeV9kYXRhLmNvbnRhaW5lcnMKICAgIHByaW50KCI9PT09PT09PSBDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiB0cnlpbmcgbmV4dCBwb2xpY3kgY29udGFpbmVyIikKCiAgICBwX3BpZG5zIDo9IHBfY29udGFpbmVyLnNhbmRib3hfcGlkbnMKICAgIGlfcGlkbnMgOj0gcmVxLnNhbmRib3hfcGlkbnMKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiBwX3BpZG5zID0iLCBwX3BpZG5zLCAiaV9waWRucyA9IiwgaV9waWRucykKICAgIHBfcGlkbnMgPT0gaV9waWRucwoKICAgIHBfb2NpIDo9IHBfY29udGFpbmVyLk9DSQoKICAgICMgY2hlY2sgbmFtZXNwYWNlCiAgICBwX25hbWVzcGFjZSA6PSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBpX25hbWVzcGFjZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwcmludCAoIkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb246IHBfbmFtZXNwYWNlID0iLCBwX25hbWVzcGFjZSwgImlfbmFtZXNwYWNlID0iLCBpX25hbWVzcGFjZSkKICAgIGFkZF9uYW1lc3BhY2VfdG9fc3RhdGUgOj0gYWxsb3dfbmFtZXNwYWNlKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkKICAgIG9wc19idWlsZGVyMiA6PSBjb25jYXRfb3BfaWZfbm90X251bGwob3BzX2J1aWxkZXIxLCBhZGRfbmFtZXNwYWNlX3RvX3N0YXRlKQoKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiBwIFZlcnNpb24gPSIsIHBfb2NpLlZlcnNpb24sICJpIFZlcnNpb24gPSIsIGlfb2NpLlZlcnNpb24pCiAgICBwX29jaS5WZXJzaW9uID09IGlfb2NpLlZlcnNpb24KCiAgICBwcmludCgiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdENvbW1vbjogcCBSZWFkb25seSA9IiwgcF9vY2kuUm9vdC5SZWFkb25seSwgImkgUmVhZG9ubHkgPSIsIGlfb2NpLlJvb3QuUmVhZG9ubHkpCiAgICBwX29jaS5Sb290LlJlYWRvbmx5ID09IGlfb2NpLlJvb3QuUmVhZG9ubHkKCiAgICBhbGxvd19hbm5vKHBfb2NpLCBpX29jaSkKCiAgICBwX3N0b3JhZ2VzIDo9IHBfY29udGFpbmVyLnN0b3JhZ2VzCiAgICBhbGxvd19ieV9hbm5vKHBfb2NpLCBpX29jaSwgcF9zdG9yYWdlcywgaV9zdG9yYWdlcykKCiAgICBwX2RldmljZXMgOj0gcF9jb250YWluZXIuZGV2aWNlcwogICAgYWxsb3dfZGV2aWNlcyhwX2RldmljZXMsIGlfZGV2aWNlcykKCiAgICByZXQgOj0gYWxsb3dfbGludXgob3BzX2J1aWxkZXIyLCBwX29jaSwgaV9vY2kpCiAgICByZXQuYWxsb3dlZAoKICAgIG9wcyA6PSByZXQub3BzCgogICAgcHJpbnQoIkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb246IHRydWUiKQp9CgphbGxvd19jcmVhdGVfY29udGFpbmVyX2lucHV0KHJlcSkgewogICAgcHJpbnQoImFsbG93X2NyZWF0ZV9jb250YWluZXJfaW5wdXQ6IGlucHV0ID0iLCByZXEpCgogICAgY291bnQocmVxLnNoYXJlZF9tb3VudHMpID09IDAKICAgIGlzX251bGwocmVxLnN0cmluZ191c2VyKQoKICAgIGlfb2NpIDo9IHJlcS5PQ0kKICAgIGlzX251bGwoaV9vY2kuSG9va3MpCiAgICBpc19udWxsKGlfb2NpLlNvbGFyaXMpCiAgICBpc19udWxsKGlfb2NpLldpbmRvd3MpCgogICAgaV9saW51eCA6PSBpX29jaS5MaW51eAogICAgY291bnQoaV9saW51eC5HSURNYXBwaW5ncykgPT0gMAogICAgY291bnQoaV9saW51eC5Nb3VudExhYmVsKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlJlc291cmNlcy5EZXZpY2VzKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlJvb3Rmc1Byb3BhZ2F0aW9uKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlVJRE1hcHBpbmdzKSA9PSAwCiAgICBpc19udWxsKGlfbGludXguSW50ZWxSZHQpCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLkJsb2NrSU8pCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLk5ldHdvcmspCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLlBpZHMpCiAgICBpc19udWxsKGlfbGludXguU2VjY29tcCkKCiAgICBpX3Byb2Nlc3MgOj0gaV9vY2kuUHJvY2VzcwogICAgY291bnQoaV9wcm9jZXNzLlNlbGludXhMYWJlbCkgPT0gMAogICAgY291bnQoaV9wcm9jZXNzLlVzZXIuVXNlcm5hbWUpID09IDAKCiAgICBwcmludCgiYWxsb3dfY3JlYXRlX2NvbnRhaW5lcl9pbnB1dDogdHJ1ZSIpCn0KCmFsbG93X25hbWVzcGFjZShwX25hbWVzcGFjZSwgaV9uYW1lc3BhY2UpID0gYWRkX25hbWVzcGFjZSB7CiAgICBwX25hbWVzcGFjZSA9PSBpX25hbWVzcGFjZQogICAgYWRkX25hbWVzcGFjZSA6PSBudWxsCiAgICBwcmludCgiYWxsb3dfbmFtZXNwYWNlIDE6IGlucHV0IG5hbWVzcGFjZSBtYXRjaGVzIHBvbGljeSBkYXRhIikKfQoKYWxsb3dfbmFtZXNwYWNlKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkgPSBhZGRfbmFtZXNwYWNlIHsKICAgIHBfbmFtZXNwYWNlID09ICIiCiAgICBwcmludCgiYWxsb3dfbmFtZXNwYWNlIDI6IG5vIG5hbWVzcGFjZSBmb3VuZCBvbiBwb2xpY3kgZGF0YSIpCiAgICBhZGRfbmFtZXNwYWNlIDo9IHN0YXRlX2FsbG93cygibmFtZXNwYWNlIiwgaV9uYW1lc3BhY2UpCn0KCiMgdmFsdWUgaGFzbid0IGJlZW4gc2VlbiBiZWZvcmUsIHNhdmUgaXQgdG8gc3RhdGUKc3RhdGVfYWxsb3dzKGtleSwgdmFsdWUpID0gYWN0aW9uIHsKICBzdGF0ZSA6PSBnZXRfc3RhdGUoKQogIHByaW50KCJzdGF0ZV9hbGxvd3MgMTogc3RhdGVba2V5XSA9Iiwgc3RhdGVba2V5XSwgInZhbHVlID0iLCB2YWx1ZSkKICBub3Qgc3RhdGVba2V5XQogIHByaW50KCJzdGF0ZV9hbGxvd3MgMTogc2F2aW5nIHRvIHN0YXRlIGtleSA9Iiwga2V5LCAidmFsdWUgPSIsIHZhbHVlKQogIHBhdGggOj0gZ2V0X3N0YXRlX3BhdGgoa2V5KSAKICBhY3Rpb24gOj0gewogICAgIm9wIjogImFkZCIsCiAgICAicGF0aCI6IHBhdGgsIAogICAgInZhbHVlIjogdmFsdWUsCiAgfQp9CgojIHZhbHVlIG1hdGNoZXMgd2hhdCdzIGluIHN0YXRlLCBhbGxvdyBpdApzdGF0ZV9hbGxvd3Moa2V5LCB2YWx1ZSkgPSBhY3Rpb24gewogIHByaW50KCJzdGF0ZV9hbGxvd3MgMjogc3RhcnQiKQogIHN0YXRlIDo9IGdldF9zdGF0ZSgpCiAgcHJpbnQoInN0YXRlX2FsbG93cyAyOiBzdGF0ZVtrZXldID0iLCBzdGF0ZVtrZXldLCAidmFsdWUgPSIsIHZhbHVlKQogIHZhbHVlID09IHN0YXRlW2tleV0KICBwcmludCgic3RhdGVfYWxsb3dzIDI6IGZvdW5kIGtleSA9Iiwga2V5LCAidmFsdWUgPSIsIHZhbHVlLCAiIGluIHN0YXRlIikKICBhY3Rpb24gOj0gbnVsbAp9CgojIGhlbHBlciBmdW5jdGlvbnMgdG8gaW50ZXJhY3Qgd2l0aCB0aGUgc3RhdGUKZ2V0X3N0YXRlKCkgPSBzdGF0ZSB7CiAgc3RhdGUgOj0gZGF0YVsicHN0YXRlIl0KfQoKZ2V0X3N0YXRlX3ZhbChrZXkpID0gdmFsdWUgewogICAgc3RhdGUgOj0gZ2V0X3N0YXRlKCkKICAgIHZhbHVlIDo9IHN0YXRlW2tleV0KfQoKZ2V0X3N0YXRlX3BhdGgoa2V5KSA9IHBhdGggewogICAgIyBwcmVwZW5kICIvcHN0YXRlLyIgdG8ga2V5CiAgICBwYXRoIDo9IGNvbmNhdCgiLyIsIFsiL3BzdGF0ZSIsIGtleV0pCn0KCiMgSGVscGVyIGZ1bmN0aW9ucyB0byBjb25kaXRpb25hbGx5IGNvbmNhdGVuYXRlIG9wIGlzIG5vdCBudWxsCmNvbmNhdF9vcF9pZl9ub3RfbnVsbChvcHMsIG9wKSA9IHJlc3VsdCB7CiAgICBvcCA9PSBudWxsCiAgICByZXN1bHQgOj0gb3BzCn0KCmNvbmNhdF9vcF9pZl9ub3RfbnVsbChvcHMsIG9wKSA9IHJlc3VsdCB7CiAgICBvcCAhPSBudWxsCiAgICByZXN1bHQgOj0gYXJyYXkuY29uY2F0KG9wcywgW29wXSkKfQoKIyBSZWplY3QgdW5leHBlY3RlZCBhbm5vdGF0aW9ucy4KYWxsb3dfYW5ubyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19hbm5vIDE6IHN0YXJ0IikKCiAgICBub3QgaV9vY2kuQW5ub3RhdGlvbnMKCiAgICBwcmludCgiYWxsb3dfYW5ubyAxOiB0cnVlIikKfQphbGxvd19hbm5vKHBfb2NpLCBpX29jaSkgewogICAgcHJpbnQoImFsbG93X2Fubm8gMjogcCBBbm5vdGF0aW9ucyA9IiwgcF9vY2kuQW5ub3RhdGlvbnMpCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiBpIEFubm90YXRpb25zID0iLCBpX29jaS5Bbm5vdGF0aW9ucykKCiAgICBpX2tleXMgOj0gb2JqZWN0LmtleXMoaV9vY2kuQW5ub3RhdGlvbnMpCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiBpIGtleXMgPSIsIGlfa2V5cykKCiAgICBldmVyeSBpX2tleSBpbiBpX2tleXMgewogICAgICAgIGFsbG93X2Fubm9fa2V5KGlfa2V5LCBwX29jaSkKICAgIH0KCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiB0cnVlIikKfQoKYWxsb3dfYW5ub19rZXkoaV9rZXksIHBfb2NpKSB7CiAgICBwcmludCgiYWxsb3dfYW5ub19rZXkgMTogaSBrZXkgPSIsIGlfa2V5KQoKICAgIHN0YXJ0c3dpdGgoaV9rZXksICJpby5rdWJlcm5ldGVzLmNyaS4iKQoKICAgIHByaW50KCJhbGxvd19hbm5vX2tleSAxOiB0cnVlIikKfQphbGxvd19hbm5vX2tleShpX2tleSwgcF9vY2kpIHsKICAgIHByaW50KCJhbGxvd19hbm5vX2tleSAyOiBpIGtleSA9IiwgaV9rZXkpCgogICAgc29tZSBwX2tleSwgXyBpbiBwX29jaS5Bbm5vdGF0aW9ucwogICAgcF9rZXkgPT0gaV9rZXkKCiAgICBwcmludCgiYWxsb3dfYW5ub19rZXkgMjogdHJ1ZSIpCn0KCiMgR2V0IHRoZSB2YWx1ZSBvZiB0aGUgU19OQU1FX0tFWSBhbm5vdGF0aW9uIGFuZAojIGNvcnJlbGF0ZSBpdCB3aXRoIG90aGVyIGFubm90YXRpb25zIGFuZCBwcm9jZXNzIGZpZWxkcy4KYWxsb3dfYnlfYW5ubyhwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpIHsKICAgIHByaW50KCJhbGxvd19ieV9hbm5vIDE6IHN0YXJ0IikKCiAgICBub3QgcF9vY2kuQW5ub3RhdGlvbnNbU19OQU1FX0tFWV0KCiAgICBpX3NfbmFtZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMTogaV9zX25hbWUgPSIsIGlfc19uYW1lKQoKICAgIGlfc19uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FU1BBQ0VfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMTogaV9zX25hbWVzcGFjZSA9IiwgaV9zX25hbWVzcGFjZSkKCiAgICBhbGxvd19ieV9zYW5kYm94X25hbWUocF9vY2ksIGlfb2NpLCBwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBpX3NfbmFtZSwgaV9zX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfYnlfYW5ubyAxOiB0cnVlIikKfQphbGxvd19ieV9hbm5vKHBfb2NpLCBpX29jaSwgcF9zdG9yYWdlcywgaV9zdG9yYWdlcykgewogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMjogc3RhcnQiKQoKICAgIHBfc19uYW1lIDo9IHBfb2NpLkFubm90YXRpb25zW1NfTkFNRV9LRVldCiAgICBpX3NfbmFtZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMjogaV9zX25hbWUgPSIsIGlfc19uYW1lLCAicF9zX25hbWUgPSIsIHBfc19uYW1lKQoKICAgIGFsbG93X3NhbmRib3hfbmFtZShwX3NfbmFtZSwgaV9zX25hbWUpCgogICAgaV9zX25hbWVzcGFjZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwcmludCgiYWxsb3dfYnlfYW5ubyAyOiBpX3NfbmFtZXNwYWNlID0iLCBpX3NfbmFtZXNwYWNlKQoKICAgIGFsbG93X2J5X3NhbmRib3hfbmFtZShwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMsIGlfc19uYW1lLCBpX3NfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd19ieV9hbm5vIDI6IHRydWUiKQp9CgphbGxvd19ieV9zYW5kYm94X25hbWUocF9vY2ksIGlfb2NpLCBwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfYnlfc2FuZGJveF9uYW1lOiBzdGFydCIpCgogICAgaV9uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FU1BBQ0VfS0VZXQoKICAgIGFsbG93X2J5X2NvbnRhaW5lcl90eXBlcyhwX29jaSwgaV9vY2ksIHNfbmFtZSwgaV9uYW1lc3BhY2UpCiAgICBhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZChwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpCiAgICBhbGxvd19wcm9jZXNzKHBfb2NpLlByb2Nlc3MsIGlfb2NpLlByb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpCgogICAgcHJpbnQoImFsbG93X2J5X3NhbmRib3hfbmFtZTogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfbmFtZShwX3NfbmFtZSwgaV9zX25hbWUpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X25hbWU6IHN0YXJ0IikKICAgIHJlZ2V4Lm1hdGNoKHBfc19uYW1lLCBpX3NfbmFtZSkKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9uYW1lOiB0cnVlIikKfQoKIyBDaGVjayB0aGF0IHRoZSAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLXR5cGUiIGFuZAojICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIiBhbm5vdGF0aW9ucyBkZXNpZ25hdGUgdGhlCiMgZXhwZWN0ZWQgdHlwZSAtIGVpdGhlciBhICJzYW5kYm94IiBvciBhICJjb250YWluZXIiLiBUaGVuLCB2YWxpZGF0ZQojIG90aGVyIGFubm90YXRpb25zIGJhc2VkIG9uIHRoZSBhY3R1YWwgInNhbmRib3giIG9yICJjb250YWluZXIiIHZhbHVlCiMgZnJvbSB0aGUgaW5wdXQgY29udGFpbmVyLgphbGxvd19ieV9jb250YWluZXJfdHlwZXMocF9vY2ksIGlfb2NpLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfYnlfY29udGFpbmVyX3R5cGVzOiBjaGVja2luZyBpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSIpCgogICAgY190eXBlIDo9ICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSIKICAgIAogICAgcF9jcmlfdHlwZSA6PSBwX29jaS5Bbm5vdGF0aW9uc1tjX3R5cGVdCiAgICBpX2NyaV90eXBlIDo9IGlfb2NpLkFubm90YXRpb25zW2NfdHlwZV0KICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZXM6IHBfY3JpX3R5cGUgPSIsIHBfY3JpX3R5cGUsICJpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgcF9jcmlfdHlwZSA9PSBpX2NyaV90eXBlCgogICAgYWxsb3dfYnlfY29udGFpbmVyX3R5cGUoaV9jcmlfdHlwZSwgcF9vY2ksIGlfb2NpLCBzX25hbWUsIHNfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZXM6IHRydWUiKQp9CgphbGxvd19ieV9jb250YWluZXJfdHlwZShpX2NyaV90eXBlLCBwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAxOiBpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgaV9jcmlfdHlwZSA9PSAic2FuZGJveCIKCiAgICBpX2thdGFfdHlwZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1siaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5jb250YWluZXJfdHlwZSJdCiAgICBwcmludCgiYWxsb3dfYnlfY29udGFpbmVyX3R5cGUgMTogaV9rYXRhX3R5cGUgPSIsIGlfa2F0YV90eXBlKQogICAgaV9rYXRhX3R5cGUgPT0gInBvZF9zYW5kYm94IgoKICAgIGFsbG93X3NhbmRib3hfY29udGFpbmVyX25hbWUocF9vY2ksIGlfb2NpKQogICAgYWxsb3dfc2FuZGJveF9uZXRfbmFtZXNwYWNlKHBfb2NpLCBpX29jaSkKICAgIGFsbG93X3NhbmRib3hfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpCgogICAgcHJpbnQoImFsbG93X2J5X2NvbnRhaW5lcl90eXBlIDE6IHRydWUiKQp9CgphbGxvd19ieV9jb250YWluZXJfdHlwZShpX2NyaV90eXBlLCBwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiBpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgaV9jcmlfdHlwZSA9PSAiY29udGFpbmVyIgoKICAgIGlfa2F0YV90eXBlIDo9IGlfb2NpLkFubm90YXRpb25zWyJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIl0KICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiBpX2thdGFfdHlwZSA9IiwgaV9rYXRhX3R5cGUpCiAgICBpX2thdGFfdHlwZSA9PSAicG9kX2NvbnRhaW5lciIKCiAgICBhbGxvd19jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpCiAgICBhbGxvd19uZXRfbmFtZXNwYWNlKHBfb2NpLCBpX29jaSkKICAgIGFsbG93X2xvZ19kaXJlY3RvcnkocF9vY2ksIGlfb2NpKQoKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiB0cnVlIikKfQoKIyAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLW5hbWUiIGFubm90YXRpb24KYWxsb3dfc2FuZGJveF9jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X2NvbnRhaW5lcl9uYW1lOiBzdGFydCIpCgogICAgY29udGFpbmVyX2Fubm90YXRpb25fbWlzc2luZyhwX29jaSwgaV9vY2ksICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItbmFtZSIpCgogICAgcHJpbnQoImFsbG93X3NhbmRib3hfY29udGFpbmVyX25hbWU6IHRydWUiKQp9CgphbGxvd19jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19jb250YWluZXJfbmFtZTogc3RhcnQiKQoKICAgIGFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uKHBfb2NpLCBpX29jaSwgImlvLmt1YmVybmV0ZXMuY3JpLmNvbnRhaW5lci1uYW1lIikKCiAgICBwcmludCgiYWxsb3dfY29udGFpbmVyX25hbWU6IHRydWUiKQp9Cgpjb250YWluZXJfYW5ub3RhdGlvbl9taXNzaW5nKHBfb2NpLCBpX29jaSwga2V5KSB7CiAgICBwcmludCgiY29udGFpbmVyX2Fubm90YXRpb25fbWlzc2luZzoiLCBrZXkpCgogICAgbm90IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIG5vdCBpX29jaS5Bbm5vdGF0aW9uc1trZXldCgogICAgcHJpbnQoImNvbnRhaW5lcl9hbm5vdGF0aW9uX21pc3Npbmc6IHRydWUiKQp9CgphbGxvd19jb250YWluZXJfYW5ub3RhdGlvbihwX29jaSwgaV9vY2ksIGtleSkgewogICAgcHJpbnQoImFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uOiBrZXkgPSIsIGtleSkKCiAgICBwX3ZhbHVlIDo9IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIGlfdmFsdWUgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgcHJpbnQoImFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uOiBwX3ZhbHVlID0iLCBwX3ZhbHVlLCAiaV92YWx1ZSA9IiwgaV92YWx1ZSkKCiAgICBwX3ZhbHVlID09IGlfdmFsdWUKCiAgICBwcmludCgiYWxsb3dfY29udGFpbmVyX2Fubm90YXRpb246IHRydWUiKQp9CgojICJuZXJkY3RsL25ldHdvcmstbmFtZXNwYWNlIiBhbm5vdGF0aW9uCmFsbG93X3NhbmRib3hfbmV0X25hbWVzcGFjZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X25ldF9uYW1lc3BhY2U6IHN0YXJ0IikKCiAgICBrZXkgOj0gIm5lcmRjdGwvbmV0d29yay1uYW1lc3BhY2UiCgogICAgcF9uYW1lc3BhY2UgOj0gcF9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgaV9uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgcHJpbnQoImFsbG93X3NhbmRib3hfbmV0X25hbWVzcGFjZTogcF9uYW1lc3BhY2UgPSIsIHBfbmFtZXNwYWNlLCAiaV9uYW1lc3BhY2UgPSIsIGlfbmFtZXNwYWNlKQoKICAgIHJlZ2V4Lm1hdGNoKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9uZXRfbmFtZXNwYWNlOiB0cnVlIikKfQoKYWxsb3dfbmV0X25hbWVzcGFjZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19uZXRfbmFtZXNwYWNlOiBzdGFydCIpCgogICAga2V5IDo9ICJuZXJkY3RsL25ldHdvcmstbmFtZXNwYWNlIgoKICAgIG5vdCBwX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICBub3QgaV9vY2kuQW5ub3RhdGlvbnNba2V5XQoKICAgIHByaW50KCJhbGxvd19uZXRfbmFtZXNwYWNlOiB0cnVlIikKfQoKIyAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1sb2ctZGlyZWN0b3J5IiBhbm5vdGF0aW9uCmFsbG93X3NhbmRib3hfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X2xvZ19kaXJlY3Rvcnk6IHN0YXJ0IikKCiAgICBrZXkgOj0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbG9nLWRpcmVjdG9yeSIKCiAgICBwX2RpciA6PSBwX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICByZWdleDEgOj0gcmVwbGFjZShwX2RpciwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHJlZ2V4MiA6PSByZXBsYWNlKHJlZ2V4MSwgIiQoc2FuZGJveC1uYW1lc3BhY2UpIiwgc19uYW1lc3BhY2UpCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiByZWdleDIgPSIsIHJlZ2V4MikKCiAgICBpX2RpciA6PSBpX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiBpX2RpciA9IiwgaV9kaXIpCgogICAgcmVnZXgubWF0Y2gocmVnZXgyLCBpX2RpcikKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiB0cnVlIikKfQoKYWxsb3dfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19sb2dfZGlyZWN0b3J5OiBzdGFydCIpCgogICAga2V5IDo9ICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWxvZy1kaXJlY3RvcnkiCgogICAgbm90IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIG5vdCBpX29jaS5Bbm5vdGF0aW9uc1trZXldCgogICAgcHJpbnQoImFsbG93X2xvZ19kaXJlY3Rvcnk6IHRydWUiKQp9CgphbGxvd19kZXZpY2VzKHBfZGV2aWNlcywgaV9kZXZpY2VzKSB7CiAgICBwcmludCgiYWxsb3dfZGV2aWNlczogc3RhcnQiKQogICAgZXZlcnkgaV9kZXZpY2UgaW4gaV9kZXZpY2VzIHsKICAgICAgICBwcmludCgiYWxsb3dfZGV2aWNlczogaV9kZXZpY2UgPSIsIGlfZGV2aWNlKQogICAgICAgIHNvbWUgcF9kZXZpY2UgaW4gcF9kZXZpY2VzCiAgICAgICAgcF9kZXZpY2UuY29udGFpbmVyX3BhdGggPT0gaV9kZXZpY2UuY29udGFpbmVyX3BhdGgKICAgIH0KICAgIHByaW50KCJhbGxvd19kZXZpY2VzOiB0cnVlIikKfQoKYWxsb3dfbGludXgoc3RhdGVfb3BzLCBwX29jaSwgaV9vY2kpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIHBfbmFtZXNwYWNlcyA6PSBwX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbGludXg6IHAgbmFtZXNwYWNlcyA9IiwgcF9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlcyA6PSBpX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbGludXg6IGkgbmFtZXNwYWNlcyA9IiwgaV9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlX3dpdGhvdXRfbmV0d29yayA6PSBbb2JqIHwgb2JqIDo9IGlfbmFtZXNwYWNlc1tfXTsgb2JqLlR5cGUgIT0gIm5ldHdvcmsiXQoKICAgIHByaW50KCJhbGxvd19saW51eDogaV9uYW1lc3BhY2Vfd2l0aG91dF9uZXR3b3JrID0iLCBpX25hbWVzcGFjZV93aXRob3V0X25ldHdvcmspCgogICAgcF9uYW1lc3BhY2VzID09IGlfbmFtZXNwYWNlX3dpdGhvdXRfbmV0d29yawoKICAgIGFsbG93X21hc2tlZF9wYXRocyhwX29jaSwgaV9vY2kpCiAgICBhbGxvd19yZWFkb25seV9wYXRocyhwX29jaSwgaV9vY2kpCiAgICBhbGxvd19saW51eF9kZXZpY2VzKHBfb2NpLkxpbnV4LkRldmljZXMsIGlfb2NpLkxpbnV4LkRldmljZXMpCiAgICBhbGxvd19saW51eF9zeXNjdGwocF9vY2kuTGludXgsIGlfb2NpLkxpbnV4KQogICAgcmV0IDo9IGFsbG93X25ldHdvcmtfbmFtZXNwYWNlX3N0YXJ0KHN0YXRlX29wcywgcF9vY2ksIGlfb2NpKQogICAgcmV0LmFsbG93ZWQKCiAgICBvcHMgOj0gcmV0Lm9wcwoKICAgIHByaW50KCJhbGxvd19saW51eDogdHJ1ZSIpCn0KCiMgUmV0cmlldmUgdGhlICJuZXR3b3JrIiBuYW1lc3BhY2UgZnJvbSB0aGUgaW5wdXQgZGF0YSBhbmQgcGFzcyBpdCBvbiBmb3IgdGhlCiMgbmV0d29yayBuYW1lc3BhY2UgcG9saWN5IGNoZWNrcy4KYWxsb3dfbmV0d29ya19uYW1lc3BhY2Vfc3RhcnQoc3RhdGVfb3BzLCBwX29jaSwgaV9vY2kpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIHByaW50KCJhbGxvd19uZXR3b3JrX25hbWVzcGFjZSBzdGFydDogc3RhcnQiKQoKICAgIHBfbmFtZXNwYWNlcyA6PSBwX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IHAgbmFtZXNwYWNlcyA9IiwgcF9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlcyA6PSBpX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IGkgbmFtZXNwYWNlcyA9IiwgaV9uYW1lc3BhY2VzKQoKICAgICMgUmV0dXJuIHBhdGggb2YgdGhlICJuZXR3b3JrIiBuYW1lc3BhY2UKICAgIG5ldHdvcmtfbnMgOj0gW29iaiB8IG9iaiA6PSBpX25hbWVzcGFjZXNbX107IG9iai5UeXBlID09ICJuZXR3b3JrIl0KCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IG5ldHdvcmtfbnMgPSIsIG5ldHdvcmtfbnMpCgogICAgcmV0IDo9IGFsbG93X25ldHdvcmtfbmFtZXNwYWNlKHN0YXRlX29wcywgbmV0d29ya19ucykKICAgIHJldC5hbGxvd2VkCgogICAgb3BzIDo9IHJldC5vcHMKfQoKIyBUaGlzIHJ1bGUgaXMgd2hlbiB0aGVyZSdzIG5vIG5ldHdvcmsgbmFtZXNwYWNlIGluIHRoZSBpbnB1dCBkYXRhLgphbGxvd19uZXR3b3JrX25hbWVzcGFjZShzdGF0ZV9vcHMsIG5ldHdvcmtfbnMpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIGNvdW50KG5ldHdvcmtfbnMpID09IDAKCiAgICBuZXR3b3JrX25zX3BhdGggPSAiIgoKICAgIGFkZF9uZXR3b3JrX25hbWVzcGFjZV90b19zdGF0ZSA6PSBzdGF0ZV9hbGxvd3MoIm5ldHdvcmtfbmFtZXNwYWNlIiwgbmV0d29ya19uc19wYXRoKQogICAgb3BzIDo9IGNvbmNhdF9vcF9pZl9ub3RfbnVsbChzdGF0ZV9vcHMsIGFkZF9uZXR3b3JrX25hbWVzcGFjZV90b19zdGF0ZSkKCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2UgMTogdHJ1ZSIpCn0KCiMgVGhpcyBydWxlIGlzIHdoZW4gdGhlcmUncyBleGFjdGx5IG9uZSBuZXR3b3JrIG5hbWVzcGFjZSBpbiB0aGUgaW5wdXQgZGF0YS4KYWxsb3dfbmV0d29ya19uYW1lc3BhY2Uoc3RhdGVfb3BzLCBuZXR3b3JrX25zKSA6PSB7Im9wcyI6IG9wcywgImFsbG93ZWQiOiB0cnVlfSB7CiAgICBjb3VudChuZXR3b3JrX25zKSA9PSAxCgogICAgYWRkX25ldHdvcmtfbmFtZXNwYWNlX3RvX3N0YXRlIDo9IHN0YXRlX2FsbG93cygibmV0d29ya19uYW1lc3BhY2UiLCBuZXR3b3JrX25zWzBdLlBhdGgpCiAgICBvcHMgOj0gY29uY2F0X29wX2lmX25vdF9udWxsKHN0YXRlX29wcywgYWRkX25ldHdvcmtfbmFtZXNwYWNlX3RvX3N0YXRlKQoKICAgIHByaW50KCJhbGxvd19uZXR3b3JrX25hbWVzcGFjZSAyOiB0cnVlIikKfQoKYWxsb3dfbWFza2VkX3BhdGhzKHBfb2NpLCBpX29jaSkgewogICAgcF9wYXRocyA6PSBwX29jaS5MaW51eC5NYXNrZWRQYXRocwogICAgcHJpbnQoImFsbG93X21hc2tlZF9wYXRocyAxOiBwX3BhdGhzID0iLCBwX3BhdGhzKQoKICAgIGlfcGF0aHMgOj0gaV9vY2kuTGludXguTWFza2VkUGF0aHMKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aHMgMTogaV9wYXRocyA9IiwgaV9wYXRocykKCiAgICBhbGxvd19tYXNrZWRfcGF0aHNfYXJyYXkocF9wYXRocywgaV9wYXRocykKCiAgICBwcmludCgiYWxsb3dfbWFza2VkX3BhdGhzIDE6IHRydWUiKQp9CmFsbG93X21hc2tlZF9wYXRocyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aHMgMjogc3RhcnQiKQoKICAgIG5vdCBwX29jaS5MaW51eC5NYXNrZWRQYXRocwogICAgbm90IGlfb2NpLkxpbnV4Lk1hc2tlZFBhdGhzCgogICAgcHJpbnQoImFsbG93X21hc2tlZF9wYXRocyAyOiB0cnVlIikKfQoKIyBBbGwgdGhlIHBvbGljeSBtYXNrZWQgcGF0aHMgbXVzdCBiZSBtYXNrZWQgaW4gdGhlIGlucHV0IGRhdGEgdG9vLgojIElucHV0IGlzIGFsbG93ZWQgdG8gaGF2ZSBtb3JlIG1hc2tlZCBwYXRocyB0aGFuIHRoZSBwb2xpY3kuCmFsbG93X21hc2tlZF9wYXRoc19hcnJheShwX2FycmF5LCBpX2FycmF5KSB7CiAgICBldmVyeSBwX2VsZW0gaW4gcF9hcnJheSB7CiAgICAgICAgYWxsb3dfbWFza2VkX3BhdGgocF9lbGVtLCBpX2FycmF5KQogICAgfQp9CgphbGxvd19tYXNrZWRfcGF0aChwX2VsZW0sIGlfYXJyYXkpIHsKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aDogcF9lbGVtID0iLCBwX2VsZW0pCgogICAgc29tZSBpX2VsZW0gaW4gaV9hcnJheQogICAgcF9lbGVtID09IGlfZWxlbQoKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aDogdHJ1ZSIpCn0KCmFsbG93X3JlYWRvbmx5X3BhdGhzKHBfb2NpLCBpX29jaSkgewogICAgcF9wYXRocyA6PSBwX29jaS5MaW51eC5SZWFkb25seVBhdGhzCiAgICBwcmludCgiYWxsb3dfcmVhZG9ubHlfcGF0aHMgMTogcF9wYXRocyA9IiwgcF9wYXRocykKCiAgICBpX3BhdGhzIDo9IGlfb2NpLkxpbnV4LlJlYWRvbmx5UGF0aHMKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAxOiBpX3BhdGhzID0iLCBpX3BhdGhzKQoKICAgIGFsbG93X3JlYWRvbmx5X3BhdGhzX2FycmF5KHBfcGF0aHMsIGlfcGF0aHMsIGlfb2NpLkxpbnV4Lk1hc2tlZFBhdGhzKQoKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAxOiB0cnVlIikKfQphbGxvd19yZWFkb25seV9wYXRocyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAyOiBzdGFydCIpCgogICAgbm90IHBfb2NpLkxpbnV4LlJlYWRvbmx5UGF0aHMKICAgIG5vdCBpX29jaS5MaW51eC5SZWFkb25seVBhdGhzCgogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGhzIDI6IHRydWUiKQp9CgojIEFsbCB0aGUgcG9saWN5IHJlYWRvbmx5IHBhdGhzIG11c3QgYmUgZWl0aGVyOgojIC0gUHJlc2VudCBpbiB0aGUgaW5wdXQgcmVhZG9ubHkgcGF0aHMsIG9yCiMgLSBQcmVzZW50IGluIHRoZSBpbnB1dCBtYXNrZWQgcGF0aHMuCiMgSW5wdXQgaXMgYWxsb3dlZCB0byBoYXZlIG1vcmUgcmVhZG9ubHkgcGF0aHMgdGhhbiB0aGUgcG9saWN5LgphbGxvd19yZWFkb25seV9wYXRoc19hcnJheShwX2FycmF5LCBpX2FycmF5LCBtYXNrZWRfcGF0aHMpIHsKICAgIGV2ZXJ5IHBfZWxlbSBpbiBwX2FycmF5IHsKICAgICAgICBhbGxvd19yZWFkb25seV9wYXRoKHBfZWxlbSwgaV9hcnJheSwgbWFza2VkX3BhdGhzKQogICAgfQp9CgphbGxvd19yZWFkb25seV9wYXRoKHBfZWxlbSwgaV9hcnJheSwgbWFza2VkX3BhdGhzKSB7CiAgICBwcmludCgiYWxsb3dfcmVhZG9ubHlfcGF0aCAxOiBwX2VsZW0gPSIsIHBfZWxlbSkKCiAgICBzb21lIGlfZWxlbSBpbiBpX2FycmF5CiAgICBwX2VsZW0gPT0gaV9lbGVtCgogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGggMTogdHJ1ZSIpCn0KYWxsb3dfcmVhZG9ubHlfcGF0aChwX2VsZW0sIGlfYXJyYXksIG1hc2tlZF9wYXRocykgewogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGggMjogcF9lbGVtID0iLCBwX2VsZW0pCgogICAgc29tZSBpX21hc2tlZCBpbiBtYXNrZWRfcGF0aHMKICAgIHBfZWxlbSA9PSBpX21hc2tlZAoKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRoIDI6IHRydWUiKQp9CgphbGxvd19saW51eF9kZXZpY2VzKHBfZGV2aWNlcywgaV9kZXZpY2VzKSB7CiAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogc3RhcnQiKQogICAgZXZlcnkgaV9kZXZpY2UgaW4gaV9kZXZpY2VzIHsKICAgICAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogaV9kZXZpY2UgPSIsIGlfZGV2aWNlKQogICAgICAgIHNvbWUgcF9kZXZpY2UgaW4gcF9kZXZpY2VzCiAgICAgICAgaV9kZXZpY2UuUGF0aCA9PSBwX2RldmljZS5QYXRoCiAgICB9CiAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogdHJ1ZSIpCn0KCmFsbG93X2xpbnV4X3N5c2N0bChwX2xpbnV4LCBpX2xpbnV4KSB7CiAgICBwcmludCgiYWxsb3dfbGludXhfc3lzY3RsIDE6IHN0YXJ0IikKICAgIG5vdCBpX2xpbnV4LlN5c2N0bAogICAgcHJpbnQoImFsbG93X2xpbnV4X3N5c2N0bCAxOiB0cnVlIikKfQoKYWxsb3dfbGludXhfc3lzY3RsKHBfbGludXgsIGlfbGludXgpIHsKICAgIHByaW50KCJhbGxvd19saW51eF9zeXNjdGwgMjogc3RhcnQiKQogICAgcF9zeXNjdGwgOj0gcF9saW51eC5TeXNjdGwKICAgIGlfc3lzY3RsIDo9IGlfbGludXguU3lzY3RsCiAgICBldmVyeSBpX25hbWUsIGlfdmFsIGluIGlfc3lzY3RsIHsKICAgICAgICBwcmludCgiYWxsb3dfbGludXhfc3lzY3RsIDI6IGlfbmFtZSA9IiwgaV9uYW1lLCAiaV92YWwgPSIsIGlfdmFsKQogICAgICAgIHBfc3lzY3RsW2lfbmFtZV0gPT0gaV92YWwKICAgIH0KICAgIHByaW50KCJhbGxvd19saW51eF9zeXNjdGwgMjogdHJ1ZSIpCn0KCiMgQ2hlY2sgdGhlIGNvbnNpc3RlbmN5IG9mIHRoZSBpbnB1dCAiaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5idW5kbGVfcGF0aCIKIyBhbmQgaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCIgdmFsdWVzIHdpdGggb3RoZXIgZmllbGRzLgphbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZChwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpIHsKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogc3RhcnQiKQoKICAgIGJ1bmRsZV9wYXRoIDo9IGlfb2NpLkFubm90YXRpb25zWyJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmJ1bmRsZV9wYXRoIl0KICAgIGJ1bmRsZV9pZCA6PSByZXBsYWNlKGJ1bmRsZV9wYXRoLCAiL3J1bi9jb250YWluZXJkL2lvLmNvbnRhaW5lcmQucnVudGltZS52Mi50YXNrL2s4cy5pby8iLCAiIikKCiAgICBidW5kbGVfaWRfZm9ybWF0IDo9IGNvbmNhdCgiIiwgWyJeIiwgQlVORExFX0lELCAiJCJdKQogICAgcmVnZXgubWF0Y2goYnVuZGxlX2lkX2Zvcm1hdCwgYnVuZGxlX2lkKQoKICAgIGtleSA6PSAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCIKCiAgICBwX3JlZ2V4IDo9IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIHNhbmRib3hfaWQgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQoKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogc2FuZGJveF9pZCA9Iiwgc2FuZGJveF9pZCwgInJlZ2V4ID0iLCBwX3JlZ2V4KQogICAgcmVnZXgubWF0Y2gocF9yZWdleCwgc2FuZGJveF9pZCkKCiAgICBhbGxvd19yb290X3BhdGgocF9vY2ksIGlfb2NpLCBidW5kbGVfaWQpCgogICAgZXZlcnkgaV9tb3VudCBpbiBpX29jaS5Nb3VudHMgewogICAgICAgIGFsbG93X21vdW50KHBfb2NpLCBpX21vdW50LCBpX3N0b3JhZ2VzLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpCiAgICB9CgogICAgYWxsb3dfc3RvcmFnZXMocF9zdG9yYWdlcywgaV9zdG9yYWdlcywgYnVuZGxlX2lkLCBzYW5kYm94X2lkKQoKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogdHJ1ZSIpCn0KCmFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHBfcHJvY2VzcyA9IiwgcF9wcm9jZXNzKQogICAgcHJpbnQoImFsbG93X3Byb2Nlc3NfY29tbW9uOiBpX3Byb2Nlc3MgPSAiLCBpX3Byb2Nlc3MpCiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHNfbmFtZSA9Iiwgc19uYW1lKQoKICAgIHBfcHJvY2Vzcy5Dd2QgPT0gaV9wcm9jZXNzLkN3ZAogICAgcF9wcm9jZXNzLk5vTmV3UHJpdmlsZWdlcyA9PSBpX3Byb2Nlc3MuTm9OZXdQcml2aWxlZ2VzCgogICAgYWxsb3dfdXNlcihwX3Byb2Nlc3MsIGlfcHJvY2VzcykKICAgIGFsbG93X2VudihwX3Byb2Nlc3MsIGlfcHJvY2Vzcywgc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHRydWUiKQp9CgojIENvbXBhcmUgdGhlIE9DSSBQcm9jZXNzIGZpZWxkIG9mIGEgcG9saWN5IGNvbnRhaW5lciB3aXRoIHRoZSBpbnB1dCBPQ0kgUHJvY2VzcyBmcm9tIGEgQ3JlYXRlQ29udGFpbmVyUmVxdWVzdAphbGxvd19wcm9jZXNzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfcHJvY2Vzczogc3RhcnQiKQoKICAgIGFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgYWxsb3dfY2FwcyhwX3Byb2Nlc3MuQ2FwYWJpbGl0aWVzLCBpX3Byb2Nlc3MuQ2FwYWJpbGl0aWVzKQogICAgcF9wcm9jZXNzLlRlcm1pbmFsID09IGlfcHJvY2Vzcy5UZXJtaW5hbAoKICAgIHByaW50KCJhbGxvd19wcm9jZXNzOiB0cnVlIikKfQoKIyBDb21wYXJlIHRoZSBPQ0kgUHJvY2VzcyBmaWVsZCBvZiBhIHBvbGljeSBjb250YWluZXIgd2l0aCB0aGUgaW5wdXQgcHJvY2VzcyBmaWVsZCBmcm9tIEV4ZWNQcm9jZXNzUmVxdWVzdAphbGxvd19pbnRlcmFjdGl2ZV9wcm9jZXNzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfaW50ZXJhY3RpdmVfcHJvY2Vzczogc3RhcnQiKQoKICAgIGFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgYWxsb3dfZXhlY19jYXBzKGlfcHJvY2Vzcy5DYXBhYmlsaXRpZXMpCgogICAgIyBUaGVzZSBhcmUgY29tbWFuZHMgZW5hYmxlZCB1c2luZyBFeGVjUHJvY2Vzc1JlcXVlc3QgY29tbWFuZHMgYW5kL29yIHJlZ2V4IGZyb20gdGhlIHNldHRpbmdzIGZpbGUuCiAgICAjIFRoZXkgY2FuIGJlIGV4ZWN1dGVkIGludGVyYWN0aXZlbHkgc28gYWxsb3cgdGhlbSB0byB1c2UgYW55IHZhbHVlIGZvciBpX3Byb2Nlc3MuVGVybWluYWwuCgogICAgcHJpbnQoImFsbG93X2ludGVyYWN0aXZlX3Byb2Nlc3M6IHRydWUiKQp9CgojIENvbXBhcmUgdGhlIE9DSSBQcm9jZXNzIGZpZWxkIG9mIGEgcG9saWN5IGNvbnRhaW5lciB3aXRoIHRoZSBpbnB1dCBwcm9jZXNzIGZpZWxkIGZyb20gRXhlY1Byb2Nlc3NSZXF1ZXN0CmFsbG93X3Byb2JlX3Byb2Nlc3MocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19wcm9iZV9wcm9jZXNzOiBzdGFydCIpCgogICAgYWxsb3dfcHJvY2Vzc19jb21tb24ocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpCiAgICBhbGxvd19leGVjX2NhcHMoaV9wcm9jZXNzLkNhcGFiaWxpdGllcykKICAgIHBfcHJvY2Vzcy5UZXJtaW5hbCA9PSBpX3Byb2Nlc3MuVGVybWluYWwKCiAgICBwcmludCgiYWxsb3dfcHJvYmVfcHJvY2VzczogdHJ1ZSIpCn0KCmFsbG93X3VzZXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MpIHsKICAgIHBfdXNlciA6PSBwX3Byb2Nlc3MuVXNlcgogICAgaV91c2VyIDo9IGlfcHJvY2Vzcy5Vc2VyCgogICAgcHJpbnQoImFsbG93X3VzZXI6IGlucHV0IHVpZCA9IiwgaV91c2VyLlVJRCwgInBvbGljeSB1aWQgPSIsIHBfdXNlci5VSUQpCiAgICBwX3VzZXIuVUlEID09IGlfdXNlci5VSUQKCiAgICAjIFRPRE86IHRyYWNrIGRvd24gdGhlIHJlYXNvbiBmb3IgcmVnaXN0cnkuazhzLmlvL3BhdXNlOjMuOSBiZWluZwogICAgIyAgICAgICBleGVjdXRlZCB3aXRoIGdpZCA9IDAgZGVzcGl0ZSBoYXZpbmcgIjY1NTM1OjY1NTM1IiBpbiBpdHMgY29udGFpbmVyIGltYWdlCiAgICAjICAgICAgIGNvbmZpZy4KICAgICNwcmludCgiYWxsb3dfdXNlcjogaW5wdXQgZ2lkID0iLCBpX3VzZXIuR0lELCAicG9saWN5IGdpZCA9IiwgcF91c2VyLkdJRCkKICAgICNwX3VzZXIuR0lEID09IGlfdXNlci5HSUQKCiAgICAjIFRPRE86IGNvbXBhcmUgdGhlIGFkZGl0aW9uYWxHaWRzIGZpZWxkIHRvbyBhZnRlciBjb21wdXRpbmcgaXRzIHZhbHVlCiAgICAjIGJhc2VkIG9uIC9ldGMvcGFzc3dkIGFuZCAvZXRjL2dyb3VwIGZyb20gdGhlIGNvbnRhaW5lciBpbWFnZS4KfQoKYWxsb3dfZGVwcmVjYXRlZF9hcmdzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZ3MgMTogbm8gYXJncyIpCgogICAgbm90IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJncwogICAgbm90IGlfcHJvY2Vzcy5BcmdzCgogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAxOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZ3MocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSkgewogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiBwb2xpY3kgYXJncyA9IiwgcF9wcm9jZXNzLkRlcHJlY2F0ZWRBcmdzKQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiBpbnB1dCBhcmdzID0iLCBpX3Byb2Nlc3MuQXJncykKCiAgICBjb3VudChwX3Byb2Nlc3MuRGVwcmVjYXRlZEFyZ3MpID09IGNvdW50KGlfcHJvY2Vzcy5BcmdzKQoKICAgIGV2ZXJ5IGksIGlfYXJnIGluIGlfcHJvY2Vzcy5BcmdzIHsKICAgICAgICBhbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpCiAgICB9CgogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDE6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgcF9hcmcyIDo9IHJlcGxhY2UocF9hcmcsICIkJCIsICIkIikKICAgIHBfYXJnMiA9PSBpX2FyZwoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAxOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDI6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgIyBUT0RPOiBjYW4gJChub2RlLW5hbWUpIGJlIGhhbmRsZWQgYmV0dGVyPwogICAgY29udGFpbnMocF9hcmcsICIkKG5vZGUtbmFtZSkiKQoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAyOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDM6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgcF9hcmcyIDo9IHJlcGxhY2UocF9hcmcsICIkJCIsICIkIikKICAgIHBfYXJnMyA6PSByZXBsYWNlKHBfYXJnMiwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAzOiBwX2FyZzMgPSIsIHBfYXJnMykKICAgIHBfYXJnMyA9PSBpX2FyZwoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAzOiB0cnVlIikKfQoKIyBPQ0kgcHJvY2Vzcy5FbnYgZmllbGQKYWxsb3dfZW52KHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfZW52OiBwIGVudiA9IiwgcF9wcm9jZXNzLkVudikKICAgIHByaW50KCJhbGxvd19lbnY6IGkgZW52ID0iLCBpX3Byb2Nlc3MuRW52KQoKICAgIGV2ZXJ5IGlfdmFyIGluIGlfcHJvY2Vzcy5FbnYgewogICAgICAgIHByaW50KCJhbGxvd19lbnY6IGlfdmFyID0iLCBpX3ZhcikKICAgICAgICBhbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgfQoKICAgIHByaW50KCJhbGxvd19lbnY6IHRydWUiKQp9CgojIEFsbG93IGlucHV0IGVudiB2YXJpYWJsZXMgdGhhdCBhcmUgcHJlc2VudCBpbiB0aGUgcG9saWN5IGRhdGEgdG9vLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHBfdmFyID09IGlfdmFyCiAgICBwcmludCgiYWxsb3dfdmFyIDE6IHRydWUiKQp9CgojIE1hdGNoIGlucHV0IHdpdGggb25lIG9mIHRoZSBwb2xpY3kgdmFyaWFibGVzLCBhZnRlciBzdWJzdGl0dXRpbmcgJChzYW5kYm94LW5hbWUpLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHByaW50KCJhbGxvd192YXIgMjogcF92YXIgPSIsIHBfdmFyKQoKICAgIHBfdmFyX3NwbGl0IDo9IHNwbGl0KHBfdmFyLCAiPSIpCiAgICBjb3VudChwX3Zhcl9zcGxpdCkgPT0gMgoKICAgIHBfdmFyX3NwbGl0WzFdID09ICIkKHNhbmRib3gtbmFtZSkiCgogICAgaV92YXJfc3BsaXQgOj0gc3BsaXQoaV92YXIsICI9IikKICAgIGNvdW50KGlfdmFyX3NwbGl0KSA9PSAyCgogICAgaV92YXJfc3BsaXRbMF0gPT0gcF92YXJfc3BsaXRbMF0KICAgIHJlZ2V4Lm1hdGNoKHNfbmFtZSwgaV92YXJfc3BsaXRbMV0pCgogICAgcHJpbnQoImFsbG93X3ZhciAyOiB0cnVlIikKfQoKIyBBbGxvdyBpbnB1dCBlbnYgdmFyaWFibGVzIHRoYXQgbWF0Y2ggd2l0aCBhIHJlcXVlc3RfZGVmYXVsdHMgcmVnZXguCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHNvbWUgcF9yZWdleDEgaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5DcmVhdGVDb250YWluZXJSZXF1ZXN0LmFsbG93X2Vudl9yZWdleAogICAgcF9yZWdleDIgOj0gcmVwbGFjZShwX3JlZ2V4MSwgIiQoaXB2NF9hKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcHY0X2EpCiAgICBwX3JlZ2V4MyA6PSByZXBsYWNlKHBfcmVnZXgyLCAiJChpcF9wKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcF9wKQogICAgcF9yZWdleDQgOj0gcmVwbGFjZShwX3JlZ2V4MywgIiQoc3ZjX25hbWUpIiwgcG9saWN5X2RhdGEuY29tbW9uLnN2Y19uYW1lKQogICAgcF9yZWdleDUgOj0gcmVwbGFjZShwX3JlZ2V4NCwgIiQoZG5zX2xhYmVsKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5kbnNfbGFiZWwpCgogICAgcHJpbnQoImFsbG93X3ZhciAzOiBwX3JlZ2V4NSA9IiwgcF9yZWdleDUpCiAgICByZWdleC5tYXRjaChwX3JlZ2V4NSwgaV92YXIpCgogICAgcHJpbnQoImFsbG93X3ZhciAzOiB0cnVlIikKfQoKIyBBbGxvdyBmaWVsZFJlZiAiZmllbGRQYXRoOiBzdGF0dXMucG9kSVAiIHZhbHVlcy4KYWxsb3dfdmFyKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBpX3Zhciwgc19uYW1lLCBzX25hbWVzcGFjZSkgewogICAgbmFtZV92YWx1ZSA6PSBzcGxpdChpX3ZhciwgIj0iKQogICAgY291bnQobmFtZV92YWx1ZSkgPT0gMgogICAgaXNfaXAobmFtZV92YWx1ZVsxXSkKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIGFsbG93X3BvZF9pcF92YXIobmFtZV92YWx1ZVswXSwgcF92YXIpCgogICAgcHJpbnQoImFsbG93X3ZhciA0OiB0cnVlIikKfQoKIyBBbGxvdyBjb21tb24gZmllbGRSZWYgdmFyaWFibGVzLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBuYW1lX3ZhbHVlIDo9IHNwbGl0KGlfdmFyLCAiPSIpCiAgICBjb3VudChuYW1lX3ZhbHVlKSA9PSAyCgogICAgc29tZSBwX3ZhciBpbiBwX3Byb2Nlc3MuRW52CiAgICBwX25hbWVfdmFsdWUgOj0gc3BsaXQocF92YXIsICI9IikKICAgIGNvdW50KHBfbmFtZV92YWx1ZSkgPT0gMgoKICAgIHBfbmFtZV92YWx1ZVswXSA9PSBuYW1lX3ZhbHVlWzBdCgogICAgIyBUT0RPOiBzaG91bGQgdGhlc2UgYmUgaGFuZGxlZCBpbiBhIGRpZmZlcmVudCB3YXk/CiAgICBhbHdheXNfYWxsb3dlZCA6PSBbIiQoaG9zdC1uYW1lKSIsICIkKG5vZGUtbmFtZSkiLCAiJChwb2QtdWlkKSJdCiAgICBzb21lIGFsbG93ZWQgaW4gYWx3YXlzX2FsbG93ZWQKICAgIGNvbnRhaW5zKHBfbmFtZV92YWx1ZVsxXSwgYWxsb3dlZCkKCiAgICBwcmludCgiYWxsb3dfdmFyIDU6IHRydWUiKQp9CgojIEFsbG93IGZpZWxkUmVmICJmaWVsZFBhdGg6IHN0YXR1cy5ob3N0SVAiIHZhbHVlcy4KYWxsb3dfdmFyKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBpX3Zhciwgc19uYW1lLCBzX25hbWVzcGFjZSkgewogICAgbmFtZV92YWx1ZSA6PSBzcGxpdChpX3ZhciwgIj0iKQogICAgY291bnQobmFtZV92YWx1ZSkgPT0gMgogICAgaXNfaXAobmFtZV92YWx1ZVsxXSkKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIGFsbG93X2hvc3RfaXBfdmFyKG5hbWVfdmFsdWVbMF0sIHBfdmFyKQoKICAgIHByaW50KCJhbGxvd192YXIgNjogdHJ1ZSIpCn0KCiMgQWxsb3cgcmVzb3VyY2VGaWVsZFJlZiB2YWx1ZXMgKGUuZy4sICJsaW1pdHMuY3B1IikuCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIG5hbWVfdmFsdWUgOj0gc3BsaXQoaV92YXIsICI9IikKICAgIGNvdW50KG5hbWVfdmFsdWUpID09IDIKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHBfbmFtZV92YWx1ZSA6PSBzcGxpdChwX3ZhciwgIj0iKQogICAgY291bnQocF9uYW1lX3ZhbHVlKSA9PSAyCgogICAgcF9uYW1lX3ZhbHVlWzBdID09IG5hbWVfdmFsdWVbMF0KCiAgICAjIGEgdmFyaWFibGUgd2Ugc2hvdWxkIGJlIHZhbGlkYXRpbmcgdXNpbmcgYSByZWdleCBmcm9tIHNldHRpbmdzCiAgICBwX25hbWVfdmFsdWVbMV0gPT0gIiQodmFsaWRhdGUtZnJvbS1zZXR0aW5ncykiCgogICAgcmVnZXhfdmFsIDo9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuQ3JlYXRlQ29udGFpbmVyUmVxdWVzdC5hbGxvd19lbnZfcmVnZXhfbWFwW25hbWVfdmFsdWVbMF1dCgogICAgcHJpbnQoImFsbG93X3ZhciA3OiB2YWwgPSIsIG5hbWVfdmFsdWVbMV0pCiAgICBwcmludCgiYWxsb3dfdmFyIDc6IHJlZ2V4X3ZhbCA9IiwgcmVnZXhfdmFsKQoKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4X3ZhbCwgbmFtZV92YWx1ZVsxXSkKCiAgICBwcmludCgiYWxsb3dfdmFyIDc6IHRydWUiKQp9CgojIE1hdGNoIGlucHV0IHdpdGggb25lIG9mIHRoZSBwb2xpY3kgdmFyaWFibGVzLCBhZnRlciBzdWJzdGl0dXRpbmcgJChzYW5kYm94LW5hbWVzcGFjZSkuCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHNvbWUgcF92YXIgaW4gcF9wcm9jZXNzLkVudgogICAgcF92YXIyIDo9IHJlcGxhY2UocF92YXIsICIkKHNhbmRib3gtbmFtZXNwYWNlKSIsIHNfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd192YXIgODogcF92YXIyID0iLCBwX3ZhcjIpCiAgICBwX3ZhcjIgPT0gaV92YXIKCiAgICBwcmludCgiYWxsb3dfdmFyIDg6IHRydWUiKQp9CgphbGxvd19wb2RfaXBfdmFyKHZhcl9uYW1lLCBwX3ZhcikgewogICAgcHJpbnQoImFsbG93X3BvZF9pcF92YXI6IHZhcl9uYW1lID0iLCB2YXJfbmFtZSwgInBfdmFyID0iLCBwX3ZhcikKCiAgICBwX25hbWVfdmFsdWUgOj0gc3BsaXQocF92YXIsICI9IikKICAgIGNvdW50KHBfbmFtZV92YWx1ZSkgPT0gMgoKICAgIHBfbmFtZV92YWx1ZVswXSA9PSB2YXJfbmFtZQogICAgcF9uYW1lX3ZhbHVlWzFdID09ICIkKHBvZC1pcCkiCgogICAgcHJpbnQoImFsbG93X3BvZF9pcF92YXI6IHRydWUiKQp9CgphbGxvd19ob3N0X2lwX3Zhcih2YXJfbmFtZSwgcF92YXIpIHsKICAgIHByaW50KCJhbGxvd19ob3N0X2lwX3ZhcjogdmFyX25hbWUgPSIsIHZhcl9uYW1lLCAicF92YXIgPSIsIHBfdmFyKQoKICAgIHBfbmFtZV92YWx1ZSA6PSBzcGxpdChwX3ZhciwgIj0iKQogICAgY291bnQocF9uYW1lX3ZhbHVlKSA9PSAyCgogICAgcF9uYW1lX3ZhbHVlWzBdID09IHZhcl9uYW1lCiAgICBwX25hbWVfdmFsdWVbMV0gPT0gIiQoaG9zdC1pcCkiCgogICAgcHJpbnQoImFsbG93X2hvc3RfaXBfdmFyOiB0cnVlIikKfQoKaXNfaXAodmFsdWUpIHsKICAgIGJ5dGVzID0gc3BsaXQodmFsdWUsICIuIikKICAgIGNvdW50KGJ5dGVzKSA9PSA0CgogICAgaXNfaXBfZmlyc3RfYnl0ZShieXRlc1swXSkKICAgIGlzX2lwX290aGVyX2J5dGUoYnl0ZXNbMV0pCiAgICBpc19pcF9vdGhlcl9ieXRlKGJ5dGVzWzJdKQogICAgaXNfaXBfb3RoZXJfYnl0ZShieXRlc1szXSkKfQppc19pcF9maXJzdF9ieXRlKGNvbXBvbmVudCkgewogICAgbnVtYmVyID0gdG9fbnVtYmVyKGNvbXBvbmVudCkKICAgIG51bWJlciA+PSAxCiAgICBudW1iZXIgPD0gMjU1Cn0KaXNfaXBfb3RoZXJfYnl0ZShjb21wb25lbnQpIHsKICAgIG51bWJlciA9IHRvX251bWJlcihjb21wb25lbnQpCiAgICBudW1iZXIgPj0gMAogICAgbnVtYmVyIDw9IDI1NQp9CgojIE9DSSByb290LlBhdGgKYWxsb3dfcm9vdF9wYXRoKHBfb2NpLCBpX29jaSwgYnVuZGxlX2lkKSB7CiAgICBpX3BhdGggOj0gaV9vY2kuUm9vdC5QYXRoCiAgICBwX3BhdGgxIDo9IHBfb2NpLlJvb3QuUGF0aAogICAgcHJpbnQoImFsbG93X3Jvb3RfcGF0aDogaV9wYXRoID0iLCBpX3BhdGgsICJwX3BhdGgxID0iLCBwX3BhdGgxKQoKICAgIHBfcGF0aDIgOj0gcmVwbGFjZShwX3BhdGgxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfcm9vdF9wYXRoOiBwX3BhdGgyID0iLCBwX3BhdGgyKQoKICAgIHBfcGF0aDMgOj0gcmVwbGFjZShwX3BhdGgyLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X3Jvb3RfcGF0aDogcF9wYXRoMyA9IiwgcF9wYXRoMykKCiAgICBwX3BhdGgzID09IGlfcGF0aAoKICAgIHByaW50KCJhbGxvd19yb290X3BhdGg6IHRydWUiKQp9CgojIGRldmljZSBtb3VudHMKYWxsb3dfbW91bnQocF9vY2ksIGlfbW91bnQsIGlfc3RvcmFnZXMsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcHJpbnQoImFsbG93X21vdW50OiBpX21vdW50ID0iLCBpX21vdW50KQoKICAgIHNvbWUgcF9tb3VudCBpbiBwX29jaS5Nb3VudHMKICAgIHNvbWUgaV9zdG9yYWdlIGluIGlfc3RvcmFnZXMKCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IHBfbW91bnQgPSIsIHBfbW91bnQpCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IGlfc3RvcmFnZSA9IiwgaV9zdG9yYWdlKQoKICAgIGNoZWNrX21vdW50KHBfbW91bnQsIGlfbW91bnQsIGlfc3RvcmFnZSwgYnVuZGxlX2lkLCBzYW5kYm94X2lkKQoKICAgICMgVE9ETzogYXJlIHRoZXJlIGFueSBvdGhlciByZXF1aXJlZCBwb2xpY3kgY2hlY2tzIGZvciBtb3VudHMgLSBlLmcuLAogICAgIyAgICAgICBtdWx0aXBsZSBtb3VudHMgd2l0aCBzYW1lIHNvdXJjZSBvciBkZXN0aW5hdGlvbj8KCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IHRydWUiKQp9CgpjaGVja19tb3VudChwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcF9tb3VudCA9PSBpX21vdW50CiAgICBwcmludCgiY2hlY2tfbW91bnQgMTogdHJ1ZSIpCn0KY2hlY2tfbW91bnQocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHBfbW91bnQuZGVzdGluYXRpb24gPT0gaV9tb3VudC5kZXN0aW5hdGlvbgogICAgcF9tb3VudC50eXBlXyA9PSBpX21vdW50LnR5cGVfCiAgICBwX21vdW50Lm9wdGlvbnMgPT0gaV9tb3VudC5vcHRpb25zCgogICAgbW91bnRfc291cmNlX2FsbG93cyhwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkKCiAgICBwcmludCgiY2hlY2tfbW91bnQgMjogdHJ1ZSIpCn0KCm1vdW50X3NvdXJjZV9hbGxvd3MocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHJlZ2V4MSA6PSBwX21vdW50LnNvdXJjZQogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5tb3VudF9zb3VyY2VfY3BhdGgpCiAgICByZWdleDQgOj0gcmVwbGFjZShyZWdleDMsICIkKGJ1bmRsZS1pZCkiLCBidW5kbGVfaWQpCgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMTogcmVnZXg0ID0iLCByZWdleDQpCiAgICByZWdleC5tYXRjaChyZWdleDQsIGlfbW91bnQuc291cmNlKQoKICAgIHByaW50KCJtb3VudF9zb3VyY2VfYWxsb3dzIDE6IHRydWUiKQp9Cm1vdW50X3NvdXJjZV9hbGxvd3MocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHJlZ2V4MSA6PSBwX21vdW50LnNvdXJjZQogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5tb3VudF9zb3VyY2VfY3BhdGgpCiAgICByZWdleDQgOj0gcmVwbGFjZShyZWdleDMsICIkKHNhbmRib3gtaWQpIiwgc2FuZGJveF9pZCkKCiAgICBwcmludCgibW91bnRfc291cmNlX2FsbG93cyAyOiByZWdleDQgPSIsIHJlZ2V4NCkKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4NCwgaV9tb3VudC5zb3VyY2UpCgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMjogdHJ1ZSIpCn0KbW91bnRfc291cmNlX2FsbG93cyhwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogaV9tb3VudC5zb3VyY2UgPSIsIGlfbW91bnQuc291cmNlKQogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogaV9zdG9yYWdlLm1vdW50X3BvaW50ID0iLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCgogICAgaV9tb3VudC5zb3VyY2UgPT0gaV9zdG9yYWdlLm1vdW50X3BvaW50CgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogdHJ1ZSIpCn0KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBDcmVhdGUgY29udGFpbmVyIFN0b3JhZ2VzCgphbGxvd19zdG9yYWdlcyhwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHBfY291bnQgOj0gY291bnQocF9zdG9yYWdlcykKICAgIGlfY291bnQgOj0gY291bnQoaV9zdG9yYWdlcykKICAgIHByaW50KCJhbGxvd19zdG9yYWdlczogcF9jb3VudCA9IiwgcF9jb3VudCwgImlfY291bnQgPSIsIGlfY291bnQpCgogICAgcF9jb3VudCA9PSBpX2NvdW50CgogICAgIyBHZXQgdGhlIGNvbnRhaW5lciBpbWFnZSBsYXllciBJRHMgYW5kIHZlcml0eSByb290IGhhc2hlcywgZnJvbSB0aGUgIm92ZXJsYXlmcyIgc3RvcmFnZS4KICAgIHNvbWUgb3ZlcmxheV9zdG9yYWdlIGluIHBfc3RvcmFnZXMKICAgIG92ZXJsYXlfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIHByaW50KCJhbGxvd19zdG9yYWdlczogb3ZlcmxheV9zdG9yYWdlID0iLCBvdmVybGF5X3N0b3JhZ2UpCiAgICBjb3VudChvdmVybGF5X3N0b3JhZ2Uub3B0aW9ucykgPT0gMgoKICAgIGxheWVyX2lkcyA6PSBzcGxpdChvdmVybGF5X3N0b3JhZ2Uub3B0aW9uc1swXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiBsYXllcl9pZHMgPSIsIGxheWVyX2lkcykKCiAgICByb290X2hhc2hlcyA6PSBzcGxpdChvdmVybGF5X3N0b3JhZ2Uub3B0aW9uc1sxXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiByb290X2hhc2hlcyA9Iiwgcm9vdF9oYXNoZXMpCgogICAgZXZlcnkgaV9zdG9yYWdlIGluIGlfc3RvcmFnZXMgewogICAgICAgIGFsbG93X3N0b3JhZ2UocF9zdG9yYWdlcywgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpCiAgICB9CgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiB0cnVlIikKfQoKYWxsb3dfc3RvcmFnZShwX3N0b3JhZ2VzLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgc29tZSBwX3N0b3JhZ2UgaW4gcF9zdG9yYWdlcwoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiBwX3N0b3JhZ2UgPSIsIHBfc3RvcmFnZSkKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiBpX3N0b3JhZ2UgPSIsIGlfc3RvcmFnZSkKCiAgICBwX3N0b3JhZ2UuZHJpdmVyICAgICAgICAgICA9PSBpX3N0b3JhZ2UuZHJpdmVyCiAgICBwX3N0b3JhZ2UuZHJpdmVyX29wdGlvbnMgICA9PSBpX3N0b3JhZ2UuZHJpdmVyX29wdGlvbnMKICAgIHBfc3RvcmFnZS5mc19ncm91cCAgICAgICAgID09IGlfc3RvcmFnZS5mc19ncm91cAogICAgcF9zdG9yYWdlLmZzdHlwZSAgICAgICAgICAgPT0gaV9zdG9yYWdlLmZzdHlwZQoKICAgIGFsbG93X3N0b3JhZ2Vfc291cmNlKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKQogICAgYWxsb3dfc3RvcmFnZV9vcHRpb25zKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKQogICAgYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKQoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiB0cnVlIikKfQoKYWxsb3dfc3RvcmFnZV9zb3VyY2UocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX3NvdXJjZSAxOiBzdGFydCIpCgogICAgcF9zdG9yYWdlLnNvdXJjZSA9PSBpX3N0b3JhZ2Uuc291cmNlCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDE6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX3NvdXJjZShwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDI6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCgogICAgIyBEREREOkJCOkRELkY6IERvbWFpbjpCdXM6RGV2aWNlLkZ1bmN0aW9uCiAgICAjIGh0dHBzOi8vd3d3Lmtlcm5lbC5vcmcvZG9jL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtYnVzLXBjaQogICAgcmVnZXgubWF0Y2goYF5bYS1mMC05XXs0fTpbYS1mMC05XXsyfTpbYS1mMC05XXsyfVwuW2EtZjAtOV0kYCwgaV9zdG9yYWdlLnNvdXJjZSkKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9zb3VyY2UgMjogdHJ1ZSIpCn0KCmFsbG93X3N0b3JhZ2Vfc291cmNlKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKSB7CiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9zb3VyY2UgMzogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIGlfc3RvcmFnZS5zb3VyY2UgPT0gIm5vbmUiCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDM6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX3NvdXJjZShwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDQ6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJzbWIiCgogICAgIyBQYXR0ZXJuOiAvLzxzdG9yYWdlLWFjY291bnQtbmFtZT4uZmlsZS5jb3JlLndpbmRvd3MubmV0LzxrOHMtUFZDLW5hbWU+CiAgICAjIFN0b3JhZ2UgYWNjb3VudCBuYW1lOiBodHRwczovL2xlYXJuLm1pY3Jvc29mdC5jb20vZW4tdXMvYXp1cmUvc3RvcmFnZS9jb21tb24vc3RvcmFnZS1hY2NvdW50LW92ZXJ2aWV3I3N0b3JhZ2UtYWNjb3VudC1uYW1lCiAgICAjIEs4cyBQVkMgbmFtZTogaHR0cHM6Ly9rdWJlcm5ldGVzLmlvL2RvY3MvY29uY2VwdHMvb3ZlcnZpZXcvd29ya2luZy13aXRoLW9iamVjdHMvbmFtZXMvI2Rucy1zdWJkb21haW4tbmFtZXMKICAgIHJlZ2V4Lm1hdGNoKGBeXC9cLyhbYS16MC05XXszLDI0fSlcLmZpbGVcLmNvcmVcLndpbmRvd3NcLm5ldFwvW2EtejAtOV0oW2EtejAtOS4tXXswLDI1MX1bYS16MC05XSk/JGAsIGlfc3RvcmFnZS5zb3VyY2UpCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDQ6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMTogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgIT0gIm92ZXJsYXlmcyIKICAgIHBfc3RvcmFnZS5vcHRpb25zID09IGlfc3RvcmFnZS5vcHRpb25zCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAxOiB0cnVlIikKfQphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIGNvdW50KHBfc3RvcmFnZS5vcHRpb25zKSA9PSAyCgogICAgcG9saWN5X2lkcyA6PSBzcGxpdChwX3N0b3JhZ2Uub3B0aW9uc1swXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBwb2xpY3lfaWRzID0iLCBwb2xpY3lfaWRzKQogICAgcG9saWN5X2lkcyA9PSBsYXllcl9pZHMKCiAgICBwb2xpY3lfaGFzaGVzIDo9IHNwbGl0KHBfc3RvcmFnZS5vcHRpb25zWzFdLCAiOiIpCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IHBvbGljeV9oYXNoZXMgPSIsIHBvbGljeV9oYXNoZXMpCgogICAgcF9jb3VudCA6PSBjb3VudChwb2xpY3lfaWRzKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBwX2NvdW50ID0iLCBwX2NvdW50KQogICAgcF9jb3VudCA+PSAxCiAgICBwX2NvdW50ID09IGNvdW50KHBvbGljeV9oYXNoZXMpCgogICAgaV9jb3VudCA6PSBjb3VudChpX3N0b3JhZ2Uub3B0aW9ucykKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogaV9jb3VudCA9IiwgaV9jb3VudCkKICAgIGlfY291bnQgPT0gcF9jb3VudCArIDMKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zWzBdID0iLCBpX3N0b3JhZ2Uub3B0aW9uc1swXSkKICAgIGlfc3RvcmFnZS5vcHRpb25zWzBdID09ICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQubGF5ZXItc3JjLXByZWZpeD0vdmFyL2xpYi9jb250YWluZXJkL2lvLmNvbnRhaW5lcmQuc25hcHNob3R0ZXIudjEudGFyZGV2L2xheWVycyIKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zW2lfY291bnQgLSAyXSA9IiwgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDJdKQogICAgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDJdID09ICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQub3ZlcmxheS1ydyIKCiAgICBsb3dlcmRpciA6PSBjb25jYXQoIj0iLCBbImxvd2VyZGlyIiwgcF9zdG9yYWdlLm9wdGlvbnNbMF1dKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBsb3dlcmRpciA9IiwgbG93ZXJkaXIpCgogICAgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDFdID09IGxvd2VyZGlyCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zW2lfY291bnQgLSAxXSA9IiwgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDFdKQoKICAgIGV2ZXJ5IGksIHBvbGljeV9pZCBpbiBwb2xpY3lfaWRzIHsKICAgICAgICBhbGxvd19vdmVybGF5X2xheWVyKHBvbGljeV9pZCwgcG9saWN5X2hhc2hlc1tpXSwgaV9zdG9yYWdlLm9wdGlvbnNbaSArIDFdKQogICAgfQoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogdHJ1ZSIpCn0KYWxsb3dfc3RvcmFnZV9vcHRpb25zKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKSB7CiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDM6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCiAgICBjb3VudChwX3N0b3JhZ2Uub3B0aW9ucykgPT0gMQoKICAgIHN0YXJ0c3dpdGgocF9zdG9yYWdlLm9wdGlvbnNbMF0sICIkKGhhc2giKQogICAgaGFzaF9zdWZmaXggOj0gdHJpbV9sZWZ0KHBfc3RvcmFnZS5vcHRpb25zWzBdLCAiJChoYXNoIikKCiAgICBlbmRzd2l0aChoYXNoX3N1ZmZpeCwgIikiKQogICAgaGFzaF9pbmRleCA6PSB0cmltX3JpZ2h0KGhhc2hfc3VmZml4LCAiKSIpCiAgICBpIDo9IHRvX251bWJlcihoYXNoX2luZGV4KQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAzOiBpID0iLCBpKQoKICAgIGhhc2hfb3B0aW9uIDo9IGNvbmNhdCgiPSIsIFsiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LnJvb3QtaGFzaCIsIHJvb3RfaGFzaGVzW2ldXSkKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMzogaGFzaF9vcHRpb24gPSIsIGhhc2hfb3B0aW9uKQoKICAgIGNvdW50KGlfc3RvcmFnZS5vcHRpb25zKSA9PSA0CiAgICBpX3N0b3JhZ2Uub3B0aW9uc1swXSA9PSAicm8iCiAgICBpX3N0b3JhZ2Uub3B0aW9uc1sxXSA9PSAiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmJsb2NrX2RldmljZT1maWxlIgogICAgaV9zdG9yYWdlLm9wdGlvbnNbMl0gPT0gImlvLmthdGFjb250YWluZXJzLmZzLW9wdC5pcy1sYXllciIKICAgIGlfc3RvcmFnZS5vcHRpb25zWzNdID09IGhhc2hfb3B0aW9uCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAzOiB0cnVlIikKfQphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgNDogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gInNtYiIKICAgIHBfb3B0c19jb3VudCA6PSBjb3VudChwX3N0b3JhZ2Uub3B0aW9ucykKICAgIGlfb3B0c19jb3VudCA6PSBjb3VudChpX3N0b3JhZ2Uub3B0aW9ucykKICAgIGlfb3B0c19jb3VudCA9PSBwX29wdHNfY291bnQgKyAyCgogICAgaV9vcHRfbWF0Y2hlcyA6PSBbaSB8IGkgOj0gaWR4OyBpZHggPCBwX29wdHNfY291bnQ7IHBfc3RvcmFnZS5vcHRpb25zW2lkeF0gPT0gaV9zdG9yYWdlLm9wdGlvbnNbaWR4XV0KICAgIGNvdW50KGlfb3B0X21hdGNoZXMpID09IHBfb3B0c19jb3VudAoKICAgIHN0YXJ0c3dpdGgoaV9zdG9yYWdlLm9wdGlvbnNbaV9vcHRzX2NvdW50LTJdLCAiYWRkcj0iKQogICAgY3JlZHMgPSBzcGxpdChpX3N0b3JhZ2Uub3B0aW9uc1tpX29wdHNfY291bnQtMV0sICIsIikKICAgIGNvdW50KGNyZWRzKSA9PSAyCiAgICBzdGFydHN3aXRoKGNyZWRzWzBdLCAidXNlcm5hbWU9IikKICAgIHN0YXJ0c3dpdGgoY3JlZHNbMV0sICJwYXNzd29yZD0iKQogICAgCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDQ6IHRydWUiKQp9CgphbGxvd19vdmVybGF5X2xheWVyKHBvbGljeV9pZCwgcG9saWN5X2hhc2gsIGlfb3B0aW9uKSB7CiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogcG9saWN5X2lkID0iLCBwb2xpY3lfaWQsICJwb2xpY3lfaGFzaCA9IiwgcG9saWN5X2hhc2gpCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogaV9vcHRpb24gPSIsIGlfb3B0aW9uKQoKICAgIHN0YXJ0c3dpdGgoaV9vcHRpb24sICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQubGF5ZXI9IikKICAgIGlfdmFsdWUgOj0gcmVwbGFjZShpX29wdGlvbiwgImlvLmthdGFjb250YWluZXJzLmZzLW9wdC5sYXllcj0iLCAiIikKICAgIGlfdmFsdWVfZGVjb2RlZCA6PSBiYXNlNjQuZGVjb2RlKGlfdmFsdWUpCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogaV92YWx1ZV9kZWNvZGVkID0iLCBpX3ZhbHVlX2RlY29kZWQpCgogICAgcG9saWN5X3N1ZmZpeCA6PSBjb25jYXQoIj0iLCBbInRhcixybyxpby5rYXRhY29udGFpbmVycy5mcy1vcHQuYmxvY2tfZGV2aWNlPWZpbGUsaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmlzLWxheWVyLGlvLmthdGFjb250YWluZXJzLmZzLW9wdC5yb290LWhhc2giLCBwb2xpY3lfaGFzaF0pCiAgICBwX3ZhbHVlIDo9IGNvbmNhdCgiLCIsIFtwb2xpY3lfaWQsIHBvbGljeV9zdWZmaXhdKQogICAgcHJpbnQoImFsbG93X292ZXJsYXlfbGF5ZXI6IHBfdmFsdWUgPSIsIHBfdmFsdWUpCgogICAgcF92YWx1ZSA9PSBpX3ZhbHVlX2RlY29kZWQKCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogdHJ1ZSIpCn0KCmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAidGFyIgoKICAgIHN0YXJ0c3dpdGgocF9zdG9yYWdlLm1vdW50X3BvaW50LCAiJChsYXllciIpCiAgICBtb3VudF9zdWZmaXggOj0gdHJpbV9sZWZ0KHBfc3RvcmFnZS5tb3VudF9wb2ludCwgIiQobGF5ZXIiKQoKICAgIGVuZHN3aXRoKG1vdW50X3N1ZmZpeCwgIikiKQogICAgbGF5ZXJfaW5kZXggOj0gdHJpbV9yaWdodChtb3VudF9zdWZmaXgsICIpIikKICAgIGkgOj0gdG9fbnVtYmVyKGxheWVyX2luZGV4KQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDE6IGkgPSIsIGkpCgogICAgbGF5ZXJfaWQgOj0gbGF5ZXJfaWRzW2ldCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMTogbGF5ZXJfaWQgPSIsIGxheWVyX2lkKQoKICAgIHBfbW91bnQgOj0gY29uY2F0KCIvIiwgWyIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L2xheWVycyIsIGxheWVyX2lkXSkKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCAxOiBwX21vdW50ID0iLCBwX21vdW50KQoKICAgIHBfbW91bnQgPT0gaV9zdG9yYWdlLm1vdW50X3BvaW50CgogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDE6IHRydWUiKQp9CmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAiZnVzZTMua2F0YS1vdmVybGF5IgoKICAgIG1vdW50MSA6PSByZXBsYWNlKHBfc3RvcmFnZS5tb3VudF9wb2ludCwgIiQoY3BhdGgpIiwgcG9saWN5X2RhdGEuY29tbW9uLmNwYXRoKQogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDI6IG1vdW50MiA9IiwgbW91bnQyKQoKICAgIG1vdW50MiA9PSBpX3N0b3JhZ2UubW91bnRfcG9pbnQKCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMjogdHJ1ZSIpCn0KYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKSB7CiAgICBwX3N0b3JhZ2UuZnN0eXBlID09ICJsb2NhbCIKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQyID0iLCBtb3VudDIpCgogICAgbW91bnQzIDo9IHJlcGxhY2UobW91bnQyLCAiJChzYW5kYm94LWlkKSIsIHNhbmRib3hfaWQpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQzID0iLCBtb3VudDMpCgogICAgcmVnZXgubWF0Y2gobW91bnQzLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCgogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDM6IHRydWUiKQp9CmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAiYmluZCIKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNDogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNDogbW91bnQyID0iLCBtb3VudDIpCgogICAgbW91bnQzIDo9IHJlcGxhY2UobW91bnQyLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDQ6IG1vdW50MyA9IiwgbW91bnQzKQoKICAgIHJlZ2V4Lm1hdGNoKG1vdW50MywgaV9zdG9yYWdlLm1vdW50X3BvaW50KQoKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA0OiB0cnVlIikKfQphbGxvd19tb3VudF9wb2ludChwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgYnVuZGxlX2lkLCBzYW5kYm94X2lkLCBsYXllcl9pZHMpIHsKICAgIHBfc3RvcmFnZS5mc3R5cGUgPT0gInRtcGZzIgoKICAgIG1vdW50MSA6PSBwX3N0b3JhZ2UubW91bnRfcG9pbnQKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA1OiBtb3VudDEgPSIsIG1vdW50MSkKCiAgICByZWdleC5tYXRjaChtb3VudDEsIGlfc3RvcmFnZS5tb3VudF9wb2ludCkKCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNTogdHJ1ZSIpCn0KYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKSB7CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogaV9zdG9yYWdlLm1vdW50X3BvaW50ID0iLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCiAgICBhbGxvd19kaXJlY3Rfdm9sX2RyaXZlcihwX3N0b3JhZ2UsIGlfc3RvcmFnZSkKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChzcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQyID0iLCBtb3VudDIpCgogICAgZGlyZWN0X3ZvbF9wYXRoIDo9IGlfc3RvcmFnZS5zb3VyY2UKICAgIG1vdW50MyA6PSByZXBsYWNlKG1vdW50MiwgIiQoYjY0LWRpcmVjdC12b2wtcGF0aCkiLCBiYXNlNjR1cmwuZW5jb2RlKGRpcmVjdF92b2xfcGF0aCkpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQzID0iLCBtb3VudDMpCgogICAgbW91bnQzID09IGlfc3RvcmFnZS5tb3VudF9wb2ludAoKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA2OiB0cnVlIikKfQoKYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIocF9zdG9yYWdlLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19kaXJlY3Rfdm9sX2RyaXZlciAxOiBzdGFydCIpCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCiAgICBwcmludCgiYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIgMTogdHJ1ZSIpCn0KYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIocF9zdG9yYWdlLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19kaXJlY3Rfdm9sX2RyaXZlciAyOiBzdGFydCIpCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJzbWIiCiAgICBwcmludCgiYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIgMjogdHJ1ZSIpCn0KCiMgRXhlY1Byb2Nlc3NSZXF1ZXN0LnByb2Nlc3MuQ2FwYWJpbGl0aWVzCmFsbG93X2V4ZWNfY2FwcyhpX2NhcHMpIHsKICAgIG5vdCBpX2NhcHMuQW1iaWVudAogICAgbm90IGlfY2Fwcy5Cb3VuZGluZwogICAgbm90IGlfY2Fwcy5FZmZlY3RpdmUKICAgIG5vdCBpX2NhcHMuSW5oZXJpdGFibGUKICAgIG5vdCBpX2NhcHMuUGVybWl0dGVkCn0KCiMgT0NJLlByb2Nlc3MuQ2FwYWJpbGl0aWVzCmFsbG93X2NhcHMocF9jYXBzLCBpX2NhcHMpIHsKICAgIHByaW50KCJhbGxvd19jYXBzOiBwb2xpY3kgQW1iaWVudCA9IiwgcF9jYXBzLkFtYmllbnQpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgQW1iaWVudCA9IiwgaV9jYXBzLkFtYmllbnQpCiAgICBtYXRjaF9jYXBzKHBfY2Fwcy5BbWJpZW50LCBpX2NhcHMuQW1iaWVudCkKCiAgICBwcmludCgiYWxsb3dfY2FwczogcG9saWN5IEJvdW5kaW5nID0iLCBwX2NhcHMuQm91bmRpbmcpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgQm91bmRpbmcgPSIsIGlfY2Fwcy5Cb3VuZGluZykKICAgIG1hdGNoX2NhcHMocF9jYXBzLkJvdW5kaW5nLCBpX2NhcHMuQm91bmRpbmcpCgogICAgcHJpbnQoImFsbG93X2NhcHM6IHBvbGljeSBFZmZlY3RpdmUgPSIsIHBfY2Fwcy5FZmZlY3RpdmUpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgRWZmZWN0aXZlID0iLCBpX2NhcHMuRWZmZWN0aXZlKQogICAgbWF0Y2hfY2FwcyhwX2NhcHMuRWZmZWN0aXZlLCBpX2NhcHMuRWZmZWN0aXZlKQoKICAgIHByaW50KCJhbGxvd19jYXBzOiBwb2xpY3kgSW5oZXJpdGFibGUgPSIsIHBfY2Fwcy5Jbmhlcml0YWJsZSkKICAgIHByaW50KCJhbGxvd19jYXBzOiBpbnB1dCBJbmhlcml0YWJsZSA9IiwgaV9jYXBzLkluaGVyaXRhYmxlKQogICAgbWF0Y2hfY2FwcyhwX2NhcHMuSW5oZXJpdGFibGUsIGlfY2Fwcy5Jbmhlcml0YWJsZSkKCiAgICBwcmludCgiYWxsb3dfY2FwczogcG9saWN5IFBlcm1pdHRlZCA9IiwgcF9jYXBzLlBlcm1pdHRlZCkKICAgIHByaW50KCJhbGxvd19jYXBzOiBpbnB1dCBQZXJtaXR0ZWQgPSIsIGlfY2Fwcy5QZXJtaXR0ZWQpCiAgICBtYXRjaF9jYXBzKHBfY2Fwcy5QZXJtaXR0ZWQsIGlfY2Fwcy5QZXJtaXR0ZWQpCn0KCm1hdGNoX2NhcHMocF9jYXBzLCBpX2NhcHMpIHsKICAgIHByaW50KCJtYXRjaF9jYXBzIDE6IHN0YXJ0IikKCiAgICBwX2NhcHMgPT0gaV9jYXBzCgogICAgcHJpbnQoIm1hdGNoX2NhcHMgMTogdHJ1ZSIpCn0KbWF0Y2hfY2FwcyhwX2NhcHMsIGlfY2FwcykgewogICAgcHJpbnQoIm1hdGNoX2NhcHMgMjogc3RhcnQiKQoKICAgIGNvdW50KHBfY2FwcykgPT0gMQogICAgcF9jYXBzWzBdID09ICIkKGRlZmF1bHRfY2FwcykiCgogICAgcHJpbnQoIm1hdGNoX2NhcHMgMjogZGVmYXVsdF9jYXBzID0iLCBwb2xpY3lfZGF0YS5jb21tb24uZGVmYXVsdF9jYXBzKQogICAgcG9saWN5X2RhdGEuY29tbW9uLmRlZmF1bHRfY2FwcyA9PSBpX2NhcHMKCiAgICBwcmludCgibWF0Y2hfY2FwcyAyOiB0cnVlIikKfQptYXRjaF9jYXBzKHBfY2FwcywgaV9jYXBzKSB7CiAgICBwcmludCgibWF0Y2hfY2FwcyAzOiBzdGFydCIpCgogICAgY291bnQocF9jYXBzKSA9PSAxCiAgICBwX2NhcHNbMF0gPT0gIiQocHJpdmlsZWdlZF9jYXBzKSIKCiAgICBwcmludCgibWF0Y2hfY2FwcyAzOiBwcml2aWxlZ2VkX2NhcHMgPSIsIHBvbGljeV9kYXRhLmNvbW1vbi5wcml2aWxlZ2VkX2NhcHMpCiAgICBwb2xpY3lfZGF0YS5jb21tb24ucHJpdmlsZWdlZF9jYXBzID09IGlfY2FwcwoKICAgIHByaW50KCJtYXRjaF9jYXBzIDM6IHRydWUiKQp9CgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgpjaGVja19kaXJlY3RvcnlfdHJhdmVyc2FsKGlfcGF0aCkgewogICAgbm90IHJlZ2V4Lm1hdGNoKCIoXnwvKS4uKCR8LykiLCBpX3BhdGgpCn0KCmNoZWNrX3N5bWxpbmtfc291cmNlKGlfc3JjKSB7CiAgICBpX3NyYyA9PSAiIgogICAgcHJpbnQoImNoZWNrX3N5bWxpbmtfc291cmNlIDE6IHRydWUiKQp9CmNoZWNrX3N5bWxpbmtfc291cmNlKGlfc3JjKSB7CiAgICBpX3NyYyAhPSAiIgogICAgcHJpbnQoImNoZWNrX3N5bWxpbmtfc291cmNlIDI6IGlfc3JjID0iLCBpX3NyYykKCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24uc19zb3VyY2UxLCBpX3NyYykKCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMjogdHJ1ZSIpCn0KY2hlY2tfc3ltbGlua19zb3VyY2UoaV9zcmMpIHsKICAgIGlfc3JjICE9ICIiCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMzogaV9zcmMgPSIsIGlfc3JjKQoKICAgIHJlZ2V4Lm1hdGNoKHBvbGljeV9kYXRhLmNvbW1vbi5zX3NvdXJjZTIsIGlfc3JjKQogICAgY2hlY2tfZGlyZWN0b3J5X3RyYXZlcnNhbChpX3NyYykKCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMzogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfc3RvcmFnZXMoaV9zdG9yYWdlcykgewogICAgcHJpbnQoImFsbG93X3NhbmRib3hfc3RvcmFnZXM6IGlfc3RvcmFnZXMgPSIsIGlfc3RvcmFnZXMpCgogICAgcF9zdG9yYWdlcyA6PSBwb2xpY3lfZGF0YS5zYW5kYm94LnN0b3JhZ2VzCiAgICBldmVyeSBpX3N0b3JhZ2UgaW4gaV9zdG9yYWdlcyB7CiAgICAgICAgYWxsb3dfc2FuZGJveF9zdG9yYWdlKHBfc3RvcmFnZXMsIGlfc3RvcmFnZSkKICAgIH0KCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9zdG9yYWdlczogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfc3RvcmFnZShwX3N0b3JhZ2VzLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IGlfc3RvcmFnZSA9IiwgaV9zdG9yYWdlKQoKICAgIHNvbWUgcF9zdG9yYWdlIGluIHBfc3RvcmFnZXMKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IHBfc3RvcmFnZSA9IiwgcF9zdG9yYWdlKQogICAgaV9zdG9yYWdlID09IHBfc3RvcmFnZQoKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IHRydWUiKQp9CgpDb3B5RmlsZVJlcXVlc3QgewogICAgcHJpbnQoIkNvcHlGaWxlUmVxdWVzdDogaW5wdXQucGF0aCA9IiwgaW5wdXQucGF0aCkKCiAgICBjaGVja19zeW1saW5rX3NvdXJjZShpbnB1dC5zeW1saW5rX3NyYykKICAgIGNoZWNrX2RpcmVjdG9yeV90cmF2ZXJzYWwoaW5wdXQucGF0aCkKCiAgICBzb21lIHJlZ2V4MSBpbiBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLkNvcHlGaWxlUmVxdWVzdAogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5jcGF0aCkKICAgIHJlZ2V4NCA6PSByZXBsYWNlKHJlZ2V4MywgIiQoYnVuZGxlLWlkKSIsIEJVTkRMRV9JRCkKICAgIHByaW50KCJDb3B5RmlsZVJlcXVlc3Q6IHJlZ2V4NCA9IiwgcmVnZXg0KQoKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4NCwgaW5wdXQucGF0aCkKCiAgICBwcmludCgiQ29weUZpbGVSZXF1ZXN0OiB0cnVlIikKfQoKQ3JlYXRlU2FuZGJveFJlcXVlc3QgewogICAgcHJpbnQoIkNyZWF0ZVNhbmRib3hSZXF1ZXN0OiBpbnB1dC5ndWVzdF9ob29rX3BhdGggPSIsIGlucHV0Lmd1ZXN0X2hvb2tfcGF0aCkKICAgIGNvdW50KGlucHV0Lmd1ZXN0X2hvb2tfcGF0aCkgPT0gMAoKICAgIHByaW50KCJDcmVhdGVTYW5kYm94UmVxdWVzdDogaW5wdXQua2VybmVsX21vZHVsZXMgPSIsIGlucHV0Lmtlcm5lbF9tb2R1bGVzKQogICAgY291bnQoaW5wdXQua2VybmVsX21vZHVsZXMpID09IDAKCiAgICBpX3BpZG5zIDo9IGlucHV0LnNhbmRib3hfcGlkbnMKICAgIHByaW50KCJDcmVhdGVTYW5kYm94UmVxdWVzdDogaV9waWRucyA9IiwgaV9waWRucykKICAgIGlfcGlkbnMgPT0gZmFsc2UKICAgIGFsbG93X3NhbmRib3hfc3RvcmFnZXMoaW5wdXQuc3RvcmFnZXMpCn0KCmFsbG93X2V4ZWMocF9jb250YWluZXIsIGlfcHJvY2VzcykgewogICAgcHJpbnQoImFsbG93X2V4ZWM6IHN0YXJ0IikKCiAgICBwX29jaSA9IHBfY29udGFpbmVyLk9DSQogICAgcF9zX25hbWUgPSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc19uYW1lc3BhY2UgPSBnZXRfc3RhdGVfdmFsKCJuYW1lc3BhY2UiKQogICAgYWxsb3dfcHJvYmVfcHJvY2VzcyhwX29jaS5Qcm9jZXNzLCBpX3Byb2Nlc3MsIHBfc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfZXhlYzogdHJ1ZSIpCn0KCmFsbG93X2ludGVyYWN0aXZlX2V4ZWMocF9jb250YWluZXIsIGlfcHJvY2VzcykgewogICAgcHJpbnQoImFsbG93X2ludGVyYWN0aXZlX2V4ZWM6IHN0YXJ0IikKCiAgICBwX29jaSA9IHBfY29udGFpbmVyLk9DSQogICAgcF9zX25hbWUgPSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc19uYW1lc3BhY2UgPSBnZXRfc3RhdGVfdmFsKCJuYW1lc3BhY2UiKQogICAgYWxsb3dfaW50ZXJhY3RpdmVfcHJvY2VzcyhwX29jaS5Qcm9jZXNzLCBpX3Byb2Nlc3MsIHBfc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfaW50ZXJhY3RpdmVfZXhlYzogdHJ1ZSIpCn0KCiMgVE9ETzogc2hvdWxkIG90aGVyIEV4ZWNQcm9jZXNzUmVxdWVzdCBpbnB1dCBkYXRhIGZpZWxkcyBiZSB2YWxpZGF0ZWQgYXMgd2VsbD8KRXhlY1Byb2Nlc3NSZXF1ZXN0IHsKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMTogaW5wdXQgPSIsIGlucHV0KQoKICAgIHNvbWUgcF9jb21tYW5kIGluIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuRXhlY1Byb2Nlc3NSZXF1ZXN0LmFsbG93ZWRfY29tbWFuZHMKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMTogcF9jb21tYW5kID0iLCBwX2NvbW1hbmQpCiAgICBwX2NvbW1hbmQgPT0gaW5wdXQucHJvY2Vzcy5BcmdzCgogICAgIyBUT0RPOiBtYXRjaCBwX2NvbnRhaW5lcidzIElEIHdpdGggdGhlIGlucHV0IGNvbnRhaW5lcl9pZC4KICAgIHNvbWUgcF9jb250YWluZXIgaW4gcG9saWN5X2RhdGEuY29udGFpbmVycwogICAgYWxsb3dfaW50ZXJhY3RpdmVfZXhlYyhwX2NvbnRhaW5lciwgaW5wdXQucHJvY2VzcykKCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDE6IHRydWUiKQp9CkV4ZWNQcm9jZXNzUmVxdWVzdCB7CiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDI6IGlucHV0ID0iLCBpbnB1dCkKCiAgICAjIFRPRE86IG1hdGNoIGlucHV0IGNvbnRhaW5lciBJRCB3aXRoIGl0cyBjb3JyZXNwb25kaW5nIGNvbnRhaW5lci5leGVjX2NvbW1hbmRzLgogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBzb21lIHBfY29tbWFuZCBpbiBwX2NvbnRhaW5lci5leGVjX2NvbW1hbmRzCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDI6IHBfY29tbWFuZCA9IiwgcF9jb21tYW5kKQoKICAgICMgVE9ETzogc2hvdWxkIG90aGVyIGlucHV0IGRhdGEgZmllbGRzIGJlIHZhbGlkYXRlZCBhcyB3ZWxsPwogICAgcF9jb21tYW5kID09IGlucHV0LnByb2Nlc3MuQXJncwoKICAgIGFsbG93X2V4ZWMocF9jb250YWluZXIsIGlucHV0LnByb2Nlc3MpCgogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAyOiB0cnVlIikKfQpFeGVjUHJvY2Vzc1JlcXVlc3QgewogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAzOiBpbnB1dCA9IiwgaW5wdXQpCgogICAgaV9jb21tYW5kID0gY29uY2F0KCIgIiwgaW5wdXQucHJvY2Vzcy5BcmdzKQogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAzOiBpX2NvbW1hbmQgPSIsIGlfY29tbWFuZCkKCiAgICBzb21lIHBfcmVnZXggaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5FeGVjUHJvY2Vzc1JlcXVlc3QucmVnZXgKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMzogcF9yZWdleCA9IiwgcF9yZWdleCkKCiAgICByZWdleC5tYXRjaChwX3JlZ2V4LCBpX2NvbW1hbmQpCgogICAgIyBUT0RPOiBtYXRjaCBwX2NvbnRhaW5lcidzIElEIHdpdGggdGhlIGlucHV0IGNvbnRhaW5lcl9pZC4KICAgIHNvbWUgcF9jb250YWluZXIgaW4gcG9saWN5X2RhdGEuY29udGFpbmVycwogICAgYWxsb3dfaW50ZXJhY3RpdmVfZXhlYyhwX2NvbnRhaW5lciwgaW5wdXQucHJvY2VzcykKCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDM6IHRydWUiKQp9CgpVcGRhdGVSb3V0ZXNSZXF1ZXN0IHsKICAgIHByaW50KCJVcGRhdGVSb3V0ZXNSZXF1ZXN0OiBpbnB1dCA9IiwgaW5wdXQpCiAgICBwcmludCgiVXBkYXRlUm91dGVzUmVxdWVzdDogcG9saWN5ID0iLCBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLlVwZGF0ZVJvdXRlc1JlcXVlc3QpCgogICAgaV9yb3V0ZXMgOj0gaW5wdXQucm91dGVzLlJvdXRlcwogICAgcF9zb3VyY2VfcmVnZXggPSBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLlVwZGF0ZVJvdXRlc1JlcXVlc3QuZm9yYmlkZGVuX3NvdXJjZV9yZWdleAogICAgcF9uYW1lcyA9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuVXBkYXRlUm91dGVzUmVxdWVzdC5mb3JiaWRkZW5fZGV2aWNlX25hbWVzCgogICAgZXZlcnkgaV9yb3V0ZSBpbiBpX3JvdXRlcyB7CiAgICAgICAgcHJpbnQoImlfcm91dGUuc291cmNlID0iLCBpX3JvdXRlLnNvdXJjZSkKICAgICAgICBldmVyeSBwX3JlZ2V4IGluIHBfc291cmNlX3JlZ2V4IHsKICAgICAgICAgICAgcHJpbnQoInBfcmVnZXggPSIsIHBfcmVnZXgpCiAgICAgICAgICAgIG5vdCByZWdleC5tYXRjaChwX3JlZ2V4LCBpX3JvdXRlLnNvdXJjZSkKICAgICAgICB9CgogICAgICAgIHByaW50KCJpX3JvdXRlLmRldmljZSA9IiwgaV9yb3V0ZS5kZXZpY2UpCiAgICAgICAgbm90IGlfcm91dGUuZGV2aWNlIGluIHBfbmFtZXMKICAgIH0KCiAgICBwcmludCgiVXBkYXRlUm91dGVzUmVxdWVzdDogdHJ1ZSIpCn0KClVwZGF0ZUludGVyZmFjZVJlcXVlc3QgewogICAgcHJpbnQoIlVwZGF0ZUludGVyZmFjZVJlcXVlc3Q6IGlucHV0ID0iLCBpbnB1dCkKICAgIHByaW50KCJVcGRhdGVJbnRlcmZhY2VSZXF1ZXN0OiBwb2xpY3kgPSIsIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuVXBkYXRlSW50ZXJmYWNlUmVxdWVzdCkKCiAgICBpX2ludGVyZmFjZSA6PSBpbnB1dC5pbnRlcmZhY2UKICAgIHBfZmxhZ3MgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmFsbG93X3Jhd19mbGFncwoKICAgICMgVHlwaWNhbGx5LCBqdXN0IElGRl9OT0FSUCBpcyB1c2VkLgogICAgYml0cy5hbmQoaV9pbnRlcmZhY2UucmF3X2ZsYWdzLCBiaXRzLm5lZ2F0ZShwX2ZsYWdzKSkgPT0gMAoKICAgIHBfbmFtZXMgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmZvcmJpZGRlbl9uYW1lcwoKICAgIG5vdCBpX2ludGVyZmFjZS5uYW1lIGluIHBfbmFtZXMKCiAgICBwX2h3YWRkcnMgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmZvcmJpZGRlbl9od19hZGRycwoKICAgIG5vdCBpX2ludGVyZmFjZS5od0FkZHIgaW4gcF9od2FkZHJzCgogICAgcHJpbnQoIlVwZGF0ZUludGVyZmFjZVJlcXVlc3Q6IHRydWUiKQp9CgpDbG9zZVN0ZGluUmVxdWVzdCB7CiAgICBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLkNsb3NlU3RkaW5SZXF1ZXN0ID09IHRydWUKfQoKUmVhZFN0cmVhbVJlcXVlc3QgewogICAgcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5SZWFkU3RyZWFtUmVxdWVzdCA9PSB0cnVlCn0KClVwZGF0ZUVwaGVtZXJhbE1vdW50c1JlcXVlc3QgewogICAgcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVFcGhlbWVyYWxNb3VudHNSZXF1ZXN0ID09IHRydWUKfQoKV3JpdGVTdHJlYW1SZXF1ZXN0IHsKICAgIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuV3JpdGVTdHJlYW1SZXF1ZXN0ID09IHRydWUKfQoKcG9saWN5X2RhdGEgOj0gewogICJjb250YWluZXJzIjogWwogICAgewogICAgICAiT0NJIjogewogICAgICAgICJWZXJzaW9uIjogIjEuMS4wLXJjLjEiLAogICAgICAgICJQcm9jZXNzIjogewogICAgICAgICAgIlRlcm1pbmFsIjogZmFsc2UsCiAgICAgICAgICAiVXNlciI6IHsKICAgICAgICAgICAgIlVJRCI6IDY1NTM1LAogICAgICAgICAgICAiR0lEIjogNjU1MzUsCiAgICAgICAgICAgICJBZGRpdGlvbmFsR2lkcyI6IFtdLAogICAgICAgICAgICAiVXNlcm5hbWUiOiAiIgogICAgICAgICAgfSwKICAgICAgICAgICJEZXByZWNhdGVkQXJncyI6IFsKICAgICAgICAgICAgIi9wYXVzZSIKICAgICAgICAgIF0sCiAgICAgICAgICAiQXJncyI6IFsKICAgICAgICAgICAgIi9wYXVzZSIKICAgICAgICAgIF0sCiAgICAgICAgICAiRW52IjogWwogICAgICAgICAgICAiUEFUSD0vdXNyL2xvY2FsL3NiaW46L3Vzci9sb2NhbC9iaW46L3Vzci9zYmluOi91c3IvYmluOi9zYmluOi9iaW4iCiAgICAgICAgICBdLAogICAgICAgICAgIkN3ZCI6ICIvIiwKICAgICAgICAgICJDYXBhYmlsaXRpZXMiOiB7CiAgICAgICAgICAgICJBbWJpZW50IjogW10sCiAgICAgICAgICAgICJCb3VuZGluZyI6IFsKICAgICAgICAgICAgICAiJChkZWZhdWx0X2NhcHMpIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiRWZmZWN0aXZlIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJJbmhlcml0YWJsZSI6IFtdLAogICAgICAgICAgICAiUGVybWl0dGVkIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICAiTm9OZXdQcml2aWxlZ2VzIjogdHJ1ZQogICAgICAgIH0sCiAgICAgICAgIlJvb3QiOiB7CiAgICAgICAgICAiUGF0aCI6ICIkKGNwYXRoKS8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgIlJlYWRvbmx5IjogdHJ1ZQogICAgICAgIH0sCiAgICAgICAgIk1vdW50cyI6IFsKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9wcm9jIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJwcm9jIiwKICAgICAgICAgICAgInR5cGVfIjogInByb2MiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2IiwKICAgICAgICAgICAgInNvdXJjZSI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJzdHJpY3RhdGltZSIsCiAgICAgICAgICAgICAgIm1vZGU9NzU1IiwKICAgICAgICAgICAgICAic2l6ZT02NTUzNmsiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L3B0cyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiZGV2cHRzIiwKICAgICAgICAgICAgInR5cGVfIjogImRldnB0cyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJuZXdpbnN0YW5jZSIsCiAgICAgICAgICAgICAgInB0bXhtb2RlPTA2NjYiLAogICAgICAgICAgICAgICJtb2RlPTA2MjAiLAogICAgICAgICAgICAgICJnaWQ9NSIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvc2htIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L3NobSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi9tcXVldWUiLAogICAgICAgICAgICAic291cmNlIjogIm1xdWV1ZSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJtcXVldWUiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvc3lzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJzeXNmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJzeXNmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2V0Yy9yZXNvbHYuY29uZiIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClyZXNvbHYuY29uZiQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJvIiwKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9kZXYiLAogICAgICAgICAgICAgICJub2V4ZWMiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0KICAgICAgICBdLAogICAgICAgICJBbm5vdGF0aW9ucyI6IHsKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmJ1bmRsZV9wYXRoIjogIi9ydW4vY29udGFpbmVyZC9pby5jb250YWluZXJkLnJ1bnRpbWUudjIudGFzay9rOHMuaW8vJChidW5kbGUtaWQpIiwKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIjogInBvZF9zYW5kYm94IiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSI6ICJzYW5kYm94IiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWlkIjogIl5bYS16MC05XXs2NH0kIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWxvZy1kaXJlY3RvcnkiOiAiXi92YXIvbG9nL3BvZHMvJChzYW5kYm94LW5hbWVzcGFjZSlfJChzYW5kYm94LW5hbWUpX1swLTlhLWZdezh9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezEyfSQiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZXNwYWNlIjogIiIsCiAgICAgICAgICAibmVyZGN0bC9uZXR3b3JrLW5hbWVzcGFjZSI6ICJeL3Zhci9ydW4vbmV0bnMvY25pLVswLTlhLWZdezh9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezEyfSQiCiAgICAgICAgfSwKICAgICAgICAiTGludXgiOiB7CiAgICAgICAgICAiTmFtZXNwYWNlcyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICJUeXBlIjogImlwYyIsCiAgICAgICAgICAgICAgIlBhdGgiOiAiIgogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgIlR5cGUiOiAidXRzIiwKICAgICAgICAgICAgICAiUGF0aCI6ICIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiVHlwZSI6ICJtb3VudCIsCiAgICAgICAgICAgICAgIlBhdGgiOiAiIgogICAgICAgICAgICB9CiAgICAgICAgICBdLAogICAgICAgICAgIk1hc2tlZFBhdGhzIjogWwogICAgICAgICAgICAiL3Byb2MvYWNwaSIsCiAgICAgICAgICAgICIvcHJvYy9hc291bmQiLAogICAgICAgICAgICAiL3Byb2Mva2NvcmUiLAogICAgICAgICAgICAiL3Byb2Mva2V5cyIsCiAgICAgICAgICAgICIvcHJvYy9sYXRlbmN5X3N0YXRzIiwKICAgICAgICAgICAgIi9wcm9jL3RpbWVyX2xpc3QiLAogICAgICAgICAgICAiL3Byb2MvdGltZXJfc3RhdHMiLAogICAgICAgICAgICAiL3Byb2Mvc2NoZWRfZGVidWciLAogICAgICAgICAgICAiL3N5cy9maXJtd2FyZSIsCiAgICAgICAgICAgICIvcHJvYy9zY3NpIgogICAgICAgICAgXSwKICAgICAgICAgICJSZWFkb25seVBhdGhzIjogWwogICAgICAgICAgICAiL3Byb2MvYnVzIiwKICAgICAgICAgICAgIi9wcm9jL2ZzIiwKICAgICAgICAgICAgIi9wcm9jL2lycSIsCiAgICAgICAgICAgICIvcHJvYy9zeXMiLAogICAgICAgICAgICAiL3Byb2Mvc3lzcnEtdHJpZ2dlciIKICAgICAgICAgIF0sCiAgICAgICAgICAiRGV2aWNlcyI6IFtdLAogICAgICAgICAgIlN5c2N0bCI6IHsKICAgICAgICAgICAgIm5ldC5pcHY0LmlwX3VucHJpdmlsZWdlZF9wb3J0X3N0YXJ0IjogIjAiLAogICAgICAgICAgICAibmV0LmlwdjQucGluZ19ncm91cF9yYW5nZSI6ICIwIDIxNDc0ODM2NDciCiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9LAogICAgICAic3RvcmFnZXMiOiBbCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJibGsiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogInRhciIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIiQoaGFzaDApIgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGxheWVyMCkiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJvdmVybGF5ZnMiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogImZ1c2UzLmthdGEtb3ZlcmxheSIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIjVhNWFhZDgwMDU1ZmYyMDAxMmE1MGRjMjVmOGRmN2EyOTkyNDQ3NDMyNGQ2NWY3ZDUzMDZlZThlZTI3ZmY3MWQiLAogICAgICAgICAgICAiODE3MjUwZjFhM2UzMzZkYTc2ZjViZDNmYTc4NGUxYjI2ZDk1OWI5YzEzMTg3NjgxNWJhMjYwNDA0OGI3MGMxOCIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChjcGF0aCkvJChidW5kbGUtaWQpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9CiAgICAgIF0sCiAgICAgICJkZXZpY2VzIjogW10sCiAgICAgICJzYW5kYm94X3BpZG5zIjogZmFsc2UsCiAgICAgICJleGVjX2NvbW1hbmRzIjogW10sCiAgICAgICJlbnZfbWFwIjogewogICAgICAgICJQQVRIIjogIi91c3IvbG9jYWwvc2JpbjovdXNyL2xvY2FsL2JpbjovdXNyL3NiaW46L3Vzci9iaW46L3NiaW46L2JpbiIKICAgICAgfQogICAgfSwKICAgIHsKICAgICAgIk9DSSI6IHsKICAgICAgICAiVmVyc2lvbiI6ICIxLjEuMC1yYy4xIiwKICAgICAgICAiUHJvY2VzcyI6IHsKICAgICAgICAgICJUZXJtaW5hbCI6IGZhbHNlLAogICAgICAgICAgIlVzZXIiOiB7CiAgICAgICAgICAgICJVSUQiOiAwLAogICAgICAgICAgICAiR0lEIjogMCwKICAgICAgICAgICAgIkFkZGl0aW9uYWxHaWRzIjogW10sCiAgICAgICAgICAgICJVc2VybmFtZSI6ICIiCiAgICAgICAgICB9LAogICAgICAgICAgIkRlcHJlY2F0ZWRBcmdzIjogWwogICAgICAgICAgICAibmdpbngiLAogICAgICAgICAgICAiLWciLAogICAgICAgICAgICAiZGFlbW9uIG9mZjsiCiAgICAgICAgICBdLAogICAgICAgICAgIkFyZ3MiOiBbCiAgICAgICAgICAgICJuZ2lueCIsCiAgICAgICAgICAgICItZyIsCiAgICAgICAgICAgICJkYWVtb24gb2ZmOyIKICAgICAgICAgIF0sCiAgICAgICAgICAiRW52IjogWwogICAgICAgICAgICAiUEFUSD0vdXNyL2xvY2FsL3NiaW46L3Vzci9sb2NhbC9iaW46L3Vzci9zYmluOi91c3IvYmluOi9zYmluOi9iaW4iLAogICAgICAgICAgICAiSE9TVE5BTUU9JChob3N0LW5hbWUpIgogICAgICAgICAgXSwKICAgICAgICAgICJDd2QiOiAiLyIsCiAgICAgICAgICAiQ2FwYWJpbGl0aWVzIjogewogICAgICAgICAgICAiQW1iaWVudCI6IFtdLAogICAgICAgICAgICAiQm91bmRpbmciOiBbCiAgICAgICAgICAgICAgIiQoZGVmYXVsdF9jYXBzKSIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgIkVmZmVjdGl2ZSI6IFsKICAgICAgICAgICAgICAiJChkZWZhdWx0X2NhcHMpIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiSW5oZXJpdGFibGUiOiBbXSwKICAgICAgICAgICAgIlBlcm1pdHRlZCI6IFsKICAgICAgICAgICAgICAiJChkZWZhdWx0X2NhcHMpIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgIk5vTmV3UHJpdmlsZWdlcyI6IGZhbHNlCiAgICAgICAgfSwKICAgICAgICAiUm9vdCI6IHsKICAgICAgICAgICJQYXRoIjogIiQoY3BhdGgpLyQoYnVuZGxlLWlkKSIsCiAgICAgICAgICAiUmVhZG9ubHkiOiBmYWxzZQogICAgICAgIH0sCiAgICAgICAgIk1vdW50cyI6IFsKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9wcm9jIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJwcm9jIiwKICAgICAgICAgICAgInR5cGVfIjogInByb2MiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2IiwKICAgICAgICAgICAgInNvdXJjZSI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJzdHJpY3RhdGltZSIsCiAgICAgICAgICAgICAgIm1vZGU9NzU1IiwKICAgICAgICAgICAgICAic2l6ZT02NTUzNmsiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L3B0cyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiZGV2cHRzIiwKICAgICAgICAgICAgInR5cGVfIjogImRldnB0cyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJuZXdpbnN0YW5jZSIsCiAgICAgICAgICAgICAgInB0bXhtb2RlPTA2NjYiLAogICAgICAgICAgICAgICJtb2RlPTA2MjAiLAogICAgICAgICAgICAgICJnaWQ9NSIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvc2htIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L3NobSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi9tcXVldWUiLAogICAgICAgICAgICAic291cmNlIjogIm1xdWV1ZSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJtcXVldWUiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvc3lzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJzeXNmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJzeXNmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL3N5cy9mcy9jZ3JvdXAiLAogICAgICAgICAgICAic291cmNlIjogImNncm91cCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJjZ3JvdXAiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiLAogICAgICAgICAgICAgICJyZWxhdGltZSIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2V0Yy9ob3N0cyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClob3N0cyQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicnciCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L3Rlcm1pbmF0aW9uLWxvZyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeCl0ZXJtaW5hdGlvbi1sb2ckIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJ3IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2V0Yy9ob3N0bmFtZSIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClob3N0bmFtZSQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicnciCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZXRjL3Jlc29sdi5jb25mIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KXJlc29sdi5jb25mJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJydyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi92YXIvcnVuL3NlY3JldHMva3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudCIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClzZXJ2aWNlYWNjb3VudCQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicm8iCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvdmFyL3J1bi9zZWNyZXRzL2F6dXJlL3Rva2VucyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeCl0b2tlbnMkIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9CiAgICAgICAgXSwKICAgICAgICAiQW5ub3RhdGlvbnMiOiB7CiAgICAgICAgICAiaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5idW5kbGVfcGF0aCI6ICIvcnVuL2NvbnRhaW5lcmQvaW8uY29udGFpbmVyZC5ydW50aW1lLnYyLnRhc2svazhzLmlvLyQoYnVuZGxlLWlkKSIsCiAgICAgICAgICAiaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5jb250YWluZXJfdHlwZSI6ICJwb2RfY29udGFpbmVyIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItbmFtZSI6ICJuby1leGlzdCIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLXR5cGUiOiAiY29udGFpbmVyIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5pbWFnZS1uYW1lIjogIm1hcmluZXJjb25mcG9kc3Rlc3QuYXp1cmVjci5pby9henVyZWxpbnV4L2Jhc2Uvbmdpbng6MS4yNSIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCI6ICJeW2EtejAtOV17NjR9JCIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1uYW1lc3BhY2UiOiAiIgogICAgICAgIH0sCiAgICAgICAgIkxpbnV4IjogewogICAgICAgICAgIk5hbWVzcGFjZXMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiVHlwZSI6ICJpcGMiLAogICAgICAgICAgICAgICJQYXRoIjogIiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJUeXBlIjogInV0cyIsCiAgICAgICAgICAgICAgIlBhdGgiOiAiIgogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgIlR5cGUiOiAibW91bnQiLAogICAgICAgICAgICAgICJQYXRoIjogIiIKICAgICAgICAgICAgfQogICAgICAgICAgXSwKICAgICAgICAgICJNYXNrZWRQYXRocyI6IFsKICAgICAgICAgICAgIi9wcm9jL2FjcGkiLAogICAgICAgICAgICAiL3Byb2Mva2NvcmUiLAogICAgICAgICAgICAiL3Byb2Mva2V5cyIsCiAgICAgICAgICAgICIvcHJvYy9sYXRlbmN5X3N0YXRzIiwKICAgICAgICAgICAgIi9wcm9jL3RpbWVyX2xpc3QiLAogICAgICAgICAgICAiL3Byb2MvdGltZXJfc3RhdHMiLAogICAgICAgICAgICAiL3Byb2Mvc2NoZWRfZGVidWciLAogICAgICAgICAgICAiL3Byb2Mvc2NzaSIsCiAgICAgICAgICAgICIvc3lzL2Zpcm13YXJlIgogICAgICAgICAgXSwKICAgICAgICAgICJSZWFkb25seVBhdGhzIjogWwogICAgICAgICAgICAiL3Byb2MvYXNvdW5kIiwKICAgICAgICAgICAgIi9wcm9jL2J1cyIsCiAgICAgICAgICAgICIvcHJvYy9mcyIsCiAgICAgICAgICAgICIvcHJvYy9pcnEiLAogICAgICAgICAgICAiL3Byb2Mvc3lzIiwKICAgICAgICAgICAgIi9wcm9jL3N5c3JxLXRyaWdnZXIiCiAgICAgICAgICBdLAogICAgICAgICAgIkRldmljZXMiOiBbXSwKICAgICAgICAgICJTeXNjdGwiOiB7CiAgICAgICAgICAgICJuZXQuaXB2NC5pcF91bnByaXZpbGVnZWRfcG9ydF9zdGFydCI6ICIwIiwKICAgICAgICAgICAgIm5ldC5pcHY0LnBpbmdfZ3JvdXBfcmFuZ2UiOiAiMCAyMTQ3NDgzNjQ3IgogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSwKICAgICAgInN0b3JhZ2VzIjogWwogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2gwKSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjApIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2gxKSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjEpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2gyKSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjIpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2gzKSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjMpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2g0KSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjQpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAib3ZlcmxheWZzIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJmdXNlMy5rYXRhLW92ZXJsYXkiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICI4YmZiYmE3Njk2NjM2NTI0MDRhNjRhMjNhN2VlYWI3OTQzOGRhZWQ3MWFjY2YzMjlhNDBhNGY2OGVmYWYwZmY0OjhjYzdhZmJjZGQwNGYxN2FmZjhmNmQ0OTM1ZTRmNTRhMWY1YWRkNDdkY2E1MTZlOGQzNTQ1M2YxZjQyMTgxNjc6OTAzMGU2MGFhOGQ4YWI5YzI3ZjA1MWUyYzc4NWE1NDlkOGFlYzE4ODgxNjk5ZWFiMzIwYTA0MDlmN2ZkYmUzOTozNmFmOWMwODE0NmU2ZDI1MWQ1MTNlNTllNWExYzYyZDYyY2ZiOWViZTg1NmQ3NTM5NGJlZmRkZWNlNzQ4NGMxOjAxNjVhMGMwNzg2NTc3NWRlYTgzYTQ1MTdjMTI1ZmYzMGMxZTJjMWEwOThlN2NiY2U3YmNhZmUyYjcxOTljYmMiLAogICAgICAgICAgICAiMjQ5ZWY1NWZjZDQxMWM1YTgwNTRhYmI2MGU3MTUxMTVkNTk5ZWJiZTY4MmQ2Yjc0YmUzYmQxOTI3MjQ4ODVjMTo1MDJiNTM3MjAxYzcxMTVlZjBkMTcxNTMwYzdjZjVjMGU1MTE3NTRlOWM5NWYwNTk0MWVjMjdkMTVjOWUwMTk4OjQ4YWExMThmZGZkYTlhMzAzODdlOTBlMDY2MWYyYjViNmM4ZTg3MzU0ZDFmYTlhMzdiZjU4NTEzYWMzZTQ1MTI6OWY2MjU0NjRjN2IzNGE1NTM2ZjQzMWY1ZDI5NDYzNDNkMjcyNTgwZTM2NDQ2ZGRiMTJiMDQwMTYyZTU0M2NlMTpkNDQ5MWVhMTg4NzEwNWVmMDYwMWY0ZTVmYTM5ODNmZmU1N2Q3YTU3ZWU4ZjZiMDM3MDkxZjQyMThjMWE2MzU4IgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGNwYXRoKS8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0KICAgICAgXSwKICAgICAgImRldmljZXMiOiBbXSwKICAgICAgInNhbmRib3hfcGlkbnMiOiBmYWxzZSwKICAgICAgImV4ZWNfY29tbWFuZHMiOiBbXSwKICAgICAgImVudl9tYXAiOiB7CiAgICAgICAgIkhPU1ROQU1FIjogIiQoaG9zdC1uYW1lKSIsCiAgICAgICAgIlBBVEgiOiAiL3Vzci9sb2NhbC9zYmluOi91c3IvbG9jYWwvYmluOi91c3Ivc2JpbjovdXNyL2Jpbjovc2JpbjovYmluIgogICAgICB9CiAgICB9CiAgXSwKICAiY29tbW9uIjogewogICAgImNwYXRoIjogIi9ydW4va2F0YS1jb250YWluZXJzL3NoYXJlZC9jb250YWluZXJzIiwKICAgICJtb3VudF9zb3VyY2VfY3BhdGgiOiAiL3J1bi9rYXRhLWNvbnRhaW5lcnMvc2hhcmVkL2NvbnRhaW5lcnMiLAogICAgInNmcHJlZml4IjogIl4kKGNwYXRoKS8kKGJ1bmRsZS1pZCktW2EtejAtOV17MTZ9LSIsCiAgICAic3BhdGgiOiAiL3J1bi9rYXRhLWNvbnRhaW5lcnMvc2FuZGJveC9zdG9yYWdlIiwKICAgICJpcHY0X2EiOiAiKChbMC05XXxbMS05XVswLTldfDFbMC05XXsyfXwyWzAtNF1bMC05XXwyNVswLTVdKVxcLil7M30oWzAtOV18WzEtOV1bMC05XXwxWzAtOV17Mn18MlswLTRdWzAtOV18MjVbMC01XSkiLAogICAgImlwX3AiOiAiWzAtOV17MSw1fSIsCiAgICAic3ZjX25hbWUiOiAiW0EtWl9cXC5cXC1dKyIsCiAgICAiZG5zX2xhYmVsIjogIlthLXpBLVowLTlfXFwuXFwtXSsiLAogICAgInNfc291cmNlMSI6ICJeLi4yWzAtOV17M31fWzAtMV1bMC05XV9bMC0zXVswLTldX1swLTJdWzAtOV1fWzAtNV1bMC05XV9bMC01XVswLTldXFwuWzAtOV17MSwxMH0kIiwKICAgICJzX3NvdXJjZTIiOiAiXi4uZGF0YS8iLAogICAgImRuc19zdWJkb21haW4iOiAiXlthLXowLTldKFstYS16MC05XSpbYS16MC05XSk/JCIsCiAgICAicG9kX3VpZCI6ICJeWzAtOWEtZkEtRl17OH0tWzAtOWEtZkEtRl17NH0tWzAtOWEtZkEtRl17NH0tWzAtOWEtZkEtRl17NH0tWzAtOWEtZkEtRl17MTJ9JCIsCiAgICAiZGVmYXVsdF9jYXBzIjogWwogICAgICAiQ0FQX0NIT1dOIiwKICAgICAgIkNBUF9EQUNfT1ZFUlJJREUiLAogICAgICAiQ0FQX0ZTRVRJRCIsCiAgICAgICJDQVBfRk9XTkVSIiwKICAgICAgIkNBUF9NS05PRCIsCiAgICAgICJDQVBfTkVUX1JBVyIsCiAgICAgICJDQVBfU0VUR0lEIiwKICAgICAgIkNBUF9TRVRVSUQiLAogICAgICAiQ0FQX1NFVEZDQVAiLAogICAgICAiQ0FQX1NFVFBDQVAiLAogICAgICAiQ0FQX05FVF9CSU5EX1NFUlZJQ0UiLAogICAgICAiQ0FQX1NZU19DSFJPT1QiLAogICAgICAiQ0FQX0tJTEwiLAogICAgICAiQ0FQX0FVRElUX1dSSVRFIgogICAgXSwKICAgICJwcml2aWxlZ2VkX2NhcHMiOiBbCiAgICAgICJDQVBfQ0hPV04iLAogICAgICAiQ0FQX0RBQ19PVkVSUklERSIsCiAgICAgICJDQVBfREFDX1JFQURfU0VBUkNIIiwKICAgICAgIkNBUF9GT1dORVIiLAogICAgICAiQ0FQX0ZTRVRJRCIsCiAgICAgICJDQVBfS0lMTCIsCiAgICAgICJDQVBfU0VUR0lEIiwKICAgICAgIkNBUF9TRVRVSUQiLAogICAgICAiQ0FQX1NFVFBDQVAiLAogICAgICAiQ0FQX0xJTlVYX0lNTVVUQUJMRSIsCiAgICAgICJDQVBfTkVUX0JJTkRfU0VSVklDRSIsCiAgICAgICJDQVBfTkVUX0JST0FEQ0FTVCIsCiAgICAgICJDQVBfTkVUX0FETUlOIiwKICAgICAgIkNBUF9ORVRfUkFXIiwKICAgICAgIkNBUF9JUENfTE9DSyIsCiAgICAgICJDQVBfSVBDX09XTkVSIiwKICAgICAgIkNBUF9TWVNfTU9EVUxFIiwKICAgICAgIkNBUF9TWVNfUkFXSU8iLAogICAgICAiQ0FQX1NZU19DSFJPT1QiLAogICAgICAiQ0FQX1NZU19QVFJBQ0UiLAogICAgICAiQ0FQX1NZU19QQUNDVCIsCiAgICAgICJDQVBfU1lTX0FETUlOIiwKICAgICAgIkNBUF9TWVNfQk9PVCIsCiAgICAgICJDQVBfU1lTX05JQ0UiLAogICAgICAiQ0FQX1NZU19SRVNPVVJDRSIsCiAgICAgICJDQVBfU1lTX1RJTUUiLAogICAgICAiQ0FQX1NZU19UVFlfQ09ORklHIiwKICAgICAgIkNBUF9NS05PRCIsCiAgICAgICJDQVBfTEVBU0UiLAogICAgICAiQ0FQX0FVRElUX1dSSVRFIiwKICAgICAgIkNBUF9BVURJVF9DT05UUk9MIiwKICAgICAgIkNBUF9TRVRGQ0FQIiwKICAgICAgIkNBUF9NQUNfT1ZFUlJJREUiLAogICAgICAiQ0FQX01BQ19BRE1JTiIsCiAgICAgICJDQVBfU1lTTE9HIiwKICAgICAgIkNBUF9XQUtFX0FMQVJNIiwKICAgICAgIkNBUF9CTE9DS19TVVNQRU5EIiwKICAgICAgIkNBUF9BVURJVF9SRUFEIiwKICAgICAgIkNBUF9QRVJGTU9OIiwKICAgICAgIkNBUF9CUEYiLAogICAgICAiQ0FQX0NIRUNLUE9JTlRfUkVTVE9SRSIKICAgIF0sCiAgICAidmlydGlvX2Jsa19zdG9yYWdlX2NsYXNzZXMiOiBbCiAgICAgICJjYy1sb2NhbC1jc2kiLAogICAgICAiY2MtbWFuYWdlZC1jc2kiLAogICAgICAiY2MtbWFuYWdlZC1wcmVtaXVtLWNzaSIKICAgIF0sCiAgICAic21iX3N0b3JhZ2VfY2xhc3NlcyI6IFsKICAgICAgewogICAgICAgICJuYW1lIjogImF6dXJlZmlsZS1jc2kta2F0YS1jYyIsCiAgICAgICAgIm1vdW50X29wdGlvbnMiOiBbCiAgICAgICAgICAiZGlyX21vZGU9MDc3NyIsCiAgICAgICAgICAiZmlsZV9tb2RlPTA3NzciLAogICAgICAgICAgIm1mc3ltbGlua3MiLAogICAgICAgICAgImNhY2hlPXN0cmljdCIsCiAgICAgICAgICAibm9zaGFyZXNvY2siLAogICAgICAgICAgImFjdGltZW89MzAiLAogICAgICAgICAgIm5vYnJsIgogICAgICAgIF0KICAgICAgfQogICAgXQogIH0sCiAgInNhbmRib3giOiB7CiAgICAic3RvcmFnZXMiOiBbCiAgICAgIHsKICAgICAgICAiZHJpdmVyIjogImVwaGVtZXJhbCIsCiAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgInNvdXJjZSI6ICJzaG0iLAogICAgICAgICJmc3R5cGUiOiAidG1wZnMiLAogICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICJub2RldiIsCiAgICAgICAgICAibW9kZT0xNzc3IiwKICAgICAgICAgICJzaXplPTY3MTA4ODY0IgogICAgICAgIF0sCiAgICAgICAgIm1vdW50X3BvaW50IjogIi9ydW4va2F0YS1jb250YWluZXJzL3NhbmRib3gvc2htIiwKICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgIH0KICAgIF0KICB9LAogICJyZXF1ZXN0X2RlZmF1bHRzIjogewogICAgIkNyZWF0ZUNvbnRhaW5lclJlcXVlc3QiOiB7CiAgICAgICJhbGxvd19lbnZfcmVnZXgiOiBbCiAgICAgICAgIl5IT1NUTkFNRT0kKGRuc19sYWJlbCkkIiwKICAgICAgICAiXiQoc3ZjX25hbWUpX1BPUlRfJChpcF9wKV9UQ1A9dGNwOi8vJChpcHY0X2EpOiQoaXBfcCkkIiwKICAgICAgICAiXiQoc3ZjX25hbWUpX1BPUlRfJChpcF9wKV9UQ1BfUFJPVE89dGNwJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9QT1JUXyQoaXBfcClfVENQX1BPUlQ9JChpcF9wKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfUE9SVF8kKGlwX3ApX1RDUF9BRERSPSQoaXB2NF9hKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfU0VSVklDRV9IT1NUPSQoaXB2NF9hKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfU0VSVklDRV9QT1JUPSQoaXBfcCkkIiwKICAgICAgICAiXiQoc3ZjX25hbWUpX1NFUlZJQ0VfUE9SVF8kKGRuc19sYWJlbCk9JChpcF9wKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfUE9SVD10Y3A6Ly8kKGlwdjRfYSk6JChpcF9wKSQiLAogICAgICAgICJeQVpVUkVfQ0xJRU5UX0lEPVtBLUZhLWYwLTktXSokIiwKICAgICAgICAiXkFaVVJFX1RFTkFOVF9JRD1bQS1GYS1mMC05LV0qJCIsCiAgICAgICAgIl5BWlVSRV9GRURFUkFURURfVE9LRU5fRklMRT0vdmFyL3J1bi9zZWNyZXRzL2F6dXJlL3Rva2Vucy9henVyZS1pZGVudGl0eS10b2tlbiQiLAogICAgICAgICJeQVpVUkVfQVVUSE9SSVRZX0hPU1Q9aHR0cHM6Ly9sb2dpblxcLm1pY3Jvc29mdG9ubGluZVxcLmNvbS8kIiwKICAgICAgICAiXlRFUk09eHRlcm0kIgogICAgICBdLAogICAgICAiYWxsb3dfZW52X3JlZ2V4X21hcCI6IHsKICAgICAgICAiQ1BVX0xJTUlUIjogIl5bMC05XSskIiwKICAgICAgICAiSk9CX0NPTVBMRVRJT05fSU5ERVgiOiAiXlswLTldKiQiLAogICAgICAgICJNRU1PUllfTElNSVQiOiAiXlswLTldKyQiCiAgICAgIH0KICAgIH0sCiAgICAiQ29weUZpbGVSZXF1ZXN0IjogWwogICAgICAiJChzZnByZWZpeCkiCiAgICBdLAogICAgIkV4ZWNQcm9jZXNzUmVxdWVzdCI6IHsKICAgICAgImFsbG93ZWRfY29tbWFuZHMiOiBbXSwKICAgICAgInJlZ2V4IjogW10KICAgIH0sCiAgICAiVXBkYXRlUm91dGVzUmVxdWVzdCI6IHsKICAgICAgImZvcmJpZGRlbl9kZXZpY2VfbmFtZXMiOiBbCiAgICAgICAgImxvIgogICAgICBdLAogICAgICAiZm9yYmlkZGVuX3NvdXJjZV9yZWdleCI6IFsKICAgICAgICAiXig/OjB7MCw0fTopezAsN30wezAsM30xJCIsCiAgICAgICAgIl4xMjdcXC4oPzpbMC05XXsxLDN9XFwuKXsyfVswLTldezEsM30kIgogICAgICBdCiAgICB9LAogICAgIlVwZGF0ZUludGVyZmFjZVJlcXVlc3QiOiB7CiAgICAgICJhbGxvd19yYXdfZmxhZ3MiOiAxMjgsCiAgICAgICJmb3JiaWRkZW5fbmFtZXMiOiBbCiAgICAgICAgImxvIgogICAgICBdLAogICAgICAiZm9yYmlkZGVuX2h3X2FkZHJzIjogWwogICAgICAgICIwMDowMDowMDowMDowMDowMCIKICAgICAgXQogICAgfSwKICAgICJDbG9zZVN0ZGluUmVxdWVzdCI6IGZhbHNlLAogICAgIlJlYWRTdHJlYW1SZXF1ZXN0IjogZmFsc2UsCiAgICAiVXBkYXRlRXBoZW1lcmFsTW91bnRzUmVxdWVzdCI6IGZhbHNlLAogICAgIldyaXRlU3RyZWFtUmVxdWVzdCI6IGZhbHNlCiAgfQp9 + spec: + runtimeClassName: kata-cc + containers: + - name: no-exist + image: "marinerconfpodstest.azurecr.io/azurelinux/base/nginx:1.25" + ports: + - containerPort: 80 + startupProbe: + tcpSocket: + port: 80 + failureThreshold: 5 + periodSeconds: 5 + timeoutSeconds: 5 + initialDelaySeconds: 5 diff --git a/src/agent/samples/policy/yaml/kubernetes/fixtures/replication.yaml b/src/agent/samples/policy/yaml/kubernetes/fixtures/replication.yaml new file mode 100644 index 000000000000..8b2a31863d6e --- /dev/null +++ b/src/agent/samples/policy/yaml/kubernetes/fixtures/replication.yaml @@ -0,0 +1,23 @@ +--- +apiVersion: v1 +kind: ReplicationController +metadata: + name: nginx +spec: + replicas: 3 + selector: + app: nginx + template: + metadata: + name: nginx + labels: + app: nginx + annotations: + io.katacontainers.config.agent.policy: IyBDb3B5cmlnaHQgKGMpIDIwMjMgTWljcm9zb2Z0IENvcnBvcmF0aW9uCiMKIyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMAojCnBhY2thZ2UgYWdlbnRfcG9saWN5CgppbXBvcnQgZnV0dXJlLmtleXdvcmRzLmluCmltcG9ydCBmdXR1cmUua2V5d29yZHMuZXZlcnkKCiMgRGVmYXVsdCB2YWx1ZXMsIHJldHVybmVkIGJ5IE9QQSB3aGVuIHJ1bGVzIGNhbm5vdCBiZSBldmFsdWF0ZWQgdG8gdHJ1ZS4KZGVmYXVsdCBBZGRBUlBOZWlnaGJvcnNSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgQWRkU3dhcFJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBDbG9zZVN0ZGluUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IENvcHlGaWxlUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IENyZWF0ZUNvbnRhaW5lclJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBDcmVhdGVTYW5kYm94UmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IERlc3Ryb3lTYW5kYm94UmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgRXhlY1Byb2Nlc3NSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgR2V0T09NRXZlbnRSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBHdWVzdERldGFpbHNSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBMaXN0SW50ZXJmYWNlc1JlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBMaXN0Um91dGVzUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IE1lbUhvdHBsdWdCeVByb2JlUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IE9ubGluZUNQVU1lbVJlcXVlc3QgOj0gdHJ1ZQpkZWZhdWx0IFBhdXNlQ29udGFpbmVyUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFJlYWRTdHJlYW1SZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgUmVtb3ZlQ29udGFpbmVyUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgUmVtb3ZlU3RhbGVWaXJ0aW9mc1NoYXJlTW91bnRzUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgUmVzZWVkUmFuZG9tRGV2UmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFJlc3VtZUNvbnRhaW5lclJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBTZXRHdWVzdERhdGVUaW1lUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFNldFBvbGljeVJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBTaWduYWxQcm9jZXNzUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgU3RhcnRDb250YWluZXJSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBTdGFydFRyYWNpbmdSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgU3RhdHNDb250YWluZXJSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBTdG9wVHJhY2luZ1JlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBUdHlXaW5SZXNpemVSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBVcGRhdGVDb250YWluZXJSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgVXBkYXRlRXBoZW1lcmFsTW91bnRzUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFVwZGF0ZUludGVyZmFjZVJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBVcGRhdGVSb3V0ZXNSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgV2FpdFByb2Nlc3NSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBXcml0ZVN0cmVhbVJlcXVlc3QgOj0gZmFsc2UKCiMgQWxsb3dSZXF1ZXN0c0ZhaWxpbmdQb2xpY3kgOj0gdHJ1ZSBjb25maWd1cmVzIHRoZSBBZ2VudCB0byAqYWxsb3cgYW55CiMgcmVxdWVzdHMgY2F1c2luZyBhIHBvbGljeSBmYWlsdXJlKi4gVGhpcyBpcyBhbiB1bnNlY3VyZSBjb25maWd1cmF0aW9uCiMgYnV0IGlzIHVzZWZ1bCBmb3IgYWxsb3dpbmcgdW5zZWN1cmUgcG9kcyB0byBzdGFydCwgdGhlbiBjb25uZWN0IHRvCiMgdGhlbSBhbmQgaW5zcGVjdCBPUEEgbG9ncyBmb3IgdGhlIHJvb3QgY2F1c2Ugb2YgYSBmYWlsdXJlLgpkZWZhdWx0IEFsbG93UmVxdWVzdHNGYWlsaW5nUG9saWN5IDo9IGZhbHNlCgojIENvbnN0YW50cwpTX05BTUVfS0VZID0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZSIKU19OQU1FU1BBQ0VfS0VZID0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZXNwYWNlIgpCVU5ETEVfSUQgPSAiW2EtejAtOV17NjR9IgoKQ3JlYXRlQ29udGFpbmVyUmVxdWVzdDo9IHJlc3AgewogICAgbm90IGlzX251bGwoaW5wdXQuZW52X21hcCkKICAgIAogICAgaV9lbnZfbWFwIDo9IGlucHV0LmVudl9tYXAKICAgIAogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBwX2Vudl9tYXAgOj0gcF9jb250YWluZXIuZW52X21hcCAgCiAgICBhbGxvd19lbnZfbWFwKHBfZW52X21hcCwgaV9lbnZfbWFwKQogICAgCiAgICBpX3Byb2Nlc3MgOj0gaW5wdXQuYmFzZS5PQ0kuUHJvY2VzcwogICAgCiAgICBwX3Byb2Nlc3MgOj0gcF9jb250YWluZXIuT0NJLlByb2Nlc3MKICAgIAogICAgYWxsb3dfYXJncyhpX3Byb2Nlc3MsIHBfcHJvY2VzcywgaV9lbnZfbWFwKQoKICAgIHJlc3AgPSBDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uKGlucHV0LmJhc2UpCiAgICBwcmludCgiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdDogdHJ1ZSIpCn0KCmFsbG93X2FyZ3MoaV9wcm9jZXNzLCBwX3Byb2Nlc3MsIGlfZW52X21hcCkgewogICAgaV9hcmdzIDo9IGlfcHJvY2Vzcy5BcmdzCiAgICBwX2FyZ3MgOj0gcF9wcm9jZXNzLkFyZ3MKICAgIHByaW50KCJhbGxvd19hcmdzOiBpX2FyZ3MgPSIsIGlfYXJncywgInBfYXJncyA9IiwgcF9hcmdzKQogICAgY291bnQoaV9hcmdzKSA9PSBjb3VudChwX2FyZ3MpCiAgICBldmVyeSBpLCBpX2FyZyBpbiBpX2FyZ3MgewogICAgICAgIHByaW50KCJhbGxvd19hcmdzOiBpX2FyZyA9IiwgaV9hcmcpCiAgICAgICAgcF9hcmdfcmVwbGFjZWQgOj0gcmVwbGFjZV9lbnZfdmFyaWFibGVzKHBfYXJnc1tpXSwgaV9lbnZfbWFwKQogICAgICAgIHByaW50KCJhbGxvd19hcmdzOiBwX2FyZ19yZXBsYWNlZCA9IiwgcF9hcmdfcmVwbGFjZWQpCiAgICAgICAgcF9hcmdfcmVwbGFjZWQyIDo9IHJlcGxhY2UocF9hcmdfcmVwbGFjZWQsICIkJCIsICIkIikKICAgICAgICBwcmludCgiYWxsb3dfYXJnczogcF9hcmdfcmVwbGFjZWQyID0iLCBwX2FyZ19yZXBsYWNlZDIpCiAgICAgICAgaV9hcmcgPT0gcF9hcmdfcmVwbGFjZWQyCiAgICB9CiAgICBwcmludCgiYWxsb3dfYXJnczogdHJ1ZSIpCn0KCmFsbG93X2FyZ3MoaV9wcm9jZXNzLCBwX3Byb2Nlc3MsIGlfZW52X21hcCkgewogICAgbm90IGlfcHJvY2Vzcy5BcmdzCiAgICBub3QgcF9wcm9jZXNzLkFyZ3MKICAgIHByaW50KCJhbGxvd19hcmdzMjogbm8gYXJncyIpCn0KCiMgdGhpcyBmdW5jdGlvbiByZXBsYWNlcyBhbGwgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyBpbiBhIHN0cmluZywgZ2l2ZW4gYSBtYXAgb2YgZW52aXJvbm1lbnQga2V5cyB0byBlbnZpcm9ubWVudCB2YWx1ZXMKIyBlZyBzdHIgPSAiZWNobyAkKENMVVNURVJfSUQpOyBlY2hvICQoTk9ERV9OQU1FKTsiCiMgZW52X21hcCA9IHsiQ0xVU1RFUl9JRCI6ICJhYmMiLCAiTk9ERV9OQU1FIiA6ICJ4eXoifQojIHJlc3VsdCA9ICJlY2hvIGFiYzsgZWNobyB4eXo7IgpyZXBsYWNlX2Vudl92YXJpYWJsZXMoc3RyLCBlbnZfbWFwKSA9IHJlc3VsdCB7CiAgICAjIG1ha2UgYW4gYXJyYXkgb2YgdGhlIGtleXMgZWcgWyJDTFVTVEVSX0lEIiwgIk5PREVfTkFNRSJdCiAgICBrZXlzIDo9IFt4IHwgc29tZSB4IGluIG9iamVjdC5rZXlzKGVudl9tYXApXQogICAgcmVzdWx0IDo9IHJlcGxhY2Vfc3RyX3JlYyhzdHIsIGVudl9tYXAsIGtleXMsIGNvdW50KGtleXMpIC0gMSkKfQoKIyBiYXNlIGNhc2UKcmVwbGFjZV9zdHJfcmVjKHN0ciwgZW52X21hcCwgYXJyX2tleXMsIGkpID0gcmVzdWx0IHsKICAgIGkgPCAwCiAgICByZXN1bHQgOj0gc3RyCn0KCiMgcmVjdXJzaXZlIHN0ZXAKcmVwbGFjZV9zdHJfcmVjKHN0ciwgZW52X21hcCwgYXJyX2tleXMsIGkpID0gcmVzdWx0IHsKICAgIGkgPj0gMAogICAga2V5IDo9IGFycl9rZXlzW2ldCiAgICBlbnZfa2V5MSA6PSBjb25jYXQoIiIsIFsiJCgiLCBrZXksICIpIl0pCiAgICAjIHJlcGxhY2UgJChWQVIpIHdpdGggdmFsdWUKICAgIG5ld19zdHIxIDo9IHJlcGxhY2Uoc3RyLCBlbnZfa2V5MSwgZW52X21hcFtrZXldKQogICAgIyByZXBsYWNlIG5leHQgZW52aXJvbm1lbnQgdmFyaWFibGUKICAgIHJlc3VsdCA9IHJlcGxhY2Vfc3RyX3JlYyhuZXdfc3RyMSwgZW52X21hcCwgYXJyX2tleXMsIGkgLSAxKQp9CgphbGxvd19lbnZfbWFwKHBfZW52X21hcCwgaV9lbnZfbWFwKSB7CiAgICBwcmludCgiYWxsb3dfZW52X21hcDogcF9lbnZfbWFwID0iLCBwX2Vudl9tYXApCiAgICBldmVyeSBlbnZfa2V5LCBlbnZfdmFsIGluIGlfZW52X21hcCB7CiAgICAgICAgcHJpbnQoImFsbG93X2VudjogZW52X2tleSA9IiwgZW52X2tleSwgImVudl92YWwgPSIsIGVudl92YWwpCiAgICAgICAgYWxsb3dfZW52X21hcF9lbnRyeShlbnZfa2V5LCBlbnZfdmFsLCBwX2Vudl9tYXApCiAgICB9CiAgICBwcmludCgiYWxsb3dfZW52X21hcDogdHJ1ZSIpCn0KCiMgQWxsb3cgZXhhY3QgbWF0Y2gKYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBpX3ZhbCA9PSBwX3ZhbAogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnk6IHRydWUiKQp9CgojIEFsbG93IHJlc291cmNlRmllbGRSZWYgdmFsdWVzIChlLmcuLCAibGltaXRzLmNwdSIpLgphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgICMgYSB2YXJpYWJsZSB3ZSBzaG91bGQgYmUgdmFsaWRhdGluZyB1c2luZyBhIHJlZ2V4IGZyb20gc2V0dGluZ3MKICAgIHBfdmFsID09ICIkKHZhbGlkYXRlLWZyb20tc2V0dGluZ3MpIgogICAgcmVnZXhfdmFsIDo9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuQ3JlYXRlQ29udGFpbmVyUmVxdWVzdC5hbGxvd19lbnZfcmVnZXhfbWFwW2tleV0KICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4X3ZhbCwgaV92YWwpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSAyOiB0cnVlIikKfQoKIyBBbGxvdyBub2RlLW5hbWUKYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChub2RlLW5hbWUpIgogICAgcmVnZXgubWF0Y2gocG9saWN5X2RhdGEuY29tbW9uLmRuc19zdWJkb21haW4gLCBpX3ZhbCkKICAgIHByaW50KCJhbGxvd19lbnZfbWFwX2VudHJ5IDM6IHRydWUiKQp9CgojIEFsbG93IGhvc3QtbmFtZQphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgIHBfdmFsID09ICIkKGhvc3QtbmFtZSkiCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24uZG5zX2xhYmVsICwgaV92YWwpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSA0OiB0cnVlIikKfQoKIyBBbGxvdyBwb2QtdWlkCmFsbG93X2Vudl9tYXBfZW50cnkoa2V5LCBpX3ZhbCwgcF9lbnZfbWFwKSB7CiAgICBwX3ZhbCA6PSBwX2Vudl9tYXBba2V5XQogICAgcF92YWwgPT0gIiQocG9kLXVpZCkiCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24ucG9kX3VpZCAsIGlfdmFsKQogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgNTogdHJ1ZSIpCn0KCiMgQWxsb3cgZmllbGRSZWYgImZpZWxkUGF0aDogc3RhdHVzLnBvZElQIiB2YWx1ZXMuCmFsbG93X2Vudl9tYXBfZW50cnkoa2V5LCBpX3ZhbCwgcF9lbnZfbWFwKSB7CiAgICBpc19pcChpX3ZhbCkKCiAgICBwX3ZhbCA6PSBwX2Vudl9tYXBba2V5XQogICAgcF92YXIgOj0gY29uY2F0KCI9IiwgW2tleSwgcF92YWxdKQogICAgYWxsb3dfcG9kX2lwX3ZhcihrZXksIHBfdmFyKQogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgNjogdHJ1ZSIpCn0KCiMgQWxsb3cgZmllbGRSZWYgImZpZWxkUGF0aDogc3RhdHVzLmhvc3RJUCIgdmFsdWVzLgphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgaXNfaXAoaV92YWwpCgogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgIHBfdmFyIDo9IGNvbmNhdCgiPSIsIFtrZXksIHBfdmFsXSkKICAgIGFsbG93X2hvc3RfaXBfdmFyKGtleSwgcF92YXIpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSA3OiB0cnVlIikKfQoKIyBNYXRjaCBpbnB1dCB3aXRoIG9uZSBvZiB0aGUgcG9saWN5IHZhcmlhYmxlcywgYWZ0ZXIgc3Vic3RpdHV0aW5nICQoc2FuZGJveC1uYW1lKS4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChzYW5kYm94LW5hbWUpIgogICAgc19uYW1lIDo9IGlucHV0LmJhc2UuT0NJLkFubm90YXRpb25zW1NfTkFNRV9LRVldCiAgICBwX3ZhcjIgOj0gcmVwbGFjZShwX3ZhbCwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHBfdmFyMiA9PSBpX3ZhbAogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgODogdHJ1ZSIpCn0KCiMgTWF0Y2ggaW5wdXQgd2l0aCBvbmUgb2YgdGhlIHBvbGljeSB2YXJpYWJsZXMsIGFmdGVyIHN1YnN0aXR1dGluZyAkKHNhbmRib3gtbmFtZXNwYWNlKS4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChzYW5kYm94LW5hbWVzcGFjZSkiCiAgICBzX25hbWVzcGFjZSA6PSBpbnB1dC5iYXNlLk9DSS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwX3ZhcjIgOj0gcmVwbGFjZShwX3ZhbCwgIiQoc2FuZGJveC1uYW1lc3BhY2UpIiwgc19uYW1lc3BhY2UpCiAgICBwX3ZhcjIgPT0gaV92YWwKICAgIHByaW50KCJhbGxvd19lbnZfbWFwX2VudHJ5IDk6IHRydWUiKQp9CgojIEFsbG93IGlucHV0IGVudiB2YXJpYWJsZXMgdGhhdCBtYXRjaCB3aXRoIGEgcmVxdWVzdF9kZWZhdWx0cyByZWdleC4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHNvbWUgcF9yZWdleDEgaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5DcmVhdGVDb250YWluZXJSZXF1ZXN0LmFsbG93X2Vudl9yZWdleAogICAgcF9yZWdleDIgOj0gcmVwbGFjZShwX3JlZ2V4MSwgIiQoaXB2NF9hKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcHY0X2EpCiAgICBwX3JlZ2V4MyA6PSByZXBsYWNlKHBfcmVnZXgyLCAiJChpcF9wKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcF9wKQogICAgcF9yZWdleDQgOj0gcmVwbGFjZShwX3JlZ2V4MywgIiQoc3ZjX25hbWUpIiwgcG9saWN5X2RhdGEuY29tbW9uLnN2Y19uYW1lKQogICAgcF9yZWdleDUgOj0gcmVwbGFjZShwX3JlZ2V4NCwgIiQoZG5zX2xhYmVsKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5kbnNfbGFiZWwpCgogICAgcmVzdWx0IDo9IGNvbmNhdCgiPSIsIFtrZXksIGlfdmFsXSkKICAgIHJlZ2V4Lm1hdGNoKHBfcmVnZXg1LCByZXN1bHQpCgogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgMTA6IHRydWUiKQp9CgpDcmVhdGVDb250YWluZXJSZXF1ZXN0Oj0gcmVzcCB7CiAgICBub3QgaW5wdXQuZW52X21hcAogICAgaV9wcm9jZXNzID0gaW5wdXQuT0NJLlByb2Nlc3MKICAgIHNfbmFtZSA9IGlucHV0Lk9DSS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBwX3Byb2Nlc3MgPSBwX2NvbnRhaW5lci5PQ0kuUHJvY2VzcwogICAgYWxsb3dfZGVwcmVjYXRlZF9hcmdzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUpCiAgICByZXNwID0gQ3JlYXRlQ29udGFpbmVyUmVxdWVzdENvbW1vbihpbnB1dCkKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0MjogdHJ1ZSIpCn0KCkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb24ocmVxKTo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgICMgQ2hlY2sgaWYgdGhlIGlucHV0IHJlcXVlc3Qgc2hvdWxkIGJlIHJlamVjdGVkIGV2ZW4gYmVmb3JlIGNoZWNraW5nIHRoZQogICAgIyBwb2xpY3lfZGF0YS5jb250YWluZXJzIGluZm9ybWF0aW9uLgogICAgYWxsb3dfY3JlYXRlX2NvbnRhaW5lcl9pbnB1dChyZXEpCgogICAgaV9vY2kgOj0gcmVxLk9DSQogICAgaV9zdG9yYWdlcyA6PSByZXEuc3RvcmFnZXMKICAgIGlfZGV2aWNlcyA6PSByZXEuZGV2aWNlcwoKICAgICMgYXJyYXkgb2YgcG9zc2libGUgc3RhdGUgb3BlcmF0aW9ucwogICAgb3BzX2J1aWxkZXIgOj0gW10KCiAgICAjIGNoZWNrIHNhbmRib3ggbmFtZQogICAgc2FuZGJveF9uYW1lID0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FX0tFWV0KICAgIGFkZF9zYW5kYm94X25hbWVfdG9fc3RhdGUgOj0gc3RhdGVfYWxsb3dzKCJzYW5kYm94X25hbWUiLCBzYW5kYm94X25hbWUpCiAgICBvcHNfYnVpbGRlcjEgOj0gY29uY2F0X29wX2lmX25vdF9udWxsKG9wc19idWlsZGVyLCBhZGRfc2FuZGJveF9uYW1lX3RvX3N0YXRlKQoKICAgICMgQ2hlY2sgaWYgYW55IGVsZW1lbnQgZnJvbSB0aGUgcG9saWN5X2RhdGEuY29udGFpbmVycyBhcnJheSBhbGxvd3MgdGhlIGlucHV0IHJlcXVlc3QuCiAgICBzb21lIHBfY29udGFpbmVyIGluIHBvbGljeV9kYXRhLmNvbnRhaW5lcnMKICAgIHByaW50KCI9PT09PT09PSBDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiB0cnlpbmcgbmV4dCBwb2xpY3kgY29udGFpbmVyIikKCiAgICBwX3BpZG5zIDo9IHBfY29udGFpbmVyLnNhbmRib3hfcGlkbnMKICAgIGlfcGlkbnMgOj0gcmVxLnNhbmRib3hfcGlkbnMKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiBwX3BpZG5zID0iLCBwX3BpZG5zLCAiaV9waWRucyA9IiwgaV9waWRucykKICAgIHBfcGlkbnMgPT0gaV9waWRucwoKICAgIHBfb2NpIDo9IHBfY29udGFpbmVyLk9DSQoKICAgICMgY2hlY2sgbmFtZXNwYWNlCiAgICBwX25hbWVzcGFjZSA6PSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBpX25hbWVzcGFjZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwcmludCAoIkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb246IHBfbmFtZXNwYWNlID0iLCBwX25hbWVzcGFjZSwgImlfbmFtZXNwYWNlID0iLCBpX25hbWVzcGFjZSkKICAgIGFkZF9uYW1lc3BhY2VfdG9fc3RhdGUgOj0gYWxsb3dfbmFtZXNwYWNlKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkKICAgIG9wc19idWlsZGVyMiA6PSBjb25jYXRfb3BfaWZfbm90X251bGwob3BzX2J1aWxkZXIxLCBhZGRfbmFtZXNwYWNlX3RvX3N0YXRlKQoKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiBwIFZlcnNpb24gPSIsIHBfb2NpLlZlcnNpb24sICJpIFZlcnNpb24gPSIsIGlfb2NpLlZlcnNpb24pCiAgICBwX29jaS5WZXJzaW9uID09IGlfb2NpLlZlcnNpb24KCiAgICBwcmludCgiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdENvbW1vbjogcCBSZWFkb25seSA9IiwgcF9vY2kuUm9vdC5SZWFkb25seSwgImkgUmVhZG9ubHkgPSIsIGlfb2NpLlJvb3QuUmVhZG9ubHkpCiAgICBwX29jaS5Sb290LlJlYWRvbmx5ID09IGlfb2NpLlJvb3QuUmVhZG9ubHkKCiAgICBhbGxvd19hbm5vKHBfb2NpLCBpX29jaSkKCiAgICBwX3N0b3JhZ2VzIDo9IHBfY29udGFpbmVyLnN0b3JhZ2VzCiAgICBhbGxvd19ieV9hbm5vKHBfb2NpLCBpX29jaSwgcF9zdG9yYWdlcywgaV9zdG9yYWdlcykKCiAgICBwX2RldmljZXMgOj0gcF9jb250YWluZXIuZGV2aWNlcwogICAgYWxsb3dfZGV2aWNlcyhwX2RldmljZXMsIGlfZGV2aWNlcykKCiAgICByZXQgOj0gYWxsb3dfbGludXgob3BzX2J1aWxkZXIyLCBwX29jaSwgaV9vY2kpCiAgICByZXQuYWxsb3dlZAoKICAgIG9wcyA6PSByZXQub3BzCgogICAgcHJpbnQoIkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb246IHRydWUiKQp9CgphbGxvd19jcmVhdGVfY29udGFpbmVyX2lucHV0KHJlcSkgewogICAgcHJpbnQoImFsbG93X2NyZWF0ZV9jb250YWluZXJfaW5wdXQ6IGlucHV0ID0iLCByZXEpCgogICAgY291bnQocmVxLnNoYXJlZF9tb3VudHMpID09IDAKICAgIGlzX251bGwocmVxLnN0cmluZ191c2VyKQoKICAgIGlfb2NpIDo9IHJlcS5PQ0kKICAgIGlzX251bGwoaV9vY2kuSG9va3MpCiAgICBpc19udWxsKGlfb2NpLlNvbGFyaXMpCiAgICBpc19udWxsKGlfb2NpLldpbmRvd3MpCgogICAgaV9saW51eCA6PSBpX29jaS5MaW51eAogICAgY291bnQoaV9saW51eC5HSURNYXBwaW5ncykgPT0gMAogICAgY291bnQoaV9saW51eC5Nb3VudExhYmVsKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlJlc291cmNlcy5EZXZpY2VzKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlJvb3Rmc1Byb3BhZ2F0aW9uKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlVJRE1hcHBpbmdzKSA9PSAwCiAgICBpc19udWxsKGlfbGludXguSW50ZWxSZHQpCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLkJsb2NrSU8pCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLk5ldHdvcmspCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLlBpZHMpCiAgICBpc19udWxsKGlfbGludXguU2VjY29tcCkKCiAgICBpX3Byb2Nlc3MgOj0gaV9vY2kuUHJvY2VzcwogICAgY291bnQoaV9wcm9jZXNzLlNlbGludXhMYWJlbCkgPT0gMAogICAgY291bnQoaV9wcm9jZXNzLlVzZXIuVXNlcm5hbWUpID09IDAKCiAgICBwcmludCgiYWxsb3dfY3JlYXRlX2NvbnRhaW5lcl9pbnB1dDogdHJ1ZSIpCn0KCmFsbG93X25hbWVzcGFjZShwX25hbWVzcGFjZSwgaV9uYW1lc3BhY2UpID0gYWRkX25hbWVzcGFjZSB7CiAgICBwX25hbWVzcGFjZSA9PSBpX25hbWVzcGFjZQogICAgYWRkX25hbWVzcGFjZSA6PSBudWxsCiAgICBwcmludCgiYWxsb3dfbmFtZXNwYWNlIDE6IGlucHV0IG5hbWVzcGFjZSBtYXRjaGVzIHBvbGljeSBkYXRhIikKfQoKYWxsb3dfbmFtZXNwYWNlKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkgPSBhZGRfbmFtZXNwYWNlIHsKICAgIHBfbmFtZXNwYWNlID09ICIiCiAgICBwcmludCgiYWxsb3dfbmFtZXNwYWNlIDI6IG5vIG5hbWVzcGFjZSBmb3VuZCBvbiBwb2xpY3kgZGF0YSIpCiAgICBhZGRfbmFtZXNwYWNlIDo9IHN0YXRlX2FsbG93cygibmFtZXNwYWNlIiwgaV9uYW1lc3BhY2UpCn0KCiMgdmFsdWUgaGFzbid0IGJlZW4gc2VlbiBiZWZvcmUsIHNhdmUgaXQgdG8gc3RhdGUKc3RhdGVfYWxsb3dzKGtleSwgdmFsdWUpID0gYWN0aW9uIHsKICBzdGF0ZSA6PSBnZXRfc3RhdGUoKQogIHByaW50KCJzdGF0ZV9hbGxvd3MgMTogc3RhdGVba2V5XSA9Iiwgc3RhdGVba2V5XSwgInZhbHVlID0iLCB2YWx1ZSkKICBub3Qgc3RhdGVba2V5XQogIHByaW50KCJzdGF0ZV9hbGxvd3MgMTogc2F2aW5nIHRvIHN0YXRlIGtleSA9Iiwga2V5LCAidmFsdWUgPSIsIHZhbHVlKQogIHBhdGggOj0gZ2V0X3N0YXRlX3BhdGgoa2V5KSAKICBhY3Rpb24gOj0gewogICAgIm9wIjogImFkZCIsCiAgICAicGF0aCI6IHBhdGgsIAogICAgInZhbHVlIjogdmFsdWUsCiAgfQp9CgojIHZhbHVlIG1hdGNoZXMgd2hhdCdzIGluIHN0YXRlLCBhbGxvdyBpdApzdGF0ZV9hbGxvd3Moa2V5LCB2YWx1ZSkgPSBhY3Rpb24gewogIHByaW50KCJzdGF0ZV9hbGxvd3MgMjogc3RhcnQiKQogIHN0YXRlIDo9IGdldF9zdGF0ZSgpCiAgcHJpbnQoInN0YXRlX2FsbG93cyAyOiBzdGF0ZVtrZXldID0iLCBzdGF0ZVtrZXldLCAidmFsdWUgPSIsIHZhbHVlKQogIHZhbHVlID09IHN0YXRlW2tleV0KICBwcmludCgic3RhdGVfYWxsb3dzIDI6IGZvdW5kIGtleSA9Iiwga2V5LCAidmFsdWUgPSIsIHZhbHVlLCAiIGluIHN0YXRlIikKICBhY3Rpb24gOj0gbnVsbAp9CgojIGhlbHBlciBmdW5jdGlvbnMgdG8gaW50ZXJhY3Qgd2l0aCB0aGUgc3RhdGUKZ2V0X3N0YXRlKCkgPSBzdGF0ZSB7CiAgc3RhdGUgOj0gZGF0YVsicHN0YXRlIl0KfQoKZ2V0X3N0YXRlX3ZhbChrZXkpID0gdmFsdWUgewogICAgc3RhdGUgOj0gZ2V0X3N0YXRlKCkKICAgIHZhbHVlIDo9IHN0YXRlW2tleV0KfQoKZ2V0X3N0YXRlX3BhdGgoa2V5KSA9IHBhdGggewogICAgIyBwcmVwZW5kICIvcHN0YXRlLyIgdG8ga2V5CiAgICBwYXRoIDo9IGNvbmNhdCgiLyIsIFsiL3BzdGF0ZSIsIGtleV0pCn0KCiMgSGVscGVyIGZ1bmN0aW9ucyB0byBjb25kaXRpb25hbGx5IGNvbmNhdGVuYXRlIG9wIGlzIG5vdCBudWxsCmNvbmNhdF9vcF9pZl9ub3RfbnVsbChvcHMsIG9wKSA9IHJlc3VsdCB7CiAgICBvcCA9PSBudWxsCiAgICByZXN1bHQgOj0gb3BzCn0KCmNvbmNhdF9vcF9pZl9ub3RfbnVsbChvcHMsIG9wKSA9IHJlc3VsdCB7CiAgICBvcCAhPSBudWxsCiAgICByZXN1bHQgOj0gYXJyYXkuY29uY2F0KG9wcywgW29wXSkKfQoKIyBSZWplY3QgdW5leHBlY3RlZCBhbm5vdGF0aW9ucy4KYWxsb3dfYW5ubyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19hbm5vIDE6IHN0YXJ0IikKCiAgICBub3QgaV9vY2kuQW5ub3RhdGlvbnMKCiAgICBwcmludCgiYWxsb3dfYW5ubyAxOiB0cnVlIikKfQphbGxvd19hbm5vKHBfb2NpLCBpX29jaSkgewogICAgcHJpbnQoImFsbG93X2Fubm8gMjogcCBBbm5vdGF0aW9ucyA9IiwgcF9vY2kuQW5ub3RhdGlvbnMpCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiBpIEFubm90YXRpb25zID0iLCBpX29jaS5Bbm5vdGF0aW9ucykKCiAgICBpX2tleXMgOj0gb2JqZWN0LmtleXMoaV9vY2kuQW5ub3RhdGlvbnMpCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiBpIGtleXMgPSIsIGlfa2V5cykKCiAgICBldmVyeSBpX2tleSBpbiBpX2tleXMgewogICAgICAgIGFsbG93X2Fubm9fa2V5KGlfa2V5LCBwX29jaSkKICAgIH0KCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiB0cnVlIikKfQoKYWxsb3dfYW5ub19rZXkoaV9rZXksIHBfb2NpKSB7CiAgICBwcmludCgiYWxsb3dfYW5ub19rZXkgMTogaSBrZXkgPSIsIGlfa2V5KQoKICAgIHN0YXJ0c3dpdGgoaV9rZXksICJpby5rdWJlcm5ldGVzLmNyaS4iKQoKICAgIHByaW50KCJhbGxvd19hbm5vX2tleSAxOiB0cnVlIikKfQphbGxvd19hbm5vX2tleShpX2tleSwgcF9vY2kpIHsKICAgIHByaW50KCJhbGxvd19hbm5vX2tleSAyOiBpIGtleSA9IiwgaV9rZXkpCgogICAgc29tZSBwX2tleSwgXyBpbiBwX29jaS5Bbm5vdGF0aW9ucwogICAgcF9rZXkgPT0gaV9rZXkKCiAgICBwcmludCgiYWxsb3dfYW5ub19rZXkgMjogdHJ1ZSIpCn0KCiMgR2V0IHRoZSB2YWx1ZSBvZiB0aGUgU19OQU1FX0tFWSBhbm5vdGF0aW9uIGFuZAojIGNvcnJlbGF0ZSBpdCB3aXRoIG90aGVyIGFubm90YXRpb25zIGFuZCBwcm9jZXNzIGZpZWxkcy4KYWxsb3dfYnlfYW5ubyhwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpIHsKICAgIHByaW50KCJhbGxvd19ieV9hbm5vIDE6IHN0YXJ0IikKCiAgICBub3QgcF9vY2kuQW5ub3RhdGlvbnNbU19OQU1FX0tFWV0KCiAgICBpX3NfbmFtZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMTogaV9zX25hbWUgPSIsIGlfc19uYW1lKQoKICAgIGlfc19uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FU1BBQ0VfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMTogaV9zX25hbWVzcGFjZSA9IiwgaV9zX25hbWVzcGFjZSkKCiAgICBhbGxvd19ieV9zYW5kYm94X25hbWUocF9vY2ksIGlfb2NpLCBwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBpX3NfbmFtZSwgaV9zX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfYnlfYW5ubyAxOiB0cnVlIikKfQphbGxvd19ieV9hbm5vKHBfb2NpLCBpX29jaSwgcF9zdG9yYWdlcywgaV9zdG9yYWdlcykgewogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMjogc3RhcnQiKQoKICAgIHBfc19uYW1lIDo9IHBfb2NpLkFubm90YXRpb25zW1NfTkFNRV9LRVldCiAgICBpX3NfbmFtZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMjogaV9zX25hbWUgPSIsIGlfc19uYW1lLCAicF9zX25hbWUgPSIsIHBfc19uYW1lKQoKICAgIGFsbG93X3NhbmRib3hfbmFtZShwX3NfbmFtZSwgaV9zX25hbWUpCgogICAgaV9zX25hbWVzcGFjZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwcmludCgiYWxsb3dfYnlfYW5ubyAyOiBpX3NfbmFtZXNwYWNlID0iLCBpX3NfbmFtZXNwYWNlKQoKICAgIGFsbG93X2J5X3NhbmRib3hfbmFtZShwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMsIGlfc19uYW1lLCBpX3NfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd19ieV9hbm5vIDI6IHRydWUiKQp9CgphbGxvd19ieV9zYW5kYm94X25hbWUocF9vY2ksIGlfb2NpLCBwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfYnlfc2FuZGJveF9uYW1lOiBzdGFydCIpCgogICAgaV9uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FU1BBQ0VfS0VZXQoKICAgIGFsbG93X2J5X2NvbnRhaW5lcl90eXBlcyhwX29jaSwgaV9vY2ksIHNfbmFtZSwgaV9uYW1lc3BhY2UpCiAgICBhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZChwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpCiAgICBhbGxvd19wcm9jZXNzKHBfb2NpLlByb2Nlc3MsIGlfb2NpLlByb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpCgogICAgcHJpbnQoImFsbG93X2J5X3NhbmRib3hfbmFtZTogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfbmFtZShwX3NfbmFtZSwgaV9zX25hbWUpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X25hbWU6IHN0YXJ0IikKICAgIHJlZ2V4Lm1hdGNoKHBfc19uYW1lLCBpX3NfbmFtZSkKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9uYW1lOiB0cnVlIikKfQoKIyBDaGVjayB0aGF0IHRoZSAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLXR5cGUiIGFuZAojICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIiBhbm5vdGF0aW9ucyBkZXNpZ25hdGUgdGhlCiMgZXhwZWN0ZWQgdHlwZSAtIGVpdGhlciBhICJzYW5kYm94IiBvciBhICJjb250YWluZXIiLiBUaGVuLCB2YWxpZGF0ZQojIG90aGVyIGFubm90YXRpb25zIGJhc2VkIG9uIHRoZSBhY3R1YWwgInNhbmRib3giIG9yICJjb250YWluZXIiIHZhbHVlCiMgZnJvbSB0aGUgaW5wdXQgY29udGFpbmVyLgphbGxvd19ieV9jb250YWluZXJfdHlwZXMocF9vY2ksIGlfb2NpLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfYnlfY29udGFpbmVyX3R5cGVzOiBjaGVja2luZyBpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSIpCgogICAgY190eXBlIDo9ICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSIKICAgIAogICAgcF9jcmlfdHlwZSA6PSBwX29jaS5Bbm5vdGF0aW9uc1tjX3R5cGVdCiAgICBpX2NyaV90eXBlIDo9IGlfb2NpLkFubm90YXRpb25zW2NfdHlwZV0KICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZXM6IHBfY3JpX3R5cGUgPSIsIHBfY3JpX3R5cGUsICJpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgcF9jcmlfdHlwZSA9PSBpX2NyaV90eXBlCgogICAgYWxsb3dfYnlfY29udGFpbmVyX3R5cGUoaV9jcmlfdHlwZSwgcF9vY2ksIGlfb2NpLCBzX25hbWUsIHNfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZXM6IHRydWUiKQp9CgphbGxvd19ieV9jb250YWluZXJfdHlwZShpX2NyaV90eXBlLCBwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAxOiBpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgaV9jcmlfdHlwZSA9PSAic2FuZGJveCIKCiAgICBpX2thdGFfdHlwZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1siaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5jb250YWluZXJfdHlwZSJdCiAgICBwcmludCgiYWxsb3dfYnlfY29udGFpbmVyX3R5cGUgMTogaV9rYXRhX3R5cGUgPSIsIGlfa2F0YV90eXBlKQogICAgaV9rYXRhX3R5cGUgPT0gInBvZF9zYW5kYm94IgoKICAgIGFsbG93X3NhbmRib3hfY29udGFpbmVyX25hbWUocF9vY2ksIGlfb2NpKQogICAgYWxsb3dfc2FuZGJveF9uZXRfbmFtZXNwYWNlKHBfb2NpLCBpX29jaSkKICAgIGFsbG93X3NhbmRib3hfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpCgogICAgcHJpbnQoImFsbG93X2J5X2NvbnRhaW5lcl90eXBlIDE6IHRydWUiKQp9CgphbGxvd19ieV9jb250YWluZXJfdHlwZShpX2NyaV90eXBlLCBwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiBpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgaV9jcmlfdHlwZSA9PSAiY29udGFpbmVyIgoKICAgIGlfa2F0YV90eXBlIDo9IGlfb2NpLkFubm90YXRpb25zWyJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIl0KICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiBpX2thdGFfdHlwZSA9IiwgaV9rYXRhX3R5cGUpCiAgICBpX2thdGFfdHlwZSA9PSAicG9kX2NvbnRhaW5lciIKCiAgICBhbGxvd19jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpCiAgICBhbGxvd19uZXRfbmFtZXNwYWNlKHBfb2NpLCBpX29jaSkKICAgIGFsbG93X2xvZ19kaXJlY3RvcnkocF9vY2ksIGlfb2NpKQoKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiB0cnVlIikKfQoKIyAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLW5hbWUiIGFubm90YXRpb24KYWxsb3dfc2FuZGJveF9jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X2NvbnRhaW5lcl9uYW1lOiBzdGFydCIpCgogICAgY29udGFpbmVyX2Fubm90YXRpb25fbWlzc2luZyhwX29jaSwgaV9vY2ksICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItbmFtZSIpCgogICAgcHJpbnQoImFsbG93X3NhbmRib3hfY29udGFpbmVyX25hbWU6IHRydWUiKQp9CgphbGxvd19jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19jb250YWluZXJfbmFtZTogc3RhcnQiKQoKICAgIGFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uKHBfb2NpLCBpX29jaSwgImlvLmt1YmVybmV0ZXMuY3JpLmNvbnRhaW5lci1uYW1lIikKCiAgICBwcmludCgiYWxsb3dfY29udGFpbmVyX25hbWU6IHRydWUiKQp9Cgpjb250YWluZXJfYW5ub3RhdGlvbl9taXNzaW5nKHBfb2NpLCBpX29jaSwga2V5KSB7CiAgICBwcmludCgiY29udGFpbmVyX2Fubm90YXRpb25fbWlzc2luZzoiLCBrZXkpCgogICAgbm90IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIG5vdCBpX29jaS5Bbm5vdGF0aW9uc1trZXldCgogICAgcHJpbnQoImNvbnRhaW5lcl9hbm5vdGF0aW9uX21pc3Npbmc6IHRydWUiKQp9CgphbGxvd19jb250YWluZXJfYW5ub3RhdGlvbihwX29jaSwgaV9vY2ksIGtleSkgewogICAgcHJpbnQoImFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uOiBrZXkgPSIsIGtleSkKCiAgICBwX3ZhbHVlIDo9IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIGlfdmFsdWUgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgcHJpbnQoImFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uOiBwX3ZhbHVlID0iLCBwX3ZhbHVlLCAiaV92YWx1ZSA9IiwgaV92YWx1ZSkKCiAgICBwX3ZhbHVlID09IGlfdmFsdWUKCiAgICBwcmludCgiYWxsb3dfY29udGFpbmVyX2Fubm90YXRpb246IHRydWUiKQp9CgojICJuZXJkY3RsL25ldHdvcmstbmFtZXNwYWNlIiBhbm5vdGF0aW9uCmFsbG93X3NhbmRib3hfbmV0X25hbWVzcGFjZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X25ldF9uYW1lc3BhY2U6IHN0YXJ0IikKCiAgICBrZXkgOj0gIm5lcmRjdGwvbmV0d29yay1uYW1lc3BhY2UiCgogICAgcF9uYW1lc3BhY2UgOj0gcF9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgaV9uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgcHJpbnQoImFsbG93X3NhbmRib3hfbmV0X25hbWVzcGFjZTogcF9uYW1lc3BhY2UgPSIsIHBfbmFtZXNwYWNlLCAiaV9uYW1lc3BhY2UgPSIsIGlfbmFtZXNwYWNlKQoKICAgIHJlZ2V4Lm1hdGNoKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9uZXRfbmFtZXNwYWNlOiB0cnVlIikKfQoKYWxsb3dfbmV0X25hbWVzcGFjZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19uZXRfbmFtZXNwYWNlOiBzdGFydCIpCgogICAga2V5IDo9ICJuZXJkY3RsL25ldHdvcmstbmFtZXNwYWNlIgoKICAgIG5vdCBwX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICBub3QgaV9vY2kuQW5ub3RhdGlvbnNba2V5XQoKICAgIHByaW50KCJhbGxvd19uZXRfbmFtZXNwYWNlOiB0cnVlIikKfQoKIyAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1sb2ctZGlyZWN0b3J5IiBhbm5vdGF0aW9uCmFsbG93X3NhbmRib3hfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X2xvZ19kaXJlY3Rvcnk6IHN0YXJ0IikKCiAgICBrZXkgOj0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbG9nLWRpcmVjdG9yeSIKCiAgICBwX2RpciA6PSBwX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICByZWdleDEgOj0gcmVwbGFjZShwX2RpciwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHJlZ2V4MiA6PSByZXBsYWNlKHJlZ2V4MSwgIiQoc2FuZGJveC1uYW1lc3BhY2UpIiwgc19uYW1lc3BhY2UpCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiByZWdleDIgPSIsIHJlZ2V4MikKCiAgICBpX2RpciA6PSBpX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiBpX2RpciA9IiwgaV9kaXIpCgogICAgcmVnZXgubWF0Y2gocmVnZXgyLCBpX2RpcikKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiB0cnVlIikKfQoKYWxsb3dfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19sb2dfZGlyZWN0b3J5OiBzdGFydCIpCgogICAga2V5IDo9ICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWxvZy1kaXJlY3RvcnkiCgogICAgbm90IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIG5vdCBpX29jaS5Bbm5vdGF0aW9uc1trZXldCgogICAgcHJpbnQoImFsbG93X2xvZ19kaXJlY3Rvcnk6IHRydWUiKQp9CgphbGxvd19kZXZpY2VzKHBfZGV2aWNlcywgaV9kZXZpY2VzKSB7CiAgICBwcmludCgiYWxsb3dfZGV2aWNlczogc3RhcnQiKQogICAgZXZlcnkgaV9kZXZpY2UgaW4gaV9kZXZpY2VzIHsKICAgICAgICBwcmludCgiYWxsb3dfZGV2aWNlczogaV9kZXZpY2UgPSIsIGlfZGV2aWNlKQogICAgICAgIHNvbWUgcF9kZXZpY2UgaW4gcF9kZXZpY2VzCiAgICAgICAgcF9kZXZpY2UuY29udGFpbmVyX3BhdGggPT0gaV9kZXZpY2UuY29udGFpbmVyX3BhdGgKICAgIH0KICAgIHByaW50KCJhbGxvd19kZXZpY2VzOiB0cnVlIikKfQoKYWxsb3dfbGludXgoc3RhdGVfb3BzLCBwX29jaSwgaV9vY2kpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIHBfbmFtZXNwYWNlcyA6PSBwX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbGludXg6IHAgbmFtZXNwYWNlcyA9IiwgcF9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlcyA6PSBpX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbGludXg6IGkgbmFtZXNwYWNlcyA9IiwgaV9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlX3dpdGhvdXRfbmV0d29yayA6PSBbb2JqIHwgb2JqIDo9IGlfbmFtZXNwYWNlc1tfXTsgb2JqLlR5cGUgIT0gIm5ldHdvcmsiXQoKICAgIHByaW50KCJhbGxvd19saW51eDogaV9uYW1lc3BhY2Vfd2l0aG91dF9uZXR3b3JrID0iLCBpX25hbWVzcGFjZV93aXRob3V0X25ldHdvcmspCgogICAgcF9uYW1lc3BhY2VzID09IGlfbmFtZXNwYWNlX3dpdGhvdXRfbmV0d29yawoKICAgIGFsbG93X21hc2tlZF9wYXRocyhwX29jaSwgaV9vY2kpCiAgICBhbGxvd19yZWFkb25seV9wYXRocyhwX29jaSwgaV9vY2kpCiAgICBhbGxvd19saW51eF9kZXZpY2VzKHBfb2NpLkxpbnV4LkRldmljZXMsIGlfb2NpLkxpbnV4LkRldmljZXMpCiAgICBhbGxvd19saW51eF9zeXNjdGwocF9vY2kuTGludXgsIGlfb2NpLkxpbnV4KQogICAgcmV0IDo9IGFsbG93X25ldHdvcmtfbmFtZXNwYWNlX3N0YXJ0KHN0YXRlX29wcywgcF9vY2ksIGlfb2NpKQogICAgcmV0LmFsbG93ZWQKCiAgICBvcHMgOj0gcmV0Lm9wcwoKICAgIHByaW50KCJhbGxvd19saW51eDogdHJ1ZSIpCn0KCiMgUmV0cmlldmUgdGhlICJuZXR3b3JrIiBuYW1lc3BhY2UgZnJvbSB0aGUgaW5wdXQgZGF0YSBhbmQgcGFzcyBpdCBvbiBmb3IgdGhlCiMgbmV0d29yayBuYW1lc3BhY2UgcG9saWN5IGNoZWNrcy4KYWxsb3dfbmV0d29ya19uYW1lc3BhY2Vfc3RhcnQoc3RhdGVfb3BzLCBwX29jaSwgaV9vY2kpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIHByaW50KCJhbGxvd19uZXR3b3JrX25hbWVzcGFjZSBzdGFydDogc3RhcnQiKQoKICAgIHBfbmFtZXNwYWNlcyA6PSBwX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IHAgbmFtZXNwYWNlcyA9IiwgcF9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlcyA6PSBpX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IGkgbmFtZXNwYWNlcyA9IiwgaV9uYW1lc3BhY2VzKQoKICAgICMgUmV0dXJuIHBhdGggb2YgdGhlICJuZXR3b3JrIiBuYW1lc3BhY2UKICAgIG5ldHdvcmtfbnMgOj0gW29iaiB8IG9iaiA6PSBpX25hbWVzcGFjZXNbX107IG9iai5UeXBlID09ICJuZXR3b3JrIl0KCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IG5ldHdvcmtfbnMgPSIsIG5ldHdvcmtfbnMpCgogICAgcmV0IDo9IGFsbG93X25ldHdvcmtfbmFtZXNwYWNlKHN0YXRlX29wcywgbmV0d29ya19ucykKICAgIHJldC5hbGxvd2VkCgogICAgb3BzIDo9IHJldC5vcHMKfQoKIyBUaGlzIHJ1bGUgaXMgd2hlbiB0aGVyZSdzIG5vIG5ldHdvcmsgbmFtZXNwYWNlIGluIHRoZSBpbnB1dCBkYXRhLgphbGxvd19uZXR3b3JrX25hbWVzcGFjZShzdGF0ZV9vcHMsIG5ldHdvcmtfbnMpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIGNvdW50KG5ldHdvcmtfbnMpID09IDAKCiAgICBuZXR3b3JrX25zX3BhdGggPSAiIgoKICAgIGFkZF9uZXR3b3JrX25hbWVzcGFjZV90b19zdGF0ZSA6PSBzdGF0ZV9hbGxvd3MoIm5ldHdvcmtfbmFtZXNwYWNlIiwgbmV0d29ya19uc19wYXRoKQogICAgb3BzIDo9IGNvbmNhdF9vcF9pZl9ub3RfbnVsbChzdGF0ZV9vcHMsIGFkZF9uZXR3b3JrX25hbWVzcGFjZV90b19zdGF0ZSkKCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2UgMTogdHJ1ZSIpCn0KCiMgVGhpcyBydWxlIGlzIHdoZW4gdGhlcmUncyBleGFjdGx5IG9uZSBuZXR3b3JrIG5hbWVzcGFjZSBpbiB0aGUgaW5wdXQgZGF0YS4KYWxsb3dfbmV0d29ya19uYW1lc3BhY2Uoc3RhdGVfb3BzLCBuZXR3b3JrX25zKSA6PSB7Im9wcyI6IG9wcywgImFsbG93ZWQiOiB0cnVlfSB7CiAgICBjb3VudChuZXR3b3JrX25zKSA9PSAxCgogICAgYWRkX25ldHdvcmtfbmFtZXNwYWNlX3RvX3N0YXRlIDo9IHN0YXRlX2FsbG93cygibmV0d29ya19uYW1lc3BhY2UiLCBuZXR3b3JrX25zWzBdLlBhdGgpCiAgICBvcHMgOj0gY29uY2F0X29wX2lmX25vdF9udWxsKHN0YXRlX29wcywgYWRkX25ldHdvcmtfbmFtZXNwYWNlX3RvX3N0YXRlKQoKICAgIHByaW50KCJhbGxvd19uZXR3b3JrX25hbWVzcGFjZSAyOiB0cnVlIikKfQoKYWxsb3dfbWFza2VkX3BhdGhzKHBfb2NpLCBpX29jaSkgewogICAgcF9wYXRocyA6PSBwX29jaS5MaW51eC5NYXNrZWRQYXRocwogICAgcHJpbnQoImFsbG93X21hc2tlZF9wYXRocyAxOiBwX3BhdGhzID0iLCBwX3BhdGhzKQoKICAgIGlfcGF0aHMgOj0gaV9vY2kuTGludXguTWFza2VkUGF0aHMKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aHMgMTogaV9wYXRocyA9IiwgaV9wYXRocykKCiAgICBhbGxvd19tYXNrZWRfcGF0aHNfYXJyYXkocF9wYXRocywgaV9wYXRocykKCiAgICBwcmludCgiYWxsb3dfbWFza2VkX3BhdGhzIDE6IHRydWUiKQp9CmFsbG93X21hc2tlZF9wYXRocyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aHMgMjogc3RhcnQiKQoKICAgIG5vdCBwX29jaS5MaW51eC5NYXNrZWRQYXRocwogICAgbm90IGlfb2NpLkxpbnV4Lk1hc2tlZFBhdGhzCgogICAgcHJpbnQoImFsbG93X21hc2tlZF9wYXRocyAyOiB0cnVlIikKfQoKIyBBbGwgdGhlIHBvbGljeSBtYXNrZWQgcGF0aHMgbXVzdCBiZSBtYXNrZWQgaW4gdGhlIGlucHV0IGRhdGEgdG9vLgojIElucHV0IGlzIGFsbG93ZWQgdG8gaGF2ZSBtb3JlIG1hc2tlZCBwYXRocyB0aGFuIHRoZSBwb2xpY3kuCmFsbG93X21hc2tlZF9wYXRoc19hcnJheShwX2FycmF5LCBpX2FycmF5KSB7CiAgICBldmVyeSBwX2VsZW0gaW4gcF9hcnJheSB7CiAgICAgICAgYWxsb3dfbWFza2VkX3BhdGgocF9lbGVtLCBpX2FycmF5KQogICAgfQp9CgphbGxvd19tYXNrZWRfcGF0aChwX2VsZW0sIGlfYXJyYXkpIHsKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aDogcF9lbGVtID0iLCBwX2VsZW0pCgogICAgc29tZSBpX2VsZW0gaW4gaV9hcnJheQogICAgcF9lbGVtID09IGlfZWxlbQoKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aDogdHJ1ZSIpCn0KCmFsbG93X3JlYWRvbmx5X3BhdGhzKHBfb2NpLCBpX29jaSkgewogICAgcF9wYXRocyA6PSBwX29jaS5MaW51eC5SZWFkb25seVBhdGhzCiAgICBwcmludCgiYWxsb3dfcmVhZG9ubHlfcGF0aHMgMTogcF9wYXRocyA9IiwgcF9wYXRocykKCiAgICBpX3BhdGhzIDo9IGlfb2NpLkxpbnV4LlJlYWRvbmx5UGF0aHMKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAxOiBpX3BhdGhzID0iLCBpX3BhdGhzKQoKICAgIGFsbG93X3JlYWRvbmx5X3BhdGhzX2FycmF5KHBfcGF0aHMsIGlfcGF0aHMsIGlfb2NpLkxpbnV4Lk1hc2tlZFBhdGhzKQoKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAxOiB0cnVlIikKfQphbGxvd19yZWFkb25seV9wYXRocyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAyOiBzdGFydCIpCgogICAgbm90IHBfb2NpLkxpbnV4LlJlYWRvbmx5UGF0aHMKICAgIG5vdCBpX29jaS5MaW51eC5SZWFkb25seVBhdGhzCgogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGhzIDI6IHRydWUiKQp9CgojIEFsbCB0aGUgcG9saWN5IHJlYWRvbmx5IHBhdGhzIG11c3QgYmUgZWl0aGVyOgojIC0gUHJlc2VudCBpbiB0aGUgaW5wdXQgcmVhZG9ubHkgcGF0aHMsIG9yCiMgLSBQcmVzZW50IGluIHRoZSBpbnB1dCBtYXNrZWQgcGF0aHMuCiMgSW5wdXQgaXMgYWxsb3dlZCB0byBoYXZlIG1vcmUgcmVhZG9ubHkgcGF0aHMgdGhhbiB0aGUgcG9saWN5LgphbGxvd19yZWFkb25seV9wYXRoc19hcnJheShwX2FycmF5LCBpX2FycmF5LCBtYXNrZWRfcGF0aHMpIHsKICAgIGV2ZXJ5IHBfZWxlbSBpbiBwX2FycmF5IHsKICAgICAgICBhbGxvd19yZWFkb25seV9wYXRoKHBfZWxlbSwgaV9hcnJheSwgbWFza2VkX3BhdGhzKQogICAgfQp9CgphbGxvd19yZWFkb25seV9wYXRoKHBfZWxlbSwgaV9hcnJheSwgbWFza2VkX3BhdGhzKSB7CiAgICBwcmludCgiYWxsb3dfcmVhZG9ubHlfcGF0aCAxOiBwX2VsZW0gPSIsIHBfZWxlbSkKCiAgICBzb21lIGlfZWxlbSBpbiBpX2FycmF5CiAgICBwX2VsZW0gPT0gaV9lbGVtCgogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGggMTogdHJ1ZSIpCn0KYWxsb3dfcmVhZG9ubHlfcGF0aChwX2VsZW0sIGlfYXJyYXksIG1hc2tlZF9wYXRocykgewogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGggMjogcF9lbGVtID0iLCBwX2VsZW0pCgogICAgc29tZSBpX21hc2tlZCBpbiBtYXNrZWRfcGF0aHMKICAgIHBfZWxlbSA9PSBpX21hc2tlZAoKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRoIDI6IHRydWUiKQp9CgphbGxvd19saW51eF9kZXZpY2VzKHBfZGV2aWNlcywgaV9kZXZpY2VzKSB7CiAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogc3RhcnQiKQogICAgZXZlcnkgaV9kZXZpY2UgaW4gaV9kZXZpY2VzIHsKICAgICAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogaV9kZXZpY2UgPSIsIGlfZGV2aWNlKQogICAgICAgIHNvbWUgcF9kZXZpY2UgaW4gcF9kZXZpY2VzCiAgICAgICAgaV9kZXZpY2UuUGF0aCA9PSBwX2RldmljZS5QYXRoCiAgICB9CiAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogdHJ1ZSIpCn0KCmFsbG93X2xpbnV4X3N5c2N0bChwX2xpbnV4LCBpX2xpbnV4KSB7CiAgICBwcmludCgiYWxsb3dfbGludXhfc3lzY3RsIDE6IHN0YXJ0IikKICAgIG5vdCBpX2xpbnV4LlN5c2N0bAogICAgcHJpbnQoImFsbG93X2xpbnV4X3N5c2N0bCAxOiB0cnVlIikKfQoKYWxsb3dfbGludXhfc3lzY3RsKHBfbGludXgsIGlfbGludXgpIHsKICAgIHByaW50KCJhbGxvd19saW51eF9zeXNjdGwgMjogc3RhcnQiKQogICAgcF9zeXNjdGwgOj0gcF9saW51eC5TeXNjdGwKICAgIGlfc3lzY3RsIDo9IGlfbGludXguU3lzY3RsCiAgICBldmVyeSBpX25hbWUsIGlfdmFsIGluIGlfc3lzY3RsIHsKICAgICAgICBwcmludCgiYWxsb3dfbGludXhfc3lzY3RsIDI6IGlfbmFtZSA9IiwgaV9uYW1lLCAiaV92YWwgPSIsIGlfdmFsKQogICAgICAgIHBfc3lzY3RsW2lfbmFtZV0gPT0gaV92YWwKICAgIH0KICAgIHByaW50KCJhbGxvd19saW51eF9zeXNjdGwgMjogdHJ1ZSIpCn0KCiMgQ2hlY2sgdGhlIGNvbnNpc3RlbmN5IG9mIHRoZSBpbnB1dCAiaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5idW5kbGVfcGF0aCIKIyBhbmQgaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCIgdmFsdWVzIHdpdGggb3RoZXIgZmllbGRzLgphbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZChwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpIHsKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogc3RhcnQiKQoKICAgIGJ1bmRsZV9wYXRoIDo9IGlfb2NpLkFubm90YXRpb25zWyJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmJ1bmRsZV9wYXRoIl0KICAgIGJ1bmRsZV9pZCA6PSByZXBsYWNlKGJ1bmRsZV9wYXRoLCAiL3J1bi9jb250YWluZXJkL2lvLmNvbnRhaW5lcmQucnVudGltZS52Mi50YXNrL2s4cy5pby8iLCAiIikKCiAgICBidW5kbGVfaWRfZm9ybWF0IDo9IGNvbmNhdCgiIiwgWyJeIiwgQlVORExFX0lELCAiJCJdKQogICAgcmVnZXgubWF0Y2goYnVuZGxlX2lkX2Zvcm1hdCwgYnVuZGxlX2lkKQoKICAgIGtleSA6PSAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCIKCiAgICBwX3JlZ2V4IDo9IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIHNhbmRib3hfaWQgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQoKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogc2FuZGJveF9pZCA9Iiwgc2FuZGJveF9pZCwgInJlZ2V4ID0iLCBwX3JlZ2V4KQogICAgcmVnZXgubWF0Y2gocF9yZWdleCwgc2FuZGJveF9pZCkKCiAgICBhbGxvd19yb290X3BhdGgocF9vY2ksIGlfb2NpLCBidW5kbGVfaWQpCgogICAgZXZlcnkgaV9tb3VudCBpbiBpX29jaS5Nb3VudHMgewogICAgICAgIGFsbG93X21vdW50KHBfb2NpLCBpX21vdW50LCBpX3N0b3JhZ2VzLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpCiAgICB9CgogICAgYWxsb3dfc3RvcmFnZXMocF9zdG9yYWdlcywgaV9zdG9yYWdlcywgYnVuZGxlX2lkLCBzYW5kYm94X2lkKQoKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogdHJ1ZSIpCn0KCmFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHBfcHJvY2VzcyA9IiwgcF9wcm9jZXNzKQogICAgcHJpbnQoImFsbG93X3Byb2Nlc3NfY29tbW9uOiBpX3Byb2Nlc3MgPSAiLCBpX3Byb2Nlc3MpCiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHNfbmFtZSA9Iiwgc19uYW1lKQoKICAgIHBfcHJvY2Vzcy5Dd2QgPT0gaV9wcm9jZXNzLkN3ZAogICAgcF9wcm9jZXNzLk5vTmV3UHJpdmlsZWdlcyA9PSBpX3Byb2Nlc3MuTm9OZXdQcml2aWxlZ2VzCgogICAgYWxsb3dfdXNlcihwX3Byb2Nlc3MsIGlfcHJvY2VzcykKICAgIGFsbG93X2VudihwX3Byb2Nlc3MsIGlfcHJvY2Vzcywgc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHRydWUiKQp9CgojIENvbXBhcmUgdGhlIE9DSSBQcm9jZXNzIGZpZWxkIG9mIGEgcG9saWN5IGNvbnRhaW5lciB3aXRoIHRoZSBpbnB1dCBPQ0kgUHJvY2VzcyBmcm9tIGEgQ3JlYXRlQ29udGFpbmVyUmVxdWVzdAphbGxvd19wcm9jZXNzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfcHJvY2Vzczogc3RhcnQiKQoKICAgIGFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgYWxsb3dfY2FwcyhwX3Byb2Nlc3MuQ2FwYWJpbGl0aWVzLCBpX3Byb2Nlc3MuQ2FwYWJpbGl0aWVzKQogICAgcF9wcm9jZXNzLlRlcm1pbmFsID09IGlfcHJvY2Vzcy5UZXJtaW5hbAoKICAgIHByaW50KCJhbGxvd19wcm9jZXNzOiB0cnVlIikKfQoKIyBDb21wYXJlIHRoZSBPQ0kgUHJvY2VzcyBmaWVsZCBvZiBhIHBvbGljeSBjb250YWluZXIgd2l0aCB0aGUgaW5wdXQgcHJvY2VzcyBmaWVsZCBmcm9tIEV4ZWNQcm9jZXNzUmVxdWVzdAphbGxvd19pbnRlcmFjdGl2ZV9wcm9jZXNzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfaW50ZXJhY3RpdmVfcHJvY2Vzczogc3RhcnQiKQoKICAgIGFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgYWxsb3dfZXhlY19jYXBzKGlfcHJvY2Vzcy5DYXBhYmlsaXRpZXMpCgogICAgIyBUaGVzZSBhcmUgY29tbWFuZHMgZW5hYmxlZCB1c2luZyBFeGVjUHJvY2Vzc1JlcXVlc3QgY29tbWFuZHMgYW5kL29yIHJlZ2V4IGZyb20gdGhlIHNldHRpbmdzIGZpbGUuCiAgICAjIFRoZXkgY2FuIGJlIGV4ZWN1dGVkIGludGVyYWN0aXZlbHkgc28gYWxsb3cgdGhlbSB0byB1c2UgYW55IHZhbHVlIGZvciBpX3Byb2Nlc3MuVGVybWluYWwuCgogICAgcHJpbnQoImFsbG93X2ludGVyYWN0aXZlX3Byb2Nlc3M6IHRydWUiKQp9CgojIENvbXBhcmUgdGhlIE9DSSBQcm9jZXNzIGZpZWxkIG9mIGEgcG9saWN5IGNvbnRhaW5lciB3aXRoIHRoZSBpbnB1dCBwcm9jZXNzIGZpZWxkIGZyb20gRXhlY1Byb2Nlc3NSZXF1ZXN0CmFsbG93X3Byb2JlX3Byb2Nlc3MocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19wcm9iZV9wcm9jZXNzOiBzdGFydCIpCgogICAgYWxsb3dfcHJvY2Vzc19jb21tb24ocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpCiAgICBhbGxvd19leGVjX2NhcHMoaV9wcm9jZXNzLkNhcGFiaWxpdGllcykKICAgIHBfcHJvY2Vzcy5UZXJtaW5hbCA9PSBpX3Byb2Nlc3MuVGVybWluYWwKCiAgICBwcmludCgiYWxsb3dfcHJvYmVfcHJvY2VzczogdHJ1ZSIpCn0KCmFsbG93X3VzZXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MpIHsKICAgIHBfdXNlciA6PSBwX3Byb2Nlc3MuVXNlcgogICAgaV91c2VyIDo9IGlfcHJvY2Vzcy5Vc2VyCgogICAgcHJpbnQoImFsbG93X3VzZXI6IGlucHV0IHVpZCA9IiwgaV91c2VyLlVJRCwgInBvbGljeSB1aWQgPSIsIHBfdXNlci5VSUQpCiAgICBwX3VzZXIuVUlEID09IGlfdXNlci5VSUQKCiAgICAjIFRPRE86IHRyYWNrIGRvd24gdGhlIHJlYXNvbiBmb3IgcmVnaXN0cnkuazhzLmlvL3BhdXNlOjMuOSBiZWluZwogICAgIyAgICAgICBleGVjdXRlZCB3aXRoIGdpZCA9IDAgZGVzcGl0ZSBoYXZpbmcgIjY1NTM1OjY1NTM1IiBpbiBpdHMgY29udGFpbmVyIGltYWdlCiAgICAjICAgICAgIGNvbmZpZy4KICAgICNwcmludCgiYWxsb3dfdXNlcjogaW5wdXQgZ2lkID0iLCBpX3VzZXIuR0lELCAicG9saWN5IGdpZCA9IiwgcF91c2VyLkdJRCkKICAgICNwX3VzZXIuR0lEID09IGlfdXNlci5HSUQKCiAgICAjIFRPRE86IGNvbXBhcmUgdGhlIGFkZGl0aW9uYWxHaWRzIGZpZWxkIHRvbyBhZnRlciBjb21wdXRpbmcgaXRzIHZhbHVlCiAgICAjIGJhc2VkIG9uIC9ldGMvcGFzc3dkIGFuZCAvZXRjL2dyb3VwIGZyb20gdGhlIGNvbnRhaW5lciBpbWFnZS4KfQoKYWxsb3dfZGVwcmVjYXRlZF9hcmdzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZ3MgMTogbm8gYXJncyIpCgogICAgbm90IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJncwogICAgbm90IGlfcHJvY2Vzcy5BcmdzCgogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAxOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZ3MocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSkgewogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiBwb2xpY3kgYXJncyA9IiwgcF9wcm9jZXNzLkRlcHJlY2F0ZWRBcmdzKQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiBpbnB1dCBhcmdzID0iLCBpX3Byb2Nlc3MuQXJncykKCiAgICBjb3VudChwX3Byb2Nlc3MuRGVwcmVjYXRlZEFyZ3MpID09IGNvdW50KGlfcHJvY2Vzcy5BcmdzKQoKICAgIGV2ZXJ5IGksIGlfYXJnIGluIGlfcHJvY2Vzcy5BcmdzIHsKICAgICAgICBhbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpCiAgICB9CgogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDE6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgcF9hcmcyIDo9IHJlcGxhY2UocF9hcmcsICIkJCIsICIkIikKICAgIHBfYXJnMiA9PSBpX2FyZwoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAxOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDI6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgIyBUT0RPOiBjYW4gJChub2RlLW5hbWUpIGJlIGhhbmRsZWQgYmV0dGVyPwogICAgY29udGFpbnMocF9hcmcsICIkKG5vZGUtbmFtZSkiKQoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAyOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDM6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgcF9hcmcyIDo9IHJlcGxhY2UocF9hcmcsICIkJCIsICIkIikKICAgIHBfYXJnMyA6PSByZXBsYWNlKHBfYXJnMiwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAzOiBwX2FyZzMgPSIsIHBfYXJnMykKICAgIHBfYXJnMyA9PSBpX2FyZwoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAzOiB0cnVlIikKfQoKIyBPQ0kgcHJvY2Vzcy5FbnYgZmllbGQKYWxsb3dfZW52KHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfZW52OiBwIGVudiA9IiwgcF9wcm9jZXNzLkVudikKICAgIHByaW50KCJhbGxvd19lbnY6IGkgZW52ID0iLCBpX3Byb2Nlc3MuRW52KQoKICAgIGV2ZXJ5IGlfdmFyIGluIGlfcHJvY2Vzcy5FbnYgewogICAgICAgIHByaW50KCJhbGxvd19lbnY6IGlfdmFyID0iLCBpX3ZhcikKICAgICAgICBhbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgfQoKICAgIHByaW50KCJhbGxvd19lbnY6IHRydWUiKQp9CgojIEFsbG93IGlucHV0IGVudiB2YXJpYWJsZXMgdGhhdCBhcmUgcHJlc2VudCBpbiB0aGUgcG9saWN5IGRhdGEgdG9vLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHBfdmFyID09IGlfdmFyCiAgICBwcmludCgiYWxsb3dfdmFyIDE6IHRydWUiKQp9CgojIE1hdGNoIGlucHV0IHdpdGggb25lIG9mIHRoZSBwb2xpY3kgdmFyaWFibGVzLCBhZnRlciBzdWJzdGl0dXRpbmcgJChzYW5kYm94LW5hbWUpLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHByaW50KCJhbGxvd192YXIgMjogcF92YXIgPSIsIHBfdmFyKQoKICAgIHBfdmFyX3NwbGl0IDo9IHNwbGl0KHBfdmFyLCAiPSIpCiAgICBjb3VudChwX3Zhcl9zcGxpdCkgPT0gMgoKICAgIHBfdmFyX3NwbGl0WzFdID09ICIkKHNhbmRib3gtbmFtZSkiCgogICAgaV92YXJfc3BsaXQgOj0gc3BsaXQoaV92YXIsICI9IikKICAgIGNvdW50KGlfdmFyX3NwbGl0KSA9PSAyCgogICAgaV92YXJfc3BsaXRbMF0gPT0gcF92YXJfc3BsaXRbMF0KICAgIHJlZ2V4Lm1hdGNoKHNfbmFtZSwgaV92YXJfc3BsaXRbMV0pCgogICAgcHJpbnQoImFsbG93X3ZhciAyOiB0cnVlIikKfQoKIyBBbGxvdyBpbnB1dCBlbnYgdmFyaWFibGVzIHRoYXQgbWF0Y2ggd2l0aCBhIHJlcXVlc3RfZGVmYXVsdHMgcmVnZXguCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHNvbWUgcF9yZWdleDEgaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5DcmVhdGVDb250YWluZXJSZXF1ZXN0LmFsbG93X2Vudl9yZWdleAogICAgcF9yZWdleDIgOj0gcmVwbGFjZShwX3JlZ2V4MSwgIiQoaXB2NF9hKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcHY0X2EpCiAgICBwX3JlZ2V4MyA6PSByZXBsYWNlKHBfcmVnZXgyLCAiJChpcF9wKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcF9wKQogICAgcF9yZWdleDQgOj0gcmVwbGFjZShwX3JlZ2V4MywgIiQoc3ZjX25hbWUpIiwgcG9saWN5X2RhdGEuY29tbW9uLnN2Y19uYW1lKQogICAgcF9yZWdleDUgOj0gcmVwbGFjZShwX3JlZ2V4NCwgIiQoZG5zX2xhYmVsKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5kbnNfbGFiZWwpCgogICAgcHJpbnQoImFsbG93X3ZhciAzOiBwX3JlZ2V4NSA9IiwgcF9yZWdleDUpCiAgICByZWdleC5tYXRjaChwX3JlZ2V4NSwgaV92YXIpCgogICAgcHJpbnQoImFsbG93X3ZhciAzOiB0cnVlIikKfQoKIyBBbGxvdyBmaWVsZFJlZiAiZmllbGRQYXRoOiBzdGF0dXMucG9kSVAiIHZhbHVlcy4KYWxsb3dfdmFyKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBpX3Zhciwgc19uYW1lLCBzX25hbWVzcGFjZSkgewogICAgbmFtZV92YWx1ZSA6PSBzcGxpdChpX3ZhciwgIj0iKQogICAgY291bnQobmFtZV92YWx1ZSkgPT0gMgogICAgaXNfaXAobmFtZV92YWx1ZVsxXSkKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIGFsbG93X3BvZF9pcF92YXIobmFtZV92YWx1ZVswXSwgcF92YXIpCgogICAgcHJpbnQoImFsbG93X3ZhciA0OiB0cnVlIikKfQoKIyBBbGxvdyBjb21tb24gZmllbGRSZWYgdmFyaWFibGVzLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBuYW1lX3ZhbHVlIDo9IHNwbGl0KGlfdmFyLCAiPSIpCiAgICBjb3VudChuYW1lX3ZhbHVlKSA9PSAyCgogICAgc29tZSBwX3ZhciBpbiBwX3Byb2Nlc3MuRW52CiAgICBwX25hbWVfdmFsdWUgOj0gc3BsaXQocF92YXIsICI9IikKICAgIGNvdW50KHBfbmFtZV92YWx1ZSkgPT0gMgoKICAgIHBfbmFtZV92YWx1ZVswXSA9PSBuYW1lX3ZhbHVlWzBdCgogICAgIyBUT0RPOiBzaG91bGQgdGhlc2UgYmUgaGFuZGxlZCBpbiBhIGRpZmZlcmVudCB3YXk/CiAgICBhbHdheXNfYWxsb3dlZCA6PSBbIiQoaG9zdC1uYW1lKSIsICIkKG5vZGUtbmFtZSkiLCAiJChwb2QtdWlkKSJdCiAgICBzb21lIGFsbG93ZWQgaW4gYWx3YXlzX2FsbG93ZWQKICAgIGNvbnRhaW5zKHBfbmFtZV92YWx1ZVsxXSwgYWxsb3dlZCkKCiAgICBwcmludCgiYWxsb3dfdmFyIDU6IHRydWUiKQp9CgojIEFsbG93IGZpZWxkUmVmICJmaWVsZFBhdGg6IHN0YXR1cy5ob3N0SVAiIHZhbHVlcy4KYWxsb3dfdmFyKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBpX3Zhciwgc19uYW1lLCBzX25hbWVzcGFjZSkgewogICAgbmFtZV92YWx1ZSA6PSBzcGxpdChpX3ZhciwgIj0iKQogICAgY291bnQobmFtZV92YWx1ZSkgPT0gMgogICAgaXNfaXAobmFtZV92YWx1ZVsxXSkKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIGFsbG93X2hvc3RfaXBfdmFyKG5hbWVfdmFsdWVbMF0sIHBfdmFyKQoKICAgIHByaW50KCJhbGxvd192YXIgNjogdHJ1ZSIpCn0KCiMgQWxsb3cgcmVzb3VyY2VGaWVsZFJlZiB2YWx1ZXMgKGUuZy4sICJsaW1pdHMuY3B1IikuCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIG5hbWVfdmFsdWUgOj0gc3BsaXQoaV92YXIsICI9IikKICAgIGNvdW50KG5hbWVfdmFsdWUpID09IDIKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHBfbmFtZV92YWx1ZSA6PSBzcGxpdChwX3ZhciwgIj0iKQogICAgY291bnQocF9uYW1lX3ZhbHVlKSA9PSAyCgogICAgcF9uYW1lX3ZhbHVlWzBdID09IG5hbWVfdmFsdWVbMF0KCiAgICAjIGEgdmFyaWFibGUgd2Ugc2hvdWxkIGJlIHZhbGlkYXRpbmcgdXNpbmcgYSByZWdleCBmcm9tIHNldHRpbmdzCiAgICBwX25hbWVfdmFsdWVbMV0gPT0gIiQodmFsaWRhdGUtZnJvbS1zZXR0aW5ncykiCgogICAgcmVnZXhfdmFsIDo9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuQ3JlYXRlQ29udGFpbmVyUmVxdWVzdC5hbGxvd19lbnZfcmVnZXhfbWFwW25hbWVfdmFsdWVbMF1dCgogICAgcHJpbnQoImFsbG93X3ZhciA3OiB2YWwgPSIsIG5hbWVfdmFsdWVbMV0pCiAgICBwcmludCgiYWxsb3dfdmFyIDc6IHJlZ2V4X3ZhbCA9IiwgcmVnZXhfdmFsKQoKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4X3ZhbCwgbmFtZV92YWx1ZVsxXSkKCiAgICBwcmludCgiYWxsb3dfdmFyIDc6IHRydWUiKQp9CgojIE1hdGNoIGlucHV0IHdpdGggb25lIG9mIHRoZSBwb2xpY3kgdmFyaWFibGVzLCBhZnRlciBzdWJzdGl0dXRpbmcgJChzYW5kYm94LW5hbWVzcGFjZSkuCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHNvbWUgcF92YXIgaW4gcF9wcm9jZXNzLkVudgogICAgcF92YXIyIDo9IHJlcGxhY2UocF92YXIsICIkKHNhbmRib3gtbmFtZXNwYWNlKSIsIHNfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd192YXIgODogcF92YXIyID0iLCBwX3ZhcjIpCiAgICBwX3ZhcjIgPT0gaV92YXIKCiAgICBwcmludCgiYWxsb3dfdmFyIDg6IHRydWUiKQp9CgphbGxvd19wb2RfaXBfdmFyKHZhcl9uYW1lLCBwX3ZhcikgewogICAgcHJpbnQoImFsbG93X3BvZF9pcF92YXI6IHZhcl9uYW1lID0iLCB2YXJfbmFtZSwgInBfdmFyID0iLCBwX3ZhcikKCiAgICBwX25hbWVfdmFsdWUgOj0gc3BsaXQocF92YXIsICI9IikKICAgIGNvdW50KHBfbmFtZV92YWx1ZSkgPT0gMgoKICAgIHBfbmFtZV92YWx1ZVswXSA9PSB2YXJfbmFtZQogICAgcF9uYW1lX3ZhbHVlWzFdID09ICIkKHBvZC1pcCkiCgogICAgcHJpbnQoImFsbG93X3BvZF9pcF92YXI6IHRydWUiKQp9CgphbGxvd19ob3N0X2lwX3Zhcih2YXJfbmFtZSwgcF92YXIpIHsKICAgIHByaW50KCJhbGxvd19ob3N0X2lwX3ZhcjogdmFyX25hbWUgPSIsIHZhcl9uYW1lLCAicF92YXIgPSIsIHBfdmFyKQoKICAgIHBfbmFtZV92YWx1ZSA6PSBzcGxpdChwX3ZhciwgIj0iKQogICAgY291bnQocF9uYW1lX3ZhbHVlKSA9PSAyCgogICAgcF9uYW1lX3ZhbHVlWzBdID09IHZhcl9uYW1lCiAgICBwX25hbWVfdmFsdWVbMV0gPT0gIiQoaG9zdC1pcCkiCgogICAgcHJpbnQoImFsbG93X2hvc3RfaXBfdmFyOiB0cnVlIikKfQoKaXNfaXAodmFsdWUpIHsKICAgIGJ5dGVzID0gc3BsaXQodmFsdWUsICIuIikKICAgIGNvdW50KGJ5dGVzKSA9PSA0CgogICAgaXNfaXBfZmlyc3RfYnl0ZShieXRlc1swXSkKICAgIGlzX2lwX290aGVyX2J5dGUoYnl0ZXNbMV0pCiAgICBpc19pcF9vdGhlcl9ieXRlKGJ5dGVzWzJdKQogICAgaXNfaXBfb3RoZXJfYnl0ZShieXRlc1szXSkKfQppc19pcF9maXJzdF9ieXRlKGNvbXBvbmVudCkgewogICAgbnVtYmVyID0gdG9fbnVtYmVyKGNvbXBvbmVudCkKICAgIG51bWJlciA+PSAxCiAgICBudW1iZXIgPD0gMjU1Cn0KaXNfaXBfb3RoZXJfYnl0ZShjb21wb25lbnQpIHsKICAgIG51bWJlciA9IHRvX251bWJlcihjb21wb25lbnQpCiAgICBudW1iZXIgPj0gMAogICAgbnVtYmVyIDw9IDI1NQp9CgojIE9DSSByb290LlBhdGgKYWxsb3dfcm9vdF9wYXRoKHBfb2NpLCBpX29jaSwgYnVuZGxlX2lkKSB7CiAgICBpX3BhdGggOj0gaV9vY2kuUm9vdC5QYXRoCiAgICBwX3BhdGgxIDo9IHBfb2NpLlJvb3QuUGF0aAogICAgcHJpbnQoImFsbG93X3Jvb3RfcGF0aDogaV9wYXRoID0iLCBpX3BhdGgsICJwX3BhdGgxID0iLCBwX3BhdGgxKQoKICAgIHBfcGF0aDIgOj0gcmVwbGFjZShwX3BhdGgxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfcm9vdF9wYXRoOiBwX3BhdGgyID0iLCBwX3BhdGgyKQoKICAgIHBfcGF0aDMgOj0gcmVwbGFjZShwX3BhdGgyLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X3Jvb3RfcGF0aDogcF9wYXRoMyA9IiwgcF9wYXRoMykKCiAgICBwX3BhdGgzID09IGlfcGF0aAoKICAgIHByaW50KCJhbGxvd19yb290X3BhdGg6IHRydWUiKQp9CgojIGRldmljZSBtb3VudHMKYWxsb3dfbW91bnQocF9vY2ksIGlfbW91bnQsIGlfc3RvcmFnZXMsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcHJpbnQoImFsbG93X21vdW50OiBpX21vdW50ID0iLCBpX21vdW50KQoKICAgIHNvbWUgcF9tb3VudCBpbiBwX29jaS5Nb3VudHMKICAgIHNvbWUgaV9zdG9yYWdlIGluIGlfc3RvcmFnZXMKCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IHBfbW91bnQgPSIsIHBfbW91bnQpCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IGlfc3RvcmFnZSA9IiwgaV9zdG9yYWdlKQoKICAgIGNoZWNrX21vdW50KHBfbW91bnQsIGlfbW91bnQsIGlfc3RvcmFnZSwgYnVuZGxlX2lkLCBzYW5kYm94X2lkKQoKICAgICMgVE9ETzogYXJlIHRoZXJlIGFueSBvdGhlciByZXF1aXJlZCBwb2xpY3kgY2hlY2tzIGZvciBtb3VudHMgLSBlLmcuLAogICAgIyAgICAgICBtdWx0aXBsZSBtb3VudHMgd2l0aCBzYW1lIHNvdXJjZSBvciBkZXN0aW5hdGlvbj8KCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IHRydWUiKQp9CgpjaGVja19tb3VudChwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcF9tb3VudCA9PSBpX21vdW50CiAgICBwcmludCgiY2hlY2tfbW91bnQgMTogdHJ1ZSIpCn0KY2hlY2tfbW91bnQocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHBfbW91bnQuZGVzdGluYXRpb24gPT0gaV9tb3VudC5kZXN0aW5hdGlvbgogICAgcF9tb3VudC50eXBlXyA9PSBpX21vdW50LnR5cGVfCiAgICBwX21vdW50Lm9wdGlvbnMgPT0gaV9tb3VudC5vcHRpb25zCgogICAgbW91bnRfc291cmNlX2FsbG93cyhwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkKCiAgICBwcmludCgiY2hlY2tfbW91bnQgMjogdHJ1ZSIpCn0KCm1vdW50X3NvdXJjZV9hbGxvd3MocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHJlZ2V4MSA6PSBwX21vdW50LnNvdXJjZQogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5tb3VudF9zb3VyY2VfY3BhdGgpCiAgICByZWdleDQgOj0gcmVwbGFjZShyZWdleDMsICIkKGJ1bmRsZS1pZCkiLCBidW5kbGVfaWQpCgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMTogcmVnZXg0ID0iLCByZWdleDQpCiAgICByZWdleC5tYXRjaChyZWdleDQsIGlfbW91bnQuc291cmNlKQoKICAgIHByaW50KCJtb3VudF9zb3VyY2VfYWxsb3dzIDE6IHRydWUiKQp9Cm1vdW50X3NvdXJjZV9hbGxvd3MocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHJlZ2V4MSA6PSBwX21vdW50LnNvdXJjZQogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5tb3VudF9zb3VyY2VfY3BhdGgpCiAgICByZWdleDQgOj0gcmVwbGFjZShyZWdleDMsICIkKHNhbmRib3gtaWQpIiwgc2FuZGJveF9pZCkKCiAgICBwcmludCgibW91bnRfc291cmNlX2FsbG93cyAyOiByZWdleDQgPSIsIHJlZ2V4NCkKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4NCwgaV9tb3VudC5zb3VyY2UpCgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMjogdHJ1ZSIpCn0KbW91bnRfc291cmNlX2FsbG93cyhwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogaV9tb3VudC5zb3VyY2UgPSIsIGlfbW91bnQuc291cmNlKQogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogaV9zdG9yYWdlLm1vdW50X3BvaW50ID0iLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCgogICAgaV9tb3VudC5zb3VyY2UgPT0gaV9zdG9yYWdlLm1vdW50X3BvaW50CgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogdHJ1ZSIpCn0KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBDcmVhdGUgY29udGFpbmVyIFN0b3JhZ2VzCgphbGxvd19zdG9yYWdlcyhwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHBfY291bnQgOj0gY291bnQocF9zdG9yYWdlcykKICAgIGlfY291bnQgOj0gY291bnQoaV9zdG9yYWdlcykKICAgIHByaW50KCJhbGxvd19zdG9yYWdlczogcF9jb3VudCA9IiwgcF9jb3VudCwgImlfY291bnQgPSIsIGlfY291bnQpCgogICAgcF9jb3VudCA9PSBpX2NvdW50CgogICAgIyBHZXQgdGhlIGNvbnRhaW5lciBpbWFnZSBsYXllciBJRHMgYW5kIHZlcml0eSByb290IGhhc2hlcywgZnJvbSB0aGUgIm92ZXJsYXlmcyIgc3RvcmFnZS4KICAgIHNvbWUgb3ZlcmxheV9zdG9yYWdlIGluIHBfc3RvcmFnZXMKICAgIG92ZXJsYXlfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIHByaW50KCJhbGxvd19zdG9yYWdlczogb3ZlcmxheV9zdG9yYWdlID0iLCBvdmVybGF5X3N0b3JhZ2UpCiAgICBjb3VudChvdmVybGF5X3N0b3JhZ2Uub3B0aW9ucykgPT0gMgoKICAgIGxheWVyX2lkcyA6PSBzcGxpdChvdmVybGF5X3N0b3JhZ2Uub3B0aW9uc1swXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiBsYXllcl9pZHMgPSIsIGxheWVyX2lkcykKCiAgICByb290X2hhc2hlcyA6PSBzcGxpdChvdmVybGF5X3N0b3JhZ2Uub3B0aW9uc1sxXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiByb290X2hhc2hlcyA9Iiwgcm9vdF9oYXNoZXMpCgogICAgZXZlcnkgaV9zdG9yYWdlIGluIGlfc3RvcmFnZXMgewogICAgICAgIGFsbG93X3N0b3JhZ2UocF9zdG9yYWdlcywgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpCiAgICB9CgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiB0cnVlIikKfQoKYWxsb3dfc3RvcmFnZShwX3N0b3JhZ2VzLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgc29tZSBwX3N0b3JhZ2UgaW4gcF9zdG9yYWdlcwoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiBwX3N0b3JhZ2UgPSIsIHBfc3RvcmFnZSkKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiBpX3N0b3JhZ2UgPSIsIGlfc3RvcmFnZSkKCiAgICBwX3N0b3JhZ2UuZHJpdmVyICAgICAgICAgICA9PSBpX3N0b3JhZ2UuZHJpdmVyCiAgICBwX3N0b3JhZ2UuZHJpdmVyX29wdGlvbnMgICA9PSBpX3N0b3JhZ2UuZHJpdmVyX29wdGlvbnMKICAgIHBfc3RvcmFnZS5mc19ncm91cCAgICAgICAgID09IGlfc3RvcmFnZS5mc19ncm91cAogICAgcF9zdG9yYWdlLmZzdHlwZSAgICAgICAgICAgPT0gaV9zdG9yYWdlLmZzdHlwZQoKICAgIGFsbG93X3N0b3JhZ2Vfc291cmNlKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKQogICAgYWxsb3dfc3RvcmFnZV9vcHRpb25zKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKQogICAgYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKQoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiB0cnVlIikKfQoKYWxsb3dfc3RvcmFnZV9zb3VyY2UocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX3NvdXJjZSAxOiBzdGFydCIpCgogICAgcF9zdG9yYWdlLnNvdXJjZSA9PSBpX3N0b3JhZ2Uuc291cmNlCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDE6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX3NvdXJjZShwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDI6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCgogICAgIyBEREREOkJCOkRELkY6IERvbWFpbjpCdXM6RGV2aWNlLkZ1bmN0aW9uCiAgICAjIGh0dHBzOi8vd3d3Lmtlcm5lbC5vcmcvZG9jL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtYnVzLXBjaQogICAgcmVnZXgubWF0Y2goYF5bYS1mMC05XXs0fTpbYS1mMC05XXsyfTpbYS1mMC05XXsyfVwuW2EtZjAtOV0kYCwgaV9zdG9yYWdlLnNvdXJjZSkKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9zb3VyY2UgMjogdHJ1ZSIpCn0KCmFsbG93X3N0b3JhZ2Vfc291cmNlKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKSB7CiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9zb3VyY2UgMzogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIGlfc3RvcmFnZS5zb3VyY2UgPT0gIm5vbmUiCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDM6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX3NvdXJjZShwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDQ6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJzbWIiCgogICAgIyBQYXR0ZXJuOiAvLzxzdG9yYWdlLWFjY291bnQtbmFtZT4uZmlsZS5jb3JlLndpbmRvd3MubmV0LzxrOHMtUFZDLW5hbWU+CiAgICAjIFN0b3JhZ2UgYWNjb3VudCBuYW1lOiBodHRwczovL2xlYXJuLm1pY3Jvc29mdC5jb20vZW4tdXMvYXp1cmUvc3RvcmFnZS9jb21tb24vc3RvcmFnZS1hY2NvdW50LW92ZXJ2aWV3I3N0b3JhZ2UtYWNjb3VudC1uYW1lCiAgICAjIEs4cyBQVkMgbmFtZTogaHR0cHM6Ly9rdWJlcm5ldGVzLmlvL2RvY3MvY29uY2VwdHMvb3ZlcnZpZXcvd29ya2luZy13aXRoLW9iamVjdHMvbmFtZXMvI2Rucy1zdWJkb21haW4tbmFtZXMKICAgIHJlZ2V4Lm1hdGNoKGBeXC9cLyhbYS16MC05XXszLDI0fSlcLmZpbGVcLmNvcmVcLndpbmRvd3NcLm5ldFwvW2EtejAtOV0oW2EtejAtOS4tXXswLDI1MX1bYS16MC05XSk/JGAsIGlfc3RvcmFnZS5zb3VyY2UpCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDQ6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMTogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgIT0gIm92ZXJsYXlmcyIKICAgIHBfc3RvcmFnZS5vcHRpb25zID09IGlfc3RvcmFnZS5vcHRpb25zCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAxOiB0cnVlIikKfQphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIGNvdW50KHBfc3RvcmFnZS5vcHRpb25zKSA9PSAyCgogICAgcG9saWN5X2lkcyA6PSBzcGxpdChwX3N0b3JhZ2Uub3B0aW9uc1swXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBwb2xpY3lfaWRzID0iLCBwb2xpY3lfaWRzKQogICAgcG9saWN5X2lkcyA9PSBsYXllcl9pZHMKCiAgICBwb2xpY3lfaGFzaGVzIDo9IHNwbGl0KHBfc3RvcmFnZS5vcHRpb25zWzFdLCAiOiIpCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IHBvbGljeV9oYXNoZXMgPSIsIHBvbGljeV9oYXNoZXMpCgogICAgcF9jb3VudCA6PSBjb3VudChwb2xpY3lfaWRzKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBwX2NvdW50ID0iLCBwX2NvdW50KQogICAgcF9jb3VudCA+PSAxCiAgICBwX2NvdW50ID09IGNvdW50KHBvbGljeV9oYXNoZXMpCgogICAgaV9jb3VudCA6PSBjb3VudChpX3N0b3JhZ2Uub3B0aW9ucykKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogaV9jb3VudCA9IiwgaV9jb3VudCkKICAgIGlfY291bnQgPT0gcF9jb3VudCArIDMKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zWzBdID0iLCBpX3N0b3JhZ2Uub3B0aW9uc1swXSkKICAgIGlfc3RvcmFnZS5vcHRpb25zWzBdID09ICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQubGF5ZXItc3JjLXByZWZpeD0vdmFyL2xpYi9jb250YWluZXJkL2lvLmNvbnRhaW5lcmQuc25hcHNob3R0ZXIudjEudGFyZGV2L2xheWVycyIKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zW2lfY291bnQgLSAyXSA9IiwgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDJdKQogICAgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDJdID09ICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQub3ZlcmxheS1ydyIKCiAgICBsb3dlcmRpciA6PSBjb25jYXQoIj0iLCBbImxvd2VyZGlyIiwgcF9zdG9yYWdlLm9wdGlvbnNbMF1dKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBsb3dlcmRpciA9IiwgbG93ZXJkaXIpCgogICAgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDFdID09IGxvd2VyZGlyCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zW2lfY291bnQgLSAxXSA9IiwgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDFdKQoKICAgIGV2ZXJ5IGksIHBvbGljeV9pZCBpbiBwb2xpY3lfaWRzIHsKICAgICAgICBhbGxvd19vdmVybGF5X2xheWVyKHBvbGljeV9pZCwgcG9saWN5X2hhc2hlc1tpXSwgaV9zdG9yYWdlLm9wdGlvbnNbaSArIDFdKQogICAgfQoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogdHJ1ZSIpCn0KYWxsb3dfc3RvcmFnZV9vcHRpb25zKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKSB7CiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDM6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCiAgICBjb3VudChwX3N0b3JhZ2Uub3B0aW9ucykgPT0gMQoKICAgIHN0YXJ0c3dpdGgocF9zdG9yYWdlLm9wdGlvbnNbMF0sICIkKGhhc2giKQogICAgaGFzaF9zdWZmaXggOj0gdHJpbV9sZWZ0KHBfc3RvcmFnZS5vcHRpb25zWzBdLCAiJChoYXNoIikKCiAgICBlbmRzd2l0aChoYXNoX3N1ZmZpeCwgIikiKQogICAgaGFzaF9pbmRleCA6PSB0cmltX3JpZ2h0KGhhc2hfc3VmZml4LCAiKSIpCiAgICBpIDo9IHRvX251bWJlcihoYXNoX2luZGV4KQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAzOiBpID0iLCBpKQoKICAgIGhhc2hfb3B0aW9uIDo9IGNvbmNhdCgiPSIsIFsiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LnJvb3QtaGFzaCIsIHJvb3RfaGFzaGVzW2ldXSkKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMzogaGFzaF9vcHRpb24gPSIsIGhhc2hfb3B0aW9uKQoKICAgIGNvdW50KGlfc3RvcmFnZS5vcHRpb25zKSA9PSA0CiAgICBpX3N0b3JhZ2Uub3B0aW9uc1swXSA9PSAicm8iCiAgICBpX3N0b3JhZ2Uub3B0aW9uc1sxXSA9PSAiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmJsb2NrX2RldmljZT1maWxlIgogICAgaV9zdG9yYWdlLm9wdGlvbnNbMl0gPT0gImlvLmthdGFjb250YWluZXJzLmZzLW9wdC5pcy1sYXllciIKICAgIGlfc3RvcmFnZS5vcHRpb25zWzNdID09IGhhc2hfb3B0aW9uCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAzOiB0cnVlIikKfQphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgNDogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gInNtYiIKICAgIHBfb3B0c19jb3VudCA6PSBjb3VudChwX3N0b3JhZ2Uub3B0aW9ucykKICAgIGlfb3B0c19jb3VudCA6PSBjb3VudChpX3N0b3JhZ2Uub3B0aW9ucykKICAgIGlfb3B0c19jb3VudCA9PSBwX29wdHNfY291bnQgKyAyCgogICAgaV9vcHRfbWF0Y2hlcyA6PSBbaSB8IGkgOj0gaWR4OyBpZHggPCBwX29wdHNfY291bnQ7IHBfc3RvcmFnZS5vcHRpb25zW2lkeF0gPT0gaV9zdG9yYWdlLm9wdGlvbnNbaWR4XV0KICAgIGNvdW50KGlfb3B0X21hdGNoZXMpID09IHBfb3B0c19jb3VudAoKICAgIHN0YXJ0c3dpdGgoaV9zdG9yYWdlLm9wdGlvbnNbaV9vcHRzX2NvdW50LTJdLCAiYWRkcj0iKQogICAgY3JlZHMgPSBzcGxpdChpX3N0b3JhZ2Uub3B0aW9uc1tpX29wdHNfY291bnQtMV0sICIsIikKICAgIGNvdW50KGNyZWRzKSA9PSAyCiAgICBzdGFydHN3aXRoKGNyZWRzWzBdLCAidXNlcm5hbWU9IikKICAgIHN0YXJ0c3dpdGgoY3JlZHNbMV0sICJwYXNzd29yZD0iKQogICAgCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDQ6IHRydWUiKQp9CgphbGxvd19vdmVybGF5X2xheWVyKHBvbGljeV9pZCwgcG9saWN5X2hhc2gsIGlfb3B0aW9uKSB7CiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogcG9saWN5X2lkID0iLCBwb2xpY3lfaWQsICJwb2xpY3lfaGFzaCA9IiwgcG9saWN5X2hhc2gpCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogaV9vcHRpb24gPSIsIGlfb3B0aW9uKQoKICAgIHN0YXJ0c3dpdGgoaV9vcHRpb24sICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQubGF5ZXI9IikKICAgIGlfdmFsdWUgOj0gcmVwbGFjZShpX29wdGlvbiwgImlvLmthdGFjb250YWluZXJzLmZzLW9wdC5sYXllcj0iLCAiIikKICAgIGlfdmFsdWVfZGVjb2RlZCA6PSBiYXNlNjQuZGVjb2RlKGlfdmFsdWUpCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogaV92YWx1ZV9kZWNvZGVkID0iLCBpX3ZhbHVlX2RlY29kZWQpCgogICAgcG9saWN5X3N1ZmZpeCA6PSBjb25jYXQoIj0iLCBbInRhcixybyxpby5rYXRhY29udGFpbmVycy5mcy1vcHQuYmxvY2tfZGV2aWNlPWZpbGUsaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmlzLWxheWVyLGlvLmthdGFjb250YWluZXJzLmZzLW9wdC5yb290LWhhc2giLCBwb2xpY3lfaGFzaF0pCiAgICBwX3ZhbHVlIDo9IGNvbmNhdCgiLCIsIFtwb2xpY3lfaWQsIHBvbGljeV9zdWZmaXhdKQogICAgcHJpbnQoImFsbG93X292ZXJsYXlfbGF5ZXI6IHBfdmFsdWUgPSIsIHBfdmFsdWUpCgogICAgcF92YWx1ZSA9PSBpX3ZhbHVlX2RlY29kZWQKCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogdHJ1ZSIpCn0KCmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAidGFyIgoKICAgIHN0YXJ0c3dpdGgocF9zdG9yYWdlLm1vdW50X3BvaW50LCAiJChsYXllciIpCiAgICBtb3VudF9zdWZmaXggOj0gdHJpbV9sZWZ0KHBfc3RvcmFnZS5tb3VudF9wb2ludCwgIiQobGF5ZXIiKQoKICAgIGVuZHN3aXRoKG1vdW50X3N1ZmZpeCwgIikiKQogICAgbGF5ZXJfaW5kZXggOj0gdHJpbV9yaWdodChtb3VudF9zdWZmaXgsICIpIikKICAgIGkgOj0gdG9fbnVtYmVyKGxheWVyX2luZGV4KQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDE6IGkgPSIsIGkpCgogICAgbGF5ZXJfaWQgOj0gbGF5ZXJfaWRzW2ldCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMTogbGF5ZXJfaWQgPSIsIGxheWVyX2lkKQoKICAgIHBfbW91bnQgOj0gY29uY2F0KCIvIiwgWyIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L2xheWVycyIsIGxheWVyX2lkXSkKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCAxOiBwX21vdW50ID0iLCBwX21vdW50KQoKICAgIHBfbW91bnQgPT0gaV9zdG9yYWdlLm1vdW50X3BvaW50CgogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDE6IHRydWUiKQp9CmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAiZnVzZTMua2F0YS1vdmVybGF5IgoKICAgIG1vdW50MSA6PSByZXBsYWNlKHBfc3RvcmFnZS5tb3VudF9wb2ludCwgIiQoY3BhdGgpIiwgcG9saWN5X2RhdGEuY29tbW9uLmNwYXRoKQogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDI6IG1vdW50MiA9IiwgbW91bnQyKQoKICAgIG1vdW50MiA9PSBpX3N0b3JhZ2UubW91bnRfcG9pbnQKCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMjogdHJ1ZSIpCn0KYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKSB7CiAgICBwX3N0b3JhZ2UuZnN0eXBlID09ICJsb2NhbCIKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQyID0iLCBtb3VudDIpCgogICAgbW91bnQzIDo9IHJlcGxhY2UobW91bnQyLCAiJChzYW5kYm94LWlkKSIsIHNhbmRib3hfaWQpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQzID0iLCBtb3VudDMpCgogICAgcmVnZXgubWF0Y2gobW91bnQzLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCgogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDM6IHRydWUiKQp9CmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAiYmluZCIKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNDogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNDogbW91bnQyID0iLCBtb3VudDIpCgogICAgbW91bnQzIDo9IHJlcGxhY2UobW91bnQyLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDQ6IG1vdW50MyA9IiwgbW91bnQzKQoKICAgIHJlZ2V4Lm1hdGNoKG1vdW50MywgaV9zdG9yYWdlLm1vdW50X3BvaW50KQoKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA0OiB0cnVlIikKfQphbGxvd19tb3VudF9wb2ludChwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgYnVuZGxlX2lkLCBzYW5kYm94X2lkLCBsYXllcl9pZHMpIHsKICAgIHBfc3RvcmFnZS5mc3R5cGUgPT0gInRtcGZzIgoKICAgIG1vdW50MSA6PSBwX3N0b3JhZ2UubW91bnRfcG9pbnQKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA1OiBtb3VudDEgPSIsIG1vdW50MSkKCiAgICByZWdleC5tYXRjaChtb3VudDEsIGlfc3RvcmFnZS5tb3VudF9wb2ludCkKCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNTogdHJ1ZSIpCn0KYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKSB7CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogaV9zdG9yYWdlLm1vdW50X3BvaW50ID0iLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCiAgICBhbGxvd19kaXJlY3Rfdm9sX2RyaXZlcihwX3N0b3JhZ2UsIGlfc3RvcmFnZSkKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChzcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQyID0iLCBtb3VudDIpCgogICAgZGlyZWN0X3ZvbF9wYXRoIDo9IGlfc3RvcmFnZS5zb3VyY2UKICAgIG1vdW50MyA6PSByZXBsYWNlKG1vdW50MiwgIiQoYjY0LWRpcmVjdC12b2wtcGF0aCkiLCBiYXNlNjR1cmwuZW5jb2RlKGRpcmVjdF92b2xfcGF0aCkpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQzID0iLCBtb3VudDMpCgogICAgbW91bnQzID09IGlfc3RvcmFnZS5tb3VudF9wb2ludAoKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA2OiB0cnVlIikKfQoKYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIocF9zdG9yYWdlLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19kaXJlY3Rfdm9sX2RyaXZlciAxOiBzdGFydCIpCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCiAgICBwcmludCgiYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIgMTogdHJ1ZSIpCn0KYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIocF9zdG9yYWdlLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19kaXJlY3Rfdm9sX2RyaXZlciAyOiBzdGFydCIpCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJzbWIiCiAgICBwcmludCgiYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIgMjogdHJ1ZSIpCn0KCiMgRXhlY1Byb2Nlc3NSZXF1ZXN0LnByb2Nlc3MuQ2FwYWJpbGl0aWVzCmFsbG93X2V4ZWNfY2FwcyhpX2NhcHMpIHsKICAgIG5vdCBpX2NhcHMuQW1iaWVudAogICAgbm90IGlfY2Fwcy5Cb3VuZGluZwogICAgbm90IGlfY2Fwcy5FZmZlY3RpdmUKICAgIG5vdCBpX2NhcHMuSW5oZXJpdGFibGUKICAgIG5vdCBpX2NhcHMuUGVybWl0dGVkCn0KCiMgT0NJLlByb2Nlc3MuQ2FwYWJpbGl0aWVzCmFsbG93X2NhcHMocF9jYXBzLCBpX2NhcHMpIHsKICAgIHByaW50KCJhbGxvd19jYXBzOiBwb2xpY3kgQW1iaWVudCA9IiwgcF9jYXBzLkFtYmllbnQpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgQW1iaWVudCA9IiwgaV9jYXBzLkFtYmllbnQpCiAgICBtYXRjaF9jYXBzKHBfY2Fwcy5BbWJpZW50LCBpX2NhcHMuQW1iaWVudCkKCiAgICBwcmludCgiYWxsb3dfY2FwczogcG9saWN5IEJvdW5kaW5nID0iLCBwX2NhcHMuQm91bmRpbmcpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgQm91bmRpbmcgPSIsIGlfY2Fwcy5Cb3VuZGluZykKICAgIG1hdGNoX2NhcHMocF9jYXBzLkJvdW5kaW5nLCBpX2NhcHMuQm91bmRpbmcpCgogICAgcHJpbnQoImFsbG93X2NhcHM6IHBvbGljeSBFZmZlY3RpdmUgPSIsIHBfY2Fwcy5FZmZlY3RpdmUpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgRWZmZWN0aXZlID0iLCBpX2NhcHMuRWZmZWN0aXZlKQogICAgbWF0Y2hfY2FwcyhwX2NhcHMuRWZmZWN0aXZlLCBpX2NhcHMuRWZmZWN0aXZlKQoKICAgIHByaW50KCJhbGxvd19jYXBzOiBwb2xpY3kgSW5oZXJpdGFibGUgPSIsIHBfY2Fwcy5Jbmhlcml0YWJsZSkKICAgIHByaW50KCJhbGxvd19jYXBzOiBpbnB1dCBJbmhlcml0YWJsZSA9IiwgaV9jYXBzLkluaGVyaXRhYmxlKQogICAgbWF0Y2hfY2FwcyhwX2NhcHMuSW5oZXJpdGFibGUsIGlfY2Fwcy5Jbmhlcml0YWJsZSkKCiAgICBwcmludCgiYWxsb3dfY2FwczogcG9saWN5IFBlcm1pdHRlZCA9IiwgcF9jYXBzLlBlcm1pdHRlZCkKICAgIHByaW50KCJhbGxvd19jYXBzOiBpbnB1dCBQZXJtaXR0ZWQgPSIsIGlfY2Fwcy5QZXJtaXR0ZWQpCiAgICBtYXRjaF9jYXBzKHBfY2Fwcy5QZXJtaXR0ZWQsIGlfY2Fwcy5QZXJtaXR0ZWQpCn0KCm1hdGNoX2NhcHMocF9jYXBzLCBpX2NhcHMpIHsKICAgIHByaW50KCJtYXRjaF9jYXBzIDE6IHN0YXJ0IikKCiAgICBwX2NhcHMgPT0gaV9jYXBzCgogICAgcHJpbnQoIm1hdGNoX2NhcHMgMTogdHJ1ZSIpCn0KbWF0Y2hfY2FwcyhwX2NhcHMsIGlfY2FwcykgewogICAgcHJpbnQoIm1hdGNoX2NhcHMgMjogc3RhcnQiKQoKICAgIGNvdW50KHBfY2FwcykgPT0gMQogICAgcF9jYXBzWzBdID09ICIkKGRlZmF1bHRfY2FwcykiCgogICAgcHJpbnQoIm1hdGNoX2NhcHMgMjogZGVmYXVsdF9jYXBzID0iLCBwb2xpY3lfZGF0YS5jb21tb24uZGVmYXVsdF9jYXBzKQogICAgcG9saWN5X2RhdGEuY29tbW9uLmRlZmF1bHRfY2FwcyA9PSBpX2NhcHMKCiAgICBwcmludCgibWF0Y2hfY2FwcyAyOiB0cnVlIikKfQptYXRjaF9jYXBzKHBfY2FwcywgaV9jYXBzKSB7CiAgICBwcmludCgibWF0Y2hfY2FwcyAzOiBzdGFydCIpCgogICAgY291bnQocF9jYXBzKSA9PSAxCiAgICBwX2NhcHNbMF0gPT0gIiQocHJpdmlsZWdlZF9jYXBzKSIKCiAgICBwcmludCgibWF0Y2hfY2FwcyAzOiBwcml2aWxlZ2VkX2NhcHMgPSIsIHBvbGljeV9kYXRhLmNvbW1vbi5wcml2aWxlZ2VkX2NhcHMpCiAgICBwb2xpY3lfZGF0YS5jb21tb24ucHJpdmlsZWdlZF9jYXBzID09IGlfY2FwcwoKICAgIHByaW50KCJtYXRjaF9jYXBzIDM6IHRydWUiKQp9CgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgpjaGVja19kaXJlY3RvcnlfdHJhdmVyc2FsKGlfcGF0aCkgewogICAgbm90IHJlZ2V4Lm1hdGNoKCIoXnwvKS4uKCR8LykiLCBpX3BhdGgpCn0KCmNoZWNrX3N5bWxpbmtfc291cmNlKGlfc3JjKSB7CiAgICBpX3NyYyA9PSAiIgogICAgcHJpbnQoImNoZWNrX3N5bWxpbmtfc291cmNlIDE6IHRydWUiKQp9CmNoZWNrX3N5bWxpbmtfc291cmNlKGlfc3JjKSB7CiAgICBpX3NyYyAhPSAiIgogICAgcHJpbnQoImNoZWNrX3N5bWxpbmtfc291cmNlIDI6IGlfc3JjID0iLCBpX3NyYykKCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24uc19zb3VyY2UxLCBpX3NyYykKCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMjogdHJ1ZSIpCn0KY2hlY2tfc3ltbGlua19zb3VyY2UoaV9zcmMpIHsKICAgIGlfc3JjICE9ICIiCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMzogaV9zcmMgPSIsIGlfc3JjKQoKICAgIHJlZ2V4Lm1hdGNoKHBvbGljeV9kYXRhLmNvbW1vbi5zX3NvdXJjZTIsIGlfc3JjKQogICAgY2hlY2tfZGlyZWN0b3J5X3RyYXZlcnNhbChpX3NyYykKCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMzogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfc3RvcmFnZXMoaV9zdG9yYWdlcykgewogICAgcHJpbnQoImFsbG93X3NhbmRib3hfc3RvcmFnZXM6IGlfc3RvcmFnZXMgPSIsIGlfc3RvcmFnZXMpCgogICAgcF9zdG9yYWdlcyA6PSBwb2xpY3lfZGF0YS5zYW5kYm94LnN0b3JhZ2VzCiAgICBldmVyeSBpX3N0b3JhZ2UgaW4gaV9zdG9yYWdlcyB7CiAgICAgICAgYWxsb3dfc2FuZGJveF9zdG9yYWdlKHBfc3RvcmFnZXMsIGlfc3RvcmFnZSkKICAgIH0KCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9zdG9yYWdlczogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfc3RvcmFnZShwX3N0b3JhZ2VzLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IGlfc3RvcmFnZSA9IiwgaV9zdG9yYWdlKQoKICAgIHNvbWUgcF9zdG9yYWdlIGluIHBfc3RvcmFnZXMKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IHBfc3RvcmFnZSA9IiwgcF9zdG9yYWdlKQogICAgaV9zdG9yYWdlID09IHBfc3RvcmFnZQoKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IHRydWUiKQp9CgpDb3B5RmlsZVJlcXVlc3QgewogICAgcHJpbnQoIkNvcHlGaWxlUmVxdWVzdDogaW5wdXQucGF0aCA9IiwgaW5wdXQucGF0aCkKCiAgICBjaGVja19zeW1saW5rX3NvdXJjZShpbnB1dC5zeW1saW5rX3NyYykKICAgIGNoZWNrX2RpcmVjdG9yeV90cmF2ZXJzYWwoaW5wdXQucGF0aCkKCiAgICBzb21lIHJlZ2V4MSBpbiBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLkNvcHlGaWxlUmVxdWVzdAogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5jcGF0aCkKICAgIHJlZ2V4NCA6PSByZXBsYWNlKHJlZ2V4MywgIiQoYnVuZGxlLWlkKSIsIEJVTkRMRV9JRCkKICAgIHByaW50KCJDb3B5RmlsZVJlcXVlc3Q6IHJlZ2V4NCA9IiwgcmVnZXg0KQoKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4NCwgaW5wdXQucGF0aCkKCiAgICBwcmludCgiQ29weUZpbGVSZXF1ZXN0OiB0cnVlIikKfQoKQ3JlYXRlU2FuZGJveFJlcXVlc3QgewogICAgcHJpbnQoIkNyZWF0ZVNhbmRib3hSZXF1ZXN0OiBpbnB1dC5ndWVzdF9ob29rX3BhdGggPSIsIGlucHV0Lmd1ZXN0X2hvb2tfcGF0aCkKICAgIGNvdW50KGlucHV0Lmd1ZXN0X2hvb2tfcGF0aCkgPT0gMAoKICAgIHByaW50KCJDcmVhdGVTYW5kYm94UmVxdWVzdDogaW5wdXQua2VybmVsX21vZHVsZXMgPSIsIGlucHV0Lmtlcm5lbF9tb2R1bGVzKQogICAgY291bnQoaW5wdXQua2VybmVsX21vZHVsZXMpID09IDAKCiAgICBpX3BpZG5zIDo9IGlucHV0LnNhbmRib3hfcGlkbnMKICAgIHByaW50KCJDcmVhdGVTYW5kYm94UmVxdWVzdDogaV9waWRucyA9IiwgaV9waWRucykKICAgIGlfcGlkbnMgPT0gZmFsc2UKICAgIGFsbG93X3NhbmRib3hfc3RvcmFnZXMoaW5wdXQuc3RvcmFnZXMpCn0KCmFsbG93X2V4ZWMocF9jb250YWluZXIsIGlfcHJvY2VzcykgewogICAgcHJpbnQoImFsbG93X2V4ZWM6IHN0YXJ0IikKCiAgICBwX29jaSA9IHBfY29udGFpbmVyLk9DSQogICAgcF9zX25hbWUgPSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc19uYW1lc3BhY2UgPSBnZXRfc3RhdGVfdmFsKCJuYW1lc3BhY2UiKQogICAgYWxsb3dfcHJvYmVfcHJvY2VzcyhwX29jaS5Qcm9jZXNzLCBpX3Byb2Nlc3MsIHBfc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfZXhlYzogdHJ1ZSIpCn0KCmFsbG93X2ludGVyYWN0aXZlX2V4ZWMocF9jb250YWluZXIsIGlfcHJvY2VzcykgewogICAgcHJpbnQoImFsbG93X2ludGVyYWN0aXZlX2V4ZWM6IHN0YXJ0IikKCiAgICBwX29jaSA9IHBfY29udGFpbmVyLk9DSQogICAgcF9zX25hbWUgPSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc19uYW1lc3BhY2UgPSBnZXRfc3RhdGVfdmFsKCJuYW1lc3BhY2UiKQogICAgYWxsb3dfaW50ZXJhY3RpdmVfcHJvY2VzcyhwX29jaS5Qcm9jZXNzLCBpX3Byb2Nlc3MsIHBfc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfaW50ZXJhY3RpdmVfZXhlYzogdHJ1ZSIpCn0KCiMgVE9ETzogc2hvdWxkIG90aGVyIEV4ZWNQcm9jZXNzUmVxdWVzdCBpbnB1dCBkYXRhIGZpZWxkcyBiZSB2YWxpZGF0ZWQgYXMgd2VsbD8KRXhlY1Byb2Nlc3NSZXF1ZXN0IHsKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMTogaW5wdXQgPSIsIGlucHV0KQoKICAgIHNvbWUgcF9jb21tYW5kIGluIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuRXhlY1Byb2Nlc3NSZXF1ZXN0LmFsbG93ZWRfY29tbWFuZHMKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMTogcF9jb21tYW5kID0iLCBwX2NvbW1hbmQpCiAgICBwX2NvbW1hbmQgPT0gaW5wdXQucHJvY2Vzcy5BcmdzCgogICAgIyBUT0RPOiBtYXRjaCBwX2NvbnRhaW5lcidzIElEIHdpdGggdGhlIGlucHV0IGNvbnRhaW5lcl9pZC4KICAgIHNvbWUgcF9jb250YWluZXIgaW4gcG9saWN5X2RhdGEuY29udGFpbmVycwogICAgYWxsb3dfaW50ZXJhY3RpdmVfZXhlYyhwX2NvbnRhaW5lciwgaW5wdXQucHJvY2VzcykKCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDE6IHRydWUiKQp9CkV4ZWNQcm9jZXNzUmVxdWVzdCB7CiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDI6IGlucHV0ID0iLCBpbnB1dCkKCiAgICAjIFRPRE86IG1hdGNoIGlucHV0IGNvbnRhaW5lciBJRCB3aXRoIGl0cyBjb3JyZXNwb25kaW5nIGNvbnRhaW5lci5leGVjX2NvbW1hbmRzLgogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBzb21lIHBfY29tbWFuZCBpbiBwX2NvbnRhaW5lci5leGVjX2NvbW1hbmRzCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDI6IHBfY29tbWFuZCA9IiwgcF9jb21tYW5kKQoKICAgICMgVE9ETzogc2hvdWxkIG90aGVyIGlucHV0IGRhdGEgZmllbGRzIGJlIHZhbGlkYXRlZCBhcyB3ZWxsPwogICAgcF9jb21tYW5kID09IGlucHV0LnByb2Nlc3MuQXJncwoKICAgIGFsbG93X2V4ZWMocF9jb250YWluZXIsIGlucHV0LnByb2Nlc3MpCgogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAyOiB0cnVlIikKfQpFeGVjUHJvY2Vzc1JlcXVlc3QgewogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAzOiBpbnB1dCA9IiwgaW5wdXQpCgogICAgaV9jb21tYW5kID0gY29uY2F0KCIgIiwgaW5wdXQucHJvY2Vzcy5BcmdzKQogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAzOiBpX2NvbW1hbmQgPSIsIGlfY29tbWFuZCkKCiAgICBzb21lIHBfcmVnZXggaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5FeGVjUHJvY2Vzc1JlcXVlc3QucmVnZXgKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMzogcF9yZWdleCA9IiwgcF9yZWdleCkKCiAgICByZWdleC5tYXRjaChwX3JlZ2V4LCBpX2NvbW1hbmQpCgogICAgIyBUT0RPOiBtYXRjaCBwX2NvbnRhaW5lcidzIElEIHdpdGggdGhlIGlucHV0IGNvbnRhaW5lcl9pZC4KICAgIHNvbWUgcF9jb250YWluZXIgaW4gcG9saWN5X2RhdGEuY29udGFpbmVycwogICAgYWxsb3dfaW50ZXJhY3RpdmVfZXhlYyhwX2NvbnRhaW5lciwgaW5wdXQucHJvY2VzcykKCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDM6IHRydWUiKQp9CgpVcGRhdGVSb3V0ZXNSZXF1ZXN0IHsKICAgIHByaW50KCJVcGRhdGVSb3V0ZXNSZXF1ZXN0OiBpbnB1dCA9IiwgaW5wdXQpCiAgICBwcmludCgiVXBkYXRlUm91dGVzUmVxdWVzdDogcG9saWN5ID0iLCBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLlVwZGF0ZVJvdXRlc1JlcXVlc3QpCgogICAgaV9yb3V0ZXMgOj0gaW5wdXQucm91dGVzLlJvdXRlcwogICAgcF9zb3VyY2VfcmVnZXggPSBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLlVwZGF0ZVJvdXRlc1JlcXVlc3QuZm9yYmlkZGVuX3NvdXJjZV9yZWdleAogICAgcF9uYW1lcyA9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuVXBkYXRlUm91dGVzUmVxdWVzdC5mb3JiaWRkZW5fZGV2aWNlX25hbWVzCgogICAgZXZlcnkgaV9yb3V0ZSBpbiBpX3JvdXRlcyB7CiAgICAgICAgcHJpbnQoImlfcm91dGUuc291cmNlID0iLCBpX3JvdXRlLnNvdXJjZSkKICAgICAgICBldmVyeSBwX3JlZ2V4IGluIHBfc291cmNlX3JlZ2V4IHsKICAgICAgICAgICAgcHJpbnQoInBfcmVnZXggPSIsIHBfcmVnZXgpCiAgICAgICAgICAgIG5vdCByZWdleC5tYXRjaChwX3JlZ2V4LCBpX3JvdXRlLnNvdXJjZSkKICAgICAgICB9CgogICAgICAgIHByaW50KCJpX3JvdXRlLmRldmljZSA9IiwgaV9yb3V0ZS5kZXZpY2UpCiAgICAgICAgbm90IGlfcm91dGUuZGV2aWNlIGluIHBfbmFtZXMKICAgIH0KCiAgICBwcmludCgiVXBkYXRlUm91dGVzUmVxdWVzdDogdHJ1ZSIpCn0KClVwZGF0ZUludGVyZmFjZVJlcXVlc3QgewogICAgcHJpbnQoIlVwZGF0ZUludGVyZmFjZVJlcXVlc3Q6IGlucHV0ID0iLCBpbnB1dCkKICAgIHByaW50KCJVcGRhdGVJbnRlcmZhY2VSZXF1ZXN0OiBwb2xpY3kgPSIsIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuVXBkYXRlSW50ZXJmYWNlUmVxdWVzdCkKCiAgICBpX2ludGVyZmFjZSA6PSBpbnB1dC5pbnRlcmZhY2UKICAgIHBfZmxhZ3MgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmFsbG93X3Jhd19mbGFncwoKICAgICMgVHlwaWNhbGx5LCBqdXN0IElGRl9OT0FSUCBpcyB1c2VkLgogICAgYml0cy5hbmQoaV9pbnRlcmZhY2UucmF3X2ZsYWdzLCBiaXRzLm5lZ2F0ZShwX2ZsYWdzKSkgPT0gMAoKICAgIHBfbmFtZXMgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmZvcmJpZGRlbl9uYW1lcwoKICAgIG5vdCBpX2ludGVyZmFjZS5uYW1lIGluIHBfbmFtZXMKCiAgICBwX2h3YWRkcnMgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmZvcmJpZGRlbl9od19hZGRycwoKICAgIG5vdCBpX2ludGVyZmFjZS5od0FkZHIgaW4gcF9od2FkZHJzCgogICAgcHJpbnQoIlVwZGF0ZUludGVyZmFjZVJlcXVlc3Q6IHRydWUiKQp9CgpDbG9zZVN0ZGluUmVxdWVzdCB7CiAgICBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLkNsb3NlU3RkaW5SZXF1ZXN0ID09IHRydWUKfQoKUmVhZFN0cmVhbVJlcXVlc3QgewogICAgcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5SZWFkU3RyZWFtUmVxdWVzdCA9PSB0cnVlCn0KClVwZGF0ZUVwaGVtZXJhbE1vdW50c1JlcXVlc3QgewogICAgcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVFcGhlbWVyYWxNb3VudHNSZXF1ZXN0ID09IHRydWUKfQoKV3JpdGVTdHJlYW1SZXF1ZXN0IHsKICAgIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuV3JpdGVTdHJlYW1SZXF1ZXN0ID09IHRydWUKfQoKcG9saWN5X2RhdGEgOj0gewogICJjb250YWluZXJzIjogWwogICAgewogICAgICAiT0NJIjogewogICAgICAgICJWZXJzaW9uIjogIjEuMS4wLXJjLjEiLAogICAgICAgICJQcm9jZXNzIjogewogICAgICAgICAgIlRlcm1pbmFsIjogZmFsc2UsCiAgICAgICAgICAiVXNlciI6IHsKICAgICAgICAgICAgIlVJRCI6IDY1NTM1LAogICAgICAgICAgICAiR0lEIjogNjU1MzUsCiAgICAgICAgICAgICJBZGRpdGlvbmFsR2lkcyI6IFtdLAogICAgICAgICAgICAiVXNlcm5hbWUiOiAiIgogICAgICAgICAgfSwKICAgICAgICAgICJEZXByZWNhdGVkQXJncyI6IFsKICAgICAgICAgICAgIi9wYXVzZSIKICAgICAgICAgIF0sCiAgICAgICAgICAiQXJncyI6IFsKICAgICAgICAgICAgIi9wYXVzZSIKICAgICAgICAgIF0sCiAgICAgICAgICAiRW52IjogWwogICAgICAgICAgICAiUEFUSD0vdXNyL2xvY2FsL3NiaW46L3Vzci9sb2NhbC9iaW46L3Vzci9zYmluOi91c3IvYmluOi9zYmluOi9iaW4iCiAgICAgICAgICBdLAogICAgICAgICAgIkN3ZCI6ICIvIiwKICAgICAgICAgICJDYXBhYmlsaXRpZXMiOiB7CiAgICAgICAgICAgICJBbWJpZW50IjogW10sCiAgICAgICAgICAgICJCb3VuZGluZyI6IFsKICAgICAgICAgICAgICAiJChkZWZhdWx0X2NhcHMpIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiRWZmZWN0aXZlIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJJbmhlcml0YWJsZSI6IFtdLAogICAgICAgICAgICAiUGVybWl0dGVkIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICAiTm9OZXdQcml2aWxlZ2VzIjogdHJ1ZQogICAgICAgIH0sCiAgICAgICAgIlJvb3QiOiB7CiAgICAgICAgICAiUGF0aCI6ICIkKGNwYXRoKS8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgIlJlYWRvbmx5IjogdHJ1ZQogICAgICAgIH0sCiAgICAgICAgIk1vdW50cyI6IFsKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9wcm9jIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJwcm9jIiwKICAgICAgICAgICAgInR5cGVfIjogInByb2MiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2IiwKICAgICAgICAgICAgInNvdXJjZSI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJzdHJpY3RhdGltZSIsCiAgICAgICAgICAgICAgIm1vZGU9NzU1IiwKICAgICAgICAgICAgICAic2l6ZT02NTUzNmsiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L3B0cyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiZGV2cHRzIiwKICAgICAgICAgICAgInR5cGVfIjogImRldnB0cyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJuZXdpbnN0YW5jZSIsCiAgICAgICAgICAgICAgInB0bXhtb2RlPTA2NjYiLAogICAgICAgICAgICAgICJtb2RlPTA2MjAiLAogICAgICAgICAgICAgICJnaWQ9NSIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvc2htIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L3NobSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi9tcXVldWUiLAogICAgICAgICAgICAic291cmNlIjogIm1xdWV1ZSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJtcXVldWUiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvc3lzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJzeXNmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJzeXNmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2V0Yy9yZXNvbHYuY29uZiIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClyZXNvbHYuY29uZiQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJvIiwKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9kZXYiLAogICAgICAgICAgICAgICJub2V4ZWMiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0KICAgICAgICBdLAogICAgICAgICJBbm5vdGF0aW9ucyI6IHsKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmJ1bmRsZV9wYXRoIjogIi9ydW4vY29udGFpbmVyZC9pby5jb250YWluZXJkLnJ1bnRpbWUudjIudGFzay9rOHMuaW8vJChidW5kbGUtaWQpIiwKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIjogInBvZF9zYW5kYm94IiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSI6ICJzYW5kYm94IiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWlkIjogIl5bYS16MC05XXs2NH0kIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWxvZy1kaXJlY3RvcnkiOiAiXi92YXIvbG9nL3BvZHMvJChzYW5kYm94LW5hbWVzcGFjZSlfJChzYW5kYm94LW5hbWUpX1swLTlhLWZdezh9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezEyfSQiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZXNwYWNlIjogIiIsCiAgICAgICAgICAibmVyZGN0bC9uZXR3b3JrLW5hbWVzcGFjZSI6ICJeL3Zhci9ydW4vbmV0bnMvY25pLVswLTlhLWZdezh9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezEyfSQiCiAgICAgICAgfSwKICAgICAgICAiTGludXgiOiB7CiAgICAgICAgICAiTmFtZXNwYWNlcyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICJUeXBlIjogImlwYyIsCiAgICAgICAgICAgICAgIlBhdGgiOiAiIgogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgIlR5cGUiOiAidXRzIiwKICAgICAgICAgICAgICAiUGF0aCI6ICIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiVHlwZSI6ICJtb3VudCIsCiAgICAgICAgICAgICAgIlBhdGgiOiAiIgogICAgICAgICAgICB9CiAgICAgICAgICBdLAogICAgICAgICAgIk1hc2tlZFBhdGhzIjogWwogICAgICAgICAgICAiL3Byb2MvYWNwaSIsCiAgICAgICAgICAgICIvcHJvYy9hc291bmQiLAogICAgICAgICAgICAiL3Byb2Mva2NvcmUiLAogICAgICAgICAgICAiL3Byb2Mva2V5cyIsCiAgICAgICAgICAgICIvcHJvYy9sYXRlbmN5X3N0YXRzIiwKICAgICAgICAgICAgIi9wcm9jL3RpbWVyX2xpc3QiLAogICAgICAgICAgICAiL3Byb2MvdGltZXJfc3RhdHMiLAogICAgICAgICAgICAiL3Byb2Mvc2NoZWRfZGVidWciLAogICAgICAgICAgICAiL3N5cy9maXJtd2FyZSIsCiAgICAgICAgICAgICIvcHJvYy9zY3NpIgogICAgICAgICAgXSwKICAgICAgICAgICJSZWFkb25seVBhdGhzIjogWwogICAgICAgICAgICAiL3Byb2MvYnVzIiwKICAgICAgICAgICAgIi9wcm9jL2ZzIiwKICAgICAgICAgICAgIi9wcm9jL2lycSIsCiAgICAgICAgICAgICIvcHJvYy9zeXMiLAogICAgICAgICAgICAiL3Byb2Mvc3lzcnEtdHJpZ2dlciIKICAgICAgICAgIF0sCiAgICAgICAgICAiRGV2aWNlcyI6IFtdLAogICAgICAgICAgIlN5c2N0bCI6IHsKICAgICAgICAgICAgIm5ldC5pcHY0LmlwX3VucHJpdmlsZWdlZF9wb3J0X3N0YXJ0IjogIjAiLAogICAgICAgICAgICAibmV0LmlwdjQucGluZ19ncm91cF9yYW5nZSI6ICIwIDIxNDc0ODM2NDciCiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9LAogICAgICAic3RvcmFnZXMiOiBbCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJibGsiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogInRhciIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIiQoaGFzaDApIgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGxheWVyMCkiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJvdmVybGF5ZnMiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogImZ1c2UzLmthdGEtb3ZlcmxheSIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIjVhNWFhZDgwMDU1ZmYyMDAxMmE1MGRjMjVmOGRmN2EyOTkyNDQ3NDMyNGQ2NWY3ZDUzMDZlZThlZTI3ZmY3MWQiLAogICAgICAgICAgICAiODE3MjUwZjFhM2UzMzZkYTc2ZjViZDNmYTc4NGUxYjI2ZDk1OWI5YzEzMTg3NjgxNWJhMjYwNDA0OGI3MGMxOCIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChjcGF0aCkvJChidW5kbGUtaWQpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9CiAgICAgIF0sCiAgICAgICJkZXZpY2VzIjogW10sCiAgICAgICJzYW5kYm94X3BpZG5zIjogZmFsc2UsCiAgICAgICJleGVjX2NvbW1hbmRzIjogW10sCiAgICAgICJlbnZfbWFwIjogewogICAgICAgICJQQVRIIjogIi91c3IvbG9jYWwvc2JpbjovdXNyL2xvY2FsL2JpbjovdXNyL3NiaW46L3Vzci9iaW46L3NiaW46L2JpbiIKICAgICAgfQogICAgfSwKICAgIHsKICAgICAgIk9DSSI6IHsKICAgICAgICAiVmVyc2lvbiI6ICIxLjEuMC1yYy4xIiwKICAgICAgICAiUHJvY2VzcyI6IHsKICAgICAgICAgICJUZXJtaW5hbCI6IGZhbHNlLAogICAgICAgICAgIlVzZXIiOiB7CiAgICAgICAgICAgICJVSUQiOiAwLAogICAgICAgICAgICAiR0lEIjogMCwKICAgICAgICAgICAgIkFkZGl0aW9uYWxHaWRzIjogW10sCiAgICAgICAgICAgICJVc2VybmFtZSI6ICIiCiAgICAgICAgICB9LAogICAgICAgICAgIkRlcHJlY2F0ZWRBcmdzIjogWwogICAgICAgICAgICAibmdpbngiLAogICAgICAgICAgICAiLWciLAogICAgICAgICAgICAiZGFlbW9uIG9mZjsiCiAgICAgICAgICBdLAogICAgICAgICAgIkFyZ3MiOiBbCiAgICAgICAgICAgICJuZ2lueCIsCiAgICAgICAgICAgICItZyIsCiAgICAgICAgICAgICJkYWVtb24gb2ZmOyIKICAgICAgICAgIF0sCiAgICAgICAgICAiRW52IjogWwogICAgICAgICAgICAiUEFUSD0vdXNyL2xvY2FsL3NiaW46L3Vzci9sb2NhbC9iaW46L3Vzci9zYmluOi91c3IvYmluOi9zYmluOi9iaW4iLAogICAgICAgICAgICAiSE9TVE5BTUU9JChob3N0LW5hbWUpIgogICAgICAgICAgXSwKICAgICAgICAgICJDd2QiOiAiLyIsCiAgICAgICAgICAiQ2FwYWJpbGl0aWVzIjogewogICAgICAgICAgICAiQW1iaWVudCI6IFtdLAogICAgICAgICAgICAiQm91bmRpbmciOiBbCiAgICAgICAgICAgICAgIiQoZGVmYXVsdF9jYXBzKSIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgIkVmZmVjdGl2ZSI6IFsKICAgICAgICAgICAgICAiJChkZWZhdWx0X2NhcHMpIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiSW5oZXJpdGFibGUiOiBbXSwKICAgICAgICAgICAgIlBlcm1pdHRlZCI6IFsKICAgICAgICAgICAgICAiJChkZWZhdWx0X2NhcHMpIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgIk5vTmV3UHJpdmlsZWdlcyI6IGZhbHNlCiAgICAgICAgfSwKICAgICAgICAiUm9vdCI6IHsKICAgICAgICAgICJQYXRoIjogIiQoY3BhdGgpLyQoYnVuZGxlLWlkKSIsCiAgICAgICAgICAiUmVhZG9ubHkiOiBmYWxzZQogICAgICAgIH0sCiAgICAgICAgIk1vdW50cyI6IFsKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9wcm9jIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJwcm9jIiwKICAgICAgICAgICAgInR5cGVfIjogInByb2MiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2IiwKICAgICAgICAgICAgInNvdXJjZSI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJzdHJpY3RhdGltZSIsCiAgICAgICAgICAgICAgIm1vZGU9NzU1IiwKICAgICAgICAgICAgICAic2l6ZT02NTUzNmsiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L3B0cyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiZGV2cHRzIiwKICAgICAgICAgICAgInR5cGVfIjogImRldnB0cyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJuZXdpbnN0YW5jZSIsCiAgICAgICAgICAgICAgInB0bXhtb2RlPTA2NjYiLAogICAgICAgICAgICAgICJtb2RlPTA2MjAiLAogICAgICAgICAgICAgICJnaWQ9NSIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvc2htIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L3NobSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi9tcXVldWUiLAogICAgICAgICAgICAic291cmNlIjogIm1xdWV1ZSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJtcXVldWUiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvc3lzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJzeXNmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJzeXNmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL3N5cy9mcy9jZ3JvdXAiLAogICAgICAgICAgICAic291cmNlIjogImNncm91cCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJjZ3JvdXAiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiLAogICAgICAgICAgICAgICJyZWxhdGltZSIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2V0Yy9ob3N0cyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClob3N0cyQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicnciCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L3Rlcm1pbmF0aW9uLWxvZyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeCl0ZXJtaW5hdGlvbi1sb2ckIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJ3IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2V0Yy9ob3N0bmFtZSIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClob3N0bmFtZSQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicnciCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZXRjL3Jlc29sdi5jb25mIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KXJlc29sdi5jb25mJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJydyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi92YXIvcnVuL3NlY3JldHMva3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudCIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClzZXJ2aWNlYWNjb3VudCQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicm8iCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvdmFyL3J1bi9zZWNyZXRzL2F6dXJlL3Rva2VucyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeCl0b2tlbnMkIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9CiAgICAgICAgXSwKICAgICAgICAiQW5ub3RhdGlvbnMiOiB7CiAgICAgICAgICAiaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5idW5kbGVfcGF0aCI6ICIvcnVuL2NvbnRhaW5lcmQvaW8uY29udGFpbmVyZC5ydW50aW1lLnYyLnRhc2svazhzLmlvLyQoYnVuZGxlLWlkKSIsCiAgICAgICAgICAiaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5jb250YWluZXJfdHlwZSI6ICJwb2RfY29udGFpbmVyIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItbmFtZSI6ICJuZ2lueCIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLXR5cGUiOiAiY29udGFpbmVyIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5pbWFnZS1uYW1lIjogIm1hcmluZXJjb25mcG9kc3Rlc3QuYXp1cmVjci5pby9henVyZWxpbnV4L2Jhc2Uvbmdpbng6MS4yNSIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCI6ICJeW2EtejAtOV17NjR9JCIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1uYW1lc3BhY2UiOiAiIgogICAgICAgIH0sCiAgICAgICAgIkxpbnV4IjogewogICAgICAgICAgIk5hbWVzcGFjZXMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiVHlwZSI6ICJpcGMiLAogICAgICAgICAgICAgICJQYXRoIjogIiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJUeXBlIjogInV0cyIsCiAgICAgICAgICAgICAgIlBhdGgiOiAiIgogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgIlR5cGUiOiAibW91bnQiLAogICAgICAgICAgICAgICJQYXRoIjogIiIKICAgICAgICAgICAgfQogICAgICAgICAgXSwKICAgICAgICAgICJNYXNrZWRQYXRocyI6IFsKICAgICAgICAgICAgIi9wcm9jL2FjcGkiLAogICAgICAgICAgICAiL3Byb2Mva2NvcmUiLAogICAgICAgICAgICAiL3Byb2Mva2V5cyIsCiAgICAgICAgICAgICIvcHJvYy9sYXRlbmN5X3N0YXRzIiwKICAgICAgICAgICAgIi9wcm9jL3RpbWVyX2xpc3QiLAogICAgICAgICAgICAiL3Byb2MvdGltZXJfc3RhdHMiLAogICAgICAgICAgICAiL3Byb2Mvc2NoZWRfZGVidWciLAogICAgICAgICAgICAiL3Byb2Mvc2NzaSIsCiAgICAgICAgICAgICIvc3lzL2Zpcm13YXJlIgogICAgICAgICAgXSwKICAgICAgICAgICJSZWFkb25seVBhdGhzIjogWwogICAgICAgICAgICAiL3Byb2MvYXNvdW5kIiwKICAgICAgICAgICAgIi9wcm9jL2J1cyIsCiAgICAgICAgICAgICIvcHJvYy9mcyIsCiAgICAgICAgICAgICIvcHJvYy9pcnEiLAogICAgICAgICAgICAiL3Byb2Mvc3lzIiwKICAgICAgICAgICAgIi9wcm9jL3N5c3JxLXRyaWdnZXIiCiAgICAgICAgICBdLAogICAgICAgICAgIkRldmljZXMiOiBbXSwKICAgICAgICAgICJTeXNjdGwiOiB7CiAgICAgICAgICAgICJuZXQuaXB2NC5pcF91bnByaXZpbGVnZWRfcG9ydF9zdGFydCI6ICIwIiwKICAgICAgICAgICAgIm5ldC5pcHY0LnBpbmdfZ3JvdXBfcmFuZ2UiOiAiMCAyMTQ3NDgzNjQ3IgogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSwKICAgICAgInN0b3JhZ2VzIjogWwogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2gwKSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjApIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2gxKSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjEpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2gyKSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjIpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2gzKSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjMpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2g0KSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjQpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAib3ZlcmxheWZzIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJmdXNlMy5rYXRhLW92ZXJsYXkiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICI4YmZiYmE3Njk2NjM2NTI0MDRhNjRhMjNhN2VlYWI3OTQzOGRhZWQ3MWFjY2YzMjlhNDBhNGY2OGVmYWYwZmY0OjhjYzdhZmJjZGQwNGYxN2FmZjhmNmQ0OTM1ZTRmNTRhMWY1YWRkNDdkY2E1MTZlOGQzNTQ1M2YxZjQyMTgxNjc6OTAzMGU2MGFhOGQ4YWI5YzI3ZjA1MWUyYzc4NWE1NDlkOGFlYzE4ODgxNjk5ZWFiMzIwYTA0MDlmN2ZkYmUzOTozNmFmOWMwODE0NmU2ZDI1MWQ1MTNlNTllNWExYzYyZDYyY2ZiOWViZTg1NmQ3NTM5NGJlZmRkZWNlNzQ4NGMxOjAxNjVhMGMwNzg2NTc3NWRlYTgzYTQ1MTdjMTI1ZmYzMGMxZTJjMWEwOThlN2NiY2U3YmNhZmUyYjcxOTljYmMiLAogICAgICAgICAgICAiMjQ5ZWY1NWZjZDQxMWM1YTgwNTRhYmI2MGU3MTUxMTVkNTk5ZWJiZTY4MmQ2Yjc0YmUzYmQxOTI3MjQ4ODVjMTo1MDJiNTM3MjAxYzcxMTVlZjBkMTcxNTMwYzdjZjVjMGU1MTE3NTRlOWM5NWYwNTk0MWVjMjdkMTVjOWUwMTk4OjQ4YWExMThmZGZkYTlhMzAzODdlOTBlMDY2MWYyYjViNmM4ZTg3MzU0ZDFmYTlhMzdiZjU4NTEzYWMzZTQ1MTI6OWY2MjU0NjRjN2IzNGE1NTM2ZjQzMWY1ZDI5NDYzNDNkMjcyNTgwZTM2NDQ2ZGRiMTJiMDQwMTYyZTU0M2NlMTpkNDQ5MWVhMTg4NzEwNWVmMDYwMWY0ZTVmYTM5ODNmZmU1N2Q3YTU3ZWU4ZjZiMDM3MDkxZjQyMThjMWE2MzU4IgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGNwYXRoKS8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0KICAgICAgXSwKICAgICAgImRldmljZXMiOiBbXSwKICAgICAgInNhbmRib3hfcGlkbnMiOiBmYWxzZSwKICAgICAgImV4ZWNfY29tbWFuZHMiOiBbXSwKICAgICAgImVudl9tYXAiOiB7CiAgICAgICAgIkhPU1ROQU1FIjogIiQoaG9zdC1uYW1lKSIsCiAgICAgICAgIlBBVEgiOiAiL3Vzci9sb2NhbC9zYmluOi91c3IvbG9jYWwvYmluOi91c3Ivc2JpbjovdXNyL2Jpbjovc2JpbjovYmluIgogICAgICB9CiAgICB9CiAgXSwKICAiY29tbW9uIjogewogICAgImNwYXRoIjogIi9ydW4va2F0YS1jb250YWluZXJzL3NoYXJlZC9jb250YWluZXJzIiwKICAgICJtb3VudF9zb3VyY2VfY3BhdGgiOiAiL3J1bi9rYXRhLWNvbnRhaW5lcnMvc2hhcmVkL2NvbnRhaW5lcnMiLAogICAgInNmcHJlZml4IjogIl4kKGNwYXRoKS8kKGJ1bmRsZS1pZCktW2EtejAtOV17MTZ9LSIsCiAgICAic3BhdGgiOiAiL3J1bi9rYXRhLWNvbnRhaW5lcnMvc2FuZGJveC9zdG9yYWdlIiwKICAgICJpcHY0X2EiOiAiKChbMC05XXxbMS05XVswLTldfDFbMC05XXsyfXwyWzAtNF1bMC05XXwyNVswLTVdKVxcLil7M30oWzAtOV18WzEtOV1bMC05XXwxWzAtOV17Mn18MlswLTRdWzAtOV18MjVbMC01XSkiLAogICAgImlwX3AiOiAiWzAtOV17MSw1fSIsCiAgICAic3ZjX25hbWUiOiAiW0EtWl9cXC5cXC1dKyIsCiAgICAiZG5zX2xhYmVsIjogIlthLXpBLVowLTlfXFwuXFwtXSsiLAogICAgInNfc291cmNlMSI6ICJeLi4yWzAtOV17M31fWzAtMV1bMC05XV9bMC0zXVswLTldX1swLTJdWzAtOV1fWzAtNV1bMC05XV9bMC01XVswLTldXFwuWzAtOV17MSwxMH0kIiwKICAgICJzX3NvdXJjZTIiOiAiXi4uZGF0YS8iLAogICAgImRuc19zdWJkb21haW4iOiAiXlthLXowLTldKFstYS16MC05XSpbYS16MC05XSk/JCIsCiAgICAicG9kX3VpZCI6ICJeWzAtOWEtZkEtRl17OH0tWzAtOWEtZkEtRl17NH0tWzAtOWEtZkEtRl17NH0tWzAtOWEtZkEtRl17NH0tWzAtOWEtZkEtRl17MTJ9JCIsCiAgICAiZGVmYXVsdF9jYXBzIjogWwogICAgICAiQ0FQX0NIT1dOIiwKICAgICAgIkNBUF9EQUNfT1ZFUlJJREUiLAogICAgICAiQ0FQX0ZTRVRJRCIsCiAgICAgICJDQVBfRk9XTkVSIiwKICAgICAgIkNBUF9NS05PRCIsCiAgICAgICJDQVBfTkVUX1JBVyIsCiAgICAgICJDQVBfU0VUR0lEIiwKICAgICAgIkNBUF9TRVRVSUQiLAogICAgICAiQ0FQX1NFVEZDQVAiLAogICAgICAiQ0FQX1NFVFBDQVAiLAogICAgICAiQ0FQX05FVF9CSU5EX1NFUlZJQ0UiLAogICAgICAiQ0FQX1NZU19DSFJPT1QiLAogICAgICAiQ0FQX0tJTEwiLAogICAgICAiQ0FQX0FVRElUX1dSSVRFIgogICAgXSwKICAgICJwcml2aWxlZ2VkX2NhcHMiOiBbCiAgICAgICJDQVBfQ0hPV04iLAogICAgICAiQ0FQX0RBQ19PVkVSUklERSIsCiAgICAgICJDQVBfREFDX1JFQURfU0VBUkNIIiwKICAgICAgIkNBUF9GT1dORVIiLAogICAgICAiQ0FQX0ZTRVRJRCIsCiAgICAgICJDQVBfS0lMTCIsCiAgICAgICJDQVBfU0VUR0lEIiwKICAgICAgIkNBUF9TRVRVSUQiLAogICAgICAiQ0FQX1NFVFBDQVAiLAogICAgICAiQ0FQX0xJTlVYX0lNTVVUQUJMRSIsCiAgICAgICJDQVBfTkVUX0JJTkRfU0VSVklDRSIsCiAgICAgICJDQVBfTkVUX0JST0FEQ0FTVCIsCiAgICAgICJDQVBfTkVUX0FETUlOIiwKICAgICAgIkNBUF9ORVRfUkFXIiwKICAgICAgIkNBUF9JUENfTE9DSyIsCiAgICAgICJDQVBfSVBDX09XTkVSIiwKICAgICAgIkNBUF9TWVNfTU9EVUxFIiwKICAgICAgIkNBUF9TWVNfUkFXSU8iLAogICAgICAiQ0FQX1NZU19DSFJPT1QiLAogICAgICAiQ0FQX1NZU19QVFJBQ0UiLAogICAgICAiQ0FQX1NZU19QQUNDVCIsCiAgICAgICJDQVBfU1lTX0FETUlOIiwKICAgICAgIkNBUF9TWVNfQk9PVCIsCiAgICAgICJDQVBfU1lTX05JQ0UiLAogICAgICAiQ0FQX1NZU19SRVNPVVJDRSIsCiAgICAgICJDQVBfU1lTX1RJTUUiLAogICAgICAiQ0FQX1NZU19UVFlfQ09ORklHIiwKICAgICAgIkNBUF9NS05PRCIsCiAgICAgICJDQVBfTEVBU0UiLAogICAgICAiQ0FQX0FVRElUX1dSSVRFIiwKICAgICAgIkNBUF9BVURJVF9DT05UUk9MIiwKICAgICAgIkNBUF9TRVRGQ0FQIiwKICAgICAgIkNBUF9NQUNfT1ZFUlJJREUiLAogICAgICAiQ0FQX01BQ19BRE1JTiIsCiAgICAgICJDQVBfU1lTTE9HIiwKICAgICAgIkNBUF9XQUtFX0FMQVJNIiwKICAgICAgIkNBUF9CTE9DS19TVVNQRU5EIiwKICAgICAgIkNBUF9BVURJVF9SRUFEIiwKICAgICAgIkNBUF9QRVJGTU9OIiwKICAgICAgIkNBUF9CUEYiLAogICAgICAiQ0FQX0NIRUNLUE9JTlRfUkVTVE9SRSIKICAgIF0sCiAgICAidmlydGlvX2Jsa19zdG9yYWdlX2NsYXNzZXMiOiBbCiAgICAgICJjYy1sb2NhbC1jc2kiLAogICAgICAiY2MtbWFuYWdlZC1jc2kiLAogICAgICAiY2MtbWFuYWdlZC1wcmVtaXVtLWNzaSIKICAgIF0sCiAgICAic21iX3N0b3JhZ2VfY2xhc3NlcyI6IFsKICAgICAgewogICAgICAgICJuYW1lIjogImF6dXJlZmlsZS1jc2kta2F0YS1jYyIsCiAgICAgICAgIm1vdW50X29wdGlvbnMiOiBbCiAgICAgICAgICAiZGlyX21vZGU9MDc3NyIsCiAgICAgICAgICAiZmlsZV9tb2RlPTA3NzciLAogICAgICAgICAgIm1mc3ltbGlua3MiLAogICAgICAgICAgImNhY2hlPXN0cmljdCIsCiAgICAgICAgICAibm9zaGFyZXNvY2siLAogICAgICAgICAgImFjdGltZW89MzAiLAogICAgICAgICAgIm5vYnJsIgogICAgICAgIF0KICAgICAgfQogICAgXQogIH0sCiAgInNhbmRib3giOiB7CiAgICAic3RvcmFnZXMiOiBbCiAgICAgIHsKICAgICAgICAiZHJpdmVyIjogImVwaGVtZXJhbCIsCiAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgInNvdXJjZSI6ICJzaG0iLAogICAgICAgICJmc3R5cGUiOiAidG1wZnMiLAogICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICJub2RldiIsCiAgICAgICAgICAibW9kZT0xNzc3IiwKICAgICAgICAgICJzaXplPTY3MTA4ODY0IgogICAgICAgIF0sCiAgICAgICAgIm1vdW50X3BvaW50IjogIi9ydW4va2F0YS1jb250YWluZXJzL3NhbmRib3gvc2htIiwKICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgIH0KICAgIF0KICB9LAogICJyZXF1ZXN0X2RlZmF1bHRzIjogewogICAgIkNyZWF0ZUNvbnRhaW5lclJlcXVlc3QiOiB7CiAgICAgICJhbGxvd19lbnZfcmVnZXgiOiBbCiAgICAgICAgIl5IT1NUTkFNRT0kKGRuc19sYWJlbCkkIiwKICAgICAgICAiXiQoc3ZjX25hbWUpX1BPUlRfJChpcF9wKV9UQ1A9dGNwOi8vJChpcHY0X2EpOiQoaXBfcCkkIiwKICAgICAgICAiXiQoc3ZjX25hbWUpX1BPUlRfJChpcF9wKV9UQ1BfUFJPVE89dGNwJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9QT1JUXyQoaXBfcClfVENQX1BPUlQ9JChpcF9wKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfUE9SVF8kKGlwX3ApX1RDUF9BRERSPSQoaXB2NF9hKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfU0VSVklDRV9IT1NUPSQoaXB2NF9hKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfU0VSVklDRV9QT1JUPSQoaXBfcCkkIiwKICAgICAgICAiXiQoc3ZjX25hbWUpX1NFUlZJQ0VfUE9SVF8kKGRuc19sYWJlbCk9JChpcF9wKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfUE9SVD10Y3A6Ly8kKGlwdjRfYSk6JChpcF9wKSQiLAogICAgICAgICJeQVpVUkVfQ0xJRU5UX0lEPVtBLUZhLWYwLTktXSokIiwKICAgICAgICAiXkFaVVJFX1RFTkFOVF9JRD1bQS1GYS1mMC05LV0qJCIsCiAgICAgICAgIl5BWlVSRV9GRURFUkFURURfVE9LRU5fRklMRT0vdmFyL3J1bi9zZWNyZXRzL2F6dXJlL3Rva2Vucy9henVyZS1pZGVudGl0eS10b2tlbiQiLAogICAgICAgICJeQVpVUkVfQVVUSE9SSVRZX0hPU1Q9aHR0cHM6Ly9sb2dpblxcLm1pY3Jvc29mdG9ubGluZVxcLmNvbS8kIiwKICAgICAgICAiXlRFUk09eHRlcm0kIgogICAgICBdLAogICAgICAiYWxsb3dfZW52X3JlZ2V4X21hcCI6IHsKICAgICAgICAiQ1BVX0xJTUlUIjogIl5bMC05XSskIiwKICAgICAgICAiSk9CX0NPTVBMRVRJT05fSU5ERVgiOiAiXlswLTldKiQiLAogICAgICAgICJNRU1PUllfTElNSVQiOiAiXlswLTldKyQiCiAgICAgIH0KICAgIH0sCiAgICAiQ29weUZpbGVSZXF1ZXN0IjogWwogICAgICAiJChzZnByZWZpeCkiCiAgICBdLAogICAgIkV4ZWNQcm9jZXNzUmVxdWVzdCI6IHsKICAgICAgImFsbG93ZWRfY29tbWFuZHMiOiBbXSwKICAgICAgInJlZ2V4IjogW10KICAgIH0sCiAgICAiVXBkYXRlUm91dGVzUmVxdWVzdCI6IHsKICAgICAgImZvcmJpZGRlbl9kZXZpY2VfbmFtZXMiOiBbCiAgICAgICAgImxvIgogICAgICBdLAogICAgICAiZm9yYmlkZGVuX3NvdXJjZV9yZWdleCI6IFsKICAgICAgICAiXig/OjB7MCw0fTopezAsN30wezAsM30xJCIsCiAgICAgICAgIl4xMjdcXC4oPzpbMC05XXsxLDN9XFwuKXsyfVswLTldezEsM30kIgogICAgICBdCiAgICB9LAogICAgIlVwZGF0ZUludGVyZmFjZVJlcXVlc3QiOiB7CiAgICAgICJhbGxvd19yYXdfZmxhZ3MiOiAxMjgsCiAgICAgICJmb3JiaWRkZW5fbmFtZXMiOiBbCiAgICAgICAgImxvIgogICAgICBdLAogICAgICAiZm9yYmlkZGVuX2h3X2FkZHJzIjogWwogICAgICAgICIwMDowMDowMDowMDowMDowMCIKICAgICAgXQogICAgfSwKICAgICJDbG9zZVN0ZGluUmVxdWVzdCI6IGZhbHNlLAogICAgIlJlYWRTdHJlYW1SZXF1ZXN0IjogZmFsc2UsCiAgICAiVXBkYXRlRXBoZW1lcmFsTW91bnRzUmVxdWVzdCI6IGZhbHNlLAogICAgIldyaXRlU3RyZWFtUmVxdWVzdCI6IGZhbHNlCiAgfQp9 + spec: + runtimeClassName: kata-cc + containers: + - name: nginx + image: "marinerconfpodstest.azurecr.io/azurelinux/base/nginx:1.25" + ports: + - containerPort: 80 diff --git a/src/agent/samples/policy/yaml/kubernetes/fixtures2/rc-service.yaml b/src/agent/samples/policy/yaml/kubernetes/fixtures2/rc-service.yaml new file mode 100644 index 000000000000..a585f36b8907 --- /dev/null +++ b/src/agent/samples/policy/yaml/kubernetes/fixtures2/rc-service.yaml @@ -0,0 +1,36 @@ +--- +apiVersion: v1 +kind: List +items: + - apiVersion: v1 + kind: Service + metadata: + name: test-service + labels: + name: test-service + spec: + ports: + - port: 80 + selector: + name: test-rc + - apiVersion: v1 + kind: ReplicationController + metadata: + name: test-rc + labels: + name: test-rc + spec: + replicas: 1 + template: + metadata: + labels: + name: test-rc + annotations: + io.katacontainers.config.agent.policy: IyBDb3B5cmlnaHQgKGMpIDIwMjMgTWljcm9zb2Z0IENvcnBvcmF0aW9uCiMKIyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMAojCnBhY2thZ2UgYWdlbnRfcG9saWN5CgppbXBvcnQgZnV0dXJlLmtleXdvcmRzLmluCmltcG9ydCBmdXR1cmUua2V5d29yZHMuZXZlcnkKCiMgRGVmYXVsdCB2YWx1ZXMsIHJldHVybmVkIGJ5IE9QQSB3aGVuIHJ1bGVzIGNhbm5vdCBiZSBldmFsdWF0ZWQgdG8gdHJ1ZS4KZGVmYXVsdCBBZGRBUlBOZWlnaGJvcnNSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgQWRkU3dhcFJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBDbG9zZVN0ZGluUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IENvcHlGaWxlUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IENyZWF0ZUNvbnRhaW5lclJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBDcmVhdGVTYW5kYm94UmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IERlc3Ryb3lTYW5kYm94UmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgRXhlY1Byb2Nlc3NSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgR2V0T09NRXZlbnRSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBHdWVzdERldGFpbHNSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBMaXN0SW50ZXJmYWNlc1JlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBMaXN0Um91dGVzUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IE1lbUhvdHBsdWdCeVByb2JlUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IE9ubGluZUNQVU1lbVJlcXVlc3QgOj0gdHJ1ZQpkZWZhdWx0IFBhdXNlQ29udGFpbmVyUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFJlYWRTdHJlYW1SZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgUmVtb3ZlQ29udGFpbmVyUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgUmVtb3ZlU3RhbGVWaXJ0aW9mc1NoYXJlTW91bnRzUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgUmVzZWVkUmFuZG9tRGV2UmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFJlc3VtZUNvbnRhaW5lclJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBTZXRHdWVzdERhdGVUaW1lUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFNldFBvbGljeVJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBTaWduYWxQcm9jZXNzUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgU3RhcnRDb250YWluZXJSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBTdGFydFRyYWNpbmdSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgU3RhdHNDb250YWluZXJSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBTdG9wVHJhY2luZ1JlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBUdHlXaW5SZXNpemVSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBVcGRhdGVDb250YWluZXJSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgVXBkYXRlRXBoZW1lcmFsTW91bnRzUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFVwZGF0ZUludGVyZmFjZVJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBVcGRhdGVSb3V0ZXNSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgV2FpdFByb2Nlc3NSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBXcml0ZVN0cmVhbVJlcXVlc3QgOj0gZmFsc2UKCiMgQWxsb3dSZXF1ZXN0c0ZhaWxpbmdQb2xpY3kgOj0gdHJ1ZSBjb25maWd1cmVzIHRoZSBBZ2VudCB0byAqYWxsb3cgYW55CiMgcmVxdWVzdHMgY2F1c2luZyBhIHBvbGljeSBmYWlsdXJlKi4gVGhpcyBpcyBhbiB1bnNlY3VyZSBjb25maWd1cmF0aW9uCiMgYnV0IGlzIHVzZWZ1bCBmb3IgYWxsb3dpbmcgdW5zZWN1cmUgcG9kcyB0byBzdGFydCwgdGhlbiBjb25uZWN0IHRvCiMgdGhlbSBhbmQgaW5zcGVjdCBPUEEgbG9ncyBmb3IgdGhlIHJvb3QgY2F1c2Ugb2YgYSBmYWlsdXJlLgpkZWZhdWx0IEFsbG93UmVxdWVzdHNGYWlsaW5nUG9saWN5IDo9IGZhbHNlCgojIENvbnN0YW50cwpTX05BTUVfS0VZID0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZSIKU19OQU1FU1BBQ0VfS0VZID0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZXNwYWNlIgpCVU5ETEVfSUQgPSAiW2EtejAtOV17NjR9IgoKQ3JlYXRlQ29udGFpbmVyUmVxdWVzdDo9IHJlc3AgewogICAgbm90IGlzX251bGwoaW5wdXQuZW52X21hcCkKICAgIAogICAgaV9lbnZfbWFwIDo9IGlucHV0LmVudl9tYXAKICAgIAogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBwX2Vudl9tYXAgOj0gcF9jb250YWluZXIuZW52X21hcCAgCiAgICBhbGxvd19lbnZfbWFwKHBfZW52X21hcCwgaV9lbnZfbWFwKQogICAgCiAgICBpX3Byb2Nlc3MgOj0gaW5wdXQuYmFzZS5PQ0kuUHJvY2VzcwogICAgCiAgICBwX3Byb2Nlc3MgOj0gcF9jb250YWluZXIuT0NJLlByb2Nlc3MKICAgIAogICAgYWxsb3dfYXJncyhpX3Byb2Nlc3MsIHBfcHJvY2VzcywgaV9lbnZfbWFwKQoKICAgIHJlc3AgPSBDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uKGlucHV0LmJhc2UpCiAgICBwcmludCgiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdDogdHJ1ZSIpCn0KCmFsbG93X2FyZ3MoaV9wcm9jZXNzLCBwX3Byb2Nlc3MsIGlfZW52X21hcCkgewogICAgaV9hcmdzIDo9IGlfcHJvY2Vzcy5BcmdzCiAgICBwX2FyZ3MgOj0gcF9wcm9jZXNzLkFyZ3MKICAgIHByaW50KCJhbGxvd19hcmdzOiBpX2FyZ3MgPSIsIGlfYXJncywgInBfYXJncyA9IiwgcF9hcmdzKQogICAgY291bnQoaV9hcmdzKSA9PSBjb3VudChwX2FyZ3MpCiAgICBldmVyeSBpLCBpX2FyZyBpbiBpX2FyZ3MgewogICAgICAgIHByaW50KCJhbGxvd19hcmdzOiBpX2FyZyA9IiwgaV9hcmcpCiAgICAgICAgcF9hcmdfcmVwbGFjZWQgOj0gcmVwbGFjZV9lbnZfdmFyaWFibGVzKHBfYXJnc1tpXSwgaV9lbnZfbWFwKQogICAgICAgIHByaW50KCJhbGxvd19hcmdzOiBwX2FyZ19yZXBsYWNlZCA9IiwgcF9hcmdfcmVwbGFjZWQpCiAgICAgICAgcF9hcmdfcmVwbGFjZWQyIDo9IHJlcGxhY2UocF9hcmdfcmVwbGFjZWQsICIkJCIsICIkIikKICAgICAgICBwcmludCgiYWxsb3dfYXJnczogcF9hcmdfcmVwbGFjZWQyID0iLCBwX2FyZ19yZXBsYWNlZDIpCiAgICAgICAgaV9hcmcgPT0gcF9hcmdfcmVwbGFjZWQyCiAgICB9CiAgICBwcmludCgiYWxsb3dfYXJnczogdHJ1ZSIpCn0KCmFsbG93X2FyZ3MoaV9wcm9jZXNzLCBwX3Byb2Nlc3MsIGlfZW52X21hcCkgewogICAgbm90IGlfcHJvY2Vzcy5BcmdzCiAgICBub3QgcF9wcm9jZXNzLkFyZ3MKICAgIHByaW50KCJhbGxvd19hcmdzMjogbm8gYXJncyIpCn0KCiMgdGhpcyBmdW5jdGlvbiByZXBsYWNlcyBhbGwgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyBpbiBhIHN0cmluZywgZ2l2ZW4gYSBtYXAgb2YgZW52aXJvbm1lbnQga2V5cyB0byBlbnZpcm9ubWVudCB2YWx1ZXMKIyBlZyBzdHIgPSAiZWNobyAkKENMVVNURVJfSUQpOyBlY2hvICQoTk9ERV9OQU1FKTsiCiMgZW52X21hcCA9IHsiQ0xVU1RFUl9JRCI6ICJhYmMiLCAiTk9ERV9OQU1FIiA6ICJ4eXoifQojIHJlc3VsdCA9ICJlY2hvIGFiYzsgZWNobyB4eXo7IgpyZXBsYWNlX2Vudl92YXJpYWJsZXMoc3RyLCBlbnZfbWFwKSA9IHJlc3VsdCB7CiAgICAjIG1ha2UgYW4gYXJyYXkgb2YgdGhlIGtleXMgZWcgWyJDTFVTVEVSX0lEIiwgIk5PREVfTkFNRSJdCiAgICBrZXlzIDo9IFt4IHwgc29tZSB4IGluIG9iamVjdC5rZXlzKGVudl9tYXApXQogICAgcmVzdWx0IDo9IHJlcGxhY2Vfc3RyX3JlYyhzdHIsIGVudl9tYXAsIGtleXMsIGNvdW50KGtleXMpIC0gMSkKfQoKIyBiYXNlIGNhc2UKcmVwbGFjZV9zdHJfcmVjKHN0ciwgZW52X21hcCwgYXJyX2tleXMsIGkpID0gcmVzdWx0IHsKICAgIGkgPCAwCiAgICByZXN1bHQgOj0gc3RyCn0KCiMgcmVjdXJzaXZlIHN0ZXAKcmVwbGFjZV9zdHJfcmVjKHN0ciwgZW52X21hcCwgYXJyX2tleXMsIGkpID0gcmVzdWx0IHsKICAgIGkgPj0gMAogICAga2V5IDo9IGFycl9rZXlzW2ldCiAgICBlbnZfa2V5MSA6PSBjb25jYXQoIiIsIFsiJCgiLCBrZXksICIpIl0pCiAgICAjIHJlcGxhY2UgJChWQVIpIHdpdGggdmFsdWUKICAgIG5ld19zdHIxIDo9IHJlcGxhY2Uoc3RyLCBlbnZfa2V5MSwgZW52X21hcFtrZXldKQogICAgIyByZXBsYWNlIG5leHQgZW52aXJvbm1lbnQgdmFyaWFibGUKICAgIHJlc3VsdCA9IHJlcGxhY2Vfc3RyX3JlYyhuZXdfc3RyMSwgZW52X21hcCwgYXJyX2tleXMsIGkgLSAxKQp9CgphbGxvd19lbnZfbWFwKHBfZW52X21hcCwgaV9lbnZfbWFwKSB7CiAgICBwcmludCgiYWxsb3dfZW52X21hcDogcF9lbnZfbWFwID0iLCBwX2Vudl9tYXApCiAgICBldmVyeSBlbnZfa2V5LCBlbnZfdmFsIGluIGlfZW52X21hcCB7CiAgICAgICAgcHJpbnQoImFsbG93X2VudjogZW52X2tleSA9IiwgZW52X2tleSwgImVudl92YWwgPSIsIGVudl92YWwpCiAgICAgICAgYWxsb3dfZW52X21hcF9lbnRyeShlbnZfa2V5LCBlbnZfdmFsLCBwX2Vudl9tYXApCiAgICB9CiAgICBwcmludCgiYWxsb3dfZW52X21hcDogdHJ1ZSIpCn0KCiMgQWxsb3cgZXhhY3QgbWF0Y2gKYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBpX3ZhbCA9PSBwX3ZhbAogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnk6IHRydWUiKQp9CgojIEFsbG93IHJlc291cmNlRmllbGRSZWYgdmFsdWVzIChlLmcuLCAibGltaXRzLmNwdSIpLgphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgICMgYSB2YXJpYWJsZSB3ZSBzaG91bGQgYmUgdmFsaWRhdGluZyB1c2luZyBhIHJlZ2V4IGZyb20gc2V0dGluZ3MKICAgIHBfdmFsID09ICIkKHZhbGlkYXRlLWZyb20tc2V0dGluZ3MpIgogICAgcmVnZXhfdmFsIDo9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuQ3JlYXRlQ29udGFpbmVyUmVxdWVzdC5hbGxvd19lbnZfcmVnZXhfbWFwW2tleV0KICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4X3ZhbCwgaV92YWwpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSAyOiB0cnVlIikKfQoKIyBBbGxvdyBub2RlLW5hbWUKYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChub2RlLW5hbWUpIgogICAgcmVnZXgubWF0Y2gocG9saWN5X2RhdGEuY29tbW9uLmRuc19zdWJkb21haW4gLCBpX3ZhbCkKICAgIHByaW50KCJhbGxvd19lbnZfbWFwX2VudHJ5IDM6IHRydWUiKQp9CgojIEFsbG93IGhvc3QtbmFtZQphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgIHBfdmFsID09ICIkKGhvc3QtbmFtZSkiCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24uZG5zX2xhYmVsICwgaV92YWwpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSA0OiB0cnVlIikKfQoKIyBBbGxvdyBwb2QtdWlkCmFsbG93X2Vudl9tYXBfZW50cnkoa2V5LCBpX3ZhbCwgcF9lbnZfbWFwKSB7CiAgICBwX3ZhbCA6PSBwX2Vudl9tYXBba2V5XQogICAgcF92YWwgPT0gIiQocG9kLXVpZCkiCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24ucG9kX3VpZCAsIGlfdmFsKQogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgNTogdHJ1ZSIpCn0KCiMgQWxsb3cgZmllbGRSZWYgImZpZWxkUGF0aDogc3RhdHVzLnBvZElQIiB2YWx1ZXMuCmFsbG93X2Vudl9tYXBfZW50cnkoa2V5LCBpX3ZhbCwgcF9lbnZfbWFwKSB7CiAgICBpc19pcChpX3ZhbCkKCiAgICBwX3ZhbCA6PSBwX2Vudl9tYXBba2V5XQogICAgcF92YXIgOj0gY29uY2F0KCI9IiwgW2tleSwgcF92YWxdKQogICAgYWxsb3dfcG9kX2lwX3ZhcihrZXksIHBfdmFyKQogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgNjogdHJ1ZSIpCn0KCiMgQWxsb3cgZmllbGRSZWYgImZpZWxkUGF0aDogc3RhdHVzLmhvc3RJUCIgdmFsdWVzLgphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgaXNfaXAoaV92YWwpCgogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgIHBfdmFyIDo9IGNvbmNhdCgiPSIsIFtrZXksIHBfdmFsXSkKICAgIGFsbG93X2hvc3RfaXBfdmFyKGtleSwgcF92YXIpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSA3OiB0cnVlIikKfQoKIyBNYXRjaCBpbnB1dCB3aXRoIG9uZSBvZiB0aGUgcG9saWN5IHZhcmlhYmxlcywgYWZ0ZXIgc3Vic3RpdHV0aW5nICQoc2FuZGJveC1uYW1lKS4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChzYW5kYm94LW5hbWUpIgogICAgc19uYW1lIDo9IGlucHV0LmJhc2UuT0NJLkFubm90YXRpb25zW1NfTkFNRV9LRVldCiAgICBwX3ZhcjIgOj0gcmVwbGFjZShwX3ZhbCwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHBfdmFyMiA9PSBpX3ZhbAogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgODogdHJ1ZSIpCn0KCiMgTWF0Y2ggaW5wdXQgd2l0aCBvbmUgb2YgdGhlIHBvbGljeSB2YXJpYWJsZXMsIGFmdGVyIHN1YnN0aXR1dGluZyAkKHNhbmRib3gtbmFtZXNwYWNlKS4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChzYW5kYm94LW5hbWVzcGFjZSkiCiAgICBzX25hbWVzcGFjZSA6PSBpbnB1dC5iYXNlLk9DSS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwX3ZhcjIgOj0gcmVwbGFjZShwX3ZhbCwgIiQoc2FuZGJveC1uYW1lc3BhY2UpIiwgc19uYW1lc3BhY2UpCiAgICBwX3ZhcjIgPT0gaV92YWwKICAgIHByaW50KCJhbGxvd19lbnZfbWFwX2VudHJ5IDk6IHRydWUiKQp9CgojIEFsbG93IGlucHV0IGVudiB2YXJpYWJsZXMgdGhhdCBtYXRjaCB3aXRoIGEgcmVxdWVzdF9kZWZhdWx0cyByZWdleC4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHNvbWUgcF9yZWdleDEgaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5DcmVhdGVDb250YWluZXJSZXF1ZXN0LmFsbG93X2Vudl9yZWdleAogICAgcF9yZWdleDIgOj0gcmVwbGFjZShwX3JlZ2V4MSwgIiQoaXB2NF9hKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcHY0X2EpCiAgICBwX3JlZ2V4MyA6PSByZXBsYWNlKHBfcmVnZXgyLCAiJChpcF9wKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcF9wKQogICAgcF9yZWdleDQgOj0gcmVwbGFjZShwX3JlZ2V4MywgIiQoc3ZjX25hbWUpIiwgcG9saWN5X2RhdGEuY29tbW9uLnN2Y19uYW1lKQogICAgcF9yZWdleDUgOj0gcmVwbGFjZShwX3JlZ2V4NCwgIiQoZG5zX2xhYmVsKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5kbnNfbGFiZWwpCgogICAgcmVzdWx0IDo9IGNvbmNhdCgiPSIsIFtrZXksIGlfdmFsXSkKICAgIHJlZ2V4Lm1hdGNoKHBfcmVnZXg1LCByZXN1bHQpCgogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgMTA6IHRydWUiKQp9CgpDcmVhdGVDb250YWluZXJSZXF1ZXN0Oj0gcmVzcCB7CiAgICBub3QgaW5wdXQuZW52X21hcAogICAgaV9wcm9jZXNzID0gaW5wdXQuT0NJLlByb2Nlc3MKICAgIHNfbmFtZSA9IGlucHV0Lk9DSS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBwX3Byb2Nlc3MgPSBwX2NvbnRhaW5lci5PQ0kuUHJvY2VzcwogICAgYWxsb3dfZGVwcmVjYXRlZF9hcmdzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUpCiAgICByZXNwID0gQ3JlYXRlQ29udGFpbmVyUmVxdWVzdENvbW1vbihpbnB1dCkKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0MjogdHJ1ZSIpCn0KCkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb24ocmVxKTo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgICMgQ2hlY2sgaWYgdGhlIGlucHV0IHJlcXVlc3Qgc2hvdWxkIGJlIHJlamVjdGVkIGV2ZW4gYmVmb3JlIGNoZWNraW5nIHRoZQogICAgIyBwb2xpY3lfZGF0YS5jb250YWluZXJzIGluZm9ybWF0aW9uLgogICAgYWxsb3dfY3JlYXRlX2NvbnRhaW5lcl9pbnB1dChyZXEpCgogICAgaV9vY2kgOj0gcmVxLk9DSQogICAgaV9zdG9yYWdlcyA6PSByZXEuc3RvcmFnZXMKICAgIGlfZGV2aWNlcyA6PSByZXEuZGV2aWNlcwoKICAgICMgYXJyYXkgb2YgcG9zc2libGUgc3RhdGUgb3BlcmF0aW9ucwogICAgb3BzX2J1aWxkZXIgOj0gW10KCiAgICAjIGNoZWNrIHNhbmRib3ggbmFtZQogICAgc2FuZGJveF9uYW1lID0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FX0tFWV0KICAgIGFkZF9zYW5kYm94X25hbWVfdG9fc3RhdGUgOj0gc3RhdGVfYWxsb3dzKCJzYW5kYm94X25hbWUiLCBzYW5kYm94X25hbWUpCiAgICBvcHNfYnVpbGRlcjEgOj0gY29uY2F0X29wX2lmX25vdF9udWxsKG9wc19idWlsZGVyLCBhZGRfc2FuZGJveF9uYW1lX3RvX3N0YXRlKQoKICAgICMgQ2hlY2sgaWYgYW55IGVsZW1lbnQgZnJvbSB0aGUgcG9saWN5X2RhdGEuY29udGFpbmVycyBhcnJheSBhbGxvd3MgdGhlIGlucHV0IHJlcXVlc3QuCiAgICBzb21lIHBfY29udGFpbmVyIGluIHBvbGljeV9kYXRhLmNvbnRhaW5lcnMKICAgIHByaW50KCI9PT09PT09PSBDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiB0cnlpbmcgbmV4dCBwb2xpY3kgY29udGFpbmVyIikKCiAgICBwX3BpZG5zIDo9IHBfY29udGFpbmVyLnNhbmRib3hfcGlkbnMKICAgIGlfcGlkbnMgOj0gcmVxLnNhbmRib3hfcGlkbnMKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiBwX3BpZG5zID0iLCBwX3BpZG5zLCAiaV9waWRucyA9IiwgaV9waWRucykKICAgIHBfcGlkbnMgPT0gaV9waWRucwoKICAgIHBfb2NpIDo9IHBfY29udGFpbmVyLk9DSQoKICAgICMgY2hlY2sgbmFtZXNwYWNlCiAgICBwX25hbWVzcGFjZSA6PSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBpX25hbWVzcGFjZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwcmludCAoIkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb246IHBfbmFtZXNwYWNlID0iLCBwX25hbWVzcGFjZSwgImlfbmFtZXNwYWNlID0iLCBpX25hbWVzcGFjZSkKICAgIGFkZF9uYW1lc3BhY2VfdG9fc3RhdGUgOj0gYWxsb3dfbmFtZXNwYWNlKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkKICAgIG9wc19idWlsZGVyMiA6PSBjb25jYXRfb3BfaWZfbm90X251bGwob3BzX2J1aWxkZXIxLCBhZGRfbmFtZXNwYWNlX3RvX3N0YXRlKQoKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiBwIFZlcnNpb24gPSIsIHBfb2NpLlZlcnNpb24sICJpIFZlcnNpb24gPSIsIGlfb2NpLlZlcnNpb24pCiAgICBwX29jaS5WZXJzaW9uID09IGlfb2NpLlZlcnNpb24KCiAgICBwcmludCgiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdENvbW1vbjogcCBSZWFkb25seSA9IiwgcF9vY2kuUm9vdC5SZWFkb25seSwgImkgUmVhZG9ubHkgPSIsIGlfb2NpLlJvb3QuUmVhZG9ubHkpCiAgICBwX29jaS5Sb290LlJlYWRvbmx5ID09IGlfb2NpLlJvb3QuUmVhZG9ubHkKCiAgICBhbGxvd19hbm5vKHBfb2NpLCBpX29jaSkKCiAgICBwX3N0b3JhZ2VzIDo9IHBfY29udGFpbmVyLnN0b3JhZ2VzCiAgICBhbGxvd19ieV9hbm5vKHBfb2NpLCBpX29jaSwgcF9zdG9yYWdlcywgaV9zdG9yYWdlcykKCiAgICBwX2RldmljZXMgOj0gcF9jb250YWluZXIuZGV2aWNlcwogICAgYWxsb3dfZGV2aWNlcyhwX2RldmljZXMsIGlfZGV2aWNlcykKCiAgICByZXQgOj0gYWxsb3dfbGludXgob3BzX2J1aWxkZXIyLCBwX29jaSwgaV9vY2kpCiAgICByZXQuYWxsb3dlZAoKICAgIG9wcyA6PSByZXQub3BzCgogICAgcHJpbnQoIkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb246IHRydWUiKQp9CgphbGxvd19jcmVhdGVfY29udGFpbmVyX2lucHV0KHJlcSkgewogICAgcHJpbnQoImFsbG93X2NyZWF0ZV9jb250YWluZXJfaW5wdXQ6IGlucHV0ID0iLCByZXEpCgogICAgY291bnQocmVxLnNoYXJlZF9tb3VudHMpID09IDAKICAgIGlzX251bGwocmVxLnN0cmluZ191c2VyKQoKICAgIGlfb2NpIDo9IHJlcS5PQ0kKICAgIGlzX251bGwoaV9vY2kuSG9va3MpCiAgICBpc19udWxsKGlfb2NpLlNvbGFyaXMpCiAgICBpc19udWxsKGlfb2NpLldpbmRvd3MpCgogICAgaV9saW51eCA6PSBpX29jaS5MaW51eAogICAgY291bnQoaV9saW51eC5HSURNYXBwaW5ncykgPT0gMAogICAgY291bnQoaV9saW51eC5Nb3VudExhYmVsKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlJlc291cmNlcy5EZXZpY2VzKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlJvb3Rmc1Byb3BhZ2F0aW9uKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlVJRE1hcHBpbmdzKSA9PSAwCiAgICBpc19udWxsKGlfbGludXguSW50ZWxSZHQpCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLkJsb2NrSU8pCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLk5ldHdvcmspCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLlBpZHMpCiAgICBpc19udWxsKGlfbGludXguU2VjY29tcCkKCiAgICBpX3Byb2Nlc3MgOj0gaV9vY2kuUHJvY2VzcwogICAgY291bnQoaV9wcm9jZXNzLlNlbGludXhMYWJlbCkgPT0gMAogICAgY291bnQoaV9wcm9jZXNzLlVzZXIuVXNlcm5hbWUpID09IDAKCiAgICBwcmludCgiYWxsb3dfY3JlYXRlX2NvbnRhaW5lcl9pbnB1dDogdHJ1ZSIpCn0KCmFsbG93X25hbWVzcGFjZShwX25hbWVzcGFjZSwgaV9uYW1lc3BhY2UpID0gYWRkX25hbWVzcGFjZSB7CiAgICBwX25hbWVzcGFjZSA9PSBpX25hbWVzcGFjZQogICAgYWRkX25hbWVzcGFjZSA6PSBudWxsCiAgICBwcmludCgiYWxsb3dfbmFtZXNwYWNlIDE6IGlucHV0IG5hbWVzcGFjZSBtYXRjaGVzIHBvbGljeSBkYXRhIikKfQoKYWxsb3dfbmFtZXNwYWNlKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkgPSBhZGRfbmFtZXNwYWNlIHsKICAgIHBfbmFtZXNwYWNlID09ICIiCiAgICBwcmludCgiYWxsb3dfbmFtZXNwYWNlIDI6IG5vIG5hbWVzcGFjZSBmb3VuZCBvbiBwb2xpY3kgZGF0YSIpCiAgICBhZGRfbmFtZXNwYWNlIDo9IHN0YXRlX2FsbG93cygibmFtZXNwYWNlIiwgaV9uYW1lc3BhY2UpCn0KCiMgdmFsdWUgaGFzbid0IGJlZW4gc2VlbiBiZWZvcmUsIHNhdmUgaXQgdG8gc3RhdGUKc3RhdGVfYWxsb3dzKGtleSwgdmFsdWUpID0gYWN0aW9uIHsKICBzdGF0ZSA6PSBnZXRfc3RhdGUoKQogIHByaW50KCJzdGF0ZV9hbGxvd3MgMTogc3RhdGVba2V5XSA9Iiwgc3RhdGVba2V5XSwgInZhbHVlID0iLCB2YWx1ZSkKICBub3Qgc3RhdGVba2V5XQogIHByaW50KCJzdGF0ZV9hbGxvd3MgMTogc2F2aW5nIHRvIHN0YXRlIGtleSA9Iiwga2V5LCAidmFsdWUgPSIsIHZhbHVlKQogIHBhdGggOj0gZ2V0X3N0YXRlX3BhdGgoa2V5KSAKICBhY3Rpb24gOj0gewogICAgIm9wIjogImFkZCIsCiAgICAicGF0aCI6IHBhdGgsIAogICAgInZhbHVlIjogdmFsdWUsCiAgfQp9CgojIHZhbHVlIG1hdGNoZXMgd2hhdCdzIGluIHN0YXRlLCBhbGxvdyBpdApzdGF0ZV9hbGxvd3Moa2V5LCB2YWx1ZSkgPSBhY3Rpb24gewogIHByaW50KCJzdGF0ZV9hbGxvd3MgMjogc3RhcnQiKQogIHN0YXRlIDo9IGdldF9zdGF0ZSgpCiAgcHJpbnQoInN0YXRlX2FsbG93cyAyOiBzdGF0ZVtrZXldID0iLCBzdGF0ZVtrZXldLCAidmFsdWUgPSIsIHZhbHVlKQogIHZhbHVlID09IHN0YXRlW2tleV0KICBwcmludCgic3RhdGVfYWxsb3dzIDI6IGZvdW5kIGtleSA9Iiwga2V5LCAidmFsdWUgPSIsIHZhbHVlLCAiIGluIHN0YXRlIikKICBhY3Rpb24gOj0gbnVsbAp9CgojIGhlbHBlciBmdW5jdGlvbnMgdG8gaW50ZXJhY3Qgd2l0aCB0aGUgc3RhdGUKZ2V0X3N0YXRlKCkgPSBzdGF0ZSB7CiAgc3RhdGUgOj0gZGF0YVsicHN0YXRlIl0KfQoKZ2V0X3N0YXRlX3ZhbChrZXkpID0gdmFsdWUgewogICAgc3RhdGUgOj0gZ2V0X3N0YXRlKCkKICAgIHZhbHVlIDo9IHN0YXRlW2tleV0KfQoKZ2V0X3N0YXRlX3BhdGgoa2V5KSA9IHBhdGggewogICAgIyBwcmVwZW5kICIvcHN0YXRlLyIgdG8ga2V5CiAgICBwYXRoIDo9IGNvbmNhdCgiLyIsIFsiL3BzdGF0ZSIsIGtleV0pCn0KCiMgSGVscGVyIGZ1bmN0aW9ucyB0byBjb25kaXRpb25hbGx5IGNvbmNhdGVuYXRlIG9wIGlzIG5vdCBudWxsCmNvbmNhdF9vcF9pZl9ub3RfbnVsbChvcHMsIG9wKSA9IHJlc3VsdCB7CiAgICBvcCA9PSBudWxsCiAgICByZXN1bHQgOj0gb3BzCn0KCmNvbmNhdF9vcF9pZl9ub3RfbnVsbChvcHMsIG9wKSA9IHJlc3VsdCB7CiAgICBvcCAhPSBudWxsCiAgICByZXN1bHQgOj0gYXJyYXkuY29uY2F0KG9wcywgW29wXSkKfQoKIyBSZWplY3QgdW5leHBlY3RlZCBhbm5vdGF0aW9ucy4KYWxsb3dfYW5ubyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19hbm5vIDE6IHN0YXJ0IikKCiAgICBub3QgaV9vY2kuQW5ub3RhdGlvbnMKCiAgICBwcmludCgiYWxsb3dfYW5ubyAxOiB0cnVlIikKfQphbGxvd19hbm5vKHBfb2NpLCBpX29jaSkgewogICAgcHJpbnQoImFsbG93X2Fubm8gMjogcCBBbm5vdGF0aW9ucyA9IiwgcF9vY2kuQW5ub3RhdGlvbnMpCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiBpIEFubm90YXRpb25zID0iLCBpX29jaS5Bbm5vdGF0aW9ucykKCiAgICBpX2tleXMgOj0gb2JqZWN0LmtleXMoaV9vY2kuQW5ub3RhdGlvbnMpCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiBpIGtleXMgPSIsIGlfa2V5cykKCiAgICBldmVyeSBpX2tleSBpbiBpX2tleXMgewogICAgICAgIGFsbG93X2Fubm9fa2V5KGlfa2V5LCBwX29jaSkKICAgIH0KCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiB0cnVlIikKfQoKYWxsb3dfYW5ub19rZXkoaV9rZXksIHBfb2NpKSB7CiAgICBwcmludCgiYWxsb3dfYW5ub19rZXkgMTogaSBrZXkgPSIsIGlfa2V5KQoKICAgIHN0YXJ0c3dpdGgoaV9rZXksICJpby5rdWJlcm5ldGVzLmNyaS4iKQoKICAgIHByaW50KCJhbGxvd19hbm5vX2tleSAxOiB0cnVlIikKfQphbGxvd19hbm5vX2tleShpX2tleSwgcF9vY2kpIHsKICAgIHByaW50KCJhbGxvd19hbm5vX2tleSAyOiBpIGtleSA9IiwgaV9rZXkpCgogICAgc29tZSBwX2tleSwgXyBpbiBwX29jaS5Bbm5vdGF0aW9ucwogICAgcF9rZXkgPT0gaV9rZXkKCiAgICBwcmludCgiYWxsb3dfYW5ub19rZXkgMjogdHJ1ZSIpCn0KCiMgR2V0IHRoZSB2YWx1ZSBvZiB0aGUgU19OQU1FX0tFWSBhbm5vdGF0aW9uIGFuZAojIGNvcnJlbGF0ZSBpdCB3aXRoIG90aGVyIGFubm90YXRpb25zIGFuZCBwcm9jZXNzIGZpZWxkcy4KYWxsb3dfYnlfYW5ubyhwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpIHsKICAgIHByaW50KCJhbGxvd19ieV9hbm5vIDE6IHN0YXJ0IikKCiAgICBub3QgcF9vY2kuQW5ub3RhdGlvbnNbU19OQU1FX0tFWV0KCiAgICBpX3NfbmFtZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMTogaV9zX25hbWUgPSIsIGlfc19uYW1lKQoKICAgIGlfc19uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FU1BBQ0VfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMTogaV9zX25hbWVzcGFjZSA9IiwgaV9zX25hbWVzcGFjZSkKCiAgICBhbGxvd19ieV9zYW5kYm94X25hbWUocF9vY2ksIGlfb2NpLCBwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBpX3NfbmFtZSwgaV9zX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfYnlfYW5ubyAxOiB0cnVlIikKfQphbGxvd19ieV9hbm5vKHBfb2NpLCBpX29jaSwgcF9zdG9yYWdlcywgaV9zdG9yYWdlcykgewogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMjogc3RhcnQiKQoKICAgIHBfc19uYW1lIDo9IHBfb2NpLkFubm90YXRpb25zW1NfTkFNRV9LRVldCiAgICBpX3NfbmFtZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMjogaV9zX25hbWUgPSIsIGlfc19uYW1lLCAicF9zX25hbWUgPSIsIHBfc19uYW1lKQoKICAgIGFsbG93X3NhbmRib3hfbmFtZShwX3NfbmFtZSwgaV9zX25hbWUpCgogICAgaV9zX25hbWVzcGFjZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwcmludCgiYWxsb3dfYnlfYW5ubyAyOiBpX3NfbmFtZXNwYWNlID0iLCBpX3NfbmFtZXNwYWNlKQoKICAgIGFsbG93X2J5X3NhbmRib3hfbmFtZShwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMsIGlfc19uYW1lLCBpX3NfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd19ieV9hbm5vIDI6IHRydWUiKQp9CgphbGxvd19ieV9zYW5kYm94X25hbWUocF9vY2ksIGlfb2NpLCBwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfYnlfc2FuZGJveF9uYW1lOiBzdGFydCIpCgogICAgaV9uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FU1BBQ0VfS0VZXQoKICAgIGFsbG93X2J5X2NvbnRhaW5lcl90eXBlcyhwX29jaSwgaV9vY2ksIHNfbmFtZSwgaV9uYW1lc3BhY2UpCiAgICBhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZChwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpCiAgICBhbGxvd19wcm9jZXNzKHBfb2NpLlByb2Nlc3MsIGlfb2NpLlByb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpCgogICAgcHJpbnQoImFsbG93X2J5X3NhbmRib3hfbmFtZTogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfbmFtZShwX3NfbmFtZSwgaV9zX25hbWUpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X25hbWU6IHN0YXJ0IikKICAgIHJlZ2V4Lm1hdGNoKHBfc19uYW1lLCBpX3NfbmFtZSkKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9uYW1lOiB0cnVlIikKfQoKIyBDaGVjayB0aGF0IHRoZSAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLXR5cGUiIGFuZAojICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIiBhbm5vdGF0aW9ucyBkZXNpZ25hdGUgdGhlCiMgZXhwZWN0ZWQgdHlwZSAtIGVpdGhlciBhICJzYW5kYm94IiBvciBhICJjb250YWluZXIiLiBUaGVuLCB2YWxpZGF0ZQojIG90aGVyIGFubm90YXRpb25zIGJhc2VkIG9uIHRoZSBhY3R1YWwgInNhbmRib3giIG9yICJjb250YWluZXIiIHZhbHVlCiMgZnJvbSB0aGUgaW5wdXQgY29udGFpbmVyLgphbGxvd19ieV9jb250YWluZXJfdHlwZXMocF9vY2ksIGlfb2NpLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfYnlfY29udGFpbmVyX3R5cGVzOiBjaGVja2luZyBpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSIpCgogICAgY190eXBlIDo9ICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSIKICAgIAogICAgcF9jcmlfdHlwZSA6PSBwX29jaS5Bbm5vdGF0aW9uc1tjX3R5cGVdCiAgICBpX2NyaV90eXBlIDo9IGlfb2NpLkFubm90YXRpb25zW2NfdHlwZV0KICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZXM6IHBfY3JpX3R5cGUgPSIsIHBfY3JpX3R5cGUsICJpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgcF9jcmlfdHlwZSA9PSBpX2NyaV90eXBlCgogICAgYWxsb3dfYnlfY29udGFpbmVyX3R5cGUoaV9jcmlfdHlwZSwgcF9vY2ksIGlfb2NpLCBzX25hbWUsIHNfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZXM6IHRydWUiKQp9CgphbGxvd19ieV9jb250YWluZXJfdHlwZShpX2NyaV90eXBlLCBwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAxOiBpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgaV9jcmlfdHlwZSA9PSAic2FuZGJveCIKCiAgICBpX2thdGFfdHlwZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1siaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5jb250YWluZXJfdHlwZSJdCiAgICBwcmludCgiYWxsb3dfYnlfY29udGFpbmVyX3R5cGUgMTogaV9rYXRhX3R5cGUgPSIsIGlfa2F0YV90eXBlKQogICAgaV9rYXRhX3R5cGUgPT0gInBvZF9zYW5kYm94IgoKICAgIGFsbG93X3NhbmRib3hfY29udGFpbmVyX25hbWUocF9vY2ksIGlfb2NpKQogICAgYWxsb3dfc2FuZGJveF9uZXRfbmFtZXNwYWNlKHBfb2NpLCBpX29jaSkKICAgIGFsbG93X3NhbmRib3hfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpCgogICAgcHJpbnQoImFsbG93X2J5X2NvbnRhaW5lcl90eXBlIDE6IHRydWUiKQp9CgphbGxvd19ieV9jb250YWluZXJfdHlwZShpX2NyaV90eXBlLCBwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiBpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgaV9jcmlfdHlwZSA9PSAiY29udGFpbmVyIgoKICAgIGlfa2F0YV90eXBlIDo9IGlfb2NpLkFubm90YXRpb25zWyJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIl0KICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiBpX2thdGFfdHlwZSA9IiwgaV9rYXRhX3R5cGUpCiAgICBpX2thdGFfdHlwZSA9PSAicG9kX2NvbnRhaW5lciIKCiAgICBhbGxvd19jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpCiAgICBhbGxvd19uZXRfbmFtZXNwYWNlKHBfb2NpLCBpX29jaSkKICAgIGFsbG93X2xvZ19kaXJlY3RvcnkocF9vY2ksIGlfb2NpKQoKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiB0cnVlIikKfQoKIyAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLW5hbWUiIGFubm90YXRpb24KYWxsb3dfc2FuZGJveF9jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X2NvbnRhaW5lcl9uYW1lOiBzdGFydCIpCgogICAgY29udGFpbmVyX2Fubm90YXRpb25fbWlzc2luZyhwX29jaSwgaV9vY2ksICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItbmFtZSIpCgogICAgcHJpbnQoImFsbG93X3NhbmRib3hfY29udGFpbmVyX25hbWU6IHRydWUiKQp9CgphbGxvd19jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19jb250YWluZXJfbmFtZTogc3RhcnQiKQoKICAgIGFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uKHBfb2NpLCBpX29jaSwgImlvLmt1YmVybmV0ZXMuY3JpLmNvbnRhaW5lci1uYW1lIikKCiAgICBwcmludCgiYWxsb3dfY29udGFpbmVyX25hbWU6IHRydWUiKQp9Cgpjb250YWluZXJfYW5ub3RhdGlvbl9taXNzaW5nKHBfb2NpLCBpX29jaSwga2V5KSB7CiAgICBwcmludCgiY29udGFpbmVyX2Fubm90YXRpb25fbWlzc2luZzoiLCBrZXkpCgogICAgbm90IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIG5vdCBpX29jaS5Bbm5vdGF0aW9uc1trZXldCgogICAgcHJpbnQoImNvbnRhaW5lcl9hbm5vdGF0aW9uX21pc3Npbmc6IHRydWUiKQp9CgphbGxvd19jb250YWluZXJfYW5ub3RhdGlvbihwX29jaSwgaV9vY2ksIGtleSkgewogICAgcHJpbnQoImFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uOiBrZXkgPSIsIGtleSkKCiAgICBwX3ZhbHVlIDo9IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIGlfdmFsdWUgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgcHJpbnQoImFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uOiBwX3ZhbHVlID0iLCBwX3ZhbHVlLCAiaV92YWx1ZSA9IiwgaV92YWx1ZSkKCiAgICBwX3ZhbHVlID09IGlfdmFsdWUKCiAgICBwcmludCgiYWxsb3dfY29udGFpbmVyX2Fubm90YXRpb246IHRydWUiKQp9CgojICJuZXJkY3RsL25ldHdvcmstbmFtZXNwYWNlIiBhbm5vdGF0aW9uCmFsbG93X3NhbmRib3hfbmV0X25hbWVzcGFjZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X25ldF9uYW1lc3BhY2U6IHN0YXJ0IikKCiAgICBrZXkgOj0gIm5lcmRjdGwvbmV0d29yay1uYW1lc3BhY2UiCgogICAgcF9uYW1lc3BhY2UgOj0gcF9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgaV9uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgcHJpbnQoImFsbG93X3NhbmRib3hfbmV0X25hbWVzcGFjZTogcF9uYW1lc3BhY2UgPSIsIHBfbmFtZXNwYWNlLCAiaV9uYW1lc3BhY2UgPSIsIGlfbmFtZXNwYWNlKQoKICAgIHJlZ2V4Lm1hdGNoKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9uZXRfbmFtZXNwYWNlOiB0cnVlIikKfQoKYWxsb3dfbmV0X25hbWVzcGFjZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19uZXRfbmFtZXNwYWNlOiBzdGFydCIpCgogICAga2V5IDo9ICJuZXJkY3RsL25ldHdvcmstbmFtZXNwYWNlIgoKICAgIG5vdCBwX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICBub3QgaV9vY2kuQW5ub3RhdGlvbnNba2V5XQoKICAgIHByaW50KCJhbGxvd19uZXRfbmFtZXNwYWNlOiB0cnVlIikKfQoKIyAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1sb2ctZGlyZWN0b3J5IiBhbm5vdGF0aW9uCmFsbG93X3NhbmRib3hfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X2xvZ19kaXJlY3Rvcnk6IHN0YXJ0IikKCiAgICBrZXkgOj0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbG9nLWRpcmVjdG9yeSIKCiAgICBwX2RpciA6PSBwX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICByZWdleDEgOj0gcmVwbGFjZShwX2RpciwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHJlZ2V4MiA6PSByZXBsYWNlKHJlZ2V4MSwgIiQoc2FuZGJveC1uYW1lc3BhY2UpIiwgc19uYW1lc3BhY2UpCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiByZWdleDIgPSIsIHJlZ2V4MikKCiAgICBpX2RpciA6PSBpX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiBpX2RpciA9IiwgaV9kaXIpCgogICAgcmVnZXgubWF0Y2gocmVnZXgyLCBpX2RpcikKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiB0cnVlIikKfQoKYWxsb3dfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19sb2dfZGlyZWN0b3J5OiBzdGFydCIpCgogICAga2V5IDo9ICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWxvZy1kaXJlY3RvcnkiCgogICAgbm90IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIG5vdCBpX29jaS5Bbm5vdGF0aW9uc1trZXldCgogICAgcHJpbnQoImFsbG93X2xvZ19kaXJlY3Rvcnk6IHRydWUiKQp9CgphbGxvd19kZXZpY2VzKHBfZGV2aWNlcywgaV9kZXZpY2VzKSB7CiAgICBwcmludCgiYWxsb3dfZGV2aWNlczogc3RhcnQiKQogICAgZXZlcnkgaV9kZXZpY2UgaW4gaV9kZXZpY2VzIHsKICAgICAgICBwcmludCgiYWxsb3dfZGV2aWNlczogaV9kZXZpY2UgPSIsIGlfZGV2aWNlKQogICAgICAgIHNvbWUgcF9kZXZpY2UgaW4gcF9kZXZpY2VzCiAgICAgICAgcF9kZXZpY2UuY29udGFpbmVyX3BhdGggPT0gaV9kZXZpY2UuY29udGFpbmVyX3BhdGgKICAgIH0KICAgIHByaW50KCJhbGxvd19kZXZpY2VzOiB0cnVlIikKfQoKYWxsb3dfbGludXgoc3RhdGVfb3BzLCBwX29jaSwgaV9vY2kpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIHBfbmFtZXNwYWNlcyA6PSBwX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbGludXg6IHAgbmFtZXNwYWNlcyA9IiwgcF9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlcyA6PSBpX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbGludXg6IGkgbmFtZXNwYWNlcyA9IiwgaV9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlX3dpdGhvdXRfbmV0d29yayA6PSBbb2JqIHwgb2JqIDo9IGlfbmFtZXNwYWNlc1tfXTsgb2JqLlR5cGUgIT0gIm5ldHdvcmsiXQoKICAgIHByaW50KCJhbGxvd19saW51eDogaV9uYW1lc3BhY2Vfd2l0aG91dF9uZXR3b3JrID0iLCBpX25hbWVzcGFjZV93aXRob3V0X25ldHdvcmspCgogICAgcF9uYW1lc3BhY2VzID09IGlfbmFtZXNwYWNlX3dpdGhvdXRfbmV0d29yawoKICAgIGFsbG93X21hc2tlZF9wYXRocyhwX29jaSwgaV9vY2kpCiAgICBhbGxvd19yZWFkb25seV9wYXRocyhwX29jaSwgaV9vY2kpCiAgICBhbGxvd19saW51eF9kZXZpY2VzKHBfb2NpLkxpbnV4LkRldmljZXMsIGlfb2NpLkxpbnV4LkRldmljZXMpCiAgICBhbGxvd19saW51eF9zeXNjdGwocF9vY2kuTGludXgsIGlfb2NpLkxpbnV4KQogICAgcmV0IDo9IGFsbG93X25ldHdvcmtfbmFtZXNwYWNlX3N0YXJ0KHN0YXRlX29wcywgcF9vY2ksIGlfb2NpKQogICAgcmV0LmFsbG93ZWQKCiAgICBvcHMgOj0gcmV0Lm9wcwoKICAgIHByaW50KCJhbGxvd19saW51eDogdHJ1ZSIpCn0KCiMgUmV0cmlldmUgdGhlICJuZXR3b3JrIiBuYW1lc3BhY2UgZnJvbSB0aGUgaW5wdXQgZGF0YSBhbmQgcGFzcyBpdCBvbiBmb3IgdGhlCiMgbmV0d29yayBuYW1lc3BhY2UgcG9saWN5IGNoZWNrcy4KYWxsb3dfbmV0d29ya19uYW1lc3BhY2Vfc3RhcnQoc3RhdGVfb3BzLCBwX29jaSwgaV9vY2kpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIHByaW50KCJhbGxvd19uZXR3b3JrX25hbWVzcGFjZSBzdGFydDogc3RhcnQiKQoKICAgIHBfbmFtZXNwYWNlcyA6PSBwX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IHAgbmFtZXNwYWNlcyA9IiwgcF9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlcyA6PSBpX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IGkgbmFtZXNwYWNlcyA9IiwgaV9uYW1lc3BhY2VzKQoKICAgICMgUmV0dXJuIHBhdGggb2YgdGhlICJuZXR3b3JrIiBuYW1lc3BhY2UKICAgIG5ldHdvcmtfbnMgOj0gW29iaiB8IG9iaiA6PSBpX25hbWVzcGFjZXNbX107IG9iai5UeXBlID09ICJuZXR3b3JrIl0KCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IG5ldHdvcmtfbnMgPSIsIG5ldHdvcmtfbnMpCgogICAgcmV0IDo9IGFsbG93X25ldHdvcmtfbmFtZXNwYWNlKHN0YXRlX29wcywgbmV0d29ya19ucykKICAgIHJldC5hbGxvd2VkCgogICAgb3BzIDo9IHJldC5vcHMKfQoKIyBUaGlzIHJ1bGUgaXMgd2hlbiB0aGVyZSdzIG5vIG5ldHdvcmsgbmFtZXNwYWNlIGluIHRoZSBpbnB1dCBkYXRhLgphbGxvd19uZXR3b3JrX25hbWVzcGFjZShzdGF0ZV9vcHMsIG5ldHdvcmtfbnMpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIGNvdW50KG5ldHdvcmtfbnMpID09IDAKCiAgICBuZXR3b3JrX25zX3BhdGggPSAiIgoKICAgIGFkZF9uZXR3b3JrX25hbWVzcGFjZV90b19zdGF0ZSA6PSBzdGF0ZV9hbGxvd3MoIm5ldHdvcmtfbmFtZXNwYWNlIiwgbmV0d29ya19uc19wYXRoKQogICAgb3BzIDo9IGNvbmNhdF9vcF9pZl9ub3RfbnVsbChzdGF0ZV9vcHMsIGFkZF9uZXR3b3JrX25hbWVzcGFjZV90b19zdGF0ZSkKCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2UgMTogdHJ1ZSIpCn0KCiMgVGhpcyBydWxlIGlzIHdoZW4gdGhlcmUncyBleGFjdGx5IG9uZSBuZXR3b3JrIG5hbWVzcGFjZSBpbiB0aGUgaW5wdXQgZGF0YS4KYWxsb3dfbmV0d29ya19uYW1lc3BhY2Uoc3RhdGVfb3BzLCBuZXR3b3JrX25zKSA6PSB7Im9wcyI6IG9wcywgImFsbG93ZWQiOiB0cnVlfSB7CiAgICBjb3VudChuZXR3b3JrX25zKSA9PSAxCgogICAgYWRkX25ldHdvcmtfbmFtZXNwYWNlX3RvX3N0YXRlIDo9IHN0YXRlX2FsbG93cygibmV0d29ya19uYW1lc3BhY2UiLCBuZXR3b3JrX25zWzBdLlBhdGgpCiAgICBvcHMgOj0gY29uY2F0X29wX2lmX25vdF9udWxsKHN0YXRlX29wcywgYWRkX25ldHdvcmtfbmFtZXNwYWNlX3RvX3N0YXRlKQoKICAgIHByaW50KCJhbGxvd19uZXR3b3JrX25hbWVzcGFjZSAyOiB0cnVlIikKfQoKYWxsb3dfbWFza2VkX3BhdGhzKHBfb2NpLCBpX29jaSkgewogICAgcF9wYXRocyA6PSBwX29jaS5MaW51eC5NYXNrZWRQYXRocwogICAgcHJpbnQoImFsbG93X21hc2tlZF9wYXRocyAxOiBwX3BhdGhzID0iLCBwX3BhdGhzKQoKICAgIGlfcGF0aHMgOj0gaV9vY2kuTGludXguTWFza2VkUGF0aHMKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aHMgMTogaV9wYXRocyA9IiwgaV9wYXRocykKCiAgICBhbGxvd19tYXNrZWRfcGF0aHNfYXJyYXkocF9wYXRocywgaV9wYXRocykKCiAgICBwcmludCgiYWxsb3dfbWFza2VkX3BhdGhzIDE6IHRydWUiKQp9CmFsbG93X21hc2tlZF9wYXRocyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aHMgMjogc3RhcnQiKQoKICAgIG5vdCBwX29jaS5MaW51eC5NYXNrZWRQYXRocwogICAgbm90IGlfb2NpLkxpbnV4Lk1hc2tlZFBhdGhzCgogICAgcHJpbnQoImFsbG93X21hc2tlZF9wYXRocyAyOiB0cnVlIikKfQoKIyBBbGwgdGhlIHBvbGljeSBtYXNrZWQgcGF0aHMgbXVzdCBiZSBtYXNrZWQgaW4gdGhlIGlucHV0IGRhdGEgdG9vLgojIElucHV0IGlzIGFsbG93ZWQgdG8gaGF2ZSBtb3JlIG1hc2tlZCBwYXRocyB0aGFuIHRoZSBwb2xpY3kuCmFsbG93X21hc2tlZF9wYXRoc19hcnJheShwX2FycmF5LCBpX2FycmF5KSB7CiAgICBldmVyeSBwX2VsZW0gaW4gcF9hcnJheSB7CiAgICAgICAgYWxsb3dfbWFza2VkX3BhdGgocF9lbGVtLCBpX2FycmF5KQogICAgfQp9CgphbGxvd19tYXNrZWRfcGF0aChwX2VsZW0sIGlfYXJyYXkpIHsKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aDogcF9lbGVtID0iLCBwX2VsZW0pCgogICAgc29tZSBpX2VsZW0gaW4gaV9hcnJheQogICAgcF9lbGVtID09IGlfZWxlbQoKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aDogdHJ1ZSIpCn0KCmFsbG93X3JlYWRvbmx5X3BhdGhzKHBfb2NpLCBpX29jaSkgewogICAgcF9wYXRocyA6PSBwX29jaS5MaW51eC5SZWFkb25seVBhdGhzCiAgICBwcmludCgiYWxsb3dfcmVhZG9ubHlfcGF0aHMgMTogcF9wYXRocyA9IiwgcF9wYXRocykKCiAgICBpX3BhdGhzIDo9IGlfb2NpLkxpbnV4LlJlYWRvbmx5UGF0aHMKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAxOiBpX3BhdGhzID0iLCBpX3BhdGhzKQoKICAgIGFsbG93X3JlYWRvbmx5X3BhdGhzX2FycmF5KHBfcGF0aHMsIGlfcGF0aHMsIGlfb2NpLkxpbnV4Lk1hc2tlZFBhdGhzKQoKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAxOiB0cnVlIikKfQphbGxvd19yZWFkb25seV9wYXRocyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAyOiBzdGFydCIpCgogICAgbm90IHBfb2NpLkxpbnV4LlJlYWRvbmx5UGF0aHMKICAgIG5vdCBpX29jaS5MaW51eC5SZWFkb25seVBhdGhzCgogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGhzIDI6IHRydWUiKQp9CgojIEFsbCB0aGUgcG9saWN5IHJlYWRvbmx5IHBhdGhzIG11c3QgYmUgZWl0aGVyOgojIC0gUHJlc2VudCBpbiB0aGUgaW5wdXQgcmVhZG9ubHkgcGF0aHMsIG9yCiMgLSBQcmVzZW50IGluIHRoZSBpbnB1dCBtYXNrZWQgcGF0aHMuCiMgSW5wdXQgaXMgYWxsb3dlZCB0byBoYXZlIG1vcmUgcmVhZG9ubHkgcGF0aHMgdGhhbiB0aGUgcG9saWN5LgphbGxvd19yZWFkb25seV9wYXRoc19hcnJheShwX2FycmF5LCBpX2FycmF5LCBtYXNrZWRfcGF0aHMpIHsKICAgIGV2ZXJ5IHBfZWxlbSBpbiBwX2FycmF5IHsKICAgICAgICBhbGxvd19yZWFkb25seV9wYXRoKHBfZWxlbSwgaV9hcnJheSwgbWFza2VkX3BhdGhzKQogICAgfQp9CgphbGxvd19yZWFkb25seV9wYXRoKHBfZWxlbSwgaV9hcnJheSwgbWFza2VkX3BhdGhzKSB7CiAgICBwcmludCgiYWxsb3dfcmVhZG9ubHlfcGF0aCAxOiBwX2VsZW0gPSIsIHBfZWxlbSkKCiAgICBzb21lIGlfZWxlbSBpbiBpX2FycmF5CiAgICBwX2VsZW0gPT0gaV9lbGVtCgogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGggMTogdHJ1ZSIpCn0KYWxsb3dfcmVhZG9ubHlfcGF0aChwX2VsZW0sIGlfYXJyYXksIG1hc2tlZF9wYXRocykgewogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGggMjogcF9lbGVtID0iLCBwX2VsZW0pCgogICAgc29tZSBpX21hc2tlZCBpbiBtYXNrZWRfcGF0aHMKICAgIHBfZWxlbSA9PSBpX21hc2tlZAoKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRoIDI6IHRydWUiKQp9CgphbGxvd19saW51eF9kZXZpY2VzKHBfZGV2aWNlcywgaV9kZXZpY2VzKSB7CiAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogc3RhcnQiKQogICAgZXZlcnkgaV9kZXZpY2UgaW4gaV9kZXZpY2VzIHsKICAgICAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogaV9kZXZpY2UgPSIsIGlfZGV2aWNlKQogICAgICAgIHNvbWUgcF9kZXZpY2UgaW4gcF9kZXZpY2VzCiAgICAgICAgaV9kZXZpY2UuUGF0aCA9PSBwX2RldmljZS5QYXRoCiAgICB9CiAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogdHJ1ZSIpCn0KCmFsbG93X2xpbnV4X3N5c2N0bChwX2xpbnV4LCBpX2xpbnV4KSB7CiAgICBwcmludCgiYWxsb3dfbGludXhfc3lzY3RsIDE6IHN0YXJ0IikKICAgIG5vdCBpX2xpbnV4LlN5c2N0bAogICAgcHJpbnQoImFsbG93X2xpbnV4X3N5c2N0bCAxOiB0cnVlIikKfQoKYWxsb3dfbGludXhfc3lzY3RsKHBfbGludXgsIGlfbGludXgpIHsKICAgIHByaW50KCJhbGxvd19saW51eF9zeXNjdGwgMjogc3RhcnQiKQogICAgcF9zeXNjdGwgOj0gcF9saW51eC5TeXNjdGwKICAgIGlfc3lzY3RsIDo9IGlfbGludXguU3lzY3RsCiAgICBldmVyeSBpX25hbWUsIGlfdmFsIGluIGlfc3lzY3RsIHsKICAgICAgICBwcmludCgiYWxsb3dfbGludXhfc3lzY3RsIDI6IGlfbmFtZSA9IiwgaV9uYW1lLCAiaV92YWwgPSIsIGlfdmFsKQogICAgICAgIHBfc3lzY3RsW2lfbmFtZV0gPT0gaV92YWwKICAgIH0KICAgIHByaW50KCJhbGxvd19saW51eF9zeXNjdGwgMjogdHJ1ZSIpCn0KCiMgQ2hlY2sgdGhlIGNvbnNpc3RlbmN5IG9mIHRoZSBpbnB1dCAiaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5idW5kbGVfcGF0aCIKIyBhbmQgaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCIgdmFsdWVzIHdpdGggb3RoZXIgZmllbGRzLgphbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZChwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpIHsKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogc3RhcnQiKQoKICAgIGJ1bmRsZV9wYXRoIDo9IGlfb2NpLkFubm90YXRpb25zWyJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmJ1bmRsZV9wYXRoIl0KICAgIGJ1bmRsZV9pZCA6PSByZXBsYWNlKGJ1bmRsZV9wYXRoLCAiL3J1bi9jb250YWluZXJkL2lvLmNvbnRhaW5lcmQucnVudGltZS52Mi50YXNrL2s4cy5pby8iLCAiIikKCiAgICBidW5kbGVfaWRfZm9ybWF0IDo9IGNvbmNhdCgiIiwgWyJeIiwgQlVORExFX0lELCAiJCJdKQogICAgcmVnZXgubWF0Y2goYnVuZGxlX2lkX2Zvcm1hdCwgYnVuZGxlX2lkKQoKICAgIGtleSA6PSAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCIKCiAgICBwX3JlZ2V4IDo9IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIHNhbmRib3hfaWQgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQoKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogc2FuZGJveF9pZCA9Iiwgc2FuZGJveF9pZCwgInJlZ2V4ID0iLCBwX3JlZ2V4KQogICAgcmVnZXgubWF0Y2gocF9yZWdleCwgc2FuZGJveF9pZCkKCiAgICBhbGxvd19yb290X3BhdGgocF9vY2ksIGlfb2NpLCBidW5kbGVfaWQpCgogICAgZXZlcnkgaV9tb3VudCBpbiBpX29jaS5Nb3VudHMgewogICAgICAgIGFsbG93X21vdW50KHBfb2NpLCBpX21vdW50LCBpX3N0b3JhZ2VzLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpCiAgICB9CgogICAgYWxsb3dfc3RvcmFnZXMocF9zdG9yYWdlcywgaV9zdG9yYWdlcywgYnVuZGxlX2lkLCBzYW5kYm94X2lkKQoKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogdHJ1ZSIpCn0KCmFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHBfcHJvY2VzcyA9IiwgcF9wcm9jZXNzKQogICAgcHJpbnQoImFsbG93X3Byb2Nlc3NfY29tbW9uOiBpX3Byb2Nlc3MgPSAiLCBpX3Byb2Nlc3MpCiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHNfbmFtZSA9Iiwgc19uYW1lKQoKICAgIHBfcHJvY2Vzcy5Dd2QgPT0gaV9wcm9jZXNzLkN3ZAogICAgcF9wcm9jZXNzLk5vTmV3UHJpdmlsZWdlcyA9PSBpX3Byb2Nlc3MuTm9OZXdQcml2aWxlZ2VzCgogICAgYWxsb3dfdXNlcihwX3Byb2Nlc3MsIGlfcHJvY2VzcykKICAgIGFsbG93X2VudihwX3Byb2Nlc3MsIGlfcHJvY2Vzcywgc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHRydWUiKQp9CgojIENvbXBhcmUgdGhlIE9DSSBQcm9jZXNzIGZpZWxkIG9mIGEgcG9saWN5IGNvbnRhaW5lciB3aXRoIHRoZSBpbnB1dCBPQ0kgUHJvY2VzcyBmcm9tIGEgQ3JlYXRlQ29udGFpbmVyUmVxdWVzdAphbGxvd19wcm9jZXNzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfcHJvY2Vzczogc3RhcnQiKQoKICAgIGFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgYWxsb3dfY2FwcyhwX3Byb2Nlc3MuQ2FwYWJpbGl0aWVzLCBpX3Byb2Nlc3MuQ2FwYWJpbGl0aWVzKQogICAgcF9wcm9jZXNzLlRlcm1pbmFsID09IGlfcHJvY2Vzcy5UZXJtaW5hbAoKICAgIHByaW50KCJhbGxvd19wcm9jZXNzOiB0cnVlIikKfQoKIyBDb21wYXJlIHRoZSBPQ0kgUHJvY2VzcyBmaWVsZCBvZiBhIHBvbGljeSBjb250YWluZXIgd2l0aCB0aGUgaW5wdXQgcHJvY2VzcyBmaWVsZCBmcm9tIEV4ZWNQcm9jZXNzUmVxdWVzdAphbGxvd19pbnRlcmFjdGl2ZV9wcm9jZXNzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfaW50ZXJhY3RpdmVfcHJvY2Vzczogc3RhcnQiKQoKICAgIGFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgYWxsb3dfZXhlY19jYXBzKGlfcHJvY2Vzcy5DYXBhYmlsaXRpZXMpCgogICAgIyBUaGVzZSBhcmUgY29tbWFuZHMgZW5hYmxlZCB1c2luZyBFeGVjUHJvY2Vzc1JlcXVlc3QgY29tbWFuZHMgYW5kL29yIHJlZ2V4IGZyb20gdGhlIHNldHRpbmdzIGZpbGUuCiAgICAjIFRoZXkgY2FuIGJlIGV4ZWN1dGVkIGludGVyYWN0aXZlbHkgc28gYWxsb3cgdGhlbSB0byB1c2UgYW55IHZhbHVlIGZvciBpX3Byb2Nlc3MuVGVybWluYWwuCgogICAgcHJpbnQoImFsbG93X2ludGVyYWN0aXZlX3Byb2Nlc3M6IHRydWUiKQp9CgojIENvbXBhcmUgdGhlIE9DSSBQcm9jZXNzIGZpZWxkIG9mIGEgcG9saWN5IGNvbnRhaW5lciB3aXRoIHRoZSBpbnB1dCBwcm9jZXNzIGZpZWxkIGZyb20gRXhlY1Byb2Nlc3NSZXF1ZXN0CmFsbG93X3Byb2JlX3Byb2Nlc3MocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19wcm9iZV9wcm9jZXNzOiBzdGFydCIpCgogICAgYWxsb3dfcHJvY2Vzc19jb21tb24ocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpCiAgICBhbGxvd19leGVjX2NhcHMoaV9wcm9jZXNzLkNhcGFiaWxpdGllcykKICAgIHBfcHJvY2Vzcy5UZXJtaW5hbCA9PSBpX3Byb2Nlc3MuVGVybWluYWwKCiAgICBwcmludCgiYWxsb3dfcHJvYmVfcHJvY2VzczogdHJ1ZSIpCn0KCmFsbG93X3VzZXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MpIHsKICAgIHBfdXNlciA6PSBwX3Byb2Nlc3MuVXNlcgogICAgaV91c2VyIDo9IGlfcHJvY2Vzcy5Vc2VyCgogICAgcHJpbnQoImFsbG93X3VzZXI6IGlucHV0IHVpZCA9IiwgaV91c2VyLlVJRCwgInBvbGljeSB1aWQgPSIsIHBfdXNlci5VSUQpCiAgICBwX3VzZXIuVUlEID09IGlfdXNlci5VSUQKCiAgICAjIFRPRE86IHRyYWNrIGRvd24gdGhlIHJlYXNvbiBmb3IgcmVnaXN0cnkuazhzLmlvL3BhdXNlOjMuOSBiZWluZwogICAgIyAgICAgICBleGVjdXRlZCB3aXRoIGdpZCA9IDAgZGVzcGl0ZSBoYXZpbmcgIjY1NTM1OjY1NTM1IiBpbiBpdHMgY29udGFpbmVyIGltYWdlCiAgICAjICAgICAgIGNvbmZpZy4KICAgICNwcmludCgiYWxsb3dfdXNlcjogaW5wdXQgZ2lkID0iLCBpX3VzZXIuR0lELCAicG9saWN5IGdpZCA9IiwgcF91c2VyLkdJRCkKICAgICNwX3VzZXIuR0lEID09IGlfdXNlci5HSUQKCiAgICAjIFRPRE86IGNvbXBhcmUgdGhlIGFkZGl0aW9uYWxHaWRzIGZpZWxkIHRvbyBhZnRlciBjb21wdXRpbmcgaXRzIHZhbHVlCiAgICAjIGJhc2VkIG9uIC9ldGMvcGFzc3dkIGFuZCAvZXRjL2dyb3VwIGZyb20gdGhlIGNvbnRhaW5lciBpbWFnZS4KfQoKYWxsb3dfZGVwcmVjYXRlZF9hcmdzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZ3MgMTogbm8gYXJncyIpCgogICAgbm90IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJncwogICAgbm90IGlfcHJvY2Vzcy5BcmdzCgogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAxOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZ3MocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSkgewogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiBwb2xpY3kgYXJncyA9IiwgcF9wcm9jZXNzLkRlcHJlY2F0ZWRBcmdzKQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiBpbnB1dCBhcmdzID0iLCBpX3Byb2Nlc3MuQXJncykKCiAgICBjb3VudChwX3Byb2Nlc3MuRGVwcmVjYXRlZEFyZ3MpID09IGNvdW50KGlfcHJvY2Vzcy5BcmdzKQoKICAgIGV2ZXJ5IGksIGlfYXJnIGluIGlfcHJvY2Vzcy5BcmdzIHsKICAgICAgICBhbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpCiAgICB9CgogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDE6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgcF9hcmcyIDo9IHJlcGxhY2UocF9hcmcsICIkJCIsICIkIikKICAgIHBfYXJnMiA9PSBpX2FyZwoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAxOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDI6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgIyBUT0RPOiBjYW4gJChub2RlLW5hbWUpIGJlIGhhbmRsZWQgYmV0dGVyPwogICAgY29udGFpbnMocF9hcmcsICIkKG5vZGUtbmFtZSkiKQoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAyOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDM6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgcF9hcmcyIDo9IHJlcGxhY2UocF9hcmcsICIkJCIsICIkIikKICAgIHBfYXJnMyA6PSByZXBsYWNlKHBfYXJnMiwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAzOiBwX2FyZzMgPSIsIHBfYXJnMykKICAgIHBfYXJnMyA9PSBpX2FyZwoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAzOiB0cnVlIikKfQoKIyBPQ0kgcHJvY2Vzcy5FbnYgZmllbGQKYWxsb3dfZW52KHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfZW52OiBwIGVudiA9IiwgcF9wcm9jZXNzLkVudikKICAgIHByaW50KCJhbGxvd19lbnY6IGkgZW52ID0iLCBpX3Byb2Nlc3MuRW52KQoKICAgIGV2ZXJ5IGlfdmFyIGluIGlfcHJvY2Vzcy5FbnYgewogICAgICAgIHByaW50KCJhbGxvd19lbnY6IGlfdmFyID0iLCBpX3ZhcikKICAgICAgICBhbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgfQoKICAgIHByaW50KCJhbGxvd19lbnY6IHRydWUiKQp9CgojIEFsbG93IGlucHV0IGVudiB2YXJpYWJsZXMgdGhhdCBhcmUgcHJlc2VudCBpbiB0aGUgcG9saWN5IGRhdGEgdG9vLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHBfdmFyID09IGlfdmFyCiAgICBwcmludCgiYWxsb3dfdmFyIDE6IHRydWUiKQp9CgojIE1hdGNoIGlucHV0IHdpdGggb25lIG9mIHRoZSBwb2xpY3kgdmFyaWFibGVzLCBhZnRlciBzdWJzdGl0dXRpbmcgJChzYW5kYm94LW5hbWUpLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHByaW50KCJhbGxvd192YXIgMjogcF92YXIgPSIsIHBfdmFyKQoKICAgIHBfdmFyX3NwbGl0IDo9IHNwbGl0KHBfdmFyLCAiPSIpCiAgICBjb3VudChwX3Zhcl9zcGxpdCkgPT0gMgoKICAgIHBfdmFyX3NwbGl0WzFdID09ICIkKHNhbmRib3gtbmFtZSkiCgogICAgaV92YXJfc3BsaXQgOj0gc3BsaXQoaV92YXIsICI9IikKICAgIGNvdW50KGlfdmFyX3NwbGl0KSA9PSAyCgogICAgaV92YXJfc3BsaXRbMF0gPT0gcF92YXJfc3BsaXRbMF0KICAgIHJlZ2V4Lm1hdGNoKHNfbmFtZSwgaV92YXJfc3BsaXRbMV0pCgogICAgcHJpbnQoImFsbG93X3ZhciAyOiB0cnVlIikKfQoKIyBBbGxvdyBpbnB1dCBlbnYgdmFyaWFibGVzIHRoYXQgbWF0Y2ggd2l0aCBhIHJlcXVlc3RfZGVmYXVsdHMgcmVnZXguCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHNvbWUgcF9yZWdleDEgaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5DcmVhdGVDb250YWluZXJSZXF1ZXN0LmFsbG93X2Vudl9yZWdleAogICAgcF9yZWdleDIgOj0gcmVwbGFjZShwX3JlZ2V4MSwgIiQoaXB2NF9hKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcHY0X2EpCiAgICBwX3JlZ2V4MyA6PSByZXBsYWNlKHBfcmVnZXgyLCAiJChpcF9wKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcF9wKQogICAgcF9yZWdleDQgOj0gcmVwbGFjZShwX3JlZ2V4MywgIiQoc3ZjX25hbWUpIiwgcG9saWN5X2RhdGEuY29tbW9uLnN2Y19uYW1lKQogICAgcF9yZWdleDUgOj0gcmVwbGFjZShwX3JlZ2V4NCwgIiQoZG5zX2xhYmVsKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5kbnNfbGFiZWwpCgogICAgcHJpbnQoImFsbG93X3ZhciAzOiBwX3JlZ2V4NSA9IiwgcF9yZWdleDUpCiAgICByZWdleC5tYXRjaChwX3JlZ2V4NSwgaV92YXIpCgogICAgcHJpbnQoImFsbG93X3ZhciAzOiB0cnVlIikKfQoKIyBBbGxvdyBmaWVsZFJlZiAiZmllbGRQYXRoOiBzdGF0dXMucG9kSVAiIHZhbHVlcy4KYWxsb3dfdmFyKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBpX3Zhciwgc19uYW1lLCBzX25hbWVzcGFjZSkgewogICAgbmFtZV92YWx1ZSA6PSBzcGxpdChpX3ZhciwgIj0iKQogICAgY291bnQobmFtZV92YWx1ZSkgPT0gMgogICAgaXNfaXAobmFtZV92YWx1ZVsxXSkKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIGFsbG93X3BvZF9pcF92YXIobmFtZV92YWx1ZVswXSwgcF92YXIpCgogICAgcHJpbnQoImFsbG93X3ZhciA0OiB0cnVlIikKfQoKIyBBbGxvdyBjb21tb24gZmllbGRSZWYgdmFyaWFibGVzLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBuYW1lX3ZhbHVlIDo9IHNwbGl0KGlfdmFyLCAiPSIpCiAgICBjb3VudChuYW1lX3ZhbHVlKSA9PSAyCgogICAgc29tZSBwX3ZhciBpbiBwX3Byb2Nlc3MuRW52CiAgICBwX25hbWVfdmFsdWUgOj0gc3BsaXQocF92YXIsICI9IikKICAgIGNvdW50KHBfbmFtZV92YWx1ZSkgPT0gMgoKICAgIHBfbmFtZV92YWx1ZVswXSA9PSBuYW1lX3ZhbHVlWzBdCgogICAgIyBUT0RPOiBzaG91bGQgdGhlc2UgYmUgaGFuZGxlZCBpbiBhIGRpZmZlcmVudCB3YXk/CiAgICBhbHdheXNfYWxsb3dlZCA6PSBbIiQoaG9zdC1uYW1lKSIsICIkKG5vZGUtbmFtZSkiLCAiJChwb2QtdWlkKSJdCiAgICBzb21lIGFsbG93ZWQgaW4gYWx3YXlzX2FsbG93ZWQKICAgIGNvbnRhaW5zKHBfbmFtZV92YWx1ZVsxXSwgYWxsb3dlZCkKCiAgICBwcmludCgiYWxsb3dfdmFyIDU6IHRydWUiKQp9CgojIEFsbG93IGZpZWxkUmVmICJmaWVsZFBhdGg6IHN0YXR1cy5ob3N0SVAiIHZhbHVlcy4KYWxsb3dfdmFyKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBpX3Zhciwgc19uYW1lLCBzX25hbWVzcGFjZSkgewogICAgbmFtZV92YWx1ZSA6PSBzcGxpdChpX3ZhciwgIj0iKQogICAgY291bnQobmFtZV92YWx1ZSkgPT0gMgogICAgaXNfaXAobmFtZV92YWx1ZVsxXSkKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIGFsbG93X2hvc3RfaXBfdmFyKG5hbWVfdmFsdWVbMF0sIHBfdmFyKQoKICAgIHByaW50KCJhbGxvd192YXIgNjogdHJ1ZSIpCn0KCiMgQWxsb3cgcmVzb3VyY2VGaWVsZFJlZiB2YWx1ZXMgKGUuZy4sICJsaW1pdHMuY3B1IikuCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIG5hbWVfdmFsdWUgOj0gc3BsaXQoaV92YXIsICI9IikKICAgIGNvdW50KG5hbWVfdmFsdWUpID09IDIKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHBfbmFtZV92YWx1ZSA6PSBzcGxpdChwX3ZhciwgIj0iKQogICAgY291bnQocF9uYW1lX3ZhbHVlKSA9PSAyCgogICAgcF9uYW1lX3ZhbHVlWzBdID09IG5hbWVfdmFsdWVbMF0KCiAgICAjIGEgdmFyaWFibGUgd2Ugc2hvdWxkIGJlIHZhbGlkYXRpbmcgdXNpbmcgYSByZWdleCBmcm9tIHNldHRpbmdzCiAgICBwX25hbWVfdmFsdWVbMV0gPT0gIiQodmFsaWRhdGUtZnJvbS1zZXR0aW5ncykiCgogICAgcmVnZXhfdmFsIDo9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuQ3JlYXRlQ29udGFpbmVyUmVxdWVzdC5hbGxvd19lbnZfcmVnZXhfbWFwW25hbWVfdmFsdWVbMF1dCgogICAgcHJpbnQoImFsbG93X3ZhciA3OiB2YWwgPSIsIG5hbWVfdmFsdWVbMV0pCiAgICBwcmludCgiYWxsb3dfdmFyIDc6IHJlZ2V4X3ZhbCA9IiwgcmVnZXhfdmFsKQoKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4X3ZhbCwgbmFtZV92YWx1ZVsxXSkKCiAgICBwcmludCgiYWxsb3dfdmFyIDc6IHRydWUiKQp9CgojIE1hdGNoIGlucHV0IHdpdGggb25lIG9mIHRoZSBwb2xpY3kgdmFyaWFibGVzLCBhZnRlciBzdWJzdGl0dXRpbmcgJChzYW5kYm94LW5hbWVzcGFjZSkuCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHNvbWUgcF92YXIgaW4gcF9wcm9jZXNzLkVudgogICAgcF92YXIyIDo9IHJlcGxhY2UocF92YXIsICIkKHNhbmRib3gtbmFtZXNwYWNlKSIsIHNfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd192YXIgODogcF92YXIyID0iLCBwX3ZhcjIpCiAgICBwX3ZhcjIgPT0gaV92YXIKCiAgICBwcmludCgiYWxsb3dfdmFyIDg6IHRydWUiKQp9CgphbGxvd19wb2RfaXBfdmFyKHZhcl9uYW1lLCBwX3ZhcikgewogICAgcHJpbnQoImFsbG93X3BvZF9pcF92YXI6IHZhcl9uYW1lID0iLCB2YXJfbmFtZSwgInBfdmFyID0iLCBwX3ZhcikKCiAgICBwX25hbWVfdmFsdWUgOj0gc3BsaXQocF92YXIsICI9IikKICAgIGNvdW50KHBfbmFtZV92YWx1ZSkgPT0gMgoKICAgIHBfbmFtZV92YWx1ZVswXSA9PSB2YXJfbmFtZQogICAgcF9uYW1lX3ZhbHVlWzFdID09ICIkKHBvZC1pcCkiCgogICAgcHJpbnQoImFsbG93X3BvZF9pcF92YXI6IHRydWUiKQp9CgphbGxvd19ob3N0X2lwX3Zhcih2YXJfbmFtZSwgcF92YXIpIHsKICAgIHByaW50KCJhbGxvd19ob3N0X2lwX3ZhcjogdmFyX25hbWUgPSIsIHZhcl9uYW1lLCAicF92YXIgPSIsIHBfdmFyKQoKICAgIHBfbmFtZV92YWx1ZSA6PSBzcGxpdChwX3ZhciwgIj0iKQogICAgY291bnQocF9uYW1lX3ZhbHVlKSA9PSAyCgogICAgcF9uYW1lX3ZhbHVlWzBdID09IHZhcl9uYW1lCiAgICBwX25hbWVfdmFsdWVbMV0gPT0gIiQoaG9zdC1pcCkiCgogICAgcHJpbnQoImFsbG93X2hvc3RfaXBfdmFyOiB0cnVlIikKfQoKaXNfaXAodmFsdWUpIHsKICAgIGJ5dGVzID0gc3BsaXQodmFsdWUsICIuIikKICAgIGNvdW50KGJ5dGVzKSA9PSA0CgogICAgaXNfaXBfZmlyc3RfYnl0ZShieXRlc1swXSkKICAgIGlzX2lwX290aGVyX2J5dGUoYnl0ZXNbMV0pCiAgICBpc19pcF9vdGhlcl9ieXRlKGJ5dGVzWzJdKQogICAgaXNfaXBfb3RoZXJfYnl0ZShieXRlc1szXSkKfQppc19pcF9maXJzdF9ieXRlKGNvbXBvbmVudCkgewogICAgbnVtYmVyID0gdG9fbnVtYmVyKGNvbXBvbmVudCkKICAgIG51bWJlciA+PSAxCiAgICBudW1iZXIgPD0gMjU1Cn0KaXNfaXBfb3RoZXJfYnl0ZShjb21wb25lbnQpIHsKICAgIG51bWJlciA9IHRvX251bWJlcihjb21wb25lbnQpCiAgICBudW1iZXIgPj0gMAogICAgbnVtYmVyIDw9IDI1NQp9CgojIE9DSSByb290LlBhdGgKYWxsb3dfcm9vdF9wYXRoKHBfb2NpLCBpX29jaSwgYnVuZGxlX2lkKSB7CiAgICBpX3BhdGggOj0gaV9vY2kuUm9vdC5QYXRoCiAgICBwX3BhdGgxIDo9IHBfb2NpLlJvb3QuUGF0aAogICAgcHJpbnQoImFsbG93X3Jvb3RfcGF0aDogaV9wYXRoID0iLCBpX3BhdGgsICJwX3BhdGgxID0iLCBwX3BhdGgxKQoKICAgIHBfcGF0aDIgOj0gcmVwbGFjZShwX3BhdGgxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfcm9vdF9wYXRoOiBwX3BhdGgyID0iLCBwX3BhdGgyKQoKICAgIHBfcGF0aDMgOj0gcmVwbGFjZShwX3BhdGgyLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X3Jvb3RfcGF0aDogcF9wYXRoMyA9IiwgcF9wYXRoMykKCiAgICBwX3BhdGgzID09IGlfcGF0aAoKICAgIHByaW50KCJhbGxvd19yb290X3BhdGg6IHRydWUiKQp9CgojIGRldmljZSBtb3VudHMKYWxsb3dfbW91bnQocF9vY2ksIGlfbW91bnQsIGlfc3RvcmFnZXMsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcHJpbnQoImFsbG93X21vdW50OiBpX21vdW50ID0iLCBpX21vdW50KQoKICAgIHNvbWUgcF9tb3VudCBpbiBwX29jaS5Nb3VudHMKICAgIHNvbWUgaV9zdG9yYWdlIGluIGlfc3RvcmFnZXMKCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IHBfbW91bnQgPSIsIHBfbW91bnQpCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IGlfc3RvcmFnZSA9IiwgaV9zdG9yYWdlKQoKICAgIGNoZWNrX21vdW50KHBfbW91bnQsIGlfbW91bnQsIGlfc3RvcmFnZSwgYnVuZGxlX2lkLCBzYW5kYm94X2lkKQoKICAgICMgVE9ETzogYXJlIHRoZXJlIGFueSBvdGhlciByZXF1aXJlZCBwb2xpY3kgY2hlY2tzIGZvciBtb3VudHMgLSBlLmcuLAogICAgIyAgICAgICBtdWx0aXBsZSBtb3VudHMgd2l0aCBzYW1lIHNvdXJjZSBvciBkZXN0aW5hdGlvbj8KCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IHRydWUiKQp9CgpjaGVja19tb3VudChwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcF9tb3VudCA9PSBpX21vdW50CiAgICBwcmludCgiY2hlY2tfbW91bnQgMTogdHJ1ZSIpCn0KY2hlY2tfbW91bnQocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHBfbW91bnQuZGVzdGluYXRpb24gPT0gaV9tb3VudC5kZXN0aW5hdGlvbgogICAgcF9tb3VudC50eXBlXyA9PSBpX21vdW50LnR5cGVfCiAgICBwX21vdW50Lm9wdGlvbnMgPT0gaV9tb3VudC5vcHRpb25zCgogICAgbW91bnRfc291cmNlX2FsbG93cyhwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkKCiAgICBwcmludCgiY2hlY2tfbW91bnQgMjogdHJ1ZSIpCn0KCm1vdW50X3NvdXJjZV9hbGxvd3MocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHJlZ2V4MSA6PSBwX21vdW50LnNvdXJjZQogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5tb3VudF9zb3VyY2VfY3BhdGgpCiAgICByZWdleDQgOj0gcmVwbGFjZShyZWdleDMsICIkKGJ1bmRsZS1pZCkiLCBidW5kbGVfaWQpCgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMTogcmVnZXg0ID0iLCByZWdleDQpCiAgICByZWdleC5tYXRjaChyZWdleDQsIGlfbW91bnQuc291cmNlKQoKICAgIHByaW50KCJtb3VudF9zb3VyY2VfYWxsb3dzIDE6IHRydWUiKQp9Cm1vdW50X3NvdXJjZV9hbGxvd3MocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHJlZ2V4MSA6PSBwX21vdW50LnNvdXJjZQogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5tb3VudF9zb3VyY2VfY3BhdGgpCiAgICByZWdleDQgOj0gcmVwbGFjZShyZWdleDMsICIkKHNhbmRib3gtaWQpIiwgc2FuZGJveF9pZCkKCiAgICBwcmludCgibW91bnRfc291cmNlX2FsbG93cyAyOiByZWdleDQgPSIsIHJlZ2V4NCkKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4NCwgaV9tb3VudC5zb3VyY2UpCgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMjogdHJ1ZSIpCn0KbW91bnRfc291cmNlX2FsbG93cyhwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogaV9tb3VudC5zb3VyY2UgPSIsIGlfbW91bnQuc291cmNlKQogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogaV9zdG9yYWdlLm1vdW50X3BvaW50ID0iLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCgogICAgaV9tb3VudC5zb3VyY2UgPT0gaV9zdG9yYWdlLm1vdW50X3BvaW50CgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogdHJ1ZSIpCn0KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBDcmVhdGUgY29udGFpbmVyIFN0b3JhZ2VzCgphbGxvd19zdG9yYWdlcyhwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHBfY291bnQgOj0gY291bnQocF9zdG9yYWdlcykKICAgIGlfY291bnQgOj0gY291bnQoaV9zdG9yYWdlcykKICAgIHByaW50KCJhbGxvd19zdG9yYWdlczogcF9jb3VudCA9IiwgcF9jb3VudCwgImlfY291bnQgPSIsIGlfY291bnQpCgogICAgcF9jb3VudCA9PSBpX2NvdW50CgogICAgIyBHZXQgdGhlIGNvbnRhaW5lciBpbWFnZSBsYXllciBJRHMgYW5kIHZlcml0eSByb290IGhhc2hlcywgZnJvbSB0aGUgIm92ZXJsYXlmcyIgc3RvcmFnZS4KICAgIHNvbWUgb3ZlcmxheV9zdG9yYWdlIGluIHBfc3RvcmFnZXMKICAgIG92ZXJsYXlfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIHByaW50KCJhbGxvd19zdG9yYWdlczogb3ZlcmxheV9zdG9yYWdlID0iLCBvdmVybGF5X3N0b3JhZ2UpCiAgICBjb3VudChvdmVybGF5X3N0b3JhZ2Uub3B0aW9ucykgPT0gMgoKICAgIGxheWVyX2lkcyA6PSBzcGxpdChvdmVybGF5X3N0b3JhZ2Uub3B0aW9uc1swXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiBsYXllcl9pZHMgPSIsIGxheWVyX2lkcykKCiAgICByb290X2hhc2hlcyA6PSBzcGxpdChvdmVybGF5X3N0b3JhZ2Uub3B0aW9uc1sxXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiByb290X2hhc2hlcyA9Iiwgcm9vdF9oYXNoZXMpCgogICAgZXZlcnkgaV9zdG9yYWdlIGluIGlfc3RvcmFnZXMgewogICAgICAgIGFsbG93X3N0b3JhZ2UocF9zdG9yYWdlcywgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpCiAgICB9CgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiB0cnVlIikKfQoKYWxsb3dfc3RvcmFnZShwX3N0b3JhZ2VzLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgc29tZSBwX3N0b3JhZ2UgaW4gcF9zdG9yYWdlcwoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiBwX3N0b3JhZ2UgPSIsIHBfc3RvcmFnZSkKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiBpX3N0b3JhZ2UgPSIsIGlfc3RvcmFnZSkKCiAgICBwX3N0b3JhZ2UuZHJpdmVyICAgICAgICAgICA9PSBpX3N0b3JhZ2UuZHJpdmVyCiAgICBwX3N0b3JhZ2UuZHJpdmVyX29wdGlvbnMgICA9PSBpX3N0b3JhZ2UuZHJpdmVyX29wdGlvbnMKICAgIHBfc3RvcmFnZS5mc19ncm91cCAgICAgICAgID09IGlfc3RvcmFnZS5mc19ncm91cAogICAgcF9zdG9yYWdlLmZzdHlwZSAgICAgICAgICAgPT0gaV9zdG9yYWdlLmZzdHlwZQoKICAgIGFsbG93X3N0b3JhZ2Vfc291cmNlKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKQogICAgYWxsb3dfc3RvcmFnZV9vcHRpb25zKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKQogICAgYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKQoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiB0cnVlIikKfQoKYWxsb3dfc3RvcmFnZV9zb3VyY2UocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX3NvdXJjZSAxOiBzdGFydCIpCgogICAgcF9zdG9yYWdlLnNvdXJjZSA9PSBpX3N0b3JhZ2Uuc291cmNlCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDE6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX3NvdXJjZShwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDI6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCgogICAgIyBEREREOkJCOkRELkY6IERvbWFpbjpCdXM6RGV2aWNlLkZ1bmN0aW9uCiAgICAjIGh0dHBzOi8vd3d3Lmtlcm5lbC5vcmcvZG9jL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtYnVzLXBjaQogICAgcmVnZXgubWF0Y2goYF5bYS1mMC05XXs0fTpbYS1mMC05XXsyfTpbYS1mMC05XXsyfVwuW2EtZjAtOV0kYCwgaV9zdG9yYWdlLnNvdXJjZSkKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9zb3VyY2UgMjogdHJ1ZSIpCn0KCmFsbG93X3N0b3JhZ2Vfc291cmNlKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKSB7CiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9zb3VyY2UgMzogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIGlfc3RvcmFnZS5zb3VyY2UgPT0gIm5vbmUiCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDM6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX3NvdXJjZShwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDQ6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJzbWIiCgogICAgIyBQYXR0ZXJuOiAvLzxzdG9yYWdlLWFjY291bnQtbmFtZT4uZmlsZS5jb3JlLndpbmRvd3MubmV0LzxrOHMtUFZDLW5hbWU+CiAgICAjIFN0b3JhZ2UgYWNjb3VudCBuYW1lOiBodHRwczovL2xlYXJuLm1pY3Jvc29mdC5jb20vZW4tdXMvYXp1cmUvc3RvcmFnZS9jb21tb24vc3RvcmFnZS1hY2NvdW50LW92ZXJ2aWV3I3N0b3JhZ2UtYWNjb3VudC1uYW1lCiAgICAjIEs4cyBQVkMgbmFtZTogaHR0cHM6Ly9rdWJlcm5ldGVzLmlvL2RvY3MvY29uY2VwdHMvb3ZlcnZpZXcvd29ya2luZy13aXRoLW9iamVjdHMvbmFtZXMvI2Rucy1zdWJkb21haW4tbmFtZXMKICAgIHJlZ2V4Lm1hdGNoKGBeXC9cLyhbYS16MC05XXszLDI0fSlcLmZpbGVcLmNvcmVcLndpbmRvd3NcLm5ldFwvW2EtejAtOV0oW2EtejAtOS4tXXswLDI1MX1bYS16MC05XSk/JGAsIGlfc3RvcmFnZS5zb3VyY2UpCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDQ6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMTogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgIT0gIm92ZXJsYXlmcyIKICAgIHBfc3RvcmFnZS5vcHRpb25zID09IGlfc3RvcmFnZS5vcHRpb25zCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAxOiB0cnVlIikKfQphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIGNvdW50KHBfc3RvcmFnZS5vcHRpb25zKSA9PSAyCgogICAgcG9saWN5X2lkcyA6PSBzcGxpdChwX3N0b3JhZ2Uub3B0aW9uc1swXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBwb2xpY3lfaWRzID0iLCBwb2xpY3lfaWRzKQogICAgcG9saWN5X2lkcyA9PSBsYXllcl9pZHMKCiAgICBwb2xpY3lfaGFzaGVzIDo9IHNwbGl0KHBfc3RvcmFnZS5vcHRpb25zWzFdLCAiOiIpCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IHBvbGljeV9oYXNoZXMgPSIsIHBvbGljeV9oYXNoZXMpCgogICAgcF9jb3VudCA6PSBjb3VudChwb2xpY3lfaWRzKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBwX2NvdW50ID0iLCBwX2NvdW50KQogICAgcF9jb3VudCA+PSAxCiAgICBwX2NvdW50ID09IGNvdW50KHBvbGljeV9oYXNoZXMpCgogICAgaV9jb3VudCA6PSBjb3VudChpX3N0b3JhZ2Uub3B0aW9ucykKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogaV9jb3VudCA9IiwgaV9jb3VudCkKICAgIGlfY291bnQgPT0gcF9jb3VudCArIDMKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zWzBdID0iLCBpX3N0b3JhZ2Uub3B0aW9uc1swXSkKICAgIGlfc3RvcmFnZS5vcHRpb25zWzBdID09ICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQubGF5ZXItc3JjLXByZWZpeD0vdmFyL2xpYi9jb250YWluZXJkL2lvLmNvbnRhaW5lcmQuc25hcHNob3R0ZXIudjEudGFyZGV2L2xheWVycyIKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zW2lfY291bnQgLSAyXSA9IiwgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDJdKQogICAgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDJdID09ICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQub3ZlcmxheS1ydyIKCiAgICBsb3dlcmRpciA6PSBjb25jYXQoIj0iLCBbImxvd2VyZGlyIiwgcF9zdG9yYWdlLm9wdGlvbnNbMF1dKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBsb3dlcmRpciA9IiwgbG93ZXJkaXIpCgogICAgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDFdID09IGxvd2VyZGlyCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zW2lfY291bnQgLSAxXSA9IiwgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDFdKQoKICAgIGV2ZXJ5IGksIHBvbGljeV9pZCBpbiBwb2xpY3lfaWRzIHsKICAgICAgICBhbGxvd19vdmVybGF5X2xheWVyKHBvbGljeV9pZCwgcG9saWN5X2hhc2hlc1tpXSwgaV9zdG9yYWdlLm9wdGlvbnNbaSArIDFdKQogICAgfQoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogdHJ1ZSIpCn0KYWxsb3dfc3RvcmFnZV9vcHRpb25zKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKSB7CiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDM6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCiAgICBjb3VudChwX3N0b3JhZ2Uub3B0aW9ucykgPT0gMQoKICAgIHN0YXJ0c3dpdGgocF9zdG9yYWdlLm9wdGlvbnNbMF0sICIkKGhhc2giKQogICAgaGFzaF9zdWZmaXggOj0gdHJpbV9sZWZ0KHBfc3RvcmFnZS5vcHRpb25zWzBdLCAiJChoYXNoIikKCiAgICBlbmRzd2l0aChoYXNoX3N1ZmZpeCwgIikiKQogICAgaGFzaF9pbmRleCA6PSB0cmltX3JpZ2h0KGhhc2hfc3VmZml4LCAiKSIpCiAgICBpIDo9IHRvX251bWJlcihoYXNoX2luZGV4KQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAzOiBpID0iLCBpKQoKICAgIGhhc2hfb3B0aW9uIDo9IGNvbmNhdCgiPSIsIFsiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LnJvb3QtaGFzaCIsIHJvb3RfaGFzaGVzW2ldXSkKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMzogaGFzaF9vcHRpb24gPSIsIGhhc2hfb3B0aW9uKQoKICAgIGNvdW50KGlfc3RvcmFnZS5vcHRpb25zKSA9PSA0CiAgICBpX3N0b3JhZ2Uub3B0aW9uc1swXSA9PSAicm8iCiAgICBpX3N0b3JhZ2Uub3B0aW9uc1sxXSA9PSAiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmJsb2NrX2RldmljZT1maWxlIgogICAgaV9zdG9yYWdlLm9wdGlvbnNbMl0gPT0gImlvLmthdGFjb250YWluZXJzLmZzLW9wdC5pcy1sYXllciIKICAgIGlfc3RvcmFnZS5vcHRpb25zWzNdID09IGhhc2hfb3B0aW9uCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAzOiB0cnVlIikKfQphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgNDogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gInNtYiIKICAgIHBfb3B0c19jb3VudCA6PSBjb3VudChwX3N0b3JhZ2Uub3B0aW9ucykKICAgIGlfb3B0c19jb3VudCA6PSBjb3VudChpX3N0b3JhZ2Uub3B0aW9ucykKICAgIGlfb3B0c19jb3VudCA9PSBwX29wdHNfY291bnQgKyAyCgogICAgaV9vcHRfbWF0Y2hlcyA6PSBbaSB8IGkgOj0gaWR4OyBpZHggPCBwX29wdHNfY291bnQ7IHBfc3RvcmFnZS5vcHRpb25zW2lkeF0gPT0gaV9zdG9yYWdlLm9wdGlvbnNbaWR4XV0KICAgIGNvdW50KGlfb3B0X21hdGNoZXMpID09IHBfb3B0c19jb3VudAoKICAgIHN0YXJ0c3dpdGgoaV9zdG9yYWdlLm9wdGlvbnNbaV9vcHRzX2NvdW50LTJdLCAiYWRkcj0iKQogICAgY3JlZHMgPSBzcGxpdChpX3N0b3JhZ2Uub3B0aW9uc1tpX29wdHNfY291bnQtMV0sICIsIikKICAgIGNvdW50KGNyZWRzKSA9PSAyCiAgICBzdGFydHN3aXRoKGNyZWRzWzBdLCAidXNlcm5hbWU9IikKICAgIHN0YXJ0c3dpdGgoY3JlZHNbMV0sICJwYXNzd29yZD0iKQogICAgCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDQ6IHRydWUiKQp9CgphbGxvd19vdmVybGF5X2xheWVyKHBvbGljeV9pZCwgcG9saWN5X2hhc2gsIGlfb3B0aW9uKSB7CiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogcG9saWN5X2lkID0iLCBwb2xpY3lfaWQsICJwb2xpY3lfaGFzaCA9IiwgcG9saWN5X2hhc2gpCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogaV9vcHRpb24gPSIsIGlfb3B0aW9uKQoKICAgIHN0YXJ0c3dpdGgoaV9vcHRpb24sICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQubGF5ZXI9IikKICAgIGlfdmFsdWUgOj0gcmVwbGFjZShpX29wdGlvbiwgImlvLmthdGFjb250YWluZXJzLmZzLW9wdC5sYXllcj0iLCAiIikKICAgIGlfdmFsdWVfZGVjb2RlZCA6PSBiYXNlNjQuZGVjb2RlKGlfdmFsdWUpCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogaV92YWx1ZV9kZWNvZGVkID0iLCBpX3ZhbHVlX2RlY29kZWQpCgogICAgcG9saWN5X3N1ZmZpeCA6PSBjb25jYXQoIj0iLCBbInRhcixybyxpby5rYXRhY29udGFpbmVycy5mcy1vcHQuYmxvY2tfZGV2aWNlPWZpbGUsaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmlzLWxheWVyLGlvLmthdGFjb250YWluZXJzLmZzLW9wdC5yb290LWhhc2giLCBwb2xpY3lfaGFzaF0pCiAgICBwX3ZhbHVlIDo9IGNvbmNhdCgiLCIsIFtwb2xpY3lfaWQsIHBvbGljeV9zdWZmaXhdKQogICAgcHJpbnQoImFsbG93X292ZXJsYXlfbGF5ZXI6IHBfdmFsdWUgPSIsIHBfdmFsdWUpCgogICAgcF92YWx1ZSA9PSBpX3ZhbHVlX2RlY29kZWQKCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogdHJ1ZSIpCn0KCmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAidGFyIgoKICAgIHN0YXJ0c3dpdGgocF9zdG9yYWdlLm1vdW50X3BvaW50LCAiJChsYXllciIpCiAgICBtb3VudF9zdWZmaXggOj0gdHJpbV9sZWZ0KHBfc3RvcmFnZS5tb3VudF9wb2ludCwgIiQobGF5ZXIiKQoKICAgIGVuZHN3aXRoKG1vdW50X3N1ZmZpeCwgIikiKQogICAgbGF5ZXJfaW5kZXggOj0gdHJpbV9yaWdodChtb3VudF9zdWZmaXgsICIpIikKICAgIGkgOj0gdG9fbnVtYmVyKGxheWVyX2luZGV4KQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDE6IGkgPSIsIGkpCgogICAgbGF5ZXJfaWQgOj0gbGF5ZXJfaWRzW2ldCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMTogbGF5ZXJfaWQgPSIsIGxheWVyX2lkKQoKICAgIHBfbW91bnQgOj0gY29uY2F0KCIvIiwgWyIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L2xheWVycyIsIGxheWVyX2lkXSkKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCAxOiBwX21vdW50ID0iLCBwX21vdW50KQoKICAgIHBfbW91bnQgPT0gaV9zdG9yYWdlLm1vdW50X3BvaW50CgogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDE6IHRydWUiKQp9CmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAiZnVzZTMua2F0YS1vdmVybGF5IgoKICAgIG1vdW50MSA6PSByZXBsYWNlKHBfc3RvcmFnZS5tb3VudF9wb2ludCwgIiQoY3BhdGgpIiwgcG9saWN5X2RhdGEuY29tbW9uLmNwYXRoKQogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDI6IG1vdW50MiA9IiwgbW91bnQyKQoKICAgIG1vdW50MiA9PSBpX3N0b3JhZ2UubW91bnRfcG9pbnQKCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMjogdHJ1ZSIpCn0KYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKSB7CiAgICBwX3N0b3JhZ2UuZnN0eXBlID09ICJsb2NhbCIKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQyID0iLCBtb3VudDIpCgogICAgbW91bnQzIDo9IHJlcGxhY2UobW91bnQyLCAiJChzYW5kYm94LWlkKSIsIHNhbmRib3hfaWQpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQzID0iLCBtb3VudDMpCgogICAgcmVnZXgubWF0Y2gobW91bnQzLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCgogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDM6IHRydWUiKQp9CmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAiYmluZCIKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNDogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNDogbW91bnQyID0iLCBtb3VudDIpCgogICAgbW91bnQzIDo9IHJlcGxhY2UobW91bnQyLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDQ6IG1vdW50MyA9IiwgbW91bnQzKQoKICAgIHJlZ2V4Lm1hdGNoKG1vdW50MywgaV9zdG9yYWdlLm1vdW50X3BvaW50KQoKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA0OiB0cnVlIikKfQphbGxvd19tb3VudF9wb2ludChwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgYnVuZGxlX2lkLCBzYW5kYm94X2lkLCBsYXllcl9pZHMpIHsKICAgIHBfc3RvcmFnZS5mc3R5cGUgPT0gInRtcGZzIgoKICAgIG1vdW50MSA6PSBwX3N0b3JhZ2UubW91bnRfcG9pbnQKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA1OiBtb3VudDEgPSIsIG1vdW50MSkKCiAgICByZWdleC5tYXRjaChtb3VudDEsIGlfc3RvcmFnZS5tb3VudF9wb2ludCkKCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNTogdHJ1ZSIpCn0KYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKSB7CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogaV9zdG9yYWdlLm1vdW50X3BvaW50ID0iLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCiAgICBhbGxvd19kaXJlY3Rfdm9sX2RyaXZlcihwX3N0b3JhZ2UsIGlfc3RvcmFnZSkKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChzcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQyID0iLCBtb3VudDIpCgogICAgZGlyZWN0X3ZvbF9wYXRoIDo9IGlfc3RvcmFnZS5zb3VyY2UKICAgIG1vdW50MyA6PSByZXBsYWNlKG1vdW50MiwgIiQoYjY0LWRpcmVjdC12b2wtcGF0aCkiLCBiYXNlNjR1cmwuZW5jb2RlKGRpcmVjdF92b2xfcGF0aCkpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQzID0iLCBtb3VudDMpCgogICAgbW91bnQzID09IGlfc3RvcmFnZS5tb3VudF9wb2ludAoKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA2OiB0cnVlIikKfQoKYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIocF9zdG9yYWdlLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19kaXJlY3Rfdm9sX2RyaXZlciAxOiBzdGFydCIpCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCiAgICBwcmludCgiYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIgMTogdHJ1ZSIpCn0KYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIocF9zdG9yYWdlLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19kaXJlY3Rfdm9sX2RyaXZlciAyOiBzdGFydCIpCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJzbWIiCiAgICBwcmludCgiYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIgMjogdHJ1ZSIpCn0KCiMgRXhlY1Byb2Nlc3NSZXF1ZXN0LnByb2Nlc3MuQ2FwYWJpbGl0aWVzCmFsbG93X2V4ZWNfY2FwcyhpX2NhcHMpIHsKICAgIG5vdCBpX2NhcHMuQW1iaWVudAogICAgbm90IGlfY2Fwcy5Cb3VuZGluZwogICAgbm90IGlfY2Fwcy5FZmZlY3RpdmUKICAgIG5vdCBpX2NhcHMuSW5oZXJpdGFibGUKICAgIG5vdCBpX2NhcHMuUGVybWl0dGVkCn0KCiMgT0NJLlByb2Nlc3MuQ2FwYWJpbGl0aWVzCmFsbG93X2NhcHMocF9jYXBzLCBpX2NhcHMpIHsKICAgIHByaW50KCJhbGxvd19jYXBzOiBwb2xpY3kgQW1iaWVudCA9IiwgcF9jYXBzLkFtYmllbnQpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgQW1iaWVudCA9IiwgaV9jYXBzLkFtYmllbnQpCiAgICBtYXRjaF9jYXBzKHBfY2Fwcy5BbWJpZW50LCBpX2NhcHMuQW1iaWVudCkKCiAgICBwcmludCgiYWxsb3dfY2FwczogcG9saWN5IEJvdW5kaW5nID0iLCBwX2NhcHMuQm91bmRpbmcpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgQm91bmRpbmcgPSIsIGlfY2Fwcy5Cb3VuZGluZykKICAgIG1hdGNoX2NhcHMocF9jYXBzLkJvdW5kaW5nLCBpX2NhcHMuQm91bmRpbmcpCgogICAgcHJpbnQoImFsbG93X2NhcHM6IHBvbGljeSBFZmZlY3RpdmUgPSIsIHBfY2Fwcy5FZmZlY3RpdmUpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgRWZmZWN0aXZlID0iLCBpX2NhcHMuRWZmZWN0aXZlKQogICAgbWF0Y2hfY2FwcyhwX2NhcHMuRWZmZWN0aXZlLCBpX2NhcHMuRWZmZWN0aXZlKQoKICAgIHByaW50KCJhbGxvd19jYXBzOiBwb2xpY3kgSW5oZXJpdGFibGUgPSIsIHBfY2Fwcy5Jbmhlcml0YWJsZSkKICAgIHByaW50KCJhbGxvd19jYXBzOiBpbnB1dCBJbmhlcml0YWJsZSA9IiwgaV9jYXBzLkluaGVyaXRhYmxlKQogICAgbWF0Y2hfY2FwcyhwX2NhcHMuSW5oZXJpdGFibGUsIGlfY2Fwcy5Jbmhlcml0YWJsZSkKCiAgICBwcmludCgiYWxsb3dfY2FwczogcG9saWN5IFBlcm1pdHRlZCA9IiwgcF9jYXBzLlBlcm1pdHRlZCkKICAgIHByaW50KCJhbGxvd19jYXBzOiBpbnB1dCBQZXJtaXR0ZWQgPSIsIGlfY2Fwcy5QZXJtaXR0ZWQpCiAgICBtYXRjaF9jYXBzKHBfY2Fwcy5QZXJtaXR0ZWQsIGlfY2Fwcy5QZXJtaXR0ZWQpCn0KCm1hdGNoX2NhcHMocF9jYXBzLCBpX2NhcHMpIHsKICAgIHByaW50KCJtYXRjaF9jYXBzIDE6IHN0YXJ0IikKCiAgICBwX2NhcHMgPT0gaV9jYXBzCgogICAgcHJpbnQoIm1hdGNoX2NhcHMgMTogdHJ1ZSIpCn0KbWF0Y2hfY2FwcyhwX2NhcHMsIGlfY2FwcykgewogICAgcHJpbnQoIm1hdGNoX2NhcHMgMjogc3RhcnQiKQoKICAgIGNvdW50KHBfY2FwcykgPT0gMQogICAgcF9jYXBzWzBdID09ICIkKGRlZmF1bHRfY2FwcykiCgogICAgcHJpbnQoIm1hdGNoX2NhcHMgMjogZGVmYXVsdF9jYXBzID0iLCBwb2xpY3lfZGF0YS5jb21tb24uZGVmYXVsdF9jYXBzKQogICAgcG9saWN5X2RhdGEuY29tbW9uLmRlZmF1bHRfY2FwcyA9PSBpX2NhcHMKCiAgICBwcmludCgibWF0Y2hfY2FwcyAyOiB0cnVlIikKfQptYXRjaF9jYXBzKHBfY2FwcywgaV9jYXBzKSB7CiAgICBwcmludCgibWF0Y2hfY2FwcyAzOiBzdGFydCIpCgogICAgY291bnQocF9jYXBzKSA9PSAxCiAgICBwX2NhcHNbMF0gPT0gIiQocHJpdmlsZWdlZF9jYXBzKSIKCiAgICBwcmludCgibWF0Y2hfY2FwcyAzOiBwcml2aWxlZ2VkX2NhcHMgPSIsIHBvbGljeV9kYXRhLmNvbW1vbi5wcml2aWxlZ2VkX2NhcHMpCiAgICBwb2xpY3lfZGF0YS5jb21tb24ucHJpdmlsZWdlZF9jYXBzID09IGlfY2FwcwoKICAgIHByaW50KCJtYXRjaF9jYXBzIDM6IHRydWUiKQp9CgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgpjaGVja19kaXJlY3RvcnlfdHJhdmVyc2FsKGlfcGF0aCkgewogICAgbm90IHJlZ2V4Lm1hdGNoKCIoXnwvKS4uKCR8LykiLCBpX3BhdGgpCn0KCmNoZWNrX3N5bWxpbmtfc291cmNlKGlfc3JjKSB7CiAgICBpX3NyYyA9PSAiIgogICAgcHJpbnQoImNoZWNrX3N5bWxpbmtfc291cmNlIDE6IHRydWUiKQp9CmNoZWNrX3N5bWxpbmtfc291cmNlKGlfc3JjKSB7CiAgICBpX3NyYyAhPSAiIgogICAgcHJpbnQoImNoZWNrX3N5bWxpbmtfc291cmNlIDI6IGlfc3JjID0iLCBpX3NyYykKCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24uc19zb3VyY2UxLCBpX3NyYykKCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMjogdHJ1ZSIpCn0KY2hlY2tfc3ltbGlua19zb3VyY2UoaV9zcmMpIHsKICAgIGlfc3JjICE9ICIiCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMzogaV9zcmMgPSIsIGlfc3JjKQoKICAgIHJlZ2V4Lm1hdGNoKHBvbGljeV9kYXRhLmNvbW1vbi5zX3NvdXJjZTIsIGlfc3JjKQogICAgY2hlY2tfZGlyZWN0b3J5X3RyYXZlcnNhbChpX3NyYykKCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMzogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfc3RvcmFnZXMoaV9zdG9yYWdlcykgewogICAgcHJpbnQoImFsbG93X3NhbmRib3hfc3RvcmFnZXM6IGlfc3RvcmFnZXMgPSIsIGlfc3RvcmFnZXMpCgogICAgcF9zdG9yYWdlcyA6PSBwb2xpY3lfZGF0YS5zYW5kYm94LnN0b3JhZ2VzCiAgICBldmVyeSBpX3N0b3JhZ2UgaW4gaV9zdG9yYWdlcyB7CiAgICAgICAgYWxsb3dfc2FuZGJveF9zdG9yYWdlKHBfc3RvcmFnZXMsIGlfc3RvcmFnZSkKICAgIH0KCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9zdG9yYWdlczogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfc3RvcmFnZShwX3N0b3JhZ2VzLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IGlfc3RvcmFnZSA9IiwgaV9zdG9yYWdlKQoKICAgIHNvbWUgcF9zdG9yYWdlIGluIHBfc3RvcmFnZXMKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IHBfc3RvcmFnZSA9IiwgcF9zdG9yYWdlKQogICAgaV9zdG9yYWdlID09IHBfc3RvcmFnZQoKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IHRydWUiKQp9CgpDb3B5RmlsZVJlcXVlc3QgewogICAgcHJpbnQoIkNvcHlGaWxlUmVxdWVzdDogaW5wdXQucGF0aCA9IiwgaW5wdXQucGF0aCkKCiAgICBjaGVja19zeW1saW5rX3NvdXJjZShpbnB1dC5zeW1saW5rX3NyYykKICAgIGNoZWNrX2RpcmVjdG9yeV90cmF2ZXJzYWwoaW5wdXQucGF0aCkKCiAgICBzb21lIHJlZ2V4MSBpbiBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLkNvcHlGaWxlUmVxdWVzdAogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5jcGF0aCkKICAgIHJlZ2V4NCA6PSByZXBsYWNlKHJlZ2V4MywgIiQoYnVuZGxlLWlkKSIsIEJVTkRMRV9JRCkKICAgIHByaW50KCJDb3B5RmlsZVJlcXVlc3Q6IHJlZ2V4NCA9IiwgcmVnZXg0KQoKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4NCwgaW5wdXQucGF0aCkKCiAgICBwcmludCgiQ29weUZpbGVSZXF1ZXN0OiB0cnVlIikKfQoKQ3JlYXRlU2FuZGJveFJlcXVlc3QgewogICAgcHJpbnQoIkNyZWF0ZVNhbmRib3hSZXF1ZXN0OiBpbnB1dC5ndWVzdF9ob29rX3BhdGggPSIsIGlucHV0Lmd1ZXN0X2hvb2tfcGF0aCkKICAgIGNvdW50KGlucHV0Lmd1ZXN0X2hvb2tfcGF0aCkgPT0gMAoKICAgIHByaW50KCJDcmVhdGVTYW5kYm94UmVxdWVzdDogaW5wdXQua2VybmVsX21vZHVsZXMgPSIsIGlucHV0Lmtlcm5lbF9tb2R1bGVzKQogICAgY291bnQoaW5wdXQua2VybmVsX21vZHVsZXMpID09IDAKCiAgICBpX3BpZG5zIDo9IGlucHV0LnNhbmRib3hfcGlkbnMKICAgIHByaW50KCJDcmVhdGVTYW5kYm94UmVxdWVzdDogaV9waWRucyA9IiwgaV9waWRucykKICAgIGlfcGlkbnMgPT0gZmFsc2UKICAgIGFsbG93X3NhbmRib3hfc3RvcmFnZXMoaW5wdXQuc3RvcmFnZXMpCn0KCmFsbG93X2V4ZWMocF9jb250YWluZXIsIGlfcHJvY2VzcykgewogICAgcHJpbnQoImFsbG93X2V4ZWM6IHN0YXJ0IikKCiAgICBwX29jaSA9IHBfY29udGFpbmVyLk9DSQogICAgcF9zX25hbWUgPSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc19uYW1lc3BhY2UgPSBnZXRfc3RhdGVfdmFsKCJuYW1lc3BhY2UiKQogICAgYWxsb3dfcHJvYmVfcHJvY2VzcyhwX29jaS5Qcm9jZXNzLCBpX3Byb2Nlc3MsIHBfc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfZXhlYzogdHJ1ZSIpCn0KCmFsbG93X2ludGVyYWN0aXZlX2V4ZWMocF9jb250YWluZXIsIGlfcHJvY2VzcykgewogICAgcHJpbnQoImFsbG93X2ludGVyYWN0aXZlX2V4ZWM6IHN0YXJ0IikKCiAgICBwX29jaSA9IHBfY29udGFpbmVyLk9DSQogICAgcF9zX25hbWUgPSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc19uYW1lc3BhY2UgPSBnZXRfc3RhdGVfdmFsKCJuYW1lc3BhY2UiKQogICAgYWxsb3dfaW50ZXJhY3RpdmVfcHJvY2VzcyhwX29jaS5Qcm9jZXNzLCBpX3Byb2Nlc3MsIHBfc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfaW50ZXJhY3RpdmVfZXhlYzogdHJ1ZSIpCn0KCiMgVE9ETzogc2hvdWxkIG90aGVyIEV4ZWNQcm9jZXNzUmVxdWVzdCBpbnB1dCBkYXRhIGZpZWxkcyBiZSB2YWxpZGF0ZWQgYXMgd2VsbD8KRXhlY1Byb2Nlc3NSZXF1ZXN0IHsKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMTogaW5wdXQgPSIsIGlucHV0KQoKICAgIHNvbWUgcF9jb21tYW5kIGluIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuRXhlY1Byb2Nlc3NSZXF1ZXN0LmFsbG93ZWRfY29tbWFuZHMKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMTogcF9jb21tYW5kID0iLCBwX2NvbW1hbmQpCiAgICBwX2NvbW1hbmQgPT0gaW5wdXQucHJvY2Vzcy5BcmdzCgogICAgIyBUT0RPOiBtYXRjaCBwX2NvbnRhaW5lcidzIElEIHdpdGggdGhlIGlucHV0IGNvbnRhaW5lcl9pZC4KICAgIHNvbWUgcF9jb250YWluZXIgaW4gcG9saWN5X2RhdGEuY29udGFpbmVycwogICAgYWxsb3dfaW50ZXJhY3RpdmVfZXhlYyhwX2NvbnRhaW5lciwgaW5wdXQucHJvY2VzcykKCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDE6IHRydWUiKQp9CkV4ZWNQcm9jZXNzUmVxdWVzdCB7CiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDI6IGlucHV0ID0iLCBpbnB1dCkKCiAgICAjIFRPRE86IG1hdGNoIGlucHV0IGNvbnRhaW5lciBJRCB3aXRoIGl0cyBjb3JyZXNwb25kaW5nIGNvbnRhaW5lci5leGVjX2NvbW1hbmRzLgogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBzb21lIHBfY29tbWFuZCBpbiBwX2NvbnRhaW5lci5leGVjX2NvbW1hbmRzCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDI6IHBfY29tbWFuZCA9IiwgcF9jb21tYW5kKQoKICAgICMgVE9ETzogc2hvdWxkIG90aGVyIGlucHV0IGRhdGEgZmllbGRzIGJlIHZhbGlkYXRlZCBhcyB3ZWxsPwogICAgcF9jb21tYW5kID09IGlucHV0LnByb2Nlc3MuQXJncwoKICAgIGFsbG93X2V4ZWMocF9jb250YWluZXIsIGlucHV0LnByb2Nlc3MpCgogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAyOiB0cnVlIikKfQpFeGVjUHJvY2Vzc1JlcXVlc3QgewogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAzOiBpbnB1dCA9IiwgaW5wdXQpCgogICAgaV9jb21tYW5kID0gY29uY2F0KCIgIiwgaW5wdXQucHJvY2Vzcy5BcmdzKQogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAzOiBpX2NvbW1hbmQgPSIsIGlfY29tbWFuZCkKCiAgICBzb21lIHBfcmVnZXggaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5FeGVjUHJvY2Vzc1JlcXVlc3QucmVnZXgKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMzogcF9yZWdleCA9IiwgcF9yZWdleCkKCiAgICByZWdleC5tYXRjaChwX3JlZ2V4LCBpX2NvbW1hbmQpCgogICAgIyBUT0RPOiBtYXRjaCBwX2NvbnRhaW5lcidzIElEIHdpdGggdGhlIGlucHV0IGNvbnRhaW5lcl9pZC4KICAgIHNvbWUgcF9jb250YWluZXIgaW4gcG9saWN5X2RhdGEuY29udGFpbmVycwogICAgYWxsb3dfaW50ZXJhY3RpdmVfZXhlYyhwX2NvbnRhaW5lciwgaW5wdXQucHJvY2VzcykKCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDM6IHRydWUiKQp9CgpVcGRhdGVSb3V0ZXNSZXF1ZXN0IHsKICAgIHByaW50KCJVcGRhdGVSb3V0ZXNSZXF1ZXN0OiBpbnB1dCA9IiwgaW5wdXQpCiAgICBwcmludCgiVXBkYXRlUm91dGVzUmVxdWVzdDogcG9saWN5ID0iLCBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLlVwZGF0ZVJvdXRlc1JlcXVlc3QpCgogICAgaV9yb3V0ZXMgOj0gaW5wdXQucm91dGVzLlJvdXRlcwogICAgcF9zb3VyY2VfcmVnZXggPSBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLlVwZGF0ZVJvdXRlc1JlcXVlc3QuZm9yYmlkZGVuX3NvdXJjZV9yZWdleAogICAgcF9uYW1lcyA9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuVXBkYXRlUm91dGVzUmVxdWVzdC5mb3JiaWRkZW5fZGV2aWNlX25hbWVzCgogICAgZXZlcnkgaV9yb3V0ZSBpbiBpX3JvdXRlcyB7CiAgICAgICAgcHJpbnQoImlfcm91dGUuc291cmNlID0iLCBpX3JvdXRlLnNvdXJjZSkKICAgICAgICBldmVyeSBwX3JlZ2V4IGluIHBfc291cmNlX3JlZ2V4IHsKICAgICAgICAgICAgcHJpbnQoInBfcmVnZXggPSIsIHBfcmVnZXgpCiAgICAgICAgICAgIG5vdCByZWdleC5tYXRjaChwX3JlZ2V4LCBpX3JvdXRlLnNvdXJjZSkKICAgICAgICB9CgogICAgICAgIHByaW50KCJpX3JvdXRlLmRldmljZSA9IiwgaV9yb3V0ZS5kZXZpY2UpCiAgICAgICAgbm90IGlfcm91dGUuZGV2aWNlIGluIHBfbmFtZXMKICAgIH0KCiAgICBwcmludCgiVXBkYXRlUm91dGVzUmVxdWVzdDogdHJ1ZSIpCn0KClVwZGF0ZUludGVyZmFjZVJlcXVlc3QgewogICAgcHJpbnQoIlVwZGF0ZUludGVyZmFjZVJlcXVlc3Q6IGlucHV0ID0iLCBpbnB1dCkKICAgIHByaW50KCJVcGRhdGVJbnRlcmZhY2VSZXF1ZXN0OiBwb2xpY3kgPSIsIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuVXBkYXRlSW50ZXJmYWNlUmVxdWVzdCkKCiAgICBpX2ludGVyZmFjZSA6PSBpbnB1dC5pbnRlcmZhY2UKICAgIHBfZmxhZ3MgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmFsbG93X3Jhd19mbGFncwoKICAgICMgVHlwaWNhbGx5LCBqdXN0IElGRl9OT0FSUCBpcyB1c2VkLgogICAgYml0cy5hbmQoaV9pbnRlcmZhY2UucmF3X2ZsYWdzLCBiaXRzLm5lZ2F0ZShwX2ZsYWdzKSkgPT0gMAoKICAgIHBfbmFtZXMgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmZvcmJpZGRlbl9uYW1lcwoKICAgIG5vdCBpX2ludGVyZmFjZS5uYW1lIGluIHBfbmFtZXMKCiAgICBwX2h3YWRkcnMgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmZvcmJpZGRlbl9od19hZGRycwoKICAgIG5vdCBpX2ludGVyZmFjZS5od0FkZHIgaW4gcF9od2FkZHJzCgogICAgcHJpbnQoIlVwZGF0ZUludGVyZmFjZVJlcXVlc3Q6IHRydWUiKQp9CgpDbG9zZVN0ZGluUmVxdWVzdCB7CiAgICBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLkNsb3NlU3RkaW5SZXF1ZXN0ID09IHRydWUKfQoKUmVhZFN0cmVhbVJlcXVlc3QgewogICAgcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5SZWFkU3RyZWFtUmVxdWVzdCA9PSB0cnVlCn0KClVwZGF0ZUVwaGVtZXJhbE1vdW50c1JlcXVlc3QgewogICAgcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVFcGhlbWVyYWxNb3VudHNSZXF1ZXN0ID09IHRydWUKfQoKV3JpdGVTdHJlYW1SZXF1ZXN0IHsKICAgIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuV3JpdGVTdHJlYW1SZXF1ZXN0ID09IHRydWUKfQoKcG9saWN5X2RhdGEgOj0gewogICJjb250YWluZXJzIjogWwogICAgewogICAgICAiT0NJIjogewogICAgICAgICJWZXJzaW9uIjogIjEuMS4wLXJjLjEiLAogICAgICAgICJQcm9jZXNzIjogewogICAgICAgICAgIlRlcm1pbmFsIjogZmFsc2UsCiAgICAgICAgICAiVXNlciI6IHsKICAgICAgICAgICAgIlVJRCI6IDY1NTM1LAogICAgICAgICAgICAiR0lEIjogNjU1MzUsCiAgICAgICAgICAgICJBZGRpdGlvbmFsR2lkcyI6IFtdLAogICAgICAgICAgICAiVXNlcm5hbWUiOiAiIgogICAgICAgICAgfSwKICAgICAgICAgICJEZXByZWNhdGVkQXJncyI6IFsKICAgICAgICAgICAgIi9wYXVzZSIKICAgICAgICAgIF0sCiAgICAgICAgICAiQXJncyI6IFsKICAgICAgICAgICAgIi9wYXVzZSIKICAgICAgICAgIF0sCiAgICAgICAgICAiRW52IjogWwogICAgICAgICAgICAiUEFUSD0vdXNyL2xvY2FsL3NiaW46L3Vzci9sb2NhbC9iaW46L3Vzci9zYmluOi91c3IvYmluOi9zYmluOi9iaW4iCiAgICAgICAgICBdLAogICAgICAgICAgIkN3ZCI6ICIvIiwKICAgICAgICAgICJDYXBhYmlsaXRpZXMiOiB7CiAgICAgICAgICAgICJBbWJpZW50IjogW10sCiAgICAgICAgICAgICJCb3VuZGluZyI6IFsKICAgICAgICAgICAgICAiJChkZWZhdWx0X2NhcHMpIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiRWZmZWN0aXZlIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJJbmhlcml0YWJsZSI6IFtdLAogICAgICAgICAgICAiUGVybWl0dGVkIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICAiTm9OZXdQcml2aWxlZ2VzIjogdHJ1ZQogICAgICAgIH0sCiAgICAgICAgIlJvb3QiOiB7CiAgICAgICAgICAiUGF0aCI6ICIkKGNwYXRoKS8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgIlJlYWRvbmx5IjogdHJ1ZQogICAgICAgIH0sCiAgICAgICAgIk1vdW50cyI6IFsKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9wcm9jIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJwcm9jIiwKICAgICAgICAgICAgInR5cGVfIjogInByb2MiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2IiwKICAgICAgICAgICAgInNvdXJjZSI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJzdHJpY3RhdGltZSIsCiAgICAgICAgICAgICAgIm1vZGU9NzU1IiwKICAgICAgICAgICAgICAic2l6ZT02NTUzNmsiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L3B0cyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiZGV2cHRzIiwKICAgICAgICAgICAgInR5cGVfIjogImRldnB0cyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJuZXdpbnN0YW5jZSIsCiAgICAgICAgICAgICAgInB0bXhtb2RlPTA2NjYiLAogICAgICAgICAgICAgICJtb2RlPTA2MjAiLAogICAgICAgICAgICAgICJnaWQ9NSIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvc2htIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L3NobSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi9tcXVldWUiLAogICAgICAgICAgICAic291cmNlIjogIm1xdWV1ZSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJtcXVldWUiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvc3lzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJzeXNmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJzeXNmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2V0Yy9yZXNvbHYuY29uZiIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClyZXNvbHYuY29uZiQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJvIiwKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9kZXYiLAogICAgICAgICAgICAgICJub2V4ZWMiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0KICAgICAgICBdLAogICAgICAgICJBbm5vdGF0aW9ucyI6IHsKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmJ1bmRsZV9wYXRoIjogIi9ydW4vY29udGFpbmVyZC9pby5jb250YWluZXJkLnJ1bnRpbWUudjIudGFzay9rOHMuaW8vJChidW5kbGUtaWQpIiwKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIjogInBvZF9zYW5kYm94IiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSI6ICJzYW5kYm94IiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWlkIjogIl5bYS16MC05XXs2NH0kIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWxvZy1kaXJlY3RvcnkiOiAiXi92YXIvbG9nL3BvZHMvJChzYW5kYm94LW5hbWVzcGFjZSlfJChzYW5kYm94LW5hbWUpX1swLTlhLWZdezh9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezEyfSQiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZXNwYWNlIjogIiIsCiAgICAgICAgICAibmVyZGN0bC9uZXR3b3JrLW5hbWVzcGFjZSI6ICJeL3Zhci9ydW4vbmV0bnMvY25pLVswLTlhLWZdezh9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezEyfSQiCiAgICAgICAgfSwKICAgICAgICAiTGludXgiOiB7CiAgICAgICAgICAiTmFtZXNwYWNlcyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICJUeXBlIjogImlwYyIsCiAgICAgICAgICAgICAgIlBhdGgiOiAiIgogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgIlR5cGUiOiAidXRzIiwKICAgICAgICAgICAgICAiUGF0aCI6ICIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiVHlwZSI6ICJtb3VudCIsCiAgICAgICAgICAgICAgIlBhdGgiOiAiIgogICAgICAgICAgICB9CiAgICAgICAgICBdLAogICAgICAgICAgIk1hc2tlZFBhdGhzIjogWwogICAgICAgICAgICAiL3Byb2MvYWNwaSIsCiAgICAgICAgICAgICIvcHJvYy9hc291bmQiLAogICAgICAgICAgICAiL3Byb2Mva2NvcmUiLAogICAgICAgICAgICAiL3Byb2Mva2V5cyIsCiAgICAgICAgICAgICIvcHJvYy9sYXRlbmN5X3N0YXRzIiwKICAgICAgICAgICAgIi9wcm9jL3RpbWVyX2xpc3QiLAogICAgICAgICAgICAiL3Byb2MvdGltZXJfc3RhdHMiLAogICAgICAgICAgICAiL3Byb2Mvc2NoZWRfZGVidWciLAogICAgICAgICAgICAiL3N5cy9maXJtd2FyZSIsCiAgICAgICAgICAgICIvcHJvYy9zY3NpIgogICAgICAgICAgXSwKICAgICAgICAgICJSZWFkb25seVBhdGhzIjogWwogICAgICAgICAgICAiL3Byb2MvYnVzIiwKICAgICAgICAgICAgIi9wcm9jL2ZzIiwKICAgICAgICAgICAgIi9wcm9jL2lycSIsCiAgICAgICAgICAgICIvcHJvYy9zeXMiLAogICAgICAgICAgICAiL3Byb2Mvc3lzcnEtdHJpZ2dlciIKICAgICAgICAgIF0sCiAgICAgICAgICAiRGV2aWNlcyI6IFtdLAogICAgICAgICAgIlN5c2N0bCI6IHsKICAgICAgICAgICAgIm5ldC5pcHY0LmlwX3VucHJpdmlsZWdlZF9wb3J0X3N0YXJ0IjogIjAiLAogICAgICAgICAgICAibmV0LmlwdjQucGluZ19ncm91cF9yYW5nZSI6ICIwIDIxNDc0ODM2NDciCiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9LAogICAgICAic3RvcmFnZXMiOiBbCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJibGsiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogInRhciIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIiQoaGFzaDApIgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGxheWVyMCkiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJvdmVybGF5ZnMiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogImZ1c2UzLmthdGEtb3ZlcmxheSIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIjVhNWFhZDgwMDU1ZmYyMDAxMmE1MGRjMjVmOGRmN2EyOTkyNDQ3NDMyNGQ2NWY3ZDUzMDZlZThlZTI3ZmY3MWQiLAogICAgICAgICAgICAiODE3MjUwZjFhM2UzMzZkYTc2ZjViZDNmYTc4NGUxYjI2ZDk1OWI5YzEzMTg3NjgxNWJhMjYwNDA0OGI3MGMxOCIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChjcGF0aCkvJChidW5kbGUtaWQpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9CiAgICAgIF0sCiAgICAgICJkZXZpY2VzIjogW10sCiAgICAgICJzYW5kYm94X3BpZG5zIjogZmFsc2UsCiAgICAgICJleGVjX2NvbW1hbmRzIjogW10sCiAgICAgICJlbnZfbWFwIjogewogICAgICAgICJQQVRIIjogIi91c3IvbG9jYWwvc2JpbjovdXNyL2xvY2FsL2JpbjovdXNyL3NiaW46L3Vzci9iaW46L3NiaW46L2JpbiIKICAgICAgfQogICAgfSwKICAgIHsKICAgICAgIk9DSSI6IHsKICAgICAgICAiVmVyc2lvbiI6ICIxLjEuMC1yYy4xIiwKICAgICAgICAiUHJvY2VzcyI6IHsKICAgICAgICAgICJUZXJtaW5hbCI6IGZhbHNlLAogICAgICAgICAgIlVzZXIiOiB7CiAgICAgICAgICAgICJVSUQiOiAwLAogICAgICAgICAgICAiR0lEIjogMCwKICAgICAgICAgICAgIkFkZGl0aW9uYWxHaWRzIjogW10sCiAgICAgICAgICAgICJVc2VybmFtZSI6ICIiCiAgICAgICAgICB9LAogICAgICAgICAgIkRlcHJlY2F0ZWRBcmdzIjogWwogICAgICAgICAgICAibmdpbngiLAogICAgICAgICAgICAiLWciLAogICAgICAgICAgICAiZGFlbW9uIG9mZjsiCiAgICAgICAgICBdLAogICAgICAgICAgIkFyZ3MiOiBbCiAgICAgICAgICAgICJuZ2lueCIsCiAgICAgICAgICAgICItZyIsCiAgICAgICAgICAgICJkYWVtb24gb2ZmOyIKICAgICAgICAgIF0sCiAgICAgICAgICAiRW52IjogWwogICAgICAgICAgICAiUEFUSD0vdXNyL2xvY2FsL3NiaW46L3Vzci9sb2NhbC9iaW46L3Vzci9zYmluOi91c3IvYmluOi9zYmluOi9iaW4iLAogICAgICAgICAgICAiSE9TVE5BTUU9JChob3N0LW5hbWUpIgogICAgICAgICAgXSwKICAgICAgICAgICJDd2QiOiAiLyIsCiAgICAgICAgICAiQ2FwYWJpbGl0aWVzIjogewogICAgICAgICAgICAiQW1iaWVudCI6IFtdLAogICAgICAgICAgICAiQm91bmRpbmciOiBbCiAgICAgICAgICAgICAgIiQoZGVmYXVsdF9jYXBzKSIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgIkVmZmVjdGl2ZSI6IFsKICAgICAgICAgICAgICAiJChkZWZhdWx0X2NhcHMpIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiSW5oZXJpdGFibGUiOiBbXSwKICAgICAgICAgICAgIlBlcm1pdHRlZCI6IFsKICAgICAgICAgICAgICAiJChkZWZhdWx0X2NhcHMpIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgIk5vTmV3UHJpdmlsZWdlcyI6IGZhbHNlCiAgICAgICAgfSwKICAgICAgICAiUm9vdCI6IHsKICAgICAgICAgICJQYXRoIjogIiQoY3BhdGgpLyQoYnVuZGxlLWlkKSIsCiAgICAgICAgICAiUmVhZG9ubHkiOiBmYWxzZQogICAgICAgIH0sCiAgICAgICAgIk1vdW50cyI6IFsKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9wcm9jIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJwcm9jIiwKICAgICAgICAgICAgInR5cGVfIjogInByb2MiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2IiwKICAgICAgICAgICAgInNvdXJjZSI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJzdHJpY3RhdGltZSIsCiAgICAgICAgICAgICAgIm1vZGU9NzU1IiwKICAgICAgICAgICAgICAic2l6ZT02NTUzNmsiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L3B0cyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiZGV2cHRzIiwKICAgICAgICAgICAgInR5cGVfIjogImRldnB0cyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJuZXdpbnN0YW5jZSIsCiAgICAgICAgICAgICAgInB0bXhtb2RlPTA2NjYiLAogICAgICAgICAgICAgICJtb2RlPTA2MjAiLAogICAgICAgICAgICAgICJnaWQ9NSIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvc2htIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L3NobSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi9tcXVldWUiLAogICAgICAgICAgICAic291cmNlIjogIm1xdWV1ZSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJtcXVldWUiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvc3lzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJzeXNmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJzeXNmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL3N5cy9mcy9jZ3JvdXAiLAogICAgICAgICAgICAic291cmNlIjogImNncm91cCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJjZ3JvdXAiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiLAogICAgICAgICAgICAgICJyZWxhdGltZSIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2V0Yy9ob3N0cyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClob3N0cyQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicnciCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L3Rlcm1pbmF0aW9uLWxvZyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeCl0ZXJtaW5hdGlvbi1sb2ckIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJ3IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2V0Yy9ob3N0bmFtZSIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClob3N0bmFtZSQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicnciCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZXRjL3Jlc29sdi5jb25mIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KXJlc29sdi5jb25mJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJydyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi92YXIvcnVuL3NlY3JldHMva3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudCIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClzZXJ2aWNlYWNjb3VudCQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicm8iCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvdmFyL3J1bi9zZWNyZXRzL2F6dXJlL3Rva2VucyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeCl0b2tlbnMkIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9CiAgICAgICAgXSwKICAgICAgICAiQW5ub3RhdGlvbnMiOiB7CiAgICAgICAgICAiaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5idW5kbGVfcGF0aCI6ICIvcnVuL2NvbnRhaW5lcmQvaW8uY29udGFpbmVyZC5ydW50aW1lLnYyLnRhc2svazhzLmlvLyQoYnVuZGxlLWlkKSIsCiAgICAgICAgICAiaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5jb250YWluZXJfdHlwZSI6ICJwb2RfY29udGFpbmVyIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItbmFtZSI6ICJ0ZXN0LXJjIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSI6ICJjb250YWluZXIiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLmltYWdlLW5hbWUiOiAibWFyaW5lcmNvbmZwb2RzdGVzdC5henVyZWNyLmlvL2F6dXJlbGludXgvYmFzZS9uZ2lueDoxLjI1IiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWlkIjogIl5bYS16MC05XXs2NH0kIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LW5hbWVzcGFjZSI6ICIiCiAgICAgICAgfSwKICAgICAgICAiTGludXgiOiB7CiAgICAgICAgICAiTmFtZXNwYWNlcyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICJUeXBlIjogImlwYyIsCiAgICAgICAgICAgICAgIlBhdGgiOiAiIgogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgIlR5cGUiOiAidXRzIiwKICAgICAgICAgICAgICAiUGF0aCI6ICIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiVHlwZSI6ICJtb3VudCIsCiAgICAgICAgICAgICAgIlBhdGgiOiAiIgogICAgICAgICAgICB9CiAgICAgICAgICBdLAogICAgICAgICAgIk1hc2tlZFBhdGhzIjogWwogICAgICAgICAgICAiL3Byb2MvYWNwaSIsCiAgICAgICAgICAgICIvcHJvYy9rY29yZSIsCiAgICAgICAgICAgICIvcHJvYy9rZXlzIiwKICAgICAgICAgICAgIi9wcm9jL2xhdGVuY3lfc3RhdHMiLAogICAgICAgICAgICAiL3Byb2MvdGltZXJfbGlzdCIsCiAgICAgICAgICAgICIvcHJvYy90aW1lcl9zdGF0cyIsCiAgICAgICAgICAgICIvcHJvYy9zY2hlZF9kZWJ1ZyIsCiAgICAgICAgICAgICIvcHJvYy9zY3NpIiwKICAgICAgICAgICAgIi9zeXMvZmlybXdhcmUiCiAgICAgICAgICBdLAogICAgICAgICAgIlJlYWRvbmx5UGF0aHMiOiBbCiAgICAgICAgICAgICIvcHJvYy9hc291bmQiLAogICAgICAgICAgICAiL3Byb2MvYnVzIiwKICAgICAgICAgICAgIi9wcm9jL2ZzIiwKICAgICAgICAgICAgIi9wcm9jL2lycSIsCiAgICAgICAgICAgICIvcHJvYy9zeXMiLAogICAgICAgICAgICAiL3Byb2Mvc3lzcnEtdHJpZ2dlciIKICAgICAgICAgIF0sCiAgICAgICAgICAiRGV2aWNlcyI6IFtdLAogICAgICAgICAgIlN5c2N0bCI6IHsKICAgICAgICAgICAgIm5ldC5pcHY0LmlwX3VucHJpdmlsZWdlZF9wb3J0X3N0YXJ0IjogIjAiLAogICAgICAgICAgICAibmV0LmlwdjQucGluZ19ncm91cF9yYW5nZSI6ICIwIDIxNDc0ODM2NDciCiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9LAogICAgICAic3RvcmFnZXMiOiBbCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJibGsiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogInRhciIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIiQoaGFzaDApIgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGxheWVyMCkiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJibGsiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogInRhciIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIiQoaGFzaDEpIgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGxheWVyMSkiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJibGsiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogInRhciIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIiQoaGFzaDIpIgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGxheWVyMikiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJibGsiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogInRhciIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIiQoaGFzaDMpIgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGxheWVyMykiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJibGsiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogInRhciIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIiQoaGFzaDQpIgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGxheWVyNCkiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJvdmVybGF5ZnMiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogImZ1c2UzLmthdGEtb3ZlcmxheSIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIjhiZmJiYTc2OTY2MzY1MjQwNGE2NGEyM2E3ZWVhYjc5NDM4ZGFlZDcxYWNjZjMyOWE0MGE0ZjY4ZWZhZjBmZjQ6OGNjN2FmYmNkZDA0ZjE3YWZmOGY2ZDQ5MzVlNGY1NGExZjVhZGQ0N2RjYTUxNmU4ZDM1NDUzZjFmNDIxODE2Nzo5MDMwZTYwYWE4ZDhhYjljMjdmMDUxZTJjNzg1YTU0OWQ4YWVjMTg4ODE2OTllYWIzMjBhMDQwOWY3ZmRiZTM5OjM2YWY5YzA4MTQ2ZTZkMjUxZDUxM2U1OWU1YTFjNjJkNjJjZmI5ZWJlODU2ZDc1Mzk0YmVmZGRlY2U3NDg0YzE6MDE2NWEwYzA3ODY1Nzc1ZGVhODNhNDUxN2MxMjVmZjMwYzFlMmMxYTA5OGU3Y2JjZTdiY2FmZTJiNzE5OWNiYyIsCiAgICAgICAgICAgICIyNDllZjU1ZmNkNDExYzVhODA1NGFiYjYwZTcxNTExNWQ1OTllYmJlNjgyZDZiNzRiZTNiZDE5MjcyNDg4NWMxOjUwMmI1MzcyMDFjNzExNWVmMGQxNzE1MzBjN2NmNWMwZTUxMTc1NGU5Yzk1ZjA1OTQxZWMyN2QxNWM5ZTAxOTg6NDhhYTExOGZkZmRhOWEzMDM4N2U5MGUwNjYxZjJiNWI2YzhlODczNTRkMWZhOWEzN2JmNTg1MTNhYzNlNDUxMjo5ZjYyNTQ2NGM3YjM0YTU1MzZmNDMxZjVkMjk0NjM0M2QyNzI1ODBlMzY0NDZkZGIxMmIwNDAxNjJlNTQzY2UxOmQ0NDkxZWExODg3MTA1ZWYwNjAxZjRlNWZhMzk4M2ZmZTU3ZDdhNTdlZThmNmIwMzcwOTFmNDIxOGMxYTYzNTgiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQoY3BhdGgpLyQoYnVuZGxlLWlkKSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfQogICAgICBdLAogICAgICAiZGV2aWNlcyI6IFtdLAogICAgICAic2FuZGJveF9waWRucyI6IGZhbHNlLAogICAgICAiZXhlY19jb21tYW5kcyI6IFtdLAogICAgICAiZW52X21hcCI6IHsKICAgICAgICAiSE9TVE5BTUUiOiAiJChob3N0LW5hbWUpIiwKICAgICAgICAiUEFUSCI6ICIvdXNyL2xvY2FsL3NiaW46L3Vzci9sb2NhbC9iaW46L3Vzci9zYmluOi91c3IvYmluOi9zYmluOi9iaW4iCiAgICAgIH0KICAgIH0KICBdLAogICJjb21tb24iOiB7CiAgICAiY3BhdGgiOiAiL3J1bi9rYXRhLWNvbnRhaW5lcnMvc2hhcmVkL2NvbnRhaW5lcnMiLAogICAgIm1vdW50X3NvdXJjZV9jcGF0aCI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zaGFyZWQvY29udGFpbmVycyIsCiAgICAic2ZwcmVmaXgiOiAiXiQoY3BhdGgpLyQoYnVuZGxlLWlkKS1bYS16MC05XXsxNn0tIiwKICAgICJzcGF0aCI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L3N0b3JhZ2UiLAogICAgImlwdjRfYSI6ICIoKFswLTldfFsxLTldWzAtOV18MVswLTldezJ9fDJbMC00XVswLTldfDI1WzAtNV0pXFwuKXszfShbMC05XXxbMS05XVswLTldfDFbMC05XXsyfXwyWzAtNF1bMC05XXwyNVswLTVdKSIsCiAgICAiaXBfcCI6ICJbMC05XXsxLDV9IiwKICAgICJzdmNfbmFtZSI6ICJbQS1aX1xcLlxcLV0rIiwKICAgICJkbnNfbGFiZWwiOiAiW2EtekEtWjAtOV9cXC5cXC1dKyIsCiAgICAic19zb3VyY2UxIjogIl4uLjJbMC05XXszfV9bMC0xXVswLTldX1swLTNdWzAtOV1fWzAtMl1bMC05XV9bMC01XVswLTldX1swLTVdWzAtOV1cXC5bMC05XXsxLDEwfSQiLAogICAgInNfc291cmNlMiI6ICJeLi5kYXRhLyIsCiAgICAiZG5zX3N1YmRvbWFpbiI6ICJeW2EtejAtOV0oWy1hLXowLTldKlthLXowLTldKT8kIiwKICAgICJwb2RfdWlkIjogIl5bMC05YS1mQS1GXXs4fS1bMC05YS1mQS1GXXs0fS1bMC05YS1mQS1GXXs0fS1bMC05YS1mQS1GXXs0fS1bMC05YS1mQS1GXXsxMn0kIiwKICAgICJkZWZhdWx0X2NhcHMiOiBbCiAgICAgICJDQVBfQ0hPV04iLAogICAgICAiQ0FQX0RBQ19PVkVSUklERSIsCiAgICAgICJDQVBfRlNFVElEIiwKICAgICAgIkNBUF9GT1dORVIiLAogICAgICAiQ0FQX01LTk9EIiwKICAgICAgIkNBUF9ORVRfUkFXIiwKICAgICAgIkNBUF9TRVRHSUQiLAogICAgICAiQ0FQX1NFVFVJRCIsCiAgICAgICJDQVBfU0VURkNBUCIsCiAgICAgICJDQVBfU0VUUENBUCIsCiAgICAgICJDQVBfTkVUX0JJTkRfU0VSVklDRSIsCiAgICAgICJDQVBfU1lTX0NIUk9PVCIsCiAgICAgICJDQVBfS0lMTCIsCiAgICAgICJDQVBfQVVESVRfV1JJVEUiCiAgICBdLAogICAgInByaXZpbGVnZWRfY2FwcyI6IFsKICAgICAgIkNBUF9DSE9XTiIsCiAgICAgICJDQVBfREFDX09WRVJSSURFIiwKICAgICAgIkNBUF9EQUNfUkVBRF9TRUFSQ0giLAogICAgICAiQ0FQX0ZPV05FUiIsCiAgICAgICJDQVBfRlNFVElEIiwKICAgICAgIkNBUF9LSUxMIiwKICAgICAgIkNBUF9TRVRHSUQiLAogICAgICAiQ0FQX1NFVFVJRCIsCiAgICAgICJDQVBfU0VUUENBUCIsCiAgICAgICJDQVBfTElOVVhfSU1NVVRBQkxFIiwKICAgICAgIkNBUF9ORVRfQklORF9TRVJWSUNFIiwKICAgICAgIkNBUF9ORVRfQlJPQURDQVNUIiwKICAgICAgIkNBUF9ORVRfQURNSU4iLAogICAgICAiQ0FQX05FVF9SQVciLAogICAgICAiQ0FQX0lQQ19MT0NLIiwKICAgICAgIkNBUF9JUENfT1dORVIiLAogICAgICAiQ0FQX1NZU19NT0RVTEUiLAogICAgICAiQ0FQX1NZU19SQVdJTyIsCiAgICAgICJDQVBfU1lTX0NIUk9PVCIsCiAgICAgICJDQVBfU1lTX1BUUkFDRSIsCiAgICAgICJDQVBfU1lTX1BBQ0NUIiwKICAgICAgIkNBUF9TWVNfQURNSU4iLAogICAgICAiQ0FQX1NZU19CT09UIiwKICAgICAgIkNBUF9TWVNfTklDRSIsCiAgICAgICJDQVBfU1lTX1JFU09VUkNFIiwKICAgICAgIkNBUF9TWVNfVElNRSIsCiAgICAgICJDQVBfU1lTX1RUWV9DT05GSUciLAogICAgICAiQ0FQX01LTk9EIiwKICAgICAgIkNBUF9MRUFTRSIsCiAgICAgICJDQVBfQVVESVRfV1JJVEUiLAogICAgICAiQ0FQX0FVRElUX0NPTlRST0wiLAogICAgICAiQ0FQX1NFVEZDQVAiLAogICAgICAiQ0FQX01BQ19PVkVSUklERSIsCiAgICAgICJDQVBfTUFDX0FETUlOIiwKICAgICAgIkNBUF9TWVNMT0ciLAogICAgICAiQ0FQX1dBS0VfQUxBUk0iLAogICAgICAiQ0FQX0JMT0NLX1NVU1BFTkQiLAogICAgICAiQ0FQX0FVRElUX1JFQUQiLAogICAgICAiQ0FQX1BFUkZNT04iLAogICAgICAiQ0FQX0JQRiIsCiAgICAgICJDQVBfQ0hFQ0tQT0lOVF9SRVNUT1JFIgogICAgXSwKICAgICJ2aXJ0aW9fYmxrX3N0b3JhZ2VfY2xhc3NlcyI6IFsKICAgICAgImNjLWxvY2FsLWNzaSIsCiAgICAgICJjYy1tYW5hZ2VkLWNzaSIsCiAgICAgICJjYy1tYW5hZ2VkLXByZW1pdW0tY3NpIgogICAgXSwKICAgICJzbWJfc3RvcmFnZV9jbGFzc2VzIjogWwogICAgICB7CiAgICAgICAgIm5hbWUiOiAiYXp1cmVmaWxlLWNzaS1rYXRhLWNjIiwKICAgICAgICAibW91bnRfb3B0aW9ucyI6IFsKICAgICAgICAgICJkaXJfbW9kZT0wNzc3IiwKICAgICAgICAgICJmaWxlX21vZGU9MDc3NyIsCiAgICAgICAgICAibWZzeW1saW5rcyIsCiAgICAgICAgICAiY2FjaGU9c3RyaWN0IiwKICAgICAgICAgICJub3NoYXJlc29jayIsCiAgICAgICAgICAiYWN0aW1lbz0zMCIsCiAgICAgICAgICAibm9icmwiCiAgICAgICAgXQogICAgICB9CiAgICBdCiAgfSwKICAic2FuZGJveCI6IHsKICAgICJzdG9yYWdlcyI6IFsKICAgICAgewogICAgICAgICJkcml2ZXIiOiAiZXBoZW1lcmFsIiwKICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAic291cmNlIjogInNobSIsCiAgICAgICAgImZzdHlwZSI6ICJ0bXBmcyIsCiAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgIm5vZGV2IiwKICAgICAgICAgICJtb2RlPTE3NzciLAogICAgICAgICAgInNpemU9NjcxMDg4NjQiCiAgICAgICAgXSwKICAgICAgICAibW91bnRfcG9pbnQiOiAiL3J1bi9rYXRhLWNvbnRhaW5lcnMvc2FuZGJveC9zaG0iLAogICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgfQogICAgXQogIH0sCiAgInJlcXVlc3RfZGVmYXVsdHMiOiB7CiAgICAiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdCI6IHsKICAgICAgImFsbG93X2Vudl9yZWdleCI6IFsKICAgICAgICAiXkhPU1ROQU1FPSQoZG5zX2xhYmVsKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfUE9SVF8kKGlwX3ApX1RDUD10Y3A6Ly8kKGlwdjRfYSk6JChpcF9wKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfUE9SVF8kKGlwX3ApX1RDUF9QUk9UTz10Y3AkIiwKICAgICAgICAiXiQoc3ZjX25hbWUpX1BPUlRfJChpcF9wKV9UQ1BfUE9SVD0kKGlwX3ApJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9QT1JUXyQoaXBfcClfVENQX0FERFI9JChpcHY0X2EpJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9TRVJWSUNFX0hPU1Q9JChpcHY0X2EpJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9TRVJWSUNFX1BPUlQ9JChpcF9wKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfU0VSVklDRV9QT1JUXyQoZG5zX2xhYmVsKT0kKGlwX3ApJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9QT1JUPXRjcDovLyQoaXB2NF9hKTokKGlwX3ApJCIsCiAgICAgICAgIl5BWlVSRV9DTElFTlRfSUQ9W0EtRmEtZjAtOS1dKiQiLAogICAgICAgICJeQVpVUkVfVEVOQU5UX0lEPVtBLUZhLWYwLTktXSokIiwKICAgICAgICAiXkFaVVJFX0ZFREVSQVRFRF9UT0tFTl9GSUxFPS92YXIvcnVuL3NlY3JldHMvYXp1cmUvdG9rZW5zL2F6dXJlLWlkZW50aXR5LXRva2VuJCIsCiAgICAgICAgIl5BWlVSRV9BVVRIT1JJVFlfSE9TVD1odHRwczovL2xvZ2luXFwubWljcm9zb2Z0b25saW5lXFwuY29tLyQiLAogICAgICAgICJeVEVSTT14dGVybSQiCiAgICAgIF0sCiAgICAgICJhbGxvd19lbnZfcmVnZXhfbWFwIjogewogICAgICAgICJDUFVfTElNSVQiOiAiXlswLTldKyQiLAogICAgICAgICJKT0JfQ09NUExFVElPTl9JTkRFWCI6ICJeWzAtOV0qJCIsCiAgICAgICAgIk1FTU9SWV9MSU1JVCI6ICJeWzAtOV0rJCIKICAgICAgfQogICAgfSwKICAgICJDb3B5RmlsZVJlcXVlc3QiOiBbCiAgICAgICIkKHNmcHJlZml4KSIKICAgIF0sCiAgICAiRXhlY1Byb2Nlc3NSZXF1ZXN0IjogewogICAgICAiYWxsb3dlZF9jb21tYW5kcyI6IFtdLAogICAgICAicmVnZXgiOiBbXQogICAgfSwKICAgICJVcGRhdGVSb3V0ZXNSZXF1ZXN0IjogewogICAgICAiZm9yYmlkZGVuX2RldmljZV9uYW1lcyI6IFsKICAgICAgICAibG8iCiAgICAgIF0sCiAgICAgICJmb3JiaWRkZW5fc291cmNlX3JlZ2V4IjogWwogICAgICAgICJeKD86MHswLDR9Oil7MCw3fTB7MCwzfTEkIiwKICAgICAgICAiXjEyN1xcLig/OlswLTldezEsM31cXC4pezJ9WzAtOV17MSwzfSQiCiAgICAgIF0KICAgIH0sCiAgICAiVXBkYXRlSW50ZXJmYWNlUmVxdWVzdCI6IHsKICAgICAgImFsbG93X3Jhd19mbGFncyI6IDEyOCwKICAgICAgImZvcmJpZGRlbl9uYW1lcyI6IFsKICAgICAgICAibG8iCiAgICAgIF0sCiAgICAgICJmb3JiaWRkZW5faHdfYWRkcnMiOiBbCiAgICAgICAgIjAwOjAwOjAwOjAwOjAwOjAwIgogICAgICBdCiAgICB9LAogICAgIkNsb3NlU3RkaW5SZXF1ZXN0IjogZmFsc2UsCiAgICAiUmVhZFN0cmVhbVJlcXVlc3QiOiBmYWxzZSwKICAgICJVcGRhdGVFcGhlbWVyYWxNb3VudHNSZXF1ZXN0IjogZmFsc2UsCiAgICAiV3JpdGVTdHJlYW1SZXF1ZXN0IjogZmFsc2UKICB9Cn0= + spec: + runtimeClassName: kata-cc + containers: + - name: test-rc + image: "marinerconfpodstest.azurecr.io/azurelinux/base/nginx:1.25" + ports: + - containerPort: 80 diff --git a/src/agent/samples/policy/yaml/kubernetes/fixtures2/valid-pod.yaml b/src/agent/samples/policy/yaml/kubernetes/fixtures2/valid-pod.yaml new file mode 100644 index 000000000000..269b3c8934e9 --- /dev/null +++ b/src/agent/samples/policy/yaml/kubernetes/fixtures2/valid-pod.yaml @@ -0,0 +1,18 @@ +--- +apiVersion: v1 +kind: Pod +metadata: + name: valid-pod + labels: + name: valid-pod + annotations: + io.katacontainers.config.agent.policy: IyBDb3B5cmlnaHQgKGMpIDIwMjMgTWljcm9zb2Z0IENvcnBvcmF0aW9uCiMKIyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMAojCnBhY2thZ2UgYWdlbnRfcG9saWN5CgppbXBvcnQgZnV0dXJlLmtleXdvcmRzLmluCmltcG9ydCBmdXR1cmUua2V5d29yZHMuZXZlcnkKCiMgRGVmYXVsdCB2YWx1ZXMsIHJldHVybmVkIGJ5IE9QQSB3aGVuIHJ1bGVzIGNhbm5vdCBiZSBldmFsdWF0ZWQgdG8gdHJ1ZS4KZGVmYXVsdCBBZGRBUlBOZWlnaGJvcnNSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgQWRkU3dhcFJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBDbG9zZVN0ZGluUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IENvcHlGaWxlUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IENyZWF0ZUNvbnRhaW5lclJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBDcmVhdGVTYW5kYm94UmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IERlc3Ryb3lTYW5kYm94UmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgRXhlY1Byb2Nlc3NSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgR2V0T09NRXZlbnRSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBHdWVzdERldGFpbHNSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBMaXN0SW50ZXJmYWNlc1JlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBMaXN0Um91dGVzUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IE1lbUhvdHBsdWdCeVByb2JlUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IE9ubGluZUNQVU1lbVJlcXVlc3QgOj0gdHJ1ZQpkZWZhdWx0IFBhdXNlQ29udGFpbmVyUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFJlYWRTdHJlYW1SZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgUmVtb3ZlQ29udGFpbmVyUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgUmVtb3ZlU3RhbGVWaXJ0aW9mc1NoYXJlTW91bnRzUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgUmVzZWVkUmFuZG9tRGV2UmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFJlc3VtZUNvbnRhaW5lclJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBTZXRHdWVzdERhdGVUaW1lUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFNldFBvbGljeVJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBTaWduYWxQcm9jZXNzUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgU3RhcnRDb250YWluZXJSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBTdGFydFRyYWNpbmdSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgU3RhdHNDb250YWluZXJSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBTdG9wVHJhY2luZ1JlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBUdHlXaW5SZXNpemVSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBVcGRhdGVDb250YWluZXJSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgVXBkYXRlRXBoZW1lcmFsTW91bnRzUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFVwZGF0ZUludGVyZmFjZVJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBVcGRhdGVSb3V0ZXNSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgV2FpdFByb2Nlc3NSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBXcml0ZVN0cmVhbVJlcXVlc3QgOj0gZmFsc2UKCiMgQWxsb3dSZXF1ZXN0c0ZhaWxpbmdQb2xpY3kgOj0gdHJ1ZSBjb25maWd1cmVzIHRoZSBBZ2VudCB0byAqYWxsb3cgYW55CiMgcmVxdWVzdHMgY2F1c2luZyBhIHBvbGljeSBmYWlsdXJlKi4gVGhpcyBpcyBhbiB1bnNlY3VyZSBjb25maWd1cmF0aW9uCiMgYnV0IGlzIHVzZWZ1bCBmb3IgYWxsb3dpbmcgdW5zZWN1cmUgcG9kcyB0byBzdGFydCwgdGhlbiBjb25uZWN0IHRvCiMgdGhlbSBhbmQgaW5zcGVjdCBPUEEgbG9ncyBmb3IgdGhlIHJvb3QgY2F1c2Ugb2YgYSBmYWlsdXJlLgpkZWZhdWx0IEFsbG93UmVxdWVzdHNGYWlsaW5nUG9saWN5IDo9IGZhbHNlCgojIENvbnN0YW50cwpTX05BTUVfS0VZID0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZSIKU19OQU1FU1BBQ0VfS0VZID0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZXNwYWNlIgpCVU5ETEVfSUQgPSAiW2EtejAtOV17NjR9IgoKQ3JlYXRlQ29udGFpbmVyUmVxdWVzdDo9IHJlc3AgewogICAgbm90IGlzX251bGwoaW5wdXQuZW52X21hcCkKICAgIAogICAgaV9lbnZfbWFwIDo9IGlucHV0LmVudl9tYXAKICAgIAogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBwX2Vudl9tYXAgOj0gcF9jb250YWluZXIuZW52X21hcCAgCiAgICBhbGxvd19lbnZfbWFwKHBfZW52X21hcCwgaV9lbnZfbWFwKQogICAgCiAgICBpX3Byb2Nlc3MgOj0gaW5wdXQuYmFzZS5PQ0kuUHJvY2VzcwogICAgCiAgICBwX3Byb2Nlc3MgOj0gcF9jb250YWluZXIuT0NJLlByb2Nlc3MKICAgIAogICAgYWxsb3dfYXJncyhpX3Byb2Nlc3MsIHBfcHJvY2VzcywgaV9lbnZfbWFwKQoKICAgIHJlc3AgPSBDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uKGlucHV0LmJhc2UpCiAgICBwcmludCgiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdDogdHJ1ZSIpCn0KCmFsbG93X2FyZ3MoaV9wcm9jZXNzLCBwX3Byb2Nlc3MsIGlfZW52X21hcCkgewogICAgaV9hcmdzIDo9IGlfcHJvY2Vzcy5BcmdzCiAgICBwX2FyZ3MgOj0gcF9wcm9jZXNzLkFyZ3MKICAgIHByaW50KCJhbGxvd19hcmdzOiBpX2FyZ3MgPSIsIGlfYXJncywgInBfYXJncyA9IiwgcF9hcmdzKQogICAgY291bnQoaV9hcmdzKSA9PSBjb3VudChwX2FyZ3MpCiAgICBldmVyeSBpLCBpX2FyZyBpbiBpX2FyZ3MgewogICAgICAgIHByaW50KCJhbGxvd19hcmdzOiBpX2FyZyA9IiwgaV9hcmcpCiAgICAgICAgcF9hcmdfcmVwbGFjZWQgOj0gcmVwbGFjZV9lbnZfdmFyaWFibGVzKHBfYXJnc1tpXSwgaV9lbnZfbWFwKQogICAgICAgIHByaW50KCJhbGxvd19hcmdzOiBwX2FyZ19yZXBsYWNlZCA9IiwgcF9hcmdfcmVwbGFjZWQpCiAgICAgICAgcF9hcmdfcmVwbGFjZWQyIDo9IHJlcGxhY2UocF9hcmdfcmVwbGFjZWQsICIkJCIsICIkIikKICAgICAgICBwcmludCgiYWxsb3dfYXJnczogcF9hcmdfcmVwbGFjZWQyID0iLCBwX2FyZ19yZXBsYWNlZDIpCiAgICAgICAgaV9hcmcgPT0gcF9hcmdfcmVwbGFjZWQyCiAgICB9CiAgICBwcmludCgiYWxsb3dfYXJnczogdHJ1ZSIpCn0KCmFsbG93X2FyZ3MoaV9wcm9jZXNzLCBwX3Byb2Nlc3MsIGlfZW52X21hcCkgewogICAgbm90IGlfcHJvY2Vzcy5BcmdzCiAgICBub3QgcF9wcm9jZXNzLkFyZ3MKICAgIHByaW50KCJhbGxvd19hcmdzMjogbm8gYXJncyIpCn0KCiMgdGhpcyBmdW5jdGlvbiByZXBsYWNlcyBhbGwgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyBpbiBhIHN0cmluZywgZ2l2ZW4gYSBtYXAgb2YgZW52aXJvbm1lbnQga2V5cyB0byBlbnZpcm9ubWVudCB2YWx1ZXMKIyBlZyBzdHIgPSAiZWNobyAkKENMVVNURVJfSUQpOyBlY2hvICQoTk9ERV9OQU1FKTsiCiMgZW52X21hcCA9IHsiQ0xVU1RFUl9JRCI6ICJhYmMiLCAiTk9ERV9OQU1FIiA6ICJ4eXoifQojIHJlc3VsdCA9ICJlY2hvIGFiYzsgZWNobyB4eXo7IgpyZXBsYWNlX2Vudl92YXJpYWJsZXMoc3RyLCBlbnZfbWFwKSA9IHJlc3VsdCB7CiAgICAjIG1ha2UgYW4gYXJyYXkgb2YgdGhlIGtleXMgZWcgWyJDTFVTVEVSX0lEIiwgIk5PREVfTkFNRSJdCiAgICBrZXlzIDo9IFt4IHwgc29tZSB4IGluIG9iamVjdC5rZXlzKGVudl9tYXApXQogICAgcmVzdWx0IDo9IHJlcGxhY2Vfc3RyX3JlYyhzdHIsIGVudl9tYXAsIGtleXMsIGNvdW50KGtleXMpIC0gMSkKfQoKIyBiYXNlIGNhc2UKcmVwbGFjZV9zdHJfcmVjKHN0ciwgZW52X21hcCwgYXJyX2tleXMsIGkpID0gcmVzdWx0IHsKICAgIGkgPCAwCiAgICByZXN1bHQgOj0gc3RyCn0KCiMgcmVjdXJzaXZlIHN0ZXAKcmVwbGFjZV9zdHJfcmVjKHN0ciwgZW52X21hcCwgYXJyX2tleXMsIGkpID0gcmVzdWx0IHsKICAgIGkgPj0gMAogICAga2V5IDo9IGFycl9rZXlzW2ldCiAgICBlbnZfa2V5MSA6PSBjb25jYXQoIiIsIFsiJCgiLCBrZXksICIpIl0pCiAgICAjIHJlcGxhY2UgJChWQVIpIHdpdGggdmFsdWUKICAgIG5ld19zdHIxIDo9IHJlcGxhY2Uoc3RyLCBlbnZfa2V5MSwgZW52X21hcFtrZXldKQogICAgIyByZXBsYWNlIG5leHQgZW52aXJvbm1lbnQgdmFyaWFibGUKICAgIHJlc3VsdCA9IHJlcGxhY2Vfc3RyX3JlYyhuZXdfc3RyMSwgZW52X21hcCwgYXJyX2tleXMsIGkgLSAxKQp9CgphbGxvd19lbnZfbWFwKHBfZW52X21hcCwgaV9lbnZfbWFwKSB7CiAgICBwcmludCgiYWxsb3dfZW52X21hcDogcF9lbnZfbWFwID0iLCBwX2Vudl9tYXApCiAgICBldmVyeSBlbnZfa2V5LCBlbnZfdmFsIGluIGlfZW52X21hcCB7CiAgICAgICAgcHJpbnQoImFsbG93X2VudjogZW52X2tleSA9IiwgZW52X2tleSwgImVudl92YWwgPSIsIGVudl92YWwpCiAgICAgICAgYWxsb3dfZW52X21hcF9lbnRyeShlbnZfa2V5LCBlbnZfdmFsLCBwX2Vudl9tYXApCiAgICB9CiAgICBwcmludCgiYWxsb3dfZW52X21hcDogdHJ1ZSIpCn0KCiMgQWxsb3cgZXhhY3QgbWF0Y2gKYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBpX3ZhbCA9PSBwX3ZhbAogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnk6IHRydWUiKQp9CgojIEFsbG93IHJlc291cmNlRmllbGRSZWYgdmFsdWVzIChlLmcuLCAibGltaXRzLmNwdSIpLgphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgICMgYSB2YXJpYWJsZSB3ZSBzaG91bGQgYmUgdmFsaWRhdGluZyB1c2luZyBhIHJlZ2V4IGZyb20gc2V0dGluZ3MKICAgIHBfdmFsID09ICIkKHZhbGlkYXRlLWZyb20tc2V0dGluZ3MpIgogICAgcmVnZXhfdmFsIDo9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuQ3JlYXRlQ29udGFpbmVyUmVxdWVzdC5hbGxvd19lbnZfcmVnZXhfbWFwW2tleV0KICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4X3ZhbCwgaV92YWwpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSAyOiB0cnVlIikKfQoKIyBBbGxvdyBub2RlLW5hbWUKYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChub2RlLW5hbWUpIgogICAgcmVnZXgubWF0Y2gocG9saWN5X2RhdGEuY29tbW9uLmRuc19zdWJkb21haW4gLCBpX3ZhbCkKICAgIHByaW50KCJhbGxvd19lbnZfbWFwX2VudHJ5IDM6IHRydWUiKQp9CgojIEFsbG93IGhvc3QtbmFtZQphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgIHBfdmFsID09ICIkKGhvc3QtbmFtZSkiCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24uZG5zX2xhYmVsICwgaV92YWwpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSA0OiB0cnVlIikKfQoKIyBBbGxvdyBwb2QtdWlkCmFsbG93X2Vudl9tYXBfZW50cnkoa2V5LCBpX3ZhbCwgcF9lbnZfbWFwKSB7CiAgICBwX3ZhbCA6PSBwX2Vudl9tYXBba2V5XQogICAgcF92YWwgPT0gIiQocG9kLXVpZCkiCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24ucG9kX3VpZCAsIGlfdmFsKQogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgNTogdHJ1ZSIpCn0KCiMgQWxsb3cgZmllbGRSZWYgImZpZWxkUGF0aDogc3RhdHVzLnBvZElQIiB2YWx1ZXMuCmFsbG93X2Vudl9tYXBfZW50cnkoa2V5LCBpX3ZhbCwgcF9lbnZfbWFwKSB7CiAgICBpc19pcChpX3ZhbCkKCiAgICBwX3ZhbCA6PSBwX2Vudl9tYXBba2V5XQogICAgcF92YXIgOj0gY29uY2F0KCI9IiwgW2tleSwgcF92YWxdKQogICAgYWxsb3dfcG9kX2lwX3ZhcihrZXksIHBfdmFyKQogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgNjogdHJ1ZSIpCn0KCiMgQWxsb3cgZmllbGRSZWYgImZpZWxkUGF0aDogc3RhdHVzLmhvc3RJUCIgdmFsdWVzLgphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgaXNfaXAoaV92YWwpCgogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgIHBfdmFyIDo9IGNvbmNhdCgiPSIsIFtrZXksIHBfdmFsXSkKICAgIGFsbG93X2hvc3RfaXBfdmFyKGtleSwgcF92YXIpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSA3OiB0cnVlIikKfQoKIyBNYXRjaCBpbnB1dCB3aXRoIG9uZSBvZiB0aGUgcG9saWN5IHZhcmlhYmxlcywgYWZ0ZXIgc3Vic3RpdHV0aW5nICQoc2FuZGJveC1uYW1lKS4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChzYW5kYm94LW5hbWUpIgogICAgc19uYW1lIDo9IGlucHV0LmJhc2UuT0NJLkFubm90YXRpb25zW1NfTkFNRV9LRVldCiAgICBwX3ZhcjIgOj0gcmVwbGFjZShwX3ZhbCwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHBfdmFyMiA9PSBpX3ZhbAogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgODogdHJ1ZSIpCn0KCiMgTWF0Y2ggaW5wdXQgd2l0aCBvbmUgb2YgdGhlIHBvbGljeSB2YXJpYWJsZXMsIGFmdGVyIHN1YnN0aXR1dGluZyAkKHNhbmRib3gtbmFtZXNwYWNlKS4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChzYW5kYm94LW5hbWVzcGFjZSkiCiAgICBzX25hbWVzcGFjZSA6PSBpbnB1dC5iYXNlLk9DSS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwX3ZhcjIgOj0gcmVwbGFjZShwX3ZhbCwgIiQoc2FuZGJveC1uYW1lc3BhY2UpIiwgc19uYW1lc3BhY2UpCiAgICBwX3ZhcjIgPT0gaV92YWwKICAgIHByaW50KCJhbGxvd19lbnZfbWFwX2VudHJ5IDk6IHRydWUiKQp9CgojIEFsbG93IGlucHV0IGVudiB2YXJpYWJsZXMgdGhhdCBtYXRjaCB3aXRoIGEgcmVxdWVzdF9kZWZhdWx0cyByZWdleC4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHNvbWUgcF9yZWdleDEgaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5DcmVhdGVDb250YWluZXJSZXF1ZXN0LmFsbG93X2Vudl9yZWdleAogICAgcF9yZWdleDIgOj0gcmVwbGFjZShwX3JlZ2V4MSwgIiQoaXB2NF9hKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcHY0X2EpCiAgICBwX3JlZ2V4MyA6PSByZXBsYWNlKHBfcmVnZXgyLCAiJChpcF9wKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcF9wKQogICAgcF9yZWdleDQgOj0gcmVwbGFjZShwX3JlZ2V4MywgIiQoc3ZjX25hbWUpIiwgcG9saWN5X2RhdGEuY29tbW9uLnN2Y19uYW1lKQogICAgcF9yZWdleDUgOj0gcmVwbGFjZShwX3JlZ2V4NCwgIiQoZG5zX2xhYmVsKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5kbnNfbGFiZWwpCgogICAgcmVzdWx0IDo9IGNvbmNhdCgiPSIsIFtrZXksIGlfdmFsXSkKICAgIHJlZ2V4Lm1hdGNoKHBfcmVnZXg1LCByZXN1bHQpCgogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgMTA6IHRydWUiKQp9CgpDcmVhdGVDb250YWluZXJSZXF1ZXN0Oj0gcmVzcCB7CiAgICBub3QgaW5wdXQuZW52X21hcAogICAgaV9wcm9jZXNzID0gaW5wdXQuT0NJLlByb2Nlc3MKICAgIHNfbmFtZSA9IGlucHV0Lk9DSS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBwX3Byb2Nlc3MgPSBwX2NvbnRhaW5lci5PQ0kuUHJvY2VzcwogICAgYWxsb3dfZGVwcmVjYXRlZF9hcmdzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUpCiAgICByZXNwID0gQ3JlYXRlQ29udGFpbmVyUmVxdWVzdENvbW1vbihpbnB1dCkKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0MjogdHJ1ZSIpCn0KCkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb24ocmVxKTo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgICMgQ2hlY2sgaWYgdGhlIGlucHV0IHJlcXVlc3Qgc2hvdWxkIGJlIHJlamVjdGVkIGV2ZW4gYmVmb3JlIGNoZWNraW5nIHRoZQogICAgIyBwb2xpY3lfZGF0YS5jb250YWluZXJzIGluZm9ybWF0aW9uLgogICAgYWxsb3dfY3JlYXRlX2NvbnRhaW5lcl9pbnB1dChyZXEpCgogICAgaV9vY2kgOj0gcmVxLk9DSQogICAgaV9zdG9yYWdlcyA6PSByZXEuc3RvcmFnZXMKICAgIGlfZGV2aWNlcyA6PSByZXEuZGV2aWNlcwoKICAgICMgYXJyYXkgb2YgcG9zc2libGUgc3RhdGUgb3BlcmF0aW9ucwogICAgb3BzX2J1aWxkZXIgOj0gW10KCiAgICAjIGNoZWNrIHNhbmRib3ggbmFtZQogICAgc2FuZGJveF9uYW1lID0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FX0tFWV0KICAgIGFkZF9zYW5kYm94X25hbWVfdG9fc3RhdGUgOj0gc3RhdGVfYWxsb3dzKCJzYW5kYm94X25hbWUiLCBzYW5kYm94X25hbWUpCiAgICBvcHNfYnVpbGRlcjEgOj0gY29uY2F0X29wX2lmX25vdF9udWxsKG9wc19idWlsZGVyLCBhZGRfc2FuZGJveF9uYW1lX3RvX3N0YXRlKQoKICAgICMgQ2hlY2sgaWYgYW55IGVsZW1lbnQgZnJvbSB0aGUgcG9saWN5X2RhdGEuY29udGFpbmVycyBhcnJheSBhbGxvd3MgdGhlIGlucHV0IHJlcXVlc3QuCiAgICBzb21lIHBfY29udGFpbmVyIGluIHBvbGljeV9kYXRhLmNvbnRhaW5lcnMKICAgIHByaW50KCI9PT09PT09PSBDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiB0cnlpbmcgbmV4dCBwb2xpY3kgY29udGFpbmVyIikKCiAgICBwX3BpZG5zIDo9IHBfY29udGFpbmVyLnNhbmRib3hfcGlkbnMKICAgIGlfcGlkbnMgOj0gcmVxLnNhbmRib3hfcGlkbnMKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiBwX3BpZG5zID0iLCBwX3BpZG5zLCAiaV9waWRucyA9IiwgaV9waWRucykKICAgIHBfcGlkbnMgPT0gaV9waWRucwoKICAgIHBfb2NpIDo9IHBfY29udGFpbmVyLk9DSQoKICAgICMgY2hlY2sgbmFtZXNwYWNlCiAgICBwX25hbWVzcGFjZSA6PSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBpX25hbWVzcGFjZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwcmludCAoIkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb246IHBfbmFtZXNwYWNlID0iLCBwX25hbWVzcGFjZSwgImlfbmFtZXNwYWNlID0iLCBpX25hbWVzcGFjZSkKICAgIGFkZF9uYW1lc3BhY2VfdG9fc3RhdGUgOj0gYWxsb3dfbmFtZXNwYWNlKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkKICAgIG9wc19idWlsZGVyMiA6PSBjb25jYXRfb3BfaWZfbm90X251bGwob3BzX2J1aWxkZXIxLCBhZGRfbmFtZXNwYWNlX3RvX3N0YXRlKQoKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiBwIFZlcnNpb24gPSIsIHBfb2NpLlZlcnNpb24sICJpIFZlcnNpb24gPSIsIGlfb2NpLlZlcnNpb24pCiAgICBwX29jaS5WZXJzaW9uID09IGlfb2NpLlZlcnNpb24KCiAgICBwcmludCgiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdENvbW1vbjogcCBSZWFkb25seSA9IiwgcF9vY2kuUm9vdC5SZWFkb25seSwgImkgUmVhZG9ubHkgPSIsIGlfb2NpLlJvb3QuUmVhZG9ubHkpCiAgICBwX29jaS5Sb290LlJlYWRvbmx5ID09IGlfb2NpLlJvb3QuUmVhZG9ubHkKCiAgICBhbGxvd19hbm5vKHBfb2NpLCBpX29jaSkKCiAgICBwX3N0b3JhZ2VzIDo9IHBfY29udGFpbmVyLnN0b3JhZ2VzCiAgICBhbGxvd19ieV9hbm5vKHBfb2NpLCBpX29jaSwgcF9zdG9yYWdlcywgaV9zdG9yYWdlcykKCiAgICBwX2RldmljZXMgOj0gcF9jb250YWluZXIuZGV2aWNlcwogICAgYWxsb3dfZGV2aWNlcyhwX2RldmljZXMsIGlfZGV2aWNlcykKCiAgICByZXQgOj0gYWxsb3dfbGludXgob3BzX2J1aWxkZXIyLCBwX29jaSwgaV9vY2kpCiAgICByZXQuYWxsb3dlZAoKICAgIG9wcyA6PSByZXQub3BzCgogICAgcHJpbnQoIkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb246IHRydWUiKQp9CgphbGxvd19jcmVhdGVfY29udGFpbmVyX2lucHV0KHJlcSkgewogICAgcHJpbnQoImFsbG93X2NyZWF0ZV9jb250YWluZXJfaW5wdXQ6IGlucHV0ID0iLCByZXEpCgogICAgY291bnQocmVxLnNoYXJlZF9tb3VudHMpID09IDAKICAgIGlzX251bGwocmVxLnN0cmluZ191c2VyKQoKICAgIGlfb2NpIDo9IHJlcS5PQ0kKICAgIGlzX251bGwoaV9vY2kuSG9va3MpCiAgICBpc19udWxsKGlfb2NpLlNvbGFyaXMpCiAgICBpc19udWxsKGlfb2NpLldpbmRvd3MpCgogICAgaV9saW51eCA6PSBpX29jaS5MaW51eAogICAgY291bnQoaV9saW51eC5HSURNYXBwaW5ncykgPT0gMAogICAgY291bnQoaV9saW51eC5Nb3VudExhYmVsKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlJlc291cmNlcy5EZXZpY2VzKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlJvb3Rmc1Byb3BhZ2F0aW9uKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlVJRE1hcHBpbmdzKSA9PSAwCiAgICBpc19udWxsKGlfbGludXguSW50ZWxSZHQpCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLkJsb2NrSU8pCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLk5ldHdvcmspCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLlBpZHMpCiAgICBpc19udWxsKGlfbGludXguU2VjY29tcCkKCiAgICBpX3Byb2Nlc3MgOj0gaV9vY2kuUHJvY2VzcwogICAgY291bnQoaV9wcm9jZXNzLlNlbGludXhMYWJlbCkgPT0gMAogICAgY291bnQoaV9wcm9jZXNzLlVzZXIuVXNlcm5hbWUpID09IDAKCiAgICBwcmludCgiYWxsb3dfY3JlYXRlX2NvbnRhaW5lcl9pbnB1dDogdHJ1ZSIpCn0KCmFsbG93X25hbWVzcGFjZShwX25hbWVzcGFjZSwgaV9uYW1lc3BhY2UpID0gYWRkX25hbWVzcGFjZSB7CiAgICBwX25hbWVzcGFjZSA9PSBpX25hbWVzcGFjZQogICAgYWRkX25hbWVzcGFjZSA6PSBudWxsCiAgICBwcmludCgiYWxsb3dfbmFtZXNwYWNlIDE6IGlucHV0IG5hbWVzcGFjZSBtYXRjaGVzIHBvbGljeSBkYXRhIikKfQoKYWxsb3dfbmFtZXNwYWNlKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkgPSBhZGRfbmFtZXNwYWNlIHsKICAgIHBfbmFtZXNwYWNlID09ICIiCiAgICBwcmludCgiYWxsb3dfbmFtZXNwYWNlIDI6IG5vIG5hbWVzcGFjZSBmb3VuZCBvbiBwb2xpY3kgZGF0YSIpCiAgICBhZGRfbmFtZXNwYWNlIDo9IHN0YXRlX2FsbG93cygibmFtZXNwYWNlIiwgaV9uYW1lc3BhY2UpCn0KCiMgdmFsdWUgaGFzbid0IGJlZW4gc2VlbiBiZWZvcmUsIHNhdmUgaXQgdG8gc3RhdGUKc3RhdGVfYWxsb3dzKGtleSwgdmFsdWUpID0gYWN0aW9uIHsKICBzdGF0ZSA6PSBnZXRfc3RhdGUoKQogIHByaW50KCJzdGF0ZV9hbGxvd3MgMTogc3RhdGVba2V5XSA9Iiwgc3RhdGVba2V5XSwgInZhbHVlID0iLCB2YWx1ZSkKICBub3Qgc3RhdGVba2V5XQogIHByaW50KCJzdGF0ZV9hbGxvd3MgMTogc2F2aW5nIHRvIHN0YXRlIGtleSA9Iiwga2V5LCAidmFsdWUgPSIsIHZhbHVlKQogIHBhdGggOj0gZ2V0X3N0YXRlX3BhdGgoa2V5KSAKICBhY3Rpb24gOj0gewogICAgIm9wIjogImFkZCIsCiAgICAicGF0aCI6IHBhdGgsIAogICAgInZhbHVlIjogdmFsdWUsCiAgfQp9CgojIHZhbHVlIG1hdGNoZXMgd2hhdCdzIGluIHN0YXRlLCBhbGxvdyBpdApzdGF0ZV9hbGxvd3Moa2V5LCB2YWx1ZSkgPSBhY3Rpb24gewogIHByaW50KCJzdGF0ZV9hbGxvd3MgMjogc3RhcnQiKQogIHN0YXRlIDo9IGdldF9zdGF0ZSgpCiAgcHJpbnQoInN0YXRlX2FsbG93cyAyOiBzdGF0ZVtrZXldID0iLCBzdGF0ZVtrZXldLCAidmFsdWUgPSIsIHZhbHVlKQogIHZhbHVlID09IHN0YXRlW2tleV0KICBwcmludCgic3RhdGVfYWxsb3dzIDI6IGZvdW5kIGtleSA9Iiwga2V5LCAidmFsdWUgPSIsIHZhbHVlLCAiIGluIHN0YXRlIikKICBhY3Rpb24gOj0gbnVsbAp9CgojIGhlbHBlciBmdW5jdGlvbnMgdG8gaW50ZXJhY3Qgd2l0aCB0aGUgc3RhdGUKZ2V0X3N0YXRlKCkgPSBzdGF0ZSB7CiAgc3RhdGUgOj0gZGF0YVsicHN0YXRlIl0KfQoKZ2V0X3N0YXRlX3ZhbChrZXkpID0gdmFsdWUgewogICAgc3RhdGUgOj0gZ2V0X3N0YXRlKCkKICAgIHZhbHVlIDo9IHN0YXRlW2tleV0KfQoKZ2V0X3N0YXRlX3BhdGgoa2V5KSA9IHBhdGggewogICAgIyBwcmVwZW5kICIvcHN0YXRlLyIgdG8ga2V5CiAgICBwYXRoIDo9IGNvbmNhdCgiLyIsIFsiL3BzdGF0ZSIsIGtleV0pCn0KCiMgSGVscGVyIGZ1bmN0aW9ucyB0byBjb25kaXRpb25hbGx5IGNvbmNhdGVuYXRlIG9wIGlzIG5vdCBudWxsCmNvbmNhdF9vcF9pZl9ub3RfbnVsbChvcHMsIG9wKSA9IHJlc3VsdCB7CiAgICBvcCA9PSBudWxsCiAgICByZXN1bHQgOj0gb3BzCn0KCmNvbmNhdF9vcF9pZl9ub3RfbnVsbChvcHMsIG9wKSA9IHJlc3VsdCB7CiAgICBvcCAhPSBudWxsCiAgICByZXN1bHQgOj0gYXJyYXkuY29uY2F0KG9wcywgW29wXSkKfQoKIyBSZWplY3QgdW5leHBlY3RlZCBhbm5vdGF0aW9ucy4KYWxsb3dfYW5ubyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19hbm5vIDE6IHN0YXJ0IikKCiAgICBub3QgaV9vY2kuQW5ub3RhdGlvbnMKCiAgICBwcmludCgiYWxsb3dfYW5ubyAxOiB0cnVlIikKfQphbGxvd19hbm5vKHBfb2NpLCBpX29jaSkgewogICAgcHJpbnQoImFsbG93X2Fubm8gMjogcCBBbm5vdGF0aW9ucyA9IiwgcF9vY2kuQW5ub3RhdGlvbnMpCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiBpIEFubm90YXRpb25zID0iLCBpX29jaS5Bbm5vdGF0aW9ucykKCiAgICBpX2tleXMgOj0gb2JqZWN0LmtleXMoaV9vY2kuQW5ub3RhdGlvbnMpCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiBpIGtleXMgPSIsIGlfa2V5cykKCiAgICBldmVyeSBpX2tleSBpbiBpX2tleXMgewogICAgICAgIGFsbG93X2Fubm9fa2V5KGlfa2V5LCBwX29jaSkKICAgIH0KCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiB0cnVlIikKfQoKYWxsb3dfYW5ub19rZXkoaV9rZXksIHBfb2NpKSB7CiAgICBwcmludCgiYWxsb3dfYW5ub19rZXkgMTogaSBrZXkgPSIsIGlfa2V5KQoKICAgIHN0YXJ0c3dpdGgoaV9rZXksICJpby5rdWJlcm5ldGVzLmNyaS4iKQoKICAgIHByaW50KCJhbGxvd19hbm5vX2tleSAxOiB0cnVlIikKfQphbGxvd19hbm5vX2tleShpX2tleSwgcF9vY2kpIHsKICAgIHByaW50KCJhbGxvd19hbm5vX2tleSAyOiBpIGtleSA9IiwgaV9rZXkpCgogICAgc29tZSBwX2tleSwgXyBpbiBwX29jaS5Bbm5vdGF0aW9ucwogICAgcF9rZXkgPT0gaV9rZXkKCiAgICBwcmludCgiYWxsb3dfYW5ub19rZXkgMjogdHJ1ZSIpCn0KCiMgR2V0IHRoZSB2YWx1ZSBvZiB0aGUgU19OQU1FX0tFWSBhbm5vdGF0aW9uIGFuZAojIGNvcnJlbGF0ZSBpdCB3aXRoIG90aGVyIGFubm90YXRpb25zIGFuZCBwcm9jZXNzIGZpZWxkcy4KYWxsb3dfYnlfYW5ubyhwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpIHsKICAgIHByaW50KCJhbGxvd19ieV9hbm5vIDE6IHN0YXJ0IikKCiAgICBub3QgcF9vY2kuQW5ub3RhdGlvbnNbU19OQU1FX0tFWV0KCiAgICBpX3NfbmFtZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMTogaV9zX25hbWUgPSIsIGlfc19uYW1lKQoKICAgIGlfc19uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FU1BBQ0VfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMTogaV9zX25hbWVzcGFjZSA9IiwgaV9zX25hbWVzcGFjZSkKCiAgICBhbGxvd19ieV9zYW5kYm94X25hbWUocF9vY2ksIGlfb2NpLCBwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBpX3NfbmFtZSwgaV9zX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfYnlfYW5ubyAxOiB0cnVlIikKfQphbGxvd19ieV9hbm5vKHBfb2NpLCBpX29jaSwgcF9zdG9yYWdlcywgaV9zdG9yYWdlcykgewogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMjogc3RhcnQiKQoKICAgIHBfc19uYW1lIDo9IHBfb2NpLkFubm90YXRpb25zW1NfTkFNRV9LRVldCiAgICBpX3NfbmFtZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMjogaV9zX25hbWUgPSIsIGlfc19uYW1lLCAicF9zX25hbWUgPSIsIHBfc19uYW1lKQoKICAgIGFsbG93X3NhbmRib3hfbmFtZShwX3NfbmFtZSwgaV9zX25hbWUpCgogICAgaV9zX25hbWVzcGFjZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwcmludCgiYWxsb3dfYnlfYW5ubyAyOiBpX3NfbmFtZXNwYWNlID0iLCBpX3NfbmFtZXNwYWNlKQoKICAgIGFsbG93X2J5X3NhbmRib3hfbmFtZShwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMsIGlfc19uYW1lLCBpX3NfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd19ieV9hbm5vIDI6IHRydWUiKQp9CgphbGxvd19ieV9zYW5kYm94X25hbWUocF9vY2ksIGlfb2NpLCBwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfYnlfc2FuZGJveF9uYW1lOiBzdGFydCIpCgogICAgaV9uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FU1BBQ0VfS0VZXQoKICAgIGFsbG93X2J5X2NvbnRhaW5lcl90eXBlcyhwX29jaSwgaV9vY2ksIHNfbmFtZSwgaV9uYW1lc3BhY2UpCiAgICBhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZChwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpCiAgICBhbGxvd19wcm9jZXNzKHBfb2NpLlByb2Nlc3MsIGlfb2NpLlByb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpCgogICAgcHJpbnQoImFsbG93X2J5X3NhbmRib3hfbmFtZTogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfbmFtZShwX3NfbmFtZSwgaV9zX25hbWUpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X25hbWU6IHN0YXJ0IikKICAgIHJlZ2V4Lm1hdGNoKHBfc19uYW1lLCBpX3NfbmFtZSkKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9uYW1lOiB0cnVlIikKfQoKIyBDaGVjayB0aGF0IHRoZSAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLXR5cGUiIGFuZAojICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIiBhbm5vdGF0aW9ucyBkZXNpZ25hdGUgdGhlCiMgZXhwZWN0ZWQgdHlwZSAtIGVpdGhlciBhICJzYW5kYm94IiBvciBhICJjb250YWluZXIiLiBUaGVuLCB2YWxpZGF0ZQojIG90aGVyIGFubm90YXRpb25zIGJhc2VkIG9uIHRoZSBhY3R1YWwgInNhbmRib3giIG9yICJjb250YWluZXIiIHZhbHVlCiMgZnJvbSB0aGUgaW5wdXQgY29udGFpbmVyLgphbGxvd19ieV9jb250YWluZXJfdHlwZXMocF9vY2ksIGlfb2NpLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfYnlfY29udGFpbmVyX3R5cGVzOiBjaGVja2luZyBpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSIpCgogICAgY190eXBlIDo9ICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSIKICAgIAogICAgcF9jcmlfdHlwZSA6PSBwX29jaS5Bbm5vdGF0aW9uc1tjX3R5cGVdCiAgICBpX2NyaV90eXBlIDo9IGlfb2NpLkFubm90YXRpb25zW2NfdHlwZV0KICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZXM6IHBfY3JpX3R5cGUgPSIsIHBfY3JpX3R5cGUsICJpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgcF9jcmlfdHlwZSA9PSBpX2NyaV90eXBlCgogICAgYWxsb3dfYnlfY29udGFpbmVyX3R5cGUoaV9jcmlfdHlwZSwgcF9vY2ksIGlfb2NpLCBzX25hbWUsIHNfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZXM6IHRydWUiKQp9CgphbGxvd19ieV9jb250YWluZXJfdHlwZShpX2NyaV90eXBlLCBwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAxOiBpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgaV9jcmlfdHlwZSA9PSAic2FuZGJveCIKCiAgICBpX2thdGFfdHlwZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1siaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5jb250YWluZXJfdHlwZSJdCiAgICBwcmludCgiYWxsb3dfYnlfY29udGFpbmVyX3R5cGUgMTogaV9rYXRhX3R5cGUgPSIsIGlfa2F0YV90eXBlKQogICAgaV9rYXRhX3R5cGUgPT0gInBvZF9zYW5kYm94IgoKICAgIGFsbG93X3NhbmRib3hfY29udGFpbmVyX25hbWUocF9vY2ksIGlfb2NpKQogICAgYWxsb3dfc2FuZGJveF9uZXRfbmFtZXNwYWNlKHBfb2NpLCBpX29jaSkKICAgIGFsbG93X3NhbmRib3hfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpCgogICAgcHJpbnQoImFsbG93X2J5X2NvbnRhaW5lcl90eXBlIDE6IHRydWUiKQp9CgphbGxvd19ieV9jb250YWluZXJfdHlwZShpX2NyaV90eXBlLCBwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiBpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgaV9jcmlfdHlwZSA9PSAiY29udGFpbmVyIgoKICAgIGlfa2F0YV90eXBlIDo9IGlfb2NpLkFubm90YXRpb25zWyJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIl0KICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiBpX2thdGFfdHlwZSA9IiwgaV9rYXRhX3R5cGUpCiAgICBpX2thdGFfdHlwZSA9PSAicG9kX2NvbnRhaW5lciIKCiAgICBhbGxvd19jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpCiAgICBhbGxvd19uZXRfbmFtZXNwYWNlKHBfb2NpLCBpX29jaSkKICAgIGFsbG93X2xvZ19kaXJlY3RvcnkocF9vY2ksIGlfb2NpKQoKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiB0cnVlIikKfQoKIyAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLW5hbWUiIGFubm90YXRpb24KYWxsb3dfc2FuZGJveF9jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X2NvbnRhaW5lcl9uYW1lOiBzdGFydCIpCgogICAgY29udGFpbmVyX2Fubm90YXRpb25fbWlzc2luZyhwX29jaSwgaV9vY2ksICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItbmFtZSIpCgogICAgcHJpbnQoImFsbG93X3NhbmRib3hfY29udGFpbmVyX25hbWU6IHRydWUiKQp9CgphbGxvd19jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19jb250YWluZXJfbmFtZTogc3RhcnQiKQoKICAgIGFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uKHBfb2NpLCBpX29jaSwgImlvLmt1YmVybmV0ZXMuY3JpLmNvbnRhaW5lci1uYW1lIikKCiAgICBwcmludCgiYWxsb3dfY29udGFpbmVyX25hbWU6IHRydWUiKQp9Cgpjb250YWluZXJfYW5ub3RhdGlvbl9taXNzaW5nKHBfb2NpLCBpX29jaSwga2V5KSB7CiAgICBwcmludCgiY29udGFpbmVyX2Fubm90YXRpb25fbWlzc2luZzoiLCBrZXkpCgogICAgbm90IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIG5vdCBpX29jaS5Bbm5vdGF0aW9uc1trZXldCgogICAgcHJpbnQoImNvbnRhaW5lcl9hbm5vdGF0aW9uX21pc3Npbmc6IHRydWUiKQp9CgphbGxvd19jb250YWluZXJfYW5ub3RhdGlvbihwX29jaSwgaV9vY2ksIGtleSkgewogICAgcHJpbnQoImFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uOiBrZXkgPSIsIGtleSkKCiAgICBwX3ZhbHVlIDo9IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIGlfdmFsdWUgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgcHJpbnQoImFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uOiBwX3ZhbHVlID0iLCBwX3ZhbHVlLCAiaV92YWx1ZSA9IiwgaV92YWx1ZSkKCiAgICBwX3ZhbHVlID09IGlfdmFsdWUKCiAgICBwcmludCgiYWxsb3dfY29udGFpbmVyX2Fubm90YXRpb246IHRydWUiKQp9CgojICJuZXJkY3RsL25ldHdvcmstbmFtZXNwYWNlIiBhbm5vdGF0aW9uCmFsbG93X3NhbmRib3hfbmV0X25hbWVzcGFjZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X25ldF9uYW1lc3BhY2U6IHN0YXJ0IikKCiAgICBrZXkgOj0gIm5lcmRjdGwvbmV0d29yay1uYW1lc3BhY2UiCgogICAgcF9uYW1lc3BhY2UgOj0gcF9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgaV9uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgcHJpbnQoImFsbG93X3NhbmRib3hfbmV0X25hbWVzcGFjZTogcF9uYW1lc3BhY2UgPSIsIHBfbmFtZXNwYWNlLCAiaV9uYW1lc3BhY2UgPSIsIGlfbmFtZXNwYWNlKQoKICAgIHJlZ2V4Lm1hdGNoKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9uZXRfbmFtZXNwYWNlOiB0cnVlIikKfQoKYWxsb3dfbmV0X25hbWVzcGFjZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19uZXRfbmFtZXNwYWNlOiBzdGFydCIpCgogICAga2V5IDo9ICJuZXJkY3RsL25ldHdvcmstbmFtZXNwYWNlIgoKICAgIG5vdCBwX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICBub3QgaV9vY2kuQW5ub3RhdGlvbnNba2V5XQoKICAgIHByaW50KCJhbGxvd19uZXRfbmFtZXNwYWNlOiB0cnVlIikKfQoKIyAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1sb2ctZGlyZWN0b3J5IiBhbm5vdGF0aW9uCmFsbG93X3NhbmRib3hfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X2xvZ19kaXJlY3Rvcnk6IHN0YXJ0IikKCiAgICBrZXkgOj0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbG9nLWRpcmVjdG9yeSIKCiAgICBwX2RpciA6PSBwX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICByZWdleDEgOj0gcmVwbGFjZShwX2RpciwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHJlZ2V4MiA6PSByZXBsYWNlKHJlZ2V4MSwgIiQoc2FuZGJveC1uYW1lc3BhY2UpIiwgc19uYW1lc3BhY2UpCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiByZWdleDIgPSIsIHJlZ2V4MikKCiAgICBpX2RpciA6PSBpX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiBpX2RpciA9IiwgaV9kaXIpCgogICAgcmVnZXgubWF0Y2gocmVnZXgyLCBpX2RpcikKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiB0cnVlIikKfQoKYWxsb3dfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19sb2dfZGlyZWN0b3J5OiBzdGFydCIpCgogICAga2V5IDo9ICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWxvZy1kaXJlY3RvcnkiCgogICAgbm90IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIG5vdCBpX29jaS5Bbm5vdGF0aW9uc1trZXldCgogICAgcHJpbnQoImFsbG93X2xvZ19kaXJlY3Rvcnk6IHRydWUiKQp9CgphbGxvd19kZXZpY2VzKHBfZGV2aWNlcywgaV9kZXZpY2VzKSB7CiAgICBwcmludCgiYWxsb3dfZGV2aWNlczogc3RhcnQiKQogICAgZXZlcnkgaV9kZXZpY2UgaW4gaV9kZXZpY2VzIHsKICAgICAgICBwcmludCgiYWxsb3dfZGV2aWNlczogaV9kZXZpY2UgPSIsIGlfZGV2aWNlKQogICAgICAgIHNvbWUgcF9kZXZpY2UgaW4gcF9kZXZpY2VzCiAgICAgICAgcF9kZXZpY2UuY29udGFpbmVyX3BhdGggPT0gaV9kZXZpY2UuY29udGFpbmVyX3BhdGgKICAgIH0KICAgIHByaW50KCJhbGxvd19kZXZpY2VzOiB0cnVlIikKfQoKYWxsb3dfbGludXgoc3RhdGVfb3BzLCBwX29jaSwgaV9vY2kpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIHBfbmFtZXNwYWNlcyA6PSBwX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbGludXg6IHAgbmFtZXNwYWNlcyA9IiwgcF9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlcyA6PSBpX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbGludXg6IGkgbmFtZXNwYWNlcyA9IiwgaV9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlX3dpdGhvdXRfbmV0d29yayA6PSBbb2JqIHwgb2JqIDo9IGlfbmFtZXNwYWNlc1tfXTsgb2JqLlR5cGUgIT0gIm5ldHdvcmsiXQoKICAgIHByaW50KCJhbGxvd19saW51eDogaV9uYW1lc3BhY2Vfd2l0aG91dF9uZXR3b3JrID0iLCBpX25hbWVzcGFjZV93aXRob3V0X25ldHdvcmspCgogICAgcF9uYW1lc3BhY2VzID09IGlfbmFtZXNwYWNlX3dpdGhvdXRfbmV0d29yawoKICAgIGFsbG93X21hc2tlZF9wYXRocyhwX29jaSwgaV9vY2kpCiAgICBhbGxvd19yZWFkb25seV9wYXRocyhwX29jaSwgaV9vY2kpCiAgICBhbGxvd19saW51eF9kZXZpY2VzKHBfb2NpLkxpbnV4LkRldmljZXMsIGlfb2NpLkxpbnV4LkRldmljZXMpCiAgICBhbGxvd19saW51eF9zeXNjdGwocF9vY2kuTGludXgsIGlfb2NpLkxpbnV4KQogICAgcmV0IDo9IGFsbG93X25ldHdvcmtfbmFtZXNwYWNlX3N0YXJ0KHN0YXRlX29wcywgcF9vY2ksIGlfb2NpKQogICAgcmV0LmFsbG93ZWQKCiAgICBvcHMgOj0gcmV0Lm9wcwoKICAgIHByaW50KCJhbGxvd19saW51eDogdHJ1ZSIpCn0KCiMgUmV0cmlldmUgdGhlICJuZXR3b3JrIiBuYW1lc3BhY2UgZnJvbSB0aGUgaW5wdXQgZGF0YSBhbmQgcGFzcyBpdCBvbiBmb3IgdGhlCiMgbmV0d29yayBuYW1lc3BhY2UgcG9saWN5IGNoZWNrcy4KYWxsb3dfbmV0d29ya19uYW1lc3BhY2Vfc3RhcnQoc3RhdGVfb3BzLCBwX29jaSwgaV9vY2kpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIHByaW50KCJhbGxvd19uZXR3b3JrX25hbWVzcGFjZSBzdGFydDogc3RhcnQiKQoKICAgIHBfbmFtZXNwYWNlcyA6PSBwX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IHAgbmFtZXNwYWNlcyA9IiwgcF9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlcyA6PSBpX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IGkgbmFtZXNwYWNlcyA9IiwgaV9uYW1lc3BhY2VzKQoKICAgICMgUmV0dXJuIHBhdGggb2YgdGhlICJuZXR3b3JrIiBuYW1lc3BhY2UKICAgIG5ldHdvcmtfbnMgOj0gW29iaiB8IG9iaiA6PSBpX25hbWVzcGFjZXNbX107IG9iai5UeXBlID09ICJuZXR3b3JrIl0KCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IG5ldHdvcmtfbnMgPSIsIG5ldHdvcmtfbnMpCgogICAgcmV0IDo9IGFsbG93X25ldHdvcmtfbmFtZXNwYWNlKHN0YXRlX29wcywgbmV0d29ya19ucykKICAgIHJldC5hbGxvd2VkCgogICAgb3BzIDo9IHJldC5vcHMKfQoKIyBUaGlzIHJ1bGUgaXMgd2hlbiB0aGVyZSdzIG5vIG5ldHdvcmsgbmFtZXNwYWNlIGluIHRoZSBpbnB1dCBkYXRhLgphbGxvd19uZXR3b3JrX25hbWVzcGFjZShzdGF0ZV9vcHMsIG5ldHdvcmtfbnMpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIGNvdW50KG5ldHdvcmtfbnMpID09IDAKCiAgICBuZXR3b3JrX25zX3BhdGggPSAiIgoKICAgIGFkZF9uZXR3b3JrX25hbWVzcGFjZV90b19zdGF0ZSA6PSBzdGF0ZV9hbGxvd3MoIm5ldHdvcmtfbmFtZXNwYWNlIiwgbmV0d29ya19uc19wYXRoKQogICAgb3BzIDo9IGNvbmNhdF9vcF9pZl9ub3RfbnVsbChzdGF0ZV9vcHMsIGFkZF9uZXR3b3JrX25hbWVzcGFjZV90b19zdGF0ZSkKCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2UgMTogdHJ1ZSIpCn0KCiMgVGhpcyBydWxlIGlzIHdoZW4gdGhlcmUncyBleGFjdGx5IG9uZSBuZXR3b3JrIG5hbWVzcGFjZSBpbiB0aGUgaW5wdXQgZGF0YS4KYWxsb3dfbmV0d29ya19uYW1lc3BhY2Uoc3RhdGVfb3BzLCBuZXR3b3JrX25zKSA6PSB7Im9wcyI6IG9wcywgImFsbG93ZWQiOiB0cnVlfSB7CiAgICBjb3VudChuZXR3b3JrX25zKSA9PSAxCgogICAgYWRkX25ldHdvcmtfbmFtZXNwYWNlX3RvX3N0YXRlIDo9IHN0YXRlX2FsbG93cygibmV0d29ya19uYW1lc3BhY2UiLCBuZXR3b3JrX25zWzBdLlBhdGgpCiAgICBvcHMgOj0gY29uY2F0X29wX2lmX25vdF9udWxsKHN0YXRlX29wcywgYWRkX25ldHdvcmtfbmFtZXNwYWNlX3RvX3N0YXRlKQoKICAgIHByaW50KCJhbGxvd19uZXR3b3JrX25hbWVzcGFjZSAyOiB0cnVlIikKfQoKYWxsb3dfbWFza2VkX3BhdGhzKHBfb2NpLCBpX29jaSkgewogICAgcF9wYXRocyA6PSBwX29jaS5MaW51eC5NYXNrZWRQYXRocwogICAgcHJpbnQoImFsbG93X21hc2tlZF9wYXRocyAxOiBwX3BhdGhzID0iLCBwX3BhdGhzKQoKICAgIGlfcGF0aHMgOj0gaV9vY2kuTGludXguTWFza2VkUGF0aHMKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aHMgMTogaV9wYXRocyA9IiwgaV9wYXRocykKCiAgICBhbGxvd19tYXNrZWRfcGF0aHNfYXJyYXkocF9wYXRocywgaV9wYXRocykKCiAgICBwcmludCgiYWxsb3dfbWFza2VkX3BhdGhzIDE6IHRydWUiKQp9CmFsbG93X21hc2tlZF9wYXRocyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aHMgMjogc3RhcnQiKQoKICAgIG5vdCBwX29jaS5MaW51eC5NYXNrZWRQYXRocwogICAgbm90IGlfb2NpLkxpbnV4Lk1hc2tlZFBhdGhzCgogICAgcHJpbnQoImFsbG93X21hc2tlZF9wYXRocyAyOiB0cnVlIikKfQoKIyBBbGwgdGhlIHBvbGljeSBtYXNrZWQgcGF0aHMgbXVzdCBiZSBtYXNrZWQgaW4gdGhlIGlucHV0IGRhdGEgdG9vLgojIElucHV0IGlzIGFsbG93ZWQgdG8gaGF2ZSBtb3JlIG1hc2tlZCBwYXRocyB0aGFuIHRoZSBwb2xpY3kuCmFsbG93X21hc2tlZF9wYXRoc19hcnJheShwX2FycmF5LCBpX2FycmF5KSB7CiAgICBldmVyeSBwX2VsZW0gaW4gcF9hcnJheSB7CiAgICAgICAgYWxsb3dfbWFza2VkX3BhdGgocF9lbGVtLCBpX2FycmF5KQogICAgfQp9CgphbGxvd19tYXNrZWRfcGF0aChwX2VsZW0sIGlfYXJyYXkpIHsKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aDogcF9lbGVtID0iLCBwX2VsZW0pCgogICAgc29tZSBpX2VsZW0gaW4gaV9hcnJheQogICAgcF9lbGVtID09IGlfZWxlbQoKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aDogdHJ1ZSIpCn0KCmFsbG93X3JlYWRvbmx5X3BhdGhzKHBfb2NpLCBpX29jaSkgewogICAgcF9wYXRocyA6PSBwX29jaS5MaW51eC5SZWFkb25seVBhdGhzCiAgICBwcmludCgiYWxsb3dfcmVhZG9ubHlfcGF0aHMgMTogcF9wYXRocyA9IiwgcF9wYXRocykKCiAgICBpX3BhdGhzIDo9IGlfb2NpLkxpbnV4LlJlYWRvbmx5UGF0aHMKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAxOiBpX3BhdGhzID0iLCBpX3BhdGhzKQoKICAgIGFsbG93X3JlYWRvbmx5X3BhdGhzX2FycmF5KHBfcGF0aHMsIGlfcGF0aHMsIGlfb2NpLkxpbnV4Lk1hc2tlZFBhdGhzKQoKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAxOiB0cnVlIikKfQphbGxvd19yZWFkb25seV9wYXRocyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAyOiBzdGFydCIpCgogICAgbm90IHBfb2NpLkxpbnV4LlJlYWRvbmx5UGF0aHMKICAgIG5vdCBpX29jaS5MaW51eC5SZWFkb25seVBhdGhzCgogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGhzIDI6IHRydWUiKQp9CgojIEFsbCB0aGUgcG9saWN5IHJlYWRvbmx5IHBhdGhzIG11c3QgYmUgZWl0aGVyOgojIC0gUHJlc2VudCBpbiB0aGUgaW5wdXQgcmVhZG9ubHkgcGF0aHMsIG9yCiMgLSBQcmVzZW50IGluIHRoZSBpbnB1dCBtYXNrZWQgcGF0aHMuCiMgSW5wdXQgaXMgYWxsb3dlZCB0byBoYXZlIG1vcmUgcmVhZG9ubHkgcGF0aHMgdGhhbiB0aGUgcG9saWN5LgphbGxvd19yZWFkb25seV9wYXRoc19hcnJheShwX2FycmF5LCBpX2FycmF5LCBtYXNrZWRfcGF0aHMpIHsKICAgIGV2ZXJ5IHBfZWxlbSBpbiBwX2FycmF5IHsKICAgICAgICBhbGxvd19yZWFkb25seV9wYXRoKHBfZWxlbSwgaV9hcnJheSwgbWFza2VkX3BhdGhzKQogICAgfQp9CgphbGxvd19yZWFkb25seV9wYXRoKHBfZWxlbSwgaV9hcnJheSwgbWFza2VkX3BhdGhzKSB7CiAgICBwcmludCgiYWxsb3dfcmVhZG9ubHlfcGF0aCAxOiBwX2VsZW0gPSIsIHBfZWxlbSkKCiAgICBzb21lIGlfZWxlbSBpbiBpX2FycmF5CiAgICBwX2VsZW0gPT0gaV9lbGVtCgogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGggMTogdHJ1ZSIpCn0KYWxsb3dfcmVhZG9ubHlfcGF0aChwX2VsZW0sIGlfYXJyYXksIG1hc2tlZF9wYXRocykgewogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGggMjogcF9lbGVtID0iLCBwX2VsZW0pCgogICAgc29tZSBpX21hc2tlZCBpbiBtYXNrZWRfcGF0aHMKICAgIHBfZWxlbSA9PSBpX21hc2tlZAoKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRoIDI6IHRydWUiKQp9CgphbGxvd19saW51eF9kZXZpY2VzKHBfZGV2aWNlcywgaV9kZXZpY2VzKSB7CiAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogc3RhcnQiKQogICAgZXZlcnkgaV9kZXZpY2UgaW4gaV9kZXZpY2VzIHsKICAgICAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogaV9kZXZpY2UgPSIsIGlfZGV2aWNlKQogICAgICAgIHNvbWUgcF9kZXZpY2UgaW4gcF9kZXZpY2VzCiAgICAgICAgaV9kZXZpY2UuUGF0aCA9PSBwX2RldmljZS5QYXRoCiAgICB9CiAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogdHJ1ZSIpCn0KCmFsbG93X2xpbnV4X3N5c2N0bChwX2xpbnV4LCBpX2xpbnV4KSB7CiAgICBwcmludCgiYWxsb3dfbGludXhfc3lzY3RsIDE6IHN0YXJ0IikKICAgIG5vdCBpX2xpbnV4LlN5c2N0bAogICAgcHJpbnQoImFsbG93X2xpbnV4X3N5c2N0bCAxOiB0cnVlIikKfQoKYWxsb3dfbGludXhfc3lzY3RsKHBfbGludXgsIGlfbGludXgpIHsKICAgIHByaW50KCJhbGxvd19saW51eF9zeXNjdGwgMjogc3RhcnQiKQogICAgcF9zeXNjdGwgOj0gcF9saW51eC5TeXNjdGwKICAgIGlfc3lzY3RsIDo9IGlfbGludXguU3lzY3RsCiAgICBldmVyeSBpX25hbWUsIGlfdmFsIGluIGlfc3lzY3RsIHsKICAgICAgICBwcmludCgiYWxsb3dfbGludXhfc3lzY3RsIDI6IGlfbmFtZSA9IiwgaV9uYW1lLCAiaV92YWwgPSIsIGlfdmFsKQogICAgICAgIHBfc3lzY3RsW2lfbmFtZV0gPT0gaV92YWwKICAgIH0KICAgIHByaW50KCJhbGxvd19saW51eF9zeXNjdGwgMjogdHJ1ZSIpCn0KCiMgQ2hlY2sgdGhlIGNvbnNpc3RlbmN5IG9mIHRoZSBpbnB1dCAiaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5idW5kbGVfcGF0aCIKIyBhbmQgaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCIgdmFsdWVzIHdpdGggb3RoZXIgZmllbGRzLgphbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZChwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpIHsKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogc3RhcnQiKQoKICAgIGJ1bmRsZV9wYXRoIDo9IGlfb2NpLkFubm90YXRpb25zWyJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmJ1bmRsZV9wYXRoIl0KICAgIGJ1bmRsZV9pZCA6PSByZXBsYWNlKGJ1bmRsZV9wYXRoLCAiL3J1bi9jb250YWluZXJkL2lvLmNvbnRhaW5lcmQucnVudGltZS52Mi50YXNrL2s4cy5pby8iLCAiIikKCiAgICBidW5kbGVfaWRfZm9ybWF0IDo9IGNvbmNhdCgiIiwgWyJeIiwgQlVORExFX0lELCAiJCJdKQogICAgcmVnZXgubWF0Y2goYnVuZGxlX2lkX2Zvcm1hdCwgYnVuZGxlX2lkKQoKICAgIGtleSA6PSAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCIKCiAgICBwX3JlZ2V4IDo9IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIHNhbmRib3hfaWQgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQoKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogc2FuZGJveF9pZCA9Iiwgc2FuZGJveF9pZCwgInJlZ2V4ID0iLCBwX3JlZ2V4KQogICAgcmVnZXgubWF0Y2gocF9yZWdleCwgc2FuZGJveF9pZCkKCiAgICBhbGxvd19yb290X3BhdGgocF9vY2ksIGlfb2NpLCBidW5kbGVfaWQpCgogICAgZXZlcnkgaV9tb3VudCBpbiBpX29jaS5Nb3VudHMgewogICAgICAgIGFsbG93X21vdW50KHBfb2NpLCBpX21vdW50LCBpX3N0b3JhZ2VzLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpCiAgICB9CgogICAgYWxsb3dfc3RvcmFnZXMocF9zdG9yYWdlcywgaV9zdG9yYWdlcywgYnVuZGxlX2lkLCBzYW5kYm94X2lkKQoKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogdHJ1ZSIpCn0KCmFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHBfcHJvY2VzcyA9IiwgcF9wcm9jZXNzKQogICAgcHJpbnQoImFsbG93X3Byb2Nlc3NfY29tbW9uOiBpX3Byb2Nlc3MgPSAiLCBpX3Byb2Nlc3MpCiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHNfbmFtZSA9Iiwgc19uYW1lKQoKICAgIHBfcHJvY2Vzcy5Dd2QgPT0gaV9wcm9jZXNzLkN3ZAogICAgcF9wcm9jZXNzLk5vTmV3UHJpdmlsZWdlcyA9PSBpX3Byb2Nlc3MuTm9OZXdQcml2aWxlZ2VzCgogICAgYWxsb3dfdXNlcihwX3Byb2Nlc3MsIGlfcHJvY2VzcykKICAgIGFsbG93X2VudihwX3Byb2Nlc3MsIGlfcHJvY2Vzcywgc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHRydWUiKQp9CgojIENvbXBhcmUgdGhlIE9DSSBQcm9jZXNzIGZpZWxkIG9mIGEgcG9saWN5IGNvbnRhaW5lciB3aXRoIHRoZSBpbnB1dCBPQ0kgUHJvY2VzcyBmcm9tIGEgQ3JlYXRlQ29udGFpbmVyUmVxdWVzdAphbGxvd19wcm9jZXNzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfcHJvY2Vzczogc3RhcnQiKQoKICAgIGFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgYWxsb3dfY2FwcyhwX3Byb2Nlc3MuQ2FwYWJpbGl0aWVzLCBpX3Byb2Nlc3MuQ2FwYWJpbGl0aWVzKQogICAgcF9wcm9jZXNzLlRlcm1pbmFsID09IGlfcHJvY2Vzcy5UZXJtaW5hbAoKICAgIHByaW50KCJhbGxvd19wcm9jZXNzOiB0cnVlIikKfQoKIyBDb21wYXJlIHRoZSBPQ0kgUHJvY2VzcyBmaWVsZCBvZiBhIHBvbGljeSBjb250YWluZXIgd2l0aCB0aGUgaW5wdXQgcHJvY2VzcyBmaWVsZCBmcm9tIEV4ZWNQcm9jZXNzUmVxdWVzdAphbGxvd19pbnRlcmFjdGl2ZV9wcm9jZXNzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfaW50ZXJhY3RpdmVfcHJvY2Vzczogc3RhcnQiKQoKICAgIGFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgYWxsb3dfZXhlY19jYXBzKGlfcHJvY2Vzcy5DYXBhYmlsaXRpZXMpCgogICAgIyBUaGVzZSBhcmUgY29tbWFuZHMgZW5hYmxlZCB1c2luZyBFeGVjUHJvY2Vzc1JlcXVlc3QgY29tbWFuZHMgYW5kL29yIHJlZ2V4IGZyb20gdGhlIHNldHRpbmdzIGZpbGUuCiAgICAjIFRoZXkgY2FuIGJlIGV4ZWN1dGVkIGludGVyYWN0aXZlbHkgc28gYWxsb3cgdGhlbSB0byB1c2UgYW55IHZhbHVlIGZvciBpX3Byb2Nlc3MuVGVybWluYWwuCgogICAgcHJpbnQoImFsbG93X2ludGVyYWN0aXZlX3Byb2Nlc3M6IHRydWUiKQp9CgojIENvbXBhcmUgdGhlIE9DSSBQcm9jZXNzIGZpZWxkIG9mIGEgcG9saWN5IGNvbnRhaW5lciB3aXRoIHRoZSBpbnB1dCBwcm9jZXNzIGZpZWxkIGZyb20gRXhlY1Byb2Nlc3NSZXF1ZXN0CmFsbG93X3Byb2JlX3Byb2Nlc3MocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19wcm9iZV9wcm9jZXNzOiBzdGFydCIpCgogICAgYWxsb3dfcHJvY2Vzc19jb21tb24ocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpCiAgICBhbGxvd19leGVjX2NhcHMoaV9wcm9jZXNzLkNhcGFiaWxpdGllcykKICAgIHBfcHJvY2Vzcy5UZXJtaW5hbCA9PSBpX3Byb2Nlc3MuVGVybWluYWwKCiAgICBwcmludCgiYWxsb3dfcHJvYmVfcHJvY2VzczogdHJ1ZSIpCn0KCmFsbG93X3VzZXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MpIHsKICAgIHBfdXNlciA6PSBwX3Byb2Nlc3MuVXNlcgogICAgaV91c2VyIDo9IGlfcHJvY2Vzcy5Vc2VyCgogICAgcHJpbnQoImFsbG93X3VzZXI6IGlucHV0IHVpZCA9IiwgaV91c2VyLlVJRCwgInBvbGljeSB1aWQgPSIsIHBfdXNlci5VSUQpCiAgICBwX3VzZXIuVUlEID09IGlfdXNlci5VSUQKCiAgICAjIFRPRE86IHRyYWNrIGRvd24gdGhlIHJlYXNvbiBmb3IgcmVnaXN0cnkuazhzLmlvL3BhdXNlOjMuOSBiZWluZwogICAgIyAgICAgICBleGVjdXRlZCB3aXRoIGdpZCA9IDAgZGVzcGl0ZSBoYXZpbmcgIjY1NTM1OjY1NTM1IiBpbiBpdHMgY29udGFpbmVyIGltYWdlCiAgICAjICAgICAgIGNvbmZpZy4KICAgICNwcmludCgiYWxsb3dfdXNlcjogaW5wdXQgZ2lkID0iLCBpX3VzZXIuR0lELCAicG9saWN5IGdpZCA9IiwgcF91c2VyLkdJRCkKICAgICNwX3VzZXIuR0lEID09IGlfdXNlci5HSUQKCiAgICAjIFRPRE86IGNvbXBhcmUgdGhlIGFkZGl0aW9uYWxHaWRzIGZpZWxkIHRvbyBhZnRlciBjb21wdXRpbmcgaXRzIHZhbHVlCiAgICAjIGJhc2VkIG9uIC9ldGMvcGFzc3dkIGFuZCAvZXRjL2dyb3VwIGZyb20gdGhlIGNvbnRhaW5lciBpbWFnZS4KfQoKYWxsb3dfZGVwcmVjYXRlZF9hcmdzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZ3MgMTogbm8gYXJncyIpCgogICAgbm90IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJncwogICAgbm90IGlfcHJvY2Vzcy5BcmdzCgogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAxOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZ3MocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSkgewogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiBwb2xpY3kgYXJncyA9IiwgcF9wcm9jZXNzLkRlcHJlY2F0ZWRBcmdzKQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiBpbnB1dCBhcmdzID0iLCBpX3Byb2Nlc3MuQXJncykKCiAgICBjb3VudChwX3Byb2Nlc3MuRGVwcmVjYXRlZEFyZ3MpID09IGNvdW50KGlfcHJvY2Vzcy5BcmdzKQoKICAgIGV2ZXJ5IGksIGlfYXJnIGluIGlfcHJvY2Vzcy5BcmdzIHsKICAgICAgICBhbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpCiAgICB9CgogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDE6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgcF9hcmcyIDo9IHJlcGxhY2UocF9hcmcsICIkJCIsICIkIikKICAgIHBfYXJnMiA9PSBpX2FyZwoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAxOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDI6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgIyBUT0RPOiBjYW4gJChub2RlLW5hbWUpIGJlIGhhbmRsZWQgYmV0dGVyPwogICAgY29udGFpbnMocF9hcmcsICIkKG5vZGUtbmFtZSkiKQoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAyOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDM6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgcF9hcmcyIDo9IHJlcGxhY2UocF9hcmcsICIkJCIsICIkIikKICAgIHBfYXJnMyA6PSByZXBsYWNlKHBfYXJnMiwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAzOiBwX2FyZzMgPSIsIHBfYXJnMykKICAgIHBfYXJnMyA9PSBpX2FyZwoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAzOiB0cnVlIikKfQoKIyBPQ0kgcHJvY2Vzcy5FbnYgZmllbGQKYWxsb3dfZW52KHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfZW52OiBwIGVudiA9IiwgcF9wcm9jZXNzLkVudikKICAgIHByaW50KCJhbGxvd19lbnY6IGkgZW52ID0iLCBpX3Byb2Nlc3MuRW52KQoKICAgIGV2ZXJ5IGlfdmFyIGluIGlfcHJvY2Vzcy5FbnYgewogICAgICAgIHByaW50KCJhbGxvd19lbnY6IGlfdmFyID0iLCBpX3ZhcikKICAgICAgICBhbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgfQoKICAgIHByaW50KCJhbGxvd19lbnY6IHRydWUiKQp9CgojIEFsbG93IGlucHV0IGVudiB2YXJpYWJsZXMgdGhhdCBhcmUgcHJlc2VudCBpbiB0aGUgcG9saWN5IGRhdGEgdG9vLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHBfdmFyID09IGlfdmFyCiAgICBwcmludCgiYWxsb3dfdmFyIDE6IHRydWUiKQp9CgojIE1hdGNoIGlucHV0IHdpdGggb25lIG9mIHRoZSBwb2xpY3kgdmFyaWFibGVzLCBhZnRlciBzdWJzdGl0dXRpbmcgJChzYW5kYm94LW5hbWUpLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHByaW50KCJhbGxvd192YXIgMjogcF92YXIgPSIsIHBfdmFyKQoKICAgIHBfdmFyX3NwbGl0IDo9IHNwbGl0KHBfdmFyLCAiPSIpCiAgICBjb3VudChwX3Zhcl9zcGxpdCkgPT0gMgoKICAgIHBfdmFyX3NwbGl0WzFdID09ICIkKHNhbmRib3gtbmFtZSkiCgogICAgaV92YXJfc3BsaXQgOj0gc3BsaXQoaV92YXIsICI9IikKICAgIGNvdW50KGlfdmFyX3NwbGl0KSA9PSAyCgogICAgaV92YXJfc3BsaXRbMF0gPT0gcF92YXJfc3BsaXRbMF0KICAgIHJlZ2V4Lm1hdGNoKHNfbmFtZSwgaV92YXJfc3BsaXRbMV0pCgogICAgcHJpbnQoImFsbG93X3ZhciAyOiB0cnVlIikKfQoKIyBBbGxvdyBpbnB1dCBlbnYgdmFyaWFibGVzIHRoYXQgbWF0Y2ggd2l0aCBhIHJlcXVlc3RfZGVmYXVsdHMgcmVnZXguCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHNvbWUgcF9yZWdleDEgaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5DcmVhdGVDb250YWluZXJSZXF1ZXN0LmFsbG93X2Vudl9yZWdleAogICAgcF9yZWdleDIgOj0gcmVwbGFjZShwX3JlZ2V4MSwgIiQoaXB2NF9hKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcHY0X2EpCiAgICBwX3JlZ2V4MyA6PSByZXBsYWNlKHBfcmVnZXgyLCAiJChpcF9wKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcF9wKQogICAgcF9yZWdleDQgOj0gcmVwbGFjZShwX3JlZ2V4MywgIiQoc3ZjX25hbWUpIiwgcG9saWN5X2RhdGEuY29tbW9uLnN2Y19uYW1lKQogICAgcF9yZWdleDUgOj0gcmVwbGFjZShwX3JlZ2V4NCwgIiQoZG5zX2xhYmVsKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5kbnNfbGFiZWwpCgogICAgcHJpbnQoImFsbG93X3ZhciAzOiBwX3JlZ2V4NSA9IiwgcF9yZWdleDUpCiAgICByZWdleC5tYXRjaChwX3JlZ2V4NSwgaV92YXIpCgogICAgcHJpbnQoImFsbG93X3ZhciAzOiB0cnVlIikKfQoKIyBBbGxvdyBmaWVsZFJlZiAiZmllbGRQYXRoOiBzdGF0dXMucG9kSVAiIHZhbHVlcy4KYWxsb3dfdmFyKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBpX3Zhciwgc19uYW1lLCBzX25hbWVzcGFjZSkgewogICAgbmFtZV92YWx1ZSA6PSBzcGxpdChpX3ZhciwgIj0iKQogICAgY291bnQobmFtZV92YWx1ZSkgPT0gMgogICAgaXNfaXAobmFtZV92YWx1ZVsxXSkKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIGFsbG93X3BvZF9pcF92YXIobmFtZV92YWx1ZVswXSwgcF92YXIpCgogICAgcHJpbnQoImFsbG93X3ZhciA0OiB0cnVlIikKfQoKIyBBbGxvdyBjb21tb24gZmllbGRSZWYgdmFyaWFibGVzLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBuYW1lX3ZhbHVlIDo9IHNwbGl0KGlfdmFyLCAiPSIpCiAgICBjb3VudChuYW1lX3ZhbHVlKSA9PSAyCgogICAgc29tZSBwX3ZhciBpbiBwX3Byb2Nlc3MuRW52CiAgICBwX25hbWVfdmFsdWUgOj0gc3BsaXQocF92YXIsICI9IikKICAgIGNvdW50KHBfbmFtZV92YWx1ZSkgPT0gMgoKICAgIHBfbmFtZV92YWx1ZVswXSA9PSBuYW1lX3ZhbHVlWzBdCgogICAgIyBUT0RPOiBzaG91bGQgdGhlc2UgYmUgaGFuZGxlZCBpbiBhIGRpZmZlcmVudCB3YXk/CiAgICBhbHdheXNfYWxsb3dlZCA6PSBbIiQoaG9zdC1uYW1lKSIsICIkKG5vZGUtbmFtZSkiLCAiJChwb2QtdWlkKSJdCiAgICBzb21lIGFsbG93ZWQgaW4gYWx3YXlzX2FsbG93ZWQKICAgIGNvbnRhaW5zKHBfbmFtZV92YWx1ZVsxXSwgYWxsb3dlZCkKCiAgICBwcmludCgiYWxsb3dfdmFyIDU6IHRydWUiKQp9CgojIEFsbG93IGZpZWxkUmVmICJmaWVsZFBhdGg6IHN0YXR1cy5ob3N0SVAiIHZhbHVlcy4KYWxsb3dfdmFyKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBpX3Zhciwgc19uYW1lLCBzX25hbWVzcGFjZSkgewogICAgbmFtZV92YWx1ZSA6PSBzcGxpdChpX3ZhciwgIj0iKQogICAgY291bnQobmFtZV92YWx1ZSkgPT0gMgogICAgaXNfaXAobmFtZV92YWx1ZVsxXSkKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIGFsbG93X2hvc3RfaXBfdmFyKG5hbWVfdmFsdWVbMF0sIHBfdmFyKQoKICAgIHByaW50KCJhbGxvd192YXIgNjogdHJ1ZSIpCn0KCiMgQWxsb3cgcmVzb3VyY2VGaWVsZFJlZiB2YWx1ZXMgKGUuZy4sICJsaW1pdHMuY3B1IikuCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIG5hbWVfdmFsdWUgOj0gc3BsaXQoaV92YXIsICI9IikKICAgIGNvdW50KG5hbWVfdmFsdWUpID09IDIKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHBfbmFtZV92YWx1ZSA6PSBzcGxpdChwX3ZhciwgIj0iKQogICAgY291bnQocF9uYW1lX3ZhbHVlKSA9PSAyCgogICAgcF9uYW1lX3ZhbHVlWzBdID09IG5hbWVfdmFsdWVbMF0KCiAgICAjIGEgdmFyaWFibGUgd2Ugc2hvdWxkIGJlIHZhbGlkYXRpbmcgdXNpbmcgYSByZWdleCBmcm9tIHNldHRpbmdzCiAgICBwX25hbWVfdmFsdWVbMV0gPT0gIiQodmFsaWRhdGUtZnJvbS1zZXR0aW5ncykiCgogICAgcmVnZXhfdmFsIDo9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuQ3JlYXRlQ29udGFpbmVyUmVxdWVzdC5hbGxvd19lbnZfcmVnZXhfbWFwW25hbWVfdmFsdWVbMF1dCgogICAgcHJpbnQoImFsbG93X3ZhciA3OiB2YWwgPSIsIG5hbWVfdmFsdWVbMV0pCiAgICBwcmludCgiYWxsb3dfdmFyIDc6IHJlZ2V4X3ZhbCA9IiwgcmVnZXhfdmFsKQoKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4X3ZhbCwgbmFtZV92YWx1ZVsxXSkKCiAgICBwcmludCgiYWxsb3dfdmFyIDc6IHRydWUiKQp9CgojIE1hdGNoIGlucHV0IHdpdGggb25lIG9mIHRoZSBwb2xpY3kgdmFyaWFibGVzLCBhZnRlciBzdWJzdGl0dXRpbmcgJChzYW5kYm94LW5hbWVzcGFjZSkuCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHNvbWUgcF92YXIgaW4gcF9wcm9jZXNzLkVudgogICAgcF92YXIyIDo9IHJlcGxhY2UocF92YXIsICIkKHNhbmRib3gtbmFtZXNwYWNlKSIsIHNfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd192YXIgODogcF92YXIyID0iLCBwX3ZhcjIpCiAgICBwX3ZhcjIgPT0gaV92YXIKCiAgICBwcmludCgiYWxsb3dfdmFyIDg6IHRydWUiKQp9CgphbGxvd19wb2RfaXBfdmFyKHZhcl9uYW1lLCBwX3ZhcikgewogICAgcHJpbnQoImFsbG93X3BvZF9pcF92YXI6IHZhcl9uYW1lID0iLCB2YXJfbmFtZSwgInBfdmFyID0iLCBwX3ZhcikKCiAgICBwX25hbWVfdmFsdWUgOj0gc3BsaXQocF92YXIsICI9IikKICAgIGNvdW50KHBfbmFtZV92YWx1ZSkgPT0gMgoKICAgIHBfbmFtZV92YWx1ZVswXSA9PSB2YXJfbmFtZQogICAgcF9uYW1lX3ZhbHVlWzFdID09ICIkKHBvZC1pcCkiCgogICAgcHJpbnQoImFsbG93X3BvZF9pcF92YXI6IHRydWUiKQp9CgphbGxvd19ob3N0X2lwX3Zhcih2YXJfbmFtZSwgcF92YXIpIHsKICAgIHByaW50KCJhbGxvd19ob3N0X2lwX3ZhcjogdmFyX25hbWUgPSIsIHZhcl9uYW1lLCAicF92YXIgPSIsIHBfdmFyKQoKICAgIHBfbmFtZV92YWx1ZSA6PSBzcGxpdChwX3ZhciwgIj0iKQogICAgY291bnQocF9uYW1lX3ZhbHVlKSA9PSAyCgogICAgcF9uYW1lX3ZhbHVlWzBdID09IHZhcl9uYW1lCiAgICBwX25hbWVfdmFsdWVbMV0gPT0gIiQoaG9zdC1pcCkiCgogICAgcHJpbnQoImFsbG93X2hvc3RfaXBfdmFyOiB0cnVlIikKfQoKaXNfaXAodmFsdWUpIHsKICAgIGJ5dGVzID0gc3BsaXQodmFsdWUsICIuIikKICAgIGNvdW50KGJ5dGVzKSA9PSA0CgogICAgaXNfaXBfZmlyc3RfYnl0ZShieXRlc1swXSkKICAgIGlzX2lwX290aGVyX2J5dGUoYnl0ZXNbMV0pCiAgICBpc19pcF9vdGhlcl9ieXRlKGJ5dGVzWzJdKQogICAgaXNfaXBfb3RoZXJfYnl0ZShieXRlc1szXSkKfQppc19pcF9maXJzdF9ieXRlKGNvbXBvbmVudCkgewogICAgbnVtYmVyID0gdG9fbnVtYmVyKGNvbXBvbmVudCkKICAgIG51bWJlciA+PSAxCiAgICBudW1iZXIgPD0gMjU1Cn0KaXNfaXBfb3RoZXJfYnl0ZShjb21wb25lbnQpIHsKICAgIG51bWJlciA9IHRvX251bWJlcihjb21wb25lbnQpCiAgICBudW1iZXIgPj0gMAogICAgbnVtYmVyIDw9IDI1NQp9CgojIE9DSSByb290LlBhdGgKYWxsb3dfcm9vdF9wYXRoKHBfb2NpLCBpX29jaSwgYnVuZGxlX2lkKSB7CiAgICBpX3BhdGggOj0gaV9vY2kuUm9vdC5QYXRoCiAgICBwX3BhdGgxIDo9IHBfb2NpLlJvb3QuUGF0aAogICAgcHJpbnQoImFsbG93X3Jvb3RfcGF0aDogaV9wYXRoID0iLCBpX3BhdGgsICJwX3BhdGgxID0iLCBwX3BhdGgxKQoKICAgIHBfcGF0aDIgOj0gcmVwbGFjZShwX3BhdGgxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfcm9vdF9wYXRoOiBwX3BhdGgyID0iLCBwX3BhdGgyKQoKICAgIHBfcGF0aDMgOj0gcmVwbGFjZShwX3BhdGgyLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X3Jvb3RfcGF0aDogcF9wYXRoMyA9IiwgcF9wYXRoMykKCiAgICBwX3BhdGgzID09IGlfcGF0aAoKICAgIHByaW50KCJhbGxvd19yb290X3BhdGg6IHRydWUiKQp9CgojIGRldmljZSBtb3VudHMKYWxsb3dfbW91bnQocF9vY2ksIGlfbW91bnQsIGlfc3RvcmFnZXMsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcHJpbnQoImFsbG93X21vdW50OiBpX21vdW50ID0iLCBpX21vdW50KQoKICAgIHNvbWUgcF9tb3VudCBpbiBwX29jaS5Nb3VudHMKICAgIHNvbWUgaV9zdG9yYWdlIGluIGlfc3RvcmFnZXMKCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IHBfbW91bnQgPSIsIHBfbW91bnQpCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IGlfc3RvcmFnZSA9IiwgaV9zdG9yYWdlKQoKICAgIGNoZWNrX21vdW50KHBfbW91bnQsIGlfbW91bnQsIGlfc3RvcmFnZSwgYnVuZGxlX2lkLCBzYW5kYm94X2lkKQoKICAgICMgVE9ETzogYXJlIHRoZXJlIGFueSBvdGhlciByZXF1aXJlZCBwb2xpY3kgY2hlY2tzIGZvciBtb3VudHMgLSBlLmcuLAogICAgIyAgICAgICBtdWx0aXBsZSBtb3VudHMgd2l0aCBzYW1lIHNvdXJjZSBvciBkZXN0aW5hdGlvbj8KCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IHRydWUiKQp9CgpjaGVja19tb3VudChwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcF9tb3VudCA9PSBpX21vdW50CiAgICBwcmludCgiY2hlY2tfbW91bnQgMTogdHJ1ZSIpCn0KY2hlY2tfbW91bnQocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHBfbW91bnQuZGVzdGluYXRpb24gPT0gaV9tb3VudC5kZXN0aW5hdGlvbgogICAgcF9tb3VudC50eXBlXyA9PSBpX21vdW50LnR5cGVfCiAgICBwX21vdW50Lm9wdGlvbnMgPT0gaV9tb3VudC5vcHRpb25zCgogICAgbW91bnRfc291cmNlX2FsbG93cyhwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkKCiAgICBwcmludCgiY2hlY2tfbW91bnQgMjogdHJ1ZSIpCn0KCm1vdW50X3NvdXJjZV9hbGxvd3MocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHJlZ2V4MSA6PSBwX21vdW50LnNvdXJjZQogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5tb3VudF9zb3VyY2VfY3BhdGgpCiAgICByZWdleDQgOj0gcmVwbGFjZShyZWdleDMsICIkKGJ1bmRsZS1pZCkiLCBidW5kbGVfaWQpCgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMTogcmVnZXg0ID0iLCByZWdleDQpCiAgICByZWdleC5tYXRjaChyZWdleDQsIGlfbW91bnQuc291cmNlKQoKICAgIHByaW50KCJtb3VudF9zb3VyY2VfYWxsb3dzIDE6IHRydWUiKQp9Cm1vdW50X3NvdXJjZV9hbGxvd3MocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHJlZ2V4MSA6PSBwX21vdW50LnNvdXJjZQogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5tb3VudF9zb3VyY2VfY3BhdGgpCiAgICByZWdleDQgOj0gcmVwbGFjZShyZWdleDMsICIkKHNhbmRib3gtaWQpIiwgc2FuZGJveF9pZCkKCiAgICBwcmludCgibW91bnRfc291cmNlX2FsbG93cyAyOiByZWdleDQgPSIsIHJlZ2V4NCkKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4NCwgaV9tb3VudC5zb3VyY2UpCgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMjogdHJ1ZSIpCn0KbW91bnRfc291cmNlX2FsbG93cyhwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogaV9tb3VudC5zb3VyY2UgPSIsIGlfbW91bnQuc291cmNlKQogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogaV9zdG9yYWdlLm1vdW50X3BvaW50ID0iLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCgogICAgaV9tb3VudC5zb3VyY2UgPT0gaV9zdG9yYWdlLm1vdW50X3BvaW50CgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogdHJ1ZSIpCn0KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBDcmVhdGUgY29udGFpbmVyIFN0b3JhZ2VzCgphbGxvd19zdG9yYWdlcyhwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHBfY291bnQgOj0gY291bnQocF9zdG9yYWdlcykKICAgIGlfY291bnQgOj0gY291bnQoaV9zdG9yYWdlcykKICAgIHByaW50KCJhbGxvd19zdG9yYWdlczogcF9jb3VudCA9IiwgcF9jb3VudCwgImlfY291bnQgPSIsIGlfY291bnQpCgogICAgcF9jb3VudCA9PSBpX2NvdW50CgogICAgIyBHZXQgdGhlIGNvbnRhaW5lciBpbWFnZSBsYXllciBJRHMgYW5kIHZlcml0eSByb290IGhhc2hlcywgZnJvbSB0aGUgIm92ZXJsYXlmcyIgc3RvcmFnZS4KICAgIHNvbWUgb3ZlcmxheV9zdG9yYWdlIGluIHBfc3RvcmFnZXMKICAgIG92ZXJsYXlfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIHByaW50KCJhbGxvd19zdG9yYWdlczogb3ZlcmxheV9zdG9yYWdlID0iLCBvdmVybGF5X3N0b3JhZ2UpCiAgICBjb3VudChvdmVybGF5X3N0b3JhZ2Uub3B0aW9ucykgPT0gMgoKICAgIGxheWVyX2lkcyA6PSBzcGxpdChvdmVybGF5X3N0b3JhZ2Uub3B0aW9uc1swXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiBsYXllcl9pZHMgPSIsIGxheWVyX2lkcykKCiAgICByb290X2hhc2hlcyA6PSBzcGxpdChvdmVybGF5X3N0b3JhZ2Uub3B0aW9uc1sxXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiByb290X2hhc2hlcyA9Iiwgcm9vdF9oYXNoZXMpCgogICAgZXZlcnkgaV9zdG9yYWdlIGluIGlfc3RvcmFnZXMgewogICAgICAgIGFsbG93X3N0b3JhZ2UocF9zdG9yYWdlcywgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpCiAgICB9CgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiB0cnVlIikKfQoKYWxsb3dfc3RvcmFnZShwX3N0b3JhZ2VzLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgc29tZSBwX3N0b3JhZ2UgaW4gcF9zdG9yYWdlcwoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiBwX3N0b3JhZ2UgPSIsIHBfc3RvcmFnZSkKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiBpX3N0b3JhZ2UgPSIsIGlfc3RvcmFnZSkKCiAgICBwX3N0b3JhZ2UuZHJpdmVyICAgICAgICAgICA9PSBpX3N0b3JhZ2UuZHJpdmVyCiAgICBwX3N0b3JhZ2UuZHJpdmVyX29wdGlvbnMgICA9PSBpX3N0b3JhZ2UuZHJpdmVyX29wdGlvbnMKICAgIHBfc3RvcmFnZS5mc19ncm91cCAgICAgICAgID09IGlfc3RvcmFnZS5mc19ncm91cAogICAgcF9zdG9yYWdlLmZzdHlwZSAgICAgICAgICAgPT0gaV9zdG9yYWdlLmZzdHlwZQoKICAgIGFsbG93X3N0b3JhZ2Vfc291cmNlKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKQogICAgYWxsb3dfc3RvcmFnZV9vcHRpb25zKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKQogICAgYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKQoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiB0cnVlIikKfQoKYWxsb3dfc3RvcmFnZV9zb3VyY2UocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX3NvdXJjZSAxOiBzdGFydCIpCgogICAgcF9zdG9yYWdlLnNvdXJjZSA9PSBpX3N0b3JhZ2Uuc291cmNlCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDE6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX3NvdXJjZShwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDI6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCgogICAgIyBEREREOkJCOkRELkY6IERvbWFpbjpCdXM6RGV2aWNlLkZ1bmN0aW9uCiAgICAjIGh0dHBzOi8vd3d3Lmtlcm5lbC5vcmcvZG9jL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtYnVzLXBjaQogICAgcmVnZXgubWF0Y2goYF5bYS1mMC05XXs0fTpbYS1mMC05XXsyfTpbYS1mMC05XXsyfVwuW2EtZjAtOV0kYCwgaV9zdG9yYWdlLnNvdXJjZSkKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9zb3VyY2UgMjogdHJ1ZSIpCn0KCmFsbG93X3N0b3JhZ2Vfc291cmNlKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKSB7CiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9zb3VyY2UgMzogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIGlfc3RvcmFnZS5zb3VyY2UgPT0gIm5vbmUiCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDM6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX3NvdXJjZShwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDQ6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJzbWIiCgogICAgIyBQYXR0ZXJuOiAvLzxzdG9yYWdlLWFjY291bnQtbmFtZT4uZmlsZS5jb3JlLndpbmRvd3MubmV0LzxrOHMtUFZDLW5hbWU+CiAgICAjIFN0b3JhZ2UgYWNjb3VudCBuYW1lOiBodHRwczovL2xlYXJuLm1pY3Jvc29mdC5jb20vZW4tdXMvYXp1cmUvc3RvcmFnZS9jb21tb24vc3RvcmFnZS1hY2NvdW50LW92ZXJ2aWV3I3N0b3JhZ2UtYWNjb3VudC1uYW1lCiAgICAjIEs4cyBQVkMgbmFtZTogaHR0cHM6Ly9rdWJlcm5ldGVzLmlvL2RvY3MvY29uY2VwdHMvb3ZlcnZpZXcvd29ya2luZy13aXRoLW9iamVjdHMvbmFtZXMvI2Rucy1zdWJkb21haW4tbmFtZXMKICAgIHJlZ2V4Lm1hdGNoKGBeXC9cLyhbYS16MC05XXszLDI0fSlcLmZpbGVcLmNvcmVcLndpbmRvd3NcLm5ldFwvW2EtejAtOV0oW2EtejAtOS4tXXswLDI1MX1bYS16MC05XSk/JGAsIGlfc3RvcmFnZS5zb3VyY2UpCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDQ6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMTogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgIT0gIm92ZXJsYXlmcyIKICAgIHBfc3RvcmFnZS5vcHRpb25zID09IGlfc3RvcmFnZS5vcHRpb25zCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAxOiB0cnVlIikKfQphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIGNvdW50KHBfc3RvcmFnZS5vcHRpb25zKSA9PSAyCgogICAgcG9saWN5X2lkcyA6PSBzcGxpdChwX3N0b3JhZ2Uub3B0aW9uc1swXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBwb2xpY3lfaWRzID0iLCBwb2xpY3lfaWRzKQogICAgcG9saWN5X2lkcyA9PSBsYXllcl9pZHMKCiAgICBwb2xpY3lfaGFzaGVzIDo9IHNwbGl0KHBfc3RvcmFnZS5vcHRpb25zWzFdLCAiOiIpCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IHBvbGljeV9oYXNoZXMgPSIsIHBvbGljeV9oYXNoZXMpCgogICAgcF9jb3VudCA6PSBjb3VudChwb2xpY3lfaWRzKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBwX2NvdW50ID0iLCBwX2NvdW50KQogICAgcF9jb3VudCA+PSAxCiAgICBwX2NvdW50ID09IGNvdW50KHBvbGljeV9oYXNoZXMpCgogICAgaV9jb3VudCA6PSBjb3VudChpX3N0b3JhZ2Uub3B0aW9ucykKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogaV9jb3VudCA9IiwgaV9jb3VudCkKICAgIGlfY291bnQgPT0gcF9jb3VudCArIDMKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zWzBdID0iLCBpX3N0b3JhZ2Uub3B0aW9uc1swXSkKICAgIGlfc3RvcmFnZS5vcHRpb25zWzBdID09ICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQubGF5ZXItc3JjLXByZWZpeD0vdmFyL2xpYi9jb250YWluZXJkL2lvLmNvbnRhaW5lcmQuc25hcHNob3R0ZXIudjEudGFyZGV2L2xheWVycyIKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zW2lfY291bnQgLSAyXSA9IiwgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDJdKQogICAgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDJdID09ICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQub3ZlcmxheS1ydyIKCiAgICBsb3dlcmRpciA6PSBjb25jYXQoIj0iLCBbImxvd2VyZGlyIiwgcF9zdG9yYWdlLm9wdGlvbnNbMF1dKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBsb3dlcmRpciA9IiwgbG93ZXJkaXIpCgogICAgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDFdID09IGxvd2VyZGlyCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zW2lfY291bnQgLSAxXSA9IiwgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDFdKQoKICAgIGV2ZXJ5IGksIHBvbGljeV9pZCBpbiBwb2xpY3lfaWRzIHsKICAgICAgICBhbGxvd19vdmVybGF5X2xheWVyKHBvbGljeV9pZCwgcG9saWN5X2hhc2hlc1tpXSwgaV9zdG9yYWdlLm9wdGlvbnNbaSArIDFdKQogICAgfQoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogdHJ1ZSIpCn0KYWxsb3dfc3RvcmFnZV9vcHRpb25zKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKSB7CiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDM6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCiAgICBjb3VudChwX3N0b3JhZ2Uub3B0aW9ucykgPT0gMQoKICAgIHN0YXJ0c3dpdGgocF9zdG9yYWdlLm9wdGlvbnNbMF0sICIkKGhhc2giKQogICAgaGFzaF9zdWZmaXggOj0gdHJpbV9sZWZ0KHBfc3RvcmFnZS5vcHRpb25zWzBdLCAiJChoYXNoIikKCiAgICBlbmRzd2l0aChoYXNoX3N1ZmZpeCwgIikiKQogICAgaGFzaF9pbmRleCA6PSB0cmltX3JpZ2h0KGhhc2hfc3VmZml4LCAiKSIpCiAgICBpIDo9IHRvX251bWJlcihoYXNoX2luZGV4KQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAzOiBpID0iLCBpKQoKICAgIGhhc2hfb3B0aW9uIDo9IGNvbmNhdCgiPSIsIFsiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LnJvb3QtaGFzaCIsIHJvb3RfaGFzaGVzW2ldXSkKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMzogaGFzaF9vcHRpb24gPSIsIGhhc2hfb3B0aW9uKQoKICAgIGNvdW50KGlfc3RvcmFnZS5vcHRpb25zKSA9PSA0CiAgICBpX3N0b3JhZ2Uub3B0aW9uc1swXSA9PSAicm8iCiAgICBpX3N0b3JhZ2Uub3B0aW9uc1sxXSA9PSAiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmJsb2NrX2RldmljZT1maWxlIgogICAgaV9zdG9yYWdlLm9wdGlvbnNbMl0gPT0gImlvLmthdGFjb250YWluZXJzLmZzLW9wdC5pcy1sYXllciIKICAgIGlfc3RvcmFnZS5vcHRpb25zWzNdID09IGhhc2hfb3B0aW9uCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAzOiB0cnVlIikKfQphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgNDogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gInNtYiIKICAgIHBfb3B0c19jb3VudCA6PSBjb3VudChwX3N0b3JhZ2Uub3B0aW9ucykKICAgIGlfb3B0c19jb3VudCA6PSBjb3VudChpX3N0b3JhZ2Uub3B0aW9ucykKICAgIGlfb3B0c19jb3VudCA9PSBwX29wdHNfY291bnQgKyAyCgogICAgaV9vcHRfbWF0Y2hlcyA6PSBbaSB8IGkgOj0gaWR4OyBpZHggPCBwX29wdHNfY291bnQ7IHBfc3RvcmFnZS5vcHRpb25zW2lkeF0gPT0gaV9zdG9yYWdlLm9wdGlvbnNbaWR4XV0KICAgIGNvdW50KGlfb3B0X21hdGNoZXMpID09IHBfb3B0c19jb3VudAoKICAgIHN0YXJ0c3dpdGgoaV9zdG9yYWdlLm9wdGlvbnNbaV9vcHRzX2NvdW50LTJdLCAiYWRkcj0iKQogICAgY3JlZHMgPSBzcGxpdChpX3N0b3JhZ2Uub3B0aW9uc1tpX29wdHNfY291bnQtMV0sICIsIikKICAgIGNvdW50KGNyZWRzKSA9PSAyCiAgICBzdGFydHN3aXRoKGNyZWRzWzBdLCAidXNlcm5hbWU9IikKICAgIHN0YXJ0c3dpdGgoY3JlZHNbMV0sICJwYXNzd29yZD0iKQogICAgCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDQ6IHRydWUiKQp9CgphbGxvd19vdmVybGF5X2xheWVyKHBvbGljeV9pZCwgcG9saWN5X2hhc2gsIGlfb3B0aW9uKSB7CiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogcG9saWN5X2lkID0iLCBwb2xpY3lfaWQsICJwb2xpY3lfaGFzaCA9IiwgcG9saWN5X2hhc2gpCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogaV9vcHRpb24gPSIsIGlfb3B0aW9uKQoKICAgIHN0YXJ0c3dpdGgoaV9vcHRpb24sICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQubGF5ZXI9IikKICAgIGlfdmFsdWUgOj0gcmVwbGFjZShpX29wdGlvbiwgImlvLmthdGFjb250YWluZXJzLmZzLW9wdC5sYXllcj0iLCAiIikKICAgIGlfdmFsdWVfZGVjb2RlZCA6PSBiYXNlNjQuZGVjb2RlKGlfdmFsdWUpCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogaV92YWx1ZV9kZWNvZGVkID0iLCBpX3ZhbHVlX2RlY29kZWQpCgogICAgcG9saWN5X3N1ZmZpeCA6PSBjb25jYXQoIj0iLCBbInRhcixybyxpby5rYXRhY29udGFpbmVycy5mcy1vcHQuYmxvY2tfZGV2aWNlPWZpbGUsaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmlzLWxheWVyLGlvLmthdGFjb250YWluZXJzLmZzLW9wdC5yb290LWhhc2giLCBwb2xpY3lfaGFzaF0pCiAgICBwX3ZhbHVlIDo9IGNvbmNhdCgiLCIsIFtwb2xpY3lfaWQsIHBvbGljeV9zdWZmaXhdKQogICAgcHJpbnQoImFsbG93X292ZXJsYXlfbGF5ZXI6IHBfdmFsdWUgPSIsIHBfdmFsdWUpCgogICAgcF92YWx1ZSA9PSBpX3ZhbHVlX2RlY29kZWQKCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogdHJ1ZSIpCn0KCmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAidGFyIgoKICAgIHN0YXJ0c3dpdGgocF9zdG9yYWdlLm1vdW50X3BvaW50LCAiJChsYXllciIpCiAgICBtb3VudF9zdWZmaXggOj0gdHJpbV9sZWZ0KHBfc3RvcmFnZS5tb3VudF9wb2ludCwgIiQobGF5ZXIiKQoKICAgIGVuZHN3aXRoKG1vdW50X3N1ZmZpeCwgIikiKQogICAgbGF5ZXJfaW5kZXggOj0gdHJpbV9yaWdodChtb3VudF9zdWZmaXgsICIpIikKICAgIGkgOj0gdG9fbnVtYmVyKGxheWVyX2luZGV4KQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDE6IGkgPSIsIGkpCgogICAgbGF5ZXJfaWQgOj0gbGF5ZXJfaWRzW2ldCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMTogbGF5ZXJfaWQgPSIsIGxheWVyX2lkKQoKICAgIHBfbW91bnQgOj0gY29uY2F0KCIvIiwgWyIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L2xheWVycyIsIGxheWVyX2lkXSkKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCAxOiBwX21vdW50ID0iLCBwX21vdW50KQoKICAgIHBfbW91bnQgPT0gaV9zdG9yYWdlLm1vdW50X3BvaW50CgogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDE6IHRydWUiKQp9CmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAiZnVzZTMua2F0YS1vdmVybGF5IgoKICAgIG1vdW50MSA6PSByZXBsYWNlKHBfc3RvcmFnZS5tb3VudF9wb2ludCwgIiQoY3BhdGgpIiwgcG9saWN5X2RhdGEuY29tbW9uLmNwYXRoKQogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDI6IG1vdW50MiA9IiwgbW91bnQyKQoKICAgIG1vdW50MiA9PSBpX3N0b3JhZ2UubW91bnRfcG9pbnQKCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMjogdHJ1ZSIpCn0KYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKSB7CiAgICBwX3N0b3JhZ2UuZnN0eXBlID09ICJsb2NhbCIKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQyID0iLCBtb3VudDIpCgogICAgbW91bnQzIDo9IHJlcGxhY2UobW91bnQyLCAiJChzYW5kYm94LWlkKSIsIHNhbmRib3hfaWQpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQzID0iLCBtb3VudDMpCgogICAgcmVnZXgubWF0Y2gobW91bnQzLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCgogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDM6IHRydWUiKQp9CmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAiYmluZCIKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNDogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNDogbW91bnQyID0iLCBtb3VudDIpCgogICAgbW91bnQzIDo9IHJlcGxhY2UobW91bnQyLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDQ6IG1vdW50MyA9IiwgbW91bnQzKQoKICAgIHJlZ2V4Lm1hdGNoKG1vdW50MywgaV9zdG9yYWdlLm1vdW50X3BvaW50KQoKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA0OiB0cnVlIikKfQphbGxvd19tb3VudF9wb2ludChwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgYnVuZGxlX2lkLCBzYW5kYm94X2lkLCBsYXllcl9pZHMpIHsKICAgIHBfc3RvcmFnZS5mc3R5cGUgPT0gInRtcGZzIgoKICAgIG1vdW50MSA6PSBwX3N0b3JhZ2UubW91bnRfcG9pbnQKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA1OiBtb3VudDEgPSIsIG1vdW50MSkKCiAgICByZWdleC5tYXRjaChtb3VudDEsIGlfc3RvcmFnZS5tb3VudF9wb2ludCkKCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNTogdHJ1ZSIpCn0KYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKSB7CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogaV9zdG9yYWdlLm1vdW50X3BvaW50ID0iLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCiAgICBhbGxvd19kaXJlY3Rfdm9sX2RyaXZlcihwX3N0b3JhZ2UsIGlfc3RvcmFnZSkKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChzcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQyID0iLCBtb3VudDIpCgogICAgZGlyZWN0X3ZvbF9wYXRoIDo9IGlfc3RvcmFnZS5zb3VyY2UKICAgIG1vdW50MyA6PSByZXBsYWNlKG1vdW50MiwgIiQoYjY0LWRpcmVjdC12b2wtcGF0aCkiLCBiYXNlNjR1cmwuZW5jb2RlKGRpcmVjdF92b2xfcGF0aCkpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQzID0iLCBtb3VudDMpCgogICAgbW91bnQzID09IGlfc3RvcmFnZS5tb3VudF9wb2ludAoKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA2OiB0cnVlIikKfQoKYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIocF9zdG9yYWdlLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19kaXJlY3Rfdm9sX2RyaXZlciAxOiBzdGFydCIpCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCiAgICBwcmludCgiYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIgMTogdHJ1ZSIpCn0KYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIocF9zdG9yYWdlLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19kaXJlY3Rfdm9sX2RyaXZlciAyOiBzdGFydCIpCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJzbWIiCiAgICBwcmludCgiYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIgMjogdHJ1ZSIpCn0KCiMgRXhlY1Byb2Nlc3NSZXF1ZXN0LnByb2Nlc3MuQ2FwYWJpbGl0aWVzCmFsbG93X2V4ZWNfY2FwcyhpX2NhcHMpIHsKICAgIG5vdCBpX2NhcHMuQW1iaWVudAogICAgbm90IGlfY2Fwcy5Cb3VuZGluZwogICAgbm90IGlfY2Fwcy5FZmZlY3RpdmUKICAgIG5vdCBpX2NhcHMuSW5oZXJpdGFibGUKICAgIG5vdCBpX2NhcHMuUGVybWl0dGVkCn0KCiMgT0NJLlByb2Nlc3MuQ2FwYWJpbGl0aWVzCmFsbG93X2NhcHMocF9jYXBzLCBpX2NhcHMpIHsKICAgIHByaW50KCJhbGxvd19jYXBzOiBwb2xpY3kgQW1iaWVudCA9IiwgcF9jYXBzLkFtYmllbnQpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgQW1iaWVudCA9IiwgaV9jYXBzLkFtYmllbnQpCiAgICBtYXRjaF9jYXBzKHBfY2Fwcy5BbWJpZW50LCBpX2NhcHMuQW1iaWVudCkKCiAgICBwcmludCgiYWxsb3dfY2FwczogcG9saWN5IEJvdW5kaW5nID0iLCBwX2NhcHMuQm91bmRpbmcpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgQm91bmRpbmcgPSIsIGlfY2Fwcy5Cb3VuZGluZykKICAgIG1hdGNoX2NhcHMocF9jYXBzLkJvdW5kaW5nLCBpX2NhcHMuQm91bmRpbmcpCgogICAgcHJpbnQoImFsbG93X2NhcHM6IHBvbGljeSBFZmZlY3RpdmUgPSIsIHBfY2Fwcy5FZmZlY3RpdmUpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgRWZmZWN0aXZlID0iLCBpX2NhcHMuRWZmZWN0aXZlKQogICAgbWF0Y2hfY2FwcyhwX2NhcHMuRWZmZWN0aXZlLCBpX2NhcHMuRWZmZWN0aXZlKQoKICAgIHByaW50KCJhbGxvd19jYXBzOiBwb2xpY3kgSW5oZXJpdGFibGUgPSIsIHBfY2Fwcy5Jbmhlcml0YWJsZSkKICAgIHByaW50KCJhbGxvd19jYXBzOiBpbnB1dCBJbmhlcml0YWJsZSA9IiwgaV9jYXBzLkluaGVyaXRhYmxlKQogICAgbWF0Y2hfY2FwcyhwX2NhcHMuSW5oZXJpdGFibGUsIGlfY2Fwcy5Jbmhlcml0YWJsZSkKCiAgICBwcmludCgiYWxsb3dfY2FwczogcG9saWN5IFBlcm1pdHRlZCA9IiwgcF9jYXBzLlBlcm1pdHRlZCkKICAgIHByaW50KCJhbGxvd19jYXBzOiBpbnB1dCBQZXJtaXR0ZWQgPSIsIGlfY2Fwcy5QZXJtaXR0ZWQpCiAgICBtYXRjaF9jYXBzKHBfY2Fwcy5QZXJtaXR0ZWQsIGlfY2Fwcy5QZXJtaXR0ZWQpCn0KCm1hdGNoX2NhcHMocF9jYXBzLCBpX2NhcHMpIHsKICAgIHByaW50KCJtYXRjaF9jYXBzIDE6IHN0YXJ0IikKCiAgICBwX2NhcHMgPT0gaV9jYXBzCgogICAgcHJpbnQoIm1hdGNoX2NhcHMgMTogdHJ1ZSIpCn0KbWF0Y2hfY2FwcyhwX2NhcHMsIGlfY2FwcykgewogICAgcHJpbnQoIm1hdGNoX2NhcHMgMjogc3RhcnQiKQoKICAgIGNvdW50KHBfY2FwcykgPT0gMQogICAgcF9jYXBzWzBdID09ICIkKGRlZmF1bHRfY2FwcykiCgogICAgcHJpbnQoIm1hdGNoX2NhcHMgMjogZGVmYXVsdF9jYXBzID0iLCBwb2xpY3lfZGF0YS5jb21tb24uZGVmYXVsdF9jYXBzKQogICAgcG9saWN5X2RhdGEuY29tbW9uLmRlZmF1bHRfY2FwcyA9PSBpX2NhcHMKCiAgICBwcmludCgibWF0Y2hfY2FwcyAyOiB0cnVlIikKfQptYXRjaF9jYXBzKHBfY2FwcywgaV9jYXBzKSB7CiAgICBwcmludCgibWF0Y2hfY2FwcyAzOiBzdGFydCIpCgogICAgY291bnQocF9jYXBzKSA9PSAxCiAgICBwX2NhcHNbMF0gPT0gIiQocHJpdmlsZWdlZF9jYXBzKSIKCiAgICBwcmludCgibWF0Y2hfY2FwcyAzOiBwcml2aWxlZ2VkX2NhcHMgPSIsIHBvbGljeV9kYXRhLmNvbW1vbi5wcml2aWxlZ2VkX2NhcHMpCiAgICBwb2xpY3lfZGF0YS5jb21tb24ucHJpdmlsZWdlZF9jYXBzID09IGlfY2FwcwoKICAgIHByaW50KCJtYXRjaF9jYXBzIDM6IHRydWUiKQp9CgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgpjaGVja19kaXJlY3RvcnlfdHJhdmVyc2FsKGlfcGF0aCkgewogICAgbm90IHJlZ2V4Lm1hdGNoKCIoXnwvKS4uKCR8LykiLCBpX3BhdGgpCn0KCmNoZWNrX3N5bWxpbmtfc291cmNlKGlfc3JjKSB7CiAgICBpX3NyYyA9PSAiIgogICAgcHJpbnQoImNoZWNrX3N5bWxpbmtfc291cmNlIDE6IHRydWUiKQp9CmNoZWNrX3N5bWxpbmtfc291cmNlKGlfc3JjKSB7CiAgICBpX3NyYyAhPSAiIgogICAgcHJpbnQoImNoZWNrX3N5bWxpbmtfc291cmNlIDI6IGlfc3JjID0iLCBpX3NyYykKCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24uc19zb3VyY2UxLCBpX3NyYykKCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMjogdHJ1ZSIpCn0KY2hlY2tfc3ltbGlua19zb3VyY2UoaV9zcmMpIHsKICAgIGlfc3JjICE9ICIiCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMzogaV9zcmMgPSIsIGlfc3JjKQoKICAgIHJlZ2V4Lm1hdGNoKHBvbGljeV9kYXRhLmNvbW1vbi5zX3NvdXJjZTIsIGlfc3JjKQogICAgY2hlY2tfZGlyZWN0b3J5X3RyYXZlcnNhbChpX3NyYykKCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMzogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfc3RvcmFnZXMoaV9zdG9yYWdlcykgewogICAgcHJpbnQoImFsbG93X3NhbmRib3hfc3RvcmFnZXM6IGlfc3RvcmFnZXMgPSIsIGlfc3RvcmFnZXMpCgogICAgcF9zdG9yYWdlcyA6PSBwb2xpY3lfZGF0YS5zYW5kYm94LnN0b3JhZ2VzCiAgICBldmVyeSBpX3N0b3JhZ2UgaW4gaV9zdG9yYWdlcyB7CiAgICAgICAgYWxsb3dfc2FuZGJveF9zdG9yYWdlKHBfc3RvcmFnZXMsIGlfc3RvcmFnZSkKICAgIH0KCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9zdG9yYWdlczogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfc3RvcmFnZShwX3N0b3JhZ2VzLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IGlfc3RvcmFnZSA9IiwgaV9zdG9yYWdlKQoKICAgIHNvbWUgcF9zdG9yYWdlIGluIHBfc3RvcmFnZXMKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IHBfc3RvcmFnZSA9IiwgcF9zdG9yYWdlKQogICAgaV9zdG9yYWdlID09IHBfc3RvcmFnZQoKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IHRydWUiKQp9CgpDb3B5RmlsZVJlcXVlc3QgewogICAgcHJpbnQoIkNvcHlGaWxlUmVxdWVzdDogaW5wdXQucGF0aCA9IiwgaW5wdXQucGF0aCkKCiAgICBjaGVja19zeW1saW5rX3NvdXJjZShpbnB1dC5zeW1saW5rX3NyYykKICAgIGNoZWNrX2RpcmVjdG9yeV90cmF2ZXJzYWwoaW5wdXQucGF0aCkKCiAgICBzb21lIHJlZ2V4MSBpbiBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLkNvcHlGaWxlUmVxdWVzdAogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5jcGF0aCkKICAgIHJlZ2V4NCA6PSByZXBsYWNlKHJlZ2V4MywgIiQoYnVuZGxlLWlkKSIsIEJVTkRMRV9JRCkKICAgIHByaW50KCJDb3B5RmlsZVJlcXVlc3Q6IHJlZ2V4NCA9IiwgcmVnZXg0KQoKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4NCwgaW5wdXQucGF0aCkKCiAgICBwcmludCgiQ29weUZpbGVSZXF1ZXN0OiB0cnVlIikKfQoKQ3JlYXRlU2FuZGJveFJlcXVlc3QgewogICAgcHJpbnQoIkNyZWF0ZVNhbmRib3hSZXF1ZXN0OiBpbnB1dC5ndWVzdF9ob29rX3BhdGggPSIsIGlucHV0Lmd1ZXN0X2hvb2tfcGF0aCkKICAgIGNvdW50KGlucHV0Lmd1ZXN0X2hvb2tfcGF0aCkgPT0gMAoKICAgIHByaW50KCJDcmVhdGVTYW5kYm94UmVxdWVzdDogaW5wdXQua2VybmVsX21vZHVsZXMgPSIsIGlucHV0Lmtlcm5lbF9tb2R1bGVzKQogICAgY291bnQoaW5wdXQua2VybmVsX21vZHVsZXMpID09IDAKCiAgICBpX3BpZG5zIDo9IGlucHV0LnNhbmRib3hfcGlkbnMKICAgIHByaW50KCJDcmVhdGVTYW5kYm94UmVxdWVzdDogaV9waWRucyA9IiwgaV9waWRucykKICAgIGlfcGlkbnMgPT0gZmFsc2UKICAgIGFsbG93X3NhbmRib3hfc3RvcmFnZXMoaW5wdXQuc3RvcmFnZXMpCn0KCmFsbG93X2V4ZWMocF9jb250YWluZXIsIGlfcHJvY2VzcykgewogICAgcHJpbnQoImFsbG93X2V4ZWM6IHN0YXJ0IikKCiAgICBwX29jaSA9IHBfY29udGFpbmVyLk9DSQogICAgcF9zX25hbWUgPSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc19uYW1lc3BhY2UgPSBnZXRfc3RhdGVfdmFsKCJuYW1lc3BhY2UiKQogICAgYWxsb3dfcHJvYmVfcHJvY2VzcyhwX29jaS5Qcm9jZXNzLCBpX3Byb2Nlc3MsIHBfc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfZXhlYzogdHJ1ZSIpCn0KCmFsbG93X2ludGVyYWN0aXZlX2V4ZWMocF9jb250YWluZXIsIGlfcHJvY2VzcykgewogICAgcHJpbnQoImFsbG93X2ludGVyYWN0aXZlX2V4ZWM6IHN0YXJ0IikKCiAgICBwX29jaSA9IHBfY29udGFpbmVyLk9DSQogICAgcF9zX25hbWUgPSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc19uYW1lc3BhY2UgPSBnZXRfc3RhdGVfdmFsKCJuYW1lc3BhY2UiKQogICAgYWxsb3dfaW50ZXJhY3RpdmVfcHJvY2VzcyhwX29jaS5Qcm9jZXNzLCBpX3Byb2Nlc3MsIHBfc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfaW50ZXJhY3RpdmVfZXhlYzogdHJ1ZSIpCn0KCiMgVE9ETzogc2hvdWxkIG90aGVyIEV4ZWNQcm9jZXNzUmVxdWVzdCBpbnB1dCBkYXRhIGZpZWxkcyBiZSB2YWxpZGF0ZWQgYXMgd2VsbD8KRXhlY1Byb2Nlc3NSZXF1ZXN0IHsKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMTogaW5wdXQgPSIsIGlucHV0KQoKICAgIHNvbWUgcF9jb21tYW5kIGluIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuRXhlY1Byb2Nlc3NSZXF1ZXN0LmFsbG93ZWRfY29tbWFuZHMKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMTogcF9jb21tYW5kID0iLCBwX2NvbW1hbmQpCiAgICBwX2NvbW1hbmQgPT0gaW5wdXQucHJvY2Vzcy5BcmdzCgogICAgIyBUT0RPOiBtYXRjaCBwX2NvbnRhaW5lcidzIElEIHdpdGggdGhlIGlucHV0IGNvbnRhaW5lcl9pZC4KICAgIHNvbWUgcF9jb250YWluZXIgaW4gcG9saWN5X2RhdGEuY29udGFpbmVycwogICAgYWxsb3dfaW50ZXJhY3RpdmVfZXhlYyhwX2NvbnRhaW5lciwgaW5wdXQucHJvY2VzcykKCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDE6IHRydWUiKQp9CkV4ZWNQcm9jZXNzUmVxdWVzdCB7CiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDI6IGlucHV0ID0iLCBpbnB1dCkKCiAgICAjIFRPRE86IG1hdGNoIGlucHV0IGNvbnRhaW5lciBJRCB3aXRoIGl0cyBjb3JyZXNwb25kaW5nIGNvbnRhaW5lci5leGVjX2NvbW1hbmRzLgogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBzb21lIHBfY29tbWFuZCBpbiBwX2NvbnRhaW5lci5leGVjX2NvbW1hbmRzCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDI6IHBfY29tbWFuZCA9IiwgcF9jb21tYW5kKQoKICAgICMgVE9ETzogc2hvdWxkIG90aGVyIGlucHV0IGRhdGEgZmllbGRzIGJlIHZhbGlkYXRlZCBhcyB3ZWxsPwogICAgcF9jb21tYW5kID09IGlucHV0LnByb2Nlc3MuQXJncwoKICAgIGFsbG93X2V4ZWMocF9jb250YWluZXIsIGlucHV0LnByb2Nlc3MpCgogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAyOiB0cnVlIikKfQpFeGVjUHJvY2Vzc1JlcXVlc3QgewogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAzOiBpbnB1dCA9IiwgaW5wdXQpCgogICAgaV9jb21tYW5kID0gY29uY2F0KCIgIiwgaW5wdXQucHJvY2Vzcy5BcmdzKQogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAzOiBpX2NvbW1hbmQgPSIsIGlfY29tbWFuZCkKCiAgICBzb21lIHBfcmVnZXggaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5FeGVjUHJvY2Vzc1JlcXVlc3QucmVnZXgKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMzogcF9yZWdleCA9IiwgcF9yZWdleCkKCiAgICByZWdleC5tYXRjaChwX3JlZ2V4LCBpX2NvbW1hbmQpCgogICAgIyBUT0RPOiBtYXRjaCBwX2NvbnRhaW5lcidzIElEIHdpdGggdGhlIGlucHV0IGNvbnRhaW5lcl9pZC4KICAgIHNvbWUgcF9jb250YWluZXIgaW4gcG9saWN5X2RhdGEuY29udGFpbmVycwogICAgYWxsb3dfaW50ZXJhY3RpdmVfZXhlYyhwX2NvbnRhaW5lciwgaW5wdXQucHJvY2VzcykKCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDM6IHRydWUiKQp9CgpVcGRhdGVSb3V0ZXNSZXF1ZXN0IHsKICAgIHByaW50KCJVcGRhdGVSb3V0ZXNSZXF1ZXN0OiBpbnB1dCA9IiwgaW5wdXQpCiAgICBwcmludCgiVXBkYXRlUm91dGVzUmVxdWVzdDogcG9saWN5ID0iLCBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLlVwZGF0ZVJvdXRlc1JlcXVlc3QpCgogICAgaV9yb3V0ZXMgOj0gaW5wdXQucm91dGVzLlJvdXRlcwogICAgcF9zb3VyY2VfcmVnZXggPSBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLlVwZGF0ZVJvdXRlc1JlcXVlc3QuZm9yYmlkZGVuX3NvdXJjZV9yZWdleAogICAgcF9uYW1lcyA9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuVXBkYXRlUm91dGVzUmVxdWVzdC5mb3JiaWRkZW5fZGV2aWNlX25hbWVzCgogICAgZXZlcnkgaV9yb3V0ZSBpbiBpX3JvdXRlcyB7CiAgICAgICAgcHJpbnQoImlfcm91dGUuc291cmNlID0iLCBpX3JvdXRlLnNvdXJjZSkKICAgICAgICBldmVyeSBwX3JlZ2V4IGluIHBfc291cmNlX3JlZ2V4IHsKICAgICAgICAgICAgcHJpbnQoInBfcmVnZXggPSIsIHBfcmVnZXgpCiAgICAgICAgICAgIG5vdCByZWdleC5tYXRjaChwX3JlZ2V4LCBpX3JvdXRlLnNvdXJjZSkKICAgICAgICB9CgogICAgICAgIHByaW50KCJpX3JvdXRlLmRldmljZSA9IiwgaV9yb3V0ZS5kZXZpY2UpCiAgICAgICAgbm90IGlfcm91dGUuZGV2aWNlIGluIHBfbmFtZXMKICAgIH0KCiAgICBwcmludCgiVXBkYXRlUm91dGVzUmVxdWVzdDogdHJ1ZSIpCn0KClVwZGF0ZUludGVyZmFjZVJlcXVlc3QgewogICAgcHJpbnQoIlVwZGF0ZUludGVyZmFjZVJlcXVlc3Q6IGlucHV0ID0iLCBpbnB1dCkKICAgIHByaW50KCJVcGRhdGVJbnRlcmZhY2VSZXF1ZXN0OiBwb2xpY3kgPSIsIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuVXBkYXRlSW50ZXJmYWNlUmVxdWVzdCkKCiAgICBpX2ludGVyZmFjZSA6PSBpbnB1dC5pbnRlcmZhY2UKICAgIHBfZmxhZ3MgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmFsbG93X3Jhd19mbGFncwoKICAgICMgVHlwaWNhbGx5LCBqdXN0IElGRl9OT0FSUCBpcyB1c2VkLgogICAgYml0cy5hbmQoaV9pbnRlcmZhY2UucmF3X2ZsYWdzLCBiaXRzLm5lZ2F0ZShwX2ZsYWdzKSkgPT0gMAoKICAgIHBfbmFtZXMgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmZvcmJpZGRlbl9uYW1lcwoKICAgIG5vdCBpX2ludGVyZmFjZS5uYW1lIGluIHBfbmFtZXMKCiAgICBwX2h3YWRkcnMgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmZvcmJpZGRlbl9od19hZGRycwoKICAgIG5vdCBpX2ludGVyZmFjZS5od0FkZHIgaW4gcF9od2FkZHJzCgogICAgcHJpbnQoIlVwZGF0ZUludGVyZmFjZVJlcXVlc3Q6IHRydWUiKQp9CgpDbG9zZVN0ZGluUmVxdWVzdCB7CiAgICBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLkNsb3NlU3RkaW5SZXF1ZXN0ID09IHRydWUKfQoKUmVhZFN0cmVhbVJlcXVlc3QgewogICAgcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5SZWFkU3RyZWFtUmVxdWVzdCA9PSB0cnVlCn0KClVwZGF0ZUVwaGVtZXJhbE1vdW50c1JlcXVlc3QgewogICAgcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVFcGhlbWVyYWxNb3VudHNSZXF1ZXN0ID09IHRydWUKfQoKV3JpdGVTdHJlYW1SZXF1ZXN0IHsKICAgIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuV3JpdGVTdHJlYW1SZXF1ZXN0ID09IHRydWUKfQoKcG9saWN5X2RhdGEgOj0gewogICJjb250YWluZXJzIjogWwogICAgewogICAgICAiT0NJIjogewogICAgICAgICJWZXJzaW9uIjogIjEuMS4wLXJjLjEiLAogICAgICAgICJQcm9jZXNzIjogewogICAgICAgICAgIlRlcm1pbmFsIjogZmFsc2UsCiAgICAgICAgICAiVXNlciI6IHsKICAgICAgICAgICAgIlVJRCI6IDY1NTM1LAogICAgICAgICAgICAiR0lEIjogNjU1MzUsCiAgICAgICAgICAgICJBZGRpdGlvbmFsR2lkcyI6IFtdLAogICAgICAgICAgICAiVXNlcm5hbWUiOiAiIgogICAgICAgICAgfSwKICAgICAgICAgICJEZXByZWNhdGVkQXJncyI6IFsKICAgICAgICAgICAgIi9wYXVzZSIKICAgICAgICAgIF0sCiAgICAgICAgICAiQXJncyI6IFsKICAgICAgICAgICAgIi9wYXVzZSIKICAgICAgICAgIF0sCiAgICAgICAgICAiRW52IjogWwogICAgICAgICAgICAiUEFUSD0vdXNyL2xvY2FsL3NiaW46L3Vzci9sb2NhbC9iaW46L3Vzci9zYmluOi91c3IvYmluOi9zYmluOi9iaW4iCiAgICAgICAgICBdLAogICAgICAgICAgIkN3ZCI6ICIvIiwKICAgICAgICAgICJDYXBhYmlsaXRpZXMiOiB7CiAgICAgICAgICAgICJBbWJpZW50IjogW10sCiAgICAgICAgICAgICJCb3VuZGluZyI6IFsKICAgICAgICAgICAgICAiJChkZWZhdWx0X2NhcHMpIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiRWZmZWN0aXZlIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJJbmhlcml0YWJsZSI6IFtdLAogICAgICAgICAgICAiUGVybWl0dGVkIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICAiTm9OZXdQcml2aWxlZ2VzIjogdHJ1ZQogICAgICAgIH0sCiAgICAgICAgIlJvb3QiOiB7CiAgICAgICAgICAiUGF0aCI6ICIkKGNwYXRoKS8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgIlJlYWRvbmx5IjogdHJ1ZQogICAgICAgIH0sCiAgICAgICAgIk1vdW50cyI6IFsKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9wcm9jIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJwcm9jIiwKICAgICAgICAgICAgInR5cGVfIjogInByb2MiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2IiwKICAgICAgICAgICAgInNvdXJjZSI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJzdHJpY3RhdGltZSIsCiAgICAgICAgICAgICAgIm1vZGU9NzU1IiwKICAgICAgICAgICAgICAic2l6ZT02NTUzNmsiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L3B0cyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiZGV2cHRzIiwKICAgICAgICAgICAgInR5cGVfIjogImRldnB0cyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJuZXdpbnN0YW5jZSIsCiAgICAgICAgICAgICAgInB0bXhtb2RlPTA2NjYiLAogICAgICAgICAgICAgICJtb2RlPTA2MjAiLAogICAgICAgICAgICAgICJnaWQ9NSIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvc2htIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L3NobSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi9tcXVldWUiLAogICAgICAgICAgICAic291cmNlIjogIm1xdWV1ZSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJtcXVldWUiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvc3lzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJzeXNmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJzeXNmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2V0Yy9yZXNvbHYuY29uZiIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClyZXNvbHYuY29uZiQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJvIiwKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9kZXYiLAogICAgICAgICAgICAgICJub2V4ZWMiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0KICAgICAgICBdLAogICAgICAgICJBbm5vdGF0aW9ucyI6IHsKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmJ1bmRsZV9wYXRoIjogIi9ydW4vY29udGFpbmVyZC9pby5jb250YWluZXJkLnJ1bnRpbWUudjIudGFzay9rOHMuaW8vJChidW5kbGUtaWQpIiwKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIjogInBvZF9zYW5kYm94IiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSI6ICJzYW5kYm94IiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWlkIjogIl5bYS16MC05XXs2NH0kIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWxvZy1kaXJlY3RvcnkiOiAiXi92YXIvbG9nL3BvZHMvJChzYW5kYm94LW5hbWVzcGFjZSlfJChzYW5kYm94LW5hbWUpX1swLTlhLWZdezh9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezEyfSQiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZSI6ICJedmFsaWRcXC1wb2QkIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LW5hbWVzcGFjZSI6ICIiLAogICAgICAgICAgIm5lcmRjdGwvbmV0d29yay1uYW1lc3BhY2UiOiAiXi92YXIvcnVuL25ldG5zL2NuaS1bMC05YS1mXXs4fS1bMC05YS1mXXs0fS1bMC05YS1mXXs0fS1bMC05YS1mXXs0fS1bMC05YS1mXXsxMn0kIgogICAgICAgIH0sCiAgICAgICAgIkxpbnV4IjogewogICAgICAgICAgIk5hbWVzcGFjZXMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiVHlwZSI6ICJpcGMiLAogICAgICAgICAgICAgICJQYXRoIjogIiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJUeXBlIjogInV0cyIsCiAgICAgICAgICAgICAgIlBhdGgiOiAiIgogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgIlR5cGUiOiAibW91bnQiLAogICAgICAgICAgICAgICJQYXRoIjogIiIKICAgICAgICAgICAgfQogICAgICAgICAgXSwKICAgICAgICAgICJNYXNrZWRQYXRocyI6IFsKICAgICAgICAgICAgIi9wcm9jL2FjcGkiLAogICAgICAgICAgICAiL3Byb2MvYXNvdW5kIiwKICAgICAgICAgICAgIi9wcm9jL2tjb3JlIiwKICAgICAgICAgICAgIi9wcm9jL2tleXMiLAogICAgICAgICAgICAiL3Byb2MvbGF0ZW5jeV9zdGF0cyIsCiAgICAgICAgICAgICIvcHJvYy90aW1lcl9saXN0IiwKICAgICAgICAgICAgIi9wcm9jL3RpbWVyX3N0YXRzIiwKICAgICAgICAgICAgIi9wcm9jL3NjaGVkX2RlYnVnIiwKICAgICAgICAgICAgIi9zeXMvZmlybXdhcmUiLAogICAgICAgICAgICAiL3Byb2Mvc2NzaSIKICAgICAgICAgIF0sCiAgICAgICAgICAiUmVhZG9ubHlQYXRocyI6IFsKICAgICAgICAgICAgIi9wcm9jL2J1cyIsCiAgICAgICAgICAgICIvcHJvYy9mcyIsCiAgICAgICAgICAgICIvcHJvYy9pcnEiLAogICAgICAgICAgICAiL3Byb2Mvc3lzIiwKICAgICAgICAgICAgIi9wcm9jL3N5c3JxLXRyaWdnZXIiCiAgICAgICAgICBdLAogICAgICAgICAgIkRldmljZXMiOiBbXSwKICAgICAgICAgICJTeXNjdGwiOiB7CiAgICAgICAgICAgICJuZXQuaXB2NC5pcF91bnByaXZpbGVnZWRfcG9ydF9zdGFydCI6ICIwIiwKICAgICAgICAgICAgIm5ldC5pcHY0LnBpbmdfZ3JvdXBfcmFuZ2UiOiAiMCAyMTQ3NDgzNjQ3IgogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSwKICAgICAgInN0b3JhZ2VzIjogWwogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2gwKSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjApIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAib3ZlcmxheWZzIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJmdXNlMy5rYXRhLW92ZXJsYXkiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICI1YTVhYWQ4MDA1NWZmMjAwMTJhNTBkYzI1ZjhkZjdhMjk5MjQ0NzQzMjRkNjVmN2Q1MzA2ZWU4ZWUyN2ZmNzFkIiwKICAgICAgICAgICAgIjgxNzI1MGYxYTNlMzM2ZGE3NmY1YmQzZmE3ODRlMWIyNmQ5NTliOWMxMzE4NzY4MTViYTI2MDQwNDhiNzBjMTgiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQoY3BhdGgpLyQoYnVuZGxlLWlkKSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfQogICAgICBdLAogICAgICAiZGV2aWNlcyI6IFtdLAogICAgICAic2FuZGJveF9waWRucyI6IGZhbHNlLAogICAgICAiZXhlY19jb21tYW5kcyI6IFtdLAogICAgICAiZW52X21hcCI6IHsKICAgICAgICAiUEFUSCI6ICIvdXNyL2xvY2FsL3NiaW46L3Vzci9sb2NhbC9iaW46L3Vzci9zYmluOi91c3IvYmluOi9zYmluOi9iaW4iCiAgICAgIH0KICAgIH0sCiAgICB7CiAgICAgICJPQ0kiOiB7CiAgICAgICAgIlZlcnNpb24iOiAiMS4xLjAtcmMuMSIsCiAgICAgICAgIlByb2Nlc3MiOiB7CiAgICAgICAgICAiVGVybWluYWwiOiBmYWxzZSwKICAgICAgICAgICJVc2VyIjogewogICAgICAgICAgICAiVUlEIjogMCwKICAgICAgICAgICAgIkdJRCI6IDAsCiAgICAgICAgICAgICJBZGRpdGlvbmFsR2lkcyI6IFtdLAogICAgICAgICAgICAiVXNlcm5hbWUiOiAiIgogICAgICAgICAgfSwKICAgICAgICAgICJEZXByZWNhdGVkQXJncyI6IFsKICAgICAgICAgICAgIi9zZXJ2ZV9ob3N0bmFtZSIKICAgICAgICAgIF0sCiAgICAgICAgICAiQXJncyI6IFsKICAgICAgICAgICAgIi9zZXJ2ZV9ob3N0bmFtZSIKICAgICAgICAgIF0sCiAgICAgICAgICAiRW52IjogWwogICAgICAgICAgICAiSE9NRT0vIiwKICAgICAgICAgICAgIlBBVEg9L3Vzci9sb2NhbC9zYmluOi91c3IvbG9jYWwvYmluOi91c3Ivc2JpbjovdXNyL2Jpbjovc2JpbjovYmluIiwKICAgICAgICAgICAgIkhPU1ROQU1FPSQoaG9zdC1uYW1lKSIKICAgICAgICAgIF0sCiAgICAgICAgICAiQ3dkIjogIi8iLAogICAgICAgICAgIkNhcGFiaWxpdGllcyI6IHsKICAgICAgICAgICAgIkFtYmllbnQiOiBbXSwKICAgICAgICAgICAgIkJvdW5kaW5nIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJFZmZlY3RpdmUiOiBbCiAgICAgICAgICAgICAgIiQoZGVmYXVsdF9jYXBzKSIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgIkluaGVyaXRhYmxlIjogW10sCiAgICAgICAgICAgICJQZXJtaXR0ZWQiOiBbCiAgICAgICAgICAgICAgIiQoZGVmYXVsdF9jYXBzKSIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgICJOb05ld1ByaXZpbGVnZXMiOiBmYWxzZQogICAgICAgIH0sCiAgICAgICAgIlJvb3QiOiB7CiAgICAgICAgICAiUGF0aCI6ICIkKGNwYXRoKS8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgIlJlYWRvbmx5IjogZmFsc2UKICAgICAgICB9LAogICAgICAgICJNb3VudHMiOiBbCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvcHJvYyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAicHJvYyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJwcm9jIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAgICAgIm5vZGV2IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2RldiIsCiAgICAgICAgICAgICJzb3VyY2UiOiAidG1wZnMiLAogICAgICAgICAgICAidHlwZV8iOiAidG1wZnMiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAic3RyaWN0YXRpbWUiLAogICAgICAgICAgICAgICJtb2RlPTc1NSIsCiAgICAgICAgICAgICAgInNpemU9NjU1MzZrIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi9wdHMiLAogICAgICAgICAgICAic291cmNlIjogImRldnB0cyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJkZXZwdHMiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibmV3aW5zdGFuY2UiLAogICAgICAgICAgICAgICJwdG14bW9kZT0wNjY2IiwKICAgICAgICAgICAgICAibW9kZT0wNjIwIiwKICAgICAgICAgICAgICAiZ2lkPTUiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L3NobSIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiL3J1bi9rYXRhLWNvbnRhaW5lcnMvc2FuZGJveC9zaG0iLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvbXF1ZXVlIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJtcXVldWUiLAogICAgICAgICAgICAidHlwZV8iOiAibXF1ZXVlIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAgICAgIm5vZGV2IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL3N5cyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAic3lzZnMiLAogICAgICAgICAgICAidHlwZV8iOiAic3lzZnMiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiLAogICAgICAgICAgICAgICJybyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9zeXMvZnMvY2dyb3VwIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJjZ3JvdXAiLAogICAgICAgICAgICAidHlwZV8iOiAiY2dyb3VwIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAgICAgIm5vZGV2IiwKICAgICAgICAgICAgICAicmVsYXRpbWUiLAogICAgICAgICAgICAgICJybyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9ldGMvaG9zdHMiLAogICAgICAgICAgICAic291cmNlIjogIiQoc2ZwcmVmaXgpaG9zdHMkIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJ3IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi90ZXJtaW5hdGlvbi1sb2ciLAogICAgICAgICAgICAic291cmNlIjogIiQoc2ZwcmVmaXgpdGVybWluYXRpb24tbG9nJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJydyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9ldGMvaG9zdG5hbWUiLAogICAgICAgICAgICAic291cmNlIjogIiQoc2ZwcmVmaXgpaG9zdG5hbWUkIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJ3IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2V0Yy9yZXNvbHYuY29uZiIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClyZXNvbHYuY29uZiQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicnciCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvdmFyL3J1bi9zZWNyZXRzL2t1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQiLAogICAgICAgICAgICAic291cmNlIjogIiQoc2ZwcmVmaXgpc2VydmljZWFjY291bnQkIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL3Zhci9ydW4vc2VjcmV0cy9henVyZS90b2tlbnMiLAogICAgICAgICAgICAic291cmNlIjogIiQoc2ZwcmVmaXgpdG9rZW5zJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJybyIKICAgICAgICAgICAgXQogICAgICAgICAgfQogICAgICAgIF0sCiAgICAgICAgIkFubm90YXRpb25zIjogewogICAgICAgICAgImlvLmthdGFjb250YWluZXJzLnBrZy5vY2kuYnVuZGxlX3BhdGgiOiAiL3J1bi9jb250YWluZXJkL2lvLmNvbnRhaW5lcmQucnVudGltZS52Mi50YXNrL2s4cy5pby8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgImlvLmthdGFjb250YWluZXJzLnBrZy5vY2kuY29udGFpbmVyX3R5cGUiOiAicG9kX2NvbnRhaW5lciIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLW5hbWUiOiAia3ViZXJuZXRlcy1zZXJ2ZS1ob3N0bmFtZSIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLXR5cGUiOiAiY29udGFpbmVyIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5pbWFnZS1uYW1lIjogInJlZ2lzdHJ5Lms4cy5pby9zZXJ2ZV9ob3N0bmFtZTpsYXRlc3QiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtaWQiOiAiXlthLXowLTldezY0fSQiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZSI6ICJedmFsaWRcXC1wb2QkIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LW5hbWVzcGFjZSI6ICIiCiAgICAgICAgfSwKICAgICAgICAiTGludXgiOiB7CiAgICAgICAgICAiTmFtZXNwYWNlcyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICJUeXBlIjogImlwYyIsCiAgICAgICAgICAgICAgIlBhdGgiOiAiIgogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgIlR5cGUiOiAidXRzIiwKICAgICAgICAgICAgICAiUGF0aCI6ICIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiVHlwZSI6ICJtb3VudCIsCiAgICAgICAgICAgICAgIlBhdGgiOiAiIgogICAgICAgICAgICB9CiAgICAgICAgICBdLAogICAgICAgICAgIk1hc2tlZFBhdGhzIjogWwogICAgICAgICAgICAiL3Byb2MvYWNwaSIsCiAgICAgICAgICAgICIvcHJvYy9rY29yZSIsCiAgICAgICAgICAgICIvcHJvYy9rZXlzIiwKICAgICAgICAgICAgIi9wcm9jL2xhdGVuY3lfc3RhdHMiLAogICAgICAgICAgICAiL3Byb2MvdGltZXJfbGlzdCIsCiAgICAgICAgICAgICIvcHJvYy90aW1lcl9zdGF0cyIsCiAgICAgICAgICAgICIvcHJvYy9zY2hlZF9kZWJ1ZyIsCiAgICAgICAgICAgICIvcHJvYy9zY3NpIiwKICAgICAgICAgICAgIi9zeXMvZmlybXdhcmUiCiAgICAgICAgICBdLAogICAgICAgICAgIlJlYWRvbmx5UGF0aHMiOiBbCiAgICAgICAgICAgICIvcHJvYy9hc291bmQiLAogICAgICAgICAgICAiL3Byb2MvYnVzIiwKICAgICAgICAgICAgIi9wcm9jL2ZzIiwKICAgICAgICAgICAgIi9wcm9jL2lycSIsCiAgICAgICAgICAgICIvcHJvYy9zeXMiLAogICAgICAgICAgICAiL3Byb2Mvc3lzcnEtdHJpZ2dlciIKICAgICAgICAgIF0sCiAgICAgICAgICAiRGV2aWNlcyI6IFtdLAogICAgICAgICAgIlN5c2N0bCI6IHsKICAgICAgICAgICAgIm5ldC5pcHY0LmlwX3VucHJpdmlsZWdlZF9wb3J0X3N0YXJ0IjogIjAiLAogICAgICAgICAgICAibmV0LmlwdjQucGluZ19ncm91cF9yYW5nZSI6ICIwIDIxNDc0ODM2NDciCiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9LAogICAgICAic3RvcmFnZXMiOiBbCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJibGsiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogInRhciIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIiQoaGFzaDApIgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGxheWVyMCkiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJibGsiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogInRhciIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIiQoaGFzaDEpIgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGxheWVyMSkiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJibGsiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogInRhciIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIiQoaGFzaDIpIgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGxheWVyMikiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJibGsiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogInRhciIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIiQoaGFzaDMpIgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGxheWVyMykiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJibGsiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogInRhciIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIiQoaGFzaDQpIgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGxheWVyNCkiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJibGsiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogInRhciIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIiQoaGFzaDUpIgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGxheWVyNSkiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJvdmVybGF5ZnMiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogImZ1c2UzLmthdGEtb3ZlcmxheSIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIjZkMzg1NjJiMWIxNTEwMzIzZjlhMmM1MTNmODA1M2Q0Nzk4OGE2OTBjMWE3MzdiYzc0ZDRjYWIxYWI1ZjcxZGU6YjllYzMxNzE1YjQ5NDYxNTk1ODYyZjA3YmUxZmJhODA3NWM0ZjFjOGM3MmIwMjczMWNjZGFhMjhlODhjNDgyZTpiNWFkMDk2MjAzZjlhOWQ3NmZkYTkzNDIyNjg3NWE4YjMwNGYxMDA1NjYzOGY3MzRkMTE2MzVhYzczZmE0OTA0OmEzNWQ5YjgzZTkwNDA5NTIzODhkZTEyMWQ4YzIzZGVlYjNlZDkyZWJkNjE0MGVmNGUzZjA4NzkyMDVkMGMxNDI6ODYyZGI5ZjAzNjdhMDNmNjVmM2Q0ODJiYzE2YzI2OWY4YzkzNmU5NTFiZmNlNmFiZGRiYjRhMDMzMmM2NGNhNzo2NTI4NThlMGI2ZDI5YTgwYjlhNGRlNmIxNWI3MjRkZDkxZTc0MTMzZGY2ZjM2NjE1MDBkNzFjOTI5YmFmNmVkIiwKICAgICAgICAgICAgIjY3NDUwMDgyYWI1NmRhMWFlY2M1ZWFlMmYxOGQ5ODBjZDllNzMwNmU3OTMzNGExYTgyNmE5MWNmZDkwMTE0YTg6Njc0NTAwODJhYjU2ZGExYWVjYzVlYWUyZjE4ZDk4MGNkOWU3MzA2ZTc5MzM0YTFhODI2YTkxY2ZkOTAxMTRhODoxMmVkMzU4MWFiNjlmM2Y1MjU1Njg1YWM0OTUzMDg4N2E1NGQ4MjkxZDFlYTZlZDZiZTQ0ZjQxMzhhMzdmODBlOmRlMWI1YThkMjgxYjI0YjQyNGRhYzBjNzg1ODYxMzgwYTlkM2E4NjMyZjkwMTI1YjgyNWU1NmUxY2FmMTJhNTk6Njc0NTAwODJhYjU2ZGExYWVjYzVlYWUyZjE4ZDk4MGNkOWU3MzA2ZTc5MzM0YTFhODI2YTkxY2ZkOTAxMTRhODo2NzQ1MDA4MmFiNTZkYTFhZWNjNWVhZTJmMThkOTgwY2Q5ZTczMDZlNzkzMzRhMWE4MjZhOTFjZmQ5MDExNGE4IgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGNwYXRoKS8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0KICAgICAgXSwKICAgICAgImRldmljZXMiOiBbXSwKICAgICAgInNhbmRib3hfcGlkbnMiOiBmYWxzZSwKICAgICAgImV4ZWNfY29tbWFuZHMiOiBbXSwKICAgICAgImVudl9tYXAiOiB7CiAgICAgICAgIkhPTUUiOiAiLyIsCiAgICAgICAgIkhPU1ROQU1FIjogIiQoaG9zdC1uYW1lKSIsCiAgICAgICAgIlBBVEgiOiAiL3Vzci9sb2NhbC9zYmluOi91c3IvbG9jYWwvYmluOi91c3Ivc2JpbjovdXNyL2Jpbjovc2JpbjovYmluIgogICAgICB9CiAgICB9CiAgXSwKICAiY29tbW9uIjogewogICAgImNwYXRoIjogIi9ydW4va2F0YS1jb250YWluZXJzL3NoYXJlZC9jb250YWluZXJzIiwKICAgICJtb3VudF9zb3VyY2VfY3BhdGgiOiAiL3J1bi9rYXRhLWNvbnRhaW5lcnMvc2hhcmVkL2NvbnRhaW5lcnMiLAogICAgInNmcHJlZml4IjogIl4kKGNwYXRoKS8kKGJ1bmRsZS1pZCktW2EtejAtOV17MTZ9LSIsCiAgICAic3BhdGgiOiAiL3J1bi9rYXRhLWNvbnRhaW5lcnMvc2FuZGJveC9zdG9yYWdlIiwKICAgICJpcHY0X2EiOiAiKChbMC05XXxbMS05XVswLTldfDFbMC05XXsyfXwyWzAtNF1bMC05XXwyNVswLTVdKVxcLil7M30oWzAtOV18WzEtOV1bMC05XXwxWzAtOV17Mn18MlswLTRdWzAtOV18MjVbMC01XSkiLAogICAgImlwX3AiOiAiWzAtOV17MSw1fSIsCiAgICAic3ZjX25hbWUiOiAiW0EtWl9cXC5cXC1dKyIsCiAgICAiZG5zX2xhYmVsIjogIlthLXpBLVowLTlfXFwuXFwtXSsiLAogICAgInNfc291cmNlMSI6ICJeLi4yWzAtOV17M31fWzAtMV1bMC05XV9bMC0zXVswLTldX1swLTJdWzAtOV1fWzAtNV1bMC05XV9bMC01XVswLTldXFwuWzAtOV17MSwxMH0kIiwKICAgICJzX3NvdXJjZTIiOiAiXi4uZGF0YS8iLAogICAgImRuc19zdWJkb21haW4iOiAiXlthLXowLTldKFstYS16MC05XSpbYS16MC05XSk/JCIsCiAgICAicG9kX3VpZCI6ICJeWzAtOWEtZkEtRl17OH0tWzAtOWEtZkEtRl17NH0tWzAtOWEtZkEtRl17NH0tWzAtOWEtZkEtRl17NH0tWzAtOWEtZkEtRl17MTJ9JCIsCiAgICAiZGVmYXVsdF9jYXBzIjogWwogICAgICAiQ0FQX0NIT1dOIiwKICAgICAgIkNBUF9EQUNfT1ZFUlJJREUiLAogICAgICAiQ0FQX0ZTRVRJRCIsCiAgICAgICJDQVBfRk9XTkVSIiwKICAgICAgIkNBUF9NS05PRCIsCiAgICAgICJDQVBfTkVUX1JBVyIsCiAgICAgICJDQVBfU0VUR0lEIiwKICAgICAgIkNBUF9TRVRVSUQiLAogICAgICAiQ0FQX1NFVEZDQVAiLAogICAgICAiQ0FQX1NFVFBDQVAiLAogICAgICAiQ0FQX05FVF9CSU5EX1NFUlZJQ0UiLAogICAgICAiQ0FQX1NZU19DSFJPT1QiLAogICAgICAiQ0FQX0tJTEwiLAogICAgICAiQ0FQX0FVRElUX1dSSVRFIgogICAgXSwKICAgICJwcml2aWxlZ2VkX2NhcHMiOiBbCiAgICAgICJDQVBfQ0hPV04iLAogICAgICAiQ0FQX0RBQ19PVkVSUklERSIsCiAgICAgICJDQVBfREFDX1JFQURfU0VBUkNIIiwKICAgICAgIkNBUF9GT1dORVIiLAogICAgICAiQ0FQX0ZTRVRJRCIsCiAgICAgICJDQVBfS0lMTCIsCiAgICAgICJDQVBfU0VUR0lEIiwKICAgICAgIkNBUF9TRVRVSUQiLAogICAgICAiQ0FQX1NFVFBDQVAiLAogICAgICAiQ0FQX0xJTlVYX0lNTVVUQUJMRSIsCiAgICAgICJDQVBfTkVUX0JJTkRfU0VSVklDRSIsCiAgICAgICJDQVBfTkVUX0JST0FEQ0FTVCIsCiAgICAgICJDQVBfTkVUX0FETUlOIiwKICAgICAgIkNBUF9ORVRfUkFXIiwKICAgICAgIkNBUF9JUENfTE9DSyIsCiAgICAgICJDQVBfSVBDX09XTkVSIiwKICAgICAgIkNBUF9TWVNfTU9EVUxFIiwKICAgICAgIkNBUF9TWVNfUkFXSU8iLAogICAgICAiQ0FQX1NZU19DSFJPT1QiLAogICAgICAiQ0FQX1NZU19QVFJBQ0UiLAogICAgICAiQ0FQX1NZU19QQUNDVCIsCiAgICAgICJDQVBfU1lTX0FETUlOIiwKICAgICAgIkNBUF9TWVNfQk9PVCIsCiAgICAgICJDQVBfU1lTX05JQ0UiLAogICAgICAiQ0FQX1NZU19SRVNPVVJDRSIsCiAgICAgICJDQVBfU1lTX1RJTUUiLAogICAgICAiQ0FQX1NZU19UVFlfQ09ORklHIiwKICAgICAgIkNBUF9NS05PRCIsCiAgICAgICJDQVBfTEVBU0UiLAogICAgICAiQ0FQX0FVRElUX1dSSVRFIiwKICAgICAgIkNBUF9BVURJVF9DT05UUk9MIiwKICAgICAgIkNBUF9TRVRGQ0FQIiwKICAgICAgIkNBUF9NQUNfT1ZFUlJJREUiLAogICAgICAiQ0FQX01BQ19BRE1JTiIsCiAgICAgICJDQVBfU1lTTE9HIiwKICAgICAgIkNBUF9XQUtFX0FMQVJNIiwKICAgICAgIkNBUF9CTE9DS19TVVNQRU5EIiwKICAgICAgIkNBUF9BVURJVF9SRUFEIiwKICAgICAgIkNBUF9QRVJGTU9OIiwKICAgICAgIkNBUF9CUEYiLAogICAgICAiQ0FQX0NIRUNLUE9JTlRfUkVTVE9SRSIKICAgIF0sCiAgICAidmlydGlvX2Jsa19zdG9yYWdlX2NsYXNzZXMiOiBbCiAgICAgICJjYy1sb2NhbC1jc2kiLAogICAgICAiY2MtbWFuYWdlZC1jc2kiLAogICAgICAiY2MtbWFuYWdlZC1wcmVtaXVtLWNzaSIKICAgIF0sCiAgICAic21iX3N0b3JhZ2VfY2xhc3NlcyI6IFsKICAgICAgewogICAgICAgICJuYW1lIjogImF6dXJlZmlsZS1jc2kta2F0YS1jYyIsCiAgICAgICAgIm1vdW50X29wdGlvbnMiOiBbCiAgICAgICAgICAiZGlyX21vZGU9MDc3NyIsCiAgICAgICAgICAiZmlsZV9tb2RlPTA3NzciLAogICAgICAgICAgIm1mc3ltbGlua3MiLAogICAgICAgICAgImNhY2hlPXN0cmljdCIsCiAgICAgICAgICAibm9zaGFyZXNvY2siLAogICAgICAgICAgImFjdGltZW89MzAiLAogICAgICAgICAgIm5vYnJsIgogICAgICAgIF0KICAgICAgfQogICAgXQogIH0sCiAgInNhbmRib3giOiB7CiAgICAic3RvcmFnZXMiOiBbCiAgICAgIHsKICAgICAgICAiZHJpdmVyIjogImVwaGVtZXJhbCIsCiAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgInNvdXJjZSI6ICJzaG0iLAogICAgICAgICJmc3R5cGUiOiAidG1wZnMiLAogICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICJub2RldiIsCiAgICAgICAgICAibW9kZT0xNzc3IiwKICAgICAgICAgICJzaXplPTY3MTA4ODY0IgogICAgICAgIF0sCiAgICAgICAgIm1vdW50X3BvaW50IjogIi9ydW4va2F0YS1jb250YWluZXJzL3NhbmRib3gvc2htIiwKICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgIH0KICAgIF0KICB9LAogICJyZXF1ZXN0X2RlZmF1bHRzIjogewogICAgIkNyZWF0ZUNvbnRhaW5lclJlcXVlc3QiOiB7CiAgICAgICJhbGxvd19lbnZfcmVnZXgiOiBbCiAgICAgICAgIl5IT1NUTkFNRT0kKGRuc19sYWJlbCkkIiwKICAgICAgICAiXiQoc3ZjX25hbWUpX1BPUlRfJChpcF9wKV9UQ1A9dGNwOi8vJChpcHY0X2EpOiQoaXBfcCkkIiwKICAgICAgICAiXiQoc3ZjX25hbWUpX1BPUlRfJChpcF9wKV9UQ1BfUFJPVE89dGNwJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9QT1JUXyQoaXBfcClfVENQX1BPUlQ9JChpcF9wKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfUE9SVF8kKGlwX3ApX1RDUF9BRERSPSQoaXB2NF9hKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfU0VSVklDRV9IT1NUPSQoaXB2NF9hKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfU0VSVklDRV9QT1JUPSQoaXBfcCkkIiwKICAgICAgICAiXiQoc3ZjX25hbWUpX1NFUlZJQ0VfUE9SVF8kKGRuc19sYWJlbCk9JChpcF9wKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfUE9SVD10Y3A6Ly8kKGlwdjRfYSk6JChpcF9wKSQiLAogICAgICAgICJeQVpVUkVfQ0xJRU5UX0lEPVtBLUZhLWYwLTktXSokIiwKICAgICAgICAiXkFaVVJFX1RFTkFOVF9JRD1bQS1GYS1mMC05LV0qJCIsCiAgICAgICAgIl5BWlVSRV9GRURFUkFURURfVE9LRU5fRklMRT0vdmFyL3J1bi9zZWNyZXRzL2F6dXJlL3Rva2Vucy9henVyZS1pZGVudGl0eS10b2tlbiQiLAogICAgICAgICJeQVpVUkVfQVVUSE9SSVRZX0hPU1Q9aHR0cHM6Ly9sb2dpblxcLm1pY3Jvc29mdG9ubGluZVxcLmNvbS8kIiwKICAgICAgICAiXlRFUk09eHRlcm0kIgogICAgICBdLAogICAgICAiYWxsb3dfZW52X3JlZ2V4X21hcCI6IHsKICAgICAgICAiQ1BVX0xJTUlUIjogIl5bMC05XSskIiwKICAgICAgICAiSk9CX0NPTVBMRVRJT05fSU5ERVgiOiAiXlswLTldKiQiLAogICAgICAgICJNRU1PUllfTElNSVQiOiAiXlswLTldKyQiCiAgICAgIH0KICAgIH0sCiAgICAiQ29weUZpbGVSZXF1ZXN0IjogWwogICAgICAiJChzZnByZWZpeCkiCiAgICBdLAogICAgIkV4ZWNQcm9jZXNzUmVxdWVzdCI6IHsKICAgICAgImFsbG93ZWRfY29tbWFuZHMiOiBbXSwKICAgICAgInJlZ2V4IjogW10KICAgIH0sCiAgICAiVXBkYXRlUm91dGVzUmVxdWVzdCI6IHsKICAgICAgImZvcmJpZGRlbl9kZXZpY2VfbmFtZXMiOiBbCiAgICAgICAgImxvIgogICAgICBdLAogICAgICAiZm9yYmlkZGVuX3NvdXJjZV9yZWdleCI6IFsKICAgICAgICAiXig/OjB7MCw0fTopezAsN30wezAsM30xJCIsCiAgICAgICAgIl4xMjdcXC4oPzpbMC05XXsxLDN9XFwuKXsyfVswLTldezEsM30kIgogICAgICBdCiAgICB9LAogICAgIlVwZGF0ZUludGVyZmFjZVJlcXVlc3QiOiB7CiAgICAgICJhbGxvd19yYXdfZmxhZ3MiOiAxMjgsCiAgICAgICJmb3JiaWRkZW5fbmFtZXMiOiBbCiAgICAgICAgImxvIgogICAgICBdLAogICAgICAiZm9yYmlkZGVuX2h3X2FkZHJzIjogWwogICAgICAgICIwMDowMDowMDowMDowMDowMCIKICAgICAgXQogICAgfSwKICAgICJDbG9zZVN0ZGluUmVxdWVzdCI6IGZhbHNlLAogICAgIlJlYWRTdHJlYW1SZXF1ZXN0IjogZmFsc2UsCiAgICAiVXBkYXRlRXBoZW1lcmFsTW91bnRzUmVxdWVzdCI6IGZhbHNlLAogICAgIldyaXRlU3RyZWFtUmVxdWVzdCI6IGZhbHNlCiAgfQp9 +spec: + runtimeClassName: kata-cc + containers: + - name: kubernetes-serve-hostname + image: registry.k8s.io/serve_hostname + resources: + limits: + cpu: "1" + memory: 512Mi diff --git a/src/agent/samples/policy/yaml/kubernetes/incomplete-init/cassandra-statefulset.yaml b/src/agent/samples/policy/yaml/kubernetes/incomplete-init/cassandra-statefulset.yaml new file mode 100644 index 000000000000..3eb59c5014d9 --- /dev/null +++ b/src/agent/samples/policy/yaml/kubernetes/incomplete-init/cassandra-statefulset.yaml @@ -0,0 +1,88 @@ +--- +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: cassandra +spec: + serviceName: cassandra + replicas: 3 + selector: + matchLabels: + app: cassandra + template: + metadata: + labels: + app: cassandra + annotations: + io.katacontainers.config.agent.policy: IyBDb3B5cmlnaHQgKGMpIDIwMjMgTWljcm9zb2Z0IENvcnBvcmF0aW9uCiMKIyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMAojCnBhY2thZ2UgYWdlbnRfcG9saWN5CgppbXBvcnQgZnV0dXJlLmtleXdvcmRzLmluCmltcG9ydCBmdXR1cmUua2V5d29yZHMuZXZlcnkKCiMgRGVmYXVsdCB2YWx1ZXMsIHJldHVybmVkIGJ5IE9QQSB3aGVuIHJ1bGVzIGNhbm5vdCBiZSBldmFsdWF0ZWQgdG8gdHJ1ZS4KZGVmYXVsdCBBZGRBUlBOZWlnaGJvcnNSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgQWRkU3dhcFJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBDbG9zZVN0ZGluUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IENvcHlGaWxlUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IENyZWF0ZUNvbnRhaW5lclJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBDcmVhdGVTYW5kYm94UmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IERlc3Ryb3lTYW5kYm94UmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgRXhlY1Byb2Nlc3NSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgR2V0T09NRXZlbnRSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBHdWVzdERldGFpbHNSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBMaXN0SW50ZXJmYWNlc1JlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBMaXN0Um91dGVzUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IE1lbUhvdHBsdWdCeVByb2JlUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IE9ubGluZUNQVU1lbVJlcXVlc3QgOj0gdHJ1ZQpkZWZhdWx0IFBhdXNlQ29udGFpbmVyUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFJlYWRTdHJlYW1SZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgUmVtb3ZlQ29udGFpbmVyUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgUmVtb3ZlU3RhbGVWaXJ0aW9mc1NoYXJlTW91bnRzUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgUmVzZWVkUmFuZG9tRGV2UmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFJlc3VtZUNvbnRhaW5lclJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBTZXRHdWVzdERhdGVUaW1lUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFNldFBvbGljeVJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBTaWduYWxQcm9jZXNzUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgU3RhcnRDb250YWluZXJSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBTdGFydFRyYWNpbmdSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgU3RhdHNDb250YWluZXJSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBTdG9wVHJhY2luZ1JlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBUdHlXaW5SZXNpemVSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBVcGRhdGVDb250YWluZXJSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgVXBkYXRlRXBoZW1lcmFsTW91bnRzUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFVwZGF0ZUludGVyZmFjZVJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBVcGRhdGVSb3V0ZXNSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgV2FpdFByb2Nlc3NSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBXcml0ZVN0cmVhbVJlcXVlc3QgOj0gZmFsc2UKCiMgQWxsb3dSZXF1ZXN0c0ZhaWxpbmdQb2xpY3kgOj0gdHJ1ZSBjb25maWd1cmVzIHRoZSBBZ2VudCB0byAqYWxsb3cgYW55CiMgcmVxdWVzdHMgY2F1c2luZyBhIHBvbGljeSBmYWlsdXJlKi4gVGhpcyBpcyBhbiB1bnNlY3VyZSBjb25maWd1cmF0aW9uCiMgYnV0IGlzIHVzZWZ1bCBmb3IgYWxsb3dpbmcgdW5zZWN1cmUgcG9kcyB0byBzdGFydCwgdGhlbiBjb25uZWN0IHRvCiMgdGhlbSBhbmQgaW5zcGVjdCBPUEEgbG9ncyBmb3IgdGhlIHJvb3QgY2F1c2Ugb2YgYSBmYWlsdXJlLgpkZWZhdWx0IEFsbG93UmVxdWVzdHNGYWlsaW5nUG9saWN5IDo9IGZhbHNlCgojIENvbnN0YW50cwpTX05BTUVfS0VZID0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZSIKU19OQU1FU1BBQ0VfS0VZID0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZXNwYWNlIgpCVU5ETEVfSUQgPSAiW2EtejAtOV17NjR9IgoKQ3JlYXRlQ29udGFpbmVyUmVxdWVzdDo9IHJlc3AgewogICAgbm90IGlzX251bGwoaW5wdXQuZW52X21hcCkKICAgIAogICAgaV9lbnZfbWFwIDo9IGlucHV0LmVudl9tYXAKICAgIAogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBwX2Vudl9tYXAgOj0gcF9jb250YWluZXIuZW52X21hcCAgCiAgICBhbGxvd19lbnZfbWFwKHBfZW52X21hcCwgaV9lbnZfbWFwKQogICAgCiAgICBpX3Byb2Nlc3MgOj0gaW5wdXQuYmFzZS5PQ0kuUHJvY2VzcwogICAgCiAgICBwX3Byb2Nlc3MgOj0gcF9jb250YWluZXIuT0NJLlByb2Nlc3MKICAgIAogICAgYWxsb3dfYXJncyhpX3Byb2Nlc3MsIHBfcHJvY2VzcywgaV9lbnZfbWFwKQoKICAgIHJlc3AgPSBDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uKGlucHV0LmJhc2UpCiAgICBwcmludCgiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdDogdHJ1ZSIpCn0KCmFsbG93X2FyZ3MoaV9wcm9jZXNzLCBwX3Byb2Nlc3MsIGlfZW52X21hcCkgewogICAgaV9hcmdzIDo9IGlfcHJvY2Vzcy5BcmdzCiAgICBwX2FyZ3MgOj0gcF9wcm9jZXNzLkFyZ3MKICAgIHByaW50KCJhbGxvd19hcmdzOiBpX2FyZ3MgPSIsIGlfYXJncywgInBfYXJncyA9IiwgcF9hcmdzKQogICAgY291bnQoaV9hcmdzKSA9PSBjb3VudChwX2FyZ3MpCiAgICBldmVyeSBpLCBpX2FyZyBpbiBpX2FyZ3MgewogICAgICAgIHByaW50KCJhbGxvd19hcmdzOiBpX2FyZyA9IiwgaV9hcmcpCiAgICAgICAgcF9hcmdfcmVwbGFjZWQgOj0gcmVwbGFjZV9lbnZfdmFyaWFibGVzKHBfYXJnc1tpXSwgaV9lbnZfbWFwKQogICAgICAgIHByaW50KCJhbGxvd19hcmdzOiBwX2FyZ19yZXBsYWNlZCA9IiwgcF9hcmdfcmVwbGFjZWQpCiAgICAgICAgcF9hcmdfcmVwbGFjZWQyIDo9IHJlcGxhY2UocF9hcmdfcmVwbGFjZWQsICIkJCIsICIkIikKICAgICAgICBwcmludCgiYWxsb3dfYXJnczogcF9hcmdfcmVwbGFjZWQyID0iLCBwX2FyZ19yZXBsYWNlZDIpCiAgICAgICAgaV9hcmcgPT0gcF9hcmdfcmVwbGFjZWQyCiAgICB9CiAgICBwcmludCgiYWxsb3dfYXJnczogdHJ1ZSIpCn0KCmFsbG93X2FyZ3MoaV9wcm9jZXNzLCBwX3Byb2Nlc3MsIGlfZW52X21hcCkgewogICAgbm90IGlfcHJvY2Vzcy5BcmdzCiAgICBub3QgcF9wcm9jZXNzLkFyZ3MKICAgIHByaW50KCJhbGxvd19hcmdzMjogbm8gYXJncyIpCn0KCiMgdGhpcyBmdW5jdGlvbiByZXBsYWNlcyBhbGwgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyBpbiBhIHN0cmluZywgZ2l2ZW4gYSBtYXAgb2YgZW52aXJvbm1lbnQga2V5cyB0byBlbnZpcm9ubWVudCB2YWx1ZXMKIyBlZyBzdHIgPSAiZWNobyAkKENMVVNURVJfSUQpOyBlY2hvICQoTk9ERV9OQU1FKTsiCiMgZW52X21hcCA9IHsiQ0xVU1RFUl9JRCI6ICJhYmMiLCAiTk9ERV9OQU1FIiA6ICJ4eXoifQojIHJlc3VsdCA9ICJlY2hvIGFiYzsgZWNobyB4eXo7IgpyZXBsYWNlX2Vudl92YXJpYWJsZXMoc3RyLCBlbnZfbWFwKSA9IHJlc3VsdCB7CiAgICAjIG1ha2UgYW4gYXJyYXkgb2YgdGhlIGtleXMgZWcgWyJDTFVTVEVSX0lEIiwgIk5PREVfTkFNRSJdCiAgICBrZXlzIDo9IFt4IHwgc29tZSB4IGluIG9iamVjdC5rZXlzKGVudl9tYXApXQogICAgcmVzdWx0IDo9IHJlcGxhY2Vfc3RyX3JlYyhzdHIsIGVudl9tYXAsIGtleXMsIGNvdW50KGtleXMpIC0gMSkKfQoKIyBiYXNlIGNhc2UKcmVwbGFjZV9zdHJfcmVjKHN0ciwgZW52X21hcCwgYXJyX2tleXMsIGkpID0gcmVzdWx0IHsKICAgIGkgPCAwCiAgICByZXN1bHQgOj0gc3RyCn0KCiMgcmVjdXJzaXZlIHN0ZXAKcmVwbGFjZV9zdHJfcmVjKHN0ciwgZW52X21hcCwgYXJyX2tleXMsIGkpID0gcmVzdWx0IHsKICAgIGkgPj0gMAogICAga2V5IDo9IGFycl9rZXlzW2ldCiAgICBlbnZfa2V5MSA6PSBjb25jYXQoIiIsIFsiJCgiLCBrZXksICIpIl0pCiAgICAjIHJlcGxhY2UgJChWQVIpIHdpdGggdmFsdWUKICAgIG5ld19zdHIxIDo9IHJlcGxhY2Uoc3RyLCBlbnZfa2V5MSwgZW52X21hcFtrZXldKQogICAgIyByZXBsYWNlIG5leHQgZW52aXJvbm1lbnQgdmFyaWFibGUKICAgIHJlc3VsdCA9IHJlcGxhY2Vfc3RyX3JlYyhuZXdfc3RyMSwgZW52X21hcCwgYXJyX2tleXMsIGkgLSAxKQp9CgphbGxvd19lbnZfbWFwKHBfZW52X21hcCwgaV9lbnZfbWFwKSB7CiAgICBwcmludCgiYWxsb3dfZW52X21hcDogcF9lbnZfbWFwID0iLCBwX2Vudl9tYXApCiAgICBldmVyeSBlbnZfa2V5LCBlbnZfdmFsIGluIGlfZW52X21hcCB7CiAgICAgICAgcHJpbnQoImFsbG93X2VudjogZW52X2tleSA9IiwgZW52X2tleSwgImVudl92YWwgPSIsIGVudl92YWwpCiAgICAgICAgYWxsb3dfZW52X21hcF9lbnRyeShlbnZfa2V5LCBlbnZfdmFsLCBwX2Vudl9tYXApCiAgICB9CiAgICBwcmludCgiYWxsb3dfZW52X21hcDogdHJ1ZSIpCn0KCiMgQWxsb3cgZXhhY3QgbWF0Y2gKYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBpX3ZhbCA9PSBwX3ZhbAogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnk6IHRydWUiKQp9CgojIEFsbG93IHJlc291cmNlRmllbGRSZWYgdmFsdWVzIChlLmcuLCAibGltaXRzLmNwdSIpLgphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgICMgYSB2YXJpYWJsZSB3ZSBzaG91bGQgYmUgdmFsaWRhdGluZyB1c2luZyBhIHJlZ2V4IGZyb20gc2V0dGluZ3MKICAgIHBfdmFsID09ICIkKHZhbGlkYXRlLWZyb20tc2V0dGluZ3MpIgogICAgcmVnZXhfdmFsIDo9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuQ3JlYXRlQ29udGFpbmVyUmVxdWVzdC5hbGxvd19lbnZfcmVnZXhfbWFwW2tleV0KICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4X3ZhbCwgaV92YWwpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSAyOiB0cnVlIikKfQoKIyBBbGxvdyBub2RlLW5hbWUKYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChub2RlLW5hbWUpIgogICAgcmVnZXgubWF0Y2gocG9saWN5X2RhdGEuY29tbW9uLmRuc19zdWJkb21haW4gLCBpX3ZhbCkKICAgIHByaW50KCJhbGxvd19lbnZfbWFwX2VudHJ5IDM6IHRydWUiKQp9CgojIEFsbG93IGhvc3QtbmFtZQphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgIHBfdmFsID09ICIkKGhvc3QtbmFtZSkiCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24uZG5zX2xhYmVsICwgaV92YWwpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSA0OiB0cnVlIikKfQoKIyBBbGxvdyBwb2QtdWlkCmFsbG93X2Vudl9tYXBfZW50cnkoa2V5LCBpX3ZhbCwgcF9lbnZfbWFwKSB7CiAgICBwX3ZhbCA6PSBwX2Vudl9tYXBba2V5XQogICAgcF92YWwgPT0gIiQocG9kLXVpZCkiCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24ucG9kX3VpZCAsIGlfdmFsKQogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgNTogdHJ1ZSIpCn0KCiMgQWxsb3cgZmllbGRSZWYgImZpZWxkUGF0aDogc3RhdHVzLnBvZElQIiB2YWx1ZXMuCmFsbG93X2Vudl9tYXBfZW50cnkoa2V5LCBpX3ZhbCwgcF9lbnZfbWFwKSB7CiAgICBpc19pcChpX3ZhbCkKCiAgICBwX3ZhbCA6PSBwX2Vudl9tYXBba2V5XQogICAgcF92YXIgOj0gY29uY2F0KCI9IiwgW2tleSwgcF92YWxdKQogICAgYWxsb3dfcG9kX2lwX3ZhcihrZXksIHBfdmFyKQogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgNjogdHJ1ZSIpCn0KCiMgQWxsb3cgZmllbGRSZWYgImZpZWxkUGF0aDogc3RhdHVzLmhvc3RJUCIgdmFsdWVzLgphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgaXNfaXAoaV92YWwpCgogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgIHBfdmFyIDo9IGNvbmNhdCgiPSIsIFtrZXksIHBfdmFsXSkKICAgIGFsbG93X2hvc3RfaXBfdmFyKGtleSwgcF92YXIpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSA3OiB0cnVlIikKfQoKIyBNYXRjaCBpbnB1dCB3aXRoIG9uZSBvZiB0aGUgcG9saWN5IHZhcmlhYmxlcywgYWZ0ZXIgc3Vic3RpdHV0aW5nICQoc2FuZGJveC1uYW1lKS4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChzYW5kYm94LW5hbWUpIgogICAgc19uYW1lIDo9IGlucHV0LmJhc2UuT0NJLkFubm90YXRpb25zW1NfTkFNRV9LRVldCiAgICBwX3ZhcjIgOj0gcmVwbGFjZShwX3ZhbCwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHBfdmFyMiA9PSBpX3ZhbAogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgODogdHJ1ZSIpCn0KCiMgTWF0Y2ggaW5wdXQgd2l0aCBvbmUgb2YgdGhlIHBvbGljeSB2YXJpYWJsZXMsIGFmdGVyIHN1YnN0aXR1dGluZyAkKHNhbmRib3gtbmFtZXNwYWNlKS4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChzYW5kYm94LW5hbWVzcGFjZSkiCiAgICBzX25hbWVzcGFjZSA6PSBpbnB1dC5iYXNlLk9DSS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwX3ZhcjIgOj0gcmVwbGFjZShwX3ZhbCwgIiQoc2FuZGJveC1uYW1lc3BhY2UpIiwgc19uYW1lc3BhY2UpCiAgICBwX3ZhcjIgPT0gaV92YWwKICAgIHByaW50KCJhbGxvd19lbnZfbWFwX2VudHJ5IDk6IHRydWUiKQp9CgojIEFsbG93IGlucHV0IGVudiB2YXJpYWJsZXMgdGhhdCBtYXRjaCB3aXRoIGEgcmVxdWVzdF9kZWZhdWx0cyByZWdleC4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHNvbWUgcF9yZWdleDEgaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5DcmVhdGVDb250YWluZXJSZXF1ZXN0LmFsbG93X2Vudl9yZWdleAogICAgcF9yZWdleDIgOj0gcmVwbGFjZShwX3JlZ2V4MSwgIiQoaXB2NF9hKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcHY0X2EpCiAgICBwX3JlZ2V4MyA6PSByZXBsYWNlKHBfcmVnZXgyLCAiJChpcF9wKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcF9wKQogICAgcF9yZWdleDQgOj0gcmVwbGFjZShwX3JlZ2V4MywgIiQoc3ZjX25hbWUpIiwgcG9saWN5X2RhdGEuY29tbW9uLnN2Y19uYW1lKQogICAgcF9yZWdleDUgOj0gcmVwbGFjZShwX3JlZ2V4NCwgIiQoZG5zX2xhYmVsKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5kbnNfbGFiZWwpCgogICAgcmVzdWx0IDo9IGNvbmNhdCgiPSIsIFtrZXksIGlfdmFsXSkKICAgIHJlZ2V4Lm1hdGNoKHBfcmVnZXg1LCByZXN1bHQpCgogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgMTA6IHRydWUiKQp9CgpDcmVhdGVDb250YWluZXJSZXF1ZXN0Oj0gcmVzcCB7CiAgICBub3QgaW5wdXQuZW52X21hcAogICAgaV9wcm9jZXNzID0gaW5wdXQuT0NJLlByb2Nlc3MKICAgIHNfbmFtZSA9IGlucHV0Lk9DSS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBwX3Byb2Nlc3MgPSBwX2NvbnRhaW5lci5PQ0kuUHJvY2VzcwogICAgYWxsb3dfZGVwcmVjYXRlZF9hcmdzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUpCiAgICByZXNwID0gQ3JlYXRlQ29udGFpbmVyUmVxdWVzdENvbW1vbihpbnB1dCkKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0MjogdHJ1ZSIpCn0KCkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb24ocmVxKTo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgICMgQ2hlY2sgaWYgdGhlIGlucHV0IHJlcXVlc3Qgc2hvdWxkIGJlIHJlamVjdGVkIGV2ZW4gYmVmb3JlIGNoZWNraW5nIHRoZQogICAgIyBwb2xpY3lfZGF0YS5jb250YWluZXJzIGluZm9ybWF0aW9uLgogICAgYWxsb3dfY3JlYXRlX2NvbnRhaW5lcl9pbnB1dChyZXEpCgogICAgaV9vY2kgOj0gcmVxLk9DSQogICAgaV9zdG9yYWdlcyA6PSByZXEuc3RvcmFnZXMKICAgIGlfZGV2aWNlcyA6PSByZXEuZGV2aWNlcwoKICAgICMgYXJyYXkgb2YgcG9zc2libGUgc3RhdGUgb3BlcmF0aW9ucwogICAgb3BzX2J1aWxkZXIgOj0gW10KCiAgICAjIGNoZWNrIHNhbmRib3ggbmFtZQogICAgc2FuZGJveF9uYW1lID0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FX0tFWV0KICAgIGFkZF9zYW5kYm94X25hbWVfdG9fc3RhdGUgOj0gc3RhdGVfYWxsb3dzKCJzYW5kYm94X25hbWUiLCBzYW5kYm94X25hbWUpCiAgICBvcHNfYnVpbGRlcjEgOj0gY29uY2F0X29wX2lmX25vdF9udWxsKG9wc19idWlsZGVyLCBhZGRfc2FuZGJveF9uYW1lX3RvX3N0YXRlKQoKICAgICMgQ2hlY2sgaWYgYW55IGVsZW1lbnQgZnJvbSB0aGUgcG9saWN5X2RhdGEuY29udGFpbmVycyBhcnJheSBhbGxvd3MgdGhlIGlucHV0IHJlcXVlc3QuCiAgICBzb21lIHBfY29udGFpbmVyIGluIHBvbGljeV9kYXRhLmNvbnRhaW5lcnMKICAgIHByaW50KCI9PT09PT09PSBDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiB0cnlpbmcgbmV4dCBwb2xpY3kgY29udGFpbmVyIikKCiAgICBwX3BpZG5zIDo9IHBfY29udGFpbmVyLnNhbmRib3hfcGlkbnMKICAgIGlfcGlkbnMgOj0gcmVxLnNhbmRib3hfcGlkbnMKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiBwX3BpZG5zID0iLCBwX3BpZG5zLCAiaV9waWRucyA9IiwgaV9waWRucykKICAgIHBfcGlkbnMgPT0gaV9waWRucwoKICAgIHBfb2NpIDo9IHBfY29udGFpbmVyLk9DSQoKICAgICMgY2hlY2sgbmFtZXNwYWNlCiAgICBwX25hbWVzcGFjZSA6PSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBpX25hbWVzcGFjZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwcmludCAoIkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb246IHBfbmFtZXNwYWNlID0iLCBwX25hbWVzcGFjZSwgImlfbmFtZXNwYWNlID0iLCBpX25hbWVzcGFjZSkKICAgIGFkZF9uYW1lc3BhY2VfdG9fc3RhdGUgOj0gYWxsb3dfbmFtZXNwYWNlKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkKICAgIG9wc19idWlsZGVyMiA6PSBjb25jYXRfb3BfaWZfbm90X251bGwob3BzX2J1aWxkZXIxLCBhZGRfbmFtZXNwYWNlX3RvX3N0YXRlKQoKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiBwIFZlcnNpb24gPSIsIHBfb2NpLlZlcnNpb24sICJpIFZlcnNpb24gPSIsIGlfb2NpLlZlcnNpb24pCiAgICBwX29jaS5WZXJzaW9uID09IGlfb2NpLlZlcnNpb24KCiAgICBwcmludCgiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdENvbW1vbjogcCBSZWFkb25seSA9IiwgcF9vY2kuUm9vdC5SZWFkb25seSwgImkgUmVhZG9ubHkgPSIsIGlfb2NpLlJvb3QuUmVhZG9ubHkpCiAgICBwX29jaS5Sb290LlJlYWRvbmx5ID09IGlfb2NpLlJvb3QuUmVhZG9ubHkKCiAgICBhbGxvd19hbm5vKHBfb2NpLCBpX29jaSkKCiAgICBwX3N0b3JhZ2VzIDo9IHBfY29udGFpbmVyLnN0b3JhZ2VzCiAgICBhbGxvd19ieV9hbm5vKHBfb2NpLCBpX29jaSwgcF9zdG9yYWdlcywgaV9zdG9yYWdlcykKCiAgICBwX2RldmljZXMgOj0gcF9jb250YWluZXIuZGV2aWNlcwogICAgYWxsb3dfZGV2aWNlcyhwX2RldmljZXMsIGlfZGV2aWNlcykKCiAgICByZXQgOj0gYWxsb3dfbGludXgob3BzX2J1aWxkZXIyLCBwX29jaSwgaV9vY2kpCiAgICByZXQuYWxsb3dlZAoKICAgIG9wcyA6PSByZXQub3BzCgogICAgcHJpbnQoIkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb246IHRydWUiKQp9CgphbGxvd19jcmVhdGVfY29udGFpbmVyX2lucHV0KHJlcSkgewogICAgcHJpbnQoImFsbG93X2NyZWF0ZV9jb250YWluZXJfaW5wdXQ6IGlucHV0ID0iLCByZXEpCgogICAgY291bnQocmVxLnNoYXJlZF9tb3VudHMpID09IDAKICAgIGlzX251bGwocmVxLnN0cmluZ191c2VyKQoKICAgIGlfb2NpIDo9IHJlcS5PQ0kKICAgIGlzX251bGwoaV9vY2kuSG9va3MpCiAgICBpc19udWxsKGlfb2NpLlNvbGFyaXMpCiAgICBpc19udWxsKGlfb2NpLldpbmRvd3MpCgogICAgaV9saW51eCA6PSBpX29jaS5MaW51eAogICAgY291bnQoaV9saW51eC5HSURNYXBwaW5ncykgPT0gMAogICAgY291bnQoaV9saW51eC5Nb3VudExhYmVsKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlJlc291cmNlcy5EZXZpY2VzKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlJvb3Rmc1Byb3BhZ2F0aW9uKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlVJRE1hcHBpbmdzKSA9PSAwCiAgICBpc19udWxsKGlfbGludXguSW50ZWxSZHQpCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLkJsb2NrSU8pCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLk5ldHdvcmspCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLlBpZHMpCiAgICBpc19udWxsKGlfbGludXguU2VjY29tcCkKCiAgICBpX3Byb2Nlc3MgOj0gaV9vY2kuUHJvY2VzcwogICAgY291bnQoaV9wcm9jZXNzLlNlbGludXhMYWJlbCkgPT0gMAogICAgY291bnQoaV9wcm9jZXNzLlVzZXIuVXNlcm5hbWUpID09IDAKCiAgICBwcmludCgiYWxsb3dfY3JlYXRlX2NvbnRhaW5lcl9pbnB1dDogdHJ1ZSIpCn0KCmFsbG93X25hbWVzcGFjZShwX25hbWVzcGFjZSwgaV9uYW1lc3BhY2UpID0gYWRkX25hbWVzcGFjZSB7CiAgICBwX25hbWVzcGFjZSA9PSBpX25hbWVzcGFjZQogICAgYWRkX25hbWVzcGFjZSA6PSBudWxsCiAgICBwcmludCgiYWxsb3dfbmFtZXNwYWNlIDE6IGlucHV0IG5hbWVzcGFjZSBtYXRjaGVzIHBvbGljeSBkYXRhIikKfQoKYWxsb3dfbmFtZXNwYWNlKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkgPSBhZGRfbmFtZXNwYWNlIHsKICAgIHBfbmFtZXNwYWNlID09ICIiCiAgICBwcmludCgiYWxsb3dfbmFtZXNwYWNlIDI6IG5vIG5hbWVzcGFjZSBmb3VuZCBvbiBwb2xpY3kgZGF0YSIpCiAgICBhZGRfbmFtZXNwYWNlIDo9IHN0YXRlX2FsbG93cygibmFtZXNwYWNlIiwgaV9uYW1lc3BhY2UpCn0KCiMgdmFsdWUgaGFzbid0IGJlZW4gc2VlbiBiZWZvcmUsIHNhdmUgaXQgdG8gc3RhdGUKc3RhdGVfYWxsb3dzKGtleSwgdmFsdWUpID0gYWN0aW9uIHsKICBzdGF0ZSA6PSBnZXRfc3RhdGUoKQogIHByaW50KCJzdGF0ZV9hbGxvd3MgMTogc3RhdGVba2V5XSA9Iiwgc3RhdGVba2V5XSwgInZhbHVlID0iLCB2YWx1ZSkKICBub3Qgc3RhdGVba2V5XQogIHByaW50KCJzdGF0ZV9hbGxvd3MgMTogc2F2aW5nIHRvIHN0YXRlIGtleSA9Iiwga2V5LCAidmFsdWUgPSIsIHZhbHVlKQogIHBhdGggOj0gZ2V0X3N0YXRlX3BhdGgoa2V5KSAKICBhY3Rpb24gOj0gewogICAgIm9wIjogImFkZCIsCiAgICAicGF0aCI6IHBhdGgsIAogICAgInZhbHVlIjogdmFsdWUsCiAgfQp9CgojIHZhbHVlIG1hdGNoZXMgd2hhdCdzIGluIHN0YXRlLCBhbGxvdyBpdApzdGF0ZV9hbGxvd3Moa2V5LCB2YWx1ZSkgPSBhY3Rpb24gewogIHByaW50KCJzdGF0ZV9hbGxvd3MgMjogc3RhcnQiKQogIHN0YXRlIDo9IGdldF9zdGF0ZSgpCiAgcHJpbnQoInN0YXRlX2FsbG93cyAyOiBzdGF0ZVtrZXldID0iLCBzdGF0ZVtrZXldLCAidmFsdWUgPSIsIHZhbHVlKQogIHZhbHVlID09IHN0YXRlW2tleV0KICBwcmludCgic3RhdGVfYWxsb3dzIDI6IGZvdW5kIGtleSA9Iiwga2V5LCAidmFsdWUgPSIsIHZhbHVlLCAiIGluIHN0YXRlIikKICBhY3Rpb24gOj0gbnVsbAp9CgojIGhlbHBlciBmdW5jdGlvbnMgdG8gaW50ZXJhY3Qgd2l0aCB0aGUgc3RhdGUKZ2V0X3N0YXRlKCkgPSBzdGF0ZSB7CiAgc3RhdGUgOj0gZGF0YVsicHN0YXRlIl0KfQoKZ2V0X3N0YXRlX3ZhbChrZXkpID0gdmFsdWUgewogICAgc3RhdGUgOj0gZ2V0X3N0YXRlKCkKICAgIHZhbHVlIDo9IHN0YXRlW2tleV0KfQoKZ2V0X3N0YXRlX3BhdGgoa2V5KSA9IHBhdGggewogICAgIyBwcmVwZW5kICIvcHN0YXRlLyIgdG8ga2V5CiAgICBwYXRoIDo9IGNvbmNhdCgiLyIsIFsiL3BzdGF0ZSIsIGtleV0pCn0KCiMgSGVscGVyIGZ1bmN0aW9ucyB0byBjb25kaXRpb25hbGx5IGNvbmNhdGVuYXRlIG9wIGlzIG5vdCBudWxsCmNvbmNhdF9vcF9pZl9ub3RfbnVsbChvcHMsIG9wKSA9IHJlc3VsdCB7CiAgICBvcCA9PSBudWxsCiAgICByZXN1bHQgOj0gb3BzCn0KCmNvbmNhdF9vcF9pZl9ub3RfbnVsbChvcHMsIG9wKSA9IHJlc3VsdCB7CiAgICBvcCAhPSBudWxsCiAgICByZXN1bHQgOj0gYXJyYXkuY29uY2F0KG9wcywgW29wXSkKfQoKIyBSZWplY3QgdW5leHBlY3RlZCBhbm5vdGF0aW9ucy4KYWxsb3dfYW5ubyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19hbm5vIDE6IHN0YXJ0IikKCiAgICBub3QgaV9vY2kuQW5ub3RhdGlvbnMKCiAgICBwcmludCgiYWxsb3dfYW5ubyAxOiB0cnVlIikKfQphbGxvd19hbm5vKHBfb2NpLCBpX29jaSkgewogICAgcHJpbnQoImFsbG93X2Fubm8gMjogcCBBbm5vdGF0aW9ucyA9IiwgcF9vY2kuQW5ub3RhdGlvbnMpCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiBpIEFubm90YXRpb25zID0iLCBpX29jaS5Bbm5vdGF0aW9ucykKCiAgICBpX2tleXMgOj0gb2JqZWN0LmtleXMoaV9vY2kuQW5ub3RhdGlvbnMpCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiBpIGtleXMgPSIsIGlfa2V5cykKCiAgICBldmVyeSBpX2tleSBpbiBpX2tleXMgewogICAgICAgIGFsbG93X2Fubm9fa2V5KGlfa2V5LCBwX29jaSkKICAgIH0KCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiB0cnVlIikKfQoKYWxsb3dfYW5ub19rZXkoaV9rZXksIHBfb2NpKSB7CiAgICBwcmludCgiYWxsb3dfYW5ub19rZXkgMTogaSBrZXkgPSIsIGlfa2V5KQoKICAgIHN0YXJ0c3dpdGgoaV9rZXksICJpby5rdWJlcm5ldGVzLmNyaS4iKQoKICAgIHByaW50KCJhbGxvd19hbm5vX2tleSAxOiB0cnVlIikKfQphbGxvd19hbm5vX2tleShpX2tleSwgcF9vY2kpIHsKICAgIHByaW50KCJhbGxvd19hbm5vX2tleSAyOiBpIGtleSA9IiwgaV9rZXkpCgogICAgc29tZSBwX2tleSwgXyBpbiBwX29jaS5Bbm5vdGF0aW9ucwogICAgcF9rZXkgPT0gaV9rZXkKCiAgICBwcmludCgiYWxsb3dfYW5ub19rZXkgMjogdHJ1ZSIpCn0KCiMgR2V0IHRoZSB2YWx1ZSBvZiB0aGUgU19OQU1FX0tFWSBhbm5vdGF0aW9uIGFuZAojIGNvcnJlbGF0ZSBpdCB3aXRoIG90aGVyIGFubm90YXRpb25zIGFuZCBwcm9jZXNzIGZpZWxkcy4KYWxsb3dfYnlfYW5ubyhwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpIHsKICAgIHByaW50KCJhbGxvd19ieV9hbm5vIDE6IHN0YXJ0IikKCiAgICBub3QgcF9vY2kuQW5ub3RhdGlvbnNbU19OQU1FX0tFWV0KCiAgICBpX3NfbmFtZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMTogaV9zX25hbWUgPSIsIGlfc19uYW1lKQoKICAgIGlfc19uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FU1BBQ0VfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMTogaV9zX25hbWVzcGFjZSA9IiwgaV9zX25hbWVzcGFjZSkKCiAgICBhbGxvd19ieV9zYW5kYm94X25hbWUocF9vY2ksIGlfb2NpLCBwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBpX3NfbmFtZSwgaV9zX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfYnlfYW5ubyAxOiB0cnVlIikKfQphbGxvd19ieV9hbm5vKHBfb2NpLCBpX29jaSwgcF9zdG9yYWdlcywgaV9zdG9yYWdlcykgewogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMjogc3RhcnQiKQoKICAgIHBfc19uYW1lIDo9IHBfb2NpLkFubm90YXRpb25zW1NfTkFNRV9LRVldCiAgICBpX3NfbmFtZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMjogaV9zX25hbWUgPSIsIGlfc19uYW1lLCAicF9zX25hbWUgPSIsIHBfc19uYW1lKQoKICAgIGFsbG93X3NhbmRib3hfbmFtZShwX3NfbmFtZSwgaV9zX25hbWUpCgogICAgaV9zX25hbWVzcGFjZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwcmludCgiYWxsb3dfYnlfYW5ubyAyOiBpX3NfbmFtZXNwYWNlID0iLCBpX3NfbmFtZXNwYWNlKQoKICAgIGFsbG93X2J5X3NhbmRib3hfbmFtZShwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMsIGlfc19uYW1lLCBpX3NfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd19ieV9hbm5vIDI6IHRydWUiKQp9CgphbGxvd19ieV9zYW5kYm94X25hbWUocF9vY2ksIGlfb2NpLCBwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfYnlfc2FuZGJveF9uYW1lOiBzdGFydCIpCgogICAgaV9uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FU1BBQ0VfS0VZXQoKICAgIGFsbG93X2J5X2NvbnRhaW5lcl90eXBlcyhwX29jaSwgaV9vY2ksIHNfbmFtZSwgaV9uYW1lc3BhY2UpCiAgICBhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZChwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpCiAgICBhbGxvd19wcm9jZXNzKHBfb2NpLlByb2Nlc3MsIGlfb2NpLlByb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpCgogICAgcHJpbnQoImFsbG93X2J5X3NhbmRib3hfbmFtZTogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfbmFtZShwX3NfbmFtZSwgaV9zX25hbWUpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X25hbWU6IHN0YXJ0IikKICAgIHJlZ2V4Lm1hdGNoKHBfc19uYW1lLCBpX3NfbmFtZSkKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9uYW1lOiB0cnVlIikKfQoKIyBDaGVjayB0aGF0IHRoZSAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLXR5cGUiIGFuZAojICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIiBhbm5vdGF0aW9ucyBkZXNpZ25hdGUgdGhlCiMgZXhwZWN0ZWQgdHlwZSAtIGVpdGhlciBhICJzYW5kYm94IiBvciBhICJjb250YWluZXIiLiBUaGVuLCB2YWxpZGF0ZQojIG90aGVyIGFubm90YXRpb25zIGJhc2VkIG9uIHRoZSBhY3R1YWwgInNhbmRib3giIG9yICJjb250YWluZXIiIHZhbHVlCiMgZnJvbSB0aGUgaW5wdXQgY29udGFpbmVyLgphbGxvd19ieV9jb250YWluZXJfdHlwZXMocF9vY2ksIGlfb2NpLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfYnlfY29udGFpbmVyX3R5cGVzOiBjaGVja2luZyBpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSIpCgogICAgY190eXBlIDo9ICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSIKICAgIAogICAgcF9jcmlfdHlwZSA6PSBwX29jaS5Bbm5vdGF0aW9uc1tjX3R5cGVdCiAgICBpX2NyaV90eXBlIDo9IGlfb2NpLkFubm90YXRpb25zW2NfdHlwZV0KICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZXM6IHBfY3JpX3R5cGUgPSIsIHBfY3JpX3R5cGUsICJpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgcF9jcmlfdHlwZSA9PSBpX2NyaV90eXBlCgogICAgYWxsb3dfYnlfY29udGFpbmVyX3R5cGUoaV9jcmlfdHlwZSwgcF9vY2ksIGlfb2NpLCBzX25hbWUsIHNfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZXM6IHRydWUiKQp9CgphbGxvd19ieV9jb250YWluZXJfdHlwZShpX2NyaV90eXBlLCBwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAxOiBpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgaV9jcmlfdHlwZSA9PSAic2FuZGJveCIKCiAgICBpX2thdGFfdHlwZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1siaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5jb250YWluZXJfdHlwZSJdCiAgICBwcmludCgiYWxsb3dfYnlfY29udGFpbmVyX3R5cGUgMTogaV9rYXRhX3R5cGUgPSIsIGlfa2F0YV90eXBlKQogICAgaV9rYXRhX3R5cGUgPT0gInBvZF9zYW5kYm94IgoKICAgIGFsbG93X3NhbmRib3hfY29udGFpbmVyX25hbWUocF9vY2ksIGlfb2NpKQogICAgYWxsb3dfc2FuZGJveF9uZXRfbmFtZXNwYWNlKHBfb2NpLCBpX29jaSkKICAgIGFsbG93X3NhbmRib3hfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpCgogICAgcHJpbnQoImFsbG93X2J5X2NvbnRhaW5lcl90eXBlIDE6IHRydWUiKQp9CgphbGxvd19ieV9jb250YWluZXJfdHlwZShpX2NyaV90eXBlLCBwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiBpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgaV9jcmlfdHlwZSA9PSAiY29udGFpbmVyIgoKICAgIGlfa2F0YV90eXBlIDo9IGlfb2NpLkFubm90YXRpb25zWyJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIl0KICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiBpX2thdGFfdHlwZSA9IiwgaV9rYXRhX3R5cGUpCiAgICBpX2thdGFfdHlwZSA9PSAicG9kX2NvbnRhaW5lciIKCiAgICBhbGxvd19jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpCiAgICBhbGxvd19uZXRfbmFtZXNwYWNlKHBfb2NpLCBpX29jaSkKICAgIGFsbG93X2xvZ19kaXJlY3RvcnkocF9vY2ksIGlfb2NpKQoKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiB0cnVlIikKfQoKIyAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLW5hbWUiIGFubm90YXRpb24KYWxsb3dfc2FuZGJveF9jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X2NvbnRhaW5lcl9uYW1lOiBzdGFydCIpCgogICAgY29udGFpbmVyX2Fubm90YXRpb25fbWlzc2luZyhwX29jaSwgaV9vY2ksICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItbmFtZSIpCgogICAgcHJpbnQoImFsbG93X3NhbmRib3hfY29udGFpbmVyX25hbWU6IHRydWUiKQp9CgphbGxvd19jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19jb250YWluZXJfbmFtZTogc3RhcnQiKQoKICAgIGFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uKHBfb2NpLCBpX29jaSwgImlvLmt1YmVybmV0ZXMuY3JpLmNvbnRhaW5lci1uYW1lIikKCiAgICBwcmludCgiYWxsb3dfY29udGFpbmVyX25hbWU6IHRydWUiKQp9Cgpjb250YWluZXJfYW5ub3RhdGlvbl9taXNzaW5nKHBfb2NpLCBpX29jaSwga2V5KSB7CiAgICBwcmludCgiY29udGFpbmVyX2Fubm90YXRpb25fbWlzc2luZzoiLCBrZXkpCgogICAgbm90IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIG5vdCBpX29jaS5Bbm5vdGF0aW9uc1trZXldCgogICAgcHJpbnQoImNvbnRhaW5lcl9hbm5vdGF0aW9uX21pc3Npbmc6IHRydWUiKQp9CgphbGxvd19jb250YWluZXJfYW5ub3RhdGlvbihwX29jaSwgaV9vY2ksIGtleSkgewogICAgcHJpbnQoImFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uOiBrZXkgPSIsIGtleSkKCiAgICBwX3ZhbHVlIDo9IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIGlfdmFsdWUgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgcHJpbnQoImFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uOiBwX3ZhbHVlID0iLCBwX3ZhbHVlLCAiaV92YWx1ZSA9IiwgaV92YWx1ZSkKCiAgICBwX3ZhbHVlID09IGlfdmFsdWUKCiAgICBwcmludCgiYWxsb3dfY29udGFpbmVyX2Fubm90YXRpb246IHRydWUiKQp9CgojICJuZXJkY3RsL25ldHdvcmstbmFtZXNwYWNlIiBhbm5vdGF0aW9uCmFsbG93X3NhbmRib3hfbmV0X25hbWVzcGFjZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X25ldF9uYW1lc3BhY2U6IHN0YXJ0IikKCiAgICBrZXkgOj0gIm5lcmRjdGwvbmV0d29yay1uYW1lc3BhY2UiCgogICAgcF9uYW1lc3BhY2UgOj0gcF9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgaV9uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgcHJpbnQoImFsbG93X3NhbmRib3hfbmV0X25hbWVzcGFjZTogcF9uYW1lc3BhY2UgPSIsIHBfbmFtZXNwYWNlLCAiaV9uYW1lc3BhY2UgPSIsIGlfbmFtZXNwYWNlKQoKICAgIHJlZ2V4Lm1hdGNoKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9uZXRfbmFtZXNwYWNlOiB0cnVlIikKfQoKYWxsb3dfbmV0X25hbWVzcGFjZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19uZXRfbmFtZXNwYWNlOiBzdGFydCIpCgogICAga2V5IDo9ICJuZXJkY3RsL25ldHdvcmstbmFtZXNwYWNlIgoKICAgIG5vdCBwX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICBub3QgaV9vY2kuQW5ub3RhdGlvbnNba2V5XQoKICAgIHByaW50KCJhbGxvd19uZXRfbmFtZXNwYWNlOiB0cnVlIikKfQoKIyAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1sb2ctZGlyZWN0b3J5IiBhbm5vdGF0aW9uCmFsbG93X3NhbmRib3hfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X2xvZ19kaXJlY3Rvcnk6IHN0YXJ0IikKCiAgICBrZXkgOj0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbG9nLWRpcmVjdG9yeSIKCiAgICBwX2RpciA6PSBwX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICByZWdleDEgOj0gcmVwbGFjZShwX2RpciwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHJlZ2V4MiA6PSByZXBsYWNlKHJlZ2V4MSwgIiQoc2FuZGJveC1uYW1lc3BhY2UpIiwgc19uYW1lc3BhY2UpCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiByZWdleDIgPSIsIHJlZ2V4MikKCiAgICBpX2RpciA6PSBpX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiBpX2RpciA9IiwgaV9kaXIpCgogICAgcmVnZXgubWF0Y2gocmVnZXgyLCBpX2RpcikKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiB0cnVlIikKfQoKYWxsb3dfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19sb2dfZGlyZWN0b3J5OiBzdGFydCIpCgogICAga2V5IDo9ICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWxvZy1kaXJlY3RvcnkiCgogICAgbm90IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIG5vdCBpX29jaS5Bbm5vdGF0aW9uc1trZXldCgogICAgcHJpbnQoImFsbG93X2xvZ19kaXJlY3Rvcnk6IHRydWUiKQp9CgphbGxvd19kZXZpY2VzKHBfZGV2aWNlcywgaV9kZXZpY2VzKSB7CiAgICBwcmludCgiYWxsb3dfZGV2aWNlczogc3RhcnQiKQogICAgZXZlcnkgaV9kZXZpY2UgaW4gaV9kZXZpY2VzIHsKICAgICAgICBwcmludCgiYWxsb3dfZGV2aWNlczogaV9kZXZpY2UgPSIsIGlfZGV2aWNlKQogICAgICAgIHNvbWUgcF9kZXZpY2UgaW4gcF9kZXZpY2VzCiAgICAgICAgcF9kZXZpY2UuY29udGFpbmVyX3BhdGggPT0gaV9kZXZpY2UuY29udGFpbmVyX3BhdGgKICAgIH0KICAgIHByaW50KCJhbGxvd19kZXZpY2VzOiB0cnVlIikKfQoKYWxsb3dfbGludXgoc3RhdGVfb3BzLCBwX29jaSwgaV9vY2kpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIHBfbmFtZXNwYWNlcyA6PSBwX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbGludXg6IHAgbmFtZXNwYWNlcyA9IiwgcF9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlcyA6PSBpX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbGludXg6IGkgbmFtZXNwYWNlcyA9IiwgaV9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlX3dpdGhvdXRfbmV0d29yayA6PSBbb2JqIHwgb2JqIDo9IGlfbmFtZXNwYWNlc1tfXTsgb2JqLlR5cGUgIT0gIm5ldHdvcmsiXQoKICAgIHByaW50KCJhbGxvd19saW51eDogaV9uYW1lc3BhY2Vfd2l0aG91dF9uZXR3b3JrID0iLCBpX25hbWVzcGFjZV93aXRob3V0X25ldHdvcmspCgogICAgcF9uYW1lc3BhY2VzID09IGlfbmFtZXNwYWNlX3dpdGhvdXRfbmV0d29yawoKICAgIGFsbG93X21hc2tlZF9wYXRocyhwX29jaSwgaV9vY2kpCiAgICBhbGxvd19yZWFkb25seV9wYXRocyhwX29jaSwgaV9vY2kpCiAgICBhbGxvd19saW51eF9kZXZpY2VzKHBfb2NpLkxpbnV4LkRldmljZXMsIGlfb2NpLkxpbnV4LkRldmljZXMpCiAgICBhbGxvd19saW51eF9zeXNjdGwocF9vY2kuTGludXgsIGlfb2NpLkxpbnV4KQogICAgcmV0IDo9IGFsbG93X25ldHdvcmtfbmFtZXNwYWNlX3N0YXJ0KHN0YXRlX29wcywgcF9vY2ksIGlfb2NpKQogICAgcmV0LmFsbG93ZWQKCiAgICBvcHMgOj0gcmV0Lm9wcwoKICAgIHByaW50KCJhbGxvd19saW51eDogdHJ1ZSIpCn0KCiMgUmV0cmlldmUgdGhlICJuZXR3b3JrIiBuYW1lc3BhY2UgZnJvbSB0aGUgaW5wdXQgZGF0YSBhbmQgcGFzcyBpdCBvbiBmb3IgdGhlCiMgbmV0d29yayBuYW1lc3BhY2UgcG9saWN5IGNoZWNrcy4KYWxsb3dfbmV0d29ya19uYW1lc3BhY2Vfc3RhcnQoc3RhdGVfb3BzLCBwX29jaSwgaV9vY2kpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIHByaW50KCJhbGxvd19uZXR3b3JrX25hbWVzcGFjZSBzdGFydDogc3RhcnQiKQoKICAgIHBfbmFtZXNwYWNlcyA6PSBwX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IHAgbmFtZXNwYWNlcyA9IiwgcF9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlcyA6PSBpX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IGkgbmFtZXNwYWNlcyA9IiwgaV9uYW1lc3BhY2VzKQoKICAgICMgUmV0dXJuIHBhdGggb2YgdGhlICJuZXR3b3JrIiBuYW1lc3BhY2UKICAgIG5ldHdvcmtfbnMgOj0gW29iaiB8IG9iaiA6PSBpX25hbWVzcGFjZXNbX107IG9iai5UeXBlID09ICJuZXR3b3JrIl0KCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IG5ldHdvcmtfbnMgPSIsIG5ldHdvcmtfbnMpCgogICAgcmV0IDo9IGFsbG93X25ldHdvcmtfbmFtZXNwYWNlKHN0YXRlX29wcywgbmV0d29ya19ucykKICAgIHJldC5hbGxvd2VkCgogICAgb3BzIDo9IHJldC5vcHMKfQoKIyBUaGlzIHJ1bGUgaXMgd2hlbiB0aGVyZSdzIG5vIG5ldHdvcmsgbmFtZXNwYWNlIGluIHRoZSBpbnB1dCBkYXRhLgphbGxvd19uZXR3b3JrX25hbWVzcGFjZShzdGF0ZV9vcHMsIG5ldHdvcmtfbnMpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIGNvdW50KG5ldHdvcmtfbnMpID09IDAKCiAgICBuZXR3b3JrX25zX3BhdGggPSAiIgoKICAgIGFkZF9uZXR3b3JrX25hbWVzcGFjZV90b19zdGF0ZSA6PSBzdGF0ZV9hbGxvd3MoIm5ldHdvcmtfbmFtZXNwYWNlIiwgbmV0d29ya19uc19wYXRoKQogICAgb3BzIDo9IGNvbmNhdF9vcF9pZl9ub3RfbnVsbChzdGF0ZV9vcHMsIGFkZF9uZXR3b3JrX25hbWVzcGFjZV90b19zdGF0ZSkKCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2UgMTogdHJ1ZSIpCn0KCiMgVGhpcyBydWxlIGlzIHdoZW4gdGhlcmUncyBleGFjdGx5IG9uZSBuZXR3b3JrIG5hbWVzcGFjZSBpbiB0aGUgaW5wdXQgZGF0YS4KYWxsb3dfbmV0d29ya19uYW1lc3BhY2Uoc3RhdGVfb3BzLCBuZXR3b3JrX25zKSA6PSB7Im9wcyI6IG9wcywgImFsbG93ZWQiOiB0cnVlfSB7CiAgICBjb3VudChuZXR3b3JrX25zKSA9PSAxCgogICAgYWRkX25ldHdvcmtfbmFtZXNwYWNlX3RvX3N0YXRlIDo9IHN0YXRlX2FsbG93cygibmV0d29ya19uYW1lc3BhY2UiLCBuZXR3b3JrX25zWzBdLlBhdGgpCiAgICBvcHMgOj0gY29uY2F0X29wX2lmX25vdF9udWxsKHN0YXRlX29wcywgYWRkX25ldHdvcmtfbmFtZXNwYWNlX3RvX3N0YXRlKQoKICAgIHByaW50KCJhbGxvd19uZXR3b3JrX25hbWVzcGFjZSAyOiB0cnVlIikKfQoKYWxsb3dfbWFza2VkX3BhdGhzKHBfb2NpLCBpX29jaSkgewogICAgcF9wYXRocyA6PSBwX29jaS5MaW51eC5NYXNrZWRQYXRocwogICAgcHJpbnQoImFsbG93X21hc2tlZF9wYXRocyAxOiBwX3BhdGhzID0iLCBwX3BhdGhzKQoKICAgIGlfcGF0aHMgOj0gaV9vY2kuTGludXguTWFza2VkUGF0aHMKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aHMgMTogaV9wYXRocyA9IiwgaV9wYXRocykKCiAgICBhbGxvd19tYXNrZWRfcGF0aHNfYXJyYXkocF9wYXRocywgaV9wYXRocykKCiAgICBwcmludCgiYWxsb3dfbWFza2VkX3BhdGhzIDE6IHRydWUiKQp9CmFsbG93X21hc2tlZF9wYXRocyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aHMgMjogc3RhcnQiKQoKICAgIG5vdCBwX29jaS5MaW51eC5NYXNrZWRQYXRocwogICAgbm90IGlfb2NpLkxpbnV4Lk1hc2tlZFBhdGhzCgogICAgcHJpbnQoImFsbG93X21hc2tlZF9wYXRocyAyOiB0cnVlIikKfQoKIyBBbGwgdGhlIHBvbGljeSBtYXNrZWQgcGF0aHMgbXVzdCBiZSBtYXNrZWQgaW4gdGhlIGlucHV0IGRhdGEgdG9vLgojIElucHV0IGlzIGFsbG93ZWQgdG8gaGF2ZSBtb3JlIG1hc2tlZCBwYXRocyB0aGFuIHRoZSBwb2xpY3kuCmFsbG93X21hc2tlZF9wYXRoc19hcnJheShwX2FycmF5LCBpX2FycmF5KSB7CiAgICBldmVyeSBwX2VsZW0gaW4gcF9hcnJheSB7CiAgICAgICAgYWxsb3dfbWFza2VkX3BhdGgocF9lbGVtLCBpX2FycmF5KQogICAgfQp9CgphbGxvd19tYXNrZWRfcGF0aChwX2VsZW0sIGlfYXJyYXkpIHsKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aDogcF9lbGVtID0iLCBwX2VsZW0pCgogICAgc29tZSBpX2VsZW0gaW4gaV9hcnJheQogICAgcF9lbGVtID09IGlfZWxlbQoKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aDogdHJ1ZSIpCn0KCmFsbG93X3JlYWRvbmx5X3BhdGhzKHBfb2NpLCBpX29jaSkgewogICAgcF9wYXRocyA6PSBwX29jaS5MaW51eC5SZWFkb25seVBhdGhzCiAgICBwcmludCgiYWxsb3dfcmVhZG9ubHlfcGF0aHMgMTogcF9wYXRocyA9IiwgcF9wYXRocykKCiAgICBpX3BhdGhzIDo9IGlfb2NpLkxpbnV4LlJlYWRvbmx5UGF0aHMKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAxOiBpX3BhdGhzID0iLCBpX3BhdGhzKQoKICAgIGFsbG93X3JlYWRvbmx5X3BhdGhzX2FycmF5KHBfcGF0aHMsIGlfcGF0aHMsIGlfb2NpLkxpbnV4Lk1hc2tlZFBhdGhzKQoKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAxOiB0cnVlIikKfQphbGxvd19yZWFkb25seV9wYXRocyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAyOiBzdGFydCIpCgogICAgbm90IHBfb2NpLkxpbnV4LlJlYWRvbmx5UGF0aHMKICAgIG5vdCBpX29jaS5MaW51eC5SZWFkb25seVBhdGhzCgogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGhzIDI6IHRydWUiKQp9CgojIEFsbCB0aGUgcG9saWN5IHJlYWRvbmx5IHBhdGhzIG11c3QgYmUgZWl0aGVyOgojIC0gUHJlc2VudCBpbiB0aGUgaW5wdXQgcmVhZG9ubHkgcGF0aHMsIG9yCiMgLSBQcmVzZW50IGluIHRoZSBpbnB1dCBtYXNrZWQgcGF0aHMuCiMgSW5wdXQgaXMgYWxsb3dlZCB0byBoYXZlIG1vcmUgcmVhZG9ubHkgcGF0aHMgdGhhbiB0aGUgcG9saWN5LgphbGxvd19yZWFkb25seV9wYXRoc19hcnJheShwX2FycmF5LCBpX2FycmF5LCBtYXNrZWRfcGF0aHMpIHsKICAgIGV2ZXJ5IHBfZWxlbSBpbiBwX2FycmF5IHsKICAgICAgICBhbGxvd19yZWFkb25seV9wYXRoKHBfZWxlbSwgaV9hcnJheSwgbWFza2VkX3BhdGhzKQogICAgfQp9CgphbGxvd19yZWFkb25seV9wYXRoKHBfZWxlbSwgaV9hcnJheSwgbWFza2VkX3BhdGhzKSB7CiAgICBwcmludCgiYWxsb3dfcmVhZG9ubHlfcGF0aCAxOiBwX2VsZW0gPSIsIHBfZWxlbSkKCiAgICBzb21lIGlfZWxlbSBpbiBpX2FycmF5CiAgICBwX2VsZW0gPT0gaV9lbGVtCgogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGggMTogdHJ1ZSIpCn0KYWxsb3dfcmVhZG9ubHlfcGF0aChwX2VsZW0sIGlfYXJyYXksIG1hc2tlZF9wYXRocykgewogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGggMjogcF9lbGVtID0iLCBwX2VsZW0pCgogICAgc29tZSBpX21hc2tlZCBpbiBtYXNrZWRfcGF0aHMKICAgIHBfZWxlbSA9PSBpX21hc2tlZAoKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRoIDI6IHRydWUiKQp9CgphbGxvd19saW51eF9kZXZpY2VzKHBfZGV2aWNlcywgaV9kZXZpY2VzKSB7CiAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogc3RhcnQiKQogICAgZXZlcnkgaV9kZXZpY2UgaW4gaV9kZXZpY2VzIHsKICAgICAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogaV9kZXZpY2UgPSIsIGlfZGV2aWNlKQogICAgICAgIHNvbWUgcF9kZXZpY2UgaW4gcF9kZXZpY2VzCiAgICAgICAgaV9kZXZpY2UuUGF0aCA9PSBwX2RldmljZS5QYXRoCiAgICB9CiAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogdHJ1ZSIpCn0KCmFsbG93X2xpbnV4X3N5c2N0bChwX2xpbnV4LCBpX2xpbnV4KSB7CiAgICBwcmludCgiYWxsb3dfbGludXhfc3lzY3RsIDE6IHN0YXJ0IikKICAgIG5vdCBpX2xpbnV4LlN5c2N0bAogICAgcHJpbnQoImFsbG93X2xpbnV4X3N5c2N0bCAxOiB0cnVlIikKfQoKYWxsb3dfbGludXhfc3lzY3RsKHBfbGludXgsIGlfbGludXgpIHsKICAgIHByaW50KCJhbGxvd19saW51eF9zeXNjdGwgMjogc3RhcnQiKQogICAgcF9zeXNjdGwgOj0gcF9saW51eC5TeXNjdGwKICAgIGlfc3lzY3RsIDo9IGlfbGludXguU3lzY3RsCiAgICBldmVyeSBpX25hbWUsIGlfdmFsIGluIGlfc3lzY3RsIHsKICAgICAgICBwcmludCgiYWxsb3dfbGludXhfc3lzY3RsIDI6IGlfbmFtZSA9IiwgaV9uYW1lLCAiaV92YWwgPSIsIGlfdmFsKQogICAgICAgIHBfc3lzY3RsW2lfbmFtZV0gPT0gaV92YWwKICAgIH0KICAgIHByaW50KCJhbGxvd19saW51eF9zeXNjdGwgMjogdHJ1ZSIpCn0KCiMgQ2hlY2sgdGhlIGNvbnNpc3RlbmN5IG9mIHRoZSBpbnB1dCAiaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5idW5kbGVfcGF0aCIKIyBhbmQgaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCIgdmFsdWVzIHdpdGggb3RoZXIgZmllbGRzLgphbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZChwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpIHsKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogc3RhcnQiKQoKICAgIGJ1bmRsZV9wYXRoIDo9IGlfb2NpLkFubm90YXRpb25zWyJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmJ1bmRsZV9wYXRoIl0KICAgIGJ1bmRsZV9pZCA6PSByZXBsYWNlKGJ1bmRsZV9wYXRoLCAiL3J1bi9jb250YWluZXJkL2lvLmNvbnRhaW5lcmQucnVudGltZS52Mi50YXNrL2s4cy5pby8iLCAiIikKCiAgICBidW5kbGVfaWRfZm9ybWF0IDo9IGNvbmNhdCgiIiwgWyJeIiwgQlVORExFX0lELCAiJCJdKQogICAgcmVnZXgubWF0Y2goYnVuZGxlX2lkX2Zvcm1hdCwgYnVuZGxlX2lkKQoKICAgIGtleSA6PSAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCIKCiAgICBwX3JlZ2V4IDo9IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIHNhbmRib3hfaWQgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQoKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogc2FuZGJveF9pZCA9Iiwgc2FuZGJveF9pZCwgInJlZ2V4ID0iLCBwX3JlZ2V4KQogICAgcmVnZXgubWF0Y2gocF9yZWdleCwgc2FuZGJveF9pZCkKCiAgICBhbGxvd19yb290X3BhdGgocF9vY2ksIGlfb2NpLCBidW5kbGVfaWQpCgogICAgZXZlcnkgaV9tb3VudCBpbiBpX29jaS5Nb3VudHMgewogICAgICAgIGFsbG93X21vdW50KHBfb2NpLCBpX21vdW50LCBpX3N0b3JhZ2VzLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpCiAgICB9CgogICAgYWxsb3dfc3RvcmFnZXMocF9zdG9yYWdlcywgaV9zdG9yYWdlcywgYnVuZGxlX2lkLCBzYW5kYm94X2lkKQoKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogdHJ1ZSIpCn0KCmFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHBfcHJvY2VzcyA9IiwgcF9wcm9jZXNzKQogICAgcHJpbnQoImFsbG93X3Byb2Nlc3NfY29tbW9uOiBpX3Byb2Nlc3MgPSAiLCBpX3Byb2Nlc3MpCiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHNfbmFtZSA9Iiwgc19uYW1lKQoKICAgIHBfcHJvY2Vzcy5Dd2QgPT0gaV9wcm9jZXNzLkN3ZAogICAgcF9wcm9jZXNzLk5vTmV3UHJpdmlsZWdlcyA9PSBpX3Byb2Nlc3MuTm9OZXdQcml2aWxlZ2VzCgogICAgYWxsb3dfdXNlcihwX3Byb2Nlc3MsIGlfcHJvY2VzcykKICAgIGFsbG93X2VudihwX3Byb2Nlc3MsIGlfcHJvY2Vzcywgc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHRydWUiKQp9CgojIENvbXBhcmUgdGhlIE9DSSBQcm9jZXNzIGZpZWxkIG9mIGEgcG9saWN5IGNvbnRhaW5lciB3aXRoIHRoZSBpbnB1dCBPQ0kgUHJvY2VzcyBmcm9tIGEgQ3JlYXRlQ29udGFpbmVyUmVxdWVzdAphbGxvd19wcm9jZXNzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfcHJvY2Vzczogc3RhcnQiKQoKICAgIGFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgYWxsb3dfY2FwcyhwX3Byb2Nlc3MuQ2FwYWJpbGl0aWVzLCBpX3Byb2Nlc3MuQ2FwYWJpbGl0aWVzKQogICAgcF9wcm9jZXNzLlRlcm1pbmFsID09IGlfcHJvY2Vzcy5UZXJtaW5hbAoKICAgIHByaW50KCJhbGxvd19wcm9jZXNzOiB0cnVlIikKfQoKIyBDb21wYXJlIHRoZSBPQ0kgUHJvY2VzcyBmaWVsZCBvZiBhIHBvbGljeSBjb250YWluZXIgd2l0aCB0aGUgaW5wdXQgcHJvY2VzcyBmaWVsZCBmcm9tIEV4ZWNQcm9jZXNzUmVxdWVzdAphbGxvd19pbnRlcmFjdGl2ZV9wcm9jZXNzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfaW50ZXJhY3RpdmVfcHJvY2Vzczogc3RhcnQiKQoKICAgIGFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgYWxsb3dfZXhlY19jYXBzKGlfcHJvY2Vzcy5DYXBhYmlsaXRpZXMpCgogICAgIyBUaGVzZSBhcmUgY29tbWFuZHMgZW5hYmxlZCB1c2luZyBFeGVjUHJvY2Vzc1JlcXVlc3QgY29tbWFuZHMgYW5kL29yIHJlZ2V4IGZyb20gdGhlIHNldHRpbmdzIGZpbGUuCiAgICAjIFRoZXkgY2FuIGJlIGV4ZWN1dGVkIGludGVyYWN0aXZlbHkgc28gYWxsb3cgdGhlbSB0byB1c2UgYW55IHZhbHVlIGZvciBpX3Byb2Nlc3MuVGVybWluYWwuCgogICAgcHJpbnQoImFsbG93X2ludGVyYWN0aXZlX3Byb2Nlc3M6IHRydWUiKQp9CgojIENvbXBhcmUgdGhlIE9DSSBQcm9jZXNzIGZpZWxkIG9mIGEgcG9saWN5IGNvbnRhaW5lciB3aXRoIHRoZSBpbnB1dCBwcm9jZXNzIGZpZWxkIGZyb20gRXhlY1Byb2Nlc3NSZXF1ZXN0CmFsbG93X3Byb2JlX3Byb2Nlc3MocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19wcm9iZV9wcm9jZXNzOiBzdGFydCIpCgogICAgYWxsb3dfcHJvY2Vzc19jb21tb24ocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpCiAgICBhbGxvd19leGVjX2NhcHMoaV9wcm9jZXNzLkNhcGFiaWxpdGllcykKICAgIHBfcHJvY2Vzcy5UZXJtaW5hbCA9PSBpX3Byb2Nlc3MuVGVybWluYWwKCiAgICBwcmludCgiYWxsb3dfcHJvYmVfcHJvY2VzczogdHJ1ZSIpCn0KCmFsbG93X3VzZXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MpIHsKICAgIHBfdXNlciA6PSBwX3Byb2Nlc3MuVXNlcgogICAgaV91c2VyIDo9IGlfcHJvY2Vzcy5Vc2VyCgogICAgcHJpbnQoImFsbG93X3VzZXI6IGlucHV0IHVpZCA9IiwgaV91c2VyLlVJRCwgInBvbGljeSB1aWQgPSIsIHBfdXNlci5VSUQpCiAgICBwX3VzZXIuVUlEID09IGlfdXNlci5VSUQKCiAgICAjIFRPRE86IHRyYWNrIGRvd24gdGhlIHJlYXNvbiBmb3IgcmVnaXN0cnkuazhzLmlvL3BhdXNlOjMuOSBiZWluZwogICAgIyAgICAgICBleGVjdXRlZCB3aXRoIGdpZCA9IDAgZGVzcGl0ZSBoYXZpbmcgIjY1NTM1OjY1NTM1IiBpbiBpdHMgY29udGFpbmVyIGltYWdlCiAgICAjICAgICAgIGNvbmZpZy4KICAgICNwcmludCgiYWxsb3dfdXNlcjogaW5wdXQgZ2lkID0iLCBpX3VzZXIuR0lELCAicG9saWN5IGdpZCA9IiwgcF91c2VyLkdJRCkKICAgICNwX3VzZXIuR0lEID09IGlfdXNlci5HSUQKCiAgICAjIFRPRE86IGNvbXBhcmUgdGhlIGFkZGl0aW9uYWxHaWRzIGZpZWxkIHRvbyBhZnRlciBjb21wdXRpbmcgaXRzIHZhbHVlCiAgICAjIGJhc2VkIG9uIC9ldGMvcGFzc3dkIGFuZCAvZXRjL2dyb3VwIGZyb20gdGhlIGNvbnRhaW5lciBpbWFnZS4KfQoKYWxsb3dfZGVwcmVjYXRlZF9hcmdzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZ3MgMTogbm8gYXJncyIpCgogICAgbm90IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJncwogICAgbm90IGlfcHJvY2Vzcy5BcmdzCgogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAxOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZ3MocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSkgewogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiBwb2xpY3kgYXJncyA9IiwgcF9wcm9jZXNzLkRlcHJlY2F0ZWRBcmdzKQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiBpbnB1dCBhcmdzID0iLCBpX3Byb2Nlc3MuQXJncykKCiAgICBjb3VudChwX3Byb2Nlc3MuRGVwcmVjYXRlZEFyZ3MpID09IGNvdW50KGlfcHJvY2Vzcy5BcmdzKQoKICAgIGV2ZXJ5IGksIGlfYXJnIGluIGlfcHJvY2Vzcy5BcmdzIHsKICAgICAgICBhbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpCiAgICB9CgogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDE6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgcF9hcmcyIDo9IHJlcGxhY2UocF9hcmcsICIkJCIsICIkIikKICAgIHBfYXJnMiA9PSBpX2FyZwoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAxOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDI6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgIyBUT0RPOiBjYW4gJChub2RlLW5hbWUpIGJlIGhhbmRsZWQgYmV0dGVyPwogICAgY29udGFpbnMocF9hcmcsICIkKG5vZGUtbmFtZSkiKQoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAyOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDM6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgcF9hcmcyIDo9IHJlcGxhY2UocF9hcmcsICIkJCIsICIkIikKICAgIHBfYXJnMyA6PSByZXBsYWNlKHBfYXJnMiwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAzOiBwX2FyZzMgPSIsIHBfYXJnMykKICAgIHBfYXJnMyA9PSBpX2FyZwoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAzOiB0cnVlIikKfQoKIyBPQ0kgcHJvY2Vzcy5FbnYgZmllbGQKYWxsb3dfZW52KHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfZW52OiBwIGVudiA9IiwgcF9wcm9jZXNzLkVudikKICAgIHByaW50KCJhbGxvd19lbnY6IGkgZW52ID0iLCBpX3Byb2Nlc3MuRW52KQoKICAgIGV2ZXJ5IGlfdmFyIGluIGlfcHJvY2Vzcy5FbnYgewogICAgICAgIHByaW50KCJhbGxvd19lbnY6IGlfdmFyID0iLCBpX3ZhcikKICAgICAgICBhbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgfQoKICAgIHByaW50KCJhbGxvd19lbnY6IHRydWUiKQp9CgojIEFsbG93IGlucHV0IGVudiB2YXJpYWJsZXMgdGhhdCBhcmUgcHJlc2VudCBpbiB0aGUgcG9saWN5IGRhdGEgdG9vLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHBfdmFyID09IGlfdmFyCiAgICBwcmludCgiYWxsb3dfdmFyIDE6IHRydWUiKQp9CgojIE1hdGNoIGlucHV0IHdpdGggb25lIG9mIHRoZSBwb2xpY3kgdmFyaWFibGVzLCBhZnRlciBzdWJzdGl0dXRpbmcgJChzYW5kYm94LW5hbWUpLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHByaW50KCJhbGxvd192YXIgMjogcF92YXIgPSIsIHBfdmFyKQoKICAgIHBfdmFyX3NwbGl0IDo9IHNwbGl0KHBfdmFyLCAiPSIpCiAgICBjb3VudChwX3Zhcl9zcGxpdCkgPT0gMgoKICAgIHBfdmFyX3NwbGl0WzFdID09ICIkKHNhbmRib3gtbmFtZSkiCgogICAgaV92YXJfc3BsaXQgOj0gc3BsaXQoaV92YXIsICI9IikKICAgIGNvdW50KGlfdmFyX3NwbGl0KSA9PSAyCgogICAgaV92YXJfc3BsaXRbMF0gPT0gcF92YXJfc3BsaXRbMF0KICAgIHJlZ2V4Lm1hdGNoKHNfbmFtZSwgaV92YXJfc3BsaXRbMV0pCgogICAgcHJpbnQoImFsbG93X3ZhciAyOiB0cnVlIikKfQoKIyBBbGxvdyBpbnB1dCBlbnYgdmFyaWFibGVzIHRoYXQgbWF0Y2ggd2l0aCBhIHJlcXVlc3RfZGVmYXVsdHMgcmVnZXguCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHNvbWUgcF9yZWdleDEgaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5DcmVhdGVDb250YWluZXJSZXF1ZXN0LmFsbG93X2Vudl9yZWdleAogICAgcF9yZWdleDIgOj0gcmVwbGFjZShwX3JlZ2V4MSwgIiQoaXB2NF9hKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcHY0X2EpCiAgICBwX3JlZ2V4MyA6PSByZXBsYWNlKHBfcmVnZXgyLCAiJChpcF9wKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcF9wKQogICAgcF9yZWdleDQgOj0gcmVwbGFjZShwX3JlZ2V4MywgIiQoc3ZjX25hbWUpIiwgcG9saWN5X2RhdGEuY29tbW9uLnN2Y19uYW1lKQogICAgcF9yZWdleDUgOj0gcmVwbGFjZShwX3JlZ2V4NCwgIiQoZG5zX2xhYmVsKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5kbnNfbGFiZWwpCgogICAgcHJpbnQoImFsbG93X3ZhciAzOiBwX3JlZ2V4NSA9IiwgcF9yZWdleDUpCiAgICByZWdleC5tYXRjaChwX3JlZ2V4NSwgaV92YXIpCgogICAgcHJpbnQoImFsbG93X3ZhciAzOiB0cnVlIikKfQoKIyBBbGxvdyBmaWVsZFJlZiAiZmllbGRQYXRoOiBzdGF0dXMucG9kSVAiIHZhbHVlcy4KYWxsb3dfdmFyKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBpX3Zhciwgc19uYW1lLCBzX25hbWVzcGFjZSkgewogICAgbmFtZV92YWx1ZSA6PSBzcGxpdChpX3ZhciwgIj0iKQogICAgY291bnQobmFtZV92YWx1ZSkgPT0gMgogICAgaXNfaXAobmFtZV92YWx1ZVsxXSkKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIGFsbG93X3BvZF9pcF92YXIobmFtZV92YWx1ZVswXSwgcF92YXIpCgogICAgcHJpbnQoImFsbG93X3ZhciA0OiB0cnVlIikKfQoKIyBBbGxvdyBjb21tb24gZmllbGRSZWYgdmFyaWFibGVzLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBuYW1lX3ZhbHVlIDo9IHNwbGl0KGlfdmFyLCAiPSIpCiAgICBjb3VudChuYW1lX3ZhbHVlKSA9PSAyCgogICAgc29tZSBwX3ZhciBpbiBwX3Byb2Nlc3MuRW52CiAgICBwX25hbWVfdmFsdWUgOj0gc3BsaXQocF92YXIsICI9IikKICAgIGNvdW50KHBfbmFtZV92YWx1ZSkgPT0gMgoKICAgIHBfbmFtZV92YWx1ZVswXSA9PSBuYW1lX3ZhbHVlWzBdCgogICAgIyBUT0RPOiBzaG91bGQgdGhlc2UgYmUgaGFuZGxlZCBpbiBhIGRpZmZlcmVudCB3YXk/CiAgICBhbHdheXNfYWxsb3dlZCA6PSBbIiQoaG9zdC1uYW1lKSIsICIkKG5vZGUtbmFtZSkiLCAiJChwb2QtdWlkKSJdCiAgICBzb21lIGFsbG93ZWQgaW4gYWx3YXlzX2FsbG93ZWQKICAgIGNvbnRhaW5zKHBfbmFtZV92YWx1ZVsxXSwgYWxsb3dlZCkKCiAgICBwcmludCgiYWxsb3dfdmFyIDU6IHRydWUiKQp9CgojIEFsbG93IGZpZWxkUmVmICJmaWVsZFBhdGg6IHN0YXR1cy5ob3N0SVAiIHZhbHVlcy4KYWxsb3dfdmFyKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBpX3Zhciwgc19uYW1lLCBzX25hbWVzcGFjZSkgewogICAgbmFtZV92YWx1ZSA6PSBzcGxpdChpX3ZhciwgIj0iKQogICAgY291bnQobmFtZV92YWx1ZSkgPT0gMgogICAgaXNfaXAobmFtZV92YWx1ZVsxXSkKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIGFsbG93X2hvc3RfaXBfdmFyKG5hbWVfdmFsdWVbMF0sIHBfdmFyKQoKICAgIHByaW50KCJhbGxvd192YXIgNjogdHJ1ZSIpCn0KCiMgQWxsb3cgcmVzb3VyY2VGaWVsZFJlZiB2YWx1ZXMgKGUuZy4sICJsaW1pdHMuY3B1IikuCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIG5hbWVfdmFsdWUgOj0gc3BsaXQoaV92YXIsICI9IikKICAgIGNvdW50KG5hbWVfdmFsdWUpID09IDIKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHBfbmFtZV92YWx1ZSA6PSBzcGxpdChwX3ZhciwgIj0iKQogICAgY291bnQocF9uYW1lX3ZhbHVlKSA9PSAyCgogICAgcF9uYW1lX3ZhbHVlWzBdID09IG5hbWVfdmFsdWVbMF0KCiAgICAjIGEgdmFyaWFibGUgd2Ugc2hvdWxkIGJlIHZhbGlkYXRpbmcgdXNpbmcgYSByZWdleCBmcm9tIHNldHRpbmdzCiAgICBwX25hbWVfdmFsdWVbMV0gPT0gIiQodmFsaWRhdGUtZnJvbS1zZXR0aW5ncykiCgogICAgcmVnZXhfdmFsIDo9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuQ3JlYXRlQ29udGFpbmVyUmVxdWVzdC5hbGxvd19lbnZfcmVnZXhfbWFwW25hbWVfdmFsdWVbMF1dCgogICAgcHJpbnQoImFsbG93X3ZhciA3OiB2YWwgPSIsIG5hbWVfdmFsdWVbMV0pCiAgICBwcmludCgiYWxsb3dfdmFyIDc6IHJlZ2V4X3ZhbCA9IiwgcmVnZXhfdmFsKQoKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4X3ZhbCwgbmFtZV92YWx1ZVsxXSkKCiAgICBwcmludCgiYWxsb3dfdmFyIDc6IHRydWUiKQp9CgojIE1hdGNoIGlucHV0IHdpdGggb25lIG9mIHRoZSBwb2xpY3kgdmFyaWFibGVzLCBhZnRlciBzdWJzdGl0dXRpbmcgJChzYW5kYm94LW5hbWVzcGFjZSkuCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHNvbWUgcF92YXIgaW4gcF9wcm9jZXNzLkVudgogICAgcF92YXIyIDo9IHJlcGxhY2UocF92YXIsICIkKHNhbmRib3gtbmFtZXNwYWNlKSIsIHNfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd192YXIgODogcF92YXIyID0iLCBwX3ZhcjIpCiAgICBwX3ZhcjIgPT0gaV92YXIKCiAgICBwcmludCgiYWxsb3dfdmFyIDg6IHRydWUiKQp9CgphbGxvd19wb2RfaXBfdmFyKHZhcl9uYW1lLCBwX3ZhcikgewogICAgcHJpbnQoImFsbG93X3BvZF9pcF92YXI6IHZhcl9uYW1lID0iLCB2YXJfbmFtZSwgInBfdmFyID0iLCBwX3ZhcikKCiAgICBwX25hbWVfdmFsdWUgOj0gc3BsaXQocF92YXIsICI9IikKICAgIGNvdW50KHBfbmFtZV92YWx1ZSkgPT0gMgoKICAgIHBfbmFtZV92YWx1ZVswXSA9PSB2YXJfbmFtZQogICAgcF9uYW1lX3ZhbHVlWzFdID09ICIkKHBvZC1pcCkiCgogICAgcHJpbnQoImFsbG93X3BvZF9pcF92YXI6IHRydWUiKQp9CgphbGxvd19ob3N0X2lwX3Zhcih2YXJfbmFtZSwgcF92YXIpIHsKICAgIHByaW50KCJhbGxvd19ob3N0X2lwX3ZhcjogdmFyX25hbWUgPSIsIHZhcl9uYW1lLCAicF92YXIgPSIsIHBfdmFyKQoKICAgIHBfbmFtZV92YWx1ZSA6PSBzcGxpdChwX3ZhciwgIj0iKQogICAgY291bnQocF9uYW1lX3ZhbHVlKSA9PSAyCgogICAgcF9uYW1lX3ZhbHVlWzBdID09IHZhcl9uYW1lCiAgICBwX25hbWVfdmFsdWVbMV0gPT0gIiQoaG9zdC1pcCkiCgogICAgcHJpbnQoImFsbG93X2hvc3RfaXBfdmFyOiB0cnVlIikKfQoKaXNfaXAodmFsdWUpIHsKICAgIGJ5dGVzID0gc3BsaXQodmFsdWUsICIuIikKICAgIGNvdW50KGJ5dGVzKSA9PSA0CgogICAgaXNfaXBfZmlyc3RfYnl0ZShieXRlc1swXSkKICAgIGlzX2lwX290aGVyX2J5dGUoYnl0ZXNbMV0pCiAgICBpc19pcF9vdGhlcl9ieXRlKGJ5dGVzWzJdKQogICAgaXNfaXBfb3RoZXJfYnl0ZShieXRlc1szXSkKfQppc19pcF9maXJzdF9ieXRlKGNvbXBvbmVudCkgewogICAgbnVtYmVyID0gdG9fbnVtYmVyKGNvbXBvbmVudCkKICAgIG51bWJlciA+PSAxCiAgICBudW1iZXIgPD0gMjU1Cn0KaXNfaXBfb3RoZXJfYnl0ZShjb21wb25lbnQpIHsKICAgIG51bWJlciA9IHRvX251bWJlcihjb21wb25lbnQpCiAgICBudW1iZXIgPj0gMAogICAgbnVtYmVyIDw9IDI1NQp9CgojIE9DSSByb290LlBhdGgKYWxsb3dfcm9vdF9wYXRoKHBfb2NpLCBpX29jaSwgYnVuZGxlX2lkKSB7CiAgICBpX3BhdGggOj0gaV9vY2kuUm9vdC5QYXRoCiAgICBwX3BhdGgxIDo9IHBfb2NpLlJvb3QuUGF0aAogICAgcHJpbnQoImFsbG93X3Jvb3RfcGF0aDogaV9wYXRoID0iLCBpX3BhdGgsICJwX3BhdGgxID0iLCBwX3BhdGgxKQoKICAgIHBfcGF0aDIgOj0gcmVwbGFjZShwX3BhdGgxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfcm9vdF9wYXRoOiBwX3BhdGgyID0iLCBwX3BhdGgyKQoKICAgIHBfcGF0aDMgOj0gcmVwbGFjZShwX3BhdGgyLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X3Jvb3RfcGF0aDogcF9wYXRoMyA9IiwgcF9wYXRoMykKCiAgICBwX3BhdGgzID09IGlfcGF0aAoKICAgIHByaW50KCJhbGxvd19yb290X3BhdGg6IHRydWUiKQp9CgojIGRldmljZSBtb3VudHMKYWxsb3dfbW91bnQocF9vY2ksIGlfbW91bnQsIGlfc3RvcmFnZXMsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcHJpbnQoImFsbG93X21vdW50OiBpX21vdW50ID0iLCBpX21vdW50KQoKICAgIHNvbWUgcF9tb3VudCBpbiBwX29jaS5Nb3VudHMKICAgIHNvbWUgaV9zdG9yYWdlIGluIGlfc3RvcmFnZXMKCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IHBfbW91bnQgPSIsIHBfbW91bnQpCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IGlfc3RvcmFnZSA9IiwgaV9zdG9yYWdlKQoKICAgIGNoZWNrX21vdW50KHBfbW91bnQsIGlfbW91bnQsIGlfc3RvcmFnZSwgYnVuZGxlX2lkLCBzYW5kYm94X2lkKQoKICAgICMgVE9ETzogYXJlIHRoZXJlIGFueSBvdGhlciByZXF1aXJlZCBwb2xpY3kgY2hlY2tzIGZvciBtb3VudHMgLSBlLmcuLAogICAgIyAgICAgICBtdWx0aXBsZSBtb3VudHMgd2l0aCBzYW1lIHNvdXJjZSBvciBkZXN0aW5hdGlvbj8KCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IHRydWUiKQp9CgpjaGVja19tb3VudChwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcF9tb3VudCA9PSBpX21vdW50CiAgICBwcmludCgiY2hlY2tfbW91bnQgMTogdHJ1ZSIpCn0KY2hlY2tfbW91bnQocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHBfbW91bnQuZGVzdGluYXRpb24gPT0gaV9tb3VudC5kZXN0aW5hdGlvbgogICAgcF9tb3VudC50eXBlXyA9PSBpX21vdW50LnR5cGVfCiAgICBwX21vdW50Lm9wdGlvbnMgPT0gaV9tb3VudC5vcHRpb25zCgogICAgbW91bnRfc291cmNlX2FsbG93cyhwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkKCiAgICBwcmludCgiY2hlY2tfbW91bnQgMjogdHJ1ZSIpCn0KCm1vdW50X3NvdXJjZV9hbGxvd3MocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHJlZ2V4MSA6PSBwX21vdW50LnNvdXJjZQogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5tb3VudF9zb3VyY2VfY3BhdGgpCiAgICByZWdleDQgOj0gcmVwbGFjZShyZWdleDMsICIkKGJ1bmRsZS1pZCkiLCBidW5kbGVfaWQpCgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMTogcmVnZXg0ID0iLCByZWdleDQpCiAgICByZWdleC5tYXRjaChyZWdleDQsIGlfbW91bnQuc291cmNlKQoKICAgIHByaW50KCJtb3VudF9zb3VyY2VfYWxsb3dzIDE6IHRydWUiKQp9Cm1vdW50X3NvdXJjZV9hbGxvd3MocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHJlZ2V4MSA6PSBwX21vdW50LnNvdXJjZQogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5tb3VudF9zb3VyY2VfY3BhdGgpCiAgICByZWdleDQgOj0gcmVwbGFjZShyZWdleDMsICIkKHNhbmRib3gtaWQpIiwgc2FuZGJveF9pZCkKCiAgICBwcmludCgibW91bnRfc291cmNlX2FsbG93cyAyOiByZWdleDQgPSIsIHJlZ2V4NCkKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4NCwgaV9tb3VudC5zb3VyY2UpCgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMjogdHJ1ZSIpCn0KbW91bnRfc291cmNlX2FsbG93cyhwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogaV9tb3VudC5zb3VyY2UgPSIsIGlfbW91bnQuc291cmNlKQogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogaV9zdG9yYWdlLm1vdW50X3BvaW50ID0iLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCgogICAgaV9tb3VudC5zb3VyY2UgPT0gaV9zdG9yYWdlLm1vdW50X3BvaW50CgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogdHJ1ZSIpCn0KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBDcmVhdGUgY29udGFpbmVyIFN0b3JhZ2VzCgphbGxvd19zdG9yYWdlcyhwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHBfY291bnQgOj0gY291bnQocF9zdG9yYWdlcykKICAgIGlfY291bnQgOj0gY291bnQoaV9zdG9yYWdlcykKICAgIHByaW50KCJhbGxvd19zdG9yYWdlczogcF9jb3VudCA9IiwgcF9jb3VudCwgImlfY291bnQgPSIsIGlfY291bnQpCgogICAgcF9jb3VudCA9PSBpX2NvdW50CgogICAgIyBHZXQgdGhlIGNvbnRhaW5lciBpbWFnZSBsYXllciBJRHMgYW5kIHZlcml0eSByb290IGhhc2hlcywgZnJvbSB0aGUgIm92ZXJsYXlmcyIgc3RvcmFnZS4KICAgIHNvbWUgb3ZlcmxheV9zdG9yYWdlIGluIHBfc3RvcmFnZXMKICAgIG92ZXJsYXlfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIHByaW50KCJhbGxvd19zdG9yYWdlczogb3ZlcmxheV9zdG9yYWdlID0iLCBvdmVybGF5X3N0b3JhZ2UpCiAgICBjb3VudChvdmVybGF5X3N0b3JhZ2Uub3B0aW9ucykgPT0gMgoKICAgIGxheWVyX2lkcyA6PSBzcGxpdChvdmVybGF5X3N0b3JhZ2Uub3B0aW9uc1swXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiBsYXllcl9pZHMgPSIsIGxheWVyX2lkcykKCiAgICByb290X2hhc2hlcyA6PSBzcGxpdChvdmVybGF5X3N0b3JhZ2Uub3B0aW9uc1sxXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiByb290X2hhc2hlcyA9Iiwgcm9vdF9oYXNoZXMpCgogICAgZXZlcnkgaV9zdG9yYWdlIGluIGlfc3RvcmFnZXMgewogICAgICAgIGFsbG93X3N0b3JhZ2UocF9zdG9yYWdlcywgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpCiAgICB9CgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiB0cnVlIikKfQoKYWxsb3dfc3RvcmFnZShwX3N0b3JhZ2VzLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgc29tZSBwX3N0b3JhZ2UgaW4gcF9zdG9yYWdlcwoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiBwX3N0b3JhZ2UgPSIsIHBfc3RvcmFnZSkKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiBpX3N0b3JhZ2UgPSIsIGlfc3RvcmFnZSkKCiAgICBwX3N0b3JhZ2UuZHJpdmVyICAgICAgICAgICA9PSBpX3N0b3JhZ2UuZHJpdmVyCiAgICBwX3N0b3JhZ2UuZHJpdmVyX29wdGlvbnMgICA9PSBpX3N0b3JhZ2UuZHJpdmVyX29wdGlvbnMKICAgIHBfc3RvcmFnZS5mc19ncm91cCAgICAgICAgID09IGlfc3RvcmFnZS5mc19ncm91cAogICAgcF9zdG9yYWdlLmZzdHlwZSAgICAgICAgICAgPT0gaV9zdG9yYWdlLmZzdHlwZQoKICAgIGFsbG93X3N0b3JhZ2Vfc291cmNlKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKQogICAgYWxsb3dfc3RvcmFnZV9vcHRpb25zKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKQogICAgYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKQoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiB0cnVlIikKfQoKYWxsb3dfc3RvcmFnZV9zb3VyY2UocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX3NvdXJjZSAxOiBzdGFydCIpCgogICAgcF9zdG9yYWdlLnNvdXJjZSA9PSBpX3N0b3JhZ2Uuc291cmNlCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDE6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX3NvdXJjZShwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDI6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCgogICAgIyBEREREOkJCOkRELkY6IERvbWFpbjpCdXM6RGV2aWNlLkZ1bmN0aW9uCiAgICAjIGh0dHBzOi8vd3d3Lmtlcm5lbC5vcmcvZG9jL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtYnVzLXBjaQogICAgcmVnZXgubWF0Y2goYF5bYS1mMC05XXs0fTpbYS1mMC05XXsyfTpbYS1mMC05XXsyfVwuW2EtZjAtOV0kYCwgaV9zdG9yYWdlLnNvdXJjZSkKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9zb3VyY2UgMjogdHJ1ZSIpCn0KCmFsbG93X3N0b3JhZ2Vfc291cmNlKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKSB7CiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9zb3VyY2UgMzogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIGlfc3RvcmFnZS5zb3VyY2UgPT0gIm5vbmUiCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDM6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX3NvdXJjZShwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDQ6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJzbWIiCgogICAgIyBQYXR0ZXJuOiAvLzxzdG9yYWdlLWFjY291bnQtbmFtZT4uZmlsZS5jb3JlLndpbmRvd3MubmV0LzxrOHMtUFZDLW5hbWU+CiAgICAjIFN0b3JhZ2UgYWNjb3VudCBuYW1lOiBodHRwczovL2xlYXJuLm1pY3Jvc29mdC5jb20vZW4tdXMvYXp1cmUvc3RvcmFnZS9jb21tb24vc3RvcmFnZS1hY2NvdW50LW92ZXJ2aWV3I3N0b3JhZ2UtYWNjb3VudC1uYW1lCiAgICAjIEs4cyBQVkMgbmFtZTogaHR0cHM6Ly9rdWJlcm5ldGVzLmlvL2RvY3MvY29uY2VwdHMvb3ZlcnZpZXcvd29ya2luZy13aXRoLW9iamVjdHMvbmFtZXMvI2Rucy1zdWJkb21haW4tbmFtZXMKICAgIHJlZ2V4Lm1hdGNoKGBeXC9cLyhbYS16MC05XXszLDI0fSlcLmZpbGVcLmNvcmVcLndpbmRvd3NcLm5ldFwvW2EtejAtOV0oW2EtejAtOS4tXXswLDI1MX1bYS16MC05XSk/JGAsIGlfc3RvcmFnZS5zb3VyY2UpCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDQ6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMTogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgIT0gIm92ZXJsYXlmcyIKICAgIHBfc3RvcmFnZS5vcHRpb25zID09IGlfc3RvcmFnZS5vcHRpb25zCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAxOiB0cnVlIikKfQphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIGNvdW50KHBfc3RvcmFnZS5vcHRpb25zKSA9PSAyCgogICAgcG9saWN5X2lkcyA6PSBzcGxpdChwX3N0b3JhZ2Uub3B0aW9uc1swXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBwb2xpY3lfaWRzID0iLCBwb2xpY3lfaWRzKQogICAgcG9saWN5X2lkcyA9PSBsYXllcl9pZHMKCiAgICBwb2xpY3lfaGFzaGVzIDo9IHNwbGl0KHBfc3RvcmFnZS5vcHRpb25zWzFdLCAiOiIpCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IHBvbGljeV9oYXNoZXMgPSIsIHBvbGljeV9oYXNoZXMpCgogICAgcF9jb3VudCA6PSBjb3VudChwb2xpY3lfaWRzKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBwX2NvdW50ID0iLCBwX2NvdW50KQogICAgcF9jb3VudCA+PSAxCiAgICBwX2NvdW50ID09IGNvdW50KHBvbGljeV9oYXNoZXMpCgogICAgaV9jb3VudCA6PSBjb3VudChpX3N0b3JhZ2Uub3B0aW9ucykKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogaV9jb3VudCA9IiwgaV9jb3VudCkKICAgIGlfY291bnQgPT0gcF9jb3VudCArIDMKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zWzBdID0iLCBpX3N0b3JhZ2Uub3B0aW9uc1swXSkKICAgIGlfc3RvcmFnZS5vcHRpb25zWzBdID09ICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQubGF5ZXItc3JjLXByZWZpeD0vdmFyL2xpYi9jb250YWluZXJkL2lvLmNvbnRhaW5lcmQuc25hcHNob3R0ZXIudjEudGFyZGV2L2xheWVycyIKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zW2lfY291bnQgLSAyXSA9IiwgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDJdKQogICAgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDJdID09ICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQub3ZlcmxheS1ydyIKCiAgICBsb3dlcmRpciA6PSBjb25jYXQoIj0iLCBbImxvd2VyZGlyIiwgcF9zdG9yYWdlLm9wdGlvbnNbMF1dKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBsb3dlcmRpciA9IiwgbG93ZXJkaXIpCgogICAgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDFdID09IGxvd2VyZGlyCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zW2lfY291bnQgLSAxXSA9IiwgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDFdKQoKICAgIGV2ZXJ5IGksIHBvbGljeV9pZCBpbiBwb2xpY3lfaWRzIHsKICAgICAgICBhbGxvd19vdmVybGF5X2xheWVyKHBvbGljeV9pZCwgcG9saWN5X2hhc2hlc1tpXSwgaV9zdG9yYWdlLm9wdGlvbnNbaSArIDFdKQogICAgfQoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogdHJ1ZSIpCn0KYWxsb3dfc3RvcmFnZV9vcHRpb25zKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKSB7CiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDM6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCiAgICBjb3VudChwX3N0b3JhZ2Uub3B0aW9ucykgPT0gMQoKICAgIHN0YXJ0c3dpdGgocF9zdG9yYWdlLm9wdGlvbnNbMF0sICIkKGhhc2giKQogICAgaGFzaF9zdWZmaXggOj0gdHJpbV9sZWZ0KHBfc3RvcmFnZS5vcHRpb25zWzBdLCAiJChoYXNoIikKCiAgICBlbmRzd2l0aChoYXNoX3N1ZmZpeCwgIikiKQogICAgaGFzaF9pbmRleCA6PSB0cmltX3JpZ2h0KGhhc2hfc3VmZml4LCAiKSIpCiAgICBpIDo9IHRvX251bWJlcihoYXNoX2luZGV4KQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAzOiBpID0iLCBpKQoKICAgIGhhc2hfb3B0aW9uIDo9IGNvbmNhdCgiPSIsIFsiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LnJvb3QtaGFzaCIsIHJvb3RfaGFzaGVzW2ldXSkKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMzogaGFzaF9vcHRpb24gPSIsIGhhc2hfb3B0aW9uKQoKICAgIGNvdW50KGlfc3RvcmFnZS5vcHRpb25zKSA9PSA0CiAgICBpX3N0b3JhZ2Uub3B0aW9uc1swXSA9PSAicm8iCiAgICBpX3N0b3JhZ2Uub3B0aW9uc1sxXSA9PSAiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmJsb2NrX2RldmljZT1maWxlIgogICAgaV9zdG9yYWdlLm9wdGlvbnNbMl0gPT0gImlvLmthdGFjb250YWluZXJzLmZzLW9wdC5pcy1sYXllciIKICAgIGlfc3RvcmFnZS5vcHRpb25zWzNdID09IGhhc2hfb3B0aW9uCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAzOiB0cnVlIikKfQphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgNDogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gInNtYiIKICAgIHBfb3B0c19jb3VudCA6PSBjb3VudChwX3N0b3JhZ2Uub3B0aW9ucykKICAgIGlfb3B0c19jb3VudCA6PSBjb3VudChpX3N0b3JhZ2Uub3B0aW9ucykKICAgIGlfb3B0c19jb3VudCA9PSBwX29wdHNfY291bnQgKyAyCgogICAgaV9vcHRfbWF0Y2hlcyA6PSBbaSB8IGkgOj0gaWR4OyBpZHggPCBwX29wdHNfY291bnQ7IHBfc3RvcmFnZS5vcHRpb25zW2lkeF0gPT0gaV9zdG9yYWdlLm9wdGlvbnNbaWR4XV0KICAgIGNvdW50KGlfb3B0X21hdGNoZXMpID09IHBfb3B0c19jb3VudAoKICAgIHN0YXJ0c3dpdGgoaV9zdG9yYWdlLm9wdGlvbnNbaV9vcHRzX2NvdW50LTJdLCAiYWRkcj0iKQogICAgY3JlZHMgPSBzcGxpdChpX3N0b3JhZ2Uub3B0aW9uc1tpX29wdHNfY291bnQtMV0sICIsIikKICAgIGNvdW50KGNyZWRzKSA9PSAyCiAgICBzdGFydHN3aXRoKGNyZWRzWzBdLCAidXNlcm5hbWU9IikKICAgIHN0YXJ0c3dpdGgoY3JlZHNbMV0sICJwYXNzd29yZD0iKQogICAgCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDQ6IHRydWUiKQp9CgphbGxvd19vdmVybGF5X2xheWVyKHBvbGljeV9pZCwgcG9saWN5X2hhc2gsIGlfb3B0aW9uKSB7CiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogcG9saWN5X2lkID0iLCBwb2xpY3lfaWQsICJwb2xpY3lfaGFzaCA9IiwgcG9saWN5X2hhc2gpCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogaV9vcHRpb24gPSIsIGlfb3B0aW9uKQoKICAgIHN0YXJ0c3dpdGgoaV9vcHRpb24sICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQubGF5ZXI9IikKICAgIGlfdmFsdWUgOj0gcmVwbGFjZShpX29wdGlvbiwgImlvLmthdGFjb250YWluZXJzLmZzLW9wdC5sYXllcj0iLCAiIikKICAgIGlfdmFsdWVfZGVjb2RlZCA6PSBiYXNlNjQuZGVjb2RlKGlfdmFsdWUpCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogaV92YWx1ZV9kZWNvZGVkID0iLCBpX3ZhbHVlX2RlY29kZWQpCgogICAgcG9saWN5X3N1ZmZpeCA6PSBjb25jYXQoIj0iLCBbInRhcixybyxpby5rYXRhY29udGFpbmVycy5mcy1vcHQuYmxvY2tfZGV2aWNlPWZpbGUsaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmlzLWxheWVyLGlvLmthdGFjb250YWluZXJzLmZzLW9wdC5yb290LWhhc2giLCBwb2xpY3lfaGFzaF0pCiAgICBwX3ZhbHVlIDo9IGNvbmNhdCgiLCIsIFtwb2xpY3lfaWQsIHBvbGljeV9zdWZmaXhdKQogICAgcHJpbnQoImFsbG93X292ZXJsYXlfbGF5ZXI6IHBfdmFsdWUgPSIsIHBfdmFsdWUpCgogICAgcF92YWx1ZSA9PSBpX3ZhbHVlX2RlY29kZWQKCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogdHJ1ZSIpCn0KCmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAidGFyIgoKICAgIHN0YXJ0c3dpdGgocF9zdG9yYWdlLm1vdW50X3BvaW50LCAiJChsYXllciIpCiAgICBtb3VudF9zdWZmaXggOj0gdHJpbV9sZWZ0KHBfc3RvcmFnZS5tb3VudF9wb2ludCwgIiQobGF5ZXIiKQoKICAgIGVuZHN3aXRoKG1vdW50X3N1ZmZpeCwgIikiKQogICAgbGF5ZXJfaW5kZXggOj0gdHJpbV9yaWdodChtb3VudF9zdWZmaXgsICIpIikKICAgIGkgOj0gdG9fbnVtYmVyKGxheWVyX2luZGV4KQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDE6IGkgPSIsIGkpCgogICAgbGF5ZXJfaWQgOj0gbGF5ZXJfaWRzW2ldCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMTogbGF5ZXJfaWQgPSIsIGxheWVyX2lkKQoKICAgIHBfbW91bnQgOj0gY29uY2F0KCIvIiwgWyIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L2xheWVycyIsIGxheWVyX2lkXSkKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCAxOiBwX21vdW50ID0iLCBwX21vdW50KQoKICAgIHBfbW91bnQgPT0gaV9zdG9yYWdlLm1vdW50X3BvaW50CgogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDE6IHRydWUiKQp9CmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAiZnVzZTMua2F0YS1vdmVybGF5IgoKICAgIG1vdW50MSA6PSByZXBsYWNlKHBfc3RvcmFnZS5tb3VudF9wb2ludCwgIiQoY3BhdGgpIiwgcG9saWN5X2RhdGEuY29tbW9uLmNwYXRoKQogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDI6IG1vdW50MiA9IiwgbW91bnQyKQoKICAgIG1vdW50MiA9PSBpX3N0b3JhZ2UubW91bnRfcG9pbnQKCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMjogdHJ1ZSIpCn0KYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKSB7CiAgICBwX3N0b3JhZ2UuZnN0eXBlID09ICJsb2NhbCIKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQyID0iLCBtb3VudDIpCgogICAgbW91bnQzIDo9IHJlcGxhY2UobW91bnQyLCAiJChzYW5kYm94LWlkKSIsIHNhbmRib3hfaWQpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQzID0iLCBtb3VudDMpCgogICAgcmVnZXgubWF0Y2gobW91bnQzLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCgogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDM6IHRydWUiKQp9CmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAiYmluZCIKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNDogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNDogbW91bnQyID0iLCBtb3VudDIpCgogICAgbW91bnQzIDo9IHJlcGxhY2UobW91bnQyLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDQ6IG1vdW50MyA9IiwgbW91bnQzKQoKICAgIHJlZ2V4Lm1hdGNoKG1vdW50MywgaV9zdG9yYWdlLm1vdW50X3BvaW50KQoKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA0OiB0cnVlIikKfQphbGxvd19tb3VudF9wb2ludChwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgYnVuZGxlX2lkLCBzYW5kYm94X2lkLCBsYXllcl9pZHMpIHsKICAgIHBfc3RvcmFnZS5mc3R5cGUgPT0gInRtcGZzIgoKICAgIG1vdW50MSA6PSBwX3N0b3JhZ2UubW91bnRfcG9pbnQKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA1OiBtb3VudDEgPSIsIG1vdW50MSkKCiAgICByZWdleC5tYXRjaChtb3VudDEsIGlfc3RvcmFnZS5tb3VudF9wb2ludCkKCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNTogdHJ1ZSIpCn0KYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKSB7CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogaV9zdG9yYWdlLm1vdW50X3BvaW50ID0iLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCiAgICBhbGxvd19kaXJlY3Rfdm9sX2RyaXZlcihwX3N0b3JhZ2UsIGlfc3RvcmFnZSkKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChzcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQyID0iLCBtb3VudDIpCgogICAgZGlyZWN0X3ZvbF9wYXRoIDo9IGlfc3RvcmFnZS5zb3VyY2UKICAgIG1vdW50MyA6PSByZXBsYWNlKG1vdW50MiwgIiQoYjY0LWRpcmVjdC12b2wtcGF0aCkiLCBiYXNlNjR1cmwuZW5jb2RlKGRpcmVjdF92b2xfcGF0aCkpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQzID0iLCBtb3VudDMpCgogICAgbW91bnQzID09IGlfc3RvcmFnZS5tb3VudF9wb2ludAoKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA2OiB0cnVlIikKfQoKYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIocF9zdG9yYWdlLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19kaXJlY3Rfdm9sX2RyaXZlciAxOiBzdGFydCIpCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCiAgICBwcmludCgiYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIgMTogdHJ1ZSIpCn0KYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIocF9zdG9yYWdlLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19kaXJlY3Rfdm9sX2RyaXZlciAyOiBzdGFydCIpCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJzbWIiCiAgICBwcmludCgiYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIgMjogdHJ1ZSIpCn0KCiMgRXhlY1Byb2Nlc3NSZXF1ZXN0LnByb2Nlc3MuQ2FwYWJpbGl0aWVzCmFsbG93X2V4ZWNfY2FwcyhpX2NhcHMpIHsKICAgIG5vdCBpX2NhcHMuQW1iaWVudAogICAgbm90IGlfY2Fwcy5Cb3VuZGluZwogICAgbm90IGlfY2Fwcy5FZmZlY3RpdmUKICAgIG5vdCBpX2NhcHMuSW5oZXJpdGFibGUKICAgIG5vdCBpX2NhcHMuUGVybWl0dGVkCn0KCiMgT0NJLlByb2Nlc3MuQ2FwYWJpbGl0aWVzCmFsbG93X2NhcHMocF9jYXBzLCBpX2NhcHMpIHsKICAgIHByaW50KCJhbGxvd19jYXBzOiBwb2xpY3kgQW1iaWVudCA9IiwgcF9jYXBzLkFtYmllbnQpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgQW1iaWVudCA9IiwgaV9jYXBzLkFtYmllbnQpCiAgICBtYXRjaF9jYXBzKHBfY2Fwcy5BbWJpZW50LCBpX2NhcHMuQW1iaWVudCkKCiAgICBwcmludCgiYWxsb3dfY2FwczogcG9saWN5IEJvdW5kaW5nID0iLCBwX2NhcHMuQm91bmRpbmcpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgQm91bmRpbmcgPSIsIGlfY2Fwcy5Cb3VuZGluZykKICAgIG1hdGNoX2NhcHMocF9jYXBzLkJvdW5kaW5nLCBpX2NhcHMuQm91bmRpbmcpCgogICAgcHJpbnQoImFsbG93X2NhcHM6IHBvbGljeSBFZmZlY3RpdmUgPSIsIHBfY2Fwcy5FZmZlY3RpdmUpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgRWZmZWN0aXZlID0iLCBpX2NhcHMuRWZmZWN0aXZlKQogICAgbWF0Y2hfY2FwcyhwX2NhcHMuRWZmZWN0aXZlLCBpX2NhcHMuRWZmZWN0aXZlKQoKICAgIHByaW50KCJhbGxvd19jYXBzOiBwb2xpY3kgSW5oZXJpdGFibGUgPSIsIHBfY2Fwcy5Jbmhlcml0YWJsZSkKICAgIHByaW50KCJhbGxvd19jYXBzOiBpbnB1dCBJbmhlcml0YWJsZSA9IiwgaV9jYXBzLkluaGVyaXRhYmxlKQogICAgbWF0Y2hfY2FwcyhwX2NhcHMuSW5oZXJpdGFibGUsIGlfY2Fwcy5Jbmhlcml0YWJsZSkKCiAgICBwcmludCgiYWxsb3dfY2FwczogcG9saWN5IFBlcm1pdHRlZCA9IiwgcF9jYXBzLlBlcm1pdHRlZCkKICAgIHByaW50KCJhbGxvd19jYXBzOiBpbnB1dCBQZXJtaXR0ZWQgPSIsIGlfY2Fwcy5QZXJtaXR0ZWQpCiAgICBtYXRjaF9jYXBzKHBfY2Fwcy5QZXJtaXR0ZWQsIGlfY2Fwcy5QZXJtaXR0ZWQpCn0KCm1hdGNoX2NhcHMocF9jYXBzLCBpX2NhcHMpIHsKICAgIHByaW50KCJtYXRjaF9jYXBzIDE6IHN0YXJ0IikKCiAgICBwX2NhcHMgPT0gaV9jYXBzCgogICAgcHJpbnQoIm1hdGNoX2NhcHMgMTogdHJ1ZSIpCn0KbWF0Y2hfY2FwcyhwX2NhcHMsIGlfY2FwcykgewogICAgcHJpbnQoIm1hdGNoX2NhcHMgMjogc3RhcnQiKQoKICAgIGNvdW50KHBfY2FwcykgPT0gMQogICAgcF9jYXBzWzBdID09ICIkKGRlZmF1bHRfY2FwcykiCgogICAgcHJpbnQoIm1hdGNoX2NhcHMgMjogZGVmYXVsdF9jYXBzID0iLCBwb2xpY3lfZGF0YS5jb21tb24uZGVmYXVsdF9jYXBzKQogICAgcG9saWN5X2RhdGEuY29tbW9uLmRlZmF1bHRfY2FwcyA9PSBpX2NhcHMKCiAgICBwcmludCgibWF0Y2hfY2FwcyAyOiB0cnVlIikKfQptYXRjaF9jYXBzKHBfY2FwcywgaV9jYXBzKSB7CiAgICBwcmludCgibWF0Y2hfY2FwcyAzOiBzdGFydCIpCgogICAgY291bnQocF9jYXBzKSA9PSAxCiAgICBwX2NhcHNbMF0gPT0gIiQocHJpdmlsZWdlZF9jYXBzKSIKCiAgICBwcmludCgibWF0Y2hfY2FwcyAzOiBwcml2aWxlZ2VkX2NhcHMgPSIsIHBvbGljeV9kYXRhLmNvbW1vbi5wcml2aWxlZ2VkX2NhcHMpCiAgICBwb2xpY3lfZGF0YS5jb21tb24ucHJpdmlsZWdlZF9jYXBzID09IGlfY2FwcwoKICAgIHByaW50KCJtYXRjaF9jYXBzIDM6IHRydWUiKQp9CgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgpjaGVja19kaXJlY3RvcnlfdHJhdmVyc2FsKGlfcGF0aCkgewogICAgbm90IHJlZ2V4Lm1hdGNoKCIoXnwvKS4uKCR8LykiLCBpX3BhdGgpCn0KCmNoZWNrX3N5bWxpbmtfc291cmNlKGlfc3JjKSB7CiAgICBpX3NyYyA9PSAiIgogICAgcHJpbnQoImNoZWNrX3N5bWxpbmtfc291cmNlIDE6IHRydWUiKQp9CmNoZWNrX3N5bWxpbmtfc291cmNlKGlfc3JjKSB7CiAgICBpX3NyYyAhPSAiIgogICAgcHJpbnQoImNoZWNrX3N5bWxpbmtfc291cmNlIDI6IGlfc3JjID0iLCBpX3NyYykKCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24uc19zb3VyY2UxLCBpX3NyYykKCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMjogdHJ1ZSIpCn0KY2hlY2tfc3ltbGlua19zb3VyY2UoaV9zcmMpIHsKICAgIGlfc3JjICE9ICIiCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMzogaV9zcmMgPSIsIGlfc3JjKQoKICAgIHJlZ2V4Lm1hdGNoKHBvbGljeV9kYXRhLmNvbW1vbi5zX3NvdXJjZTIsIGlfc3JjKQogICAgY2hlY2tfZGlyZWN0b3J5X3RyYXZlcnNhbChpX3NyYykKCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMzogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfc3RvcmFnZXMoaV9zdG9yYWdlcykgewogICAgcHJpbnQoImFsbG93X3NhbmRib3hfc3RvcmFnZXM6IGlfc3RvcmFnZXMgPSIsIGlfc3RvcmFnZXMpCgogICAgcF9zdG9yYWdlcyA6PSBwb2xpY3lfZGF0YS5zYW5kYm94LnN0b3JhZ2VzCiAgICBldmVyeSBpX3N0b3JhZ2UgaW4gaV9zdG9yYWdlcyB7CiAgICAgICAgYWxsb3dfc2FuZGJveF9zdG9yYWdlKHBfc3RvcmFnZXMsIGlfc3RvcmFnZSkKICAgIH0KCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9zdG9yYWdlczogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfc3RvcmFnZShwX3N0b3JhZ2VzLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IGlfc3RvcmFnZSA9IiwgaV9zdG9yYWdlKQoKICAgIHNvbWUgcF9zdG9yYWdlIGluIHBfc3RvcmFnZXMKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IHBfc3RvcmFnZSA9IiwgcF9zdG9yYWdlKQogICAgaV9zdG9yYWdlID09IHBfc3RvcmFnZQoKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IHRydWUiKQp9CgpDb3B5RmlsZVJlcXVlc3QgewogICAgcHJpbnQoIkNvcHlGaWxlUmVxdWVzdDogaW5wdXQucGF0aCA9IiwgaW5wdXQucGF0aCkKCiAgICBjaGVja19zeW1saW5rX3NvdXJjZShpbnB1dC5zeW1saW5rX3NyYykKICAgIGNoZWNrX2RpcmVjdG9yeV90cmF2ZXJzYWwoaW5wdXQucGF0aCkKCiAgICBzb21lIHJlZ2V4MSBpbiBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLkNvcHlGaWxlUmVxdWVzdAogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5jcGF0aCkKICAgIHJlZ2V4NCA6PSByZXBsYWNlKHJlZ2V4MywgIiQoYnVuZGxlLWlkKSIsIEJVTkRMRV9JRCkKICAgIHByaW50KCJDb3B5RmlsZVJlcXVlc3Q6IHJlZ2V4NCA9IiwgcmVnZXg0KQoKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4NCwgaW5wdXQucGF0aCkKCiAgICBwcmludCgiQ29weUZpbGVSZXF1ZXN0OiB0cnVlIikKfQoKQ3JlYXRlU2FuZGJveFJlcXVlc3QgewogICAgcHJpbnQoIkNyZWF0ZVNhbmRib3hSZXF1ZXN0OiBpbnB1dC5ndWVzdF9ob29rX3BhdGggPSIsIGlucHV0Lmd1ZXN0X2hvb2tfcGF0aCkKICAgIGNvdW50KGlucHV0Lmd1ZXN0X2hvb2tfcGF0aCkgPT0gMAoKICAgIHByaW50KCJDcmVhdGVTYW5kYm94UmVxdWVzdDogaW5wdXQua2VybmVsX21vZHVsZXMgPSIsIGlucHV0Lmtlcm5lbF9tb2R1bGVzKQogICAgY291bnQoaW5wdXQua2VybmVsX21vZHVsZXMpID09IDAKCiAgICBpX3BpZG5zIDo9IGlucHV0LnNhbmRib3hfcGlkbnMKICAgIHByaW50KCJDcmVhdGVTYW5kYm94UmVxdWVzdDogaV9waWRucyA9IiwgaV9waWRucykKICAgIGlfcGlkbnMgPT0gZmFsc2UKICAgIGFsbG93X3NhbmRib3hfc3RvcmFnZXMoaW5wdXQuc3RvcmFnZXMpCn0KCmFsbG93X2V4ZWMocF9jb250YWluZXIsIGlfcHJvY2VzcykgewogICAgcHJpbnQoImFsbG93X2V4ZWM6IHN0YXJ0IikKCiAgICBwX29jaSA9IHBfY29udGFpbmVyLk9DSQogICAgcF9zX25hbWUgPSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc19uYW1lc3BhY2UgPSBnZXRfc3RhdGVfdmFsKCJuYW1lc3BhY2UiKQogICAgYWxsb3dfcHJvYmVfcHJvY2VzcyhwX29jaS5Qcm9jZXNzLCBpX3Byb2Nlc3MsIHBfc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfZXhlYzogdHJ1ZSIpCn0KCmFsbG93X2ludGVyYWN0aXZlX2V4ZWMocF9jb250YWluZXIsIGlfcHJvY2VzcykgewogICAgcHJpbnQoImFsbG93X2ludGVyYWN0aXZlX2V4ZWM6IHN0YXJ0IikKCiAgICBwX29jaSA9IHBfY29udGFpbmVyLk9DSQogICAgcF9zX25hbWUgPSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc19uYW1lc3BhY2UgPSBnZXRfc3RhdGVfdmFsKCJuYW1lc3BhY2UiKQogICAgYWxsb3dfaW50ZXJhY3RpdmVfcHJvY2VzcyhwX29jaS5Qcm9jZXNzLCBpX3Byb2Nlc3MsIHBfc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfaW50ZXJhY3RpdmVfZXhlYzogdHJ1ZSIpCn0KCiMgVE9ETzogc2hvdWxkIG90aGVyIEV4ZWNQcm9jZXNzUmVxdWVzdCBpbnB1dCBkYXRhIGZpZWxkcyBiZSB2YWxpZGF0ZWQgYXMgd2VsbD8KRXhlY1Byb2Nlc3NSZXF1ZXN0IHsKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMTogaW5wdXQgPSIsIGlucHV0KQoKICAgIHNvbWUgcF9jb21tYW5kIGluIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuRXhlY1Byb2Nlc3NSZXF1ZXN0LmFsbG93ZWRfY29tbWFuZHMKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMTogcF9jb21tYW5kID0iLCBwX2NvbW1hbmQpCiAgICBwX2NvbW1hbmQgPT0gaW5wdXQucHJvY2Vzcy5BcmdzCgogICAgIyBUT0RPOiBtYXRjaCBwX2NvbnRhaW5lcidzIElEIHdpdGggdGhlIGlucHV0IGNvbnRhaW5lcl9pZC4KICAgIHNvbWUgcF9jb250YWluZXIgaW4gcG9saWN5X2RhdGEuY29udGFpbmVycwogICAgYWxsb3dfaW50ZXJhY3RpdmVfZXhlYyhwX2NvbnRhaW5lciwgaW5wdXQucHJvY2VzcykKCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDE6IHRydWUiKQp9CkV4ZWNQcm9jZXNzUmVxdWVzdCB7CiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDI6IGlucHV0ID0iLCBpbnB1dCkKCiAgICAjIFRPRE86IG1hdGNoIGlucHV0IGNvbnRhaW5lciBJRCB3aXRoIGl0cyBjb3JyZXNwb25kaW5nIGNvbnRhaW5lci5leGVjX2NvbW1hbmRzLgogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBzb21lIHBfY29tbWFuZCBpbiBwX2NvbnRhaW5lci5leGVjX2NvbW1hbmRzCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDI6IHBfY29tbWFuZCA9IiwgcF9jb21tYW5kKQoKICAgICMgVE9ETzogc2hvdWxkIG90aGVyIGlucHV0IGRhdGEgZmllbGRzIGJlIHZhbGlkYXRlZCBhcyB3ZWxsPwogICAgcF9jb21tYW5kID09IGlucHV0LnByb2Nlc3MuQXJncwoKICAgIGFsbG93X2V4ZWMocF9jb250YWluZXIsIGlucHV0LnByb2Nlc3MpCgogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAyOiB0cnVlIikKfQpFeGVjUHJvY2Vzc1JlcXVlc3QgewogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAzOiBpbnB1dCA9IiwgaW5wdXQpCgogICAgaV9jb21tYW5kID0gY29uY2F0KCIgIiwgaW5wdXQucHJvY2Vzcy5BcmdzKQogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAzOiBpX2NvbW1hbmQgPSIsIGlfY29tbWFuZCkKCiAgICBzb21lIHBfcmVnZXggaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5FeGVjUHJvY2Vzc1JlcXVlc3QucmVnZXgKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMzogcF9yZWdleCA9IiwgcF9yZWdleCkKCiAgICByZWdleC5tYXRjaChwX3JlZ2V4LCBpX2NvbW1hbmQpCgogICAgIyBUT0RPOiBtYXRjaCBwX2NvbnRhaW5lcidzIElEIHdpdGggdGhlIGlucHV0IGNvbnRhaW5lcl9pZC4KICAgIHNvbWUgcF9jb250YWluZXIgaW4gcG9saWN5X2RhdGEuY29udGFpbmVycwogICAgYWxsb3dfaW50ZXJhY3RpdmVfZXhlYyhwX2NvbnRhaW5lciwgaW5wdXQucHJvY2VzcykKCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDM6IHRydWUiKQp9CgpVcGRhdGVSb3V0ZXNSZXF1ZXN0IHsKICAgIHByaW50KCJVcGRhdGVSb3V0ZXNSZXF1ZXN0OiBpbnB1dCA9IiwgaW5wdXQpCiAgICBwcmludCgiVXBkYXRlUm91dGVzUmVxdWVzdDogcG9saWN5ID0iLCBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLlVwZGF0ZVJvdXRlc1JlcXVlc3QpCgogICAgaV9yb3V0ZXMgOj0gaW5wdXQucm91dGVzLlJvdXRlcwogICAgcF9zb3VyY2VfcmVnZXggPSBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLlVwZGF0ZVJvdXRlc1JlcXVlc3QuZm9yYmlkZGVuX3NvdXJjZV9yZWdleAogICAgcF9uYW1lcyA9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuVXBkYXRlUm91dGVzUmVxdWVzdC5mb3JiaWRkZW5fZGV2aWNlX25hbWVzCgogICAgZXZlcnkgaV9yb3V0ZSBpbiBpX3JvdXRlcyB7CiAgICAgICAgcHJpbnQoImlfcm91dGUuc291cmNlID0iLCBpX3JvdXRlLnNvdXJjZSkKICAgICAgICBldmVyeSBwX3JlZ2V4IGluIHBfc291cmNlX3JlZ2V4IHsKICAgICAgICAgICAgcHJpbnQoInBfcmVnZXggPSIsIHBfcmVnZXgpCiAgICAgICAgICAgIG5vdCByZWdleC5tYXRjaChwX3JlZ2V4LCBpX3JvdXRlLnNvdXJjZSkKICAgICAgICB9CgogICAgICAgIHByaW50KCJpX3JvdXRlLmRldmljZSA9IiwgaV9yb3V0ZS5kZXZpY2UpCiAgICAgICAgbm90IGlfcm91dGUuZGV2aWNlIGluIHBfbmFtZXMKICAgIH0KCiAgICBwcmludCgiVXBkYXRlUm91dGVzUmVxdWVzdDogdHJ1ZSIpCn0KClVwZGF0ZUludGVyZmFjZVJlcXVlc3QgewogICAgcHJpbnQoIlVwZGF0ZUludGVyZmFjZVJlcXVlc3Q6IGlucHV0ID0iLCBpbnB1dCkKICAgIHByaW50KCJVcGRhdGVJbnRlcmZhY2VSZXF1ZXN0OiBwb2xpY3kgPSIsIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuVXBkYXRlSW50ZXJmYWNlUmVxdWVzdCkKCiAgICBpX2ludGVyZmFjZSA6PSBpbnB1dC5pbnRlcmZhY2UKICAgIHBfZmxhZ3MgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmFsbG93X3Jhd19mbGFncwoKICAgICMgVHlwaWNhbGx5LCBqdXN0IElGRl9OT0FSUCBpcyB1c2VkLgogICAgYml0cy5hbmQoaV9pbnRlcmZhY2UucmF3X2ZsYWdzLCBiaXRzLm5lZ2F0ZShwX2ZsYWdzKSkgPT0gMAoKICAgIHBfbmFtZXMgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmZvcmJpZGRlbl9uYW1lcwoKICAgIG5vdCBpX2ludGVyZmFjZS5uYW1lIGluIHBfbmFtZXMKCiAgICBwX2h3YWRkcnMgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmZvcmJpZGRlbl9od19hZGRycwoKICAgIG5vdCBpX2ludGVyZmFjZS5od0FkZHIgaW4gcF9od2FkZHJzCgogICAgcHJpbnQoIlVwZGF0ZUludGVyZmFjZVJlcXVlc3Q6IHRydWUiKQp9CgpDbG9zZVN0ZGluUmVxdWVzdCB7CiAgICBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLkNsb3NlU3RkaW5SZXF1ZXN0ID09IHRydWUKfQoKUmVhZFN0cmVhbVJlcXVlc3QgewogICAgcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5SZWFkU3RyZWFtUmVxdWVzdCA9PSB0cnVlCn0KClVwZGF0ZUVwaGVtZXJhbE1vdW50c1JlcXVlc3QgewogICAgcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVFcGhlbWVyYWxNb3VudHNSZXF1ZXN0ID09IHRydWUKfQoKV3JpdGVTdHJlYW1SZXF1ZXN0IHsKICAgIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuV3JpdGVTdHJlYW1SZXF1ZXN0ID09IHRydWUKfQoKcG9saWN5X2RhdGEgOj0gewogICJjb250YWluZXJzIjogWwogICAgewogICAgICAiT0NJIjogewogICAgICAgICJWZXJzaW9uIjogIjEuMS4wLXJjLjEiLAogICAgICAgICJQcm9jZXNzIjogewogICAgICAgICAgIlRlcm1pbmFsIjogZmFsc2UsCiAgICAgICAgICAiVXNlciI6IHsKICAgICAgICAgICAgIlVJRCI6IDY1NTM1LAogICAgICAgICAgICAiR0lEIjogNjU1MzUsCiAgICAgICAgICAgICJBZGRpdGlvbmFsR2lkcyI6IFtdLAogICAgICAgICAgICAiVXNlcm5hbWUiOiAiIgogICAgICAgICAgfSwKICAgICAgICAgICJEZXByZWNhdGVkQXJncyI6IFsKICAgICAgICAgICAgIi9wYXVzZSIKICAgICAgICAgIF0sCiAgICAgICAgICAiQXJncyI6IFsKICAgICAgICAgICAgIi9wYXVzZSIKICAgICAgICAgIF0sCiAgICAgICAgICAiRW52IjogWwogICAgICAgICAgICAiUEFUSD0vdXNyL2xvY2FsL3NiaW46L3Vzci9sb2NhbC9iaW46L3Vzci9zYmluOi91c3IvYmluOi9zYmluOi9iaW4iCiAgICAgICAgICBdLAogICAgICAgICAgIkN3ZCI6ICIvIiwKICAgICAgICAgICJDYXBhYmlsaXRpZXMiOiB7CiAgICAgICAgICAgICJBbWJpZW50IjogW10sCiAgICAgICAgICAgICJCb3VuZGluZyI6IFsKICAgICAgICAgICAgICAiJChkZWZhdWx0X2NhcHMpIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiRWZmZWN0aXZlIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJJbmhlcml0YWJsZSI6IFtdLAogICAgICAgICAgICAiUGVybWl0dGVkIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICAiTm9OZXdQcml2aWxlZ2VzIjogdHJ1ZQogICAgICAgIH0sCiAgICAgICAgIlJvb3QiOiB7CiAgICAgICAgICAiUGF0aCI6ICIkKGNwYXRoKS8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgIlJlYWRvbmx5IjogdHJ1ZQogICAgICAgIH0sCiAgICAgICAgIk1vdW50cyI6IFsKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9wcm9jIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJwcm9jIiwKICAgICAgICAgICAgInR5cGVfIjogInByb2MiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2IiwKICAgICAgICAgICAgInNvdXJjZSI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJzdHJpY3RhdGltZSIsCiAgICAgICAgICAgICAgIm1vZGU9NzU1IiwKICAgICAgICAgICAgICAic2l6ZT02NTUzNmsiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L3B0cyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiZGV2cHRzIiwKICAgICAgICAgICAgInR5cGVfIjogImRldnB0cyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJuZXdpbnN0YW5jZSIsCiAgICAgICAgICAgICAgInB0bXhtb2RlPTA2NjYiLAogICAgICAgICAgICAgICJtb2RlPTA2MjAiLAogICAgICAgICAgICAgICJnaWQ9NSIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvc2htIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L3NobSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi9tcXVldWUiLAogICAgICAgICAgICAic291cmNlIjogIm1xdWV1ZSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJtcXVldWUiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvc3lzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJzeXNmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJzeXNmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2V0Yy9yZXNvbHYuY29uZiIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClyZXNvbHYuY29uZiQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJvIiwKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9kZXYiLAogICAgICAgICAgICAgICJub2V4ZWMiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0KICAgICAgICBdLAogICAgICAgICJBbm5vdGF0aW9ucyI6IHsKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmJ1bmRsZV9wYXRoIjogIi9ydW4vY29udGFpbmVyZC9pby5jb250YWluZXJkLnJ1bnRpbWUudjIudGFzay9rOHMuaW8vJChidW5kbGUtaWQpIiwKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIjogInBvZF9zYW5kYm94IiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSI6ICJzYW5kYm94IiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWlkIjogIl5bYS16MC05XXs2NH0kIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWxvZy1kaXJlY3RvcnkiOiAiXi92YXIvbG9nL3BvZHMvJChzYW5kYm94LW5hbWVzcGFjZSlfJChzYW5kYm94LW5hbWUpX1swLTlhLWZdezh9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezEyfSQiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZXNwYWNlIjogIiIsCiAgICAgICAgICAibmVyZGN0bC9uZXR3b3JrLW5hbWVzcGFjZSI6ICJeL3Zhci9ydW4vbmV0bnMvY25pLVswLTlhLWZdezh9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezEyfSQiCiAgICAgICAgfSwKICAgICAgICAiTGludXgiOiB7CiAgICAgICAgICAiTmFtZXNwYWNlcyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICJUeXBlIjogImlwYyIsCiAgICAgICAgICAgICAgIlBhdGgiOiAiIgogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgIlR5cGUiOiAidXRzIiwKICAgICAgICAgICAgICAiUGF0aCI6ICIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiVHlwZSI6ICJtb3VudCIsCiAgICAgICAgICAgICAgIlBhdGgiOiAiIgogICAgICAgICAgICB9CiAgICAgICAgICBdLAogICAgICAgICAgIk1hc2tlZFBhdGhzIjogWwogICAgICAgICAgICAiL3Byb2MvYWNwaSIsCiAgICAgICAgICAgICIvcHJvYy9hc291bmQiLAogICAgICAgICAgICAiL3Byb2Mva2NvcmUiLAogICAgICAgICAgICAiL3Byb2Mva2V5cyIsCiAgICAgICAgICAgICIvcHJvYy9sYXRlbmN5X3N0YXRzIiwKICAgICAgICAgICAgIi9wcm9jL3RpbWVyX2xpc3QiLAogICAgICAgICAgICAiL3Byb2MvdGltZXJfc3RhdHMiLAogICAgICAgICAgICAiL3Byb2Mvc2NoZWRfZGVidWciLAogICAgICAgICAgICAiL3N5cy9maXJtd2FyZSIsCiAgICAgICAgICAgICIvcHJvYy9zY3NpIgogICAgICAgICAgXSwKICAgICAgICAgICJSZWFkb25seVBhdGhzIjogWwogICAgICAgICAgICAiL3Byb2MvYnVzIiwKICAgICAgICAgICAgIi9wcm9jL2ZzIiwKICAgICAgICAgICAgIi9wcm9jL2lycSIsCiAgICAgICAgICAgICIvcHJvYy9zeXMiLAogICAgICAgICAgICAiL3Byb2Mvc3lzcnEtdHJpZ2dlciIKICAgICAgICAgIF0sCiAgICAgICAgICAiRGV2aWNlcyI6IFtdLAogICAgICAgICAgIlN5c2N0bCI6IHsKICAgICAgICAgICAgIm5ldC5pcHY0LmlwX3VucHJpdmlsZWdlZF9wb3J0X3N0YXJ0IjogIjAiLAogICAgICAgICAgICAibmV0LmlwdjQucGluZ19ncm91cF9yYW5nZSI6ICIwIDIxNDc0ODM2NDciCiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9LAogICAgICAic3RvcmFnZXMiOiBbCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJibGsiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogInRhciIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIiQoaGFzaDApIgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGxheWVyMCkiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJvdmVybGF5ZnMiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogImZ1c2UzLmthdGEtb3ZlcmxheSIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIjVhNWFhZDgwMDU1ZmYyMDAxMmE1MGRjMjVmOGRmN2EyOTkyNDQ3NDMyNGQ2NWY3ZDUzMDZlZThlZTI3ZmY3MWQiLAogICAgICAgICAgICAiODE3MjUwZjFhM2UzMzZkYTc2ZjViZDNmYTc4NGUxYjI2ZDk1OWI5YzEzMTg3NjgxNWJhMjYwNDA0OGI3MGMxOCIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChjcGF0aCkvJChidW5kbGUtaWQpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9CiAgICAgIF0sCiAgICAgICJkZXZpY2VzIjogW10sCiAgICAgICJzYW5kYm94X3BpZG5zIjogZmFsc2UsCiAgICAgICJleGVjX2NvbW1hbmRzIjogW10sCiAgICAgICJlbnZfbWFwIjogewogICAgICAgICJQQVRIIjogIi91c3IvbG9jYWwvc2JpbjovdXNyL2xvY2FsL2JpbjovdXNyL3NiaW46L3Vzci9iaW46L3NiaW46L2JpbiIKICAgICAgfQogICAgfSwKICAgIHsKICAgICAgIk9DSSI6IHsKICAgICAgICAiVmVyc2lvbiI6ICIxLjEuMC1yYy4xIiwKICAgICAgICAiUHJvY2VzcyI6IHsKICAgICAgICAgICJUZXJtaW5hbCI6IGZhbHNlLAogICAgICAgICAgIlVzZXIiOiB7CiAgICAgICAgICAgICJVSUQiOiAwLAogICAgICAgICAgICAiR0lEIjogMCwKICAgICAgICAgICAgIkFkZGl0aW9uYWxHaWRzIjogW10sCiAgICAgICAgICAgICJVc2VybmFtZSI6ICIiCiAgICAgICAgICB9LAogICAgICAgICAgIkRlcHJlY2F0ZWRBcmdzIjogWwogICAgICAgICAgICAiL3Vzci9iaW4vZHVtYi1pbml0IiwKICAgICAgICAgICAgIi9iaW4vYmFzaCIsCiAgICAgICAgICAgICIvcnVuLnNoIgogICAgICAgICAgXSwKICAgICAgICAgICJBcmdzIjogWwogICAgICAgICAgICAiL3Vzci9iaW4vZHVtYi1pbml0IiwKICAgICAgICAgICAgIi9iaW4vYmFzaCIsCiAgICAgICAgICAgICIvcnVuLnNoIgogICAgICAgICAgXSwKICAgICAgICAgICJFbnYiOiBbCiAgICAgICAgICAgICJQQVRIPS91c3IvbG9jYWwvc2JpbjovdXNyL2xvY2FsL2JpbjovdXNyL3NiaW46L3Vzci9iaW46L3NiaW46L2JpbjovdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQvYmluOi91c3IvbG9jYWwvYXBhY2hlLWNhc3NhbmRyYS0zLjExLjIvYmluIiwKICAgICAgICAgICAgIkNBU1NBTkRSQV9IT01FPS91c3IvbG9jYWwvYXBhY2hlLWNhc3NhbmRyYS0zLjExLjIiLAogICAgICAgICAgICAiQ0FTU0FORFJBX0NPTkY9L2V0Yy9jYXNzYW5kcmEiLAogICAgICAgICAgICAiQ0FTU0FORFJBX0RBVEE9L2Nhc3NhbmRyYV9kYXRhIiwKICAgICAgICAgICAgIkNBU1NBTkRSQV9MT0dTPS92YXIvbG9nL2Nhc3NhbmRyYSIsCiAgICAgICAgICAgICJKQVZBX0hPTUU9L3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0IiwKICAgICAgICAgICAgIkhPU1ROQU1FPSQoaG9zdC1uYW1lKSIsCiAgICAgICAgICAgICJNQVhfSEVBUF9TSVpFPTUxMk0iLAogICAgICAgICAgICAiSEVBUF9ORVdTSVpFPTEwME0iLAogICAgICAgICAgICAiUE9EX05BTUVTUEFDRT0kKHNhbmRib3gtbmFtZXNwYWNlKSIsCiAgICAgICAgICAgICJDQVNTQU5EUkFfU0VFRFM9Y2Fzc2FuZHJhLTAuY2Fzc2FuZHJhLiQoc2FuZGJveC1uYW1lc3BhY2UpLnN2Yy5jbHVzdGVyLmxvY2FsIiwKICAgICAgICAgICAgIkNBU1NBTkRSQV9DTFVTVEVSX05BTUU9SzhEZW1vIiwKICAgICAgICAgICAgIkNBU1NBTkRSQV9EQz1EQzEtSzhEZW1vIiwKICAgICAgICAgICAgIkNBU1NBTkRSQV9SQUNLPVJhY2sxLUs4RGVtbyIsCiAgICAgICAgICAgICJQT0RfSVA9JChwb2QtaXApIgogICAgICAgICAgXSwKICAgICAgICAgICJDd2QiOiAiLyIsCiAgICAgICAgICAiQ2FwYWJpbGl0aWVzIjogewogICAgICAgICAgICAiQW1iaWVudCI6IFtdLAogICAgICAgICAgICAiQm91bmRpbmciOiBbCiAgICAgICAgICAgICAgIkNBUF9DSE9XTiIsCiAgICAgICAgICAgICAgIkNBUF9EQUNfT1ZFUlJJREUiLAogICAgICAgICAgICAgICJDQVBfRlNFVElEIiwKICAgICAgICAgICAgICAiQ0FQX0ZPV05FUiIsCiAgICAgICAgICAgICAgIkNBUF9NS05PRCIsCiAgICAgICAgICAgICAgIkNBUF9ORVRfUkFXIiwKICAgICAgICAgICAgICAiQ0FQX1NFVEdJRCIsCiAgICAgICAgICAgICAgIkNBUF9TRVRVSUQiLAogICAgICAgICAgICAgICJDQVBfU0VURkNBUCIsCiAgICAgICAgICAgICAgIkNBUF9TRVRQQ0FQIiwKICAgICAgICAgICAgICAiQ0FQX05FVF9CSU5EX1NFUlZJQ0UiLAogICAgICAgICAgICAgICJDQVBfU1lTX0NIUk9PVCIsCiAgICAgICAgICAgICAgIkNBUF9LSUxMIiwKICAgICAgICAgICAgICAiQ0FQX0FVRElUX1dSSVRFIiwKICAgICAgICAgICAgICAiQ0FQX0lQQ19MT0NLIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiRWZmZWN0aXZlIjogWwogICAgICAgICAgICAgICJDQVBfQ0hPV04iLAogICAgICAgICAgICAgICJDQVBfREFDX09WRVJSSURFIiwKICAgICAgICAgICAgICAiQ0FQX0ZTRVRJRCIsCiAgICAgICAgICAgICAgIkNBUF9GT1dORVIiLAogICAgICAgICAgICAgICJDQVBfTUtOT0QiLAogICAgICAgICAgICAgICJDQVBfTkVUX1JBVyIsCiAgICAgICAgICAgICAgIkNBUF9TRVRHSUQiLAogICAgICAgICAgICAgICJDQVBfU0VUVUlEIiwKICAgICAgICAgICAgICAiQ0FQX1NFVEZDQVAiLAogICAgICAgICAgICAgICJDQVBfU0VUUENBUCIsCiAgICAgICAgICAgICAgIkNBUF9ORVRfQklORF9TRVJWSUNFIiwKICAgICAgICAgICAgICAiQ0FQX1NZU19DSFJPT1QiLAogICAgICAgICAgICAgICJDQVBfS0lMTCIsCiAgICAgICAgICAgICAgIkNBUF9BVURJVF9XUklURSIsCiAgICAgICAgICAgICAgIkNBUF9JUENfTE9DSyIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgIkluaGVyaXRhYmxlIjogW10sCiAgICAgICAgICAgICJQZXJtaXR0ZWQiOiBbCiAgICAgICAgICAgICAgIkNBUF9DSE9XTiIsCiAgICAgICAgICAgICAgIkNBUF9EQUNfT1ZFUlJJREUiLAogICAgICAgICAgICAgICJDQVBfRlNFVElEIiwKICAgICAgICAgICAgICAiQ0FQX0ZPV05FUiIsCiAgICAgICAgICAgICAgIkNBUF9NS05PRCIsCiAgICAgICAgICAgICAgIkNBUF9ORVRfUkFXIiwKICAgICAgICAgICAgICAiQ0FQX1NFVEdJRCIsCiAgICAgICAgICAgICAgIkNBUF9TRVRVSUQiLAogICAgICAgICAgICAgICJDQVBfU0VURkNBUCIsCiAgICAgICAgICAgICAgIkNBUF9TRVRQQ0FQIiwKICAgICAgICAgICAgICAiQ0FQX05FVF9CSU5EX1NFUlZJQ0UiLAogICAgICAgICAgICAgICJDQVBfU1lTX0NIUk9PVCIsCiAgICAgICAgICAgICAgIkNBUF9LSUxMIiwKICAgICAgICAgICAgICAiQ0FQX0FVRElUX1dSSVRFIiwKICAgICAgICAgICAgICAiQ0FQX0lQQ19MT0NLIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgIk5vTmV3UHJpdmlsZWdlcyI6IGZhbHNlCiAgICAgICAgfSwKICAgICAgICAiUm9vdCI6IHsKICAgICAgICAgICJQYXRoIjogIiQoY3BhdGgpLyQoYnVuZGxlLWlkKSIsCiAgICAgICAgICAiUmVhZG9ubHkiOiBmYWxzZQogICAgICAgIH0sCiAgICAgICAgIk1vdW50cyI6IFsKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9wcm9jIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJwcm9jIiwKICAgICAgICAgICAgInR5cGVfIjogInByb2MiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2IiwKICAgICAgICAgICAgInNvdXJjZSI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJzdHJpY3RhdGltZSIsCiAgICAgICAgICAgICAgIm1vZGU9NzU1IiwKICAgICAgICAgICAgICAic2l6ZT02NTUzNmsiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L3B0cyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiZGV2cHRzIiwKICAgICAgICAgICAgInR5cGVfIjogImRldnB0cyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJuZXdpbnN0YW5jZSIsCiAgICAgICAgICAgICAgInB0bXhtb2RlPTA2NjYiLAogICAgICAgICAgICAgICJtb2RlPTA2MjAiLAogICAgICAgICAgICAgICJnaWQ9NSIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvc2htIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L3NobSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi9tcXVldWUiLAogICAgICAgICAgICAic291cmNlIjogIm1xdWV1ZSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJtcXVldWUiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvc3lzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJzeXNmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJzeXNmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL3N5cy9mcy9jZ3JvdXAiLAogICAgICAgICAgICAic291cmNlIjogImNncm91cCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJjZ3JvdXAiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiLAogICAgICAgICAgICAgICJyZWxhdGltZSIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2V0Yy9ob3N0cyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClob3N0cyQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicnciCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L3Rlcm1pbmF0aW9uLWxvZyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeCl0ZXJtaW5hdGlvbi1sb2ckIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJ3IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2V0Yy9ob3N0bmFtZSIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClob3N0bmFtZSQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicnciCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZXRjL3Jlc29sdi5jb25mIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KXJlc29sdi5jb25mJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJydyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi92YXIvcnVuL3NlY3JldHMva3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudCIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClzZXJ2aWNlYWNjb3VudCQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicm8iCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvdmFyL3J1bi9zZWNyZXRzL2F6dXJlL3Rva2VucyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeCl0b2tlbnMkIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Nhc3NhbmRyYV9kYXRhIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KWNhc3NhbmRyYV9kYXRhJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJydyIKICAgICAgICAgICAgXQogICAgICAgICAgfQogICAgICAgIF0sCiAgICAgICAgIkFubm90YXRpb25zIjogewogICAgICAgICAgImlvLmthdGFjb250YWluZXJzLnBrZy5vY2kuYnVuZGxlX3BhdGgiOiAiL3J1bi9jb250YWluZXJkL2lvLmNvbnRhaW5lcmQucnVudGltZS52Mi50YXNrL2s4cy5pby8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgImlvLmthdGFjb250YWluZXJzLnBrZy5vY2kuY29udGFpbmVyX3R5cGUiOiAicG9kX2NvbnRhaW5lciIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLW5hbWUiOiAiY2Fzc2FuZHJhIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSI6ICJjb250YWluZXIiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLmltYWdlLW5hbWUiOiAiZ2NyLmlvL2dvb2dsZS1zYW1wbGVzL2Nhc3NhbmRyYTp2MTMiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtaWQiOiAiXlthLXowLTldezY0fSQiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZXNwYWNlIjogIiIKICAgICAgICB9LAogICAgICAgICJMaW51eCI6IHsKICAgICAgICAgICJOYW1lc3BhY2VzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgIlR5cGUiOiAiaXBjIiwKICAgICAgICAgICAgICAiUGF0aCI6ICIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiVHlwZSI6ICJ1dHMiLAogICAgICAgICAgICAgICJQYXRoIjogIiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJUeXBlIjogIm1vdW50IiwKICAgICAgICAgICAgICAiUGF0aCI6ICIiCiAgICAgICAgICAgIH0KICAgICAgICAgIF0sCiAgICAgICAgICAiTWFza2VkUGF0aHMiOiBbCiAgICAgICAgICAgICIvcHJvYy9hY3BpIiwKICAgICAgICAgICAgIi9wcm9jL2tjb3JlIiwKICAgICAgICAgICAgIi9wcm9jL2tleXMiLAogICAgICAgICAgICAiL3Byb2MvbGF0ZW5jeV9zdGF0cyIsCiAgICAgICAgICAgICIvcHJvYy90aW1lcl9saXN0IiwKICAgICAgICAgICAgIi9wcm9jL3RpbWVyX3N0YXRzIiwKICAgICAgICAgICAgIi9wcm9jL3NjaGVkX2RlYnVnIiwKICAgICAgICAgICAgIi9wcm9jL3Njc2kiLAogICAgICAgICAgICAiL3N5cy9maXJtd2FyZSIKICAgICAgICAgIF0sCiAgICAgICAgICAiUmVhZG9ubHlQYXRocyI6IFsKICAgICAgICAgICAgIi9wcm9jL2Fzb3VuZCIsCiAgICAgICAgICAgICIvcHJvYy9idXMiLAogICAgICAgICAgICAiL3Byb2MvZnMiLAogICAgICAgICAgICAiL3Byb2MvaXJxIiwKICAgICAgICAgICAgIi9wcm9jL3N5cyIsCiAgICAgICAgICAgICIvcHJvYy9zeXNycS10cmlnZ2VyIgogICAgICAgICAgXSwKICAgICAgICAgICJEZXZpY2VzIjogW10sCiAgICAgICAgICAiU3lzY3RsIjogewogICAgICAgICAgICAibmV0LmlwdjQuaXBfdW5wcml2aWxlZ2VkX3BvcnRfc3RhcnQiOiAiMCIsCiAgICAgICAgICAgICJuZXQuaXB2NC5waW5nX2dyb3VwX3JhbmdlIjogIjAgMjE0NzQ4MzY0NyIKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0sCiAgICAgICJzdG9yYWdlcyI6IFsKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoMCkiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXIwKSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoMSkiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXIxKSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoMikiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXIyKSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogIm92ZXJsYXlmcyIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAiZnVzZTMua2F0YS1vdmVybGF5IiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiZTU5MTRjZmMxNDdlMTNlNjViMjliMzZmMzE4NzU2YzFlODUxYTgwMDRhNTBmMTYyMGNmNjNjNGRiNDljNjZiODpjNWQyMmZkYTE4NGU5ZTgzZGIyMDUxY2Y3OGEzODg1MDc1M2Q3YTQ0YzcwMDhlNzEwODQ2N2M1N2JjNTgwNTRkOjVmOGEyZWNlY2JlNjBlZmUyZGMxNmU4MGIzNjVhNDBhNDE4OGU1N2RkNGUzZDZjMjVlN2U1MTNhNjJkNjdjMTUiLAogICAgICAgICAgICAiNzQyNTFkMTU0ZjE3MWZmNzc3NTM2NDZkNjhlNWIyMjgwYWMyZTQ3MzNjYTBlMTEwMTg4MGZkYzBkMmM5NDI0ZTozMGM4NmMwZWU0NTVhMzZjODk0NzI1NTRjZDRjMjMxOWFlNDc5MWZkZjEyNzFiYTg5NzkzYjY2MmZiOTNmNDUwOjAxY2RiZDhmNDEwYWMyMDc5ZTAzMGUyMTNjYzFkMmQxZDkzMzU4YjgzMDVkZGYxMjUyNTQ5NDZhOGMzNmM4MjciCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQoY3BhdGgpLyQoYnVuZGxlLWlkKSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImxvY2FsIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICJsb2NhbCIsCiAgICAgICAgICAiZnN0eXBlIjogImJpbmQiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICJydyIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiL2Nhc3NhbmRyYV9kYXRhIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9CiAgICAgIF0sCiAgICAgICJkZXZpY2VzIjogW10sCiAgICAgICJzYW5kYm94X3BpZG5zIjogZmFsc2UsCiAgICAgICJleGVjX2NvbW1hbmRzIjogWwogICAgICAgIFsKICAgICAgICAgICIvYmluL2Jhc2giLAogICAgICAgICAgIi1jIiwKICAgICAgICAgICIvcmVhZHktcHJvYmUuc2giCiAgICAgICAgXSwKICAgICAgICBbCiAgICAgICAgICAiL2Jpbi9zaCIsCiAgICAgICAgICAiLWMiLAogICAgICAgICAgIm5vZGV0b29sIGRyYWluIgogICAgICAgIF0KICAgICAgXSwKICAgICAgImVudl9tYXAiOiB7CiAgICAgICAgIkNBU1NBTkRSQV9DTFVTVEVSX05BTUUiOiAiSzhEZW1vIiwKICAgICAgICAiQ0FTU0FORFJBX0NPTkYiOiAiL2V0Yy9jYXNzYW5kcmEiLAogICAgICAgICJDQVNTQU5EUkFfREFUQSI6ICIvY2Fzc2FuZHJhX2RhdGEiLAogICAgICAgICJDQVNTQU5EUkFfREMiOiAiREMxLUs4RGVtbyIsCiAgICAgICAgIkNBU1NBTkRSQV9IT01FIjogIi91c3IvbG9jYWwvYXBhY2hlLWNhc3NhbmRyYS0zLjExLjIiLAogICAgICAgICJDQVNTQU5EUkFfTE9HUyI6ICIvdmFyL2xvZy9jYXNzYW5kcmEiLAogICAgICAgICJDQVNTQU5EUkFfUkFDSyI6ICJSYWNrMS1LOERlbW8iLAogICAgICAgICJDQVNTQU5EUkFfU0VFRFMiOiAiY2Fzc2FuZHJhLTAuY2Fzc2FuZHJhLiQoc2FuZGJveC1uYW1lc3BhY2UpLnN2Yy5jbHVzdGVyLmxvY2FsIiwKICAgICAgICAiSEVBUF9ORVdTSVpFIjogIjEwME0iLAogICAgICAgICJIT1NUTkFNRSI6ICIkKGhvc3QtbmFtZSkiLAogICAgICAgICJKQVZBX0hPTUUiOiAiL3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0IiwKICAgICAgICAiTUFYX0hFQVBfU0laRSI6ICI1MTJNIiwKICAgICAgICAiUEFUSCI6ICIvdXNyL2xvY2FsL3NiaW46L3Vzci9sb2NhbC9iaW46L3Vzci9zYmluOi91c3IvYmluOi9zYmluOi9iaW46L3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0L2JpbjovdXNyL2xvY2FsL2FwYWNoZS1jYXNzYW5kcmEtMy4xMS4yL2JpbiIsCiAgICAgICAgIlBPRF9JUCI6ICIkKHBvZC1pcCkiLAogICAgICAgICJQT0RfTkFNRVNQQUNFIjogIiQoc2FuZGJveC1uYW1lc3BhY2UpIgogICAgICB9CiAgICB9CiAgXSwKICAiY29tbW9uIjogewogICAgImNwYXRoIjogIi9ydW4va2F0YS1jb250YWluZXJzL3NoYXJlZC9jb250YWluZXJzIiwKICAgICJtb3VudF9zb3VyY2VfY3BhdGgiOiAiL3J1bi9rYXRhLWNvbnRhaW5lcnMvc2hhcmVkL2NvbnRhaW5lcnMiLAogICAgInNmcHJlZml4IjogIl4kKGNwYXRoKS8kKGJ1bmRsZS1pZCktW2EtejAtOV17MTZ9LSIsCiAgICAic3BhdGgiOiAiL3J1bi9rYXRhLWNvbnRhaW5lcnMvc2FuZGJveC9zdG9yYWdlIiwKICAgICJpcHY0X2EiOiAiKChbMC05XXxbMS05XVswLTldfDFbMC05XXsyfXwyWzAtNF1bMC05XXwyNVswLTVdKVxcLil7M30oWzAtOV18WzEtOV1bMC05XXwxWzAtOV17Mn18MlswLTRdWzAtOV18MjVbMC01XSkiLAogICAgImlwX3AiOiAiWzAtOV17MSw1fSIsCiAgICAic3ZjX25hbWUiOiAiW0EtWl9cXC5cXC1dKyIsCiAgICAiZG5zX2xhYmVsIjogIlthLXpBLVowLTlfXFwuXFwtXSsiLAogICAgInNfc291cmNlMSI6ICJeLi4yWzAtOV17M31fWzAtMV1bMC05XV9bMC0zXVswLTldX1swLTJdWzAtOV1fWzAtNV1bMC05XV9bMC01XVswLTldXFwuWzAtOV17MSwxMH0kIiwKICAgICJzX3NvdXJjZTIiOiAiXi4uZGF0YS8iLAogICAgImRuc19zdWJkb21haW4iOiAiXlthLXowLTldKFstYS16MC05XSpbYS16MC05XSk/JCIsCiAgICAicG9kX3VpZCI6ICJeWzAtOWEtZkEtRl17OH0tWzAtOWEtZkEtRl17NH0tWzAtOWEtZkEtRl17NH0tWzAtOWEtZkEtRl17NH0tWzAtOWEtZkEtRl17MTJ9JCIsCiAgICAiZGVmYXVsdF9jYXBzIjogWwogICAgICAiQ0FQX0NIT1dOIiwKICAgICAgIkNBUF9EQUNfT1ZFUlJJREUiLAogICAgICAiQ0FQX0ZTRVRJRCIsCiAgICAgICJDQVBfRk9XTkVSIiwKICAgICAgIkNBUF9NS05PRCIsCiAgICAgICJDQVBfTkVUX1JBVyIsCiAgICAgICJDQVBfU0VUR0lEIiwKICAgICAgIkNBUF9TRVRVSUQiLAogICAgICAiQ0FQX1NFVEZDQVAiLAogICAgICAiQ0FQX1NFVFBDQVAiLAogICAgICAiQ0FQX05FVF9CSU5EX1NFUlZJQ0UiLAogICAgICAiQ0FQX1NZU19DSFJPT1QiLAogICAgICAiQ0FQX0tJTEwiLAogICAgICAiQ0FQX0FVRElUX1dSSVRFIgogICAgXSwKICAgICJwcml2aWxlZ2VkX2NhcHMiOiBbCiAgICAgICJDQVBfQ0hPV04iLAogICAgICAiQ0FQX0RBQ19PVkVSUklERSIsCiAgICAgICJDQVBfREFDX1JFQURfU0VBUkNIIiwKICAgICAgIkNBUF9GT1dORVIiLAogICAgICAiQ0FQX0ZTRVRJRCIsCiAgICAgICJDQVBfS0lMTCIsCiAgICAgICJDQVBfU0VUR0lEIiwKICAgICAgIkNBUF9TRVRVSUQiLAogICAgICAiQ0FQX1NFVFBDQVAiLAogICAgICAiQ0FQX0xJTlVYX0lNTVVUQUJMRSIsCiAgICAgICJDQVBfTkVUX0JJTkRfU0VSVklDRSIsCiAgICAgICJDQVBfTkVUX0JST0FEQ0FTVCIsCiAgICAgICJDQVBfTkVUX0FETUlOIiwKICAgICAgIkNBUF9ORVRfUkFXIiwKICAgICAgIkNBUF9JUENfTE9DSyIsCiAgICAgICJDQVBfSVBDX09XTkVSIiwKICAgICAgIkNBUF9TWVNfTU9EVUxFIiwKICAgICAgIkNBUF9TWVNfUkFXSU8iLAogICAgICAiQ0FQX1NZU19DSFJPT1QiLAogICAgICAiQ0FQX1NZU19QVFJBQ0UiLAogICAgICAiQ0FQX1NZU19QQUNDVCIsCiAgICAgICJDQVBfU1lTX0FETUlOIiwKICAgICAgIkNBUF9TWVNfQk9PVCIsCiAgICAgICJDQVBfU1lTX05JQ0UiLAogICAgICAiQ0FQX1NZU19SRVNPVVJDRSIsCiAgICAgICJDQVBfU1lTX1RJTUUiLAogICAgICAiQ0FQX1NZU19UVFlfQ09ORklHIiwKICAgICAgIkNBUF9NS05PRCIsCiAgICAgICJDQVBfTEVBU0UiLAogICAgICAiQ0FQX0FVRElUX1dSSVRFIiwKICAgICAgIkNBUF9BVURJVF9DT05UUk9MIiwKICAgICAgIkNBUF9TRVRGQ0FQIiwKICAgICAgIkNBUF9NQUNfT1ZFUlJJREUiLAogICAgICAiQ0FQX01BQ19BRE1JTiIsCiAgICAgICJDQVBfU1lTTE9HIiwKICAgICAgIkNBUF9XQUtFX0FMQVJNIiwKICAgICAgIkNBUF9CTE9DS19TVVNQRU5EIiwKICAgICAgIkNBUF9BVURJVF9SRUFEIiwKICAgICAgIkNBUF9QRVJGTU9OIiwKICAgICAgIkNBUF9CUEYiLAogICAgICAiQ0FQX0NIRUNLUE9JTlRfUkVTVE9SRSIKICAgIF0sCiAgICAidmlydGlvX2Jsa19zdG9yYWdlX2NsYXNzZXMiOiBbCiAgICAgICJjYy1sb2NhbC1jc2kiLAogICAgICAiY2MtbWFuYWdlZC1jc2kiLAogICAgICAiY2MtbWFuYWdlZC1wcmVtaXVtLWNzaSIKICAgIF0sCiAgICAic21iX3N0b3JhZ2VfY2xhc3NlcyI6IFsKICAgICAgewogICAgICAgICJuYW1lIjogImF6dXJlZmlsZS1jc2kta2F0YS1jYyIsCiAgICAgICAgIm1vdW50X29wdGlvbnMiOiBbCiAgICAgICAgICAiZGlyX21vZGU9MDc3NyIsCiAgICAgICAgICAiZmlsZV9tb2RlPTA3NzciLAogICAgICAgICAgIm1mc3ltbGlua3MiLAogICAgICAgICAgImNhY2hlPXN0cmljdCIsCiAgICAgICAgICAibm9zaGFyZXNvY2siLAogICAgICAgICAgImFjdGltZW89MzAiLAogICAgICAgICAgIm5vYnJsIgogICAgICAgIF0KICAgICAgfQogICAgXQogIH0sCiAgInNhbmRib3giOiB7CiAgICAic3RvcmFnZXMiOiBbCiAgICAgIHsKICAgICAgICAiZHJpdmVyIjogImVwaGVtZXJhbCIsCiAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgInNvdXJjZSI6ICJzaG0iLAogICAgICAgICJmc3R5cGUiOiAidG1wZnMiLAogICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICJub2RldiIsCiAgICAgICAgICAibW9kZT0xNzc3IiwKICAgICAgICAgICJzaXplPTY3MTA4ODY0IgogICAgICAgIF0sCiAgICAgICAgIm1vdW50X3BvaW50IjogIi9ydW4va2F0YS1jb250YWluZXJzL3NhbmRib3gvc2htIiwKICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgIH0KICAgIF0KICB9LAogICJyZXF1ZXN0X2RlZmF1bHRzIjogewogICAgIkNyZWF0ZUNvbnRhaW5lclJlcXVlc3QiOiB7CiAgICAgICJhbGxvd19lbnZfcmVnZXgiOiBbCiAgICAgICAgIl5IT1NUTkFNRT0kKGRuc19sYWJlbCkkIiwKICAgICAgICAiXiQoc3ZjX25hbWUpX1BPUlRfJChpcF9wKV9UQ1A9dGNwOi8vJChpcHY0X2EpOiQoaXBfcCkkIiwKICAgICAgICAiXiQoc3ZjX25hbWUpX1BPUlRfJChpcF9wKV9UQ1BfUFJPVE89dGNwJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9QT1JUXyQoaXBfcClfVENQX1BPUlQ9JChpcF9wKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfUE9SVF8kKGlwX3ApX1RDUF9BRERSPSQoaXB2NF9hKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfU0VSVklDRV9IT1NUPSQoaXB2NF9hKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfU0VSVklDRV9QT1JUPSQoaXBfcCkkIiwKICAgICAgICAiXiQoc3ZjX25hbWUpX1NFUlZJQ0VfUE9SVF8kKGRuc19sYWJlbCk9JChpcF9wKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfUE9SVD10Y3A6Ly8kKGlwdjRfYSk6JChpcF9wKSQiLAogICAgICAgICJeQVpVUkVfQ0xJRU5UX0lEPVtBLUZhLWYwLTktXSokIiwKICAgICAgICAiXkFaVVJFX1RFTkFOVF9JRD1bQS1GYS1mMC05LV0qJCIsCiAgICAgICAgIl5BWlVSRV9GRURFUkFURURfVE9LRU5fRklMRT0vdmFyL3J1bi9zZWNyZXRzL2F6dXJlL3Rva2Vucy9henVyZS1pZGVudGl0eS10b2tlbiQiLAogICAgICAgICJeQVpVUkVfQVVUSE9SSVRZX0hPU1Q9aHR0cHM6Ly9sb2dpblxcLm1pY3Jvc29mdG9ubGluZVxcLmNvbS8kIiwKICAgICAgICAiXlRFUk09eHRlcm0kIgogICAgICBdLAogICAgICAiYWxsb3dfZW52X3JlZ2V4X21hcCI6IHsKICAgICAgICAiQ1BVX0xJTUlUIjogIl5bMC05XSskIiwKICAgICAgICAiSk9CX0NPTVBMRVRJT05fSU5ERVgiOiAiXlswLTldKiQiLAogICAgICAgICJNRU1PUllfTElNSVQiOiAiXlswLTldKyQiCiAgICAgIH0KICAgIH0sCiAgICAiQ29weUZpbGVSZXF1ZXN0IjogWwogICAgICAiJChzZnByZWZpeCkiCiAgICBdLAogICAgIkV4ZWNQcm9jZXNzUmVxdWVzdCI6IHsKICAgICAgImFsbG93ZWRfY29tbWFuZHMiOiBbXSwKICAgICAgInJlZ2V4IjogW10KICAgIH0sCiAgICAiVXBkYXRlUm91dGVzUmVxdWVzdCI6IHsKICAgICAgImZvcmJpZGRlbl9kZXZpY2VfbmFtZXMiOiBbCiAgICAgICAgImxvIgogICAgICBdLAogICAgICAiZm9yYmlkZGVuX3NvdXJjZV9yZWdleCI6IFsKICAgICAgICAiXig/OjB7MCw0fTopezAsN30wezAsM30xJCIsCiAgICAgICAgIl4xMjdcXC4oPzpbMC05XXsxLDN9XFwuKXsyfVswLTldezEsM30kIgogICAgICBdCiAgICB9LAogICAgIlVwZGF0ZUludGVyZmFjZVJlcXVlc3QiOiB7CiAgICAgICJhbGxvd19yYXdfZmxhZ3MiOiAxMjgsCiAgICAgICJmb3JiaWRkZW5fbmFtZXMiOiBbCiAgICAgICAgImxvIgogICAgICBdLAogICAgICAiZm9yYmlkZGVuX2h3X2FkZHJzIjogWwogICAgICAgICIwMDowMDowMDowMDowMDowMCIKICAgICAgXQogICAgfSwKICAgICJDbG9zZVN0ZGluUmVxdWVzdCI6IGZhbHNlLAogICAgIlJlYWRTdHJlYW1SZXF1ZXN0IjogZmFsc2UsCiAgICAiVXBkYXRlRXBoZW1lcmFsTW91bnRzUmVxdWVzdCI6IGZhbHNlLAogICAgIldyaXRlU3RyZWFtUmVxdWVzdCI6IGZhbHNlCiAgfQp9 + spec: + runtimeClassName: kata-cc + containers: + - name: cassandra + image: "gcr.io/google-samples/cassandra:v13" + imagePullPolicy: Always + securityContext: + capabilities: + add: + - IPC_LOCK + volumeMounts: + - mountPath: /cassandra_data + name: cassandra-data + env: + - name: MAX_HEAP_SIZE + value: 512M + - name: HEAP_NEWSIZE + value: 100M + - name: POD_NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace + - name: CASSANDRA_SEEDS + value: cassandra-0.cassandra.$(POD_NAMESPACE).svc.cluster.local + - name: CASSANDRA_CLUSTER_NAME + value: K8Demo + - name: CASSANDRA_DC + value: DC1-K8Demo + - name: CASSANDRA_RACK + value: Rack1-K8Demo + - name: POD_IP + valueFrom: + fieldRef: + fieldPath: status.podIP + resources: + requests: + cpu: 300m + memory: 1Gi + ports: + - containerPort: 7000 + name: intra-node + - containerPort: 7001 + name: tls-intra-node + - containerPort: 7199 + name: jmx + - containerPort: 9042 + name: cql + lifecycle: + preStop: + exec: + command: + - /bin/sh + - "-c" + - nodetool drain + readinessProbe: + exec: + command: + - /bin/bash + - "-c" + - /ready-probe.sh + initialDelaySeconds: 15 + timeoutSeconds: 5 + volumeClaimTemplates: + - metadata: + name: cassandra-data + spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi diff --git a/src/agent/samples/policy/yaml/kubernetes/incomplete-init/cockroachdb-statefulset.yaml b/src/agent/samples/policy/yaml/kubernetes/incomplete-init/cockroachdb-statefulset.yaml new file mode 100644 index 000000000000..8fbb46f27a2b --- /dev/null +++ b/src/agent/samples/policy/yaml/kubernetes/incomplete-init/cockroachdb-statefulset.yaml @@ -0,0 +1,76 @@ +--- +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: cockroachdb +spec: + serviceName: cockroachdb + replicas: 3 + selector: + matchLabels: + app: cockroachdb + template: + metadata: + labels: + app: cockroachdb + annotations: + io.katacontainers.config.agent.policy: IyBDb3B5cmlnaHQgKGMpIDIwMjMgTWljcm9zb2Z0IENvcnBvcmF0aW9uCiMKIyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMAojCnBhY2thZ2UgYWdlbnRfcG9saWN5CgppbXBvcnQgZnV0dXJlLmtleXdvcmRzLmluCmltcG9ydCBmdXR1cmUua2V5d29yZHMuZXZlcnkKCmltcG9ydCBpbnB1dAoKIyBEZWZhdWx0IHZhbHVlcywgcmV0dXJuZWQgYnkgT1BBIHdoZW4gcnVsZXMgY2Fubm90IGJlIGV2YWx1YXRlZCB0byB0cnVlLgpkZWZhdWx0IEFkZEFSUE5laWdoYm9yc1JlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBBZGRTd2FwUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IENsb3NlU3RkaW5SZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgQ29weUZpbGVSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgQ3JlYXRlQ29udGFpbmVyUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IENyZWF0ZVNhbmRib3hSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgRGVzdHJveVNhbmRib3hSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBFeGVjUHJvY2Vzc1JlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBHZXRPT01FdmVudFJlcXVlc3QgOj0gdHJ1ZQpkZWZhdWx0IEd1ZXN0RGV0YWlsc1JlcXVlc3QgOj0gdHJ1ZQpkZWZhdWx0IExpc3RJbnRlcmZhY2VzUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IExpc3RSb3V0ZXNSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgTWVtSG90cGx1Z0J5UHJvYmVSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgT25saW5lQ1BVTWVtUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgUGF1c2VDb250YWluZXJSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgUmVhZFN0cmVhbVJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBSZW1vdmVDb250YWluZXJSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBSZW1vdmVTdGFsZVZpcnRpb2ZzU2hhcmVNb3VudHNSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBSZXNlZWRSYW5kb21EZXZSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgUmVzdW1lQ29udGFpbmVyUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFNldEd1ZXN0RGF0ZVRpbWVSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgU2V0UG9saWN5UmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFNpZ25hbFByb2Nlc3NSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBTdGFydENvbnRhaW5lclJlcXVlc3QgOj0gdHJ1ZQpkZWZhdWx0IFN0YXJ0VHJhY2luZ1JlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBTdGF0c0NvbnRhaW5lclJlcXVlc3QgOj0gdHJ1ZQpkZWZhdWx0IFN0b3BUcmFjaW5nUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFR0eVdpblJlc2l6ZVJlcXVlc3QgOj0gdHJ1ZQpkZWZhdWx0IFVwZGF0ZUNvbnRhaW5lclJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBVcGRhdGVFcGhlbWVyYWxNb3VudHNSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgVXBkYXRlSW50ZXJmYWNlUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgVXBkYXRlUm91dGVzUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgV2FpdFByb2Nlc3NSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBXcml0ZVN0cmVhbVJlcXVlc3QgOj0gZmFsc2UKCiMgQWxsb3dSZXF1ZXN0c0ZhaWxpbmdQb2xpY3kgOj0gdHJ1ZSBjb25maWd1cmVzIHRoZSBBZ2VudCB0byAqYWxsb3cgYW55CiMgcmVxdWVzdHMgY2F1c2luZyBhIHBvbGljeSBmYWlsdXJlKi4gVGhpcyBpcyBhbiB1bnNlY3VyZSBjb25maWd1cmF0aW9uCiMgYnV0IGlzIHVzZWZ1bCBmb3IgYWxsb3dpbmcgdW5zZWN1cmUgcG9kcyB0byBzdGFydCwgdGhlbiBjb25uZWN0IHRvCiMgdGhlbSBhbmQgaW5zcGVjdCBPUEEgbG9ncyBmb3IgdGhlIHJvb3QgY2F1c2Ugb2YgYSBmYWlsdXJlLgpkZWZhdWx0IEFsbG93UmVxdWVzdHNGYWlsaW5nUG9saWN5IDo9IGZhbHNlCgojIENvbnN0YW50cwpTX05BTUVfS0VZID0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZSIKU19OQU1FU1BBQ0VfS0VZID0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZXNwYWNlIgpCVU5ETEVfSUQgPSAiW2EtejAtOV17NjR9IgoKQ3JlYXRlQ29udGFpbmVyUmVxdWVzdDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgICMgQ2hlY2sgaWYgdGhlIGlucHV0IHJlcXVlc3Qgc2hvdWxkIGJlIHJlamVjdGVkIGV2ZW4gYmVmb3JlIGNoZWNraW5nIHRoZQogICAgIyBwb2xpY3lfZGF0YS5jb250YWluZXJzIGluZm9ybWF0aW9uLgogICAgYWxsb3dfY3JlYXRlX2NvbnRhaW5lcl9pbnB1dAoKICAgIGlfb2NpIDo9IGlucHV0Lk9DSQogICAgaV9zdG9yYWdlcyA6PSBpbnB1dC5zdG9yYWdlcwoKICAgICMgYXJyYXkgb2YgcG9zc2libGUgc3RhdGUgb3BlcmF0aW9ucwogICAgb3BzX2J1aWxkZXIgOj0gW10KCiAgICAjIGNoZWNrIHNhbmRib3ggbmFtZQogICAgc2FuZGJveF9uYW1lID0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FX0tFWV0KICAgIGFkZF9zYW5kYm94X25hbWVfdG9fc3RhdGUgOj0gc3RhdGVfYWxsb3dzKCJzYW5kYm94X25hbWUiLCBzYW5kYm94X25hbWUpCiAgICBvcHNfYnVpbGRlcjEgOj0gY29uY2F0X29wX2lmX25vdF9udWxsKG9wc19idWlsZGVyLCBhZGRfc2FuZGJveF9uYW1lX3RvX3N0YXRlKQoKICAgICMgQ2hlY2sgaWYgYW55IGVsZW1lbnQgZnJvbSB0aGUgcG9saWN5X2RhdGEuY29udGFpbmVycyBhcnJheSBhbGxvd3MgdGhlIGlucHV0IHJlcXVlc3QuCiAgICBzb21lIHBfY29udGFpbmVyIGluIHBvbGljeV9kYXRhLmNvbnRhaW5lcnMKICAgIHByaW50KCI9PT09PT09PSBDcmVhdGVDb250YWluZXJSZXF1ZXN0OiB0cnlpbmcgbmV4dCBwb2xpY3kgY29udGFpbmVyIikKCiAgICBwX3BpZG5zIDo9IHBfY29udGFpbmVyLnNhbmRib3hfcGlkbnMKICAgIGlfcGlkbnMgOj0gaW5wdXQuc2FuZGJveF9waWRucwogICAgcHJpbnQoIkNyZWF0ZUNvbnRhaW5lclJlcXVlc3Q6IHBfcGlkbnMgPSIsIHBfcGlkbnMsICJpX3BpZG5zID0iLCBpX3BpZG5zKQogICAgcF9waWRucyA9PSBpX3BpZG5zCgogICAgcF9vY2kgOj0gcF9jb250YWluZXIuT0NJCgogICAgIyBjaGVjayBuYW1lc3BhY2UKICAgIHBfbmFtZXNwYWNlIDo9IHBfb2NpLkFubm90YXRpb25zW1NfTkFNRVNQQUNFX0tFWV0KICAgIGlfbmFtZXNwYWNlIDo9IGlfb2NpLkFubm90YXRpb25zW1NfTkFNRVNQQUNFX0tFWV0KICAgIHByaW50ICgiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdDogcF9uYW1lc3BhY2UgPSIsIHBfbmFtZXNwYWNlLCAiaV9uYW1lc3BhY2UgPSIsIGlfbmFtZXNwYWNlKQogICAgYWRkX25hbWVzcGFjZV90b19zdGF0ZSA6PSBhbGxvd19uYW1lc3BhY2UocF9uYW1lc3BhY2UsIGlfbmFtZXNwYWNlKQogICAgb3BzIDo9IGNvbmNhdF9vcF9pZl9ub3RfbnVsbChvcHNfYnVpbGRlcjEsIGFkZF9uYW1lc3BhY2VfdG9fc3RhdGUpCgogICAgcHJpbnQoIkNyZWF0ZUNvbnRhaW5lclJlcXVlc3Q6IHAgVmVyc2lvbiA9IiwgcF9vY2kuVmVyc2lvbiwgImkgVmVyc2lvbiA9IiwgaV9vY2kuVmVyc2lvbikKICAgIHBfb2NpLlZlcnNpb24gPT0gaV9vY2kuVmVyc2lvbgoKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0OiBwIFJlYWRvbmx5ID0iLCBwX29jaS5Sb290LlJlYWRvbmx5LCAiaSBSZWFkb25seSA9IiwgaV9vY2kuUm9vdC5SZWFkb25seSkKICAgIHBfb2NpLlJvb3QuUmVhZG9ubHkgPT0gaV9vY2kuUm9vdC5SZWFkb25seQoKICAgIGFsbG93X2Fubm8ocF9vY2ksIGlfb2NpKQoKICAgIHBfc3RvcmFnZXMgOj0gcF9jb250YWluZXIuc3RvcmFnZXMKICAgIGFsbG93X2J5X2Fubm8ocF9vY2ksIGlfb2NpLCBwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzKQoKICAgIGFsbG93X2xpbnV4KHBfb2NpLCBpX29jaSkKCiAgICBwcmludCgiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdDogdHJ1ZSIpCn0KCmFsbG93X2NyZWF0ZV9jb250YWluZXJfaW5wdXQgewogICAgcHJpbnQoImFsbG93X2NyZWF0ZV9jb250YWluZXJfaW5wdXQ6IGlucHV0ID0iLCBpbnB1dCkKCiAgICBjb3VudChpbnB1dC5zaGFyZWRfbW91bnRzKSA9PSAwCiAgICBpc19udWxsKGlucHV0LnN0cmluZ191c2VyKQoKICAgIGlfb2NpIDo9IGlucHV0Lk9DSQogICAgaXNfbnVsbChpX29jaS5Ib29rcykKICAgIGlzX251bGwoaV9vY2kuU29sYXJpcykKICAgIGlzX251bGwoaV9vY2kuV2luZG93cykKCiAgICBpX2xpbnV4IDo9IGlfb2NpLkxpbnV4CiAgICBjb3VudChpX2xpbnV4LkdJRE1hcHBpbmdzKSA9PSAwCiAgICBjb3VudChpX2xpbnV4Lk1vdW50TGFiZWwpID09IDAKICAgIGNvdW50KGlfbGludXguUmVzb3VyY2VzLkRldmljZXMpID09IDAKICAgIGNvdW50KGlfbGludXguUm9vdGZzUHJvcGFnYXRpb24pID09IDAKICAgIGNvdW50KGlfbGludXguVUlETWFwcGluZ3MpID09IDAKICAgIGlzX251bGwoaV9saW51eC5JbnRlbFJkdCkKICAgIGlzX251bGwoaV9saW51eC5SZXNvdXJjZXMuQmxvY2tJTykKICAgIGlzX251bGwoaV9saW51eC5SZXNvdXJjZXMuTmV0d29yaykKICAgIGlzX251bGwoaV9saW51eC5SZXNvdXJjZXMuUGlkcykKICAgIGlzX251bGwoaV9saW51eC5TZWNjb21wKQogICAgaV9saW51eC5TeXNjdGwgPT0ge30KCiAgICBpX3Byb2Nlc3MgOj0gaV9vY2kuUHJvY2VzcwogICAgY291bnQoaV9wcm9jZXNzLlNlbGludXhMYWJlbCkgPT0gMAogICAgY291bnQoaV9wcm9jZXNzLlVzZXIuVXNlcm5hbWUpID09IDAKCiAgICBwcmludCgiYWxsb3dfY3JlYXRlX2NvbnRhaW5lcl9pbnB1dDogdHJ1ZSIpCn0KCmFsbG93X25hbWVzcGFjZShwX25hbWVzcGFjZSwgaV9uYW1lc3BhY2UpID0gYWRkX25hbWVzcGFjZSB7CiAgICBwX25hbWVzcGFjZSA9PSBpX25hbWVzcGFjZQogICAgYWRkX25hbWVzcGFjZSA6PSBudWxsCiAgICBwcmludCgiYWxsb3dfbmFtZXNwYWNlIDE6IGlucHV0IG5hbWVzcGFjZSBtYXRjaGVzIHBvbGljeSBkYXRhIikKfQoKYWxsb3dfbmFtZXNwYWNlKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkgPSBhZGRfbmFtZXNwYWNlIHsKICAgIHBfbmFtZXNwYWNlID09ICIiCiAgICBwcmludCgiYWxsb3dfbmFtZXNwYWNlIDI6IG5vIG5hbWVzcGFjZSBmb3VuZCBvbiBwb2xpY3kgZGF0YSIpCiAgICBhZGRfbmFtZXNwYWNlIDo9IHN0YXRlX2FsbG93cygibmFtZXNwYWNlIiwgaV9uYW1lc3BhY2UpCn0KCiMgdmFsdWUgaGFzbid0IGJlZW4gc2VlbiBiZWZvcmUsIHNhdmUgaXQgdG8gc3RhdGUKc3RhdGVfYWxsb3dzKGtleSwgdmFsdWUpID0gYWN0aW9uIHsKICBzdGF0ZSA6PSBnZXRfc3RhdGUoKQogIG5vdCBzdGF0ZVtrZXldCiAgcHJpbnQoInN0YXRlX2FsbG93czogc2F2aW5nIHRvIHN0YXRlIGtleSA9Iiwga2V5LCAidmFsdWUgPSIsIHZhbHVlKQogIHBhdGggOj0gZ2V0X3N0YXRlX3BhdGgoa2V5KSAKICBhY3Rpb24gOj0gewogICAgIm9wIjogImFkZCIsCiAgICAicGF0aCI6IHBhdGgsIAogICAgInZhbHVlIjogdmFsdWUsCiAgfQp9CgojIHZhbHVlIG1hdGNoZXMgd2hhdCdzIGluIHN0YXRlLCBhbGxvdyBpdApzdGF0ZV9hbGxvd3Moa2V5LCB2YWx1ZSkgPSBhY3Rpb24gewogIHN0YXRlIDo9IGdldF9zdGF0ZSgpCiAgdmFsdWUgPT0gc3RhdGVba2V5XQogIHByaW50KCJzdGF0ZV9hbGxvd3M6IGZvdW5kIGtleSA9Iiwga2V5LCAidmFsdWUgPSIsIHZhbHVlLCAiIGluIHN0YXRlIikKICBhY3Rpb24gOj0gbnVsbAp9CgojIGhlbHBlciBmdW5jdGlvbnMgdG8gaW50ZXJhY3Qgd2l0aCB0aGUgc3RhdGUKZ2V0X3N0YXRlKCkgPSBzdGF0ZSB7CiAgc3RhdGUgOj0gZGF0YVsicHN0YXRlIl0KfQoKZ2V0X3N0YXRlX3ZhbChrZXkpID0gdmFsdWUgewogICAgc3RhdGUgOj0gZ2V0X3N0YXRlKCkKICAgIHZhbHVlIDo9IHN0YXRlW2tleV0KfQoKZ2V0X3N0YXRlX3BhdGgoa2V5KSA9IHBhdGggewogICAgIyBwcmVwZW5kICIvcHN0YXRlLyIgdG8ga2V5CiAgICBwYXRoIDo9IGNvbmNhdCgiLyIsIFsiL3BzdGF0ZSIsIGtleV0pCn0KCiMgSGVscGVyIGZ1bmN0aW9ucyB0byBjb25kaXRpb25hbGx5IGNvbmNhdGVuYXRlIGlmIG9wIGlzIG5vdCBudWxsCmNvbmNhdF9vcF9pZl9ub3RfbnVsbChvcHMsIG9wKSA9IHJlc3VsdCB7CiAgICBvcCA9PSBudWxsCiAgICByZXN1bHQgOj0gb3BzCn0KCmNvbmNhdF9vcF9pZl9ub3RfbnVsbChvcHMsIG9wKSA9IHJlc3VsdCB7CiAgICBvcCAhPSBudWxsCiAgICByZXN1bHQgOj0gYXJyYXkuY29uY2F0KG9wcywgW29wXSkKfQoKIyBSZWplY3QgdW5leHBlY3RlZCBhbm5vdGF0aW9ucy4KYWxsb3dfYW5ubyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19hbm5vIDE6IHN0YXJ0IikKCiAgICBub3QgaV9vY2kuQW5ub3RhdGlvbnMKCiAgICBwcmludCgiYWxsb3dfYW5ubyAxOiB0cnVlIikKfQphbGxvd19hbm5vKHBfb2NpLCBpX29jaSkgewogICAgcHJpbnQoImFsbG93X2Fubm8gMjogcCBBbm5vdGF0aW9ucyA9IiwgcF9vY2kuQW5ub3RhdGlvbnMpCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiBpIEFubm90YXRpb25zID0iLCBpX29jaS5Bbm5vdGF0aW9ucykKCiAgICBpX2tleXMgOj0gb2JqZWN0LmtleXMoaV9vY2kuQW5ub3RhdGlvbnMpCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiBpIGtleXMgPSIsIGlfa2V5cykKCiAgICBldmVyeSBpX2tleSBpbiBpX2tleXMgewogICAgICAgIGFsbG93X2Fubm9fa2V5KGlfa2V5LCBwX29jaSkKICAgIH0KCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiB0cnVlIikKfQoKYWxsb3dfYW5ub19rZXkoaV9rZXksIHBfb2NpKSB7CiAgICBwcmludCgiYWxsb3dfYW5ub19rZXkgMTogaSBrZXkgPSIsIGlfa2V5KQoKICAgIHN0YXJ0c3dpdGgoaV9rZXksICJpby5rdWJlcm5ldGVzLmNyaS4iKQoKICAgIHByaW50KCJhbGxvd19hbm5vX2tleSAxOiB0cnVlIikKfQphbGxvd19hbm5vX2tleShpX2tleSwgcF9vY2kpIHsKICAgIHByaW50KCJhbGxvd19hbm5vX2tleSAyOiBpIGtleSA9IiwgaV9rZXkpCgogICAgc29tZSBwX2tleSwgXyBpbiBwX29jaS5Bbm5vdGF0aW9ucwogICAgcF9rZXkgPT0gaV9rZXkKCiAgICBwcmludCgiYWxsb3dfYW5ub19rZXkgMjogdHJ1ZSIpCn0KCiMgR2V0IHRoZSB2YWx1ZSBvZiB0aGUgU19OQU1FX0tFWSBhbm5vdGF0aW9uIGFuZAojIGNvcnJlbGF0ZSBpdCB3aXRoIG90aGVyIGFubm90YXRpb25zIGFuZCBwcm9jZXNzIGZpZWxkcy4KYWxsb3dfYnlfYW5ubyhwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpIHsKICAgIHByaW50KCJhbGxvd19ieV9hbm5vIDE6IHN0YXJ0IikKCiAgICBub3QgcF9vY2kuQW5ub3RhdGlvbnNbU19OQU1FX0tFWV0KCiAgICBpX3NfbmFtZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMTogaV9zX25hbWUgPSIsIGlfc19uYW1lKQoKICAgIGlfc19uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FU1BBQ0VfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMTogaV9zX25hbWVzcGFjZSA9IiwgaV9zX25hbWVzcGFjZSkKCiAgICBhbGxvd19ieV9zYW5kYm94X25hbWUocF9vY2ksIGlfb2NpLCBwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBpX3NfbmFtZSwgaV9zX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfYnlfYW5ubyAxOiB0cnVlIikKfQphbGxvd19ieV9hbm5vKHBfb2NpLCBpX29jaSwgcF9zdG9yYWdlcywgaV9zdG9yYWdlcykgewogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMjogc3RhcnQiKQoKICAgIHBfc19uYW1lIDo9IHBfb2NpLkFubm90YXRpb25zW1NfTkFNRV9LRVldCiAgICBpX3NfbmFtZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMjogaV9zX25hbWUgPSIsIGlfc19uYW1lLCAicF9zX25hbWUgPSIsIHBfc19uYW1lKQoKICAgIGFsbG93X3NhbmRib3hfbmFtZShwX3NfbmFtZSwgaV9zX25hbWUpCgogICAgaV9zX25hbWVzcGFjZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwcmludCgiYWxsb3dfYnlfYW5ubyAyOiBpX3NfbmFtZXNwYWNlID0iLCBpX3NfbmFtZXNwYWNlKQoKICAgIGFsbG93X2J5X3NhbmRib3hfbmFtZShwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMsIGlfc19uYW1lLCBpX3NfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd19ieV9hbm5vIDI6IHRydWUiKQp9CgphbGxvd19ieV9zYW5kYm94X25hbWUocF9vY2ksIGlfb2NpLCBwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfYnlfc2FuZGJveF9uYW1lOiBzdGFydCIpCgogICAgaV9uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FU1BBQ0VfS0VZXQoKICAgIGFsbG93X2J5X2NvbnRhaW5lcl90eXBlcyhwX29jaSwgaV9vY2ksIHNfbmFtZSwgaV9uYW1lc3BhY2UpCiAgICBhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZChwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpCiAgICBhbGxvd19wcm9jZXNzKHBfb2NpLlByb2Nlc3MsIGlfb2NpLlByb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpCgogICAgcHJpbnQoImFsbG93X2J5X3NhbmRib3hfbmFtZTogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfbmFtZShwX3NfbmFtZSwgaV9zX25hbWUpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X25hbWUgMTogc3RhcnQiKQoKICAgIHBfc19uYW1lID09IGlfc19uYW1lCgogICAgcHJpbnQoImFsbG93X3NhbmRib3hfbmFtZSAxOiB0cnVlIikKfQphbGxvd19zYW5kYm94X25hbWUocF9zX25hbWUsIGlfc19uYW1lKSB7CiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9uYW1lIDI6IHN0YXJ0IikKCiAgICAjIFRPRE86IHNob3VsZCBnZW5lcmF0ZWQgbmFtZXMgYmUgaGFuZGxlZCBkaWZmZXJlbnRseT8KICAgIGNvbnRhaW5zKHBfc19uYW1lLCAiJChnZW5lcmF0ZWQtbmFtZSkiKQoKICAgIHByaW50KCJhbGxvd19zYW5kYm94X25hbWUgMjogdHJ1ZSIpCn0KCiMgQ2hlY2sgdGhhdCB0aGUgImlvLmt1YmVybmV0ZXMuY3JpLmNvbnRhaW5lci10eXBlIiBhbmQKIyAiaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5jb250YWluZXJfdHlwZSIgYW5ub3RhdGlvbnMgZGVzaWduYXRlIHRoZQojIGV4cGVjdGVkIHR5cGUgLSBlaXRoZXIgYSAic2FuZGJveCIgb3IgYSAiY29udGFpbmVyIi4gVGhlbiwgdmFsaWRhdGUKIyBvdGhlciBhbm5vdGF0aW9ucyBiYXNlZCBvbiB0aGUgYWN0dWFsICJzYW5kYm94IiBvciAiY29udGFpbmVyIiB2YWx1ZQojIGZyb20gdGhlIGlucHV0IGNvbnRhaW5lci4KYWxsb3dfYnlfY29udGFpbmVyX3R5cGVzKHBfb2NpLCBpX29jaSwgc19uYW1lLCBzX25hbWVzcGFjZSkgewogICAgcHJpbnQoImFsbG93X2J5X2NvbnRhaW5lcl90eXBlczogY2hlY2tpbmcgaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLXR5cGUiKQoKICAgIGNfdHlwZSA6PSAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLXR5cGUiCiAgICAKICAgIHBfY3JpX3R5cGUgOj0gcF9vY2kuQW5ub3RhdGlvbnNbY190eXBlXQogICAgaV9jcmlfdHlwZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tjX3R5cGVdCiAgICBwcmludCgiYWxsb3dfYnlfY29udGFpbmVyX3R5cGVzOiBwX2NyaV90eXBlID0iLCBwX2NyaV90eXBlLCAiaV9jcmlfdHlwZSA9IiwgaV9jcmlfdHlwZSkKICAgIHBfY3JpX3R5cGUgPT0gaV9jcmlfdHlwZQoKICAgIGFsbG93X2J5X2NvbnRhaW5lcl90eXBlKGlfY3JpX3R5cGUsIHBfb2NpLCBpX29jaSwgc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfYnlfY29udGFpbmVyX3R5cGVzOiB0cnVlIikKfQoKYWxsb3dfYnlfY29udGFpbmVyX3R5cGUoaV9jcmlfdHlwZSwgcF9vY2ksIGlfb2NpLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfYnlfY29udGFpbmVyX3R5cGUgMTogaV9jcmlfdHlwZSA9IiwgaV9jcmlfdHlwZSkKICAgIGlfY3JpX3R5cGUgPT0gInNhbmRib3giCgogICAgaV9rYXRhX3R5cGUgOj0gaV9vY2kuQW5ub3RhdGlvbnNbImlvLmthdGFjb250YWluZXJzLnBrZy5vY2kuY29udGFpbmVyX3R5cGUiXQogICAgcHJpbnQoImFsbG93X2J5X2NvbnRhaW5lcl90eXBlIDE6IGlfa2F0YV90eXBlID0iLCBpX2thdGFfdHlwZSkKICAgIGlfa2F0YV90eXBlID09ICJwb2Rfc2FuZGJveCIKCiAgICBhbGxvd19zYW5kYm94X2NvbnRhaW5lcl9uYW1lKHBfb2NpLCBpX29jaSkKICAgIGFsbG93X3NhbmRib3hfbmV0X25hbWVzcGFjZShwX29jaSwgaV9vY2kpCiAgICBhbGxvd19zYW5kYm94X2xvZ19kaXJlY3RvcnkocF9vY2ksIGlfb2NpLCBzX25hbWUsIHNfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAxOiB0cnVlIikKfQoKYWxsb3dfYnlfY29udGFpbmVyX3R5cGUoaV9jcmlfdHlwZSwgcF9vY2ksIGlfb2NpLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfYnlfY29udGFpbmVyX3R5cGUgMjogaV9jcmlfdHlwZSA9IiwgaV9jcmlfdHlwZSkKICAgIGlfY3JpX3R5cGUgPT0gImNvbnRhaW5lciIKCiAgICBpX2thdGFfdHlwZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1siaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5jb250YWluZXJfdHlwZSJdCiAgICBwcmludCgiYWxsb3dfYnlfY29udGFpbmVyX3R5cGUgMjogaV9rYXRhX3R5cGUgPSIsIGlfa2F0YV90eXBlKQogICAgaV9rYXRhX3R5cGUgPT0gInBvZF9jb250YWluZXIiCgogICAgYWxsb3dfY29udGFpbmVyX25hbWUocF9vY2ksIGlfb2NpKQogICAgYWxsb3dfbmV0X25hbWVzcGFjZShwX29jaSwgaV9vY2kpCiAgICBhbGxvd19sb2dfZGlyZWN0b3J5KHBfb2NpLCBpX29jaSkKCiAgICBwcmludCgiYWxsb3dfYnlfY29udGFpbmVyX3R5cGUgMjogdHJ1ZSIpCn0KCiMgImlvLmt1YmVybmV0ZXMuY3JpLmNvbnRhaW5lci1uYW1lIiBhbm5vdGF0aW9uCmFsbG93X3NhbmRib3hfY29udGFpbmVyX25hbWUocF9vY2ksIGlfb2NpKSB7CiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9jb250YWluZXJfbmFtZTogc3RhcnQiKQoKICAgIGNvbnRhaW5lcl9hbm5vdGF0aW9uX21pc3NpbmcocF9vY2ksIGlfb2NpLCAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLW5hbWUiKQoKICAgIHByaW50KCJhbGxvd19zYW5kYm94X2NvbnRhaW5lcl9uYW1lOiB0cnVlIikKfQoKYWxsb3dfY29udGFpbmVyX25hbWUocF9vY2ksIGlfb2NpKSB7CiAgICBwcmludCgiYWxsb3dfY29udGFpbmVyX25hbWU6IHN0YXJ0IikKCiAgICBhbGxvd19jb250YWluZXJfYW5ub3RhdGlvbihwX29jaSwgaV9vY2ksICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItbmFtZSIpCgogICAgcHJpbnQoImFsbG93X2NvbnRhaW5lcl9uYW1lOiB0cnVlIikKfQoKY29udGFpbmVyX2Fubm90YXRpb25fbWlzc2luZyhwX29jaSwgaV9vY2ksIGtleSkgewogICAgcHJpbnQoImNvbnRhaW5lcl9hbm5vdGF0aW9uX21pc3Npbmc6Iiwga2V5KQoKICAgIG5vdCBwX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICBub3QgaV9vY2kuQW5ub3RhdGlvbnNba2V5XQoKICAgIHByaW50KCJjb250YWluZXJfYW5ub3RhdGlvbl9taXNzaW5nOiB0cnVlIikKfQoKYWxsb3dfY29udGFpbmVyX2Fubm90YXRpb24ocF9vY2ksIGlfb2NpLCBrZXkpIHsKICAgIHByaW50KCJhbGxvd19jb250YWluZXJfYW5ub3RhdGlvbjoga2V5ID0iLCBrZXkpCgogICAgcF92YWx1ZSA6PSBwX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICBpX3ZhbHVlIDo9IGlfb2NpLkFubm90YXRpb25zW2tleV0KICAgIHByaW50KCJhbGxvd19jb250YWluZXJfYW5ub3RhdGlvbjogcF92YWx1ZSA9IiwgcF92YWx1ZSwgImlfdmFsdWUgPSIsIGlfdmFsdWUpCgogICAgcF92YWx1ZSA9PSBpX3ZhbHVlCgogICAgcHJpbnQoImFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uOiB0cnVlIikKfQoKIyAibmVyZGN0bC9uZXR3b3JrLW5hbWVzcGFjZSIgYW5ub3RhdGlvbgphbGxvd19zYW5kYm94X25ldF9uYW1lc3BhY2UocF9vY2ksIGlfb2NpKSB7CiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9uZXRfbmFtZXNwYWNlOiBzdGFydCIpCgogICAga2V5IDo9ICJuZXJkY3RsL25ldHdvcmstbmFtZXNwYWNlIgoKICAgIHBfbmFtZXNwYWNlIDo9IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIGlfbmFtZXNwYWNlIDo9IGlfb2NpLkFubm90YXRpb25zW2tleV0KICAgIHByaW50KCJhbGxvd19zYW5kYm94X25ldF9uYW1lc3BhY2U6IHBfbmFtZXNwYWNlID0iLCBwX25hbWVzcGFjZSwgImlfbmFtZXNwYWNlID0iLCBpX25hbWVzcGFjZSkKCiAgICByZWdleC5tYXRjaChwX25hbWVzcGFjZSwgaV9uYW1lc3BhY2UpCgogICAgcHJpbnQoImFsbG93X3NhbmRib3hfbmV0X25hbWVzcGFjZTogdHJ1ZSIpCn0KCmFsbG93X25ldF9uYW1lc3BhY2UocF9vY2ksIGlfb2NpKSB7CiAgICBwcmludCgiYWxsb3dfbmV0X25hbWVzcGFjZTogc3RhcnQiKQoKICAgIGtleSA6PSAibmVyZGN0bC9uZXR3b3JrLW5hbWVzcGFjZSIKCiAgICBub3QgcF9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgbm90IGlfb2NpLkFubm90YXRpb25zW2tleV0KCiAgICBwcmludCgiYWxsb3dfbmV0X25hbWVzcGFjZTogdHJ1ZSIpCn0KCiMgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbG9nLWRpcmVjdG9yeSIgYW5ub3RhdGlvbgphbGxvd19zYW5kYm94X2xvZ19kaXJlY3RvcnkocF9vY2ksIGlfb2NpLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiBzdGFydCIpCgogICAga2V5IDo9ICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWxvZy1kaXJlY3RvcnkiCgogICAgcF9kaXIgOj0gcF9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgcmVnZXgxIDo9IHJlcGxhY2UocF9kaXIsICIkKHNhbmRib3gtbmFtZSkiLCBzX25hbWUpCiAgICByZWdleDIgOj0gcmVwbGFjZShyZWdleDEsICIkKHNhbmRib3gtbmFtZXNwYWNlKSIsIHNfbmFtZXNwYWNlKQogICAgcHJpbnQoImFsbG93X3NhbmRib3hfbG9nX2RpcmVjdG9yeTogcmVnZXgyID0iLCByZWdleDIpCgogICAgaV9kaXIgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgcHJpbnQoImFsbG93X3NhbmRib3hfbG9nX2RpcmVjdG9yeTogaV9kaXIgPSIsIGlfZGlyKQoKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4MiwgaV9kaXIpCgogICAgcHJpbnQoImFsbG93X3NhbmRib3hfbG9nX2RpcmVjdG9yeTogdHJ1ZSIpCn0KCmFsbG93X2xvZ19kaXJlY3RvcnkocF9vY2ksIGlfb2NpKSB7CiAgICBwcmludCgiYWxsb3dfbG9nX2RpcmVjdG9yeTogc3RhcnQiKQoKICAgIGtleSA6PSAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1sb2ctZGlyZWN0b3J5IgoKICAgIG5vdCBwX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICBub3QgaV9vY2kuQW5ub3RhdGlvbnNba2V5XQoKICAgIHByaW50KCJhbGxvd19sb2dfZGlyZWN0b3J5OiB0cnVlIikKfQoKYWxsb3dfbGludXgocF9vY2ksIGlfb2NpKSB7CiAgICBwX25hbWVzcGFjZXMgOj0gcF9vY2kuTGludXguTmFtZXNwYWNlcwogICAgcHJpbnQoImFsbG93X2xpbnV4OiBwIG5hbWVzcGFjZXMgPSIsIHBfbmFtZXNwYWNlcykKCiAgICBpX25hbWVzcGFjZXMgOj0gaV9vY2kuTGludXguTmFtZXNwYWNlcwogICAgcHJpbnQoImFsbG93X2xpbnV4OiBpIG5hbWVzcGFjZXMgPSIsIGlfbmFtZXNwYWNlcykKCiAgICBwX25hbWVzcGFjZXMgPT0gaV9uYW1lc3BhY2VzCgogICAgYWxsb3dfbWFza2VkX3BhdGhzKHBfb2NpLCBpX29jaSkKICAgIGFsbG93X3JlYWRvbmx5X3BhdGhzKHBfb2NpLCBpX29jaSkKCiAgICBwcmludCgiYWxsb3dfbGludXg6IHRydWUiKQp9CgphbGxvd19tYXNrZWRfcGF0aHMocF9vY2ksIGlfb2NpKSB7CiAgICBwX3BhdGhzIDo9IHBfb2NpLkxpbnV4Lk1hc2tlZFBhdGhzCiAgICBwcmludCgiYWxsb3dfbWFza2VkX3BhdGhzIDE6IHBfcGF0aHMgPSIsIHBfcGF0aHMpCgogICAgaV9wYXRocyA6PSBpX29jaS5MaW51eC5NYXNrZWRQYXRocwogICAgcHJpbnQoImFsbG93X21hc2tlZF9wYXRocyAxOiBpX3BhdGhzID0iLCBpX3BhdGhzKQoKICAgIGFsbG93X21hc2tlZF9wYXRoc19hcnJheShwX3BhdGhzLCBpX3BhdGhzKQoKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aHMgMTogdHJ1ZSIpCn0KYWxsb3dfbWFza2VkX3BhdGhzKHBfb2NpLCBpX29jaSkgewogICAgcHJpbnQoImFsbG93X21hc2tlZF9wYXRocyAyOiBzdGFydCIpCgogICAgbm90IHBfb2NpLkxpbnV4Lk1hc2tlZFBhdGhzCiAgICBub3QgaV9vY2kuTGludXguTWFza2VkUGF0aHMKCiAgICBwcmludCgiYWxsb3dfbWFza2VkX3BhdGhzIDI6IHRydWUiKQp9CgojIEFsbCB0aGUgcG9saWN5IG1hc2tlZCBwYXRocyBtdXN0IGJlIG1hc2tlZCBpbiB0aGUgaW5wdXQgZGF0YSB0b28uCiMgSW5wdXQgaXMgYWxsb3dlZCB0byBoYXZlIG1vcmUgbWFza2VkIHBhdGhzIHRoYW4gdGhlIHBvbGljeS4KYWxsb3dfbWFza2VkX3BhdGhzX2FycmF5KHBfYXJyYXksIGlfYXJyYXkpIHsKICAgIGV2ZXJ5IHBfZWxlbSBpbiBwX2FycmF5IHsKICAgICAgICBhbGxvd19tYXNrZWRfcGF0aChwX2VsZW0sIGlfYXJyYXkpCiAgICB9Cn0KCmFsbG93X21hc2tlZF9wYXRoKHBfZWxlbSwgaV9hcnJheSkgewogICAgcHJpbnQoImFsbG93X21hc2tlZF9wYXRoOiBwX2VsZW0gPSIsIHBfZWxlbSkKCiAgICBzb21lIGlfZWxlbSBpbiBpX2FycmF5CiAgICBwX2VsZW0gPT0gaV9lbGVtCgogICAgcHJpbnQoImFsbG93X21hc2tlZF9wYXRoOiB0cnVlIikKfQoKYWxsb3dfcmVhZG9ubHlfcGF0aHMocF9vY2ksIGlfb2NpKSB7CiAgICBwX3BhdGhzIDo9IHBfb2NpLkxpbnV4LlJlYWRvbmx5UGF0aHMKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAxOiBwX3BhdGhzID0iLCBwX3BhdGhzKQoKICAgIGlfcGF0aHMgOj0gaV9vY2kuTGludXguUmVhZG9ubHlQYXRocwogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGhzIDE6IGlfcGF0aHMgPSIsIGlfcGF0aHMpCgogICAgYWxsb3dfcmVhZG9ubHlfcGF0aHNfYXJyYXkocF9wYXRocywgaV9wYXRocywgaV9vY2kuTGludXguTWFza2VkUGF0aHMpCgogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGhzIDE6IHRydWUiKQp9CmFsbG93X3JlYWRvbmx5X3BhdGhzKHBfb2NpLCBpX29jaSkgewogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGhzIDI6IHN0YXJ0IikKCiAgICBub3QgcF9vY2kuTGludXguUmVhZG9ubHlQYXRocwogICAgbm90IGlfb2NpLkxpbnV4LlJlYWRvbmx5UGF0aHMKCiAgICBwcmludCgiYWxsb3dfcmVhZG9ubHlfcGF0aHMgMjogdHJ1ZSIpCn0KCiMgQWxsIHRoZSBwb2xpY3kgcmVhZG9ubHkgcGF0aHMgbXVzdCBiZSBlaXRoZXI6CiMgLSBQcmVzZW50IGluIHRoZSBpbnB1dCByZWFkb25seSBwYXRocywgb3IKIyAtIFByZXNlbnQgaW4gdGhlIGlucHV0IG1hc2tlZCBwYXRocy4KIyBJbnB1dCBpcyBhbGxvd2VkIHRvIGhhdmUgbW9yZSByZWFkb25seSBwYXRocyB0aGFuIHRoZSBwb2xpY3kuCmFsbG93X3JlYWRvbmx5X3BhdGhzX2FycmF5KHBfYXJyYXksIGlfYXJyYXksIG1hc2tlZF9wYXRocykgewogICAgZXZlcnkgcF9lbGVtIGluIHBfYXJyYXkgewogICAgICAgIGFsbG93X3JlYWRvbmx5X3BhdGgocF9lbGVtLCBpX2FycmF5LCBtYXNrZWRfcGF0aHMpCiAgICB9Cn0KCmFsbG93X3JlYWRvbmx5X3BhdGgocF9lbGVtLCBpX2FycmF5LCBtYXNrZWRfcGF0aHMpIHsKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRoIDE6IHBfZWxlbSA9IiwgcF9lbGVtKQoKICAgIHNvbWUgaV9lbGVtIGluIGlfYXJyYXkKICAgIHBfZWxlbSA9PSBpX2VsZW0KCiAgICBwcmludCgiYWxsb3dfcmVhZG9ubHlfcGF0aCAxOiB0cnVlIikKfQphbGxvd19yZWFkb25seV9wYXRoKHBfZWxlbSwgaV9hcnJheSwgbWFza2VkX3BhdGhzKSB7CiAgICBwcmludCgiYWxsb3dfcmVhZG9ubHlfcGF0aCAyOiBwX2VsZW0gPSIsIHBfZWxlbSkKCiAgICBzb21lIGlfbWFza2VkIGluIG1hc2tlZF9wYXRocwogICAgcF9lbGVtID09IGlfbWFza2VkCgogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGggMjogdHJ1ZSIpCn0KCiMgQ2hlY2sgdGhlIGNvbnNpc3RlbmN5IG9mIHRoZSBpbnB1dCAiaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5idW5kbGVfcGF0aCIKIyBhbmQgaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCIgdmFsdWVzIHdpdGggb3RoZXIgZmllbGRzLgphbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZChwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpIHsKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogc3RhcnQiKQoKICAgIGJ1bmRsZV9wYXRoIDo9IGlfb2NpLkFubm90YXRpb25zWyJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmJ1bmRsZV9wYXRoIl0KICAgIGJ1bmRsZV9pZCA6PSByZXBsYWNlKGJ1bmRsZV9wYXRoLCAiL3J1bi9jb250YWluZXJkL2lvLmNvbnRhaW5lcmQucnVudGltZS52Mi50YXNrL2s4cy5pby8iLCAiIikKCiAgICBidW5kbGVfaWRfZm9ybWF0IDo9IGNvbmNhdCgiIiwgWyJeIiwgQlVORExFX0lELCAiJCJdKQogICAgcmVnZXgubWF0Y2goYnVuZGxlX2lkX2Zvcm1hdCwgYnVuZGxlX2lkKQoKICAgIGtleSA6PSAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCIKCiAgICBwX3JlZ2V4IDo9IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIHNhbmRib3hfaWQgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQoKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogc2FuZGJveF9pZCA9Iiwgc2FuZGJveF9pZCwgInJlZ2V4ID0iLCBwX3JlZ2V4KQogICAgcmVnZXgubWF0Y2gocF9yZWdleCwgc2FuZGJveF9pZCkKCiAgICBhbGxvd19yb290X3BhdGgocF9vY2ksIGlfb2NpLCBidW5kbGVfaWQpCgogICAgZXZlcnkgaV9tb3VudCBpbiBpbnB1dC5PQ0kuTW91bnRzIHsKICAgICAgICBhbGxvd19tb3VudChwX29jaSwgaV9tb3VudCwgYnVuZGxlX2lkLCBzYW5kYm94X2lkKQogICAgfQoKICAgIGFsbG93X3N0b3JhZ2VzKHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkKCiAgICBwcmludCgiYWxsb3dfYnlfYnVuZGxlX29yX3NhbmRib3hfaWQ6IHRydWUiKQp9CgphbGxvd19wcm9jZXNzX2NvbW1vbihwX3Byb2Nlc3MsIGlfcHJvY2Vzcywgc19uYW1lLCBzX25hbWVzcGFjZSkgewogICAgcHJpbnQoImFsbG93X3Byb2Nlc3NfY29tbW9uOiBwX3Byb2Nlc3MgPSIsIHBfcHJvY2VzcykKICAgIHByaW50KCJhbGxvd19wcm9jZXNzX2NvbW1vbjogaV9wcm9jZXNzID0gIiwgaV9wcm9jZXNzKQogICAgcHJpbnQoImFsbG93X3Byb2Nlc3NfY29tbW9uOiBzX25hbWUgPSIsIHNfbmFtZSkKCiAgICBwX3Byb2Nlc3MuQ3dkID09IGlfcHJvY2Vzcy5Dd2QKICAgIHBfcHJvY2Vzcy5Ob05ld1ByaXZpbGVnZXMgPT0gaV9wcm9jZXNzLk5vTmV3UHJpdmlsZWdlcwoKICAgIGFsbG93X3VzZXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MpCiAgICBhbGxvd19lbnYocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpCgogICAgcHJpbnQoImFsbG93X3Byb2Nlc3NfY29tbW9uOiB0cnVlIikKfQoKIyBDb21wYXJlIHRoZSBPQ0kgUHJvY2VzcyBmaWVsZCBvZiBhIHBvbGljeSBjb250YWluZXIgd2l0aCB0aGUgaW5wdXQgT0NJIFByb2Nlc3MgZnJvbSBhIENyZWF0ZUNvbnRhaW5lclJlcXVlc3QKYWxsb3dfcHJvY2VzcyhwX3Byb2Nlc3MsIGlfcHJvY2Vzcywgc19uYW1lLCBzX25hbWVzcGFjZSkgewogICAgcHJpbnQoImFsbG93X3Byb2Nlc3M6IHN0YXJ0IikKCiAgICBhbGxvd19hcmdzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUpCiAgICBhbGxvd19wcm9jZXNzX2NvbW1vbihwX3Byb2Nlc3MsIGlfcHJvY2Vzcywgc19uYW1lLCBzX25hbWVzcGFjZSkKICAgIGFsbG93X2NhcHMocF9wcm9jZXNzLkNhcGFiaWxpdGllcywgaV9wcm9jZXNzLkNhcGFiaWxpdGllcykKICAgIHBfcHJvY2Vzcy5UZXJtaW5hbCA9PSBpX3Byb2Nlc3MuVGVybWluYWwKCiAgICBwcmludCgiYWxsb3dfcHJvY2VzczogdHJ1ZSIpCn0KCiMgQ29tcGFyZSB0aGUgT0NJIFByb2Nlc3MgZmllbGQgb2YgYSBwb2xpY3kgY29udGFpbmVyIHdpdGggdGhlIGlucHV0IHByb2Nlc3MgZmllbGQgZnJvbSBFeGVjUHJvY2Vzc1JlcXVlc3QKYWxsb3dfaW50ZXJhY3RpdmVfcHJvY2VzcyhwX3Byb2Nlc3MsIGlfcHJvY2Vzcywgc19uYW1lLCBzX25hbWVzcGFjZSkgewogICAgcHJpbnQoImFsbG93X2ludGVyYWN0aXZlX3Byb2Nlc3M6IHN0YXJ0IikKCiAgICBhbGxvd19wcm9jZXNzX2NvbW1vbihwX3Byb2Nlc3MsIGlfcHJvY2Vzcywgc19uYW1lLCBzX25hbWVzcGFjZSkKICAgIGFsbG93X2V4ZWNfY2FwcyhpX3Byb2Nlc3MuQ2FwYWJpbGl0aWVzKQoKICAgICMgVGhlc2UgYXJlIGNvbW1hbmRzIGVuYWJsZWQgdXNpbmcgRXhlY1Byb2Nlc3NSZXF1ZXN0IGNvbW1hbmRzIGFuZC9vciByZWdleCBmcm9tIHRoZSBzZXR0aW5ncyBmaWxlLgogICAgIyBUaGV5IGNhbiBiZSBleGVjdXRlZCBpbnRlcmFjdGl2ZWx5IHNvIGFsbG93IHRoZW0gdG8gdXNlIGFueSB2YWx1ZSBmb3IgaV9wcm9jZXNzLlRlcm1pbmFsLgoKICAgIHByaW50KCJhbGxvd19pbnRlcmFjdGl2ZV9wcm9jZXNzOiB0cnVlIikKfQoKIyBDb21wYXJlIHRoZSBPQ0kgUHJvY2VzcyBmaWVsZCBvZiBhIHBvbGljeSBjb250YWluZXIgd2l0aCB0aGUgaW5wdXQgcHJvY2VzcyBmaWVsZCBmcm9tIEV4ZWNQcm9jZXNzUmVxdWVzdAphbGxvd19wcm9iZV9wcm9jZXNzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfcHJvYmVfcHJvY2Vzczogc3RhcnQiKQoKICAgIGFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgYWxsb3dfZXhlY19jYXBzKGlfcHJvY2Vzcy5DYXBhYmlsaXRpZXMpCiAgICBwX3Byb2Nlc3MuVGVybWluYWwgPT0gaV9wcm9jZXNzLlRlcm1pbmFsCgogICAgcHJpbnQoImFsbG93X3Byb2JlX3Byb2Nlc3M6IHRydWUiKQp9CgphbGxvd191c2VyKHBfcHJvY2VzcywgaV9wcm9jZXNzKSB7CiAgICBwX3VzZXIgOj0gcF9wcm9jZXNzLlVzZXIKICAgIGlfdXNlciA6PSBpX3Byb2Nlc3MuVXNlcgoKICAgIHByaW50KCJhbGxvd191c2VyOiBpbnB1dCB1aWQgPSIsIGlfdXNlci5VSUQsICJwb2xpY3kgdWlkID0iLCBwX3VzZXIuVUlEKQogICAgcF91c2VyLlVJRCA9PSBpX3VzZXIuVUlECgogICAgIyBUT0RPOiB0cmFjayBkb3duIHRoZSByZWFzb24gZm9yIHJlZ2lzdHJ5Lms4cy5pby9wYXVzZTozLjkgYmVpbmcKICAgICMgICAgICAgZXhlY3V0ZWQgd2l0aCBnaWQgPSAwIGRlc3BpdGUgaGF2aW5nICI2NTUzNTo2NTUzNSIgaW4gaXRzIGNvbnRhaW5lciBpbWFnZQogICAgIyAgICAgICBjb25maWcuCiAgICAjcHJpbnQoImFsbG93X3VzZXI6IGlucHV0IGdpZCA9IiwgaV91c2VyLkdJRCwgInBvbGljeSBnaWQgPSIsIHBfdXNlci5HSUQpCiAgICAjcF91c2VyLkdJRCA9PSBpX3VzZXIuR0lECgogICAgIyBUT0RPOiBjb21wYXJlIHRoZSBhZGRpdGlvbmFsR2lkcyBmaWVsZCB0b28gYWZ0ZXIgY29tcHV0aW5nIGl0cyB2YWx1ZQogICAgIyBiYXNlZCBvbiAvZXRjL3Bhc3N3ZCBhbmQgL2V0Yy9ncm91cCBmcm9tIHRoZSBjb250YWluZXIgaW1hZ2UuCn0KCmFsbG93X2FyZ3MocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSkgewogICAgcHJpbnQoImFsbG93X2FyZ3MgMTogbm8gYXJncyIpCgogICAgbm90IHBfcHJvY2Vzcy5BcmdzCiAgICBub3QgaV9wcm9jZXNzLkFyZ3MKCiAgICBwcmludCgiYWxsb3dfYXJncyAxOiB0cnVlIikKfQphbGxvd19hcmdzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHByaW50KCJhbGxvd19hcmdzIDI6IHBvbGljeSBhcmdzID0iLCBwX3Byb2Nlc3MuQXJncykKICAgIHByaW50KCJhbGxvd19hcmdzIDI6IGlucHV0IGFyZ3MgPSIsIGlfcHJvY2Vzcy5BcmdzKQoKICAgIGNvdW50KHBfcHJvY2Vzcy5BcmdzKSA9PSBjb3VudChpX3Byb2Nlc3MuQXJncykKCiAgICBldmVyeSBpLCBpX2FyZyBpbiBpX3Byb2Nlc3MuQXJncyB7CiAgICAgICAgYWxsb3dfYXJnKGksIGlfYXJnLCBwX3Byb2Nlc3MsIHNfbmFtZSkKICAgIH0KCiAgICBwcmludCgiYWxsb3dfYXJncyAyOiB0cnVlIikKfQphbGxvd19hcmcoaSwgaV9hcmcsIHBfcHJvY2Vzcywgc19uYW1lKSB7CiAgICBwX2FyZyA6PSBwX3Byb2Nlc3MuQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2FyZyAxOiBpID0iLCBpLCAiaV9hcmcgPSIsIGlfYXJnLCAicF9hcmcgPSIsIHBfYXJnKQoKICAgIHBfYXJnMiA6PSByZXBsYWNlKHBfYXJnLCAiJCQiLCAiJCIpCiAgICBwX2FyZzIgPT0gaV9hcmcKCiAgICBwcmludCgiYWxsb3dfYXJnIDE6IHRydWUiKQp9CmFsbG93X2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5BcmdzW2ldCiAgICBwcmludCgiYWxsb3dfYXJnIDI6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgIyBUT0RPOiBjYW4gJChub2RlLW5hbWUpIGJlIGhhbmRsZWQgYmV0dGVyPwogICAgY29udGFpbnMocF9hcmcsICIkKG5vZGUtbmFtZSkiKQoKICAgIHByaW50KCJhbGxvd19hcmcgMjogdHJ1ZSIpCn0KYWxsb3dfYXJnKGksIGlfYXJnLCBwX3Byb2Nlc3MsIHNfbmFtZSkgewogICAgcF9hcmcgOj0gcF9wcm9jZXNzLkFyZ3NbaV0KICAgIHByaW50KCJhbGxvd19hcmcgMzogaSA9IiwgaSwgImlfYXJnID0iLCBpX2FyZywgInBfYXJnID0iLCBwX2FyZykKCiAgICBwX2FyZzIgOj0gcmVwbGFjZShwX2FyZywgIiQkIiwgIiQiKQogICAgcF9hcmczIDo9IHJlcGxhY2UocF9hcmcyLCAiJChzYW5kYm94LW5hbWUpIiwgc19uYW1lKQogICAgcHJpbnQoImFsbG93X2FyZyAzOiBwX2FyZzMgPSIsIHBfYXJnMykKICAgIHBfYXJnMyA9PSBpX2FyZwoKICAgIHByaW50KCJhbGxvd19hcmcgMzogdHJ1ZSIpCn0KCiMgT0NJIHByb2Nlc3MuRW52IGZpZWxkCmFsbG93X2VudihwX3Byb2Nlc3MsIGlfcHJvY2Vzcywgc19uYW1lLCBzX25hbWVzcGFjZSkgewogICAgcHJpbnQoImFsbG93X2VudjogcCBlbnYgPSIsIHBfcHJvY2Vzcy5FbnYpCiAgICBwcmludCgiYWxsb3dfZW52OiBpIGVudiA9IiwgaV9wcm9jZXNzLkVudikKCiAgICBldmVyeSBpX3ZhciBpbiBpX3Byb2Nlc3MuRW52IHsKICAgICAgICBwcmludCgiYWxsb3dfZW52OiBpX3ZhciA9IiwgaV92YXIpCiAgICAgICAgYWxsb3dfdmFyKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBpX3Zhciwgc19uYW1lLCBzX25hbWVzcGFjZSkKICAgIH0KCiAgICBwcmludCgiYWxsb3dfZW52OiB0cnVlIikKfQoKIyBBbGxvdyBpbnB1dCBlbnYgdmFyaWFibGVzIHRoYXQgYXJlIHByZXNlbnQgaW4gdGhlIHBvbGljeSBkYXRhIHRvby4KYWxsb3dfdmFyKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBpX3Zhciwgc19uYW1lLCBzX25hbWVzcGFjZSkgewogICAgc29tZSBwX3ZhciBpbiBwX3Byb2Nlc3MuRW52CiAgICBwX3ZhciA9PSBpX3ZhcgogICAgcHJpbnQoImFsbG93X3ZhciAxOiB0cnVlIikKfQoKIyBNYXRjaCBpbnB1dCB3aXRoIG9uZSBvZiB0aGUgcG9saWN5IHZhcmlhYmxlcywgYWZ0ZXIgc3Vic3RpdHV0aW5nICQoc2FuZGJveC1uYW1lKS4KYWxsb3dfdmFyKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBpX3Zhciwgc19uYW1lLCBzX25hbWVzcGFjZSkgewogICAgc29tZSBwX3ZhciBpbiBwX3Byb2Nlc3MuRW52CiAgICBwX3ZhcjIgOj0gcmVwbGFjZShwX3ZhciwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKCiAgICBwcmludCgiYWxsb3dfdmFyIDI6IHBfdmFyMiA9IiwgcF92YXIyKQogICAgcF92YXIyID09IGlfdmFyCgogICAgcHJpbnQoImFsbG93X3ZhciAyOiB0cnVlIikKfQoKIyBBbGxvdyBpbnB1dCBlbnYgdmFyaWFibGVzIHRoYXQgbWF0Y2ggd2l0aCBhIHJlcXVlc3RfZGVmYXVsdHMgcmVnZXguCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHNvbWUgcF9yZWdleDEgaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5DcmVhdGVDb250YWluZXJSZXF1ZXN0LmFsbG93X2Vudl9yZWdleAogICAgcF9yZWdleDIgOj0gcmVwbGFjZShwX3JlZ2V4MSwgIiQoaXB2NF9hKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcHY0X2EpCiAgICBwX3JlZ2V4MyA6PSByZXBsYWNlKHBfcmVnZXgyLCAiJChpcF9wKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcF9wKQogICAgcF9yZWdleDQgOj0gcmVwbGFjZShwX3JlZ2V4MywgIiQoc3ZjX25hbWUpIiwgcG9saWN5X2RhdGEuY29tbW9uLnN2Y19uYW1lKQogICAgcF9yZWdleDUgOj0gcmVwbGFjZShwX3JlZ2V4NCwgIiQoZG5zX2xhYmVsKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5kbnNfbGFiZWwpCgogICAgcHJpbnQoImFsbG93X3ZhciAzOiBwX3JlZ2V4NSA9IiwgcF9yZWdleDUpCiAgICByZWdleC5tYXRjaChwX3JlZ2V4NSwgaV92YXIpCgogICAgcHJpbnQoImFsbG93X3ZhciAzOiB0cnVlIikKfQoKIyBBbGxvdyBmaWVsZFJlZiAiZmllbGRQYXRoOiBzdGF0dXMucG9kSVAiIHZhbHVlcy4KYWxsb3dfdmFyKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBpX3Zhciwgc19uYW1lLCBzX25hbWVzcGFjZSkgewogICAgbmFtZV92YWx1ZSA6PSBzcGxpdChpX3ZhciwgIj0iKQogICAgY291bnQobmFtZV92YWx1ZSkgPT0gMgogICAgaXNfaXAobmFtZV92YWx1ZVsxXSkKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIGFsbG93X3BvZF9pcF92YXIobmFtZV92YWx1ZVswXSwgcF92YXIpCgogICAgcHJpbnQoImFsbG93X3ZhciA0OiB0cnVlIikKfQoKIyBBbGxvdyBjb21tb24gZmllbGRSZWYgdmFyaWFibGVzLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBuYW1lX3ZhbHVlIDo9IHNwbGl0KGlfdmFyLCAiPSIpCiAgICBjb3VudChuYW1lX3ZhbHVlKSA9PSAyCgogICAgc29tZSBwX3ZhciBpbiBwX3Byb2Nlc3MuRW52CiAgICBwX25hbWVfdmFsdWUgOj0gc3BsaXQocF92YXIsICI9IikKICAgIGNvdW50KHBfbmFtZV92YWx1ZSkgPT0gMgoKICAgIHBfbmFtZV92YWx1ZVswXSA9PSBuYW1lX3ZhbHVlWzBdCgogICAgIyBUT0RPOiBzaG91bGQgdGhlc2UgYmUgaGFuZGxlZCBpbiBhIGRpZmZlcmVudCB3YXk/CiAgICBhbHdheXNfYWxsb3dlZCA6PSBbIiQoaG9zdC1uYW1lKSIsICIkKG5vZGUtbmFtZSkiLCAiJChwb2QtdWlkKSJdCiAgICBzb21lIGFsbG93ZWQgaW4gYWx3YXlzX2FsbG93ZWQKICAgIGNvbnRhaW5zKHBfbmFtZV92YWx1ZVsxXSwgYWxsb3dlZCkKCiAgICBwcmludCgiYWxsb3dfdmFyIDU6IHRydWUiKQp9CgojIEFsbG93IGZpZWxkUmVmICJmaWVsZFBhdGg6IHN0YXR1cy5ob3N0SVAiIHZhbHVlcy4KYWxsb3dfdmFyKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBpX3Zhciwgc19uYW1lLCBzX25hbWVzcGFjZSkgewogICAgbmFtZV92YWx1ZSA6PSBzcGxpdChpX3ZhciwgIj0iKQogICAgY291bnQobmFtZV92YWx1ZSkgPT0gMgogICAgaXNfaXAobmFtZV92YWx1ZVsxXSkKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIGFsbG93X2hvc3RfaXBfdmFyKG5hbWVfdmFsdWVbMF0sIHBfdmFyKQoKICAgIHByaW50KCJhbGxvd192YXIgNjogdHJ1ZSIpCn0KCiMgQWxsb3cgcmVzb3VyY2VGaWVsZFJlZiB2YWx1ZXMgKGUuZy4sICJsaW1pdHMuY3B1IikuCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIG5hbWVfdmFsdWUgOj0gc3BsaXQoaV92YXIsICI9IikKICAgIGNvdW50KG5hbWVfdmFsdWUpID09IDIKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHBfbmFtZV92YWx1ZSA6PSBzcGxpdChwX3ZhciwgIj0iKQogICAgY291bnQocF9uYW1lX3ZhbHVlKSA9PSAyCgogICAgcF9uYW1lX3ZhbHVlWzBdID09IG5hbWVfdmFsdWVbMF0KCiAgICAjIFRPRE86IHNob3VsZCB0aGVzZSBiZSBoYW5kbGVkIGluIGEgZGlmZmVyZW50IHdheT8KICAgIGFsd2F5c19hbGxvd2VkID0gWyIkKHJlc291cmNlLWZpZWxkKSIsICIkKHRvZG8tYW5ub3RhdGlvbikiXQogICAgc29tZSBhbGxvd2VkIGluIGFsd2F5c19hbGxvd2VkCiAgICBjb250YWlucyhwX25hbWVfdmFsdWVbMV0sIGFsbG93ZWQpCgogICAgcHJpbnQoImFsbG93X3ZhciA3OiB0cnVlIikKfQoKYWxsb3dfdmFyKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBpX3Zhciwgc19uYW1lLCBzX25hbWVzcGFjZSkgewogICAgc29tZSBwX3ZhciBpbiBwX3Byb2Nlc3MuRW52CiAgICBwX3ZhcjIgOj0gcmVwbGFjZShwX3ZhciwgIiQoc2FuZGJveC1uYW1lc3BhY2UpIiwgc19uYW1lc3BhY2UpCgogICAgcHJpbnQoImFsbG93X3ZhciA4OiBwX3ZhcjIgPSIsIHBfdmFyMikKICAgIHBfdmFyMiA9PSBpX3ZhcgoKICAgIHByaW50KCJhbGxvd192YXIgODogdHJ1ZSIpCn0KCmFsbG93X3BvZF9pcF92YXIodmFyX25hbWUsIHBfdmFyKSB7CiAgICBwcmludCgiYWxsb3dfcG9kX2lwX3ZhcjogdmFyX25hbWUgPSIsIHZhcl9uYW1lLCAicF92YXIgPSIsIHBfdmFyKQoKICAgIHBfbmFtZV92YWx1ZSA6PSBzcGxpdChwX3ZhciwgIj0iKQogICAgY291bnQocF9uYW1lX3ZhbHVlKSA9PSAyCgogICAgcF9uYW1lX3ZhbHVlWzBdID09IHZhcl9uYW1lCiAgICBwX25hbWVfdmFsdWVbMV0gPT0gIiQocG9kLWlwKSIKCiAgICBwcmludCgiYWxsb3dfcG9kX2lwX3ZhcjogdHJ1ZSIpCn0KCmFsbG93X2hvc3RfaXBfdmFyKHZhcl9uYW1lLCBwX3ZhcikgewogICAgcHJpbnQoImFsbG93X2hvc3RfaXBfdmFyOiB2YXJfbmFtZSA9IiwgdmFyX25hbWUsICJwX3ZhciA9IiwgcF92YXIpCgogICAgcF9uYW1lX3ZhbHVlIDo9IHNwbGl0KHBfdmFyLCAiPSIpCiAgICBjb3VudChwX25hbWVfdmFsdWUpID09IDIKCiAgICBwX25hbWVfdmFsdWVbMF0gPT0gdmFyX25hbWUKICAgIHBfbmFtZV92YWx1ZVsxXSA9PSAiJChob3N0LWlwKSIKCiAgICBwcmludCgiYWxsb3dfaG9zdF9pcF92YXI6IHRydWUiKQp9Cgppc19pcCh2YWx1ZSkgewogICAgYnl0ZXMgPSBzcGxpdCh2YWx1ZSwgIi4iKQogICAgY291bnQoYnl0ZXMpID09IDQKCiAgICBpc19pcF9maXJzdF9ieXRlKGJ5dGVzWzBdKQogICAgaXNfaXBfb3RoZXJfYnl0ZShieXRlc1sxXSkKICAgIGlzX2lwX290aGVyX2J5dGUoYnl0ZXNbMl0pCiAgICBpc19pcF9vdGhlcl9ieXRlKGJ5dGVzWzNdKQp9CmlzX2lwX2ZpcnN0X2J5dGUoY29tcG9uZW50KSB7CiAgICBudW1iZXIgPSB0b19udW1iZXIoY29tcG9uZW50KQogICAgbnVtYmVyID49IDEKICAgIG51bWJlciA8PSAyNTUKfQppc19pcF9vdGhlcl9ieXRlKGNvbXBvbmVudCkgewogICAgbnVtYmVyID0gdG9fbnVtYmVyKGNvbXBvbmVudCkKICAgIG51bWJlciA+PSAwCiAgICBudW1iZXIgPD0gMjU1Cn0KCiMgT0NJIHJvb3QuUGF0aAphbGxvd19yb290X3BhdGgocF9vY2ksIGlfb2NpLCBidW5kbGVfaWQpIHsKICAgIGlfcGF0aCA6PSBpX29jaS5Sb290LlBhdGgKICAgIHBfcGF0aDEgOj0gcF9vY2kuUm9vdC5QYXRoCiAgICBwcmludCgiYWxsb3dfcm9vdF9wYXRoOiBpX3BhdGggPSIsIGlfcGF0aCwgInBfcGF0aDEgPSIsIHBfcGF0aDEpCgogICAgcF9wYXRoMiA6PSByZXBsYWNlKHBfcGF0aDEsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5jcGF0aCkKICAgIHByaW50KCJhbGxvd19yb290X3BhdGg6IHBfcGF0aDIgPSIsIHBfcGF0aDIpCgogICAgcF9wYXRoMyA6PSByZXBsYWNlKHBfcGF0aDIsICIkKGJ1bmRsZS1pZCkiLCBidW5kbGVfaWQpCiAgICBwcmludCgiYWxsb3dfcm9vdF9wYXRoOiBwX3BhdGgzID0iLCBwX3BhdGgzKQoKICAgIHBfcGF0aDMgPT0gaV9wYXRoCgogICAgcHJpbnQoImFsbG93X3Jvb3RfcGF0aDogdHJ1ZSIpCn0KCiMgZGV2aWNlIG1vdW50cwphbGxvd19tb3VudChwX29jaSwgaV9tb3VudCwgYnVuZGxlX2lkLCBzYW5kYm94X2lkKSB7CiAgICBwcmludCgiYWxsb3dfbW91bnQ6IGlfbW91bnQgPSIsIGlfbW91bnQpCgogICAgc29tZSBwX21vdW50IGluIHBfb2NpLk1vdW50cwogICAgcHJpbnQoImFsbG93X21vdW50OiBwX21vdW50ID0iLCBwX21vdW50KQogICAgY2hlY2tfbW91bnQocF9tb3VudCwgaV9tb3VudCwgYnVuZGxlX2lkLCBzYW5kYm94X2lkKQoKICAgICMgVE9ETzogYXJlIHRoZXJlIGFueSBvdGhlciByZXF1aXJlZCBwb2xpY3kgY2hlY2tzIGZvciBtb3VudHMgLSBlLmcuLAogICAgIyAgICAgICBtdWx0aXBsZSBtb3VudHMgd2l0aCBzYW1lIHNvdXJjZSBvciBkZXN0aW5hdGlvbj8KCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IHRydWUiKQp9CgpjaGVja19tb3VudChwX21vdW50LCBpX21vdW50LCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHBfbW91bnQgPT0gaV9tb3VudAogICAgcHJpbnQoImNoZWNrX21vdW50IDE6IHRydWUiKQp9CmNoZWNrX21vdW50KHBfbW91bnQsIGlfbW91bnQsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcF9tb3VudC5kZXN0aW5hdGlvbiA9PSBpX21vdW50LmRlc3RpbmF0aW9uCiAgICBwX21vdW50LnR5cGVfID09IGlfbW91bnQudHlwZV8KICAgIHBfbW91bnQub3B0aW9ucyA9PSBpX21vdW50Lm9wdGlvbnMKCiAgICBtb3VudF9zb3VyY2VfYWxsb3dzKHBfbW91bnQsIGlfbW91bnQsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkKCiAgICBwcmludCgiY2hlY2tfbW91bnQgMjogdHJ1ZSIpCn0KCm1vdW50X3NvdXJjZV9hbGxvd3MocF9tb3VudCwgaV9tb3VudCwgYnVuZGxlX2lkLCBzYW5kYm94X2lkKSB7CiAgICByZWdleDEgOj0gcF9tb3VudC5zb3VyY2UKICAgIHJlZ2V4MiA6PSByZXBsYWNlKHJlZ2V4MSwgIiQoc2ZwcmVmaXgpIiwgcG9saWN5X2RhdGEuY29tbW9uLnNmcHJlZml4KQogICAgcmVnZXgzIDo9IHJlcGxhY2UocmVnZXgyLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICByZWdleDQgOj0gcmVwbGFjZShyZWdleDMsICIkKGJ1bmRsZS1pZCkiLCBidW5kbGVfaWQpCgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMTogcmVnZXg0ID0iLCByZWdleDQpCiAgICByZWdleC5tYXRjaChyZWdleDQsIGlfbW91bnQuc291cmNlKQoKICAgIHByaW50KCJtb3VudF9zb3VyY2VfYWxsb3dzIDE6IHRydWUiKQp9Cm1vdW50X3NvdXJjZV9hbGxvd3MocF9tb3VudCwgaV9tb3VudCwgYnVuZGxlX2lkLCBzYW5kYm94X2lkKSB7CiAgICByZWdleDEgOj0gcF9tb3VudC5zb3VyY2UKICAgIHJlZ2V4MiA6PSByZXBsYWNlKHJlZ2V4MSwgIiQoc2ZwcmVmaXgpIiwgcG9saWN5X2RhdGEuY29tbW9uLnNmcHJlZml4KQogICAgcmVnZXgzIDo9IHJlcGxhY2UocmVnZXgyLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICByZWdleDQgOj0gcmVwbGFjZShyZWdleDMsICIkKHNhbmRib3gtaWQpIiwgc2FuZGJveF9pZCkKCiAgICBwcmludCgibW91bnRfc291cmNlX2FsbG93cyAyOiByZWdleDQgPSIsIHJlZ2V4NCkKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4NCwgaV9tb3VudC5zb3VyY2UpCgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMjogdHJ1ZSIpCn0KbW91bnRfc291cmNlX2FsbG93cyhwX21vdW50LCBpX21vdW50LCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHByaW50KCJtb3VudF9zb3VyY2VfYWxsb3dzIDM6IGlfbW91bnQuc291cmNlPSIsIGlfbW91bnQuc291cmNlKQoKICAgIGlfc291cmNlX3BhcnRzID0gc3BsaXQoaV9tb3VudC5zb3VyY2UsICIvIikKICAgIGI2NF9kaXJlY3Rfdm9sX3BhdGggPSBpX3NvdXJjZV9wYXJ0c1tjb3VudChpX3NvdXJjZV9wYXJ0cykgLSAxXQoKICAgIGJhc2U2NC5pc192YWxpZChiNjRfZGlyZWN0X3ZvbF9wYXRoKQoKICAgIHNvdXJjZTEgOj0gcF9tb3VudC5zb3VyY2UKICAgIHByaW50KCJtb3VudF9zb3VyY2VfYWxsb3dzIDM6IHNvdXJjZTEgPSIsIHNvdXJjZTEpCgogICAgc291cmNlMiA6PSByZXBsYWNlKHNvdXJjZTEsICIkKHNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5zcGF0aCkKICAgIHByaW50KCJtb3VudF9zb3VyY2VfYWxsb3dzIDM6IHNvdXJjZTIgPSIsIHNvdXJjZTIpCgogICAgc291cmNlMyA6PSByZXBsYWNlKHNvdXJjZTIsICIkKGI2NC1kaXJlY3Qtdm9sLXBhdGgpIiwgYjY0X2RpcmVjdF92b2xfcGF0aCkKICAgIHByaW50KCJtb3VudF9zb3VyY2VfYWxsb3dzIDM6IHNvdXJjZTMgPSIsIHNvdXJjZTMpCgogICAgc291cmNlMyA9PSBpX21vdW50LnNvdXJjZQoKICAgIHByaW50KCJtb3VudF9zb3VyY2VfYWxsb3dzIDM6IHRydWUiKQp9CgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgQ3JlYXRlIGNvbnRhaW5lciBTdG9yYWdlcwoKYWxsb3dfc3RvcmFnZXMocF9zdG9yYWdlcywgaV9zdG9yYWdlcywgYnVuZGxlX2lkLCBzYW5kYm94X2lkKSB7CiAgICBwX2NvdW50IDo9IGNvdW50KHBfc3RvcmFnZXMpCiAgICBpX2NvdW50IDo9IGNvdW50KGlfc3RvcmFnZXMpCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZXM6IHBfY291bnQgPSIsIHBfY291bnQsICJpX2NvdW50ID0iLCBpX2NvdW50KQoKICAgIHBfY291bnQgPT0gaV9jb3VudAoKICAgICMgR2V0IHRoZSBjb250YWluZXIgaW1hZ2UgbGF5ZXIgSURzIGFuZCB2ZXJpdHkgcm9vdCBoYXNoZXMsIGZyb20gdGhlICJvdmVybGF5ZnMiIHN0b3JhZ2UuCiAgICBzb21lIG92ZXJsYXlfc3RvcmFnZSBpbiBwX3N0b3JhZ2VzCiAgICBvdmVybGF5X3N0b3JhZ2UuZHJpdmVyID09ICJvdmVybGF5ZnMiCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZXM6IG92ZXJsYXlfc3RvcmFnZSA9Iiwgb3ZlcmxheV9zdG9yYWdlKQogICAgY291bnQob3ZlcmxheV9zdG9yYWdlLm9wdGlvbnMpID09IDIKCiAgICBsYXllcl9pZHMgOj0gc3BsaXQob3ZlcmxheV9zdG9yYWdlLm9wdGlvbnNbMF0sICI6IikKICAgIHByaW50KCJhbGxvd19zdG9yYWdlczogbGF5ZXJfaWRzID0iLCBsYXllcl9pZHMpCgogICAgcm9vdF9oYXNoZXMgOj0gc3BsaXQob3ZlcmxheV9zdG9yYWdlLm9wdGlvbnNbMV0sICI6IikKICAgIHByaW50KCJhbGxvd19zdG9yYWdlczogcm9vdF9oYXNoZXMgPSIsIHJvb3RfaGFzaGVzKQoKICAgIGV2ZXJ5IGlfc3RvcmFnZSBpbiBpX3N0b3JhZ2VzIHsKICAgICAgICBhbGxvd19zdG9yYWdlKHBfc3RvcmFnZXMsIGlfc3RvcmFnZSwgYnVuZGxlX2lkLCBzYW5kYm94X2lkLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKQogICAgfQoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlczogdHJ1ZSIpCn0KCmFsbG93X3N0b3JhZ2UocF9zdG9yYWdlcywgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHNvbWUgcF9zdG9yYWdlIGluIHBfc3RvcmFnZXMKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZTogcF9zdG9yYWdlID0iLCBwX3N0b3JhZ2UpCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZTogaV9zdG9yYWdlID0iLCBpX3N0b3JhZ2UpCgogICAgcF9zdG9yYWdlLmRyaXZlciAgICAgICAgICAgPT0gaV9zdG9yYWdlLmRyaXZlcgogICAgcF9zdG9yYWdlLmRyaXZlcl9vcHRpb25zICAgPT0gaV9zdG9yYWdlLmRyaXZlcl9vcHRpb25zCiAgICBwX3N0b3JhZ2UuZnNfZ3JvdXAgICAgICAgICA9PSBpX3N0b3JhZ2UuZnNfZ3JvdXAKCiAgICBhbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpCiAgICBhbGxvd19tb3VudF9wb2ludChwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgYnVuZGxlX2lkLCBzYW5kYm94X2lkLCBsYXllcl9pZHMpCgogICAgIyBUT0RPOiB2YWxpZGF0ZSB0aGUgc291cmNlIGZpZWxkIHRvby4KCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZTogdHJ1ZSIpCn0KCmFsbG93X3N0b3JhZ2Vfb3B0aW9ucyhwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAxOiBzdGFydCIpCgogICAgcF9zdG9yYWdlLmRyaXZlciAhPSAib3ZlcmxheWZzIgogICAgcF9zdG9yYWdlLm9wdGlvbnMgPT0gaV9zdG9yYWdlLm9wdGlvbnMKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDE6IHRydWUiKQp9CmFsbG93X3N0b3JhZ2Vfb3B0aW9ucyhwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBzdGFydCIpCgogICAgcF9zdG9yYWdlLmRyaXZlciA9PSAib3ZlcmxheWZzIgogICAgY291bnQocF9zdG9yYWdlLm9wdGlvbnMpID09IDIKCiAgICBwb2xpY3lfaWRzIDo9IHNwbGl0KHBfc3RvcmFnZS5vcHRpb25zWzBdLCAiOiIpCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IHBvbGljeV9pZHMgPSIsIHBvbGljeV9pZHMpCiAgICBwb2xpY3lfaWRzID09IGxheWVyX2lkcwoKICAgIHBvbGljeV9oYXNoZXMgOj0gc3BsaXQocF9zdG9yYWdlLm9wdGlvbnNbMV0sICI6IikKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogcG9saWN5X2hhc2hlcyA9IiwgcG9saWN5X2hhc2hlcykKCiAgICBwX2NvdW50IDo9IGNvdW50KHBvbGljeV9pZHMpCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IHBfY291bnQgPSIsIHBfY291bnQpCiAgICBwX2NvdW50ID49IDEKICAgIHBfY291bnQgPT0gY291bnQocG9saWN5X2hhc2hlcykKCiAgICBpX2NvdW50IDo9IGNvdW50KGlfc3RvcmFnZS5vcHRpb25zKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBpX2NvdW50ID0iLCBpX2NvdW50KQogICAgaV9jb3VudCA9PSBwX2NvdW50ICsgMwoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogaV9zdG9yYWdlLm9wdGlvbnNbMF0gPSIsIGlfc3RvcmFnZS5vcHRpb25zWzBdKQogICAgaV9zdG9yYWdlLm9wdGlvbnNbMF0gPT0gImlvLmthdGFjb250YWluZXJzLmZzLW9wdC5sYXllci1zcmMtcHJlZml4PS92YXIvbGliL2NvbnRhaW5lcmQvaW8uY29udGFpbmVyZC5zbmFwc2hvdHRlci52MS50YXJkZXYvbGF5ZXJzIgoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDJdID0iLCBpX3N0b3JhZ2Uub3B0aW9uc1tpX2NvdW50IC0gMl0pCiAgICBpX3N0b3JhZ2Uub3B0aW9uc1tpX2NvdW50IC0gMl0gPT0gImlvLmthdGFjb250YWluZXJzLmZzLW9wdC5vdmVybGF5LXJ3IgoKICAgIGxvd2VyZGlyIDo9IGNvbmNhdCgiPSIsIFsibG93ZXJkaXIiLCBwX3N0b3JhZ2Uub3B0aW9uc1swXV0pCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGxvd2VyZGlyID0iLCBsb3dlcmRpcikKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zW2lfY291bnQgLSAxXSA9IiwgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDFdKQogICAgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDFdID09IGxvd2VyZGlyCgogICAgZXZlcnkgaSwgcG9saWN5X2lkIGluIHBvbGljeV9pZHMgewogICAgICAgIGFsbG93X292ZXJsYXlfbGF5ZXIocG9saWN5X2lkLCBwb2xpY3lfaGFzaGVzW2ldLCBpX3N0b3JhZ2Uub3B0aW9uc1tpICsgMV0pCiAgICB9CgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiB0cnVlIikKfQphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMzogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gImJsayIKICAgIGNvdW50KHBfc3RvcmFnZS5vcHRpb25zKSA9PSAxCgogICAgc3RhcnRzd2l0aChwX3N0b3JhZ2Uub3B0aW9uc1swXSwgIiQoaGFzaCIpCiAgICBoYXNoX3N1ZmZpeCA6PSB0cmltX2xlZnQocF9zdG9yYWdlLm9wdGlvbnNbMF0sICIkKGhhc2giKQoKICAgIGVuZHN3aXRoKGhhc2hfc3VmZml4LCAiKSIpCiAgICBoYXNoX2luZGV4IDo9IHRyaW1fcmlnaHQoaGFzaF9zdWZmaXgsICIpIikKICAgIGkgOj0gdG9fbnVtYmVyKGhhc2hfaW5kZXgpCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDM6IGkgPSIsIGkpCgogICAgaGFzaF9vcHRpb24gOj0gY29uY2F0KCI9IiwgWyJpby5rYXRhY29udGFpbmVycy5mcy1vcHQucm9vdC1oYXNoIiwgcm9vdF9oYXNoZXNbaV1dKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAzOiBoYXNoX29wdGlvbiA9IiwgaGFzaF9vcHRpb24pCgogICAgY291bnQoaV9zdG9yYWdlLm9wdGlvbnMpID09IDQKICAgIGlfc3RvcmFnZS5vcHRpb25zWzBdID09ICJybyIKICAgIGlfc3RvcmFnZS5vcHRpb25zWzFdID09ICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQuYmxvY2tfZGV2aWNlPWZpbGUiCiAgICBpX3N0b3JhZ2Uub3B0aW9uc1syXSA9PSAiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmlzLWxheWVyIgogICAgaV9zdG9yYWdlLm9wdGlvbnNbM10gPT0gaGFzaF9vcHRpb24KCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDM6IHRydWUiKQp9CmFsbG93X3N0b3JhZ2Vfb3B0aW9ucyhwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyA0OiBzdGFydCIpCgogICAgcF9zdG9yYWdlLmRyaXZlciA9PSAic21iIgogICAgcF9vcHRzX2NvdW50IDo9IGNvdW50KHBfc3RvcmFnZS5vcHRpb25zKQogICAgaV9vcHRzX2NvdW50IDo9IGNvdW50KGlfc3RvcmFnZS5vcHRpb25zKQogICAgaV9vcHRzX2NvdW50ID09IHBfb3B0c19jb3VudCArIDIKCiAgICBpX29wdF9tYXRjaGVzIDo9IFtpIHwgaSA6PSBpZHg7IGlkeCA8IHBfb3B0c19jb3VudDsgcF9zdG9yYWdlLm9wdGlvbnNbaWR4XSA9PSBpX3N0b3JhZ2Uub3B0aW9uc1tpZHhdXQogICAgY291bnQoaV9vcHRfbWF0Y2hlcykgPT0gcF9vcHRzX2NvdW50CgogICAgc3RhcnRzd2l0aChpX3N0b3JhZ2Uub3B0aW9uc1tpX29wdHNfY291bnQtMl0sICJhZGRyPSIpCiAgICBjcmVkcyA9IHNwbGl0KGlfc3RvcmFnZS5vcHRpb25zW2lfb3B0c19jb3VudC0xXSwgIiwiKQogICAgY291bnQoY3JlZHMpID09IDIKICAgIHN0YXJ0c3dpdGgoY3JlZHNbMF0sICJ1c2VybmFtZT0iKQogICAgc3RhcnRzd2l0aChjcmVkc1sxXSwgInBhc3N3b3JkPSIpCiAgICAKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgNDogdHJ1ZSIpCn0KCmFsbG93X292ZXJsYXlfbGF5ZXIocG9saWN5X2lkLCBwb2xpY3lfaGFzaCwgaV9vcHRpb24pIHsKICAgIHByaW50KCJhbGxvd19vdmVybGF5X2xheWVyOiBwb2xpY3lfaWQgPSIsIHBvbGljeV9pZCwgInBvbGljeV9oYXNoID0iLCBwb2xpY3lfaGFzaCkKICAgIHByaW50KCJhbGxvd19vdmVybGF5X2xheWVyOiBpX29wdGlvbiA9IiwgaV9vcHRpb24pCgogICAgc3RhcnRzd2l0aChpX29wdGlvbiwgImlvLmthdGFjb250YWluZXJzLmZzLW9wdC5sYXllcj0iKQogICAgaV92YWx1ZSA6PSByZXBsYWNlKGlfb3B0aW9uLCAiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmxheWVyPSIsICIiKQogICAgaV92YWx1ZV9kZWNvZGVkIDo9IGJhc2U2NC5kZWNvZGUoaV92YWx1ZSkKICAgIHByaW50KCJhbGxvd19vdmVybGF5X2xheWVyOiBpX3ZhbHVlX2RlY29kZWQgPSIsIGlfdmFsdWVfZGVjb2RlZCkKCiAgICBwb2xpY3lfc3VmZml4IDo9IGNvbmNhdCgiPSIsIFsidGFyLHJvLGlvLmthdGFjb250YWluZXJzLmZzLW9wdC5ibG9ja19kZXZpY2U9ZmlsZSxpby5rYXRhY29udGFpbmVycy5mcy1vcHQuaXMtbGF5ZXIsaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LnJvb3QtaGFzaCIsIHBvbGljeV9oYXNoXSkKICAgIHBfdmFsdWUgOj0gY29uY2F0KCIsIiwgW3BvbGljeV9pZCwgcG9saWN5X3N1ZmZpeF0pCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogcF92YWx1ZSA9IiwgcF92YWx1ZSkKCiAgICBwX3ZhbHVlID09IGlfdmFsdWVfZGVjb2RlZAoKICAgIHByaW50KCJhbGxvd19vdmVybGF5X2xheWVyOiB0cnVlIikKfQoKYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKSB7CiAgICBwX3N0b3JhZ2UuZnN0eXBlID09ICJ0YXIiCgogICAgc3RhcnRzd2l0aChwX3N0b3JhZ2UubW91bnRfcG9pbnQsICIkKGxheWVyIikKICAgIG1vdW50X3N1ZmZpeCA6PSB0cmltX2xlZnQocF9zdG9yYWdlLm1vdW50X3BvaW50LCAiJChsYXllciIpCgogICAgZW5kc3dpdGgobW91bnRfc3VmZml4LCAiKSIpCiAgICBsYXllcl9pbmRleCA6PSB0cmltX3JpZ2h0KG1vdW50X3N1ZmZpeCwgIikiKQogICAgaSA6PSB0b19udW1iZXIobGF5ZXJfaW5kZXgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMTogaSA9IiwgaSkKCiAgICBsYXllcl9pZCA6PSBsYXllcl9pZHNbaV0KICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCAxOiBsYXllcl9pZCA9IiwgbGF5ZXJfaWQpCgogICAgcF9tb3VudCA6PSBjb25jYXQoIi8iLCBbIi9ydW4va2F0YS1jb250YWluZXJzL3NhbmRib3gvbGF5ZXJzIiwgbGF5ZXJfaWRdKQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDE6IHBfbW91bnQgPSIsIHBfbW91bnQpCgogICAgcF9tb3VudCA9PSBpX3N0b3JhZ2UubW91bnRfcG9pbnQKCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMTogdHJ1ZSIpCn0KYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKSB7CiAgICBwX3N0b3JhZ2UuZnN0eXBlID09ICJmdXNlMy5rYXRhLW92ZXJsYXkiCgogICAgbW91bnQxIDo9IHJlcGxhY2UocF9zdG9yYWdlLm1vdW50X3BvaW50LCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBtb3VudDIgOj0gcmVwbGFjZShtb3VudDEsICIkKGJ1bmRsZS1pZCkiLCBidW5kbGVfaWQpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMjogbW91bnQyID0iLCBtb3VudDIpCgogICAgbW91bnQyID09IGlfc3RvcmFnZS5tb3VudF9wb2ludAoKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCAyOiB0cnVlIikKfQphbGxvd19tb3VudF9wb2ludChwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgYnVuZGxlX2lkLCBzYW5kYm94X2lkLCBsYXllcl9pZHMpIHsKICAgIHBfc3RvcmFnZS5mc3R5cGUgPT0gImxvY2FsIgoKICAgIG1vdW50MSA6PSBwX3N0b3JhZ2UubW91bnRfcG9pbnQKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCAzOiBtb3VudDEgPSIsIG1vdW50MSkKCiAgICBtb3VudDIgOj0gcmVwbGFjZShtb3VudDEsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5jcGF0aCkKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCAzOiBtb3VudDIgPSIsIG1vdW50MikKCiAgICBtb3VudDMgOj0gcmVwbGFjZShtb3VudDIsICIkKHNhbmRib3gtaWQpIiwgc2FuZGJveF9pZCkKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCAzOiBtb3VudDMgPSIsIG1vdW50MykKCiAgICByZWdleC5tYXRjaChtb3VudDMsIGlfc3RvcmFnZS5tb3VudF9wb2ludCkKCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogdHJ1ZSIpCn0KYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKSB7CiAgICBwX3N0b3JhZ2UuZnN0eXBlID09ICJiaW5kIgoKICAgIG1vdW50MSA6PSBwX3N0b3JhZ2UubW91bnRfcG9pbnQKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA0OiBtb3VudDEgPSIsIG1vdW50MSkKCiAgICBtb3VudDIgOj0gcmVwbGFjZShtb3VudDEsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5jcGF0aCkKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA0OiBtb3VudDIgPSIsIG1vdW50MikKCiAgICBtb3VudDMgOj0gcmVwbGFjZShtb3VudDIsICIkKGJ1bmRsZS1pZCkiLCBidW5kbGVfaWQpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNDogbW91bnQzID0iLCBtb3VudDMpCgogICAgcmVnZXgubWF0Y2gobW91bnQzLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCgogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDQ6IHRydWUiKQp9CmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAidG1wZnMiCgogICAgbW91bnQxIDo9IHBfc3RvcmFnZS5tb3VudF9wb2ludAogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDU6IG1vdW50MSA9IiwgbW91bnQxKQoKICAgIHJlZ2V4Lm1hdGNoKG1vdW50MSwgaV9zdG9yYWdlLm1vdW50X3BvaW50KQoKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA1OiB0cnVlIikKfQphbGxvd19tb3VudF9wb2ludChwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgYnVuZGxlX2lkLCBzYW5kYm94X2lkLCBsYXllcl9pZHMpIHsKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA2OiBpX3N0b3JhZ2UubW91bnRfcG9pbnQgPSIsIGlfc3RvcmFnZS5tb3VudF9wb2ludCkKICAgIGFsbG93X2RpcmVjdF92b2xfZHJpdmVyKHBfc3RvcmFnZSwgaV9zdG9yYWdlKQoKICAgIG1vdW50MSA6PSBwX3N0b3JhZ2UubW91bnRfcG9pbnQKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA2OiBtb3VudDEgPSIsIG1vdW50MSkKCiAgICBtb3VudDIgOj0gcmVwbGFjZShtb3VudDEsICIkKHNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5zcGF0aCkKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA2OiBtb3VudDIgPSIsIG1vdW50MikKCiAgICBkaXJlY3Rfdm9sX3BhdGggOj0gaV9zdG9yYWdlLnNvdXJjZQogICAgbW91bnQzIDo9IHJlcGxhY2UobW91bnQyLCAiJChiNjQtZGlyZWN0LXZvbC1wYXRoKSIsIGJhc2U2NHVybC5lbmNvZGUoZGlyZWN0X3ZvbF9wYXRoKSkKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA2OiBtb3VudDMgPSIsIG1vdW50MykKCiAgICBtb3VudDMgPT0gaV9zdG9yYWdlLm1vdW50X3BvaW50CgogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDY6IHRydWUiKQp9CgphbGxvd19kaXJlY3Rfdm9sX2RyaXZlcihwX3N0b3JhZ2UsIGlfc3RvcmFnZSkgewogICAgcHJpbnQoImFsbG93X2RpcmVjdF92b2xfZHJpdmVyIDE6IHN0YXJ0IikKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gImJsayIKICAgIHByaW50KCJhbGxvd19kaXJlY3Rfdm9sX2RyaXZlciAxOiB0cnVlIikKfQphbGxvd19kaXJlY3Rfdm9sX2RyaXZlcihwX3N0b3JhZ2UsIGlfc3RvcmFnZSkgewogICAgcHJpbnQoImFsbG93X2RpcmVjdF92b2xfZHJpdmVyIDI6IHN0YXJ0IikKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gInNtYiIKICAgIHByaW50KCJhbGxvd19kaXJlY3Rfdm9sX2RyaXZlciAyOiB0cnVlIikKfQoKIyBFeGVjUHJvY2Vzc1JlcXVlc3QucHJvY2Vzcy5DYXBhYmlsaXRpZXMKYWxsb3dfZXhlY19jYXBzKGlfY2FwcykgewogICAgbm90IGlfY2Fwcy5BbWJpZW50CiAgICBub3QgaV9jYXBzLkJvdW5kaW5nCiAgICBub3QgaV9jYXBzLkVmZmVjdGl2ZQogICAgbm90IGlfY2Fwcy5Jbmhlcml0YWJsZQogICAgbm90IGlfY2Fwcy5QZXJtaXR0ZWQKfQoKIyBPQ0kuUHJvY2Vzcy5DYXBhYmlsaXRpZXMKYWxsb3dfY2FwcyhwX2NhcHMsIGlfY2FwcykgewogICAgcHJpbnQoImFsbG93X2NhcHM6IHBvbGljeSBBbWJpZW50ID0iLCBwX2NhcHMuQW1iaWVudCkKICAgIHByaW50KCJhbGxvd19jYXBzOiBpbnB1dCBBbWJpZW50ID0iLCBpX2NhcHMuQW1iaWVudCkKICAgIG1hdGNoX2NhcHMocF9jYXBzLkFtYmllbnQsIGlfY2Fwcy5BbWJpZW50KQoKICAgIHByaW50KCJhbGxvd19jYXBzOiBwb2xpY3kgQm91bmRpbmcgPSIsIHBfY2Fwcy5Cb3VuZGluZykKICAgIHByaW50KCJhbGxvd19jYXBzOiBpbnB1dCBCb3VuZGluZyA9IiwgaV9jYXBzLkJvdW5kaW5nKQogICAgbWF0Y2hfY2FwcyhwX2NhcHMuQm91bmRpbmcsIGlfY2Fwcy5Cb3VuZGluZykKCiAgICBwcmludCgiYWxsb3dfY2FwczogcG9saWN5IEVmZmVjdGl2ZSA9IiwgcF9jYXBzLkVmZmVjdGl2ZSkKICAgIHByaW50KCJhbGxvd19jYXBzOiBpbnB1dCBFZmZlY3RpdmUgPSIsIGlfY2Fwcy5FZmZlY3RpdmUpCiAgICBtYXRjaF9jYXBzKHBfY2Fwcy5FZmZlY3RpdmUsIGlfY2Fwcy5FZmZlY3RpdmUpCgogICAgcHJpbnQoImFsbG93X2NhcHM6IHBvbGljeSBJbmhlcml0YWJsZSA9IiwgcF9jYXBzLkluaGVyaXRhYmxlKQogICAgcHJpbnQoImFsbG93X2NhcHM6IGlucHV0IEluaGVyaXRhYmxlID0iLCBpX2NhcHMuSW5oZXJpdGFibGUpCiAgICBtYXRjaF9jYXBzKHBfY2Fwcy5Jbmhlcml0YWJsZSwgaV9jYXBzLkluaGVyaXRhYmxlKQoKICAgIHByaW50KCJhbGxvd19jYXBzOiBwb2xpY3kgUGVybWl0dGVkID0iLCBwX2NhcHMuUGVybWl0dGVkKQogICAgcHJpbnQoImFsbG93X2NhcHM6IGlucHV0IFBlcm1pdHRlZCA9IiwgaV9jYXBzLlBlcm1pdHRlZCkKICAgIG1hdGNoX2NhcHMocF9jYXBzLlBlcm1pdHRlZCwgaV9jYXBzLlBlcm1pdHRlZCkKfQoKbWF0Y2hfY2FwcyhwX2NhcHMsIGlfY2FwcykgewogICAgcHJpbnQoIm1hdGNoX2NhcHMgMTogc3RhcnQiKQoKICAgIHBfY2FwcyA9PSBpX2NhcHMKCiAgICBwcmludCgibWF0Y2hfY2FwcyAxOiB0cnVlIikKfQptYXRjaF9jYXBzKHBfY2FwcywgaV9jYXBzKSB7CiAgICBwcmludCgibWF0Y2hfY2FwcyAyOiBzdGFydCIpCgogICAgY291bnQocF9jYXBzKSA9PSAxCiAgICBwX2NhcHNbMF0gPT0gIiQoZGVmYXVsdF9jYXBzKSIKCiAgICBwcmludCgibWF0Y2hfY2FwcyAyOiBkZWZhdWx0X2NhcHMgPSIsIHBvbGljeV9kYXRhLmNvbW1vbi5kZWZhdWx0X2NhcHMpCiAgICBwb2xpY3lfZGF0YS5jb21tb24uZGVmYXVsdF9jYXBzID09IGlfY2FwcwoKICAgIHByaW50KCJtYXRjaF9jYXBzIDI6IHRydWUiKQp9Cm1hdGNoX2NhcHMocF9jYXBzLCBpX2NhcHMpIHsKICAgIHByaW50KCJtYXRjaF9jYXBzIDM6IHN0YXJ0IikKCiAgICBjb3VudChwX2NhcHMpID09IDEKICAgIHBfY2Fwc1swXSA9PSAiJChwcml2aWxlZ2VkX2NhcHMpIgoKICAgIHByaW50KCJtYXRjaF9jYXBzIDM6IHByaXZpbGVnZWRfY2FwcyA9IiwgcG9saWN5X2RhdGEuY29tbW9uLnByaXZpbGVnZWRfY2FwcykKICAgIHBvbGljeV9kYXRhLmNvbW1vbi5wcml2aWxlZ2VkX2NhcHMgPT0gaV9jYXBzCgogICAgcHJpbnQoIm1hdGNoX2NhcHMgMzogdHJ1ZSIpCn0KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKY2hlY2tfZGlyZWN0b3J5X3RyYXZlcnNhbChpX3BhdGgpIHsKICAgIGNvbnRhaW5zKGlfcGF0aCwgIi4uLyIpID09IGZhbHNlCiAgICBlbmRzd2l0aChpX3BhdGgsICIvLi4iKSA9PSBmYWxzZQp9CgpjaGVja19zeW1saW5rX3NvdXJjZShpX3NyYykgewogICAgaV9zcmMgPT0gIiIKICAgIHByaW50KCJjaGVja19zeW1saW5rX3NvdXJjZSAxOiB0cnVlIikKfQpjaGVja19zeW1saW5rX3NvdXJjZShpX3NyYykgewogICAgaV9zcmMgIT0gIiIKICAgIHByaW50KCJjaGVja19zeW1saW5rX3NvdXJjZSAyOiBpX3NyYyA9IiwgaV9zcmMpCgogICAgcmVnZXgubWF0Y2gocG9saWN5X2RhdGEuY29tbW9uLnNfc291cmNlMSwgaV9zcmMpCgogICAgcHJpbnQoImNoZWNrX3N5bWxpbmtfc291cmNlIDI6IHRydWUiKQp9CmNoZWNrX3N5bWxpbmtfc291cmNlKGlfc3JjKSB7CiAgICBpX3NyYyAhPSAiIgogICAgcHJpbnQoImNoZWNrX3N5bWxpbmtfc291cmNlIDM6IGlfc3JjID0iLCBpX3NyYykKCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24uc19zb3VyY2UyLCBpX3NyYykKICAgIGNoZWNrX2RpcmVjdG9yeV90cmF2ZXJzYWwoaV9zcmMpCgogICAgcHJpbnQoImNoZWNrX3N5bWxpbmtfc291cmNlIDM6IHRydWUiKQp9CgphbGxvd19zYW5kYm94X3N0b3JhZ2VzKGlfc3RvcmFnZXMpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2VzOiBpX3N0b3JhZ2VzID0iLCBpX3N0b3JhZ2VzKQoKICAgIHBfc3RvcmFnZXMgOj0gcG9saWN5X2RhdGEuc2FuZGJveC5zdG9yYWdlcwogICAgZXZlcnkgaV9zdG9yYWdlIGluIGlfc3RvcmFnZXMgewogICAgICAgIGFsbG93X3NhbmRib3hfc3RvcmFnZShwX3N0b3JhZ2VzLCBpX3N0b3JhZ2UpCiAgICB9CgogICAgcHJpbnQoImFsbG93X3NhbmRib3hfc3RvcmFnZXM6IHRydWUiKQp9CgphbGxvd19zYW5kYm94X3N0b3JhZ2UocF9zdG9yYWdlcywgaV9zdG9yYWdlKSB7CiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9zdG9yYWdlOiBpX3N0b3JhZ2UgPSIsIGlfc3RvcmFnZSkKCiAgICBzb21lIHBfc3RvcmFnZSBpbiBwX3N0b3JhZ2VzCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9zdG9yYWdlOiBwX3N0b3JhZ2UgPSIsIHBfc3RvcmFnZSkKICAgIGlfc3RvcmFnZSA9PSBwX3N0b3JhZ2UKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9zdG9yYWdlOiB0cnVlIikKfQoKQ29weUZpbGVSZXF1ZXN0IHsKICAgIHByaW50KCJDb3B5RmlsZVJlcXVlc3Q6IGlucHV0LnBhdGggPSIsIGlucHV0LnBhdGgpCgogICAgY2hlY2tfc3ltbGlua19zb3VyY2UoaW5wdXQuc3ltbGlua19zcmMpCiAgICBjaGVja19kaXJlY3RvcnlfdHJhdmVyc2FsKGlucHV0LnBhdGgpCgogICAgc29tZSByZWdleDEgaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5Db3B5RmlsZVJlcXVlc3QKICAgIHJlZ2V4MiA6PSByZXBsYWNlKHJlZ2V4MSwgIiQoc2ZwcmVmaXgpIiwgcG9saWN5X2RhdGEuY29tbW9uLnNmcHJlZml4KQogICAgcmVnZXgzIDo9IHJlcGxhY2UocmVnZXgyLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICByZWdleDQgOj0gcmVwbGFjZShyZWdleDMsICIkKGJ1bmRsZS1pZCkiLCBCVU5ETEVfSUQpCiAgICBwcmludCgiQ29weUZpbGVSZXF1ZXN0OiByZWdleDQgPSIsIHJlZ2V4NCkKCiAgICByZWdleC5tYXRjaChyZWdleDQsIGlucHV0LnBhdGgpCgogICAgcHJpbnQoIkNvcHlGaWxlUmVxdWVzdDogdHJ1ZSIpCn0KCkNyZWF0ZVNhbmRib3hSZXF1ZXN0IHsKICAgIHByaW50KCJDcmVhdGVTYW5kYm94UmVxdWVzdDogaW5wdXQuZ3Vlc3RfaG9va19wYXRoID0iLCBpbnB1dC5ndWVzdF9ob29rX3BhdGgpCiAgICBjb3VudChpbnB1dC5ndWVzdF9ob29rX3BhdGgpID09IDAKCiAgICBwcmludCgiQ3JlYXRlU2FuZGJveFJlcXVlc3Q6IGlucHV0Lmtlcm5lbF9tb2R1bGVzID0iLCBpbnB1dC5rZXJuZWxfbW9kdWxlcykKICAgIGNvdW50KGlucHV0Lmtlcm5lbF9tb2R1bGVzKSA9PSAwCgogICAgaV9waWRucyA6PSBpbnB1dC5zYW5kYm94X3BpZG5zCiAgICBwcmludCgiQ3JlYXRlU2FuZGJveFJlcXVlc3Q6IGlfcGlkbnMgPSIsIGlfcGlkbnMpCiAgICBpX3BpZG5zID09IGZhbHNlCgogICAgYWxsb3dfc2FuZGJveF9zdG9yYWdlcyhpbnB1dC5zdG9yYWdlcykKfQoKYWxsb3dfZXhlYyhwX2NvbnRhaW5lciwgaV9wcm9jZXNzKSB7CiAgICBwcmludCgiYWxsb3dfZXhlYzogc3RhcnQiKQoKICAgIHBfb2NpID0gcF9jb250YWluZXIuT0NJCiAgICBwX3NfbmFtZSA9IHBfb2NpLkFubm90YXRpb25zW1NfTkFNRV9LRVldCiAgICBzX25hbWVzcGFjZSA9IGdldF9zdGF0ZV92YWwoIm5hbWVzcGFjZSIpCiAgICBhbGxvd19wcm9iZV9wcm9jZXNzKHBfb2NpLlByb2Nlc3MsIGlfcHJvY2VzcywgcF9zX25hbWUsIHNfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd19leGVjOiB0cnVlIikKfQoKYWxsb3dfaW50ZXJhY3RpdmVfZXhlYyhwX2NvbnRhaW5lciwgaV9wcm9jZXNzKSB7CiAgICBwcmludCgiYWxsb3dfaW50ZXJhY3RpdmVfZXhlYzogc3RhcnQiKQoKICAgIHBfb2NpID0gcF9jb250YWluZXIuT0NJCiAgICBwX3NfbmFtZSA9IHBfb2NpLkFubm90YXRpb25zW1NfTkFNRV9LRVldCiAgICBzX25hbWVzcGFjZSA9IGdldF9zdGF0ZV92YWwoIm5hbWVzcGFjZSIpCiAgICBhbGxvd19pbnRlcmFjdGl2ZV9wcm9jZXNzKHBfb2NpLlByb2Nlc3MsIGlfcHJvY2VzcywgcF9zX25hbWUsIHNfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd19pbnRlcmFjdGl2ZV9leGVjOiB0cnVlIikKfQoKIyBUT0RPOiBzaG91bGQgb3RoZXIgRXhlY1Byb2Nlc3NSZXF1ZXN0IGlucHV0IGRhdGEgZmllbGRzIGJlIHZhbGlkYXRlZCBhcyB3ZWxsPwpFeGVjUHJvY2Vzc1JlcXVlc3QgewogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAxOiBpbnB1dCA9IiwgaW5wdXQpCgogICAgaV9jb21tYW5kID0gY29uY2F0KCIgIiwgaW5wdXQucHJvY2Vzcy5BcmdzKQogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAxOiBpX2NvbW1hbmQgPSIsIGlfY29tbWFuZCkKCiAgICBzb21lIHBfY29tbWFuZCBpbiBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLkV4ZWNQcm9jZXNzUmVxdWVzdC5jb21tYW5kcwogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAxOiBwX2NvbW1hbmQgPSIsIHBfY29tbWFuZCkKICAgIHBfY29tbWFuZCA9PSBpX2NvbW1hbmQKCiAgICAjIFRPRE86IG1hdGNoIHBfY29udGFpbmVyJ3MgSUQgd2l0aCB0aGUgaW5wdXQgY29udGFpbmVyX2lkLgogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBhbGxvd19pbnRlcmFjdGl2ZV9leGVjKHBfY29udGFpbmVyLCBpbnB1dC5wcm9jZXNzKQoKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMTogdHJ1ZSIpCn0KRXhlY1Byb2Nlc3NSZXF1ZXN0IHsKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMjogaW5wdXQgPSIsIGlucHV0KQoKICAgICMgVE9ETzogbWF0Y2ggaW5wdXQgY29udGFpbmVyIElEIHdpdGggaXRzIGNvcnJlc3BvbmRpbmcgY29udGFpbmVyLmV4ZWNfY29tbWFuZHMuCiAgICBpX2NvbW1hbmQgPSBjb25jYXQoIiAiLCBpbnB1dC5wcm9jZXNzLkFyZ3MpCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDI6IGlfY29tbWFuZCA9IiwgaV9jb21tYW5kKQoKICAgICMgVE9ETzogbWF0Y2ggcF9jb250YWluZXIncyBJRCB3aXRoIHRoZSBpbnB1dCBjb250YWluZXJfaWQuCiAgICBzb21lIHBfY29udGFpbmVyIGluIHBvbGljeV9kYXRhLmNvbnRhaW5lcnMKICAgIHNvbWUgcF9jb21tYW5kIGluIHBfY29udGFpbmVyLmV4ZWNfY29tbWFuZHMKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMjogcF9jb21tYW5kID0iLCBwX2NvbW1hbmQpCiAgICBwX2NvbW1hbmQgPT0gaV9jb21tYW5kCgogICAgYWxsb3dfZXhlYyhwX2NvbnRhaW5lciwgaW5wdXQucHJvY2VzcykKCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDI6IHRydWUiKQp9CkV4ZWNQcm9jZXNzUmVxdWVzdCB7CiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDM6IGlucHV0ID0iLCBpbnB1dCkKCiAgICBpX2NvbW1hbmQgPSBjb25jYXQoIiAiLCBpbnB1dC5wcm9jZXNzLkFyZ3MpCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDM6IGlfY29tbWFuZCA9IiwgaV9jb21tYW5kKQoKICAgIHNvbWUgcF9yZWdleCBpbiBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLkV4ZWNQcm9jZXNzUmVxdWVzdC5yZWdleAogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAzOiBwX3JlZ2V4ID0iLCBwX3JlZ2V4KQoKICAgIHJlZ2V4Lm1hdGNoKHBfcmVnZXgsIGlfY29tbWFuZCkKCiAgICAjIFRPRE86IG1hdGNoIHBfY29udGFpbmVyJ3MgSUQgd2l0aCB0aGUgaW5wdXQgY29udGFpbmVyX2lkLgogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBhbGxvd19pbnRlcmFjdGl2ZV9leGVjKHBfY29udGFpbmVyLCBpbnB1dC5wcm9jZXNzKQoKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMzogdHJ1ZSIpCn0KCkNsb3NlU3RkaW5SZXF1ZXN0IHsKICAgIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuQ2xvc2VTdGRpblJlcXVlc3QgPT0gdHJ1ZQp9CgpSZWFkU3RyZWFtUmVxdWVzdCB7CiAgICBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLlJlYWRTdHJlYW1SZXF1ZXN0ID09IHRydWUKfQoKVXBkYXRlRXBoZW1lcmFsTW91bnRzUmVxdWVzdCB7CiAgICBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLlVwZGF0ZUVwaGVtZXJhbE1vdW50c1JlcXVlc3QgPT0gdHJ1ZQp9CgpXcml0ZVN0cmVhbVJlcXVlc3QgewogICAgcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5Xcml0ZVN0cmVhbVJlcXVlc3QgPT0gdHJ1ZQp9Cgpwb2xpY3lfZGF0YSA6PSB7CiAgImNvbnRhaW5lcnMiOiBbCiAgICB7CiAgICAgICJPQ0kiOiB7CiAgICAgICAgIlZlcnNpb24iOiAiMS4xLjAtcmMuMSIsCiAgICAgICAgIlByb2Nlc3MiOiB7CiAgICAgICAgICAiVGVybWluYWwiOiBmYWxzZSwKICAgICAgICAgICJVc2VyIjogewogICAgICAgICAgICAiVUlEIjogNjU1MzUsCiAgICAgICAgICAgICJHSUQiOiA2NTUzNSwKICAgICAgICAgICAgIkFkZGl0aW9uYWxHaWRzIjogW10sCiAgICAgICAgICAgICJVc2VybmFtZSI6ICIiCiAgICAgICAgICB9LAogICAgICAgICAgIkFyZ3MiOiBbCiAgICAgICAgICAgICIvcGF1c2UiCiAgICAgICAgICBdLAogICAgICAgICAgIkVudiI6IFsKICAgICAgICAgICAgIlBBVEg9L3Vzci9sb2NhbC9zYmluOi91c3IvbG9jYWwvYmluOi91c3Ivc2JpbjovdXNyL2Jpbjovc2JpbjovYmluIgogICAgICAgICAgXSwKICAgICAgICAgICJDd2QiOiAiLyIsCiAgICAgICAgICAiQ2FwYWJpbGl0aWVzIjogewogICAgICAgICAgICAiQW1iaWVudCI6IFtdLAogICAgICAgICAgICAiQm91bmRpbmciOiBbCiAgICAgICAgICAgICAgIiQoZGVmYXVsdF9jYXBzKSIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgIkVmZmVjdGl2ZSI6IFsKICAgICAgICAgICAgICAiJChkZWZhdWx0X2NhcHMpIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiSW5oZXJpdGFibGUiOiBbXSwKICAgICAgICAgICAgIlBlcm1pdHRlZCI6IFsKICAgICAgICAgICAgICAiJChkZWZhdWx0X2NhcHMpIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgIk5vTmV3UHJpdmlsZWdlcyI6IHRydWUKICAgICAgICB9LAogICAgICAgICJSb290IjogewogICAgICAgICAgIlBhdGgiOiAiJChjcGF0aCkvJChidW5kbGUtaWQpIiwKICAgICAgICAgICJSZWFkb25seSI6IHRydWUKICAgICAgICB9LAogICAgICAgICJNb3VudHMiOiBbCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvcHJvYyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAicHJvYyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJwcm9jIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAgICAgIm5vZGV2IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2RldiIsCiAgICAgICAgICAgICJzb3VyY2UiOiAidG1wZnMiLAogICAgICAgICAgICAidHlwZV8iOiAidG1wZnMiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAic3RyaWN0YXRpbWUiLAogICAgICAgICAgICAgICJtb2RlPTc1NSIsCiAgICAgICAgICAgICAgInNpemU9NjU1MzZrIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi9wdHMiLAogICAgICAgICAgICAic291cmNlIjogImRldnB0cyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJkZXZwdHMiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibmV3aW5zdGFuY2UiLAogICAgICAgICAgICAgICJwdG14bW9kZT0wNjY2IiwKICAgICAgICAgICAgICAibW9kZT0wNjIwIiwKICAgICAgICAgICAgICAiZ2lkPTUiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L3NobSIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiL3J1bi9rYXRhLWNvbnRhaW5lcnMvc2FuZGJveC9zaG0iLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvbXF1ZXVlIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJtcXVldWUiLAogICAgICAgICAgICAidHlwZV8iOiAibXF1ZXVlIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAgICAgIm5vZGV2IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL3N5cyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAic3lzZnMiLAogICAgICAgICAgICAidHlwZV8iOiAic3lzZnMiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiLAogICAgICAgICAgICAgICJybyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9ldGMvcmVzb2x2LmNvbmYiLAogICAgICAgICAgICAic291cmNlIjogIiQoc2ZwcmVmaXgpcmVzb2x2LmNvbmYkIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJybyIsCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgIm5vZGV2IiwKICAgICAgICAgICAgICAibm9leGVjIgogICAgICAgICAgICBdCiAgICAgICAgICB9CiAgICAgICAgXSwKICAgICAgICAiQW5ub3RhdGlvbnMiOiB7CiAgICAgICAgICAiaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5idW5kbGVfcGF0aCI6ICIvcnVuL2NvbnRhaW5lcmQvaW8uY29udGFpbmVyZC5ydW50aW1lLnYyLnRhc2svazhzLmlvLyQoYnVuZGxlLWlkKSIsCiAgICAgICAgICAiaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5jb250YWluZXJfdHlwZSI6ICJwb2Rfc2FuZGJveCIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLXR5cGUiOiAic2FuZGJveCIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCI6ICJeW2EtejAtOV17NjR9JCIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1sb2ctZGlyZWN0b3J5IjogIl4vdmFyL2xvZy9wb2RzLyQoc2FuZGJveC1uYW1lc3BhY2UpXyQoc2FuZGJveC1uYW1lKV9bMC05YS1mXXs4fS1bMC05YS1mXXs0fS1bMC05YS1mXXs0fS1bMC05YS1mXXs0fS1bMC05YS1mXXsxMn0kIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LW5hbWVzcGFjZSI6ICIiLAogICAgICAgICAgIm5lcmRjdGwvbmV0d29yay1uYW1lc3BhY2UiOiAiXi92YXIvcnVuL25ldG5zL2NuaS1bMC05YS1mXXs4fS1bMC05YS1mXXs0fS1bMC05YS1mXXs0fS1bMC05YS1mXXs0fS1bMC05YS1mXXsxMn0kIgogICAgICAgIH0sCiAgICAgICAgIkxpbnV4IjogewogICAgICAgICAgIk5hbWVzcGFjZXMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiVHlwZSI6ICJpcGMiLAogICAgICAgICAgICAgICJQYXRoIjogIiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJUeXBlIjogInV0cyIsCiAgICAgICAgICAgICAgIlBhdGgiOiAiIgogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgIlR5cGUiOiAibW91bnQiLAogICAgICAgICAgICAgICJQYXRoIjogIiIKICAgICAgICAgICAgfQogICAgICAgICAgXSwKICAgICAgICAgICJNYXNrZWRQYXRocyI6IFsKICAgICAgICAgICAgIi9wcm9jL2FjcGkiLAogICAgICAgICAgICAiL3Byb2MvYXNvdW5kIiwKICAgICAgICAgICAgIi9wcm9jL2tjb3JlIiwKICAgICAgICAgICAgIi9wcm9jL2tleXMiLAogICAgICAgICAgICAiL3Byb2MvbGF0ZW5jeV9zdGF0cyIsCiAgICAgICAgICAgICIvcHJvYy90aW1lcl9saXN0IiwKICAgICAgICAgICAgIi9wcm9jL3RpbWVyX3N0YXRzIiwKICAgICAgICAgICAgIi9wcm9jL3NjaGVkX2RlYnVnIiwKICAgICAgICAgICAgIi9zeXMvZmlybXdhcmUiLAogICAgICAgICAgICAiL3Byb2Mvc2NzaSIKICAgICAgICAgIF0sCiAgICAgICAgICAiUmVhZG9ubHlQYXRocyI6IFsKICAgICAgICAgICAgIi9wcm9jL2J1cyIsCiAgICAgICAgICAgICIvcHJvYy9mcyIsCiAgICAgICAgICAgICIvcHJvYy9pcnEiLAogICAgICAgICAgICAiL3Byb2Mvc3lzIiwKICAgICAgICAgICAgIi9wcm9jL3N5c3JxLXRyaWdnZXIiCiAgICAgICAgICBdCiAgICAgICAgfQogICAgICB9LAogICAgICAic3RvcmFnZXMiOiBbCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJibGsiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogInRhciIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIiQoaGFzaDApIgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGxheWVyMCkiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJvdmVybGF5ZnMiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogImZ1c2UzLmthdGEtb3ZlcmxheSIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIjVhNWFhZDgwMDU1ZmYyMDAxMmE1MGRjMjVmOGRmN2EyOTkyNDQ3NDMyNGQ2NWY3ZDUzMDZlZThlZTI3ZmY3MWQiLAogICAgICAgICAgICAiODE3MjUwZjFhM2UzMzZkYTc2ZjViZDNmYTc4NGUxYjI2ZDk1OWI5YzEzMTg3NjgxNWJhMjYwNDA0OGI3MGMxOCIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChjcGF0aCkvJChidW5kbGUtaWQpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9CiAgICAgIF0sCiAgICAgICJzYW5kYm94X3BpZG5zIjogZmFsc2UsCiAgICAgICJleGVjX2NvbW1hbmRzIjogW10KICAgIH0sCiAgICB7CiAgICAgICJPQ0kiOiB7CiAgICAgICAgIlZlcnNpb24iOiAiMS4xLjAtcmMuMSIsCiAgICAgICAgIlByb2Nlc3MiOiB7CiAgICAgICAgICAiVGVybWluYWwiOiBmYWxzZSwKICAgICAgICAgICJVc2VyIjogewogICAgICAgICAgICAiVUlEIjogMCwKICAgICAgICAgICAgIkdJRCI6IDAsCiAgICAgICAgICAgICJBZGRpdGlvbmFsR2lkcyI6IFtdLAogICAgICAgICAgICAiVXNlcm5hbWUiOiAiIgogICAgICAgICAgfSwKICAgICAgICAgICJBcmdzIjogWwogICAgICAgICAgICAiL3BlZXItZmluZGVyIiwKICAgICAgICAgICAgIi1vbi1zdGFydD0vb24tc3RhcnQuc2giLAogICAgICAgICAgICAiLXNlcnZpY2U9Y29ja3JvYWNoZGIiCiAgICAgICAgICBdLAogICAgICAgICAgIkVudiI6IFsKICAgICAgICAgICAgIlBBVEg9L3Vzci9sb2NhbC9zYmluOi91c3IvbG9jYWwvYmluOi91c3Ivc2JpbjovdXNyL2Jpbjovc2JpbjovYmluIiwKICAgICAgICAgICAgIkhPU1ROQU1FPSQoaG9zdC1uYW1lKSIsCiAgICAgICAgICAgICJQT0RfTkFNRVNQQUNFPSQoc2FuZGJveC1uYW1lc3BhY2UpIgogICAgICAgICAgXSwKICAgICAgICAgICJDd2QiOiAiLyIsCiAgICAgICAgICAiQ2FwYWJpbGl0aWVzIjogewogICAgICAgICAgICAiQW1iaWVudCI6IFtdLAogICAgICAgICAgICAiQm91bmRpbmciOiBbCiAgICAgICAgICAgICAgIiQoZGVmYXVsdF9jYXBzKSIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgIkVmZmVjdGl2ZSI6IFsKICAgICAgICAgICAgICAiJChkZWZhdWx0X2NhcHMpIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiSW5oZXJpdGFibGUiOiBbXSwKICAgICAgICAgICAgIlBlcm1pdHRlZCI6IFsKICAgICAgICAgICAgICAiJChkZWZhdWx0X2NhcHMpIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgIk5vTmV3UHJpdmlsZWdlcyI6IGZhbHNlCiAgICAgICAgfSwKICAgICAgICAiUm9vdCI6IHsKICAgICAgICAgICJQYXRoIjogIiQoY3BhdGgpLyQoYnVuZGxlLWlkKSIsCiAgICAgICAgICAiUmVhZG9ubHkiOiBmYWxzZQogICAgICAgIH0sCiAgICAgICAgIk1vdW50cyI6IFsKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9wcm9jIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJwcm9jIiwKICAgICAgICAgICAgInR5cGVfIjogInByb2MiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2IiwKICAgICAgICAgICAgInNvdXJjZSI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJzdHJpY3RhdGltZSIsCiAgICAgICAgICAgICAgIm1vZGU9NzU1IiwKICAgICAgICAgICAgICAic2l6ZT02NTUzNmsiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L3B0cyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiZGV2cHRzIiwKICAgICAgICAgICAgInR5cGVfIjogImRldnB0cyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJuZXdpbnN0YW5jZSIsCiAgICAgICAgICAgICAgInB0bXhtb2RlPTA2NjYiLAogICAgICAgICAgICAgICJtb2RlPTA2MjAiLAogICAgICAgICAgICAgICJnaWQ9NSIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvc2htIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L3NobSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi9tcXVldWUiLAogICAgICAgICAgICAic291cmNlIjogIm1xdWV1ZSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJtcXVldWUiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvc3lzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJzeXNmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJzeXNmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL3N5cy9mcy9jZ3JvdXAiLAogICAgICAgICAgICAic291cmNlIjogImNncm91cCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJjZ3JvdXAiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiLAogICAgICAgICAgICAgICJyZWxhdGltZSIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2V0Yy9ob3N0cyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClob3N0cyQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicnciCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L3Rlcm1pbmF0aW9uLWxvZyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeCl0ZXJtaW5hdGlvbi1sb2ckIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJ3IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2V0Yy9ob3N0bmFtZSIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClob3N0bmFtZSQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicnciCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZXRjL3Jlc29sdi5jb25mIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KXJlc29sdi5jb25mJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJydyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi92YXIvcnVuL3NlY3JldHMva3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudCIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClzZXJ2aWNlYWNjb3VudCQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicm8iCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvdmFyL3J1bi9zZWNyZXRzL2F6dXJlL3Rva2VucyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeCl0b2tlbnMkIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2NvY2tyb2FjaC9jb2Nrcm9hY2gtZGF0YSIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeCljb2Nrcm9hY2gtZGF0YSQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicnciCiAgICAgICAgICAgIF0KICAgICAgICAgIH0KICAgICAgICBdLAogICAgICAgICJBbm5vdGF0aW9ucyI6IHsKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmJ1bmRsZV9wYXRoIjogIi9ydW4vY29udGFpbmVyZC9pby5jb250YWluZXJkLnJ1bnRpbWUudjIudGFzay9rOHMuaW8vJChidW5kbGUtaWQpIiwKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIjogInBvZF9jb250YWluZXIiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLmNvbnRhaW5lci1uYW1lIjogImJvb3RzdHJhcCIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLXR5cGUiOiAiY29udGFpbmVyIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5pbWFnZS1uYW1lIjogIm1hcmluZXJjb25mcG9kc3Rlc3QuYXp1cmVjci5pby9jb2Nrcm9hY2hkYi9jb2Nrcm9hY2gtazhzLWluaXQ6MC4xIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWlkIjogIl5bYS16MC05XXs2NH0kIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LW5hbWVzcGFjZSI6ICIiCiAgICAgICAgfSwKICAgICAgICAiTGludXgiOiB7CiAgICAgICAgICAiTmFtZXNwYWNlcyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICJUeXBlIjogImlwYyIsCiAgICAgICAgICAgICAgIlBhdGgiOiAiIgogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgIlR5cGUiOiAidXRzIiwKICAgICAgICAgICAgICAiUGF0aCI6ICIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiVHlwZSI6ICJtb3VudCIsCiAgICAgICAgICAgICAgIlBhdGgiOiAiIgogICAgICAgICAgICB9CiAgICAgICAgICBdLAogICAgICAgICAgIk1hc2tlZFBhdGhzIjogWwogICAgICAgICAgICAiL3Byb2MvYWNwaSIsCiAgICAgICAgICAgICIvcHJvYy9rY29yZSIsCiAgICAgICAgICAgICIvcHJvYy9rZXlzIiwKICAgICAgICAgICAgIi9wcm9jL2xhdGVuY3lfc3RhdHMiLAogICAgICAgICAgICAiL3Byb2MvdGltZXJfbGlzdCIsCiAgICAgICAgICAgICIvcHJvYy90aW1lcl9zdGF0cyIsCiAgICAgICAgICAgICIvcHJvYy9zY2hlZF9kZWJ1ZyIsCiAgICAgICAgICAgICIvcHJvYy9zY3NpIiwKICAgICAgICAgICAgIi9zeXMvZmlybXdhcmUiCiAgICAgICAgICBdLAogICAgICAgICAgIlJlYWRvbmx5UGF0aHMiOiBbCiAgICAgICAgICAgICIvcHJvYy9hc291bmQiLAogICAgICAgICAgICAiL3Byb2MvYnVzIiwKICAgICAgICAgICAgIi9wcm9jL2ZzIiwKICAgICAgICAgICAgIi9wcm9jL2lycSIsCiAgICAgICAgICAgICIvcHJvYy9zeXMiLAogICAgICAgICAgICAiL3Byb2Mvc3lzcnEtdHJpZ2dlciIKICAgICAgICAgIF0KICAgICAgICB9CiAgICAgIH0sCiAgICAgICJzdG9yYWdlcyI6IFsKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoMCkiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXIwKSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoMSkiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXIxKSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoMikiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXIyKSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoMykiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXIzKSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoNCkiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXI0KSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoNSkiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXI1KSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoNikiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXI2KSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoNykiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXI3KSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoOCkiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXI4KSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoOSkiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXI5KSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogIm92ZXJsYXlmcyIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAiZnVzZTMua2F0YS1vdmVybGF5IiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiOTlhMTQyMDU2Y2EzYWIxNDA0OTY3YTI5ODBkZWEzZWU1NmE2M2U5YWM0YWUxY2IyNjAyODlmZDBiMjUxOWRlODo4NDg3MGJjMzRjODViMDk0OWY5YmIzYjJkZDE4M2ZkOTgxNmM0MDk3ZjYyNTUzODMyZDA2YTZkZjAzYjg4ODJmOmEwYWRlOTJmZTAzODIwNGUzZTFlZGU5OTU3MjYxM2FjMWYzNGNiNDU1ZmQwNjY1M2E2NjU5YjNmZmIwNGU4OTA6MzI0MTczN2IxZGIwNDZjZjAzY2NhY2Y0YWVlZjI0MmViOTBhMDE2ZWU1YTIwMjE5OGQ3ZmQ4YzJmZGNhNTQ0YjowNTRlZmMxNjI3YzQ3YWY0NWM1NDAyYzA0MmViYWVmMDUyM2QzNjI1MDI3NjA3ZWMwMzNlOWJmNzA0MzEyZGNlOjUwNDU5MzVjYmJiZDYyZmFmMjBmNGVjZGUwMzJlMGE1ODk1MzM2MWI3NDkzMzQwOTA4YjIxMTIxZGQxYzNkYTM6M2FmMjcyMjU3Y2QxYzI0MTgyNjhkZDFkMGY5Y2JhNzA4NzE4NTNhODQ5YzVkMjU0ZmMwMjdiYWI4YzJmNWY4ZTphYWI0NDQzYjc3NjQwM2MyNWFkOTcwZDc4ZTc2Mzk1MGU5NzA2ZmJiYzIyMjRjODUxMjBiZDZlNWFkOWNjY2MxOjI5NjE3NmMzYjBiYTYxOWYxMTNiNTQxNjU5MWRjYWMyOWQwMTY5ODZmMTc3MDA1MzRlOWIzMTk4OTAzZjQyOGU6MjNiYTdiYTU5ZDIxNTI1NTU1Zjk1Njk0YTIwZDdiYTdiZDkxMTUzOWE0YTgyZDU2NTU2ZGU1YjY0OTNhOGE0YyIsCiAgICAgICAgICAgICJkMWM4NWRiOTAyZDJmMzY0ODgxMTc2ZjMyNTEwNmVmNGQzYzUxZDJmNjRiODgzYjRkNTA4MzI3Y2IyMTA4ZjYxOmQxYzg1ZGI5MDJkMmYzNjQ4ODExNzZmMzI1MTA2ZWY0ZDNjNTFkMmY2NGI4ODNiNGQ1MDgzMjdjYjIxMDhmNjE6Njc0NTAwODJhYjU2ZGExYWVjYzVlYWUyZjE4ZDk4MGNkOWU3MzA2ZTc5MzM0YTFhODI2YTkxY2ZkOTAxMTRhODo2NzQ1MDA4MmFiNTZkYTFhZWNjNWVhZTJmMThkOTgwY2Q5ZTczMDZlNzkzMzRhMWE4MjZhOTFjZmQ5MDExNGE4OmNmMzMwMDVhN2JlZTZiY2QwMjM4MmY3N2U4YmU5YjhhNzRjYjdiYTU2N2I4OTljYTY4MWUxZTkyZDdmMzRiNTg6ODc4YWNmMWI4MDZlZmQ3ODVmOGY1MmQ1MGFmMDg4OTU3Y2YzZmJkNzJjNjNjYzMyMTI4OGFkZjIwZWFmYmQzNTowMzY4ZjE0NTU0MzViOTMxOTc3YjViNzJmY2RjZjUwMDUzODk2ZDI3YzVlOWE1YzI2NTc0NDgyNjI3MjhlOWQzOjY3NDUwMDgyYWI1NmRhMWFlY2M1ZWFlMmYxOGQ5ODBjZDllNzMwNmU3OTMzNGExYTgyNmE5MWNmZDkwMTE0YTg6Njc0NTAwODJhYjU2ZGExYWVjYzVlYWUyZjE4ZDk4MGNkOWU3MzA2ZTc5MzM0YTFhODI2YTkxY2ZkOTAxMTRhODpkNzUyYzliZTU0NjNiODM3NWJkMmFmZTYzYzUxYzA4NmJlMmFjMmJhNjU3ODgxNGE2M2JmMDUyMmMyMmNjOTQwIgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGNwYXRoKS8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0KICAgICAgXSwKICAgICAgInNhbmRib3hfcGlkbnMiOiBmYWxzZSwKICAgICAgImV4ZWNfY29tbWFuZHMiOiBbXQogICAgfSwKICAgIHsKICAgICAgIk9DSSI6IHsKICAgICAgICAiVmVyc2lvbiI6ICIxLjEuMC1yYy4xIiwKICAgICAgICAiUHJvY2VzcyI6IHsKICAgICAgICAgICJUZXJtaW5hbCI6IGZhbHNlLAogICAgICAgICAgIlVzZXIiOiB7CiAgICAgICAgICAgICJVSUQiOiAwLAogICAgICAgICAgICAiR0lEIjogMCwKICAgICAgICAgICAgIkFkZGl0aW9uYWxHaWRzIjogW10sCiAgICAgICAgICAgICJVc2VybmFtZSI6ICIiCiAgICAgICAgICB9LAogICAgICAgICAgIkFyZ3MiOiBbCiAgICAgICAgICAgICIvYmluL2Jhc2giLAogICAgICAgICAgICAiLWVjeCIsCiAgICAgICAgICAgICIjIFRoZSB1c2Ugb2YgcXVhbGlmaWVkIGBob3N0bmFtZSAtZmAgaXMgY3J1Y2lhbDpcbiMgT3RoZXIgbm9kZXMgYXJlbid0IGFibGUgdG8gbG9vayB1cCB0aGUgdW5xdWFsaWZpZWQgaG9zdG5hbWUuXG5DUkFSR1M9KFwic3RhcnRcIiBcIi0tbG9ndG9zdGRlcnJcIiBcIi0taW5zZWN1cmVcIiBcIi0taG9zdFwiIFwiJChob3N0bmFtZSAtZilcIiBcIi0taHR0cC1ob3N0XCIgXCIwLjAuMC4wXCIpXG4jIFdlIG9ubHkgd2FudCB0byBpbml0aWFsaXplIGEgbmV3IGNsdXN0ZXIgKGJ5IG9taXR0aW5nIHRoZSBqb2luIGZsYWcpXG4jIGlmIHdlJ3JlIHN1cmUgdGhhdCB3ZSdyZSB0aGUgZmlyc3Qgbm9kZSAoaS5lLiBpbmRleCAwKSBhbmQgdGhhdFxuIyB0aGVyZSBhcmVuJ3QgYW55IG90aGVyIG5vZGVzIHJ1bm5pbmcgYXMgcGFydCBvZiB0aGUgY2x1c3RlciB0aGF0XG4jIHRoaXMgaXMgc3VwcG9zZWQgdG8gYmUgYSBwYXJ0IG9mICh3aGljaCBpbmRpY2F0ZXMgdGhhdCBhIGNsdXN0ZXJcbiMgYWxyZWFkeSBleGlzdHMgYW5kIHdlIHNob3VsZCBtYWtlIHN1cmUgbm90IHRvIGNyZWF0ZSBhIG5ldyBvbmUpLlxuIyBJdCdzIGZpbmUgdG8gcnVuIHdpdGhvdXQgLS1qb2luIG9uIGEgcmVzdGFydCBpZiB0aGVyZSBhcmVuJ3QgYW55XG4jIG90aGVyIG5vZGVzLlxuaWYgWyAhIFwiJChob3N0bmFtZSlcIiA9PSBcImNvY2tyb2FjaGRiLTBcIiBdIHx8IFxcXG4gICBbIC1lIFwiL2NvY2tyb2FjaC9jb2Nrcm9hY2gtZGF0YS9jbHVzdGVyX2V4aXN0c19tYXJrZXJcIiBdXG50aGVuXG4gICMgV2UgZG9uJ3Qgam9pbiBjb2Nrcm9hY2hkYiBpbiBvcmRlciB0byBhdm9pZCBhIG5vZGUgYXR0ZW1wdGluZ1xuICAjIHRvIGpvaW4gaXRzZWxmLCB3aGljaCBjdXJyZW50bHkgZG9lc24ndCB3b3JrXG4gICMgKGh0dHBzOi8vZ2l0aHViLmNvbS9jb2Nrcm9hY2hkYi9jb2Nrcm9hY2gvaXNzdWVzLzk2MjUpLlxuICBDUkFSR1MrPShcIi0tam9pblwiIFwiY29ja3JvYWNoZGItMC5jb2Nrcm9hY2hkYixjb2Nrcm9hY2hkYi0xLmNvY2tyb2FjaGRiLGNvY2tyb2FjaGRiLTIuY29ja3JvYWNoZGJcIilcbmZpXG5leGVjIC9jb2Nrcm9hY2gvY29ja3JvYWNoICR7Q1JBUkdTWypdfVxuIgogICAgICAgICAgXSwKICAgICAgICAgICJFbnYiOiBbCiAgICAgICAgICAgICJQQVRIPS91c3IvbG9jYWwvc2JpbjovdXNyL2xvY2FsL2JpbjovdXNyL3NiaW46L3Vzci9iaW46L3NiaW46L2JpbiIsCiAgICAgICAgICAgICJIT1NUTkFNRT0kKGhvc3QtbmFtZSkiCiAgICAgICAgICBdLAogICAgICAgICAgIkN3ZCI6ICIvY29ja3JvYWNoIiwKICAgICAgICAgICJDYXBhYmlsaXRpZXMiOiB7CiAgICAgICAgICAgICJBbWJpZW50IjogW10sCiAgICAgICAgICAgICJCb3VuZGluZyI6IFsKICAgICAgICAgICAgICAiJChkZWZhdWx0X2NhcHMpIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiRWZmZWN0aXZlIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJJbmhlcml0YWJsZSI6IFtdLAogICAgICAgICAgICAiUGVybWl0dGVkIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICAiTm9OZXdQcml2aWxlZ2VzIjogZmFsc2UKICAgICAgICB9LAogICAgICAgICJSb290IjogewogICAgICAgICAgIlBhdGgiOiAiJChjcGF0aCkvJChidW5kbGUtaWQpIiwKICAgICAgICAgICJSZWFkb25seSI6IGZhbHNlCiAgICAgICAgfSwKICAgICAgICAiTW91bnRzIjogWwogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL3Byb2MiLAogICAgICAgICAgICAic291cmNlIjogInByb2MiLAogICAgICAgICAgICAidHlwZV8iOiAicHJvYyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYiLAogICAgICAgICAgICAic291cmNlIjogInRtcGZzIiwKICAgICAgICAgICAgInR5cGVfIjogInRtcGZzIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgInN0cmljdGF0aW1lIiwKICAgICAgICAgICAgICAibW9kZT03NTUiLAogICAgICAgICAgICAgICJzaXplPTY1NTM2ayIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvcHRzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJkZXZwdHMiLAogICAgICAgICAgICAidHlwZV8iOiAiZGV2cHRzIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAgICAgIm5ld2luc3RhbmNlIiwKICAgICAgICAgICAgICAicHRteG1vZGU9MDY2NiIsCiAgICAgICAgICAgICAgIm1vZGU9MDYyMCIsCiAgICAgICAgICAgICAgImdpZD01IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi9zaG0iLAogICAgICAgICAgICAic291cmNlIjogIi9ydW4va2F0YS1jb250YWluZXJzL3NhbmRib3gvc2htIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L21xdWV1ZSIsCiAgICAgICAgICAgICJzb3VyY2UiOiAibXF1ZXVlIiwKICAgICAgICAgICAgInR5cGVfIjogIm1xdWV1ZSIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9zeXMiLAogICAgICAgICAgICAic291cmNlIjogInN5c2ZzIiwKICAgICAgICAgICAgInR5cGVfIjogInN5c2ZzIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAgICAgIm5vZGV2IiwKICAgICAgICAgICAgICAicm8iCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvc3lzL2ZzL2Nncm91cCIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiY2dyb3VwIiwKICAgICAgICAgICAgInR5cGVfIjogImNncm91cCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIsCiAgICAgICAgICAgICAgInJlbGF0aW1lIiwKICAgICAgICAgICAgICAicm8iCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZXRjL2hvc3RzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KWhvc3RzJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJydyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvdGVybWluYXRpb24tbG9nIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KXRlcm1pbmF0aW9uLWxvZyQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicnciCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZXRjL2hvc3RuYW1lIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KWhvc3RuYW1lJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJydyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9ldGMvcmVzb2x2LmNvbmYiLAogICAgICAgICAgICAic291cmNlIjogIiQoc2ZwcmVmaXgpcmVzb2x2LmNvbmYkIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJ3IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL3Zhci9ydW4vc2VjcmV0cy9rdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50IiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KXNlcnZpY2VhY2NvdW50JCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJybyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi92YXIvcnVuL3NlY3JldHMvYXp1cmUvdG9rZW5zIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KXRva2VucyQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicm8iCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvY29ja3JvYWNoL2NvY2tyb2FjaC1kYXRhIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KWNvY2tyb2FjaC1kYXRhJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJydyIKICAgICAgICAgICAgXQogICAgICAgICAgfQogICAgICAgIF0sCiAgICAgICAgIkFubm90YXRpb25zIjogewogICAgICAgICAgImlvLmthdGFjb250YWluZXJzLnBrZy5vY2kuYnVuZGxlX3BhdGgiOiAiL3J1bi9jb250YWluZXJkL2lvLmNvbnRhaW5lcmQucnVudGltZS52Mi50YXNrL2s4cy5pby8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgImlvLmthdGFjb250YWluZXJzLnBrZy5vY2kuY29udGFpbmVyX3R5cGUiOiAicG9kX2NvbnRhaW5lciIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLW5hbWUiOiAiY29ja3JvYWNoZGIiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLmNvbnRhaW5lci10eXBlIjogImNvbnRhaW5lciIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuaW1hZ2UtbmFtZSI6ICJtYXJpbmVyY29uZnBvZHN0ZXN0LmF6dXJlY3IuaW8vY29ja3JvYWNoZGIvY29ja3JvYWNoOnYxLjAiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtaWQiOiAiXlthLXowLTldezY0fSQiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZXNwYWNlIjogIiIKICAgICAgICB9LAogICAgICAgICJMaW51eCI6IHsKICAgICAgICAgICJOYW1lc3BhY2VzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgIlR5cGUiOiAiaXBjIiwKICAgICAgICAgICAgICAiUGF0aCI6ICIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiVHlwZSI6ICJ1dHMiLAogICAgICAgICAgICAgICJQYXRoIjogIiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJUeXBlIjogIm1vdW50IiwKICAgICAgICAgICAgICAiUGF0aCI6ICIiCiAgICAgICAgICAgIH0KICAgICAgICAgIF0sCiAgICAgICAgICAiTWFza2VkUGF0aHMiOiBbCiAgICAgICAgICAgICIvcHJvYy9hY3BpIiwKICAgICAgICAgICAgIi9wcm9jL2tjb3JlIiwKICAgICAgICAgICAgIi9wcm9jL2tleXMiLAogICAgICAgICAgICAiL3Byb2MvbGF0ZW5jeV9zdGF0cyIsCiAgICAgICAgICAgICIvcHJvYy90aW1lcl9saXN0IiwKICAgICAgICAgICAgIi9wcm9jL3RpbWVyX3N0YXRzIiwKICAgICAgICAgICAgIi9wcm9jL3NjaGVkX2RlYnVnIiwKICAgICAgICAgICAgIi9wcm9jL3Njc2kiLAogICAgICAgICAgICAiL3N5cy9maXJtd2FyZSIKICAgICAgICAgIF0sCiAgICAgICAgICAiUmVhZG9ubHlQYXRocyI6IFsKICAgICAgICAgICAgIi9wcm9jL2Fzb3VuZCIsCiAgICAgICAgICAgICIvcHJvYy9idXMiLAogICAgICAgICAgICAiL3Byb2MvZnMiLAogICAgICAgICAgICAiL3Byb2MvaXJxIiwKICAgICAgICAgICAgIi9wcm9jL3N5cyIsCiAgICAgICAgICAgICIvcHJvYy9zeXNycS10cmlnZ2VyIgogICAgICAgICAgXQogICAgICAgIH0KICAgICAgfSwKICAgICAgInN0b3JhZ2VzIjogWwogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2gwKSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjApIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2gxKSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjEpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2gyKSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjIpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAib3ZlcmxheWZzIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJmdXNlMy5rYXRhLW92ZXJsYXkiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICJlZmUxYjkyYzQzYmNjNzliNDNjNDYyYjEyYWIwZDQ0NzRlYzYwOTJiN2QzM2MzNjE0Yzk2ZTk4ZjhiMTdlZGNiOjIxMzRkNjU2YzUzMjU2YmM1ZGJkMTRmMmYxMzJhOGI2NTFmM2ZmNzVmYjU2MGIxYjViZjcwY2FiODExMjU5YmQ6ZTM4MzY5YjI5NTY1MzllZGYyNTVlNmIwNTVmMWQzYWU5MDJhOTg5Yzg0NGQxYjYxYTA1YzU0NjA3YTIzNjBkOCIsCiAgICAgICAgICAgICIxZjg0M2YxZDAxYWRiM2IyZTEwODBkNGMwYWM1MmFkZTdkMDRhOTMwMmI3MjJjZWRiYzdiNGVkMzgwMjg4YzUyOmIzYTRjYTQyYzExNTE1MGFkODU0NzI3ZDVjMjcwZmZkN2ZjNjIyNGM0NjVkMWI1ODE5NWI3MDIzNTgxYzFlZTk6ZWE3ZDkxMDk0NTdmYjQ0ZGI1OWMxOGI1ZTA5NGY0OWUxMWE2ODI1NzE3MzQyZDNiYTViZDc3NzE5ODkxMDAxOCIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChjcGF0aCkvJChidW5kbGUtaWQpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9CiAgICAgIF0sCiAgICAgICJzYW5kYm94X3BpZG5zIjogZmFsc2UsCiAgICAgICJleGVjX2NvbW1hbmRzIjogW10KICAgIH0KICBdLAogICJjb21tb24iOiB7CiAgICAiY3BhdGgiOiAiL3J1bi9rYXRhLWNvbnRhaW5lcnMvc2hhcmVkL2NvbnRhaW5lcnMiLAogICAgInNmcHJlZml4IjogIl4kKGNwYXRoKS8kKGJ1bmRsZS1pZCktW2EtejAtOV17MTZ9LSIsCiAgICAic3BhdGgiOiAiL3J1bi9rYXRhLWNvbnRhaW5lcnMvc2FuZGJveC9zdG9yYWdlIiwKICAgICJpcHY0X2EiOiAiKCgyNVswLTVdfCgyWzAtNF18MVxcZHxbMS05XXwpXFxkKVxcLj9cXGIpezR9IiwKICAgICJpcF9wIjogIlswLTldezEsNX0iLAogICAgInN2Y19uYW1lIjogIltBLVowLTlfXFwuXFwtXSsiLAogICAgImRuc19sYWJlbCI6ICJbYS16QS1aMC05X1xcLlxcLV0rIiwKICAgICJzX3NvdXJjZTEiOiAiXi4uMlswLTldezN9X1swLTFdWzAtOV1fWzAtM11bMC05XV9bMC0yXVswLTldX1swLTVdWzAtOV1fWzAtNV1bMC05XVxcLlswLTldezEsMTB9JCIsCiAgICAic19zb3VyY2UyIjogIl4uLmRhdGEvIiwKICAgICJkZWZhdWx0X2NhcHMiOiBbCiAgICAgICJDQVBfQ0hPV04iLAogICAgICAiQ0FQX0RBQ19PVkVSUklERSIsCiAgICAgICJDQVBfRlNFVElEIiwKICAgICAgIkNBUF9GT1dORVIiLAogICAgICAiQ0FQX01LTk9EIiwKICAgICAgIkNBUF9ORVRfUkFXIiwKICAgICAgIkNBUF9TRVRHSUQiLAogICAgICAiQ0FQX1NFVFVJRCIsCiAgICAgICJDQVBfU0VURkNBUCIsCiAgICAgICJDQVBfU0VUUENBUCIsCiAgICAgICJDQVBfTkVUX0JJTkRfU0VSVklDRSIsCiAgICAgICJDQVBfU1lTX0NIUk9PVCIsCiAgICAgICJDQVBfS0lMTCIsCiAgICAgICJDQVBfQVVESVRfV1JJVEUiCiAgICBdLAogICAgInByaXZpbGVnZWRfY2FwcyI6IFsKICAgICAgIkNBUF9DSE9XTiIsCiAgICAgICJDQVBfREFDX09WRVJSSURFIiwKICAgICAgIkNBUF9EQUNfUkVBRF9TRUFSQ0giLAogICAgICAiQ0FQX0ZPV05FUiIsCiAgICAgICJDQVBfRlNFVElEIiwKICAgICAgIkNBUF9LSUxMIiwKICAgICAgIkNBUF9TRVRHSUQiLAogICAgICAiQ0FQX1NFVFVJRCIsCiAgICAgICJDQVBfU0VUUENBUCIsCiAgICAgICJDQVBfTElOVVhfSU1NVVRBQkxFIiwKICAgICAgIkNBUF9ORVRfQklORF9TRVJWSUNFIiwKICAgICAgIkNBUF9ORVRfQlJPQURDQVNUIiwKICAgICAgIkNBUF9ORVRfQURNSU4iLAogICAgICAiQ0FQX05FVF9SQVciLAogICAgICAiQ0FQX0lQQ19MT0NLIiwKICAgICAgIkNBUF9JUENfT1dORVIiLAogICAgICAiQ0FQX1NZU19NT0RVTEUiLAogICAgICAiQ0FQX1NZU19SQVdJTyIsCiAgICAgICJDQVBfU1lTX0NIUk9PVCIsCiAgICAgICJDQVBfU1lTX1BUUkFDRSIsCiAgICAgICJDQVBfU1lTX1BBQ0NUIiwKICAgICAgIkNBUF9TWVNfQURNSU4iLAogICAgICAiQ0FQX1NZU19CT09UIiwKICAgICAgIkNBUF9TWVNfTklDRSIsCiAgICAgICJDQVBfU1lTX1JFU09VUkNFIiwKICAgICAgIkNBUF9TWVNfVElNRSIsCiAgICAgICJDQVBfU1lTX1RUWV9DT05GSUciLAogICAgICAiQ0FQX01LTk9EIiwKICAgICAgIkNBUF9MRUFTRSIsCiAgICAgICJDQVBfQVVESVRfV1JJVEUiLAogICAgICAiQ0FQX0FVRElUX0NPTlRST0wiLAogICAgICAiQ0FQX1NFVEZDQVAiLAogICAgICAiQ0FQX01BQ19PVkVSUklERSIsCiAgICAgICJDQVBfTUFDX0FETUlOIiwKICAgICAgIkNBUF9TWVNMT0ciLAogICAgICAiQ0FQX1dBS0VfQUxBUk0iLAogICAgICAiQ0FQX0JMT0NLX1NVU1BFTkQiLAogICAgICAiQ0FQX0FVRElUX1JFQUQiLAogICAgICAiQ0FQX1BFUkZNT04iLAogICAgICAiQ0FQX0JQRiIsCiAgICAgICJDQVBfQ0hFQ0tQT0lOVF9SRVNUT1JFIgogICAgXSwKICAgICJ2aXJ0aW9fYmxrX3N0b3JhZ2VfY2xhc3NlcyI6IFsKICAgICAgImNjLWxvY2FsLWNzaSIsCiAgICAgICJjYy1tYW5hZ2VkLWNzaSIsCiAgICAgICJjYy1tYW5hZ2VkLXByZW1pdW0tY3NpIgogICAgXSwKICAgICJzbWJfc3RvcmFnZV9jbGFzc2VzIjogWwogICAgICB7CiAgICAgICAgIm5hbWUiOiAiYXp1cmVmaWxlLWNzaS1rYXRhLWNjIiwKICAgICAgICAibW91bnRfb3B0aW9ucyI6IFsKICAgICAgICAgICJkaXJfbW9kZT0wNzc3IiwKICAgICAgICAgICJmaWxlX21vZGU9MDc3NyIsCiAgICAgICAgICAibWZzeW1saW5rcyIsCiAgICAgICAgICAiY2FjaGU9c3RyaWN0IiwKICAgICAgICAgICJub3NoYXJlc29jayIsCiAgICAgICAgICAiYWN0aW1lbz0zMCIsCiAgICAgICAgICAibm9icmwiCiAgICAgICAgXQogICAgICB9CiAgICBdCiAgfSwKICAic2FuZGJveCI6IHsKICAgICJzdG9yYWdlcyI6IFsKICAgICAgewogICAgICAgICJkcml2ZXIiOiAiZXBoZW1lcmFsIiwKICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAic291cmNlIjogInNobSIsCiAgICAgICAgImZzdHlwZSI6ICJ0bXBmcyIsCiAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgIm5vZGV2IiwKICAgICAgICAgICJtb2RlPTE3NzciLAogICAgICAgICAgInNpemU9NjcxMDg4NjQiCiAgICAgICAgXSwKICAgICAgICAibW91bnRfcG9pbnQiOiAiL3J1bi9rYXRhLWNvbnRhaW5lcnMvc2FuZGJveC9zaG0iLAogICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgfQogICAgXQogIH0sCiAgInJlcXVlc3RfZGVmYXVsdHMiOiB7CiAgICAiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdCI6IHsKICAgICAgImFsbG93X2Vudl9yZWdleCI6IFsKICAgICAgICAiXkhPU1ROQU1FPSQoZG5zX2xhYmVsKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfUE9SVF8kKGlwX3ApX1RDUD10Y3A6Ly8kKGlwdjRfYSk6JChpcF9wKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfUE9SVF8kKGlwX3ApX1RDUF9QUk9UTz10Y3AkIiwKICAgICAgICAiXiQoc3ZjX25hbWUpX1BPUlRfJChpcF9wKV9UQ1BfUE9SVD0kKGlwX3ApJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9QT1JUXyQoaXBfcClfVENQX0FERFI9JChpcHY0X2EpJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9TRVJWSUNFX0hPU1Q9JChpcHY0X2EpJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9TRVJWSUNFX1BPUlQ9JChpcF9wKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfU0VSVklDRV9QT1JUXyQoZG5zX2xhYmVsKT0kKGlwX3ApJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9QT1JUPXRjcDovLyQoaXB2NF9hKTokKGlwX3ApJCIsCiAgICAgICAgIl5BWlVSRV9DTElFTlRfSUQ9W0EtRmEtZjAtOS1dKiQiLAogICAgICAgICJeQVpVUkVfVEVOQU5UX0lEPVtBLUZhLWYwLTktXSokIiwKICAgICAgICAiXkFaVVJFX0ZFREVSQVRFRF9UT0tFTl9GSUxFPS92YXIvcnVuL3NlY3JldHMvYXp1cmUvdG9rZW5zL2F6dXJlLWlkZW50aXR5LXRva2VuJCIsCiAgICAgICAgIl5BWlVSRV9BVVRIT1JJVFlfSE9TVD1odHRwczovL2xvZ2luXFwubWljcm9zb2Z0b25saW5lXFwuY29tLyQiLAogICAgICAgICJeVEVSTT14dGVybSQiCiAgICAgIF0KICAgIH0sCiAgICAiQ29weUZpbGVSZXF1ZXN0IjogWwogICAgICAiJChzZnByZWZpeCkiCiAgICBdLAogICAgIkV4ZWNQcm9jZXNzUmVxdWVzdCI6IHsKICAgICAgImNvbW1hbmRzIjogW10sCiAgICAgICJyZWdleCI6IFtdCiAgICB9LAogICAgIkNsb3NlU3RkaW5SZXF1ZXN0IjogZmFsc2UsCiAgICAiUmVhZFN0cmVhbVJlcXVlc3QiOiB0cnVlLAogICAgIlVwZGF0ZUVwaGVtZXJhbE1vdW50c1JlcXVlc3QiOiBmYWxzZSwKICAgICJXcml0ZVN0cmVhbVJlcXVlc3QiOiBmYWxzZQogIH0KfQ== + spec: + runtimeClassName: kata-cc + initContainers: + - name: bootstrap + image: "marinerconfpodstest.azurecr.io/cockroachdb/cockroach-k8s-init:0.1" + imagePullPolicy: IfNotPresent + volumeMounts: + - mountPath: /cockroach/cockroach-data + name: datadir + env: + - name: POD_NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace + args: + - "-on-start=/on-start.sh" + - "-service=cockroachdb" + affinity: + podAntiAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - weight: 100 + podAffinityTerm: + labelSelector: + matchExpressions: + - key: app + operator: In + values: + - cockroachdb + topologyKey: kubernetes.io/hostname + containers: + - name: cockroachdb + image: "marinerconfpodstest.azurecr.io/cockroachdb/cockroach:v1.0" + imagePullPolicy: IfNotPresent + volumeMounts: + - mountPath: /cockroach/cockroach-data + name: datadir + ports: + - containerPort: 26257 + name: grpc + - containerPort: 8080 + name: http + command: + - /bin/bash + - "-ecx" + - "# The use of qualified `hostname -f` is crucial:\n# Other nodes aren't able to look up the unqualified hostname.\nCRARGS=(\"start\" \"--logtostderr\" \"--insecure\" \"--host\" \"$(hostname -f)\" \"--http-host\" \"0.0.0.0\")\n# We only want to initialize a new cluster (by omitting the join flag)\n# if we're sure that we're the first node (i.e. index 0) and that\n# there aren't any other nodes running as part of the cluster that\n# this is supposed to be a part of (which indicates that a cluster\n# already exists and we should make sure not to create a new one).\n# It's fine to run without --join on a restart if there aren't any\n# other nodes.\nif [ ! \"$(hostname)\" == \"cockroachdb-0\" ] || \\\n [ -e \"/cockroach/cockroach-data/cluster_exists_marker\" ]\nthen\n # We don't join cockroachdb in order to avoid a node attempting\n # to join itself, which currently doesn't work\n # (https://github.com/cockroachdb/cockroach/issues/9625).\n CRARGS+=(\"--join\" \"cockroachdb-0.cockroachdb,cockroachdb-1.cockroachdb,cockroachdb-2.cockroachdb\")\nfi\nexec /cockroach/cockroach ${CRARGS[*]}\n" + volumes: + - name: datadir + persistentVolumeClaim: + claimName: datadir + terminationGracePeriodSeconds: 60 + volumeClaimTemplates: + - metadata: + name: datadir + spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi diff --git a/src/agent/samples/policy/yaml/kubernetes/incomplete-init/controller.yaml b/src/agent/samples/policy/yaml/kubernetes/incomplete-init/controller.yaml new file mode 100644 index 000000000000..97abc15af1d0 --- /dev/null +++ b/src/agent/samples/policy/yaml/kubernetes/incomplete-init/controller.yaml @@ -0,0 +1,53 @@ +--- +apiVersion: v1 +kind: ReplicationController +metadata: + name: cassandra +spec: + replicas: 2 + template: + metadata: + labels: + app: cassandra + annotations: + io.katacontainers.config.agent.policy: IyBDb3B5cmlnaHQgKGMpIDIwMjMgTWljcm9zb2Z0IENvcnBvcmF0aW9uCiMKIyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMAojCnBhY2thZ2UgYWdlbnRfcG9saWN5CgppbXBvcnQgZnV0dXJlLmtleXdvcmRzLmluCmltcG9ydCBmdXR1cmUua2V5d29yZHMuZXZlcnkKCiMgRGVmYXVsdCB2YWx1ZXMsIHJldHVybmVkIGJ5IE9QQSB3aGVuIHJ1bGVzIGNhbm5vdCBiZSBldmFsdWF0ZWQgdG8gdHJ1ZS4KZGVmYXVsdCBBZGRBUlBOZWlnaGJvcnNSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgQWRkU3dhcFJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBDbG9zZVN0ZGluUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IENvcHlGaWxlUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IENyZWF0ZUNvbnRhaW5lclJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBDcmVhdGVTYW5kYm94UmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IERlc3Ryb3lTYW5kYm94UmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgRXhlY1Byb2Nlc3NSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgR2V0T09NRXZlbnRSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBHdWVzdERldGFpbHNSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBMaXN0SW50ZXJmYWNlc1JlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBMaXN0Um91dGVzUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IE1lbUhvdHBsdWdCeVByb2JlUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IE9ubGluZUNQVU1lbVJlcXVlc3QgOj0gdHJ1ZQpkZWZhdWx0IFBhdXNlQ29udGFpbmVyUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFJlYWRTdHJlYW1SZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgUmVtb3ZlQ29udGFpbmVyUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgUmVtb3ZlU3RhbGVWaXJ0aW9mc1NoYXJlTW91bnRzUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgUmVzZWVkUmFuZG9tRGV2UmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFJlc3VtZUNvbnRhaW5lclJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBTZXRHdWVzdERhdGVUaW1lUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFNldFBvbGljeVJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBTaWduYWxQcm9jZXNzUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgU3RhcnRDb250YWluZXJSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBTdGFydFRyYWNpbmdSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgU3RhdHNDb250YWluZXJSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBTdG9wVHJhY2luZ1JlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBUdHlXaW5SZXNpemVSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBVcGRhdGVDb250YWluZXJSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgVXBkYXRlRXBoZW1lcmFsTW91bnRzUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFVwZGF0ZUludGVyZmFjZVJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBVcGRhdGVSb3V0ZXNSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgV2FpdFByb2Nlc3NSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBXcml0ZVN0cmVhbVJlcXVlc3QgOj0gZmFsc2UKCiMgQWxsb3dSZXF1ZXN0c0ZhaWxpbmdQb2xpY3kgOj0gdHJ1ZSBjb25maWd1cmVzIHRoZSBBZ2VudCB0byAqYWxsb3cgYW55CiMgcmVxdWVzdHMgY2F1c2luZyBhIHBvbGljeSBmYWlsdXJlKi4gVGhpcyBpcyBhbiB1bnNlY3VyZSBjb25maWd1cmF0aW9uCiMgYnV0IGlzIHVzZWZ1bCBmb3IgYWxsb3dpbmcgdW5zZWN1cmUgcG9kcyB0byBzdGFydCwgdGhlbiBjb25uZWN0IHRvCiMgdGhlbSBhbmQgaW5zcGVjdCBPUEEgbG9ncyBmb3IgdGhlIHJvb3QgY2F1c2Ugb2YgYSBmYWlsdXJlLgpkZWZhdWx0IEFsbG93UmVxdWVzdHNGYWlsaW5nUG9saWN5IDo9IGZhbHNlCgojIENvbnN0YW50cwpTX05BTUVfS0VZID0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZSIKU19OQU1FU1BBQ0VfS0VZID0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZXNwYWNlIgpCVU5ETEVfSUQgPSAiW2EtejAtOV17NjR9IgoKQ3JlYXRlQ29udGFpbmVyUmVxdWVzdDo9IHJlc3AgewogICAgbm90IGlzX251bGwoaW5wdXQuZW52X21hcCkKICAgIAogICAgaV9lbnZfbWFwIDo9IGlucHV0LmVudl9tYXAKICAgIAogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBwX2Vudl9tYXAgOj0gcF9jb250YWluZXIuZW52X21hcCAgCiAgICBhbGxvd19lbnZfbWFwKHBfZW52X21hcCwgaV9lbnZfbWFwKQogICAgCiAgICBpX3Byb2Nlc3MgOj0gaW5wdXQuYmFzZS5PQ0kuUHJvY2VzcwogICAgCiAgICBwX3Byb2Nlc3MgOj0gcF9jb250YWluZXIuT0NJLlByb2Nlc3MKICAgIAogICAgYWxsb3dfYXJncyhpX3Byb2Nlc3MsIHBfcHJvY2VzcywgaV9lbnZfbWFwKQoKICAgIHJlc3AgPSBDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uKGlucHV0LmJhc2UpCiAgICBwcmludCgiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdDogdHJ1ZSIpCn0KCmFsbG93X2FyZ3MoaV9wcm9jZXNzLCBwX3Byb2Nlc3MsIGlfZW52X21hcCkgewogICAgaV9hcmdzIDo9IGlfcHJvY2Vzcy5BcmdzCiAgICBwX2FyZ3MgOj0gcF9wcm9jZXNzLkFyZ3MKICAgIHByaW50KCJhbGxvd19hcmdzOiBpX2FyZ3MgPSIsIGlfYXJncywgInBfYXJncyA9IiwgcF9hcmdzKQogICAgY291bnQoaV9hcmdzKSA9PSBjb3VudChwX2FyZ3MpCiAgICBldmVyeSBpLCBpX2FyZyBpbiBpX2FyZ3MgewogICAgICAgIHByaW50KCJhbGxvd19hcmdzOiBpX2FyZyA9IiwgaV9hcmcpCiAgICAgICAgcF9hcmdfcmVwbGFjZWQgOj0gcmVwbGFjZV9lbnZfdmFyaWFibGVzKHBfYXJnc1tpXSwgaV9lbnZfbWFwKQogICAgICAgIHByaW50KCJhbGxvd19hcmdzOiBwX2FyZ19yZXBsYWNlZCA9IiwgcF9hcmdfcmVwbGFjZWQpCiAgICAgICAgcF9hcmdfcmVwbGFjZWQyIDo9IHJlcGxhY2UocF9hcmdfcmVwbGFjZWQsICIkJCIsICIkIikKICAgICAgICBwcmludCgiYWxsb3dfYXJnczogcF9hcmdfcmVwbGFjZWQyID0iLCBwX2FyZ19yZXBsYWNlZDIpCiAgICAgICAgaV9hcmcgPT0gcF9hcmdfcmVwbGFjZWQyCiAgICB9CiAgICBwcmludCgiYWxsb3dfYXJnczogdHJ1ZSIpCn0KCmFsbG93X2FyZ3MoaV9wcm9jZXNzLCBwX3Byb2Nlc3MsIGlfZW52X21hcCkgewogICAgbm90IGlfcHJvY2Vzcy5BcmdzCiAgICBub3QgcF9wcm9jZXNzLkFyZ3MKICAgIHByaW50KCJhbGxvd19hcmdzMjogbm8gYXJncyIpCn0KCiMgdGhpcyBmdW5jdGlvbiByZXBsYWNlcyBhbGwgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyBpbiBhIHN0cmluZywgZ2l2ZW4gYSBtYXAgb2YgZW52aXJvbm1lbnQga2V5cyB0byBlbnZpcm9ubWVudCB2YWx1ZXMKIyBlZyBzdHIgPSAiZWNobyAkKENMVVNURVJfSUQpOyBlY2hvICQoTk9ERV9OQU1FKTsiCiMgZW52X21hcCA9IHsiQ0xVU1RFUl9JRCI6ICJhYmMiLCAiTk9ERV9OQU1FIiA6ICJ4eXoifQojIHJlc3VsdCA9ICJlY2hvIGFiYzsgZWNobyB4eXo7IgpyZXBsYWNlX2Vudl92YXJpYWJsZXMoc3RyLCBlbnZfbWFwKSA9IHJlc3VsdCB7CiAgICAjIG1ha2UgYW4gYXJyYXkgb2YgdGhlIGtleXMgZWcgWyJDTFVTVEVSX0lEIiwgIk5PREVfTkFNRSJdCiAgICBrZXlzIDo9IFt4IHwgc29tZSB4IGluIG9iamVjdC5rZXlzKGVudl9tYXApXQogICAgcmVzdWx0IDo9IHJlcGxhY2Vfc3RyX3JlYyhzdHIsIGVudl9tYXAsIGtleXMsIGNvdW50KGtleXMpIC0gMSkKfQoKIyBiYXNlIGNhc2UKcmVwbGFjZV9zdHJfcmVjKHN0ciwgZW52X21hcCwgYXJyX2tleXMsIGkpID0gcmVzdWx0IHsKICAgIGkgPCAwCiAgICByZXN1bHQgOj0gc3RyCn0KCiMgcmVjdXJzaXZlIHN0ZXAKcmVwbGFjZV9zdHJfcmVjKHN0ciwgZW52X21hcCwgYXJyX2tleXMsIGkpID0gcmVzdWx0IHsKICAgIGkgPj0gMAogICAga2V5IDo9IGFycl9rZXlzW2ldCiAgICBlbnZfa2V5MSA6PSBjb25jYXQoIiIsIFsiJCgiLCBrZXksICIpIl0pCiAgICAjIHJlcGxhY2UgJChWQVIpIHdpdGggdmFsdWUKICAgIG5ld19zdHIxIDo9IHJlcGxhY2Uoc3RyLCBlbnZfa2V5MSwgZW52X21hcFtrZXldKQogICAgIyByZXBsYWNlIG5leHQgZW52aXJvbm1lbnQgdmFyaWFibGUKICAgIHJlc3VsdCA9IHJlcGxhY2Vfc3RyX3JlYyhuZXdfc3RyMSwgZW52X21hcCwgYXJyX2tleXMsIGkgLSAxKQp9CgphbGxvd19lbnZfbWFwKHBfZW52X21hcCwgaV9lbnZfbWFwKSB7CiAgICBwcmludCgiYWxsb3dfZW52X21hcDogcF9lbnZfbWFwID0iLCBwX2Vudl9tYXApCiAgICBldmVyeSBlbnZfa2V5LCBlbnZfdmFsIGluIGlfZW52X21hcCB7CiAgICAgICAgcHJpbnQoImFsbG93X2VudjogZW52X2tleSA9IiwgZW52X2tleSwgImVudl92YWwgPSIsIGVudl92YWwpCiAgICAgICAgYWxsb3dfZW52X21hcF9lbnRyeShlbnZfa2V5LCBlbnZfdmFsLCBwX2Vudl9tYXApCiAgICB9CiAgICBwcmludCgiYWxsb3dfZW52X21hcDogdHJ1ZSIpCn0KCiMgQWxsb3cgZXhhY3QgbWF0Y2gKYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBpX3ZhbCA9PSBwX3ZhbAogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnk6IHRydWUiKQp9CgojIEFsbG93IHJlc291cmNlRmllbGRSZWYgdmFsdWVzIChlLmcuLCAibGltaXRzLmNwdSIpLgphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgICMgYSB2YXJpYWJsZSB3ZSBzaG91bGQgYmUgdmFsaWRhdGluZyB1c2luZyBhIHJlZ2V4IGZyb20gc2V0dGluZ3MKICAgIHBfdmFsID09ICIkKHZhbGlkYXRlLWZyb20tc2V0dGluZ3MpIgogICAgcmVnZXhfdmFsIDo9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuQ3JlYXRlQ29udGFpbmVyUmVxdWVzdC5hbGxvd19lbnZfcmVnZXhfbWFwW2tleV0KICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4X3ZhbCwgaV92YWwpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSAyOiB0cnVlIikKfQoKIyBBbGxvdyBub2RlLW5hbWUKYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChub2RlLW5hbWUpIgogICAgcmVnZXgubWF0Y2gocG9saWN5X2RhdGEuY29tbW9uLmRuc19zdWJkb21haW4gLCBpX3ZhbCkKICAgIHByaW50KCJhbGxvd19lbnZfbWFwX2VudHJ5IDM6IHRydWUiKQp9CgojIEFsbG93IGhvc3QtbmFtZQphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgIHBfdmFsID09ICIkKGhvc3QtbmFtZSkiCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24uZG5zX2xhYmVsICwgaV92YWwpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSA0OiB0cnVlIikKfQoKIyBBbGxvdyBwb2QtdWlkCmFsbG93X2Vudl9tYXBfZW50cnkoa2V5LCBpX3ZhbCwgcF9lbnZfbWFwKSB7CiAgICBwX3ZhbCA6PSBwX2Vudl9tYXBba2V5XQogICAgcF92YWwgPT0gIiQocG9kLXVpZCkiCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24ucG9kX3VpZCAsIGlfdmFsKQogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgNTogdHJ1ZSIpCn0KCiMgQWxsb3cgZmllbGRSZWYgImZpZWxkUGF0aDogc3RhdHVzLnBvZElQIiB2YWx1ZXMuCmFsbG93X2Vudl9tYXBfZW50cnkoa2V5LCBpX3ZhbCwgcF9lbnZfbWFwKSB7CiAgICBpc19pcChpX3ZhbCkKCiAgICBwX3ZhbCA6PSBwX2Vudl9tYXBba2V5XQogICAgcF92YXIgOj0gY29uY2F0KCI9IiwgW2tleSwgcF92YWxdKQogICAgYWxsb3dfcG9kX2lwX3ZhcihrZXksIHBfdmFyKQogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgNjogdHJ1ZSIpCn0KCiMgQWxsb3cgZmllbGRSZWYgImZpZWxkUGF0aDogc3RhdHVzLmhvc3RJUCIgdmFsdWVzLgphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgaXNfaXAoaV92YWwpCgogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgIHBfdmFyIDo9IGNvbmNhdCgiPSIsIFtrZXksIHBfdmFsXSkKICAgIGFsbG93X2hvc3RfaXBfdmFyKGtleSwgcF92YXIpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSA3OiB0cnVlIikKfQoKIyBNYXRjaCBpbnB1dCB3aXRoIG9uZSBvZiB0aGUgcG9saWN5IHZhcmlhYmxlcywgYWZ0ZXIgc3Vic3RpdHV0aW5nICQoc2FuZGJveC1uYW1lKS4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChzYW5kYm94LW5hbWUpIgogICAgc19uYW1lIDo9IGlucHV0LmJhc2UuT0NJLkFubm90YXRpb25zW1NfTkFNRV9LRVldCiAgICBwX3ZhcjIgOj0gcmVwbGFjZShwX3ZhbCwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHBfdmFyMiA9PSBpX3ZhbAogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgODogdHJ1ZSIpCn0KCiMgTWF0Y2ggaW5wdXQgd2l0aCBvbmUgb2YgdGhlIHBvbGljeSB2YXJpYWJsZXMsIGFmdGVyIHN1YnN0aXR1dGluZyAkKHNhbmRib3gtbmFtZXNwYWNlKS4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChzYW5kYm94LW5hbWVzcGFjZSkiCiAgICBzX25hbWVzcGFjZSA6PSBpbnB1dC5iYXNlLk9DSS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwX3ZhcjIgOj0gcmVwbGFjZShwX3ZhbCwgIiQoc2FuZGJveC1uYW1lc3BhY2UpIiwgc19uYW1lc3BhY2UpCiAgICBwX3ZhcjIgPT0gaV92YWwKICAgIHByaW50KCJhbGxvd19lbnZfbWFwX2VudHJ5IDk6IHRydWUiKQp9CgojIEFsbG93IGlucHV0IGVudiB2YXJpYWJsZXMgdGhhdCBtYXRjaCB3aXRoIGEgcmVxdWVzdF9kZWZhdWx0cyByZWdleC4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHNvbWUgcF9yZWdleDEgaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5DcmVhdGVDb250YWluZXJSZXF1ZXN0LmFsbG93X2Vudl9yZWdleAogICAgcF9yZWdleDIgOj0gcmVwbGFjZShwX3JlZ2V4MSwgIiQoaXB2NF9hKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcHY0X2EpCiAgICBwX3JlZ2V4MyA6PSByZXBsYWNlKHBfcmVnZXgyLCAiJChpcF9wKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcF9wKQogICAgcF9yZWdleDQgOj0gcmVwbGFjZShwX3JlZ2V4MywgIiQoc3ZjX25hbWUpIiwgcG9saWN5X2RhdGEuY29tbW9uLnN2Y19uYW1lKQogICAgcF9yZWdleDUgOj0gcmVwbGFjZShwX3JlZ2V4NCwgIiQoZG5zX2xhYmVsKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5kbnNfbGFiZWwpCgogICAgcmVzdWx0IDo9IGNvbmNhdCgiPSIsIFtrZXksIGlfdmFsXSkKICAgIHJlZ2V4Lm1hdGNoKHBfcmVnZXg1LCByZXN1bHQpCgogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgMTA6IHRydWUiKQp9CgpDcmVhdGVDb250YWluZXJSZXF1ZXN0Oj0gcmVzcCB7CiAgICBub3QgaW5wdXQuZW52X21hcAogICAgaV9wcm9jZXNzID0gaW5wdXQuT0NJLlByb2Nlc3MKICAgIHNfbmFtZSA9IGlucHV0Lk9DSS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBwX3Byb2Nlc3MgPSBwX2NvbnRhaW5lci5PQ0kuUHJvY2VzcwogICAgYWxsb3dfZGVwcmVjYXRlZF9hcmdzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUpCiAgICByZXNwID0gQ3JlYXRlQ29udGFpbmVyUmVxdWVzdENvbW1vbihpbnB1dCkKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0MjogdHJ1ZSIpCn0KCkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb24ocmVxKTo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgICMgQ2hlY2sgaWYgdGhlIGlucHV0IHJlcXVlc3Qgc2hvdWxkIGJlIHJlamVjdGVkIGV2ZW4gYmVmb3JlIGNoZWNraW5nIHRoZQogICAgIyBwb2xpY3lfZGF0YS5jb250YWluZXJzIGluZm9ybWF0aW9uLgogICAgYWxsb3dfY3JlYXRlX2NvbnRhaW5lcl9pbnB1dChyZXEpCgogICAgaV9vY2kgOj0gcmVxLk9DSQogICAgaV9zdG9yYWdlcyA6PSByZXEuc3RvcmFnZXMKICAgIGlfZGV2aWNlcyA6PSByZXEuZGV2aWNlcwoKICAgICMgYXJyYXkgb2YgcG9zc2libGUgc3RhdGUgb3BlcmF0aW9ucwogICAgb3BzX2J1aWxkZXIgOj0gW10KCiAgICAjIGNoZWNrIHNhbmRib3ggbmFtZQogICAgc2FuZGJveF9uYW1lID0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FX0tFWV0KICAgIGFkZF9zYW5kYm94X25hbWVfdG9fc3RhdGUgOj0gc3RhdGVfYWxsb3dzKCJzYW5kYm94X25hbWUiLCBzYW5kYm94X25hbWUpCiAgICBvcHNfYnVpbGRlcjEgOj0gY29uY2F0X29wX2lmX25vdF9udWxsKG9wc19idWlsZGVyLCBhZGRfc2FuZGJveF9uYW1lX3RvX3N0YXRlKQoKICAgICMgQ2hlY2sgaWYgYW55IGVsZW1lbnQgZnJvbSB0aGUgcG9saWN5X2RhdGEuY29udGFpbmVycyBhcnJheSBhbGxvd3MgdGhlIGlucHV0IHJlcXVlc3QuCiAgICBzb21lIHBfY29udGFpbmVyIGluIHBvbGljeV9kYXRhLmNvbnRhaW5lcnMKICAgIHByaW50KCI9PT09PT09PSBDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiB0cnlpbmcgbmV4dCBwb2xpY3kgY29udGFpbmVyIikKCiAgICBwX3BpZG5zIDo9IHBfY29udGFpbmVyLnNhbmRib3hfcGlkbnMKICAgIGlfcGlkbnMgOj0gcmVxLnNhbmRib3hfcGlkbnMKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiBwX3BpZG5zID0iLCBwX3BpZG5zLCAiaV9waWRucyA9IiwgaV9waWRucykKICAgIHBfcGlkbnMgPT0gaV9waWRucwoKICAgIHBfb2NpIDo9IHBfY29udGFpbmVyLk9DSQoKICAgICMgY2hlY2sgbmFtZXNwYWNlCiAgICBwX25hbWVzcGFjZSA6PSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBpX25hbWVzcGFjZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwcmludCAoIkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb246IHBfbmFtZXNwYWNlID0iLCBwX25hbWVzcGFjZSwgImlfbmFtZXNwYWNlID0iLCBpX25hbWVzcGFjZSkKICAgIGFkZF9uYW1lc3BhY2VfdG9fc3RhdGUgOj0gYWxsb3dfbmFtZXNwYWNlKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkKICAgIG9wc19idWlsZGVyMiA6PSBjb25jYXRfb3BfaWZfbm90X251bGwob3BzX2J1aWxkZXIxLCBhZGRfbmFtZXNwYWNlX3RvX3N0YXRlKQoKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiBwIFZlcnNpb24gPSIsIHBfb2NpLlZlcnNpb24sICJpIFZlcnNpb24gPSIsIGlfb2NpLlZlcnNpb24pCiAgICBwX29jaS5WZXJzaW9uID09IGlfb2NpLlZlcnNpb24KCiAgICBwcmludCgiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdENvbW1vbjogcCBSZWFkb25seSA9IiwgcF9vY2kuUm9vdC5SZWFkb25seSwgImkgUmVhZG9ubHkgPSIsIGlfb2NpLlJvb3QuUmVhZG9ubHkpCiAgICBwX29jaS5Sb290LlJlYWRvbmx5ID09IGlfb2NpLlJvb3QuUmVhZG9ubHkKCiAgICBhbGxvd19hbm5vKHBfb2NpLCBpX29jaSkKCiAgICBwX3N0b3JhZ2VzIDo9IHBfY29udGFpbmVyLnN0b3JhZ2VzCiAgICBhbGxvd19ieV9hbm5vKHBfb2NpLCBpX29jaSwgcF9zdG9yYWdlcywgaV9zdG9yYWdlcykKCiAgICBwX2RldmljZXMgOj0gcF9jb250YWluZXIuZGV2aWNlcwogICAgYWxsb3dfZGV2aWNlcyhwX2RldmljZXMsIGlfZGV2aWNlcykKCiAgICByZXQgOj0gYWxsb3dfbGludXgob3BzX2J1aWxkZXIyLCBwX29jaSwgaV9vY2kpCiAgICByZXQuYWxsb3dlZAoKICAgIG9wcyA6PSByZXQub3BzCgogICAgcHJpbnQoIkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb246IHRydWUiKQp9CgphbGxvd19jcmVhdGVfY29udGFpbmVyX2lucHV0KHJlcSkgewogICAgcHJpbnQoImFsbG93X2NyZWF0ZV9jb250YWluZXJfaW5wdXQ6IGlucHV0ID0iLCByZXEpCgogICAgY291bnQocmVxLnNoYXJlZF9tb3VudHMpID09IDAKICAgIGlzX251bGwocmVxLnN0cmluZ191c2VyKQoKICAgIGlfb2NpIDo9IHJlcS5PQ0kKICAgIGlzX251bGwoaV9vY2kuSG9va3MpCiAgICBpc19udWxsKGlfb2NpLlNvbGFyaXMpCiAgICBpc19udWxsKGlfb2NpLldpbmRvd3MpCgogICAgaV9saW51eCA6PSBpX29jaS5MaW51eAogICAgY291bnQoaV9saW51eC5HSURNYXBwaW5ncykgPT0gMAogICAgY291bnQoaV9saW51eC5Nb3VudExhYmVsKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlJlc291cmNlcy5EZXZpY2VzKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlJvb3Rmc1Byb3BhZ2F0aW9uKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlVJRE1hcHBpbmdzKSA9PSAwCiAgICBpc19udWxsKGlfbGludXguSW50ZWxSZHQpCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLkJsb2NrSU8pCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLk5ldHdvcmspCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLlBpZHMpCiAgICBpc19udWxsKGlfbGludXguU2VjY29tcCkKCiAgICBpX3Byb2Nlc3MgOj0gaV9vY2kuUHJvY2VzcwogICAgY291bnQoaV9wcm9jZXNzLlNlbGludXhMYWJlbCkgPT0gMAogICAgY291bnQoaV9wcm9jZXNzLlVzZXIuVXNlcm5hbWUpID09IDAKCiAgICBwcmludCgiYWxsb3dfY3JlYXRlX2NvbnRhaW5lcl9pbnB1dDogdHJ1ZSIpCn0KCmFsbG93X25hbWVzcGFjZShwX25hbWVzcGFjZSwgaV9uYW1lc3BhY2UpID0gYWRkX25hbWVzcGFjZSB7CiAgICBwX25hbWVzcGFjZSA9PSBpX25hbWVzcGFjZQogICAgYWRkX25hbWVzcGFjZSA6PSBudWxsCiAgICBwcmludCgiYWxsb3dfbmFtZXNwYWNlIDE6IGlucHV0IG5hbWVzcGFjZSBtYXRjaGVzIHBvbGljeSBkYXRhIikKfQoKYWxsb3dfbmFtZXNwYWNlKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkgPSBhZGRfbmFtZXNwYWNlIHsKICAgIHBfbmFtZXNwYWNlID09ICIiCiAgICBwcmludCgiYWxsb3dfbmFtZXNwYWNlIDI6IG5vIG5hbWVzcGFjZSBmb3VuZCBvbiBwb2xpY3kgZGF0YSIpCiAgICBhZGRfbmFtZXNwYWNlIDo9IHN0YXRlX2FsbG93cygibmFtZXNwYWNlIiwgaV9uYW1lc3BhY2UpCn0KCiMgdmFsdWUgaGFzbid0IGJlZW4gc2VlbiBiZWZvcmUsIHNhdmUgaXQgdG8gc3RhdGUKc3RhdGVfYWxsb3dzKGtleSwgdmFsdWUpID0gYWN0aW9uIHsKICBzdGF0ZSA6PSBnZXRfc3RhdGUoKQogIHByaW50KCJzdGF0ZV9hbGxvd3MgMTogc3RhdGVba2V5XSA9Iiwgc3RhdGVba2V5XSwgInZhbHVlID0iLCB2YWx1ZSkKICBub3Qgc3RhdGVba2V5XQogIHByaW50KCJzdGF0ZV9hbGxvd3MgMTogc2F2aW5nIHRvIHN0YXRlIGtleSA9Iiwga2V5LCAidmFsdWUgPSIsIHZhbHVlKQogIHBhdGggOj0gZ2V0X3N0YXRlX3BhdGgoa2V5KSAKICBhY3Rpb24gOj0gewogICAgIm9wIjogImFkZCIsCiAgICAicGF0aCI6IHBhdGgsIAogICAgInZhbHVlIjogdmFsdWUsCiAgfQp9CgojIHZhbHVlIG1hdGNoZXMgd2hhdCdzIGluIHN0YXRlLCBhbGxvdyBpdApzdGF0ZV9hbGxvd3Moa2V5LCB2YWx1ZSkgPSBhY3Rpb24gewogIHByaW50KCJzdGF0ZV9hbGxvd3MgMjogc3RhcnQiKQogIHN0YXRlIDo9IGdldF9zdGF0ZSgpCiAgcHJpbnQoInN0YXRlX2FsbG93cyAyOiBzdGF0ZVtrZXldID0iLCBzdGF0ZVtrZXldLCAidmFsdWUgPSIsIHZhbHVlKQogIHZhbHVlID09IHN0YXRlW2tleV0KICBwcmludCgic3RhdGVfYWxsb3dzIDI6IGZvdW5kIGtleSA9Iiwga2V5LCAidmFsdWUgPSIsIHZhbHVlLCAiIGluIHN0YXRlIikKICBhY3Rpb24gOj0gbnVsbAp9CgojIGhlbHBlciBmdW5jdGlvbnMgdG8gaW50ZXJhY3Qgd2l0aCB0aGUgc3RhdGUKZ2V0X3N0YXRlKCkgPSBzdGF0ZSB7CiAgc3RhdGUgOj0gZGF0YVsicHN0YXRlIl0KfQoKZ2V0X3N0YXRlX3ZhbChrZXkpID0gdmFsdWUgewogICAgc3RhdGUgOj0gZ2V0X3N0YXRlKCkKICAgIHZhbHVlIDo9IHN0YXRlW2tleV0KfQoKZ2V0X3N0YXRlX3BhdGgoa2V5KSA9IHBhdGggewogICAgIyBwcmVwZW5kICIvcHN0YXRlLyIgdG8ga2V5CiAgICBwYXRoIDo9IGNvbmNhdCgiLyIsIFsiL3BzdGF0ZSIsIGtleV0pCn0KCiMgSGVscGVyIGZ1bmN0aW9ucyB0byBjb25kaXRpb25hbGx5IGNvbmNhdGVuYXRlIG9wIGlzIG5vdCBudWxsCmNvbmNhdF9vcF9pZl9ub3RfbnVsbChvcHMsIG9wKSA9IHJlc3VsdCB7CiAgICBvcCA9PSBudWxsCiAgICByZXN1bHQgOj0gb3BzCn0KCmNvbmNhdF9vcF9pZl9ub3RfbnVsbChvcHMsIG9wKSA9IHJlc3VsdCB7CiAgICBvcCAhPSBudWxsCiAgICByZXN1bHQgOj0gYXJyYXkuY29uY2F0KG9wcywgW29wXSkKfQoKIyBSZWplY3QgdW5leHBlY3RlZCBhbm5vdGF0aW9ucy4KYWxsb3dfYW5ubyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19hbm5vIDE6IHN0YXJ0IikKCiAgICBub3QgaV9vY2kuQW5ub3RhdGlvbnMKCiAgICBwcmludCgiYWxsb3dfYW5ubyAxOiB0cnVlIikKfQphbGxvd19hbm5vKHBfb2NpLCBpX29jaSkgewogICAgcHJpbnQoImFsbG93X2Fubm8gMjogcCBBbm5vdGF0aW9ucyA9IiwgcF9vY2kuQW5ub3RhdGlvbnMpCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiBpIEFubm90YXRpb25zID0iLCBpX29jaS5Bbm5vdGF0aW9ucykKCiAgICBpX2tleXMgOj0gb2JqZWN0LmtleXMoaV9vY2kuQW5ub3RhdGlvbnMpCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiBpIGtleXMgPSIsIGlfa2V5cykKCiAgICBldmVyeSBpX2tleSBpbiBpX2tleXMgewogICAgICAgIGFsbG93X2Fubm9fa2V5KGlfa2V5LCBwX29jaSkKICAgIH0KCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiB0cnVlIikKfQoKYWxsb3dfYW5ub19rZXkoaV9rZXksIHBfb2NpKSB7CiAgICBwcmludCgiYWxsb3dfYW5ub19rZXkgMTogaSBrZXkgPSIsIGlfa2V5KQoKICAgIHN0YXJ0c3dpdGgoaV9rZXksICJpby5rdWJlcm5ldGVzLmNyaS4iKQoKICAgIHByaW50KCJhbGxvd19hbm5vX2tleSAxOiB0cnVlIikKfQphbGxvd19hbm5vX2tleShpX2tleSwgcF9vY2kpIHsKICAgIHByaW50KCJhbGxvd19hbm5vX2tleSAyOiBpIGtleSA9IiwgaV9rZXkpCgogICAgc29tZSBwX2tleSwgXyBpbiBwX29jaS5Bbm5vdGF0aW9ucwogICAgcF9rZXkgPT0gaV9rZXkKCiAgICBwcmludCgiYWxsb3dfYW5ub19rZXkgMjogdHJ1ZSIpCn0KCiMgR2V0IHRoZSB2YWx1ZSBvZiB0aGUgU19OQU1FX0tFWSBhbm5vdGF0aW9uIGFuZAojIGNvcnJlbGF0ZSBpdCB3aXRoIG90aGVyIGFubm90YXRpb25zIGFuZCBwcm9jZXNzIGZpZWxkcy4KYWxsb3dfYnlfYW5ubyhwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpIHsKICAgIHByaW50KCJhbGxvd19ieV9hbm5vIDE6IHN0YXJ0IikKCiAgICBub3QgcF9vY2kuQW5ub3RhdGlvbnNbU19OQU1FX0tFWV0KCiAgICBpX3NfbmFtZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMTogaV9zX25hbWUgPSIsIGlfc19uYW1lKQoKICAgIGlfc19uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FU1BBQ0VfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMTogaV9zX25hbWVzcGFjZSA9IiwgaV9zX25hbWVzcGFjZSkKCiAgICBhbGxvd19ieV9zYW5kYm94X25hbWUocF9vY2ksIGlfb2NpLCBwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBpX3NfbmFtZSwgaV9zX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfYnlfYW5ubyAxOiB0cnVlIikKfQphbGxvd19ieV9hbm5vKHBfb2NpLCBpX29jaSwgcF9zdG9yYWdlcywgaV9zdG9yYWdlcykgewogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMjogc3RhcnQiKQoKICAgIHBfc19uYW1lIDo9IHBfb2NpLkFubm90YXRpb25zW1NfTkFNRV9LRVldCiAgICBpX3NfbmFtZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMjogaV9zX25hbWUgPSIsIGlfc19uYW1lLCAicF9zX25hbWUgPSIsIHBfc19uYW1lKQoKICAgIGFsbG93X3NhbmRib3hfbmFtZShwX3NfbmFtZSwgaV9zX25hbWUpCgogICAgaV9zX25hbWVzcGFjZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwcmludCgiYWxsb3dfYnlfYW5ubyAyOiBpX3NfbmFtZXNwYWNlID0iLCBpX3NfbmFtZXNwYWNlKQoKICAgIGFsbG93X2J5X3NhbmRib3hfbmFtZShwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMsIGlfc19uYW1lLCBpX3NfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd19ieV9hbm5vIDI6IHRydWUiKQp9CgphbGxvd19ieV9zYW5kYm94X25hbWUocF9vY2ksIGlfb2NpLCBwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfYnlfc2FuZGJveF9uYW1lOiBzdGFydCIpCgogICAgaV9uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FU1BBQ0VfS0VZXQoKICAgIGFsbG93X2J5X2NvbnRhaW5lcl90eXBlcyhwX29jaSwgaV9vY2ksIHNfbmFtZSwgaV9uYW1lc3BhY2UpCiAgICBhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZChwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpCiAgICBhbGxvd19wcm9jZXNzKHBfb2NpLlByb2Nlc3MsIGlfb2NpLlByb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpCgogICAgcHJpbnQoImFsbG93X2J5X3NhbmRib3hfbmFtZTogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfbmFtZShwX3NfbmFtZSwgaV9zX25hbWUpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X25hbWU6IHN0YXJ0IikKICAgIHJlZ2V4Lm1hdGNoKHBfc19uYW1lLCBpX3NfbmFtZSkKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9uYW1lOiB0cnVlIikKfQoKIyBDaGVjayB0aGF0IHRoZSAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLXR5cGUiIGFuZAojICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIiBhbm5vdGF0aW9ucyBkZXNpZ25hdGUgdGhlCiMgZXhwZWN0ZWQgdHlwZSAtIGVpdGhlciBhICJzYW5kYm94IiBvciBhICJjb250YWluZXIiLiBUaGVuLCB2YWxpZGF0ZQojIG90aGVyIGFubm90YXRpb25zIGJhc2VkIG9uIHRoZSBhY3R1YWwgInNhbmRib3giIG9yICJjb250YWluZXIiIHZhbHVlCiMgZnJvbSB0aGUgaW5wdXQgY29udGFpbmVyLgphbGxvd19ieV9jb250YWluZXJfdHlwZXMocF9vY2ksIGlfb2NpLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfYnlfY29udGFpbmVyX3R5cGVzOiBjaGVja2luZyBpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSIpCgogICAgY190eXBlIDo9ICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSIKICAgIAogICAgcF9jcmlfdHlwZSA6PSBwX29jaS5Bbm5vdGF0aW9uc1tjX3R5cGVdCiAgICBpX2NyaV90eXBlIDo9IGlfb2NpLkFubm90YXRpb25zW2NfdHlwZV0KICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZXM6IHBfY3JpX3R5cGUgPSIsIHBfY3JpX3R5cGUsICJpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgcF9jcmlfdHlwZSA9PSBpX2NyaV90eXBlCgogICAgYWxsb3dfYnlfY29udGFpbmVyX3R5cGUoaV9jcmlfdHlwZSwgcF9vY2ksIGlfb2NpLCBzX25hbWUsIHNfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZXM6IHRydWUiKQp9CgphbGxvd19ieV9jb250YWluZXJfdHlwZShpX2NyaV90eXBlLCBwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAxOiBpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgaV9jcmlfdHlwZSA9PSAic2FuZGJveCIKCiAgICBpX2thdGFfdHlwZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1siaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5jb250YWluZXJfdHlwZSJdCiAgICBwcmludCgiYWxsb3dfYnlfY29udGFpbmVyX3R5cGUgMTogaV9rYXRhX3R5cGUgPSIsIGlfa2F0YV90eXBlKQogICAgaV9rYXRhX3R5cGUgPT0gInBvZF9zYW5kYm94IgoKICAgIGFsbG93X3NhbmRib3hfY29udGFpbmVyX25hbWUocF9vY2ksIGlfb2NpKQogICAgYWxsb3dfc2FuZGJveF9uZXRfbmFtZXNwYWNlKHBfb2NpLCBpX29jaSkKICAgIGFsbG93X3NhbmRib3hfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpCgogICAgcHJpbnQoImFsbG93X2J5X2NvbnRhaW5lcl90eXBlIDE6IHRydWUiKQp9CgphbGxvd19ieV9jb250YWluZXJfdHlwZShpX2NyaV90eXBlLCBwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiBpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgaV9jcmlfdHlwZSA9PSAiY29udGFpbmVyIgoKICAgIGlfa2F0YV90eXBlIDo9IGlfb2NpLkFubm90YXRpb25zWyJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIl0KICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiBpX2thdGFfdHlwZSA9IiwgaV9rYXRhX3R5cGUpCiAgICBpX2thdGFfdHlwZSA9PSAicG9kX2NvbnRhaW5lciIKCiAgICBhbGxvd19jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpCiAgICBhbGxvd19uZXRfbmFtZXNwYWNlKHBfb2NpLCBpX29jaSkKICAgIGFsbG93X2xvZ19kaXJlY3RvcnkocF9vY2ksIGlfb2NpKQoKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiB0cnVlIikKfQoKIyAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLW5hbWUiIGFubm90YXRpb24KYWxsb3dfc2FuZGJveF9jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X2NvbnRhaW5lcl9uYW1lOiBzdGFydCIpCgogICAgY29udGFpbmVyX2Fubm90YXRpb25fbWlzc2luZyhwX29jaSwgaV9vY2ksICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItbmFtZSIpCgogICAgcHJpbnQoImFsbG93X3NhbmRib3hfY29udGFpbmVyX25hbWU6IHRydWUiKQp9CgphbGxvd19jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19jb250YWluZXJfbmFtZTogc3RhcnQiKQoKICAgIGFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uKHBfb2NpLCBpX29jaSwgImlvLmt1YmVybmV0ZXMuY3JpLmNvbnRhaW5lci1uYW1lIikKCiAgICBwcmludCgiYWxsb3dfY29udGFpbmVyX25hbWU6IHRydWUiKQp9Cgpjb250YWluZXJfYW5ub3RhdGlvbl9taXNzaW5nKHBfb2NpLCBpX29jaSwga2V5KSB7CiAgICBwcmludCgiY29udGFpbmVyX2Fubm90YXRpb25fbWlzc2luZzoiLCBrZXkpCgogICAgbm90IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIG5vdCBpX29jaS5Bbm5vdGF0aW9uc1trZXldCgogICAgcHJpbnQoImNvbnRhaW5lcl9hbm5vdGF0aW9uX21pc3Npbmc6IHRydWUiKQp9CgphbGxvd19jb250YWluZXJfYW5ub3RhdGlvbihwX29jaSwgaV9vY2ksIGtleSkgewogICAgcHJpbnQoImFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uOiBrZXkgPSIsIGtleSkKCiAgICBwX3ZhbHVlIDo9IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIGlfdmFsdWUgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgcHJpbnQoImFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uOiBwX3ZhbHVlID0iLCBwX3ZhbHVlLCAiaV92YWx1ZSA9IiwgaV92YWx1ZSkKCiAgICBwX3ZhbHVlID09IGlfdmFsdWUKCiAgICBwcmludCgiYWxsb3dfY29udGFpbmVyX2Fubm90YXRpb246IHRydWUiKQp9CgojICJuZXJkY3RsL25ldHdvcmstbmFtZXNwYWNlIiBhbm5vdGF0aW9uCmFsbG93X3NhbmRib3hfbmV0X25hbWVzcGFjZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X25ldF9uYW1lc3BhY2U6IHN0YXJ0IikKCiAgICBrZXkgOj0gIm5lcmRjdGwvbmV0d29yay1uYW1lc3BhY2UiCgogICAgcF9uYW1lc3BhY2UgOj0gcF9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgaV9uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgcHJpbnQoImFsbG93X3NhbmRib3hfbmV0X25hbWVzcGFjZTogcF9uYW1lc3BhY2UgPSIsIHBfbmFtZXNwYWNlLCAiaV9uYW1lc3BhY2UgPSIsIGlfbmFtZXNwYWNlKQoKICAgIHJlZ2V4Lm1hdGNoKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9uZXRfbmFtZXNwYWNlOiB0cnVlIikKfQoKYWxsb3dfbmV0X25hbWVzcGFjZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19uZXRfbmFtZXNwYWNlOiBzdGFydCIpCgogICAga2V5IDo9ICJuZXJkY3RsL25ldHdvcmstbmFtZXNwYWNlIgoKICAgIG5vdCBwX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICBub3QgaV9vY2kuQW5ub3RhdGlvbnNba2V5XQoKICAgIHByaW50KCJhbGxvd19uZXRfbmFtZXNwYWNlOiB0cnVlIikKfQoKIyAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1sb2ctZGlyZWN0b3J5IiBhbm5vdGF0aW9uCmFsbG93X3NhbmRib3hfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X2xvZ19kaXJlY3Rvcnk6IHN0YXJ0IikKCiAgICBrZXkgOj0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbG9nLWRpcmVjdG9yeSIKCiAgICBwX2RpciA6PSBwX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICByZWdleDEgOj0gcmVwbGFjZShwX2RpciwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHJlZ2V4MiA6PSByZXBsYWNlKHJlZ2V4MSwgIiQoc2FuZGJveC1uYW1lc3BhY2UpIiwgc19uYW1lc3BhY2UpCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiByZWdleDIgPSIsIHJlZ2V4MikKCiAgICBpX2RpciA6PSBpX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiBpX2RpciA9IiwgaV9kaXIpCgogICAgcmVnZXgubWF0Y2gocmVnZXgyLCBpX2RpcikKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiB0cnVlIikKfQoKYWxsb3dfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19sb2dfZGlyZWN0b3J5OiBzdGFydCIpCgogICAga2V5IDo9ICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWxvZy1kaXJlY3RvcnkiCgogICAgbm90IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIG5vdCBpX29jaS5Bbm5vdGF0aW9uc1trZXldCgogICAgcHJpbnQoImFsbG93X2xvZ19kaXJlY3Rvcnk6IHRydWUiKQp9CgphbGxvd19kZXZpY2VzKHBfZGV2aWNlcywgaV9kZXZpY2VzKSB7CiAgICBwcmludCgiYWxsb3dfZGV2aWNlczogc3RhcnQiKQogICAgZXZlcnkgaV9kZXZpY2UgaW4gaV9kZXZpY2VzIHsKICAgICAgICBwcmludCgiYWxsb3dfZGV2aWNlczogaV9kZXZpY2UgPSIsIGlfZGV2aWNlKQogICAgICAgIHNvbWUgcF9kZXZpY2UgaW4gcF9kZXZpY2VzCiAgICAgICAgcF9kZXZpY2UuY29udGFpbmVyX3BhdGggPT0gaV9kZXZpY2UuY29udGFpbmVyX3BhdGgKICAgIH0KICAgIHByaW50KCJhbGxvd19kZXZpY2VzOiB0cnVlIikKfQoKYWxsb3dfbGludXgoc3RhdGVfb3BzLCBwX29jaSwgaV9vY2kpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIHBfbmFtZXNwYWNlcyA6PSBwX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbGludXg6IHAgbmFtZXNwYWNlcyA9IiwgcF9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlcyA6PSBpX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbGludXg6IGkgbmFtZXNwYWNlcyA9IiwgaV9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlX3dpdGhvdXRfbmV0d29yayA6PSBbb2JqIHwgb2JqIDo9IGlfbmFtZXNwYWNlc1tfXTsgb2JqLlR5cGUgIT0gIm5ldHdvcmsiXQoKICAgIHByaW50KCJhbGxvd19saW51eDogaV9uYW1lc3BhY2Vfd2l0aG91dF9uZXR3b3JrID0iLCBpX25hbWVzcGFjZV93aXRob3V0X25ldHdvcmspCgogICAgcF9uYW1lc3BhY2VzID09IGlfbmFtZXNwYWNlX3dpdGhvdXRfbmV0d29yawoKICAgIGFsbG93X21hc2tlZF9wYXRocyhwX29jaSwgaV9vY2kpCiAgICBhbGxvd19yZWFkb25seV9wYXRocyhwX29jaSwgaV9vY2kpCiAgICBhbGxvd19saW51eF9kZXZpY2VzKHBfb2NpLkxpbnV4LkRldmljZXMsIGlfb2NpLkxpbnV4LkRldmljZXMpCiAgICBhbGxvd19saW51eF9zeXNjdGwocF9vY2kuTGludXgsIGlfb2NpLkxpbnV4KQogICAgcmV0IDo9IGFsbG93X25ldHdvcmtfbmFtZXNwYWNlX3N0YXJ0KHN0YXRlX29wcywgcF9vY2ksIGlfb2NpKQogICAgcmV0LmFsbG93ZWQKCiAgICBvcHMgOj0gcmV0Lm9wcwoKICAgIHByaW50KCJhbGxvd19saW51eDogdHJ1ZSIpCn0KCiMgUmV0cmlldmUgdGhlICJuZXR3b3JrIiBuYW1lc3BhY2UgZnJvbSB0aGUgaW5wdXQgZGF0YSBhbmQgcGFzcyBpdCBvbiBmb3IgdGhlCiMgbmV0d29yayBuYW1lc3BhY2UgcG9saWN5IGNoZWNrcy4KYWxsb3dfbmV0d29ya19uYW1lc3BhY2Vfc3RhcnQoc3RhdGVfb3BzLCBwX29jaSwgaV9vY2kpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIHByaW50KCJhbGxvd19uZXR3b3JrX25hbWVzcGFjZSBzdGFydDogc3RhcnQiKQoKICAgIHBfbmFtZXNwYWNlcyA6PSBwX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IHAgbmFtZXNwYWNlcyA9IiwgcF9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlcyA6PSBpX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IGkgbmFtZXNwYWNlcyA9IiwgaV9uYW1lc3BhY2VzKQoKICAgICMgUmV0dXJuIHBhdGggb2YgdGhlICJuZXR3b3JrIiBuYW1lc3BhY2UKICAgIG5ldHdvcmtfbnMgOj0gW29iaiB8IG9iaiA6PSBpX25hbWVzcGFjZXNbX107IG9iai5UeXBlID09ICJuZXR3b3JrIl0KCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IG5ldHdvcmtfbnMgPSIsIG5ldHdvcmtfbnMpCgogICAgcmV0IDo9IGFsbG93X25ldHdvcmtfbmFtZXNwYWNlKHN0YXRlX29wcywgbmV0d29ya19ucykKICAgIHJldC5hbGxvd2VkCgogICAgb3BzIDo9IHJldC5vcHMKfQoKIyBUaGlzIHJ1bGUgaXMgd2hlbiB0aGVyZSdzIG5vIG5ldHdvcmsgbmFtZXNwYWNlIGluIHRoZSBpbnB1dCBkYXRhLgphbGxvd19uZXR3b3JrX25hbWVzcGFjZShzdGF0ZV9vcHMsIG5ldHdvcmtfbnMpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIGNvdW50KG5ldHdvcmtfbnMpID09IDAKCiAgICBuZXR3b3JrX25zX3BhdGggPSAiIgoKICAgIGFkZF9uZXR3b3JrX25hbWVzcGFjZV90b19zdGF0ZSA6PSBzdGF0ZV9hbGxvd3MoIm5ldHdvcmtfbmFtZXNwYWNlIiwgbmV0d29ya19uc19wYXRoKQogICAgb3BzIDo9IGNvbmNhdF9vcF9pZl9ub3RfbnVsbChzdGF0ZV9vcHMsIGFkZF9uZXR3b3JrX25hbWVzcGFjZV90b19zdGF0ZSkKCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2UgMTogdHJ1ZSIpCn0KCiMgVGhpcyBydWxlIGlzIHdoZW4gdGhlcmUncyBleGFjdGx5IG9uZSBuZXR3b3JrIG5hbWVzcGFjZSBpbiB0aGUgaW5wdXQgZGF0YS4KYWxsb3dfbmV0d29ya19uYW1lc3BhY2Uoc3RhdGVfb3BzLCBuZXR3b3JrX25zKSA6PSB7Im9wcyI6IG9wcywgImFsbG93ZWQiOiB0cnVlfSB7CiAgICBjb3VudChuZXR3b3JrX25zKSA9PSAxCgogICAgYWRkX25ldHdvcmtfbmFtZXNwYWNlX3RvX3N0YXRlIDo9IHN0YXRlX2FsbG93cygibmV0d29ya19uYW1lc3BhY2UiLCBuZXR3b3JrX25zWzBdLlBhdGgpCiAgICBvcHMgOj0gY29uY2F0X29wX2lmX25vdF9udWxsKHN0YXRlX29wcywgYWRkX25ldHdvcmtfbmFtZXNwYWNlX3RvX3N0YXRlKQoKICAgIHByaW50KCJhbGxvd19uZXR3b3JrX25hbWVzcGFjZSAyOiB0cnVlIikKfQoKYWxsb3dfbWFza2VkX3BhdGhzKHBfb2NpLCBpX29jaSkgewogICAgcF9wYXRocyA6PSBwX29jaS5MaW51eC5NYXNrZWRQYXRocwogICAgcHJpbnQoImFsbG93X21hc2tlZF9wYXRocyAxOiBwX3BhdGhzID0iLCBwX3BhdGhzKQoKICAgIGlfcGF0aHMgOj0gaV9vY2kuTGludXguTWFza2VkUGF0aHMKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aHMgMTogaV9wYXRocyA9IiwgaV9wYXRocykKCiAgICBhbGxvd19tYXNrZWRfcGF0aHNfYXJyYXkocF9wYXRocywgaV9wYXRocykKCiAgICBwcmludCgiYWxsb3dfbWFza2VkX3BhdGhzIDE6IHRydWUiKQp9CmFsbG93X21hc2tlZF9wYXRocyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aHMgMjogc3RhcnQiKQoKICAgIG5vdCBwX29jaS5MaW51eC5NYXNrZWRQYXRocwogICAgbm90IGlfb2NpLkxpbnV4Lk1hc2tlZFBhdGhzCgogICAgcHJpbnQoImFsbG93X21hc2tlZF9wYXRocyAyOiB0cnVlIikKfQoKIyBBbGwgdGhlIHBvbGljeSBtYXNrZWQgcGF0aHMgbXVzdCBiZSBtYXNrZWQgaW4gdGhlIGlucHV0IGRhdGEgdG9vLgojIElucHV0IGlzIGFsbG93ZWQgdG8gaGF2ZSBtb3JlIG1hc2tlZCBwYXRocyB0aGFuIHRoZSBwb2xpY3kuCmFsbG93X21hc2tlZF9wYXRoc19hcnJheShwX2FycmF5LCBpX2FycmF5KSB7CiAgICBldmVyeSBwX2VsZW0gaW4gcF9hcnJheSB7CiAgICAgICAgYWxsb3dfbWFza2VkX3BhdGgocF9lbGVtLCBpX2FycmF5KQogICAgfQp9CgphbGxvd19tYXNrZWRfcGF0aChwX2VsZW0sIGlfYXJyYXkpIHsKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aDogcF9lbGVtID0iLCBwX2VsZW0pCgogICAgc29tZSBpX2VsZW0gaW4gaV9hcnJheQogICAgcF9lbGVtID09IGlfZWxlbQoKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aDogdHJ1ZSIpCn0KCmFsbG93X3JlYWRvbmx5X3BhdGhzKHBfb2NpLCBpX29jaSkgewogICAgcF9wYXRocyA6PSBwX29jaS5MaW51eC5SZWFkb25seVBhdGhzCiAgICBwcmludCgiYWxsb3dfcmVhZG9ubHlfcGF0aHMgMTogcF9wYXRocyA9IiwgcF9wYXRocykKCiAgICBpX3BhdGhzIDo9IGlfb2NpLkxpbnV4LlJlYWRvbmx5UGF0aHMKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAxOiBpX3BhdGhzID0iLCBpX3BhdGhzKQoKICAgIGFsbG93X3JlYWRvbmx5X3BhdGhzX2FycmF5KHBfcGF0aHMsIGlfcGF0aHMsIGlfb2NpLkxpbnV4Lk1hc2tlZFBhdGhzKQoKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAxOiB0cnVlIikKfQphbGxvd19yZWFkb25seV9wYXRocyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAyOiBzdGFydCIpCgogICAgbm90IHBfb2NpLkxpbnV4LlJlYWRvbmx5UGF0aHMKICAgIG5vdCBpX29jaS5MaW51eC5SZWFkb25seVBhdGhzCgogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGhzIDI6IHRydWUiKQp9CgojIEFsbCB0aGUgcG9saWN5IHJlYWRvbmx5IHBhdGhzIG11c3QgYmUgZWl0aGVyOgojIC0gUHJlc2VudCBpbiB0aGUgaW5wdXQgcmVhZG9ubHkgcGF0aHMsIG9yCiMgLSBQcmVzZW50IGluIHRoZSBpbnB1dCBtYXNrZWQgcGF0aHMuCiMgSW5wdXQgaXMgYWxsb3dlZCB0byBoYXZlIG1vcmUgcmVhZG9ubHkgcGF0aHMgdGhhbiB0aGUgcG9saWN5LgphbGxvd19yZWFkb25seV9wYXRoc19hcnJheShwX2FycmF5LCBpX2FycmF5LCBtYXNrZWRfcGF0aHMpIHsKICAgIGV2ZXJ5IHBfZWxlbSBpbiBwX2FycmF5IHsKICAgICAgICBhbGxvd19yZWFkb25seV9wYXRoKHBfZWxlbSwgaV9hcnJheSwgbWFza2VkX3BhdGhzKQogICAgfQp9CgphbGxvd19yZWFkb25seV9wYXRoKHBfZWxlbSwgaV9hcnJheSwgbWFza2VkX3BhdGhzKSB7CiAgICBwcmludCgiYWxsb3dfcmVhZG9ubHlfcGF0aCAxOiBwX2VsZW0gPSIsIHBfZWxlbSkKCiAgICBzb21lIGlfZWxlbSBpbiBpX2FycmF5CiAgICBwX2VsZW0gPT0gaV9lbGVtCgogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGggMTogdHJ1ZSIpCn0KYWxsb3dfcmVhZG9ubHlfcGF0aChwX2VsZW0sIGlfYXJyYXksIG1hc2tlZF9wYXRocykgewogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGggMjogcF9lbGVtID0iLCBwX2VsZW0pCgogICAgc29tZSBpX21hc2tlZCBpbiBtYXNrZWRfcGF0aHMKICAgIHBfZWxlbSA9PSBpX21hc2tlZAoKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRoIDI6IHRydWUiKQp9CgphbGxvd19saW51eF9kZXZpY2VzKHBfZGV2aWNlcywgaV9kZXZpY2VzKSB7CiAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogc3RhcnQiKQogICAgZXZlcnkgaV9kZXZpY2UgaW4gaV9kZXZpY2VzIHsKICAgICAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogaV9kZXZpY2UgPSIsIGlfZGV2aWNlKQogICAgICAgIHNvbWUgcF9kZXZpY2UgaW4gcF9kZXZpY2VzCiAgICAgICAgaV9kZXZpY2UuUGF0aCA9PSBwX2RldmljZS5QYXRoCiAgICB9CiAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogdHJ1ZSIpCn0KCmFsbG93X2xpbnV4X3N5c2N0bChwX2xpbnV4LCBpX2xpbnV4KSB7CiAgICBwcmludCgiYWxsb3dfbGludXhfc3lzY3RsIDE6IHN0YXJ0IikKICAgIG5vdCBpX2xpbnV4LlN5c2N0bAogICAgcHJpbnQoImFsbG93X2xpbnV4X3N5c2N0bCAxOiB0cnVlIikKfQoKYWxsb3dfbGludXhfc3lzY3RsKHBfbGludXgsIGlfbGludXgpIHsKICAgIHByaW50KCJhbGxvd19saW51eF9zeXNjdGwgMjogc3RhcnQiKQogICAgcF9zeXNjdGwgOj0gcF9saW51eC5TeXNjdGwKICAgIGlfc3lzY3RsIDo9IGlfbGludXguU3lzY3RsCiAgICBldmVyeSBpX25hbWUsIGlfdmFsIGluIGlfc3lzY3RsIHsKICAgICAgICBwcmludCgiYWxsb3dfbGludXhfc3lzY3RsIDI6IGlfbmFtZSA9IiwgaV9uYW1lLCAiaV92YWwgPSIsIGlfdmFsKQogICAgICAgIHBfc3lzY3RsW2lfbmFtZV0gPT0gaV92YWwKICAgIH0KICAgIHByaW50KCJhbGxvd19saW51eF9zeXNjdGwgMjogdHJ1ZSIpCn0KCiMgQ2hlY2sgdGhlIGNvbnNpc3RlbmN5IG9mIHRoZSBpbnB1dCAiaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5idW5kbGVfcGF0aCIKIyBhbmQgaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCIgdmFsdWVzIHdpdGggb3RoZXIgZmllbGRzLgphbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZChwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpIHsKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogc3RhcnQiKQoKICAgIGJ1bmRsZV9wYXRoIDo9IGlfb2NpLkFubm90YXRpb25zWyJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmJ1bmRsZV9wYXRoIl0KICAgIGJ1bmRsZV9pZCA6PSByZXBsYWNlKGJ1bmRsZV9wYXRoLCAiL3J1bi9jb250YWluZXJkL2lvLmNvbnRhaW5lcmQucnVudGltZS52Mi50YXNrL2s4cy5pby8iLCAiIikKCiAgICBidW5kbGVfaWRfZm9ybWF0IDo9IGNvbmNhdCgiIiwgWyJeIiwgQlVORExFX0lELCAiJCJdKQogICAgcmVnZXgubWF0Y2goYnVuZGxlX2lkX2Zvcm1hdCwgYnVuZGxlX2lkKQoKICAgIGtleSA6PSAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCIKCiAgICBwX3JlZ2V4IDo9IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIHNhbmRib3hfaWQgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQoKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogc2FuZGJveF9pZCA9Iiwgc2FuZGJveF9pZCwgInJlZ2V4ID0iLCBwX3JlZ2V4KQogICAgcmVnZXgubWF0Y2gocF9yZWdleCwgc2FuZGJveF9pZCkKCiAgICBhbGxvd19yb290X3BhdGgocF9vY2ksIGlfb2NpLCBidW5kbGVfaWQpCgogICAgZXZlcnkgaV9tb3VudCBpbiBpX29jaS5Nb3VudHMgewogICAgICAgIGFsbG93X21vdW50KHBfb2NpLCBpX21vdW50LCBpX3N0b3JhZ2VzLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpCiAgICB9CgogICAgYWxsb3dfc3RvcmFnZXMocF9zdG9yYWdlcywgaV9zdG9yYWdlcywgYnVuZGxlX2lkLCBzYW5kYm94X2lkKQoKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogdHJ1ZSIpCn0KCmFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHBfcHJvY2VzcyA9IiwgcF9wcm9jZXNzKQogICAgcHJpbnQoImFsbG93X3Byb2Nlc3NfY29tbW9uOiBpX3Byb2Nlc3MgPSAiLCBpX3Byb2Nlc3MpCiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHNfbmFtZSA9Iiwgc19uYW1lKQoKICAgIHBfcHJvY2Vzcy5Dd2QgPT0gaV9wcm9jZXNzLkN3ZAogICAgcF9wcm9jZXNzLk5vTmV3UHJpdmlsZWdlcyA9PSBpX3Byb2Nlc3MuTm9OZXdQcml2aWxlZ2VzCgogICAgYWxsb3dfdXNlcihwX3Byb2Nlc3MsIGlfcHJvY2VzcykKICAgIGFsbG93X2VudihwX3Byb2Nlc3MsIGlfcHJvY2Vzcywgc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHRydWUiKQp9CgojIENvbXBhcmUgdGhlIE9DSSBQcm9jZXNzIGZpZWxkIG9mIGEgcG9saWN5IGNvbnRhaW5lciB3aXRoIHRoZSBpbnB1dCBPQ0kgUHJvY2VzcyBmcm9tIGEgQ3JlYXRlQ29udGFpbmVyUmVxdWVzdAphbGxvd19wcm9jZXNzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfcHJvY2Vzczogc3RhcnQiKQoKICAgIGFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgYWxsb3dfY2FwcyhwX3Byb2Nlc3MuQ2FwYWJpbGl0aWVzLCBpX3Byb2Nlc3MuQ2FwYWJpbGl0aWVzKQogICAgcF9wcm9jZXNzLlRlcm1pbmFsID09IGlfcHJvY2Vzcy5UZXJtaW5hbAoKICAgIHByaW50KCJhbGxvd19wcm9jZXNzOiB0cnVlIikKfQoKIyBDb21wYXJlIHRoZSBPQ0kgUHJvY2VzcyBmaWVsZCBvZiBhIHBvbGljeSBjb250YWluZXIgd2l0aCB0aGUgaW5wdXQgcHJvY2VzcyBmaWVsZCBmcm9tIEV4ZWNQcm9jZXNzUmVxdWVzdAphbGxvd19pbnRlcmFjdGl2ZV9wcm9jZXNzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfaW50ZXJhY3RpdmVfcHJvY2Vzczogc3RhcnQiKQoKICAgIGFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgYWxsb3dfZXhlY19jYXBzKGlfcHJvY2Vzcy5DYXBhYmlsaXRpZXMpCgogICAgIyBUaGVzZSBhcmUgY29tbWFuZHMgZW5hYmxlZCB1c2luZyBFeGVjUHJvY2Vzc1JlcXVlc3QgY29tbWFuZHMgYW5kL29yIHJlZ2V4IGZyb20gdGhlIHNldHRpbmdzIGZpbGUuCiAgICAjIFRoZXkgY2FuIGJlIGV4ZWN1dGVkIGludGVyYWN0aXZlbHkgc28gYWxsb3cgdGhlbSB0byB1c2UgYW55IHZhbHVlIGZvciBpX3Byb2Nlc3MuVGVybWluYWwuCgogICAgcHJpbnQoImFsbG93X2ludGVyYWN0aXZlX3Byb2Nlc3M6IHRydWUiKQp9CgojIENvbXBhcmUgdGhlIE9DSSBQcm9jZXNzIGZpZWxkIG9mIGEgcG9saWN5IGNvbnRhaW5lciB3aXRoIHRoZSBpbnB1dCBwcm9jZXNzIGZpZWxkIGZyb20gRXhlY1Byb2Nlc3NSZXF1ZXN0CmFsbG93X3Byb2JlX3Byb2Nlc3MocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19wcm9iZV9wcm9jZXNzOiBzdGFydCIpCgogICAgYWxsb3dfcHJvY2Vzc19jb21tb24ocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpCiAgICBhbGxvd19leGVjX2NhcHMoaV9wcm9jZXNzLkNhcGFiaWxpdGllcykKICAgIHBfcHJvY2Vzcy5UZXJtaW5hbCA9PSBpX3Byb2Nlc3MuVGVybWluYWwKCiAgICBwcmludCgiYWxsb3dfcHJvYmVfcHJvY2VzczogdHJ1ZSIpCn0KCmFsbG93X3VzZXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MpIHsKICAgIHBfdXNlciA6PSBwX3Byb2Nlc3MuVXNlcgogICAgaV91c2VyIDo9IGlfcHJvY2Vzcy5Vc2VyCgogICAgcHJpbnQoImFsbG93X3VzZXI6IGlucHV0IHVpZCA9IiwgaV91c2VyLlVJRCwgInBvbGljeSB1aWQgPSIsIHBfdXNlci5VSUQpCiAgICBwX3VzZXIuVUlEID09IGlfdXNlci5VSUQKCiAgICAjIFRPRE86IHRyYWNrIGRvd24gdGhlIHJlYXNvbiBmb3IgcmVnaXN0cnkuazhzLmlvL3BhdXNlOjMuOSBiZWluZwogICAgIyAgICAgICBleGVjdXRlZCB3aXRoIGdpZCA9IDAgZGVzcGl0ZSBoYXZpbmcgIjY1NTM1OjY1NTM1IiBpbiBpdHMgY29udGFpbmVyIGltYWdlCiAgICAjICAgICAgIGNvbmZpZy4KICAgICNwcmludCgiYWxsb3dfdXNlcjogaW5wdXQgZ2lkID0iLCBpX3VzZXIuR0lELCAicG9saWN5IGdpZCA9IiwgcF91c2VyLkdJRCkKICAgICNwX3VzZXIuR0lEID09IGlfdXNlci5HSUQKCiAgICAjIFRPRE86IGNvbXBhcmUgdGhlIGFkZGl0aW9uYWxHaWRzIGZpZWxkIHRvbyBhZnRlciBjb21wdXRpbmcgaXRzIHZhbHVlCiAgICAjIGJhc2VkIG9uIC9ldGMvcGFzc3dkIGFuZCAvZXRjL2dyb3VwIGZyb20gdGhlIGNvbnRhaW5lciBpbWFnZS4KfQoKYWxsb3dfZGVwcmVjYXRlZF9hcmdzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZ3MgMTogbm8gYXJncyIpCgogICAgbm90IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJncwogICAgbm90IGlfcHJvY2Vzcy5BcmdzCgogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAxOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZ3MocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSkgewogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiBwb2xpY3kgYXJncyA9IiwgcF9wcm9jZXNzLkRlcHJlY2F0ZWRBcmdzKQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiBpbnB1dCBhcmdzID0iLCBpX3Byb2Nlc3MuQXJncykKCiAgICBjb3VudChwX3Byb2Nlc3MuRGVwcmVjYXRlZEFyZ3MpID09IGNvdW50KGlfcHJvY2Vzcy5BcmdzKQoKICAgIGV2ZXJ5IGksIGlfYXJnIGluIGlfcHJvY2Vzcy5BcmdzIHsKICAgICAgICBhbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpCiAgICB9CgogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDE6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgcF9hcmcyIDo9IHJlcGxhY2UocF9hcmcsICIkJCIsICIkIikKICAgIHBfYXJnMiA9PSBpX2FyZwoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAxOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDI6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgIyBUT0RPOiBjYW4gJChub2RlLW5hbWUpIGJlIGhhbmRsZWQgYmV0dGVyPwogICAgY29udGFpbnMocF9hcmcsICIkKG5vZGUtbmFtZSkiKQoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAyOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDM6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgcF9hcmcyIDo9IHJlcGxhY2UocF9hcmcsICIkJCIsICIkIikKICAgIHBfYXJnMyA6PSByZXBsYWNlKHBfYXJnMiwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAzOiBwX2FyZzMgPSIsIHBfYXJnMykKICAgIHBfYXJnMyA9PSBpX2FyZwoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAzOiB0cnVlIikKfQoKIyBPQ0kgcHJvY2Vzcy5FbnYgZmllbGQKYWxsb3dfZW52KHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfZW52OiBwIGVudiA9IiwgcF9wcm9jZXNzLkVudikKICAgIHByaW50KCJhbGxvd19lbnY6IGkgZW52ID0iLCBpX3Byb2Nlc3MuRW52KQoKICAgIGV2ZXJ5IGlfdmFyIGluIGlfcHJvY2Vzcy5FbnYgewogICAgICAgIHByaW50KCJhbGxvd19lbnY6IGlfdmFyID0iLCBpX3ZhcikKICAgICAgICBhbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgfQoKICAgIHByaW50KCJhbGxvd19lbnY6IHRydWUiKQp9CgojIEFsbG93IGlucHV0IGVudiB2YXJpYWJsZXMgdGhhdCBhcmUgcHJlc2VudCBpbiB0aGUgcG9saWN5IGRhdGEgdG9vLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHBfdmFyID09IGlfdmFyCiAgICBwcmludCgiYWxsb3dfdmFyIDE6IHRydWUiKQp9CgojIE1hdGNoIGlucHV0IHdpdGggb25lIG9mIHRoZSBwb2xpY3kgdmFyaWFibGVzLCBhZnRlciBzdWJzdGl0dXRpbmcgJChzYW5kYm94LW5hbWUpLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHByaW50KCJhbGxvd192YXIgMjogcF92YXIgPSIsIHBfdmFyKQoKICAgIHBfdmFyX3NwbGl0IDo9IHNwbGl0KHBfdmFyLCAiPSIpCiAgICBjb3VudChwX3Zhcl9zcGxpdCkgPT0gMgoKICAgIHBfdmFyX3NwbGl0WzFdID09ICIkKHNhbmRib3gtbmFtZSkiCgogICAgaV92YXJfc3BsaXQgOj0gc3BsaXQoaV92YXIsICI9IikKICAgIGNvdW50KGlfdmFyX3NwbGl0KSA9PSAyCgogICAgaV92YXJfc3BsaXRbMF0gPT0gcF92YXJfc3BsaXRbMF0KICAgIHJlZ2V4Lm1hdGNoKHNfbmFtZSwgaV92YXJfc3BsaXRbMV0pCgogICAgcHJpbnQoImFsbG93X3ZhciAyOiB0cnVlIikKfQoKIyBBbGxvdyBpbnB1dCBlbnYgdmFyaWFibGVzIHRoYXQgbWF0Y2ggd2l0aCBhIHJlcXVlc3RfZGVmYXVsdHMgcmVnZXguCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHNvbWUgcF9yZWdleDEgaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5DcmVhdGVDb250YWluZXJSZXF1ZXN0LmFsbG93X2Vudl9yZWdleAogICAgcF9yZWdleDIgOj0gcmVwbGFjZShwX3JlZ2V4MSwgIiQoaXB2NF9hKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcHY0X2EpCiAgICBwX3JlZ2V4MyA6PSByZXBsYWNlKHBfcmVnZXgyLCAiJChpcF9wKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcF9wKQogICAgcF9yZWdleDQgOj0gcmVwbGFjZShwX3JlZ2V4MywgIiQoc3ZjX25hbWUpIiwgcG9saWN5X2RhdGEuY29tbW9uLnN2Y19uYW1lKQogICAgcF9yZWdleDUgOj0gcmVwbGFjZShwX3JlZ2V4NCwgIiQoZG5zX2xhYmVsKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5kbnNfbGFiZWwpCgogICAgcHJpbnQoImFsbG93X3ZhciAzOiBwX3JlZ2V4NSA9IiwgcF9yZWdleDUpCiAgICByZWdleC5tYXRjaChwX3JlZ2V4NSwgaV92YXIpCgogICAgcHJpbnQoImFsbG93X3ZhciAzOiB0cnVlIikKfQoKIyBBbGxvdyBmaWVsZFJlZiAiZmllbGRQYXRoOiBzdGF0dXMucG9kSVAiIHZhbHVlcy4KYWxsb3dfdmFyKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBpX3Zhciwgc19uYW1lLCBzX25hbWVzcGFjZSkgewogICAgbmFtZV92YWx1ZSA6PSBzcGxpdChpX3ZhciwgIj0iKQogICAgY291bnQobmFtZV92YWx1ZSkgPT0gMgogICAgaXNfaXAobmFtZV92YWx1ZVsxXSkKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIGFsbG93X3BvZF9pcF92YXIobmFtZV92YWx1ZVswXSwgcF92YXIpCgogICAgcHJpbnQoImFsbG93X3ZhciA0OiB0cnVlIikKfQoKIyBBbGxvdyBjb21tb24gZmllbGRSZWYgdmFyaWFibGVzLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBuYW1lX3ZhbHVlIDo9IHNwbGl0KGlfdmFyLCAiPSIpCiAgICBjb3VudChuYW1lX3ZhbHVlKSA9PSAyCgogICAgc29tZSBwX3ZhciBpbiBwX3Byb2Nlc3MuRW52CiAgICBwX25hbWVfdmFsdWUgOj0gc3BsaXQocF92YXIsICI9IikKICAgIGNvdW50KHBfbmFtZV92YWx1ZSkgPT0gMgoKICAgIHBfbmFtZV92YWx1ZVswXSA9PSBuYW1lX3ZhbHVlWzBdCgogICAgIyBUT0RPOiBzaG91bGQgdGhlc2UgYmUgaGFuZGxlZCBpbiBhIGRpZmZlcmVudCB3YXk/CiAgICBhbHdheXNfYWxsb3dlZCA6PSBbIiQoaG9zdC1uYW1lKSIsICIkKG5vZGUtbmFtZSkiLCAiJChwb2QtdWlkKSJdCiAgICBzb21lIGFsbG93ZWQgaW4gYWx3YXlzX2FsbG93ZWQKICAgIGNvbnRhaW5zKHBfbmFtZV92YWx1ZVsxXSwgYWxsb3dlZCkKCiAgICBwcmludCgiYWxsb3dfdmFyIDU6IHRydWUiKQp9CgojIEFsbG93IGZpZWxkUmVmICJmaWVsZFBhdGg6IHN0YXR1cy5ob3N0SVAiIHZhbHVlcy4KYWxsb3dfdmFyKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBpX3Zhciwgc19uYW1lLCBzX25hbWVzcGFjZSkgewogICAgbmFtZV92YWx1ZSA6PSBzcGxpdChpX3ZhciwgIj0iKQogICAgY291bnQobmFtZV92YWx1ZSkgPT0gMgogICAgaXNfaXAobmFtZV92YWx1ZVsxXSkKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIGFsbG93X2hvc3RfaXBfdmFyKG5hbWVfdmFsdWVbMF0sIHBfdmFyKQoKICAgIHByaW50KCJhbGxvd192YXIgNjogdHJ1ZSIpCn0KCiMgQWxsb3cgcmVzb3VyY2VGaWVsZFJlZiB2YWx1ZXMgKGUuZy4sICJsaW1pdHMuY3B1IikuCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIG5hbWVfdmFsdWUgOj0gc3BsaXQoaV92YXIsICI9IikKICAgIGNvdW50KG5hbWVfdmFsdWUpID09IDIKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHBfbmFtZV92YWx1ZSA6PSBzcGxpdChwX3ZhciwgIj0iKQogICAgY291bnQocF9uYW1lX3ZhbHVlKSA9PSAyCgogICAgcF9uYW1lX3ZhbHVlWzBdID09IG5hbWVfdmFsdWVbMF0KCiAgICAjIGEgdmFyaWFibGUgd2Ugc2hvdWxkIGJlIHZhbGlkYXRpbmcgdXNpbmcgYSByZWdleCBmcm9tIHNldHRpbmdzCiAgICBwX25hbWVfdmFsdWVbMV0gPT0gIiQodmFsaWRhdGUtZnJvbS1zZXR0aW5ncykiCgogICAgcmVnZXhfdmFsIDo9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuQ3JlYXRlQ29udGFpbmVyUmVxdWVzdC5hbGxvd19lbnZfcmVnZXhfbWFwW25hbWVfdmFsdWVbMF1dCgogICAgcHJpbnQoImFsbG93X3ZhciA3OiB2YWwgPSIsIG5hbWVfdmFsdWVbMV0pCiAgICBwcmludCgiYWxsb3dfdmFyIDc6IHJlZ2V4X3ZhbCA9IiwgcmVnZXhfdmFsKQoKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4X3ZhbCwgbmFtZV92YWx1ZVsxXSkKCiAgICBwcmludCgiYWxsb3dfdmFyIDc6IHRydWUiKQp9CgojIE1hdGNoIGlucHV0IHdpdGggb25lIG9mIHRoZSBwb2xpY3kgdmFyaWFibGVzLCBhZnRlciBzdWJzdGl0dXRpbmcgJChzYW5kYm94LW5hbWVzcGFjZSkuCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHNvbWUgcF92YXIgaW4gcF9wcm9jZXNzLkVudgogICAgcF92YXIyIDo9IHJlcGxhY2UocF92YXIsICIkKHNhbmRib3gtbmFtZXNwYWNlKSIsIHNfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd192YXIgODogcF92YXIyID0iLCBwX3ZhcjIpCiAgICBwX3ZhcjIgPT0gaV92YXIKCiAgICBwcmludCgiYWxsb3dfdmFyIDg6IHRydWUiKQp9CgphbGxvd19wb2RfaXBfdmFyKHZhcl9uYW1lLCBwX3ZhcikgewogICAgcHJpbnQoImFsbG93X3BvZF9pcF92YXI6IHZhcl9uYW1lID0iLCB2YXJfbmFtZSwgInBfdmFyID0iLCBwX3ZhcikKCiAgICBwX25hbWVfdmFsdWUgOj0gc3BsaXQocF92YXIsICI9IikKICAgIGNvdW50KHBfbmFtZV92YWx1ZSkgPT0gMgoKICAgIHBfbmFtZV92YWx1ZVswXSA9PSB2YXJfbmFtZQogICAgcF9uYW1lX3ZhbHVlWzFdID09ICIkKHBvZC1pcCkiCgogICAgcHJpbnQoImFsbG93X3BvZF9pcF92YXI6IHRydWUiKQp9CgphbGxvd19ob3N0X2lwX3Zhcih2YXJfbmFtZSwgcF92YXIpIHsKICAgIHByaW50KCJhbGxvd19ob3N0X2lwX3ZhcjogdmFyX25hbWUgPSIsIHZhcl9uYW1lLCAicF92YXIgPSIsIHBfdmFyKQoKICAgIHBfbmFtZV92YWx1ZSA6PSBzcGxpdChwX3ZhciwgIj0iKQogICAgY291bnQocF9uYW1lX3ZhbHVlKSA9PSAyCgogICAgcF9uYW1lX3ZhbHVlWzBdID09IHZhcl9uYW1lCiAgICBwX25hbWVfdmFsdWVbMV0gPT0gIiQoaG9zdC1pcCkiCgogICAgcHJpbnQoImFsbG93X2hvc3RfaXBfdmFyOiB0cnVlIikKfQoKaXNfaXAodmFsdWUpIHsKICAgIGJ5dGVzID0gc3BsaXQodmFsdWUsICIuIikKICAgIGNvdW50KGJ5dGVzKSA9PSA0CgogICAgaXNfaXBfZmlyc3RfYnl0ZShieXRlc1swXSkKICAgIGlzX2lwX290aGVyX2J5dGUoYnl0ZXNbMV0pCiAgICBpc19pcF9vdGhlcl9ieXRlKGJ5dGVzWzJdKQogICAgaXNfaXBfb3RoZXJfYnl0ZShieXRlc1szXSkKfQppc19pcF9maXJzdF9ieXRlKGNvbXBvbmVudCkgewogICAgbnVtYmVyID0gdG9fbnVtYmVyKGNvbXBvbmVudCkKICAgIG51bWJlciA+PSAxCiAgICBudW1iZXIgPD0gMjU1Cn0KaXNfaXBfb3RoZXJfYnl0ZShjb21wb25lbnQpIHsKICAgIG51bWJlciA9IHRvX251bWJlcihjb21wb25lbnQpCiAgICBudW1iZXIgPj0gMAogICAgbnVtYmVyIDw9IDI1NQp9CgojIE9DSSByb290LlBhdGgKYWxsb3dfcm9vdF9wYXRoKHBfb2NpLCBpX29jaSwgYnVuZGxlX2lkKSB7CiAgICBpX3BhdGggOj0gaV9vY2kuUm9vdC5QYXRoCiAgICBwX3BhdGgxIDo9IHBfb2NpLlJvb3QuUGF0aAogICAgcHJpbnQoImFsbG93X3Jvb3RfcGF0aDogaV9wYXRoID0iLCBpX3BhdGgsICJwX3BhdGgxID0iLCBwX3BhdGgxKQoKICAgIHBfcGF0aDIgOj0gcmVwbGFjZShwX3BhdGgxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfcm9vdF9wYXRoOiBwX3BhdGgyID0iLCBwX3BhdGgyKQoKICAgIHBfcGF0aDMgOj0gcmVwbGFjZShwX3BhdGgyLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X3Jvb3RfcGF0aDogcF9wYXRoMyA9IiwgcF9wYXRoMykKCiAgICBwX3BhdGgzID09IGlfcGF0aAoKICAgIHByaW50KCJhbGxvd19yb290X3BhdGg6IHRydWUiKQp9CgojIGRldmljZSBtb3VudHMKYWxsb3dfbW91bnQocF9vY2ksIGlfbW91bnQsIGlfc3RvcmFnZXMsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcHJpbnQoImFsbG93X21vdW50OiBpX21vdW50ID0iLCBpX21vdW50KQoKICAgIHNvbWUgcF9tb3VudCBpbiBwX29jaS5Nb3VudHMKICAgIHNvbWUgaV9zdG9yYWdlIGluIGlfc3RvcmFnZXMKCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IHBfbW91bnQgPSIsIHBfbW91bnQpCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IGlfc3RvcmFnZSA9IiwgaV9zdG9yYWdlKQoKICAgIGNoZWNrX21vdW50KHBfbW91bnQsIGlfbW91bnQsIGlfc3RvcmFnZSwgYnVuZGxlX2lkLCBzYW5kYm94X2lkKQoKICAgICMgVE9ETzogYXJlIHRoZXJlIGFueSBvdGhlciByZXF1aXJlZCBwb2xpY3kgY2hlY2tzIGZvciBtb3VudHMgLSBlLmcuLAogICAgIyAgICAgICBtdWx0aXBsZSBtb3VudHMgd2l0aCBzYW1lIHNvdXJjZSBvciBkZXN0aW5hdGlvbj8KCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IHRydWUiKQp9CgpjaGVja19tb3VudChwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcF9tb3VudCA9PSBpX21vdW50CiAgICBwcmludCgiY2hlY2tfbW91bnQgMTogdHJ1ZSIpCn0KY2hlY2tfbW91bnQocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHBfbW91bnQuZGVzdGluYXRpb24gPT0gaV9tb3VudC5kZXN0aW5hdGlvbgogICAgcF9tb3VudC50eXBlXyA9PSBpX21vdW50LnR5cGVfCiAgICBwX21vdW50Lm9wdGlvbnMgPT0gaV9tb3VudC5vcHRpb25zCgogICAgbW91bnRfc291cmNlX2FsbG93cyhwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkKCiAgICBwcmludCgiY2hlY2tfbW91bnQgMjogdHJ1ZSIpCn0KCm1vdW50X3NvdXJjZV9hbGxvd3MocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHJlZ2V4MSA6PSBwX21vdW50LnNvdXJjZQogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5tb3VudF9zb3VyY2VfY3BhdGgpCiAgICByZWdleDQgOj0gcmVwbGFjZShyZWdleDMsICIkKGJ1bmRsZS1pZCkiLCBidW5kbGVfaWQpCgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMTogcmVnZXg0ID0iLCByZWdleDQpCiAgICByZWdleC5tYXRjaChyZWdleDQsIGlfbW91bnQuc291cmNlKQoKICAgIHByaW50KCJtb3VudF9zb3VyY2VfYWxsb3dzIDE6IHRydWUiKQp9Cm1vdW50X3NvdXJjZV9hbGxvd3MocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHJlZ2V4MSA6PSBwX21vdW50LnNvdXJjZQogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5tb3VudF9zb3VyY2VfY3BhdGgpCiAgICByZWdleDQgOj0gcmVwbGFjZShyZWdleDMsICIkKHNhbmRib3gtaWQpIiwgc2FuZGJveF9pZCkKCiAgICBwcmludCgibW91bnRfc291cmNlX2FsbG93cyAyOiByZWdleDQgPSIsIHJlZ2V4NCkKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4NCwgaV9tb3VudC5zb3VyY2UpCgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMjogdHJ1ZSIpCn0KbW91bnRfc291cmNlX2FsbG93cyhwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogaV9tb3VudC5zb3VyY2UgPSIsIGlfbW91bnQuc291cmNlKQogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogaV9zdG9yYWdlLm1vdW50X3BvaW50ID0iLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCgogICAgaV9tb3VudC5zb3VyY2UgPT0gaV9zdG9yYWdlLm1vdW50X3BvaW50CgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogdHJ1ZSIpCn0KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBDcmVhdGUgY29udGFpbmVyIFN0b3JhZ2VzCgphbGxvd19zdG9yYWdlcyhwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHBfY291bnQgOj0gY291bnQocF9zdG9yYWdlcykKICAgIGlfY291bnQgOj0gY291bnQoaV9zdG9yYWdlcykKICAgIHByaW50KCJhbGxvd19zdG9yYWdlczogcF9jb3VudCA9IiwgcF9jb3VudCwgImlfY291bnQgPSIsIGlfY291bnQpCgogICAgcF9jb3VudCA9PSBpX2NvdW50CgogICAgIyBHZXQgdGhlIGNvbnRhaW5lciBpbWFnZSBsYXllciBJRHMgYW5kIHZlcml0eSByb290IGhhc2hlcywgZnJvbSB0aGUgIm92ZXJsYXlmcyIgc3RvcmFnZS4KICAgIHNvbWUgb3ZlcmxheV9zdG9yYWdlIGluIHBfc3RvcmFnZXMKICAgIG92ZXJsYXlfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIHByaW50KCJhbGxvd19zdG9yYWdlczogb3ZlcmxheV9zdG9yYWdlID0iLCBvdmVybGF5X3N0b3JhZ2UpCiAgICBjb3VudChvdmVybGF5X3N0b3JhZ2Uub3B0aW9ucykgPT0gMgoKICAgIGxheWVyX2lkcyA6PSBzcGxpdChvdmVybGF5X3N0b3JhZ2Uub3B0aW9uc1swXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiBsYXllcl9pZHMgPSIsIGxheWVyX2lkcykKCiAgICByb290X2hhc2hlcyA6PSBzcGxpdChvdmVybGF5X3N0b3JhZ2Uub3B0aW9uc1sxXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiByb290X2hhc2hlcyA9Iiwgcm9vdF9oYXNoZXMpCgogICAgZXZlcnkgaV9zdG9yYWdlIGluIGlfc3RvcmFnZXMgewogICAgICAgIGFsbG93X3N0b3JhZ2UocF9zdG9yYWdlcywgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpCiAgICB9CgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiB0cnVlIikKfQoKYWxsb3dfc3RvcmFnZShwX3N0b3JhZ2VzLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgc29tZSBwX3N0b3JhZ2UgaW4gcF9zdG9yYWdlcwoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiBwX3N0b3JhZ2UgPSIsIHBfc3RvcmFnZSkKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiBpX3N0b3JhZ2UgPSIsIGlfc3RvcmFnZSkKCiAgICBwX3N0b3JhZ2UuZHJpdmVyICAgICAgICAgICA9PSBpX3N0b3JhZ2UuZHJpdmVyCiAgICBwX3N0b3JhZ2UuZHJpdmVyX29wdGlvbnMgICA9PSBpX3N0b3JhZ2UuZHJpdmVyX29wdGlvbnMKICAgIHBfc3RvcmFnZS5mc19ncm91cCAgICAgICAgID09IGlfc3RvcmFnZS5mc19ncm91cAogICAgcF9zdG9yYWdlLmZzdHlwZSAgICAgICAgICAgPT0gaV9zdG9yYWdlLmZzdHlwZQoKICAgIGFsbG93X3N0b3JhZ2Vfc291cmNlKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKQogICAgYWxsb3dfc3RvcmFnZV9vcHRpb25zKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKQogICAgYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKQoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiB0cnVlIikKfQoKYWxsb3dfc3RvcmFnZV9zb3VyY2UocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX3NvdXJjZSAxOiBzdGFydCIpCgogICAgcF9zdG9yYWdlLnNvdXJjZSA9PSBpX3N0b3JhZ2Uuc291cmNlCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDE6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX3NvdXJjZShwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDI6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCgogICAgIyBEREREOkJCOkRELkY6IERvbWFpbjpCdXM6RGV2aWNlLkZ1bmN0aW9uCiAgICAjIGh0dHBzOi8vd3d3Lmtlcm5lbC5vcmcvZG9jL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtYnVzLXBjaQogICAgcmVnZXgubWF0Y2goYF5bYS1mMC05XXs0fTpbYS1mMC05XXsyfTpbYS1mMC05XXsyfVwuW2EtZjAtOV0kYCwgaV9zdG9yYWdlLnNvdXJjZSkKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9zb3VyY2UgMjogdHJ1ZSIpCn0KCmFsbG93X3N0b3JhZ2Vfc291cmNlKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKSB7CiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9zb3VyY2UgMzogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIGlfc3RvcmFnZS5zb3VyY2UgPT0gIm5vbmUiCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDM6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX3NvdXJjZShwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDQ6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJzbWIiCgogICAgIyBQYXR0ZXJuOiAvLzxzdG9yYWdlLWFjY291bnQtbmFtZT4uZmlsZS5jb3JlLndpbmRvd3MubmV0LzxrOHMtUFZDLW5hbWU+CiAgICAjIFN0b3JhZ2UgYWNjb3VudCBuYW1lOiBodHRwczovL2xlYXJuLm1pY3Jvc29mdC5jb20vZW4tdXMvYXp1cmUvc3RvcmFnZS9jb21tb24vc3RvcmFnZS1hY2NvdW50LW92ZXJ2aWV3I3N0b3JhZ2UtYWNjb3VudC1uYW1lCiAgICAjIEs4cyBQVkMgbmFtZTogaHR0cHM6Ly9rdWJlcm5ldGVzLmlvL2RvY3MvY29uY2VwdHMvb3ZlcnZpZXcvd29ya2luZy13aXRoLW9iamVjdHMvbmFtZXMvI2Rucy1zdWJkb21haW4tbmFtZXMKICAgIHJlZ2V4Lm1hdGNoKGBeXC9cLyhbYS16MC05XXszLDI0fSlcLmZpbGVcLmNvcmVcLndpbmRvd3NcLm5ldFwvW2EtejAtOV0oW2EtejAtOS4tXXswLDI1MX1bYS16MC05XSk/JGAsIGlfc3RvcmFnZS5zb3VyY2UpCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDQ6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMTogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgIT0gIm92ZXJsYXlmcyIKICAgIHBfc3RvcmFnZS5vcHRpb25zID09IGlfc3RvcmFnZS5vcHRpb25zCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAxOiB0cnVlIikKfQphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIGNvdW50KHBfc3RvcmFnZS5vcHRpb25zKSA9PSAyCgogICAgcG9saWN5X2lkcyA6PSBzcGxpdChwX3N0b3JhZ2Uub3B0aW9uc1swXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBwb2xpY3lfaWRzID0iLCBwb2xpY3lfaWRzKQogICAgcG9saWN5X2lkcyA9PSBsYXllcl9pZHMKCiAgICBwb2xpY3lfaGFzaGVzIDo9IHNwbGl0KHBfc3RvcmFnZS5vcHRpb25zWzFdLCAiOiIpCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IHBvbGljeV9oYXNoZXMgPSIsIHBvbGljeV9oYXNoZXMpCgogICAgcF9jb3VudCA6PSBjb3VudChwb2xpY3lfaWRzKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBwX2NvdW50ID0iLCBwX2NvdW50KQogICAgcF9jb3VudCA+PSAxCiAgICBwX2NvdW50ID09IGNvdW50KHBvbGljeV9oYXNoZXMpCgogICAgaV9jb3VudCA6PSBjb3VudChpX3N0b3JhZ2Uub3B0aW9ucykKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogaV9jb3VudCA9IiwgaV9jb3VudCkKICAgIGlfY291bnQgPT0gcF9jb3VudCArIDMKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zWzBdID0iLCBpX3N0b3JhZ2Uub3B0aW9uc1swXSkKICAgIGlfc3RvcmFnZS5vcHRpb25zWzBdID09ICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQubGF5ZXItc3JjLXByZWZpeD0vdmFyL2xpYi9jb250YWluZXJkL2lvLmNvbnRhaW5lcmQuc25hcHNob3R0ZXIudjEudGFyZGV2L2xheWVycyIKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zW2lfY291bnQgLSAyXSA9IiwgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDJdKQogICAgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDJdID09ICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQub3ZlcmxheS1ydyIKCiAgICBsb3dlcmRpciA6PSBjb25jYXQoIj0iLCBbImxvd2VyZGlyIiwgcF9zdG9yYWdlLm9wdGlvbnNbMF1dKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBsb3dlcmRpciA9IiwgbG93ZXJkaXIpCgogICAgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDFdID09IGxvd2VyZGlyCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zW2lfY291bnQgLSAxXSA9IiwgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDFdKQoKICAgIGV2ZXJ5IGksIHBvbGljeV9pZCBpbiBwb2xpY3lfaWRzIHsKICAgICAgICBhbGxvd19vdmVybGF5X2xheWVyKHBvbGljeV9pZCwgcG9saWN5X2hhc2hlc1tpXSwgaV9zdG9yYWdlLm9wdGlvbnNbaSArIDFdKQogICAgfQoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogdHJ1ZSIpCn0KYWxsb3dfc3RvcmFnZV9vcHRpb25zKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKSB7CiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDM6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCiAgICBjb3VudChwX3N0b3JhZ2Uub3B0aW9ucykgPT0gMQoKICAgIHN0YXJ0c3dpdGgocF9zdG9yYWdlLm9wdGlvbnNbMF0sICIkKGhhc2giKQogICAgaGFzaF9zdWZmaXggOj0gdHJpbV9sZWZ0KHBfc3RvcmFnZS5vcHRpb25zWzBdLCAiJChoYXNoIikKCiAgICBlbmRzd2l0aChoYXNoX3N1ZmZpeCwgIikiKQogICAgaGFzaF9pbmRleCA6PSB0cmltX3JpZ2h0KGhhc2hfc3VmZml4LCAiKSIpCiAgICBpIDo9IHRvX251bWJlcihoYXNoX2luZGV4KQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAzOiBpID0iLCBpKQoKICAgIGhhc2hfb3B0aW9uIDo9IGNvbmNhdCgiPSIsIFsiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LnJvb3QtaGFzaCIsIHJvb3RfaGFzaGVzW2ldXSkKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMzogaGFzaF9vcHRpb24gPSIsIGhhc2hfb3B0aW9uKQoKICAgIGNvdW50KGlfc3RvcmFnZS5vcHRpb25zKSA9PSA0CiAgICBpX3N0b3JhZ2Uub3B0aW9uc1swXSA9PSAicm8iCiAgICBpX3N0b3JhZ2Uub3B0aW9uc1sxXSA9PSAiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmJsb2NrX2RldmljZT1maWxlIgogICAgaV9zdG9yYWdlLm9wdGlvbnNbMl0gPT0gImlvLmthdGFjb250YWluZXJzLmZzLW9wdC5pcy1sYXllciIKICAgIGlfc3RvcmFnZS5vcHRpb25zWzNdID09IGhhc2hfb3B0aW9uCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAzOiB0cnVlIikKfQphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgNDogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gInNtYiIKICAgIHBfb3B0c19jb3VudCA6PSBjb3VudChwX3N0b3JhZ2Uub3B0aW9ucykKICAgIGlfb3B0c19jb3VudCA6PSBjb3VudChpX3N0b3JhZ2Uub3B0aW9ucykKICAgIGlfb3B0c19jb3VudCA9PSBwX29wdHNfY291bnQgKyAyCgogICAgaV9vcHRfbWF0Y2hlcyA6PSBbaSB8IGkgOj0gaWR4OyBpZHggPCBwX29wdHNfY291bnQ7IHBfc3RvcmFnZS5vcHRpb25zW2lkeF0gPT0gaV9zdG9yYWdlLm9wdGlvbnNbaWR4XV0KICAgIGNvdW50KGlfb3B0X21hdGNoZXMpID09IHBfb3B0c19jb3VudAoKICAgIHN0YXJ0c3dpdGgoaV9zdG9yYWdlLm9wdGlvbnNbaV9vcHRzX2NvdW50LTJdLCAiYWRkcj0iKQogICAgY3JlZHMgPSBzcGxpdChpX3N0b3JhZ2Uub3B0aW9uc1tpX29wdHNfY291bnQtMV0sICIsIikKICAgIGNvdW50KGNyZWRzKSA9PSAyCiAgICBzdGFydHN3aXRoKGNyZWRzWzBdLCAidXNlcm5hbWU9IikKICAgIHN0YXJ0c3dpdGgoY3JlZHNbMV0sICJwYXNzd29yZD0iKQogICAgCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDQ6IHRydWUiKQp9CgphbGxvd19vdmVybGF5X2xheWVyKHBvbGljeV9pZCwgcG9saWN5X2hhc2gsIGlfb3B0aW9uKSB7CiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogcG9saWN5X2lkID0iLCBwb2xpY3lfaWQsICJwb2xpY3lfaGFzaCA9IiwgcG9saWN5X2hhc2gpCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogaV9vcHRpb24gPSIsIGlfb3B0aW9uKQoKICAgIHN0YXJ0c3dpdGgoaV9vcHRpb24sICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQubGF5ZXI9IikKICAgIGlfdmFsdWUgOj0gcmVwbGFjZShpX29wdGlvbiwgImlvLmthdGFjb250YWluZXJzLmZzLW9wdC5sYXllcj0iLCAiIikKICAgIGlfdmFsdWVfZGVjb2RlZCA6PSBiYXNlNjQuZGVjb2RlKGlfdmFsdWUpCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogaV92YWx1ZV9kZWNvZGVkID0iLCBpX3ZhbHVlX2RlY29kZWQpCgogICAgcG9saWN5X3N1ZmZpeCA6PSBjb25jYXQoIj0iLCBbInRhcixybyxpby5rYXRhY29udGFpbmVycy5mcy1vcHQuYmxvY2tfZGV2aWNlPWZpbGUsaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmlzLWxheWVyLGlvLmthdGFjb250YWluZXJzLmZzLW9wdC5yb290LWhhc2giLCBwb2xpY3lfaGFzaF0pCiAgICBwX3ZhbHVlIDo9IGNvbmNhdCgiLCIsIFtwb2xpY3lfaWQsIHBvbGljeV9zdWZmaXhdKQogICAgcHJpbnQoImFsbG93X292ZXJsYXlfbGF5ZXI6IHBfdmFsdWUgPSIsIHBfdmFsdWUpCgogICAgcF92YWx1ZSA9PSBpX3ZhbHVlX2RlY29kZWQKCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogdHJ1ZSIpCn0KCmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAidGFyIgoKICAgIHN0YXJ0c3dpdGgocF9zdG9yYWdlLm1vdW50X3BvaW50LCAiJChsYXllciIpCiAgICBtb3VudF9zdWZmaXggOj0gdHJpbV9sZWZ0KHBfc3RvcmFnZS5tb3VudF9wb2ludCwgIiQobGF5ZXIiKQoKICAgIGVuZHN3aXRoKG1vdW50X3N1ZmZpeCwgIikiKQogICAgbGF5ZXJfaW5kZXggOj0gdHJpbV9yaWdodChtb3VudF9zdWZmaXgsICIpIikKICAgIGkgOj0gdG9fbnVtYmVyKGxheWVyX2luZGV4KQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDE6IGkgPSIsIGkpCgogICAgbGF5ZXJfaWQgOj0gbGF5ZXJfaWRzW2ldCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMTogbGF5ZXJfaWQgPSIsIGxheWVyX2lkKQoKICAgIHBfbW91bnQgOj0gY29uY2F0KCIvIiwgWyIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L2xheWVycyIsIGxheWVyX2lkXSkKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCAxOiBwX21vdW50ID0iLCBwX21vdW50KQoKICAgIHBfbW91bnQgPT0gaV9zdG9yYWdlLm1vdW50X3BvaW50CgogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDE6IHRydWUiKQp9CmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAiZnVzZTMua2F0YS1vdmVybGF5IgoKICAgIG1vdW50MSA6PSByZXBsYWNlKHBfc3RvcmFnZS5tb3VudF9wb2ludCwgIiQoY3BhdGgpIiwgcG9saWN5X2RhdGEuY29tbW9uLmNwYXRoKQogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDI6IG1vdW50MiA9IiwgbW91bnQyKQoKICAgIG1vdW50MiA9PSBpX3N0b3JhZ2UubW91bnRfcG9pbnQKCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMjogdHJ1ZSIpCn0KYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKSB7CiAgICBwX3N0b3JhZ2UuZnN0eXBlID09ICJsb2NhbCIKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQyID0iLCBtb3VudDIpCgogICAgbW91bnQzIDo9IHJlcGxhY2UobW91bnQyLCAiJChzYW5kYm94LWlkKSIsIHNhbmRib3hfaWQpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQzID0iLCBtb3VudDMpCgogICAgcmVnZXgubWF0Y2gobW91bnQzLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCgogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDM6IHRydWUiKQp9CmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAiYmluZCIKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNDogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNDogbW91bnQyID0iLCBtb3VudDIpCgogICAgbW91bnQzIDo9IHJlcGxhY2UobW91bnQyLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDQ6IG1vdW50MyA9IiwgbW91bnQzKQoKICAgIHJlZ2V4Lm1hdGNoKG1vdW50MywgaV9zdG9yYWdlLm1vdW50X3BvaW50KQoKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA0OiB0cnVlIikKfQphbGxvd19tb3VudF9wb2ludChwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgYnVuZGxlX2lkLCBzYW5kYm94X2lkLCBsYXllcl9pZHMpIHsKICAgIHBfc3RvcmFnZS5mc3R5cGUgPT0gInRtcGZzIgoKICAgIG1vdW50MSA6PSBwX3N0b3JhZ2UubW91bnRfcG9pbnQKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA1OiBtb3VudDEgPSIsIG1vdW50MSkKCiAgICByZWdleC5tYXRjaChtb3VudDEsIGlfc3RvcmFnZS5tb3VudF9wb2ludCkKCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNTogdHJ1ZSIpCn0KYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKSB7CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogaV9zdG9yYWdlLm1vdW50X3BvaW50ID0iLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCiAgICBhbGxvd19kaXJlY3Rfdm9sX2RyaXZlcihwX3N0b3JhZ2UsIGlfc3RvcmFnZSkKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChzcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQyID0iLCBtb3VudDIpCgogICAgZGlyZWN0X3ZvbF9wYXRoIDo9IGlfc3RvcmFnZS5zb3VyY2UKICAgIG1vdW50MyA6PSByZXBsYWNlKG1vdW50MiwgIiQoYjY0LWRpcmVjdC12b2wtcGF0aCkiLCBiYXNlNjR1cmwuZW5jb2RlKGRpcmVjdF92b2xfcGF0aCkpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQzID0iLCBtb3VudDMpCgogICAgbW91bnQzID09IGlfc3RvcmFnZS5tb3VudF9wb2ludAoKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA2OiB0cnVlIikKfQoKYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIocF9zdG9yYWdlLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19kaXJlY3Rfdm9sX2RyaXZlciAxOiBzdGFydCIpCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCiAgICBwcmludCgiYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIgMTogdHJ1ZSIpCn0KYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIocF9zdG9yYWdlLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19kaXJlY3Rfdm9sX2RyaXZlciAyOiBzdGFydCIpCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJzbWIiCiAgICBwcmludCgiYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIgMjogdHJ1ZSIpCn0KCiMgRXhlY1Byb2Nlc3NSZXF1ZXN0LnByb2Nlc3MuQ2FwYWJpbGl0aWVzCmFsbG93X2V4ZWNfY2FwcyhpX2NhcHMpIHsKICAgIG5vdCBpX2NhcHMuQW1iaWVudAogICAgbm90IGlfY2Fwcy5Cb3VuZGluZwogICAgbm90IGlfY2Fwcy5FZmZlY3RpdmUKICAgIG5vdCBpX2NhcHMuSW5oZXJpdGFibGUKICAgIG5vdCBpX2NhcHMuUGVybWl0dGVkCn0KCiMgT0NJLlByb2Nlc3MuQ2FwYWJpbGl0aWVzCmFsbG93X2NhcHMocF9jYXBzLCBpX2NhcHMpIHsKICAgIHByaW50KCJhbGxvd19jYXBzOiBwb2xpY3kgQW1iaWVudCA9IiwgcF9jYXBzLkFtYmllbnQpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgQW1iaWVudCA9IiwgaV9jYXBzLkFtYmllbnQpCiAgICBtYXRjaF9jYXBzKHBfY2Fwcy5BbWJpZW50LCBpX2NhcHMuQW1iaWVudCkKCiAgICBwcmludCgiYWxsb3dfY2FwczogcG9saWN5IEJvdW5kaW5nID0iLCBwX2NhcHMuQm91bmRpbmcpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgQm91bmRpbmcgPSIsIGlfY2Fwcy5Cb3VuZGluZykKICAgIG1hdGNoX2NhcHMocF9jYXBzLkJvdW5kaW5nLCBpX2NhcHMuQm91bmRpbmcpCgogICAgcHJpbnQoImFsbG93X2NhcHM6IHBvbGljeSBFZmZlY3RpdmUgPSIsIHBfY2Fwcy5FZmZlY3RpdmUpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgRWZmZWN0aXZlID0iLCBpX2NhcHMuRWZmZWN0aXZlKQogICAgbWF0Y2hfY2FwcyhwX2NhcHMuRWZmZWN0aXZlLCBpX2NhcHMuRWZmZWN0aXZlKQoKICAgIHByaW50KCJhbGxvd19jYXBzOiBwb2xpY3kgSW5oZXJpdGFibGUgPSIsIHBfY2Fwcy5Jbmhlcml0YWJsZSkKICAgIHByaW50KCJhbGxvd19jYXBzOiBpbnB1dCBJbmhlcml0YWJsZSA9IiwgaV9jYXBzLkluaGVyaXRhYmxlKQogICAgbWF0Y2hfY2FwcyhwX2NhcHMuSW5oZXJpdGFibGUsIGlfY2Fwcy5Jbmhlcml0YWJsZSkKCiAgICBwcmludCgiYWxsb3dfY2FwczogcG9saWN5IFBlcm1pdHRlZCA9IiwgcF9jYXBzLlBlcm1pdHRlZCkKICAgIHByaW50KCJhbGxvd19jYXBzOiBpbnB1dCBQZXJtaXR0ZWQgPSIsIGlfY2Fwcy5QZXJtaXR0ZWQpCiAgICBtYXRjaF9jYXBzKHBfY2Fwcy5QZXJtaXR0ZWQsIGlfY2Fwcy5QZXJtaXR0ZWQpCn0KCm1hdGNoX2NhcHMocF9jYXBzLCBpX2NhcHMpIHsKICAgIHByaW50KCJtYXRjaF9jYXBzIDE6IHN0YXJ0IikKCiAgICBwX2NhcHMgPT0gaV9jYXBzCgogICAgcHJpbnQoIm1hdGNoX2NhcHMgMTogdHJ1ZSIpCn0KbWF0Y2hfY2FwcyhwX2NhcHMsIGlfY2FwcykgewogICAgcHJpbnQoIm1hdGNoX2NhcHMgMjogc3RhcnQiKQoKICAgIGNvdW50KHBfY2FwcykgPT0gMQogICAgcF9jYXBzWzBdID09ICIkKGRlZmF1bHRfY2FwcykiCgogICAgcHJpbnQoIm1hdGNoX2NhcHMgMjogZGVmYXVsdF9jYXBzID0iLCBwb2xpY3lfZGF0YS5jb21tb24uZGVmYXVsdF9jYXBzKQogICAgcG9saWN5X2RhdGEuY29tbW9uLmRlZmF1bHRfY2FwcyA9PSBpX2NhcHMKCiAgICBwcmludCgibWF0Y2hfY2FwcyAyOiB0cnVlIikKfQptYXRjaF9jYXBzKHBfY2FwcywgaV9jYXBzKSB7CiAgICBwcmludCgibWF0Y2hfY2FwcyAzOiBzdGFydCIpCgogICAgY291bnQocF9jYXBzKSA9PSAxCiAgICBwX2NhcHNbMF0gPT0gIiQocHJpdmlsZWdlZF9jYXBzKSIKCiAgICBwcmludCgibWF0Y2hfY2FwcyAzOiBwcml2aWxlZ2VkX2NhcHMgPSIsIHBvbGljeV9kYXRhLmNvbW1vbi5wcml2aWxlZ2VkX2NhcHMpCiAgICBwb2xpY3lfZGF0YS5jb21tb24ucHJpdmlsZWdlZF9jYXBzID09IGlfY2FwcwoKICAgIHByaW50KCJtYXRjaF9jYXBzIDM6IHRydWUiKQp9CgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgpjaGVja19kaXJlY3RvcnlfdHJhdmVyc2FsKGlfcGF0aCkgewogICAgbm90IHJlZ2V4Lm1hdGNoKCIoXnwvKS4uKCR8LykiLCBpX3BhdGgpCn0KCmNoZWNrX3N5bWxpbmtfc291cmNlKGlfc3JjKSB7CiAgICBpX3NyYyA9PSAiIgogICAgcHJpbnQoImNoZWNrX3N5bWxpbmtfc291cmNlIDE6IHRydWUiKQp9CmNoZWNrX3N5bWxpbmtfc291cmNlKGlfc3JjKSB7CiAgICBpX3NyYyAhPSAiIgogICAgcHJpbnQoImNoZWNrX3N5bWxpbmtfc291cmNlIDI6IGlfc3JjID0iLCBpX3NyYykKCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24uc19zb3VyY2UxLCBpX3NyYykKCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMjogdHJ1ZSIpCn0KY2hlY2tfc3ltbGlua19zb3VyY2UoaV9zcmMpIHsKICAgIGlfc3JjICE9ICIiCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMzogaV9zcmMgPSIsIGlfc3JjKQoKICAgIHJlZ2V4Lm1hdGNoKHBvbGljeV9kYXRhLmNvbW1vbi5zX3NvdXJjZTIsIGlfc3JjKQogICAgY2hlY2tfZGlyZWN0b3J5X3RyYXZlcnNhbChpX3NyYykKCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMzogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfc3RvcmFnZXMoaV9zdG9yYWdlcykgewogICAgcHJpbnQoImFsbG93X3NhbmRib3hfc3RvcmFnZXM6IGlfc3RvcmFnZXMgPSIsIGlfc3RvcmFnZXMpCgogICAgcF9zdG9yYWdlcyA6PSBwb2xpY3lfZGF0YS5zYW5kYm94LnN0b3JhZ2VzCiAgICBldmVyeSBpX3N0b3JhZ2UgaW4gaV9zdG9yYWdlcyB7CiAgICAgICAgYWxsb3dfc2FuZGJveF9zdG9yYWdlKHBfc3RvcmFnZXMsIGlfc3RvcmFnZSkKICAgIH0KCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9zdG9yYWdlczogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfc3RvcmFnZShwX3N0b3JhZ2VzLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IGlfc3RvcmFnZSA9IiwgaV9zdG9yYWdlKQoKICAgIHNvbWUgcF9zdG9yYWdlIGluIHBfc3RvcmFnZXMKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IHBfc3RvcmFnZSA9IiwgcF9zdG9yYWdlKQogICAgaV9zdG9yYWdlID09IHBfc3RvcmFnZQoKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IHRydWUiKQp9CgpDb3B5RmlsZVJlcXVlc3QgewogICAgcHJpbnQoIkNvcHlGaWxlUmVxdWVzdDogaW5wdXQucGF0aCA9IiwgaW5wdXQucGF0aCkKCiAgICBjaGVja19zeW1saW5rX3NvdXJjZShpbnB1dC5zeW1saW5rX3NyYykKICAgIGNoZWNrX2RpcmVjdG9yeV90cmF2ZXJzYWwoaW5wdXQucGF0aCkKCiAgICBzb21lIHJlZ2V4MSBpbiBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLkNvcHlGaWxlUmVxdWVzdAogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5jcGF0aCkKICAgIHJlZ2V4NCA6PSByZXBsYWNlKHJlZ2V4MywgIiQoYnVuZGxlLWlkKSIsIEJVTkRMRV9JRCkKICAgIHByaW50KCJDb3B5RmlsZVJlcXVlc3Q6IHJlZ2V4NCA9IiwgcmVnZXg0KQoKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4NCwgaW5wdXQucGF0aCkKCiAgICBwcmludCgiQ29weUZpbGVSZXF1ZXN0OiB0cnVlIikKfQoKQ3JlYXRlU2FuZGJveFJlcXVlc3QgewogICAgcHJpbnQoIkNyZWF0ZVNhbmRib3hSZXF1ZXN0OiBpbnB1dC5ndWVzdF9ob29rX3BhdGggPSIsIGlucHV0Lmd1ZXN0X2hvb2tfcGF0aCkKICAgIGNvdW50KGlucHV0Lmd1ZXN0X2hvb2tfcGF0aCkgPT0gMAoKICAgIHByaW50KCJDcmVhdGVTYW5kYm94UmVxdWVzdDogaW5wdXQua2VybmVsX21vZHVsZXMgPSIsIGlucHV0Lmtlcm5lbF9tb2R1bGVzKQogICAgY291bnQoaW5wdXQua2VybmVsX21vZHVsZXMpID09IDAKCiAgICBpX3BpZG5zIDo9IGlucHV0LnNhbmRib3hfcGlkbnMKICAgIHByaW50KCJDcmVhdGVTYW5kYm94UmVxdWVzdDogaV9waWRucyA9IiwgaV9waWRucykKICAgIGlfcGlkbnMgPT0gZmFsc2UKICAgIGFsbG93X3NhbmRib3hfc3RvcmFnZXMoaW5wdXQuc3RvcmFnZXMpCn0KCmFsbG93X2V4ZWMocF9jb250YWluZXIsIGlfcHJvY2VzcykgewogICAgcHJpbnQoImFsbG93X2V4ZWM6IHN0YXJ0IikKCiAgICBwX29jaSA9IHBfY29udGFpbmVyLk9DSQogICAgcF9zX25hbWUgPSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc19uYW1lc3BhY2UgPSBnZXRfc3RhdGVfdmFsKCJuYW1lc3BhY2UiKQogICAgYWxsb3dfcHJvYmVfcHJvY2VzcyhwX29jaS5Qcm9jZXNzLCBpX3Byb2Nlc3MsIHBfc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfZXhlYzogdHJ1ZSIpCn0KCmFsbG93X2ludGVyYWN0aXZlX2V4ZWMocF9jb250YWluZXIsIGlfcHJvY2VzcykgewogICAgcHJpbnQoImFsbG93X2ludGVyYWN0aXZlX2V4ZWM6IHN0YXJ0IikKCiAgICBwX29jaSA9IHBfY29udGFpbmVyLk9DSQogICAgcF9zX25hbWUgPSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc19uYW1lc3BhY2UgPSBnZXRfc3RhdGVfdmFsKCJuYW1lc3BhY2UiKQogICAgYWxsb3dfaW50ZXJhY3RpdmVfcHJvY2VzcyhwX29jaS5Qcm9jZXNzLCBpX3Byb2Nlc3MsIHBfc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfaW50ZXJhY3RpdmVfZXhlYzogdHJ1ZSIpCn0KCiMgVE9ETzogc2hvdWxkIG90aGVyIEV4ZWNQcm9jZXNzUmVxdWVzdCBpbnB1dCBkYXRhIGZpZWxkcyBiZSB2YWxpZGF0ZWQgYXMgd2VsbD8KRXhlY1Byb2Nlc3NSZXF1ZXN0IHsKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMTogaW5wdXQgPSIsIGlucHV0KQoKICAgIHNvbWUgcF9jb21tYW5kIGluIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuRXhlY1Byb2Nlc3NSZXF1ZXN0LmFsbG93ZWRfY29tbWFuZHMKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMTogcF9jb21tYW5kID0iLCBwX2NvbW1hbmQpCiAgICBwX2NvbW1hbmQgPT0gaW5wdXQucHJvY2Vzcy5BcmdzCgogICAgIyBUT0RPOiBtYXRjaCBwX2NvbnRhaW5lcidzIElEIHdpdGggdGhlIGlucHV0IGNvbnRhaW5lcl9pZC4KICAgIHNvbWUgcF9jb250YWluZXIgaW4gcG9saWN5X2RhdGEuY29udGFpbmVycwogICAgYWxsb3dfaW50ZXJhY3RpdmVfZXhlYyhwX2NvbnRhaW5lciwgaW5wdXQucHJvY2VzcykKCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDE6IHRydWUiKQp9CkV4ZWNQcm9jZXNzUmVxdWVzdCB7CiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDI6IGlucHV0ID0iLCBpbnB1dCkKCiAgICAjIFRPRE86IG1hdGNoIGlucHV0IGNvbnRhaW5lciBJRCB3aXRoIGl0cyBjb3JyZXNwb25kaW5nIGNvbnRhaW5lci5leGVjX2NvbW1hbmRzLgogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBzb21lIHBfY29tbWFuZCBpbiBwX2NvbnRhaW5lci5leGVjX2NvbW1hbmRzCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDI6IHBfY29tbWFuZCA9IiwgcF9jb21tYW5kKQoKICAgICMgVE9ETzogc2hvdWxkIG90aGVyIGlucHV0IGRhdGEgZmllbGRzIGJlIHZhbGlkYXRlZCBhcyB3ZWxsPwogICAgcF9jb21tYW5kID09IGlucHV0LnByb2Nlc3MuQXJncwoKICAgIGFsbG93X2V4ZWMocF9jb250YWluZXIsIGlucHV0LnByb2Nlc3MpCgogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAyOiB0cnVlIikKfQpFeGVjUHJvY2Vzc1JlcXVlc3QgewogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAzOiBpbnB1dCA9IiwgaW5wdXQpCgogICAgaV9jb21tYW5kID0gY29uY2F0KCIgIiwgaW5wdXQucHJvY2Vzcy5BcmdzKQogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAzOiBpX2NvbW1hbmQgPSIsIGlfY29tbWFuZCkKCiAgICBzb21lIHBfcmVnZXggaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5FeGVjUHJvY2Vzc1JlcXVlc3QucmVnZXgKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMzogcF9yZWdleCA9IiwgcF9yZWdleCkKCiAgICByZWdleC5tYXRjaChwX3JlZ2V4LCBpX2NvbW1hbmQpCgogICAgIyBUT0RPOiBtYXRjaCBwX2NvbnRhaW5lcidzIElEIHdpdGggdGhlIGlucHV0IGNvbnRhaW5lcl9pZC4KICAgIHNvbWUgcF9jb250YWluZXIgaW4gcG9saWN5X2RhdGEuY29udGFpbmVycwogICAgYWxsb3dfaW50ZXJhY3RpdmVfZXhlYyhwX2NvbnRhaW5lciwgaW5wdXQucHJvY2VzcykKCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDM6IHRydWUiKQp9CgpVcGRhdGVSb3V0ZXNSZXF1ZXN0IHsKICAgIHByaW50KCJVcGRhdGVSb3V0ZXNSZXF1ZXN0OiBpbnB1dCA9IiwgaW5wdXQpCiAgICBwcmludCgiVXBkYXRlUm91dGVzUmVxdWVzdDogcG9saWN5ID0iLCBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLlVwZGF0ZVJvdXRlc1JlcXVlc3QpCgogICAgaV9yb3V0ZXMgOj0gaW5wdXQucm91dGVzLlJvdXRlcwogICAgcF9zb3VyY2VfcmVnZXggPSBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLlVwZGF0ZVJvdXRlc1JlcXVlc3QuZm9yYmlkZGVuX3NvdXJjZV9yZWdleAogICAgcF9uYW1lcyA9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuVXBkYXRlUm91dGVzUmVxdWVzdC5mb3JiaWRkZW5fZGV2aWNlX25hbWVzCgogICAgZXZlcnkgaV9yb3V0ZSBpbiBpX3JvdXRlcyB7CiAgICAgICAgcHJpbnQoImlfcm91dGUuc291cmNlID0iLCBpX3JvdXRlLnNvdXJjZSkKICAgICAgICBldmVyeSBwX3JlZ2V4IGluIHBfc291cmNlX3JlZ2V4IHsKICAgICAgICAgICAgcHJpbnQoInBfcmVnZXggPSIsIHBfcmVnZXgpCiAgICAgICAgICAgIG5vdCByZWdleC5tYXRjaChwX3JlZ2V4LCBpX3JvdXRlLnNvdXJjZSkKICAgICAgICB9CgogICAgICAgIHByaW50KCJpX3JvdXRlLmRldmljZSA9IiwgaV9yb3V0ZS5kZXZpY2UpCiAgICAgICAgbm90IGlfcm91dGUuZGV2aWNlIGluIHBfbmFtZXMKICAgIH0KCiAgICBwcmludCgiVXBkYXRlUm91dGVzUmVxdWVzdDogdHJ1ZSIpCn0KClVwZGF0ZUludGVyZmFjZVJlcXVlc3QgewogICAgcHJpbnQoIlVwZGF0ZUludGVyZmFjZVJlcXVlc3Q6IGlucHV0ID0iLCBpbnB1dCkKICAgIHByaW50KCJVcGRhdGVJbnRlcmZhY2VSZXF1ZXN0OiBwb2xpY3kgPSIsIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuVXBkYXRlSW50ZXJmYWNlUmVxdWVzdCkKCiAgICBpX2ludGVyZmFjZSA6PSBpbnB1dC5pbnRlcmZhY2UKICAgIHBfZmxhZ3MgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmFsbG93X3Jhd19mbGFncwoKICAgICMgVHlwaWNhbGx5LCBqdXN0IElGRl9OT0FSUCBpcyB1c2VkLgogICAgYml0cy5hbmQoaV9pbnRlcmZhY2UucmF3X2ZsYWdzLCBiaXRzLm5lZ2F0ZShwX2ZsYWdzKSkgPT0gMAoKICAgIHBfbmFtZXMgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmZvcmJpZGRlbl9uYW1lcwoKICAgIG5vdCBpX2ludGVyZmFjZS5uYW1lIGluIHBfbmFtZXMKCiAgICBwX2h3YWRkcnMgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmZvcmJpZGRlbl9od19hZGRycwoKICAgIG5vdCBpX2ludGVyZmFjZS5od0FkZHIgaW4gcF9od2FkZHJzCgogICAgcHJpbnQoIlVwZGF0ZUludGVyZmFjZVJlcXVlc3Q6IHRydWUiKQp9CgpDbG9zZVN0ZGluUmVxdWVzdCB7CiAgICBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLkNsb3NlU3RkaW5SZXF1ZXN0ID09IHRydWUKfQoKUmVhZFN0cmVhbVJlcXVlc3QgewogICAgcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5SZWFkU3RyZWFtUmVxdWVzdCA9PSB0cnVlCn0KClVwZGF0ZUVwaGVtZXJhbE1vdW50c1JlcXVlc3QgewogICAgcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVFcGhlbWVyYWxNb3VudHNSZXF1ZXN0ID09IHRydWUKfQoKV3JpdGVTdHJlYW1SZXF1ZXN0IHsKICAgIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuV3JpdGVTdHJlYW1SZXF1ZXN0ID09IHRydWUKfQoKcG9saWN5X2RhdGEgOj0gewogICJjb250YWluZXJzIjogWwogICAgewogICAgICAiT0NJIjogewogICAgICAgICJWZXJzaW9uIjogIjEuMS4wLXJjLjEiLAogICAgICAgICJQcm9jZXNzIjogewogICAgICAgICAgIlRlcm1pbmFsIjogZmFsc2UsCiAgICAgICAgICAiVXNlciI6IHsKICAgICAgICAgICAgIlVJRCI6IDY1NTM1LAogICAgICAgICAgICAiR0lEIjogNjU1MzUsCiAgICAgICAgICAgICJBZGRpdGlvbmFsR2lkcyI6IFtdLAogICAgICAgICAgICAiVXNlcm5hbWUiOiAiIgogICAgICAgICAgfSwKICAgICAgICAgICJEZXByZWNhdGVkQXJncyI6IFsKICAgICAgICAgICAgIi9wYXVzZSIKICAgICAgICAgIF0sCiAgICAgICAgICAiQXJncyI6IFsKICAgICAgICAgICAgIi9wYXVzZSIKICAgICAgICAgIF0sCiAgICAgICAgICAiRW52IjogWwogICAgICAgICAgICAiUEFUSD0vdXNyL2xvY2FsL3NiaW46L3Vzci9sb2NhbC9iaW46L3Vzci9zYmluOi91c3IvYmluOi9zYmluOi9iaW4iCiAgICAgICAgICBdLAogICAgICAgICAgIkN3ZCI6ICIvIiwKICAgICAgICAgICJDYXBhYmlsaXRpZXMiOiB7CiAgICAgICAgICAgICJBbWJpZW50IjogW10sCiAgICAgICAgICAgICJCb3VuZGluZyI6IFsKICAgICAgICAgICAgICAiJChkZWZhdWx0X2NhcHMpIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiRWZmZWN0aXZlIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJJbmhlcml0YWJsZSI6IFtdLAogICAgICAgICAgICAiUGVybWl0dGVkIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICAiTm9OZXdQcml2aWxlZ2VzIjogdHJ1ZQogICAgICAgIH0sCiAgICAgICAgIlJvb3QiOiB7CiAgICAgICAgICAiUGF0aCI6ICIkKGNwYXRoKS8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgIlJlYWRvbmx5IjogdHJ1ZQogICAgICAgIH0sCiAgICAgICAgIk1vdW50cyI6IFsKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9wcm9jIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJwcm9jIiwKICAgICAgICAgICAgInR5cGVfIjogInByb2MiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2IiwKICAgICAgICAgICAgInNvdXJjZSI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJzdHJpY3RhdGltZSIsCiAgICAgICAgICAgICAgIm1vZGU9NzU1IiwKICAgICAgICAgICAgICAic2l6ZT02NTUzNmsiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L3B0cyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiZGV2cHRzIiwKICAgICAgICAgICAgInR5cGVfIjogImRldnB0cyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJuZXdpbnN0YW5jZSIsCiAgICAgICAgICAgICAgInB0bXhtb2RlPTA2NjYiLAogICAgICAgICAgICAgICJtb2RlPTA2MjAiLAogICAgICAgICAgICAgICJnaWQ9NSIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvc2htIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L3NobSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi9tcXVldWUiLAogICAgICAgICAgICAic291cmNlIjogIm1xdWV1ZSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJtcXVldWUiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvc3lzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJzeXNmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJzeXNmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2V0Yy9yZXNvbHYuY29uZiIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClyZXNvbHYuY29uZiQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJvIiwKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9kZXYiLAogICAgICAgICAgICAgICJub2V4ZWMiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0KICAgICAgICBdLAogICAgICAgICJBbm5vdGF0aW9ucyI6IHsKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmJ1bmRsZV9wYXRoIjogIi9ydW4vY29udGFpbmVyZC9pby5jb250YWluZXJkLnJ1bnRpbWUudjIudGFzay9rOHMuaW8vJChidW5kbGUtaWQpIiwKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIjogInBvZF9zYW5kYm94IiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSI6ICJzYW5kYm94IiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWlkIjogIl5bYS16MC05XXs2NH0kIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWxvZy1kaXJlY3RvcnkiOiAiXi92YXIvbG9nL3BvZHMvJChzYW5kYm94LW5hbWVzcGFjZSlfJChzYW5kYm94LW5hbWUpX1swLTlhLWZdezh9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezEyfSQiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZXNwYWNlIjogIiIsCiAgICAgICAgICAibmVyZGN0bC9uZXR3b3JrLW5hbWVzcGFjZSI6ICJeL3Zhci9ydW4vbmV0bnMvY25pLVswLTlhLWZdezh9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezEyfSQiCiAgICAgICAgfSwKICAgICAgICAiTGludXgiOiB7CiAgICAgICAgICAiTmFtZXNwYWNlcyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICJUeXBlIjogImlwYyIsCiAgICAgICAgICAgICAgIlBhdGgiOiAiIgogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgIlR5cGUiOiAidXRzIiwKICAgICAgICAgICAgICAiUGF0aCI6ICIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiVHlwZSI6ICJtb3VudCIsCiAgICAgICAgICAgICAgIlBhdGgiOiAiIgogICAgICAgICAgICB9CiAgICAgICAgICBdLAogICAgICAgICAgIk1hc2tlZFBhdGhzIjogWwogICAgICAgICAgICAiL3Byb2MvYWNwaSIsCiAgICAgICAgICAgICIvcHJvYy9hc291bmQiLAogICAgICAgICAgICAiL3Byb2Mva2NvcmUiLAogICAgICAgICAgICAiL3Byb2Mva2V5cyIsCiAgICAgICAgICAgICIvcHJvYy9sYXRlbmN5X3N0YXRzIiwKICAgICAgICAgICAgIi9wcm9jL3RpbWVyX2xpc3QiLAogICAgICAgICAgICAiL3Byb2MvdGltZXJfc3RhdHMiLAogICAgICAgICAgICAiL3Byb2Mvc2NoZWRfZGVidWciLAogICAgICAgICAgICAiL3N5cy9maXJtd2FyZSIsCiAgICAgICAgICAgICIvcHJvYy9zY3NpIgogICAgICAgICAgXSwKICAgICAgICAgICJSZWFkb25seVBhdGhzIjogWwogICAgICAgICAgICAiL3Byb2MvYnVzIiwKICAgICAgICAgICAgIi9wcm9jL2ZzIiwKICAgICAgICAgICAgIi9wcm9jL2lycSIsCiAgICAgICAgICAgICIvcHJvYy9zeXMiLAogICAgICAgICAgICAiL3Byb2Mvc3lzcnEtdHJpZ2dlciIKICAgICAgICAgIF0sCiAgICAgICAgICAiRGV2aWNlcyI6IFtdLAogICAgICAgICAgIlN5c2N0bCI6IHsKICAgICAgICAgICAgIm5ldC5pcHY0LmlwX3VucHJpdmlsZWdlZF9wb3J0X3N0YXJ0IjogIjAiLAogICAgICAgICAgICAibmV0LmlwdjQucGluZ19ncm91cF9yYW5nZSI6ICIwIDIxNDc0ODM2NDciCiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9LAogICAgICAic3RvcmFnZXMiOiBbCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJibGsiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogInRhciIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIiQoaGFzaDApIgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGxheWVyMCkiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJvdmVybGF5ZnMiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogImZ1c2UzLmthdGEtb3ZlcmxheSIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIjVhNWFhZDgwMDU1ZmYyMDAxMmE1MGRjMjVmOGRmN2EyOTkyNDQ3NDMyNGQ2NWY3ZDUzMDZlZThlZTI3ZmY3MWQiLAogICAgICAgICAgICAiODE3MjUwZjFhM2UzMzZkYTc2ZjViZDNmYTc4NGUxYjI2ZDk1OWI5YzEzMTg3NjgxNWJhMjYwNDA0OGI3MGMxOCIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChjcGF0aCkvJChidW5kbGUtaWQpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9CiAgICAgIF0sCiAgICAgICJkZXZpY2VzIjogW10sCiAgICAgICJzYW5kYm94X3BpZG5zIjogZmFsc2UsCiAgICAgICJleGVjX2NvbW1hbmRzIjogW10sCiAgICAgICJlbnZfbWFwIjogewogICAgICAgICJQQVRIIjogIi91c3IvbG9jYWwvc2JpbjovdXNyL2xvY2FsL2JpbjovdXNyL3NiaW46L3Vzci9iaW46L3NiaW46L2JpbiIKICAgICAgfQogICAgfSwKICAgIHsKICAgICAgIk9DSSI6IHsKICAgICAgICAiVmVyc2lvbiI6ICIxLjEuMC1yYy4xIiwKICAgICAgICAiUHJvY2VzcyI6IHsKICAgICAgICAgICJUZXJtaW5hbCI6IGZhbHNlLAogICAgICAgICAgIlVzZXIiOiB7CiAgICAgICAgICAgICJVSUQiOiAwLAogICAgICAgICAgICAiR0lEIjogMCwKICAgICAgICAgICAgIkFkZGl0aW9uYWxHaWRzIjogW10sCiAgICAgICAgICAgICJVc2VybmFtZSI6ICIiCiAgICAgICAgICB9LAogICAgICAgICAgIkRlcHJlY2F0ZWRBcmdzIjogWwogICAgICAgICAgICAiL3J1bi5zaCIKICAgICAgICAgIF0sCiAgICAgICAgICAiQXJncyI6IFsKICAgICAgICAgICAgIi9ydW4uc2giCiAgICAgICAgICBdLAogICAgICAgICAgIkVudiI6IFsKICAgICAgICAgICAgIlBBVEg9L3Vzci9sb2NhbC9zYmluOi91c3IvbG9jYWwvYmluOi91c3Ivc2JpbjovdXNyL2Jpbjovc2JpbjovYmluOi91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NC9iaW46L3Vzci9sb2NhbC9hcGFjaGUtY2Fzc2FuZHJhLTMuMTEuMi9iaW4iLAogICAgICAgICAgICAiQ0FTU0FORFJBX0hPTUU9L3Vzci9sb2NhbC9hcGFjaGUtY2Fzc2FuZHJhLTMuMTEuMiIsCiAgICAgICAgICAgICJDQVNTQU5EUkFfQ09ORj0vZXRjL2Nhc3NhbmRyYSIsCiAgICAgICAgICAgICJDQVNTQU5EUkFfREFUQT0vY2Fzc2FuZHJhX2RhdGEiLAogICAgICAgICAgICAiQ0FTU0FORFJBX0xPR1M9L3Zhci9sb2cvY2Fzc2FuZHJhIiwKICAgICAgICAgICAgIkpBVkFfSE9NRT0vdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQiLAogICAgICAgICAgICAiSE9TVE5BTUU9JChob3N0LW5hbWUpIiwKICAgICAgICAgICAgIk1BWF9IRUFQX1NJWkU9NTEyTSIsCiAgICAgICAgICAgICJIRUFQX05FV1NJWkU9MTAwTSIsCiAgICAgICAgICAgICJDQVNTQU5EUkFfU0VFRF9QUk9WSURFUj1pby5rOHMuY2Fzc2FuZHJhLkt1YmVybmV0ZXNTZWVkUHJvdmlkZXIiLAogICAgICAgICAgICAiUE9EX05BTUVTUEFDRT0kKHNhbmRib3gtbmFtZXNwYWNlKSIsCiAgICAgICAgICAgICJQT0RfSVA9JChwb2QtaXApIgogICAgICAgICAgXSwKICAgICAgICAgICJDd2QiOiAiLyIsCiAgICAgICAgICAiQ2FwYWJpbGl0aWVzIjogewogICAgICAgICAgICAiQW1iaWVudCI6IFtdLAogICAgICAgICAgICAiQm91bmRpbmciOiBbCiAgICAgICAgICAgICAgIiQoZGVmYXVsdF9jYXBzKSIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgIkVmZmVjdGl2ZSI6IFsKICAgICAgICAgICAgICAiJChkZWZhdWx0X2NhcHMpIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiSW5oZXJpdGFibGUiOiBbXSwKICAgICAgICAgICAgIlBlcm1pdHRlZCI6IFsKICAgICAgICAgICAgICAiJChkZWZhdWx0X2NhcHMpIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgIk5vTmV3UHJpdmlsZWdlcyI6IGZhbHNlCiAgICAgICAgfSwKICAgICAgICAiUm9vdCI6IHsKICAgICAgICAgICJQYXRoIjogIiQoY3BhdGgpLyQoYnVuZGxlLWlkKSIsCiAgICAgICAgICAiUmVhZG9ubHkiOiBmYWxzZQogICAgICAgIH0sCiAgICAgICAgIk1vdW50cyI6IFsKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9wcm9jIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJwcm9jIiwKICAgICAgICAgICAgInR5cGVfIjogInByb2MiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2IiwKICAgICAgICAgICAgInNvdXJjZSI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJzdHJpY3RhdGltZSIsCiAgICAgICAgICAgICAgIm1vZGU9NzU1IiwKICAgICAgICAgICAgICAic2l6ZT02NTUzNmsiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L3B0cyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiZGV2cHRzIiwKICAgICAgICAgICAgInR5cGVfIjogImRldnB0cyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJuZXdpbnN0YW5jZSIsCiAgICAgICAgICAgICAgInB0bXhtb2RlPTA2NjYiLAogICAgICAgICAgICAgICJtb2RlPTA2MjAiLAogICAgICAgICAgICAgICJnaWQ9NSIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvc2htIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L3NobSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi9tcXVldWUiLAogICAgICAgICAgICAic291cmNlIjogIm1xdWV1ZSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJtcXVldWUiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvc3lzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJzeXNmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJzeXNmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL3N5cy9mcy9jZ3JvdXAiLAogICAgICAgICAgICAic291cmNlIjogImNncm91cCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJjZ3JvdXAiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiLAogICAgICAgICAgICAgICJyZWxhdGltZSIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2V0Yy9ob3N0cyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClob3N0cyQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicnciCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L3Rlcm1pbmF0aW9uLWxvZyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeCl0ZXJtaW5hdGlvbi1sb2ckIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJ3IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2V0Yy9ob3N0bmFtZSIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClob3N0bmFtZSQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicnciCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZXRjL3Jlc29sdi5jb25mIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KXJlc29sdi5jb25mJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJydyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi92YXIvcnVuL3NlY3JldHMva3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudCIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClzZXJ2aWNlYWNjb3VudCQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicm8iCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvdmFyL3J1bi9zZWNyZXRzL2F6dXJlL3Rva2VucyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeCl0b2tlbnMkIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Nhc3NhbmRyYV9kYXRhIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJeJChjcGF0aCkvJChzYW5kYm94LWlkKS9sb2NhbC9kYXRhJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJsb2NhbCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicnciCiAgICAgICAgICAgIF0KICAgICAgICAgIH0KICAgICAgICBdLAogICAgICAgICJBbm5vdGF0aW9ucyI6IHsKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmJ1bmRsZV9wYXRoIjogIi9ydW4vY29udGFpbmVyZC9pby5jb250YWluZXJkLnJ1bnRpbWUudjIudGFzay9rOHMuaW8vJChidW5kbGUtaWQpIiwKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIjogInBvZF9jb250YWluZXIiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLmNvbnRhaW5lci1uYW1lIjogImNhc3NhbmRyYSIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLXR5cGUiOiAiY29udGFpbmVyIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5pbWFnZS1uYW1lIjogImdjci5pby9nb29nbGUtc2FtcGxlcy9jYXNzYW5kcmE6djEzIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWlkIjogIl5bYS16MC05XXs2NH0kIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LW5hbWVzcGFjZSI6ICIiCiAgICAgICAgfSwKICAgICAgICAiTGludXgiOiB7CiAgICAgICAgICAiTmFtZXNwYWNlcyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICJUeXBlIjogImlwYyIsCiAgICAgICAgICAgICAgIlBhdGgiOiAiIgogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgIlR5cGUiOiAidXRzIiwKICAgICAgICAgICAgICAiUGF0aCI6ICIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiVHlwZSI6ICJtb3VudCIsCiAgICAgICAgICAgICAgIlBhdGgiOiAiIgogICAgICAgICAgICB9CiAgICAgICAgICBdLAogICAgICAgICAgIk1hc2tlZFBhdGhzIjogWwogICAgICAgICAgICAiL3Byb2MvYWNwaSIsCiAgICAgICAgICAgICIvcHJvYy9rY29yZSIsCiAgICAgICAgICAgICIvcHJvYy9rZXlzIiwKICAgICAgICAgICAgIi9wcm9jL2xhdGVuY3lfc3RhdHMiLAogICAgICAgICAgICAiL3Byb2MvdGltZXJfbGlzdCIsCiAgICAgICAgICAgICIvcHJvYy90aW1lcl9zdGF0cyIsCiAgICAgICAgICAgICIvcHJvYy9zY2hlZF9kZWJ1ZyIsCiAgICAgICAgICAgICIvcHJvYy9zY3NpIiwKICAgICAgICAgICAgIi9zeXMvZmlybXdhcmUiCiAgICAgICAgICBdLAogICAgICAgICAgIlJlYWRvbmx5UGF0aHMiOiBbCiAgICAgICAgICAgICIvcHJvYy9hc291bmQiLAogICAgICAgICAgICAiL3Byb2MvYnVzIiwKICAgICAgICAgICAgIi9wcm9jL2ZzIiwKICAgICAgICAgICAgIi9wcm9jL2lycSIsCiAgICAgICAgICAgICIvcHJvYy9zeXMiLAogICAgICAgICAgICAiL3Byb2Mvc3lzcnEtdHJpZ2dlciIKICAgICAgICAgIF0sCiAgICAgICAgICAiRGV2aWNlcyI6IFtdLAogICAgICAgICAgIlN5c2N0bCI6IHsKICAgICAgICAgICAgIm5ldC5pcHY0LmlwX3VucHJpdmlsZWdlZF9wb3J0X3N0YXJ0IjogIjAiLAogICAgICAgICAgICAibmV0LmlwdjQucGluZ19ncm91cF9yYW5nZSI6ICIwIDIxNDc0ODM2NDciCiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9LAogICAgICAic3RvcmFnZXMiOiBbCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJibGsiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogInRhciIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIiQoaGFzaDApIgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGxheWVyMCkiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJibGsiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogInRhciIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIiQoaGFzaDEpIgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGxheWVyMSkiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJibGsiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogInRhciIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIiQoaGFzaDIpIgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGxheWVyMikiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJvdmVybGF5ZnMiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogImZ1c2UzLmthdGEtb3ZlcmxheSIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgImU1OTE0Y2ZjMTQ3ZTEzZTY1YjI5YjM2ZjMxODc1NmMxZTg1MWE4MDA0YTUwZjE2MjBjZjYzYzRkYjQ5YzY2Yjg6YzVkMjJmZGExODRlOWU4M2RiMjA1MWNmNzhhMzg4NTA3NTNkN2E0NGM3MDA4ZTcxMDg0NjdjNTdiYzU4MDU0ZDo1ZjhhMmVjZWNiZTYwZWZlMmRjMTZlODBiMzY1YTQwYTQxODhlNTdkZDRlM2Q2YzI1ZTdlNTEzYTYyZDY3YzE1IiwKICAgICAgICAgICAgIjc0MjUxZDE1NGYxNzFmZjc3NzUzNjQ2ZDY4ZTViMjI4MGFjMmU0NzMzY2EwZTExMDE4ODBmZGMwZDJjOTQyNGU6MzBjODZjMGVlNDU1YTM2Yzg5NDcyNTU0Y2Q0YzIzMTlhZTQ3OTFmZGYxMjcxYmE4OTc5M2I2NjJmYjkzZjQ1MDowMWNkYmQ4ZjQxMGFjMjA3OWUwMzBlMjEzY2MxZDJkMWQ5MzM1OGI4MzA1ZGRmMTI1MjU0OTQ2YThjMzZjODI3IgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGNwYXRoKS8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJsb2NhbCIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAibG9jYWwiLAogICAgICAgICAgImZzdHlwZSI6ICJsb2NhbCIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIm1vZGU9MDc3NyIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiXiQoY3BhdGgpLyQoc2FuZGJveC1pZCkvbG9jYWwvZGF0YSQiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0KICAgICAgXSwKICAgICAgImRldmljZXMiOiBbXSwKICAgICAgInNhbmRib3hfcGlkbnMiOiBmYWxzZSwKICAgICAgImV4ZWNfY29tbWFuZHMiOiBbXSwKICAgICAgImVudl9tYXAiOiB7CiAgICAgICAgIkNBU1NBTkRSQV9DT05GIjogIi9ldGMvY2Fzc2FuZHJhIiwKICAgICAgICAiQ0FTU0FORFJBX0RBVEEiOiAiL2Nhc3NhbmRyYV9kYXRhIiwKICAgICAgICAiQ0FTU0FORFJBX0hPTUUiOiAiL3Vzci9sb2NhbC9hcGFjaGUtY2Fzc2FuZHJhLTMuMTEuMiIsCiAgICAgICAgIkNBU1NBTkRSQV9MT0dTIjogIi92YXIvbG9nL2Nhc3NhbmRyYSIsCiAgICAgICAgIkNBU1NBTkRSQV9TRUVEX1BST1ZJREVSIjogImlvLms4cy5jYXNzYW5kcmEuS3ViZXJuZXRlc1NlZWRQcm92aWRlciIsCiAgICAgICAgIkhFQVBfTkVXU0laRSI6ICIxMDBNIiwKICAgICAgICAiSE9TVE5BTUUiOiAiJChob3N0LW5hbWUpIiwKICAgICAgICAiSkFWQV9IT01FIjogIi91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NCIsCiAgICAgICAgIk1BWF9IRUFQX1NJWkUiOiAiNTEyTSIsCiAgICAgICAgIlBBVEgiOiAiL3Vzci9sb2NhbC9zYmluOi91c3IvbG9jYWwvYmluOi91c3Ivc2JpbjovdXNyL2Jpbjovc2JpbjovYmluOi91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NC9iaW46L3Vzci9sb2NhbC9hcGFjaGUtY2Fzc2FuZHJhLTMuMTEuMi9iaW4iLAogICAgICAgICJQT0RfSVAiOiAiJChwb2QtaXApIiwKICAgICAgICAiUE9EX05BTUVTUEFDRSI6ICIkKHNhbmRib3gtbmFtZXNwYWNlKSIKICAgICAgfQogICAgfQogIF0sCiAgImNvbW1vbiI6IHsKICAgICJjcGF0aCI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zaGFyZWQvY29udGFpbmVycyIsCiAgICAibW91bnRfc291cmNlX2NwYXRoIjogIi9ydW4va2F0YS1jb250YWluZXJzL3NoYXJlZC9jb250YWluZXJzIiwKICAgICJzZnByZWZpeCI6ICJeJChjcGF0aCkvJChidW5kbGUtaWQpLVthLXowLTldezE2fS0iLAogICAgInNwYXRoIjogIi9ydW4va2F0YS1jb250YWluZXJzL3NhbmRib3gvc3RvcmFnZSIsCiAgICAiaXB2NF9hIjogIigoWzAtOV18WzEtOV1bMC05XXwxWzAtOV17Mn18MlswLTRdWzAtOV18MjVbMC01XSlcXC4pezN9KFswLTldfFsxLTldWzAtOV18MVswLTldezJ9fDJbMC00XVswLTldfDI1WzAtNV0pIiwKICAgICJpcF9wIjogIlswLTldezEsNX0iLAogICAgInN2Y19uYW1lIjogIltBLVpfXFwuXFwtXSsiLAogICAgImRuc19sYWJlbCI6ICJbYS16QS1aMC05X1xcLlxcLV0rIiwKICAgICJzX3NvdXJjZTEiOiAiXi4uMlswLTldezN9X1swLTFdWzAtOV1fWzAtM11bMC05XV9bMC0yXVswLTldX1swLTVdWzAtOV1fWzAtNV1bMC05XVxcLlswLTldezEsMTB9JCIsCiAgICAic19zb3VyY2UyIjogIl4uLmRhdGEvIiwKICAgICJkbnNfc3ViZG9tYWluIjogIl5bYS16MC05XShbLWEtejAtOV0qW2EtejAtOV0pPyQiLAogICAgInBvZF91aWQiOiAiXlswLTlhLWZBLUZdezh9LVswLTlhLWZBLUZdezR9LVswLTlhLWZBLUZdezR9LVswLTlhLWZBLUZdezR9LVswLTlhLWZBLUZdezEyfSQiLAogICAgImRlZmF1bHRfY2FwcyI6IFsKICAgICAgIkNBUF9DSE9XTiIsCiAgICAgICJDQVBfREFDX09WRVJSSURFIiwKICAgICAgIkNBUF9GU0VUSUQiLAogICAgICAiQ0FQX0ZPV05FUiIsCiAgICAgICJDQVBfTUtOT0QiLAogICAgICAiQ0FQX05FVF9SQVciLAogICAgICAiQ0FQX1NFVEdJRCIsCiAgICAgICJDQVBfU0VUVUlEIiwKICAgICAgIkNBUF9TRVRGQ0FQIiwKICAgICAgIkNBUF9TRVRQQ0FQIiwKICAgICAgIkNBUF9ORVRfQklORF9TRVJWSUNFIiwKICAgICAgIkNBUF9TWVNfQ0hST09UIiwKICAgICAgIkNBUF9LSUxMIiwKICAgICAgIkNBUF9BVURJVF9XUklURSIKICAgIF0sCiAgICAicHJpdmlsZWdlZF9jYXBzIjogWwogICAgICAiQ0FQX0NIT1dOIiwKICAgICAgIkNBUF9EQUNfT1ZFUlJJREUiLAogICAgICAiQ0FQX0RBQ19SRUFEX1NFQVJDSCIsCiAgICAgICJDQVBfRk9XTkVSIiwKICAgICAgIkNBUF9GU0VUSUQiLAogICAgICAiQ0FQX0tJTEwiLAogICAgICAiQ0FQX1NFVEdJRCIsCiAgICAgICJDQVBfU0VUVUlEIiwKICAgICAgIkNBUF9TRVRQQ0FQIiwKICAgICAgIkNBUF9MSU5VWF9JTU1VVEFCTEUiLAogICAgICAiQ0FQX05FVF9CSU5EX1NFUlZJQ0UiLAogICAgICAiQ0FQX05FVF9CUk9BRENBU1QiLAogICAgICAiQ0FQX05FVF9BRE1JTiIsCiAgICAgICJDQVBfTkVUX1JBVyIsCiAgICAgICJDQVBfSVBDX0xPQ0siLAogICAgICAiQ0FQX0lQQ19PV05FUiIsCiAgICAgICJDQVBfU1lTX01PRFVMRSIsCiAgICAgICJDQVBfU1lTX1JBV0lPIiwKICAgICAgIkNBUF9TWVNfQ0hST09UIiwKICAgICAgIkNBUF9TWVNfUFRSQUNFIiwKICAgICAgIkNBUF9TWVNfUEFDQ1QiLAogICAgICAiQ0FQX1NZU19BRE1JTiIsCiAgICAgICJDQVBfU1lTX0JPT1QiLAogICAgICAiQ0FQX1NZU19OSUNFIiwKICAgICAgIkNBUF9TWVNfUkVTT1VSQ0UiLAogICAgICAiQ0FQX1NZU19USU1FIiwKICAgICAgIkNBUF9TWVNfVFRZX0NPTkZJRyIsCiAgICAgICJDQVBfTUtOT0QiLAogICAgICAiQ0FQX0xFQVNFIiwKICAgICAgIkNBUF9BVURJVF9XUklURSIsCiAgICAgICJDQVBfQVVESVRfQ09OVFJPTCIsCiAgICAgICJDQVBfU0VURkNBUCIsCiAgICAgICJDQVBfTUFDX09WRVJSSURFIiwKICAgICAgIkNBUF9NQUNfQURNSU4iLAogICAgICAiQ0FQX1NZU0xPRyIsCiAgICAgICJDQVBfV0FLRV9BTEFSTSIsCiAgICAgICJDQVBfQkxPQ0tfU1VTUEVORCIsCiAgICAgICJDQVBfQVVESVRfUkVBRCIsCiAgICAgICJDQVBfUEVSRk1PTiIsCiAgICAgICJDQVBfQlBGIiwKICAgICAgIkNBUF9DSEVDS1BPSU5UX1JFU1RPUkUiCiAgICBdLAogICAgInZpcnRpb19ibGtfc3RvcmFnZV9jbGFzc2VzIjogWwogICAgICAiY2MtbG9jYWwtY3NpIiwKICAgICAgImNjLW1hbmFnZWQtY3NpIiwKICAgICAgImNjLW1hbmFnZWQtcHJlbWl1bS1jc2kiCiAgICBdLAogICAgInNtYl9zdG9yYWdlX2NsYXNzZXMiOiBbCiAgICAgIHsKICAgICAgICAibmFtZSI6ICJhenVyZWZpbGUtY3NpLWthdGEtY2MiLAogICAgICAgICJtb3VudF9vcHRpb25zIjogWwogICAgICAgICAgImRpcl9tb2RlPTA3NzciLAogICAgICAgICAgImZpbGVfbW9kZT0wNzc3IiwKICAgICAgICAgICJtZnN5bWxpbmtzIiwKICAgICAgICAgICJjYWNoZT1zdHJpY3QiLAogICAgICAgICAgIm5vc2hhcmVzb2NrIiwKICAgICAgICAgICJhY3RpbWVvPTMwIiwKICAgICAgICAgICJub2JybCIKICAgICAgICBdCiAgICAgIH0KICAgIF0KICB9LAogICJzYW5kYm94IjogewogICAgInN0b3JhZ2VzIjogWwogICAgICB7CiAgICAgICAgImRyaXZlciI6ICJlcGhlbWVyYWwiLAogICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICJzb3VyY2UiOiAic2htIiwKICAgICAgICAiZnN0eXBlIjogInRtcGZzIiwKICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAibm9kZXYiLAogICAgICAgICAgIm1vZGU9MTc3NyIsCiAgICAgICAgICAic2l6ZT02NzEwODg2NCIKICAgICAgICBdLAogICAgICAgICJtb3VudF9wb2ludCI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L3NobSIsCiAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICB9CiAgICBdCiAgfSwKICAicmVxdWVzdF9kZWZhdWx0cyI6IHsKICAgICJDcmVhdGVDb250YWluZXJSZXF1ZXN0IjogewogICAgICAiYWxsb3dfZW52X3JlZ2V4IjogWwogICAgICAgICJeSE9TVE5BTUU9JChkbnNfbGFiZWwpJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9QT1JUXyQoaXBfcClfVENQPXRjcDovLyQoaXB2NF9hKTokKGlwX3ApJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9QT1JUXyQoaXBfcClfVENQX1BST1RPPXRjcCQiLAogICAgICAgICJeJChzdmNfbmFtZSlfUE9SVF8kKGlwX3ApX1RDUF9QT1JUPSQoaXBfcCkkIiwKICAgICAgICAiXiQoc3ZjX25hbWUpX1BPUlRfJChpcF9wKV9UQ1BfQUREUj0kKGlwdjRfYSkkIiwKICAgICAgICAiXiQoc3ZjX25hbWUpX1NFUlZJQ0VfSE9TVD0kKGlwdjRfYSkkIiwKICAgICAgICAiXiQoc3ZjX25hbWUpX1NFUlZJQ0VfUE9SVD0kKGlwX3ApJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9TRVJWSUNFX1BPUlRfJChkbnNfbGFiZWwpPSQoaXBfcCkkIiwKICAgICAgICAiXiQoc3ZjX25hbWUpX1BPUlQ9dGNwOi8vJChpcHY0X2EpOiQoaXBfcCkkIiwKICAgICAgICAiXkFaVVJFX0NMSUVOVF9JRD1bQS1GYS1mMC05LV0qJCIsCiAgICAgICAgIl5BWlVSRV9URU5BTlRfSUQ9W0EtRmEtZjAtOS1dKiQiLAogICAgICAgICJeQVpVUkVfRkVERVJBVEVEX1RPS0VOX0ZJTEU9L3Zhci9ydW4vc2VjcmV0cy9henVyZS90b2tlbnMvYXp1cmUtaWRlbnRpdHktdG9rZW4kIiwKICAgICAgICAiXkFaVVJFX0FVVEhPUklUWV9IT1NUPWh0dHBzOi8vbG9naW5cXC5taWNyb3NvZnRvbmxpbmVcXC5jb20vJCIsCiAgICAgICAgIl5URVJNPXh0ZXJtJCIKICAgICAgXSwKICAgICAgImFsbG93X2Vudl9yZWdleF9tYXAiOiB7CiAgICAgICAgIkNQVV9MSU1JVCI6ICJeWzAtOV0rJCIsCiAgICAgICAgIkpPQl9DT01QTEVUSU9OX0lOREVYIjogIl5bMC05XSokIiwKICAgICAgICAiTUVNT1JZX0xJTUlUIjogIl5bMC05XSskIgogICAgICB9CiAgICB9LAogICAgIkNvcHlGaWxlUmVxdWVzdCI6IFsKICAgICAgIiQoc2ZwcmVmaXgpIgogICAgXSwKICAgICJFeGVjUHJvY2Vzc1JlcXVlc3QiOiB7CiAgICAgICJhbGxvd2VkX2NvbW1hbmRzIjogW10sCiAgICAgICJyZWdleCI6IFtdCiAgICB9LAogICAgIlVwZGF0ZVJvdXRlc1JlcXVlc3QiOiB7CiAgICAgICJmb3JiaWRkZW5fZGV2aWNlX25hbWVzIjogWwogICAgICAgICJsbyIKICAgICAgXSwKICAgICAgImZvcmJpZGRlbl9zb3VyY2VfcmVnZXgiOiBbCiAgICAgICAgIl4oPzowezAsNH06KXswLDd9MHswLDN9MSQiLAogICAgICAgICJeMTI3XFwuKD86WzAtOV17MSwzfVxcLil7Mn1bMC05XXsxLDN9JCIKICAgICAgXQogICAgfSwKICAgICJVcGRhdGVJbnRlcmZhY2VSZXF1ZXN0IjogewogICAgICAiYWxsb3dfcmF3X2ZsYWdzIjogMTI4LAogICAgICAiZm9yYmlkZGVuX25hbWVzIjogWwogICAgICAgICJsbyIKICAgICAgXSwKICAgICAgImZvcmJpZGRlbl9od19hZGRycyI6IFsKICAgICAgICAiMDA6MDA6MDA6MDA6MDA6MDAiCiAgICAgIF0KICAgIH0sCiAgICAiQ2xvc2VTdGRpblJlcXVlc3QiOiBmYWxzZSwKICAgICJSZWFkU3RyZWFtUmVxdWVzdCI6IGZhbHNlLAogICAgIlVwZGF0ZUVwaGVtZXJhbE1vdW50c1JlcXVlc3QiOiBmYWxzZSwKICAgICJXcml0ZVN0cmVhbVJlcXVlc3QiOiBmYWxzZQogIH0KfQ== + spec: + runtimeClassName: kata-cc + containers: + - name: cassandra + image: "gcr.io/google-samples/cassandra:v13" + volumeMounts: + - mountPath: /cassandra_data + name: data + env: + - name: MAX_HEAP_SIZE + value: 512M + - name: HEAP_NEWSIZE + value: 100M + - name: CASSANDRA_SEED_PROVIDER + value: io.k8s.cassandra.KubernetesSeedProvider + - name: POD_NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace + - name: POD_IP + valueFrom: + fieldRef: + fieldPath: status.podIP + resources: + limits: + cpu: "0.5" + ports: + - containerPort: 7000 + name: intra-node + - containerPort: 7001 + name: tls-intra-node + - containerPort: 7199 + name: jmx + - containerPort: 9042 + name: cql + command: + - /run.sh + volumes: + - name: data + emptyDir: {} diff --git a/src/agent/samples/policy/yaml/kubernetes/incomplete-init/node_ds.yaml b/src/agent/samples/policy/yaml/kubernetes/incomplete-init/node_ds.yaml new file mode 100644 index 000000000000..6e699f4b845f --- /dev/null +++ b/src/agent/samples/policy/yaml/kubernetes/incomplete-init/node_ds.yaml @@ -0,0 +1,115 @@ +--- +apiVersion: apps/v1 +kind: DaemonSet +metadata: + name: csi-gce-pd-node +spec: + selector: + matchLabels: + app: gcp-compute-persistent-disk-csi-driver + template: + metadata: + labels: + app: gcp-compute-persistent-disk-csi-driver + annotations: + io.katacontainers.config.agent.policy: IyBDb3B5cmlnaHQgKGMpIDIwMjMgTWljcm9zb2Z0IENvcnBvcmF0aW9uCiMKIyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMAojCnBhY2thZ2UgYWdlbnRfcG9saWN5CgppbXBvcnQgZnV0dXJlLmtleXdvcmRzLmluCmltcG9ydCBmdXR1cmUua2V5d29yZHMuZXZlcnkKCmltcG9ydCBpbnB1dAoKIyBEZWZhdWx0IHZhbHVlcywgcmV0dXJuZWQgYnkgT1BBIHdoZW4gcnVsZXMgY2Fubm90IGJlIGV2YWx1YXRlZCB0byB0cnVlLgpkZWZhdWx0IEFkZEFSUE5laWdoYm9yc1JlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBBZGRTd2FwUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IENsb3NlU3RkaW5SZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgQ29weUZpbGVSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgQ3JlYXRlQ29udGFpbmVyUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IENyZWF0ZVNhbmRib3hSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgRGVzdHJveVNhbmRib3hSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBFeGVjUHJvY2Vzc1JlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBHZXRPT01FdmVudFJlcXVlc3QgOj0gdHJ1ZQpkZWZhdWx0IEd1ZXN0RGV0YWlsc1JlcXVlc3QgOj0gdHJ1ZQpkZWZhdWx0IExpc3RJbnRlcmZhY2VzUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IExpc3RSb3V0ZXNSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgTWVtSG90cGx1Z0J5UHJvYmVSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgT25saW5lQ1BVTWVtUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgUGF1c2VDb250YWluZXJSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgUmVhZFN0cmVhbVJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBSZW1vdmVDb250YWluZXJSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBSZW1vdmVTdGFsZVZpcnRpb2ZzU2hhcmVNb3VudHNSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBSZXNlZWRSYW5kb21EZXZSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgUmVzdW1lQ29udGFpbmVyUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFNldEd1ZXN0RGF0ZVRpbWVSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgU2V0UG9saWN5UmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFNpZ25hbFByb2Nlc3NSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBTdGFydENvbnRhaW5lclJlcXVlc3QgOj0gdHJ1ZQpkZWZhdWx0IFN0YXJ0VHJhY2luZ1JlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBTdGF0c0NvbnRhaW5lclJlcXVlc3QgOj0gdHJ1ZQpkZWZhdWx0IFN0b3BUcmFjaW5nUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFR0eVdpblJlc2l6ZVJlcXVlc3QgOj0gdHJ1ZQpkZWZhdWx0IFVwZGF0ZUNvbnRhaW5lclJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBVcGRhdGVFcGhlbWVyYWxNb3VudHNSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgVXBkYXRlSW50ZXJmYWNlUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgVXBkYXRlUm91dGVzUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgV2FpdFByb2Nlc3NSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBXcml0ZVN0cmVhbVJlcXVlc3QgOj0gZmFsc2UKCiMgQWxsb3dSZXF1ZXN0c0ZhaWxpbmdQb2xpY3kgOj0gdHJ1ZSBjb25maWd1cmVzIHRoZSBBZ2VudCB0byAqYWxsb3cgYW55CiMgcmVxdWVzdHMgY2F1c2luZyBhIHBvbGljeSBmYWlsdXJlKi4gVGhpcyBpcyBhbiB1bnNlY3VyZSBjb25maWd1cmF0aW9uCiMgYnV0IGlzIHVzZWZ1bCBmb3IgYWxsb3dpbmcgdW5zZWN1cmUgcG9kcyB0byBzdGFydCwgdGhlbiBjb25uZWN0IHRvCiMgdGhlbSBhbmQgaW5zcGVjdCBPUEEgbG9ncyBmb3IgdGhlIHJvb3QgY2F1c2Ugb2YgYSBmYWlsdXJlLgpkZWZhdWx0IEFsbG93UmVxdWVzdHNGYWlsaW5nUG9saWN5IDo9IGZhbHNlCgojIENvbnN0YW50cwpTX05BTUVfS0VZID0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZSIKU19OQU1FU1BBQ0VfS0VZID0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZXNwYWNlIgoKQ3JlYXRlQ29udGFpbmVyUmVxdWVzdCB7CiAgICAjIENoZWNrIGlmIHRoZSBpbnB1dCByZXF1ZXN0IHNob3VsZCBiZSByZWplY3RlZCBldmVuIGJlZm9yZSBjaGVja2luZyB0aGUKICAgICMgcG9saWN5X2RhdGEuY29udGFpbmVycyBpbmZvcm1hdGlvbi4KICAgIGFsbG93X2NyZWF0ZV9jb250YWluZXJfaW5wdXQKCiAgICBpX29jaSA6PSBpbnB1dC5PQ0kKICAgIGlfc3RvcmFnZXMgOj0gaW5wdXQuc3RvcmFnZXMKCiAgICAjIENoZWNrIGlmIGFueSBlbGVtZW50IGZyb20gdGhlIHBvbGljeV9kYXRhLmNvbnRhaW5lcnMgYXJyYXkgYWxsb3dzIHRoZSBpbnB1dCByZXF1ZXN0LgogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBwcmludCgiPT09PT09PT0gQ3JlYXRlQ29udGFpbmVyUmVxdWVzdDogdHJ5aW5nIG5leHQgcG9saWN5IGNvbnRhaW5lciIpCgogICAgcF9waWRucyA6PSBwX2NvbnRhaW5lci5zYW5kYm94X3BpZG5zCiAgICBpX3BpZG5zIDo9IGlucHV0LnNhbmRib3hfcGlkbnMKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0OiBwX3BpZG5zID0iLCBwX3BpZG5zLCAiaV9waWRucyA9IiwgaV9waWRucykKICAgIHBfcGlkbnMgPT0gaV9waWRucwoKICAgIHBfb2NpIDo9IHBfY29udGFpbmVyLk9DSQoKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0OiBwIFZlcnNpb24gPSIsIHBfb2NpLlZlcnNpb24sICJpIFZlcnNpb24gPSIsIGlfb2NpLlZlcnNpb24pCiAgICBwX29jaS5WZXJzaW9uID09IGlfb2NpLlZlcnNpb24KCiAgICBwcmludCgiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdDogcCBSZWFkb25seSA9IiwgcF9vY2kuUm9vdC5SZWFkb25seSwgImkgUmVhZG9ubHkgPSIsIGlfb2NpLlJvb3QuUmVhZG9ubHkpCiAgICBwX29jaS5Sb290LlJlYWRvbmx5ID09IGlfb2NpLlJvb3QuUmVhZG9ubHkKCiAgICBhbGxvd19hbm5vKHBfb2NpLCBpX29jaSkKCiAgICBwX3N0b3JhZ2VzIDo9IHBfY29udGFpbmVyLnN0b3JhZ2VzCiAgICBhbGxvd19ieV9hbm5vKHBfb2NpLCBpX29jaSwgcF9zdG9yYWdlcywgaV9zdG9yYWdlcykKCiAgICBhbGxvd19saW51eChwX29jaSwgaV9vY2kpCgogICAgcHJpbnQoIkNyZWF0ZUNvbnRhaW5lclJlcXVlc3Q6IHRydWUiKQp9CgphbGxvd19jcmVhdGVfY29udGFpbmVyX2lucHV0IHsKICAgIHByaW50KCJhbGxvd19jcmVhdGVfY29udGFpbmVyX2lucHV0OiBpbnB1dCA9IiwgaW5wdXQpCgogICAgY291bnQoaW5wdXQuc2hhcmVkX21vdW50cykgPT0gMAogICAgaXNfbnVsbChpbnB1dC5zdHJpbmdfdXNlcikKCiAgICBpX29jaSA6PSBpbnB1dC5PQ0kKICAgIGlzX251bGwoaV9vY2kuSG9va3MpCiAgICBpc19udWxsKGlfb2NpLlNvbGFyaXMpCiAgICBpc19udWxsKGlfb2NpLldpbmRvd3MpCgogICAgaV9saW51eCA6PSBpX29jaS5MaW51eAogICAgY291bnQoaV9saW51eC5HSURNYXBwaW5ncykgPT0gMAogICAgY291bnQoaV9saW51eC5Nb3VudExhYmVsKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlJlc291cmNlcy5EZXZpY2VzKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlJvb3Rmc1Byb3BhZ2F0aW9uKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlVJRE1hcHBpbmdzKSA9PSAwCiAgICBpc19udWxsKGlfbGludXguSW50ZWxSZHQpCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLkJsb2NrSU8pCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLk5ldHdvcmspCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLlBpZHMpCiAgICBpc19udWxsKGlfbGludXguU2VjY29tcCkKICAgIGlfbGludXguU3lzY3RsID09IHt9CgogICAgaV9wcm9jZXNzIDo9IGlfb2NpLlByb2Nlc3MKICAgIGNvdW50KGlfcHJvY2Vzcy5TZWxpbnV4TGFiZWwpID09IDAKICAgIGNvdW50KGlfcHJvY2Vzcy5Vc2VyLlVzZXJuYW1lKSA9PSAwCgogICAgcHJpbnQoImFsbG93X2NyZWF0ZV9jb250YWluZXJfaW5wdXQ6IHRydWUiKQp9CgojIFJlamVjdCB1bmV4cGVjdGVkIGFubm90YXRpb25zLgphbGxvd19hbm5vKHBfb2NpLCBpX29jaSkgewogICAgcHJpbnQoImFsbG93X2Fubm8gMTogc3RhcnQiKQoKICAgIG5vdCBpX29jaS5Bbm5vdGF0aW9ucwoKICAgIHByaW50KCJhbGxvd19hbm5vIDE6IHRydWUiKQp9CmFsbG93X2Fubm8ocF9vY2ksIGlfb2NpKSB7CiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiBwIEFubm90YXRpb25zID0iLCBwX29jaS5Bbm5vdGF0aW9ucykKICAgIHByaW50KCJhbGxvd19hbm5vIDI6IGkgQW5ub3RhdGlvbnMgPSIsIGlfb2NpLkFubm90YXRpb25zKQoKICAgIGlfa2V5cyA6PSBvYmplY3Qua2V5cyhpX29jaS5Bbm5vdGF0aW9ucykKICAgIHByaW50KCJhbGxvd19hbm5vIDI6IGkga2V5cyA9IiwgaV9rZXlzKQoKICAgIGV2ZXJ5IGlfa2V5IGluIGlfa2V5cyB7CiAgICAgICAgYWxsb3dfYW5ub19rZXkoaV9rZXksIHBfb2NpKQogICAgfQoKICAgIHByaW50KCJhbGxvd19hbm5vIDI6IHRydWUiKQp9CgphbGxvd19hbm5vX2tleShpX2tleSwgcF9vY2kpIHsKICAgIHByaW50KCJhbGxvd19hbm5vX2tleSAxOiBpIGtleSA9IiwgaV9rZXkpCgogICAgc3RhcnRzd2l0aChpX2tleSwgImlvLmt1YmVybmV0ZXMuY3JpLiIpCgogICAgcHJpbnQoImFsbG93X2Fubm9fa2V5IDE6IHRydWUiKQp9CmFsbG93X2Fubm9fa2V5KGlfa2V5LCBwX29jaSkgewogICAgcHJpbnQoImFsbG93X2Fubm9fa2V5IDI6IGkga2V5ID0iLCBpX2tleSkKCiAgICBzb21lIHBfa2V5LCBfIGluIHBfb2NpLkFubm90YXRpb25zCiAgICBwX2tleSA9PSBpX2tleQoKICAgIHByaW50KCJhbGxvd19hbm5vX2tleSAyOiB0cnVlIikKfQoKIyBHZXQgdGhlIHZhbHVlIG9mIHRoZSBTX05BTUVfS0VZIGFubm90YXRpb24gYW5kCiMgY29ycmVsYXRlIGl0IHdpdGggb3RoZXIgYW5ub3RhdGlvbnMgYW5kIHByb2Nlc3MgZmllbGRzLgphbGxvd19ieV9hbm5vKHBfb2NpLCBpX29jaSwgcF9zdG9yYWdlcywgaV9zdG9yYWdlcykgewogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMTogc3RhcnQiKQoKICAgIG5vdCBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQoKICAgIGlfc19uYW1lIDo9IGlfb2NpLkFubm90YXRpb25zW1NfTkFNRV9LRVldCiAgICBwcmludCgiYWxsb3dfYnlfYW5ubyAxOiBpX3NfbmFtZSA9IiwgaV9zX25hbWUpCgogICAgYWxsb3dfYnlfc2FuZGJveF9uYW1lKHBfb2NpLCBpX29jaSwgcF9zdG9yYWdlcywgaV9zdG9yYWdlcywgaV9zX25hbWUpCgogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMTogdHJ1ZSIpCn0KYWxsb3dfYnlfYW5ubyhwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpIHsKICAgIHByaW50KCJhbGxvd19ieV9hbm5vIDI6IHN0YXJ0IikKCiAgICBwX3NfbmFtZSA6PSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgaV9zX25hbWUgOj0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FX0tFWV0KICAgIHByaW50KCJhbGxvd19ieV9hbm5vIDI6IGlfc19uYW1lID0iLCBpX3NfbmFtZSwgInBfc19uYW1lID0iLCBwX3NfbmFtZSkKCiAgICBhbGxvd19zYW5kYm94X25hbWUocF9zX25hbWUsIGlfc19uYW1lKQogICAgYWxsb3dfYnlfc2FuZGJveF9uYW1lKHBfb2NpLCBpX29jaSwgcF9zdG9yYWdlcywgaV9zdG9yYWdlcywgaV9zX25hbWUpCgogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMjogdHJ1ZSIpCn0KCmFsbG93X2J5X3NhbmRib3hfbmFtZShwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMsIHNfbmFtZSkgewogICAgcHJpbnQoImFsbG93X2J5X3NhbmRib3hfbmFtZTogc3RhcnQiKQoKICAgIHBfbmFtZXNwYWNlIDo9IHBfb2NpLkFubm90YXRpb25zW1NfTkFNRVNQQUNFX0tFWV0KICAgIGlfbmFtZXNwYWNlIDo9IGlfb2NpLkFubm90YXRpb25zW1NfTkFNRVNQQUNFX0tFWV0KICAgIHByaW50KCJhbGxvd19ieV9zYW5kYm94X25hbWU6IHBfbmFtZXNwYWNlID0iLCBwX25hbWVzcGFjZSwgImlfbmFtZXNwYWNlID0iLCBpX25hbWVzcGFjZSkKICAgIHBfbmFtZXNwYWNlID09IGlfbmFtZXNwYWNlCgogICAgYWxsb3dfYnlfY29udGFpbmVyX3R5cGVzKHBfb2NpLCBpX29jaSwgc19uYW1lLCBwX25hbWVzcGFjZSkKICAgIGFsbG93X2J5X2J1bmRsZV9vcl9zYW5kYm94X2lkKHBfb2NpLCBpX29jaSwgcF9zdG9yYWdlcywgaV9zdG9yYWdlcykKICAgIGFsbG93X3Byb2Nlc3MocF9vY2kuUHJvY2VzcywgaV9vY2kuUHJvY2Vzcywgc19uYW1lKQoKICAgIHByaW50KCJhbGxvd19ieV9zYW5kYm94X25hbWU6IHRydWUiKQp9CgphbGxvd19zYW5kYm94X25hbWUocF9zX25hbWUsIGlfc19uYW1lKSB7CiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9uYW1lIDE6IHN0YXJ0IikKCiAgICBwX3NfbmFtZSA9PSBpX3NfbmFtZQoKICAgIHByaW50KCJhbGxvd19zYW5kYm94X25hbWUgMTogdHJ1ZSIpCn0KYWxsb3dfc2FuZGJveF9uYW1lKHBfc19uYW1lLCBpX3NfbmFtZSkgewogICAgcHJpbnQoImFsbG93X3NhbmRib3hfbmFtZSAyOiBzdGFydCIpCgogICAgIyBUT0RPOiBzaG91bGQgZ2VuZXJhdGVkIG5hbWVzIGJlIGhhbmRsZWQgZGlmZmVyZW50bHk/CiAgICBjb250YWlucyhwX3NfbmFtZSwgIiQoZ2VuZXJhdGVkLW5hbWUpIikKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9uYW1lIDI6IHRydWUiKQp9CgojIENoZWNrIHRoYXQgdGhlICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSIgYW5kCiMgImlvLmthdGFjb250YWluZXJzLnBrZy5vY2kuY29udGFpbmVyX3R5cGUiIGFubm90YXRpb25zIGRlc2lnbmF0ZSB0aGUKIyBleHBlY3RlZCB0eXBlIC0gZWl0aGVyIGEgInNhbmRib3giIG9yIGEgImNvbnRhaW5lciIuIFRoZW4sIHZhbGlkYXRlCiMgb3RoZXIgYW5ub3RhdGlvbnMgYmFzZWQgb24gdGhlIGFjdHVhbCAic2FuZGJveCIgb3IgImNvbnRhaW5lciIgdmFsdWUKIyBmcm9tIHRoZSBpbnB1dCBjb250YWluZXIuCmFsbG93X2J5X2NvbnRhaW5lcl90eXBlcyhwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZXM6IGNoZWNraW5nIGlvLmt1YmVybmV0ZXMuY3JpLmNvbnRhaW5lci10eXBlIikKCiAgICBjX3R5cGUgOj0gImlvLmt1YmVybmV0ZXMuY3JpLmNvbnRhaW5lci10eXBlIgogICAgCiAgICBwX2NyaV90eXBlIDo9IHBfb2NpLkFubm90YXRpb25zW2NfdHlwZV0KICAgIGlfY3JpX3R5cGUgOj0gaV9vY2kuQW5ub3RhdGlvbnNbY190eXBlXQogICAgcHJpbnQoImFsbG93X2J5X2NvbnRhaW5lcl90eXBlczogcF9jcmlfdHlwZSA9IiwgcF9jcmlfdHlwZSwgImlfY3JpX3R5cGUgPSIsIGlfY3JpX3R5cGUpCiAgICBwX2NyaV90eXBlID09IGlfY3JpX3R5cGUKCiAgICBhbGxvd19ieV9jb250YWluZXJfdHlwZShpX2NyaV90eXBlLCBwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpCgogICAgcHJpbnQoImFsbG93X2J5X2NvbnRhaW5lcl90eXBlczogdHJ1ZSIpCn0KCmFsbG93X2J5X2NvbnRhaW5lcl90eXBlKGlfY3JpX3R5cGUsIHBfb2NpLCBpX29jaSwgc19uYW1lLCBzX25hbWVzcGFjZSkgewogICAgcHJpbnQoImFsbG93X2J5X2NvbnRhaW5lcl90eXBlIDE6IGlfY3JpX3R5cGUgPSIsIGlfY3JpX3R5cGUpCiAgICBpX2NyaV90eXBlID09ICJzYW5kYm94IgoKICAgIGlfa2F0YV90eXBlIDo9IGlfb2NpLkFubm90YXRpb25zWyJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIl0KICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAxOiBpX2thdGFfdHlwZSA9IiwgaV9rYXRhX3R5cGUpCiAgICBpX2thdGFfdHlwZSA9PSAicG9kX3NhbmRib3giCgogICAgYWxsb3dfc2FuZGJveF9jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpCiAgICBhbGxvd19zYW5kYm94X25ldF9uYW1lc3BhY2UocF9vY2ksIGlfb2NpKQogICAgYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5KHBfb2NpLCBpX29jaSwgc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfYnlfY29udGFpbmVyX3R5cGUgMTogdHJ1ZSIpCn0KCmFsbG93X2J5X2NvbnRhaW5lcl90eXBlKGlfY3JpX3R5cGUsIHBfb2NpLCBpX29jaSwgc19uYW1lLCBzX25hbWVzcGFjZSkgewogICAgcHJpbnQoImFsbG93X2J5X2NvbnRhaW5lcl90eXBlIDI6IGlfY3JpX3R5cGUgPSIsIGlfY3JpX3R5cGUpCiAgICBpX2NyaV90eXBlID09ICJjb250YWluZXIiCgogICAgaV9rYXRhX3R5cGUgOj0gaV9vY2kuQW5ub3RhdGlvbnNbImlvLmthdGFjb250YWluZXJzLnBrZy5vY2kuY29udGFpbmVyX3R5cGUiXQogICAgcHJpbnQoImFsbG93X2J5X2NvbnRhaW5lcl90eXBlIDI6IGlfa2F0YV90eXBlID0iLCBpX2thdGFfdHlwZSkKICAgIGlfa2F0YV90eXBlID09ICJwb2RfY29udGFpbmVyIgoKICAgIGFsbG93X2NvbnRhaW5lcl9uYW1lKHBfb2NpLCBpX29jaSkKICAgIGFsbG93X25ldF9uYW1lc3BhY2UocF9vY2ksIGlfb2NpKQogICAgYWxsb3dfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2kpCgogICAgcHJpbnQoImFsbG93X2J5X2NvbnRhaW5lcl90eXBlIDI6IHRydWUiKQp9CgojICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItbmFtZSIgYW5ub3RhdGlvbgphbGxvd19zYW5kYm94X2NvbnRhaW5lcl9uYW1lKHBfb2NpLCBpX29jaSkgewogICAgcHJpbnQoImFsbG93X3NhbmRib3hfY29udGFpbmVyX25hbWU6IHN0YXJ0IikKCiAgICBjb250YWluZXJfYW5ub3RhdGlvbl9taXNzaW5nKHBfb2NpLCBpX29jaSwgImlvLmt1YmVybmV0ZXMuY3JpLmNvbnRhaW5lci1uYW1lIikKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9jb250YWluZXJfbmFtZTogdHJ1ZSIpCn0KCmFsbG93X2NvbnRhaW5lcl9uYW1lKHBfb2NpLCBpX29jaSkgewogICAgcHJpbnQoImFsbG93X2NvbnRhaW5lcl9uYW1lOiBzdGFydCIpCgogICAgYWxsb3dfY29udGFpbmVyX2Fubm90YXRpb24ocF9vY2ksIGlfb2NpLCAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLW5hbWUiKQoKICAgIHByaW50KCJhbGxvd19jb250YWluZXJfbmFtZTogdHJ1ZSIpCn0KCmNvbnRhaW5lcl9hbm5vdGF0aW9uX21pc3NpbmcocF9vY2ksIGlfb2NpLCBrZXkpIHsKICAgIHByaW50KCJjb250YWluZXJfYW5ub3RhdGlvbl9taXNzaW5nOiIsIGtleSkKCiAgICBub3QgcF9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgbm90IGlfb2NpLkFubm90YXRpb25zW2tleV0KCiAgICBwcmludCgiY29udGFpbmVyX2Fubm90YXRpb25fbWlzc2luZzogdHJ1ZSIpCn0KCmFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uKHBfb2NpLCBpX29jaSwga2V5KSB7CiAgICBwcmludCgiYWxsb3dfY29udGFpbmVyX2Fubm90YXRpb246IGtleSA9Iiwga2V5KQoKICAgIHBfdmFsdWUgOj0gcF9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgaV92YWx1ZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICBwcmludCgiYWxsb3dfY29udGFpbmVyX2Fubm90YXRpb246IHBfdmFsdWUgPSIsIHBfdmFsdWUsICJpX3ZhbHVlID0iLCBpX3ZhbHVlKQoKICAgIHBfdmFsdWUgPT0gaV92YWx1ZQoKICAgIHByaW50KCJhbGxvd19jb250YWluZXJfYW5ub3RhdGlvbjogdHJ1ZSIpCn0KCiMgIm5lcmRjdGwvbmV0d29yay1uYW1lc3BhY2UiIGFubm90YXRpb24KYWxsb3dfc2FuZGJveF9uZXRfbmFtZXNwYWNlKHBfb2NpLCBpX29jaSkgewogICAgcHJpbnQoImFsbG93X3NhbmRib3hfbmV0X25hbWVzcGFjZTogc3RhcnQiKQoKICAgIGtleSA6PSAibmVyZGN0bC9uZXR3b3JrLW5hbWVzcGFjZSIKCiAgICBwX25hbWVzcGFjZSA6PSBwX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICBpX25hbWVzcGFjZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9uZXRfbmFtZXNwYWNlOiBwX25hbWVzcGFjZSA9IiwgcF9uYW1lc3BhY2UsICJpX25hbWVzcGFjZSA9IiwgaV9uYW1lc3BhY2UpCgogICAgcmVnZXgubWF0Y2gocF9uYW1lc3BhY2UsIGlfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd19zYW5kYm94X25ldF9uYW1lc3BhY2U6IHRydWUiKQp9CgphbGxvd19uZXRfbmFtZXNwYWNlKHBfb2NpLCBpX29jaSkgewogICAgcHJpbnQoImFsbG93X25ldF9uYW1lc3BhY2U6IHN0YXJ0IikKCiAgICBrZXkgOj0gIm5lcmRjdGwvbmV0d29yay1uYW1lc3BhY2UiCgogICAgbm90IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIG5vdCBpX29jaS5Bbm5vdGF0aW9uc1trZXldCgogICAgcHJpbnQoImFsbG93X25ldF9uYW1lc3BhY2U6IHRydWUiKQp9CgojICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWxvZy1kaXJlY3RvcnkiIGFubm90YXRpb24KYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5KHBfb2NpLCBpX29jaSwgc19uYW1lLCBzX25hbWVzcGFjZSkgewogICAgcHJpbnQoImFsbG93X3NhbmRib3hfbG9nX2RpcmVjdG9yeTogc3RhcnQiKQoKICAgIGtleSA6PSAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1sb2ctZGlyZWN0b3J5IgoKICAgIHBfZGlyIDo9IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIHJlZ2V4MSA6PSByZXBsYWNlKHBfZGlyLCAiJChzYW5kYm94LW5hbWUpIiwgc19uYW1lKQogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzYW5kYm94LW5hbWVzcGFjZSkiLCBzX25hbWVzcGFjZSkKICAgIHByaW50KCJhbGxvd19zYW5kYm94X2xvZ19kaXJlY3Rvcnk6IHJlZ2V4MiA9IiwgcmVnZXgyKQoKICAgIGlfZGlyIDo9IGlfb2NpLkFubm90YXRpb25zW2tleV0KICAgIHByaW50KCJhbGxvd19zYW5kYm94X2xvZ19kaXJlY3Rvcnk6IGlfZGlyID0iLCBpX2RpcikKCiAgICByZWdleC5tYXRjaChyZWdleDIsIGlfZGlyKQoKICAgIHByaW50KCJhbGxvd19zYW5kYm94X2xvZ19kaXJlY3Rvcnk6IHRydWUiKQp9CgphbGxvd19sb2dfZGlyZWN0b3J5KHBfb2NpLCBpX29jaSkgewogICAgcHJpbnQoImFsbG93X2xvZ19kaXJlY3Rvcnk6IHN0YXJ0IikKCiAgICBrZXkgOj0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbG9nLWRpcmVjdG9yeSIKCiAgICBub3QgcF9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgbm90IGlfb2NpLkFubm90YXRpb25zW2tleV0KCiAgICBwcmludCgiYWxsb3dfbG9nX2RpcmVjdG9yeTogdHJ1ZSIpCn0KCmFsbG93X2xpbnV4KHBfb2NpLCBpX29jaSkgewogICAgcF9uYW1lc3BhY2VzIDo9IHBfb2NpLkxpbnV4Lk5hbWVzcGFjZXMKICAgIHByaW50KCJhbGxvd19saW51eDogcCBuYW1lc3BhY2VzID0iLCBwX25hbWVzcGFjZXMpCgogICAgaV9uYW1lc3BhY2VzIDo9IGlfb2NpLkxpbnV4Lk5hbWVzcGFjZXMKICAgIHByaW50KCJhbGxvd19saW51eDogaSBuYW1lc3BhY2VzID0iLCBpX25hbWVzcGFjZXMpCgogICAgcF9uYW1lc3BhY2VzID09IGlfbmFtZXNwYWNlcwoKICAgIGFsbG93X21hc2tlZF9wYXRocyhwX29jaSwgaV9vY2kpCiAgICBhbGxvd19yZWFkb25seV9wYXRocyhwX29jaSwgaV9vY2kpCgogICAgcHJpbnQoImFsbG93X2xpbnV4OiB0cnVlIikKfQoKYWxsb3dfbWFza2VkX3BhdGhzKHBfb2NpLCBpX29jaSkgewogICAgcF9wYXRocyA6PSBwX29jaS5MaW51eC5NYXNrZWRQYXRocwogICAgcHJpbnQoImFsbG93X21hc2tlZF9wYXRocyAxOiBwX3BhdGhzID0iLCBwX3BhdGhzKQoKICAgIGlfcGF0aHMgOj0gaV9vY2kuTGludXguTWFza2VkUGF0aHMKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aHMgMTogaV9wYXRocyA9IiwgaV9wYXRocykKCiAgICBhbGxvd19tYXNrZWRfcGF0aHNfYXJyYXkocF9wYXRocywgaV9wYXRocykKCiAgICBwcmludCgiYWxsb3dfbWFza2VkX3BhdGhzIDE6IHRydWUiKQp9CmFsbG93X21hc2tlZF9wYXRocyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aHMgMjogc3RhcnQiKQoKICAgIG5vdCBwX29jaS5MaW51eC5NYXNrZWRQYXRocwogICAgbm90IGlfb2NpLkxpbnV4Lk1hc2tlZFBhdGhzCgogICAgcHJpbnQoImFsbG93X21hc2tlZF9wYXRocyAyOiB0cnVlIikKfQoKIyBBbGwgdGhlIHBvbGljeSBtYXNrZWQgcGF0aHMgbXVzdCBiZSBtYXNrZWQgaW4gdGhlIGlucHV0IGRhdGEgdG9vLgojIElucHV0IGlzIGFsbG93ZWQgdG8gaGF2ZSBtb3JlIG1hc2tlZCBwYXRocyB0aGFuIHRoZSBwb2xpY3kuCmFsbG93X21hc2tlZF9wYXRoc19hcnJheShwX2FycmF5LCBpX2FycmF5KSB7CiAgICBldmVyeSBwX2VsZW0gaW4gcF9hcnJheSB7CiAgICAgICAgYWxsb3dfbWFza2VkX3BhdGgocF9lbGVtLCBpX2FycmF5KQogICAgfQp9CgphbGxvd19tYXNrZWRfcGF0aChwX2VsZW0sIGlfYXJyYXkpIHsKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aDogcF9lbGVtID0iLCBwX2VsZW0pCgogICAgc29tZSBpX2VsZW0gaW4gaV9hcnJheQogICAgcF9lbGVtID09IGlfZWxlbQoKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aDogdHJ1ZSIpCn0KCmFsbG93X3JlYWRvbmx5X3BhdGhzKHBfb2NpLCBpX29jaSkgewogICAgcF9wYXRocyA6PSBwX29jaS5MaW51eC5SZWFkb25seVBhdGhzCiAgICBwcmludCgiYWxsb3dfcmVhZG9ubHlfcGF0aHMgMTogcF9wYXRocyA9IiwgcF9wYXRocykKCiAgICBpX3BhdGhzIDo9IGlfb2NpLkxpbnV4LlJlYWRvbmx5UGF0aHMKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAxOiBpX3BhdGhzID0iLCBpX3BhdGhzKQoKICAgIGFsbG93X3JlYWRvbmx5X3BhdGhzX2FycmF5KHBfcGF0aHMsIGlfcGF0aHMsIGlfb2NpLkxpbnV4Lk1hc2tlZFBhdGhzKQoKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAxOiB0cnVlIikKfQphbGxvd19yZWFkb25seV9wYXRocyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAyOiBzdGFydCIpCgogICAgbm90IHBfb2NpLkxpbnV4LlJlYWRvbmx5UGF0aHMKICAgIG5vdCBpX29jaS5MaW51eC5SZWFkb25seVBhdGhzCgogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGhzIDI6IHRydWUiKQp9CgojIEFsbCB0aGUgcG9saWN5IHJlYWRvbmx5IHBhdGhzIG11c3QgYmUgZWl0aGVyOgojIC0gUHJlc2VudCBpbiB0aGUgaW5wdXQgcmVhZG9ubHkgcGF0aHMsIG9yCiMgLSBQcmVzZW50IGluIHRoZSBpbnB1dCBtYXNrZWQgcGF0aHMuCiMgSW5wdXQgaXMgYWxsb3dlZCB0byBoYXZlIG1vcmUgcmVhZG9ubHkgcGF0aHMgdGhhbiB0aGUgcG9saWN5LgphbGxvd19yZWFkb25seV9wYXRoc19hcnJheShwX2FycmF5LCBpX2FycmF5LCBtYXNrZWRfcGF0aHMpIHsKICAgIGV2ZXJ5IHBfZWxlbSBpbiBwX2FycmF5IHsKICAgICAgICBhbGxvd19yZWFkb25seV9wYXRoKHBfZWxlbSwgaV9hcnJheSwgbWFza2VkX3BhdGhzKQogICAgfQp9CgphbGxvd19yZWFkb25seV9wYXRoKHBfZWxlbSwgaV9hcnJheSwgbWFza2VkX3BhdGhzKSB7CiAgICBwcmludCgiYWxsb3dfcmVhZG9ubHlfcGF0aCAxOiBwX2VsZW0gPSIsIHBfZWxlbSkKCiAgICBzb21lIGlfZWxlbSBpbiBpX2FycmF5CiAgICBwX2VsZW0gPT0gaV9lbGVtCgogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGggMTogdHJ1ZSIpCn0KYWxsb3dfcmVhZG9ubHlfcGF0aChwX2VsZW0sIGlfYXJyYXksIG1hc2tlZF9wYXRocykgewogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGggMjogcF9lbGVtID0iLCBwX2VsZW0pCgogICAgc29tZSBpX21hc2tlZCBpbiBtYXNrZWRfcGF0aHMKICAgIHBfZWxlbSA9PSBpX21hc2tlZAoKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRoIDI6IHRydWUiKQp9CgojIENoZWNrIHRoZSBjb25zaXN0ZW5jeSBvZiB0aGUgaW5wdXQgImlvLmthdGFjb250YWluZXJzLnBrZy5vY2kuYnVuZGxlX3BhdGgiCiMgYW5kIGlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtaWQiIHZhbHVlcyB3aXRoIG90aGVyIGZpZWxkcy4KYWxsb3dfYnlfYnVuZGxlX29yX3NhbmRib3hfaWQocF9vY2ksIGlfb2NpLCBwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzKSB7CiAgICBwcmludCgiYWxsb3dfYnlfYnVuZGxlX29yX3NhbmRib3hfaWQ6IHN0YXJ0IikKCiAgICBidW5kbGVfcGF0aCA6PSBpX29jaS5Bbm5vdGF0aW9uc1siaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5idW5kbGVfcGF0aCJdCiAgICBidW5kbGVfaWQgOj0gcmVwbGFjZShidW5kbGVfcGF0aCwgIi9ydW4vY29udGFpbmVyZC9pby5jb250YWluZXJkLnJ1bnRpbWUudjIudGFzay9rOHMuaW8vIiwgIiIpCgogICAga2V5IDo9ICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWlkIgoKICAgIHBfcmVnZXggOj0gcF9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgc2FuZGJveF9pZCA6PSBpX29jaS5Bbm5vdGF0aW9uc1trZXldCgogICAgcHJpbnQoImFsbG93X2J5X2J1bmRsZV9vcl9zYW5kYm94X2lkOiBzYW5kYm94X2lkID0iLCBzYW5kYm94X2lkLCAicmVnZXggPSIsIHBfcmVnZXgpCiAgICByZWdleC5tYXRjaChwX3JlZ2V4LCBzYW5kYm94X2lkKQoKICAgIGFsbG93X3Jvb3RfcGF0aChwX29jaSwgaV9vY2ksIGJ1bmRsZV9pZCkKCiAgICBldmVyeSBpX21vdW50IGluIGlucHV0Lk9DSS5Nb3VudHMgewogICAgICAgIGFsbG93X21vdW50KHBfb2NpLCBpX21vdW50LCBidW5kbGVfaWQsIHNhbmRib3hfaWQpCiAgICB9CgogICAgYWxsb3dfc3RvcmFnZXMocF9zdG9yYWdlcywgaV9zdG9yYWdlcywgYnVuZGxlX2lkLCBzYW5kYm94X2lkKQoKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogdHJ1ZSIpCn0KCmFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHByaW50KCJhbGxvd19wcm9jZXNzX2NvbW1vbjogcF9wcm9jZXNzID0iLCBwX3Byb2Nlc3MpCiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IGlfcHJvY2VzcyA9ICIsIGlfcHJvY2VzcykKICAgIHByaW50KCJhbGxvd19wcm9jZXNzX2NvbW1vbjogc19uYW1lID0iLCBzX25hbWUpCgogICAgcF9wcm9jZXNzLkN3ZCA9PSBpX3Byb2Nlc3MuQ3dkCiAgICBwX3Byb2Nlc3MuTm9OZXdQcml2aWxlZ2VzID09IGlfcHJvY2Vzcy5Ob05ld1ByaXZpbGVnZXMKCiAgICBhbGxvd191c2VyKHBfcHJvY2VzcywgaV9wcm9jZXNzKQogICAgYWxsb3dfZW52KHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUpCgogICAgcHJpbnQoImFsbG93X3Byb2Nlc3NfY29tbW9uOiB0cnVlIikKfQoKIyBDb21wYXJlIHRoZSBPQ0kgUHJvY2VzcyBmaWVsZCBvZiBhIHBvbGljeSBjb250YWluZXIgd2l0aCB0aGUgaW5wdXQgT0NJIFByb2Nlc3MgZnJvbSBhIENyZWF0ZUNvbnRhaW5lclJlcXVlc3QKYWxsb3dfcHJvY2VzcyhwX3Byb2Nlc3MsIGlfcHJvY2Vzcywgc19uYW1lKSB7CiAgICBwcmludCgiYWxsb3dfcHJvY2Vzczogc3RhcnQiKQoKICAgIGFsbG93X2FyZ3MocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSkKICAgIGFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUpCiAgICBhbGxvd19jYXBzKHBfcHJvY2Vzcy5DYXBhYmlsaXRpZXMsIGlfcHJvY2Vzcy5DYXBhYmlsaXRpZXMpCiAgICBwX3Byb2Nlc3MuVGVybWluYWwgPT0gaV9wcm9jZXNzLlRlcm1pbmFsCgogICAgcHJpbnQoImFsbG93X3Byb2Nlc3M6IHRydWUiKQp9CgojIENvbXBhcmUgdGhlIE9DSSBQcm9jZXNzIGZpZWxkIG9mIGEgcG9saWN5IGNvbnRhaW5lciB3aXRoIHRoZSBpbnB1dCBwcm9jZXNzIGZpZWxkIGZyb20gRXhlY1Byb2Nlc3NSZXF1ZXN0CmFsbG93X2ludGVyYWN0aXZlX3Byb2Nlc3MocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSkgewogICAgcHJpbnQoImFsbG93X2ludGVyYWN0aXZlX3Byb2Nlc3M6IHN0YXJ0IikKCiAgICBhbGxvd19wcm9jZXNzX2NvbW1vbihwX3Byb2Nlc3MsIGlfcHJvY2Vzcywgc19uYW1lKQogICAgYWxsb3dfZXhlY19jYXBzKGlfcHJvY2Vzcy5DYXBhYmlsaXRpZXMpCgogICAgIyBUaGVzZSBhcmUgY29tbWFuZHMgZW5hYmxlZCB1c2luZyBFeGVjUHJvY2Vzc1JlcXVlc3QgY29tbWFuZHMgYW5kL29yIHJlZ2V4IGZyb20gdGhlIHNldHRpbmdzIGZpbGUuCiAgICAjIFRoZXkgY2FuIGJlIGV4ZWN1dGVkIGludGVyYWN0aXZlbHkgc28gYWxsb3cgdGhlbSB0byB1c2UgYW55IHZhbHVlIGZvciBpX3Byb2Nlc3MuVGVybWluYWwuCgogICAgcHJpbnQoImFsbG93X2ludGVyYWN0aXZlX3Byb2Nlc3M6IHRydWUiKQp9CgojIENvbXBhcmUgdGhlIE9DSSBQcm9jZXNzIGZpZWxkIG9mIGEgcG9saWN5IGNvbnRhaW5lciB3aXRoIHRoZSBpbnB1dCBwcm9jZXNzIGZpZWxkIGZyb20gRXhlY1Byb2Nlc3NSZXF1ZXN0CmFsbG93X3Byb2JlX3Byb2Nlc3MocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSkgewogICAgcHJpbnQoImFsbG93X3Byb2JlX3Byb2Nlc3M6IHN0YXJ0IikKCiAgICBhbGxvd19wcm9jZXNzX2NvbW1vbihwX3Byb2Nlc3MsIGlfcHJvY2Vzcywgc19uYW1lKQogICAgYWxsb3dfZXhlY19jYXBzKGlfcHJvY2Vzcy5DYXBhYmlsaXRpZXMpCiAgICBwX3Byb2Nlc3MuVGVybWluYWwgPT0gaV9wcm9jZXNzLlRlcm1pbmFsCgogICAgcHJpbnQoImFsbG93X3Byb2JlX3Byb2Nlc3M6IHRydWUiKQp9CgphbGxvd191c2VyKHBfcHJvY2VzcywgaV9wcm9jZXNzKSB7CiAgICBwX3VzZXIgOj0gcF9wcm9jZXNzLlVzZXIKICAgIGlfdXNlciA6PSBpX3Byb2Nlc3MuVXNlcgoKICAgIHByaW50KCJhbGxvd191c2VyOiBpbnB1dCB1aWQgPSIsIGlfdXNlci5VSUQsICJwb2xpY3kgdWlkID0iLCBwX3VzZXIuVUlEKQogICAgcF91c2VyLlVJRCA9PSBpX3VzZXIuVUlECgogICAgIyBUT0RPOiB0cmFjayBkb3duIHRoZSByZWFzb24gZm9yIHJlZ2lzdHJ5Lms4cy5pby9wYXVzZTozLjkgYmVpbmcKICAgICMgICAgICAgZXhlY3V0ZWQgd2l0aCBnaWQgPSAwIGRlc3BpdGUgaGF2aW5nICI2NTUzNTo2NTUzNSIgaW4gaXRzIGNvbnRhaW5lciBpbWFnZQogICAgIyAgICAgICBjb25maWcuCiAgICAjcHJpbnQoImFsbG93X3VzZXI6IGlucHV0IGdpZCA9IiwgaV91c2VyLkdJRCwgInBvbGljeSBnaWQgPSIsIHBfdXNlci5HSUQpCiAgICAjcF91c2VyLkdJRCA9PSBpX3VzZXIuR0lECgogICAgIyBUT0RPOiBjb21wYXJlIHRoZSBhZGRpdGlvbmFsR2lkcyBmaWVsZCB0b28gYWZ0ZXIgY29tcHV0aW5nIGl0cyB2YWx1ZQogICAgIyBiYXNlZCBvbiAvZXRjL3Bhc3N3ZCBhbmQgL2V0Yy9ncm91cCBmcm9tIHRoZSBjb250YWluZXIgaW1hZ2UuCn0KCmFsbG93X2FyZ3MocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSkgewogICAgcHJpbnQoImFsbG93X2FyZ3MgMTogbm8gYXJncyIpCgogICAgbm90IHBfcHJvY2Vzcy5BcmdzCiAgICBub3QgaV9wcm9jZXNzLkFyZ3MKCiAgICBwcmludCgiYWxsb3dfYXJncyAxOiB0cnVlIikKfQphbGxvd19hcmdzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHByaW50KCJhbGxvd19hcmdzIDI6IHBvbGljeSBhcmdzID0iLCBwX3Byb2Nlc3MuQXJncykKICAgIHByaW50KCJhbGxvd19hcmdzIDI6IGlucHV0IGFyZ3MgPSIsIGlfcHJvY2Vzcy5BcmdzKQoKICAgIGNvdW50KHBfcHJvY2Vzcy5BcmdzKSA9PSBjb3VudChpX3Byb2Nlc3MuQXJncykKCiAgICBldmVyeSBpLCBpX2FyZyBpbiBpX3Byb2Nlc3MuQXJncyB7CiAgICAgICAgYWxsb3dfYXJnKGksIGlfYXJnLCBwX3Byb2Nlc3MsIHNfbmFtZSkKICAgIH0KCiAgICBwcmludCgiYWxsb3dfYXJncyAyOiB0cnVlIikKfQphbGxvd19hcmcoaSwgaV9hcmcsIHBfcHJvY2Vzcywgc19uYW1lKSB7CiAgICBwX2FyZyA6PSBwX3Byb2Nlc3MuQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2FyZyAxOiBpID0iLCBpLCAiaV9hcmcgPSIsIGlfYXJnLCAicF9hcmcgPSIsIHBfYXJnKQoKICAgIHBfYXJnMiA6PSByZXBsYWNlKHBfYXJnLCAiJCQiLCAiJCIpCiAgICBwX2FyZzIgPT0gaV9hcmcKCiAgICBwcmludCgiYWxsb3dfYXJnIDE6IHRydWUiKQp9CmFsbG93X2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5BcmdzW2ldCiAgICBwcmludCgiYWxsb3dfYXJnIDI6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgIyBUT0RPOiBjYW4gJChub2RlLW5hbWUpIGJlIGhhbmRsZWQgYmV0dGVyPwogICAgY29udGFpbnMocF9hcmcsICIkKG5vZGUtbmFtZSkiKQoKICAgIHByaW50KCJhbGxvd19hcmcgMjogdHJ1ZSIpCn0KYWxsb3dfYXJnKGksIGlfYXJnLCBwX3Byb2Nlc3MsIHNfbmFtZSkgewogICAgcF9hcmcgOj0gcF9wcm9jZXNzLkFyZ3NbaV0KICAgIHByaW50KCJhbGxvd19hcmcgMzogaSA9IiwgaSwgImlfYXJnID0iLCBpX2FyZywgInBfYXJnID0iLCBwX2FyZykKCiAgICBwX2FyZzIgOj0gcmVwbGFjZShwX2FyZywgIiQkIiwgIiQiKQogICAgcF9hcmczIDo9IHJlcGxhY2UocF9hcmcyLCAiJChzYW5kYm94LW5hbWUpIiwgc19uYW1lKQogICAgcHJpbnQoImFsbG93X2FyZyAzOiBwX2FyZzMgPSIsIHBfYXJnMykKICAgIHBfYXJnMyA9PSBpX2FyZwoKICAgIHByaW50KCJhbGxvd19hcmcgMzogdHJ1ZSIpCn0KCiMgT0NJIHByb2Nlc3MuRW52IGZpZWxkCmFsbG93X2VudihwX3Byb2Nlc3MsIGlfcHJvY2Vzcywgc19uYW1lKSB7CiAgICBwcmludCgiYWxsb3dfZW52OiBwIGVudiA9IiwgcF9wcm9jZXNzLkVudikKICAgIHByaW50KCJhbGxvd19lbnY6IGkgZW52ID0iLCBpX3Byb2Nlc3MuRW52KQoKICAgIGV2ZXJ5IGlfdmFyIGluIGlfcHJvY2Vzcy5FbnYgewogICAgICAgIHByaW50KCJhbGxvd19lbnY6IGlfdmFyID0iLCBpX3ZhcikKICAgICAgICBhbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUpCiAgICB9CgogICAgcHJpbnQoImFsbG93X2VudjogdHJ1ZSIpCn0KCiMgQWxsb3cgaW5wdXQgZW52IHZhcmlhYmxlcyB0aGF0IGFyZSBwcmVzZW50IGluIHRoZSBwb2xpY3kgZGF0YSB0b28uCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSkgewogICAgc29tZSBwX3ZhciBpbiBwX3Byb2Nlc3MuRW52CiAgICBwX3ZhciA9PSBpX3ZhcgogICAgcHJpbnQoImFsbG93X3ZhciAxOiB0cnVlIikKfQoKIyBNYXRjaCBpbnB1dCB3aXRoIG9uZSBvZiB0aGUgcG9saWN5IHZhcmlhYmxlcywgYWZ0ZXIgc3Vic3RpdHV0aW5nICQoc2FuZGJveC1uYW1lKS4KYWxsb3dfdmFyKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBpX3Zhciwgc19uYW1lKSB7CiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHBfdmFyMiA6PSByZXBsYWNlKHBfdmFyLCAiJChzYW5kYm94LW5hbWUpIiwgc19uYW1lKQoKICAgIHByaW50KCJhbGxvd192YXIgMjogcF92YXIyID0iLCBwX3ZhcjIpCiAgICBwX3ZhcjIgPT0gaV92YXIKCiAgICBwcmludCgiYWxsb3dfdmFyIDI6IHRydWUiKQp9CgojIEFsbG93IGlucHV0IGVudiB2YXJpYWJsZXMgdGhhdCBtYXRjaCB3aXRoIGEgcmVxdWVzdF9kZWZhdWx0cyByZWdleC4KYWxsb3dfdmFyKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBpX3Zhciwgc19uYW1lKSB7CiAgICBzb21lIHBfcmVnZXgxIGluIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuQ3JlYXRlQ29udGFpbmVyUmVxdWVzdC5hbGxvd19lbnZfcmVnZXgKICAgIHBfcmVnZXgyIDo9IHJlcGxhY2UocF9yZWdleDEsICIkKGlwdjRfYSkiLCBwb2xpY3lfZGF0YS5jb21tb24uaXB2NF9hKQogICAgcF9yZWdleDMgOj0gcmVwbGFjZShwX3JlZ2V4MiwgIiQoaXBfcCkiLCBwb2xpY3lfZGF0YS5jb21tb24uaXBfcCkKICAgIHBfcmVnZXg0IDo9IHJlcGxhY2UocF9yZWdleDMsICIkKHN2Y19uYW1lKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5zdmNfbmFtZSkKICAgIHBfcmVnZXg1IDo9IHJlcGxhY2UocF9yZWdleDQsICIkKGRuc19sYWJlbCkiLCBwb2xpY3lfZGF0YS5jb21tb24uZG5zX2xhYmVsKQoKICAgIHByaW50KCJhbGxvd192YXIgMzogcF9yZWdleDUgPSIsIHBfcmVnZXg1KQogICAgcmVnZXgubWF0Y2gocF9yZWdleDUsIGlfdmFyKQoKICAgIHByaW50KCJhbGxvd192YXIgMzogdHJ1ZSIpCn0KCiMgQWxsb3cgZmllbGRSZWYgImZpZWxkUGF0aDogc3RhdHVzLnBvZElQIiB2YWx1ZXMuCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSkgewogICAgbmFtZV92YWx1ZSA6PSBzcGxpdChpX3ZhciwgIj0iKQogICAgY291bnQobmFtZV92YWx1ZSkgPT0gMgogICAgaXNfaXAobmFtZV92YWx1ZVsxXSkKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIGFsbG93X3BvZF9pcF92YXIobmFtZV92YWx1ZVswXSwgcF92YXIpCgogICAgcHJpbnQoImFsbG93X3ZhciA0OiB0cnVlIikKfQoKIyBBbGxvdyBjb21tb24gZmllbGRSZWYgdmFyaWFibGVzLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUpIHsKICAgIG5hbWVfdmFsdWUgOj0gc3BsaXQoaV92YXIsICI9IikKICAgIGNvdW50KG5hbWVfdmFsdWUpID09IDIKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHBfbmFtZV92YWx1ZSA6PSBzcGxpdChwX3ZhciwgIj0iKQogICAgY291bnQocF9uYW1lX3ZhbHVlKSA9PSAyCgogICAgcF9uYW1lX3ZhbHVlWzBdID09IG5hbWVfdmFsdWVbMF0KCiAgICAjIFRPRE86IHNob3VsZCB0aGVzZSBiZSBoYW5kbGVkIGluIGEgZGlmZmVyZW50IHdheT8KICAgIGFsd2F5c19hbGxvd2VkIDo9IFsiJChob3N0LW5hbWUpIiwgIiQobm9kZS1uYW1lKSIsICIkKHBvZC11aWQpIl0KICAgIHNvbWUgYWxsb3dlZCBpbiBhbHdheXNfYWxsb3dlZAogICAgY29udGFpbnMocF9uYW1lX3ZhbHVlWzFdLCBhbGxvd2VkKQoKICAgIHByaW50KCJhbGxvd192YXIgNTogdHJ1ZSIpCn0KCiMgQWxsb3cgZmllbGRSZWYgImZpZWxkUGF0aDogc3RhdHVzLmhvc3RJUCIgdmFsdWVzLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUpIHsKICAgIG5hbWVfdmFsdWUgOj0gc3BsaXQoaV92YXIsICI9IikKICAgIGNvdW50KG5hbWVfdmFsdWUpID09IDIKICAgIGlzX2lwKG5hbWVfdmFsdWVbMV0pCgogICAgc29tZSBwX3ZhciBpbiBwX3Byb2Nlc3MuRW52CiAgICBhbGxvd19ob3N0X2lwX3ZhcihuYW1lX3ZhbHVlWzBdLCBwX3ZhcikKCiAgICBwcmludCgiYWxsb3dfdmFyIDY6IHRydWUiKQp9CgojIEFsbG93IHJlc291cmNlRmllbGRSZWYgdmFsdWVzIChlLmcuLCAibGltaXRzLmNwdSIpLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUpIHsKICAgIG5hbWVfdmFsdWUgOj0gc3BsaXQoaV92YXIsICI9IikKICAgIGNvdW50KG5hbWVfdmFsdWUpID09IDIKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHBfbmFtZV92YWx1ZSA6PSBzcGxpdChwX3ZhciwgIj0iKQogICAgY291bnQocF9uYW1lX3ZhbHVlKSA9PSAyCgogICAgcF9uYW1lX3ZhbHVlWzBdID09IG5hbWVfdmFsdWVbMF0KCiAgICAjIFRPRE86IHNob3VsZCB0aGVzZSBiZSBoYW5kbGVkIGluIGEgZGlmZmVyZW50IHdheT8KICAgIGFsd2F5c19hbGxvd2VkID0gWyIkKHJlc291cmNlLWZpZWxkKSIsICIkKHRvZG8tYW5ub3RhdGlvbikiXQogICAgc29tZSBhbGxvd2VkIGluIGFsd2F5c19hbGxvd2VkCiAgICBjb250YWlucyhwX25hbWVfdmFsdWVbMV0sIGFsbG93ZWQpCgogICAgcHJpbnQoImFsbG93X3ZhciA3OiB0cnVlIikKfQoKYWxsb3dfcG9kX2lwX3Zhcih2YXJfbmFtZSwgcF92YXIpIHsKICAgIHByaW50KCJhbGxvd19wb2RfaXBfdmFyOiB2YXJfbmFtZSA9IiwgdmFyX25hbWUsICJwX3ZhciA9IiwgcF92YXIpCgogICAgcF9uYW1lX3ZhbHVlIDo9IHNwbGl0KHBfdmFyLCAiPSIpCiAgICBjb3VudChwX25hbWVfdmFsdWUpID09IDIKCiAgICBwX25hbWVfdmFsdWVbMF0gPT0gdmFyX25hbWUKICAgIHBfbmFtZV92YWx1ZVsxXSA9PSAiJChwb2QtaXApIgoKICAgIHByaW50KCJhbGxvd19wb2RfaXBfdmFyOiB0cnVlIikKfQoKYWxsb3dfaG9zdF9pcF92YXIodmFyX25hbWUsIHBfdmFyKSB7CiAgICBwcmludCgiYWxsb3dfaG9zdF9pcF92YXI6IHZhcl9uYW1lID0iLCB2YXJfbmFtZSwgInBfdmFyID0iLCBwX3ZhcikKCiAgICBwX25hbWVfdmFsdWUgOj0gc3BsaXQocF92YXIsICI9IikKICAgIGNvdW50KHBfbmFtZV92YWx1ZSkgPT0gMgoKICAgIHBfbmFtZV92YWx1ZVswXSA9PSB2YXJfbmFtZQogICAgcF9uYW1lX3ZhbHVlWzFdID09ICIkKGhvc3QtaXApIgoKICAgIHByaW50KCJhbGxvd19ob3N0X2lwX3ZhcjogdHJ1ZSIpCn0KCmlzX2lwKHZhbHVlKSB7CiAgICBieXRlcyA9IHNwbGl0KHZhbHVlLCAiLiIpCiAgICBjb3VudChieXRlcykgPT0gNAoKICAgIGlzX2lwX2ZpcnN0X2J5dGUoYnl0ZXNbMF0pCiAgICBpc19pcF9vdGhlcl9ieXRlKGJ5dGVzWzFdKQogICAgaXNfaXBfb3RoZXJfYnl0ZShieXRlc1syXSkKICAgIGlzX2lwX290aGVyX2J5dGUoYnl0ZXNbM10pCn0KaXNfaXBfZmlyc3RfYnl0ZShjb21wb25lbnQpIHsKICAgIG51bWJlciA9IHRvX251bWJlcihjb21wb25lbnQpCiAgICBudW1iZXIgPj0gMQogICAgbnVtYmVyIDw9IDI1NQp9CmlzX2lwX290aGVyX2J5dGUoY29tcG9uZW50KSB7CiAgICBudW1iZXIgPSB0b19udW1iZXIoY29tcG9uZW50KQogICAgbnVtYmVyID49IDAKICAgIG51bWJlciA8PSAyNTUKfQoKIyBPQ0kgcm9vdC5QYXRoCmFsbG93X3Jvb3RfcGF0aChwX29jaSwgaV9vY2ksIGJ1bmRsZV9pZCkgewogICAgaV9wYXRoIDo9IGlfb2NpLlJvb3QuUGF0aAogICAgcF9wYXRoMSA6PSBwX29jaS5Sb290LlBhdGgKICAgIHByaW50KCJhbGxvd19yb290X3BhdGg6IGlfcGF0aCA9IiwgaV9wYXRoLCAicF9wYXRoMSA9IiwgcF9wYXRoMSkKCiAgICBwX3BhdGgyIDo9IHJlcGxhY2UocF9wYXRoMSwgIiQoY3BhdGgpIiwgcG9saWN5X2RhdGEuY29tbW9uLmNwYXRoKQogICAgcHJpbnQoImFsbG93X3Jvb3RfcGF0aDogcF9wYXRoMiA9IiwgcF9wYXRoMikKCiAgICBwX3BhdGgzIDo9IHJlcGxhY2UocF9wYXRoMiwgIiQoYnVuZGxlLWlkKSIsIGJ1bmRsZV9pZCkKICAgIHByaW50KCJhbGxvd19yb290X3BhdGg6IHBfcGF0aDMgPSIsIHBfcGF0aDMpCgogICAgcF9wYXRoMyA9PSBpX3BhdGgKCiAgICBwcmludCgiYWxsb3dfcm9vdF9wYXRoOiB0cnVlIikKfQoKIyBkZXZpY2UgbW91bnRzCmFsbG93X21vdW50KHBfb2NpLCBpX21vdW50LCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHByaW50KCJhbGxvd19tb3VudDogaV9tb3VudCA9IiwgaV9tb3VudCkKCiAgICBzb21lIHBfbW91bnQgaW4gcF9vY2kuTW91bnRzCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IHBfbW91bnQgPSIsIHBfbW91bnQpCiAgICBjaGVja19tb3VudChwX21vdW50LCBpX21vdW50LCBidW5kbGVfaWQsIHNhbmRib3hfaWQpCgogICAgIyBUT0RPOiBhcmUgdGhlcmUgYW55IG90aGVyIHJlcXVpcmVkIHBvbGljeSBjaGVja3MgZm9yIG1vdW50cyAtIGUuZy4sCiAgICAjICAgICAgIG11bHRpcGxlIG1vdW50cyB3aXRoIHNhbWUgc291cmNlIG9yIGRlc3RpbmF0aW9uPwoKICAgIHByaW50KCJhbGxvd19tb3VudDogdHJ1ZSIpCn0KCmNoZWNrX21vdW50KHBfbW91bnQsIGlfbW91bnQsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcF9tb3VudCA9PSBpX21vdW50CiAgICBwcmludCgiY2hlY2tfbW91bnQgMTogdHJ1ZSIpCn0KY2hlY2tfbW91bnQocF9tb3VudCwgaV9tb3VudCwgYnVuZGxlX2lkLCBzYW5kYm94X2lkKSB7CiAgICBwX21vdW50LmRlc3RpbmF0aW9uID09IGlfbW91bnQuZGVzdGluYXRpb24KICAgIHBfbW91bnQudHlwZV8gPT0gaV9tb3VudC50eXBlXwogICAgcF9tb3VudC5vcHRpb25zID09IGlfbW91bnQub3B0aW9ucwoKICAgIG1vdW50X3NvdXJjZV9hbGxvd3MocF9tb3VudCwgaV9tb3VudCwgYnVuZGxlX2lkLCBzYW5kYm94X2lkKQoKICAgIHByaW50KCJjaGVja19tb3VudCAyOiB0cnVlIikKfQoKbW91bnRfc291cmNlX2FsbG93cyhwX21vdW50LCBpX21vdW50LCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHJlZ2V4MSA6PSBwX21vdW50LnNvdXJjZQogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5jcGF0aCkKICAgIHJlZ2V4NCA6PSByZXBsYWNlKHJlZ2V4MywgIiQoYnVuZGxlLWlkKSIsIGJ1bmRsZV9pZCkKCiAgICBwcmludCgibW91bnRfc291cmNlX2FsbG93cyAxOiByZWdleDQgPSIsIHJlZ2V4NCkKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4NCwgaV9tb3VudC5zb3VyY2UpCgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMTogdHJ1ZSIpCn0KbW91bnRfc291cmNlX2FsbG93cyhwX21vdW50LCBpX21vdW50LCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHJlZ2V4MSA6PSBwX21vdW50LnNvdXJjZQogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5jcGF0aCkKICAgIHJlZ2V4NCA6PSByZXBsYWNlKHJlZ2V4MywgIiQoc2FuZGJveC1pZCkiLCBzYW5kYm94X2lkKQoKICAgIHByaW50KCJtb3VudF9zb3VyY2VfYWxsb3dzIDI6IHJlZ2V4NCA9IiwgcmVnZXg0KQogICAgcmVnZXgubWF0Y2gocmVnZXg0LCBpX21vdW50LnNvdXJjZSkKCiAgICBwcmludCgibW91bnRfc291cmNlX2FsbG93cyAyOiB0cnVlIikKfQptb3VudF9zb3VyY2VfYWxsb3dzKHBfbW91bnQsIGlfbW91bnQsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogaV9tb3VudC5zb3VyY2U9IiwgaV9tb3VudC5zb3VyY2UpCgogICAgaV9zb3VyY2VfcGFydHMgPSBzcGxpdChpX21vdW50LnNvdXJjZSwgIi8iKQogICAgYjY0X2RpcmVjdF92b2xfcGF0aCA9IGlfc291cmNlX3BhcnRzW2NvdW50KGlfc291cmNlX3BhcnRzKSAtIDFdCgogICAgYmFzZTY0LmlzX3ZhbGlkKGI2NF9kaXJlY3Rfdm9sX3BhdGgpCgogICAgc291cmNlMSA6PSBwX21vdW50LnNvdXJjZQogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogc291cmNlMSA9Iiwgc291cmNlMSkKCiAgICBzb3VyY2UyIDo9IHJlcGxhY2Uoc291cmNlMSwgIiQoc3BhdGgpIiwgcG9saWN5X2RhdGEuY29tbW9uLnNwYXRoKQogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogc291cmNlMiA9Iiwgc291cmNlMikKCiAgICBzb3VyY2UzIDo9IHJlcGxhY2Uoc291cmNlMiwgIiQoYjY0LWRpcmVjdC12b2wtcGF0aCkiLCBiNjRfZGlyZWN0X3ZvbF9wYXRoKQogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogc291cmNlMyA9Iiwgc291cmNlMykKCiAgICBzb3VyY2UzID09IGlfbW91bnQuc291cmNlCgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogdHJ1ZSIpCn0KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBDcmVhdGUgY29udGFpbmVyIFN0b3JhZ2VzCgphbGxvd19zdG9yYWdlcyhwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHBfY291bnQgOj0gY291bnQocF9zdG9yYWdlcykKICAgIGlfY291bnQgOj0gY291bnQoaV9zdG9yYWdlcykKICAgIHByaW50KCJhbGxvd19zdG9yYWdlczogcF9jb3VudCA9IiwgcF9jb3VudCwgImlfY291bnQgPSIsIGlfY291bnQpCgogICAgcF9jb3VudCA9PSBpX2NvdW50CgogICAgIyBHZXQgdGhlIGNvbnRhaW5lciBpbWFnZSBsYXllciBJRHMgYW5kIHZlcml0eSByb290IGhhc2hlcywgZnJvbSB0aGUgIm92ZXJsYXlmcyIgc3RvcmFnZS4KICAgIHNvbWUgb3ZlcmxheV9zdG9yYWdlIGluIHBfc3RvcmFnZXMKICAgIG92ZXJsYXlfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIHByaW50KCJhbGxvd19zdG9yYWdlczogb3ZlcmxheV9zdG9yYWdlID0iLCBvdmVybGF5X3N0b3JhZ2UpCiAgICBjb3VudChvdmVybGF5X3N0b3JhZ2Uub3B0aW9ucykgPT0gMgoKICAgIGxheWVyX2lkcyA6PSBzcGxpdChvdmVybGF5X3N0b3JhZ2Uub3B0aW9uc1swXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiBsYXllcl9pZHMgPSIsIGxheWVyX2lkcykKCiAgICByb290X2hhc2hlcyA6PSBzcGxpdChvdmVybGF5X3N0b3JhZ2Uub3B0aW9uc1sxXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiByb290X2hhc2hlcyA9Iiwgcm9vdF9oYXNoZXMpCgogICAgZXZlcnkgaV9zdG9yYWdlIGluIGlfc3RvcmFnZXMgewogICAgICAgIGFsbG93X3N0b3JhZ2UocF9zdG9yYWdlcywgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpCiAgICB9CgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiB0cnVlIikKfQoKYWxsb3dfc3RvcmFnZShwX3N0b3JhZ2VzLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgc29tZSBwX3N0b3JhZ2UgaW4gcF9zdG9yYWdlcwoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiBwX3N0b3JhZ2UgPSIsIHBfc3RvcmFnZSkKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiBpX3N0b3JhZ2UgPSIsIGlfc3RvcmFnZSkKCiAgICBwX3N0b3JhZ2UuZHJpdmVyICAgICAgICAgICA9PSBpX3N0b3JhZ2UuZHJpdmVyCiAgICBwX3N0b3JhZ2UuZHJpdmVyX29wdGlvbnMgICA9PSBpX3N0b3JhZ2UuZHJpdmVyX29wdGlvbnMKICAgIHBfc3RvcmFnZS5mc19ncm91cCAgICAgICAgID09IGlfc3RvcmFnZS5mc19ncm91cAoKICAgIGFsbG93X3N0b3JhZ2Vfb3B0aW9ucyhwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykKICAgIGFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykKCiAgICAjIFRPRE86IHZhbGlkYXRlIHRoZSBzb3VyY2UgZmllbGQgdG9vLgoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiB0cnVlIikKfQoKYWxsb3dfc3RvcmFnZV9vcHRpb25zKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKSB7CiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDE6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyICE9ICJvdmVybGF5ZnMiCiAgICBwX3N0b3JhZ2Uub3B0aW9ucyA9PSBpX3N0b3JhZ2Uub3B0aW9ucwoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMTogdHJ1ZSIpCn0KYWxsb3dfc3RvcmFnZV9vcHRpb25zKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKSB7CiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJvdmVybGF5ZnMiCiAgICBjb3VudChwX3N0b3JhZ2Uub3B0aW9ucykgPT0gMgoKICAgIHBvbGljeV9pZHMgOj0gc3BsaXQocF9zdG9yYWdlLm9wdGlvbnNbMF0sICI6IikKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogcG9saWN5X2lkcyA9IiwgcG9saWN5X2lkcykKICAgIHBvbGljeV9pZHMgPT0gbGF5ZXJfaWRzCgogICAgcG9saWN5X2hhc2hlcyA6PSBzcGxpdChwX3N0b3JhZ2Uub3B0aW9uc1sxXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBwb2xpY3lfaGFzaGVzID0iLCBwb2xpY3lfaGFzaGVzKQoKICAgIHBfY291bnQgOj0gY291bnQocG9saWN5X2lkcykKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogcF9jb3VudCA9IiwgcF9jb3VudCkKICAgIHBfY291bnQgPj0gMQogICAgcF9jb3VudCA9PSBjb3VudChwb2xpY3lfaGFzaGVzKQoKICAgIGlfY291bnQgOj0gY291bnQoaV9zdG9yYWdlLm9wdGlvbnMpCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfY291bnQgPSIsIGlfY291bnQpCiAgICBpX2NvdW50ID09IHBfY291bnQgKyAzCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBpX3N0b3JhZ2Uub3B0aW9uc1swXSA9IiwgaV9zdG9yYWdlLm9wdGlvbnNbMF0pCiAgICBpX3N0b3JhZ2Uub3B0aW9uc1swXSA9PSAiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmxheWVyLXNyYy1wcmVmaXg9L3Zhci9saWIvY29udGFpbmVyZC9pby5jb250YWluZXJkLnNuYXBzaG90dGVyLnYxLnRhcmRldi9sYXllcnMiCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBpX3N0b3JhZ2Uub3B0aW9uc1tpX2NvdW50IC0gMl0gPSIsIGlfc3RvcmFnZS5vcHRpb25zW2lfY291bnQgLSAyXSkKICAgIGlfc3RvcmFnZS5vcHRpb25zW2lfY291bnQgLSAyXSA9PSAiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0Lm92ZXJsYXktcnciCgogICAgbG93ZXJkaXIgOj0gY29uY2F0KCI9IiwgWyJsb3dlcmRpciIsIHBfc3RvcmFnZS5vcHRpb25zWzBdXSkKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogbG93ZXJkaXIgPSIsIGxvd2VyZGlyKQoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDFdID0iLCBpX3N0b3JhZ2Uub3B0aW9uc1tpX2NvdW50IC0gMV0pCiAgICBpX3N0b3JhZ2Uub3B0aW9uc1tpX2NvdW50IC0gMV0gPT0gbG93ZXJkaXIKCiAgICBldmVyeSBpLCBwb2xpY3lfaWQgaW4gcG9saWN5X2lkcyB7CiAgICAgICAgYWxsb3dfb3ZlcmxheV9sYXllcihwb2xpY3lfaWQsIHBvbGljeV9oYXNoZXNbaV0sIGlfc3RvcmFnZS5vcHRpb25zW2kgKyAxXSkKICAgIH0KCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IHRydWUiKQp9CmFsbG93X3N0b3JhZ2Vfb3B0aW9ucyhwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAzOiBzdGFydCIpCgogICAgcF9zdG9yYWdlLmRyaXZlciA9PSAiYmxrIgogICAgY291bnQocF9zdG9yYWdlLm9wdGlvbnMpID09IDEKCiAgICBzdGFydHN3aXRoKHBfc3RvcmFnZS5vcHRpb25zWzBdLCAiJChoYXNoIikKICAgIGhhc2hfc3VmZml4IDo9IHRyaW1fbGVmdChwX3N0b3JhZ2Uub3B0aW9uc1swXSwgIiQoaGFzaCIpCgogICAgZW5kc3dpdGgoaGFzaF9zdWZmaXgsICIpIikKICAgIGhhc2hfaW5kZXggOj0gdHJpbV9yaWdodChoYXNoX3N1ZmZpeCwgIikiKQogICAgaSA6PSB0b19udW1iZXIoaGFzaF9pbmRleCkKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMzogaSA9IiwgaSkKCiAgICBoYXNoX29wdGlvbiA6PSBjb25jYXQoIj0iLCBbImlvLmthdGFjb250YWluZXJzLmZzLW9wdC5yb290LWhhc2giLCByb290X2hhc2hlc1tpXV0pCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDM6IGhhc2hfb3B0aW9uID0iLCBoYXNoX29wdGlvbikKCiAgICBjb3VudChpX3N0b3JhZ2Uub3B0aW9ucykgPT0gNAogICAgaV9zdG9yYWdlLm9wdGlvbnNbMF0gPT0gInJvIgogICAgaV9zdG9yYWdlLm9wdGlvbnNbMV0gPT0gImlvLmthdGFjb250YWluZXJzLmZzLW9wdC5ibG9ja19kZXZpY2U9ZmlsZSIKICAgIGlfc3RvcmFnZS5vcHRpb25zWzJdID09ICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQuaXMtbGF5ZXIiCiAgICBpX3N0b3JhZ2Uub3B0aW9uc1szXSA9PSBoYXNoX29wdGlvbgoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMzogdHJ1ZSIpCn0KYWxsb3dfc3RvcmFnZV9vcHRpb25zKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKSB7CiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDQ6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJzbWIiCiAgICBwX29wdHNfY291bnQgOj0gY291bnQocF9zdG9yYWdlLm9wdGlvbnMpCiAgICBpX29wdHNfY291bnQgOj0gY291bnQoaV9zdG9yYWdlLm9wdGlvbnMpCiAgICBpX29wdHNfY291bnQgPT0gcF9vcHRzX2NvdW50ICsgMgoKICAgIGlfb3B0X21hdGNoZXMgOj0gW2kgfCBpIDo9IGlkeDsgaWR4IDwgcF9vcHRzX2NvdW50OyBwX3N0b3JhZ2Uub3B0aW9uc1tpZHhdID09IGlfc3RvcmFnZS5vcHRpb25zW2lkeF1dCiAgICBjb3VudChpX29wdF9tYXRjaGVzKSA9PSBwX29wdHNfY291bnQKCiAgICBzdGFydHN3aXRoKGlfc3RvcmFnZS5vcHRpb25zW2lfb3B0c19jb3VudC0yXSwgImFkZHI9IikKICAgIGNyZWRzID0gc3BsaXQoaV9zdG9yYWdlLm9wdGlvbnNbaV9vcHRzX2NvdW50LTFdLCAiLCIpCiAgICBjb3VudChjcmVkcykgPT0gMgogICAgc3RhcnRzd2l0aChjcmVkc1swXSwgInVzZXJuYW1lPSIpCiAgICBzdGFydHN3aXRoKGNyZWRzWzFdLCAicGFzc3dvcmQ9IikKICAgIAogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyA0OiB0cnVlIikKfQoKYWxsb3dfb3ZlcmxheV9sYXllcihwb2xpY3lfaWQsIHBvbGljeV9oYXNoLCBpX29wdGlvbikgewogICAgcHJpbnQoImFsbG93X292ZXJsYXlfbGF5ZXI6IHBvbGljeV9pZCA9IiwgcG9saWN5X2lkLCAicG9saWN5X2hhc2ggPSIsIHBvbGljeV9oYXNoKQogICAgcHJpbnQoImFsbG93X292ZXJsYXlfbGF5ZXI6IGlfb3B0aW9uID0iLCBpX29wdGlvbikKCiAgICBzdGFydHN3aXRoKGlfb3B0aW9uLCAiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmxheWVyPSIpCiAgICBpX3ZhbHVlIDo9IHJlcGxhY2UoaV9vcHRpb24sICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQubGF5ZXI9IiwgIiIpCiAgICBpX3ZhbHVlX2RlY29kZWQgOj0gYmFzZTY0LmRlY29kZShpX3ZhbHVlKQogICAgcHJpbnQoImFsbG93X292ZXJsYXlfbGF5ZXI6IGlfdmFsdWVfZGVjb2RlZCA9IiwgaV92YWx1ZV9kZWNvZGVkKQoKICAgIHBvbGljeV9zdWZmaXggOj0gY29uY2F0KCI9IiwgWyJ0YXIscm8saW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmJsb2NrX2RldmljZT1maWxlLGlvLmthdGFjb250YWluZXJzLmZzLW9wdC5pcy1sYXllcixpby5rYXRhY29udGFpbmVycy5mcy1vcHQucm9vdC1oYXNoIiwgcG9saWN5X2hhc2hdKQogICAgcF92YWx1ZSA6PSBjb25jYXQoIiwiLCBbcG9saWN5X2lkLCBwb2xpY3lfc3VmZml4XSkKICAgIHByaW50KCJhbGxvd19vdmVybGF5X2xheWVyOiBwX3ZhbHVlID0iLCBwX3ZhbHVlKQoKICAgIHBfdmFsdWUgPT0gaV92YWx1ZV9kZWNvZGVkCgogICAgcHJpbnQoImFsbG93X292ZXJsYXlfbGF5ZXI6IHRydWUiKQp9CgphbGxvd19tb3VudF9wb2ludChwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgYnVuZGxlX2lkLCBzYW5kYm94X2lkLCBsYXllcl9pZHMpIHsKICAgIHBfc3RvcmFnZS5mc3R5cGUgPT0gInRhciIKCiAgICBzdGFydHN3aXRoKHBfc3RvcmFnZS5tb3VudF9wb2ludCwgIiQobGF5ZXIiKQogICAgbW91bnRfc3VmZml4IDo9IHRyaW1fbGVmdChwX3N0b3JhZ2UubW91bnRfcG9pbnQsICIkKGxheWVyIikKCiAgICBlbmRzd2l0aChtb3VudF9zdWZmaXgsICIpIikKICAgIGxheWVyX2luZGV4IDo9IHRyaW1fcmlnaHQobW91bnRfc3VmZml4LCAiKSIpCiAgICBpIDo9IHRvX251bWJlcihsYXllcl9pbmRleCkKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCAxOiBpID0iLCBpKQoKICAgIGxheWVyX2lkIDo9IGxheWVyX2lkc1tpXQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDE6IGxheWVyX2lkID0iLCBsYXllcl9pZCkKCiAgICBwX21vdW50IDo9IGNvbmNhdCgiLyIsIFsiL3J1bi9rYXRhLWNvbnRhaW5lcnMvc2FuZGJveC9sYXllcnMiLCBsYXllcl9pZF0pCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMTogcF9tb3VudCA9IiwgcF9tb3VudCkKCiAgICBwX21vdW50ID09IGlfc3RvcmFnZS5tb3VudF9wb2ludAoKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCAxOiB0cnVlIikKfQphbGxvd19tb3VudF9wb2ludChwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgYnVuZGxlX2lkLCBzYW5kYm94X2lkLCBsYXllcl9pZHMpIHsKICAgIHBfc3RvcmFnZS5mc3R5cGUgPT0gImZ1c2UzLmthdGEtb3ZlcmxheSIKCiAgICBtb3VudDEgOj0gcmVwbGFjZShwX3N0b3JhZ2UubW91bnRfcG9pbnQsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5jcGF0aCkKICAgIG1vdW50MiA6PSByZXBsYWNlKG1vdW50MSwgIiQoYnVuZGxlLWlkKSIsIGJ1bmRsZV9pZCkKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCAyOiBtb3VudDIgPSIsIG1vdW50MikKCiAgICBtb3VudDIgPT0gaV9zdG9yYWdlLm1vdW50X3BvaW50CgogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDI6IHRydWUiKQp9CmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAibG9jYWwiCgogICAgbW91bnQxIDo9IHBfc3RvcmFnZS5tb3VudF9wb2ludAogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDM6IG1vdW50MSA9IiwgbW91bnQxKQoKICAgIG1vdW50MiA6PSByZXBsYWNlKG1vdW50MSwgIiQoY3BhdGgpIiwgcG9saWN5X2RhdGEuY29tbW9uLmNwYXRoKQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDM6IG1vdW50MiA9IiwgbW91bnQyKQoKICAgIG1vdW50MyA6PSByZXBsYWNlKG1vdW50MiwgIiQoc2FuZGJveC1pZCkiLCBzYW5kYm94X2lkKQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDM6IG1vdW50MyA9IiwgbW91bnQzKQoKICAgIHJlZ2V4Lm1hdGNoKG1vdW50MywgaV9zdG9yYWdlLm1vdW50X3BvaW50KQoKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCAzOiB0cnVlIikKfQphbGxvd19tb3VudF9wb2ludChwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgYnVuZGxlX2lkLCBzYW5kYm94X2lkLCBsYXllcl9pZHMpIHsKICAgIHBfc3RvcmFnZS5mc3R5cGUgPT0gImJpbmQiCgogICAgbW91bnQxIDo9IHBfc3RvcmFnZS5tb3VudF9wb2ludAogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDQ6IG1vdW50MSA9IiwgbW91bnQxKQoKICAgIG1vdW50MiA6PSByZXBsYWNlKG1vdW50MSwgIiQoY3BhdGgpIiwgcG9saWN5X2RhdGEuY29tbW9uLmNwYXRoKQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDQ6IG1vdW50MiA9IiwgbW91bnQyKQoKICAgIG1vdW50MyA6PSByZXBsYWNlKG1vdW50MiwgIiQoYnVuZGxlLWlkKSIsIGJ1bmRsZV9pZCkKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA0OiBtb3VudDMgPSIsIG1vdW50MykKCiAgICByZWdleC5tYXRjaChtb3VudDMsIGlfc3RvcmFnZS5tb3VudF9wb2ludCkKCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNDogdHJ1ZSIpCn0KYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKSB7CiAgICBwX3N0b3JhZ2UuZnN0eXBlID09ICJ0bXBmcyIKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNTogbW91bnQxID0iLCBtb3VudDEpCgogICAgcmVnZXgubWF0Y2gobW91bnQxLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCgogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDU6IHRydWUiKQp9CmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDY6IGlfc3RvcmFnZS5tb3VudF9wb2ludCA9IiwgaV9zdG9yYWdlLm1vdW50X3BvaW50KQogICAgYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIocF9zdG9yYWdlLCBpX3N0b3JhZ2UpCgogICAgbW91bnQxIDo9IHBfc3RvcmFnZS5tb3VudF9wb2ludAogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDY6IG1vdW50MSA9IiwgbW91bnQxKQoKICAgIG1vdW50MiA6PSByZXBsYWNlKG1vdW50MSwgIiQoc3BhdGgpIiwgcG9saWN5X2RhdGEuY29tbW9uLnNwYXRoKQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDY6IG1vdW50MiA9IiwgbW91bnQyKQoKICAgIGRpcmVjdF92b2xfcGF0aCA6PSBpX3N0b3JhZ2Uuc291cmNlCiAgICBtb3VudDMgOj0gcmVwbGFjZShtb3VudDIsICIkKGI2NC1kaXJlY3Qtdm9sLXBhdGgpIiwgYmFzZTY0dXJsLmVuY29kZShkaXJlY3Rfdm9sX3BhdGgpKQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDY6IG1vdW50MyA9IiwgbW91bnQzKQoKICAgIG1vdW50MyA9PSBpX3N0b3JhZ2UubW91bnRfcG9pbnQKCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogdHJ1ZSIpCn0KCmFsbG93X2RpcmVjdF92b2xfZHJpdmVyKHBfc3RvcmFnZSwgaV9zdG9yYWdlKSB7CiAgICBwcmludCgiYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIgMTogc3RhcnQiKQogICAgcF9zdG9yYWdlLmRyaXZlciA9PSAiYmxrIgogICAgcHJpbnQoImFsbG93X2RpcmVjdF92b2xfZHJpdmVyIDE6IHRydWUiKQp9CmFsbG93X2RpcmVjdF92b2xfZHJpdmVyKHBfc3RvcmFnZSwgaV9zdG9yYWdlKSB7CiAgICBwcmludCgiYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIgMjogc3RhcnQiKQogICAgcF9zdG9yYWdlLmRyaXZlciA9PSAic21iIgogICAgcHJpbnQoImFsbG93X2RpcmVjdF92b2xfZHJpdmVyIDI6IHRydWUiKQp9CgojIEV4ZWNQcm9jZXNzUmVxdWVzdC5wcm9jZXNzLkNhcGFiaWxpdGllcwphbGxvd19leGVjX2NhcHMoaV9jYXBzKSB7CiAgICBub3QgaV9jYXBzLkFtYmllbnQKICAgIG5vdCBpX2NhcHMuQm91bmRpbmcKICAgIG5vdCBpX2NhcHMuRWZmZWN0aXZlCiAgICBub3QgaV9jYXBzLkluaGVyaXRhYmxlCiAgICBub3QgaV9jYXBzLlBlcm1pdHRlZAp9CgojIE9DSS5Qcm9jZXNzLkNhcGFiaWxpdGllcwphbGxvd19jYXBzKHBfY2FwcywgaV9jYXBzKSB7CiAgICBwcmludCgiYWxsb3dfY2FwczogcG9saWN5IEFtYmllbnQgPSIsIHBfY2Fwcy5BbWJpZW50KQogICAgcHJpbnQoImFsbG93X2NhcHM6IGlucHV0IEFtYmllbnQgPSIsIGlfY2Fwcy5BbWJpZW50KQogICAgbWF0Y2hfY2FwcyhwX2NhcHMuQW1iaWVudCwgaV9jYXBzLkFtYmllbnQpCgogICAgcHJpbnQoImFsbG93X2NhcHM6IHBvbGljeSBCb3VuZGluZyA9IiwgcF9jYXBzLkJvdW5kaW5nKQogICAgcHJpbnQoImFsbG93X2NhcHM6IGlucHV0IEJvdW5kaW5nID0iLCBpX2NhcHMuQm91bmRpbmcpCiAgICBtYXRjaF9jYXBzKHBfY2Fwcy5Cb3VuZGluZywgaV9jYXBzLkJvdW5kaW5nKQoKICAgIHByaW50KCJhbGxvd19jYXBzOiBwb2xpY3kgRWZmZWN0aXZlID0iLCBwX2NhcHMuRWZmZWN0aXZlKQogICAgcHJpbnQoImFsbG93X2NhcHM6IGlucHV0IEVmZmVjdGl2ZSA9IiwgaV9jYXBzLkVmZmVjdGl2ZSkKICAgIG1hdGNoX2NhcHMocF9jYXBzLkVmZmVjdGl2ZSwgaV9jYXBzLkVmZmVjdGl2ZSkKCiAgICBwcmludCgiYWxsb3dfY2FwczogcG9saWN5IEluaGVyaXRhYmxlID0iLCBwX2NhcHMuSW5oZXJpdGFibGUpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgSW5oZXJpdGFibGUgPSIsIGlfY2Fwcy5Jbmhlcml0YWJsZSkKICAgIG1hdGNoX2NhcHMocF9jYXBzLkluaGVyaXRhYmxlLCBpX2NhcHMuSW5oZXJpdGFibGUpCgogICAgcHJpbnQoImFsbG93X2NhcHM6IHBvbGljeSBQZXJtaXR0ZWQgPSIsIHBfY2Fwcy5QZXJtaXR0ZWQpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgUGVybWl0dGVkID0iLCBpX2NhcHMuUGVybWl0dGVkKQogICAgbWF0Y2hfY2FwcyhwX2NhcHMuUGVybWl0dGVkLCBpX2NhcHMuUGVybWl0dGVkKQp9CgptYXRjaF9jYXBzKHBfY2FwcywgaV9jYXBzKSB7CiAgICBwcmludCgibWF0Y2hfY2FwcyAxOiBzdGFydCIpCgogICAgcF9jYXBzID09IGlfY2FwcwoKICAgIHByaW50KCJtYXRjaF9jYXBzIDE6IHRydWUiKQp9Cm1hdGNoX2NhcHMocF9jYXBzLCBpX2NhcHMpIHsKICAgIHByaW50KCJtYXRjaF9jYXBzIDI6IHN0YXJ0IikKCiAgICBjb3VudChwX2NhcHMpID09IDEKICAgIHBfY2Fwc1swXSA9PSAiJChkZWZhdWx0X2NhcHMpIgoKICAgIHByaW50KCJtYXRjaF9jYXBzIDI6IGRlZmF1bHRfY2FwcyA9IiwgcG9saWN5X2RhdGEuY29tbW9uLmRlZmF1bHRfY2FwcykKICAgIHBvbGljeV9kYXRhLmNvbW1vbi5kZWZhdWx0X2NhcHMgPT0gaV9jYXBzCgogICAgcHJpbnQoIm1hdGNoX2NhcHMgMjogdHJ1ZSIpCn0KbWF0Y2hfY2FwcyhwX2NhcHMsIGlfY2FwcykgewogICAgcHJpbnQoIm1hdGNoX2NhcHMgMzogc3RhcnQiKQoKICAgIGNvdW50KHBfY2FwcykgPT0gMQogICAgcF9jYXBzWzBdID09ICIkKHByaXZpbGVnZWRfY2FwcykiCgogICAgcHJpbnQoIm1hdGNoX2NhcHMgMzogcHJpdmlsZWdlZF9jYXBzID0iLCBwb2xpY3lfZGF0YS5jb21tb24ucHJpdmlsZWdlZF9jYXBzKQogICAgcG9saWN5X2RhdGEuY29tbW9uLnByaXZpbGVnZWRfY2FwcyA9PSBpX2NhcHMKCiAgICBwcmludCgibWF0Y2hfY2FwcyAzOiB0cnVlIikKfQoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpjaGVja19kaXJlY3RvcnlfdHJhdmVyc2FsKGlfcGF0aCkgewogICAgY29udGFpbnMoaV9wYXRoLCAiLi4vIikgPT0gZmFsc2UKICAgIGVuZHN3aXRoKGlfcGF0aCwgIi8uLiIpID09IGZhbHNlCn0KCmNoZWNrX3N5bWxpbmtfc291cmNlKGlfc3JjKSB7CiAgICBpX3NyYyA9PSAiIgogICAgcHJpbnQoImNoZWNrX3N5bWxpbmtfc291cmNlIDE6IHRydWUiKQp9CmNoZWNrX3N5bWxpbmtfc291cmNlKGlfc3JjKSB7CiAgICBpX3NyYyAhPSAiIgogICAgcHJpbnQoImNoZWNrX3N5bWxpbmtfc291cmNlIDI6IGlfc3JjID0iLCBpX3NyYykKCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24uc19zb3VyY2UxLCBpX3NyYykKCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMjogdHJ1ZSIpCn0KY2hlY2tfc3ltbGlua19zb3VyY2UoaV9zcmMpIHsKICAgIGlfc3JjICE9ICIiCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMzogaV9zcmMgPSIsIGlfc3JjKQoKICAgIHJlZ2V4Lm1hdGNoKHBvbGljeV9kYXRhLmNvbW1vbi5zX3NvdXJjZTIsIGlfc3JjKQogICAgY2hlY2tfZGlyZWN0b3J5X3RyYXZlcnNhbChpX3NyYykKCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMzogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfc3RvcmFnZXMoaV9zdG9yYWdlcykgewogICAgcHJpbnQoImFsbG93X3NhbmRib3hfc3RvcmFnZXM6IGlfc3RvcmFnZXMgPSIsIGlfc3RvcmFnZXMpCgogICAgcF9zdG9yYWdlcyA6PSBwb2xpY3lfZGF0YS5zYW5kYm94LnN0b3JhZ2VzCiAgICBldmVyeSBpX3N0b3JhZ2UgaW4gaV9zdG9yYWdlcyB7CiAgICAgICAgYWxsb3dfc2FuZGJveF9zdG9yYWdlKHBfc3RvcmFnZXMsIGlfc3RvcmFnZSkKICAgIH0KCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9zdG9yYWdlczogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfc3RvcmFnZShwX3N0b3JhZ2VzLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IGlfc3RvcmFnZSA9IiwgaV9zdG9yYWdlKQoKICAgIHNvbWUgcF9zdG9yYWdlIGluIHBfc3RvcmFnZXMKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IHBfc3RvcmFnZSA9IiwgcF9zdG9yYWdlKQogICAgaV9zdG9yYWdlID09IHBfc3RvcmFnZQoKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IHRydWUiKQp9CgpDb3B5RmlsZVJlcXVlc3QgewogICAgcHJpbnQoIkNvcHlGaWxlUmVxdWVzdDogaW5wdXQucGF0aCA9IiwgaW5wdXQucGF0aCkKCiAgICBjaGVja19zeW1saW5rX3NvdXJjZShpbnB1dC5zeW1saW5rX3NyYykKICAgIGNoZWNrX2RpcmVjdG9yeV90cmF2ZXJzYWwoaW5wdXQucGF0aCkKCiAgICBzb21lIHJlZ2V4MSBpbiBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLkNvcHlGaWxlUmVxdWVzdAogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5jcGF0aCkKICAgIHJlZ2V4NCA6PSByZXBsYWNlKHJlZ2V4MywgIiQoYnVuZGxlLWlkKSIsICJbYS16MC05XXs2NH0iKQogICAgcHJpbnQoIkNvcHlGaWxlUmVxdWVzdDogcmVnZXg0ID0iLCByZWdleDQpCgogICAgcmVnZXgubWF0Y2gocmVnZXg0LCBpbnB1dC5wYXRoKQoKICAgIHByaW50KCJDb3B5RmlsZVJlcXVlc3Q6IHRydWUiKQp9CgpDcmVhdGVTYW5kYm94UmVxdWVzdCB7CiAgICBwcmludCgiQ3JlYXRlU2FuZGJveFJlcXVlc3Q6IGlucHV0Lmd1ZXN0X2hvb2tfcGF0aCA9IiwgaW5wdXQuZ3Vlc3RfaG9va19wYXRoKQogICAgY291bnQoaW5wdXQuZ3Vlc3RfaG9va19wYXRoKSA9PSAwCgogICAgcHJpbnQoIkNyZWF0ZVNhbmRib3hSZXF1ZXN0OiBpbnB1dC5rZXJuZWxfbW9kdWxlcyA9IiwgaW5wdXQua2VybmVsX21vZHVsZXMpCiAgICBjb3VudChpbnB1dC5rZXJuZWxfbW9kdWxlcykgPT0gMAoKICAgIGlfcGlkbnMgOj0gaW5wdXQuc2FuZGJveF9waWRucwogICAgcHJpbnQoIkNyZWF0ZVNhbmRib3hSZXF1ZXN0OiBpX3BpZG5zID0iLCBpX3BpZG5zKQogICAgaV9waWRucyA9PSBmYWxzZQoKICAgIGFsbG93X3NhbmRib3hfc3RvcmFnZXMoaW5wdXQuc3RvcmFnZXMpCn0KCmFsbG93X2V4ZWMocF9jb250YWluZXIsIGlfcHJvY2VzcykgewogICAgcHJpbnQoImFsbG93X2V4ZWM6IHN0YXJ0IikKCiAgICBwX29jaSA9IHBfY29udGFpbmVyLk9DSQogICAgcF9zX25hbWUgPSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgYWxsb3dfcHJvYmVfcHJvY2VzcyhwX29jaS5Qcm9jZXNzLCBpX3Byb2Nlc3MsIHBfc19uYW1lKQoKICAgIHByaW50KCJhbGxvd19leGVjOiB0cnVlIikKfQoKYWxsb3dfaW50ZXJhY3RpdmVfZXhlYyhwX2NvbnRhaW5lciwgaV9wcm9jZXNzKSB7CiAgICBwcmludCgiYWxsb3dfaW50ZXJhY3RpdmVfZXhlYzogc3RhcnQiKQoKICAgIHBfb2NpID0gcF9jb250YWluZXIuT0NJCiAgICBwX3NfbmFtZSA9IHBfb2NpLkFubm90YXRpb25zW1NfTkFNRV9LRVldCiAgICBhbGxvd19pbnRlcmFjdGl2ZV9wcm9jZXNzKHBfb2NpLlByb2Nlc3MsIGlfcHJvY2VzcywgcF9zX25hbWUpCgogICAgcHJpbnQoImFsbG93X2ludGVyYWN0aXZlX2V4ZWM6IHRydWUiKQp9CgojIFRPRE86IHNob3VsZCBvdGhlciBFeGVjUHJvY2Vzc1JlcXVlc3QgaW5wdXQgZGF0YSBmaWVsZHMgYmUgdmFsaWRhdGVkIGFzIHdlbGw/CkV4ZWNQcm9jZXNzUmVxdWVzdCB7CiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDE6IGlucHV0ID0iLCBpbnB1dCkKCiAgICBpX2NvbW1hbmQgPSBjb25jYXQoIiAiLCBpbnB1dC5wcm9jZXNzLkFyZ3MpCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDE6IGlfY29tbWFuZCA9IiwgaV9jb21tYW5kKQoKICAgIHNvbWUgcF9jb21tYW5kIGluIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuRXhlY1Byb2Nlc3NSZXF1ZXN0LmNvbW1hbmRzCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDE6IHBfY29tbWFuZCA9IiwgcF9jb21tYW5kKQogICAgcF9jb21tYW5kID09IGlfY29tbWFuZAoKICAgICMgVE9ETzogbWF0Y2ggcF9jb250YWluZXIncyBJRCB3aXRoIHRoZSBpbnB1dCBjb250YWluZXJfaWQuCiAgICBzb21lIHBfY29udGFpbmVyIGluIHBvbGljeV9kYXRhLmNvbnRhaW5lcnMKICAgIGFsbG93X2ludGVyYWN0aXZlX2V4ZWMocF9jb250YWluZXIsIGlucHV0LnByb2Nlc3MpCgogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAxOiB0cnVlIikKfQpFeGVjUHJvY2Vzc1JlcXVlc3QgewogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAyOiBpbnB1dCA9IiwgaW5wdXQpCgogICAgIyBUT0RPOiBtYXRjaCBpbnB1dCBjb250YWluZXIgSUQgd2l0aCBpdHMgY29ycmVzcG9uZGluZyBjb250YWluZXIuZXhlY19jb21tYW5kcy4KICAgIGlfY29tbWFuZCA9IGNvbmNhdCgiICIsIGlucHV0LnByb2Nlc3MuQXJncykKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMjogaV9jb21tYW5kID0iLCBpX2NvbW1hbmQpCgogICAgIyBUT0RPOiBtYXRjaCBwX2NvbnRhaW5lcidzIElEIHdpdGggdGhlIGlucHV0IGNvbnRhaW5lcl9pZC4KICAgIHNvbWUgcF9jb250YWluZXIgaW4gcG9saWN5X2RhdGEuY29udGFpbmVycwogICAgc29tZSBwX2NvbW1hbmQgaW4gcF9jb250YWluZXIuZXhlY19jb21tYW5kcwogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAyOiBwX2NvbW1hbmQgPSIsIHBfY29tbWFuZCkKICAgIHBfY29tbWFuZCA9PSBpX2NvbW1hbmQKCiAgICBhbGxvd19leGVjKHBfY29udGFpbmVyLCBpbnB1dC5wcm9jZXNzKQoKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMjogdHJ1ZSIpCn0KRXhlY1Byb2Nlc3NSZXF1ZXN0IHsKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMzogaW5wdXQgPSIsIGlucHV0KQoKICAgIGlfY29tbWFuZCA9IGNvbmNhdCgiICIsIGlucHV0LnByb2Nlc3MuQXJncykKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMzogaV9jb21tYW5kID0iLCBpX2NvbW1hbmQpCgogICAgc29tZSBwX3JlZ2V4IGluIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuRXhlY1Byb2Nlc3NSZXF1ZXN0LnJlZ2V4CiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDM6IHBfcmVnZXggPSIsIHBfcmVnZXgpCgogICAgcmVnZXgubWF0Y2gocF9yZWdleCwgaV9jb21tYW5kKQoKICAgICMgVE9ETzogbWF0Y2ggcF9jb250YWluZXIncyBJRCB3aXRoIHRoZSBpbnB1dCBjb250YWluZXJfaWQuCiAgICBzb21lIHBfY29udGFpbmVyIGluIHBvbGljeV9kYXRhLmNvbnRhaW5lcnMKICAgIGFsbG93X2ludGVyYWN0aXZlX2V4ZWMocF9jb250YWluZXIsIGlucHV0LnByb2Nlc3MpCgogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAzOiB0cnVlIikKfQoKQ2xvc2VTdGRpblJlcXVlc3QgewogICAgcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5DbG9zZVN0ZGluUmVxdWVzdCA9PSB0cnVlCn0KClJlYWRTdHJlYW1SZXF1ZXN0IHsKICAgIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuUmVhZFN0cmVhbVJlcXVlc3QgPT0gdHJ1ZQp9CgpVcGRhdGVFcGhlbWVyYWxNb3VudHNSZXF1ZXN0IHsKICAgIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuVXBkYXRlRXBoZW1lcmFsTW91bnRzUmVxdWVzdCA9PSB0cnVlCn0KCldyaXRlU3RyZWFtUmVxdWVzdCB7CiAgICBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLldyaXRlU3RyZWFtUmVxdWVzdCA9PSB0cnVlCn0KCnBvbGljeV9kYXRhIDo9IHsKICAiY29udGFpbmVycyI6IFsKICAgIHsKICAgICAgIk9DSSI6IHsKICAgICAgICAiVmVyc2lvbiI6ICIxLjEuMC1yYy4xIiwKICAgICAgICAiUHJvY2VzcyI6IHsKICAgICAgICAgICJUZXJtaW5hbCI6IGZhbHNlLAogICAgICAgICAgIlVzZXIiOiB7CiAgICAgICAgICAgICJVSUQiOiA2NTUzNSwKICAgICAgICAgICAgIkdJRCI6IDY1NTM1LAogICAgICAgICAgICAiQWRkaXRpb25hbEdpZHMiOiBbXSwKICAgICAgICAgICAgIlVzZXJuYW1lIjogIiIKICAgICAgICAgIH0sCiAgICAgICAgICAiQXJncyI6IFsKICAgICAgICAgICAgIi9wYXVzZSIKICAgICAgICAgIF0sCiAgICAgICAgICAiRW52IjogWwogICAgICAgICAgICAiUEFUSD0vdXNyL2xvY2FsL3NiaW46L3Vzci9sb2NhbC9iaW46L3Vzci9zYmluOi91c3IvYmluOi9zYmluOi9iaW4iCiAgICAgICAgICBdLAogICAgICAgICAgIkN3ZCI6ICIvIiwKICAgICAgICAgICJDYXBhYmlsaXRpZXMiOiB7CiAgICAgICAgICAgICJBbWJpZW50IjogW10sCiAgICAgICAgICAgICJCb3VuZGluZyI6IFsKICAgICAgICAgICAgICAiJChkZWZhdWx0X2NhcHMpIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiRWZmZWN0aXZlIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJJbmhlcml0YWJsZSI6IFtdLAogICAgICAgICAgICAiUGVybWl0dGVkIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICAiTm9OZXdQcml2aWxlZ2VzIjogdHJ1ZQogICAgICAgIH0sCiAgICAgICAgIlJvb3QiOiB7CiAgICAgICAgICAiUGF0aCI6ICIkKGNwYXRoKS8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgIlJlYWRvbmx5IjogdHJ1ZQogICAgICAgIH0sCiAgICAgICAgIk1vdW50cyI6IFsKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9wcm9jIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJwcm9jIiwKICAgICAgICAgICAgInR5cGVfIjogInByb2MiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2IiwKICAgICAgICAgICAgInNvdXJjZSI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJzdHJpY3RhdGltZSIsCiAgICAgICAgICAgICAgIm1vZGU9NzU1IiwKICAgICAgICAgICAgICAic2l6ZT02NTUzNmsiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L3B0cyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiZGV2cHRzIiwKICAgICAgICAgICAgInR5cGVfIjogImRldnB0cyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJuZXdpbnN0YW5jZSIsCiAgICAgICAgICAgICAgInB0bXhtb2RlPTA2NjYiLAogICAgICAgICAgICAgICJtb2RlPTA2MjAiLAogICAgICAgICAgICAgICJnaWQ9NSIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvc2htIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L3NobSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi9tcXVldWUiLAogICAgICAgICAgICAic291cmNlIjogIm1xdWV1ZSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJtcXVldWUiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvc3lzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJzeXNmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJzeXNmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2V0Yy9yZXNvbHYuY29uZiIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClyZXNvbHYuY29uZiQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJvIiwKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9kZXYiLAogICAgICAgICAgICAgICJub2V4ZWMiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0KICAgICAgICBdLAogICAgICAgICJBbm5vdGF0aW9ucyI6IHsKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmJ1bmRsZV9wYXRoIjogIi9ydW4vY29udGFpbmVyZC9pby5jb250YWluZXJkLnJ1bnRpbWUudjIudGFzay9rOHMuaW8vJChidW5kbGUtaWQpIiwKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIjogInBvZF9zYW5kYm94IiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSI6ICJzYW5kYm94IiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWlkIjogIl5bYS16MC05XXs2NH0kIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWxvZy1kaXJlY3RvcnkiOiAiXi92YXIvbG9nL3BvZHMvJChzYW5kYm94LW5hbWVzcGFjZSlfJChzYW5kYm94LW5hbWUpX1swLTlhLWZdezh9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezEyfSQiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZXNwYWNlIjogImRlZmF1bHQiLAogICAgICAgICAgIm5lcmRjdGwvbmV0d29yay1uYW1lc3BhY2UiOiAiXi92YXIvcnVuL25ldG5zL2NuaS1bMC05YS1mXXs4fS1bMC05YS1mXXs0fS1bMC05YS1mXXs0fS1bMC05YS1mXXs0fS1bMC05YS1mXXsxMn0kIgogICAgICAgIH0sCiAgICAgICAgIkxpbnV4IjogewogICAgICAgICAgIk5hbWVzcGFjZXMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiVHlwZSI6ICJpcGMiLAogICAgICAgICAgICAgICJQYXRoIjogIiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJUeXBlIjogInV0cyIsCiAgICAgICAgICAgICAgIlBhdGgiOiAiIgogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgIlR5cGUiOiAibW91bnQiLAogICAgICAgICAgICAgICJQYXRoIjogIiIKICAgICAgICAgICAgfQogICAgICAgICAgXSwKICAgICAgICAgICJNYXNrZWRQYXRocyI6IFsKICAgICAgICAgICAgIi9wcm9jL2FjcGkiLAogICAgICAgICAgICAiL3Byb2MvYXNvdW5kIiwKICAgICAgICAgICAgIi9wcm9jL2tjb3JlIiwKICAgICAgICAgICAgIi9wcm9jL2tleXMiLAogICAgICAgICAgICAiL3Byb2MvbGF0ZW5jeV9zdGF0cyIsCiAgICAgICAgICAgICIvcHJvYy90aW1lcl9saXN0IiwKICAgICAgICAgICAgIi9wcm9jL3RpbWVyX3N0YXRzIiwKICAgICAgICAgICAgIi9wcm9jL3NjaGVkX2RlYnVnIiwKICAgICAgICAgICAgIi9zeXMvZmlybXdhcmUiLAogICAgICAgICAgICAiL3Byb2Mvc2NzaSIKICAgICAgICAgIF0sCiAgICAgICAgICAiUmVhZG9ubHlQYXRocyI6IFsKICAgICAgICAgICAgIi9wcm9jL2J1cyIsCiAgICAgICAgICAgICIvcHJvYy9mcyIsCiAgICAgICAgICAgICIvcHJvYy9pcnEiLAogICAgICAgICAgICAiL3Byb2Mvc3lzIiwKICAgICAgICAgICAgIi9wcm9jL3N5c3JxLXRyaWdnZXIiCiAgICAgICAgICBdCiAgICAgICAgfQogICAgICB9LAogICAgICAic3RvcmFnZXMiOiBbCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJibGsiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogInRhciIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIiQoaGFzaDApIgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGxheWVyMCkiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJvdmVybGF5ZnMiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogImZ1c2UzLmthdGEtb3ZlcmxheSIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIjVhNWFhZDgwMDU1ZmYyMDAxMmE1MGRjMjVmOGRmN2EyOTkyNDQ3NDMyNGQ2NWY3ZDUzMDZlZThlZTI3ZmY3MWQiLAogICAgICAgICAgICAiODE3MjUwZjFhM2UzMzZkYTc2ZjViZDNmYTc4NGUxYjI2ZDk1OWI5YzEzMTg3NjgxNWJhMjYwNDA0OGI3MGMxOCIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChjcGF0aCkvJChidW5kbGUtaWQpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9CiAgICAgIF0sCiAgICAgICJzYW5kYm94X3BpZG5zIjogZmFsc2UsCiAgICAgICJleGVjX2NvbW1hbmRzIjogW10KICAgIH0sCiAgICB7CiAgICAgICJPQ0kiOiB7CiAgICAgICAgIlZlcnNpb24iOiAiMS4xLjAtcmMuMSIsCiAgICAgICAgIlByb2Nlc3MiOiB7CiAgICAgICAgICAiVGVybWluYWwiOiBmYWxzZSwKICAgICAgICAgICJVc2VyIjogewogICAgICAgICAgICAiVUlEIjogMCwKICAgICAgICAgICAgIkdJRCI6IDAsCiAgICAgICAgICAgICJBZGRpdGlvbmFsR2lkcyI6IFtdLAogICAgICAgICAgICAiVXNlcm5hbWUiOiAiIgogICAgICAgICAgfSwKICAgICAgICAgICJBcmdzIjogWwogICAgICAgICAgICAiL2NzaS1ub2RlLWRyaXZlci1yZWdpc3RyYXIiLAogICAgICAgICAgICAiLS12PTUiLAogICAgICAgICAgICAiLS1jc2ktYWRkcmVzcz0vY3NpL2NzaS5zb2NrIiwKICAgICAgICAgICAgIi0ta3ViZWxldC1yZWdpc3RyYXRpb24tcGF0aD0vdmFyL2xpYi9rdWJlbGV0L3BsdWdpbnMvcGQuY3NpLnN0b3JhZ2UuZ2tlLmlvL2NzaS5zb2NrIiwKICAgICAgICAgICAgIi0taHR0cC1lbmRwb2ludD06MjIwMTMiCiAgICAgICAgICBdLAogICAgICAgICAgIkVudiI6IFsKICAgICAgICAgICAgIlBBVEg9L3Vzci9sb2NhbC9zYmluOi91c3IvbG9jYWwvYmluOi91c3Ivc2JpbjovdXNyL2Jpbjovc2JpbjovYmluIiwKICAgICAgICAgICAgIlNTTF9DRVJUX0ZJTEU9L2V0Yy9zc2wvY2VydHMvY2EtY2VydGlmaWNhdGVzLmNydCIsCiAgICAgICAgICAgICJIT1NUTkFNRT0kKGhvc3QtbmFtZSkiLAogICAgICAgICAgICAiS1VCRV9OT0RFX05BTUU9JChub2RlLW5hbWUpIgogICAgICAgICAgXSwKICAgICAgICAgICJDd2QiOiAiLyIsCiAgICAgICAgICAiQ2FwYWJpbGl0aWVzIjogewogICAgICAgICAgICAiQW1iaWVudCI6IFtdLAogICAgICAgICAgICAiQm91bmRpbmciOiBbCiAgICAgICAgICAgICAgIiQoZGVmYXVsdF9jYXBzKSIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgIkVmZmVjdGl2ZSI6IFsKICAgICAgICAgICAgICAiJChkZWZhdWx0X2NhcHMpIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiSW5oZXJpdGFibGUiOiBbXSwKICAgICAgICAgICAgIlBlcm1pdHRlZCI6IFsKICAgICAgICAgICAgICAiJChkZWZhdWx0X2NhcHMpIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgIk5vTmV3UHJpdmlsZWdlcyI6IGZhbHNlCiAgICAgICAgfSwKICAgICAgICAiUm9vdCI6IHsKICAgICAgICAgICJQYXRoIjogIiQoY3BhdGgpLyQoYnVuZGxlLWlkKSIsCiAgICAgICAgICAiUmVhZG9ubHkiOiBmYWxzZQogICAgICAgIH0sCiAgICAgICAgIk1vdW50cyI6IFsKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9wcm9jIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJwcm9jIiwKICAgICAgICAgICAgInR5cGVfIjogInByb2MiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2IiwKICAgICAgICAgICAgInNvdXJjZSI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJzdHJpY3RhdGltZSIsCiAgICAgICAgICAgICAgIm1vZGU9NzU1IiwKICAgICAgICAgICAgICAic2l6ZT02NTUzNmsiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L3B0cyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiZGV2cHRzIiwKICAgICAgICAgICAgInR5cGVfIjogImRldnB0cyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJuZXdpbnN0YW5jZSIsCiAgICAgICAgICAgICAgInB0bXhtb2RlPTA2NjYiLAogICAgICAgICAgICAgICJtb2RlPTA2MjAiLAogICAgICAgICAgICAgICJnaWQ9NSIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvc2htIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L3NobSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi9tcXVldWUiLAogICAgICAgICAgICAic291cmNlIjogIm1xdWV1ZSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJtcXVldWUiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvc3lzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJzeXNmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJzeXNmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL3N5cy9mcy9jZ3JvdXAiLAogICAgICAgICAgICAic291cmNlIjogImNncm91cCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJjZ3JvdXAiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiLAogICAgICAgICAgICAgICJyZWxhdGltZSIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2V0Yy9ob3N0cyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClob3N0cyQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicnciCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L3Rlcm1pbmF0aW9uLWxvZyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeCl0ZXJtaW5hdGlvbi1sb2ckIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJ3IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2V0Yy9ob3N0bmFtZSIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClob3N0bmFtZSQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicnciCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZXRjL3Jlc29sdi5jb25mIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KXJlc29sdi5jb25mJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJydyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi92YXIvcnVuL3NlY3JldHMva3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudCIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClzZXJ2aWNlYWNjb3VudCQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicm8iCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvdmFyL3J1bi9zZWNyZXRzL2F6dXJlL3Rva2VucyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeCl0b2tlbnMkIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL3JlZ2lzdHJhdGlvbiIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClyZWdpc3RyYXRpb24kIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJ3IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2NzaSIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeCljc2kkIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJ3IgogICAgICAgICAgICBdCiAgICAgICAgICB9CiAgICAgICAgXSwKICAgICAgICAiQW5ub3RhdGlvbnMiOiB7CiAgICAgICAgICAiaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5idW5kbGVfcGF0aCI6ICIvcnVuL2NvbnRhaW5lcmQvaW8uY29udGFpbmVyZC5ydW50aW1lLnYyLnRhc2svazhzLmlvLyQoYnVuZGxlLWlkKSIsCiAgICAgICAgICAiaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5jb250YWluZXJfdHlwZSI6ICJwb2RfY29udGFpbmVyIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItbmFtZSI6ICJjc2ktZHJpdmVyLXJlZ2lzdHJhciIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLXR5cGUiOiAiY29udGFpbmVyIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5pbWFnZS1uYW1lIjogInJlZ2lzdHJ5Lms4cy5pby9zaWctc3RvcmFnZS9jc2ktbm9kZS1kcml2ZXItcmVnaXN0cmFyOnYyLjUuMSIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCI6ICJeW2EtejAtOV17NjR9JCIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1uYW1lc3BhY2UiOiAiZGVmYXVsdCIKICAgICAgICB9LAogICAgICAgICJMaW51eCI6IHsKICAgICAgICAgICJOYW1lc3BhY2VzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgIlR5cGUiOiAiaXBjIiwKICAgICAgICAgICAgICAiUGF0aCI6ICIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiVHlwZSI6ICJ1dHMiLAogICAgICAgICAgICAgICJQYXRoIjogIiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJUeXBlIjogIm1vdW50IiwKICAgICAgICAgICAgICAiUGF0aCI6ICIiCiAgICAgICAgICAgIH0KICAgICAgICAgIF0sCiAgICAgICAgICAiTWFza2VkUGF0aHMiOiBbCiAgICAgICAgICAgICIvcHJvYy9hY3BpIiwKICAgICAgICAgICAgIi9wcm9jL2tjb3JlIiwKICAgICAgICAgICAgIi9wcm9jL2tleXMiLAogICAgICAgICAgICAiL3Byb2MvbGF0ZW5jeV9zdGF0cyIsCiAgICAgICAgICAgICIvcHJvYy90aW1lcl9saXN0IiwKICAgICAgICAgICAgIi9wcm9jL3RpbWVyX3N0YXRzIiwKICAgICAgICAgICAgIi9wcm9jL3NjaGVkX2RlYnVnIiwKICAgICAgICAgICAgIi9wcm9jL3Njc2kiLAogICAgICAgICAgICAiL3N5cy9maXJtd2FyZSIKICAgICAgICAgIF0sCiAgICAgICAgICAiUmVhZG9ubHlQYXRocyI6IFsKICAgICAgICAgICAgIi9wcm9jL2Fzb3VuZCIsCiAgICAgICAgICAgICIvcHJvYy9idXMiLAogICAgICAgICAgICAiL3Byb2MvZnMiLAogICAgICAgICAgICAiL3Byb2MvaXJxIiwKICAgICAgICAgICAgIi9wcm9jL3N5cyIsCiAgICAgICAgICAgICIvcHJvYy9zeXNycS10cmlnZ2VyIgogICAgICAgICAgXQogICAgICAgIH0KICAgICAgfSwKICAgICAgInN0b3JhZ2VzIjogWwogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2gwKSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjApIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2gxKSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjEpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAib3ZlcmxheWZzIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJmdXNlMy5rYXRhLW92ZXJsYXkiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICJjM2I0MDRhNzgyNmQ3ZjY5OTNlNDFiODcxY2YzY2M1NTFiZDQyM2NhNzM4YmJjNDBmZDMyMmZmZDFlMDljYTIwOjNjMThmMjdkZjFkMWYyOTYwNDNkNWIzYzhkNjJhMjkzMmJkZWNmZmE4ZmQwY2U0ZjE5NWI2OTZmMjYzNDc0ZjYiLAogICAgICAgICAgICAiYWUxYzA1Njk5OGZhZmNjMzA3ODQ4NWUwM2MxZDE5ZjU5MzBjNGE0NDRmMGZlYTJlZTU2MzliZTZmOTA3OGYyNTo0ZjNlMzhlMGUwYzA2Zjg1ZTJkMjE0YzBhNzgyNmUyYzBkZGI5ZDAxMTMwNzZhNDZiMTVkYTU5NjM5OWQ0NWRlIgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGNwYXRoKS8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0KICAgICAgXSwKICAgICAgInNhbmRib3hfcGlkbnMiOiBmYWxzZSwKICAgICAgImV4ZWNfY29tbWFuZHMiOiBbCiAgICAgICAgIi9iaW4vc2ggLWMgcm0gLXJmIC9yZWdpc3RyYXRpb24vcGQuY3NpLnN0b3JhZ2UuZ2tlLmlvIC9yZWdpc3RyYXRpb24vcGQuY3NpLnN0b3JhZ2UuZ2tlLmlvLXJlZy5zb2NrIgogICAgICBdCiAgICB9LAogICAgewogICAgICAiT0NJIjogewogICAgICAgICJWZXJzaW9uIjogIjEuMS4wLXJjLjEiLAogICAgICAgICJQcm9jZXNzIjogewogICAgICAgICAgIlRlcm1pbmFsIjogZmFsc2UsCiAgICAgICAgICAiVXNlciI6IHsKICAgICAgICAgICAgIlVJRCI6IDAsCiAgICAgICAgICAgICJHSUQiOiAwLAogICAgICAgICAgICAiQWRkaXRpb25hbEdpZHMiOiBbXSwKICAgICAgICAgICAgIlVzZXJuYW1lIjogIiIKICAgICAgICAgIH0sCiAgICAgICAgICAiQXJncyI6IFsKICAgICAgICAgICAgIi9nY2UtcGQtY3NpLWRyaXZlciIsCiAgICAgICAgICAgICItLXY9NSIsCiAgICAgICAgICAgICItLWVuZHBvaW50PXVuaXg6L2NzaS9jc2kuc29jayIsCiAgICAgICAgICAgICItLXJ1bi1jb250cm9sbGVyLXNlcnZpY2U9ZmFsc2UiCiAgICAgICAgICBdLAogICAgICAgICAgIkVudiI6IFsKICAgICAgICAgICAgIlBBVEg9L3Vzci9sb2NhbC9zYmluOi91c3IvbG9jYWwvYmluOi91c3Ivc2JpbjovdXNyL2Jpbjovc2JpbjovYmluIiwKICAgICAgICAgICAgIkhPU1ROQU1FPSQoaG9zdC1uYW1lKSIKICAgICAgICAgIF0sCiAgICAgICAgICAiQ3dkIjogIi8iLAogICAgICAgICAgIkNhcGFiaWxpdGllcyI6IHsKICAgICAgICAgICAgIkFtYmllbnQiOiBbXSwKICAgICAgICAgICAgIkJvdW5kaW5nIjogWwogICAgICAgICAgICAgICIkKHByaXZpbGVnZWRfY2FwcykiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJFZmZlY3RpdmUiOiBbCiAgICAgICAgICAgICAgIiQocHJpdmlsZWdlZF9jYXBzKSIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgIkluaGVyaXRhYmxlIjogW10sCiAgICAgICAgICAgICJQZXJtaXR0ZWQiOiBbCiAgICAgICAgICAgICAgIiQocHJpdmlsZWdlZF9jYXBzKSIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgICJOb05ld1ByaXZpbGVnZXMiOiBmYWxzZQogICAgICAgIH0sCiAgICAgICAgIlJvb3QiOiB7CiAgICAgICAgICAiUGF0aCI6ICIkKGNwYXRoKS8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgIlJlYWRvbmx5IjogZmFsc2UKICAgICAgICB9LAogICAgICAgICJNb3VudHMiOiBbCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvcHJvYyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAicHJvYyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJwcm9jIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAgICAgIm5vZGV2IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2RldiIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiL2RldiIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJydyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvcHRzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJkZXZwdHMiLAogICAgICAgICAgICAidHlwZV8iOiAiZGV2cHRzIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAgICAgIm5ld2luc3RhbmNlIiwKICAgICAgICAgICAgICAicHRteG1vZGU9MDY2NiIsCiAgICAgICAgICAgICAgIm1vZGU9MDYyMCIsCiAgICAgICAgICAgICAgImdpZD01IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi9zaG0iLAogICAgICAgICAgICAic291cmNlIjogIi9ydW4va2F0YS1jb250YWluZXJzL3NhbmRib3gvc2htIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L21xdWV1ZSIsCiAgICAgICAgICAgICJzb3VyY2UiOiAibXF1ZXVlIiwKICAgICAgICAgICAgInR5cGVfIjogIm1xdWV1ZSIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9zeXMiLAogICAgICAgICAgICAic291cmNlIjogIi9zeXMiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicnciCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvc3lzL2ZzL2Nncm91cCIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiY2dyb3VwIiwKICAgICAgICAgICAgInR5cGVfIjogImNncm91cCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIsCiAgICAgICAgICAgICAgInJlbGF0aW1lIiwKICAgICAgICAgICAgICAicnciCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZXRjL2hvc3RzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KWhvc3RzJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJydyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvdGVybWluYXRpb24tbG9nIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KXRlcm1pbmF0aW9uLWxvZyQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicnciCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZXRjL2hvc3RuYW1lIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KWhvc3RuYW1lJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJydyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9ldGMvcmVzb2x2LmNvbmYiLAogICAgICAgICAgICAic291cmNlIjogIiQoc2ZwcmVmaXgpcmVzb2x2LmNvbmYkIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJ3IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL3Zhci9ydW4vc2VjcmV0cy9rdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50IiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KXNlcnZpY2VhY2NvdW50JCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJybyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi92YXIvcnVuL3NlY3JldHMvYXp1cmUvdG9rZW5zIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KXRva2VucyQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicm8iCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvdmFyL2xpYi9rdWJlbGV0IiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KWt1YmVsZXQkIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJyc2hhcmVkIiwKICAgICAgICAgICAgICAicnciCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvY3NpIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KWNzaSQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicnciCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZXRjL3VkZXYiLAogICAgICAgICAgICAic291cmNlIjogIiQoc2ZwcmVmaXgpdWRldiQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicnciCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvbGliL3VkZXYiLAogICAgICAgICAgICAic291cmNlIjogIiQoc2ZwcmVmaXgpdWRldiQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicnciCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvcnVuL3VkZXYiLAogICAgICAgICAgICAic291cmNlIjogIiQoc2ZwcmVmaXgpdWRldiQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicnciCiAgICAgICAgICAgIF0KICAgICAgICAgIH0KICAgICAgICBdLAogICAgICAgICJBbm5vdGF0aW9ucyI6IHsKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmJ1bmRsZV9wYXRoIjogIi9ydW4vY29udGFpbmVyZC9pby5jb250YWluZXJkLnJ1bnRpbWUudjIudGFzay9rOHMuaW8vJChidW5kbGUtaWQpIiwKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIjogInBvZF9jb250YWluZXIiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLmNvbnRhaW5lci1uYW1lIjogImdjZS1wZC1kcml2ZXIiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLmNvbnRhaW5lci10eXBlIjogImNvbnRhaW5lciIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuaW1hZ2UtbmFtZSI6ICJyZWdpc3RyeS5rOHMuaW8vY2xvdWQtcHJvdmlkZXItZ2NwL2djcC1jb21wdXRlLXBlcnNpc3RlbnQtZGlzay1jc2ktZHJpdmVyOnYxLjIuMiIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCI6ICJeW2EtejAtOV17NjR9JCIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1uYW1lc3BhY2UiOiAiZGVmYXVsdCIKICAgICAgICB9LAogICAgICAgICJMaW51eCI6IHsKICAgICAgICAgICJOYW1lc3BhY2VzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgIlR5cGUiOiAiaXBjIiwKICAgICAgICAgICAgICAiUGF0aCI6ICIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiVHlwZSI6ICJ1dHMiLAogICAgICAgICAgICAgICJQYXRoIjogIiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJUeXBlIjogIm1vdW50IiwKICAgICAgICAgICAgICAiUGF0aCI6ICIiCiAgICAgICAgICAgIH0KICAgICAgICAgIF0sCiAgICAgICAgICAiTWFza2VkUGF0aHMiOiBbXSwKICAgICAgICAgICJSZWFkb25seVBhdGhzIjogW10KICAgICAgICB9CiAgICAgIH0sCiAgICAgICJzdG9yYWdlcyI6IFsKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoMCkiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXIwKSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoMSkiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXIxKSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoMikiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXIyKSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoMykiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXIzKSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogIm92ZXJsYXlmcyIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAiZnVzZTMua2F0YS1vdmVybGF5IiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiNTVmMjcyMDgwYTg1MDllYjhmZWI5MDExODI1YzkxZjE0YThhOGJiN2U3NzRmOTY2NjZkOWUyNDc0MzU0OWZmMjo2NmExMzNhZGE4YzgyYmI2NjY3OGExY2I3NzM2YzdhZWZlNzY1NTA3Y2NmN2U3YWExYTJkMmYxYjljY2ZhOTlhOmY4ZWNhNjAyN2JkNGVlZTFjNWE4YTRhZGU1MGNiOTdiYmJiZjczYmQyNGUxMzYyMDliYzhmNDc3ODc4ZWIwZTc6ODBhNjhiZDUzN2IwMWYyMjhjNmU3OTVjY2U2YzhmNjY2ZGU1N2IwM2M4NGIyODE3OWQ3MjBlZjk4OWRiZDg4MSIsCiAgICAgICAgICAgICI5Y2M1Zjg2Y2E3ZWE4MTllNWY5ODU5YzQ3ZTQyYTVhNmY1ZDc5NTgwYjBmMzg2YTYzNzdhYmFiOWI0OWE5NGUzOmZkMTU2YTFhMmMyYWUxNjA3NTQ3ZjdlZGFjMDVkNWEyNWQzMmE0MWEyOTZhYWFlNjRlY2NiZGZjN2M3MTM5Yjc6NTBmYjNlMThkNzhhNWYyMmZmOGVlYTJkNjNiYzRlMDkzZDM2MGE5MzVmZTRjNGFjMzI0ZDEyM2I0Y2M4NTIwYTpmZmVmYTgyMWEzMzUyODFhYjRlYWVjMGNiZjQwYmM5OTAwNDRmMGNjZGEwOWNhZDk0NGNjOTMwZGJhODgzZDNmIgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGNwYXRoKS8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0KICAgICAgXSwKICAgICAgInNhbmRib3hfcGlkbnMiOiBmYWxzZSwKICAgICAgImV4ZWNfY29tbWFuZHMiOiBbXQogICAgfQogIF0sCiAgImNvbW1vbiI6IHsKICAgICJjcGF0aCI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zaGFyZWQvY29udGFpbmVycyIsCiAgICAic2ZwcmVmaXgiOiAiXiQoY3BhdGgpLyQoYnVuZGxlLWlkKS1bYS16MC05XXsxNn0tIiwKICAgICJzcGF0aCI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L3N0b3JhZ2UiLAogICAgImlwdjRfYSI6ICIoKDI1WzAtNV18KDJbMC00XXwxXFxkfFsxLTldfClcXGQpXFwuP1xcYil7NH0iLAogICAgImlwX3AiOiAiWzAtOV17MSw1fSIsCiAgICAic3ZjX25hbWUiOiAiW0EtWjAtOV9cXC5cXC1dKyIsCiAgICAiZG5zX2xhYmVsIjogIlthLXpBLVowLTlfXFwuXFwtXSsiLAogICAgInNfc291cmNlMSI6ICJeLi4yWzAtOV17M31fWzAtMV1bMC05XV9bMC0zXVswLTldX1swLTJdWzAtOV1fWzAtNV1bMC05XV9bMC01XVswLTldXFwuWzAtOV17MSwxMH0kIiwKICAgICJzX3NvdXJjZTIiOiAiXi4uZGF0YS8iLAogICAgImRlZmF1bHRfY2FwcyI6IFsKICAgICAgIkNBUF9DSE9XTiIsCiAgICAgICJDQVBfREFDX09WRVJSSURFIiwKICAgICAgIkNBUF9GU0VUSUQiLAogICAgICAiQ0FQX0ZPV05FUiIsCiAgICAgICJDQVBfTUtOT0QiLAogICAgICAiQ0FQX05FVF9SQVciLAogICAgICAiQ0FQX1NFVEdJRCIsCiAgICAgICJDQVBfU0VUVUlEIiwKICAgICAgIkNBUF9TRVRGQ0FQIiwKICAgICAgIkNBUF9TRVRQQ0FQIiwKICAgICAgIkNBUF9ORVRfQklORF9TRVJWSUNFIiwKICAgICAgIkNBUF9TWVNfQ0hST09UIiwKICAgICAgIkNBUF9LSUxMIiwKICAgICAgIkNBUF9BVURJVF9XUklURSIKICAgIF0sCiAgICAicHJpdmlsZWdlZF9jYXBzIjogWwogICAgICAiQ0FQX0NIT1dOIiwKICAgICAgIkNBUF9EQUNfT1ZFUlJJREUiLAogICAgICAiQ0FQX0RBQ19SRUFEX1NFQVJDSCIsCiAgICAgICJDQVBfRk9XTkVSIiwKICAgICAgIkNBUF9GU0VUSUQiLAogICAgICAiQ0FQX0tJTEwiLAogICAgICAiQ0FQX1NFVEdJRCIsCiAgICAgICJDQVBfU0VUVUlEIiwKICAgICAgIkNBUF9TRVRQQ0FQIiwKICAgICAgIkNBUF9MSU5VWF9JTU1VVEFCTEUiLAogICAgICAiQ0FQX05FVF9CSU5EX1NFUlZJQ0UiLAogICAgICAiQ0FQX05FVF9CUk9BRENBU1QiLAogICAgICAiQ0FQX05FVF9BRE1JTiIsCiAgICAgICJDQVBfTkVUX1JBVyIsCiAgICAgICJDQVBfSVBDX0xPQ0siLAogICAgICAiQ0FQX0lQQ19PV05FUiIsCiAgICAgICJDQVBfU1lTX01PRFVMRSIsCiAgICAgICJDQVBfU1lTX1JBV0lPIiwKICAgICAgIkNBUF9TWVNfQ0hST09UIiwKICAgICAgIkNBUF9TWVNfUFRSQUNFIiwKICAgICAgIkNBUF9TWVNfUEFDQ1QiLAogICAgICAiQ0FQX1NZU19BRE1JTiIsCiAgICAgICJDQVBfU1lTX0JPT1QiLAogICAgICAiQ0FQX1NZU19OSUNFIiwKICAgICAgIkNBUF9TWVNfUkVTT1VSQ0UiLAogICAgICAiQ0FQX1NZU19USU1FIiwKICAgICAgIkNBUF9TWVNfVFRZX0NPTkZJRyIsCiAgICAgICJDQVBfTUtOT0QiLAogICAgICAiQ0FQX0xFQVNFIiwKICAgICAgIkNBUF9BVURJVF9XUklURSIsCiAgICAgICJDQVBfQVVESVRfQ09OVFJPTCIsCiAgICAgICJDQVBfU0VURkNBUCIsCiAgICAgICJDQVBfTUFDX09WRVJSSURFIiwKICAgICAgIkNBUF9NQUNfQURNSU4iLAogICAgICAiQ0FQX1NZU0xPRyIsCiAgICAgICJDQVBfV0FLRV9BTEFSTSIsCiAgICAgICJDQVBfQkxPQ0tfU1VTUEVORCIsCiAgICAgICJDQVBfQVVESVRfUkVBRCIsCiAgICAgICJDQVBfUEVSRk1PTiIsCiAgICAgICJDQVBfQlBGIiwKICAgICAgIkNBUF9DSEVDS1BPSU5UX1JFU1RPUkUiCiAgICBdLAogICAgInZpcnRpb19ibGtfc3RvcmFnZV9jbGFzc2VzIjogWwogICAgICAiY2MtbG9jYWwtY3NpIiwKICAgICAgImNjLW1hbmFnZWQtY3NpIiwKICAgICAgImNjLW1hbmFnZWQtcHJlbWl1bS1jc2kiCiAgICBdLAogICAgInNtYl9zdG9yYWdlX2NsYXNzZXMiOiBbCiAgICAgIHsKICAgICAgICAibmFtZSI6ICJhenVyZWZpbGUtY3NpLWthdGEtY2MiLAogICAgICAgICJtb3VudF9vcHRpb25zIjogWwogICAgICAgICAgImRpcl9tb2RlPTA3NzciLAogICAgICAgICAgImZpbGVfbW9kZT0wNzc3IiwKICAgICAgICAgICJtZnN5bWxpbmtzIiwKICAgICAgICAgICJjYWNoZT1zdHJpY3QiLAogICAgICAgICAgIm5vc2hhcmVzb2NrIiwKICAgICAgICAgICJhY3RpbWVvPTMwIiwKICAgICAgICAgICJub2JybCIKICAgICAgICBdCiAgICAgIH0KICAgIF0KICB9LAogICJzYW5kYm94IjogewogICAgInN0b3JhZ2VzIjogWwogICAgICB7CiAgICAgICAgImRyaXZlciI6ICJlcGhlbWVyYWwiLAogICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICJzb3VyY2UiOiAic2htIiwKICAgICAgICAiZnN0eXBlIjogInRtcGZzIiwKICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAibm9kZXYiLAogICAgICAgICAgIm1vZGU9MTc3NyIsCiAgICAgICAgICAic2l6ZT02NzEwODg2NCIKICAgICAgICBdLAogICAgICAgICJtb3VudF9wb2ludCI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L3NobSIsCiAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICB9CiAgICBdCiAgfSwKICAicmVxdWVzdF9kZWZhdWx0cyI6IHsKICAgICJDcmVhdGVDb250YWluZXJSZXF1ZXN0IjogewogICAgICAiYWxsb3dfZW52X3JlZ2V4IjogWwogICAgICAgICJeSE9TVE5BTUU9JChkbnNfbGFiZWwpJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9QT1JUXyQoaXBfcClfVENQPXRjcDovLyQoaXB2NF9hKTokKGlwX3ApJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9QT1JUXyQoaXBfcClfVENQX1BST1RPPXRjcCQiLAogICAgICAgICJeJChzdmNfbmFtZSlfUE9SVF8kKGlwX3ApX1RDUF9QT1JUPSQoaXBfcCkkIiwKICAgICAgICAiXiQoc3ZjX25hbWUpX1BPUlRfJChpcF9wKV9UQ1BfQUREUj0kKGlwdjRfYSkkIiwKICAgICAgICAiXiQoc3ZjX25hbWUpX1NFUlZJQ0VfSE9TVD0kKGlwdjRfYSkkIiwKICAgICAgICAiXiQoc3ZjX25hbWUpX1NFUlZJQ0VfUE9SVD0kKGlwX3ApJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9TRVJWSUNFX1BPUlRfJChkbnNfbGFiZWwpPSQoaXBfcCkkIiwKICAgICAgICAiXiQoc3ZjX25hbWUpX1BPUlQ9dGNwOi8vJChpcHY0X2EpOiQoaXBfcCkkIiwKICAgICAgICAiXkFaVVJFX0NMSUVOVF9JRD1bQS1GYS1mMC05LV0qJCIsCiAgICAgICAgIl5BWlVSRV9URU5BTlRfSUQ9W0EtRmEtZjAtOS1dKiQiLAogICAgICAgICJeQVpVUkVfRkVERVJBVEVEX1RPS0VOX0ZJTEU9L3Zhci9ydW4vc2VjcmV0cy9henVyZS90b2tlbnMvYXp1cmUtaWRlbnRpdHktdG9rZW4kIiwKICAgICAgICAiXkFaVVJFX0FVVEhPUklUWV9IT1NUPWh0dHBzOi8vbG9naW5cXC5taWNyb3NvZnRvbmxpbmVcXC5jb20vJCIsCiAgICAgICAgIl5URVJNPXh0ZXJtJCIKICAgICAgXQogICAgfSwKICAgICJDb3B5RmlsZVJlcXVlc3QiOiBbCiAgICAgICIkKHNmcHJlZml4KSIKICAgIF0sCiAgICAiRXhlY1Byb2Nlc3NSZXF1ZXN0IjogewogICAgICAiY29tbWFuZHMiOiBbXSwKICAgICAgInJlZ2V4IjogW10KICAgIH0sCiAgICAiQ2xvc2VTdGRpblJlcXVlc3QiOiBmYWxzZSwKICAgICJSZWFkU3RyZWFtUmVxdWVzdCI6IHRydWUsCiAgICAiVXBkYXRlRXBoZW1lcmFsTW91bnRzUmVxdWVzdCI6IGZhbHNlLAogICAgIldyaXRlU3RyZWFtUmVxdWVzdCI6IGZhbHNlCiAgfQp9 + spec: + nodeSelector: + kubernetes.io/os: linux + runtimeClassName: kata-cc + containers: + - name: csi-driver-registrar + image: "registry.k8s.io/sig-storage/csi-node-driver-registrar:v2.5.1" + volumeMounts: + - mountPath: /csi + name: plugin-dir + - mountPath: /registration + name: registration-dir + env: + - name: KUBE_NODE_NAME + valueFrom: + fieldRef: + fieldPath: spec.nodeName + ports: + - containerPort: 22013 + name: http-endpoint + protocol: TCP + args: + - "--v=5" + - "--csi-address=/csi/csi.sock" + - "--kubelet-registration-path=/var/lib/kubelet/plugins/pd.csi.storage.gke.io/csi.sock" + - "--http-endpoint=:22013" + lifecycle: + preStop: + exec: + command: + - /bin/sh + - "-c" + - rm -rf /registration/pd.csi.storage.gke.io /registration/pd.csi.storage.gke.io-reg.sock + livenessProbe: + initialDelaySeconds: 10 + timeoutSeconds: 10 + periodSeconds: 20 + failureThreshold: 1 + httpGet: + port: http-endpoint + path: /healthz + - name: gce-pd-driver + image: "registry.k8s.io/cloud-provider-gcp/gcp-compute-persistent-disk-csi-driver:v1.2.2" + securityContext: + privileged: true + volumeMounts: + - mountPath: /var/lib/kubelet + name: kubelet-dir + mountPropagation: Bidirectional + - mountPath: /csi + name: plugin-dir + - mountPath: /dev + name: device-dir + - mountPath: /etc/udev + name: udev-rules-etc + - mountPath: /lib/udev + name: udev-rules-lib + - mountPath: /run/udev + name: udev-socket + - mountPath: /sys + name: sys + args: + - "--v=5" + - "--endpoint=unix:/csi/csi.sock" + - "--run-controller-service=false" + volumes: + - name: registration-dir + hostPath: + path: /var/lib/kubelet/plugins_registry/ + type: Directory + - name: kubelet-dir + hostPath: + path: /var/lib/kubelet + type: Directory + - name: plugin-dir + hostPath: + path: /var/lib/kubelet/plugins/pd.csi.storage.gke.io/ + type: DirectoryOrCreate + - name: device-dir + hostPath: + path: /dev + type: Directory + - name: udev-rules-etc + hostPath: + path: /etc/udev + type: Directory + - name: udev-rules-lib + hostPath: + path: /lib/udev + type: Directory + - name: udev-socket + hostPath: + path: /run/udev + type: Directory + - name: sys + hostPath: + path: /sys + type: Directory + tolerations: + - operator: Exists diff --git a/src/agent/samples/policy/yaml/kubernetes/incomplete-init/redis-master-controller.yaml b/src/agent/samples/policy/yaml/kubernetes/incomplete-init/redis-master-controller.yaml new file mode 100644 index 000000000000..c430a51c0802 --- /dev/null +++ b/src/agent/samples/policy/yaml/kubernetes/incomplete-init/redis-master-controller.yaml @@ -0,0 +1,30 @@ +--- +apiVersion: v1 +kind: ReplicationController +metadata: + name: redis-master + labels: + app: redis + role: master + tier: backend +spec: + replicas: 1 + template: + metadata: + labels: + app: redis + role: master + tier: backend + annotations: + io.katacontainers.config.agent.policy: cGFja2FnZSBhZ2VudF9wb2xpY3kKCmltcG9ydCBmdXR1cmUua2V5d29yZHMuaW4KaW1wb3J0IGZ1dHVyZS5rZXl3b3Jkcy5ldmVyeQoKaW1wb3J0IGlucHV0CgojIERlZmF1bHQgdmFsdWVzLCByZXR1cm5lZCBieSBPUEEgd2hlbiBydWxlcyBjYW5ub3QgYmUgZXZhbHVhdGVkIHRvIHRydWUuCmRlZmF1bHQgQ29weUZpbGVSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgQ3JlYXRlQ29udGFpbmVyUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IENyZWF0ZVNhbmRib3hSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBEZXN0cm95U2FuZGJveFJlcXVlc3QgOj0gdHJ1ZQpkZWZhdWx0IEV4ZWNQcm9jZXNzUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IEdldE9PTUV2ZW50UmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgR3Vlc3REZXRhaWxzUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgT25saW5lQ1BVTWVtUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgUHVsbEltYWdlUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgUmVhZFN0cmVhbVJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBSZW1vdmVDb250YWluZXJSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBSZW1vdmVTdGFsZVZpcnRpb2ZzU2hhcmVNb3VudHNSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBTaWduYWxQcm9jZXNzUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgU3RhcnRDb250YWluZXJSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBTdGF0c0NvbnRhaW5lclJlcXVlc3QgOj0gdHJ1ZQpkZWZhdWx0IFR0eVdpblJlc2l6ZVJlcXVlc3QgOj0gdHJ1ZQpkZWZhdWx0IFVwZGF0ZUVwaGVtZXJhbE1vdW50c1JlcXVlc3QgOj0gdHJ1ZQpkZWZhdWx0IFVwZGF0ZUludGVyZmFjZVJlcXVlc3QgOj0gdHJ1ZQpkZWZhdWx0IFVwZGF0ZVJvdXRlc1JlcXVlc3QgOj0gdHJ1ZQpkZWZhdWx0IFdhaXRQcm9jZXNzUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgV3JpdGVTdHJlYW1SZXF1ZXN0IDo9IGZhbHNlCgojIEFsbG93UmVxdWVzdHNGYWlsaW5nUG9saWN5IDo9IHRydWUgY29uZmlndXJlcyB0aGUgQWdlbnQgdG8gKmFsbG93IGFueQojIHJlcXVlc3RzIGNhdXNpbmcgYSBwb2xpY3kgZmFpbHVyZSouIFRoaXMgaXMgYW4gdW5zZWN1cmUgY29uZmlndXJhdGlvbgojIGJ1dCBpcyB1c2VmdWwgZm9yIGFsbG93aW5nIHVuc2VjdXJlIHBvZHMgdG8gc3RhcnQsIHRoZW4gY29ubmVjdCB0bwojIHRoZW0gYW5kIGluc3BlY3QgT1BBIGxvZ3MgZm9yIHRoZSByb290IGNhdXNlIG9mIGEgZmFpbHVyZS4KZGVmYXVsdCBBbGxvd1JlcXVlc3RzRmFpbGluZ1BvbGljeSA6PSBmYWxzZQoKQ3JlYXRlQ29udGFpbmVyUmVxdWVzdCB7CiAgICBpX29jaSA6PSBpbnB1dC5PQ0kKICAgIGlfc3RvcmFnZXMgOj0gaW5wdXQuc3RvcmFnZXMKCiAgICBzb21lIHBfY29udGFpbmVyIGluIHBvbGljeV9kYXRhLmNvbnRhaW5lcnMKICAgIHByaW50KCI9PT09PT09PSBDcmVhdGVDb250YWluZXJSZXF1ZXN0OiB0cnlpbmcgbmV4dCBwb2xpY3kgY29udGFpbmVyIikKCiAgICBwX29jaSA6PSBwX2NvbnRhaW5lci5PQ0kKICAgIHBfc3RvcmFnZXMgOj0gcF9jb250YWluZXIuc3RvcmFnZXMKCiAgICBwcmludCgiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdDogcCBWZXJzaW9uID0iLCBwX29jaS5WZXJzaW9uLCAiaSBWZXJzaW9uID0iLCBpX29jaS5WZXJzaW9uKQogICAgcF9vY2kuVmVyc2lvbiA9PSBpX29jaS5WZXJzaW9uCgogICAgcHJpbnQoIkNyZWF0ZUNvbnRhaW5lclJlcXVlc3Q6IHAgUmVhZG9ubHkgPSIsIHBfb2NpLlJvb3QuUmVhZG9ubHksICJpIFJlYWRvbmx5ID0iLCBpX29jaS5Sb290LlJlYWRvbmx5KQogICAgcF9vY2kuUm9vdC5SZWFkb25seSA9PSBpX29jaS5Sb290LlJlYWRvbmx5CgogICAgYWxsb3dfYW5ubyhwX29jaSwgaV9vY2kpCiAgICBhbGxvd19ieV9hbm5vKHBfb2NpLCBpX29jaSwgcF9zdG9yYWdlcywgaV9zdG9yYWdlcykKICAgIGFsbG93X2xpbnV4KHBfb2NpLCBpX29jaSkKCiAgICBwcmludCgiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdDogdHJ1ZSIpCn0KCiMgUmVqZWN0IHVuZXhwZWN0ZWQgYW5ub3RhdGlvbnMuCmFsbG93X2Fubm8ocF9vY2ksIGlfb2NpKSB7CiAgICBwcmludCgiYWxsb3dfYW5ubyAxOiBzdGFydCIpCgogICAgbm90IGlfb2NpLkFubm90YXRpb25zCgogICAgcHJpbnQoImFsbG93X2Fubm8gMTogdHJ1ZSIpCn0KYWxsb3dfYW5ubyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19hbm5vIDI6IHAgQW5ub3RhdGlvbnMgPSIsIHBfb2NpLkFubm90YXRpb25zKQogICAgcHJpbnQoImFsbG93X2Fubm8gMjogaSBBbm5vdGF0aW9ucyA9IiwgaV9vY2kuQW5ub3RhdGlvbnMpCgogICAgaV9rZXlzIDo9IG9iamVjdC5rZXlzKGlfb2NpLkFubm90YXRpb25zKQogICAgcHJpbnQoImFsbG93X2Fubm8gMjogaSBrZXlzID0iLCBpX2tleXMpCgogICAgZXZlcnkgaV9rZXkgaW4gaV9rZXlzIHsKICAgICAgICBhbGxvd19hbm5vX2tleShpX2tleSwgcF9vY2kpCiAgICB9CgogICAgcHJpbnQoImFsbG93X2Fubm8gMjogdHJ1ZSIpCn0KCmFsbG93X2Fubm9fa2V5KGlfa2V5LCBwX29jaSkgewogICAgcHJpbnQoImFsbG93X2Fubm9fa2V5IDE6IGkga2V5ID0iLCBpX2tleSkKCiAgICBzdGFydHN3aXRoKGlfa2V5LCAiaW8ua3ViZXJuZXRlcy5jcmkuIikKCiAgICBwcmludCgiYWxsb3dfYW5ub19rZXkgMTogdHJ1ZSIpCn0KYWxsb3dfYW5ub19rZXkoaV9rZXksIHBfb2NpKSB7CiAgICBwcmludCgiYWxsb3dfYW5ub19rZXkgMjogaSBrZXkgPSIsIGlfa2V5KQoKICAgIHNvbWUgcF9rZXksIF8gaW4gcF9vY2kuQW5ub3RhdGlvbnMKICAgIHBfa2V5ID09IGlfa2V5CgogICAgcHJpbnQoImFsbG93X2Fubm9fa2V5IDI6IHRydWUiKQp9CgojIEdldCB0aGUgdmFsdWUgb2YgdGhlICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LW5hbWUiIGFubm90YXRpb24gYW5kCiMgY29ycmVsYXRlIGl0IHdpdGggb3RoZXIgYW5ub3RhdGlvbnMgYW5kIHByb2Nlc3MgZmllbGRzLgphbGxvd19ieV9hbm5vKHBfb2NpLCBpX29jaSwgcF9zdG9yYWdlcywgaV9zdG9yYWdlcykgewogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMTogc3RhcnQiKQoKICAgIHNfbmFtZSA6PSAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1uYW1lIgoKICAgIG5vdCBwX29jaS5Bbm5vdGF0aW9uc1tzX25hbWVdCgogICAgaV9zX25hbWUgOj0gaV9vY2kuQW5ub3RhdGlvbnNbc19uYW1lXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMTogaV9zX25hbWUgPSIsIGlfc19uYW1lKQoKICAgIGFsbG93X2J5X3NhbmRib3hfbmFtZShwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMsIGlfc19uYW1lKQoKICAgIHByaW50KCJhbGxvd19ieV9hbm5vIDE6IHRydWUiKQp9CmFsbG93X2J5X2Fubm8ocF9vY2ksIGlfb2NpLCBwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzKSB7CiAgICBwcmludCgiYWxsb3dfYnlfYW5ubyAyOiBzdGFydCIpCgogICAgc19uYW1lIDo9ICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LW5hbWUiCgogICAgcF9zX25hbWUgOj0gcF9vY2kuQW5ub3RhdGlvbnNbc19uYW1lXQogICAgaV9zX25hbWUgOj0gaV9vY2kuQW5ub3RhdGlvbnNbc19uYW1lXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMjogaV9zX25hbWUgPSIsIGlfc19uYW1lLCAicF9zX25hbWUgPSIsIHBfc19uYW1lKQoKICAgIGFsbG93X3NhbmRib3hfbmFtZShwX3NfbmFtZSwgaV9zX25hbWUpCiAgICBhbGxvd19ieV9zYW5kYm94X25hbWUocF9vY2ksIGlfb2NpLCBwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBpX3NfbmFtZSkKCiAgICBwcmludCgiYWxsb3dfYnlfYW5ubyAyOiB0cnVlIikKfQoKYWxsb3dfYnlfc2FuZGJveF9uYW1lKHBfb2NpLCBpX29jaSwgcF9zdG9yYWdlcywgaV9zdG9yYWdlcywgc19uYW1lKSB7CiAgICBwcmludCgiYWxsb3dfYnlfc2FuZGJveF9uYW1lOiBzdGFydCIpCgogICAgc19uYW1lc3BhY2UgOj0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZXNwYWNlIgoKICAgIHBfbmFtZXNwYWNlIDo9IHBfb2NpLkFubm90YXRpb25zW3NfbmFtZXNwYWNlXQogICAgaV9uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNbc19uYW1lc3BhY2VdCiAgICBwcmludCgiYWxsb3dfYnlfc2FuZGJveF9uYW1lOiBwX25hbWVzcGFjZSA9IiwgcF9uYW1lc3BhY2UsICJpX25hbWVzcGFjZSA9IiwgaV9uYW1lc3BhY2UpCiAgICBwX25hbWVzcGFjZSA9PSBpX25hbWVzcGFjZQoKICAgIGFsbG93X2J5X2NvbnRhaW5lcl90eXBlcyhwX29jaSwgaV9vY2ksIHNfbmFtZSwgcF9uYW1lc3BhY2UpCiAgICBhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZChwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpCiAgICBhbGxvd19wcm9jZXNzKHBfb2NpLCBpX29jaSwgc19uYW1lKQoKICAgIHByaW50KCJhbGxvd19ieV9zYW5kYm94X25hbWU6IHRydWUiKQp9CgphbGxvd19zYW5kYm94X25hbWUocF9zX25hbWUsIGlfc19uYW1lKSB7CiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9uYW1lIDE6IHN0YXJ0IikKCiAgICBwX3NfbmFtZSA9PSBpX3NfbmFtZQoKICAgIHByaW50KCJhbGxvd19zYW5kYm94X25hbWUgMTogdHJ1ZSIpCn0KYWxsb3dfc2FuZGJveF9uYW1lKHBfc19uYW1lLCBpX3NfbmFtZSkgewogICAgcHJpbnQoImFsbG93X3NhbmRib3hfbmFtZSAyOiBzdGFydCIpCgogICAgIyBUT0RPOiBzaG91bGQgZ2VuZXJhdGVkIG5hbWVzIGJlIGhhbmRsZWQgZGlmZmVyZW50bHk/CiAgICBjb250YWlucyhwX3NfbmFtZSwgIiQoZ2VuZXJhdGVkLW5hbWUpIikKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9uYW1lIDI6IHRydWUiKQp9CgojIENoZWNrIHRoYXQgdGhlICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSIgYW5kCiMgImlvLmthdGFjb250YWluZXJzLnBrZy5vY2kuY29udGFpbmVyX3R5cGUiIGFubm90YXRpb25zIGRlc2lnbmF0ZSB0aGUKIyBleHBlY3RlZCB0eXBlIC0gZWl0aGVyIGEgInNhbmRib3giIG9yIGEgImNvbnRhaW5lciIuIFRoZW4sIHZhbGlkYXRlCiMgb3RoZXIgYW5ub3RhdGlvbnMgYmFzZWQgb24gdGhlIGFjdHVhbCAic2FuZGJveCIgb3IgImNvbnRhaW5lciIgdmFsdWUKIyBmcm9tIHRoZSBpbnB1dCBjb250YWluZXIuCmFsbG93X2J5X2NvbnRhaW5lcl90eXBlcyhwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZXM6IGNoZWNraW5nIGlvLmt1YmVybmV0ZXMuY3JpLmNvbnRhaW5lci10eXBlIikKCiAgICBjX3R5cGUgOj0gImlvLmt1YmVybmV0ZXMuY3JpLmNvbnRhaW5lci10eXBlIgogICAgCiAgICBwX2NyaV90eXBlIDo9IHBfb2NpLkFubm90YXRpb25zW2NfdHlwZV0KICAgIGlfY3JpX3R5cGUgOj0gaV9vY2kuQW5ub3RhdGlvbnNbY190eXBlXQogICAgcHJpbnQoImFsbG93X2J5X2NvbnRhaW5lcl90eXBlczogcF9jcmlfdHlwZSA9IiwgcF9jcmlfdHlwZSwgImlfY3JpX3R5cGUgPSIsIGlfY3JpX3R5cGUpCiAgICBwX2NyaV90eXBlID09IGlfY3JpX3R5cGUKCiAgICBhbGxvd19ieV9jb250YWluZXJfdHlwZShpX2NyaV90eXBlLCBwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpCgogICAgcHJpbnQoImFsbG93X2J5X2NvbnRhaW5lcl90eXBlczogdHJ1ZSIpCn0KCmFsbG93X2J5X2NvbnRhaW5lcl90eXBlKGlfY3JpX3R5cGUsIHBfb2NpLCBpX29jaSwgc19uYW1lLCBzX25hbWVzcGFjZSkgewogICAgcHJpbnQoImFsbG93X2J5X2NvbnRhaW5lcl90eXBlIDE6IGlfY3JpX3R5cGUgPSIsIGlfY3JpX3R5cGUpCiAgICBpX2NyaV90eXBlID09ICJzYW5kYm94IgoKICAgIGlfa2F0YV90eXBlIDo9IGlfb2NpLkFubm90YXRpb25zWyJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIl0KICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAxOiBpX2thdGFfdHlwZSA9IiwgaV9rYXRhX3R5cGUpCiAgICBpX2thdGFfdHlwZSA9PSAicG9kX3NhbmRib3giCgogICAgYWxsb3dfc2FuZGJveF9jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpCiAgICBhbGxvd19zYW5kYm94X25ldF9uYW1lc3BhY2UocF9vY2ksIGlfb2NpKQogICAgYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5KHBfb2NpLCBpX29jaSwgc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfYnlfY29udGFpbmVyX3R5cGUgMTogdHJ1ZSIpCn0KCmFsbG93X2J5X2NvbnRhaW5lcl90eXBlKGlfY3JpX3R5cGUsIHBfb2NpLCBpX29jaSwgc19uYW1lLCBzX25hbWVzcGFjZSkgewogICAgcHJpbnQoImFsbG93X2J5X2NvbnRhaW5lcl90eXBlIDI6IGlfY3JpX3R5cGUgPSIsIGlfY3JpX3R5cGUpCiAgICBpX2NyaV90eXBlID09ICJjb250YWluZXIiCgogICAgaV9rYXRhX3R5cGUgOj0gaV9vY2kuQW5ub3RhdGlvbnNbImlvLmthdGFjb250YWluZXJzLnBrZy5vY2kuY29udGFpbmVyX3R5cGUiXQogICAgcHJpbnQoImFsbG93X2J5X2NvbnRhaW5lcl90eXBlIDI6IGlfa2F0YV90eXBlID0iLCBpX2thdGFfdHlwZSkKICAgIGlfa2F0YV90eXBlID09ICJwb2RfY29udGFpbmVyIgoKICAgIGFsbG93X2NvbnRhaW5lcl9uYW1lKHBfb2NpLCBpX29jaSkKICAgIGFsbG93X25ldF9uYW1lc3BhY2UocF9vY2ksIGlfb2NpKQogICAgYWxsb3dfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2kpCgogICAgcHJpbnQoImFsbG93X2J5X2NvbnRhaW5lcl90eXBlIDI6IHRydWUiKQp9CgojICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItbmFtZSIgYW5ub3RhdGlvbgphbGxvd19zYW5kYm94X2NvbnRhaW5lcl9uYW1lKHBfb2NpLCBpX29jaSkgewogICAgcHJpbnQoImFsbG93X3NhbmRib3hfY29udGFpbmVyX25hbWU6IHN0YXJ0IikKCiAgICBjb250YWluZXJfYW5ub3RhdGlvbl9taXNzaW5nKHBfb2NpLCBpX29jaSwgImlvLmt1YmVybmV0ZXMuY3JpLmNvbnRhaW5lci1uYW1lIikKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9jb250YWluZXJfbmFtZTogdHJ1ZSIpCn0KCmFsbG93X2NvbnRhaW5lcl9uYW1lKHBfb2NpLCBpX29jaSkgewogICAgcHJpbnQoImFsbG93X2NvbnRhaW5lcl9uYW1lOiBzdGFydCIpCgogICAgYWxsb3dfY29udGFpbmVyX2Fubm90YXRpb24ocF9vY2ksIGlfb2NpLCAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLW5hbWUiKQoKICAgIHByaW50KCJhbGxvd19jb250YWluZXJfbmFtZTogdHJ1ZSIpCn0KCmNvbnRhaW5lcl9hbm5vdGF0aW9uX21pc3NpbmcocF9vY2ksIGlfb2NpLCBrZXkpIHsKICAgIHByaW50KCJjb250YWluZXJfYW5ub3RhdGlvbl9taXNzaW5nOiIsIGtleSkKCiAgICBub3QgcF9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgbm90IGlfb2NpLkFubm90YXRpb25zW2tleV0KCiAgICBwcmludCgiY29udGFpbmVyX2Fubm90YXRpb25fbWlzc2luZzogdHJ1ZSIpCn0KCmFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uKHBfb2NpLCBpX29jaSwga2V5KSB7CiAgICBwcmludCgiYWxsb3dfY29udGFpbmVyX2Fubm90YXRpb246IGtleSA9Iiwga2V5KQoKICAgIHBfdmFsdWUgOj0gcF9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgaV92YWx1ZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICBwcmludCgiYWxsb3dfY29udGFpbmVyX2Fubm90YXRpb246IHBfdmFsdWUgPSIsIHBfdmFsdWUsICJpX3ZhbHVlID0iLCBpX3ZhbHVlKQoKICAgIHBfdmFsdWUgPT0gaV92YWx1ZQoKICAgIHByaW50KCJhbGxvd19jb250YWluZXJfYW5ub3RhdGlvbjogdHJ1ZSIpCn0KCiMgIm5lcmRjdGwvbmV0d29yay1uYW1lc3BhY2UiIGFubm90YXRpb24KYWxsb3dfc2FuZGJveF9uZXRfbmFtZXNwYWNlKHBfb2NpLCBpX29jaSkgewogICAgcHJpbnQoImFsbG93X3NhbmRib3hfbmV0X25hbWVzcGFjZTogc3RhcnQiKQoKICAgIGtleSA6PSAibmVyZGN0bC9uZXR3b3JrLW5hbWVzcGFjZSIKCiAgICBwX25hbWVzcGFjZSA6PSBwX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICBpX25hbWVzcGFjZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9uZXRfbmFtZXNwYWNlOiBwX25hbWVzcGFjZSA9IiwgcF9uYW1lc3BhY2UsICJpX25hbWVzcGFjZSA9IiwgaV9uYW1lc3BhY2UpCgogICAgcmVnZXgubWF0Y2gocF9uYW1lc3BhY2UsIGlfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd19zYW5kYm94X25ldF9uYW1lc3BhY2U6IHRydWUiKQp9CgphbGxvd19uZXRfbmFtZXNwYWNlKHBfb2NpLCBpX29jaSkgewogICAgcHJpbnQoImFsbG93X25ldF9uYW1lc3BhY2U6IHN0YXJ0IikKCiAgICBrZXkgOj0gIm5lcmRjdGwvbmV0d29yay1uYW1lc3BhY2UiCgogICAgbm90IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIG5vdCBpX29jaS5Bbm5vdGF0aW9uc1trZXldCgogICAgcHJpbnQoImFsbG93X25ldF9uYW1lc3BhY2U6IHRydWUiKQp9CgojICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWxvZy1kaXJlY3RvcnkiIGFubm90YXRpb24KYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5KHBfb2NpLCBpX29jaSwgc19uYW1lLCBzX25hbWVzcGFjZSkgewogICAgcHJpbnQoImFsbG93X3NhbmRib3hfbG9nX2RpcmVjdG9yeTogc3RhcnQiKQoKICAgIGtleSA6PSAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1sb2ctZGlyZWN0b3J5IgoKICAgIHBfZGlyIDo9IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIHJlZ2V4MSA6PSByZXBsYWNlKHBfZGlyLCAiJChzYW5kYm94LW5hbWUpIiwgc19uYW1lKQogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzYW5kYm94LW5hbWVzcGFjZSkiLCBzX25hbWVzcGFjZSkKICAgIHByaW50KCJhbGxvd19zYW5kYm94X2xvZ19kaXJlY3Rvcnk6IHJlZ2V4MiA9IiwgcmVnZXgyKQoKICAgIGlfZGlyIDo9IGlfb2NpLkFubm90YXRpb25zW2tleV0KICAgIHByaW50KCJhbGxvd19zYW5kYm94X2xvZ19kaXJlY3Rvcnk6IGlfZGlyID0iLCBpX2RpcikKCiAgICByZWdleC5tYXRjaChyZWdleDIsIGlfZGlyKQoKICAgIHByaW50KCJhbGxvd19zYW5kYm94X2xvZ19kaXJlY3Rvcnk6IHRydWUiKQp9CgphbGxvd19sb2dfZGlyZWN0b3J5KHBfb2NpLCBpX29jaSkgewogICAgcHJpbnQoImFsbG93X2xvZ19kaXJlY3Rvcnk6IHN0YXJ0IikKCiAgICBrZXkgOj0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbG9nLWRpcmVjdG9yeSIKCiAgICBub3QgcF9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgbm90IGlfb2NpLkFubm90YXRpb25zW2tleV0KCiAgICBwcmludCgiYWxsb3dfbG9nX2RpcmVjdG9yeTogdHJ1ZSIpCn0KCmFsbG93X2xpbnV4KHBfb2NpLCBpX29jaSkgewogICAgcF9uYW1lc3BhY2VzIDo9IHBfb2NpLkxpbnV4Lk5hbWVzcGFjZXMKICAgIHByaW50KCJhbGxvd19saW51eDogcCBuYW1lc3BhY2VzID0iLCBwX25hbWVzcGFjZXMpCgogICAgaV9uYW1lc3BhY2VzIDo9IGlfb2NpLkxpbnV4Lk5hbWVzcGFjZXMKICAgIHByaW50KCJhbGxvd19saW51eDogaSBuYW1lc3BhY2VzID0iLCBpX25hbWVzcGFjZXMpCgogICAgcF9uYW1lc3BhY2VzID09IGlfbmFtZXNwYWNlcwoKICAgIGFsbG93X21hc2tlZF9wYXRocyhwX29jaSwgaV9vY2kpCiAgICBhbGxvd19yZWFkb25seV9wYXRocyhwX29jaSwgaV9vY2kpCgogICAgcHJpbnQoImFsbG93X2xpbnV4OiB0cnVlIikKfQoKYWxsb3dfbWFza2VkX3BhdGhzKHBfb2NpLCBpX29jaSkgewogICAgcF9wYXRocyA6PSBwX29jaS5MaW51eC5NYXNrZWRQYXRocwogICAgcHJpbnQoImFsbG93X21hc2tlZF9wYXRocyAxOiBwX3BhdGhzID0iLCBwX3BhdGhzKQoKICAgIGlfcGF0aHMgOj0gaV9vY2kuTGludXguTWFza2VkUGF0aHMKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aHMgMTogaV9wYXRocyA9IiwgaV9wYXRocykKCiAgICBhbGxvd19tYXNrZWRfcGF0aHNfYXJyYXkocF9wYXRocywgaV9wYXRocykKCiAgICBwcmludCgiYWxsb3dfbWFza2VkX3BhdGhzIDE6IHRydWUiKQp9CmFsbG93X21hc2tlZF9wYXRocyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aHMgMjogc3RhcnQiKQoKICAgIG5vdCBwX29jaS5MaW51eC5NYXNrZWRQYXRocwogICAgbm90IGlfb2NpLkxpbnV4Lk1hc2tlZFBhdGhzCgogICAgcHJpbnQoImFsbG93X21hc2tlZF9wYXRocyAyOiB0cnVlIikKfQoKIyBBbGwgdGhlIHBvbGljeSBtYXNrZWQgcGF0aHMgbXVzdCBiZSBtYXNrZWQgaW4gdGhlIGlucHV0IGRhdGEgdG9vLgojIElucHV0IGlzIGFsbG93ZWQgdG8gaGF2ZSBtb3JlIG1hc2tlZCBwYXRocyB0aGFuIHRoZSBwb2xpY3kuCmFsbG93X21hc2tlZF9wYXRoc19hcnJheShwX2FycmF5LCBpX2FycmF5KSB7CiAgICBldmVyeSBwX2VsZW0gaW4gcF9hcnJheSB7CiAgICAgICAgYWxsb3dfbWFza2VkX3BhdGgocF9lbGVtLCBpX2FycmF5KQogICAgfQp9CgphbGxvd19tYXNrZWRfcGF0aChwX2VsZW0sIGlfYXJyYXkpIHsKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aDogcF9lbGVtID0iLCBwX2VsZW0pCgogICAgc29tZSBpX2VsZW0gaW4gaV9hcnJheQogICAgcF9lbGVtID09IGlfZWxlbQoKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aDogdHJ1ZSIpCn0KCmFsbG93X3JlYWRvbmx5X3BhdGhzKHBfb2NpLCBpX29jaSkgewogICAgcF9wYXRocyA6PSBwX29jaS5MaW51eC5SZWFkb25seVBhdGhzCiAgICBwcmludCgiYWxsb3dfcmVhZG9ubHlfcGF0aHMgMTogcF9wYXRocyA9IiwgcF9wYXRocykKCiAgICBpX3BhdGhzIDo9IGlfb2NpLkxpbnV4LlJlYWRvbmx5UGF0aHMKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAxOiBpX3BhdGhzID0iLCBpX3BhdGhzKQoKICAgIGFsbG93X3JlYWRvbmx5X3BhdGhzX2FycmF5KHBfcGF0aHMsIGlfcGF0aHMsIGlfb2NpLkxpbnV4Lk1hc2tlZFBhdGhzKQoKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAxOiB0cnVlIikKfQphbGxvd19yZWFkb25seV9wYXRocyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAyOiBzdGFydCIpCgogICAgbm90IHBfb2NpLkxpbnV4LlJlYWRvbmx5UGF0aHMKICAgIG5vdCBpX29jaS5MaW51eC5SZWFkb25seVBhdGhzCgogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGhzIDI6IHRydWUiKQp9CgojIEFsbCB0aGUgcG9saWN5IHJlYWRvbmx5IHBhdGhzIG11c3QgYmUgZWl0aGVyOgojIC0gUHJlc2VudCBpbiB0aGUgaW5wdXQgcmVhZG9ubHkgcGF0aHMsIG9yCiMgLSBQcmVzZW50IGluIHRoZSBpbnB1dCBtYXNrZWQgcGF0aHMuCiMgSW5wdXQgaXMgYWxsb3dlZCB0byBoYXZlIG1vcmUgcmVhZG9ubHkgcGF0aHMgdGhhbiB0aGUgcG9saWN5LgphbGxvd19yZWFkb25seV9wYXRoc19hcnJheShwX2FycmF5LCBpX2FycmF5LCBtYXNrZWRfcGF0aHMpIHsKICAgIGV2ZXJ5IHBfZWxlbSBpbiBwX2FycmF5IHsKICAgICAgICBhbGxvd19yZWFkb25seV9wYXRoKHBfZWxlbSwgaV9hcnJheSwgbWFza2VkX3BhdGhzKQogICAgfQp9CgphbGxvd19yZWFkb25seV9wYXRoKHBfZWxlbSwgaV9hcnJheSwgbWFza2VkX3BhdGhzKSB7CiAgICBwcmludCgiYWxsb3dfcmVhZG9ubHlfcGF0aCAxOiBwX2VsZW0gPSIsIHBfZWxlbSkKCiAgICBzb21lIGlfZWxlbSBpbiBpX2FycmF5CiAgICBwX2VsZW0gPT0gaV9lbGVtCgogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGggMTogdHJ1ZSIpCn0KYWxsb3dfcmVhZG9ubHlfcGF0aChwX2VsZW0sIGlfYXJyYXksIG1hc2tlZF9wYXRocykgewogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGggMjogcF9lbGVtID0iLCBwX2VsZW0pCgogICAgc29tZSBpX21hc2tlZCBpbiBtYXNrZWRfcGF0aHMKICAgIHBfZWxlbSA9PSBpX21hc2tlZAoKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRoIDI6IHRydWUiKQp9CgojIENoZWNrIHRoZSBjb25zaXN0ZW5jeSBvZiB0aGUgaW5wdXQgImlvLmthdGFjb250YWluZXJzLnBrZy5vY2kuYnVuZGxlX3BhdGgiCiMgYW5kIGlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtaWQiIHZhbHVlcyB3aXRoIG90aGVyIGZpZWxkcy4KYWxsb3dfYnlfYnVuZGxlX29yX3NhbmRib3hfaWQocF9vY2ksIGlfb2NpLCBwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzKSB7CiAgICBwcmludCgiYWxsb3dfYnlfYnVuZGxlX29yX3NhbmRib3hfaWQ6IHN0YXJ0IikKCiAgICBidW5kbGVfcGF0aCA6PSBpX29jaS5Bbm5vdGF0aW9uc1siaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5idW5kbGVfcGF0aCJdCiAgICBidW5kbGVfaWQgOj0gcmVwbGFjZShidW5kbGVfcGF0aCwgIi9ydW4vY29udGFpbmVyZC9pby5jb250YWluZXJkLnJ1bnRpbWUudjIudGFzay9rOHMuaW8vIiwgIiIpCgogICAga2V5IDo9ICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWlkIgoKICAgIHBfcmVnZXggOj0gcF9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgc2FuZGJveF9pZCA6PSBpX29jaS5Bbm5vdGF0aW9uc1trZXldCgogICAgcHJpbnQoImFsbG93X2J5X2J1bmRsZV9vcl9zYW5kYm94X2lkOiBzYW5kYm94X2lkID0iLCBzYW5kYm94X2lkLCAicmVnZXggPSIsIHBfcmVnZXgpCiAgICByZWdleC5tYXRjaChwX3JlZ2V4LCBzYW5kYm94X2lkKQoKICAgIGFsbG93X3Jvb3RfcGF0aChwX29jaSwgaV9vY2ksIGJ1bmRsZV9pZCkKCiAgICBldmVyeSBpX21vdW50IGluIGlucHV0Lk9DSS5Nb3VudHMgewogICAgICAgIGFsbG93X21vdW50KHBfb2NpLCBpX21vdW50LCBidW5kbGVfaWQsIHNhbmRib3hfaWQpCiAgICB9CgogICAgYWxsb3dfc3RvcmFnZXMocF9zdG9yYWdlcywgaV9zdG9yYWdlcywgYnVuZGxlX2lkLCBzYW5kYm94X2lkKQoKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogdHJ1ZSIpCn0KCmFsbG93X3Byb2Nlc3MocF9vY2ksIGlfb2NpLCBzX25hbWUpIHsKICAgIHBfcHJvY2VzcyA6PSBwX29jaS5Qcm9jZXNzCiAgICBpX3Byb2Nlc3MgOj0gaV9vY2kuUHJvY2VzcwoKICAgIHByaW50KCJhbGxvd19wcm9jZXNzOiBpIHRlcm1pbmFsID0iLCBpX3Byb2Nlc3MuVGVybWluYWwsICJwIHRlcm1pbmFsID0iLCBwX3Byb2Nlc3MuVGVybWluYWwpCiAgICBwX3Byb2Nlc3MuVGVybWluYWwgPT0gaV9wcm9jZXNzLlRlcm1pbmFsCgogICAgcHJpbnQoImFsbG93X3Byb2Nlc3M6IGkgY3dkID0iLCBpX3Byb2Nlc3MuQ3dkLCAiaSBjd2QgPSIsIHBfcHJvY2Vzcy5Dd2QpCiAgICBwX3Byb2Nlc3MuQ3dkID09IGlfcHJvY2Vzcy5Dd2QKCiAgICBwcmludCgiYWxsb3dfcHJvY2VzczogaSBub05ld1ByaXZpbGVnZXMgPSIsIGlfcHJvY2Vzcy5Ob05ld1ByaXZpbGVnZXMsICJwIG5vTmV3UHJpdmlsZWdlcyA9IiwgcF9wcm9jZXNzLk5vTmV3UHJpdmlsZWdlcykKICAgIHBfcHJvY2Vzcy5Ob05ld1ByaXZpbGVnZXMgPT0gaV9wcm9jZXNzLk5vTmV3UHJpdmlsZWdlcwoKICAgIGFsbG93X2NhcHMocF9wcm9jZXNzLkNhcGFiaWxpdGllcywgaV9wcm9jZXNzLkNhcGFiaWxpdGllcykKICAgIGFsbG93X3VzZXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MpCiAgICBhbGxvd19hcmdzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUpCiAgICBhbGxvd19lbnYocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSkKCiAgICBwcmludCgiYWxsb3dfcHJvY2VzczogdHJ1ZSIpCn0KCmFsbG93X3VzZXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MpIHsKICAgIHBfdXNlciA6PSBwX3Byb2Nlc3MuVXNlcgogICAgaV91c2VyIDo9IGlfcHJvY2Vzcy5Vc2VyCgogICAgIyBUT0RPOiB0cmFjayBkb3duIHRoZSByZWFzb24gZm9yIG1jci5taWNyb3NvZnQuY29tL29zcy9iaXRuYW1pL3JlZGlzOjYuMC44IGJlaW5nCiAgICAjICAgICAgIGV4ZWN1dGVkIHdpdGggdWlkID0gMCBkZXNwaXRlIGhhdmluZyAiVXNlciI6ICIxMDAxIiBpbiBpdHMgY29udGFpbmVyIGltYWdlCiAgICAjICAgICAgIGNvbmZpZy4KICAgICNwcmludCgiYWxsb3dfdXNlcjogaW5wdXQgdWlkID0iLCBpX3VzZXIuVUlELCAicG9saWN5IHVpZCA9IiwgcF91c2VyLlVJRCkKICAgICNwX3VzZXIuVUlEID09IGlfdXNlci5VSUQKCiAgICAjIFRPRE86IHRyYWNrIGRvd24gdGhlIHJlYXNvbiBmb3IgcmVnaXN0cnkuazhzLmlvL3BhdXNlOjMuOSBiZWluZwogICAgIyAgICAgICBleGVjdXRlZCB3aXRoIGdpZCA9IDAgZGVzcGl0ZSBoYXZpbmcgIjY1NTM1OjY1NTM1IiBpbiBpdHMgY29udGFpbmVyIGltYWdlCiAgICAjICAgICAgIGNvbmZpZy4KICAgICNwcmludCgiYWxsb3dfdXNlcjogaW5wdXQgZ2lkID0iLCBpX3VzZXIuR0lELCAicG9saWN5IGdpZCA9IiwgcF91c2VyLkdJRCkKICAgICNwX3VzZXIuR0lEID09IGlfdXNlci5HSUQKCiAgICAjIFRPRE86IGNvbXBhcmUgdGhlIGFkZGl0aW9uYWxHaWRzIGZpZWxkIHRvbyBhZnRlciBjb21wdXRpbmcgaXRzIHZhbHVlCiAgICAjIGJhc2VkIG9uIC9ldGMvcGFzc3dkIGFuZCAvZXRjL2dyb3VwIGZyb20gdGhlIGNvbnRhaW5lciBpbWFnZS4KfQoKYWxsb3dfYXJncyhwX3Byb2Nlc3MsIGlfcHJvY2Vzcywgc19uYW1lKSB7CiAgICBwcmludCgiYWxsb3dfYXJncyAxOiBubyBhcmdzIikKCiAgICBub3QgcF9wcm9jZXNzLkFyZ3MKICAgIG5vdCBpX3Byb2Nlc3MuQXJncwoKICAgIHByaW50KCJhbGxvd19hcmdzIDE6IHRydWUiKQp9CmFsbG93X2FyZ3MocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSkgewogICAgcHJpbnQoImFsbG93X2FyZ3MgMjogcG9saWN5IGFyZ3MgPSIsIHBfcHJvY2Vzcy5BcmdzKQogICAgcHJpbnQoImFsbG93X2FyZ3MgMjogaW5wdXQgYXJncyA9IiwgaV9wcm9jZXNzLkFyZ3MpCgogICAgY291bnQocF9wcm9jZXNzLkFyZ3MpID09IGNvdW50KGlfcHJvY2Vzcy5BcmdzKQoKICAgIGV2ZXJ5IGksIGlfYXJnIGluIGlfcHJvY2Vzcy5BcmdzIHsKICAgICAgICBhbGxvd19hcmcoaSwgaV9hcmcsIHBfcHJvY2Vzcywgc19uYW1lKQogICAgfQoKICAgIHByaW50KCJhbGxvd19hcmdzIDI6IHRydWUiKQp9CmFsbG93X2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5BcmdzW2ldCiAgICBwcmludCgiYWxsb3dfYXJnIDE6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgcF9hcmcyIDo9IHJlcGxhY2UocF9hcmcsICIkJCIsICIkIikKICAgIHBfYXJnMiA9PSBpX2FyZwoKICAgIHByaW50KCJhbGxvd19hcmcgMTogdHJ1ZSIpCn0KYWxsb3dfYXJnKGksIGlfYXJnLCBwX3Byb2Nlc3MsIHNfbmFtZSkgewogICAgcF9hcmcgOj0gcF9wcm9jZXNzLkFyZ3NbaV0KICAgIHByaW50KCJhbGxvd19hcmcgMjogaSA9IiwgaSwgImlfYXJnID0iLCBpX2FyZywgInBfYXJnID0iLCBwX2FyZykKCiAgICAjIFRPRE86IGNhbiAkKG5vZGUtbmFtZSkgYmUgaGFuZGxlZCBiZXR0ZXI/CiAgICBjb250YWlucyhwX2FyZywgIiQobm9kZS1uYW1lKSIpCgogICAgcHJpbnQoImFsbG93X2FyZyAyOiB0cnVlIikKfQphbGxvd19hcmcoaSwgaV9hcmcsIHBfcHJvY2Vzcywgc19uYW1lKSB7CiAgICBwX2FyZyA6PSBwX3Byb2Nlc3MuQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2FyZyAzOiBpID0iLCBpLCAiaV9hcmcgPSIsIGlfYXJnLCAicF9hcmcgPSIsIHBfYXJnKQoKICAgIHBfYXJnMiA6PSByZXBsYWNlKHBfYXJnLCAiJCQiLCAiJCIpCiAgICBwX2FyZzMgOj0gcmVwbGFjZShwX2FyZzIsICIkKHNhbmRib3gtbmFtZSkiLCBzX25hbWUpCiAgICBwcmludCgiYWxsb3dfYXJnIDM6IHBfYXJnMyA9IiwgcF9hcmczKQogICAgcF9hcmczID09IGlfYXJnCgogICAgcHJpbnQoImFsbG93X2FyZyAzOiB0cnVlIikKfQoKIyBPQ0kgcHJvY2Vzcy5FbnYgZmllbGQKYWxsb3dfZW52KHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHByaW50KCJhbGxvd19lbnY6IHAgZW52ID0iLCBwX3Byb2Nlc3MuRW52KQogICAgcHJpbnQoImFsbG93X2VudjogaSBlbnYgPSIsIGlfcHJvY2Vzcy5FbnYpCgogICAgZXZlcnkgaV92YXIgaW4gaV9wcm9jZXNzLkVudiB7CiAgICAgICAgYWxsb3dfdmFyKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBpX3Zhciwgc19uYW1lKQogICAgfQoKICAgIHByaW50KCJhbGxvd19lbnY6IHRydWUiKQp9CgojIEFsbG93IGlucHV0IGVudiB2YXJpYWJsZXMgdGhhdCBhcmUgcHJlc2VudCBpbiB0aGUgcG9saWN5IGRhdGEgdG9vLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUpIHsKICAgIHByaW50KCJhbGxvd192YXIgMTogaV92YXIgPSIsIGlfdmFyKQoKICAgIHNvbWUgcF92YXIgaW4gcF9wcm9jZXNzLkVudgogICAgcF92YXIgPT0gaV92YXIKCiAgICBwcmludCgiYWxsb3dfdmFyIDE6IHRydWUiKQp9CgojIE1hdGNoIGlucHV0IHdpdGggb25lIG9mIHRoZSBwb2xpY3kgdmFyaWFibGVzLCBhZnRlciBzdWJzdGl0dXRpbmcgJChzYW5kYm94LW5hbWUpLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUpIHsKICAgIHByaW50KCJhbGxvd192YXIgMjogaV92YXIgPSIsIGlfdmFyKQoKICAgIHNvbWUgcF92YXIgaW4gcF9wcm9jZXNzLkVudgogICAgcF92YXIyIDo9IHJlcGxhY2UocF92YXIsICIkKHNhbmRib3gtbmFtZSkiLCBzX25hbWUpCiAgICBwcmludCgiYWxsb3dfdmFyIDI6IHBfdmFyMiA9IiwgcF92YXIyKQoKICAgIHBfdmFyMiA9PSBpX3ZhcgoKICAgIHByaW50KCJhbGxvd192YXIgMjogdHJ1ZSIpCn0KCiMgQWxsb3cgaW5wdXQgZW52IHZhcmlhYmxlcyB0aGF0IG1hdGNoIHdpdGggYSByZXF1ZXN0X2RlZmF1bHRzIHJlZ2V4LgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUpIHsKICAgIHByaW50KCJhbGxvd192YXIgMzogc3RhcnQiKQoKICAgIHNvbWUgcF9yZWdleDEgaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5DcmVhdGVDb250YWluZXJSZXF1ZXN0LmFsbG93X2Vudl9yZWdleAogICAgcHJpbnQoImFsbG93X3ZhciAzOiBwX3JlZ2V4MSA9IiwgcF9yZWdleDEpCgogICAgcF9yZWdleDIgOj0gcmVwbGFjZShwX3JlZ2V4MSwgIiQoaXB2NF9hKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcHY0X2EpCiAgICBwcmludCgiYWxsb3dfdmFyIDM6IHBfcmVnZXgyID0iLCBwX3JlZ2V4MikKCiAgICBwX3JlZ2V4MyA6PSByZXBsYWNlKHBfcmVnZXgyLCAiJChpcF9wKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcF9wKQogICAgcHJpbnQoImFsbG93X3ZhciAzOiBwX3JlZ2V4MyA9IiwgcF9yZWdleDMpCgogICAgcF9yZWdleDQgOj0gcmVwbGFjZShwX3JlZ2V4MywgIiQoc3ZjX25hbWUpIiwgcG9saWN5X2RhdGEuY29tbW9uLnN2Y19uYW1lKQogICAgcHJpbnQoImFsbG93X3ZhciAzOiBwX3JlZ2V4NCA9IiwgcF9yZWdleDQpCgogICAgcF9yZWdleDUgOj0gcmVwbGFjZShwX3JlZ2V4NCwgIiQoZG5zX2xhYmVsKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5kbnNfbGFiZWwpCiAgICBwcmludCgiYWxsb3dfdmFyIDM6IHBfcmVnZXg1ID0iLCBwX3JlZ2V4NSkKCiAgICBwcmludCgiYWxsb3dfdmFyIDM6IGlfdmFyID0iLCBpX3ZhcikKICAgIHJlZ2V4Lm1hdGNoKHBfcmVnZXg1LCBpX3ZhcikKCiAgICBwcmludCgiYWxsb3dfdmFyIDM6IHRydWUiKQp9CgojIEFsbG93IGZpZWxkUmVmICJmaWVsZFBhdGg6IHN0YXR1cy5wb2RJUCIgdmFsdWVzLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUpIHsKICAgIHByaW50KCJhbGxvd192YXIgNDogaV92YXIgPSIsIGlfdmFyKQoKICAgIG5hbWVfdmFsdWUgOj0gc3BsaXQoaV92YXIsICI9IikKICAgIGNvdW50KG5hbWVfdmFsdWUpID09IDIKICAgIGlzX2lwKG5hbWVfdmFsdWVbMV0pCgogICAgc29tZSBwX3ZhciBpbiBwX3Byb2Nlc3MuRW52CiAgICBhbGxvd19wb2RfaXBfdmFyKG5hbWVfdmFsdWVbMF0sIHBfdmFyKQoKICAgIHByaW50KCJhbGxvd192YXIgNDogdHJ1ZSIpCn0KCiMgQWxsb3cgY29tbW9uIGZpZWxkUmVmIHZhcmlhYmxlcy4KYWxsb3dfdmFyKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBpX3Zhciwgc19uYW1lKSB7CiAgICBwcmludCgiYWxsb3dfdmFyIDU6IGlfdmFyID0iLCBpX3ZhcikKCiAgICBuYW1lX3ZhbHVlIDo9IHNwbGl0KGlfdmFyLCAiPSIpCiAgICBjb3VudChuYW1lX3ZhbHVlKSA9PSAyCgogICAgc29tZSBwX3ZhciBpbiBwX3Byb2Nlc3MuRW52CiAgICBwX25hbWVfdmFsdWUgOj0gc3BsaXQocF92YXIsICI9IikKICAgIGNvdW50KHBfbmFtZV92YWx1ZSkgPT0gMgoKICAgIHBfbmFtZV92YWx1ZVswXSA9PSBuYW1lX3ZhbHVlWzBdCgogICAgIyBUT0RPOiBzaG91bGQgdGhlc2UgYmUgaGFuZGxlZCBpbiBhIGRpZmZlcmVudCB3YXk/CiAgICBhbHdheXNfYWxsb3dlZCA6PSBbIiQoaG9zdC1uYW1lKSIsICIkKG5vZGUtbmFtZSkiLCAiJChwb2QtdWlkKSJdCiAgICBzb21lIGFsbG93ZWQgaW4gYWx3YXlzX2FsbG93ZWQKICAgIGNvbnRhaW5zKHBfbmFtZV92YWx1ZVsxXSwgYWxsb3dlZCkKCiAgICBwcmludCgiYWxsb3dfdmFyIDU6IHRydWUiKQp9CgojIEFsbG93IGZpZWxkUmVmICJmaWVsZFBhdGg6IHN0YXR1cy5ob3N0SVAiIHZhbHVlcy4KYWxsb3dfdmFyKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBpX3Zhciwgc19uYW1lKSB7CiAgICBwcmludCgiYWxsb3dfdmFyIDY6IGlfdmFyID0iLCBpX3ZhcikKCiAgICBuYW1lX3ZhbHVlIDo9IHNwbGl0KGlfdmFyLCAiPSIpCiAgICBjb3VudChuYW1lX3ZhbHVlKSA9PSAyCiAgICBpc19pcChuYW1lX3ZhbHVlWzFdKQoKICAgIHNvbWUgcF92YXIgaW4gcF9wcm9jZXNzLkVudgogICAgYWxsb3dfaG9zdF9pcF92YXIobmFtZV92YWx1ZVswXSwgcF92YXIpCgogICAgcHJpbnQoImFsbG93X3ZhciA2OiB0cnVlIikKfQoKIyBBbGxvdyByZXNvdXJjZUZpZWxkUmVmIHZhbHVlcyAoZS5nLiwgImxpbWl0cy5jcHUiKS4KYWxsb3dfdmFyKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBpX3Zhciwgc19uYW1lKSB7CiAgICBwcmludCgiYWxsb3dfdmFyIDc6IGlfdmFyID0iLCBpX3ZhcikKCiAgICBuYW1lX3ZhbHVlIDo9IHNwbGl0KGlfdmFyLCAiPSIpCiAgICBjb3VudChuYW1lX3ZhbHVlKSA9PSAyCgogICAgc29tZSBwX3ZhciBpbiBwX3Byb2Nlc3MuRW52CiAgICBwX25hbWVfdmFsdWUgOj0gc3BsaXQocF92YXIsICI9IikKICAgIGNvdW50KHBfbmFtZV92YWx1ZSkgPT0gMgoKICAgIHBfbmFtZV92YWx1ZVswXSA9PSBuYW1lX3ZhbHVlWzBdCgogICAgIyBUT0RPOiBzaG91bGQgdGhlc2UgYmUgaGFuZGxlZCBpbiBhIGRpZmZlcmVudCB3YXk/CiAgICBhbHdheXNfYWxsb3dlZCA9IFsiJChyZXNvdXJjZS1maWVsZCkiLCAiJCh0b2RvLWFubm90YXRpb24pIl0KICAgIHNvbWUgYWxsb3dlZCBpbiBhbHdheXNfYWxsb3dlZAogICAgY29udGFpbnMocF9uYW1lX3ZhbHVlWzFdLCBhbGxvd2VkKQoKICAgIHByaW50KCJhbGxvd192YXIgNzogdHJ1ZSIpCn0KCmFsbG93X3BvZF9pcF92YXIodmFyX25hbWUsIHBfdmFyKSB7CiAgICBwcmludCgiYWxsb3dfcG9kX2lwX3ZhcjogdmFyX25hbWUgPSIsIHZhcl9uYW1lLCAicF92YXIgPSIsIHBfdmFyKQoKICAgIHBfbmFtZV92YWx1ZSA6PSBzcGxpdChwX3ZhciwgIj0iKQogICAgY291bnQocF9uYW1lX3ZhbHVlKSA9PSAyCgogICAgcF9uYW1lX3ZhbHVlWzBdID09IHZhcl9uYW1lCiAgICBwX25hbWVfdmFsdWVbMV0gPT0gIiQocG9kLWlwKSIKCiAgICBwcmludCgiYWxsb3dfcG9kX2lwX3ZhcjogdHJ1ZSIpCn0KCmFsbG93X2hvc3RfaXBfdmFyKHZhcl9uYW1lLCBwX3ZhcikgewogICAgcHJpbnQoImFsbG93X2hvc3RfaXBfdmFyOiB2YXJfbmFtZSA9IiwgdmFyX25hbWUsICJwX3ZhciA9IiwgcF92YXIpCgogICAgcF9uYW1lX3ZhbHVlIDo9IHNwbGl0KHBfdmFyLCAiPSIpCiAgICBjb3VudChwX25hbWVfdmFsdWUpID09IDIKCiAgICBwX25hbWVfdmFsdWVbMF0gPT0gdmFyX25hbWUKICAgIHBfbmFtZV92YWx1ZVsxXSA9PSAiJChob3N0LWlwKSIKCiAgICBwcmludCgiYWxsb3dfaG9zdF9pcF92YXI6IHRydWUiKQp9Cgppc19pcCh2YWx1ZSkgewogICAgYnl0ZXMgPSBzcGxpdCh2YWx1ZSwgIi4iKQogICAgY291bnQoYnl0ZXMpID09IDQKCiAgICBpc19pcF9maXJzdF9ieXRlKGJ5dGVzWzBdKQogICAgaXNfaXBfb3RoZXJfYnl0ZShieXRlc1sxXSkKICAgIGlzX2lwX290aGVyX2J5dGUoYnl0ZXNbMl0pCiAgICBpc19pcF9vdGhlcl9ieXRlKGJ5dGVzWzNdKQp9CmlzX2lwX2ZpcnN0X2J5dGUoY29tcG9uZW50KSB7CiAgICBudW1iZXIgPSB0b19udW1iZXIoY29tcG9uZW50KQogICAgbnVtYmVyID49IDEKICAgIG51bWJlciA8PSAyNTUKfQppc19pcF9vdGhlcl9ieXRlKGNvbXBvbmVudCkgewogICAgbnVtYmVyID0gdG9fbnVtYmVyKGNvbXBvbmVudCkKICAgIG51bWJlciA+PSAwCiAgICBudW1iZXIgPD0gMjU1Cn0KCiMgT0NJIHJvb3QuUGF0aAphbGxvd19yb290X3BhdGgocF9vY2ksIGlfb2NpLCBidW5kbGVfaWQpIHsKICAgIHBfcGF0aDEgOj0gcF9vY2kuUm9vdC5QYXRoCiAgICBwcmludCgiYWxsb3dfcm9vdF9wYXRoOiBwX3BhdGgxID0iLCBwX3BhdGgxKQoKICAgIHBfcGF0aDIgOj0gcmVwbGFjZShwX3BhdGgxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfcm9vdF9wYXRoOiBwX3BhdGgyID0iLCBwX3BhdGgyKQoKICAgIHBfcGF0aDMgOj0gcmVwbGFjZShwX3BhdGgyLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X3Jvb3RfcGF0aDogcF9wYXRoMyA9IiwgcF9wYXRoMykKCiAgICBwX3BhdGgzID09IGlfb2NpLlJvb3QuUGF0aAoKICAgIHByaW50KCJhbGxvd19yb290X3BhdGg6IHRydWUiKQp9CgojIGRldmljZSBtb3VudHMKYWxsb3dfbW91bnQocF9vY2ksIGlfbW91bnQsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcHJpbnQoImFsbG93X21vdW50OiBzdGFydCIpCgogICAgc29tZSBwX21vdW50IGluIHBfb2NpLk1vdW50cwogICAgY2hlY2tfbW91bnQocF9tb3VudCwgaV9tb3VudCwgYnVuZGxlX2lkLCBzYW5kYm94X2lkKQoKICAgICMgVE9ETzogYXJlIHRoZXJlIGFueSBvdGhlciByZXF1aXJlZCBwb2xpY3kgY2hlY2tzIGZvciBtb3VudHMgLSBlLmcuLAogICAgIyAgICAgICBtdWx0aXBsZSBtb3VudHMgd2l0aCBzYW1lIHNvdXJjZSBvciBkZXN0aW5hdGlvbj8KCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IHRydWUiKQp9CgpjaGVja19tb3VudChwX21vdW50LCBpX21vdW50LCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHByaW50KCJjaGVja19tb3VudCAxOiBwX21vdW50ID0iLCBwX21vdW50KQogICAgcHJpbnQoImNoZWNrX21vdW50IDE6IGlfbW91bnQgPSIsIGlfbW91bnQpCgogICAgcF9tb3VudCA9PSBpX21vdW50CgogICAgcHJpbnQoImNoZWNrX21vdW50IDE6IHRydWUiKQp9CmNoZWNrX21vdW50KHBfbW91bnQsIGlfbW91bnQsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcHJpbnQoImNoZWNrX21vdW50IDI6IGkgZGVzdGluYXRpb24gPSIsIGlfbW91bnQuZGVzdGluYXRpb24sICJwIGRlc3RpbmF0aW9uID0iLCBwX21vdW50LmRlc3RpbmF0aW9uKQogICAgcF9tb3VudC5kZXN0aW5hdGlvbiA9PSBpX21vdW50LmRlc3RpbmF0aW9uCgogICAgcHJpbnQoImNoZWNrX21vdW50IDI6IGkgdHlwZSA9IiwgaV9tb3VudC50eXBlXywgInAgdHlwZSA9IiwgcF9tb3VudC50eXBlXykKICAgIHBfbW91bnQudHlwZV8gPT0gaV9tb3VudC50eXBlXwoKICAgIHByaW50KCJjaGVja19tb3VudCAyOiBpIG9wdGlvbnMgPSIsIGlfbW91bnQub3B0aW9ucykKICAgIHByaW50KCJjaGVja19tb3VudCAyOiBwIG9wdGlvbnMgPSIsIHBfbW91bnQub3B0aW9ucykKICAgIHBfbW91bnQub3B0aW9ucyA9PSBpX21vdW50Lm9wdGlvbnMKCiAgICBtb3VudF9zb3VyY2VfYWxsb3dzKHBfbW91bnQsIGlfbW91bnQsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkKCiAgICBwcmludCgiY2hlY2tfbW91bnQgMjogdHJ1ZSIpCn0KCm1vdW50X3NvdXJjZV9hbGxvd3MocF9tb3VudCwgaV9tb3VudCwgYnVuZGxlX2lkLCBzYW5kYm94X2lkKSB7CiAgICBwcmludCgibW91bnRfc291cmNlX2FsbG93cyAxOiBpX21vdW50LnNvdXJjZSA9IiwgaV9tb3VudC5zb3VyY2UpCgogICAgcmVnZXgxIDo9IHBfbW91bnQuc291cmNlCiAgICBwcmludCgibW91bnRfc291cmNlX2FsbG93cyAxOiByZWdleDEgPSIsIHJlZ2V4MSkKCiAgICByZWdleDIgOj0gcmVwbGFjZShyZWdleDEsICIkKHNmcHJlZml4KSIsIHBvbGljeV9kYXRhLmNvbW1vbi5zZnByZWZpeCkKICAgIHByaW50KCJtb3VudF9zb3VyY2VfYWxsb3dzIDE6IHJlZ2V4MiA9IiwgcmVnZXgyKQoKICAgIHJlZ2V4MyA6PSByZXBsYWNlKHJlZ2V4MiwgIiQoY3BhdGgpIiwgcG9saWN5X2RhdGEuY29tbW9uLmNwYXRoKQogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMTogcmVnZXgzID0iLCByZWdleDMpCgogICAgcmVnZXg0IDo9IHJlcGxhY2UocmVnZXgzLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMTogcmVnZXg0ID0iLCByZWdleDQpCgogICAgcmVnZXgubWF0Y2gocmVnZXg0LCBpX21vdW50LnNvdXJjZSkKCiAgICBwcmludCgibW91bnRfc291cmNlX2FsbG93cyAxOiB0cnVlIikKfQptb3VudF9zb3VyY2VfYWxsb3dzKHBfbW91bnQsIGlfbW91bnQsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMjogaV9tb3VudC5zb3VyY2U9IiwgaV9tb3VudC5zb3VyY2UpCgogICAgcmVnZXgxIDo9IHBfbW91bnQuc291cmNlCiAgICBwcmludCgibW91bnRfc291cmNlX2FsbG93cyAyOiByZWdleDEgPSIsIHJlZ2V4MSkKCiAgICByZWdleDIgOj0gcmVwbGFjZShyZWdleDEsICIkKHNmcHJlZml4KSIsIHBvbGljeV9kYXRhLmNvbW1vbi5zZnByZWZpeCkKICAgIHByaW50KCJtb3VudF9zb3VyY2VfYWxsb3dzIDI6IHJlZ2V4MiA9IiwgcmVnZXgyKQoKICAgIHJlZ2V4MyA6PSByZXBsYWNlKHJlZ2V4MiwgIiQoY3BhdGgpIiwgcG9saWN5X2RhdGEuY29tbW9uLmNwYXRoKQogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMjogcmVnZXgzID0iLCByZWdleDMpCgogICAgcmVnZXg0IDo9IHJlcGxhY2UocmVnZXgzLCAiJChzYW5kYm94LWlkKSIsIHNhbmRib3hfaWQpCiAgICBwcmludCgibW91bnRfc291cmNlX2FsbG93cyAyOiByZWdleDQgPSIsIHJlZ2V4NCkKCiAgICByZWdleC5tYXRjaChyZWdleDQsIGlfbW91bnQuc291cmNlKQoKICAgIHByaW50KCJtb3VudF9zb3VyY2VfYWxsb3dzIDI6IHRydWUiKQp9CgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgU3RvcmFnZXMKCmFsbG93X3N0b3JhZ2VzKHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcF9jb3VudCA6PSBjb3VudChwX3N0b3JhZ2VzKQogICAgaV9jb3VudCA6PSBjb3VudChpX3N0b3JhZ2VzKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiBwX2NvdW50ID0iLCBwX2NvdW50LCAiaV9jb3VudCA9IiwgaV9jb3VudCkKCiAgICBwX2NvdW50ID09IGlfY291bnQKCiAgICAjIEdldCB0aGUgY29udGFpbmVyIGltYWdlIGxheWVyIElEcyBhbmQgdmVyaXR5IHJvb3QgaGFzaGVzLCBmcm9tIHRoZSAib3ZlcmxheWZzIiBzdG9yYWdlLgogICAgc29tZSBvdmVybGF5X3N0b3JhZ2UgaW4gcF9zdG9yYWdlcwogICAgb3ZlcmxheV9zdG9yYWdlLmRyaXZlciA9PSAib3ZlcmxheWZzIgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiBvdmVybGF5X3N0b3JhZ2UgPSIsIG92ZXJsYXlfc3RvcmFnZSkKICAgIGNvdW50KG92ZXJsYXlfc3RvcmFnZS5vcHRpb25zKSA9PSAyCgogICAgbGF5ZXJfaWRzIDo9IHNwbGl0KG92ZXJsYXlfc3RvcmFnZS5vcHRpb25zWzBdLCAiOiIpCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZXM6IGxheWVyX2lkcyA9IiwgbGF5ZXJfaWRzKQoKICAgIHJvb3RfaGFzaGVzIDo9IHNwbGl0KG92ZXJsYXlfc3RvcmFnZS5vcHRpb25zWzFdLCAiOiIpCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZXM6IHJvb3RfaGFzaGVzID0iLCByb290X2hhc2hlcykKCiAgICBldmVyeSBpX3N0b3JhZ2UgaW4gaV9zdG9yYWdlcyB7CiAgICAgICAgYWxsb3dfc3RvcmFnZShwX3N0b3JhZ2VzLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykKICAgIH0KCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZXM6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlKHBfc3RvcmFnZXMsIGlfc3RvcmFnZSwgYnVuZGxlX2lkLCBzYW5kYm94X2lkLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKSB7CiAgICBzb21lIHBfc3RvcmFnZSBpbiBwX3N0b3JhZ2VzCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2U6IHBfc3RvcmFnZSA9IiwgcF9zdG9yYWdlKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2U6IGlfc3RvcmFnZSA9IiwgaV9zdG9yYWdlKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgICAgICAgICAgID09IGlfc3RvcmFnZS5kcml2ZXIKICAgIHBfc3RvcmFnZS5kcml2ZXJfb3B0aW9ucyAgID09IGlfc3RvcmFnZS5kcml2ZXJfb3B0aW9ucwogICAgcF9zdG9yYWdlLmZzX2dyb3VwICAgICAgICAgPT0gaV9zdG9yYWdlLmZzX2dyb3VwCgogICAgYWxsb3dfc3RvcmFnZV9vcHRpb25zKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKQogICAgYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKQoKICAgICMgVE9ETzogdmFsaWRhdGUgdGhlIHNvdXJjZSBmaWVsZCB0b28uCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2U6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMTogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgIT0gImJsayIKICAgIHBfc3RvcmFnZS5kcml2ZXIgIT0gIm92ZXJsYXlmcyIKICAgIHBfc3RvcmFnZS5vcHRpb25zID09IGlfc3RvcmFnZS5vcHRpb25zCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAxOiB0cnVlIikKfQphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIGNvdW50KHBfc3RvcmFnZS5vcHRpb25zKSA9PSAyCgogICAgcG9saWN5X2lkcyA6PSBzcGxpdChwX3N0b3JhZ2Uub3B0aW9uc1swXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBwb2xpY3lfaWRzID0iLCBwb2xpY3lfaWRzKQogICAgcG9saWN5X2lkcyA9PSBsYXllcl9pZHMKCiAgICBwb2xpY3lfaGFzaGVzIDo9IHNwbGl0KHBfc3RvcmFnZS5vcHRpb25zWzFdLCAiOiIpCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IHBvbGljeV9oYXNoZXMgPSIsIHBvbGljeV9oYXNoZXMpCgogICAgcF9jb3VudCA6PSBjb3VudChwb2xpY3lfaWRzKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBwX2NvdW50ID0iLCBwX2NvdW50KQogICAgcF9jb3VudCA+PSAxCiAgICBwX2NvdW50ID09IGNvdW50KHBvbGljeV9oYXNoZXMpCgogICAgaV9jb3VudCA6PSBjb3VudChpX3N0b3JhZ2Uub3B0aW9ucykKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogaV9jb3VudCA9IiwgaV9jb3VudCkKICAgIGlfY291bnQgPT0gcF9jb3VudCArIDMKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zWzBdID0iLCBpX3N0b3JhZ2Uub3B0aW9uc1swXSkKICAgIGlfc3RvcmFnZS5vcHRpb25zWzBdID09ICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQubGF5ZXItc3JjLXByZWZpeD0vdmFyL2xpYi9jb250YWluZXJkL2lvLmNvbnRhaW5lcmQuc25hcHNob3R0ZXIudjEudGFyZGV2L2xheWVycyIKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zW2lfY291bnQgLSAyXSA9IiwgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDJdKQogICAgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDJdID09ICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQub3ZlcmxheS1ydyIKCiAgICBsb3dlcmRpciA6PSBjb25jYXQoIj0iLCBbImxvd2VyZGlyIiwgcF9zdG9yYWdlLm9wdGlvbnNbMF1dKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBsb3dlcmRpciA9IiwgbG93ZXJkaXIpCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBpX3N0b3JhZ2Uub3B0aW9uc1tpX2NvdW50IC0gMV0gPSIsIGlfc3RvcmFnZS5vcHRpb25zW2lfY291bnQgLSAxXSkKICAgIGlfc3RvcmFnZS5vcHRpb25zW2lfY291bnQgLSAxXSA9PSBsb3dlcmRpcgoKICAgIGV2ZXJ5IGksIHBvbGljeV9pZCBpbiBwb2xpY3lfaWRzIHsKICAgICAgICBhbGxvd19vdmVybGF5X2xheWVyKHBvbGljeV9pZCwgcG9saWN5X2hhc2hlc1tpXSwgaV9zdG9yYWdlLm9wdGlvbnNbaSArIDFdKQogICAgfQoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogdHJ1ZSIpCn0KYWxsb3dfc3RvcmFnZV9vcHRpb25zKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKSB7CiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDM6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCiAgICBjb3VudChwX3N0b3JhZ2Uub3B0aW9ucykgPT0gMQoKICAgIHN0YXJ0c3dpdGgocF9zdG9yYWdlLm9wdGlvbnNbMF0sICIkKGhhc2giKQogICAgaGFzaF9zdWZmaXggOj0gdHJpbV9sZWZ0KHBfc3RvcmFnZS5vcHRpb25zWzBdLCAiJChoYXNoIikKCiAgICBlbmRzd2l0aChoYXNoX3N1ZmZpeCwgIikiKQogICAgaGFzaF9pbmRleCA6PSB0cmltX3JpZ2h0KGhhc2hfc3VmZml4LCAiKSIpCiAgICBpIDo9IHRvX251bWJlcihoYXNoX2luZGV4KQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAzOiBpID0iLCBpKQoKICAgIGhhc2hfb3B0aW9uIDo9IGNvbmNhdCgiPSIsIFsiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LnJvb3QtaGFzaCIsIHJvb3RfaGFzaGVzW2ldXSkKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMzogaGFzaF9vcHRpb24gPSIsIGhhc2hfb3B0aW9uKQoKICAgIGNvdW50KGlfc3RvcmFnZS5vcHRpb25zKSA9PSA0CiAgICBpX3N0b3JhZ2Uub3B0aW9uc1swXSA9PSAicm8iCiAgICBpX3N0b3JhZ2Uub3B0aW9uc1sxXSA9PSAiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmJsb2NrX2RldmljZT1maWxlIgogICAgaV9zdG9yYWdlLm9wdGlvbnNbMl0gPT0gImlvLmthdGFjb250YWluZXJzLmZzLW9wdC5pcy1sYXllciIKICAgIGlfc3RvcmFnZS5vcHRpb25zWzNdID09IGhhc2hfb3B0aW9uCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAzOiB0cnVlIikKfQoKYWxsb3dfb3ZlcmxheV9sYXllcihwb2xpY3lfaWQsIHBvbGljeV9oYXNoLCBpX29wdGlvbikgewogICAgcHJpbnQoImFsbG93X292ZXJsYXlfbGF5ZXI6IHBvbGljeV9pZCA9IiwgcG9saWN5X2lkLCAicG9saWN5X2hhc2ggPSIsIHBvbGljeV9oYXNoKQogICAgcHJpbnQoImFsbG93X292ZXJsYXlfbGF5ZXI6IGlfb3B0aW9uID0iLCBpX29wdGlvbikKCiAgICBzdGFydHN3aXRoKGlfb3B0aW9uLCAiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmxheWVyPSIpCiAgICBpX3ZhbHVlIDo9IHJlcGxhY2UoaV9vcHRpb24sICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQubGF5ZXI9IiwgIiIpCiAgICBpX3ZhbHVlX2RlY29kZWQgOj0gYmFzZTY0LmRlY29kZShpX3ZhbHVlKQogICAgcHJpbnQoImFsbG93X292ZXJsYXlfbGF5ZXI6IGlfdmFsdWVfZGVjb2RlZCA9IiwgaV92YWx1ZV9kZWNvZGVkKQoKICAgIHBvbGljeV9zdWZmaXggOj0gY29uY2F0KCI9IiwgWyJ0YXIscm8saW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmJsb2NrX2RldmljZT1maWxlLGlvLmthdGFjb250YWluZXJzLmZzLW9wdC5pcy1sYXllcixpby5rYXRhY29udGFpbmVycy5mcy1vcHQucm9vdC1oYXNoIiwgcG9saWN5X2hhc2hdKQogICAgcF92YWx1ZSA6PSBjb25jYXQoIiwiLCBbcG9saWN5X2lkLCBwb2xpY3lfc3VmZml4XSkKICAgIHByaW50KCJhbGxvd19vdmVybGF5X2xheWVyOiBwX3ZhbHVlID0iLCBwX3ZhbHVlKQoKICAgIHBfdmFsdWUgPT0gaV92YWx1ZV9kZWNvZGVkCgogICAgcHJpbnQoImFsbG93X292ZXJsYXlfbGF5ZXI6IHRydWUiKQp9CgphbGxvd19tb3VudF9wb2ludChwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgYnVuZGxlX2lkLCBzYW5kYm94X2lkLCBsYXllcl9pZHMpIHsKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCAxOiBpX3N0b3JhZ2UubW91bnRfcG9pbnQgPSIsIGlfc3RvcmFnZS5tb3VudF9wb2ludCkKICAgIHBfc3RvcmFnZS5mc3R5cGUgPT0gInRhciIKCiAgICBzdGFydHN3aXRoKHBfc3RvcmFnZS5tb3VudF9wb2ludCwgIiQobGF5ZXIiKQogICAgbW91bnRfc3VmZml4IDo9IHRyaW1fbGVmdChwX3N0b3JhZ2UubW91bnRfcG9pbnQsICIkKGxheWVyIikKCiAgICBlbmRzd2l0aChtb3VudF9zdWZmaXgsICIpIikKICAgIGxheWVyX2luZGV4IDo9IHRyaW1fcmlnaHQobW91bnRfc3VmZml4LCAiKSIpCiAgICBpIDo9IHRvX251bWJlcihsYXllcl9pbmRleCkKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCAxOiBpID0iLCBpKQoKICAgIGxheWVyX2lkIDo9IGxheWVyX2lkc1tpXQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDE6IGxheWVyX2lkID0iLCBsYXllcl9pZCkKCiAgICBwX21vdW50IDo9IGNvbmNhdCgiLyIsIFsiL3J1bi9rYXRhLWNvbnRhaW5lcnMvc2FuZGJveC9sYXllcnMiLCBsYXllcl9pZF0pCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMTogcF9tb3VudCA9IiwgcF9tb3VudCkKCiAgICBwX21vdW50ID09IGlfc3RvcmFnZS5tb3VudF9wb2ludAoKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCAxOiB0cnVlIikKfQphbGxvd19tb3VudF9wb2ludChwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgYnVuZGxlX2lkLCBzYW5kYm94X2lkLCBsYXllcl9pZHMpIHsKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCAyOiBpX3N0b3JhZ2UubW91bnRfcG9pbnQgPSIsIGlfc3RvcmFnZS5tb3VudF9wb2ludCkKICAgIHBfc3RvcmFnZS5mc3R5cGUgPT0gImZ1c2UzLmthdGEtb3ZlcmxheSIKCiAgICBtb3VudDEgOj0gcmVwbGFjZShwX3N0b3JhZ2UubW91bnRfcG9pbnQsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5jcGF0aCkKICAgIG1vdW50MiA6PSByZXBsYWNlKG1vdW50MSwgIiQoYnVuZGxlLWlkKSIsIGJ1bmRsZV9pZCkKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCAyOiBtb3VudDIgPSIsIG1vdW50MikKCiAgICBtb3VudDIgPT0gaV9zdG9yYWdlLm1vdW50X3BvaW50CgogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDI6IHRydWUiKQp9CmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDM6IGlfc3RvcmFnZS5tb3VudF9wb2ludCA9IiwgaV9zdG9yYWdlLm1vdW50X3BvaW50KQogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAibG9jYWwiCgogICAgbW91bnQxIDo9IHBfc3RvcmFnZS5tb3VudF9wb2ludAogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDM6IG1vdW50MSA9IiwgbW91bnQxKQoKICAgIG1vdW50MiA6PSByZXBsYWNlKG1vdW50MSwgIiQoY3BhdGgpIiwgcG9saWN5X2RhdGEuY29tbW9uLmNwYXRoKQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDM6IG1vdW50MiA9IiwgbW91bnQyKQoKICAgIG1vdW50MyA6PSByZXBsYWNlKG1vdW50MiwgIiQoc2FuZGJveC1pZCkiLCBzYW5kYm94X2lkKQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDM6IG1vdW50MyA9IiwgbW91bnQzKQoKICAgIHJlZ2V4Lm1hdGNoKG1vdW50MywgaV9zdG9yYWdlLm1vdW50X3BvaW50KQoKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCAzOiB0cnVlIikKfQphbGxvd19tb3VudF9wb2ludChwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgYnVuZGxlX2lkLCBzYW5kYm94X2lkLCBsYXllcl9pZHMpIHsKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA0OiBpX3N0b3JhZ2UubW91bnRfcG9pbnQgPSIsIGlfc3RvcmFnZS5tb3VudF9wb2ludCkKICAgIHBfc3RvcmFnZS5mc3R5cGUgPT0gImJpbmQiCgogICAgbW91bnQxIDo9IHBfc3RvcmFnZS5tb3VudF9wb2ludAogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDQ6IG1vdW50MSA9IiwgbW91bnQxKQoKICAgIG1vdW50MiA6PSByZXBsYWNlKG1vdW50MSwgIiQoY3BhdGgpIiwgcG9saWN5X2RhdGEuY29tbW9uLmNwYXRoKQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDQ6IG1vdW50MiA9IiwgbW91bnQyKQoKICAgIG1vdW50MyA6PSByZXBsYWNlKG1vdW50MiwgIiQoYnVuZGxlLWlkKSIsIGJ1bmRsZV9pZCkKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA0OiBtb3VudDMgPSIsIG1vdW50MykKCiAgICByZWdleC5tYXRjaChtb3VudDMsIGlfc3RvcmFnZS5tb3VudF9wb2ludCkKCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNDogdHJ1ZSIpCn0KYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKSB7CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNTogaV9zdG9yYWdlLm1vdW50X3BvaW50ID0iLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCiAgICBwX3N0b3JhZ2UuZnN0eXBlID09ICJ0bXBmcyIKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNTogbW91bnQxID0iLCBtb3VudDEpCgogICAgcmVnZXgubWF0Y2gobW91bnQxLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCgogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDU6IHRydWUiKQp9CgojIHByb2Nlc3MuQ2FwYWJpbGl0aWVzCmFsbG93X2NhcHMocF9jYXBzLCBpX2NhcHMpIHsKICAgIHByaW50KCJhbGxvd19jYXBzOiBwb2xpY3kgQW1iaWVudCA9IiwgcF9jYXBzLkFtYmllbnQpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgQW1iaWVudCA9IiwgaV9jYXBzLkFtYmllbnQpCiAgICBtYXRjaF9jYXBzKHBfY2Fwcy5BbWJpZW50LCBpX2NhcHMuQW1iaWVudCkKCiAgICBwcmludCgiYWxsb3dfY2FwczogcG9saWN5IEJvdW5kaW5nID0iLCBwX2NhcHMuQm91bmRpbmcpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgQm91bmRpbmcgPSIsIGlfY2Fwcy5Cb3VuZGluZykKICAgIG1hdGNoX2NhcHMocF9jYXBzLkJvdW5kaW5nLCBpX2NhcHMuQm91bmRpbmcpCgogICAgcHJpbnQoImFsbG93X2NhcHM6IHBvbGljeSBFZmZlY3RpdmUgPSIsIHBfY2Fwcy5FZmZlY3RpdmUpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgRWZmZWN0aXZlID0iLCBpX2NhcHMuRWZmZWN0aXZlKQogICAgbWF0Y2hfY2FwcyhwX2NhcHMuRWZmZWN0aXZlLCBpX2NhcHMuRWZmZWN0aXZlKQoKICAgIHByaW50KCJhbGxvd19jYXBzOiBwb2xpY3kgSW5oZXJpdGFibGUgPSIsIHBfY2Fwcy5Jbmhlcml0YWJsZSkKICAgIHByaW50KCJhbGxvd19jYXBzOiBpbnB1dCBJbmhlcml0YWJsZSA9IiwgaV9jYXBzLkluaGVyaXRhYmxlKQogICAgbWF0Y2hfY2FwcyhwX2NhcHMuSW5oZXJpdGFibGUsIGlfY2Fwcy5Jbmhlcml0YWJsZSkKCiAgICBwcmludCgiYWxsb3dfY2FwczogcG9saWN5IFBlcm1pdHRlZCA9IiwgcF9jYXBzLlBlcm1pdHRlZCkKICAgIHByaW50KCJhbGxvd19jYXBzOiBpbnB1dCBQZXJtaXR0ZWQgPSIsIGlfY2Fwcy5QZXJtaXR0ZWQpCiAgICBtYXRjaF9jYXBzKHBfY2Fwcy5QZXJtaXR0ZWQsIGlfY2Fwcy5QZXJtaXR0ZWQpCn0KCm1hdGNoX2NhcHMocF9jYXBzLCBpX2NhcHMpIHsKICAgIHByaW50KCJtYXRjaF9jYXBzIDE6IHN0YXJ0IikKCiAgICBwX2NhcHMgPT0gaV9jYXBzCgogICAgcHJpbnQoIm1hdGNoX2NhcHMgMTogdHJ1ZSIpCn0KbWF0Y2hfY2FwcyhwX2NhcHMsIGlfY2FwcykgewogICAgcHJpbnQoIm1hdGNoX2NhcHMgMjogc3RhcnQiKQoKICAgIGNvdW50KHBfY2FwcykgPT0gMQogICAgcF9jYXBzWzBdID09ICIkKGRlZmF1bHRfY2FwcykiCgogICAgcHJpbnQoIm1hdGNoX2NhcHMgMjogZGVmYXVsdF9jYXBzID0iLCBwb2xpY3lfZGF0YS5jb21tb24uZGVmYXVsdF9jYXBzKQogICAgcG9saWN5X2RhdGEuY29tbW9uLmRlZmF1bHRfY2FwcyA9PSBpX2NhcHMKCiAgICBwcmludCgibWF0Y2hfY2FwcyAyOiB0cnVlIikKfQptYXRjaF9jYXBzKHBfY2FwcywgaV9jYXBzKSB7CiAgICBwcmludCgibWF0Y2hfY2FwcyAzOiBzdGFydCIpCgogICAgY291bnQocF9jYXBzKSA9PSAxCiAgICBwX2NhcHNbMF0gPT0gIiQocHJpdmlsZWdlZF9jYXBzKSIKCiAgICBwcmludCgibWF0Y2hfY2FwcyAzOiBwcml2aWxlZ2VkX2NhcHMgPSIsIHBvbGljeV9kYXRhLmNvbW1vbi5wcml2aWxlZ2VkX2NhcHMpCiAgICBwb2xpY3lfZGF0YS5jb21tb24ucHJpdmlsZWdlZF9jYXBzID09IGlfY2FwcwoKICAgIHByaW50KCJtYXRjaF9jYXBzIDM6IHRydWUiKQp9CgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCkNvcHlGaWxlUmVxdWVzdCB7CiAgICBwcmludCgiQ29weUZpbGVSZXF1ZXN0OiBpbnB1dC5wYXRoID0iLCBpbnB1dC5wYXRoKQoKICAgIHNvbWUgcmVnZXgxIGluIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuQ29weUZpbGVSZXF1ZXN0CiAgICByZWdleDIgOj0gcmVwbGFjZShyZWdleDEsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5jcGF0aCkKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4MiwgaW5wdXQucGF0aCkKCiAgICBwcmludCgiQ29weUZpbGVSZXF1ZXN0OiB0cnVlIikKfQoKRXhlY1Byb2Nlc3NSZXF1ZXN0IHsKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMTogaW5wdXQgPSIsIGlucHV0KQoKICAgIGlfY29tbWFuZCA9IGNvbmNhdCgiICIsIGlucHV0LnByb2Nlc3MuQXJncykKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMzogaV9jb21tYW5kID0iLCBpX2NvbW1hbmQpCgogICAgc29tZSBwX2NvbW1hbmQgaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5FeGVjUHJvY2Vzc1JlcXVlc3QuY29tbWFuZHMKICAgIHBfY29tbWFuZCA9PSBpX2NvbW1hbmQKCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDE6IHRydWUiKQp9CkV4ZWNQcm9jZXNzUmVxdWVzdCB7CiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDI6IGlucHV0ID0iLCBpbnB1dCkKCiAgICAjIFRPRE86IG1hdGNoIGlucHV0IGNvbnRhaW5lciBJRCB3aXRoIGl0cyBjb3JyZXNwb25kaW5nIGNvbnRhaW5lci5leGVjX2NvbW1hbmRzLgogICAgaV9jb21tYW5kID0gY29uY2F0KCIgIiwgaW5wdXQucHJvY2Vzcy5BcmdzKQogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAzOiBpX2NvbW1hbmQgPSIsIGlfY29tbWFuZCkKCiAgICBzb21lIGNvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBzb21lIHBfY29tbWFuZCBpbiBjb250YWluZXIuZXhlY19jb21tYW5kcwogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAyOiBwX2NvbW1hbmQgPSIsIHBfY29tbWFuZCkKCiAgICAjIFRPRE86IHNob3VsZCBvdGhlciBpbnB1dCBkYXRhIGZpZWxkcyBiZSB2YWxpZGF0ZWQgYXMgd2VsbD8KICAgIHBfY29tbWFuZCA9PSBpX2NvbW1hbmQKCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDI6IHRydWUiKQp9CkV4ZWNQcm9jZXNzUmVxdWVzdCB7CiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDM6IGlucHV0ID0iLCBpbnB1dCkKCiAgICBpX2NvbW1hbmQgPSBjb25jYXQoIiAiLCBpbnB1dC5wcm9jZXNzLkFyZ3MpCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDM6IGlfY29tbWFuZCA9IiwgaV9jb21tYW5kKQoKICAgIHNvbWUgcF9yZWdleCBpbiBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLkV4ZWNQcm9jZXNzUmVxdWVzdC5yZWdleAogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAzOiBwX3JlZ2V4ID0iLCBwX3JlZ2V4KQoKICAgIHJlZ2V4Lm1hdGNoKHBfcmVnZXgsIGlfY29tbWFuZCkKCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDM6IHRydWUiKQp9CgpSZWFkU3RyZWFtUmVxdWVzdCB7CiAgICBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLlJlYWRTdHJlYW1SZXF1ZXN0ID09IHRydWUKfQoKV3JpdGVTdHJlYW1SZXF1ZXN0IHsKICAgIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuV3JpdGVTdHJlYW1SZXF1ZXN0ID09IHRydWUKfQoKcG9saWN5X2RhdGEgOj0gewogICJjb250YWluZXJzIjogWwogICAgewogICAgICAiT0NJIjogewogICAgICAgICJWZXJzaW9uIjogIjEuMS4wLXJjLjEiLAogICAgICAgICJQcm9jZXNzIjogewogICAgICAgICAgIlRlcm1pbmFsIjogZmFsc2UsCiAgICAgICAgICAiVXNlciI6IHsKICAgICAgICAgICAgIlVJRCI6IDY1NTM1LAogICAgICAgICAgICAiR0lEIjogNjU1MzUsCiAgICAgICAgICAgICJBZGRpdGlvbmFsR2lkcyI6IFtdLAogICAgICAgICAgICAiVXNlcm5hbWUiOiAiIgogICAgICAgICAgfSwKICAgICAgICAgICJBcmdzIjogWwogICAgICAgICAgICAiL3BhdXNlIgogICAgICAgICAgXSwKICAgICAgICAgICJFbnYiOiBbCiAgICAgICAgICAgICJQQVRIPS91c3IvbG9jYWwvc2JpbjovdXNyL2xvY2FsL2JpbjovdXNyL3NiaW46L3Vzci9iaW46L3NiaW46L2JpbiIKICAgICAgICAgIF0sCiAgICAgICAgICAiQ3dkIjogIi8iLAogICAgICAgICAgIkNhcGFiaWxpdGllcyI6IHsKICAgICAgICAgICAgIkFtYmllbnQiOiBbXSwKICAgICAgICAgICAgIkJvdW5kaW5nIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJFZmZlY3RpdmUiOiBbCiAgICAgICAgICAgICAgIiQoZGVmYXVsdF9jYXBzKSIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgIkluaGVyaXRhYmxlIjogW10sCiAgICAgICAgICAgICJQZXJtaXR0ZWQiOiBbCiAgICAgICAgICAgICAgIiQoZGVmYXVsdF9jYXBzKSIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgICJOb05ld1ByaXZpbGVnZXMiOiB0cnVlCiAgICAgICAgfSwKICAgICAgICAiUm9vdCI6IHsKICAgICAgICAgICJQYXRoIjogIiQoY3BhdGgpLyQoYnVuZGxlLWlkKSIsCiAgICAgICAgICAiUmVhZG9ubHkiOiB0cnVlCiAgICAgICAgfSwKICAgICAgICAiTW91bnRzIjogWwogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL3Byb2MiLAogICAgICAgICAgICAic291cmNlIjogInByb2MiLAogICAgICAgICAgICAidHlwZV8iOiAicHJvYyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYiLAogICAgICAgICAgICAic291cmNlIjogInRtcGZzIiwKICAgICAgICAgICAgInR5cGVfIjogInRtcGZzIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgInN0cmljdGF0aW1lIiwKICAgICAgICAgICAgICAibW9kZT03NTUiLAogICAgICAgICAgICAgICJzaXplPTY1NTM2ayIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvcHRzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJkZXZwdHMiLAogICAgICAgICAgICAidHlwZV8iOiAiZGV2cHRzIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAgICAgIm5ld2luc3RhbmNlIiwKICAgICAgICAgICAgICAicHRteG1vZGU9MDY2NiIsCiAgICAgICAgICAgICAgIm1vZGU9MDYyMCIsCiAgICAgICAgICAgICAgImdpZD01IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi9zaG0iLAogICAgICAgICAgICAic291cmNlIjogIi9ydW4va2F0YS1jb250YWluZXJzL3NhbmRib3gvc2htIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L21xdWV1ZSIsCiAgICAgICAgICAgICJzb3VyY2UiOiAibXF1ZXVlIiwKICAgICAgICAgICAgInR5cGVfIjogIm1xdWV1ZSIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9zeXMiLAogICAgICAgICAgICAic291cmNlIjogInN5c2ZzIiwKICAgICAgICAgICAgInR5cGVfIjogInN5c2ZzIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAgICAgIm5vZGV2IiwKICAgICAgICAgICAgICAicm8iCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZXRjL3Jlc29sdi5jb25mIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KXJlc29sdi5jb25mJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicm8iLAogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2RldiIsCiAgICAgICAgICAgICAgIm5vZXhlYyIKICAgICAgICAgICAgXQogICAgICAgICAgfQogICAgICAgIF0sCiAgICAgICAgIkFubm90YXRpb25zIjogewogICAgICAgICAgImlvLmthdGFjb250YWluZXJzLnBrZy5vY2kuYnVuZGxlX3BhdGgiOiAiL3J1bi9jb250YWluZXJkL2lvLmNvbnRhaW5lcmQucnVudGltZS52Mi50YXNrL2s4cy5pby8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgImlvLmthdGFjb250YWluZXJzLnBrZy5vY2kuY29udGFpbmVyX3R5cGUiOiAicG9kX3NhbmRib3giLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLmNvbnRhaW5lci10eXBlIjogInNhbmRib3giLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtaWQiOiAiXlthLXowLTldezY0fSQiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbG9nLWRpcmVjdG9yeSI6ICJeL3Zhci9sb2cvcG9kcy8kKHNhbmRib3gtbmFtZXNwYWNlKV8kKHNhbmRib3gtbmFtZSlfWzAtOWEtZl17OH0tWzAtOWEtZl17NH0tWzAtOWEtZl17NH0tWzAtOWEtZl17NH0tWzAtOWEtZl17MTJ9JCIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1uYW1lc3BhY2UiOiAiZGVmYXVsdCIsCiAgICAgICAgICAibmVyZGN0bC9uZXR3b3JrLW5hbWVzcGFjZSI6ICJeL3Zhci9ydW4vbmV0bnMvY25pLVswLTlhLWZdezh9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezEyfSQiCiAgICAgICAgfSwKICAgICAgICAiTGludXgiOiB7CiAgICAgICAgICAiTmFtZXNwYWNlcyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICJUeXBlIjogImlwYyIsCiAgICAgICAgICAgICAgIlBhdGgiOiAiIgogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgIlR5cGUiOiAidXRzIiwKICAgICAgICAgICAgICAiUGF0aCI6ICIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiVHlwZSI6ICJtb3VudCIsCiAgICAgICAgICAgICAgIlBhdGgiOiAiIgogICAgICAgICAgICB9CiAgICAgICAgICBdLAogICAgICAgICAgIk1hc2tlZFBhdGhzIjogWwogICAgICAgICAgICAiL3Byb2MvYWNwaSIsCiAgICAgICAgICAgICIvcHJvYy9hc291bmQiLAogICAgICAgICAgICAiL3Byb2Mva2NvcmUiLAogICAgICAgICAgICAiL3Byb2Mva2V5cyIsCiAgICAgICAgICAgICIvcHJvYy9sYXRlbmN5X3N0YXRzIiwKICAgICAgICAgICAgIi9wcm9jL3RpbWVyX2xpc3QiLAogICAgICAgICAgICAiL3Byb2MvdGltZXJfc3RhdHMiLAogICAgICAgICAgICAiL3Byb2Mvc2NoZWRfZGVidWciLAogICAgICAgICAgICAiL3N5cy9maXJtd2FyZSIsCiAgICAgICAgICAgICIvcHJvYy9zY3NpIgogICAgICAgICAgXSwKICAgICAgICAgICJSZWFkb25seVBhdGhzIjogWwogICAgICAgICAgICAiL3Byb2MvYnVzIiwKICAgICAgICAgICAgIi9wcm9jL2ZzIiwKICAgICAgICAgICAgIi9wcm9jL2lycSIsCiAgICAgICAgICAgICIvcHJvYy9zeXMiLAogICAgICAgICAgICAiL3Byb2Mvc3lzcnEtdHJpZ2dlciIKICAgICAgICAgIF0KICAgICAgICB9CiAgICAgIH0sCiAgICAgICJzdG9yYWdlcyI6IFsKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoMCkiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXIwKSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogIm92ZXJsYXlmcyIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAiZnVzZTMua2F0YS1vdmVybGF5IiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiNWE1YWFkODAwNTVmZjIwMDEyYTUwZGMyNWY4ZGY3YTI5OTI0NDc0MzI0ZDY1ZjdkNTMwNmVlOGVlMjdmZjcxZCIsCiAgICAgICAgICAgICI4MTcyNTBmMWEzZTMzNmRhNzZmNWJkM2ZhNzg0ZTFiMjZkOTU5YjljMTMxODc2ODE1YmEyNjA0MDQ4YjcwYzE4IgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGNwYXRoKS8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0KICAgICAgXSwKICAgICAgImV4ZWNfY29tbWFuZHMiOiBbXQogICAgfSwKICAgIHsKICAgICAgIk9DSSI6IHsKICAgICAgICAiVmVyc2lvbiI6ICIxLjEuMC1yYy4xIiwKICAgICAgICAiUHJvY2VzcyI6IHsKICAgICAgICAgICJUZXJtaW5hbCI6IGZhbHNlLAogICAgICAgICAgIlVzZXIiOiB7CiAgICAgICAgICAgICJVSUQiOiAwLAogICAgICAgICAgICAiR0lEIjogMCwKICAgICAgICAgICAgIkFkZGl0aW9uYWxHaWRzIjogW10sCiAgICAgICAgICAgICJVc2VybmFtZSI6ICIiCiAgICAgICAgICB9LAogICAgICAgICAgIkFyZ3MiOiBbCiAgICAgICAgICAgICJkb2NrZXItZW50cnlwb2ludC5zaCIsCiAgICAgICAgICAgICJyZWRpcy1zZXJ2ZXIiCiAgICAgICAgICBdLAogICAgICAgICAgIkVudiI6IFsKICAgICAgICAgICAgIlBBVEg9L3Vzci9sb2NhbC9zYmluOi91c3IvbG9jYWwvYmluOi91c3Ivc2JpbjovdXNyL2Jpbjovc2JpbjovYmluIiwKICAgICAgICAgICAgIlJFRElTX1ZFUlNJT049NS4wLjUiLAogICAgICAgICAgICAiUkVESVNfRE9XTkxPQURfVVJMPWh0dHA6Ly9kb3dubG9hZC5yZWRpcy5pby9yZWxlYXNlcy9yZWRpcy01LjAuNS50YXIuZ3oiLAogICAgICAgICAgICAiUkVESVNfRE9XTkxPQURfU0hBPTIxMzkwMDk3OTlkMjFkOGZmOTRmYzQwYjdmMzZhYzQ2Njk5YjllMTI1NDA4NjI5OWY4ZDNiMjIzY2E1NGEzNzUiLAogICAgICAgICAgICAiSE9TVE5BTUU9JChob3N0LW5hbWUpIgogICAgICAgICAgXSwKICAgICAgICAgICJDd2QiOiAiL2RhdGEiLAogICAgICAgICAgIkNhcGFiaWxpdGllcyI6IHsKICAgICAgICAgICAgIkFtYmllbnQiOiBbXSwKICAgICAgICAgICAgIkJvdW5kaW5nIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJFZmZlY3RpdmUiOiBbCiAgICAgICAgICAgICAgIiQoZGVmYXVsdF9jYXBzKSIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgIkluaGVyaXRhYmxlIjogW10sCiAgICAgICAgICAgICJQZXJtaXR0ZWQiOiBbCiAgICAgICAgICAgICAgIiQoZGVmYXVsdF9jYXBzKSIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgICJOb05ld1ByaXZpbGVnZXMiOiBmYWxzZQogICAgICAgIH0sCiAgICAgICAgIlJvb3QiOiB7CiAgICAgICAgICAiUGF0aCI6ICIkKGNwYXRoKS8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgIlJlYWRvbmx5IjogZmFsc2UKICAgICAgICB9LAogICAgICAgICJNb3VudHMiOiBbCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvcHJvYyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAicHJvYyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJwcm9jIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAgICAgIm5vZGV2IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2RldiIsCiAgICAgICAgICAgICJzb3VyY2UiOiAidG1wZnMiLAogICAgICAgICAgICAidHlwZV8iOiAidG1wZnMiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAic3RyaWN0YXRpbWUiLAogICAgICAgICAgICAgICJtb2RlPTc1NSIsCiAgICAgICAgICAgICAgInNpemU9NjU1MzZrIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi9wdHMiLAogICAgICAgICAgICAic291cmNlIjogImRldnB0cyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJkZXZwdHMiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibmV3aW5zdGFuY2UiLAogICAgICAgICAgICAgICJwdG14bW9kZT0wNjY2IiwKICAgICAgICAgICAgICAibW9kZT0wNjIwIiwKICAgICAgICAgICAgICAiZ2lkPTUiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L3NobSIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiL3J1bi9rYXRhLWNvbnRhaW5lcnMvc2FuZGJveC9zaG0iLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvbXF1ZXVlIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJtcXVldWUiLAogICAgICAgICAgICAidHlwZV8iOiAibXF1ZXVlIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAgICAgIm5vZGV2IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL3N5cyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAic3lzZnMiLAogICAgICAgICAgICAidHlwZV8iOiAic3lzZnMiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiLAogICAgICAgICAgICAgICJybyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9zeXMvZnMvY2dyb3VwIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJjZ3JvdXAiLAogICAgICAgICAgICAidHlwZV8iOiAiY2dyb3VwIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAgICAgIm5vZGV2IiwKICAgICAgICAgICAgICAicmVsYXRpbWUiLAogICAgICAgICAgICAgICJybyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9ldGMvaG9zdHMiLAogICAgICAgICAgICAic291cmNlIjogIiQoc2ZwcmVmaXgpaG9zdHMkIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJ3IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi90ZXJtaW5hdGlvbi1sb2ciLAogICAgICAgICAgICAic291cmNlIjogIiQoc2ZwcmVmaXgpdGVybWluYXRpb24tbG9nJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJydyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9ldGMvaG9zdG5hbWUiLAogICAgICAgICAgICAic291cmNlIjogIiQoc2ZwcmVmaXgpaG9zdG5hbWUkIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJ3IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2V0Yy9yZXNvbHYuY29uZiIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClyZXNvbHYuY29uZiQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicnciCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvdmFyL3J1bi9zZWNyZXRzL2t1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQiLAogICAgICAgICAgICAic291cmNlIjogIiQoc2ZwcmVmaXgpc2VydmljZWFjY291bnQkIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL3Zhci9ydW4vc2VjcmV0cy9henVyZS90b2tlbnMiLAogICAgICAgICAgICAic291cmNlIjogIiQoc2ZwcmVmaXgpdG9rZW5zJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJybyIKICAgICAgICAgICAgXQogICAgICAgICAgfQogICAgICAgIF0sCiAgICAgICAgIkFubm90YXRpb25zIjogewogICAgICAgICAgImlvLmthdGFjb250YWluZXJzLnBrZy5vY2kuYnVuZGxlX3BhdGgiOiAiL3J1bi9jb250YWluZXJkL2lvLmNvbnRhaW5lcmQucnVudGltZS52Mi50YXNrL2s4cy5pby8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgImlvLmthdGFjb250YWluZXJzLnBrZy5vY2kuY29udGFpbmVyX3R5cGUiOiAicG9kX2NvbnRhaW5lciIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLW5hbWUiOiAibWFzdGVyIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSI6ICJjb250YWluZXIiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLmltYWdlLW5hbWUiOiAiZG9ja2VyLmlvL2xpYnJhcnkvcmVkaXM6NS4wLjUtYWxwaW5lIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWlkIjogIl5bYS16MC05XXs2NH0kIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LW5hbWVzcGFjZSI6ICJkZWZhdWx0IgogICAgICAgIH0sCiAgICAgICAgIkxpbnV4IjogewogICAgICAgICAgIk5hbWVzcGFjZXMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiVHlwZSI6ICJpcGMiLAogICAgICAgICAgICAgICJQYXRoIjogIiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJUeXBlIjogInV0cyIsCiAgICAgICAgICAgICAgIlBhdGgiOiAiIgogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgIlR5cGUiOiAibW91bnQiLAogICAgICAgICAgICAgICJQYXRoIjogIiIKICAgICAgICAgICAgfQogICAgICAgICAgXSwKICAgICAgICAgICJNYXNrZWRQYXRocyI6IFsKICAgICAgICAgICAgIi9wcm9jL2FjcGkiLAogICAgICAgICAgICAiL3Byb2Mva2NvcmUiLAogICAgICAgICAgICAiL3Byb2Mva2V5cyIsCiAgICAgICAgICAgICIvcHJvYy9sYXRlbmN5X3N0YXRzIiwKICAgICAgICAgICAgIi9wcm9jL3RpbWVyX2xpc3QiLAogICAgICAgICAgICAiL3Byb2MvdGltZXJfc3RhdHMiLAogICAgICAgICAgICAiL3Byb2Mvc2NoZWRfZGVidWciLAogICAgICAgICAgICAiL3Byb2Mvc2NzaSIsCiAgICAgICAgICAgICIvc3lzL2Zpcm13YXJlIgogICAgICAgICAgXSwKICAgICAgICAgICJSZWFkb25seVBhdGhzIjogWwogICAgICAgICAgICAiL3Byb2MvYXNvdW5kIiwKICAgICAgICAgICAgIi9wcm9jL2J1cyIsCiAgICAgICAgICAgICIvcHJvYy9mcyIsCiAgICAgICAgICAgICIvcHJvYy9pcnEiLAogICAgICAgICAgICAiL3Byb2Mvc3lzIiwKICAgICAgICAgICAgIi9wcm9jL3N5c3JxLXRyaWdnZXIiCiAgICAgICAgICBdCiAgICAgICAgfQogICAgICB9LAogICAgICAic3RvcmFnZXMiOiBbCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJibGsiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogInRhciIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIiQoaGFzaDApIgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGxheWVyMCkiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJibGsiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogInRhciIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIiQoaGFzaDEpIgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGxheWVyMSkiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJibGsiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogInRhciIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIiQoaGFzaDIpIgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGxheWVyMikiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJibGsiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogInRhciIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIiQoaGFzaDMpIgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGxheWVyMykiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJibGsiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogInRhciIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIiQoaGFzaDQpIgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGxheWVyNCkiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJibGsiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogInRhciIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIiQoaGFzaDUpIgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGxheWVyNSkiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJvdmVybGF5ZnMiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogImZ1c2UzLmthdGEtb3ZlcmxheSIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgImFiMjYzMTM4OGZkODFhOTkzMWQ5OTVjN2FkOTQwOWYwZGMxODQ5YmQyYzdkMDU1NmVkMDcxMGE3ZDA0YmVjMTg6MDQ0NTIzZjljMGFjNGVjNmJkNzg1YzA1ZWNmZjEwYTY2ODhkNzc1NjY2MzVkMTRlODQ4ZTZjNGQ1NDk0YTU4ZTplZmUyN2RhZTViZGRkNGI3OTU3ZjgzMzU4Y2Y4NTdhYjI0YjJiYWNhN2U1MWY3NjZhNmUxMTNlZWFiNWM2MDk1OmEwMWVmMTc5M2Q0M2MwNjhjYTU0OGIwMjIzYjBhMmJmMzg0NGRiMDRkYjczMjdhNDI4ZjljZGFmZWM1NGZkNTc6ZGNmNDlkZmI2YWZiMDRmZTk0NmIyZDRkNGFkYmRhMWM0MzJlMzk0MDkzM2NjZTdiNDViNWY2NjYzYmE2N2Q5MTphZjA4YzkxOGQzMTc4NzhjYTEwZThlYWNkMzJiNjA1YzUyMjdmNzhiMzIzNmRlMjA0Y2RiNTRjNGVkMGNiYTljIiwKICAgICAgICAgICAgImZiMmU0MzJhZjFlMGVmMTljOGNkMjI4N2I5ZWVhY2M1NDUwMjVmZWQ3OTdkNjQ5Y2NhNmJhNGJmNTNlYzI2NDg6YTU2MDljZjA3YzdmY2VlODRkOGU4YTAyZTVjYTU1NDUwYTI0MmM1ZjM2YTI3ZGJjODQ2ZTQ5ODlkNGJkNWM5Nzo4ZjJmZGRlYWRkZTc5OTU4ZDk1YjkwYzY3M2Q1MTJjOTkzODUzNzBlYzMyNzI5NDU3NDEyNzc1MDY2Yzg3ZjZiOmVhNDIyYjk4Zjc1OTliZmJhNmMyOWFjOGM5MmM2MjUyZWM5M2MzMGM3OTJkZWUyYzExYTk2MWZlZjgzZDRlNDk6MWFiNGY4MGIwMGE1OGZkZTM0NDRkNmE5NjBjNmVlMDI5ZTQ4NDU0ZDk4YzAwZDFhZjVlNDI4YjBjYzM3MWQ1ODo1ZWNlZWUzYzE1ZmUyYmNkZmIwMjljNzZiMTRlNzFjYjkxYjI5MzM0ZGUyZmU5NTI2YWNjYTFjN2IzNDZjYzIwIgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGNwYXRoKS8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0KICAgICAgXSwKICAgICAgImV4ZWNfY29tbWFuZHMiOiBbXQogICAgfQogIF0sCiAgImNvbW1vbiI6IHsKICAgICJjcGF0aCI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zaGFyZWQvY29udGFpbmVycyIsCiAgICAic2ZwcmVmaXgiOiAiXiQoY3BhdGgpLyQoYnVuZGxlLWlkKS1bYS16MC05XXsxNn0tIiwKICAgICJpcHY0X2EiOiAiKCgyNVswLTVdfCgyWzAtNF18MVxcZHxbMS05XXwpXFxkKVxcLj9cXGIpezR9IiwKICAgICJpcF9wIjogIlswLTldezEsNX0iLAogICAgInN2Y19uYW1lIjogIltBLVowLTlfXFwuXFwtXSsiLAogICAgImRuc19sYWJlbCI6ICJbYS16QS1aMC05X1xcLlxcLV0rIiwKICAgICJkZWZhdWx0X2NhcHMiOiBbCiAgICAgICJDQVBfQ0hPV04iLAogICAgICAiQ0FQX0RBQ19PVkVSUklERSIsCiAgICAgICJDQVBfRlNFVElEIiwKICAgICAgIkNBUF9GT1dORVIiLAogICAgICAiQ0FQX01LTk9EIiwKICAgICAgIkNBUF9ORVRfUkFXIiwKICAgICAgIkNBUF9TRVRHSUQiLAogICAgICAiQ0FQX1NFVFVJRCIsCiAgICAgICJDQVBfU0VURkNBUCIsCiAgICAgICJDQVBfU0VUUENBUCIsCiAgICAgICJDQVBfTkVUX0JJTkRfU0VSVklDRSIsCiAgICAgICJDQVBfU1lTX0NIUk9PVCIsCiAgICAgICJDQVBfS0lMTCIsCiAgICAgICJDQVBfQVVESVRfV1JJVEUiCiAgICBdLAogICAgInByaXZpbGVnZWRfY2FwcyI6IFsKICAgICAgIkNBUF9DSE9XTiIsCiAgICAgICJDQVBfREFDX09WRVJSSURFIiwKICAgICAgIkNBUF9EQUNfUkVBRF9TRUFSQ0giLAogICAgICAiQ0FQX0ZPV05FUiIsCiAgICAgICJDQVBfRlNFVElEIiwKICAgICAgIkNBUF9LSUxMIiwKICAgICAgIkNBUF9TRVRHSUQiLAogICAgICAiQ0FQX1NFVFVJRCIsCiAgICAgICJDQVBfU0VUUENBUCIsCiAgICAgICJDQVBfTElOVVhfSU1NVVRBQkxFIiwKICAgICAgIkNBUF9ORVRfQklORF9TRVJWSUNFIiwKICAgICAgIkNBUF9ORVRfQlJPQURDQVNUIiwKICAgICAgIkNBUF9ORVRfQURNSU4iLAogICAgICAiQ0FQX05FVF9SQVciLAogICAgICAiQ0FQX0lQQ19MT0NLIiwKICAgICAgIkNBUF9JUENfT1dORVIiLAogICAgICAiQ0FQX1NZU19NT0RVTEUiLAogICAgICAiQ0FQX1NZU19SQVdJTyIsCiAgICAgICJDQVBfU1lTX0NIUk9PVCIsCiAgICAgICJDQVBfU1lTX1BUUkFDRSIsCiAgICAgICJDQVBfU1lTX1BBQ0NUIiwKICAgICAgIkNBUF9TWVNfQURNSU4iLAogICAgICAiQ0FQX1NZU19CT09UIiwKICAgICAgIkNBUF9TWVNfTklDRSIsCiAgICAgICJDQVBfU1lTX1JFU09VUkNFIiwKICAgICAgIkNBUF9TWVNfVElNRSIsCiAgICAgICJDQVBfU1lTX1RUWV9DT05GSUciLAogICAgICAiQ0FQX01LTk9EIiwKICAgICAgIkNBUF9MRUFTRSIsCiAgICAgICJDQVBfQVVESVRfV1JJVEUiLAogICAgICAiQ0FQX0FVRElUX0NPTlRST0wiLAogICAgICAiQ0FQX1NFVEZDQVAiLAogICAgICAiQ0FQX01BQ19PVkVSUklERSIsCiAgICAgICJDQVBfTUFDX0FETUlOIiwKICAgICAgIkNBUF9TWVNMT0ciLAogICAgICAiQ0FQX1dBS0VfQUxBUk0iLAogICAgICAiQ0FQX0JMT0NLX1NVU1BFTkQiLAogICAgICAiQ0FQX0FVRElUX1JFQUQiLAogICAgICAiQ0FQX1BFUkZNT04iLAogICAgICAiQ0FQX0JQRiIsCiAgICAgICJDQVBfQ0hFQ0tQT0lOVF9SRVNUT1JFIgogICAgXQogIH0sCiAgInJlcXVlc3RfZGVmYXVsdHMiOiB7CiAgICAiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdCI6IHsKICAgICAgImFsbG93X2Vudl9yZWdleCI6IFsKICAgICAgICAiXkhPU1ROQU1FPSQoZG5zX2xhYmVsKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfUE9SVF8kKGlwX3ApX1RDUD10Y3A6Ly8kKGlwdjRfYSk6JChpcF9wKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfUE9SVF8kKGlwX3ApX1RDUF9QUk9UTz10Y3AkIiwKICAgICAgICAiXiQoc3ZjX25hbWUpX1BPUlRfJChpcF9wKV9UQ1BfUE9SVD0kKGlwX3ApJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9QT1JUXyQoaXBfcClfVENQX0FERFI9JChpcHY0X2EpJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9TRVJWSUNFX0hPU1Q9JChpcHY0X2EpJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9TRVJWSUNFX1BPUlQ9JChpcF9wKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfU0VSVklDRV9QT1JUXyQoZG5zX2xhYmVsKT0kKGlwX3ApJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9QT1JUPXRjcDovLyQoaXB2NF9hKTokKGlwX3ApJCIsCiAgICAgICAgIl5BWlVSRV9DTElFTlRfSUQ9W0EtRmEtZjAtOS1dKyQiLAogICAgICAgICJeQVpVUkVfVEVOQU5UX0lEPVtBLUZhLWYwLTktXSskIiwKICAgICAgICAiXkFaVVJFX0ZFREVSQVRFRF9UT0tFTl9GSUxFPS92YXIvcnVuL3NlY3JldHMvYXp1cmUvdG9rZW5zL2F6dXJlLWlkZW50aXR5LXRva2VuJCIsCiAgICAgICAgIl5BWlVSRV9BVVRIT1JJVFlfSE9TVD1odHRwczovL2xvZ2luXFwubWljcm9zb2Z0b25saW5lXFwuY29tLyQiCiAgICAgIF0KICAgIH0sCiAgICAiQ29weUZpbGVSZXF1ZXN0IjogWwogICAgICAiXiQoY3BhdGgpLyIKICAgIF0sCiAgICAiRXhlY1Byb2Nlc3NSZXF1ZXN0IjogewogICAgICAiY29tbWFuZHMiOiBbXSwKICAgICAgInJlZ2V4IjogW10KICAgIH0sCiAgICAiUmVhZFN0cmVhbVJlcXVlc3QiOiB0cnVlLAogICAgIldyaXRlU3RyZWFtUmVxdWVzdCI6IGZhbHNlCiAgfQp9 + spec: + runtimeClassName: kata-cc + containers: + - name: master + image: "docker.io/library/redis:5.0.5-alpine" + resources: + requests: + cpu: 100m + memory: 100Mi + ports: + - containerPort: 6379 diff --git a/src/agent/samples/policy/yaml/kubernetes/unsupported-image/frontend-controller.yaml b/src/agent/samples/policy/yaml/kubernetes/unsupported-image/frontend-controller.yaml new file mode 100644 index 000000000000..a98dd4d94cbc --- /dev/null +++ b/src/agent/samples/policy/yaml/kubernetes/unsupported-image/frontend-controller.yaml @@ -0,0 +1,30 @@ +apiVersion: v1 +kind: ReplicationController +metadata: + name: frontend +spec: + replicas: 3 + template: + metadata: + labels: + app: guestbook + tier: frontend + spec: + runtimeClassName: kata-cc + containers: + - name: php-redis + image: gcr.io/google_samples/gb-frontend:v4 + resources: + requests: + cpu: 100m + memory: 100Mi + env: + - name: GET_HOSTS_FROM + value: dns + # If your cluster config does not include a dns service, then to + # instead access environment variables to find service host + # info, comment out the 'value: dns' line above, and uncomment the + # line below: + # value: env + ports: + - containerPort: 80 diff --git a/src/agent/samples/policy/yaml/kubernetes/unsupported-image/haproxyrc.yaml b/src/agent/samples/policy/yaml/kubernetes/unsupported-image/haproxyrc.yaml new file mode 100644 index 000000000000..85885d77aee7 --- /dev/null +++ b/src/agent/samples/policy/yaml/kubernetes/unsupported-image/haproxyrc.yaml @@ -0,0 +1,50 @@ +kind: ReplicationController +apiVersion: v1 +metadata: + name: service-loadbalancer + labels: + app: service-loadbalancer + version: v1 +spec: + replicas: 1 + selector: + app: service-loadbalancer + version: v1 + template: + metadata: + labels: + app: service-loadbalancer + version: v1 + spec: + runtimeClassName: kata-cc + containers: + - image: registry.k8s.io/servicelb:0.1 + imagePullPolicy: Always + livenessProbe: + httpGet: + path: /healthz + port: 8081 + scheme: HTTP + initialDelaySeconds: 30 + timeoutSeconds: 5 + name: haproxy + ports: + # All http services + - containerPort: 80 + hostPort: 80 + protocol: TCP + # nginx https + - containerPort: 443 + hostPort: 8080 + protocol: TCP + # mysql + - containerPort: 3306 + hostPort: 3306 + protocol: TCP + # haproxy stats + - containerPort: 1936 + hostPort: 1936 + protocol: TCP + resources: {} + args: + - --tcp-services=mysql:3306,nginxsvc:443 diff --git a/src/agent/samples/policy/yaml/kubernetes/unsupported-image/mysql-galera-statefulset.yaml b/src/agent/samples/policy/yaml/kubernetes/unsupported-image/mysql-galera-statefulset.yaml new file mode 100644 index 000000000000..ba6808380296 --- /dev/null +++ b/src/agent/samples/policy/yaml/kubernetes/unsupported-image/mysql-galera-statefulset.yaml @@ -0,0 +1,91 @@ +--- +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: mysql +spec: + serviceName: galera + replicas: 3 + selector: + matchLabels: + app: mysql + template: + metadata: + labels: + app: mysql + annotations: + io.katacontainers.config.agent.policy: IyBDb3B5cmlnaHQgKGMpIDIwMjMgTWljcm9zb2Z0IENvcnBvcmF0aW9uCiMKIyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMAojCnBhY2thZ2UgYWdlbnRfcG9saWN5CgppbXBvcnQgZnV0dXJlLmtleXdvcmRzLmluCmltcG9ydCBmdXR1cmUua2V5d29yZHMuZXZlcnkKCmltcG9ydCBpbnB1dAoKIyBEZWZhdWx0IHZhbHVlcywgcmV0dXJuZWQgYnkgT1BBIHdoZW4gcnVsZXMgY2Fubm90IGJlIGV2YWx1YXRlZCB0byB0cnVlLgpkZWZhdWx0IEFkZEFSUE5laWdoYm9yc1JlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBBZGRTd2FwUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IENsb3NlU3RkaW5SZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgQ29weUZpbGVSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgQ3JlYXRlQ29udGFpbmVyUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IENyZWF0ZVNhbmRib3hSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgRGVzdHJveVNhbmRib3hSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBFeGVjUHJvY2Vzc1JlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBHZXRPT01FdmVudFJlcXVlc3QgOj0gdHJ1ZQpkZWZhdWx0IEd1ZXN0RGV0YWlsc1JlcXVlc3QgOj0gdHJ1ZQpkZWZhdWx0IExpc3RJbnRlcmZhY2VzUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IExpc3RSb3V0ZXNSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgTWVtSG90cGx1Z0J5UHJvYmVSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgT25saW5lQ1BVTWVtUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgUGF1c2VDb250YWluZXJSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgUmVhZFN0cmVhbVJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBSZW1vdmVDb250YWluZXJSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBSZW1vdmVTdGFsZVZpcnRpb2ZzU2hhcmVNb3VudHNSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBSZXNlZWRSYW5kb21EZXZSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgUmVzdW1lQ29udGFpbmVyUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFNldEd1ZXN0RGF0ZVRpbWVSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgU2V0UG9saWN5UmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFNpZ25hbFByb2Nlc3NSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBTdGFydENvbnRhaW5lclJlcXVlc3QgOj0gdHJ1ZQpkZWZhdWx0IFN0YXJ0VHJhY2luZ1JlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBTdGF0c0NvbnRhaW5lclJlcXVlc3QgOj0gdHJ1ZQpkZWZhdWx0IFN0b3BUcmFjaW5nUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFR0eVdpblJlc2l6ZVJlcXVlc3QgOj0gdHJ1ZQpkZWZhdWx0IFVwZGF0ZUNvbnRhaW5lclJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBVcGRhdGVFcGhlbWVyYWxNb3VudHNSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgVXBkYXRlSW50ZXJmYWNlUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgVXBkYXRlUm91dGVzUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgV2FpdFByb2Nlc3NSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBXcml0ZVN0cmVhbVJlcXVlc3QgOj0gZmFsc2UKCiMgQWxsb3dSZXF1ZXN0c0ZhaWxpbmdQb2xpY3kgOj0gdHJ1ZSBjb25maWd1cmVzIHRoZSBBZ2VudCB0byAqYWxsb3cgYW55CiMgcmVxdWVzdHMgY2F1c2luZyBhIHBvbGljeSBmYWlsdXJlKi4gVGhpcyBpcyBhbiB1bnNlY3VyZSBjb25maWd1cmF0aW9uCiMgYnV0IGlzIHVzZWZ1bCBmb3IgYWxsb3dpbmcgdW5zZWN1cmUgcG9kcyB0byBzdGFydCwgdGhlbiBjb25uZWN0IHRvCiMgdGhlbSBhbmQgaW5zcGVjdCBPUEEgbG9ncyBmb3IgdGhlIHJvb3QgY2F1c2Ugb2YgYSBmYWlsdXJlLgpkZWZhdWx0IEFsbG93UmVxdWVzdHNGYWlsaW5nUG9saWN5IDo9IGZhbHNlCgpDcmVhdGVDb250YWluZXJSZXF1ZXN0IHsKICAgIGlfb2NpIDo9IGlucHV0Lk9DSQogICAgaV9zdG9yYWdlcyA6PSBpbnB1dC5zdG9yYWdlcwoKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0OiBpX29jaS5Ib29rcyA9IiwgaV9vY2kuSG9va3MpCiAgICBpc19udWxsKGlfb2NpLkhvb2tzKQoKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0OiBpX29jaS5MaW51eC5TZWNjb21wID0iLCBpX29jaS5MaW51eC5TZWNjb21wKQogICAgaXNfbnVsbChpX29jaS5MaW51eC5TZWNjb21wKQoKICAgIHNvbWUgcF9jb250YWluZXIgaW4gcG9saWN5X2RhdGEuY29udGFpbmVycwogICAgcHJpbnQoIj09PT09PT09IENyZWF0ZUNvbnRhaW5lclJlcXVlc3Q6IHRyeWluZyBuZXh0IHBvbGljeSBjb250YWluZXIiKQoKICAgIHBfcGlkbnMgOj0gcF9jb250YWluZXIuc2FuZGJveF9waWRucwogICAgaV9waWRucyA6PSBpbnB1dC5zYW5kYm94X3BpZG5zCiAgICBwcmludCgiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdDogcF9waWRucyA9IiwgcF9waWRucywgImlfcGlkbnMgPSIsIGlfcGlkbnMpCiAgICBwX3BpZG5zID09IGlfcGlkbnMKCiAgICBwX29jaSA6PSBwX2NvbnRhaW5lci5PQ0kKCiAgICBwcmludCgiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdDogcCBWZXJzaW9uID0iLCBwX29jaS5WZXJzaW9uLCAiaSBWZXJzaW9uID0iLCBpX29jaS5WZXJzaW9uKQogICAgcF9vY2kuVmVyc2lvbiA9PSBpX29jaS5WZXJzaW9uCgogICAgcHJpbnQoIkNyZWF0ZUNvbnRhaW5lclJlcXVlc3Q6IHAgUmVhZG9ubHkgPSIsIHBfb2NpLlJvb3QuUmVhZG9ubHksICJpIFJlYWRvbmx5ID0iLCBpX29jaS5Sb290LlJlYWRvbmx5KQogICAgcF9vY2kuUm9vdC5SZWFkb25seSA9PSBpX29jaS5Sb290LlJlYWRvbmx5CgogICAgYWxsb3dfYW5ubyhwX29jaSwgaV9vY2kpCgogICAgcF9zdG9yYWdlcyA6PSBwX2NvbnRhaW5lci5zdG9yYWdlcwogICAgYWxsb3dfYnlfYW5ubyhwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpCgogICAgYWxsb3dfbGludXgocF9vY2ksIGlfb2NpKQoKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0OiB0cnVlIikKfQoKIyBSZWplY3QgdW5leHBlY3RlZCBhbm5vdGF0aW9ucy4KYWxsb3dfYW5ubyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19hbm5vIDE6IHN0YXJ0IikKCiAgICBub3QgaV9vY2kuQW5ub3RhdGlvbnMKCiAgICBwcmludCgiYWxsb3dfYW5ubyAxOiB0cnVlIikKfQphbGxvd19hbm5vKHBfb2NpLCBpX29jaSkgewogICAgcHJpbnQoImFsbG93X2Fubm8gMjogcCBBbm5vdGF0aW9ucyA9IiwgcF9vY2kuQW5ub3RhdGlvbnMpCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiBpIEFubm90YXRpb25zID0iLCBpX29jaS5Bbm5vdGF0aW9ucykKCiAgICBpX2tleXMgOj0gb2JqZWN0LmtleXMoaV9vY2kuQW5ub3RhdGlvbnMpCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiBpIGtleXMgPSIsIGlfa2V5cykKCiAgICBldmVyeSBpX2tleSBpbiBpX2tleXMgewogICAgICAgIGFsbG93X2Fubm9fa2V5KGlfa2V5LCBwX29jaSkKICAgIH0KCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiB0cnVlIikKfQoKYWxsb3dfYW5ub19rZXkoaV9rZXksIHBfb2NpKSB7CiAgICBwcmludCgiYWxsb3dfYW5ub19rZXkgMTogaSBrZXkgPSIsIGlfa2V5KQoKICAgIHN0YXJ0c3dpdGgoaV9rZXksICJpby5rdWJlcm5ldGVzLmNyaS4iKQoKICAgIHByaW50KCJhbGxvd19hbm5vX2tleSAxOiB0cnVlIikKfQphbGxvd19hbm5vX2tleShpX2tleSwgcF9vY2kpIHsKICAgIHByaW50KCJhbGxvd19hbm5vX2tleSAyOiBpIGtleSA9IiwgaV9rZXkpCgogICAgc29tZSBwX2tleSwgXyBpbiBwX29jaS5Bbm5vdGF0aW9ucwogICAgcF9rZXkgPT0gaV9rZXkKCiAgICBwcmludCgiYWxsb3dfYW5ub19rZXkgMjogdHJ1ZSIpCn0KCiMgR2V0IHRoZSB2YWx1ZSBvZiB0aGUgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZSIgYW5ub3RhdGlvbiBhbmQKIyBjb3JyZWxhdGUgaXQgd2l0aCBvdGhlciBhbm5vdGF0aW9ucyBhbmQgcHJvY2VzcyBmaWVsZHMuCmFsbG93X2J5X2Fubm8ocF9vY2ksIGlfb2NpLCBwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzKSB7CiAgICBwcmludCgiYWxsb3dfYnlfYW5ubyAxOiBzdGFydCIpCgogICAgc19uYW1lIDo9ICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LW5hbWUiCgogICAgbm90IHBfb2NpLkFubm90YXRpb25zW3NfbmFtZV0KCiAgICBpX3NfbmFtZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tzX25hbWVdCiAgICBwcmludCgiYWxsb3dfYnlfYW5ubyAxOiBpX3NfbmFtZSA9IiwgaV9zX25hbWUpCgogICAgYWxsb3dfYnlfc2FuZGJveF9uYW1lKHBfb2NpLCBpX29jaSwgcF9zdG9yYWdlcywgaV9zdG9yYWdlcywgaV9zX25hbWUpCgogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMTogdHJ1ZSIpCn0KYWxsb3dfYnlfYW5ubyhwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpIHsKICAgIHByaW50KCJhbGxvd19ieV9hbm5vIDI6IHN0YXJ0IikKCiAgICBzX25hbWUgOj0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZSIKCiAgICBwX3NfbmFtZSA6PSBwX29jaS5Bbm5vdGF0aW9uc1tzX25hbWVdCiAgICBpX3NfbmFtZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tzX25hbWVdCiAgICBwcmludCgiYWxsb3dfYnlfYW5ubyAyOiBpX3NfbmFtZSA9IiwgaV9zX25hbWUsICJwX3NfbmFtZSA9IiwgcF9zX25hbWUpCgogICAgYWxsb3dfc2FuZGJveF9uYW1lKHBfc19uYW1lLCBpX3NfbmFtZSkKICAgIGFsbG93X2J5X3NhbmRib3hfbmFtZShwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMsIGlfc19uYW1lKQoKICAgIHByaW50KCJhbGxvd19ieV9hbm5vIDI6IHRydWUiKQp9CgphbGxvd19ieV9zYW5kYm94X25hbWUocF9vY2ksIGlfb2NpLCBwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBzX25hbWUpIHsKICAgIHByaW50KCJhbGxvd19ieV9zYW5kYm94X25hbWU6IHN0YXJ0IikKCiAgICBzX25hbWVzcGFjZSA6PSAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1uYW1lc3BhY2UiCgogICAgcF9uYW1lc3BhY2UgOj0gcF9vY2kuQW5ub3RhdGlvbnNbc19uYW1lc3BhY2VdCiAgICBpX25hbWVzcGFjZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tzX25hbWVzcGFjZV0KICAgIHByaW50KCJhbGxvd19ieV9zYW5kYm94X25hbWU6IHBfbmFtZXNwYWNlID0iLCBwX25hbWVzcGFjZSwgImlfbmFtZXNwYWNlID0iLCBpX25hbWVzcGFjZSkKICAgIHBfbmFtZXNwYWNlID09IGlfbmFtZXNwYWNlCgogICAgYWxsb3dfYnlfY29udGFpbmVyX3R5cGVzKHBfb2NpLCBpX29jaSwgc19uYW1lLCBwX25hbWVzcGFjZSkKICAgIGFsbG93X2J5X2J1bmRsZV9vcl9zYW5kYm94X2lkKHBfb2NpLCBpX29jaSwgcF9zdG9yYWdlcywgaV9zdG9yYWdlcykKICAgIGFsbG93X3Byb2Nlc3MocF9vY2ksIGlfb2NpLCBzX25hbWUpCgogICAgcHJpbnQoImFsbG93X2J5X3NhbmRib3hfbmFtZTogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfbmFtZShwX3NfbmFtZSwgaV9zX25hbWUpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X25hbWUgMTogc3RhcnQiKQoKICAgIHBfc19uYW1lID09IGlfc19uYW1lCgogICAgcHJpbnQoImFsbG93X3NhbmRib3hfbmFtZSAxOiB0cnVlIikKfQphbGxvd19zYW5kYm94X25hbWUocF9zX25hbWUsIGlfc19uYW1lKSB7CiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9uYW1lIDI6IHN0YXJ0IikKCiAgICAjIFRPRE86IHNob3VsZCBnZW5lcmF0ZWQgbmFtZXMgYmUgaGFuZGxlZCBkaWZmZXJlbnRseT8KICAgIGNvbnRhaW5zKHBfc19uYW1lLCAiJChnZW5lcmF0ZWQtbmFtZSkiKQoKICAgIHByaW50KCJhbGxvd19zYW5kYm94X25hbWUgMjogdHJ1ZSIpCn0KCiMgQ2hlY2sgdGhhdCB0aGUgImlvLmt1YmVybmV0ZXMuY3JpLmNvbnRhaW5lci10eXBlIiBhbmQKIyAiaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5jb250YWluZXJfdHlwZSIgYW5ub3RhdGlvbnMgZGVzaWduYXRlIHRoZQojIGV4cGVjdGVkIHR5cGUgLSBlaXRoZXIgYSAic2FuZGJveCIgb3IgYSAiY29udGFpbmVyIi4gVGhlbiwgdmFsaWRhdGUKIyBvdGhlciBhbm5vdGF0aW9ucyBiYXNlZCBvbiB0aGUgYWN0dWFsICJzYW5kYm94IiBvciAiY29udGFpbmVyIiB2YWx1ZQojIGZyb20gdGhlIGlucHV0IGNvbnRhaW5lci4KYWxsb3dfYnlfY29udGFpbmVyX3R5cGVzKHBfb2NpLCBpX29jaSwgc19uYW1lLCBzX25hbWVzcGFjZSkgewogICAgcHJpbnQoImFsbG93X2J5X2NvbnRhaW5lcl90eXBlczogY2hlY2tpbmcgaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLXR5cGUiKQoKICAgIGNfdHlwZSA6PSAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLXR5cGUiCiAgICAKICAgIHBfY3JpX3R5cGUgOj0gcF9vY2kuQW5ub3RhdGlvbnNbY190eXBlXQogICAgaV9jcmlfdHlwZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tjX3R5cGVdCiAgICBwcmludCgiYWxsb3dfYnlfY29udGFpbmVyX3R5cGVzOiBwX2NyaV90eXBlID0iLCBwX2NyaV90eXBlLCAiaV9jcmlfdHlwZSA9IiwgaV9jcmlfdHlwZSkKICAgIHBfY3JpX3R5cGUgPT0gaV9jcmlfdHlwZQoKICAgIGFsbG93X2J5X2NvbnRhaW5lcl90eXBlKGlfY3JpX3R5cGUsIHBfb2NpLCBpX29jaSwgc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfYnlfY29udGFpbmVyX3R5cGVzOiB0cnVlIikKfQoKYWxsb3dfYnlfY29udGFpbmVyX3R5cGUoaV9jcmlfdHlwZSwgcF9vY2ksIGlfb2NpLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfYnlfY29udGFpbmVyX3R5cGUgMTogaV9jcmlfdHlwZSA9IiwgaV9jcmlfdHlwZSkKICAgIGlfY3JpX3R5cGUgPT0gInNhbmRib3giCgogICAgaV9rYXRhX3R5cGUgOj0gaV9vY2kuQW5ub3RhdGlvbnNbImlvLmthdGFjb250YWluZXJzLnBrZy5vY2kuY29udGFpbmVyX3R5cGUiXQogICAgcHJpbnQoImFsbG93X2J5X2NvbnRhaW5lcl90eXBlIDE6IGlfa2F0YV90eXBlID0iLCBpX2thdGFfdHlwZSkKICAgIGlfa2F0YV90eXBlID09ICJwb2Rfc2FuZGJveCIKCiAgICBhbGxvd19zYW5kYm94X2NvbnRhaW5lcl9uYW1lKHBfb2NpLCBpX29jaSkKICAgIGFsbG93X3NhbmRib3hfbmV0X25hbWVzcGFjZShwX29jaSwgaV9vY2kpCiAgICBhbGxvd19zYW5kYm94X2xvZ19kaXJlY3RvcnkocF9vY2ksIGlfb2NpLCBzX25hbWUsIHNfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAxOiB0cnVlIikKfQoKYWxsb3dfYnlfY29udGFpbmVyX3R5cGUoaV9jcmlfdHlwZSwgcF9vY2ksIGlfb2NpLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfYnlfY29udGFpbmVyX3R5cGUgMjogaV9jcmlfdHlwZSA9IiwgaV9jcmlfdHlwZSkKICAgIGlfY3JpX3R5cGUgPT0gImNvbnRhaW5lciIKCiAgICBpX2thdGFfdHlwZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1siaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5jb250YWluZXJfdHlwZSJdCiAgICBwcmludCgiYWxsb3dfYnlfY29udGFpbmVyX3R5cGUgMjogaV9rYXRhX3R5cGUgPSIsIGlfa2F0YV90eXBlKQogICAgaV9rYXRhX3R5cGUgPT0gInBvZF9jb250YWluZXIiCgogICAgYWxsb3dfY29udGFpbmVyX25hbWUocF9vY2ksIGlfb2NpKQogICAgYWxsb3dfbmV0X25hbWVzcGFjZShwX29jaSwgaV9vY2kpCiAgICBhbGxvd19sb2dfZGlyZWN0b3J5KHBfb2NpLCBpX29jaSkKCiAgICBwcmludCgiYWxsb3dfYnlfY29udGFpbmVyX3R5cGUgMjogdHJ1ZSIpCn0KCiMgImlvLmt1YmVybmV0ZXMuY3JpLmNvbnRhaW5lci1uYW1lIiBhbm5vdGF0aW9uCmFsbG93X3NhbmRib3hfY29udGFpbmVyX25hbWUocF9vY2ksIGlfb2NpKSB7CiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9jb250YWluZXJfbmFtZTogc3RhcnQiKQoKICAgIGNvbnRhaW5lcl9hbm5vdGF0aW9uX21pc3NpbmcocF9vY2ksIGlfb2NpLCAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLW5hbWUiKQoKICAgIHByaW50KCJhbGxvd19zYW5kYm94X2NvbnRhaW5lcl9uYW1lOiB0cnVlIikKfQoKYWxsb3dfY29udGFpbmVyX25hbWUocF9vY2ksIGlfb2NpKSB7CiAgICBwcmludCgiYWxsb3dfY29udGFpbmVyX25hbWU6IHN0YXJ0IikKCiAgICBhbGxvd19jb250YWluZXJfYW5ub3RhdGlvbihwX29jaSwgaV9vY2ksICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItbmFtZSIpCgogICAgcHJpbnQoImFsbG93X2NvbnRhaW5lcl9uYW1lOiB0cnVlIikKfQoKY29udGFpbmVyX2Fubm90YXRpb25fbWlzc2luZyhwX29jaSwgaV9vY2ksIGtleSkgewogICAgcHJpbnQoImNvbnRhaW5lcl9hbm5vdGF0aW9uX21pc3Npbmc6Iiwga2V5KQoKICAgIG5vdCBwX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICBub3QgaV9vY2kuQW5ub3RhdGlvbnNba2V5XQoKICAgIHByaW50KCJjb250YWluZXJfYW5ub3RhdGlvbl9taXNzaW5nOiB0cnVlIikKfQoKYWxsb3dfY29udGFpbmVyX2Fubm90YXRpb24ocF9vY2ksIGlfb2NpLCBrZXkpIHsKICAgIHByaW50KCJhbGxvd19jb250YWluZXJfYW5ub3RhdGlvbjoga2V5ID0iLCBrZXkpCgogICAgcF92YWx1ZSA6PSBwX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICBpX3ZhbHVlIDo9IGlfb2NpLkFubm90YXRpb25zW2tleV0KICAgIHByaW50KCJhbGxvd19jb250YWluZXJfYW5ub3RhdGlvbjogcF92YWx1ZSA9IiwgcF92YWx1ZSwgImlfdmFsdWUgPSIsIGlfdmFsdWUpCgogICAgcF92YWx1ZSA9PSBpX3ZhbHVlCgogICAgcHJpbnQoImFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uOiB0cnVlIikKfQoKIyAibmVyZGN0bC9uZXR3b3JrLW5hbWVzcGFjZSIgYW5ub3RhdGlvbgphbGxvd19zYW5kYm94X25ldF9uYW1lc3BhY2UocF9vY2ksIGlfb2NpKSB7CiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9uZXRfbmFtZXNwYWNlOiBzdGFydCIpCgogICAga2V5IDo9ICJuZXJkY3RsL25ldHdvcmstbmFtZXNwYWNlIgoKICAgIHBfbmFtZXNwYWNlIDo9IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIGlfbmFtZXNwYWNlIDo9IGlfb2NpLkFubm90YXRpb25zW2tleV0KICAgIHByaW50KCJhbGxvd19zYW5kYm94X25ldF9uYW1lc3BhY2U6IHBfbmFtZXNwYWNlID0iLCBwX25hbWVzcGFjZSwgImlfbmFtZXNwYWNlID0iLCBpX25hbWVzcGFjZSkKCiAgICByZWdleC5tYXRjaChwX25hbWVzcGFjZSwgaV9uYW1lc3BhY2UpCgogICAgcHJpbnQoImFsbG93X3NhbmRib3hfbmV0X25hbWVzcGFjZTogdHJ1ZSIpCn0KCmFsbG93X25ldF9uYW1lc3BhY2UocF9vY2ksIGlfb2NpKSB7CiAgICBwcmludCgiYWxsb3dfbmV0X25hbWVzcGFjZTogc3RhcnQiKQoKICAgIGtleSA6PSAibmVyZGN0bC9uZXR3b3JrLW5hbWVzcGFjZSIKCiAgICBub3QgcF9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgbm90IGlfb2NpLkFubm90YXRpb25zW2tleV0KCiAgICBwcmludCgiYWxsb3dfbmV0X25hbWVzcGFjZTogdHJ1ZSIpCn0KCiMgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbG9nLWRpcmVjdG9yeSIgYW5ub3RhdGlvbgphbGxvd19zYW5kYm94X2xvZ19kaXJlY3RvcnkocF9vY2ksIGlfb2NpLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiBzdGFydCIpCgogICAga2V5IDo9ICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWxvZy1kaXJlY3RvcnkiCgogICAgcF9kaXIgOj0gcF9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgcmVnZXgxIDo9IHJlcGxhY2UocF9kaXIsICIkKHNhbmRib3gtbmFtZSkiLCBzX25hbWUpCiAgICByZWdleDIgOj0gcmVwbGFjZShyZWdleDEsICIkKHNhbmRib3gtbmFtZXNwYWNlKSIsIHNfbmFtZXNwYWNlKQogICAgcHJpbnQoImFsbG93X3NhbmRib3hfbG9nX2RpcmVjdG9yeTogcmVnZXgyID0iLCByZWdleDIpCgogICAgaV9kaXIgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgcHJpbnQoImFsbG93X3NhbmRib3hfbG9nX2RpcmVjdG9yeTogaV9kaXIgPSIsIGlfZGlyKQoKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4MiwgaV9kaXIpCgogICAgcHJpbnQoImFsbG93X3NhbmRib3hfbG9nX2RpcmVjdG9yeTogdHJ1ZSIpCn0KCmFsbG93X2xvZ19kaXJlY3RvcnkocF9vY2ksIGlfb2NpKSB7CiAgICBwcmludCgiYWxsb3dfbG9nX2RpcmVjdG9yeTogc3RhcnQiKQoKICAgIGtleSA6PSAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1sb2ctZGlyZWN0b3J5IgoKICAgIG5vdCBwX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICBub3QgaV9vY2kuQW5ub3RhdGlvbnNba2V5XQoKICAgIHByaW50KCJhbGxvd19sb2dfZGlyZWN0b3J5OiB0cnVlIikKfQoKYWxsb3dfbGludXgocF9vY2ksIGlfb2NpKSB7CiAgICBwX25hbWVzcGFjZXMgOj0gcF9vY2kuTGludXguTmFtZXNwYWNlcwogICAgcHJpbnQoImFsbG93X2xpbnV4OiBwIG5hbWVzcGFjZXMgPSIsIHBfbmFtZXNwYWNlcykKCiAgICBpX25hbWVzcGFjZXMgOj0gaV9vY2kuTGludXguTmFtZXNwYWNlcwogICAgcHJpbnQoImFsbG93X2xpbnV4OiBpIG5hbWVzcGFjZXMgPSIsIGlfbmFtZXNwYWNlcykKCiAgICBwX25hbWVzcGFjZXMgPT0gaV9uYW1lc3BhY2VzCgogICAgYWxsb3dfbWFza2VkX3BhdGhzKHBfb2NpLCBpX29jaSkKICAgIGFsbG93X3JlYWRvbmx5X3BhdGhzKHBfb2NpLCBpX29jaSkKCiAgICBwcmludCgiYWxsb3dfbGludXg6IHRydWUiKQp9CgphbGxvd19tYXNrZWRfcGF0aHMocF9vY2ksIGlfb2NpKSB7CiAgICBwX3BhdGhzIDo9IHBfb2NpLkxpbnV4Lk1hc2tlZFBhdGhzCiAgICBwcmludCgiYWxsb3dfbWFza2VkX3BhdGhzIDE6IHBfcGF0aHMgPSIsIHBfcGF0aHMpCgogICAgaV9wYXRocyA6PSBpX29jaS5MaW51eC5NYXNrZWRQYXRocwogICAgcHJpbnQoImFsbG93X21hc2tlZF9wYXRocyAxOiBpX3BhdGhzID0iLCBpX3BhdGhzKQoKICAgIGFsbG93X21hc2tlZF9wYXRoc19hcnJheShwX3BhdGhzLCBpX3BhdGhzKQoKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aHMgMTogdHJ1ZSIpCn0KYWxsb3dfbWFza2VkX3BhdGhzKHBfb2NpLCBpX29jaSkgewogICAgcHJpbnQoImFsbG93X21hc2tlZF9wYXRocyAyOiBzdGFydCIpCgogICAgbm90IHBfb2NpLkxpbnV4Lk1hc2tlZFBhdGhzCiAgICBub3QgaV9vY2kuTGludXguTWFza2VkUGF0aHMKCiAgICBwcmludCgiYWxsb3dfbWFza2VkX3BhdGhzIDI6IHRydWUiKQp9CgojIEFsbCB0aGUgcG9saWN5IG1hc2tlZCBwYXRocyBtdXN0IGJlIG1hc2tlZCBpbiB0aGUgaW5wdXQgZGF0YSB0b28uCiMgSW5wdXQgaXMgYWxsb3dlZCB0byBoYXZlIG1vcmUgbWFza2VkIHBhdGhzIHRoYW4gdGhlIHBvbGljeS4KYWxsb3dfbWFza2VkX3BhdGhzX2FycmF5KHBfYXJyYXksIGlfYXJyYXkpIHsKICAgIGV2ZXJ5IHBfZWxlbSBpbiBwX2FycmF5IHsKICAgICAgICBhbGxvd19tYXNrZWRfcGF0aChwX2VsZW0sIGlfYXJyYXkpCiAgICB9Cn0KCmFsbG93X21hc2tlZF9wYXRoKHBfZWxlbSwgaV9hcnJheSkgewogICAgcHJpbnQoImFsbG93X21hc2tlZF9wYXRoOiBwX2VsZW0gPSIsIHBfZWxlbSkKCiAgICBzb21lIGlfZWxlbSBpbiBpX2FycmF5CiAgICBwX2VsZW0gPT0gaV9lbGVtCgogICAgcHJpbnQoImFsbG93X21hc2tlZF9wYXRoOiB0cnVlIikKfQoKYWxsb3dfcmVhZG9ubHlfcGF0aHMocF9vY2ksIGlfb2NpKSB7CiAgICBwX3BhdGhzIDo9IHBfb2NpLkxpbnV4LlJlYWRvbmx5UGF0aHMKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAxOiBwX3BhdGhzID0iLCBwX3BhdGhzKQoKICAgIGlfcGF0aHMgOj0gaV9vY2kuTGludXguUmVhZG9ubHlQYXRocwogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGhzIDE6IGlfcGF0aHMgPSIsIGlfcGF0aHMpCgogICAgYWxsb3dfcmVhZG9ubHlfcGF0aHNfYXJyYXkocF9wYXRocywgaV9wYXRocywgaV9vY2kuTGludXguTWFza2VkUGF0aHMpCgogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGhzIDE6IHRydWUiKQp9CmFsbG93X3JlYWRvbmx5X3BhdGhzKHBfb2NpLCBpX29jaSkgewogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGhzIDI6IHN0YXJ0IikKCiAgICBub3QgcF9vY2kuTGludXguUmVhZG9ubHlQYXRocwogICAgbm90IGlfb2NpLkxpbnV4LlJlYWRvbmx5UGF0aHMKCiAgICBwcmludCgiYWxsb3dfcmVhZG9ubHlfcGF0aHMgMjogdHJ1ZSIpCn0KCiMgQWxsIHRoZSBwb2xpY3kgcmVhZG9ubHkgcGF0aHMgbXVzdCBiZSBlaXRoZXI6CiMgLSBQcmVzZW50IGluIHRoZSBpbnB1dCByZWFkb25seSBwYXRocywgb3IKIyAtIFByZXNlbnQgaW4gdGhlIGlucHV0IG1hc2tlZCBwYXRocy4KIyBJbnB1dCBpcyBhbGxvd2VkIHRvIGhhdmUgbW9yZSByZWFkb25seSBwYXRocyB0aGFuIHRoZSBwb2xpY3kuCmFsbG93X3JlYWRvbmx5X3BhdGhzX2FycmF5KHBfYXJyYXksIGlfYXJyYXksIG1hc2tlZF9wYXRocykgewogICAgZXZlcnkgcF9lbGVtIGluIHBfYXJyYXkgewogICAgICAgIGFsbG93X3JlYWRvbmx5X3BhdGgocF9lbGVtLCBpX2FycmF5LCBtYXNrZWRfcGF0aHMpCiAgICB9Cn0KCmFsbG93X3JlYWRvbmx5X3BhdGgocF9lbGVtLCBpX2FycmF5LCBtYXNrZWRfcGF0aHMpIHsKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRoIDE6IHBfZWxlbSA9IiwgcF9lbGVtKQoKICAgIHNvbWUgaV9lbGVtIGluIGlfYXJyYXkKICAgIHBfZWxlbSA9PSBpX2VsZW0KCiAgICBwcmludCgiYWxsb3dfcmVhZG9ubHlfcGF0aCAxOiB0cnVlIikKfQphbGxvd19yZWFkb25seV9wYXRoKHBfZWxlbSwgaV9hcnJheSwgbWFza2VkX3BhdGhzKSB7CiAgICBwcmludCgiYWxsb3dfcmVhZG9ubHlfcGF0aCAyOiBwX2VsZW0gPSIsIHBfZWxlbSkKCiAgICBzb21lIGlfbWFza2VkIGluIG1hc2tlZF9wYXRocwogICAgcF9lbGVtID09IGlfbWFza2VkCgogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGggMjogdHJ1ZSIpCn0KCiMgQ2hlY2sgdGhlIGNvbnNpc3RlbmN5IG9mIHRoZSBpbnB1dCAiaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5idW5kbGVfcGF0aCIKIyBhbmQgaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCIgdmFsdWVzIHdpdGggb3RoZXIgZmllbGRzLgphbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZChwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpIHsKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogc3RhcnQiKQoKICAgIGJ1bmRsZV9wYXRoIDo9IGlfb2NpLkFubm90YXRpb25zWyJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmJ1bmRsZV9wYXRoIl0KICAgIGJ1bmRsZV9pZCA6PSByZXBsYWNlKGJ1bmRsZV9wYXRoLCAiL3J1bi9jb250YWluZXJkL2lvLmNvbnRhaW5lcmQucnVudGltZS52Mi50YXNrL2s4cy5pby8iLCAiIikKCiAgICBrZXkgOj0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtaWQiCgogICAgcF9yZWdleCA6PSBwX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICBzYW5kYm94X2lkIDo9IGlfb2NpLkFubm90YXRpb25zW2tleV0KCiAgICBwcmludCgiYWxsb3dfYnlfYnVuZGxlX29yX3NhbmRib3hfaWQ6IHNhbmRib3hfaWQgPSIsIHNhbmRib3hfaWQsICJyZWdleCA9IiwgcF9yZWdleCkKICAgIHJlZ2V4Lm1hdGNoKHBfcmVnZXgsIHNhbmRib3hfaWQpCgogICAgYWxsb3dfcm9vdF9wYXRoKHBfb2NpLCBpX29jaSwgYnVuZGxlX2lkKQoKICAgIGV2ZXJ5IGlfbW91bnQgaW4gaW5wdXQuT0NJLk1vdW50cyB7CiAgICAgICAgYWxsb3dfbW91bnQocF9vY2ksIGlfbW91bnQsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkKICAgIH0KCiAgICBhbGxvd19zdG9yYWdlcyhwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpCgogICAgcHJpbnQoImFsbG93X2J5X2J1bmRsZV9vcl9zYW5kYm94X2lkOiB0cnVlIikKfQoKYWxsb3dfcHJvY2VzcyhwX29jaSwgaV9vY2ksIHNfbmFtZSkgewogICAgcF9wcm9jZXNzIDo9IHBfb2NpLlByb2Nlc3MKICAgIGlfcHJvY2VzcyA6PSBpX29jaS5Qcm9jZXNzCgogICAgcHJpbnQoImFsbG93X3Byb2Nlc3M6IGkgdGVybWluYWwgPSIsIGlfcHJvY2Vzcy5UZXJtaW5hbCwgInAgdGVybWluYWwgPSIsIHBfcHJvY2Vzcy5UZXJtaW5hbCkKICAgIHBfcHJvY2Vzcy5UZXJtaW5hbCA9PSBpX3Byb2Nlc3MuVGVybWluYWwKCiAgICBwcmludCgiYWxsb3dfcHJvY2VzczogaSBjd2QgPSIsIGlfcHJvY2Vzcy5Dd2QsICJpIGN3ZCA9IiwgcF9wcm9jZXNzLkN3ZCkKICAgIHBfcHJvY2Vzcy5Dd2QgPT0gaV9wcm9jZXNzLkN3ZAoKICAgIHByaW50KCJhbGxvd19wcm9jZXNzOiBpIG5vTmV3UHJpdmlsZWdlcyA9IiwgaV9wcm9jZXNzLk5vTmV3UHJpdmlsZWdlcywgInAgbm9OZXdQcml2aWxlZ2VzID0iLCBwX3Byb2Nlc3MuTm9OZXdQcml2aWxlZ2VzKQogICAgcF9wcm9jZXNzLk5vTmV3UHJpdmlsZWdlcyA9PSBpX3Byb2Nlc3MuTm9OZXdQcml2aWxlZ2VzCgogICAgYWxsb3dfY2FwcyhwX3Byb2Nlc3MuQ2FwYWJpbGl0aWVzLCBpX3Byb2Nlc3MuQ2FwYWJpbGl0aWVzKQogICAgYWxsb3dfdXNlcihwX3Byb2Nlc3MsIGlfcHJvY2VzcykKICAgIGFsbG93X2FyZ3MocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSkKICAgIGFsbG93X2VudihwX3Byb2Nlc3MsIGlfcHJvY2Vzcywgc19uYW1lKQoKICAgIHByaW50KCJhbGxvd19wcm9jZXNzOiB0cnVlIikKfQoKYWxsb3dfdXNlcihwX3Byb2Nlc3MsIGlfcHJvY2VzcykgewogICAgcF91c2VyIDo9IHBfcHJvY2Vzcy5Vc2VyCiAgICBpX3VzZXIgOj0gaV9wcm9jZXNzLlVzZXIKCiAgICBwcmludCgiYWxsb3dfdXNlcjogaW5wdXQgdWlkID0iLCBpX3VzZXIuVUlELCAicG9saWN5IHVpZCA9IiwgcF91c2VyLlVJRCkKICAgIHBfdXNlci5VSUQgPT0gaV91c2VyLlVJRAoKICAgICMgVE9ETzogdHJhY2sgZG93biB0aGUgcmVhc29uIGZvciByZWdpc3RyeS5rOHMuaW8vcGF1c2U6My45IGJlaW5nCiAgICAjICAgICAgIGV4ZWN1dGVkIHdpdGggZ2lkID0gMCBkZXNwaXRlIGhhdmluZyAiNjU1MzU6NjU1MzUiIGluIGl0cyBjb250YWluZXIgaW1hZ2UKICAgICMgICAgICAgY29uZmlnLgogICAgI3ByaW50KCJhbGxvd191c2VyOiBpbnB1dCBnaWQgPSIsIGlfdXNlci5HSUQsICJwb2xpY3kgZ2lkID0iLCBwX3VzZXIuR0lEKQogICAgI3BfdXNlci5HSUQgPT0gaV91c2VyLkdJRAoKICAgICMgVE9ETzogY29tcGFyZSB0aGUgYWRkaXRpb25hbEdpZHMgZmllbGQgdG9vIGFmdGVyIGNvbXB1dGluZyBpdHMgdmFsdWUKICAgICMgYmFzZWQgb24gL2V0Yy9wYXNzd2QgYW5kIC9ldGMvZ3JvdXAgZnJvbSB0aGUgY29udGFpbmVyIGltYWdlLgp9CgphbGxvd19hcmdzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHByaW50KCJhbGxvd19hcmdzIDE6IG5vIGFyZ3MiKQoKICAgIG5vdCBwX3Byb2Nlc3MuQXJncwogICAgbm90IGlfcHJvY2Vzcy5BcmdzCgogICAgcHJpbnQoImFsbG93X2FyZ3MgMTogdHJ1ZSIpCn0KYWxsb3dfYXJncyhwX3Byb2Nlc3MsIGlfcHJvY2Vzcywgc19uYW1lKSB7CiAgICBwcmludCgiYWxsb3dfYXJncyAyOiBwb2xpY3kgYXJncyA9IiwgcF9wcm9jZXNzLkFyZ3MpCiAgICBwcmludCgiYWxsb3dfYXJncyAyOiBpbnB1dCBhcmdzID0iLCBpX3Byb2Nlc3MuQXJncykKCiAgICBjb3VudChwX3Byb2Nlc3MuQXJncykgPT0gY291bnQoaV9wcm9jZXNzLkFyZ3MpCgogICAgZXZlcnkgaSwgaV9hcmcgaW4gaV9wcm9jZXNzLkFyZ3MgewogICAgICAgIGFsbG93X2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpCiAgICB9CgogICAgcHJpbnQoImFsbG93X2FyZ3MgMjogdHJ1ZSIpCn0KYWxsb3dfYXJnKGksIGlfYXJnLCBwX3Byb2Nlc3MsIHNfbmFtZSkgewogICAgcF9hcmcgOj0gcF9wcm9jZXNzLkFyZ3NbaV0KICAgIHByaW50KCJhbGxvd19hcmcgMTogaSA9IiwgaSwgImlfYXJnID0iLCBpX2FyZywgInBfYXJnID0iLCBwX2FyZykKCiAgICBwX2FyZzIgOj0gcmVwbGFjZShwX2FyZywgIiQkIiwgIiQiKQogICAgcF9hcmcyID09IGlfYXJnCgogICAgcHJpbnQoImFsbG93X2FyZyAxOiB0cnVlIikKfQphbGxvd19hcmcoaSwgaV9hcmcsIHBfcHJvY2Vzcywgc19uYW1lKSB7CiAgICBwX2FyZyA6PSBwX3Byb2Nlc3MuQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2FyZyAyOiBpID0iLCBpLCAiaV9hcmcgPSIsIGlfYXJnLCAicF9hcmcgPSIsIHBfYXJnKQoKICAgICMgVE9ETzogY2FuICQobm9kZS1uYW1lKSBiZSBoYW5kbGVkIGJldHRlcj8KICAgIGNvbnRhaW5zKHBfYXJnLCAiJChub2RlLW5hbWUpIikKCiAgICBwcmludCgiYWxsb3dfYXJnIDI6IHRydWUiKQp9CmFsbG93X2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5BcmdzW2ldCiAgICBwcmludCgiYWxsb3dfYXJnIDM6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgcF9hcmcyIDo9IHJlcGxhY2UocF9hcmcsICIkJCIsICIkIikKICAgIHBfYXJnMyA6PSByZXBsYWNlKHBfYXJnMiwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHByaW50KCJhbGxvd19hcmcgMzogcF9hcmczID0iLCBwX2FyZzMpCiAgICBwX2FyZzMgPT0gaV9hcmcKCiAgICBwcmludCgiYWxsb3dfYXJnIDM6IHRydWUiKQp9CgojIE9DSSBwcm9jZXNzLkVudiBmaWVsZAphbGxvd19lbnYocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSkgewogICAgcHJpbnQoImFsbG93X2VudjogcCBlbnYgPSIsIHBfcHJvY2Vzcy5FbnYpCiAgICBwcmludCgiYWxsb3dfZW52OiBpIGVudiA9IiwgaV9wcm9jZXNzLkVudikKCiAgICBldmVyeSBpX3ZhciBpbiBpX3Byb2Nlc3MuRW52IHsKICAgICAgICBwcmludCgiYWxsb3dfZW52OiBpX3ZhciA9IiwgaV92YXIpCiAgICAgICAgYWxsb3dfdmFyKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBpX3Zhciwgc19uYW1lKQogICAgfQoKICAgIHByaW50KCJhbGxvd19lbnY6IHRydWUiKQp9CgojIEFsbG93IGlucHV0IGVudiB2YXJpYWJsZXMgdGhhdCBhcmUgcHJlc2VudCBpbiB0aGUgcG9saWN5IGRhdGEgdG9vLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUpIHsKICAgIHNvbWUgcF92YXIgaW4gcF9wcm9jZXNzLkVudgogICAgcF92YXIgPT0gaV92YXIKICAgIHByaW50KCJhbGxvd192YXIgMTogdHJ1ZSIpCn0KCiMgTWF0Y2ggaW5wdXQgd2l0aCBvbmUgb2YgdGhlIHBvbGljeSB2YXJpYWJsZXMsIGFmdGVyIHN1YnN0aXR1dGluZyAkKHNhbmRib3gtbmFtZSkuCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSkgewogICAgc29tZSBwX3ZhciBpbiBwX3Byb2Nlc3MuRW52CiAgICBwX3ZhcjIgOj0gcmVwbGFjZShwX3ZhciwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKCiAgICBwcmludCgiYWxsb3dfdmFyIDI6IHBfdmFyMiA9IiwgcF92YXIyKQogICAgcF92YXIyID09IGlfdmFyCgogICAgcHJpbnQoImFsbG93X3ZhciAyOiB0cnVlIikKfQoKIyBBbGxvdyBpbnB1dCBlbnYgdmFyaWFibGVzIHRoYXQgbWF0Y2ggd2l0aCBhIHJlcXVlc3RfZGVmYXVsdHMgcmVnZXguCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSkgewogICAgc29tZSBwX3JlZ2V4MSBpbiBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLkNyZWF0ZUNvbnRhaW5lclJlcXVlc3QuYWxsb3dfZW52X3JlZ2V4CiAgICBwX3JlZ2V4MiA6PSByZXBsYWNlKHBfcmVnZXgxLCAiJChpcHY0X2EpIiwgcG9saWN5X2RhdGEuY29tbW9uLmlwdjRfYSkKICAgIHBfcmVnZXgzIDo9IHJlcGxhY2UocF9yZWdleDIsICIkKGlwX3ApIiwgcG9saWN5X2RhdGEuY29tbW9uLmlwX3ApCiAgICBwX3JlZ2V4NCA6PSByZXBsYWNlKHBfcmVnZXgzLCAiJChzdmNfbmFtZSkiLCBwb2xpY3lfZGF0YS5jb21tb24uc3ZjX25hbWUpCiAgICBwX3JlZ2V4NSA6PSByZXBsYWNlKHBfcmVnZXg0LCAiJChkbnNfbGFiZWwpIiwgcG9saWN5X2RhdGEuY29tbW9uLmRuc19sYWJlbCkKCiAgICBwcmludCgiYWxsb3dfdmFyIDM6IHBfcmVnZXg1ID0iLCBwX3JlZ2V4NSkKICAgIHJlZ2V4Lm1hdGNoKHBfcmVnZXg1LCBpX3ZhcikKCiAgICBwcmludCgiYWxsb3dfdmFyIDM6IHRydWUiKQp9CgojIEFsbG93IGZpZWxkUmVmICJmaWVsZFBhdGg6IHN0YXR1cy5wb2RJUCIgdmFsdWVzLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUpIHsKICAgIG5hbWVfdmFsdWUgOj0gc3BsaXQoaV92YXIsICI9IikKICAgIGNvdW50KG5hbWVfdmFsdWUpID09IDIKICAgIGlzX2lwKG5hbWVfdmFsdWVbMV0pCgogICAgc29tZSBwX3ZhciBpbiBwX3Byb2Nlc3MuRW52CiAgICBhbGxvd19wb2RfaXBfdmFyKG5hbWVfdmFsdWVbMF0sIHBfdmFyKQoKICAgIHByaW50KCJhbGxvd192YXIgNDogdHJ1ZSIpCn0KCiMgQWxsb3cgY29tbW9uIGZpZWxkUmVmIHZhcmlhYmxlcy4KYWxsb3dfdmFyKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBpX3Zhciwgc19uYW1lKSB7CiAgICBuYW1lX3ZhbHVlIDo9IHNwbGl0KGlfdmFyLCAiPSIpCiAgICBjb3VudChuYW1lX3ZhbHVlKSA9PSAyCgogICAgc29tZSBwX3ZhciBpbiBwX3Byb2Nlc3MuRW52CiAgICBwX25hbWVfdmFsdWUgOj0gc3BsaXQocF92YXIsICI9IikKICAgIGNvdW50KHBfbmFtZV92YWx1ZSkgPT0gMgoKICAgIHBfbmFtZV92YWx1ZVswXSA9PSBuYW1lX3ZhbHVlWzBdCgogICAgIyBUT0RPOiBzaG91bGQgdGhlc2UgYmUgaGFuZGxlZCBpbiBhIGRpZmZlcmVudCB3YXk/CiAgICBhbHdheXNfYWxsb3dlZCA6PSBbIiQoaG9zdC1uYW1lKSIsICIkKG5vZGUtbmFtZSkiLCAiJChwb2QtdWlkKSJdCiAgICBzb21lIGFsbG93ZWQgaW4gYWx3YXlzX2FsbG93ZWQKICAgIGNvbnRhaW5zKHBfbmFtZV92YWx1ZVsxXSwgYWxsb3dlZCkKCiAgICBwcmludCgiYWxsb3dfdmFyIDU6IHRydWUiKQp9CgojIEFsbG93IGZpZWxkUmVmICJmaWVsZFBhdGg6IHN0YXR1cy5ob3N0SVAiIHZhbHVlcy4KYWxsb3dfdmFyKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBpX3Zhciwgc19uYW1lKSB7CiAgICBuYW1lX3ZhbHVlIDo9IHNwbGl0KGlfdmFyLCAiPSIpCiAgICBjb3VudChuYW1lX3ZhbHVlKSA9PSAyCiAgICBpc19pcChuYW1lX3ZhbHVlWzFdKQoKICAgIHNvbWUgcF92YXIgaW4gcF9wcm9jZXNzLkVudgogICAgYWxsb3dfaG9zdF9pcF92YXIobmFtZV92YWx1ZVswXSwgcF92YXIpCgogICAgcHJpbnQoImFsbG93X3ZhciA2OiB0cnVlIikKfQoKIyBBbGxvdyByZXNvdXJjZUZpZWxkUmVmIHZhbHVlcyAoZS5nLiwgImxpbWl0cy5jcHUiKS4KYWxsb3dfdmFyKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBpX3Zhciwgc19uYW1lKSB7CiAgICBuYW1lX3ZhbHVlIDo9IHNwbGl0KGlfdmFyLCAiPSIpCiAgICBjb3VudChuYW1lX3ZhbHVlKSA9PSAyCgogICAgc29tZSBwX3ZhciBpbiBwX3Byb2Nlc3MuRW52CiAgICBwX25hbWVfdmFsdWUgOj0gc3BsaXQocF92YXIsICI9IikKICAgIGNvdW50KHBfbmFtZV92YWx1ZSkgPT0gMgoKICAgIHBfbmFtZV92YWx1ZVswXSA9PSBuYW1lX3ZhbHVlWzBdCgogICAgIyBUT0RPOiBzaG91bGQgdGhlc2UgYmUgaGFuZGxlZCBpbiBhIGRpZmZlcmVudCB3YXk/CiAgICBhbHdheXNfYWxsb3dlZCA9IFsiJChyZXNvdXJjZS1maWVsZCkiLCAiJCh0b2RvLWFubm90YXRpb24pIl0KICAgIHNvbWUgYWxsb3dlZCBpbiBhbHdheXNfYWxsb3dlZAogICAgY29udGFpbnMocF9uYW1lX3ZhbHVlWzFdLCBhbGxvd2VkKQoKICAgIHByaW50KCJhbGxvd192YXIgNzogdHJ1ZSIpCn0KCmFsbG93X3BvZF9pcF92YXIodmFyX25hbWUsIHBfdmFyKSB7CiAgICBwcmludCgiYWxsb3dfcG9kX2lwX3ZhcjogdmFyX25hbWUgPSIsIHZhcl9uYW1lLCAicF92YXIgPSIsIHBfdmFyKQoKICAgIHBfbmFtZV92YWx1ZSA6PSBzcGxpdChwX3ZhciwgIj0iKQogICAgY291bnQocF9uYW1lX3ZhbHVlKSA9PSAyCgogICAgcF9uYW1lX3ZhbHVlWzBdID09IHZhcl9uYW1lCiAgICBwX25hbWVfdmFsdWVbMV0gPT0gIiQocG9kLWlwKSIKCiAgICBwcmludCgiYWxsb3dfcG9kX2lwX3ZhcjogdHJ1ZSIpCn0KCmFsbG93X2hvc3RfaXBfdmFyKHZhcl9uYW1lLCBwX3ZhcikgewogICAgcHJpbnQoImFsbG93X2hvc3RfaXBfdmFyOiB2YXJfbmFtZSA9IiwgdmFyX25hbWUsICJwX3ZhciA9IiwgcF92YXIpCgogICAgcF9uYW1lX3ZhbHVlIDo9IHNwbGl0KHBfdmFyLCAiPSIpCiAgICBjb3VudChwX25hbWVfdmFsdWUpID09IDIKCiAgICBwX25hbWVfdmFsdWVbMF0gPT0gdmFyX25hbWUKICAgIHBfbmFtZV92YWx1ZVsxXSA9PSAiJChob3N0LWlwKSIKCiAgICBwcmludCgiYWxsb3dfaG9zdF9pcF92YXI6IHRydWUiKQp9Cgppc19pcCh2YWx1ZSkgewogICAgYnl0ZXMgPSBzcGxpdCh2YWx1ZSwgIi4iKQogICAgY291bnQoYnl0ZXMpID09IDQKCiAgICBpc19pcF9maXJzdF9ieXRlKGJ5dGVzWzBdKQogICAgaXNfaXBfb3RoZXJfYnl0ZShieXRlc1sxXSkKICAgIGlzX2lwX290aGVyX2J5dGUoYnl0ZXNbMl0pCiAgICBpc19pcF9vdGhlcl9ieXRlKGJ5dGVzWzNdKQp9CmlzX2lwX2ZpcnN0X2J5dGUoY29tcG9uZW50KSB7CiAgICBudW1iZXIgPSB0b19udW1iZXIoY29tcG9uZW50KQogICAgbnVtYmVyID49IDEKICAgIG51bWJlciA8PSAyNTUKfQppc19pcF9vdGhlcl9ieXRlKGNvbXBvbmVudCkgewogICAgbnVtYmVyID0gdG9fbnVtYmVyKGNvbXBvbmVudCkKICAgIG51bWJlciA+PSAwCiAgICBudW1iZXIgPD0gMjU1Cn0KCiMgT0NJIHJvb3QuUGF0aAphbGxvd19yb290X3BhdGgocF9vY2ksIGlfb2NpLCBidW5kbGVfaWQpIHsKICAgIGlfcGF0aCA6PSBpX29jaS5Sb290LlBhdGgKICAgIHBfcGF0aDEgOj0gcF9vY2kuUm9vdC5QYXRoCiAgICBwcmludCgiYWxsb3dfcm9vdF9wYXRoOiBpX3BhdGggPSIsIGlfcGF0aCwgInBfcGF0aDEgPSIsIHBfcGF0aDEpCgogICAgcF9wYXRoMiA6PSByZXBsYWNlKHBfcGF0aDEsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5jcGF0aCkKICAgIHByaW50KCJhbGxvd19yb290X3BhdGg6IHBfcGF0aDIgPSIsIHBfcGF0aDIpCgogICAgcF9wYXRoMyA6PSByZXBsYWNlKHBfcGF0aDIsICIkKGJ1bmRsZS1pZCkiLCBidW5kbGVfaWQpCiAgICBwcmludCgiYWxsb3dfcm9vdF9wYXRoOiBwX3BhdGgzID0iLCBwX3BhdGgzKQoKICAgIHBfcGF0aDMgPT0gaV9wYXRoCgogICAgcHJpbnQoImFsbG93X3Jvb3RfcGF0aDogdHJ1ZSIpCn0KCiMgZGV2aWNlIG1vdW50cwphbGxvd19tb3VudChwX29jaSwgaV9tb3VudCwgYnVuZGxlX2lkLCBzYW5kYm94X2lkKSB7CiAgICBwcmludCgiYWxsb3dfbW91bnQ6IGlfbW91bnQgPSIsIGlfbW91bnQpCgogICAgc29tZSBwX21vdW50IGluIHBfb2NpLk1vdW50cwogICAgcHJpbnQoImFsbG93X21vdW50OiBwX21vdW50ID0iLCBwX21vdW50KQogICAgY2hlY2tfbW91bnQocF9tb3VudCwgaV9tb3VudCwgYnVuZGxlX2lkLCBzYW5kYm94X2lkKQoKICAgICMgVE9ETzogYXJlIHRoZXJlIGFueSBvdGhlciByZXF1aXJlZCBwb2xpY3kgY2hlY2tzIGZvciBtb3VudHMgLSBlLmcuLAogICAgIyAgICAgICBtdWx0aXBsZSBtb3VudHMgd2l0aCBzYW1lIHNvdXJjZSBvciBkZXN0aW5hdGlvbj8KCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IHRydWUiKQp9CgpjaGVja19tb3VudChwX21vdW50LCBpX21vdW50LCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHBfbW91bnQgPT0gaV9tb3VudAogICAgcHJpbnQoImNoZWNrX21vdW50IDE6IHRydWUiKQp9CmNoZWNrX21vdW50KHBfbW91bnQsIGlfbW91bnQsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcF9tb3VudC5kZXN0aW5hdGlvbiA9PSBpX21vdW50LmRlc3RpbmF0aW9uCiAgICBwX21vdW50LnR5cGVfID09IGlfbW91bnQudHlwZV8KICAgIHBfbW91bnQub3B0aW9ucyA9PSBpX21vdW50Lm9wdGlvbnMKCiAgICBtb3VudF9zb3VyY2VfYWxsb3dzKHBfbW91bnQsIGlfbW91bnQsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkKCiAgICBwcmludCgiY2hlY2tfbW91bnQgMjogdHJ1ZSIpCn0KCm1vdW50X3NvdXJjZV9hbGxvd3MocF9tb3VudCwgaV9tb3VudCwgYnVuZGxlX2lkLCBzYW5kYm94X2lkKSB7CiAgICByZWdleDEgOj0gcF9tb3VudC5zb3VyY2UKICAgIHJlZ2V4MiA6PSByZXBsYWNlKHJlZ2V4MSwgIiQoc2ZwcmVmaXgpIiwgcG9saWN5X2RhdGEuY29tbW9uLnNmcHJlZml4KQogICAgcmVnZXgzIDo9IHJlcGxhY2UocmVnZXgyLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICByZWdleDQgOj0gcmVwbGFjZShyZWdleDMsICIkKGJ1bmRsZS1pZCkiLCBidW5kbGVfaWQpCgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMTogcmVnZXg0ID0iLCByZWdleDQpCiAgICByZWdleC5tYXRjaChyZWdleDQsIGlfbW91bnQuc291cmNlKQoKICAgIHByaW50KCJtb3VudF9zb3VyY2VfYWxsb3dzIDE6IHRydWUiKQp9Cm1vdW50X3NvdXJjZV9hbGxvd3MocF9tb3VudCwgaV9tb3VudCwgYnVuZGxlX2lkLCBzYW5kYm94X2lkKSB7CiAgICByZWdleDEgOj0gcF9tb3VudC5zb3VyY2UKICAgIHJlZ2V4MiA6PSByZXBsYWNlKHJlZ2V4MSwgIiQoc2ZwcmVmaXgpIiwgcG9saWN5X2RhdGEuY29tbW9uLnNmcHJlZml4KQogICAgcmVnZXgzIDo9IHJlcGxhY2UocmVnZXgyLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICByZWdleDQgOj0gcmVwbGFjZShyZWdleDMsICIkKHNhbmRib3gtaWQpIiwgc2FuZGJveF9pZCkKCiAgICBwcmludCgibW91bnRfc291cmNlX2FsbG93cyAyOiByZWdleDQgPSIsIHJlZ2V4NCkKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4NCwgaV9tb3VudC5zb3VyY2UpCgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMjogdHJ1ZSIpCn0KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBDcmVhdGUgY29udGFpbmVyIFN0b3JhZ2VzCgphbGxvd19zdG9yYWdlcyhwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHBfY291bnQgOj0gY291bnQocF9zdG9yYWdlcykKICAgIGlfY291bnQgOj0gY291bnQoaV9zdG9yYWdlcykKICAgIHByaW50KCJhbGxvd19zdG9yYWdlczogcF9jb3VudCA9IiwgcF9jb3VudCwgImlfY291bnQgPSIsIGlfY291bnQpCgogICAgcF9jb3VudCA9PSBpX2NvdW50CgogICAgIyBHZXQgdGhlIGNvbnRhaW5lciBpbWFnZSBsYXllciBJRHMgYW5kIHZlcml0eSByb290IGhhc2hlcywgZnJvbSB0aGUgIm92ZXJsYXlmcyIgc3RvcmFnZS4KICAgIHNvbWUgb3ZlcmxheV9zdG9yYWdlIGluIHBfc3RvcmFnZXMKICAgIG92ZXJsYXlfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIHByaW50KCJhbGxvd19zdG9yYWdlczogb3ZlcmxheV9zdG9yYWdlID0iLCBvdmVybGF5X3N0b3JhZ2UpCiAgICBjb3VudChvdmVybGF5X3N0b3JhZ2Uub3B0aW9ucykgPT0gMgoKICAgIGxheWVyX2lkcyA6PSBzcGxpdChvdmVybGF5X3N0b3JhZ2Uub3B0aW9uc1swXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiBsYXllcl9pZHMgPSIsIGxheWVyX2lkcykKCiAgICByb290X2hhc2hlcyA6PSBzcGxpdChvdmVybGF5X3N0b3JhZ2Uub3B0aW9uc1sxXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiByb290X2hhc2hlcyA9Iiwgcm9vdF9oYXNoZXMpCgogICAgZXZlcnkgaV9zdG9yYWdlIGluIGlfc3RvcmFnZXMgewogICAgICAgIGFsbG93X3N0b3JhZ2UocF9zdG9yYWdlcywgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpCiAgICB9CgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiB0cnVlIikKfQoKYWxsb3dfc3RvcmFnZShwX3N0b3JhZ2VzLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgc29tZSBwX3N0b3JhZ2UgaW4gcF9zdG9yYWdlcwoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiBwX3N0b3JhZ2UgPSIsIHBfc3RvcmFnZSkKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiBpX3N0b3JhZ2UgPSIsIGlfc3RvcmFnZSkKCiAgICBwX3N0b3JhZ2UuZHJpdmVyICAgICAgICAgICA9PSBpX3N0b3JhZ2UuZHJpdmVyCiAgICBwX3N0b3JhZ2UuZHJpdmVyX29wdGlvbnMgICA9PSBpX3N0b3JhZ2UuZHJpdmVyX29wdGlvbnMKICAgIHBfc3RvcmFnZS5mc19ncm91cCAgICAgICAgID09IGlfc3RvcmFnZS5mc19ncm91cAoKICAgIGFsbG93X3N0b3JhZ2Vfb3B0aW9ucyhwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykKICAgIGFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykKCiAgICAjIFRPRE86IHZhbGlkYXRlIHRoZSBzb3VyY2UgZmllbGQgdG9vLgoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiB0cnVlIikKfQoKYWxsb3dfc3RvcmFnZV9vcHRpb25zKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKSB7CiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDE6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyICE9ICJibGsiCiAgICBwX3N0b3JhZ2UuZHJpdmVyICE9ICJvdmVybGF5ZnMiCiAgICBwX3N0b3JhZ2Uub3B0aW9ucyA9PSBpX3N0b3JhZ2Uub3B0aW9ucwoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMTogdHJ1ZSIpCn0KYWxsb3dfc3RvcmFnZV9vcHRpb25zKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKSB7CiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJvdmVybGF5ZnMiCiAgICBjb3VudChwX3N0b3JhZ2Uub3B0aW9ucykgPT0gMgoKICAgIHBvbGljeV9pZHMgOj0gc3BsaXQocF9zdG9yYWdlLm9wdGlvbnNbMF0sICI6IikKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogcG9saWN5X2lkcyA9IiwgcG9saWN5X2lkcykKICAgIHBvbGljeV9pZHMgPT0gbGF5ZXJfaWRzCgogICAgcG9saWN5X2hhc2hlcyA6PSBzcGxpdChwX3N0b3JhZ2Uub3B0aW9uc1sxXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBwb2xpY3lfaGFzaGVzID0iLCBwb2xpY3lfaGFzaGVzKQoKICAgIHBfY291bnQgOj0gY291bnQocG9saWN5X2lkcykKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogcF9jb3VudCA9IiwgcF9jb3VudCkKICAgIHBfY291bnQgPj0gMQogICAgcF9jb3VudCA9PSBjb3VudChwb2xpY3lfaGFzaGVzKQoKICAgIGlfY291bnQgOj0gY291bnQoaV9zdG9yYWdlLm9wdGlvbnMpCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfY291bnQgPSIsIGlfY291bnQpCiAgICBpX2NvdW50ID09IHBfY291bnQgKyAzCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBpX3N0b3JhZ2Uub3B0aW9uc1swXSA9IiwgaV9zdG9yYWdlLm9wdGlvbnNbMF0pCiAgICBpX3N0b3JhZ2Uub3B0aW9uc1swXSA9PSAiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmxheWVyLXNyYy1wcmVmaXg9L3Zhci9saWIvY29udGFpbmVyZC9pby5jb250YWluZXJkLnNuYXBzaG90dGVyLnYxLnRhcmRldi9sYXllcnMiCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBpX3N0b3JhZ2Uub3B0aW9uc1tpX2NvdW50IC0gMl0gPSIsIGlfc3RvcmFnZS5vcHRpb25zW2lfY291bnQgLSAyXSkKICAgIGlfc3RvcmFnZS5vcHRpb25zW2lfY291bnQgLSAyXSA9PSAiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0Lm92ZXJsYXktcnciCgogICAgbG93ZXJkaXIgOj0gY29uY2F0KCI9IiwgWyJsb3dlcmRpciIsIHBfc3RvcmFnZS5vcHRpb25zWzBdXSkKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogbG93ZXJkaXIgPSIsIGxvd2VyZGlyKQoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDFdID0iLCBpX3N0b3JhZ2Uub3B0aW9uc1tpX2NvdW50IC0gMV0pCiAgICBpX3N0b3JhZ2Uub3B0aW9uc1tpX2NvdW50IC0gMV0gPT0gbG93ZXJkaXIKCiAgICBldmVyeSBpLCBwb2xpY3lfaWQgaW4gcG9saWN5X2lkcyB7CiAgICAgICAgYWxsb3dfb3ZlcmxheV9sYXllcihwb2xpY3lfaWQsIHBvbGljeV9oYXNoZXNbaV0sIGlfc3RvcmFnZS5vcHRpb25zW2kgKyAxXSkKICAgIH0KCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IHRydWUiKQp9CmFsbG93X3N0b3JhZ2Vfb3B0aW9ucyhwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAzOiBzdGFydCIpCgogICAgcF9zdG9yYWdlLmRyaXZlciA9PSAiYmxrIgogICAgY291bnQocF9zdG9yYWdlLm9wdGlvbnMpID09IDEKCiAgICBzdGFydHN3aXRoKHBfc3RvcmFnZS5vcHRpb25zWzBdLCAiJChoYXNoIikKICAgIGhhc2hfc3VmZml4IDo9IHRyaW1fbGVmdChwX3N0b3JhZ2Uub3B0aW9uc1swXSwgIiQoaGFzaCIpCgogICAgZW5kc3dpdGgoaGFzaF9zdWZmaXgsICIpIikKICAgIGhhc2hfaW5kZXggOj0gdHJpbV9yaWdodChoYXNoX3N1ZmZpeCwgIikiKQogICAgaSA6PSB0b19udW1iZXIoaGFzaF9pbmRleCkKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMzogaSA9IiwgaSkKCiAgICBoYXNoX29wdGlvbiA6PSBjb25jYXQoIj0iLCBbImlvLmthdGFjb250YWluZXJzLmZzLW9wdC5yb290LWhhc2giLCByb290X2hhc2hlc1tpXV0pCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDM6IGhhc2hfb3B0aW9uID0iLCBoYXNoX29wdGlvbikKCiAgICBjb3VudChpX3N0b3JhZ2Uub3B0aW9ucykgPT0gNAogICAgaV9zdG9yYWdlLm9wdGlvbnNbMF0gPT0gInJvIgogICAgaV9zdG9yYWdlLm9wdGlvbnNbMV0gPT0gImlvLmthdGFjb250YWluZXJzLmZzLW9wdC5ibG9ja19kZXZpY2U9ZmlsZSIKICAgIGlfc3RvcmFnZS5vcHRpb25zWzJdID09ICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQuaXMtbGF5ZXIiCiAgICBpX3N0b3JhZ2Uub3B0aW9uc1szXSA9PSBoYXNoX29wdGlvbgoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMzogdHJ1ZSIpCn0KCmFsbG93X292ZXJsYXlfbGF5ZXIocG9saWN5X2lkLCBwb2xpY3lfaGFzaCwgaV9vcHRpb24pIHsKICAgIHByaW50KCJhbGxvd19vdmVybGF5X2xheWVyOiBwb2xpY3lfaWQgPSIsIHBvbGljeV9pZCwgInBvbGljeV9oYXNoID0iLCBwb2xpY3lfaGFzaCkKICAgIHByaW50KCJhbGxvd19vdmVybGF5X2xheWVyOiBpX29wdGlvbiA9IiwgaV9vcHRpb24pCgogICAgc3RhcnRzd2l0aChpX29wdGlvbiwgImlvLmthdGFjb250YWluZXJzLmZzLW9wdC5sYXllcj0iKQogICAgaV92YWx1ZSA6PSByZXBsYWNlKGlfb3B0aW9uLCAiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmxheWVyPSIsICIiKQogICAgaV92YWx1ZV9kZWNvZGVkIDo9IGJhc2U2NC5kZWNvZGUoaV92YWx1ZSkKICAgIHByaW50KCJhbGxvd19vdmVybGF5X2xheWVyOiBpX3ZhbHVlX2RlY29kZWQgPSIsIGlfdmFsdWVfZGVjb2RlZCkKCiAgICBwb2xpY3lfc3VmZml4IDo9IGNvbmNhdCgiPSIsIFsidGFyLHJvLGlvLmthdGFjb250YWluZXJzLmZzLW9wdC5ibG9ja19kZXZpY2U9ZmlsZSxpby5rYXRhY29udGFpbmVycy5mcy1vcHQuaXMtbGF5ZXIsaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LnJvb3QtaGFzaCIsIHBvbGljeV9oYXNoXSkKICAgIHBfdmFsdWUgOj0gY29uY2F0KCIsIiwgW3BvbGljeV9pZCwgcG9saWN5X3N1ZmZpeF0pCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogcF92YWx1ZSA9IiwgcF92YWx1ZSkKCiAgICBwX3ZhbHVlID09IGlfdmFsdWVfZGVjb2RlZAoKICAgIHByaW50KCJhbGxvd19vdmVybGF5X2xheWVyOiB0cnVlIikKfQoKYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKSB7CiAgICBwX3N0b3JhZ2UuZnN0eXBlID09ICJ0YXIiCgogICAgc3RhcnRzd2l0aChwX3N0b3JhZ2UubW91bnRfcG9pbnQsICIkKGxheWVyIikKICAgIG1vdW50X3N1ZmZpeCA6PSB0cmltX2xlZnQocF9zdG9yYWdlLm1vdW50X3BvaW50LCAiJChsYXllciIpCgogICAgZW5kc3dpdGgobW91bnRfc3VmZml4LCAiKSIpCiAgICBsYXllcl9pbmRleCA6PSB0cmltX3JpZ2h0KG1vdW50X3N1ZmZpeCwgIikiKQogICAgaSA6PSB0b19udW1iZXIobGF5ZXJfaW5kZXgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMTogaSA9IiwgaSkKCiAgICBsYXllcl9pZCA6PSBsYXllcl9pZHNbaV0KICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCAxOiBsYXllcl9pZCA9IiwgbGF5ZXJfaWQpCgogICAgcF9tb3VudCA6PSBjb25jYXQoIi8iLCBbIi9ydW4va2F0YS1jb250YWluZXJzL3NhbmRib3gvbGF5ZXJzIiwgbGF5ZXJfaWRdKQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDE6IHBfbW91bnQgPSIsIHBfbW91bnQpCgogICAgcF9tb3VudCA9PSBpX3N0b3JhZ2UubW91bnRfcG9pbnQKCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMTogdHJ1ZSIpCn0KYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKSB7CiAgICBwX3N0b3JhZ2UuZnN0eXBlID09ICJmdXNlMy5rYXRhLW92ZXJsYXkiCgogICAgbW91bnQxIDo9IHJlcGxhY2UocF9zdG9yYWdlLm1vdW50X3BvaW50LCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBtb3VudDIgOj0gcmVwbGFjZShtb3VudDEsICIkKGJ1bmRsZS1pZCkiLCBidW5kbGVfaWQpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMjogbW91bnQyID0iLCBtb3VudDIpCgogICAgbW91bnQyID09IGlfc3RvcmFnZS5tb3VudF9wb2ludAoKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCAyOiB0cnVlIikKfQphbGxvd19tb3VudF9wb2ludChwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgYnVuZGxlX2lkLCBzYW5kYm94X2lkLCBsYXllcl9pZHMpIHsKICAgIHBfc3RvcmFnZS5mc3R5cGUgPT0gImxvY2FsIgoKICAgIG1vdW50MSA6PSBwX3N0b3JhZ2UubW91bnRfcG9pbnQKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCAzOiBtb3VudDEgPSIsIG1vdW50MSkKCiAgICBtb3VudDIgOj0gcmVwbGFjZShtb3VudDEsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5jcGF0aCkKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCAzOiBtb3VudDIgPSIsIG1vdW50MikKCiAgICBtb3VudDMgOj0gcmVwbGFjZShtb3VudDIsICIkKHNhbmRib3gtaWQpIiwgc2FuZGJveF9pZCkKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCAzOiBtb3VudDMgPSIsIG1vdW50MykKCiAgICByZWdleC5tYXRjaChtb3VudDMsIGlfc3RvcmFnZS5tb3VudF9wb2ludCkKCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogdHJ1ZSIpCn0KYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKSB7CiAgICBwX3N0b3JhZ2UuZnN0eXBlID09ICJiaW5kIgoKICAgIG1vdW50MSA6PSBwX3N0b3JhZ2UubW91bnRfcG9pbnQKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA0OiBtb3VudDEgPSIsIG1vdW50MSkKCiAgICBtb3VudDIgOj0gcmVwbGFjZShtb3VudDEsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5jcGF0aCkKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA0OiBtb3VudDIgPSIsIG1vdW50MikKCiAgICBtb3VudDMgOj0gcmVwbGFjZShtb3VudDIsICIkKGJ1bmRsZS1pZCkiLCBidW5kbGVfaWQpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNDogbW91bnQzID0iLCBtb3VudDMpCgogICAgcmVnZXgubWF0Y2gobW91bnQzLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCgogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDQ6IHRydWUiKQp9CmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAidG1wZnMiCgogICAgbW91bnQxIDo9IHBfc3RvcmFnZS5tb3VudF9wb2ludAogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDU6IG1vdW50MSA9IiwgbW91bnQxKQoKICAgIHJlZ2V4Lm1hdGNoKG1vdW50MSwgaV9zdG9yYWdlLm1vdW50X3BvaW50KQoKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA1OiB0cnVlIikKfQoKIyBwcm9jZXNzLkNhcGFiaWxpdGllcwphbGxvd19jYXBzKHBfY2FwcywgaV9jYXBzKSB7CiAgICBwcmludCgiYWxsb3dfY2FwczogcG9saWN5IEFtYmllbnQgPSIsIHBfY2Fwcy5BbWJpZW50KQogICAgcHJpbnQoImFsbG93X2NhcHM6IGlucHV0IEFtYmllbnQgPSIsIGlfY2Fwcy5BbWJpZW50KQogICAgbWF0Y2hfY2FwcyhwX2NhcHMuQW1iaWVudCwgaV9jYXBzLkFtYmllbnQpCgogICAgcHJpbnQoImFsbG93X2NhcHM6IHBvbGljeSBCb3VuZGluZyA9IiwgcF9jYXBzLkJvdW5kaW5nKQogICAgcHJpbnQoImFsbG93X2NhcHM6IGlucHV0IEJvdW5kaW5nID0iLCBpX2NhcHMuQm91bmRpbmcpCiAgICBtYXRjaF9jYXBzKHBfY2Fwcy5Cb3VuZGluZywgaV9jYXBzLkJvdW5kaW5nKQoKICAgIHByaW50KCJhbGxvd19jYXBzOiBwb2xpY3kgRWZmZWN0aXZlID0iLCBwX2NhcHMuRWZmZWN0aXZlKQogICAgcHJpbnQoImFsbG93X2NhcHM6IGlucHV0IEVmZmVjdGl2ZSA9IiwgaV9jYXBzLkVmZmVjdGl2ZSkKICAgIG1hdGNoX2NhcHMocF9jYXBzLkVmZmVjdGl2ZSwgaV9jYXBzLkVmZmVjdGl2ZSkKCiAgICBwcmludCgiYWxsb3dfY2FwczogcG9saWN5IEluaGVyaXRhYmxlID0iLCBwX2NhcHMuSW5oZXJpdGFibGUpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgSW5oZXJpdGFibGUgPSIsIGlfY2Fwcy5Jbmhlcml0YWJsZSkKICAgIG1hdGNoX2NhcHMocF9jYXBzLkluaGVyaXRhYmxlLCBpX2NhcHMuSW5oZXJpdGFibGUpCgogICAgcHJpbnQoImFsbG93X2NhcHM6IHBvbGljeSBQZXJtaXR0ZWQgPSIsIHBfY2Fwcy5QZXJtaXR0ZWQpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgUGVybWl0dGVkID0iLCBpX2NhcHMuUGVybWl0dGVkKQogICAgbWF0Y2hfY2FwcyhwX2NhcHMuUGVybWl0dGVkLCBpX2NhcHMuUGVybWl0dGVkKQp9CgptYXRjaF9jYXBzKHBfY2FwcywgaV9jYXBzKSB7CiAgICBwcmludCgibWF0Y2hfY2FwcyAxOiBzdGFydCIpCgogICAgcF9jYXBzID09IGlfY2FwcwoKICAgIHByaW50KCJtYXRjaF9jYXBzIDE6IHRydWUiKQp9Cm1hdGNoX2NhcHMocF9jYXBzLCBpX2NhcHMpIHsKICAgIHByaW50KCJtYXRjaF9jYXBzIDI6IHN0YXJ0IikKCiAgICBjb3VudChwX2NhcHMpID09IDEKICAgIHBfY2Fwc1swXSA9PSAiJChkZWZhdWx0X2NhcHMpIgoKICAgIHByaW50KCJtYXRjaF9jYXBzIDI6IGRlZmF1bHRfY2FwcyA9IiwgcG9saWN5X2RhdGEuY29tbW9uLmRlZmF1bHRfY2FwcykKICAgIHBvbGljeV9kYXRhLmNvbW1vbi5kZWZhdWx0X2NhcHMgPT0gaV9jYXBzCgogICAgcHJpbnQoIm1hdGNoX2NhcHMgMjogdHJ1ZSIpCn0KbWF0Y2hfY2FwcyhwX2NhcHMsIGlfY2FwcykgewogICAgcHJpbnQoIm1hdGNoX2NhcHMgMzogc3RhcnQiKQoKICAgIGNvdW50KHBfY2FwcykgPT0gMQogICAgcF9jYXBzWzBdID09ICIkKHByaXZpbGVnZWRfY2FwcykiCgogICAgcHJpbnQoIm1hdGNoX2NhcHMgMzogcHJpdmlsZWdlZF9jYXBzID0iLCBwb2xpY3lfZGF0YS5jb21tb24ucHJpdmlsZWdlZF9jYXBzKQogICAgcG9saWN5X2RhdGEuY29tbW9uLnByaXZpbGVnZWRfY2FwcyA9PSBpX2NhcHMKCiAgICBwcmludCgibWF0Y2hfY2FwcyAzOiB0cnVlIikKfQoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpjaGVja19kaXJlY3RvcnlfdHJhdmVyc2FsKGlfcGF0aCkgewogICAgY29udGFpbnMoaV9wYXRoLCAiLi4vIikgPT0gZmFsc2UKICAgIGVuZHN3aXRoKGlfcGF0aCwgIi8uLiIpID09IGZhbHNlCiAgICBpX3BhdGggIT0gIi4uIgp9CgpjaGVja19zeW1saW5rX3NvdXJjZSB7CiAgICAjIFRPRE86IGRlbGV0ZSB0aGlzIHJ1bGUgb25jZSB0aGUgc3ltbGlua19zcmMgZmllbGQgZ2V0cyBpbXBsZW1lbnRlZAogICAgIyBieSBhbGwvbW9zdCBHdWVzdCBWTXMuCiAgICBub3QgaW5wdXQuc3ltbGlua19zcmMKfQpjaGVja19zeW1saW5rX3NvdXJjZSB7CiAgICBpX3NyYyA6PSBpbnB1dC5zeW1saW5rX3NyYwogICAgcHJpbnQoImNoZWNrX3N5bWxpbmtfc291cmNlOiBpX3NyYyA9IiwgaV9zcmMpCgogICAgc3RhcnRzd2l0aChpX3NyYywgIi8iKSA9PSBmYWxzZQogICAgY2hlY2tfZGlyZWN0b3J5X3RyYXZlcnNhbChpX3NyYykKfQoKYWxsb3dfc2FuZGJveF9zdG9yYWdlcyhpX3N0b3JhZ2VzKSB7CiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9zdG9yYWdlczogaV9zdG9yYWdlcyA9IiwgaV9zdG9yYWdlcykKCiAgICBwX3N0b3JhZ2VzIDo9IHBvbGljeV9kYXRhLnNhbmRib3guc3RvcmFnZXMKICAgIGV2ZXJ5IGlfc3RvcmFnZSBpbiBpX3N0b3JhZ2VzIHsKICAgICAgICBhbGxvd19zYW5kYm94X3N0b3JhZ2UocF9zdG9yYWdlcywgaV9zdG9yYWdlKQogICAgfQoKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2VzOiB0cnVlIikKfQoKYWxsb3dfc2FuZGJveF9zdG9yYWdlKHBfc3RvcmFnZXMsIGlfc3RvcmFnZSkgewogICAgcHJpbnQoImFsbG93X3NhbmRib3hfc3RvcmFnZTogaV9zdG9yYWdlID0iLCBpX3N0b3JhZ2UpCgogICAgc29tZSBwX3N0b3JhZ2UgaW4gcF9zdG9yYWdlcwogICAgcHJpbnQoImFsbG93X3NhbmRib3hfc3RvcmFnZTogcF9zdG9yYWdlID0iLCBwX3N0b3JhZ2UpCiAgICBpX3N0b3JhZ2UgPT0gcF9zdG9yYWdlCgogICAgcHJpbnQoImFsbG93X3NhbmRib3hfc3RvcmFnZTogdHJ1ZSIpCn0KCkNvcHlGaWxlUmVxdWVzdCB7CiAgICBwcmludCgiQ29weUZpbGVSZXF1ZXN0OiBpbnB1dC5wYXRoID0iLCBpbnB1dC5wYXRoKQoKICAgIGNoZWNrX3N5bWxpbmtfc291cmNlCiAgICBjaGVja19kaXJlY3RvcnlfdHJhdmVyc2FsKGlucHV0LnBhdGgpCgogICAgc29tZSByZWdleDEgaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5Db3B5RmlsZVJlcXVlc3QKICAgIHJlZ2V4MiA6PSByZXBsYWNlKHJlZ2V4MSwgIiQoc2ZwcmVmaXgpIiwgcG9saWN5X2RhdGEuY29tbW9uLnNmcHJlZml4KQogICAgcmVnZXgzIDo9IHJlcGxhY2UocmVnZXgyLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICByZWdleDQgOj0gcmVwbGFjZShyZWdleDMsICIkKGJ1bmRsZS1pZCkiLCAiW2EtejAtOV17NjR9IikKICAgIHByaW50KCJDb3B5RmlsZVJlcXVlc3Q6IHJlZ2V4NCA9IiwgcmVnZXg0KQoKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4NCwgaW5wdXQucGF0aCkKCiAgICBwcmludCgiQ29weUZpbGVSZXF1ZXN0OiB0cnVlIikKfQoKQ3JlYXRlU2FuZGJveFJlcXVlc3QgewogICAgcHJpbnQoIkNyZWF0ZVNhbmRib3hSZXF1ZXN0OiBpbnB1dC5ndWVzdF9ob29rX3BhdGggPSIsIGlucHV0Lmd1ZXN0X2hvb2tfcGF0aCkKICAgIGNvdW50KGlucHV0Lmd1ZXN0X2hvb2tfcGF0aCkgPT0gMAoKICAgIHByaW50KCJDcmVhdGVTYW5kYm94UmVxdWVzdDogaW5wdXQua2VybmVsX21vZHVsZXMgPSIsIGlucHV0Lmtlcm5lbF9tb2R1bGVzKQogICAgY291bnQoaW5wdXQua2VybmVsX21vZHVsZXMpID09IDAKCiAgICBpX3BpZG5zIDo9IGlucHV0LnNhbmRib3hfcGlkbnMKICAgIHByaW50KCJDcmVhdGVTYW5kYm94UmVxdWVzdDogaV9waWRucyA9IiwgaV9waWRucykKICAgIGlfcGlkbnMgPT0gZmFsc2UKCiAgICBhbGxvd19zYW5kYm94X3N0b3JhZ2VzKGlucHV0LnN0b3JhZ2VzKQp9CgpFeGVjUHJvY2Vzc1JlcXVlc3QgewogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAxOiBpbnB1dCA9IiwgaW5wdXQpCgogICAgaV9jb21tYW5kID0gY29uY2F0KCIgIiwgaW5wdXQucHJvY2Vzcy5BcmdzKQogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAxOiBpX2NvbW1hbmQgPSIsIGlfY29tbWFuZCkKCiAgICBzb21lIHBfY29tbWFuZCBpbiBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLkV4ZWNQcm9jZXNzUmVxdWVzdC5jb21tYW5kcwogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAxOiBwX2NvbW1hbmQgPSIsIHBfY29tbWFuZCkKICAgIHBfY29tbWFuZCA9PSBpX2NvbW1hbmQKCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDE6IHRydWUiKQp9CkV4ZWNQcm9jZXNzUmVxdWVzdCB7CiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDI6IGlucHV0ID0iLCBpbnB1dCkKCiAgICAjIFRPRE86IG1hdGNoIGlucHV0IGNvbnRhaW5lciBJRCB3aXRoIGl0cyBjb3JyZXNwb25kaW5nIGNvbnRhaW5lci5leGVjX2NvbW1hbmRzLgogICAgaV9jb21tYW5kID0gY29uY2F0KCIgIiwgaW5wdXQucHJvY2Vzcy5BcmdzKQogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAzOiBpX2NvbW1hbmQgPSIsIGlfY29tbWFuZCkKCiAgICBzb21lIGNvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBzb21lIHBfY29tbWFuZCBpbiBjb250YWluZXIuZXhlY19jb21tYW5kcwogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAyOiBwX2NvbW1hbmQgPSIsIHBfY29tbWFuZCkKCiAgICAjIFRPRE86IHNob3VsZCBvdGhlciBpbnB1dCBkYXRhIGZpZWxkcyBiZSB2YWxpZGF0ZWQgYXMgd2VsbD8KICAgIHBfY29tbWFuZCA9PSBpX2NvbW1hbmQKCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDI6IHRydWUiKQp9CkV4ZWNQcm9jZXNzUmVxdWVzdCB7CiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDM6IGlucHV0ID0iLCBpbnB1dCkKCiAgICBpX2NvbW1hbmQgPSBjb25jYXQoIiAiLCBpbnB1dC5wcm9jZXNzLkFyZ3MpCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDM6IGlfY29tbWFuZCA9IiwgaV9jb21tYW5kKQoKICAgIHNvbWUgcF9yZWdleCBpbiBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLkV4ZWNQcm9jZXNzUmVxdWVzdC5yZWdleAogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAzOiBwX3JlZ2V4ID0iLCBwX3JlZ2V4KQoKICAgIHJlZ2V4Lm1hdGNoKHBfcmVnZXgsIGlfY29tbWFuZCkKCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDM6IHRydWUiKQp9CgpDbG9zZVN0ZGluUmVxdWVzdCB7CiAgICBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLkNsb3NlU3RkaW5SZXF1ZXN0ID09IHRydWUKfQoKUmVhZFN0cmVhbVJlcXVlc3QgewogICAgcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5SZWFkU3RyZWFtUmVxdWVzdCA9PSB0cnVlCn0KClVwZGF0ZUVwaGVtZXJhbE1vdW50c1JlcXVlc3QgewogICAgcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVFcGhlbWVyYWxNb3VudHNSZXF1ZXN0ID09IHRydWUKfQoKV3JpdGVTdHJlYW1SZXF1ZXN0IHsKICAgIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuV3JpdGVTdHJlYW1SZXF1ZXN0ID09IHRydWUKfQoKcG9saWN5X2RhdGEgOj0gewogICJjb250YWluZXJzIjogWwogICAgewogICAgICAiT0NJIjogewogICAgICAgICJWZXJzaW9uIjogIjEuMS4wLXJjLjEiLAogICAgICAgICJQcm9jZXNzIjogewogICAgICAgICAgIlRlcm1pbmFsIjogZmFsc2UsCiAgICAgICAgICAiVXNlciI6IHsKICAgICAgICAgICAgIlVJRCI6IDY1NTM1LAogICAgICAgICAgICAiR0lEIjogNjU1MzUsCiAgICAgICAgICAgICJBZGRpdGlvbmFsR2lkcyI6IFtdLAogICAgICAgICAgICAiVXNlcm5hbWUiOiAiIgogICAgICAgICAgfSwKICAgICAgICAgICJBcmdzIjogWwogICAgICAgICAgICAiL3BhdXNlIgogICAgICAgICAgXSwKICAgICAgICAgICJFbnYiOiBbCiAgICAgICAgICAgICJQQVRIPS91c3IvbG9jYWwvc2JpbjovdXNyL2xvY2FsL2JpbjovdXNyL3NiaW46L3Vzci9iaW46L3NiaW46L2JpbiIKICAgICAgICAgIF0sCiAgICAgICAgICAiQ3dkIjogIi8iLAogICAgICAgICAgIkNhcGFiaWxpdGllcyI6IHsKICAgICAgICAgICAgIkFtYmllbnQiOiBbXSwKICAgICAgICAgICAgIkJvdW5kaW5nIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJFZmZlY3RpdmUiOiBbCiAgICAgICAgICAgICAgIiQoZGVmYXVsdF9jYXBzKSIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgIkluaGVyaXRhYmxlIjogW10sCiAgICAgICAgICAgICJQZXJtaXR0ZWQiOiBbCiAgICAgICAgICAgICAgIiQoZGVmYXVsdF9jYXBzKSIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgICJOb05ld1ByaXZpbGVnZXMiOiB0cnVlCiAgICAgICAgfSwKICAgICAgICAiUm9vdCI6IHsKICAgICAgICAgICJQYXRoIjogIiQoY3BhdGgpLyQoYnVuZGxlLWlkKSIsCiAgICAgICAgICAiUmVhZG9ubHkiOiB0cnVlCiAgICAgICAgfSwKICAgICAgICAiTW91bnRzIjogWwogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL3Byb2MiLAogICAgICAgICAgICAic291cmNlIjogInByb2MiLAogICAgICAgICAgICAidHlwZV8iOiAicHJvYyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYiLAogICAgICAgICAgICAic291cmNlIjogInRtcGZzIiwKICAgICAgICAgICAgInR5cGVfIjogInRtcGZzIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgInN0cmljdGF0aW1lIiwKICAgICAgICAgICAgICAibW9kZT03NTUiLAogICAgICAgICAgICAgICJzaXplPTY1NTM2ayIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvcHRzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJkZXZwdHMiLAogICAgICAgICAgICAidHlwZV8iOiAiZGV2cHRzIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAgICAgIm5ld2luc3RhbmNlIiwKICAgICAgICAgICAgICAicHRteG1vZGU9MDY2NiIsCiAgICAgICAgICAgICAgIm1vZGU9MDYyMCIsCiAgICAgICAgICAgICAgImdpZD01IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi9zaG0iLAogICAgICAgICAgICAic291cmNlIjogIi9ydW4va2F0YS1jb250YWluZXJzL3NhbmRib3gvc2htIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L21xdWV1ZSIsCiAgICAgICAgICAgICJzb3VyY2UiOiAibXF1ZXVlIiwKICAgICAgICAgICAgInR5cGVfIjogIm1xdWV1ZSIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9zeXMiLAogICAgICAgICAgICAic291cmNlIjogInN5c2ZzIiwKICAgICAgICAgICAgInR5cGVfIjogInN5c2ZzIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAgICAgIm5vZGV2IiwKICAgICAgICAgICAgICAicm8iCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZXRjL3Jlc29sdi5jb25mIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KXJlc29sdi5jb25mJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicm8iLAogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2RldiIsCiAgICAgICAgICAgICAgIm5vZXhlYyIKICAgICAgICAgICAgXQogICAgICAgICAgfQogICAgICAgIF0sCiAgICAgICAgIkFubm90YXRpb25zIjogewogICAgICAgICAgImlvLmthdGFjb250YWluZXJzLnBrZy5vY2kuYnVuZGxlX3BhdGgiOiAiL3J1bi9jb250YWluZXJkL2lvLmNvbnRhaW5lcmQucnVudGltZS52Mi50YXNrL2s4cy5pby8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgImlvLmthdGFjb250YWluZXJzLnBrZy5vY2kuY29udGFpbmVyX3R5cGUiOiAicG9kX3NhbmRib3giLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLmNvbnRhaW5lci10eXBlIjogInNhbmRib3giLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtaWQiOiAiXlthLXowLTldezY0fSQiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbG9nLWRpcmVjdG9yeSI6ICJeL3Zhci9sb2cvcG9kcy8kKHNhbmRib3gtbmFtZXNwYWNlKV8kKHNhbmRib3gtbmFtZSlfWzAtOWEtZl17OH0tWzAtOWEtZl17NH0tWzAtOWEtZl17NH0tWzAtOWEtZl17NH0tWzAtOWEtZl17MTJ9JCIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1uYW1lc3BhY2UiOiAiZGVmYXVsdCIsCiAgICAgICAgICAibmVyZGN0bC9uZXR3b3JrLW5hbWVzcGFjZSI6ICJeL3Zhci9ydW4vbmV0bnMvY25pLVswLTlhLWZdezh9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezEyfSQiCiAgICAgICAgfSwKICAgICAgICAiTGludXgiOiB7CiAgICAgICAgICAiTmFtZXNwYWNlcyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICJUeXBlIjogImlwYyIsCiAgICAgICAgICAgICAgIlBhdGgiOiAiIgogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgIlR5cGUiOiAidXRzIiwKICAgICAgICAgICAgICAiUGF0aCI6ICIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiVHlwZSI6ICJtb3VudCIsCiAgICAgICAgICAgICAgIlBhdGgiOiAiIgogICAgICAgICAgICB9CiAgICAgICAgICBdLAogICAgICAgICAgIk1hc2tlZFBhdGhzIjogWwogICAgICAgICAgICAiL3Byb2MvYWNwaSIsCiAgICAgICAgICAgICIvcHJvYy9hc291bmQiLAogICAgICAgICAgICAiL3Byb2Mva2NvcmUiLAogICAgICAgICAgICAiL3Byb2Mva2V5cyIsCiAgICAgICAgICAgICIvcHJvYy9sYXRlbmN5X3N0YXRzIiwKICAgICAgICAgICAgIi9wcm9jL3RpbWVyX2xpc3QiLAogICAgICAgICAgICAiL3Byb2MvdGltZXJfc3RhdHMiLAogICAgICAgICAgICAiL3Byb2Mvc2NoZWRfZGVidWciLAogICAgICAgICAgICAiL3N5cy9maXJtd2FyZSIsCiAgICAgICAgICAgICIvcHJvYy9zY3NpIgogICAgICAgICAgXSwKICAgICAgICAgICJSZWFkb25seVBhdGhzIjogWwogICAgICAgICAgICAiL3Byb2MvYnVzIiwKICAgICAgICAgICAgIi9wcm9jL2ZzIiwKICAgICAgICAgICAgIi9wcm9jL2lycSIsCiAgICAgICAgICAgICIvcHJvYy9zeXMiLAogICAgICAgICAgICAiL3Byb2Mvc3lzcnEtdHJpZ2dlciIKICAgICAgICAgIF0KICAgICAgICB9CiAgICAgIH0sCiAgICAgICJzdG9yYWdlcyI6IFsKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoMCkiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXIwKSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogIm92ZXJsYXlmcyIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAiZnVzZTMua2F0YS1vdmVybGF5IiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiNWE1YWFkODAwNTVmZjIwMDEyYTUwZGMyNWY4ZGY3YTI5OTI0NDc0MzI0ZDY1ZjdkNTMwNmVlOGVlMjdmZjcxZCIsCiAgICAgICAgICAgICI4MTcyNTBmMWEzZTMzNmRhNzZmNWJkM2ZhNzg0ZTFiMjZkOTU5YjljMTMxODc2ODE1YmEyNjA0MDQ4YjcwYzE4IgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGNwYXRoKS8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0KICAgICAgXSwKICAgICAgInNhbmRib3hfcGlkbnMiOiBmYWxzZSwKICAgICAgImV4ZWNfY29tbWFuZHMiOiBbXQogICAgfSwKICAgIHsKICAgICAgIk9DSSI6IHsKICAgICAgICAiVmVyc2lvbiI6ICIxLjEuMC1yYy4xIiwKICAgICAgICAiUHJvY2VzcyI6IHsKICAgICAgICAgICJUZXJtaW5hbCI6IGZhbHNlLAogICAgICAgICAgIlVzZXIiOiB7CiAgICAgICAgICAgICJVSUQiOiAwLAogICAgICAgICAgICAiR0lEIjogMCwKICAgICAgICAgICAgIkFkZGl0aW9uYWxHaWRzIjogW10sCiAgICAgICAgICAgICJVc2VybmFtZSI6ICIiCiAgICAgICAgICB9LAogICAgICAgICAgIkFyZ3MiOiBbCiAgICAgICAgICAgICIvd29yay1kaXIvcGVlci1maW5kZXIiLAogICAgICAgICAgICAiLW9uLXN0YXJ0PVwiL3dvcmstZGlyL29uLXN0YXJ0LnNoXCIiLAogICAgICAgICAgICAiLXNlcnZpY2U9Z2FsZXJhIgogICAgICAgICAgXSwKICAgICAgICAgICJFbnYiOiBbCiAgICAgICAgICAgICJQQVRIPS91c3IvbG9jYWwvc2JpbjovdXNyL2xvY2FsL2JpbjovdXNyL3NiaW46L3Vzci9iaW46L3NiaW46L2JpbiIsCiAgICAgICAgICAgICJIT1NUTkFNRT0kKGhvc3QtbmFtZSkiLAogICAgICAgICAgICAiUE9EX05BTUVTUEFDRT1kZWZhdWx0IgogICAgICAgICAgXSwKICAgICAgICAgICJDd2QiOiAiLyIsCiAgICAgICAgICAiQ2FwYWJpbGl0aWVzIjogewogICAgICAgICAgICAiQW1iaWVudCI6IFtdLAogICAgICAgICAgICAiQm91bmRpbmciOiBbCiAgICAgICAgICAgICAgIiQoZGVmYXVsdF9jYXBzKSIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgIkVmZmVjdGl2ZSI6IFsKICAgICAgICAgICAgICAiJChkZWZhdWx0X2NhcHMpIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiSW5oZXJpdGFibGUiOiBbXSwKICAgICAgICAgICAgIlBlcm1pdHRlZCI6IFsKICAgICAgICAgICAgICAiJChkZWZhdWx0X2NhcHMpIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgIk5vTmV3UHJpdmlsZWdlcyI6IGZhbHNlCiAgICAgICAgfSwKICAgICAgICAiUm9vdCI6IHsKICAgICAgICAgICJQYXRoIjogIiQoY3BhdGgpLyQoYnVuZGxlLWlkKSIsCiAgICAgICAgICAiUmVhZG9ubHkiOiBmYWxzZQogICAgICAgIH0sCiAgICAgICAgIk1vdW50cyI6IFsKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9wcm9jIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJwcm9jIiwKICAgICAgICAgICAgInR5cGVfIjogInByb2MiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2IiwKICAgICAgICAgICAgInNvdXJjZSI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJzdHJpY3RhdGltZSIsCiAgICAgICAgICAgICAgIm1vZGU9NzU1IiwKICAgICAgICAgICAgICAic2l6ZT02NTUzNmsiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L3B0cyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiZGV2cHRzIiwKICAgICAgICAgICAgInR5cGVfIjogImRldnB0cyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJuZXdpbnN0YW5jZSIsCiAgICAgICAgICAgICAgInB0bXhtb2RlPTA2NjYiLAogICAgICAgICAgICAgICJtb2RlPTA2MjAiLAogICAgICAgICAgICAgICJnaWQ9NSIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvc2htIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L3NobSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi9tcXVldWUiLAogICAgICAgICAgICAic291cmNlIjogIm1xdWV1ZSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJtcXVldWUiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvc3lzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJzeXNmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJzeXNmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL3N5cy9mcy9jZ3JvdXAiLAogICAgICAgICAgICAic291cmNlIjogImNncm91cCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJjZ3JvdXAiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiLAogICAgICAgICAgICAgICJyZWxhdGltZSIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2V0Yy9ob3N0cyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClob3N0cyQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicnciCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L3Rlcm1pbmF0aW9uLWxvZyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeCl0ZXJtaW5hdGlvbi1sb2ckIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJ3IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2V0Yy9ob3N0bmFtZSIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClob3N0bmFtZSQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicnciCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZXRjL3Jlc29sdi5jb25mIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KXJlc29sdi5jb25mJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJydyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi92YXIvcnVuL3NlY3JldHMva3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudCIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClzZXJ2aWNlYWNjb3VudCQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicm8iCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvdmFyL3J1bi9zZWNyZXRzL2F6dXJlL3Rva2VucyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeCl0b2tlbnMkIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2V0Yy9teXNxbCIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiXiQoY3BhdGgpLyQoc2FuZGJveC1pZCkvbG9jYWwvY29uZmlnJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJsb2NhbCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicnciCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvd29yay1kaXIiLAogICAgICAgICAgICAic291cmNlIjogIl4kKGNwYXRoKS8kKHNhbmRib3gtaWQpL2xvY2FsL3dvcmtkaXIkIiwKICAgICAgICAgICAgInR5cGVfIjogImxvY2FsIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJydyIKICAgICAgICAgICAgXQogICAgICAgICAgfQogICAgICAgIF0sCiAgICAgICAgIkFubm90YXRpb25zIjogewogICAgICAgICAgImlvLmthdGFjb250YWluZXJzLnBrZy5vY2kuYnVuZGxlX3BhdGgiOiAiL3J1bi9jb250YWluZXJkL2lvLmNvbnRhaW5lcmQucnVudGltZS52Mi50YXNrL2s4cy5pby8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgImlvLmthdGFjb250YWluZXJzLnBrZy5vY2kuY29udGFpbmVyX3R5cGUiOiAicG9kX2NvbnRhaW5lciIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLW5hbWUiOiAiYm9vdHN0cmFwIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSI6ICJjb250YWluZXIiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLmltYWdlLW5hbWUiOiAiZG9ja2VyLmlvL2xpYnJhcnkvZGViaWFuOmplc3NpZSIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCI6ICJeW2EtejAtOV17NjR9JCIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1uYW1lc3BhY2UiOiAiZGVmYXVsdCIKICAgICAgICB9LAogICAgICAgICJMaW51eCI6IHsKICAgICAgICAgICJOYW1lc3BhY2VzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgIlR5cGUiOiAiaXBjIiwKICAgICAgICAgICAgICAiUGF0aCI6ICIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiVHlwZSI6ICJ1dHMiLAogICAgICAgICAgICAgICJQYXRoIjogIiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJUeXBlIjogIm1vdW50IiwKICAgICAgICAgICAgICAiUGF0aCI6ICIiCiAgICAgICAgICAgIH0KICAgICAgICAgIF0sCiAgICAgICAgICAiTWFza2VkUGF0aHMiOiBbCiAgICAgICAgICAgICIvcHJvYy9hY3BpIiwKICAgICAgICAgICAgIi9wcm9jL2tjb3JlIiwKICAgICAgICAgICAgIi9wcm9jL2tleXMiLAogICAgICAgICAgICAiL3Byb2MvbGF0ZW5jeV9zdGF0cyIsCiAgICAgICAgICAgICIvcHJvYy90aW1lcl9saXN0IiwKICAgICAgICAgICAgIi9wcm9jL3RpbWVyX3N0YXRzIiwKICAgICAgICAgICAgIi9wcm9jL3NjaGVkX2RlYnVnIiwKICAgICAgICAgICAgIi9wcm9jL3Njc2kiLAogICAgICAgICAgICAiL3N5cy9maXJtd2FyZSIKICAgICAgICAgIF0sCiAgICAgICAgICAiUmVhZG9ubHlQYXRocyI6IFsKICAgICAgICAgICAgIi9wcm9jL2Fzb3VuZCIsCiAgICAgICAgICAgICIvcHJvYy9idXMiLAogICAgICAgICAgICAiL3Byb2MvZnMiLAogICAgICAgICAgICAiL3Byb2MvaXJxIiwKICAgICAgICAgICAgIi9wcm9jL3N5cyIsCiAgICAgICAgICAgICIvcHJvYy9zeXNycS10cmlnZ2VyIgogICAgICAgICAgXQogICAgICAgIH0KICAgICAgfSwKICAgICAgInN0b3JhZ2VzIjogWwogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2gwKSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjApIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAib3ZlcmxheWZzIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJmdXNlMy5rYXRhLW92ZXJsYXkiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIzNWY3OGFmMTBiNjM0MDJiYjg5ZGExNjE1MTNmYTU2MzQ2NWJjYzFkNDM0M2M0ZjdkNDk4MTFmZjliNzBkZGE5IiwKICAgICAgICAgICAgIjA2Zjg5YzI3NWRjMzRmMjZiOWRiMGNmMDEwMmIyYTg5OWRlNjU1NTEwNTg1MmQwYWYyYmI5NWYzNzRmNzE0NGQiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQoY3BhdGgpLyQoYnVuZGxlLWlkKSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImxvY2FsIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICJsb2NhbCIsCiAgICAgICAgICAiZnN0eXBlIjogImxvY2FsIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAibW9kZT0wNzc3IgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICJeJChjcGF0aCkvJChzYW5kYm94LWlkKS9sb2NhbC9jb25maWckIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAibG9jYWwiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogImxvY2FsIiwKICAgICAgICAgICJmc3R5cGUiOiAibG9jYWwiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICJtb2RlPTA3NzciCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIl4kKGNwYXRoKS8kKHNhbmRib3gtaWQpL2xvY2FsL3dvcmtkaXIkIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9CiAgICAgIF0sCiAgICAgICJzYW5kYm94X3BpZG5zIjogZmFsc2UsCiAgICAgICJleGVjX2NvbW1hbmRzIjogW10KICAgIH0sCiAgICB7CiAgICAgICJPQ0kiOiB7CiAgICAgICAgIlZlcnNpb24iOiAiMS4xLjAtcmMuMSIsCiAgICAgICAgIlByb2Nlc3MiOiB7CiAgICAgICAgICAiVGVybWluYWwiOiBmYWxzZSwKICAgICAgICAgICJVc2VyIjogewogICAgICAgICAgICAiVUlEIjogMCwKICAgICAgICAgICAgIkdJRCI6IDAsCiAgICAgICAgICAgICJBZGRpdGlvbmFsR2lkcyI6IFtdLAogICAgICAgICAgICAiVXNlcm5hbWUiOiAiIgogICAgICAgICAgfSwKICAgICAgICAgICJBcmdzIjogWwogICAgICAgICAgICAiL2luc3RhbGwuc2giLAogICAgICAgICAgICAiLS13b3JrLWRpcj0vd29yay1kaXIiCiAgICAgICAgICBdLAogICAgICAgICAgIkVudiI6IFsKICAgICAgICAgICAgIlBBVEg9L3Vzci9sb2NhbC9zYmluOi91c3IvbG9jYWwvYmluOi91c3Ivc2JpbjovdXNyL2Jpbjovc2JpbjovYmluIiwKICAgICAgICAgICAgIkhPU1ROQU1FPSQoaG9zdC1uYW1lKSIKICAgICAgICAgIF0sCiAgICAgICAgICAiQ3dkIjogIi8iLAogICAgICAgICAgIkNhcGFiaWxpdGllcyI6IHsKICAgICAgICAgICAgIkFtYmllbnQiOiBbXSwKICAgICAgICAgICAgIkJvdW5kaW5nIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJFZmZlY3RpdmUiOiBbCiAgICAgICAgICAgICAgIiQoZGVmYXVsdF9jYXBzKSIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgIkluaGVyaXRhYmxlIjogW10sCiAgICAgICAgICAgICJQZXJtaXR0ZWQiOiBbCiAgICAgICAgICAgICAgIiQoZGVmYXVsdF9jYXBzKSIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgICJOb05ld1ByaXZpbGVnZXMiOiBmYWxzZQogICAgICAgIH0sCiAgICAgICAgIlJvb3QiOiB7CiAgICAgICAgICAiUGF0aCI6ICIkKGNwYXRoKS8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgIlJlYWRvbmx5IjogZmFsc2UKICAgICAgICB9LAogICAgICAgICJNb3VudHMiOiBbCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvcHJvYyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAicHJvYyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJwcm9jIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAgICAgIm5vZGV2IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2RldiIsCiAgICAgICAgICAgICJzb3VyY2UiOiAidG1wZnMiLAogICAgICAgICAgICAidHlwZV8iOiAidG1wZnMiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAic3RyaWN0YXRpbWUiLAogICAgICAgICAgICAgICJtb2RlPTc1NSIsCiAgICAgICAgICAgICAgInNpemU9NjU1MzZrIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi9wdHMiLAogICAgICAgICAgICAic291cmNlIjogImRldnB0cyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJkZXZwdHMiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibmV3aW5zdGFuY2UiLAogICAgICAgICAgICAgICJwdG14bW9kZT0wNjY2IiwKICAgICAgICAgICAgICAibW9kZT0wNjIwIiwKICAgICAgICAgICAgICAiZ2lkPTUiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L3NobSIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiL3J1bi9rYXRhLWNvbnRhaW5lcnMvc2FuZGJveC9zaG0iLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvbXF1ZXVlIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJtcXVldWUiLAogICAgICAgICAgICAidHlwZV8iOiAibXF1ZXVlIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAgICAgIm5vZGV2IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL3N5cyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAic3lzZnMiLAogICAgICAgICAgICAidHlwZV8iOiAic3lzZnMiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiLAogICAgICAgICAgICAgICJybyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9zeXMvZnMvY2dyb3VwIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJjZ3JvdXAiLAogICAgICAgICAgICAidHlwZV8iOiAiY2dyb3VwIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAgICAgIm5vZGV2IiwKICAgICAgICAgICAgICAicmVsYXRpbWUiLAogICAgICAgICAgICAgICJybyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9ldGMvaG9zdHMiLAogICAgICAgICAgICAic291cmNlIjogIiQoc2ZwcmVmaXgpaG9zdHMkIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJ3IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi90ZXJtaW5hdGlvbi1sb2ciLAogICAgICAgICAgICAic291cmNlIjogIiQoc2ZwcmVmaXgpdGVybWluYXRpb24tbG9nJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJydyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9ldGMvaG9zdG5hbWUiLAogICAgICAgICAgICAic291cmNlIjogIiQoc2ZwcmVmaXgpaG9zdG5hbWUkIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJ3IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2V0Yy9yZXNvbHYuY29uZiIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClyZXNvbHYuY29uZiQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicnciCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvdmFyL3J1bi9zZWNyZXRzL2t1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQiLAogICAgICAgICAgICAic291cmNlIjogIiQoc2ZwcmVmaXgpc2VydmljZWFjY291bnQkIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL3Zhci9ydW4vc2VjcmV0cy9henVyZS90b2tlbnMiLAogICAgICAgICAgICAic291cmNlIjogIiQoc2ZwcmVmaXgpdG9rZW5zJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJybyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9ldGMvbXlzcWwiLAogICAgICAgICAgICAic291cmNlIjogIl4kKGNwYXRoKS8kKHNhbmRib3gtaWQpL2xvY2FsL2NvbmZpZyQiLAogICAgICAgICAgICAidHlwZV8iOiAibG9jYWwiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJ3IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL3dvcmstZGlyIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJeJChjcGF0aCkvJChzYW5kYm94LWlkKS9sb2NhbC93b3JrZGlyJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJsb2NhbCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicnciCiAgICAgICAgICAgIF0KICAgICAgICAgIH0KICAgICAgICBdLAogICAgICAgICJBbm5vdGF0aW9ucyI6IHsKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmJ1bmRsZV9wYXRoIjogIi9ydW4vY29udGFpbmVyZC9pby5jb250YWluZXJkLnJ1bnRpbWUudjIudGFzay9rOHMuaW8vJChidW5kbGUtaWQpIiwKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIjogInBvZF9jb250YWluZXIiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLmNvbnRhaW5lci1uYW1lIjogImluc3RhbGwiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLmNvbnRhaW5lci10eXBlIjogImNvbnRhaW5lciIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuaW1hZ2UtbmFtZSI6ICJyZWdpc3RyeS5rOHMuaW8vZ2FsZXJhLWluc3RhbGw6MC4xIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWlkIjogIl5bYS16MC05XXs2NH0kIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LW5hbWVzcGFjZSI6ICJkZWZhdWx0IgogICAgICAgIH0sCiAgICAgICAgIkxpbnV4IjogewogICAgICAgICAgIk5hbWVzcGFjZXMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiVHlwZSI6ICJpcGMiLAogICAgICAgICAgICAgICJQYXRoIjogIiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJUeXBlIjogInV0cyIsCiAgICAgICAgICAgICAgIlBhdGgiOiAiIgogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgIlR5cGUiOiAibW91bnQiLAogICAgICAgICAgICAgICJQYXRoIjogIiIKICAgICAgICAgICAgfQogICAgICAgICAgXSwKICAgICAgICAgICJNYXNrZWRQYXRocyI6IFsKICAgICAgICAgICAgIi9wcm9jL2FjcGkiLAogICAgICAgICAgICAiL3Byb2Mva2NvcmUiLAogICAgICAgICAgICAiL3Byb2Mva2V5cyIsCiAgICAgICAgICAgICIvcHJvYy9sYXRlbmN5X3N0YXRzIiwKICAgICAgICAgICAgIi9wcm9jL3RpbWVyX2xpc3QiLAogICAgICAgICAgICAiL3Byb2MvdGltZXJfc3RhdHMiLAogICAgICAgICAgICAiL3Byb2Mvc2NoZWRfZGVidWciLAogICAgICAgICAgICAiL3Byb2Mvc2NzaSIsCiAgICAgICAgICAgICIvc3lzL2Zpcm13YXJlIgogICAgICAgICAgXSwKICAgICAgICAgICJSZWFkb25seVBhdGhzIjogWwogICAgICAgICAgICAiL3Byb2MvYXNvdW5kIiwKICAgICAgICAgICAgIi9wcm9jL2J1cyIsCiAgICAgICAgICAgICIvcHJvYy9mcyIsCiAgICAgICAgICAgICIvcHJvYy9pcnEiLAogICAgICAgICAgICAiL3Byb2Mvc3lzIiwKICAgICAgICAgICAgIi9wcm9jL3N5c3JxLXRyaWdnZXIiCiAgICAgICAgICBdCiAgICAgICAgfQogICAgICB9LAogICAgICAic3RvcmFnZXMiOiBbCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJibGsiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogInRhciIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIiQoaGFzaDApIgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGxheWVyMCkiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJibGsiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogInRhciIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIiQoaGFzaDEpIgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGxheWVyMSkiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJibGsiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogInRhciIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIiQoaGFzaDIpIgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGxheWVyMikiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJibGsiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogInRhciIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIiQoaGFzaDMpIgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGxheWVyMykiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJibGsiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogInRhciIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIiQoaGFzaDQpIgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGxheWVyNCkiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJibGsiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogInRhciIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIiQoaGFzaDUpIgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGxheWVyNSkiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJibGsiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogInRhciIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIiQoaGFzaDYpIgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGxheWVyNikiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJvdmVybGF5ZnMiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogImZ1c2UzLmthdGEtb3ZlcmxheSIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIjY4ZGU4ZGNlY2U4ZTkwM2U3OTY5Y2I4NWQ5ODJkMmJjMmMxNDQ4Yjg0ODU3ZmNlOTVlNWIzNGI3MGNmNDc2YTg6ODIxY2MwZGM1ZWE4NWQ2ZTc1MTljNTg4ODExMTM4NzZmNjE1ZTljZjRkYzQ4YzM0Y2Y1NDM0NDg5NjIwZWVjMDphOGIxODI0MjAxZjMyZjk5MDQ2ZDU4ZTUxNDdiOGVhNTI5Zjc4YjZmZGJkN2E5YWI1M2VmNjQ4MmZiNzMxZTMzOjE3OGYwMDRlMDE1NDdjZTU3YTM4NTEyNzFkZWJlMWExYzdiY2JjZmIwZTQxNDI1NGNmMWM3YmYyNmQ4M2M4ZGM6OGY1YzA2YTFjYjFlZjc4N2QxOTE2Y2I4MWM0ODc4MmFjMDUxYTI0YTdhM2MyMmRlNGZhNTdmODc5NWNkY2ZmYTplNmZiNGNlZjYzYWJiMzllMGRjNzhjZDlkODcyNmIxZDUyOWI2ZjA0ZWY4ZWFmMzA0NDAwMDRlMDA2NjljODUwOjA0ZTE5ODY1YmQyMWZlMTM0ZjU5ZTFmY2NkMzVhNWE2M2U5MTFlMmJjNDcyM2QyMzg1NTViNDZjOTZjYjg4NzYiLAogICAgICAgICAgICAiMDZjYTYwNzU2MDBhZGYwNDA2YzQyYzFmNDU0MjEwMTU2YzdkMWQ1NWZmMTBkNTMzMjBhMjJjOGMxYWE4ZGVjOToxNzVmMmU0OGU3NzdkYzMwZjNlMjgzOWQzOGZiMGU3ODZmOTYwNTgyZjhjMjRkNWM4NTNlMTA1YTUzMTMwZjA2OmYzOWQ5MTE5YTBmZWMyMzQwYmRiNjBmZTZlN2Q0Zjk3ZWNmZDgzM2VlNDQ0OThiMjc2Mzk5MDdhNzdiMzYyZjg6MDY4M2MzMDZmNTk1ZGFmNzgxOTFlOTk5NjM0NDM4NDg4NzM4YjQ1NmRlNWJjY2Q2MGJkMDgyMWFkNzczNWY3MDoyZGRkMTBlYmU4MDk0NzdjMTBkZmQ2NzEzNWNiY2RmZWRmODEyYTgwZGZhM2MyZjA3NzhiYTE1NzM1YTc2OTRiOmRkZWI1YTlkMzk4MTYzYjliODVkNWI4MjNlYTkyMDkxMTJhYTlhZTk5OWRkNjY2ODQ4ZjEwMTU0NTAxMDY1YTE6MzMwMjM4YmI0MGVlYWQ3MTc5ZDI3Yzg3MmEyNTlhMDU4NmVhZjdlZjNkOTdkN2Q0YzEwMjI3ZmY5NmZmN2U4MyIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChjcGF0aCkvJChidW5kbGUtaWQpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAibG9jYWwiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogImxvY2FsIiwKICAgICAgICAgICJmc3R5cGUiOiAibG9jYWwiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICJtb2RlPTA3NzciCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIl4kKGNwYXRoKS8kKHNhbmRib3gtaWQpL2xvY2FsL2NvbmZpZyQiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJsb2NhbCIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAibG9jYWwiLAogICAgICAgICAgImZzdHlwZSI6ICJsb2NhbCIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIm1vZGU9MDc3NyIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiXiQoY3BhdGgpLyQoc2FuZGJveC1pZCkvbG9jYWwvd29ya2RpciQiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0KICAgICAgXSwKICAgICAgInNhbmRib3hfcGlkbnMiOiBmYWxzZSwKICAgICAgImV4ZWNfY29tbWFuZHMiOiBbXQogICAgfSwKICAgIHsKICAgICAgIk9DSSI6IHsKICAgICAgICAiVmVyc2lvbiI6ICIxLjEuMC1yYy4xIiwKICAgICAgICAiUHJvY2VzcyI6IHsKICAgICAgICAgICJUZXJtaW5hbCI6IGZhbHNlLAogICAgICAgICAgIlVzZXIiOiB7CiAgICAgICAgICAgICJVSUQiOiAwLAogICAgICAgICAgICAiR0lEIjogMCwKICAgICAgICAgICAgIkFkZGl0aW9uYWxHaWRzIjogW10sCiAgICAgICAgICAgICJVc2VybmFtZSI6ICIiCiAgICAgICAgICB9LAogICAgICAgICAgIkFyZ3MiOiBbCiAgICAgICAgICAgICIvZW50cnlwb2ludC5zaCIsCiAgICAgICAgICAgICItLWRlZmF1bHRzLWZpbGU9L2V0Yy9teXNxbC9teS1nYWxlcmEuY25mIiwKICAgICAgICAgICAgIi0tdXNlcj1yb290IgogICAgICAgICAgXSwKICAgICAgICAgICJFbnYiOiBbCiAgICAgICAgICAgICJQQVRIPS91c3IvbG9jYWwvc2JpbjovdXNyL2xvY2FsL2JpbjovdXNyL3NiaW46L3Vzci9iaW46L3NiaW46L2JpbiIsCiAgICAgICAgICAgICJWRVJTSU9OPTIwMTYwMzAzIiwKICAgICAgICAgICAgIkRFQklBTl9GUk9OVEVORD1ub25pbnRlcmFjdGl2ZSIsCiAgICAgICAgICAgICJIT1NUTkFNRT0kKGhvc3QtbmFtZSkiCiAgICAgICAgICBdLAogICAgICAgICAgIkN3ZCI6ICIvIiwKICAgICAgICAgICJDYXBhYmlsaXRpZXMiOiB7CiAgICAgICAgICAgICJBbWJpZW50IjogW10sCiAgICAgICAgICAgICJCb3VuZGluZyI6IFsKICAgICAgICAgICAgICAiJChkZWZhdWx0X2NhcHMpIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiRWZmZWN0aXZlIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJJbmhlcml0YWJsZSI6IFtdLAogICAgICAgICAgICAiUGVybWl0dGVkIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICAiTm9OZXdQcml2aWxlZ2VzIjogZmFsc2UKICAgICAgICB9LAogICAgICAgICJSb290IjogewogICAgICAgICAgIlBhdGgiOiAiJChjcGF0aCkvJChidW5kbGUtaWQpIiwKICAgICAgICAgICJSZWFkb25seSI6IGZhbHNlCiAgICAgICAgfSwKICAgICAgICAiTW91bnRzIjogWwogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL3Byb2MiLAogICAgICAgICAgICAic291cmNlIjogInByb2MiLAogICAgICAgICAgICAidHlwZV8iOiAicHJvYyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYiLAogICAgICAgICAgICAic291cmNlIjogInRtcGZzIiwKICAgICAgICAgICAgInR5cGVfIjogInRtcGZzIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgInN0cmljdGF0aW1lIiwKICAgICAgICAgICAgICAibW9kZT03NTUiLAogICAgICAgICAgICAgICJzaXplPTY1NTM2ayIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvcHRzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJkZXZwdHMiLAogICAgICAgICAgICAidHlwZV8iOiAiZGV2cHRzIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAgICAgIm5ld2luc3RhbmNlIiwKICAgICAgICAgICAgICAicHRteG1vZGU9MDY2NiIsCiAgICAgICAgICAgICAgIm1vZGU9MDYyMCIsCiAgICAgICAgICAgICAgImdpZD01IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi9zaG0iLAogICAgICAgICAgICAic291cmNlIjogIi9ydW4va2F0YS1jb250YWluZXJzL3NhbmRib3gvc2htIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L21xdWV1ZSIsCiAgICAgICAgICAgICJzb3VyY2UiOiAibXF1ZXVlIiwKICAgICAgICAgICAgInR5cGVfIjogIm1xdWV1ZSIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9zeXMiLAogICAgICAgICAgICAic291cmNlIjogInN5c2ZzIiwKICAgICAgICAgICAgInR5cGVfIjogInN5c2ZzIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAgICAgIm5vZGV2IiwKICAgICAgICAgICAgICAicm8iCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvc3lzL2ZzL2Nncm91cCIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiY2dyb3VwIiwKICAgICAgICAgICAgInR5cGVfIjogImNncm91cCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIsCiAgICAgICAgICAgICAgInJlbGF0aW1lIiwKICAgICAgICAgICAgICAicm8iCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZXRjL2hvc3RzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KWhvc3RzJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJydyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvdGVybWluYXRpb24tbG9nIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KXRlcm1pbmF0aW9uLWxvZyQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicnciCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZXRjL2hvc3RuYW1lIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KWhvc3RuYW1lJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJydyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9ldGMvcmVzb2x2LmNvbmYiLAogICAgICAgICAgICAic291cmNlIjogIiQoc2ZwcmVmaXgpcmVzb2x2LmNvbmYkIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJ3IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL3Zhci9ydW4vc2VjcmV0cy9rdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50IiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KXNlcnZpY2VhY2NvdW50JCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJybyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi92YXIvcnVuL3NlY3JldHMvYXp1cmUvdG9rZW5zIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KXRva2VucyQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicm8iCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZXRjL215c3FsIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJeJChjcGF0aCkvJChzYW5kYm94LWlkKS9sb2NhbC9jb25maWckIiwKICAgICAgICAgICAgInR5cGVfIjogImxvY2FsIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJydyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi92YXIvbGliLyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiXi9ydW4va2F0YS1jb250YWluZXJzL3NoYXJlZC9jb250YWluZXJzLyQoYnVuZGxlLWlkKS1bYS16MC05XXsxNn0tbGliJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJydyIKICAgICAgICAgICAgXQogICAgICAgICAgfQogICAgICAgIF0sCiAgICAgICAgIkFubm90YXRpb25zIjogewogICAgICAgICAgImlvLmthdGFjb250YWluZXJzLnBrZy5vY2kuYnVuZGxlX3BhdGgiOiAiL3J1bi9jb250YWluZXJkL2lvLmNvbnRhaW5lcmQucnVudGltZS52Mi50YXNrL2s4cy5pby8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgImlvLmthdGFjb250YWluZXJzLnBrZy5vY2kuY29udGFpbmVyX3R5cGUiOiAicG9kX2NvbnRhaW5lciIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLW5hbWUiOiAibXlzcWwiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLmNvbnRhaW5lci10eXBlIjogImNvbnRhaW5lciIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuaW1hZ2UtbmFtZSI6ICJyZWdpc3RyeS5rOHMuaW8vbXlzcWwtZ2FsZXJhOmUyZSIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCI6ICJeW2EtejAtOV17NjR9JCIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1uYW1lc3BhY2UiOiAiZGVmYXVsdCIKICAgICAgICB9LAogICAgICAgICJMaW51eCI6IHsKICAgICAgICAgICJOYW1lc3BhY2VzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgIlR5cGUiOiAiaXBjIiwKICAgICAgICAgICAgICAiUGF0aCI6ICIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiVHlwZSI6ICJ1dHMiLAogICAgICAgICAgICAgICJQYXRoIjogIiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJUeXBlIjogIm1vdW50IiwKICAgICAgICAgICAgICAiUGF0aCI6ICIiCiAgICAgICAgICAgIH0KICAgICAgICAgIF0sCiAgICAgICAgICAiTWFza2VkUGF0aHMiOiBbCiAgICAgICAgICAgICIvcHJvYy9hY3BpIiwKICAgICAgICAgICAgIi9wcm9jL2tjb3JlIiwKICAgICAgICAgICAgIi9wcm9jL2tleXMiLAogICAgICAgICAgICAiL3Byb2MvbGF0ZW5jeV9zdGF0cyIsCiAgICAgICAgICAgICIvcHJvYy90aW1lcl9saXN0IiwKICAgICAgICAgICAgIi9wcm9jL3RpbWVyX3N0YXRzIiwKICAgICAgICAgICAgIi9wcm9jL3NjaGVkX2RlYnVnIiwKICAgICAgICAgICAgIi9wcm9jL3Njc2kiLAogICAgICAgICAgICAiL3N5cy9maXJtd2FyZSIKICAgICAgICAgIF0sCiAgICAgICAgICAiUmVhZG9ubHlQYXRocyI6IFsKICAgICAgICAgICAgIi9wcm9jL2Fzb3VuZCIsCiAgICAgICAgICAgICIvcHJvYy9idXMiLAogICAgICAgICAgICAiL3Byb2MvZnMiLAogICAgICAgICAgICAiL3Byb2MvaXJxIiwKICAgICAgICAgICAgIi9wcm9jL3N5cyIsCiAgICAgICAgICAgICIvcHJvYy9zeXNycS10cmlnZ2VyIgogICAgICAgICAgXQogICAgICAgIH0KICAgICAgfSwKICAgICAgInN0b3JhZ2VzIjogWwogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2gwKSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjApIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2gxKSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjEpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2gyKSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjIpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2gzKSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjMpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2g0KSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjQpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2g1KSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjUpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2g2KSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjYpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2g3KSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjcpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2g4KSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjgpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2g5KSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjkpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2gxMCkiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXIxMCkiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJibGsiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogInRhciIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIiQoaGFzaDExKSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjExKSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoMTIpIgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGxheWVyMTIpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAib3ZlcmxheWZzIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJmdXNlMy5rYXRhLW92ZXJsYXkiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIyNTA2MDJhZDYxZGM1ZWQzMzU0ZTA2MDMwNGFlMjkxOTAzMTE5NDZiYzU1NTUwNTFlNjc3YmQ5N2Y3ZTQ1ZTQ4OjQwZmE5OTRhODVjMGFjZmMzNmVlMWM2NWE5MWUwZDgzYmFjZGE1OWM1YmEyZjhiZDg1MDgxMDFiODc4NGIxMTY6ZWRlMGQ5OTE2NDJkNzg0OTdmOTQ0MjY5MTVhODhhNDJkM2U4NjI2MTU5Nzg0ZmRhNDczMDBmZTE3ZjQxOTdjOTplYjJiNWY3N2FkZmMyNmFiMzI4NDQ1MDQzZWEwZTMwMDkwMzQwYTFjZTcxMWQ1MmVkZTU2OGFjYTBmYTkxNjNjOjgyNWUzNWY5NzAyZWRlNDE2MzkwZmI4ZGE2MDliNDI2OThmMzgyZjllY2NlNWNmZGIwZDQzYmIzMmNkMjkwYTM6YzViMTM2ZDMxN2QzODI0MjEzM2Y3NDc3NGUzZGM1OTcyOGE0YTI5Nzc3NWE4YWM5N2RlMmIxYmUyOWMyMjBkMDpjOGYwYjhiNTg4YjM4NjRjYmUyY2M4NjFmZDBjYmE2NWEwNGEzZTRkNmZjYTEwNmExNDM4ZWY2Mjg1YzE2ZDUzOjcxMDQ1OWM2ODJkOWMyOTBmNWVhMjc2OWEyNTdmYTcyYTkwNjAzYWFlMWQ2Mzc4NGYwM2VmMDc1MGUzZGRjMzA6ODRlN2VkYWUzNzUyYjlhNzRkYzc1MDM0YjM2ZDUyMGMwNmRmNjIzMGFjNjkxZTQ0N2FkN2MwNmFhMDYxZWIxOTpjNTA3ZjkzMjM2NWFlMzk5NDhhMDdiMjlmZDk5YWVkZTlhNTljMjNkZjM3NjY0ZWMzYjg5MWZhNWQ5ZmU5OGI1OmEyZTY4NGVhNjdlMmNkMWJjMWE0Mzg4NDljODJmOGQ5YmRlZDZiZjM5MDY4NzZkM2I0NTQ1YWYxZmU4N2E2MDc6OWFjNDdlM2U3NjhkY2VkNDllMWRiMjZjNDVjMGEyYjI2ZWY1YmIzMGMwMzIzZTc2YjVjYTRiYjBiODYwN2FkNTpiYzQzMTVjZGY3NDE3YzFjNWIzN2ZkNjcxNDc2MTNmZjJhNmZjOWQwOWJlMzZlMmQzNTExZGE1OGE1OTQ3YzZhIiwKICAgICAgICAgICAgIjAwZDNmMjhiMjU5ODU3ZDA1MmI3YTAyMmJiMTcyZTJlY2E3MWU2ZTdlYmQ3MjhjNmVmYmZjNDAzMzUwMzM1ZTQ6ZDRmMGFjZTY3YmI3ZTE3MmRmYWFkZTA0OWRiMDMwY2E4NDkwNTBhYzliNGE2NjA1YWIyYTc3Yjg1NGQ2NTAzYjo2MGY4ODAxZDhmNjZjYTNlYzRhYWFlYWY5ZjhjYjVmZTY3ZTM5YzRjNTc3NTNlNDVjMWVmZTVmMWRiOTI1YjAzOjhiNTM0ODU2N2QzZmEzZGY5N2Q4ZThlNWNkMmQ4MDcxZGEyMzM4ZDlkZDg2NWQzNTE2MjgzM2QyMDAwZjI3Njg6MWRkOGMzY2IwNWFiNmRjOTljODkzNzg1OTZiMTgxNWVlYzdiMmE1OTk0MTQ2ZDNkMGZmM2IyOTY4ZTVkMmZlNDplNWY3NjQ0YWY2NjdmZTQ4NWE2MzBmMDkzY2I1YTIxNDYyZWExZTI1NGZjM2ZjMjk2ZTBhM2I4YzNhNWVkMThmOjE1NjgyNDVkNTcyMWFiZTU3MmI4ZjcxNGMxZWE3MWUyZTkxYTVkMTY4NzVmMGVlNTNmMTI5ODEyMWFlZTkzMjQ6OGE5NTg2NzM0NGY0MGY3MWZmYjBkYTY4MThjY2ExMGY4ZWFjYmQ5YjQwYjZmZDdkYzc5MWE5YzIwYWNmZjkyZjoyZTQ5ZjFiOTU5ZTAwNDljYmE3YzgwZGIyZjM3ZjYyMzZiYWRjMTQ0OWMxNmIyMGViOTBkN2IwYzlhMjAxODU1OmIzYzk2ZjNkNWI1Y2I0MzQ1OTIzZTgyZDcwOWFlMGZmOTA1ZDg5Mjc3ZDFjMDliZWZiYzI3N2UwNzM1ZmU1OWQ6MWJlMjFiMTAwNWQxYmY1MjliMDNlYmE2NGNjNGIwNGZmZTZiMGY3NjE2MDNjOGE0NzU3MGYxYTczNDFhYzExODo1Nzk5YjY4MGIzYjUxZjc2ZDUxNWYwYzAzNzY5ZTUwMWI1Yjg5NTY1NzA2NGZmZjFkZDA4MzZiOThkNjMwNzg3OjgyMmQ1MDhhZDU0ZWNjZDJmY2ViNGI3ZDZjZDVjZjAzNzVmZjAzNGE1ZTYwYTA4ZGUyMjY5M2Q4MWEwMjAzMGQiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQoY3BhdGgpLyQoYnVuZGxlLWlkKSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImxvY2FsIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICJsb2NhbCIsCiAgICAgICAgICAiZnN0eXBlIjogImxvY2FsIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAibW9kZT0wNzc3IgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICJeJChjcGF0aCkvJChzYW5kYm94LWlkKS9sb2NhbC9jb25maWckIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9CiAgICAgIF0sCiAgICAgICJzYW5kYm94X3BpZG5zIjogZmFsc2UsCiAgICAgICJleGVjX2NvbW1hbmRzIjogWwogICAgICAgICJzaCAtYyBteXNxbCAtdSByb290IC1lICdzaG93IGRhdGFiYXNlczsnIgogICAgICBdCiAgICB9CiAgXSwKICAiY29tbW9uIjogewogICAgImNwYXRoIjogIi9ydW4va2F0YS1jb250YWluZXJzL3NoYXJlZC9jb250YWluZXJzIiwKICAgICJzZnByZWZpeCI6ICJeJChjcGF0aCkvJChidW5kbGUtaWQpLVthLXowLTldezE2fS0iLAogICAgImlwdjRfYSI6ICIoKDI1WzAtNV18KDJbMC00XXwxXFxkfFsxLTldfClcXGQpXFwuP1xcYil7NH0iLAogICAgImlwX3AiOiAiWzAtOV17MSw1fSIsCiAgICAic3ZjX25hbWUiOiAiW0EtWjAtOV9cXC5cXC1dKyIsCiAgICAiZG5zX2xhYmVsIjogIlthLXpBLVowLTlfXFwuXFwtXSsiLAogICAgImRlZmF1bHRfY2FwcyI6IFsKICAgICAgIkNBUF9DSE9XTiIsCiAgICAgICJDQVBfREFDX09WRVJSSURFIiwKICAgICAgIkNBUF9GU0VUSUQiLAogICAgICAiQ0FQX0ZPV05FUiIsCiAgICAgICJDQVBfTUtOT0QiLAogICAgICAiQ0FQX05FVF9SQVciLAogICAgICAiQ0FQX1NFVEdJRCIsCiAgICAgICJDQVBfU0VUVUlEIiwKICAgICAgIkNBUF9TRVRGQ0FQIiwKICAgICAgIkNBUF9TRVRQQ0FQIiwKICAgICAgIkNBUF9ORVRfQklORF9TRVJWSUNFIiwKICAgICAgIkNBUF9TWVNfQ0hST09UIiwKICAgICAgIkNBUF9LSUxMIiwKICAgICAgIkNBUF9BVURJVF9XUklURSIKICAgIF0sCiAgICAicHJpdmlsZWdlZF9jYXBzIjogWwogICAgICAiQ0FQX0NIT1dOIiwKICAgICAgIkNBUF9EQUNfT1ZFUlJJREUiLAogICAgICAiQ0FQX0RBQ19SRUFEX1NFQVJDSCIsCiAgICAgICJDQVBfRk9XTkVSIiwKICAgICAgIkNBUF9GU0VUSUQiLAogICAgICAiQ0FQX0tJTEwiLAogICAgICAiQ0FQX1NFVEdJRCIsCiAgICAgICJDQVBfU0VUVUlEIiwKICAgICAgIkNBUF9TRVRQQ0FQIiwKICAgICAgIkNBUF9MSU5VWF9JTU1VVEFCTEUiLAogICAgICAiQ0FQX05FVF9CSU5EX1NFUlZJQ0UiLAogICAgICAiQ0FQX05FVF9CUk9BRENBU1QiLAogICAgICAiQ0FQX05FVF9BRE1JTiIsCiAgICAgICJDQVBfTkVUX1JBVyIsCiAgICAgICJDQVBfSVBDX0xPQ0siLAogICAgICAiQ0FQX0lQQ19PV05FUiIsCiAgICAgICJDQVBfU1lTX01PRFVMRSIsCiAgICAgICJDQVBfU1lTX1JBV0lPIiwKICAgICAgIkNBUF9TWVNfQ0hST09UIiwKICAgICAgIkNBUF9TWVNfUFRSQUNFIiwKICAgICAgIkNBUF9TWVNfUEFDQ1QiLAogICAgICAiQ0FQX1NZU19BRE1JTiIsCiAgICAgICJDQVBfU1lTX0JPT1QiLAogICAgICAiQ0FQX1NZU19OSUNFIiwKICAgICAgIkNBUF9TWVNfUkVTT1VSQ0UiLAogICAgICAiQ0FQX1NZU19USU1FIiwKICAgICAgIkNBUF9TWVNfVFRZX0NPTkZJRyIsCiAgICAgICJDQVBfTUtOT0QiLAogICAgICAiQ0FQX0xFQVNFIiwKICAgICAgIkNBUF9BVURJVF9XUklURSIsCiAgICAgICJDQVBfQVVESVRfQ09OVFJPTCIsCiAgICAgICJDQVBfU0VURkNBUCIsCiAgICAgICJDQVBfTUFDX09WRVJSSURFIiwKICAgICAgIkNBUF9NQUNfQURNSU4iLAogICAgICAiQ0FQX1NZU0xPRyIsCiAgICAgICJDQVBfV0FLRV9BTEFSTSIsCiAgICAgICJDQVBfQkxPQ0tfU1VTUEVORCIsCiAgICAgICJDQVBfQVVESVRfUkVBRCIsCiAgICAgICJDQVBfUEVSRk1PTiIsCiAgICAgICJDQVBfQlBGIiwKICAgICAgIkNBUF9DSEVDS1BPSU5UX1JFU1RPUkUiCiAgICBdCiAgfSwKICAic2FuZGJveCI6IHsKICAgICJzdG9yYWdlcyI6IFsKICAgICAgewogICAgICAgICJkcml2ZXIiOiAiZXBoZW1lcmFsIiwKICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAic291cmNlIjogInNobSIsCiAgICAgICAgImZzdHlwZSI6ICJ0bXBmcyIsCiAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgIm5vZGV2IiwKICAgICAgICAgICJtb2RlPTE3NzciLAogICAgICAgICAgInNpemU9NjcxMDg4NjQiCiAgICAgICAgXSwKICAgICAgICAibW91bnRfcG9pbnQiOiAiL3J1bi9rYXRhLWNvbnRhaW5lcnMvc2FuZGJveC9zaG0iLAogICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgfQogICAgXQogIH0sCiAgInJlcXVlc3RfZGVmYXVsdHMiOiB7CiAgICAiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdCI6IHsKICAgICAgImFsbG93X2Vudl9yZWdleCI6IFsKICAgICAgICAiXkhPU1ROQU1FPSQoZG5zX2xhYmVsKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfUE9SVF8kKGlwX3ApX1RDUD10Y3A6Ly8kKGlwdjRfYSk6JChpcF9wKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfUE9SVF8kKGlwX3ApX1RDUF9QUk9UTz10Y3AkIiwKICAgICAgICAiXiQoc3ZjX25hbWUpX1BPUlRfJChpcF9wKV9UQ1BfUE9SVD0kKGlwX3ApJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9QT1JUXyQoaXBfcClfVENQX0FERFI9JChpcHY0X2EpJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9TRVJWSUNFX0hPU1Q9JChpcHY0X2EpJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9TRVJWSUNFX1BPUlQ9JChpcF9wKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfU0VSVklDRV9QT1JUXyQoZG5zX2xhYmVsKT0kKGlwX3ApJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9QT1JUPXRjcDovLyQoaXB2NF9hKTokKGlwX3ApJCIsCiAgICAgICAgIl5BWlVSRV9DTElFTlRfSUQ9W0EtRmEtZjAtOS1dKiQiLAogICAgICAgICJeQVpVUkVfVEVOQU5UX0lEPVtBLUZhLWYwLTktXSokIiwKICAgICAgICAiXkFaVVJFX0ZFREVSQVRFRF9UT0tFTl9GSUxFPS92YXIvcnVuL3NlY3JldHMvYXp1cmUvdG9rZW5zL2F6dXJlLWlkZW50aXR5LXRva2VuJCIsCiAgICAgICAgIl5BWlVSRV9BVVRIT1JJVFlfSE9TVD1odHRwczovL2xvZ2luXFwubWljcm9zb2Z0b25saW5lXFwuY29tLyQiCiAgICAgIF0KICAgIH0sCiAgICAiQ29weUZpbGVSZXF1ZXN0IjogWwogICAgICAiJChzZnByZWZpeCkiCiAgICBdLAogICAgIkV4ZWNQcm9jZXNzUmVxdWVzdCI6IHsKICAgICAgImNvbW1hbmRzIjogW10sCiAgICAgICJyZWdleCI6IFtdCiAgICB9LAogICAgIkNsb3NlU3RkaW5SZXF1ZXN0IjogZmFsc2UsCiAgICAiUmVhZFN0cmVhbVJlcXVlc3QiOiB0cnVlLAogICAgIlVwZGF0ZUVwaGVtZXJhbE1vdW50c1JlcXVlc3QiOiBmYWxzZSwKICAgICJXcml0ZVN0cmVhbVJlcXVlc3QiOiBmYWxzZQogIH0KfQ== + spec: + runtimeClassName: kata-cc + initContainers: + - name: install + image: "registry.k8s.io/galera-install:0.1" + imagePullPolicy: Always + args: + - "--work-dir=/work-dir" + volumeMounts: + - name: workdir + mountPath: /work-dir + - name: config + mountPath: /etc/mysql + - name: bootstrap + image: "docker.io/library/debian:jessie" + command: + - /work-dir/peer-finder + args: + - "-on-start=\"/work-dir/on-start.sh\"" + - "-service=galera" + env: + - name: POD_NAMESPACE + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: metadata.namespace + volumeMounts: + - name: workdir + mountPath: /work-dir + - name: config + mountPath: /etc/mysql + containers: + - name: mysql + image: "registry.k8s.io/mysql-galera:e2e" + ports: + - containerPort: 3306 + name: mysql + - containerPort: 4444 + name: sst + - containerPort: 4567 + name: replication + - containerPort: 4568 + name: ist + args: + - "--defaults-file=/etc/mysql/my-galera.cnf" + - "--user=root" + readinessProbe: + exec: + command: + - sh + - "-c" + - "mysql -u root -e 'show databases;'" + initialDelaySeconds: 15 + timeoutSeconds: 5 + successThreshold: 2 + volumeMounts: + - name: datadir + mountPath: /var/lib/ + - name: config + mountPath: /etc/mysql + volumes: + - name: config + emptyDir: {} + - name: workdir + emptyDir: {} + volumeClaimTemplates: + - metadata: + name: datadir + spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi diff --git a/src/agent/samples/policy/yaml/kubernetes/unsupported-image/redis-slave-controller.yaml b/src/agent/samples/policy/yaml/kubernetes/unsupported-image/redis-slave-controller.yaml new file mode 100644 index 000000000000..b3f3b45ee7b9 --- /dev/null +++ b/src/agent/samples/policy/yaml/kubernetes/unsupported-image/redis-slave-controller.yaml @@ -0,0 +1,38 @@ +--- +apiVersion: v1 +kind: ReplicationController +metadata: + name: redis-slave + labels: + app: redis + role: slave + tier: backend +spec: + replicas: 2 + template: + metadata: + labels: + app: redis + role: slave + tier: backend + annotations: + io.katacontainers.config.agent.policy: cGFja2FnZSBhZ2VudF9wb2xpY3kKCmltcG9ydCBmdXR1cmUua2V5d29yZHMuaW4KaW1wb3J0IGZ1dHVyZS5rZXl3b3Jkcy5ldmVyeQoKaW1wb3J0IGlucHV0CgojIFJlcXVlc3RzIHRoYXQgYXJlIGFsd2F5cyBhbGxvd2VkLgpkZWZhdWx0IENyZWF0ZVNhbmRib3hSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBEZXN0cm95U2FuZGJveFJlcXVlc3QgOj0gdHJ1ZQpkZWZhdWx0IEdldE9PTUV2ZW50UmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgR3Vlc3REZXRhaWxzUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgT25saW5lQ1BVTWVtUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgUHVsbEltYWdlUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgUmVtb3ZlQ29udGFpbmVyUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgUmVtb3ZlU3RhbGVWaXJ0aW9mc1NoYXJlTW91bnRzUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgU2lnbmFsUHJvY2Vzc1JlcXVlc3QgOj0gdHJ1ZQpkZWZhdWx0IFN0YXJ0Q29udGFpbmVyUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgU3RhdHNDb250YWluZXJSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBUdHlXaW5SZXNpemVSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBVcGRhdGVFcGhlbWVyYWxNb3VudHNSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBVcGRhdGVJbnRlcmZhY2VSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBVcGRhdGVSb3V0ZXNSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBXYWl0UHJvY2Vzc1JlcXVlc3QgOj0gdHJ1ZQoKIyBDb25maWd1cmUgdGhlIEFnZW50IHRvICphbGxvdyBhbnkgcmVxdWVzdHMgY2F1c2luZyBhIHBvbGljeSBmYWlsdXJlKi4KIyBUaGlzIGlzIGFuIHVuc2VjdXJlIGNvbmZpZ3VyYXRpb24gYnV0IGlzIHVzZWZ1bCBmb3IgYWxsb3dpbmcgdW5zZWN1cmUKIyBwb2RzIHRvIHN0YXJ0LCB0aGVuIGNvbm5lY3QgdG8gdGhlbSBhbmQgaW5zcGVjdCBPUEEgbG9ncyBmb3IgdGhlIHJvb3QKIyBjYXVzZSBvZiBhIGZhaWx1cmUuCiMgZGVmYXVsdCBBbGxvd1JlcXVlc3RzRmFpbGluZ1BvbGljeSA6PSB0cnVlCgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCkNyZWF0ZUNvbnRhaW5lclJlcXVlc3QgewogICAgc29tZSBwb2xpY3lfY29udGFpbmVyIGluIHBvbGljeV9kYXRhLmNvbnRhaW5lcnMKCiAgICBwb2xpY3lfb2NpIDo9IHBvbGljeV9jb250YWluZXIuT0NJCiAgICBwb2xpY3lfc3RvcmFnZXMgOj0gcG9saWN5X2NvbnRhaW5lci5zdG9yYWdlcwoKICAgIGlucHV0X29jaSA6PSBpbnB1dC5PQ0kKICAgIGlucHV0X3N0b3JhZ2VzIDo9IGlucHV0LnN0b3JhZ2VzCgogICAgcHJpbnQoIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iKQogICAgcHJpbnQoIkNyZWF0ZUNvbnRhaW5lclJlcXVlc3Q6IG9jaSBWZXJzaW9uIikKICAgIHBvbGljeV9vY2kuVmVyc2lvbiAgICAgPT0gaW5wdXRfb2NpLlZlcnNpb24KCiAgICBwcmludCgiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdDogcG9saWN5X29jaS5Sb290LlJlYWRvbmx5IikKICAgIHBvbGljeV9vY2kuUm9vdC5SZWFkb25seSAgPT0gaW5wdXRfb2NpLlJvb3QuUmVhZG9ubHkKCiAgICBwcmludCgiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdDogYWxsb3cgYW5ub3RhdGlvbnMiKQogICAgYWxsb3dfYW5ub3RhdGlvbnMocG9saWN5X29jaSwgaW5wdXRfb2NpKQoKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0OiBhbGxvd19ieV9hbm5vdGF0aW9ucyIpCiAgICBhbGxvd19ieV9hbm5vdGF0aW9ucyhwb2xpY3lfb2NpLCBpbnB1dF9vY2ksIHBvbGljeV9zdG9yYWdlcywgaW5wdXRfc3RvcmFnZXMpCgogICAgcHJpbnQoIkNyZWF0ZUNvbnRhaW5lclJlcXVlc3Q6IGFsbG93X2xpbnV4IikKICAgIGFsbG93X2xpbnV4KHBvbGljeV9vY2ksIGlucHV0X29jaSkKCiAgICBwcmludCgiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdDogc3VjY2VzcyIpCn0KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBSZWplY3QgdW5leHBlY3RlZCBhbm5vdGF0aW9ucy4KYWxsb3dfYW5ub3RhdGlvbnMocG9saWN5X29jaSwgaW5wdXRfb2NpKSB7CiAgICBub3QgaW5wdXRfb2NpLkFubm90YXRpb25zCn0KYWxsb3dfYW5ub3RhdGlvbnMocG9saWN5X29jaSwgaW5wdXRfb2NpKSB7CiAgICBpbnB1dF9rZXlzIDo9IG9iamVjdC5rZXlzKGlucHV0X29jaS5Bbm5vdGF0aW9ucykKCiAgICBldmVyeSBpbnB1dF9rZXkgaW4gaW5wdXRfa2V5cyB7CiAgICAgICAgcHJpbnQoImFsbG93X2Fubm90YXRpb25zOiBjaGVja2luZyBpbnB1dCBrZXkgPSIsIGlucHV0X2tleSkKICAgICAgICBhbGxvd19hbm5vdGF0aW9uX2tleShpbnB1dF9rZXksIHBvbGljeV9vY2kpCiAgICB9Cn0KCmFsbG93X2Fubm90YXRpb25fa2V5KGlucHV0X2tleSwgcG9saWN5X29jaSkgewogICAgc3RhcnRzd2l0aChpbnB1dF9rZXksICJpby5rdWJlcm5ldGVzLmNyaS4iKQp9CmFsbG93X2Fubm90YXRpb25fa2V5KGlucHV0X2tleSwgcG9saWN5X29jaSkgewogICAgc29tZSBwb2xpY3lfa2V5LCBfIGluIHBvbGljeV9vY2kuQW5ub3RhdGlvbnMKICAgIHBvbGljeV9rZXkgPT0gaW5wdXRfa2V5Cn0KCgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgR2V0ICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LW5hbWUiLCBhbmQgY29ycmVsYXRlIGl0cyB2YWx1ZSB3aXRoIG90aGVyCiMgYW5ub3RhdGlvbnMgYW5kIHByb2Nlc3MgZmllbGRzLgoKYWxsb3dfYnlfYW5ub3RhdGlvbnMocG9saWN5X29jaSwgaW5wdXRfb2NpLCBwb2xpY3lfc3RvcmFnZXMsIGlucHV0X3N0b3JhZ2VzKSB7CiAgICBwcmludCgiYWxsb3dfYnlfYW5ub3RhdGlvbnMgMTogbm8gaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1uYW1lIGluIHBvbGljeSIpCiAgICBub3QgcG9saWN5X29jaS5Bbm5vdGF0aW9uc1siaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1uYW1lIl0KCiAgICBpbnB1dF9zYW5kYm94X25hbWUgOj0gaW5wdXRfb2NpLkFubm90YXRpb25zWyJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LW5hbWUiXQoKICAgIHByaW50KCJhbGxvd19ieV9hbm5vdGF0aW9ucyAxOiBhbGxvd19ieV9zYW5kYm94X25hbWUiLCBpbnB1dF9zYW5kYm94X25hbWUpCiAgICBhbGxvd19ieV9zYW5kYm94X25hbWUocG9saWN5X29jaSwgaW5wdXRfb2NpLCBwb2xpY3lfc3RvcmFnZXMsIGlucHV0X3N0b3JhZ2VzLCBpbnB1dF9zYW5kYm94X25hbWUpCgogICAgcHJpbnQoImFsbG93X2J5X2Fubm90YXRpb25zIDE6IHN1Y2Nlc3MiKQp9CmFsbG93X2J5X2Fubm90YXRpb25zKHBvbGljeV9vY2ksIGlucHV0X29jaSwgcG9saWN5X3N0b3JhZ2VzLCBpbnB1dF9zdG9yYWdlcykgewogICAgcHJpbnQoImFsbG93X2J5X2Fubm90YXRpb25zIDI6IGlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZSIpCiAgICBwb2xpY3lfc2FuZGJveF9uYW1lIDo9IHBvbGljeV9vY2kuQW5ub3RhdGlvbnNbImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZSJdCiAgICBpbnB1dF9zYW5kYm94X25hbWUgOj0gaW5wdXRfb2NpLkFubm90YXRpb25zWyJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LW5hbWUiXQoKICAgIHByaW50KCJhbGxvd19ieV9hbm5vdGF0aW9ucyAyOiBpbnB1dCBzYW5kYm94ID0iLCBpbnB1dF9zYW5kYm94X25hbWUsICJwb2xpY3kgc2FuZGJveCA9IiwgcG9saWN5X3NhbmRib3hfbmFtZSkKICAgIGFsbG93X3NhbmRib3hfbmFtZShwb2xpY3lfc2FuZGJveF9uYW1lLCBpbnB1dF9zYW5kYm94X25hbWUpCgogICAgcHJpbnQoImFsbG93X2J5X2Fubm90YXRpb25zIDI6IGFsbG93X2J5X3NhbmRib3hfbmFtZSIsIGlucHV0X3NhbmRib3hfbmFtZSkKICAgIGFsbG93X2J5X3NhbmRib3hfbmFtZShwb2xpY3lfb2NpLCBpbnB1dF9vY2ksIHBvbGljeV9zdG9yYWdlcywgaW5wdXRfc3RvcmFnZXMsIGlucHV0X3NhbmRib3hfbmFtZSkKCiAgICBwcmludCgiYWxsb3dfYnlfYW5ub3RhdGlvbnMgMjogc3VjY2VzcyIpCn0KCmFsbG93X2J5X3NhbmRib3hfbmFtZShwb2xpY3lfb2NpLCBpbnB1dF9vY2ksIHBvbGljeV9zdG9yYWdlcywgaW5wdXRfc3RvcmFnZXMsIHNhbmRib3hfbmFtZSkgewogICAgcHJpbnQoImFsbG93X2J5X3NhbmRib3hfbmFtZTogc3RhcnRpbmciKQoKICAgIHBvbGljeV9uYW1lc3BhY2UgOj0gcG9saWN5X29jaS5Bbm5vdGF0aW9uc1siaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1uYW1lc3BhY2UiXQogICAgaW5wdXRfbmFtZXNwYWNlIDo9IGlucHV0X29jaS5Bbm5vdGF0aW9uc1siaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1uYW1lc3BhY2UiXQogICAgcHJpbnQoImFsbG93X2J5X3NhbmRib3hfbmFtZTogcG9saWN5X25hbWVzcGFjZSA9IiwgcG9saWN5X25hbWVzcGFjZSwgImlucHV0X25hbWVzcGFjZSA9IiwgaW5wdXRfbmFtZXNwYWNlKQogICAgcG9saWN5X25hbWVzcGFjZSA9PSBpbnB1dF9uYW1lc3BhY2UKCiAgICBwcmludCgiYWxsb3dfYnlfc2FuZGJveF9uYW1lOiBhbGxvd19ieV9jb250YWluZXJfdHlwZXMiKQogICAgYWxsb3dfYnlfY29udGFpbmVyX3R5cGVzKHBvbGljeV9vY2ksIGlucHV0X29jaSwgc2FuZGJveF9uYW1lLCBwb2xpY3lfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd19ieV9zYW5kYm94X25hbWU6IGFsbG93X2J5X2J1bmRsZV9vcl9zYW5kYm94X2lkIikKICAgIGFsbG93X2J5X2J1bmRsZV9vcl9zYW5kYm94X2lkKHBvbGljeV9vY2ksIGlucHV0X29jaSwgcG9saWN5X3N0b3JhZ2VzLCBpbnB1dF9zdG9yYWdlcykKCiAgICBwcmludCgiYWxsb3dfYnlfc2FuZGJveF9uYW1lOiBhbGxvd19wcm9jZXNzIikKICAgIGFsbG93X3Byb2Nlc3MocG9saWN5X29jaSwgaW5wdXRfb2NpLCBzYW5kYm94X25hbWUpCgogICAgcHJpbnQoImFsbG93X2J5X3NhbmRib3hfbmFtZTogc3VjY2VzcyIpCn0KCmFsbG93X3NhbmRib3hfbmFtZShwb2xpY3lfc2FuZGJveF9uYW1lLCBpbnB1dF9zYW5kYm94X25hbWUpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X25hbWUgMTogc2FtZSBuYW1lIikKICAgIHBvbGljeV9zYW5kYm94X25hbWUgPT0gaW5wdXRfc2FuZGJveF9uYW1lCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9uYW1lIDE6IHN1Y2Nlc3MiKQp9CmFsbG93X3NhbmRib3hfbmFtZShwb2xpY3lfc2FuZGJveF9uYW1lLCBpbnB1dF9zYW5kYm94X25hbWUpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X25hbWUgMjogZ2VuZXJhdGVkIG5hbWUiKQoKICAgICMgVE9ETzogc2hvdWxkIGdlbmVyYXRlZCBuYW1lcyBiZSBoYW5kbGVkIGRpZmZlcmVudGx5PwogICAgY29udGFpbnMocG9saWN5X3NhbmRib3hfbmFtZSwgIiQoZ2VuZXJhdGVkLW5hbWUpIikKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9uYW1lIDI6IHN1Y2Nlc3MiKQp9CiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyAtIENoZWNrIHRoYXQgdGhlICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSIgYW5kCiMgICAiaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5jb250YWluZXJfdHlwZSIgYW5ub3RhdGlvbnMKIyAgIGRlc2lnbmF0ZSB0aGUgZXhwZWN0ZWQgdHlwZSAtIGVpdGhlciBhICJzYW5kYm94IiBvciBhCiMgICAiY29udGFpbmVyIiB0eXBlLgojCiMgLSBUaGVuLCB2YWxpZGF0ZSBvdGhlciBhbm5vdGF0aW9ucyBiYXNlZCBvbiB0aGUgYWN0dWFsCiMgICAic2FuZGJveCIgb3IgImNvbnRhaW5lciIgdmFsdWUgZnJvbSB0aGUgaW5wdXQgY29udGFpbmVyLgoKYWxsb3dfYnlfY29udGFpbmVyX3R5cGVzKHBvbGljeV9vY2ksIGlucHV0X29jaSwgc2FuZGJveF9uYW1lLCBzYW5kYm94X25hbWVzcGFjZSkgewogICAgcHJpbnQoImFsbG93X2J5X2NvbnRhaW5lcl90eXBlczogY2hlY2tpbmcgaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLXR5cGUiKQogICAgCiAgICBwb2xpY3lfY3JpX3R5cGUgOj0gcG9saWN5X29jaS5Bbm5vdGF0aW9uc1siaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLXR5cGUiXQogICAgcHJpbnQoImFsbG93X2J5X2NvbnRhaW5lcl90eXBlczogcG9saWN5IHR5cGUgPSIsIHBvbGljeV9jcmlfdHlwZSkKICAgIAogICAgaW5wdXRfY3JpX3R5cGUgOj0gaW5wdXRfb2NpLkFubm90YXRpb25zWyJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSJdCiAgICBwcmludCgiYWxsb3dfYnlfY29udGFpbmVyX3R5cGVzOiBpbnB1dCB0eXBlID0iLCBpbnB1dF9jcmlfdHlwZSkKICAgIAogICAgcG9saWN5X2NyaV90eXBlID09IGlucHV0X2NyaV90eXBlCgogICAgcHJpbnQoImFsbG93X2J5X2NvbnRhaW5lcl90eXBlczogYWxsb3dfYnlfY29udGFpbmVyX3R5cGUiKQogICAgYWxsb3dfYnlfY29udGFpbmVyX3R5cGUoaW5wdXRfY3JpX3R5cGUsIHBvbGljeV9vY2ksIGlucHV0X29jaSwgc2FuZGJveF9uYW1lLCBzYW5kYm94X25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfYnlfY29udGFpbmVyX3R5cGVzOiBzdWNjZXNzIikKfQoKIyBSdWxlcyBhcHBsaWNhYmxlIHRvIHRoZSAic2FuZGJveCIgY29udGFpbmVyIHR5cGUKYWxsb3dfYnlfY29udGFpbmVyX3R5cGUoaW5wdXRfY3JpX3R5cGUsIHBvbGljeV9vY2ksIGlucHV0X29jaSwgc2FuZGJveF9uYW1lLCBzYW5kYm94X25hbWVzcGFjZSkgewogICAgcHJpbnQoImFsbG93X2J5X2NvbnRhaW5lcl90eXBlIDE6IGlucHV0X2NyaV90eXBlID0iLCBpbnB1dF9jcmlfdHlwZSkKICAgIGlucHV0X2NyaV90eXBlID09ICJzYW5kYm94IgoKICAgIGlucHV0X2thdGFfdHlwZSA6PSBpbnB1dF9vY2kuQW5ub3RhdGlvbnNbImlvLmthdGFjb250YWluZXJzLnBrZy5vY2kuY29udGFpbmVyX3R5cGUiXQogICAgcHJpbnQoImFsbG93X2J5X2NvbnRhaW5lcl90eXBlIDE6IGlucHV0IGNvbnRhaW5lciB0eXBlIiwgaW5wdXRfa2F0YV90eXBlKQogICAgaW5wdXRfa2F0YV90eXBlID09ICJwb2Rfc2FuZGJveCIKCiAgICBhbGxvd19zYW5kYm94X2NvbnRhaW5lcl9uYW1lKHBvbGljeV9vY2ksIGlucHV0X29jaSkKICAgIGFsbG93X3NhbmRib3hfbmV0X25hbWVzcGFjZShwb2xpY3lfb2NpLCBpbnB1dF9vY2kpCiAgICBhbGxvd19zYW5kYm94X2xvZ19kaXJlY3RvcnkocG9saWN5X29jaSwgaW5wdXRfb2NpLCBzYW5kYm94X25hbWUsIHNhbmRib3hfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAxOiBzdWNjZXNzIikKfQoKIyBSdWxlcyBhcHBsaWNhYmxlIHRvIHRoZSAiY29udGFpbmVyIiBjb250YWluZXIgdHlwZQphbGxvd19ieV9jb250YWluZXJfdHlwZShpbnB1dF9jcmlfdHlwZSwgcG9saWN5X29jaSwgaW5wdXRfb2NpLCBzYW5kYm94X25hbWUsIHNhbmRib3hfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfYnlfY29udGFpbmVyX3R5cGUgMjogaW5wdXRfY3JpX3R5cGUgPSIsIGlucHV0X2NyaV90eXBlKQogICAgaW5wdXRfY3JpX3R5cGUgPT0gImNvbnRhaW5lciIKCiAgICBpbnB1dF9rYXRhX3R5cGUgOj0gaW5wdXRfb2NpLkFubm90YXRpb25zWyJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIl0KICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiBpbnB1dCB0eXBlIiwgaW5wdXRfa2F0YV90eXBlKQogICAgaW5wdXRfa2F0YV90eXBlID09ICJwb2RfY29udGFpbmVyIgoKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiBhbGxvd19jb250YWluZXJfbmFtZSIpCiAgICBhbGxvd19jb250YWluZXJfbmFtZShwb2xpY3lfb2NpLCBpbnB1dF9vY2kpCgogICAgcHJpbnQoImFsbG93X2J5X2NvbnRhaW5lcl90eXBlIDI6IGFsbG93X25ldF9uYW1lc3BhY2UiKQogICAgYWxsb3dfbmV0X25hbWVzcGFjZShwb2xpY3lfb2NpLCBpbnB1dF9vY2kpCgogICAgcHJpbnQoImFsbG93X2J5X2NvbnRhaW5lcl90eXBlIDI6IGFsbG93X2xvZ19kaXJlY3RvcnkiKQogICAgYWxsb3dfbG9nX2RpcmVjdG9yeShwb2xpY3lfb2NpLCBpbnB1dF9vY2kpCgogICAgcHJpbnQoImFsbG93X2J5X2NvbnRhaW5lcl90eXBlIDI6IHN1Y2Nlc3MiKQp9CgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgImlvLmt1YmVybmV0ZXMuY3JpLmNvbnRhaW5lci1uYW1lIiBhbm5vdGF0aW9uCgphbGxvd19zYW5kYm94X2NvbnRhaW5lcl9uYW1lKHBvbGljeV9vY2ksIGlucHV0X29jaSkgewogICAgcHJpbnQoImFsbG93X3NhbmRib3hfY29udGFpbmVyX25hbWU6IGNvbnRhaW5lcl9hbm5vdGF0aW9uX21pc3NpbmciKQogICAgY29udGFpbmVyX2Fubm90YXRpb25fbWlzc2luZyhwb2xpY3lfb2NpLCBpbnB1dF9vY2ksICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItbmFtZSIpCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9jb250YWluZXJfbmFtZTogc3VjY2VzcyIpCn0KCmFsbG93X2NvbnRhaW5lcl9uYW1lKHBvbGljeV9vY2ksIGlucHV0X29jaSkgewogICAgcHJpbnQoImFsbG93X2NvbnRhaW5lcl9uYW1lOiBhbGxvd19jb250YWluZXJfYW5ub3RhdGlvbiIpCiAgICBhbGxvd19jb250YWluZXJfYW5ub3RhdGlvbihwb2xpY3lfb2NpLCBpbnB1dF9vY2ksICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItbmFtZSIpCiAgICBwcmludCgiYWxsb3dfY29udGFpbmVyX25hbWU6IHN1Y2Nlc3MiKQp9CgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgQW5ub3Rpb25zIHJlcXVpcmVkIGZvciAiY29udGFpbmVyIiB0eXBlLCBhbmQgbm90IGFsbG93ZWQgZm9yICJzYW5kYm94IiB0eXBlLgoKY29udGFpbmVyX2Fubm90YXRpb25fbWlzc2luZyhwb2xpY3lfb2NpLCBpbnB1dF9vY2ksIGFubm90YXRpb25fa2V5KSB7CiAgICBwcmludCgiY29udGFpbmVyX2Fubm90YXRpb25fbWlzc2luZzoiLCBhbm5vdGF0aW9uX2tleSkKCiAgICBub3QgcG9saWN5X29jaS5Bbm5vdGF0aW9uc1thbm5vdGF0aW9uX2tleV0KICAgIG5vdCBpbnB1dF9vY2kuQW5ub3RhdGlvbnNbYW5ub3RhdGlvbl9rZXldCgogICAgcHJpbnQoImNvbnRhaW5lcl9hbm5vdGF0aW9uX21pc3Npbmc6IHN1Y2Nlc3MiKQp9CgphbGxvd19jb250YWluZXJfYW5ub3RhdGlvbihwb2xpY3lfb2NpLCBpbnB1dF9vY2ksIGFubm90YXRpb25fa2V5KSB7CiAgICBwcmludCgiYWxsb3dfY29udGFpbmVyX2Fubm90YXRpb246IGFubm90YXRpb25fa2V5ID0iLCBhbm5vdGF0aW9uX2tleSkKCiAgICBwb2xpY3lfdmFsdWUgOj0gcG9saWN5X29jaS5Bbm5vdGF0aW9uc1thbm5vdGF0aW9uX2tleV0KICAgIHByaW50KCJhbGxvd19jb250YWluZXJfYW5ub3RhdGlvbjogcG9saWN5X3ZhbHVlID0iLCBwb2xpY3lfdmFsdWUpCgogICAgaW5wdXRfdmFsdWUgOj0gaW5wdXRfb2NpLkFubm90YXRpb25zW2Fubm90YXRpb25fa2V5XQogICAgcHJpbnQoImFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uOiBpbnB1dF92YWx1ZSA9ICIsIGlucHV0X3ZhbHVlKQoKICAgIHBvbGljeV92YWx1ZSA9PSBpbnB1dF92YWx1ZQogICAgcHJpbnQoImFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uOiBzdWNjZXNzIikKfQoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojICJuZXJkY3RsL25ldHdvcmstbmFtZXNwYWNlIiBhbm5vdGF0aW9uCgphbGxvd19zYW5kYm94X25ldF9uYW1lc3BhY2UocG9saWN5X29jaSwgaW5wdXRfb2NpKSB7CiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9uZXRfbmFtZXNwYWNlOiBzdGFydCIpCgogICAgcG9saWN5X25hbWVzcGFjZSA6PSBwb2xpY3lfb2NpLkFubm90YXRpb25zWyJuZXJkY3RsL25ldHdvcmstbmFtZXNwYWNlIl0KICAgIHByaW50KCJhbGxvd19zYW5kYm94X25ldF9uYW1lc3BhY2U6IHBvbGljeV9uYW1lc3BhY2UgPSIsIHBvbGljeV9uYW1lc3BhY2UpCgogICAgaW5wdXRfbmFtZXNwYWNlIDo9IGlucHV0X29jaS5Bbm5vdGF0aW9uc1sibmVyZGN0bC9uZXR3b3JrLW5hbWVzcGFjZSJdCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9uZXRfbmFtZXNwYWNlOiBpbnB1dF9uYW1lc3BhY2UgPSIsIGlucHV0X25hbWVzcGFjZSkKCiAgICByZWdleC5tYXRjaChwb2xpY3lfbmFtZXNwYWNlLCBpbnB1dF9uYW1lc3BhY2UpCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9uZXRfbmFtZXNwYWNlOiBzdWNjZXNzIikKfQoKYWxsb3dfbmV0X25hbWVzcGFjZShwb2xpY3lfb2NpLCBpbnB1dF9vY2kpIHsKICAgIHByaW50KCJhbGxvd19uZXRfbmFtZXNwYWNlOiBzdGFydCIpCgogICAgbm90IHBvbGljeV9vY2kuQW5ub3RhdGlvbnNbIm5lcmRjdGwvbmV0d29yay1uYW1lc3BhY2UiXQogICAgbm90IGlucHV0X29jaS5Bbm5vdGF0aW9uc1sibmVyZGN0bC9uZXR3b3JrLW5hbWVzcGFjZSJdCgogICAgcHJpbnQoImFsbG93X25ldF9uYW1lc3BhY2U6IHN1Y2Nlc3MiKQp9CgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbG9nLWRpcmVjdG9yeSIgYW5ub3RhdGlvbgoKYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5KHBvbGljeV9vY2ksIGlucHV0X29jaSwgc2FuZGJveF9uYW1lLCBzYW5kYm94X25hbWVzcGFjZSkgewogICAgcHJpbnQoImFsbG93X3NhbmRib3hfbG9nX2RpcmVjdG9yeTogc3RhcnQiKQoKICAgIHBvbGljeV9sb2dfZGlyZWN0b3J5IDo9IHBvbGljeV9vY2kuQW5ub3RhdGlvbnNbImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbG9nLWRpcmVjdG9yeSJdCiAgICBkaXJlY3RvcnlfcmVnZXhfdG1wIDo9IHJlcGxhY2UocG9saWN5X2xvZ19kaXJlY3RvcnksICIkKHNhbmRib3gtbmFtZSkiLCBzYW5kYm94X25hbWUpCiAgICBkaXJlY3RvcnlfcmVnZXggOj0gcmVwbGFjZShkaXJlY3RvcnlfcmVnZXhfdG1wLCAiJChzYW5kYm94LW5hbWVzcGFjZSkiLCBzYW5kYm94X25hbWVzcGFjZSkKICAgIHByaW50KCJhbGxvd19zYW5kYm94X2xvZ19kaXJlY3Rvcnk6IHBvbGljeSByZWdleCA9IiwgZGlyZWN0b3J5X3JlZ2V4KQoKICAgIGlucHV0X2xvZ19kaXJlY3RvcnkgOj0gaW5wdXRfb2NpLkFubm90YXRpb25zWyJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWxvZy1kaXJlY3RvcnkiXQogICAgcHJpbnQoImFsbG93X3NhbmRib3hfbG9nX2RpcmVjdG9yeTogaW5wdXQgPSIsIGlucHV0X2xvZ19kaXJlY3RvcnkpCgogICAgcmVnZXgubWF0Y2goZGlyZWN0b3J5X3JlZ2V4LCBpbnB1dF9sb2dfZGlyZWN0b3J5KQoKICAgIHByaW50KCJhbGxvd19zYW5kYm94X2xvZ19kaXJlY3Rvcnk6IHN1Y2Nlc3MiKQp9CgphbGxvd19sb2dfZGlyZWN0b3J5KHBvbGljeV9vY2ksIGlucHV0X29jaSkgewogICAgbm90IHBvbGljeV9vY2kuQW5ub3RhdGlvbnNbImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbG9nLWRpcmVjdG9yeSJdCiAgICBub3QgaW5wdXRfb2NpLkFubm90YXRpb25zWyJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWxvZy1kaXJlY3RvcnkiXQp9CgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgVmFsaWRhdGUgdGhlIGxpbnV4IGZpZWxkcyBmcm9tIGNvbmZpZy5qc29uLgoKYWxsb3dfbGludXgocG9saWN5X29jaSwgaW5wdXRfb2NpKSB7CiAgICBwcmludCgiYWxsb3dfbGludXg6IHBvbGljeSBuYW1lc3BhY2VzID0iLCBwb2xpY3lfb2NpLkxpbnV4Lk5hbWVzcGFjZXMpCiAgICBwcmludCgiYWxsb3dfbGludXg6IGlucHV0IG5hbWVzcGFjZXMgPSIsIGlucHV0X29jaS5MaW51eC5OYW1lc3BhY2VzKQogICAgcG9saWN5X29jaS5MaW51eC5OYW1lc3BhY2VzICAgICA9PSBpbnB1dF9vY2kuTGludXguTmFtZXNwYWNlcwoKICAgIHByaW50KCJhbGxvd19saW51eDogYWxsb3dfbWFza2VkX3BhdGhzIikKICAgIGFsbG93X21hc2tlZF9wYXRocyhwb2xpY3lfb2NpLCBpbnB1dF9vY2kpCgogICAgcHJpbnQoImFsbG93X2xpbnV4OiBhbGxvd19yZWFkb25seV9wYXRocyIpCiAgICBhbGxvd19yZWFkb25seV9wYXRocyhwb2xpY3lfb2NpLCBpbnB1dF9vY2kpCgogICAgcHJpbnQoImFsbG93X2xpbnV4OiBzdWNjZXNzIikKfQoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwphbGxvd19tYXNrZWRfcGF0aHMocG9saWN5X29jaSwgaW5wdXRfb2NpKSB7CiAgICBwcmludCgiYWxsb3dfbWFza2VkX3BhdGhzIDE6IHBvbGljeSBtYXNrZWRQYXRocyA9IiwgcG9saWN5X29jaS5MaW51eC5NYXNrZWRQYXRocykKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aHMgMTogaW5wdXQgbWFza2VkUGF0aHMgPSIsIGlucHV0X29jaS5MaW51eC5NYXNrZWRQYXRocykKCiAgICBhbGxvd19tYXNrZWRfcGF0aHNfYXJyYXkocG9saWN5X29jaS5MaW51eC5NYXNrZWRQYXRocywgaW5wdXRfb2NpLkxpbnV4Lk1hc2tlZFBhdGhzKQoKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aHMgMTogc3VjY2VzcyIpCn0KYWxsb3dfbWFza2VkX3BhdGhzKHBvbGljeV9vY2ksIGlucHV0X29jaSkgewogICAgcHJpbnQoImFsbG93X21hc2tlZF9wYXRocyAyOiBubyBtYXNrZWRQYXRocyIpCgogICAgbm90IHBvbGljeV9vY2kuTGludXguTWFza2VkUGF0aHMKICAgIG5vdCBpbnB1dF9vY2kuTGludXguTWFza2VkUGF0aHMKCiAgICBwcmludCgiYWxsb3dfbWFza2VkX3BhdGhzIDI6IHN1Y2Nlc3MiKQp9CgojIEFsbCB0aGUgcG9saWN5IG1hc2tlZCBwYXRocyBtdXN0IGJlIG1hc2tlZCBpbiB0aGUgaW5wdXQgZGF0YSB0b28uCiMgSW5wdXQgaXMgYWxsb3dlZCB0byBoYXZlIG1vcmUgbWFza2VkIHBhdGhzIHRoYW4gdGhlIHBvbGljeS4KYWxsb3dfbWFza2VkX3BhdGhzX2FycmF5KHBvbGljeV9hcnJheSwgaW5wdXRfYXJyYXkpIHsKICAgIGV2ZXJ5IHBvbGljeV9lbGVtZW50IGluIHBvbGljeV9hcnJheSB7CiAgICAgICAgYWxsb3dfbWFza2VkX3BhdGgocG9saWN5X2VsZW1lbnQsIGlucHV0X2FycmF5KQogICAgfQp9CgphbGxvd19tYXNrZWRfcGF0aChwb2xpY3lfZWxlbWVudCwgaW5wdXRfYXJyYXkpIHsKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aDogcG9saWN5X2VsZW1lbnQgPSIsIHBvbGljeV9lbGVtZW50KQoKICAgIHNvbWUgaW5wdXRfZWxlbWVudCBpbiBpbnB1dF9hcnJheQogICAgcG9saWN5X2VsZW1lbnQgPT0gaW5wdXRfZWxlbWVudAoKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aDogc3VjY2VzcyIpCn0KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKYWxsb3dfcmVhZG9ubHlfcGF0aHMocG9saWN5X29jaSwgaW5wdXRfb2NpKSB7CiAgICBwcmludCgiYWxsb3dfcmVhZG9ubHlfcGF0aHMgMTogcG9saWN5IHJlYWRvbmx5UGF0aHMgPSIsIHBvbGljeV9vY2kuTGludXguUmVhZG9ubHlQYXRocykKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAxOiBpbnB1dCByZWFkb25seVBhdGhzID0iLCBpbnB1dF9vY2kuTGludXguUmVhZG9ubHlQYXRocykKCiAgICBhbGxvd19yZWFkb25seV9wYXRoc19hcnJheShwb2xpY3lfb2NpLkxpbnV4LlJlYWRvbmx5UGF0aHMsIGlucHV0X29jaS5MaW51eC5SZWFkb25seVBhdGhzLCBpbnB1dF9vY2kuTGludXguTWFza2VkUGF0aHMpCgogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGhzIDE6IHN1Y2Nlc3MiKQp9CmFsbG93X3JlYWRvbmx5X3BhdGhzKHBvbGljeV9vY2ksIGlucHV0X29jaSkgewogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGhzIDI6IG5vIHJlYWRvbmx5UGF0aHMiKQoKICAgIG5vdCBwb2xpY3lfb2NpLkxpbnV4LlJlYWRvbmx5UGF0aHMKICAgIG5vdCBpbnB1dF9vY2kuTGludXguUmVhZG9ubHlQYXRocwoKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAyOiBzdWNjZXNzIikKfQoKIyBBbGwgdGhlIHBvbGljeSByZWFkb25seSBwYXRocyBtdXN0IGJlIGVpdGhlcjoKIyAtIFByZXNlbnQgaW4gdGhlIGlucHV0IHJlYWRvbmx5IHBhdGhzLCBvcgojIC0gUHJlc2VudCBpbiB0aGUgaW5wdXQgbWFza2VkIHBhdGhzLgojIElucHV0IGlzIGFsbG93ZWQgdG8gaGF2ZSBtb3JlIHJlYWRvbmx5IHBhdGhzIHRoYW4gdGhlIHBvbGljeS4KYWxsb3dfcmVhZG9ubHlfcGF0aHNfYXJyYXkocG9saWN5X2FycmF5LCBpbnB1dF9hcnJheSwgbWFza2VkX3BhdGhzKSB7CiAgICBldmVyeSBwb2xpY3lfZWxlbWVudCBpbiBwb2xpY3lfYXJyYXkgewogICAgICAgIGFsbG93X3JlYWRvbmx5X3BhdGgocG9saWN5X2VsZW1lbnQsIGlucHV0X2FycmF5LCBtYXNrZWRfcGF0aHMpCiAgICB9Cn0KCmFsbG93X3JlYWRvbmx5X3BhdGgocG9saWN5X2VsZW1lbnQsIGlucHV0X2FycmF5LCBtYXNrZWRfcGF0aHMpIHsKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRoIDE6IHBvbGljeV9lbGVtZW50ID0iLCBwb2xpY3lfZWxlbWVudCkKCiAgICBzb21lIGlucHV0X2VsZW1lbnQgaW4gaW5wdXRfYXJyYXkKICAgIHBvbGljeV9lbGVtZW50ID09IGlucHV0X2VsZW1lbnQKCiAgICBwcmludCgiYWxsb3dfcmVhZG9ubHlfcGF0aCAxOiBzdWNjZXNzIikKfQphbGxvd19yZWFkb25seV9wYXRoKHBvbGljeV9lbGVtZW50LCBpbnB1dF9hcnJheSwgbWFza2VkX3BhdGhzKSB7CiAgICBwcmludCgiYWxsb3dfcmVhZG9ubHlfcGF0aCAyOiBwb2xpY3lfZWxlbWVudCA9IiwgcG9saWN5X2VsZW1lbnQpCgogICAgc29tZSBpbnB1dF9tYXNrZWQgaW4gbWFza2VkX3BhdGhzCiAgICBwb2xpY3lfZWxlbWVudCA9PSBpbnB1dF9tYXNrZWQKCiAgICBwcmludCgiYWxsb3dfcmVhZG9ubHlfcGF0aCAyOiBzdWNjZXNzIikKfQoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIEdldCB0aGUgaW5wdXQ6CiMKIyAtIGJ1bmRsZV9pZCBmcm9tICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmJ1bmRsZV9wYXRoIgojIC0gc2FuZGJveF9pZCBmcm9tICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWlkIgojCiMgYW5kIGNoZWNrIHRoZWlyIGNvbnNpc3RlbmN5IHdpdGggb3RoZXIgcnVsZXMuCgphbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZChwb2xpY3lfb2NpLCBpbnB1dF9vY2ksIHBvbGljeV9zdG9yYWdlcywgaW5wdXRfc3RvcmFnZXMpIHsKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogY2hlY2tpbmcgaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5idW5kbGVfcGF0aCIpCiAgICBidW5kbGVfcGF0aCA6PSBpbnB1dF9vY2kuQW5ub3RhdGlvbnNbImlvLmthdGFjb250YWluZXJzLnBrZy5vY2kuYnVuZGxlX3BhdGgiXQogICAgYnVuZGxlX2lkIDo9IHJlcGxhY2UoYnVuZGxlX3BhdGgsICIvcnVuL2NvbnRhaW5lcmQvaW8uY29udGFpbmVyZC5ydW50aW1lLnYyLnRhc2svazhzLmlvLyIsICIiKQoKICAgIHBvbGljeV9zYW5kYm94X3JlZ2V4IDo9IHBvbGljeV9vY2kuQW5ub3RhdGlvbnNbImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtaWQiXQogICAgc2FuZGJveF9pZCA6PSBpbnB1dF9vY2kuQW5ub3RhdGlvbnNbImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtaWQiXQoKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogcmVnZXgubWF0Y2ggc2FuZGJveF9pZCA9Iiwgc2FuZGJveF9pZCwgInJlZ2V4ID0iLCBwb2xpY3lfc2FuZGJveF9yZWdleCkKICAgIHJlZ2V4Lm1hdGNoKHBvbGljeV9zYW5kYm94X3JlZ2V4LCBzYW5kYm94X2lkKQoKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogYWxsb3dfcm9vdF9wYXRoIikKICAgIGFsbG93X3Jvb3RfcGF0aChwb2xpY3lfb2NpLCBpbnB1dF9vY2ksIGJ1bmRsZV9pZCkKCiAgICBldmVyeSBpbnB1dF9tb3VudCBpbiBpbnB1dC5PQ0kuTW91bnRzIHsKICAgICAgICBwcmludCgiYWxsb3dfYnlfYnVuZGxlX29yX3NhbmRib3hfaWQ6IGFsbG93X21vdW50IikKICAgICAgICBhbGxvd19tb3VudChwb2xpY3lfb2NpLCBpbnB1dF9tb3VudCwgYnVuZGxlX2lkLCBzYW5kYm94X2lkKQogICAgfQoKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogYWxsb3dfc3RvcmFnZXMiKQogICAgYWxsb3dfc3RvcmFnZXMocG9saWN5X3N0b3JhZ2VzLCBpbnB1dF9zdG9yYWdlcywgYnVuZGxlX2lkLCBzYW5kYm94X2lkKQoKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogc3VjY2VzcyIpCn0KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBWYWxpZGF0ZSB0aGUgcHJvY2VzcyBmaWVsZHMgZnJvbSBjb25maWcuanNvbi4KCmFsbG93X3Byb2Nlc3MocG9saWN5X29jaSwgaW5wdXRfb2NpLCBzYW5kYm94X25hbWUpIHsKICAgIHBvbGljeV9wcm9jZXNzIDo9IHBvbGljeV9vY2kuUHJvY2VzcwogICAgaW5wdXRfcHJvY2VzcyA6PSBpbnB1dF9vY2kuUHJvY2VzcwoKICAgIHByaW50KCJhbGxvd19wcm9jZXNzOiBpbnB1dCB0ZXJtaW5hbCA9IiwgaW5wdXRfcHJvY2Vzcy5UZXJtaW5hbCwgInBvbGljeSB0ZXJtaW5hbCA9IiwgcG9saWN5X3Byb2Nlc3MuVGVybWluYWwpCiAgICBwb2xpY3lfcHJvY2Vzcy5UZXJtaW5hbCAgICAgICAgID09IGlucHV0X3Byb2Nlc3MuVGVybWluYWwKCiAgICBwcmludCgiYWxsb3dfcHJvY2VzczogaW5wdXQgY3dkID0iLCBpbnB1dF9wcm9jZXNzLkN3ZCwgInBvbGljeSBjd2QgPSIsIHBvbGljeV9wcm9jZXNzLkN3ZCkKICAgIHBvbGljeV9wcm9jZXNzLkN3ZCAgICAgICAgICAgICAgPT0gaW5wdXRfcHJvY2Vzcy5Dd2QKCiAgICBwcmludCgiYWxsb3dfcHJvY2VzczogaW5wdXQgY2FwYWJpbGl0aWVzID0iLCBpbnB1dF9wcm9jZXNzLkNhcGFiaWxpdGllcykKICAgIHByaW50KCJhbGxvd19wcm9jZXNzOiBwb2xpY3kgY2FwYWJpbGl0aWVzID0iLCBwb2xpY3lfcHJvY2Vzcy5DYXBhYmlsaXRpZXMpCiAgICBwb2xpY3lfcHJvY2Vzcy5DYXBhYmlsaXRpZXMgICAgID09IGlucHV0X3Byb2Nlc3MuQ2FwYWJpbGl0aWVzCgogICAgcHJpbnQoImFsbG93X3Byb2Nlc3M6IGlucHV0IG5vTmV3UHJpdmlsZWdlcyA9IiwgaW5wdXRfcHJvY2Vzcy5Ob05ld1ByaXZpbGVnZXMsICJwb2xpY3kgbm9OZXdQcml2aWxlZ2VzID0iLCBwb2xpY3lfcHJvY2Vzcy5Ob05ld1ByaXZpbGVnZXMpCiAgICBwb2xpY3lfcHJvY2Vzcy5Ob05ld1ByaXZpbGVnZXMgID09IGlucHV0X3Byb2Nlc3MuTm9OZXdQcml2aWxlZ2VzCgogICAgcHJpbnQoImFsbG93X3Byb2Nlc3M6IGFsbG93X3VzZXIiKQogICAgYWxsb3dfdXNlcihwb2xpY3lfcHJvY2VzcywgaW5wdXRfcHJvY2VzcykKCiAgICBwcmludCgiYWxsb3dfcHJvY2VzczogYWxsb3dfYXJncyIpCiAgICBhbGxvd19hcmdzKHBvbGljeV9wcm9jZXNzLCBpbnB1dF9wcm9jZXNzLCBzYW5kYm94X25hbWUpCgogICAgcHJpbnQoImFsbG93X3Byb2Nlc3M6IGFsbG93X2VudiIpCiAgICBhbGxvd19lbnYocG9saWN5X3Byb2Nlc3MsIGlucHV0X3Byb2Nlc3MsIHNhbmRib3hfbmFtZSkKCiAgICBwcmludCgiYWxsb3dfcHJvY2Vzczogc3VjY2VzcyIpCn0KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBPQ0kgcHJvY2Vzcy5Vc2VyIGZpZWxkCgphbGxvd191c2VyKHBvbGljeV9wcm9jZXNzLCBpbnB1dF9wcm9jZXNzKSB7CiAgICBwb2xpY3lfdXNlciA6PSBwb2xpY3lfcHJvY2Vzcy5Vc2VyCiAgICBpbnB1dF91c2VyIDo9IGlucHV0X3Byb2Nlc3MuVXNlcgoKICAgICMgVE9ETzogdHJhY2sgZG93biB0aGUgcmVhc29uIGZvciBtY3IubWljcm9zb2Z0LmNvbS9vc3MvYml0bmFtaS9yZWRpczo2LjAuOCBiZWluZwogICAgIyAgICAgICBleGVjdXRlZCB3aXRoIHVpZCA9IDAgZGVzcGl0ZSBoYXZpbmcgIlVzZXIiOiAiMTAwMSIgaW4gaXRzIGNvbnRhaW5lciBpbWFnZQogICAgIyAgICAgICBjb25maWcuCiAgICAjcHJpbnQoImFsbG93X3VzZXI6IGlucHV0IHVpZCA9IiwgaW5wdXRfdXNlci5VSUQsICJwb2xpY3kgdWlkID0iLCBwb2xpY3lfdXNlci5VSUQpCiAgICAjcG9saWN5X3VzZXIuVUlEICAgICAgICAgICAgICAgICA9PSBpbnB1dF91c2VyLlVJRAoKICAgICMgVE9ETzogdHJhY2sgZG93biB0aGUgcmVhc29uIGZvciByZWdpc3RyeS5rOHMuaW8vcGF1c2U6My45IGJlaW5nCiAgICAjICAgICAgIGV4ZWN1dGVkIHdpdGggZ2lkID0gMCBkZXNwaXRlIGhhdmluZyAiNjU1MzU6NjU1MzUiIGluIGl0cyBjb250YWluZXIgaW1hZ2UKICAgICMgICAgICAgY29uZmlnLgogICAgI3ByaW50KCJhbGxvd191c2VyOiBpbnB1dCBnaWQgPSIsIGlucHV0X3VzZXIuR0lELCAicG9saWN5IGdpZCA9IiwgcG9saWN5X3VzZXIuR0lEKQogICAgI3BvbGljeV91c2VyLkdJRCAgICAgICAgICAgICAgICAgPT0gaW5wdXRfdXNlci5HSUQKCiAgICAjIFRPRE86IGNvbXBhcmUgdGhlIGFkZGl0aW9uYWxHaWRzIGZpZWxkIHRvbyBhZnRlciBjb21wdXRpbmcgaXRzIHZhbHVlCiAgICAjIGJhc2VkIG9uIC9ldGMvcGFzc3dkIGFuZCAvZXRjL2dyb3VwIGZyb20gdGhlIGNvbnRhaW5lciBpbWFnZS4KfQoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIE9DSSBwcm9jZXNzLkFyZ3MgZmllbGQKCmFsbG93X2FyZ3MocG9saWN5X3Byb2Nlc3MsIGlucHV0X3Byb2Nlc3MsIHNhbmRib3hfbmFtZSkgewogICAgcHJpbnQoImFsbG93X2FyZ3MgMTogbm8gYXJncyIpCgogICAgbm90IHBvbGljeV9wcm9jZXNzLkFyZ3MKICAgIG5vdCBpbnB1dF9wcm9jZXNzLkFyZ3MKCiAgICBwcmludCgiYWxsb3dfYXJncyAxOiBzdWNjZXNzIikKfQphbGxvd19hcmdzKHBvbGljeV9wcm9jZXNzLCBpbnB1dF9wcm9jZXNzLCBzYW5kYm94X25hbWUpIHsKICAgIHByaW50KCJhbGxvd19hcmdzIDI6IHBvbGljeSBhcmdzID0iLCBwb2xpY3lfcHJvY2Vzcy5BcmdzKQogICAgcHJpbnQoImFsbG93X2FyZ3MgMjogaW5wdXQgYXJncyA9IiwgaW5wdXRfcHJvY2Vzcy5BcmdzKQoKICAgIGNvdW50KHBvbGljeV9wcm9jZXNzLkFyZ3MpID09IGNvdW50KGlucHV0X3Byb2Nlc3MuQXJncykKCiAgICBldmVyeSBpLCBpbnB1dF9hcmcgaW4gaW5wdXRfcHJvY2Vzcy5BcmdzIHsKICAgICAgICBhbGxvd19hcmcoaSwgaW5wdXRfYXJnLCBwb2xpY3lfcHJvY2Vzcywgc2FuZGJveF9uYW1lKQogICAgfQoKICAgIHByaW50KCJhbGxvd19hcmdzIDI6IHN1Y2Nlc3MiKQp9CgphbGxvd19hcmcoaSwgaW5wdXRfYXJnLCBwb2xpY3lfcHJvY2Vzcywgc2FuZGJveF9uYW1lKSB7CiAgICBwcmludCgiYWxsb3dfYXJnIDE6IGkgPSIsIGksICJpbnB1dF9hcmcgPSIsIGlucHV0X2FyZywgInBvbGljeV9hcmcgPSIsIHBvbGljeV9wcm9jZXNzLkFyZ3NbaV0pCgogICAgcG9saWN5X2FyZyA6PSByZXBsYWNlKHBvbGljeV9wcm9jZXNzLkFyZ3NbaV0sICIkJCIsICIkIikKICAgIGlucHV0X2FyZyA9PSBwb2xpY3lfYXJnCgogICAgcHJpbnQoImFsbG93X2FyZyAxOiBzdWNjZXNzIikKfQphbGxvd19hcmcoaSwgaW5wdXRfYXJnLCBwb2xpY3lfcHJvY2Vzcywgc2FuZGJveF9uYW1lKSB7CiAgICBwcmludCgiYWxsb3dfYXJnIDI6IGkgPSIsIGksICJpbnB1dF9hcmcgPSIsIGlucHV0X2FyZywgInBvbGljeV9hcmcgPSIsIHBvbGljeV9wcm9jZXNzLkFyZ3NbaV0pCgogICAgIyBUT0RPOiBjYW4gJChub2RlLW5hbWUpIGJlIGhhbmRsZWQgYmV0dGVyPwogICAgY29udGFpbnMocG9saWN5X3Byb2Nlc3MuQXJnc1tpXSwgIiQobm9kZS1uYW1lKSIpCgogICAgcHJpbnQoImFsbG93X2FyZyAyOiBzdWNjZXNzIikKfQphbGxvd19hcmcoaSwgaW5wdXRfYXJnLCBwb2xpY3lfcHJvY2Vzcywgc2FuZGJveF9uYW1lKSB7CiAgICBwcmludCgiYWxsb3dfYXJnIDM6IGkgPSIsIGksICJpbnB1dF9hcmcgPSIsIGlucHV0X2FyZywgInBvbGljeV9hcmcgPSIsIHBvbGljeV9wcm9jZXNzLkFyZ3NbaV0pCgogICAgcG9saWN5X2FyZyA6PSByZXBsYWNlKHBvbGljeV9wcm9jZXNzLkFyZ3NbaV0sICIkJCIsICIkIikKICAgIGV4cGFuZGVkX2FyZyA9IHJlcGxhY2UocG9saWN5X2FyZywgIiQoc2FuZGJveC1uYW1lKSIsIHNhbmRib3hfbmFtZSkKICAgIHByaW50KCJhbGxvd19hcmcgMzogZXhwYW5kZWQgcG9saWN5X2FyZyA9IiwgZXhwYW5kZWRfYXJnKQogICAgZXhwYW5kZWRfYXJnID09IGlucHV0X2FyZwoKICAgIHByaW50KCJhbGxvd19hcmcgMzogc3VjY2VzcyIpCn0KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBPQ0kgcHJvY2Vzcy5FbnYgZmllbGQKCmFsbG93X2Vudihwb2xpY3lfcHJvY2VzcywgaW5wdXRfcHJvY2Vzcywgc2FuZGJveF9uYW1lKSB7CiAgICBwcmludCgiYWxsb3dfZW52OiBwb2xpY3kgZW52ID0iLCBwb2xpY3lfcHJvY2Vzcy5FbnYpCgogICAgZXZlcnkgZW52X3ZhciBpbiBpbnB1dF9wcm9jZXNzLkVudiB7CiAgICAgICAgcHJpbnQoImFsbG93X2VudiA9PiBhbGxvd19lbnZfdmFyOiIsIGVudl92YXIpCiAgICAgICAgYWxsb3dfZW52X3Zhcihwb2xpY3lfcHJvY2VzcywgaW5wdXRfcHJvY2VzcywgZW52X3Zhciwgc2FuZGJveF9uYW1lKQogICAgfQoKICAgIHByaW50KCJhbGxvd19lbnY6IHN1Y2Nlc3MiKQp9CgojIEFsbG93IGlucHV0IGVudiB2YXJpYWJsZXMgdGhhdCBtYXRjaCB3aXRoIHJlcXVlc3RfZGVmYXVsdHMuCmFsbG93X2Vudl92YXIocG9saWN5X3Byb2Nlc3MsIGlucHV0X3Byb2Nlc3MsIGVudl92YXIsIHNhbmRib3hfbmFtZSkgewogICAgcHJpbnQoImFsbG93X2Vudl92YXIgcmVnZXggMTogc29tZSBhbGxvd19lbnZfcmVnZXggbWF0Y2ggZW52X3ZhciIpCgogICAgc29tZSBwb2xpY3lfdmFyX3JlZ2V4IGluIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuQ3JlYXRlQ29udGFpbmVyUmVxdWVzdC5hbGxvd19lbnZfcmVnZXgKICAgIHJlZ2V4Lm1hdGNoKHBvbGljeV92YXJfcmVnZXgsIGVudl92YXIpCgogICAgcHJpbnQoImFsbG93X2Vudl92YXIgcmVnZXggMTogc3VjY2VzcyIpCn0KCiMgQWxsb3cgaW5wdXQgZW52IHZhcmlhYmxlcyB0aGF0IG1hdGNoIHdpdGggcmVxdWVzdF9kZWZhdWx0cywgYWZ0ZXIgc3Vic3RpdHV0aW5nICQoc2FuZGJveC1uYW1lKS4KYWxsb3dfZW52X3Zhcihwb2xpY3lfcHJvY2VzcywgaW5wdXRfcHJvY2VzcywgZW52X3Zhciwgc2FuZGJveF9uYW1lKSB7CiAgICBwcmludCgiYWxsb3dfZW52X3ZhciByZWdleCAyOiBzb21lIGFsbG93X2Vudl9yZWdleCBtYXRjaCBlbnZfdmFyIikKCiAgICBzb21lIHBvbGljeV92YXJfcmVnZXggaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5DcmVhdGVDb250YWluZXJSZXF1ZXN0LmFsbG93X2Vudl9yZWdleAogICAgcG9saWN5X3JlZ2V4ID0gcmVwbGFjZShwb2xpY3lfdmFyX3JlZ2V4LCAiJChzYW5kYm94LW5hbWUpIiwgc2FuZGJveF9uYW1lKQoKICAgIHByaW50KCJhbGxvd19lbnZfdmFyIHJlZ2V4IDI6IGlucHV0ID0iLCBlbnZfdmFyLCAicG9saWN5ID0iLCBwb2xpY3lfcmVnZXgpCiAgICByZWdleC5tYXRjaChwb2xpY3lfcmVnZXgsIGVudl92YXIpCgogICAgcHJpbnQoImFsbG93X2Vudl92YXIgcmVnZXggMjogc3VjY2VzcyIpCn0KCiMgQWxsb3cgaW5wdXQgZW52IHZhcmlhYmxlcyB0aGF0IGFyZSBwcmVzZW50IGluIHRoZSBwb2xpY3kgZGF0YSB0b28uCmFsbG93X2Vudl92YXIocG9saWN5X3Byb2Nlc3MsIGlucHV0X3Byb2Nlc3MsIGVudl92YXIsIHNhbmRib3hfbmFtZSkgewogICAgcHJpbnQoImFsbG93X2Vudl92YXIgMTogc29tZSBwb2xpY3lfZW52X3ZhciA9PSBlbnZfdmFyIikKCiAgICBzb21lIHBvbGljeV9lbnZfdmFyIGluIHBvbGljeV9wcm9jZXNzLkVudgogICAgcG9saWN5X2Vudl92YXIgPT0gZW52X3ZhcgoKICAgIHByaW50KCJhbGxvd19lbnZfdmFyIDE6IHN1Y2Nlc3MiKQp9CgojIE1hdGNoIGlucHV0IHdpdGggb25lIG9mIHRoZSBwb2xpY3kgdmFyaWFibGVzLCBhZnRlciBzdWJzdGl0dXRpbmcgJChzYW5kYm94LW5hbWUpLgphbGxvd19lbnZfdmFyKHBvbGljeV9wcm9jZXNzLCBpbnB1dF9wcm9jZXNzLCBlbnZfdmFyLCBzYW5kYm94X25hbWUpIHsKICAgIHByaW50KCJhbGxvd19lbnZfdmFyIDI6IHJlcGxhY2UgJChzYW5kYm94LW5hbWUpIikKCiAgICBzb21lIHBvbGljeV9lbnZfdmFyIGluIHBvbGljeV9wcm9jZXNzLkVudgogICAgcG9saWN5X3ZhciA9IHJlcGxhY2UocG9saWN5X2Vudl92YXIsICIkKHNhbmRib3gtbmFtZSkiLCBzYW5kYm94X25hbWUpCgogICAgcHJpbnQoImFsbG93X2Vudl92YXIgMjogaW5wdXQgPSIsIGVudl92YXIsICJwb2xpY3kgPSIsIHBvbGljeV92YXIpCiAgICBwb2xpY3lfdmFyID09IGVudl92YXIKCiAgICBwcmludCgiYWxsb3dfZW52X3ZhciAyOiBzdWNjZXNzIikKfQoKIyBBbGxvdyBzZXJ2aWNlLXJlbGF0ZWQgZW52IHZhcmlhYmxlczoKCiMgIktVQkVSTkVURVNfUE9SVF80NDNfVENQX1BST1RPPXRjcCIKYWxsb3dfZW52X3Zhcihwb2xpY3lfcHJvY2VzcywgaW5wdXRfcHJvY2VzcywgZW52X3Zhciwgc2FuZGJveF9uYW1lKSB7CiAgICBwcmludCgiYWxsb3dfZW52X3ZhciAzOiBLVUJFUk5FVEVTX1BPUlRfNDQzX1RDUF9QUk9UTz10Y3AiKQoKICAgIG5hbWVfdmFsdWUgOj0gc3BsaXQoZW52X3ZhciwgIj0iKQogICAgY291bnQobmFtZV92YWx1ZSkgPT0gMgoKICAgIG5hbWVfdmFsdWVbMV0gPT0gInRjcCIKCiAgICBuYW1lX2NvbXBvbmVudHMgPSBzcGxpdChuYW1lX3ZhbHVlWzBdLCAiXyIpCiAgICBjb21wb25lbnRzX2NvdW50IDo9IGNvdW50KG5hbWVfY29tcG9uZW50cykKICAgIGNvbXBvbmVudHNfY291bnQgPj0gNQogICAgbmFtZV9jb21wb25lbnRzW2NvbXBvbmVudHNfY291bnQgLSAxXSA9PSAiUFJPVE8iCiAgICBuYW1lX2NvbXBvbmVudHNbY29tcG9uZW50c19jb3VudCAtIDJdID09ICJUQ1AiCiAgICBuYW1lX2NvbXBvbmVudHNbY29tcG9uZW50c19jb3VudCAtIDRdID09ICJQT1JUIgogICAgcG9ydCA6PSBuYW1lX2NvbXBvbmVudHNbY29tcG9uZW50c19jb3VudCAtIDNdCiAgICBpc19wb3J0KHBvcnQpCgogICAgcHJpbnQoImFsbG93X2Vudl92YXIgMzogc3VjY2VzcyIpCn0KCiMgIktVQkVSTkVURVNfUE9SVF80NDNfVENQX1BPUlQ9NDQzIgphbGxvd19lbnZfdmFyKHBvbGljeV9wcm9jZXNzLCBpbnB1dF9wcm9jZXNzLCBlbnZfdmFyLCBzYW5kYm94X25hbWUpIHsKICAgIHByaW50KCJhbGxvd19lbnZfdmFyIDQ6IEtVQkVSTkVURVNfUE9SVF80NDNfVENQX1BPUlQ9NDQzIikKCiAgICBuYW1lX3ZhbHVlIDo9IHNwbGl0KGVudl92YXIsICI9IikKICAgIGNvdW50KG5hbWVfdmFsdWUpID09IDIKCiAgICBwb3J0ID0gbmFtZV92YWx1ZVsxXQogICAgaXNfcG9ydChwb3J0KQoKICAgIG5hbWVfY29tcG9uZW50cyA9IHNwbGl0KG5hbWVfdmFsdWVbMF0sICJfIikKICAgIGNvbXBvbmVudHNfY291bnQgOj0gY291bnQobmFtZV9jb21wb25lbnRzKQogICAgY29tcG9uZW50c19jb3VudCA+PSA1CiAgICBuYW1lX2NvbXBvbmVudHNbY29tcG9uZW50c19jb3VudCAtIDFdID09ICJQT1JUIgogICAgbmFtZV9jb21wb25lbnRzW2NvbXBvbmVudHNfY291bnQgLSAyXSA9PSAiVENQIgogICAgbmFtZV9jb21wb25lbnRzW2NvbXBvbmVudHNfY291bnQgLSAzXSA9PSBwb3J0CiAgICBuYW1lX2NvbXBvbmVudHNbY29tcG9uZW50c19jb3VudCAtIDRdID09ICJQT1JUIgoKICAgIHByaW50KCJhbGxvd19lbnZfdmFyIDQ6IHN1Y2Nlc3MiKQp9CgojICJLVUJFUk5FVEVTX1BPUlRfNDQzX1RDUF9BRERSPTEwLjAuMC4xIgphbGxvd19lbnZfdmFyKHBvbGljeV9wcm9jZXNzLCBpbnB1dF9wcm9jZXNzLCBlbnZfdmFyLCBzYW5kYm94X25hbWUpIHsKICAgIHByaW50KCJhbGxvd19lbnZfdmFyIDU6IEtVQkVSTkVURVNfUE9SVF80NDNfVENQX0FERFI9MTAuMC4wLjEiKQoKICAgIG5hbWVfdmFsdWUgOj0gc3BsaXQoZW52X3ZhciwgIj0iKQogICAgY291bnQobmFtZV92YWx1ZSkgPT0gMgoKICAgIGlzX2lwKG5hbWVfdmFsdWVbMV0pCgogICAgbmFtZV9jb21wb25lbnRzID0gc3BsaXQobmFtZV92YWx1ZVswXSwgIl8iKQogICAgY29tcG9uZW50c19jb3VudCA6PSBjb3VudChuYW1lX2NvbXBvbmVudHMpCiAgICBjb21wb25lbnRzX2NvdW50ID49IDUKICAgIG5hbWVfY29tcG9uZW50c1tjb21wb25lbnRzX2NvdW50IC0gMV0gPT0gIkFERFIiCiAgICBuYW1lX2NvbXBvbmVudHNbY29tcG9uZW50c19jb3VudCAtIDJdID09ICJUQ1AiCiAgICBuYW1lX2NvbXBvbmVudHNbY29tcG9uZW50c19jb3VudCAtIDRdID09ICJQT1JUIgogICAgcG9ydCA6PSBuYW1lX2NvbXBvbmVudHNbY29tcG9uZW50c19jb3VudCAtIDNdCiAgICBpc19wb3J0KHBvcnQpCgogICAgcHJpbnQoImFsbG93X2Vudl92YXIgNTogc3VjY2VzcyIpCn0KCiMgIktVQkVSTkVURVNfU0VSVklDRV9IT1NUPTEwLjAuMC4xIiwKYWxsb3dfZW52X3Zhcihwb2xpY3lfcHJvY2VzcywgaW5wdXRfcHJvY2VzcywgZW52X3Zhciwgc2FuZGJveF9uYW1lKSB7CiAgICBwcmludCgiYWxsb3dfZW52X3ZhciA2OiBLVUJFUk5FVEVTX1NFUlZJQ0VfSE9TVD0xMC4wLjAuMSIpCgogICAgbmFtZV92YWx1ZSA6PSBzcGxpdChlbnZfdmFyLCAiPSIpCiAgICBjb3VudChuYW1lX3ZhbHVlKSA9PSAyCgogICAgaXNfaXAobmFtZV92YWx1ZVsxXSkKCiAgICBuYW1lX2NvbXBvbmVudHMgPSBzcGxpdChuYW1lX3ZhbHVlWzBdLCAiXyIpCiAgICBjb21wb25lbnRzX2NvdW50IDo9IGNvdW50KG5hbWVfY29tcG9uZW50cykKICAgIGNvbXBvbmVudHNfY291bnQgPj0gMwogICAgbmFtZV9jb21wb25lbnRzW2NvbXBvbmVudHNfY291bnQgLSAxXSA9PSAiSE9TVCIKICAgIG5hbWVfY29tcG9uZW50c1tjb21wb25lbnRzX2NvdW50IC0gMl0gPT0gIlNFUlZJQ0UiCgogICAgcHJpbnQoImFsbG93X2Vudl92YXIgNjogc3VjY2VzcyIpCn0KCiMgIktVQkVSTkVURVNfU0VSVklDRV9QT1JUPTQ0MyIsCmFsbG93X2Vudl92YXIocG9saWN5X3Byb2Nlc3MsIGlucHV0X3Byb2Nlc3MsIGVudl92YXIsIHNhbmRib3hfbmFtZSkgewogICAgcHJpbnQoImFsbG93X2Vudl92YXIgNzogS1VCRVJORVRFU19TRVJWSUNFX1BPUlQ9NDQzIikKCiAgICBuYW1lX3ZhbHVlIDo9IHNwbGl0KGVudl92YXIsICI9IikKICAgIGNvdW50KG5hbWVfdmFsdWUpID09IDIKCiAgICBpc19wb3J0KG5hbWVfdmFsdWVbMV0pCgogICAgbmFtZV9jb21wb25lbnRzID0gc3BsaXQobmFtZV92YWx1ZVswXSwgIl8iKQogICAgY29tcG9uZW50c19jb3VudCA6PSBjb3VudChuYW1lX2NvbXBvbmVudHMpCiAgICBjb21wb25lbnRzX2NvdW50ID49IDMKICAgIG5hbWVfY29tcG9uZW50c1tjb21wb25lbnRzX2NvdW50IC0gMV0gPT0gIlBPUlQiCiAgICBuYW1lX2NvbXBvbmVudHNbY29tcG9uZW50c19jb3VudCAtIDJdID09ICJTRVJWSUNFIgoKICAgIHByaW50KCJhbGxvd19lbnZfdmFyIDc6IHN1Y2Nlc3MiKQp9CgojICJLVUJFUk5FVEVTX1NFUlZJQ0VfUE9SVF9IVFRQUz00NDMiLAphbGxvd19lbnZfdmFyKHBvbGljeV9wcm9jZXNzLCBpbnB1dF9wcm9jZXNzLCBlbnZfdmFyLCBzYW5kYm94X25hbWUpIHsKICAgIHByaW50KCJhbGxvd19lbnZfdmFyIDg6IEtVQkVSTkVURVNfU0VSVklDRV9QT1JUX0hUVFBTPTQ0MyIpCgogICAgbmFtZV92YWx1ZSA6PSBzcGxpdChlbnZfdmFyLCAiPSIpCiAgICBjb3VudChuYW1lX3ZhbHVlKSA9PSAyCgogICAgaXNfcG9ydChuYW1lX3ZhbHVlWzFdKQoKICAgIG5hbWVfY29tcG9uZW50cyA9IHNwbGl0KG5hbWVfdmFsdWVbMF0sICJfIikKICAgIGNvbXBvbmVudHNfY291bnQgOj0gY291bnQobmFtZV9jb21wb25lbnRzKQogICAgY29tcG9uZW50c19jb3VudCA+PSA0CiAgICBuYW1lX2NvbXBvbmVudHNbY29tcG9uZW50c19jb3VudCAtIDFdID09ICJIVFRQUyIKICAgIG5hbWVfY29tcG9uZW50c1tjb21wb25lbnRzX2NvdW50IC0gMl0gPT0gIlBPUlQiCiAgICBuYW1lX2NvbXBvbmVudHNbY29tcG9uZW50c19jb3VudCAtIDNdID09ICJTRVJWSUNFIgoKICAgIHByaW50KCJhbGxvd19lbnZfdmFyIDg6IHN1Y2Nlc3MiKQp9CgojICJLVUJFUk5FVEVTX1BPUlQ9dGNwOi8vMTAuMC4wLjE6NDQzIiwKYWxsb3dfZW52X3Zhcihwb2xpY3lfcHJvY2VzcywgaW5wdXRfcHJvY2VzcywgZW52X3Zhciwgc2FuZGJveF9uYW1lKSB7CiAgICBwcmludCgiYWxsb3dfZW52X3ZhciA5OiBLVUJFUk5FVEVTX1BPUlQ9dGNwOi8vMTAuMC4wLjE6NDQzIikKCiAgICBuYW1lX3ZhbHVlIDo9IHNwbGl0KGVudl92YXIsICI9IikKICAgIGNvdW50KG5hbWVfdmFsdWUpID09IDIKCiAgICBpc190Y3BfdXJpKG5hbWVfdmFsdWVbMV0pCgogICAgbmFtZV9jb21wb25lbnRzID0gc3BsaXQobmFtZV92YWx1ZVswXSwgIl8iKQogICAgY29tcG9uZW50c19jb3VudCA6PSBjb3VudChuYW1lX2NvbXBvbmVudHMpCiAgICBjb21wb25lbnRzX2NvdW50ID49IDIKICAgIG5hbWVfY29tcG9uZW50c1tjb21wb25lbnRzX2NvdW50IC0gMV0gPT0gIlBPUlQiCgogICAgcHJpbnQoImFsbG93X2Vudl92YXIgOTogc3VjY2VzcyIpCn0KCiMgIktVQkVSTkVURVNfUE9SVF80NDNfVENQPXRjcDovLzEwLjAuMC4xOjQ0MyIsCmFsbG93X2Vudl92YXIocG9saWN5X3Byb2Nlc3MsIGlucHV0X3Byb2Nlc3MsIGVudl92YXIsIHNhbmRib3hfbmFtZSkgewogICAgcHJpbnQoImFsbG93X2Vudl92YXIgMTA6IEtVQkVSTkVURVNfUE9SVF80NDNfVENQPXRjcDovLzEwLjAuMC4xOjQ0MyIpCgogICAgbmFtZV92YWx1ZSA6PSBzcGxpdChlbnZfdmFyLCAiPSIpCiAgICBjb3VudChuYW1lX3ZhbHVlKSA9PSAyCgogICAgbmFtZV9jb21wb25lbnRzID0gc3BsaXQobmFtZV92YWx1ZVswXSwgIl8iKQogICAgY29tcG9uZW50c19jb3VudCA6PSBjb3VudChuYW1lX2NvbXBvbmVudHMpCiAgICBjb21wb25lbnRzX2NvdW50ID49IDQKICAgIG5hbWVfY29tcG9uZW50c1tjb21wb25lbnRzX2NvdW50IC0gMV0gPT0gIlRDUCIKICAgIG5hbWVfY29tcG9uZW50c1tjb21wb25lbnRzX2NvdW50IC0gM10gPT0gIlBPUlQiCiAgICBwb3J0IDo9IG5hbWVfY29tcG9uZW50c1tjb21wb25lbnRzX2NvdW50IC0gMl0KICAgIGlzX3BvcnQocG9ydCkKCiAgICBpc190Y3BfdXJpKG5hbWVfdmFsdWVbMV0pCiAgICB2YWx1ZV9jb21wb25lbnRzID0gc3BsaXQobmFtZV92YWx1ZVsxXSwgIjoiKQogICAgY291bnQodmFsdWVfY29tcG9uZW50cykgPT0gMwogICAgdmFsdWVfY29tcG9uZW50c1syXSA9PSBwb3J0CgogICAgcHJpbnQoImFsbG93X2Vudl92YXIgMTA6IHN1Y2Nlc3MiKQp9CgojIEFsbG93IGZpZWxkUmVmICJmaWVsZFBhdGg6IHN0YXR1cy5wb2RJUCIgdmFsdWVzLgphbGxvd19lbnZfdmFyKHBvbGljeV9wcm9jZXNzLCBpbnB1dF9wcm9jZXNzLCBlbnZfdmFyLCBzYW5kYm94X25hbWUpIHsKICAgIHByaW50KCJhbGxvd19lbnZfdmFyIDExOiBmaWVsZFBhdGg6IHN0YXR1cy5wb2RJUCIpCgogICAgbmFtZV92YWx1ZSA6PSBzcGxpdChlbnZfdmFyLCAiPSIpCiAgICBjb3VudChuYW1lX3ZhbHVlKSA9PSAyCiAgICBpc19pcChuYW1lX3ZhbHVlWzFdKQoKICAgIHNvbWUgcG9saWN5X2Vudl92YXIgaW4gcG9saWN5X3Byb2Nlc3MuRW52CiAgICBhbGxvd19wb2RfaXBfdmFyKG5hbWVfdmFsdWVbMF0sIHBvbGljeV9lbnZfdmFyKQoKICAgIHByaW50KCJhbGxvd19lbnZfdmFyIDExOiBzdWNjZXNzIikKfQoKIyBBbGxvdyBjb21tb24gZmllbGRSZWYgdmFyaWFibGVzLgphbGxvd19lbnZfdmFyKHBvbGljeV9wcm9jZXNzLCBpbnB1dF9wcm9jZXNzLCBlbnZfdmFyLCBzYW5kYm94X25hbWUpIHsKICAgIHByaW50KCJhbGxvd19lbnZfdmFyIDEyOiBmaWVsZFJlZiIpCgogICAgbmFtZV92YWx1ZSA6PSBzcGxpdChlbnZfdmFyLCAiPSIpCiAgICBjb3VudChuYW1lX3ZhbHVlKSA9PSAyCgogICAgc29tZSBwb2xpY3lfZW52X3ZhciBpbiBwb2xpY3lfcHJvY2Vzcy5FbnYKICAgIHBvbGljeV9uYW1lX3ZhbHVlIDo9IHNwbGl0KHBvbGljeV9lbnZfdmFyLCAiPSIpCiAgICBjb3VudChwb2xpY3lfbmFtZV92YWx1ZSkgPT0gMgoKICAgIHBvbGljeV9uYW1lX3ZhbHVlWzBdID09IG5hbWVfdmFsdWVbMF0KCiAgICAjIFRPRE86IHNob3VsZCB0aGVzZSBiZSBoYW5kbGVkIGluIGEgZGlmZmVyZW50IHdheT8KICAgIGFsd2F5c19hbGxvd2VkIDo9IFsiJChob3N0LW5hbWUpIiwgIiQobm9kZS1uYW1lKSIsICIkKHBvZC11aWQpIl0KICAgIHNvbWUgYWxsb3dlZCBpbiBhbHdheXNfYWxsb3dlZAogICAgY29udGFpbnMocG9saWN5X25hbWVfdmFsdWVbMV0sIGFsbG93ZWQpCgogICAgcHJpbnQoImFsbG93X2Vudl92YXIgMTI6IHN1Y2Nlc3MiKQp9CgojIEFsbG93IGZpZWxkUmVmICJmaWVsZFBhdGg6IHN0YXR1cy5ob3N0SVAiIHZhbHVlcy4KYWxsb3dfZW52X3Zhcihwb2xpY3lfcHJvY2VzcywgaW5wdXRfcHJvY2VzcywgZW52X3Zhciwgc2FuZGJveF9uYW1lKSB7CiAgICBwcmludCgiYWxsb3dfZW52X3ZhciAxMzogZmllbGRQYXRoOiBzdGF0dXMuaG9zdElQIikKCiAgICBuYW1lX3ZhbHVlIDo9IHNwbGl0KGVudl92YXIsICI9IikKICAgIGNvdW50KG5hbWVfdmFsdWUpID09IDIKICAgIGlzX2lwKG5hbWVfdmFsdWVbMV0pCgogICAgc29tZSBwb2xpY3lfZW52X3ZhciBpbiBwb2xpY3lfcHJvY2Vzcy5FbnYKICAgIGFsbG93X2hvc3RfaXBfdmFyKG5hbWVfdmFsdWVbMF0sIHBvbGljeV9lbnZfdmFyKQoKICAgIHByaW50KCJhbGxvd19lbnZfdmFyIDEzOiBzdWNjZXNzIikKfQoKIyBBbGxvdyByZXNvdXJjZUZpZWxkUmVmIHZhbHVlcyAoZS5nLiwgImxpbWl0cy5jcHUiKS4KYWxsb3dfZW52X3Zhcihwb2xpY3lfcHJvY2VzcywgaW5wdXRfcHJvY2VzcywgZW52X3Zhciwgc2FuZGJveF9uYW1lKSB7CiAgICBwcmludCgiYWxsb3dfZW52X3ZhciAxNDogcmVzb3VyY2VGaWVsZFJlZiIpCgogICAgbmFtZV92YWx1ZSA6PSBzcGxpdChlbnZfdmFyLCAiPSIpCiAgICBjb3VudChuYW1lX3ZhbHVlKSA9PSAyCgogICAgc29tZSBwb2xpY3lfZW52X3ZhciBpbiBwb2xpY3lfcHJvY2Vzcy5FbnYKICAgIHBvbGljeV9uYW1lX3ZhbHVlIDo9IHNwbGl0KHBvbGljeV9lbnZfdmFyLCAiPSIpCiAgICBjb3VudChwb2xpY3lfbmFtZV92YWx1ZSkgPT0gMgoKICAgIHBvbGljeV9uYW1lX3ZhbHVlWzBdID09IG5hbWVfdmFsdWVbMF0KCiAgICAjIFRPRE86IHNob3VsZCB0aGVzZSBiZSBoYW5kbGVkIGluIGEgZGlmZmVyZW50IHdheT8KICAgIGFsd2F5c19hbGxvd2VkID0gWyIkKHJlc291cmNlLWZpZWxkKSIsICIkKHRvZG8tYW5ub3RhdGlvbikiXQogICAgc29tZSBhbGxvd2VkIGluIGFsd2F5c19hbGxvd2VkCiAgICBjb250YWlucyhwb2xpY3lfbmFtZV92YWx1ZVsxXSwgYWxsb3dlZCkKCiAgICBwcmludCgiYWxsb3dfZW52X3ZhciAxNDogc3VjY2VzcyIpCn0KCgphbGxvd19wb2RfaXBfdmFyKHZhcl9uYW1lLCBwb2xpY3lfZW52X3ZhcikgewogICAgcHJpbnQoImFsbG93X3BvZF9pcF92YXI6IHZhcl9uYW1lID0iLCB2YXJfbmFtZSwgInBvbGljeV9lbnZfdmFyID0iLCBwb2xpY3lfZW52X3ZhcikKCiAgICBwb2xpY3lfbmFtZV92YWx1ZSA6PSBzcGxpdChwb2xpY3lfZW52X3ZhciwgIj0iKQogICAgY291bnQocG9saWN5X25hbWVfdmFsdWUpID09IDIKCiAgICBwb2xpY3lfbmFtZV92YWx1ZVswXSA9PSB2YXJfbmFtZQogICAgcG9saWN5X25hbWVfdmFsdWVbMV0gPT0gIiQocG9kLWlwKSIKCiAgICBwcmludCgiYWxsb3dfcG9kX2lwX3Zhcjogc3VjY2VzcyIpCn0KCmFsbG93X2hvc3RfaXBfdmFyKHZhcl9uYW1lLCBwb2xpY3lfZW52X3ZhcikgewogICAgcHJpbnQoImFsbG93X2hvc3RfaXBfdmFyOiB2YXJfbmFtZSA9IiwgdmFyX25hbWUsICJwb2xpY3lfZW52X3ZhciA9IiwgcG9saWN5X2Vudl92YXIpCgogICAgcG9saWN5X25hbWVfdmFsdWUgOj0gc3BsaXQocG9saWN5X2Vudl92YXIsICI9IikKICAgIGNvdW50KHBvbGljeV9uYW1lX3ZhbHVlKSA9PSAyCgogICAgcG9saWN5X25hbWVfdmFsdWVbMF0gPT0gdmFyX25hbWUKICAgIHBvbGljeV9uYW1lX3ZhbHVlWzFdID09ICIkKGhvc3QtaXApIgoKICAgIHByaW50KCJhbGxvd19ob3N0X2lwX3Zhcjogc3VjY2VzcyIpCn0KCmlzX2lwKHZhbHVlKSB7CiAgICBieXRlcyA9IHNwbGl0KHZhbHVlLCAiLiIpCiAgICBjb3VudChieXRlcykgPT0gNAoKICAgIGlzX2lwX2ZpcnN0X2J5dGUoYnl0ZXNbMF0pCiAgICBpc19pcF9vdGhlcl9ieXRlKGJ5dGVzWzFdKQogICAgaXNfaXBfb3RoZXJfYnl0ZShieXRlc1syXSkKICAgIGlzX2lwX290aGVyX2J5dGUoYnl0ZXNbM10pCn0KaXNfaXBfZmlyc3RfYnl0ZShjb21wb25lbnQpIHsKICAgIG51bWJlciA9IHRvX251bWJlcihjb21wb25lbnQpCiAgICBudW1iZXIgPj0gMQogICAgbnVtYmVyIDw9IDI1NQp9CmlzX2lwX290aGVyX2J5dGUoY29tcG9uZW50KSB7CiAgICBudW1iZXIgPSB0b19udW1iZXIoY29tcG9uZW50KQogICAgbnVtYmVyID49IDAKICAgIG51bWJlciA8PSAyNTUKfQoKaXNfcG9ydCh2YWx1ZSkgewogICAgbnVtYmVyID0gdG9fbnVtYmVyKHZhbHVlKQogICAgbnVtYmVyID49IDEKICAgIG51bWJlciA8PSA2NTYzNQp9CgojIEUuZy4sICJ0Y3A6Ly8xMC4wLjAuMTo0NDMiCmlzX3RjcF91cmkodmFsdWUpIHsKICAgIGNvbXBvbmVudHMgPSBzcGxpdCh2YWx1ZSwgIi8vIikKICAgIGNvdW50KGNvbXBvbmVudHMpID09IDIKICAgIGNvbXBvbmVudHNbMF0gPT0gInRjcDoiCgogICAgaXBfYW5kX3BvcnQgPSBzcGxpdChjb21wb25lbnRzWzFdLCAiOiIpCiAgICBjb3VudChpcF9hbmRfcG9ydCkgPT0gMgogICAgaXNfaXAoaXBfYW5kX3BvcnRbMF0pCiAgICBpc19wb3J0KGlwX2FuZF9wb3J0WzFdKQp9CgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgT0NJIHJvb3QuUGF0aAoKYWxsb3dfcm9vdF9wYXRoKHBvbGljeV9vY2ksIGlucHV0X29jaSwgYnVuZGxlX2lkKSB7CiAgICBwb2xpY3lfcGF0aCA6PSByZXBsYWNlKHBvbGljeV9vY2kuUm9vdC5QYXRoLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcG9saWN5X3BhdGggPT0gaW5wdXRfb2NpLlJvb3QuUGF0aAp9CgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgbW91bnRzCgphbGxvd19tb3VudChwb2xpY3lfb2NpLCBpbnB1dF9tb3VudCwgYnVuZGxlX2lkLCBzYW5kYm94X2lkKSB7CiAgICBwcmludCgiYWxsb3dfbW91bnQ6IGlucHV0X21vdW50LmRlc3RpbmF0aW9uID0iLCBpbnB1dF9tb3VudC5kZXN0aW5hdGlvbikKCiAgICBzb21lIHBvbGljeV9tb3VudCBpbiBwb2xpY3lfb2NpLk1vdW50cwogICAgcG9saWN5X21vdW50X2FsbG93cyhwb2xpY3lfbW91bnQsIGlucHV0X21vdW50LCBidW5kbGVfaWQsIHNhbmRib3hfaWQpCgogICAgIyBUT0RPOiBhcmUgdGhlcmUgYW55IG90aGVyIHJlcXVpcmVkIHBvbGljeSBjaGVja3MgZm9yIG1vdW50cyAtIGUuZy4sCiAgICAjICAgICAgIG11bHRpcGxlIG1vdW50cyB3aXRoIHNhbWUgc291cmNlIG9yIGRlc3RpbmF0aW9uPwp9Cgpwb2xpY3lfbW91bnRfYWxsb3dzKHBvbGljeV9tb3VudCwgaW5wdXRfbW91bnQsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcHJpbnQoInBvbGljeV9tb3VudF9hbGxvd3MgMTogcG9saWN5X21vdW50ID0iLCBwb2xpY3lfbW91bnQpCiAgICBwcmludCgicG9saWN5X21vdW50X2FsbG93cyAxOiBpbnB1dF9tb3VudCA9IiwgaW5wdXRfbW91bnQpCgogICAgcG9saWN5X21vdW50ID09IGlucHV0X21vdW50CgogICAgcHJpbnQoInBvbGljeV9tb3VudF9hbGxvd3MgMSBzdWNjZXNzIikKfQpwb2xpY3lfbW91bnRfYWxsb3dzKHBvbGljeV9tb3VudCwgaW5wdXRfbW91bnQsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcHJpbnQoInBvbGljeV9tb3VudF9hbGxvd3MgMjogaW5wdXRfbW91bnQuZGVzdGluYXRpb24gPSIsIGlucHV0X21vdW50LmRlc3RpbmF0aW9uLCAicG9saWN5X21vdW50LmRlc3RpbmF0aW9uID0iLCBwb2xpY3lfbW91bnQuZGVzdGluYXRpb24pCiAgICBwb2xpY3lfbW91bnQuZGVzdGluYXRpb24gICAgPT0gaW5wdXRfbW91bnQuZGVzdGluYXRpb24KCiAgICBwcmludCgicG9saWN5X21vdW50X2FsbG93cyAyOiBpbnB1dCB0eXBlID0iLCBpbnB1dF9tb3VudC50eXBlXywgInBvbGljeSB0eXBlID0iLCBwb2xpY3lfbW91bnQudHlwZV8pCiAgICBwb2xpY3lfbW91bnQudHlwZV8gICAgICAgICAgID09IGlucHV0X21vdW50LnR5cGVfCgogICAgcHJpbnQoInBvbGljeV9tb3VudF9hbGxvd3MgMjogaW5wdXQgb3B0aW9ucyA9IiwgaW5wdXRfbW91bnQub3B0aW9ucykKICAgIHByaW50KCJwb2xpY3lfbW91bnRfYWxsb3dzIDI6IHBvbGljeSBvcHRpb25zID0iLCBwb2xpY3lfbW91bnQub3B0aW9ucykKICAgIHBvbGljeV9tb3VudC5vcHRpb25zICAgICAgICA9PSBpbnB1dF9tb3VudC5vcHRpb25zCgogICAgcHJpbnQoInBvbGljeV9tb3VudF9hbGxvd3MgMjogcG9saWN5X21vdW50X3NvdXJjZV9hbGxvd3MiKQogICAgcG9saWN5X21vdW50X3NvdXJjZV9hbGxvd3MocG9saWN5X21vdW50LCBpbnB1dF9tb3VudCwgYnVuZGxlX2lkLCBzYW5kYm94X2lkKQoKICAgIHByaW50KCJwb2xpY3lfbW91bnRfYWxsb3dzIDI6IHN1Y2Nlc3MiKQp9Cgpwb2xpY3lfbW91bnRfc291cmNlX2FsbG93cyhwb2xpY3lfbW91bnQsIGlucHV0X21vdW50LCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgICMgRS5nLiwgInNvdXJjZSI6ICJeL3J1bi9rYXRhLWNvbnRhaW5lcnMvc2hhcmVkL2NvbnRhaW5lcnMvJChidW5kbGUtaWQpLVthLXowLTldezE2fS1yZXNvbHYuY29uZiQiLAogICAgcG9saWN5X3NvdXJjZV9yZWdleCA6PSByZXBsYWNlKHBvbGljeV9tb3VudC5zb3VyY2UsICIkKGJ1bmRsZS1pZCkiLCBidW5kbGVfaWQpCiAgICBwcmludCgicG9saWN5X21vdW50X3NvdXJjZV9hbGxvd3MgMTogcG9saWN5X3NvdXJjZV9yZWdleCA9IiwgcG9saWN5X3NvdXJjZV9yZWdleCkKCiAgICBwcmludCgicG9saWN5X21vdW50X3NvdXJjZV9hbGxvd3MgMTogaW5wdXRfbW91bnQuc291cmNlPSIsIGlucHV0X21vdW50LnNvdXJjZSkKICAgIHJlZ2V4Lm1hdGNoKHBvbGljeV9zb3VyY2VfcmVnZXgsIGlucHV0X21vdW50LnNvdXJjZSkKCiAgICBwcmludCgicG9saWN5X21vdW50X3NvdXJjZV9hbGxvd3MgMTogc3VjY2VzcyIpCn0KcG9saWN5X21vdW50X3NvdXJjZV9hbGxvd3MocG9saWN5X21vdW50LCBpbnB1dF9tb3VudCwgYnVuZGxlX2lkLCBzYW5kYm94X2lkKSB7CiAgICAjIEUuZy4sICJzb3VyY2UiOiAiXi9ydW4va2F0YS1jb250YWluZXJzL3NoYXJlZC9jb250YWluZXJzLyQoc2FuZGJveC1pZCkvcm9vdGZzL2xvY2FsL2RhdGEkIiwKICAgIHBvbGljeV9zb3VyY2VfcmVnZXggOj0gcmVwbGFjZShwb2xpY3lfbW91bnQuc291cmNlLCAiJChzYW5kYm94LWlkKSIsIHNhbmRib3hfaWQpCgogICAgcHJpbnQoInBvbGljeV9tb3VudF9zb3VyY2VfYWxsb3dzIDI6IHBvbGljeV9zb3VyY2VfcmVnZXggPSIsIHBvbGljeV9zb3VyY2VfcmVnZXgsICJpbnB1dF9tb3VudC5zb3VyY2U9IiwgaW5wdXRfbW91bnQuc291cmNlKQogICAgcmVnZXgubWF0Y2gocG9saWN5X3NvdXJjZV9yZWdleCwgaW5wdXRfbW91bnQuc291cmNlKQoKICAgIHByaW50KCJwb2xpY3lfbW91bnRfc291cmNlX2FsbG93cyAyOiBzdWNjZXNzIikKfQoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIFN0b3JhZ2VzCgphbGxvd19zdG9yYWdlcyhwb2xpY3lfc3RvcmFnZXMsIGlucHV0X3N0b3JhZ2VzLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHBvbGljeV9jb3VudCA6PSBjb3VudChwb2xpY3lfc3RvcmFnZXMpCiAgICBpbnB1dF9jb3VudCA6PSBjb3VudChpbnB1dF9zdG9yYWdlcykKICAgIHByaW50KCJhbGxvd19zdG9yYWdlczogcG9saWN5X2NvdW50ID0iLCBwb2xpY3lfY291bnQsICJpbnB1dF9jb3VudCA9IiwgaW5wdXRfY291bnQpCiAgICBwb2xpY3lfY291bnQgPT0gaW5wdXRfY291bnQKCiAgICBzb21lIGksIGlucHV0X3N0b3JhZ2UgaW4gaW5wdXRfc3RvcmFnZXMKICAgIGFsbG93X2lucHV0X3N0b3JhZ2UoaSwgaW5wdXRfc3RvcmFnZSwgcG9saWN5X3N0b3JhZ2VzLCBwb2xpY3lfY291bnQsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZXM6IHN1Y2Nlc3MiKQp9CgphbGxvd19pbnB1dF9zdG9yYWdlKGksIGlucHV0X3N0b3JhZ2UsIHBvbGljeV9zdG9yYWdlcywgY291bnQsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcHJpbnQoImFsbG93X2lucHV0X3N0b3JhZ2U6IGkgPSIsIGksICJpbnB1dF9zdG9yYWdlID0iLCBpbnB1dF9zdG9yYWdlKQoKICAgIHBvbGljeV9zdG9yYWdlIDo9IHBvbGljeV9zdG9yYWdlc1tpXQogICAgcHJpbnQoImFsbG93X2lucHV0X3N0b3JhZ2U6IGkgPSIsIGksICJwb2xpY3lfc3RvcmFnZSA9IiwgcG9saWN5X3N0b3JhZ2UpCgogICAgc3RvcmFnZXNfbWF0Y2gocG9saWN5X3N0b3JhZ2UsIGlucHV0X3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkKCiAgICAjIFN0b3Agd2hlbiByZWFjaGluZyB0aGUgbGFzdCBlbGVtZW50IG9mIHRoZSBzdG9yYWdlcyBhcnJheS4KICAgIGkgPT0gY291bnQgLSAxCn0KCnN0b3JhZ2VzX21hdGNoKHBvbGljeV9zdG9yYWdlLCBpbnB1dF9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHBvbGljeV9zdG9yYWdlLmRyaXZlciAgICAgICAgICAgPT0gaW5wdXRfc3RvcmFnZS5kcml2ZXIKICAgIHBvbGljeV9zdG9yYWdlLmRyaXZlcl9vcHRpb25zICAgPT0gaW5wdXRfc3RvcmFnZS5kcml2ZXJfb3B0aW9ucwogICAgcG9saWN5X3N0b3JhZ2Uub3B0aW9ucyAgICAgICAgICA9PSBpbnB1dF9zdG9yYWdlLm9wdGlvbnMKICAgIHBvbGljeV9zdG9yYWdlLmZzX2dyb3VwICAgICAgICAgPT0gaW5wdXRfc3RvcmFnZS5mc19ncm91cAoKICAgIGFsbG93X21vdW50X3BvaW50KHBvbGljeV9zdG9yYWdlLCBpbnB1dF9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpCgogICAgIyBUT0RPOiB2YWxpZGF0ZSB0aGUgc291cmNlIGZpZWxkIHRvby4KCiAgICBwcmludCgic3RvcmFnZXNfbWF0Y2g6IHN1Y2Nlc3MiKQp9CgphbGxvd19tb3VudF9wb2ludChwb2xpY3lfc3RvcmFnZSwgaW5wdXRfc3RvcmFnZSwgYnVuZGxlX2lkLCBzYW5kYm94X2lkKSB7CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMTogZnN0eXBlID09IHRhciIpCiAgICBwb2xpY3lfc3RvcmFnZS5mc3R5cGUgPT0gInRhciIKCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMTogcG9saWN5X3N0b3JhZ2UubW91bnRfcG9pbnQgPT0gaW5wdXRfc3RvcmFnZS5tb3VudF9wb2ludCIpCiAgICBwb2xpY3lfc3RvcmFnZS5tb3VudF9wb2ludCA9PSBpbnB1dF9zdG9yYWdlLm1vdW50X3BvaW50CgogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDE6IHN1Y2Nlc3MiKQp9CmFsbG93X21vdW50X3BvaW50KHBvbGljeV9zdG9yYWdlLCBpbnB1dF9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCAyOiBmc3R5cGUgPT0gdGFyLW92ZXJsYXkiKQogICAgcG9saWN5X3N0b3JhZ2UuZnN0eXBlID09ICJ0YXItb3ZlcmxheSIKCiAgICBwb2xpY3lfbW91bnRfcG9pbnQgOj0gcmVwbGFjZShwb2xpY3lfc3RvcmFnZS5tb3VudF9wb2ludCwgIiQoYnVuZGxlLWlkKSIsIGJ1bmRsZV9pZCkKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCAyOiBwb2xpY3lfbW91bnRfcG9pbnQgPSIsIHBvbGljeV9tb3VudF9wb2ludCkKCiAgICBwb2xpY3lfbW91bnRfcG9pbnQgPT0gaW5wdXRfc3RvcmFnZS5tb3VudF9wb2ludAoKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCAyOiBzdWNjZXNzIikKfQphbGxvd19tb3VudF9wb2ludChwb2xpY3lfc3RvcmFnZSwgaW5wdXRfc3RvcmFnZSwgYnVuZGxlX2lkLCBzYW5kYm94X2lkKSB7CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogZnN0eXBlID09IGxvY2FsIikKICAgIHBvbGljeV9zdG9yYWdlLmZzdHlwZSA9PSAibG9jYWwiCgogICAgbW91bnRfcG9pbnRfcmVnZXggOj0gcmVwbGFjZShwb2xpY3lfc3RvcmFnZS5tb3VudF9wb2ludCwgIiQoc2FuZGJveC1pZCkiLCBzYW5kYm94X2lkKQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDM6IG1vdW50X3BvaW50X3JlZ2V4ID0iLCBtb3VudF9wb2ludF9yZWdleCkKCiAgICByZWdleC5tYXRjaChtb3VudF9wb2ludF9yZWdleCwgaW5wdXRfc3RvcmFnZS5tb3VudF9wb2ludCkKCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogc3VjY2VzcyIpCn0KYWxsb3dfbW91bnRfcG9pbnQocG9saWN5X3N0b3JhZ2UsIGlucHV0X3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDQ6IGZzdHlwZSA9PSBiaW5kIikKICAgIHBvbGljeV9zdG9yYWdlLmZzdHlwZSA9PSAiYmluZCIKCiAgICBtb3VudF9wb2ludF9yZWdleCA6PSByZXBsYWNlKHBvbGljeV9zdG9yYWdlLm1vdW50X3BvaW50LCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDQ6IG1vdW50X3BvaW50X3JlZ2V4ID0iLCBtb3VudF9wb2ludF9yZWdleCkKCiAgICByZWdleC5tYXRjaChtb3VudF9wb2ludF9yZWdleCwgaW5wdXRfc3RvcmFnZS5tb3VudF9wb2ludCkKCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNDogc3VjY2VzcyIpCn0KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKQ29weUZpbGVSZXF1ZXN0IHsKICAgIHByaW50KCJDb3B5RmlsZVJlcXVlc3Q6IGlucHV0LnBhdGggPSIsIGlucHV0LnBhdGgpCgogICAgc29tZSBwb2xpY3lfcmVnZXggaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5Db3B5RmlsZVJlcXVlc3QKICAgIHJlZ2V4Lm1hdGNoKHBvbGljeV9yZWdleCwgaW5wdXQucGF0aCkKCiAgICBwcmludCgiQ29weUZpbGVSZXF1ZXN0OiBzdWNjZXNzIikKfQoKRXhlY1Byb2Nlc3NSZXF1ZXN0IHsKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMTogaW5wdXQgPSIsIGlucHV0KQoKICAgIGlucHV0X2NvbW1hbmQgPSBjb25jYXQoIiAiLCBpbnB1dC5wcm9jZXNzLkFyZ3MpCgogICAgc29tZSBwb2xpY3lfY29tbWFuZCBpbiBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLkV4ZWNQcm9jZXNzUmVxdWVzdAogICAgcG9saWN5X2NvbW1hbmQgPT0gaW5wdXRfY29tbWFuZAoKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMTogc3VjY2VzcyIpCn0KRXhlY1Byb2Nlc3NSZXF1ZXN0IHsKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMjogaW5wdXQgPSIsIGlucHV0KQoKICAgICMgVE9ETzogbWF0Y2ggaW5wdXQgY29udGFpbmVyIElEIHdpdGggaXRzIGNvcnJlc3BvbmRpbmcgY29udGFpbmVyLmV4ZWNfY29tbWFuZHMuCiAgICBpbnB1dF9jb21tYW5kID0gY29uY2F0KCIgIiwgaW5wdXQucHJvY2Vzcy5BcmdzKQoKICAgIHNvbWUgY29udGFpbmVyIGluIHBvbGljeV9kYXRhLmNvbnRhaW5lcnMKICAgIHNvbWUgcG9saWN5X2NvbW1hbmQgaW4gY29udGFpbmVyLmV4ZWNfY29tbWFuZHMKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMjogcG9saWN5X2NvbW1hbmQgPSIsIHBvbGljeV9jb21tYW5kKQoKICAgICMgVE9ETzogc2hvdWxkIG90aGVyIGlucHV0IGRhdGEgZmllbGRzIGJlIHZhbGlkYXRlZCBhcyB3ZWxsPwogICAgcG9saWN5X2NvbW1hbmQgPT0gaW5wdXRfY29tbWFuZAoKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMjogc3VjY2VzcyIpCn0KClJlYWRTdHJlYW1SZXF1ZXN0IHsKICAgIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuUmVhZFN0cmVhbVJlcXVlc3QgPT0gdHJ1ZQp9CgpXcml0ZVN0cmVhbVJlcXVlc3QgewogICAgcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5Xcml0ZVN0cmVhbVJlcXVlc3QgPT0gdHJ1ZQp9Cgpwb2xpY3lfZGF0YSA6PSB7CiAgImNvbnRhaW5lcnMiOiBbCiAgICB7CiAgICAgICJPQ0kiOiB7CiAgICAgICAgIlZlcnNpb24iOiAiMS4xLjAtcmMuMSIsCiAgICAgICAgIlByb2Nlc3MiOiB7CiAgICAgICAgICAiVGVybWluYWwiOiBmYWxzZSwKICAgICAgICAgICJVc2VyIjogewogICAgICAgICAgICAiVUlEIjogNjU1MzUsCiAgICAgICAgICAgICJHSUQiOiA2NTUzNSwKICAgICAgICAgICAgIkFkZGl0aW9uYWxHaWRzIjogW10sCiAgICAgICAgICAgICJVc2VybmFtZSI6ICIiCiAgICAgICAgICB9LAogICAgICAgICAgIkFyZ3MiOiBbCiAgICAgICAgICAgICIvcGF1c2UiCiAgICAgICAgICBdLAogICAgICAgICAgIkVudiI6IFsKICAgICAgICAgICAgIlBBVEg9L3Vzci9sb2NhbC9zYmluOi91c3IvbG9jYWwvYmluOi91c3Ivc2JpbjovdXNyL2Jpbjovc2JpbjovYmluIgogICAgICAgICAgXSwKICAgICAgICAgICJDd2QiOiAiLyIsCiAgICAgICAgICAiQ2FwYWJpbGl0aWVzIjogewogICAgICAgICAgICAiQW1iaWVudCI6IFtdLAogICAgICAgICAgICAiQm91bmRpbmciOiBbCiAgICAgICAgICAgICAgIkNBUF9DSE9XTiIsCiAgICAgICAgICAgICAgIkNBUF9EQUNfT1ZFUlJJREUiLAogICAgICAgICAgICAgICJDQVBfRlNFVElEIiwKICAgICAgICAgICAgICAiQ0FQX0ZPV05FUiIsCiAgICAgICAgICAgICAgIkNBUF9NS05PRCIsCiAgICAgICAgICAgICAgIkNBUF9ORVRfUkFXIiwKICAgICAgICAgICAgICAiQ0FQX1NFVEdJRCIsCiAgICAgICAgICAgICAgIkNBUF9TRVRVSUQiLAogICAgICAgICAgICAgICJDQVBfU0VURkNBUCIsCiAgICAgICAgICAgICAgIkNBUF9TRVRQQ0FQIiwKICAgICAgICAgICAgICAiQ0FQX05FVF9CSU5EX1NFUlZJQ0UiLAogICAgICAgICAgICAgICJDQVBfU1lTX0NIUk9PVCIsCiAgICAgICAgICAgICAgIkNBUF9LSUxMIiwKICAgICAgICAgICAgICAiQ0FQX0FVRElUX1dSSVRFIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiRWZmZWN0aXZlIjogWwogICAgICAgICAgICAgICJDQVBfQ0hPV04iLAogICAgICAgICAgICAgICJDQVBfREFDX09WRVJSSURFIiwKICAgICAgICAgICAgICAiQ0FQX0ZTRVRJRCIsCiAgICAgICAgICAgICAgIkNBUF9GT1dORVIiLAogICAgICAgICAgICAgICJDQVBfTUtOT0QiLAogICAgICAgICAgICAgICJDQVBfTkVUX1JBVyIsCiAgICAgICAgICAgICAgIkNBUF9TRVRHSUQiLAogICAgICAgICAgICAgICJDQVBfU0VUVUlEIiwKICAgICAgICAgICAgICAiQ0FQX1NFVEZDQVAiLAogICAgICAgICAgICAgICJDQVBfU0VUUENBUCIsCiAgICAgICAgICAgICAgIkNBUF9ORVRfQklORF9TRVJWSUNFIiwKICAgICAgICAgICAgICAiQ0FQX1NZU19DSFJPT1QiLAogICAgICAgICAgICAgICJDQVBfS0lMTCIsCiAgICAgICAgICAgICAgIkNBUF9BVURJVF9XUklURSIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgIkluaGVyaXRhYmxlIjogW10sCiAgICAgICAgICAgICJQZXJtaXR0ZWQiOiBbCiAgICAgICAgICAgICAgIkNBUF9DSE9XTiIsCiAgICAgICAgICAgICAgIkNBUF9EQUNfT1ZFUlJJREUiLAogICAgICAgICAgICAgICJDQVBfRlNFVElEIiwKICAgICAgICAgICAgICAiQ0FQX0ZPV05FUiIsCiAgICAgICAgICAgICAgIkNBUF9NS05PRCIsCiAgICAgICAgICAgICAgIkNBUF9ORVRfUkFXIiwKICAgICAgICAgICAgICAiQ0FQX1NFVEdJRCIsCiAgICAgICAgICAgICAgIkNBUF9TRVRVSUQiLAogICAgICAgICAgICAgICJDQVBfU0VURkNBUCIsCiAgICAgICAgICAgICAgIkNBUF9TRVRQQ0FQIiwKICAgICAgICAgICAgICAiQ0FQX05FVF9CSU5EX1NFUlZJQ0UiLAogICAgICAgICAgICAgICJDQVBfU1lTX0NIUk9PVCIsCiAgICAgICAgICAgICAgIkNBUF9LSUxMIiwKICAgICAgICAgICAgICAiQ0FQX0FVRElUX1dSSVRFIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgIk5vTmV3UHJpdmlsZWdlcyI6IHRydWUKICAgICAgICB9LAogICAgICAgICJSb290IjogewogICAgICAgICAgIlBhdGgiOiAiL3J1bi9rYXRhLWNvbnRhaW5lcnMvc2hhcmVkL2NvbnRhaW5lcnMvJChidW5kbGUtaWQpIiwKICAgICAgICAgICJSZWFkb25seSI6IHRydWUKICAgICAgICB9LAogICAgICAgICJNb3VudHMiOiBbCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvcHJvYyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAicHJvYyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJwcm9jIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAgICAgIm5vZGV2IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2RldiIsCiAgICAgICAgICAgICJzb3VyY2UiOiAidG1wZnMiLAogICAgICAgICAgICAidHlwZV8iOiAidG1wZnMiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAic3RyaWN0YXRpbWUiLAogICAgICAgICAgICAgICJtb2RlPTc1NSIsCiAgICAgICAgICAgICAgInNpemU9NjU1MzZrIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi9wdHMiLAogICAgICAgICAgICAic291cmNlIjogImRldnB0cyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJkZXZwdHMiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibmV3aW5zdGFuY2UiLAogICAgICAgICAgICAgICJwdG14bW9kZT0wNjY2IiwKICAgICAgICAgICAgICAibW9kZT0wNjIwIiwKICAgICAgICAgICAgICAiZ2lkPTUiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L3NobSIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiL3J1bi9rYXRhLWNvbnRhaW5lcnMvc2FuZGJveC9zaG0iLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvbXF1ZXVlIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJtcXVldWUiLAogICAgICAgICAgICAidHlwZV8iOiAibXF1ZXVlIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAgICAgIm5vZGV2IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL3N5cyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAic3lzZnMiLAogICAgICAgICAgICAidHlwZV8iOiAic3lzZnMiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiLAogICAgICAgICAgICAgICJybyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9ldGMvcmVzb2x2LmNvbmYiLAogICAgICAgICAgICAic291cmNlIjogIl4vcnVuL2thdGEtY29udGFpbmVycy9zaGFyZWQvY29udGFpbmVycy8kKGJ1bmRsZS1pZCktW2EtejAtOV17MTZ9LXJlc29sdi5jb25mJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicm8iLAogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2RldiIsCiAgICAgICAgICAgICAgIm5vZXhlYyIKICAgICAgICAgICAgXQogICAgICAgICAgfQogICAgICAgIF0sCiAgICAgICAgIkFubm90YXRpb25zIjogewogICAgICAgICAgImlvLmthdGFjb250YWluZXJzLnBrZy5vY2kuYnVuZGxlX3BhdGgiOiAiL3J1bi9jb250YWluZXJkL2lvLmNvbnRhaW5lcmQucnVudGltZS52Mi50YXNrL2s4cy5pby8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgImlvLmthdGFjb250YWluZXJzLnBrZy5vY2kuY29udGFpbmVyX3R5cGUiOiAicG9kX3NhbmRib3giLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLmNvbnRhaW5lci10eXBlIjogInNhbmRib3giLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtaWQiOiAiXlthLXowLTldezY0fSQiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbG9nLWRpcmVjdG9yeSI6ICJeL3Zhci9sb2cvcG9kcy8kKHNhbmRib3gtbmFtZXNwYWNlKV8kKHNhbmRib3gtbmFtZSlfWzAtOWEtZl17OH0tWzAtOWEtZl17NH0tWzAtOWEtZl17NH0tWzAtOWEtZl17NH0tWzAtOWEtZl17MTJ9JCIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1uYW1lc3BhY2UiOiAiZGVmYXVsdCIsCiAgICAgICAgICAibmVyZGN0bC9uZXR3b3JrLW5hbWVzcGFjZSI6ICJeL3Zhci9ydW4vbmV0bnMvY25pLVswLTlhLWZdezh9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezEyfSQiCiAgICAgICAgfSwKICAgICAgICAiTGludXgiOiB7CiAgICAgICAgICAiTmFtZXNwYWNlcyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICJUeXBlIjogImlwYyIsCiAgICAgICAgICAgICAgIlBhdGgiOiAiIgogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgIlR5cGUiOiAidXRzIiwKICAgICAgICAgICAgICAiUGF0aCI6ICIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiVHlwZSI6ICJtb3VudCIsCiAgICAgICAgICAgICAgIlBhdGgiOiAiIgogICAgICAgICAgICB9CiAgICAgICAgICBdLAogICAgICAgICAgIk1hc2tlZFBhdGhzIjogWwogICAgICAgICAgICAiL3Byb2MvYWNwaSIsCiAgICAgICAgICAgICIvcHJvYy9hc291bmQiLAogICAgICAgICAgICAiL3Byb2Mva2NvcmUiLAogICAgICAgICAgICAiL3Byb2Mva2V5cyIsCiAgICAgICAgICAgICIvcHJvYy9sYXRlbmN5X3N0YXRzIiwKICAgICAgICAgICAgIi9wcm9jL3RpbWVyX2xpc3QiLAogICAgICAgICAgICAiL3Byb2MvdGltZXJfc3RhdHMiLAogICAgICAgICAgICAiL3Byb2Mvc2NoZWRfZGVidWciLAogICAgICAgICAgICAiL3N5cy9maXJtd2FyZSIsCiAgICAgICAgICAgICIvcHJvYy9zY3NpIgogICAgICAgICAgXSwKICAgICAgICAgICJSZWFkb25seVBhdGhzIjogWwogICAgICAgICAgICAiL3Byb2MvYnVzIiwKICAgICAgICAgICAgIi9wcm9jL2ZzIiwKICAgICAgICAgICAgIi9wcm9jL2lycSIsCiAgICAgICAgICAgICIvcHJvYy9zeXMiLAogICAgICAgICAgICAiL3Byb2Mvc3lzcnEtdHJpZ2dlciIKICAgICAgICAgIF0KICAgICAgICB9CiAgICAgIH0sCiAgICAgICJzdG9yYWdlcyI6IFsKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAicm8iLAogICAgICAgICAgICAiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmJsb2NrX2RldmljZT1maWxlIiwKICAgICAgICAgICAgImlvLmthdGFjb250YWluZXJzLmZzLW9wdC5pcy1sYXllciIsCiAgICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQucm9vdC1oYXNoPTgxNzI1MGYxYTNlMzM2ZGE3NmY1YmQzZmE3ODRlMWIyNmQ5NTliOWMxMzE4NzY4MTViYTI2MDQwNDhiNzBjMTgiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIi9ydW4va2F0YS1jb250YWluZXJzL3NhbmRib3gvbGF5ZXJzLzVhNWFhZDgwMDU1ZmYyMDAxMmE1MGRjMjVmOGRmN2EyOTkyNDQ3NDMyNGQ2NWY3ZDUzMDZlZThlZTI3ZmY3MWQiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJvdmVybGF5ZnMiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogInRhci1vdmVybGF5IiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmxheWVyLXNyYy1wcmVmaXg9L3Zhci9saWIvY29udGFpbmVyZC9pby5jb250YWluZXJkLnNuYXBzaG90dGVyLnYxLnRhcmRldi9sYXllcnMiLAogICAgICAgICAgICAiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmxheWVyPU5XRTFZV0ZrT0RBd05UVm1aakl3TURFeVlUVXdaR015TldZNFpHWTNZVEk1T1RJME5EYzBNekkwWkRZMVpqZGtOVE13Tm1WbE9HVmxNamRtWmpjeFpDeDBZWElzY204c2FXOHVhMkYwWVdOdmJuUmhhVzVsY25NdVpuTXRiM0IwTG1Kc2IyTnJYMlJsZG1salpUMW1hV3hsTEdsdkxtdGhkR0ZqYjI1MFlXbHVaWEp6TG1aekxXOXdkQzVwY3kxc1lYbGxjaXhwYnk1cllYUmhZMjl1ZEdGcGJtVnljeTVtY3kxdmNIUXVjbTl2ZEMxb1lYTm9QVGd4TnpJMU1HWXhZVE5sTXpNMlpHRTNObVkxWW1RelptRTNPRFJsTVdJeU5tUTVOVGxpT1dNeE16RTROelk0TVRWaVlUSTJNRFF3TkRoaU56QmpNVGc9IiwKICAgICAgICAgICAgImlvLmthdGFjb250YWluZXJzLmZzLW9wdC5vdmVybGF5LXJ3IiwKICAgICAgICAgICAgImxvd2VyZGlyPTVhNWFhZDgwMDU1ZmYyMDAxMmE1MGRjMjVmOGRmN2EyOTkyNDQ3NDMyNGQ2NWY3ZDUzMDZlZThlZTI3ZmY3MWQiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIi9ydW4va2F0YS1jb250YWluZXJzL3NoYXJlZC9jb250YWluZXJzLyQoYnVuZGxlLWlkKSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfQogICAgICBdLAogICAgICAiZXhlY19jb21tYW5kcyI6IFtdCiAgICB9LAogICAgewogICAgICAiT0NJIjogewogICAgICAgICJWZXJzaW9uIjogIjEuMS4wLXJjLjEiLAogICAgICAgICJQcm9jZXNzIjogewogICAgICAgICAgIlRlcm1pbmFsIjogZmFsc2UsCiAgICAgICAgICAiVXNlciI6IHsKICAgICAgICAgICAgIlVJRCI6IDAsCiAgICAgICAgICAgICJHSUQiOiAwLAogICAgICAgICAgICAiQWRkaXRpb25hbEdpZHMiOiBbXSwKICAgICAgICAgICAgIlVzZXJuYW1lIjogIiIKICAgICAgICAgIH0sCiAgICAgICAgICAiQXJncyI6IFsKICAgICAgICAgICAgInJlZGlzLXNlcnZlciIsCiAgICAgICAgICAgICItLXNsYXZlb2YiLAogICAgICAgICAgICAicmVkaXMtbWFzdGVyIiwKICAgICAgICAgICAgIjYzNzkiCiAgICAgICAgICBdLAogICAgICAgICAgIkVudiI6IFsKICAgICAgICAgICAgIlBBVEg9L3Vzci9sb2NhbC9zYmluOi91c3IvbG9jYWwvYmluOi91c3Ivc2JpbjovdXNyL2Jpbjovc2JpbjovYmluIiwKICAgICAgICAgICAgIlJFRElTX1ZFUlNJT049NS4wLjUiLAogICAgICAgICAgICAiUkVESVNfRE9XTkxPQURfVVJMPWh0dHA6Ly9kb3dubG9hZC5yZWRpcy5pby9yZWxlYXNlcy9yZWRpcy01LjAuNS50YXIuZ3oiLAogICAgICAgICAgICAiUkVESVNfRE9XTkxPQURfU0hBPTIxMzkwMDk3OTlkMjFkOGZmOTRmYzQwYjdmMzZhYzQ2Njk5YjllMTI1NDA4NjI5OWY4ZDNiMjIzY2E1NGEzNzUiLAogICAgICAgICAgICAiSE9TVE5BTUU9JChob3N0LW5hbWUpIiwKICAgICAgICAgICAgIkdFVF9IT1NUU19GUk9NPWRucyIKICAgICAgICAgIF0sCiAgICAgICAgICAiQ3dkIjogIi9kYXRhIiwKICAgICAgICAgICJDYXBhYmlsaXRpZXMiOiB7CiAgICAgICAgICAgICJBbWJpZW50IjogW10sCiAgICAgICAgICAgICJCb3VuZGluZyI6IFsKICAgICAgICAgICAgICAiQ0FQX0NIT1dOIiwKICAgICAgICAgICAgICAiQ0FQX0RBQ19PVkVSUklERSIsCiAgICAgICAgICAgICAgIkNBUF9GU0VUSUQiLAogICAgICAgICAgICAgICJDQVBfRk9XTkVSIiwKICAgICAgICAgICAgICAiQ0FQX01LTk9EIiwKICAgICAgICAgICAgICAiQ0FQX05FVF9SQVciLAogICAgICAgICAgICAgICJDQVBfU0VUR0lEIiwKICAgICAgICAgICAgICAiQ0FQX1NFVFVJRCIsCiAgICAgICAgICAgICAgIkNBUF9TRVRGQ0FQIiwKICAgICAgICAgICAgICAiQ0FQX1NFVFBDQVAiLAogICAgICAgICAgICAgICJDQVBfTkVUX0JJTkRfU0VSVklDRSIsCiAgICAgICAgICAgICAgIkNBUF9TWVNfQ0hST09UIiwKICAgICAgICAgICAgICAiQ0FQX0tJTEwiLAogICAgICAgICAgICAgICJDQVBfQVVESVRfV1JJVEUiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJFZmZlY3RpdmUiOiBbCiAgICAgICAgICAgICAgIkNBUF9DSE9XTiIsCiAgICAgICAgICAgICAgIkNBUF9EQUNfT1ZFUlJJREUiLAogICAgICAgICAgICAgICJDQVBfRlNFVElEIiwKICAgICAgICAgICAgICAiQ0FQX0ZPV05FUiIsCiAgICAgICAgICAgICAgIkNBUF9NS05PRCIsCiAgICAgICAgICAgICAgIkNBUF9ORVRfUkFXIiwKICAgICAgICAgICAgICAiQ0FQX1NFVEdJRCIsCiAgICAgICAgICAgICAgIkNBUF9TRVRVSUQiLAogICAgICAgICAgICAgICJDQVBfU0VURkNBUCIsCiAgICAgICAgICAgICAgIkNBUF9TRVRQQ0FQIiwKICAgICAgICAgICAgICAiQ0FQX05FVF9CSU5EX1NFUlZJQ0UiLAogICAgICAgICAgICAgICJDQVBfU1lTX0NIUk9PVCIsCiAgICAgICAgICAgICAgIkNBUF9LSUxMIiwKICAgICAgICAgICAgICAiQ0FQX0FVRElUX1dSSVRFIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiSW5oZXJpdGFibGUiOiBbXSwKICAgICAgICAgICAgIlBlcm1pdHRlZCI6IFsKICAgICAgICAgICAgICAiQ0FQX0NIT1dOIiwKICAgICAgICAgICAgICAiQ0FQX0RBQ19PVkVSUklERSIsCiAgICAgICAgICAgICAgIkNBUF9GU0VUSUQiLAogICAgICAgICAgICAgICJDQVBfRk9XTkVSIiwKICAgICAgICAgICAgICAiQ0FQX01LTk9EIiwKICAgICAgICAgICAgICAiQ0FQX05FVF9SQVciLAogICAgICAgICAgICAgICJDQVBfU0VUR0lEIiwKICAgICAgICAgICAgICAiQ0FQX1NFVFVJRCIsCiAgICAgICAgICAgICAgIkNBUF9TRVRGQ0FQIiwKICAgICAgICAgICAgICAiQ0FQX1NFVFBDQVAiLAogICAgICAgICAgICAgICJDQVBfTkVUX0JJTkRfU0VSVklDRSIsCiAgICAgICAgICAgICAgIkNBUF9TWVNfQ0hST09UIiwKICAgICAgICAgICAgICAiQ0FQX0tJTEwiLAogICAgICAgICAgICAgICJDQVBfQVVESVRfV1JJVEUiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICAiTm9OZXdQcml2aWxlZ2VzIjogZmFsc2UKICAgICAgICB9LAogICAgICAgICJSb290IjogewogICAgICAgICAgIlBhdGgiOiAiL3J1bi9rYXRhLWNvbnRhaW5lcnMvc2hhcmVkL2NvbnRhaW5lcnMvJChidW5kbGUtaWQpIiwKICAgICAgICAgICJSZWFkb25seSI6IGZhbHNlCiAgICAgICAgfSwKICAgICAgICAiTW91bnRzIjogWwogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL3Byb2MiLAogICAgICAgICAgICAic291cmNlIjogInByb2MiLAogICAgICAgICAgICAidHlwZV8iOiAicHJvYyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYiLAogICAgICAgICAgICAic291cmNlIjogInRtcGZzIiwKICAgICAgICAgICAgInR5cGVfIjogInRtcGZzIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgInN0cmljdGF0aW1lIiwKICAgICAgICAgICAgICAibW9kZT03NTUiLAogICAgICAgICAgICAgICJzaXplPTY1NTM2ayIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvcHRzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJkZXZwdHMiLAogICAgICAgICAgICAidHlwZV8iOiAiZGV2cHRzIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAgICAgIm5ld2luc3RhbmNlIiwKICAgICAgICAgICAgICAicHRteG1vZGU9MDY2NiIsCiAgICAgICAgICAgICAgIm1vZGU9MDYyMCIsCiAgICAgICAgICAgICAgImdpZD01IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi9zaG0iLAogICAgICAgICAgICAic291cmNlIjogIi9ydW4va2F0YS1jb250YWluZXJzL3NhbmRib3gvc2htIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L21xdWV1ZSIsCiAgICAgICAgICAgICJzb3VyY2UiOiAibXF1ZXVlIiwKICAgICAgICAgICAgInR5cGVfIjogIm1xdWV1ZSIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9zeXMiLAogICAgICAgICAgICAic291cmNlIjogInN5c2ZzIiwKICAgICAgICAgICAgInR5cGVfIjogInN5c2ZzIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAgICAgIm5vZGV2IiwKICAgICAgICAgICAgICAicm8iCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvc3lzL2ZzL2Nncm91cCIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiY2dyb3VwIiwKICAgICAgICAgICAgInR5cGVfIjogImNncm91cCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIsCiAgICAgICAgICAgICAgInJlbGF0aW1lIiwKICAgICAgICAgICAgICAicm8iCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZXRjL2hvc3RzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJeL3J1bi9rYXRhLWNvbnRhaW5lcnMvc2hhcmVkL2NvbnRhaW5lcnMvJChidW5kbGUtaWQpLVthLXowLTldezE2fS1ob3N0cyQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicnciCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L3Rlcm1pbmF0aW9uLWxvZyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiXi9ydW4va2F0YS1jb250YWluZXJzL3NoYXJlZC9jb250YWluZXJzLyQoYnVuZGxlLWlkKS1bYS16MC05XXsxNn0tdGVybWluYXRpb24tbG9nJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJydyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9ldGMvaG9zdG5hbWUiLAogICAgICAgICAgICAic291cmNlIjogIl4vcnVuL2thdGEtY29udGFpbmVycy9zaGFyZWQvY29udGFpbmVycy8kKGJ1bmRsZS1pZCktW2EtejAtOV17MTZ9LWhvc3RuYW1lJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJydyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9ldGMvcmVzb2x2LmNvbmYiLAogICAgICAgICAgICAic291cmNlIjogIl4vcnVuL2thdGEtY29udGFpbmVycy9zaGFyZWQvY29udGFpbmVycy8kKGJ1bmRsZS1pZCktW2EtejAtOV17MTZ9LXJlc29sdi5jb25mJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJydyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi92YXIvcnVuL3NlY3JldHMva3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudCIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiXi9ydW4va2F0YS1jb250YWluZXJzL3NoYXJlZC9jb250YWluZXJzLyQoYnVuZGxlLWlkKS1bYS16MC05XXsxNn0tc2VydmljZWFjY291bnQkIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL3Zhci9ydW4vc2VjcmV0cy9henVyZS90b2tlbnMiLAogICAgICAgICAgICAic291cmNlIjogIl4vcnVuL2thdGEtY29udGFpbmVycy9zaGFyZWQvY29udGFpbmVycy8kKGJ1bmRsZS1pZCktW2EtejAtOV17MTZ9LXRva2VucyQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicm8iCiAgICAgICAgICAgIF0KICAgICAgICAgIH0KICAgICAgICBdLAogICAgICAgICJBbm5vdGF0aW9ucyI6IHsKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmJ1bmRsZV9wYXRoIjogIi9ydW4vY29udGFpbmVyZC9pby5jb250YWluZXJkLnJ1bnRpbWUudjIudGFzay9rOHMuaW8vJChidW5kbGUtaWQpIiwKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIjogInBvZF9jb250YWluZXIiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLmNvbnRhaW5lci1uYW1lIjogInNsYXZlIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSI6ICJjb250YWluZXIiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLmltYWdlLW5hbWUiOiAiZG9ja2VyLmlvL2xpYnJhcnkvcmVkaXM6NS4wLjUtYWxwaW5lIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWlkIjogIl5bYS16MC05XXs2NH0kIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LW5hbWVzcGFjZSI6ICJkZWZhdWx0IgogICAgICAgIH0sCiAgICAgICAgIkxpbnV4IjogewogICAgICAgICAgIk5hbWVzcGFjZXMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiVHlwZSI6ICJpcGMiLAogICAgICAgICAgICAgICJQYXRoIjogIiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJUeXBlIjogInV0cyIsCiAgICAgICAgICAgICAgIlBhdGgiOiAiIgogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgIlR5cGUiOiAibW91bnQiLAogICAgICAgICAgICAgICJQYXRoIjogIiIKICAgICAgICAgICAgfQogICAgICAgICAgXSwKICAgICAgICAgICJNYXNrZWRQYXRocyI6IFsKICAgICAgICAgICAgIi9wcm9jL2FjcGkiLAogICAgICAgICAgICAiL3Byb2Mva2NvcmUiLAogICAgICAgICAgICAiL3Byb2Mva2V5cyIsCiAgICAgICAgICAgICIvcHJvYy9sYXRlbmN5X3N0YXRzIiwKICAgICAgICAgICAgIi9wcm9jL3RpbWVyX2xpc3QiLAogICAgICAgICAgICAiL3Byb2MvdGltZXJfc3RhdHMiLAogICAgICAgICAgICAiL3Byb2Mvc2NoZWRfZGVidWciLAogICAgICAgICAgICAiL3Byb2Mvc2NzaSIsCiAgICAgICAgICAgICIvc3lzL2Zpcm13YXJlIgogICAgICAgICAgXSwKICAgICAgICAgICJSZWFkb25seVBhdGhzIjogWwogICAgICAgICAgICAiL3Byb2MvYXNvdW5kIiwKICAgICAgICAgICAgIi9wcm9jL2J1cyIsCiAgICAgICAgICAgICIvcHJvYy9mcyIsCiAgICAgICAgICAgICIvcHJvYy9pcnEiLAogICAgICAgICAgICAiL3Byb2Mvc3lzIiwKICAgICAgICAgICAgIi9wcm9jL3N5c3JxLXRyaWdnZXIiCiAgICAgICAgICBdCiAgICAgICAgfQogICAgICB9LAogICAgICAic3RvcmFnZXMiOiBbCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJibGsiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogInRhciIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgInJvIiwKICAgICAgICAgICAgImlvLmthdGFjb250YWluZXJzLmZzLW9wdC5ibG9ja19kZXZpY2U9ZmlsZSIsCiAgICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQuaXMtbGF5ZXIiLAogICAgICAgICAgICAiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LnJvb3QtaGFzaD1mYjJlNDMyYWYxZTBlZjE5YzhjZDIyODdiOWVlYWNjNTQ1MDI1ZmVkNzk3ZDY0OWNjYTZiYTRiZjUzZWMyNjQ4IgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L2xheWVycy9hYjI2MzEzODhmZDgxYTk5MzFkOTk1YzdhZDk0MDlmMGRjMTg0OWJkMmM3ZDA1NTZlZDA3MTBhN2QwNGJlYzE4IiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICJybyIsCiAgICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQuYmxvY2tfZGV2aWNlPWZpbGUiLAogICAgICAgICAgICAiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmlzLWxheWVyIiwKICAgICAgICAgICAgImlvLmthdGFjb250YWluZXJzLmZzLW9wdC5yb290LWhhc2g9YTU2MDljZjA3YzdmY2VlODRkOGU4YTAyZTVjYTU1NDUwYTI0MmM1ZjM2YTI3ZGJjODQ2ZTQ5ODlkNGJkNWM5NyIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiL3J1bi9rYXRhLWNvbnRhaW5lcnMvc2FuZGJveC9sYXllcnMvMDQ0NTIzZjljMGFjNGVjNmJkNzg1YzA1ZWNmZjEwYTY2ODhkNzc1NjY2MzVkMTRlODQ4ZTZjNGQ1NDk0YTU4ZSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAicm8iLAogICAgICAgICAgICAiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmJsb2NrX2RldmljZT1maWxlIiwKICAgICAgICAgICAgImlvLmthdGFjb250YWluZXJzLmZzLW9wdC5pcy1sYXllciIsCiAgICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQucm9vdC1oYXNoPThmMmZkZGVhZGRlNzk5NThkOTViOTBjNjczZDUxMmM5OTM4NTM3MGVjMzI3Mjk0NTc0MTI3NzUwNjZjODdmNmIiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIi9ydW4va2F0YS1jb250YWluZXJzL3NhbmRib3gvbGF5ZXJzL2VmZTI3ZGFlNWJkZGQ0Yjc5NTdmODMzNThjZjg1N2FiMjRiMmJhY2E3ZTUxZjc2NmE2ZTExM2VlYWI1YzYwOTUiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJibGsiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogInRhciIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgInJvIiwKICAgICAgICAgICAgImlvLmthdGFjb250YWluZXJzLmZzLW9wdC5ibG9ja19kZXZpY2U9ZmlsZSIsCiAgICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQuaXMtbGF5ZXIiLAogICAgICAgICAgICAiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LnJvb3QtaGFzaD1lYTQyMmI5OGY3NTk5YmZiYTZjMjlhYzhjOTJjNjI1MmVjOTNjMzBjNzkyZGVlMmMxMWE5NjFmZWY4M2Q0ZTQ5IgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L2xheWVycy9hMDFlZjE3OTNkNDNjMDY4Y2E1NDhiMDIyM2IwYTJiZjM4NDRkYjA0ZGI3MzI3YTQyOGY5Y2RhZmVjNTRmZDU3IiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICJybyIsCiAgICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQuYmxvY2tfZGV2aWNlPWZpbGUiLAogICAgICAgICAgICAiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmlzLWxheWVyIiwKICAgICAgICAgICAgImlvLmthdGFjb250YWluZXJzLmZzLW9wdC5yb290LWhhc2g9MWFiNGY4MGIwMGE1OGZkZTM0NDRkNmE5NjBjNmVlMDI5ZTQ4NDU0ZDk4YzAwZDFhZjVlNDI4YjBjYzM3MWQ1OCIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiL3J1bi9rYXRhLWNvbnRhaW5lcnMvc2FuZGJveC9sYXllcnMvZGNmNDlkZmI2YWZiMDRmZTk0NmIyZDRkNGFkYmRhMWM0MzJlMzk0MDkzM2NjZTdiNDViNWY2NjYzYmE2N2Q5MSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAicm8iLAogICAgICAgICAgICAiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmJsb2NrX2RldmljZT1maWxlIiwKICAgICAgICAgICAgImlvLmthdGFjb250YWluZXJzLmZzLW9wdC5pcy1sYXllciIsCiAgICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQucm9vdC1oYXNoPTVlY2VlZTNjMTVmZTJiY2RmYjAyOWM3NmIxNGU3MWNiOTFiMjkzMzRkZTJmZTk1MjZhY2NhMWM3YjM0NmNjMjAiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIi9ydW4va2F0YS1jb250YWluZXJzL3NhbmRib3gvbGF5ZXJzL2FmMDhjOTE4ZDMxNzg3OGNhMTBlOGVhY2QzMmI2MDVjNTIyN2Y3OGIzMjM2ZGUyMDRjZGI1NGM0ZWQwY2JhOWMiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJvdmVybGF5ZnMiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogInRhci1vdmVybGF5IiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmxheWVyLXNyYy1wcmVmaXg9L3Zhci9saWIvY29udGFpbmVyZC9pby5jb250YWluZXJkLnNuYXBzaG90dGVyLnYxLnRhcmRldi9sYXllcnMiLAogICAgICAgICAgICAiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmxheWVyPVlXSXlOak14TXpnNFptUTRNV0U1T1RNeFpEazVOV00zWVdRNU5EQTVaakJrWXpFNE5EbGlaREpqTjJRd05UVTJaV1F3TnpFd1lUZGtNRFJpWldNeE9DeDBZWElzY204c2FXOHVhMkYwWVdOdmJuUmhhVzVsY25NdVpuTXRiM0IwTG1Kc2IyTnJYMlJsZG1salpUMW1hV3hsTEdsdkxtdGhkR0ZqYjI1MFlXbHVaWEp6TG1aekxXOXdkQzVwY3kxc1lYbGxjaXhwYnk1cllYUmhZMjl1ZEdGcGJtVnljeTVtY3kxdmNIUXVjbTl2ZEMxb1lYTm9QV1ppTW1VME16SmhaakZsTUdWbU1UbGpPR05rTWpJNE4ySTVaV1ZoWTJNMU5EVXdNalZtWldRM09UZGtOalE1WTJOaE5tSmhOR0ptTlRObFl6STJORGc9IiwKICAgICAgICAgICAgImlvLmthdGFjb250YWluZXJzLmZzLW9wdC5sYXllcj1NRFEwTlRJelpqbGpNR0ZqTkdWak5tSmtOemcxWXpBMVpXTm1aakV3WVRZMk9EaGtOemMxTmpZMk16VmtNVFJsT0RRNFpUWmpOR1ExTkRrMFlUVTRaU3gwWVhJc2NtOHNhVzh1YTJGMFlXTnZiblJoYVc1bGNuTXVabk10YjNCMExtSnNiMk5yWDJSbGRtbGpaVDFtYVd4bExHbHZMbXRoZEdGamIyNTBZV2x1WlhKekxtWnpMVzl3ZEM1cGN5MXNZWGxsY2l4cGJ5NXJZWFJoWTI5dWRHRnBibVZ5Y3k1bWN5MXZjSFF1Y205dmRDMW9ZWE5vUFdFMU5qQTVZMll3TjJNM1ptTmxaVGcwWkRobE9HRXdNbVUxWTJFMU5UUTFNR0V5TkRKak5XWXpObUV5TjJSaVl6ZzBObVUwT1RnNVpEUmlaRFZqT1RjPSIsCiAgICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQubGF5ZXI9WldabE1qZGtZV1UxWW1Sa1pEUmlOemsxTjJZNE16TTFPR05tT0RVM1lXSXlOR0l5WW1GallUZGxOVEZtTnpZMllUWmxNVEV6WldWaFlqVmpOakE1TlN4MFlYSXNjbThzYVc4dWEyRjBZV052Ym5SaGFXNWxjbk11Wm5NdGIzQjBMbUpzYjJOclgyUmxkbWxqWlQxbWFXeGxMR2x2TG10aGRHRmpiMjUwWVdsdVpYSnpMbVp6TFc5d2RDNXBjeTFzWVhsbGNpeHBieTVyWVhSaFkyOXVkR0ZwYm1WeWN5NW1jeTF2Y0hRdWNtOXZkQzFvWVhOb1BUaG1NbVprWkdWaFpHUmxOems1TlRoa09UVmlPVEJqTmpjelpEVXhNbU01T1RNNE5UTTNNR1ZqTXpJM01qazBOVGMwTVRJM056VXdOalpqT0RkbU5tST0iLAogICAgICAgICAgICAiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmxheWVyPVlUQXhaV1l4TnprelpEUXpZekEyT0dOaE5UUTRZakF5TWpOaU1HRXlZbVl6T0RRMFpHSXdOR1JpTnpNeU4yRTBNamhtT1dOa1lXWmxZelUwWm1RMU55eDBZWElzY204c2FXOHVhMkYwWVdOdmJuUmhhVzVsY25NdVpuTXRiM0IwTG1Kc2IyTnJYMlJsZG1salpUMW1hV3hsTEdsdkxtdGhkR0ZqYjI1MFlXbHVaWEp6TG1aekxXOXdkQzVwY3kxc1lYbGxjaXhwYnk1cllYUmhZMjl1ZEdGcGJtVnljeTVtY3kxdmNIUXVjbTl2ZEMxb1lYTm9QV1ZoTkRJeVlqazRaamMxT1RsaVptSmhObU15T1dGak9HTTVNbU0yTWpVeVpXTTVNMk16TUdNM09USmtaV1V5WXpFeFlUazJNV1psWmpnelpEUmxORGs9IiwKICAgICAgICAgICAgImlvLmthdGFjb250YWluZXJzLmZzLW9wdC5sYXllcj1aR05tTkRsa1ptSTJZV1ppTURSbVpUazBObUl5WkRSa05HRmtZbVJoTVdNME16SmxNemswTURrek0yTmpaVGRpTkRWaU5XWTJOall6WW1FMk4yUTVNU3gwWVhJc2NtOHNhVzh1YTJGMFlXTnZiblJoYVc1bGNuTXVabk10YjNCMExtSnNiMk5yWDJSbGRtbGpaVDFtYVd4bExHbHZMbXRoZEdGamIyNTBZV2x1WlhKekxtWnpMVzl3ZEM1cGN5MXNZWGxsY2l4cGJ5NXJZWFJoWTI5dWRHRnBibVZ5Y3k1bWN5MXZjSFF1Y205dmRDMW9ZWE5vUFRGaFlqUm1PREJpTURCaE5UaG1aR1V6TkRRMFpEWmhPVFl3WXpabFpUQXlPV1UwT0RRMU5HUTVPR013TUdReFlXWTFaVFF5T0dJd1kyTXpOekZrTlRnPSIsCiAgICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQubGF5ZXI9WVdZd09HTTVNVGhrTXpFM09EYzRZMkV4TUdVNFpXRmpaRE15WWpZd05XTTFNakkzWmpjNFlqTXlNelprWlRJd05HTmtZalUwWXpSbFpEQmpZbUU1WXl4MFlYSXNjbThzYVc4dWEyRjBZV052Ym5SaGFXNWxjbk11Wm5NdGIzQjBMbUpzYjJOclgyUmxkbWxqWlQxbWFXeGxMR2x2TG10aGRHRmpiMjUwWVdsdVpYSnpMbVp6TFc5d2RDNXBjeTFzWVhsbGNpeHBieTVyWVhSaFkyOXVkR0ZwYm1WeWN5NW1jeTF2Y0hRdWNtOXZkQzFvWVhOb1BUVmxZMlZsWlROak1UVm1aVEppWTJSbVlqQXlPV00zTm1JeE5HVTNNV05pT1RGaU1qa3pNelJrWlRKbVpUazFNalpoWTJOaE1XTTNZak0wTm1Oak1qQT0iLAogICAgICAgICAgICAiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0Lm92ZXJsYXktcnciLAogICAgICAgICAgICAibG93ZXJkaXI9YWIyNjMxMzg4ZmQ4MWE5OTMxZDk5NWM3YWQ5NDA5ZjBkYzE4NDliZDJjN2QwNTU2ZWQwNzEwYTdkMDRiZWMxODowNDQ1MjNmOWMwYWM0ZWM2YmQ3ODVjMDVlY2ZmMTBhNjY4OGQ3NzU2NjYzNWQxNGU4NDhlNmM0ZDU0OTRhNThlOmVmZTI3ZGFlNWJkZGQ0Yjc5NTdmODMzNThjZjg1N2FiMjRiMmJhY2E3ZTUxZjc2NmE2ZTExM2VlYWI1YzYwOTU6YTAxZWYxNzkzZDQzYzA2OGNhNTQ4YjAyMjNiMGEyYmYzODQ0ZGIwNGRiNzMyN2E0MjhmOWNkYWZlYzU0ZmQ1NzpkY2Y0OWRmYjZhZmIwNGZlOTQ2YjJkNGQ0YWRiZGExYzQzMmUzOTQwOTMzY2NlN2I0NWI1ZjY2NjNiYTY3ZDkxOmFmMDhjOTE4ZDMxNzg3OGNhMTBlOGVhY2QzMmI2MDVjNTIyN2Y3OGIzMjM2ZGUyMDRjZGI1NGM0ZWQwY2JhOWMiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIi9ydW4va2F0YS1jb250YWluZXJzL3NoYXJlZC9jb250YWluZXJzLyQoYnVuZGxlLWlkKSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfQogICAgICBdLAogICAgICAiZXhlY19jb21tYW5kcyI6IFtdCiAgICB9CiAgXSwKICAicmVxdWVzdF9kZWZhdWx0cyI6IHsKICAgICJDcmVhdGVDb250YWluZXJSZXF1ZXN0IjogewogICAgICAiYWxsb3dfZW52X3JlZ2V4IjogWwogICAgICAgICJeQVpVUkVfQ0xJRU5UX0lEPVtBLUZhLWYwLTktXSskIiwKICAgICAgICAiXkFaVVJFX1RFTkFOVF9JRD1bQS1GYS1mMC05LV0rJCIsCiAgICAgICAgIl5BWlVSRV9GRURFUkFURURfVE9LRU5fRklMRT0vdmFyL3J1bi9zZWNyZXRzL2F6dXJlL3Rva2Vucy9henVyZS1pZGVudGl0eS10b2tlbiQiLAogICAgICAgICJeQVpVUkVfQVVUSE9SSVRZX0hPU1Q9aHR0cHM6Ly9sb2dpblxcLm1pY3Jvc29mdG9ubGluZVxcLmNvbS8kIgogICAgICBdCiAgICB9LAogICAgIkNvcHlGaWxlUmVxdWVzdCI6IFsKICAgICAgIl4vcnVuL2thdGEtY29udGFpbmVycy9zaGFyZWQvY29udGFpbmVycy8iCiAgICBdLAogICAgIkV4ZWNQcm9jZXNzUmVxdWVzdCI6IFtdLAogICAgIlJlYWRTdHJlYW1SZXF1ZXN0IjogZmFsc2UsCiAgICAiV3JpdGVTdHJlYW1SZXF1ZXN0IjogZmFsc2UKICB9Cn0= + spec: + runtimeClassName: kata-cc + containers: + - name: slave + image: "docker.io/library/redis:5.0.5-alpine" + env: + - name: GET_HOSTS_FROM + value: dns + resources: + requests: + cpu: 100m + memory: 100Mi + ports: + - containerPort: 6379 + command: + - redis-server + - "--slaveof" + - redis-master + - "6379" diff --git a/src/agent/samples/policy/yaml/pod/pod-exec.yaml b/src/agent/samples/policy/yaml/pod/pod-exec.yaml new file mode 100644 index 000000000000..bfc4101d4501 --- /dev/null +++ b/src/agent/samples/policy/yaml/pod/pod-exec.yaml @@ -0,0 +1,80 @@ +--- +apiVersion: v1 +kind: Pod +metadata: + name: exec-test + labels: + run: busybox + annotations: + io.katacontainers.config.agent.policy: IyBDb3B5cmlnaHQgKGMpIDIwMjMgTWljcm9zb2Z0IENvcnBvcmF0aW9uCiMKIyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMAojCnBhY2thZ2UgYWdlbnRfcG9saWN5CgppbXBvcnQgZnV0dXJlLmtleXdvcmRzLmluCmltcG9ydCBmdXR1cmUua2V5d29yZHMuZXZlcnkKCiMgRGVmYXVsdCB2YWx1ZXMsIHJldHVybmVkIGJ5IE9QQSB3aGVuIHJ1bGVzIGNhbm5vdCBiZSBldmFsdWF0ZWQgdG8gdHJ1ZS4KZGVmYXVsdCBBZGRBUlBOZWlnaGJvcnNSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgQWRkU3dhcFJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBDbG9zZVN0ZGluUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IENvcHlGaWxlUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IENyZWF0ZUNvbnRhaW5lclJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBDcmVhdGVTYW5kYm94UmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IERlc3Ryb3lTYW5kYm94UmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgRXhlY1Byb2Nlc3NSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgR2V0T09NRXZlbnRSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBHdWVzdERldGFpbHNSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBMaXN0SW50ZXJmYWNlc1JlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBMaXN0Um91dGVzUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IE1lbUhvdHBsdWdCeVByb2JlUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IE9ubGluZUNQVU1lbVJlcXVlc3QgOj0gdHJ1ZQpkZWZhdWx0IFBhdXNlQ29udGFpbmVyUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFJlYWRTdHJlYW1SZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgUmVtb3ZlQ29udGFpbmVyUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgUmVtb3ZlU3RhbGVWaXJ0aW9mc1NoYXJlTW91bnRzUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgUmVzZWVkUmFuZG9tRGV2UmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFJlc3VtZUNvbnRhaW5lclJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBTZXRHdWVzdERhdGVUaW1lUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFNldFBvbGljeVJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBTaWduYWxQcm9jZXNzUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgU3RhcnRDb250YWluZXJSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBTdGFydFRyYWNpbmdSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgU3RhdHNDb250YWluZXJSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBTdG9wVHJhY2luZ1JlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBUdHlXaW5SZXNpemVSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBVcGRhdGVDb250YWluZXJSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgVXBkYXRlRXBoZW1lcmFsTW91bnRzUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFVwZGF0ZUludGVyZmFjZVJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBVcGRhdGVSb3V0ZXNSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgV2FpdFByb2Nlc3NSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBXcml0ZVN0cmVhbVJlcXVlc3QgOj0gZmFsc2UKCiMgQWxsb3dSZXF1ZXN0c0ZhaWxpbmdQb2xpY3kgOj0gdHJ1ZSBjb25maWd1cmVzIHRoZSBBZ2VudCB0byAqYWxsb3cgYW55CiMgcmVxdWVzdHMgY2F1c2luZyBhIHBvbGljeSBmYWlsdXJlKi4gVGhpcyBpcyBhbiB1bnNlY3VyZSBjb25maWd1cmF0aW9uCiMgYnV0IGlzIHVzZWZ1bCBmb3IgYWxsb3dpbmcgdW5zZWN1cmUgcG9kcyB0byBzdGFydCwgdGhlbiBjb25uZWN0IHRvCiMgdGhlbSBhbmQgaW5zcGVjdCBPUEEgbG9ncyBmb3IgdGhlIHJvb3QgY2F1c2Ugb2YgYSBmYWlsdXJlLgpkZWZhdWx0IEFsbG93UmVxdWVzdHNGYWlsaW5nUG9saWN5IDo9IGZhbHNlCgojIENvbnN0YW50cwpTX05BTUVfS0VZID0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZSIKU19OQU1FU1BBQ0VfS0VZID0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZXNwYWNlIgpCVU5ETEVfSUQgPSAiW2EtejAtOV17NjR9IgoKQ3JlYXRlQ29udGFpbmVyUmVxdWVzdDo9IHJlc3AgewogICAgbm90IGlzX251bGwoaW5wdXQuZW52X21hcCkKICAgIAogICAgaV9lbnZfbWFwIDo9IGlucHV0LmVudl9tYXAKICAgIAogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBwX2Vudl9tYXAgOj0gcF9jb250YWluZXIuZW52X21hcCAgCiAgICBhbGxvd19lbnZfbWFwKHBfZW52X21hcCwgaV9lbnZfbWFwKQogICAgCiAgICBpX3Byb2Nlc3MgOj0gaW5wdXQuYmFzZS5PQ0kuUHJvY2VzcwogICAgCiAgICBwX3Byb2Nlc3MgOj0gcF9jb250YWluZXIuT0NJLlByb2Nlc3MKICAgIAogICAgYWxsb3dfYXJncyhpX3Byb2Nlc3MsIHBfcHJvY2VzcywgaV9lbnZfbWFwKQoKICAgIHJlc3AgPSBDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uKGlucHV0LmJhc2UpCiAgICBwcmludCgiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdDogdHJ1ZSIpCn0KCmFsbG93X2FyZ3MoaV9wcm9jZXNzLCBwX3Byb2Nlc3MsIGlfZW52X21hcCkgewogICAgaV9hcmdzIDo9IGlfcHJvY2Vzcy5BcmdzCiAgICBwX2FyZ3MgOj0gcF9wcm9jZXNzLkFyZ3MKICAgIHByaW50KCJhbGxvd19hcmdzOiBpX2FyZ3MgPSIsIGlfYXJncywgInBfYXJncyA9IiwgcF9hcmdzKQogICAgY291bnQoaV9hcmdzKSA9PSBjb3VudChwX2FyZ3MpCiAgICBldmVyeSBpLCBpX2FyZyBpbiBpX2FyZ3MgewogICAgICAgIHByaW50KCJhbGxvd19hcmdzOiBpX2FyZyA9IiwgaV9hcmcpCiAgICAgICAgcF9hcmdfcmVwbGFjZWQgOj0gcmVwbGFjZV9lbnZfdmFyaWFibGVzKHBfYXJnc1tpXSwgaV9lbnZfbWFwKQogICAgICAgIHByaW50KCJhbGxvd19hcmdzOiBwX2FyZ19yZXBsYWNlZCA9IiwgcF9hcmdfcmVwbGFjZWQpCiAgICAgICAgcF9hcmdfcmVwbGFjZWQyIDo9IHJlcGxhY2UocF9hcmdfcmVwbGFjZWQsICIkJCIsICIkIikKICAgICAgICBwcmludCgiYWxsb3dfYXJnczogcF9hcmdfcmVwbGFjZWQyID0iLCBwX2FyZ19yZXBsYWNlZDIpCiAgICAgICAgaV9hcmcgPT0gcF9hcmdfcmVwbGFjZWQyCiAgICB9CiAgICBwcmludCgiYWxsb3dfYXJnczogdHJ1ZSIpCn0KCmFsbG93X2FyZ3MoaV9wcm9jZXNzLCBwX3Byb2Nlc3MsIGlfZW52X21hcCkgewogICAgbm90IGlfcHJvY2Vzcy5BcmdzCiAgICBub3QgcF9wcm9jZXNzLkFyZ3MKICAgIHByaW50KCJhbGxvd19hcmdzMjogbm8gYXJncyIpCn0KCiMgdGhpcyBmdW5jdGlvbiByZXBsYWNlcyBhbGwgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyBpbiBhIHN0cmluZywgZ2l2ZW4gYSBtYXAgb2YgZW52aXJvbm1lbnQga2V5cyB0byBlbnZpcm9ubWVudCB2YWx1ZXMKIyBlZyBzdHIgPSAiZWNobyAkKENMVVNURVJfSUQpOyBlY2hvICQoTk9ERV9OQU1FKTsiCiMgZW52X21hcCA9IHsiQ0xVU1RFUl9JRCI6ICJhYmMiLCAiTk9ERV9OQU1FIiA6ICJ4eXoifQojIHJlc3VsdCA9ICJlY2hvIGFiYzsgZWNobyB4eXo7IgpyZXBsYWNlX2Vudl92YXJpYWJsZXMoc3RyLCBlbnZfbWFwKSA9IHJlc3VsdCB7CiAgICAjIG1ha2UgYW4gYXJyYXkgb2YgdGhlIGtleXMgZWcgWyJDTFVTVEVSX0lEIiwgIk5PREVfTkFNRSJdCiAgICBrZXlzIDo9IFt4IHwgc29tZSB4IGluIG9iamVjdC5rZXlzKGVudl9tYXApXQogICAgcmVzdWx0IDo9IHJlcGxhY2Vfc3RyX3JlYyhzdHIsIGVudl9tYXAsIGtleXMsIGNvdW50KGtleXMpIC0gMSkKfQoKIyBiYXNlIGNhc2UKcmVwbGFjZV9zdHJfcmVjKHN0ciwgZW52X21hcCwgYXJyX2tleXMsIGkpID0gcmVzdWx0IHsKICAgIGkgPCAwCiAgICByZXN1bHQgOj0gc3RyCn0KCiMgcmVjdXJzaXZlIHN0ZXAKcmVwbGFjZV9zdHJfcmVjKHN0ciwgZW52X21hcCwgYXJyX2tleXMsIGkpID0gcmVzdWx0IHsKICAgIGkgPj0gMAogICAga2V5IDo9IGFycl9rZXlzW2ldCiAgICBlbnZfa2V5MSA6PSBjb25jYXQoIiIsIFsiJCgiLCBrZXksICIpIl0pCiAgICAjIHJlcGxhY2UgJChWQVIpIHdpdGggdmFsdWUKICAgIG5ld19zdHIxIDo9IHJlcGxhY2Uoc3RyLCBlbnZfa2V5MSwgZW52X21hcFtrZXldKQogICAgIyByZXBsYWNlIG5leHQgZW52aXJvbm1lbnQgdmFyaWFibGUKICAgIHJlc3VsdCA9IHJlcGxhY2Vfc3RyX3JlYyhuZXdfc3RyMSwgZW52X21hcCwgYXJyX2tleXMsIGkgLSAxKQp9CgphbGxvd19lbnZfbWFwKHBfZW52X21hcCwgaV9lbnZfbWFwKSB7CiAgICBwcmludCgiYWxsb3dfZW52X21hcDogcF9lbnZfbWFwID0iLCBwX2Vudl9tYXApCiAgICBldmVyeSBlbnZfa2V5LCBlbnZfdmFsIGluIGlfZW52X21hcCB7CiAgICAgICAgcHJpbnQoImFsbG93X2VudjogZW52X2tleSA9IiwgZW52X2tleSwgImVudl92YWwgPSIsIGVudl92YWwpCiAgICAgICAgYWxsb3dfZW52X21hcF9lbnRyeShlbnZfa2V5LCBlbnZfdmFsLCBwX2Vudl9tYXApCiAgICB9CiAgICBwcmludCgiYWxsb3dfZW52X21hcDogdHJ1ZSIpCn0KCiMgQWxsb3cgZXhhY3QgbWF0Y2gKYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBpX3ZhbCA9PSBwX3ZhbAogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnk6IHRydWUiKQp9CgojIEFsbG93IHJlc291cmNlRmllbGRSZWYgdmFsdWVzIChlLmcuLCAibGltaXRzLmNwdSIpLgphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgICMgYSB2YXJpYWJsZSB3ZSBzaG91bGQgYmUgdmFsaWRhdGluZyB1c2luZyBhIHJlZ2V4IGZyb20gc2V0dGluZ3MKICAgIHBfdmFsID09ICIkKHZhbGlkYXRlLWZyb20tc2V0dGluZ3MpIgogICAgcmVnZXhfdmFsIDo9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuQ3JlYXRlQ29udGFpbmVyUmVxdWVzdC5hbGxvd19lbnZfcmVnZXhfbWFwW2tleV0KICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4X3ZhbCwgaV92YWwpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSAyOiB0cnVlIikKfQoKIyBBbGxvdyBub2RlLW5hbWUKYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChub2RlLW5hbWUpIgogICAgcmVnZXgubWF0Y2gocG9saWN5X2RhdGEuY29tbW9uLmRuc19zdWJkb21haW4gLCBpX3ZhbCkKICAgIHByaW50KCJhbGxvd19lbnZfbWFwX2VudHJ5IDM6IHRydWUiKQp9CgojIEFsbG93IGhvc3QtbmFtZQphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgIHBfdmFsID09ICIkKGhvc3QtbmFtZSkiCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24uZG5zX2xhYmVsICwgaV92YWwpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSA0OiB0cnVlIikKfQoKIyBBbGxvdyBwb2QtdWlkCmFsbG93X2Vudl9tYXBfZW50cnkoa2V5LCBpX3ZhbCwgcF9lbnZfbWFwKSB7CiAgICBwX3ZhbCA6PSBwX2Vudl9tYXBba2V5XQogICAgcF92YWwgPT0gIiQocG9kLXVpZCkiCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24ucG9kX3VpZCAsIGlfdmFsKQogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgNTogdHJ1ZSIpCn0KCiMgQWxsb3cgZmllbGRSZWYgImZpZWxkUGF0aDogc3RhdHVzLnBvZElQIiB2YWx1ZXMuCmFsbG93X2Vudl9tYXBfZW50cnkoa2V5LCBpX3ZhbCwgcF9lbnZfbWFwKSB7CiAgICBpc19pcChpX3ZhbCkKCiAgICBwX3ZhbCA6PSBwX2Vudl9tYXBba2V5XQogICAgcF92YXIgOj0gY29uY2F0KCI9IiwgW2tleSwgcF92YWxdKQogICAgYWxsb3dfcG9kX2lwX3ZhcihrZXksIHBfdmFyKQogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgNjogdHJ1ZSIpCn0KCiMgQWxsb3cgZmllbGRSZWYgImZpZWxkUGF0aDogc3RhdHVzLmhvc3RJUCIgdmFsdWVzLgphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgaXNfaXAoaV92YWwpCgogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgIHBfdmFyIDo9IGNvbmNhdCgiPSIsIFtrZXksIHBfdmFsXSkKICAgIGFsbG93X2hvc3RfaXBfdmFyKGtleSwgcF92YXIpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSA3OiB0cnVlIikKfQoKIyBNYXRjaCBpbnB1dCB3aXRoIG9uZSBvZiB0aGUgcG9saWN5IHZhcmlhYmxlcywgYWZ0ZXIgc3Vic3RpdHV0aW5nICQoc2FuZGJveC1uYW1lKS4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChzYW5kYm94LW5hbWUpIgogICAgc19uYW1lIDo9IGlucHV0LmJhc2UuT0NJLkFubm90YXRpb25zW1NfTkFNRV9LRVldCiAgICBwX3ZhcjIgOj0gcmVwbGFjZShwX3ZhbCwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHBfdmFyMiA9PSBpX3ZhbAogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgODogdHJ1ZSIpCn0KCiMgTWF0Y2ggaW5wdXQgd2l0aCBvbmUgb2YgdGhlIHBvbGljeSB2YXJpYWJsZXMsIGFmdGVyIHN1YnN0aXR1dGluZyAkKHNhbmRib3gtbmFtZXNwYWNlKS4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChzYW5kYm94LW5hbWVzcGFjZSkiCiAgICBzX25hbWVzcGFjZSA6PSBpbnB1dC5iYXNlLk9DSS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwX3ZhcjIgOj0gcmVwbGFjZShwX3ZhbCwgIiQoc2FuZGJveC1uYW1lc3BhY2UpIiwgc19uYW1lc3BhY2UpCiAgICBwX3ZhcjIgPT0gaV92YWwKICAgIHByaW50KCJhbGxvd19lbnZfbWFwX2VudHJ5IDk6IHRydWUiKQp9CgojIEFsbG93IGlucHV0IGVudiB2YXJpYWJsZXMgdGhhdCBtYXRjaCB3aXRoIGEgcmVxdWVzdF9kZWZhdWx0cyByZWdleC4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHNvbWUgcF9yZWdleDEgaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5DcmVhdGVDb250YWluZXJSZXF1ZXN0LmFsbG93X2Vudl9yZWdleAogICAgcF9yZWdleDIgOj0gcmVwbGFjZShwX3JlZ2V4MSwgIiQoaXB2NF9hKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcHY0X2EpCiAgICBwX3JlZ2V4MyA6PSByZXBsYWNlKHBfcmVnZXgyLCAiJChpcF9wKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcF9wKQogICAgcF9yZWdleDQgOj0gcmVwbGFjZShwX3JlZ2V4MywgIiQoc3ZjX25hbWUpIiwgcG9saWN5X2RhdGEuY29tbW9uLnN2Y19uYW1lKQogICAgcF9yZWdleDUgOj0gcmVwbGFjZShwX3JlZ2V4NCwgIiQoZG5zX2xhYmVsKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5kbnNfbGFiZWwpCgogICAgcmVzdWx0IDo9IGNvbmNhdCgiPSIsIFtrZXksIGlfdmFsXSkKICAgIHJlZ2V4Lm1hdGNoKHBfcmVnZXg1LCByZXN1bHQpCgogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgMTA6IHRydWUiKQp9CgpDcmVhdGVDb250YWluZXJSZXF1ZXN0Oj0gcmVzcCB7CiAgICBub3QgaW5wdXQuZW52X21hcAogICAgaV9wcm9jZXNzID0gaW5wdXQuT0NJLlByb2Nlc3MKICAgIHNfbmFtZSA9IGlucHV0Lk9DSS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBwX3Byb2Nlc3MgPSBwX2NvbnRhaW5lci5PQ0kuUHJvY2VzcwogICAgYWxsb3dfZGVwcmVjYXRlZF9hcmdzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUpCiAgICByZXNwID0gQ3JlYXRlQ29udGFpbmVyUmVxdWVzdENvbW1vbihpbnB1dCkKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0MjogdHJ1ZSIpCn0KCkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb24ocmVxKTo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgICMgQ2hlY2sgaWYgdGhlIGlucHV0IHJlcXVlc3Qgc2hvdWxkIGJlIHJlamVjdGVkIGV2ZW4gYmVmb3JlIGNoZWNraW5nIHRoZQogICAgIyBwb2xpY3lfZGF0YS5jb250YWluZXJzIGluZm9ybWF0aW9uLgogICAgYWxsb3dfY3JlYXRlX2NvbnRhaW5lcl9pbnB1dChyZXEpCgogICAgaV9vY2kgOj0gcmVxLk9DSQogICAgaV9zdG9yYWdlcyA6PSByZXEuc3RvcmFnZXMKICAgIGlfZGV2aWNlcyA6PSByZXEuZGV2aWNlcwoKICAgICMgYXJyYXkgb2YgcG9zc2libGUgc3RhdGUgb3BlcmF0aW9ucwogICAgb3BzX2J1aWxkZXIgOj0gW10KCiAgICAjIGNoZWNrIHNhbmRib3ggbmFtZQogICAgc2FuZGJveF9uYW1lID0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FX0tFWV0KICAgIGFkZF9zYW5kYm94X25hbWVfdG9fc3RhdGUgOj0gc3RhdGVfYWxsb3dzKCJzYW5kYm94X25hbWUiLCBzYW5kYm94X25hbWUpCiAgICBvcHNfYnVpbGRlcjEgOj0gY29uY2F0X29wX2lmX25vdF9udWxsKG9wc19idWlsZGVyLCBhZGRfc2FuZGJveF9uYW1lX3RvX3N0YXRlKQoKICAgICMgQ2hlY2sgaWYgYW55IGVsZW1lbnQgZnJvbSB0aGUgcG9saWN5X2RhdGEuY29udGFpbmVycyBhcnJheSBhbGxvd3MgdGhlIGlucHV0IHJlcXVlc3QuCiAgICBzb21lIHBfY29udGFpbmVyIGluIHBvbGljeV9kYXRhLmNvbnRhaW5lcnMKICAgIHByaW50KCI9PT09PT09PSBDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiB0cnlpbmcgbmV4dCBwb2xpY3kgY29udGFpbmVyIikKCiAgICBwX3BpZG5zIDo9IHBfY29udGFpbmVyLnNhbmRib3hfcGlkbnMKICAgIGlfcGlkbnMgOj0gcmVxLnNhbmRib3hfcGlkbnMKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiBwX3BpZG5zID0iLCBwX3BpZG5zLCAiaV9waWRucyA9IiwgaV9waWRucykKICAgIHBfcGlkbnMgPT0gaV9waWRucwoKICAgIHBfb2NpIDo9IHBfY29udGFpbmVyLk9DSQoKICAgICMgY2hlY2sgbmFtZXNwYWNlCiAgICBwX25hbWVzcGFjZSA6PSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBpX25hbWVzcGFjZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwcmludCAoIkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb246IHBfbmFtZXNwYWNlID0iLCBwX25hbWVzcGFjZSwgImlfbmFtZXNwYWNlID0iLCBpX25hbWVzcGFjZSkKICAgIGFkZF9uYW1lc3BhY2VfdG9fc3RhdGUgOj0gYWxsb3dfbmFtZXNwYWNlKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkKICAgIG9wc19idWlsZGVyMiA6PSBjb25jYXRfb3BfaWZfbm90X251bGwob3BzX2J1aWxkZXIxLCBhZGRfbmFtZXNwYWNlX3RvX3N0YXRlKQoKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiBwIFZlcnNpb24gPSIsIHBfb2NpLlZlcnNpb24sICJpIFZlcnNpb24gPSIsIGlfb2NpLlZlcnNpb24pCiAgICBwX29jaS5WZXJzaW9uID09IGlfb2NpLlZlcnNpb24KCiAgICBwcmludCgiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdENvbW1vbjogcCBSZWFkb25seSA9IiwgcF9vY2kuUm9vdC5SZWFkb25seSwgImkgUmVhZG9ubHkgPSIsIGlfb2NpLlJvb3QuUmVhZG9ubHkpCiAgICBwX29jaS5Sb290LlJlYWRvbmx5ID09IGlfb2NpLlJvb3QuUmVhZG9ubHkKCiAgICBhbGxvd19hbm5vKHBfb2NpLCBpX29jaSkKCiAgICBwX3N0b3JhZ2VzIDo9IHBfY29udGFpbmVyLnN0b3JhZ2VzCiAgICBhbGxvd19ieV9hbm5vKHBfb2NpLCBpX29jaSwgcF9zdG9yYWdlcywgaV9zdG9yYWdlcykKCiAgICBwX2RldmljZXMgOj0gcF9jb250YWluZXIuZGV2aWNlcwogICAgYWxsb3dfZGV2aWNlcyhwX2RldmljZXMsIGlfZGV2aWNlcykKCiAgICByZXQgOj0gYWxsb3dfbGludXgob3BzX2J1aWxkZXIyLCBwX29jaSwgaV9vY2kpCiAgICByZXQuYWxsb3dlZAoKICAgIG9wcyA6PSByZXQub3BzCgogICAgcHJpbnQoIkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb246IHRydWUiKQp9CgphbGxvd19jcmVhdGVfY29udGFpbmVyX2lucHV0KHJlcSkgewogICAgcHJpbnQoImFsbG93X2NyZWF0ZV9jb250YWluZXJfaW5wdXQ6IGlucHV0ID0iLCByZXEpCgogICAgY291bnQocmVxLnNoYXJlZF9tb3VudHMpID09IDAKICAgIGlzX251bGwocmVxLnN0cmluZ191c2VyKQoKICAgIGlfb2NpIDo9IHJlcS5PQ0kKICAgIGlzX251bGwoaV9vY2kuSG9va3MpCiAgICBpc19udWxsKGlfb2NpLlNvbGFyaXMpCiAgICBpc19udWxsKGlfb2NpLldpbmRvd3MpCgogICAgaV9saW51eCA6PSBpX29jaS5MaW51eAogICAgY291bnQoaV9saW51eC5HSURNYXBwaW5ncykgPT0gMAogICAgY291bnQoaV9saW51eC5Nb3VudExhYmVsKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlJlc291cmNlcy5EZXZpY2VzKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlJvb3Rmc1Byb3BhZ2F0aW9uKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlVJRE1hcHBpbmdzKSA9PSAwCiAgICBpc19udWxsKGlfbGludXguSW50ZWxSZHQpCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLkJsb2NrSU8pCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLk5ldHdvcmspCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLlBpZHMpCiAgICBpc19udWxsKGlfbGludXguU2VjY29tcCkKCiAgICBpX3Byb2Nlc3MgOj0gaV9vY2kuUHJvY2VzcwogICAgY291bnQoaV9wcm9jZXNzLlNlbGludXhMYWJlbCkgPT0gMAogICAgY291bnQoaV9wcm9jZXNzLlVzZXIuVXNlcm5hbWUpID09IDAKCiAgICBwcmludCgiYWxsb3dfY3JlYXRlX2NvbnRhaW5lcl9pbnB1dDogdHJ1ZSIpCn0KCmFsbG93X25hbWVzcGFjZShwX25hbWVzcGFjZSwgaV9uYW1lc3BhY2UpID0gYWRkX25hbWVzcGFjZSB7CiAgICBwX25hbWVzcGFjZSA9PSBpX25hbWVzcGFjZQogICAgYWRkX25hbWVzcGFjZSA6PSBudWxsCiAgICBwcmludCgiYWxsb3dfbmFtZXNwYWNlIDE6IGlucHV0IG5hbWVzcGFjZSBtYXRjaGVzIHBvbGljeSBkYXRhIikKfQoKYWxsb3dfbmFtZXNwYWNlKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkgPSBhZGRfbmFtZXNwYWNlIHsKICAgIHBfbmFtZXNwYWNlID09ICIiCiAgICBwcmludCgiYWxsb3dfbmFtZXNwYWNlIDI6IG5vIG5hbWVzcGFjZSBmb3VuZCBvbiBwb2xpY3kgZGF0YSIpCiAgICBhZGRfbmFtZXNwYWNlIDo9IHN0YXRlX2FsbG93cygibmFtZXNwYWNlIiwgaV9uYW1lc3BhY2UpCn0KCiMgdmFsdWUgaGFzbid0IGJlZW4gc2VlbiBiZWZvcmUsIHNhdmUgaXQgdG8gc3RhdGUKc3RhdGVfYWxsb3dzKGtleSwgdmFsdWUpID0gYWN0aW9uIHsKICBzdGF0ZSA6PSBnZXRfc3RhdGUoKQogIHByaW50KCJzdGF0ZV9hbGxvd3MgMTogc3RhdGVba2V5XSA9Iiwgc3RhdGVba2V5XSwgInZhbHVlID0iLCB2YWx1ZSkKICBub3Qgc3RhdGVba2V5XQogIHByaW50KCJzdGF0ZV9hbGxvd3MgMTogc2F2aW5nIHRvIHN0YXRlIGtleSA9Iiwga2V5LCAidmFsdWUgPSIsIHZhbHVlKQogIHBhdGggOj0gZ2V0X3N0YXRlX3BhdGgoa2V5KSAKICBhY3Rpb24gOj0gewogICAgIm9wIjogImFkZCIsCiAgICAicGF0aCI6IHBhdGgsIAogICAgInZhbHVlIjogdmFsdWUsCiAgfQp9CgojIHZhbHVlIG1hdGNoZXMgd2hhdCdzIGluIHN0YXRlLCBhbGxvdyBpdApzdGF0ZV9hbGxvd3Moa2V5LCB2YWx1ZSkgPSBhY3Rpb24gewogIHByaW50KCJzdGF0ZV9hbGxvd3MgMjogc3RhcnQiKQogIHN0YXRlIDo9IGdldF9zdGF0ZSgpCiAgcHJpbnQoInN0YXRlX2FsbG93cyAyOiBzdGF0ZVtrZXldID0iLCBzdGF0ZVtrZXldLCAidmFsdWUgPSIsIHZhbHVlKQogIHZhbHVlID09IHN0YXRlW2tleV0KICBwcmludCgic3RhdGVfYWxsb3dzIDI6IGZvdW5kIGtleSA9Iiwga2V5LCAidmFsdWUgPSIsIHZhbHVlLCAiIGluIHN0YXRlIikKICBhY3Rpb24gOj0gbnVsbAp9CgojIGhlbHBlciBmdW5jdGlvbnMgdG8gaW50ZXJhY3Qgd2l0aCB0aGUgc3RhdGUKZ2V0X3N0YXRlKCkgPSBzdGF0ZSB7CiAgc3RhdGUgOj0gZGF0YVsicHN0YXRlIl0KfQoKZ2V0X3N0YXRlX3ZhbChrZXkpID0gdmFsdWUgewogICAgc3RhdGUgOj0gZ2V0X3N0YXRlKCkKICAgIHZhbHVlIDo9IHN0YXRlW2tleV0KfQoKZ2V0X3N0YXRlX3BhdGgoa2V5KSA9IHBhdGggewogICAgIyBwcmVwZW5kICIvcHN0YXRlLyIgdG8ga2V5CiAgICBwYXRoIDo9IGNvbmNhdCgiLyIsIFsiL3BzdGF0ZSIsIGtleV0pCn0KCiMgSGVscGVyIGZ1bmN0aW9ucyB0byBjb25kaXRpb25hbGx5IGNvbmNhdGVuYXRlIG9wIGlzIG5vdCBudWxsCmNvbmNhdF9vcF9pZl9ub3RfbnVsbChvcHMsIG9wKSA9IHJlc3VsdCB7CiAgICBvcCA9PSBudWxsCiAgICByZXN1bHQgOj0gb3BzCn0KCmNvbmNhdF9vcF9pZl9ub3RfbnVsbChvcHMsIG9wKSA9IHJlc3VsdCB7CiAgICBvcCAhPSBudWxsCiAgICByZXN1bHQgOj0gYXJyYXkuY29uY2F0KG9wcywgW29wXSkKfQoKIyBSZWplY3QgdW5leHBlY3RlZCBhbm5vdGF0aW9ucy4KYWxsb3dfYW5ubyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19hbm5vIDE6IHN0YXJ0IikKCiAgICBub3QgaV9vY2kuQW5ub3RhdGlvbnMKCiAgICBwcmludCgiYWxsb3dfYW5ubyAxOiB0cnVlIikKfQphbGxvd19hbm5vKHBfb2NpLCBpX29jaSkgewogICAgcHJpbnQoImFsbG93X2Fubm8gMjogcCBBbm5vdGF0aW9ucyA9IiwgcF9vY2kuQW5ub3RhdGlvbnMpCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiBpIEFubm90YXRpb25zID0iLCBpX29jaS5Bbm5vdGF0aW9ucykKCiAgICBpX2tleXMgOj0gb2JqZWN0LmtleXMoaV9vY2kuQW5ub3RhdGlvbnMpCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiBpIGtleXMgPSIsIGlfa2V5cykKCiAgICBldmVyeSBpX2tleSBpbiBpX2tleXMgewogICAgICAgIGFsbG93X2Fubm9fa2V5KGlfa2V5LCBwX29jaSkKICAgIH0KCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiB0cnVlIikKfQoKYWxsb3dfYW5ub19rZXkoaV9rZXksIHBfb2NpKSB7CiAgICBwcmludCgiYWxsb3dfYW5ub19rZXkgMTogaSBrZXkgPSIsIGlfa2V5KQoKICAgIHN0YXJ0c3dpdGgoaV9rZXksICJpby5rdWJlcm5ldGVzLmNyaS4iKQoKICAgIHByaW50KCJhbGxvd19hbm5vX2tleSAxOiB0cnVlIikKfQphbGxvd19hbm5vX2tleShpX2tleSwgcF9vY2kpIHsKICAgIHByaW50KCJhbGxvd19hbm5vX2tleSAyOiBpIGtleSA9IiwgaV9rZXkpCgogICAgc29tZSBwX2tleSwgXyBpbiBwX29jaS5Bbm5vdGF0aW9ucwogICAgcF9rZXkgPT0gaV9rZXkKCiAgICBwcmludCgiYWxsb3dfYW5ub19rZXkgMjogdHJ1ZSIpCn0KCiMgR2V0IHRoZSB2YWx1ZSBvZiB0aGUgU19OQU1FX0tFWSBhbm5vdGF0aW9uIGFuZAojIGNvcnJlbGF0ZSBpdCB3aXRoIG90aGVyIGFubm90YXRpb25zIGFuZCBwcm9jZXNzIGZpZWxkcy4KYWxsb3dfYnlfYW5ubyhwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpIHsKICAgIHByaW50KCJhbGxvd19ieV9hbm5vIDE6IHN0YXJ0IikKCiAgICBub3QgcF9vY2kuQW5ub3RhdGlvbnNbU19OQU1FX0tFWV0KCiAgICBpX3NfbmFtZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMTogaV9zX25hbWUgPSIsIGlfc19uYW1lKQoKICAgIGlfc19uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FU1BBQ0VfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMTogaV9zX25hbWVzcGFjZSA9IiwgaV9zX25hbWVzcGFjZSkKCiAgICBhbGxvd19ieV9zYW5kYm94X25hbWUocF9vY2ksIGlfb2NpLCBwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBpX3NfbmFtZSwgaV9zX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfYnlfYW5ubyAxOiB0cnVlIikKfQphbGxvd19ieV9hbm5vKHBfb2NpLCBpX29jaSwgcF9zdG9yYWdlcywgaV9zdG9yYWdlcykgewogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMjogc3RhcnQiKQoKICAgIHBfc19uYW1lIDo9IHBfb2NpLkFubm90YXRpb25zW1NfTkFNRV9LRVldCiAgICBpX3NfbmFtZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMjogaV9zX25hbWUgPSIsIGlfc19uYW1lLCAicF9zX25hbWUgPSIsIHBfc19uYW1lKQoKICAgIGFsbG93X3NhbmRib3hfbmFtZShwX3NfbmFtZSwgaV9zX25hbWUpCgogICAgaV9zX25hbWVzcGFjZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwcmludCgiYWxsb3dfYnlfYW5ubyAyOiBpX3NfbmFtZXNwYWNlID0iLCBpX3NfbmFtZXNwYWNlKQoKICAgIGFsbG93X2J5X3NhbmRib3hfbmFtZShwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMsIGlfc19uYW1lLCBpX3NfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd19ieV9hbm5vIDI6IHRydWUiKQp9CgphbGxvd19ieV9zYW5kYm94X25hbWUocF9vY2ksIGlfb2NpLCBwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfYnlfc2FuZGJveF9uYW1lOiBzdGFydCIpCgogICAgaV9uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FU1BBQ0VfS0VZXQoKICAgIGFsbG93X2J5X2NvbnRhaW5lcl90eXBlcyhwX29jaSwgaV9vY2ksIHNfbmFtZSwgaV9uYW1lc3BhY2UpCiAgICBhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZChwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpCiAgICBhbGxvd19wcm9jZXNzKHBfb2NpLlByb2Nlc3MsIGlfb2NpLlByb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpCgogICAgcHJpbnQoImFsbG93X2J5X3NhbmRib3hfbmFtZTogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfbmFtZShwX3NfbmFtZSwgaV9zX25hbWUpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X25hbWU6IHN0YXJ0IikKICAgIHJlZ2V4Lm1hdGNoKHBfc19uYW1lLCBpX3NfbmFtZSkKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9uYW1lOiB0cnVlIikKfQoKIyBDaGVjayB0aGF0IHRoZSAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLXR5cGUiIGFuZAojICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIiBhbm5vdGF0aW9ucyBkZXNpZ25hdGUgdGhlCiMgZXhwZWN0ZWQgdHlwZSAtIGVpdGhlciBhICJzYW5kYm94IiBvciBhICJjb250YWluZXIiLiBUaGVuLCB2YWxpZGF0ZQojIG90aGVyIGFubm90YXRpb25zIGJhc2VkIG9uIHRoZSBhY3R1YWwgInNhbmRib3giIG9yICJjb250YWluZXIiIHZhbHVlCiMgZnJvbSB0aGUgaW5wdXQgY29udGFpbmVyLgphbGxvd19ieV9jb250YWluZXJfdHlwZXMocF9vY2ksIGlfb2NpLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfYnlfY29udGFpbmVyX3R5cGVzOiBjaGVja2luZyBpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSIpCgogICAgY190eXBlIDo9ICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSIKICAgIAogICAgcF9jcmlfdHlwZSA6PSBwX29jaS5Bbm5vdGF0aW9uc1tjX3R5cGVdCiAgICBpX2NyaV90eXBlIDo9IGlfb2NpLkFubm90YXRpb25zW2NfdHlwZV0KICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZXM6IHBfY3JpX3R5cGUgPSIsIHBfY3JpX3R5cGUsICJpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgcF9jcmlfdHlwZSA9PSBpX2NyaV90eXBlCgogICAgYWxsb3dfYnlfY29udGFpbmVyX3R5cGUoaV9jcmlfdHlwZSwgcF9vY2ksIGlfb2NpLCBzX25hbWUsIHNfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZXM6IHRydWUiKQp9CgphbGxvd19ieV9jb250YWluZXJfdHlwZShpX2NyaV90eXBlLCBwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAxOiBpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgaV9jcmlfdHlwZSA9PSAic2FuZGJveCIKCiAgICBpX2thdGFfdHlwZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1siaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5jb250YWluZXJfdHlwZSJdCiAgICBwcmludCgiYWxsb3dfYnlfY29udGFpbmVyX3R5cGUgMTogaV9rYXRhX3R5cGUgPSIsIGlfa2F0YV90eXBlKQogICAgaV9rYXRhX3R5cGUgPT0gInBvZF9zYW5kYm94IgoKICAgIGFsbG93X3NhbmRib3hfY29udGFpbmVyX25hbWUocF9vY2ksIGlfb2NpKQogICAgYWxsb3dfc2FuZGJveF9uZXRfbmFtZXNwYWNlKHBfb2NpLCBpX29jaSkKICAgIGFsbG93X3NhbmRib3hfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpCgogICAgcHJpbnQoImFsbG93X2J5X2NvbnRhaW5lcl90eXBlIDE6IHRydWUiKQp9CgphbGxvd19ieV9jb250YWluZXJfdHlwZShpX2NyaV90eXBlLCBwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiBpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgaV9jcmlfdHlwZSA9PSAiY29udGFpbmVyIgoKICAgIGlfa2F0YV90eXBlIDo9IGlfb2NpLkFubm90YXRpb25zWyJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIl0KICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiBpX2thdGFfdHlwZSA9IiwgaV9rYXRhX3R5cGUpCiAgICBpX2thdGFfdHlwZSA9PSAicG9kX2NvbnRhaW5lciIKCiAgICBhbGxvd19jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpCiAgICBhbGxvd19uZXRfbmFtZXNwYWNlKHBfb2NpLCBpX29jaSkKICAgIGFsbG93X2xvZ19kaXJlY3RvcnkocF9vY2ksIGlfb2NpKQoKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiB0cnVlIikKfQoKIyAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLW5hbWUiIGFubm90YXRpb24KYWxsb3dfc2FuZGJveF9jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X2NvbnRhaW5lcl9uYW1lOiBzdGFydCIpCgogICAgY29udGFpbmVyX2Fubm90YXRpb25fbWlzc2luZyhwX29jaSwgaV9vY2ksICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItbmFtZSIpCgogICAgcHJpbnQoImFsbG93X3NhbmRib3hfY29udGFpbmVyX25hbWU6IHRydWUiKQp9CgphbGxvd19jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19jb250YWluZXJfbmFtZTogc3RhcnQiKQoKICAgIGFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uKHBfb2NpLCBpX29jaSwgImlvLmt1YmVybmV0ZXMuY3JpLmNvbnRhaW5lci1uYW1lIikKCiAgICBwcmludCgiYWxsb3dfY29udGFpbmVyX25hbWU6IHRydWUiKQp9Cgpjb250YWluZXJfYW5ub3RhdGlvbl9taXNzaW5nKHBfb2NpLCBpX29jaSwga2V5KSB7CiAgICBwcmludCgiY29udGFpbmVyX2Fubm90YXRpb25fbWlzc2luZzoiLCBrZXkpCgogICAgbm90IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIG5vdCBpX29jaS5Bbm5vdGF0aW9uc1trZXldCgogICAgcHJpbnQoImNvbnRhaW5lcl9hbm5vdGF0aW9uX21pc3Npbmc6IHRydWUiKQp9CgphbGxvd19jb250YWluZXJfYW5ub3RhdGlvbihwX29jaSwgaV9vY2ksIGtleSkgewogICAgcHJpbnQoImFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uOiBrZXkgPSIsIGtleSkKCiAgICBwX3ZhbHVlIDo9IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIGlfdmFsdWUgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgcHJpbnQoImFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uOiBwX3ZhbHVlID0iLCBwX3ZhbHVlLCAiaV92YWx1ZSA9IiwgaV92YWx1ZSkKCiAgICBwX3ZhbHVlID09IGlfdmFsdWUKCiAgICBwcmludCgiYWxsb3dfY29udGFpbmVyX2Fubm90YXRpb246IHRydWUiKQp9CgojICJuZXJkY3RsL25ldHdvcmstbmFtZXNwYWNlIiBhbm5vdGF0aW9uCmFsbG93X3NhbmRib3hfbmV0X25hbWVzcGFjZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X25ldF9uYW1lc3BhY2U6IHN0YXJ0IikKCiAgICBrZXkgOj0gIm5lcmRjdGwvbmV0d29yay1uYW1lc3BhY2UiCgogICAgcF9uYW1lc3BhY2UgOj0gcF9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgaV9uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgcHJpbnQoImFsbG93X3NhbmRib3hfbmV0X25hbWVzcGFjZTogcF9uYW1lc3BhY2UgPSIsIHBfbmFtZXNwYWNlLCAiaV9uYW1lc3BhY2UgPSIsIGlfbmFtZXNwYWNlKQoKICAgIHJlZ2V4Lm1hdGNoKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9uZXRfbmFtZXNwYWNlOiB0cnVlIikKfQoKYWxsb3dfbmV0X25hbWVzcGFjZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19uZXRfbmFtZXNwYWNlOiBzdGFydCIpCgogICAga2V5IDo9ICJuZXJkY3RsL25ldHdvcmstbmFtZXNwYWNlIgoKICAgIG5vdCBwX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICBub3QgaV9vY2kuQW5ub3RhdGlvbnNba2V5XQoKICAgIHByaW50KCJhbGxvd19uZXRfbmFtZXNwYWNlOiB0cnVlIikKfQoKIyAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1sb2ctZGlyZWN0b3J5IiBhbm5vdGF0aW9uCmFsbG93X3NhbmRib3hfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X2xvZ19kaXJlY3Rvcnk6IHN0YXJ0IikKCiAgICBrZXkgOj0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbG9nLWRpcmVjdG9yeSIKCiAgICBwX2RpciA6PSBwX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICByZWdleDEgOj0gcmVwbGFjZShwX2RpciwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHJlZ2V4MiA6PSByZXBsYWNlKHJlZ2V4MSwgIiQoc2FuZGJveC1uYW1lc3BhY2UpIiwgc19uYW1lc3BhY2UpCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiByZWdleDIgPSIsIHJlZ2V4MikKCiAgICBpX2RpciA6PSBpX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiBpX2RpciA9IiwgaV9kaXIpCgogICAgcmVnZXgubWF0Y2gocmVnZXgyLCBpX2RpcikKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiB0cnVlIikKfQoKYWxsb3dfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19sb2dfZGlyZWN0b3J5OiBzdGFydCIpCgogICAga2V5IDo9ICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWxvZy1kaXJlY3RvcnkiCgogICAgbm90IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIG5vdCBpX29jaS5Bbm5vdGF0aW9uc1trZXldCgogICAgcHJpbnQoImFsbG93X2xvZ19kaXJlY3Rvcnk6IHRydWUiKQp9CgphbGxvd19kZXZpY2VzKHBfZGV2aWNlcywgaV9kZXZpY2VzKSB7CiAgICBwcmludCgiYWxsb3dfZGV2aWNlczogc3RhcnQiKQogICAgZXZlcnkgaV9kZXZpY2UgaW4gaV9kZXZpY2VzIHsKICAgICAgICBwcmludCgiYWxsb3dfZGV2aWNlczogaV9kZXZpY2UgPSIsIGlfZGV2aWNlKQogICAgICAgIHNvbWUgcF9kZXZpY2UgaW4gcF9kZXZpY2VzCiAgICAgICAgcF9kZXZpY2UuY29udGFpbmVyX3BhdGggPT0gaV9kZXZpY2UuY29udGFpbmVyX3BhdGgKICAgIH0KICAgIHByaW50KCJhbGxvd19kZXZpY2VzOiB0cnVlIikKfQoKYWxsb3dfbGludXgoc3RhdGVfb3BzLCBwX29jaSwgaV9vY2kpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIHBfbmFtZXNwYWNlcyA6PSBwX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbGludXg6IHAgbmFtZXNwYWNlcyA9IiwgcF9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlcyA6PSBpX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbGludXg6IGkgbmFtZXNwYWNlcyA9IiwgaV9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlX3dpdGhvdXRfbmV0d29yayA6PSBbb2JqIHwgb2JqIDo9IGlfbmFtZXNwYWNlc1tfXTsgb2JqLlR5cGUgIT0gIm5ldHdvcmsiXQoKICAgIHByaW50KCJhbGxvd19saW51eDogaV9uYW1lc3BhY2Vfd2l0aG91dF9uZXR3b3JrID0iLCBpX25hbWVzcGFjZV93aXRob3V0X25ldHdvcmspCgogICAgcF9uYW1lc3BhY2VzID09IGlfbmFtZXNwYWNlX3dpdGhvdXRfbmV0d29yawoKICAgIGFsbG93X21hc2tlZF9wYXRocyhwX29jaSwgaV9vY2kpCiAgICBhbGxvd19yZWFkb25seV9wYXRocyhwX29jaSwgaV9vY2kpCiAgICBhbGxvd19saW51eF9kZXZpY2VzKHBfb2NpLkxpbnV4LkRldmljZXMsIGlfb2NpLkxpbnV4LkRldmljZXMpCiAgICBhbGxvd19saW51eF9zeXNjdGwocF9vY2kuTGludXgsIGlfb2NpLkxpbnV4KQogICAgcmV0IDo9IGFsbG93X25ldHdvcmtfbmFtZXNwYWNlX3N0YXJ0KHN0YXRlX29wcywgcF9vY2ksIGlfb2NpKQogICAgcmV0LmFsbG93ZWQKCiAgICBvcHMgOj0gcmV0Lm9wcwoKICAgIHByaW50KCJhbGxvd19saW51eDogdHJ1ZSIpCn0KCiMgUmV0cmlldmUgdGhlICJuZXR3b3JrIiBuYW1lc3BhY2UgZnJvbSB0aGUgaW5wdXQgZGF0YSBhbmQgcGFzcyBpdCBvbiBmb3IgdGhlCiMgbmV0d29yayBuYW1lc3BhY2UgcG9saWN5IGNoZWNrcy4KYWxsb3dfbmV0d29ya19uYW1lc3BhY2Vfc3RhcnQoc3RhdGVfb3BzLCBwX29jaSwgaV9vY2kpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIHByaW50KCJhbGxvd19uZXR3b3JrX25hbWVzcGFjZSBzdGFydDogc3RhcnQiKQoKICAgIHBfbmFtZXNwYWNlcyA6PSBwX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IHAgbmFtZXNwYWNlcyA9IiwgcF9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlcyA6PSBpX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IGkgbmFtZXNwYWNlcyA9IiwgaV9uYW1lc3BhY2VzKQoKICAgICMgUmV0dXJuIHBhdGggb2YgdGhlICJuZXR3b3JrIiBuYW1lc3BhY2UKICAgIG5ldHdvcmtfbnMgOj0gW29iaiB8IG9iaiA6PSBpX25hbWVzcGFjZXNbX107IG9iai5UeXBlID09ICJuZXR3b3JrIl0KCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IG5ldHdvcmtfbnMgPSIsIG5ldHdvcmtfbnMpCgogICAgcmV0IDo9IGFsbG93X25ldHdvcmtfbmFtZXNwYWNlKHN0YXRlX29wcywgbmV0d29ya19ucykKICAgIHJldC5hbGxvd2VkCgogICAgb3BzIDo9IHJldC5vcHMKfQoKIyBUaGlzIHJ1bGUgaXMgd2hlbiB0aGVyZSdzIG5vIG5ldHdvcmsgbmFtZXNwYWNlIGluIHRoZSBpbnB1dCBkYXRhLgphbGxvd19uZXR3b3JrX25hbWVzcGFjZShzdGF0ZV9vcHMsIG5ldHdvcmtfbnMpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIGNvdW50KG5ldHdvcmtfbnMpID09IDAKCiAgICBuZXR3b3JrX25zX3BhdGggPSAiIgoKICAgIGFkZF9uZXR3b3JrX25hbWVzcGFjZV90b19zdGF0ZSA6PSBzdGF0ZV9hbGxvd3MoIm5ldHdvcmtfbmFtZXNwYWNlIiwgbmV0d29ya19uc19wYXRoKQogICAgb3BzIDo9IGNvbmNhdF9vcF9pZl9ub3RfbnVsbChzdGF0ZV9vcHMsIGFkZF9uZXR3b3JrX25hbWVzcGFjZV90b19zdGF0ZSkKCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2UgMTogdHJ1ZSIpCn0KCiMgVGhpcyBydWxlIGlzIHdoZW4gdGhlcmUncyBleGFjdGx5IG9uZSBuZXR3b3JrIG5hbWVzcGFjZSBpbiB0aGUgaW5wdXQgZGF0YS4KYWxsb3dfbmV0d29ya19uYW1lc3BhY2Uoc3RhdGVfb3BzLCBuZXR3b3JrX25zKSA6PSB7Im9wcyI6IG9wcywgImFsbG93ZWQiOiB0cnVlfSB7CiAgICBjb3VudChuZXR3b3JrX25zKSA9PSAxCgogICAgYWRkX25ldHdvcmtfbmFtZXNwYWNlX3RvX3N0YXRlIDo9IHN0YXRlX2FsbG93cygibmV0d29ya19uYW1lc3BhY2UiLCBuZXR3b3JrX25zWzBdLlBhdGgpCiAgICBvcHMgOj0gY29uY2F0X29wX2lmX25vdF9udWxsKHN0YXRlX29wcywgYWRkX25ldHdvcmtfbmFtZXNwYWNlX3RvX3N0YXRlKQoKICAgIHByaW50KCJhbGxvd19uZXR3b3JrX25hbWVzcGFjZSAyOiB0cnVlIikKfQoKYWxsb3dfbWFza2VkX3BhdGhzKHBfb2NpLCBpX29jaSkgewogICAgcF9wYXRocyA6PSBwX29jaS5MaW51eC5NYXNrZWRQYXRocwogICAgcHJpbnQoImFsbG93X21hc2tlZF9wYXRocyAxOiBwX3BhdGhzID0iLCBwX3BhdGhzKQoKICAgIGlfcGF0aHMgOj0gaV9vY2kuTGludXguTWFza2VkUGF0aHMKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aHMgMTogaV9wYXRocyA9IiwgaV9wYXRocykKCiAgICBhbGxvd19tYXNrZWRfcGF0aHNfYXJyYXkocF9wYXRocywgaV9wYXRocykKCiAgICBwcmludCgiYWxsb3dfbWFza2VkX3BhdGhzIDE6IHRydWUiKQp9CmFsbG93X21hc2tlZF9wYXRocyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aHMgMjogc3RhcnQiKQoKICAgIG5vdCBwX29jaS5MaW51eC5NYXNrZWRQYXRocwogICAgbm90IGlfb2NpLkxpbnV4Lk1hc2tlZFBhdGhzCgogICAgcHJpbnQoImFsbG93X21hc2tlZF9wYXRocyAyOiB0cnVlIikKfQoKIyBBbGwgdGhlIHBvbGljeSBtYXNrZWQgcGF0aHMgbXVzdCBiZSBtYXNrZWQgaW4gdGhlIGlucHV0IGRhdGEgdG9vLgojIElucHV0IGlzIGFsbG93ZWQgdG8gaGF2ZSBtb3JlIG1hc2tlZCBwYXRocyB0aGFuIHRoZSBwb2xpY3kuCmFsbG93X21hc2tlZF9wYXRoc19hcnJheShwX2FycmF5LCBpX2FycmF5KSB7CiAgICBldmVyeSBwX2VsZW0gaW4gcF9hcnJheSB7CiAgICAgICAgYWxsb3dfbWFza2VkX3BhdGgocF9lbGVtLCBpX2FycmF5KQogICAgfQp9CgphbGxvd19tYXNrZWRfcGF0aChwX2VsZW0sIGlfYXJyYXkpIHsKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aDogcF9lbGVtID0iLCBwX2VsZW0pCgogICAgc29tZSBpX2VsZW0gaW4gaV9hcnJheQogICAgcF9lbGVtID09IGlfZWxlbQoKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aDogdHJ1ZSIpCn0KCmFsbG93X3JlYWRvbmx5X3BhdGhzKHBfb2NpLCBpX29jaSkgewogICAgcF9wYXRocyA6PSBwX29jaS5MaW51eC5SZWFkb25seVBhdGhzCiAgICBwcmludCgiYWxsb3dfcmVhZG9ubHlfcGF0aHMgMTogcF9wYXRocyA9IiwgcF9wYXRocykKCiAgICBpX3BhdGhzIDo9IGlfb2NpLkxpbnV4LlJlYWRvbmx5UGF0aHMKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAxOiBpX3BhdGhzID0iLCBpX3BhdGhzKQoKICAgIGFsbG93X3JlYWRvbmx5X3BhdGhzX2FycmF5KHBfcGF0aHMsIGlfcGF0aHMsIGlfb2NpLkxpbnV4Lk1hc2tlZFBhdGhzKQoKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAxOiB0cnVlIikKfQphbGxvd19yZWFkb25seV9wYXRocyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAyOiBzdGFydCIpCgogICAgbm90IHBfb2NpLkxpbnV4LlJlYWRvbmx5UGF0aHMKICAgIG5vdCBpX29jaS5MaW51eC5SZWFkb25seVBhdGhzCgogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGhzIDI6IHRydWUiKQp9CgojIEFsbCB0aGUgcG9saWN5IHJlYWRvbmx5IHBhdGhzIG11c3QgYmUgZWl0aGVyOgojIC0gUHJlc2VudCBpbiB0aGUgaW5wdXQgcmVhZG9ubHkgcGF0aHMsIG9yCiMgLSBQcmVzZW50IGluIHRoZSBpbnB1dCBtYXNrZWQgcGF0aHMuCiMgSW5wdXQgaXMgYWxsb3dlZCB0byBoYXZlIG1vcmUgcmVhZG9ubHkgcGF0aHMgdGhhbiB0aGUgcG9saWN5LgphbGxvd19yZWFkb25seV9wYXRoc19hcnJheShwX2FycmF5LCBpX2FycmF5LCBtYXNrZWRfcGF0aHMpIHsKICAgIGV2ZXJ5IHBfZWxlbSBpbiBwX2FycmF5IHsKICAgICAgICBhbGxvd19yZWFkb25seV9wYXRoKHBfZWxlbSwgaV9hcnJheSwgbWFza2VkX3BhdGhzKQogICAgfQp9CgphbGxvd19yZWFkb25seV9wYXRoKHBfZWxlbSwgaV9hcnJheSwgbWFza2VkX3BhdGhzKSB7CiAgICBwcmludCgiYWxsb3dfcmVhZG9ubHlfcGF0aCAxOiBwX2VsZW0gPSIsIHBfZWxlbSkKCiAgICBzb21lIGlfZWxlbSBpbiBpX2FycmF5CiAgICBwX2VsZW0gPT0gaV9lbGVtCgogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGggMTogdHJ1ZSIpCn0KYWxsb3dfcmVhZG9ubHlfcGF0aChwX2VsZW0sIGlfYXJyYXksIG1hc2tlZF9wYXRocykgewogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGggMjogcF9lbGVtID0iLCBwX2VsZW0pCgogICAgc29tZSBpX21hc2tlZCBpbiBtYXNrZWRfcGF0aHMKICAgIHBfZWxlbSA9PSBpX21hc2tlZAoKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRoIDI6IHRydWUiKQp9CgphbGxvd19saW51eF9kZXZpY2VzKHBfZGV2aWNlcywgaV9kZXZpY2VzKSB7CiAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogc3RhcnQiKQogICAgZXZlcnkgaV9kZXZpY2UgaW4gaV9kZXZpY2VzIHsKICAgICAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogaV9kZXZpY2UgPSIsIGlfZGV2aWNlKQogICAgICAgIHNvbWUgcF9kZXZpY2UgaW4gcF9kZXZpY2VzCiAgICAgICAgaV9kZXZpY2UuUGF0aCA9PSBwX2RldmljZS5QYXRoCiAgICB9CiAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogdHJ1ZSIpCn0KCmFsbG93X2xpbnV4X3N5c2N0bChwX2xpbnV4LCBpX2xpbnV4KSB7CiAgICBwcmludCgiYWxsb3dfbGludXhfc3lzY3RsIDE6IHN0YXJ0IikKICAgIG5vdCBpX2xpbnV4LlN5c2N0bAogICAgcHJpbnQoImFsbG93X2xpbnV4X3N5c2N0bCAxOiB0cnVlIikKfQoKYWxsb3dfbGludXhfc3lzY3RsKHBfbGludXgsIGlfbGludXgpIHsKICAgIHByaW50KCJhbGxvd19saW51eF9zeXNjdGwgMjogc3RhcnQiKQogICAgcF9zeXNjdGwgOj0gcF9saW51eC5TeXNjdGwKICAgIGlfc3lzY3RsIDo9IGlfbGludXguU3lzY3RsCiAgICBldmVyeSBpX25hbWUsIGlfdmFsIGluIGlfc3lzY3RsIHsKICAgICAgICBwcmludCgiYWxsb3dfbGludXhfc3lzY3RsIDI6IGlfbmFtZSA9IiwgaV9uYW1lLCAiaV92YWwgPSIsIGlfdmFsKQogICAgICAgIHBfc3lzY3RsW2lfbmFtZV0gPT0gaV92YWwKICAgIH0KICAgIHByaW50KCJhbGxvd19saW51eF9zeXNjdGwgMjogdHJ1ZSIpCn0KCiMgQ2hlY2sgdGhlIGNvbnNpc3RlbmN5IG9mIHRoZSBpbnB1dCAiaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5idW5kbGVfcGF0aCIKIyBhbmQgaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCIgdmFsdWVzIHdpdGggb3RoZXIgZmllbGRzLgphbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZChwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpIHsKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogc3RhcnQiKQoKICAgIGJ1bmRsZV9wYXRoIDo9IGlfb2NpLkFubm90YXRpb25zWyJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmJ1bmRsZV9wYXRoIl0KICAgIGJ1bmRsZV9pZCA6PSByZXBsYWNlKGJ1bmRsZV9wYXRoLCAiL3J1bi9jb250YWluZXJkL2lvLmNvbnRhaW5lcmQucnVudGltZS52Mi50YXNrL2s4cy5pby8iLCAiIikKCiAgICBidW5kbGVfaWRfZm9ybWF0IDo9IGNvbmNhdCgiIiwgWyJeIiwgQlVORExFX0lELCAiJCJdKQogICAgcmVnZXgubWF0Y2goYnVuZGxlX2lkX2Zvcm1hdCwgYnVuZGxlX2lkKQoKICAgIGtleSA6PSAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCIKCiAgICBwX3JlZ2V4IDo9IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIHNhbmRib3hfaWQgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQoKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogc2FuZGJveF9pZCA9Iiwgc2FuZGJveF9pZCwgInJlZ2V4ID0iLCBwX3JlZ2V4KQogICAgcmVnZXgubWF0Y2gocF9yZWdleCwgc2FuZGJveF9pZCkKCiAgICBhbGxvd19yb290X3BhdGgocF9vY2ksIGlfb2NpLCBidW5kbGVfaWQpCgogICAgZXZlcnkgaV9tb3VudCBpbiBpX29jaS5Nb3VudHMgewogICAgICAgIGFsbG93X21vdW50KHBfb2NpLCBpX21vdW50LCBpX3N0b3JhZ2VzLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpCiAgICB9CgogICAgYWxsb3dfc3RvcmFnZXMocF9zdG9yYWdlcywgaV9zdG9yYWdlcywgYnVuZGxlX2lkLCBzYW5kYm94X2lkKQoKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogdHJ1ZSIpCn0KCmFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHBfcHJvY2VzcyA9IiwgcF9wcm9jZXNzKQogICAgcHJpbnQoImFsbG93X3Byb2Nlc3NfY29tbW9uOiBpX3Byb2Nlc3MgPSAiLCBpX3Byb2Nlc3MpCiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHNfbmFtZSA9Iiwgc19uYW1lKQoKICAgIHBfcHJvY2Vzcy5Dd2QgPT0gaV9wcm9jZXNzLkN3ZAogICAgcF9wcm9jZXNzLk5vTmV3UHJpdmlsZWdlcyA9PSBpX3Byb2Nlc3MuTm9OZXdQcml2aWxlZ2VzCgogICAgYWxsb3dfdXNlcihwX3Byb2Nlc3MsIGlfcHJvY2VzcykKICAgIGFsbG93X2VudihwX3Byb2Nlc3MsIGlfcHJvY2Vzcywgc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHRydWUiKQp9CgojIENvbXBhcmUgdGhlIE9DSSBQcm9jZXNzIGZpZWxkIG9mIGEgcG9saWN5IGNvbnRhaW5lciB3aXRoIHRoZSBpbnB1dCBPQ0kgUHJvY2VzcyBmcm9tIGEgQ3JlYXRlQ29udGFpbmVyUmVxdWVzdAphbGxvd19wcm9jZXNzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfcHJvY2Vzczogc3RhcnQiKQoKICAgIGFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgYWxsb3dfY2FwcyhwX3Byb2Nlc3MuQ2FwYWJpbGl0aWVzLCBpX3Byb2Nlc3MuQ2FwYWJpbGl0aWVzKQogICAgcF9wcm9jZXNzLlRlcm1pbmFsID09IGlfcHJvY2Vzcy5UZXJtaW5hbAoKICAgIHByaW50KCJhbGxvd19wcm9jZXNzOiB0cnVlIikKfQoKIyBDb21wYXJlIHRoZSBPQ0kgUHJvY2VzcyBmaWVsZCBvZiBhIHBvbGljeSBjb250YWluZXIgd2l0aCB0aGUgaW5wdXQgcHJvY2VzcyBmaWVsZCBmcm9tIEV4ZWNQcm9jZXNzUmVxdWVzdAphbGxvd19pbnRlcmFjdGl2ZV9wcm9jZXNzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfaW50ZXJhY3RpdmVfcHJvY2Vzczogc3RhcnQiKQoKICAgIGFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgYWxsb3dfZXhlY19jYXBzKGlfcHJvY2Vzcy5DYXBhYmlsaXRpZXMpCgogICAgIyBUaGVzZSBhcmUgY29tbWFuZHMgZW5hYmxlZCB1c2luZyBFeGVjUHJvY2Vzc1JlcXVlc3QgY29tbWFuZHMgYW5kL29yIHJlZ2V4IGZyb20gdGhlIHNldHRpbmdzIGZpbGUuCiAgICAjIFRoZXkgY2FuIGJlIGV4ZWN1dGVkIGludGVyYWN0aXZlbHkgc28gYWxsb3cgdGhlbSB0byB1c2UgYW55IHZhbHVlIGZvciBpX3Byb2Nlc3MuVGVybWluYWwuCgogICAgcHJpbnQoImFsbG93X2ludGVyYWN0aXZlX3Byb2Nlc3M6IHRydWUiKQp9CgojIENvbXBhcmUgdGhlIE9DSSBQcm9jZXNzIGZpZWxkIG9mIGEgcG9saWN5IGNvbnRhaW5lciB3aXRoIHRoZSBpbnB1dCBwcm9jZXNzIGZpZWxkIGZyb20gRXhlY1Byb2Nlc3NSZXF1ZXN0CmFsbG93X3Byb2JlX3Byb2Nlc3MocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19wcm9iZV9wcm9jZXNzOiBzdGFydCIpCgogICAgYWxsb3dfcHJvY2Vzc19jb21tb24ocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpCiAgICBhbGxvd19leGVjX2NhcHMoaV9wcm9jZXNzLkNhcGFiaWxpdGllcykKICAgIHBfcHJvY2Vzcy5UZXJtaW5hbCA9PSBpX3Byb2Nlc3MuVGVybWluYWwKCiAgICBwcmludCgiYWxsb3dfcHJvYmVfcHJvY2VzczogdHJ1ZSIpCn0KCmFsbG93X3VzZXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MpIHsKICAgIHBfdXNlciA6PSBwX3Byb2Nlc3MuVXNlcgogICAgaV91c2VyIDo9IGlfcHJvY2Vzcy5Vc2VyCgogICAgcHJpbnQoImFsbG93X3VzZXI6IGlucHV0IHVpZCA9IiwgaV91c2VyLlVJRCwgInBvbGljeSB1aWQgPSIsIHBfdXNlci5VSUQpCiAgICBwX3VzZXIuVUlEID09IGlfdXNlci5VSUQKCiAgICAjIFRPRE86IHRyYWNrIGRvd24gdGhlIHJlYXNvbiBmb3IgcmVnaXN0cnkuazhzLmlvL3BhdXNlOjMuOSBiZWluZwogICAgIyAgICAgICBleGVjdXRlZCB3aXRoIGdpZCA9IDAgZGVzcGl0ZSBoYXZpbmcgIjY1NTM1OjY1NTM1IiBpbiBpdHMgY29udGFpbmVyIGltYWdlCiAgICAjICAgICAgIGNvbmZpZy4KICAgICNwcmludCgiYWxsb3dfdXNlcjogaW5wdXQgZ2lkID0iLCBpX3VzZXIuR0lELCAicG9saWN5IGdpZCA9IiwgcF91c2VyLkdJRCkKICAgICNwX3VzZXIuR0lEID09IGlfdXNlci5HSUQKCiAgICAjIFRPRE86IGNvbXBhcmUgdGhlIGFkZGl0aW9uYWxHaWRzIGZpZWxkIHRvbyBhZnRlciBjb21wdXRpbmcgaXRzIHZhbHVlCiAgICAjIGJhc2VkIG9uIC9ldGMvcGFzc3dkIGFuZCAvZXRjL2dyb3VwIGZyb20gdGhlIGNvbnRhaW5lciBpbWFnZS4KfQoKYWxsb3dfZGVwcmVjYXRlZF9hcmdzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZ3MgMTogbm8gYXJncyIpCgogICAgbm90IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJncwogICAgbm90IGlfcHJvY2Vzcy5BcmdzCgogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAxOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZ3MocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSkgewogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiBwb2xpY3kgYXJncyA9IiwgcF9wcm9jZXNzLkRlcHJlY2F0ZWRBcmdzKQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiBpbnB1dCBhcmdzID0iLCBpX3Byb2Nlc3MuQXJncykKCiAgICBjb3VudChwX3Byb2Nlc3MuRGVwcmVjYXRlZEFyZ3MpID09IGNvdW50KGlfcHJvY2Vzcy5BcmdzKQoKICAgIGV2ZXJ5IGksIGlfYXJnIGluIGlfcHJvY2Vzcy5BcmdzIHsKICAgICAgICBhbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpCiAgICB9CgogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDE6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgcF9hcmcyIDo9IHJlcGxhY2UocF9hcmcsICIkJCIsICIkIikKICAgIHBfYXJnMiA9PSBpX2FyZwoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAxOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDI6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgIyBUT0RPOiBjYW4gJChub2RlLW5hbWUpIGJlIGhhbmRsZWQgYmV0dGVyPwogICAgY29udGFpbnMocF9hcmcsICIkKG5vZGUtbmFtZSkiKQoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAyOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDM6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgcF9hcmcyIDo9IHJlcGxhY2UocF9hcmcsICIkJCIsICIkIikKICAgIHBfYXJnMyA6PSByZXBsYWNlKHBfYXJnMiwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAzOiBwX2FyZzMgPSIsIHBfYXJnMykKICAgIHBfYXJnMyA9PSBpX2FyZwoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAzOiB0cnVlIikKfQoKIyBPQ0kgcHJvY2Vzcy5FbnYgZmllbGQKYWxsb3dfZW52KHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfZW52OiBwIGVudiA9IiwgcF9wcm9jZXNzLkVudikKICAgIHByaW50KCJhbGxvd19lbnY6IGkgZW52ID0iLCBpX3Byb2Nlc3MuRW52KQoKICAgIGV2ZXJ5IGlfdmFyIGluIGlfcHJvY2Vzcy5FbnYgewogICAgICAgIHByaW50KCJhbGxvd19lbnY6IGlfdmFyID0iLCBpX3ZhcikKICAgICAgICBhbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgfQoKICAgIHByaW50KCJhbGxvd19lbnY6IHRydWUiKQp9CgojIEFsbG93IGlucHV0IGVudiB2YXJpYWJsZXMgdGhhdCBhcmUgcHJlc2VudCBpbiB0aGUgcG9saWN5IGRhdGEgdG9vLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHBfdmFyID09IGlfdmFyCiAgICBwcmludCgiYWxsb3dfdmFyIDE6IHRydWUiKQp9CgojIE1hdGNoIGlucHV0IHdpdGggb25lIG9mIHRoZSBwb2xpY3kgdmFyaWFibGVzLCBhZnRlciBzdWJzdGl0dXRpbmcgJChzYW5kYm94LW5hbWUpLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHByaW50KCJhbGxvd192YXIgMjogcF92YXIgPSIsIHBfdmFyKQoKICAgIHBfdmFyX3NwbGl0IDo9IHNwbGl0KHBfdmFyLCAiPSIpCiAgICBjb3VudChwX3Zhcl9zcGxpdCkgPT0gMgoKICAgIHBfdmFyX3NwbGl0WzFdID09ICIkKHNhbmRib3gtbmFtZSkiCgogICAgaV92YXJfc3BsaXQgOj0gc3BsaXQoaV92YXIsICI9IikKICAgIGNvdW50KGlfdmFyX3NwbGl0KSA9PSAyCgogICAgaV92YXJfc3BsaXRbMF0gPT0gcF92YXJfc3BsaXRbMF0KICAgIHJlZ2V4Lm1hdGNoKHNfbmFtZSwgaV92YXJfc3BsaXRbMV0pCgogICAgcHJpbnQoImFsbG93X3ZhciAyOiB0cnVlIikKfQoKIyBBbGxvdyBpbnB1dCBlbnYgdmFyaWFibGVzIHRoYXQgbWF0Y2ggd2l0aCBhIHJlcXVlc3RfZGVmYXVsdHMgcmVnZXguCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHNvbWUgcF9yZWdleDEgaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5DcmVhdGVDb250YWluZXJSZXF1ZXN0LmFsbG93X2Vudl9yZWdleAogICAgcF9yZWdleDIgOj0gcmVwbGFjZShwX3JlZ2V4MSwgIiQoaXB2NF9hKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcHY0X2EpCiAgICBwX3JlZ2V4MyA6PSByZXBsYWNlKHBfcmVnZXgyLCAiJChpcF9wKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcF9wKQogICAgcF9yZWdleDQgOj0gcmVwbGFjZShwX3JlZ2V4MywgIiQoc3ZjX25hbWUpIiwgcG9saWN5X2RhdGEuY29tbW9uLnN2Y19uYW1lKQogICAgcF9yZWdleDUgOj0gcmVwbGFjZShwX3JlZ2V4NCwgIiQoZG5zX2xhYmVsKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5kbnNfbGFiZWwpCgogICAgcHJpbnQoImFsbG93X3ZhciAzOiBwX3JlZ2V4NSA9IiwgcF9yZWdleDUpCiAgICByZWdleC5tYXRjaChwX3JlZ2V4NSwgaV92YXIpCgogICAgcHJpbnQoImFsbG93X3ZhciAzOiB0cnVlIikKfQoKIyBBbGxvdyBmaWVsZFJlZiAiZmllbGRQYXRoOiBzdGF0dXMucG9kSVAiIHZhbHVlcy4KYWxsb3dfdmFyKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBpX3Zhciwgc19uYW1lLCBzX25hbWVzcGFjZSkgewogICAgbmFtZV92YWx1ZSA6PSBzcGxpdChpX3ZhciwgIj0iKQogICAgY291bnQobmFtZV92YWx1ZSkgPT0gMgogICAgaXNfaXAobmFtZV92YWx1ZVsxXSkKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIGFsbG93X3BvZF9pcF92YXIobmFtZV92YWx1ZVswXSwgcF92YXIpCgogICAgcHJpbnQoImFsbG93X3ZhciA0OiB0cnVlIikKfQoKIyBBbGxvdyBjb21tb24gZmllbGRSZWYgdmFyaWFibGVzLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBuYW1lX3ZhbHVlIDo9IHNwbGl0KGlfdmFyLCAiPSIpCiAgICBjb3VudChuYW1lX3ZhbHVlKSA9PSAyCgogICAgc29tZSBwX3ZhciBpbiBwX3Byb2Nlc3MuRW52CiAgICBwX25hbWVfdmFsdWUgOj0gc3BsaXQocF92YXIsICI9IikKICAgIGNvdW50KHBfbmFtZV92YWx1ZSkgPT0gMgoKICAgIHBfbmFtZV92YWx1ZVswXSA9PSBuYW1lX3ZhbHVlWzBdCgogICAgIyBUT0RPOiBzaG91bGQgdGhlc2UgYmUgaGFuZGxlZCBpbiBhIGRpZmZlcmVudCB3YXk/CiAgICBhbHdheXNfYWxsb3dlZCA6PSBbIiQoaG9zdC1uYW1lKSIsICIkKG5vZGUtbmFtZSkiLCAiJChwb2QtdWlkKSJdCiAgICBzb21lIGFsbG93ZWQgaW4gYWx3YXlzX2FsbG93ZWQKICAgIGNvbnRhaW5zKHBfbmFtZV92YWx1ZVsxXSwgYWxsb3dlZCkKCiAgICBwcmludCgiYWxsb3dfdmFyIDU6IHRydWUiKQp9CgojIEFsbG93IGZpZWxkUmVmICJmaWVsZFBhdGg6IHN0YXR1cy5ob3N0SVAiIHZhbHVlcy4KYWxsb3dfdmFyKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBpX3Zhciwgc19uYW1lLCBzX25hbWVzcGFjZSkgewogICAgbmFtZV92YWx1ZSA6PSBzcGxpdChpX3ZhciwgIj0iKQogICAgY291bnQobmFtZV92YWx1ZSkgPT0gMgogICAgaXNfaXAobmFtZV92YWx1ZVsxXSkKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIGFsbG93X2hvc3RfaXBfdmFyKG5hbWVfdmFsdWVbMF0sIHBfdmFyKQoKICAgIHByaW50KCJhbGxvd192YXIgNjogdHJ1ZSIpCn0KCiMgQWxsb3cgcmVzb3VyY2VGaWVsZFJlZiB2YWx1ZXMgKGUuZy4sICJsaW1pdHMuY3B1IikuCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIG5hbWVfdmFsdWUgOj0gc3BsaXQoaV92YXIsICI9IikKICAgIGNvdW50KG5hbWVfdmFsdWUpID09IDIKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHBfbmFtZV92YWx1ZSA6PSBzcGxpdChwX3ZhciwgIj0iKQogICAgY291bnQocF9uYW1lX3ZhbHVlKSA9PSAyCgogICAgcF9uYW1lX3ZhbHVlWzBdID09IG5hbWVfdmFsdWVbMF0KCiAgICAjIGEgdmFyaWFibGUgd2Ugc2hvdWxkIGJlIHZhbGlkYXRpbmcgdXNpbmcgYSByZWdleCBmcm9tIHNldHRpbmdzCiAgICBwX25hbWVfdmFsdWVbMV0gPT0gIiQodmFsaWRhdGUtZnJvbS1zZXR0aW5ncykiCgogICAgcmVnZXhfdmFsIDo9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuQ3JlYXRlQ29udGFpbmVyUmVxdWVzdC5hbGxvd19lbnZfcmVnZXhfbWFwW25hbWVfdmFsdWVbMF1dCgogICAgcHJpbnQoImFsbG93X3ZhciA3OiB2YWwgPSIsIG5hbWVfdmFsdWVbMV0pCiAgICBwcmludCgiYWxsb3dfdmFyIDc6IHJlZ2V4X3ZhbCA9IiwgcmVnZXhfdmFsKQoKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4X3ZhbCwgbmFtZV92YWx1ZVsxXSkKCiAgICBwcmludCgiYWxsb3dfdmFyIDc6IHRydWUiKQp9CgojIE1hdGNoIGlucHV0IHdpdGggb25lIG9mIHRoZSBwb2xpY3kgdmFyaWFibGVzLCBhZnRlciBzdWJzdGl0dXRpbmcgJChzYW5kYm94LW5hbWVzcGFjZSkuCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHNvbWUgcF92YXIgaW4gcF9wcm9jZXNzLkVudgogICAgcF92YXIyIDo9IHJlcGxhY2UocF92YXIsICIkKHNhbmRib3gtbmFtZXNwYWNlKSIsIHNfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd192YXIgODogcF92YXIyID0iLCBwX3ZhcjIpCiAgICBwX3ZhcjIgPT0gaV92YXIKCiAgICBwcmludCgiYWxsb3dfdmFyIDg6IHRydWUiKQp9CgphbGxvd19wb2RfaXBfdmFyKHZhcl9uYW1lLCBwX3ZhcikgewogICAgcHJpbnQoImFsbG93X3BvZF9pcF92YXI6IHZhcl9uYW1lID0iLCB2YXJfbmFtZSwgInBfdmFyID0iLCBwX3ZhcikKCiAgICBwX25hbWVfdmFsdWUgOj0gc3BsaXQocF92YXIsICI9IikKICAgIGNvdW50KHBfbmFtZV92YWx1ZSkgPT0gMgoKICAgIHBfbmFtZV92YWx1ZVswXSA9PSB2YXJfbmFtZQogICAgcF9uYW1lX3ZhbHVlWzFdID09ICIkKHBvZC1pcCkiCgogICAgcHJpbnQoImFsbG93X3BvZF9pcF92YXI6IHRydWUiKQp9CgphbGxvd19ob3N0X2lwX3Zhcih2YXJfbmFtZSwgcF92YXIpIHsKICAgIHByaW50KCJhbGxvd19ob3N0X2lwX3ZhcjogdmFyX25hbWUgPSIsIHZhcl9uYW1lLCAicF92YXIgPSIsIHBfdmFyKQoKICAgIHBfbmFtZV92YWx1ZSA6PSBzcGxpdChwX3ZhciwgIj0iKQogICAgY291bnQocF9uYW1lX3ZhbHVlKSA9PSAyCgogICAgcF9uYW1lX3ZhbHVlWzBdID09IHZhcl9uYW1lCiAgICBwX25hbWVfdmFsdWVbMV0gPT0gIiQoaG9zdC1pcCkiCgogICAgcHJpbnQoImFsbG93X2hvc3RfaXBfdmFyOiB0cnVlIikKfQoKaXNfaXAodmFsdWUpIHsKICAgIGJ5dGVzID0gc3BsaXQodmFsdWUsICIuIikKICAgIGNvdW50KGJ5dGVzKSA9PSA0CgogICAgaXNfaXBfZmlyc3RfYnl0ZShieXRlc1swXSkKICAgIGlzX2lwX290aGVyX2J5dGUoYnl0ZXNbMV0pCiAgICBpc19pcF9vdGhlcl9ieXRlKGJ5dGVzWzJdKQogICAgaXNfaXBfb3RoZXJfYnl0ZShieXRlc1szXSkKfQppc19pcF9maXJzdF9ieXRlKGNvbXBvbmVudCkgewogICAgbnVtYmVyID0gdG9fbnVtYmVyKGNvbXBvbmVudCkKICAgIG51bWJlciA+PSAxCiAgICBudW1iZXIgPD0gMjU1Cn0KaXNfaXBfb3RoZXJfYnl0ZShjb21wb25lbnQpIHsKICAgIG51bWJlciA9IHRvX251bWJlcihjb21wb25lbnQpCiAgICBudW1iZXIgPj0gMAogICAgbnVtYmVyIDw9IDI1NQp9CgojIE9DSSByb290LlBhdGgKYWxsb3dfcm9vdF9wYXRoKHBfb2NpLCBpX29jaSwgYnVuZGxlX2lkKSB7CiAgICBpX3BhdGggOj0gaV9vY2kuUm9vdC5QYXRoCiAgICBwX3BhdGgxIDo9IHBfb2NpLlJvb3QuUGF0aAogICAgcHJpbnQoImFsbG93X3Jvb3RfcGF0aDogaV9wYXRoID0iLCBpX3BhdGgsICJwX3BhdGgxID0iLCBwX3BhdGgxKQoKICAgIHBfcGF0aDIgOj0gcmVwbGFjZShwX3BhdGgxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfcm9vdF9wYXRoOiBwX3BhdGgyID0iLCBwX3BhdGgyKQoKICAgIHBfcGF0aDMgOj0gcmVwbGFjZShwX3BhdGgyLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X3Jvb3RfcGF0aDogcF9wYXRoMyA9IiwgcF9wYXRoMykKCiAgICBwX3BhdGgzID09IGlfcGF0aAoKICAgIHByaW50KCJhbGxvd19yb290X3BhdGg6IHRydWUiKQp9CgojIGRldmljZSBtb3VudHMKYWxsb3dfbW91bnQocF9vY2ksIGlfbW91bnQsIGlfc3RvcmFnZXMsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcHJpbnQoImFsbG93X21vdW50OiBpX21vdW50ID0iLCBpX21vdW50KQoKICAgIHNvbWUgcF9tb3VudCBpbiBwX29jaS5Nb3VudHMKICAgIHNvbWUgaV9zdG9yYWdlIGluIGlfc3RvcmFnZXMKCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IHBfbW91bnQgPSIsIHBfbW91bnQpCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IGlfc3RvcmFnZSA9IiwgaV9zdG9yYWdlKQoKICAgIGNoZWNrX21vdW50KHBfbW91bnQsIGlfbW91bnQsIGlfc3RvcmFnZSwgYnVuZGxlX2lkLCBzYW5kYm94X2lkKQoKICAgICMgVE9ETzogYXJlIHRoZXJlIGFueSBvdGhlciByZXF1aXJlZCBwb2xpY3kgY2hlY2tzIGZvciBtb3VudHMgLSBlLmcuLAogICAgIyAgICAgICBtdWx0aXBsZSBtb3VudHMgd2l0aCBzYW1lIHNvdXJjZSBvciBkZXN0aW5hdGlvbj8KCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IHRydWUiKQp9CgpjaGVja19tb3VudChwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcF9tb3VudCA9PSBpX21vdW50CiAgICBwcmludCgiY2hlY2tfbW91bnQgMTogdHJ1ZSIpCn0KY2hlY2tfbW91bnQocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHBfbW91bnQuZGVzdGluYXRpb24gPT0gaV9tb3VudC5kZXN0aW5hdGlvbgogICAgcF9tb3VudC50eXBlXyA9PSBpX21vdW50LnR5cGVfCiAgICBwX21vdW50Lm9wdGlvbnMgPT0gaV9tb3VudC5vcHRpb25zCgogICAgbW91bnRfc291cmNlX2FsbG93cyhwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkKCiAgICBwcmludCgiY2hlY2tfbW91bnQgMjogdHJ1ZSIpCn0KCm1vdW50X3NvdXJjZV9hbGxvd3MocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHJlZ2V4MSA6PSBwX21vdW50LnNvdXJjZQogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5tb3VudF9zb3VyY2VfY3BhdGgpCiAgICByZWdleDQgOj0gcmVwbGFjZShyZWdleDMsICIkKGJ1bmRsZS1pZCkiLCBidW5kbGVfaWQpCgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMTogcmVnZXg0ID0iLCByZWdleDQpCiAgICByZWdleC5tYXRjaChyZWdleDQsIGlfbW91bnQuc291cmNlKQoKICAgIHByaW50KCJtb3VudF9zb3VyY2VfYWxsb3dzIDE6IHRydWUiKQp9Cm1vdW50X3NvdXJjZV9hbGxvd3MocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHJlZ2V4MSA6PSBwX21vdW50LnNvdXJjZQogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5tb3VudF9zb3VyY2VfY3BhdGgpCiAgICByZWdleDQgOj0gcmVwbGFjZShyZWdleDMsICIkKHNhbmRib3gtaWQpIiwgc2FuZGJveF9pZCkKCiAgICBwcmludCgibW91bnRfc291cmNlX2FsbG93cyAyOiByZWdleDQgPSIsIHJlZ2V4NCkKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4NCwgaV9tb3VudC5zb3VyY2UpCgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMjogdHJ1ZSIpCn0KbW91bnRfc291cmNlX2FsbG93cyhwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogaV9tb3VudC5zb3VyY2UgPSIsIGlfbW91bnQuc291cmNlKQogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogaV9zdG9yYWdlLm1vdW50X3BvaW50ID0iLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCgogICAgaV9tb3VudC5zb3VyY2UgPT0gaV9zdG9yYWdlLm1vdW50X3BvaW50CgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogdHJ1ZSIpCn0KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBDcmVhdGUgY29udGFpbmVyIFN0b3JhZ2VzCgphbGxvd19zdG9yYWdlcyhwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHBfY291bnQgOj0gY291bnQocF9zdG9yYWdlcykKICAgIGlfY291bnQgOj0gY291bnQoaV9zdG9yYWdlcykKICAgIHByaW50KCJhbGxvd19zdG9yYWdlczogcF9jb3VudCA9IiwgcF9jb3VudCwgImlfY291bnQgPSIsIGlfY291bnQpCgogICAgcF9jb3VudCA9PSBpX2NvdW50CgogICAgIyBHZXQgdGhlIGNvbnRhaW5lciBpbWFnZSBsYXllciBJRHMgYW5kIHZlcml0eSByb290IGhhc2hlcywgZnJvbSB0aGUgIm92ZXJsYXlmcyIgc3RvcmFnZS4KICAgIHNvbWUgb3ZlcmxheV9zdG9yYWdlIGluIHBfc3RvcmFnZXMKICAgIG92ZXJsYXlfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIHByaW50KCJhbGxvd19zdG9yYWdlczogb3ZlcmxheV9zdG9yYWdlID0iLCBvdmVybGF5X3N0b3JhZ2UpCiAgICBjb3VudChvdmVybGF5X3N0b3JhZ2Uub3B0aW9ucykgPT0gMgoKICAgIGxheWVyX2lkcyA6PSBzcGxpdChvdmVybGF5X3N0b3JhZ2Uub3B0aW9uc1swXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiBsYXllcl9pZHMgPSIsIGxheWVyX2lkcykKCiAgICByb290X2hhc2hlcyA6PSBzcGxpdChvdmVybGF5X3N0b3JhZ2Uub3B0aW9uc1sxXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiByb290X2hhc2hlcyA9Iiwgcm9vdF9oYXNoZXMpCgogICAgZXZlcnkgaV9zdG9yYWdlIGluIGlfc3RvcmFnZXMgewogICAgICAgIGFsbG93X3N0b3JhZ2UocF9zdG9yYWdlcywgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpCiAgICB9CgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiB0cnVlIikKfQoKYWxsb3dfc3RvcmFnZShwX3N0b3JhZ2VzLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgc29tZSBwX3N0b3JhZ2UgaW4gcF9zdG9yYWdlcwoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiBwX3N0b3JhZ2UgPSIsIHBfc3RvcmFnZSkKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiBpX3N0b3JhZ2UgPSIsIGlfc3RvcmFnZSkKCiAgICBwX3N0b3JhZ2UuZHJpdmVyICAgICAgICAgICA9PSBpX3N0b3JhZ2UuZHJpdmVyCiAgICBwX3N0b3JhZ2UuZHJpdmVyX29wdGlvbnMgICA9PSBpX3N0b3JhZ2UuZHJpdmVyX29wdGlvbnMKICAgIHBfc3RvcmFnZS5mc19ncm91cCAgICAgICAgID09IGlfc3RvcmFnZS5mc19ncm91cAogICAgcF9zdG9yYWdlLmZzdHlwZSAgICAgICAgICAgPT0gaV9zdG9yYWdlLmZzdHlwZQoKICAgIGFsbG93X3N0b3JhZ2Vfc291cmNlKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKQogICAgYWxsb3dfc3RvcmFnZV9vcHRpb25zKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKQogICAgYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKQoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiB0cnVlIikKfQoKYWxsb3dfc3RvcmFnZV9zb3VyY2UocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX3NvdXJjZSAxOiBzdGFydCIpCgogICAgcF9zdG9yYWdlLnNvdXJjZSA9PSBpX3N0b3JhZ2Uuc291cmNlCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDE6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX3NvdXJjZShwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDI6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCgogICAgIyBEREREOkJCOkRELkY6IERvbWFpbjpCdXM6RGV2aWNlLkZ1bmN0aW9uCiAgICAjIGh0dHBzOi8vd3d3Lmtlcm5lbC5vcmcvZG9jL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtYnVzLXBjaQogICAgcmVnZXgubWF0Y2goYF5bYS1mMC05XXs0fTpbYS1mMC05XXsyfTpbYS1mMC05XXsyfVwuW2EtZjAtOV0kYCwgaV9zdG9yYWdlLnNvdXJjZSkKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9zb3VyY2UgMjogdHJ1ZSIpCn0KCmFsbG93X3N0b3JhZ2Vfc291cmNlKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKSB7CiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9zb3VyY2UgMzogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIGlfc3RvcmFnZS5zb3VyY2UgPT0gIm5vbmUiCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDM6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX3NvdXJjZShwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDQ6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJzbWIiCgogICAgIyBQYXR0ZXJuOiAvLzxzdG9yYWdlLWFjY291bnQtbmFtZT4uZmlsZS5jb3JlLndpbmRvd3MubmV0LzxrOHMtUFZDLW5hbWU+CiAgICAjIFN0b3JhZ2UgYWNjb3VudCBuYW1lOiBodHRwczovL2xlYXJuLm1pY3Jvc29mdC5jb20vZW4tdXMvYXp1cmUvc3RvcmFnZS9jb21tb24vc3RvcmFnZS1hY2NvdW50LW92ZXJ2aWV3I3N0b3JhZ2UtYWNjb3VudC1uYW1lCiAgICAjIEs4cyBQVkMgbmFtZTogaHR0cHM6Ly9rdWJlcm5ldGVzLmlvL2RvY3MvY29uY2VwdHMvb3ZlcnZpZXcvd29ya2luZy13aXRoLW9iamVjdHMvbmFtZXMvI2Rucy1zdWJkb21haW4tbmFtZXMKICAgIHJlZ2V4Lm1hdGNoKGBeXC9cLyhbYS16MC05XXszLDI0fSlcLmZpbGVcLmNvcmVcLndpbmRvd3NcLm5ldFwvW2EtejAtOV0oW2EtejAtOS4tXXswLDI1MX1bYS16MC05XSk/JGAsIGlfc3RvcmFnZS5zb3VyY2UpCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDQ6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMTogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgIT0gIm92ZXJsYXlmcyIKICAgIHBfc3RvcmFnZS5vcHRpb25zID09IGlfc3RvcmFnZS5vcHRpb25zCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAxOiB0cnVlIikKfQphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIGNvdW50KHBfc3RvcmFnZS5vcHRpb25zKSA9PSAyCgogICAgcG9saWN5X2lkcyA6PSBzcGxpdChwX3N0b3JhZ2Uub3B0aW9uc1swXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBwb2xpY3lfaWRzID0iLCBwb2xpY3lfaWRzKQogICAgcG9saWN5X2lkcyA9PSBsYXllcl9pZHMKCiAgICBwb2xpY3lfaGFzaGVzIDo9IHNwbGl0KHBfc3RvcmFnZS5vcHRpb25zWzFdLCAiOiIpCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IHBvbGljeV9oYXNoZXMgPSIsIHBvbGljeV9oYXNoZXMpCgogICAgcF9jb3VudCA6PSBjb3VudChwb2xpY3lfaWRzKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBwX2NvdW50ID0iLCBwX2NvdW50KQogICAgcF9jb3VudCA+PSAxCiAgICBwX2NvdW50ID09IGNvdW50KHBvbGljeV9oYXNoZXMpCgogICAgaV9jb3VudCA6PSBjb3VudChpX3N0b3JhZ2Uub3B0aW9ucykKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogaV9jb3VudCA9IiwgaV9jb3VudCkKICAgIGlfY291bnQgPT0gcF9jb3VudCArIDMKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zWzBdID0iLCBpX3N0b3JhZ2Uub3B0aW9uc1swXSkKICAgIGlfc3RvcmFnZS5vcHRpb25zWzBdID09ICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQubGF5ZXItc3JjLXByZWZpeD0vdmFyL2xpYi9jb250YWluZXJkL2lvLmNvbnRhaW5lcmQuc25hcHNob3R0ZXIudjEudGFyZGV2L2xheWVycyIKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zW2lfY291bnQgLSAyXSA9IiwgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDJdKQogICAgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDJdID09ICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQub3ZlcmxheS1ydyIKCiAgICBsb3dlcmRpciA6PSBjb25jYXQoIj0iLCBbImxvd2VyZGlyIiwgcF9zdG9yYWdlLm9wdGlvbnNbMF1dKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBsb3dlcmRpciA9IiwgbG93ZXJkaXIpCgogICAgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDFdID09IGxvd2VyZGlyCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zW2lfY291bnQgLSAxXSA9IiwgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDFdKQoKICAgIGV2ZXJ5IGksIHBvbGljeV9pZCBpbiBwb2xpY3lfaWRzIHsKICAgICAgICBhbGxvd19vdmVybGF5X2xheWVyKHBvbGljeV9pZCwgcG9saWN5X2hhc2hlc1tpXSwgaV9zdG9yYWdlLm9wdGlvbnNbaSArIDFdKQogICAgfQoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogdHJ1ZSIpCn0KYWxsb3dfc3RvcmFnZV9vcHRpb25zKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKSB7CiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDM6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCiAgICBjb3VudChwX3N0b3JhZ2Uub3B0aW9ucykgPT0gMQoKICAgIHN0YXJ0c3dpdGgocF9zdG9yYWdlLm9wdGlvbnNbMF0sICIkKGhhc2giKQogICAgaGFzaF9zdWZmaXggOj0gdHJpbV9sZWZ0KHBfc3RvcmFnZS5vcHRpb25zWzBdLCAiJChoYXNoIikKCiAgICBlbmRzd2l0aChoYXNoX3N1ZmZpeCwgIikiKQogICAgaGFzaF9pbmRleCA6PSB0cmltX3JpZ2h0KGhhc2hfc3VmZml4LCAiKSIpCiAgICBpIDo9IHRvX251bWJlcihoYXNoX2luZGV4KQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAzOiBpID0iLCBpKQoKICAgIGhhc2hfb3B0aW9uIDo9IGNvbmNhdCgiPSIsIFsiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LnJvb3QtaGFzaCIsIHJvb3RfaGFzaGVzW2ldXSkKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMzogaGFzaF9vcHRpb24gPSIsIGhhc2hfb3B0aW9uKQoKICAgIGNvdW50KGlfc3RvcmFnZS5vcHRpb25zKSA9PSA0CiAgICBpX3N0b3JhZ2Uub3B0aW9uc1swXSA9PSAicm8iCiAgICBpX3N0b3JhZ2Uub3B0aW9uc1sxXSA9PSAiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmJsb2NrX2RldmljZT1maWxlIgogICAgaV9zdG9yYWdlLm9wdGlvbnNbMl0gPT0gImlvLmthdGFjb250YWluZXJzLmZzLW9wdC5pcy1sYXllciIKICAgIGlfc3RvcmFnZS5vcHRpb25zWzNdID09IGhhc2hfb3B0aW9uCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAzOiB0cnVlIikKfQphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgNDogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gInNtYiIKICAgIHBfb3B0c19jb3VudCA6PSBjb3VudChwX3N0b3JhZ2Uub3B0aW9ucykKICAgIGlfb3B0c19jb3VudCA6PSBjb3VudChpX3N0b3JhZ2Uub3B0aW9ucykKICAgIGlfb3B0c19jb3VudCA9PSBwX29wdHNfY291bnQgKyAyCgogICAgaV9vcHRfbWF0Y2hlcyA6PSBbaSB8IGkgOj0gaWR4OyBpZHggPCBwX29wdHNfY291bnQ7IHBfc3RvcmFnZS5vcHRpb25zW2lkeF0gPT0gaV9zdG9yYWdlLm9wdGlvbnNbaWR4XV0KICAgIGNvdW50KGlfb3B0X21hdGNoZXMpID09IHBfb3B0c19jb3VudAoKICAgIHN0YXJ0c3dpdGgoaV9zdG9yYWdlLm9wdGlvbnNbaV9vcHRzX2NvdW50LTJdLCAiYWRkcj0iKQogICAgY3JlZHMgPSBzcGxpdChpX3N0b3JhZ2Uub3B0aW9uc1tpX29wdHNfY291bnQtMV0sICIsIikKICAgIGNvdW50KGNyZWRzKSA9PSAyCiAgICBzdGFydHN3aXRoKGNyZWRzWzBdLCAidXNlcm5hbWU9IikKICAgIHN0YXJ0c3dpdGgoY3JlZHNbMV0sICJwYXNzd29yZD0iKQogICAgCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDQ6IHRydWUiKQp9CgphbGxvd19vdmVybGF5X2xheWVyKHBvbGljeV9pZCwgcG9saWN5X2hhc2gsIGlfb3B0aW9uKSB7CiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogcG9saWN5X2lkID0iLCBwb2xpY3lfaWQsICJwb2xpY3lfaGFzaCA9IiwgcG9saWN5X2hhc2gpCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogaV9vcHRpb24gPSIsIGlfb3B0aW9uKQoKICAgIHN0YXJ0c3dpdGgoaV9vcHRpb24sICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQubGF5ZXI9IikKICAgIGlfdmFsdWUgOj0gcmVwbGFjZShpX29wdGlvbiwgImlvLmthdGFjb250YWluZXJzLmZzLW9wdC5sYXllcj0iLCAiIikKICAgIGlfdmFsdWVfZGVjb2RlZCA6PSBiYXNlNjQuZGVjb2RlKGlfdmFsdWUpCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogaV92YWx1ZV9kZWNvZGVkID0iLCBpX3ZhbHVlX2RlY29kZWQpCgogICAgcG9saWN5X3N1ZmZpeCA6PSBjb25jYXQoIj0iLCBbInRhcixybyxpby5rYXRhY29udGFpbmVycy5mcy1vcHQuYmxvY2tfZGV2aWNlPWZpbGUsaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmlzLWxheWVyLGlvLmthdGFjb250YWluZXJzLmZzLW9wdC5yb290LWhhc2giLCBwb2xpY3lfaGFzaF0pCiAgICBwX3ZhbHVlIDo9IGNvbmNhdCgiLCIsIFtwb2xpY3lfaWQsIHBvbGljeV9zdWZmaXhdKQogICAgcHJpbnQoImFsbG93X292ZXJsYXlfbGF5ZXI6IHBfdmFsdWUgPSIsIHBfdmFsdWUpCgogICAgcF92YWx1ZSA9PSBpX3ZhbHVlX2RlY29kZWQKCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogdHJ1ZSIpCn0KCmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAidGFyIgoKICAgIHN0YXJ0c3dpdGgocF9zdG9yYWdlLm1vdW50X3BvaW50LCAiJChsYXllciIpCiAgICBtb3VudF9zdWZmaXggOj0gdHJpbV9sZWZ0KHBfc3RvcmFnZS5tb3VudF9wb2ludCwgIiQobGF5ZXIiKQoKICAgIGVuZHN3aXRoKG1vdW50X3N1ZmZpeCwgIikiKQogICAgbGF5ZXJfaW5kZXggOj0gdHJpbV9yaWdodChtb3VudF9zdWZmaXgsICIpIikKICAgIGkgOj0gdG9fbnVtYmVyKGxheWVyX2luZGV4KQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDE6IGkgPSIsIGkpCgogICAgbGF5ZXJfaWQgOj0gbGF5ZXJfaWRzW2ldCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMTogbGF5ZXJfaWQgPSIsIGxheWVyX2lkKQoKICAgIHBfbW91bnQgOj0gY29uY2F0KCIvIiwgWyIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L2xheWVycyIsIGxheWVyX2lkXSkKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCAxOiBwX21vdW50ID0iLCBwX21vdW50KQoKICAgIHBfbW91bnQgPT0gaV9zdG9yYWdlLm1vdW50X3BvaW50CgogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDE6IHRydWUiKQp9CmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAiZnVzZTMua2F0YS1vdmVybGF5IgoKICAgIG1vdW50MSA6PSByZXBsYWNlKHBfc3RvcmFnZS5tb3VudF9wb2ludCwgIiQoY3BhdGgpIiwgcG9saWN5X2RhdGEuY29tbW9uLmNwYXRoKQogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDI6IG1vdW50MiA9IiwgbW91bnQyKQoKICAgIG1vdW50MiA9PSBpX3N0b3JhZ2UubW91bnRfcG9pbnQKCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMjogdHJ1ZSIpCn0KYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKSB7CiAgICBwX3N0b3JhZ2UuZnN0eXBlID09ICJsb2NhbCIKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQyID0iLCBtb3VudDIpCgogICAgbW91bnQzIDo9IHJlcGxhY2UobW91bnQyLCAiJChzYW5kYm94LWlkKSIsIHNhbmRib3hfaWQpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQzID0iLCBtb3VudDMpCgogICAgcmVnZXgubWF0Y2gobW91bnQzLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCgogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDM6IHRydWUiKQp9CmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAiYmluZCIKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNDogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNDogbW91bnQyID0iLCBtb3VudDIpCgogICAgbW91bnQzIDo9IHJlcGxhY2UobW91bnQyLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDQ6IG1vdW50MyA9IiwgbW91bnQzKQoKICAgIHJlZ2V4Lm1hdGNoKG1vdW50MywgaV9zdG9yYWdlLm1vdW50X3BvaW50KQoKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA0OiB0cnVlIikKfQphbGxvd19tb3VudF9wb2ludChwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgYnVuZGxlX2lkLCBzYW5kYm94X2lkLCBsYXllcl9pZHMpIHsKICAgIHBfc3RvcmFnZS5mc3R5cGUgPT0gInRtcGZzIgoKICAgIG1vdW50MSA6PSBwX3N0b3JhZ2UubW91bnRfcG9pbnQKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA1OiBtb3VudDEgPSIsIG1vdW50MSkKCiAgICByZWdleC5tYXRjaChtb3VudDEsIGlfc3RvcmFnZS5tb3VudF9wb2ludCkKCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNTogdHJ1ZSIpCn0KYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKSB7CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogaV9zdG9yYWdlLm1vdW50X3BvaW50ID0iLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCiAgICBhbGxvd19kaXJlY3Rfdm9sX2RyaXZlcihwX3N0b3JhZ2UsIGlfc3RvcmFnZSkKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChzcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQyID0iLCBtb3VudDIpCgogICAgZGlyZWN0X3ZvbF9wYXRoIDo9IGlfc3RvcmFnZS5zb3VyY2UKICAgIG1vdW50MyA6PSByZXBsYWNlKG1vdW50MiwgIiQoYjY0LWRpcmVjdC12b2wtcGF0aCkiLCBiYXNlNjR1cmwuZW5jb2RlKGRpcmVjdF92b2xfcGF0aCkpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQzID0iLCBtb3VudDMpCgogICAgbW91bnQzID09IGlfc3RvcmFnZS5tb3VudF9wb2ludAoKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA2OiB0cnVlIikKfQoKYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIocF9zdG9yYWdlLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19kaXJlY3Rfdm9sX2RyaXZlciAxOiBzdGFydCIpCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCiAgICBwcmludCgiYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIgMTogdHJ1ZSIpCn0KYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIocF9zdG9yYWdlLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19kaXJlY3Rfdm9sX2RyaXZlciAyOiBzdGFydCIpCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJzbWIiCiAgICBwcmludCgiYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIgMjogdHJ1ZSIpCn0KCiMgRXhlY1Byb2Nlc3NSZXF1ZXN0LnByb2Nlc3MuQ2FwYWJpbGl0aWVzCmFsbG93X2V4ZWNfY2FwcyhpX2NhcHMpIHsKICAgIG5vdCBpX2NhcHMuQW1iaWVudAogICAgbm90IGlfY2Fwcy5Cb3VuZGluZwogICAgbm90IGlfY2Fwcy5FZmZlY3RpdmUKICAgIG5vdCBpX2NhcHMuSW5oZXJpdGFibGUKICAgIG5vdCBpX2NhcHMuUGVybWl0dGVkCn0KCiMgT0NJLlByb2Nlc3MuQ2FwYWJpbGl0aWVzCmFsbG93X2NhcHMocF9jYXBzLCBpX2NhcHMpIHsKICAgIHByaW50KCJhbGxvd19jYXBzOiBwb2xpY3kgQW1iaWVudCA9IiwgcF9jYXBzLkFtYmllbnQpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgQW1iaWVudCA9IiwgaV9jYXBzLkFtYmllbnQpCiAgICBtYXRjaF9jYXBzKHBfY2Fwcy5BbWJpZW50LCBpX2NhcHMuQW1iaWVudCkKCiAgICBwcmludCgiYWxsb3dfY2FwczogcG9saWN5IEJvdW5kaW5nID0iLCBwX2NhcHMuQm91bmRpbmcpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgQm91bmRpbmcgPSIsIGlfY2Fwcy5Cb3VuZGluZykKICAgIG1hdGNoX2NhcHMocF9jYXBzLkJvdW5kaW5nLCBpX2NhcHMuQm91bmRpbmcpCgogICAgcHJpbnQoImFsbG93X2NhcHM6IHBvbGljeSBFZmZlY3RpdmUgPSIsIHBfY2Fwcy5FZmZlY3RpdmUpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgRWZmZWN0aXZlID0iLCBpX2NhcHMuRWZmZWN0aXZlKQogICAgbWF0Y2hfY2FwcyhwX2NhcHMuRWZmZWN0aXZlLCBpX2NhcHMuRWZmZWN0aXZlKQoKICAgIHByaW50KCJhbGxvd19jYXBzOiBwb2xpY3kgSW5oZXJpdGFibGUgPSIsIHBfY2Fwcy5Jbmhlcml0YWJsZSkKICAgIHByaW50KCJhbGxvd19jYXBzOiBpbnB1dCBJbmhlcml0YWJsZSA9IiwgaV9jYXBzLkluaGVyaXRhYmxlKQogICAgbWF0Y2hfY2FwcyhwX2NhcHMuSW5oZXJpdGFibGUsIGlfY2Fwcy5Jbmhlcml0YWJsZSkKCiAgICBwcmludCgiYWxsb3dfY2FwczogcG9saWN5IFBlcm1pdHRlZCA9IiwgcF9jYXBzLlBlcm1pdHRlZCkKICAgIHByaW50KCJhbGxvd19jYXBzOiBpbnB1dCBQZXJtaXR0ZWQgPSIsIGlfY2Fwcy5QZXJtaXR0ZWQpCiAgICBtYXRjaF9jYXBzKHBfY2Fwcy5QZXJtaXR0ZWQsIGlfY2Fwcy5QZXJtaXR0ZWQpCn0KCm1hdGNoX2NhcHMocF9jYXBzLCBpX2NhcHMpIHsKICAgIHByaW50KCJtYXRjaF9jYXBzIDE6IHN0YXJ0IikKCiAgICBwX2NhcHMgPT0gaV9jYXBzCgogICAgcHJpbnQoIm1hdGNoX2NhcHMgMTogdHJ1ZSIpCn0KbWF0Y2hfY2FwcyhwX2NhcHMsIGlfY2FwcykgewogICAgcHJpbnQoIm1hdGNoX2NhcHMgMjogc3RhcnQiKQoKICAgIGNvdW50KHBfY2FwcykgPT0gMQogICAgcF9jYXBzWzBdID09ICIkKGRlZmF1bHRfY2FwcykiCgogICAgcHJpbnQoIm1hdGNoX2NhcHMgMjogZGVmYXVsdF9jYXBzID0iLCBwb2xpY3lfZGF0YS5jb21tb24uZGVmYXVsdF9jYXBzKQogICAgcG9saWN5X2RhdGEuY29tbW9uLmRlZmF1bHRfY2FwcyA9PSBpX2NhcHMKCiAgICBwcmludCgibWF0Y2hfY2FwcyAyOiB0cnVlIikKfQptYXRjaF9jYXBzKHBfY2FwcywgaV9jYXBzKSB7CiAgICBwcmludCgibWF0Y2hfY2FwcyAzOiBzdGFydCIpCgogICAgY291bnQocF9jYXBzKSA9PSAxCiAgICBwX2NhcHNbMF0gPT0gIiQocHJpdmlsZWdlZF9jYXBzKSIKCiAgICBwcmludCgibWF0Y2hfY2FwcyAzOiBwcml2aWxlZ2VkX2NhcHMgPSIsIHBvbGljeV9kYXRhLmNvbW1vbi5wcml2aWxlZ2VkX2NhcHMpCiAgICBwb2xpY3lfZGF0YS5jb21tb24ucHJpdmlsZWdlZF9jYXBzID09IGlfY2FwcwoKICAgIHByaW50KCJtYXRjaF9jYXBzIDM6IHRydWUiKQp9CgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgpjaGVja19kaXJlY3RvcnlfdHJhdmVyc2FsKGlfcGF0aCkgewogICAgbm90IHJlZ2V4Lm1hdGNoKCIoXnwvKS4uKCR8LykiLCBpX3BhdGgpCn0KCmNoZWNrX3N5bWxpbmtfc291cmNlKGlfc3JjKSB7CiAgICBpX3NyYyA9PSAiIgogICAgcHJpbnQoImNoZWNrX3N5bWxpbmtfc291cmNlIDE6IHRydWUiKQp9CmNoZWNrX3N5bWxpbmtfc291cmNlKGlfc3JjKSB7CiAgICBpX3NyYyAhPSAiIgogICAgcHJpbnQoImNoZWNrX3N5bWxpbmtfc291cmNlIDI6IGlfc3JjID0iLCBpX3NyYykKCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24uc19zb3VyY2UxLCBpX3NyYykKCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMjogdHJ1ZSIpCn0KY2hlY2tfc3ltbGlua19zb3VyY2UoaV9zcmMpIHsKICAgIGlfc3JjICE9ICIiCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMzogaV9zcmMgPSIsIGlfc3JjKQoKICAgIHJlZ2V4Lm1hdGNoKHBvbGljeV9kYXRhLmNvbW1vbi5zX3NvdXJjZTIsIGlfc3JjKQogICAgY2hlY2tfZGlyZWN0b3J5X3RyYXZlcnNhbChpX3NyYykKCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMzogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfc3RvcmFnZXMoaV9zdG9yYWdlcykgewogICAgcHJpbnQoImFsbG93X3NhbmRib3hfc3RvcmFnZXM6IGlfc3RvcmFnZXMgPSIsIGlfc3RvcmFnZXMpCgogICAgcF9zdG9yYWdlcyA6PSBwb2xpY3lfZGF0YS5zYW5kYm94LnN0b3JhZ2VzCiAgICBldmVyeSBpX3N0b3JhZ2UgaW4gaV9zdG9yYWdlcyB7CiAgICAgICAgYWxsb3dfc2FuZGJveF9zdG9yYWdlKHBfc3RvcmFnZXMsIGlfc3RvcmFnZSkKICAgIH0KCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9zdG9yYWdlczogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfc3RvcmFnZShwX3N0b3JhZ2VzLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IGlfc3RvcmFnZSA9IiwgaV9zdG9yYWdlKQoKICAgIHNvbWUgcF9zdG9yYWdlIGluIHBfc3RvcmFnZXMKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IHBfc3RvcmFnZSA9IiwgcF9zdG9yYWdlKQogICAgaV9zdG9yYWdlID09IHBfc3RvcmFnZQoKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IHRydWUiKQp9CgpDb3B5RmlsZVJlcXVlc3QgewogICAgcHJpbnQoIkNvcHlGaWxlUmVxdWVzdDogaW5wdXQucGF0aCA9IiwgaW5wdXQucGF0aCkKCiAgICBjaGVja19zeW1saW5rX3NvdXJjZShpbnB1dC5zeW1saW5rX3NyYykKICAgIGNoZWNrX2RpcmVjdG9yeV90cmF2ZXJzYWwoaW5wdXQucGF0aCkKCiAgICBzb21lIHJlZ2V4MSBpbiBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLkNvcHlGaWxlUmVxdWVzdAogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5jcGF0aCkKICAgIHJlZ2V4NCA6PSByZXBsYWNlKHJlZ2V4MywgIiQoYnVuZGxlLWlkKSIsIEJVTkRMRV9JRCkKICAgIHByaW50KCJDb3B5RmlsZVJlcXVlc3Q6IHJlZ2V4NCA9IiwgcmVnZXg0KQoKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4NCwgaW5wdXQucGF0aCkKCiAgICBwcmludCgiQ29weUZpbGVSZXF1ZXN0OiB0cnVlIikKfQoKQ3JlYXRlU2FuZGJveFJlcXVlc3QgewogICAgcHJpbnQoIkNyZWF0ZVNhbmRib3hSZXF1ZXN0OiBpbnB1dC5ndWVzdF9ob29rX3BhdGggPSIsIGlucHV0Lmd1ZXN0X2hvb2tfcGF0aCkKICAgIGNvdW50KGlucHV0Lmd1ZXN0X2hvb2tfcGF0aCkgPT0gMAoKICAgIHByaW50KCJDcmVhdGVTYW5kYm94UmVxdWVzdDogaW5wdXQua2VybmVsX21vZHVsZXMgPSIsIGlucHV0Lmtlcm5lbF9tb2R1bGVzKQogICAgY291bnQoaW5wdXQua2VybmVsX21vZHVsZXMpID09IDAKCiAgICBpX3BpZG5zIDo9IGlucHV0LnNhbmRib3hfcGlkbnMKICAgIHByaW50KCJDcmVhdGVTYW5kYm94UmVxdWVzdDogaV9waWRucyA9IiwgaV9waWRucykKICAgIGlfcGlkbnMgPT0gZmFsc2UKICAgIGFsbG93X3NhbmRib3hfc3RvcmFnZXMoaW5wdXQuc3RvcmFnZXMpCn0KCmFsbG93X2V4ZWMocF9jb250YWluZXIsIGlfcHJvY2VzcykgewogICAgcHJpbnQoImFsbG93X2V4ZWM6IHN0YXJ0IikKCiAgICBwX29jaSA9IHBfY29udGFpbmVyLk9DSQogICAgcF9zX25hbWUgPSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc19uYW1lc3BhY2UgPSBnZXRfc3RhdGVfdmFsKCJuYW1lc3BhY2UiKQogICAgYWxsb3dfcHJvYmVfcHJvY2VzcyhwX29jaS5Qcm9jZXNzLCBpX3Byb2Nlc3MsIHBfc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfZXhlYzogdHJ1ZSIpCn0KCmFsbG93X2ludGVyYWN0aXZlX2V4ZWMocF9jb250YWluZXIsIGlfcHJvY2VzcykgewogICAgcHJpbnQoImFsbG93X2ludGVyYWN0aXZlX2V4ZWM6IHN0YXJ0IikKCiAgICBwX29jaSA9IHBfY29udGFpbmVyLk9DSQogICAgcF9zX25hbWUgPSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc19uYW1lc3BhY2UgPSBnZXRfc3RhdGVfdmFsKCJuYW1lc3BhY2UiKQogICAgYWxsb3dfaW50ZXJhY3RpdmVfcHJvY2VzcyhwX29jaS5Qcm9jZXNzLCBpX3Byb2Nlc3MsIHBfc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfaW50ZXJhY3RpdmVfZXhlYzogdHJ1ZSIpCn0KCiMgVE9ETzogc2hvdWxkIG90aGVyIEV4ZWNQcm9jZXNzUmVxdWVzdCBpbnB1dCBkYXRhIGZpZWxkcyBiZSB2YWxpZGF0ZWQgYXMgd2VsbD8KRXhlY1Byb2Nlc3NSZXF1ZXN0IHsKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMTogaW5wdXQgPSIsIGlucHV0KQoKICAgIHNvbWUgcF9jb21tYW5kIGluIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuRXhlY1Byb2Nlc3NSZXF1ZXN0LmFsbG93ZWRfY29tbWFuZHMKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMTogcF9jb21tYW5kID0iLCBwX2NvbW1hbmQpCiAgICBwX2NvbW1hbmQgPT0gaW5wdXQucHJvY2Vzcy5BcmdzCgogICAgIyBUT0RPOiBtYXRjaCBwX2NvbnRhaW5lcidzIElEIHdpdGggdGhlIGlucHV0IGNvbnRhaW5lcl9pZC4KICAgIHNvbWUgcF9jb250YWluZXIgaW4gcG9saWN5X2RhdGEuY29udGFpbmVycwogICAgYWxsb3dfaW50ZXJhY3RpdmVfZXhlYyhwX2NvbnRhaW5lciwgaW5wdXQucHJvY2VzcykKCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDE6IHRydWUiKQp9CkV4ZWNQcm9jZXNzUmVxdWVzdCB7CiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDI6IGlucHV0ID0iLCBpbnB1dCkKCiAgICAjIFRPRE86IG1hdGNoIGlucHV0IGNvbnRhaW5lciBJRCB3aXRoIGl0cyBjb3JyZXNwb25kaW5nIGNvbnRhaW5lci5leGVjX2NvbW1hbmRzLgogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBzb21lIHBfY29tbWFuZCBpbiBwX2NvbnRhaW5lci5leGVjX2NvbW1hbmRzCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDI6IHBfY29tbWFuZCA9IiwgcF9jb21tYW5kKQoKICAgICMgVE9ETzogc2hvdWxkIG90aGVyIGlucHV0IGRhdGEgZmllbGRzIGJlIHZhbGlkYXRlZCBhcyB3ZWxsPwogICAgcF9jb21tYW5kID09IGlucHV0LnByb2Nlc3MuQXJncwoKICAgIGFsbG93X2V4ZWMocF9jb250YWluZXIsIGlucHV0LnByb2Nlc3MpCgogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAyOiB0cnVlIikKfQpFeGVjUHJvY2Vzc1JlcXVlc3QgewogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAzOiBpbnB1dCA9IiwgaW5wdXQpCgogICAgaV9jb21tYW5kID0gY29uY2F0KCIgIiwgaW5wdXQucHJvY2Vzcy5BcmdzKQogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAzOiBpX2NvbW1hbmQgPSIsIGlfY29tbWFuZCkKCiAgICBzb21lIHBfcmVnZXggaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5FeGVjUHJvY2Vzc1JlcXVlc3QucmVnZXgKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMzogcF9yZWdleCA9IiwgcF9yZWdleCkKCiAgICByZWdleC5tYXRjaChwX3JlZ2V4LCBpX2NvbW1hbmQpCgogICAgIyBUT0RPOiBtYXRjaCBwX2NvbnRhaW5lcidzIElEIHdpdGggdGhlIGlucHV0IGNvbnRhaW5lcl9pZC4KICAgIHNvbWUgcF9jb250YWluZXIgaW4gcG9saWN5X2RhdGEuY29udGFpbmVycwogICAgYWxsb3dfaW50ZXJhY3RpdmVfZXhlYyhwX2NvbnRhaW5lciwgaW5wdXQucHJvY2VzcykKCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDM6IHRydWUiKQp9CgpVcGRhdGVSb3V0ZXNSZXF1ZXN0IHsKICAgIHByaW50KCJVcGRhdGVSb3V0ZXNSZXF1ZXN0OiBpbnB1dCA9IiwgaW5wdXQpCiAgICBwcmludCgiVXBkYXRlUm91dGVzUmVxdWVzdDogcG9saWN5ID0iLCBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLlVwZGF0ZVJvdXRlc1JlcXVlc3QpCgogICAgaV9yb3V0ZXMgOj0gaW5wdXQucm91dGVzLlJvdXRlcwogICAgcF9zb3VyY2VfcmVnZXggPSBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLlVwZGF0ZVJvdXRlc1JlcXVlc3QuZm9yYmlkZGVuX3NvdXJjZV9yZWdleAogICAgcF9uYW1lcyA9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuVXBkYXRlUm91dGVzUmVxdWVzdC5mb3JiaWRkZW5fZGV2aWNlX25hbWVzCgogICAgZXZlcnkgaV9yb3V0ZSBpbiBpX3JvdXRlcyB7CiAgICAgICAgcHJpbnQoImlfcm91dGUuc291cmNlID0iLCBpX3JvdXRlLnNvdXJjZSkKICAgICAgICBldmVyeSBwX3JlZ2V4IGluIHBfc291cmNlX3JlZ2V4IHsKICAgICAgICAgICAgcHJpbnQoInBfcmVnZXggPSIsIHBfcmVnZXgpCiAgICAgICAgICAgIG5vdCByZWdleC5tYXRjaChwX3JlZ2V4LCBpX3JvdXRlLnNvdXJjZSkKICAgICAgICB9CgogICAgICAgIHByaW50KCJpX3JvdXRlLmRldmljZSA9IiwgaV9yb3V0ZS5kZXZpY2UpCiAgICAgICAgbm90IGlfcm91dGUuZGV2aWNlIGluIHBfbmFtZXMKICAgIH0KCiAgICBwcmludCgiVXBkYXRlUm91dGVzUmVxdWVzdDogdHJ1ZSIpCn0KClVwZGF0ZUludGVyZmFjZVJlcXVlc3QgewogICAgcHJpbnQoIlVwZGF0ZUludGVyZmFjZVJlcXVlc3Q6IGlucHV0ID0iLCBpbnB1dCkKICAgIHByaW50KCJVcGRhdGVJbnRlcmZhY2VSZXF1ZXN0OiBwb2xpY3kgPSIsIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuVXBkYXRlSW50ZXJmYWNlUmVxdWVzdCkKCiAgICBpX2ludGVyZmFjZSA6PSBpbnB1dC5pbnRlcmZhY2UKICAgIHBfZmxhZ3MgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmFsbG93X3Jhd19mbGFncwoKICAgICMgVHlwaWNhbGx5LCBqdXN0IElGRl9OT0FSUCBpcyB1c2VkLgogICAgYml0cy5hbmQoaV9pbnRlcmZhY2UucmF3X2ZsYWdzLCBiaXRzLm5lZ2F0ZShwX2ZsYWdzKSkgPT0gMAoKICAgIHBfbmFtZXMgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmZvcmJpZGRlbl9uYW1lcwoKICAgIG5vdCBpX2ludGVyZmFjZS5uYW1lIGluIHBfbmFtZXMKCiAgICBwX2h3YWRkcnMgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmZvcmJpZGRlbl9od19hZGRycwoKICAgIG5vdCBpX2ludGVyZmFjZS5od0FkZHIgaW4gcF9od2FkZHJzCgogICAgcHJpbnQoIlVwZGF0ZUludGVyZmFjZVJlcXVlc3Q6IHRydWUiKQp9CgpDbG9zZVN0ZGluUmVxdWVzdCB7CiAgICBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLkNsb3NlU3RkaW5SZXF1ZXN0ID09IHRydWUKfQoKUmVhZFN0cmVhbVJlcXVlc3QgewogICAgcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5SZWFkU3RyZWFtUmVxdWVzdCA9PSB0cnVlCn0KClVwZGF0ZUVwaGVtZXJhbE1vdW50c1JlcXVlc3QgewogICAgcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVFcGhlbWVyYWxNb3VudHNSZXF1ZXN0ID09IHRydWUKfQoKV3JpdGVTdHJlYW1SZXF1ZXN0IHsKICAgIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuV3JpdGVTdHJlYW1SZXF1ZXN0ID09IHRydWUKfQoKcG9saWN5X2RhdGEgOj0gewogICJjb250YWluZXJzIjogWwogICAgewogICAgICAiT0NJIjogewogICAgICAgICJWZXJzaW9uIjogIjEuMS4wLXJjLjEiLAogICAgICAgICJQcm9jZXNzIjogewogICAgICAgICAgIlRlcm1pbmFsIjogZmFsc2UsCiAgICAgICAgICAiVXNlciI6IHsKICAgICAgICAgICAgIlVJRCI6IDY1NTM1LAogICAgICAgICAgICAiR0lEIjogNjU1MzUsCiAgICAgICAgICAgICJBZGRpdGlvbmFsR2lkcyI6IFtdLAogICAgICAgICAgICAiVXNlcm5hbWUiOiAiIgogICAgICAgICAgfSwKICAgICAgICAgICJEZXByZWNhdGVkQXJncyI6IFsKICAgICAgICAgICAgIi9wYXVzZSIKICAgICAgICAgIF0sCiAgICAgICAgICAiQXJncyI6IFsKICAgICAgICAgICAgIi9wYXVzZSIKICAgICAgICAgIF0sCiAgICAgICAgICAiRW52IjogWwogICAgICAgICAgICAiUEFUSD0vdXNyL2xvY2FsL3NiaW46L3Vzci9sb2NhbC9iaW46L3Vzci9zYmluOi91c3IvYmluOi9zYmluOi9iaW4iCiAgICAgICAgICBdLAogICAgICAgICAgIkN3ZCI6ICIvIiwKICAgICAgICAgICJDYXBhYmlsaXRpZXMiOiB7CiAgICAgICAgICAgICJBbWJpZW50IjogW10sCiAgICAgICAgICAgICJCb3VuZGluZyI6IFsKICAgICAgICAgICAgICAiJChkZWZhdWx0X2NhcHMpIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiRWZmZWN0aXZlIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJJbmhlcml0YWJsZSI6IFtdLAogICAgICAgICAgICAiUGVybWl0dGVkIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICAiTm9OZXdQcml2aWxlZ2VzIjogdHJ1ZQogICAgICAgIH0sCiAgICAgICAgIlJvb3QiOiB7CiAgICAgICAgICAiUGF0aCI6ICIkKGNwYXRoKS8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgIlJlYWRvbmx5IjogdHJ1ZQogICAgICAgIH0sCiAgICAgICAgIk1vdW50cyI6IFsKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9wcm9jIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJwcm9jIiwKICAgICAgICAgICAgInR5cGVfIjogInByb2MiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2IiwKICAgICAgICAgICAgInNvdXJjZSI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJzdHJpY3RhdGltZSIsCiAgICAgICAgICAgICAgIm1vZGU9NzU1IiwKICAgICAgICAgICAgICAic2l6ZT02NTUzNmsiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L3B0cyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiZGV2cHRzIiwKICAgICAgICAgICAgInR5cGVfIjogImRldnB0cyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJuZXdpbnN0YW5jZSIsCiAgICAgICAgICAgICAgInB0bXhtb2RlPTA2NjYiLAogICAgICAgICAgICAgICJtb2RlPTA2MjAiLAogICAgICAgICAgICAgICJnaWQ9NSIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvc2htIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L3NobSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi9tcXVldWUiLAogICAgICAgICAgICAic291cmNlIjogIm1xdWV1ZSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJtcXVldWUiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvc3lzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJzeXNmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJzeXNmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2V0Yy9yZXNvbHYuY29uZiIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClyZXNvbHYuY29uZiQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJvIiwKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9kZXYiLAogICAgICAgICAgICAgICJub2V4ZWMiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0KICAgICAgICBdLAogICAgICAgICJBbm5vdGF0aW9ucyI6IHsKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmJ1bmRsZV9wYXRoIjogIi9ydW4vY29udGFpbmVyZC9pby5jb250YWluZXJkLnJ1bnRpbWUudjIudGFzay9rOHMuaW8vJChidW5kbGUtaWQpIiwKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIjogInBvZF9zYW5kYm94IiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSI6ICJzYW5kYm94IiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWlkIjogIl5bYS16MC05XXs2NH0kIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWxvZy1kaXJlY3RvcnkiOiAiXi92YXIvbG9nL3BvZHMvJChzYW5kYm94LW5hbWVzcGFjZSlfJChzYW5kYm94LW5hbWUpX1swLTlhLWZdezh9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezEyfSQiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZSI6ICJeZXhlY1xcLXRlc3QkIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LW5hbWVzcGFjZSI6ICIiLAogICAgICAgICAgIm5lcmRjdGwvbmV0d29yay1uYW1lc3BhY2UiOiAiXi92YXIvcnVuL25ldG5zL2NuaS1bMC05YS1mXXs4fS1bMC05YS1mXXs0fS1bMC05YS1mXXs0fS1bMC05YS1mXXs0fS1bMC05YS1mXXsxMn0kIgogICAgICAgIH0sCiAgICAgICAgIkxpbnV4IjogewogICAgICAgICAgIk5hbWVzcGFjZXMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiVHlwZSI6ICJpcGMiLAogICAgICAgICAgICAgICJQYXRoIjogIiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJUeXBlIjogInV0cyIsCiAgICAgICAgICAgICAgIlBhdGgiOiAiIgogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgIlR5cGUiOiAibW91bnQiLAogICAgICAgICAgICAgICJQYXRoIjogIiIKICAgICAgICAgICAgfQogICAgICAgICAgXSwKICAgICAgICAgICJNYXNrZWRQYXRocyI6IFsKICAgICAgICAgICAgIi9wcm9jL2FjcGkiLAogICAgICAgICAgICAiL3Byb2MvYXNvdW5kIiwKICAgICAgICAgICAgIi9wcm9jL2tjb3JlIiwKICAgICAgICAgICAgIi9wcm9jL2tleXMiLAogICAgICAgICAgICAiL3Byb2MvbGF0ZW5jeV9zdGF0cyIsCiAgICAgICAgICAgICIvcHJvYy90aW1lcl9saXN0IiwKICAgICAgICAgICAgIi9wcm9jL3RpbWVyX3N0YXRzIiwKICAgICAgICAgICAgIi9wcm9jL3NjaGVkX2RlYnVnIiwKICAgICAgICAgICAgIi9zeXMvZmlybXdhcmUiLAogICAgICAgICAgICAiL3Byb2Mvc2NzaSIKICAgICAgICAgIF0sCiAgICAgICAgICAiUmVhZG9ubHlQYXRocyI6IFsKICAgICAgICAgICAgIi9wcm9jL2J1cyIsCiAgICAgICAgICAgICIvcHJvYy9mcyIsCiAgICAgICAgICAgICIvcHJvYy9pcnEiLAogICAgICAgICAgICAiL3Byb2Mvc3lzIiwKICAgICAgICAgICAgIi9wcm9jL3N5c3JxLXRyaWdnZXIiCiAgICAgICAgICBdLAogICAgICAgICAgIkRldmljZXMiOiBbXSwKICAgICAgICAgICJTeXNjdGwiOiB7CiAgICAgICAgICAgICJuZXQuaXB2NC5pcF91bnByaXZpbGVnZWRfcG9ydF9zdGFydCI6ICIwIiwKICAgICAgICAgICAgIm5ldC5pcHY0LnBpbmdfZ3JvdXBfcmFuZ2UiOiAiMCAyMTQ3NDgzNjQ3IgogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSwKICAgICAgInN0b3JhZ2VzIjogWwogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2gwKSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjApIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAib3ZlcmxheWZzIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJmdXNlMy5rYXRhLW92ZXJsYXkiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICI1YTVhYWQ4MDA1NWZmMjAwMTJhNTBkYzI1ZjhkZjdhMjk5MjQ0NzQzMjRkNjVmN2Q1MzA2ZWU4ZWUyN2ZmNzFkIiwKICAgICAgICAgICAgIjgxNzI1MGYxYTNlMzM2ZGE3NmY1YmQzZmE3ODRlMWIyNmQ5NTliOWMxMzE4NzY4MTViYTI2MDQwNDhiNzBjMTgiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQoY3BhdGgpLyQoYnVuZGxlLWlkKSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfQogICAgICBdLAogICAgICAiZGV2aWNlcyI6IFtdLAogICAgICAic2FuZGJveF9waWRucyI6IGZhbHNlLAogICAgICAiZXhlY19jb21tYW5kcyI6IFtdLAogICAgICAiZW52X21hcCI6IHsKICAgICAgICAiUEFUSCI6ICIvdXNyL2xvY2FsL3NiaW46L3Vzci9sb2NhbC9iaW46L3Vzci9zYmluOi91c3IvYmluOi9zYmluOi9iaW4iCiAgICAgIH0KICAgIH0sCiAgICB7CiAgICAgICJPQ0kiOiB7CiAgICAgICAgIlZlcnNpb24iOiAiMS4xLjAtcmMuMSIsCiAgICAgICAgIlByb2Nlc3MiOiB7CiAgICAgICAgICAiVGVybWluYWwiOiBmYWxzZSwKICAgICAgICAgICJVc2VyIjogewogICAgICAgICAgICAiVUlEIjogMCwKICAgICAgICAgICAgIkdJRCI6IDAsCiAgICAgICAgICAgICJBZGRpdGlvbmFsR2lkcyI6IFtdLAogICAgICAgICAgICAiVXNlcm5hbWUiOiAiIgogICAgICAgICAgfSwKICAgICAgICAgICJEZXByZWNhdGVkQXJncyI6IFsKICAgICAgICAgICAgIi9iaW4vc2giLAogICAgICAgICAgICAiLWMiLAogICAgICAgICAgICAid2hpbGUgdHJ1ZTsgZG8gZWNobyBLdWJlcm5ldGVzOyBzbGVlcCAxMDsgZG9uZSIKICAgICAgICAgIF0sCiAgICAgICAgICAiQXJncyI6IFsKICAgICAgICAgICAgIi9iaW4vc2giLAogICAgICAgICAgICAiLWMiLAogICAgICAgICAgICAid2hpbGUgdHJ1ZTsgZG8gZWNobyAkKElTVElPX01FVEFfQ0xVU1RFUl9JRCk7IHNsZWVwIDEwOyBkb25lIgogICAgICAgICAgXSwKICAgICAgICAgICJFbnYiOiBbCiAgICAgICAgICAgICJQQVRIPS91c3IvbG9jYWwvc2JpbjovdXNyL2xvY2FsL2JpbjovdXNyL3NiaW46L3Vzci9iaW46L3NiaW46L2JpbiIsCiAgICAgICAgICAgICJIT1NUTkFNRT0kKGhvc3QtbmFtZSkiLAogICAgICAgICAgICAiUE9EX05BTUU9JChzYW5kYm94LW5hbWUpIiwKICAgICAgICAgICAgIlBPRF9OQU1FU1BBQ0U9JChzYW5kYm94LW5hbWVzcGFjZSkiLAogICAgICAgICAgICAiUE9EX0lQPSQocG9kLWlwKSIsCiAgICAgICAgICAgICJTRVJWSUNFX0FDQ09VTlQ9ZGVmYXVsdCIsCiAgICAgICAgICAgICJQUk9YWV9DT05GSUc9e31cbiIsCiAgICAgICAgICAgICJJU1RJT19NRVRBX1BPRF9QT1JUUz1bXG5dIiwKICAgICAgICAgICAgIklTVElPX01FVEFfQVBQX0NPTlRBSU5FUlM9c2VydmljZWFjbGllbnQiLAogICAgICAgICAgICAiSVNUSU9fTUVUQV9DTFVTVEVSX0lEPUt1YmVybmV0ZXMiLAogICAgICAgICAgICAiSVNUSU9fTUVUQV9OT0RFX05BTUU9JChub2RlLW5hbWUpIgogICAgICAgICAgXSwKICAgICAgICAgICJDd2QiOiAiLyIsCiAgICAgICAgICAiQ2FwYWJpbGl0aWVzIjogewogICAgICAgICAgICAiQW1iaWVudCI6IFtdLAogICAgICAgICAgICAiQm91bmRpbmciOiBbCiAgICAgICAgICAgICAgIiQocHJpdmlsZWdlZF9jYXBzKSIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgIkVmZmVjdGl2ZSI6IFsKICAgICAgICAgICAgICAiJChwcml2aWxlZ2VkX2NhcHMpIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiSW5oZXJpdGFibGUiOiBbXSwKICAgICAgICAgICAgIlBlcm1pdHRlZCI6IFsKICAgICAgICAgICAgICAiJChwcml2aWxlZ2VkX2NhcHMpIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgIk5vTmV3UHJpdmlsZWdlcyI6IGZhbHNlCiAgICAgICAgfSwKICAgICAgICAiUm9vdCI6IHsKICAgICAgICAgICJQYXRoIjogIiQoY3BhdGgpLyQoYnVuZGxlLWlkKSIsCiAgICAgICAgICAiUmVhZG9ubHkiOiBmYWxzZQogICAgICAgIH0sCiAgICAgICAgIk1vdW50cyI6IFsKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9wcm9jIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJwcm9jIiwKICAgICAgICAgICAgInR5cGVfIjogInByb2MiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2IiwKICAgICAgICAgICAgInNvdXJjZSI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJzdHJpY3RhdGltZSIsCiAgICAgICAgICAgICAgIm1vZGU9NzU1IiwKICAgICAgICAgICAgICAic2l6ZT02NTUzNmsiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L3B0cyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiZGV2cHRzIiwKICAgICAgICAgICAgInR5cGVfIjogImRldnB0cyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJuZXdpbnN0YW5jZSIsCiAgICAgICAgICAgICAgInB0bXhtb2RlPTA2NjYiLAogICAgICAgICAgICAgICJtb2RlPTA2MjAiLAogICAgICAgICAgICAgICJnaWQ9NSIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvc2htIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L3NobSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi9tcXVldWUiLAogICAgICAgICAgICAic291cmNlIjogIm1xdWV1ZSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJtcXVldWUiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvc3lzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJzeXNmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJzeXNmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIsCiAgICAgICAgICAgICAgInJ3IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL3N5cy9mcy9jZ3JvdXAiLAogICAgICAgICAgICAic291cmNlIjogImNncm91cCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJjZ3JvdXAiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiLAogICAgICAgICAgICAgICJyZWxhdGltZSIsCiAgICAgICAgICAgICAgInJ3IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2V0Yy9ob3N0cyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClob3N0cyQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicnciCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L3Rlcm1pbmF0aW9uLWxvZyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeCl0ZXJtaW5hdGlvbi1sb2ckIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJ3IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2V0Yy9ob3N0bmFtZSIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClob3N0bmFtZSQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicnciCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZXRjL3Jlc29sdi5jb25mIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KXJlc29sdi5jb25mJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJydyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi92YXIvcnVuL3NlY3JldHMva3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudCIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClzZXJ2aWNlYWNjb3VudCQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicm8iCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvdmFyL3J1bi9zZWNyZXRzL2F6dXJlL3Rva2VucyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeCl0b2tlbnMkIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9CiAgICAgICAgXSwKICAgICAgICAiQW5ub3RhdGlvbnMiOiB7CiAgICAgICAgICAiaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5idW5kbGVfcGF0aCI6ICIvcnVuL2NvbnRhaW5lcmQvaW8uY29udGFpbmVyZC5ydW50aW1lLnYyLnRhc2svazhzLmlvLyQoYnVuZGxlLWlkKSIsCiAgICAgICAgICAiaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5jb250YWluZXJfdHlwZSI6ICJwb2RfY29udGFpbmVyIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItbmFtZSI6ICJidXN5Ym94IiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSI6ICJjb250YWluZXIiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLmltYWdlLW5hbWUiOiAibWNyLm1pY3Jvc29mdC5jb20vYWtzL2UyZS9saWJyYXJ5LWJ1c3lib3g6bWFzdGVyLjIyMDMxNC4xLWxpbnV4LWFtZDY0IiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWlkIjogIl5bYS16MC05XXs2NH0kIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LW5hbWUiOiAiXmV4ZWNcXC10ZXN0JCIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1uYW1lc3BhY2UiOiAiIgogICAgICAgIH0sCiAgICAgICAgIkxpbnV4IjogewogICAgICAgICAgIk5hbWVzcGFjZXMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiVHlwZSI6ICJpcGMiLAogICAgICAgICAgICAgICJQYXRoIjogIiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJUeXBlIjogInV0cyIsCiAgICAgICAgICAgICAgIlBhdGgiOiAiIgogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgIlR5cGUiOiAibW91bnQiLAogICAgICAgICAgICAgICJQYXRoIjogIiIKICAgICAgICAgICAgfQogICAgICAgICAgXSwKICAgICAgICAgICJNYXNrZWRQYXRocyI6IFtdLAogICAgICAgICAgIlJlYWRvbmx5UGF0aHMiOiBbXSwKICAgICAgICAgICJEZXZpY2VzIjogW10sCiAgICAgICAgICAiU3lzY3RsIjogewogICAgICAgICAgICAibmV0LmlwdjQuaXBfdW5wcml2aWxlZ2VkX3BvcnRfc3RhcnQiOiAiMCIsCiAgICAgICAgICAgICJuZXQuaXB2NC5waW5nX2dyb3VwX3JhbmdlIjogIjAgMjE0NzQ4MzY0NyIKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0sCiAgICAgICJzdG9yYWdlcyI6IFsKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoMCkiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXIwKSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoMSkiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXIxKSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogIm92ZXJsYXlmcyIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAiZnVzZTMua2F0YS1vdmVybGF5IiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiMmMzNDJhMTM3ZTY5M2M3ODk4YWVjMzZkYTEwNDdmMTkxZGM3YzE2ODdlNjYxOThhZGFjYzQzOWNmNGFkZjM3OToyNTcwZTNhMTllMWJmMjBkZGRhNDU0OThhOTYyN2Y2MTU1NWQyZDZjMDE0NzliOWI3NjQ2MGI2NzliMjdkNTUyIiwKICAgICAgICAgICAgIjg1NjhjNzBjMGNjZmUwMDUxMDkyZTgxOGRhNzY5MTExYTU5ODgyY2QxOWRkNzk5ZDNiY2E1ZmZhODI3OTEwODA6YjY0M2I2MjE3NzQ4OTgzODMwYjI2YWMxNGEzNWEzMzIyZGQ1MjhjMDA5NjNlYWFkZDkxZWY1NWY1MTNkYzczZiIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChjcGF0aCkvJChidW5kbGUtaWQpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9CiAgICAgIF0sCiAgICAgICJkZXZpY2VzIjogW10sCiAgICAgICJzYW5kYm94X3BpZG5zIjogZmFsc2UsCiAgICAgICJleGVjX2NvbW1hbmRzIjogWwogICAgICAgIFsKICAgICAgICAgICJlY2hvIiwKICAgICAgICAgICIke0lTVElPX01FVEFfQVBQX0NPTlRBSU5FUlN9IgogICAgICAgIF0sCiAgICAgICAgWwogICAgICAgICAgImVjaG8iLAogICAgICAgICAgIlJlYWR5ICR7UE9EX0lQfSEiCiAgICAgICAgXSwKICAgICAgICBbCiAgICAgICAgICAiZWNobyIsCiAgICAgICAgICAiJHtJU1RJT19NRVRBX05PREVfTkFNRX0gc3RhcnR1cCIKICAgICAgICBdCiAgICAgIF0sCiAgICAgICJlbnZfbWFwIjogewogICAgICAgICJIT1NUTkFNRSI6ICIkKGhvc3QtbmFtZSkiLAogICAgICAgICJJU1RJT19NRVRBX0FQUF9DT05UQUlORVJTIjogInNlcnZpY2VhY2xpZW50IiwKICAgICAgICAiSVNUSU9fTUVUQV9DTFVTVEVSX0lEIjogIkt1YmVybmV0ZXMiLAogICAgICAgICJJU1RJT19NRVRBX05PREVfTkFNRSI6ICIkKG5vZGUtbmFtZSkiLAogICAgICAgICJJU1RJT19NRVRBX1BPRF9QT1JUUyI6ICJbXG5dIiwKICAgICAgICAiUEFUSCI6ICIvdXNyL2xvY2FsL3NiaW46L3Vzci9sb2NhbC9iaW46L3Vzci9zYmluOi91c3IvYmluOi9zYmluOi9iaW4iLAogICAgICAgICJQT0RfSVAiOiAiJChwb2QtaXApIiwKICAgICAgICAiUE9EX05BTUUiOiAiJChzYW5kYm94LW5hbWUpIiwKICAgICAgICAiUE9EX05BTUVTUEFDRSI6ICIkKHNhbmRib3gtbmFtZXNwYWNlKSIsCiAgICAgICAgIlBST1hZX0NPTkZJRyI6ICJ7fVxuIiwKICAgICAgICAiU0VSVklDRV9BQ0NPVU5UIjogImRlZmF1bHQiCiAgICAgIH0KICAgIH0KICBdLAogICJjb21tb24iOiB7CiAgICAiY3BhdGgiOiAiL3J1bi9rYXRhLWNvbnRhaW5lcnMvc2hhcmVkL2NvbnRhaW5lcnMiLAogICAgIm1vdW50X3NvdXJjZV9jcGF0aCI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zaGFyZWQvY29udGFpbmVycyIsCiAgICAic2ZwcmVmaXgiOiAiXiQoY3BhdGgpLyQoYnVuZGxlLWlkKS1bYS16MC05XXsxNn0tIiwKICAgICJzcGF0aCI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L3N0b3JhZ2UiLAogICAgImlwdjRfYSI6ICIoKFswLTldfFsxLTldWzAtOV18MVswLTldezJ9fDJbMC00XVswLTldfDI1WzAtNV0pXFwuKXszfShbMC05XXxbMS05XVswLTldfDFbMC05XXsyfXwyWzAtNF1bMC05XXwyNVswLTVdKSIsCiAgICAiaXBfcCI6ICJbMC05XXsxLDV9IiwKICAgICJzdmNfbmFtZSI6ICJbQS1aX1xcLlxcLV0rIiwKICAgICJkbnNfbGFiZWwiOiAiW2EtekEtWjAtOV9cXC5cXC1dKyIsCiAgICAic19zb3VyY2UxIjogIl4uLjJbMC05XXszfV9bMC0xXVswLTldX1swLTNdWzAtOV1fWzAtMl1bMC05XV9bMC01XVswLTldX1swLTVdWzAtOV1cXC5bMC05XXsxLDEwfSQiLAogICAgInNfc291cmNlMiI6ICJeLi5kYXRhLyIsCiAgICAiZG5zX3N1YmRvbWFpbiI6ICJeW2EtejAtOV0oWy1hLXowLTldKlthLXowLTldKT8kIiwKICAgICJwb2RfdWlkIjogIl5bMC05YS1mQS1GXXs4fS1bMC05YS1mQS1GXXs0fS1bMC05YS1mQS1GXXs0fS1bMC05YS1mQS1GXXs0fS1bMC05YS1mQS1GXXsxMn0kIiwKICAgICJkZWZhdWx0X2NhcHMiOiBbCiAgICAgICJDQVBfQ0hPV04iLAogICAgICAiQ0FQX0RBQ19PVkVSUklERSIsCiAgICAgICJDQVBfRlNFVElEIiwKICAgICAgIkNBUF9GT1dORVIiLAogICAgICAiQ0FQX01LTk9EIiwKICAgICAgIkNBUF9ORVRfUkFXIiwKICAgICAgIkNBUF9TRVRHSUQiLAogICAgICAiQ0FQX1NFVFVJRCIsCiAgICAgICJDQVBfU0VURkNBUCIsCiAgICAgICJDQVBfU0VUUENBUCIsCiAgICAgICJDQVBfTkVUX0JJTkRfU0VSVklDRSIsCiAgICAgICJDQVBfU1lTX0NIUk9PVCIsCiAgICAgICJDQVBfS0lMTCIsCiAgICAgICJDQVBfQVVESVRfV1JJVEUiCiAgICBdLAogICAgInByaXZpbGVnZWRfY2FwcyI6IFsKICAgICAgIkNBUF9DSE9XTiIsCiAgICAgICJDQVBfREFDX09WRVJSSURFIiwKICAgICAgIkNBUF9EQUNfUkVBRF9TRUFSQ0giLAogICAgICAiQ0FQX0ZPV05FUiIsCiAgICAgICJDQVBfRlNFVElEIiwKICAgICAgIkNBUF9LSUxMIiwKICAgICAgIkNBUF9TRVRHSUQiLAogICAgICAiQ0FQX1NFVFVJRCIsCiAgICAgICJDQVBfU0VUUENBUCIsCiAgICAgICJDQVBfTElOVVhfSU1NVVRBQkxFIiwKICAgICAgIkNBUF9ORVRfQklORF9TRVJWSUNFIiwKICAgICAgIkNBUF9ORVRfQlJPQURDQVNUIiwKICAgICAgIkNBUF9ORVRfQURNSU4iLAogICAgICAiQ0FQX05FVF9SQVciLAogICAgICAiQ0FQX0lQQ19MT0NLIiwKICAgICAgIkNBUF9JUENfT1dORVIiLAogICAgICAiQ0FQX1NZU19NT0RVTEUiLAogICAgICAiQ0FQX1NZU19SQVdJTyIsCiAgICAgICJDQVBfU1lTX0NIUk9PVCIsCiAgICAgICJDQVBfU1lTX1BUUkFDRSIsCiAgICAgICJDQVBfU1lTX1BBQ0NUIiwKICAgICAgIkNBUF9TWVNfQURNSU4iLAogICAgICAiQ0FQX1NZU19CT09UIiwKICAgICAgIkNBUF9TWVNfTklDRSIsCiAgICAgICJDQVBfU1lTX1JFU09VUkNFIiwKICAgICAgIkNBUF9TWVNfVElNRSIsCiAgICAgICJDQVBfU1lTX1RUWV9DT05GSUciLAogICAgICAiQ0FQX01LTk9EIiwKICAgICAgIkNBUF9MRUFTRSIsCiAgICAgICJDQVBfQVVESVRfV1JJVEUiLAogICAgICAiQ0FQX0FVRElUX0NPTlRST0wiLAogICAgICAiQ0FQX1NFVEZDQVAiLAogICAgICAiQ0FQX01BQ19PVkVSUklERSIsCiAgICAgICJDQVBfTUFDX0FETUlOIiwKICAgICAgIkNBUF9TWVNMT0ciLAogICAgICAiQ0FQX1dBS0VfQUxBUk0iLAogICAgICAiQ0FQX0JMT0NLX1NVU1BFTkQiLAogICAgICAiQ0FQX0FVRElUX1JFQUQiLAogICAgICAiQ0FQX1BFUkZNT04iLAogICAgICAiQ0FQX0JQRiIsCiAgICAgICJDQVBfQ0hFQ0tQT0lOVF9SRVNUT1JFIgogICAgXSwKICAgICJ2aXJ0aW9fYmxrX3N0b3JhZ2VfY2xhc3NlcyI6IFsKICAgICAgImNjLWxvY2FsLWNzaSIsCiAgICAgICJjYy1tYW5hZ2VkLWNzaSIsCiAgICAgICJjYy1tYW5hZ2VkLXByZW1pdW0tY3NpIgogICAgXSwKICAgICJzbWJfc3RvcmFnZV9jbGFzc2VzIjogWwogICAgICB7CiAgICAgICAgIm5hbWUiOiAiYXp1cmVmaWxlLWNzaS1rYXRhLWNjIiwKICAgICAgICAibW91bnRfb3B0aW9ucyI6IFsKICAgICAgICAgICJkaXJfbW9kZT0wNzc3IiwKICAgICAgICAgICJmaWxlX21vZGU9MDc3NyIsCiAgICAgICAgICAibWZzeW1saW5rcyIsCiAgICAgICAgICAiY2FjaGU9c3RyaWN0IiwKICAgICAgICAgICJub3NoYXJlc29jayIsCiAgICAgICAgICAiYWN0aW1lbz0zMCIsCiAgICAgICAgICAibm9icmwiCiAgICAgICAgXQogICAgICB9CiAgICBdCiAgfSwKICAic2FuZGJveCI6IHsKICAgICJzdG9yYWdlcyI6IFsKICAgICAgewogICAgICAgICJkcml2ZXIiOiAiZXBoZW1lcmFsIiwKICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAic291cmNlIjogInNobSIsCiAgICAgICAgImZzdHlwZSI6ICJ0bXBmcyIsCiAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgIm5vZGV2IiwKICAgICAgICAgICJtb2RlPTE3NzciLAogICAgICAgICAgInNpemU9NjcxMDg4NjQiCiAgICAgICAgXSwKICAgICAgICAibW91bnRfcG9pbnQiOiAiL3J1bi9rYXRhLWNvbnRhaW5lcnMvc2FuZGJveC9zaG0iLAogICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgfQogICAgXQogIH0sCiAgInJlcXVlc3RfZGVmYXVsdHMiOiB7CiAgICAiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdCI6IHsKICAgICAgImFsbG93X2Vudl9yZWdleCI6IFsKICAgICAgICAiXkhPU1ROQU1FPSQoZG5zX2xhYmVsKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfUE9SVF8kKGlwX3ApX1RDUD10Y3A6Ly8kKGlwdjRfYSk6JChpcF9wKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfUE9SVF8kKGlwX3ApX1RDUF9QUk9UTz10Y3AkIiwKICAgICAgICAiXiQoc3ZjX25hbWUpX1BPUlRfJChpcF9wKV9UQ1BfUE9SVD0kKGlwX3ApJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9QT1JUXyQoaXBfcClfVENQX0FERFI9JChpcHY0X2EpJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9TRVJWSUNFX0hPU1Q9JChpcHY0X2EpJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9TRVJWSUNFX1BPUlQ9JChpcF9wKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfU0VSVklDRV9QT1JUXyQoZG5zX2xhYmVsKT0kKGlwX3ApJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9QT1JUPXRjcDovLyQoaXB2NF9hKTokKGlwX3ApJCIsCiAgICAgICAgIl5BWlVSRV9DTElFTlRfSUQ9W0EtRmEtZjAtOS1dKiQiLAogICAgICAgICJeQVpVUkVfVEVOQU5UX0lEPVtBLUZhLWYwLTktXSokIiwKICAgICAgICAiXkFaVVJFX0ZFREVSQVRFRF9UT0tFTl9GSUxFPS92YXIvcnVuL3NlY3JldHMvYXp1cmUvdG9rZW5zL2F6dXJlLWlkZW50aXR5LXRva2VuJCIsCiAgICAgICAgIl5BWlVSRV9BVVRIT1JJVFlfSE9TVD1odHRwczovL2xvZ2luXFwubWljcm9zb2Z0b25saW5lXFwuY29tLyQiLAogICAgICAgICJeVEVSTT14dGVybSQiCiAgICAgIF0sCiAgICAgICJhbGxvd19lbnZfcmVnZXhfbWFwIjogewogICAgICAgICJDUFVfTElNSVQiOiAiXlswLTldKyQiLAogICAgICAgICJKT0JfQ09NUExFVElPTl9JTkRFWCI6ICJeWzAtOV0qJCIsCiAgICAgICAgIk1FTU9SWV9MSU1JVCI6ICJeWzAtOV0rJCIKICAgICAgfQogICAgfSwKICAgICJDb3B5RmlsZVJlcXVlc3QiOiBbCiAgICAgICIkKHNmcHJlZml4KSIKICAgIF0sCiAgICAiRXhlY1Byb2Nlc3NSZXF1ZXN0IjogewogICAgICAiYWxsb3dlZF9jb21tYW5kcyI6IFtdLAogICAgICAicmVnZXgiOiBbXQogICAgfSwKICAgICJVcGRhdGVSb3V0ZXNSZXF1ZXN0IjogewogICAgICAiZm9yYmlkZGVuX2RldmljZV9uYW1lcyI6IFsKICAgICAgICAibG8iCiAgICAgIF0sCiAgICAgICJmb3JiaWRkZW5fc291cmNlX3JlZ2V4IjogWwogICAgICAgICJeKD86MHswLDR9Oil7MCw3fTB7MCwzfTEkIiwKICAgICAgICAiXjEyN1xcLig/OlswLTldezEsM31cXC4pezJ9WzAtOV17MSwzfSQiCiAgICAgIF0KICAgIH0sCiAgICAiVXBkYXRlSW50ZXJmYWNlUmVxdWVzdCI6IHsKICAgICAgImFsbG93X3Jhd19mbGFncyI6IDEyOCwKICAgICAgImZvcmJpZGRlbl9uYW1lcyI6IFsKICAgICAgICAibG8iCiAgICAgIF0sCiAgICAgICJmb3JiaWRkZW5faHdfYWRkcnMiOiBbCiAgICAgICAgIjAwOjAwOjAwOjAwOjAwOjAwIgogICAgICBdCiAgICB9LAogICAgIkNsb3NlU3RkaW5SZXF1ZXN0IjogZmFsc2UsCiAgICAiUmVhZFN0cmVhbVJlcXVlc3QiOiBmYWxzZSwKICAgICJVcGRhdGVFcGhlbWVyYWxNb3VudHNSZXF1ZXN0IjogZmFsc2UsCiAgICAiV3JpdGVTdHJlYW1SZXF1ZXN0IjogZmFsc2UKICB9Cn0= +spec: + restartPolicy: Never + runtimeClassName: kata-cc + containers: + - name: busybox + image: "mcr.microsoft.com/aks/e2e/library-busybox:master.220314.1-linux-amd64" + env: + - name: POD_NAME + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: metadata.name + - name: POD_NAMESPACE + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: metadata.namespace + - name: POD_IP + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: status.podIP + - name: SERVICE_ACCOUNT + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: spec.serviceAccountName + - name: PROXY_CONFIG + value: "{}\n" + - name: ISTIO_META_POD_PORTS + value: "[\n]" + - name: ISTIO_META_APP_CONTAINERS + value: serviceaclient + - name: ISTIO_META_CLUSTER_ID + value: Kubernetes + - name: ISTIO_META_NODE_NAME + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: spec.nodeName + securityContext: + privileged: true + command: + - /bin/sh + args: + - "-c" + - while true; do echo $(ISTIO_META_CLUSTER_ID); sleep 10; done + livenessProbe: + exec: + command: + - echo + - "${ISTIO_META_APP_CONTAINERS}" + failureThreshold: 1 + periodSeconds: 5 + timeoutSeconds: 10 + readinessProbe: + exec: + command: + - echo + - "Ready ${POD_IP}!" + failureThreshold: 1 + periodSeconds: 5 + timeoutSeconds: 10 + startupProbe: + exec: + command: + - echo + - "${ISTIO_META_NODE_NAME} startup" + failureThreshold: 1 + periodSeconds: 5 + timeoutSeconds: 10 diff --git a/src/agent/samples/policy/yaml/pod/pod-lifecycle.yaml b/src/agent/samples/policy/yaml/pod/pod-lifecycle.yaml new file mode 100644 index 000000000000..6c94318b221a --- /dev/null +++ b/src/agent/samples/policy/yaml/pod/pod-lifecycle.yaml @@ -0,0 +1,63 @@ +--- +apiVersion: v1 +kind: Pod +metadata: + name: pod-lifecycle + labels: + run: busybox + annotations: + io.katacontainers.config.agent.policy: IyBDb3B5cmlnaHQgKGMpIDIwMjMgTWljcm9zb2Z0IENvcnBvcmF0aW9uCiMKIyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMAojCnBhY2thZ2UgYWdlbnRfcG9saWN5CgppbXBvcnQgZnV0dXJlLmtleXdvcmRzLmluCmltcG9ydCBmdXR1cmUua2V5d29yZHMuZXZlcnkKCiMgRGVmYXVsdCB2YWx1ZXMsIHJldHVybmVkIGJ5IE9QQSB3aGVuIHJ1bGVzIGNhbm5vdCBiZSBldmFsdWF0ZWQgdG8gdHJ1ZS4KZGVmYXVsdCBBZGRBUlBOZWlnaGJvcnNSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgQWRkU3dhcFJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBDbG9zZVN0ZGluUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IENvcHlGaWxlUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IENyZWF0ZUNvbnRhaW5lclJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBDcmVhdGVTYW5kYm94UmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IERlc3Ryb3lTYW5kYm94UmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgRXhlY1Byb2Nlc3NSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgR2V0T09NRXZlbnRSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBHdWVzdERldGFpbHNSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBMaXN0SW50ZXJmYWNlc1JlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBMaXN0Um91dGVzUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IE1lbUhvdHBsdWdCeVByb2JlUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IE9ubGluZUNQVU1lbVJlcXVlc3QgOj0gdHJ1ZQpkZWZhdWx0IFBhdXNlQ29udGFpbmVyUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFJlYWRTdHJlYW1SZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgUmVtb3ZlQ29udGFpbmVyUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgUmVtb3ZlU3RhbGVWaXJ0aW9mc1NoYXJlTW91bnRzUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgUmVzZWVkUmFuZG9tRGV2UmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFJlc3VtZUNvbnRhaW5lclJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBTZXRHdWVzdERhdGVUaW1lUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFNldFBvbGljeVJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBTaWduYWxQcm9jZXNzUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgU3RhcnRDb250YWluZXJSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBTdGFydFRyYWNpbmdSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgU3RhdHNDb250YWluZXJSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBTdG9wVHJhY2luZ1JlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBUdHlXaW5SZXNpemVSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBVcGRhdGVDb250YWluZXJSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgVXBkYXRlRXBoZW1lcmFsTW91bnRzUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFVwZGF0ZUludGVyZmFjZVJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBVcGRhdGVSb3V0ZXNSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgV2FpdFByb2Nlc3NSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBXcml0ZVN0cmVhbVJlcXVlc3QgOj0gZmFsc2UKCiMgQWxsb3dSZXF1ZXN0c0ZhaWxpbmdQb2xpY3kgOj0gdHJ1ZSBjb25maWd1cmVzIHRoZSBBZ2VudCB0byAqYWxsb3cgYW55CiMgcmVxdWVzdHMgY2F1c2luZyBhIHBvbGljeSBmYWlsdXJlKi4gVGhpcyBpcyBhbiB1bnNlY3VyZSBjb25maWd1cmF0aW9uCiMgYnV0IGlzIHVzZWZ1bCBmb3IgYWxsb3dpbmcgdW5zZWN1cmUgcG9kcyB0byBzdGFydCwgdGhlbiBjb25uZWN0IHRvCiMgdGhlbSBhbmQgaW5zcGVjdCBPUEEgbG9ncyBmb3IgdGhlIHJvb3QgY2F1c2Ugb2YgYSBmYWlsdXJlLgpkZWZhdWx0IEFsbG93UmVxdWVzdHNGYWlsaW5nUG9saWN5IDo9IGZhbHNlCgojIENvbnN0YW50cwpTX05BTUVfS0VZID0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZSIKU19OQU1FU1BBQ0VfS0VZID0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZXNwYWNlIgpCVU5ETEVfSUQgPSAiW2EtejAtOV17NjR9IgoKQ3JlYXRlQ29udGFpbmVyUmVxdWVzdDo9IHJlc3AgewogICAgbm90IGlzX251bGwoaW5wdXQuZW52X21hcCkKICAgIAogICAgaV9lbnZfbWFwIDo9IGlucHV0LmVudl9tYXAKICAgIAogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBwX2Vudl9tYXAgOj0gcF9jb250YWluZXIuZW52X21hcCAgCiAgICBhbGxvd19lbnZfbWFwKHBfZW52X21hcCwgaV9lbnZfbWFwKQogICAgCiAgICBpX3Byb2Nlc3MgOj0gaW5wdXQuYmFzZS5PQ0kuUHJvY2VzcwogICAgCiAgICBwX3Byb2Nlc3MgOj0gcF9jb250YWluZXIuT0NJLlByb2Nlc3MKICAgIAogICAgYWxsb3dfYXJncyhpX3Byb2Nlc3MsIHBfcHJvY2VzcywgaV9lbnZfbWFwKQoKICAgIHJlc3AgPSBDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uKGlucHV0LmJhc2UpCiAgICBwcmludCgiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdDogdHJ1ZSIpCn0KCmFsbG93X2FyZ3MoaV9wcm9jZXNzLCBwX3Byb2Nlc3MsIGlfZW52X21hcCkgewogICAgaV9hcmdzIDo9IGlfcHJvY2Vzcy5BcmdzCiAgICBwX2FyZ3MgOj0gcF9wcm9jZXNzLkFyZ3MKICAgIHByaW50KCJhbGxvd19hcmdzOiBpX2FyZ3MgPSIsIGlfYXJncywgInBfYXJncyA9IiwgcF9hcmdzKQogICAgY291bnQoaV9hcmdzKSA9PSBjb3VudChwX2FyZ3MpCiAgICBldmVyeSBpLCBpX2FyZyBpbiBpX2FyZ3MgewogICAgICAgIHByaW50KCJhbGxvd19hcmdzOiBpX2FyZyA9IiwgaV9hcmcpCiAgICAgICAgcF9hcmdfcmVwbGFjZWQgOj0gcmVwbGFjZV9lbnZfdmFyaWFibGVzKHBfYXJnc1tpXSwgaV9lbnZfbWFwKQogICAgICAgIHByaW50KCJhbGxvd19hcmdzOiBwX2FyZ19yZXBsYWNlZCA9IiwgcF9hcmdfcmVwbGFjZWQpCiAgICAgICAgcF9hcmdfcmVwbGFjZWQyIDo9IHJlcGxhY2UocF9hcmdfcmVwbGFjZWQsICIkJCIsICIkIikKICAgICAgICBwcmludCgiYWxsb3dfYXJnczogcF9hcmdfcmVwbGFjZWQyID0iLCBwX2FyZ19yZXBsYWNlZDIpCiAgICAgICAgaV9hcmcgPT0gcF9hcmdfcmVwbGFjZWQyCiAgICB9CiAgICBwcmludCgiYWxsb3dfYXJnczogdHJ1ZSIpCn0KCmFsbG93X2FyZ3MoaV9wcm9jZXNzLCBwX3Byb2Nlc3MsIGlfZW52X21hcCkgewogICAgbm90IGlfcHJvY2Vzcy5BcmdzCiAgICBub3QgcF9wcm9jZXNzLkFyZ3MKICAgIHByaW50KCJhbGxvd19hcmdzMjogbm8gYXJncyIpCn0KCiMgdGhpcyBmdW5jdGlvbiByZXBsYWNlcyBhbGwgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyBpbiBhIHN0cmluZywgZ2l2ZW4gYSBtYXAgb2YgZW52aXJvbm1lbnQga2V5cyB0byBlbnZpcm9ubWVudCB2YWx1ZXMKIyBlZyBzdHIgPSAiZWNobyAkKENMVVNURVJfSUQpOyBlY2hvICQoTk9ERV9OQU1FKTsiCiMgZW52X21hcCA9IHsiQ0xVU1RFUl9JRCI6ICJhYmMiLCAiTk9ERV9OQU1FIiA6ICJ4eXoifQojIHJlc3VsdCA9ICJlY2hvIGFiYzsgZWNobyB4eXo7IgpyZXBsYWNlX2Vudl92YXJpYWJsZXMoc3RyLCBlbnZfbWFwKSA9IHJlc3VsdCB7CiAgICAjIG1ha2UgYW4gYXJyYXkgb2YgdGhlIGtleXMgZWcgWyJDTFVTVEVSX0lEIiwgIk5PREVfTkFNRSJdCiAgICBrZXlzIDo9IFt4IHwgc29tZSB4IGluIG9iamVjdC5rZXlzKGVudl9tYXApXQogICAgcmVzdWx0IDo9IHJlcGxhY2Vfc3RyX3JlYyhzdHIsIGVudl9tYXAsIGtleXMsIGNvdW50KGtleXMpIC0gMSkKfQoKIyBiYXNlIGNhc2UKcmVwbGFjZV9zdHJfcmVjKHN0ciwgZW52X21hcCwgYXJyX2tleXMsIGkpID0gcmVzdWx0IHsKICAgIGkgPCAwCiAgICByZXN1bHQgOj0gc3RyCn0KCiMgcmVjdXJzaXZlIHN0ZXAKcmVwbGFjZV9zdHJfcmVjKHN0ciwgZW52X21hcCwgYXJyX2tleXMsIGkpID0gcmVzdWx0IHsKICAgIGkgPj0gMAogICAga2V5IDo9IGFycl9rZXlzW2ldCiAgICBlbnZfa2V5MSA6PSBjb25jYXQoIiIsIFsiJCgiLCBrZXksICIpIl0pCiAgICAjIHJlcGxhY2UgJChWQVIpIHdpdGggdmFsdWUKICAgIG5ld19zdHIxIDo9IHJlcGxhY2Uoc3RyLCBlbnZfa2V5MSwgZW52X21hcFtrZXldKQogICAgIyByZXBsYWNlIG5leHQgZW52aXJvbm1lbnQgdmFyaWFibGUKICAgIHJlc3VsdCA9IHJlcGxhY2Vfc3RyX3JlYyhuZXdfc3RyMSwgZW52X21hcCwgYXJyX2tleXMsIGkgLSAxKQp9CgphbGxvd19lbnZfbWFwKHBfZW52X21hcCwgaV9lbnZfbWFwKSB7CiAgICBwcmludCgiYWxsb3dfZW52X21hcDogcF9lbnZfbWFwID0iLCBwX2Vudl9tYXApCiAgICBldmVyeSBlbnZfa2V5LCBlbnZfdmFsIGluIGlfZW52X21hcCB7CiAgICAgICAgcHJpbnQoImFsbG93X2VudjogZW52X2tleSA9IiwgZW52X2tleSwgImVudl92YWwgPSIsIGVudl92YWwpCiAgICAgICAgYWxsb3dfZW52X21hcF9lbnRyeShlbnZfa2V5LCBlbnZfdmFsLCBwX2Vudl9tYXApCiAgICB9CiAgICBwcmludCgiYWxsb3dfZW52X21hcDogdHJ1ZSIpCn0KCiMgQWxsb3cgZXhhY3QgbWF0Y2gKYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBpX3ZhbCA9PSBwX3ZhbAogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnk6IHRydWUiKQp9CgojIEFsbG93IHJlc291cmNlRmllbGRSZWYgdmFsdWVzIChlLmcuLCAibGltaXRzLmNwdSIpLgphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgICMgYSB2YXJpYWJsZSB3ZSBzaG91bGQgYmUgdmFsaWRhdGluZyB1c2luZyBhIHJlZ2V4IGZyb20gc2V0dGluZ3MKICAgIHBfdmFsID09ICIkKHZhbGlkYXRlLWZyb20tc2V0dGluZ3MpIgogICAgcmVnZXhfdmFsIDo9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuQ3JlYXRlQ29udGFpbmVyUmVxdWVzdC5hbGxvd19lbnZfcmVnZXhfbWFwW2tleV0KICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4X3ZhbCwgaV92YWwpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSAyOiB0cnVlIikKfQoKIyBBbGxvdyBub2RlLW5hbWUKYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChub2RlLW5hbWUpIgogICAgcmVnZXgubWF0Y2gocG9saWN5X2RhdGEuY29tbW9uLmRuc19zdWJkb21haW4gLCBpX3ZhbCkKICAgIHByaW50KCJhbGxvd19lbnZfbWFwX2VudHJ5IDM6IHRydWUiKQp9CgojIEFsbG93IGhvc3QtbmFtZQphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgIHBfdmFsID09ICIkKGhvc3QtbmFtZSkiCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24uZG5zX2xhYmVsICwgaV92YWwpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSA0OiB0cnVlIikKfQoKIyBBbGxvdyBwb2QtdWlkCmFsbG93X2Vudl9tYXBfZW50cnkoa2V5LCBpX3ZhbCwgcF9lbnZfbWFwKSB7CiAgICBwX3ZhbCA6PSBwX2Vudl9tYXBba2V5XQogICAgcF92YWwgPT0gIiQocG9kLXVpZCkiCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24ucG9kX3VpZCAsIGlfdmFsKQogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgNTogdHJ1ZSIpCn0KCiMgQWxsb3cgZmllbGRSZWYgImZpZWxkUGF0aDogc3RhdHVzLnBvZElQIiB2YWx1ZXMuCmFsbG93X2Vudl9tYXBfZW50cnkoa2V5LCBpX3ZhbCwgcF9lbnZfbWFwKSB7CiAgICBpc19pcChpX3ZhbCkKCiAgICBwX3ZhbCA6PSBwX2Vudl9tYXBba2V5XQogICAgcF92YXIgOj0gY29uY2F0KCI9IiwgW2tleSwgcF92YWxdKQogICAgYWxsb3dfcG9kX2lwX3ZhcihrZXksIHBfdmFyKQogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgNjogdHJ1ZSIpCn0KCiMgQWxsb3cgZmllbGRSZWYgImZpZWxkUGF0aDogc3RhdHVzLmhvc3RJUCIgdmFsdWVzLgphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgaXNfaXAoaV92YWwpCgogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgIHBfdmFyIDo9IGNvbmNhdCgiPSIsIFtrZXksIHBfdmFsXSkKICAgIGFsbG93X2hvc3RfaXBfdmFyKGtleSwgcF92YXIpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSA3OiB0cnVlIikKfQoKIyBNYXRjaCBpbnB1dCB3aXRoIG9uZSBvZiB0aGUgcG9saWN5IHZhcmlhYmxlcywgYWZ0ZXIgc3Vic3RpdHV0aW5nICQoc2FuZGJveC1uYW1lKS4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChzYW5kYm94LW5hbWUpIgogICAgc19uYW1lIDo9IGlucHV0LmJhc2UuT0NJLkFubm90YXRpb25zW1NfTkFNRV9LRVldCiAgICBwX3ZhcjIgOj0gcmVwbGFjZShwX3ZhbCwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHBfdmFyMiA9PSBpX3ZhbAogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgODogdHJ1ZSIpCn0KCiMgTWF0Y2ggaW5wdXQgd2l0aCBvbmUgb2YgdGhlIHBvbGljeSB2YXJpYWJsZXMsIGFmdGVyIHN1YnN0aXR1dGluZyAkKHNhbmRib3gtbmFtZXNwYWNlKS4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChzYW5kYm94LW5hbWVzcGFjZSkiCiAgICBzX25hbWVzcGFjZSA6PSBpbnB1dC5iYXNlLk9DSS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwX3ZhcjIgOj0gcmVwbGFjZShwX3ZhbCwgIiQoc2FuZGJveC1uYW1lc3BhY2UpIiwgc19uYW1lc3BhY2UpCiAgICBwX3ZhcjIgPT0gaV92YWwKICAgIHByaW50KCJhbGxvd19lbnZfbWFwX2VudHJ5IDk6IHRydWUiKQp9CgojIEFsbG93IGlucHV0IGVudiB2YXJpYWJsZXMgdGhhdCBtYXRjaCB3aXRoIGEgcmVxdWVzdF9kZWZhdWx0cyByZWdleC4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHNvbWUgcF9yZWdleDEgaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5DcmVhdGVDb250YWluZXJSZXF1ZXN0LmFsbG93X2Vudl9yZWdleAogICAgcF9yZWdleDIgOj0gcmVwbGFjZShwX3JlZ2V4MSwgIiQoaXB2NF9hKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcHY0X2EpCiAgICBwX3JlZ2V4MyA6PSByZXBsYWNlKHBfcmVnZXgyLCAiJChpcF9wKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcF9wKQogICAgcF9yZWdleDQgOj0gcmVwbGFjZShwX3JlZ2V4MywgIiQoc3ZjX25hbWUpIiwgcG9saWN5X2RhdGEuY29tbW9uLnN2Y19uYW1lKQogICAgcF9yZWdleDUgOj0gcmVwbGFjZShwX3JlZ2V4NCwgIiQoZG5zX2xhYmVsKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5kbnNfbGFiZWwpCgogICAgcmVzdWx0IDo9IGNvbmNhdCgiPSIsIFtrZXksIGlfdmFsXSkKICAgIHJlZ2V4Lm1hdGNoKHBfcmVnZXg1LCByZXN1bHQpCgogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgMTA6IHRydWUiKQp9CgpDcmVhdGVDb250YWluZXJSZXF1ZXN0Oj0gcmVzcCB7CiAgICBub3QgaW5wdXQuZW52X21hcAogICAgaV9wcm9jZXNzID0gaW5wdXQuT0NJLlByb2Nlc3MKICAgIHNfbmFtZSA9IGlucHV0Lk9DSS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBwX3Byb2Nlc3MgPSBwX2NvbnRhaW5lci5PQ0kuUHJvY2VzcwogICAgYWxsb3dfZGVwcmVjYXRlZF9hcmdzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUpCiAgICByZXNwID0gQ3JlYXRlQ29udGFpbmVyUmVxdWVzdENvbW1vbihpbnB1dCkKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0MjogdHJ1ZSIpCn0KCkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb24ocmVxKTo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgICMgQ2hlY2sgaWYgdGhlIGlucHV0IHJlcXVlc3Qgc2hvdWxkIGJlIHJlamVjdGVkIGV2ZW4gYmVmb3JlIGNoZWNraW5nIHRoZQogICAgIyBwb2xpY3lfZGF0YS5jb250YWluZXJzIGluZm9ybWF0aW9uLgogICAgYWxsb3dfY3JlYXRlX2NvbnRhaW5lcl9pbnB1dChyZXEpCgogICAgaV9vY2kgOj0gcmVxLk9DSQogICAgaV9zdG9yYWdlcyA6PSByZXEuc3RvcmFnZXMKICAgIGlfZGV2aWNlcyA6PSByZXEuZGV2aWNlcwoKICAgICMgYXJyYXkgb2YgcG9zc2libGUgc3RhdGUgb3BlcmF0aW9ucwogICAgb3BzX2J1aWxkZXIgOj0gW10KCiAgICAjIGNoZWNrIHNhbmRib3ggbmFtZQogICAgc2FuZGJveF9uYW1lID0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FX0tFWV0KICAgIGFkZF9zYW5kYm94X25hbWVfdG9fc3RhdGUgOj0gc3RhdGVfYWxsb3dzKCJzYW5kYm94X25hbWUiLCBzYW5kYm94X25hbWUpCiAgICBvcHNfYnVpbGRlcjEgOj0gY29uY2F0X29wX2lmX25vdF9udWxsKG9wc19idWlsZGVyLCBhZGRfc2FuZGJveF9uYW1lX3RvX3N0YXRlKQoKICAgICMgQ2hlY2sgaWYgYW55IGVsZW1lbnQgZnJvbSB0aGUgcG9saWN5X2RhdGEuY29udGFpbmVycyBhcnJheSBhbGxvd3MgdGhlIGlucHV0IHJlcXVlc3QuCiAgICBzb21lIHBfY29udGFpbmVyIGluIHBvbGljeV9kYXRhLmNvbnRhaW5lcnMKICAgIHByaW50KCI9PT09PT09PSBDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiB0cnlpbmcgbmV4dCBwb2xpY3kgY29udGFpbmVyIikKCiAgICBwX3BpZG5zIDo9IHBfY29udGFpbmVyLnNhbmRib3hfcGlkbnMKICAgIGlfcGlkbnMgOj0gcmVxLnNhbmRib3hfcGlkbnMKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiBwX3BpZG5zID0iLCBwX3BpZG5zLCAiaV9waWRucyA9IiwgaV9waWRucykKICAgIHBfcGlkbnMgPT0gaV9waWRucwoKICAgIHBfb2NpIDo9IHBfY29udGFpbmVyLk9DSQoKICAgICMgY2hlY2sgbmFtZXNwYWNlCiAgICBwX25hbWVzcGFjZSA6PSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBpX25hbWVzcGFjZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwcmludCAoIkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb246IHBfbmFtZXNwYWNlID0iLCBwX25hbWVzcGFjZSwgImlfbmFtZXNwYWNlID0iLCBpX25hbWVzcGFjZSkKICAgIGFkZF9uYW1lc3BhY2VfdG9fc3RhdGUgOj0gYWxsb3dfbmFtZXNwYWNlKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkKICAgIG9wc19idWlsZGVyMiA6PSBjb25jYXRfb3BfaWZfbm90X251bGwob3BzX2J1aWxkZXIxLCBhZGRfbmFtZXNwYWNlX3RvX3N0YXRlKQoKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiBwIFZlcnNpb24gPSIsIHBfb2NpLlZlcnNpb24sICJpIFZlcnNpb24gPSIsIGlfb2NpLlZlcnNpb24pCiAgICBwX29jaS5WZXJzaW9uID09IGlfb2NpLlZlcnNpb24KCiAgICBwcmludCgiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdENvbW1vbjogcCBSZWFkb25seSA9IiwgcF9vY2kuUm9vdC5SZWFkb25seSwgImkgUmVhZG9ubHkgPSIsIGlfb2NpLlJvb3QuUmVhZG9ubHkpCiAgICBwX29jaS5Sb290LlJlYWRvbmx5ID09IGlfb2NpLlJvb3QuUmVhZG9ubHkKCiAgICBhbGxvd19hbm5vKHBfb2NpLCBpX29jaSkKCiAgICBwX3N0b3JhZ2VzIDo9IHBfY29udGFpbmVyLnN0b3JhZ2VzCiAgICBhbGxvd19ieV9hbm5vKHBfb2NpLCBpX29jaSwgcF9zdG9yYWdlcywgaV9zdG9yYWdlcykKCiAgICBwX2RldmljZXMgOj0gcF9jb250YWluZXIuZGV2aWNlcwogICAgYWxsb3dfZGV2aWNlcyhwX2RldmljZXMsIGlfZGV2aWNlcykKCiAgICByZXQgOj0gYWxsb3dfbGludXgob3BzX2J1aWxkZXIyLCBwX29jaSwgaV9vY2kpCiAgICByZXQuYWxsb3dlZAoKICAgIG9wcyA6PSByZXQub3BzCgogICAgcHJpbnQoIkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb246IHRydWUiKQp9CgphbGxvd19jcmVhdGVfY29udGFpbmVyX2lucHV0KHJlcSkgewogICAgcHJpbnQoImFsbG93X2NyZWF0ZV9jb250YWluZXJfaW5wdXQ6IGlucHV0ID0iLCByZXEpCgogICAgY291bnQocmVxLnNoYXJlZF9tb3VudHMpID09IDAKICAgIGlzX251bGwocmVxLnN0cmluZ191c2VyKQoKICAgIGlfb2NpIDo9IHJlcS5PQ0kKICAgIGlzX251bGwoaV9vY2kuSG9va3MpCiAgICBpc19udWxsKGlfb2NpLlNvbGFyaXMpCiAgICBpc19udWxsKGlfb2NpLldpbmRvd3MpCgogICAgaV9saW51eCA6PSBpX29jaS5MaW51eAogICAgY291bnQoaV9saW51eC5HSURNYXBwaW5ncykgPT0gMAogICAgY291bnQoaV9saW51eC5Nb3VudExhYmVsKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlJlc291cmNlcy5EZXZpY2VzKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlJvb3Rmc1Byb3BhZ2F0aW9uKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlVJRE1hcHBpbmdzKSA9PSAwCiAgICBpc19udWxsKGlfbGludXguSW50ZWxSZHQpCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLkJsb2NrSU8pCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLk5ldHdvcmspCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLlBpZHMpCiAgICBpc19udWxsKGlfbGludXguU2VjY29tcCkKCiAgICBpX3Byb2Nlc3MgOj0gaV9vY2kuUHJvY2VzcwogICAgY291bnQoaV9wcm9jZXNzLlNlbGludXhMYWJlbCkgPT0gMAogICAgY291bnQoaV9wcm9jZXNzLlVzZXIuVXNlcm5hbWUpID09IDAKCiAgICBwcmludCgiYWxsb3dfY3JlYXRlX2NvbnRhaW5lcl9pbnB1dDogdHJ1ZSIpCn0KCmFsbG93X25hbWVzcGFjZShwX25hbWVzcGFjZSwgaV9uYW1lc3BhY2UpID0gYWRkX25hbWVzcGFjZSB7CiAgICBwX25hbWVzcGFjZSA9PSBpX25hbWVzcGFjZQogICAgYWRkX25hbWVzcGFjZSA6PSBudWxsCiAgICBwcmludCgiYWxsb3dfbmFtZXNwYWNlIDE6IGlucHV0IG5hbWVzcGFjZSBtYXRjaGVzIHBvbGljeSBkYXRhIikKfQoKYWxsb3dfbmFtZXNwYWNlKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkgPSBhZGRfbmFtZXNwYWNlIHsKICAgIHBfbmFtZXNwYWNlID09ICIiCiAgICBwcmludCgiYWxsb3dfbmFtZXNwYWNlIDI6IG5vIG5hbWVzcGFjZSBmb3VuZCBvbiBwb2xpY3kgZGF0YSIpCiAgICBhZGRfbmFtZXNwYWNlIDo9IHN0YXRlX2FsbG93cygibmFtZXNwYWNlIiwgaV9uYW1lc3BhY2UpCn0KCiMgdmFsdWUgaGFzbid0IGJlZW4gc2VlbiBiZWZvcmUsIHNhdmUgaXQgdG8gc3RhdGUKc3RhdGVfYWxsb3dzKGtleSwgdmFsdWUpID0gYWN0aW9uIHsKICBzdGF0ZSA6PSBnZXRfc3RhdGUoKQogIHByaW50KCJzdGF0ZV9hbGxvd3MgMTogc3RhdGVba2V5XSA9Iiwgc3RhdGVba2V5XSwgInZhbHVlID0iLCB2YWx1ZSkKICBub3Qgc3RhdGVba2V5XQogIHByaW50KCJzdGF0ZV9hbGxvd3MgMTogc2F2aW5nIHRvIHN0YXRlIGtleSA9Iiwga2V5LCAidmFsdWUgPSIsIHZhbHVlKQogIHBhdGggOj0gZ2V0X3N0YXRlX3BhdGgoa2V5KSAKICBhY3Rpb24gOj0gewogICAgIm9wIjogImFkZCIsCiAgICAicGF0aCI6IHBhdGgsIAogICAgInZhbHVlIjogdmFsdWUsCiAgfQp9CgojIHZhbHVlIG1hdGNoZXMgd2hhdCdzIGluIHN0YXRlLCBhbGxvdyBpdApzdGF0ZV9hbGxvd3Moa2V5LCB2YWx1ZSkgPSBhY3Rpb24gewogIHByaW50KCJzdGF0ZV9hbGxvd3MgMjogc3RhcnQiKQogIHN0YXRlIDo9IGdldF9zdGF0ZSgpCiAgcHJpbnQoInN0YXRlX2FsbG93cyAyOiBzdGF0ZVtrZXldID0iLCBzdGF0ZVtrZXldLCAidmFsdWUgPSIsIHZhbHVlKQogIHZhbHVlID09IHN0YXRlW2tleV0KICBwcmludCgic3RhdGVfYWxsb3dzIDI6IGZvdW5kIGtleSA9Iiwga2V5LCAidmFsdWUgPSIsIHZhbHVlLCAiIGluIHN0YXRlIikKICBhY3Rpb24gOj0gbnVsbAp9CgojIGhlbHBlciBmdW5jdGlvbnMgdG8gaW50ZXJhY3Qgd2l0aCB0aGUgc3RhdGUKZ2V0X3N0YXRlKCkgPSBzdGF0ZSB7CiAgc3RhdGUgOj0gZGF0YVsicHN0YXRlIl0KfQoKZ2V0X3N0YXRlX3ZhbChrZXkpID0gdmFsdWUgewogICAgc3RhdGUgOj0gZ2V0X3N0YXRlKCkKICAgIHZhbHVlIDo9IHN0YXRlW2tleV0KfQoKZ2V0X3N0YXRlX3BhdGgoa2V5KSA9IHBhdGggewogICAgIyBwcmVwZW5kICIvcHN0YXRlLyIgdG8ga2V5CiAgICBwYXRoIDo9IGNvbmNhdCgiLyIsIFsiL3BzdGF0ZSIsIGtleV0pCn0KCiMgSGVscGVyIGZ1bmN0aW9ucyB0byBjb25kaXRpb25hbGx5IGNvbmNhdGVuYXRlIG9wIGlzIG5vdCBudWxsCmNvbmNhdF9vcF9pZl9ub3RfbnVsbChvcHMsIG9wKSA9IHJlc3VsdCB7CiAgICBvcCA9PSBudWxsCiAgICByZXN1bHQgOj0gb3BzCn0KCmNvbmNhdF9vcF9pZl9ub3RfbnVsbChvcHMsIG9wKSA9IHJlc3VsdCB7CiAgICBvcCAhPSBudWxsCiAgICByZXN1bHQgOj0gYXJyYXkuY29uY2F0KG9wcywgW29wXSkKfQoKIyBSZWplY3QgdW5leHBlY3RlZCBhbm5vdGF0aW9ucy4KYWxsb3dfYW5ubyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19hbm5vIDE6IHN0YXJ0IikKCiAgICBub3QgaV9vY2kuQW5ub3RhdGlvbnMKCiAgICBwcmludCgiYWxsb3dfYW5ubyAxOiB0cnVlIikKfQphbGxvd19hbm5vKHBfb2NpLCBpX29jaSkgewogICAgcHJpbnQoImFsbG93X2Fubm8gMjogcCBBbm5vdGF0aW9ucyA9IiwgcF9vY2kuQW5ub3RhdGlvbnMpCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiBpIEFubm90YXRpb25zID0iLCBpX29jaS5Bbm5vdGF0aW9ucykKCiAgICBpX2tleXMgOj0gb2JqZWN0LmtleXMoaV9vY2kuQW5ub3RhdGlvbnMpCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiBpIGtleXMgPSIsIGlfa2V5cykKCiAgICBldmVyeSBpX2tleSBpbiBpX2tleXMgewogICAgICAgIGFsbG93X2Fubm9fa2V5KGlfa2V5LCBwX29jaSkKICAgIH0KCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiB0cnVlIikKfQoKYWxsb3dfYW5ub19rZXkoaV9rZXksIHBfb2NpKSB7CiAgICBwcmludCgiYWxsb3dfYW5ub19rZXkgMTogaSBrZXkgPSIsIGlfa2V5KQoKICAgIHN0YXJ0c3dpdGgoaV9rZXksICJpby5rdWJlcm5ldGVzLmNyaS4iKQoKICAgIHByaW50KCJhbGxvd19hbm5vX2tleSAxOiB0cnVlIikKfQphbGxvd19hbm5vX2tleShpX2tleSwgcF9vY2kpIHsKICAgIHByaW50KCJhbGxvd19hbm5vX2tleSAyOiBpIGtleSA9IiwgaV9rZXkpCgogICAgc29tZSBwX2tleSwgXyBpbiBwX29jaS5Bbm5vdGF0aW9ucwogICAgcF9rZXkgPT0gaV9rZXkKCiAgICBwcmludCgiYWxsb3dfYW5ub19rZXkgMjogdHJ1ZSIpCn0KCiMgR2V0IHRoZSB2YWx1ZSBvZiB0aGUgU19OQU1FX0tFWSBhbm5vdGF0aW9uIGFuZAojIGNvcnJlbGF0ZSBpdCB3aXRoIG90aGVyIGFubm90YXRpb25zIGFuZCBwcm9jZXNzIGZpZWxkcy4KYWxsb3dfYnlfYW5ubyhwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpIHsKICAgIHByaW50KCJhbGxvd19ieV9hbm5vIDE6IHN0YXJ0IikKCiAgICBub3QgcF9vY2kuQW5ub3RhdGlvbnNbU19OQU1FX0tFWV0KCiAgICBpX3NfbmFtZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMTogaV9zX25hbWUgPSIsIGlfc19uYW1lKQoKICAgIGlfc19uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FU1BBQ0VfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMTogaV9zX25hbWVzcGFjZSA9IiwgaV9zX25hbWVzcGFjZSkKCiAgICBhbGxvd19ieV9zYW5kYm94X25hbWUocF9vY2ksIGlfb2NpLCBwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBpX3NfbmFtZSwgaV9zX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfYnlfYW5ubyAxOiB0cnVlIikKfQphbGxvd19ieV9hbm5vKHBfb2NpLCBpX29jaSwgcF9zdG9yYWdlcywgaV9zdG9yYWdlcykgewogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMjogc3RhcnQiKQoKICAgIHBfc19uYW1lIDo9IHBfb2NpLkFubm90YXRpb25zW1NfTkFNRV9LRVldCiAgICBpX3NfbmFtZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMjogaV9zX25hbWUgPSIsIGlfc19uYW1lLCAicF9zX25hbWUgPSIsIHBfc19uYW1lKQoKICAgIGFsbG93X3NhbmRib3hfbmFtZShwX3NfbmFtZSwgaV9zX25hbWUpCgogICAgaV9zX25hbWVzcGFjZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwcmludCgiYWxsb3dfYnlfYW5ubyAyOiBpX3NfbmFtZXNwYWNlID0iLCBpX3NfbmFtZXNwYWNlKQoKICAgIGFsbG93X2J5X3NhbmRib3hfbmFtZShwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMsIGlfc19uYW1lLCBpX3NfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd19ieV9hbm5vIDI6IHRydWUiKQp9CgphbGxvd19ieV9zYW5kYm94X25hbWUocF9vY2ksIGlfb2NpLCBwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfYnlfc2FuZGJveF9uYW1lOiBzdGFydCIpCgogICAgaV9uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FU1BBQ0VfS0VZXQoKICAgIGFsbG93X2J5X2NvbnRhaW5lcl90eXBlcyhwX29jaSwgaV9vY2ksIHNfbmFtZSwgaV9uYW1lc3BhY2UpCiAgICBhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZChwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpCiAgICBhbGxvd19wcm9jZXNzKHBfb2NpLlByb2Nlc3MsIGlfb2NpLlByb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpCgogICAgcHJpbnQoImFsbG93X2J5X3NhbmRib3hfbmFtZTogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfbmFtZShwX3NfbmFtZSwgaV9zX25hbWUpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X25hbWU6IHN0YXJ0IikKICAgIHJlZ2V4Lm1hdGNoKHBfc19uYW1lLCBpX3NfbmFtZSkKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9uYW1lOiB0cnVlIikKfQoKIyBDaGVjayB0aGF0IHRoZSAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLXR5cGUiIGFuZAojICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIiBhbm5vdGF0aW9ucyBkZXNpZ25hdGUgdGhlCiMgZXhwZWN0ZWQgdHlwZSAtIGVpdGhlciBhICJzYW5kYm94IiBvciBhICJjb250YWluZXIiLiBUaGVuLCB2YWxpZGF0ZQojIG90aGVyIGFubm90YXRpb25zIGJhc2VkIG9uIHRoZSBhY3R1YWwgInNhbmRib3giIG9yICJjb250YWluZXIiIHZhbHVlCiMgZnJvbSB0aGUgaW5wdXQgY29udGFpbmVyLgphbGxvd19ieV9jb250YWluZXJfdHlwZXMocF9vY2ksIGlfb2NpLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfYnlfY29udGFpbmVyX3R5cGVzOiBjaGVja2luZyBpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSIpCgogICAgY190eXBlIDo9ICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSIKICAgIAogICAgcF9jcmlfdHlwZSA6PSBwX29jaS5Bbm5vdGF0aW9uc1tjX3R5cGVdCiAgICBpX2NyaV90eXBlIDo9IGlfb2NpLkFubm90YXRpb25zW2NfdHlwZV0KICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZXM6IHBfY3JpX3R5cGUgPSIsIHBfY3JpX3R5cGUsICJpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgcF9jcmlfdHlwZSA9PSBpX2NyaV90eXBlCgogICAgYWxsb3dfYnlfY29udGFpbmVyX3R5cGUoaV9jcmlfdHlwZSwgcF9vY2ksIGlfb2NpLCBzX25hbWUsIHNfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZXM6IHRydWUiKQp9CgphbGxvd19ieV9jb250YWluZXJfdHlwZShpX2NyaV90eXBlLCBwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAxOiBpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgaV9jcmlfdHlwZSA9PSAic2FuZGJveCIKCiAgICBpX2thdGFfdHlwZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1siaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5jb250YWluZXJfdHlwZSJdCiAgICBwcmludCgiYWxsb3dfYnlfY29udGFpbmVyX3R5cGUgMTogaV9rYXRhX3R5cGUgPSIsIGlfa2F0YV90eXBlKQogICAgaV9rYXRhX3R5cGUgPT0gInBvZF9zYW5kYm94IgoKICAgIGFsbG93X3NhbmRib3hfY29udGFpbmVyX25hbWUocF9vY2ksIGlfb2NpKQogICAgYWxsb3dfc2FuZGJveF9uZXRfbmFtZXNwYWNlKHBfb2NpLCBpX29jaSkKICAgIGFsbG93X3NhbmRib3hfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpCgogICAgcHJpbnQoImFsbG93X2J5X2NvbnRhaW5lcl90eXBlIDE6IHRydWUiKQp9CgphbGxvd19ieV9jb250YWluZXJfdHlwZShpX2NyaV90eXBlLCBwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiBpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgaV9jcmlfdHlwZSA9PSAiY29udGFpbmVyIgoKICAgIGlfa2F0YV90eXBlIDo9IGlfb2NpLkFubm90YXRpb25zWyJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIl0KICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiBpX2thdGFfdHlwZSA9IiwgaV9rYXRhX3R5cGUpCiAgICBpX2thdGFfdHlwZSA9PSAicG9kX2NvbnRhaW5lciIKCiAgICBhbGxvd19jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpCiAgICBhbGxvd19uZXRfbmFtZXNwYWNlKHBfb2NpLCBpX29jaSkKICAgIGFsbG93X2xvZ19kaXJlY3RvcnkocF9vY2ksIGlfb2NpKQoKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiB0cnVlIikKfQoKIyAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLW5hbWUiIGFubm90YXRpb24KYWxsb3dfc2FuZGJveF9jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X2NvbnRhaW5lcl9uYW1lOiBzdGFydCIpCgogICAgY29udGFpbmVyX2Fubm90YXRpb25fbWlzc2luZyhwX29jaSwgaV9vY2ksICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItbmFtZSIpCgogICAgcHJpbnQoImFsbG93X3NhbmRib3hfY29udGFpbmVyX25hbWU6IHRydWUiKQp9CgphbGxvd19jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19jb250YWluZXJfbmFtZTogc3RhcnQiKQoKICAgIGFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uKHBfb2NpLCBpX29jaSwgImlvLmt1YmVybmV0ZXMuY3JpLmNvbnRhaW5lci1uYW1lIikKCiAgICBwcmludCgiYWxsb3dfY29udGFpbmVyX25hbWU6IHRydWUiKQp9Cgpjb250YWluZXJfYW5ub3RhdGlvbl9taXNzaW5nKHBfb2NpLCBpX29jaSwga2V5KSB7CiAgICBwcmludCgiY29udGFpbmVyX2Fubm90YXRpb25fbWlzc2luZzoiLCBrZXkpCgogICAgbm90IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIG5vdCBpX29jaS5Bbm5vdGF0aW9uc1trZXldCgogICAgcHJpbnQoImNvbnRhaW5lcl9hbm5vdGF0aW9uX21pc3Npbmc6IHRydWUiKQp9CgphbGxvd19jb250YWluZXJfYW5ub3RhdGlvbihwX29jaSwgaV9vY2ksIGtleSkgewogICAgcHJpbnQoImFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uOiBrZXkgPSIsIGtleSkKCiAgICBwX3ZhbHVlIDo9IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIGlfdmFsdWUgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgcHJpbnQoImFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uOiBwX3ZhbHVlID0iLCBwX3ZhbHVlLCAiaV92YWx1ZSA9IiwgaV92YWx1ZSkKCiAgICBwX3ZhbHVlID09IGlfdmFsdWUKCiAgICBwcmludCgiYWxsb3dfY29udGFpbmVyX2Fubm90YXRpb246IHRydWUiKQp9CgojICJuZXJkY3RsL25ldHdvcmstbmFtZXNwYWNlIiBhbm5vdGF0aW9uCmFsbG93X3NhbmRib3hfbmV0X25hbWVzcGFjZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X25ldF9uYW1lc3BhY2U6IHN0YXJ0IikKCiAgICBrZXkgOj0gIm5lcmRjdGwvbmV0d29yay1uYW1lc3BhY2UiCgogICAgcF9uYW1lc3BhY2UgOj0gcF9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgaV9uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgcHJpbnQoImFsbG93X3NhbmRib3hfbmV0X25hbWVzcGFjZTogcF9uYW1lc3BhY2UgPSIsIHBfbmFtZXNwYWNlLCAiaV9uYW1lc3BhY2UgPSIsIGlfbmFtZXNwYWNlKQoKICAgIHJlZ2V4Lm1hdGNoKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9uZXRfbmFtZXNwYWNlOiB0cnVlIikKfQoKYWxsb3dfbmV0X25hbWVzcGFjZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19uZXRfbmFtZXNwYWNlOiBzdGFydCIpCgogICAga2V5IDo9ICJuZXJkY3RsL25ldHdvcmstbmFtZXNwYWNlIgoKICAgIG5vdCBwX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICBub3QgaV9vY2kuQW5ub3RhdGlvbnNba2V5XQoKICAgIHByaW50KCJhbGxvd19uZXRfbmFtZXNwYWNlOiB0cnVlIikKfQoKIyAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1sb2ctZGlyZWN0b3J5IiBhbm5vdGF0aW9uCmFsbG93X3NhbmRib3hfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X2xvZ19kaXJlY3Rvcnk6IHN0YXJ0IikKCiAgICBrZXkgOj0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbG9nLWRpcmVjdG9yeSIKCiAgICBwX2RpciA6PSBwX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICByZWdleDEgOj0gcmVwbGFjZShwX2RpciwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHJlZ2V4MiA6PSByZXBsYWNlKHJlZ2V4MSwgIiQoc2FuZGJveC1uYW1lc3BhY2UpIiwgc19uYW1lc3BhY2UpCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiByZWdleDIgPSIsIHJlZ2V4MikKCiAgICBpX2RpciA6PSBpX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiBpX2RpciA9IiwgaV9kaXIpCgogICAgcmVnZXgubWF0Y2gocmVnZXgyLCBpX2RpcikKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiB0cnVlIikKfQoKYWxsb3dfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19sb2dfZGlyZWN0b3J5OiBzdGFydCIpCgogICAga2V5IDo9ICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWxvZy1kaXJlY3RvcnkiCgogICAgbm90IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIG5vdCBpX29jaS5Bbm5vdGF0aW9uc1trZXldCgogICAgcHJpbnQoImFsbG93X2xvZ19kaXJlY3Rvcnk6IHRydWUiKQp9CgphbGxvd19kZXZpY2VzKHBfZGV2aWNlcywgaV9kZXZpY2VzKSB7CiAgICBwcmludCgiYWxsb3dfZGV2aWNlczogc3RhcnQiKQogICAgZXZlcnkgaV9kZXZpY2UgaW4gaV9kZXZpY2VzIHsKICAgICAgICBwcmludCgiYWxsb3dfZGV2aWNlczogaV9kZXZpY2UgPSIsIGlfZGV2aWNlKQogICAgICAgIHNvbWUgcF9kZXZpY2UgaW4gcF9kZXZpY2VzCiAgICAgICAgcF9kZXZpY2UuY29udGFpbmVyX3BhdGggPT0gaV9kZXZpY2UuY29udGFpbmVyX3BhdGgKICAgIH0KICAgIHByaW50KCJhbGxvd19kZXZpY2VzOiB0cnVlIikKfQoKYWxsb3dfbGludXgoc3RhdGVfb3BzLCBwX29jaSwgaV9vY2kpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIHBfbmFtZXNwYWNlcyA6PSBwX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbGludXg6IHAgbmFtZXNwYWNlcyA9IiwgcF9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlcyA6PSBpX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbGludXg6IGkgbmFtZXNwYWNlcyA9IiwgaV9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlX3dpdGhvdXRfbmV0d29yayA6PSBbb2JqIHwgb2JqIDo9IGlfbmFtZXNwYWNlc1tfXTsgb2JqLlR5cGUgIT0gIm5ldHdvcmsiXQoKICAgIHByaW50KCJhbGxvd19saW51eDogaV9uYW1lc3BhY2Vfd2l0aG91dF9uZXR3b3JrID0iLCBpX25hbWVzcGFjZV93aXRob3V0X25ldHdvcmspCgogICAgcF9uYW1lc3BhY2VzID09IGlfbmFtZXNwYWNlX3dpdGhvdXRfbmV0d29yawoKICAgIGFsbG93X21hc2tlZF9wYXRocyhwX29jaSwgaV9vY2kpCiAgICBhbGxvd19yZWFkb25seV9wYXRocyhwX29jaSwgaV9vY2kpCiAgICBhbGxvd19saW51eF9kZXZpY2VzKHBfb2NpLkxpbnV4LkRldmljZXMsIGlfb2NpLkxpbnV4LkRldmljZXMpCiAgICBhbGxvd19saW51eF9zeXNjdGwocF9vY2kuTGludXgsIGlfb2NpLkxpbnV4KQogICAgcmV0IDo9IGFsbG93X25ldHdvcmtfbmFtZXNwYWNlX3N0YXJ0KHN0YXRlX29wcywgcF9vY2ksIGlfb2NpKQogICAgcmV0LmFsbG93ZWQKCiAgICBvcHMgOj0gcmV0Lm9wcwoKICAgIHByaW50KCJhbGxvd19saW51eDogdHJ1ZSIpCn0KCiMgUmV0cmlldmUgdGhlICJuZXR3b3JrIiBuYW1lc3BhY2UgZnJvbSB0aGUgaW5wdXQgZGF0YSBhbmQgcGFzcyBpdCBvbiBmb3IgdGhlCiMgbmV0d29yayBuYW1lc3BhY2UgcG9saWN5IGNoZWNrcy4KYWxsb3dfbmV0d29ya19uYW1lc3BhY2Vfc3RhcnQoc3RhdGVfb3BzLCBwX29jaSwgaV9vY2kpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIHByaW50KCJhbGxvd19uZXR3b3JrX25hbWVzcGFjZSBzdGFydDogc3RhcnQiKQoKICAgIHBfbmFtZXNwYWNlcyA6PSBwX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IHAgbmFtZXNwYWNlcyA9IiwgcF9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlcyA6PSBpX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IGkgbmFtZXNwYWNlcyA9IiwgaV9uYW1lc3BhY2VzKQoKICAgICMgUmV0dXJuIHBhdGggb2YgdGhlICJuZXR3b3JrIiBuYW1lc3BhY2UKICAgIG5ldHdvcmtfbnMgOj0gW29iaiB8IG9iaiA6PSBpX25hbWVzcGFjZXNbX107IG9iai5UeXBlID09ICJuZXR3b3JrIl0KCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IG5ldHdvcmtfbnMgPSIsIG5ldHdvcmtfbnMpCgogICAgcmV0IDo9IGFsbG93X25ldHdvcmtfbmFtZXNwYWNlKHN0YXRlX29wcywgbmV0d29ya19ucykKICAgIHJldC5hbGxvd2VkCgogICAgb3BzIDo9IHJldC5vcHMKfQoKIyBUaGlzIHJ1bGUgaXMgd2hlbiB0aGVyZSdzIG5vIG5ldHdvcmsgbmFtZXNwYWNlIGluIHRoZSBpbnB1dCBkYXRhLgphbGxvd19uZXR3b3JrX25hbWVzcGFjZShzdGF0ZV9vcHMsIG5ldHdvcmtfbnMpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIGNvdW50KG5ldHdvcmtfbnMpID09IDAKCiAgICBuZXR3b3JrX25zX3BhdGggPSAiIgoKICAgIGFkZF9uZXR3b3JrX25hbWVzcGFjZV90b19zdGF0ZSA6PSBzdGF0ZV9hbGxvd3MoIm5ldHdvcmtfbmFtZXNwYWNlIiwgbmV0d29ya19uc19wYXRoKQogICAgb3BzIDo9IGNvbmNhdF9vcF9pZl9ub3RfbnVsbChzdGF0ZV9vcHMsIGFkZF9uZXR3b3JrX25hbWVzcGFjZV90b19zdGF0ZSkKCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2UgMTogdHJ1ZSIpCn0KCiMgVGhpcyBydWxlIGlzIHdoZW4gdGhlcmUncyBleGFjdGx5IG9uZSBuZXR3b3JrIG5hbWVzcGFjZSBpbiB0aGUgaW5wdXQgZGF0YS4KYWxsb3dfbmV0d29ya19uYW1lc3BhY2Uoc3RhdGVfb3BzLCBuZXR3b3JrX25zKSA6PSB7Im9wcyI6IG9wcywgImFsbG93ZWQiOiB0cnVlfSB7CiAgICBjb3VudChuZXR3b3JrX25zKSA9PSAxCgogICAgYWRkX25ldHdvcmtfbmFtZXNwYWNlX3RvX3N0YXRlIDo9IHN0YXRlX2FsbG93cygibmV0d29ya19uYW1lc3BhY2UiLCBuZXR3b3JrX25zWzBdLlBhdGgpCiAgICBvcHMgOj0gY29uY2F0X29wX2lmX25vdF9udWxsKHN0YXRlX29wcywgYWRkX25ldHdvcmtfbmFtZXNwYWNlX3RvX3N0YXRlKQoKICAgIHByaW50KCJhbGxvd19uZXR3b3JrX25hbWVzcGFjZSAyOiB0cnVlIikKfQoKYWxsb3dfbWFza2VkX3BhdGhzKHBfb2NpLCBpX29jaSkgewogICAgcF9wYXRocyA6PSBwX29jaS5MaW51eC5NYXNrZWRQYXRocwogICAgcHJpbnQoImFsbG93X21hc2tlZF9wYXRocyAxOiBwX3BhdGhzID0iLCBwX3BhdGhzKQoKICAgIGlfcGF0aHMgOj0gaV9vY2kuTGludXguTWFza2VkUGF0aHMKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aHMgMTogaV9wYXRocyA9IiwgaV9wYXRocykKCiAgICBhbGxvd19tYXNrZWRfcGF0aHNfYXJyYXkocF9wYXRocywgaV9wYXRocykKCiAgICBwcmludCgiYWxsb3dfbWFza2VkX3BhdGhzIDE6IHRydWUiKQp9CmFsbG93X21hc2tlZF9wYXRocyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aHMgMjogc3RhcnQiKQoKICAgIG5vdCBwX29jaS5MaW51eC5NYXNrZWRQYXRocwogICAgbm90IGlfb2NpLkxpbnV4Lk1hc2tlZFBhdGhzCgogICAgcHJpbnQoImFsbG93X21hc2tlZF9wYXRocyAyOiB0cnVlIikKfQoKIyBBbGwgdGhlIHBvbGljeSBtYXNrZWQgcGF0aHMgbXVzdCBiZSBtYXNrZWQgaW4gdGhlIGlucHV0IGRhdGEgdG9vLgojIElucHV0IGlzIGFsbG93ZWQgdG8gaGF2ZSBtb3JlIG1hc2tlZCBwYXRocyB0aGFuIHRoZSBwb2xpY3kuCmFsbG93X21hc2tlZF9wYXRoc19hcnJheShwX2FycmF5LCBpX2FycmF5KSB7CiAgICBldmVyeSBwX2VsZW0gaW4gcF9hcnJheSB7CiAgICAgICAgYWxsb3dfbWFza2VkX3BhdGgocF9lbGVtLCBpX2FycmF5KQogICAgfQp9CgphbGxvd19tYXNrZWRfcGF0aChwX2VsZW0sIGlfYXJyYXkpIHsKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aDogcF9lbGVtID0iLCBwX2VsZW0pCgogICAgc29tZSBpX2VsZW0gaW4gaV9hcnJheQogICAgcF9lbGVtID09IGlfZWxlbQoKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aDogdHJ1ZSIpCn0KCmFsbG93X3JlYWRvbmx5X3BhdGhzKHBfb2NpLCBpX29jaSkgewogICAgcF9wYXRocyA6PSBwX29jaS5MaW51eC5SZWFkb25seVBhdGhzCiAgICBwcmludCgiYWxsb3dfcmVhZG9ubHlfcGF0aHMgMTogcF9wYXRocyA9IiwgcF9wYXRocykKCiAgICBpX3BhdGhzIDo9IGlfb2NpLkxpbnV4LlJlYWRvbmx5UGF0aHMKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAxOiBpX3BhdGhzID0iLCBpX3BhdGhzKQoKICAgIGFsbG93X3JlYWRvbmx5X3BhdGhzX2FycmF5KHBfcGF0aHMsIGlfcGF0aHMsIGlfb2NpLkxpbnV4Lk1hc2tlZFBhdGhzKQoKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAxOiB0cnVlIikKfQphbGxvd19yZWFkb25seV9wYXRocyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAyOiBzdGFydCIpCgogICAgbm90IHBfb2NpLkxpbnV4LlJlYWRvbmx5UGF0aHMKICAgIG5vdCBpX29jaS5MaW51eC5SZWFkb25seVBhdGhzCgogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGhzIDI6IHRydWUiKQp9CgojIEFsbCB0aGUgcG9saWN5IHJlYWRvbmx5IHBhdGhzIG11c3QgYmUgZWl0aGVyOgojIC0gUHJlc2VudCBpbiB0aGUgaW5wdXQgcmVhZG9ubHkgcGF0aHMsIG9yCiMgLSBQcmVzZW50IGluIHRoZSBpbnB1dCBtYXNrZWQgcGF0aHMuCiMgSW5wdXQgaXMgYWxsb3dlZCB0byBoYXZlIG1vcmUgcmVhZG9ubHkgcGF0aHMgdGhhbiB0aGUgcG9saWN5LgphbGxvd19yZWFkb25seV9wYXRoc19hcnJheShwX2FycmF5LCBpX2FycmF5LCBtYXNrZWRfcGF0aHMpIHsKICAgIGV2ZXJ5IHBfZWxlbSBpbiBwX2FycmF5IHsKICAgICAgICBhbGxvd19yZWFkb25seV9wYXRoKHBfZWxlbSwgaV9hcnJheSwgbWFza2VkX3BhdGhzKQogICAgfQp9CgphbGxvd19yZWFkb25seV9wYXRoKHBfZWxlbSwgaV9hcnJheSwgbWFza2VkX3BhdGhzKSB7CiAgICBwcmludCgiYWxsb3dfcmVhZG9ubHlfcGF0aCAxOiBwX2VsZW0gPSIsIHBfZWxlbSkKCiAgICBzb21lIGlfZWxlbSBpbiBpX2FycmF5CiAgICBwX2VsZW0gPT0gaV9lbGVtCgogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGggMTogdHJ1ZSIpCn0KYWxsb3dfcmVhZG9ubHlfcGF0aChwX2VsZW0sIGlfYXJyYXksIG1hc2tlZF9wYXRocykgewogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGggMjogcF9lbGVtID0iLCBwX2VsZW0pCgogICAgc29tZSBpX21hc2tlZCBpbiBtYXNrZWRfcGF0aHMKICAgIHBfZWxlbSA9PSBpX21hc2tlZAoKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRoIDI6IHRydWUiKQp9CgphbGxvd19saW51eF9kZXZpY2VzKHBfZGV2aWNlcywgaV9kZXZpY2VzKSB7CiAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogc3RhcnQiKQogICAgZXZlcnkgaV9kZXZpY2UgaW4gaV9kZXZpY2VzIHsKICAgICAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogaV9kZXZpY2UgPSIsIGlfZGV2aWNlKQogICAgICAgIHNvbWUgcF9kZXZpY2UgaW4gcF9kZXZpY2VzCiAgICAgICAgaV9kZXZpY2UuUGF0aCA9PSBwX2RldmljZS5QYXRoCiAgICB9CiAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogdHJ1ZSIpCn0KCmFsbG93X2xpbnV4X3N5c2N0bChwX2xpbnV4LCBpX2xpbnV4KSB7CiAgICBwcmludCgiYWxsb3dfbGludXhfc3lzY3RsIDE6IHN0YXJ0IikKICAgIG5vdCBpX2xpbnV4LlN5c2N0bAogICAgcHJpbnQoImFsbG93X2xpbnV4X3N5c2N0bCAxOiB0cnVlIikKfQoKYWxsb3dfbGludXhfc3lzY3RsKHBfbGludXgsIGlfbGludXgpIHsKICAgIHByaW50KCJhbGxvd19saW51eF9zeXNjdGwgMjogc3RhcnQiKQogICAgcF9zeXNjdGwgOj0gcF9saW51eC5TeXNjdGwKICAgIGlfc3lzY3RsIDo9IGlfbGludXguU3lzY3RsCiAgICBldmVyeSBpX25hbWUsIGlfdmFsIGluIGlfc3lzY3RsIHsKICAgICAgICBwcmludCgiYWxsb3dfbGludXhfc3lzY3RsIDI6IGlfbmFtZSA9IiwgaV9uYW1lLCAiaV92YWwgPSIsIGlfdmFsKQogICAgICAgIHBfc3lzY3RsW2lfbmFtZV0gPT0gaV92YWwKICAgIH0KICAgIHByaW50KCJhbGxvd19saW51eF9zeXNjdGwgMjogdHJ1ZSIpCn0KCiMgQ2hlY2sgdGhlIGNvbnNpc3RlbmN5IG9mIHRoZSBpbnB1dCAiaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5idW5kbGVfcGF0aCIKIyBhbmQgaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCIgdmFsdWVzIHdpdGggb3RoZXIgZmllbGRzLgphbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZChwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpIHsKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogc3RhcnQiKQoKICAgIGJ1bmRsZV9wYXRoIDo9IGlfb2NpLkFubm90YXRpb25zWyJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmJ1bmRsZV9wYXRoIl0KICAgIGJ1bmRsZV9pZCA6PSByZXBsYWNlKGJ1bmRsZV9wYXRoLCAiL3J1bi9jb250YWluZXJkL2lvLmNvbnRhaW5lcmQucnVudGltZS52Mi50YXNrL2s4cy5pby8iLCAiIikKCiAgICBidW5kbGVfaWRfZm9ybWF0IDo9IGNvbmNhdCgiIiwgWyJeIiwgQlVORExFX0lELCAiJCJdKQogICAgcmVnZXgubWF0Y2goYnVuZGxlX2lkX2Zvcm1hdCwgYnVuZGxlX2lkKQoKICAgIGtleSA6PSAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCIKCiAgICBwX3JlZ2V4IDo9IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIHNhbmRib3hfaWQgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQoKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogc2FuZGJveF9pZCA9Iiwgc2FuZGJveF9pZCwgInJlZ2V4ID0iLCBwX3JlZ2V4KQogICAgcmVnZXgubWF0Y2gocF9yZWdleCwgc2FuZGJveF9pZCkKCiAgICBhbGxvd19yb290X3BhdGgocF9vY2ksIGlfb2NpLCBidW5kbGVfaWQpCgogICAgZXZlcnkgaV9tb3VudCBpbiBpX29jaS5Nb3VudHMgewogICAgICAgIGFsbG93X21vdW50KHBfb2NpLCBpX21vdW50LCBpX3N0b3JhZ2VzLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpCiAgICB9CgogICAgYWxsb3dfc3RvcmFnZXMocF9zdG9yYWdlcywgaV9zdG9yYWdlcywgYnVuZGxlX2lkLCBzYW5kYm94X2lkKQoKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogdHJ1ZSIpCn0KCmFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHBfcHJvY2VzcyA9IiwgcF9wcm9jZXNzKQogICAgcHJpbnQoImFsbG93X3Byb2Nlc3NfY29tbW9uOiBpX3Byb2Nlc3MgPSAiLCBpX3Byb2Nlc3MpCiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHNfbmFtZSA9Iiwgc19uYW1lKQoKICAgIHBfcHJvY2Vzcy5Dd2QgPT0gaV9wcm9jZXNzLkN3ZAogICAgcF9wcm9jZXNzLk5vTmV3UHJpdmlsZWdlcyA9PSBpX3Byb2Nlc3MuTm9OZXdQcml2aWxlZ2VzCgogICAgYWxsb3dfdXNlcihwX3Byb2Nlc3MsIGlfcHJvY2VzcykKICAgIGFsbG93X2VudihwX3Byb2Nlc3MsIGlfcHJvY2Vzcywgc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHRydWUiKQp9CgojIENvbXBhcmUgdGhlIE9DSSBQcm9jZXNzIGZpZWxkIG9mIGEgcG9saWN5IGNvbnRhaW5lciB3aXRoIHRoZSBpbnB1dCBPQ0kgUHJvY2VzcyBmcm9tIGEgQ3JlYXRlQ29udGFpbmVyUmVxdWVzdAphbGxvd19wcm9jZXNzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfcHJvY2Vzczogc3RhcnQiKQoKICAgIGFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgYWxsb3dfY2FwcyhwX3Byb2Nlc3MuQ2FwYWJpbGl0aWVzLCBpX3Byb2Nlc3MuQ2FwYWJpbGl0aWVzKQogICAgcF9wcm9jZXNzLlRlcm1pbmFsID09IGlfcHJvY2Vzcy5UZXJtaW5hbAoKICAgIHByaW50KCJhbGxvd19wcm9jZXNzOiB0cnVlIikKfQoKIyBDb21wYXJlIHRoZSBPQ0kgUHJvY2VzcyBmaWVsZCBvZiBhIHBvbGljeSBjb250YWluZXIgd2l0aCB0aGUgaW5wdXQgcHJvY2VzcyBmaWVsZCBmcm9tIEV4ZWNQcm9jZXNzUmVxdWVzdAphbGxvd19pbnRlcmFjdGl2ZV9wcm9jZXNzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfaW50ZXJhY3RpdmVfcHJvY2Vzczogc3RhcnQiKQoKICAgIGFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgYWxsb3dfZXhlY19jYXBzKGlfcHJvY2Vzcy5DYXBhYmlsaXRpZXMpCgogICAgIyBUaGVzZSBhcmUgY29tbWFuZHMgZW5hYmxlZCB1c2luZyBFeGVjUHJvY2Vzc1JlcXVlc3QgY29tbWFuZHMgYW5kL29yIHJlZ2V4IGZyb20gdGhlIHNldHRpbmdzIGZpbGUuCiAgICAjIFRoZXkgY2FuIGJlIGV4ZWN1dGVkIGludGVyYWN0aXZlbHkgc28gYWxsb3cgdGhlbSB0byB1c2UgYW55IHZhbHVlIGZvciBpX3Byb2Nlc3MuVGVybWluYWwuCgogICAgcHJpbnQoImFsbG93X2ludGVyYWN0aXZlX3Byb2Nlc3M6IHRydWUiKQp9CgojIENvbXBhcmUgdGhlIE9DSSBQcm9jZXNzIGZpZWxkIG9mIGEgcG9saWN5IGNvbnRhaW5lciB3aXRoIHRoZSBpbnB1dCBwcm9jZXNzIGZpZWxkIGZyb20gRXhlY1Byb2Nlc3NSZXF1ZXN0CmFsbG93X3Byb2JlX3Byb2Nlc3MocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19wcm9iZV9wcm9jZXNzOiBzdGFydCIpCgogICAgYWxsb3dfcHJvY2Vzc19jb21tb24ocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpCiAgICBhbGxvd19leGVjX2NhcHMoaV9wcm9jZXNzLkNhcGFiaWxpdGllcykKICAgIHBfcHJvY2Vzcy5UZXJtaW5hbCA9PSBpX3Byb2Nlc3MuVGVybWluYWwKCiAgICBwcmludCgiYWxsb3dfcHJvYmVfcHJvY2VzczogdHJ1ZSIpCn0KCmFsbG93X3VzZXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MpIHsKICAgIHBfdXNlciA6PSBwX3Byb2Nlc3MuVXNlcgogICAgaV91c2VyIDo9IGlfcHJvY2Vzcy5Vc2VyCgogICAgcHJpbnQoImFsbG93X3VzZXI6IGlucHV0IHVpZCA9IiwgaV91c2VyLlVJRCwgInBvbGljeSB1aWQgPSIsIHBfdXNlci5VSUQpCiAgICBwX3VzZXIuVUlEID09IGlfdXNlci5VSUQKCiAgICAjIFRPRE86IHRyYWNrIGRvd24gdGhlIHJlYXNvbiBmb3IgcmVnaXN0cnkuazhzLmlvL3BhdXNlOjMuOSBiZWluZwogICAgIyAgICAgICBleGVjdXRlZCB3aXRoIGdpZCA9IDAgZGVzcGl0ZSBoYXZpbmcgIjY1NTM1OjY1NTM1IiBpbiBpdHMgY29udGFpbmVyIGltYWdlCiAgICAjICAgICAgIGNvbmZpZy4KICAgICNwcmludCgiYWxsb3dfdXNlcjogaW5wdXQgZ2lkID0iLCBpX3VzZXIuR0lELCAicG9saWN5IGdpZCA9IiwgcF91c2VyLkdJRCkKICAgICNwX3VzZXIuR0lEID09IGlfdXNlci5HSUQKCiAgICAjIFRPRE86IGNvbXBhcmUgdGhlIGFkZGl0aW9uYWxHaWRzIGZpZWxkIHRvbyBhZnRlciBjb21wdXRpbmcgaXRzIHZhbHVlCiAgICAjIGJhc2VkIG9uIC9ldGMvcGFzc3dkIGFuZCAvZXRjL2dyb3VwIGZyb20gdGhlIGNvbnRhaW5lciBpbWFnZS4KfQoKYWxsb3dfZGVwcmVjYXRlZF9hcmdzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZ3MgMTogbm8gYXJncyIpCgogICAgbm90IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJncwogICAgbm90IGlfcHJvY2Vzcy5BcmdzCgogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAxOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZ3MocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSkgewogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiBwb2xpY3kgYXJncyA9IiwgcF9wcm9jZXNzLkRlcHJlY2F0ZWRBcmdzKQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiBpbnB1dCBhcmdzID0iLCBpX3Byb2Nlc3MuQXJncykKCiAgICBjb3VudChwX3Byb2Nlc3MuRGVwcmVjYXRlZEFyZ3MpID09IGNvdW50KGlfcHJvY2Vzcy5BcmdzKQoKICAgIGV2ZXJ5IGksIGlfYXJnIGluIGlfcHJvY2Vzcy5BcmdzIHsKICAgICAgICBhbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpCiAgICB9CgogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDE6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgcF9hcmcyIDo9IHJlcGxhY2UocF9hcmcsICIkJCIsICIkIikKICAgIHBfYXJnMiA9PSBpX2FyZwoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAxOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDI6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgIyBUT0RPOiBjYW4gJChub2RlLW5hbWUpIGJlIGhhbmRsZWQgYmV0dGVyPwogICAgY29udGFpbnMocF9hcmcsICIkKG5vZGUtbmFtZSkiKQoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAyOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDM6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgcF9hcmcyIDo9IHJlcGxhY2UocF9hcmcsICIkJCIsICIkIikKICAgIHBfYXJnMyA6PSByZXBsYWNlKHBfYXJnMiwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAzOiBwX2FyZzMgPSIsIHBfYXJnMykKICAgIHBfYXJnMyA9PSBpX2FyZwoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAzOiB0cnVlIikKfQoKIyBPQ0kgcHJvY2Vzcy5FbnYgZmllbGQKYWxsb3dfZW52KHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfZW52OiBwIGVudiA9IiwgcF9wcm9jZXNzLkVudikKICAgIHByaW50KCJhbGxvd19lbnY6IGkgZW52ID0iLCBpX3Byb2Nlc3MuRW52KQoKICAgIGV2ZXJ5IGlfdmFyIGluIGlfcHJvY2Vzcy5FbnYgewogICAgICAgIHByaW50KCJhbGxvd19lbnY6IGlfdmFyID0iLCBpX3ZhcikKICAgICAgICBhbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgfQoKICAgIHByaW50KCJhbGxvd19lbnY6IHRydWUiKQp9CgojIEFsbG93IGlucHV0IGVudiB2YXJpYWJsZXMgdGhhdCBhcmUgcHJlc2VudCBpbiB0aGUgcG9saWN5IGRhdGEgdG9vLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHBfdmFyID09IGlfdmFyCiAgICBwcmludCgiYWxsb3dfdmFyIDE6IHRydWUiKQp9CgojIE1hdGNoIGlucHV0IHdpdGggb25lIG9mIHRoZSBwb2xpY3kgdmFyaWFibGVzLCBhZnRlciBzdWJzdGl0dXRpbmcgJChzYW5kYm94LW5hbWUpLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHByaW50KCJhbGxvd192YXIgMjogcF92YXIgPSIsIHBfdmFyKQoKICAgIHBfdmFyX3NwbGl0IDo9IHNwbGl0KHBfdmFyLCAiPSIpCiAgICBjb3VudChwX3Zhcl9zcGxpdCkgPT0gMgoKICAgIHBfdmFyX3NwbGl0WzFdID09ICIkKHNhbmRib3gtbmFtZSkiCgogICAgaV92YXJfc3BsaXQgOj0gc3BsaXQoaV92YXIsICI9IikKICAgIGNvdW50KGlfdmFyX3NwbGl0KSA9PSAyCgogICAgaV92YXJfc3BsaXRbMF0gPT0gcF92YXJfc3BsaXRbMF0KICAgIHJlZ2V4Lm1hdGNoKHNfbmFtZSwgaV92YXJfc3BsaXRbMV0pCgogICAgcHJpbnQoImFsbG93X3ZhciAyOiB0cnVlIikKfQoKIyBBbGxvdyBpbnB1dCBlbnYgdmFyaWFibGVzIHRoYXQgbWF0Y2ggd2l0aCBhIHJlcXVlc3RfZGVmYXVsdHMgcmVnZXguCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHNvbWUgcF9yZWdleDEgaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5DcmVhdGVDb250YWluZXJSZXF1ZXN0LmFsbG93X2Vudl9yZWdleAogICAgcF9yZWdleDIgOj0gcmVwbGFjZShwX3JlZ2V4MSwgIiQoaXB2NF9hKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcHY0X2EpCiAgICBwX3JlZ2V4MyA6PSByZXBsYWNlKHBfcmVnZXgyLCAiJChpcF9wKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcF9wKQogICAgcF9yZWdleDQgOj0gcmVwbGFjZShwX3JlZ2V4MywgIiQoc3ZjX25hbWUpIiwgcG9saWN5X2RhdGEuY29tbW9uLnN2Y19uYW1lKQogICAgcF9yZWdleDUgOj0gcmVwbGFjZShwX3JlZ2V4NCwgIiQoZG5zX2xhYmVsKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5kbnNfbGFiZWwpCgogICAgcHJpbnQoImFsbG93X3ZhciAzOiBwX3JlZ2V4NSA9IiwgcF9yZWdleDUpCiAgICByZWdleC5tYXRjaChwX3JlZ2V4NSwgaV92YXIpCgogICAgcHJpbnQoImFsbG93X3ZhciAzOiB0cnVlIikKfQoKIyBBbGxvdyBmaWVsZFJlZiAiZmllbGRQYXRoOiBzdGF0dXMucG9kSVAiIHZhbHVlcy4KYWxsb3dfdmFyKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBpX3Zhciwgc19uYW1lLCBzX25hbWVzcGFjZSkgewogICAgbmFtZV92YWx1ZSA6PSBzcGxpdChpX3ZhciwgIj0iKQogICAgY291bnQobmFtZV92YWx1ZSkgPT0gMgogICAgaXNfaXAobmFtZV92YWx1ZVsxXSkKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIGFsbG93X3BvZF9pcF92YXIobmFtZV92YWx1ZVswXSwgcF92YXIpCgogICAgcHJpbnQoImFsbG93X3ZhciA0OiB0cnVlIikKfQoKIyBBbGxvdyBjb21tb24gZmllbGRSZWYgdmFyaWFibGVzLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBuYW1lX3ZhbHVlIDo9IHNwbGl0KGlfdmFyLCAiPSIpCiAgICBjb3VudChuYW1lX3ZhbHVlKSA9PSAyCgogICAgc29tZSBwX3ZhciBpbiBwX3Byb2Nlc3MuRW52CiAgICBwX25hbWVfdmFsdWUgOj0gc3BsaXQocF92YXIsICI9IikKICAgIGNvdW50KHBfbmFtZV92YWx1ZSkgPT0gMgoKICAgIHBfbmFtZV92YWx1ZVswXSA9PSBuYW1lX3ZhbHVlWzBdCgogICAgIyBUT0RPOiBzaG91bGQgdGhlc2UgYmUgaGFuZGxlZCBpbiBhIGRpZmZlcmVudCB3YXk/CiAgICBhbHdheXNfYWxsb3dlZCA6PSBbIiQoaG9zdC1uYW1lKSIsICIkKG5vZGUtbmFtZSkiLCAiJChwb2QtdWlkKSJdCiAgICBzb21lIGFsbG93ZWQgaW4gYWx3YXlzX2FsbG93ZWQKICAgIGNvbnRhaW5zKHBfbmFtZV92YWx1ZVsxXSwgYWxsb3dlZCkKCiAgICBwcmludCgiYWxsb3dfdmFyIDU6IHRydWUiKQp9CgojIEFsbG93IGZpZWxkUmVmICJmaWVsZFBhdGg6IHN0YXR1cy5ob3N0SVAiIHZhbHVlcy4KYWxsb3dfdmFyKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBpX3Zhciwgc19uYW1lLCBzX25hbWVzcGFjZSkgewogICAgbmFtZV92YWx1ZSA6PSBzcGxpdChpX3ZhciwgIj0iKQogICAgY291bnQobmFtZV92YWx1ZSkgPT0gMgogICAgaXNfaXAobmFtZV92YWx1ZVsxXSkKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIGFsbG93X2hvc3RfaXBfdmFyKG5hbWVfdmFsdWVbMF0sIHBfdmFyKQoKICAgIHByaW50KCJhbGxvd192YXIgNjogdHJ1ZSIpCn0KCiMgQWxsb3cgcmVzb3VyY2VGaWVsZFJlZiB2YWx1ZXMgKGUuZy4sICJsaW1pdHMuY3B1IikuCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIG5hbWVfdmFsdWUgOj0gc3BsaXQoaV92YXIsICI9IikKICAgIGNvdW50KG5hbWVfdmFsdWUpID09IDIKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHBfbmFtZV92YWx1ZSA6PSBzcGxpdChwX3ZhciwgIj0iKQogICAgY291bnQocF9uYW1lX3ZhbHVlKSA9PSAyCgogICAgcF9uYW1lX3ZhbHVlWzBdID09IG5hbWVfdmFsdWVbMF0KCiAgICAjIGEgdmFyaWFibGUgd2Ugc2hvdWxkIGJlIHZhbGlkYXRpbmcgdXNpbmcgYSByZWdleCBmcm9tIHNldHRpbmdzCiAgICBwX25hbWVfdmFsdWVbMV0gPT0gIiQodmFsaWRhdGUtZnJvbS1zZXR0aW5ncykiCgogICAgcmVnZXhfdmFsIDo9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuQ3JlYXRlQ29udGFpbmVyUmVxdWVzdC5hbGxvd19lbnZfcmVnZXhfbWFwW25hbWVfdmFsdWVbMF1dCgogICAgcHJpbnQoImFsbG93X3ZhciA3OiB2YWwgPSIsIG5hbWVfdmFsdWVbMV0pCiAgICBwcmludCgiYWxsb3dfdmFyIDc6IHJlZ2V4X3ZhbCA9IiwgcmVnZXhfdmFsKQoKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4X3ZhbCwgbmFtZV92YWx1ZVsxXSkKCiAgICBwcmludCgiYWxsb3dfdmFyIDc6IHRydWUiKQp9CgojIE1hdGNoIGlucHV0IHdpdGggb25lIG9mIHRoZSBwb2xpY3kgdmFyaWFibGVzLCBhZnRlciBzdWJzdGl0dXRpbmcgJChzYW5kYm94LW5hbWVzcGFjZSkuCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHNvbWUgcF92YXIgaW4gcF9wcm9jZXNzLkVudgogICAgcF92YXIyIDo9IHJlcGxhY2UocF92YXIsICIkKHNhbmRib3gtbmFtZXNwYWNlKSIsIHNfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd192YXIgODogcF92YXIyID0iLCBwX3ZhcjIpCiAgICBwX3ZhcjIgPT0gaV92YXIKCiAgICBwcmludCgiYWxsb3dfdmFyIDg6IHRydWUiKQp9CgphbGxvd19wb2RfaXBfdmFyKHZhcl9uYW1lLCBwX3ZhcikgewogICAgcHJpbnQoImFsbG93X3BvZF9pcF92YXI6IHZhcl9uYW1lID0iLCB2YXJfbmFtZSwgInBfdmFyID0iLCBwX3ZhcikKCiAgICBwX25hbWVfdmFsdWUgOj0gc3BsaXQocF92YXIsICI9IikKICAgIGNvdW50KHBfbmFtZV92YWx1ZSkgPT0gMgoKICAgIHBfbmFtZV92YWx1ZVswXSA9PSB2YXJfbmFtZQogICAgcF9uYW1lX3ZhbHVlWzFdID09ICIkKHBvZC1pcCkiCgogICAgcHJpbnQoImFsbG93X3BvZF9pcF92YXI6IHRydWUiKQp9CgphbGxvd19ob3N0X2lwX3Zhcih2YXJfbmFtZSwgcF92YXIpIHsKICAgIHByaW50KCJhbGxvd19ob3N0X2lwX3ZhcjogdmFyX25hbWUgPSIsIHZhcl9uYW1lLCAicF92YXIgPSIsIHBfdmFyKQoKICAgIHBfbmFtZV92YWx1ZSA6PSBzcGxpdChwX3ZhciwgIj0iKQogICAgY291bnQocF9uYW1lX3ZhbHVlKSA9PSAyCgogICAgcF9uYW1lX3ZhbHVlWzBdID09IHZhcl9uYW1lCiAgICBwX25hbWVfdmFsdWVbMV0gPT0gIiQoaG9zdC1pcCkiCgogICAgcHJpbnQoImFsbG93X2hvc3RfaXBfdmFyOiB0cnVlIikKfQoKaXNfaXAodmFsdWUpIHsKICAgIGJ5dGVzID0gc3BsaXQodmFsdWUsICIuIikKICAgIGNvdW50KGJ5dGVzKSA9PSA0CgogICAgaXNfaXBfZmlyc3RfYnl0ZShieXRlc1swXSkKICAgIGlzX2lwX290aGVyX2J5dGUoYnl0ZXNbMV0pCiAgICBpc19pcF9vdGhlcl9ieXRlKGJ5dGVzWzJdKQogICAgaXNfaXBfb3RoZXJfYnl0ZShieXRlc1szXSkKfQppc19pcF9maXJzdF9ieXRlKGNvbXBvbmVudCkgewogICAgbnVtYmVyID0gdG9fbnVtYmVyKGNvbXBvbmVudCkKICAgIG51bWJlciA+PSAxCiAgICBudW1iZXIgPD0gMjU1Cn0KaXNfaXBfb3RoZXJfYnl0ZShjb21wb25lbnQpIHsKICAgIG51bWJlciA9IHRvX251bWJlcihjb21wb25lbnQpCiAgICBudW1iZXIgPj0gMAogICAgbnVtYmVyIDw9IDI1NQp9CgojIE9DSSByb290LlBhdGgKYWxsb3dfcm9vdF9wYXRoKHBfb2NpLCBpX29jaSwgYnVuZGxlX2lkKSB7CiAgICBpX3BhdGggOj0gaV9vY2kuUm9vdC5QYXRoCiAgICBwX3BhdGgxIDo9IHBfb2NpLlJvb3QuUGF0aAogICAgcHJpbnQoImFsbG93X3Jvb3RfcGF0aDogaV9wYXRoID0iLCBpX3BhdGgsICJwX3BhdGgxID0iLCBwX3BhdGgxKQoKICAgIHBfcGF0aDIgOj0gcmVwbGFjZShwX3BhdGgxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfcm9vdF9wYXRoOiBwX3BhdGgyID0iLCBwX3BhdGgyKQoKICAgIHBfcGF0aDMgOj0gcmVwbGFjZShwX3BhdGgyLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X3Jvb3RfcGF0aDogcF9wYXRoMyA9IiwgcF9wYXRoMykKCiAgICBwX3BhdGgzID09IGlfcGF0aAoKICAgIHByaW50KCJhbGxvd19yb290X3BhdGg6IHRydWUiKQp9CgojIGRldmljZSBtb3VudHMKYWxsb3dfbW91bnQocF9vY2ksIGlfbW91bnQsIGlfc3RvcmFnZXMsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcHJpbnQoImFsbG93X21vdW50OiBpX21vdW50ID0iLCBpX21vdW50KQoKICAgIHNvbWUgcF9tb3VudCBpbiBwX29jaS5Nb3VudHMKICAgIHNvbWUgaV9zdG9yYWdlIGluIGlfc3RvcmFnZXMKCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IHBfbW91bnQgPSIsIHBfbW91bnQpCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IGlfc3RvcmFnZSA9IiwgaV9zdG9yYWdlKQoKICAgIGNoZWNrX21vdW50KHBfbW91bnQsIGlfbW91bnQsIGlfc3RvcmFnZSwgYnVuZGxlX2lkLCBzYW5kYm94X2lkKQoKICAgICMgVE9ETzogYXJlIHRoZXJlIGFueSBvdGhlciByZXF1aXJlZCBwb2xpY3kgY2hlY2tzIGZvciBtb3VudHMgLSBlLmcuLAogICAgIyAgICAgICBtdWx0aXBsZSBtb3VudHMgd2l0aCBzYW1lIHNvdXJjZSBvciBkZXN0aW5hdGlvbj8KCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IHRydWUiKQp9CgpjaGVja19tb3VudChwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcF9tb3VudCA9PSBpX21vdW50CiAgICBwcmludCgiY2hlY2tfbW91bnQgMTogdHJ1ZSIpCn0KY2hlY2tfbW91bnQocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHBfbW91bnQuZGVzdGluYXRpb24gPT0gaV9tb3VudC5kZXN0aW5hdGlvbgogICAgcF9tb3VudC50eXBlXyA9PSBpX21vdW50LnR5cGVfCiAgICBwX21vdW50Lm9wdGlvbnMgPT0gaV9tb3VudC5vcHRpb25zCgogICAgbW91bnRfc291cmNlX2FsbG93cyhwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkKCiAgICBwcmludCgiY2hlY2tfbW91bnQgMjogdHJ1ZSIpCn0KCm1vdW50X3NvdXJjZV9hbGxvd3MocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHJlZ2V4MSA6PSBwX21vdW50LnNvdXJjZQogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5tb3VudF9zb3VyY2VfY3BhdGgpCiAgICByZWdleDQgOj0gcmVwbGFjZShyZWdleDMsICIkKGJ1bmRsZS1pZCkiLCBidW5kbGVfaWQpCgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMTogcmVnZXg0ID0iLCByZWdleDQpCiAgICByZWdleC5tYXRjaChyZWdleDQsIGlfbW91bnQuc291cmNlKQoKICAgIHByaW50KCJtb3VudF9zb3VyY2VfYWxsb3dzIDE6IHRydWUiKQp9Cm1vdW50X3NvdXJjZV9hbGxvd3MocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHJlZ2V4MSA6PSBwX21vdW50LnNvdXJjZQogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5tb3VudF9zb3VyY2VfY3BhdGgpCiAgICByZWdleDQgOj0gcmVwbGFjZShyZWdleDMsICIkKHNhbmRib3gtaWQpIiwgc2FuZGJveF9pZCkKCiAgICBwcmludCgibW91bnRfc291cmNlX2FsbG93cyAyOiByZWdleDQgPSIsIHJlZ2V4NCkKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4NCwgaV9tb3VudC5zb3VyY2UpCgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMjogdHJ1ZSIpCn0KbW91bnRfc291cmNlX2FsbG93cyhwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogaV9tb3VudC5zb3VyY2UgPSIsIGlfbW91bnQuc291cmNlKQogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogaV9zdG9yYWdlLm1vdW50X3BvaW50ID0iLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCgogICAgaV9tb3VudC5zb3VyY2UgPT0gaV9zdG9yYWdlLm1vdW50X3BvaW50CgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogdHJ1ZSIpCn0KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBDcmVhdGUgY29udGFpbmVyIFN0b3JhZ2VzCgphbGxvd19zdG9yYWdlcyhwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHBfY291bnQgOj0gY291bnQocF9zdG9yYWdlcykKICAgIGlfY291bnQgOj0gY291bnQoaV9zdG9yYWdlcykKICAgIHByaW50KCJhbGxvd19zdG9yYWdlczogcF9jb3VudCA9IiwgcF9jb3VudCwgImlfY291bnQgPSIsIGlfY291bnQpCgogICAgcF9jb3VudCA9PSBpX2NvdW50CgogICAgIyBHZXQgdGhlIGNvbnRhaW5lciBpbWFnZSBsYXllciBJRHMgYW5kIHZlcml0eSByb290IGhhc2hlcywgZnJvbSB0aGUgIm92ZXJsYXlmcyIgc3RvcmFnZS4KICAgIHNvbWUgb3ZlcmxheV9zdG9yYWdlIGluIHBfc3RvcmFnZXMKICAgIG92ZXJsYXlfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIHByaW50KCJhbGxvd19zdG9yYWdlczogb3ZlcmxheV9zdG9yYWdlID0iLCBvdmVybGF5X3N0b3JhZ2UpCiAgICBjb3VudChvdmVybGF5X3N0b3JhZ2Uub3B0aW9ucykgPT0gMgoKICAgIGxheWVyX2lkcyA6PSBzcGxpdChvdmVybGF5X3N0b3JhZ2Uub3B0aW9uc1swXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiBsYXllcl9pZHMgPSIsIGxheWVyX2lkcykKCiAgICByb290X2hhc2hlcyA6PSBzcGxpdChvdmVybGF5X3N0b3JhZ2Uub3B0aW9uc1sxXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiByb290X2hhc2hlcyA9Iiwgcm9vdF9oYXNoZXMpCgogICAgZXZlcnkgaV9zdG9yYWdlIGluIGlfc3RvcmFnZXMgewogICAgICAgIGFsbG93X3N0b3JhZ2UocF9zdG9yYWdlcywgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpCiAgICB9CgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiB0cnVlIikKfQoKYWxsb3dfc3RvcmFnZShwX3N0b3JhZ2VzLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgc29tZSBwX3N0b3JhZ2UgaW4gcF9zdG9yYWdlcwoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiBwX3N0b3JhZ2UgPSIsIHBfc3RvcmFnZSkKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiBpX3N0b3JhZ2UgPSIsIGlfc3RvcmFnZSkKCiAgICBwX3N0b3JhZ2UuZHJpdmVyICAgICAgICAgICA9PSBpX3N0b3JhZ2UuZHJpdmVyCiAgICBwX3N0b3JhZ2UuZHJpdmVyX29wdGlvbnMgICA9PSBpX3N0b3JhZ2UuZHJpdmVyX29wdGlvbnMKICAgIHBfc3RvcmFnZS5mc19ncm91cCAgICAgICAgID09IGlfc3RvcmFnZS5mc19ncm91cAogICAgcF9zdG9yYWdlLmZzdHlwZSAgICAgICAgICAgPT0gaV9zdG9yYWdlLmZzdHlwZQoKICAgIGFsbG93X3N0b3JhZ2Vfc291cmNlKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKQogICAgYWxsb3dfc3RvcmFnZV9vcHRpb25zKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKQogICAgYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKQoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiB0cnVlIikKfQoKYWxsb3dfc3RvcmFnZV9zb3VyY2UocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX3NvdXJjZSAxOiBzdGFydCIpCgogICAgcF9zdG9yYWdlLnNvdXJjZSA9PSBpX3N0b3JhZ2Uuc291cmNlCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDE6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX3NvdXJjZShwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDI6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCgogICAgIyBEREREOkJCOkRELkY6IERvbWFpbjpCdXM6RGV2aWNlLkZ1bmN0aW9uCiAgICAjIGh0dHBzOi8vd3d3Lmtlcm5lbC5vcmcvZG9jL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtYnVzLXBjaQogICAgcmVnZXgubWF0Y2goYF5bYS1mMC05XXs0fTpbYS1mMC05XXsyfTpbYS1mMC05XXsyfVwuW2EtZjAtOV0kYCwgaV9zdG9yYWdlLnNvdXJjZSkKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9zb3VyY2UgMjogdHJ1ZSIpCn0KCmFsbG93X3N0b3JhZ2Vfc291cmNlKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKSB7CiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9zb3VyY2UgMzogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIGlfc3RvcmFnZS5zb3VyY2UgPT0gIm5vbmUiCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDM6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX3NvdXJjZShwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDQ6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJzbWIiCgogICAgIyBQYXR0ZXJuOiAvLzxzdG9yYWdlLWFjY291bnQtbmFtZT4uZmlsZS5jb3JlLndpbmRvd3MubmV0LzxrOHMtUFZDLW5hbWU+CiAgICAjIFN0b3JhZ2UgYWNjb3VudCBuYW1lOiBodHRwczovL2xlYXJuLm1pY3Jvc29mdC5jb20vZW4tdXMvYXp1cmUvc3RvcmFnZS9jb21tb24vc3RvcmFnZS1hY2NvdW50LW92ZXJ2aWV3I3N0b3JhZ2UtYWNjb3VudC1uYW1lCiAgICAjIEs4cyBQVkMgbmFtZTogaHR0cHM6Ly9rdWJlcm5ldGVzLmlvL2RvY3MvY29uY2VwdHMvb3ZlcnZpZXcvd29ya2luZy13aXRoLW9iamVjdHMvbmFtZXMvI2Rucy1zdWJkb21haW4tbmFtZXMKICAgIHJlZ2V4Lm1hdGNoKGBeXC9cLyhbYS16MC05XXszLDI0fSlcLmZpbGVcLmNvcmVcLndpbmRvd3NcLm5ldFwvW2EtejAtOV0oW2EtejAtOS4tXXswLDI1MX1bYS16MC05XSk/JGAsIGlfc3RvcmFnZS5zb3VyY2UpCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDQ6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMTogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgIT0gIm92ZXJsYXlmcyIKICAgIHBfc3RvcmFnZS5vcHRpb25zID09IGlfc3RvcmFnZS5vcHRpb25zCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAxOiB0cnVlIikKfQphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIGNvdW50KHBfc3RvcmFnZS5vcHRpb25zKSA9PSAyCgogICAgcG9saWN5X2lkcyA6PSBzcGxpdChwX3N0b3JhZ2Uub3B0aW9uc1swXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBwb2xpY3lfaWRzID0iLCBwb2xpY3lfaWRzKQogICAgcG9saWN5X2lkcyA9PSBsYXllcl9pZHMKCiAgICBwb2xpY3lfaGFzaGVzIDo9IHNwbGl0KHBfc3RvcmFnZS5vcHRpb25zWzFdLCAiOiIpCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IHBvbGljeV9oYXNoZXMgPSIsIHBvbGljeV9oYXNoZXMpCgogICAgcF9jb3VudCA6PSBjb3VudChwb2xpY3lfaWRzKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBwX2NvdW50ID0iLCBwX2NvdW50KQogICAgcF9jb3VudCA+PSAxCiAgICBwX2NvdW50ID09IGNvdW50KHBvbGljeV9oYXNoZXMpCgogICAgaV9jb3VudCA6PSBjb3VudChpX3N0b3JhZ2Uub3B0aW9ucykKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogaV9jb3VudCA9IiwgaV9jb3VudCkKICAgIGlfY291bnQgPT0gcF9jb3VudCArIDMKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zWzBdID0iLCBpX3N0b3JhZ2Uub3B0aW9uc1swXSkKICAgIGlfc3RvcmFnZS5vcHRpb25zWzBdID09ICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQubGF5ZXItc3JjLXByZWZpeD0vdmFyL2xpYi9jb250YWluZXJkL2lvLmNvbnRhaW5lcmQuc25hcHNob3R0ZXIudjEudGFyZGV2L2xheWVycyIKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zW2lfY291bnQgLSAyXSA9IiwgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDJdKQogICAgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDJdID09ICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQub3ZlcmxheS1ydyIKCiAgICBsb3dlcmRpciA6PSBjb25jYXQoIj0iLCBbImxvd2VyZGlyIiwgcF9zdG9yYWdlLm9wdGlvbnNbMF1dKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBsb3dlcmRpciA9IiwgbG93ZXJkaXIpCgogICAgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDFdID09IGxvd2VyZGlyCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zW2lfY291bnQgLSAxXSA9IiwgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDFdKQoKICAgIGV2ZXJ5IGksIHBvbGljeV9pZCBpbiBwb2xpY3lfaWRzIHsKICAgICAgICBhbGxvd19vdmVybGF5X2xheWVyKHBvbGljeV9pZCwgcG9saWN5X2hhc2hlc1tpXSwgaV9zdG9yYWdlLm9wdGlvbnNbaSArIDFdKQogICAgfQoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogdHJ1ZSIpCn0KYWxsb3dfc3RvcmFnZV9vcHRpb25zKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKSB7CiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDM6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCiAgICBjb3VudChwX3N0b3JhZ2Uub3B0aW9ucykgPT0gMQoKICAgIHN0YXJ0c3dpdGgocF9zdG9yYWdlLm9wdGlvbnNbMF0sICIkKGhhc2giKQogICAgaGFzaF9zdWZmaXggOj0gdHJpbV9sZWZ0KHBfc3RvcmFnZS5vcHRpb25zWzBdLCAiJChoYXNoIikKCiAgICBlbmRzd2l0aChoYXNoX3N1ZmZpeCwgIikiKQogICAgaGFzaF9pbmRleCA6PSB0cmltX3JpZ2h0KGhhc2hfc3VmZml4LCAiKSIpCiAgICBpIDo9IHRvX251bWJlcihoYXNoX2luZGV4KQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAzOiBpID0iLCBpKQoKICAgIGhhc2hfb3B0aW9uIDo9IGNvbmNhdCgiPSIsIFsiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LnJvb3QtaGFzaCIsIHJvb3RfaGFzaGVzW2ldXSkKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMzogaGFzaF9vcHRpb24gPSIsIGhhc2hfb3B0aW9uKQoKICAgIGNvdW50KGlfc3RvcmFnZS5vcHRpb25zKSA9PSA0CiAgICBpX3N0b3JhZ2Uub3B0aW9uc1swXSA9PSAicm8iCiAgICBpX3N0b3JhZ2Uub3B0aW9uc1sxXSA9PSAiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmJsb2NrX2RldmljZT1maWxlIgogICAgaV9zdG9yYWdlLm9wdGlvbnNbMl0gPT0gImlvLmthdGFjb250YWluZXJzLmZzLW9wdC5pcy1sYXllciIKICAgIGlfc3RvcmFnZS5vcHRpb25zWzNdID09IGhhc2hfb3B0aW9uCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAzOiB0cnVlIikKfQphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgNDogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gInNtYiIKICAgIHBfb3B0c19jb3VudCA6PSBjb3VudChwX3N0b3JhZ2Uub3B0aW9ucykKICAgIGlfb3B0c19jb3VudCA6PSBjb3VudChpX3N0b3JhZ2Uub3B0aW9ucykKICAgIGlfb3B0c19jb3VudCA9PSBwX29wdHNfY291bnQgKyAyCgogICAgaV9vcHRfbWF0Y2hlcyA6PSBbaSB8IGkgOj0gaWR4OyBpZHggPCBwX29wdHNfY291bnQ7IHBfc3RvcmFnZS5vcHRpb25zW2lkeF0gPT0gaV9zdG9yYWdlLm9wdGlvbnNbaWR4XV0KICAgIGNvdW50KGlfb3B0X21hdGNoZXMpID09IHBfb3B0c19jb3VudAoKICAgIHN0YXJ0c3dpdGgoaV9zdG9yYWdlLm9wdGlvbnNbaV9vcHRzX2NvdW50LTJdLCAiYWRkcj0iKQogICAgY3JlZHMgPSBzcGxpdChpX3N0b3JhZ2Uub3B0aW9uc1tpX29wdHNfY291bnQtMV0sICIsIikKICAgIGNvdW50KGNyZWRzKSA9PSAyCiAgICBzdGFydHN3aXRoKGNyZWRzWzBdLCAidXNlcm5hbWU9IikKICAgIHN0YXJ0c3dpdGgoY3JlZHNbMV0sICJwYXNzd29yZD0iKQogICAgCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDQ6IHRydWUiKQp9CgphbGxvd19vdmVybGF5X2xheWVyKHBvbGljeV9pZCwgcG9saWN5X2hhc2gsIGlfb3B0aW9uKSB7CiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogcG9saWN5X2lkID0iLCBwb2xpY3lfaWQsICJwb2xpY3lfaGFzaCA9IiwgcG9saWN5X2hhc2gpCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogaV9vcHRpb24gPSIsIGlfb3B0aW9uKQoKICAgIHN0YXJ0c3dpdGgoaV9vcHRpb24sICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQubGF5ZXI9IikKICAgIGlfdmFsdWUgOj0gcmVwbGFjZShpX29wdGlvbiwgImlvLmthdGFjb250YWluZXJzLmZzLW9wdC5sYXllcj0iLCAiIikKICAgIGlfdmFsdWVfZGVjb2RlZCA6PSBiYXNlNjQuZGVjb2RlKGlfdmFsdWUpCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogaV92YWx1ZV9kZWNvZGVkID0iLCBpX3ZhbHVlX2RlY29kZWQpCgogICAgcG9saWN5X3N1ZmZpeCA6PSBjb25jYXQoIj0iLCBbInRhcixybyxpby5rYXRhY29udGFpbmVycy5mcy1vcHQuYmxvY2tfZGV2aWNlPWZpbGUsaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmlzLWxheWVyLGlvLmthdGFjb250YWluZXJzLmZzLW9wdC5yb290LWhhc2giLCBwb2xpY3lfaGFzaF0pCiAgICBwX3ZhbHVlIDo9IGNvbmNhdCgiLCIsIFtwb2xpY3lfaWQsIHBvbGljeV9zdWZmaXhdKQogICAgcHJpbnQoImFsbG93X292ZXJsYXlfbGF5ZXI6IHBfdmFsdWUgPSIsIHBfdmFsdWUpCgogICAgcF92YWx1ZSA9PSBpX3ZhbHVlX2RlY29kZWQKCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogdHJ1ZSIpCn0KCmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAidGFyIgoKICAgIHN0YXJ0c3dpdGgocF9zdG9yYWdlLm1vdW50X3BvaW50LCAiJChsYXllciIpCiAgICBtb3VudF9zdWZmaXggOj0gdHJpbV9sZWZ0KHBfc3RvcmFnZS5tb3VudF9wb2ludCwgIiQobGF5ZXIiKQoKICAgIGVuZHN3aXRoKG1vdW50X3N1ZmZpeCwgIikiKQogICAgbGF5ZXJfaW5kZXggOj0gdHJpbV9yaWdodChtb3VudF9zdWZmaXgsICIpIikKICAgIGkgOj0gdG9fbnVtYmVyKGxheWVyX2luZGV4KQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDE6IGkgPSIsIGkpCgogICAgbGF5ZXJfaWQgOj0gbGF5ZXJfaWRzW2ldCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMTogbGF5ZXJfaWQgPSIsIGxheWVyX2lkKQoKICAgIHBfbW91bnQgOj0gY29uY2F0KCIvIiwgWyIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L2xheWVycyIsIGxheWVyX2lkXSkKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCAxOiBwX21vdW50ID0iLCBwX21vdW50KQoKICAgIHBfbW91bnQgPT0gaV9zdG9yYWdlLm1vdW50X3BvaW50CgogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDE6IHRydWUiKQp9CmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAiZnVzZTMua2F0YS1vdmVybGF5IgoKICAgIG1vdW50MSA6PSByZXBsYWNlKHBfc3RvcmFnZS5tb3VudF9wb2ludCwgIiQoY3BhdGgpIiwgcG9saWN5X2RhdGEuY29tbW9uLmNwYXRoKQogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDI6IG1vdW50MiA9IiwgbW91bnQyKQoKICAgIG1vdW50MiA9PSBpX3N0b3JhZ2UubW91bnRfcG9pbnQKCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMjogdHJ1ZSIpCn0KYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKSB7CiAgICBwX3N0b3JhZ2UuZnN0eXBlID09ICJsb2NhbCIKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQyID0iLCBtb3VudDIpCgogICAgbW91bnQzIDo9IHJlcGxhY2UobW91bnQyLCAiJChzYW5kYm94LWlkKSIsIHNhbmRib3hfaWQpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQzID0iLCBtb3VudDMpCgogICAgcmVnZXgubWF0Y2gobW91bnQzLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCgogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDM6IHRydWUiKQp9CmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAiYmluZCIKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNDogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNDogbW91bnQyID0iLCBtb3VudDIpCgogICAgbW91bnQzIDo9IHJlcGxhY2UobW91bnQyLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDQ6IG1vdW50MyA9IiwgbW91bnQzKQoKICAgIHJlZ2V4Lm1hdGNoKG1vdW50MywgaV9zdG9yYWdlLm1vdW50X3BvaW50KQoKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA0OiB0cnVlIikKfQphbGxvd19tb3VudF9wb2ludChwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgYnVuZGxlX2lkLCBzYW5kYm94X2lkLCBsYXllcl9pZHMpIHsKICAgIHBfc3RvcmFnZS5mc3R5cGUgPT0gInRtcGZzIgoKICAgIG1vdW50MSA6PSBwX3N0b3JhZ2UubW91bnRfcG9pbnQKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA1OiBtb3VudDEgPSIsIG1vdW50MSkKCiAgICByZWdleC5tYXRjaChtb3VudDEsIGlfc3RvcmFnZS5tb3VudF9wb2ludCkKCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNTogdHJ1ZSIpCn0KYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKSB7CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogaV9zdG9yYWdlLm1vdW50X3BvaW50ID0iLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCiAgICBhbGxvd19kaXJlY3Rfdm9sX2RyaXZlcihwX3N0b3JhZ2UsIGlfc3RvcmFnZSkKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChzcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQyID0iLCBtb3VudDIpCgogICAgZGlyZWN0X3ZvbF9wYXRoIDo9IGlfc3RvcmFnZS5zb3VyY2UKICAgIG1vdW50MyA6PSByZXBsYWNlKG1vdW50MiwgIiQoYjY0LWRpcmVjdC12b2wtcGF0aCkiLCBiYXNlNjR1cmwuZW5jb2RlKGRpcmVjdF92b2xfcGF0aCkpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQzID0iLCBtb3VudDMpCgogICAgbW91bnQzID09IGlfc3RvcmFnZS5tb3VudF9wb2ludAoKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA2OiB0cnVlIikKfQoKYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIocF9zdG9yYWdlLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19kaXJlY3Rfdm9sX2RyaXZlciAxOiBzdGFydCIpCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCiAgICBwcmludCgiYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIgMTogdHJ1ZSIpCn0KYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIocF9zdG9yYWdlLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19kaXJlY3Rfdm9sX2RyaXZlciAyOiBzdGFydCIpCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJzbWIiCiAgICBwcmludCgiYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIgMjogdHJ1ZSIpCn0KCiMgRXhlY1Byb2Nlc3NSZXF1ZXN0LnByb2Nlc3MuQ2FwYWJpbGl0aWVzCmFsbG93X2V4ZWNfY2FwcyhpX2NhcHMpIHsKICAgIG5vdCBpX2NhcHMuQW1iaWVudAogICAgbm90IGlfY2Fwcy5Cb3VuZGluZwogICAgbm90IGlfY2Fwcy5FZmZlY3RpdmUKICAgIG5vdCBpX2NhcHMuSW5oZXJpdGFibGUKICAgIG5vdCBpX2NhcHMuUGVybWl0dGVkCn0KCiMgT0NJLlByb2Nlc3MuQ2FwYWJpbGl0aWVzCmFsbG93X2NhcHMocF9jYXBzLCBpX2NhcHMpIHsKICAgIHByaW50KCJhbGxvd19jYXBzOiBwb2xpY3kgQW1iaWVudCA9IiwgcF9jYXBzLkFtYmllbnQpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgQW1iaWVudCA9IiwgaV9jYXBzLkFtYmllbnQpCiAgICBtYXRjaF9jYXBzKHBfY2Fwcy5BbWJpZW50LCBpX2NhcHMuQW1iaWVudCkKCiAgICBwcmludCgiYWxsb3dfY2FwczogcG9saWN5IEJvdW5kaW5nID0iLCBwX2NhcHMuQm91bmRpbmcpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgQm91bmRpbmcgPSIsIGlfY2Fwcy5Cb3VuZGluZykKICAgIG1hdGNoX2NhcHMocF9jYXBzLkJvdW5kaW5nLCBpX2NhcHMuQm91bmRpbmcpCgogICAgcHJpbnQoImFsbG93X2NhcHM6IHBvbGljeSBFZmZlY3RpdmUgPSIsIHBfY2Fwcy5FZmZlY3RpdmUpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgRWZmZWN0aXZlID0iLCBpX2NhcHMuRWZmZWN0aXZlKQogICAgbWF0Y2hfY2FwcyhwX2NhcHMuRWZmZWN0aXZlLCBpX2NhcHMuRWZmZWN0aXZlKQoKICAgIHByaW50KCJhbGxvd19jYXBzOiBwb2xpY3kgSW5oZXJpdGFibGUgPSIsIHBfY2Fwcy5Jbmhlcml0YWJsZSkKICAgIHByaW50KCJhbGxvd19jYXBzOiBpbnB1dCBJbmhlcml0YWJsZSA9IiwgaV9jYXBzLkluaGVyaXRhYmxlKQogICAgbWF0Y2hfY2FwcyhwX2NhcHMuSW5oZXJpdGFibGUsIGlfY2Fwcy5Jbmhlcml0YWJsZSkKCiAgICBwcmludCgiYWxsb3dfY2FwczogcG9saWN5IFBlcm1pdHRlZCA9IiwgcF9jYXBzLlBlcm1pdHRlZCkKICAgIHByaW50KCJhbGxvd19jYXBzOiBpbnB1dCBQZXJtaXR0ZWQgPSIsIGlfY2Fwcy5QZXJtaXR0ZWQpCiAgICBtYXRjaF9jYXBzKHBfY2Fwcy5QZXJtaXR0ZWQsIGlfY2Fwcy5QZXJtaXR0ZWQpCn0KCm1hdGNoX2NhcHMocF9jYXBzLCBpX2NhcHMpIHsKICAgIHByaW50KCJtYXRjaF9jYXBzIDE6IHN0YXJ0IikKCiAgICBwX2NhcHMgPT0gaV9jYXBzCgogICAgcHJpbnQoIm1hdGNoX2NhcHMgMTogdHJ1ZSIpCn0KbWF0Y2hfY2FwcyhwX2NhcHMsIGlfY2FwcykgewogICAgcHJpbnQoIm1hdGNoX2NhcHMgMjogc3RhcnQiKQoKICAgIGNvdW50KHBfY2FwcykgPT0gMQogICAgcF9jYXBzWzBdID09ICIkKGRlZmF1bHRfY2FwcykiCgogICAgcHJpbnQoIm1hdGNoX2NhcHMgMjogZGVmYXVsdF9jYXBzID0iLCBwb2xpY3lfZGF0YS5jb21tb24uZGVmYXVsdF9jYXBzKQogICAgcG9saWN5X2RhdGEuY29tbW9uLmRlZmF1bHRfY2FwcyA9PSBpX2NhcHMKCiAgICBwcmludCgibWF0Y2hfY2FwcyAyOiB0cnVlIikKfQptYXRjaF9jYXBzKHBfY2FwcywgaV9jYXBzKSB7CiAgICBwcmludCgibWF0Y2hfY2FwcyAzOiBzdGFydCIpCgogICAgY291bnQocF9jYXBzKSA9PSAxCiAgICBwX2NhcHNbMF0gPT0gIiQocHJpdmlsZWdlZF9jYXBzKSIKCiAgICBwcmludCgibWF0Y2hfY2FwcyAzOiBwcml2aWxlZ2VkX2NhcHMgPSIsIHBvbGljeV9kYXRhLmNvbW1vbi5wcml2aWxlZ2VkX2NhcHMpCiAgICBwb2xpY3lfZGF0YS5jb21tb24ucHJpdmlsZWdlZF9jYXBzID09IGlfY2FwcwoKICAgIHByaW50KCJtYXRjaF9jYXBzIDM6IHRydWUiKQp9CgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgpjaGVja19kaXJlY3RvcnlfdHJhdmVyc2FsKGlfcGF0aCkgewogICAgbm90IHJlZ2V4Lm1hdGNoKCIoXnwvKS4uKCR8LykiLCBpX3BhdGgpCn0KCmNoZWNrX3N5bWxpbmtfc291cmNlKGlfc3JjKSB7CiAgICBpX3NyYyA9PSAiIgogICAgcHJpbnQoImNoZWNrX3N5bWxpbmtfc291cmNlIDE6IHRydWUiKQp9CmNoZWNrX3N5bWxpbmtfc291cmNlKGlfc3JjKSB7CiAgICBpX3NyYyAhPSAiIgogICAgcHJpbnQoImNoZWNrX3N5bWxpbmtfc291cmNlIDI6IGlfc3JjID0iLCBpX3NyYykKCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24uc19zb3VyY2UxLCBpX3NyYykKCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMjogdHJ1ZSIpCn0KY2hlY2tfc3ltbGlua19zb3VyY2UoaV9zcmMpIHsKICAgIGlfc3JjICE9ICIiCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMzogaV9zcmMgPSIsIGlfc3JjKQoKICAgIHJlZ2V4Lm1hdGNoKHBvbGljeV9kYXRhLmNvbW1vbi5zX3NvdXJjZTIsIGlfc3JjKQogICAgY2hlY2tfZGlyZWN0b3J5X3RyYXZlcnNhbChpX3NyYykKCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMzogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfc3RvcmFnZXMoaV9zdG9yYWdlcykgewogICAgcHJpbnQoImFsbG93X3NhbmRib3hfc3RvcmFnZXM6IGlfc3RvcmFnZXMgPSIsIGlfc3RvcmFnZXMpCgogICAgcF9zdG9yYWdlcyA6PSBwb2xpY3lfZGF0YS5zYW5kYm94LnN0b3JhZ2VzCiAgICBldmVyeSBpX3N0b3JhZ2UgaW4gaV9zdG9yYWdlcyB7CiAgICAgICAgYWxsb3dfc2FuZGJveF9zdG9yYWdlKHBfc3RvcmFnZXMsIGlfc3RvcmFnZSkKICAgIH0KCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9zdG9yYWdlczogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfc3RvcmFnZShwX3N0b3JhZ2VzLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IGlfc3RvcmFnZSA9IiwgaV9zdG9yYWdlKQoKICAgIHNvbWUgcF9zdG9yYWdlIGluIHBfc3RvcmFnZXMKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IHBfc3RvcmFnZSA9IiwgcF9zdG9yYWdlKQogICAgaV9zdG9yYWdlID09IHBfc3RvcmFnZQoKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IHRydWUiKQp9CgpDb3B5RmlsZVJlcXVlc3QgewogICAgcHJpbnQoIkNvcHlGaWxlUmVxdWVzdDogaW5wdXQucGF0aCA9IiwgaW5wdXQucGF0aCkKCiAgICBjaGVja19zeW1saW5rX3NvdXJjZShpbnB1dC5zeW1saW5rX3NyYykKICAgIGNoZWNrX2RpcmVjdG9yeV90cmF2ZXJzYWwoaW5wdXQucGF0aCkKCiAgICBzb21lIHJlZ2V4MSBpbiBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLkNvcHlGaWxlUmVxdWVzdAogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5jcGF0aCkKICAgIHJlZ2V4NCA6PSByZXBsYWNlKHJlZ2V4MywgIiQoYnVuZGxlLWlkKSIsIEJVTkRMRV9JRCkKICAgIHByaW50KCJDb3B5RmlsZVJlcXVlc3Q6IHJlZ2V4NCA9IiwgcmVnZXg0KQoKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4NCwgaW5wdXQucGF0aCkKCiAgICBwcmludCgiQ29weUZpbGVSZXF1ZXN0OiB0cnVlIikKfQoKQ3JlYXRlU2FuZGJveFJlcXVlc3QgewogICAgcHJpbnQoIkNyZWF0ZVNhbmRib3hSZXF1ZXN0OiBpbnB1dC5ndWVzdF9ob29rX3BhdGggPSIsIGlucHV0Lmd1ZXN0X2hvb2tfcGF0aCkKICAgIGNvdW50KGlucHV0Lmd1ZXN0X2hvb2tfcGF0aCkgPT0gMAoKICAgIHByaW50KCJDcmVhdGVTYW5kYm94UmVxdWVzdDogaW5wdXQua2VybmVsX21vZHVsZXMgPSIsIGlucHV0Lmtlcm5lbF9tb2R1bGVzKQogICAgY291bnQoaW5wdXQua2VybmVsX21vZHVsZXMpID09IDAKCiAgICBpX3BpZG5zIDo9IGlucHV0LnNhbmRib3hfcGlkbnMKICAgIHByaW50KCJDcmVhdGVTYW5kYm94UmVxdWVzdDogaV9waWRucyA9IiwgaV9waWRucykKICAgIGlfcGlkbnMgPT0gZmFsc2UKICAgIGFsbG93X3NhbmRib3hfc3RvcmFnZXMoaW5wdXQuc3RvcmFnZXMpCn0KCmFsbG93X2V4ZWMocF9jb250YWluZXIsIGlfcHJvY2VzcykgewogICAgcHJpbnQoImFsbG93X2V4ZWM6IHN0YXJ0IikKCiAgICBwX29jaSA9IHBfY29udGFpbmVyLk9DSQogICAgcF9zX25hbWUgPSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc19uYW1lc3BhY2UgPSBnZXRfc3RhdGVfdmFsKCJuYW1lc3BhY2UiKQogICAgYWxsb3dfcHJvYmVfcHJvY2VzcyhwX29jaS5Qcm9jZXNzLCBpX3Byb2Nlc3MsIHBfc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfZXhlYzogdHJ1ZSIpCn0KCmFsbG93X2ludGVyYWN0aXZlX2V4ZWMocF9jb250YWluZXIsIGlfcHJvY2VzcykgewogICAgcHJpbnQoImFsbG93X2ludGVyYWN0aXZlX2V4ZWM6IHN0YXJ0IikKCiAgICBwX29jaSA9IHBfY29udGFpbmVyLk9DSQogICAgcF9zX25hbWUgPSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc19uYW1lc3BhY2UgPSBnZXRfc3RhdGVfdmFsKCJuYW1lc3BhY2UiKQogICAgYWxsb3dfaW50ZXJhY3RpdmVfcHJvY2VzcyhwX29jaS5Qcm9jZXNzLCBpX3Byb2Nlc3MsIHBfc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfaW50ZXJhY3RpdmVfZXhlYzogdHJ1ZSIpCn0KCiMgVE9ETzogc2hvdWxkIG90aGVyIEV4ZWNQcm9jZXNzUmVxdWVzdCBpbnB1dCBkYXRhIGZpZWxkcyBiZSB2YWxpZGF0ZWQgYXMgd2VsbD8KRXhlY1Byb2Nlc3NSZXF1ZXN0IHsKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMTogaW5wdXQgPSIsIGlucHV0KQoKICAgIHNvbWUgcF9jb21tYW5kIGluIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuRXhlY1Byb2Nlc3NSZXF1ZXN0LmFsbG93ZWRfY29tbWFuZHMKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMTogcF9jb21tYW5kID0iLCBwX2NvbW1hbmQpCiAgICBwX2NvbW1hbmQgPT0gaW5wdXQucHJvY2Vzcy5BcmdzCgogICAgIyBUT0RPOiBtYXRjaCBwX2NvbnRhaW5lcidzIElEIHdpdGggdGhlIGlucHV0IGNvbnRhaW5lcl9pZC4KICAgIHNvbWUgcF9jb250YWluZXIgaW4gcG9saWN5X2RhdGEuY29udGFpbmVycwogICAgYWxsb3dfaW50ZXJhY3RpdmVfZXhlYyhwX2NvbnRhaW5lciwgaW5wdXQucHJvY2VzcykKCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDE6IHRydWUiKQp9CkV4ZWNQcm9jZXNzUmVxdWVzdCB7CiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDI6IGlucHV0ID0iLCBpbnB1dCkKCiAgICAjIFRPRE86IG1hdGNoIGlucHV0IGNvbnRhaW5lciBJRCB3aXRoIGl0cyBjb3JyZXNwb25kaW5nIGNvbnRhaW5lci5leGVjX2NvbW1hbmRzLgogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBzb21lIHBfY29tbWFuZCBpbiBwX2NvbnRhaW5lci5leGVjX2NvbW1hbmRzCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDI6IHBfY29tbWFuZCA9IiwgcF9jb21tYW5kKQoKICAgICMgVE9ETzogc2hvdWxkIG90aGVyIGlucHV0IGRhdGEgZmllbGRzIGJlIHZhbGlkYXRlZCBhcyB3ZWxsPwogICAgcF9jb21tYW5kID09IGlucHV0LnByb2Nlc3MuQXJncwoKICAgIGFsbG93X2V4ZWMocF9jb250YWluZXIsIGlucHV0LnByb2Nlc3MpCgogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAyOiB0cnVlIikKfQpFeGVjUHJvY2Vzc1JlcXVlc3QgewogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAzOiBpbnB1dCA9IiwgaW5wdXQpCgogICAgaV9jb21tYW5kID0gY29uY2F0KCIgIiwgaW5wdXQucHJvY2Vzcy5BcmdzKQogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAzOiBpX2NvbW1hbmQgPSIsIGlfY29tbWFuZCkKCiAgICBzb21lIHBfcmVnZXggaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5FeGVjUHJvY2Vzc1JlcXVlc3QucmVnZXgKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMzogcF9yZWdleCA9IiwgcF9yZWdleCkKCiAgICByZWdleC5tYXRjaChwX3JlZ2V4LCBpX2NvbW1hbmQpCgogICAgIyBUT0RPOiBtYXRjaCBwX2NvbnRhaW5lcidzIElEIHdpdGggdGhlIGlucHV0IGNvbnRhaW5lcl9pZC4KICAgIHNvbWUgcF9jb250YWluZXIgaW4gcG9saWN5X2RhdGEuY29udGFpbmVycwogICAgYWxsb3dfaW50ZXJhY3RpdmVfZXhlYyhwX2NvbnRhaW5lciwgaW5wdXQucHJvY2VzcykKCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDM6IHRydWUiKQp9CgpVcGRhdGVSb3V0ZXNSZXF1ZXN0IHsKICAgIHByaW50KCJVcGRhdGVSb3V0ZXNSZXF1ZXN0OiBpbnB1dCA9IiwgaW5wdXQpCiAgICBwcmludCgiVXBkYXRlUm91dGVzUmVxdWVzdDogcG9saWN5ID0iLCBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLlVwZGF0ZVJvdXRlc1JlcXVlc3QpCgogICAgaV9yb3V0ZXMgOj0gaW5wdXQucm91dGVzLlJvdXRlcwogICAgcF9zb3VyY2VfcmVnZXggPSBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLlVwZGF0ZVJvdXRlc1JlcXVlc3QuZm9yYmlkZGVuX3NvdXJjZV9yZWdleAogICAgcF9uYW1lcyA9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuVXBkYXRlUm91dGVzUmVxdWVzdC5mb3JiaWRkZW5fZGV2aWNlX25hbWVzCgogICAgZXZlcnkgaV9yb3V0ZSBpbiBpX3JvdXRlcyB7CiAgICAgICAgcHJpbnQoImlfcm91dGUuc291cmNlID0iLCBpX3JvdXRlLnNvdXJjZSkKICAgICAgICBldmVyeSBwX3JlZ2V4IGluIHBfc291cmNlX3JlZ2V4IHsKICAgICAgICAgICAgcHJpbnQoInBfcmVnZXggPSIsIHBfcmVnZXgpCiAgICAgICAgICAgIG5vdCByZWdleC5tYXRjaChwX3JlZ2V4LCBpX3JvdXRlLnNvdXJjZSkKICAgICAgICB9CgogICAgICAgIHByaW50KCJpX3JvdXRlLmRldmljZSA9IiwgaV9yb3V0ZS5kZXZpY2UpCiAgICAgICAgbm90IGlfcm91dGUuZGV2aWNlIGluIHBfbmFtZXMKICAgIH0KCiAgICBwcmludCgiVXBkYXRlUm91dGVzUmVxdWVzdDogdHJ1ZSIpCn0KClVwZGF0ZUludGVyZmFjZVJlcXVlc3QgewogICAgcHJpbnQoIlVwZGF0ZUludGVyZmFjZVJlcXVlc3Q6IGlucHV0ID0iLCBpbnB1dCkKICAgIHByaW50KCJVcGRhdGVJbnRlcmZhY2VSZXF1ZXN0OiBwb2xpY3kgPSIsIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuVXBkYXRlSW50ZXJmYWNlUmVxdWVzdCkKCiAgICBpX2ludGVyZmFjZSA6PSBpbnB1dC5pbnRlcmZhY2UKICAgIHBfZmxhZ3MgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmFsbG93X3Jhd19mbGFncwoKICAgICMgVHlwaWNhbGx5LCBqdXN0IElGRl9OT0FSUCBpcyB1c2VkLgogICAgYml0cy5hbmQoaV9pbnRlcmZhY2UucmF3X2ZsYWdzLCBiaXRzLm5lZ2F0ZShwX2ZsYWdzKSkgPT0gMAoKICAgIHBfbmFtZXMgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmZvcmJpZGRlbl9uYW1lcwoKICAgIG5vdCBpX2ludGVyZmFjZS5uYW1lIGluIHBfbmFtZXMKCiAgICBwX2h3YWRkcnMgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmZvcmJpZGRlbl9od19hZGRycwoKICAgIG5vdCBpX2ludGVyZmFjZS5od0FkZHIgaW4gcF9od2FkZHJzCgogICAgcHJpbnQoIlVwZGF0ZUludGVyZmFjZVJlcXVlc3Q6IHRydWUiKQp9CgpDbG9zZVN0ZGluUmVxdWVzdCB7CiAgICBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLkNsb3NlU3RkaW5SZXF1ZXN0ID09IHRydWUKfQoKUmVhZFN0cmVhbVJlcXVlc3QgewogICAgcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5SZWFkU3RyZWFtUmVxdWVzdCA9PSB0cnVlCn0KClVwZGF0ZUVwaGVtZXJhbE1vdW50c1JlcXVlc3QgewogICAgcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVFcGhlbWVyYWxNb3VudHNSZXF1ZXN0ID09IHRydWUKfQoKV3JpdGVTdHJlYW1SZXF1ZXN0IHsKICAgIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuV3JpdGVTdHJlYW1SZXF1ZXN0ID09IHRydWUKfQoKcG9saWN5X2RhdGEgOj0gewogICJjb250YWluZXJzIjogWwogICAgewogICAgICAiT0NJIjogewogICAgICAgICJWZXJzaW9uIjogIjEuMS4wLXJjLjEiLAogICAgICAgICJQcm9jZXNzIjogewogICAgICAgICAgIlRlcm1pbmFsIjogZmFsc2UsCiAgICAgICAgICAiVXNlciI6IHsKICAgICAgICAgICAgIlVJRCI6IDY1NTM1LAogICAgICAgICAgICAiR0lEIjogNjU1MzUsCiAgICAgICAgICAgICJBZGRpdGlvbmFsR2lkcyI6IFtdLAogICAgICAgICAgICAiVXNlcm5hbWUiOiAiIgogICAgICAgICAgfSwKICAgICAgICAgICJEZXByZWNhdGVkQXJncyI6IFsKICAgICAgICAgICAgIi9wYXVzZSIKICAgICAgICAgIF0sCiAgICAgICAgICAiQXJncyI6IFsKICAgICAgICAgICAgIi9wYXVzZSIKICAgICAgICAgIF0sCiAgICAgICAgICAiRW52IjogWwogICAgICAgICAgICAiUEFUSD0vdXNyL2xvY2FsL3NiaW46L3Vzci9sb2NhbC9iaW46L3Vzci9zYmluOi91c3IvYmluOi9zYmluOi9iaW4iCiAgICAgICAgICBdLAogICAgICAgICAgIkN3ZCI6ICIvIiwKICAgICAgICAgICJDYXBhYmlsaXRpZXMiOiB7CiAgICAgICAgICAgICJBbWJpZW50IjogW10sCiAgICAgICAgICAgICJCb3VuZGluZyI6IFsKICAgICAgICAgICAgICAiJChkZWZhdWx0X2NhcHMpIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiRWZmZWN0aXZlIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJJbmhlcml0YWJsZSI6IFtdLAogICAgICAgICAgICAiUGVybWl0dGVkIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICAiTm9OZXdQcml2aWxlZ2VzIjogdHJ1ZQogICAgICAgIH0sCiAgICAgICAgIlJvb3QiOiB7CiAgICAgICAgICAiUGF0aCI6ICIkKGNwYXRoKS8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgIlJlYWRvbmx5IjogdHJ1ZQogICAgICAgIH0sCiAgICAgICAgIk1vdW50cyI6IFsKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9wcm9jIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJwcm9jIiwKICAgICAgICAgICAgInR5cGVfIjogInByb2MiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2IiwKICAgICAgICAgICAgInNvdXJjZSI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJzdHJpY3RhdGltZSIsCiAgICAgICAgICAgICAgIm1vZGU9NzU1IiwKICAgICAgICAgICAgICAic2l6ZT02NTUzNmsiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L3B0cyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiZGV2cHRzIiwKICAgICAgICAgICAgInR5cGVfIjogImRldnB0cyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJuZXdpbnN0YW5jZSIsCiAgICAgICAgICAgICAgInB0bXhtb2RlPTA2NjYiLAogICAgICAgICAgICAgICJtb2RlPTA2MjAiLAogICAgICAgICAgICAgICJnaWQ9NSIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvc2htIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L3NobSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi9tcXVldWUiLAogICAgICAgICAgICAic291cmNlIjogIm1xdWV1ZSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJtcXVldWUiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvc3lzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJzeXNmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJzeXNmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2V0Yy9yZXNvbHYuY29uZiIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClyZXNvbHYuY29uZiQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJvIiwKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9kZXYiLAogICAgICAgICAgICAgICJub2V4ZWMiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0KICAgICAgICBdLAogICAgICAgICJBbm5vdGF0aW9ucyI6IHsKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmJ1bmRsZV9wYXRoIjogIi9ydW4vY29udGFpbmVyZC9pby5jb250YWluZXJkLnJ1bnRpbWUudjIudGFzay9rOHMuaW8vJChidW5kbGUtaWQpIiwKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIjogInBvZF9zYW5kYm94IiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSI6ICJzYW5kYm94IiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWlkIjogIl5bYS16MC05XXs2NH0kIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWxvZy1kaXJlY3RvcnkiOiAiXi92YXIvbG9nL3BvZHMvJChzYW5kYm94LW5hbWVzcGFjZSlfJChzYW5kYm94LW5hbWUpX1swLTlhLWZdezh9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezEyfSQiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZSI6ICJecG9kXFwtbGlmZWN5Y2xlJCIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1uYW1lc3BhY2UiOiAiIiwKICAgICAgICAgICJuZXJkY3RsL25ldHdvcmstbmFtZXNwYWNlIjogIl4vdmFyL3J1bi9uZXRucy9jbmktWzAtOWEtZl17OH0tWzAtOWEtZl17NH0tWzAtOWEtZl17NH0tWzAtOWEtZl17NH0tWzAtOWEtZl17MTJ9JCIKICAgICAgICB9LAogICAgICAgICJMaW51eCI6IHsKICAgICAgICAgICJOYW1lc3BhY2VzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgIlR5cGUiOiAiaXBjIiwKICAgICAgICAgICAgICAiUGF0aCI6ICIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiVHlwZSI6ICJ1dHMiLAogICAgICAgICAgICAgICJQYXRoIjogIiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJUeXBlIjogIm1vdW50IiwKICAgICAgICAgICAgICAiUGF0aCI6ICIiCiAgICAgICAgICAgIH0KICAgICAgICAgIF0sCiAgICAgICAgICAiTWFza2VkUGF0aHMiOiBbCiAgICAgICAgICAgICIvcHJvYy9hY3BpIiwKICAgICAgICAgICAgIi9wcm9jL2Fzb3VuZCIsCiAgICAgICAgICAgICIvcHJvYy9rY29yZSIsCiAgICAgICAgICAgICIvcHJvYy9rZXlzIiwKICAgICAgICAgICAgIi9wcm9jL2xhdGVuY3lfc3RhdHMiLAogICAgICAgICAgICAiL3Byb2MvdGltZXJfbGlzdCIsCiAgICAgICAgICAgICIvcHJvYy90aW1lcl9zdGF0cyIsCiAgICAgICAgICAgICIvcHJvYy9zY2hlZF9kZWJ1ZyIsCiAgICAgICAgICAgICIvc3lzL2Zpcm13YXJlIiwKICAgICAgICAgICAgIi9wcm9jL3Njc2kiCiAgICAgICAgICBdLAogICAgICAgICAgIlJlYWRvbmx5UGF0aHMiOiBbCiAgICAgICAgICAgICIvcHJvYy9idXMiLAogICAgICAgICAgICAiL3Byb2MvZnMiLAogICAgICAgICAgICAiL3Byb2MvaXJxIiwKICAgICAgICAgICAgIi9wcm9jL3N5cyIsCiAgICAgICAgICAgICIvcHJvYy9zeXNycS10cmlnZ2VyIgogICAgICAgICAgXSwKICAgICAgICAgICJEZXZpY2VzIjogW10sCiAgICAgICAgICAiU3lzY3RsIjogewogICAgICAgICAgICAibmV0LmlwdjQuaXBfdW5wcml2aWxlZ2VkX3BvcnRfc3RhcnQiOiAiMCIsCiAgICAgICAgICAgICJuZXQuaXB2NC5waW5nX2dyb3VwX3JhbmdlIjogIjAgMjE0NzQ4MzY0NyIKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0sCiAgICAgICJzdG9yYWdlcyI6IFsKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoMCkiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXIwKSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogIm92ZXJsYXlmcyIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAiZnVzZTMua2F0YS1vdmVybGF5IiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiNWE1YWFkODAwNTVmZjIwMDEyYTUwZGMyNWY4ZGY3YTI5OTI0NDc0MzI0ZDY1ZjdkNTMwNmVlOGVlMjdmZjcxZCIsCiAgICAgICAgICAgICI4MTcyNTBmMWEzZTMzNmRhNzZmNWJkM2ZhNzg0ZTFiMjZkOTU5YjljMTMxODc2ODE1YmEyNjA0MDQ4YjcwYzE4IgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGNwYXRoKS8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0KICAgICAgXSwKICAgICAgImRldmljZXMiOiBbXSwKICAgICAgInNhbmRib3hfcGlkbnMiOiBmYWxzZSwKICAgICAgImV4ZWNfY29tbWFuZHMiOiBbXSwKICAgICAgImVudl9tYXAiOiB7CiAgICAgICAgIlBBVEgiOiAiL3Vzci9sb2NhbC9zYmluOi91c3IvbG9jYWwvYmluOi91c3Ivc2JpbjovdXNyL2Jpbjovc2JpbjovYmluIgogICAgICB9CiAgICB9LAogICAgewogICAgICAiT0NJIjogewogICAgICAgICJWZXJzaW9uIjogIjEuMS4wLXJjLjEiLAogICAgICAgICJQcm9jZXNzIjogewogICAgICAgICAgIlRlcm1pbmFsIjogZmFsc2UsCiAgICAgICAgICAiVXNlciI6IHsKICAgICAgICAgICAgIlVJRCI6IDAsCiAgICAgICAgICAgICJHSUQiOiAwLAogICAgICAgICAgICAiQWRkaXRpb25hbEdpZHMiOiBbXSwKICAgICAgICAgICAgIlVzZXJuYW1lIjogIiIKICAgICAgICAgIH0sCiAgICAgICAgICAiRGVwcmVjYXRlZEFyZ3MiOiBbCiAgICAgICAgICAgICIvYmluL3NoIiwKICAgICAgICAgICAgIi1jIiwKICAgICAgICAgICAgIndoaWxlIHRydWU7IGRvIGVjaG8gJChzYW5kYm94LW5hbWUpOyBzbGVlcCAxMDsgZG9uZSIKICAgICAgICAgIF0sCiAgICAgICAgICAiQXJncyI6IFsKICAgICAgICAgICAgIi9iaW4vc2giLAogICAgICAgICAgICAiLWMiLAogICAgICAgICAgICAid2hpbGUgdHJ1ZTsgZG8gZWNobyAkKFBPRF9OQU1FKTsgc2xlZXAgMTA7IGRvbmUiCiAgICAgICAgICBdLAogICAgICAgICAgIkVudiI6IFsKICAgICAgICAgICAgIlBBVEg9L3Vzci9sb2NhbC9zYmluOi91c3IvbG9jYWwvYmluOi91c3Ivc2JpbjovdXNyL2Jpbjovc2JpbjovYmluIiwKICAgICAgICAgICAgIkhPU1ROQU1FPSQoaG9zdC1uYW1lKSIsCiAgICAgICAgICAgICJQT0RfTkFNRT0kKHNhbmRib3gtbmFtZSkiLAogICAgICAgICAgICAiUE9EX05BTUVTUEFDRT0kKHNhbmRib3gtbmFtZXNwYWNlKSIsCiAgICAgICAgICAgICJQT0RfSVA9JChwb2QtaXApIiwKICAgICAgICAgICAgIlNFUlZJQ0VfQUNDT1VOVD1kZWZhdWx0IiwKICAgICAgICAgICAgIlBST1hZX0NPTkZJRz17fVxuIiwKICAgICAgICAgICAgIklTVElPX01FVEFfUE9EX1BPUlRTPVtcbl0iLAogICAgICAgICAgICAiSVNUSU9fTUVUQV9BUFBfQ09OVEFJTkVSUz1zZXJ2aWNlYWNsaWVudCIsCiAgICAgICAgICAgICJJU1RJT19NRVRBX0NMVVNURVJfSUQ9S3ViZXJuZXRlcyIsCiAgICAgICAgICAgICJJU1RJT19NRVRBX05PREVfTkFNRT0kKG5vZGUtbmFtZSkiCiAgICAgICAgICBdLAogICAgICAgICAgIkN3ZCI6ICIvIiwKICAgICAgICAgICJDYXBhYmlsaXRpZXMiOiB7CiAgICAgICAgICAgICJBbWJpZW50IjogW10sCiAgICAgICAgICAgICJCb3VuZGluZyI6IFsKICAgICAgICAgICAgICAiJChwcml2aWxlZ2VkX2NhcHMpIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiRWZmZWN0aXZlIjogWwogICAgICAgICAgICAgICIkKHByaXZpbGVnZWRfY2FwcykiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJJbmhlcml0YWJsZSI6IFtdLAogICAgICAgICAgICAiUGVybWl0dGVkIjogWwogICAgICAgICAgICAgICIkKHByaXZpbGVnZWRfY2FwcykiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICAiTm9OZXdQcml2aWxlZ2VzIjogZmFsc2UKICAgICAgICB9LAogICAgICAgICJSb290IjogewogICAgICAgICAgIlBhdGgiOiAiJChjcGF0aCkvJChidW5kbGUtaWQpIiwKICAgICAgICAgICJSZWFkb25seSI6IGZhbHNlCiAgICAgICAgfSwKICAgICAgICAiTW91bnRzIjogWwogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL3Byb2MiLAogICAgICAgICAgICAic291cmNlIjogInByb2MiLAogICAgICAgICAgICAidHlwZV8iOiAicHJvYyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYiLAogICAgICAgICAgICAic291cmNlIjogInRtcGZzIiwKICAgICAgICAgICAgInR5cGVfIjogInRtcGZzIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgInN0cmljdGF0aW1lIiwKICAgICAgICAgICAgICAibW9kZT03NTUiLAogICAgICAgICAgICAgICJzaXplPTY1NTM2ayIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvcHRzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJkZXZwdHMiLAogICAgICAgICAgICAidHlwZV8iOiAiZGV2cHRzIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAgICAgIm5ld2luc3RhbmNlIiwKICAgICAgICAgICAgICAicHRteG1vZGU9MDY2NiIsCiAgICAgICAgICAgICAgIm1vZGU9MDYyMCIsCiAgICAgICAgICAgICAgImdpZD01IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi9zaG0iLAogICAgICAgICAgICAic291cmNlIjogIi9ydW4va2F0YS1jb250YWluZXJzL3NhbmRib3gvc2htIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L21xdWV1ZSIsCiAgICAgICAgICAgICJzb3VyY2UiOiAibXF1ZXVlIiwKICAgICAgICAgICAgInR5cGVfIjogIm1xdWV1ZSIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9zeXMiLAogICAgICAgICAgICAic291cmNlIjogInN5c2ZzIiwKICAgICAgICAgICAgInR5cGVfIjogInN5c2ZzIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAgICAgIm5vZGV2IiwKICAgICAgICAgICAgICAicnciCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvc3lzL2ZzL2Nncm91cCIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiY2dyb3VwIiwKICAgICAgICAgICAgInR5cGVfIjogImNncm91cCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIsCiAgICAgICAgICAgICAgInJlbGF0aW1lIiwKICAgICAgICAgICAgICAicnciCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZXRjL2hvc3RzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KWhvc3RzJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJydyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvdGVybWluYXRpb24tbG9nIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KXRlcm1pbmF0aW9uLWxvZyQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicnciCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZXRjL2hvc3RuYW1lIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KWhvc3RuYW1lJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJydyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9ldGMvcmVzb2x2LmNvbmYiLAogICAgICAgICAgICAic291cmNlIjogIiQoc2ZwcmVmaXgpcmVzb2x2LmNvbmYkIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJ3IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL3Zhci9ydW4vc2VjcmV0cy9rdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50IiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KXNlcnZpY2VhY2NvdW50JCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJybyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi92YXIvcnVuL3NlY3JldHMvYXp1cmUvdG9rZW5zIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KXRva2VucyQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicm8iCiAgICAgICAgICAgIF0KICAgICAgICAgIH0KICAgICAgICBdLAogICAgICAgICJBbm5vdGF0aW9ucyI6IHsKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmJ1bmRsZV9wYXRoIjogIi9ydW4vY29udGFpbmVyZC9pby5jb250YWluZXJkLnJ1bnRpbWUudjIudGFzay9rOHMuaW8vJChidW5kbGUtaWQpIiwKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIjogInBvZF9jb250YWluZXIiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLmNvbnRhaW5lci1uYW1lIjogImJ1c3lib3giLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLmNvbnRhaW5lci10eXBlIjogImNvbnRhaW5lciIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuaW1hZ2UtbmFtZSI6ICJtY3IubWljcm9zb2Z0LmNvbS9ha3MvZTJlL2xpYnJhcnktYnVzeWJveDptYXN0ZXIuMjIwMzE0LjEtbGludXgtYW1kNjQiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtaWQiOiAiXlthLXowLTldezY0fSQiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZSI6ICJecG9kXFwtbGlmZWN5Y2xlJCIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1uYW1lc3BhY2UiOiAiIgogICAgICAgIH0sCiAgICAgICAgIkxpbnV4IjogewogICAgICAgICAgIk5hbWVzcGFjZXMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiVHlwZSI6ICJpcGMiLAogICAgICAgICAgICAgICJQYXRoIjogIiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJUeXBlIjogInV0cyIsCiAgICAgICAgICAgICAgIlBhdGgiOiAiIgogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgIlR5cGUiOiAibW91bnQiLAogICAgICAgICAgICAgICJQYXRoIjogIiIKICAgICAgICAgICAgfQogICAgICAgICAgXSwKICAgICAgICAgICJNYXNrZWRQYXRocyI6IFtdLAogICAgICAgICAgIlJlYWRvbmx5UGF0aHMiOiBbXSwKICAgICAgICAgICJEZXZpY2VzIjogW10sCiAgICAgICAgICAiU3lzY3RsIjogewogICAgICAgICAgICAibmV0LmlwdjQuaXBfdW5wcml2aWxlZ2VkX3BvcnRfc3RhcnQiOiAiMCIsCiAgICAgICAgICAgICJuZXQuaXB2NC5waW5nX2dyb3VwX3JhbmdlIjogIjAgMjE0NzQ4MzY0NyIKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0sCiAgICAgICJzdG9yYWdlcyI6IFsKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoMCkiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXIwKSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoMSkiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXIxKSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogIm92ZXJsYXlmcyIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAiZnVzZTMua2F0YS1vdmVybGF5IiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiMmMzNDJhMTM3ZTY5M2M3ODk4YWVjMzZkYTEwNDdmMTkxZGM3YzE2ODdlNjYxOThhZGFjYzQzOWNmNGFkZjM3OToyNTcwZTNhMTllMWJmMjBkZGRhNDU0OThhOTYyN2Y2MTU1NWQyZDZjMDE0NzliOWI3NjQ2MGI2NzliMjdkNTUyIiwKICAgICAgICAgICAgIjg1NjhjNzBjMGNjZmUwMDUxMDkyZTgxOGRhNzY5MTExYTU5ODgyY2QxOWRkNzk5ZDNiY2E1ZmZhODI3OTEwODA6YjY0M2I2MjE3NzQ4OTgzODMwYjI2YWMxNGEzNWEzMzIyZGQ1MjhjMDA5NjNlYWFkZDkxZWY1NWY1MTNkYzczZiIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChjcGF0aCkvJChidW5kbGUtaWQpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9CiAgICAgIF0sCiAgICAgICJkZXZpY2VzIjogW10sCiAgICAgICJzYW5kYm94X3BpZG5zIjogZmFsc2UsCiAgICAgICJleGVjX2NvbW1hbmRzIjogWwogICAgICAgIFsKICAgICAgICAgICJlY2hvIiwKICAgICAgICAgICJoZWxsbyBmcm9tIHBvc3RTdGFydCBob29rIgogICAgICAgIF0KICAgICAgXSwKICAgICAgImVudl9tYXAiOiB7CiAgICAgICAgIkhPU1ROQU1FIjogIiQoaG9zdC1uYW1lKSIsCiAgICAgICAgIklTVElPX01FVEFfQVBQX0NPTlRBSU5FUlMiOiAic2VydmljZWFjbGllbnQiLAogICAgICAgICJJU1RJT19NRVRBX0NMVVNURVJfSUQiOiAiS3ViZXJuZXRlcyIsCiAgICAgICAgIklTVElPX01FVEFfTk9ERV9OQU1FIjogIiQobm9kZS1uYW1lKSIsCiAgICAgICAgIklTVElPX01FVEFfUE9EX1BPUlRTIjogIltcbl0iLAogICAgICAgICJQQVRIIjogIi91c3IvbG9jYWwvc2JpbjovdXNyL2xvY2FsL2JpbjovdXNyL3NiaW46L3Vzci9iaW46L3NiaW46L2JpbiIsCiAgICAgICAgIlBPRF9JUCI6ICIkKHBvZC1pcCkiLAogICAgICAgICJQT0RfTkFNRSI6ICIkKHNhbmRib3gtbmFtZSkiLAogICAgICAgICJQT0RfTkFNRVNQQUNFIjogIiQoc2FuZGJveC1uYW1lc3BhY2UpIiwKICAgICAgICAiUFJPWFlfQ09ORklHIjogInt9XG4iLAogICAgICAgICJTRVJWSUNFX0FDQ09VTlQiOiAiZGVmYXVsdCIKICAgICAgfQogICAgfQogIF0sCiAgImNvbW1vbiI6IHsKICAgICJjcGF0aCI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zaGFyZWQvY29udGFpbmVycyIsCiAgICAibW91bnRfc291cmNlX2NwYXRoIjogIi9ydW4va2F0YS1jb250YWluZXJzL3NoYXJlZC9jb250YWluZXJzIiwKICAgICJzZnByZWZpeCI6ICJeJChjcGF0aCkvJChidW5kbGUtaWQpLVthLXowLTldezE2fS0iLAogICAgInNwYXRoIjogIi9ydW4va2F0YS1jb250YWluZXJzL3NhbmRib3gvc3RvcmFnZSIsCiAgICAiaXB2NF9hIjogIigoWzAtOV18WzEtOV1bMC05XXwxWzAtOV17Mn18MlswLTRdWzAtOV18MjVbMC01XSlcXC4pezN9KFswLTldfFsxLTldWzAtOV18MVswLTldezJ9fDJbMC00XVswLTldfDI1WzAtNV0pIiwKICAgICJpcF9wIjogIlswLTldezEsNX0iLAogICAgInN2Y19uYW1lIjogIltBLVpfXFwuXFwtXSsiLAogICAgImRuc19sYWJlbCI6ICJbYS16QS1aMC05X1xcLlxcLV0rIiwKICAgICJzX3NvdXJjZTEiOiAiXi4uMlswLTldezN9X1swLTFdWzAtOV1fWzAtM11bMC05XV9bMC0yXVswLTldX1swLTVdWzAtOV1fWzAtNV1bMC05XVxcLlswLTldezEsMTB9JCIsCiAgICAic19zb3VyY2UyIjogIl4uLmRhdGEvIiwKICAgICJkbnNfc3ViZG9tYWluIjogIl5bYS16MC05XShbLWEtejAtOV0qW2EtejAtOV0pPyQiLAogICAgInBvZF91aWQiOiAiXlswLTlhLWZBLUZdezh9LVswLTlhLWZBLUZdezR9LVswLTlhLWZBLUZdezR9LVswLTlhLWZBLUZdezR9LVswLTlhLWZBLUZdezEyfSQiLAogICAgImRlZmF1bHRfY2FwcyI6IFsKICAgICAgIkNBUF9DSE9XTiIsCiAgICAgICJDQVBfREFDX09WRVJSSURFIiwKICAgICAgIkNBUF9GU0VUSUQiLAogICAgICAiQ0FQX0ZPV05FUiIsCiAgICAgICJDQVBfTUtOT0QiLAogICAgICAiQ0FQX05FVF9SQVciLAogICAgICAiQ0FQX1NFVEdJRCIsCiAgICAgICJDQVBfU0VUVUlEIiwKICAgICAgIkNBUF9TRVRGQ0FQIiwKICAgICAgIkNBUF9TRVRQQ0FQIiwKICAgICAgIkNBUF9ORVRfQklORF9TRVJWSUNFIiwKICAgICAgIkNBUF9TWVNfQ0hST09UIiwKICAgICAgIkNBUF9LSUxMIiwKICAgICAgIkNBUF9BVURJVF9XUklURSIKICAgIF0sCiAgICAicHJpdmlsZWdlZF9jYXBzIjogWwogICAgICAiQ0FQX0NIT1dOIiwKICAgICAgIkNBUF9EQUNfT1ZFUlJJREUiLAogICAgICAiQ0FQX0RBQ19SRUFEX1NFQVJDSCIsCiAgICAgICJDQVBfRk9XTkVSIiwKICAgICAgIkNBUF9GU0VUSUQiLAogICAgICAiQ0FQX0tJTEwiLAogICAgICAiQ0FQX1NFVEdJRCIsCiAgICAgICJDQVBfU0VUVUlEIiwKICAgICAgIkNBUF9TRVRQQ0FQIiwKICAgICAgIkNBUF9MSU5VWF9JTU1VVEFCTEUiLAogICAgICAiQ0FQX05FVF9CSU5EX1NFUlZJQ0UiLAogICAgICAiQ0FQX05FVF9CUk9BRENBU1QiLAogICAgICAiQ0FQX05FVF9BRE1JTiIsCiAgICAgICJDQVBfTkVUX1JBVyIsCiAgICAgICJDQVBfSVBDX0xPQ0siLAogICAgICAiQ0FQX0lQQ19PV05FUiIsCiAgICAgICJDQVBfU1lTX01PRFVMRSIsCiAgICAgICJDQVBfU1lTX1JBV0lPIiwKICAgICAgIkNBUF9TWVNfQ0hST09UIiwKICAgICAgIkNBUF9TWVNfUFRSQUNFIiwKICAgICAgIkNBUF9TWVNfUEFDQ1QiLAogICAgICAiQ0FQX1NZU19BRE1JTiIsCiAgICAgICJDQVBfU1lTX0JPT1QiLAogICAgICAiQ0FQX1NZU19OSUNFIiwKICAgICAgIkNBUF9TWVNfUkVTT1VSQ0UiLAogICAgICAiQ0FQX1NZU19USU1FIiwKICAgICAgIkNBUF9TWVNfVFRZX0NPTkZJRyIsCiAgICAgICJDQVBfTUtOT0QiLAogICAgICAiQ0FQX0xFQVNFIiwKICAgICAgIkNBUF9BVURJVF9XUklURSIsCiAgICAgICJDQVBfQVVESVRfQ09OVFJPTCIsCiAgICAgICJDQVBfU0VURkNBUCIsCiAgICAgICJDQVBfTUFDX09WRVJSSURFIiwKICAgICAgIkNBUF9NQUNfQURNSU4iLAogICAgICAiQ0FQX1NZU0xPRyIsCiAgICAgICJDQVBfV0FLRV9BTEFSTSIsCiAgICAgICJDQVBfQkxPQ0tfU1VTUEVORCIsCiAgICAgICJDQVBfQVVESVRfUkVBRCIsCiAgICAgICJDQVBfUEVSRk1PTiIsCiAgICAgICJDQVBfQlBGIiwKICAgICAgIkNBUF9DSEVDS1BPSU5UX1JFU1RPUkUiCiAgICBdLAogICAgInZpcnRpb19ibGtfc3RvcmFnZV9jbGFzc2VzIjogWwogICAgICAiY2MtbG9jYWwtY3NpIiwKICAgICAgImNjLW1hbmFnZWQtY3NpIiwKICAgICAgImNjLW1hbmFnZWQtcHJlbWl1bS1jc2kiCiAgICBdLAogICAgInNtYl9zdG9yYWdlX2NsYXNzZXMiOiBbCiAgICAgIHsKICAgICAgICAibmFtZSI6ICJhenVyZWZpbGUtY3NpLWthdGEtY2MiLAogICAgICAgICJtb3VudF9vcHRpb25zIjogWwogICAgICAgICAgImRpcl9tb2RlPTA3NzciLAogICAgICAgICAgImZpbGVfbW9kZT0wNzc3IiwKICAgICAgICAgICJtZnN5bWxpbmtzIiwKICAgICAgICAgICJjYWNoZT1zdHJpY3QiLAogICAgICAgICAgIm5vc2hhcmVzb2NrIiwKICAgICAgICAgICJhY3RpbWVvPTMwIiwKICAgICAgICAgICJub2JybCIKICAgICAgICBdCiAgICAgIH0KICAgIF0KICB9LAogICJzYW5kYm94IjogewogICAgInN0b3JhZ2VzIjogWwogICAgICB7CiAgICAgICAgImRyaXZlciI6ICJlcGhlbWVyYWwiLAogICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICJzb3VyY2UiOiAic2htIiwKICAgICAgICAiZnN0eXBlIjogInRtcGZzIiwKICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAibm9kZXYiLAogICAgICAgICAgIm1vZGU9MTc3NyIsCiAgICAgICAgICAic2l6ZT02NzEwODg2NCIKICAgICAgICBdLAogICAgICAgICJtb3VudF9wb2ludCI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L3NobSIsCiAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICB9CiAgICBdCiAgfSwKICAicmVxdWVzdF9kZWZhdWx0cyI6IHsKICAgICJDcmVhdGVDb250YWluZXJSZXF1ZXN0IjogewogICAgICAiYWxsb3dfZW52X3JlZ2V4IjogWwogICAgICAgICJeSE9TVE5BTUU9JChkbnNfbGFiZWwpJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9QT1JUXyQoaXBfcClfVENQPXRjcDovLyQoaXB2NF9hKTokKGlwX3ApJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9QT1JUXyQoaXBfcClfVENQX1BST1RPPXRjcCQiLAogICAgICAgICJeJChzdmNfbmFtZSlfUE9SVF8kKGlwX3ApX1RDUF9QT1JUPSQoaXBfcCkkIiwKICAgICAgICAiXiQoc3ZjX25hbWUpX1BPUlRfJChpcF9wKV9UQ1BfQUREUj0kKGlwdjRfYSkkIiwKICAgICAgICAiXiQoc3ZjX25hbWUpX1NFUlZJQ0VfSE9TVD0kKGlwdjRfYSkkIiwKICAgICAgICAiXiQoc3ZjX25hbWUpX1NFUlZJQ0VfUE9SVD0kKGlwX3ApJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9TRVJWSUNFX1BPUlRfJChkbnNfbGFiZWwpPSQoaXBfcCkkIiwKICAgICAgICAiXiQoc3ZjX25hbWUpX1BPUlQ9dGNwOi8vJChpcHY0X2EpOiQoaXBfcCkkIiwKICAgICAgICAiXkFaVVJFX0NMSUVOVF9JRD1bQS1GYS1mMC05LV0qJCIsCiAgICAgICAgIl5BWlVSRV9URU5BTlRfSUQ9W0EtRmEtZjAtOS1dKiQiLAogICAgICAgICJeQVpVUkVfRkVERVJBVEVEX1RPS0VOX0ZJTEU9L3Zhci9ydW4vc2VjcmV0cy9henVyZS90b2tlbnMvYXp1cmUtaWRlbnRpdHktdG9rZW4kIiwKICAgICAgICAiXkFaVVJFX0FVVEhPUklUWV9IT1NUPWh0dHBzOi8vbG9naW5cXC5taWNyb3NvZnRvbmxpbmVcXC5jb20vJCIsCiAgICAgICAgIl5URVJNPXh0ZXJtJCIKICAgICAgXSwKICAgICAgImFsbG93X2Vudl9yZWdleF9tYXAiOiB7CiAgICAgICAgIkNQVV9MSU1JVCI6ICJeWzAtOV0rJCIsCiAgICAgICAgIkpPQl9DT01QTEVUSU9OX0lOREVYIjogIl5bMC05XSokIiwKICAgICAgICAiTUVNT1JZX0xJTUlUIjogIl5bMC05XSskIgogICAgICB9CiAgICB9LAogICAgIkNvcHlGaWxlUmVxdWVzdCI6IFsKICAgICAgIiQoc2ZwcmVmaXgpIgogICAgXSwKICAgICJFeGVjUHJvY2Vzc1JlcXVlc3QiOiB7CiAgICAgICJhbGxvd2VkX2NvbW1hbmRzIjogW10sCiAgICAgICJyZWdleCI6IFtdCiAgICB9LAogICAgIlVwZGF0ZVJvdXRlc1JlcXVlc3QiOiB7CiAgICAgICJmb3JiaWRkZW5fZGV2aWNlX25hbWVzIjogWwogICAgICAgICJsbyIKICAgICAgXSwKICAgICAgImZvcmJpZGRlbl9zb3VyY2VfcmVnZXgiOiBbCiAgICAgICAgIl4oPzowezAsNH06KXswLDd9MHswLDN9MSQiLAogICAgICAgICJeMTI3XFwuKD86WzAtOV17MSwzfVxcLil7Mn1bMC05XXsxLDN9JCIKICAgICAgXQogICAgfSwKICAgICJVcGRhdGVJbnRlcmZhY2VSZXF1ZXN0IjogewogICAgICAiYWxsb3dfcmF3X2ZsYWdzIjogMTI4LAogICAgICAiZm9yYmlkZGVuX25hbWVzIjogWwogICAgICAgICJsbyIKICAgICAgXSwKICAgICAgImZvcmJpZGRlbl9od19hZGRycyI6IFsKICAgICAgICAiMDA6MDA6MDA6MDA6MDA6MDAiCiAgICAgIF0KICAgIH0sCiAgICAiQ2xvc2VTdGRpblJlcXVlc3QiOiBmYWxzZSwKICAgICJSZWFkU3RyZWFtUmVxdWVzdCI6IGZhbHNlLAogICAgIlVwZGF0ZUVwaGVtZXJhbE1vdW50c1JlcXVlc3QiOiBmYWxzZSwKICAgICJXcml0ZVN0cmVhbVJlcXVlc3QiOiBmYWxzZQogIH0KfQ== +spec: + restartPolicy: Never + runtimeClassName: kata-cc + containers: + - name: busybox + image: "mcr.microsoft.com/aks/e2e/library-busybox:master.220314.1-linux-amd64" + stdin: true + env: + - name: POD_NAME + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: metadata.name + - name: POD_NAMESPACE + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: metadata.namespace + - name: POD_IP + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: status.podIP + - name: SERVICE_ACCOUNT + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: spec.serviceAccountName + - name: PROXY_CONFIG + value: "{}\n" + - name: ISTIO_META_POD_PORTS + value: "[\n]" + - name: ISTIO_META_APP_CONTAINERS + value: serviceaclient + - name: ISTIO_META_CLUSTER_ID + value: Kubernetes + - name: ISTIO_META_NODE_NAME + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: spec.nodeName + securityContext: + privileged: true + command: + - /bin/sh + args: + - "-c" + - while true; do echo $(POD_NAME); sleep 10; done + lifecycle: + postStart: + exec: + command: + - echo + - hello from postStart hook diff --git a/src/agent/samples/policy/yaml/pod/pod-many-layers.yaml b/src/agent/samples/policy/yaml/pod/pod-many-layers.yaml new file mode 100644 index 000000000000..67e91806c50c --- /dev/null +++ b/src/agent/samples/policy/yaml/pod/pod-many-layers.yaml @@ -0,0 +1,36 @@ +--- +apiVersion: v1 +kind: Pod +metadata: + name: many-layers + annotations: + io.katacontainers.config.agent.policy: IyBDb3B5cmlnaHQgKGMpIDIwMjMgTWljcm9zb2Z0IENvcnBvcmF0aW9uCiMKIyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMAojCnBhY2thZ2UgYWdlbnRfcG9saWN5CgppbXBvcnQgZnV0dXJlLmtleXdvcmRzLmluCmltcG9ydCBmdXR1cmUua2V5d29yZHMuZXZlcnkKCiMgRGVmYXVsdCB2YWx1ZXMsIHJldHVybmVkIGJ5IE9QQSB3aGVuIHJ1bGVzIGNhbm5vdCBiZSBldmFsdWF0ZWQgdG8gdHJ1ZS4KZGVmYXVsdCBBZGRBUlBOZWlnaGJvcnNSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgQWRkU3dhcFJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBDbG9zZVN0ZGluUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IENvcHlGaWxlUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IENyZWF0ZUNvbnRhaW5lclJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBDcmVhdGVTYW5kYm94UmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IERlc3Ryb3lTYW5kYm94UmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgRXhlY1Byb2Nlc3NSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgR2V0T09NRXZlbnRSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBHdWVzdERldGFpbHNSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBMaXN0SW50ZXJmYWNlc1JlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBMaXN0Um91dGVzUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IE1lbUhvdHBsdWdCeVByb2JlUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IE9ubGluZUNQVU1lbVJlcXVlc3QgOj0gdHJ1ZQpkZWZhdWx0IFBhdXNlQ29udGFpbmVyUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFJlYWRTdHJlYW1SZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgUmVtb3ZlQ29udGFpbmVyUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgUmVtb3ZlU3RhbGVWaXJ0aW9mc1NoYXJlTW91bnRzUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgUmVzZWVkUmFuZG9tRGV2UmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFJlc3VtZUNvbnRhaW5lclJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBTZXRHdWVzdERhdGVUaW1lUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFNldFBvbGljeVJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBTaWduYWxQcm9jZXNzUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgU3RhcnRDb250YWluZXJSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBTdGFydFRyYWNpbmdSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgU3RhdHNDb250YWluZXJSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBTdG9wVHJhY2luZ1JlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBUdHlXaW5SZXNpemVSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBVcGRhdGVDb250YWluZXJSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgVXBkYXRlRXBoZW1lcmFsTW91bnRzUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFVwZGF0ZUludGVyZmFjZVJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBVcGRhdGVSb3V0ZXNSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgV2FpdFByb2Nlc3NSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBXcml0ZVN0cmVhbVJlcXVlc3QgOj0gZmFsc2UKCiMgQWxsb3dSZXF1ZXN0c0ZhaWxpbmdQb2xpY3kgOj0gdHJ1ZSBjb25maWd1cmVzIHRoZSBBZ2VudCB0byAqYWxsb3cgYW55CiMgcmVxdWVzdHMgY2F1c2luZyBhIHBvbGljeSBmYWlsdXJlKi4gVGhpcyBpcyBhbiB1bnNlY3VyZSBjb25maWd1cmF0aW9uCiMgYnV0IGlzIHVzZWZ1bCBmb3IgYWxsb3dpbmcgdW5zZWN1cmUgcG9kcyB0byBzdGFydCwgdGhlbiBjb25uZWN0IHRvCiMgdGhlbSBhbmQgaW5zcGVjdCBPUEEgbG9ncyBmb3IgdGhlIHJvb3QgY2F1c2Ugb2YgYSBmYWlsdXJlLgpkZWZhdWx0IEFsbG93UmVxdWVzdHNGYWlsaW5nUG9saWN5IDo9IGZhbHNlCgojIENvbnN0YW50cwpTX05BTUVfS0VZID0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZSIKU19OQU1FU1BBQ0VfS0VZID0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZXNwYWNlIgpCVU5ETEVfSUQgPSAiW2EtejAtOV17NjR9IgoKQ3JlYXRlQ29udGFpbmVyUmVxdWVzdDo9IHJlc3AgewogICAgbm90IGlzX251bGwoaW5wdXQuZW52X21hcCkKICAgIAogICAgaV9lbnZfbWFwIDo9IGlucHV0LmVudl9tYXAKICAgIAogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBwX2Vudl9tYXAgOj0gcF9jb250YWluZXIuZW52X21hcCAgCiAgICBhbGxvd19lbnZfbWFwKHBfZW52X21hcCwgaV9lbnZfbWFwKQogICAgCiAgICBpX3Byb2Nlc3MgOj0gaW5wdXQuYmFzZS5PQ0kuUHJvY2VzcwogICAgCiAgICBwX3Byb2Nlc3MgOj0gcF9jb250YWluZXIuT0NJLlByb2Nlc3MKICAgIAogICAgYWxsb3dfYXJncyhpX3Byb2Nlc3MsIHBfcHJvY2VzcywgaV9lbnZfbWFwKQoKICAgIHJlc3AgPSBDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uKGlucHV0LmJhc2UpCiAgICBwcmludCgiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdDogdHJ1ZSIpCn0KCmFsbG93X2FyZ3MoaV9wcm9jZXNzLCBwX3Byb2Nlc3MsIGlfZW52X21hcCkgewogICAgaV9hcmdzIDo9IGlfcHJvY2Vzcy5BcmdzCiAgICBwX2FyZ3MgOj0gcF9wcm9jZXNzLkFyZ3MKICAgIHByaW50KCJhbGxvd19hcmdzOiBpX2FyZ3MgPSIsIGlfYXJncywgInBfYXJncyA9IiwgcF9hcmdzKQogICAgY291bnQoaV9hcmdzKSA9PSBjb3VudChwX2FyZ3MpCiAgICBldmVyeSBpLCBpX2FyZyBpbiBpX2FyZ3MgewogICAgICAgIHByaW50KCJhbGxvd19hcmdzOiBpX2FyZyA9IiwgaV9hcmcpCiAgICAgICAgcF9hcmdfcmVwbGFjZWQgOj0gcmVwbGFjZV9lbnZfdmFyaWFibGVzKHBfYXJnc1tpXSwgaV9lbnZfbWFwKQogICAgICAgIHByaW50KCJhbGxvd19hcmdzOiBwX2FyZ19yZXBsYWNlZCA9IiwgcF9hcmdfcmVwbGFjZWQpCiAgICAgICAgcF9hcmdfcmVwbGFjZWQyIDo9IHJlcGxhY2UocF9hcmdfcmVwbGFjZWQsICIkJCIsICIkIikKICAgICAgICBwcmludCgiYWxsb3dfYXJnczogcF9hcmdfcmVwbGFjZWQyID0iLCBwX2FyZ19yZXBsYWNlZDIpCiAgICAgICAgaV9hcmcgPT0gcF9hcmdfcmVwbGFjZWQyCiAgICB9CiAgICBwcmludCgiYWxsb3dfYXJnczogdHJ1ZSIpCn0KCmFsbG93X2FyZ3MoaV9wcm9jZXNzLCBwX3Byb2Nlc3MsIGlfZW52X21hcCkgewogICAgbm90IGlfcHJvY2Vzcy5BcmdzCiAgICBub3QgcF9wcm9jZXNzLkFyZ3MKICAgIHByaW50KCJhbGxvd19hcmdzMjogbm8gYXJncyIpCn0KCiMgdGhpcyBmdW5jdGlvbiByZXBsYWNlcyBhbGwgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyBpbiBhIHN0cmluZywgZ2l2ZW4gYSBtYXAgb2YgZW52aXJvbm1lbnQga2V5cyB0byBlbnZpcm9ubWVudCB2YWx1ZXMKIyBlZyBzdHIgPSAiZWNobyAkKENMVVNURVJfSUQpOyBlY2hvICQoTk9ERV9OQU1FKTsiCiMgZW52X21hcCA9IHsiQ0xVU1RFUl9JRCI6ICJhYmMiLCAiTk9ERV9OQU1FIiA6ICJ4eXoifQojIHJlc3VsdCA9ICJlY2hvIGFiYzsgZWNobyB4eXo7IgpyZXBsYWNlX2Vudl92YXJpYWJsZXMoc3RyLCBlbnZfbWFwKSA9IHJlc3VsdCB7CiAgICAjIG1ha2UgYW4gYXJyYXkgb2YgdGhlIGtleXMgZWcgWyJDTFVTVEVSX0lEIiwgIk5PREVfTkFNRSJdCiAgICBrZXlzIDo9IFt4IHwgc29tZSB4IGluIG9iamVjdC5rZXlzKGVudl9tYXApXQogICAgcmVzdWx0IDo9IHJlcGxhY2Vfc3RyX3JlYyhzdHIsIGVudl9tYXAsIGtleXMsIGNvdW50KGtleXMpIC0gMSkKfQoKIyBiYXNlIGNhc2UKcmVwbGFjZV9zdHJfcmVjKHN0ciwgZW52X21hcCwgYXJyX2tleXMsIGkpID0gcmVzdWx0IHsKICAgIGkgPCAwCiAgICByZXN1bHQgOj0gc3RyCn0KCiMgcmVjdXJzaXZlIHN0ZXAKcmVwbGFjZV9zdHJfcmVjKHN0ciwgZW52X21hcCwgYXJyX2tleXMsIGkpID0gcmVzdWx0IHsKICAgIGkgPj0gMAogICAga2V5IDo9IGFycl9rZXlzW2ldCiAgICBlbnZfa2V5MSA6PSBjb25jYXQoIiIsIFsiJCgiLCBrZXksICIpIl0pCiAgICAjIHJlcGxhY2UgJChWQVIpIHdpdGggdmFsdWUKICAgIG5ld19zdHIxIDo9IHJlcGxhY2Uoc3RyLCBlbnZfa2V5MSwgZW52X21hcFtrZXldKQogICAgIyByZXBsYWNlIG5leHQgZW52aXJvbm1lbnQgdmFyaWFibGUKICAgIHJlc3VsdCA9IHJlcGxhY2Vfc3RyX3JlYyhuZXdfc3RyMSwgZW52X21hcCwgYXJyX2tleXMsIGkgLSAxKQp9CgphbGxvd19lbnZfbWFwKHBfZW52X21hcCwgaV9lbnZfbWFwKSB7CiAgICBwcmludCgiYWxsb3dfZW52X21hcDogcF9lbnZfbWFwID0iLCBwX2Vudl9tYXApCiAgICBldmVyeSBlbnZfa2V5LCBlbnZfdmFsIGluIGlfZW52X21hcCB7CiAgICAgICAgcHJpbnQoImFsbG93X2VudjogZW52X2tleSA9IiwgZW52X2tleSwgImVudl92YWwgPSIsIGVudl92YWwpCiAgICAgICAgYWxsb3dfZW52X21hcF9lbnRyeShlbnZfa2V5LCBlbnZfdmFsLCBwX2Vudl9tYXApCiAgICB9CiAgICBwcmludCgiYWxsb3dfZW52X21hcDogdHJ1ZSIpCn0KCiMgQWxsb3cgZXhhY3QgbWF0Y2gKYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBpX3ZhbCA9PSBwX3ZhbAogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnk6IHRydWUiKQp9CgojIEFsbG93IHJlc291cmNlRmllbGRSZWYgdmFsdWVzIChlLmcuLCAibGltaXRzLmNwdSIpLgphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgICMgYSB2YXJpYWJsZSB3ZSBzaG91bGQgYmUgdmFsaWRhdGluZyB1c2luZyBhIHJlZ2V4IGZyb20gc2V0dGluZ3MKICAgIHBfdmFsID09ICIkKHZhbGlkYXRlLWZyb20tc2V0dGluZ3MpIgogICAgcmVnZXhfdmFsIDo9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuQ3JlYXRlQ29udGFpbmVyUmVxdWVzdC5hbGxvd19lbnZfcmVnZXhfbWFwW2tleV0KICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4X3ZhbCwgaV92YWwpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSAyOiB0cnVlIikKfQoKIyBBbGxvdyBub2RlLW5hbWUKYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChub2RlLW5hbWUpIgogICAgcmVnZXgubWF0Y2gocG9saWN5X2RhdGEuY29tbW9uLmRuc19zdWJkb21haW4gLCBpX3ZhbCkKICAgIHByaW50KCJhbGxvd19lbnZfbWFwX2VudHJ5IDM6IHRydWUiKQp9CgojIEFsbG93IGhvc3QtbmFtZQphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgIHBfdmFsID09ICIkKGhvc3QtbmFtZSkiCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24uZG5zX2xhYmVsICwgaV92YWwpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSA0OiB0cnVlIikKfQoKIyBBbGxvdyBwb2QtdWlkCmFsbG93X2Vudl9tYXBfZW50cnkoa2V5LCBpX3ZhbCwgcF9lbnZfbWFwKSB7CiAgICBwX3ZhbCA6PSBwX2Vudl9tYXBba2V5XQogICAgcF92YWwgPT0gIiQocG9kLXVpZCkiCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24ucG9kX3VpZCAsIGlfdmFsKQogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgNTogdHJ1ZSIpCn0KCiMgQWxsb3cgZmllbGRSZWYgImZpZWxkUGF0aDogc3RhdHVzLnBvZElQIiB2YWx1ZXMuCmFsbG93X2Vudl9tYXBfZW50cnkoa2V5LCBpX3ZhbCwgcF9lbnZfbWFwKSB7CiAgICBpc19pcChpX3ZhbCkKCiAgICBwX3ZhbCA6PSBwX2Vudl9tYXBba2V5XQogICAgcF92YXIgOj0gY29uY2F0KCI9IiwgW2tleSwgcF92YWxdKQogICAgYWxsb3dfcG9kX2lwX3ZhcihrZXksIHBfdmFyKQogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgNjogdHJ1ZSIpCn0KCiMgQWxsb3cgZmllbGRSZWYgImZpZWxkUGF0aDogc3RhdHVzLmhvc3RJUCIgdmFsdWVzLgphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgaXNfaXAoaV92YWwpCgogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgIHBfdmFyIDo9IGNvbmNhdCgiPSIsIFtrZXksIHBfdmFsXSkKICAgIGFsbG93X2hvc3RfaXBfdmFyKGtleSwgcF92YXIpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSA3OiB0cnVlIikKfQoKIyBNYXRjaCBpbnB1dCB3aXRoIG9uZSBvZiB0aGUgcG9saWN5IHZhcmlhYmxlcywgYWZ0ZXIgc3Vic3RpdHV0aW5nICQoc2FuZGJveC1uYW1lKS4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChzYW5kYm94LW5hbWUpIgogICAgc19uYW1lIDo9IGlucHV0LmJhc2UuT0NJLkFubm90YXRpb25zW1NfTkFNRV9LRVldCiAgICBwX3ZhcjIgOj0gcmVwbGFjZShwX3ZhbCwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHBfdmFyMiA9PSBpX3ZhbAogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgODogdHJ1ZSIpCn0KCiMgTWF0Y2ggaW5wdXQgd2l0aCBvbmUgb2YgdGhlIHBvbGljeSB2YXJpYWJsZXMsIGFmdGVyIHN1YnN0aXR1dGluZyAkKHNhbmRib3gtbmFtZXNwYWNlKS4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChzYW5kYm94LW5hbWVzcGFjZSkiCiAgICBzX25hbWVzcGFjZSA6PSBpbnB1dC5iYXNlLk9DSS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwX3ZhcjIgOj0gcmVwbGFjZShwX3ZhbCwgIiQoc2FuZGJveC1uYW1lc3BhY2UpIiwgc19uYW1lc3BhY2UpCiAgICBwX3ZhcjIgPT0gaV92YWwKICAgIHByaW50KCJhbGxvd19lbnZfbWFwX2VudHJ5IDk6IHRydWUiKQp9CgojIEFsbG93IGlucHV0IGVudiB2YXJpYWJsZXMgdGhhdCBtYXRjaCB3aXRoIGEgcmVxdWVzdF9kZWZhdWx0cyByZWdleC4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHNvbWUgcF9yZWdleDEgaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5DcmVhdGVDb250YWluZXJSZXF1ZXN0LmFsbG93X2Vudl9yZWdleAogICAgcF9yZWdleDIgOj0gcmVwbGFjZShwX3JlZ2V4MSwgIiQoaXB2NF9hKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcHY0X2EpCiAgICBwX3JlZ2V4MyA6PSByZXBsYWNlKHBfcmVnZXgyLCAiJChpcF9wKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcF9wKQogICAgcF9yZWdleDQgOj0gcmVwbGFjZShwX3JlZ2V4MywgIiQoc3ZjX25hbWUpIiwgcG9saWN5X2RhdGEuY29tbW9uLnN2Y19uYW1lKQogICAgcF9yZWdleDUgOj0gcmVwbGFjZShwX3JlZ2V4NCwgIiQoZG5zX2xhYmVsKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5kbnNfbGFiZWwpCgogICAgcmVzdWx0IDo9IGNvbmNhdCgiPSIsIFtrZXksIGlfdmFsXSkKICAgIHJlZ2V4Lm1hdGNoKHBfcmVnZXg1LCByZXN1bHQpCgogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgMTA6IHRydWUiKQp9CgpDcmVhdGVDb250YWluZXJSZXF1ZXN0Oj0gcmVzcCB7CiAgICBub3QgaW5wdXQuZW52X21hcAogICAgaV9wcm9jZXNzID0gaW5wdXQuT0NJLlByb2Nlc3MKICAgIHNfbmFtZSA9IGlucHV0Lk9DSS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBwX3Byb2Nlc3MgPSBwX2NvbnRhaW5lci5PQ0kuUHJvY2VzcwogICAgYWxsb3dfZGVwcmVjYXRlZF9hcmdzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUpCiAgICByZXNwID0gQ3JlYXRlQ29udGFpbmVyUmVxdWVzdENvbW1vbihpbnB1dCkKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0MjogdHJ1ZSIpCn0KCkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb24ocmVxKTo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgICMgQ2hlY2sgaWYgdGhlIGlucHV0IHJlcXVlc3Qgc2hvdWxkIGJlIHJlamVjdGVkIGV2ZW4gYmVmb3JlIGNoZWNraW5nIHRoZQogICAgIyBwb2xpY3lfZGF0YS5jb250YWluZXJzIGluZm9ybWF0aW9uLgogICAgYWxsb3dfY3JlYXRlX2NvbnRhaW5lcl9pbnB1dChyZXEpCgogICAgaV9vY2kgOj0gcmVxLk9DSQogICAgaV9zdG9yYWdlcyA6PSByZXEuc3RvcmFnZXMKICAgIGlfZGV2aWNlcyA6PSByZXEuZGV2aWNlcwoKICAgICMgYXJyYXkgb2YgcG9zc2libGUgc3RhdGUgb3BlcmF0aW9ucwogICAgb3BzX2J1aWxkZXIgOj0gW10KCiAgICAjIGNoZWNrIHNhbmRib3ggbmFtZQogICAgc2FuZGJveF9uYW1lID0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FX0tFWV0KICAgIGFkZF9zYW5kYm94X25hbWVfdG9fc3RhdGUgOj0gc3RhdGVfYWxsb3dzKCJzYW5kYm94X25hbWUiLCBzYW5kYm94X25hbWUpCiAgICBvcHNfYnVpbGRlcjEgOj0gY29uY2F0X29wX2lmX25vdF9udWxsKG9wc19idWlsZGVyLCBhZGRfc2FuZGJveF9uYW1lX3RvX3N0YXRlKQoKICAgICMgQ2hlY2sgaWYgYW55IGVsZW1lbnQgZnJvbSB0aGUgcG9saWN5X2RhdGEuY29udGFpbmVycyBhcnJheSBhbGxvd3MgdGhlIGlucHV0IHJlcXVlc3QuCiAgICBzb21lIHBfY29udGFpbmVyIGluIHBvbGljeV9kYXRhLmNvbnRhaW5lcnMKICAgIHByaW50KCI9PT09PT09PSBDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiB0cnlpbmcgbmV4dCBwb2xpY3kgY29udGFpbmVyIikKCiAgICBwX3BpZG5zIDo9IHBfY29udGFpbmVyLnNhbmRib3hfcGlkbnMKICAgIGlfcGlkbnMgOj0gcmVxLnNhbmRib3hfcGlkbnMKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiBwX3BpZG5zID0iLCBwX3BpZG5zLCAiaV9waWRucyA9IiwgaV9waWRucykKICAgIHBfcGlkbnMgPT0gaV9waWRucwoKICAgIHBfb2NpIDo9IHBfY29udGFpbmVyLk9DSQoKICAgICMgY2hlY2sgbmFtZXNwYWNlCiAgICBwX25hbWVzcGFjZSA6PSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBpX25hbWVzcGFjZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwcmludCAoIkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb246IHBfbmFtZXNwYWNlID0iLCBwX25hbWVzcGFjZSwgImlfbmFtZXNwYWNlID0iLCBpX25hbWVzcGFjZSkKICAgIGFkZF9uYW1lc3BhY2VfdG9fc3RhdGUgOj0gYWxsb3dfbmFtZXNwYWNlKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkKICAgIG9wc19idWlsZGVyMiA6PSBjb25jYXRfb3BfaWZfbm90X251bGwob3BzX2J1aWxkZXIxLCBhZGRfbmFtZXNwYWNlX3RvX3N0YXRlKQoKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiBwIFZlcnNpb24gPSIsIHBfb2NpLlZlcnNpb24sICJpIFZlcnNpb24gPSIsIGlfb2NpLlZlcnNpb24pCiAgICBwX29jaS5WZXJzaW9uID09IGlfb2NpLlZlcnNpb24KCiAgICBwcmludCgiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdENvbW1vbjogcCBSZWFkb25seSA9IiwgcF9vY2kuUm9vdC5SZWFkb25seSwgImkgUmVhZG9ubHkgPSIsIGlfb2NpLlJvb3QuUmVhZG9ubHkpCiAgICBwX29jaS5Sb290LlJlYWRvbmx5ID09IGlfb2NpLlJvb3QuUmVhZG9ubHkKCiAgICBhbGxvd19hbm5vKHBfb2NpLCBpX29jaSkKCiAgICBwX3N0b3JhZ2VzIDo9IHBfY29udGFpbmVyLnN0b3JhZ2VzCiAgICBhbGxvd19ieV9hbm5vKHBfb2NpLCBpX29jaSwgcF9zdG9yYWdlcywgaV9zdG9yYWdlcykKCiAgICBwX2RldmljZXMgOj0gcF9jb250YWluZXIuZGV2aWNlcwogICAgYWxsb3dfZGV2aWNlcyhwX2RldmljZXMsIGlfZGV2aWNlcykKCiAgICByZXQgOj0gYWxsb3dfbGludXgob3BzX2J1aWxkZXIyLCBwX29jaSwgaV9vY2kpCiAgICByZXQuYWxsb3dlZAoKICAgIG9wcyA6PSByZXQub3BzCgogICAgcHJpbnQoIkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb246IHRydWUiKQp9CgphbGxvd19jcmVhdGVfY29udGFpbmVyX2lucHV0KHJlcSkgewogICAgcHJpbnQoImFsbG93X2NyZWF0ZV9jb250YWluZXJfaW5wdXQ6IGlucHV0ID0iLCByZXEpCgogICAgY291bnQocmVxLnNoYXJlZF9tb3VudHMpID09IDAKICAgIGlzX251bGwocmVxLnN0cmluZ191c2VyKQoKICAgIGlfb2NpIDo9IHJlcS5PQ0kKICAgIGlzX251bGwoaV9vY2kuSG9va3MpCiAgICBpc19udWxsKGlfb2NpLlNvbGFyaXMpCiAgICBpc19udWxsKGlfb2NpLldpbmRvd3MpCgogICAgaV9saW51eCA6PSBpX29jaS5MaW51eAogICAgY291bnQoaV9saW51eC5HSURNYXBwaW5ncykgPT0gMAogICAgY291bnQoaV9saW51eC5Nb3VudExhYmVsKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlJlc291cmNlcy5EZXZpY2VzKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlJvb3Rmc1Byb3BhZ2F0aW9uKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlVJRE1hcHBpbmdzKSA9PSAwCiAgICBpc19udWxsKGlfbGludXguSW50ZWxSZHQpCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLkJsb2NrSU8pCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLk5ldHdvcmspCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLlBpZHMpCiAgICBpc19udWxsKGlfbGludXguU2VjY29tcCkKCiAgICBpX3Byb2Nlc3MgOj0gaV9vY2kuUHJvY2VzcwogICAgY291bnQoaV9wcm9jZXNzLlNlbGludXhMYWJlbCkgPT0gMAogICAgY291bnQoaV9wcm9jZXNzLlVzZXIuVXNlcm5hbWUpID09IDAKCiAgICBwcmludCgiYWxsb3dfY3JlYXRlX2NvbnRhaW5lcl9pbnB1dDogdHJ1ZSIpCn0KCmFsbG93X25hbWVzcGFjZShwX25hbWVzcGFjZSwgaV9uYW1lc3BhY2UpID0gYWRkX25hbWVzcGFjZSB7CiAgICBwX25hbWVzcGFjZSA9PSBpX25hbWVzcGFjZQogICAgYWRkX25hbWVzcGFjZSA6PSBudWxsCiAgICBwcmludCgiYWxsb3dfbmFtZXNwYWNlIDE6IGlucHV0IG5hbWVzcGFjZSBtYXRjaGVzIHBvbGljeSBkYXRhIikKfQoKYWxsb3dfbmFtZXNwYWNlKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkgPSBhZGRfbmFtZXNwYWNlIHsKICAgIHBfbmFtZXNwYWNlID09ICIiCiAgICBwcmludCgiYWxsb3dfbmFtZXNwYWNlIDI6IG5vIG5hbWVzcGFjZSBmb3VuZCBvbiBwb2xpY3kgZGF0YSIpCiAgICBhZGRfbmFtZXNwYWNlIDo9IHN0YXRlX2FsbG93cygibmFtZXNwYWNlIiwgaV9uYW1lc3BhY2UpCn0KCiMgdmFsdWUgaGFzbid0IGJlZW4gc2VlbiBiZWZvcmUsIHNhdmUgaXQgdG8gc3RhdGUKc3RhdGVfYWxsb3dzKGtleSwgdmFsdWUpID0gYWN0aW9uIHsKICBzdGF0ZSA6PSBnZXRfc3RhdGUoKQogIHByaW50KCJzdGF0ZV9hbGxvd3MgMTogc3RhdGVba2V5XSA9Iiwgc3RhdGVba2V5XSwgInZhbHVlID0iLCB2YWx1ZSkKICBub3Qgc3RhdGVba2V5XQogIHByaW50KCJzdGF0ZV9hbGxvd3MgMTogc2F2aW5nIHRvIHN0YXRlIGtleSA9Iiwga2V5LCAidmFsdWUgPSIsIHZhbHVlKQogIHBhdGggOj0gZ2V0X3N0YXRlX3BhdGgoa2V5KSAKICBhY3Rpb24gOj0gewogICAgIm9wIjogImFkZCIsCiAgICAicGF0aCI6IHBhdGgsIAogICAgInZhbHVlIjogdmFsdWUsCiAgfQp9CgojIHZhbHVlIG1hdGNoZXMgd2hhdCdzIGluIHN0YXRlLCBhbGxvdyBpdApzdGF0ZV9hbGxvd3Moa2V5LCB2YWx1ZSkgPSBhY3Rpb24gewogIHByaW50KCJzdGF0ZV9hbGxvd3MgMjogc3RhcnQiKQogIHN0YXRlIDo9IGdldF9zdGF0ZSgpCiAgcHJpbnQoInN0YXRlX2FsbG93cyAyOiBzdGF0ZVtrZXldID0iLCBzdGF0ZVtrZXldLCAidmFsdWUgPSIsIHZhbHVlKQogIHZhbHVlID09IHN0YXRlW2tleV0KICBwcmludCgic3RhdGVfYWxsb3dzIDI6IGZvdW5kIGtleSA9Iiwga2V5LCAidmFsdWUgPSIsIHZhbHVlLCAiIGluIHN0YXRlIikKICBhY3Rpb24gOj0gbnVsbAp9CgojIGhlbHBlciBmdW5jdGlvbnMgdG8gaW50ZXJhY3Qgd2l0aCB0aGUgc3RhdGUKZ2V0X3N0YXRlKCkgPSBzdGF0ZSB7CiAgc3RhdGUgOj0gZGF0YVsicHN0YXRlIl0KfQoKZ2V0X3N0YXRlX3ZhbChrZXkpID0gdmFsdWUgewogICAgc3RhdGUgOj0gZ2V0X3N0YXRlKCkKICAgIHZhbHVlIDo9IHN0YXRlW2tleV0KfQoKZ2V0X3N0YXRlX3BhdGgoa2V5KSA9IHBhdGggewogICAgIyBwcmVwZW5kICIvcHN0YXRlLyIgdG8ga2V5CiAgICBwYXRoIDo9IGNvbmNhdCgiLyIsIFsiL3BzdGF0ZSIsIGtleV0pCn0KCiMgSGVscGVyIGZ1bmN0aW9ucyB0byBjb25kaXRpb25hbGx5IGNvbmNhdGVuYXRlIG9wIGlzIG5vdCBudWxsCmNvbmNhdF9vcF9pZl9ub3RfbnVsbChvcHMsIG9wKSA9IHJlc3VsdCB7CiAgICBvcCA9PSBudWxsCiAgICByZXN1bHQgOj0gb3BzCn0KCmNvbmNhdF9vcF9pZl9ub3RfbnVsbChvcHMsIG9wKSA9IHJlc3VsdCB7CiAgICBvcCAhPSBudWxsCiAgICByZXN1bHQgOj0gYXJyYXkuY29uY2F0KG9wcywgW29wXSkKfQoKIyBSZWplY3QgdW5leHBlY3RlZCBhbm5vdGF0aW9ucy4KYWxsb3dfYW5ubyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19hbm5vIDE6IHN0YXJ0IikKCiAgICBub3QgaV9vY2kuQW5ub3RhdGlvbnMKCiAgICBwcmludCgiYWxsb3dfYW5ubyAxOiB0cnVlIikKfQphbGxvd19hbm5vKHBfb2NpLCBpX29jaSkgewogICAgcHJpbnQoImFsbG93X2Fubm8gMjogcCBBbm5vdGF0aW9ucyA9IiwgcF9vY2kuQW5ub3RhdGlvbnMpCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiBpIEFubm90YXRpb25zID0iLCBpX29jaS5Bbm5vdGF0aW9ucykKCiAgICBpX2tleXMgOj0gb2JqZWN0LmtleXMoaV9vY2kuQW5ub3RhdGlvbnMpCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiBpIGtleXMgPSIsIGlfa2V5cykKCiAgICBldmVyeSBpX2tleSBpbiBpX2tleXMgewogICAgICAgIGFsbG93X2Fubm9fa2V5KGlfa2V5LCBwX29jaSkKICAgIH0KCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiB0cnVlIikKfQoKYWxsb3dfYW5ub19rZXkoaV9rZXksIHBfb2NpKSB7CiAgICBwcmludCgiYWxsb3dfYW5ub19rZXkgMTogaSBrZXkgPSIsIGlfa2V5KQoKICAgIHN0YXJ0c3dpdGgoaV9rZXksICJpby5rdWJlcm5ldGVzLmNyaS4iKQoKICAgIHByaW50KCJhbGxvd19hbm5vX2tleSAxOiB0cnVlIikKfQphbGxvd19hbm5vX2tleShpX2tleSwgcF9vY2kpIHsKICAgIHByaW50KCJhbGxvd19hbm5vX2tleSAyOiBpIGtleSA9IiwgaV9rZXkpCgogICAgc29tZSBwX2tleSwgXyBpbiBwX29jaS5Bbm5vdGF0aW9ucwogICAgcF9rZXkgPT0gaV9rZXkKCiAgICBwcmludCgiYWxsb3dfYW5ub19rZXkgMjogdHJ1ZSIpCn0KCiMgR2V0IHRoZSB2YWx1ZSBvZiB0aGUgU19OQU1FX0tFWSBhbm5vdGF0aW9uIGFuZAojIGNvcnJlbGF0ZSBpdCB3aXRoIG90aGVyIGFubm90YXRpb25zIGFuZCBwcm9jZXNzIGZpZWxkcy4KYWxsb3dfYnlfYW5ubyhwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpIHsKICAgIHByaW50KCJhbGxvd19ieV9hbm5vIDE6IHN0YXJ0IikKCiAgICBub3QgcF9vY2kuQW5ub3RhdGlvbnNbU19OQU1FX0tFWV0KCiAgICBpX3NfbmFtZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMTogaV9zX25hbWUgPSIsIGlfc19uYW1lKQoKICAgIGlfc19uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FU1BBQ0VfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMTogaV9zX25hbWVzcGFjZSA9IiwgaV9zX25hbWVzcGFjZSkKCiAgICBhbGxvd19ieV9zYW5kYm94X25hbWUocF9vY2ksIGlfb2NpLCBwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBpX3NfbmFtZSwgaV9zX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfYnlfYW5ubyAxOiB0cnVlIikKfQphbGxvd19ieV9hbm5vKHBfb2NpLCBpX29jaSwgcF9zdG9yYWdlcywgaV9zdG9yYWdlcykgewogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMjogc3RhcnQiKQoKICAgIHBfc19uYW1lIDo9IHBfb2NpLkFubm90YXRpb25zW1NfTkFNRV9LRVldCiAgICBpX3NfbmFtZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMjogaV9zX25hbWUgPSIsIGlfc19uYW1lLCAicF9zX25hbWUgPSIsIHBfc19uYW1lKQoKICAgIGFsbG93X3NhbmRib3hfbmFtZShwX3NfbmFtZSwgaV9zX25hbWUpCgogICAgaV9zX25hbWVzcGFjZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwcmludCgiYWxsb3dfYnlfYW5ubyAyOiBpX3NfbmFtZXNwYWNlID0iLCBpX3NfbmFtZXNwYWNlKQoKICAgIGFsbG93X2J5X3NhbmRib3hfbmFtZShwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMsIGlfc19uYW1lLCBpX3NfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd19ieV9hbm5vIDI6IHRydWUiKQp9CgphbGxvd19ieV9zYW5kYm94X25hbWUocF9vY2ksIGlfb2NpLCBwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfYnlfc2FuZGJveF9uYW1lOiBzdGFydCIpCgogICAgaV9uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FU1BBQ0VfS0VZXQoKICAgIGFsbG93X2J5X2NvbnRhaW5lcl90eXBlcyhwX29jaSwgaV9vY2ksIHNfbmFtZSwgaV9uYW1lc3BhY2UpCiAgICBhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZChwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpCiAgICBhbGxvd19wcm9jZXNzKHBfb2NpLlByb2Nlc3MsIGlfb2NpLlByb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpCgogICAgcHJpbnQoImFsbG93X2J5X3NhbmRib3hfbmFtZTogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfbmFtZShwX3NfbmFtZSwgaV9zX25hbWUpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X25hbWU6IHN0YXJ0IikKICAgIHJlZ2V4Lm1hdGNoKHBfc19uYW1lLCBpX3NfbmFtZSkKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9uYW1lOiB0cnVlIikKfQoKIyBDaGVjayB0aGF0IHRoZSAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLXR5cGUiIGFuZAojICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIiBhbm5vdGF0aW9ucyBkZXNpZ25hdGUgdGhlCiMgZXhwZWN0ZWQgdHlwZSAtIGVpdGhlciBhICJzYW5kYm94IiBvciBhICJjb250YWluZXIiLiBUaGVuLCB2YWxpZGF0ZQojIG90aGVyIGFubm90YXRpb25zIGJhc2VkIG9uIHRoZSBhY3R1YWwgInNhbmRib3giIG9yICJjb250YWluZXIiIHZhbHVlCiMgZnJvbSB0aGUgaW5wdXQgY29udGFpbmVyLgphbGxvd19ieV9jb250YWluZXJfdHlwZXMocF9vY2ksIGlfb2NpLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfYnlfY29udGFpbmVyX3R5cGVzOiBjaGVja2luZyBpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSIpCgogICAgY190eXBlIDo9ICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSIKICAgIAogICAgcF9jcmlfdHlwZSA6PSBwX29jaS5Bbm5vdGF0aW9uc1tjX3R5cGVdCiAgICBpX2NyaV90eXBlIDo9IGlfb2NpLkFubm90YXRpb25zW2NfdHlwZV0KICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZXM6IHBfY3JpX3R5cGUgPSIsIHBfY3JpX3R5cGUsICJpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgcF9jcmlfdHlwZSA9PSBpX2NyaV90eXBlCgogICAgYWxsb3dfYnlfY29udGFpbmVyX3R5cGUoaV9jcmlfdHlwZSwgcF9vY2ksIGlfb2NpLCBzX25hbWUsIHNfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZXM6IHRydWUiKQp9CgphbGxvd19ieV9jb250YWluZXJfdHlwZShpX2NyaV90eXBlLCBwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAxOiBpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgaV9jcmlfdHlwZSA9PSAic2FuZGJveCIKCiAgICBpX2thdGFfdHlwZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1siaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5jb250YWluZXJfdHlwZSJdCiAgICBwcmludCgiYWxsb3dfYnlfY29udGFpbmVyX3R5cGUgMTogaV9rYXRhX3R5cGUgPSIsIGlfa2F0YV90eXBlKQogICAgaV9rYXRhX3R5cGUgPT0gInBvZF9zYW5kYm94IgoKICAgIGFsbG93X3NhbmRib3hfY29udGFpbmVyX25hbWUocF9vY2ksIGlfb2NpKQogICAgYWxsb3dfc2FuZGJveF9uZXRfbmFtZXNwYWNlKHBfb2NpLCBpX29jaSkKICAgIGFsbG93X3NhbmRib3hfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpCgogICAgcHJpbnQoImFsbG93X2J5X2NvbnRhaW5lcl90eXBlIDE6IHRydWUiKQp9CgphbGxvd19ieV9jb250YWluZXJfdHlwZShpX2NyaV90eXBlLCBwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiBpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgaV9jcmlfdHlwZSA9PSAiY29udGFpbmVyIgoKICAgIGlfa2F0YV90eXBlIDo9IGlfb2NpLkFubm90YXRpb25zWyJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIl0KICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiBpX2thdGFfdHlwZSA9IiwgaV9rYXRhX3R5cGUpCiAgICBpX2thdGFfdHlwZSA9PSAicG9kX2NvbnRhaW5lciIKCiAgICBhbGxvd19jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpCiAgICBhbGxvd19uZXRfbmFtZXNwYWNlKHBfb2NpLCBpX29jaSkKICAgIGFsbG93X2xvZ19kaXJlY3RvcnkocF9vY2ksIGlfb2NpKQoKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiB0cnVlIikKfQoKIyAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLW5hbWUiIGFubm90YXRpb24KYWxsb3dfc2FuZGJveF9jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X2NvbnRhaW5lcl9uYW1lOiBzdGFydCIpCgogICAgY29udGFpbmVyX2Fubm90YXRpb25fbWlzc2luZyhwX29jaSwgaV9vY2ksICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItbmFtZSIpCgogICAgcHJpbnQoImFsbG93X3NhbmRib3hfY29udGFpbmVyX25hbWU6IHRydWUiKQp9CgphbGxvd19jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19jb250YWluZXJfbmFtZTogc3RhcnQiKQoKICAgIGFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uKHBfb2NpLCBpX29jaSwgImlvLmt1YmVybmV0ZXMuY3JpLmNvbnRhaW5lci1uYW1lIikKCiAgICBwcmludCgiYWxsb3dfY29udGFpbmVyX25hbWU6IHRydWUiKQp9Cgpjb250YWluZXJfYW5ub3RhdGlvbl9taXNzaW5nKHBfb2NpLCBpX29jaSwga2V5KSB7CiAgICBwcmludCgiY29udGFpbmVyX2Fubm90YXRpb25fbWlzc2luZzoiLCBrZXkpCgogICAgbm90IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIG5vdCBpX29jaS5Bbm5vdGF0aW9uc1trZXldCgogICAgcHJpbnQoImNvbnRhaW5lcl9hbm5vdGF0aW9uX21pc3Npbmc6IHRydWUiKQp9CgphbGxvd19jb250YWluZXJfYW5ub3RhdGlvbihwX29jaSwgaV9vY2ksIGtleSkgewogICAgcHJpbnQoImFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uOiBrZXkgPSIsIGtleSkKCiAgICBwX3ZhbHVlIDo9IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIGlfdmFsdWUgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgcHJpbnQoImFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uOiBwX3ZhbHVlID0iLCBwX3ZhbHVlLCAiaV92YWx1ZSA9IiwgaV92YWx1ZSkKCiAgICBwX3ZhbHVlID09IGlfdmFsdWUKCiAgICBwcmludCgiYWxsb3dfY29udGFpbmVyX2Fubm90YXRpb246IHRydWUiKQp9CgojICJuZXJkY3RsL25ldHdvcmstbmFtZXNwYWNlIiBhbm5vdGF0aW9uCmFsbG93X3NhbmRib3hfbmV0X25hbWVzcGFjZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X25ldF9uYW1lc3BhY2U6IHN0YXJ0IikKCiAgICBrZXkgOj0gIm5lcmRjdGwvbmV0d29yay1uYW1lc3BhY2UiCgogICAgcF9uYW1lc3BhY2UgOj0gcF9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgaV9uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgcHJpbnQoImFsbG93X3NhbmRib3hfbmV0X25hbWVzcGFjZTogcF9uYW1lc3BhY2UgPSIsIHBfbmFtZXNwYWNlLCAiaV9uYW1lc3BhY2UgPSIsIGlfbmFtZXNwYWNlKQoKICAgIHJlZ2V4Lm1hdGNoKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9uZXRfbmFtZXNwYWNlOiB0cnVlIikKfQoKYWxsb3dfbmV0X25hbWVzcGFjZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19uZXRfbmFtZXNwYWNlOiBzdGFydCIpCgogICAga2V5IDo9ICJuZXJkY3RsL25ldHdvcmstbmFtZXNwYWNlIgoKICAgIG5vdCBwX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICBub3QgaV9vY2kuQW5ub3RhdGlvbnNba2V5XQoKICAgIHByaW50KCJhbGxvd19uZXRfbmFtZXNwYWNlOiB0cnVlIikKfQoKIyAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1sb2ctZGlyZWN0b3J5IiBhbm5vdGF0aW9uCmFsbG93X3NhbmRib3hfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X2xvZ19kaXJlY3Rvcnk6IHN0YXJ0IikKCiAgICBrZXkgOj0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbG9nLWRpcmVjdG9yeSIKCiAgICBwX2RpciA6PSBwX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICByZWdleDEgOj0gcmVwbGFjZShwX2RpciwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHJlZ2V4MiA6PSByZXBsYWNlKHJlZ2V4MSwgIiQoc2FuZGJveC1uYW1lc3BhY2UpIiwgc19uYW1lc3BhY2UpCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiByZWdleDIgPSIsIHJlZ2V4MikKCiAgICBpX2RpciA6PSBpX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiBpX2RpciA9IiwgaV9kaXIpCgogICAgcmVnZXgubWF0Y2gocmVnZXgyLCBpX2RpcikKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiB0cnVlIikKfQoKYWxsb3dfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19sb2dfZGlyZWN0b3J5OiBzdGFydCIpCgogICAga2V5IDo9ICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWxvZy1kaXJlY3RvcnkiCgogICAgbm90IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIG5vdCBpX29jaS5Bbm5vdGF0aW9uc1trZXldCgogICAgcHJpbnQoImFsbG93X2xvZ19kaXJlY3Rvcnk6IHRydWUiKQp9CgphbGxvd19kZXZpY2VzKHBfZGV2aWNlcywgaV9kZXZpY2VzKSB7CiAgICBwcmludCgiYWxsb3dfZGV2aWNlczogc3RhcnQiKQogICAgZXZlcnkgaV9kZXZpY2UgaW4gaV9kZXZpY2VzIHsKICAgICAgICBwcmludCgiYWxsb3dfZGV2aWNlczogaV9kZXZpY2UgPSIsIGlfZGV2aWNlKQogICAgICAgIHNvbWUgcF9kZXZpY2UgaW4gcF9kZXZpY2VzCiAgICAgICAgcF9kZXZpY2UuY29udGFpbmVyX3BhdGggPT0gaV9kZXZpY2UuY29udGFpbmVyX3BhdGgKICAgIH0KICAgIHByaW50KCJhbGxvd19kZXZpY2VzOiB0cnVlIikKfQoKYWxsb3dfbGludXgoc3RhdGVfb3BzLCBwX29jaSwgaV9vY2kpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIHBfbmFtZXNwYWNlcyA6PSBwX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbGludXg6IHAgbmFtZXNwYWNlcyA9IiwgcF9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlcyA6PSBpX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbGludXg6IGkgbmFtZXNwYWNlcyA9IiwgaV9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlX3dpdGhvdXRfbmV0d29yayA6PSBbb2JqIHwgb2JqIDo9IGlfbmFtZXNwYWNlc1tfXTsgb2JqLlR5cGUgIT0gIm5ldHdvcmsiXQoKICAgIHByaW50KCJhbGxvd19saW51eDogaV9uYW1lc3BhY2Vfd2l0aG91dF9uZXR3b3JrID0iLCBpX25hbWVzcGFjZV93aXRob3V0X25ldHdvcmspCgogICAgcF9uYW1lc3BhY2VzID09IGlfbmFtZXNwYWNlX3dpdGhvdXRfbmV0d29yawoKICAgIGFsbG93X21hc2tlZF9wYXRocyhwX29jaSwgaV9vY2kpCiAgICBhbGxvd19yZWFkb25seV9wYXRocyhwX29jaSwgaV9vY2kpCiAgICBhbGxvd19saW51eF9kZXZpY2VzKHBfb2NpLkxpbnV4LkRldmljZXMsIGlfb2NpLkxpbnV4LkRldmljZXMpCiAgICBhbGxvd19saW51eF9zeXNjdGwocF9vY2kuTGludXgsIGlfb2NpLkxpbnV4KQogICAgcmV0IDo9IGFsbG93X25ldHdvcmtfbmFtZXNwYWNlX3N0YXJ0KHN0YXRlX29wcywgcF9vY2ksIGlfb2NpKQogICAgcmV0LmFsbG93ZWQKCiAgICBvcHMgOj0gcmV0Lm9wcwoKICAgIHByaW50KCJhbGxvd19saW51eDogdHJ1ZSIpCn0KCiMgUmV0cmlldmUgdGhlICJuZXR3b3JrIiBuYW1lc3BhY2UgZnJvbSB0aGUgaW5wdXQgZGF0YSBhbmQgcGFzcyBpdCBvbiBmb3IgdGhlCiMgbmV0d29yayBuYW1lc3BhY2UgcG9saWN5IGNoZWNrcy4KYWxsb3dfbmV0d29ya19uYW1lc3BhY2Vfc3RhcnQoc3RhdGVfb3BzLCBwX29jaSwgaV9vY2kpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIHByaW50KCJhbGxvd19uZXR3b3JrX25hbWVzcGFjZSBzdGFydDogc3RhcnQiKQoKICAgIHBfbmFtZXNwYWNlcyA6PSBwX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IHAgbmFtZXNwYWNlcyA9IiwgcF9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlcyA6PSBpX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IGkgbmFtZXNwYWNlcyA9IiwgaV9uYW1lc3BhY2VzKQoKICAgICMgUmV0dXJuIHBhdGggb2YgdGhlICJuZXR3b3JrIiBuYW1lc3BhY2UKICAgIG5ldHdvcmtfbnMgOj0gW29iaiB8IG9iaiA6PSBpX25hbWVzcGFjZXNbX107IG9iai5UeXBlID09ICJuZXR3b3JrIl0KCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IG5ldHdvcmtfbnMgPSIsIG5ldHdvcmtfbnMpCgogICAgcmV0IDo9IGFsbG93X25ldHdvcmtfbmFtZXNwYWNlKHN0YXRlX29wcywgbmV0d29ya19ucykKICAgIHJldC5hbGxvd2VkCgogICAgb3BzIDo9IHJldC5vcHMKfQoKIyBUaGlzIHJ1bGUgaXMgd2hlbiB0aGVyZSdzIG5vIG5ldHdvcmsgbmFtZXNwYWNlIGluIHRoZSBpbnB1dCBkYXRhLgphbGxvd19uZXR3b3JrX25hbWVzcGFjZShzdGF0ZV9vcHMsIG5ldHdvcmtfbnMpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIGNvdW50KG5ldHdvcmtfbnMpID09IDAKCiAgICBuZXR3b3JrX25zX3BhdGggPSAiIgoKICAgIGFkZF9uZXR3b3JrX25hbWVzcGFjZV90b19zdGF0ZSA6PSBzdGF0ZV9hbGxvd3MoIm5ldHdvcmtfbmFtZXNwYWNlIiwgbmV0d29ya19uc19wYXRoKQogICAgb3BzIDo9IGNvbmNhdF9vcF9pZl9ub3RfbnVsbChzdGF0ZV9vcHMsIGFkZF9uZXR3b3JrX25hbWVzcGFjZV90b19zdGF0ZSkKCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2UgMTogdHJ1ZSIpCn0KCiMgVGhpcyBydWxlIGlzIHdoZW4gdGhlcmUncyBleGFjdGx5IG9uZSBuZXR3b3JrIG5hbWVzcGFjZSBpbiB0aGUgaW5wdXQgZGF0YS4KYWxsb3dfbmV0d29ya19uYW1lc3BhY2Uoc3RhdGVfb3BzLCBuZXR3b3JrX25zKSA6PSB7Im9wcyI6IG9wcywgImFsbG93ZWQiOiB0cnVlfSB7CiAgICBjb3VudChuZXR3b3JrX25zKSA9PSAxCgogICAgYWRkX25ldHdvcmtfbmFtZXNwYWNlX3RvX3N0YXRlIDo9IHN0YXRlX2FsbG93cygibmV0d29ya19uYW1lc3BhY2UiLCBuZXR3b3JrX25zWzBdLlBhdGgpCiAgICBvcHMgOj0gY29uY2F0X29wX2lmX25vdF9udWxsKHN0YXRlX29wcywgYWRkX25ldHdvcmtfbmFtZXNwYWNlX3RvX3N0YXRlKQoKICAgIHByaW50KCJhbGxvd19uZXR3b3JrX25hbWVzcGFjZSAyOiB0cnVlIikKfQoKYWxsb3dfbWFza2VkX3BhdGhzKHBfb2NpLCBpX29jaSkgewogICAgcF9wYXRocyA6PSBwX29jaS5MaW51eC5NYXNrZWRQYXRocwogICAgcHJpbnQoImFsbG93X21hc2tlZF9wYXRocyAxOiBwX3BhdGhzID0iLCBwX3BhdGhzKQoKICAgIGlfcGF0aHMgOj0gaV9vY2kuTGludXguTWFza2VkUGF0aHMKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aHMgMTogaV9wYXRocyA9IiwgaV9wYXRocykKCiAgICBhbGxvd19tYXNrZWRfcGF0aHNfYXJyYXkocF9wYXRocywgaV9wYXRocykKCiAgICBwcmludCgiYWxsb3dfbWFza2VkX3BhdGhzIDE6IHRydWUiKQp9CmFsbG93X21hc2tlZF9wYXRocyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aHMgMjogc3RhcnQiKQoKICAgIG5vdCBwX29jaS5MaW51eC5NYXNrZWRQYXRocwogICAgbm90IGlfb2NpLkxpbnV4Lk1hc2tlZFBhdGhzCgogICAgcHJpbnQoImFsbG93X21hc2tlZF9wYXRocyAyOiB0cnVlIikKfQoKIyBBbGwgdGhlIHBvbGljeSBtYXNrZWQgcGF0aHMgbXVzdCBiZSBtYXNrZWQgaW4gdGhlIGlucHV0IGRhdGEgdG9vLgojIElucHV0IGlzIGFsbG93ZWQgdG8gaGF2ZSBtb3JlIG1hc2tlZCBwYXRocyB0aGFuIHRoZSBwb2xpY3kuCmFsbG93X21hc2tlZF9wYXRoc19hcnJheShwX2FycmF5LCBpX2FycmF5KSB7CiAgICBldmVyeSBwX2VsZW0gaW4gcF9hcnJheSB7CiAgICAgICAgYWxsb3dfbWFza2VkX3BhdGgocF9lbGVtLCBpX2FycmF5KQogICAgfQp9CgphbGxvd19tYXNrZWRfcGF0aChwX2VsZW0sIGlfYXJyYXkpIHsKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aDogcF9lbGVtID0iLCBwX2VsZW0pCgogICAgc29tZSBpX2VsZW0gaW4gaV9hcnJheQogICAgcF9lbGVtID09IGlfZWxlbQoKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aDogdHJ1ZSIpCn0KCmFsbG93X3JlYWRvbmx5X3BhdGhzKHBfb2NpLCBpX29jaSkgewogICAgcF9wYXRocyA6PSBwX29jaS5MaW51eC5SZWFkb25seVBhdGhzCiAgICBwcmludCgiYWxsb3dfcmVhZG9ubHlfcGF0aHMgMTogcF9wYXRocyA9IiwgcF9wYXRocykKCiAgICBpX3BhdGhzIDo9IGlfb2NpLkxpbnV4LlJlYWRvbmx5UGF0aHMKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAxOiBpX3BhdGhzID0iLCBpX3BhdGhzKQoKICAgIGFsbG93X3JlYWRvbmx5X3BhdGhzX2FycmF5KHBfcGF0aHMsIGlfcGF0aHMsIGlfb2NpLkxpbnV4Lk1hc2tlZFBhdGhzKQoKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAxOiB0cnVlIikKfQphbGxvd19yZWFkb25seV9wYXRocyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAyOiBzdGFydCIpCgogICAgbm90IHBfb2NpLkxpbnV4LlJlYWRvbmx5UGF0aHMKICAgIG5vdCBpX29jaS5MaW51eC5SZWFkb25seVBhdGhzCgogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGhzIDI6IHRydWUiKQp9CgojIEFsbCB0aGUgcG9saWN5IHJlYWRvbmx5IHBhdGhzIG11c3QgYmUgZWl0aGVyOgojIC0gUHJlc2VudCBpbiB0aGUgaW5wdXQgcmVhZG9ubHkgcGF0aHMsIG9yCiMgLSBQcmVzZW50IGluIHRoZSBpbnB1dCBtYXNrZWQgcGF0aHMuCiMgSW5wdXQgaXMgYWxsb3dlZCB0byBoYXZlIG1vcmUgcmVhZG9ubHkgcGF0aHMgdGhhbiB0aGUgcG9saWN5LgphbGxvd19yZWFkb25seV9wYXRoc19hcnJheShwX2FycmF5LCBpX2FycmF5LCBtYXNrZWRfcGF0aHMpIHsKICAgIGV2ZXJ5IHBfZWxlbSBpbiBwX2FycmF5IHsKICAgICAgICBhbGxvd19yZWFkb25seV9wYXRoKHBfZWxlbSwgaV9hcnJheSwgbWFza2VkX3BhdGhzKQogICAgfQp9CgphbGxvd19yZWFkb25seV9wYXRoKHBfZWxlbSwgaV9hcnJheSwgbWFza2VkX3BhdGhzKSB7CiAgICBwcmludCgiYWxsb3dfcmVhZG9ubHlfcGF0aCAxOiBwX2VsZW0gPSIsIHBfZWxlbSkKCiAgICBzb21lIGlfZWxlbSBpbiBpX2FycmF5CiAgICBwX2VsZW0gPT0gaV9lbGVtCgogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGggMTogdHJ1ZSIpCn0KYWxsb3dfcmVhZG9ubHlfcGF0aChwX2VsZW0sIGlfYXJyYXksIG1hc2tlZF9wYXRocykgewogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGggMjogcF9lbGVtID0iLCBwX2VsZW0pCgogICAgc29tZSBpX21hc2tlZCBpbiBtYXNrZWRfcGF0aHMKICAgIHBfZWxlbSA9PSBpX21hc2tlZAoKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRoIDI6IHRydWUiKQp9CgphbGxvd19saW51eF9kZXZpY2VzKHBfZGV2aWNlcywgaV9kZXZpY2VzKSB7CiAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogc3RhcnQiKQogICAgZXZlcnkgaV9kZXZpY2UgaW4gaV9kZXZpY2VzIHsKICAgICAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogaV9kZXZpY2UgPSIsIGlfZGV2aWNlKQogICAgICAgIHNvbWUgcF9kZXZpY2UgaW4gcF9kZXZpY2VzCiAgICAgICAgaV9kZXZpY2UuUGF0aCA9PSBwX2RldmljZS5QYXRoCiAgICB9CiAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogdHJ1ZSIpCn0KCmFsbG93X2xpbnV4X3N5c2N0bChwX2xpbnV4LCBpX2xpbnV4KSB7CiAgICBwcmludCgiYWxsb3dfbGludXhfc3lzY3RsIDE6IHN0YXJ0IikKICAgIG5vdCBpX2xpbnV4LlN5c2N0bAogICAgcHJpbnQoImFsbG93X2xpbnV4X3N5c2N0bCAxOiB0cnVlIikKfQoKYWxsb3dfbGludXhfc3lzY3RsKHBfbGludXgsIGlfbGludXgpIHsKICAgIHByaW50KCJhbGxvd19saW51eF9zeXNjdGwgMjogc3RhcnQiKQogICAgcF9zeXNjdGwgOj0gcF9saW51eC5TeXNjdGwKICAgIGlfc3lzY3RsIDo9IGlfbGludXguU3lzY3RsCiAgICBldmVyeSBpX25hbWUsIGlfdmFsIGluIGlfc3lzY3RsIHsKICAgICAgICBwcmludCgiYWxsb3dfbGludXhfc3lzY3RsIDI6IGlfbmFtZSA9IiwgaV9uYW1lLCAiaV92YWwgPSIsIGlfdmFsKQogICAgICAgIHBfc3lzY3RsW2lfbmFtZV0gPT0gaV92YWwKICAgIH0KICAgIHByaW50KCJhbGxvd19saW51eF9zeXNjdGwgMjogdHJ1ZSIpCn0KCiMgQ2hlY2sgdGhlIGNvbnNpc3RlbmN5IG9mIHRoZSBpbnB1dCAiaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5idW5kbGVfcGF0aCIKIyBhbmQgaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCIgdmFsdWVzIHdpdGggb3RoZXIgZmllbGRzLgphbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZChwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpIHsKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogc3RhcnQiKQoKICAgIGJ1bmRsZV9wYXRoIDo9IGlfb2NpLkFubm90YXRpb25zWyJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmJ1bmRsZV9wYXRoIl0KICAgIGJ1bmRsZV9pZCA6PSByZXBsYWNlKGJ1bmRsZV9wYXRoLCAiL3J1bi9jb250YWluZXJkL2lvLmNvbnRhaW5lcmQucnVudGltZS52Mi50YXNrL2s4cy5pby8iLCAiIikKCiAgICBidW5kbGVfaWRfZm9ybWF0IDo9IGNvbmNhdCgiIiwgWyJeIiwgQlVORExFX0lELCAiJCJdKQogICAgcmVnZXgubWF0Y2goYnVuZGxlX2lkX2Zvcm1hdCwgYnVuZGxlX2lkKQoKICAgIGtleSA6PSAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCIKCiAgICBwX3JlZ2V4IDo9IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIHNhbmRib3hfaWQgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQoKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogc2FuZGJveF9pZCA9Iiwgc2FuZGJveF9pZCwgInJlZ2V4ID0iLCBwX3JlZ2V4KQogICAgcmVnZXgubWF0Y2gocF9yZWdleCwgc2FuZGJveF9pZCkKCiAgICBhbGxvd19yb290X3BhdGgocF9vY2ksIGlfb2NpLCBidW5kbGVfaWQpCgogICAgZXZlcnkgaV9tb3VudCBpbiBpX29jaS5Nb3VudHMgewogICAgICAgIGFsbG93X21vdW50KHBfb2NpLCBpX21vdW50LCBpX3N0b3JhZ2VzLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpCiAgICB9CgogICAgYWxsb3dfc3RvcmFnZXMocF9zdG9yYWdlcywgaV9zdG9yYWdlcywgYnVuZGxlX2lkLCBzYW5kYm94X2lkKQoKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogdHJ1ZSIpCn0KCmFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHBfcHJvY2VzcyA9IiwgcF9wcm9jZXNzKQogICAgcHJpbnQoImFsbG93X3Byb2Nlc3NfY29tbW9uOiBpX3Byb2Nlc3MgPSAiLCBpX3Byb2Nlc3MpCiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHNfbmFtZSA9Iiwgc19uYW1lKQoKICAgIHBfcHJvY2Vzcy5Dd2QgPT0gaV9wcm9jZXNzLkN3ZAogICAgcF9wcm9jZXNzLk5vTmV3UHJpdmlsZWdlcyA9PSBpX3Byb2Nlc3MuTm9OZXdQcml2aWxlZ2VzCgogICAgYWxsb3dfdXNlcihwX3Byb2Nlc3MsIGlfcHJvY2VzcykKICAgIGFsbG93X2VudihwX3Byb2Nlc3MsIGlfcHJvY2Vzcywgc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHRydWUiKQp9CgojIENvbXBhcmUgdGhlIE9DSSBQcm9jZXNzIGZpZWxkIG9mIGEgcG9saWN5IGNvbnRhaW5lciB3aXRoIHRoZSBpbnB1dCBPQ0kgUHJvY2VzcyBmcm9tIGEgQ3JlYXRlQ29udGFpbmVyUmVxdWVzdAphbGxvd19wcm9jZXNzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfcHJvY2Vzczogc3RhcnQiKQoKICAgIGFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgYWxsb3dfY2FwcyhwX3Byb2Nlc3MuQ2FwYWJpbGl0aWVzLCBpX3Byb2Nlc3MuQ2FwYWJpbGl0aWVzKQogICAgcF9wcm9jZXNzLlRlcm1pbmFsID09IGlfcHJvY2Vzcy5UZXJtaW5hbAoKICAgIHByaW50KCJhbGxvd19wcm9jZXNzOiB0cnVlIikKfQoKIyBDb21wYXJlIHRoZSBPQ0kgUHJvY2VzcyBmaWVsZCBvZiBhIHBvbGljeSBjb250YWluZXIgd2l0aCB0aGUgaW5wdXQgcHJvY2VzcyBmaWVsZCBmcm9tIEV4ZWNQcm9jZXNzUmVxdWVzdAphbGxvd19pbnRlcmFjdGl2ZV9wcm9jZXNzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfaW50ZXJhY3RpdmVfcHJvY2Vzczogc3RhcnQiKQoKICAgIGFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgYWxsb3dfZXhlY19jYXBzKGlfcHJvY2Vzcy5DYXBhYmlsaXRpZXMpCgogICAgIyBUaGVzZSBhcmUgY29tbWFuZHMgZW5hYmxlZCB1c2luZyBFeGVjUHJvY2Vzc1JlcXVlc3QgY29tbWFuZHMgYW5kL29yIHJlZ2V4IGZyb20gdGhlIHNldHRpbmdzIGZpbGUuCiAgICAjIFRoZXkgY2FuIGJlIGV4ZWN1dGVkIGludGVyYWN0aXZlbHkgc28gYWxsb3cgdGhlbSB0byB1c2UgYW55IHZhbHVlIGZvciBpX3Byb2Nlc3MuVGVybWluYWwuCgogICAgcHJpbnQoImFsbG93X2ludGVyYWN0aXZlX3Byb2Nlc3M6IHRydWUiKQp9CgojIENvbXBhcmUgdGhlIE9DSSBQcm9jZXNzIGZpZWxkIG9mIGEgcG9saWN5IGNvbnRhaW5lciB3aXRoIHRoZSBpbnB1dCBwcm9jZXNzIGZpZWxkIGZyb20gRXhlY1Byb2Nlc3NSZXF1ZXN0CmFsbG93X3Byb2JlX3Byb2Nlc3MocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19wcm9iZV9wcm9jZXNzOiBzdGFydCIpCgogICAgYWxsb3dfcHJvY2Vzc19jb21tb24ocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpCiAgICBhbGxvd19leGVjX2NhcHMoaV9wcm9jZXNzLkNhcGFiaWxpdGllcykKICAgIHBfcHJvY2Vzcy5UZXJtaW5hbCA9PSBpX3Byb2Nlc3MuVGVybWluYWwKCiAgICBwcmludCgiYWxsb3dfcHJvYmVfcHJvY2VzczogdHJ1ZSIpCn0KCmFsbG93X3VzZXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MpIHsKICAgIHBfdXNlciA6PSBwX3Byb2Nlc3MuVXNlcgogICAgaV91c2VyIDo9IGlfcHJvY2Vzcy5Vc2VyCgogICAgcHJpbnQoImFsbG93X3VzZXI6IGlucHV0IHVpZCA9IiwgaV91c2VyLlVJRCwgInBvbGljeSB1aWQgPSIsIHBfdXNlci5VSUQpCiAgICBwX3VzZXIuVUlEID09IGlfdXNlci5VSUQKCiAgICAjIFRPRE86IHRyYWNrIGRvd24gdGhlIHJlYXNvbiBmb3IgcmVnaXN0cnkuazhzLmlvL3BhdXNlOjMuOSBiZWluZwogICAgIyAgICAgICBleGVjdXRlZCB3aXRoIGdpZCA9IDAgZGVzcGl0ZSBoYXZpbmcgIjY1NTM1OjY1NTM1IiBpbiBpdHMgY29udGFpbmVyIGltYWdlCiAgICAjICAgICAgIGNvbmZpZy4KICAgICNwcmludCgiYWxsb3dfdXNlcjogaW5wdXQgZ2lkID0iLCBpX3VzZXIuR0lELCAicG9saWN5IGdpZCA9IiwgcF91c2VyLkdJRCkKICAgICNwX3VzZXIuR0lEID09IGlfdXNlci5HSUQKCiAgICAjIFRPRE86IGNvbXBhcmUgdGhlIGFkZGl0aW9uYWxHaWRzIGZpZWxkIHRvbyBhZnRlciBjb21wdXRpbmcgaXRzIHZhbHVlCiAgICAjIGJhc2VkIG9uIC9ldGMvcGFzc3dkIGFuZCAvZXRjL2dyb3VwIGZyb20gdGhlIGNvbnRhaW5lciBpbWFnZS4KfQoKYWxsb3dfZGVwcmVjYXRlZF9hcmdzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZ3MgMTogbm8gYXJncyIpCgogICAgbm90IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJncwogICAgbm90IGlfcHJvY2Vzcy5BcmdzCgogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAxOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZ3MocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSkgewogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiBwb2xpY3kgYXJncyA9IiwgcF9wcm9jZXNzLkRlcHJlY2F0ZWRBcmdzKQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiBpbnB1dCBhcmdzID0iLCBpX3Byb2Nlc3MuQXJncykKCiAgICBjb3VudChwX3Byb2Nlc3MuRGVwcmVjYXRlZEFyZ3MpID09IGNvdW50KGlfcHJvY2Vzcy5BcmdzKQoKICAgIGV2ZXJ5IGksIGlfYXJnIGluIGlfcHJvY2Vzcy5BcmdzIHsKICAgICAgICBhbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpCiAgICB9CgogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDE6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgcF9hcmcyIDo9IHJlcGxhY2UocF9hcmcsICIkJCIsICIkIikKICAgIHBfYXJnMiA9PSBpX2FyZwoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAxOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDI6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgIyBUT0RPOiBjYW4gJChub2RlLW5hbWUpIGJlIGhhbmRsZWQgYmV0dGVyPwogICAgY29udGFpbnMocF9hcmcsICIkKG5vZGUtbmFtZSkiKQoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAyOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDM6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgcF9hcmcyIDo9IHJlcGxhY2UocF9hcmcsICIkJCIsICIkIikKICAgIHBfYXJnMyA6PSByZXBsYWNlKHBfYXJnMiwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAzOiBwX2FyZzMgPSIsIHBfYXJnMykKICAgIHBfYXJnMyA9PSBpX2FyZwoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAzOiB0cnVlIikKfQoKIyBPQ0kgcHJvY2Vzcy5FbnYgZmllbGQKYWxsb3dfZW52KHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfZW52OiBwIGVudiA9IiwgcF9wcm9jZXNzLkVudikKICAgIHByaW50KCJhbGxvd19lbnY6IGkgZW52ID0iLCBpX3Byb2Nlc3MuRW52KQoKICAgIGV2ZXJ5IGlfdmFyIGluIGlfcHJvY2Vzcy5FbnYgewogICAgICAgIHByaW50KCJhbGxvd19lbnY6IGlfdmFyID0iLCBpX3ZhcikKICAgICAgICBhbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgfQoKICAgIHByaW50KCJhbGxvd19lbnY6IHRydWUiKQp9CgojIEFsbG93IGlucHV0IGVudiB2YXJpYWJsZXMgdGhhdCBhcmUgcHJlc2VudCBpbiB0aGUgcG9saWN5IGRhdGEgdG9vLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHBfdmFyID09IGlfdmFyCiAgICBwcmludCgiYWxsb3dfdmFyIDE6IHRydWUiKQp9CgojIE1hdGNoIGlucHV0IHdpdGggb25lIG9mIHRoZSBwb2xpY3kgdmFyaWFibGVzLCBhZnRlciBzdWJzdGl0dXRpbmcgJChzYW5kYm94LW5hbWUpLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHByaW50KCJhbGxvd192YXIgMjogcF92YXIgPSIsIHBfdmFyKQoKICAgIHBfdmFyX3NwbGl0IDo9IHNwbGl0KHBfdmFyLCAiPSIpCiAgICBjb3VudChwX3Zhcl9zcGxpdCkgPT0gMgoKICAgIHBfdmFyX3NwbGl0WzFdID09ICIkKHNhbmRib3gtbmFtZSkiCgogICAgaV92YXJfc3BsaXQgOj0gc3BsaXQoaV92YXIsICI9IikKICAgIGNvdW50KGlfdmFyX3NwbGl0KSA9PSAyCgogICAgaV92YXJfc3BsaXRbMF0gPT0gcF92YXJfc3BsaXRbMF0KICAgIHJlZ2V4Lm1hdGNoKHNfbmFtZSwgaV92YXJfc3BsaXRbMV0pCgogICAgcHJpbnQoImFsbG93X3ZhciAyOiB0cnVlIikKfQoKIyBBbGxvdyBpbnB1dCBlbnYgdmFyaWFibGVzIHRoYXQgbWF0Y2ggd2l0aCBhIHJlcXVlc3RfZGVmYXVsdHMgcmVnZXguCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHNvbWUgcF9yZWdleDEgaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5DcmVhdGVDb250YWluZXJSZXF1ZXN0LmFsbG93X2Vudl9yZWdleAogICAgcF9yZWdleDIgOj0gcmVwbGFjZShwX3JlZ2V4MSwgIiQoaXB2NF9hKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcHY0X2EpCiAgICBwX3JlZ2V4MyA6PSByZXBsYWNlKHBfcmVnZXgyLCAiJChpcF9wKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcF9wKQogICAgcF9yZWdleDQgOj0gcmVwbGFjZShwX3JlZ2V4MywgIiQoc3ZjX25hbWUpIiwgcG9saWN5X2RhdGEuY29tbW9uLnN2Y19uYW1lKQogICAgcF9yZWdleDUgOj0gcmVwbGFjZShwX3JlZ2V4NCwgIiQoZG5zX2xhYmVsKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5kbnNfbGFiZWwpCgogICAgcHJpbnQoImFsbG93X3ZhciAzOiBwX3JlZ2V4NSA9IiwgcF9yZWdleDUpCiAgICByZWdleC5tYXRjaChwX3JlZ2V4NSwgaV92YXIpCgogICAgcHJpbnQoImFsbG93X3ZhciAzOiB0cnVlIikKfQoKIyBBbGxvdyBmaWVsZFJlZiAiZmllbGRQYXRoOiBzdGF0dXMucG9kSVAiIHZhbHVlcy4KYWxsb3dfdmFyKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBpX3Zhciwgc19uYW1lLCBzX25hbWVzcGFjZSkgewogICAgbmFtZV92YWx1ZSA6PSBzcGxpdChpX3ZhciwgIj0iKQogICAgY291bnQobmFtZV92YWx1ZSkgPT0gMgogICAgaXNfaXAobmFtZV92YWx1ZVsxXSkKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIGFsbG93X3BvZF9pcF92YXIobmFtZV92YWx1ZVswXSwgcF92YXIpCgogICAgcHJpbnQoImFsbG93X3ZhciA0OiB0cnVlIikKfQoKIyBBbGxvdyBjb21tb24gZmllbGRSZWYgdmFyaWFibGVzLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBuYW1lX3ZhbHVlIDo9IHNwbGl0KGlfdmFyLCAiPSIpCiAgICBjb3VudChuYW1lX3ZhbHVlKSA9PSAyCgogICAgc29tZSBwX3ZhciBpbiBwX3Byb2Nlc3MuRW52CiAgICBwX25hbWVfdmFsdWUgOj0gc3BsaXQocF92YXIsICI9IikKICAgIGNvdW50KHBfbmFtZV92YWx1ZSkgPT0gMgoKICAgIHBfbmFtZV92YWx1ZVswXSA9PSBuYW1lX3ZhbHVlWzBdCgogICAgIyBUT0RPOiBzaG91bGQgdGhlc2UgYmUgaGFuZGxlZCBpbiBhIGRpZmZlcmVudCB3YXk/CiAgICBhbHdheXNfYWxsb3dlZCA6PSBbIiQoaG9zdC1uYW1lKSIsICIkKG5vZGUtbmFtZSkiLCAiJChwb2QtdWlkKSJdCiAgICBzb21lIGFsbG93ZWQgaW4gYWx3YXlzX2FsbG93ZWQKICAgIGNvbnRhaW5zKHBfbmFtZV92YWx1ZVsxXSwgYWxsb3dlZCkKCiAgICBwcmludCgiYWxsb3dfdmFyIDU6IHRydWUiKQp9CgojIEFsbG93IGZpZWxkUmVmICJmaWVsZFBhdGg6IHN0YXR1cy5ob3N0SVAiIHZhbHVlcy4KYWxsb3dfdmFyKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBpX3Zhciwgc19uYW1lLCBzX25hbWVzcGFjZSkgewogICAgbmFtZV92YWx1ZSA6PSBzcGxpdChpX3ZhciwgIj0iKQogICAgY291bnQobmFtZV92YWx1ZSkgPT0gMgogICAgaXNfaXAobmFtZV92YWx1ZVsxXSkKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIGFsbG93X2hvc3RfaXBfdmFyKG5hbWVfdmFsdWVbMF0sIHBfdmFyKQoKICAgIHByaW50KCJhbGxvd192YXIgNjogdHJ1ZSIpCn0KCiMgQWxsb3cgcmVzb3VyY2VGaWVsZFJlZiB2YWx1ZXMgKGUuZy4sICJsaW1pdHMuY3B1IikuCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIG5hbWVfdmFsdWUgOj0gc3BsaXQoaV92YXIsICI9IikKICAgIGNvdW50KG5hbWVfdmFsdWUpID09IDIKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHBfbmFtZV92YWx1ZSA6PSBzcGxpdChwX3ZhciwgIj0iKQogICAgY291bnQocF9uYW1lX3ZhbHVlKSA9PSAyCgogICAgcF9uYW1lX3ZhbHVlWzBdID09IG5hbWVfdmFsdWVbMF0KCiAgICAjIGEgdmFyaWFibGUgd2Ugc2hvdWxkIGJlIHZhbGlkYXRpbmcgdXNpbmcgYSByZWdleCBmcm9tIHNldHRpbmdzCiAgICBwX25hbWVfdmFsdWVbMV0gPT0gIiQodmFsaWRhdGUtZnJvbS1zZXR0aW5ncykiCgogICAgcmVnZXhfdmFsIDo9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuQ3JlYXRlQ29udGFpbmVyUmVxdWVzdC5hbGxvd19lbnZfcmVnZXhfbWFwW25hbWVfdmFsdWVbMF1dCgogICAgcHJpbnQoImFsbG93X3ZhciA3OiB2YWwgPSIsIG5hbWVfdmFsdWVbMV0pCiAgICBwcmludCgiYWxsb3dfdmFyIDc6IHJlZ2V4X3ZhbCA9IiwgcmVnZXhfdmFsKQoKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4X3ZhbCwgbmFtZV92YWx1ZVsxXSkKCiAgICBwcmludCgiYWxsb3dfdmFyIDc6IHRydWUiKQp9CgojIE1hdGNoIGlucHV0IHdpdGggb25lIG9mIHRoZSBwb2xpY3kgdmFyaWFibGVzLCBhZnRlciBzdWJzdGl0dXRpbmcgJChzYW5kYm94LW5hbWVzcGFjZSkuCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHNvbWUgcF92YXIgaW4gcF9wcm9jZXNzLkVudgogICAgcF92YXIyIDo9IHJlcGxhY2UocF92YXIsICIkKHNhbmRib3gtbmFtZXNwYWNlKSIsIHNfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd192YXIgODogcF92YXIyID0iLCBwX3ZhcjIpCiAgICBwX3ZhcjIgPT0gaV92YXIKCiAgICBwcmludCgiYWxsb3dfdmFyIDg6IHRydWUiKQp9CgphbGxvd19wb2RfaXBfdmFyKHZhcl9uYW1lLCBwX3ZhcikgewogICAgcHJpbnQoImFsbG93X3BvZF9pcF92YXI6IHZhcl9uYW1lID0iLCB2YXJfbmFtZSwgInBfdmFyID0iLCBwX3ZhcikKCiAgICBwX25hbWVfdmFsdWUgOj0gc3BsaXQocF92YXIsICI9IikKICAgIGNvdW50KHBfbmFtZV92YWx1ZSkgPT0gMgoKICAgIHBfbmFtZV92YWx1ZVswXSA9PSB2YXJfbmFtZQogICAgcF9uYW1lX3ZhbHVlWzFdID09ICIkKHBvZC1pcCkiCgogICAgcHJpbnQoImFsbG93X3BvZF9pcF92YXI6IHRydWUiKQp9CgphbGxvd19ob3N0X2lwX3Zhcih2YXJfbmFtZSwgcF92YXIpIHsKICAgIHByaW50KCJhbGxvd19ob3N0X2lwX3ZhcjogdmFyX25hbWUgPSIsIHZhcl9uYW1lLCAicF92YXIgPSIsIHBfdmFyKQoKICAgIHBfbmFtZV92YWx1ZSA6PSBzcGxpdChwX3ZhciwgIj0iKQogICAgY291bnQocF9uYW1lX3ZhbHVlKSA9PSAyCgogICAgcF9uYW1lX3ZhbHVlWzBdID09IHZhcl9uYW1lCiAgICBwX25hbWVfdmFsdWVbMV0gPT0gIiQoaG9zdC1pcCkiCgogICAgcHJpbnQoImFsbG93X2hvc3RfaXBfdmFyOiB0cnVlIikKfQoKaXNfaXAodmFsdWUpIHsKICAgIGJ5dGVzID0gc3BsaXQodmFsdWUsICIuIikKICAgIGNvdW50KGJ5dGVzKSA9PSA0CgogICAgaXNfaXBfZmlyc3RfYnl0ZShieXRlc1swXSkKICAgIGlzX2lwX290aGVyX2J5dGUoYnl0ZXNbMV0pCiAgICBpc19pcF9vdGhlcl9ieXRlKGJ5dGVzWzJdKQogICAgaXNfaXBfb3RoZXJfYnl0ZShieXRlc1szXSkKfQppc19pcF9maXJzdF9ieXRlKGNvbXBvbmVudCkgewogICAgbnVtYmVyID0gdG9fbnVtYmVyKGNvbXBvbmVudCkKICAgIG51bWJlciA+PSAxCiAgICBudW1iZXIgPD0gMjU1Cn0KaXNfaXBfb3RoZXJfYnl0ZShjb21wb25lbnQpIHsKICAgIG51bWJlciA9IHRvX251bWJlcihjb21wb25lbnQpCiAgICBudW1iZXIgPj0gMAogICAgbnVtYmVyIDw9IDI1NQp9CgojIE9DSSByb290LlBhdGgKYWxsb3dfcm9vdF9wYXRoKHBfb2NpLCBpX29jaSwgYnVuZGxlX2lkKSB7CiAgICBpX3BhdGggOj0gaV9vY2kuUm9vdC5QYXRoCiAgICBwX3BhdGgxIDo9IHBfb2NpLlJvb3QuUGF0aAogICAgcHJpbnQoImFsbG93X3Jvb3RfcGF0aDogaV9wYXRoID0iLCBpX3BhdGgsICJwX3BhdGgxID0iLCBwX3BhdGgxKQoKICAgIHBfcGF0aDIgOj0gcmVwbGFjZShwX3BhdGgxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfcm9vdF9wYXRoOiBwX3BhdGgyID0iLCBwX3BhdGgyKQoKICAgIHBfcGF0aDMgOj0gcmVwbGFjZShwX3BhdGgyLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X3Jvb3RfcGF0aDogcF9wYXRoMyA9IiwgcF9wYXRoMykKCiAgICBwX3BhdGgzID09IGlfcGF0aAoKICAgIHByaW50KCJhbGxvd19yb290X3BhdGg6IHRydWUiKQp9CgojIGRldmljZSBtb3VudHMKYWxsb3dfbW91bnQocF9vY2ksIGlfbW91bnQsIGlfc3RvcmFnZXMsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcHJpbnQoImFsbG93X21vdW50OiBpX21vdW50ID0iLCBpX21vdW50KQoKICAgIHNvbWUgcF9tb3VudCBpbiBwX29jaS5Nb3VudHMKICAgIHNvbWUgaV9zdG9yYWdlIGluIGlfc3RvcmFnZXMKCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IHBfbW91bnQgPSIsIHBfbW91bnQpCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IGlfc3RvcmFnZSA9IiwgaV9zdG9yYWdlKQoKICAgIGNoZWNrX21vdW50KHBfbW91bnQsIGlfbW91bnQsIGlfc3RvcmFnZSwgYnVuZGxlX2lkLCBzYW5kYm94X2lkKQoKICAgICMgVE9ETzogYXJlIHRoZXJlIGFueSBvdGhlciByZXF1aXJlZCBwb2xpY3kgY2hlY2tzIGZvciBtb3VudHMgLSBlLmcuLAogICAgIyAgICAgICBtdWx0aXBsZSBtb3VudHMgd2l0aCBzYW1lIHNvdXJjZSBvciBkZXN0aW5hdGlvbj8KCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IHRydWUiKQp9CgpjaGVja19tb3VudChwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcF9tb3VudCA9PSBpX21vdW50CiAgICBwcmludCgiY2hlY2tfbW91bnQgMTogdHJ1ZSIpCn0KY2hlY2tfbW91bnQocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHBfbW91bnQuZGVzdGluYXRpb24gPT0gaV9tb3VudC5kZXN0aW5hdGlvbgogICAgcF9tb3VudC50eXBlXyA9PSBpX21vdW50LnR5cGVfCiAgICBwX21vdW50Lm9wdGlvbnMgPT0gaV9tb3VudC5vcHRpb25zCgogICAgbW91bnRfc291cmNlX2FsbG93cyhwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkKCiAgICBwcmludCgiY2hlY2tfbW91bnQgMjogdHJ1ZSIpCn0KCm1vdW50X3NvdXJjZV9hbGxvd3MocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHJlZ2V4MSA6PSBwX21vdW50LnNvdXJjZQogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5tb3VudF9zb3VyY2VfY3BhdGgpCiAgICByZWdleDQgOj0gcmVwbGFjZShyZWdleDMsICIkKGJ1bmRsZS1pZCkiLCBidW5kbGVfaWQpCgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMTogcmVnZXg0ID0iLCByZWdleDQpCiAgICByZWdleC5tYXRjaChyZWdleDQsIGlfbW91bnQuc291cmNlKQoKICAgIHByaW50KCJtb3VudF9zb3VyY2VfYWxsb3dzIDE6IHRydWUiKQp9Cm1vdW50X3NvdXJjZV9hbGxvd3MocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHJlZ2V4MSA6PSBwX21vdW50LnNvdXJjZQogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5tb3VudF9zb3VyY2VfY3BhdGgpCiAgICByZWdleDQgOj0gcmVwbGFjZShyZWdleDMsICIkKHNhbmRib3gtaWQpIiwgc2FuZGJveF9pZCkKCiAgICBwcmludCgibW91bnRfc291cmNlX2FsbG93cyAyOiByZWdleDQgPSIsIHJlZ2V4NCkKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4NCwgaV9tb3VudC5zb3VyY2UpCgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMjogdHJ1ZSIpCn0KbW91bnRfc291cmNlX2FsbG93cyhwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogaV9tb3VudC5zb3VyY2UgPSIsIGlfbW91bnQuc291cmNlKQogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogaV9zdG9yYWdlLm1vdW50X3BvaW50ID0iLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCgogICAgaV9tb3VudC5zb3VyY2UgPT0gaV9zdG9yYWdlLm1vdW50X3BvaW50CgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogdHJ1ZSIpCn0KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBDcmVhdGUgY29udGFpbmVyIFN0b3JhZ2VzCgphbGxvd19zdG9yYWdlcyhwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHBfY291bnQgOj0gY291bnQocF9zdG9yYWdlcykKICAgIGlfY291bnQgOj0gY291bnQoaV9zdG9yYWdlcykKICAgIHByaW50KCJhbGxvd19zdG9yYWdlczogcF9jb3VudCA9IiwgcF9jb3VudCwgImlfY291bnQgPSIsIGlfY291bnQpCgogICAgcF9jb3VudCA9PSBpX2NvdW50CgogICAgIyBHZXQgdGhlIGNvbnRhaW5lciBpbWFnZSBsYXllciBJRHMgYW5kIHZlcml0eSByb290IGhhc2hlcywgZnJvbSB0aGUgIm92ZXJsYXlmcyIgc3RvcmFnZS4KICAgIHNvbWUgb3ZlcmxheV9zdG9yYWdlIGluIHBfc3RvcmFnZXMKICAgIG92ZXJsYXlfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIHByaW50KCJhbGxvd19zdG9yYWdlczogb3ZlcmxheV9zdG9yYWdlID0iLCBvdmVybGF5X3N0b3JhZ2UpCiAgICBjb3VudChvdmVybGF5X3N0b3JhZ2Uub3B0aW9ucykgPT0gMgoKICAgIGxheWVyX2lkcyA6PSBzcGxpdChvdmVybGF5X3N0b3JhZ2Uub3B0aW9uc1swXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiBsYXllcl9pZHMgPSIsIGxheWVyX2lkcykKCiAgICByb290X2hhc2hlcyA6PSBzcGxpdChvdmVybGF5X3N0b3JhZ2Uub3B0aW9uc1sxXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiByb290X2hhc2hlcyA9Iiwgcm9vdF9oYXNoZXMpCgogICAgZXZlcnkgaV9zdG9yYWdlIGluIGlfc3RvcmFnZXMgewogICAgICAgIGFsbG93X3N0b3JhZ2UocF9zdG9yYWdlcywgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpCiAgICB9CgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiB0cnVlIikKfQoKYWxsb3dfc3RvcmFnZShwX3N0b3JhZ2VzLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgc29tZSBwX3N0b3JhZ2UgaW4gcF9zdG9yYWdlcwoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiBwX3N0b3JhZ2UgPSIsIHBfc3RvcmFnZSkKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiBpX3N0b3JhZ2UgPSIsIGlfc3RvcmFnZSkKCiAgICBwX3N0b3JhZ2UuZHJpdmVyICAgICAgICAgICA9PSBpX3N0b3JhZ2UuZHJpdmVyCiAgICBwX3N0b3JhZ2UuZHJpdmVyX29wdGlvbnMgICA9PSBpX3N0b3JhZ2UuZHJpdmVyX29wdGlvbnMKICAgIHBfc3RvcmFnZS5mc19ncm91cCAgICAgICAgID09IGlfc3RvcmFnZS5mc19ncm91cAogICAgcF9zdG9yYWdlLmZzdHlwZSAgICAgICAgICAgPT0gaV9zdG9yYWdlLmZzdHlwZQoKICAgIGFsbG93X3N0b3JhZ2Vfc291cmNlKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKQogICAgYWxsb3dfc3RvcmFnZV9vcHRpb25zKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKQogICAgYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKQoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiB0cnVlIikKfQoKYWxsb3dfc3RvcmFnZV9zb3VyY2UocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX3NvdXJjZSAxOiBzdGFydCIpCgogICAgcF9zdG9yYWdlLnNvdXJjZSA9PSBpX3N0b3JhZ2Uuc291cmNlCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDE6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX3NvdXJjZShwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDI6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCgogICAgIyBEREREOkJCOkRELkY6IERvbWFpbjpCdXM6RGV2aWNlLkZ1bmN0aW9uCiAgICAjIGh0dHBzOi8vd3d3Lmtlcm5lbC5vcmcvZG9jL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtYnVzLXBjaQogICAgcmVnZXgubWF0Y2goYF5bYS1mMC05XXs0fTpbYS1mMC05XXsyfTpbYS1mMC05XXsyfVwuW2EtZjAtOV0kYCwgaV9zdG9yYWdlLnNvdXJjZSkKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9zb3VyY2UgMjogdHJ1ZSIpCn0KCmFsbG93X3N0b3JhZ2Vfc291cmNlKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKSB7CiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9zb3VyY2UgMzogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIGlfc3RvcmFnZS5zb3VyY2UgPT0gIm5vbmUiCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDM6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX3NvdXJjZShwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDQ6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJzbWIiCgogICAgIyBQYXR0ZXJuOiAvLzxzdG9yYWdlLWFjY291bnQtbmFtZT4uZmlsZS5jb3JlLndpbmRvd3MubmV0LzxrOHMtUFZDLW5hbWU+CiAgICAjIFN0b3JhZ2UgYWNjb3VudCBuYW1lOiBodHRwczovL2xlYXJuLm1pY3Jvc29mdC5jb20vZW4tdXMvYXp1cmUvc3RvcmFnZS9jb21tb24vc3RvcmFnZS1hY2NvdW50LW92ZXJ2aWV3I3N0b3JhZ2UtYWNjb3VudC1uYW1lCiAgICAjIEs4cyBQVkMgbmFtZTogaHR0cHM6Ly9rdWJlcm5ldGVzLmlvL2RvY3MvY29uY2VwdHMvb3ZlcnZpZXcvd29ya2luZy13aXRoLW9iamVjdHMvbmFtZXMvI2Rucy1zdWJkb21haW4tbmFtZXMKICAgIHJlZ2V4Lm1hdGNoKGBeXC9cLyhbYS16MC05XXszLDI0fSlcLmZpbGVcLmNvcmVcLndpbmRvd3NcLm5ldFwvW2EtejAtOV0oW2EtejAtOS4tXXswLDI1MX1bYS16MC05XSk/JGAsIGlfc3RvcmFnZS5zb3VyY2UpCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDQ6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMTogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgIT0gIm92ZXJsYXlmcyIKICAgIHBfc3RvcmFnZS5vcHRpb25zID09IGlfc3RvcmFnZS5vcHRpb25zCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAxOiB0cnVlIikKfQphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIGNvdW50KHBfc3RvcmFnZS5vcHRpb25zKSA9PSAyCgogICAgcG9saWN5X2lkcyA6PSBzcGxpdChwX3N0b3JhZ2Uub3B0aW9uc1swXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBwb2xpY3lfaWRzID0iLCBwb2xpY3lfaWRzKQogICAgcG9saWN5X2lkcyA9PSBsYXllcl9pZHMKCiAgICBwb2xpY3lfaGFzaGVzIDo9IHNwbGl0KHBfc3RvcmFnZS5vcHRpb25zWzFdLCAiOiIpCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IHBvbGljeV9oYXNoZXMgPSIsIHBvbGljeV9oYXNoZXMpCgogICAgcF9jb3VudCA6PSBjb3VudChwb2xpY3lfaWRzKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBwX2NvdW50ID0iLCBwX2NvdW50KQogICAgcF9jb3VudCA+PSAxCiAgICBwX2NvdW50ID09IGNvdW50KHBvbGljeV9oYXNoZXMpCgogICAgaV9jb3VudCA6PSBjb3VudChpX3N0b3JhZ2Uub3B0aW9ucykKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogaV9jb3VudCA9IiwgaV9jb3VudCkKICAgIGlfY291bnQgPT0gcF9jb3VudCArIDMKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zWzBdID0iLCBpX3N0b3JhZ2Uub3B0aW9uc1swXSkKICAgIGlfc3RvcmFnZS5vcHRpb25zWzBdID09ICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQubGF5ZXItc3JjLXByZWZpeD0vdmFyL2xpYi9jb250YWluZXJkL2lvLmNvbnRhaW5lcmQuc25hcHNob3R0ZXIudjEudGFyZGV2L2xheWVycyIKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zW2lfY291bnQgLSAyXSA9IiwgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDJdKQogICAgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDJdID09ICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQub3ZlcmxheS1ydyIKCiAgICBsb3dlcmRpciA6PSBjb25jYXQoIj0iLCBbImxvd2VyZGlyIiwgcF9zdG9yYWdlLm9wdGlvbnNbMF1dKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBsb3dlcmRpciA9IiwgbG93ZXJkaXIpCgogICAgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDFdID09IGxvd2VyZGlyCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zW2lfY291bnQgLSAxXSA9IiwgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDFdKQoKICAgIGV2ZXJ5IGksIHBvbGljeV9pZCBpbiBwb2xpY3lfaWRzIHsKICAgICAgICBhbGxvd19vdmVybGF5X2xheWVyKHBvbGljeV9pZCwgcG9saWN5X2hhc2hlc1tpXSwgaV9zdG9yYWdlLm9wdGlvbnNbaSArIDFdKQogICAgfQoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogdHJ1ZSIpCn0KYWxsb3dfc3RvcmFnZV9vcHRpb25zKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKSB7CiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDM6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCiAgICBjb3VudChwX3N0b3JhZ2Uub3B0aW9ucykgPT0gMQoKICAgIHN0YXJ0c3dpdGgocF9zdG9yYWdlLm9wdGlvbnNbMF0sICIkKGhhc2giKQogICAgaGFzaF9zdWZmaXggOj0gdHJpbV9sZWZ0KHBfc3RvcmFnZS5vcHRpb25zWzBdLCAiJChoYXNoIikKCiAgICBlbmRzd2l0aChoYXNoX3N1ZmZpeCwgIikiKQogICAgaGFzaF9pbmRleCA6PSB0cmltX3JpZ2h0KGhhc2hfc3VmZml4LCAiKSIpCiAgICBpIDo9IHRvX251bWJlcihoYXNoX2luZGV4KQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAzOiBpID0iLCBpKQoKICAgIGhhc2hfb3B0aW9uIDo9IGNvbmNhdCgiPSIsIFsiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LnJvb3QtaGFzaCIsIHJvb3RfaGFzaGVzW2ldXSkKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMzogaGFzaF9vcHRpb24gPSIsIGhhc2hfb3B0aW9uKQoKICAgIGNvdW50KGlfc3RvcmFnZS5vcHRpb25zKSA9PSA0CiAgICBpX3N0b3JhZ2Uub3B0aW9uc1swXSA9PSAicm8iCiAgICBpX3N0b3JhZ2Uub3B0aW9uc1sxXSA9PSAiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmJsb2NrX2RldmljZT1maWxlIgogICAgaV9zdG9yYWdlLm9wdGlvbnNbMl0gPT0gImlvLmthdGFjb250YWluZXJzLmZzLW9wdC5pcy1sYXllciIKICAgIGlfc3RvcmFnZS5vcHRpb25zWzNdID09IGhhc2hfb3B0aW9uCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAzOiB0cnVlIikKfQphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgNDogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gInNtYiIKICAgIHBfb3B0c19jb3VudCA6PSBjb3VudChwX3N0b3JhZ2Uub3B0aW9ucykKICAgIGlfb3B0c19jb3VudCA6PSBjb3VudChpX3N0b3JhZ2Uub3B0aW9ucykKICAgIGlfb3B0c19jb3VudCA9PSBwX29wdHNfY291bnQgKyAyCgogICAgaV9vcHRfbWF0Y2hlcyA6PSBbaSB8IGkgOj0gaWR4OyBpZHggPCBwX29wdHNfY291bnQ7IHBfc3RvcmFnZS5vcHRpb25zW2lkeF0gPT0gaV9zdG9yYWdlLm9wdGlvbnNbaWR4XV0KICAgIGNvdW50KGlfb3B0X21hdGNoZXMpID09IHBfb3B0c19jb3VudAoKICAgIHN0YXJ0c3dpdGgoaV9zdG9yYWdlLm9wdGlvbnNbaV9vcHRzX2NvdW50LTJdLCAiYWRkcj0iKQogICAgY3JlZHMgPSBzcGxpdChpX3N0b3JhZ2Uub3B0aW9uc1tpX29wdHNfY291bnQtMV0sICIsIikKICAgIGNvdW50KGNyZWRzKSA9PSAyCiAgICBzdGFydHN3aXRoKGNyZWRzWzBdLCAidXNlcm5hbWU9IikKICAgIHN0YXJ0c3dpdGgoY3JlZHNbMV0sICJwYXNzd29yZD0iKQogICAgCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDQ6IHRydWUiKQp9CgphbGxvd19vdmVybGF5X2xheWVyKHBvbGljeV9pZCwgcG9saWN5X2hhc2gsIGlfb3B0aW9uKSB7CiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogcG9saWN5X2lkID0iLCBwb2xpY3lfaWQsICJwb2xpY3lfaGFzaCA9IiwgcG9saWN5X2hhc2gpCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogaV9vcHRpb24gPSIsIGlfb3B0aW9uKQoKICAgIHN0YXJ0c3dpdGgoaV9vcHRpb24sICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQubGF5ZXI9IikKICAgIGlfdmFsdWUgOj0gcmVwbGFjZShpX29wdGlvbiwgImlvLmthdGFjb250YWluZXJzLmZzLW9wdC5sYXllcj0iLCAiIikKICAgIGlfdmFsdWVfZGVjb2RlZCA6PSBiYXNlNjQuZGVjb2RlKGlfdmFsdWUpCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogaV92YWx1ZV9kZWNvZGVkID0iLCBpX3ZhbHVlX2RlY29kZWQpCgogICAgcG9saWN5X3N1ZmZpeCA6PSBjb25jYXQoIj0iLCBbInRhcixybyxpby5rYXRhY29udGFpbmVycy5mcy1vcHQuYmxvY2tfZGV2aWNlPWZpbGUsaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmlzLWxheWVyLGlvLmthdGFjb250YWluZXJzLmZzLW9wdC5yb290LWhhc2giLCBwb2xpY3lfaGFzaF0pCiAgICBwX3ZhbHVlIDo9IGNvbmNhdCgiLCIsIFtwb2xpY3lfaWQsIHBvbGljeV9zdWZmaXhdKQogICAgcHJpbnQoImFsbG93X292ZXJsYXlfbGF5ZXI6IHBfdmFsdWUgPSIsIHBfdmFsdWUpCgogICAgcF92YWx1ZSA9PSBpX3ZhbHVlX2RlY29kZWQKCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogdHJ1ZSIpCn0KCmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAidGFyIgoKICAgIHN0YXJ0c3dpdGgocF9zdG9yYWdlLm1vdW50X3BvaW50LCAiJChsYXllciIpCiAgICBtb3VudF9zdWZmaXggOj0gdHJpbV9sZWZ0KHBfc3RvcmFnZS5tb3VudF9wb2ludCwgIiQobGF5ZXIiKQoKICAgIGVuZHN3aXRoKG1vdW50X3N1ZmZpeCwgIikiKQogICAgbGF5ZXJfaW5kZXggOj0gdHJpbV9yaWdodChtb3VudF9zdWZmaXgsICIpIikKICAgIGkgOj0gdG9fbnVtYmVyKGxheWVyX2luZGV4KQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDE6IGkgPSIsIGkpCgogICAgbGF5ZXJfaWQgOj0gbGF5ZXJfaWRzW2ldCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMTogbGF5ZXJfaWQgPSIsIGxheWVyX2lkKQoKICAgIHBfbW91bnQgOj0gY29uY2F0KCIvIiwgWyIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L2xheWVycyIsIGxheWVyX2lkXSkKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCAxOiBwX21vdW50ID0iLCBwX21vdW50KQoKICAgIHBfbW91bnQgPT0gaV9zdG9yYWdlLm1vdW50X3BvaW50CgogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDE6IHRydWUiKQp9CmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAiZnVzZTMua2F0YS1vdmVybGF5IgoKICAgIG1vdW50MSA6PSByZXBsYWNlKHBfc3RvcmFnZS5tb3VudF9wb2ludCwgIiQoY3BhdGgpIiwgcG9saWN5X2RhdGEuY29tbW9uLmNwYXRoKQogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDI6IG1vdW50MiA9IiwgbW91bnQyKQoKICAgIG1vdW50MiA9PSBpX3N0b3JhZ2UubW91bnRfcG9pbnQKCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMjogdHJ1ZSIpCn0KYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKSB7CiAgICBwX3N0b3JhZ2UuZnN0eXBlID09ICJsb2NhbCIKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQyID0iLCBtb3VudDIpCgogICAgbW91bnQzIDo9IHJlcGxhY2UobW91bnQyLCAiJChzYW5kYm94LWlkKSIsIHNhbmRib3hfaWQpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQzID0iLCBtb3VudDMpCgogICAgcmVnZXgubWF0Y2gobW91bnQzLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCgogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDM6IHRydWUiKQp9CmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAiYmluZCIKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNDogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNDogbW91bnQyID0iLCBtb3VudDIpCgogICAgbW91bnQzIDo9IHJlcGxhY2UobW91bnQyLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDQ6IG1vdW50MyA9IiwgbW91bnQzKQoKICAgIHJlZ2V4Lm1hdGNoKG1vdW50MywgaV9zdG9yYWdlLm1vdW50X3BvaW50KQoKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA0OiB0cnVlIikKfQphbGxvd19tb3VudF9wb2ludChwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgYnVuZGxlX2lkLCBzYW5kYm94X2lkLCBsYXllcl9pZHMpIHsKICAgIHBfc3RvcmFnZS5mc3R5cGUgPT0gInRtcGZzIgoKICAgIG1vdW50MSA6PSBwX3N0b3JhZ2UubW91bnRfcG9pbnQKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA1OiBtb3VudDEgPSIsIG1vdW50MSkKCiAgICByZWdleC5tYXRjaChtb3VudDEsIGlfc3RvcmFnZS5tb3VudF9wb2ludCkKCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNTogdHJ1ZSIpCn0KYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKSB7CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogaV9zdG9yYWdlLm1vdW50X3BvaW50ID0iLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCiAgICBhbGxvd19kaXJlY3Rfdm9sX2RyaXZlcihwX3N0b3JhZ2UsIGlfc3RvcmFnZSkKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChzcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQyID0iLCBtb3VudDIpCgogICAgZGlyZWN0X3ZvbF9wYXRoIDo9IGlfc3RvcmFnZS5zb3VyY2UKICAgIG1vdW50MyA6PSByZXBsYWNlKG1vdW50MiwgIiQoYjY0LWRpcmVjdC12b2wtcGF0aCkiLCBiYXNlNjR1cmwuZW5jb2RlKGRpcmVjdF92b2xfcGF0aCkpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQzID0iLCBtb3VudDMpCgogICAgbW91bnQzID09IGlfc3RvcmFnZS5tb3VudF9wb2ludAoKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA2OiB0cnVlIikKfQoKYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIocF9zdG9yYWdlLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19kaXJlY3Rfdm9sX2RyaXZlciAxOiBzdGFydCIpCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCiAgICBwcmludCgiYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIgMTogdHJ1ZSIpCn0KYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIocF9zdG9yYWdlLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19kaXJlY3Rfdm9sX2RyaXZlciAyOiBzdGFydCIpCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJzbWIiCiAgICBwcmludCgiYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIgMjogdHJ1ZSIpCn0KCiMgRXhlY1Byb2Nlc3NSZXF1ZXN0LnByb2Nlc3MuQ2FwYWJpbGl0aWVzCmFsbG93X2V4ZWNfY2FwcyhpX2NhcHMpIHsKICAgIG5vdCBpX2NhcHMuQW1iaWVudAogICAgbm90IGlfY2Fwcy5Cb3VuZGluZwogICAgbm90IGlfY2Fwcy5FZmZlY3RpdmUKICAgIG5vdCBpX2NhcHMuSW5oZXJpdGFibGUKICAgIG5vdCBpX2NhcHMuUGVybWl0dGVkCn0KCiMgT0NJLlByb2Nlc3MuQ2FwYWJpbGl0aWVzCmFsbG93X2NhcHMocF9jYXBzLCBpX2NhcHMpIHsKICAgIHByaW50KCJhbGxvd19jYXBzOiBwb2xpY3kgQW1iaWVudCA9IiwgcF9jYXBzLkFtYmllbnQpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgQW1iaWVudCA9IiwgaV9jYXBzLkFtYmllbnQpCiAgICBtYXRjaF9jYXBzKHBfY2Fwcy5BbWJpZW50LCBpX2NhcHMuQW1iaWVudCkKCiAgICBwcmludCgiYWxsb3dfY2FwczogcG9saWN5IEJvdW5kaW5nID0iLCBwX2NhcHMuQm91bmRpbmcpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgQm91bmRpbmcgPSIsIGlfY2Fwcy5Cb3VuZGluZykKICAgIG1hdGNoX2NhcHMocF9jYXBzLkJvdW5kaW5nLCBpX2NhcHMuQm91bmRpbmcpCgogICAgcHJpbnQoImFsbG93X2NhcHM6IHBvbGljeSBFZmZlY3RpdmUgPSIsIHBfY2Fwcy5FZmZlY3RpdmUpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgRWZmZWN0aXZlID0iLCBpX2NhcHMuRWZmZWN0aXZlKQogICAgbWF0Y2hfY2FwcyhwX2NhcHMuRWZmZWN0aXZlLCBpX2NhcHMuRWZmZWN0aXZlKQoKICAgIHByaW50KCJhbGxvd19jYXBzOiBwb2xpY3kgSW5oZXJpdGFibGUgPSIsIHBfY2Fwcy5Jbmhlcml0YWJsZSkKICAgIHByaW50KCJhbGxvd19jYXBzOiBpbnB1dCBJbmhlcml0YWJsZSA9IiwgaV9jYXBzLkluaGVyaXRhYmxlKQogICAgbWF0Y2hfY2FwcyhwX2NhcHMuSW5oZXJpdGFibGUsIGlfY2Fwcy5Jbmhlcml0YWJsZSkKCiAgICBwcmludCgiYWxsb3dfY2FwczogcG9saWN5IFBlcm1pdHRlZCA9IiwgcF9jYXBzLlBlcm1pdHRlZCkKICAgIHByaW50KCJhbGxvd19jYXBzOiBpbnB1dCBQZXJtaXR0ZWQgPSIsIGlfY2Fwcy5QZXJtaXR0ZWQpCiAgICBtYXRjaF9jYXBzKHBfY2Fwcy5QZXJtaXR0ZWQsIGlfY2Fwcy5QZXJtaXR0ZWQpCn0KCm1hdGNoX2NhcHMocF9jYXBzLCBpX2NhcHMpIHsKICAgIHByaW50KCJtYXRjaF9jYXBzIDE6IHN0YXJ0IikKCiAgICBwX2NhcHMgPT0gaV9jYXBzCgogICAgcHJpbnQoIm1hdGNoX2NhcHMgMTogdHJ1ZSIpCn0KbWF0Y2hfY2FwcyhwX2NhcHMsIGlfY2FwcykgewogICAgcHJpbnQoIm1hdGNoX2NhcHMgMjogc3RhcnQiKQoKICAgIGNvdW50KHBfY2FwcykgPT0gMQogICAgcF9jYXBzWzBdID09ICIkKGRlZmF1bHRfY2FwcykiCgogICAgcHJpbnQoIm1hdGNoX2NhcHMgMjogZGVmYXVsdF9jYXBzID0iLCBwb2xpY3lfZGF0YS5jb21tb24uZGVmYXVsdF9jYXBzKQogICAgcG9saWN5X2RhdGEuY29tbW9uLmRlZmF1bHRfY2FwcyA9PSBpX2NhcHMKCiAgICBwcmludCgibWF0Y2hfY2FwcyAyOiB0cnVlIikKfQptYXRjaF9jYXBzKHBfY2FwcywgaV9jYXBzKSB7CiAgICBwcmludCgibWF0Y2hfY2FwcyAzOiBzdGFydCIpCgogICAgY291bnQocF9jYXBzKSA9PSAxCiAgICBwX2NhcHNbMF0gPT0gIiQocHJpdmlsZWdlZF9jYXBzKSIKCiAgICBwcmludCgibWF0Y2hfY2FwcyAzOiBwcml2aWxlZ2VkX2NhcHMgPSIsIHBvbGljeV9kYXRhLmNvbW1vbi5wcml2aWxlZ2VkX2NhcHMpCiAgICBwb2xpY3lfZGF0YS5jb21tb24ucHJpdmlsZWdlZF9jYXBzID09IGlfY2FwcwoKICAgIHByaW50KCJtYXRjaF9jYXBzIDM6IHRydWUiKQp9CgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgpjaGVja19kaXJlY3RvcnlfdHJhdmVyc2FsKGlfcGF0aCkgewogICAgbm90IHJlZ2V4Lm1hdGNoKCIoXnwvKS4uKCR8LykiLCBpX3BhdGgpCn0KCmNoZWNrX3N5bWxpbmtfc291cmNlKGlfc3JjKSB7CiAgICBpX3NyYyA9PSAiIgogICAgcHJpbnQoImNoZWNrX3N5bWxpbmtfc291cmNlIDE6IHRydWUiKQp9CmNoZWNrX3N5bWxpbmtfc291cmNlKGlfc3JjKSB7CiAgICBpX3NyYyAhPSAiIgogICAgcHJpbnQoImNoZWNrX3N5bWxpbmtfc291cmNlIDI6IGlfc3JjID0iLCBpX3NyYykKCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24uc19zb3VyY2UxLCBpX3NyYykKCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMjogdHJ1ZSIpCn0KY2hlY2tfc3ltbGlua19zb3VyY2UoaV9zcmMpIHsKICAgIGlfc3JjICE9ICIiCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMzogaV9zcmMgPSIsIGlfc3JjKQoKICAgIHJlZ2V4Lm1hdGNoKHBvbGljeV9kYXRhLmNvbW1vbi5zX3NvdXJjZTIsIGlfc3JjKQogICAgY2hlY2tfZGlyZWN0b3J5X3RyYXZlcnNhbChpX3NyYykKCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMzogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfc3RvcmFnZXMoaV9zdG9yYWdlcykgewogICAgcHJpbnQoImFsbG93X3NhbmRib3hfc3RvcmFnZXM6IGlfc3RvcmFnZXMgPSIsIGlfc3RvcmFnZXMpCgogICAgcF9zdG9yYWdlcyA6PSBwb2xpY3lfZGF0YS5zYW5kYm94LnN0b3JhZ2VzCiAgICBldmVyeSBpX3N0b3JhZ2UgaW4gaV9zdG9yYWdlcyB7CiAgICAgICAgYWxsb3dfc2FuZGJveF9zdG9yYWdlKHBfc3RvcmFnZXMsIGlfc3RvcmFnZSkKICAgIH0KCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9zdG9yYWdlczogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfc3RvcmFnZShwX3N0b3JhZ2VzLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IGlfc3RvcmFnZSA9IiwgaV9zdG9yYWdlKQoKICAgIHNvbWUgcF9zdG9yYWdlIGluIHBfc3RvcmFnZXMKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IHBfc3RvcmFnZSA9IiwgcF9zdG9yYWdlKQogICAgaV9zdG9yYWdlID09IHBfc3RvcmFnZQoKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IHRydWUiKQp9CgpDb3B5RmlsZVJlcXVlc3QgewogICAgcHJpbnQoIkNvcHlGaWxlUmVxdWVzdDogaW5wdXQucGF0aCA9IiwgaW5wdXQucGF0aCkKCiAgICBjaGVja19zeW1saW5rX3NvdXJjZShpbnB1dC5zeW1saW5rX3NyYykKICAgIGNoZWNrX2RpcmVjdG9yeV90cmF2ZXJzYWwoaW5wdXQucGF0aCkKCiAgICBzb21lIHJlZ2V4MSBpbiBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLkNvcHlGaWxlUmVxdWVzdAogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5jcGF0aCkKICAgIHJlZ2V4NCA6PSByZXBsYWNlKHJlZ2V4MywgIiQoYnVuZGxlLWlkKSIsIEJVTkRMRV9JRCkKICAgIHByaW50KCJDb3B5RmlsZVJlcXVlc3Q6IHJlZ2V4NCA9IiwgcmVnZXg0KQoKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4NCwgaW5wdXQucGF0aCkKCiAgICBwcmludCgiQ29weUZpbGVSZXF1ZXN0OiB0cnVlIikKfQoKQ3JlYXRlU2FuZGJveFJlcXVlc3QgewogICAgcHJpbnQoIkNyZWF0ZVNhbmRib3hSZXF1ZXN0OiBpbnB1dC5ndWVzdF9ob29rX3BhdGggPSIsIGlucHV0Lmd1ZXN0X2hvb2tfcGF0aCkKICAgIGNvdW50KGlucHV0Lmd1ZXN0X2hvb2tfcGF0aCkgPT0gMAoKICAgIHByaW50KCJDcmVhdGVTYW5kYm94UmVxdWVzdDogaW5wdXQua2VybmVsX21vZHVsZXMgPSIsIGlucHV0Lmtlcm5lbF9tb2R1bGVzKQogICAgY291bnQoaW5wdXQua2VybmVsX21vZHVsZXMpID09IDAKCiAgICBpX3BpZG5zIDo9IGlucHV0LnNhbmRib3hfcGlkbnMKICAgIHByaW50KCJDcmVhdGVTYW5kYm94UmVxdWVzdDogaV9waWRucyA9IiwgaV9waWRucykKICAgIGlfcGlkbnMgPT0gZmFsc2UKICAgIGFsbG93X3NhbmRib3hfc3RvcmFnZXMoaW5wdXQuc3RvcmFnZXMpCn0KCmFsbG93X2V4ZWMocF9jb250YWluZXIsIGlfcHJvY2VzcykgewogICAgcHJpbnQoImFsbG93X2V4ZWM6IHN0YXJ0IikKCiAgICBwX29jaSA9IHBfY29udGFpbmVyLk9DSQogICAgcF9zX25hbWUgPSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc19uYW1lc3BhY2UgPSBnZXRfc3RhdGVfdmFsKCJuYW1lc3BhY2UiKQogICAgYWxsb3dfcHJvYmVfcHJvY2VzcyhwX29jaS5Qcm9jZXNzLCBpX3Byb2Nlc3MsIHBfc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfZXhlYzogdHJ1ZSIpCn0KCmFsbG93X2ludGVyYWN0aXZlX2V4ZWMocF9jb250YWluZXIsIGlfcHJvY2VzcykgewogICAgcHJpbnQoImFsbG93X2ludGVyYWN0aXZlX2V4ZWM6IHN0YXJ0IikKCiAgICBwX29jaSA9IHBfY29udGFpbmVyLk9DSQogICAgcF9zX25hbWUgPSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc19uYW1lc3BhY2UgPSBnZXRfc3RhdGVfdmFsKCJuYW1lc3BhY2UiKQogICAgYWxsb3dfaW50ZXJhY3RpdmVfcHJvY2VzcyhwX29jaS5Qcm9jZXNzLCBpX3Byb2Nlc3MsIHBfc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfaW50ZXJhY3RpdmVfZXhlYzogdHJ1ZSIpCn0KCiMgVE9ETzogc2hvdWxkIG90aGVyIEV4ZWNQcm9jZXNzUmVxdWVzdCBpbnB1dCBkYXRhIGZpZWxkcyBiZSB2YWxpZGF0ZWQgYXMgd2VsbD8KRXhlY1Byb2Nlc3NSZXF1ZXN0IHsKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMTogaW5wdXQgPSIsIGlucHV0KQoKICAgIHNvbWUgcF9jb21tYW5kIGluIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuRXhlY1Byb2Nlc3NSZXF1ZXN0LmFsbG93ZWRfY29tbWFuZHMKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMTogcF9jb21tYW5kID0iLCBwX2NvbW1hbmQpCiAgICBwX2NvbW1hbmQgPT0gaW5wdXQucHJvY2Vzcy5BcmdzCgogICAgIyBUT0RPOiBtYXRjaCBwX2NvbnRhaW5lcidzIElEIHdpdGggdGhlIGlucHV0IGNvbnRhaW5lcl9pZC4KICAgIHNvbWUgcF9jb250YWluZXIgaW4gcG9saWN5X2RhdGEuY29udGFpbmVycwogICAgYWxsb3dfaW50ZXJhY3RpdmVfZXhlYyhwX2NvbnRhaW5lciwgaW5wdXQucHJvY2VzcykKCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDE6IHRydWUiKQp9CkV4ZWNQcm9jZXNzUmVxdWVzdCB7CiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDI6IGlucHV0ID0iLCBpbnB1dCkKCiAgICAjIFRPRE86IG1hdGNoIGlucHV0IGNvbnRhaW5lciBJRCB3aXRoIGl0cyBjb3JyZXNwb25kaW5nIGNvbnRhaW5lci5leGVjX2NvbW1hbmRzLgogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBzb21lIHBfY29tbWFuZCBpbiBwX2NvbnRhaW5lci5leGVjX2NvbW1hbmRzCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDI6IHBfY29tbWFuZCA9IiwgcF9jb21tYW5kKQoKICAgICMgVE9ETzogc2hvdWxkIG90aGVyIGlucHV0IGRhdGEgZmllbGRzIGJlIHZhbGlkYXRlZCBhcyB3ZWxsPwogICAgcF9jb21tYW5kID09IGlucHV0LnByb2Nlc3MuQXJncwoKICAgIGFsbG93X2V4ZWMocF9jb250YWluZXIsIGlucHV0LnByb2Nlc3MpCgogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAyOiB0cnVlIikKfQpFeGVjUHJvY2Vzc1JlcXVlc3QgewogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAzOiBpbnB1dCA9IiwgaW5wdXQpCgogICAgaV9jb21tYW5kID0gY29uY2F0KCIgIiwgaW5wdXQucHJvY2Vzcy5BcmdzKQogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAzOiBpX2NvbW1hbmQgPSIsIGlfY29tbWFuZCkKCiAgICBzb21lIHBfcmVnZXggaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5FeGVjUHJvY2Vzc1JlcXVlc3QucmVnZXgKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMzogcF9yZWdleCA9IiwgcF9yZWdleCkKCiAgICByZWdleC5tYXRjaChwX3JlZ2V4LCBpX2NvbW1hbmQpCgogICAgIyBUT0RPOiBtYXRjaCBwX2NvbnRhaW5lcidzIElEIHdpdGggdGhlIGlucHV0IGNvbnRhaW5lcl9pZC4KICAgIHNvbWUgcF9jb250YWluZXIgaW4gcG9saWN5X2RhdGEuY29udGFpbmVycwogICAgYWxsb3dfaW50ZXJhY3RpdmVfZXhlYyhwX2NvbnRhaW5lciwgaW5wdXQucHJvY2VzcykKCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDM6IHRydWUiKQp9CgpVcGRhdGVSb3V0ZXNSZXF1ZXN0IHsKICAgIHByaW50KCJVcGRhdGVSb3V0ZXNSZXF1ZXN0OiBpbnB1dCA9IiwgaW5wdXQpCiAgICBwcmludCgiVXBkYXRlUm91dGVzUmVxdWVzdDogcG9saWN5ID0iLCBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLlVwZGF0ZVJvdXRlc1JlcXVlc3QpCgogICAgaV9yb3V0ZXMgOj0gaW5wdXQucm91dGVzLlJvdXRlcwogICAgcF9zb3VyY2VfcmVnZXggPSBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLlVwZGF0ZVJvdXRlc1JlcXVlc3QuZm9yYmlkZGVuX3NvdXJjZV9yZWdleAogICAgcF9uYW1lcyA9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuVXBkYXRlUm91dGVzUmVxdWVzdC5mb3JiaWRkZW5fZGV2aWNlX25hbWVzCgogICAgZXZlcnkgaV9yb3V0ZSBpbiBpX3JvdXRlcyB7CiAgICAgICAgcHJpbnQoImlfcm91dGUuc291cmNlID0iLCBpX3JvdXRlLnNvdXJjZSkKICAgICAgICBldmVyeSBwX3JlZ2V4IGluIHBfc291cmNlX3JlZ2V4IHsKICAgICAgICAgICAgcHJpbnQoInBfcmVnZXggPSIsIHBfcmVnZXgpCiAgICAgICAgICAgIG5vdCByZWdleC5tYXRjaChwX3JlZ2V4LCBpX3JvdXRlLnNvdXJjZSkKICAgICAgICB9CgogICAgICAgIHByaW50KCJpX3JvdXRlLmRldmljZSA9IiwgaV9yb3V0ZS5kZXZpY2UpCiAgICAgICAgbm90IGlfcm91dGUuZGV2aWNlIGluIHBfbmFtZXMKICAgIH0KCiAgICBwcmludCgiVXBkYXRlUm91dGVzUmVxdWVzdDogdHJ1ZSIpCn0KClVwZGF0ZUludGVyZmFjZVJlcXVlc3QgewogICAgcHJpbnQoIlVwZGF0ZUludGVyZmFjZVJlcXVlc3Q6IGlucHV0ID0iLCBpbnB1dCkKICAgIHByaW50KCJVcGRhdGVJbnRlcmZhY2VSZXF1ZXN0OiBwb2xpY3kgPSIsIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuVXBkYXRlSW50ZXJmYWNlUmVxdWVzdCkKCiAgICBpX2ludGVyZmFjZSA6PSBpbnB1dC5pbnRlcmZhY2UKICAgIHBfZmxhZ3MgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmFsbG93X3Jhd19mbGFncwoKICAgICMgVHlwaWNhbGx5LCBqdXN0IElGRl9OT0FSUCBpcyB1c2VkLgogICAgYml0cy5hbmQoaV9pbnRlcmZhY2UucmF3X2ZsYWdzLCBiaXRzLm5lZ2F0ZShwX2ZsYWdzKSkgPT0gMAoKICAgIHBfbmFtZXMgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmZvcmJpZGRlbl9uYW1lcwoKICAgIG5vdCBpX2ludGVyZmFjZS5uYW1lIGluIHBfbmFtZXMKCiAgICBwX2h3YWRkcnMgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmZvcmJpZGRlbl9od19hZGRycwoKICAgIG5vdCBpX2ludGVyZmFjZS5od0FkZHIgaW4gcF9od2FkZHJzCgogICAgcHJpbnQoIlVwZGF0ZUludGVyZmFjZVJlcXVlc3Q6IHRydWUiKQp9CgpDbG9zZVN0ZGluUmVxdWVzdCB7CiAgICBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLkNsb3NlU3RkaW5SZXF1ZXN0ID09IHRydWUKfQoKUmVhZFN0cmVhbVJlcXVlc3QgewogICAgcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5SZWFkU3RyZWFtUmVxdWVzdCA9PSB0cnVlCn0KClVwZGF0ZUVwaGVtZXJhbE1vdW50c1JlcXVlc3QgewogICAgcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVFcGhlbWVyYWxNb3VudHNSZXF1ZXN0ID09IHRydWUKfQoKV3JpdGVTdHJlYW1SZXF1ZXN0IHsKICAgIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuV3JpdGVTdHJlYW1SZXF1ZXN0ID09IHRydWUKfQoKcG9saWN5X2RhdGEgOj0gewogICJjb250YWluZXJzIjogWwogICAgewogICAgICAiT0NJIjogewogICAgICAgICJWZXJzaW9uIjogIjEuMS4wLXJjLjEiLAogICAgICAgICJQcm9jZXNzIjogewogICAgICAgICAgIlRlcm1pbmFsIjogZmFsc2UsCiAgICAgICAgICAiVXNlciI6IHsKICAgICAgICAgICAgIlVJRCI6IDY1NTM1LAogICAgICAgICAgICAiR0lEIjogNjU1MzUsCiAgICAgICAgICAgICJBZGRpdGlvbmFsR2lkcyI6IFtdLAogICAgICAgICAgICAiVXNlcm5hbWUiOiAiIgogICAgICAgICAgfSwKICAgICAgICAgICJEZXByZWNhdGVkQXJncyI6IFsKICAgICAgICAgICAgIi9wYXVzZSIKICAgICAgICAgIF0sCiAgICAgICAgICAiQXJncyI6IFsKICAgICAgICAgICAgIi9wYXVzZSIKICAgICAgICAgIF0sCiAgICAgICAgICAiRW52IjogWwogICAgICAgICAgICAiUEFUSD0vdXNyL2xvY2FsL3NiaW46L3Vzci9sb2NhbC9iaW46L3Vzci9zYmluOi91c3IvYmluOi9zYmluOi9iaW4iCiAgICAgICAgICBdLAogICAgICAgICAgIkN3ZCI6ICIvIiwKICAgICAgICAgICJDYXBhYmlsaXRpZXMiOiB7CiAgICAgICAgICAgICJBbWJpZW50IjogW10sCiAgICAgICAgICAgICJCb3VuZGluZyI6IFsKICAgICAgICAgICAgICAiJChkZWZhdWx0X2NhcHMpIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiRWZmZWN0aXZlIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJJbmhlcml0YWJsZSI6IFtdLAogICAgICAgICAgICAiUGVybWl0dGVkIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICAiTm9OZXdQcml2aWxlZ2VzIjogdHJ1ZQogICAgICAgIH0sCiAgICAgICAgIlJvb3QiOiB7CiAgICAgICAgICAiUGF0aCI6ICIkKGNwYXRoKS8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgIlJlYWRvbmx5IjogdHJ1ZQogICAgICAgIH0sCiAgICAgICAgIk1vdW50cyI6IFsKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9wcm9jIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJwcm9jIiwKICAgICAgICAgICAgInR5cGVfIjogInByb2MiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2IiwKICAgICAgICAgICAgInNvdXJjZSI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJzdHJpY3RhdGltZSIsCiAgICAgICAgICAgICAgIm1vZGU9NzU1IiwKICAgICAgICAgICAgICAic2l6ZT02NTUzNmsiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L3B0cyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiZGV2cHRzIiwKICAgICAgICAgICAgInR5cGVfIjogImRldnB0cyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJuZXdpbnN0YW5jZSIsCiAgICAgICAgICAgICAgInB0bXhtb2RlPTA2NjYiLAogICAgICAgICAgICAgICJtb2RlPTA2MjAiLAogICAgICAgICAgICAgICJnaWQ9NSIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvc2htIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L3NobSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi9tcXVldWUiLAogICAgICAgICAgICAic291cmNlIjogIm1xdWV1ZSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJtcXVldWUiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvc3lzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJzeXNmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJzeXNmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2V0Yy9yZXNvbHYuY29uZiIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClyZXNvbHYuY29uZiQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJvIiwKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9kZXYiLAogICAgICAgICAgICAgICJub2V4ZWMiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0KICAgICAgICBdLAogICAgICAgICJBbm5vdGF0aW9ucyI6IHsKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmJ1bmRsZV9wYXRoIjogIi9ydW4vY29udGFpbmVyZC9pby5jb250YWluZXJkLnJ1bnRpbWUudjIudGFzay9rOHMuaW8vJChidW5kbGUtaWQpIiwKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIjogInBvZF9zYW5kYm94IiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSI6ICJzYW5kYm94IiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWlkIjogIl5bYS16MC05XXs2NH0kIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWxvZy1kaXJlY3RvcnkiOiAiXi92YXIvbG9nL3BvZHMvJChzYW5kYm94LW5hbWVzcGFjZSlfJChzYW5kYm94LW5hbWUpX1swLTlhLWZdezh9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezEyfSQiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZSI6ICJebWFueVxcLWxheWVycyQiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZXNwYWNlIjogIiIsCiAgICAgICAgICAibmVyZGN0bC9uZXR3b3JrLW5hbWVzcGFjZSI6ICJeL3Zhci9ydW4vbmV0bnMvY25pLVswLTlhLWZdezh9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezEyfSQiCiAgICAgICAgfSwKICAgICAgICAiTGludXgiOiB7CiAgICAgICAgICAiTmFtZXNwYWNlcyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICJUeXBlIjogImlwYyIsCiAgICAgICAgICAgICAgIlBhdGgiOiAiIgogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgIlR5cGUiOiAidXRzIiwKICAgICAgICAgICAgICAiUGF0aCI6ICIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiVHlwZSI6ICJtb3VudCIsCiAgICAgICAgICAgICAgIlBhdGgiOiAiIgogICAgICAgICAgICB9CiAgICAgICAgICBdLAogICAgICAgICAgIk1hc2tlZFBhdGhzIjogWwogICAgICAgICAgICAiL3Byb2MvYWNwaSIsCiAgICAgICAgICAgICIvcHJvYy9hc291bmQiLAogICAgICAgICAgICAiL3Byb2Mva2NvcmUiLAogICAgICAgICAgICAiL3Byb2Mva2V5cyIsCiAgICAgICAgICAgICIvcHJvYy9sYXRlbmN5X3N0YXRzIiwKICAgICAgICAgICAgIi9wcm9jL3RpbWVyX2xpc3QiLAogICAgICAgICAgICAiL3Byb2MvdGltZXJfc3RhdHMiLAogICAgICAgICAgICAiL3Byb2Mvc2NoZWRfZGVidWciLAogICAgICAgICAgICAiL3N5cy9maXJtd2FyZSIsCiAgICAgICAgICAgICIvcHJvYy9zY3NpIgogICAgICAgICAgXSwKICAgICAgICAgICJSZWFkb25seVBhdGhzIjogWwogICAgICAgICAgICAiL3Byb2MvYnVzIiwKICAgICAgICAgICAgIi9wcm9jL2ZzIiwKICAgICAgICAgICAgIi9wcm9jL2lycSIsCiAgICAgICAgICAgICIvcHJvYy9zeXMiLAogICAgICAgICAgICAiL3Byb2Mvc3lzcnEtdHJpZ2dlciIKICAgICAgICAgIF0sCiAgICAgICAgICAiRGV2aWNlcyI6IFtdLAogICAgICAgICAgIlN5c2N0bCI6IHsKICAgICAgICAgICAgIm5ldC5pcHY0LmlwX3VucHJpdmlsZWdlZF9wb3J0X3N0YXJ0IjogIjAiLAogICAgICAgICAgICAibmV0LmlwdjQucGluZ19ncm91cF9yYW5nZSI6ICIwIDIxNDc0ODM2NDciCiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9LAogICAgICAic3RvcmFnZXMiOiBbCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJibGsiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogInRhciIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIiQoaGFzaDApIgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGxheWVyMCkiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJvdmVybGF5ZnMiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogImZ1c2UzLmthdGEtb3ZlcmxheSIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIjVhNWFhZDgwMDU1ZmYyMDAxMmE1MGRjMjVmOGRmN2EyOTkyNDQ3NDMyNGQ2NWY3ZDUzMDZlZThlZTI3ZmY3MWQiLAogICAgICAgICAgICAiODE3MjUwZjFhM2UzMzZkYTc2ZjViZDNmYTc4NGUxYjI2ZDk1OWI5YzEzMTg3NjgxNWJhMjYwNDA0OGI3MGMxOCIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChjcGF0aCkvJChidW5kbGUtaWQpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9CiAgICAgIF0sCiAgICAgICJkZXZpY2VzIjogW10sCiAgICAgICJzYW5kYm94X3BpZG5zIjogZmFsc2UsCiAgICAgICJleGVjX2NvbW1hbmRzIjogW10sCiAgICAgICJlbnZfbWFwIjogewogICAgICAgICJQQVRIIjogIi91c3IvbG9jYWwvc2JpbjovdXNyL2xvY2FsL2JpbjovdXNyL3NiaW46L3Vzci9iaW46L3NiaW46L2JpbiIKICAgICAgfQogICAgfSwKICAgIHsKICAgICAgIk9DSSI6IHsKICAgICAgICAiVmVyc2lvbiI6ICIxLjEuMC1yYy4xIiwKICAgICAgICAiUHJvY2VzcyI6IHsKICAgICAgICAgICJUZXJtaW5hbCI6IGZhbHNlLAogICAgICAgICAgIlVzZXIiOiB7CiAgICAgICAgICAgICJVSUQiOiAwLAogICAgICAgICAgICAiR0lEIjogMCwKICAgICAgICAgICAgIkFkZGl0aW9uYWxHaWRzIjogW10sCiAgICAgICAgICAgICJVc2VybmFtZSI6ICIiCiAgICAgICAgICB9LAogICAgICAgICAgIkRlcHJlY2F0ZWRBcmdzIjogWwogICAgICAgICAgICAic2giLAogICAgICAgICAgICAiLWMiLAogICAgICAgICAgICAid2hpbGUgdHJ1ZTsgZG8gZWNobyBnbzsgc2xlZXAgMjU7IGRvbmUiCiAgICAgICAgICBdLAogICAgICAgICAgIkFyZ3MiOiBbCiAgICAgICAgICAgICJzaCIsCiAgICAgICAgICAgICItYyIsCiAgICAgICAgICAgICJ3aGlsZSB0cnVlOyBkbyBlY2hvIGdvOyBzbGVlcCAyNTsgZG9uZSIKICAgICAgICAgIF0sCiAgICAgICAgICAiRW52IjogWwogICAgICAgICAgICAiUEFUSD0vdXNyL2xvY2FsL3NiaW46L3Vzci9sb2NhbC9iaW46L3Vzci9zYmluOi91c3IvYmluOi9zYmluOi9iaW4iLAogICAgICAgICAgICAiY29udGFpbmVyPWRvY2tlciIsCiAgICAgICAgICAgICJIT1NUTkFNRT0kKGhvc3QtbmFtZSkiCiAgICAgICAgICBdLAogICAgICAgICAgIkN3ZCI6ICIvIiwKICAgICAgICAgICJDYXBhYmlsaXRpZXMiOiB7CiAgICAgICAgICAgICJBbWJpZW50IjogW10sCiAgICAgICAgICAgICJCb3VuZGluZyI6IFsKICAgICAgICAgICAgICAiJChkZWZhdWx0X2NhcHMpIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiRWZmZWN0aXZlIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJJbmhlcml0YWJsZSI6IFtdLAogICAgICAgICAgICAiUGVybWl0dGVkIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICAiTm9OZXdQcml2aWxlZ2VzIjogZmFsc2UKICAgICAgICB9LAogICAgICAgICJSb290IjogewogICAgICAgICAgIlBhdGgiOiAiJChjcGF0aCkvJChidW5kbGUtaWQpIiwKICAgICAgICAgICJSZWFkb25seSI6IGZhbHNlCiAgICAgICAgfSwKICAgICAgICAiTW91bnRzIjogWwogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL3Byb2MiLAogICAgICAgICAgICAic291cmNlIjogInByb2MiLAogICAgICAgICAgICAidHlwZV8iOiAicHJvYyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYiLAogICAgICAgICAgICAic291cmNlIjogInRtcGZzIiwKICAgICAgICAgICAgInR5cGVfIjogInRtcGZzIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgInN0cmljdGF0aW1lIiwKICAgICAgICAgICAgICAibW9kZT03NTUiLAogICAgICAgICAgICAgICJzaXplPTY1NTM2ayIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvcHRzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJkZXZwdHMiLAogICAgICAgICAgICAidHlwZV8iOiAiZGV2cHRzIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAgICAgIm5ld2luc3RhbmNlIiwKICAgICAgICAgICAgICAicHRteG1vZGU9MDY2NiIsCiAgICAgICAgICAgICAgIm1vZGU9MDYyMCIsCiAgICAgICAgICAgICAgImdpZD01IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi9zaG0iLAogICAgICAgICAgICAic291cmNlIjogIi9ydW4va2F0YS1jb250YWluZXJzL3NhbmRib3gvc2htIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L21xdWV1ZSIsCiAgICAgICAgICAgICJzb3VyY2UiOiAibXF1ZXVlIiwKICAgICAgICAgICAgInR5cGVfIjogIm1xdWV1ZSIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9zeXMiLAogICAgICAgICAgICAic291cmNlIjogInN5c2ZzIiwKICAgICAgICAgICAgInR5cGVfIjogInN5c2ZzIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAgICAgIm5vZGV2IiwKICAgICAgICAgICAgICAicm8iCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvc3lzL2ZzL2Nncm91cCIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiY2dyb3VwIiwKICAgICAgICAgICAgInR5cGVfIjogImNncm91cCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIsCiAgICAgICAgICAgICAgInJlbGF0aW1lIiwKICAgICAgICAgICAgICAicm8iCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZXRjL2hvc3RzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KWhvc3RzJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJydyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvdGVybWluYXRpb24tbG9nIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KXRlcm1pbmF0aW9uLWxvZyQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicnciCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZXRjL2hvc3RuYW1lIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KWhvc3RuYW1lJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJydyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9ldGMvcmVzb2x2LmNvbmYiLAogICAgICAgICAgICAic291cmNlIjogIiQoc2ZwcmVmaXgpcmVzb2x2LmNvbmYkIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJ3IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL3Zhci9ydW4vc2VjcmV0cy9rdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50IiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KXNlcnZpY2VhY2NvdW50JCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJybyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi92YXIvcnVuL3NlY3JldHMvYXp1cmUvdG9rZW5zIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KXRva2VucyQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicm8iCiAgICAgICAgICAgIF0KICAgICAgICAgIH0KICAgICAgICBdLAogICAgICAgICJBbm5vdGF0aW9ucyI6IHsKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmJ1bmRsZV9wYXRoIjogIi9ydW4vY29udGFpbmVyZC9pby5jb250YWluZXJkLnJ1bnRpbWUudjIudGFzay9rOHMuaW8vJChidW5kbGUtaWQpIiwKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIjogInBvZF9jb250YWluZXIiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLmNvbnRhaW5lci1uYW1lIjogImZvb3Rsb29zZSIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLXR5cGUiOiAiY29udGFpbmVyIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5pbWFnZS1uYW1lIjogInF1YXkuaW8vZm9vdGxvb3NlL3VidW50dTE4LjA0OmxhdGVzdCIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCI6ICJeW2EtejAtOV17NjR9JCIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1uYW1lIjogIl5tYW55XFwtbGF5ZXJzJCIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1uYW1lc3BhY2UiOiAiIgogICAgICAgIH0sCiAgICAgICAgIkxpbnV4IjogewogICAgICAgICAgIk5hbWVzcGFjZXMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiVHlwZSI6ICJpcGMiLAogICAgICAgICAgICAgICJQYXRoIjogIiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJUeXBlIjogInV0cyIsCiAgICAgICAgICAgICAgIlBhdGgiOiAiIgogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgIlR5cGUiOiAibW91bnQiLAogICAgICAgICAgICAgICJQYXRoIjogIiIKICAgICAgICAgICAgfQogICAgICAgICAgXSwKICAgICAgICAgICJNYXNrZWRQYXRocyI6IFsKICAgICAgICAgICAgIi9wcm9jL2FjcGkiLAogICAgICAgICAgICAiL3Byb2Mva2NvcmUiLAogICAgICAgICAgICAiL3Byb2Mva2V5cyIsCiAgICAgICAgICAgICIvcHJvYy9sYXRlbmN5X3N0YXRzIiwKICAgICAgICAgICAgIi9wcm9jL3RpbWVyX2xpc3QiLAogICAgICAgICAgICAiL3Byb2MvdGltZXJfc3RhdHMiLAogICAgICAgICAgICAiL3Byb2Mvc2NoZWRfZGVidWciLAogICAgICAgICAgICAiL3Byb2Mvc2NzaSIsCiAgICAgICAgICAgICIvc3lzL2Zpcm13YXJlIgogICAgICAgICAgXSwKICAgICAgICAgICJSZWFkb25seVBhdGhzIjogWwogICAgICAgICAgICAiL3Byb2MvYXNvdW5kIiwKICAgICAgICAgICAgIi9wcm9jL2J1cyIsCiAgICAgICAgICAgICIvcHJvYy9mcyIsCiAgICAgICAgICAgICIvcHJvYy9pcnEiLAogICAgICAgICAgICAiL3Byb2Mvc3lzIiwKICAgICAgICAgICAgIi9wcm9jL3N5c3JxLXRyaWdnZXIiCiAgICAgICAgICBdLAogICAgICAgICAgIkRldmljZXMiOiBbXSwKICAgICAgICAgICJTeXNjdGwiOiB7CiAgICAgICAgICAgICJuZXQuaXB2NC5pcF91bnByaXZpbGVnZWRfcG9ydF9zdGFydCI6ICIwIiwKICAgICAgICAgICAgIm5ldC5pcHY0LnBpbmdfZ3JvdXBfcmFuZ2UiOiAiMCAyMTQ3NDgzNjQ3IgogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSwKICAgICAgInN0b3JhZ2VzIjogWwogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2gwKSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjApIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2gxKSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjEpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2gyKSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjIpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2gzKSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjMpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2g0KSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjQpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2g1KSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjUpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2g2KSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjYpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2g3KSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjcpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2g4KSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjgpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2g5KSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjkpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2gxMCkiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXIxMCkiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJvdmVybGF5ZnMiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogImZ1c2UzLmthdGEtb3ZlcmxheSIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIjZmOGVkMjk2MGRmNjg4YjkwZDQxNWQ4M2QyNWRiMmE3ODk4Zjc5NTI4MmZiMmQzNWJhMWYxYjdkMDg5MmQxNTc6MGUzOTM4ZGE2NDdhMTg0NzhiZTBjMmY4ODZhYmEwMDU3MGUwYTVkMDcxZjlkNzk3ZGYzOGQ3OTA5ZWM2NDgzNDo2YjM4N2ZlNTk5NWE0YzVlNDIwN2M0ZGYxOTM2NWRlMzQ3ZTAzYjZjOWVlYzNlOWEwNGEzZGQxOGUxOWI1NTM3OmZiMTdiZjYyMjA0MDQ5YjJkZmMwMzQ0ZTQ3NWY4ZTFhMWY1MGE3NTFiNWZiYWNiZDc1YTI0YWZhYzM0NWQ2M2M6NTM1MzRmNmY5MTJhYTU0OTU0YjU5NGZiNTg1YTgyOTc1OGEyMzU4OGFlZjUzYTM2YjkyYWQzN2Q0M2M4NjZkZTpjMjY4MmEwOWU4M2Q2MTg2YmZiYmYwMTQyOTI3Mjc0YjQ5MDU3ODE1YjY5ZDg2ZWM0YThkMzQyODcyMGY4NTc1Ojg4ODA1NmQ4MDM2OTJjYjY2MmM5YTBiODViYTkwOTQyZTUyNDY3YjYxNGQ3NjM0MGY1NWJjOWQ4MTZlMTk5NjM6YzYxYzc5ZjUzMTlkZGJjMzRmOGNmNmU5M2MyNDZiYWRhZTExNDk4ZTVlNjM2MjgzOTc0MjNkZDE0Y2Q2NDAwYTo1NDRjZDQ2ZGRlYWVkZjdiZWZmYTkxYWUxMDI0MThjMDQ0NzNkOGNmNzlhZDUyMjczNDYzMDk0MzU0ZDliZDE1OjI4MjYyNmQ1YTQxN2M2MDgyMGY0MjllNmQ0ZDc3ZGM3ZmUzYTUxZDJmNGIxODUxZmIwMzc4MjFhZDFlYmFlZmU6YTZlMWVmZmVkNDVjYjNjNzA3NDQ1Y2RkZGQwNTMzNWIwNTBmMWYzZmNmNjE2OWUwNTdmMTJiMDdiNGRiNjY2ZSIsCiAgICAgICAgICAgICI5NDJiNDQ0Y2UxNzI4YWMwZWI1MTVlN2IwMDI2ZDA2ZjMxMDZiMWY2MDFmZmRhNjYyZTIxZDEyYWJkZjE4MzNiOmY5NzZkMDAzNTlkMTRlNjBhMTMzODBlYTg2M2E0ZWExNWJhMWE4YmM2NzNhZDFjNzFmN2QxNzA2MGY4ZjdkMTY6NjBkMDdlNWJlYjE2YzY4MzBhN2FkZDdjNjVkNGRjMzJmMDAxYzg2NTk2OWI5MmI0YjZjMjcwZGMzZjg3ZmE2ODozMjhhMWRmYTkwZDNlMDJkNjM3MzMzMDA1YTU3ZGFiMjM5ODRhMDAwN2JmZWRjNGJhMGQ4NGFjZjgxODMzMjU3OjVlNjVlMzNjZTE0NTUwOWE3MjM4YTIzZDZhYzZiMTcxMDViMjcyZjFmYjAzOTY0ODJjYjNmYTAyZWMyYjI1Yzg6ZDc1M2NmNmFmMmI3ZWVmZjNlNDFiMzA3Y2I1MGQ0YTdjN2Y2MDAyZmI3N2I2ZjE2NWUwMTBkN2JkNWY5NjI5MTphMjVlZDdkMWFhN2E2ODJmYWI3ZjIxMTZjODZhNDNkYzBjMDljZGU2MjZhNGU0N2IzNzQyODMxMDZjOWFlMDZiOmMwZDc2NjZmMTEzZTM5YTRjN2JmZDk4MDg2ZmUxODlkN2UzZTk1ZDQ3ZTZlNGQ2MmQ2NWVmY2FmN2RjYTA5OWU6N2Q0ZDkzMmNiMzZiNTRmZWU3OTRiODM5N2E5NDBmODFmZDIzNWRhMjhiYzE1MzM5NzU4NDVmZDgxMWYxZTgzMTpmZjFjODFhMDAyMTRhZTUyMDgzM2RiYjNiZmQ1Y2VhYTFlMTRmMjljNjJmZTY5OTY2OGRmYTQwZmJmNmMyODE2OjdkMDQzODI2ODVkZTNmMjdjN2Q5ZGI2NzhhMDIzZGI2YTNiNDM3N2U0ZjdlZmQ5ZTVjYmRlODU2ZjQ2YjE1NGEiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQoY3BhdGgpLyQoYnVuZGxlLWlkKSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfQogICAgICBdLAogICAgICAiZGV2aWNlcyI6IFtdLAogICAgICAic2FuZGJveF9waWRucyI6IGZhbHNlLAogICAgICAiZXhlY19jb21tYW5kcyI6IFtdLAogICAgICAiZW52X21hcCI6IHsKICAgICAgICAiSE9TVE5BTUUiOiAiJChob3N0LW5hbWUpIiwKICAgICAgICAiUEFUSCI6ICIvdXNyL2xvY2FsL3NiaW46L3Vzci9sb2NhbC9iaW46L3Vzci9zYmluOi91c3IvYmluOi9zYmluOi9iaW4iLAogICAgICAgICJjb250YWluZXIiOiAiZG9ja2VyIgogICAgICB9CiAgICB9LAogICAgewogICAgICAiT0NJIjogewogICAgICAgICJWZXJzaW9uIjogIjEuMS4wLXJjLjEiLAogICAgICAgICJQcm9jZXNzIjogewogICAgICAgICAgIlRlcm1pbmFsIjogZmFsc2UsCiAgICAgICAgICAiVXNlciI6IHsKICAgICAgICAgICAgIlVJRCI6IDAsCiAgICAgICAgICAgICJHSUQiOiAwLAogICAgICAgICAgICAiQWRkaXRpb25hbEdpZHMiOiBbXSwKICAgICAgICAgICAgIlVzZXJuYW1lIjogIiIKICAgICAgICAgIH0sCiAgICAgICAgICAiRGVwcmVjYXRlZEFyZ3MiOiBbCiAgICAgICAgICAgICJzaCIsCiAgICAgICAgICAgICItYyIsCiAgICAgICAgICAgICJ3aGlsZSB0cnVlOyBkbyBlY2hvIGdvOyBzbGVlcCAyNTsgZG9uZSIKICAgICAgICAgIF0sCiAgICAgICAgICAiQXJncyI6IFsKICAgICAgICAgICAgInNoIiwKICAgICAgICAgICAgIi1jIiwKICAgICAgICAgICAgIndoaWxlIHRydWU7IGRvIGVjaG8gZ287IHNsZWVwIDI1OyBkb25lIgogICAgICAgICAgXSwKICAgICAgICAgICJFbnYiOiBbCiAgICAgICAgICAgICJQQVRIPS91c3IvbG9jYWwvc2JpbjovdXNyL2xvY2FsL2JpbjovdXNyL3NiaW46L3Vzci9iaW46L3NiaW46L2JpbiIsCiAgICAgICAgICAgICJjb250YWluZXI9ZG9ja2VyIiwKICAgICAgICAgICAgIkhPU1ROQU1FPSQoaG9zdC1uYW1lKSIKICAgICAgICAgIF0sCiAgICAgICAgICAiQ3dkIjogIi8iLAogICAgICAgICAgIkNhcGFiaWxpdGllcyI6IHsKICAgICAgICAgICAgIkFtYmllbnQiOiBbXSwKICAgICAgICAgICAgIkJvdW5kaW5nIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJFZmZlY3RpdmUiOiBbCiAgICAgICAgICAgICAgIiQoZGVmYXVsdF9jYXBzKSIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgIkluaGVyaXRhYmxlIjogW10sCiAgICAgICAgICAgICJQZXJtaXR0ZWQiOiBbCiAgICAgICAgICAgICAgIiQoZGVmYXVsdF9jYXBzKSIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgICJOb05ld1ByaXZpbGVnZXMiOiBmYWxzZQogICAgICAgIH0sCiAgICAgICAgIlJvb3QiOiB7CiAgICAgICAgICAiUGF0aCI6ICIkKGNwYXRoKS8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgIlJlYWRvbmx5IjogZmFsc2UKICAgICAgICB9LAogICAgICAgICJNb3VudHMiOiBbCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvcHJvYyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAicHJvYyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJwcm9jIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAgICAgIm5vZGV2IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2RldiIsCiAgICAgICAgICAgICJzb3VyY2UiOiAidG1wZnMiLAogICAgICAgICAgICAidHlwZV8iOiAidG1wZnMiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAic3RyaWN0YXRpbWUiLAogICAgICAgICAgICAgICJtb2RlPTc1NSIsCiAgICAgICAgICAgICAgInNpemU9NjU1MzZrIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi9wdHMiLAogICAgICAgICAgICAic291cmNlIjogImRldnB0cyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJkZXZwdHMiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibmV3aW5zdGFuY2UiLAogICAgICAgICAgICAgICJwdG14bW9kZT0wNjY2IiwKICAgICAgICAgICAgICAibW9kZT0wNjIwIiwKICAgICAgICAgICAgICAiZ2lkPTUiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L3NobSIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiL3J1bi9rYXRhLWNvbnRhaW5lcnMvc2FuZGJveC9zaG0iLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvbXF1ZXVlIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJtcXVldWUiLAogICAgICAgICAgICAidHlwZV8iOiAibXF1ZXVlIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAgICAgIm5vZGV2IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL3N5cyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAic3lzZnMiLAogICAgICAgICAgICAidHlwZV8iOiAic3lzZnMiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiLAogICAgICAgICAgICAgICJybyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9zeXMvZnMvY2dyb3VwIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJjZ3JvdXAiLAogICAgICAgICAgICAidHlwZV8iOiAiY2dyb3VwIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAgICAgIm5vZGV2IiwKICAgICAgICAgICAgICAicmVsYXRpbWUiLAogICAgICAgICAgICAgICJybyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9ldGMvaG9zdHMiLAogICAgICAgICAgICAic291cmNlIjogIiQoc2ZwcmVmaXgpaG9zdHMkIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJ3IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi90ZXJtaW5hdGlvbi1sb2ciLAogICAgICAgICAgICAic291cmNlIjogIiQoc2ZwcmVmaXgpdGVybWluYXRpb24tbG9nJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJydyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9ldGMvaG9zdG5hbWUiLAogICAgICAgICAgICAic291cmNlIjogIiQoc2ZwcmVmaXgpaG9zdG5hbWUkIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJ3IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2V0Yy9yZXNvbHYuY29uZiIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClyZXNvbHYuY29uZiQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicnciCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvdmFyL3J1bi9zZWNyZXRzL2t1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQiLAogICAgICAgICAgICAic291cmNlIjogIiQoc2ZwcmVmaXgpc2VydmljZWFjY291bnQkIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL3Zhci9ydW4vc2VjcmV0cy9henVyZS90b2tlbnMiLAogICAgICAgICAgICAic291cmNlIjogIiQoc2ZwcmVmaXgpdG9rZW5zJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJybyIKICAgICAgICAgICAgXQogICAgICAgICAgfQogICAgICAgIF0sCiAgICAgICAgIkFubm90YXRpb25zIjogewogICAgICAgICAgImlvLmthdGFjb250YWluZXJzLnBrZy5vY2kuYnVuZGxlX3BhdGgiOiAiL3J1bi9jb250YWluZXJkL2lvLmNvbnRhaW5lcmQucnVudGltZS52Mi50YXNrL2s4cy5pby8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgImlvLmthdGFjb250YWluZXJzLnBrZy5vY2kuY29udGFpbmVyX3R5cGUiOiAicG9kX2NvbnRhaW5lciIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLW5hbWUiOiAiYm9vdGxvb3NlIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSI6ICJjb250YWluZXIiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLmltYWdlLW5hbWUiOiAicXVheS5pby9rMHNwcm9qZWN0L2Jvb3Rsb29zZS11YnVudHUyMi4wNDpsYXRlc3QiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtaWQiOiAiXlthLXowLTldezY0fSQiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZSI6ICJebWFueVxcLWxheWVycyQiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZXNwYWNlIjogIiIKICAgICAgICB9LAogICAgICAgICJMaW51eCI6IHsKICAgICAgICAgICJOYW1lc3BhY2VzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgIlR5cGUiOiAiaXBjIiwKICAgICAgICAgICAgICAiUGF0aCI6ICIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiVHlwZSI6ICJ1dHMiLAogICAgICAgICAgICAgICJQYXRoIjogIiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJUeXBlIjogIm1vdW50IiwKICAgICAgICAgICAgICAiUGF0aCI6ICIiCiAgICAgICAgICAgIH0KICAgICAgICAgIF0sCiAgICAgICAgICAiTWFza2VkUGF0aHMiOiBbCiAgICAgICAgICAgICIvcHJvYy9hY3BpIiwKICAgICAgICAgICAgIi9wcm9jL2tjb3JlIiwKICAgICAgICAgICAgIi9wcm9jL2tleXMiLAogICAgICAgICAgICAiL3Byb2MvbGF0ZW5jeV9zdGF0cyIsCiAgICAgICAgICAgICIvcHJvYy90aW1lcl9saXN0IiwKICAgICAgICAgICAgIi9wcm9jL3RpbWVyX3N0YXRzIiwKICAgICAgICAgICAgIi9wcm9jL3NjaGVkX2RlYnVnIiwKICAgICAgICAgICAgIi9wcm9jL3Njc2kiLAogICAgICAgICAgICAiL3N5cy9maXJtd2FyZSIKICAgICAgICAgIF0sCiAgICAgICAgICAiUmVhZG9ubHlQYXRocyI6IFsKICAgICAgICAgICAgIi9wcm9jL2Fzb3VuZCIsCiAgICAgICAgICAgICIvcHJvYy9idXMiLAogICAgICAgICAgICAiL3Byb2MvZnMiLAogICAgICAgICAgICAiL3Byb2MvaXJxIiwKICAgICAgICAgICAgIi9wcm9jL3N5cyIsCiAgICAgICAgICAgICIvcHJvYy9zeXNycS10cmlnZ2VyIgogICAgICAgICAgXSwKICAgICAgICAgICJEZXZpY2VzIjogW10sCiAgICAgICAgICAiU3lzY3RsIjogewogICAgICAgICAgICAibmV0LmlwdjQuaXBfdW5wcml2aWxlZ2VkX3BvcnRfc3RhcnQiOiAiMCIsCiAgICAgICAgICAgICJuZXQuaXB2NC5waW5nX2dyb3VwX3JhbmdlIjogIjAgMjE0NzQ4MzY0NyIKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0sCiAgICAgICJzdG9yYWdlcyI6IFsKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoMCkiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXIwKSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoMSkiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXIxKSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoMikiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXIyKSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoMykiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXIzKSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoNCkiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXI0KSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoNSkiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXI1KSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoNikiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXI2KSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoNykiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXI3KSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoOCkiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXI4KSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogIm92ZXJsYXlmcyIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAiZnVzZTMua2F0YS1vdmVybGF5IiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiYWE4NDQzZTFlNGJlMDg5NGY5OTZjYWMwM2Y4ZTlhZjU5Y2JlNjU0NmYxYmEzNGFlNGNlYzdhZDE0NTc2NGE3Yzo5N2Q3NjExZjcxNTRmMTM1MmY2Y2JmZThhOGQwNGM4N2IwYTI3NzdhM2IxOWNjZDg0M2E2MDdjNjYyMDc4OTUwOjZkM2QwNTAzNzhkMjVhYWZjNzA5Y2I0MjRhOWNjM2ViNzk4N2MzMmQ4ZGNjNGE5ZGU2ZTEzMmU0MGFmNmU4ZDY6NGZlYmFmODI4ZWYzNmIzODI3MjNiNjBiNzhkYzVlNjdkZjk3ZTk4NWZkNjYwMjAxOTg1NTlhNGY2ODY3M2VmNTphMjgwN2MwMTVlYjA4YzExMmMyYjAwMDYxMmY0ZWFiOTg0Yzk5YmJkMGI1YTRjZTM5NWI0MDEyMmM3MmMwMTI3Ojc1MDcxYzNhMTEzY2VjMjQxMzZlODQ3YzFlM2YwYzJkYThkNDRhNWRkNzdhMzc2ZDQyMWY3MjViOTFiMzljM2U6NWI2MzAyODNkYTQ5ZDBkYWUyZWVmMDdkZjNhN2NjN2FjMzcxZGM5MGQ0OGMxMDdiZTE0MDc0YTM0MTBlOTlmODpiMzRjNmRkMDBmOTU3MTQzZDNmMzRhZjBiZWViMDNiMTk0NzhhZDgyNWVhOTBkN2QxODdiNzRhZTgxOTQxMTVlOjUyZTg1ZTk1MzE0M2JiZjJlYmYzMmIyM2JiZWVlNTc5OTg0YWNmNDFiOWNlMjkyNGE2NzljYTVkOWQ4ZWIxYjgiLAogICAgICAgICAgICAiOTVhNjJiNDEwNDkyNmQ2MDUxMDZkNDUyOTdkNTRlZmVmYmMwYWViYzdiMWU5NThkNmZiMzRjZDkwNmE4NDgwZTphYjA4MTExNWQ4ODk2NmVjN2UwZDk1YjQxZjJlZmU2OGIwNzJhMGE0MzRjNjQ3MDFlY2UwODgwMjZiYjU2MDY3OjVkZWZhNmJlMzViZDE4M2E1ZTE4MTVhZTYyMWVjYzcyZmFhZTliMDU2MzEwYTkzZGJkNGRmMjc3NmI3ZDMxZDM6YjBhYWQ0ZWMzZTNhN2Q2ZWQ2ZjMyZDI0ODQ1ZDkyYmM1OTBmMjllMjJmMjNlNzViYzUwOTUwNDc5MWM3NTExYzo5NWNmOWI0MGUzNjQ5YTJmYzI2ZTgzYjI5OGFkNjUxZTQ5NTg3ZThkMzQzMjc4NzgxMmI1MGM5MTY1MzZiNDFlOmI1MTc4ZGNlOTE5MTRiOGZmNTViMTA5ZTJiMzlkNmVjYTZjYTMzMmIxYzkyMWUwODZlMWE1Y2EwNmU3MDE1NWI6YTA5ZWI0Mjc0ODFlNDQ1OTFiZDlhODdjZmU0YjZjYTczM2NiZjMzN2MzODczODk0NDQ0OTQyNGFjOGI3Njk5OTpiM2E0OWU3NzVmNDJlOWZlMDY2MjAwZDY4YWI4MzIwNThjZjQ2M2JjMjE1MDk3YWQ5ZmQ1YTgwNTMzMjgwYTFiOmJhYTdmMTA3Yjc4MWQxMGM1NDU2Yzg2YTQ4MmFhOTQ2ZWM5MDcxODY2NThiZjI0ZjJmMjMxNDU0ZTQ4MzAwNDYiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQoY3BhdGgpLyQoYnVuZGxlLWlkKSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfQogICAgICBdLAogICAgICAiZGV2aWNlcyI6IFtdLAogICAgICAic2FuZGJveF9waWRucyI6IGZhbHNlLAogICAgICAiZXhlY19jb21tYW5kcyI6IFtdLAogICAgICAiZW52X21hcCI6IHsKICAgICAgICAiSE9TVE5BTUUiOiAiJChob3N0LW5hbWUpIiwKICAgICAgICAiUEFUSCI6ICIvdXNyL2xvY2FsL3NiaW46L3Vzci9sb2NhbC9iaW46L3Vzci9zYmluOi91c3IvYmluOi9zYmluOi9iaW4iLAogICAgICAgICJjb250YWluZXIiOiAiZG9ja2VyIgogICAgICB9CiAgICB9LAogICAgewogICAgICAiT0NJIjogewogICAgICAgICJWZXJzaW9uIjogIjEuMS4wLXJjLjEiLAogICAgICAgICJQcm9jZXNzIjogewogICAgICAgICAgIlRlcm1pbmFsIjogZmFsc2UsCiAgICAgICAgICAiVXNlciI6IHsKICAgICAgICAgICAgIlVJRCI6IDAsCiAgICAgICAgICAgICJHSUQiOiAwLAogICAgICAgICAgICAiQWRkaXRpb25hbEdpZHMiOiBbXSwKICAgICAgICAgICAgIlVzZXJuYW1lIjogIiIKICAgICAgICAgIH0sCiAgICAgICAgICAiRGVwcmVjYXRlZEFyZ3MiOiBbCiAgICAgICAgICAgICJzaCIsCiAgICAgICAgICAgICItYyIsCiAgICAgICAgICAgICJ3aGlsZSB0cnVlOyBkbyBlY2hvIG5naW54OyBzbGVlcCAxMDsgZG9uZSIKICAgICAgICAgIF0sCiAgICAgICAgICAiQXJncyI6IFsKICAgICAgICAgICAgInNoIiwKICAgICAgICAgICAgIi1jIiwKICAgICAgICAgICAgIndoaWxlIHRydWU7IGRvIGVjaG8gbmdpbng7IHNsZWVwIDEwOyBkb25lIgogICAgICAgICAgXSwKICAgICAgICAgICJFbnYiOiBbCiAgICAgICAgICAgICJQQVRIPS91c3IvbG9jYWwvc2JpbjovdXNyL2xvY2FsL2JpbjovdXNyL3NiaW46L3Vzci9iaW46L3NiaW46L2JpbiIsCiAgICAgICAgICAgICJIT1NUTkFNRT0kKGhvc3QtbmFtZSkiCiAgICAgICAgICBdLAogICAgICAgICAgIkN3ZCI6ICIvIiwKICAgICAgICAgICJDYXBhYmlsaXRpZXMiOiB7CiAgICAgICAgICAgICJBbWJpZW50IjogW10sCiAgICAgICAgICAgICJCb3VuZGluZyI6IFsKICAgICAgICAgICAgICAiJChkZWZhdWx0X2NhcHMpIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiRWZmZWN0aXZlIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJJbmhlcml0YWJsZSI6IFtdLAogICAgICAgICAgICAiUGVybWl0dGVkIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICAiTm9OZXdQcml2aWxlZ2VzIjogZmFsc2UKICAgICAgICB9LAogICAgICAgICJSb290IjogewogICAgICAgICAgIlBhdGgiOiAiJChjcGF0aCkvJChidW5kbGUtaWQpIiwKICAgICAgICAgICJSZWFkb25seSI6IGZhbHNlCiAgICAgICAgfSwKICAgICAgICAiTW91bnRzIjogWwogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL3Byb2MiLAogICAgICAgICAgICAic291cmNlIjogInByb2MiLAogICAgICAgICAgICAidHlwZV8iOiAicHJvYyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYiLAogICAgICAgICAgICAic291cmNlIjogInRtcGZzIiwKICAgICAgICAgICAgInR5cGVfIjogInRtcGZzIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgInN0cmljdGF0aW1lIiwKICAgICAgICAgICAgICAibW9kZT03NTUiLAogICAgICAgICAgICAgICJzaXplPTY1NTM2ayIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvcHRzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJkZXZwdHMiLAogICAgICAgICAgICAidHlwZV8iOiAiZGV2cHRzIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAgICAgIm5ld2luc3RhbmNlIiwKICAgICAgICAgICAgICAicHRteG1vZGU9MDY2NiIsCiAgICAgICAgICAgICAgIm1vZGU9MDYyMCIsCiAgICAgICAgICAgICAgImdpZD01IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi9zaG0iLAogICAgICAgICAgICAic291cmNlIjogIi9ydW4va2F0YS1jb250YWluZXJzL3NhbmRib3gvc2htIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L21xdWV1ZSIsCiAgICAgICAgICAgICJzb3VyY2UiOiAibXF1ZXVlIiwKICAgICAgICAgICAgInR5cGVfIjogIm1xdWV1ZSIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9zeXMiLAogICAgICAgICAgICAic291cmNlIjogInN5c2ZzIiwKICAgICAgICAgICAgInR5cGVfIjogInN5c2ZzIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAgICAgIm5vZGV2IiwKICAgICAgICAgICAgICAicm8iCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvc3lzL2ZzL2Nncm91cCIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiY2dyb3VwIiwKICAgICAgICAgICAgInR5cGVfIjogImNncm91cCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIsCiAgICAgICAgICAgICAgInJlbGF0aW1lIiwKICAgICAgICAgICAgICAicm8iCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZXRjL2hvc3RzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KWhvc3RzJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJydyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvdGVybWluYXRpb24tbG9nIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KXRlcm1pbmF0aW9uLWxvZyQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicnciCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZXRjL2hvc3RuYW1lIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KWhvc3RuYW1lJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJydyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9ldGMvcmVzb2x2LmNvbmYiLAogICAgICAgICAgICAic291cmNlIjogIiQoc2ZwcmVmaXgpcmVzb2x2LmNvbmYkIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJ3IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL3Zhci9ydW4vc2VjcmV0cy9rdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50IiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KXNlcnZpY2VhY2NvdW50JCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJybyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi92YXIvcnVuL3NlY3JldHMvYXp1cmUvdG9rZW5zIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KXRva2VucyQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicm8iCiAgICAgICAgICAgIF0KICAgICAgICAgIH0KICAgICAgICBdLAogICAgICAgICJBbm5vdGF0aW9ucyI6IHsKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmJ1bmRsZV9wYXRoIjogIi9ydW4vY29udGFpbmVyZC9pby5jb250YWluZXJkLnJ1bnRpbWUudjIudGFzay9rOHMuaW8vJChidW5kbGUtaWQpIiwKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIjogInBvZF9jb250YWluZXIiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLmNvbnRhaW5lci1uYW1lIjogIm5naW54IiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSI6ICJjb250YWluZXIiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLmltYWdlLW5hbWUiOiAibWFyaW5lcmNvbmZwb2RzdGVzdC5henVyZWNyLmlvL2F6dXJlbGludXgvYmFzZS9uZ2lueDoxLjI1IiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWlkIjogIl5bYS16MC05XXs2NH0kIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LW5hbWUiOiAiXm1hbnlcXC1sYXllcnMkIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LW5hbWVzcGFjZSI6ICIiCiAgICAgICAgfSwKICAgICAgICAiTGludXgiOiB7CiAgICAgICAgICAiTmFtZXNwYWNlcyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICJUeXBlIjogImlwYyIsCiAgICAgICAgICAgICAgIlBhdGgiOiAiIgogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgIlR5cGUiOiAidXRzIiwKICAgICAgICAgICAgICAiUGF0aCI6ICIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiVHlwZSI6ICJtb3VudCIsCiAgICAgICAgICAgICAgIlBhdGgiOiAiIgogICAgICAgICAgICB9CiAgICAgICAgICBdLAogICAgICAgICAgIk1hc2tlZFBhdGhzIjogWwogICAgICAgICAgICAiL3Byb2MvYWNwaSIsCiAgICAgICAgICAgICIvcHJvYy9rY29yZSIsCiAgICAgICAgICAgICIvcHJvYy9rZXlzIiwKICAgICAgICAgICAgIi9wcm9jL2xhdGVuY3lfc3RhdHMiLAogICAgICAgICAgICAiL3Byb2MvdGltZXJfbGlzdCIsCiAgICAgICAgICAgICIvcHJvYy90aW1lcl9zdGF0cyIsCiAgICAgICAgICAgICIvcHJvYy9zY2hlZF9kZWJ1ZyIsCiAgICAgICAgICAgICIvcHJvYy9zY3NpIiwKICAgICAgICAgICAgIi9zeXMvZmlybXdhcmUiCiAgICAgICAgICBdLAogICAgICAgICAgIlJlYWRvbmx5UGF0aHMiOiBbCiAgICAgICAgICAgICIvcHJvYy9hc291bmQiLAogICAgICAgICAgICAiL3Byb2MvYnVzIiwKICAgICAgICAgICAgIi9wcm9jL2ZzIiwKICAgICAgICAgICAgIi9wcm9jL2lycSIsCiAgICAgICAgICAgICIvcHJvYy9zeXMiLAogICAgICAgICAgICAiL3Byb2Mvc3lzcnEtdHJpZ2dlciIKICAgICAgICAgIF0sCiAgICAgICAgICAiRGV2aWNlcyI6IFtdLAogICAgICAgICAgIlN5c2N0bCI6IHsKICAgICAgICAgICAgIm5ldC5pcHY0LmlwX3VucHJpdmlsZWdlZF9wb3J0X3N0YXJ0IjogIjAiLAogICAgICAgICAgICAibmV0LmlwdjQucGluZ19ncm91cF9yYW5nZSI6ICIwIDIxNDc0ODM2NDciCiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9LAogICAgICAic3RvcmFnZXMiOiBbCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJibGsiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogInRhciIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIiQoaGFzaDApIgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGxheWVyMCkiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJibGsiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogInRhciIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIiQoaGFzaDEpIgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGxheWVyMSkiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJibGsiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogInRhciIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIiQoaGFzaDIpIgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGxheWVyMikiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJibGsiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogInRhciIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIiQoaGFzaDMpIgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGxheWVyMykiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJibGsiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogInRhciIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIiQoaGFzaDQpIgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGxheWVyNCkiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJvdmVybGF5ZnMiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogImZ1c2UzLmthdGEtb3ZlcmxheSIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIjhiZmJiYTc2OTY2MzY1MjQwNGE2NGEyM2E3ZWVhYjc5NDM4ZGFlZDcxYWNjZjMyOWE0MGE0ZjY4ZWZhZjBmZjQ6OGNjN2FmYmNkZDA0ZjE3YWZmOGY2ZDQ5MzVlNGY1NGExZjVhZGQ0N2RjYTUxNmU4ZDM1NDUzZjFmNDIxODE2Nzo5MDMwZTYwYWE4ZDhhYjljMjdmMDUxZTJjNzg1YTU0OWQ4YWVjMTg4ODE2OTllYWIzMjBhMDQwOWY3ZmRiZTM5OjM2YWY5YzA4MTQ2ZTZkMjUxZDUxM2U1OWU1YTFjNjJkNjJjZmI5ZWJlODU2ZDc1Mzk0YmVmZGRlY2U3NDg0YzE6MDE2NWEwYzA3ODY1Nzc1ZGVhODNhNDUxN2MxMjVmZjMwYzFlMmMxYTA5OGU3Y2JjZTdiY2FmZTJiNzE5OWNiYyIsCiAgICAgICAgICAgICIyNDllZjU1ZmNkNDExYzVhODA1NGFiYjYwZTcxNTExNWQ1OTllYmJlNjgyZDZiNzRiZTNiZDE5MjcyNDg4NWMxOjUwMmI1MzcyMDFjNzExNWVmMGQxNzE1MzBjN2NmNWMwZTUxMTc1NGU5Yzk1ZjA1OTQxZWMyN2QxNWM5ZTAxOTg6NDhhYTExOGZkZmRhOWEzMDM4N2U5MGUwNjYxZjJiNWI2YzhlODczNTRkMWZhOWEzN2JmNTg1MTNhYzNlNDUxMjo5ZjYyNTQ2NGM3YjM0YTU1MzZmNDMxZjVkMjk0NjM0M2QyNzI1ODBlMzY0NDZkZGIxMmIwNDAxNjJlNTQzY2UxOmQ0NDkxZWExODg3MTA1ZWYwNjAxZjRlNWZhMzk4M2ZmZTU3ZDdhNTdlZThmNmIwMzcwOTFmNDIxOGMxYTYzNTgiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQoY3BhdGgpLyQoYnVuZGxlLWlkKSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfQogICAgICBdLAogICAgICAiZGV2aWNlcyI6IFtdLAogICAgICAic2FuZGJveF9waWRucyI6IGZhbHNlLAogICAgICAiZXhlY19jb21tYW5kcyI6IFtdLAogICAgICAiZW52X21hcCI6IHsKICAgICAgICAiSE9TVE5BTUUiOiAiJChob3N0LW5hbWUpIiwKICAgICAgICAiUEFUSCI6ICIvdXNyL2xvY2FsL3NiaW46L3Vzci9sb2NhbC9iaW46L3Vzci9zYmluOi91c3IvYmluOi9zYmluOi9iaW4iCiAgICAgIH0KICAgIH0sCiAgICB7CiAgICAgICJPQ0kiOiB7CiAgICAgICAgIlZlcnNpb24iOiAiMS4xLjAtcmMuMSIsCiAgICAgICAgIlByb2Nlc3MiOiB7CiAgICAgICAgICAiVGVybWluYWwiOiBmYWxzZSwKICAgICAgICAgICJVc2VyIjogewogICAgICAgICAgICAiVUlEIjogMCwKICAgICAgICAgICAgIkdJRCI6IDAsCiAgICAgICAgICAgICJBZGRpdGlvbmFsR2lkcyI6IFtdLAogICAgICAgICAgICAiVXNlcm5hbWUiOiAiIgogICAgICAgICAgfSwKICAgICAgICAgICJEZXByZWNhdGVkQXJncyI6IFsKICAgICAgICAgICAgInNoIiwKICAgICAgICAgICAgIi1jIiwKICAgICAgICAgICAgIndoaWxlIHRydWU7IGRvIGVjaG8gcHl0aG9uOyBzbGVlcCAxNTsgZG9uZSIKICAgICAgICAgIF0sCiAgICAgICAgICAiQXJncyI6IFsKICAgICAgICAgICAgInNoIiwKICAgICAgICAgICAgIi1jIiwKICAgICAgICAgICAgIndoaWxlIHRydWU7IGRvIGVjaG8gcHl0aG9uOyBzbGVlcCAxNTsgZG9uZSIKICAgICAgICAgIF0sCiAgICAgICAgICAiRW52IjogWwogICAgICAgICAgICAiUEFUSD0vdXNyL2xvY2FsL3NiaW46L3Vzci9sb2NhbC9iaW46L3Vzci9zYmluOi91c3IvYmluOi9zYmluOi9iaW4iLAogICAgICAgICAgICAiREVCSUFOX0ZST05URU5EPW5vbmludGVyYWN0aXZlIiwKICAgICAgICAgICAgIkxBTkc9ZW5fVVMuVVRGLTgiLAogICAgICAgICAgICAiTEFOR1VBR0U9ZW5fVVM6VVRGLTgiLAogICAgICAgICAgICAiTENfQUxMPWVuX1VTLlVURi04IiwKICAgICAgICAgICAgIlBZVEhPTl9NQUpPUj0zLjMiLAogICAgICAgICAgICAiUFlUSE9OX1ZFUlNJT049My4zLjYtNCt4ZW5pYWwxIiwKICAgICAgICAgICAgIlBZVEhPTklPRU5DT0RJTkc9VVRGLTgiLAogICAgICAgICAgICAiSE9TVE5BTUU9JChob3N0LW5hbWUpIgogICAgICAgICAgXSwKICAgICAgICAgICJDd2QiOiAiLyIsCiAgICAgICAgICAiQ2FwYWJpbGl0aWVzIjogewogICAgICAgICAgICAiQW1iaWVudCI6IFtdLAogICAgICAgICAgICAiQm91bmRpbmciOiBbCiAgICAgICAgICAgICAgIiQoZGVmYXVsdF9jYXBzKSIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgIkVmZmVjdGl2ZSI6IFsKICAgICAgICAgICAgICAiJChkZWZhdWx0X2NhcHMpIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiSW5oZXJpdGFibGUiOiBbXSwKICAgICAgICAgICAgIlBlcm1pdHRlZCI6IFsKICAgICAgICAgICAgICAiJChkZWZhdWx0X2NhcHMpIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgIk5vTmV3UHJpdmlsZWdlcyI6IGZhbHNlCiAgICAgICAgfSwKICAgICAgICAiUm9vdCI6IHsKICAgICAgICAgICJQYXRoIjogIiQoY3BhdGgpLyQoYnVuZGxlLWlkKSIsCiAgICAgICAgICAiUmVhZG9ubHkiOiBmYWxzZQogICAgICAgIH0sCiAgICAgICAgIk1vdW50cyI6IFsKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9wcm9jIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJwcm9jIiwKICAgICAgICAgICAgInR5cGVfIjogInByb2MiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2IiwKICAgICAgICAgICAgInNvdXJjZSI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJzdHJpY3RhdGltZSIsCiAgICAgICAgICAgICAgIm1vZGU9NzU1IiwKICAgICAgICAgICAgICAic2l6ZT02NTUzNmsiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L3B0cyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiZGV2cHRzIiwKICAgICAgICAgICAgInR5cGVfIjogImRldnB0cyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJuZXdpbnN0YW5jZSIsCiAgICAgICAgICAgICAgInB0bXhtb2RlPTA2NjYiLAogICAgICAgICAgICAgICJtb2RlPTA2MjAiLAogICAgICAgICAgICAgICJnaWQ9NSIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvc2htIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L3NobSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi9tcXVldWUiLAogICAgICAgICAgICAic291cmNlIjogIm1xdWV1ZSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJtcXVldWUiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvc3lzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJzeXNmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJzeXNmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL3N5cy9mcy9jZ3JvdXAiLAogICAgICAgICAgICAic291cmNlIjogImNncm91cCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJjZ3JvdXAiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiLAogICAgICAgICAgICAgICJyZWxhdGltZSIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2V0Yy9ob3N0cyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClob3N0cyQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicnciCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L3Rlcm1pbmF0aW9uLWxvZyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeCl0ZXJtaW5hdGlvbi1sb2ckIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJ3IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2V0Yy9ob3N0bmFtZSIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClob3N0bmFtZSQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicnciCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZXRjL3Jlc29sdi5jb25mIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KXJlc29sdi5jb25mJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJydyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi92YXIvcnVuL3NlY3JldHMva3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudCIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClzZXJ2aWNlYWNjb3VudCQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicm8iCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvdmFyL3J1bi9zZWNyZXRzL2F6dXJlL3Rva2VucyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeCl0b2tlbnMkIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9CiAgICAgICAgXSwKICAgICAgICAiQW5ub3RhdGlvbnMiOiB7CiAgICAgICAgICAiaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5idW5kbGVfcGF0aCI6ICIvcnVuL2NvbnRhaW5lcmQvaW8uY29udGFpbmVyZC5ydW50aW1lLnYyLnRhc2svazhzLmlvLyQoYnVuZGxlLWlkKSIsCiAgICAgICAgICAiaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5jb250YWluZXJfdHlwZSI6ICJwb2RfY29udGFpbmVyIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItbmFtZSI6ICJweXRob24iLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLmNvbnRhaW5lci10eXBlIjogImNvbnRhaW5lciIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuaW1hZ2UtbmFtZSI6ICJxdWF5LmlvL2Jhc2VsaWJyYXJ5L3B5dGhvbjpsYXRlc3QiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtaWQiOiAiXlthLXowLTldezY0fSQiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZSI6ICJebWFueVxcLWxheWVycyQiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZXNwYWNlIjogIiIKICAgICAgICB9LAogICAgICAgICJMaW51eCI6IHsKICAgICAgICAgICJOYW1lc3BhY2VzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgIlR5cGUiOiAiaXBjIiwKICAgICAgICAgICAgICAiUGF0aCI6ICIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiVHlwZSI6ICJ1dHMiLAogICAgICAgICAgICAgICJQYXRoIjogIiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJUeXBlIjogIm1vdW50IiwKICAgICAgICAgICAgICAiUGF0aCI6ICIiCiAgICAgICAgICAgIH0KICAgICAgICAgIF0sCiAgICAgICAgICAiTWFza2VkUGF0aHMiOiBbCiAgICAgICAgICAgICIvcHJvYy9hY3BpIiwKICAgICAgICAgICAgIi9wcm9jL2tjb3JlIiwKICAgICAgICAgICAgIi9wcm9jL2tleXMiLAogICAgICAgICAgICAiL3Byb2MvbGF0ZW5jeV9zdGF0cyIsCiAgICAgICAgICAgICIvcHJvYy90aW1lcl9saXN0IiwKICAgICAgICAgICAgIi9wcm9jL3RpbWVyX3N0YXRzIiwKICAgICAgICAgICAgIi9wcm9jL3NjaGVkX2RlYnVnIiwKICAgICAgICAgICAgIi9wcm9jL3Njc2kiLAogICAgICAgICAgICAiL3N5cy9maXJtd2FyZSIKICAgICAgICAgIF0sCiAgICAgICAgICAiUmVhZG9ubHlQYXRocyI6IFsKICAgICAgICAgICAgIi9wcm9jL2Fzb3VuZCIsCiAgICAgICAgICAgICIvcHJvYy9idXMiLAogICAgICAgICAgICAiL3Byb2MvZnMiLAogICAgICAgICAgICAiL3Byb2MvaXJxIiwKICAgICAgICAgICAgIi9wcm9jL3N5cyIsCiAgICAgICAgICAgICIvcHJvYy9zeXNycS10cmlnZ2VyIgogICAgICAgICAgXSwKICAgICAgICAgICJEZXZpY2VzIjogW10sCiAgICAgICAgICAiU3lzY3RsIjogewogICAgICAgICAgICAibmV0LmlwdjQuaXBfdW5wcml2aWxlZ2VkX3BvcnRfc3RhcnQiOiAiMCIsCiAgICAgICAgICAgICJuZXQuaXB2NC5waW5nX2dyb3VwX3JhbmdlIjogIjAgMjE0NzQ4MzY0NyIKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0sCiAgICAgICJzdG9yYWdlcyI6IFsKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoMCkiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXIwKSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoMSkiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXIxKSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoMikiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXIyKSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoMykiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXIzKSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoNCkiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXI0KSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoNSkiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXI1KSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoNikiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXI2KSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoNykiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXI3KSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoOCkiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXI4KSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoOSkiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXI5KSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoMTApIgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGxheWVyMTApIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAib3ZlcmxheWZzIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJmdXNlMy5rYXRhLW92ZXJsYXkiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIwZGQ5OGUzZTZkZWQ4ZDBiZTQwZDM3NmY3YTdjMDFjYjc3OTJjNmM4ZWY4NzhlZTk0NzdhNmY4ZmI5ZGRmYTU2OmZhYzBiNTA2Yjc3MTc2Y2IyODVlYWFkYzMzYTJlYTYyNzQzOTMyMjdiMTE3YjliOWE2MzA4YTBiYTdlOGRiYTY6Y2RjOGI4ODkxMDdkNzFjNzZkNmExOWU4YTE0ZTllZjc0NzRhZDJiOGU5MmZlY2U0ZTFiNDVkNzE1OTU5OTViNTozOTYxZDQwZTExNDczZDhjNWY5M2FjYjRmNzU4NTNiZTBlOTljZGUzMzFhMGY1ZTk3NmZmMmI0MmY5ZmRhY2VmOmE5MzBlNmEzYmFkMWUzYzQyNzNlZmFjZmViZTEwOWVkZTZmOTUxODNkMDBhZDA3MjAzOTU0ZjljMWE4MmVlMTI6MGZkN2E0YmQxYzJlZGM3YTU0M2FiM2ZlNWUyMGFiYWVlYTZiOGE0ZTQxNjE1YTIxYzRkNDFiNzc1NTM4Nzk5YTowZmU3M2M3ZGZlODRiYzkzMWJiN2E5NjMxMzkyNjRmYWU2ZGQ2ZmU1MTViZTc3ZTgzOWQ3MTNkYzdhMDQ3ODE1OmFlNmU3ODk0NmZiNjRkNDIwOWE2N2NmMDgxMDc5YWFhNzAwZWRiZjkxZmE1MDVmMGY0MzUzNWQ0ZGZkMjQ3NjQ6ZDAyYzNkNzcxYzdmYzZhNmIyYTkyMTU5YjliZDMyZTZkYTBjOWMxMzk4M2EwMTAxODQwMGFjYzkwZmMzMTY5ZTozODM3OWI4NTY1ZTBlM2NiMWRkMjNmMzc3YzgzMjI2YmRlN2Y3ZWE2NzFjNzNhY2Q4ZjE4ZjJiMDA3ODhiNWVmOjMyOTQ2NDMyN2Y5N2E3ZGE1NzJlNjA5YWEwMGVkOTg4YjVlYmZmYzE1MzdmOGI4YTBlMzMwZDM2ZjA1NWRmMDEiLAogICAgICAgICAgICAiYjI5YmE3MzAyZDdmYzhhYjE1MzllYTI4MDYyZTU3OTM5NTVjZGM1OWY3MzUyOTQyOTI4ZDRjN2FiMzNlNTJhZTpiNGE3OTYzNzI3YWE5NjAyNGRjNWM1YjNmMjhiNjY4MDNmNDYyNmY2NTA2YjU4ZWU5ZmQ0OWZmMTA4YWFiODIyOmU3Mzg3ZjgzNzI2YjI5ZjUyZWY0NjNmNTc0NDIyMmJhMDVlMmQ0Nzk5NzQ0Nzg1ODc2NGU1M2E4NjRhNjc2NGQ6N2E4MGU3MWQ2ZDkwYTUwZGRmOGU5Zjk5MTQxNjg2ZTQ2MDlmMGI0NzU1MGVmNzRmZjM1MzYyNGQyNjQyZGI5ODpjOGRiNmQzZmQzYWFhOGY5ZDBjZTVjYThjNzFmNWUzODdlMTdmMWE2YTY0M2Y1ZmVkOWE0Y2FlMTIyM2QyMWNkOmYzMjY0YzNiN2I5YThmNTE2MmU3NWVmYjE2YzU1ZWE0YjgzNTdmN2Y2NGFkOWY5YWZhYWNkYmYyYTQ3ZjM1YTU6N2Y2NWYwYjE3ODc4YzM1NTFhOGM5M2YyNzZhYjQ4NzcxNDFiNGVmNDFkZGMzZDJlMmIxYWM2MmI0MjQ0ODhkMDpmNWRkYTUwODRiMjBmYWEwMzY5ZGI1NGE5ZTg5NjkzY2I2YjdlOTg5NzliYjY2ZmM1YjNhODUxY2ZiYmRmMGUzOjhlZGJhMTI4M2U2MTRkNmJkYzhkMzkxOThhYjI5YjhjNjI0Yjk1ZDhlY2QzZTgxMWFmYmZmYjQwYmM4NzM3Y2Y6NmFlYTViM2RkZmFiODIxMDMxNTAwYzVlMjg5NDkxMjhmMDJkZDcwNTZlMDk3MzQ3ZDhkZmM0Mjg2OTEwMDkwNDo2Mjk2NzBkOWJiMWUwMGU2MmQ5MmJkZGIxYWUyMDYwNDhjYzJkZTIzNDE5YzBmODdlM2Y5NzYyMmI5YjBkYjIwIgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGNwYXRoKS8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0KICAgICAgXSwKICAgICAgImRldmljZXMiOiBbXSwKICAgICAgInNhbmRib3hfcGlkbnMiOiBmYWxzZSwKICAgICAgImV4ZWNfY29tbWFuZHMiOiBbXSwKICAgICAgImVudl9tYXAiOiB7CiAgICAgICAgIkRFQklBTl9GUk9OVEVORCI6ICJub25pbnRlcmFjdGl2ZSIsCiAgICAgICAgIkhPU1ROQU1FIjogIiQoaG9zdC1uYW1lKSIsCiAgICAgICAgIkxBTkciOiAiZW5fVVMuVVRGLTgiLAogICAgICAgICJMQU5HVUFHRSI6ICJlbl9VUzpVVEYtOCIsCiAgICAgICAgIkxDX0FMTCI6ICJlbl9VUy5VVEYtOCIsCiAgICAgICAgIlBBVEgiOiAiL3Vzci9sb2NhbC9zYmluOi91c3IvbG9jYWwvYmluOi91c3Ivc2JpbjovdXNyL2Jpbjovc2JpbjovYmluIiwKICAgICAgICAiUFlUSE9OSU9FTkNPRElORyI6ICJVVEYtOCIsCiAgICAgICAgIlBZVEhPTl9NQUpPUiI6ICIzLjMiLAogICAgICAgICJQWVRIT05fVkVSU0lPTiI6ICIzLjMuNi00K3hlbmlhbDEiCiAgICAgIH0KICAgIH0KICBdLAogICJjb21tb24iOiB7CiAgICAiY3BhdGgiOiAiL3J1bi9rYXRhLWNvbnRhaW5lcnMvc2hhcmVkL2NvbnRhaW5lcnMiLAogICAgIm1vdW50X3NvdXJjZV9jcGF0aCI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zaGFyZWQvY29udGFpbmVycyIsCiAgICAic2ZwcmVmaXgiOiAiXiQoY3BhdGgpLyQoYnVuZGxlLWlkKS1bYS16MC05XXsxNn0tIiwKICAgICJzcGF0aCI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L3N0b3JhZ2UiLAogICAgImlwdjRfYSI6ICIoKFswLTldfFsxLTldWzAtOV18MVswLTldezJ9fDJbMC00XVswLTldfDI1WzAtNV0pXFwuKXszfShbMC05XXxbMS05XVswLTldfDFbMC05XXsyfXwyWzAtNF1bMC05XXwyNVswLTVdKSIsCiAgICAiaXBfcCI6ICJbMC05XXsxLDV9IiwKICAgICJzdmNfbmFtZSI6ICJbQS1aX1xcLlxcLV0rIiwKICAgICJkbnNfbGFiZWwiOiAiW2EtekEtWjAtOV9cXC5cXC1dKyIsCiAgICAic19zb3VyY2UxIjogIl4uLjJbMC05XXszfV9bMC0xXVswLTldX1swLTNdWzAtOV1fWzAtMl1bMC05XV9bMC01XVswLTldX1swLTVdWzAtOV1cXC5bMC05XXsxLDEwfSQiLAogICAgInNfc291cmNlMiI6ICJeLi5kYXRhLyIsCiAgICAiZG5zX3N1YmRvbWFpbiI6ICJeW2EtejAtOV0oWy1hLXowLTldKlthLXowLTldKT8kIiwKICAgICJwb2RfdWlkIjogIl5bMC05YS1mQS1GXXs4fS1bMC05YS1mQS1GXXs0fS1bMC05YS1mQS1GXXs0fS1bMC05YS1mQS1GXXs0fS1bMC05YS1mQS1GXXsxMn0kIiwKICAgICJkZWZhdWx0X2NhcHMiOiBbCiAgICAgICJDQVBfQ0hPV04iLAogICAgICAiQ0FQX0RBQ19PVkVSUklERSIsCiAgICAgICJDQVBfRlNFVElEIiwKICAgICAgIkNBUF9GT1dORVIiLAogICAgICAiQ0FQX01LTk9EIiwKICAgICAgIkNBUF9ORVRfUkFXIiwKICAgICAgIkNBUF9TRVRHSUQiLAogICAgICAiQ0FQX1NFVFVJRCIsCiAgICAgICJDQVBfU0VURkNBUCIsCiAgICAgICJDQVBfU0VUUENBUCIsCiAgICAgICJDQVBfTkVUX0JJTkRfU0VSVklDRSIsCiAgICAgICJDQVBfU1lTX0NIUk9PVCIsCiAgICAgICJDQVBfS0lMTCIsCiAgICAgICJDQVBfQVVESVRfV1JJVEUiCiAgICBdLAogICAgInByaXZpbGVnZWRfY2FwcyI6IFsKICAgICAgIkNBUF9DSE9XTiIsCiAgICAgICJDQVBfREFDX09WRVJSSURFIiwKICAgICAgIkNBUF9EQUNfUkVBRF9TRUFSQ0giLAogICAgICAiQ0FQX0ZPV05FUiIsCiAgICAgICJDQVBfRlNFVElEIiwKICAgICAgIkNBUF9LSUxMIiwKICAgICAgIkNBUF9TRVRHSUQiLAogICAgICAiQ0FQX1NFVFVJRCIsCiAgICAgICJDQVBfU0VUUENBUCIsCiAgICAgICJDQVBfTElOVVhfSU1NVVRBQkxFIiwKICAgICAgIkNBUF9ORVRfQklORF9TRVJWSUNFIiwKICAgICAgIkNBUF9ORVRfQlJPQURDQVNUIiwKICAgICAgIkNBUF9ORVRfQURNSU4iLAogICAgICAiQ0FQX05FVF9SQVciLAogICAgICAiQ0FQX0lQQ19MT0NLIiwKICAgICAgIkNBUF9JUENfT1dORVIiLAogICAgICAiQ0FQX1NZU19NT0RVTEUiLAogICAgICAiQ0FQX1NZU19SQVdJTyIsCiAgICAgICJDQVBfU1lTX0NIUk9PVCIsCiAgICAgICJDQVBfU1lTX1BUUkFDRSIsCiAgICAgICJDQVBfU1lTX1BBQ0NUIiwKICAgICAgIkNBUF9TWVNfQURNSU4iLAogICAgICAiQ0FQX1NZU19CT09UIiwKICAgICAgIkNBUF9TWVNfTklDRSIsCiAgICAgICJDQVBfU1lTX1JFU09VUkNFIiwKICAgICAgIkNBUF9TWVNfVElNRSIsCiAgICAgICJDQVBfU1lTX1RUWV9DT05GSUciLAogICAgICAiQ0FQX01LTk9EIiwKICAgICAgIkNBUF9MRUFTRSIsCiAgICAgICJDQVBfQVVESVRfV1JJVEUiLAogICAgICAiQ0FQX0FVRElUX0NPTlRST0wiLAogICAgICAiQ0FQX1NFVEZDQVAiLAogICAgICAiQ0FQX01BQ19PVkVSUklERSIsCiAgICAgICJDQVBfTUFDX0FETUlOIiwKICAgICAgIkNBUF9TWVNMT0ciLAogICAgICAiQ0FQX1dBS0VfQUxBUk0iLAogICAgICAiQ0FQX0JMT0NLX1NVU1BFTkQiLAogICAgICAiQ0FQX0FVRElUX1JFQUQiLAogICAgICAiQ0FQX1BFUkZNT04iLAogICAgICAiQ0FQX0JQRiIsCiAgICAgICJDQVBfQ0hFQ0tQT0lOVF9SRVNUT1JFIgogICAgXSwKICAgICJ2aXJ0aW9fYmxrX3N0b3JhZ2VfY2xhc3NlcyI6IFsKICAgICAgImNjLWxvY2FsLWNzaSIsCiAgICAgICJjYy1tYW5hZ2VkLWNzaSIsCiAgICAgICJjYy1tYW5hZ2VkLXByZW1pdW0tY3NpIgogICAgXSwKICAgICJzbWJfc3RvcmFnZV9jbGFzc2VzIjogWwogICAgICB7CiAgICAgICAgIm5hbWUiOiAiYXp1cmVmaWxlLWNzaS1rYXRhLWNjIiwKICAgICAgICAibW91bnRfb3B0aW9ucyI6IFsKICAgICAgICAgICJkaXJfbW9kZT0wNzc3IiwKICAgICAgICAgICJmaWxlX21vZGU9MDc3NyIsCiAgICAgICAgICAibWZzeW1saW5rcyIsCiAgICAgICAgICAiY2FjaGU9c3RyaWN0IiwKICAgICAgICAgICJub3NoYXJlc29jayIsCiAgICAgICAgICAiYWN0aW1lbz0zMCIsCiAgICAgICAgICAibm9icmwiCiAgICAgICAgXQogICAgICB9CiAgICBdCiAgfSwKICAic2FuZGJveCI6IHsKICAgICJzdG9yYWdlcyI6IFsKICAgICAgewogICAgICAgICJkcml2ZXIiOiAiZXBoZW1lcmFsIiwKICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAic291cmNlIjogInNobSIsCiAgICAgICAgImZzdHlwZSI6ICJ0bXBmcyIsCiAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgIm5vZGV2IiwKICAgICAgICAgICJtb2RlPTE3NzciLAogICAgICAgICAgInNpemU9NjcxMDg4NjQiCiAgICAgICAgXSwKICAgICAgICAibW91bnRfcG9pbnQiOiAiL3J1bi9rYXRhLWNvbnRhaW5lcnMvc2FuZGJveC9zaG0iLAogICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgfQogICAgXQogIH0sCiAgInJlcXVlc3RfZGVmYXVsdHMiOiB7CiAgICAiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdCI6IHsKICAgICAgImFsbG93X2Vudl9yZWdleCI6IFsKICAgICAgICAiXkhPU1ROQU1FPSQoZG5zX2xhYmVsKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfUE9SVF8kKGlwX3ApX1RDUD10Y3A6Ly8kKGlwdjRfYSk6JChpcF9wKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfUE9SVF8kKGlwX3ApX1RDUF9QUk9UTz10Y3AkIiwKICAgICAgICAiXiQoc3ZjX25hbWUpX1BPUlRfJChpcF9wKV9UQ1BfUE9SVD0kKGlwX3ApJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9QT1JUXyQoaXBfcClfVENQX0FERFI9JChpcHY0X2EpJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9TRVJWSUNFX0hPU1Q9JChpcHY0X2EpJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9TRVJWSUNFX1BPUlQ9JChpcF9wKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfU0VSVklDRV9QT1JUXyQoZG5zX2xhYmVsKT0kKGlwX3ApJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9QT1JUPXRjcDovLyQoaXB2NF9hKTokKGlwX3ApJCIsCiAgICAgICAgIl5BWlVSRV9DTElFTlRfSUQ9W0EtRmEtZjAtOS1dKiQiLAogICAgICAgICJeQVpVUkVfVEVOQU5UX0lEPVtBLUZhLWYwLTktXSokIiwKICAgICAgICAiXkFaVVJFX0ZFREVSQVRFRF9UT0tFTl9GSUxFPS92YXIvcnVuL3NlY3JldHMvYXp1cmUvdG9rZW5zL2F6dXJlLWlkZW50aXR5LXRva2VuJCIsCiAgICAgICAgIl5BWlVSRV9BVVRIT1JJVFlfSE9TVD1odHRwczovL2xvZ2luXFwubWljcm9zb2Z0b25saW5lXFwuY29tLyQiLAogICAgICAgICJeVEVSTT14dGVybSQiCiAgICAgIF0sCiAgICAgICJhbGxvd19lbnZfcmVnZXhfbWFwIjogewogICAgICAgICJDUFVfTElNSVQiOiAiXlswLTldKyQiLAogICAgICAgICJKT0JfQ09NUExFVElPTl9JTkRFWCI6ICJeWzAtOV0qJCIsCiAgICAgICAgIk1FTU9SWV9MSU1JVCI6ICJeWzAtOV0rJCIKICAgICAgfQogICAgfSwKICAgICJDb3B5RmlsZVJlcXVlc3QiOiBbCiAgICAgICIkKHNmcHJlZml4KSIKICAgIF0sCiAgICAiRXhlY1Byb2Nlc3NSZXF1ZXN0IjogewogICAgICAiYWxsb3dlZF9jb21tYW5kcyI6IFtdLAogICAgICAicmVnZXgiOiBbXQogICAgfSwKICAgICJVcGRhdGVSb3V0ZXNSZXF1ZXN0IjogewogICAgICAiZm9yYmlkZGVuX2RldmljZV9uYW1lcyI6IFsKICAgICAgICAibG8iCiAgICAgIF0sCiAgICAgICJmb3JiaWRkZW5fc291cmNlX3JlZ2V4IjogWwogICAgICAgICJeKD86MHswLDR9Oil7MCw3fTB7MCwzfTEkIiwKICAgICAgICAiXjEyN1xcLig/OlswLTldezEsM31cXC4pezJ9WzAtOV17MSwzfSQiCiAgICAgIF0KICAgIH0sCiAgICAiVXBkYXRlSW50ZXJmYWNlUmVxdWVzdCI6IHsKICAgICAgImFsbG93X3Jhd19mbGFncyI6IDEyOCwKICAgICAgImZvcmJpZGRlbl9uYW1lcyI6IFsKICAgICAgICAibG8iCiAgICAgIF0sCiAgICAgICJmb3JiaWRkZW5faHdfYWRkcnMiOiBbCiAgICAgICAgIjAwOjAwOjAwOjAwOjAwOjAwIgogICAgICBdCiAgICB9LAogICAgIkNsb3NlU3RkaW5SZXF1ZXN0IjogZmFsc2UsCiAgICAiUmVhZFN0cmVhbVJlcXVlc3QiOiBmYWxzZSwKICAgICJVcGRhdGVFcGhlbWVyYWxNb3VudHNSZXF1ZXN0IjogZmFsc2UsCiAgICAiV3JpdGVTdHJlYW1SZXF1ZXN0IjogZmFsc2UKICB9Cn0= +spec: + terminationGracePeriodSeconds: 0 + restartPolicy: Never + runtimeClassName: kata-cc + containers: + - name: footloose + image: "quay.io/footloose/ubuntu18.04:latest" + command: + - sh + - "-c" + - while true; do echo go; sleep 25; done + - name: bootloose + image: "quay.io/k0sproject/bootloose-ubuntu22.04:latest" + command: + - sh + - "-c" + - while true; do echo go; sleep 25; done + - name: nginx + image: "marinerconfpodstest.azurecr.io/azurelinux/base/nginx:1.25" + command: + - sh + - "-c" + - while true; do echo nginx; sleep 10; done + - name: python + image: "quay.io/baselibrary/python:latest" + command: + - sh + - "-c" + - while true; do echo python; sleep 15; done diff --git a/src/agent/samples/policy/yaml/pod/pod-one-container.yaml b/src/agent/samples/policy/yaml/pod/pod-one-container.yaml new file mode 100644 index 000000000000..ea90237cf1b7 --- /dev/null +++ b/src/agent/samples/policy/yaml/pod/pod-one-container.yaml @@ -0,0 +1,67 @@ +--- +apiVersion: v1 +kind: Pod +metadata: + name: one-container + uid: one-container-uid + labels: + run: busybox + annotations: + io.katacontainers.config.agent.policy: IyBDb3B5cmlnaHQgKGMpIDIwMjMgTWljcm9zb2Z0IENvcnBvcmF0aW9uCiMKIyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMAojCnBhY2thZ2UgYWdlbnRfcG9saWN5CgppbXBvcnQgZnV0dXJlLmtleXdvcmRzLmluCmltcG9ydCBmdXR1cmUua2V5d29yZHMuZXZlcnkKCiMgRGVmYXVsdCB2YWx1ZXMsIHJldHVybmVkIGJ5IE9QQSB3aGVuIHJ1bGVzIGNhbm5vdCBiZSBldmFsdWF0ZWQgdG8gdHJ1ZS4KZGVmYXVsdCBBZGRBUlBOZWlnaGJvcnNSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgQWRkU3dhcFJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBDbG9zZVN0ZGluUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IENvcHlGaWxlUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IENyZWF0ZUNvbnRhaW5lclJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBDcmVhdGVTYW5kYm94UmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IERlc3Ryb3lTYW5kYm94UmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgRXhlY1Byb2Nlc3NSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgR2V0T09NRXZlbnRSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBHdWVzdERldGFpbHNSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBMaXN0SW50ZXJmYWNlc1JlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBMaXN0Um91dGVzUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IE1lbUhvdHBsdWdCeVByb2JlUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IE9ubGluZUNQVU1lbVJlcXVlc3QgOj0gdHJ1ZQpkZWZhdWx0IFBhdXNlQ29udGFpbmVyUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFJlYWRTdHJlYW1SZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgUmVtb3ZlQ29udGFpbmVyUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgUmVtb3ZlU3RhbGVWaXJ0aW9mc1NoYXJlTW91bnRzUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgUmVzZWVkUmFuZG9tRGV2UmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFJlc3VtZUNvbnRhaW5lclJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBTZXRHdWVzdERhdGVUaW1lUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFNldFBvbGljeVJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBTaWduYWxQcm9jZXNzUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgU3RhcnRDb250YWluZXJSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBTdGFydFRyYWNpbmdSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgU3RhdHNDb250YWluZXJSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBTdG9wVHJhY2luZ1JlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBUdHlXaW5SZXNpemVSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBVcGRhdGVDb250YWluZXJSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgVXBkYXRlRXBoZW1lcmFsTW91bnRzUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFVwZGF0ZUludGVyZmFjZVJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBVcGRhdGVSb3V0ZXNSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgV2FpdFByb2Nlc3NSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBXcml0ZVN0cmVhbVJlcXVlc3QgOj0gZmFsc2UKCiMgQWxsb3dSZXF1ZXN0c0ZhaWxpbmdQb2xpY3kgOj0gdHJ1ZSBjb25maWd1cmVzIHRoZSBBZ2VudCB0byAqYWxsb3cgYW55CiMgcmVxdWVzdHMgY2F1c2luZyBhIHBvbGljeSBmYWlsdXJlKi4gVGhpcyBpcyBhbiB1bnNlY3VyZSBjb25maWd1cmF0aW9uCiMgYnV0IGlzIHVzZWZ1bCBmb3IgYWxsb3dpbmcgdW5zZWN1cmUgcG9kcyB0byBzdGFydCwgdGhlbiBjb25uZWN0IHRvCiMgdGhlbSBhbmQgaW5zcGVjdCBPUEEgbG9ncyBmb3IgdGhlIHJvb3QgY2F1c2Ugb2YgYSBmYWlsdXJlLgpkZWZhdWx0IEFsbG93UmVxdWVzdHNGYWlsaW5nUG9saWN5IDo9IGZhbHNlCgojIENvbnN0YW50cwpTX05BTUVfS0VZID0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZSIKU19OQU1FU1BBQ0VfS0VZID0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZXNwYWNlIgpCVU5ETEVfSUQgPSAiW2EtejAtOV17NjR9IgoKQ3JlYXRlQ29udGFpbmVyUmVxdWVzdDo9IHJlc3AgewogICAgbm90IGlzX251bGwoaW5wdXQuZW52X21hcCkKICAgIAogICAgaV9lbnZfbWFwIDo9IGlucHV0LmVudl9tYXAKICAgIAogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBwX2Vudl9tYXAgOj0gcF9jb250YWluZXIuZW52X21hcCAgCiAgICBhbGxvd19lbnZfbWFwKHBfZW52X21hcCwgaV9lbnZfbWFwKQogICAgCiAgICBpX3Byb2Nlc3MgOj0gaW5wdXQuYmFzZS5PQ0kuUHJvY2VzcwogICAgCiAgICBwX3Byb2Nlc3MgOj0gcF9jb250YWluZXIuT0NJLlByb2Nlc3MKICAgIAogICAgYWxsb3dfYXJncyhpX3Byb2Nlc3MsIHBfcHJvY2VzcywgaV9lbnZfbWFwKQoKICAgIHJlc3AgPSBDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uKGlucHV0LmJhc2UpCiAgICBwcmludCgiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdDogdHJ1ZSIpCn0KCmFsbG93X2FyZ3MoaV9wcm9jZXNzLCBwX3Byb2Nlc3MsIGlfZW52X21hcCkgewogICAgaV9hcmdzIDo9IGlfcHJvY2Vzcy5BcmdzCiAgICBwX2FyZ3MgOj0gcF9wcm9jZXNzLkFyZ3MKICAgIHByaW50KCJhbGxvd19hcmdzOiBpX2FyZ3MgPSIsIGlfYXJncywgInBfYXJncyA9IiwgcF9hcmdzKQogICAgY291bnQoaV9hcmdzKSA9PSBjb3VudChwX2FyZ3MpCiAgICBldmVyeSBpLCBpX2FyZyBpbiBpX2FyZ3MgewogICAgICAgIHByaW50KCJhbGxvd19hcmdzOiBpX2FyZyA9IiwgaV9hcmcpCiAgICAgICAgcF9hcmdfcmVwbGFjZWQgOj0gcmVwbGFjZV9lbnZfdmFyaWFibGVzKHBfYXJnc1tpXSwgaV9lbnZfbWFwKQogICAgICAgIHByaW50KCJhbGxvd19hcmdzOiBwX2FyZ19yZXBsYWNlZCA9IiwgcF9hcmdfcmVwbGFjZWQpCiAgICAgICAgcF9hcmdfcmVwbGFjZWQyIDo9IHJlcGxhY2UocF9hcmdfcmVwbGFjZWQsICIkJCIsICIkIikKICAgICAgICBwcmludCgiYWxsb3dfYXJnczogcF9hcmdfcmVwbGFjZWQyID0iLCBwX2FyZ19yZXBsYWNlZDIpCiAgICAgICAgaV9hcmcgPT0gcF9hcmdfcmVwbGFjZWQyCiAgICB9CiAgICBwcmludCgiYWxsb3dfYXJnczogdHJ1ZSIpCn0KCmFsbG93X2FyZ3MoaV9wcm9jZXNzLCBwX3Byb2Nlc3MsIGlfZW52X21hcCkgewogICAgbm90IGlfcHJvY2Vzcy5BcmdzCiAgICBub3QgcF9wcm9jZXNzLkFyZ3MKICAgIHByaW50KCJhbGxvd19hcmdzMjogbm8gYXJncyIpCn0KCiMgdGhpcyBmdW5jdGlvbiByZXBsYWNlcyBhbGwgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyBpbiBhIHN0cmluZywgZ2l2ZW4gYSBtYXAgb2YgZW52aXJvbm1lbnQga2V5cyB0byBlbnZpcm9ubWVudCB2YWx1ZXMKIyBlZyBzdHIgPSAiZWNobyAkKENMVVNURVJfSUQpOyBlY2hvICQoTk9ERV9OQU1FKTsiCiMgZW52X21hcCA9IHsiQ0xVU1RFUl9JRCI6ICJhYmMiLCAiTk9ERV9OQU1FIiA6ICJ4eXoifQojIHJlc3VsdCA9ICJlY2hvIGFiYzsgZWNobyB4eXo7IgpyZXBsYWNlX2Vudl92YXJpYWJsZXMoc3RyLCBlbnZfbWFwKSA9IHJlc3VsdCB7CiAgICAjIG1ha2UgYW4gYXJyYXkgb2YgdGhlIGtleXMgZWcgWyJDTFVTVEVSX0lEIiwgIk5PREVfTkFNRSJdCiAgICBrZXlzIDo9IFt4IHwgc29tZSB4IGluIG9iamVjdC5rZXlzKGVudl9tYXApXQogICAgcmVzdWx0IDo9IHJlcGxhY2Vfc3RyX3JlYyhzdHIsIGVudl9tYXAsIGtleXMsIGNvdW50KGtleXMpIC0gMSkKfQoKIyBiYXNlIGNhc2UKcmVwbGFjZV9zdHJfcmVjKHN0ciwgZW52X21hcCwgYXJyX2tleXMsIGkpID0gcmVzdWx0IHsKICAgIGkgPCAwCiAgICByZXN1bHQgOj0gc3RyCn0KCiMgcmVjdXJzaXZlIHN0ZXAKcmVwbGFjZV9zdHJfcmVjKHN0ciwgZW52X21hcCwgYXJyX2tleXMsIGkpID0gcmVzdWx0IHsKICAgIGkgPj0gMAogICAga2V5IDo9IGFycl9rZXlzW2ldCiAgICBlbnZfa2V5MSA6PSBjb25jYXQoIiIsIFsiJCgiLCBrZXksICIpIl0pCiAgICAjIHJlcGxhY2UgJChWQVIpIHdpdGggdmFsdWUKICAgIG5ld19zdHIxIDo9IHJlcGxhY2Uoc3RyLCBlbnZfa2V5MSwgZW52X21hcFtrZXldKQogICAgIyByZXBsYWNlIG5leHQgZW52aXJvbm1lbnQgdmFyaWFibGUKICAgIHJlc3VsdCA9IHJlcGxhY2Vfc3RyX3JlYyhuZXdfc3RyMSwgZW52X21hcCwgYXJyX2tleXMsIGkgLSAxKQp9CgphbGxvd19lbnZfbWFwKHBfZW52X21hcCwgaV9lbnZfbWFwKSB7CiAgICBwcmludCgiYWxsb3dfZW52X21hcDogcF9lbnZfbWFwID0iLCBwX2Vudl9tYXApCiAgICBldmVyeSBlbnZfa2V5LCBlbnZfdmFsIGluIGlfZW52X21hcCB7CiAgICAgICAgcHJpbnQoImFsbG93X2VudjogZW52X2tleSA9IiwgZW52X2tleSwgImVudl92YWwgPSIsIGVudl92YWwpCiAgICAgICAgYWxsb3dfZW52X21hcF9lbnRyeShlbnZfa2V5LCBlbnZfdmFsLCBwX2Vudl9tYXApCiAgICB9CiAgICBwcmludCgiYWxsb3dfZW52X21hcDogdHJ1ZSIpCn0KCiMgQWxsb3cgZXhhY3QgbWF0Y2gKYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBpX3ZhbCA9PSBwX3ZhbAogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnk6IHRydWUiKQp9CgojIEFsbG93IHJlc291cmNlRmllbGRSZWYgdmFsdWVzIChlLmcuLCAibGltaXRzLmNwdSIpLgphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgICMgYSB2YXJpYWJsZSB3ZSBzaG91bGQgYmUgdmFsaWRhdGluZyB1c2luZyBhIHJlZ2V4IGZyb20gc2V0dGluZ3MKICAgIHBfdmFsID09ICIkKHZhbGlkYXRlLWZyb20tc2V0dGluZ3MpIgogICAgcmVnZXhfdmFsIDo9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuQ3JlYXRlQ29udGFpbmVyUmVxdWVzdC5hbGxvd19lbnZfcmVnZXhfbWFwW2tleV0KICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4X3ZhbCwgaV92YWwpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSAyOiB0cnVlIikKfQoKIyBBbGxvdyBub2RlLW5hbWUKYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChub2RlLW5hbWUpIgogICAgcmVnZXgubWF0Y2gocG9saWN5X2RhdGEuY29tbW9uLmRuc19zdWJkb21haW4gLCBpX3ZhbCkKICAgIHByaW50KCJhbGxvd19lbnZfbWFwX2VudHJ5IDM6IHRydWUiKQp9CgojIEFsbG93IGhvc3QtbmFtZQphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgIHBfdmFsID09ICIkKGhvc3QtbmFtZSkiCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24uZG5zX2xhYmVsICwgaV92YWwpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSA0OiB0cnVlIikKfQoKIyBBbGxvdyBwb2QtdWlkCmFsbG93X2Vudl9tYXBfZW50cnkoa2V5LCBpX3ZhbCwgcF9lbnZfbWFwKSB7CiAgICBwX3ZhbCA6PSBwX2Vudl9tYXBba2V5XQogICAgcF92YWwgPT0gIiQocG9kLXVpZCkiCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24ucG9kX3VpZCAsIGlfdmFsKQogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgNTogdHJ1ZSIpCn0KCiMgQWxsb3cgZmllbGRSZWYgImZpZWxkUGF0aDogc3RhdHVzLnBvZElQIiB2YWx1ZXMuCmFsbG93X2Vudl9tYXBfZW50cnkoa2V5LCBpX3ZhbCwgcF9lbnZfbWFwKSB7CiAgICBpc19pcChpX3ZhbCkKCiAgICBwX3ZhbCA6PSBwX2Vudl9tYXBba2V5XQogICAgcF92YXIgOj0gY29uY2F0KCI9IiwgW2tleSwgcF92YWxdKQogICAgYWxsb3dfcG9kX2lwX3ZhcihrZXksIHBfdmFyKQogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgNjogdHJ1ZSIpCn0KCiMgQWxsb3cgZmllbGRSZWYgImZpZWxkUGF0aDogc3RhdHVzLmhvc3RJUCIgdmFsdWVzLgphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgaXNfaXAoaV92YWwpCgogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgIHBfdmFyIDo9IGNvbmNhdCgiPSIsIFtrZXksIHBfdmFsXSkKICAgIGFsbG93X2hvc3RfaXBfdmFyKGtleSwgcF92YXIpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSA3OiB0cnVlIikKfQoKIyBNYXRjaCBpbnB1dCB3aXRoIG9uZSBvZiB0aGUgcG9saWN5IHZhcmlhYmxlcywgYWZ0ZXIgc3Vic3RpdHV0aW5nICQoc2FuZGJveC1uYW1lKS4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChzYW5kYm94LW5hbWUpIgogICAgc19uYW1lIDo9IGlucHV0LmJhc2UuT0NJLkFubm90YXRpb25zW1NfTkFNRV9LRVldCiAgICBwX3ZhcjIgOj0gcmVwbGFjZShwX3ZhbCwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHBfdmFyMiA9PSBpX3ZhbAogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgODogdHJ1ZSIpCn0KCiMgTWF0Y2ggaW5wdXQgd2l0aCBvbmUgb2YgdGhlIHBvbGljeSB2YXJpYWJsZXMsIGFmdGVyIHN1YnN0aXR1dGluZyAkKHNhbmRib3gtbmFtZXNwYWNlKS4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChzYW5kYm94LW5hbWVzcGFjZSkiCiAgICBzX25hbWVzcGFjZSA6PSBpbnB1dC5iYXNlLk9DSS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwX3ZhcjIgOj0gcmVwbGFjZShwX3ZhbCwgIiQoc2FuZGJveC1uYW1lc3BhY2UpIiwgc19uYW1lc3BhY2UpCiAgICBwX3ZhcjIgPT0gaV92YWwKICAgIHByaW50KCJhbGxvd19lbnZfbWFwX2VudHJ5IDk6IHRydWUiKQp9CgojIEFsbG93IGlucHV0IGVudiB2YXJpYWJsZXMgdGhhdCBtYXRjaCB3aXRoIGEgcmVxdWVzdF9kZWZhdWx0cyByZWdleC4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHNvbWUgcF9yZWdleDEgaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5DcmVhdGVDb250YWluZXJSZXF1ZXN0LmFsbG93X2Vudl9yZWdleAogICAgcF9yZWdleDIgOj0gcmVwbGFjZShwX3JlZ2V4MSwgIiQoaXB2NF9hKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcHY0X2EpCiAgICBwX3JlZ2V4MyA6PSByZXBsYWNlKHBfcmVnZXgyLCAiJChpcF9wKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcF9wKQogICAgcF9yZWdleDQgOj0gcmVwbGFjZShwX3JlZ2V4MywgIiQoc3ZjX25hbWUpIiwgcG9saWN5X2RhdGEuY29tbW9uLnN2Y19uYW1lKQogICAgcF9yZWdleDUgOj0gcmVwbGFjZShwX3JlZ2V4NCwgIiQoZG5zX2xhYmVsKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5kbnNfbGFiZWwpCgogICAgcmVzdWx0IDo9IGNvbmNhdCgiPSIsIFtrZXksIGlfdmFsXSkKICAgIHJlZ2V4Lm1hdGNoKHBfcmVnZXg1LCByZXN1bHQpCgogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgMTA6IHRydWUiKQp9CgpDcmVhdGVDb250YWluZXJSZXF1ZXN0Oj0gcmVzcCB7CiAgICBub3QgaW5wdXQuZW52X21hcAogICAgaV9wcm9jZXNzID0gaW5wdXQuT0NJLlByb2Nlc3MKICAgIHNfbmFtZSA9IGlucHV0Lk9DSS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBwX3Byb2Nlc3MgPSBwX2NvbnRhaW5lci5PQ0kuUHJvY2VzcwogICAgYWxsb3dfZGVwcmVjYXRlZF9hcmdzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUpCiAgICByZXNwID0gQ3JlYXRlQ29udGFpbmVyUmVxdWVzdENvbW1vbihpbnB1dCkKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0MjogdHJ1ZSIpCn0KCkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb24ocmVxKTo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgICMgQ2hlY2sgaWYgdGhlIGlucHV0IHJlcXVlc3Qgc2hvdWxkIGJlIHJlamVjdGVkIGV2ZW4gYmVmb3JlIGNoZWNraW5nIHRoZQogICAgIyBwb2xpY3lfZGF0YS5jb250YWluZXJzIGluZm9ybWF0aW9uLgogICAgYWxsb3dfY3JlYXRlX2NvbnRhaW5lcl9pbnB1dChyZXEpCgogICAgaV9vY2kgOj0gcmVxLk9DSQogICAgaV9zdG9yYWdlcyA6PSByZXEuc3RvcmFnZXMKICAgIGlfZGV2aWNlcyA6PSByZXEuZGV2aWNlcwoKICAgICMgYXJyYXkgb2YgcG9zc2libGUgc3RhdGUgb3BlcmF0aW9ucwogICAgb3BzX2J1aWxkZXIgOj0gW10KCiAgICAjIGNoZWNrIHNhbmRib3ggbmFtZQogICAgc2FuZGJveF9uYW1lID0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FX0tFWV0KICAgIGFkZF9zYW5kYm94X25hbWVfdG9fc3RhdGUgOj0gc3RhdGVfYWxsb3dzKCJzYW5kYm94X25hbWUiLCBzYW5kYm94X25hbWUpCiAgICBvcHNfYnVpbGRlcjEgOj0gY29uY2F0X29wX2lmX25vdF9udWxsKG9wc19idWlsZGVyLCBhZGRfc2FuZGJveF9uYW1lX3RvX3N0YXRlKQoKICAgICMgQ2hlY2sgaWYgYW55IGVsZW1lbnQgZnJvbSB0aGUgcG9saWN5X2RhdGEuY29udGFpbmVycyBhcnJheSBhbGxvd3MgdGhlIGlucHV0IHJlcXVlc3QuCiAgICBzb21lIHBfY29udGFpbmVyIGluIHBvbGljeV9kYXRhLmNvbnRhaW5lcnMKICAgIHByaW50KCI9PT09PT09PSBDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiB0cnlpbmcgbmV4dCBwb2xpY3kgY29udGFpbmVyIikKCiAgICBwX3BpZG5zIDo9IHBfY29udGFpbmVyLnNhbmRib3hfcGlkbnMKICAgIGlfcGlkbnMgOj0gcmVxLnNhbmRib3hfcGlkbnMKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiBwX3BpZG5zID0iLCBwX3BpZG5zLCAiaV9waWRucyA9IiwgaV9waWRucykKICAgIHBfcGlkbnMgPT0gaV9waWRucwoKICAgIHBfb2NpIDo9IHBfY29udGFpbmVyLk9DSQoKICAgICMgY2hlY2sgbmFtZXNwYWNlCiAgICBwX25hbWVzcGFjZSA6PSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBpX25hbWVzcGFjZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwcmludCAoIkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb246IHBfbmFtZXNwYWNlID0iLCBwX25hbWVzcGFjZSwgImlfbmFtZXNwYWNlID0iLCBpX25hbWVzcGFjZSkKICAgIGFkZF9uYW1lc3BhY2VfdG9fc3RhdGUgOj0gYWxsb3dfbmFtZXNwYWNlKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkKICAgIG9wc19idWlsZGVyMiA6PSBjb25jYXRfb3BfaWZfbm90X251bGwob3BzX2J1aWxkZXIxLCBhZGRfbmFtZXNwYWNlX3RvX3N0YXRlKQoKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiBwIFZlcnNpb24gPSIsIHBfb2NpLlZlcnNpb24sICJpIFZlcnNpb24gPSIsIGlfb2NpLlZlcnNpb24pCiAgICBwX29jaS5WZXJzaW9uID09IGlfb2NpLlZlcnNpb24KCiAgICBwcmludCgiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdENvbW1vbjogcCBSZWFkb25seSA9IiwgcF9vY2kuUm9vdC5SZWFkb25seSwgImkgUmVhZG9ubHkgPSIsIGlfb2NpLlJvb3QuUmVhZG9ubHkpCiAgICBwX29jaS5Sb290LlJlYWRvbmx5ID09IGlfb2NpLlJvb3QuUmVhZG9ubHkKCiAgICBhbGxvd19hbm5vKHBfb2NpLCBpX29jaSkKCiAgICBwX3N0b3JhZ2VzIDo9IHBfY29udGFpbmVyLnN0b3JhZ2VzCiAgICBhbGxvd19ieV9hbm5vKHBfb2NpLCBpX29jaSwgcF9zdG9yYWdlcywgaV9zdG9yYWdlcykKCiAgICBwX2RldmljZXMgOj0gcF9jb250YWluZXIuZGV2aWNlcwogICAgYWxsb3dfZGV2aWNlcyhwX2RldmljZXMsIGlfZGV2aWNlcykKCiAgICByZXQgOj0gYWxsb3dfbGludXgob3BzX2J1aWxkZXIyLCBwX29jaSwgaV9vY2kpCiAgICByZXQuYWxsb3dlZAoKICAgIG9wcyA6PSByZXQub3BzCgogICAgcHJpbnQoIkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb246IHRydWUiKQp9CgphbGxvd19jcmVhdGVfY29udGFpbmVyX2lucHV0KHJlcSkgewogICAgcHJpbnQoImFsbG93X2NyZWF0ZV9jb250YWluZXJfaW5wdXQ6IGlucHV0ID0iLCByZXEpCgogICAgY291bnQocmVxLnNoYXJlZF9tb3VudHMpID09IDAKICAgIGlzX251bGwocmVxLnN0cmluZ191c2VyKQoKICAgIGlfb2NpIDo9IHJlcS5PQ0kKICAgIGlzX251bGwoaV9vY2kuSG9va3MpCiAgICBpc19udWxsKGlfb2NpLlNvbGFyaXMpCiAgICBpc19udWxsKGlfb2NpLldpbmRvd3MpCgogICAgaV9saW51eCA6PSBpX29jaS5MaW51eAogICAgY291bnQoaV9saW51eC5HSURNYXBwaW5ncykgPT0gMAogICAgY291bnQoaV9saW51eC5Nb3VudExhYmVsKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlJlc291cmNlcy5EZXZpY2VzKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlJvb3Rmc1Byb3BhZ2F0aW9uKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlVJRE1hcHBpbmdzKSA9PSAwCiAgICBpc19udWxsKGlfbGludXguSW50ZWxSZHQpCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLkJsb2NrSU8pCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLk5ldHdvcmspCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLlBpZHMpCiAgICBpc19udWxsKGlfbGludXguU2VjY29tcCkKCiAgICBpX3Byb2Nlc3MgOj0gaV9vY2kuUHJvY2VzcwogICAgY291bnQoaV9wcm9jZXNzLlNlbGludXhMYWJlbCkgPT0gMAogICAgY291bnQoaV9wcm9jZXNzLlVzZXIuVXNlcm5hbWUpID09IDAKCiAgICBwcmludCgiYWxsb3dfY3JlYXRlX2NvbnRhaW5lcl9pbnB1dDogdHJ1ZSIpCn0KCmFsbG93X25hbWVzcGFjZShwX25hbWVzcGFjZSwgaV9uYW1lc3BhY2UpID0gYWRkX25hbWVzcGFjZSB7CiAgICBwX25hbWVzcGFjZSA9PSBpX25hbWVzcGFjZQogICAgYWRkX25hbWVzcGFjZSA6PSBudWxsCiAgICBwcmludCgiYWxsb3dfbmFtZXNwYWNlIDE6IGlucHV0IG5hbWVzcGFjZSBtYXRjaGVzIHBvbGljeSBkYXRhIikKfQoKYWxsb3dfbmFtZXNwYWNlKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkgPSBhZGRfbmFtZXNwYWNlIHsKICAgIHBfbmFtZXNwYWNlID09ICIiCiAgICBwcmludCgiYWxsb3dfbmFtZXNwYWNlIDI6IG5vIG5hbWVzcGFjZSBmb3VuZCBvbiBwb2xpY3kgZGF0YSIpCiAgICBhZGRfbmFtZXNwYWNlIDo9IHN0YXRlX2FsbG93cygibmFtZXNwYWNlIiwgaV9uYW1lc3BhY2UpCn0KCiMgdmFsdWUgaGFzbid0IGJlZW4gc2VlbiBiZWZvcmUsIHNhdmUgaXQgdG8gc3RhdGUKc3RhdGVfYWxsb3dzKGtleSwgdmFsdWUpID0gYWN0aW9uIHsKICBzdGF0ZSA6PSBnZXRfc3RhdGUoKQogIHByaW50KCJzdGF0ZV9hbGxvd3MgMTogc3RhdGVba2V5XSA9Iiwgc3RhdGVba2V5XSwgInZhbHVlID0iLCB2YWx1ZSkKICBub3Qgc3RhdGVba2V5XQogIHByaW50KCJzdGF0ZV9hbGxvd3MgMTogc2F2aW5nIHRvIHN0YXRlIGtleSA9Iiwga2V5LCAidmFsdWUgPSIsIHZhbHVlKQogIHBhdGggOj0gZ2V0X3N0YXRlX3BhdGgoa2V5KSAKICBhY3Rpb24gOj0gewogICAgIm9wIjogImFkZCIsCiAgICAicGF0aCI6IHBhdGgsIAogICAgInZhbHVlIjogdmFsdWUsCiAgfQp9CgojIHZhbHVlIG1hdGNoZXMgd2hhdCdzIGluIHN0YXRlLCBhbGxvdyBpdApzdGF0ZV9hbGxvd3Moa2V5LCB2YWx1ZSkgPSBhY3Rpb24gewogIHByaW50KCJzdGF0ZV9hbGxvd3MgMjogc3RhcnQiKQogIHN0YXRlIDo9IGdldF9zdGF0ZSgpCiAgcHJpbnQoInN0YXRlX2FsbG93cyAyOiBzdGF0ZVtrZXldID0iLCBzdGF0ZVtrZXldLCAidmFsdWUgPSIsIHZhbHVlKQogIHZhbHVlID09IHN0YXRlW2tleV0KICBwcmludCgic3RhdGVfYWxsb3dzIDI6IGZvdW5kIGtleSA9Iiwga2V5LCAidmFsdWUgPSIsIHZhbHVlLCAiIGluIHN0YXRlIikKICBhY3Rpb24gOj0gbnVsbAp9CgojIGhlbHBlciBmdW5jdGlvbnMgdG8gaW50ZXJhY3Qgd2l0aCB0aGUgc3RhdGUKZ2V0X3N0YXRlKCkgPSBzdGF0ZSB7CiAgc3RhdGUgOj0gZGF0YVsicHN0YXRlIl0KfQoKZ2V0X3N0YXRlX3ZhbChrZXkpID0gdmFsdWUgewogICAgc3RhdGUgOj0gZ2V0X3N0YXRlKCkKICAgIHZhbHVlIDo9IHN0YXRlW2tleV0KfQoKZ2V0X3N0YXRlX3BhdGgoa2V5KSA9IHBhdGggewogICAgIyBwcmVwZW5kICIvcHN0YXRlLyIgdG8ga2V5CiAgICBwYXRoIDo9IGNvbmNhdCgiLyIsIFsiL3BzdGF0ZSIsIGtleV0pCn0KCiMgSGVscGVyIGZ1bmN0aW9ucyB0byBjb25kaXRpb25hbGx5IGNvbmNhdGVuYXRlIG9wIGlzIG5vdCBudWxsCmNvbmNhdF9vcF9pZl9ub3RfbnVsbChvcHMsIG9wKSA9IHJlc3VsdCB7CiAgICBvcCA9PSBudWxsCiAgICByZXN1bHQgOj0gb3BzCn0KCmNvbmNhdF9vcF9pZl9ub3RfbnVsbChvcHMsIG9wKSA9IHJlc3VsdCB7CiAgICBvcCAhPSBudWxsCiAgICByZXN1bHQgOj0gYXJyYXkuY29uY2F0KG9wcywgW29wXSkKfQoKIyBSZWplY3QgdW5leHBlY3RlZCBhbm5vdGF0aW9ucy4KYWxsb3dfYW5ubyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19hbm5vIDE6IHN0YXJ0IikKCiAgICBub3QgaV9vY2kuQW5ub3RhdGlvbnMKCiAgICBwcmludCgiYWxsb3dfYW5ubyAxOiB0cnVlIikKfQphbGxvd19hbm5vKHBfb2NpLCBpX29jaSkgewogICAgcHJpbnQoImFsbG93X2Fubm8gMjogcCBBbm5vdGF0aW9ucyA9IiwgcF9vY2kuQW5ub3RhdGlvbnMpCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiBpIEFubm90YXRpb25zID0iLCBpX29jaS5Bbm5vdGF0aW9ucykKCiAgICBpX2tleXMgOj0gb2JqZWN0LmtleXMoaV9vY2kuQW5ub3RhdGlvbnMpCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiBpIGtleXMgPSIsIGlfa2V5cykKCiAgICBldmVyeSBpX2tleSBpbiBpX2tleXMgewogICAgICAgIGFsbG93X2Fubm9fa2V5KGlfa2V5LCBwX29jaSkKICAgIH0KCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiB0cnVlIikKfQoKYWxsb3dfYW5ub19rZXkoaV9rZXksIHBfb2NpKSB7CiAgICBwcmludCgiYWxsb3dfYW5ub19rZXkgMTogaSBrZXkgPSIsIGlfa2V5KQoKICAgIHN0YXJ0c3dpdGgoaV9rZXksICJpby5rdWJlcm5ldGVzLmNyaS4iKQoKICAgIHByaW50KCJhbGxvd19hbm5vX2tleSAxOiB0cnVlIikKfQphbGxvd19hbm5vX2tleShpX2tleSwgcF9vY2kpIHsKICAgIHByaW50KCJhbGxvd19hbm5vX2tleSAyOiBpIGtleSA9IiwgaV9rZXkpCgogICAgc29tZSBwX2tleSwgXyBpbiBwX29jaS5Bbm5vdGF0aW9ucwogICAgcF9rZXkgPT0gaV9rZXkKCiAgICBwcmludCgiYWxsb3dfYW5ub19rZXkgMjogdHJ1ZSIpCn0KCiMgR2V0IHRoZSB2YWx1ZSBvZiB0aGUgU19OQU1FX0tFWSBhbm5vdGF0aW9uIGFuZAojIGNvcnJlbGF0ZSBpdCB3aXRoIG90aGVyIGFubm90YXRpb25zIGFuZCBwcm9jZXNzIGZpZWxkcy4KYWxsb3dfYnlfYW5ubyhwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpIHsKICAgIHByaW50KCJhbGxvd19ieV9hbm5vIDE6IHN0YXJ0IikKCiAgICBub3QgcF9vY2kuQW5ub3RhdGlvbnNbU19OQU1FX0tFWV0KCiAgICBpX3NfbmFtZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMTogaV9zX25hbWUgPSIsIGlfc19uYW1lKQoKICAgIGlfc19uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FU1BBQ0VfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMTogaV9zX25hbWVzcGFjZSA9IiwgaV9zX25hbWVzcGFjZSkKCiAgICBhbGxvd19ieV9zYW5kYm94X25hbWUocF9vY2ksIGlfb2NpLCBwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBpX3NfbmFtZSwgaV9zX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfYnlfYW5ubyAxOiB0cnVlIikKfQphbGxvd19ieV9hbm5vKHBfb2NpLCBpX29jaSwgcF9zdG9yYWdlcywgaV9zdG9yYWdlcykgewogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMjogc3RhcnQiKQoKICAgIHBfc19uYW1lIDo9IHBfb2NpLkFubm90YXRpb25zW1NfTkFNRV9LRVldCiAgICBpX3NfbmFtZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMjogaV9zX25hbWUgPSIsIGlfc19uYW1lLCAicF9zX25hbWUgPSIsIHBfc19uYW1lKQoKICAgIGFsbG93X3NhbmRib3hfbmFtZShwX3NfbmFtZSwgaV9zX25hbWUpCgogICAgaV9zX25hbWVzcGFjZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwcmludCgiYWxsb3dfYnlfYW5ubyAyOiBpX3NfbmFtZXNwYWNlID0iLCBpX3NfbmFtZXNwYWNlKQoKICAgIGFsbG93X2J5X3NhbmRib3hfbmFtZShwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMsIGlfc19uYW1lLCBpX3NfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd19ieV9hbm5vIDI6IHRydWUiKQp9CgphbGxvd19ieV9zYW5kYm94X25hbWUocF9vY2ksIGlfb2NpLCBwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfYnlfc2FuZGJveF9uYW1lOiBzdGFydCIpCgogICAgaV9uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FU1BBQ0VfS0VZXQoKICAgIGFsbG93X2J5X2NvbnRhaW5lcl90eXBlcyhwX29jaSwgaV9vY2ksIHNfbmFtZSwgaV9uYW1lc3BhY2UpCiAgICBhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZChwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpCiAgICBhbGxvd19wcm9jZXNzKHBfb2NpLlByb2Nlc3MsIGlfb2NpLlByb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpCgogICAgcHJpbnQoImFsbG93X2J5X3NhbmRib3hfbmFtZTogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfbmFtZShwX3NfbmFtZSwgaV9zX25hbWUpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X25hbWU6IHN0YXJ0IikKICAgIHJlZ2V4Lm1hdGNoKHBfc19uYW1lLCBpX3NfbmFtZSkKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9uYW1lOiB0cnVlIikKfQoKIyBDaGVjayB0aGF0IHRoZSAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLXR5cGUiIGFuZAojICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIiBhbm5vdGF0aW9ucyBkZXNpZ25hdGUgdGhlCiMgZXhwZWN0ZWQgdHlwZSAtIGVpdGhlciBhICJzYW5kYm94IiBvciBhICJjb250YWluZXIiLiBUaGVuLCB2YWxpZGF0ZQojIG90aGVyIGFubm90YXRpb25zIGJhc2VkIG9uIHRoZSBhY3R1YWwgInNhbmRib3giIG9yICJjb250YWluZXIiIHZhbHVlCiMgZnJvbSB0aGUgaW5wdXQgY29udGFpbmVyLgphbGxvd19ieV9jb250YWluZXJfdHlwZXMocF9vY2ksIGlfb2NpLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfYnlfY29udGFpbmVyX3R5cGVzOiBjaGVja2luZyBpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSIpCgogICAgY190eXBlIDo9ICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSIKICAgIAogICAgcF9jcmlfdHlwZSA6PSBwX29jaS5Bbm5vdGF0aW9uc1tjX3R5cGVdCiAgICBpX2NyaV90eXBlIDo9IGlfb2NpLkFubm90YXRpb25zW2NfdHlwZV0KICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZXM6IHBfY3JpX3R5cGUgPSIsIHBfY3JpX3R5cGUsICJpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgcF9jcmlfdHlwZSA9PSBpX2NyaV90eXBlCgogICAgYWxsb3dfYnlfY29udGFpbmVyX3R5cGUoaV9jcmlfdHlwZSwgcF9vY2ksIGlfb2NpLCBzX25hbWUsIHNfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZXM6IHRydWUiKQp9CgphbGxvd19ieV9jb250YWluZXJfdHlwZShpX2NyaV90eXBlLCBwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAxOiBpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgaV9jcmlfdHlwZSA9PSAic2FuZGJveCIKCiAgICBpX2thdGFfdHlwZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1siaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5jb250YWluZXJfdHlwZSJdCiAgICBwcmludCgiYWxsb3dfYnlfY29udGFpbmVyX3R5cGUgMTogaV9rYXRhX3R5cGUgPSIsIGlfa2F0YV90eXBlKQogICAgaV9rYXRhX3R5cGUgPT0gInBvZF9zYW5kYm94IgoKICAgIGFsbG93X3NhbmRib3hfY29udGFpbmVyX25hbWUocF9vY2ksIGlfb2NpKQogICAgYWxsb3dfc2FuZGJveF9uZXRfbmFtZXNwYWNlKHBfb2NpLCBpX29jaSkKICAgIGFsbG93X3NhbmRib3hfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpCgogICAgcHJpbnQoImFsbG93X2J5X2NvbnRhaW5lcl90eXBlIDE6IHRydWUiKQp9CgphbGxvd19ieV9jb250YWluZXJfdHlwZShpX2NyaV90eXBlLCBwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiBpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgaV9jcmlfdHlwZSA9PSAiY29udGFpbmVyIgoKICAgIGlfa2F0YV90eXBlIDo9IGlfb2NpLkFubm90YXRpb25zWyJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIl0KICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiBpX2thdGFfdHlwZSA9IiwgaV9rYXRhX3R5cGUpCiAgICBpX2thdGFfdHlwZSA9PSAicG9kX2NvbnRhaW5lciIKCiAgICBhbGxvd19jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpCiAgICBhbGxvd19uZXRfbmFtZXNwYWNlKHBfb2NpLCBpX29jaSkKICAgIGFsbG93X2xvZ19kaXJlY3RvcnkocF9vY2ksIGlfb2NpKQoKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiB0cnVlIikKfQoKIyAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLW5hbWUiIGFubm90YXRpb24KYWxsb3dfc2FuZGJveF9jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X2NvbnRhaW5lcl9uYW1lOiBzdGFydCIpCgogICAgY29udGFpbmVyX2Fubm90YXRpb25fbWlzc2luZyhwX29jaSwgaV9vY2ksICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItbmFtZSIpCgogICAgcHJpbnQoImFsbG93X3NhbmRib3hfY29udGFpbmVyX25hbWU6IHRydWUiKQp9CgphbGxvd19jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19jb250YWluZXJfbmFtZTogc3RhcnQiKQoKICAgIGFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uKHBfb2NpLCBpX29jaSwgImlvLmt1YmVybmV0ZXMuY3JpLmNvbnRhaW5lci1uYW1lIikKCiAgICBwcmludCgiYWxsb3dfY29udGFpbmVyX25hbWU6IHRydWUiKQp9Cgpjb250YWluZXJfYW5ub3RhdGlvbl9taXNzaW5nKHBfb2NpLCBpX29jaSwga2V5KSB7CiAgICBwcmludCgiY29udGFpbmVyX2Fubm90YXRpb25fbWlzc2luZzoiLCBrZXkpCgogICAgbm90IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIG5vdCBpX29jaS5Bbm5vdGF0aW9uc1trZXldCgogICAgcHJpbnQoImNvbnRhaW5lcl9hbm5vdGF0aW9uX21pc3Npbmc6IHRydWUiKQp9CgphbGxvd19jb250YWluZXJfYW5ub3RhdGlvbihwX29jaSwgaV9vY2ksIGtleSkgewogICAgcHJpbnQoImFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uOiBrZXkgPSIsIGtleSkKCiAgICBwX3ZhbHVlIDo9IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIGlfdmFsdWUgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgcHJpbnQoImFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uOiBwX3ZhbHVlID0iLCBwX3ZhbHVlLCAiaV92YWx1ZSA9IiwgaV92YWx1ZSkKCiAgICBwX3ZhbHVlID09IGlfdmFsdWUKCiAgICBwcmludCgiYWxsb3dfY29udGFpbmVyX2Fubm90YXRpb246IHRydWUiKQp9CgojICJuZXJkY3RsL25ldHdvcmstbmFtZXNwYWNlIiBhbm5vdGF0aW9uCmFsbG93X3NhbmRib3hfbmV0X25hbWVzcGFjZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X25ldF9uYW1lc3BhY2U6IHN0YXJ0IikKCiAgICBrZXkgOj0gIm5lcmRjdGwvbmV0d29yay1uYW1lc3BhY2UiCgogICAgcF9uYW1lc3BhY2UgOj0gcF9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgaV9uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgcHJpbnQoImFsbG93X3NhbmRib3hfbmV0X25hbWVzcGFjZTogcF9uYW1lc3BhY2UgPSIsIHBfbmFtZXNwYWNlLCAiaV9uYW1lc3BhY2UgPSIsIGlfbmFtZXNwYWNlKQoKICAgIHJlZ2V4Lm1hdGNoKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9uZXRfbmFtZXNwYWNlOiB0cnVlIikKfQoKYWxsb3dfbmV0X25hbWVzcGFjZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19uZXRfbmFtZXNwYWNlOiBzdGFydCIpCgogICAga2V5IDo9ICJuZXJkY3RsL25ldHdvcmstbmFtZXNwYWNlIgoKICAgIG5vdCBwX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICBub3QgaV9vY2kuQW5ub3RhdGlvbnNba2V5XQoKICAgIHByaW50KCJhbGxvd19uZXRfbmFtZXNwYWNlOiB0cnVlIikKfQoKIyAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1sb2ctZGlyZWN0b3J5IiBhbm5vdGF0aW9uCmFsbG93X3NhbmRib3hfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X2xvZ19kaXJlY3Rvcnk6IHN0YXJ0IikKCiAgICBrZXkgOj0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbG9nLWRpcmVjdG9yeSIKCiAgICBwX2RpciA6PSBwX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICByZWdleDEgOj0gcmVwbGFjZShwX2RpciwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHJlZ2V4MiA6PSByZXBsYWNlKHJlZ2V4MSwgIiQoc2FuZGJveC1uYW1lc3BhY2UpIiwgc19uYW1lc3BhY2UpCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiByZWdleDIgPSIsIHJlZ2V4MikKCiAgICBpX2RpciA6PSBpX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiBpX2RpciA9IiwgaV9kaXIpCgogICAgcmVnZXgubWF0Y2gocmVnZXgyLCBpX2RpcikKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiB0cnVlIikKfQoKYWxsb3dfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19sb2dfZGlyZWN0b3J5OiBzdGFydCIpCgogICAga2V5IDo9ICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWxvZy1kaXJlY3RvcnkiCgogICAgbm90IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIG5vdCBpX29jaS5Bbm5vdGF0aW9uc1trZXldCgogICAgcHJpbnQoImFsbG93X2xvZ19kaXJlY3Rvcnk6IHRydWUiKQp9CgphbGxvd19kZXZpY2VzKHBfZGV2aWNlcywgaV9kZXZpY2VzKSB7CiAgICBwcmludCgiYWxsb3dfZGV2aWNlczogc3RhcnQiKQogICAgZXZlcnkgaV9kZXZpY2UgaW4gaV9kZXZpY2VzIHsKICAgICAgICBwcmludCgiYWxsb3dfZGV2aWNlczogaV9kZXZpY2UgPSIsIGlfZGV2aWNlKQogICAgICAgIHNvbWUgcF9kZXZpY2UgaW4gcF9kZXZpY2VzCiAgICAgICAgcF9kZXZpY2UuY29udGFpbmVyX3BhdGggPT0gaV9kZXZpY2UuY29udGFpbmVyX3BhdGgKICAgIH0KICAgIHByaW50KCJhbGxvd19kZXZpY2VzOiB0cnVlIikKfQoKYWxsb3dfbGludXgoc3RhdGVfb3BzLCBwX29jaSwgaV9vY2kpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIHBfbmFtZXNwYWNlcyA6PSBwX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbGludXg6IHAgbmFtZXNwYWNlcyA9IiwgcF9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlcyA6PSBpX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbGludXg6IGkgbmFtZXNwYWNlcyA9IiwgaV9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlX3dpdGhvdXRfbmV0d29yayA6PSBbb2JqIHwgb2JqIDo9IGlfbmFtZXNwYWNlc1tfXTsgb2JqLlR5cGUgIT0gIm5ldHdvcmsiXQoKICAgIHByaW50KCJhbGxvd19saW51eDogaV9uYW1lc3BhY2Vfd2l0aG91dF9uZXR3b3JrID0iLCBpX25hbWVzcGFjZV93aXRob3V0X25ldHdvcmspCgogICAgcF9uYW1lc3BhY2VzID09IGlfbmFtZXNwYWNlX3dpdGhvdXRfbmV0d29yawoKICAgIGFsbG93X21hc2tlZF9wYXRocyhwX29jaSwgaV9vY2kpCiAgICBhbGxvd19yZWFkb25seV9wYXRocyhwX29jaSwgaV9vY2kpCiAgICBhbGxvd19saW51eF9kZXZpY2VzKHBfb2NpLkxpbnV4LkRldmljZXMsIGlfb2NpLkxpbnV4LkRldmljZXMpCiAgICBhbGxvd19saW51eF9zeXNjdGwocF9vY2kuTGludXgsIGlfb2NpLkxpbnV4KQogICAgcmV0IDo9IGFsbG93X25ldHdvcmtfbmFtZXNwYWNlX3N0YXJ0KHN0YXRlX29wcywgcF9vY2ksIGlfb2NpKQogICAgcmV0LmFsbG93ZWQKCiAgICBvcHMgOj0gcmV0Lm9wcwoKICAgIHByaW50KCJhbGxvd19saW51eDogdHJ1ZSIpCn0KCiMgUmV0cmlldmUgdGhlICJuZXR3b3JrIiBuYW1lc3BhY2UgZnJvbSB0aGUgaW5wdXQgZGF0YSBhbmQgcGFzcyBpdCBvbiBmb3IgdGhlCiMgbmV0d29yayBuYW1lc3BhY2UgcG9saWN5IGNoZWNrcy4KYWxsb3dfbmV0d29ya19uYW1lc3BhY2Vfc3RhcnQoc3RhdGVfb3BzLCBwX29jaSwgaV9vY2kpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIHByaW50KCJhbGxvd19uZXR3b3JrX25hbWVzcGFjZSBzdGFydDogc3RhcnQiKQoKICAgIHBfbmFtZXNwYWNlcyA6PSBwX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IHAgbmFtZXNwYWNlcyA9IiwgcF9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlcyA6PSBpX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IGkgbmFtZXNwYWNlcyA9IiwgaV9uYW1lc3BhY2VzKQoKICAgICMgUmV0dXJuIHBhdGggb2YgdGhlICJuZXR3b3JrIiBuYW1lc3BhY2UKICAgIG5ldHdvcmtfbnMgOj0gW29iaiB8IG9iaiA6PSBpX25hbWVzcGFjZXNbX107IG9iai5UeXBlID09ICJuZXR3b3JrIl0KCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IG5ldHdvcmtfbnMgPSIsIG5ldHdvcmtfbnMpCgogICAgcmV0IDo9IGFsbG93X25ldHdvcmtfbmFtZXNwYWNlKHN0YXRlX29wcywgbmV0d29ya19ucykKICAgIHJldC5hbGxvd2VkCgogICAgb3BzIDo9IHJldC5vcHMKfQoKIyBUaGlzIHJ1bGUgaXMgd2hlbiB0aGVyZSdzIG5vIG5ldHdvcmsgbmFtZXNwYWNlIGluIHRoZSBpbnB1dCBkYXRhLgphbGxvd19uZXR3b3JrX25hbWVzcGFjZShzdGF0ZV9vcHMsIG5ldHdvcmtfbnMpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIGNvdW50KG5ldHdvcmtfbnMpID09IDAKCiAgICBuZXR3b3JrX25zX3BhdGggPSAiIgoKICAgIGFkZF9uZXR3b3JrX25hbWVzcGFjZV90b19zdGF0ZSA6PSBzdGF0ZV9hbGxvd3MoIm5ldHdvcmtfbmFtZXNwYWNlIiwgbmV0d29ya19uc19wYXRoKQogICAgb3BzIDo9IGNvbmNhdF9vcF9pZl9ub3RfbnVsbChzdGF0ZV9vcHMsIGFkZF9uZXR3b3JrX25hbWVzcGFjZV90b19zdGF0ZSkKCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2UgMTogdHJ1ZSIpCn0KCiMgVGhpcyBydWxlIGlzIHdoZW4gdGhlcmUncyBleGFjdGx5IG9uZSBuZXR3b3JrIG5hbWVzcGFjZSBpbiB0aGUgaW5wdXQgZGF0YS4KYWxsb3dfbmV0d29ya19uYW1lc3BhY2Uoc3RhdGVfb3BzLCBuZXR3b3JrX25zKSA6PSB7Im9wcyI6IG9wcywgImFsbG93ZWQiOiB0cnVlfSB7CiAgICBjb3VudChuZXR3b3JrX25zKSA9PSAxCgogICAgYWRkX25ldHdvcmtfbmFtZXNwYWNlX3RvX3N0YXRlIDo9IHN0YXRlX2FsbG93cygibmV0d29ya19uYW1lc3BhY2UiLCBuZXR3b3JrX25zWzBdLlBhdGgpCiAgICBvcHMgOj0gY29uY2F0X29wX2lmX25vdF9udWxsKHN0YXRlX29wcywgYWRkX25ldHdvcmtfbmFtZXNwYWNlX3RvX3N0YXRlKQoKICAgIHByaW50KCJhbGxvd19uZXR3b3JrX25hbWVzcGFjZSAyOiB0cnVlIikKfQoKYWxsb3dfbWFza2VkX3BhdGhzKHBfb2NpLCBpX29jaSkgewogICAgcF9wYXRocyA6PSBwX29jaS5MaW51eC5NYXNrZWRQYXRocwogICAgcHJpbnQoImFsbG93X21hc2tlZF9wYXRocyAxOiBwX3BhdGhzID0iLCBwX3BhdGhzKQoKICAgIGlfcGF0aHMgOj0gaV9vY2kuTGludXguTWFza2VkUGF0aHMKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aHMgMTogaV9wYXRocyA9IiwgaV9wYXRocykKCiAgICBhbGxvd19tYXNrZWRfcGF0aHNfYXJyYXkocF9wYXRocywgaV9wYXRocykKCiAgICBwcmludCgiYWxsb3dfbWFza2VkX3BhdGhzIDE6IHRydWUiKQp9CmFsbG93X21hc2tlZF9wYXRocyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aHMgMjogc3RhcnQiKQoKICAgIG5vdCBwX29jaS5MaW51eC5NYXNrZWRQYXRocwogICAgbm90IGlfb2NpLkxpbnV4Lk1hc2tlZFBhdGhzCgogICAgcHJpbnQoImFsbG93X21hc2tlZF9wYXRocyAyOiB0cnVlIikKfQoKIyBBbGwgdGhlIHBvbGljeSBtYXNrZWQgcGF0aHMgbXVzdCBiZSBtYXNrZWQgaW4gdGhlIGlucHV0IGRhdGEgdG9vLgojIElucHV0IGlzIGFsbG93ZWQgdG8gaGF2ZSBtb3JlIG1hc2tlZCBwYXRocyB0aGFuIHRoZSBwb2xpY3kuCmFsbG93X21hc2tlZF9wYXRoc19hcnJheShwX2FycmF5LCBpX2FycmF5KSB7CiAgICBldmVyeSBwX2VsZW0gaW4gcF9hcnJheSB7CiAgICAgICAgYWxsb3dfbWFza2VkX3BhdGgocF9lbGVtLCBpX2FycmF5KQogICAgfQp9CgphbGxvd19tYXNrZWRfcGF0aChwX2VsZW0sIGlfYXJyYXkpIHsKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aDogcF9lbGVtID0iLCBwX2VsZW0pCgogICAgc29tZSBpX2VsZW0gaW4gaV9hcnJheQogICAgcF9lbGVtID09IGlfZWxlbQoKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aDogdHJ1ZSIpCn0KCmFsbG93X3JlYWRvbmx5X3BhdGhzKHBfb2NpLCBpX29jaSkgewogICAgcF9wYXRocyA6PSBwX29jaS5MaW51eC5SZWFkb25seVBhdGhzCiAgICBwcmludCgiYWxsb3dfcmVhZG9ubHlfcGF0aHMgMTogcF9wYXRocyA9IiwgcF9wYXRocykKCiAgICBpX3BhdGhzIDo9IGlfb2NpLkxpbnV4LlJlYWRvbmx5UGF0aHMKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAxOiBpX3BhdGhzID0iLCBpX3BhdGhzKQoKICAgIGFsbG93X3JlYWRvbmx5X3BhdGhzX2FycmF5KHBfcGF0aHMsIGlfcGF0aHMsIGlfb2NpLkxpbnV4Lk1hc2tlZFBhdGhzKQoKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAxOiB0cnVlIikKfQphbGxvd19yZWFkb25seV9wYXRocyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAyOiBzdGFydCIpCgogICAgbm90IHBfb2NpLkxpbnV4LlJlYWRvbmx5UGF0aHMKICAgIG5vdCBpX29jaS5MaW51eC5SZWFkb25seVBhdGhzCgogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGhzIDI6IHRydWUiKQp9CgojIEFsbCB0aGUgcG9saWN5IHJlYWRvbmx5IHBhdGhzIG11c3QgYmUgZWl0aGVyOgojIC0gUHJlc2VudCBpbiB0aGUgaW5wdXQgcmVhZG9ubHkgcGF0aHMsIG9yCiMgLSBQcmVzZW50IGluIHRoZSBpbnB1dCBtYXNrZWQgcGF0aHMuCiMgSW5wdXQgaXMgYWxsb3dlZCB0byBoYXZlIG1vcmUgcmVhZG9ubHkgcGF0aHMgdGhhbiB0aGUgcG9saWN5LgphbGxvd19yZWFkb25seV9wYXRoc19hcnJheShwX2FycmF5LCBpX2FycmF5LCBtYXNrZWRfcGF0aHMpIHsKICAgIGV2ZXJ5IHBfZWxlbSBpbiBwX2FycmF5IHsKICAgICAgICBhbGxvd19yZWFkb25seV9wYXRoKHBfZWxlbSwgaV9hcnJheSwgbWFza2VkX3BhdGhzKQogICAgfQp9CgphbGxvd19yZWFkb25seV9wYXRoKHBfZWxlbSwgaV9hcnJheSwgbWFza2VkX3BhdGhzKSB7CiAgICBwcmludCgiYWxsb3dfcmVhZG9ubHlfcGF0aCAxOiBwX2VsZW0gPSIsIHBfZWxlbSkKCiAgICBzb21lIGlfZWxlbSBpbiBpX2FycmF5CiAgICBwX2VsZW0gPT0gaV9lbGVtCgogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGggMTogdHJ1ZSIpCn0KYWxsb3dfcmVhZG9ubHlfcGF0aChwX2VsZW0sIGlfYXJyYXksIG1hc2tlZF9wYXRocykgewogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGggMjogcF9lbGVtID0iLCBwX2VsZW0pCgogICAgc29tZSBpX21hc2tlZCBpbiBtYXNrZWRfcGF0aHMKICAgIHBfZWxlbSA9PSBpX21hc2tlZAoKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRoIDI6IHRydWUiKQp9CgphbGxvd19saW51eF9kZXZpY2VzKHBfZGV2aWNlcywgaV9kZXZpY2VzKSB7CiAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogc3RhcnQiKQogICAgZXZlcnkgaV9kZXZpY2UgaW4gaV9kZXZpY2VzIHsKICAgICAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogaV9kZXZpY2UgPSIsIGlfZGV2aWNlKQogICAgICAgIHNvbWUgcF9kZXZpY2UgaW4gcF9kZXZpY2VzCiAgICAgICAgaV9kZXZpY2UuUGF0aCA9PSBwX2RldmljZS5QYXRoCiAgICB9CiAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogdHJ1ZSIpCn0KCmFsbG93X2xpbnV4X3N5c2N0bChwX2xpbnV4LCBpX2xpbnV4KSB7CiAgICBwcmludCgiYWxsb3dfbGludXhfc3lzY3RsIDE6IHN0YXJ0IikKICAgIG5vdCBpX2xpbnV4LlN5c2N0bAogICAgcHJpbnQoImFsbG93X2xpbnV4X3N5c2N0bCAxOiB0cnVlIikKfQoKYWxsb3dfbGludXhfc3lzY3RsKHBfbGludXgsIGlfbGludXgpIHsKICAgIHByaW50KCJhbGxvd19saW51eF9zeXNjdGwgMjogc3RhcnQiKQogICAgcF9zeXNjdGwgOj0gcF9saW51eC5TeXNjdGwKICAgIGlfc3lzY3RsIDo9IGlfbGludXguU3lzY3RsCiAgICBldmVyeSBpX25hbWUsIGlfdmFsIGluIGlfc3lzY3RsIHsKICAgICAgICBwcmludCgiYWxsb3dfbGludXhfc3lzY3RsIDI6IGlfbmFtZSA9IiwgaV9uYW1lLCAiaV92YWwgPSIsIGlfdmFsKQogICAgICAgIHBfc3lzY3RsW2lfbmFtZV0gPT0gaV92YWwKICAgIH0KICAgIHByaW50KCJhbGxvd19saW51eF9zeXNjdGwgMjogdHJ1ZSIpCn0KCiMgQ2hlY2sgdGhlIGNvbnNpc3RlbmN5IG9mIHRoZSBpbnB1dCAiaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5idW5kbGVfcGF0aCIKIyBhbmQgaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCIgdmFsdWVzIHdpdGggb3RoZXIgZmllbGRzLgphbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZChwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpIHsKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogc3RhcnQiKQoKICAgIGJ1bmRsZV9wYXRoIDo9IGlfb2NpLkFubm90YXRpb25zWyJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmJ1bmRsZV9wYXRoIl0KICAgIGJ1bmRsZV9pZCA6PSByZXBsYWNlKGJ1bmRsZV9wYXRoLCAiL3J1bi9jb250YWluZXJkL2lvLmNvbnRhaW5lcmQucnVudGltZS52Mi50YXNrL2s4cy5pby8iLCAiIikKCiAgICBidW5kbGVfaWRfZm9ybWF0IDo9IGNvbmNhdCgiIiwgWyJeIiwgQlVORExFX0lELCAiJCJdKQogICAgcmVnZXgubWF0Y2goYnVuZGxlX2lkX2Zvcm1hdCwgYnVuZGxlX2lkKQoKICAgIGtleSA6PSAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCIKCiAgICBwX3JlZ2V4IDo9IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIHNhbmRib3hfaWQgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQoKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogc2FuZGJveF9pZCA9Iiwgc2FuZGJveF9pZCwgInJlZ2V4ID0iLCBwX3JlZ2V4KQogICAgcmVnZXgubWF0Y2gocF9yZWdleCwgc2FuZGJveF9pZCkKCiAgICBhbGxvd19yb290X3BhdGgocF9vY2ksIGlfb2NpLCBidW5kbGVfaWQpCgogICAgZXZlcnkgaV9tb3VudCBpbiBpX29jaS5Nb3VudHMgewogICAgICAgIGFsbG93X21vdW50KHBfb2NpLCBpX21vdW50LCBpX3N0b3JhZ2VzLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpCiAgICB9CgogICAgYWxsb3dfc3RvcmFnZXMocF9zdG9yYWdlcywgaV9zdG9yYWdlcywgYnVuZGxlX2lkLCBzYW5kYm94X2lkKQoKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogdHJ1ZSIpCn0KCmFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHBfcHJvY2VzcyA9IiwgcF9wcm9jZXNzKQogICAgcHJpbnQoImFsbG93X3Byb2Nlc3NfY29tbW9uOiBpX3Byb2Nlc3MgPSAiLCBpX3Byb2Nlc3MpCiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHNfbmFtZSA9Iiwgc19uYW1lKQoKICAgIHBfcHJvY2Vzcy5Dd2QgPT0gaV9wcm9jZXNzLkN3ZAogICAgcF9wcm9jZXNzLk5vTmV3UHJpdmlsZWdlcyA9PSBpX3Byb2Nlc3MuTm9OZXdQcml2aWxlZ2VzCgogICAgYWxsb3dfdXNlcihwX3Byb2Nlc3MsIGlfcHJvY2VzcykKICAgIGFsbG93X2VudihwX3Byb2Nlc3MsIGlfcHJvY2Vzcywgc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHRydWUiKQp9CgojIENvbXBhcmUgdGhlIE9DSSBQcm9jZXNzIGZpZWxkIG9mIGEgcG9saWN5IGNvbnRhaW5lciB3aXRoIHRoZSBpbnB1dCBPQ0kgUHJvY2VzcyBmcm9tIGEgQ3JlYXRlQ29udGFpbmVyUmVxdWVzdAphbGxvd19wcm9jZXNzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfcHJvY2Vzczogc3RhcnQiKQoKICAgIGFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgYWxsb3dfY2FwcyhwX3Byb2Nlc3MuQ2FwYWJpbGl0aWVzLCBpX3Byb2Nlc3MuQ2FwYWJpbGl0aWVzKQogICAgcF9wcm9jZXNzLlRlcm1pbmFsID09IGlfcHJvY2Vzcy5UZXJtaW5hbAoKICAgIHByaW50KCJhbGxvd19wcm9jZXNzOiB0cnVlIikKfQoKIyBDb21wYXJlIHRoZSBPQ0kgUHJvY2VzcyBmaWVsZCBvZiBhIHBvbGljeSBjb250YWluZXIgd2l0aCB0aGUgaW5wdXQgcHJvY2VzcyBmaWVsZCBmcm9tIEV4ZWNQcm9jZXNzUmVxdWVzdAphbGxvd19pbnRlcmFjdGl2ZV9wcm9jZXNzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfaW50ZXJhY3RpdmVfcHJvY2Vzczogc3RhcnQiKQoKICAgIGFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgYWxsb3dfZXhlY19jYXBzKGlfcHJvY2Vzcy5DYXBhYmlsaXRpZXMpCgogICAgIyBUaGVzZSBhcmUgY29tbWFuZHMgZW5hYmxlZCB1c2luZyBFeGVjUHJvY2Vzc1JlcXVlc3QgY29tbWFuZHMgYW5kL29yIHJlZ2V4IGZyb20gdGhlIHNldHRpbmdzIGZpbGUuCiAgICAjIFRoZXkgY2FuIGJlIGV4ZWN1dGVkIGludGVyYWN0aXZlbHkgc28gYWxsb3cgdGhlbSB0byB1c2UgYW55IHZhbHVlIGZvciBpX3Byb2Nlc3MuVGVybWluYWwuCgogICAgcHJpbnQoImFsbG93X2ludGVyYWN0aXZlX3Byb2Nlc3M6IHRydWUiKQp9CgojIENvbXBhcmUgdGhlIE9DSSBQcm9jZXNzIGZpZWxkIG9mIGEgcG9saWN5IGNvbnRhaW5lciB3aXRoIHRoZSBpbnB1dCBwcm9jZXNzIGZpZWxkIGZyb20gRXhlY1Byb2Nlc3NSZXF1ZXN0CmFsbG93X3Byb2JlX3Byb2Nlc3MocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19wcm9iZV9wcm9jZXNzOiBzdGFydCIpCgogICAgYWxsb3dfcHJvY2Vzc19jb21tb24ocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpCiAgICBhbGxvd19leGVjX2NhcHMoaV9wcm9jZXNzLkNhcGFiaWxpdGllcykKICAgIHBfcHJvY2Vzcy5UZXJtaW5hbCA9PSBpX3Byb2Nlc3MuVGVybWluYWwKCiAgICBwcmludCgiYWxsb3dfcHJvYmVfcHJvY2VzczogdHJ1ZSIpCn0KCmFsbG93X3VzZXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MpIHsKICAgIHBfdXNlciA6PSBwX3Byb2Nlc3MuVXNlcgogICAgaV91c2VyIDo9IGlfcHJvY2Vzcy5Vc2VyCgogICAgcHJpbnQoImFsbG93X3VzZXI6IGlucHV0IHVpZCA9IiwgaV91c2VyLlVJRCwgInBvbGljeSB1aWQgPSIsIHBfdXNlci5VSUQpCiAgICBwX3VzZXIuVUlEID09IGlfdXNlci5VSUQKCiAgICAjIFRPRE86IHRyYWNrIGRvd24gdGhlIHJlYXNvbiBmb3IgcmVnaXN0cnkuazhzLmlvL3BhdXNlOjMuOSBiZWluZwogICAgIyAgICAgICBleGVjdXRlZCB3aXRoIGdpZCA9IDAgZGVzcGl0ZSBoYXZpbmcgIjY1NTM1OjY1NTM1IiBpbiBpdHMgY29udGFpbmVyIGltYWdlCiAgICAjICAgICAgIGNvbmZpZy4KICAgICNwcmludCgiYWxsb3dfdXNlcjogaW5wdXQgZ2lkID0iLCBpX3VzZXIuR0lELCAicG9saWN5IGdpZCA9IiwgcF91c2VyLkdJRCkKICAgICNwX3VzZXIuR0lEID09IGlfdXNlci5HSUQKCiAgICAjIFRPRE86IGNvbXBhcmUgdGhlIGFkZGl0aW9uYWxHaWRzIGZpZWxkIHRvbyBhZnRlciBjb21wdXRpbmcgaXRzIHZhbHVlCiAgICAjIGJhc2VkIG9uIC9ldGMvcGFzc3dkIGFuZCAvZXRjL2dyb3VwIGZyb20gdGhlIGNvbnRhaW5lciBpbWFnZS4KfQoKYWxsb3dfZGVwcmVjYXRlZF9hcmdzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZ3MgMTogbm8gYXJncyIpCgogICAgbm90IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJncwogICAgbm90IGlfcHJvY2Vzcy5BcmdzCgogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAxOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZ3MocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSkgewogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiBwb2xpY3kgYXJncyA9IiwgcF9wcm9jZXNzLkRlcHJlY2F0ZWRBcmdzKQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiBpbnB1dCBhcmdzID0iLCBpX3Byb2Nlc3MuQXJncykKCiAgICBjb3VudChwX3Byb2Nlc3MuRGVwcmVjYXRlZEFyZ3MpID09IGNvdW50KGlfcHJvY2Vzcy5BcmdzKQoKICAgIGV2ZXJ5IGksIGlfYXJnIGluIGlfcHJvY2Vzcy5BcmdzIHsKICAgICAgICBhbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpCiAgICB9CgogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDE6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgcF9hcmcyIDo9IHJlcGxhY2UocF9hcmcsICIkJCIsICIkIikKICAgIHBfYXJnMiA9PSBpX2FyZwoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAxOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDI6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgIyBUT0RPOiBjYW4gJChub2RlLW5hbWUpIGJlIGhhbmRsZWQgYmV0dGVyPwogICAgY29udGFpbnMocF9hcmcsICIkKG5vZGUtbmFtZSkiKQoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAyOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDM6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgcF9hcmcyIDo9IHJlcGxhY2UocF9hcmcsICIkJCIsICIkIikKICAgIHBfYXJnMyA6PSByZXBsYWNlKHBfYXJnMiwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAzOiBwX2FyZzMgPSIsIHBfYXJnMykKICAgIHBfYXJnMyA9PSBpX2FyZwoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAzOiB0cnVlIikKfQoKIyBPQ0kgcHJvY2Vzcy5FbnYgZmllbGQKYWxsb3dfZW52KHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfZW52OiBwIGVudiA9IiwgcF9wcm9jZXNzLkVudikKICAgIHByaW50KCJhbGxvd19lbnY6IGkgZW52ID0iLCBpX3Byb2Nlc3MuRW52KQoKICAgIGV2ZXJ5IGlfdmFyIGluIGlfcHJvY2Vzcy5FbnYgewogICAgICAgIHByaW50KCJhbGxvd19lbnY6IGlfdmFyID0iLCBpX3ZhcikKICAgICAgICBhbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgfQoKICAgIHByaW50KCJhbGxvd19lbnY6IHRydWUiKQp9CgojIEFsbG93IGlucHV0IGVudiB2YXJpYWJsZXMgdGhhdCBhcmUgcHJlc2VudCBpbiB0aGUgcG9saWN5IGRhdGEgdG9vLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHBfdmFyID09IGlfdmFyCiAgICBwcmludCgiYWxsb3dfdmFyIDE6IHRydWUiKQp9CgojIE1hdGNoIGlucHV0IHdpdGggb25lIG9mIHRoZSBwb2xpY3kgdmFyaWFibGVzLCBhZnRlciBzdWJzdGl0dXRpbmcgJChzYW5kYm94LW5hbWUpLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHByaW50KCJhbGxvd192YXIgMjogcF92YXIgPSIsIHBfdmFyKQoKICAgIHBfdmFyX3NwbGl0IDo9IHNwbGl0KHBfdmFyLCAiPSIpCiAgICBjb3VudChwX3Zhcl9zcGxpdCkgPT0gMgoKICAgIHBfdmFyX3NwbGl0WzFdID09ICIkKHNhbmRib3gtbmFtZSkiCgogICAgaV92YXJfc3BsaXQgOj0gc3BsaXQoaV92YXIsICI9IikKICAgIGNvdW50KGlfdmFyX3NwbGl0KSA9PSAyCgogICAgaV92YXJfc3BsaXRbMF0gPT0gcF92YXJfc3BsaXRbMF0KICAgIHJlZ2V4Lm1hdGNoKHNfbmFtZSwgaV92YXJfc3BsaXRbMV0pCgogICAgcHJpbnQoImFsbG93X3ZhciAyOiB0cnVlIikKfQoKIyBBbGxvdyBpbnB1dCBlbnYgdmFyaWFibGVzIHRoYXQgbWF0Y2ggd2l0aCBhIHJlcXVlc3RfZGVmYXVsdHMgcmVnZXguCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHNvbWUgcF9yZWdleDEgaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5DcmVhdGVDb250YWluZXJSZXF1ZXN0LmFsbG93X2Vudl9yZWdleAogICAgcF9yZWdleDIgOj0gcmVwbGFjZShwX3JlZ2V4MSwgIiQoaXB2NF9hKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcHY0X2EpCiAgICBwX3JlZ2V4MyA6PSByZXBsYWNlKHBfcmVnZXgyLCAiJChpcF9wKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcF9wKQogICAgcF9yZWdleDQgOj0gcmVwbGFjZShwX3JlZ2V4MywgIiQoc3ZjX25hbWUpIiwgcG9saWN5X2RhdGEuY29tbW9uLnN2Y19uYW1lKQogICAgcF9yZWdleDUgOj0gcmVwbGFjZShwX3JlZ2V4NCwgIiQoZG5zX2xhYmVsKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5kbnNfbGFiZWwpCgogICAgcHJpbnQoImFsbG93X3ZhciAzOiBwX3JlZ2V4NSA9IiwgcF9yZWdleDUpCiAgICByZWdleC5tYXRjaChwX3JlZ2V4NSwgaV92YXIpCgogICAgcHJpbnQoImFsbG93X3ZhciAzOiB0cnVlIikKfQoKIyBBbGxvdyBmaWVsZFJlZiAiZmllbGRQYXRoOiBzdGF0dXMucG9kSVAiIHZhbHVlcy4KYWxsb3dfdmFyKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBpX3Zhciwgc19uYW1lLCBzX25hbWVzcGFjZSkgewogICAgbmFtZV92YWx1ZSA6PSBzcGxpdChpX3ZhciwgIj0iKQogICAgY291bnQobmFtZV92YWx1ZSkgPT0gMgogICAgaXNfaXAobmFtZV92YWx1ZVsxXSkKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIGFsbG93X3BvZF9pcF92YXIobmFtZV92YWx1ZVswXSwgcF92YXIpCgogICAgcHJpbnQoImFsbG93X3ZhciA0OiB0cnVlIikKfQoKIyBBbGxvdyBjb21tb24gZmllbGRSZWYgdmFyaWFibGVzLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBuYW1lX3ZhbHVlIDo9IHNwbGl0KGlfdmFyLCAiPSIpCiAgICBjb3VudChuYW1lX3ZhbHVlKSA9PSAyCgogICAgc29tZSBwX3ZhciBpbiBwX3Byb2Nlc3MuRW52CiAgICBwX25hbWVfdmFsdWUgOj0gc3BsaXQocF92YXIsICI9IikKICAgIGNvdW50KHBfbmFtZV92YWx1ZSkgPT0gMgoKICAgIHBfbmFtZV92YWx1ZVswXSA9PSBuYW1lX3ZhbHVlWzBdCgogICAgIyBUT0RPOiBzaG91bGQgdGhlc2UgYmUgaGFuZGxlZCBpbiBhIGRpZmZlcmVudCB3YXk/CiAgICBhbHdheXNfYWxsb3dlZCA6PSBbIiQoaG9zdC1uYW1lKSIsICIkKG5vZGUtbmFtZSkiLCAiJChwb2QtdWlkKSJdCiAgICBzb21lIGFsbG93ZWQgaW4gYWx3YXlzX2FsbG93ZWQKICAgIGNvbnRhaW5zKHBfbmFtZV92YWx1ZVsxXSwgYWxsb3dlZCkKCiAgICBwcmludCgiYWxsb3dfdmFyIDU6IHRydWUiKQp9CgojIEFsbG93IGZpZWxkUmVmICJmaWVsZFBhdGg6IHN0YXR1cy5ob3N0SVAiIHZhbHVlcy4KYWxsb3dfdmFyKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBpX3Zhciwgc19uYW1lLCBzX25hbWVzcGFjZSkgewogICAgbmFtZV92YWx1ZSA6PSBzcGxpdChpX3ZhciwgIj0iKQogICAgY291bnQobmFtZV92YWx1ZSkgPT0gMgogICAgaXNfaXAobmFtZV92YWx1ZVsxXSkKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIGFsbG93X2hvc3RfaXBfdmFyKG5hbWVfdmFsdWVbMF0sIHBfdmFyKQoKICAgIHByaW50KCJhbGxvd192YXIgNjogdHJ1ZSIpCn0KCiMgQWxsb3cgcmVzb3VyY2VGaWVsZFJlZiB2YWx1ZXMgKGUuZy4sICJsaW1pdHMuY3B1IikuCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIG5hbWVfdmFsdWUgOj0gc3BsaXQoaV92YXIsICI9IikKICAgIGNvdW50KG5hbWVfdmFsdWUpID09IDIKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHBfbmFtZV92YWx1ZSA6PSBzcGxpdChwX3ZhciwgIj0iKQogICAgY291bnQocF9uYW1lX3ZhbHVlKSA9PSAyCgogICAgcF9uYW1lX3ZhbHVlWzBdID09IG5hbWVfdmFsdWVbMF0KCiAgICAjIGEgdmFyaWFibGUgd2Ugc2hvdWxkIGJlIHZhbGlkYXRpbmcgdXNpbmcgYSByZWdleCBmcm9tIHNldHRpbmdzCiAgICBwX25hbWVfdmFsdWVbMV0gPT0gIiQodmFsaWRhdGUtZnJvbS1zZXR0aW5ncykiCgogICAgcmVnZXhfdmFsIDo9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuQ3JlYXRlQ29udGFpbmVyUmVxdWVzdC5hbGxvd19lbnZfcmVnZXhfbWFwW25hbWVfdmFsdWVbMF1dCgogICAgcHJpbnQoImFsbG93X3ZhciA3OiB2YWwgPSIsIG5hbWVfdmFsdWVbMV0pCiAgICBwcmludCgiYWxsb3dfdmFyIDc6IHJlZ2V4X3ZhbCA9IiwgcmVnZXhfdmFsKQoKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4X3ZhbCwgbmFtZV92YWx1ZVsxXSkKCiAgICBwcmludCgiYWxsb3dfdmFyIDc6IHRydWUiKQp9CgojIE1hdGNoIGlucHV0IHdpdGggb25lIG9mIHRoZSBwb2xpY3kgdmFyaWFibGVzLCBhZnRlciBzdWJzdGl0dXRpbmcgJChzYW5kYm94LW5hbWVzcGFjZSkuCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHNvbWUgcF92YXIgaW4gcF9wcm9jZXNzLkVudgogICAgcF92YXIyIDo9IHJlcGxhY2UocF92YXIsICIkKHNhbmRib3gtbmFtZXNwYWNlKSIsIHNfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd192YXIgODogcF92YXIyID0iLCBwX3ZhcjIpCiAgICBwX3ZhcjIgPT0gaV92YXIKCiAgICBwcmludCgiYWxsb3dfdmFyIDg6IHRydWUiKQp9CgphbGxvd19wb2RfaXBfdmFyKHZhcl9uYW1lLCBwX3ZhcikgewogICAgcHJpbnQoImFsbG93X3BvZF9pcF92YXI6IHZhcl9uYW1lID0iLCB2YXJfbmFtZSwgInBfdmFyID0iLCBwX3ZhcikKCiAgICBwX25hbWVfdmFsdWUgOj0gc3BsaXQocF92YXIsICI9IikKICAgIGNvdW50KHBfbmFtZV92YWx1ZSkgPT0gMgoKICAgIHBfbmFtZV92YWx1ZVswXSA9PSB2YXJfbmFtZQogICAgcF9uYW1lX3ZhbHVlWzFdID09ICIkKHBvZC1pcCkiCgogICAgcHJpbnQoImFsbG93X3BvZF9pcF92YXI6IHRydWUiKQp9CgphbGxvd19ob3N0X2lwX3Zhcih2YXJfbmFtZSwgcF92YXIpIHsKICAgIHByaW50KCJhbGxvd19ob3N0X2lwX3ZhcjogdmFyX25hbWUgPSIsIHZhcl9uYW1lLCAicF92YXIgPSIsIHBfdmFyKQoKICAgIHBfbmFtZV92YWx1ZSA6PSBzcGxpdChwX3ZhciwgIj0iKQogICAgY291bnQocF9uYW1lX3ZhbHVlKSA9PSAyCgogICAgcF9uYW1lX3ZhbHVlWzBdID09IHZhcl9uYW1lCiAgICBwX25hbWVfdmFsdWVbMV0gPT0gIiQoaG9zdC1pcCkiCgogICAgcHJpbnQoImFsbG93X2hvc3RfaXBfdmFyOiB0cnVlIikKfQoKaXNfaXAodmFsdWUpIHsKICAgIGJ5dGVzID0gc3BsaXQodmFsdWUsICIuIikKICAgIGNvdW50KGJ5dGVzKSA9PSA0CgogICAgaXNfaXBfZmlyc3RfYnl0ZShieXRlc1swXSkKICAgIGlzX2lwX290aGVyX2J5dGUoYnl0ZXNbMV0pCiAgICBpc19pcF9vdGhlcl9ieXRlKGJ5dGVzWzJdKQogICAgaXNfaXBfb3RoZXJfYnl0ZShieXRlc1szXSkKfQppc19pcF9maXJzdF9ieXRlKGNvbXBvbmVudCkgewogICAgbnVtYmVyID0gdG9fbnVtYmVyKGNvbXBvbmVudCkKICAgIG51bWJlciA+PSAxCiAgICBudW1iZXIgPD0gMjU1Cn0KaXNfaXBfb3RoZXJfYnl0ZShjb21wb25lbnQpIHsKICAgIG51bWJlciA9IHRvX251bWJlcihjb21wb25lbnQpCiAgICBudW1iZXIgPj0gMAogICAgbnVtYmVyIDw9IDI1NQp9CgojIE9DSSByb290LlBhdGgKYWxsb3dfcm9vdF9wYXRoKHBfb2NpLCBpX29jaSwgYnVuZGxlX2lkKSB7CiAgICBpX3BhdGggOj0gaV9vY2kuUm9vdC5QYXRoCiAgICBwX3BhdGgxIDo9IHBfb2NpLlJvb3QuUGF0aAogICAgcHJpbnQoImFsbG93X3Jvb3RfcGF0aDogaV9wYXRoID0iLCBpX3BhdGgsICJwX3BhdGgxID0iLCBwX3BhdGgxKQoKICAgIHBfcGF0aDIgOj0gcmVwbGFjZShwX3BhdGgxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfcm9vdF9wYXRoOiBwX3BhdGgyID0iLCBwX3BhdGgyKQoKICAgIHBfcGF0aDMgOj0gcmVwbGFjZShwX3BhdGgyLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X3Jvb3RfcGF0aDogcF9wYXRoMyA9IiwgcF9wYXRoMykKCiAgICBwX3BhdGgzID09IGlfcGF0aAoKICAgIHByaW50KCJhbGxvd19yb290X3BhdGg6IHRydWUiKQp9CgojIGRldmljZSBtb3VudHMKYWxsb3dfbW91bnQocF9vY2ksIGlfbW91bnQsIGlfc3RvcmFnZXMsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcHJpbnQoImFsbG93X21vdW50OiBpX21vdW50ID0iLCBpX21vdW50KQoKICAgIHNvbWUgcF9tb3VudCBpbiBwX29jaS5Nb3VudHMKICAgIHNvbWUgaV9zdG9yYWdlIGluIGlfc3RvcmFnZXMKCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IHBfbW91bnQgPSIsIHBfbW91bnQpCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IGlfc3RvcmFnZSA9IiwgaV9zdG9yYWdlKQoKICAgIGNoZWNrX21vdW50KHBfbW91bnQsIGlfbW91bnQsIGlfc3RvcmFnZSwgYnVuZGxlX2lkLCBzYW5kYm94X2lkKQoKICAgICMgVE9ETzogYXJlIHRoZXJlIGFueSBvdGhlciByZXF1aXJlZCBwb2xpY3kgY2hlY2tzIGZvciBtb3VudHMgLSBlLmcuLAogICAgIyAgICAgICBtdWx0aXBsZSBtb3VudHMgd2l0aCBzYW1lIHNvdXJjZSBvciBkZXN0aW5hdGlvbj8KCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IHRydWUiKQp9CgpjaGVja19tb3VudChwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcF9tb3VudCA9PSBpX21vdW50CiAgICBwcmludCgiY2hlY2tfbW91bnQgMTogdHJ1ZSIpCn0KY2hlY2tfbW91bnQocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHBfbW91bnQuZGVzdGluYXRpb24gPT0gaV9tb3VudC5kZXN0aW5hdGlvbgogICAgcF9tb3VudC50eXBlXyA9PSBpX21vdW50LnR5cGVfCiAgICBwX21vdW50Lm9wdGlvbnMgPT0gaV9tb3VudC5vcHRpb25zCgogICAgbW91bnRfc291cmNlX2FsbG93cyhwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkKCiAgICBwcmludCgiY2hlY2tfbW91bnQgMjogdHJ1ZSIpCn0KCm1vdW50X3NvdXJjZV9hbGxvd3MocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHJlZ2V4MSA6PSBwX21vdW50LnNvdXJjZQogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5tb3VudF9zb3VyY2VfY3BhdGgpCiAgICByZWdleDQgOj0gcmVwbGFjZShyZWdleDMsICIkKGJ1bmRsZS1pZCkiLCBidW5kbGVfaWQpCgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMTogcmVnZXg0ID0iLCByZWdleDQpCiAgICByZWdleC5tYXRjaChyZWdleDQsIGlfbW91bnQuc291cmNlKQoKICAgIHByaW50KCJtb3VudF9zb3VyY2VfYWxsb3dzIDE6IHRydWUiKQp9Cm1vdW50X3NvdXJjZV9hbGxvd3MocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHJlZ2V4MSA6PSBwX21vdW50LnNvdXJjZQogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5tb3VudF9zb3VyY2VfY3BhdGgpCiAgICByZWdleDQgOj0gcmVwbGFjZShyZWdleDMsICIkKHNhbmRib3gtaWQpIiwgc2FuZGJveF9pZCkKCiAgICBwcmludCgibW91bnRfc291cmNlX2FsbG93cyAyOiByZWdleDQgPSIsIHJlZ2V4NCkKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4NCwgaV9tb3VudC5zb3VyY2UpCgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMjogdHJ1ZSIpCn0KbW91bnRfc291cmNlX2FsbG93cyhwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogaV9tb3VudC5zb3VyY2UgPSIsIGlfbW91bnQuc291cmNlKQogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogaV9zdG9yYWdlLm1vdW50X3BvaW50ID0iLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCgogICAgaV9tb3VudC5zb3VyY2UgPT0gaV9zdG9yYWdlLm1vdW50X3BvaW50CgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogdHJ1ZSIpCn0KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBDcmVhdGUgY29udGFpbmVyIFN0b3JhZ2VzCgphbGxvd19zdG9yYWdlcyhwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHBfY291bnQgOj0gY291bnQocF9zdG9yYWdlcykKICAgIGlfY291bnQgOj0gY291bnQoaV9zdG9yYWdlcykKICAgIHByaW50KCJhbGxvd19zdG9yYWdlczogcF9jb3VudCA9IiwgcF9jb3VudCwgImlfY291bnQgPSIsIGlfY291bnQpCgogICAgcF9jb3VudCA9PSBpX2NvdW50CgogICAgIyBHZXQgdGhlIGNvbnRhaW5lciBpbWFnZSBsYXllciBJRHMgYW5kIHZlcml0eSByb290IGhhc2hlcywgZnJvbSB0aGUgIm92ZXJsYXlmcyIgc3RvcmFnZS4KICAgIHNvbWUgb3ZlcmxheV9zdG9yYWdlIGluIHBfc3RvcmFnZXMKICAgIG92ZXJsYXlfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIHByaW50KCJhbGxvd19zdG9yYWdlczogb3ZlcmxheV9zdG9yYWdlID0iLCBvdmVybGF5X3N0b3JhZ2UpCiAgICBjb3VudChvdmVybGF5X3N0b3JhZ2Uub3B0aW9ucykgPT0gMgoKICAgIGxheWVyX2lkcyA6PSBzcGxpdChvdmVybGF5X3N0b3JhZ2Uub3B0aW9uc1swXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiBsYXllcl9pZHMgPSIsIGxheWVyX2lkcykKCiAgICByb290X2hhc2hlcyA6PSBzcGxpdChvdmVybGF5X3N0b3JhZ2Uub3B0aW9uc1sxXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiByb290X2hhc2hlcyA9Iiwgcm9vdF9oYXNoZXMpCgogICAgZXZlcnkgaV9zdG9yYWdlIGluIGlfc3RvcmFnZXMgewogICAgICAgIGFsbG93X3N0b3JhZ2UocF9zdG9yYWdlcywgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpCiAgICB9CgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiB0cnVlIikKfQoKYWxsb3dfc3RvcmFnZShwX3N0b3JhZ2VzLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgc29tZSBwX3N0b3JhZ2UgaW4gcF9zdG9yYWdlcwoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiBwX3N0b3JhZ2UgPSIsIHBfc3RvcmFnZSkKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiBpX3N0b3JhZ2UgPSIsIGlfc3RvcmFnZSkKCiAgICBwX3N0b3JhZ2UuZHJpdmVyICAgICAgICAgICA9PSBpX3N0b3JhZ2UuZHJpdmVyCiAgICBwX3N0b3JhZ2UuZHJpdmVyX29wdGlvbnMgICA9PSBpX3N0b3JhZ2UuZHJpdmVyX29wdGlvbnMKICAgIHBfc3RvcmFnZS5mc19ncm91cCAgICAgICAgID09IGlfc3RvcmFnZS5mc19ncm91cAogICAgcF9zdG9yYWdlLmZzdHlwZSAgICAgICAgICAgPT0gaV9zdG9yYWdlLmZzdHlwZQoKICAgIGFsbG93X3N0b3JhZ2Vfc291cmNlKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKQogICAgYWxsb3dfc3RvcmFnZV9vcHRpb25zKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKQogICAgYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKQoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiB0cnVlIikKfQoKYWxsb3dfc3RvcmFnZV9zb3VyY2UocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX3NvdXJjZSAxOiBzdGFydCIpCgogICAgcF9zdG9yYWdlLnNvdXJjZSA9PSBpX3N0b3JhZ2Uuc291cmNlCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDE6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX3NvdXJjZShwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDI6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCgogICAgIyBEREREOkJCOkRELkY6IERvbWFpbjpCdXM6RGV2aWNlLkZ1bmN0aW9uCiAgICAjIGh0dHBzOi8vd3d3Lmtlcm5lbC5vcmcvZG9jL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtYnVzLXBjaQogICAgcmVnZXgubWF0Y2goYF5bYS1mMC05XXs0fTpbYS1mMC05XXsyfTpbYS1mMC05XXsyfVwuW2EtZjAtOV0kYCwgaV9zdG9yYWdlLnNvdXJjZSkKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9zb3VyY2UgMjogdHJ1ZSIpCn0KCmFsbG93X3N0b3JhZ2Vfc291cmNlKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKSB7CiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9zb3VyY2UgMzogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIGlfc3RvcmFnZS5zb3VyY2UgPT0gIm5vbmUiCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDM6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX3NvdXJjZShwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDQ6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJzbWIiCgogICAgIyBQYXR0ZXJuOiAvLzxzdG9yYWdlLWFjY291bnQtbmFtZT4uZmlsZS5jb3JlLndpbmRvd3MubmV0LzxrOHMtUFZDLW5hbWU+CiAgICAjIFN0b3JhZ2UgYWNjb3VudCBuYW1lOiBodHRwczovL2xlYXJuLm1pY3Jvc29mdC5jb20vZW4tdXMvYXp1cmUvc3RvcmFnZS9jb21tb24vc3RvcmFnZS1hY2NvdW50LW92ZXJ2aWV3I3N0b3JhZ2UtYWNjb3VudC1uYW1lCiAgICAjIEs4cyBQVkMgbmFtZTogaHR0cHM6Ly9rdWJlcm5ldGVzLmlvL2RvY3MvY29uY2VwdHMvb3ZlcnZpZXcvd29ya2luZy13aXRoLW9iamVjdHMvbmFtZXMvI2Rucy1zdWJkb21haW4tbmFtZXMKICAgIHJlZ2V4Lm1hdGNoKGBeXC9cLyhbYS16MC05XXszLDI0fSlcLmZpbGVcLmNvcmVcLndpbmRvd3NcLm5ldFwvW2EtejAtOV0oW2EtejAtOS4tXXswLDI1MX1bYS16MC05XSk/JGAsIGlfc3RvcmFnZS5zb3VyY2UpCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDQ6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMTogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgIT0gIm92ZXJsYXlmcyIKICAgIHBfc3RvcmFnZS5vcHRpb25zID09IGlfc3RvcmFnZS5vcHRpb25zCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAxOiB0cnVlIikKfQphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIGNvdW50KHBfc3RvcmFnZS5vcHRpb25zKSA9PSAyCgogICAgcG9saWN5X2lkcyA6PSBzcGxpdChwX3N0b3JhZ2Uub3B0aW9uc1swXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBwb2xpY3lfaWRzID0iLCBwb2xpY3lfaWRzKQogICAgcG9saWN5X2lkcyA9PSBsYXllcl9pZHMKCiAgICBwb2xpY3lfaGFzaGVzIDo9IHNwbGl0KHBfc3RvcmFnZS5vcHRpb25zWzFdLCAiOiIpCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IHBvbGljeV9oYXNoZXMgPSIsIHBvbGljeV9oYXNoZXMpCgogICAgcF9jb3VudCA6PSBjb3VudChwb2xpY3lfaWRzKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBwX2NvdW50ID0iLCBwX2NvdW50KQogICAgcF9jb3VudCA+PSAxCiAgICBwX2NvdW50ID09IGNvdW50KHBvbGljeV9oYXNoZXMpCgogICAgaV9jb3VudCA6PSBjb3VudChpX3N0b3JhZ2Uub3B0aW9ucykKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogaV9jb3VudCA9IiwgaV9jb3VudCkKICAgIGlfY291bnQgPT0gcF9jb3VudCArIDMKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zWzBdID0iLCBpX3N0b3JhZ2Uub3B0aW9uc1swXSkKICAgIGlfc3RvcmFnZS5vcHRpb25zWzBdID09ICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQubGF5ZXItc3JjLXByZWZpeD0vdmFyL2xpYi9jb250YWluZXJkL2lvLmNvbnRhaW5lcmQuc25hcHNob3R0ZXIudjEudGFyZGV2L2xheWVycyIKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zW2lfY291bnQgLSAyXSA9IiwgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDJdKQogICAgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDJdID09ICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQub3ZlcmxheS1ydyIKCiAgICBsb3dlcmRpciA6PSBjb25jYXQoIj0iLCBbImxvd2VyZGlyIiwgcF9zdG9yYWdlLm9wdGlvbnNbMF1dKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBsb3dlcmRpciA9IiwgbG93ZXJkaXIpCgogICAgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDFdID09IGxvd2VyZGlyCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zW2lfY291bnQgLSAxXSA9IiwgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDFdKQoKICAgIGV2ZXJ5IGksIHBvbGljeV9pZCBpbiBwb2xpY3lfaWRzIHsKICAgICAgICBhbGxvd19vdmVybGF5X2xheWVyKHBvbGljeV9pZCwgcG9saWN5X2hhc2hlc1tpXSwgaV9zdG9yYWdlLm9wdGlvbnNbaSArIDFdKQogICAgfQoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogdHJ1ZSIpCn0KYWxsb3dfc3RvcmFnZV9vcHRpb25zKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKSB7CiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDM6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCiAgICBjb3VudChwX3N0b3JhZ2Uub3B0aW9ucykgPT0gMQoKICAgIHN0YXJ0c3dpdGgocF9zdG9yYWdlLm9wdGlvbnNbMF0sICIkKGhhc2giKQogICAgaGFzaF9zdWZmaXggOj0gdHJpbV9sZWZ0KHBfc3RvcmFnZS5vcHRpb25zWzBdLCAiJChoYXNoIikKCiAgICBlbmRzd2l0aChoYXNoX3N1ZmZpeCwgIikiKQogICAgaGFzaF9pbmRleCA6PSB0cmltX3JpZ2h0KGhhc2hfc3VmZml4LCAiKSIpCiAgICBpIDo9IHRvX251bWJlcihoYXNoX2luZGV4KQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAzOiBpID0iLCBpKQoKICAgIGhhc2hfb3B0aW9uIDo9IGNvbmNhdCgiPSIsIFsiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LnJvb3QtaGFzaCIsIHJvb3RfaGFzaGVzW2ldXSkKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMzogaGFzaF9vcHRpb24gPSIsIGhhc2hfb3B0aW9uKQoKICAgIGNvdW50KGlfc3RvcmFnZS5vcHRpb25zKSA9PSA0CiAgICBpX3N0b3JhZ2Uub3B0aW9uc1swXSA9PSAicm8iCiAgICBpX3N0b3JhZ2Uub3B0aW9uc1sxXSA9PSAiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmJsb2NrX2RldmljZT1maWxlIgogICAgaV9zdG9yYWdlLm9wdGlvbnNbMl0gPT0gImlvLmthdGFjb250YWluZXJzLmZzLW9wdC5pcy1sYXllciIKICAgIGlfc3RvcmFnZS5vcHRpb25zWzNdID09IGhhc2hfb3B0aW9uCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAzOiB0cnVlIikKfQphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgNDogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gInNtYiIKICAgIHBfb3B0c19jb3VudCA6PSBjb3VudChwX3N0b3JhZ2Uub3B0aW9ucykKICAgIGlfb3B0c19jb3VudCA6PSBjb3VudChpX3N0b3JhZ2Uub3B0aW9ucykKICAgIGlfb3B0c19jb3VudCA9PSBwX29wdHNfY291bnQgKyAyCgogICAgaV9vcHRfbWF0Y2hlcyA6PSBbaSB8IGkgOj0gaWR4OyBpZHggPCBwX29wdHNfY291bnQ7IHBfc3RvcmFnZS5vcHRpb25zW2lkeF0gPT0gaV9zdG9yYWdlLm9wdGlvbnNbaWR4XV0KICAgIGNvdW50KGlfb3B0X21hdGNoZXMpID09IHBfb3B0c19jb3VudAoKICAgIHN0YXJ0c3dpdGgoaV9zdG9yYWdlLm9wdGlvbnNbaV9vcHRzX2NvdW50LTJdLCAiYWRkcj0iKQogICAgY3JlZHMgPSBzcGxpdChpX3N0b3JhZ2Uub3B0aW9uc1tpX29wdHNfY291bnQtMV0sICIsIikKICAgIGNvdW50KGNyZWRzKSA9PSAyCiAgICBzdGFydHN3aXRoKGNyZWRzWzBdLCAidXNlcm5hbWU9IikKICAgIHN0YXJ0c3dpdGgoY3JlZHNbMV0sICJwYXNzd29yZD0iKQogICAgCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDQ6IHRydWUiKQp9CgphbGxvd19vdmVybGF5X2xheWVyKHBvbGljeV9pZCwgcG9saWN5X2hhc2gsIGlfb3B0aW9uKSB7CiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogcG9saWN5X2lkID0iLCBwb2xpY3lfaWQsICJwb2xpY3lfaGFzaCA9IiwgcG9saWN5X2hhc2gpCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogaV9vcHRpb24gPSIsIGlfb3B0aW9uKQoKICAgIHN0YXJ0c3dpdGgoaV9vcHRpb24sICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQubGF5ZXI9IikKICAgIGlfdmFsdWUgOj0gcmVwbGFjZShpX29wdGlvbiwgImlvLmthdGFjb250YWluZXJzLmZzLW9wdC5sYXllcj0iLCAiIikKICAgIGlfdmFsdWVfZGVjb2RlZCA6PSBiYXNlNjQuZGVjb2RlKGlfdmFsdWUpCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogaV92YWx1ZV9kZWNvZGVkID0iLCBpX3ZhbHVlX2RlY29kZWQpCgogICAgcG9saWN5X3N1ZmZpeCA6PSBjb25jYXQoIj0iLCBbInRhcixybyxpby5rYXRhY29udGFpbmVycy5mcy1vcHQuYmxvY2tfZGV2aWNlPWZpbGUsaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmlzLWxheWVyLGlvLmthdGFjb250YWluZXJzLmZzLW9wdC5yb290LWhhc2giLCBwb2xpY3lfaGFzaF0pCiAgICBwX3ZhbHVlIDo9IGNvbmNhdCgiLCIsIFtwb2xpY3lfaWQsIHBvbGljeV9zdWZmaXhdKQogICAgcHJpbnQoImFsbG93X292ZXJsYXlfbGF5ZXI6IHBfdmFsdWUgPSIsIHBfdmFsdWUpCgogICAgcF92YWx1ZSA9PSBpX3ZhbHVlX2RlY29kZWQKCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogdHJ1ZSIpCn0KCmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAidGFyIgoKICAgIHN0YXJ0c3dpdGgocF9zdG9yYWdlLm1vdW50X3BvaW50LCAiJChsYXllciIpCiAgICBtb3VudF9zdWZmaXggOj0gdHJpbV9sZWZ0KHBfc3RvcmFnZS5tb3VudF9wb2ludCwgIiQobGF5ZXIiKQoKICAgIGVuZHN3aXRoKG1vdW50X3N1ZmZpeCwgIikiKQogICAgbGF5ZXJfaW5kZXggOj0gdHJpbV9yaWdodChtb3VudF9zdWZmaXgsICIpIikKICAgIGkgOj0gdG9fbnVtYmVyKGxheWVyX2luZGV4KQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDE6IGkgPSIsIGkpCgogICAgbGF5ZXJfaWQgOj0gbGF5ZXJfaWRzW2ldCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMTogbGF5ZXJfaWQgPSIsIGxheWVyX2lkKQoKICAgIHBfbW91bnQgOj0gY29uY2F0KCIvIiwgWyIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L2xheWVycyIsIGxheWVyX2lkXSkKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCAxOiBwX21vdW50ID0iLCBwX21vdW50KQoKICAgIHBfbW91bnQgPT0gaV9zdG9yYWdlLm1vdW50X3BvaW50CgogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDE6IHRydWUiKQp9CmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAiZnVzZTMua2F0YS1vdmVybGF5IgoKICAgIG1vdW50MSA6PSByZXBsYWNlKHBfc3RvcmFnZS5tb3VudF9wb2ludCwgIiQoY3BhdGgpIiwgcG9saWN5X2RhdGEuY29tbW9uLmNwYXRoKQogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDI6IG1vdW50MiA9IiwgbW91bnQyKQoKICAgIG1vdW50MiA9PSBpX3N0b3JhZ2UubW91bnRfcG9pbnQKCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMjogdHJ1ZSIpCn0KYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKSB7CiAgICBwX3N0b3JhZ2UuZnN0eXBlID09ICJsb2NhbCIKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQyID0iLCBtb3VudDIpCgogICAgbW91bnQzIDo9IHJlcGxhY2UobW91bnQyLCAiJChzYW5kYm94LWlkKSIsIHNhbmRib3hfaWQpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQzID0iLCBtb3VudDMpCgogICAgcmVnZXgubWF0Y2gobW91bnQzLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCgogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDM6IHRydWUiKQp9CmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAiYmluZCIKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNDogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNDogbW91bnQyID0iLCBtb3VudDIpCgogICAgbW91bnQzIDo9IHJlcGxhY2UobW91bnQyLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDQ6IG1vdW50MyA9IiwgbW91bnQzKQoKICAgIHJlZ2V4Lm1hdGNoKG1vdW50MywgaV9zdG9yYWdlLm1vdW50X3BvaW50KQoKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA0OiB0cnVlIikKfQphbGxvd19tb3VudF9wb2ludChwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgYnVuZGxlX2lkLCBzYW5kYm94X2lkLCBsYXllcl9pZHMpIHsKICAgIHBfc3RvcmFnZS5mc3R5cGUgPT0gInRtcGZzIgoKICAgIG1vdW50MSA6PSBwX3N0b3JhZ2UubW91bnRfcG9pbnQKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA1OiBtb3VudDEgPSIsIG1vdW50MSkKCiAgICByZWdleC5tYXRjaChtb3VudDEsIGlfc3RvcmFnZS5tb3VudF9wb2ludCkKCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNTogdHJ1ZSIpCn0KYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKSB7CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogaV9zdG9yYWdlLm1vdW50X3BvaW50ID0iLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCiAgICBhbGxvd19kaXJlY3Rfdm9sX2RyaXZlcihwX3N0b3JhZ2UsIGlfc3RvcmFnZSkKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChzcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQyID0iLCBtb3VudDIpCgogICAgZGlyZWN0X3ZvbF9wYXRoIDo9IGlfc3RvcmFnZS5zb3VyY2UKICAgIG1vdW50MyA6PSByZXBsYWNlKG1vdW50MiwgIiQoYjY0LWRpcmVjdC12b2wtcGF0aCkiLCBiYXNlNjR1cmwuZW5jb2RlKGRpcmVjdF92b2xfcGF0aCkpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQzID0iLCBtb3VudDMpCgogICAgbW91bnQzID09IGlfc3RvcmFnZS5tb3VudF9wb2ludAoKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA2OiB0cnVlIikKfQoKYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIocF9zdG9yYWdlLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19kaXJlY3Rfdm9sX2RyaXZlciAxOiBzdGFydCIpCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCiAgICBwcmludCgiYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIgMTogdHJ1ZSIpCn0KYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIocF9zdG9yYWdlLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19kaXJlY3Rfdm9sX2RyaXZlciAyOiBzdGFydCIpCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJzbWIiCiAgICBwcmludCgiYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIgMjogdHJ1ZSIpCn0KCiMgRXhlY1Byb2Nlc3NSZXF1ZXN0LnByb2Nlc3MuQ2FwYWJpbGl0aWVzCmFsbG93X2V4ZWNfY2FwcyhpX2NhcHMpIHsKICAgIG5vdCBpX2NhcHMuQW1iaWVudAogICAgbm90IGlfY2Fwcy5Cb3VuZGluZwogICAgbm90IGlfY2Fwcy5FZmZlY3RpdmUKICAgIG5vdCBpX2NhcHMuSW5oZXJpdGFibGUKICAgIG5vdCBpX2NhcHMuUGVybWl0dGVkCn0KCiMgT0NJLlByb2Nlc3MuQ2FwYWJpbGl0aWVzCmFsbG93X2NhcHMocF9jYXBzLCBpX2NhcHMpIHsKICAgIHByaW50KCJhbGxvd19jYXBzOiBwb2xpY3kgQW1iaWVudCA9IiwgcF9jYXBzLkFtYmllbnQpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgQW1iaWVudCA9IiwgaV9jYXBzLkFtYmllbnQpCiAgICBtYXRjaF9jYXBzKHBfY2Fwcy5BbWJpZW50LCBpX2NhcHMuQW1iaWVudCkKCiAgICBwcmludCgiYWxsb3dfY2FwczogcG9saWN5IEJvdW5kaW5nID0iLCBwX2NhcHMuQm91bmRpbmcpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgQm91bmRpbmcgPSIsIGlfY2Fwcy5Cb3VuZGluZykKICAgIG1hdGNoX2NhcHMocF9jYXBzLkJvdW5kaW5nLCBpX2NhcHMuQm91bmRpbmcpCgogICAgcHJpbnQoImFsbG93X2NhcHM6IHBvbGljeSBFZmZlY3RpdmUgPSIsIHBfY2Fwcy5FZmZlY3RpdmUpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgRWZmZWN0aXZlID0iLCBpX2NhcHMuRWZmZWN0aXZlKQogICAgbWF0Y2hfY2FwcyhwX2NhcHMuRWZmZWN0aXZlLCBpX2NhcHMuRWZmZWN0aXZlKQoKICAgIHByaW50KCJhbGxvd19jYXBzOiBwb2xpY3kgSW5oZXJpdGFibGUgPSIsIHBfY2Fwcy5Jbmhlcml0YWJsZSkKICAgIHByaW50KCJhbGxvd19jYXBzOiBpbnB1dCBJbmhlcml0YWJsZSA9IiwgaV9jYXBzLkluaGVyaXRhYmxlKQogICAgbWF0Y2hfY2FwcyhwX2NhcHMuSW5oZXJpdGFibGUsIGlfY2Fwcy5Jbmhlcml0YWJsZSkKCiAgICBwcmludCgiYWxsb3dfY2FwczogcG9saWN5IFBlcm1pdHRlZCA9IiwgcF9jYXBzLlBlcm1pdHRlZCkKICAgIHByaW50KCJhbGxvd19jYXBzOiBpbnB1dCBQZXJtaXR0ZWQgPSIsIGlfY2Fwcy5QZXJtaXR0ZWQpCiAgICBtYXRjaF9jYXBzKHBfY2Fwcy5QZXJtaXR0ZWQsIGlfY2Fwcy5QZXJtaXR0ZWQpCn0KCm1hdGNoX2NhcHMocF9jYXBzLCBpX2NhcHMpIHsKICAgIHByaW50KCJtYXRjaF9jYXBzIDE6IHN0YXJ0IikKCiAgICBwX2NhcHMgPT0gaV9jYXBzCgogICAgcHJpbnQoIm1hdGNoX2NhcHMgMTogdHJ1ZSIpCn0KbWF0Y2hfY2FwcyhwX2NhcHMsIGlfY2FwcykgewogICAgcHJpbnQoIm1hdGNoX2NhcHMgMjogc3RhcnQiKQoKICAgIGNvdW50KHBfY2FwcykgPT0gMQogICAgcF9jYXBzWzBdID09ICIkKGRlZmF1bHRfY2FwcykiCgogICAgcHJpbnQoIm1hdGNoX2NhcHMgMjogZGVmYXVsdF9jYXBzID0iLCBwb2xpY3lfZGF0YS5jb21tb24uZGVmYXVsdF9jYXBzKQogICAgcG9saWN5X2RhdGEuY29tbW9uLmRlZmF1bHRfY2FwcyA9PSBpX2NhcHMKCiAgICBwcmludCgibWF0Y2hfY2FwcyAyOiB0cnVlIikKfQptYXRjaF9jYXBzKHBfY2FwcywgaV9jYXBzKSB7CiAgICBwcmludCgibWF0Y2hfY2FwcyAzOiBzdGFydCIpCgogICAgY291bnQocF9jYXBzKSA9PSAxCiAgICBwX2NhcHNbMF0gPT0gIiQocHJpdmlsZWdlZF9jYXBzKSIKCiAgICBwcmludCgibWF0Y2hfY2FwcyAzOiBwcml2aWxlZ2VkX2NhcHMgPSIsIHBvbGljeV9kYXRhLmNvbW1vbi5wcml2aWxlZ2VkX2NhcHMpCiAgICBwb2xpY3lfZGF0YS5jb21tb24ucHJpdmlsZWdlZF9jYXBzID09IGlfY2FwcwoKICAgIHByaW50KCJtYXRjaF9jYXBzIDM6IHRydWUiKQp9CgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgpjaGVja19kaXJlY3RvcnlfdHJhdmVyc2FsKGlfcGF0aCkgewogICAgbm90IHJlZ2V4Lm1hdGNoKCIoXnwvKS4uKCR8LykiLCBpX3BhdGgpCn0KCmNoZWNrX3N5bWxpbmtfc291cmNlKGlfc3JjKSB7CiAgICBpX3NyYyA9PSAiIgogICAgcHJpbnQoImNoZWNrX3N5bWxpbmtfc291cmNlIDE6IHRydWUiKQp9CmNoZWNrX3N5bWxpbmtfc291cmNlKGlfc3JjKSB7CiAgICBpX3NyYyAhPSAiIgogICAgcHJpbnQoImNoZWNrX3N5bWxpbmtfc291cmNlIDI6IGlfc3JjID0iLCBpX3NyYykKCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24uc19zb3VyY2UxLCBpX3NyYykKCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMjogdHJ1ZSIpCn0KY2hlY2tfc3ltbGlua19zb3VyY2UoaV9zcmMpIHsKICAgIGlfc3JjICE9ICIiCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMzogaV9zcmMgPSIsIGlfc3JjKQoKICAgIHJlZ2V4Lm1hdGNoKHBvbGljeV9kYXRhLmNvbW1vbi5zX3NvdXJjZTIsIGlfc3JjKQogICAgY2hlY2tfZGlyZWN0b3J5X3RyYXZlcnNhbChpX3NyYykKCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMzogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfc3RvcmFnZXMoaV9zdG9yYWdlcykgewogICAgcHJpbnQoImFsbG93X3NhbmRib3hfc3RvcmFnZXM6IGlfc3RvcmFnZXMgPSIsIGlfc3RvcmFnZXMpCgogICAgcF9zdG9yYWdlcyA6PSBwb2xpY3lfZGF0YS5zYW5kYm94LnN0b3JhZ2VzCiAgICBldmVyeSBpX3N0b3JhZ2UgaW4gaV9zdG9yYWdlcyB7CiAgICAgICAgYWxsb3dfc2FuZGJveF9zdG9yYWdlKHBfc3RvcmFnZXMsIGlfc3RvcmFnZSkKICAgIH0KCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9zdG9yYWdlczogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfc3RvcmFnZShwX3N0b3JhZ2VzLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IGlfc3RvcmFnZSA9IiwgaV9zdG9yYWdlKQoKICAgIHNvbWUgcF9zdG9yYWdlIGluIHBfc3RvcmFnZXMKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IHBfc3RvcmFnZSA9IiwgcF9zdG9yYWdlKQogICAgaV9zdG9yYWdlID09IHBfc3RvcmFnZQoKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IHRydWUiKQp9CgpDb3B5RmlsZVJlcXVlc3QgewogICAgcHJpbnQoIkNvcHlGaWxlUmVxdWVzdDogaW5wdXQucGF0aCA9IiwgaW5wdXQucGF0aCkKCiAgICBjaGVja19zeW1saW5rX3NvdXJjZShpbnB1dC5zeW1saW5rX3NyYykKICAgIGNoZWNrX2RpcmVjdG9yeV90cmF2ZXJzYWwoaW5wdXQucGF0aCkKCiAgICBzb21lIHJlZ2V4MSBpbiBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLkNvcHlGaWxlUmVxdWVzdAogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5jcGF0aCkKICAgIHJlZ2V4NCA6PSByZXBsYWNlKHJlZ2V4MywgIiQoYnVuZGxlLWlkKSIsIEJVTkRMRV9JRCkKICAgIHByaW50KCJDb3B5RmlsZVJlcXVlc3Q6IHJlZ2V4NCA9IiwgcmVnZXg0KQoKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4NCwgaW5wdXQucGF0aCkKCiAgICBwcmludCgiQ29weUZpbGVSZXF1ZXN0OiB0cnVlIikKfQoKQ3JlYXRlU2FuZGJveFJlcXVlc3QgewogICAgcHJpbnQoIkNyZWF0ZVNhbmRib3hSZXF1ZXN0OiBpbnB1dC5ndWVzdF9ob29rX3BhdGggPSIsIGlucHV0Lmd1ZXN0X2hvb2tfcGF0aCkKICAgIGNvdW50KGlucHV0Lmd1ZXN0X2hvb2tfcGF0aCkgPT0gMAoKICAgIHByaW50KCJDcmVhdGVTYW5kYm94UmVxdWVzdDogaW5wdXQua2VybmVsX21vZHVsZXMgPSIsIGlucHV0Lmtlcm5lbF9tb2R1bGVzKQogICAgY291bnQoaW5wdXQua2VybmVsX21vZHVsZXMpID09IDAKCiAgICBpX3BpZG5zIDo9IGlucHV0LnNhbmRib3hfcGlkbnMKICAgIHByaW50KCJDcmVhdGVTYW5kYm94UmVxdWVzdDogaV9waWRucyA9IiwgaV9waWRucykKICAgIGlfcGlkbnMgPT0gZmFsc2UKICAgIGFsbG93X3NhbmRib3hfc3RvcmFnZXMoaW5wdXQuc3RvcmFnZXMpCn0KCmFsbG93X2V4ZWMocF9jb250YWluZXIsIGlfcHJvY2VzcykgewogICAgcHJpbnQoImFsbG93X2V4ZWM6IHN0YXJ0IikKCiAgICBwX29jaSA9IHBfY29udGFpbmVyLk9DSQogICAgcF9zX25hbWUgPSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc19uYW1lc3BhY2UgPSBnZXRfc3RhdGVfdmFsKCJuYW1lc3BhY2UiKQogICAgYWxsb3dfcHJvYmVfcHJvY2VzcyhwX29jaS5Qcm9jZXNzLCBpX3Byb2Nlc3MsIHBfc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfZXhlYzogdHJ1ZSIpCn0KCmFsbG93X2ludGVyYWN0aXZlX2V4ZWMocF9jb250YWluZXIsIGlfcHJvY2VzcykgewogICAgcHJpbnQoImFsbG93X2ludGVyYWN0aXZlX2V4ZWM6IHN0YXJ0IikKCiAgICBwX29jaSA9IHBfY29udGFpbmVyLk9DSQogICAgcF9zX25hbWUgPSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc19uYW1lc3BhY2UgPSBnZXRfc3RhdGVfdmFsKCJuYW1lc3BhY2UiKQogICAgYWxsb3dfaW50ZXJhY3RpdmVfcHJvY2VzcyhwX29jaS5Qcm9jZXNzLCBpX3Byb2Nlc3MsIHBfc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfaW50ZXJhY3RpdmVfZXhlYzogdHJ1ZSIpCn0KCiMgVE9ETzogc2hvdWxkIG90aGVyIEV4ZWNQcm9jZXNzUmVxdWVzdCBpbnB1dCBkYXRhIGZpZWxkcyBiZSB2YWxpZGF0ZWQgYXMgd2VsbD8KRXhlY1Byb2Nlc3NSZXF1ZXN0IHsKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMTogaW5wdXQgPSIsIGlucHV0KQoKICAgIHNvbWUgcF9jb21tYW5kIGluIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuRXhlY1Byb2Nlc3NSZXF1ZXN0LmFsbG93ZWRfY29tbWFuZHMKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMTogcF9jb21tYW5kID0iLCBwX2NvbW1hbmQpCiAgICBwX2NvbW1hbmQgPT0gaW5wdXQucHJvY2Vzcy5BcmdzCgogICAgIyBUT0RPOiBtYXRjaCBwX2NvbnRhaW5lcidzIElEIHdpdGggdGhlIGlucHV0IGNvbnRhaW5lcl9pZC4KICAgIHNvbWUgcF9jb250YWluZXIgaW4gcG9saWN5X2RhdGEuY29udGFpbmVycwogICAgYWxsb3dfaW50ZXJhY3RpdmVfZXhlYyhwX2NvbnRhaW5lciwgaW5wdXQucHJvY2VzcykKCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDE6IHRydWUiKQp9CkV4ZWNQcm9jZXNzUmVxdWVzdCB7CiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDI6IGlucHV0ID0iLCBpbnB1dCkKCiAgICAjIFRPRE86IG1hdGNoIGlucHV0IGNvbnRhaW5lciBJRCB3aXRoIGl0cyBjb3JyZXNwb25kaW5nIGNvbnRhaW5lci5leGVjX2NvbW1hbmRzLgogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBzb21lIHBfY29tbWFuZCBpbiBwX2NvbnRhaW5lci5leGVjX2NvbW1hbmRzCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDI6IHBfY29tbWFuZCA9IiwgcF9jb21tYW5kKQoKICAgICMgVE9ETzogc2hvdWxkIG90aGVyIGlucHV0IGRhdGEgZmllbGRzIGJlIHZhbGlkYXRlZCBhcyB3ZWxsPwogICAgcF9jb21tYW5kID09IGlucHV0LnByb2Nlc3MuQXJncwoKICAgIGFsbG93X2V4ZWMocF9jb250YWluZXIsIGlucHV0LnByb2Nlc3MpCgogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAyOiB0cnVlIikKfQpFeGVjUHJvY2Vzc1JlcXVlc3QgewogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAzOiBpbnB1dCA9IiwgaW5wdXQpCgogICAgaV9jb21tYW5kID0gY29uY2F0KCIgIiwgaW5wdXQucHJvY2Vzcy5BcmdzKQogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAzOiBpX2NvbW1hbmQgPSIsIGlfY29tbWFuZCkKCiAgICBzb21lIHBfcmVnZXggaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5FeGVjUHJvY2Vzc1JlcXVlc3QucmVnZXgKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMzogcF9yZWdleCA9IiwgcF9yZWdleCkKCiAgICByZWdleC5tYXRjaChwX3JlZ2V4LCBpX2NvbW1hbmQpCgogICAgIyBUT0RPOiBtYXRjaCBwX2NvbnRhaW5lcidzIElEIHdpdGggdGhlIGlucHV0IGNvbnRhaW5lcl9pZC4KICAgIHNvbWUgcF9jb250YWluZXIgaW4gcG9saWN5X2RhdGEuY29udGFpbmVycwogICAgYWxsb3dfaW50ZXJhY3RpdmVfZXhlYyhwX2NvbnRhaW5lciwgaW5wdXQucHJvY2VzcykKCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDM6IHRydWUiKQp9CgpVcGRhdGVSb3V0ZXNSZXF1ZXN0IHsKICAgIHByaW50KCJVcGRhdGVSb3V0ZXNSZXF1ZXN0OiBpbnB1dCA9IiwgaW5wdXQpCiAgICBwcmludCgiVXBkYXRlUm91dGVzUmVxdWVzdDogcG9saWN5ID0iLCBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLlVwZGF0ZVJvdXRlc1JlcXVlc3QpCgogICAgaV9yb3V0ZXMgOj0gaW5wdXQucm91dGVzLlJvdXRlcwogICAgcF9zb3VyY2VfcmVnZXggPSBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLlVwZGF0ZVJvdXRlc1JlcXVlc3QuZm9yYmlkZGVuX3NvdXJjZV9yZWdleAogICAgcF9uYW1lcyA9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuVXBkYXRlUm91dGVzUmVxdWVzdC5mb3JiaWRkZW5fZGV2aWNlX25hbWVzCgogICAgZXZlcnkgaV9yb3V0ZSBpbiBpX3JvdXRlcyB7CiAgICAgICAgcHJpbnQoImlfcm91dGUuc291cmNlID0iLCBpX3JvdXRlLnNvdXJjZSkKICAgICAgICBldmVyeSBwX3JlZ2V4IGluIHBfc291cmNlX3JlZ2V4IHsKICAgICAgICAgICAgcHJpbnQoInBfcmVnZXggPSIsIHBfcmVnZXgpCiAgICAgICAgICAgIG5vdCByZWdleC5tYXRjaChwX3JlZ2V4LCBpX3JvdXRlLnNvdXJjZSkKICAgICAgICB9CgogICAgICAgIHByaW50KCJpX3JvdXRlLmRldmljZSA9IiwgaV9yb3V0ZS5kZXZpY2UpCiAgICAgICAgbm90IGlfcm91dGUuZGV2aWNlIGluIHBfbmFtZXMKICAgIH0KCiAgICBwcmludCgiVXBkYXRlUm91dGVzUmVxdWVzdDogdHJ1ZSIpCn0KClVwZGF0ZUludGVyZmFjZVJlcXVlc3QgewogICAgcHJpbnQoIlVwZGF0ZUludGVyZmFjZVJlcXVlc3Q6IGlucHV0ID0iLCBpbnB1dCkKICAgIHByaW50KCJVcGRhdGVJbnRlcmZhY2VSZXF1ZXN0OiBwb2xpY3kgPSIsIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuVXBkYXRlSW50ZXJmYWNlUmVxdWVzdCkKCiAgICBpX2ludGVyZmFjZSA6PSBpbnB1dC5pbnRlcmZhY2UKICAgIHBfZmxhZ3MgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmFsbG93X3Jhd19mbGFncwoKICAgICMgVHlwaWNhbGx5LCBqdXN0IElGRl9OT0FSUCBpcyB1c2VkLgogICAgYml0cy5hbmQoaV9pbnRlcmZhY2UucmF3X2ZsYWdzLCBiaXRzLm5lZ2F0ZShwX2ZsYWdzKSkgPT0gMAoKICAgIHBfbmFtZXMgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmZvcmJpZGRlbl9uYW1lcwoKICAgIG5vdCBpX2ludGVyZmFjZS5uYW1lIGluIHBfbmFtZXMKCiAgICBwX2h3YWRkcnMgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmZvcmJpZGRlbl9od19hZGRycwoKICAgIG5vdCBpX2ludGVyZmFjZS5od0FkZHIgaW4gcF9od2FkZHJzCgogICAgcHJpbnQoIlVwZGF0ZUludGVyZmFjZVJlcXVlc3Q6IHRydWUiKQp9CgpDbG9zZVN0ZGluUmVxdWVzdCB7CiAgICBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLkNsb3NlU3RkaW5SZXF1ZXN0ID09IHRydWUKfQoKUmVhZFN0cmVhbVJlcXVlc3QgewogICAgcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5SZWFkU3RyZWFtUmVxdWVzdCA9PSB0cnVlCn0KClVwZGF0ZUVwaGVtZXJhbE1vdW50c1JlcXVlc3QgewogICAgcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVFcGhlbWVyYWxNb3VudHNSZXF1ZXN0ID09IHRydWUKfQoKV3JpdGVTdHJlYW1SZXF1ZXN0IHsKICAgIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuV3JpdGVTdHJlYW1SZXF1ZXN0ID09IHRydWUKfQoKcG9saWN5X2RhdGEgOj0gewogICJjb250YWluZXJzIjogWwogICAgewogICAgICAiT0NJIjogewogICAgICAgICJWZXJzaW9uIjogIjEuMS4wLXJjLjEiLAogICAgICAgICJQcm9jZXNzIjogewogICAgICAgICAgIlRlcm1pbmFsIjogZmFsc2UsCiAgICAgICAgICAiVXNlciI6IHsKICAgICAgICAgICAgIlVJRCI6IDEwMDAsCiAgICAgICAgICAgICJHSUQiOiA2NTUzNSwKICAgICAgICAgICAgIkFkZGl0aW9uYWxHaWRzIjogW10sCiAgICAgICAgICAgICJVc2VybmFtZSI6ICIiCiAgICAgICAgICB9LAogICAgICAgICAgIkRlcHJlY2F0ZWRBcmdzIjogWwogICAgICAgICAgICAiL3BhdXNlIgogICAgICAgICAgXSwKICAgICAgICAgICJBcmdzIjogWwogICAgICAgICAgICAiL3BhdXNlIgogICAgICAgICAgXSwKICAgICAgICAgICJFbnYiOiBbCiAgICAgICAgICAgICJQQVRIPS91c3IvbG9jYWwvc2JpbjovdXNyL2xvY2FsL2JpbjovdXNyL3NiaW46L3Vzci9iaW46L3NiaW46L2JpbiIKICAgICAgICAgIF0sCiAgICAgICAgICAiQ3dkIjogIi8iLAogICAgICAgICAgIkNhcGFiaWxpdGllcyI6IHsKICAgICAgICAgICAgIkFtYmllbnQiOiBbXSwKICAgICAgICAgICAgIkJvdW5kaW5nIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJFZmZlY3RpdmUiOiBbCiAgICAgICAgICAgICAgIiQoZGVmYXVsdF9jYXBzKSIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgIkluaGVyaXRhYmxlIjogW10sCiAgICAgICAgICAgICJQZXJtaXR0ZWQiOiBbCiAgICAgICAgICAgICAgIiQoZGVmYXVsdF9jYXBzKSIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgICJOb05ld1ByaXZpbGVnZXMiOiB0cnVlCiAgICAgICAgfSwKICAgICAgICAiUm9vdCI6IHsKICAgICAgICAgICJQYXRoIjogIiQoY3BhdGgpLyQoYnVuZGxlLWlkKSIsCiAgICAgICAgICAiUmVhZG9ubHkiOiB0cnVlCiAgICAgICAgfSwKICAgICAgICAiTW91bnRzIjogWwogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL3Byb2MiLAogICAgICAgICAgICAic291cmNlIjogInByb2MiLAogICAgICAgICAgICAidHlwZV8iOiAicHJvYyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYiLAogICAgICAgICAgICAic291cmNlIjogInRtcGZzIiwKICAgICAgICAgICAgInR5cGVfIjogInRtcGZzIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgInN0cmljdGF0aW1lIiwKICAgICAgICAgICAgICAibW9kZT03NTUiLAogICAgICAgICAgICAgICJzaXplPTY1NTM2ayIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvcHRzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJkZXZwdHMiLAogICAgICAgICAgICAidHlwZV8iOiAiZGV2cHRzIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAgICAgIm5ld2luc3RhbmNlIiwKICAgICAgICAgICAgICAicHRteG1vZGU9MDY2NiIsCiAgICAgICAgICAgICAgIm1vZGU9MDYyMCIsCiAgICAgICAgICAgICAgImdpZD01IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi9zaG0iLAogICAgICAgICAgICAic291cmNlIjogIi9ydW4va2F0YS1jb250YWluZXJzL3NhbmRib3gvc2htIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L21xdWV1ZSIsCiAgICAgICAgICAgICJzb3VyY2UiOiAibXF1ZXVlIiwKICAgICAgICAgICAgInR5cGVfIjogIm1xdWV1ZSIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9zeXMiLAogICAgICAgICAgICAic291cmNlIjogInN5c2ZzIiwKICAgICAgICAgICAgInR5cGVfIjogInN5c2ZzIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAgICAgIm5vZGV2IiwKICAgICAgICAgICAgICAicm8iCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZXRjL3Jlc29sdi5jb25mIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KXJlc29sdi5jb25mJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicm8iLAogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2RldiIsCiAgICAgICAgICAgICAgIm5vZXhlYyIKICAgICAgICAgICAgXQogICAgICAgICAgfQogICAgICAgIF0sCiAgICAgICAgIkFubm90YXRpb25zIjogewogICAgICAgICAgImlvLmthdGFjb250YWluZXJzLnBrZy5vY2kuYnVuZGxlX3BhdGgiOiAiL3J1bi9jb250YWluZXJkL2lvLmNvbnRhaW5lcmQucnVudGltZS52Mi50YXNrL2s4cy5pby8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgImlvLmthdGFjb250YWluZXJzLnBrZy5vY2kuY29udGFpbmVyX3R5cGUiOiAicG9kX3NhbmRib3giLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLmNvbnRhaW5lci10eXBlIjogInNhbmRib3giLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtaWQiOiAiXlthLXowLTldezY0fSQiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbG9nLWRpcmVjdG9yeSI6ICJeL3Zhci9sb2cvcG9kcy8kKHNhbmRib3gtbmFtZXNwYWNlKV8kKHNhbmRib3gtbmFtZSlfWzAtOWEtZl17OH0tWzAtOWEtZl17NH0tWzAtOWEtZl17NH0tWzAtOWEtZl17NH0tWzAtOWEtZl17MTJ9JCIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1uYW1lIjogIl5vbmVcXC1jb250YWluZXIkIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LW5hbWVzcGFjZSI6ICIiLAogICAgICAgICAgIm5lcmRjdGwvbmV0d29yay1uYW1lc3BhY2UiOiAiXi92YXIvcnVuL25ldG5zL2NuaS1bMC05YS1mXXs4fS1bMC05YS1mXXs0fS1bMC05YS1mXXs0fS1bMC05YS1mXXs0fS1bMC05YS1mXXsxMn0kIgogICAgICAgIH0sCiAgICAgICAgIkxpbnV4IjogewogICAgICAgICAgIk5hbWVzcGFjZXMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiVHlwZSI6ICJpcGMiLAogICAgICAgICAgICAgICJQYXRoIjogIiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJUeXBlIjogInV0cyIsCiAgICAgICAgICAgICAgIlBhdGgiOiAiIgogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgIlR5cGUiOiAibW91bnQiLAogICAgICAgICAgICAgICJQYXRoIjogIiIKICAgICAgICAgICAgfQogICAgICAgICAgXSwKICAgICAgICAgICJNYXNrZWRQYXRocyI6IFsKICAgICAgICAgICAgIi9wcm9jL2FjcGkiLAogICAgICAgICAgICAiL3Byb2MvYXNvdW5kIiwKICAgICAgICAgICAgIi9wcm9jL2tjb3JlIiwKICAgICAgICAgICAgIi9wcm9jL2tleXMiLAogICAgICAgICAgICAiL3Byb2MvbGF0ZW5jeV9zdGF0cyIsCiAgICAgICAgICAgICIvcHJvYy90aW1lcl9saXN0IiwKICAgICAgICAgICAgIi9wcm9jL3RpbWVyX3N0YXRzIiwKICAgICAgICAgICAgIi9wcm9jL3NjaGVkX2RlYnVnIiwKICAgICAgICAgICAgIi9zeXMvZmlybXdhcmUiLAogICAgICAgICAgICAiL3Byb2Mvc2NzaSIKICAgICAgICAgIF0sCiAgICAgICAgICAiUmVhZG9ubHlQYXRocyI6IFsKICAgICAgICAgICAgIi9wcm9jL2J1cyIsCiAgICAgICAgICAgICIvcHJvYy9mcyIsCiAgICAgICAgICAgICIvcHJvYy9pcnEiLAogICAgICAgICAgICAiL3Byb2Mvc3lzIiwKICAgICAgICAgICAgIi9wcm9jL3N5c3JxLXRyaWdnZXIiCiAgICAgICAgICBdLAogICAgICAgICAgIkRldmljZXMiOiBbXSwKICAgICAgICAgICJTeXNjdGwiOiB7CiAgICAgICAgICAgICJuZXQuaXB2NC5pcF91bnByaXZpbGVnZWRfcG9ydF9zdGFydCI6ICIwIiwKICAgICAgICAgICAgIm5ldC5pcHY0LnBpbmdfZ3JvdXBfcmFuZ2UiOiAiMCAyMTQ3NDgzNjQ3IgogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSwKICAgICAgInN0b3JhZ2VzIjogWwogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2gwKSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjApIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAib3ZlcmxheWZzIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJmdXNlMy5rYXRhLW92ZXJsYXkiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICI1YTVhYWQ4MDA1NWZmMjAwMTJhNTBkYzI1ZjhkZjdhMjk5MjQ0NzQzMjRkNjVmN2Q1MzA2ZWU4ZWUyN2ZmNzFkIiwKICAgICAgICAgICAgIjgxNzI1MGYxYTNlMzM2ZGE3NmY1YmQzZmE3ODRlMWIyNmQ5NTliOWMxMzE4NzY4MTViYTI2MDQwNDhiNzBjMTgiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQoY3BhdGgpLyQoYnVuZGxlLWlkKSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfQogICAgICBdLAogICAgICAiZGV2aWNlcyI6IFtdLAogICAgICAic2FuZGJveF9waWRucyI6IGZhbHNlLAogICAgICAiZXhlY19jb21tYW5kcyI6IFtdLAogICAgICAiZW52X21hcCI6IHsKICAgICAgICAiUEFUSCI6ICIvdXNyL2xvY2FsL3NiaW46L3Vzci9sb2NhbC9iaW46L3Vzci9zYmluOi91c3IvYmluOi9zYmluOi9iaW4iCiAgICAgIH0KICAgIH0sCiAgICB7CiAgICAgICJPQ0kiOiB7CiAgICAgICAgIlZlcnNpb24iOiAiMS4xLjAtcmMuMSIsCiAgICAgICAgIlByb2Nlc3MiOiB7CiAgICAgICAgICAiVGVybWluYWwiOiBmYWxzZSwKICAgICAgICAgICJVc2VyIjogewogICAgICAgICAgICAiVUlEIjogMTAwMSwKICAgICAgICAgICAgIkdJRCI6IDAsCiAgICAgICAgICAgICJBZGRpdGlvbmFsR2lkcyI6IFtdLAogICAgICAgICAgICAiVXNlcm5hbWUiOiAiIgogICAgICAgICAgfSwKICAgICAgICAgICJEZXByZWNhdGVkQXJncyI6IFsKICAgICAgICAgICAgIi9iaW4vc2giLAogICAgICAgICAgICAiLWMiLAogICAgICAgICAgICAid2hpbGUgdHJ1ZTsgZG8gZWNobyAkKHNhbmRib3gtbmFtZSk7IHNsZWVwIDEwOyBkb25lIgogICAgICAgICAgXSwKICAgICAgICAgICJBcmdzIjogWwogICAgICAgICAgICAiL2Jpbi9zaCIsCiAgICAgICAgICAgICItYyIsCiAgICAgICAgICAgICJ3aGlsZSB0cnVlOyBkbyBlY2hvICQoUE9EX05BTUUpOyBzbGVlcCAxMDsgZG9uZSIKICAgICAgICAgIF0sCiAgICAgICAgICAiRW52IjogWwogICAgICAgICAgICAiUEFUSD0vdXNyL2xvY2FsL3NiaW46L3Vzci9sb2NhbC9iaW46L3Vzci9zYmluOi91c3IvYmluOi9zYmluOi9iaW4iLAogICAgICAgICAgICAiSE9TVE5BTUU9JChob3N0LW5hbWUpIiwKICAgICAgICAgICAgIlBPRF9OQU1FPSQoc2FuZGJveC1uYW1lKSIsCiAgICAgICAgICAgICJQT0RfTkFNRVNQQUNFPSQoc2FuZGJveC1uYW1lc3BhY2UpIiwKICAgICAgICAgICAgIlBPRF9JUD0kKHBvZC1pcCkiLAogICAgICAgICAgICAiU0VSVklDRV9BQ0NPVU5UPWRlZmF1bHQiLAogICAgICAgICAgICAiUFJPWFlfQ09ORklHPXt9XG4iLAogICAgICAgICAgICAiSVNUSU9fTUVUQV9QT0RfUE9SVFM9W1xuXSIsCiAgICAgICAgICAgICJJU1RJT19NRVRBX0FQUF9DT05UQUlORVJTPXNlcnZpY2VhY2xpZW50IiwKICAgICAgICAgICAgIklTVElPX01FVEFfQ0xVU1RFUl9JRD1LdWJlcm5ldGVzIiwKICAgICAgICAgICAgIklTVElPX01FVEFfTk9ERV9OQU1FPSQobm9kZS1uYW1lKSIKICAgICAgICAgIF0sCiAgICAgICAgICAiQ3dkIjogIi8iLAogICAgICAgICAgIkNhcGFiaWxpdGllcyI6IHsKICAgICAgICAgICAgIkFtYmllbnQiOiBbXSwKICAgICAgICAgICAgIkJvdW5kaW5nIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJFZmZlY3RpdmUiOiBbCiAgICAgICAgICAgICAgIiQoZGVmYXVsdF9jYXBzKSIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgIkluaGVyaXRhYmxlIjogW10sCiAgICAgICAgICAgICJQZXJtaXR0ZWQiOiBbCiAgICAgICAgICAgICAgIiQoZGVmYXVsdF9jYXBzKSIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgICJOb05ld1ByaXZpbGVnZXMiOiBmYWxzZQogICAgICAgIH0sCiAgICAgICAgIlJvb3QiOiB7CiAgICAgICAgICAiUGF0aCI6ICIkKGNwYXRoKS8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgIlJlYWRvbmx5IjogZmFsc2UKICAgICAgICB9LAogICAgICAgICJNb3VudHMiOiBbCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvcHJvYyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAicHJvYyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJwcm9jIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAgICAgIm5vZGV2IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2RldiIsCiAgICAgICAgICAgICJzb3VyY2UiOiAidG1wZnMiLAogICAgICAgICAgICAidHlwZV8iOiAidG1wZnMiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAic3RyaWN0YXRpbWUiLAogICAgICAgICAgICAgICJtb2RlPTc1NSIsCiAgICAgICAgICAgICAgInNpemU9NjU1MzZrIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi9wdHMiLAogICAgICAgICAgICAic291cmNlIjogImRldnB0cyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJkZXZwdHMiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibmV3aW5zdGFuY2UiLAogICAgICAgICAgICAgICJwdG14bW9kZT0wNjY2IiwKICAgICAgICAgICAgICAibW9kZT0wNjIwIiwKICAgICAgICAgICAgICAiZ2lkPTUiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L3NobSIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiL3J1bi9rYXRhLWNvbnRhaW5lcnMvc2FuZGJveC9zaG0iLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvbXF1ZXVlIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJtcXVldWUiLAogICAgICAgICAgICAidHlwZV8iOiAibXF1ZXVlIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAgICAgIm5vZGV2IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL3N5cyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAic3lzZnMiLAogICAgICAgICAgICAidHlwZV8iOiAic3lzZnMiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiLAogICAgICAgICAgICAgICJybyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9zeXMvZnMvY2dyb3VwIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJjZ3JvdXAiLAogICAgICAgICAgICAidHlwZV8iOiAiY2dyb3VwIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAgICAgIm5vZGV2IiwKICAgICAgICAgICAgICAicmVsYXRpbWUiLAogICAgICAgICAgICAgICJybyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9ldGMvaG9zdHMiLAogICAgICAgICAgICAic291cmNlIjogIiQoc2ZwcmVmaXgpaG9zdHMkIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJ3IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi90ZXJtaW5hdGlvbi1sb2ciLAogICAgICAgICAgICAic291cmNlIjogIiQoc2ZwcmVmaXgpdGVybWluYXRpb24tbG9nJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJydyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9ldGMvaG9zdG5hbWUiLAogICAgICAgICAgICAic291cmNlIjogIiQoc2ZwcmVmaXgpaG9zdG5hbWUkIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJ3IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2V0Yy9yZXNvbHYuY29uZiIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClyZXNvbHYuY29uZiQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicnciCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvdmFyL3J1bi9zZWNyZXRzL2t1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQiLAogICAgICAgICAgICAic291cmNlIjogIiQoc2ZwcmVmaXgpc2VydmljZWFjY291bnQkIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL3Zhci9ydW4vc2VjcmV0cy9henVyZS90b2tlbnMiLAogICAgICAgICAgICAic291cmNlIjogIiQoc2ZwcmVmaXgpdG9rZW5zJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJybyIKICAgICAgICAgICAgXQogICAgICAgICAgfQogICAgICAgIF0sCiAgICAgICAgIkFubm90YXRpb25zIjogewogICAgICAgICAgImlvLmthdGFjb250YWluZXJzLnBrZy5vY2kuYnVuZGxlX3BhdGgiOiAiL3J1bi9jb250YWluZXJkL2lvLmNvbnRhaW5lcmQucnVudGltZS52Mi50YXNrL2s4cy5pby8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgImlvLmthdGFjb250YWluZXJzLnBrZy5vY2kuY29udGFpbmVyX3R5cGUiOiAicG9kX2NvbnRhaW5lciIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLW5hbWUiOiAiYnVzeWJveCIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLXR5cGUiOiAiY29udGFpbmVyIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5pbWFnZS1uYW1lIjogIm1jci5taWNyb3NvZnQuY29tL2Frcy9lMmUvbGlicmFyeS1idXN5Ym94Om1hc3Rlci4yMjAzMTQuMS1saW51eC1hbWQ2NCIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCI6ICJeW2EtejAtOV17NjR9JCIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1uYW1lIjogIl5vbmVcXC1jb250YWluZXIkIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LW5hbWVzcGFjZSI6ICIiCiAgICAgICAgfSwKICAgICAgICAiTGludXgiOiB7CiAgICAgICAgICAiTmFtZXNwYWNlcyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICJUeXBlIjogImlwYyIsCiAgICAgICAgICAgICAgIlBhdGgiOiAiIgogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgIlR5cGUiOiAidXRzIiwKICAgICAgICAgICAgICAiUGF0aCI6ICIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiVHlwZSI6ICJtb3VudCIsCiAgICAgICAgICAgICAgIlBhdGgiOiAiIgogICAgICAgICAgICB9CiAgICAgICAgICBdLAogICAgICAgICAgIk1hc2tlZFBhdGhzIjogWwogICAgICAgICAgICAiL3Byb2MvYWNwaSIsCiAgICAgICAgICAgICIvcHJvYy9rY29yZSIsCiAgICAgICAgICAgICIvcHJvYy9rZXlzIiwKICAgICAgICAgICAgIi9wcm9jL2xhdGVuY3lfc3RhdHMiLAogICAgICAgICAgICAiL3Byb2MvdGltZXJfbGlzdCIsCiAgICAgICAgICAgICIvcHJvYy90aW1lcl9zdGF0cyIsCiAgICAgICAgICAgICIvcHJvYy9zY2hlZF9kZWJ1ZyIsCiAgICAgICAgICAgICIvcHJvYy9zY3NpIiwKICAgICAgICAgICAgIi9zeXMvZmlybXdhcmUiCiAgICAgICAgICBdLAogICAgICAgICAgIlJlYWRvbmx5UGF0aHMiOiBbCiAgICAgICAgICAgICIvcHJvYy9hc291bmQiLAogICAgICAgICAgICAiL3Byb2MvYnVzIiwKICAgICAgICAgICAgIi9wcm9jL2ZzIiwKICAgICAgICAgICAgIi9wcm9jL2lycSIsCiAgICAgICAgICAgICIvcHJvYy9zeXMiLAogICAgICAgICAgICAiL3Byb2Mvc3lzcnEtdHJpZ2dlciIKICAgICAgICAgIF0sCiAgICAgICAgICAiRGV2aWNlcyI6IFtdLAogICAgICAgICAgIlN5c2N0bCI6IHsKICAgICAgICAgICAgIm5ldC5pcHY0LmlwX3VucHJpdmlsZWdlZF9wb3J0X3N0YXJ0IjogIjAiLAogICAgICAgICAgICAibmV0LmlwdjQucGluZ19ncm91cF9yYW5nZSI6ICIwIDIxNDc0ODM2NDciCiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9LAogICAgICAic3RvcmFnZXMiOiBbCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJibGsiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogInRhciIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIiQoaGFzaDApIgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGxheWVyMCkiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJibGsiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogInRhciIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIiQoaGFzaDEpIgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGxheWVyMSkiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJvdmVybGF5ZnMiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogImZ1c2UzLmthdGEtb3ZlcmxheSIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIjJjMzQyYTEzN2U2OTNjNzg5OGFlYzM2ZGExMDQ3ZjE5MWRjN2MxNjg3ZTY2MTk4YWRhY2M0MzljZjRhZGYzNzk6MjU3MGUzYTE5ZTFiZjIwZGRkYTQ1NDk4YTk2MjdmNjE1NTVkMmQ2YzAxNDc5YjliNzY0NjBiNjc5YjI3ZDU1MiIsCiAgICAgICAgICAgICI4NTY4YzcwYzBjY2ZlMDA1MTA5MmU4MThkYTc2OTExMWE1OTg4MmNkMTlkZDc5OWQzYmNhNWZmYTgyNzkxMDgwOmI2NDNiNjIxNzc0ODk4MzgzMGIyNmFjMTRhMzVhMzMyMmRkNTI4YzAwOTYzZWFhZGQ5MWVmNTVmNTEzZGM3M2YiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQoY3BhdGgpLyQoYnVuZGxlLWlkKSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfQogICAgICBdLAogICAgICAiZGV2aWNlcyI6IFtdLAogICAgICAic2FuZGJveF9waWRucyI6IGZhbHNlLAogICAgICAiZXhlY19jb21tYW5kcyI6IFsKICAgICAgICBbCiAgICAgICAgICAiL2Jpbi9zaCIsCiAgICAgICAgICAiLWMiLAogICAgICAgICAgImVjaG8gSGVsbG8gZnJvbSB0aGUgcG9zdFN0YXJ0IGhhbmRsZXIiCiAgICAgICAgXQogICAgICBdLAogICAgICAiZW52X21hcCI6IHsKICAgICAgICAiSE9TVE5BTUUiOiAiJChob3N0LW5hbWUpIiwKICAgICAgICAiSVNUSU9fTUVUQV9BUFBfQ09OVEFJTkVSUyI6ICJzZXJ2aWNlYWNsaWVudCIsCiAgICAgICAgIklTVElPX01FVEFfQ0xVU1RFUl9JRCI6ICJLdWJlcm5ldGVzIiwKICAgICAgICAiSVNUSU9fTUVUQV9OT0RFX05BTUUiOiAiJChub2RlLW5hbWUpIiwKICAgICAgICAiSVNUSU9fTUVUQV9QT0RfUE9SVFMiOiAiW1xuXSIsCiAgICAgICAgIlBBVEgiOiAiL3Vzci9sb2NhbC9zYmluOi91c3IvbG9jYWwvYmluOi91c3Ivc2JpbjovdXNyL2Jpbjovc2JpbjovYmluIiwKICAgICAgICAiUE9EX0lQIjogIiQocG9kLWlwKSIsCiAgICAgICAgIlBPRF9OQU1FIjogIiQoc2FuZGJveC1uYW1lKSIsCiAgICAgICAgIlBPRF9OQU1FU1BBQ0UiOiAiJChzYW5kYm94LW5hbWVzcGFjZSkiLAogICAgICAgICJQUk9YWV9DT05GSUciOiAie31cbiIsCiAgICAgICAgIlNFUlZJQ0VfQUNDT1VOVCI6ICJkZWZhdWx0IgogICAgICB9CiAgICB9CiAgXSwKICAiY29tbW9uIjogewogICAgImNwYXRoIjogIi9ydW4va2F0YS1jb250YWluZXJzL3NoYXJlZC9jb250YWluZXJzIiwKICAgICJtb3VudF9zb3VyY2VfY3BhdGgiOiAiL3J1bi9rYXRhLWNvbnRhaW5lcnMvc2hhcmVkL2NvbnRhaW5lcnMiLAogICAgInNmcHJlZml4IjogIl4kKGNwYXRoKS8kKGJ1bmRsZS1pZCktW2EtejAtOV17MTZ9LSIsCiAgICAic3BhdGgiOiAiL3J1bi9rYXRhLWNvbnRhaW5lcnMvc2FuZGJveC9zdG9yYWdlIiwKICAgICJpcHY0X2EiOiAiKChbMC05XXxbMS05XVswLTldfDFbMC05XXsyfXwyWzAtNF1bMC05XXwyNVswLTVdKVxcLil7M30oWzAtOV18WzEtOV1bMC05XXwxWzAtOV17Mn18MlswLTRdWzAtOV18MjVbMC01XSkiLAogICAgImlwX3AiOiAiWzAtOV17MSw1fSIsCiAgICAic3ZjX25hbWUiOiAiW0EtWl9cXC5cXC1dKyIsCiAgICAiZG5zX2xhYmVsIjogIlthLXpBLVowLTlfXFwuXFwtXSsiLAogICAgInNfc291cmNlMSI6ICJeLi4yWzAtOV17M31fWzAtMV1bMC05XV9bMC0zXVswLTldX1swLTJdWzAtOV1fWzAtNV1bMC05XV9bMC01XVswLTldXFwuWzAtOV17MSwxMH0kIiwKICAgICJzX3NvdXJjZTIiOiAiXi4uZGF0YS8iLAogICAgImRuc19zdWJkb21haW4iOiAiXlthLXowLTldKFstYS16MC05XSpbYS16MC05XSk/JCIsCiAgICAicG9kX3VpZCI6ICJeWzAtOWEtZkEtRl17OH0tWzAtOWEtZkEtRl17NH0tWzAtOWEtZkEtRl17NH0tWzAtOWEtZkEtRl17NH0tWzAtOWEtZkEtRl17MTJ9JCIsCiAgICAiZGVmYXVsdF9jYXBzIjogWwogICAgICAiQ0FQX0NIT1dOIiwKICAgICAgIkNBUF9EQUNfT1ZFUlJJREUiLAogICAgICAiQ0FQX0ZTRVRJRCIsCiAgICAgICJDQVBfRk9XTkVSIiwKICAgICAgIkNBUF9NS05PRCIsCiAgICAgICJDQVBfTkVUX1JBVyIsCiAgICAgICJDQVBfU0VUR0lEIiwKICAgICAgIkNBUF9TRVRVSUQiLAogICAgICAiQ0FQX1NFVEZDQVAiLAogICAgICAiQ0FQX1NFVFBDQVAiLAogICAgICAiQ0FQX05FVF9CSU5EX1NFUlZJQ0UiLAogICAgICAiQ0FQX1NZU19DSFJPT1QiLAogICAgICAiQ0FQX0tJTEwiLAogICAgICAiQ0FQX0FVRElUX1dSSVRFIgogICAgXSwKICAgICJwcml2aWxlZ2VkX2NhcHMiOiBbCiAgICAgICJDQVBfQ0hPV04iLAogICAgICAiQ0FQX0RBQ19PVkVSUklERSIsCiAgICAgICJDQVBfREFDX1JFQURfU0VBUkNIIiwKICAgICAgIkNBUF9GT1dORVIiLAogICAgICAiQ0FQX0ZTRVRJRCIsCiAgICAgICJDQVBfS0lMTCIsCiAgICAgICJDQVBfU0VUR0lEIiwKICAgICAgIkNBUF9TRVRVSUQiLAogICAgICAiQ0FQX1NFVFBDQVAiLAogICAgICAiQ0FQX0xJTlVYX0lNTVVUQUJMRSIsCiAgICAgICJDQVBfTkVUX0JJTkRfU0VSVklDRSIsCiAgICAgICJDQVBfTkVUX0JST0FEQ0FTVCIsCiAgICAgICJDQVBfTkVUX0FETUlOIiwKICAgICAgIkNBUF9ORVRfUkFXIiwKICAgICAgIkNBUF9JUENfTE9DSyIsCiAgICAgICJDQVBfSVBDX09XTkVSIiwKICAgICAgIkNBUF9TWVNfTU9EVUxFIiwKICAgICAgIkNBUF9TWVNfUkFXSU8iLAogICAgICAiQ0FQX1NZU19DSFJPT1QiLAogICAgICAiQ0FQX1NZU19QVFJBQ0UiLAogICAgICAiQ0FQX1NZU19QQUNDVCIsCiAgICAgICJDQVBfU1lTX0FETUlOIiwKICAgICAgIkNBUF9TWVNfQk9PVCIsCiAgICAgICJDQVBfU1lTX05JQ0UiLAogICAgICAiQ0FQX1NZU19SRVNPVVJDRSIsCiAgICAgICJDQVBfU1lTX1RJTUUiLAogICAgICAiQ0FQX1NZU19UVFlfQ09ORklHIiwKICAgICAgIkNBUF9NS05PRCIsCiAgICAgICJDQVBfTEVBU0UiLAogICAgICAiQ0FQX0FVRElUX1dSSVRFIiwKICAgICAgIkNBUF9BVURJVF9DT05UUk9MIiwKICAgICAgIkNBUF9TRVRGQ0FQIiwKICAgICAgIkNBUF9NQUNfT1ZFUlJJREUiLAogICAgICAiQ0FQX01BQ19BRE1JTiIsCiAgICAgICJDQVBfU1lTTE9HIiwKICAgICAgIkNBUF9XQUtFX0FMQVJNIiwKICAgICAgIkNBUF9CTE9DS19TVVNQRU5EIiwKICAgICAgIkNBUF9BVURJVF9SRUFEIiwKICAgICAgIkNBUF9QRVJGTU9OIiwKICAgICAgIkNBUF9CUEYiLAogICAgICAiQ0FQX0NIRUNLUE9JTlRfUkVTVE9SRSIKICAgIF0sCiAgICAidmlydGlvX2Jsa19zdG9yYWdlX2NsYXNzZXMiOiBbCiAgICAgICJjYy1sb2NhbC1jc2kiLAogICAgICAiY2MtbWFuYWdlZC1jc2kiLAogICAgICAiY2MtbWFuYWdlZC1wcmVtaXVtLWNzaSIKICAgIF0sCiAgICAic21iX3N0b3JhZ2VfY2xhc3NlcyI6IFsKICAgICAgewogICAgICAgICJuYW1lIjogImF6dXJlZmlsZS1jc2kta2F0YS1jYyIsCiAgICAgICAgIm1vdW50X29wdGlvbnMiOiBbCiAgICAgICAgICAiZGlyX21vZGU9MDc3NyIsCiAgICAgICAgICAiZmlsZV9tb2RlPTA3NzciLAogICAgICAgICAgIm1mc3ltbGlua3MiLAogICAgICAgICAgImNhY2hlPXN0cmljdCIsCiAgICAgICAgICAibm9zaGFyZXNvY2siLAogICAgICAgICAgImFjdGltZW89MzAiLAogICAgICAgICAgIm5vYnJsIgogICAgICAgIF0KICAgICAgfQogICAgXQogIH0sCiAgInNhbmRib3giOiB7CiAgICAic3RvcmFnZXMiOiBbCiAgICAgIHsKICAgICAgICAiZHJpdmVyIjogImVwaGVtZXJhbCIsCiAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgInNvdXJjZSI6ICJzaG0iLAogICAgICAgICJmc3R5cGUiOiAidG1wZnMiLAogICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICJub2RldiIsCiAgICAgICAgICAibW9kZT0xNzc3IiwKICAgICAgICAgICJzaXplPTY3MTA4ODY0IgogICAgICAgIF0sCiAgICAgICAgIm1vdW50X3BvaW50IjogIi9ydW4va2F0YS1jb250YWluZXJzL3NhbmRib3gvc2htIiwKICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgIH0KICAgIF0KICB9LAogICJyZXF1ZXN0X2RlZmF1bHRzIjogewogICAgIkNyZWF0ZUNvbnRhaW5lclJlcXVlc3QiOiB7CiAgICAgICJhbGxvd19lbnZfcmVnZXgiOiBbCiAgICAgICAgIl5IT1NUTkFNRT0kKGRuc19sYWJlbCkkIiwKICAgICAgICAiXiQoc3ZjX25hbWUpX1BPUlRfJChpcF9wKV9UQ1A9dGNwOi8vJChpcHY0X2EpOiQoaXBfcCkkIiwKICAgICAgICAiXiQoc3ZjX25hbWUpX1BPUlRfJChpcF9wKV9UQ1BfUFJPVE89dGNwJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9QT1JUXyQoaXBfcClfVENQX1BPUlQ9JChpcF9wKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfUE9SVF8kKGlwX3ApX1RDUF9BRERSPSQoaXB2NF9hKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfU0VSVklDRV9IT1NUPSQoaXB2NF9hKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfU0VSVklDRV9QT1JUPSQoaXBfcCkkIiwKICAgICAgICAiXiQoc3ZjX25hbWUpX1NFUlZJQ0VfUE9SVF8kKGRuc19sYWJlbCk9JChpcF9wKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfUE9SVD10Y3A6Ly8kKGlwdjRfYSk6JChpcF9wKSQiLAogICAgICAgICJeQVpVUkVfQ0xJRU5UX0lEPVtBLUZhLWYwLTktXSokIiwKICAgICAgICAiXkFaVVJFX1RFTkFOVF9JRD1bQS1GYS1mMC05LV0qJCIsCiAgICAgICAgIl5BWlVSRV9GRURFUkFURURfVE9LRU5fRklMRT0vdmFyL3J1bi9zZWNyZXRzL2F6dXJlL3Rva2Vucy9henVyZS1pZGVudGl0eS10b2tlbiQiLAogICAgICAgICJeQVpVUkVfQVVUSE9SSVRZX0hPU1Q9aHR0cHM6Ly9sb2dpblxcLm1pY3Jvc29mdG9ubGluZVxcLmNvbS8kIiwKICAgICAgICAiXlRFUk09eHRlcm0kIgogICAgICBdLAogICAgICAiYWxsb3dfZW52X3JlZ2V4X21hcCI6IHsKICAgICAgICAiQ1BVX0xJTUlUIjogIl5bMC05XSskIiwKICAgICAgICAiSk9CX0NPTVBMRVRJT05fSU5ERVgiOiAiXlswLTldKiQiLAogICAgICAgICJNRU1PUllfTElNSVQiOiAiXlswLTldKyQiCiAgICAgIH0KICAgIH0sCiAgICAiQ29weUZpbGVSZXF1ZXN0IjogWwogICAgICAiJChzZnByZWZpeCkiCiAgICBdLAogICAgIkV4ZWNQcm9jZXNzUmVxdWVzdCI6IHsKICAgICAgImFsbG93ZWRfY29tbWFuZHMiOiBbXSwKICAgICAgInJlZ2V4IjogW10KICAgIH0sCiAgICAiVXBkYXRlUm91dGVzUmVxdWVzdCI6IHsKICAgICAgImZvcmJpZGRlbl9kZXZpY2VfbmFtZXMiOiBbCiAgICAgICAgImxvIgogICAgICBdLAogICAgICAiZm9yYmlkZGVuX3NvdXJjZV9yZWdleCI6IFsKICAgICAgICAiXig/OjB7MCw0fTopezAsN30wezAsM30xJCIsCiAgICAgICAgIl4xMjdcXC4oPzpbMC05XXsxLDN9XFwuKXsyfVswLTldezEsM30kIgogICAgICBdCiAgICB9LAogICAgIlVwZGF0ZUludGVyZmFjZVJlcXVlc3QiOiB7CiAgICAgICJhbGxvd19yYXdfZmxhZ3MiOiAxMjgsCiAgICAgICJmb3JiaWRkZW5fbmFtZXMiOiBbCiAgICAgICAgImxvIgogICAgICBdLAogICAgICAiZm9yYmlkZGVuX2h3X2FkZHJzIjogWwogICAgICAgICIwMDowMDowMDowMDowMDowMCIKICAgICAgXQogICAgfSwKICAgICJDbG9zZVN0ZGluUmVxdWVzdCI6IGZhbHNlLAogICAgIlJlYWRTdHJlYW1SZXF1ZXN0IjogZmFsc2UsCiAgICAiVXBkYXRlRXBoZW1lcmFsTW91bnRzUmVxdWVzdCI6IGZhbHNlLAogICAgIldyaXRlU3RyZWFtUmVxdWVzdCI6IGZhbHNlCiAgfQp9 +spec: + restartPolicy: Never + runtimeClassName: kata-cc + securityContext: + runAsUser: 1000 + containers: + - name: busybox + image: "mcr.microsoft.com/aks/e2e/library-busybox:master.220314.1-linux-amd64" + stdin: true + env: + - name: POD_NAME + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: metadata.name + - name: POD_NAMESPACE + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: metadata.namespace + - name: POD_IP + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: status.podIP + - name: SERVICE_ACCOUNT + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: spec.serviceAccountName + - name: PROXY_CONFIG + value: "{}\n" + - name: ISTIO_META_POD_PORTS + value: "[\n]" + - name: ISTIO_META_APP_CONTAINERS + value: serviceaclient + - name: ISTIO_META_CLUSTER_ID + value: Kubernetes + - name: ISTIO_META_NODE_NAME + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: spec.nodeName + securityContext: + runAsUser: 1001 + command: + - /bin/sh + args: + - "-c" + - while true; do echo $(POD_NAME); sleep 10; done + lifecycle: + postStart: + exec: + command: + - /bin/sh + - "-c" + - echo Hello from the postStart handler diff --git a/src/agent/samples/policy/yaml/pod/pod-persistent-volumes.yaml b/src/agent/samples/policy/yaml/pod/pod-persistent-volumes.yaml new file mode 100644 index 000000000000..52cfcda7733a --- /dev/null +++ b/src/agent/samples/policy/yaml/pod/pod-persistent-volumes.yaml @@ -0,0 +1,64 @@ +--- +apiVersion: v1 +kind: PersistentVolume +metadata: + name: my-volume +spec: + storageClassName: standard + capacity: + storage: 1Gi + accessModes: + - ReadWriteOnce + hostPath: + path: /mnt/my-volume +--- +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: my-volume-claim +spec: + storageClassName: standard + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi +--- +apiVersion: v1 +kind: Pod +metadata: + name: persistent + labels: + run: busybox + annotations: + io.katacontainers.config.agent.policy: IyBDb3B5cmlnaHQgKGMpIDIwMjMgTWljcm9zb2Z0IENvcnBvcmF0aW9uCiMKIyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMAojCnBhY2thZ2UgYWdlbnRfcG9saWN5CgppbXBvcnQgZnV0dXJlLmtleXdvcmRzLmluCmltcG9ydCBmdXR1cmUua2V5d29yZHMuZXZlcnkKCiMgRGVmYXVsdCB2YWx1ZXMsIHJldHVybmVkIGJ5IE9QQSB3aGVuIHJ1bGVzIGNhbm5vdCBiZSBldmFsdWF0ZWQgdG8gdHJ1ZS4KZGVmYXVsdCBBZGRBUlBOZWlnaGJvcnNSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgQWRkU3dhcFJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBDbG9zZVN0ZGluUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IENvcHlGaWxlUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IENyZWF0ZUNvbnRhaW5lclJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBDcmVhdGVTYW5kYm94UmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IERlc3Ryb3lTYW5kYm94UmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgRXhlY1Byb2Nlc3NSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgR2V0T09NRXZlbnRSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBHdWVzdERldGFpbHNSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBMaXN0SW50ZXJmYWNlc1JlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBMaXN0Um91dGVzUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IE1lbUhvdHBsdWdCeVByb2JlUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IE9ubGluZUNQVU1lbVJlcXVlc3QgOj0gdHJ1ZQpkZWZhdWx0IFBhdXNlQ29udGFpbmVyUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFJlYWRTdHJlYW1SZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgUmVtb3ZlQ29udGFpbmVyUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgUmVtb3ZlU3RhbGVWaXJ0aW9mc1NoYXJlTW91bnRzUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgUmVzZWVkUmFuZG9tRGV2UmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFJlc3VtZUNvbnRhaW5lclJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBTZXRHdWVzdERhdGVUaW1lUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFNldFBvbGljeVJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBTaWduYWxQcm9jZXNzUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgU3RhcnRDb250YWluZXJSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBTdGFydFRyYWNpbmdSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgU3RhdHNDb250YWluZXJSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBTdG9wVHJhY2luZ1JlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBUdHlXaW5SZXNpemVSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBVcGRhdGVDb250YWluZXJSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgVXBkYXRlRXBoZW1lcmFsTW91bnRzUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFVwZGF0ZUludGVyZmFjZVJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBVcGRhdGVSb3V0ZXNSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgV2FpdFByb2Nlc3NSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBXcml0ZVN0cmVhbVJlcXVlc3QgOj0gZmFsc2UKCiMgQWxsb3dSZXF1ZXN0c0ZhaWxpbmdQb2xpY3kgOj0gdHJ1ZSBjb25maWd1cmVzIHRoZSBBZ2VudCB0byAqYWxsb3cgYW55CiMgcmVxdWVzdHMgY2F1c2luZyBhIHBvbGljeSBmYWlsdXJlKi4gVGhpcyBpcyBhbiB1bnNlY3VyZSBjb25maWd1cmF0aW9uCiMgYnV0IGlzIHVzZWZ1bCBmb3IgYWxsb3dpbmcgdW5zZWN1cmUgcG9kcyB0byBzdGFydCwgdGhlbiBjb25uZWN0IHRvCiMgdGhlbSBhbmQgaW5zcGVjdCBPUEEgbG9ncyBmb3IgdGhlIHJvb3QgY2F1c2Ugb2YgYSBmYWlsdXJlLgpkZWZhdWx0IEFsbG93UmVxdWVzdHNGYWlsaW5nUG9saWN5IDo9IGZhbHNlCgojIENvbnN0YW50cwpTX05BTUVfS0VZID0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZSIKU19OQU1FU1BBQ0VfS0VZID0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZXNwYWNlIgpCVU5ETEVfSUQgPSAiW2EtejAtOV17NjR9IgoKQ3JlYXRlQ29udGFpbmVyUmVxdWVzdDo9IHJlc3AgewogICAgbm90IGlzX251bGwoaW5wdXQuZW52X21hcCkKICAgIAogICAgaV9lbnZfbWFwIDo9IGlucHV0LmVudl9tYXAKICAgIAogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBwX2Vudl9tYXAgOj0gcF9jb250YWluZXIuZW52X21hcCAgCiAgICBhbGxvd19lbnZfbWFwKHBfZW52X21hcCwgaV9lbnZfbWFwKQogICAgCiAgICBpX3Byb2Nlc3MgOj0gaW5wdXQuYmFzZS5PQ0kuUHJvY2VzcwogICAgCiAgICBwX3Byb2Nlc3MgOj0gcF9jb250YWluZXIuT0NJLlByb2Nlc3MKICAgIAogICAgYWxsb3dfYXJncyhpX3Byb2Nlc3MsIHBfcHJvY2VzcywgaV9lbnZfbWFwKQoKICAgIHJlc3AgPSBDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uKGlucHV0LmJhc2UpCiAgICBwcmludCgiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdDogdHJ1ZSIpCn0KCmFsbG93X2FyZ3MoaV9wcm9jZXNzLCBwX3Byb2Nlc3MsIGlfZW52X21hcCkgewogICAgaV9hcmdzIDo9IGlfcHJvY2Vzcy5BcmdzCiAgICBwX2FyZ3MgOj0gcF9wcm9jZXNzLkFyZ3MKICAgIHByaW50KCJhbGxvd19hcmdzOiBpX2FyZ3MgPSIsIGlfYXJncywgInBfYXJncyA9IiwgcF9hcmdzKQogICAgY291bnQoaV9hcmdzKSA9PSBjb3VudChwX2FyZ3MpCiAgICBldmVyeSBpLCBpX2FyZyBpbiBpX2FyZ3MgewogICAgICAgIHByaW50KCJhbGxvd19hcmdzOiBpX2FyZyA9IiwgaV9hcmcpCiAgICAgICAgcF9hcmdfcmVwbGFjZWQgOj0gcmVwbGFjZV9lbnZfdmFyaWFibGVzKHBfYXJnc1tpXSwgaV9lbnZfbWFwKQogICAgICAgIHByaW50KCJhbGxvd19hcmdzOiBwX2FyZ19yZXBsYWNlZCA9IiwgcF9hcmdfcmVwbGFjZWQpCiAgICAgICAgcF9hcmdfcmVwbGFjZWQyIDo9IHJlcGxhY2UocF9hcmdfcmVwbGFjZWQsICIkJCIsICIkIikKICAgICAgICBwcmludCgiYWxsb3dfYXJnczogcF9hcmdfcmVwbGFjZWQyID0iLCBwX2FyZ19yZXBsYWNlZDIpCiAgICAgICAgaV9hcmcgPT0gcF9hcmdfcmVwbGFjZWQyCiAgICB9CiAgICBwcmludCgiYWxsb3dfYXJnczogdHJ1ZSIpCn0KCmFsbG93X2FyZ3MoaV9wcm9jZXNzLCBwX3Byb2Nlc3MsIGlfZW52X21hcCkgewogICAgbm90IGlfcHJvY2Vzcy5BcmdzCiAgICBub3QgcF9wcm9jZXNzLkFyZ3MKICAgIHByaW50KCJhbGxvd19hcmdzMjogbm8gYXJncyIpCn0KCiMgdGhpcyBmdW5jdGlvbiByZXBsYWNlcyBhbGwgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyBpbiBhIHN0cmluZywgZ2l2ZW4gYSBtYXAgb2YgZW52aXJvbm1lbnQga2V5cyB0byBlbnZpcm9ubWVudCB2YWx1ZXMKIyBlZyBzdHIgPSAiZWNobyAkKENMVVNURVJfSUQpOyBlY2hvICQoTk9ERV9OQU1FKTsiCiMgZW52X21hcCA9IHsiQ0xVU1RFUl9JRCI6ICJhYmMiLCAiTk9ERV9OQU1FIiA6ICJ4eXoifQojIHJlc3VsdCA9ICJlY2hvIGFiYzsgZWNobyB4eXo7IgpyZXBsYWNlX2Vudl92YXJpYWJsZXMoc3RyLCBlbnZfbWFwKSA9IHJlc3VsdCB7CiAgICAjIG1ha2UgYW4gYXJyYXkgb2YgdGhlIGtleXMgZWcgWyJDTFVTVEVSX0lEIiwgIk5PREVfTkFNRSJdCiAgICBrZXlzIDo9IFt4IHwgc29tZSB4IGluIG9iamVjdC5rZXlzKGVudl9tYXApXQogICAgcmVzdWx0IDo9IHJlcGxhY2Vfc3RyX3JlYyhzdHIsIGVudl9tYXAsIGtleXMsIGNvdW50KGtleXMpIC0gMSkKfQoKIyBiYXNlIGNhc2UKcmVwbGFjZV9zdHJfcmVjKHN0ciwgZW52X21hcCwgYXJyX2tleXMsIGkpID0gcmVzdWx0IHsKICAgIGkgPCAwCiAgICByZXN1bHQgOj0gc3RyCn0KCiMgcmVjdXJzaXZlIHN0ZXAKcmVwbGFjZV9zdHJfcmVjKHN0ciwgZW52X21hcCwgYXJyX2tleXMsIGkpID0gcmVzdWx0IHsKICAgIGkgPj0gMAogICAga2V5IDo9IGFycl9rZXlzW2ldCiAgICBlbnZfa2V5MSA6PSBjb25jYXQoIiIsIFsiJCgiLCBrZXksICIpIl0pCiAgICAjIHJlcGxhY2UgJChWQVIpIHdpdGggdmFsdWUKICAgIG5ld19zdHIxIDo9IHJlcGxhY2Uoc3RyLCBlbnZfa2V5MSwgZW52X21hcFtrZXldKQogICAgIyByZXBsYWNlIG5leHQgZW52aXJvbm1lbnQgdmFyaWFibGUKICAgIHJlc3VsdCA9IHJlcGxhY2Vfc3RyX3JlYyhuZXdfc3RyMSwgZW52X21hcCwgYXJyX2tleXMsIGkgLSAxKQp9CgphbGxvd19lbnZfbWFwKHBfZW52X21hcCwgaV9lbnZfbWFwKSB7CiAgICBwcmludCgiYWxsb3dfZW52X21hcDogcF9lbnZfbWFwID0iLCBwX2Vudl9tYXApCiAgICBldmVyeSBlbnZfa2V5LCBlbnZfdmFsIGluIGlfZW52X21hcCB7CiAgICAgICAgcHJpbnQoImFsbG93X2VudjogZW52X2tleSA9IiwgZW52X2tleSwgImVudl92YWwgPSIsIGVudl92YWwpCiAgICAgICAgYWxsb3dfZW52X21hcF9lbnRyeShlbnZfa2V5LCBlbnZfdmFsLCBwX2Vudl9tYXApCiAgICB9CiAgICBwcmludCgiYWxsb3dfZW52X21hcDogdHJ1ZSIpCn0KCiMgQWxsb3cgZXhhY3QgbWF0Y2gKYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBpX3ZhbCA9PSBwX3ZhbAogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnk6IHRydWUiKQp9CgojIEFsbG93IHJlc291cmNlRmllbGRSZWYgdmFsdWVzIChlLmcuLCAibGltaXRzLmNwdSIpLgphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgICMgYSB2YXJpYWJsZSB3ZSBzaG91bGQgYmUgdmFsaWRhdGluZyB1c2luZyBhIHJlZ2V4IGZyb20gc2V0dGluZ3MKICAgIHBfdmFsID09ICIkKHZhbGlkYXRlLWZyb20tc2V0dGluZ3MpIgogICAgcmVnZXhfdmFsIDo9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuQ3JlYXRlQ29udGFpbmVyUmVxdWVzdC5hbGxvd19lbnZfcmVnZXhfbWFwW2tleV0KICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4X3ZhbCwgaV92YWwpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSAyOiB0cnVlIikKfQoKIyBBbGxvdyBub2RlLW5hbWUKYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChub2RlLW5hbWUpIgogICAgcmVnZXgubWF0Y2gocG9saWN5X2RhdGEuY29tbW9uLmRuc19zdWJkb21haW4gLCBpX3ZhbCkKICAgIHByaW50KCJhbGxvd19lbnZfbWFwX2VudHJ5IDM6IHRydWUiKQp9CgojIEFsbG93IGhvc3QtbmFtZQphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgIHBfdmFsID09ICIkKGhvc3QtbmFtZSkiCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24uZG5zX2xhYmVsICwgaV92YWwpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSA0OiB0cnVlIikKfQoKIyBBbGxvdyBwb2QtdWlkCmFsbG93X2Vudl9tYXBfZW50cnkoa2V5LCBpX3ZhbCwgcF9lbnZfbWFwKSB7CiAgICBwX3ZhbCA6PSBwX2Vudl9tYXBba2V5XQogICAgcF92YWwgPT0gIiQocG9kLXVpZCkiCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24ucG9kX3VpZCAsIGlfdmFsKQogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgNTogdHJ1ZSIpCn0KCiMgQWxsb3cgZmllbGRSZWYgImZpZWxkUGF0aDogc3RhdHVzLnBvZElQIiB2YWx1ZXMuCmFsbG93X2Vudl9tYXBfZW50cnkoa2V5LCBpX3ZhbCwgcF9lbnZfbWFwKSB7CiAgICBpc19pcChpX3ZhbCkKCiAgICBwX3ZhbCA6PSBwX2Vudl9tYXBba2V5XQogICAgcF92YXIgOj0gY29uY2F0KCI9IiwgW2tleSwgcF92YWxdKQogICAgYWxsb3dfcG9kX2lwX3ZhcihrZXksIHBfdmFyKQogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgNjogdHJ1ZSIpCn0KCiMgQWxsb3cgZmllbGRSZWYgImZpZWxkUGF0aDogc3RhdHVzLmhvc3RJUCIgdmFsdWVzLgphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgaXNfaXAoaV92YWwpCgogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgIHBfdmFyIDo9IGNvbmNhdCgiPSIsIFtrZXksIHBfdmFsXSkKICAgIGFsbG93X2hvc3RfaXBfdmFyKGtleSwgcF92YXIpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSA3OiB0cnVlIikKfQoKIyBNYXRjaCBpbnB1dCB3aXRoIG9uZSBvZiB0aGUgcG9saWN5IHZhcmlhYmxlcywgYWZ0ZXIgc3Vic3RpdHV0aW5nICQoc2FuZGJveC1uYW1lKS4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChzYW5kYm94LW5hbWUpIgogICAgc19uYW1lIDo9IGlucHV0LmJhc2UuT0NJLkFubm90YXRpb25zW1NfTkFNRV9LRVldCiAgICBwX3ZhcjIgOj0gcmVwbGFjZShwX3ZhbCwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHBfdmFyMiA9PSBpX3ZhbAogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgODogdHJ1ZSIpCn0KCiMgTWF0Y2ggaW5wdXQgd2l0aCBvbmUgb2YgdGhlIHBvbGljeSB2YXJpYWJsZXMsIGFmdGVyIHN1YnN0aXR1dGluZyAkKHNhbmRib3gtbmFtZXNwYWNlKS4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChzYW5kYm94LW5hbWVzcGFjZSkiCiAgICBzX25hbWVzcGFjZSA6PSBpbnB1dC5iYXNlLk9DSS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwX3ZhcjIgOj0gcmVwbGFjZShwX3ZhbCwgIiQoc2FuZGJveC1uYW1lc3BhY2UpIiwgc19uYW1lc3BhY2UpCiAgICBwX3ZhcjIgPT0gaV92YWwKICAgIHByaW50KCJhbGxvd19lbnZfbWFwX2VudHJ5IDk6IHRydWUiKQp9CgojIEFsbG93IGlucHV0IGVudiB2YXJpYWJsZXMgdGhhdCBtYXRjaCB3aXRoIGEgcmVxdWVzdF9kZWZhdWx0cyByZWdleC4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHNvbWUgcF9yZWdleDEgaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5DcmVhdGVDb250YWluZXJSZXF1ZXN0LmFsbG93X2Vudl9yZWdleAogICAgcF9yZWdleDIgOj0gcmVwbGFjZShwX3JlZ2V4MSwgIiQoaXB2NF9hKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcHY0X2EpCiAgICBwX3JlZ2V4MyA6PSByZXBsYWNlKHBfcmVnZXgyLCAiJChpcF9wKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcF9wKQogICAgcF9yZWdleDQgOj0gcmVwbGFjZShwX3JlZ2V4MywgIiQoc3ZjX25hbWUpIiwgcG9saWN5X2RhdGEuY29tbW9uLnN2Y19uYW1lKQogICAgcF9yZWdleDUgOj0gcmVwbGFjZShwX3JlZ2V4NCwgIiQoZG5zX2xhYmVsKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5kbnNfbGFiZWwpCgogICAgcmVzdWx0IDo9IGNvbmNhdCgiPSIsIFtrZXksIGlfdmFsXSkKICAgIHJlZ2V4Lm1hdGNoKHBfcmVnZXg1LCByZXN1bHQpCgogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgMTA6IHRydWUiKQp9CgpDcmVhdGVDb250YWluZXJSZXF1ZXN0Oj0gcmVzcCB7CiAgICBub3QgaW5wdXQuZW52X21hcAogICAgaV9wcm9jZXNzID0gaW5wdXQuT0NJLlByb2Nlc3MKICAgIHNfbmFtZSA9IGlucHV0Lk9DSS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBwX3Byb2Nlc3MgPSBwX2NvbnRhaW5lci5PQ0kuUHJvY2VzcwogICAgYWxsb3dfZGVwcmVjYXRlZF9hcmdzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUpCiAgICByZXNwID0gQ3JlYXRlQ29udGFpbmVyUmVxdWVzdENvbW1vbihpbnB1dCkKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0MjogdHJ1ZSIpCn0KCkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb24ocmVxKTo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgICMgQ2hlY2sgaWYgdGhlIGlucHV0IHJlcXVlc3Qgc2hvdWxkIGJlIHJlamVjdGVkIGV2ZW4gYmVmb3JlIGNoZWNraW5nIHRoZQogICAgIyBwb2xpY3lfZGF0YS5jb250YWluZXJzIGluZm9ybWF0aW9uLgogICAgYWxsb3dfY3JlYXRlX2NvbnRhaW5lcl9pbnB1dChyZXEpCgogICAgaV9vY2kgOj0gcmVxLk9DSQogICAgaV9zdG9yYWdlcyA6PSByZXEuc3RvcmFnZXMKICAgIGlfZGV2aWNlcyA6PSByZXEuZGV2aWNlcwoKICAgICMgYXJyYXkgb2YgcG9zc2libGUgc3RhdGUgb3BlcmF0aW9ucwogICAgb3BzX2J1aWxkZXIgOj0gW10KCiAgICAjIGNoZWNrIHNhbmRib3ggbmFtZQogICAgc2FuZGJveF9uYW1lID0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FX0tFWV0KICAgIGFkZF9zYW5kYm94X25hbWVfdG9fc3RhdGUgOj0gc3RhdGVfYWxsb3dzKCJzYW5kYm94X25hbWUiLCBzYW5kYm94X25hbWUpCiAgICBvcHNfYnVpbGRlcjEgOj0gY29uY2F0X29wX2lmX25vdF9udWxsKG9wc19idWlsZGVyLCBhZGRfc2FuZGJveF9uYW1lX3RvX3N0YXRlKQoKICAgICMgQ2hlY2sgaWYgYW55IGVsZW1lbnQgZnJvbSB0aGUgcG9saWN5X2RhdGEuY29udGFpbmVycyBhcnJheSBhbGxvd3MgdGhlIGlucHV0IHJlcXVlc3QuCiAgICBzb21lIHBfY29udGFpbmVyIGluIHBvbGljeV9kYXRhLmNvbnRhaW5lcnMKICAgIHByaW50KCI9PT09PT09PSBDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiB0cnlpbmcgbmV4dCBwb2xpY3kgY29udGFpbmVyIikKCiAgICBwX3BpZG5zIDo9IHBfY29udGFpbmVyLnNhbmRib3hfcGlkbnMKICAgIGlfcGlkbnMgOj0gcmVxLnNhbmRib3hfcGlkbnMKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiBwX3BpZG5zID0iLCBwX3BpZG5zLCAiaV9waWRucyA9IiwgaV9waWRucykKICAgIHBfcGlkbnMgPT0gaV9waWRucwoKICAgIHBfb2NpIDo9IHBfY29udGFpbmVyLk9DSQoKICAgICMgY2hlY2sgbmFtZXNwYWNlCiAgICBwX25hbWVzcGFjZSA6PSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBpX25hbWVzcGFjZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwcmludCAoIkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb246IHBfbmFtZXNwYWNlID0iLCBwX25hbWVzcGFjZSwgImlfbmFtZXNwYWNlID0iLCBpX25hbWVzcGFjZSkKICAgIGFkZF9uYW1lc3BhY2VfdG9fc3RhdGUgOj0gYWxsb3dfbmFtZXNwYWNlKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkKICAgIG9wc19idWlsZGVyMiA6PSBjb25jYXRfb3BfaWZfbm90X251bGwob3BzX2J1aWxkZXIxLCBhZGRfbmFtZXNwYWNlX3RvX3N0YXRlKQoKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiBwIFZlcnNpb24gPSIsIHBfb2NpLlZlcnNpb24sICJpIFZlcnNpb24gPSIsIGlfb2NpLlZlcnNpb24pCiAgICBwX29jaS5WZXJzaW9uID09IGlfb2NpLlZlcnNpb24KCiAgICBwcmludCgiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdENvbW1vbjogcCBSZWFkb25seSA9IiwgcF9vY2kuUm9vdC5SZWFkb25seSwgImkgUmVhZG9ubHkgPSIsIGlfb2NpLlJvb3QuUmVhZG9ubHkpCiAgICBwX29jaS5Sb290LlJlYWRvbmx5ID09IGlfb2NpLlJvb3QuUmVhZG9ubHkKCiAgICBhbGxvd19hbm5vKHBfb2NpLCBpX29jaSkKCiAgICBwX3N0b3JhZ2VzIDo9IHBfY29udGFpbmVyLnN0b3JhZ2VzCiAgICBhbGxvd19ieV9hbm5vKHBfb2NpLCBpX29jaSwgcF9zdG9yYWdlcywgaV9zdG9yYWdlcykKCiAgICBwX2RldmljZXMgOj0gcF9jb250YWluZXIuZGV2aWNlcwogICAgYWxsb3dfZGV2aWNlcyhwX2RldmljZXMsIGlfZGV2aWNlcykKCiAgICByZXQgOj0gYWxsb3dfbGludXgob3BzX2J1aWxkZXIyLCBwX29jaSwgaV9vY2kpCiAgICByZXQuYWxsb3dlZAoKICAgIG9wcyA6PSByZXQub3BzCgogICAgcHJpbnQoIkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb246IHRydWUiKQp9CgphbGxvd19jcmVhdGVfY29udGFpbmVyX2lucHV0KHJlcSkgewogICAgcHJpbnQoImFsbG93X2NyZWF0ZV9jb250YWluZXJfaW5wdXQ6IGlucHV0ID0iLCByZXEpCgogICAgY291bnQocmVxLnNoYXJlZF9tb3VudHMpID09IDAKICAgIGlzX251bGwocmVxLnN0cmluZ191c2VyKQoKICAgIGlfb2NpIDo9IHJlcS5PQ0kKICAgIGlzX251bGwoaV9vY2kuSG9va3MpCiAgICBpc19udWxsKGlfb2NpLlNvbGFyaXMpCiAgICBpc19udWxsKGlfb2NpLldpbmRvd3MpCgogICAgaV9saW51eCA6PSBpX29jaS5MaW51eAogICAgY291bnQoaV9saW51eC5HSURNYXBwaW5ncykgPT0gMAogICAgY291bnQoaV9saW51eC5Nb3VudExhYmVsKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlJlc291cmNlcy5EZXZpY2VzKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlJvb3Rmc1Byb3BhZ2F0aW9uKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlVJRE1hcHBpbmdzKSA9PSAwCiAgICBpc19udWxsKGlfbGludXguSW50ZWxSZHQpCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLkJsb2NrSU8pCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLk5ldHdvcmspCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLlBpZHMpCiAgICBpc19udWxsKGlfbGludXguU2VjY29tcCkKCiAgICBpX3Byb2Nlc3MgOj0gaV9vY2kuUHJvY2VzcwogICAgY291bnQoaV9wcm9jZXNzLlNlbGludXhMYWJlbCkgPT0gMAogICAgY291bnQoaV9wcm9jZXNzLlVzZXIuVXNlcm5hbWUpID09IDAKCiAgICBwcmludCgiYWxsb3dfY3JlYXRlX2NvbnRhaW5lcl9pbnB1dDogdHJ1ZSIpCn0KCmFsbG93X25hbWVzcGFjZShwX25hbWVzcGFjZSwgaV9uYW1lc3BhY2UpID0gYWRkX25hbWVzcGFjZSB7CiAgICBwX25hbWVzcGFjZSA9PSBpX25hbWVzcGFjZQogICAgYWRkX25hbWVzcGFjZSA6PSBudWxsCiAgICBwcmludCgiYWxsb3dfbmFtZXNwYWNlIDE6IGlucHV0IG5hbWVzcGFjZSBtYXRjaGVzIHBvbGljeSBkYXRhIikKfQoKYWxsb3dfbmFtZXNwYWNlKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkgPSBhZGRfbmFtZXNwYWNlIHsKICAgIHBfbmFtZXNwYWNlID09ICIiCiAgICBwcmludCgiYWxsb3dfbmFtZXNwYWNlIDI6IG5vIG5hbWVzcGFjZSBmb3VuZCBvbiBwb2xpY3kgZGF0YSIpCiAgICBhZGRfbmFtZXNwYWNlIDo9IHN0YXRlX2FsbG93cygibmFtZXNwYWNlIiwgaV9uYW1lc3BhY2UpCn0KCiMgdmFsdWUgaGFzbid0IGJlZW4gc2VlbiBiZWZvcmUsIHNhdmUgaXQgdG8gc3RhdGUKc3RhdGVfYWxsb3dzKGtleSwgdmFsdWUpID0gYWN0aW9uIHsKICBzdGF0ZSA6PSBnZXRfc3RhdGUoKQogIHByaW50KCJzdGF0ZV9hbGxvd3MgMTogc3RhdGVba2V5XSA9Iiwgc3RhdGVba2V5XSwgInZhbHVlID0iLCB2YWx1ZSkKICBub3Qgc3RhdGVba2V5XQogIHByaW50KCJzdGF0ZV9hbGxvd3MgMTogc2F2aW5nIHRvIHN0YXRlIGtleSA9Iiwga2V5LCAidmFsdWUgPSIsIHZhbHVlKQogIHBhdGggOj0gZ2V0X3N0YXRlX3BhdGgoa2V5KSAKICBhY3Rpb24gOj0gewogICAgIm9wIjogImFkZCIsCiAgICAicGF0aCI6IHBhdGgsIAogICAgInZhbHVlIjogdmFsdWUsCiAgfQp9CgojIHZhbHVlIG1hdGNoZXMgd2hhdCdzIGluIHN0YXRlLCBhbGxvdyBpdApzdGF0ZV9hbGxvd3Moa2V5LCB2YWx1ZSkgPSBhY3Rpb24gewogIHByaW50KCJzdGF0ZV9hbGxvd3MgMjogc3RhcnQiKQogIHN0YXRlIDo9IGdldF9zdGF0ZSgpCiAgcHJpbnQoInN0YXRlX2FsbG93cyAyOiBzdGF0ZVtrZXldID0iLCBzdGF0ZVtrZXldLCAidmFsdWUgPSIsIHZhbHVlKQogIHZhbHVlID09IHN0YXRlW2tleV0KICBwcmludCgic3RhdGVfYWxsb3dzIDI6IGZvdW5kIGtleSA9Iiwga2V5LCAidmFsdWUgPSIsIHZhbHVlLCAiIGluIHN0YXRlIikKICBhY3Rpb24gOj0gbnVsbAp9CgojIGhlbHBlciBmdW5jdGlvbnMgdG8gaW50ZXJhY3Qgd2l0aCB0aGUgc3RhdGUKZ2V0X3N0YXRlKCkgPSBzdGF0ZSB7CiAgc3RhdGUgOj0gZGF0YVsicHN0YXRlIl0KfQoKZ2V0X3N0YXRlX3ZhbChrZXkpID0gdmFsdWUgewogICAgc3RhdGUgOj0gZ2V0X3N0YXRlKCkKICAgIHZhbHVlIDo9IHN0YXRlW2tleV0KfQoKZ2V0X3N0YXRlX3BhdGgoa2V5KSA9IHBhdGggewogICAgIyBwcmVwZW5kICIvcHN0YXRlLyIgdG8ga2V5CiAgICBwYXRoIDo9IGNvbmNhdCgiLyIsIFsiL3BzdGF0ZSIsIGtleV0pCn0KCiMgSGVscGVyIGZ1bmN0aW9ucyB0byBjb25kaXRpb25hbGx5IGNvbmNhdGVuYXRlIG9wIGlzIG5vdCBudWxsCmNvbmNhdF9vcF9pZl9ub3RfbnVsbChvcHMsIG9wKSA9IHJlc3VsdCB7CiAgICBvcCA9PSBudWxsCiAgICByZXN1bHQgOj0gb3BzCn0KCmNvbmNhdF9vcF9pZl9ub3RfbnVsbChvcHMsIG9wKSA9IHJlc3VsdCB7CiAgICBvcCAhPSBudWxsCiAgICByZXN1bHQgOj0gYXJyYXkuY29uY2F0KG9wcywgW29wXSkKfQoKIyBSZWplY3QgdW5leHBlY3RlZCBhbm5vdGF0aW9ucy4KYWxsb3dfYW5ubyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19hbm5vIDE6IHN0YXJ0IikKCiAgICBub3QgaV9vY2kuQW5ub3RhdGlvbnMKCiAgICBwcmludCgiYWxsb3dfYW5ubyAxOiB0cnVlIikKfQphbGxvd19hbm5vKHBfb2NpLCBpX29jaSkgewogICAgcHJpbnQoImFsbG93X2Fubm8gMjogcCBBbm5vdGF0aW9ucyA9IiwgcF9vY2kuQW5ub3RhdGlvbnMpCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiBpIEFubm90YXRpb25zID0iLCBpX29jaS5Bbm5vdGF0aW9ucykKCiAgICBpX2tleXMgOj0gb2JqZWN0LmtleXMoaV9vY2kuQW5ub3RhdGlvbnMpCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiBpIGtleXMgPSIsIGlfa2V5cykKCiAgICBldmVyeSBpX2tleSBpbiBpX2tleXMgewogICAgICAgIGFsbG93X2Fubm9fa2V5KGlfa2V5LCBwX29jaSkKICAgIH0KCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiB0cnVlIikKfQoKYWxsb3dfYW5ub19rZXkoaV9rZXksIHBfb2NpKSB7CiAgICBwcmludCgiYWxsb3dfYW5ub19rZXkgMTogaSBrZXkgPSIsIGlfa2V5KQoKICAgIHN0YXJ0c3dpdGgoaV9rZXksICJpby5rdWJlcm5ldGVzLmNyaS4iKQoKICAgIHByaW50KCJhbGxvd19hbm5vX2tleSAxOiB0cnVlIikKfQphbGxvd19hbm5vX2tleShpX2tleSwgcF9vY2kpIHsKICAgIHByaW50KCJhbGxvd19hbm5vX2tleSAyOiBpIGtleSA9IiwgaV9rZXkpCgogICAgc29tZSBwX2tleSwgXyBpbiBwX29jaS5Bbm5vdGF0aW9ucwogICAgcF9rZXkgPT0gaV9rZXkKCiAgICBwcmludCgiYWxsb3dfYW5ub19rZXkgMjogdHJ1ZSIpCn0KCiMgR2V0IHRoZSB2YWx1ZSBvZiB0aGUgU19OQU1FX0tFWSBhbm5vdGF0aW9uIGFuZAojIGNvcnJlbGF0ZSBpdCB3aXRoIG90aGVyIGFubm90YXRpb25zIGFuZCBwcm9jZXNzIGZpZWxkcy4KYWxsb3dfYnlfYW5ubyhwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpIHsKICAgIHByaW50KCJhbGxvd19ieV9hbm5vIDE6IHN0YXJ0IikKCiAgICBub3QgcF9vY2kuQW5ub3RhdGlvbnNbU19OQU1FX0tFWV0KCiAgICBpX3NfbmFtZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMTogaV9zX25hbWUgPSIsIGlfc19uYW1lKQoKICAgIGlfc19uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FU1BBQ0VfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMTogaV9zX25hbWVzcGFjZSA9IiwgaV9zX25hbWVzcGFjZSkKCiAgICBhbGxvd19ieV9zYW5kYm94X25hbWUocF9vY2ksIGlfb2NpLCBwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBpX3NfbmFtZSwgaV9zX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfYnlfYW5ubyAxOiB0cnVlIikKfQphbGxvd19ieV9hbm5vKHBfb2NpLCBpX29jaSwgcF9zdG9yYWdlcywgaV9zdG9yYWdlcykgewogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMjogc3RhcnQiKQoKICAgIHBfc19uYW1lIDo9IHBfb2NpLkFubm90YXRpb25zW1NfTkFNRV9LRVldCiAgICBpX3NfbmFtZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMjogaV9zX25hbWUgPSIsIGlfc19uYW1lLCAicF9zX25hbWUgPSIsIHBfc19uYW1lKQoKICAgIGFsbG93X3NhbmRib3hfbmFtZShwX3NfbmFtZSwgaV9zX25hbWUpCgogICAgaV9zX25hbWVzcGFjZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwcmludCgiYWxsb3dfYnlfYW5ubyAyOiBpX3NfbmFtZXNwYWNlID0iLCBpX3NfbmFtZXNwYWNlKQoKICAgIGFsbG93X2J5X3NhbmRib3hfbmFtZShwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMsIGlfc19uYW1lLCBpX3NfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd19ieV9hbm5vIDI6IHRydWUiKQp9CgphbGxvd19ieV9zYW5kYm94X25hbWUocF9vY2ksIGlfb2NpLCBwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfYnlfc2FuZGJveF9uYW1lOiBzdGFydCIpCgogICAgaV9uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FU1BBQ0VfS0VZXQoKICAgIGFsbG93X2J5X2NvbnRhaW5lcl90eXBlcyhwX29jaSwgaV9vY2ksIHNfbmFtZSwgaV9uYW1lc3BhY2UpCiAgICBhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZChwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpCiAgICBhbGxvd19wcm9jZXNzKHBfb2NpLlByb2Nlc3MsIGlfb2NpLlByb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpCgogICAgcHJpbnQoImFsbG93X2J5X3NhbmRib3hfbmFtZTogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfbmFtZShwX3NfbmFtZSwgaV9zX25hbWUpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X25hbWU6IHN0YXJ0IikKICAgIHJlZ2V4Lm1hdGNoKHBfc19uYW1lLCBpX3NfbmFtZSkKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9uYW1lOiB0cnVlIikKfQoKIyBDaGVjayB0aGF0IHRoZSAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLXR5cGUiIGFuZAojICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIiBhbm5vdGF0aW9ucyBkZXNpZ25hdGUgdGhlCiMgZXhwZWN0ZWQgdHlwZSAtIGVpdGhlciBhICJzYW5kYm94IiBvciBhICJjb250YWluZXIiLiBUaGVuLCB2YWxpZGF0ZQojIG90aGVyIGFubm90YXRpb25zIGJhc2VkIG9uIHRoZSBhY3R1YWwgInNhbmRib3giIG9yICJjb250YWluZXIiIHZhbHVlCiMgZnJvbSB0aGUgaW5wdXQgY29udGFpbmVyLgphbGxvd19ieV9jb250YWluZXJfdHlwZXMocF9vY2ksIGlfb2NpLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfYnlfY29udGFpbmVyX3R5cGVzOiBjaGVja2luZyBpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSIpCgogICAgY190eXBlIDo9ICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSIKICAgIAogICAgcF9jcmlfdHlwZSA6PSBwX29jaS5Bbm5vdGF0aW9uc1tjX3R5cGVdCiAgICBpX2NyaV90eXBlIDo9IGlfb2NpLkFubm90YXRpb25zW2NfdHlwZV0KICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZXM6IHBfY3JpX3R5cGUgPSIsIHBfY3JpX3R5cGUsICJpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgcF9jcmlfdHlwZSA9PSBpX2NyaV90eXBlCgogICAgYWxsb3dfYnlfY29udGFpbmVyX3R5cGUoaV9jcmlfdHlwZSwgcF9vY2ksIGlfb2NpLCBzX25hbWUsIHNfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZXM6IHRydWUiKQp9CgphbGxvd19ieV9jb250YWluZXJfdHlwZShpX2NyaV90eXBlLCBwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAxOiBpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgaV9jcmlfdHlwZSA9PSAic2FuZGJveCIKCiAgICBpX2thdGFfdHlwZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1siaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5jb250YWluZXJfdHlwZSJdCiAgICBwcmludCgiYWxsb3dfYnlfY29udGFpbmVyX3R5cGUgMTogaV9rYXRhX3R5cGUgPSIsIGlfa2F0YV90eXBlKQogICAgaV9rYXRhX3R5cGUgPT0gInBvZF9zYW5kYm94IgoKICAgIGFsbG93X3NhbmRib3hfY29udGFpbmVyX25hbWUocF9vY2ksIGlfb2NpKQogICAgYWxsb3dfc2FuZGJveF9uZXRfbmFtZXNwYWNlKHBfb2NpLCBpX29jaSkKICAgIGFsbG93X3NhbmRib3hfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpCgogICAgcHJpbnQoImFsbG93X2J5X2NvbnRhaW5lcl90eXBlIDE6IHRydWUiKQp9CgphbGxvd19ieV9jb250YWluZXJfdHlwZShpX2NyaV90eXBlLCBwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiBpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgaV9jcmlfdHlwZSA9PSAiY29udGFpbmVyIgoKICAgIGlfa2F0YV90eXBlIDo9IGlfb2NpLkFubm90YXRpb25zWyJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIl0KICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiBpX2thdGFfdHlwZSA9IiwgaV9rYXRhX3R5cGUpCiAgICBpX2thdGFfdHlwZSA9PSAicG9kX2NvbnRhaW5lciIKCiAgICBhbGxvd19jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpCiAgICBhbGxvd19uZXRfbmFtZXNwYWNlKHBfb2NpLCBpX29jaSkKICAgIGFsbG93X2xvZ19kaXJlY3RvcnkocF9vY2ksIGlfb2NpKQoKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiB0cnVlIikKfQoKIyAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLW5hbWUiIGFubm90YXRpb24KYWxsb3dfc2FuZGJveF9jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X2NvbnRhaW5lcl9uYW1lOiBzdGFydCIpCgogICAgY29udGFpbmVyX2Fubm90YXRpb25fbWlzc2luZyhwX29jaSwgaV9vY2ksICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItbmFtZSIpCgogICAgcHJpbnQoImFsbG93X3NhbmRib3hfY29udGFpbmVyX25hbWU6IHRydWUiKQp9CgphbGxvd19jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19jb250YWluZXJfbmFtZTogc3RhcnQiKQoKICAgIGFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uKHBfb2NpLCBpX29jaSwgImlvLmt1YmVybmV0ZXMuY3JpLmNvbnRhaW5lci1uYW1lIikKCiAgICBwcmludCgiYWxsb3dfY29udGFpbmVyX25hbWU6IHRydWUiKQp9Cgpjb250YWluZXJfYW5ub3RhdGlvbl9taXNzaW5nKHBfb2NpLCBpX29jaSwga2V5KSB7CiAgICBwcmludCgiY29udGFpbmVyX2Fubm90YXRpb25fbWlzc2luZzoiLCBrZXkpCgogICAgbm90IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIG5vdCBpX29jaS5Bbm5vdGF0aW9uc1trZXldCgogICAgcHJpbnQoImNvbnRhaW5lcl9hbm5vdGF0aW9uX21pc3Npbmc6IHRydWUiKQp9CgphbGxvd19jb250YWluZXJfYW5ub3RhdGlvbihwX29jaSwgaV9vY2ksIGtleSkgewogICAgcHJpbnQoImFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uOiBrZXkgPSIsIGtleSkKCiAgICBwX3ZhbHVlIDo9IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIGlfdmFsdWUgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgcHJpbnQoImFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uOiBwX3ZhbHVlID0iLCBwX3ZhbHVlLCAiaV92YWx1ZSA9IiwgaV92YWx1ZSkKCiAgICBwX3ZhbHVlID09IGlfdmFsdWUKCiAgICBwcmludCgiYWxsb3dfY29udGFpbmVyX2Fubm90YXRpb246IHRydWUiKQp9CgojICJuZXJkY3RsL25ldHdvcmstbmFtZXNwYWNlIiBhbm5vdGF0aW9uCmFsbG93X3NhbmRib3hfbmV0X25hbWVzcGFjZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X25ldF9uYW1lc3BhY2U6IHN0YXJ0IikKCiAgICBrZXkgOj0gIm5lcmRjdGwvbmV0d29yay1uYW1lc3BhY2UiCgogICAgcF9uYW1lc3BhY2UgOj0gcF9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgaV9uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgcHJpbnQoImFsbG93X3NhbmRib3hfbmV0X25hbWVzcGFjZTogcF9uYW1lc3BhY2UgPSIsIHBfbmFtZXNwYWNlLCAiaV9uYW1lc3BhY2UgPSIsIGlfbmFtZXNwYWNlKQoKICAgIHJlZ2V4Lm1hdGNoKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9uZXRfbmFtZXNwYWNlOiB0cnVlIikKfQoKYWxsb3dfbmV0X25hbWVzcGFjZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19uZXRfbmFtZXNwYWNlOiBzdGFydCIpCgogICAga2V5IDo9ICJuZXJkY3RsL25ldHdvcmstbmFtZXNwYWNlIgoKICAgIG5vdCBwX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICBub3QgaV9vY2kuQW5ub3RhdGlvbnNba2V5XQoKICAgIHByaW50KCJhbGxvd19uZXRfbmFtZXNwYWNlOiB0cnVlIikKfQoKIyAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1sb2ctZGlyZWN0b3J5IiBhbm5vdGF0aW9uCmFsbG93X3NhbmRib3hfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X2xvZ19kaXJlY3Rvcnk6IHN0YXJ0IikKCiAgICBrZXkgOj0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbG9nLWRpcmVjdG9yeSIKCiAgICBwX2RpciA6PSBwX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICByZWdleDEgOj0gcmVwbGFjZShwX2RpciwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHJlZ2V4MiA6PSByZXBsYWNlKHJlZ2V4MSwgIiQoc2FuZGJveC1uYW1lc3BhY2UpIiwgc19uYW1lc3BhY2UpCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiByZWdleDIgPSIsIHJlZ2V4MikKCiAgICBpX2RpciA6PSBpX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiBpX2RpciA9IiwgaV9kaXIpCgogICAgcmVnZXgubWF0Y2gocmVnZXgyLCBpX2RpcikKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiB0cnVlIikKfQoKYWxsb3dfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19sb2dfZGlyZWN0b3J5OiBzdGFydCIpCgogICAga2V5IDo9ICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWxvZy1kaXJlY3RvcnkiCgogICAgbm90IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIG5vdCBpX29jaS5Bbm5vdGF0aW9uc1trZXldCgogICAgcHJpbnQoImFsbG93X2xvZ19kaXJlY3Rvcnk6IHRydWUiKQp9CgphbGxvd19kZXZpY2VzKHBfZGV2aWNlcywgaV9kZXZpY2VzKSB7CiAgICBwcmludCgiYWxsb3dfZGV2aWNlczogc3RhcnQiKQogICAgZXZlcnkgaV9kZXZpY2UgaW4gaV9kZXZpY2VzIHsKICAgICAgICBwcmludCgiYWxsb3dfZGV2aWNlczogaV9kZXZpY2UgPSIsIGlfZGV2aWNlKQogICAgICAgIHNvbWUgcF9kZXZpY2UgaW4gcF9kZXZpY2VzCiAgICAgICAgcF9kZXZpY2UuY29udGFpbmVyX3BhdGggPT0gaV9kZXZpY2UuY29udGFpbmVyX3BhdGgKICAgIH0KICAgIHByaW50KCJhbGxvd19kZXZpY2VzOiB0cnVlIikKfQoKYWxsb3dfbGludXgoc3RhdGVfb3BzLCBwX29jaSwgaV9vY2kpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIHBfbmFtZXNwYWNlcyA6PSBwX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbGludXg6IHAgbmFtZXNwYWNlcyA9IiwgcF9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlcyA6PSBpX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbGludXg6IGkgbmFtZXNwYWNlcyA9IiwgaV9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlX3dpdGhvdXRfbmV0d29yayA6PSBbb2JqIHwgb2JqIDo9IGlfbmFtZXNwYWNlc1tfXTsgb2JqLlR5cGUgIT0gIm5ldHdvcmsiXQoKICAgIHByaW50KCJhbGxvd19saW51eDogaV9uYW1lc3BhY2Vfd2l0aG91dF9uZXR3b3JrID0iLCBpX25hbWVzcGFjZV93aXRob3V0X25ldHdvcmspCgogICAgcF9uYW1lc3BhY2VzID09IGlfbmFtZXNwYWNlX3dpdGhvdXRfbmV0d29yawoKICAgIGFsbG93X21hc2tlZF9wYXRocyhwX29jaSwgaV9vY2kpCiAgICBhbGxvd19yZWFkb25seV9wYXRocyhwX29jaSwgaV9vY2kpCiAgICBhbGxvd19saW51eF9kZXZpY2VzKHBfb2NpLkxpbnV4LkRldmljZXMsIGlfb2NpLkxpbnV4LkRldmljZXMpCiAgICBhbGxvd19saW51eF9zeXNjdGwocF9vY2kuTGludXgsIGlfb2NpLkxpbnV4KQogICAgcmV0IDo9IGFsbG93X25ldHdvcmtfbmFtZXNwYWNlX3N0YXJ0KHN0YXRlX29wcywgcF9vY2ksIGlfb2NpKQogICAgcmV0LmFsbG93ZWQKCiAgICBvcHMgOj0gcmV0Lm9wcwoKICAgIHByaW50KCJhbGxvd19saW51eDogdHJ1ZSIpCn0KCiMgUmV0cmlldmUgdGhlICJuZXR3b3JrIiBuYW1lc3BhY2UgZnJvbSB0aGUgaW5wdXQgZGF0YSBhbmQgcGFzcyBpdCBvbiBmb3IgdGhlCiMgbmV0d29yayBuYW1lc3BhY2UgcG9saWN5IGNoZWNrcy4KYWxsb3dfbmV0d29ya19uYW1lc3BhY2Vfc3RhcnQoc3RhdGVfb3BzLCBwX29jaSwgaV9vY2kpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIHByaW50KCJhbGxvd19uZXR3b3JrX25hbWVzcGFjZSBzdGFydDogc3RhcnQiKQoKICAgIHBfbmFtZXNwYWNlcyA6PSBwX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IHAgbmFtZXNwYWNlcyA9IiwgcF9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlcyA6PSBpX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IGkgbmFtZXNwYWNlcyA9IiwgaV9uYW1lc3BhY2VzKQoKICAgICMgUmV0dXJuIHBhdGggb2YgdGhlICJuZXR3b3JrIiBuYW1lc3BhY2UKICAgIG5ldHdvcmtfbnMgOj0gW29iaiB8IG9iaiA6PSBpX25hbWVzcGFjZXNbX107IG9iai5UeXBlID09ICJuZXR3b3JrIl0KCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IG5ldHdvcmtfbnMgPSIsIG5ldHdvcmtfbnMpCgogICAgcmV0IDo9IGFsbG93X25ldHdvcmtfbmFtZXNwYWNlKHN0YXRlX29wcywgbmV0d29ya19ucykKICAgIHJldC5hbGxvd2VkCgogICAgb3BzIDo9IHJldC5vcHMKfQoKIyBUaGlzIHJ1bGUgaXMgd2hlbiB0aGVyZSdzIG5vIG5ldHdvcmsgbmFtZXNwYWNlIGluIHRoZSBpbnB1dCBkYXRhLgphbGxvd19uZXR3b3JrX25hbWVzcGFjZShzdGF0ZV9vcHMsIG5ldHdvcmtfbnMpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIGNvdW50KG5ldHdvcmtfbnMpID09IDAKCiAgICBuZXR3b3JrX25zX3BhdGggPSAiIgoKICAgIGFkZF9uZXR3b3JrX25hbWVzcGFjZV90b19zdGF0ZSA6PSBzdGF0ZV9hbGxvd3MoIm5ldHdvcmtfbmFtZXNwYWNlIiwgbmV0d29ya19uc19wYXRoKQogICAgb3BzIDo9IGNvbmNhdF9vcF9pZl9ub3RfbnVsbChzdGF0ZV9vcHMsIGFkZF9uZXR3b3JrX25hbWVzcGFjZV90b19zdGF0ZSkKCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2UgMTogdHJ1ZSIpCn0KCiMgVGhpcyBydWxlIGlzIHdoZW4gdGhlcmUncyBleGFjdGx5IG9uZSBuZXR3b3JrIG5hbWVzcGFjZSBpbiB0aGUgaW5wdXQgZGF0YS4KYWxsb3dfbmV0d29ya19uYW1lc3BhY2Uoc3RhdGVfb3BzLCBuZXR3b3JrX25zKSA6PSB7Im9wcyI6IG9wcywgImFsbG93ZWQiOiB0cnVlfSB7CiAgICBjb3VudChuZXR3b3JrX25zKSA9PSAxCgogICAgYWRkX25ldHdvcmtfbmFtZXNwYWNlX3RvX3N0YXRlIDo9IHN0YXRlX2FsbG93cygibmV0d29ya19uYW1lc3BhY2UiLCBuZXR3b3JrX25zWzBdLlBhdGgpCiAgICBvcHMgOj0gY29uY2F0X29wX2lmX25vdF9udWxsKHN0YXRlX29wcywgYWRkX25ldHdvcmtfbmFtZXNwYWNlX3RvX3N0YXRlKQoKICAgIHByaW50KCJhbGxvd19uZXR3b3JrX25hbWVzcGFjZSAyOiB0cnVlIikKfQoKYWxsb3dfbWFza2VkX3BhdGhzKHBfb2NpLCBpX29jaSkgewogICAgcF9wYXRocyA6PSBwX29jaS5MaW51eC5NYXNrZWRQYXRocwogICAgcHJpbnQoImFsbG93X21hc2tlZF9wYXRocyAxOiBwX3BhdGhzID0iLCBwX3BhdGhzKQoKICAgIGlfcGF0aHMgOj0gaV9vY2kuTGludXguTWFza2VkUGF0aHMKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aHMgMTogaV9wYXRocyA9IiwgaV9wYXRocykKCiAgICBhbGxvd19tYXNrZWRfcGF0aHNfYXJyYXkocF9wYXRocywgaV9wYXRocykKCiAgICBwcmludCgiYWxsb3dfbWFza2VkX3BhdGhzIDE6IHRydWUiKQp9CmFsbG93X21hc2tlZF9wYXRocyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aHMgMjogc3RhcnQiKQoKICAgIG5vdCBwX29jaS5MaW51eC5NYXNrZWRQYXRocwogICAgbm90IGlfb2NpLkxpbnV4Lk1hc2tlZFBhdGhzCgogICAgcHJpbnQoImFsbG93X21hc2tlZF9wYXRocyAyOiB0cnVlIikKfQoKIyBBbGwgdGhlIHBvbGljeSBtYXNrZWQgcGF0aHMgbXVzdCBiZSBtYXNrZWQgaW4gdGhlIGlucHV0IGRhdGEgdG9vLgojIElucHV0IGlzIGFsbG93ZWQgdG8gaGF2ZSBtb3JlIG1hc2tlZCBwYXRocyB0aGFuIHRoZSBwb2xpY3kuCmFsbG93X21hc2tlZF9wYXRoc19hcnJheShwX2FycmF5LCBpX2FycmF5KSB7CiAgICBldmVyeSBwX2VsZW0gaW4gcF9hcnJheSB7CiAgICAgICAgYWxsb3dfbWFza2VkX3BhdGgocF9lbGVtLCBpX2FycmF5KQogICAgfQp9CgphbGxvd19tYXNrZWRfcGF0aChwX2VsZW0sIGlfYXJyYXkpIHsKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aDogcF9lbGVtID0iLCBwX2VsZW0pCgogICAgc29tZSBpX2VsZW0gaW4gaV9hcnJheQogICAgcF9lbGVtID09IGlfZWxlbQoKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aDogdHJ1ZSIpCn0KCmFsbG93X3JlYWRvbmx5X3BhdGhzKHBfb2NpLCBpX29jaSkgewogICAgcF9wYXRocyA6PSBwX29jaS5MaW51eC5SZWFkb25seVBhdGhzCiAgICBwcmludCgiYWxsb3dfcmVhZG9ubHlfcGF0aHMgMTogcF9wYXRocyA9IiwgcF9wYXRocykKCiAgICBpX3BhdGhzIDo9IGlfb2NpLkxpbnV4LlJlYWRvbmx5UGF0aHMKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAxOiBpX3BhdGhzID0iLCBpX3BhdGhzKQoKICAgIGFsbG93X3JlYWRvbmx5X3BhdGhzX2FycmF5KHBfcGF0aHMsIGlfcGF0aHMsIGlfb2NpLkxpbnV4Lk1hc2tlZFBhdGhzKQoKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAxOiB0cnVlIikKfQphbGxvd19yZWFkb25seV9wYXRocyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAyOiBzdGFydCIpCgogICAgbm90IHBfb2NpLkxpbnV4LlJlYWRvbmx5UGF0aHMKICAgIG5vdCBpX29jaS5MaW51eC5SZWFkb25seVBhdGhzCgogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGhzIDI6IHRydWUiKQp9CgojIEFsbCB0aGUgcG9saWN5IHJlYWRvbmx5IHBhdGhzIG11c3QgYmUgZWl0aGVyOgojIC0gUHJlc2VudCBpbiB0aGUgaW5wdXQgcmVhZG9ubHkgcGF0aHMsIG9yCiMgLSBQcmVzZW50IGluIHRoZSBpbnB1dCBtYXNrZWQgcGF0aHMuCiMgSW5wdXQgaXMgYWxsb3dlZCB0byBoYXZlIG1vcmUgcmVhZG9ubHkgcGF0aHMgdGhhbiB0aGUgcG9saWN5LgphbGxvd19yZWFkb25seV9wYXRoc19hcnJheShwX2FycmF5LCBpX2FycmF5LCBtYXNrZWRfcGF0aHMpIHsKICAgIGV2ZXJ5IHBfZWxlbSBpbiBwX2FycmF5IHsKICAgICAgICBhbGxvd19yZWFkb25seV9wYXRoKHBfZWxlbSwgaV9hcnJheSwgbWFza2VkX3BhdGhzKQogICAgfQp9CgphbGxvd19yZWFkb25seV9wYXRoKHBfZWxlbSwgaV9hcnJheSwgbWFza2VkX3BhdGhzKSB7CiAgICBwcmludCgiYWxsb3dfcmVhZG9ubHlfcGF0aCAxOiBwX2VsZW0gPSIsIHBfZWxlbSkKCiAgICBzb21lIGlfZWxlbSBpbiBpX2FycmF5CiAgICBwX2VsZW0gPT0gaV9lbGVtCgogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGggMTogdHJ1ZSIpCn0KYWxsb3dfcmVhZG9ubHlfcGF0aChwX2VsZW0sIGlfYXJyYXksIG1hc2tlZF9wYXRocykgewogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGggMjogcF9lbGVtID0iLCBwX2VsZW0pCgogICAgc29tZSBpX21hc2tlZCBpbiBtYXNrZWRfcGF0aHMKICAgIHBfZWxlbSA9PSBpX21hc2tlZAoKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRoIDI6IHRydWUiKQp9CgphbGxvd19saW51eF9kZXZpY2VzKHBfZGV2aWNlcywgaV9kZXZpY2VzKSB7CiAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogc3RhcnQiKQogICAgZXZlcnkgaV9kZXZpY2UgaW4gaV9kZXZpY2VzIHsKICAgICAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogaV9kZXZpY2UgPSIsIGlfZGV2aWNlKQogICAgICAgIHNvbWUgcF9kZXZpY2UgaW4gcF9kZXZpY2VzCiAgICAgICAgaV9kZXZpY2UuUGF0aCA9PSBwX2RldmljZS5QYXRoCiAgICB9CiAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogdHJ1ZSIpCn0KCmFsbG93X2xpbnV4X3N5c2N0bChwX2xpbnV4LCBpX2xpbnV4KSB7CiAgICBwcmludCgiYWxsb3dfbGludXhfc3lzY3RsIDE6IHN0YXJ0IikKICAgIG5vdCBpX2xpbnV4LlN5c2N0bAogICAgcHJpbnQoImFsbG93X2xpbnV4X3N5c2N0bCAxOiB0cnVlIikKfQoKYWxsb3dfbGludXhfc3lzY3RsKHBfbGludXgsIGlfbGludXgpIHsKICAgIHByaW50KCJhbGxvd19saW51eF9zeXNjdGwgMjogc3RhcnQiKQogICAgcF9zeXNjdGwgOj0gcF9saW51eC5TeXNjdGwKICAgIGlfc3lzY3RsIDo9IGlfbGludXguU3lzY3RsCiAgICBldmVyeSBpX25hbWUsIGlfdmFsIGluIGlfc3lzY3RsIHsKICAgICAgICBwcmludCgiYWxsb3dfbGludXhfc3lzY3RsIDI6IGlfbmFtZSA9IiwgaV9uYW1lLCAiaV92YWwgPSIsIGlfdmFsKQogICAgICAgIHBfc3lzY3RsW2lfbmFtZV0gPT0gaV92YWwKICAgIH0KICAgIHByaW50KCJhbGxvd19saW51eF9zeXNjdGwgMjogdHJ1ZSIpCn0KCiMgQ2hlY2sgdGhlIGNvbnNpc3RlbmN5IG9mIHRoZSBpbnB1dCAiaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5idW5kbGVfcGF0aCIKIyBhbmQgaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCIgdmFsdWVzIHdpdGggb3RoZXIgZmllbGRzLgphbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZChwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpIHsKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogc3RhcnQiKQoKICAgIGJ1bmRsZV9wYXRoIDo9IGlfb2NpLkFubm90YXRpb25zWyJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmJ1bmRsZV9wYXRoIl0KICAgIGJ1bmRsZV9pZCA6PSByZXBsYWNlKGJ1bmRsZV9wYXRoLCAiL3J1bi9jb250YWluZXJkL2lvLmNvbnRhaW5lcmQucnVudGltZS52Mi50YXNrL2s4cy5pby8iLCAiIikKCiAgICBidW5kbGVfaWRfZm9ybWF0IDo9IGNvbmNhdCgiIiwgWyJeIiwgQlVORExFX0lELCAiJCJdKQogICAgcmVnZXgubWF0Y2goYnVuZGxlX2lkX2Zvcm1hdCwgYnVuZGxlX2lkKQoKICAgIGtleSA6PSAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCIKCiAgICBwX3JlZ2V4IDo9IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIHNhbmRib3hfaWQgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQoKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogc2FuZGJveF9pZCA9Iiwgc2FuZGJveF9pZCwgInJlZ2V4ID0iLCBwX3JlZ2V4KQogICAgcmVnZXgubWF0Y2gocF9yZWdleCwgc2FuZGJveF9pZCkKCiAgICBhbGxvd19yb290X3BhdGgocF9vY2ksIGlfb2NpLCBidW5kbGVfaWQpCgogICAgZXZlcnkgaV9tb3VudCBpbiBpX29jaS5Nb3VudHMgewogICAgICAgIGFsbG93X21vdW50KHBfb2NpLCBpX21vdW50LCBpX3N0b3JhZ2VzLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpCiAgICB9CgogICAgYWxsb3dfc3RvcmFnZXMocF9zdG9yYWdlcywgaV9zdG9yYWdlcywgYnVuZGxlX2lkLCBzYW5kYm94X2lkKQoKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogdHJ1ZSIpCn0KCmFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHBfcHJvY2VzcyA9IiwgcF9wcm9jZXNzKQogICAgcHJpbnQoImFsbG93X3Byb2Nlc3NfY29tbW9uOiBpX3Byb2Nlc3MgPSAiLCBpX3Byb2Nlc3MpCiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHNfbmFtZSA9Iiwgc19uYW1lKQoKICAgIHBfcHJvY2Vzcy5Dd2QgPT0gaV9wcm9jZXNzLkN3ZAogICAgcF9wcm9jZXNzLk5vTmV3UHJpdmlsZWdlcyA9PSBpX3Byb2Nlc3MuTm9OZXdQcml2aWxlZ2VzCgogICAgYWxsb3dfdXNlcihwX3Byb2Nlc3MsIGlfcHJvY2VzcykKICAgIGFsbG93X2VudihwX3Byb2Nlc3MsIGlfcHJvY2Vzcywgc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHRydWUiKQp9CgojIENvbXBhcmUgdGhlIE9DSSBQcm9jZXNzIGZpZWxkIG9mIGEgcG9saWN5IGNvbnRhaW5lciB3aXRoIHRoZSBpbnB1dCBPQ0kgUHJvY2VzcyBmcm9tIGEgQ3JlYXRlQ29udGFpbmVyUmVxdWVzdAphbGxvd19wcm9jZXNzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfcHJvY2Vzczogc3RhcnQiKQoKICAgIGFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgYWxsb3dfY2FwcyhwX3Byb2Nlc3MuQ2FwYWJpbGl0aWVzLCBpX3Byb2Nlc3MuQ2FwYWJpbGl0aWVzKQogICAgcF9wcm9jZXNzLlRlcm1pbmFsID09IGlfcHJvY2Vzcy5UZXJtaW5hbAoKICAgIHByaW50KCJhbGxvd19wcm9jZXNzOiB0cnVlIikKfQoKIyBDb21wYXJlIHRoZSBPQ0kgUHJvY2VzcyBmaWVsZCBvZiBhIHBvbGljeSBjb250YWluZXIgd2l0aCB0aGUgaW5wdXQgcHJvY2VzcyBmaWVsZCBmcm9tIEV4ZWNQcm9jZXNzUmVxdWVzdAphbGxvd19pbnRlcmFjdGl2ZV9wcm9jZXNzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfaW50ZXJhY3RpdmVfcHJvY2Vzczogc3RhcnQiKQoKICAgIGFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgYWxsb3dfZXhlY19jYXBzKGlfcHJvY2Vzcy5DYXBhYmlsaXRpZXMpCgogICAgIyBUaGVzZSBhcmUgY29tbWFuZHMgZW5hYmxlZCB1c2luZyBFeGVjUHJvY2Vzc1JlcXVlc3QgY29tbWFuZHMgYW5kL29yIHJlZ2V4IGZyb20gdGhlIHNldHRpbmdzIGZpbGUuCiAgICAjIFRoZXkgY2FuIGJlIGV4ZWN1dGVkIGludGVyYWN0aXZlbHkgc28gYWxsb3cgdGhlbSB0byB1c2UgYW55IHZhbHVlIGZvciBpX3Byb2Nlc3MuVGVybWluYWwuCgogICAgcHJpbnQoImFsbG93X2ludGVyYWN0aXZlX3Byb2Nlc3M6IHRydWUiKQp9CgojIENvbXBhcmUgdGhlIE9DSSBQcm9jZXNzIGZpZWxkIG9mIGEgcG9saWN5IGNvbnRhaW5lciB3aXRoIHRoZSBpbnB1dCBwcm9jZXNzIGZpZWxkIGZyb20gRXhlY1Byb2Nlc3NSZXF1ZXN0CmFsbG93X3Byb2JlX3Byb2Nlc3MocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19wcm9iZV9wcm9jZXNzOiBzdGFydCIpCgogICAgYWxsb3dfcHJvY2Vzc19jb21tb24ocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpCiAgICBhbGxvd19leGVjX2NhcHMoaV9wcm9jZXNzLkNhcGFiaWxpdGllcykKICAgIHBfcHJvY2Vzcy5UZXJtaW5hbCA9PSBpX3Byb2Nlc3MuVGVybWluYWwKCiAgICBwcmludCgiYWxsb3dfcHJvYmVfcHJvY2VzczogdHJ1ZSIpCn0KCmFsbG93X3VzZXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MpIHsKICAgIHBfdXNlciA6PSBwX3Byb2Nlc3MuVXNlcgogICAgaV91c2VyIDo9IGlfcHJvY2Vzcy5Vc2VyCgogICAgcHJpbnQoImFsbG93X3VzZXI6IGlucHV0IHVpZCA9IiwgaV91c2VyLlVJRCwgInBvbGljeSB1aWQgPSIsIHBfdXNlci5VSUQpCiAgICBwX3VzZXIuVUlEID09IGlfdXNlci5VSUQKCiAgICAjIFRPRE86IHRyYWNrIGRvd24gdGhlIHJlYXNvbiBmb3IgcmVnaXN0cnkuazhzLmlvL3BhdXNlOjMuOSBiZWluZwogICAgIyAgICAgICBleGVjdXRlZCB3aXRoIGdpZCA9IDAgZGVzcGl0ZSBoYXZpbmcgIjY1NTM1OjY1NTM1IiBpbiBpdHMgY29udGFpbmVyIGltYWdlCiAgICAjICAgICAgIGNvbmZpZy4KICAgICNwcmludCgiYWxsb3dfdXNlcjogaW5wdXQgZ2lkID0iLCBpX3VzZXIuR0lELCAicG9saWN5IGdpZCA9IiwgcF91c2VyLkdJRCkKICAgICNwX3VzZXIuR0lEID09IGlfdXNlci5HSUQKCiAgICAjIFRPRE86IGNvbXBhcmUgdGhlIGFkZGl0aW9uYWxHaWRzIGZpZWxkIHRvbyBhZnRlciBjb21wdXRpbmcgaXRzIHZhbHVlCiAgICAjIGJhc2VkIG9uIC9ldGMvcGFzc3dkIGFuZCAvZXRjL2dyb3VwIGZyb20gdGhlIGNvbnRhaW5lciBpbWFnZS4KfQoKYWxsb3dfZGVwcmVjYXRlZF9hcmdzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZ3MgMTogbm8gYXJncyIpCgogICAgbm90IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJncwogICAgbm90IGlfcHJvY2Vzcy5BcmdzCgogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAxOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZ3MocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSkgewogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiBwb2xpY3kgYXJncyA9IiwgcF9wcm9jZXNzLkRlcHJlY2F0ZWRBcmdzKQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiBpbnB1dCBhcmdzID0iLCBpX3Byb2Nlc3MuQXJncykKCiAgICBjb3VudChwX3Byb2Nlc3MuRGVwcmVjYXRlZEFyZ3MpID09IGNvdW50KGlfcHJvY2Vzcy5BcmdzKQoKICAgIGV2ZXJ5IGksIGlfYXJnIGluIGlfcHJvY2Vzcy5BcmdzIHsKICAgICAgICBhbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpCiAgICB9CgogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDE6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgcF9hcmcyIDo9IHJlcGxhY2UocF9hcmcsICIkJCIsICIkIikKICAgIHBfYXJnMiA9PSBpX2FyZwoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAxOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDI6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgIyBUT0RPOiBjYW4gJChub2RlLW5hbWUpIGJlIGhhbmRsZWQgYmV0dGVyPwogICAgY29udGFpbnMocF9hcmcsICIkKG5vZGUtbmFtZSkiKQoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAyOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDM6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgcF9hcmcyIDo9IHJlcGxhY2UocF9hcmcsICIkJCIsICIkIikKICAgIHBfYXJnMyA6PSByZXBsYWNlKHBfYXJnMiwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAzOiBwX2FyZzMgPSIsIHBfYXJnMykKICAgIHBfYXJnMyA9PSBpX2FyZwoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAzOiB0cnVlIikKfQoKIyBPQ0kgcHJvY2Vzcy5FbnYgZmllbGQKYWxsb3dfZW52KHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfZW52OiBwIGVudiA9IiwgcF9wcm9jZXNzLkVudikKICAgIHByaW50KCJhbGxvd19lbnY6IGkgZW52ID0iLCBpX3Byb2Nlc3MuRW52KQoKICAgIGV2ZXJ5IGlfdmFyIGluIGlfcHJvY2Vzcy5FbnYgewogICAgICAgIHByaW50KCJhbGxvd19lbnY6IGlfdmFyID0iLCBpX3ZhcikKICAgICAgICBhbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgfQoKICAgIHByaW50KCJhbGxvd19lbnY6IHRydWUiKQp9CgojIEFsbG93IGlucHV0IGVudiB2YXJpYWJsZXMgdGhhdCBhcmUgcHJlc2VudCBpbiB0aGUgcG9saWN5IGRhdGEgdG9vLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHBfdmFyID09IGlfdmFyCiAgICBwcmludCgiYWxsb3dfdmFyIDE6IHRydWUiKQp9CgojIE1hdGNoIGlucHV0IHdpdGggb25lIG9mIHRoZSBwb2xpY3kgdmFyaWFibGVzLCBhZnRlciBzdWJzdGl0dXRpbmcgJChzYW5kYm94LW5hbWUpLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHByaW50KCJhbGxvd192YXIgMjogcF92YXIgPSIsIHBfdmFyKQoKICAgIHBfdmFyX3NwbGl0IDo9IHNwbGl0KHBfdmFyLCAiPSIpCiAgICBjb3VudChwX3Zhcl9zcGxpdCkgPT0gMgoKICAgIHBfdmFyX3NwbGl0WzFdID09ICIkKHNhbmRib3gtbmFtZSkiCgogICAgaV92YXJfc3BsaXQgOj0gc3BsaXQoaV92YXIsICI9IikKICAgIGNvdW50KGlfdmFyX3NwbGl0KSA9PSAyCgogICAgaV92YXJfc3BsaXRbMF0gPT0gcF92YXJfc3BsaXRbMF0KICAgIHJlZ2V4Lm1hdGNoKHNfbmFtZSwgaV92YXJfc3BsaXRbMV0pCgogICAgcHJpbnQoImFsbG93X3ZhciAyOiB0cnVlIikKfQoKIyBBbGxvdyBpbnB1dCBlbnYgdmFyaWFibGVzIHRoYXQgbWF0Y2ggd2l0aCBhIHJlcXVlc3RfZGVmYXVsdHMgcmVnZXguCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHNvbWUgcF9yZWdleDEgaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5DcmVhdGVDb250YWluZXJSZXF1ZXN0LmFsbG93X2Vudl9yZWdleAogICAgcF9yZWdleDIgOj0gcmVwbGFjZShwX3JlZ2V4MSwgIiQoaXB2NF9hKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcHY0X2EpCiAgICBwX3JlZ2V4MyA6PSByZXBsYWNlKHBfcmVnZXgyLCAiJChpcF9wKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcF9wKQogICAgcF9yZWdleDQgOj0gcmVwbGFjZShwX3JlZ2V4MywgIiQoc3ZjX25hbWUpIiwgcG9saWN5X2RhdGEuY29tbW9uLnN2Y19uYW1lKQogICAgcF9yZWdleDUgOj0gcmVwbGFjZShwX3JlZ2V4NCwgIiQoZG5zX2xhYmVsKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5kbnNfbGFiZWwpCgogICAgcHJpbnQoImFsbG93X3ZhciAzOiBwX3JlZ2V4NSA9IiwgcF9yZWdleDUpCiAgICByZWdleC5tYXRjaChwX3JlZ2V4NSwgaV92YXIpCgogICAgcHJpbnQoImFsbG93X3ZhciAzOiB0cnVlIikKfQoKIyBBbGxvdyBmaWVsZFJlZiAiZmllbGRQYXRoOiBzdGF0dXMucG9kSVAiIHZhbHVlcy4KYWxsb3dfdmFyKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBpX3Zhciwgc19uYW1lLCBzX25hbWVzcGFjZSkgewogICAgbmFtZV92YWx1ZSA6PSBzcGxpdChpX3ZhciwgIj0iKQogICAgY291bnQobmFtZV92YWx1ZSkgPT0gMgogICAgaXNfaXAobmFtZV92YWx1ZVsxXSkKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIGFsbG93X3BvZF9pcF92YXIobmFtZV92YWx1ZVswXSwgcF92YXIpCgogICAgcHJpbnQoImFsbG93X3ZhciA0OiB0cnVlIikKfQoKIyBBbGxvdyBjb21tb24gZmllbGRSZWYgdmFyaWFibGVzLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBuYW1lX3ZhbHVlIDo9IHNwbGl0KGlfdmFyLCAiPSIpCiAgICBjb3VudChuYW1lX3ZhbHVlKSA9PSAyCgogICAgc29tZSBwX3ZhciBpbiBwX3Byb2Nlc3MuRW52CiAgICBwX25hbWVfdmFsdWUgOj0gc3BsaXQocF92YXIsICI9IikKICAgIGNvdW50KHBfbmFtZV92YWx1ZSkgPT0gMgoKICAgIHBfbmFtZV92YWx1ZVswXSA9PSBuYW1lX3ZhbHVlWzBdCgogICAgIyBUT0RPOiBzaG91bGQgdGhlc2UgYmUgaGFuZGxlZCBpbiBhIGRpZmZlcmVudCB3YXk/CiAgICBhbHdheXNfYWxsb3dlZCA6PSBbIiQoaG9zdC1uYW1lKSIsICIkKG5vZGUtbmFtZSkiLCAiJChwb2QtdWlkKSJdCiAgICBzb21lIGFsbG93ZWQgaW4gYWx3YXlzX2FsbG93ZWQKICAgIGNvbnRhaW5zKHBfbmFtZV92YWx1ZVsxXSwgYWxsb3dlZCkKCiAgICBwcmludCgiYWxsb3dfdmFyIDU6IHRydWUiKQp9CgojIEFsbG93IGZpZWxkUmVmICJmaWVsZFBhdGg6IHN0YXR1cy5ob3N0SVAiIHZhbHVlcy4KYWxsb3dfdmFyKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBpX3Zhciwgc19uYW1lLCBzX25hbWVzcGFjZSkgewogICAgbmFtZV92YWx1ZSA6PSBzcGxpdChpX3ZhciwgIj0iKQogICAgY291bnQobmFtZV92YWx1ZSkgPT0gMgogICAgaXNfaXAobmFtZV92YWx1ZVsxXSkKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIGFsbG93X2hvc3RfaXBfdmFyKG5hbWVfdmFsdWVbMF0sIHBfdmFyKQoKICAgIHByaW50KCJhbGxvd192YXIgNjogdHJ1ZSIpCn0KCiMgQWxsb3cgcmVzb3VyY2VGaWVsZFJlZiB2YWx1ZXMgKGUuZy4sICJsaW1pdHMuY3B1IikuCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIG5hbWVfdmFsdWUgOj0gc3BsaXQoaV92YXIsICI9IikKICAgIGNvdW50KG5hbWVfdmFsdWUpID09IDIKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHBfbmFtZV92YWx1ZSA6PSBzcGxpdChwX3ZhciwgIj0iKQogICAgY291bnQocF9uYW1lX3ZhbHVlKSA9PSAyCgogICAgcF9uYW1lX3ZhbHVlWzBdID09IG5hbWVfdmFsdWVbMF0KCiAgICAjIGEgdmFyaWFibGUgd2Ugc2hvdWxkIGJlIHZhbGlkYXRpbmcgdXNpbmcgYSByZWdleCBmcm9tIHNldHRpbmdzCiAgICBwX25hbWVfdmFsdWVbMV0gPT0gIiQodmFsaWRhdGUtZnJvbS1zZXR0aW5ncykiCgogICAgcmVnZXhfdmFsIDo9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuQ3JlYXRlQ29udGFpbmVyUmVxdWVzdC5hbGxvd19lbnZfcmVnZXhfbWFwW25hbWVfdmFsdWVbMF1dCgogICAgcHJpbnQoImFsbG93X3ZhciA3OiB2YWwgPSIsIG5hbWVfdmFsdWVbMV0pCiAgICBwcmludCgiYWxsb3dfdmFyIDc6IHJlZ2V4X3ZhbCA9IiwgcmVnZXhfdmFsKQoKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4X3ZhbCwgbmFtZV92YWx1ZVsxXSkKCiAgICBwcmludCgiYWxsb3dfdmFyIDc6IHRydWUiKQp9CgojIE1hdGNoIGlucHV0IHdpdGggb25lIG9mIHRoZSBwb2xpY3kgdmFyaWFibGVzLCBhZnRlciBzdWJzdGl0dXRpbmcgJChzYW5kYm94LW5hbWVzcGFjZSkuCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHNvbWUgcF92YXIgaW4gcF9wcm9jZXNzLkVudgogICAgcF92YXIyIDo9IHJlcGxhY2UocF92YXIsICIkKHNhbmRib3gtbmFtZXNwYWNlKSIsIHNfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd192YXIgODogcF92YXIyID0iLCBwX3ZhcjIpCiAgICBwX3ZhcjIgPT0gaV92YXIKCiAgICBwcmludCgiYWxsb3dfdmFyIDg6IHRydWUiKQp9CgphbGxvd19wb2RfaXBfdmFyKHZhcl9uYW1lLCBwX3ZhcikgewogICAgcHJpbnQoImFsbG93X3BvZF9pcF92YXI6IHZhcl9uYW1lID0iLCB2YXJfbmFtZSwgInBfdmFyID0iLCBwX3ZhcikKCiAgICBwX25hbWVfdmFsdWUgOj0gc3BsaXQocF92YXIsICI9IikKICAgIGNvdW50KHBfbmFtZV92YWx1ZSkgPT0gMgoKICAgIHBfbmFtZV92YWx1ZVswXSA9PSB2YXJfbmFtZQogICAgcF9uYW1lX3ZhbHVlWzFdID09ICIkKHBvZC1pcCkiCgogICAgcHJpbnQoImFsbG93X3BvZF9pcF92YXI6IHRydWUiKQp9CgphbGxvd19ob3N0X2lwX3Zhcih2YXJfbmFtZSwgcF92YXIpIHsKICAgIHByaW50KCJhbGxvd19ob3N0X2lwX3ZhcjogdmFyX25hbWUgPSIsIHZhcl9uYW1lLCAicF92YXIgPSIsIHBfdmFyKQoKICAgIHBfbmFtZV92YWx1ZSA6PSBzcGxpdChwX3ZhciwgIj0iKQogICAgY291bnQocF9uYW1lX3ZhbHVlKSA9PSAyCgogICAgcF9uYW1lX3ZhbHVlWzBdID09IHZhcl9uYW1lCiAgICBwX25hbWVfdmFsdWVbMV0gPT0gIiQoaG9zdC1pcCkiCgogICAgcHJpbnQoImFsbG93X2hvc3RfaXBfdmFyOiB0cnVlIikKfQoKaXNfaXAodmFsdWUpIHsKICAgIGJ5dGVzID0gc3BsaXQodmFsdWUsICIuIikKICAgIGNvdW50KGJ5dGVzKSA9PSA0CgogICAgaXNfaXBfZmlyc3RfYnl0ZShieXRlc1swXSkKICAgIGlzX2lwX290aGVyX2J5dGUoYnl0ZXNbMV0pCiAgICBpc19pcF9vdGhlcl9ieXRlKGJ5dGVzWzJdKQogICAgaXNfaXBfb3RoZXJfYnl0ZShieXRlc1szXSkKfQppc19pcF9maXJzdF9ieXRlKGNvbXBvbmVudCkgewogICAgbnVtYmVyID0gdG9fbnVtYmVyKGNvbXBvbmVudCkKICAgIG51bWJlciA+PSAxCiAgICBudW1iZXIgPD0gMjU1Cn0KaXNfaXBfb3RoZXJfYnl0ZShjb21wb25lbnQpIHsKICAgIG51bWJlciA9IHRvX251bWJlcihjb21wb25lbnQpCiAgICBudW1iZXIgPj0gMAogICAgbnVtYmVyIDw9IDI1NQp9CgojIE9DSSByb290LlBhdGgKYWxsb3dfcm9vdF9wYXRoKHBfb2NpLCBpX29jaSwgYnVuZGxlX2lkKSB7CiAgICBpX3BhdGggOj0gaV9vY2kuUm9vdC5QYXRoCiAgICBwX3BhdGgxIDo9IHBfb2NpLlJvb3QuUGF0aAogICAgcHJpbnQoImFsbG93X3Jvb3RfcGF0aDogaV9wYXRoID0iLCBpX3BhdGgsICJwX3BhdGgxID0iLCBwX3BhdGgxKQoKICAgIHBfcGF0aDIgOj0gcmVwbGFjZShwX3BhdGgxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfcm9vdF9wYXRoOiBwX3BhdGgyID0iLCBwX3BhdGgyKQoKICAgIHBfcGF0aDMgOj0gcmVwbGFjZShwX3BhdGgyLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X3Jvb3RfcGF0aDogcF9wYXRoMyA9IiwgcF9wYXRoMykKCiAgICBwX3BhdGgzID09IGlfcGF0aAoKICAgIHByaW50KCJhbGxvd19yb290X3BhdGg6IHRydWUiKQp9CgojIGRldmljZSBtb3VudHMKYWxsb3dfbW91bnQocF9vY2ksIGlfbW91bnQsIGlfc3RvcmFnZXMsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcHJpbnQoImFsbG93X21vdW50OiBpX21vdW50ID0iLCBpX21vdW50KQoKICAgIHNvbWUgcF9tb3VudCBpbiBwX29jaS5Nb3VudHMKICAgIHNvbWUgaV9zdG9yYWdlIGluIGlfc3RvcmFnZXMKCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IHBfbW91bnQgPSIsIHBfbW91bnQpCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IGlfc3RvcmFnZSA9IiwgaV9zdG9yYWdlKQoKICAgIGNoZWNrX21vdW50KHBfbW91bnQsIGlfbW91bnQsIGlfc3RvcmFnZSwgYnVuZGxlX2lkLCBzYW5kYm94X2lkKQoKICAgICMgVE9ETzogYXJlIHRoZXJlIGFueSBvdGhlciByZXF1aXJlZCBwb2xpY3kgY2hlY2tzIGZvciBtb3VudHMgLSBlLmcuLAogICAgIyAgICAgICBtdWx0aXBsZSBtb3VudHMgd2l0aCBzYW1lIHNvdXJjZSBvciBkZXN0aW5hdGlvbj8KCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IHRydWUiKQp9CgpjaGVja19tb3VudChwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcF9tb3VudCA9PSBpX21vdW50CiAgICBwcmludCgiY2hlY2tfbW91bnQgMTogdHJ1ZSIpCn0KY2hlY2tfbW91bnQocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHBfbW91bnQuZGVzdGluYXRpb24gPT0gaV9tb3VudC5kZXN0aW5hdGlvbgogICAgcF9tb3VudC50eXBlXyA9PSBpX21vdW50LnR5cGVfCiAgICBwX21vdW50Lm9wdGlvbnMgPT0gaV9tb3VudC5vcHRpb25zCgogICAgbW91bnRfc291cmNlX2FsbG93cyhwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkKCiAgICBwcmludCgiY2hlY2tfbW91bnQgMjogdHJ1ZSIpCn0KCm1vdW50X3NvdXJjZV9hbGxvd3MocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHJlZ2V4MSA6PSBwX21vdW50LnNvdXJjZQogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5tb3VudF9zb3VyY2VfY3BhdGgpCiAgICByZWdleDQgOj0gcmVwbGFjZShyZWdleDMsICIkKGJ1bmRsZS1pZCkiLCBidW5kbGVfaWQpCgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMTogcmVnZXg0ID0iLCByZWdleDQpCiAgICByZWdleC5tYXRjaChyZWdleDQsIGlfbW91bnQuc291cmNlKQoKICAgIHByaW50KCJtb3VudF9zb3VyY2VfYWxsb3dzIDE6IHRydWUiKQp9Cm1vdW50X3NvdXJjZV9hbGxvd3MocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHJlZ2V4MSA6PSBwX21vdW50LnNvdXJjZQogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5tb3VudF9zb3VyY2VfY3BhdGgpCiAgICByZWdleDQgOj0gcmVwbGFjZShyZWdleDMsICIkKHNhbmRib3gtaWQpIiwgc2FuZGJveF9pZCkKCiAgICBwcmludCgibW91bnRfc291cmNlX2FsbG93cyAyOiByZWdleDQgPSIsIHJlZ2V4NCkKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4NCwgaV9tb3VudC5zb3VyY2UpCgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMjogdHJ1ZSIpCn0KbW91bnRfc291cmNlX2FsbG93cyhwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogaV9tb3VudC5zb3VyY2UgPSIsIGlfbW91bnQuc291cmNlKQogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogaV9zdG9yYWdlLm1vdW50X3BvaW50ID0iLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCgogICAgaV9tb3VudC5zb3VyY2UgPT0gaV9zdG9yYWdlLm1vdW50X3BvaW50CgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogdHJ1ZSIpCn0KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBDcmVhdGUgY29udGFpbmVyIFN0b3JhZ2VzCgphbGxvd19zdG9yYWdlcyhwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHBfY291bnQgOj0gY291bnQocF9zdG9yYWdlcykKICAgIGlfY291bnQgOj0gY291bnQoaV9zdG9yYWdlcykKICAgIHByaW50KCJhbGxvd19zdG9yYWdlczogcF9jb3VudCA9IiwgcF9jb3VudCwgImlfY291bnQgPSIsIGlfY291bnQpCgogICAgcF9jb3VudCA9PSBpX2NvdW50CgogICAgIyBHZXQgdGhlIGNvbnRhaW5lciBpbWFnZSBsYXllciBJRHMgYW5kIHZlcml0eSByb290IGhhc2hlcywgZnJvbSB0aGUgIm92ZXJsYXlmcyIgc3RvcmFnZS4KICAgIHNvbWUgb3ZlcmxheV9zdG9yYWdlIGluIHBfc3RvcmFnZXMKICAgIG92ZXJsYXlfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIHByaW50KCJhbGxvd19zdG9yYWdlczogb3ZlcmxheV9zdG9yYWdlID0iLCBvdmVybGF5X3N0b3JhZ2UpCiAgICBjb3VudChvdmVybGF5X3N0b3JhZ2Uub3B0aW9ucykgPT0gMgoKICAgIGxheWVyX2lkcyA6PSBzcGxpdChvdmVybGF5X3N0b3JhZ2Uub3B0aW9uc1swXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiBsYXllcl9pZHMgPSIsIGxheWVyX2lkcykKCiAgICByb290X2hhc2hlcyA6PSBzcGxpdChvdmVybGF5X3N0b3JhZ2Uub3B0aW9uc1sxXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiByb290X2hhc2hlcyA9Iiwgcm9vdF9oYXNoZXMpCgogICAgZXZlcnkgaV9zdG9yYWdlIGluIGlfc3RvcmFnZXMgewogICAgICAgIGFsbG93X3N0b3JhZ2UocF9zdG9yYWdlcywgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpCiAgICB9CgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiB0cnVlIikKfQoKYWxsb3dfc3RvcmFnZShwX3N0b3JhZ2VzLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgc29tZSBwX3N0b3JhZ2UgaW4gcF9zdG9yYWdlcwoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiBwX3N0b3JhZ2UgPSIsIHBfc3RvcmFnZSkKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiBpX3N0b3JhZ2UgPSIsIGlfc3RvcmFnZSkKCiAgICBwX3N0b3JhZ2UuZHJpdmVyICAgICAgICAgICA9PSBpX3N0b3JhZ2UuZHJpdmVyCiAgICBwX3N0b3JhZ2UuZHJpdmVyX29wdGlvbnMgICA9PSBpX3N0b3JhZ2UuZHJpdmVyX29wdGlvbnMKICAgIHBfc3RvcmFnZS5mc19ncm91cCAgICAgICAgID09IGlfc3RvcmFnZS5mc19ncm91cAogICAgcF9zdG9yYWdlLmZzdHlwZSAgICAgICAgICAgPT0gaV9zdG9yYWdlLmZzdHlwZQoKICAgIGFsbG93X3N0b3JhZ2Vfc291cmNlKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKQogICAgYWxsb3dfc3RvcmFnZV9vcHRpb25zKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKQogICAgYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKQoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiB0cnVlIikKfQoKYWxsb3dfc3RvcmFnZV9zb3VyY2UocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX3NvdXJjZSAxOiBzdGFydCIpCgogICAgcF9zdG9yYWdlLnNvdXJjZSA9PSBpX3N0b3JhZ2Uuc291cmNlCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDE6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX3NvdXJjZShwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDI6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCgogICAgIyBEREREOkJCOkRELkY6IERvbWFpbjpCdXM6RGV2aWNlLkZ1bmN0aW9uCiAgICAjIGh0dHBzOi8vd3d3Lmtlcm5lbC5vcmcvZG9jL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtYnVzLXBjaQogICAgcmVnZXgubWF0Y2goYF5bYS1mMC05XXs0fTpbYS1mMC05XXsyfTpbYS1mMC05XXsyfVwuW2EtZjAtOV0kYCwgaV9zdG9yYWdlLnNvdXJjZSkKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9zb3VyY2UgMjogdHJ1ZSIpCn0KCmFsbG93X3N0b3JhZ2Vfc291cmNlKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKSB7CiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9zb3VyY2UgMzogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIGlfc3RvcmFnZS5zb3VyY2UgPT0gIm5vbmUiCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDM6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX3NvdXJjZShwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDQ6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJzbWIiCgogICAgIyBQYXR0ZXJuOiAvLzxzdG9yYWdlLWFjY291bnQtbmFtZT4uZmlsZS5jb3JlLndpbmRvd3MubmV0LzxrOHMtUFZDLW5hbWU+CiAgICAjIFN0b3JhZ2UgYWNjb3VudCBuYW1lOiBodHRwczovL2xlYXJuLm1pY3Jvc29mdC5jb20vZW4tdXMvYXp1cmUvc3RvcmFnZS9jb21tb24vc3RvcmFnZS1hY2NvdW50LW92ZXJ2aWV3I3N0b3JhZ2UtYWNjb3VudC1uYW1lCiAgICAjIEs4cyBQVkMgbmFtZTogaHR0cHM6Ly9rdWJlcm5ldGVzLmlvL2RvY3MvY29uY2VwdHMvb3ZlcnZpZXcvd29ya2luZy13aXRoLW9iamVjdHMvbmFtZXMvI2Rucy1zdWJkb21haW4tbmFtZXMKICAgIHJlZ2V4Lm1hdGNoKGBeXC9cLyhbYS16MC05XXszLDI0fSlcLmZpbGVcLmNvcmVcLndpbmRvd3NcLm5ldFwvW2EtejAtOV0oW2EtejAtOS4tXXswLDI1MX1bYS16MC05XSk/JGAsIGlfc3RvcmFnZS5zb3VyY2UpCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDQ6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMTogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgIT0gIm92ZXJsYXlmcyIKICAgIHBfc3RvcmFnZS5vcHRpb25zID09IGlfc3RvcmFnZS5vcHRpb25zCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAxOiB0cnVlIikKfQphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIGNvdW50KHBfc3RvcmFnZS5vcHRpb25zKSA9PSAyCgogICAgcG9saWN5X2lkcyA6PSBzcGxpdChwX3N0b3JhZ2Uub3B0aW9uc1swXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBwb2xpY3lfaWRzID0iLCBwb2xpY3lfaWRzKQogICAgcG9saWN5X2lkcyA9PSBsYXllcl9pZHMKCiAgICBwb2xpY3lfaGFzaGVzIDo9IHNwbGl0KHBfc3RvcmFnZS5vcHRpb25zWzFdLCAiOiIpCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IHBvbGljeV9oYXNoZXMgPSIsIHBvbGljeV9oYXNoZXMpCgogICAgcF9jb3VudCA6PSBjb3VudChwb2xpY3lfaWRzKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBwX2NvdW50ID0iLCBwX2NvdW50KQogICAgcF9jb3VudCA+PSAxCiAgICBwX2NvdW50ID09IGNvdW50KHBvbGljeV9oYXNoZXMpCgogICAgaV9jb3VudCA6PSBjb3VudChpX3N0b3JhZ2Uub3B0aW9ucykKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogaV9jb3VudCA9IiwgaV9jb3VudCkKICAgIGlfY291bnQgPT0gcF9jb3VudCArIDMKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zWzBdID0iLCBpX3N0b3JhZ2Uub3B0aW9uc1swXSkKICAgIGlfc3RvcmFnZS5vcHRpb25zWzBdID09ICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQubGF5ZXItc3JjLXByZWZpeD0vdmFyL2xpYi9jb250YWluZXJkL2lvLmNvbnRhaW5lcmQuc25hcHNob3R0ZXIudjEudGFyZGV2L2xheWVycyIKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zW2lfY291bnQgLSAyXSA9IiwgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDJdKQogICAgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDJdID09ICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQub3ZlcmxheS1ydyIKCiAgICBsb3dlcmRpciA6PSBjb25jYXQoIj0iLCBbImxvd2VyZGlyIiwgcF9zdG9yYWdlLm9wdGlvbnNbMF1dKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBsb3dlcmRpciA9IiwgbG93ZXJkaXIpCgogICAgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDFdID09IGxvd2VyZGlyCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zW2lfY291bnQgLSAxXSA9IiwgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDFdKQoKICAgIGV2ZXJ5IGksIHBvbGljeV9pZCBpbiBwb2xpY3lfaWRzIHsKICAgICAgICBhbGxvd19vdmVybGF5X2xheWVyKHBvbGljeV9pZCwgcG9saWN5X2hhc2hlc1tpXSwgaV9zdG9yYWdlLm9wdGlvbnNbaSArIDFdKQogICAgfQoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogdHJ1ZSIpCn0KYWxsb3dfc3RvcmFnZV9vcHRpb25zKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKSB7CiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDM6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCiAgICBjb3VudChwX3N0b3JhZ2Uub3B0aW9ucykgPT0gMQoKICAgIHN0YXJ0c3dpdGgocF9zdG9yYWdlLm9wdGlvbnNbMF0sICIkKGhhc2giKQogICAgaGFzaF9zdWZmaXggOj0gdHJpbV9sZWZ0KHBfc3RvcmFnZS5vcHRpb25zWzBdLCAiJChoYXNoIikKCiAgICBlbmRzd2l0aChoYXNoX3N1ZmZpeCwgIikiKQogICAgaGFzaF9pbmRleCA6PSB0cmltX3JpZ2h0KGhhc2hfc3VmZml4LCAiKSIpCiAgICBpIDo9IHRvX251bWJlcihoYXNoX2luZGV4KQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAzOiBpID0iLCBpKQoKICAgIGhhc2hfb3B0aW9uIDo9IGNvbmNhdCgiPSIsIFsiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LnJvb3QtaGFzaCIsIHJvb3RfaGFzaGVzW2ldXSkKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMzogaGFzaF9vcHRpb24gPSIsIGhhc2hfb3B0aW9uKQoKICAgIGNvdW50KGlfc3RvcmFnZS5vcHRpb25zKSA9PSA0CiAgICBpX3N0b3JhZ2Uub3B0aW9uc1swXSA9PSAicm8iCiAgICBpX3N0b3JhZ2Uub3B0aW9uc1sxXSA9PSAiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmJsb2NrX2RldmljZT1maWxlIgogICAgaV9zdG9yYWdlLm9wdGlvbnNbMl0gPT0gImlvLmthdGFjb250YWluZXJzLmZzLW9wdC5pcy1sYXllciIKICAgIGlfc3RvcmFnZS5vcHRpb25zWzNdID09IGhhc2hfb3B0aW9uCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAzOiB0cnVlIikKfQphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgNDogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gInNtYiIKICAgIHBfb3B0c19jb3VudCA6PSBjb3VudChwX3N0b3JhZ2Uub3B0aW9ucykKICAgIGlfb3B0c19jb3VudCA6PSBjb3VudChpX3N0b3JhZ2Uub3B0aW9ucykKICAgIGlfb3B0c19jb3VudCA9PSBwX29wdHNfY291bnQgKyAyCgogICAgaV9vcHRfbWF0Y2hlcyA6PSBbaSB8IGkgOj0gaWR4OyBpZHggPCBwX29wdHNfY291bnQ7IHBfc3RvcmFnZS5vcHRpb25zW2lkeF0gPT0gaV9zdG9yYWdlLm9wdGlvbnNbaWR4XV0KICAgIGNvdW50KGlfb3B0X21hdGNoZXMpID09IHBfb3B0c19jb3VudAoKICAgIHN0YXJ0c3dpdGgoaV9zdG9yYWdlLm9wdGlvbnNbaV9vcHRzX2NvdW50LTJdLCAiYWRkcj0iKQogICAgY3JlZHMgPSBzcGxpdChpX3N0b3JhZ2Uub3B0aW9uc1tpX29wdHNfY291bnQtMV0sICIsIikKICAgIGNvdW50KGNyZWRzKSA9PSAyCiAgICBzdGFydHN3aXRoKGNyZWRzWzBdLCAidXNlcm5hbWU9IikKICAgIHN0YXJ0c3dpdGgoY3JlZHNbMV0sICJwYXNzd29yZD0iKQogICAgCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDQ6IHRydWUiKQp9CgphbGxvd19vdmVybGF5X2xheWVyKHBvbGljeV9pZCwgcG9saWN5X2hhc2gsIGlfb3B0aW9uKSB7CiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogcG9saWN5X2lkID0iLCBwb2xpY3lfaWQsICJwb2xpY3lfaGFzaCA9IiwgcG9saWN5X2hhc2gpCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogaV9vcHRpb24gPSIsIGlfb3B0aW9uKQoKICAgIHN0YXJ0c3dpdGgoaV9vcHRpb24sICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQubGF5ZXI9IikKICAgIGlfdmFsdWUgOj0gcmVwbGFjZShpX29wdGlvbiwgImlvLmthdGFjb250YWluZXJzLmZzLW9wdC5sYXllcj0iLCAiIikKICAgIGlfdmFsdWVfZGVjb2RlZCA6PSBiYXNlNjQuZGVjb2RlKGlfdmFsdWUpCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogaV92YWx1ZV9kZWNvZGVkID0iLCBpX3ZhbHVlX2RlY29kZWQpCgogICAgcG9saWN5X3N1ZmZpeCA6PSBjb25jYXQoIj0iLCBbInRhcixybyxpby5rYXRhY29udGFpbmVycy5mcy1vcHQuYmxvY2tfZGV2aWNlPWZpbGUsaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmlzLWxheWVyLGlvLmthdGFjb250YWluZXJzLmZzLW9wdC5yb290LWhhc2giLCBwb2xpY3lfaGFzaF0pCiAgICBwX3ZhbHVlIDo9IGNvbmNhdCgiLCIsIFtwb2xpY3lfaWQsIHBvbGljeV9zdWZmaXhdKQogICAgcHJpbnQoImFsbG93X292ZXJsYXlfbGF5ZXI6IHBfdmFsdWUgPSIsIHBfdmFsdWUpCgogICAgcF92YWx1ZSA9PSBpX3ZhbHVlX2RlY29kZWQKCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogdHJ1ZSIpCn0KCmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAidGFyIgoKICAgIHN0YXJ0c3dpdGgocF9zdG9yYWdlLm1vdW50X3BvaW50LCAiJChsYXllciIpCiAgICBtb3VudF9zdWZmaXggOj0gdHJpbV9sZWZ0KHBfc3RvcmFnZS5tb3VudF9wb2ludCwgIiQobGF5ZXIiKQoKICAgIGVuZHN3aXRoKG1vdW50X3N1ZmZpeCwgIikiKQogICAgbGF5ZXJfaW5kZXggOj0gdHJpbV9yaWdodChtb3VudF9zdWZmaXgsICIpIikKICAgIGkgOj0gdG9fbnVtYmVyKGxheWVyX2luZGV4KQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDE6IGkgPSIsIGkpCgogICAgbGF5ZXJfaWQgOj0gbGF5ZXJfaWRzW2ldCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMTogbGF5ZXJfaWQgPSIsIGxheWVyX2lkKQoKICAgIHBfbW91bnQgOj0gY29uY2F0KCIvIiwgWyIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L2xheWVycyIsIGxheWVyX2lkXSkKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCAxOiBwX21vdW50ID0iLCBwX21vdW50KQoKICAgIHBfbW91bnQgPT0gaV9zdG9yYWdlLm1vdW50X3BvaW50CgogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDE6IHRydWUiKQp9CmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAiZnVzZTMua2F0YS1vdmVybGF5IgoKICAgIG1vdW50MSA6PSByZXBsYWNlKHBfc3RvcmFnZS5tb3VudF9wb2ludCwgIiQoY3BhdGgpIiwgcG9saWN5X2RhdGEuY29tbW9uLmNwYXRoKQogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDI6IG1vdW50MiA9IiwgbW91bnQyKQoKICAgIG1vdW50MiA9PSBpX3N0b3JhZ2UubW91bnRfcG9pbnQKCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMjogdHJ1ZSIpCn0KYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKSB7CiAgICBwX3N0b3JhZ2UuZnN0eXBlID09ICJsb2NhbCIKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQyID0iLCBtb3VudDIpCgogICAgbW91bnQzIDo9IHJlcGxhY2UobW91bnQyLCAiJChzYW5kYm94LWlkKSIsIHNhbmRib3hfaWQpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQzID0iLCBtb3VudDMpCgogICAgcmVnZXgubWF0Y2gobW91bnQzLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCgogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDM6IHRydWUiKQp9CmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAiYmluZCIKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNDogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNDogbW91bnQyID0iLCBtb3VudDIpCgogICAgbW91bnQzIDo9IHJlcGxhY2UobW91bnQyLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDQ6IG1vdW50MyA9IiwgbW91bnQzKQoKICAgIHJlZ2V4Lm1hdGNoKG1vdW50MywgaV9zdG9yYWdlLm1vdW50X3BvaW50KQoKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA0OiB0cnVlIikKfQphbGxvd19tb3VudF9wb2ludChwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgYnVuZGxlX2lkLCBzYW5kYm94X2lkLCBsYXllcl9pZHMpIHsKICAgIHBfc3RvcmFnZS5mc3R5cGUgPT0gInRtcGZzIgoKICAgIG1vdW50MSA6PSBwX3N0b3JhZ2UubW91bnRfcG9pbnQKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA1OiBtb3VudDEgPSIsIG1vdW50MSkKCiAgICByZWdleC5tYXRjaChtb3VudDEsIGlfc3RvcmFnZS5tb3VudF9wb2ludCkKCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNTogdHJ1ZSIpCn0KYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKSB7CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogaV9zdG9yYWdlLm1vdW50X3BvaW50ID0iLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCiAgICBhbGxvd19kaXJlY3Rfdm9sX2RyaXZlcihwX3N0b3JhZ2UsIGlfc3RvcmFnZSkKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChzcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQyID0iLCBtb3VudDIpCgogICAgZGlyZWN0X3ZvbF9wYXRoIDo9IGlfc3RvcmFnZS5zb3VyY2UKICAgIG1vdW50MyA6PSByZXBsYWNlKG1vdW50MiwgIiQoYjY0LWRpcmVjdC12b2wtcGF0aCkiLCBiYXNlNjR1cmwuZW5jb2RlKGRpcmVjdF92b2xfcGF0aCkpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQzID0iLCBtb3VudDMpCgogICAgbW91bnQzID09IGlfc3RvcmFnZS5tb3VudF9wb2ludAoKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA2OiB0cnVlIikKfQoKYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIocF9zdG9yYWdlLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19kaXJlY3Rfdm9sX2RyaXZlciAxOiBzdGFydCIpCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCiAgICBwcmludCgiYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIgMTogdHJ1ZSIpCn0KYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIocF9zdG9yYWdlLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19kaXJlY3Rfdm9sX2RyaXZlciAyOiBzdGFydCIpCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJzbWIiCiAgICBwcmludCgiYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIgMjogdHJ1ZSIpCn0KCiMgRXhlY1Byb2Nlc3NSZXF1ZXN0LnByb2Nlc3MuQ2FwYWJpbGl0aWVzCmFsbG93X2V4ZWNfY2FwcyhpX2NhcHMpIHsKICAgIG5vdCBpX2NhcHMuQW1iaWVudAogICAgbm90IGlfY2Fwcy5Cb3VuZGluZwogICAgbm90IGlfY2Fwcy5FZmZlY3RpdmUKICAgIG5vdCBpX2NhcHMuSW5oZXJpdGFibGUKICAgIG5vdCBpX2NhcHMuUGVybWl0dGVkCn0KCiMgT0NJLlByb2Nlc3MuQ2FwYWJpbGl0aWVzCmFsbG93X2NhcHMocF9jYXBzLCBpX2NhcHMpIHsKICAgIHByaW50KCJhbGxvd19jYXBzOiBwb2xpY3kgQW1iaWVudCA9IiwgcF9jYXBzLkFtYmllbnQpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgQW1iaWVudCA9IiwgaV9jYXBzLkFtYmllbnQpCiAgICBtYXRjaF9jYXBzKHBfY2Fwcy5BbWJpZW50LCBpX2NhcHMuQW1iaWVudCkKCiAgICBwcmludCgiYWxsb3dfY2FwczogcG9saWN5IEJvdW5kaW5nID0iLCBwX2NhcHMuQm91bmRpbmcpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgQm91bmRpbmcgPSIsIGlfY2Fwcy5Cb3VuZGluZykKICAgIG1hdGNoX2NhcHMocF9jYXBzLkJvdW5kaW5nLCBpX2NhcHMuQm91bmRpbmcpCgogICAgcHJpbnQoImFsbG93X2NhcHM6IHBvbGljeSBFZmZlY3RpdmUgPSIsIHBfY2Fwcy5FZmZlY3RpdmUpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgRWZmZWN0aXZlID0iLCBpX2NhcHMuRWZmZWN0aXZlKQogICAgbWF0Y2hfY2FwcyhwX2NhcHMuRWZmZWN0aXZlLCBpX2NhcHMuRWZmZWN0aXZlKQoKICAgIHByaW50KCJhbGxvd19jYXBzOiBwb2xpY3kgSW5oZXJpdGFibGUgPSIsIHBfY2Fwcy5Jbmhlcml0YWJsZSkKICAgIHByaW50KCJhbGxvd19jYXBzOiBpbnB1dCBJbmhlcml0YWJsZSA9IiwgaV9jYXBzLkluaGVyaXRhYmxlKQogICAgbWF0Y2hfY2FwcyhwX2NhcHMuSW5oZXJpdGFibGUsIGlfY2Fwcy5Jbmhlcml0YWJsZSkKCiAgICBwcmludCgiYWxsb3dfY2FwczogcG9saWN5IFBlcm1pdHRlZCA9IiwgcF9jYXBzLlBlcm1pdHRlZCkKICAgIHByaW50KCJhbGxvd19jYXBzOiBpbnB1dCBQZXJtaXR0ZWQgPSIsIGlfY2Fwcy5QZXJtaXR0ZWQpCiAgICBtYXRjaF9jYXBzKHBfY2Fwcy5QZXJtaXR0ZWQsIGlfY2Fwcy5QZXJtaXR0ZWQpCn0KCm1hdGNoX2NhcHMocF9jYXBzLCBpX2NhcHMpIHsKICAgIHByaW50KCJtYXRjaF9jYXBzIDE6IHN0YXJ0IikKCiAgICBwX2NhcHMgPT0gaV9jYXBzCgogICAgcHJpbnQoIm1hdGNoX2NhcHMgMTogdHJ1ZSIpCn0KbWF0Y2hfY2FwcyhwX2NhcHMsIGlfY2FwcykgewogICAgcHJpbnQoIm1hdGNoX2NhcHMgMjogc3RhcnQiKQoKICAgIGNvdW50KHBfY2FwcykgPT0gMQogICAgcF9jYXBzWzBdID09ICIkKGRlZmF1bHRfY2FwcykiCgogICAgcHJpbnQoIm1hdGNoX2NhcHMgMjogZGVmYXVsdF9jYXBzID0iLCBwb2xpY3lfZGF0YS5jb21tb24uZGVmYXVsdF9jYXBzKQogICAgcG9saWN5X2RhdGEuY29tbW9uLmRlZmF1bHRfY2FwcyA9PSBpX2NhcHMKCiAgICBwcmludCgibWF0Y2hfY2FwcyAyOiB0cnVlIikKfQptYXRjaF9jYXBzKHBfY2FwcywgaV9jYXBzKSB7CiAgICBwcmludCgibWF0Y2hfY2FwcyAzOiBzdGFydCIpCgogICAgY291bnQocF9jYXBzKSA9PSAxCiAgICBwX2NhcHNbMF0gPT0gIiQocHJpdmlsZWdlZF9jYXBzKSIKCiAgICBwcmludCgibWF0Y2hfY2FwcyAzOiBwcml2aWxlZ2VkX2NhcHMgPSIsIHBvbGljeV9kYXRhLmNvbW1vbi5wcml2aWxlZ2VkX2NhcHMpCiAgICBwb2xpY3lfZGF0YS5jb21tb24ucHJpdmlsZWdlZF9jYXBzID09IGlfY2FwcwoKICAgIHByaW50KCJtYXRjaF9jYXBzIDM6IHRydWUiKQp9CgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgpjaGVja19kaXJlY3RvcnlfdHJhdmVyc2FsKGlfcGF0aCkgewogICAgbm90IHJlZ2V4Lm1hdGNoKCIoXnwvKS4uKCR8LykiLCBpX3BhdGgpCn0KCmNoZWNrX3N5bWxpbmtfc291cmNlKGlfc3JjKSB7CiAgICBpX3NyYyA9PSAiIgogICAgcHJpbnQoImNoZWNrX3N5bWxpbmtfc291cmNlIDE6IHRydWUiKQp9CmNoZWNrX3N5bWxpbmtfc291cmNlKGlfc3JjKSB7CiAgICBpX3NyYyAhPSAiIgogICAgcHJpbnQoImNoZWNrX3N5bWxpbmtfc291cmNlIDI6IGlfc3JjID0iLCBpX3NyYykKCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24uc19zb3VyY2UxLCBpX3NyYykKCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMjogdHJ1ZSIpCn0KY2hlY2tfc3ltbGlua19zb3VyY2UoaV9zcmMpIHsKICAgIGlfc3JjICE9ICIiCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMzogaV9zcmMgPSIsIGlfc3JjKQoKICAgIHJlZ2V4Lm1hdGNoKHBvbGljeV9kYXRhLmNvbW1vbi5zX3NvdXJjZTIsIGlfc3JjKQogICAgY2hlY2tfZGlyZWN0b3J5X3RyYXZlcnNhbChpX3NyYykKCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMzogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfc3RvcmFnZXMoaV9zdG9yYWdlcykgewogICAgcHJpbnQoImFsbG93X3NhbmRib3hfc3RvcmFnZXM6IGlfc3RvcmFnZXMgPSIsIGlfc3RvcmFnZXMpCgogICAgcF9zdG9yYWdlcyA6PSBwb2xpY3lfZGF0YS5zYW5kYm94LnN0b3JhZ2VzCiAgICBldmVyeSBpX3N0b3JhZ2UgaW4gaV9zdG9yYWdlcyB7CiAgICAgICAgYWxsb3dfc2FuZGJveF9zdG9yYWdlKHBfc3RvcmFnZXMsIGlfc3RvcmFnZSkKICAgIH0KCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9zdG9yYWdlczogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfc3RvcmFnZShwX3N0b3JhZ2VzLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IGlfc3RvcmFnZSA9IiwgaV9zdG9yYWdlKQoKICAgIHNvbWUgcF9zdG9yYWdlIGluIHBfc3RvcmFnZXMKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IHBfc3RvcmFnZSA9IiwgcF9zdG9yYWdlKQogICAgaV9zdG9yYWdlID09IHBfc3RvcmFnZQoKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IHRydWUiKQp9CgpDb3B5RmlsZVJlcXVlc3QgewogICAgcHJpbnQoIkNvcHlGaWxlUmVxdWVzdDogaW5wdXQucGF0aCA9IiwgaW5wdXQucGF0aCkKCiAgICBjaGVja19zeW1saW5rX3NvdXJjZShpbnB1dC5zeW1saW5rX3NyYykKICAgIGNoZWNrX2RpcmVjdG9yeV90cmF2ZXJzYWwoaW5wdXQucGF0aCkKCiAgICBzb21lIHJlZ2V4MSBpbiBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLkNvcHlGaWxlUmVxdWVzdAogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5jcGF0aCkKICAgIHJlZ2V4NCA6PSByZXBsYWNlKHJlZ2V4MywgIiQoYnVuZGxlLWlkKSIsIEJVTkRMRV9JRCkKICAgIHByaW50KCJDb3B5RmlsZVJlcXVlc3Q6IHJlZ2V4NCA9IiwgcmVnZXg0KQoKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4NCwgaW5wdXQucGF0aCkKCiAgICBwcmludCgiQ29weUZpbGVSZXF1ZXN0OiB0cnVlIikKfQoKQ3JlYXRlU2FuZGJveFJlcXVlc3QgewogICAgcHJpbnQoIkNyZWF0ZVNhbmRib3hSZXF1ZXN0OiBpbnB1dC5ndWVzdF9ob29rX3BhdGggPSIsIGlucHV0Lmd1ZXN0X2hvb2tfcGF0aCkKICAgIGNvdW50KGlucHV0Lmd1ZXN0X2hvb2tfcGF0aCkgPT0gMAoKICAgIHByaW50KCJDcmVhdGVTYW5kYm94UmVxdWVzdDogaW5wdXQua2VybmVsX21vZHVsZXMgPSIsIGlucHV0Lmtlcm5lbF9tb2R1bGVzKQogICAgY291bnQoaW5wdXQua2VybmVsX21vZHVsZXMpID09IDAKCiAgICBpX3BpZG5zIDo9IGlucHV0LnNhbmRib3hfcGlkbnMKICAgIHByaW50KCJDcmVhdGVTYW5kYm94UmVxdWVzdDogaV9waWRucyA9IiwgaV9waWRucykKICAgIGlfcGlkbnMgPT0gZmFsc2UKICAgIGFsbG93X3NhbmRib3hfc3RvcmFnZXMoaW5wdXQuc3RvcmFnZXMpCn0KCmFsbG93X2V4ZWMocF9jb250YWluZXIsIGlfcHJvY2VzcykgewogICAgcHJpbnQoImFsbG93X2V4ZWM6IHN0YXJ0IikKCiAgICBwX29jaSA9IHBfY29udGFpbmVyLk9DSQogICAgcF9zX25hbWUgPSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc19uYW1lc3BhY2UgPSBnZXRfc3RhdGVfdmFsKCJuYW1lc3BhY2UiKQogICAgYWxsb3dfcHJvYmVfcHJvY2VzcyhwX29jaS5Qcm9jZXNzLCBpX3Byb2Nlc3MsIHBfc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfZXhlYzogdHJ1ZSIpCn0KCmFsbG93X2ludGVyYWN0aXZlX2V4ZWMocF9jb250YWluZXIsIGlfcHJvY2VzcykgewogICAgcHJpbnQoImFsbG93X2ludGVyYWN0aXZlX2V4ZWM6IHN0YXJ0IikKCiAgICBwX29jaSA9IHBfY29udGFpbmVyLk9DSQogICAgcF9zX25hbWUgPSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc19uYW1lc3BhY2UgPSBnZXRfc3RhdGVfdmFsKCJuYW1lc3BhY2UiKQogICAgYWxsb3dfaW50ZXJhY3RpdmVfcHJvY2VzcyhwX29jaS5Qcm9jZXNzLCBpX3Byb2Nlc3MsIHBfc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfaW50ZXJhY3RpdmVfZXhlYzogdHJ1ZSIpCn0KCiMgVE9ETzogc2hvdWxkIG90aGVyIEV4ZWNQcm9jZXNzUmVxdWVzdCBpbnB1dCBkYXRhIGZpZWxkcyBiZSB2YWxpZGF0ZWQgYXMgd2VsbD8KRXhlY1Byb2Nlc3NSZXF1ZXN0IHsKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMTogaW5wdXQgPSIsIGlucHV0KQoKICAgIHNvbWUgcF9jb21tYW5kIGluIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuRXhlY1Byb2Nlc3NSZXF1ZXN0LmFsbG93ZWRfY29tbWFuZHMKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMTogcF9jb21tYW5kID0iLCBwX2NvbW1hbmQpCiAgICBwX2NvbW1hbmQgPT0gaW5wdXQucHJvY2Vzcy5BcmdzCgogICAgIyBUT0RPOiBtYXRjaCBwX2NvbnRhaW5lcidzIElEIHdpdGggdGhlIGlucHV0IGNvbnRhaW5lcl9pZC4KICAgIHNvbWUgcF9jb250YWluZXIgaW4gcG9saWN5X2RhdGEuY29udGFpbmVycwogICAgYWxsb3dfaW50ZXJhY3RpdmVfZXhlYyhwX2NvbnRhaW5lciwgaW5wdXQucHJvY2VzcykKCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDE6IHRydWUiKQp9CkV4ZWNQcm9jZXNzUmVxdWVzdCB7CiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDI6IGlucHV0ID0iLCBpbnB1dCkKCiAgICAjIFRPRE86IG1hdGNoIGlucHV0IGNvbnRhaW5lciBJRCB3aXRoIGl0cyBjb3JyZXNwb25kaW5nIGNvbnRhaW5lci5leGVjX2NvbW1hbmRzLgogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBzb21lIHBfY29tbWFuZCBpbiBwX2NvbnRhaW5lci5leGVjX2NvbW1hbmRzCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDI6IHBfY29tbWFuZCA9IiwgcF9jb21tYW5kKQoKICAgICMgVE9ETzogc2hvdWxkIG90aGVyIGlucHV0IGRhdGEgZmllbGRzIGJlIHZhbGlkYXRlZCBhcyB3ZWxsPwogICAgcF9jb21tYW5kID09IGlucHV0LnByb2Nlc3MuQXJncwoKICAgIGFsbG93X2V4ZWMocF9jb250YWluZXIsIGlucHV0LnByb2Nlc3MpCgogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAyOiB0cnVlIikKfQpFeGVjUHJvY2Vzc1JlcXVlc3QgewogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAzOiBpbnB1dCA9IiwgaW5wdXQpCgogICAgaV9jb21tYW5kID0gY29uY2F0KCIgIiwgaW5wdXQucHJvY2Vzcy5BcmdzKQogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAzOiBpX2NvbW1hbmQgPSIsIGlfY29tbWFuZCkKCiAgICBzb21lIHBfcmVnZXggaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5FeGVjUHJvY2Vzc1JlcXVlc3QucmVnZXgKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMzogcF9yZWdleCA9IiwgcF9yZWdleCkKCiAgICByZWdleC5tYXRjaChwX3JlZ2V4LCBpX2NvbW1hbmQpCgogICAgIyBUT0RPOiBtYXRjaCBwX2NvbnRhaW5lcidzIElEIHdpdGggdGhlIGlucHV0IGNvbnRhaW5lcl9pZC4KICAgIHNvbWUgcF9jb250YWluZXIgaW4gcG9saWN5X2RhdGEuY29udGFpbmVycwogICAgYWxsb3dfaW50ZXJhY3RpdmVfZXhlYyhwX2NvbnRhaW5lciwgaW5wdXQucHJvY2VzcykKCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDM6IHRydWUiKQp9CgpVcGRhdGVSb3V0ZXNSZXF1ZXN0IHsKICAgIHByaW50KCJVcGRhdGVSb3V0ZXNSZXF1ZXN0OiBpbnB1dCA9IiwgaW5wdXQpCiAgICBwcmludCgiVXBkYXRlUm91dGVzUmVxdWVzdDogcG9saWN5ID0iLCBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLlVwZGF0ZVJvdXRlc1JlcXVlc3QpCgogICAgaV9yb3V0ZXMgOj0gaW5wdXQucm91dGVzLlJvdXRlcwogICAgcF9zb3VyY2VfcmVnZXggPSBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLlVwZGF0ZVJvdXRlc1JlcXVlc3QuZm9yYmlkZGVuX3NvdXJjZV9yZWdleAogICAgcF9uYW1lcyA9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuVXBkYXRlUm91dGVzUmVxdWVzdC5mb3JiaWRkZW5fZGV2aWNlX25hbWVzCgogICAgZXZlcnkgaV9yb3V0ZSBpbiBpX3JvdXRlcyB7CiAgICAgICAgcHJpbnQoImlfcm91dGUuc291cmNlID0iLCBpX3JvdXRlLnNvdXJjZSkKICAgICAgICBldmVyeSBwX3JlZ2V4IGluIHBfc291cmNlX3JlZ2V4IHsKICAgICAgICAgICAgcHJpbnQoInBfcmVnZXggPSIsIHBfcmVnZXgpCiAgICAgICAgICAgIG5vdCByZWdleC5tYXRjaChwX3JlZ2V4LCBpX3JvdXRlLnNvdXJjZSkKICAgICAgICB9CgogICAgICAgIHByaW50KCJpX3JvdXRlLmRldmljZSA9IiwgaV9yb3V0ZS5kZXZpY2UpCiAgICAgICAgbm90IGlfcm91dGUuZGV2aWNlIGluIHBfbmFtZXMKICAgIH0KCiAgICBwcmludCgiVXBkYXRlUm91dGVzUmVxdWVzdDogdHJ1ZSIpCn0KClVwZGF0ZUludGVyZmFjZVJlcXVlc3QgewogICAgcHJpbnQoIlVwZGF0ZUludGVyZmFjZVJlcXVlc3Q6IGlucHV0ID0iLCBpbnB1dCkKICAgIHByaW50KCJVcGRhdGVJbnRlcmZhY2VSZXF1ZXN0OiBwb2xpY3kgPSIsIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuVXBkYXRlSW50ZXJmYWNlUmVxdWVzdCkKCiAgICBpX2ludGVyZmFjZSA6PSBpbnB1dC5pbnRlcmZhY2UKICAgIHBfZmxhZ3MgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmFsbG93X3Jhd19mbGFncwoKICAgICMgVHlwaWNhbGx5LCBqdXN0IElGRl9OT0FSUCBpcyB1c2VkLgogICAgYml0cy5hbmQoaV9pbnRlcmZhY2UucmF3X2ZsYWdzLCBiaXRzLm5lZ2F0ZShwX2ZsYWdzKSkgPT0gMAoKICAgIHBfbmFtZXMgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmZvcmJpZGRlbl9uYW1lcwoKICAgIG5vdCBpX2ludGVyZmFjZS5uYW1lIGluIHBfbmFtZXMKCiAgICBwX2h3YWRkcnMgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmZvcmJpZGRlbl9od19hZGRycwoKICAgIG5vdCBpX2ludGVyZmFjZS5od0FkZHIgaW4gcF9od2FkZHJzCgogICAgcHJpbnQoIlVwZGF0ZUludGVyZmFjZVJlcXVlc3Q6IHRydWUiKQp9CgpDbG9zZVN0ZGluUmVxdWVzdCB7CiAgICBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLkNsb3NlU3RkaW5SZXF1ZXN0ID09IHRydWUKfQoKUmVhZFN0cmVhbVJlcXVlc3QgewogICAgcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5SZWFkU3RyZWFtUmVxdWVzdCA9PSB0cnVlCn0KClVwZGF0ZUVwaGVtZXJhbE1vdW50c1JlcXVlc3QgewogICAgcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVFcGhlbWVyYWxNb3VudHNSZXF1ZXN0ID09IHRydWUKfQoKV3JpdGVTdHJlYW1SZXF1ZXN0IHsKICAgIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuV3JpdGVTdHJlYW1SZXF1ZXN0ID09IHRydWUKfQoKcG9saWN5X2RhdGEgOj0gewogICJjb250YWluZXJzIjogWwogICAgewogICAgICAiT0NJIjogewogICAgICAgICJWZXJzaW9uIjogIjEuMS4wLXJjLjEiLAogICAgICAgICJQcm9jZXNzIjogewogICAgICAgICAgIlRlcm1pbmFsIjogZmFsc2UsCiAgICAgICAgICAiVXNlciI6IHsKICAgICAgICAgICAgIlVJRCI6IDY1NTM1LAogICAgICAgICAgICAiR0lEIjogNjU1MzUsCiAgICAgICAgICAgICJBZGRpdGlvbmFsR2lkcyI6IFtdLAogICAgICAgICAgICAiVXNlcm5hbWUiOiAiIgogICAgICAgICAgfSwKICAgICAgICAgICJEZXByZWNhdGVkQXJncyI6IFsKICAgICAgICAgICAgIi9wYXVzZSIKICAgICAgICAgIF0sCiAgICAgICAgICAiQXJncyI6IFsKICAgICAgICAgICAgIi9wYXVzZSIKICAgICAgICAgIF0sCiAgICAgICAgICAiRW52IjogWwogICAgICAgICAgICAiUEFUSD0vdXNyL2xvY2FsL3NiaW46L3Vzci9sb2NhbC9iaW46L3Vzci9zYmluOi91c3IvYmluOi9zYmluOi9iaW4iCiAgICAgICAgICBdLAogICAgICAgICAgIkN3ZCI6ICIvIiwKICAgICAgICAgICJDYXBhYmlsaXRpZXMiOiB7CiAgICAgICAgICAgICJBbWJpZW50IjogW10sCiAgICAgICAgICAgICJCb3VuZGluZyI6IFsKICAgICAgICAgICAgICAiJChkZWZhdWx0X2NhcHMpIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiRWZmZWN0aXZlIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJJbmhlcml0YWJsZSI6IFtdLAogICAgICAgICAgICAiUGVybWl0dGVkIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICAiTm9OZXdQcml2aWxlZ2VzIjogdHJ1ZQogICAgICAgIH0sCiAgICAgICAgIlJvb3QiOiB7CiAgICAgICAgICAiUGF0aCI6ICIkKGNwYXRoKS8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgIlJlYWRvbmx5IjogdHJ1ZQogICAgICAgIH0sCiAgICAgICAgIk1vdW50cyI6IFsKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9wcm9jIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJwcm9jIiwKICAgICAgICAgICAgInR5cGVfIjogInByb2MiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2IiwKICAgICAgICAgICAgInNvdXJjZSI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJzdHJpY3RhdGltZSIsCiAgICAgICAgICAgICAgIm1vZGU9NzU1IiwKICAgICAgICAgICAgICAic2l6ZT02NTUzNmsiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L3B0cyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiZGV2cHRzIiwKICAgICAgICAgICAgInR5cGVfIjogImRldnB0cyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJuZXdpbnN0YW5jZSIsCiAgICAgICAgICAgICAgInB0bXhtb2RlPTA2NjYiLAogICAgICAgICAgICAgICJtb2RlPTA2MjAiLAogICAgICAgICAgICAgICJnaWQ9NSIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvc2htIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L3NobSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi9tcXVldWUiLAogICAgICAgICAgICAic291cmNlIjogIm1xdWV1ZSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJtcXVldWUiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvc3lzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJzeXNmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJzeXNmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2V0Yy9yZXNvbHYuY29uZiIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClyZXNvbHYuY29uZiQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJvIiwKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9kZXYiLAogICAgICAgICAgICAgICJub2V4ZWMiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0KICAgICAgICBdLAogICAgICAgICJBbm5vdGF0aW9ucyI6IHsKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmJ1bmRsZV9wYXRoIjogIi9ydW4vY29udGFpbmVyZC9pby5jb250YWluZXJkLnJ1bnRpbWUudjIudGFzay9rOHMuaW8vJChidW5kbGUtaWQpIiwKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIjogInBvZF9zYW5kYm94IiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSI6ICJzYW5kYm94IiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWlkIjogIl5bYS16MC05XXs2NH0kIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWxvZy1kaXJlY3RvcnkiOiAiXi92YXIvbG9nL3BvZHMvJChzYW5kYm94LW5hbWVzcGFjZSlfJChzYW5kYm94LW5hbWUpX1swLTlhLWZdezh9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezEyfSQiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZSI6ICJecGVyc2lzdGVudCQiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZXNwYWNlIjogIiIsCiAgICAgICAgICAibmVyZGN0bC9uZXR3b3JrLW5hbWVzcGFjZSI6ICJeL3Zhci9ydW4vbmV0bnMvY25pdGVzdC1bMC05YS1mXXs4fS1bMC05YS1mXXs0fS1bMC05YS1mXXs0fS1bMC05YS1mXXs0fS1bMC05YS1mXXsxMn0kIgogICAgICAgIH0sCiAgICAgICAgIkxpbnV4IjogewogICAgICAgICAgIk5hbWVzcGFjZXMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiVHlwZSI6ICJpcGMiLAogICAgICAgICAgICAgICJQYXRoIjogIiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJUeXBlIjogIm1vdW50IiwKICAgICAgICAgICAgICAiUGF0aCI6ICIiCiAgICAgICAgICAgIH0KICAgICAgICAgIF0sCiAgICAgICAgICAiTWFza2VkUGF0aHMiOiBbCiAgICAgICAgICAgICIvcHJvYy9hY3BpIiwKICAgICAgICAgICAgIi9wcm9jL2Fzb3VuZCIsCiAgICAgICAgICAgICIvcHJvYy9rY29yZSIsCiAgICAgICAgICAgICIvcHJvYy9rZXlzIiwKICAgICAgICAgICAgIi9wcm9jL2xhdGVuY3lfc3RhdHMiLAogICAgICAgICAgICAiL3Byb2MvdGltZXJfbGlzdCIsCiAgICAgICAgICAgICIvcHJvYy90aW1lcl9zdGF0cyIsCiAgICAgICAgICAgICIvcHJvYy9zY2hlZF9kZWJ1ZyIsCiAgICAgICAgICAgICIvc3lzL2Zpcm13YXJlIiwKICAgICAgICAgICAgIi9wcm9jL3Njc2kiCiAgICAgICAgICBdLAogICAgICAgICAgIlJlYWRvbmx5UGF0aHMiOiBbCiAgICAgICAgICAgICIvcHJvYy9idXMiLAogICAgICAgICAgICAiL3Byb2MvZnMiLAogICAgICAgICAgICAiL3Byb2MvaXJxIiwKICAgICAgICAgICAgIi9wcm9jL3N5cyIsCiAgICAgICAgICAgICIvcHJvYy9zeXNycS10cmlnZ2VyIgogICAgICAgICAgXSwKICAgICAgICAgICJEZXZpY2VzIjogW10sCiAgICAgICAgICAiU3lzY3RsIjogewogICAgICAgICAgICAibmV0LmlwdjQuaXBfdW5wcml2aWxlZ2VkX3BvcnRfc3RhcnQiOiAiMCIsCiAgICAgICAgICAgICJuZXQuaXB2NC5waW5nX2dyb3VwX3JhbmdlIjogIjAgMjE0NzQ4MzY0NyIKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0sCiAgICAgICJzdG9yYWdlcyI6IFsKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoMCkiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXIwKSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogIm92ZXJsYXlmcyIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAiZnVzZTMua2F0YS1vdmVybGF5IiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiNWE1YWFkODAwNTVmZjIwMDEyYTUwZGMyNWY4ZGY3YTI5OTI0NDc0MzI0ZDY1ZjdkNTMwNmVlOGVlMjdmZjcxZCIsCiAgICAgICAgICAgICI4MTcyNTBmMWEzZTMzNmRhNzZmNWJkM2ZhNzg0ZTFiMjZkOTU5YjljMTMxODc2ODE1YmEyNjA0MDQ4YjcwYzE4IgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGNwYXRoKS8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0KICAgICAgXSwKICAgICAgImRldmljZXMiOiBbXSwKICAgICAgInNhbmRib3hfcGlkbnMiOiBmYWxzZSwKICAgICAgImV4ZWNfY29tbWFuZHMiOiBbXSwKICAgICAgImVudl9tYXAiOiB7CiAgICAgICAgIlBBVEgiOiAiL3Vzci9sb2NhbC9zYmluOi91c3IvbG9jYWwvYmluOi91c3Ivc2JpbjovdXNyL2Jpbjovc2JpbjovYmluIgogICAgICB9CiAgICB9LAogICAgewogICAgICAiT0NJIjogewogICAgICAgICJWZXJzaW9uIjogIjEuMS4wLXJjLjEiLAogICAgICAgICJQcm9jZXNzIjogewogICAgICAgICAgIlRlcm1pbmFsIjogZmFsc2UsCiAgICAgICAgICAiVXNlciI6IHsKICAgICAgICAgICAgIlVJRCI6IDAsCiAgICAgICAgICAgICJHSUQiOiAwLAogICAgICAgICAgICAiQWRkaXRpb25hbEdpZHMiOiBbXSwKICAgICAgICAgICAgIlVzZXJuYW1lIjogIiIKICAgICAgICAgIH0sCiAgICAgICAgICAiRGVwcmVjYXRlZEFyZ3MiOiBbCiAgICAgICAgICAgICJzaCIKICAgICAgICAgIF0sCiAgICAgICAgICAiQXJncyI6IFsKICAgICAgICAgICAgInNoIgogICAgICAgICAgXSwKICAgICAgICAgICJFbnYiOiBbCiAgICAgICAgICAgICJQQVRIPS91c3IvbG9jYWwvc2JpbjovdXNyL2xvY2FsL2JpbjovdXNyL3NiaW46L3Vzci9iaW46L3NiaW46L2JpbiIsCiAgICAgICAgICAgICJIT1NUTkFNRT0kKGhvc3QtbmFtZSkiCiAgICAgICAgICBdLAogICAgICAgICAgIkN3ZCI6ICIvIiwKICAgICAgICAgICJDYXBhYmlsaXRpZXMiOiB7CiAgICAgICAgICAgICJBbWJpZW50IjogW10sCiAgICAgICAgICAgICJCb3VuZGluZyI6IFsKICAgICAgICAgICAgICAiJChkZWZhdWx0X2NhcHMpIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiRWZmZWN0aXZlIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJJbmhlcml0YWJsZSI6IFtdLAogICAgICAgICAgICAiUGVybWl0dGVkIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICAiTm9OZXdQcml2aWxlZ2VzIjogZmFsc2UKICAgICAgICB9LAogICAgICAgICJSb290IjogewogICAgICAgICAgIlBhdGgiOiAiJChjcGF0aCkvJChidW5kbGUtaWQpIiwKICAgICAgICAgICJSZWFkb25seSI6IHRydWUKICAgICAgICB9LAogICAgICAgICJNb3VudHMiOiBbCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvcHJvYyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAicHJvYyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJwcm9jIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAgICAgIm5vZGV2IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2RldiIsCiAgICAgICAgICAgICJzb3VyY2UiOiAidG1wZnMiLAogICAgICAgICAgICAidHlwZV8iOiAidG1wZnMiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAic3RyaWN0YXRpbWUiLAogICAgICAgICAgICAgICJtb2RlPTc1NSIsCiAgICAgICAgICAgICAgInNpemU9NjU1MzZrIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi9wdHMiLAogICAgICAgICAgICAic291cmNlIjogImRldnB0cyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJkZXZwdHMiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibmV3aW5zdGFuY2UiLAogICAgICAgICAgICAgICJwdG14bW9kZT0wNjY2IiwKICAgICAgICAgICAgICAibW9kZT0wNjIwIiwKICAgICAgICAgICAgICAiZ2lkPTUiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L3NobSIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiL3J1bi9rYXRhLWNvbnRhaW5lcnMvc2FuZGJveC9zaG0iLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvbXF1ZXVlIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJtcXVldWUiLAogICAgICAgICAgICAidHlwZV8iOiAibXF1ZXVlIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAgICAgIm5vZGV2IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL3N5cyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAic3lzZnMiLAogICAgICAgICAgICAidHlwZV8iOiAic3lzZnMiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiLAogICAgICAgICAgICAgICJybyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9zeXMvZnMvY2dyb3VwIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJjZ3JvdXAiLAogICAgICAgICAgICAidHlwZV8iOiAiY2dyb3VwIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAgICAgIm5vZGV2IiwKICAgICAgICAgICAgICAicmVsYXRpbWUiLAogICAgICAgICAgICAgICJybyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9ldGMvaG9zdHMiLAogICAgICAgICAgICAic291cmNlIjogIiQoc2ZwcmVmaXgpaG9zdHMkIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJ3IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi90ZXJtaW5hdGlvbi1sb2ciLAogICAgICAgICAgICAic291cmNlIjogIiQoc2ZwcmVmaXgpdGVybWluYXRpb24tbG9nJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJydyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9ldGMvaG9zdG5hbWUiLAogICAgICAgICAgICAic291cmNlIjogIiQoc2ZwcmVmaXgpaG9zdG5hbWUkIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2V0Yy9yZXNvbHYuY29uZiIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClyZXNvbHYuY29uZiQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicm8iCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvdmFyL3J1bi9zZWNyZXRzL2t1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQiLAogICAgICAgICAgICAic291cmNlIjogIiQoc2ZwcmVmaXgpc2VydmljZWFjY291bnQkIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL3Zhci9ydW4vc2VjcmV0cy9henVyZS90b2tlbnMiLAogICAgICAgICAgICAic291cmNlIjogIiQoc2ZwcmVmaXgpdG9rZW5zJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJybyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9idXN5MSIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiXiQoY3BhdGgpLyQoc2FuZGJveC1pZCkvbG9jYWwvZGF0YSQiLAogICAgICAgICAgICAidHlwZV8iOiAibG9jYWwiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJ3IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2J1c3kyIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJeL3J1bi9rYXRhLWNvbnRhaW5lcnMvc2FuZGJveC9lcGhlbWVyYWwvZGF0YTIkIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJ3IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL215LXZvbHVtZSIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClteS12b2x1bWUkIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJ3IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi90dHlTMCIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiL2Rldi90dHlTMCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJydyIKICAgICAgICAgICAgXQogICAgICAgICAgfQogICAgICAgIF0sCiAgICAgICAgIkFubm90YXRpb25zIjogewogICAgICAgICAgImlvLmthdGFjb250YWluZXJzLnBrZy5vY2kuYnVuZGxlX3BhdGgiOiAiL3J1bi9jb250YWluZXJkL2lvLmNvbnRhaW5lcmQucnVudGltZS52Mi50YXNrL2s4cy5pby8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgImlvLmthdGFjb250YWluZXJzLnBrZy5vY2kuY29udGFpbmVyX3R5cGUiOiAicG9kX2NvbnRhaW5lciIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLW5hbWUiOiAiYnVzeWJveCIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLXR5cGUiOiAiY29udGFpbmVyIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5pbWFnZS1uYW1lIjogIm1jci5taWNyb3NvZnQuY29tL2Frcy9lMmUvbGlicmFyeS1idXN5Ym94Om1hc3Rlci4yMjAzMTQuMS1saW51eC1hbWQ2NCIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCI6ICJeW2EtejAtOV17NjR9JCIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1uYW1lIjogIl5wZXJzaXN0ZW50JCIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1uYW1lc3BhY2UiOiAiIgogICAgICAgIH0sCiAgICAgICAgIkxpbnV4IjogewogICAgICAgICAgIk5hbWVzcGFjZXMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiVHlwZSI6ICJpcGMiLAogICAgICAgICAgICAgICJQYXRoIjogIiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJUeXBlIjogInV0cyIsCiAgICAgICAgICAgICAgIlBhdGgiOiAiIgogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgIlR5cGUiOiAibW91bnQiLAogICAgICAgICAgICAgICJQYXRoIjogIiIKICAgICAgICAgICAgfQogICAgICAgICAgXSwKICAgICAgICAgICJNYXNrZWRQYXRocyI6IFsKICAgICAgICAgICAgIi9wcm9jL2FjcGkiLAogICAgICAgICAgICAiL3Byb2Mva2NvcmUiLAogICAgICAgICAgICAiL3Byb2Mva2V5cyIsCiAgICAgICAgICAgICIvcHJvYy9sYXRlbmN5X3N0YXRzIiwKICAgICAgICAgICAgIi9wcm9jL3RpbWVyX2xpc3QiLAogICAgICAgICAgICAiL3Byb2MvdGltZXJfc3RhdHMiLAogICAgICAgICAgICAiL3Byb2Mvc2NoZWRfZGVidWciLAogICAgICAgICAgICAiL3Byb2Mvc2NzaSIsCiAgICAgICAgICAgICIvc3lzL2Zpcm13YXJlIgogICAgICAgICAgXSwKICAgICAgICAgICJSZWFkb25seVBhdGhzIjogWwogICAgICAgICAgICAiL3Byb2MvYXNvdW5kIiwKICAgICAgICAgICAgIi9wcm9jL2J1cyIsCiAgICAgICAgICAgICIvcHJvYy9mcyIsCiAgICAgICAgICAgICIvcHJvYy9pcnEiLAogICAgICAgICAgICAiL3Byb2Mvc3lzIiwKICAgICAgICAgICAgIi9wcm9jL3N5c3JxLXRyaWdnZXIiCiAgICAgICAgICBdLAogICAgICAgICAgIkRldmljZXMiOiBbXSwKICAgICAgICAgICJTeXNjdGwiOiB7CiAgICAgICAgICAgICJuZXQuaXB2NC5pcF91bnByaXZpbGVnZWRfcG9ydF9zdGFydCI6ICIwIiwKICAgICAgICAgICAgIm5ldC5pcHY0LnBpbmdfZ3JvdXBfcmFuZ2UiOiAiMCAyMTQ3NDgzNjQ3IgogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSwKICAgICAgInN0b3JhZ2VzIjogWwogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2gwKSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjApIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2gxKSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjEpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAib3ZlcmxheWZzIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJmdXNlMy5rYXRhLW92ZXJsYXkiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIyYzM0MmExMzdlNjkzYzc4OThhZWMzNmRhMTA0N2YxOTFkYzdjMTY4N2U2NjE5OGFkYWNjNDM5Y2Y0YWRmMzc5OjI1NzBlM2ExOWUxYmYyMGRkZGE0NTQ5OGE5NjI3ZjYxNTU1ZDJkNmMwMTQ3OWI5Yjc2NDYwYjY3OWIyN2Q1NTIiLAogICAgICAgICAgICAiODU2OGM3MGMwY2NmZTAwNTEwOTJlODE4ZGE3NjkxMTFhNTk4ODJjZDE5ZGQ3OTlkM2JjYTVmZmE4Mjc5MTA4MDpiNjQzYjYyMTc3NDg5ODM4MzBiMjZhYzE0YTM1YTMzMjJkZDUyOGMwMDk2M2VhYWRkOTFlZjU1ZjUxM2RjNzNmIgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGNwYXRoKS8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJsb2NhbCIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAibG9jYWwiLAogICAgICAgICAgImZzdHlwZSI6ICJsb2NhbCIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIm1vZGU9MDc3NyIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiXiQoY3BhdGgpLyQoc2FuZGJveC1pZCkvbG9jYWwvZGF0YSQiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJlcGhlbWVyYWwiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogInRtcGZzIiwKICAgICAgICAgICJmc3R5cGUiOiAidG1wZnMiLAogICAgICAgICAgIm9wdGlvbnMiOiBbXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICJeL3J1bi9rYXRhLWNvbnRhaW5lcnMvc2FuZGJveC9lcGhlbWVyYWwvZGF0YTIkIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9CiAgICAgIF0sCiAgICAgICJkZXZpY2VzIjogW10sCiAgICAgICJzYW5kYm94X3BpZG5zIjogZmFsc2UsCiAgICAgICJleGVjX2NvbW1hbmRzIjogW10sCiAgICAgICJlbnZfbWFwIjogewogICAgICAgICJIT1NUTkFNRSI6ICIkKGhvc3QtbmFtZSkiLAogICAgICAgICJQQVRIIjogIi91c3IvbG9jYWwvc2JpbjovdXNyL2xvY2FsL2JpbjovdXNyL3NiaW46L3Vzci9iaW46L3NiaW46L2JpbiIKICAgICAgfQogICAgfQogIF0sCiAgImNvbW1vbiI6IHsKICAgICJjcGF0aCI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zaGFyZWQvY29udGFpbmVycyIsCiAgICAibW91bnRfc291cmNlX2NwYXRoIjogIi9ydW4va2F0YS1jb250YWluZXJzL3NoYXJlZC9jb250YWluZXJzIiwKICAgICJzZnByZWZpeCI6ICJeJChjcGF0aCkvJChidW5kbGUtaWQpLVthLXowLTldezE2fS0iLAogICAgInNwYXRoIjogIi9ydW4va2F0YS1jb250YWluZXJzL3NhbmRib3gvc3RvcmFnZSIsCiAgICAiaXB2NF9hIjogIigoWzAtOV18WzEtOV1bMC05XXwxWzAtOV17Mn18MlswLTRdWzAtOV18MjVbMC01XSlcXC4pezN9KFswLTldfFsxLTldWzAtOV18MVswLTldezJ9fDJbMC00XVswLTldfDI1WzAtNV0pIiwKICAgICJpcF9wIjogIlswLTldezEsNX0iLAogICAgInN2Y19uYW1lIjogIltBLVpfXFwuXFwtXSsiLAogICAgImRuc19sYWJlbCI6ICJbYS16QS1aMC05X1xcLlxcLV0rIiwKICAgICJzX3NvdXJjZTEiOiAiXi4uMlswLTldezN9X1swLTFdWzAtOV1fWzAtM11bMC05XV9bMC0yXVswLTldX1swLTVdWzAtOV1fWzAtNV1bMC05XVxcLlswLTldezEsMTB9JCIsCiAgICAic19zb3VyY2UyIjogIl4uLmRhdGEvIiwKICAgICJkbnNfc3ViZG9tYWluIjogIl5bYS16MC05XShbLWEtejAtOV0qW2EtejAtOV0pPyQiLAogICAgInBvZF91aWQiOiAiXlswLTlhLWZBLUZdezh9LVswLTlhLWZBLUZdezR9LVswLTlhLWZBLUZdezR9LVswLTlhLWZBLUZdezR9LVswLTlhLWZBLUZdezEyfSQiLAogICAgImRlZmF1bHRfY2FwcyI6IFsKICAgICAgIkNBUF9DSE9XTiIsCiAgICAgICJDQVBfREFDX09WRVJSSURFIiwKICAgICAgIkNBUF9GU0VUSUQiLAogICAgICAiQ0FQX0ZPV05FUiIsCiAgICAgICJDQVBfTUtOT0QiLAogICAgICAiQ0FQX05FVF9SQVciLAogICAgICAiQ0FQX1NFVEdJRCIsCiAgICAgICJDQVBfU0VUVUlEIiwKICAgICAgIkNBUF9TRVRGQ0FQIiwKICAgICAgIkNBUF9TRVRQQ0FQIiwKICAgICAgIkNBUF9ORVRfQklORF9TRVJWSUNFIiwKICAgICAgIkNBUF9TWVNfQ0hST09UIiwKICAgICAgIkNBUF9LSUxMIiwKICAgICAgIkNBUF9BVURJVF9XUklURSIKICAgIF0sCiAgICAicHJpdmlsZWdlZF9jYXBzIjogWwogICAgICAiQ0FQX0NIT1dOIiwKICAgICAgIkNBUF9EQUNfT1ZFUlJJREUiLAogICAgICAiQ0FQX0RBQ19SRUFEX1NFQVJDSCIsCiAgICAgICJDQVBfRk9XTkVSIiwKICAgICAgIkNBUF9GU0VUSUQiLAogICAgICAiQ0FQX0tJTEwiLAogICAgICAiQ0FQX1NFVEdJRCIsCiAgICAgICJDQVBfU0VUVUlEIiwKICAgICAgIkNBUF9TRVRQQ0FQIiwKICAgICAgIkNBUF9MSU5VWF9JTU1VVEFCTEUiLAogICAgICAiQ0FQX05FVF9CSU5EX1NFUlZJQ0UiLAogICAgICAiQ0FQX05FVF9CUk9BRENBU1QiLAogICAgICAiQ0FQX05FVF9BRE1JTiIsCiAgICAgICJDQVBfTkVUX1JBVyIsCiAgICAgICJDQVBfSVBDX0xPQ0siLAogICAgICAiQ0FQX0lQQ19PV05FUiIsCiAgICAgICJDQVBfU1lTX01PRFVMRSIsCiAgICAgICJDQVBfU1lTX1JBV0lPIiwKICAgICAgIkNBUF9TWVNfQ0hST09UIiwKICAgICAgIkNBUF9TWVNfUFRSQUNFIiwKICAgICAgIkNBUF9TWVNfUEFDQ1QiLAogICAgICAiQ0FQX1NZU19BRE1JTiIsCiAgICAgICJDQVBfU1lTX0JPT1QiLAogICAgICAiQ0FQX1NZU19OSUNFIiwKICAgICAgIkNBUF9TWVNfUkVTT1VSQ0UiLAogICAgICAiQ0FQX1NZU19USU1FIiwKICAgICAgIkNBUF9TWVNfVFRZX0NPTkZJRyIsCiAgICAgICJDQVBfTUtOT0QiLAogICAgICAiQ0FQX0xFQVNFIiwKICAgICAgIkNBUF9BVURJVF9XUklURSIsCiAgICAgICJDQVBfQVVESVRfQ09OVFJPTCIsCiAgICAgICJDQVBfU0VURkNBUCIsCiAgICAgICJDQVBfTUFDX09WRVJSSURFIiwKICAgICAgIkNBUF9NQUNfQURNSU4iLAogICAgICAiQ0FQX1NZU0xPRyIsCiAgICAgICJDQVBfV0FLRV9BTEFSTSIsCiAgICAgICJDQVBfQkxPQ0tfU1VTUEVORCIsCiAgICAgICJDQVBfQVVESVRfUkVBRCIsCiAgICAgICJDQVBfUEVSRk1PTiIsCiAgICAgICJDQVBfQlBGIiwKICAgICAgIkNBUF9DSEVDS1BPSU5UX1JFU1RPUkUiCiAgICBdLAogICAgInZpcnRpb19ibGtfc3RvcmFnZV9jbGFzc2VzIjogWwogICAgICAiY2MtbG9jYWwtY3NpIiwKICAgICAgImNjLW1hbmFnZWQtY3NpIiwKICAgICAgImNjLW1hbmFnZWQtcHJlbWl1bS1jc2kiCiAgICBdLAogICAgInNtYl9zdG9yYWdlX2NsYXNzZXMiOiBbCiAgICAgIHsKICAgICAgICAibmFtZSI6ICJhenVyZWZpbGUtY3NpLWthdGEtY2MiLAogICAgICAgICJtb3VudF9vcHRpb25zIjogWwogICAgICAgICAgImRpcl9tb2RlPTA3NzciLAogICAgICAgICAgImZpbGVfbW9kZT0wNzc3IiwKICAgICAgICAgICJtZnN5bWxpbmtzIiwKICAgICAgICAgICJjYWNoZT1zdHJpY3QiLAogICAgICAgICAgIm5vc2hhcmVzb2NrIiwKICAgICAgICAgICJhY3RpbWVvPTMwIiwKICAgICAgICAgICJub2JybCIKICAgICAgICBdCiAgICAgIH0KICAgIF0KICB9LAogICJzYW5kYm94IjogewogICAgInN0b3JhZ2VzIjogWwogICAgICB7CiAgICAgICAgImRyaXZlciI6ICJlcGhlbWVyYWwiLAogICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICJzb3VyY2UiOiAic2htIiwKICAgICAgICAiZnN0eXBlIjogInRtcGZzIiwKICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAibm9kZXYiLAogICAgICAgICAgIm1vZGU9MTc3NyIsCiAgICAgICAgICAic2l6ZT02NzEwODg2NCIKICAgICAgICBdLAogICAgICAgICJtb3VudF9wb2ludCI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L3NobSIsCiAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICB9CiAgICBdCiAgfSwKICAicmVxdWVzdF9kZWZhdWx0cyI6IHsKICAgICJDcmVhdGVDb250YWluZXJSZXF1ZXN0IjogewogICAgICAiYWxsb3dfZW52X3JlZ2V4IjogWwogICAgICAgICJeSE9TVE5BTUU9JChkbnNfbGFiZWwpJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9QT1JUXyQoaXBfcClfVENQPXRjcDovLyQoaXB2NF9hKTokKGlwX3ApJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9QT1JUXyQoaXBfcClfVENQX1BST1RPPXRjcCQiLAogICAgICAgICJeJChzdmNfbmFtZSlfUE9SVF8kKGlwX3ApX1RDUF9QT1JUPSQoaXBfcCkkIiwKICAgICAgICAiXiQoc3ZjX25hbWUpX1BPUlRfJChpcF9wKV9UQ1BfQUREUj0kKGlwdjRfYSkkIiwKICAgICAgICAiXiQoc3ZjX25hbWUpX1NFUlZJQ0VfSE9TVD0kKGlwdjRfYSkkIiwKICAgICAgICAiXiQoc3ZjX25hbWUpX1NFUlZJQ0VfUE9SVD0kKGlwX3ApJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9TRVJWSUNFX1BPUlRfJChkbnNfbGFiZWwpPSQoaXBfcCkkIiwKICAgICAgICAiXiQoc3ZjX25hbWUpX1BPUlQ9dGNwOi8vJChpcHY0X2EpOiQoaXBfcCkkIiwKICAgICAgICAiXkFaVVJFX0NMSUVOVF9JRD1bQS1GYS1mMC05LV0qJCIsCiAgICAgICAgIl5BWlVSRV9URU5BTlRfSUQ9W0EtRmEtZjAtOS1dKiQiLAogICAgICAgICJeQVpVUkVfRkVERVJBVEVEX1RPS0VOX0ZJTEU9L3Zhci9ydW4vc2VjcmV0cy9henVyZS90b2tlbnMvYXp1cmUtaWRlbnRpdHktdG9rZW4kIiwKICAgICAgICAiXkFaVVJFX0FVVEhPUklUWV9IT1NUPWh0dHBzOi8vbG9naW5cXC5taWNyb3NvZnRvbmxpbmVcXC5jb20vJCIsCiAgICAgICAgIl5URVJNPXh0ZXJtJCIKICAgICAgXSwKICAgICAgImFsbG93X2Vudl9yZWdleF9tYXAiOiB7CiAgICAgICAgIkNQVV9MSU1JVCI6ICJeWzAtOV0rJCIsCiAgICAgICAgIkpPQl9DT01QTEVUSU9OX0lOREVYIjogIl5bMC05XSokIiwKICAgICAgICAiTUVNT1JZX0xJTUlUIjogIl5bMC05XSskIgogICAgICB9CiAgICB9LAogICAgIkNvcHlGaWxlUmVxdWVzdCI6IFsKICAgICAgIiQoc2ZwcmVmaXgpIgogICAgXSwKICAgICJFeGVjUHJvY2Vzc1JlcXVlc3QiOiB7CiAgICAgICJhbGxvd2VkX2NvbW1hbmRzIjogW10sCiAgICAgICJyZWdleCI6IFtdCiAgICB9LAogICAgIlVwZGF0ZVJvdXRlc1JlcXVlc3QiOiB7CiAgICAgICJmb3JiaWRkZW5fZGV2aWNlX25hbWVzIjogWwogICAgICAgICJsbyIKICAgICAgXSwKICAgICAgImZvcmJpZGRlbl9zb3VyY2VfcmVnZXgiOiBbCiAgICAgICAgIl4oPzowezAsNH06KXswLDd9MHswLDN9MSQiLAogICAgICAgICJeMTI3XFwuKD86WzAtOV17MSwzfVxcLil7Mn1bMC05XXsxLDN9JCIKICAgICAgXQogICAgfSwKICAgICJVcGRhdGVJbnRlcmZhY2VSZXF1ZXN0IjogewogICAgICAiYWxsb3dfcmF3X2ZsYWdzIjogMTI4LAogICAgICAiZm9yYmlkZGVuX25hbWVzIjogWwogICAgICAgICJsbyIKICAgICAgXSwKICAgICAgImZvcmJpZGRlbl9od19hZGRycyI6IFsKICAgICAgICAiMDA6MDA6MDA6MDA6MDA6MDAiCiAgICAgIF0KICAgIH0sCiAgICAiQ2xvc2VTdGRpblJlcXVlc3QiOiBmYWxzZSwKICAgICJSZWFkU3RyZWFtUmVxdWVzdCI6IGZhbHNlLAogICAgIlVwZGF0ZUVwaGVtZXJhbE1vdW50c1JlcXVlc3QiOiBmYWxzZSwKICAgICJXcml0ZVN0cmVhbVJlcXVlc3QiOiBmYWxzZQogIH0KfQ== +spec: + restartPolicy: Never + runtimeClassName: kata-cc + hostNetwork: true + containers: + - name: busybox + image: "mcr.microsoft.com/aks/e2e/library-busybox:master.220314.1-linux-amd64" + securityContext: + readOnlyRootFilesystem: true + volumeMounts: + - mountPath: /busy1 + name: data + - mountPath: /busy2 + name: data2 + - mountPath: /my-volume + name: my-pod-volume + - mountPath: /dev/ttyS0 + name: dev-ttys0 + volumes: + - name: data + emptyDir: {} + - name: data2 + emptyDir: + medium: Memory + - name: my-pod-volume + persistentVolumeClaim: + claimName: my-volume-claim + - name: dev-ttys0 + hostPath: + path: /dev/ttyS0 diff --git a/src/agent/samples/policy/yaml/pod/pod-same-containers.yaml b/src/agent/samples/policy/yaml/pod/pod-same-containers.yaml new file mode 100644 index 000000000000..9b3fdad3c209 --- /dev/null +++ b/src/agent/samples/policy/yaml/pod/pod-same-containers.yaml @@ -0,0 +1,91 @@ +--- +apiVersion: v1 +kind: Pod +metadata: + name: same-containers + labels: + run: busybox + annotations: + io.katacontainers.config.agent.policyOption.execCommands: W3siY29udGFpbmVyTmFtZSI6ImJ1c3lib3gyIiwiZXhlY0NvbW1hbmRzIjpbImRoIC1oIiwicHMgLWVmIl19LCB7ImNvbnRhaW5lck5hbWUiOiJidXN5Ym94MyIsImV4ZWNDb21tYW5kcyI6WyJscyJdfV0= + io.katacontainers.config.agent.policy: IyBDb3B5cmlnaHQgKGMpIDIwMjMgTWljcm9zb2Z0IENvcnBvcmF0aW9uCiMKIyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMAojCnBhY2thZ2UgYWdlbnRfcG9saWN5CgppbXBvcnQgZnV0dXJlLmtleXdvcmRzLmluCmltcG9ydCBmdXR1cmUua2V5d29yZHMuZXZlcnkKCiMgRGVmYXVsdCB2YWx1ZXMsIHJldHVybmVkIGJ5IE9QQSB3aGVuIHJ1bGVzIGNhbm5vdCBiZSBldmFsdWF0ZWQgdG8gdHJ1ZS4KZGVmYXVsdCBBZGRBUlBOZWlnaGJvcnNSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgQWRkU3dhcFJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBDbG9zZVN0ZGluUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IENvcHlGaWxlUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IENyZWF0ZUNvbnRhaW5lclJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBDcmVhdGVTYW5kYm94UmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IERlc3Ryb3lTYW5kYm94UmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgRXhlY1Byb2Nlc3NSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgR2V0T09NRXZlbnRSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBHdWVzdERldGFpbHNSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBMaXN0SW50ZXJmYWNlc1JlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBMaXN0Um91dGVzUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IE1lbUhvdHBsdWdCeVByb2JlUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IE9ubGluZUNQVU1lbVJlcXVlc3QgOj0gdHJ1ZQpkZWZhdWx0IFBhdXNlQ29udGFpbmVyUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFJlYWRTdHJlYW1SZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgUmVtb3ZlQ29udGFpbmVyUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgUmVtb3ZlU3RhbGVWaXJ0aW9mc1NoYXJlTW91bnRzUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgUmVzZWVkUmFuZG9tRGV2UmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFJlc3VtZUNvbnRhaW5lclJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBTZXRHdWVzdERhdGVUaW1lUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFNldFBvbGljeVJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBTaWduYWxQcm9jZXNzUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgU3RhcnRDb250YWluZXJSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBTdGFydFRyYWNpbmdSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgU3RhdHNDb250YWluZXJSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBTdG9wVHJhY2luZ1JlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBUdHlXaW5SZXNpemVSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBVcGRhdGVDb250YWluZXJSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgVXBkYXRlRXBoZW1lcmFsTW91bnRzUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFVwZGF0ZUludGVyZmFjZVJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBVcGRhdGVSb3V0ZXNSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgV2FpdFByb2Nlc3NSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBXcml0ZVN0cmVhbVJlcXVlc3QgOj0gZmFsc2UKCiMgQWxsb3dSZXF1ZXN0c0ZhaWxpbmdQb2xpY3kgOj0gdHJ1ZSBjb25maWd1cmVzIHRoZSBBZ2VudCB0byAqYWxsb3cgYW55CiMgcmVxdWVzdHMgY2F1c2luZyBhIHBvbGljeSBmYWlsdXJlKi4gVGhpcyBpcyBhbiB1bnNlY3VyZSBjb25maWd1cmF0aW9uCiMgYnV0IGlzIHVzZWZ1bCBmb3IgYWxsb3dpbmcgdW5zZWN1cmUgcG9kcyB0byBzdGFydCwgdGhlbiBjb25uZWN0IHRvCiMgdGhlbSBhbmQgaW5zcGVjdCBPUEEgbG9ncyBmb3IgdGhlIHJvb3QgY2F1c2Ugb2YgYSBmYWlsdXJlLgpkZWZhdWx0IEFsbG93UmVxdWVzdHNGYWlsaW5nUG9saWN5IDo9IGZhbHNlCgojIENvbnN0YW50cwpTX05BTUVfS0VZID0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZSIKU19OQU1FU1BBQ0VfS0VZID0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZXNwYWNlIgpCVU5ETEVfSUQgPSAiW2EtejAtOV17NjR9IgoKQ3JlYXRlQ29udGFpbmVyUmVxdWVzdDo9IHJlc3AgewogICAgbm90IGlzX251bGwoaW5wdXQuZW52X21hcCkKICAgIAogICAgaV9lbnZfbWFwIDo9IGlucHV0LmVudl9tYXAKICAgIAogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBwX2Vudl9tYXAgOj0gcF9jb250YWluZXIuZW52X21hcCAgCiAgICBhbGxvd19lbnZfbWFwKHBfZW52X21hcCwgaV9lbnZfbWFwKQogICAgCiAgICBpX3Byb2Nlc3MgOj0gaW5wdXQuYmFzZS5PQ0kuUHJvY2VzcwogICAgCiAgICBwX3Byb2Nlc3MgOj0gcF9jb250YWluZXIuT0NJLlByb2Nlc3MKICAgIAogICAgYWxsb3dfYXJncyhpX3Byb2Nlc3MsIHBfcHJvY2VzcywgaV9lbnZfbWFwKQoKICAgIHJlc3AgPSBDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uKGlucHV0LmJhc2UpCiAgICBwcmludCgiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdDogdHJ1ZSIpCn0KCmFsbG93X2FyZ3MoaV9wcm9jZXNzLCBwX3Byb2Nlc3MsIGlfZW52X21hcCkgewogICAgaV9hcmdzIDo9IGlfcHJvY2Vzcy5BcmdzCiAgICBwX2FyZ3MgOj0gcF9wcm9jZXNzLkFyZ3MKICAgIHByaW50KCJhbGxvd19hcmdzOiBpX2FyZ3MgPSIsIGlfYXJncywgInBfYXJncyA9IiwgcF9hcmdzKQogICAgY291bnQoaV9hcmdzKSA9PSBjb3VudChwX2FyZ3MpCiAgICBldmVyeSBpLCBpX2FyZyBpbiBpX2FyZ3MgewogICAgICAgIHByaW50KCJhbGxvd19hcmdzOiBpX2FyZyA9IiwgaV9hcmcpCiAgICAgICAgcF9hcmdfcmVwbGFjZWQgOj0gcmVwbGFjZV9lbnZfdmFyaWFibGVzKHBfYXJnc1tpXSwgaV9lbnZfbWFwKQogICAgICAgIHByaW50KCJhbGxvd19hcmdzOiBwX2FyZ19yZXBsYWNlZCA9IiwgcF9hcmdfcmVwbGFjZWQpCiAgICAgICAgcF9hcmdfcmVwbGFjZWQyIDo9IHJlcGxhY2UocF9hcmdfcmVwbGFjZWQsICIkJCIsICIkIikKICAgICAgICBwcmludCgiYWxsb3dfYXJnczogcF9hcmdfcmVwbGFjZWQyID0iLCBwX2FyZ19yZXBsYWNlZDIpCiAgICAgICAgaV9hcmcgPT0gcF9hcmdfcmVwbGFjZWQyCiAgICB9CiAgICBwcmludCgiYWxsb3dfYXJnczogdHJ1ZSIpCn0KCmFsbG93X2FyZ3MoaV9wcm9jZXNzLCBwX3Byb2Nlc3MsIGlfZW52X21hcCkgewogICAgbm90IGlfcHJvY2Vzcy5BcmdzCiAgICBub3QgcF9wcm9jZXNzLkFyZ3MKICAgIHByaW50KCJhbGxvd19hcmdzMjogbm8gYXJncyIpCn0KCiMgdGhpcyBmdW5jdGlvbiByZXBsYWNlcyBhbGwgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyBpbiBhIHN0cmluZywgZ2l2ZW4gYSBtYXAgb2YgZW52aXJvbm1lbnQga2V5cyB0byBlbnZpcm9ubWVudCB2YWx1ZXMKIyBlZyBzdHIgPSAiZWNobyAkKENMVVNURVJfSUQpOyBlY2hvICQoTk9ERV9OQU1FKTsiCiMgZW52X21hcCA9IHsiQ0xVU1RFUl9JRCI6ICJhYmMiLCAiTk9ERV9OQU1FIiA6ICJ4eXoifQojIHJlc3VsdCA9ICJlY2hvIGFiYzsgZWNobyB4eXo7IgpyZXBsYWNlX2Vudl92YXJpYWJsZXMoc3RyLCBlbnZfbWFwKSA9IHJlc3VsdCB7CiAgICAjIG1ha2UgYW4gYXJyYXkgb2YgdGhlIGtleXMgZWcgWyJDTFVTVEVSX0lEIiwgIk5PREVfTkFNRSJdCiAgICBrZXlzIDo9IFt4IHwgc29tZSB4IGluIG9iamVjdC5rZXlzKGVudl9tYXApXQogICAgcmVzdWx0IDo9IHJlcGxhY2Vfc3RyX3JlYyhzdHIsIGVudl9tYXAsIGtleXMsIGNvdW50KGtleXMpIC0gMSkKfQoKIyBiYXNlIGNhc2UKcmVwbGFjZV9zdHJfcmVjKHN0ciwgZW52X21hcCwgYXJyX2tleXMsIGkpID0gcmVzdWx0IHsKICAgIGkgPCAwCiAgICByZXN1bHQgOj0gc3RyCn0KCiMgcmVjdXJzaXZlIHN0ZXAKcmVwbGFjZV9zdHJfcmVjKHN0ciwgZW52X21hcCwgYXJyX2tleXMsIGkpID0gcmVzdWx0IHsKICAgIGkgPj0gMAogICAga2V5IDo9IGFycl9rZXlzW2ldCiAgICBlbnZfa2V5MSA6PSBjb25jYXQoIiIsIFsiJCgiLCBrZXksICIpIl0pCiAgICAjIHJlcGxhY2UgJChWQVIpIHdpdGggdmFsdWUKICAgIG5ld19zdHIxIDo9IHJlcGxhY2Uoc3RyLCBlbnZfa2V5MSwgZW52X21hcFtrZXldKQogICAgIyByZXBsYWNlIG5leHQgZW52aXJvbm1lbnQgdmFyaWFibGUKICAgIHJlc3VsdCA9IHJlcGxhY2Vfc3RyX3JlYyhuZXdfc3RyMSwgZW52X21hcCwgYXJyX2tleXMsIGkgLSAxKQp9CgphbGxvd19lbnZfbWFwKHBfZW52X21hcCwgaV9lbnZfbWFwKSB7CiAgICBwcmludCgiYWxsb3dfZW52X21hcDogcF9lbnZfbWFwID0iLCBwX2Vudl9tYXApCiAgICBldmVyeSBlbnZfa2V5LCBlbnZfdmFsIGluIGlfZW52X21hcCB7CiAgICAgICAgcHJpbnQoImFsbG93X2VudjogZW52X2tleSA9IiwgZW52X2tleSwgImVudl92YWwgPSIsIGVudl92YWwpCiAgICAgICAgYWxsb3dfZW52X21hcF9lbnRyeShlbnZfa2V5LCBlbnZfdmFsLCBwX2Vudl9tYXApCiAgICB9CiAgICBwcmludCgiYWxsb3dfZW52X21hcDogdHJ1ZSIpCn0KCiMgQWxsb3cgZXhhY3QgbWF0Y2gKYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBpX3ZhbCA9PSBwX3ZhbAogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnk6IHRydWUiKQp9CgojIEFsbG93IHJlc291cmNlRmllbGRSZWYgdmFsdWVzIChlLmcuLCAibGltaXRzLmNwdSIpLgphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgICMgYSB2YXJpYWJsZSB3ZSBzaG91bGQgYmUgdmFsaWRhdGluZyB1c2luZyBhIHJlZ2V4IGZyb20gc2V0dGluZ3MKICAgIHBfdmFsID09ICIkKHZhbGlkYXRlLWZyb20tc2V0dGluZ3MpIgogICAgcmVnZXhfdmFsIDo9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuQ3JlYXRlQ29udGFpbmVyUmVxdWVzdC5hbGxvd19lbnZfcmVnZXhfbWFwW2tleV0KICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4X3ZhbCwgaV92YWwpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSAyOiB0cnVlIikKfQoKIyBBbGxvdyBub2RlLW5hbWUKYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChub2RlLW5hbWUpIgogICAgcmVnZXgubWF0Y2gocG9saWN5X2RhdGEuY29tbW9uLmRuc19zdWJkb21haW4gLCBpX3ZhbCkKICAgIHByaW50KCJhbGxvd19lbnZfbWFwX2VudHJ5IDM6IHRydWUiKQp9CgojIEFsbG93IGhvc3QtbmFtZQphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgIHBfdmFsID09ICIkKGhvc3QtbmFtZSkiCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24uZG5zX2xhYmVsICwgaV92YWwpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSA0OiB0cnVlIikKfQoKIyBBbGxvdyBwb2QtdWlkCmFsbG93X2Vudl9tYXBfZW50cnkoa2V5LCBpX3ZhbCwgcF9lbnZfbWFwKSB7CiAgICBwX3ZhbCA6PSBwX2Vudl9tYXBba2V5XQogICAgcF92YWwgPT0gIiQocG9kLXVpZCkiCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24ucG9kX3VpZCAsIGlfdmFsKQogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgNTogdHJ1ZSIpCn0KCiMgQWxsb3cgZmllbGRSZWYgImZpZWxkUGF0aDogc3RhdHVzLnBvZElQIiB2YWx1ZXMuCmFsbG93X2Vudl9tYXBfZW50cnkoa2V5LCBpX3ZhbCwgcF9lbnZfbWFwKSB7CiAgICBpc19pcChpX3ZhbCkKCiAgICBwX3ZhbCA6PSBwX2Vudl9tYXBba2V5XQogICAgcF92YXIgOj0gY29uY2F0KCI9IiwgW2tleSwgcF92YWxdKQogICAgYWxsb3dfcG9kX2lwX3ZhcihrZXksIHBfdmFyKQogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgNjogdHJ1ZSIpCn0KCiMgQWxsb3cgZmllbGRSZWYgImZpZWxkUGF0aDogc3RhdHVzLmhvc3RJUCIgdmFsdWVzLgphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgaXNfaXAoaV92YWwpCgogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgIHBfdmFyIDo9IGNvbmNhdCgiPSIsIFtrZXksIHBfdmFsXSkKICAgIGFsbG93X2hvc3RfaXBfdmFyKGtleSwgcF92YXIpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSA3OiB0cnVlIikKfQoKIyBNYXRjaCBpbnB1dCB3aXRoIG9uZSBvZiB0aGUgcG9saWN5IHZhcmlhYmxlcywgYWZ0ZXIgc3Vic3RpdHV0aW5nICQoc2FuZGJveC1uYW1lKS4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChzYW5kYm94LW5hbWUpIgogICAgc19uYW1lIDo9IGlucHV0LmJhc2UuT0NJLkFubm90YXRpb25zW1NfTkFNRV9LRVldCiAgICBwX3ZhcjIgOj0gcmVwbGFjZShwX3ZhbCwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHBfdmFyMiA9PSBpX3ZhbAogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgODogdHJ1ZSIpCn0KCiMgTWF0Y2ggaW5wdXQgd2l0aCBvbmUgb2YgdGhlIHBvbGljeSB2YXJpYWJsZXMsIGFmdGVyIHN1YnN0aXR1dGluZyAkKHNhbmRib3gtbmFtZXNwYWNlKS4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChzYW5kYm94LW5hbWVzcGFjZSkiCiAgICBzX25hbWVzcGFjZSA6PSBpbnB1dC5iYXNlLk9DSS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwX3ZhcjIgOj0gcmVwbGFjZShwX3ZhbCwgIiQoc2FuZGJveC1uYW1lc3BhY2UpIiwgc19uYW1lc3BhY2UpCiAgICBwX3ZhcjIgPT0gaV92YWwKICAgIHByaW50KCJhbGxvd19lbnZfbWFwX2VudHJ5IDk6IHRydWUiKQp9CgojIEFsbG93IGlucHV0IGVudiB2YXJpYWJsZXMgdGhhdCBtYXRjaCB3aXRoIGEgcmVxdWVzdF9kZWZhdWx0cyByZWdleC4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHNvbWUgcF9yZWdleDEgaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5DcmVhdGVDb250YWluZXJSZXF1ZXN0LmFsbG93X2Vudl9yZWdleAogICAgcF9yZWdleDIgOj0gcmVwbGFjZShwX3JlZ2V4MSwgIiQoaXB2NF9hKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcHY0X2EpCiAgICBwX3JlZ2V4MyA6PSByZXBsYWNlKHBfcmVnZXgyLCAiJChpcF9wKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcF9wKQogICAgcF9yZWdleDQgOj0gcmVwbGFjZShwX3JlZ2V4MywgIiQoc3ZjX25hbWUpIiwgcG9saWN5X2RhdGEuY29tbW9uLnN2Y19uYW1lKQogICAgcF9yZWdleDUgOj0gcmVwbGFjZShwX3JlZ2V4NCwgIiQoZG5zX2xhYmVsKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5kbnNfbGFiZWwpCgogICAgcmVzdWx0IDo9IGNvbmNhdCgiPSIsIFtrZXksIGlfdmFsXSkKICAgIHJlZ2V4Lm1hdGNoKHBfcmVnZXg1LCByZXN1bHQpCgogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgMTA6IHRydWUiKQp9CgpDcmVhdGVDb250YWluZXJSZXF1ZXN0Oj0gcmVzcCB7CiAgICBub3QgaW5wdXQuZW52X21hcAogICAgaV9wcm9jZXNzID0gaW5wdXQuT0NJLlByb2Nlc3MKICAgIHNfbmFtZSA9IGlucHV0Lk9DSS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBwX3Byb2Nlc3MgPSBwX2NvbnRhaW5lci5PQ0kuUHJvY2VzcwogICAgYWxsb3dfZGVwcmVjYXRlZF9hcmdzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUpCiAgICByZXNwID0gQ3JlYXRlQ29udGFpbmVyUmVxdWVzdENvbW1vbihpbnB1dCkKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0MjogdHJ1ZSIpCn0KCkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb24ocmVxKTo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgICMgQ2hlY2sgaWYgdGhlIGlucHV0IHJlcXVlc3Qgc2hvdWxkIGJlIHJlamVjdGVkIGV2ZW4gYmVmb3JlIGNoZWNraW5nIHRoZQogICAgIyBwb2xpY3lfZGF0YS5jb250YWluZXJzIGluZm9ybWF0aW9uLgogICAgYWxsb3dfY3JlYXRlX2NvbnRhaW5lcl9pbnB1dChyZXEpCgogICAgaV9vY2kgOj0gcmVxLk9DSQogICAgaV9zdG9yYWdlcyA6PSByZXEuc3RvcmFnZXMKICAgIGlfZGV2aWNlcyA6PSByZXEuZGV2aWNlcwoKICAgICMgYXJyYXkgb2YgcG9zc2libGUgc3RhdGUgb3BlcmF0aW9ucwogICAgb3BzX2J1aWxkZXIgOj0gW10KCiAgICAjIGNoZWNrIHNhbmRib3ggbmFtZQogICAgc2FuZGJveF9uYW1lID0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FX0tFWV0KICAgIGFkZF9zYW5kYm94X25hbWVfdG9fc3RhdGUgOj0gc3RhdGVfYWxsb3dzKCJzYW5kYm94X25hbWUiLCBzYW5kYm94X25hbWUpCiAgICBvcHNfYnVpbGRlcjEgOj0gY29uY2F0X29wX2lmX25vdF9udWxsKG9wc19idWlsZGVyLCBhZGRfc2FuZGJveF9uYW1lX3RvX3N0YXRlKQoKICAgICMgQ2hlY2sgaWYgYW55IGVsZW1lbnQgZnJvbSB0aGUgcG9saWN5X2RhdGEuY29udGFpbmVycyBhcnJheSBhbGxvd3MgdGhlIGlucHV0IHJlcXVlc3QuCiAgICBzb21lIHBfY29udGFpbmVyIGluIHBvbGljeV9kYXRhLmNvbnRhaW5lcnMKICAgIHByaW50KCI9PT09PT09PSBDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiB0cnlpbmcgbmV4dCBwb2xpY3kgY29udGFpbmVyIikKCiAgICBwX3BpZG5zIDo9IHBfY29udGFpbmVyLnNhbmRib3hfcGlkbnMKICAgIGlfcGlkbnMgOj0gcmVxLnNhbmRib3hfcGlkbnMKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiBwX3BpZG5zID0iLCBwX3BpZG5zLCAiaV9waWRucyA9IiwgaV9waWRucykKICAgIHBfcGlkbnMgPT0gaV9waWRucwoKICAgIHBfb2NpIDo9IHBfY29udGFpbmVyLk9DSQoKICAgICMgY2hlY2sgbmFtZXNwYWNlCiAgICBwX25hbWVzcGFjZSA6PSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBpX25hbWVzcGFjZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwcmludCAoIkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb246IHBfbmFtZXNwYWNlID0iLCBwX25hbWVzcGFjZSwgImlfbmFtZXNwYWNlID0iLCBpX25hbWVzcGFjZSkKICAgIGFkZF9uYW1lc3BhY2VfdG9fc3RhdGUgOj0gYWxsb3dfbmFtZXNwYWNlKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkKICAgIG9wc19idWlsZGVyMiA6PSBjb25jYXRfb3BfaWZfbm90X251bGwob3BzX2J1aWxkZXIxLCBhZGRfbmFtZXNwYWNlX3RvX3N0YXRlKQoKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiBwIFZlcnNpb24gPSIsIHBfb2NpLlZlcnNpb24sICJpIFZlcnNpb24gPSIsIGlfb2NpLlZlcnNpb24pCiAgICBwX29jaS5WZXJzaW9uID09IGlfb2NpLlZlcnNpb24KCiAgICBwcmludCgiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdENvbW1vbjogcCBSZWFkb25seSA9IiwgcF9vY2kuUm9vdC5SZWFkb25seSwgImkgUmVhZG9ubHkgPSIsIGlfb2NpLlJvb3QuUmVhZG9ubHkpCiAgICBwX29jaS5Sb290LlJlYWRvbmx5ID09IGlfb2NpLlJvb3QuUmVhZG9ubHkKCiAgICBhbGxvd19hbm5vKHBfb2NpLCBpX29jaSkKCiAgICBwX3N0b3JhZ2VzIDo9IHBfY29udGFpbmVyLnN0b3JhZ2VzCiAgICBhbGxvd19ieV9hbm5vKHBfb2NpLCBpX29jaSwgcF9zdG9yYWdlcywgaV9zdG9yYWdlcykKCiAgICBwX2RldmljZXMgOj0gcF9jb250YWluZXIuZGV2aWNlcwogICAgYWxsb3dfZGV2aWNlcyhwX2RldmljZXMsIGlfZGV2aWNlcykKCiAgICByZXQgOj0gYWxsb3dfbGludXgob3BzX2J1aWxkZXIyLCBwX29jaSwgaV9vY2kpCiAgICByZXQuYWxsb3dlZAoKICAgIG9wcyA6PSByZXQub3BzCgogICAgcHJpbnQoIkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb246IHRydWUiKQp9CgphbGxvd19jcmVhdGVfY29udGFpbmVyX2lucHV0KHJlcSkgewogICAgcHJpbnQoImFsbG93X2NyZWF0ZV9jb250YWluZXJfaW5wdXQ6IGlucHV0ID0iLCByZXEpCgogICAgY291bnQocmVxLnNoYXJlZF9tb3VudHMpID09IDAKICAgIGlzX251bGwocmVxLnN0cmluZ191c2VyKQoKICAgIGlfb2NpIDo9IHJlcS5PQ0kKICAgIGlzX251bGwoaV9vY2kuSG9va3MpCiAgICBpc19udWxsKGlfb2NpLlNvbGFyaXMpCiAgICBpc19udWxsKGlfb2NpLldpbmRvd3MpCgogICAgaV9saW51eCA6PSBpX29jaS5MaW51eAogICAgY291bnQoaV9saW51eC5HSURNYXBwaW5ncykgPT0gMAogICAgY291bnQoaV9saW51eC5Nb3VudExhYmVsKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlJlc291cmNlcy5EZXZpY2VzKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlJvb3Rmc1Byb3BhZ2F0aW9uKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlVJRE1hcHBpbmdzKSA9PSAwCiAgICBpc19udWxsKGlfbGludXguSW50ZWxSZHQpCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLkJsb2NrSU8pCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLk5ldHdvcmspCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLlBpZHMpCiAgICBpc19udWxsKGlfbGludXguU2VjY29tcCkKCiAgICBpX3Byb2Nlc3MgOj0gaV9vY2kuUHJvY2VzcwogICAgY291bnQoaV9wcm9jZXNzLlNlbGludXhMYWJlbCkgPT0gMAogICAgY291bnQoaV9wcm9jZXNzLlVzZXIuVXNlcm5hbWUpID09IDAKCiAgICBwcmludCgiYWxsb3dfY3JlYXRlX2NvbnRhaW5lcl9pbnB1dDogdHJ1ZSIpCn0KCmFsbG93X25hbWVzcGFjZShwX25hbWVzcGFjZSwgaV9uYW1lc3BhY2UpID0gYWRkX25hbWVzcGFjZSB7CiAgICBwX25hbWVzcGFjZSA9PSBpX25hbWVzcGFjZQogICAgYWRkX25hbWVzcGFjZSA6PSBudWxsCiAgICBwcmludCgiYWxsb3dfbmFtZXNwYWNlIDE6IGlucHV0IG5hbWVzcGFjZSBtYXRjaGVzIHBvbGljeSBkYXRhIikKfQoKYWxsb3dfbmFtZXNwYWNlKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkgPSBhZGRfbmFtZXNwYWNlIHsKICAgIHBfbmFtZXNwYWNlID09ICIiCiAgICBwcmludCgiYWxsb3dfbmFtZXNwYWNlIDI6IG5vIG5hbWVzcGFjZSBmb3VuZCBvbiBwb2xpY3kgZGF0YSIpCiAgICBhZGRfbmFtZXNwYWNlIDo9IHN0YXRlX2FsbG93cygibmFtZXNwYWNlIiwgaV9uYW1lc3BhY2UpCn0KCiMgdmFsdWUgaGFzbid0IGJlZW4gc2VlbiBiZWZvcmUsIHNhdmUgaXQgdG8gc3RhdGUKc3RhdGVfYWxsb3dzKGtleSwgdmFsdWUpID0gYWN0aW9uIHsKICBzdGF0ZSA6PSBnZXRfc3RhdGUoKQogIHByaW50KCJzdGF0ZV9hbGxvd3MgMTogc3RhdGVba2V5XSA9Iiwgc3RhdGVba2V5XSwgInZhbHVlID0iLCB2YWx1ZSkKICBub3Qgc3RhdGVba2V5XQogIHByaW50KCJzdGF0ZV9hbGxvd3MgMTogc2F2aW5nIHRvIHN0YXRlIGtleSA9Iiwga2V5LCAidmFsdWUgPSIsIHZhbHVlKQogIHBhdGggOj0gZ2V0X3N0YXRlX3BhdGgoa2V5KSAKICBhY3Rpb24gOj0gewogICAgIm9wIjogImFkZCIsCiAgICAicGF0aCI6IHBhdGgsIAogICAgInZhbHVlIjogdmFsdWUsCiAgfQp9CgojIHZhbHVlIG1hdGNoZXMgd2hhdCdzIGluIHN0YXRlLCBhbGxvdyBpdApzdGF0ZV9hbGxvd3Moa2V5LCB2YWx1ZSkgPSBhY3Rpb24gewogIHByaW50KCJzdGF0ZV9hbGxvd3MgMjogc3RhcnQiKQogIHN0YXRlIDo9IGdldF9zdGF0ZSgpCiAgcHJpbnQoInN0YXRlX2FsbG93cyAyOiBzdGF0ZVtrZXldID0iLCBzdGF0ZVtrZXldLCAidmFsdWUgPSIsIHZhbHVlKQogIHZhbHVlID09IHN0YXRlW2tleV0KICBwcmludCgic3RhdGVfYWxsb3dzIDI6IGZvdW5kIGtleSA9Iiwga2V5LCAidmFsdWUgPSIsIHZhbHVlLCAiIGluIHN0YXRlIikKICBhY3Rpb24gOj0gbnVsbAp9CgojIGhlbHBlciBmdW5jdGlvbnMgdG8gaW50ZXJhY3Qgd2l0aCB0aGUgc3RhdGUKZ2V0X3N0YXRlKCkgPSBzdGF0ZSB7CiAgc3RhdGUgOj0gZGF0YVsicHN0YXRlIl0KfQoKZ2V0X3N0YXRlX3ZhbChrZXkpID0gdmFsdWUgewogICAgc3RhdGUgOj0gZ2V0X3N0YXRlKCkKICAgIHZhbHVlIDo9IHN0YXRlW2tleV0KfQoKZ2V0X3N0YXRlX3BhdGgoa2V5KSA9IHBhdGggewogICAgIyBwcmVwZW5kICIvcHN0YXRlLyIgdG8ga2V5CiAgICBwYXRoIDo9IGNvbmNhdCgiLyIsIFsiL3BzdGF0ZSIsIGtleV0pCn0KCiMgSGVscGVyIGZ1bmN0aW9ucyB0byBjb25kaXRpb25hbGx5IGNvbmNhdGVuYXRlIG9wIGlzIG5vdCBudWxsCmNvbmNhdF9vcF9pZl9ub3RfbnVsbChvcHMsIG9wKSA9IHJlc3VsdCB7CiAgICBvcCA9PSBudWxsCiAgICByZXN1bHQgOj0gb3BzCn0KCmNvbmNhdF9vcF9pZl9ub3RfbnVsbChvcHMsIG9wKSA9IHJlc3VsdCB7CiAgICBvcCAhPSBudWxsCiAgICByZXN1bHQgOj0gYXJyYXkuY29uY2F0KG9wcywgW29wXSkKfQoKIyBSZWplY3QgdW5leHBlY3RlZCBhbm5vdGF0aW9ucy4KYWxsb3dfYW5ubyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19hbm5vIDE6IHN0YXJ0IikKCiAgICBub3QgaV9vY2kuQW5ub3RhdGlvbnMKCiAgICBwcmludCgiYWxsb3dfYW5ubyAxOiB0cnVlIikKfQphbGxvd19hbm5vKHBfb2NpLCBpX29jaSkgewogICAgcHJpbnQoImFsbG93X2Fubm8gMjogcCBBbm5vdGF0aW9ucyA9IiwgcF9vY2kuQW5ub3RhdGlvbnMpCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiBpIEFubm90YXRpb25zID0iLCBpX29jaS5Bbm5vdGF0aW9ucykKCiAgICBpX2tleXMgOj0gb2JqZWN0LmtleXMoaV9vY2kuQW5ub3RhdGlvbnMpCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiBpIGtleXMgPSIsIGlfa2V5cykKCiAgICBldmVyeSBpX2tleSBpbiBpX2tleXMgewogICAgICAgIGFsbG93X2Fubm9fa2V5KGlfa2V5LCBwX29jaSkKICAgIH0KCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiB0cnVlIikKfQoKYWxsb3dfYW5ub19rZXkoaV9rZXksIHBfb2NpKSB7CiAgICBwcmludCgiYWxsb3dfYW5ub19rZXkgMTogaSBrZXkgPSIsIGlfa2V5KQoKICAgIHN0YXJ0c3dpdGgoaV9rZXksICJpby5rdWJlcm5ldGVzLmNyaS4iKQoKICAgIHByaW50KCJhbGxvd19hbm5vX2tleSAxOiB0cnVlIikKfQphbGxvd19hbm5vX2tleShpX2tleSwgcF9vY2kpIHsKICAgIHByaW50KCJhbGxvd19hbm5vX2tleSAyOiBpIGtleSA9IiwgaV9rZXkpCgogICAgc29tZSBwX2tleSwgXyBpbiBwX29jaS5Bbm5vdGF0aW9ucwogICAgcF9rZXkgPT0gaV9rZXkKCiAgICBwcmludCgiYWxsb3dfYW5ub19rZXkgMjogdHJ1ZSIpCn0KCiMgR2V0IHRoZSB2YWx1ZSBvZiB0aGUgU19OQU1FX0tFWSBhbm5vdGF0aW9uIGFuZAojIGNvcnJlbGF0ZSBpdCB3aXRoIG90aGVyIGFubm90YXRpb25zIGFuZCBwcm9jZXNzIGZpZWxkcy4KYWxsb3dfYnlfYW5ubyhwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpIHsKICAgIHByaW50KCJhbGxvd19ieV9hbm5vIDE6IHN0YXJ0IikKCiAgICBub3QgcF9vY2kuQW5ub3RhdGlvbnNbU19OQU1FX0tFWV0KCiAgICBpX3NfbmFtZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMTogaV9zX25hbWUgPSIsIGlfc19uYW1lKQoKICAgIGlfc19uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FU1BBQ0VfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMTogaV9zX25hbWVzcGFjZSA9IiwgaV9zX25hbWVzcGFjZSkKCiAgICBhbGxvd19ieV9zYW5kYm94X25hbWUocF9vY2ksIGlfb2NpLCBwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBpX3NfbmFtZSwgaV9zX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfYnlfYW5ubyAxOiB0cnVlIikKfQphbGxvd19ieV9hbm5vKHBfb2NpLCBpX29jaSwgcF9zdG9yYWdlcywgaV9zdG9yYWdlcykgewogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMjogc3RhcnQiKQoKICAgIHBfc19uYW1lIDo9IHBfb2NpLkFubm90YXRpb25zW1NfTkFNRV9LRVldCiAgICBpX3NfbmFtZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMjogaV9zX25hbWUgPSIsIGlfc19uYW1lLCAicF9zX25hbWUgPSIsIHBfc19uYW1lKQoKICAgIGFsbG93X3NhbmRib3hfbmFtZShwX3NfbmFtZSwgaV9zX25hbWUpCgogICAgaV9zX25hbWVzcGFjZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwcmludCgiYWxsb3dfYnlfYW5ubyAyOiBpX3NfbmFtZXNwYWNlID0iLCBpX3NfbmFtZXNwYWNlKQoKICAgIGFsbG93X2J5X3NhbmRib3hfbmFtZShwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMsIGlfc19uYW1lLCBpX3NfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd19ieV9hbm5vIDI6IHRydWUiKQp9CgphbGxvd19ieV9zYW5kYm94X25hbWUocF9vY2ksIGlfb2NpLCBwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfYnlfc2FuZGJveF9uYW1lOiBzdGFydCIpCgogICAgaV9uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FU1BBQ0VfS0VZXQoKICAgIGFsbG93X2J5X2NvbnRhaW5lcl90eXBlcyhwX29jaSwgaV9vY2ksIHNfbmFtZSwgaV9uYW1lc3BhY2UpCiAgICBhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZChwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpCiAgICBhbGxvd19wcm9jZXNzKHBfb2NpLlByb2Nlc3MsIGlfb2NpLlByb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpCgogICAgcHJpbnQoImFsbG93X2J5X3NhbmRib3hfbmFtZTogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfbmFtZShwX3NfbmFtZSwgaV9zX25hbWUpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X25hbWU6IHN0YXJ0IikKICAgIHJlZ2V4Lm1hdGNoKHBfc19uYW1lLCBpX3NfbmFtZSkKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9uYW1lOiB0cnVlIikKfQoKIyBDaGVjayB0aGF0IHRoZSAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLXR5cGUiIGFuZAojICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIiBhbm5vdGF0aW9ucyBkZXNpZ25hdGUgdGhlCiMgZXhwZWN0ZWQgdHlwZSAtIGVpdGhlciBhICJzYW5kYm94IiBvciBhICJjb250YWluZXIiLiBUaGVuLCB2YWxpZGF0ZQojIG90aGVyIGFubm90YXRpb25zIGJhc2VkIG9uIHRoZSBhY3R1YWwgInNhbmRib3giIG9yICJjb250YWluZXIiIHZhbHVlCiMgZnJvbSB0aGUgaW5wdXQgY29udGFpbmVyLgphbGxvd19ieV9jb250YWluZXJfdHlwZXMocF9vY2ksIGlfb2NpLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfYnlfY29udGFpbmVyX3R5cGVzOiBjaGVja2luZyBpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSIpCgogICAgY190eXBlIDo9ICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSIKICAgIAogICAgcF9jcmlfdHlwZSA6PSBwX29jaS5Bbm5vdGF0aW9uc1tjX3R5cGVdCiAgICBpX2NyaV90eXBlIDo9IGlfb2NpLkFubm90YXRpb25zW2NfdHlwZV0KICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZXM6IHBfY3JpX3R5cGUgPSIsIHBfY3JpX3R5cGUsICJpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgcF9jcmlfdHlwZSA9PSBpX2NyaV90eXBlCgogICAgYWxsb3dfYnlfY29udGFpbmVyX3R5cGUoaV9jcmlfdHlwZSwgcF9vY2ksIGlfb2NpLCBzX25hbWUsIHNfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZXM6IHRydWUiKQp9CgphbGxvd19ieV9jb250YWluZXJfdHlwZShpX2NyaV90eXBlLCBwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAxOiBpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgaV9jcmlfdHlwZSA9PSAic2FuZGJveCIKCiAgICBpX2thdGFfdHlwZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1siaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5jb250YWluZXJfdHlwZSJdCiAgICBwcmludCgiYWxsb3dfYnlfY29udGFpbmVyX3R5cGUgMTogaV9rYXRhX3R5cGUgPSIsIGlfa2F0YV90eXBlKQogICAgaV9rYXRhX3R5cGUgPT0gInBvZF9zYW5kYm94IgoKICAgIGFsbG93X3NhbmRib3hfY29udGFpbmVyX25hbWUocF9vY2ksIGlfb2NpKQogICAgYWxsb3dfc2FuZGJveF9uZXRfbmFtZXNwYWNlKHBfb2NpLCBpX29jaSkKICAgIGFsbG93X3NhbmRib3hfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpCgogICAgcHJpbnQoImFsbG93X2J5X2NvbnRhaW5lcl90eXBlIDE6IHRydWUiKQp9CgphbGxvd19ieV9jb250YWluZXJfdHlwZShpX2NyaV90eXBlLCBwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiBpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgaV9jcmlfdHlwZSA9PSAiY29udGFpbmVyIgoKICAgIGlfa2F0YV90eXBlIDo9IGlfb2NpLkFubm90YXRpb25zWyJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIl0KICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiBpX2thdGFfdHlwZSA9IiwgaV9rYXRhX3R5cGUpCiAgICBpX2thdGFfdHlwZSA9PSAicG9kX2NvbnRhaW5lciIKCiAgICBhbGxvd19jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpCiAgICBhbGxvd19uZXRfbmFtZXNwYWNlKHBfb2NpLCBpX29jaSkKICAgIGFsbG93X2xvZ19kaXJlY3RvcnkocF9vY2ksIGlfb2NpKQoKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiB0cnVlIikKfQoKIyAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLW5hbWUiIGFubm90YXRpb24KYWxsb3dfc2FuZGJveF9jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X2NvbnRhaW5lcl9uYW1lOiBzdGFydCIpCgogICAgY29udGFpbmVyX2Fubm90YXRpb25fbWlzc2luZyhwX29jaSwgaV9vY2ksICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItbmFtZSIpCgogICAgcHJpbnQoImFsbG93X3NhbmRib3hfY29udGFpbmVyX25hbWU6IHRydWUiKQp9CgphbGxvd19jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19jb250YWluZXJfbmFtZTogc3RhcnQiKQoKICAgIGFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uKHBfb2NpLCBpX29jaSwgImlvLmt1YmVybmV0ZXMuY3JpLmNvbnRhaW5lci1uYW1lIikKCiAgICBwcmludCgiYWxsb3dfY29udGFpbmVyX25hbWU6IHRydWUiKQp9Cgpjb250YWluZXJfYW5ub3RhdGlvbl9taXNzaW5nKHBfb2NpLCBpX29jaSwga2V5KSB7CiAgICBwcmludCgiY29udGFpbmVyX2Fubm90YXRpb25fbWlzc2luZzoiLCBrZXkpCgogICAgbm90IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIG5vdCBpX29jaS5Bbm5vdGF0aW9uc1trZXldCgogICAgcHJpbnQoImNvbnRhaW5lcl9hbm5vdGF0aW9uX21pc3Npbmc6IHRydWUiKQp9CgphbGxvd19jb250YWluZXJfYW5ub3RhdGlvbihwX29jaSwgaV9vY2ksIGtleSkgewogICAgcHJpbnQoImFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uOiBrZXkgPSIsIGtleSkKCiAgICBwX3ZhbHVlIDo9IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIGlfdmFsdWUgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgcHJpbnQoImFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uOiBwX3ZhbHVlID0iLCBwX3ZhbHVlLCAiaV92YWx1ZSA9IiwgaV92YWx1ZSkKCiAgICBwX3ZhbHVlID09IGlfdmFsdWUKCiAgICBwcmludCgiYWxsb3dfY29udGFpbmVyX2Fubm90YXRpb246IHRydWUiKQp9CgojICJuZXJkY3RsL25ldHdvcmstbmFtZXNwYWNlIiBhbm5vdGF0aW9uCmFsbG93X3NhbmRib3hfbmV0X25hbWVzcGFjZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X25ldF9uYW1lc3BhY2U6IHN0YXJ0IikKCiAgICBrZXkgOj0gIm5lcmRjdGwvbmV0d29yay1uYW1lc3BhY2UiCgogICAgcF9uYW1lc3BhY2UgOj0gcF9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgaV9uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgcHJpbnQoImFsbG93X3NhbmRib3hfbmV0X25hbWVzcGFjZTogcF9uYW1lc3BhY2UgPSIsIHBfbmFtZXNwYWNlLCAiaV9uYW1lc3BhY2UgPSIsIGlfbmFtZXNwYWNlKQoKICAgIHJlZ2V4Lm1hdGNoKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9uZXRfbmFtZXNwYWNlOiB0cnVlIikKfQoKYWxsb3dfbmV0X25hbWVzcGFjZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19uZXRfbmFtZXNwYWNlOiBzdGFydCIpCgogICAga2V5IDo9ICJuZXJkY3RsL25ldHdvcmstbmFtZXNwYWNlIgoKICAgIG5vdCBwX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICBub3QgaV9vY2kuQW5ub3RhdGlvbnNba2V5XQoKICAgIHByaW50KCJhbGxvd19uZXRfbmFtZXNwYWNlOiB0cnVlIikKfQoKIyAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1sb2ctZGlyZWN0b3J5IiBhbm5vdGF0aW9uCmFsbG93X3NhbmRib3hfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X2xvZ19kaXJlY3Rvcnk6IHN0YXJ0IikKCiAgICBrZXkgOj0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbG9nLWRpcmVjdG9yeSIKCiAgICBwX2RpciA6PSBwX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICByZWdleDEgOj0gcmVwbGFjZShwX2RpciwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHJlZ2V4MiA6PSByZXBsYWNlKHJlZ2V4MSwgIiQoc2FuZGJveC1uYW1lc3BhY2UpIiwgc19uYW1lc3BhY2UpCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiByZWdleDIgPSIsIHJlZ2V4MikKCiAgICBpX2RpciA6PSBpX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiBpX2RpciA9IiwgaV9kaXIpCgogICAgcmVnZXgubWF0Y2gocmVnZXgyLCBpX2RpcikKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiB0cnVlIikKfQoKYWxsb3dfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19sb2dfZGlyZWN0b3J5OiBzdGFydCIpCgogICAga2V5IDo9ICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWxvZy1kaXJlY3RvcnkiCgogICAgbm90IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIG5vdCBpX29jaS5Bbm5vdGF0aW9uc1trZXldCgogICAgcHJpbnQoImFsbG93X2xvZ19kaXJlY3Rvcnk6IHRydWUiKQp9CgphbGxvd19kZXZpY2VzKHBfZGV2aWNlcywgaV9kZXZpY2VzKSB7CiAgICBwcmludCgiYWxsb3dfZGV2aWNlczogc3RhcnQiKQogICAgZXZlcnkgaV9kZXZpY2UgaW4gaV9kZXZpY2VzIHsKICAgICAgICBwcmludCgiYWxsb3dfZGV2aWNlczogaV9kZXZpY2UgPSIsIGlfZGV2aWNlKQogICAgICAgIHNvbWUgcF9kZXZpY2UgaW4gcF9kZXZpY2VzCiAgICAgICAgcF9kZXZpY2UuY29udGFpbmVyX3BhdGggPT0gaV9kZXZpY2UuY29udGFpbmVyX3BhdGgKICAgIH0KICAgIHByaW50KCJhbGxvd19kZXZpY2VzOiB0cnVlIikKfQoKYWxsb3dfbGludXgoc3RhdGVfb3BzLCBwX29jaSwgaV9vY2kpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIHBfbmFtZXNwYWNlcyA6PSBwX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbGludXg6IHAgbmFtZXNwYWNlcyA9IiwgcF9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlcyA6PSBpX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbGludXg6IGkgbmFtZXNwYWNlcyA9IiwgaV9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlX3dpdGhvdXRfbmV0d29yayA6PSBbb2JqIHwgb2JqIDo9IGlfbmFtZXNwYWNlc1tfXTsgb2JqLlR5cGUgIT0gIm5ldHdvcmsiXQoKICAgIHByaW50KCJhbGxvd19saW51eDogaV9uYW1lc3BhY2Vfd2l0aG91dF9uZXR3b3JrID0iLCBpX25hbWVzcGFjZV93aXRob3V0X25ldHdvcmspCgogICAgcF9uYW1lc3BhY2VzID09IGlfbmFtZXNwYWNlX3dpdGhvdXRfbmV0d29yawoKICAgIGFsbG93X21hc2tlZF9wYXRocyhwX29jaSwgaV9vY2kpCiAgICBhbGxvd19yZWFkb25seV9wYXRocyhwX29jaSwgaV9vY2kpCiAgICBhbGxvd19saW51eF9kZXZpY2VzKHBfb2NpLkxpbnV4LkRldmljZXMsIGlfb2NpLkxpbnV4LkRldmljZXMpCiAgICBhbGxvd19saW51eF9zeXNjdGwocF9vY2kuTGludXgsIGlfb2NpLkxpbnV4KQogICAgcmV0IDo9IGFsbG93X25ldHdvcmtfbmFtZXNwYWNlX3N0YXJ0KHN0YXRlX29wcywgcF9vY2ksIGlfb2NpKQogICAgcmV0LmFsbG93ZWQKCiAgICBvcHMgOj0gcmV0Lm9wcwoKICAgIHByaW50KCJhbGxvd19saW51eDogdHJ1ZSIpCn0KCiMgUmV0cmlldmUgdGhlICJuZXR3b3JrIiBuYW1lc3BhY2UgZnJvbSB0aGUgaW5wdXQgZGF0YSBhbmQgcGFzcyBpdCBvbiBmb3IgdGhlCiMgbmV0d29yayBuYW1lc3BhY2UgcG9saWN5IGNoZWNrcy4KYWxsb3dfbmV0d29ya19uYW1lc3BhY2Vfc3RhcnQoc3RhdGVfb3BzLCBwX29jaSwgaV9vY2kpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIHByaW50KCJhbGxvd19uZXR3b3JrX25hbWVzcGFjZSBzdGFydDogc3RhcnQiKQoKICAgIHBfbmFtZXNwYWNlcyA6PSBwX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IHAgbmFtZXNwYWNlcyA9IiwgcF9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlcyA6PSBpX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IGkgbmFtZXNwYWNlcyA9IiwgaV9uYW1lc3BhY2VzKQoKICAgICMgUmV0dXJuIHBhdGggb2YgdGhlICJuZXR3b3JrIiBuYW1lc3BhY2UKICAgIG5ldHdvcmtfbnMgOj0gW29iaiB8IG9iaiA6PSBpX25hbWVzcGFjZXNbX107IG9iai5UeXBlID09ICJuZXR3b3JrIl0KCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IG5ldHdvcmtfbnMgPSIsIG5ldHdvcmtfbnMpCgogICAgcmV0IDo9IGFsbG93X25ldHdvcmtfbmFtZXNwYWNlKHN0YXRlX29wcywgbmV0d29ya19ucykKICAgIHJldC5hbGxvd2VkCgogICAgb3BzIDo9IHJldC5vcHMKfQoKIyBUaGlzIHJ1bGUgaXMgd2hlbiB0aGVyZSdzIG5vIG5ldHdvcmsgbmFtZXNwYWNlIGluIHRoZSBpbnB1dCBkYXRhLgphbGxvd19uZXR3b3JrX25hbWVzcGFjZShzdGF0ZV9vcHMsIG5ldHdvcmtfbnMpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIGNvdW50KG5ldHdvcmtfbnMpID09IDAKCiAgICBuZXR3b3JrX25zX3BhdGggPSAiIgoKICAgIGFkZF9uZXR3b3JrX25hbWVzcGFjZV90b19zdGF0ZSA6PSBzdGF0ZV9hbGxvd3MoIm5ldHdvcmtfbmFtZXNwYWNlIiwgbmV0d29ya19uc19wYXRoKQogICAgb3BzIDo9IGNvbmNhdF9vcF9pZl9ub3RfbnVsbChzdGF0ZV9vcHMsIGFkZF9uZXR3b3JrX25hbWVzcGFjZV90b19zdGF0ZSkKCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2UgMTogdHJ1ZSIpCn0KCiMgVGhpcyBydWxlIGlzIHdoZW4gdGhlcmUncyBleGFjdGx5IG9uZSBuZXR3b3JrIG5hbWVzcGFjZSBpbiB0aGUgaW5wdXQgZGF0YS4KYWxsb3dfbmV0d29ya19uYW1lc3BhY2Uoc3RhdGVfb3BzLCBuZXR3b3JrX25zKSA6PSB7Im9wcyI6IG9wcywgImFsbG93ZWQiOiB0cnVlfSB7CiAgICBjb3VudChuZXR3b3JrX25zKSA9PSAxCgogICAgYWRkX25ldHdvcmtfbmFtZXNwYWNlX3RvX3N0YXRlIDo9IHN0YXRlX2FsbG93cygibmV0d29ya19uYW1lc3BhY2UiLCBuZXR3b3JrX25zWzBdLlBhdGgpCiAgICBvcHMgOj0gY29uY2F0X29wX2lmX25vdF9udWxsKHN0YXRlX29wcywgYWRkX25ldHdvcmtfbmFtZXNwYWNlX3RvX3N0YXRlKQoKICAgIHByaW50KCJhbGxvd19uZXR3b3JrX25hbWVzcGFjZSAyOiB0cnVlIikKfQoKYWxsb3dfbWFza2VkX3BhdGhzKHBfb2NpLCBpX29jaSkgewogICAgcF9wYXRocyA6PSBwX29jaS5MaW51eC5NYXNrZWRQYXRocwogICAgcHJpbnQoImFsbG93X21hc2tlZF9wYXRocyAxOiBwX3BhdGhzID0iLCBwX3BhdGhzKQoKICAgIGlfcGF0aHMgOj0gaV9vY2kuTGludXguTWFza2VkUGF0aHMKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aHMgMTogaV9wYXRocyA9IiwgaV9wYXRocykKCiAgICBhbGxvd19tYXNrZWRfcGF0aHNfYXJyYXkocF9wYXRocywgaV9wYXRocykKCiAgICBwcmludCgiYWxsb3dfbWFza2VkX3BhdGhzIDE6IHRydWUiKQp9CmFsbG93X21hc2tlZF9wYXRocyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aHMgMjogc3RhcnQiKQoKICAgIG5vdCBwX29jaS5MaW51eC5NYXNrZWRQYXRocwogICAgbm90IGlfb2NpLkxpbnV4Lk1hc2tlZFBhdGhzCgogICAgcHJpbnQoImFsbG93X21hc2tlZF9wYXRocyAyOiB0cnVlIikKfQoKIyBBbGwgdGhlIHBvbGljeSBtYXNrZWQgcGF0aHMgbXVzdCBiZSBtYXNrZWQgaW4gdGhlIGlucHV0IGRhdGEgdG9vLgojIElucHV0IGlzIGFsbG93ZWQgdG8gaGF2ZSBtb3JlIG1hc2tlZCBwYXRocyB0aGFuIHRoZSBwb2xpY3kuCmFsbG93X21hc2tlZF9wYXRoc19hcnJheShwX2FycmF5LCBpX2FycmF5KSB7CiAgICBldmVyeSBwX2VsZW0gaW4gcF9hcnJheSB7CiAgICAgICAgYWxsb3dfbWFza2VkX3BhdGgocF9lbGVtLCBpX2FycmF5KQogICAgfQp9CgphbGxvd19tYXNrZWRfcGF0aChwX2VsZW0sIGlfYXJyYXkpIHsKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aDogcF9lbGVtID0iLCBwX2VsZW0pCgogICAgc29tZSBpX2VsZW0gaW4gaV9hcnJheQogICAgcF9lbGVtID09IGlfZWxlbQoKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aDogdHJ1ZSIpCn0KCmFsbG93X3JlYWRvbmx5X3BhdGhzKHBfb2NpLCBpX29jaSkgewogICAgcF9wYXRocyA6PSBwX29jaS5MaW51eC5SZWFkb25seVBhdGhzCiAgICBwcmludCgiYWxsb3dfcmVhZG9ubHlfcGF0aHMgMTogcF9wYXRocyA9IiwgcF9wYXRocykKCiAgICBpX3BhdGhzIDo9IGlfb2NpLkxpbnV4LlJlYWRvbmx5UGF0aHMKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAxOiBpX3BhdGhzID0iLCBpX3BhdGhzKQoKICAgIGFsbG93X3JlYWRvbmx5X3BhdGhzX2FycmF5KHBfcGF0aHMsIGlfcGF0aHMsIGlfb2NpLkxpbnV4Lk1hc2tlZFBhdGhzKQoKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAxOiB0cnVlIikKfQphbGxvd19yZWFkb25seV9wYXRocyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAyOiBzdGFydCIpCgogICAgbm90IHBfb2NpLkxpbnV4LlJlYWRvbmx5UGF0aHMKICAgIG5vdCBpX29jaS5MaW51eC5SZWFkb25seVBhdGhzCgogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGhzIDI6IHRydWUiKQp9CgojIEFsbCB0aGUgcG9saWN5IHJlYWRvbmx5IHBhdGhzIG11c3QgYmUgZWl0aGVyOgojIC0gUHJlc2VudCBpbiB0aGUgaW5wdXQgcmVhZG9ubHkgcGF0aHMsIG9yCiMgLSBQcmVzZW50IGluIHRoZSBpbnB1dCBtYXNrZWQgcGF0aHMuCiMgSW5wdXQgaXMgYWxsb3dlZCB0byBoYXZlIG1vcmUgcmVhZG9ubHkgcGF0aHMgdGhhbiB0aGUgcG9saWN5LgphbGxvd19yZWFkb25seV9wYXRoc19hcnJheShwX2FycmF5LCBpX2FycmF5LCBtYXNrZWRfcGF0aHMpIHsKICAgIGV2ZXJ5IHBfZWxlbSBpbiBwX2FycmF5IHsKICAgICAgICBhbGxvd19yZWFkb25seV9wYXRoKHBfZWxlbSwgaV9hcnJheSwgbWFza2VkX3BhdGhzKQogICAgfQp9CgphbGxvd19yZWFkb25seV9wYXRoKHBfZWxlbSwgaV9hcnJheSwgbWFza2VkX3BhdGhzKSB7CiAgICBwcmludCgiYWxsb3dfcmVhZG9ubHlfcGF0aCAxOiBwX2VsZW0gPSIsIHBfZWxlbSkKCiAgICBzb21lIGlfZWxlbSBpbiBpX2FycmF5CiAgICBwX2VsZW0gPT0gaV9lbGVtCgogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGggMTogdHJ1ZSIpCn0KYWxsb3dfcmVhZG9ubHlfcGF0aChwX2VsZW0sIGlfYXJyYXksIG1hc2tlZF9wYXRocykgewogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGggMjogcF9lbGVtID0iLCBwX2VsZW0pCgogICAgc29tZSBpX21hc2tlZCBpbiBtYXNrZWRfcGF0aHMKICAgIHBfZWxlbSA9PSBpX21hc2tlZAoKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRoIDI6IHRydWUiKQp9CgphbGxvd19saW51eF9kZXZpY2VzKHBfZGV2aWNlcywgaV9kZXZpY2VzKSB7CiAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogc3RhcnQiKQogICAgZXZlcnkgaV9kZXZpY2UgaW4gaV9kZXZpY2VzIHsKICAgICAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogaV9kZXZpY2UgPSIsIGlfZGV2aWNlKQogICAgICAgIHNvbWUgcF9kZXZpY2UgaW4gcF9kZXZpY2VzCiAgICAgICAgaV9kZXZpY2UuUGF0aCA9PSBwX2RldmljZS5QYXRoCiAgICB9CiAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogdHJ1ZSIpCn0KCmFsbG93X2xpbnV4X3N5c2N0bChwX2xpbnV4LCBpX2xpbnV4KSB7CiAgICBwcmludCgiYWxsb3dfbGludXhfc3lzY3RsIDE6IHN0YXJ0IikKICAgIG5vdCBpX2xpbnV4LlN5c2N0bAogICAgcHJpbnQoImFsbG93X2xpbnV4X3N5c2N0bCAxOiB0cnVlIikKfQoKYWxsb3dfbGludXhfc3lzY3RsKHBfbGludXgsIGlfbGludXgpIHsKICAgIHByaW50KCJhbGxvd19saW51eF9zeXNjdGwgMjogc3RhcnQiKQogICAgcF9zeXNjdGwgOj0gcF9saW51eC5TeXNjdGwKICAgIGlfc3lzY3RsIDo9IGlfbGludXguU3lzY3RsCiAgICBldmVyeSBpX25hbWUsIGlfdmFsIGluIGlfc3lzY3RsIHsKICAgICAgICBwcmludCgiYWxsb3dfbGludXhfc3lzY3RsIDI6IGlfbmFtZSA9IiwgaV9uYW1lLCAiaV92YWwgPSIsIGlfdmFsKQogICAgICAgIHBfc3lzY3RsW2lfbmFtZV0gPT0gaV92YWwKICAgIH0KICAgIHByaW50KCJhbGxvd19saW51eF9zeXNjdGwgMjogdHJ1ZSIpCn0KCiMgQ2hlY2sgdGhlIGNvbnNpc3RlbmN5IG9mIHRoZSBpbnB1dCAiaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5idW5kbGVfcGF0aCIKIyBhbmQgaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCIgdmFsdWVzIHdpdGggb3RoZXIgZmllbGRzLgphbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZChwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpIHsKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogc3RhcnQiKQoKICAgIGJ1bmRsZV9wYXRoIDo9IGlfb2NpLkFubm90YXRpb25zWyJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmJ1bmRsZV9wYXRoIl0KICAgIGJ1bmRsZV9pZCA6PSByZXBsYWNlKGJ1bmRsZV9wYXRoLCAiL3J1bi9jb250YWluZXJkL2lvLmNvbnRhaW5lcmQucnVudGltZS52Mi50YXNrL2s4cy5pby8iLCAiIikKCiAgICBidW5kbGVfaWRfZm9ybWF0IDo9IGNvbmNhdCgiIiwgWyJeIiwgQlVORExFX0lELCAiJCJdKQogICAgcmVnZXgubWF0Y2goYnVuZGxlX2lkX2Zvcm1hdCwgYnVuZGxlX2lkKQoKICAgIGtleSA6PSAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCIKCiAgICBwX3JlZ2V4IDo9IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIHNhbmRib3hfaWQgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQoKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogc2FuZGJveF9pZCA9Iiwgc2FuZGJveF9pZCwgInJlZ2V4ID0iLCBwX3JlZ2V4KQogICAgcmVnZXgubWF0Y2gocF9yZWdleCwgc2FuZGJveF9pZCkKCiAgICBhbGxvd19yb290X3BhdGgocF9vY2ksIGlfb2NpLCBidW5kbGVfaWQpCgogICAgZXZlcnkgaV9tb3VudCBpbiBpX29jaS5Nb3VudHMgewogICAgICAgIGFsbG93X21vdW50KHBfb2NpLCBpX21vdW50LCBpX3N0b3JhZ2VzLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpCiAgICB9CgogICAgYWxsb3dfc3RvcmFnZXMocF9zdG9yYWdlcywgaV9zdG9yYWdlcywgYnVuZGxlX2lkLCBzYW5kYm94X2lkKQoKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogdHJ1ZSIpCn0KCmFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHBfcHJvY2VzcyA9IiwgcF9wcm9jZXNzKQogICAgcHJpbnQoImFsbG93X3Byb2Nlc3NfY29tbW9uOiBpX3Byb2Nlc3MgPSAiLCBpX3Byb2Nlc3MpCiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHNfbmFtZSA9Iiwgc19uYW1lKQoKICAgIHBfcHJvY2Vzcy5Dd2QgPT0gaV9wcm9jZXNzLkN3ZAogICAgcF9wcm9jZXNzLk5vTmV3UHJpdmlsZWdlcyA9PSBpX3Byb2Nlc3MuTm9OZXdQcml2aWxlZ2VzCgogICAgYWxsb3dfdXNlcihwX3Byb2Nlc3MsIGlfcHJvY2VzcykKICAgIGFsbG93X2VudihwX3Byb2Nlc3MsIGlfcHJvY2Vzcywgc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHRydWUiKQp9CgojIENvbXBhcmUgdGhlIE9DSSBQcm9jZXNzIGZpZWxkIG9mIGEgcG9saWN5IGNvbnRhaW5lciB3aXRoIHRoZSBpbnB1dCBPQ0kgUHJvY2VzcyBmcm9tIGEgQ3JlYXRlQ29udGFpbmVyUmVxdWVzdAphbGxvd19wcm9jZXNzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfcHJvY2Vzczogc3RhcnQiKQoKICAgIGFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgYWxsb3dfY2FwcyhwX3Byb2Nlc3MuQ2FwYWJpbGl0aWVzLCBpX3Byb2Nlc3MuQ2FwYWJpbGl0aWVzKQogICAgcF9wcm9jZXNzLlRlcm1pbmFsID09IGlfcHJvY2Vzcy5UZXJtaW5hbAoKICAgIHByaW50KCJhbGxvd19wcm9jZXNzOiB0cnVlIikKfQoKIyBDb21wYXJlIHRoZSBPQ0kgUHJvY2VzcyBmaWVsZCBvZiBhIHBvbGljeSBjb250YWluZXIgd2l0aCB0aGUgaW5wdXQgcHJvY2VzcyBmaWVsZCBmcm9tIEV4ZWNQcm9jZXNzUmVxdWVzdAphbGxvd19pbnRlcmFjdGl2ZV9wcm9jZXNzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfaW50ZXJhY3RpdmVfcHJvY2Vzczogc3RhcnQiKQoKICAgIGFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgYWxsb3dfZXhlY19jYXBzKGlfcHJvY2Vzcy5DYXBhYmlsaXRpZXMpCgogICAgIyBUaGVzZSBhcmUgY29tbWFuZHMgZW5hYmxlZCB1c2luZyBFeGVjUHJvY2Vzc1JlcXVlc3QgY29tbWFuZHMgYW5kL29yIHJlZ2V4IGZyb20gdGhlIHNldHRpbmdzIGZpbGUuCiAgICAjIFRoZXkgY2FuIGJlIGV4ZWN1dGVkIGludGVyYWN0aXZlbHkgc28gYWxsb3cgdGhlbSB0byB1c2UgYW55IHZhbHVlIGZvciBpX3Byb2Nlc3MuVGVybWluYWwuCgogICAgcHJpbnQoImFsbG93X2ludGVyYWN0aXZlX3Byb2Nlc3M6IHRydWUiKQp9CgojIENvbXBhcmUgdGhlIE9DSSBQcm9jZXNzIGZpZWxkIG9mIGEgcG9saWN5IGNvbnRhaW5lciB3aXRoIHRoZSBpbnB1dCBwcm9jZXNzIGZpZWxkIGZyb20gRXhlY1Byb2Nlc3NSZXF1ZXN0CmFsbG93X3Byb2JlX3Byb2Nlc3MocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19wcm9iZV9wcm9jZXNzOiBzdGFydCIpCgogICAgYWxsb3dfcHJvY2Vzc19jb21tb24ocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpCiAgICBhbGxvd19leGVjX2NhcHMoaV9wcm9jZXNzLkNhcGFiaWxpdGllcykKICAgIHBfcHJvY2Vzcy5UZXJtaW5hbCA9PSBpX3Byb2Nlc3MuVGVybWluYWwKCiAgICBwcmludCgiYWxsb3dfcHJvYmVfcHJvY2VzczogdHJ1ZSIpCn0KCmFsbG93X3VzZXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MpIHsKICAgIHBfdXNlciA6PSBwX3Byb2Nlc3MuVXNlcgogICAgaV91c2VyIDo9IGlfcHJvY2Vzcy5Vc2VyCgogICAgcHJpbnQoImFsbG93X3VzZXI6IGlucHV0IHVpZCA9IiwgaV91c2VyLlVJRCwgInBvbGljeSB1aWQgPSIsIHBfdXNlci5VSUQpCiAgICBwX3VzZXIuVUlEID09IGlfdXNlci5VSUQKCiAgICAjIFRPRE86IHRyYWNrIGRvd24gdGhlIHJlYXNvbiBmb3IgcmVnaXN0cnkuazhzLmlvL3BhdXNlOjMuOSBiZWluZwogICAgIyAgICAgICBleGVjdXRlZCB3aXRoIGdpZCA9IDAgZGVzcGl0ZSBoYXZpbmcgIjY1NTM1OjY1NTM1IiBpbiBpdHMgY29udGFpbmVyIGltYWdlCiAgICAjICAgICAgIGNvbmZpZy4KICAgICNwcmludCgiYWxsb3dfdXNlcjogaW5wdXQgZ2lkID0iLCBpX3VzZXIuR0lELCAicG9saWN5IGdpZCA9IiwgcF91c2VyLkdJRCkKICAgICNwX3VzZXIuR0lEID09IGlfdXNlci5HSUQKCiAgICAjIFRPRE86IGNvbXBhcmUgdGhlIGFkZGl0aW9uYWxHaWRzIGZpZWxkIHRvbyBhZnRlciBjb21wdXRpbmcgaXRzIHZhbHVlCiAgICAjIGJhc2VkIG9uIC9ldGMvcGFzc3dkIGFuZCAvZXRjL2dyb3VwIGZyb20gdGhlIGNvbnRhaW5lciBpbWFnZS4KfQoKYWxsb3dfZGVwcmVjYXRlZF9hcmdzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZ3MgMTogbm8gYXJncyIpCgogICAgbm90IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJncwogICAgbm90IGlfcHJvY2Vzcy5BcmdzCgogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAxOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZ3MocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSkgewogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiBwb2xpY3kgYXJncyA9IiwgcF9wcm9jZXNzLkRlcHJlY2F0ZWRBcmdzKQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiBpbnB1dCBhcmdzID0iLCBpX3Byb2Nlc3MuQXJncykKCiAgICBjb3VudChwX3Byb2Nlc3MuRGVwcmVjYXRlZEFyZ3MpID09IGNvdW50KGlfcHJvY2Vzcy5BcmdzKQoKICAgIGV2ZXJ5IGksIGlfYXJnIGluIGlfcHJvY2Vzcy5BcmdzIHsKICAgICAgICBhbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpCiAgICB9CgogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDE6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgcF9hcmcyIDo9IHJlcGxhY2UocF9hcmcsICIkJCIsICIkIikKICAgIHBfYXJnMiA9PSBpX2FyZwoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAxOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDI6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgIyBUT0RPOiBjYW4gJChub2RlLW5hbWUpIGJlIGhhbmRsZWQgYmV0dGVyPwogICAgY29udGFpbnMocF9hcmcsICIkKG5vZGUtbmFtZSkiKQoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAyOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDM6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgcF9hcmcyIDo9IHJlcGxhY2UocF9hcmcsICIkJCIsICIkIikKICAgIHBfYXJnMyA6PSByZXBsYWNlKHBfYXJnMiwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAzOiBwX2FyZzMgPSIsIHBfYXJnMykKICAgIHBfYXJnMyA9PSBpX2FyZwoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAzOiB0cnVlIikKfQoKIyBPQ0kgcHJvY2Vzcy5FbnYgZmllbGQKYWxsb3dfZW52KHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfZW52OiBwIGVudiA9IiwgcF9wcm9jZXNzLkVudikKICAgIHByaW50KCJhbGxvd19lbnY6IGkgZW52ID0iLCBpX3Byb2Nlc3MuRW52KQoKICAgIGV2ZXJ5IGlfdmFyIGluIGlfcHJvY2Vzcy5FbnYgewogICAgICAgIHByaW50KCJhbGxvd19lbnY6IGlfdmFyID0iLCBpX3ZhcikKICAgICAgICBhbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgfQoKICAgIHByaW50KCJhbGxvd19lbnY6IHRydWUiKQp9CgojIEFsbG93IGlucHV0IGVudiB2YXJpYWJsZXMgdGhhdCBhcmUgcHJlc2VudCBpbiB0aGUgcG9saWN5IGRhdGEgdG9vLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHBfdmFyID09IGlfdmFyCiAgICBwcmludCgiYWxsb3dfdmFyIDE6IHRydWUiKQp9CgojIE1hdGNoIGlucHV0IHdpdGggb25lIG9mIHRoZSBwb2xpY3kgdmFyaWFibGVzLCBhZnRlciBzdWJzdGl0dXRpbmcgJChzYW5kYm94LW5hbWUpLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHByaW50KCJhbGxvd192YXIgMjogcF92YXIgPSIsIHBfdmFyKQoKICAgIHBfdmFyX3NwbGl0IDo9IHNwbGl0KHBfdmFyLCAiPSIpCiAgICBjb3VudChwX3Zhcl9zcGxpdCkgPT0gMgoKICAgIHBfdmFyX3NwbGl0WzFdID09ICIkKHNhbmRib3gtbmFtZSkiCgogICAgaV92YXJfc3BsaXQgOj0gc3BsaXQoaV92YXIsICI9IikKICAgIGNvdW50KGlfdmFyX3NwbGl0KSA9PSAyCgogICAgaV92YXJfc3BsaXRbMF0gPT0gcF92YXJfc3BsaXRbMF0KICAgIHJlZ2V4Lm1hdGNoKHNfbmFtZSwgaV92YXJfc3BsaXRbMV0pCgogICAgcHJpbnQoImFsbG93X3ZhciAyOiB0cnVlIikKfQoKIyBBbGxvdyBpbnB1dCBlbnYgdmFyaWFibGVzIHRoYXQgbWF0Y2ggd2l0aCBhIHJlcXVlc3RfZGVmYXVsdHMgcmVnZXguCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHNvbWUgcF9yZWdleDEgaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5DcmVhdGVDb250YWluZXJSZXF1ZXN0LmFsbG93X2Vudl9yZWdleAogICAgcF9yZWdleDIgOj0gcmVwbGFjZShwX3JlZ2V4MSwgIiQoaXB2NF9hKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcHY0X2EpCiAgICBwX3JlZ2V4MyA6PSByZXBsYWNlKHBfcmVnZXgyLCAiJChpcF9wKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcF9wKQogICAgcF9yZWdleDQgOj0gcmVwbGFjZShwX3JlZ2V4MywgIiQoc3ZjX25hbWUpIiwgcG9saWN5X2RhdGEuY29tbW9uLnN2Y19uYW1lKQogICAgcF9yZWdleDUgOj0gcmVwbGFjZShwX3JlZ2V4NCwgIiQoZG5zX2xhYmVsKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5kbnNfbGFiZWwpCgogICAgcHJpbnQoImFsbG93X3ZhciAzOiBwX3JlZ2V4NSA9IiwgcF9yZWdleDUpCiAgICByZWdleC5tYXRjaChwX3JlZ2V4NSwgaV92YXIpCgogICAgcHJpbnQoImFsbG93X3ZhciAzOiB0cnVlIikKfQoKIyBBbGxvdyBmaWVsZFJlZiAiZmllbGRQYXRoOiBzdGF0dXMucG9kSVAiIHZhbHVlcy4KYWxsb3dfdmFyKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBpX3Zhciwgc19uYW1lLCBzX25hbWVzcGFjZSkgewogICAgbmFtZV92YWx1ZSA6PSBzcGxpdChpX3ZhciwgIj0iKQogICAgY291bnQobmFtZV92YWx1ZSkgPT0gMgogICAgaXNfaXAobmFtZV92YWx1ZVsxXSkKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIGFsbG93X3BvZF9pcF92YXIobmFtZV92YWx1ZVswXSwgcF92YXIpCgogICAgcHJpbnQoImFsbG93X3ZhciA0OiB0cnVlIikKfQoKIyBBbGxvdyBjb21tb24gZmllbGRSZWYgdmFyaWFibGVzLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBuYW1lX3ZhbHVlIDo9IHNwbGl0KGlfdmFyLCAiPSIpCiAgICBjb3VudChuYW1lX3ZhbHVlKSA9PSAyCgogICAgc29tZSBwX3ZhciBpbiBwX3Byb2Nlc3MuRW52CiAgICBwX25hbWVfdmFsdWUgOj0gc3BsaXQocF92YXIsICI9IikKICAgIGNvdW50KHBfbmFtZV92YWx1ZSkgPT0gMgoKICAgIHBfbmFtZV92YWx1ZVswXSA9PSBuYW1lX3ZhbHVlWzBdCgogICAgIyBUT0RPOiBzaG91bGQgdGhlc2UgYmUgaGFuZGxlZCBpbiBhIGRpZmZlcmVudCB3YXk/CiAgICBhbHdheXNfYWxsb3dlZCA6PSBbIiQoaG9zdC1uYW1lKSIsICIkKG5vZGUtbmFtZSkiLCAiJChwb2QtdWlkKSJdCiAgICBzb21lIGFsbG93ZWQgaW4gYWx3YXlzX2FsbG93ZWQKICAgIGNvbnRhaW5zKHBfbmFtZV92YWx1ZVsxXSwgYWxsb3dlZCkKCiAgICBwcmludCgiYWxsb3dfdmFyIDU6IHRydWUiKQp9CgojIEFsbG93IGZpZWxkUmVmICJmaWVsZFBhdGg6IHN0YXR1cy5ob3N0SVAiIHZhbHVlcy4KYWxsb3dfdmFyKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBpX3Zhciwgc19uYW1lLCBzX25hbWVzcGFjZSkgewogICAgbmFtZV92YWx1ZSA6PSBzcGxpdChpX3ZhciwgIj0iKQogICAgY291bnQobmFtZV92YWx1ZSkgPT0gMgogICAgaXNfaXAobmFtZV92YWx1ZVsxXSkKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIGFsbG93X2hvc3RfaXBfdmFyKG5hbWVfdmFsdWVbMF0sIHBfdmFyKQoKICAgIHByaW50KCJhbGxvd192YXIgNjogdHJ1ZSIpCn0KCiMgQWxsb3cgcmVzb3VyY2VGaWVsZFJlZiB2YWx1ZXMgKGUuZy4sICJsaW1pdHMuY3B1IikuCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIG5hbWVfdmFsdWUgOj0gc3BsaXQoaV92YXIsICI9IikKICAgIGNvdW50KG5hbWVfdmFsdWUpID09IDIKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHBfbmFtZV92YWx1ZSA6PSBzcGxpdChwX3ZhciwgIj0iKQogICAgY291bnQocF9uYW1lX3ZhbHVlKSA9PSAyCgogICAgcF9uYW1lX3ZhbHVlWzBdID09IG5hbWVfdmFsdWVbMF0KCiAgICAjIGEgdmFyaWFibGUgd2Ugc2hvdWxkIGJlIHZhbGlkYXRpbmcgdXNpbmcgYSByZWdleCBmcm9tIHNldHRpbmdzCiAgICBwX25hbWVfdmFsdWVbMV0gPT0gIiQodmFsaWRhdGUtZnJvbS1zZXR0aW5ncykiCgogICAgcmVnZXhfdmFsIDo9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuQ3JlYXRlQ29udGFpbmVyUmVxdWVzdC5hbGxvd19lbnZfcmVnZXhfbWFwW25hbWVfdmFsdWVbMF1dCgogICAgcHJpbnQoImFsbG93X3ZhciA3OiB2YWwgPSIsIG5hbWVfdmFsdWVbMV0pCiAgICBwcmludCgiYWxsb3dfdmFyIDc6IHJlZ2V4X3ZhbCA9IiwgcmVnZXhfdmFsKQoKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4X3ZhbCwgbmFtZV92YWx1ZVsxXSkKCiAgICBwcmludCgiYWxsb3dfdmFyIDc6IHRydWUiKQp9CgojIE1hdGNoIGlucHV0IHdpdGggb25lIG9mIHRoZSBwb2xpY3kgdmFyaWFibGVzLCBhZnRlciBzdWJzdGl0dXRpbmcgJChzYW5kYm94LW5hbWVzcGFjZSkuCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHNvbWUgcF92YXIgaW4gcF9wcm9jZXNzLkVudgogICAgcF92YXIyIDo9IHJlcGxhY2UocF92YXIsICIkKHNhbmRib3gtbmFtZXNwYWNlKSIsIHNfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd192YXIgODogcF92YXIyID0iLCBwX3ZhcjIpCiAgICBwX3ZhcjIgPT0gaV92YXIKCiAgICBwcmludCgiYWxsb3dfdmFyIDg6IHRydWUiKQp9CgphbGxvd19wb2RfaXBfdmFyKHZhcl9uYW1lLCBwX3ZhcikgewogICAgcHJpbnQoImFsbG93X3BvZF9pcF92YXI6IHZhcl9uYW1lID0iLCB2YXJfbmFtZSwgInBfdmFyID0iLCBwX3ZhcikKCiAgICBwX25hbWVfdmFsdWUgOj0gc3BsaXQocF92YXIsICI9IikKICAgIGNvdW50KHBfbmFtZV92YWx1ZSkgPT0gMgoKICAgIHBfbmFtZV92YWx1ZVswXSA9PSB2YXJfbmFtZQogICAgcF9uYW1lX3ZhbHVlWzFdID09ICIkKHBvZC1pcCkiCgogICAgcHJpbnQoImFsbG93X3BvZF9pcF92YXI6IHRydWUiKQp9CgphbGxvd19ob3N0X2lwX3Zhcih2YXJfbmFtZSwgcF92YXIpIHsKICAgIHByaW50KCJhbGxvd19ob3N0X2lwX3ZhcjogdmFyX25hbWUgPSIsIHZhcl9uYW1lLCAicF92YXIgPSIsIHBfdmFyKQoKICAgIHBfbmFtZV92YWx1ZSA6PSBzcGxpdChwX3ZhciwgIj0iKQogICAgY291bnQocF9uYW1lX3ZhbHVlKSA9PSAyCgogICAgcF9uYW1lX3ZhbHVlWzBdID09IHZhcl9uYW1lCiAgICBwX25hbWVfdmFsdWVbMV0gPT0gIiQoaG9zdC1pcCkiCgogICAgcHJpbnQoImFsbG93X2hvc3RfaXBfdmFyOiB0cnVlIikKfQoKaXNfaXAodmFsdWUpIHsKICAgIGJ5dGVzID0gc3BsaXQodmFsdWUsICIuIikKICAgIGNvdW50KGJ5dGVzKSA9PSA0CgogICAgaXNfaXBfZmlyc3RfYnl0ZShieXRlc1swXSkKICAgIGlzX2lwX290aGVyX2J5dGUoYnl0ZXNbMV0pCiAgICBpc19pcF9vdGhlcl9ieXRlKGJ5dGVzWzJdKQogICAgaXNfaXBfb3RoZXJfYnl0ZShieXRlc1szXSkKfQppc19pcF9maXJzdF9ieXRlKGNvbXBvbmVudCkgewogICAgbnVtYmVyID0gdG9fbnVtYmVyKGNvbXBvbmVudCkKICAgIG51bWJlciA+PSAxCiAgICBudW1iZXIgPD0gMjU1Cn0KaXNfaXBfb3RoZXJfYnl0ZShjb21wb25lbnQpIHsKICAgIG51bWJlciA9IHRvX251bWJlcihjb21wb25lbnQpCiAgICBudW1iZXIgPj0gMAogICAgbnVtYmVyIDw9IDI1NQp9CgojIE9DSSByb290LlBhdGgKYWxsb3dfcm9vdF9wYXRoKHBfb2NpLCBpX29jaSwgYnVuZGxlX2lkKSB7CiAgICBpX3BhdGggOj0gaV9vY2kuUm9vdC5QYXRoCiAgICBwX3BhdGgxIDo9IHBfb2NpLlJvb3QuUGF0aAogICAgcHJpbnQoImFsbG93X3Jvb3RfcGF0aDogaV9wYXRoID0iLCBpX3BhdGgsICJwX3BhdGgxID0iLCBwX3BhdGgxKQoKICAgIHBfcGF0aDIgOj0gcmVwbGFjZShwX3BhdGgxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfcm9vdF9wYXRoOiBwX3BhdGgyID0iLCBwX3BhdGgyKQoKICAgIHBfcGF0aDMgOj0gcmVwbGFjZShwX3BhdGgyLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X3Jvb3RfcGF0aDogcF9wYXRoMyA9IiwgcF9wYXRoMykKCiAgICBwX3BhdGgzID09IGlfcGF0aAoKICAgIHByaW50KCJhbGxvd19yb290X3BhdGg6IHRydWUiKQp9CgojIGRldmljZSBtb3VudHMKYWxsb3dfbW91bnQocF9vY2ksIGlfbW91bnQsIGlfc3RvcmFnZXMsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcHJpbnQoImFsbG93X21vdW50OiBpX21vdW50ID0iLCBpX21vdW50KQoKICAgIHNvbWUgcF9tb3VudCBpbiBwX29jaS5Nb3VudHMKICAgIHNvbWUgaV9zdG9yYWdlIGluIGlfc3RvcmFnZXMKCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IHBfbW91bnQgPSIsIHBfbW91bnQpCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IGlfc3RvcmFnZSA9IiwgaV9zdG9yYWdlKQoKICAgIGNoZWNrX21vdW50KHBfbW91bnQsIGlfbW91bnQsIGlfc3RvcmFnZSwgYnVuZGxlX2lkLCBzYW5kYm94X2lkKQoKICAgICMgVE9ETzogYXJlIHRoZXJlIGFueSBvdGhlciByZXF1aXJlZCBwb2xpY3kgY2hlY2tzIGZvciBtb3VudHMgLSBlLmcuLAogICAgIyAgICAgICBtdWx0aXBsZSBtb3VudHMgd2l0aCBzYW1lIHNvdXJjZSBvciBkZXN0aW5hdGlvbj8KCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IHRydWUiKQp9CgpjaGVja19tb3VudChwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcF9tb3VudCA9PSBpX21vdW50CiAgICBwcmludCgiY2hlY2tfbW91bnQgMTogdHJ1ZSIpCn0KY2hlY2tfbW91bnQocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHBfbW91bnQuZGVzdGluYXRpb24gPT0gaV9tb3VudC5kZXN0aW5hdGlvbgogICAgcF9tb3VudC50eXBlXyA9PSBpX21vdW50LnR5cGVfCiAgICBwX21vdW50Lm9wdGlvbnMgPT0gaV9tb3VudC5vcHRpb25zCgogICAgbW91bnRfc291cmNlX2FsbG93cyhwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkKCiAgICBwcmludCgiY2hlY2tfbW91bnQgMjogdHJ1ZSIpCn0KCm1vdW50X3NvdXJjZV9hbGxvd3MocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHJlZ2V4MSA6PSBwX21vdW50LnNvdXJjZQogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5tb3VudF9zb3VyY2VfY3BhdGgpCiAgICByZWdleDQgOj0gcmVwbGFjZShyZWdleDMsICIkKGJ1bmRsZS1pZCkiLCBidW5kbGVfaWQpCgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMTogcmVnZXg0ID0iLCByZWdleDQpCiAgICByZWdleC5tYXRjaChyZWdleDQsIGlfbW91bnQuc291cmNlKQoKICAgIHByaW50KCJtb3VudF9zb3VyY2VfYWxsb3dzIDE6IHRydWUiKQp9Cm1vdW50X3NvdXJjZV9hbGxvd3MocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHJlZ2V4MSA6PSBwX21vdW50LnNvdXJjZQogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5tb3VudF9zb3VyY2VfY3BhdGgpCiAgICByZWdleDQgOj0gcmVwbGFjZShyZWdleDMsICIkKHNhbmRib3gtaWQpIiwgc2FuZGJveF9pZCkKCiAgICBwcmludCgibW91bnRfc291cmNlX2FsbG93cyAyOiByZWdleDQgPSIsIHJlZ2V4NCkKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4NCwgaV9tb3VudC5zb3VyY2UpCgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMjogdHJ1ZSIpCn0KbW91bnRfc291cmNlX2FsbG93cyhwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogaV9tb3VudC5zb3VyY2UgPSIsIGlfbW91bnQuc291cmNlKQogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogaV9zdG9yYWdlLm1vdW50X3BvaW50ID0iLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCgogICAgaV9tb3VudC5zb3VyY2UgPT0gaV9zdG9yYWdlLm1vdW50X3BvaW50CgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogdHJ1ZSIpCn0KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBDcmVhdGUgY29udGFpbmVyIFN0b3JhZ2VzCgphbGxvd19zdG9yYWdlcyhwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHBfY291bnQgOj0gY291bnQocF9zdG9yYWdlcykKICAgIGlfY291bnQgOj0gY291bnQoaV9zdG9yYWdlcykKICAgIHByaW50KCJhbGxvd19zdG9yYWdlczogcF9jb3VudCA9IiwgcF9jb3VudCwgImlfY291bnQgPSIsIGlfY291bnQpCgogICAgcF9jb3VudCA9PSBpX2NvdW50CgogICAgIyBHZXQgdGhlIGNvbnRhaW5lciBpbWFnZSBsYXllciBJRHMgYW5kIHZlcml0eSByb290IGhhc2hlcywgZnJvbSB0aGUgIm92ZXJsYXlmcyIgc3RvcmFnZS4KICAgIHNvbWUgb3ZlcmxheV9zdG9yYWdlIGluIHBfc3RvcmFnZXMKICAgIG92ZXJsYXlfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIHByaW50KCJhbGxvd19zdG9yYWdlczogb3ZlcmxheV9zdG9yYWdlID0iLCBvdmVybGF5X3N0b3JhZ2UpCiAgICBjb3VudChvdmVybGF5X3N0b3JhZ2Uub3B0aW9ucykgPT0gMgoKICAgIGxheWVyX2lkcyA6PSBzcGxpdChvdmVybGF5X3N0b3JhZ2Uub3B0aW9uc1swXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiBsYXllcl9pZHMgPSIsIGxheWVyX2lkcykKCiAgICByb290X2hhc2hlcyA6PSBzcGxpdChvdmVybGF5X3N0b3JhZ2Uub3B0aW9uc1sxXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiByb290X2hhc2hlcyA9Iiwgcm9vdF9oYXNoZXMpCgogICAgZXZlcnkgaV9zdG9yYWdlIGluIGlfc3RvcmFnZXMgewogICAgICAgIGFsbG93X3N0b3JhZ2UocF9zdG9yYWdlcywgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpCiAgICB9CgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiB0cnVlIikKfQoKYWxsb3dfc3RvcmFnZShwX3N0b3JhZ2VzLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgc29tZSBwX3N0b3JhZ2UgaW4gcF9zdG9yYWdlcwoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiBwX3N0b3JhZ2UgPSIsIHBfc3RvcmFnZSkKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiBpX3N0b3JhZ2UgPSIsIGlfc3RvcmFnZSkKCiAgICBwX3N0b3JhZ2UuZHJpdmVyICAgICAgICAgICA9PSBpX3N0b3JhZ2UuZHJpdmVyCiAgICBwX3N0b3JhZ2UuZHJpdmVyX29wdGlvbnMgICA9PSBpX3N0b3JhZ2UuZHJpdmVyX29wdGlvbnMKICAgIHBfc3RvcmFnZS5mc19ncm91cCAgICAgICAgID09IGlfc3RvcmFnZS5mc19ncm91cAogICAgcF9zdG9yYWdlLmZzdHlwZSAgICAgICAgICAgPT0gaV9zdG9yYWdlLmZzdHlwZQoKICAgIGFsbG93X3N0b3JhZ2Vfc291cmNlKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKQogICAgYWxsb3dfc3RvcmFnZV9vcHRpb25zKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKQogICAgYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKQoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiB0cnVlIikKfQoKYWxsb3dfc3RvcmFnZV9zb3VyY2UocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX3NvdXJjZSAxOiBzdGFydCIpCgogICAgcF9zdG9yYWdlLnNvdXJjZSA9PSBpX3N0b3JhZ2Uuc291cmNlCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDE6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX3NvdXJjZShwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDI6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCgogICAgIyBEREREOkJCOkRELkY6IERvbWFpbjpCdXM6RGV2aWNlLkZ1bmN0aW9uCiAgICAjIGh0dHBzOi8vd3d3Lmtlcm5lbC5vcmcvZG9jL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtYnVzLXBjaQogICAgcmVnZXgubWF0Y2goYF5bYS1mMC05XXs0fTpbYS1mMC05XXsyfTpbYS1mMC05XXsyfVwuW2EtZjAtOV0kYCwgaV9zdG9yYWdlLnNvdXJjZSkKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9zb3VyY2UgMjogdHJ1ZSIpCn0KCmFsbG93X3N0b3JhZ2Vfc291cmNlKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKSB7CiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9zb3VyY2UgMzogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIGlfc3RvcmFnZS5zb3VyY2UgPT0gIm5vbmUiCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDM6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX3NvdXJjZShwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDQ6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJzbWIiCgogICAgIyBQYXR0ZXJuOiAvLzxzdG9yYWdlLWFjY291bnQtbmFtZT4uZmlsZS5jb3JlLndpbmRvd3MubmV0LzxrOHMtUFZDLW5hbWU+CiAgICAjIFN0b3JhZ2UgYWNjb3VudCBuYW1lOiBodHRwczovL2xlYXJuLm1pY3Jvc29mdC5jb20vZW4tdXMvYXp1cmUvc3RvcmFnZS9jb21tb24vc3RvcmFnZS1hY2NvdW50LW92ZXJ2aWV3I3N0b3JhZ2UtYWNjb3VudC1uYW1lCiAgICAjIEs4cyBQVkMgbmFtZTogaHR0cHM6Ly9rdWJlcm5ldGVzLmlvL2RvY3MvY29uY2VwdHMvb3ZlcnZpZXcvd29ya2luZy13aXRoLW9iamVjdHMvbmFtZXMvI2Rucy1zdWJkb21haW4tbmFtZXMKICAgIHJlZ2V4Lm1hdGNoKGBeXC9cLyhbYS16MC05XXszLDI0fSlcLmZpbGVcLmNvcmVcLndpbmRvd3NcLm5ldFwvW2EtejAtOV0oW2EtejAtOS4tXXswLDI1MX1bYS16MC05XSk/JGAsIGlfc3RvcmFnZS5zb3VyY2UpCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDQ6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMTogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgIT0gIm92ZXJsYXlmcyIKICAgIHBfc3RvcmFnZS5vcHRpb25zID09IGlfc3RvcmFnZS5vcHRpb25zCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAxOiB0cnVlIikKfQphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIGNvdW50KHBfc3RvcmFnZS5vcHRpb25zKSA9PSAyCgogICAgcG9saWN5X2lkcyA6PSBzcGxpdChwX3N0b3JhZ2Uub3B0aW9uc1swXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBwb2xpY3lfaWRzID0iLCBwb2xpY3lfaWRzKQogICAgcG9saWN5X2lkcyA9PSBsYXllcl9pZHMKCiAgICBwb2xpY3lfaGFzaGVzIDo9IHNwbGl0KHBfc3RvcmFnZS5vcHRpb25zWzFdLCAiOiIpCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IHBvbGljeV9oYXNoZXMgPSIsIHBvbGljeV9oYXNoZXMpCgogICAgcF9jb3VudCA6PSBjb3VudChwb2xpY3lfaWRzKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBwX2NvdW50ID0iLCBwX2NvdW50KQogICAgcF9jb3VudCA+PSAxCiAgICBwX2NvdW50ID09IGNvdW50KHBvbGljeV9oYXNoZXMpCgogICAgaV9jb3VudCA6PSBjb3VudChpX3N0b3JhZ2Uub3B0aW9ucykKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogaV9jb3VudCA9IiwgaV9jb3VudCkKICAgIGlfY291bnQgPT0gcF9jb3VudCArIDMKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zWzBdID0iLCBpX3N0b3JhZ2Uub3B0aW9uc1swXSkKICAgIGlfc3RvcmFnZS5vcHRpb25zWzBdID09ICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQubGF5ZXItc3JjLXByZWZpeD0vdmFyL2xpYi9jb250YWluZXJkL2lvLmNvbnRhaW5lcmQuc25hcHNob3R0ZXIudjEudGFyZGV2L2xheWVycyIKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zW2lfY291bnQgLSAyXSA9IiwgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDJdKQogICAgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDJdID09ICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQub3ZlcmxheS1ydyIKCiAgICBsb3dlcmRpciA6PSBjb25jYXQoIj0iLCBbImxvd2VyZGlyIiwgcF9zdG9yYWdlLm9wdGlvbnNbMF1dKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBsb3dlcmRpciA9IiwgbG93ZXJkaXIpCgogICAgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDFdID09IGxvd2VyZGlyCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zW2lfY291bnQgLSAxXSA9IiwgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDFdKQoKICAgIGV2ZXJ5IGksIHBvbGljeV9pZCBpbiBwb2xpY3lfaWRzIHsKICAgICAgICBhbGxvd19vdmVybGF5X2xheWVyKHBvbGljeV9pZCwgcG9saWN5X2hhc2hlc1tpXSwgaV9zdG9yYWdlLm9wdGlvbnNbaSArIDFdKQogICAgfQoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogdHJ1ZSIpCn0KYWxsb3dfc3RvcmFnZV9vcHRpb25zKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKSB7CiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDM6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCiAgICBjb3VudChwX3N0b3JhZ2Uub3B0aW9ucykgPT0gMQoKICAgIHN0YXJ0c3dpdGgocF9zdG9yYWdlLm9wdGlvbnNbMF0sICIkKGhhc2giKQogICAgaGFzaF9zdWZmaXggOj0gdHJpbV9sZWZ0KHBfc3RvcmFnZS5vcHRpb25zWzBdLCAiJChoYXNoIikKCiAgICBlbmRzd2l0aChoYXNoX3N1ZmZpeCwgIikiKQogICAgaGFzaF9pbmRleCA6PSB0cmltX3JpZ2h0KGhhc2hfc3VmZml4LCAiKSIpCiAgICBpIDo9IHRvX251bWJlcihoYXNoX2luZGV4KQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAzOiBpID0iLCBpKQoKICAgIGhhc2hfb3B0aW9uIDo9IGNvbmNhdCgiPSIsIFsiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LnJvb3QtaGFzaCIsIHJvb3RfaGFzaGVzW2ldXSkKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMzogaGFzaF9vcHRpb24gPSIsIGhhc2hfb3B0aW9uKQoKICAgIGNvdW50KGlfc3RvcmFnZS5vcHRpb25zKSA9PSA0CiAgICBpX3N0b3JhZ2Uub3B0aW9uc1swXSA9PSAicm8iCiAgICBpX3N0b3JhZ2Uub3B0aW9uc1sxXSA9PSAiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmJsb2NrX2RldmljZT1maWxlIgogICAgaV9zdG9yYWdlLm9wdGlvbnNbMl0gPT0gImlvLmthdGFjb250YWluZXJzLmZzLW9wdC5pcy1sYXllciIKICAgIGlfc3RvcmFnZS5vcHRpb25zWzNdID09IGhhc2hfb3B0aW9uCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAzOiB0cnVlIikKfQphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgNDogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gInNtYiIKICAgIHBfb3B0c19jb3VudCA6PSBjb3VudChwX3N0b3JhZ2Uub3B0aW9ucykKICAgIGlfb3B0c19jb3VudCA6PSBjb3VudChpX3N0b3JhZ2Uub3B0aW9ucykKICAgIGlfb3B0c19jb3VudCA9PSBwX29wdHNfY291bnQgKyAyCgogICAgaV9vcHRfbWF0Y2hlcyA6PSBbaSB8IGkgOj0gaWR4OyBpZHggPCBwX29wdHNfY291bnQ7IHBfc3RvcmFnZS5vcHRpb25zW2lkeF0gPT0gaV9zdG9yYWdlLm9wdGlvbnNbaWR4XV0KICAgIGNvdW50KGlfb3B0X21hdGNoZXMpID09IHBfb3B0c19jb3VudAoKICAgIHN0YXJ0c3dpdGgoaV9zdG9yYWdlLm9wdGlvbnNbaV9vcHRzX2NvdW50LTJdLCAiYWRkcj0iKQogICAgY3JlZHMgPSBzcGxpdChpX3N0b3JhZ2Uub3B0aW9uc1tpX29wdHNfY291bnQtMV0sICIsIikKICAgIGNvdW50KGNyZWRzKSA9PSAyCiAgICBzdGFydHN3aXRoKGNyZWRzWzBdLCAidXNlcm5hbWU9IikKICAgIHN0YXJ0c3dpdGgoY3JlZHNbMV0sICJwYXNzd29yZD0iKQogICAgCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDQ6IHRydWUiKQp9CgphbGxvd19vdmVybGF5X2xheWVyKHBvbGljeV9pZCwgcG9saWN5X2hhc2gsIGlfb3B0aW9uKSB7CiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogcG9saWN5X2lkID0iLCBwb2xpY3lfaWQsICJwb2xpY3lfaGFzaCA9IiwgcG9saWN5X2hhc2gpCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogaV9vcHRpb24gPSIsIGlfb3B0aW9uKQoKICAgIHN0YXJ0c3dpdGgoaV9vcHRpb24sICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQubGF5ZXI9IikKICAgIGlfdmFsdWUgOj0gcmVwbGFjZShpX29wdGlvbiwgImlvLmthdGFjb250YWluZXJzLmZzLW9wdC5sYXllcj0iLCAiIikKICAgIGlfdmFsdWVfZGVjb2RlZCA6PSBiYXNlNjQuZGVjb2RlKGlfdmFsdWUpCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogaV92YWx1ZV9kZWNvZGVkID0iLCBpX3ZhbHVlX2RlY29kZWQpCgogICAgcG9saWN5X3N1ZmZpeCA6PSBjb25jYXQoIj0iLCBbInRhcixybyxpby5rYXRhY29udGFpbmVycy5mcy1vcHQuYmxvY2tfZGV2aWNlPWZpbGUsaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmlzLWxheWVyLGlvLmthdGFjb250YWluZXJzLmZzLW9wdC5yb290LWhhc2giLCBwb2xpY3lfaGFzaF0pCiAgICBwX3ZhbHVlIDo9IGNvbmNhdCgiLCIsIFtwb2xpY3lfaWQsIHBvbGljeV9zdWZmaXhdKQogICAgcHJpbnQoImFsbG93X292ZXJsYXlfbGF5ZXI6IHBfdmFsdWUgPSIsIHBfdmFsdWUpCgogICAgcF92YWx1ZSA9PSBpX3ZhbHVlX2RlY29kZWQKCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogdHJ1ZSIpCn0KCmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAidGFyIgoKICAgIHN0YXJ0c3dpdGgocF9zdG9yYWdlLm1vdW50X3BvaW50LCAiJChsYXllciIpCiAgICBtb3VudF9zdWZmaXggOj0gdHJpbV9sZWZ0KHBfc3RvcmFnZS5tb3VudF9wb2ludCwgIiQobGF5ZXIiKQoKICAgIGVuZHN3aXRoKG1vdW50X3N1ZmZpeCwgIikiKQogICAgbGF5ZXJfaW5kZXggOj0gdHJpbV9yaWdodChtb3VudF9zdWZmaXgsICIpIikKICAgIGkgOj0gdG9fbnVtYmVyKGxheWVyX2luZGV4KQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDE6IGkgPSIsIGkpCgogICAgbGF5ZXJfaWQgOj0gbGF5ZXJfaWRzW2ldCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMTogbGF5ZXJfaWQgPSIsIGxheWVyX2lkKQoKICAgIHBfbW91bnQgOj0gY29uY2F0KCIvIiwgWyIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L2xheWVycyIsIGxheWVyX2lkXSkKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCAxOiBwX21vdW50ID0iLCBwX21vdW50KQoKICAgIHBfbW91bnQgPT0gaV9zdG9yYWdlLm1vdW50X3BvaW50CgogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDE6IHRydWUiKQp9CmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAiZnVzZTMua2F0YS1vdmVybGF5IgoKICAgIG1vdW50MSA6PSByZXBsYWNlKHBfc3RvcmFnZS5tb3VudF9wb2ludCwgIiQoY3BhdGgpIiwgcG9saWN5X2RhdGEuY29tbW9uLmNwYXRoKQogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDI6IG1vdW50MiA9IiwgbW91bnQyKQoKICAgIG1vdW50MiA9PSBpX3N0b3JhZ2UubW91bnRfcG9pbnQKCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMjogdHJ1ZSIpCn0KYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKSB7CiAgICBwX3N0b3JhZ2UuZnN0eXBlID09ICJsb2NhbCIKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQyID0iLCBtb3VudDIpCgogICAgbW91bnQzIDo9IHJlcGxhY2UobW91bnQyLCAiJChzYW5kYm94LWlkKSIsIHNhbmRib3hfaWQpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQzID0iLCBtb3VudDMpCgogICAgcmVnZXgubWF0Y2gobW91bnQzLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCgogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDM6IHRydWUiKQp9CmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAiYmluZCIKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNDogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNDogbW91bnQyID0iLCBtb3VudDIpCgogICAgbW91bnQzIDo9IHJlcGxhY2UobW91bnQyLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDQ6IG1vdW50MyA9IiwgbW91bnQzKQoKICAgIHJlZ2V4Lm1hdGNoKG1vdW50MywgaV9zdG9yYWdlLm1vdW50X3BvaW50KQoKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA0OiB0cnVlIikKfQphbGxvd19tb3VudF9wb2ludChwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgYnVuZGxlX2lkLCBzYW5kYm94X2lkLCBsYXllcl9pZHMpIHsKICAgIHBfc3RvcmFnZS5mc3R5cGUgPT0gInRtcGZzIgoKICAgIG1vdW50MSA6PSBwX3N0b3JhZ2UubW91bnRfcG9pbnQKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA1OiBtb3VudDEgPSIsIG1vdW50MSkKCiAgICByZWdleC5tYXRjaChtb3VudDEsIGlfc3RvcmFnZS5tb3VudF9wb2ludCkKCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNTogdHJ1ZSIpCn0KYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKSB7CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogaV9zdG9yYWdlLm1vdW50X3BvaW50ID0iLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCiAgICBhbGxvd19kaXJlY3Rfdm9sX2RyaXZlcihwX3N0b3JhZ2UsIGlfc3RvcmFnZSkKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChzcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQyID0iLCBtb3VudDIpCgogICAgZGlyZWN0X3ZvbF9wYXRoIDo9IGlfc3RvcmFnZS5zb3VyY2UKICAgIG1vdW50MyA6PSByZXBsYWNlKG1vdW50MiwgIiQoYjY0LWRpcmVjdC12b2wtcGF0aCkiLCBiYXNlNjR1cmwuZW5jb2RlKGRpcmVjdF92b2xfcGF0aCkpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQzID0iLCBtb3VudDMpCgogICAgbW91bnQzID09IGlfc3RvcmFnZS5tb3VudF9wb2ludAoKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA2OiB0cnVlIikKfQoKYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIocF9zdG9yYWdlLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19kaXJlY3Rfdm9sX2RyaXZlciAxOiBzdGFydCIpCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCiAgICBwcmludCgiYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIgMTogdHJ1ZSIpCn0KYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIocF9zdG9yYWdlLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19kaXJlY3Rfdm9sX2RyaXZlciAyOiBzdGFydCIpCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJzbWIiCiAgICBwcmludCgiYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIgMjogdHJ1ZSIpCn0KCiMgRXhlY1Byb2Nlc3NSZXF1ZXN0LnByb2Nlc3MuQ2FwYWJpbGl0aWVzCmFsbG93X2V4ZWNfY2FwcyhpX2NhcHMpIHsKICAgIG5vdCBpX2NhcHMuQW1iaWVudAogICAgbm90IGlfY2Fwcy5Cb3VuZGluZwogICAgbm90IGlfY2Fwcy5FZmZlY3RpdmUKICAgIG5vdCBpX2NhcHMuSW5oZXJpdGFibGUKICAgIG5vdCBpX2NhcHMuUGVybWl0dGVkCn0KCiMgT0NJLlByb2Nlc3MuQ2FwYWJpbGl0aWVzCmFsbG93X2NhcHMocF9jYXBzLCBpX2NhcHMpIHsKICAgIHByaW50KCJhbGxvd19jYXBzOiBwb2xpY3kgQW1iaWVudCA9IiwgcF9jYXBzLkFtYmllbnQpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgQW1iaWVudCA9IiwgaV9jYXBzLkFtYmllbnQpCiAgICBtYXRjaF9jYXBzKHBfY2Fwcy5BbWJpZW50LCBpX2NhcHMuQW1iaWVudCkKCiAgICBwcmludCgiYWxsb3dfY2FwczogcG9saWN5IEJvdW5kaW5nID0iLCBwX2NhcHMuQm91bmRpbmcpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgQm91bmRpbmcgPSIsIGlfY2Fwcy5Cb3VuZGluZykKICAgIG1hdGNoX2NhcHMocF9jYXBzLkJvdW5kaW5nLCBpX2NhcHMuQm91bmRpbmcpCgogICAgcHJpbnQoImFsbG93X2NhcHM6IHBvbGljeSBFZmZlY3RpdmUgPSIsIHBfY2Fwcy5FZmZlY3RpdmUpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgRWZmZWN0aXZlID0iLCBpX2NhcHMuRWZmZWN0aXZlKQogICAgbWF0Y2hfY2FwcyhwX2NhcHMuRWZmZWN0aXZlLCBpX2NhcHMuRWZmZWN0aXZlKQoKICAgIHByaW50KCJhbGxvd19jYXBzOiBwb2xpY3kgSW5oZXJpdGFibGUgPSIsIHBfY2Fwcy5Jbmhlcml0YWJsZSkKICAgIHByaW50KCJhbGxvd19jYXBzOiBpbnB1dCBJbmhlcml0YWJsZSA9IiwgaV9jYXBzLkluaGVyaXRhYmxlKQogICAgbWF0Y2hfY2FwcyhwX2NhcHMuSW5oZXJpdGFibGUsIGlfY2Fwcy5Jbmhlcml0YWJsZSkKCiAgICBwcmludCgiYWxsb3dfY2FwczogcG9saWN5IFBlcm1pdHRlZCA9IiwgcF9jYXBzLlBlcm1pdHRlZCkKICAgIHByaW50KCJhbGxvd19jYXBzOiBpbnB1dCBQZXJtaXR0ZWQgPSIsIGlfY2Fwcy5QZXJtaXR0ZWQpCiAgICBtYXRjaF9jYXBzKHBfY2Fwcy5QZXJtaXR0ZWQsIGlfY2Fwcy5QZXJtaXR0ZWQpCn0KCm1hdGNoX2NhcHMocF9jYXBzLCBpX2NhcHMpIHsKICAgIHByaW50KCJtYXRjaF9jYXBzIDE6IHN0YXJ0IikKCiAgICBwX2NhcHMgPT0gaV9jYXBzCgogICAgcHJpbnQoIm1hdGNoX2NhcHMgMTogdHJ1ZSIpCn0KbWF0Y2hfY2FwcyhwX2NhcHMsIGlfY2FwcykgewogICAgcHJpbnQoIm1hdGNoX2NhcHMgMjogc3RhcnQiKQoKICAgIGNvdW50KHBfY2FwcykgPT0gMQogICAgcF9jYXBzWzBdID09ICIkKGRlZmF1bHRfY2FwcykiCgogICAgcHJpbnQoIm1hdGNoX2NhcHMgMjogZGVmYXVsdF9jYXBzID0iLCBwb2xpY3lfZGF0YS5jb21tb24uZGVmYXVsdF9jYXBzKQogICAgcG9saWN5X2RhdGEuY29tbW9uLmRlZmF1bHRfY2FwcyA9PSBpX2NhcHMKCiAgICBwcmludCgibWF0Y2hfY2FwcyAyOiB0cnVlIikKfQptYXRjaF9jYXBzKHBfY2FwcywgaV9jYXBzKSB7CiAgICBwcmludCgibWF0Y2hfY2FwcyAzOiBzdGFydCIpCgogICAgY291bnQocF9jYXBzKSA9PSAxCiAgICBwX2NhcHNbMF0gPT0gIiQocHJpdmlsZWdlZF9jYXBzKSIKCiAgICBwcmludCgibWF0Y2hfY2FwcyAzOiBwcml2aWxlZ2VkX2NhcHMgPSIsIHBvbGljeV9kYXRhLmNvbW1vbi5wcml2aWxlZ2VkX2NhcHMpCiAgICBwb2xpY3lfZGF0YS5jb21tb24ucHJpdmlsZWdlZF9jYXBzID09IGlfY2FwcwoKICAgIHByaW50KCJtYXRjaF9jYXBzIDM6IHRydWUiKQp9CgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgpjaGVja19kaXJlY3RvcnlfdHJhdmVyc2FsKGlfcGF0aCkgewogICAgbm90IHJlZ2V4Lm1hdGNoKCIoXnwvKS4uKCR8LykiLCBpX3BhdGgpCn0KCmNoZWNrX3N5bWxpbmtfc291cmNlKGlfc3JjKSB7CiAgICBpX3NyYyA9PSAiIgogICAgcHJpbnQoImNoZWNrX3N5bWxpbmtfc291cmNlIDE6IHRydWUiKQp9CmNoZWNrX3N5bWxpbmtfc291cmNlKGlfc3JjKSB7CiAgICBpX3NyYyAhPSAiIgogICAgcHJpbnQoImNoZWNrX3N5bWxpbmtfc291cmNlIDI6IGlfc3JjID0iLCBpX3NyYykKCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24uc19zb3VyY2UxLCBpX3NyYykKCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMjogdHJ1ZSIpCn0KY2hlY2tfc3ltbGlua19zb3VyY2UoaV9zcmMpIHsKICAgIGlfc3JjICE9ICIiCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMzogaV9zcmMgPSIsIGlfc3JjKQoKICAgIHJlZ2V4Lm1hdGNoKHBvbGljeV9kYXRhLmNvbW1vbi5zX3NvdXJjZTIsIGlfc3JjKQogICAgY2hlY2tfZGlyZWN0b3J5X3RyYXZlcnNhbChpX3NyYykKCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMzogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfc3RvcmFnZXMoaV9zdG9yYWdlcykgewogICAgcHJpbnQoImFsbG93X3NhbmRib3hfc3RvcmFnZXM6IGlfc3RvcmFnZXMgPSIsIGlfc3RvcmFnZXMpCgogICAgcF9zdG9yYWdlcyA6PSBwb2xpY3lfZGF0YS5zYW5kYm94LnN0b3JhZ2VzCiAgICBldmVyeSBpX3N0b3JhZ2UgaW4gaV9zdG9yYWdlcyB7CiAgICAgICAgYWxsb3dfc2FuZGJveF9zdG9yYWdlKHBfc3RvcmFnZXMsIGlfc3RvcmFnZSkKICAgIH0KCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9zdG9yYWdlczogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfc3RvcmFnZShwX3N0b3JhZ2VzLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IGlfc3RvcmFnZSA9IiwgaV9zdG9yYWdlKQoKICAgIHNvbWUgcF9zdG9yYWdlIGluIHBfc3RvcmFnZXMKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IHBfc3RvcmFnZSA9IiwgcF9zdG9yYWdlKQogICAgaV9zdG9yYWdlID09IHBfc3RvcmFnZQoKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IHRydWUiKQp9CgpDb3B5RmlsZVJlcXVlc3QgewogICAgcHJpbnQoIkNvcHlGaWxlUmVxdWVzdDogaW5wdXQucGF0aCA9IiwgaW5wdXQucGF0aCkKCiAgICBjaGVja19zeW1saW5rX3NvdXJjZShpbnB1dC5zeW1saW5rX3NyYykKICAgIGNoZWNrX2RpcmVjdG9yeV90cmF2ZXJzYWwoaW5wdXQucGF0aCkKCiAgICBzb21lIHJlZ2V4MSBpbiBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLkNvcHlGaWxlUmVxdWVzdAogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5jcGF0aCkKICAgIHJlZ2V4NCA6PSByZXBsYWNlKHJlZ2V4MywgIiQoYnVuZGxlLWlkKSIsIEJVTkRMRV9JRCkKICAgIHByaW50KCJDb3B5RmlsZVJlcXVlc3Q6IHJlZ2V4NCA9IiwgcmVnZXg0KQoKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4NCwgaW5wdXQucGF0aCkKCiAgICBwcmludCgiQ29weUZpbGVSZXF1ZXN0OiB0cnVlIikKfQoKQ3JlYXRlU2FuZGJveFJlcXVlc3QgewogICAgcHJpbnQoIkNyZWF0ZVNhbmRib3hSZXF1ZXN0OiBpbnB1dC5ndWVzdF9ob29rX3BhdGggPSIsIGlucHV0Lmd1ZXN0X2hvb2tfcGF0aCkKICAgIGNvdW50KGlucHV0Lmd1ZXN0X2hvb2tfcGF0aCkgPT0gMAoKICAgIHByaW50KCJDcmVhdGVTYW5kYm94UmVxdWVzdDogaW5wdXQua2VybmVsX21vZHVsZXMgPSIsIGlucHV0Lmtlcm5lbF9tb2R1bGVzKQogICAgY291bnQoaW5wdXQua2VybmVsX21vZHVsZXMpID09IDAKCiAgICBpX3BpZG5zIDo9IGlucHV0LnNhbmRib3hfcGlkbnMKICAgIHByaW50KCJDcmVhdGVTYW5kYm94UmVxdWVzdDogaV9waWRucyA9IiwgaV9waWRucykKICAgIGlfcGlkbnMgPT0gZmFsc2UKICAgIGFsbG93X3NhbmRib3hfc3RvcmFnZXMoaW5wdXQuc3RvcmFnZXMpCn0KCmFsbG93X2V4ZWMocF9jb250YWluZXIsIGlfcHJvY2VzcykgewogICAgcHJpbnQoImFsbG93X2V4ZWM6IHN0YXJ0IikKCiAgICBwX29jaSA9IHBfY29udGFpbmVyLk9DSQogICAgcF9zX25hbWUgPSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc19uYW1lc3BhY2UgPSBnZXRfc3RhdGVfdmFsKCJuYW1lc3BhY2UiKQogICAgYWxsb3dfcHJvYmVfcHJvY2VzcyhwX29jaS5Qcm9jZXNzLCBpX3Byb2Nlc3MsIHBfc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfZXhlYzogdHJ1ZSIpCn0KCmFsbG93X2ludGVyYWN0aXZlX2V4ZWMocF9jb250YWluZXIsIGlfcHJvY2VzcykgewogICAgcHJpbnQoImFsbG93X2ludGVyYWN0aXZlX2V4ZWM6IHN0YXJ0IikKCiAgICBwX29jaSA9IHBfY29udGFpbmVyLk9DSQogICAgcF9zX25hbWUgPSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc19uYW1lc3BhY2UgPSBnZXRfc3RhdGVfdmFsKCJuYW1lc3BhY2UiKQogICAgYWxsb3dfaW50ZXJhY3RpdmVfcHJvY2VzcyhwX29jaS5Qcm9jZXNzLCBpX3Byb2Nlc3MsIHBfc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfaW50ZXJhY3RpdmVfZXhlYzogdHJ1ZSIpCn0KCiMgVE9ETzogc2hvdWxkIG90aGVyIEV4ZWNQcm9jZXNzUmVxdWVzdCBpbnB1dCBkYXRhIGZpZWxkcyBiZSB2YWxpZGF0ZWQgYXMgd2VsbD8KRXhlY1Byb2Nlc3NSZXF1ZXN0IHsKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMTogaW5wdXQgPSIsIGlucHV0KQoKICAgIHNvbWUgcF9jb21tYW5kIGluIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuRXhlY1Byb2Nlc3NSZXF1ZXN0LmFsbG93ZWRfY29tbWFuZHMKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMTogcF9jb21tYW5kID0iLCBwX2NvbW1hbmQpCiAgICBwX2NvbW1hbmQgPT0gaW5wdXQucHJvY2Vzcy5BcmdzCgogICAgIyBUT0RPOiBtYXRjaCBwX2NvbnRhaW5lcidzIElEIHdpdGggdGhlIGlucHV0IGNvbnRhaW5lcl9pZC4KICAgIHNvbWUgcF9jb250YWluZXIgaW4gcG9saWN5X2RhdGEuY29udGFpbmVycwogICAgYWxsb3dfaW50ZXJhY3RpdmVfZXhlYyhwX2NvbnRhaW5lciwgaW5wdXQucHJvY2VzcykKCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDE6IHRydWUiKQp9CkV4ZWNQcm9jZXNzUmVxdWVzdCB7CiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDI6IGlucHV0ID0iLCBpbnB1dCkKCiAgICAjIFRPRE86IG1hdGNoIGlucHV0IGNvbnRhaW5lciBJRCB3aXRoIGl0cyBjb3JyZXNwb25kaW5nIGNvbnRhaW5lci5leGVjX2NvbW1hbmRzLgogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBzb21lIHBfY29tbWFuZCBpbiBwX2NvbnRhaW5lci5leGVjX2NvbW1hbmRzCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDI6IHBfY29tbWFuZCA9IiwgcF9jb21tYW5kKQoKICAgICMgVE9ETzogc2hvdWxkIG90aGVyIGlucHV0IGRhdGEgZmllbGRzIGJlIHZhbGlkYXRlZCBhcyB3ZWxsPwogICAgcF9jb21tYW5kID09IGlucHV0LnByb2Nlc3MuQXJncwoKICAgIGFsbG93X2V4ZWMocF9jb250YWluZXIsIGlucHV0LnByb2Nlc3MpCgogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAyOiB0cnVlIikKfQpFeGVjUHJvY2Vzc1JlcXVlc3QgewogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAzOiBpbnB1dCA9IiwgaW5wdXQpCgogICAgaV9jb21tYW5kID0gY29uY2F0KCIgIiwgaW5wdXQucHJvY2Vzcy5BcmdzKQogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAzOiBpX2NvbW1hbmQgPSIsIGlfY29tbWFuZCkKCiAgICBzb21lIHBfcmVnZXggaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5FeGVjUHJvY2Vzc1JlcXVlc3QucmVnZXgKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMzogcF9yZWdleCA9IiwgcF9yZWdleCkKCiAgICByZWdleC5tYXRjaChwX3JlZ2V4LCBpX2NvbW1hbmQpCgogICAgIyBUT0RPOiBtYXRjaCBwX2NvbnRhaW5lcidzIElEIHdpdGggdGhlIGlucHV0IGNvbnRhaW5lcl9pZC4KICAgIHNvbWUgcF9jb250YWluZXIgaW4gcG9saWN5X2RhdGEuY29udGFpbmVycwogICAgYWxsb3dfaW50ZXJhY3RpdmVfZXhlYyhwX2NvbnRhaW5lciwgaW5wdXQucHJvY2VzcykKCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDM6IHRydWUiKQp9CgpVcGRhdGVSb3V0ZXNSZXF1ZXN0IHsKICAgIHByaW50KCJVcGRhdGVSb3V0ZXNSZXF1ZXN0OiBpbnB1dCA9IiwgaW5wdXQpCiAgICBwcmludCgiVXBkYXRlUm91dGVzUmVxdWVzdDogcG9saWN5ID0iLCBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLlVwZGF0ZVJvdXRlc1JlcXVlc3QpCgogICAgaV9yb3V0ZXMgOj0gaW5wdXQucm91dGVzLlJvdXRlcwogICAgcF9zb3VyY2VfcmVnZXggPSBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLlVwZGF0ZVJvdXRlc1JlcXVlc3QuZm9yYmlkZGVuX3NvdXJjZV9yZWdleAogICAgcF9uYW1lcyA9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuVXBkYXRlUm91dGVzUmVxdWVzdC5mb3JiaWRkZW5fZGV2aWNlX25hbWVzCgogICAgZXZlcnkgaV9yb3V0ZSBpbiBpX3JvdXRlcyB7CiAgICAgICAgcHJpbnQoImlfcm91dGUuc291cmNlID0iLCBpX3JvdXRlLnNvdXJjZSkKICAgICAgICBldmVyeSBwX3JlZ2V4IGluIHBfc291cmNlX3JlZ2V4IHsKICAgICAgICAgICAgcHJpbnQoInBfcmVnZXggPSIsIHBfcmVnZXgpCiAgICAgICAgICAgIG5vdCByZWdleC5tYXRjaChwX3JlZ2V4LCBpX3JvdXRlLnNvdXJjZSkKICAgICAgICB9CgogICAgICAgIHByaW50KCJpX3JvdXRlLmRldmljZSA9IiwgaV9yb3V0ZS5kZXZpY2UpCiAgICAgICAgbm90IGlfcm91dGUuZGV2aWNlIGluIHBfbmFtZXMKICAgIH0KCiAgICBwcmludCgiVXBkYXRlUm91dGVzUmVxdWVzdDogdHJ1ZSIpCn0KClVwZGF0ZUludGVyZmFjZVJlcXVlc3QgewogICAgcHJpbnQoIlVwZGF0ZUludGVyZmFjZVJlcXVlc3Q6IGlucHV0ID0iLCBpbnB1dCkKICAgIHByaW50KCJVcGRhdGVJbnRlcmZhY2VSZXF1ZXN0OiBwb2xpY3kgPSIsIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuVXBkYXRlSW50ZXJmYWNlUmVxdWVzdCkKCiAgICBpX2ludGVyZmFjZSA6PSBpbnB1dC5pbnRlcmZhY2UKICAgIHBfZmxhZ3MgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmFsbG93X3Jhd19mbGFncwoKICAgICMgVHlwaWNhbGx5LCBqdXN0IElGRl9OT0FSUCBpcyB1c2VkLgogICAgYml0cy5hbmQoaV9pbnRlcmZhY2UucmF3X2ZsYWdzLCBiaXRzLm5lZ2F0ZShwX2ZsYWdzKSkgPT0gMAoKICAgIHBfbmFtZXMgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmZvcmJpZGRlbl9uYW1lcwoKICAgIG5vdCBpX2ludGVyZmFjZS5uYW1lIGluIHBfbmFtZXMKCiAgICBwX2h3YWRkcnMgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmZvcmJpZGRlbl9od19hZGRycwoKICAgIG5vdCBpX2ludGVyZmFjZS5od0FkZHIgaW4gcF9od2FkZHJzCgogICAgcHJpbnQoIlVwZGF0ZUludGVyZmFjZVJlcXVlc3Q6IHRydWUiKQp9CgpDbG9zZVN0ZGluUmVxdWVzdCB7CiAgICBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLkNsb3NlU3RkaW5SZXF1ZXN0ID09IHRydWUKfQoKUmVhZFN0cmVhbVJlcXVlc3QgewogICAgcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5SZWFkU3RyZWFtUmVxdWVzdCA9PSB0cnVlCn0KClVwZGF0ZUVwaGVtZXJhbE1vdW50c1JlcXVlc3QgewogICAgcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVFcGhlbWVyYWxNb3VudHNSZXF1ZXN0ID09IHRydWUKfQoKV3JpdGVTdHJlYW1SZXF1ZXN0IHsKICAgIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuV3JpdGVTdHJlYW1SZXF1ZXN0ID09IHRydWUKfQoKcG9saWN5X2RhdGEgOj0gewogICJjb250YWluZXJzIjogWwogICAgewogICAgICAiT0NJIjogewogICAgICAgICJWZXJzaW9uIjogIjEuMS4wLXJjLjEiLAogICAgICAgICJQcm9jZXNzIjogewogICAgICAgICAgIlRlcm1pbmFsIjogZmFsc2UsCiAgICAgICAgICAiVXNlciI6IHsKICAgICAgICAgICAgIlVJRCI6IDY1NTM1LAogICAgICAgICAgICAiR0lEIjogNjU1MzUsCiAgICAgICAgICAgICJBZGRpdGlvbmFsR2lkcyI6IFtdLAogICAgICAgICAgICAiVXNlcm5hbWUiOiAiIgogICAgICAgICAgfSwKICAgICAgICAgICJEZXByZWNhdGVkQXJncyI6IFsKICAgICAgICAgICAgIi9wYXVzZSIKICAgICAgICAgIF0sCiAgICAgICAgICAiQXJncyI6IFsKICAgICAgICAgICAgIi9wYXVzZSIKICAgICAgICAgIF0sCiAgICAgICAgICAiRW52IjogWwogICAgICAgICAgICAiUEFUSD0vdXNyL2xvY2FsL3NiaW46L3Vzci9sb2NhbC9iaW46L3Vzci9zYmluOi91c3IvYmluOi9zYmluOi9iaW4iCiAgICAgICAgICBdLAogICAgICAgICAgIkN3ZCI6ICIvIiwKICAgICAgICAgICJDYXBhYmlsaXRpZXMiOiB7CiAgICAgICAgICAgICJBbWJpZW50IjogW10sCiAgICAgICAgICAgICJCb3VuZGluZyI6IFsKICAgICAgICAgICAgICAiJChkZWZhdWx0X2NhcHMpIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiRWZmZWN0aXZlIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJJbmhlcml0YWJsZSI6IFtdLAogICAgICAgICAgICAiUGVybWl0dGVkIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICAiTm9OZXdQcml2aWxlZ2VzIjogdHJ1ZQogICAgICAgIH0sCiAgICAgICAgIlJvb3QiOiB7CiAgICAgICAgICAiUGF0aCI6ICIkKGNwYXRoKS8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgIlJlYWRvbmx5IjogdHJ1ZQogICAgICAgIH0sCiAgICAgICAgIk1vdW50cyI6IFsKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9wcm9jIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJwcm9jIiwKICAgICAgICAgICAgInR5cGVfIjogInByb2MiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2IiwKICAgICAgICAgICAgInNvdXJjZSI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJzdHJpY3RhdGltZSIsCiAgICAgICAgICAgICAgIm1vZGU9NzU1IiwKICAgICAgICAgICAgICAic2l6ZT02NTUzNmsiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L3B0cyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiZGV2cHRzIiwKICAgICAgICAgICAgInR5cGVfIjogImRldnB0cyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJuZXdpbnN0YW5jZSIsCiAgICAgICAgICAgICAgInB0bXhtb2RlPTA2NjYiLAogICAgICAgICAgICAgICJtb2RlPTA2MjAiLAogICAgICAgICAgICAgICJnaWQ9NSIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvc2htIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L3NobSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi9tcXVldWUiLAogICAgICAgICAgICAic291cmNlIjogIm1xdWV1ZSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJtcXVldWUiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvc3lzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJzeXNmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJzeXNmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2V0Yy9yZXNvbHYuY29uZiIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClyZXNvbHYuY29uZiQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJvIiwKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9kZXYiLAogICAgICAgICAgICAgICJub2V4ZWMiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0KICAgICAgICBdLAogICAgICAgICJBbm5vdGF0aW9ucyI6IHsKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5jb25maWcuYWdlbnQucG9saWN5T3B0aW9uLmV4ZWNDb21tYW5kcyI6ICJXM3NpWTI5dWRHRnBibVZ5VG1GdFpTSTZJbUoxYzNsaWIzZ3lJaXdpWlhobFkwTnZiVzFoYm1SeklqcGJJbVJvSUMxb0lpd2ljSE1nTFdWbUlsMTlMQ0I3SW1OdmJuUmhhVzVsY2s1aGJXVWlPaUppZFhONVltOTRNeUlzSW1WNFpXTkRiMjF0WVc1a2N5STZXeUpzY3lKZGZWMD0iLAogICAgICAgICAgImlvLmthdGFjb250YWluZXJzLnBrZy5vY2kuYnVuZGxlX3BhdGgiOiAiL3J1bi9jb250YWluZXJkL2lvLmNvbnRhaW5lcmQucnVudGltZS52Mi50YXNrL2s4cy5pby8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgImlvLmthdGFjb250YWluZXJzLnBrZy5vY2kuY29udGFpbmVyX3R5cGUiOiAicG9kX3NhbmRib3giLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLmNvbnRhaW5lci10eXBlIjogInNhbmRib3giLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtaWQiOiAiXlthLXowLTldezY0fSQiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbG9nLWRpcmVjdG9yeSI6ICJeL3Zhci9sb2cvcG9kcy8kKHNhbmRib3gtbmFtZXNwYWNlKV8kKHNhbmRib3gtbmFtZSlfWzAtOWEtZl17OH0tWzAtOWEtZl17NH0tWzAtOWEtZl17NH0tWzAtOWEtZl17NH0tWzAtOWEtZl17MTJ9JCIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1uYW1lIjogIl5zYW1lXFwtY29udGFpbmVycyQiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZXNwYWNlIjogIiIsCiAgICAgICAgICAibmVyZGN0bC9uZXR3b3JrLW5hbWVzcGFjZSI6ICJeL3Zhci9ydW4vbmV0bnMvY25pLVswLTlhLWZdezh9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezEyfSQiCiAgICAgICAgfSwKICAgICAgICAiTGludXgiOiB7CiAgICAgICAgICAiTmFtZXNwYWNlcyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICJUeXBlIjogImlwYyIsCiAgICAgICAgICAgICAgIlBhdGgiOiAiIgogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgIlR5cGUiOiAidXRzIiwKICAgICAgICAgICAgICAiUGF0aCI6ICIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiVHlwZSI6ICJtb3VudCIsCiAgICAgICAgICAgICAgIlBhdGgiOiAiIgogICAgICAgICAgICB9CiAgICAgICAgICBdLAogICAgICAgICAgIk1hc2tlZFBhdGhzIjogWwogICAgICAgICAgICAiL3Byb2MvYWNwaSIsCiAgICAgICAgICAgICIvcHJvYy9hc291bmQiLAogICAgICAgICAgICAiL3Byb2Mva2NvcmUiLAogICAgICAgICAgICAiL3Byb2Mva2V5cyIsCiAgICAgICAgICAgICIvcHJvYy9sYXRlbmN5X3N0YXRzIiwKICAgICAgICAgICAgIi9wcm9jL3RpbWVyX2xpc3QiLAogICAgICAgICAgICAiL3Byb2MvdGltZXJfc3RhdHMiLAogICAgICAgICAgICAiL3Byb2Mvc2NoZWRfZGVidWciLAogICAgICAgICAgICAiL3N5cy9maXJtd2FyZSIsCiAgICAgICAgICAgICIvcHJvYy9zY3NpIgogICAgICAgICAgXSwKICAgICAgICAgICJSZWFkb25seVBhdGhzIjogWwogICAgICAgICAgICAiL3Byb2MvYnVzIiwKICAgICAgICAgICAgIi9wcm9jL2ZzIiwKICAgICAgICAgICAgIi9wcm9jL2lycSIsCiAgICAgICAgICAgICIvcHJvYy9zeXMiLAogICAgICAgICAgICAiL3Byb2Mvc3lzcnEtdHJpZ2dlciIKICAgICAgICAgIF0sCiAgICAgICAgICAiRGV2aWNlcyI6IFtdLAogICAgICAgICAgIlN5c2N0bCI6IHsKICAgICAgICAgICAgIm5ldC5pcHY0LmlwX3VucHJpdmlsZWdlZF9wb3J0X3N0YXJ0IjogIjAiLAogICAgICAgICAgICAibmV0LmlwdjQucGluZ19ncm91cF9yYW5nZSI6ICIwIDIxNDc0ODM2NDciCiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9LAogICAgICAic3RvcmFnZXMiOiBbCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJibGsiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogInRhciIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIiQoaGFzaDApIgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGxheWVyMCkiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJvdmVybGF5ZnMiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogImZ1c2UzLmthdGEtb3ZlcmxheSIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIjVhNWFhZDgwMDU1ZmYyMDAxMmE1MGRjMjVmOGRmN2EyOTkyNDQ3NDMyNGQ2NWY3ZDUzMDZlZThlZTI3ZmY3MWQiLAogICAgICAgICAgICAiODE3MjUwZjFhM2UzMzZkYTc2ZjViZDNmYTc4NGUxYjI2ZDk1OWI5YzEzMTg3NjgxNWJhMjYwNDA0OGI3MGMxOCIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChjcGF0aCkvJChidW5kbGUtaWQpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9CiAgICAgIF0sCiAgICAgICJkZXZpY2VzIjogW10sCiAgICAgICJzYW5kYm94X3BpZG5zIjogZmFsc2UsCiAgICAgICJleGVjX2NvbW1hbmRzIjogW10sCiAgICAgICJlbnZfbWFwIjogewogICAgICAgICJQQVRIIjogIi91c3IvbG9jYWwvc2JpbjovdXNyL2xvY2FsL2JpbjovdXNyL3NiaW46L3Vzci9iaW46L3NiaW46L2JpbiIKICAgICAgfQogICAgfSwKICAgIHsKICAgICAgIk9DSSI6IHsKICAgICAgICAiVmVyc2lvbiI6ICIxLjEuMC1yYy4xIiwKICAgICAgICAiUHJvY2VzcyI6IHsKICAgICAgICAgICJUZXJtaW5hbCI6IHRydWUsCiAgICAgICAgICAiVXNlciI6IHsKICAgICAgICAgICAgIlVJRCI6IDAsCiAgICAgICAgICAgICJHSUQiOiAwLAogICAgICAgICAgICAiQWRkaXRpb25hbEdpZHMiOiBbXSwKICAgICAgICAgICAgIlVzZXJuYW1lIjogIiIKICAgICAgICAgIH0sCiAgICAgICAgICAiRGVwcmVjYXRlZEFyZ3MiOiBbCiAgICAgICAgICAgICIvYmluL3NoIiwKICAgICAgICAgICAgIi1jIiwKICAgICAgICAgICAgIndoaWxlIHRydWU7IGRvIGVjaG8gaGVsbG87IHNsZWVwIDEwOyBkb25lIgogICAgICAgICAgXSwKICAgICAgICAgICJBcmdzIjogWwogICAgICAgICAgICAiL2Jpbi9zaCIsCiAgICAgICAgICAgICItYyIsCiAgICAgICAgICAgICJ3aGlsZSB0cnVlOyBkbyBlY2hvIGhlbGxvOyBzbGVlcCAxMDsgZG9uZSIKICAgICAgICAgIF0sCiAgICAgICAgICAiRW52IjogWwogICAgICAgICAgICAiUEFUSD0vdXNyL2xvY2FsL3NiaW46L3Vzci9sb2NhbC9iaW46L3Vzci9zYmluOi91c3IvYmluOi9zYmluOi9iaW4iLAogICAgICAgICAgICAiVEVSTT14dGVybSIsCiAgICAgICAgICAgICJIT1NUTkFNRT0kKGhvc3QtbmFtZSkiLAogICAgICAgICAgICAiUE9EX05BTUU9JChzYW5kYm94LW5hbWUpIiwKICAgICAgICAgICAgIlBPRF9OQU1FU1BBQ0U9JChzYW5kYm94LW5hbWVzcGFjZSkiLAogICAgICAgICAgICAiUE9EX0lQPSQocG9kLWlwKSIKICAgICAgICAgIF0sCiAgICAgICAgICAiQ3dkIjogIi8iLAogICAgICAgICAgIkNhcGFiaWxpdGllcyI6IHsKICAgICAgICAgICAgIkFtYmllbnQiOiBbXSwKICAgICAgICAgICAgIkJvdW5kaW5nIjogWwogICAgICAgICAgICAgICIkKHByaXZpbGVnZWRfY2FwcykiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJFZmZlY3RpdmUiOiBbCiAgICAgICAgICAgICAgIiQocHJpdmlsZWdlZF9jYXBzKSIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgIkluaGVyaXRhYmxlIjogW10sCiAgICAgICAgICAgICJQZXJtaXR0ZWQiOiBbCiAgICAgICAgICAgICAgIiQocHJpdmlsZWdlZF9jYXBzKSIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgICJOb05ld1ByaXZpbGVnZXMiOiBmYWxzZQogICAgICAgIH0sCiAgICAgICAgIlJvb3QiOiB7CiAgICAgICAgICAiUGF0aCI6ICIkKGNwYXRoKS8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgIlJlYWRvbmx5IjogZmFsc2UKICAgICAgICB9LAogICAgICAgICJNb3VudHMiOiBbCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvcHJvYyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAicHJvYyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJwcm9jIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAgICAgIm5vZGV2IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2RldiIsCiAgICAgICAgICAgICJzb3VyY2UiOiAidG1wZnMiLAogICAgICAgICAgICAidHlwZV8iOiAidG1wZnMiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAic3RyaWN0YXRpbWUiLAogICAgICAgICAgICAgICJtb2RlPTc1NSIsCiAgICAgICAgICAgICAgInNpemU9NjU1MzZrIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi9wdHMiLAogICAgICAgICAgICAic291cmNlIjogImRldnB0cyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJkZXZwdHMiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibmV3aW5zdGFuY2UiLAogICAgICAgICAgICAgICJwdG14bW9kZT0wNjY2IiwKICAgICAgICAgICAgICAibW9kZT0wNjIwIiwKICAgICAgICAgICAgICAiZ2lkPTUiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L3NobSIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiL3J1bi9rYXRhLWNvbnRhaW5lcnMvc2FuZGJveC9zaG0iLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvbXF1ZXVlIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJtcXVldWUiLAogICAgICAgICAgICAidHlwZV8iOiAibXF1ZXVlIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAgICAgIm5vZGV2IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL3N5cyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAic3lzZnMiLAogICAgICAgICAgICAidHlwZV8iOiAic3lzZnMiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiLAogICAgICAgICAgICAgICJydyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9zeXMvZnMvY2dyb3VwIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJjZ3JvdXAiLAogICAgICAgICAgICAidHlwZV8iOiAiY2dyb3VwIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAgICAgIm5vZGV2IiwKICAgICAgICAgICAgICAicmVsYXRpbWUiLAogICAgICAgICAgICAgICJydyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9ldGMvaG9zdHMiLAogICAgICAgICAgICAic291cmNlIjogIiQoc2ZwcmVmaXgpaG9zdHMkIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJ3IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi90ZXJtaW5hdGlvbi1sb2ciLAogICAgICAgICAgICAic291cmNlIjogIiQoc2ZwcmVmaXgpdGVybWluYXRpb24tbG9nJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJydyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9ldGMvaG9zdG5hbWUiLAogICAgICAgICAgICAic291cmNlIjogIiQoc2ZwcmVmaXgpaG9zdG5hbWUkIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJ3IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2V0Yy9yZXNvbHYuY29uZiIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClyZXNvbHYuY29uZiQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicnciCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvdmFyL3J1bi9zZWNyZXRzL2t1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQiLAogICAgICAgICAgICAic291cmNlIjogIiQoc2ZwcmVmaXgpc2VydmljZWFjY291bnQkIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL3Zhci9ydW4vc2VjcmV0cy9henVyZS90b2tlbnMiLAogICAgICAgICAgICAic291cmNlIjogIiQoc2ZwcmVmaXgpdG9rZW5zJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJybyIKICAgICAgICAgICAgXQogICAgICAgICAgfQogICAgICAgIF0sCiAgICAgICAgIkFubm90YXRpb25zIjogewogICAgICAgICAgImlvLmthdGFjb250YWluZXJzLmNvbmZpZy5hZ2VudC5wb2xpY3lPcHRpb24uZXhlY0NvbW1hbmRzIjogIlczc2lZMjl1ZEdGcGJtVnlUbUZ0WlNJNkltSjFjM2xpYjNneUlpd2laWGhsWTBOdmJXMWhibVJ6SWpwYkltUm9JQzFvSWl3aWNITWdMV1ZtSWwxOUxDQjdJbU52Ym5SaGFXNWxjazVoYldVaU9pSmlkWE41WW05NE15SXNJbVY0WldORGIyMXRZVzVrY3lJNld5SnNjeUpkZlYwPSIsCiAgICAgICAgICAiaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5idW5kbGVfcGF0aCI6ICIvcnVuL2NvbnRhaW5lcmQvaW8uY29udGFpbmVyZC5ydW50aW1lLnYyLnRhc2svazhzLmlvLyQoYnVuZGxlLWlkKSIsCiAgICAgICAgICAiaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5jb250YWluZXJfdHlwZSI6ICJwb2RfY29udGFpbmVyIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItbmFtZSI6ICJidXN5Ym94MSIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLXR5cGUiOiAiY29udGFpbmVyIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5pbWFnZS1uYW1lIjogIm1jci5taWNyb3NvZnQuY29tL2Frcy9lMmUvbGlicmFyeS1idXN5Ym94Om1hc3Rlci4yMjAzMTQuMS1saW51eC1hbWQ2NCIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCI6ICJeW2EtejAtOV17NjR9JCIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1uYW1lIjogIl5zYW1lXFwtY29udGFpbmVycyQiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZXNwYWNlIjogIiIKICAgICAgICB9LAogICAgICAgICJMaW51eCI6IHsKICAgICAgICAgICJOYW1lc3BhY2VzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgIlR5cGUiOiAiaXBjIiwKICAgICAgICAgICAgICAiUGF0aCI6ICIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiVHlwZSI6ICJ1dHMiLAogICAgICAgICAgICAgICJQYXRoIjogIiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJUeXBlIjogIm1vdW50IiwKICAgICAgICAgICAgICAiUGF0aCI6ICIiCiAgICAgICAgICAgIH0KICAgICAgICAgIF0sCiAgICAgICAgICAiTWFza2VkUGF0aHMiOiBbXSwKICAgICAgICAgICJSZWFkb25seVBhdGhzIjogW10sCiAgICAgICAgICAiRGV2aWNlcyI6IFtdLAogICAgICAgICAgIlN5c2N0bCI6IHsKICAgICAgICAgICAgIm5ldC5pcHY0LmlwX3VucHJpdmlsZWdlZF9wb3J0X3N0YXJ0IjogIjAiLAogICAgICAgICAgICAibmV0LmlwdjQucGluZ19ncm91cF9yYW5nZSI6ICIwIDIxNDc0ODM2NDciCiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9LAogICAgICAic3RvcmFnZXMiOiBbCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJibGsiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogInRhciIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIiQoaGFzaDApIgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGxheWVyMCkiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJibGsiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogInRhciIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIiQoaGFzaDEpIgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGxheWVyMSkiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJvdmVybGF5ZnMiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogImZ1c2UzLmthdGEtb3ZlcmxheSIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIjJjMzQyYTEzN2U2OTNjNzg5OGFlYzM2ZGExMDQ3ZjE5MWRjN2MxNjg3ZTY2MTk4YWRhY2M0MzljZjRhZGYzNzk6MjU3MGUzYTE5ZTFiZjIwZGRkYTQ1NDk4YTk2MjdmNjE1NTVkMmQ2YzAxNDc5YjliNzY0NjBiNjc5YjI3ZDU1MiIsCiAgICAgICAgICAgICI4NTY4YzcwYzBjY2ZlMDA1MTA5MmU4MThkYTc2OTExMWE1OTg4MmNkMTlkZDc5OWQzYmNhNWZmYTgyNzkxMDgwOmI2NDNiNjIxNzc0ODk4MzgzMGIyNmFjMTRhMzVhMzMyMmRkNTI4YzAwOTYzZWFhZGQ5MWVmNTVmNTEzZGM3M2YiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQoY3BhdGgpLyQoYnVuZGxlLWlkKSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfQogICAgICBdLAogICAgICAiZGV2aWNlcyI6IFtdLAogICAgICAic2FuZGJveF9waWRucyI6IGZhbHNlLAogICAgICAiZXhlY19jb21tYW5kcyI6IFtdLAogICAgICAiZW52X21hcCI6IHsKICAgICAgICAiSE9TVE5BTUUiOiAiJChob3N0LW5hbWUpIiwKICAgICAgICAiUEFUSCI6ICIvdXNyL2xvY2FsL3NiaW46L3Vzci9sb2NhbC9iaW46L3Vzci9zYmluOi91c3IvYmluOi9zYmluOi9iaW4iLAogICAgICAgICJQT0RfSVAiOiAiJChwb2QtaXApIiwKICAgICAgICAiUE9EX05BTUUiOiAiJChzYW5kYm94LW5hbWUpIiwKICAgICAgICAiUE9EX05BTUVTUEFDRSI6ICIkKHNhbmRib3gtbmFtZXNwYWNlKSIsCiAgICAgICAgIlRFUk0iOiAieHRlcm0iCiAgICAgIH0KICAgIH0sCiAgICB7CiAgICAgICJPQ0kiOiB7CiAgICAgICAgIlZlcnNpb24iOiAiMS4xLjAtcmMuMSIsCiAgICAgICAgIlByb2Nlc3MiOiB7CiAgICAgICAgICAiVGVybWluYWwiOiBmYWxzZSwKICAgICAgICAgICJVc2VyIjogewogICAgICAgICAgICAiVUlEIjogMCwKICAgICAgICAgICAgIkdJRCI6IDAsCiAgICAgICAgICAgICJBZGRpdGlvbmFsR2lkcyI6IFtdLAogICAgICAgICAgICAiVXNlcm5hbWUiOiAiIgogICAgICAgICAgfSwKICAgICAgICAgICJEZXByZWNhdGVkQXJncyI6IFsKICAgICAgICAgICAgIi9iaW4vc2giLAogICAgICAgICAgICAiLWMiLAogICAgICAgICAgICAid2hpbGUgdHJ1ZTsgZG8gZWNobyBoZWxsbzsgc2xlZXAgMTA7IGRvbmUiCiAgICAgICAgICBdLAogICAgICAgICAgIkFyZ3MiOiBbCiAgICAgICAgICAgICIvYmluL3NoIiwKICAgICAgICAgICAgIi1jIiwKICAgICAgICAgICAgIndoaWxlIHRydWU7IGRvIGVjaG8gaGVsbG87IHNsZWVwIDEwOyBkb25lIgogICAgICAgICAgXSwKICAgICAgICAgICJFbnYiOiBbCiAgICAgICAgICAgICJQQVRIPS91c3IvbG9jYWwvc2JpbjovdXNyL2xvY2FsL2JpbjovdXNyL3NiaW46L3Vzci9iaW46L3NiaW46L2JpbiIsCiAgICAgICAgICAgICJIT1NUTkFNRT0kKGhvc3QtbmFtZSkiLAogICAgICAgICAgICAiUE9EX05BTUU9JChzYW5kYm94LW5hbWUpIiwKICAgICAgICAgICAgIlBPRF9OQU1FU1BBQ0U9JChzYW5kYm94LW5hbWVzcGFjZSkiLAogICAgICAgICAgICAiUE9EX0lQPSQocG9kLWlwKSIKICAgICAgICAgIF0sCiAgICAgICAgICAiQ3dkIjogIi8iLAogICAgICAgICAgIkNhcGFiaWxpdGllcyI6IHsKICAgICAgICAgICAgIkFtYmllbnQiOiBbXSwKICAgICAgICAgICAgIkJvdW5kaW5nIjogWwogICAgICAgICAgICAgICIkKHByaXZpbGVnZWRfY2FwcykiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJFZmZlY3RpdmUiOiBbCiAgICAgICAgICAgICAgIiQocHJpdmlsZWdlZF9jYXBzKSIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgIkluaGVyaXRhYmxlIjogW10sCiAgICAgICAgICAgICJQZXJtaXR0ZWQiOiBbCiAgICAgICAgICAgICAgIiQocHJpdmlsZWdlZF9jYXBzKSIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgICJOb05ld1ByaXZpbGVnZXMiOiBmYWxzZQogICAgICAgIH0sCiAgICAgICAgIlJvb3QiOiB7CiAgICAgICAgICAiUGF0aCI6ICIkKGNwYXRoKS8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgIlJlYWRvbmx5IjogZmFsc2UKICAgICAgICB9LAogICAgICAgICJNb3VudHMiOiBbCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvcHJvYyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAicHJvYyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJwcm9jIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAgICAgIm5vZGV2IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2RldiIsCiAgICAgICAgICAgICJzb3VyY2UiOiAidG1wZnMiLAogICAgICAgICAgICAidHlwZV8iOiAidG1wZnMiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAic3RyaWN0YXRpbWUiLAogICAgICAgICAgICAgICJtb2RlPTc1NSIsCiAgICAgICAgICAgICAgInNpemU9NjU1MzZrIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi9wdHMiLAogICAgICAgICAgICAic291cmNlIjogImRldnB0cyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJkZXZwdHMiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibmV3aW5zdGFuY2UiLAogICAgICAgICAgICAgICJwdG14bW9kZT0wNjY2IiwKICAgICAgICAgICAgICAibW9kZT0wNjIwIiwKICAgICAgICAgICAgICAiZ2lkPTUiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L3NobSIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiL3J1bi9rYXRhLWNvbnRhaW5lcnMvc2FuZGJveC9zaG0iLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvbXF1ZXVlIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJtcXVldWUiLAogICAgICAgICAgICAidHlwZV8iOiAibXF1ZXVlIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAgICAgIm5vZGV2IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL3N5cyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAic3lzZnMiLAogICAgICAgICAgICAidHlwZV8iOiAic3lzZnMiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiLAogICAgICAgICAgICAgICJydyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9zeXMvZnMvY2dyb3VwIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJjZ3JvdXAiLAogICAgICAgICAgICAidHlwZV8iOiAiY2dyb3VwIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAgICAgIm5vZGV2IiwKICAgICAgICAgICAgICAicmVsYXRpbWUiLAogICAgICAgICAgICAgICJydyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9ldGMvaG9zdHMiLAogICAgICAgICAgICAic291cmNlIjogIiQoc2ZwcmVmaXgpaG9zdHMkIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJ3IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi90ZXJtaW5hdGlvbi1sb2ciLAogICAgICAgICAgICAic291cmNlIjogIiQoc2ZwcmVmaXgpdGVybWluYXRpb24tbG9nJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJydyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9ldGMvaG9zdG5hbWUiLAogICAgICAgICAgICAic291cmNlIjogIiQoc2ZwcmVmaXgpaG9zdG5hbWUkIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJ3IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2V0Yy9yZXNvbHYuY29uZiIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClyZXNvbHYuY29uZiQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicnciCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvdmFyL3J1bi9zZWNyZXRzL2t1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQiLAogICAgICAgICAgICAic291cmNlIjogIiQoc2ZwcmVmaXgpc2VydmljZWFjY291bnQkIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL3Zhci9ydW4vc2VjcmV0cy9henVyZS90b2tlbnMiLAogICAgICAgICAgICAic291cmNlIjogIiQoc2ZwcmVmaXgpdG9rZW5zJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJybyIKICAgICAgICAgICAgXQogICAgICAgICAgfQogICAgICAgIF0sCiAgICAgICAgIkFubm90YXRpb25zIjogewogICAgICAgICAgImlvLmthdGFjb250YWluZXJzLmNvbmZpZy5hZ2VudC5wb2xpY3lPcHRpb24uZXhlY0NvbW1hbmRzIjogIlczc2lZMjl1ZEdGcGJtVnlUbUZ0WlNJNkltSjFjM2xpYjNneUlpd2laWGhsWTBOdmJXMWhibVJ6SWpwYkltUm9JQzFvSWl3aWNITWdMV1ZtSWwxOUxDQjdJbU52Ym5SaGFXNWxjazVoYldVaU9pSmlkWE41WW05NE15SXNJbVY0WldORGIyMXRZVzVrY3lJNld5SnNjeUpkZlYwPSIsCiAgICAgICAgICAiaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5idW5kbGVfcGF0aCI6ICIvcnVuL2NvbnRhaW5lcmQvaW8uY29udGFpbmVyZC5ydW50aW1lLnYyLnRhc2svazhzLmlvLyQoYnVuZGxlLWlkKSIsCiAgICAgICAgICAiaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5jb250YWluZXJfdHlwZSI6ICJwb2RfY29udGFpbmVyIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItbmFtZSI6ICJidXN5Ym94MiIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLXR5cGUiOiAiY29udGFpbmVyIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5pbWFnZS1uYW1lIjogIm1jci5taWNyb3NvZnQuY29tL2Frcy9lMmUvbGlicmFyeS1idXN5Ym94Om1hc3Rlci4yMjAzMTQuMS1saW51eC1hbWQ2NCIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCI6ICJeW2EtejAtOV17NjR9JCIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1uYW1lIjogIl5zYW1lXFwtY29udGFpbmVycyQiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZXNwYWNlIjogIiIKICAgICAgICB9LAogICAgICAgICJMaW51eCI6IHsKICAgICAgICAgICJOYW1lc3BhY2VzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgIlR5cGUiOiAiaXBjIiwKICAgICAgICAgICAgICAiUGF0aCI6ICIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiVHlwZSI6ICJ1dHMiLAogICAgICAgICAgICAgICJQYXRoIjogIiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJUeXBlIjogIm1vdW50IiwKICAgICAgICAgICAgICAiUGF0aCI6ICIiCiAgICAgICAgICAgIH0KICAgICAgICAgIF0sCiAgICAgICAgICAiTWFza2VkUGF0aHMiOiBbXSwKICAgICAgICAgICJSZWFkb25seVBhdGhzIjogW10sCiAgICAgICAgICAiRGV2aWNlcyI6IFtdLAogICAgICAgICAgIlN5c2N0bCI6IHsKICAgICAgICAgICAgIm5ldC5pcHY0LmlwX3VucHJpdmlsZWdlZF9wb3J0X3N0YXJ0IjogIjAiLAogICAgICAgICAgICAibmV0LmlwdjQucGluZ19ncm91cF9yYW5nZSI6ICIwIDIxNDc0ODM2NDciCiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9LAogICAgICAic3RvcmFnZXMiOiBbCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJibGsiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogInRhciIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIiQoaGFzaDApIgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGxheWVyMCkiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJibGsiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogInRhciIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIiQoaGFzaDEpIgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGxheWVyMSkiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJvdmVybGF5ZnMiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogImZ1c2UzLmthdGEtb3ZlcmxheSIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIjJjMzQyYTEzN2U2OTNjNzg5OGFlYzM2ZGExMDQ3ZjE5MWRjN2MxNjg3ZTY2MTk4YWRhY2M0MzljZjRhZGYzNzk6MjU3MGUzYTE5ZTFiZjIwZGRkYTQ1NDk4YTk2MjdmNjE1NTVkMmQ2YzAxNDc5YjliNzY0NjBiNjc5YjI3ZDU1MiIsCiAgICAgICAgICAgICI4NTY4YzcwYzBjY2ZlMDA1MTA5MmU4MThkYTc2OTExMWE1OTg4MmNkMTlkZDc5OWQzYmNhNWZmYTgyNzkxMDgwOmI2NDNiNjIxNzc0ODk4MzgzMGIyNmFjMTRhMzVhMzMyMmRkNTI4YzAwOTYzZWFhZGQ5MWVmNTVmNTEzZGM3M2YiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQoY3BhdGgpLyQoYnVuZGxlLWlkKSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfQogICAgICBdLAogICAgICAiZGV2aWNlcyI6IFtdLAogICAgICAic2FuZGJveF9waWRucyI6IGZhbHNlLAogICAgICAiZXhlY19jb21tYW5kcyI6IFtdLAogICAgICAiZW52X21hcCI6IHsKICAgICAgICAiSE9TVE5BTUUiOiAiJChob3N0LW5hbWUpIiwKICAgICAgICAiUEFUSCI6ICIvdXNyL2xvY2FsL3NiaW46L3Vzci9sb2NhbC9iaW46L3Vzci9zYmluOi91c3IvYmluOi9zYmluOi9iaW4iLAogICAgICAgICJQT0RfSVAiOiAiJChwb2QtaXApIiwKICAgICAgICAiUE9EX05BTUUiOiAiJChzYW5kYm94LW5hbWUpIiwKICAgICAgICAiUE9EX05BTUVTUEFDRSI6ICIkKHNhbmRib3gtbmFtZXNwYWNlKSIKICAgICAgfQogICAgfSwKICAgIHsKICAgICAgIk9DSSI6IHsKICAgICAgICAiVmVyc2lvbiI6ICIxLjEuMC1yYy4xIiwKICAgICAgICAiUHJvY2VzcyI6IHsKICAgICAgICAgICJUZXJtaW5hbCI6IGZhbHNlLAogICAgICAgICAgIlVzZXIiOiB7CiAgICAgICAgICAgICJVSUQiOiAwLAogICAgICAgICAgICAiR0lEIjogMCwKICAgICAgICAgICAgIkFkZGl0aW9uYWxHaWRzIjogW10sCiAgICAgICAgICAgICJVc2VybmFtZSI6ICIiCiAgICAgICAgICB9LAogICAgICAgICAgIkRlcHJlY2F0ZWRBcmdzIjogWwogICAgICAgICAgICAiL2Jpbi9zaCIsCiAgICAgICAgICAgICItYyIsCiAgICAgICAgICAgICJ3aGlsZSB0cnVlOyBkbyBlY2hvIGhlbGxvOyBzbGVlcCAxMDsgZG9uZSIKICAgICAgICAgIF0sCiAgICAgICAgICAiQXJncyI6IFsKICAgICAgICAgICAgIi9iaW4vc2giLAogICAgICAgICAgICAiLWMiLAogICAgICAgICAgICAid2hpbGUgdHJ1ZTsgZG8gZWNobyBoZWxsbzsgc2xlZXAgMTA7IGRvbmUiCiAgICAgICAgICBdLAogICAgICAgICAgIkVudiI6IFsKICAgICAgICAgICAgIlBBVEg9L3Vzci9sb2NhbC9zYmluOi91c3IvbG9jYWwvYmluOi91c3Ivc2JpbjovdXNyL2Jpbjovc2JpbjovYmluIiwKICAgICAgICAgICAgIkhPU1ROQU1FPSQoaG9zdC1uYW1lKSIsCiAgICAgICAgICAgICJQT0RfTkFNRT0kKHNhbmRib3gtbmFtZSkiLAogICAgICAgICAgICAiUE9EX05BTUVTUEFDRT0kKHNhbmRib3gtbmFtZXNwYWNlKSIsCiAgICAgICAgICAgICJQT0RfSVA9JChwb2QtaXApIgogICAgICAgICAgXSwKICAgICAgICAgICJDd2QiOiAiLyIsCiAgICAgICAgICAiQ2FwYWJpbGl0aWVzIjogewogICAgICAgICAgICAiQW1iaWVudCI6IFtdLAogICAgICAgICAgICAiQm91bmRpbmciOiBbCiAgICAgICAgICAgICAgIiQocHJpdmlsZWdlZF9jYXBzKSIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgIkVmZmVjdGl2ZSI6IFsKICAgICAgICAgICAgICAiJChwcml2aWxlZ2VkX2NhcHMpIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiSW5oZXJpdGFibGUiOiBbXSwKICAgICAgICAgICAgIlBlcm1pdHRlZCI6IFsKICAgICAgICAgICAgICAiJChwcml2aWxlZ2VkX2NhcHMpIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgIk5vTmV3UHJpdmlsZWdlcyI6IGZhbHNlCiAgICAgICAgfSwKICAgICAgICAiUm9vdCI6IHsKICAgICAgICAgICJQYXRoIjogIiQoY3BhdGgpLyQoYnVuZGxlLWlkKSIsCiAgICAgICAgICAiUmVhZG9ubHkiOiBmYWxzZQogICAgICAgIH0sCiAgICAgICAgIk1vdW50cyI6IFsKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9wcm9jIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJwcm9jIiwKICAgICAgICAgICAgInR5cGVfIjogInByb2MiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2IiwKICAgICAgICAgICAgInNvdXJjZSI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJzdHJpY3RhdGltZSIsCiAgICAgICAgICAgICAgIm1vZGU9NzU1IiwKICAgICAgICAgICAgICAic2l6ZT02NTUzNmsiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L3B0cyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiZGV2cHRzIiwKICAgICAgICAgICAgInR5cGVfIjogImRldnB0cyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJuZXdpbnN0YW5jZSIsCiAgICAgICAgICAgICAgInB0bXhtb2RlPTA2NjYiLAogICAgICAgICAgICAgICJtb2RlPTA2MjAiLAogICAgICAgICAgICAgICJnaWQ9NSIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvc2htIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L3NobSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi9tcXVldWUiLAogICAgICAgICAgICAic291cmNlIjogIm1xdWV1ZSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJtcXVldWUiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvc3lzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJzeXNmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJzeXNmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIsCiAgICAgICAgICAgICAgInJ3IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL3N5cy9mcy9jZ3JvdXAiLAogICAgICAgICAgICAic291cmNlIjogImNncm91cCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJjZ3JvdXAiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiLAogICAgICAgICAgICAgICJyZWxhdGltZSIsCiAgICAgICAgICAgICAgInJ3IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2V0Yy9ob3N0cyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClob3N0cyQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicnciCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L3Rlcm1pbmF0aW9uLWxvZyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeCl0ZXJtaW5hdGlvbi1sb2ckIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJ3IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2V0Yy9ob3N0bmFtZSIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClob3N0bmFtZSQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicnciCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZXRjL3Jlc29sdi5jb25mIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KXJlc29sdi5jb25mJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJydyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi92YXIvcnVuL3NlY3JldHMva3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudCIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClzZXJ2aWNlYWNjb3VudCQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicm8iCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvdmFyL3J1bi9zZWNyZXRzL2F6dXJlL3Rva2VucyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeCl0b2tlbnMkIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9CiAgICAgICAgXSwKICAgICAgICAiQW5ub3RhdGlvbnMiOiB7CiAgICAgICAgICAiaW8ua2F0YWNvbnRhaW5lcnMuY29uZmlnLmFnZW50LnBvbGljeU9wdGlvbi5leGVjQ29tbWFuZHMiOiAiVzNzaVkyOXVkR0ZwYm1WeVRtRnRaU0k2SW1KMWMzbGliM2d5SWl3aVpYaGxZME52YlcxaGJtUnpJanBiSW1Sb0lDMW9JaXdpY0hNZ0xXVm1JbDE5TENCN0ltTnZiblJoYVc1bGNrNWhiV1VpT2lKaWRYTjVZbTk0TXlJc0ltVjRaV05EYjIxdFlXNWtjeUk2V3lKc2N5SmRmVjA9IiwKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmJ1bmRsZV9wYXRoIjogIi9ydW4vY29udGFpbmVyZC9pby5jb250YWluZXJkLnJ1bnRpbWUudjIudGFzay9rOHMuaW8vJChidW5kbGUtaWQpIiwKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIjogInBvZF9jb250YWluZXIiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLmNvbnRhaW5lci1uYW1lIjogImJ1c3lib3gzIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSI6ICJjb250YWluZXIiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLmltYWdlLW5hbWUiOiAibWNyLm1pY3Jvc29mdC5jb20vYWtzL2UyZS9saWJyYXJ5LWJ1c3lib3g6bWFzdGVyLjIyMDMxNC4xLWxpbnV4LWFtZDY0IiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWlkIjogIl5bYS16MC05XXs2NH0kIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LW5hbWUiOiAiXnNhbWVcXC1jb250YWluZXJzJCIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1uYW1lc3BhY2UiOiAiIgogICAgICAgIH0sCiAgICAgICAgIkxpbnV4IjogewogICAgICAgICAgIk5hbWVzcGFjZXMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiVHlwZSI6ICJpcGMiLAogICAgICAgICAgICAgICJQYXRoIjogIiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJUeXBlIjogInV0cyIsCiAgICAgICAgICAgICAgIlBhdGgiOiAiIgogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgIlR5cGUiOiAibW91bnQiLAogICAgICAgICAgICAgICJQYXRoIjogIiIKICAgICAgICAgICAgfQogICAgICAgICAgXSwKICAgICAgICAgICJNYXNrZWRQYXRocyI6IFtdLAogICAgICAgICAgIlJlYWRvbmx5UGF0aHMiOiBbXSwKICAgICAgICAgICJEZXZpY2VzIjogW10sCiAgICAgICAgICAiU3lzY3RsIjogewogICAgICAgICAgICAibmV0LmlwdjQuaXBfdW5wcml2aWxlZ2VkX3BvcnRfc3RhcnQiOiAiMCIsCiAgICAgICAgICAgICJuZXQuaXB2NC5waW5nX2dyb3VwX3JhbmdlIjogIjAgMjE0NzQ4MzY0NyIKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0sCiAgICAgICJzdG9yYWdlcyI6IFsKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoMCkiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXIwKSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoMSkiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXIxKSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogIm92ZXJsYXlmcyIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAiZnVzZTMua2F0YS1vdmVybGF5IiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiMmMzNDJhMTM3ZTY5M2M3ODk4YWVjMzZkYTEwNDdmMTkxZGM3YzE2ODdlNjYxOThhZGFjYzQzOWNmNGFkZjM3OToyNTcwZTNhMTllMWJmMjBkZGRhNDU0OThhOTYyN2Y2MTU1NWQyZDZjMDE0NzliOWI3NjQ2MGI2NzliMjdkNTUyIiwKICAgICAgICAgICAgIjg1NjhjNzBjMGNjZmUwMDUxMDkyZTgxOGRhNzY5MTExYTU5ODgyY2QxOWRkNzk5ZDNiY2E1ZmZhODI3OTEwODA6YjY0M2I2MjE3NzQ4OTgzODMwYjI2YWMxNGEzNWEzMzIyZGQ1MjhjMDA5NjNlYWFkZDkxZWY1NWY1MTNkYzczZiIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChjcGF0aCkvJChidW5kbGUtaWQpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9CiAgICAgIF0sCiAgICAgICJkZXZpY2VzIjogW10sCiAgICAgICJzYW5kYm94X3BpZG5zIjogZmFsc2UsCiAgICAgICJleGVjX2NvbW1hbmRzIjogW10sCiAgICAgICJlbnZfbWFwIjogewogICAgICAgICJIT1NUTkFNRSI6ICIkKGhvc3QtbmFtZSkiLAogICAgICAgICJQQVRIIjogIi91c3IvbG9jYWwvc2JpbjovdXNyL2xvY2FsL2JpbjovdXNyL3NiaW46L3Vzci9iaW46L3NiaW46L2JpbiIsCiAgICAgICAgIlBPRF9JUCI6ICIkKHBvZC1pcCkiLAogICAgICAgICJQT0RfTkFNRSI6ICIkKHNhbmRib3gtbmFtZSkiLAogICAgICAgICJQT0RfTkFNRVNQQUNFIjogIiQoc2FuZGJveC1uYW1lc3BhY2UpIgogICAgICB9CiAgICB9CiAgXSwKICAiY29tbW9uIjogewogICAgImNwYXRoIjogIi9ydW4va2F0YS1jb250YWluZXJzL3NoYXJlZC9jb250YWluZXJzIiwKICAgICJtb3VudF9zb3VyY2VfY3BhdGgiOiAiL3J1bi9rYXRhLWNvbnRhaW5lcnMvc2hhcmVkL2NvbnRhaW5lcnMiLAogICAgInNmcHJlZml4IjogIl4kKGNwYXRoKS8kKGJ1bmRsZS1pZCktW2EtejAtOV17MTZ9LSIsCiAgICAic3BhdGgiOiAiL3J1bi9rYXRhLWNvbnRhaW5lcnMvc2FuZGJveC9zdG9yYWdlIiwKICAgICJpcHY0X2EiOiAiKChbMC05XXxbMS05XVswLTldfDFbMC05XXsyfXwyWzAtNF1bMC05XXwyNVswLTVdKVxcLil7M30oWzAtOV18WzEtOV1bMC05XXwxWzAtOV17Mn18MlswLTRdWzAtOV18MjVbMC01XSkiLAogICAgImlwX3AiOiAiWzAtOV17MSw1fSIsCiAgICAic3ZjX25hbWUiOiAiW0EtWl9cXC5cXC1dKyIsCiAgICAiZG5zX2xhYmVsIjogIlthLXpBLVowLTlfXFwuXFwtXSsiLAogICAgInNfc291cmNlMSI6ICJeLi4yWzAtOV17M31fWzAtMV1bMC05XV9bMC0zXVswLTldX1swLTJdWzAtOV1fWzAtNV1bMC05XV9bMC01XVswLTldXFwuWzAtOV17MSwxMH0kIiwKICAgICJzX3NvdXJjZTIiOiAiXi4uZGF0YS8iLAogICAgImRuc19zdWJkb21haW4iOiAiXlthLXowLTldKFstYS16MC05XSpbYS16MC05XSk/JCIsCiAgICAicG9kX3VpZCI6ICJeWzAtOWEtZkEtRl17OH0tWzAtOWEtZkEtRl17NH0tWzAtOWEtZkEtRl17NH0tWzAtOWEtZkEtRl17NH0tWzAtOWEtZkEtRl17MTJ9JCIsCiAgICAiZGVmYXVsdF9jYXBzIjogWwogICAgICAiQ0FQX0NIT1dOIiwKICAgICAgIkNBUF9EQUNfT1ZFUlJJREUiLAogICAgICAiQ0FQX0ZTRVRJRCIsCiAgICAgICJDQVBfRk9XTkVSIiwKICAgICAgIkNBUF9NS05PRCIsCiAgICAgICJDQVBfTkVUX1JBVyIsCiAgICAgICJDQVBfU0VUR0lEIiwKICAgICAgIkNBUF9TRVRVSUQiLAogICAgICAiQ0FQX1NFVEZDQVAiLAogICAgICAiQ0FQX1NFVFBDQVAiLAogICAgICAiQ0FQX05FVF9CSU5EX1NFUlZJQ0UiLAogICAgICAiQ0FQX1NZU19DSFJPT1QiLAogICAgICAiQ0FQX0tJTEwiLAogICAgICAiQ0FQX0FVRElUX1dSSVRFIgogICAgXSwKICAgICJwcml2aWxlZ2VkX2NhcHMiOiBbCiAgICAgICJDQVBfQ0hPV04iLAogICAgICAiQ0FQX0RBQ19PVkVSUklERSIsCiAgICAgICJDQVBfREFDX1JFQURfU0VBUkNIIiwKICAgICAgIkNBUF9GT1dORVIiLAogICAgICAiQ0FQX0ZTRVRJRCIsCiAgICAgICJDQVBfS0lMTCIsCiAgICAgICJDQVBfU0VUR0lEIiwKICAgICAgIkNBUF9TRVRVSUQiLAogICAgICAiQ0FQX1NFVFBDQVAiLAogICAgICAiQ0FQX0xJTlVYX0lNTVVUQUJMRSIsCiAgICAgICJDQVBfTkVUX0JJTkRfU0VSVklDRSIsCiAgICAgICJDQVBfTkVUX0JST0FEQ0FTVCIsCiAgICAgICJDQVBfTkVUX0FETUlOIiwKICAgICAgIkNBUF9ORVRfUkFXIiwKICAgICAgIkNBUF9JUENfTE9DSyIsCiAgICAgICJDQVBfSVBDX09XTkVSIiwKICAgICAgIkNBUF9TWVNfTU9EVUxFIiwKICAgICAgIkNBUF9TWVNfUkFXSU8iLAogICAgICAiQ0FQX1NZU19DSFJPT1QiLAogICAgICAiQ0FQX1NZU19QVFJBQ0UiLAogICAgICAiQ0FQX1NZU19QQUNDVCIsCiAgICAgICJDQVBfU1lTX0FETUlOIiwKICAgICAgIkNBUF9TWVNfQk9PVCIsCiAgICAgICJDQVBfU1lTX05JQ0UiLAogICAgICAiQ0FQX1NZU19SRVNPVVJDRSIsCiAgICAgICJDQVBfU1lTX1RJTUUiLAogICAgICAiQ0FQX1NZU19UVFlfQ09ORklHIiwKICAgICAgIkNBUF9NS05PRCIsCiAgICAgICJDQVBfTEVBU0UiLAogICAgICAiQ0FQX0FVRElUX1dSSVRFIiwKICAgICAgIkNBUF9BVURJVF9DT05UUk9MIiwKICAgICAgIkNBUF9TRVRGQ0FQIiwKICAgICAgIkNBUF9NQUNfT1ZFUlJJREUiLAogICAgICAiQ0FQX01BQ19BRE1JTiIsCiAgICAgICJDQVBfU1lTTE9HIiwKICAgICAgIkNBUF9XQUtFX0FMQVJNIiwKICAgICAgIkNBUF9CTE9DS19TVVNQRU5EIiwKICAgICAgIkNBUF9BVURJVF9SRUFEIiwKICAgICAgIkNBUF9QRVJGTU9OIiwKICAgICAgIkNBUF9CUEYiLAogICAgICAiQ0FQX0NIRUNLUE9JTlRfUkVTVE9SRSIKICAgIF0sCiAgICAidmlydGlvX2Jsa19zdG9yYWdlX2NsYXNzZXMiOiBbCiAgICAgICJjYy1sb2NhbC1jc2kiLAogICAgICAiY2MtbWFuYWdlZC1jc2kiLAogICAgICAiY2MtbWFuYWdlZC1wcmVtaXVtLWNzaSIKICAgIF0sCiAgICAic21iX3N0b3JhZ2VfY2xhc3NlcyI6IFsKICAgICAgewogICAgICAgICJuYW1lIjogImF6dXJlZmlsZS1jc2kta2F0YS1jYyIsCiAgICAgICAgIm1vdW50X29wdGlvbnMiOiBbCiAgICAgICAgICAiZGlyX21vZGU9MDc3NyIsCiAgICAgICAgICAiZmlsZV9tb2RlPTA3NzciLAogICAgICAgICAgIm1mc3ltbGlua3MiLAogICAgICAgICAgImNhY2hlPXN0cmljdCIsCiAgICAgICAgICAibm9zaGFyZXNvY2siLAogICAgICAgICAgImFjdGltZW89MzAiLAogICAgICAgICAgIm5vYnJsIgogICAgICAgIF0KICAgICAgfQogICAgXQogIH0sCiAgInNhbmRib3giOiB7CiAgICAic3RvcmFnZXMiOiBbCiAgICAgIHsKICAgICAgICAiZHJpdmVyIjogImVwaGVtZXJhbCIsCiAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgInNvdXJjZSI6ICJzaG0iLAogICAgICAgICJmc3R5cGUiOiAidG1wZnMiLAogICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICJub2RldiIsCiAgICAgICAgICAibW9kZT0xNzc3IiwKICAgICAgICAgICJzaXplPTY3MTA4ODY0IgogICAgICAgIF0sCiAgICAgICAgIm1vdW50X3BvaW50IjogIi9ydW4va2F0YS1jb250YWluZXJzL3NhbmRib3gvc2htIiwKICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgIH0KICAgIF0KICB9LAogICJyZXF1ZXN0X2RlZmF1bHRzIjogewogICAgIkNyZWF0ZUNvbnRhaW5lclJlcXVlc3QiOiB7CiAgICAgICJhbGxvd19lbnZfcmVnZXgiOiBbCiAgICAgICAgIl5IT1NUTkFNRT0kKGRuc19sYWJlbCkkIiwKICAgICAgICAiXiQoc3ZjX25hbWUpX1BPUlRfJChpcF9wKV9UQ1A9dGNwOi8vJChpcHY0X2EpOiQoaXBfcCkkIiwKICAgICAgICAiXiQoc3ZjX25hbWUpX1BPUlRfJChpcF9wKV9UQ1BfUFJPVE89dGNwJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9QT1JUXyQoaXBfcClfVENQX1BPUlQ9JChpcF9wKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfUE9SVF8kKGlwX3ApX1RDUF9BRERSPSQoaXB2NF9hKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfU0VSVklDRV9IT1NUPSQoaXB2NF9hKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfU0VSVklDRV9QT1JUPSQoaXBfcCkkIiwKICAgICAgICAiXiQoc3ZjX25hbWUpX1NFUlZJQ0VfUE9SVF8kKGRuc19sYWJlbCk9JChpcF9wKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfUE9SVD10Y3A6Ly8kKGlwdjRfYSk6JChpcF9wKSQiLAogICAgICAgICJeQVpVUkVfQ0xJRU5UX0lEPVtBLUZhLWYwLTktXSokIiwKICAgICAgICAiXkFaVVJFX1RFTkFOVF9JRD1bQS1GYS1mMC05LV0qJCIsCiAgICAgICAgIl5BWlVSRV9GRURFUkFURURfVE9LRU5fRklMRT0vdmFyL3J1bi9zZWNyZXRzL2F6dXJlL3Rva2Vucy9henVyZS1pZGVudGl0eS10b2tlbiQiLAogICAgICAgICJeQVpVUkVfQVVUSE9SSVRZX0hPU1Q9aHR0cHM6Ly9sb2dpblxcLm1pY3Jvc29mdG9ubGluZVxcLmNvbS8kIiwKICAgICAgICAiXlRFUk09eHRlcm0kIgogICAgICBdLAogICAgICAiYWxsb3dfZW52X3JlZ2V4X21hcCI6IHsKICAgICAgICAiQ1BVX0xJTUlUIjogIl5bMC05XSskIiwKICAgICAgICAiSk9CX0NPTVBMRVRJT05fSU5ERVgiOiAiXlswLTldKiQiLAogICAgICAgICJNRU1PUllfTElNSVQiOiAiXlswLTldKyQiCiAgICAgIH0KICAgIH0sCiAgICAiQ29weUZpbGVSZXF1ZXN0IjogWwogICAgICAiJChzZnByZWZpeCkiCiAgICBdLAogICAgIkV4ZWNQcm9jZXNzUmVxdWVzdCI6IHsKICAgICAgImFsbG93ZWRfY29tbWFuZHMiOiBbXSwKICAgICAgInJlZ2V4IjogW10KICAgIH0sCiAgICAiVXBkYXRlUm91dGVzUmVxdWVzdCI6IHsKICAgICAgImZvcmJpZGRlbl9kZXZpY2VfbmFtZXMiOiBbCiAgICAgICAgImxvIgogICAgICBdLAogICAgICAiZm9yYmlkZGVuX3NvdXJjZV9yZWdleCI6IFsKICAgICAgICAiXig/OjB7MCw0fTopezAsN30wezAsM30xJCIsCiAgICAgICAgIl4xMjdcXC4oPzpbMC05XXsxLDN9XFwuKXsyfVswLTldezEsM30kIgogICAgICBdCiAgICB9LAogICAgIlVwZGF0ZUludGVyZmFjZVJlcXVlc3QiOiB7CiAgICAgICJhbGxvd19yYXdfZmxhZ3MiOiAxMjgsCiAgICAgICJmb3JiaWRkZW5fbmFtZXMiOiBbCiAgICAgICAgImxvIgogICAgICBdLAogICAgICAiZm9yYmlkZGVuX2h3X2FkZHJzIjogWwogICAgICAgICIwMDowMDowMDowMDowMDowMCIKICAgICAgXQogICAgfSwKICAgICJDbG9zZVN0ZGluUmVxdWVzdCI6IGZhbHNlLAogICAgIlJlYWRTdHJlYW1SZXF1ZXN0IjogZmFsc2UsCiAgICAiVXBkYXRlRXBoZW1lcmFsTW91bnRzUmVxdWVzdCI6IGZhbHNlLAogICAgIldyaXRlU3RyZWFtUmVxdWVzdCI6IGZhbHNlCiAgfQp9 +spec: + restartPolicy: Never + runtimeClassName: kata-cc + containers: + - name: busybox1 + image: "mcr.microsoft.com/aks/e2e/library-busybox:master.220314.1-linux-amd64" + env: + - name: POD_NAME + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: metadata.name + - name: POD_NAMESPACE + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: metadata.namespace + - name: POD_IP + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: status.podIP + securityContext: + privileged: true + command: + - /bin/sh + args: + - "-c" + - while true; do echo hello; sleep 10; done + stdin: true + tty: true + - name: busybox2 + image: "mcr.microsoft.com/aks/e2e/library-busybox:master.220314.1-linux-amd64" + env: + - name: POD_NAME + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: metadata.name + - name: POD_NAMESPACE + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: metadata.namespace + - name: POD_IP + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: status.podIP + securityContext: + privileged: true + command: + - /bin/sh + args: + - "-c" + - while true; do echo hello; sleep 10; done + - name: busybox3 + image: "mcr.microsoft.com/aks/e2e/library-busybox:master.220314.1-linux-amd64" + env: + - name: POD_NAME + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: metadata.name + - name: POD_NAMESPACE + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: metadata.namespace + - name: POD_IP + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: status.podIP + securityContext: + privileged: true + command: + - /bin/sh + args: + - "-c" + - while true; do echo hello; sleep 10; done diff --git a/src/agent/samples/policy/yaml/pod/pod-spark.yaml b/src/agent/samples/policy/yaml/pod/pod-spark.yaml new file mode 100644 index 000000000000..32d606091f9d --- /dev/null +++ b/src/agent/samples/policy/yaml/pod/pod-spark.yaml @@ -0,0 +1,25 @@ +--- +apiVersion: v1 +kind: Pod +metadata: + name: spark + annotations: + io.katacontainers.config.agent.policy: IyBDb3B5cmlnaHQgKGMpIDIwMjMgTWljcm9zb2Z0IENvcnBvcmF0aW9uCiMKIyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMAojCnBhY2thZ2UgYWdlbnRfcG9saWN5CgppbXBvcnQgZnV0dXJlLmtleXdvcmRzLmluCmltcG9ydCBmdXR1cmUua2V5d29yZHMuZXZlcnkKCiMgRGVmYXVsdCB2YWx1ZXMsIHJldHVybmVkIGJ5IE9QQSB3aGVuIHJ1bGVzIGNhbm5vdCBiZSBldmFsdWF0ZWQgdG8gdHJ1ZS4KZGVmYXVsdCBBZGRBUlBOZWlnaGJvcnNSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgQWRkU3dhcFJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBDbG9zZVN0ZGluUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IENvcHlGaWxlUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IENyZWF0ZUNvbnRhaW5lclJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBDcmVhdGVTYW5kYm94UmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IERlc3Ryb3lTYW5kYm94UmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgRXhlY1Byb2Nlc3NSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgR2V0T09NRXZlbnRSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBHdWVzdERldGFpbHNSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBMaXN0SW50ZXJmYWNlc1JlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBMaXN0Um91dGVzUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IE1lbUhvdHBsdWdCeVByb2JlUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IE9ubGluZUNQVU1lbVJlcXVlc3QgOj0gdHJ1ZQpkZWZhdWx0IFBhdXNlQ29udGFpbmVyUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFJlYWRTdHJlYW1SZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgUmVtb3ZlQ29udGFpbmVyUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgUmVtb3ZlU3RhbGVWaXJ0aW9mc1NoYXJlTW91bnRzUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgUmVzZWVkUmFuZG9tRGV2UmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFJlc3VtZUNvbnRhaW5lclJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBTZXRHdWVzdERhdGVUaW1lUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFNldFBvbGljeVJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBTaWduYWxQcm9jZXNzUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgU3RhcnRDb250YWluZXJSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBTdGFydFRyYWNpbmdSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgU3RhdHNDb250YWluZXJSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBTdG9wVHJhY2luZ1JlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBUdHlXaW5SZXNpemVSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBVcGRhdGVDb250YWluZXJSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgVXBkYXRlRXBoZW1lcmFsTW91bnRzUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFVwZGF0ZUludGVyZmFjZVJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBVcGRhdGVSb3V0ZXNSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgV2FpdFByb2Nlc3NSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBXcml0ZVN0cmVhbVJlcXVlc3QgOj0gZmFsc2UKCiMgQWxsb3dSZXF1ZXN0c0ZhaWxpbmdQb2xpY3kgOj0gdHJ1ZSBjb25maWd1cmVzIHRoZSBBZ2VudCB0byAqYWxsb3cgYW55CiMgcmVxdWVzdHMgY2F1c2luZyBhIHBvbGljeSBmYWlsdXJlKi4gVGhpcyBpcyBhbiB1bnNlY3VyZSBjb25maWd1cmF0aW9uCiMgYnV0IGlzIHVzZWZ1bCBmb3IgYWxsb3dpbmcgdW5zZWN1cmUgcG9kcyB0byBzdGFydCwgdGhlbiBjb25uZWN0IHRvCiMgdGhlbSBhbmQgaW5zcGVjdCBPUEEgbG9ncyBmb3IgdGhlIHJvb3QgY2F1c2Ugb2YgYSBmYWlsdXJlLgpkZWZhdWx0IEFsbG93UmVxdWVzdHNGYWlsaW5nUG9saWN5IDo9IGZhbHNlCgojIENvbnN0YW50cwpTX05BTUVfS0VZID0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZSIKU19OQU1FU1BBQ0VfS0VZID0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZXNwYWNlIgpCVU5ETEVfSUQgPSAiW2EtejAtOV17NjR9IgoKQ3JlYXRlQ29udGFpbmVyUmVxdWVzdDo9IHJlc3AgewogICAgbm90IGlzX251bGwoaW5wdXQuZW52X21hcCkKICAgIAogICAgaV9lbnZfbWFwIDo9IGlucHV0LmVudl9tYXAKICAgIAogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBwX2Vudl9tYXAgOj0gcF9jb250YWluZXIuZW52X21hcCAgCiAgICBhbGxvd19lbnZfbWFwKHBfZW52X21hcCwgaV9lbnZfbWFwKQogICAgCiAgICBpX3Byb2Nlc3MgOj0gaW5wdXQuYmFzZS5PQ0kuUHJvY2VzcwogICAgCiAgICBwX3Byb2Nlc3MgOj0gcF9jb250YWluZXIuT0NJLlByb2Nlc3MKICAgIAogICAgYWxsb3dfYXJncyhpX3Byb2Nlc3MsIHBfcHJvY2VzcywgaV9lbnZfbWFwKQoKICAgIHJlc3AgPSBDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uKGlucHV0LmJhc2UpCiAgICBwcmludCgiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdDogdHJ1ZSIpCn0KCmFsbG93X2FyZ3MoaV9wcm9jZXNzLCBwX3Byb2Nlc3MsIGlfZW52X21hcCkgewogICAgaV9hcmdzIDo9IGlfcHJvY2Vzcy5BcmdzCiAgICBwX2FyZ3MgOj0gcF9wcm9jZXNzLkFyZ3MKICAgIHByaW50KCJhbGxvd19hcmdzOiBpX2FyZ3MgPSIsIGlfYXJncywgInBfYXJncyA9IiwgcF9hcmdzKQogICAgY291bnQoaV9hcmdzKSA9PSBjb3VudChwX2FyZ3MpCiAgICBldmVyeSBpLCBpX2FyZyBpbiBpX2FyZ3MgewogICAgICAgIHByaW50KCJhbGxvd19hcmdzOiBpX2FyZyA9IiwgaV9hcmcpCiAgICAgICAgcF9hcmdfcmVwbGFjZWQgOj0gcmVwbGFjZV9lbnZfdmFyaWFibGVzKHBfYXJnc1tpXSwgaV9lbnZfbWFwKQogICAgICAgIHByaW50KCJhbGxvd19hcmdzOiBwX2FyZ19yZXBsYWNlZCA9IiwgcF9hcmdfcmVwbGFjZWQpCiAgICAgICAgcF9hcmdfcmVwbGFjZWQyIDo9IHJlcGxhY2UocF9hcmdfcmVwbGFjZWQsICIkJCIsICIkIikKICAgICAgICBwcmludCgiYWxsb3dfYXJnczogcF9hcmdfcmVwbGFjZWQyID0iLCBwX2FyZ19yZXBsYWNlZDIpCiAgICAgICAgaV9hcmcgPT0gcF9hcmdfcmVwbGFjZWQyCiAgICB9CiAgICBwcmludCgiYWxsb3dfYXJnczogdHJ1ZSIpCn0KCmFsbG93X2FyZ3MoaV9wcm9jZXNzLCBwX3Byb2Nlc3MsIGlfZW52X21hcCkgewogICAgbm90IGlfcHJvY2Vzcy5BcmdzCiAgICBub3QgcF9wcm9jZXNzLkFyZ3MKICAgIHByaW50KCJhbGxvd19hcmdzMjogbm8gYXJncyIpCn0KCiMgdGhpcyBmdW5jdGlvbiByZXBsYWNlcyBhbGwgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyBpbiBhIHN0cmluZywgZ2l2ZW4gYSBtYXAgb2YgZW52aXJvbm1lbnQga2V5cyB0byBlbnZpcm9ubWVudCB2YWx1ZXMKIyBlZyBzdHIgPSAiZWNobyAkKENMVVNURVJfSUQpOyBlY2hvICQoTk9ERV9OQU1FKTsiCiMgZW52X21hcCA9IHsiQ0xVU1RFUl9JRCI6ICJhYmMiLCAiTk9ERV9OQU1FIiA6ICJ4eXoifQojIHJlc3VsdCA9ICJlY2hvIGFiYzsgZWNobyB4eXo7IgpyZXBsYWNlX2Vudl92YXJpYWJsZXMoc3RyLCBlbnZfbWFwKSA9IHJlc3VsdCB7CiAgICAjIG1ha2UgYW4gYXJyYXkgb2YgdGhlIGtleXMgZWcgWyJDTFVTVEVSX0lEIiwgIk5PREVfTkFNRSJdCiAgICBrZXlzIDo9IFt4IHwgc29tZSB4IGluIG9iamVjdC5rZXlzKGVudl9tYXApXQogICAgcmVzdWx0IDo9IHJlcGxhY2Vfc3RyX3JlYyhzdHIsIGVudl9tYXAsIGtleXMsIGNvdW50KGtleXMpIC0gMSkKfQoKIyBiYXNlIGNhc2UKcmVwbGFjZV9zdHJfcmVjKHN0ciwgZW52X21hcCwgYXJyX2tleXMsIGkpID0gcmVzdWx0IHsKICAgIGkgPCAwCiAgICByZXN1bHQgOj0gc3RyCn0KCiMgcmVjdXJzaXZlIHN0ZXAKcmVwbGFjZV9zdHJfcmVjKHN0ciwgZW52X21hcCwgYXJyX2tleXMsIGkpID0gcmVzdWx0IHsKICAgIGkgPj0gMAogICAga2V5IDo9IGFycl9rZXlzW2ldCiAgICBlbnZfa2V5MSA6PSBjb25jYXQoIiIsIFsiJCgiLCBrZXksICIpIl0pCiAgICAjIHJlcGxhY2UgJChWQVIpIHdpdGggdmFsdWUKICAgIG5ld19zdHIxIDo9IHJlcGxhY2Uoc3RyLCBlbnZfa2V5MSwgZW52X21hcFtrZXldKQogICAgIyByZXBsYWNlIG5leHQgZW52aXJvbm1lbnQgdmFyaWFibGUKICAgIHJlc3VsdCA9IHJlcGxhY2Vfc3RyX3JlYyhuZXdfc3RyMSwgZW52X21hcCwgYXJyX2tleXMsIGkgLSAxKQp9CgphbGxvd19lbnZfbWFwKHBfZW52X21hcCwgaV9lbnZfbWFwKSB7CiAgICBwcmludCgiYWxsb3dfZW52X21hcDogcF9lbnZfbWFwID0iLCBwX2Vudl9tYXApCiAgICBldmVyeSBlbnZfa2V5LCBlbnZfdmFsIGluIGlfZW52X21hcCB7CiAgICAgICAgcHJpbnQoImFsbG93X2VudjogZW52X2tleSA9IiwgZW52X2tleSwgImVudl92YWwgPSIsIGVudl92YWwpCiAgICAgICAgYWxsb3dfZW52X21hcF9lbnRyeShlbnZfa2V5LCBlbnZfdmFsLCBwX2Vudl9tYXApCiAgICB9CiAgICBwcmludCgiYWxsb3dfZW52X21hcDogdHJ1ZSIpCn0KCiMgQWxsb3cgZXhhY3QgbWF0Y2gKYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBpX3ZhbCA9PSBwX3ZhbAogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnk6IHRydWUiKQp9CgojIEFsbG93IHJlc291cmNlRmllbGRSZWYgdmFsdWVzIChlLmcuLCAibGltaXRzLmNwdSIpLgphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgICMgYSB2YXJpYWJsZSB3ZSBzaG91bGQgYmUgdmFsaWRhdGluZyB1c2luZyBhIHJlZ2V4IGZyb20gc2V0dGluZ3MKICAgIHBfdmFsID09ICIkKHZhbGlkYXRlLWZyb20tc2V0dGluZ3MpIgogICAgcmVnZXhfdmFsIDo9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuQ3JlYXRlQ29udGFpbmVyUmVxdWVzdC5hbGxvd19lbnZfcmVnZXhfbWFwW2tleV0KICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4X3ZhbCwgaV92YWwpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSAyOiB0cnVlIikKfQoKIyBBbGxvdyBub2RlLW5hbWUKYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChub2RlLW5hbWUpIgogICAgcmVnZXgubWF0Y2gocG9saWN5X2RhdGEuY29tbW9uLmRuc19zdWJkb21haW4gLCBpX3ZhbCkKICAgIHByaW50KCJhbGxvd19lbnZfbWFwX2VudHJ5IDM6IHRydWUiKQp9CgojIEFsbG93IGhvc3QtbmFtZQphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgIHBfdmFsID09ICIkKGhvc3QtbmFtZSkiCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24uZG5zX2xhYmVsICwgaV92YWwpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSA0OiB0cnVlIikKfQoKIyBBbGxvdyBwb2QtdWlkCmFsbG93X2Vudl9tYXBfZW50cnkoa2V5LCBpX3ZhbCwgcF9lbnZfbWFwKSB7CiAgICBwX3ZhbCA6PSBwX2Vudl9tYXBba2V5XQogICAgcF92YWwgPT0gIiQocG9kLXVpZCkiCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24ucG9kX3VpZCAsIGlfdmFsKQogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgNTogdHJ1ZSIpCn0KCiMgQWxsb3cgZmllbGRSZWYgImZpZWxkUGF0aDogc3RhdHVzLnBvZElQIiB2YWx1ZXMuCmFsbG93X2Vudl9tYXBfZW50cnkoa2V5LCBpX3ZhbCwgcF9lbnZfbWFwKSB7CiAgICBpc19pcChpX3ZhbCkKCiAgICBwX3ZhbCA6PSBwX2Vudl9tYXBba2V5XQogICAgcF92YXIgOj0gY29uY2F0KCI9IiwgW2tleSwgcF92YWxdKQogICAgYWxsb3dfcG9kX2lwX3ZhcihrZXksIHBfdmFyKQogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgNjogdHJ1ZSIpCn0KCiMgQWxsb3cgZmllbGRSZWYgImZpZWxkUGF0aDogc3RhdHVzLmhvc3RJUCIgdmFsdWVzLgphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgaXNfaXAoaV92YWwpCgogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgIHBfdmFyIDo9IGNvbmNhdCgiPSIsIFtrZXksIHBfdmFsXSkKICAgIGFsbG93X2hvc3RfaXBfdmFyKGtleSwgcF92YXIpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSA3OiB0cnVlIikKfQoKIyBNYXRjaCBpbnB1dCB3aXRoIG9uZSBvZiB0aGUgcG9saWN5IHZhcmlhYmxlcywgYWZ0ZXIgc3Vic3RpdHV0aW5nICQoc2FuZGJveC1uYW1lKS4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChzYW5kYm94LW5hbWUpIgogICAgc19uYW1lIDo9IGlucHV0LmJhc2UuT0NJLkFubm90YXRpb25zW1NfTkFNRV9LRVldCiAgICBwX3ZhcjIgOj0gcmVwbGFjZShwX3ZhbCwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHBfdmFyMiA9PSBpX3ZhbAogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgODogdHJ1ZSIpCn0KCiMgTWF0Y2ggaW5wdXQgd2l0aCBvbmUgb2YgdGhlIHBvbGljeSB2YXJpYWJsZXMsIGFmdGVyIHN1YnN0aXR1dGluZyAkKHNhbmRib3gtbmFtZXNwYWNlKS4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChzYW5kYm94LW5hbWVzcGFjZSkiCiAgICBzX25hbWVzcGFjZSA6PSBpbnB1dC5iYXNlLk9DSS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwX3ZhcjIgOj0gcmVwbGFjZShwX3ZhbCwgIiQoc2FuZGJveC1uYW1lc3BhY2UpIiwgc19uYW1lc3BhY2UpCiAgICBwX3ZhcjIgPT0gaV92YWwKICAgIHByaW50KCJhbGxvd19lbnZfbWFwX2VudHJ5IDk6IHRydWUiKQp9CgojIEFsbG93IGlucHV0IGVudiB2YXJpYWJsZXMgdGhhdCBtYXRjaCB3aXRoIGEgcmVxdWVzdF9kZWZhdWx0cyByZWdleC4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHNvbWUgcF9yZWdleDEgaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5DcmVhdGVDb250YWluZXJSZXF1ZXN0LmFsbG93X2Vudl9yZWdleAogICAgcF9yZWdleDIgOj0gcmVwbGFjZShwX3JlZ2V4MSwgIiQoaXB2NF9hKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcHY0X2EpCiAgICBwX3JlZ2V4MyA6PSByZXBsYWNlKHBfcmVnZXgyLCAiJChpcF9wKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcF9wKQogICAgcF9yZWdleDQgOj0gcmVwbGFjZShwX3JlZ2V4MywgIiQoc3ZjX25hbWUpIiwgcG9saWN5X2RhdGEuY29tbW9uLnN2Y19uYW1lKQogICAgcF9yZWdleDUgOj0gcmVwbGFjZShwX3JlZ2V4NCwgIiQoZG5zX2xhYmVsKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5kbnNfbGFiZWwpCgogICAgcmVzdWx0IDo9IGNvbmNhdCgiPSIsIFtrZXksIGlfdmFsXSkKICAgIHJlZ2V4Lm1hdGNoKHBfcmVnZXg1LCByZXN1bHQpCgogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgMTA6IHRydWUiKQp9CgpDcmVhdGVDb250YWluZXJSZXF1ZXN0Oj0gcmVzcCB7CiAgICBub3QgaW5wdXQuZW52X21hcAogICAgaV9wcm9jZXNzID0gaW5wdXQuT0NJLlByb2Nlc3MKICAgIHNfbmFtZSA9IGlucHV0Lk9DSS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBwX3Byb2Nlc3MgPSBwX2NvbnRhaW5lci5PQ0kuUHJvY2VzcwogICAgYWxsb3dfZGVwcmVjYXRlZF9hcmdzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUpCiAgICByZXNwID0gQ3JlYXRlQ29udGFpbmVyUmVxdWVzdENvbW1vbihpbnB1dCkKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0MjogdHJ1ZSIpCn0KCkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb24ocmVxKTo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgICMgQ2hlY2sgaWYgdGhlIGlucHV0IHJlcXVlc3Qgc2hvdWxkIGJlIHJlamVjdGVkIGV2ZW4gYmVmb3JlIGNoZWNraW5nIHRoZQogICAgIyBwb2xpY3lfZGF0YS5jb250YWluZXJzIGluZm9ybWF0aW9uLgogICAgYWxsb3dfY3JlYXRlX2NvbnRhaW5lcl9pbnB1dChyZXEpCgogICAgaV9vY2kgOj0gcmVxLk9DSQogICAgaV9zdG9yYWdlcyA6PSByZXEuc3RvcmFnZXMKICAgIGlfZGV2aWNlcyA6PSByZXEuZGV2aWNlcwoKICAgICMgYXJyYXkgb2YgcG9zc2libGUgc3RhdGUgb3BlcmF0aW9ucwogICAgb3BzX2J1aWxkZXIgOj0gW10KCiAgICAjIGNoZWNrIHNhbmRib3ggbmFtZQogICAgc2FuZGJveF9uYW1lID0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FX0tFWV0KICAgIGFkZF9zYW5kYm94X25hbWVfdG9fc3RhdGUgOj0gc3RhdGVfYWxsb3dzKCJzYW5kYm94X25hbWUiLCBzYW5kYm94X25hbWUpCiAgICBvcHNfYnVpbGRlcjEgOj0gY29uY2F0X29wX2lmX25vdF9udWxsKG9wc19idWlsZGVyLCBhZGRfc2FuZGJveF9uYW1lX3RvX3N0YXRlKQoKICAgICMgQ2hlY2sgaWYgYW55IGVsZW1lbnQgZnJvbSB0aGUgcG9saWN5X2RhdGEuY29udGFpbmVycyBhcnJheSBhbGxvd3MgdGhlIGlucHV0IHJlcXVlc3QuCiAgICBzb21lIHBfY29udGFpbmVyIGluIHBvbGljeV9kYXRhLmNvbnRhaW5lcnMKICAgIHByaW50KCI9PT09PT09PSBDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiB0cnlpbmcgbmV4dCBwb2xpY3kgY29udGFpbmVyIikKCiAgICBwX3BpZG5zIDo9IHBfY29udGFpbmVyLnNhbmRib3hfcGlkbnMKICAgIGlfcGlkbnMgOj0gcmVxLnNhbmRib3hfcGlkbnMKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiBwX3BpZG5zID0iLCBwX3BpZG5zLCAiaV9waWRucyA9IiwgaV9waWRucykKICAgIHBfcGlkbnMgPT0gaV9waWRucwoKICAgIHBfb2NpIDo9IHBfY29udGFpbmVyLk9DSQoKICAgICMgY2hlY2sgbmFtZXNwYWNlCiAgICBwX25hbWVzcGFjZSA6PSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBpX25hbWVzcGFjZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwcmludCAoIkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb246IHBfbmFtZXNwYWNlID0iLCBwX25hbWVzcGFjZSwgImlfbmFtZXNwYWNlID0iLCBpX25hbWVzcGFjZSkKICAgIGFkZF9uYW1lc3BhY2VfdG9fc3RhdGUgOj0gYWxsb3dfbmFtZXNwYWNlKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkKICAgIG9wc19idWlsZGVyMiA6PSBjb25jYXRfb3BfaWZfbm90X251bGwob3BzX2J1aWxkZXIxLCBhZGRfbmFtZXNwYWNlX3RvX3N0YXRlKQoKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiBwIFZlcnNpb24gPSIsIHBfb2NpLlZlcnNpb24sICJpIFZlcnNpb24gPSIsIGlfb2NpLlZlcnNpb24pCiAgICBwX29jaS5WZXJzaW9uID09IGlfb2NpLlZlcnNpb24KCiAgICBwcmludCgiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdENvbW1vbjogcCBSZWFkb25seSA9IiwgcF9vY2kuUm9vdC5SZWFkb25seSwgImkgUmVhZG9ubHkgPSIsIGlfb2NpLlJvb3QuUmVhZG9ubHkpCiAgICBwX29jaS5Sb290LlJlYWRvbmx5ID09IGlfb2NpLlJvb3QuUmVhZG9ubHkKCiAgICBhbGxvd19hbm5vKHBfb2NpLCBpX29jaSkKCiAgICBwX3N0b3JhZ2VzIDo9IHBfY29udGFpbmVyLnN0b3JhZ2VzCiAgICBhbGxvd19ieV9hbm5vKHBfb2NpLCBpX29jaSwgcF9zdG9yYWdlcywgaV9zdG9yYWdlcykKCiAgICBwX2RldmljZXMgOj0gcF9jb250YWluZXIuZGV2aWNlcwogICAgYWxsb3dfZGV2aWNlcyhwX2RldmljZXMsIGlfZGV2aWNlcykKCiAgICByZXQgOj0gYWxsb3dfbGludXgob3BzX2J1aWxkZXIyLCBwX29jaSwgaV9vY2kpCiAgICByZXQuYWxsb3dlZAoKICAgIG9wcyA6PSByZXQub3BzCgogICAgcHJpbnQoIkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb246IHRydWUiKQp9CgphbGxvd19jcmVhdGVfY29udGFpbmVyX2lucHV0KHJlcSkgewogICAgcHJpbnQoImFsbG93X2NyZWF0ZV9jb250YWluZXJfaW5wdXQ6IGlucHV0ID0iLCByZXEpCgogICAgY291bnQocmVxLnNoYXJlZF9tb3VudHMpID09IDAKICAgIGlzX251bGwocmVxLnN0cmluZ191c2VyKQoKICAgIGlfb2NpIDo9IHJlcS5PQ0kKICAgIGlzX251bGwoaV9vY2kuSG9va3MpCiAgICBpc19udWxsKGlfb2NpLlNvbGFyaXMpCiAgICBpc19udWxsKGlfb2NpLldpbmRvd3MpCgogICAgaV9saW51eCA6PSBpX29jaS5MaW51eAogICAgY291bnQoaV9saW51eC5HSURNYXBwaW5ncykgPT0gMAogICAgY291bnQoaV9saW51eC5Nb3VudExhYmVsKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlJlc291cmNlcy5EZXZpY2VzKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlJvb3Rmc1Byb3BhZ2F0aW9uKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlVJRE1hcHBpbmdzKSA9PSAwCiAgICBpc19udWxsKGlfbGludXguSW50ZWxSZHQpCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLkJsb2NrSU8pCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLk5ldHdvcmspCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLlBpZHMpCiAgICBpc19udWxsKGlfbGludXguU2VjY29tcCkKCiAgICBpX3Byb2Nlc3MgOj0gaV9vY2kuUHJvY2VzcwogICAgY291bnQoaV9wcm9jZXNzLlNlbGludXhMYWJlbCkgPT0gMAogICAgY291bnQoaV9wcm9jZXNzLlVzZXIuVXNlcm5hbWUpID09IDAKCiAgICBwcmludCgiYWxsb3dfY3JlYXRlX2NvbnRhaW5lcl9pbnB1dDogdHJ1ZSIpCn0KCmFsbG93X25hbWVzcGFjZShwX25hbWVzcGFjZSwgaV9uYW1lc3BhY2UpID0gYWRkX25hbWVzcGFjZSB7CiAgICBwX25hbWVzcGFjZSA9PSBpX25hbWVzcGFjZQogICAgYWRkX25hbWVzcGFjZSA6PSBudWxsCiAgICBwcmludCgiYWxsb3dfbmFtZXNwYWNlIDE6IGlucHV0IG5hbWVzcGFjZSBtYXRjaGVzIHBvbGljeSBkYXRhIikKfQoKYWxsb3dfbmFtZXNwYWNlKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkgPSBhZGRfbmFtZXNwYWNlIHsKICAgIHBfbmFtZXNwYWNlID09ICIiCiAgICBwcmludCgiYWxsb3dfbmFtZXNwYWNlIDI6IG5vIG5hbWVzcGFjZSBmb3VuZCBvbiBwb2xpY3kgZGF0YSIpCiAgICBhZGRfbmFtZXNwYWNlIDo9IHN0YXRlX2FsbG93cygibmFtZXNwYWNlIiwgaV9uYW1lc3BhY2UpCn0KCiMgdmFsdWUgaGFzbid0IGJlZW4gc2VlbiBiZWZvcmUsIHNhdmUgaXQgdG8gc3RhdGUKc3RhdGVfYWxsb3dzKGtleSwgdmFsdWUpID0gYWN0aW9uIHsKICBzdGF0ZSA6PSBnZXRfc3RhdGUoKQogIHByaW50KCJzdGF0ZV9hbGxvd3MgMTogc3RhdGVba2V5XSA9Iiwgc3RhdGVba2V5XSwgInZhbHVlID0iLCB2YWx1ZSkKICBub3Qgc3RhdGVba2V5XQogIHByaW50KCJzdGF0ZV9hbGxvd3MgMTogc2F2aW5nIHRvIHN0YXRlIGtleSA9Iiwga2V5LCAidmFsdWUgPSIsIHZhbHVlKQogIHBhdGggOj0gZ2V0X3N0YXRlX3BhdGgoa2V5KSAKICBhY3Rpb24gOj0gewogICAgIm9wIjogImFkZCIsCiAgICAicGF0aCI6IHBhdGgsIAogICAgInZhbHVlIjogdmFsdWUsCiAgfQp9CgojIHZhbHVlIG1hdGNoZXMgd2hhdCdzIGluIHN0YXRlLCBhbGxvdyBpdApzdGF0ZV9hbGxvd3Moa2V5LCB2YWx1ZSkgPSBhY3Rpb24gewogIHByaW50KCJzdGF0ZV9hbGxvd3MgMjogc3RhcnQiKQogIHN0YXRlIDo9IGdldF9zdGF0ZSgpCiAgcHJpbnQoInN0YXRlX2FsbG93cyAyOiBzdGF0ZVtrZXldID0iLCBzdGF0ZVtrZXldLCAidmFsdWUgPSIsIHZhbHVlKQogIHZhbHVlID09IHN0YXRlW2tleV0KICBwcmludCgic3RhdGVfYWxsb3dzIDI6IGZvdW5kIGtleSA9Iiwga2V5LCAidmFsdWUgPSIsIHZhbHVlLCAiIGluIHN0YXRlIikKICBhY3Rpb24gOj0gbnVsbAp9CgojIGhlbHBlciBmdW5jdGlvbnMgdG8gaW50ZXJhY3Qgd2l0aCB0aGUgc3RhdGUKZ2V0X3N0YXRlKCkgPSBzdGF0ZSB7CiAgc3RhdGUgOj0gZGF0YVsicHN0YXRlIl0KfQoKZ2V0X3N0YXRlX3ZhbChrZXkpID0gdmFsdWUgewogICAgc3RhdGUgOj0gZ2V0X3N0YXRlKCkKICAgIHZhbHVlIDo9IHN0YXRlW2tleV0KfQoKZ2V0X3N0YXRlX3BhdGgoa2V5KSA9IHBhdGggewogICAgIyBwcmVwZW5kICIvcHN0YXRlLyIgdG8ga2V5CiAgICBwYXRoIDo9IGNvbmNhdCgiLyIsIFsiL3BzdGF0ZSIsIGtleV0pCn0KCiMgSGVscGVyIGZ1bmN0aW9ucyB0byBjb25kaXRpb25hbGx5IGNvbmNhdGVuYXRlIG9wIGlzIG5vdCBudWxsCmNvbmNhdF9vcF9pZl9ub3RfbnVsbChvcHMsIG9wKSA9IHJlc3VsdCB7CiAgICBvcCA9PSBudWxsCiAgICByZXN1bHQgOj0gb3BzCn0KCmNvbmNhdF9vcF9pZl9ub3RfbnVsbChvcHMsIG9wKSA9IHJlc3VsdCB7CiAgICBvcCAhPSBudWxsCiAgICByZXN1bHQgOj0gYXJyYXkuY29uY2F0KG9wcywgW29wXSkKfQoKIyBSZWplY3QgdW5leHBlY3RlZCBhbm5vdGF0aW9ucy4KYWxsb3dfYW5ubyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19hbm5vIDE6IHN0YXJ0IikKCiAgICBub3QgaV9vY2kuQW5ub3RhdGlvbnMKCiAgICBwcmludCgiYWxsb3dfYW5ubyAxOiB0cnVlIikKfQphbGxvd19hbm5vKHBfb2NpLCBpX29jaSkgewogICAgcHJpbnQoImFsbG93X2Fubm8gMjogcCBBbm5vdGF0aW9ucyA9IiwgcF9vY2kuQW5ub3RhdGlvbnMpCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiBpIEFubm90YXRpb25zID0iLCBpX29jaS5Bbm5vdGF0aW9ucykKCiAgICBpX2tleXMgOj0gb2JqZWN0LmtleXMoaV9vY2kuQW5ub3RhdGlvbnMpCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiBpIGtleXMgPSIsIGlfa2V5cykKCiAgICBldmVyeSBpX2tleSBpbiBpX2tleXMgewogICAgICAgIGFsbG93X2Fubm9fa2V5KGlfa2V5LCBwX29jaSkKICAgIH0KCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiB0cnVlIikKfQoKYWxsb3dfYW5ub19rZXkoaV9rZXksIHBfb2NpKSB7CiAgICBwcmludCgiYWxsb3dfYW5ub19rZXkgMTogaSBrZXkgPSIsIGlfa2V5KQoKICAgIHN0YXJ0c3dpdGgoaV9rZXksICJpby5rdWJlcm5ldGVzLmNyaS4iKQoKICAgIHByaW50KCJhbGxvd19hbm5vX2tleSAxOiB0cnVlIikKfQphbGxvd19hbm5vX2tleShpX2tleSwgcF9vY2kpIHsKICAgIHByaW50KCJhbGxvd19hbm5vX2tleSAyOiBpIGtleSA9IiwgaV9rZXkpCgogICAgc29tZSBwX2tleSwgXyBpbiBwX29jaS5Bbm5vdGF0aW9ucwogICAgcF9rZXkgPT0gaV9rZXkKCiAgICBwcmludCgiYWxsb3dfYW5ub19rZXkgMjogdHJ1ZSIpCn0KCiMgR2V0IHRoZSB2YWx1ZSBvZiB0aGUgU19OQU1FX0tFWSBhbm5vdGF0aW9uIGFuZAojIGNvcnJlbGF0ZSBpdCB3aXRoIG90aGVyIGFubm90YXRpb25zIGFuZCBwcm9jZXNzIGZpZWxkcy4KYWxsb3dfYnlfYW5ubyhwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpIHsKICAgIHByaW50KCJhbGxvd19ieV9hbm5vIDE6IHN0YXJ0IikKCiAgICBub3QgcF9vY2kuQW5ub3RhdGlvbnNbU19OQU1FX0tFWV0KCiAgICBpX3NfbmFtZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMTogaV9zX25hbWUgPSIsIGlfc19uYW1lKQoKICAgIGlfc19uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FU1BBQ0VfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMTogaV9zX25hbWVzcGFjZSA9IiwgaV9zX25hbWVzcGFjZSkKCiAgICBhbGxvd19ieV9zYW5kYm94X25hbWUocF9vY2ksIGlfb2NpLCBwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBpX3NfbmFtZSwgaV9zX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfYnlfYW5ubyAxOiB0cnVlIikKfQphbGxvd19ieV9hbm5vKHBfb2NpLCBpX29jaSwgcF9zdG9yYWdlcywgaV9zdG9yYWdlcykgewogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMjogc3RhcnQiKQoKICAgIHBfc19uYW1lIDo9IHBfb2NpLkFubm90YXRpb25zW1NfTkFNRV9LRVldCiAgICBpX3NfbmFtZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMjogaV9zX25hbWUgPSIsIGlfc19uYW1lLCAicF9zX25hbWUgPSIsIHBfc19uYW1lKQoKICAgIGFsbG93X3NhbmRib3hfbmFtZShwX3NfbmFtZSwgaV9zX25hbWUpCgogICAgaV9zX25hbWVzcGFjZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwcmludCgiYWxsb3dfYnlfYW5ubyAyOiBpX3NfbmFtZXNwYWNlID0iLCBpX3NfbmFtZXNwYWNlKQoKICAgIGFsbG93X2J5X3NhbmRib3hfbmFtZShwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMsIGlfc19uYW1lLCBpX3NfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd19ieV9hbm5vIDI6IHRydWUiKQp9CgphbGxvd19ieV9zYW5kYm94X25hbWUocF9vY2ksIGlfb2NpLCBwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfYnlfc2FuZGJveF9uYW1lOiBzdGFydCIpCgogICAgaV9uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FU1BBQ0VfS0VZXQoKICAgIGFsbG93X2J5X2NvbnRhaW5lcl90eXBlcyhwX29jaSwgaV9vY2ksIHNfbmFtZSwgaV9uYW1lc3BhY2UpCiAgICBhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZChwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpCiAgICBhbGxvd19wcm9jZXNzKHBfb2NpLlByb2Nlc3MsIGlfb2NpLlByb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpCgogICAgcHJpbnQoImFsbG93X2J5X3NhbmRib3hfbmFtZTogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfbmFtZShwX3NfbmFtZSwgaV9zX25hbWUpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X25hbWU6IHN0YXJ0IikKICAgIHJlZ2V4Lm1hdGNoKHBfc19uYW1lLCBpX3NfbmFtZSkKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9uYW1lOiB0cnVlIikKfQoKIyBDaGVjayB0aGF0IHRoZSAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLXR5cGUiIGFuZAojICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIiBhbm5vdGF0aW9ucyBkZXNpZ25hdGUgdGhlCiMgZXhwZWN0ZWQgdHlwZSAtIGVpdGhlciBhICJzYW5kYm94IiBvciBhICJjb250YWluZXIiLiBUaGVuLCB2YWxpZGF0ZQojIG90aGVyIGFubm90YXRpb25zIGJhc2VkIG9uIHRoZSBhY3R1YWwgInNhbmRib3giIG9yICJjb250YWluZXIiIHZhbHVlCiMgZnJvbSB0aGUgaW5wdXQgY29udGFpbmVyLgphbGxvd19ieV9jb250YWluZXJfdHlwZXMocF9vY2ksIGlfb2NpLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfYnlfY29udGFpbmVyX3R5cGVzOiBjaGVja2luZyBpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSIpCgogICAgY190eXBlIDo9ICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSIKICAgIAogICAgcF9jcmlfdHlwZSA6PSBwX29jaS5Bbm5vdGF0aW9uc1tjX3R5cGVdCiAgICBpX2NyaV90eXBlIDo9IGlfb2NpLkFubm90YXRpb25zW2NfdHlwZV0KICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZXM6IHBfY3JpX3R5cGUgPSIsIHBfY3JpX3R5cGUsICJpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgcF9jcmlfdHlwZSA9PSBpX2NyaV90eXBlCgogICAgYWxsb3dfYnlfY29udGFpbmVyX3R5cGUoaV9jcmlfdHlwZSwgcF9vY2ksIGlfb2NpLCBzX25hbWUsIHNfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZXM6IHRydWUiKQp9CgphbGxvd19ieV9jb250YWluZXJfdHlwZShpX2NyaV90eXBlLCBwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAxOiBpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgaV9jcmlfdHlwZSA9PSAic2FuZGJveCIKCiAgICBpX2thdGFfdHlwZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1siaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5jb250YWluZXJfdHlwZSJdCiAgICBwcmludCgiYWxsb3dfYnlfY29udGFpbmVyX3R5cGUgMTogaV9rYXRhX3R5cGUgPSIsIGlfa2F0YV90eXBlKQogICAgaV9rYXRhX3R5cGUgPT0gInBvZF9zYW5kYm94IgoKICAgIGFsbG93X3NhbmRib3hfY29udGFpbmVyX25hbWUocF9vY2ksIGlfb2NpKQogICAgYWxsb3dfc2FuZGJveF9uZXRfbmFtZXNwYWNlKHBfb2NpLCBpX29jaSkKICAgIGFsbG93X3NhbmRib3hfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpCgogICAgcHJpbnQoImFsbG93X2J5X2NvbnRhaW5lcl90eXBlIDE6IHRydWUiKQp9CgphbGxvd19ieV9jb250YWluZXJfdHlwZShpX2NyaV90eXBlLCBwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiBpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgaV9jcmlfdHlwZSA9PSAiY29udGFpbmVyIgoKICAgIGlfa2F0YV90eXBlIDo9IGlfb2NpLkFubm90YXRpb25zWyJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIl0KICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiBpX2thdGFfdHlwZSA9IiwgaV9rYXRhX3R5cGUpCiAgICBpX2thdGFfdHlwZSA9PSAicG9kX2NvbnRhaW5lciIKCiAgICBhbGxvd19jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpCiAgICBhbGxvd19uZXRfbmFtZXNwYWNlKHBfb2NpLCBpX29jaSkKICAgIGFsbG93X2xvZ19kaXJlY3RvcnkocF9vY2ksIGlfb2NpKQoKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiB0cnVlIikKfQoKIyAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLW5hbWUiIGFubm90YXRpb24KYWxsb3dfc2FuZGJveF9jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X2NvbnRhaW5lcl9uYW1lOiBzdGFydCIpCgogICAgY29udGFpbmVyX2Fubm90YXRpb25fbWlzc2luZyhwX29jaSwgaV9vY2ksICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItbmFtZSIpCgogICAgcHJpbnQoImFsbG93X3NhbmRib3hfY29udGFpbmVyX25hbWU6IHRydWUiKQp9CgphbGxvd19jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19jb250YWluZXJfbmFtZTogc3RhcnQiKQoKICAgIGFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uKHBfb2NpLCBpX29jaSwgImlvLmt1YmVybmV0ZXMuY3JpLmNvbnRhaW5lci1uYW1lIikKCiAgICBwcmludCgiYWxsb3dfY29udGFpbmVyX25hbWU6IHRydWUiKQp9Cgpjb250YWluZXJfYW5ub3RhdGlvbl9taXNzaW5nKHBfb2NpLCBpX29jaSwga2V5KSB7CiAgICBwcmludCgiY29udGFpbmVyX2Fubm90YXRpb25fbWlzc2luZzoiLCBrZXkpCgogICAgbm90IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIG5vdCBpX29jaS5Bbm5vdGF0aW9uc1trZXldCgogICAgcHJpbnQoImNvbnRhaW5lcl9hbm5vdGF0aW9uX21pc3Npbmc6IHRydWUiKQp9CgphbGxvd19jb250YWluZXJfYW5ub3RhdGlvbihwX29jaSwgaV9vY2ksIGtleSkgewogICAgcHJpbnQoImFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uOiBrZXkgPSIsIGtleSkKCiAgICBwX3ZhbHVlIDo9IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIGlfdmFsdWUgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgcHJpbnQoImFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uOiBwX3ZhbHVlID0iLCBwX3ZhbHVlLCAiaV92YWx1ZSA9IiwgaV92YWx1ZSkKCiAgICBwX3ZhbHVlID09IGlfdmFsdWUKCiAgICBwcmludCgiYWxsb3dfY29udGFpbmVyX2Fubm90YXRpb246IHRydWUiKQp9CgojICJuZXJkY3RsL25ldHdvcmstbmFtZXNwYWNlIiBhbm5vdGF0aW9uCmFsbG93X3NhbmRib3hfbmV0X25hbWVzcGFjZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X25ldF9uYW1lc3BhY2U6IHN0YXJ0IikKCiAgICBrZXkgOj0gIm5lcmRjdGwvbmV0d29yay1uYW1lc3BhY2UiCgogICAgcF9uYW1lc3BhY2UgOj0gcF9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgaV9uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgcHJpbnQoImFsbG93X3NhbmRib3hfbmV0X25hbWVzcGFjZTogcF9uYW1lc3BhY2UgPSIsIHBfbmFtZXNwYWNlLCAiaV9uYW1lc3BhY2UgPSIsIGlfbmFtZXNwYWNlKQoKICAgIHJlZ2V4Lm1hdGNoKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9uZXRfbmFtZXNwYWNlOiB0cnVlIikKfQoKYWxsb3dfbmV0X25hbWVzcGFjZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19uZXRfbmFtZXNwYWNlOiBzdGFydCIpCgogICAga2V5IDo9ICJuZXJkY3RsL25ldHdvcmstbmFtZXNwYWNlIgoKICAgIG5vdCBwX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICBub3QgaV9vY2kuQW5ub3RhdGlvbnNba2V5XQoKICAgIHByaW50KCJhbGxvd19uZXRfbmFtZXNwYWNlOiB0cnVlIikKfQoKIyAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1sb2ctZGlyZWN0b3J5IiBhbm5vdGF0aW9uCmFsbG93X3NhbmRib3hfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X2xvZ19kaXJlY3Rvcnk6IHN0YXJ0IikKCiAgICBrZXkgOj0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbG9nLWRpcmVjdG9yeSIKCiAgICBwX2RpciA6PSBwX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICByZWdleDEgOj0gcmVwbGFjZShwX2RpciwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHJlZ2V4MiA6PSByZXBsYWNlKHJlZ2V4MSwgIiQoc2FuZGJveC1uYW1lc3BhY2UpIiwgc19uYW1lc3BhY2UpCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiByZWdleDIgPSIsIHJlZ2V4MikKCiAgICBpX2RpciA6PSBpX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiBpX2RpciA9IiwgaV9kaXIpCgogICAgcmVnZXgubWF0Y2gocmVnZXgyLCBpX2RpcikKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiB0cnVlIikKfQoKYWxsb3dfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19sb2dfZGlyZWN0b3J5OiBzdGFydCIpCgogICAga2V5IDo9ICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWxvZy1kaXJlY3RvcnkiCgogICAgbm90IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIG5vdCBpX29jaS5Bbm5vdGF0aW9uc1trZXldCgogICAgcHJpbnQoImFsbG93X2xvZ19kaXJlY3Rvcnk6IHRydWUiKQp9CgphbGxvd19kZXZpY2VzKHBfZGV2aWNlcywgaV9kZXZpY2VzKSB7CiAgICBwcmludCgiYWxsb3dfZGV2aWNlczogc3RhcnQiKQogICAgZXZlcnkgaV9kZXZpY2UgaW4gaV9kZXZpY2VzIHsKICAgICAgICBwcmludCgiYWxsb3dfZGV2aWNlczogaV9kZXZpY2UgPSIsIGlfZGV2aWNlKQogICAgICAgIHNvbWUgcF9kZXZpY2UgaW4gcF9kZXZpY2VzCiAgICAgICAgcF9kZXZpY2UuY29udGFpbmVyX3BhdGggPT0gaV9kZXZpY2UuY29udGFpbmVyX3BhdGgKICAgIH0KICAgIHByaW50KCJhbGxvd19kZXZpY2VzOiB0cnVlIikKfQoKYWxsb3dfbGludXgoc3RhdGVfb3BzLCBwX29jaSwgaV9vY2kpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIHBfbmFtZXNwYWNlcyA6PSBwX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbGludXg6IHAgbmFtZXNwYWNlcyA9IiwgcF9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlcyA6PSBpX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbGludXg6IGkgbmFtZXNwYWNlcyA9IiwgaV9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlX3dpdGhvdXRfbmV0d29yayA6PSBbb2JqIHwgb2JqIDo9IGlfbmFtZXNwYWNlc1tfXTsgb2JqLlR5cGUgIT0gIm5ldHdvcmsiXQoKICAgIHByaW50KCJhbGxvd19saW51eDogaV9uYW1lc3BhY2Vfd2l0aG91dF9uZXR3b3JrID0iLCBpX25hbWVzcGFjZV93aXRob3V0X25ldHdvcmspCgogICAgcF9uYW1lc3BhY2VzID09IGlfbmFtZXNwYWNlX3dpdGhvdXRfbmV0d29yawoKICAgIGFsbG93X21hc2tlZF9wYXRocyhwX29jaSwgaV9vY2kpCiAgICBhbGxvd19yZWFkb25seV9wYXRocyhwX29jaSwgaV9vY2kpCiAgICBhbGxvd19saW51eF9kZXZpY2VzKHBfb2NpLkxpbnV4LkRldmljZXMsIGlfb2NpLkxpbnV4LkRldmljZXMpCiAgICBhbGxvd19saW51eF9zeXNjdGwocF9vY2kuTGludXgsIGlfb2NpLkxpbnV4KQogICAgcmV0IDo9IGFsbG93X25ldHdvcmtfbmFtZXNwYWNlX3N0YXJ0KHN0YXRlX29wcywgcF9vY2ksIGlfb2NpKQogICAgcmV0LmFsbG93ZWQKCiAgICBvcHMgOj0gcmV0Lm9wcwoKICAgIHByaW50KCJhbGxvd19saW51eDogdHJ1ZSIpCn0KCiMgUmV0cmlldmUgdGhlICJuZXR3b3JrIiBuYW1lc3BhY2UgZnJvbSB0aGUgaW5wdXQgZGF0YSBhbmQgcGFzcyBpdCBvbiBmb3IgdGhlCiMgbmV0d29yayBuYW1lc3BhY2UgcG9saWN5IGNoZWNrcy4KYWxsb3dfbmV0d29ya19uYW1lc3BhY2Vfc3RhcnQoc3RhdGVfb3BzLCBwX29jaSwgaV9vY2kpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIHByaW50KCJhbGxvd19uZXR3b3JrX25hbWVzcGFjZSBzdGFydDogc3RhcnQiKQoKICAgIHBfbmFtZXNwYWNlcyA6PSBwX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IHAgbmFtZXNwYWNlcyA9IiwgcF9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlcyA6PSBpX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IGkgbmFtZXNwYWNlcyA9IiwgaV9uYW1lc3BhY2VzKQoKICAgICMgUmV0dXJuIHBhdGggb2YgdGhlICJuZXR3b3JrIiBuYW1lc3BhY2UKICAgIG5ldHdvcmtfbnMgOj0gW29iaiB8IG9iaiA6PSBpX25hbWVzcGFjZXNbX107IG9iai5UeXBlID09ICJuZXR3b3JrIl0KCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IG5ldHdvcmtfbnMgPSIsIG5ldHdvcmtfbnMpCgogICAgcmV0IDo9IGFsbG93X25ldHdvcmtfbmFtZXNwYWNlKHN0YXRlX29wcywgbmV0d29ya19ucykKICAgIHJldC5hbGxvd2VkCgogICAgb3BzIDo9IHJldC5vcHMKfQoKIyBUaGlzIHJ1bGUgaXMgd2hlbiB0aGVyZSdzIG5vIG5ldHdvcmsgbmFtZXNwYWNlIGluIHRoZSBpbnB1dCBkYXRhLgphbGxvd19uZXR3b3JrX25hbWVzcGFjZShzdGF0ZV9vcHMsIG5ldHdvcmtfbnMpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIGNvdW50KG5ldHdvcmtfbnMpID09IDAKCiAgICBuZXR3b3JrX25zX3BhdGggPSAiIgoKICAgIGFkZF9uZXR3b3JrX25hbWVzcGFjZV90b19zdGF0ZSA6PSBzdGF0ZV9hbGxvd3MoIm5ldHdvcmtfbmFtZXNwYWNlIiwgbmV0d29ya19uc19wYXRoKQogICAgb3BzIDo9IGNvbmNhdF9vcF9pZl9ub3RfbnVsbChzdGF0ZV9vcHMsIGFkZF9uZXR3b3JrX25hbWVzcGFjZV90b19zdGF0ZSkKCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2UgMTogdHJ1ZSIpCn0KCiMgVGhpcyBydWxlIGlzIHdoZW4gdGhlcmUncyBleGFjdGx5IG9uZSBuZXR3b3JrIG5hbWVzcGFjZSBpbiB0aGUgaW5wdXQgZGF0YS4KYWxsb3dfbmV0d29ya19uYW1lc3BhY2Uoc3RhdGVfb3BzLCBuZXR3b3JrX25zKSA6PSB7Im9wcyI6IG9wcywgImFsbG93ZWQiOiB0cnVlfSB7CiAgICBjb3VudChuZXR3b3JrX25zKSA9PSAxCgogICAgYWRkX25ldHdvcmtfbmFtZXNwYWNlX3RvX3N0YXRlIDo9IHN0YXRlX2FsbG93cygibmV0d29ya19uYW1lc3BhY2UiLCBuZXR3b3JrX25zWzBdLlBhdGgpCiAgICBvcHMgOj0gY29uY2F0X29wX2lmX25vdF9udWxsKHN0YXRlX29wcywgYWRkX25ldHdvcmtfbmFtZXNwYWNlX3RvX3N0YXRlKQoKICAgIHByaW50KCJhbGxvd19uZXR3b3JrX25hbWVzcGFjZSAyOiB0cnVlIikKfQoKYWxsb3dfbWFza2VkX3BhdGhzKHBfb2NpLCBpX29jaSkgewogICAgcF9wYXRocyA6PSBwX29jaS5MaW51eC5NYXNrZWRQYXRocwogICAgcHJpbnQoImFsbG93X21hc2tlZF9wYXRocyAxOiBwX3BhdGhzID0iLCBwX3BhdGhzKQoKICAgIGlfcGF0aHMgOj0gaV9vY2kuTGludXguTWFza2VkUGF0aHMKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aHMgMTogaV9wYXRocyA9IiwgaV9wYXRocykKCiAgICBhbGxvd19tYXNrZWRfcGF0aHNfYXJyYXkocF9wYXRocywgaV9wYXRocykKCiAgICBwcmludCgiYWxsb3dfbWFza2VkX3BhdGhzIDE6IHRydWUiKQp9CmFsbG93X21hc2tlZF9wYXRocyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aHMgMjogc3RhcnQiKQoKICAgIG5vdCBwX29jaS5MaW51eC5NYXNrZWRQYXRocwogICAgbm90IGlfb2NpLkxpbnV4Lk1hc2tlZFBhdGhzCgogICAgcHJpbnQoImFsbG93X21hc2tlZF9wYXRocyAyOiB0cnVlIikKfQoKIyBBbGwgdGhlIHBvbGljeSBtYXNrZWQgcGF0aHMgbXVzdCBiZSBtYXNrZWQgaW4gdGhlIGlucHV0IGRhdGEgdG9vLgojIElucHV0IGlzIGFsbG93ZWQgdG8gaGF2ZSBtb3JlIG1hc2tlZCBwYXRocyB0aGFuIHRoZSBwb2xpY3kuCmFsbG93X21hc2tlZF9wYXRoc19hcnJheShwX2FycmF5LCBpX2FycmF5KSB7CiAgICBldmVyeSBwX2VsZW0gaW4gcF9hcnJheSB7CiAgICAgICAgYWxsb3dfbWFza2VkX3BhdGgocF9lbGVtLCBpX2FycmF5KQogICAgfQp9CgphbGxvd19tYXNrZWRfcGF0aChwX2VsZW0sIGlfYXJyYXkpIHsKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aDogcF9lbGVtID0iLCBwX2VsZW0pCgogICAgc29tZSBpX2VsZW0gaW4gaV9hcnJheQogICAgcF9lbGVtID09IGlfZWxlbQoKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aDogdHJ1ZSIpCn0KCmFsbG93X3JlYWRvbmx5X3BhdGhzKHBfb2NpLCBpX29jaSkgewogICAgcF9wYXRocyA6PSBwX29jaS5MaW51eC5SZWFkb25seVBhdGhzCiAgICBwcmludCgiYWxsb3dfcmVhZG9ubHlfcGF0aHMgMTogcF9wYXRocyA9IiwgcF9wYXRocykKCiAgICBpX3BhdGhzIDo9IGlfb2NpLkxpbnV4LlJlYWRvbmx5UGF0aHMKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAxOiBpX3BhdGhzID0iLCBpX3BhdGhzKQoKICAgIGFsbG93X3JlYWRvbmx5X3BhdGhzX2FycmF5KHBfcGF0aHMsIGlfcGF0aHMsIGlfb2NpLkxpbnV4Lk1hc2tlZFBhdGhzKQoKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAxOiB0cnVlIikKfQphbGxvd19yZWFkb25seV9wYXRocyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAyOiBzdGFydCIpCgogICAgbm90IHBfb2NpLkxpbnV4LlJlYWRvbmx5UGF0aHMKICAgIG5vdCBpX29jaS5MaW51eC5SZWFkb25seVBhdGhzCgogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGhzIDI6IHRydWUiKQp9CgojIEFsbCB0aGUgcG9saWN5IHJlYWRvbmx5IHBhdGhzIG11c3QgYmUgZWl0aGVyOgojIC0gUHJlc2VudCBpbiB0aGUgaW5wdXQgcmVhZG9ubHkgcGF0aHMsIG9yCiMgLSBQcmVzZW50IGluIHRoZSBpbnB1dCBtYXNrZWQgcGF0aHMuCiMgSW5wdXQgaXMgYWxsb3dlZCB0byBoYXZlIG1vcmUgcmVhZG9ubHkgcGF0aHMgdGhhbiB0aGUgcG9saWN5LgphbGxvd19yZWFkb25seV9wYXRoc19hcnJheShwX2FycmF5LCBpX2FycmF5LCBtYXNrZWRfcGF0aHMpIHsKICAgIGV2ZXJ5IHBfZWxlbSBpbiBwX2FycmF5IHsKICAgICAgICBhbGxvd19yZWFkb25seV9wYXRoKHBfZWxlbSwgaV9hcnJheSwgbWFza2VkX3BhdGhzKQogICAgfQp9CgphbGxvd19yZWFkb25seV9wYXRoKHBfZWxlbSwgaV9hcnJheSwgbWFza2VkX3BhdGhzKSB7CiAgICBwcmludCgiYWxsb3dfcmVhZG9ubHlfcGF0aCAxOiBwX2VsZW0gPSIsIHBfZWxlbSkKCiAgICBzb21lIGlfZWxlbSBpbiBpX2FycmF5CiAgICBwX2VsZW0gPT0gaV9lbGVtCgogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGggMTogdHJ1ZSIpCn0KYWxsb3dfcmVhZG9ubHlfcGF0aChwX2VsZW0sIGlfYXJyYXksIG1hc2tlZF9wYXRocykgewogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGggMjogcF9lbGVtID0iLCBwX2VsZW0pCgogICAgc29tZSBpX21hc2tlZCBpbiBtYXNrZWRfcGF0aHMKICAgIHBfZWxlbSA9PSBpX21hc2tlZAoKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRoIDI6IHRydWUiKQp9CgphbGxvd19saW51eF9kZXZpY2VzKHBfZGV2aWNlcywgaV9kZXZpY2VzKSB7CiAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogc3RhcnQiKQogICAgZXZlcnkgaV9kZXZpY2UgaW4gaV9kZXZpY2VzIHsKICAgICAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogaV9kZXZpY2UgPSIsIGlfZGV2aWNlKQogICAgICAgIHNvbWUgcF9kZXZpY2UgaW4gcF9kZXZpY2VzCiAgICAgICAgaV9kZXZpY2UuUGF0aCA9PSBwX2RldmljZS5QYXRoCiAgICB9CiAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogdHJ1ZSIpCn0KCmFsbG93X2xpbnV4X3N5c2N0bChwX2xpbnV4LCBpX2xpbnV4KSB7CiAgICBwcmludCgiYWxsb3dfbGludXhfc3lzY3RsIDE6IHN0YXJ0IikKICAgIG5vdCBpX2xpbnV4LlN5c2N0bAogICAgcHJpbnQoImFsbG93X2xpbnV4X3N5c2N0bCAxOiB0cnVlIikKfQoKYWxsb3dfbGludXhfc3lzY3RsKHBfbGludXgsIGlfbGludXgpIHsKICAgIHByaW50KCJhbGxvd19saW51eF9zeXNjdGwgMjogc3RhcnQiKQogICAgcF9zeXNjdGwgOj0gcF9saW51eC5TeXNjdGwKICAgIGlfc3lzY3RsIDo9IGlfbGludXguU3lzY3RsCiAgICBldmVyeSBpX25hbWUsIGlfdmFsIGluIGlfc3lzY3RsIHsKICAgICAgICBwcmludCgiYWxsb3dfbGludXhfc3lzY3RsIDI6IGlfbmFtZSA9IiwgaV9uYW1lLCAiaV92YWwgPSIsIGlfdmFsKQogICAgICAgIHBfc3lzY3RsW2lfbmFtZV0gPT0gaV92YWwKICAgIH0KICAgIHByaW50KCJhbGxvd19saW51eF9zeXNjdGwgMjogdHJ1ZSIpCn0KCiMgQ2hlY2sgdGhlIGNvbnNpc3RlbmN5IG9mIHRoZSBpbnB1dCAiaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5idW5kbGVfcGF0aCIKIyBhbmQgaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCIgdmFsdWVzIHdpdGggb3RoZXIgZmllbGRzLgphbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZChwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpIHsKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogc3RhcnQiKQoKICAgIGJ1bmRsZV9wYXRoIDo9IGlfb2NpLkFubm90YXRpb25zWyJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmJ1bmRsZV9wYXRoIl0KICAgIGJ1bmRsZV9pZCA6PSByZXBsYWNlKGJ1bmRsZV9wYXRoLCAiL3J1bi9jb250YWluZXJkL2lvLmNvbnRhaW5lcmQucnVudGltZS52Mi50YXNrL2s4cy5pby8iLCAiIikKCiAgICBidW5kbGVfaWRfZm9ybWF0IDo9IGNvbmNhdCgiIiwgWyJeIiwgQlVORExFX0lELCAiJCJdKQogICAgcmVnZXgubWF0Y2goYnVuZGxlX2lkX2Zvcm1hdCwgYnVuZGxlX2lkKQoKICAgIGtleSA6PSAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCIKCiAgICBwX3JlZ2V4IDo9IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIHNhbmRib3hfaWQgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQoKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogc2FuZGJveF9pZCA9Iiwgc2FuZGJveF9pZCwgInJlZ2V4ID0iLCBwX3JlZ2V4KQogICAgcmVnZXgubWF0Y2gocF9yZWdleCwgc2FuZGJveF9pZCkKCiAgICBhbGxvd19yb290X3BhdGgocF9vY2ksIGlfb2NpLCBidW5kbGVfaWQpCgogICAgZXZlcnkgaV9tb3VudCBpbiBpX29jaS5Nb3VudHMgewogICAgICAgIGFsbG93X21vdW50KHBfb2NpLCBpX21vdW50LCBpX3N0b3JhZ2VzLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpCiAgICB9CgogICAgYWxsb3dfc3RvcmFnZXMocF9zdG9yYWdlcywgaV9zdG9yYWdlcywgYnVuZGxlX2lkLCBzYW5kYm94X2lkKQoKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogdHJ1ZSIpCn0KCmFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHBfcHJvY2VzcyA9IiwgcF9wcm9jZXNzKQogICAgcHJpbnQoImFsbG93X3Byb2Nlc3NfY29tbW9uOiBpX3Byb2Nlc3MgPSAiLCBpX3Byb2Nlc3MpCiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHNfbmFtZSA9Iiwgc19uYW1lKQoKICAgIHBfcHJvY2Vzcy5Dd2QgPT0gaV9wcm9jZXNzLkN3ZAogICAgcF9wcm9jZXNzLk5vTmV3UHJpdmlsZWdlcyA9PSBpX3Byb2Nlc3MuTm9OZXdQcml2aWxlZ2VzCgogICAgYWxsb3dfdXNlcihwX3Byb2Nlc3MsIGlfcHJvY2VzcykKICAgIGFsbG93X2VudihwX3Byb2Nlc3MsIGlfcHJvY2Vzcywgc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHRydWUiKQp9CgojIENvbXBhcmUgdGhlIE9DSSBQcm9jZXNzIGZpZWxkIG9mIGEgcG9saWN5IGNvbnRhaW5lciB3aXRoIHRoZSBpbnB1dCBPQ0kgUHJvY2VzcyBmcm9tIGEgQ3JlYXRlQ29udGFpbmVyUmVxdWVzdAphbGxvd19wcm9jZXNzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfcHJvY2Vzczogc3RhcnQiKQoKICAgIGFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgYWxsb3dfY2FwcyhwX3Byb2Nlc3MuQ2FwYWJpbGl0aWVzLCBpX3Byb2Nlc3MuQ2FwYWJpbGl0aWVzKQogICAgcF9wcm9jZXNzLlRlcm1pbmFsID09IGlfcHJvY2Vzcy5UZXJtaW5hbAoKICAgIHByaW50KCJhbGxvd19wcm9jZXNzOiB0cnVlIikKfQoKIyBDb21wYXJlIHRoZSBPQ0kgUHJvY2VzcyBmaWVsZCBvZiBhIHBvbGljeSBjb250YWluZXIgd2l0aCB0aGUgaW5wdXQgcHJvY2VzcyBmaWVsZCBmcm9tIEV4ZWNQcm9jZXNzUmVxdWVzdAphbGxvd19pbnRlcmFjdGl2ZV9wcm9jZXNzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfaW50ZXJhY3RpdmVfcHJvY2Vzczogc3RhcnQiKQoKICAgIGFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgYWxsb3dfZXhlY19jYXBzKGlfcHJvY2Vzcy5DYXBhYmlsaXRpZXMpCgogICAgIyBUaGVzZSBhcmUgY29tbWFuZHMgZW5hYmxlZCB1c2luZyBFeGVjUHJvY2Vzc1JlcXVlc3QgY29tbWFuZHMgYW5kL29yIHJlZ2V4IGZyb20gdGhlIHNldHRpbmdzIGZpbGUuCiAgICAjIFRoZXkgY2FuIGJlIGV4ZWN1dGVkIGludGVyYWN0aXZlbHkgc28gYWxsb3cgdGhlbSB0byB1c2UgYW55IHZhbHVlIGZvciBpX3Byb2Nlc3MuVGVybWluYWwuCgogICAgcHJpbnQoImFsbG93X2ludGVyYWN0aXZlX3Byb2Nlc3M6IHRydWUiKQp9CgojIENvbXBhcmUgdGhlIE9DSSBQcm9jZXNzIGZpZWxkIG9mIGEgcG9saWN5IGNvbnRhaW5lciB3aXRoIHRoZSBpbnB1dCBwcm9jZXNzIGZpZWxkIGZyb20gRXhlY1Byb2Nlc3NSZXF1ZXN0CmFsbG93X3Byb2JlX3Byb2Nlc3MocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19wcm9iZV9wcm9jZXNzOiBzdGFydCIpCgogICAgYWxsb3dfcHJvY2Vzc19jb21tb24ocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpCiAgICBhbGxvd19leGVjX2NhcHMoaV9wcm9jZXNzLkNhcGFiaWxpdGllcykKICAgIHBfcHJvY2Vzcy5UZXJtaW5hbCA9PSBpX3Byb2Nlc3MuVGVybWluYWwKCiAgICBwcmludCgiYWxsb3dfcHJvYmVfcHJvY2VzczogdHJ1ZSIpCn0KCmFsbG93X3VzZXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MpIHsKICAgIHBfdXNlciA6PSBwX3Byb2Nlc3MuVXNlcgogICAgaV91c2VyIDo9IGlfcHJvY2Vzcy5Vc2VyCgogICAgcHJpbnQoImFsbG93X3VzZXI6IGlucHV0IHVpZCA9IiwgaV91c2VyLlVJRCwgInBvbGljeSB1aWQgPSIsIHBfdXNlci5VSUQpCiAgICBwX3VzZXIuVUlEID09IGlfdXNlci5VSUQKCiAgICAjIFRPRE86IHRyYWNrIGRvd24gdGhlIHJlYXNvbiBmb3IgcmVnaXN0cnkuazhzLmlvL3BhdXNlOjMuOSBiZWluZwogICAgIyAgICAgICBleGVjdXRlZCB3aXRoIGdpZCA9IDAgZGVzcGl0ZSBoYXZpbmcgIjY1NTM1OjY1NTM1IiBpbiBpdHMgY29udGFpbmVyIGltYWdlCiAgICAjICAgICAgIGNvbmZpZy4KICAgICNwcmludCgiYWxsb3dfdXNlcjogaW5wdXQgZ2lkID0iLCBpX3VzZXIuR0lELCAicG9saWN5IGdpZCA9IiwgcF91c2VyLkdJRCkKICAgICNwX3VzZXIuR0lEID09IGlfdXNlci5HSUQKCiAgICAjIFRPRE86IGNvbXBhcmUgdGhlIGFkZGl0aW9uYWxHaWRzIGZpZWxkIHRvbyBhZnRlciBjb21wdXRpbmcgaXRzIHZhbHVlCiAgICAjIGJhc2VkIG9uIC9ldGMvcGFzc3dkIGFuZCAvZXRjL2dyb3VwIGZyb20gdGhlIGNvbnRhaW5lciBpbWFnZS4KfQoKYWxsb3dfZGVwcmVjYXRlZF9hcmdzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZ3MgMTogbm8gYXJncyIpCgogICAgbm90IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJncwogICAgbm90IGlfcHJvY2Vzcy5BcmdzCgogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAxOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZ3MocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSkgewogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiBwb2xpY3kgYXJncyA9IiwgcF9wcm9jZXNzLkRlcHJlY2F0ZWRBcmdzKQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiBpbnB1dCBhcmdzID0iLCBpX3Byb2Nlc3MuQXJncykKCiAgICBjb3VudChwX3Byb2Nlc3MuRGVwcmVjYXRlZEFyZ3MpID09IGNvdW50KGlfcHJvY2Vzcy5BcmdzKQoKICAgIGV2ZXJ5IGksIGlfYXJnIGluIGlfcHJvY2Vzcy5BcmdzIHsKICAgICAgICBhbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpCiAgICB9CgogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDE6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgcF9hcmcyIDo9IHJlcGxhY2UocF9hcmcsICIkJCIsICIkIikKICAgIHBfYXJnMiA9PSBpX2FyZwoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAxOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDI6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgIyBUT0RPOiBjYW4gJChub2RlLW5hbWUpIGJlIGhhbmRsZWQgYmV0dGVyPwogICAgY29udGFpbnMocF9hcmcsICIkKG5vZGUtbmFtZSkiKQoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAyOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDM6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgcF9hcmcyIDo9IHJlcGxhY2UocF9hcmcsICIkJCIsICIkIikKICAgIHBfYXJnMyA6PSByZXBsYWNlKHBfYXJnMiwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAzOiBwX2FyZzMgPSIsIHBfYXJnMykKICAgIHBfYXJnMyA9PSBpX2FyZwoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAzOiB0cnVlIikKfQoKIyBPQ0kgcHJvY2Vzcy5FbnYgZmllbGQKYWxsb3dfZW52KHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfZW52OiBwIGVudiA9IiwgcF9wcm9jZXNzLkVudikKICAgIHByaW50KCJhbGxvd19lbnY6IGkgZW52ID0iLCBpX3Byb2Nlc3MuRW52KQoKICAgIGV2ZXJ5IGlfdmFyIGluIGlfcHJvY2Vzcy5FbnYgewogICAgICAgIHByaW50KCJhbGxvd19lbnY6IGlfdmFyID0iLCBpX3ZhcikKICAgICAgICBhbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgfQoKICAgIHByaW50KCJhbGxvd19lbnY6IHRydWUiKQp9CgojIEFsbG93IGlucHV0IGVudiB2YXJpYWJsZXMgdGhhdCBhcmUgcHJlc2VudCBpbiB0aGUgcG9saWN5IGRhdGEgdG9vLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHBfdmFyID09IGlfdmFyCiAgICBwcmludCgiYWxsb3dfdmFyIDE6IHRydWUiKQp9CgojIE1hdGNoIGlucHV0IHdpdGggb25lIG9mIHRoZSBwb2xpY3kgdmFyaWFibGVzLCBhZnRlciBzdWJzdGl0dXRpbmcgJChzYW5kYm94LW5hbWUpLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHByaW50KCJhbGxvd192YXIgMjogcF92YXIgPSIsIHBfdmFyKQoKICAgIHBfdmFyX3NwbGl0IDo9IHNwbGl0KHBfdmFyLCAiPSIpCiAgICBjb3VudChwX3Zhcl9zcGxpdCkgPT0gMgoKICAgIHBfdmFyX3NwbGl0WzFdID09ICIkKHNhbmRib3gtbmFtZSkiCgogICAgaV92YXJfc3BsaXQgOj0gc3BsaXQoaV92YXIsICI9IikKICAgIGNvdW50KGlfdmFyX3NwbGl0KSA9PSAyCgogICAgaV92YXJfc3BsaXRbMF0gPT0gcF92YXJfc3BsaXRbMF0KICAgIHJlZ2V4Lm1hdGNoKHNfbmFtZSwgaV92YXJfc3BsaXRbMV0pCgogICAgcHJpbnQoImFsbG93X3ZhciAyOiB0cnVlIikKfQoKIyBBbGxvdyBpbnB1dCBlbnYgdmFyaWFibGVzIHRoYXQgbWF0Y2ggd2l0aCBhIHJlcXVlc3RfZGVmYXVsdHMgcmVnZXguCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHNvbWUgcF9yZWdleDEgaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5DcmVhdGVDb250YWluZXJSZXF1ZXN0LmFsbG93X2Vudl9yZWdleAogICAgcF9yZWdleDIgOj0gcmVwbGFjZShwX3JlZ2V4MSwgIiQoaXB2NF9hKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcHY0X2EpCiAgICBwX3JlZ2V4MyA6PSByZXBsYWNlKHBfcmVnZXgyLCAiJChpcF9wKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcF9wKQogICAgcF9yZWdleDQgOj0gcmVwbGFjZShwX3JlZ2V4MywgIiQoc3ZjX25hbWUpIiwgcG9saWN5X2RhdGEuY29tbW9uLnN2Y19uYW1lKQogICAgcF9yZWdleDUgOj0gcmVwbGFjZShwX3JlZ2V4NCwgIiQoZG5zX2xhYmVsKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5kbnNfbGFiZWwpCgogICAgcHJpbnQoImFsbG93X3ZhciAzOiBwX3JlZ2V4NSA9IiwgcF9yZWdleDUpCiAgICByZWdleC5tYXRjaChwX3JlZ2V4NSwgaV92YXIpCgogICAgcHJpbnQoImFsbG93X3ZhciAzOiB0cnVlIikKfQoKIyBBbGxvdyBmaWVsZFJlZiAiZmllbGRQYXRoOiBzdGF0dXMucG9kSVAiIHZhbHVlcy4KYWxsb3dfdmFyKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBpX3Zhciwgc19uYW1lLCBzX25hbWVzcGFjZSkgewogICAgbmFtZV92YWx1ZSA6PSBzcGxpdChpX3ZhciwgIj0iKQogICAgY291bnQobmFtZV92YWx1ZSkgPT0gMgogICAgaXNfaXAobmFtZV92YWx1ZVsxXSkKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIGFsbG93X3BvZF9pcF92YXIobmFtZV92YWx1ZVswXSwgcF92YXIpCgogICAgcHJpbnQoImFsbG93X3ZhciA0OiB0cnVlIikKfQoKIyBBbGxvdyBjb21tb24gZmllbGRSZWYgdmFyaWFibGVzLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBuYW1lX3ZhbHVlIDo9IHNwbGl0KGlfdmFyLCAiPSIpCiAgICBjb3VudChuYW1lX3ZhbHVlKSA9PSAyCgogICAgc29tZSBwX3ZhciBpbiBwX3Byb2Nlc3MuRW52CiAgICBwX25hbWVfdmFsdWUgOj0gc3BsaXQocF92YXIsICI9IikKICAgIGNvdW50KHBfbmFtZV92YWx1ZSkgPT0gMgoKICAgIHBfbmFtZV92YWx1ZVswXSA9PSBuYW1lX3ZhbHVlWzBdCgogICAgIyBUT0RPOiBzaG91bGQgdGhlc2UgYmUgaGFuZGxlZCBpbiBhIGRpZmZlcmVudCB3YXk/CiAgICBhbHdheXNfYWxsb3dlZCA6PSBbIiQoaG9zdC1uYW1lKSIsICIkKG5vZGUtbmFtZSkiLCAiJChwb2QtdWlkKSJdCiAgICBzb21lIGFsbG93ZWQgaW4gYWx3YXlzX2FsbG93ZWQKICAgIGNvbnRhaW5zKHBfbmFtZV92YWx1ZVsxXSwgYWxsb3dlZCkKCiAgICBwcmludCgiYWxsb3dfdmFyIDU6IHRydWUiKQp9CgojIEFsbG93IGZpZWxkUmVmICJmaWVsZFBhdGg6IHN0YXR1cy5ob3N0SVAiIHZhbHVlcy4KYWxsb3dfdmFyKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBpX3Zhciwgc19uYW1lLCBzX25hbWVzcGFjZSkgewogICAgbmFtZV92YWx1ZSA6PSBzcGxpdChpX3ZhciwgIj0iKQogICAgY291bnQobmFtZV92YWx1ZSkgPT0gMgogICAgaXNfaXAobmFtZV92YWx1ZVsxXSkKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIGFsbG93X2hvc3RfaXBfdmFyKG5hbWVfdmFsdWVbMF0sIHBfdmFyKQoKICAgIHByaW50KCJhbGxvd192YXIgNjogdHJ1ZSIpCn0KCiMgQWxsb3cgcmVzb3VyY2VGaWVsZFJlZiB2YWx1ZXMgKGUuZy4sICJsaW1pdHMuY3B1IikuCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIG5hbWVfdmFsdWUgOj0gc3BsaXQoaV92YXIsICI9IikKICAgIGNvdW50KG5hbWVfdmFsdWUpID09IDIKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHBfbmFtZV92YWx1ZSA6PSBzcGxpdChwX3ZhciwgIj0iKQogICAgY291bnQocF9uYW1lX3ZhbHVlKSA9PSAyCgogICAgcF9uYW1lX3ZhbHVlWzBdID09IG5hbWVfdmFsdWVbMF0KCiAgICAjIGEgdmFyaWFibGUgd2Ugc2hvdWxkIGJlIHZhbGlkYXRpbmcgdXNpbmcgYSByZWdleCBmcm9tIHNldHRpbmdzCiAgICBwX25hbWVfdmFsdWVbMV0gPT0gIiQodmFsaWRhdGUtZnJvbS1zZXR0aW5ncykiCgogICAgcmVnZXhfdmFsIDo9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuQ3JlYXRlQ29udGFpbmVyUmVxdWVzdC5hbGxvd19lbnZfcmVnZXhfbWFwW25hbWVfdmFsdWVbMF1dCgogICAgcHJpbnQoImFsbG93X3ZhciA3OiB2YWwgPSIsIG5hbWVfdmFsdWVbMV0pCiAgICBwcmludCgiYWxsb3dfdmFyIDc6IHJlZ2V4X3ZhbCA9IiwgcmVnZXhfdmFsKQoKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4X3ZhbCwgbmFtZV92YWx1ZVsxXSkKCiAgICBwcmludCgiYWxsb3dfdmFyIDc6IHRydWUiKQp9CgojIE1hdGNoIGlucHV0IHdpdGggb25lIG9mIHRoZSBwb2xpY3kgdmFyaWFibGVzLCBhZnRlciBzdWJzdGl0dXRpbmcgJChzYW5kYm94LW5hbWVzcGFjZSkuCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHNvbWUgcF92YXIgaW4gcF9wcm9jZXNzLkVudgogICAgcF92YXIyIDo9IHJlcGxhY2UocF92YXIsICIkKHNhbmRib3gtbmFtZXNwYWNlKSIsIHNfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd192YXIgODogcF92YXIyID0iLCBwX3ZhcjIpCiAgICBwX3ZhcjIgPT0gaV92YXIKCiAgICBwcmludCgiYWxsb3dfdmFyIDg6IHRydWUiKQp9CgphbGxvd19wb2RfaXBfdmFyKHZhcl9uYW1lLCBwX3ZhcikgewogICAgcHJpbnQoImFsbG93X3BvZF9pcF92YXI6IHZhcl9uYW1lID0iLCB2YXJfbmFtZSwgInBfdmFyID0iLCBwX3ZhcikKCiAgICBwX25hbWVfdmFsdWUgOj0gc3BsaXQocF92YXIsICI9IikKICAgIGNvdW50KHBfbmFtZV92YWx1ZSkgPT0gMgoKICAgIHBfbmFtZV92YWx1ZVswXSA9PSB2YXJfbmFtZQogICAgcF9uYW1lX3ZhbHVlWzFdID09ICIkKHBvZC1pcCkiCgogICAgcHJpbnQoImFsbG93X3BvZF9pcF92YXI6IHRydWUiKQp9CgphbGxvd19ob3N0X2lwX3Zhcih2YXJfbmFtZSwgcF92YXIpIHsKICAgIHByaW50KCJhbGxvd19ob3N0X2lwX3ZhcjogdmFyX25hbWUgPSIsIHZhcl9uYW1lLCAicF92YXIgPSIsIHBfdmFyKQoKICAgIHBfbmFtZV92YWx1ZSA6PSBzcGxpdChwX3ZhciwgIj0iKQogICAgY291bnQocF9uYW1lX3ZhbHVlKSA9PSAyCgogICAgcF9uYW1lX3ZhbHVlWzBdID09IHZhcl9uYW1lCiAgICBwX25hbWVfdmFsdWVbMV0gPT0gIiQoaG9zdC1pcCkiCgogICAgcHJpbnQoImFsbG93X2hvc3RfaXBfdmFyOiB0cnVlIikKfQoKaXNfaXAodmFsdWUpIHsKICAgIGJ5dGVzID0gc3BsaXQodmFsdWUsICIuIikKICAgIGNvdW50KGJ5dGVzKSA9PSA0CgogICAgaXNfaXBfZmlyc3RfYnl0ZShieXRlc1swXSkKICAgIGlzX2lwX290aGVyX2J5dGUoYnl0ZXNbMV0pCiAgICBpc19pcF9vdGhlcl9ieXRlKGJ5dGVzWzJdKQogICAgaXNfaXBfb3RoZXJfYnl0ZShieXRlc1szXSkKfQppc19pcF9maXJzdF9ieXRlKGNvbXBvbmVudCkgewogICAgbnVtYmVyID0gdG9fbnVtYmVyKGNvbXBvbmVudCkKICAgIG51bWJlciA+PSAxCiAgICBudW1iZXIgPD0gMjU1Cn0KaXNfaXBfb3RoZXJfYnl0ZShjb21wb25lbnQpIHsKICAgIG51bWJlciA9IHRvX251bWJlcihjb21wb25lbnQpCiAgICBudW1iZXIgPj0gMAogICAgbnVtYmVyIDw9IDI1NQp9CgojIE9DSSByb290LlBhdGgKYWxsb3dfcm9vdF9wYXRoKHBfb2NpLCBpX29jaSwgYnVuZGxlX2lkKSB7CiAgICBpX3BhdGggOj0gaV9vY2kuUm9vdC5QYXRoCiAgICBwX3BhdGgxIDo9IHBfb2NpLlJvb3QuUGF0aAogICAgcHJpbnQoImFsbG93X3Jvb3RfcGF0aDogaV9wYXRoID0iLCBpX3BhdGgsICJwX3BhdGgxID0iLCBwX3BhdGgxKQoKICAgIHBfcGF0aDIgOj0gcmVwbGFjZShwX3BhdGgxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfcm9vdF9wYXRoOiBwX3BhdGgyID0iLCBwX3BhdGgyKQoKICAgIHBfcGF0aDMgOj0gcmVwbGFjZShwX3BhdGgyLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X3Jvb3RfcGF0aDogcF9wYXRoMyA9IiwgcF9wYXRoMykKCiAgICBwX3BhdGgzID09IGlfcGF0aAoKICAgIHByaW50KCJhbGxvd19yb290X3BhdGg6IHRydWUiKQp9CgojIGRldmljZSBtb3VudHMKYWxsb3dfbW91bnQocF9vY2ksIGlfbW91bnQsIGlfc3RvcmFnZXMsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcHJpbnQoImFsbG93X21vdW50OiBpX21vdW50ID0iLCBpX21vdW50KQoKICAgIHNvbWUgcF9tb3VudCBpbiBwX29jaS5Nb3VudHMKICAgIHNvbWUgaV9zdG9yYWdlIGluIGlfc3RvcmFnZXMKCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IHBfbW91bnQgPSIsIHBfbW91bnQpCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IGlfc3RvcmFnZSA9IiwgaV9zdG9yYWdlKQoKICAgIGNoZWNrX21vdW50KHBfbW91bnQsIGlfbW91bnQsIGlfc3RvcmFnZSwgYnVuZGxlX2lkLCBzYW5kYm94X2lkKQoKICAgICMgVE9ETzogYXJlIHRoZXJlIGFueSBvdGhlciByZXF1aXJlZCBwb2xpY3kgY2hlY2tzIGZvciBtb3VudHMgLSBlLmcuLAogICAgIyAgICAgICBtdWx0aXBsZSBtb3VudHMgd2l0aCBzYW1lIHNvdXJjZSBvciBkZXN0aW5hdGlvbj8KCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IHRydWUiKQp9CgpjaGVja19tb3VudChwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcF9tb3VudCA9PSBpX21vdW50CiAgICBwcmludCgiY2hlY2tfbW91bnQgMTogdHJ1ZSIpCn0KY2hlY2tfbW91bnQocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHBfbW91bnQuZGVzdGluYXRpb24gPT0gaV9tb3VudC5kZXN0aW5hdGlvbgogICAgcF9tb3VudC50eXBlXyA9PSBpX21vdW50LnR5cGVfCiAgICBwX21vdW50Lm9wdGlvbnMgPT0gaV9tb3VudC5vcHRpb25zCgogICAgbW91bnRfc291cmNlX2FsbG93cyhwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkKCiAgICBwcmludCgiY2hlY2tfbW91bnQgMjogdHJ1ZSIpCn0KCm1vdW50X3NvdXJjZV9hbGxvd3MocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHJlZ2V4MSA6PSBwX21vdW50LnNvdXJjZQogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5tb3VudF9zb3VyY2VfY3BhdGgpCiAgICByZWdleDQgOj0gcmVwbGFjZShyZWdleDMsICIkKGJ1bmRsZS1pZCkiLCBidW5kbGVfaWQpCgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMTogcmVnZXg0ID0iLCByZWdleDQpCiAgICByZWdleC5tYXRjaChyZWdleDQsIGlfbW91bnQuc291cmNlKQoKICAgIHByaW50KCJtb3VudF9zb3VyY2VfYWxsb3dzIDE6IHRydWUiKQp9Cm1vdW50X3NvdXJjZV9hbGxvd3MocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHJlZ2V4MSA6PSBwX21vdW50LnNvdXJjZQogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5tb3VudF9zb3VyY2VfY3BhdGgpCiAgICByZWdleDQgOj0gcmVwbGFjZShyZWdleDMsICIkKHNhbmRib3gtaWQpIiwgc2FuZGJveF9pZCkKCiAgICBwcmludCgibW91bnRfc291cmNlX2FsbG93cyAyOiByZWdleDQgPSIsIHJlZ2V4NCkKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4NCwgaV9tb3VudC5zb3VyY2UpCgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMjogdHJ1ZSIpCn0KbW91bnRfc291cmNlX2FsbG93cyhwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogaV9tb3VudC5zb3VyY2UgPSIsIGlfbW91bnQuc291cmNlKQogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogaV9zdG9yYWdlLm1vdW50X3BvaW50ID0iLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCgogICAgaV9tb3VudC5zb3VyY2UgPT0gaV9zdG9yYWdlLm1vdW50X3BvaW50CgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogdHJ1ZSIpCn0KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBDcmVhdGUgY29udGFpbmVyIFN0b3JhZ2VzCgphbGxvd19zdG9yYWdlcyhwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHBfY291bnQgOj0gY291bnQocF9zdG9yYWdlcykKICAgIGlfY291bnQgOj0gY291bnQoaV9zdG9yYWdlcykKICAgIHByaW50KCJhbGxvd19zdG9yYWdlczogcF9jb3VudCA9IiwgcF9jb3VudCwgImlfY291bnQgPSIsIGlfY291bnQpCgogICAgcF9jb3VudCA9PSBpX2NvdW50CgogICAgIyBHZXQgdGhlIGNvbnRhaW5lciBpbWFnZSBsYXllciBJRHMgYW5kIHZlcml0eSByb290IGhhc2hlcywgZnJvbSB0aGUgIm92ZXJsYXlmcyIgc3RvcmFnZS4KICAgIHNvbWUgb3ZlcmxheV9zdG9yYWdlIGluIHBfc3RvcmFnZXMKICAgIG92ZXJsYXlfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIHByaW50KCJhbGxvd19zdG9yYWdlczogb3ZlcmxheV9zdG9yYWdlID0iLCBvdmVybGF5X3N0b3JhZ2UpCiAgICBjb3VudChvdmVybGF5X3N0b3JhZ2Uub3B0aW9ucykgPT0gMgoKICAgIGxheWVyX2lkcyA6PSBzcGxpdChvdmVybGF5X3N0b3JhZ2Uub3B0aW9uc1swXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiBsYXllcl9pZHMgPSIsIGxheWVyX2lkcykKCiAgICByb290X2hhc2hlcyA6PSBzcGxpdChvdmVybGF5X3N0b3JhZ2Uub3B0aW9uc1sxXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiByb290X2hhc2hlcyA9Iiwgcm9vdF9oYXNoZXMpCgogICAgZXZlcnkgaV9zdG9yYWdlIGluIGlfc3RvcmFnZXMgewogICAgICAgIGFsbG93X3N0b3JhZ2UocF9zdG9yYWdlcywgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpCiAgICB9CgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiB0cnVlIikKfQoKYWxsb3dfc3RvcmFnZShwX3N0b3JhZ2VzLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgc29tZSBwX3N0b3JhZ2UgaW4gcF9zdG9yYWdlcwoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiBwX3N0b3JhZ2UgPSIsIHBfc3RvcmFnZSkKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiBpX3N0b3JhZ2UgPSIsIGlfc3RvcmFnZSkKCiAgICBwX3N0b3JhZ2UuZHJpdmVyICAgICAgICAgICA9PSBpX3N0b3JhZ2UuZHJpdmVyCiAgICBwX3N0b3JhZ2UuZHJpdmVyX29wdGlvbnMgICA9PSBpX3N0b3JhZ2UuZHJpdmVyX29wdGlvbnMKICAgIHBfc3RvcmFnZS5mc19ncm91cCAgICAgICAgID09IGlfc3RvcmFnZS5mc19ncm91cAogICAgcF9zdG9yYWdlLmZzdHlwZSAgICAgICAgICAgPT0gaV9zdG9yYWdlLmZzdHlwZQoKICAgIGFsbG93X3N0b3JhZ2Vfc291cmNlKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKQogICAgYWxsb3dfc3RvcmFnZV9vcHRpb25zKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKQogICAgYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKQoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiB0cnVlIikKfQoKYWxsb3dfc3RvcmFnZV9zb3VyY2UocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX3NvdXJjZSAxOiBzdGFydCIpCgogICAgcF9zdG9yYWdlLnNvdXJjZSA9PSBpX3N0b3JhZ2Uuc291cmNlCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDE6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX3NvdXJjZShwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDI6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCgogICAgIyBEREREOkJCOkRELkY6IERvbWFpbjpCdXM6RGV2aWNlLkZ1bmN0aW9uCiAgICAjIGh0dHBzOi8vd3d3Lmtlcm5lbC5vcmcvZG9jL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtYnVzLXBjaQogICAgcmVnZXgubWF0Y2goYF5bYS1mMC05XXs0fTpbYS1mMC05XXsyfTpbYS1mMC05XXsyfVwuW2EtZjAtOV0kYCwgaV9zdG9yYWdlLnNvdXJjZSkKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9zb3VyY2UgMjogdHJ1ZSIpCn0KCmFsbG93X3N0b3JhZ2Vfc291cmNlKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKSB7CiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9zb3VyY2UgMzogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIGlfc3RvcmFnZS5zb3VyY2UgPT0gIm5vbmUiCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDM6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX3NvdXJjZShwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDQ6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJzbWIiCgogICAgIyBQYXR0ZXJuOiAvLzxzdG9yYWdlLWFjY291bnQtbmFtZT4uZmlsZS5jb3JlLndpbmRvd3MubmV0LzxrOHMtUFZDLW5hbWU+CiAgICAjIFN0b3JhZ2UgYWNjb3VudCBuYW1lOiBodHRwczovL2xlYXJuLm1pY3Jvc29mdC5jb20vZW4tdXMvYXp1cmUvc3RvcmFnZS9jb21tb24vc3RvcmFnZS1hY2NvdW50LW92ZXJ2aWV3I3N0b3JhZ2UtYWNjb3VudC1uYW1lCiAgICAjIEs4cyBQVkMgbmFtZTogaHR0cHM6Ly9rdWJlcm5ldGVzLmlvL2RvY3MvY29uY2VwdHMvb3ZlcnZpZXcvd29ya2luZy13aXRoLW9iamVjdHMvbmFtZXMvI2Rucy1zdWJkb21haW4tbmFtZXMKICAgIHJlZ2V4Lm1hdGNoKGBeXC9cLyhbYS16MC05XXszLDI0fSlcLmZpbGVcLmNvcmVcLndpbmRvd3NcLm5ldFwvW2EtejAtOV0oW2EtejAtOS4tXXswLDI1MX1bYS16MC05XSk/JGAsIGlfc3RvcmFnZS5zb3VyY2UpCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDQ6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMTogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgIT0gIm92ZXJsYXlmcyIKICAgIHBfc3RvcmFnZS5vcHRpb25zID09IGlfc3RvcmFnZS5vcHRpb25zCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAxOiB0cnVlIikKfQphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIGNvdW50KHBfc3RvcmFnZS5vcHRpb25zKSA9PSAyCgogICAgcG9saWN5X2lkcyA6PSBzcGxpdChwX3N0b3JhZ2Uub3B0aW9uc1swXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBwb2xpY3lfaWRzID0iLCBwb2xpY3lfaWRzKQogICAgcG9saWN5X2lkcyA9PSBsYXllcl9pZHMKCiAgICBwb2xpY3lfaGFzaGVzIDo9IHNwbGl0KHBfc3RvcmFnZS5vcHRpb25zWzFdLCAiOiIpCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IHBvbGljeV9oYXNoZXMgPSIsIHBvbGljeV9oYXNoZXMpCgogICAgcF9jb3VudCA6PSBjb3VudChwb2xpY3lfaWRzKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBwX2NvdW50ID0iLCBwX2NvdW50KQogICAgcF9jb3VudCA+PSAxCiAgICBwX2NvdW50ID09IGNvdW50KHBvbGljeV9oYXNoZXMpCgogICAgaV9jb3VudCA6PSBjb3VudChpX3N0b3JhZ2Uub3B0aW9ucykKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogaV9jb3VudCA9IiwgaV9jb3VudCkKICAgIGlfY291bnQgPT0gcF9jb3VudCArIDMKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zWzBdID0iLCBpX3N0b3JhZ2Uub3B0aW9uc1swXSkKICAgIGlfc3RvcmFnZS5vcHRpb25zWzBdID09ICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQubGF5ZXItc3JjLXByZWZpeD0vdmFyL2xpYi9jb250YWluZXJkL2lvLmNvbnRhaW5lcmQuc25hcHNob3R0ZXIudjEudGFyZGV2L2xheWVycyIKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zW2lfY291bnQgLSAyXSA9IiwgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDJdKQogICAgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDJdID09ICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQub3ZlcmxheS1ydyIKCiAgICBsb3dlcmRpciA6PSBjb25jYXQoIj0iLCBbImxvd2VyZGlyIiwgcF9zdG9yYWdlLm9wdGlvbnNbMF1dKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBsb3dlcmRpciA9IiwgbG93ZXJkaXIpCgogICAgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDFdID09IGxvd2VyZGlyCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zW2lfY291bnQgLSAxXSA9IiwgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDFdKQoKICAgIGV2ZXJ5IGksIHBvbGljeV9pZCBpbiBwb2xpY3lfaWRzIHsKICAgICAgICBhbGxvd19vdmVybGF5X2xheWVyKHBvbGljeV9pZCwgcG9saWN5X2hhc2hlc1tpXSwgaV9zdG9yYWdlLm9wdGlvbnNbaSArIDFdKQogICAgfQoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogdHJ1ZSIpCn0KYWxsb3dfc3RvcmFnZV9vcHRpb25zKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKSB7CiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDM6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCiAgICBjb3VudChwX3N0b3JhZ2Uub3B0aW9ucykgPT0gMQoKICAgIHN0YXJ0c3dpdGgocF9zdG9yYWdlLm9wdGlvbnNbMF0sICIkKGhhc2giKQogICAgaGFzaF9zdWZmaXggOj0gdHJpbV9sZWZ0KHBfc3RvcmFnZS5vcHRpb25zWzBdLCAiJChoYXNoIikKCiAgICBlbmRzd2l0aChoYXNoX3N1ZmZpeCwgIikiKQogICAgaGFzaF9pbmRleCA6PSB0cmltX3JpZ2h0KGhhc2hfc3VmZml4LCAiKSIpCiAgICBpIDo9IHRvX251bWJlcihoYXNoX2luZGV4KQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAzOiBpID0iLCBpKQoKICAgIGhhc2hfb3B0aW9uIDo9IGNvbmNhdCgiPSIsIFsiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LnJvb3QtaGFzaCIsIHJvb3RfaGFzaGVzW2ldXSkKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMzogaGFzaF9vcHRpb24gPSIsIGhhc2hfb3B0aW9uKQoKICAgIGNvdW50KGlfc3RvcmFnZS5vcHRpb25zKSA9PSA0CiAgICBpX3N0b3JhZ2Uub3B0aW9uc1swXSA9PSAicm8iCiAgICBpX3N0b3JhZ2Uub3B0aW9uc1sxXSA9PSAiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmJsb2NrX2RldmljZT1maWxlIgogICAgaV9zdG9yYWdlLm9wdGlvbnNbMl0gPT0gImlvLmthdGFjb250YWluZXJzLmZzLW9wdC5pcy1sYXllciIKICAgIGlfc3RvcmFnZS5vcHRpb25zWzNdID09IGhhc2hfb3B0aW9uCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAzOiB0cnVlIikKfQphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgNDogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gInNtYiIKICAgIHBfb3B0c19jb3VudCA6PSBjb3VudChwX3N0b3JhZ2Uub3B0aW9ucykKICAgIGlfb3B0c19jb3VudCA6PSBjb3VudChpX3N0b3JhZ2Uub3B0aW9ucykKICAgIGlfb3B0c19jb3VudCA9PSBwX29wdHNfY291bnQgKyAyCgogICAgaV9vcHRfbWF0Y2hlcyA6PSBbaSB8IGkgOj0gaWR4OyBpZHggPCBwX29wdHNfY291bnQ7IHBfc3RvcmFnZS5vcHRpb25zW2lkeF0gPT0gaV9zdG9yYWdlLm9wdGlvbnNbaWR4XV0KICAgIGNvdW50KGlfb3B0X21hdGNoZXMpID09IHBfb3B0c19jb3VudAoKICAgIHN0YXJ0c3dpdGgoaV9zdG9yYWdlLm9wdGlvbnNbaV9vcHRzX2NvdW50LTJdLCAiYWRkcj0iKQogICAgY3JlZHMgPSBzcGxpdChpX3N0b3JhZ2Uub3B0aW9uc1tpX29wdHNfY291bnQtMV0sICIsIikKICAgIGNvdW50KGNyZWRzKSA9PSAyCiAgICBzdGFydHN3aXRoKGNyZWRzWzBdLCAidXNlcm5hbWU9IikKICAgIHN0YXJ0c3dpdGgoY3JlZHNbMV0sICJwYXNzd29yZD0iKQogICAgCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDQ6IHRydWUiKQp9CgphbGxvd19vdmVybGF5X2xheWVyKHBvbGljeV9pZCwgcG9saWN5X2hhc2gsIGlfb3B0aW9uKSB7CiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogcG9saWN5X2lkID0iLCBwb2xpY3lfaWQsICJwb2xpY3lfaGFzaCA9IiwgcG9saWN5X2hhc2gpCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogaV9vcHRpb24gPSIsIGlfb3B0aW9uKQoKICAgIHN0YXJ0c3dpdGgoaV9vcHRpb24sICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQubGF5ZXI9IikKICAgIGlfdmFsdWUgOj0gcmVwbGFjZShpX29wdGlvbiwgImlvLmthdGFjb250YWluZXJzLmZzLW9wdC5sYXllcj0iLCAiIikKICAgIGlfdmFsdWVfZGVjb2RlZCA6PSBiYXNlNjQuZGVjb2RlKGlfdmFsdWUpCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogaV92YWx1ZV9kZWNvZGVkID0iLCBpX3ZhbHVlX2RlY29kZWQpCgogICAgcG9saWN5X3N1ZmZpeCA6PSBjb25jYXQoIj0iLCBbInRhcixybyxpby5rYXRhY29udGFpbmVycy5mcy1vcHQuYmxvY2tfZGV2aWNlPWZpbGUsaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmlzLWxheWVyLGlvLmthdGFjb250YWluZXJzLmZzLW9wdC5yb290LWhhc2giLCBwb2xpY3lfaGFzaF0pCiAgICBwX3ZhbHVlIDo9IGNvbmNhdCgiLCIsIFtwb2xpY3lfaWQsIHBvbGljeV9zdWZmaXhdKQogICAgcHJpbnQoImFsbG93X292ZXJsYXlfbGF5ZXI6IHBfdmFsdWUgPSIsIHBfdmFsdWUpCgogICAgcF92YWx1ZSA9PSBpX3ZhbHVlX2RlY29kZWQKCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogdHJ1ZSIpCn0KCmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAidGFyIgoKICAgIHN0YXJ0c3dpdGgocF9zdG9yYWdlLm1vdW50X3BvaW50LCAiJChsYXllciIpCiAgICBtb3VudF9zdWZmaXggOj0gdHJpbV9sZWZ0KHBfc3RvcmFnZS5tb3VudF9wb2ludCwgIiQobGF5ZXIiKQoKICAgIGVuZHN3aXRoKG1vdW50X3N1ZmZpeCwgIikiKQogICAgbGF5ZXJfaW5kZXggOj0gdHJpbV9yaWdodChtb3VudF9zdWZmaXgsICIpIikKICAgIGkgOj0gdG9fbnVtYmVyKGxheWVyX2luZGV4KQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDE6IGkgPSIsIGkpCgogICAgbGF5ZXJfaWQgOj0gbGF5ZXJfaWRzW2ldCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMTogbGF5ZXJfaWQgPSIsIGxheWVyX2lkKQoKICAgIHBfbW91bnQgOj0gY29uY2F0KCIvIiwgWyIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L2xheWVycyIsIGxheWVyX2lkXSkKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCAxOiBwX21vdW50ID0iLCBwX21vdW50KQoKICAgIHBfbW91bnQgPT0gaV9zdG9yYWdlLm1vdW50X3BvaW50CgogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDE6IHRydWUiKQp9CmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAiZnVzZTMua2F0YS1vdmVybGF5IgoKICAgIG1vdW50MSA6PSByZXBsYWNlKHBfc3RvcmFnZS5tb3VudF9wb2ludCwgIiQoY3BhdGgpIiwgcG9saWN5X2RhdGEuY29tbW9uLmNwYXRoKQogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDI6IG1vdW50MiA9IiwgbW91bnQyKQoKICAgIG1vdW50MiA9PSBpX3N0b3JhZ2UubW91bnRfcG9pbnQKCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMjogdHJ1ZSIpCn0KYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKSB7CiAgICBwX3N0b3JhZ2UuZnN0eXBlID09ICJsb2NhbCIKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQyID0iLCBtb3VudDIpCgogICAgbW91bnQzIDo9IHJlcGxhY2UobW91bnQyLCAiJChzYW5kYm94LWlkKSIsIHNhbmRib3hfaWQpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQzID0iLCBtb3VudDMpCgogICAgcmVnZXgubWF0Y2gobW91bnQzLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCgogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDM6IHRydWUiKQp9CmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAiYmluZCIKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNDogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNDogbW91bnQyID0iLCBtb3VudDIpCgogICAgbW91bnQzIDo9IHJlcGxhY2UobW91bnQyLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDQ6IG1vdW50MyA9IiwgbW91bnQzKQoKICAgIHJlZ2V4Lm1hdGNoKG1vdW50MywgaV9zdG9yYWdlLm1vdW50X3BvaW50KQoKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA0OiB0cnVlIikKfQphbGxvd19tb3VudF9wb2ludChwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgYnVuZGxlX2lkLCBzYW5kYm94X2lkLCBsYXllcl9pZHMpIHsKICAgIHBfc3RvcmFnZS5mc3R5cGUgPT0gInRtcGZzIgoKICAgIG1vdW50MSA6PSBwX3N0b3JhZ2UubW91bnRfcG9pbnQKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA1OiBtb3VudDEgPSIsIG1vdW50MSkKCiAgICByZWdleC5tYXRjaChtb3VudDEsIGlfc3RvcmFnZS5tb3VudF9wb2ludCkKCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNTogdHJ1ZSIpCn0KYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKSB7CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogaV9zdG9yYWdlLm1vdW50X3BvaW50ID0iLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCiAgICBhbGxvd19kaXJlY3Rfdm9sX2RyaXZlcihwX3N0b3JhZ2UsIGlfc3RvcmFnZSkKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChzcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQyID0iLCBtb3VudDIpCgogICAgZGlyZWN0X3ZvbF9wYXRoIDo9IGlfc3RvcmFnZS5zb3VyY2UKICAgIG1vdW50MyA6PSByZXBsYWNlKG1vdW50MiwgIiQoYjY0LWRpcmVjdC12b2wtcGF0aCkiLCBiYXNlNjR1cmwuZW5jb2RlKGRpcmVjdF92b2xfcGF0aCkpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQzID0iLCBtb3VudDMpCgogICAgbW91bnQzID09IGlfc3RvcmFnZS5tb3VudF9wb2ludAoKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA2OiB0cnVlIikKfQoKYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIocF9zdG9yYWdlLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19kaXJlY3Rfdm9sX2RyaXZlciAxOiBzdGFydCIpCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCiAgICBwcmludCgiYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIgMTogdHJ1ZSIpCn0KYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIocF9zdG9yYWdlLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19kaXJlY3Rfdm9sX2RyaXZlciAyOiBzdGFydCIpCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJzbWIiCiAgICBwcmludCgiYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIgMjogdHJ1ZSIpCn0KCiMgRXhlY1Byb2Nlc3NSZXF1ZXN0LnByb2Nlc3MuQ2FwYWJpbGl0aWVzCmFsbG93X2V4ZWNfY2FwcyhpX2NhcHMpIHsKICAgIG5vdCBpX2NhcHMuQW1iaWVudAogICAgbm90IGlfY2Fwcy5Cb3VuZGluZwogICAgbm90IGlfY2Fwcy5FZmZlY3RpdmUKICAgIG5vdCBpX2NhcHMuSW5oZXJpdGFibGUKICAgIG5vdCBpX2NhcHMuUGVybWl0dGVkCn0KCiMgT0NJLlByb2Nlc3MuQ2FwYWJpbGl0aWVzCmFsbG93X2NhcHMocF9jYXBzLCBpX2NhcHMpIHsKICAgIHByaW50KCJhbGxvd19jYXBzOiBwb2xpY3kgQW1iaWVudCA9IiwgcF9jYXBzLkFtYmllbnQpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgQW1iaWVudCA9IiwgaV9jYXBzLkFtYmllbnQpCiAgICBtYXRjaF9jYXBzKHBfY2Fwcy5BbWJpZW50LCBpX2NhcHMuQW1iaWVudCkKCiAgICBwcmludCgiYWxsb3dfY2FwczogcG9saWN5IEJvdW5kaW5nID0iLCBwX2NhcHMuQm91bmRpbmcpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgQm91bmRpbmcgPSIsIGlfY2Fwcy5Cb3VuZGluZykKICAgIG1hdGNoX2NhcHMocF9jYXBzLkJvdW5kaW5nLCBpX2NhcHMuQm91bmRpbmcpCgogICAgcHJpbnQoImFsbG93X2NhcHM6IHBvbGljeSBFZmZlY3RpdmUgPSIsIHBfY2Fwcy5FZmZlY3RpdmUpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgRWZmZWN0aXZlID0iLCBpX2NhcHMuRWZmZWN0aXZlKQogICAgbWF0Y2hfY2FwcyhwX2NhcHMuRWZmZWN0aXZlLCBpX2NhcHMuRWZmZWN0aXZlKQoKICAgIHByaW50KCJhbGxvd19jYXBzOiBwb2xpY3kgSW5oZXJpdGFibGUgPSIsIHBfY2Fwcy5Jbmhlcml0YWJsZSkKICAgIHByaW50KCJhbGxvd19jYXBzOiBpbnB1dCBJbmhlcml0YWJsZSA9IiwgaV9jYXBzLkluaGVyaXRhYmxlKQogICAgbWF0Y2hfY2FwcyhwX2NhcHMuSW5oZXJpdGFibGUsIGlfY2Fwcy5Jbmhlcml0YWJsZSkKCiAgICBwcmludCgiYWxsb3dfY2FwczogcG9saWN5IFBlcm1pdHRlZCA9IiwgcF9jYXBzLlBlcm1pdHRlZCkKICAgIHByaW50KCJhbGxvd19jYXBzOiBpbnB1dCBQZXJtaXR0ZWQgPSIsIGlfY2Fwcy5QZXJtaXR0ZWQpCiAgICBtYXRjaF9jYXBzKHBfY2Fwcy5QZXJtaXR0ZWQsIGlfY2Fwcy5QZXJtaXR0ZWQpCn0KCm1hdGNoX2NhcHMocF9jYXBzLCBpX2NhcHMpIHsKICAgIHByaW50KCJtYXRjaF9jYXBzIDE6IHN0YXJ0IikKCiAgICBwX2NhcHMgPT0gaV9jYXBzCgogICAgcHJpbnQoIm1hdGNoX2NhcHMgMTogdHJ1ZSIpCn0KbWF0Y2hfY2FwcyhwX2NhcHMsIGlfY2FwcykgewogICAgcHJpbnQoIm1hdGNoX2NhcHMgMjogc3RhcnQiKQoKICAgIGNvdW50KHBfY2FwcykgPT0gMQogICAgcF9jYXBzWzBdID09ICIkKGRlZmF1bHRfY2FwcykiCgogICAgcHJpbnQoIm1hdGNoX2NhcHMgMjogZGVmYXVsdF9jYXBzID0iLCBwb2xpY3lfZGF0YS5jb21tb24uZGVmYXVsdF9jYXBzKQogICAgcG9saWN5X2RhdGEuY29tbW9uLmRlZmF1bHRfY2FwcyA9PSBpX2NhcHMKCiAgICBwcmludCgibWF0Y2hfY2FwcyAyOiB0cnVlIikKfQptYXRjaF9jYXBzKHBfY2FwcywgaV9jYXBzKSB7CiAgICBwcmludCgibWF0Y2hfY2FwcyAzOiBzdGFydCIpCgogICAgY291bnQocF9jYXBzKSA9PSAxCiAgICBwX2NhcHNbMF0gPT0gIiQocHJpdmlsZWdlZF9jYXBzKSIKCiAgICBwcmludCgibWF0Y2hfY2FwcyAzOiBwcml2aWxlZ2VkX2NhcHMgPSIsIHBvbGljeV9kYXRhLmNvbW1vbi5wcml2aWxlZ2VkX2NhcHMpCiAgICBwb2xpY3lfZGF0YS5jb21tb24ucHJpdmlsZWdlZF9jYXBzID09IGlfY2FwcwoKICAgIHByaW50KCJtYXRjaF9jYXBzIDM6IHRydWUiKQp9CgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgpjaGVja19kaXJlY3RvcnlfdHJhdmVyc2FsKGlfcGF0aCkgewogICAgbm90IHJlZ2V4Lm1hdGNoKCIoXnwvKS4uKCR8LykiLCBpX3BhdGgpCn0KCmNoZWNrX3N5bWxpbmtfc291cmNlKGlfc3JjKSB7CiAgICBpX3NyYyA9PSAiIgogICAgcHJpbnQoImNoZWNrX3N5bWxpbmtfc291cmNlIDE6IHRydWUiKQp9CmNoZWNrX3N5bWxpbmtfc291cmNlKGlfc3JjKSB7CiAgICBpX3NyYyAhPSAiIgogICAgcHJpbnQoImNoZWNrX3N5bWxpbmtfc291cmNlIDI6IGlfc3JjID0iLCBpX3NyYykKCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24uc19zb3VyY2UxLCBpX3NyYykKCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMjogdHJ1ZSIpCn0KY2hlY2tfc3ltbGlua19zb3VyY2UoaV9zcmMpIHsKICAgIGlfc3JjICE9ICIiCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMzogaV9zcmMgPSIsIGlfc3JjKQoKICAgIHJlZ2V4Lm1hdGNoKHBvbGljeV9kYXRhLmNvbW1vbi5zX3NvdXJjZTIsIGlfc3JjKQogICAgY2hlY2tfZGlyZWN0b3J5X3RyYXZlcnNhbChpX3NyYykKCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMzogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfc3RvcmFnZXMoaV9zdG9yYWdlcykgewogICAgcHJpbnQoImFsbG93X3NhbmRib3hfc3RvcmFnZXM6IGlfc3RvcmFnZXMgPSIsIGlfc3RvcmFnZXMpCgogICAgcF9zdG9yYWdlcyA6PSBwb2xpY3lfZGF0YS5zYW5kYm94LnN0b3JhZ2VzCiAgICBldmVyeSBpX3N0b3JhZ2UgaW4gaV9zdG9yYWdlcyB7CiAgICAgICAgYWxsb3dfc2FuZGJveF9zdG9yYWdlKHBfc3RvcmFnZXMsIGlfc3RvcmFnZSkKICAgIH0KCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9zdG9yYWdlczogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfc3RvcmFnZShwX3N0b3JhZ2VzLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IGlfc3RvcmFnZSA9IiwgaV9zdG9yYWdlKQoKICAgIHNvbWUgcF9zdG9yYWdlIGluIHBfc3RvcmFnZXMKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IHBfc3RvcmFnZSA9IiwgcF9zdG9yYWdlKQogICAgaV9zdG9yYWdlID09IHBfc3RvcmFnZQoKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IHRydWUiKQp9CgpDb3B5RmlsZVJlcXVlc3QgewogICAgcHJpbnQoIkNvcHlGaWxlUmVxdWVzdDogaW5wdXQucGF0aCA9IiwgaW5wdXQucGF0aCkKCiAgICBjaGVja19zeW1saW5rX3NvdXJjZShpbnB1dC5zeW1saW5rX3NyYykKICAgIGNoZWNrX2RpcmVjdG9yeV90cmF2ZXJzYWwoaW5wdXQucGF0aCkKCiAgICBzb21lIHJlZ2V4MSBpbiBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLkNvcHlGaWxlUmVxdWVzdAogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5jcGF0aCkKICAgIHJlZ2V4NCA6PSByZXBsYWNlKHJlZ2V4MywgIiQoYnVuZGxlLWlkKSIsIEJVTkRMRV9JRCkKICAgIHByaW50KCJDb3B5RmlsZVJlcXVlc3Q6IHJlZ2V4NCA9IiwgcmVnZXg0KQoKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4NCwgaW5wdXQucGF0aCkKCiAgICBwcmludCgiQ29weUZpbGVSZXF1ZXN0OiB0cnVlIikKfQoKQ3JlYXRlU2FuZGJveFJlcXVlc3QgewogICAgcHJpbnQoIkNyZWF0ZVNhbmRib3hSZXF1ZXN0OiBpbnB1dC5ndWVzdF9ob29rX3BhdGggPSIsIGlucHV0Lmd1ZXN0X2hvb2tfcGF0aCkKICAgIGNvdW50KGlucHV0Lmd1ZXN0X2hvb2tfcGF0aCkgPT0gMAoKICAgIHByaW50KCJDcmVhdGVTYW5kYm94UmVxdWVzdDogaW5wdXQua2VybmVsX21vZHVsZXMgPSIsIGlucHV0Lmtlcm5lbF9tb2R1bGVzKQogICAgY291bnQoaW5wdXQua2VybmVsX21vZHVsZXMpID09IDAKCiAgICBpX3BpZG5zIDo9IGlucHV0LnNhbmRib3hfcGlkbnMKICAgIHByaW50KCJDcmVhdGVTYW5kYm94UmVxdWVzdDogaV9waWRucyA9IiwgaV9waWRucykKICAgIGlfcGlkbnMgPT0gZmFsc2UKICAgIGFsbG93X3NhbmRib3hfc3RvcmFnZXMoaW5wdXQuc3RvcmFnZXMpCn0KCmFsbG93X2V4ZWMocF9jb250YWluZXIsIGlfcHJvY2VzcykgewogICAgcHJpbnQoImFsbG93X2V4ZWM6IHN0YXJ0IikKCiAgICBwX29jaSA9IHBfY29udGFpbmVyLk9DSQogICAgcF9zX25hbWUgPSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc19uYW1lc3BhY2UgPSBnZXRfc3RhdGVfdmFsKCJuYW1lc3BhY2UiKQogICAgYWxsb3dfcHJvYmVfcHJvY2VzcyhwX29jaS5Qcm9jZXNzLCBpX3Byb2Nlc3MsIHBfc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfZXhlYzogdHJ1ZSIpCn0KCmFsbG93X2ludGVyYWN0aXZlX2V4ZWMocF9jb250YWluZXIsIGlfcHJvY2VzcykgewogICAgcHJpbnQoImFsbG93X2ludGVyYWN0aXZlX2V4ZWM6IHN0YXJ0IikKCiAgICBwX29jaSA9IHBfY29udGFpbmVyLk9DSQogICAgcF9zX25hbWUgPSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc19uYW1lc3BhY2UgPSBnZXRfc3RhdGVfdmFsKCJuYW1lc3BhY2UiKQogICAgYWxsb3dfaW50ZXJhY3RpdmVfcHJvY2VzcyhwX29jaS5Qcm9jZXNzLCBpX3Byb2Nlc3MsIHBfc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfaW50ZXJhY3RpdmVfZXhlYzogdHJ1ZSIpCn0KCiMgVE9ETzogc2hvdWxkIG90aGVyIEV4ZWNQcm9jZXNzUmVxdWVzdCBpbnB1dCBkYXRhIGZpZWxkcyBiZSB2YWxpZGF0ZWQgYXMgd2VsbD8KRXhlY1Byb2Nlc3NSZXF1ZXN0IHsKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMTogaW5wdXQgPSIsIGlucHV0KQoKICAgIHNvbWUgcF9jb21tYW5kIGluIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuRXhlY1Byb2Nlc3NSZXF1ZXN0LmFsbG93ZWRfY29tbWFuZHMKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMTogcF9jb21tYW5kID0iLCBwX2NvbW1hbmQpCiAgICBwX2NvbW1hbmQgPT0gaW5wdXQucHJvY2Vzcy5BcmdzCgogICAgIyBUT0RPOiBtYXRjaCBwX2NvbnRhaW5lcidzIElEIHdpdGggdGhlIGlucHV0IGNvbnRhaW5lcl9pZC4KICAgIHNvbWUgcF9jb250YWluZXIgaW4gcG9saWN5X2RhdGEuY29udGFpbmVycwogICAgYWxsb3dfaW50ZXJhY3RpdmVfZXhlYyhwX2NvbnRhaW5lciwgaW5wdXQucHJvY2VzcykKCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDE6IHRydWUiKQp9CkV4ZWNQcm9jZXNzUmVxdWVzdCB7CiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDI6IGlucHV0ID0iLCBpbnB1dCkKCiAgICAjIFRPRE86IG1hdGNoIGlucHV0IGNvbnRhaW5lciBJRCB3aXRoIGl0cyBjb3JyZXNwb25kaW5nIGNvbnRhaW5lci5leGVjX2NvbW1hbmRzLgogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBzb21lIHBfY29tbWFuZCBpbiBwX2NvbnRhaW5lci5leGVjX2NvbW1hbmRzCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDI6IHBfY29tbWFuZCA9IiwgcF9jb21tYW5kKQoKICAgICMgVE9ETzogc2hvdWxkIG90aGVyIGlucHV0IGRhdGEgZmllbGRzIGJlIHZhbGlkYXRlZCBhcyB3ZWxsPwogICAgcF9jb21tYW5kID09IGlucHV0LnByb2Nlc3MuQXJncwoKICAgIGFsbG93X2V4ZWMocF9jb250YWluZXIsIGlucHV0LnByb2Nlc3MpCgogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAyOiB0cnVlIikKfQpFeGVjUHJvY2Vzc1JlcXVlc3QgewogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAzOiBpbnB1dCA9IiwgaW5wdXQpCgogICAgaV9jb21tYW5kID0gY29uY2F0KCIgIiwgaW5wdXQucHJvY2Vzcy5BcmdzKQogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAzOiBpX2NvbW1hbmQgPSIsIGlfY29tbWFuZCkKCiAgICBzb21lIHBfcmVnZXggaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5FeGVjUHJvY2Vzc1JlcXVlc3QucmVnZXgKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMzogcF9yZWdleCA9IiwgcF9yZWdleCkKCiAgICByZWdleC5tYXRjaChwX3JlZ2V4LCBpX2NvbW1hbmQpCgogICAgIyBUT0RPOiBtYXRjaCBwX2NvbnRhaW5lcidzIElEIHdpdGggdGhlIGlucHV0IGNvbnRhaW5lcl9pZC4KICAgIHNvbWUgcF9jb250YWluZXIgaW4gcG9saWN5X2RhdGEuY29udGFpbmVycwogICAgYWxsb3dfaW50ZXJhY3RpdmVfZXhlYyhwX2NvbnRhaW5lciwgaW5wdXQucHJvY2VzcykKCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDM6IHRydWUiKQp9CgpVcGRhdGVSb3V0ZXNSZXF1ZXN0IHsKICAgIHByaW50KCJVcGRhdGVSb3V0ZXNSZXF1ZXN0OiBpbnB1dCA9IiwgaW5wdXQpCiAgICBwcmludCgiVXBkYXRlUm91dGVzUmVxdWVzdDogcG9saWN5ID0iLCBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLlVwZGF0ZVJvdXRlc1JlcXVlc3QpCgogICAgaV9yb3V0ZXMgOj0gaW5wdXQucm91dGVzLlJvdXRlcwogICAgcF9zb3VyY2VfcmVnZXggPSBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLlVwZGF0ZVJvdXRlc1JlcXVlc3QuZm9yYmlkZGVuX3NvdXJjZV9yZWdleAogICAgcF9uYW1lcyA9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuVXBkYXRlUm91dGVzUmVxdWVzdC5mb3JiaWRkZW5fZGV2aWNlX25hbWVzCgogICAgZXZlcnkgaV9yb3V0ZSBpbiBpX3JvdXRlcyB7CiAgICAgICAgcHJpbnQoImlfcm91dGUuc291cmNlID0iLCBpX3JvdXRlLnNvdXJjZSkKICAgICAgICBldmVyeSBwX3JlZ2V4IGluIHBfc291cmNlX3JlZ2V4IHsKICAgICAgICAgICAgcHJpbnQoInBfcmVnZXggPSIsIHBfcmVnZXgpCiAgICAgICAgICAgIG5vdCByZWdleC5tYXRjaChwX3JlZ2V4LCBpX3JvdXRlLnNvdXJjZSkKICAgICAgICB9CgogICAgICAgIHByaW50KCJpX3JvdXRlLmRldmljZSA9IiwgaV9yb3V0ZS5kZXZpY2UpCiAgICAgICAgbm90IGlfcm91dGUuZGV2aWNlIGluIHBfbmFtZXMKICAgIH0KCiAgICBwcmludCgiVXBkYXRlUm91dGVzUmVxdWVzdDogdHJ1ZSIpCn0KClVwZGF0ZUludGVyZmFjZVJlcXVlc3QgewogICAgcHJpbnQoIlVwZGF0ZUludGVyZmFjZVJlcXVlc3Q6IGlucHV0ID0iLCBpbnB1dCkKICAgIHByaW50KCJVcGRhdGVJbnRlcmZhY2VSZXF1ZXN0OiBwb2xpY3kgPSIsIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuVXBkYXRlSW50ZXJmYWNlUmVxdWVzdCkKCiAgICBpX2ludGVyZmFjZSA6PSBpbnB1dC5pbnRlcmZhY2UKICAgIHBfZmxhZ3MgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmFsbG93X3Jhd19mbGFncwoKICAgICMgVHlwaWNhbGx5LCBqdXN0IElGRl9OT0FSUCBpcyB1c2VkLgogICAgYml0cy5hbmQoaV9pbnRlcmZhY2UucmF3X2ZsYWdzLCBiaXRzLm5lZ2F0ZShwX2ZsYWdzKSkgPT0gMAoKICAgIHBfbmFtZXMgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmZvcmJpZGRlbl9uYW1lcwoKICAgIG5vdCBpX2ludGVyZmFjZS5uYW1lIGluIHBfbmFtZXMKCiAgICBwX2h3YWRkcnMgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmZvcmJpZGRlbl9od19hZGRycwoKICAgIG5vdCBpX2ludGVyZmFjZS5od0FkZHIgaW4gcF9od2FkZHJzCgogICAgcHJpbnQoIlVwZGF0ZUludGVyZmFjZVJlcXVlc3Q6IHRydWUiKQp9CgpDbG9zZVN0ZGluUmVxdWVzdCB7CiAgICBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLkNsb3NlU3RkaW5SZXF1ZXN0ID09IHRydWUKfQoKUmVhZFN0cmVhbVJlcXVlc3QgewogICAgcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5SZWFkU3RyZWFtUmVxdWVzdCA9PSB0cnVlCn0KClVwZGF0ZUVwaGVtZXJhbE1vdW50c1JlcXVlc3QgewogICAgcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVFcGhlbWVyYWxNb3VudHNSZXF1ZXN0ID09IHRydWUKfQoKV3JpdGVTdHJlYW1SZXF1ZXN0IHsKICAgIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuV3JpdGVTdHJlYW1SZXF1ZXN0ID09IHRydWUKfQoKcG9saWN5X2RhdGEgOj0gewogICJjb250YWluZXJzIjogWwogICAgewogICAgICAiT0NJIjogewogICAgICAgICJWZXJzaW9uIjogIjEuMS4wLXJjLjEiLAogICAgICAgICJQcm9jZXNzIjogewogICAgICAgICAgIlRlcm1pbmFsIjogZmFsc2UsCiAgICAgICAgICAiVXNlciI6IHsKICAgICAgICAgICAgIlVJRCI6IDY1NTM1LAogICAgICAgICAgICAiR0lEIjogNjU1MzUsCiAgICAgICAgICAgICJBZGRpdGlvbmFsR2lkcyI6IFtdLAogICAgICAgICAgICAiVXNlcm5hbWUiOiAiIgogICAgICAgICAgfSwKICAgICAgICAgICJEZXByZWNhdGVkQXJncyI6IFsKICAgICAgICAgICAgIi9wYXVzZSIKICAgICAgICAgIF0sCiAgICAgICAgICAiQXJncyI6IFsKICAgICAgICAgICAgIi9wYXVzZSIKICAgICAgICAgIF0sCiAgICAgICAgICAiRW52IjogWwogICAgICAgICAgICAiUEFUSD0vdXNyL2xvY2FsL3NiaW46L3Vzci9sb2NhbC9iaW46L3Vzci9zYmluOi91c3IvYmluOi9zYmluOi9iaW4iCiAgICAgICAgICBdLAogICAgICAgICAgIkN3ZCI6ICIvIiwKICAgICAgICAgICJDYXBhYmlsaXRpZXMiOiB7CiAgICAgICAgICAgICJBbWJpZW50IjogW10sCiAgICAgICAgICAgICJCb3VuZGluZyI6IFsKICAgICAgICAgICAgICAiJChkZWZhdWx0X2NhcHMpIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiRWZmZWN0aXZlIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJJbmhlcml0YWJsZSI6IFtdLAogICAgICAgICAgICAiUGVybWl0dGVkIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICAiTm9OZXdQcml2aWxlZ2VzIjogdHJ1ZQogICAgICAgIH0sCiAgICAgICAgIlJvb3QiOiB7CiAgICAgICAgICAiUGF0aCI6ICIkKGNwYXRoKS8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgIlJlYWRvbmx5IjogdHJ1ZQogICAgICAgIH0sCiAgICAgICAgIk1vdW50cyI6IFsKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9wcm9jIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJwcm9jIiwKICAgICAgICAgICAgInR5cGVfIjogInByb2MiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2IiwKICAgICAgICAgICAgInNvdXJjZSI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJzdHJpY3RhdGltZSIsCiAgICAgICAgICAgICAgIm1vZGU9NzU1IiwKICAgICAgICAgICAgICAic2l6ZT02NTUzNmsiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L3B0cyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiZGV2cHRzIiwKICAgICAgICAgICAgInR5cGVfIjogImRldnB0cyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJuZXdpbnN0YW5jZSIsCiAgICAgICAgICAgICAgInB0bXhtb2RlPTA2NjYiLAogICAgICAgICAgICAgICJtb2RlPTA2MjAiLAogICAgICAgICAgICAgICJnaWQ9NSIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvc2htIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L3NobSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi9tcXVldWUiLAogICAgICAgICAgICAic291cmNlIjogIm1xdWV1ZSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJtcXVldWUiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvc3lzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJzeXNmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJzeXNmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2V0Yy9yZXNvbHYuY29uZiIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClyZXNvbHYuY29uZiQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJvIiwKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9kZXYiLAogICAgICAgICAgICAgICJub2V4ZWMiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0KICAgICAgICBdLAogICAgICAgICJBbm5vdGF0aW9ucyI6IHsKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmJ1bmRsZV9wYXRoIjogIi9ydW4vY29udGFpbmVyZC9pby5jb250YWluZXJkLnJ1bnRpbWUudjIudGFzay9rOHMuaW8vJChidW5kbGUtaWQpIiwKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIjogInBvZF9zYW5kYm94IiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSI6ICJzYW5kYm94IiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWlkIjogIl5bYS16MC05XXs2NH0kIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWxvZy1kaXJlY3RvcnkiOiAiXi92YXIvbG9nL3BvZHMvJChzYW5kYm94LW5hbWVzcGFjZSlfJChzYW5kYm94LW5hbWUpX1swLTlhLWZdezh9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezEyfSQiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZSI6ICJec3BhcmskIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LW5hbWVzcGFjZSI6ICIiLAogICAgICAgICAgIm5lcmRjdGwvbmV0d29yay1uYW1lc3BhY2UiOiAiXi92YXIvcnVuL25ldG5zL2NuaS1bMC05YS1mXXs4fS1bMC05YS1mXXs0fS1bMC05YS1mXXs0fS1bMC05YS1mXXs0fS1bMC05YS1mXXsxMn0kIgogICAgICAgIH0sCiAgICAgICAgIkxpbnV4IjogewogICAgICAgICAgIk5hbWVzcGFjZXMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiVHlwZSI6ICJpcGMiLAogICAgICAgICAgICAgICJQYXRoIjogIiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJUeXBlIjogInV0cyIsCiAgICAgICAgICAgICAgIlBhdGgiOiAiIgogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgIlR5cGUiOiAibW91bnQiLAogICAgICAgICAgICAgICJQYXRoIjogIiIKICAgICAgICAgICAgfQogICAgICAgICAgXSwKICAgICAgICAgICJNYXNrZWRQYXRocyI6IFsKICAgICAgICAgICAgIi9wcm9jL2FjcGkiLAogICAgICAgICAgICAiL3Byb2MvYXNvdW5kIiwKICAgICAgICAgICAgIi9wcm9jL2tjb3JlIiwKICAgICAgICAgICAgIi9wcm9jL2tleXMiLAogICAgICAgICAgICAiL3Byb2MvbGF0ZW5jeV9zdGF0cyIsCiAgICAgICAgICAgICIvcHJvYy90aW1lcl9saXN0IiwKICAgICAgICAgICAgIi9wcm9jL3RpbWVyX3N0YXRzIiwKICAgICAgICAgICAgIi9wcm9jL3NjaGVkX2RlYnVnIiwKICAgICAgICAgICAgIi9zeXMvZmlybXdhcmUiLAogICAgICAgICAgICAiL3Byb2Mvc2NzaSIKICAgICAgICAgIF0sCiAgICAgICAgICAiUmVhZG9ubHlQYXRocyI6IFsKICAgICAgICAgICAgIi9wcm9jL2J1cyIsCiAgICAgICAgICAgICIvcHJvYy9mcyIsCiAgICAgICAgICAgICIvcHJvYy9pcnEiLAogICAgICAgICAgICAiL3Byb2Mvc3lzIiwKICAgICAgICAgICAgIi9wcm9jL3N5c3JxLXRyaWdnZXIiCiAgICAgICAgICBdLAogICAgICAgICAgIkRldmljZXMiOiBbXSwKICAgICAgICAgICJTeXNjdGwiOiB7CiAgICAgICAgICAgICJuZXQuaXB2NC5pcF91bnByaXZpbGVnZWRfcG9ydF9zdGFydCI6ICIwIiwKICAgICAgICAgICAgIm5ldC5pcHY0LnBpbmdfZ3JvdXBfcmFuZ2UiOiAiMCAyMTQ3NDgzNjQ3IgogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSwKICAgICAgInN0b3JhZ2VzIjogWwogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2gwKSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjApIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAib3ZlcmxheWZzIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJmdXNlMy5rYXRhLW92ZXJsYXkiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICI1YTVhYWQ4MDA1NWZmMjAwMTJhNTBkYzI1ZjhkZjdhMjk5MjQ0NzQzMjRkNjVmN2Q1MzA2ZWU4ZWUyN2ZmNzFkIiwKICAgICAgICAgICAgIjgxNzI1MGYxYTNlMzM2ZGE3NmY1YmQzZmE3ODRlMWIyNmQ5NTliOWMxMzE4NzY4MTViYTI2MDQwNDhiNzBjMTgiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQoY3BhdGgpLyQoYnVuZGxlLWlkKSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfQogICAgICBdLAogICAgICAiZGV2aWNlcyI6IFtdLAogICAgICAic2FuZGJveF9waWRucyI6IGZhbHNlLAogICAgICAiZXhlY19jb21tYW5kcyI6IFtdLAogICAgICAiZW52X21hcCI6IHsKICAgICAgICAiUEFUSCI6ICIvdXNyL2xvY2FsL3NiaW46L3Vzci9sb2NhbC9iaW46L3Vzci9zYmluOi91c3IvYmluOi9zYmluOi9iaW4iCiAgICAgIH0KICAgIH0sCiAgICB7CiAgICAgICJPQ0kiOiB7CiAgICAgICAgIlZlcnNpb24iOiAiMS4xLjAtcmMuMSIsCiAgICAgICAgIlByb2Nlc3MiOiB7CiAgICAgICAgICAiVGVybWluYWwiOiBmYWxzZSwKICAgICAgICAgICJVc2VyIjogewogICAgICAgICAgICAiVUlEIjogMCwKICAgICAgICAgICAgIkdJRCI6IDAsCiAgICAgICAgICAgICJBZGRpdGlvbmFsR2lkcyI6IFtdLAogICAgICAgICAgICAiVXNlcm5hbWUiOiAiIgogICAgICAgICAgfSwKICAgICAgICAgICJEZXByZWNhdGVkQXJncyI6IFsKICAgICAgICAgICAgIi9iaW4vc2giCiAgICAgICAgICBdLAogICAgICAgICAgIkFyZ3MiOiBbCiAgICAgICAgICAgICIvYmluL3NoIgogICAgICAgICAgXSwKICAgICAgICAgICJFbnYiOiBbCiAgICAgICAgICAgICJQQVRIPS91c3IvbG9jYWwvc2JpbjovdXNyL2xvY2FsL2JpbjovdXNyL3NiaW46L3Vzci9iaW46L3NiaW46L2JpbjovdXNyL2xpYi9qdm0vamF2YS0xLjgtb3Blbmpkay9qcmUvYmluOi91c3IvbGliL2p2bS9qYXZhLTEuOC1vcGVuamRrL2Jpbjovb3B0L3NwYXJrL2JpbiIsCiAgICAgICAgICAgICJMQU5HPUMuVVRGLTgiLAogICAgICAgICAgICAiSkFWQV9IT01FPS91c3IvbGliL2p2bS9qYXZhLTEuOC1vcGVuamRrIiwKICAgICAgICAgICAgIkpBVkFfVkVSU0lPTj04dTIxMiIsCiAgICAgICAgICAgICJKQVZBX0FMUElORV9WRVJTSU9OPTguMjEyLjA0LXIwIiwKICAgICAgICAgICAgIkFQQUNIRV9TUEFSS19WRVJTSU9OPTIuNC4zIiwKICAgICAgICAgICAgIkhBRE9PUF9WRVJTSU9OPTMuMS4yIiwKICAgICAgICAgICAgIkhBRE9PUF9HSVRfQ09NTUlUPXJlbGVhc2UtMy4yLjAtUkMxIiwKICAgICAgICAgICAgIlNQQVJLX0hPTUU9L29wdC9zcGFyayIsCiAgICAgICAgICAgICJIQURPT1BfSE9NRT0vb3B0L2hhZG9vcCIsCiAgICAgICAgICAgICJIT1NUTkFNRT0kKGhvc3QtbmFtZSkiCiAgICAgICAgICBdLAogICAgICAgICAgIkN3ZCI6ICIvIiwKICAgICAgICAgICJDYXBhYmlsaXRpZXMiOiB7CiAgICAgICAgICAgICJBbWJpZW50IjogW10sCiAgICAgICAgICAgICJCb3VuZGluZyI6IFsKICAgICAgICAgICAgICAiJChkZWZhdWx0X2NhcHMpIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiRWZmZWN0aXZlIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJJbmhlcml0YWJsZSI6IFtdLAogICAgICAgICAgICAiUGVybWl0dGVkIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICAiTm9OZXdQcml2aWxlZ2VzIjogZmFsc2UKICAgICAgICB9LAogICAgICAgICJSb290IjogewogICAgICAgICAgIlBhdGgiOiAiJChjcGF0aCkvJChidW5kbGUtaWQpIiwKICAgICAgICAgICJSZWFkb25seSI6IGZhbHNlCiAgICAgICAgfSwKICAgICAgICAiTW91bnRzIjogWwogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL3Byb2MiLAogICAgICAgICAgICAic291cmNlIjogInByb2MiLAogICAgICAgICAgICAidHlwZV8iOiAicHJvYyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYiLAogICAgICAgICAgICAic291cmNlIjogInRtcGZzIiwKICAgICAgICAgICAgInR5cGVfIjogInRtcGZzIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgInN0cmljdGF0aW1lIiwKICAgICAgICAgICAgICAibW9kZT03NTUiLAogICAgICAgICAgICAgICJzaXplPTY1NTM2ayIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvcHRzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJkZXZwdHMiLAogICAgICAgICAgICAidHlwZV8iOiAiZGV2cHRzIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAgICAgIm5ld2luc3RhbmNlIiwKICAgICAgICAgICAgICAicHRteG1vZGU9MDY2NiIsCiAgICAgICAgICAgICAgIm1vZGU9MDYyMCIsCiAgICAgICAgICAgICAgImdpZD01IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi9zaG0iLAogICAgICAgICAgICAic291cmNlIjogIi9ydW4va2F0YS1jb250YWluZXJzL3NhbmRib3gvc2htIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L21xdWV1ZSIsCiAgICAgICAgICAgICJzb3VyY2UiOiAibXF1ZXVlIiwKICAgICAgICAgICAgInR5cGVfIjogIm1xdWV1ZSIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9zeXMiLAogICAgICAgICAgICAic291cmNlIjogInN5c2ZzIiwKICAgICAgICAgICAgInR5cGVfIjogInN5c2ZzIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAgICAgIm5vZGV2IiwKICAgICAgICAgICAgICAicm8iCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvc3lzL2ZzL2Nncm91cCIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiY2dyb3VwIiwKICAgICAgICAgICAgInR5cGVfIjogImNncm91cCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIsCiAgICAgICAgICAgICAgInJlbGF0aW1lIiwKICAgICAgICAgICAgICAicm8iCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZXRjL2hvc3RzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KWhvc3RzJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJydyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvdGVybWluYXRpb24tbG9nIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KXRlcm1pbmF0aW9uLWxvZyQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicnciCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZXRjL2hvc3RuYW1lIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KWhvc3RuYW1lJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJydyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9ldGMvcmVzb2x2LmNvbmYiLAogICAgICAgICAgICAic291cmNlIjogIiQoc2ZwcmVmaXgpcmVzb2x2LmNvbmYkIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJ3IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL3Zhci9ydW4vc2VjcmV0cy9rdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50IiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KXNlcnZpY2VhY2NvdW50JCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJybyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi92YXIvcnVuL3NlY3JldHMvYXp1cmUvdG9rZW5zIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KXRva2VucyQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicm8iCiAgICAgICAgICAgIF0KICAgICAgICAgIH0KICAgICAgICBdLAogICAgICAgICJBbm5vdGF0aW9ucyI6IHsKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmJ1bmRsZV9wYXRoIjogIi9ydW4vY29udGFpbmVyZC9pby5jb250YWluZXJkLnJ1bnRpbWUudjIudGFzay9rOHMuaW8vJChidW5kbGUtaWQpIiwKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIjogInBvZF9jb250YWluZXIiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLmNvbnRhaW5lci1uYW1lIjogInNwYXJrIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSI6ICJjb250YWluZXIiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLmltYWdlLW5hbWUiOiAibWNyLm1pY3Jvc29mdC5jb20vbW1sc3Bhcmsvc3BhcmsyLjQ6djRfbWluaSIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCI6ICJeW2EtejAtOV17NjR9JCIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1uYW1lIjogIl5zcGFyayQiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZXNwYWNlIjogIiIKICAgICAgICB9LAogICAgICAgICJMaW51eCI6IHsKICAgICAgICAgICJOYW1lc3BhY2VzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgIlR5cGUiOiAiaXBjIiwKICAgICAgICAgICAgICAiUGF0aCI6ICIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiVHlwZSI6ICJ1dHMiLAogICAgICAgICAgICAgICJQYXRoIjogIiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJUeXBlIjogIm1vdW50IiwKICAgICAgICAgICAgICAiUGF0aCI6ICIiCiAgICAgICAgICAgIH0KICAgICAgICAgIF0sCiAgICAgICAgICAiTWFza2VkUGF0aHMiOiBbCiAgICAgICAgICAgICIvcHJvYy9hY3BpIiwKICAgICAgICAgICAgIi9wcm9jL2tjb3JlIiwKICAgICAgICAgICAgIi9wcm9jL2tleXMiLAogICAgICAgICAgICAiL3Byb2MvbGF0ZW5jeV9zdGF0cyIsCiAgICAgICAgICAgICIvcHJvYy90aW1lcl9saXN0IiwKICAgICAgICAgICAgIi9wcm9jL3RpbWVyX3N0YXRzIiwKICAgICAgICAgICAgIi9wcm9jL3NjaGVkX2RlYnVnIiwKICAgICAgICAgICAgIi9wcm9jL3Njc2kiLAogICAgICAgICAgICAiL3N5cy9maXJtd2FyZSIKICAgICAgICAgIF0sCiAgICAgICAgICAiUmVhZG9ubHlQYXRocyI6IFsKICAgICAgICAgICAgIi9wcm9jL2Fzb3VuZCIsCiAgICAgICAgICAgICIvcHJvYy9idXMiLAogICAgICAgICAgICAiL3Byb2MvZnMiLAogICAgICAgICAgICAiL3Byb2MvaXJxIiwKICAgICAgICAgICAgIi9wcm9jL3N5cyIsCiAgICAgICAgICAgICIvcHJvYy9zeXNycS10cmlnZ2VyIgogICAgICAgICAgXSwKICAgICAgICAgICJEZXZpY2VzIjogW10sCiAgICAgICAgICAiU3lzY3RsIjogewogICAgICAgICAgICAibmV0LmlwdjQuaXBfdW5wcml2aWxlZ2VkX3BvcnRfc3RhcnQiOiAiMCIsCiAgICAgICAgICAgICJuZXQuaXB2NC5waW5nX2dyb3VwX3JhbmdlIjogIjAgMjE0NzQ4MzY0NyIKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0sCiAgICAgICJzdG9yYWdlcyI6IFsKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoMCkiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXIwKSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoMSkiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXIxKSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoMikiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXIyKSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoMykiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXIzKSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoNCkiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXI0KSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoNSkiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXI1KSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoNikiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXI2KSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoNykiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXI3KSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoOCkiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXI4KSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoOSkiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXI5KSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoMTApIgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGxheWVyMTApIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAib3ZlcmxheWZzIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJmdXNlMy5rYXRhLW92ZXJsYXkiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICI2ODk4NmMyZjg0OGViYzQxYzg1NjFjYjFjNWQzMDI4ODc2NDI5OTQ0OGIwMzNlZDZlYmIyNTdhNDNlMzFhM2I5OjU2ZDM0MDY2ZGEwZDk5ZTc2MmY2MzdkMGQzMmQ5NWU1NDYyMjM2OWYwNDhlMjg5ZTM3ZGIwMmJlMTk3NTMzMDU6MGVmMmJlNTQ4NWY4ZTdjNWM4YTIwMTUyMWJmMDg2MTk3YWE5YmQxZDk0OTdmYTg1MGY3NmVlMWRlYjc3NzJiYjo0MDMzZWU2YTc3MjMzYzBkM2I0MzNkMzkwOTJlMDk5NjgzNzk5NGVlZjJiZDFmMWY5MmI4NThjZTY0MzczOTZmOjBmMDhiMzgxMTdiZTBhMjdiMWQ0M2QzOTU0ZjIxMDQyYWU0M2YwMmExMDBlMDllZDBmNDM3MGNlNTNmM2EyNjI6MzVhMjg5YzMxNmYxZGU1MDIxNzJlNGE4ZDllMTUzMTMzYmFjYTRiZWNiMzhiMDcwODgwMDc2NGRjY2M0NjI1MTpmNDZiMDRiNDlhN2UwN2ZjYmJiZTM0MjkwMjc0NDRmYjIwMzRiN2ZkOGQzYTU5ZTY2NzhiMzI5YWIyYjY1NzYzOjdlMWFiM2IyNzA1ZWYzNzk0YjJjODQ2Y2JhYzc1NzE0NGQyYTQwZDM4M2IzZDNjODVlMjdhNWQ4YzM5Yzg0ZjE6MDEyYjE4NjBhZjkwNzUzN2UxMTRhZTM4ZDkyNWJjZTFlYWFmM2QxZDg3ODFmZGMxZjc3ZWY4MjhjOGI0ZTJiYjoyYjg2M2ZhMjU3NTYxYzU5ZjE5ZmVkYTRiNWJlMDVhODcxZmZkZGQzMzA2ZmQ0M2U1YzA0MDUxZDQ4NDI5OWJiOjVhMjg3OTdhYmE1NzIzYmVmMDc0NzdhYzlkYjYzNzY3MDFlMTMzMzUyNDFlMmJiNWM2N2RmNDY0ZGNjZTExMmQiLAogICAgICAgICAgICAiOWM1ZTllNjUzZDI2ZWQ1MjNmMDIyYmQyOWUxOWU5MjY3MzU5OTk1ZDVhMGM4ZmQyMjc1NmY4NGNhZDU0NWQzZjo2YmRhZWY1NjgyNDQ0NTI5ZmZkNjI0MjgwZGJhZDFhZjc1Nzk2M2Q2YjQ0ZDYxNGNiNmNhOTExZjM5YjVmODAzOjVhZGE5N2FlMjVkOWJmZDEyODMzNjM5N2I4NTdlMWEwN2RjZTIxMzdiZmFiMDc1NzFiZjQxZjlkNDBkN2I1OTA6NWI3N2M2ZGY2ODM4MTAzYTg1ODc4N2M5Y2U0ODY1YjZkMTFiYmRkOTg2MTY5ZWQwOGUwMzYyYWM2ZmRlNGQ3NDo4Y2JmNDU5NWYwZTExZDgwNjUzMTBkMmFkMDQ2ZTcxMTM0OTc1ZDAwNmEwNjk5MzFjM2ZmNzFmNTc1NDk0OGEwOjA1MDA0ZGMzYTExYzgyZThjODBhZjQ2YWJhZTcyOGNkNmNlYmZmYzM0MDE4MWE0OTMxMGFkYmNjNGQ3NmIxMzg6M2VhNWE2NDNkODg2MDAyOTRlMmEzN2NkOWVlYmQxNGUxNzU4MDM1MmQxNGZlZDMyYmZlNTFmYmRmMDNkZGQ0NToyNTgxODdkZTU1YWYxZmNlN2M4MTE0YTU4MjJlMDQ2NTlmOTE1OTZiMGE5YzBmNDdhZDU3Yjk0Y2NkY2Y3ZmMyOmE3ZGIyOGUwOWU1MWU4OWI0NTFjMmQxZmRlMjFiMDE2YjY1YmE0OGNhNzMzMTA5YWFkMGQ1ZWFiZDE5MWIwMmI6NzkwYmI1MWU1OTU4MTM3YmZjMTVkOGEyY2E2OTNlZDdlZmY2NmY0ZmM0NjkxMTE0Y2YxN2JmMWZkNTFjMTJlZToxMjA1NTMyNmMyNzU0MDVhMTkyMDYyMTM3NDY5ODg4ZTFhNDk4Y2Q4MjlhNWM1MWJjMGRkY2MxODgwYTEwYmMzIgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGNwYXRoKS8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0KICAgICAgXSwKICAgICAgImRldmljZXMiOiBbXSwKICAgICAgInNhbmRib3hfcGlkbnMiOiBmYWxzZSwKICAgICAgImV4ZWNfY29tbWFuZHMiOiBbXSwKICAgICAgImVudl9tYXAiOiB7CiAgICAgICAgIkFQQUNIRV9TUEFSS19WRVJTSU9OIjogIjIuNC4zIiwKICAgICAgICAiSEFET09QX0dJVF9DT01NSVQiOiAicmVsZWFzZS0zLjIuMC1SQzEiLAogICAgICAgICJIQURPT1BfSE9NRSI6ICIvb3B0L2hhZG9vcCIsCiAgICAgICAgIkhBRE9PUF9WRVJTSU9OIjogIjMuMS4yIiwKICAgICAgICAiSE9TVE5BTUUiOiAiJChob3N0LW5hbWUpIiwKICAgICAgICAiSkFWQV9BTFBJTkVfVkVSU0lPTiI6ICI4LjIxMi4wNC1yMCIsCiAgICAgICAgIkpBVkFfSE9NRSI6ICIvdXNyL2xpYi9qdm0vamF2YS0xLjgtb3BlbmpkayIsCiAgICAgICAgIkpBVkFfVkVSU0lPTiI6ICI4dTIxMiIsCiAgICAgICAgIkxBTkciOiAiQy5VVEYtOCIsCiAgICAgICAgIlBBVEgiOiAiL3Vzci9sb2NhbC9zYmluOi91c3IvbG9jYWwvYmluOi91c3Ivc2JpbjovdXNyL2Jpbjovc2JpbjovYmluOi91c3IvbGliL2p2bS9qYXZhLTEuOC1vcGVuamRrL2pyZS9iaW46L3Vzci9saWIvanZtL2phdmEtMS44LW9wZW5qZGsvYmluOi9vcHQvc3BhcmsvYmluIiwKICAgICAgICAiU1BBUktfSE9NRSI6ICIvb3B0L3NwYXJrIgogICAgICB9CiAgICB9CiAgXSwKICAiY29tbW9uIjogewogICAgImNwYXRoIjogIi9ydW4va2F0YS1jb250YWluZXJzL3NoYXJlZC9jb250YWluZXJzIiwKICAgICJtb3VudF9zb3VyY2VfY3BhdGgiOiAiL3J1bi9rYXRhLWNvbnRhaW5lcnMvc2hhcmVkL2NvbnRhaW5lcnMiLAogICAgInNmcHJlZml4IjogIl4kKGNwYXRoKS8kKGJ1bmRsZS1pZCktW2EtejAtOV17MTZ9LSIsCiAgICAic3BhdGgiOiAiL3J1bi9rYXRhLWNvbnRhaW5lcnMvc2FuZGJveC9zdG9yYWdlIiwKICAgICJpcHY0X2EiOiAiKChbMC05XXxbMS05XVswLTldfDFbMC05XXsyfXwyWzAtNF1bMC05XXwyNVswLTVdKVxcLil7M30oWzAtOV18WzEtOV1bMC05XXwxWzAtOV17Mn18MlswLTRdWzAtOV18MjVbMC01XSkiLAogICAgImlwX3AiOiAiWzAtOV17MSw1fSIsCiAgICAic3ZjX25hbWUiOiAiW0EtWl9cXC5cXC1dKyIsCiAgICAiZG5zX2xhYmVsIjogIlthLXpBLVowLTlfXFwuXFwtXSsiLAogICAgInNfc291cmNlMSI6ICJeLi4yWzAtOV17M31fWzAtMV1bMC05XV9bMC0zXVswLTldX1swLTJdWzAtOV1fWzAtNV1bMC05XV9bMC01XVswLTldXFwuWzAtOV17MSwxMH0kIiwKICAgICJzX3NvdXJjZTIiOiAiXi4uZGF0YS8iLAogICAgImRuc19zdWJkb21haW4iOiAiXlthLXowLTldKFstYS16MC05XSpbYS16MC05XSk/JCIsCiAgICAicG9kX3VpZCI6ICJeWzAtOWEtZkEtRl17OH0tWzAtOWEtZkEtRl17NH0tWzAtOWEtZkEtRl17NH0tWzAtOWEtZkEtRl17NH0tWzAtOWEtZkEtRl17MTJ9JCIsCiAgICAiZGVmYXVsdF9jYXBzIjogWwogICAgICAiQ0FQX0NIT1dOIiwKICAgICAgIkNBUF9EQUNfT1ZFUlJJREUiLAogICAgICAiQ0FQX0ZTRVRJRCIsCiAgICAgICJDQVBfRk9XTkVSIiwKICAgICAgIkNBUF9NS05PRCIsCiAgICAgICJDQVBfTkVUX1JBVyIsCiAgICAgICJDQVBfU0VUR0lEIiwKICAgICAgIkNBUF9TRVRVSUQiLAogICAgICAiQ0FQX1NFVEZDQVAiLAogICAgICAiQ0FQX1NFVFBDQVAiLAogICAgICAiQ0FQX05FVF9CSU5EX1NFUlZJQ0UiLAogICAgICAiQ0FQX1NZU19DSFJPT1QiLAogICAgICAiQ0FQX0tJTEwiLAogICAgICAiQ0FQX0FVRElUX1dSSVRFIgogICAgXSwKICAgICJwcml2aWxlZ2VkX2NhcHMiOiBbCiAgICAgICJDQVBfQ0hPV04iLAogICAgICAiQ0FQX0RBQ19PVkVSUklERSIsCiAgICAgICJDQVBfREFDX1JFQURfU0VBUkNIIiwKICAgICAgIkNBUF9GT1dORVIiLAogICAgICAiQ0FQX0ZTRVRJRCIsCiAgICAgICJDQVBfS0lMTCIsCiAgICAgICJDQVBfU0VUR0lEIiwKICAgICAgIkNBUF9TRVRVSUQiLAogICAgICAiQ0FQX1NFVFBDQVAiLAogICAgICAiQ0FQX0xJTlVYX0lNTVVUQUJMRSIsCiAgICAgICJDQVBfTkVUX0JJTkRfU0VSVklDRSIsCiAgICAgICJDQVBfTkVUX0JST0FEQ0FTVCIsCiAgICAgICJDQVBfTkVUX0FETUlOIiwKICAgICAgIkNBUF9ORVRfUkFXIiwKICAgICAgIkNBUF9JUENfTE9DSyIsCiAgICAgICJDQVBfSVBDX09XTkVSIiwKICAgICAgIkNBUF9TWVNfTU9EVUxFIiwKICAgICAgIkNBUF9TWVNfUkFXSU8iLAogICAgICAiQ0FQX1NZU19DSFJPT1QiLAogICAgICAiQ0FQX1NZU19QVFJBQ0UiLAogICAgICAiQ0FQX1NZU19QQUNDVCIsCiAgICAgICJDQVBfU1lTX0FETUlOIiwKICAgICAgIkNBUF9TWVNfQk9PVCIsCiAgICAgICJDQVBfU1lTX05JQ0UiLAogICAgICAiQ0FQX1NZU19SRVNPVVJDRSIsCiAgICAgICJDQVBfU1lTX1RJTUUiLAogICAgICAiQ0FQX1NZU19UVFlfQ09ORklHIiwKICAgICAgIkNBUF9NS05PRCIsCiAgICAgICJDQVBfTEVBU0UiLAogICAgICAiQ0FQX0FVRElUX1dSSVRFIiwKICAgICAgIkNBUF9BVURJVF9DT05UUk9MIiwKICAgICAgIkNBUF9TRVRGQ0FQIiwKICAgICAgIkNBUF9NQUNfT1ZFUlJJREUiLAogICAgICAiQ0FQX01BQ19BRE1JTiIsCiAgICAgICJDQVBfU1lTTE9HIiwKICAgICAgIkNBUF9XQUtFX0FMQVJNIiwKICAgICAgIkNBUF9CTE9DS19TVVNQRU5EIiwKICAgICAgIkNBUF9BVURJVF9SRUFEIiwKICAgICAgIkNBUF9QRVJGTU9OIiwKICAgICAgIkNBUF9CUEYiLAogICAgICAiQ0FQX0NIRUNLUE9JTlRfUkVTVE9SRSIKICAgIF0sCiAgICAidmlydGlvX2Jsa19zdG9yYWdlX2NsYXNzZXMiOiBbCiAgICAgICJjYy1sb2NhbC1jc2kiLAogICAgICAiY2MtbWFuYWdlZC1jc2kiLAogICAgICAiY2MtbWFuYWdlZC1wcmVtaXVtLWNzaSIKICAgIF0sCiAgICAic21iX3N0b3JhZ2VfY2xhc3NlcyI6IFsKICAgICAgewogICAgICAgICJuYW1lIjogImF6dXJlZmlsZS1jc2kta2F0YS1jYyIsCiAgICAgICAgIm1vdW50X29wdGlvbnMiOiBbCiAgICAgICAgICAiZGlyX21vZGU9MDc3NyIsCiAgICAgICAgICAiZmlsZV9tb2RlPTA3NzciLAogICAgICAgICAgIm1mc3ltbGlua3MiLAogICAgICAgICAgImNhY2hlPXN0cmljdCIsCiAgICAgICAgICAibm9zaGFyZXNvY2siLAogICAgICAgICAgImFjdGltZW89MzAiLAogICAgICAgICAgIm5vYnJsIgogICAgICAgIF0KICAgICAgfQogICAgXQogIH0sCiAgInNhbmRib3giOiB7CiAgICAic3RvcmFnZXMiOiBbCiAgICAgIHsKICAgICAgICAiZHJpdmVyIjogImVwaGVtZXJhbCIsCiAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgInNvdXJjZSI6ICJzaG0iLAogICAgICAgICJmc3R5cGUiOiAidG1wZnMiLAogICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICJub2RldiIsCiAgICAgICAgICAibW9kZT0xNzc3IiwKICAgICAgICAgICJzaXplPTY3MTA4ODY0IgogICAgICAgIF0sCiAgICAgICAgIm1vdW50X3BvaW50IjogIi9ydW4va2F0YS1jb250YWluZXJzL3NhbmRib3gvc2htIiwKICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgIH0KICAgIF0KICB9LAogICJyZXF1ZXN0X2RlZmF1bHRzIjogewogICAgIkNyZWF0ZUNvbnRhaW5lclJlcXVlc3QiOiB7CiAgICAgICJhbGxvd19lbnZfcmVnZXgiOiBbCiAgICAgICAgIl5IT1NUTkFNRT0kKGRuc19sYWJlbCkkIiwKICAgICAgICAiXiQoc3ZjX25hbWUpX1BPUlRfJChpcF9wKV9UQ1A9dGNwOi8vJChpcHY0X2EpOiQoaXBfcCkkIiwKICAgICAgICAiXiQoc3ZjX25hbWUpX1BPUlRfJChpcF9wKV9UQ1BfUFJPVE89dGNwJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9QT1JUXyQoaXBfcClfVENQX1BPUlQ9JChpcF9wKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfUE9SVF8kKGlwX3ApX1RDUF9BRERSPSQoaXB2NF9hKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfU0VSVklDRV9IT1NUPSQoaXB2NF9hKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfU0VSVklDRV9QT1JUPSQoaXBfcCkkIiwKICAgICAgICAiXiQoc3ZjX25hbWUpX1NFUlZJQ0VfUE9SVF8kKGRuc19sYWJlbCk9JChpcF9wKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfUE9SVD10Y3A6Ly8kKGlwdjRfYSk6JChpcF9wKSQiLAogICAgICAgICJeQVpVUkVfQ0xJRU5UX0lEPVtBLUZhLWYwLTktXSokIiwKICAgICAgICAiXkFaVVJFX1RFTkFOVF9JRD1bQS1GYS1mMC05LV0qJCIsCiAgICAgICAgIl5BWlVSRV9GRURFUkFURURfVE9LRU5fRklMRT0vdmFyL3J1bi9zZWNyZXRzL2F6dXJlL3Rva2Vucy9henVyZS1pZGVudGl0eS10b2tlbiQiLAogICAgICAgICJeQVpVUkVfQVVUSE9SSVRZX0hPU1Q9aHR0cHM6Ly9sb2dpblxcLm1pY3Jvc29mdG9ubGluZVxcLmNvbS8kIiwKICAgICAgICAiXlRFUk09eHRlcm0kIgogICAgICBdLAogICAgICAiYWxsb3dfZW52X3JlZ2V4X21hcCI6IHsKICAgICAgICAiQ1BVX0xJTUlUIjogIl5bMC05XSskIiwKICAgICAgICAiSk9CX0NPTVBMRVRJT05fSU5ERVgiOiAiXlswLTldKiQiLAogICAgICAgICJNRU1PUllfTElNSVQiOiAiXlswLTldKyQiCiAgICAgIH0KICAgIH0sCiAgICAiQ29weUZpbGVSZXF1ZXN0IjogWwogICAgICAiJChzZnByZWZpeCkiCiAgICBdLAogICAgIkV4ZWNQcm9jZXNzUmVxdWVzdCI6IHsKICAgICAgImFsbG93ZWRfY29tbWFuZHMiOiBbXSwKICAgICAgInJlZ2V4IjogW10KICAgIH0sCiAgICAiVXBkYXRlUm91dGVzUmVxdWVzdCI6IHsKICAgICAgImZvcmJpZGRlbl9kZXZpY2VfbmFtZXMiOiBbCiAgICAgICAgImxvIgogICAgICBdLAogICAgICAiZm9yYmlkZGVuX3NvdXJjZV9yZWdleCI6IFsKICAgICAgICAiXig/OjB7MCw0fTopezAsN30wezAsM30xJCIsCiAgICAgICAgIl4xMjdcXC4oPzpbMC05XXsxLDN9XFwuKXsyfVswLTldezEsM30kIgogICAgICBdCiAgICB9LAogICAgIlVwZGF0ZUludGVyZmFjZVJlcXVlc3QiOiB7CiAgICAgICJhbGxvd19yYXdfZmxhZ3MiOiAxMjgsCiAgICAgICJmb3JiaWRkZW5fbmFtZXMiOiBbCiAgICAgICAgImxvIgogICAgICBdLAogICAgICAiZm9yYmlkZGVuX2h3X2FkZHJzIjogWwogICAgICAgICIwMDowMDowMDowMDowMDowMCIKICAgICAgXQogICAgfSwKICAgICJDbG9zZVN0ZGluUmVxdWVzdCI6IGZhbHNlLAogICAgIlJlYWRTdHJlYW1SZXF1ZXN0IjogZmFsc2UsCiAgICAiVXBkYXRlRXBoZW1lcmFsTW91bnRzUmVxdWVzdCI6IGZhbHNlLAogICAgIldyaXRlU3RyZWFtUmVxdWVzdCI6IGZhbHNlCiAgfQp9 +spec: + restartPolicy: Never + runtimeClassName: kata-cc + containers: + - name: spark + image: "mcr.microsoft.com/mmlspark/spark2.4:v4_mini" + topologySpreadConstraints: + - maxSkew: 1 + minDomains: 1 + topologyKey: kubernetes.io/hostname + whenUnsatisfiable: DoNotSchedule + labelSelector: + matchLabels: + kubernetes.azure.com/os-sku: Mariner + matchLabelKeys: + - pod-template-hash + nodeAffinityPolicy: Ignore + nodeTaintsPolicy: Ignore diff --git a/src/agent/samples/policy/yaml/pod/pod-three-containers.yaml b/src/agent/samples/policy/yaml/pod/pod-three-containers.yaml new file mode 100644 index 000000000000..9d549c8e0b56 --- /dev/null +++ b/src/agent/samples/policy/yaml/pod/pod-three-containers.yaml @@ -0,0 +1,39 @@ +--- +apiVersion: v1 +kind: Pod +metadata: + name: three-containers + labels: + run: busybox + annotations: + io.katacontainers.config.agent.policy: IyBDb3B5cmlnaHQgKGMpIDIwMjMgTWljcm9zb2Z0IENvcnBvcmF0aW9uCiMKIyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMAojCnBhY2thZ2UgYWdlbnRfcG9saWN5CgppbXBvcnQgZnV0dXJlLmtleXdvcmRzLmluCmltcG9ydCBmdXR1cmUua2V5d29yZHMuZXZlcnkKCiMgRGVmYXVsdCB2YWx1ZXMsIHJldHVybmVkIGJ5IE9QQSB3aGVuIHJ1bGVzIGNhbm5vdCBiZSBldmFsdWF0ZWQgdG8gdHJ1ZS4KZGVmYXVsdCBBZGRBUlBOZWlnaGJvcnNSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgQWRkU3dhcFJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBDbG9zZVN0ZGluUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IENvcHlGaWxlUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IENyZWF0ZUNvbnRhaW5lclJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBDcmVhdGVTYW5kYm94UmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IERlc3Ryb3lTYW5kYm94UmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgRXhlY1Byb2Nlc3NSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgR2V0T09NRXZlbnRSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBHdWVzdERldGFpbHNSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBMaXN0SW50ZXJmYWNlc1JlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBMaXN0Um91dGVzUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IE1lbUhvdHBsdWdCeVByb2JlUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IE9ubGluZUNQVU1lbVJlcXVlc3QgOj0gdHJ1ZQpkZWZhdWx0IFBhdXNlQ29udGFpbmVyUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFJlYWRTdHJlYW1SZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgUmVtb3ZlQ29udGFpbmVyUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgUmVtb3ZlU3RhbGVWaXJ0aW9mc1NoYXJlTW91bnRzUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgUmVzZWVkUmFuZG9tRGV2UmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFJlc3VtZUNvbnRhaW5lclJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBTZXRHdWVzdERhdGVUaW1lUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFNldFBvbGljeVJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBTaWduYWxQcm9jZXNzUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgU3RhcnRDb250YWluZXJSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBTdGFydFRyYWNpbmdSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgU3RhdHNDb250YWluZXJSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBTdG9wVHJhY2luZ1JlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBUdHlXaW5SZXNpemVSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBVcGRhdGVDb250YWluZXJSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgVXBkYXRlRXBoZW1lcmFsTW91bnRzUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFVwZGF0ZUludGVyZmFjZVJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBVcGRhdGVSb3V0ZXNSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgV2FpdFByb2Nlc3NSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBXcml0ZVN0cmVhbVJlcXVlc3QgOj0gZmFsc2UKCiMgQWxsb3dSZXF1ZXN0c0ZhaWxpbmdQb2xpY3kgOj0gdHJ1ZSBjb25maWd1cmVzIHRoZSBBZ2VudCB0byAqYWxsb3cgYW55CiMgcmVxdWVzdHMgY2F1c2luZyBhIHBvbGljeSBmYWlsdXJlKi4gVGhpcyBpcyBhbiB1bnNlY3VyZSBjb25maWd1cmF0aW9uCiMgYnV0IGlzIHVzZWZ1bCBmb3IgYWxsb3dpbmcgdW5zZWN1cmUgcG9kcyB0byBzdGFydCwgdGhlbiBjb25uZWN0IHRvCiMgdGhlbSBhbmQgaW5zcGVjdCBPUEEgbG9ncyBmb3IgdGhlIHJvb3QgY2F1c2Ugb2YgYSBmYWlsdXJlLgpkZWZhdWx0IEFsbG93UmVxdWVzdHNGYWlsaW5nUG9saWN5IDo9IGZhbHNlCgojIENvbnN0YW50cwpTX05BTUVfS0VZID0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZSIKU19OQU1FU1BBQ0VfS0VZID0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZXNwYWNlIgpCVU5ETEVfSUQgPSAiW2EtejAtOV17NjR9IgoKQ3JlYXRlQ29udGFpbmVyUmVxdWVzdDo9IHJlc3AgewogICAgbm90IGlzX251bGwoaW5wdXQuZW52X21hcCkKICAgIAogICAgaV9lbnZfbWFwIDo9IGlucHV0LmVudl9tYXAKICAgIAogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBwX2Vudl9tYXAgOj0gcF9jb250YWluZXIuZW52X21hcCAgCiAgICBhbGxvd19lbnZfbWFwKHBfZW52X21hcCwgaV9lbnZfbWFwKQogICAgCiAgICBpX3Byb2Nlc3MgOj0gaW5wdXQuYmFzZS5PQ0kuUHJvY2VzcwogICAgCiAgICBwX3Byb2Nlc3MgOj0gcF9jb250YWluZXIuT0NJLlByb2Nlc3MKICAgIAogICAgYWxsb3dfYXJncyhpX3Byb2Nlc3MsIHBfcHJvY2VzcywgaV9lbnZfbWFwKQoKICAgIHJlc3AgPSBDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uKGlucHV0LmJhc2UpCiAgICBwcmludCgiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdDogdHJ1ZSIpCn0KCmFsbG93X2FyZ3MoaV9wcm9jZXNzLCBwX3Byb2Nlc3MsIGlfZW52X21hcCkgewogICAgaV9hcmdzIDo9IGlfcHJvY2Vzcy5BcmdzCiAgICBwX2FyZ3MgOj0gcF9wcm9jZXNzLkFyZ3MKICAgIHByaW50KCJhbGxvd19hcmdzOiBpX2FyZ3MgPSIsIGlfYXJncywgInBfYXJncyA9IiwgcF9hcmdzKQogICAgY291bnQoaV9hcmdzKSA9PSBjb3VudChwX2FyZ3MpCiAgICBldmVyeSBpLCBpX2FyZyBpbiBpX2FyZ3MgewogICAgICAgIHByaW50KCJhbGxvd19hcmdzOiBpX2FyZyA9IiwgaV9hcmcpCiAgICAgICAgcF9hcmdfcmVwbGFjZWQgOj0gcmVwbGFjZV9lbnZfdmFyaWFibGVzKHBfYXJnc1tpXSwgaV9lbnZfbWFwKQogICAgICAgIHByaW50KCJhbGxvd19hcmdzOiBwX2FyZ19yZXBsYWNlZCA9IiwgcF9hcmdfcmVwbGFjZWQpCiAgICAgICAgcF9hcmdfcmVwbGFjZWQyIDo9IHJlcGxhY2UocF9hcmdfcmVwbGFjZWQsICIkJCIsICIkIikKICAgICAgICBwcmludCgiYWxsb3dfYXJnczogcF9hcmdfcmVwbGFjZWQyID0iLCBwX2FyZ19yZXBsYWNlZDIpCiAgICAgICAgaV9hcmcgPT0gcF9hcmdfcmVwbGFjZWQyCiAgICB9CiAgICBwcmludCgiYWxsb3dfYXJnczogdHJ1ZSIpCn0KCmFsbG93X2FyZ3MoaV9wcm9jZXNzLCBwX3Byb2Nlc3MsIGlfZW52X21hcCkgewogICAgbm90IGlfcHJvY2Vzcy5BcmdzCiAgICBub3QgcF9wcm9jZXNzLkFyZ3MKICAgIHByaW50KCJhbGxvd19hcmdzMjogbm8gYXJncyIpCn0KCiMgdGhpcyBmdW5jdGlvbiByZXBsYWNlcyBhbGwgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyBpbiBhIHN0cmluZywgZ2l2ZW4gYSBtYXAgb2YgZW52aXJvbm1lbnQga2V5cyB0byBlbnZpcm9ubWVudCB2YWx1ZXMKIyBlZyBzdHIgPSAiZWNobyAkKENMVVNURVJfSUQpOyBlY2hvICQoTk9ERV9OQU1FKTsiCiMgZW52X21hcCA9IHsiQ0xVU1RFUl9JRCI6ICJhYmMiLCAiTk9ERV9OQU1FIiA6ICJ4eXoifQojIHJlc3VsdCA9ICJlY2hvIGFiYzsgZWNobyB4eXo7IgpyZXBsYWNlX2Vudl92YXJpYWJsZXMoc3RyLCBlbnZfbWFwKSA9IHJlc3VsdCB7CiAgICAjIG1ha2UgYW4gYXJyYXkgb2YgdGhlIGtleXMgZWcgWyJDTFVTVEVSX0lEIiwgIk5PREVfTkFNRSJdCiAgICBrZXlzIDo9IFt4IHwgc29tZSB4IGluIG9iamVjdC5rZXlzKGVudl9tYXApXQogICAgcmVzdWx0IDo9IHJlcGxhY2Vfc3RyX3JlYyhzdHIsIGVudl9tYXAsIGtleXMsIGNvdW50KGtleXMpIC0gMSkKfQoKIyBiYXNlIGNhc2UKcmVwbGFjZV9zdHJfcmVjKHN0ciwgZW52X21hcCwgYXJyX2tleXMsIGkpID0gcmVzdWx0IHsKICAgIGkgPCAwCiAgICByZXN1bHQgOj0gc3RyCn0KCiMgcmVjdXJzaXZlIHN0ZXAKcmVwbGFjZV9zdHJfcmVjKHN0ciwgZW52X21hcCwgYXJyX2tleXMsIGkpID0gcmVzdWx0IHsKICAgIGkgPj0gMAogICAga2V5IDo9IGFycl9rZXlzW2ldCiAgICBlbnZfa2V5MSA6PSBjb25jYXQoIiIsIFsiJCgiLCBrZXksICIpIl0pCiAgICAjIHJlcGxhY2UgJChWQVIpIHdpdGggdmFsdWUKICAgIG5ld19zdHIxIDo9IHJlcGxhY2Uoc3RyLCBlbnZfa2V5MSwgZW52X21hcFtrZXldKQogICAgIyByZXBsYWNlIG5leHQgZW52aXJvbm1lbnQgdmFyaWFibGUKICAgIHJlc3VsdCA9IHJlcGxhY2Vfc3RyX3JlYyhuZXdfc3RyMSwgZW52X21hcCwgYXJyX2tleXMsIGkgLSAxKQp9CgphbGxvd19lbnZfbWFwKHBfZW52X21hcCwgaV9lbnZfbWFwKSB7CiAgICBwcmludCgiYWxsb3dfZW52X21hcDogcF9lbnZfbWFwID0iLCBwX2Vudl9tYXApCiAgICBldmVyeSBlbnZfa2V5LCBlbnZfdmFsIGluIGlfZW52X21hcCB7CiAgICAgICAgcHJpbnQoImFsbG93X2VudjogZW52X2tleSA9IiwgZW52X2tleSwgImVudl92YWwgPSIsIGVudl92YWwpCiAgICAgICAgYWxsb3dfZW52X21hcF9lbnRyeShlbnZfa2V5LCBlbnZfdmFsLCBwX2Vudl9tYXApCiAgICB9CiAgICBwcmludCgiYWxsb3dfZW52X21hcDogdHJ1ZSIpCn0KCiMgQWxsb3cgZXhhY3QgbWF0Y2gKYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBpX3ZhbCA9PSBwX3ZhbAogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnk6IHRydWUiKQp9CgojIEFsbG93IHJlc291cmNlRmllbGRSZWYgdmFsdWVzIChlLmcuLCAibGltaXRzLmNwdSIpLgphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgICMgYSB2YXJpYWJsZSB3ZSBzaG91bGQgYmUgdmFsaWRhdGluZyB1c2luZyBhIHJlZ2V4IGZyb20gc2V0dGluZ3MKICAgIHBfdmFsID09ICIkKHZhbGlkYXRlLWZyb20tc2V0dGluZ3MpIgogICAgcmVnZXhfdmFsIDo9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuQ3JlYXRlQ29udGFpbmVyUmVxdWVzdC5hbGxvd19lbnZfcmVnZXhfbWFwW2tleV0KICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4X3ZhbCwgaV92YWwpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSAyOiB0cnVlIikKfQoKIyBBbGxvdyBub2RlLW5hbWUKYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChub2RlLW5hbWUpIgogICAgcmVnZXgubWF0Y2gocG9saWN5X2RhdGEuY29tbW9uLmRuc19zdWJkb21haW4gLCBpX3ZhbCkKICAgIHByaW50KCJhbGxvd19lbnZfbWFwX2VudHJ5IDM6IHRydWUiKQp9CgojIEFsbG93IGhvc3QtbmFtZQphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgIHBfdmFsID09ICIkKGhvc3QtbmFtZSkiCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24uZG5zX2xhYmVsICwgaV92YWwpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSA0OiB0cnVlIikKfQoKIyBBbGxvdyBwb2QtdWlkCmFsbG93X2Vudl9tYXBfZW50cnkoa2V5LCBpX3ZhbCwgcF9lbnZfbWFwKSB7CiAgICBwX3ZhbCA6PSBwX2Vudl9tYXBba2V5XQogICAgcF92YWwgPT0gIiQocG9kLXVpZCkiCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24ucG9kX3VpZCAsIGlfdmFsKQogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgNTogdHJ1ZSIpCn0KCiMgQWxsb3cgZmllbGRSZWYgImZpZWxkUGF0aDogc3RhdHVzLnBvZElQIiB2YWx1ZXMuCmFsbG93X2Vudl9tYXBfZW50cnkoa2V5LCBpX3ZhbCwgcF9lbnZfbWFwKSB7CiAgICBpc19pcChpX3ZhbCkKCiAgICBwX3ZhbCA6PSBwX2Vudl9tYXBba2V5XQogICAgcF92YXIgOj0gY29uY2F0KCI9IiwgW2tleSwgcF92YWxdKQogICAgYWxsb3dfcG9kX2lwX3ZhcihrZXksIHBfdmFyKQogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgNjogdHJ1ZSIpCn0KCiMgQWxsb3cgZmllbGRSZWYgImZpZWxkUGF0aDogc3RhdHVzLmhvc3RJUCIgdmFsdWVzLgphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgaXNfaXAoaV92YWwpCgogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgIHBfdmFyIDo9IGNvbmNhdCgiPSIsIFtrZXksIHBfdmFsXSkKICAgIGFsbG93X2hvc3RfaXBfdmFyKGtleSwgcF92YXIpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSA3OiB0cnVlIikKfQoKIyBNYXRjaCBpbnB1dCB3aXRoIG9uZSBvZiB0aGUgcG9saWN5IHZhcmlhYmxlcywgYWZ0ZXIgc3Vic3RpdHV0aW5nICQoc2FuZGJveC1uYW1lKS4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChzYW5kYm94LW5hbWUpIgogICAgc19uYW1lIDo9IGlucHV0LmJhc2UuT0NJLkFubm90YXRpb25zW1NfTkFNRV9LRVldCiAgICBwX3ZhcjIgOj0gcmVwbGFjZShwX3ZhbCwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHBfdmFyMiA9PSBpX3ZhbAogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgODogdHJ1ZSIpCn0KCiMgTWF0Y2ggaW5wdXQgd2l0aCBvbmUgb2YgdGhlIHBvbGljeSB2YXJpYWJsZXMsIGFmdGVyIHN1YnN0aXR1dGluZyAkKHNhbmRib3gtbmFtZXNwYWNlKS4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChzYW5kYm94LW5hbWVzcGFjZSkiCiAgICBzX25hbWVzcGFjZSA6PSBpbnB1dC5iYXNlLk9DSS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwX3ZhcjIgOj0gcmVwbGFjZShwX3ZhbCwgIiQoc2FuZGJveC1uYW1lc3BhY2UpIiwgc19uYW1lc3BhY2UpCiAgICBwX3ZhcjIgPT0gaV92YWwKICAgIHByaW50KCJhbGxvd19lbnZfbWFwX2VudHJ5IDk6IHRydWUiKQp9CgojIEFsbG93IGlucHV0IGVudiB2YXJpYWJsZXMgdGhhdCBtYXRjaCB3aXRoIGEgcmVxdWVzdF9kZWZhdWx0cyByZWdleC4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHNvbWUgcF9yZWdleDEgaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5DcmVhdGVDb250YWluZXJSZXF1ZXN0LmFsbG93X2Vudl9yZWdleAogICAgcF9yZWdleDIgOj0gcmVwbGFjZShwX3JlZ2V4MSwgIiQoaXB2NF9hKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcHY0X2EpCiAgICBwX3JlZ2V4MyA6PSByZXBsYWNlKHBfcmVnZXgyLCAiJChpcF9wKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcF9wKQogICAgcF9yZWdleDQgOj0gcmVwbGFjZShwX3JlZ2V4MywgIiQoc3ZjX25hbWUpIiwgcG9saWN5X2RhdGEuY29tbW9uLnN2Y19uYW1lKQogICAgcF9yZWdleDUgOj0gcmVwbGFjZShwX3JlZ2V4NCwgIiQoZG5zX2xhYmVsKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5kbnNfbGFiZWwpCgogICAgcmVzdWx0IDo9IGNvbmNhdCgiPSIsIFtrZXksIGlfdmFsXSkKICAgIHJlZ2V4Lm1hdGNoKHBfcmVnZXg1LCByZXN1bHQpCgogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgMTA6IHRydWUiKQp9CgpDcmVhdGVDb250YWluZXJSZXF1ZXN0Oj0gcmVzcCB7CiAgICBub3QgaW5wdXQuZW52X21hcAogICAgaV9wcm9jZXNzID0gaW5wdXQuT0NJLlByb2Nlc3MKICAgIHNfbmFtZSA9IGlucHV0Lk9DSS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBwX3Byb2Nlc3MgPSBwX2NvbnRhaW5lci5PQ0kuUHJvY2VzcwogICAgYWxsb3dfZGVwcmVjYXRlZF9hcmdzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUpCiAgICByZXNwID0gQ3JlYXRlQ29udGFpbmVyUmVxdWVzdENvbW1vbihpbnB1dCkKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0MjogdHJ1ZSIpCn0KCkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb24ocmVxKTo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgICMgQ2hlY2sgaWYgdGhlIGlucHV0IHJlcXVlc3Qgc2hvdWxkIGJlIHJlamVjdGVkIGV2ZW4gYmVmb3JlIGNoZWNraW5nIHRoZQogICAgIyBwb2xpY3lfZGF0YS5jb250YWluZXJzIGluZm9ybWF0aW9uLgogICAgYWxsb3dfY3JlYXRlX2NvbnRhaW5lcl9pbnB1dChyZXEpCgogICAgaV9vY2kgOj0gcmVxLk9DSQogICAgaV9zdG9yYWdlcyA6PSByZXEuc3RvcmFnZXMKICAgIGlfZGV2aWNlcyA6PSByZXEuZGV2aWNlcwoKICAgICMgYXJyYXkgb2YgcG9zc2libGUgc3RhdGUgb3BlcmF0aW9ucwogICAgb3BzX2J1aWxkZXIgOj0gW10KCiAgICAjIGNoZWNrIHNhbmRib3ggbmFtZQogICAgc2FuZGJveF9uYW1lID0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FX0tFWV0KICAgIGFkZF9zYW5kYm94X25hbWVfdG9fc3RhdGUgOj0gc3RhdGVfYWxsb3dzKCJzYW5kYm94X25hbWUiLCBzYW5kYm94X25hbWUpCiAgICBvcHNfYnVpbGRlcjEgOj0gY29uY2F0X29wX2lmX25vdF9udWxsKG9wc19idWlsZGVyLCBhZGRfc2FuZGJveF9uYW1lX3RvX3N0YXRlKQoKICAgICMgQ2hlY2sgaWYgYW55IGVsZW1lbnQgZnJvbSB0aGUgcG9saWN5X2RhdGEuY29udGFpbmVycyBhcnJheSBhbGxvd3MgdGhlIGlucHV0IHJlcXVlc3QuCiAgICBzb21lIHBfY29udGFpbmVyIGluIHBvbGljeV9kYXRhLmNvbnRhaW5lcnMKICAgIHByaW50KCI9PT09PT09PSBDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiB0cnlpbmcgbmV4dCBwb2xpY3kgY29udGFpbmVyIikKCiAgICBwX3BpZG5zIDo9IHBfY29udGFpbmVyLnNhbmRib3hfcGlkbnMKICAgIGlfcGlkbnMgOj0gcmVxLnNhbmRib3hfcGlkbnMKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiBwX3BpZG5zID0iLCBwX3BpZG5zLCAiaV9waWRucyA9IiwgaV9waWRucykKICAgIHBfcGlkbnMgPT0gaV9waWRucwoKICAgIHBfb2NpIDo9IHBfY29udGFpbmVyLk9DSQoKICAgICMgY2hlY2sgbmFtZXNwYWNlCiAgICBwX25hbWVzcGFjZSA6PSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBpX25hbWVzcGFjZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwcmludCAoIkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb246IHBfbmFtZXNwYWNlID0iLCBwX25hbWVzcGFjZSwgImlfbmFtZXNwYWNlID0iLCBpX25hbWVzcGFjZSkKICAgIGFkZF9uYW1lc3BhY2VfdG9fc3RhdGUgOj0gYWxsb3dfbmFtZXNwYWNlKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkKICAgIG9wc19idWlsZGVyMiA6PSBjb25jYXRfb3BfaWZfbm90X251bGwob3BzX2J1aWxkZXIxLCBhZGRfbmFtZXNwYWNlX3RvX3N0YXRlKQoKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiBwIFZlcnNpb24gPSIsIHBfb2NpLlZlcnNpb24sICJpIFZlcnNpb24gPSIsIGlfb2NpLlZlcnNpb24pCiAgICBwX29jaS5WZXJzaW9uID09IGlfb2NpLlZlcnNpb24KCiAgICBwcmludCgiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdENvbW1vbjogcCBSZWFkb25seSA9IiwgcF9vY2kuUm9vdC5SZWFkb25seSwgImkgUmVhZG9ubHkgPSIsIGlfb2NpLlJvb3QuUmVhZG9ubHkpCiAgICBwX29jaS5Sb290LlJlYWRvbmx5ID09IGlfb2NpLlJvb3QuUmVhZG9ubHkKCiAgICBhbGxvd19hbm5vKHBfb2NpLCBpX29jaSkKCiAgICBwX3N0b3JhZ2VzIDo9IHBfY29udGFpbmVyLnN0b3JhZ2VzCiAgICBhbGxvd19ieV9hbm5vKHBfb2NpLCBpX29jaSwgcF9zdG9yYWdlcywgaV9zdG9yYWdlcykKCiAgICBwX2RldmljZXMgOj0gcF9jb250YWluZXIuZGV2aWNlcwogICAgYWxsb3dfZGV2aWNlcyhwX2RldmljZXMsIGlfZGV2aWNlcykKCiAgICByZXQgOj0gYWxsb3dfbGludXgob3BzX2J1aWxkZXIyLCBwX29jaSwgaV9vY2kpCiAgICByZXQuYWxsb3dlZAoKICAgIG9wcyA6PSByZXQub3BzCgogICAgcHJpbnQoIkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb246IHRydWUiKQp9CgphbGxvd19jcmVhdGVfY29udGFpbmVyX2lucHV0KHJlcSkgewogICAgcHJpbnQoImFsbG93X2NyZWF0ZV9jb250YWluZXJfaW5wdXQ6IGlucHV0ID0iLCByZXEpCgogICAgY291bnQocmVxLnNoYXJlZF9tb3VudHMpID09IDAKICAgIGlzX251bGwocmVxLnN0cmluZ191c2VyKQoKICAgIGlfb2NpIDo9IHJlcS5PQ0kKICAgIGlzX251bGwoaV9vY2kuSG9va3MpCiAgICBpc19udWxsKGlfb2NpLlNvbGFyaXMpCiAgICBpc19udWxsKGlfb2NpLldpbmRvd3MpCgogICAgaV9saW51eCA6PSBpX29jaS5MaW51eAogICAgY291bnQoaV9saW51eC5HSURNYXBwaW5ncykgPT0gMAogICAgY291bnQoaV9saW51eC5Nb3VudExhYmVsKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlJlc291cmNlcy5EZXZpY2VzKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlJvb3Rmc1Byb3BhZ2F0aW9uKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlVJRE1hcHBpbmdzKSA9PSAwCiAgICBpc19udWxsKGlfbGludXguSW50ZWxSZHQpCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLkJsb2NrSU8pCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLk5ldHdvcmspCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLlBpZHMpCiAgICBpc19udWxsKGlfbGludXguU2VjY29tcCkKCiAgICBpX3Byb2Nlc3MgOj0gaV9vY2kuUHJvY2VzcwogICAgY291bnQoaV9wcm9jZXNzLlNlbGludXhMYWJlbCkgPT0gMAogICAgY291bnQoaV9wcm9jZXNzLlVzZXIuVXNlcm5hbWUpID09IDAKCiAgICBwcmludCgiYWxsb3dfY3JlYXRlX2NvbnRhaW5lcl9pbnB1dDogdHJ1ZSIpCn0KCmFsbG93X25hbWVzcGFjZShwX25hbWVzcGFjZSwgaV9uYW1lc3BhY2UpID0gYWRkX25hbWVzcGFjZSB7CiAgICBwX25hbWVzcGFjZSA9PSBpX25hbWVzcGFjZQogICAgYWRkX25hbWVzcGFjZSA6PSBudWxsCiAgICBwcmludCgiYWxsb3dfbmFtZXNwYWNlIDE6IGlucHV0IG5hbWVzcGFjZSBtYXRjaGVzIHBvbGljeSBkYXRhIikKfQoKYWxsb3dfbmFtZXNwYWNlKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkgPSBhZGRfbmFtZXNwYWNlIHsKICAgIHBfbmFtZXNwYWNlID09ICIiCiAgICBwcmludCgiYWxsb3dfbmFtZXNwYWNlIDI6IG5vIG5hbWVzcGFjZSBmb3VuZCBvbiBwb2xpY3kgZGF0YSIpCiAgICBhZGRfbmFtZXNwYWNlIDo9IHN0YXRlX2FsbG93cygibmFtZXNwYWNlIiwgaV9uYW1lc3BhY2UpCn0KCiMgdmFsdWUgaGFzbid0IGJlZW4gc2VlbiBiZWZvcmUsIHNhdmUgaXQgdG8gc3RhdGUKc3RhdGVfYWxsb3dzKGtleSwgdmFsdWUpID0gYWN0aW9uIHsKICBzdGF0ZSA6PSBnZXRfc3RhdGUoKQogIHByaW50KCJzdGF0ZV9hbGxvd3MgMTogc3RhdGVba2V5XSA9Iiwgc3RhdGVba2V5XSwgInZhbHVlID0iLCB2YWx1ZSkKICBub3Qgc3RhdGVba2V5XQogIHByaW50KCJzdGF0ZV9hbGxvd3MgMTogc2F2aW5nIHRvIHN0YXRlIGtleSA9Iiwga2V5LCAidmFsdWUgPSIsIHZhbHVlKQogIHBhdGggOj0gZ2V0X3N0YXRlX3BhdGgoa2V5KSAKICBhY3Rpb24gOj0gewogICAgIm9wIjogImFkZCIsCiAgICAicGF0aCI6IHBhdGgsIAogICAgInZhbHVlIjogdmFsdWUsCiAgfQp9CgojIHZhbHVlIG1hdGNoZXMgd2hhdCdzIGluIHN0YXRlLCBhbGxvdyBpdApzdGF0ZV9hbGxvd3Moa2V5LCB2YWx1ZSkgPSBhY3Rpb24gewogIHByaW50KCJzdGF0ZV9hbGxvd3MgMjogc3RhcnQiKQogIHN0YXRlIDo9IGdldF9zdGF0ZSgpCiAgcHJpbnQoInN0YXRlX2FsbG93cyAyOiBzdGF0ZVtrZXldID0iLCBzdGF0ZVtrZXldLCAidmFsdWUgPSIsIHZhbHVlKQogIHZhbHVlID09IHN0YXRlW2tleV0KICBwcmludCgic3RhdGVfYWxsb3dzIDI6IGZvdW5kIGtleSA9Iiwga2V5LCAidmFsdWUgPSIsIHZhbHVlLCAiIGluIHN0YXRlIikKICBhY3Rpb24gOj0gbnVsbAp9CgojIGhlbHBlciBmdW5jdGlvbnMgdG8gaW50ZXJhY3Qgd2l0aCB0aGUgc3RhdGUKZ2V0X3N0YXRlKCkgPSBzdGF0ZSB7CiAgc3RhdGUgOj0gZGF0YVsicHN0YXRlIl0KfQoKZ2V0X3N0YXRlX3ZhbChrZXkpID0gdmFsdWUgewogICAgc3RhdGUgOj0gZ2V0X3N0YXRlKCkKICAgIHZhbHVlIDo9IHN0YXRlW2tleV0KfQoKZ2V0X3N0YXRlX3BhdGgoa2V5KSA9IHBhdGggewogICAgIyBwcmVwZW5kICIvcHN0YXRlLyIgdG8ga2V5CiAgICBwYXRoIDo9IGNvbmNhdCgiLyIsIFsiL3BzdGF0ZSIsIGtleV0pCn0KCiMgSGVscGVyIGZ1bmN0aW9ucyB0byBjb25kaXRpb25hbGx5IGNvbmNhdGVuYXRlIG9wIGlzIG5vdCBudWxsCmNvbmNhdF9vcF9pZl9ub3RfbnVsbChvcHMsIG9wKSA9IHJlc3VsdCB7CiAgICBvcCA9PSBudWxsCiAgICByZXN1bHQgOj0gb3BzCn0KCmNvbmNhdF9vcF9pZl9ub3RfbnVsbChvcHMsIG9wKSA9IHJlc3VsdCB7CiAgICBvcCAhPSBudWxsCiAgICByZXN1bHQgOj0gYXJyYXkuY29uY2F0KG9wcywgW29wXSkKfQoKIyBSZWplY3QgdW5leHBlY3RlZCBhbm5vdGF0aW9ucy4KYWxsb3dfYW5ubyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19hbm5vIDE6IHN0YXJ0IikKCiAgICBub3QgaV9vY2kuQW5ub3RhdGlvbnMKCiAgICBwcmludCgiYWxsb3dfYW5ubyAxOiB0cnVlIikKfQphbGxvd19hbm5vKHBfb2NpLCBpX29jaSkgewogICAgcHJpbnQoImFsbG93X2Fubm8gMjogcCBBbm5vdGF0aW9ucyA9IiwgcF9vY2kuQW5ub3RhdGlvbnMpCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiBpIEFubm90YXRpb25zID0iLCBpX29jaS5Bbm5vdGF0aW9ucykKCiAgICBpX2tleXMgOj0gb2JqZWN0LmtleXMoaV9vY2kuQW5ub3RhdGlvbnMpCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiBpIGtleXMgPSIsIGlfa2V5cykKCiAgICBldmVyeSBpX2tleSBpbiBpX2tleXMgewogICAgICAgIGFsbG93X2Fubm9fa2V5KGlfa2V5LCBwX29jaSkKICAgIH0KCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiB0cnVlIikKfQoKYWxsb3dfYW5ub19rZXkoaV9rZXksIHBfb2NpKSB7CiAgICBwcmludCgiYWxsb3dfYW5ub19rZXkgMTogaSBrZXkgPSIsIGlfa2V5KQoKICAgIHN0YXJ0c3dpdGgoaV9rZXksICJpby5rdWJlcm5ldGVzLmNyaS4iKQoKICAgIHByaW50KCJhbGxvd19hbm5vX2tleSAxOiB0cnVlIikKfQphbGxvd19hbm5vX2tleShpX2tleSwgcF9vY2kpIHsKICAgIHByaW50KCJhbGxvd19hbm5vX2tleSAyOiBpIGtleSA9IiwgaV9rZXkpCgogICAgc29tZSBwX2tleSwgXyBpbiBwX29jaS5Bbm5vdGF0aW9ucwogICAgcF9rZXkgPT0gaV9rZXkKCiAgICBwcmludCgiYWxsb3dfYW5ub19rZXkgMjogdHJ1ZSIpCn0KCiMgR2V0IHRoZSB2YWx1ZSBvZiB0aGUgU19OQU1FX0tFWSBhbm5vdGF0aW9uIGFuZAojIGNvcnJlbGF0ZSBpdCB3aXRoIG90aGVyIGFubm90YXRpb25zIGFuZCBwcm9jZXNzIGZpZWxkcy4KYWxsb3dfYnlfYW5ubyhwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpIHsKICAgIHByaW50KCJhbGxvd19ieV9hbm5vIDE6IHN0YXJ0IikKCiAgICBub3QgcF9vY2kuQW5ub3RhdGlvbnNbU19OQU1FX0tFWV0KCiAgICBpX3NfbmFtZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMTogaV9zX25hbWUgPSIsIGlfc19uYW1lKQoKICAgIGlfc19uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FU1BBQ0VfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMTogaV9zX25hbWVzcGFjZSA9IiwgaV9zX25hbWVzcGFjZSkKCiAgICBhbGxvd19ieV9zYW5kYm94X25hbWUocF9vY2ksIGlfb2NpLCBwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBpX3NfbmFtZSwgaV9zX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfYnlfYW5ubyAxOiB0cnVlIikKfQphbGxvd19ieV9hbm5vKHBfb2NpLCBpX29jaSwgcF9zdG9yYWdlcywgaV9zdG9yYWdlcykgewogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMjogc3RhcnQiKQoKICAgIHBfc19uYW1lIDo9IHBfb2NpLkFubm90YXRpb25zW1NfTkFNRV9LRVldCiAgICBpX3NfbmFtZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMjogaV9zX25hbWUgPSIsIGlfc19uYW1lLCAicF9zX25hbWUgPSIsIHBfc19uYW1lKQoKICAgIGFsbG93X3NhbmRib3hfbmFtZShwX3NfbmFtZSwgaV9zX25hbWUpCgogICAgaV9zX25hbWVzcGFjZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwcmludCgiYWxsb3dfYnlfYW5ubyAyOiBpX3NfbmFtZXNwYWNlID0iLCBpX3NfbmFtZXNwYWNlKQoKICAgIGFsbG93X2J5X3NhbmRib3hfbmFtZShwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMsIGlfc19uYW1lLCBpX3NfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd19ieV9hbm5vIDI6IHRydWUiKQp9CgphbGxvd19ieV9zYW5kYm94X25hbWUocF9vY2ksIGlfb2NpLCBwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfYnlfc2FuZGJveF9uYW1lOiBzdGFydCIpCgogICAgaV9uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FU1BBQ0VfS0VZXQoKICAgIGFsbG93X2J5X2NvbnRhaW5lcl90eXBlcyhwX29jaSwgaV9vY2ksIHNfbmFtZSwgaV9uYW1lc3BhY2UpCiAgICBhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZChwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpCiAgICBhbGxvd19wcm9jZXNzKHBfb2NpLlByb2Nlc3MsIGlfb2NpLlByb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpCgogICAgcHJpbnQoImFsbG93X2J5X3NhbmRib3hfbmFtZTogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfbmFtZShwX3NfbmFtZSwgaV9zX25hbWUpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X25hbWU6IHN0YXJ0IikKICAgIHJlZ2V4Lm1hdGNoKHBfc19uYW1lLCBpX3NfbmFtZSkKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9uYW1lOiB0cnVlIikKfQoKIyBDaGVjayB0aGF0IHRoZSAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLXR5cGUiIGFuZAojICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIiBhbm5vdGF0aW9ucyBkZXNpZ25hdGUgdGhlCiMgZXhwZWN0ZWQgdHlwZSAtIGVpdGhlciBhICJzYW5kYm94IiBvciBhICJjb250YWluZXIiLiBUaGVuLCB2YWxpZGF0ZQojIG90aGVyIGFubm90YXRpb25zIGJhc2VkIG9uIHRoZSBhY3R1YWwgInNhbmRib3giIG9yICJjb250YWluZXIiIHZhbHVlCiMgZnJvbSB0aGUgaW5wdXQgY29udGFpbmVyLgphbGxvd19ieV9jb250YWluZXJfdHlwZXMocF9vY2ksIGlfb2NpLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfYnlfY29udGFpbmVyX3R5cGVzOiBjaGVja2luZyBpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSIpCgogICAgY190eXBlIDo9ICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSIKICAgIAogICAgcF9jcmlfdHlwZSA6PSBwX29jaS5Bbm5vdGF0aW9uc1tjX3R5cGVdCiAgICBpX2NyaV90eXBlIDo9IGlfb2NpLkFubm90YXRpb25zW2NfdHlwZV0KICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZXM6IHBfY3JpX3R5cGUgPSIsIHBfY3JpX3R5cGUsICJpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgcF9jcmlfdHlwZSA9PSBpX2NyaV90eXBlCgogICAgYWxsb3dfYnlfY29udGFpbmVyX3R5cGUoaV9jcmlfdHlwZSwgcF9vY2ksIGlfb2NpLCBzX25hbWUsIHNfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZXM6IHRydWUiKQp9CgphbGxvd19ieV9jb250YWluZXJfdHlwZShpX2NyaV90eXBlLCBwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAxOiBpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgaV9jcmlfdHlwZSA9PSAic2FuZGJveCIKCiAgICBpX2thdGFfdHlwZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1siaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5jb250YWluZXJfdHlwZSJdCiAgICBwcmludCgiYWxsb3dfYnlfY29udGFpbmVyX3R5cGUgMTogaV9rYXRhX3R5cGUgPSIsIGlfa2F0YV90eXBlKQogICAgaV9rYXRhX3R5cGUgPT0gInBvZF9zYW5kYm94IgoKICAgIGFsbG93X3NhbmRib3hfY29udGFpbmVyX25hbWUocF9vY2ksIGlfb2NpKQogICAgYWxsb3dfc2FuZGJveF9uZXRfbmFtZXNwYWNlKHBfb2NpLCBpX29jaSkKICAgIGFsbG93X3NhbmRib3hfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpCgogICAgcHJpbnQoImFsbG93X2J5X2NvbnRhaW5lcl90eXBlIDE6IHRydWUiKQp9CgphbGxvd19ieV9jb250YWluZXJfdHlwZShpX2NyaV90eXBlLCBwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiBpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgaV9jcmlfdHlwZSA9PSAiY29udGFpbmVyIgoKICAgIGlfa2F0YV90eXBlIDo9IGlfb2NpLkFubm90YXRpb25zWyJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIl0KICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiBpX2thdGFfdHlwZSA9IiwgaV9rYXRhX3R5cGUpCiAgICBpX2thdGFfdHlwZSA9PSAicG9kX2NvbnRhaW5lciIKCiAgICBhbGxvd19jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpCiAgICBhbGxvd19uZXRfbmFtZXNwYWNlKHBfb2NpLCBpX29jaSkKICAgIGFsbG93X2xvZ19kaXJlY3RvcnkocF9vY2ksIGlfb2NpKQoKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiB0cnVlIikKfQoKIyAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLW5hbWUiIGFubm90YXRpb24KYWxsb3dfc2FuZGJveF9jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X2NvbnRhaW5lcl9uYW1lOiBzdGFydCIpCgogICAgY29udGFpbmVyX2Fubm90YXRpb25fbWlzc2luZyhwX29jaSwgaV9vY2ksICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItbmFtZSIpCgogICAgcHJpbnQoImFsbG93X3NhbmRib3hfY29udGFpbmVyX25hbWU6IHRydWUiKQp9CgphbGxvd19jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19jb250YWluZXJfbmFtZTogc3RhcnQiKQoKICAgIGFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uKHBfb2NpLCBpX29jaSwgImlvLmt1YmVybmV0ZXMuY3JpLmNvbnRhaW5lci1uYW1lIikKCiAgICBwcmludCgiYWxsb3dfY29udGFpbmVyX25hbWU6IHRydWUiKQp9Cgpjb250YWluZXJfYW5ub3RhdGlvbl9taXNzaW5nKHBfb2NpLCBpX29jaSwga2V5KSB7CiAgICBwcmludCgiY29udGFpbmVyX2Fubm90YXRpb25fbWlzc2luZzoiLCBrZXkpCgogICAgbm90IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIG5vdCBpX29jaS5Bbm5vdGF0aW9uc1trZXldCgogICAgcHJpbnQoImNvbnRhaW5lcl9hbm5vdGF0aW9uX21pc3Npbmc6IHRydWUiKQp9CgphbGxvd19jb250YWluZXJfYW5ub3RhdGlvbihwX29jaSwgaV9vY2ksIGtleSkgewogICAgcHJpbnQoImFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uOiBrZXkgPSIsIGtleSkKCiAgICBwX3ZhbHVlIDo9IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIGlfdmFsdWUgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgcHJpbnQoImFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uOiBwX3ZhbHVlID0iLCBwX3ZhbHVlLCAiaV92YWx1ZSA9IiwgaV92YWx1ZSkKCiAgICBwX3ZhbHVlID09IGlfdmFsdWUKCiAgICBwcmludCgiYWxsb3dfY29udGFpbmVyX2Fubm90YXRpb246IHRydWUiKQp9CgojICJuZXJkY3RsL25ldHdvcmstbmFtZXNwYWNlIiBhbm5vdGF0aW9uCmFsbG93X3NhbmRib3hfbmV0X25hbWVzcGFjZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X25ldF9uYW1lc3BhY2U6IHN0YXJ0IikKCiAgICBrZXkgOj0gIm5lcmRjdGwvbmV0d29yay1uYW1lc3BhY2UiCgogICAgcF9uYW1lc3BhY2UgOj0gcF9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgaV9uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgcHJpbnQoImFsbG93X3NhbmRib3hfbmV0X25hbWVzcGFjZTogcF9uYW1lc3BhY2UgPSIsIHBfbmFtZXNwYWNlLCAiaV9uYW1lc3BhY2UgPSIsIGlfbmFtZXNwYWNlKQoKICAgIHJlZ2V4Lm1hdGNoKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9uZXRfbmFtZXNwYWNlOiB0cnVlIikKfQoKYWxsb3dfbmV0X25hbWVzcGFjZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19uZXRfbmFtZXNwYWNlOiBzdGFydCIpCgogICAga2V5IDo9ICJuZXJkY3RsL25ldHdvcmstbmFtZXNwYWNlIgoKICAgIG5vdCBwX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICBub3QgaV9vY2kuQW5ub3RhdGlvbnNba2V5XQoKICAgIHByaW50KCJhbGxvd19uZXRfbmFtZXNwYWNlOiB0cnVlIikKfQoKIyAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1sb2ctZGlyZWN0b3J5IiBhbm5vdGF0aW9uCmFsbG93X3NhbmRib3hfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X2xvZ19kaXJlY3Rvcnk6IHN0YXJ0IikKCiAgICBrZXkgOj0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbG9nLWRpcmVjdG9yeSIKCiAgICBwX2RpciA6PSBwX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICByZWdleDEgOj0gcmVwbGFjZShwX2RpciwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHJlZ2V4MiA6PSByZXBsYWNlKHJlZ2V4MSwgIiQoc2FuZGJveC1uYW1lc3BhY2UpIiwgc19uYW1lc3BhY2UpCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiByZWdleDIgPSIsIHJlZ2V4MikKCiAgICBpX2RpciA6PSBpX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiBpX2RpciA9IiwgaV9kaXIpCgogICAgcmVnZXgubWF0Y2gocmVnZXgyLCBpX2RpcikKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiB0cnVlIikKfQoKYWxsb3dfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19sb2dfZGlyZWN0b3J5OiBzdGFydCIpCgogICAga2V5IDo9ICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWxvZy1kaXJlY3RvcnkiCgogICAgbm90IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIG5vdCBpX29jaS5Bbm5vdGF0aW9uc1trZXldCgogICAgcHJpbnQoImFsbG93X2xvZ19kaXJlY3Rvcnk6IHRydWUiKQp9CgphbGxvd19kZXZpY2VzKHBfZGV2aWNlcywgaV9kZXZpY2VzKSB7CiAgICBwcmludCgiYWxsb3dfZGV2aWNlczogc3RhcnQiKQogICAgZXZlcnkgaV9kZXZpY2UgaW4gaV9kZXZpY2VzIHsKICAgICAgICBwcmludCgiYWxsb3dfZGV2aWNlczogaV9kZXZpY2UgPSIsIGlfZGV2aWNlKQogICAgICAgIHNvbWUgcF9kZXZpY2UgaW4gcF9kZXZpY2VzCiAgICAgICAgcF9kZXZpY2UuY29udGFpbmVyX3BhdGggPT0gaV9kZXZpY2UuY29udGFpbmVyX3BhdGgKICAgIH0KICAgIHByaW50KCJhbGxvd19kZXZpY2VzOiB0cnVlIikKfQoKYWxsb3dfbGludXgoc3RhdGVfb3BzLCBwX29jaSwgaV9vY2kpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIHBfbmFtZXNwYWNlcyA6PSBwX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbGludXg6IHAgbmFtZXNwYWNlcyA9IiwgcF9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlcyA6PSBpX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbGludXg6IGkgbmFtZXNwYWNlcyA9IiwgaV9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlX3dpdGhvdXRfbmV0d29yayA6PSBbb2JqIHwgb2JqIDo9IGlfbmFtZXNwYWNlc1tfXTsgb2JqLlR5cGUgIT0gIm5ldHdvcmsiXQoKICAgIHByaW50KCJhbGxvd19saW51eDogaV9uYW1lc3BhY2Vfd2l0aG91dF9uZXR3b3JrID0iLCBpX25hbWVzcGFjZV93aXRob3V0X25ldHdvcmspCgogICAgcF9uYW1lc3BhY2VzID09IGlfbmFtZXNwYWNlX3dpdGhvdXRfbmV0d29yawoKICAgIGFsbG93X21hc2tlZF9wYXRocyhwX29jaSwgaV9vY2kpCiAgICBhbGxvd19yZWFkb25seV9wYXRocyhwX29jaSwgaV9vY2kpCiAgICBhbGxvd19saW51eF9kZXZpY2VzKHBfb2NpLkxpbnV4LkRldmljZXMsIGlfb2NpLkxpbnV4LkRldmljZXMpCiAgICBhbGxvd19saW51eF9zeXNjdGwocF9vY2kuTGludXgsIGlfb2NpLkxpbnV4KQogICAgcmV0IDo9IGFsbG93X25ldHdvcmtfbmFtZXNwYWNlX3N0YXJ0KHN0YXRlX29wcywgcF9vY2ksIGlfb2NpKQogICAgcmV0LmFsbG93ZWQKCiAgICBvcHMgOj0gcmV0Lm9wcwoKICAgIHByaW50KCJhbGxvd19saW51eDogdHJ1ZSIpCn0KCiMgUmV0cmlldmUgdGhlICJuZXR3b3JrIiBuYW1lc3BhY2UgZnJvbSB0aGUgaW5wdXQgZGF0YSBhbmQgcGFzcyBpdCBvbiBmb3IgdGhlCiMgbmV0d29yayBuYW1lc3BhY2UgcG9saWN5IGNoZWNrcy4KYWxsb3dfbmV0d29ya19uYW1lc3BhY2Vfc3RhcnQoc3RhdGVfb3BzLCBwX29jaSwgaV9vY2kpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIHByaW50KCJhbGxvd19uZXR3b3JrX25hbWVzcGFjZSBzdGFydDogc3RhcnQiKQoKICAgIHBfbmFtZXNwYWNlcyA6PSBwX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IHAgbmFtZXNwYWNlcyA9IiwgcF9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlcyA6PSBpX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IGkgbmFtZXNwYWNlcyA9IiwgaV9uYW1lc3BhY2VzKQoKICAgICMgUmV0dXJuIHBhdGggb2YgdGhlICJuZXR3b3JrIiBuYW1lc3BhY2UKICAgIG5ldHdvcmtfbnMgOj0gW29iaiB8IG9iaiA6PSBpX25hbWVzcGFjZXNbX107IG9iai5UeXBlID09ICJuZXR3b3JrIl0KCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IG5ldHdvcmtfbnMgPSIsIG5ldHdvcmtfbnMpCgogICAgcmV0IDo9IGFsbG93X25ldHdvcmtfbmFtZXNwYWNlKHN0YXRlX29wcywgbmV0d29ya19ucykKICAgIHJldC5hbGxvd2VkCgogICAgb3BzIDo9IHJldC5vcHMKfQoKIyBUaGlzIHJ1bGUgaXMgd2hlbiB0aGVyZSdzIG5vIG5ldHdvcmsgbmFtZXNwYWNlIGluIHRoZSBpbnB1dCBkYXRhLgphbGxvd19uZXR3b3JrX25hbWVzcGFjZShzdGF0ZV9vcHMsIG5ldHdvcmtfbnMpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIGNvdW50KG5ldHdvcmtfbnMpID09IDAKCiAgICBuZXR3b3JrX25zX3BhdGggPSAiIgoKICAgIGFkZF9uZXR3b3JrX25hbWVzcGFjZV90b19zdGF0ZSA6PSBzdGF0ZV9hbGxvd3MoIm5ldHdvcmtfbmFtZXNwYWNlIiwgbmV0d29ya19uc19wYXRoKQogICAgb3BzIDo9IGNvbmNhdF9vcF9pZl9ub3RfbnVsbChzdGF0ZV9vcHMsIGFkZF9uZXR3b3JrX25hbWVzcGFjZV90b19zdGF0ZSkKCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2UgMTogdHJ1ZSIpCn0KCiMgVGhpcyBydWxlIGlzIHdoZW4gdGhlcmUncyBleGFjdGx5IG9uZSBuZXR3b3JrIG5hbWVzcGFjZSBpbiB0aGUgaW5wdXQgZGF0YS4KYWxsb3dfbmV0d29ya19uYW1lc3BhY2Uoc3RhdGVfb3BzLCBuZXR3b3JrX25zKSA6PSB7Im9wcyI6IG9wcywgImFsbG93ZWQiOiB0cnVlfSB7CiAgICBjb3VudChuZXR3b3JrX25zKSA9PSAxCgogICAgYWRkX25ldHdvcmtfbmFtZXNwYWNlX3RvX3N0YXRlIDo9IHN0YXRlX2FsbG93cygibmV0d29ya19uYW1lc3BhY2UiLCBuZXR3b3JrX25zWzBdLlBhdGgpCiAgICBvcHMgOj0gY29uY2F0X29wX2lmX25vdF9udWxsKHN0YXRlX29wcywgYWRkX25ldHdvcmtfbmFtZXNwYWNlX3RvX3N0YXRlKQoKICAgIHByaW50KCJhbGxvd19uZXR3b3JrX25hbWVzcGFjZSAyOiB0cnVlIikKfQoKYWxsb3dfbWFza2VkX3BhdGhzKHBfb2NpLCBpX29jaSkgewogICAgcF9wYXRocyA6PSBwX29jaS5MaW51eC5NYXNrZWRQYXRocwogICAgcHJpbnQoImFsbG93X21hc2tlZF9wYXRocyAxOiBwX3BhdGhzID0iLCBwX3BhdGhzKQoKICAgIGlfcGF0aHMgOj0gaV9vY2kuTGludXguTWFza2VkUGF0aHMKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aHMgMTogaV9wYXRocyA9IiwgaV9wYXRocykKCiAgICBhbGxvd19tYXNrZWRfcGF0aHNfYXJyYXkocF9wYXRocywgaV9wYXRocykKCiAgICBwcmludCgiYWxsb3dfbWFza2VkX3BhdGhzIDE6IHRydWUiKQp9CmFsbG93X21hc2tlZF9wYXRocyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aHMgMjogc3RhcnQiKQoKICAgIG5vdCBwX29jaS5MaW51eC5NYXNrZWRQYXRocwogICAgbm90IGlfb2NpLkxpbnV4Lk1hc2tlZFBhdGhzCgogICAgcHJpbnQoImFsbG93X21hc2tlZF9wYXRocyAyOiB0cnVlIikKfQoKIyBBbGwgdGhlIHBvbGljeSBtYXNrZWQgcGF0aHMgbXVzdCBiZSBtYXNrZWQgaW4gdGhlIGlucHV0IGRhdGEgdG9vLgojIElucHV0IGlzIGFsbG93ZWQgdG8gaGF2ZSBtb3JlIG1hc2tlZCBwYXRocyB0aGFuIHRoZSBwb2xpY3kuCmFsbG93X21hc2tlZF9wYXRoc19hcnJheShwX2FycmF5LCBpX2FycmF5KSB7CiAgICBldmVyeSBwX2VsZW0gaW4gcF9hcnJheSB7CiAgICAgICAgYWxsb3dfbWFza2VkX3BhdGgocF9lbGVtLCBpX2FycmF5KQogICAgfQp9CgphbGxvd19tYXNrZWRfcGF0aChwX2VsZW0sIGlfYXJyYXkpIHsKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aDogcF9lbGVtID0iLCBwX2VsZW0pCgogICAgc29tZSBpX2VsZW0gaW4gaV9hcnJheQogICAgcF9lbGVtID09IGlfZWxlbQoKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aDogdHJ1ZSIpCn0KCmFsbG93X3JlYWRvbmx5X3BhdGhzKHBfb2NpLCBpX29jaSkgewogICAgcF9wYXRocyA6PSBwX29jaS5MaW51eC5SZWFkb25seVBhdGhzCiAgICBwcmludCgiYWxsb3dfcmVhZG9ubHlfcGF0aHMgMTogcF9wYXRocyA9IiwgcF9wYXRocykKCiAgICBpX3BhdGhzIDo9IGlfb2NpLkxpbnV4LlJlYWRvbmx5UGF0aHMKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAxOiBpX3BhdGhzID0iLCBpX3BhdGhzKQoKICAgIGFsbG93X3JlYWRvbmx5X3BhdGhzX2FycmF5KHBfcGF0aHMsIGlfcGF0aHMsIGlfb2NpLkxpbnV4Lk1hc2tlZFBhdGhzKQoKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAxOiB0cnVlIikKfQphbGxvd19yZWFkb25seV9wYXRocyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAyOiBzdGFydCIpCgogICAgbm90IHBfb2NpLkxpbnV4LlJlYWRvbmx5UGF0aHMKICAgIG5vdCBpX29jaS5MaW51eC5SZWFkb25seVBhdGhzCgogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGhzIDI6IHRydWUiKQp9CgojIEFsbCB0aGUgcG9saWN5IHJlYWRvbmx5IHBhdGhzIG11c3QgYmUgZWl0aGVyOgojIC0gUHJlc2VudCBpbiB0aGUgaW5wdXQgcmVhZG9ubHkgcGF0aHMsIG9yCiMgLSBQcmVzZW50IGluIHRoZSBpbnB1dCBtYXNrZWQgcGF0aHMuCiMgSW5wdXQgaXMgYWxsb3dlZCB0byBoYXZlIG1vcmUgcmVhZG9ubHkgcGF0aHMgdGhhbiB0aGUgcG9saWN5LgphbGxvd19yZWFkb25seV9wYXRoc19hcnJheShwX2FycmF5LCBpX2FycmF5LCBtYXNrZWRfcGF0aHMpIHsKICAgIGV2ZXJ5IHBfZWxlbSBpbiBwX2FycmF5IHsKICAgICAgICBhbGxvd19yZWFkb25seV9wYXRoKHBfZWxlbSwgaV9hcnJheSwgbWFza2VkX3BhdGhzKQogICAgfQp9CgphbGxvd19yZWFkb25seV9wYXRoKHBfZWxlbSwgaV9hcnJheSwgbWFza2VkX3BhdGhzKSB7CiAgICBwcmludCgiYWxsb3dfcmVhZG9ubHlfcGF0aCAxOiBwX2VsZW0gPSIsIHBfZWxlbSkKCiAgICBzb21lIGlfZWxlbSBpbiBpX2FycmF5CiAgICBwX2VsZW0gPT0gaV9lbGVtCgogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGggMTogdHJ1ZSIpCn0KYWxsb3dfcmVhZG9ubHlfcGF0aChwX2VsZW0sIGlfYXJyYXksIG1hc2tlZF9wYXRocykgewogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGggMjogcF9lbGVtID0iLCBwX2VsZW0pCgogICAgc29tZSBpX21hc2tlZCBpbiBtYXNrZWRfcGF0aHMKICAgIHBfZWxlbSA9PSBpX21hc2tlZAoKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRoIDI6IHRydWUiKQp9CgphbGxvd19saW51eF9kZXZpY2VzKHBfZGV2aWNlcywgaV9kZXZpY2VzKSB7CiAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogc3RhcnQiKQogICAgZXZlcnkgaV9kZXZpY2UgaW4gaV9kZXZpY2VzIHsKICAgICAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogaV9kZXZpY2UgPSIsIGlfZGV2aWNlKQogICAgICAgIHNvbWUgcF9kZXZpY2UgaW4gcF9kZXZpY2VzCiAgICAgICAgaV9kZXZpY2UuUGF0aCA9PSBwX2RldmljZS5QYXRoCiAgICB9CiAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogdHJ1ZSIpCn0KCmFsbG93X2xpbnV4X3N5c2N0bChwX2xpbnV4LCBpX2xpbnV4KSB7CiAgICBwcmludCgiYWxsb3dfbGludXhfc3lzY3RsIDE6IHN0YXJ0IikKICAgIG5vdCBpX2xpbnV4LlN5c2N0bAogICAgcHJpbnQoImFsbG93X2xpbnV4X3N5c2N0bCAxOiB0cnVlIikKfQoKYWxsb3dfbGludXhfc3lzY3RsKHBfbGludXgsIGlfbGludXgpIHsKICAgIHByaW50KCJhbGxvd19saW51eF9zeXNjdGwgMjogc3RhcnQiKQogICAgcF9zeXNjdGwgOj0gcF9saW51eC5TeXNjdGwKICAgIGlfc3lzY3RsIDo9IGlfbGludXguU3lzY3RsCiAgICBldmVyeSBpX25hbWUsIGlfdmFsIGluIGlfc3lzY3RsIHsKICAgICAgICBwcmludCgiYWxsb3dfbGludXhfc3lzY3RsIDI6IGlfbmFtZSA9IiwgaV9uYW1lLCAiaV92YWwgPSIsIGlfdmFsKQogICAgICAgIHBfc3lzY3RsW2lfbmFtZV0gPT0gaV92YWwKICAgIH0KICAgIHByaW50KCJhbGxvd19saW51eF9zeXNjdGwgMjogdHJ1ZSIpCn0KCiMgQ2hlY2sgdGhlIGNvbnNpc3RlbmN5IG9mIHRoZSBpbnB1dCAiaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5idW5kbGVfcGF0aCIKIyBhbmQgaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCIgdmFsdWVzIHdpdGggb3RoZXIgZmllbGRzLgphbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZChwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpIHsKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogc3RhcnQiKQoKICAgIGJ1bmRsZV9wYXRoIDo9IGlfb2NpLkFubm90YXRpb25zWyJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmJ1bmRsZV9wYXRoIl0KICAgIGJ1bmRsZV9pZCA6PSByZXBsYWNlKGJ1bmRsZV9wYXRoLCAiL3J1bi9jb250YWluZXJkL2lvLmNvbnRhaW5lcmQucnVudGltZS52Mi50YXNrL2s4cy5pby8iLCAiIikKCiAgICBidW5kbGVfaWRfZm9ybWF0IDo9IGNvbmNhdCgiIiwgWyJeIiwgQlVORExFX0lELCAiJCJdKQogICAgcmVnZXgubWF0Y2goYnVuZGxlX2lkX2Zvcm1hdCwgYnVuZGxlX2lkKQoKICAgIGtleSA6PSAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCIKCiAgICBwX3JlZ2V4IDo9IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIHNhbmRib3hfaWQgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQoKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogc2FuZGJveF9pZCA9Iiwgc2FuZGJveF9pZCwgInJlZ2V4ID0iLCBwX3JlZ2V4KQogICAgcmVnZXgubWF0Y2gocF9yZWdleCwgc2FuZGJveF9pZCkKCiAgICBhbGxvd19yb290X3BhdGgocF9vY2ksIGlfb2NpLCBidW5kbGVfaWQpCgogICAgZXZlcnkgaV9tb3VudCBpbiBpX29jaS5Nb3VudHMgewogICAgICAgIGFsbG93X21vdW50KHBfb2NpLCBpX21vdW50LCBpX3N0b3JhZ2VzLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpCiAgICB9CgogICAgYWxsb3dfc3RvcmFnZXMocF9zdG9yYWdlcywgaV9zdG9yYWdlcywgYnVuZGxlX2lkLCBzYW5kYm94X2lkKQoKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogdHJ1ZSIpCn0KCmFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHBfcHJvY2VzcyA9IiwgcF9wcm9jZXNzKQogICAgcHJpbnQoImFsbG93X3Byb2Nlc3NfY29tbW9uOiBpX3Byb2Nlc3MgPSAiLCBpX3Byb2Nlc3MpCiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHNfbmFtZSA9Iiwgc19uYW1lKQoKICAgIHBfcHJvY2Vzcy5Dd2QgPT0gaV9wcm9jZXNzLkN3ZAogICAgcF9wcm9jZXNzLk5vTmV3UHJpdmlsZWdlcyA9PSBpX3Byb2Nlc3MuTm9OZXdQcml2aWxlZ2VzCgogICAgYWxsb3dfdXNlcihwX3Byb2Nlc3MsIGlfcHJvY2VzcykKICAgIGFsbG93X2VudihwX3Byb2Nlc3MsIGlfcHJvY2Vzcywgc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHRydWUiKQp9CgojIENvbXBhcmUgdGhlIE9DSSBQcm9jZXNzIGZpZWxkIG9mIGEgcG9saWN5IGNvbnRhaW5lciB3aXRoIHRoZSBpbnB1dCBPQ0kgUHJvY2VzcyBmcm9tIGEgQ3JlYXRlQ29udGFpbmVyUmVxdWVzdAphbGxvd19wcm9jZXNzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfcHJvY2Vzczogc3RhcnQiKQoKICAgIGFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgYWxsb3dfY2FwcyhwX3Byb2Nlc3MuQ2FwYWJpbGl0aWVzLCBpX3Byb2Nlc3MuQ2FwYWJpbGl0aWVzKQogICAgcF9wcm9jZXNzLlRlcm1pbmFsID09IGlfcHJvY2Vzcy5UZXJtaW5hbAoKICAgIHByaW50KCJhbGxvd19wcm9jZXNzOiB0cnVlIikKfQoKIyBDb21wYXJlIHRoZSBPQ0kgUHJvY2VzcyBmaWVsZCBvZiBhIHBvbGljeSBjb250YWluZXIgd2l0aCB0aGUgaW5wdXQgcHJvY2VzcyBmaWVsZCBmcm9tIEV4ZWNQcm9jZXNzUmVxdWVzdAphbGxvd19pbnRlcmFjdGl2ZV9wcm9jZXNzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfaW50ZXJhY3RpdmVfcHJvY2Vzczogc3RhcnQiKQoKICAgIGFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgYWxsb3dfZXhlY19jYXBzKGlfcHJvY2Vzcy5DYXBhYmlsaXRpZXMpCgogICAgIyBUaGVzZSBhcmUgY29tbWFuZHMgZW5hYmxlZCB1c2luZyBFeGVjUHJvY2Vzc1JlcXVlc3QgY29tbWFuZHMgYW5kL29yIHJlZ2V4IGZyb20gdGhlIHNldHRpbmdzIGZpbGUuCiAgICAjIFRoZXkgY2FuIGJlIGV4ZWN1dGVkIGludGVyYWN0aXZlbHkgc28gYWxsb3cgdGhlbSB0byB1c2UgYW55IHZhbHVlIGZvciBpX3Byb2Nlc3MuVGVybWluYWwuCgogICAgcHJpbnQoImFsbG93X2ludGVyYWN0aXZlX3Byb2Nlc3M6IHRydWUiKQp9CgojIENvbXBhcmUgdGhlIE9DSSBQcm9jZXNzIGZpZWxkIG9mIGEgcG9saWN5IGNvbnRhaW5lciB3aXRoIHRoZSBpbnB1dCBwcm9jZXNzIGZpZWxkIGZyb20gRXhlY1Byb2Nlc3NSZXF1ZXN0CmFsbG93X3Byb2JlX3Byb2Nlc3MocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19wcm9iZV9wcm9jZXNzOiBzdGFydCIpCgogICAgYWxsb3dfcHJvY2Vzc19jb21tb24ocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpCiAgICBhbGxvd19leGVjX2NhcHMoaV9wcm9jZXNzLkNhcGFiaWxpdGllcykKICAgIHBfcHJvY2Vzcy5UZXJtaW5hbCA9PSBpX3Byb2Nlc3MuVGVybWluYWwKCiAgICBwcmludCgiYWxsb3dfcHJvYmVfcHJvY2VzczogdHJ1ZSIpCn0KCmFsbG93X3VzZXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MpIHsKICAgIHBfdXNlciA6PSBwX3Byb2Nlc3MuVXNlcgogICAgaV91c2VyIDo9IGlfcHJvY2Vzcy5Vc2VyCgogICAgcHJpbnQoImFsbG93X3VzZXI6IGlucHV0IHVpZCA9IiwgaV91c2VyLlVJRCwgInBvbGljeSB1aWQgPSIsIHBfdXNlci5VSUQpCiAgICBwX3VzZXIuVUlEID09IGlfdXNlci5VSUQKCiAgICAjIFRPRE86IHRyYWNrIGRvd24gdGhlIHJlYXNvbiBmb3IgcmVnaXN0cnkuazhzLmlvL3BhdXNlOjMuOSBiZWluZwogICAgIyAgICAgICBleGVjdXRlZCB3aXRoIGdpZCA9IDAgZGVzcGl0ZSBoYXZpbmcgIjY1NTM1OjY1NTM1IiBpbiBpdHMgY29udGFpbmVyIGltYWdlCiAgICAjICAgICAgIGNvbmZpZy4KICAgICNwcmludCgiYWxsb3dfdXNlcjogaW5wdXQgZ2lkID0iLCBpX3VzZXIuR0lELCAicG9saWN5IGdpZCA9IiwgcF91c2VyLkdJRCkKICAgICNwX3VzZXIuR0lEID09IGlfdXNlci5HSUQKCiAgICAjIFRPRE86IGNvbXBhcmUgdGhlIGFkZGl0aW9uYWxHaWRzIGZpZWxkIHRvbyBhZnRlciBjb21wdXRpbmcgaXRzIHZhbHVlCiAgICAjIGJhc2VkIG9uIC9ldGMvcGFzc3dkIGFuZCAvZXRjL2dyb3VwIGZyb20gdGhlIGNvbnRhaW5lciBpbWFnZS4KfQoKYWxsb3dfZGVwcmVjYXRlZF9hcmdzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZ3MgMTogbm8gYXJncyIpCgogICAgbm90IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJncwogICAgbm90IGlfcHJvY2Vzcy5BcmdzCgogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAxOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZ3MocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSkgewogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiBwb2xpY3kgYXJncyA9IiwgcF9wcm9jZXNzLkRlcHJlY2F0ZWRBcmdzKQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiBpbnB1dCBhcmdzID0iLCBpX3Byb2Nlc3MuQXJncykKCiAgICBjb3VudChwX3Byb2Nlc3MuRGVwcmVjYXRlZEFyZ3MpID09IGNvdW50KGlfcHJvY2Vzcy5BcmdzKQoKICAgIGV2ZXJ5IGksIGlfYXJnIGluIGlfcHJvY2Vzcy5BcmdzIHsKICAgICAgICBhbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpCiAgICB9CgogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDE6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgcF9hcmcyIDo9IHJlcGxhY2UocF9hcmcsICIkJCIsICIkIikKICAgIHBfYXJnMiA9PSBpX2FyZwoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAxOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDI6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgIyBUT0RPOiBjYW4gJChub2RlLW5hbWUpIGJlIGhhbmRsZWQgYmV0dGVyPwogICAgY29udGFpbnMocF9hcmcsICIkKG5vZGUtbmFtZSkiKQoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAyOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDM6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgcF9hcmcyIDo9IHJlcGxhY2UocF9hcmcsICIkJCIsICIkIikKICAgIHBfYXJnMyA6PSByZXBsYWNlKHBfYXJnMiwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAzOiBwX2FyZzMgPSIsIHBfYXJnMykKICAgIHBfYXJnMyA9PSBpX2FyZwoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAzOiB0cnVlIikKfQoKIyBPQ0kgcHJvY2Vzcy5FbnYgZmllbGQKYWxsb3dfZW52KHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfZW52OiBwIGVudiA9IiwgcF9wcm9jZXNzLkVudikKICAgIHByaW50KCJhbGxvd19lbnY6IGkgZW52ID0iLCBpX3Byb2Nlc3MuRW52KQoKICAgIGV2ZXJ5IGlfdmFyIGluIGlfcHJvY2Vzcy5FbnYgewogICAgICAgIHByaW50KCJhbGxvd19lbnY6IGlfdmFyID0iLCBpX3ZhcikKICAgICAgICBhbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgfQoKICAgIHByaW50KCJhbGxvd19lbnY6IHRydWUiKQp9CgojIEFsbG93IGlucHV0IGVudiB2YXJpYWJsZXMgdGhhdCBhcmUgcHJlc2VudCBpbiB0aGUgcG9saWN5IGRhdGEgdG9vLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHBfdmFyID09IGlfdmFyCiAgICBwcmludCgiYWxsb3dfdmFyIDE6IHRydWUiKQp9CgojIE1hdGNoIGlucHV0IHdpdGggb25lIG9mIHRoZSBwb2xpY3kgdmFyaWFibGVzLCBhZnRlciBzdWJzdGl0dXRpbmcgJChzYW5kYm94LW5hbWUpLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHByaW50KCJhbGxvd192YXIgMjogcF92YXIgPSIsIHBfdmFyKQoKICAgIHBfdmFyX3NwbGl0IDo9IHNwbGl0KHBfdmFyLCAiPSIpCiAgICBjb3VudChwX3Zhcl9zcGxpdCkgPT0gMgoKICAgIHBfdmFyX3NwbGl0WzFdID09ICIkKHNhbmRib3gtbmFtZSkiCgogICAgaV92YXJfc3BsaXQgOj0gc3BsaXQoaV92YXIsICI9IikKICAgIGNvdW50KGlfdmFyX3NwbGl0KSA9PSAyCgogICAgaV92YXJfc3BsaXRbMF0gPT0gcF92YXJfc3BsaXRbMF0KICAgIHJlZ2V4Lm1hdGNoKHNfbmFtZSwgaV92YXJfc3BsaXRbMV0pCgogICAgcHJpbnQoImFsbG93X3ZhciAyOiB0cnVlIikKfQoKIyBBbGxvdyBpbnB1dCBlbnYgdmFyaWFibGVzIHRoYXQgbWF0Y2ggd2l0aCBhIHJlcXVlc3RfZGVmYXVsdHMgcmVnZXguCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHNvbWUgcF9yZWdleDEgaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5DcmVhdGVDb250YWluZXJSZXF1ZXN0LmFsbG93X2Vudl9yZWdleAogICAgcF9yZWdleDIgOj0gcmVwbGFjZShwX3JlZ2V4MSwgIiQoaXB2NF9hKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcHY0X2EpCiAgICBwX3JlZ2V4MyA6PSByZXBsYWNlKHBfcmVnZXgyLCAiJChpcF9wKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcF9wKQogICAgcF9yZWdleDQgOj0gcmVwbGFjZShwX3JlZ2V4MywgIiQoc3ZjX25hbWUpIiwgcG9saWN5X2RhdGEuY29tbW9uLnN2Y19uYW1lKQogICAgcF9yZWdleDUgOj0gcmVwbGFjZShwX3JlZ2V4NCwgIiQoZG5zX2xhYmVsKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5kbnNfbGFiZWwpCgogICAgcHJpbnQoImFsbG93X3ZhciAzOiBwX3JlZ2V4NSA9IiwgcF9yZWdleDUpCiAgICByZWdleC5tYXRjaChwX3JlZ2V4NSwgaV92YXIpCgogICAgcHJpbnQoImFsbG93X3ZhciAzOiB0cnVlIikKfQoKIyBBbGxvdyBmaWVsZFJlZiAiZmllbGRQYXRoOiBzdGF0dXMucG9kSVAiIHZhbHVlcy4KYWxsb3dfdmFyKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBpX3Zhciwgc19uYW1lLCBzX25hbWVzcGFjZSkgewogICAgbmFtZV92YWx1ZSA6PSBzcGxpdChpX3ZhciwgIj0iKQogICAgY291bnQobmFtZV92YWx1ZSkgPT0gMgogICAgaXNfaXAobmFtZV92YWx1ZVsxXSkKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIGFsbG93X3BvZF9pcF92YXIobmFtZV92YWx1ZVswXSwgcF92YXIpCgogICAgcHJpbnQoImFsbG93X3ZhciA0OiB0cnVlIikKfQoKIyBBbGxvdyBjb21tb24gZmllbGRSZWYgdmFyaWFibGVzLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBuYW1lX3ZhbHVlIDo9IHNwbGl0KGlfdmFyLCAiPSIpCiAgICBjb3VudChuYW1lX3ZhbHVlKSA9PSAyCgogICAgc29tZSBwX3ZhciBpbiBwX3Byb2Nlc3MuRW52CiAgICBwX25hbWVfdmFsdWUgOj0gc3BsaXQocF92YXIsICI9IikKICAgIGNvdW50KHBfbmFtZV92YWx1ZSkgPT0gMgoKICAgIHBfbmFtZV92YWx1ZVswXSA9PSBuYW1lX3ZhbHVlWzBdCgogICAgIyBUT0RPOiBzaG91bGQgdGhlc2UgYmUgaGFuZGxlZCBpbiBhIGRpZmZlcmVudCB3YXk/CiAgICBhbHdheXNfYWxsb3dlZCA6PSBbIiQoaG9zdC1uYW1lKSIsICIkKG5vZGUtbmFtZSkiLCAiJChwb2QtdWlkKSJdCiAgICBzb21lIGFsbG93ZWQgaW4gYWx3YXlzX2FsbG93ZWQKICAgIGNvbnRhaW5zKHBfbmFtZV92YWx1ZVsxXSwgYWxsb3dlZCkKCiAgICBwcmludCgiYWxsb3dfdmFyIDU6IHRydWUiKQp9CgojIEFsbG93IGZpZWxkUmVmICJmaWVsZFBhdGg6IHN0YXR1cy5ob3N0SVAiIHZhbHVlcy4KYWxsb3dfdmFyKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBpX3Zhciwgc19uYW1lLCBzX25hbWVzcGFjZSkgewogICAgbmFtZV92YWx1ZSA6PSBzcGxpdChpX3ZhciwgIj0iKQogICAgY291bnQobmFtZV92YWx1ZSkgPT0gMgogICAgaXNfaXAobmFtZV92YWx1ZVsxXSkKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIGFsbG93X2hvc3RfaXBfdmFyKG5hbWVfdmFsdWVbMF0sIHBfdmFyKQoKICAgIHByaW50KCJhbGxvd192YXIgNjogdHJ1ZSIpCn0KCiMgQWxsb3cgcmVzb3VyY2VGaWVsZFJlZiB2YWx1ZXMgKGUuZy4sICJsaW1pdHMuY3B1IikuCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIG5hbWVfdmFsdWUgOj0gc3BsaXQoaV92YXIsICI9IikKICAgIGNvdW50KG5hbWVfdmFsdWUpID09IDIKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHBfbmFtZV92YWx1ZSA6PSBzcGxpdChwX3ZhciwgIj0iKQogICAgY291bnQocF9uYW1lX3ZhbHVlKSA9PSAyCgogICAgcF9uYW1lX3ZhbHVlWzBdID09IG5hbWVfdmFsdWVbMF0KCiAgICAjIGEgdmFyaWFibGUgd2Ugc2hvdWxkIGJlIHZhbGlkYXRpbmcgdXNpbmcgYSByZWdleCBmcm9tIHNldHRpbmdzCiAgICBwX25hbWVfdmFsdWVbMV0gPT0gIiQodmFsaWRhdGUtZnJvbS1zZXR0aW5ncykiCgogICAgcmVnZXhfdmFsIDo9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuQ3JlYXRlQ29udGFpbmVyUmVxdWVzdC5hbGxvd19lbnZfcmVnZXhfbWFwW25hbWVfdmFsdWVbMF1dCgogICAgcHJpbnQoImFsbG93X3ZhciA3OiB2YWwgPSIsIG5hbWVfdmFsdWVbMV0pCiAgICBwcmludCgiYWxsb3dfdmFyIDc6IHJlZ2V4X3ZhbCA9IiwgcmVnZXhfdmFsKQoKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4X3ZhbCwgbmFtZV92YWx1ZVsxXSkKCiAgICBwcmludCgiYWxsb3dfdmFyIDc6IHRydWUiKQp9CgojIE1hdGNoIGlucHV0IHdpdGggb25lIG9mIHRoZSBwb2xpY3kgdmFyaWFibGVzLCBhZnRlciBzdWJzdGl0dXRpbmcgJChzYW5kYm94LW5hbWVzcGFjZSkuCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHNvbWUgcF92YXIgaW4gcF9wcm9jZXNzLkVudgogICAgcF92YXIyIDo9IHJlcGxhY2UocF92YXIsICIkKHNhbmRib3gtbmFtZXNwYWNlKSIsIHNfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd192YXIgODogcF92YXIyID0iLCBwX3ZhcjIpCiAgICBwX3ZhcjIgPT0gaV92YXIKCiAgICBwcmludCgiYWxsb3dfdmFyIDg6IHRydWUiKQp9CgphbGxvd19wb2RfaXBfdmFyKHZhcl9uYW1lLCBwX3ZhcikgewogICAgcHJpbnQoImFsbG93X3BvZF9pcF92YXI6IHZhcl9uYW1lID0iLCB2YXJfbmFtZSwgInBfdmFyID0iLCBwX3ZhcikKCiAgICBwX25hbWVfdmFsdWUgOj0gc3BsaXQocF92YXIsICI9IikKICAgIGNvdW50KHBfbmFtZV92YWx1ZSkgPT0gMgoKICAgIHBfbmFtZV92YWx1ZVswXSA9PSB2YXJfbmFtZQogICAgcF9uYW1lX3ZhbHVlWzFdID09ICIkKHBvZC1pcCkiCgogICAgcHJpbnQoImFsbG93X3BvZF9pcF92YXI6IHRydWUiKQp9CgphbGxvd19ob3N0X2lwX3Zhcih2YXJfbmFtZSwgcF92YXIpIHsKICAgIHByaW50KCJhbGxvd19ob3N0X2lwX3ZhcjogdmFyX25hbWUgPSIsIHZhcl9uYW1lLCAicF92YXIgPSIsIHBfdmFyKQoKICAgIHBfbmFtZV92YWx1ZSA6PSBzcGxpdChwX3ZhciwgIj0iKQogICAgY291bnQocF9uYW1lX3ZhbHVlKSA9PSAyCgogICAgcF9uYW1lX3ZhbHVlWzBdID09IHZhcl9uYW1lCiAgICBwX25hbWVfdmFsdWVbMV0gPT0gIiQoaG9zdC1pcCkiCgogICAgcHJpbnQoImFsbG93X2hvc3RfaXBfdmFyOiB0cnVlIikKfQoKaXNfaXAodmFsdWUpIHsKICAgIGJ5dGVzID0gc3BsaXQodmFsdWUsICIuIikKICAgIGNvdW50KGJ5dGVzKSA9PSA0CgogICAgaXNfaXBfZmlyc3RfYnl0ZShieXRlc1swXSkKICAgIGlzX2lwX290aGVyX2J5dGUoYnl0ZXNbMV0pCiAgICBpc19pcF9vdGhlcl9ieXRlKGJ5dGVzWzJdKQogICAgaXNfaXBfb3RoZXJfYnl0ZShieXRlc1szXSkKfQppc19pcF9maXJzdF9ieXRlKGNvbXBvbmVudCkgewogICAgbnVtYmVyID0gdG9fbnVtYmVyKGNvbXBvbmVudCkKICAgIG51bWJlciA+PSAxCiAgICBudW1iZXIgPD0gMjU1Cn0KaXNfaXBfb3RoZXJfYnl0ZShjb21wb25lbnQpIHsKICAgIG51bWJlciA9IHRvX251bWJlcihjb21wb25lbnQpCiAgICBudW1iZXIgPj0gMAogICAgbnVtYmVyIDw9IDI1NQp9CgojIE9DSSByb290LlBhdGgKYWxsb3dfcm9vdF9wYXRoKHBfb2NpLCBpX29jaSwgYnVuZGxlX2lkKSB7CiAgICBpX3BhdGggOj0gaV9vY2kuUm9vdC5QYXRoCiAgICBwX3BhdGgxIDo9IHBfb2NpLlJvb3QuUGF0aAogICAgcHJpbnQoImFsbG93X3Jvb3RfcGF0aDogaV9wYXRoID0iLCBpX3BhdGgsICJwX3BhdGgxID0iLCBwX3BhdGgxKQoKICAgIHBfcGF0aDIgOj0gcmVwbGFjZShwX3BhdGgxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfcm9vdF9wYXRoOiBwX3BhdGgyID0iLCBwX3BhdGgyKQoKICAgIHBfcGF0aDMgOj0gcmVwbGFjZShwX3BhdGgyLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X3Jvb3RfcGF0aDogcF9wYXRoMyA9IiwgcF9wYXRoMykKCiAgICBwX3BhdGgzID09IGlfcGF0aAoKICAgIHByaW50KCJhbGxvd19yb290X3BhdGg6IHRydWUiKQp9CgojIGRldmljZSBtb3VudHMKYWxsb3dfbW91bnQocF9vY2ksIGlfbW91bnQsIGlfc3RvcmFnZXMsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcHJpbnQoImFsbG93X21vdW50OiBpX21vdW50ID0iLCBpX21vdW50KQoKICAgIHNvbWUgcF9tb3VudCBpbiBwX29jaS5Nb3VudHMKICAgIHNvbWUgaV9zdG9yYWdlIGluIGlfc3RvcmFnZXMKCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IHBfbW91bnQgPSIsIHBfbW91bnQpCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IGlfc3RvcmFnZSA9IiwgaV9zdG9yYWdlKQoKICAgIGNoZWNrX21vdW50KHBfbW91bnQsIGlfbW91bnQsIGlfc3RvcmFnZSwgYnVuZGxlX2lkLCBzYW5kYm94X2lkKQoKICAgICMgVE9ETzogYXJlIHRoZXJlIGFueSBvdGhlciByZXF1aXJlZCBwb2xpY3kgY2hlY2tzIGZvciBtb3VudHMgLSBlLmcuLAogICAgIyAgICAgICBtdWx0aXBsZSBtb3VudHMgd2l0aCBzYW1lIHNvdXJjZSBvciBkZXN0aW5hdGlvbj8KCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IHRydWUiKQp9CgpjaGVja19tb3VudChwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcF9tb3VudCA9PSBpX21vdW50CiAgICBwcmludCgiY2hlY2tfbW91bnQgMTogdHJ1ZSIpCn0KY2hlY2tfbW91bnQocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHBfbW91bnQuZGVzdGluYXRpb24gPT0gaV9tb3VudC5kZXN0aW5hdGlvbgogICAgcF9tb3VudC50eXBlXyA9PSBpX21vdW50LnR5cGVfCiAgICBwX21vdW50Lm9wdGlvbnMgPT0gaV9tb3VudC5vcHRpb25zCgogICAgbW91bnRfc291cmNlX2FsbG93cyhwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkKCiAgICBwcmludCgiY2hlY2tfbW91bnQgMjogdHJ1ZSIpCn0KCm1vdW50X3NvdXJjZV9hbGxvd3MocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHJlZ2V4MSA6PSBwX21vdW50LnNvdXJjZQogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5tb3VudF9zb3VyY2VfY3BhdGgpCiAgICByZWdleDQgOj0gcmVwbGFjZShyZWdleDMsICIkKGJ1bmRsZS1pZCkiLCBidW5kbGVfaWQpCgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMTogcmVnZXg0ID0iLCByZWdleDQpCiAgICByZWdleC5tYXRjaChyZWdleDQsIGlfbW91bnQuc291cmNlKQoKICAgIHByaW50KCJtb3VudF9zb3VyY2VfYWxsb3dzIDE6IHRydWUiKQp9Cm1vdW50X3NvdXJjZV9hbGxvd3MocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHJlZ2V4MSA6PSBwX21vdW50LnNvdXJjZQogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5tb3VudF9zb3VyY2VfY3BhdGgpCiAgICByZWdleDQgOj0gcmVwbGFjZShyZWdleDMsICIkKHNhbmRib3gtaWQpIiwgc2FuZGJveF9pZCkKCiAgICBwcmludCgibW91bnRfc291cmNlX2FsbG93cyAyOiByZWdleDQgPSIsIHJlZ2V4NCkKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4NCwgaV9tb3VudC5zb3VyY2UpCgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMjogdHJ1ZSIpCn0KbW91bnRfc291cmNlX2FsbG93cyhwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogaV9tb3VudC5zb3VyY2UgPSIsIGlfbW91bnQuc291cmNlKQogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogaV9zdG9yYWdlLm1vdW50X3BvaW50ID0iLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCgogICAgaV9tb3VudC5zb3VyY2UgPT0gaV9zdG9yYWdlLm1vdW50X3BvaW50CgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogdHJ1ZSIpCn0KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBDcmVhdGUgY29udGFpbmVyIFN0b3JhZ2VzCgphbGxvd19zdG9yYWdlcyhwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHBfY291bnQgOj0gY291bnQocF9zdG9yYWdlcykKICAgIGlfY291bnQgOj0gY291bnQoaV9zdG9yYWdlcykKICAgIHByaW50KCJhbGxvd19zdG9yYWdlczogcF9jb3VudCA9IiwgcF9jb3VudCwgImlfY291bnQgPSIsIGlfY291bnQpCgogICAgcF9jb3VudCA9PSBpX2NvdW50CgogICAgIyBHZXQgdGhlIGNvbnRhaW5lciBpbWFnZSBsYXllciBJRHMgYW5kIHZlcml0eSByb290IGhhc2hlcywgZnJvbSB0aGUgIm92ZXJsYXlmcyIgc3RvcmFnZS4KICAgIHNvbWUgb3ZlcmxheV9zdG9yYWdlIGluIHBfc3RvcmFnZXMKICAgIG92ZXJsYXlfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIHByaW50KCJhbGxvd19zdG9yYWdlczogb3ZlcmxheV9zdG9yYWdlID0iLCBvdmVybGF5X3N0b3JhZ2UpCiAgICBjb3VudChvdmVybGF5X3N0b3JhZ2Uub3B0aW9ucykgPT0gMgoKICAgIGxheWVyX2lkcyA6PSBzcGxpdChvdmVybGF5X3N0b3JhZ2Uub3B0aW9uc1swXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiBsYXllcl9pZHMgPSIsIGxheWVyX2lkcykKCiAgICByb290X2hhc2hlcyA6PSBzcGxpdChvdmVybGF5X3N0b3JhZ2Uub3B0aW9uc1sxXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiByb290X2hhc2hlcyA9Iiwgcm9vdF9oYXNoZXMpCgogICAgZXZlcnkgaV9zdG9yYWdlIGluIGlfc3RvcmFnZXMgewogICAgICAgIGFsbG93X3N0b3JhZ2UocF9zdG9yYWdlcywgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpCiAgICB9CgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiB0cnVlIikKfQoKYWxsb3dfc3RvcmFnZShwX3N0b3JhZ2VzLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgc29tZSBwX3N0b3JhZ2UgaW4gcF9zdG9yYWdlcwoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiBwX3N0b3JhZ2UgPSIsIHBfc3RvcmFnZSkKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiBpX3N0b3JhZ2UgPSIsIGlfc3RvcmFnZSkKCiAgICBwX3N0b3JhZ2UuZHJpdmVyICAgICAgICAgICA9PSBpX3N0b3JhZ2UuZHJpdmVyCiAgICBwX3N0b3JhZ2UuZHJpdmVyX29wdGlvbnMgICA9PSBpX3N0b3JhZ2UuZHJpdmVyX29wdGlvbnMKICAgIHBfc3RvcmFnZS5mc19ncm91cCAgICAgICAgID09IGlfc3RvcmFnZS5mc19ncm91cAogICAgcF9zdG9yYWdlLmZzdHlwZSAgICAgICAgICAgPT0gaV9zdG9yYWdlLmZzdHlwZQoKICAgIGFsbG93X3N0b3JhZ2Vfc291cmNlKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKQogICAgYWxsb3dfc3RvcmFnZV9vcHRpb25zKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKQogICAgYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKQoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiB0cnVlIikKfQoKYWxsb3dfc3RvcmFnZV9zb3VyY2UocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX3NvdXJjZSAxOiBzdGFydCIpCgogICAgcF9zdG9yYWdlLnNvdXJjZSA9PSBpX3N0b3JhZ2Uuc291cmNlCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDE6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX3NvdXJjZShwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDI6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCgogICAgIyBEREREOkJCOkRELkY6IERvbWFpbjpCdXM6RGV2aWNlLkZ1bmN0aW9uCiAgICAjIGh0dHBzOi8vd3d3Lmtlcm5lbC5vcmcvZG9jL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtYnVzLXBjaQogICAgcmVnZXgubWF0Y2goYF5bYS1mMC05XXs0fTpbYS1mMC05XXsyfTpbYS1mMC05XXsyfVwuW2EtZjAtOV0kYCwgaV9zdG9yYWdlLnNvdXJjZSkKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9zb3VyY2UgMjogdHJ1ZSIpCn0KCmFsbG93X3N0b3JhZ2Vfc291cmNlKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKSB7CiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9zb3VyY2UgMzogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIGlfc3RvcmFnZS5zb3VyY2UgPT0gIm5vbmUiCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDM6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX3NvdXJjZShwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDQ6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJzbWIiCgogICAgIyBQYXR0ZXJuOiAvLzxzdG9yYWdlLWFjY291bnQtbmFtZT4uZmlsZS5jb3JlLndpbmRvd3MubmV0LzxrOHMtUFZDLW5hbWU+CiAgICAjIFN0b3JhZ2UgYWNjb3VudCBuYW1lOiBodHRwczovL2xlYXJuLm1pY3Jvc29mdC5jb20vZW4tdXMvYXp1cmUvc3RvcmFnZS9jb21tb24vc3RvcmFnZS1hY2NvdW50LW92ZXJ2aWV3I3N0b3JhZ2UtYWNjb3VudC1uYW1lCiAgICAjIEs4cyBQVkMgbmFtZTogaHR0cHM6Ly9rdWJlcm5ldGVzLmlvL2RvY3MvY29uY2VwdHMvb3ZlcnZpZXcvd29ya2luZy13aXRoLW9iamVjdHMvbmFtZXMvI2Rucy1zdWJkb21haW4tbmFtZXMKICAgIHJlZ2V4Lm1hdGNoKGBeXC9cLyhbYS16MC05XXszLDI0fSlcLmZpbGVcLmNvcmVcLndpbmRvd3NcLm5ldFwvW2EtejAtOV0oW2EtejAtOS4tXXswLDI1MX1bYS16MC05XSk/JGAsIGlfc3RvcmFnZS5zb3VyY2UpCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDQ6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMTogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgIT0gIm92ZXJsYXlmcyIKICAgIHBfc3RvcmFnZS5vcHRpb25zID09IGlfc3RvcmFnZS5vcHRpb25zCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAxOiB0cnVlIikKfQphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIGNvdW50KHBfc3RvcmFnZS5vcHRpb25zKSA9PSAyCgogICAgcG9saWN5X2lkcyA6PSBzcGxpdChwX3N0b3JhZ2Uub3B0aW9uc1swXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBwb2xpY3lfaWRzID0iLCBwb2xpY3lfaWRzKQogICAgcG9saWN5X2lkcyA9PSBsYXllcl9pZHMKCiAgICBwb2xpY3lfaGFzaGVzIDo9IHNwbGl0KHBfc3RvcmFnZS5vcHRpb25zWzFdLCAiOiIpCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IHBvbGljeV9oYXNoZXMgPSIsIHBvbGljeV9oYXNoZXMpCgogICAgcF9jb3VudCA6PSBjb3VudChwb2xpY3lfaWRzKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBwX2NvdW50ID0iLCBwX2NvdW50KQogICAgcF9jb3VudCA+PSAxCiAgICBwX2NvdW50ID09IGNvdW50KHBvbGljeV9oYXNoZXMpCgogICAgaV9jb3VudCA6PSBjb3VudChpX3N0b3JhZ2Uub3B0aW9ucykKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogaV9jb3VudCA9IiwgaV9jb3VudCkKICAgIGlfY291bnQgPT0gcF9jb3VudCArIDMKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zWzBdID0iLCBpX3N0b3JhZ2Uub3B0aW9uc1swXSkKICAgIGlfc3RvcmFnZS5vcHRpb25zWzBdID09ICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQubGF5ZXItc3JjLXByZWZpeD0vdmFyL2xpYi9jb250YWluZXJkL2lvLmNvbnRhaW5lcmQuc25hcHNob3R0ZXIudjEudGFyZGV2L2xheWVycyIKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zW2lfY291bnQgLSAyXSA9IiwgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDJdKQogICAgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDJdID09ICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQub3ZlcmxheS1ydyIKCiAgICBsb3dlcmRpciA6PSBjb25jYXQoIj0iLCBbImxvd2VyZGlyIiwgcF9zdG9yYWdlLm9wdGlvbnNbMF1dKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBsb3dlcmRpciA9IiwgbG93ZXJkaXIpCgogICAgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDFdID09IGxvd2VyZGlyCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zW2lfY291bnQgLSAxXSA9IiwgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDFdKQoKICAgIGV2ZXJ5IGksIHBvbGljeV9pZCBpbiBwb2xpY3lfaWRzIHsKICAgICAgICBhbGxvd19vdmVybGF5X2xheWVyKHBvbGljeV9pZCwgcG9saWN5X2hhc2hlc1tpXSwgaV9zdG9yYWdlLm9wdGlvbnNbaSArIDFdKQogICAgfQoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogdHJ1ZSIpCn0KYWxsb3dfc3RvcmFnZV9vcHRpb25zKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKSB7CiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDM6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCiAgICBjb3VudChwX3N0b3JhZ2Uub3B0aW9ucykgPT0gMQoKICAgIHN0YXJ0c3dpdGgocF9zdG9yYWdlLm9wdGlvbnNbMF0sICIkKGhhc2giKQogICAgaGFzaF9zdWZmaXggOj0gdHJpbV9sZWZ0KHBfc3RvcmFnZS5vcHRpb25zWzBdLCAiJChoYXNoIikKCiAgICBlbmRzd2l0aChoYXNoX3N1ZmZpeCwgIikiKQogICAgaGFzaF9pbmRleCA6PSB0cmltX3JpZ2h0KGhhc2hfc3VmZml4LCAiKSIpCiAgICBpIDo9IHRvX251bWJlcihoYXNoX2luZGV4KQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAzOiBpID0iLCBpKQoKICAgIGhhc2hfb3B0aW9uIDo9IGNvbmNhdCgiPSIsIFsiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LnJvb3QtaGFzaCIsIHJvb3RfaGFzaGVzW2ldXSkKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMzogaGFzaF9vcHRpb24gPSIsIGhhc2hfb3B0aW9uKQoKICAgIGNvdW50KGlfc3RvcmFnZS5vcHRpb25zKSA9PSA0CiAgICBpX3N0b3JhZ2Uub3B0aW9uc1swXSA9PSAicm8iCiAgICBpX3N0b3JhZ2Uub3B0aW9uc1sxXSA9PSAiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmJsb2NrX2RldmljZT1maWxlIgogICAgaV9zdG9yYWdlLm9wdGlvbnNbMl0gPT0gImlvLmthdGFjb250YWluZXJzLmZzLW9wdC5pcy1sYXllciIKICAgIGlfc3RvcmFnZS5vcHRpb25zWzNdID09IGhhc2hfb3B0aW9uCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAzOiB0cnVlIikKfQphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgNDogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gInNtYiIKICAgIHBfb3B0c19jb3VudCA6PSBjb3VudChwX3N0b3JhZ2Uub3B0aW9ucykKICAgIGlfb3B0c19jb3VudCA6PSBjb3VudChpX3N0b3JhZ2Uub3B0aW9ucykKICAgIGlfb3B0c19jb3VudCA9PSBwX29wdHNfY291bnQgKyAyCgogICAgaV9vcHRfbWF0Y2hlcyA6PSBbaSB8IGkgOj0gaWR4OyBpZHggPCBwX29wdHNfY291bnQ7IHBfc3RvcmFnZS5vcHRpb25zW2lkeF0gPT0gaV9zdG9yYWdlLm9wdGlvbnNbaWR4XV0KICAgIGNvdW50KGlfb3B0X21hdGNoZXMpID09IHBfb3B0c19jb3VudAoKICAgIHN0YXJ0c3dpdGgoaV9zdG9yYWdlLm9wdGlvbnNbaV9vcHRzX2NvdW50LTJdLCAiYWRkcj0iKQogICAgY3JlZHMgPSBzcGxpdChpX3N0b3JhZ2Uub3B0aW9uc1tpX29wdHNfY291bnQtMV0sICIsIikKICAgIGNvdW50KGNyZWRzKSA9PSAyCiAgICBzdGFydHN3aXRoKGNyZWRzWzBdLCAidXNlcm5hbWU9IikKICAgIHN0YXJ0c3dpdGgoY3JlZHNbMV0sICJwYXNzd29yZD0iKQogICAgCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDQ6IHRydWUiKQp9CgphbGxvd19vdmVybGF5X2xheWVyKHBvbGljeV9pZCwgcG9saWN5X2hhc2gsIGlfb3B0aW9uKSB7CiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogcG9saWN5X2lkID0iLCBwb2xpY3lfaWQsICJwb2xpY3lfaGFzaCA9IiwgcG9saWN5X2hhc2gpCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogaV9vcHRpb24gPSIsIGlfb3B0aW9uKQoKICAgIHN0YXJ0c3dpdGgoaV9vcHRpb24sICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQubGF5ZXI9IikKICAgIGlfdmFsdWUgOj0gcmVwbGFjZShpX29wdGlvbiwgImlvLmthdGFjb250YWluZXJzLmZzLW9wdC5sYXllcj0iLCAiIikKICAgIGlfdmFsdWVfZGVjb2RlZCA6PSBiYXNlNjQuZGVjb2RlKGlfdmFsdWUpCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogaV92YWx1ZV9kZWNvZGVkID0iLCBpX3ZhbHVlX2RlY29kZWQpCgogICAgcG9saWN5X3N1ZmZpeCA6PSBjb25jYXQoIj0iLCBbInRhcixybyxpby5rYXRhY29udGFpbmVycy5mcy1vcHQuYmxvY2tfZGV2aWNlPWZpbGUsaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmlzLWxheWVyLGlvLmthdGFjb250YWluZXJzLmZzLW9wdC5yb290LWhhc2giLCBwb2xpY3lfaGFzaF0pCiAgICBwX3ZhbHVlIDo9IGNvbmNhdCgiLCIsIFtwb2xpY3lfaWQsIHBvbGljeV9zdWZmaXhdKQogICAgcHJpbnQoImFsbG93X292ZXJsYXlfbGF5ZXI6IHBfdmFsdWUgPSIsIHBfdmFsdWUpCgogICAgcF92YWx1ZSA9PSBpX3ZhbHVlX2RlY29kZWQKCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogdHJ1ZSIpCn0KCmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAidGFyIgoKICAgIHN0YXJ0c3dpdGgocF9zdG9yYWdlLm1vdW50X3BvaW50LCAiJChsYXllciIpCiAgICBtb3VudF9zdWZmaXggOj0gdHJpbV9sZWZ0KHBfc3RvcmFnZS5tb3VudF9wb2ludCwgIiQobGF5ZXIiKQoKICAgIGVuZHN3aXRoKG1vdW50X3N1ZmZpeCwgIikiKQogICAgbGF5ZXJfaW5kZXggOj0gdHJpbV9yaWdodChtb3VudF9zdWZmaXgsICIpIikKICAgIGkgOj0gdG9fbnVtYmVyKGxheWVyX2luZGV4KQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDE6IGkgPSIsIGkpCgogICAgbGF5ZXJfaWQgOj0gbGF5ZXJfaWRzW2ldCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMTogbGF5ZXJfaWQgPSIsIGxheWVyX2lkKQoKICAgIHBfbW91bnQgOj0gY29uY2F0KCIvIiwgWyIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L2xheWVycyIsIGxheWVyX2lkXSkKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCAxOiBwX21vdW50ID0iLCBwX21vdW50KQoKICAgIHBfbW91bnQgPT0gaV9zdG9yYWdlLm1vdW50X3BvaW50CgogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDE6IHRydWUiKQp9CmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAiZnVzZTMua2F0YS1vdmVybGF5IgoKICAgIG1vdW50MSA6PSByZXBsYWNlKHBfc3RvcmFnZS5tb3VudF9wb2ludCwgIiQoY3BhdGgpIiwgcG9saWN5X2RhdGEuY29tbW9uLmNwYXRoKQogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDI6IG1vdW50MiA9IiwgbW91bnQyKQoKICAgIG1vdW50MiA9PSBpX3N0b3JhZ2UubW91bnRfcG9pbnQKCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMjogdHJ1ZSIpCn0KYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKSB7CiAgICBwX3N0b3JhZ2UuZnN0eXBlID09ICJsb2NhbCIKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQyID0iLCBtb3VudDIpCgogICAgbW91bnQzIDo9IHJlcGxhY2UobW91bnQyLCAiJChzYW5kYm94LWlkKSIsIHNhbmRib3hfaWQpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQzID0iLCBtb3VudDMpCgogICAgcmVnZXgubWF0Y2gobW91bnQzLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCgogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDM6IHRydWUiKQp9CmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAiYmluZCIKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNDogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNDogbW91bnQyID0iLCBtb3VudDIpCgogICAgbW91bnQzIDo9IHJlcGxhY2UobW91bnQyLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDQ6IG1vdW50MyA9IiwgbW91bnQzKQoKICAgIHJlZ2V4Lm1hdGNoKG1vdW50MywgaV9zdG9yYWdlLm1vdW50X3BvaW50KQoKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA0OiB0cnVlIikKfQphbGxvd19tb3VudF9wb2ludChwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgYnVuZGxlX2lkLCBzYW5kYm94X2lkLCBsYXllcl9pZHMpIHsKICAgIHBfc3RvcmFnZS5mc3R5cGUgPT0gInRtcGZzIgoKICAgIG1vdW50MSA6PSBwX3N0b3JhZ2UubW91bnRfcG9pbnQKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA1OiBtb3VudDEgPSIsIG1vdW50MSkKCiAgICByZWdleC5tYXRjaChtb3VudDEsIGlfc3RvcmFnZS5tb3VudF9wb2ludCkKCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNTogdHJ1ZSIpCn0KYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKSB7CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogaV9zdG9yYWdlLm1vdW50X3BvaW50ID0iLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCiAgICBhbGxvd19kaXJlY3Rfdm9sX2RyaXZlcihwX3N0b3JhZ2UsIGlfc3RvcmFnZSkKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChzcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQyID0iLCBtb3VudDIpCgogICAgZGlyZWN0X3ZvbF9wYXRoIDo9IGlfc3RvcmFnZS5zb3VyY2UKICAgIG1vdW50MyA6PSByZXBsYWNlKG1vdW50MiwgIiQoYjY0LWRpcmVjdC12b2wtcGF0aCkiLCBiYXNlNjR1cmwuZW5jb2RlKGRpcmVjdF92b2xfcGF0aCkpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQzID0iLCBtb3VudDMpCgogICAgbW91bnQzID09IGlfc3RvcmFnZS5tb3VudF9wb2ludAoKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA2OiB0cnVlIikKfQoKYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIocF9zdG9yYWdlLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19kaXJlY3Rfdm9sX2RyaXZlciAxOiBzdGFydCIpCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCiAgICBwcmludCgiYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIgMTogdHJ1ZSIpCn0KYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIocF9zdG9yYWdlLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19kaXJlY3Rfdm9sX2RyaXZlciAyOiBzdGFydCIpCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJzbWIiCiAgICBwcmludCgiYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIgMjogdHJ1ZSIpCn0KCiMgRXhlY1Byb2Nlc3NSZXF1ZXN0LnByb2Nlc3MuQ2FwYWJpbGl0aWVzCmFsbG93X2V4ZWNfY2FwcyhpX2NhcHMpIHsKICAgIG5vdCBpX2NhcHMuQW1iaWVudAogICAgbm90IGlfY2Fwcy5Cb3VuZGluZwogICAgbm90IGlfY2Fwcy5FZmZlY3RpdmUKICAgIG5vdCBpX2NhcHMuSW5oZXJpdGFibGUKICAgIG5vdCBpX2NhcHMuUGVybWl0dGVkCn0KCiMgT0NJLlByb2Nlc3MuQ2FwYWJpbGl0aWVzCmFsbG93X2NhcHMocF9jYXBzLCBpX2NhcHMpIHsKICAgIHByaW50KCJhbGxvd19jYXBzOiBwb2xpY3kgQW1iaWVudCA9IiwgcF9jYXBzLkFtYmllbnQpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgQW1iaWVudCA9IiwgaV9jYXBzLkFtYmllbnQpCiAgICBtYXRjaF9jYXBzKHBfY2Fwcy5BbWJpZW50LCBpX2NhcHMuQW1iaWVudCkKCiAgICBwcmludCgiYWxsb3dfY2FwczogcG9saWN5IEJvdW5kaW5nID0iLCBwX2NhcHMuQm91bmRpbmcpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgQm91bmRpbmcgPSIsIGlfY2Fwcy5Cb3VuZGluZykKICAgIG1hdGNoX2NhcHMocF9jYXBzLkJvdW5kaW5nLCBpX2NhcHMuQm91bmRpbmcpCgogICAgcHJpbnQoImFsbG93X2NhcHM6IHBvbGljeSBFZmZlY3RpdmUgPSIsIHBfY2Fwcy5FZmZlY3RpdmUpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgRWZmZWN0aXZlID0iLCBpX2NhcHMuRWZmZWN0aXZlKQogICAgbWF0Y2hfY2FwcyhwX2NhcHMuRWZmZWN0aXZlLCBpX2NhcHMuRWZmZWN0aXZlKQoKICAgIHByaW50KCJhbGxvd19jYXBzOiBwb2xpY3kgSW5oZXJpdGFibGUgPSIsIHBfY2Fwcy5Jbmhlcml0YWJsZSkKICAgIHByaW50KCJhbGxvd19jYXBzOiBpbnB1dCBJbmhlcml0YWJsZSA9IiwgaV9jYXBzLkluaGVyaXRhYmxlKQogICAgbWF0Y2hfY2FwcyhwX2NhcHMuSW5oZXJpdGFibGUsIGlfY2Fwcy5Jbmhlcml0YWJsZSkKCiAgICBwcmludCgiYWxsb3dfY2FwczogcG9saWN5IFBlcm1pdHRlZCA9IiwgcF9jYXBzLlBlcm1pdHRlZCkKICAgIHByaW50KCJhbGxvd19jYXBzOiBpbnB1dCBQZXJtaXR0ZWQgPSIsIGlfY2Fwcy5QZXJtaXR0ZWQpCiAgICBtYXRjaF9jYXBzKHBfY2Fwcy5QZXJtaXR0ZWQsIGlfY2Fwcy5QZXJtaXR0ZWQpCn0KCm1hdGNoX2NhcHMocF9jYXBzLCBpX2NhcHMpIHsKICAgIHByaW50KCJtYXRjaF9jYXBzIDE6IHN0YXJ0IikKCiAgICBwX2NhcHMgPT0gaV9jYXBzCgogICAgcHJpbnQoIm1hdGNoX2NhcHMgMTogdHJ1ZSIpCn0KbWF0Y2hfY2FwcyhwX2NhcHMsIGlfY2FwcykgewogICAgcHJpbnQoIm1hdGNoX2NhcHMgMjogc3RhcnQiKQoKICAgIGNvdW50KHBfY2FwcykgPT0gMQogICAgcF9jYXBzWzBdID09ICIkKGRlZmF1bHRfY2FwcykiCgogICAgcHJpbnQoIm1hdGNoX2NhcHMgMjogZGVmYXVsdF9jYXBzID0iLCBwb2xpY3lfZGF0YS5jb21tb24uZGVmYXVsdF9jYXBzKQogICAgcG9saWN5X2RhdGEuY29tbW9uLmRlZmF1bHRfY2FwcyA9PSBpX2NhcHMKCiAgICBwcmludCgibWF0Y2hfY2FwcyAyOiB0cnVlIikKfQptYXRjaF9jYXBzKHBfY2FwcywgaV9jYXBzKSB7CiAgICBwcmludCgibWF0Y2hfY2FwcyAzOiBzdGFydCIpCgogICAgY291bnQocF9jYXBzKSA9PSAxCiAgICBwX2NhcHNbMF0gPT0gIiQocHJpdmlsZWdlZF9jYXBzKSIKCiAgICBwcmludCgibWF0Y2hfY2FwcyAzOiBwcml2aWxlZ2VkX2NhcHMgPSIsIHBvbGljeV9kYXRhLmNvbW1vbi5wcml2aWxlZ2VkX2NhcHMpCiAgICBwb2xpY3lfZGF0YS5jb21tb24ucHJpdmlsZWdlZF9jYXBzID09IGlfY2FwcwoKICAgIHByaW50KCJtYXRjaF9jYXBzIDM6IHRydWUiKQp9CgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgpjaGVja19kaXJlY3RvcnlfdHJhdmVyc2FsKGlfcGF0aCkgewogICAgbm90IHJlZ2V4Lm1hdGNoKCIoXnwvKS4uKCR8LykiLCBpX3BhdGgpCn0KCmNoZWNrX3N5bWxpbmtfc291cmNlKGlfc3JjKSB7CiAgICBpX3NyYyA9PSAiIgogICAgcHJpbnQoImNoZWNrX3N5bWxpbmtfc291cmNlIDE6IHRydWUiKQp9CmNoZWNrX3N5bWxpbmtfc291cmNlKGlfc3JjKSB7CiAgICBpX3NyYyAhPSAiIgogICAgcHJpbnQoImNoZWNrX3N5bWxpbmtfc291cmNlIDI6IGlfc3JjID0iLCBpX3NyYykKCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24uc19zb3VyY2UxLCBpX3NyYykKCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMjogdHJ1ZSIpCn0KY2hlY2tfc3ltbGlua19zb3VyY2UoaV9zcmMpIHsKICAgIGlfc3JjICE9ICIiCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMzogaV9zcmMgPSIsIGlfc3JjKQoKICAgIHJlZ2V4Lm1hdGNoKHBvbGljeV9kYXRhLmNvbW1vbi5zX3NvdXJjZTIsIGlfc3JjKQogICAgY2hlY2tfZGlyZWN0b3J5X3RyYXZlcnNhbChpX3NyYykKCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMzogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfc3RvcmFnZXMoaV9zdG9yYWdlcykgewogICAgcHJpbnQoImFsbG93X3NhbmRib3hfc3RvcmFnZXM6IGlfc3RvcmFnZXMgPSIsIGlfc3RvcmFnZXMpCgogICAgcF9zdG9yYWdlcyA6PSBwb2xpY3lfZGF0YS5zYW5kYm94LnN0b3JhZ2VzCiAgICBldmVyeSBpX3N0b3JhZ2UgaW4gaV9zdG9yYWdlcyB7CiAgICAgICAgYWxsb3dfc2FuZGJveF9zdG9yYWdlKHBfc3RvcmFnZXMsIGlfc3RvcmFnZSkKICAgIH0KCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9zdG9yYWdlczogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfc3RvcmFnZShwX3N0b3JhZ2VzLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IGlfc3RvcmFnZSA9IiwgaV9zdG9yYWdlKQoKICAgIHNvbWUgcF9zdG9yYWdlIGluIHBfc3RvcmFnZXMKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IHBfc3RvcmFnZSA9IiwgcF9zdG9yYWdlKQogICAgaV9zdG9yYWdlID09IHBfc3RvcmFnZQoKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IHRydWUiKQp9CgpDb3B5RmlsZVJlcXVlc3QgewogICAgcHJpbnQoIkNvcHlGaWxlUmVxdWVzdDogaW5wdXQucGF0aCA9IiwgaW5wdXQucGF0aCkKCiAgICBjaGVja19zeW1saW5rX3NvdXJjZShpbnB1dC5zeW1saW5rX3NyYykKICAgIGNoZWNrX2RpcmVjdG9yeV90cmF2ZXJzYWwoaW5wdXQucGF0aCkKCiAgICBzb21lIHJlZ2V4MSBpbiBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLkNvcHlGaWxlUmVxdWVzdAogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5jcGF0aCkKICAgIHJlZ2V4NCA6PSByZXBsYWNlKHJlZ2V4MywgIiQoYnVuZGxlLWlkKSIsIEJVTkRMRV9JRCkKICAgIHByaW50KCJDb3B5RmlsZVJlcXVlc3Q6IHJlZ2V4NCA9IiwgcmVnZXg0KQoKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4NCwgaW5wdXQucGF0aCkKCiAgICBwcmludCgiQ29weUZpbGVSZXF1ZXN0OiB0cnVlIikKfQoKQ3JlYXRlU2FuZGJveFJlcXVlc3QgewogICAgcHJpbnQoIkNyZWF0ZVNhbmRib3hSZXF1ZXN0OiBpbnB1dC5ndWVzdF9ob29rX3BhdGggPSIsIGlucHV0Lmd1ZXN0X2hvb2tfcGF0aCkKICAgIGNvdW50KGlucHV0Lmd1ZXN0X2hvb2tfcGF0aCkgPT0gMAoKICAgIHByaW50KCJDcmVhdGVTYW5kYm94UmVxdWVzdDogaW5wdXQua2VybmVsX21vZHVsZXMgPSIsIGlucHV0Lmtlcm5lbF9tb2R1bGVzKQogICAgY291bnQoaW5wdXQua2VybmVsX21vZHVsZXMpID09IDAKCiAgICBpX3BpZG5zIDo9IGlucHV0LnNhbmRib3hfcGlkbnMKICAgIHByaW50KCJDcmVhdGVTYW5kYm94UmVxdWVzdDogaV9waWRucyA9IiwgaV9waWRucykKICAgIGlfcGlkbnMgPT0gZmFsc2UKICAgIGFsbG93X3NhbmRib3hfc3RvcmFnZXMoaW5wdXQuc3RvcmFnZXMpCn0KCmFsbG93X2V4ZWMocF9jb250YWluZXIsIGlfcHJvY2VzcykgewogICAgcHJpbnQoImFsbG93X2V4ZWM6IHN0YXJ0IikKCiAgICBwX29jaSA9IHBfY29udGFpbmVyLk9DSQogICAgcF9zX25hbWUgPSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc19uYW1lc3BhY2UgPSBnZXRfc3RhdGVfdmFsKCJuYW1lc3BhY2UiKQogICAgYWxsb3dfcHJvYmVfcHJvY2VzcyhwX29jaS5Qcm9jZXNzLCBpX3Byb2Nlc3MsIHBfc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfZXhlYzogdHJ1ZSIpCn0KCmFsbG93X2ludGVyYWN0aXZlX2V4ZWMocF9jb250YWluZXIsIGlfcHJvY2VzcykgewogICAgcHJpbnQoImFsbG93X2ludGVyYWN0aXZlX2V4ZWM6IHN0YXJ0IikKCiAgICBwX29jaSA9IHBfY29udGFpbmVyLk9DSQogICAgcF9zX25hbWUgPSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc19uYW1lc3BhY2UgPSBnZXRfc3RhdGVfdmFsKCJuYW1lc3BhY2UiKQogICAgYWxsb3dfaW50ZXJhY3RpdmVfcHJvY2VzcyhwX29jaS5Qcm9jZXNzLCBpX3Byb2Nlc3MsIHBfc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfaW50ZXJhY3RpdmVfZXhlYzogdHJ1ZSIpCn0KCiMgVE9ETzogc2hvdWxkIG90aGVyIEV4ZWNQcm9jZXNzUmVxdWVzdCBpbnB1dCBkYXRhIGZpZWxkcyBiZSB2YWxpZGF0ZWQgYXMgd2VsbD8KRXhlY1Byb2Nlc3NSZXF1ZXN0IHsKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMTogaW5wdXQgPSIsIGlucHV0KQoKICAgIHNvbWUgcF9jb21tYW5kIGluIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuRXhlY1Byb2Nlc3NSZXF1ZXN0LmFsbG93ZWRfY29tbWFuZHMKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMTogcF9jb21tYW5kID0iLCBwX2NvbW1hbmQpCiAgICBwX2NvbW1hbmQgPT0gaW5wdXQucHJvY2Vzcy5BcmdzCgogICAgIyBUT0RPOiBtYXRjaCBwX2NvbnRhaW5lcidzIElEIHdpdGggdGhlIGlucHV0IGNvbnRhaW5lcl9pZC4KICAgIHNvbWUgcF9jb250YWluZXIgaW4gcG9saWN5X2RhdGEuY29udGFpbmVycwogICAgYWxsb3dfaW50ZXJhY3RpdmVfZXhlYyhwX2NvbnRhaW5lciwgaW5wdXQucHJvY2VzcykKCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDE6IHRydWUiKQp9CkV4ZWNQcm9jZXNzUmVxdWVzdCB7CiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDI6IGlucHV0ID0iLCBpbnB1dCkKCiAgICAjIFRPRE86IG1hdGNoIGlucHV0IGNvbnRhaW5lciBJRCB3aXRoIGl0cyBjb3JyZXNwb25kaW5nIGNvbnRhaW5lci5leGVjX2NvbW1hbmRzLgogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBzb21lIHBfY29tbWFuZCBpbiBwX2NvbnRhaW5lci5leGVjX2NvbW1hbmRzCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDI6IHBfY29tbWFuZCA9IiwgcF9jb21tYW5kKQoKICAgICMgVE9ETzogc2hvdWxkIG90aGVyIGlucHV0IGRhdGEgZmllbGRzIGJlIHZhbGlkYXRlZCBhcyB3ZWxsPwogICAgcF9jb21tYW5kID09IGlucHV0LnByb2Nlc3MuQXJncwoKICAgIGFsbG93X2V4ZWMocF9jb250YWluZXIsIGlucHV0LnByb2Nlc3MpCgogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAyOiB0cnVlIikKfQpFeGVjUHJvY2Vzc1JlcXVlc3QgewogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAzOiBpbnB1dCA9IiwgaW5wdXQpCgogICAgaV9jb21tYW5kID0gY29uY2F0KCIgIiwgaW5wdXQucHJvY2Vzcy5BcmdzKQogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAzOiBpX2NvbW1hbmQgPSIsIGlfY29tbWFuZCkKCiAgICBzb21lIHBfcmVnZXggaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5FeGVjUHJvY2Vzc1JlcXVlc3QucmVnZXgKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMzogcF9yZWdleCA9IiwgcF9yZWdleCkKCiAgICByZWdleC5tYXRjaChwX3JlZ2V4LCBpX2NvbW1hbmQpCgogICAgIyBUT0RPOiBtYXRjaCBwX2NvbnRhaW5lcidzIElEIHdpdGggdGhlIGlucHV0IGNvbnRhaW5lcl9pZC4KICAgIHNvbWUgcF9jb250YWluZXIgaW4gcG9saWN5X2RhdGEuY29udGFpbmVycwogICAgYWxsb3dfaW50ZXJhY3RpdmVfZXhlYyhwX2NvbnRhaW5lciwgaW5wdXQucHJvY2VzcykKCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDM6IHRydWUiKQp9CgpVcGRhdGVSb3V0ZXNSZXF1ZXN0IHsKICAgIHByaW50KCJVcGRhdGVSb3V0ZXNSZXF1ZXN0OiBpbnB1dCA9IiwgaW5wdXQpCiAgICBwcmludCgiVXBkYXRlUm91dGVzUmVxdWVzdDogcG9saWN5ID0iLCBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLlVwZGF0ZVJvdXRlc1JlcXVlc3QpCgogICAgaV9yb3V0ZXMgOj0gaW5wdXQucm91dGVzLlJvdXRlcwogICAgcF9zb3VyY2VfcmVnZXggPSBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLlVwZGF0ZVJvdXRlc1JlcXVlc3QuZm9yYmlkZGVuX3NvdXJjZV9yZWdleAogICAgcF9uYW1lcyA9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuVXBkYXRlUm91dGVzUmVxdWVzdC5mb3JiaWRkZW5fZGV2aWNlX25hbWVzCgogICAgZXZlcnkgaV9yb3V0ZSBpbiBpX3JvdXRlcyB7CiAgICAgICAgcHJpbnQoImlfcm91dGUuc291cmNlID0iLCBpX3JvdXRlLnNvdXJjZSkKICAgICAgICBldmVyeSBwX3JlZ2V4IGluIHBfc291cmNlX3JlZ2V4IHsKICAgICAgICAgICAgcHJpbnQoInBfcmVnZXggPSIsIHBfcmVnZXgpCiAgICAgICAgICAgIG5vdCByZWdleC5tYXRjaChwX3JlZ2V4LCBpX3JvdXRlLnNvdXJjZSkKICAgICAgICB9CgogICAgICAgIHByaW50KCJpX3JvdXRlLmRldmljZSA9IiwgaV9yb3V0ZS5kZXZpY2UpCiAgICAgICAgbm90IGlfcm91dGUuZGV2aWNlIGluIHBfbmFtZXMKICAgIH0KCiAgICBwcmludCgiVXBkYXRlUm91dGVzUmVxdWVzdDogdHJ1ZSIpCn0KClVwZGF0ZUludGVyZmFjZVJlcXVlc3QgewogICAgcHJpbnQoIlVwZGF0ZUludGVyZmFjZVJlcXVlc3Q6IGlucHV0ID0iLCBpbnB1dCkKICAgIHByaW50KCJVcGRhdGVJbnRlcmZhY2VSZXF1ZXN0OiBwb2xpY3kgPSIsIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuVXBkYXRlSW50ZXJmYWNlUmVxdWVzdCkKCiAgICBpX2ludGVyZmFjZSA6PSBpbnB1dC5pbnRlcmZhY2UKICAgIHBfZmxhZ3MgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmFsbG93X3Jhd19mbGFncwoKICAgICMgVHlwaWNhbGx5LCBqdXN0IElGRl9OT0FSUCBpcyB1c2VkLgogICAgYml0cy5hbmQoaV9pbnRlcmZhY2UucmF3X2ZsYWdzLCBiaXRzLm5lZ2F0ZShwX2ZsYWdzKSkgPT0gMAoKICAgIHBfbmFtZXMgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmZvcmJpZGRlbl9uYW1lcwoKICAgIG5vdCBpX2ludGVyZmFjZS5uYW1lIGluIHBfbmFtZXMKCiAgICBwX2h3YWRkcnMgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmZvcmJpZGRlbl9od19hZGRycwoKICAgIG5vdCBpX2ludGVyZmFjZS5od0FkZHIgaW4gcF9od2FkZHJzCgogICAgcHJpbnQoIlVwZGF0ZUludGVyZmFjZVJlcXVlc3Q6IHRydWUiKQp9CgpDbG9zZVN0ZGluUmVxdWVzdCB7CiAgICBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLkNsb3NlU3RkaW5SZXF1ZXN0ID09IHRydWUKfQoKUmVhZFN0cmVhbVJlcXVlc3QgewogICAgcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5SZWFkU3RyZWFtUmVxdWVzdCA9PSB0cnVlCn0KClVwZGF0ZUVwaGVtZXJhbE1vdW50c1JlcXVlc3QgewogICAgcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVFcGhlbWVyYWxNb3VudHNSZXF1ZXN0ID09IHRydWUKfQoKV3JpdGVTdHJlYW1SZXF1ZXN0IHsKICAgIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuV3JpdGVTdHJlYW1SZXF1ZXN0ID09IHRydWUKfQoKcG9saWN5X2RhdGEgOj0gewogICJjb250YWluZXJzIjogWwogICAgewogICAgICAiT0NJIjogewogICAgICAgICJWZXJzaW9uIjogIjEuMS4wLXJjLjEiLAogICAgICAgICJQcm9jZXNzIjogewogICAgICAgICAgIlRlcm1pbmFsIjogZmFsc2UsCiAgICAgICAgICAiVXNlciI6IHsKICAgICAgICAgICAgIlVJRCI6IDY1NTM1LAogICAgICAgICAgICAiR0lEIjogNjU1MzUsCiAgICAgICAgICAgICJBZGRpdGlvbmFsR2lkcyI6IFtdLAogICAgICAgICAgICAiVXNlcm5hbWUiOiAiIgogICAgICAgICAgfSwKICAgICAgICAgICJEZXByZWNhdGVkQXJncyI6IFsKICAgICAgICAgICAgIi9wYXVzZSIKICAgICAgICAgIF0sCiAgICAgICAgICAiQXJncyI6IFsKICAgICAgICAgICAgIi9wYXVzZSIKICAgICAgICAgIF0sCiAgICAgICAgICAiRW52IjogWwogICAgICAgICAgICAiUEFUSD0vdXNyL2xvY2FsL3NiaW46L3Vzci9sb2NhbC9iaW46L3Vzci9zYmluOi91c3IvYmluOi9zYmluOi9iaW4iCiAgICAgICAgICBdLAogICAgICAgICAgIkN3ZCI6ICIvIiwKICAgICAgICAgICJDYXBhYmlsaXRpZXMiOiB7CiAgICAgICAgICAgICJBbWJpZW50IjogW10sCiAgICAgICAgICAgICJCb3VuZGluZyI6IFsKICAgICAgICAgICAgICAiJChkZWZhdWx0X2NhcHMpIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiRWZmZWN0aXZlIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJJbmhlcml0YWJsZSI6IFtdLAogICAgICAgICAgICAiUGVybWl0dGVkIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICAiTm9OZXdQcml2aWxlZ2VzIjogdHJ1ZQogICAgICAgIH0sCiAgICAgICAgIlJvb3QiOiB7CiAgICAgICAgICAiUGF0aCI6ICIkKGNwYXRoKS8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgIlJlYWRvbmx5IjogdHJ1ZQogICAgICAgIH0sCiAgICAgICAgIk1vdW50cyI6IFsKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9wcm9jIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJwcm9jIiwKICAgICAgICAgICAgInR5cGVfIjogInByb2MiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2IiwKICAgICAgICAgICAgInNvdXJjZSI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJzdHJpY3RhdGltZSIsCiAgICAgICAgICAgICAgIm1vZGU9NzU1IiwKICAgICAgICAgICAgICAic2l6ZT02NTUzNmsiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L3B0cyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiZGV2cHRzIiwKICAgICAgICAgICAgInR5cGVfIjogImRldnB0cyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJuZXdpbnN0YW5jZSIsCiAgICAgICAgICAgICAgInB0bXhtb2RlPTA2NjYiLAogICAgICAgICAgICAgICJtb2RlPTA2MjAiLAogICAgICAgICAgICAgICJnaWQ9NSIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvc2htIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L3NobSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi9tcXVldWUiLAogICAgICAgICAgICAic291cmNlIjogIm1xdWV1ZSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJtcXVldWUiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvc3lzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJzeXNmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJzeXNmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2V0Yy9yZXNvbHYuY29uZiIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClyZXNvbHYuY29uZiQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJvIiwKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9kZXYiLAogICAgICAgICAgICAgICJub2V4ZWMiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0KICAgICAgICBdLAogICAgICAgICJBbm5vdGF0aW9ucyI6IHsKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmJ1bmRsZV9wYXRoIjogIi9ydW4vY29udGFpbmVyZC9pby5jb250YWluZXJkLnJ1bnRpbWUudjIudGFzay9rOHMuaW8vJChidW5kbGUtaWQpIiwKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIjogInBvZF9zYW5kYm94IiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSI6ICJzYW5kYm94IiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWlkIjogIl5bYS16MC05XXs2NH0kIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWxvZy1kaXJlY3RvcnkiOiAiXi92YXIvbG9nL3BvZHMvJChzYW5kYm94LW5hbWVzcGFjZSlfJChzYW5kYm94LW5hbWUpX1swLTlhLWZdezh9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezEyfSQiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZSI6ICJedGhyZWVcXC1jb250YWluZXJzJCIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1uYW1lc3BhY2UiOiAiIiwKICAgICAgICAgICJuZXJkY3RsL25ldHdvcmstbmFtZXNwYWNlIjogIl4vdmFyL3J1bi9uZXRucy9jbmktWzAtOWEtZl17OH0tWzAtOWEtZl17NH0tWzAtOWEtZl17NH0tWzAtOWEtZl17NH0tWzAtOWEtZl17MTJ9JCIKICAgICAgICB9LAogICAgICAgICJMaW51eCI6IHsKICAgICAgICAgICJOYW1lc3BhY2VzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgIlR5cGUiOiAiaXBjIiwKICAgICAgICAgICAgICAiUGF0aCI6ICIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiVHlwZSI6ICJ1dHMiLAogICAgICAgICAgICAgICJQYXRoIjogIiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJUeXBlIjogIm1vdW50IiwKICAgICAgICAgICAgICAiUGF0aCI6ICIiCiAgICAgICAgICAgIH0KICAgICAgICAgIF0sCiAgICAgICAgICAiTWFza2VkUGF0aHMiOiBbCiAgICAgICAgICAgICIvcHJvYy9hY3BpIiwKICAgICAgICAgICAgIi9wcm9jL2Fzb3VuZCIsCiAgICAgICAgICAgICIvcHJvYy9rY29yZSIsCiAgICAgICAgICAgICIvcHJvYy9rZXlzIiwKICAgICAgICAgICAgIi9wcm9jL2xhdGVuY3lfc3RhdHMiLAogICAgICAgICAgICAiL3Byb2MvdGltZXJfbGlzdCIsCiAgICAgICAgICAgICIvcHJvYy90aW1lcl9zdGF0cyIsCiAgICAgICAgICAgICIvcHJvYy9zY2hlZF9kZWJ1ZyIsCiAgICAgICAgICAgICIvc3lzL2Zpcm13YXJlIiwKICAgICAgICAgICAgIi9wcm9jL3Njc2kiCiAgICAgICAgICBdLAogICAgICAgICAgIlJlYWRvbmx5UGF0aHMiOiBbCiAgICAgICAgICAgICIvcHJvYy9idXMiLAogICAgICAgICAgICAiL3Byb2MvZnMiLAogICAgICAgICAgICAiL3Byb2MvaXJxIiwKICAgICAgICAgICAgIi9wcm9jL3N5cyIsCiAgICAgICAgICAgICIvcHJvYy9zeXNycS10cmlnZ2VyIgogICAgICAgICAgXSwKICAgICAgICAgICJEZXZpY2VzIjogW10sCiAgICAgICAgICAiU3lzY3RsIjogewogICAgICAgICAgICAibmV0LmlwdjQuaXBfdW5wcml2aWxlZ2VkX3BvcnRfc3RhcnQiOiAiMCIsCiAgICAgICAgICAgICJuZXQuaXB2NC5waW5nX2dyb3VwX3JhbmdlIjogIjAgMjE0NzQ4MzY0NyIKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0sCiAgICAgICJzdG9yYWdlcyI6IFsKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoMCkiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXIwKSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogIm92ZXJsYXlmcyIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAiZnVzZTMua2F0YS1vdmVybGF5IiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiNWE1YWFkODAwNTVmZjIwMDEyYTUwZGMyNWY4ZGY3YTI5OTI0NDc0MzI0ZDY1ZjdkNTMwNmVlOGVlMjdmZjcxZCIsCiAgICAgICAgICAgICI4MTcyNTBmMWEzZTMzNmRhNzZmNWJkM2ZhNzg0ZTFiMjZkOTU5YjljMTMxODc2ODE1YmEyNjA0MDQ4YjcwYzE4IgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGNwYXRoKS8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0KICAgICAgXSwKICAgICAgImRldmljZXMiOiBbXSwKICAgICAgInNhbmRib3hfcGlkbnMiOiBmYWxzZSwKICAgICAgImV4ZWNfY29tbWFuZHMiOiBbXSwKICAgICAgImVudl9tYXAiOiB7CiAgICAgICAgIlBBVEgiOiAiL3Vzci9sb2NhbC9zYmluOi91c3IvbG9jYWwvYmluOi91c3Ivc2JpbjovdXNyL2Jpbjovc2JpbjovYmluIgogICAgICB9CiAgICB9LAogICAgewogICAgICAiT0NJIjogewogICAgICAgICJWZXJzaW9uIjogIjEuMS4wLXJjLjEiLAogICAgICAgICJQcm9jZXNzIjogewogICAgICAgICAgIlRlcm1pbmFsIjogZmFsc2UsCiAgICAgICAgICAiVXNlciI6IHsKICAgICAgICAgICAgIlVJRCI6IDAsCiAgICAgICAgICAgICJHSUQiOiAwLAogICAgICAgICAgICAiQWRkaXRpb25hbEdpZHMiOiBbXSwKICAgICAgICAgICAgIlVzZXJuYW1lIjogIiIKICAgICAgICAgIH0sCiAgICAgICAgICAiRGVwcmVjYXRlZEFyZ3MiOiBbCiAgICAgICAgICAgICJheiIsCiAgICAgICAgICAgICItLWhlbHAiCiAgICAgICAgICBdLAogICAgICAgICAgIkFyZ3MiOiBbCiAgICAgICAgICAgICJheiIsCiAgICAgICAgICAgICItLWhlbHAiCiAgICAgICAgICBdLAogICAgICAgICAgIkVudiI6IFsKICAgICAgICAgICAgIlBBVEg9L3Vzci9sb2NhbC9zYmluOi91c3IvbG9jYWwvYmluOi91c3Ivc2JpbjovdXNyL2Jpbjovc2JpbjovYmluIiwKICAgICAgICAgICAgIkFaX0lOU1RBTExFUj1ET0NLRVIiLAogICAgICAgICAgICAiSE9TVE5BTUU9JChob3N0LW5hbWUpIgogICAgICAgICAgXSwKICAgICAgICAgICJDd2QiOiAiLyIsCiAgICAgICAgICAiQ2FwYWJpbGl0aWVzIjogewogICAgICAgICAgICAiQW1iaWVudCI6IFtdLAogICAgICAgICAgICAiQm91bmRpbmciOiBbCiAgICAgICAgICAgICAgIiQoZGVmYXVsdF9jYXBzKSIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgIkVmZmVjdGl2ZSI6IFsKICAgICAgICAgICAgICAiJChkZWZhdWx0X2NhcHMpIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiSW5oZXJpdGFibGUiOiBbXSwKICAgICAgICAgICAgIlBlcm1pdHRlZCI6IFsKICAgICAgICAgICAgICAiJChkZWZhdWx0X2NhcHMpIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgIk5vTmV3UHJpdmlsZWdlcyI6IGZhbHNlCiAgICAgICAgfSwKICAgICAgICAiUm9vdCI6IHsKICAgICAgICAgICJQYXRoIjogIiQoY3BhdGgpLyQoYnVuZGxlLWlkKSIsCiAgICAgICAgICAiUmVhZG9ubHkiOiBmYWxzZQogICAgICAgIH0sCiAgICAgICAgIk1vdW50cyI6IFsKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9wcm9jIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJwcm9jIiwKICAgICAgICAgICAgInR5cGVfIjogInByb2MiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2IiwKICAgICAgICAgICAgInNvdXJjZSI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJzdHJpY3RhdGltZSIsCiAgICAgICAgICAgICAgIm1vZGU9NzU1IiwKICAgICAgICAgICAgICAic2l6ZT02NTUzNmsiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L3B0cyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiZGV2cHRzIiwKICAgICAgICAgICAgInR5cGVfIjogImRldnB0cyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJuZXdpbnN0YW5jZSIsCiAgICAgICAgICAgICAgInB0bXhtb2RlPTA2NjYiLAogICAgICAgICAgICAgICJtb2RlPTA2MjAiLAogICAgICAgICAgICAgICJnaWQ9NSIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvc2htIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L3NobSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi9tcXVldWUiLAogICAgICAgICAgICAic291cmNlIjogIm1xdWV1ZSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJtcXVldWUiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvc3lzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJzeXNmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJzeXNmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL3N5cy9mcy9jZ3JvdXAiLAogICAgICAgICAgICAic291cmNlIjogImNncm91cCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJjZ3JvdXAiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiLAogICAgICAgICAgICAgICJyZWxhdGltZSIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2V0Yy9ob3N0cyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClob3N0cyQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicnciCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L3Rlcm1pbmF0aW9uLWxvZyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeCl0ZXJtaW5hdGlvbi1sb2ckIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJ3IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2V0Yy9ob3N0bmFtZSIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClob3N0bmFtZSQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicnciCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZXRjL3Jlc29sdi5jb25mIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KXJlc29sdi5jb25mJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJydyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi92YXIvcnVuL3NlY3JldHMva3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudCIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClzZXJ2aWNlYWNjb3VudCQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicm8iCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvdmFyL3J1bi9zZWNyZXRzL2F6dXJlL3Rva2VucyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeCl0b2tlbnMkIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9CiAgICAgICAgXSwKICAgICAgICAiQW5ub3RhdGlvbnMiOiB7CiAgICAgICAgICAiaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5idW5kbGVfcGF0aCI6ICIvcnVuL2NvbnRhaW5lcmQvaW8uY29udGFpbmVyZC5ydW50aW1lLnYyLnRhc2svazhzLmlvLyQoYnVuZGxlLWlkKSIsCiAgICAgICAgICAiaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5jb250YWluZXJfdHlwZSI6ICJwb2RfY29udGFpbmVyIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItbmFtZSI6ICJtYXJpbmVyLWNsaSIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLXR5cGUiOiAiY29udGFpbmVyIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5pbWFnZS1uYW1lIjogIm1jci5taWNyb3NvZnQuY29tL2F6dXJlLWNsaToyLjU4LjAtY2JsLW1hcmluZXIyLjAtYW1kNjQiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtaWQiOiAiXlthLXowLTldezY0fSQiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZSI6ICJedGhyZWVcXC1jb250YWluZXJzJCIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1uYW1lc3BhY2UiOiAiIgogICAgICAgIH0sCiAgICAgICAgIkxpbnV4IjogewogICAgICAgICAgIk5hbWVzcGFjZXMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiVHlwZSI6ICJpcGMiLAogICAgICAgICAgICAgICJQYXRoIjogIiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJUeXBlIjogInV0cyIsCiAgICAgICAgICAgICAgIlBhdGgiOiAiIgogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgIlR5cGUiOiAibW91bnQiLAogICAgICAgICAgICAgICJQYXRoIjogIiIKICAgICAgICAgICAgfQogICAgICAgICAgXSwKICAgICAgICAgICJNYXNrZWRQYXRocyI6IFsKICAgICAgICAgICAgIi9wcm9jL2FjcGkiLAogICAgICAgICAgICAiL3Byb2Mva2NvcmUiLAogICAgICAgICAgICAiL3Byb2Mva2V5cyIsCiAgICAgICAgICAgICIvcHJvYy9sYXRlbmN5X3N0YXRzIiwKICAgICAgICAgICAgIi9wcm9jL3RpbWVyX2xpc3QiLAogICAgICAgICAgICAiL3Byb2MvdGltZXJfc3RhdHMiLAogICAgICAgICAgICAiL3Byb2Mvc2NoZWRfZGVidWciLAogICAgICAgICAgICAiL3Byb2Mvc2NzaSIsCiAgICAgICAgICAgICIvc3lzL2Zpcm13YXJlIgogICAgICAgICAgXSwKICAgICAgICAgICJSZWFkb25seVBhdGhzIjogWwogICAgICAgICAgICAiL3Byb2MvYXNvdW5kIiwKICAgICAgICAgICAgIi9wcm9jL2J1cyIsCiAgICAgICAgICAgICIvcHJvYy9mcyIsCiAgICAgICAgICAgICIvcHJvYy9pcnEiLAogICAgICAgICAgICAiL3Byb2Mvc3lzIiwKICAgICAgICAgICAgIi9wcm9jL3N5c3JxLXRyaWdnZXIiCiAgICAgICAgICBdLAogICAgICAgICAgIkRldmljZXMiOiBbXSwKICAgICAgICAgICJTeXNjdGwiOiB7CiAgICAgICAgICAgICJuZXQuaXB2NC5pcF91bnByaXZpbGVnZWRfcG9ydF9zdGFydCI6ICIwIiwKICAgICAgICAgICAgIm5ldC5pcHY0LnBpbmdfZ3JvdXBfcmFuZ2UiOiAiMCAyMTQ3NDgzNjQ3IgogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSwKICAgICAgInN0b3JhZ2VzIjogWwogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2gwKSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjApIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2gxKSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjEpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2gyKSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjIpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAib3ZlcmxheWZzIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJmdXNlMy5rYXRhLW92ZXJsYXkiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIwNDdmODdmMWJjZDNkYmU2MWExMjZiODc5ODY4Mzc3MTljMmIzMmNkNjI4NTc0Mzk4MzhjMzgxZWVlOTE4ZTE2OjEzMGQyMDA2YmVkYjUyYmRiNGY5YTBiNjVjY2I4OGFjYmE5NGY2N2JkODhjNGI0NGEzODE3OTliMmQxMmZiY2Y6ODk2ZDBmYjAwZTNkNDQzNDM2ZTMyNjE3OWVjMTYyMThkNGVjYWVjZGY1ZDU5NzIxNzlkZDg1ZjNhM2YwYjZiZSIsCiAgICAgICAgICAgICIxZWRlZjFkY2FhZjQzYWYzMjcxNDQ5OTA2YzM0OTU4NDc1ZTA5OTdiOTgyOGJjYTJjMGVjYWE3NDAzM2Y3YWVmOjE2MGRjMTI4MWIxZDFiNWY2Y2FhZDQ1YTM0OTFjMDAxN2Y0ZDljNjdmZmE1MjY5OGVhNzAzNDVlNGM2M2ExZDg6NzQzMTQ5MzdiYTFiZWVmNzljODk1NTljM2Y4OGFmOWIxYmEwNWU1ZDI4ODIyYjM0NTcwZDA1YTllMmJhNDA1NyIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChjcGF0aCkvJChidW5kbGUtaWQpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9CiAgICAgIF0sCiAgICAgICJkZXZpY2VzIjogW10sCiAgICAgICJzYW5kYm94X3BpZG5zIjogdHJ1ZSwKICAgICAgImV4ZWNfY29tbWFuZHMiOiBbXSwKICAgICAgImVudl9tYXAiOiB7CiAgICAgICAgIkFaX0lOU1RBTExFUiI6ICJET0NLRVIiLAogICAgICAgICJIT1NUTkFNRSI6ICIkKGhvc3QtbmFtZSkiLAogICAgICAgICJQQVRIIjogIi91c3IvbG9jYWwvc2JpbjovdXNyL2xvY2FsL2JpbjovdXNyL3NiaW46L3Vzci9iaW46L3NiaW46L2JpbiIKICAgICAgfQogICAgfSwKICAgIHsKICAgICAgIk9DSSI6IHsKICAgICAgICAiVmVyc2lvbiI6ICIxLjEuMC1yYy4xIiwKICAgICAgICAiUHJvY2VzcyI6IHsKICAgICAgICAgICJUZXJtaW5hbCI6IGZhbHNlLAogICAgICAgICAgIlVzZXIiOiB7CiAgICAgICAgICAgICJVSUQiOiAwLAogICAgICAgICAgICAiR0lEIjogMCwKICAgICAgICAgICAgIkFkZGl0aW9uYWxHaWRzIjogW10sCiAgICAgICAgICAgICJVc2VybmFtZSI6ICIiCiAgICAgICAgICB9LAogICAgICAgICAgIkRlcHJlY2F0ZWRBcmdzIjogWwogICAgICAgICAgICAiL2Jpbi9lY2hvIiwKICAgICAgICAgICAgImhlbGxvIgogICAgICAgICAgXSwKICAgICAgICAgICJBcmdzIjogWwogICAgICAgICAgICAiL2Jpbi9lY2hvIiwKICAgICAgICAgICAgImhlbGxvIgogICAgICAgICAgXSwKICAgICAgICAgICJFbnYiOiBbCiAgICAgICAgICAgICJQQVRIPS91c3IvbG9jYWwvc2JpbjovdXNyL2xvY2FsL2JpbjovdXNyL3NiaW46L3Vzci9iaW46L3NiaW46L2JpbiIsCiAgICAgICAgICAgICJIT1NUTkFNRT0kKGhvc3QtbmFtZSkiCiAgICAgICAgICBdLAogICAgICAgICAgIkN3ZCI6ICIvIiwKICAgICAgICAgICJDYXBhYmlsaXRpZXMiOiB7CiAgICAgICAgICAgICJBbWJpZW50IjogW10sCiAgICAgICAgICAgICJCb3VuZGluZyI6IFsKICAgICAgICAgICAgICAiJChkZWZhdWx0X2NhcHMpIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiRWZmZWN0aXZlIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJJbmhlcml0YWJsZSI6IFtdLAogICAgICAgICAgICAiUGVybWl0dGVkIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICAiTm9OZXdQcml2aWxlZ2VzIjogdHJ1ZQogICAgICAgIH0sCiAgICAgICAgIlJvb3QiOiB7CiAgICAgICAgICAiUGF0aCI6ICIkKGNwYXRoKS8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgIlJlYWRvbmx5IjogdHJ1ZQogICAgICAgIH0sCiAgICAgICAgIk1vdW50cyI6IFsKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9wcm9jIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJwcm9jIiwKICAgICAgICAgICAgInR5cGVfIjogInByb2MiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2IiwKICAgICAgICAgICAgInNvdXJjZSI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJzdHJpY3RhdGltZSIsCiAgICAgICAgICAgICAgIm1vZGU9NzU1IiwKICAgICAgICAgICAgICAic2l6ZT02NTUzNmsiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L3B0cyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiZGV2cHRzIiwKICAgICAgICAgICAgInR5cGVfIjogImRldnB0cyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJuZXdpbnN0YW5jZSIsCiAgICAgICAgICAgICAgInB0bXhtb2RlPTA2NjYiLAogICAgICAgICAgICAgICJtb2RlPTA2MjAiLAogICAgICAgICAgICAgICJnaWQ9NSIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvc2htIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L3NobSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi9tcXVldWUiLAogICAgICAgICAgICAic291cmNlIjogIm1xdWV1ZSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJtcXVldWUiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvc3lzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJzeXNmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJzeXNmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL3N5cy9mcy9jZ3JvdXAiLAogICAgICAgICAgICAic291cmNlIjogImNncm91cCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJjZ3JvdXAiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiLAogICAgICAgICAgICAgICJyZWxhdGltZSIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2V0Yy9ob3N0cyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClob3N0cyQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicnciCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L3Rlcm1pbmF0aW9uLWxvZyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeCl0ZXJtaW5hdGlvbi1sb2ckIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJ3IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2V0Yy9ob3N0bmFtZSIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClob3N0bmFtZSQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicm8iCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZXRjL3Jlc29sdi5jb25mIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KXJlc29sdi5jb25mJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJybyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi92YXIvcnVuL3NlY3JldHMva3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudCIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClzZXJ2aWNlYWNjb3VudCQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicm8iCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvdmFyL3J1bi9zZWNyZXRzL2F6dXJlL3Rva2VucyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeCl0b2tlbnMkIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9CiAgICAgICAgXSwKICAgICAgICAiQW5ub3RhdGlvbnMiOiB7CiAgICAgICAgICAiaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5idW5kbGVfcGF0aCI6ICIvcnVuL2NvbnRhaW5lcmQvaW8uY29udGFpbmVyZC5ydW50aW1lLnYyLnRhc2svazhzLmlvLyQoYnVuZGxlLWlkKSIsCiAgICAgICAgICAiaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5jb250YWluZXJfdHlwZSI6ICJwb2RfY29udGFpbmVyIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItbmFtZSI6ICJidXN5Ym94IiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSI6ICJjb250YWluZXIiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLmltYWdlLW5hbWUiOiAibWNyLm1pY3Jvc29mdC5jb20vYWtzL2UyZS9saWJyYXJ5LWJ1c3lib3g6bWFzdGVyLjIyMDMxNC4xLWxpbnV4LWFtZDY0IiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWlkIjogIl5bYS16MC05XXs2NH0kIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LW5hbWUiOiAiXnRocmVlXFwtY29udGFpbmVycyQiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZXNwYWNlIjogIiIKICAgICAgICB9LAogICAgICAgICJMaW51eCI6IHsKICAgICAgICAgICJOYW1lc3BhY2VzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgIlR5cGUiOiAiaXBjIiwKICAgICAgICAgICAgICAiUGF0aCI6ICIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiVHlwZSI6ICJ1dHMiLAogICAgICAgICAgICAgICJQYXRoIjogIiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJUeXBlIjogIm1vdW50IiwKICAgICAgICAgICAgICAiUGF0aCI6ICIiCiAgICAgICAgICAgIH0KICAgICAgICAgIF0sCiAgICAgICAgICAiTWFza2VkUGF0aHMiOiBbCiAgICAgICAgICAgICIvcHJvYy9hY3BpIiwKICAgICAgICAgICAgIi9wcm9jL2tjb3JlIiwKICAgICAgICAgICAgIi9wcm9jL2tleXMiLAogICAgICAgICAgICAiL3Byb2MvbGF0ZW5jeV9zdGF0cyIsCiAgICAgICAgICAgICIvcHJvYy90aW1lcl9saXN0IiwKICAgICAgICAgICAgIi9wcm9jL3RpbWVyX3N0YXRzIiwKICAgICAgICAgICAgIi9wcm9jL3NjaGVkX2RlYnVnIiwKICAgICAgICAgICAgIi9wcm9jL3Njc2kiLAogICAgICAgICAgICAiL3N5cy9maXJtd2FyZSIKICAgICAgICAgIF0sCiAgICAgICAgICAiUmVhZG9ubHlQYXRocyI6IFsKICAgICAgICAgICAgIi9wcm9jL2Fzb3VuZCIsCiAgICAgICAgICAgICIvcHJvYy9idXMiLAogICAgICAgICAgICAiL3Byb2MvZnMiLAogICAgICAgICAgICAiL3Byb2MvaXJxIiwKICAgICAgICAgICAgIi9wcm9jL3N5cyIsCiAgICAgICAgICAgICIvcHJvYy9zeXNycS10cmlnZ2VyIgogICAgICAgICAgXSwKICAgICAgICAgICJEZXZpY2VzIjogW10sCiAgICAgICAgICAiU3lzY3RsIjogewogICAgICAgICAgICAibmV0LmlwdjQuaXBfdW5wcml2aWxlZ2VkX3BvcnRfc3RhcnQiOiAiMCIsCiAgICAgICAgICAgICJuZXQuaXB2NC5waW5nX2dyb3VwX3JhbmdlIjogIjAgMjE0NzQ4MzY0NyIKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0sCiAgICAgICJzdG9yYWdlcyI6IFsKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoMCkiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXIwKSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoMSkiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXIxKSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogIm92ZXJsYXlmcyIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAiZnVzZTMua2F0YS1vdmVybGF5IiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiMmMzNDJhMTM3ZTY5M2M3ODk4YWVjMzZkYTEwNDdmMTkxZGM3YzE2ODdlNjYxOThhZGFjYzQzOWNmNGFkZjM3OToyNTcwZTNhMTllMWJmMjBkZGRhNDU0OThhOTYyN2Y2MTU1NWQyZDZjMDE0NzliOWI3NjQ2MGI2NzliMjdkNTUyIiwKICAgICAgICAgICAgIjg1NjhjNzBjMGNjZmUwMDUxMDkyZTgxOGRhNzY5MTExYTU5ODgyY2QxOWRkNzk5ZDNiY2E1ZmZhODI3OTEwODA6YjY0M2I2MjE3NzQ4OTgzODMwYjI2YWMxNGEzNWEzMzIyZGQ1MjhjMDA5NjNlYWFkZDkxZWY1NWY1MTNkYzczZiIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChjcGF0aCkvJChidW5kbGUtaWQpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9CiAgICAgIF0sCiAgICAgICJkZXZpY2VzIjogW10sCiAgICAgICJzYW5kYm94X3BpZG5zIjogdHJ1ZSwKICAgICAgImV4ZWNfY29tbWFuZHMiOiBbXSwKICAgICAgImVudl9tYXAiOiB7CiAgICAgICAgIkhPU1ROQU1FIjogIiQoaG9zdC1uYW1lKSIsCiAgICAgICAgIlBBVEgiOiAiL3Vzci9sb2NhbC9zYmluOi91c3IvbG9jYWwvYmluOi91c3Ivc2JpbjovdXNyL2Jpbjovc2JpbjovYmluIgogICAgICB9CiAgICB9LAogICAgewogICAgICAiT0NJIjogewogICAgICAgICJWZXJzaW9uIjogIjEuMS4wLXJjLjEiLAogICAgICAgICJQcm9jZXNzIjogewogICAgICAgICAgIlRlcm1pbmFsIjogZmFsc2UsCiAgICAgICAgICAiVXNlciI6IHsKICAgICAgICAgICAgIlVJRCI6IDAsCiAgICAgICAgICAgICJHSUQiOiAwLAogICAgICAgICAgICAiQWRkaXRpb25hbEdpZHMiOiBbXSwKICAgICAgICAgICAgIlVzZXJuYW1lIjogIiIKICAgICAgICAgIH0sCiAgICAgICAgICAiRGVwcmVjYXRlZEFyZ3MiOiBbCiAgICAgICAgICAgICIvb3B0L3N0YXJ0dXAvaW5pdF9jb250YWluZXIuc2giCiAgICAgICAgICBdLAogICAgICAgICAgIkFyZ3MiOiBbCiAgICAgICAgICAgICIvb3B0L3N0YXJ0dXAvaW5pdF9jb250YWluZXIuc2giCiAgICAgICAgICBdLAogICAgICAgICAgIkVudiI6IFsKICAgICAgICAgICAgIlBBVEg9L3Vzci9sb2NhbC9zYmluOi91c3IvbG9jYWwvYmluOi91c3Ivc2JpbjovdXNyL2Jpbjovc2JpbjovYmluOi9vcHQvb3J5eDovaG9tZS9zaXRlL3d3d3Jvb3QiLAogICAgICAgICAgICAiREVCSUFOX0ZMQVZPUj1idWxsc2V5ZSIsCiAgICAgICAgICAgICJPUllYX1NES19TVE9SQUdFX0JBU0VfVVJMPWh0dHBzOi8vb3J5eC1jZG4ubWljcm9zb2Z0LmlvIiwKICAgICAgICAgICAgIkVOQUJMRV9EWU5BTUlDX0lOU1RBTEw9dHJ1ZSIsCiAgICAgICAgICAgICJPUllYX0FJX0lOU1RSVU1FTlRBVElPTl9LRVk9NGFhZGJhNmItMzBjOC00MmRiLTliOTMtMDI0ZDVjNjJiODg3IiwKICAgICAgICAgICAgIkhPTUVfU0lURT0vaG9tZS9zaXRlL3d3d3Jvb3QiLAogICAgICAgICAgICAiQVBQX1BBVEg9L2hvbWUvc2l0ZS93d3dyb290IiwKICAgICAgICAgICAgIlBPUlQ9ODA4MCIsCiAgICAgICAgICAgICJTU0hfUE9SVD0yMjIyIiwKICAgICAgICAgICAgIldFQlNJVEVfUk9MRV9JTlNUQU5DRV9JRD1sb2NhbFJvbGVJbnN0YW5jZSIsCiAgICAgICAgICAgICJXRUJTSVRFX0lOU1RBTkNFX0lEPWxvY2FsSW5zdGFuY2UiLAogICAgICAgICAgICAiSE9TVE5BTUU9JChob3N0LW5hbWUpIiwKICAgICAgICAgICAgIkhPU1RfSVA9JChob3N0LWlwKSIKICAgICAgICAgIF0sCiAgICAgICAgICAiQ3dkIjogIi9ob21lL3NpdGUvd3d3cm9vdCIsCiAgICAgICAgICAiQ2FwYWJpbGl0aWVzIjogewogICAgICAgICAgICAiQW1iaWVudCI6IFtdLAogICAgICAgICAgICAiQm91bmRpbmciOiBbCiAgICAgICAgICAgICAgIiQoZGVmYXVsdF9jYXBzKSIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgIkVmZmVjdGl2ZSI6IFsKICAgICAgICAgICAgICAiJChkZWZhdWx0X2NhcHMpIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiSW5oZXJpdGFibGUiOiBbXSwKICAgICAgICAgICAgIlBlcm1pdHRlZCI6IFsKICAgICAgICAgICAgICAiJChkZWZhdWx0X2NhcHMpIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgIk5vTmV3UHJpdmlsZWdlcyI6IHRydWUKICAgICAgICB9LAogICAgICAgICJSb290IjogewogICAgICAgICAgIlBhdGgiOiAiJChjcGF0aCkvJChidW5kbGUtaWQpIiwKICAgICAgICAgICJSZWFkb25seSI6IGZhbHNlCiAgICAgICAgfSwKICAgICAgICAiTW91bnRzIjogWwogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL3Byb2MiLAogICAgICAgICAgICAic291cmNlIjogInByb2MiLAogICAgICAgICAgICAidHlwZV8iOiAicHJvYyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYiLAogICAgICAgICAgICAic291cmNlIjogInRtcGZzIiwKICAgICAgICAgICAgInR5cGVfIjogInRtcGZzIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgInN0cmljdGF0aW1lIiwKICAgICAgICAgICAgICAibW9kZT03NTUiLAogICAgICAgICAgICAgICJzaXplPTY1NTM2ayIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvcHRzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJkZXZwdHMiLAogICAgICAgICAgICAidHlwZV8iOiAiZGV2cHRzIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAgICAgIm5ld2luc3RhbmNlIiwKICAgICAgICAgICAgICAicHRteG1vZGU9MDY2NiIsCiAgICAgICAgICAgICAgIm1vZGU9MDYyMCIsCiAgICAgICAgICAgICAgImdpZD01IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi9zaG0iLAogICAgICAgICAgICAic291cmNlIjogIi9ydW4va2F0YS1jb250YWluZXJzL3NhbmRib3gvc2htIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L21xdWV1ZSIsCiAgICAgICAgICAgICJzb3VyY2UiOiAibXF1ZXVlIiwKICAgICAgICAgICAgInR5cGVfIjogIm1xdWV1ZSIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9zeXMiLAogICAgICAgICAgICAic291cmNlIjogInN5c2ZzIiwKICAgICAgICAgICAgInR5cGVfIjogInN5c2ZzIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAgICAgIm5vZGV2IiwKICAgICAgICAgICAgICAicm8iCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvc3lzL2ZzL2Nncm91cCIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiY2dyb3VwIiwKICAgICAgICAgICAgInR5cGVfIjogImNncm91cCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIsCiAgICAgICAgICAgICAgInJlbGF0aW1lIiwKICAgICAgICAgICAgICAicm8iCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZXRjL2hvc3RzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KWhvc3RzJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJydyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvdGVybWluYXRpb24tY3VzdG9tLWxvZyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeCl0ZXJtaW5hdGlvbi1jdXN0b20tbG9nJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJydyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9ldGMvaG9zdG5hbWUiLAogICAgICAgICAgICAic291cmNlIjogIiQoc2ZwcmVmaXgpaG9zdG5hbWUkIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJ3IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2V0Yy9yZXNvbHYuY29uZiIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClyZXNvbHYuY29uZiQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicnciCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvdmFyL3J1bi9zZWNyZXRzL2t1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQiLAogICAgICAgICAgICAic291cmNlIjogIiQoc2ZwcmVmaXgpc2VydmljZWFjY291bnQkIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL3Zhci9ydW4vc2VjcmV0cy9henVyZS90b2tlbnMiLAogICAgICAgICAgICAic291cmNlIjogIiQoc2ZwcmVmaXgpdG9rZW5zJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJybyIKICAgICAgICAgICAgXQogICAgICAgICAgfQogICAgICAgIF0sCiAgICAgICAgIkFubm90YXRpb25zIjogewogICAgICAgICAgImlvLmthdGFjb250YWluZXJzLnBrZy5vY2kuYnVuZGxlX3BhdGgiOiAiL3J1bi9jb250YWluZXJkL2lvLmNvbnRhaW5lcmQucnVudGltZS52Mi50YXNrL2s4cy5pby8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgImlvLmthdGFjb250YWluZXJzLnBrZy5vY2kuY29udGFpbmVyX3R5cGUiOiAicG9kX2NvbnRhaW5lciIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLW5hbWUiOiAiZ28iLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLmNvbnRhaW5lci10eXBlIjogImNvbnRhaW5lciIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuaW1hZ2UtbmFtZSI6ICJtY3IubWljcm9zb2Z0LmNvbS9hcHBzdmMvZ286MS4xOS1idWxsc2V5ZV8yMDIzMDMyNC4xIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWlkIjogIl5bYS16MC05XXs2NH0kIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LW5hbWUiOiAiXnRocmVlXFwtY29udGFpbmVycyQiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZXNwYWNlIjogIiIKICAgICAgICB9LAogICAgICAgICJMaW51eCI6IHsKICAgICAgICAgICJOYW1lc3BhY2VzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgIlR5cGUiOiAiaXBjIiwKICAgICAgICAgICAgICAiUGF0aCI6ICIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiVHlwZSI6ICJ1dHMiLAogICAgICAgICAgICAgICJQYXRoIjogIiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJUeXBlIjogIm1vdW50IiwKICAgICAgICAgICAgICAiUGF0aCI6ICIiCiAgICAgICAgICAgIH0KICAgICAgICAgIF0sCiAgICAgICAgICAiTWFza2VkUGF0aHMiOiBbCiAgICAgICAgICAgICIvcHJvYy9hY3BpIiwKICAgICAgICAgICAgIi9wcm9jL2tjb3JlIiwKICAgICAgICAgICAgIi9wcm9jL2tleXMiLAogICAgICAgICAgICAiL3Byb2MvbGF0ZW5jeV9zdGF0cyIsCiAgICAgICAgICAgICIvcHJvYy90aW1lcl9saXN0IiwKICAgICAgICAgICAgIi9wcm9jL3RpbWVyX3N0YXRzIiwKICAgICAgICAgICAgIi9wcm9jL3NjaGVkX2RlYnVnIiwKICAgICAgICAgICAgIi9wcm9jL3Njc2kiLAogICAgICAgICAgICAiL3N5cy9maXJtd2FyZSIKICAgICAgICAgIF0sCiAgICAgICAgICAiUmVhZG9ubHlQYXRocyI6IFsKICAgICAgICAgICAgIi9wcm9jL2Fzb3VuZCIsCiAgICAgICAgICAgICIvcHJvYy9idXMiLAogICAgICAgICAgICAiL3Byb2MvZnMiLAogICAgICAgICAgICAiL3Byb2MvaXJxIiwKICAgICAgICAgICAgIi9wcm9jL3N5cyIsCiAgICAgICAgICAgICIvcHJvYy9zeXNycS10cmlnZ2VyIgogICAgICAgICAgXSwKICAgICAgICAgICJEZXZpY2VzIjogW10sCiAgICAgICAgICAiU3lzY3RsIjogewogICAgICAgICAgICAibmV0LmlwdjQuaXBfdW5wcml2aWxlZ2VkX3BvcnRfc3RhcnQiOiAiMCIsCiAgICAgICAgICAgICJuZXQuaXB2NC5waW5nX2dyb3VwX3JhbmdlIjogIjAgMjE0NzQ4MzY0NyIKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0sCiAgICAgICJzdG9yYWdlcyI6IFsKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoMCkiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXIwKSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoMSkiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXIxKSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoMikiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXIyKSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoMykiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXIzKSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoNCkiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXI0KSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoNSkiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXI1KSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoNikiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXI2KSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoNykiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXI3KSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoOCkiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXI4KSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoOSkiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXI5KSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoMTApIgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGxheWVyMTApIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2gxMSkiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXIxMSkiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJibGsiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogInRhciIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIiQoaGFzaDEyKSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjEyKSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoMTMpIgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGxheWVyMTMpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2gxNCkiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXIxNCkiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJibGsiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogInRhciIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIiQoaGFzaDE1KSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjE1KSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoMTYpIgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGxheWVyMTYpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2gxNykiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXIxNykiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJibGsiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogInRhciIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIiQoaGFzaDE4KSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjE4KSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogIm92ZXJsYXlmcyIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAiZnVzZTMua2F0YS1vdmVybGF5IiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiYTFkMTE5Nzk5ZmZiZDJiM2RlMDEzN2U2Yzc3ZjNkMzI3ZjEyYWJiOTkwMTNiNWQzYzM1ZDMyNzliMjc0ZWUzNjoxMTgwZDNmYmQxOGI1MjdhMzgzNWQzMzVhYTY4MjMxMmFjNjgzZGFhZDAxNTJmNWEyZjZhMTM0NzUxY2Y4NTUwOmM4ZDk0NDQ3MTAwZjhjNWMyNGMzYzgxYzhhNzI1YzVjZTMwOWYxOGY3ZjM5MzUxMjUyYWE4YmJjYzI3YTMwZmY6YjRlZmM0M2ZhMjMyZDE2ODdkMjBiYzMxYjhjNjljM2M2NmZmMTYyYzM5MDVjOWE3OWQ3MjZkZjA4ZGFmNjIxZDozYzQxOWU0NGQ1Mjg2NjIwZWU5MTk5YzgxZmJmZWVhZjU2N2JkN2M4ODA0MDMyZWNmMTkwODZkOGFkN2VmMTExOjE2NTZmMzRkOGZiNmZjOTMyMjc3ZjNlNTk4MDVlOTE5MDE4YWQ5ODUyM2FkNzJhOTA3ZWZmMWU4ZmY4MTZjZmI6MmIzMGYzMzJjYjQyMmZmZjJhYjM0N2ViMDg2MTJiNTBiYTA3ZDNiYTlhYTNjYWYzYTUzNmRlMmU1ZDk0OGQ5Njo0ZjZkN2MxYzNhMjAxYzIyYzdmMWI1NDk5NzNlYzE5YTk3YWYzMGVhYjU5NDQzYTU5MjJkYjAxN2Q5ZTg2YTRlOmVlZTRkZTVkZTUwYzEyMDRiYWI5ODJlYWVkYjA2NzRmNDg1OGE2ZDIyYTA3ZWIxNTViNzczODIyMjM2MDc1ODE6NzIzNWY1ZjE5MzkzNWYxMzkxYTk5Y2Q2YzBhODZjZjNiZmIxNDVkNDM0ZjExY2VkYWI0NWY3YTZmMmM3NTgwMzo4YzhmOTAwMmVhZmZkMWRkYmUxYTBlZTdhMmNmNGU3YjFiNzlmNGQ5ZTgzZDk1OTMyNDFlMjU0MDJmYjEwZDRhOjZmMTVlOWFiZGQ1YTc5YjJiOGZlY2FiYTJmMmM1MWNlNDdiMWIxYzk3ZjgwODlhMjZkMWUzYTE2MjdkMGFkNjY6MmE5MDIwODk4ZDBmOWNmM2VhMjM2MWVhMDRhZWUwMzlkMzRkZjRkOGMyOTYzYjAxNDA1NTg0NWZhZWI1ZGQzYzo2ZjU5NjkxMjU3ZDZjZDNhOGZjNjU5NmY4NGZjMmY1N2EwMGQyNTM5MWVjOWQxMDEyNDc3NDU5MGQ3NjVlYTZhOjdiMTJkN2YwZTAyZDI3MzI2NGZiNjJjMjVhZDgxMjFjZTY3OWYyMzZlYzAyNjc5NzcyYTkyZDFjNTQ5MGIzM2Y6NTE2YmQxOTYwNzY3MGVhYzk2NzQzOTgwNWYzMGMyMGEwYjFkNmYyYmQ4MDY1NDg1MWM5YjI5NDBhNmVhN2FlNjo3MzQyMjMzNmY2ZjE0YmJlMjcyNTM1Y2Y0NTMyZjFlNTkxMzkwNjE0Y2QyZjc5NDcwYTQzN2Q2ZmNjMDhkZDhkOmMwYWMxNjgxZDZhMWVhMzMwNjdlMzVhZWI3NTllZTdiYmJiNjI2NjQ4NTE3YmZhYTM5NGU1NzhiNTdkYTg4MjE6NWQ0YjdjZjhjZmQxYzQ0ZTAwMDQ2N2EyZDUwZGM0NjQ5ZmM0ZDUwMTM4MGRmODU4NjE5YWU3N2Q4YmYxZDMyZCIsCiAgICAgICAgICAgICJiNzQ1NDk1ODM5MTM2ZDE4OGI4ZTc4YzJkYmU1NjMxNmRkMDY2ZDAzOGQzMDM2ZTViODhiZGJjM2MxMmI5MTA1OjRjNTM3M2UxYmJlZDM2MjhlNWUwZDQ2YTM3OWJlY2Y1ZjY2ZGFkOWI0MGMzN2ZjNWRlNjRhY2QxNzM5YTI1OGM6NzFhYzc3NTk1Mjk1Nzk5NjVjYTY3ODI5MmNmM2QwNDQxOTJmZWZiZWIxMGYxNWFiODMzMGUwYjZhYjliMmM4NDpkY2Q3ZjM1OTdhMmJiMjVkZTgzYjc0MDRjYTllNTVjZDUyY2E0YWQ4OWI5NWE1ZDU5MzFlNmUwMzNkMmVlNDVmOmM4Nzk4MTZhZTMyYWRiZmE3NzhiMmYwNTlhYzkyMDA1OWEyZDk0OTk2OGZmNzFhZDU0YTJlN2UxYTkxNDU0MDI6ZWQ3NzFmZDgwYTY5NWQxN2VjMmNhMzJmZWI4N2Q1NGI3YzdmZTk2MmJkODUwYjUyMzg0YzczYWNiMDQxNTJkNzo1N2MwMmM0MDZkZWNmODcyMmI0NDZiNmUwMzM3ZmI5OTdlZjIyNjA0MzhlMjg5ZDZjMDY4ZDZkOTJkNjVlNjYwOmZlYWVjNDgzZTY2ZmZiY2YzMzBhODI0N2FmNjc5MWVjYzYzYzY5ZTEzMzM5YmZlNmVmNThmOGJjYWRlNjQyMDQ6YjA3NzhkM2I4OTYxN2EzMzRhY2I1YWZlODZlMTBlMGE4NmZhNzg5Yzc2NWUwYjdiOWNkZDRkMDQ4NTc1ZDcxMzpmMGJiMGFhMzY5ZmM5YmU4Y2RmMjllNDU2Y2Y5MjUyNDk2OWUwOGI4NjA5OTg4Y2VjNWNhMzY3NjdjMDA0ZjI4Ojk5YTVlZmVmMjI3YzhjMTNlMDU5NDM0YWI2NGQ0MDRmNjgzYzllMzYzMzVlMWJkMzViMmFjYTMyODJjZTk0Nzc6MGFlOGY2YjAyZTdiNTIyMWY5ZTQ1Mjk1MjcyMDE1NGE4MmI3MmMzYjM1NDZjOTk3YWNkYzg1OWI2YzRhMWE1YTpjNjYyZTJiYmFjNDgxMzU5NWZhYmQ3MGUzZjk4MTBhZDJjMzNiZDU2MzAxN2RlMjMwOTA1ODE5NjdlY2VkNjVlOjhkNDZiODc5Y2M2NWFkNDI1MGU1ODVmNDY4YjQyMzIxYjEyOTc2ZjFmZDJjZmZkMDE0NmExZWJlNGZlYzdlZGI6MGM5ZDFiMWYyYzY3ZmU5MDBkNWExODI4Zjg4N2UyMmRlNGJhZjU4NTE1ZjZlOWZkYmJkZDVkMDM2ZmRhNzUzZjozNmQ0M2EzOWZlN2FmNzIyYTBlMmU0NmZhNTk1MmFhMzhmYTc5YWQzMTFhODZjMGRhMGI3NTlhN2UzYzQxYjE0OmMxNzQzY2IwYTIwYjIwMDRiZjNmNGU0NTI0MDJmYTQ1MDMwNmRjNGQyOWUzZTE2ZjM1NGM5YjE2OTU5NDI5OGM6NDhjNWU1MGFlZTgwNzE3OGJlMTI2ZTgyMTgyOTdkYmFmNTc2OGE4YWExODQ4MmEyZmIyMjIyM2EzNTk5NDNjMzo4ZjE0ZDU4OWVkOTc3Yzk3ODgyNmM1OGY2NmVjMDIzMjAxNzQyNmZhYzNkZTVlMTBjNGRlNWRlYjgzN2E2Nzk3IgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGNwYXRoKS8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0KICAgICAgXSwKICAgICAgImRldmljZXMiOiBbXSwKICAgICAgInNhbmRib3hfcGlkbnMiOiB0cnVlLAogICAgICAiZXhlY19jb21tYW5kcyI6IFtdLAogICAgICAiZW52X21hcCI6IHsKICAgICAgICAiQVBQX1BBVEgiOiAiL2hvbWUvc2l0ZS93d3dyb290IiwKICAgICAgICAiREVCSUFOX0ZMQVZPUiI6ICJidWxsc2V5ZSIsCiAgICAgICAgIkVOQUJMRV9EWU5BTUlDX0lOU1RBTEwiOiAidHJ1ZSIsCiAgICAgICAgIkhPTUVfU0lURSI6ICIvaG9tZS9zaXRlL3d3d3Jvb3QiLAogICAgICAgICJIT1NUTkFNRSI6ICIkKGhvc3QtbmFtZSkiLAogICAgICAgICJIT1NUX0lQIjogIiQoaG9zdC1pcCkiLAogICAgICAgICJPUllYX0FJX0lOU1RSVU1FTlRBVElPTl9LRVkiOiAiNGFhZGJhNmItMzBjOC00MmRiLTliOTMtMDI0ZDVjNjJiODg3IiwKICAgICAgICAiT1JZWF9TREtfU1RPUkFHRV9CQVNFX1VSTCI6ICJodHRwczovL29yeXgtY2RuLm1pY3Jvc29mdC5pbyIsCiAgICAgICAgIlBBVEgiOiAiL3Vzci9sb2NhbC9zYmluOi91c3IvbG9jYWwvYmluOi91c3Ivc2JpbjovdXNyL2Jpbjovc2JpbjovYmluOi9vcHQvb3J5eDovaG9tZS9zaXRlL3d3d3Jvb3QiLAogICAgICAgICJQT1JUIjogIjgwODAiLAogICAgICAgICJTU0hfUE9SVCI6ICIyMjIyIiwKICAgICAgICAiV0VCU0lURV9JTlNUQU5DRV9JRCI6ICJsb2NhbEluc3RhbmNlIiwKICAgICAgICAiV0VCU0lURV9ST0xFX0lOU1RBTkNFX0lEIjogImxvY2FsUm9sZUluc3RhbmNlIgogICAgICB9CiAgICB9CiAgXSwKICAiY29tbW9uIjogewogICAgImNwYXRoIjogIi9ydW4va2F0YS1jb250YWluZXJzL3NoYXJlZC9jb250YWluZXJzIiwKICAgICJtb3VudF9zb3VyY2VfY3BhdGgiOiAiL3J1bi9rYXRhLWNvbnRhaW5lcnMvc2hhcmVkL2NvbnRhaW5lcnMiLAogICAgInNmcHJlZml4IjogIl4kKGNwYXRoKS8kKGJ1bmRsZS1pZCktW2EtejAtOV17MTZ9LSIsCiAgICAic3BhdGgiOiAiL3J1bi9rYXRhLWNvbnRhaW5lcnMvc2FuZGJveC9zdG9yYWdlIiwKICAgICJpcHY0X2EiOiAiKChbMC05XXxbMS05XVswLTldfDFbMC05XXsyfXwyWzAtNF1bMC05XXwyNVswLTVdKVxcLil7M30oWzAtOV18WzEtOV1bMC05XXwxWzAtOV17Mn18MlswLTRdWzAtOV18MjVbMC01XSkiLAogICAgImlwX3AiOiAiWzAtOV17MSw1fSIsCiAgICAic3ZjX25hbWUiOiAiW0EtWl9cXC5cXC1dKyIsCiAgICAiZG5zX2xhYmVsIjogIlthLXpBLVowLTlfXFwuXFwtXSsiLAogICAgInNfc291cmNlMSI6ICJeLi4yWzAtOV17M31fWzAtMV1bMC05XV9bMC0zXVswLTldX1swLTJdWzAtOV1fWzAtNV1bMC05XV9bMC01XVswLTldXFwuWzAtOV17MSwxMH0kIiwKICAgICJzX3NvdXJjZTIiOiAiXi4uZGF0YS8iLAogICAgImRuc19zdWJkb21haW4iOiAiXlthLXowLTldKFstYS16MC05XSpbYS16MC05XSk/JCIsCiAgICAicG9kX3VpZCI6ICJeWzAtOWEtZkEtRl17OH0tWzAtOWEtZkEtRl17NH0tWzAtOWEtZkEtRl17NH0tWzAtOWEtZkEtRl17NH0tWzAtOWEtZkEtRl17MTJ9JCIsCiAgICAiZGVmYXVsdF9jYXBzIjogWwogICAgICAiQ0FQX0NIT1dOIiwKICAgICAgIkNBUF9EQUNfT1ZFUlJJREUiLAogICAgICAiQ0FQX0ZTRVRJRCIsCiAgICAgICJDQVBfRk9XTkVSIiwKICAgICAgIkNBUF9NS05PRCIsCiAgICAgICJDQVBfTkVUX1JBVyIsCiAgICAgICJDQVBfU0VUR0lEIiwKICAgICAgIkNBUF9TRVRVSUQiLAogICAgICAiQ0FQX1NFVEZDQVAiLAogICAgICAiQ0FQX1NFVFBDQVAiLAogICAgICAiQ0FQX05FVF9CSU5EX1NFUlZJQ0UiLAogICAgICAiQ0FQX1NZU19DSFJPT1QiLAogICAgICAiQ0FQX0tJTEwiLAogICAgICAiQ0FQX0FVRElUX1dSSVRFIgogICAgXSwKICAgICJwcml2aWxlZ2VkX2NhcHMiOiBbCiAgICAgICJDQVBfQ0hPV04iLAogICAgICAiQ0FQX0RBQ19PVkVSUklERSIsCiAgICAgICJDQVBfREFDX1JFQURfU0VBUkNIIiwKICAgICAgIkNBUF9GT1dORVIiLAogICAgICAiQ0FQX0ZTRVRJRCIsCiAgICAgICJDQVBfS0lMTCIsCiAgICAgICJDQVBfU0VUR0lEIiwKICAgICAgIkNBUF9TRVRVSUQiLAogICAgICAiQ0FQX1NFVFBDQVAiLAogICAgICAiQ0FQX0xJTlVYX0lNTVVUQUJMRSIsCiAgICAgICJDQVBfTkVUX0JJTkRfU0VSVklDRSIsCiAgICAgICJDQVBfTkVUX0JST0FEQ0FTVCIsCiAgICAgICJDQVBfTkVUX0FETUlOIiwKICAgICAgIkNBUF9ORVRfUkFXIiwKICAgICAgIkNBUF9JUENfTE9DSyIsCiAgICAgICJDQVBfSVBDX09XTkVSIiwKICAgICAgIkNBUF9TWVNfTU9EVUxFIiwKICAgICAgIkNBUF9TWVNfUkFXSU8iLAogICAgICAiQ0FQX1NZU19DSFJPT1QiLAogICAgICAiQ0FQX1NZU19QVFJBQ0UiLAogICAgICAiQ0FQX1NZU19QQUNDVCIsCiAgICAgICJDQVBfU1lTX0FETUlOIiwKICAgICAgIkNBUF9TWVNfQk9PVCIsCiAgICAgICJDQVBfU1lTX05JQ0UiLAogICAgICAiQ0FQX1NZU19SRVNPVVJDRSIsCiAgICAgICJDQVBfU1lTX1RJTUUiLAogICAgICAiQ0FQX1NZU19UVFlfQ09ORklHIiwKICAgICAgIkNBUF9NS05PRCIsCiAgICAgICJDQVBfTEVBU0UiLAogICAgICAiQ0FQX0FVRElUX1dSSVRFIiwKICAgICAgIkNBUF9BVURJVF9DT05UUk9MIiwKICAgICAgIkNBUF9TRVRGQ0FQIiwKICAgICAgIkNBUF9NQUNfT1ZFUlJJREUiLAogICAgICAiQ0FQX01BQ19BRE1JTiIsCiAgICAgICJDQVBfU1lTTE9HIiwKICAgICAgIkNBUF9XQUtFX0FMQVJNIiwKICAgICAgIkNBUF9CTE9DS19TVVNQRU5EIiwKICAgICAgIkNBUF9BVURJVF9SRUFEIiwKICAgICAgIkNBUF9QRVJGTU9OIiwKICAgICAgIkNBUF9CUEYiLAogICAgICAiQ0FQX0NIRUNLUE9JTlRfUkVTVE9SRSIKICAgIF0sCiAgICAidmlydGlvX2Jsa19zdG9yYWdlX2NsYXNzZXMiOiBbCiAgICAgICJjYy1sb2NhbC1jc2kiLAogICAgICAiY2MtbWFuYWdlZC1jc2kiLAogICAgICAiY2MtbWFuYWdlZC1wcmVtaXVtLWNzaSIKICAgIF0sCiAgICAic21iX3N0b3JhZ2VfY2xhc3NlcyI6IFsKICAgICAgewogICAgICAgICJuYW1lIjogImF6dXJlZmlsZS1jc2kta2F0YS1jYyIsCiAgICAgICAgIm1vdW50X29wdGlvbnMiOiBbCiAgICAgICAgICAiZGlyX21vZGU9MDc3NyIsCiAgICAgICAgICAiZmlsZV9tb2RlPTA3NzciLAogICAgICAgICAgIm1mc3ltbGlua3MiLAogICAgICAgICAgImNhY2hlPXN0cmljdCIsCiAgICAgICAgICAibm9zaGFyZXNvY2siLAogICAgICAgICAgImFjdGltZW89MzAiLAogICAgICAgICAgIm5vYnJsIgogICAgICAgIF0KICAgICAgfQogICAgXQogIH0sCiAgInNhbmRib3giOiB7CiAgICAic3RvcmFnZXMiOiBbCiAgICAgIHsKICAgICAgICAiZHJpdmVyIjogImVwaGVtZXJhbCIsCiAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgInNvdXJjZSI6ICJzaG0iLAogICAgICAgICJmc3R5cGUiOiAidG1wZnMiLAogICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICJub2RldiIsCiAgICAgICAgICAibW9kZT0xNzc3IiwKICAgICAgICAgICJzaXplPTY3MTA4ODY0IgogICAgICAgIF0sCiAgICAgICAgIm1vdW50X3BvaW50IjogIi9ydW4va2F0YS1jb250YWluZXJzL3NhbmRib3gvc2htIiwKICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgIH0KICAgIF0KICB9LAogICJyZXF1ZXN0X2RlZmF1bHRzIjogewogICAgIkNyZWF0ZUNvbnRhaW5lclJlcXVlc3QiOiB7CiAgICAgICJhbGxvd19lbnZfcmVnZXgiOiBbCiAgICAgICAgIl5IT1NUTkFNRT0kKGRuc19sYWJlbCkkIiwKICAgICAgICAiXiQoc3ZjX25hbWUpX1BPUlRfJChpcF9wKV9UQ1A9dGNwOi8vJChpcHY0X2EpOiQoaXBfcCkkIiwKICAgICAgICAiXiQoc3ZjX25hbWUpX1BPUlRfJChpcF9wKV9UQ1BfUFJPVE89dGNwJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9QT1JUXyQoaXBfcClfVENQX1BPUlQ9JChpcF9wKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfUE9SVF8kKGlwX3ApX1RDUF9BRERSPSQoaXB2NF9hKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfU0VSVklDRV9IT1NUPSQoaXB2NF9hKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfU0VSVklDRV9QT1JUPSQoaXBfcCkkIiwKICAgICAgICAiXiQoc3ZjX25hbWUpX1NFUlZJQ0VfUE9SVF8kKGRuc19sYWJlbCk9JChpcF9wKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfUE9SVD10Y3A6Ly8kKGlwdjRfYSk6JChpcF9wKSQiLAogICAgICAgICJeQVpVUkVfQ0xJRU5UX0lEPVtBLUZhLWYwLTktXSokIiwKICAgICAgICAiXkFaVVJFX1RFTkFOVF9JRD1bQS1GYS1mMC05LV0qJCIsCiAgICAgICAgIl5BWlVSRV9GRURFUkFURURfVE9LRU5fRklMRT0vdmFyL3J1bi9zZWNyZXRzL2F6dXJlL3Rva2Vucy9henVyZS1pZGVudGl0eS10b2tlbiQiLAogICAgICAgICJeQVpVUkVfQVVUSE9SSVRZX0hPU1Q9aHR0cHM6Ly9sb2dpblxcLm1pY3Jvc29mdG9ubGluZVxcLmNvbS8kIiwKICAgICAgICAiXlRFUk09eHRlcm0kIgogICAgICBdLAogICAgICAiYWxsb3dfZW52X3JlZ2V4X21hcCI6IHsKICAgICAgICAiQ1BVX0xJTUlUIjogIl5bMC05XSskIiwKICAgICAgICAiSk9CX0NPTVBMRVRJT05fSU5ERVgiOiAiXlswLTldKiQiLAogICAgICAgICJNRU1PUllfTElNSVQiOiAiXlswLTldKyQiCiAgICAgIH0KICAgIH0sCiAgICAiQ29weUZpbGVSZXF1ZXN0IjogWwogICAgICAiJChzZnByZWZpeCkiCiAgICBdLAogICAgIkV4ZWNQcm9jZXNzUmVxdWVzdCI6IHsKICAgICAgImFsbG93ZWRfY29tbWFuZHMiOiBbXSwKICAgICAgInJlZ2V4IjogW10KICAgIH0sCiAgICAiVXBkYXRlUm91dGVzUmVxdWVzdCI6IHsKICAgICAgImZvcmJpZGRlbl9kZXZpY2VfbmFtZXMiOiBbCiAgICAgICAgImxvIgogICAgICBdLAogICAgICAiZm9yYmlkZGVuX3NvdXJjZV9yZWdleCI6IFsKICAgICAgICAiXig/OjB7MCw0fTopezAsN30wezAsM30xJCIsCiAgICAgICAgIl4xMjdcXC4oPzpbMC05XXsxLDN9XFwuKXsyfVswLTldezEsM30kIgogICAgICBdCiAgICB9LAogICAgIlVwZGF0ZUludGVyZmFjZVJlcXVlc3QiOiB7CiAgICAgICJhbGxvd19yYXdfZmxhZ3MiOiAxMjgsCiAgICAgICJmb3JiaWRkZW5fbmFtZXMiOiBbCiAgICAgICAgImxvIgogICAgICBdLAogICAgICAiZm9yYmlkZGVuX2h3X2FkZHJzIjogWwogICAgICAgICIwMDowMDowMDowMDowMDowMCIKICAgICAgXQogICAgfSwKICAgICJDbG9zZVN0ZGluUmVxdWVzdCI6IGZhbHNlLAogICAgIlJlYWRTdHJlYW1SZXF1ZXN0IjogZmFsc2UsCiAgICAiVXBkYXRlRXBoZW1lcmFsTW91bnRzUmVxdWVzdCI6IGZhbHNlLAogICAgIldyaXRlU3RyZWFtUmVxdWVzdCI6IGZhbHNlCiAgfQp9 +spec: + restartPolicy: Never + runtimeClassName: kata-cc + shareProcessNamespace: true + initContainers: + - name: busybox + image: "mcr.microsoft.com/aks/e2e/library-busybox:master.220314.1-linux-amd64" + securityContext: + readOnlyRootFilesystem: true + allowPrivilegeEscalation: false + command: + - /bin/echo + - hello + - name: mariner-cli + image: "mcr.microsoft.com/azure-cli:2.58.0-cbl-mariner2.0-amd64" + command: + - az + - "--help" + containers: + - name: go + env: + - name: HOST_IP + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: status.hostIP + image: "mcr.microsoft.com/appsvc/go:1.19-bullseye_20230324.1" + securityContext: + allowPrivilegeEscalation: false + terminationMessagePath: /dev/termination-custom-log diff --git a/src/agent/samples/policy/yaml/pod/pod-ubuntu.yaml b/src/agent/samples/policy/yaml/pod/pod-ubuntu.yaml new file mode 100644 index 000000000000..098933de4254 --- /dev/null +++ b/src/agent/samples/policy/yaml/pod/pod-ubuntu.yaml @@ -0,0 +1,28 @@ +--- +apiVersion: scheduling.k8s.io/v1 +kind: PriorityClass +metadata: + name: high-priority +value: 1000000 +globalDefault: false +--- +apiVersion: v1 +kind: Pod +metadata: + labels: + run: ubuntu + name: ubuntu + annotations: + io.katacontainers.config.agent.policy: IyBDb3B5cmlnaHQgKGMpIDIwMjMgTWljcm9zb2Z0IENvcnBvcmF0aW9uCiMKIyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMAojCnBhY2thZ2UgYWdlbnRfcG9saWN5CgppbXBvcnQgZnV0dXJlLmtleXdvcmRzLmluCmltcG9ydCBmdXR1cmUua2V5d29yZHMuZXZlcnkKCiMgRGVmYXVsdCB2YWx1ZXMsIHJldHVybmVkIGJ5IE9QQSB3aGVuIHJ1bGVzIGNhbm5vdCBiZSBldmFsdWF0ZWQgdG8gdHJ1ZS4KZGVmYXVsdCBBZGRBUlBOZWlnaGJvcnNSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgQWRkU3dhcFJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBDbG9zZVN0ZGluUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IENvcHlGaWxlUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IENyZWF0ZUNvbnRhaW5lclJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBDcmVhdGVTYW5kYm94UmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IERlc3Ryb3lTYW5kYm94UmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgRXhlY1Byb2Nlc3NSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgR2V0T09NRXZlbnRSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBHdWVzdERldGFpbHNSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBMaXN0SW50ZXJmYWNlc1JlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBMaXN0Um91dGVzUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IE1lbUhvdHBsdWdCeVByb2JlUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IE9ubGluZUNQVU1lbVJlcXVlc3QgOj0gdHJ1ZQpkZWZhdWx0IFBhdXNlQ29udGFpbmVyUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFJlYWRTdHJlYW1SZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgUmVtb3ZlQ29udGFpbmVyUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgUmVtb3ZlU3RhbGVWaXJ0aW9mc1NoYXJlTW91bnRzUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgUmVzZWVkUmFuZG9tRGV2UmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFJlc3VtZUNvbnRhaW5lclJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBTZXRHdWVzdERhdGVUaW1lUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFNldFBvbGljeVJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBTaWduYWxQcm9jZXNzUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgU3RhcnRDb250YWluZXJSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBTdGFydFRyYWNpbmdSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgU3RhdHNDb250YWluZXJSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBTdG9wVHJhY2luZ1JlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBUdHlXaW5SZXNpemVSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBVcGRhdGVDb250YWluZXJSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgVXBkYXRlRXBoZW1lcmFsTW91bnRzUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFVwZGF0ZUludGVyZmFjZVJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBVcGRhdGVSb3V0ZXNSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgV2FpdFByb2Nlc3NSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBXcml0ZVN0cmVhbVJlcXVlc3QgOj0gZmFsc2UKCiMgQWxsb3dSZXF1ZXN0c0ZhaWxpbmdQb2xpY3kgOj0gdHJ1ZSBjb25maWd1cmVzIHRoZSBBZ2VudCB0byAqYWxsb3cgYW55CiMgcmVxdWVzdHMgY2F1c2luZyBhIHBvbGljeSBmYWlsdXJlKi4gVGhpcyBpcyBhbiB1bnNlY3VyZSBjb25maWd1cmF0aW9uCiMgYnV0IGlzIHVzZWZ1bCBmb3IgYWxsb3dpbmcgdW5zZWN1cmUgcG9kcyB0byBzdGFydCwgdGhlbiBjb25uZWN0IHRvCiMgdGhlbSBhbmQgaW5zcGVjdCBPUEEgbG9ncyBmb3IgdGhlIHJvb3QgY2F1c2Ugb2YgYSBmYWlsdXJlLgpkZWZhdWx0IEFsbG93UmVxdWVzdHNGYWlsaW5nUG9saWN5IDo9IGZhbHNlCgojIENvbnN0YW50cwpTX05BTUVfS0VZID0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZSIKU19OQU1FU1BBQ0VfS0VZID0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZXNwYWNlIgpCVU5ETEVfSUQgPSAiW2EtejAtOV17NjR9IgoKQ3JlYXRlQ29udGFpbmVyUmVxdWVzdDo9IHJlc3AgewogICAgbm90IGlzX251bGwoaW5wdXQuZW52X21hcCkKICAgIAogICAgaV9lbnZfbWFwIDo9IGlucHV0LmVudl9tYXAKICAgIAogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBwX2Vudl9tYXAgOj0gcF9jb250YWluZXIuZW52X21hcCAgCiAgICBhbGxvd19lbnZfbWFwKHBfZW52X21hcCwgaV9lbnZfbWFwKQogICAgCiAgICBpX3Byb2Nlc3MgOj0gaW5wdXQuYmFzZS5PQ0kuUHJvY2VzcwogICAgCiAgICBwX3Byb2Nlc3MgOj0gcF9jb250YWluZXIuT0NJLlByb2Nlc3MKICAgIAogICAgYWxsb3dfYXJncyhpX3Byb2Nlc3MsIHBfcHJvY2VzcywgaV9lbnZfbWFwKQoKICAgIHJlc3AgPSBDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uKGlucHV0LmJhc2UpCiAgICBwcmludCgiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdDogdHJ1ZSIpCn0KCmFsbG93X2FyZ3MoaV9wcm9jZXNzLCBwX3Byb2Nlc3MsIGlfZW52X21hcCkgewogICAgaV9hcmdzIDo9IGlfcHJvY2Vzcy5BcmdzCiAgICBwX2FyZ3MgOj0gcF9wcm9jZXNzLkFyZ3MKICAgIHByaW50KCJhbGxvd19hcmdzOiBpX2FyZ3MgPSIsIGlfYXJncywgInBfYXJncyA9IiwgcF9hcmdzKQogICAgY291bnQoaV9hcmdzKSA9PSBjb3VudChwX2FyZ3MpCiAgICBldmVyeSBpLCBpX2FyZyBpbiBpX2FyZ3MgewogICAgICAgIHByaW50KCJhbGxvd19hcmdzOiBpX2FyZyA9IiwgaV9hcmcpCiAgICAgICAgcF9hcmdfcmVwbGFjZWQgOj0gcmVwbGFjZV9lbnZfdmFyaWFibGVzKHBfYXJnc1tpXSwgaV9lbnZfbWFwKQogICAgICAgIHByaW50KCJhbGxvd19hcmdzOiBwX2FyZ19yZXBsYWNlZCA9IiwgcF9hcmdfcmVwbGFjZWQpCiAgICAgICAgcF9hcmdfcmVwbGFjZWQyIDo9IHJlcGxhY2UocF9hcmdfcmVwbGFjZWQsICIkJCIsICIkIikKICAgICAgICBwcmludCgiYWxsb3dfYXJnczogcF9hcmdfcmVwbGFjZWQyID0iLCBwX2FyZ19yZXBsYWNlZDIpCiAgICAgICAgaV9hcmcgPT0gcF9hcmdfcmVwbGFjZWQyCiAgICB9CiAgICBwcmludCgiYWxsb3dfYXJnczogdHJ1ZSIpCn0KCmFsbG93X2FyZ3MoaV9wcm9jZXNzLCBwX3Byb2Nlc3MsIGlfZW52X21hcCkgewogICAgbm90IGlfcHJvY2Vzcy5BcmdzCiAgICBub3QgcF9wcm9jZXNzLkFyZ3MKICAgIHByaW50KCJhbGxvd19hcmdzMjogbm8gYXJncyIpCn0KCiMgdGhpcyBmdW5jdGlvbiByZXBsYWNlcyBhbGwgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyBpbiBhIHN0cmluZywgZ2l2ZW4gYSBtYXAgb2YgZW52aXJvbm1lbnQga2V5cyB0byBlbnZpcm9ubWVudCB2YWx1ZXMKIyBlZyBzdHIgPSAiZWNobyAkKENMVVNURVJfSUQpOyBlY2hvICQoTk9ERV9OQU1FKTsiCiMgZW52X21hcCA9IHsiQ0xVU1RFUl9JRCI6ICJhYmMiLCAiTk9ERV9OQU1FIiA6ICJ4eXoifQojIHJlc3VsdCA9ICJlY2hvIGFiYzsgZWNobyB4eXo7IgpyZXBsYWNlX2Vudl92YXJpYWJsZXMoc3RyLCBlbnZfbWFwKSA9IHJlc3VsdCB7CiAgICAjIG1ha2UgYW4gYXJyYXkgb2YgdGhlIGtleXMgZWcgWyJDTFVTVEVSX0lEIiwgIk5PREVfTkFNRSJdCiAgICBrZXlzIDo9IFt4IHwgc29tZSB4IGluIG9iamVjdC5rZXlzKGVudl9tYXApXQogICAgcmVzdWx0IDo9IHJlcGxhY2Vfc3RyX3JlYyhzdHIsIGVudl9tYXAsIGtleXMsIGNvdW50KGtleXMpIC0gMSkKfQoKIyBiYXNlIGNhc2UKcmVwbGFjZV9zdHJfcmVjKHN0ciwgZW52X21hcCwgYXJyX2tleXMsIGkpID0gcmVzdWx0IHsKICAgIGkgPCAwCiAgICByZXN1bHQgOj0gc3RyCn0KCiMgcmVjdXJzaXZlIHN0ZXAKcmVwbGFjZV9zdHJfcmVjKHN0ciwgZW52X21hcCwgYXJyX2tleXMsIGkpID0gcmVzdWx0IHsKICAgIGkgPj0gMAogICAga2V5IDo9IGFycl9rZXlzW2ldCiAgICBlbnZfa2V5MSA6PSBjb25jYXQoIiIsIFsiJCgiLCBrZXksICIpIl0pCiAgICAjIHJlcGxhY2UgJChWQVIpIHdpdGggdmFsdWUKICAgIG5ld19zdHIxIDo9IHJlcGxhY2Uoc3RyLCBlbnZfa2V5MSwgZW52X21hcFtrZXldKQogICAgIyByZXBsYWNlIG5leHQgZW52aXJvbm1lbnQgdmFyaWFibGUKICAgIHJlc3VsdCA9IHJlcGxhY2Vfc3RyX3JlYyhuZXdfc3RyMSwgZW52X21hcCwgYXJyX2tleXMsIGkgLSAxKQp9CgphbGxvd19lbnZfbWFwKHBfZW52X21hcCwgaV9lbnZfbWFwKSB7CiAgICBwcmludCgiYWxsb3dfZW52X21hcDogcF9lbnZfbWFwID0iLCBwX2Vudl9tYXApCiAgICBldmVyeSBlbnZfa2V5LCBlbnZfdmFsIGluIGlfZW52X21hcCB7CiAgICAgICAgcHJpbnQoImFsbG93X2VudjogZW52X2tleSA9IiwgZW52X2tleSwgImVudl92YWwgPSIsIGVudl92YWwpCiAgICAgICAgYWxsb3dfZW52X21hcF9lbnRyeShlbnZfa2V5LCBlbnZfdmFsLCBwX2Vudl9tYXApCiAgICB9CiAgICBwcmludCgiYWxsb3dfZW52X21hcDogdHJ1ZSIpCn0KCiMgQWxsb3cgZXhhY3QgbWF0Y2gKYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBpX3ZhbCA9PSBwX3ZhbAogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnk6IHRydWUiKQp9CgojIEFsbG93IHJlc291cmNlRmllbGRSZWYgdmFsdWVzIChlLmcuLCAibGltaXRzLmNwdSIpLgphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgICMgYSB2YXJpYWJsZSB3ZSBzaG91bGQgYmUgdmFsaWRhdGluZyB1c2luZyBhIHJlZ2V4IGZyb20gc2V0dGluZ3MKICAgIHBfdmFsID09ICIkKHZhbGlkYXRlLWZyb20tc2V0dGluZ3MpIgogICAgcmVnZXhfdmFsIDo9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuQ3JlYXRlQ29udGFpbmVyUmVxdWVzdC5hbGxvd19lbnZfcmVnZXhfbWFwW2tleV0KICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4X3ZhbCwgaV92YWwpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSAyOiB0cnVlIikKfQoKIyBBbGxvdyBub2RlLW5hbWUKYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChub2RlLW5hbWUpIgogICAgcmVnZXgubWF0Y2gocG9saWN5X2RhdGEuY29tbW9uLmRuc19zdWJkb21haW4gLCBpX3ZhbCkKICAgIHByaW50KCJhbGxvd19lbnZfbWFwX2VudHJ5IDM6IHRydWUiKQp9CgojIEFsbG93IGhvc3QtbmFtZQphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgIHBfdmFsID09ICIkKGhvc3QtbmFtZSkiCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24uZG5zX2xhYmVsICwgaV92YWwpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSA0OiB0cnVlIikKfQoKIyBBbGxvdyBwb2QtdWlkCmFsbG93X2Vudl9tYXBfZW50cnkoa2V5LCBpX3ZhbCwgcF9lbnZfbWFwKSB7CiAgICBwX3ZhbCA6PSBwX2Vudl9tYXBba2V5XQogICAgcF92YWwgPT0gIiQocG9kLXVpZCkiCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24ucG9kX3VpZCAsIGlfdmFsKQogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgNTogdHJ1ZSIpCn0KCiMgQWxsb3cgZmllbGRSZWYgImZpZWxkUGF0aDogc3RhdHVzLnBvZElQIiB2YWx1ZXMuCmFsbG93X2Vudl9tYXBfZW50cnkoa2V5LCBpX3ZhbCwgcF9lbnZfbWFwKSB7CiAgICBpc19pcChpX3ZhbCkKCiAgICBwX3ZhbCA6PSBwX2Vudl9tYXBba2V5XQogICAgcF92YXIgOj0gY29uY2F0KCI9IiwgW2tleSwgcF92YWxdKQogICAgYWxsb3dfcG9kX2lwX3ZhcihrZXksIHBfdmFyKQogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgNjogdHJ1ZSIpCn0KCiMgQWxsb3cgZmllbGRSZWYgImZpZWxkUGF0aDogc3RhdHVzLmhvc3RJUCIgdmFsdWVzLgphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgaXNfaXAoaV92YWwpCgogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgIHBfdmFyIDo9IGNvbmNhdCgiPSIsIFtrZXksIHBfdmFsXSkKICAgIGFsbG93X2hvc3RfaXBfdmFyKGtleSwgcF92YXIpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSA3OiB0cnVlIikKfQoKIyBNYXRjaCBpbnB1dCB3aXRoIG9uZSBvZiB0aGUgcG9saWN5IHZhcmlhYmxlcywgYWZ0ZXIgc3Vic3RpdHV0aW5nICQoc2FuZGJveC1uYW1lKS4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChzYW5kYm94LW5hbWUpIgogICAgc19uYW1lIDo9IGlucHV0LmJhc2UuT0NJLkFubm90YXRpb25zW1NfTkFNRV9LRVldCiAgICBwX3ZhcjIgOj0gcmVwbGFjZShwX3ZhbCwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHBfdmFyMiA9PSBpX3ZhbAogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgODogdHJ1ZSIpCn0KCiMgTWF0Y2ggaW5wdXQgd2l0aCBvbmUgb2YgdGhlIHBvbGljeSB2YXJpYWJsZXMsIGFmdGVyIHN1YnN0aXR1dGluZyAkKHNhbmRib3gtbmFtZXNwYWNlKS4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChzYW5kYm94LW5hbWVzcGFjZSkiCiAgICBzX25hbWVzcGFjZSA6PSBpbnB1dC5iYXNlLk9DSS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwX3ZhcjIgOj0gcmVwbGFjZShwX3ZhbCwgIiQoc2FuZGJveC1uYW1lc3BhY2UpIiwgc19uYW1lc3BhY2UpCiAgICBwX3ZhcjIgPT0gaV92YWwKICAgIHByaW50KCJhbGxvd19lbnZfbWFwX2VudHJ5IDk6IHRydWUiKQp9CgojIEFsbG93IGlucHV0IGVudiB2YXJpYWJsZXMgdGhhdCBtYXRjaCB3aXRoIGEgcmVxdWVzdF9kZWZhdWx0cyByZWdleC4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHNvbWUgcF9yZWdleDEgaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5DcmVhdGVDb250YWluZXJSZXF1ZXN0LmFsbG93X2Vudl9yZWdleAogICAgcF9yZWdleDIgOj0gcmVwbGFjZShwX3JlZ2V4MSwgIiQoaXB2NF9hKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcHY0X2EpCiAgICBwX3JlZ2V4MyA6PSByZXBsYWNlKHBfcmVnZXgyLCAiJChpcF9wKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcF9wKQogICAgcF9yZWdleDQgOj0gcmVwbGFjZShwX3JlZ2V4MywgIiQoc3ZjX25hbWUpIiwgcG9saWN5X2RhdGEuY29tbW9uLnN2Y19uYW1lKQogICAgcF9yZWdleDUgOj0gcmVwbGFjZShwX3JlZ2V4NCwgIiQoZG5zX2xhYmVsKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5kbnNfbGFiZWwpCgogICAgcmVzdWx0IDo9IGNvbmNhdCgiPSIsIFtrZXksIGlfdmFsXSkKICAgIHJlZ2V4Lm1hdGNoKHBfcmVnZXg1LCByZXN1bHQpCgogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgMTA6IHRydWUiKQp9CgpDcmVhdGVDb250YWluZXJSZXF1ZXN0Oj0gcmVzcCB7CiAgICBub3QgaW5wdXQuZW52X21hcAogICAgaV9wcm9jZXNzID0gaW5wdXQuT0NJLlByb2Nlc3MKICAgIHNfbmFtZSA9IGlucHV0Lk9DSS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBwX3Byb2Nlc3MgPSBwX2NvbnRhaW5lci5PQ0kuUHJvY2VzcwogICAgYWxsb3dfZGVwcmVjYXRlZF9hcmdzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUpCiAgICByZXNwID0gQ3JlYXRlQ29udGFpbmVyUmVxdWVzdENvbW1vbihpbnB1dCkKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0MjogdHJ1ZSIpCn0KCkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb24ocmVxKTo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgICMgQ2hlY2sgaWYgdGhlIGlucHV0IHJlcXVlc3Qgc2hvdWxkIGJlIHJlamVjdGVkIGV2ZW4gYmVmb3JlIGNoZWNraW5nIHRoZQogICAgIyBwb2xpY3lfZGF0YS5jb250YWluZXJzIGluZm9ybWF0aW9uLgogICAgYWxsb3dfY3JlYXRlX2NvbnRhaW5lcl9pbnB1dChyZXEpCgogICAgaV9vY2kgOj0gcmVxLk9DSQogICAgaV9zdG9yYWdlcyA6PSByZXEuc3RvcmFnZXMKICAgIGlfZGV2aWNlcyA6PSByZXEuZGV2aWNlcwoKICAgICMgYXJyYXkgb2YgcG9zc2libGUgc3RhdGUgb3BlcmF0aW9ucwogICAgb3BzX2J1aWxkZXIgOj0gW10KCiAgICAjIGNoZWNrIHNhbmRib3ggbmFtZQogICAgc2FuZGJveF9uYW1lID0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FX0tFWV0KICAgIGFkZF9zYW5kYm94X25hbWVfdG9fc3RhdGUgOj0gc3RhdGVfYWxsb3dzKCJzYW5kYm94X25hbWUiLCBzYW5kYm94X25hbWUpCiAgICBvcHNfYnVpbGRlcjEgOj0gY29uY2F0X29wX2lmX25vdF9udWxsKG9wc19idWlsZGVyLCBhZGRfc2FuZGJveF9uYW1lX3RvX3N0YXRlKQoKICAgICMgQ2hlY2sgaWYgYW55IGVsZW1lbnQgZnJvbSB0aGUgcG9saWN5X2RhdGEuY29udGFpbmVycyBhcnJheSBhbGxvd3MgdGhlIGlucHV0IHJlcXVlc3QuCiAgICBzb21lIHBfY29udGFpbmVyIGluIHBvbGljeV9kYXRhLmNvbnRhaW5lcnMKICAgIHByaW50KCI9PT09PT09PSBDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiB0cnlpbmcgbmV4dCBwb2xpY3kgY29udGFpbmVyIikKCiAgICBwX3BpZG5zIDo9IHBfY29udGFpbmVyLnNhbmRib3hfcGlkbnMKICAgIGlfcGlkbnMgOj0gcmVxLnNhbmRib3hfcGlkbnMKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiBwX3BpZG5zID0iLCBwX3BpZG5zLCAiaV9waWRucyA9IiwgaV9waWRucykKICAgIHBfcGlkbnMgPT0gaV9waWRucwoKICAgIHBfb2NpIDo9IHBfY29udGFpbmVyLk9DSQoKICAgICMgY2hlY2sgbmFtZXNwYWNlCiAgICBwX25hbWVzcGFjZSA6PSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBpX25hbWVzcGFjZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwcmludCAoIkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb246IHBfbmFtZXNwYWNlID0iLCBwX25hbWVzcGFjZSwgImlfbmFtZXNwYWNlID0iLCBpX25hbWVzcGFjZSkKICAgIGFkZF9uYW1lc3BhY2VfdG9fc3RhdGUgOj0gYWxsb3dfbmFtZXNwYWNlKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkKICAgIG9wc19idWlsZGVyMiA6PSBjb25jYXRfb3BfaWZfbm90X251bGwob3BzX2J1aWxkZXIxLCBhZGRfbmFtZXNwYWNlX3RvX3N0YXRlKQoKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiBwIFZlcnNpb24gPSIsIHBfb2NpLlZlcnNpb24sICJpIFZlcnNpb24gPSIsIGlfb2NpLlZlcnNpb24pCiAgICBwX29jaS5WZXJzaW9uID09IGlfb2NpLlZlcnNpb24KCiAgICBwcmludCgiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdENvbW1vbjogcCBSZWFkb25seSA9IiwgcF9vY2kuUm9vdC5SZWFkb25seSwgImkgUmVhZG9ubHkgPSIsIGlfb2NpLlJvb3QuUmVhZG9ubHkpCiAgICBwX29jaS5Sb290LlJlYWRvbmx5ID09IGlfb2NpLlJvb3QuUmVhZG9ubHkKCiAgICBhbGxvd19hbm5vKHBfb2NpLCBpX29jaSkKCiAgICBwX3N0b3JhZ2VzIDo9IHBfY29udGFpbmVyLnN0b3JhZ2VzCiAgICBhbGxvd19ieV9hbm5vKHBfb2NpLCBpX29jaSwgcF9zdG9yYWdlcywgaV9zdG9yYWdlcykKCiAgICBwX2RldmljZXMgOj0gcF9jb250YWluZXIuZGV2aWNlcwogICAgYWxsb3dfZGV2aWNlcyhwX2RldmljZXMsIGlfZGV2aWNlcykKCiAgICByZXQgOj0gYWxsb3dfbGludXgob3BzX2J1aWxkZXIyLCBwX29jaSwgaV9vY2kpCiAgICByZXQuYWxsb3dlZAoKICAgIG9wcyA6PSByZXQub3BzCgogICAgcHJpbnQoIkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb246IHRydWUiKQp9CgphbGxvd19jcmVhdGVfY29udGFpbmVyX2lucHV0KHJlcSkgewogICAgcHJpbnQoImFsbG93X2NyZWF0ZV9jb250YWluZXJfaW5wdXQ6IGlucHV0ID0iLCByZXEpCgogICAgY291bnQocmVxLnNoYXJlZF9tb3VudHMpID09IDAKICAgIGlzX251bGwocmVxLnN0cmluZ191c2VyKQoKICAgIGlfb2NpIDo9IHJlcS5PQ0kKICAgIGlzX251bGwoaV9vY2kuSG9va3MpCiAgICBpc19udWxsKGlfb2NpLlNvbGFyaXMpCiAgICBpc19udWxsKGlfb2NpLldpbmRvd3MpCgogICAgaV9saW51eCA6PSBpX29jaS5MaW51eAogICAgY291bnQoaV9saW51eC5HSURNYXBwaW5ncykgPT0gMAogICAgY291bnQoaV9saW51eC5Nb3VudExhYmVsKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlJlc291cmNlcy5EZXZpY2VzKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlJvb3Rmc1Byb3BhZ2F0aW9uKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlVJRE1hcHBpbmdzKSA9PSAwCiAgICBpc19udWxsKGlfbGludXguSW50ZWxSZHQpCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLkJsb2NrSU8pCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLk5ldHdvcmspCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLlBpZHMpCiAgICBpc19udWxsKGlfbGludXguU2VjY29tcCkKCiAgICBpX3Byb2Nlc3MgOj0gaV9vY2kuUHJvY2VzcwogICAgY291bnQoaV9wcm9jZXNzLlNlbGludXhMYWJlbCkgPT0gMAogICAgY291bnQoaV9wcm9jZXNzLlVzZXIuVXNlcm5hbWUpID09IDAKCiAgICBwcmludCgiYWxsb3dfY3JlYXRlX2NvbnRhaW5lcl9pbnB1dDogdHJ1ZSIpCn0KCmFsbG93X25hbWVzcGFjZShwX25hbWVzcGFjZSwgaV9uYW1lc3BhY2UpID0gYWRkX25hbWVzcGFjZSB7CiAgICBwX25hbWVzcGFjZSA9PSBpX25hbWVzcGFjZQogICAgYWRkX25hbWVzcGFjZSA6PSBudWxsCiAgICBwcmludCgiYWxsb3dfbmFtZXNwYWNlIDE6IGlucHV0IG5hbWVzcGFjZSBtYXRjaGVzIHBvbGljeSBkYXRhIikKfQoKYWxsb3dfbmFtZXNwYWNlKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkgPSBhZGRfbmFtZXNwYWNlIHsKICAgIHBfbmFtZXNwYWNlID09ICIiCiAgICBwcmludCgiYWxsb3dfbmFtZXNwYWNlIDI6IG5vIG5hbWVzcGFjZSBmb3VuZCBvbiBwb2xpY3kgZGF0YSIpCiAgICBhZGRfbmFtZXNwYWNlIDo9IHN0YXRlX2FsbG93cygibmFtZXNwYWNlIiwgaV9uYW1lc3BhY2UpCn0KCiMgdmFsdWUgaGFzbid0IGJlZW4gc2VlbiBiZWZvcmUsIHNhdmUgaXQgdG8gc3RhdGUKc3RhdGVfYWxsb3dzKGtleSwgdmFsdWUpID0gYWN0aW9uIHsKICBzdGF0ZSA6PSBnZXRfc3RhdGUoKQogIHByaW50KCJzdGF0ZV9hbGxvd3MgMTogc3RhdGVba2V5XSA9Iiwgc3RhdGVba2V5XSwgInZhbHVlID0iLCB2YWx1ZSkKICBub3Qgc3RhdGVba2V5XQogIHByaW50KCJzdGF0ZV9hbGxvd3MgMTogc2F2aW5nIHRvIHN0YXRlIGtleSA9Iiwga2V5LCAidmFsdWUgPSIsIHZhbHVlKQogIHBhdGggOj0gZ2V0X3N0YXRlX3BhdGgoa2V5KSAKICBhY3Rpb24gOj0gewogICAgIm9wIjogImFkZCIsCiAgICAicGF0aCI6IHBhdGgsIAogICAgInZhbHVlIjogdmFsdWUsCiAgfQp9CgojIHZhbHVlIG1hdGNoZXMgd2hhdCdzIGluIHN0YXRlLCBhbGxvdyBpdApzdGF0ZV9hbGxvd3Moa2V5LCB2YWx1ZSkgPSBhY3Rpb24gewogIHByaW50KCJzdGF0ZV9hbGxvd3MgMjogc3RhcnQiKQogIHN0YXRlIDo9IGdldF9zdGF0ZSgpCiAgcHJpbnQoInN0YXRlX2FsbG93cyAyOiBzdGF0ZVtrZXldID0iLCBzdGF0ZVtrZXldLCAidmFsdWUgPSIsIHZhbHVlKQogIHZhbHVlID09IHN0YXRlW2tleV0KICBwcmludCgic3RhdGVfYWxsb3dzIDI6IGZvdW5kIGtleSA9Iiwga2V5LCAidmFsdWUgPSIsIHZhbHVlLCAiIGluIHN0YXRlIikKICBhY3Rpb24gOj0gbnVsbAp9CgojIGhlbHBlciBmdW5jdGlvbnMgdG8gaW50ZXJhY3Qgd2l0aCB0aGUgc3RhdGUKZ2V0X3N0YXRlKCkgPSBzdGF0ZSB7CiAgc3RhdGUgOj0gZGF0YVsicHN0YXRlIl0KfQoKZ2V0X3N0YXRlX3ZhbChrZXkpID0gdmFsdWUgewogICAgc3RhdGUgOj0gZ2V0X3N0YXRlKCkKICAgIHZhbHVlIDo9IHN0YXRlW2tleV0KfQoKZ2V0X3N0YXRlX3BhdGgoa2V5KSA9IHBhdGggewogICAgIyBwcmVwZW5kICIvcHN0YXRlLyIgdG8ga2V5CiAgICBwYXRoIDo9IGNvbmNhdCgiLyIsIFsiL3BzdGF0ZSIsIGtleV0pCn0KCiMgSGVscGVyIGZ1bmN0aW9ucyB0byBjb25kaXRpb25hbGx5IGNvbmNhdGVuYXRlIG9wIGlzIG5vdCBudWxsCmNvbmNhdF9vcF9pZl9ub3RfbnVsbChvcHMsIG9wKSA9IHJlc3VsdCB7CiAgICBvcCA9PSBudWxsCiAgICByZXN1bHQgOj0gb3BzCn0KCmNvbmNhdF9vcF9pZl9ub3RfbnVsbChvcHMsIG9wKSA9IHJlc3VsdCB7CiAgICBvcCAhPSBudWxsCiAgICByZXN1bHQgOj0gYXJyYXkuY29uY2F0KG9wcywgW29wXSkKfQoKIyBSZWplY3QgdW5leHBlY3RlZCBhbm5vdGF0aW9ucy4KYWxsb3dfYW5ubyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19hbm5vIDE6IHN0YXJ0IikKCiAgICBub3QgaV9vY2kuQW5ub3RhdGlvbnMKCiAgICBwcmludCgiYWxsb3dfYW5ubyAxOiB0cnVlIikKfQphbGxvd19hbm5vKHBfb2NpLCBpX29jaSkgewogICAgcHJpbnQoImFsbG93X2Fubm8gMjogcCBBbm5vdGF0aW9ucyA9IiwgcF9vY2kuQW5ub3RhdGlvbnMpCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiBpIEFubm90YXRpb25zID0iLCBpX29jaS5Bbm5vdGF0aW9ucykKCiAgICBpX2tleXMgOj0gb2JqZWN0LmtleXMoaV9vY2kuQW5ub3RhdGlvbnMpCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiBpIGtleXMgPSIsIGlfa2V5cykKCiAgICBldmVyeSBpX2tleSBpbiBpX2tleXMgewogICAgICAgIGFsbG93X2Fubm9fa2V5KGlfa2V5LCBwX29jaSkKICAgIH0KCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiB0cnVlIikKfQoKYWxsb3dfYW5ub19rZXkoaV9rZXksIHBfb2NpKSB7CiAgICBwcmludCgiYWxsb3dfYW5ub19rZXkgMTogaSBrZXkgPSIsIGlfa2V5KQoKICAgIHN0YXJ0c3dpdGgoaV9rZXksICJpby5rdWJlcm5ldGVzLmNyaS4iKQoKICAgIHByaW50KCJhbGxvd19hbm5vX2tleSAxOiB0cnVlIikKfQphbGxvd19hbm5vX2tleShpX2tleSwgcF9vY2kpIHsKICAgIHByaW50KCJhbGxvd19hbm5vX2tleSAyOiBpIGtleSA9IiwgaV9rZXkpCgogICAgc29tZSBwX2tleSwgXyBpbiBwX29jaS5Bbm5vdGF0aW9ucwogICAgcF9rZXkgPT0gaV9rZXkKCiAgICBwcmludCgiYWxsb3dfYW5ub19rZXkgMjogdHJ1ZSIpCn0KCiMgR2V0IHRoZSB2YWx1ZSBvZiB0aGUgU19OQU1FX0tFWSBhbm5vdGF0aW9uIGFuZAojIGNvcnJlbGF0ZSBpdCB3aXRoIG90aGVyIGFubm90YXRpb25zIGFuZCBwcm9jZXNzIGZpZWxkcy4KYWxsb3dfYnlfYW5ubyhwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpIHsKICAgIHByaW50KCJhbGxvd19ieV9hbm5vIDE6IHN0YXJ0IikKCiAgICBub3QgcF9vY2kuQW5ub3RhdGlvbnNbU19OQU1FX0tFWV0KCiAgICBpX3NfbmFtZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMTogaV9zX25hbWUgPSIsIGlfc19uYW1lKQoKICAgIGlfc19uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FU1BBQ0VfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMTogaV9zX25hbWVzcGFjZSA9IiwgaV9zX25hbWVzcGFjZSkKCiAgICBhbGxvd19ieV9zYW5kYm94X25hbWUocF9vY2ksIGlfb2NpLCBwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBpX3NfbmFtZSwgaV9zX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfYnlfYW5ubyAxOiB0cnVlIikKfQphbGxvd19ieV9hbm5vKHBfb2NpLCBpX29jaSwgcF9zdG9yYWdlcywgaV9zdG9yYWdlcykgewogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMjogc3RhcnQiKQoKICAgIHBfc19uYW1lIDo9IHBfb2NpLkFubm90YXRpb25zW1NfTkFNRV9LRVldCiAgICBpX3NfbmFtZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMjogaV9zX25hbWUgPSIsIGlfc19uYW1lLCAicF9zX25hbWUgPSIsIHBfc19uYW1lKQoKICAgIGFsbG93X3NhbmRib3hfbmFtZShwX3NfbmFtZSwgaV9zX25hbWUpCgogICAgaV9zX25hbWVzcGFjZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwcmludCgiYWxsb3dfYnlfYW5ubyAyOiBpX3NfbmFtZXNwYWNlID0iLCBpX3NfbmFtZXNwYWNlKQoKICAgIGFsbG93X2J5X3NhbmRib3hfbmFtZShwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMsIGlfc19uYW1lLCBpX3NfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd19ieV9hbm5vIDI6IHRydWUiKQp9CgphbGxvd19ieV9zYW5kYm94X25hbWUocF9vY2ksIGlfb2NpLCBwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfYnlfc2FuZGJveF9uYW1lOiBzdGFydCIpCgogICAgaV9uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FU1BBQ0VfS0VZXQoKICAgIGFsbG93X2J5X2NvbnRhaW5lcl90eXBlcyhwX29jaSwgaV9vY2ksIHNfbmFtZSwgaV9uYW1lc3BhY2UpCiAgICBhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZChwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpCiAgICBhbGxvd19wcm9jZXNzKHBfb2NpLlByb2Nlc3MsIGlfb2NpLlByb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpCgogICAgcHJpbnQoImFsbG93X2J5X3NhbmRib3hfbmFtZTogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfbmFtZShwX3NfbmFtZSwgaV9zX25hbWUpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X25hbWU6IHN0YXJ0IikKICAgIHJlZ2V4Lm1hdGNoKHBfc19uYW1lLCBpX3NfbmFtZSkKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9uYW1lOiB0cnVlIikKfQoKIyBDaGVjayB0aGF0IHRoZSAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLXR5cGUiIGFuZAojICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIiBhbm5vdGF0aW9ucyBkZXNpZ25hdGUgdGhlCiMgZXhwZWN0ZWQgdHlwZSAtIGVpdGhlciBhICJzYW5kYm94IiBvciBhICJjb250YWluZXIiLiBUaGVuLCB2YWxpZGF0ZQojIG90aGVyIGFubm90YXRpb25zIGJhc2VkIG9uIHRoZSBhY3R1YWwgInNhbmRib3giIG9yICJjb250YWluZXIiIHZhbHVlCiMgZnJvbSB0aGUgaW5wdXQgY29udGFpbmVyLgphbGxvd19ieV9jb250YWluZXJfdHlwZXMocF9vY2ksIGlfb2NpLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfYnlfY29udGFpbmVyX3R5cGVzOiBjaGVja2luZyBpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSIpCgogICAgY190eXBlIDo9ICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSIKICAgIAogICAgcF9jcmlfdHlwZSA6PSBwX29jaS5Bbm5vdGF0aW9uc1tjX3R5cGVdCiAgICBpX2NyaV90eXBlIDo9IGlfb2NpLkFubm90YXRpb25zW2NfdHlwZV0KICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZXM6IHBfY3JpX3R5cGUgPSIsIHBfY3JpX3R5cGUsICJpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgcF9jcmlfdHlwZSA9PSBpX2NyaV90eXBlCgogICAgYWxsb3dfYnlfY29udGFpbmVyX3R5cGUoaV9jcmlfdHlwZSwgcF9vY2ksIGlfb2NpLCBzX25hbWUsIHNfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZXM6IHRydWUiKQp9CgphbGxvd19ieV9jb250YWluZXJfdHlwZShpX2NyaV90eXBlLCBwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAxOiBpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgaV9jcmlfdHlwZSA9PSAic2FuZGJveCIKCiAgICBpX2thdGFfdHlwZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1siaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5jb250YWluZXJfdHlwZSJdCiAgICBwcmludCgiYWxsb3dfYnlfY29udGFpbmVyX3R5cGUgMTogaV9rYXRhX3R5cGUgPSIsIGlfa2F0YV90eXBlKQogICAgaV9rYXRhX3R5cGUgPT0gInBvZF9zYW5kYm94IgoKICAgIGFsbG93X3NhbmRib3hfY29udGFpbmVyX25hbWUocF9vY2ksIGlfb2NpKQogICAgYWxsb3dfc2FuZGJveF9uZXRfbmFtZXNwYWNlKHBfb2NpLCBpX29jaSkKICAgIGFsbG93X3NhbmRib3hfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpCgogICAgcHJpbnQoImFsbG93X2J5X2NvbnRhaW5lcl90eXBlIDE6IHRydWUiKQp9CgphbGxvd19ieV9jb250YWluZXJfdHlwZShpX2NyaV90eXBlLCBwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiBpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgaV9jcmlfdHlwZSA9PSAiY29udGFpbmVyIgoKICAgIGlfa2F0YV90eXBlIDo9IGlfb2NpLkFubm90YXRpb25zWyJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIl0KICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiBpX2thdGFfdHlwZSA9IiwgaV9rYXRhX3R5cGUpCiAgICBpX2thdGFfdHlwZSA9PSAicG9kX2NvbnRhaW5lciIKCiAgICBhbGxvd19jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpCiAgICBhbGxvd19uZXRfbmFtZXNwYWNlKHBfb2NpLCBpX29jaSkKICAgIGFsbG93X2xvZ19kaXJlY3RvcnkocF9vY2ksIGlfb2NpKQoKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiB0cnVlIikKfQoKIyAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLW5hbWUiIGFubm90YXRpb24KYWxsb3dfc2FuZGJveF9jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X2NvbnRhaW5lcl9uYW1lOiBzdGFydCIpCgogICAgY29udGFpbmVyX2Fubm90YXRpb25fbWlzc2luZyhwX29jaSwgaV9vY2ksICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItbmFtZSIpCgogICAgcHJpbnQoImFsbG93X3NhbmRib3hfY29udGFpbmVyX25hbWU6IHRydWUiKQp9CgphbGxvd19jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19jb250YWluZXJfbmFtZTogc3RhcnQiKQoKICAgIGFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uKHBfb2NpLCBpX29jaSwgImlvLmt1YmVybmV0ZXMuY3JpLmNvbnRhaW5lci1uYW1lIikKCiAgICBwcmludCgiYWxsb3dfY29udGFpbmVyX25hbWU6IHRydWUiKQp9Cgpjb250YWluZXJfYW5ub3RhdGlvbl9taXNzaW5nKHBfb2NpLCBpX29jaSwga2V5KSB7CiAgICBwcmludCgiY29udGFpbmVyX2Fubm90YXRpb25fbWlzc2luZzoiLCBrZXkpCgogICAgbm90IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIG5vdCBpX29jaS5Bbm5vdGF0aW9uc1trZXldCgogICAgcHJpbnQoImNvbnRhaW5lcl9hbm5vdGF0aW9uX21pc3Npbmc6IHRydWUiKQp9CgphbGxvd19jb250YWluZXJfYW5ub3RhdGlvbihwX29jaSwgaV9vY2ksIGtleSkgewogICAgcHJpbnQoImFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uOiBrZXkgPSIsIGtleSkKCiAgICBwX3ZhbHVlIDo9IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIGlfdmFsdWUgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgcHJpbnQoImFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uOiBwX3ZhbHVlID0iLCBwX3ZhbHVlLCAiaV92YWx1ZSA9IiwgaV92YWx1ZSkKCiAgICBwX3ZhbHVlID09IGlfdmFsdWUKCiAgICBwcmludCgiYWxsb3dfY29udGFpbmVyX2Fubm90YXRpb246IHRydWUiKQp9CgojICJuZXJkY3RsL25ldHdvcmstbmFtZXNwYWNlIiBhbm5vdGF0aW9uCmFsbG93X3NhbmRib3hfbmV0X25hbWVzcGFjZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X25ldF9uYW1lc3BhY2U6IHN0YXJ0IikKCiAgICBrZXkgOj0gIm5lcmRjdGwvbmV0d29yay1uYW1lc3BhY2UiCgogICAgcF9uYW1lc3BhY2UgOj0gcF9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgaV9uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgcHJpbnQoImFsbG93X3NhbmRib3hfbmV0X25hbWVzcGFjZTogcF9uYW1lc3BhY2UgPSIsIHBfbmFtZXNwYWNlLCAiaV9uYW1lc3BhY2UgPSIsIGlfbmFtZXNwYWNlKQoKICAgIHJlZ2V4Lm1hdGNoKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9uZXRfbmFtZXNwYWNlOiB0cnVlIikKfQoKYWxsb3dfbmV0X25hbWVzcGFjZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19uZXRfbmFtZXNwYWNlOiBzdGFydCIpCgogICAga2V5IDo9ICJuZXJkY3RsL25ldHdvcmstbmFtZXNwYWNlIgoKICAgIG5vdCBwX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICBub3QgaV9vY2kuQW5ub3RhdGlvbnNba2V5XQoKICAgIHByaW50KCJhbGxvd19uZXRfbmFtZXNwYWNlOiB0cnVlIikKfQoKIyAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1sb2ctZGlyZWN0b3J5IiBhbm5vdGF0aW9uCmFsbG93X3NhbmRib3hfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X2xvZ19kaXJlY3Rvcnk6IHN0YXJ0IikKCiAgICBrZXkgOj0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbG9nLWRpcmVjdG9yeSIKCiAgICBwX2RpciA6PSBwX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICByZWdleDEgOj0gcmVwbGFjZShwX2RpciwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHJlZ2V4MiA6PSByZXBsYWNlKHJlZ2V4MSwgIiQoc2FuZGJveC1uYW1lc3BhY2UpIiwgc19uYW1lc3BhY2UpCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiByZWdleDIgPSIsIHJlZ2V4MikKCiAgICBpX2RpciA6PSBpX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiBpX2RpciA9IiwgaV9kaXIpCgogICAgcmVnZXgubWF0Y2gocmVnZXgyLCBpX2RpcikKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiB0cnVlIikKfQoKYWxsb3dfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19sb2dfZGlyZWN0b3J5OiBzdGFydCIpCgogICAga2V5IDo9ICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWxvZy1kaXJlY3RvcnkiCgogICAgbm90IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIG5vdCBpX29jaS5Bbm5vdGF0aW9uc1trZXldCgogICAgcHJpbnQoImFsbG93X2xvZ19kaXJlY3Rvcnk6IHRydWUiKQp9CgphbGxvd19kZXZpY2VzKHBfZGV2aWNlcywgaV9kZXZpY2VzKSB7CiAgICBwcmludCgiYWxsb3dfZGV2aWNlczogc3RhcnQiKQogICAgZXZlcnkgaV9kZXZpY2UgaW4gaV9kZXZpY2VzIHsKICAgICAgICBwcmludCgiYWxsb3dfZGV2aWNlczogaV9kZXZpY2UgPSIsIGlfZGV2aWNlKQogICAgICAgIHNvbWUgcF9kZXZpY2UgaW4gcF9kZXZpY2VzCiAgICAgICAgcF9kZXZpY2UuY29udGFpbmVyX3BhdGggPT0gaV9kZXZpY2UuY29udGFpbmVyX3BhdGgKICAgIH0KICAgIHByaW50KCJhbGxvd19kZXZpY2VzOiB0cnVlIikKfQoKYWxsb3dfbGludXgoc3RhdGVfb3BzLCBwX29jaSwgaV9vY2kpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIHBfbmFtZXNwYWNlcyA6PSBwX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbGludXg6IHAgbmFtZXNwYWNlcyA9IiwgcF9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlcyA6PSBpX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbGludXg6IGkgbmFtZXNwYWNlcyA9IiwgaV9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlX3dpdGhvdXRfbmV0d29yayA6PSBbb2JqIHwgb2JqIDo9IGlfbmFtZXNwYWNlc1tfXTsgb2JqLlR5cGUgIT0gIm5ldHdvcmsiXQoKICAgIHByaW50KCJhbGxvd19saW51eDogaV9uYW1lc3BhY2Vfd2l0aG91dF9uZXR3b3JrID0iLCBpX25hbWVzcGFjZV93aXRob3V0X25ldHdvcmspCgogICAgcF9uYW1lc3BhY2VzID09IGlfbmFtZXNwYWNlX3dpdGhvdXRfbmV0d29yawoKICAgIGFsbG93X21hc2tlZF9wYXRocyhwX29jaSwgaV9vY2kpCiAgICBhbGxvd19yZWFkb25seV9wYXRocyhwX29jaSwgaV9vY2kpCiAgICBhbGxvd19saW51eF9kZXZpY2VzKHBfb2NpLkxpbnV4LkRldmljZXMsIGlfb2NpLkxpbnV4LkRldmljZXMpCiAgICBhbGxvd19saW51eF9zeXNjdGwocF9vY2kuTGludXgsIGlfb2NpLkxpbnV4KQogICAgcmV0IDo9IGFsbG93X25ldHdvcmtfbmFtZXNwYWNlX3N0YXJ0KHN0YXRlX29wcywgcF9vY2ksIGlfb2NpKQogICAgcmV0LmFsbG93ZWQKCiAgICBvcHMgOj0gcmV0Lm9wcwoKICAgIHByaW50KCJhbGxvd19saW51eDogdHJ1ZSIpCn0KCiMgUmV0cmlldmUgdGhlICJuZXR3b3JrIiBuYW1lc3BhY2UgZnJvbSB0aGUgaW5wdXQgZGF0YSBhbmQgcGFzcyBpdCBvbiBmb3IgdGhlCiMgbmV0d29yayBuYW1lc3BhY2UgcG9saWN5IGNoZWNrcy4KYWxsb3dfbmV0d29ya19uYW1lc3BhY2Vfc3RhcnQoc3RhdGVfb3BzLCBwX29jaSwgaV9vY2kpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIHByaW50KCJhbGxvd19uZXR3b3JrX25hbWVzcGFjZSBzdGFydDogc3RhcnQiKQoKICAgIHBfbmFtZXNwYWNlcyA6PSBwX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IHAgbmFtZXNwYWNlcyA9IiwgcF9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlcyA6PSBpX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IGkgbmFtZXNwYWNlcyA9IiwgaV9uYW1lc3BhY2VzKQoKICAgICMgUmV0dXJuIHBhdGggb2YgdGhlICJuZXR3b3JrIiBuYW1lc3BhY2UKICAgIG5ldHdvcmtfbnMgOj0gW29iaiB8IG9iaiA6PSBpX25hbWVzcGFjZXNbX107IG9iai5UeXBlID09ICJuZXR3b3JrIl0KCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IG5ldHdvcmtfbnMgPSIsIG5ldHdvcmtfbnMpCgogICAgcmV0IDo9IGFsbG93X25ldHdvcmtfbmFtZXNwYWNlKHN0YXRlX29wcywgbmV0d29ya19ucykKICAgIHJldC5hbGxvd2VkCgogICAgb3BzIDo9IHJldC5vcHMKfQoKIyBUaGlzIHJ1bGUgaXMgd2hlbiB0aGVyZSdzIG5vIG5ldHdvcmsgbmFtZXNwYWNlIGluIHRoZSBpbnB1dCBkYXRhLgphbGxvd19uZXR3b3JrX25hbWVzcGFjZShzdGF0ZV9vcHMsIG5ldHdvcmtfbnMpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIGNvdW50KG5ldHdvcmtfbnMpID09IDAKCiAgICBuZXR3b3JrX25zX3BhdGggPSAiIgoKICAgIGFkZF9uZXR3b3JrX25hbWVzcGFjZV90b19zdGF0ZSA6PSBzdGF0ZV9hbGxvd3MoIm5ldHdvcmtfbmFtZXNwYWNlIiwgbmV0d29ya19uc19wYXRoKQogICAgb3BzIDo9IGNvbmNhdF9vcF9pZl9ub3RfbnVsbChzdGF0ZV9vcHMsIGFkZF9uZXR3b3JrX25hbWVzcGFjZV90b19zdGF0ZSkKCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2UgMTogdHJ1ZSIpCn0KCiMgVGhpcyBydWxlIGlzIHdoZW4gdGhlcmUncyBleGFjdGx5IG9uZSBuZXR3b3JrIG5hbWVzcGFjZSBpbiB0aGUgaW5wdXQgZGF0YS4KYWxsb3dfbmV0d29ya19uYW1lc3BhY2Uoc3RhdGVfb3BzLCBuZXR3b3JrX25zKSA6PSB7Im9wcyI6IG9wcywgImFsbG93ZWQiOiB0cnVlfSB7CiAgICBjb3VudChuZXR3b3JrX25zKSA9PSAxCgogICAgYWRkX25ldHdvcmtfbmFtZXNwYWNlX3RvX3N0YXRlIDo9IHN0YXRlX2FsbG93cygibmV0d29ya19uYW1lc3BhY2UiLCBuZXR3b3JrX25zWzBdLlBhdGgpCiAgICBvcHMgOj0gY29uY2F0X29wX2lmX25vdF9udWxsKHN0YXRlX29wcywgYWRkX25ldHdvcmtfbmFtZXNwYWNlX3RvX3N0YXRlKQoKICAgIHByaW50KCJhbGxvd19uZXR3b3JrX25hbWVzcGFjZSAyOiB0cnVlIikKfQoKYWxsb3dfbWFza2VkX3BhdGhzKHBfb2NpLCBpX29jaSkgewogICAgcF9wYXRocyA6PSBwX29jaS5MaW51eC5NYXNrZWRQYXRocwogICAgcHJpbnQoImFsbG93X21hc2tlZF9wYXRocyAxOiBwX3BhdGhzID0iLCBwX3BhdGhzKQoKICAgIGlfcGF0aHMgOj0gaV9vY2kuTGludXguTWFza2VkUGF0aHMKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aHMgMTogaV9wYXRocyA9IiwgaV9wYXRocykKCiAgICBhbGxvd19tYXNrZWRfcGF0aHNfYXJyYXkocF9wYXRocywgaV9wYXRocykKCiAgICBwcmludCgiYWxsb3dfbWFza2VkX3BhdGhzIDE6IHRydWUiKQp9CmFsbG93X21hc2tlZF9wYXRocyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aHMgMjogc3RhcnQiKQoKICAgIG5vdCBwX29jaS5MaW51eC5NYXNrZWRQYXRocwogICAgbm90IGlfb2NpLkxpbnV4Lk1hc2tlZFBhdGhzCgogICAgcHJpbnQoImFsbG93X21hc2tlZF9wYXRocyAyOiB0cnVlIikKfQoKIyBBbGwgdGhlIHBvbGljeSBtYXNrZWQgcGF0aHMgbXVzdCBiZSBtYXNrZWQgaW4gdGhlIGlucHV0IGRhdGEgdG9vLgojIElucHV0IGlzIGFsbG93ZWQgdG8gaGF2ZSBtb3JlIG1hc2tlZCBwYXRocyB0aGFuIHRoZSBwb2xpY3kuCmFsbG93X21hc2tlZF9wYXRoc19hcnJheShwX2FycmF5LCBpX2FycmF5KSB7CiAgICBldmVyeSBwX2VsZW0gaW4gcF9hcnJheSB7CiAgICAgICAgYWxsb3dfbWFza2VkX3BhdGgocF9lbGVtLCBpX2FycmF5KQogICAgfQp9CgphbGxvd19tYXNrZWRfcGF0aChwX2VsZW0sIGlfYXJyYXkpIHsKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aDogcF9lbGVtID0iLCBwX2VsZW0pCgogICAgc29tZSBpX2VsZW0gaW4gaV9hcnJheQogICAgcF9lbGVtID09IGlfZWxlbQoKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aDogdHJ1ZSIpCn0KCmFsbG93X3JlYWRvbmx5X3BhdGhzKHBfb2NpLCBpX29jaSkgewogICAgcF9wYXRocyA6PSBwX29jaS5MaW51eC5SZWFkb25seVBhdGhzCiAgICBwcmludCgiYWxsb3dfcmVhZG9ubHlfcGF0aHMgMTogcF9wYXRocyA9IiwgcF9wYXRocykKCiAgICBpX3BhdGhzIDo9IGlfb2NpLkxpbnV4LlJlYWRvbmx5UGF0aHMKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAxOiBpX3BhdGhzID0iLCBpX3BhdGhzKQoKICAgIGFsbG93X3JlYWRvbmx5X3BhdGhzX2FycmF5KHBfcGF0aHMsIGlfcGF0aHMsIGlfb2NpLkxpbnV4Lk1hc2tlZFBhdGhzKQoKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAxOiB0cnVlIikKfQphbGxvd19yZWFkb25seV9wYXRocyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAyOiBzdGFydCIpCgogICAgbm90IHBfb2NpLkxpbnV4LlJlYWRvbmx5UGF0aHMKICAgIG5vdCBpX29jaS5MaW51eC5SZWFkb25seVBhdGhzCgogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGhzIDI6IHRydWUiKQp9CgojIEFsbCB0aGUgcG9saWN5IHJlYWRvbmx5IHBhdGhzIG11c3QgYmUgZWl0aGVyOgojIC0gUHJlc2VudCBpbiB0aGUgaW5wdXQgcmVhZG9ubHkgcGF0aHMsIG9yCiMgLSBQcmVzZW50IGluIHRoZSBpbnB1dCBtYXNrZWQgcGF0aHMuCiMgSW5wdXQgaXMgYWxsb3dlZCB0byBoYXZlIG1vcmUgcmVhZG9ubHkgcGF0aHMgdGhhbiB0aGUgcG9saWN5LgphbGxvd19yZWFkb25seV9wYXRoc19hcnJheShwX2FycmF5LCBpX2FycmF5LCBtYXNrZWRfcGF0aHMpIHsKICAgIGV2ZXJ5IHBfZWxlbSBpbiBwX2FycmF5IHsKICAgICAgICBhbGxvd19yZWFkb25seV9wYXRoKHBfZWxlbSwgaV9hcnJheSwgbWFza2VkX3BhdGhzKQogICAgfQp9CgphbGxvd19yZWFkb25seV9wYXRoKHBfZWxlbSwgaV9hcnJheSwgbWFza2VkX3BhdGhzKSB7CiAgICBwcmludCgiYWxsb3dfcmVhZG9ubHlfcGF0aCAxOiBwX2VsZW0gPSIsIHBfZWxlbSkKCiAgICBzb21lIGlfZWxlbSBpbiBpX2FycmF5CiAgICBwX2VsZW0gPT0gaV9lbGVtCgogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGggMTogdHJ1ZSIpCn0KYWxsb3dfcmVhZG9ubHlfcGF0aChwX2VsZW0sIGlfYXJyYXksIG1hc2tlZF9wYXRocykgewogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGggMjogcF9lbGVtID0iLCBwX2VsZW0pCgogICAgc29tZSBpX21hc2tlZCBpbiBtYXNrZWRfcGF0aHMKICAgIHBfZWxlbSA9PSBpX21hc2tlZAoKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRoIDI6IHRydWUiKQp9CgphbGxvd19saW51eF9kZXZpY2VzKHBfZGV2aWNlcywgaV9kZXZpY2VzKSB7CiAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogc3RhcnQiKQogICAgZXZlcnkgaV9kZXZpY2UgaW4gaV9kZXZpY2VzIHsKICAgICAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogaV9kZXZpY2UgPSIsIGlfZGV2aWNlKQogICAgICAgIHNvbWUgcF9kZXZpY2UgaW4gcF9kZXZpY2VzCiAgICAgICAgaV9kZXZpY2UuUGF0aCA9PSBwX2RldmljZS5QYXRoCiAgICB9CiAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogdHJ1ZSIpCn0KCmFsbG93X2xpbnV4X3N5c2N0bChwX2xpbnV4LCBpX2xpbnV4KSB7CiAgICBwcmludCgiYWxsb3dfbGludXhfc3lzY3RsIDE6IHN0YXJ0IikKICAgIG5vdCBpX2xpbnV4LlN5c2N0bAogICAgcHJpbnQoImFsbG93X2xpbnV4X3N5c2N0bCAxOiB0cnVlIikKfQoKYWxsb3dfbGludXhfc3lzY3RsKHBfbGludXgsIGlfbGludXgpIHsKICAgIHByaW50KCJhbGxvd19saW51eF9zeXNjdGwgMjogc3RhcnQiKQogICAgcF9zeXNjdGwgOj0gcF9saW51eC5TeXNjdGwKICAgIGlfc3lzY3RsIDo9IGlfbGludXguU3lzY3RsCiAgICBldmVyeSBpX25hbWUsIGlfdmFsIGluIGlfc3lzY3RsIHsKICAgICAgICBwcmludCgiYWxsb3dfbGludXhfc3lzY3RsIDI6IGlfbmFtZSA9IiwgaV9uYW1lLCAiaV92YWwgPSIsIGlfdmFsKQogICAgICAgIHBfc3lzY3RsW2lfbmFtZV0gPT0gaV92YWwKICAgIH0KICAgIHByaW50KCJhbGxvd19saW51eF9zeXNjdGwgMjogdHJ1ZSIpCn0KCiMgQ2hlY2sgdGhlIGNvbnNpc3RlbmN5IG9mIHRoZSBpbnB1dCAiaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5idW5kbGVfcGF0aCIKIyBhbmQgaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCIgdmFsdWVzIHdpdGggb3RoZXIgZmllbGRzLgphbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZChwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpIHsKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogc3RhcnQiKQoKICAgIGJ1bmRsZV9wYXRoIDo9IGlfb2NpLkFubm90YXRpb25zWyJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmJ1bmRsZV9wYXRoIl0KICAgIGJ1bmRsZV9pZCA6PSByZXBsYWNlKGJ1bmRsZV9wYXRoLCAiL3J1bi9jb250YWluZXJkL2lvLmNvbnRhaW5lcmQucnVudGltZS52Mi50YXNrL2s4cy5pby8iLCAiIikKCiAgICBidW5kbGVfaWRfZm9ybWF0IDo9IGNvbmNhdCgiIiwgWyJeIiwgQlVORExFX0lELCAiJCJdKQogICAgcmVnZXgubWF0Y2goYnVuZGxlX2lkX2Zvcm1hdCwgYnVuZGxlX2lkKQoKICAgIGtleSA6PSAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCIKCiAgICBwX3JlZ2V4IDo9IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIHNhbmRib3hfaWQgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQoKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogc2FuZGJveF9pZCA9Iiwgc2FuZGJveF9pZCwgInJlZ2V4ID0iLCBwX3JlZ2V4KQogICAgcmVnZXgubWF0Y2gocF9yZWdleCwgc2FuZGJveF9pZCkKCiAgICBhbGxvd19yb290X3BhdGgocF9vY2ksIGlfb2NpLCBidW5kbGVfaWQpCgogICAgZXZlcnkgaV9tb3VudCBpbiBpX29jaS5Nb3VudHMgewogICAgICAgIGFsbG93X21vdW50KHBfb2NpLCBpX21vdW50LCBpX3N0b3JhZ2VzLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpCiAgICB9CgogICAgYWxsb3dfc3RvcmFnZXMocF9zdG9yYWdlcywgaV9zdG9yYWdlcywgYnVuZGxlX2lkLCBzYW5kYm94X2lkKQoKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogdHJ1ZSIpCn0KCmFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHBfcHJvY2VzcyA9IiwgcF9wcm9jZXNzKQogICAgcHJpbnQoImFsbG93X3Byb2Nlc3NfY29tbW9uOiBpX3Byb2Nlc3MgPSAiLCBpX3Byb2Nlc3MpCiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHNfbmFtZSA9Iiwgc19uYW1lKQoKICAgIHBfcHJvY2Vzcy5Dd2QgPT0gaV9wcm9jZXNzLkN3ZAogICAgcF9wcm9jZXNzLk5vTmV3UHJpdmlsZWdlcyA9PSBpX3Byb2Nlc3MuTm9OZXdQcml2aWxlZ2VzCgogICAgYWxsb3dfdXNlcihwX3Byb2Nlc3MsIGlfcHJvY2VzcykKICAgIGFsbG93X2VudihwX3Byb2Nlc3MsIGlfcHJvY2Vzcywgc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHRydWUiKQp9CgojIENvbXBhcmUgdGhlIE9DSSBQcm9jZXNzIGZpZWxkIG9mIGEgcG9saWN5IGNvbnRhaW5lciB3aXRoIHRoZSBpbnB1dCBPQ0kgUHJvY2VzcyBmcm9tIGEgQ3JlYXRlQ29udGFpbmVyUmVxdWVzdAphbGxvd19wcm9jZXNzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfcHJvY2Vzczogc3RhcnQiKQoKICAgIGFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgYWxsb3dfY2FwcyhwX3Byb2Nlc3MuQ2FwYWJpbGl0aWVzLCBpX3Byb2Nlc3MuQ2FwYWJpbGl0aWVzKQogICAgcF9wcm9jZXNzLlRlcm1pbmFsID09IGlfcHJvY2Vzcy5UZXJtaW5hbAoKICAgIHByaW50KCJhbGxvd19wcm9jZXNzOiB0cnVlIikKfQoKIyBDb21wYXJlIHRoZSBPQ0kgUHJvY2VzcyBmaWVsZCBvZiBhIHBvbGljeSBjb250YWluZXIgd2l0aCB0aGUgaW5wdXQgcHJvY2VzcyBmaWVsZCBmcm9tIEV4ZWNQcm9jZXNzUmVxdWVzdAphbGxvd19pbnRlcmFjdGl2ZV9wcm9jZXNzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfaW50ZXJhY3RpdmVfcHJvY2Vzczogc3RhcnQiKQoKICAgIGFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgYWxsb3dfZXhlY19jYXBzKGlfcHJvY2Vzcy5DYXBhYmlsaXRpZXMpCgogICAgIyBUaGVzZSBhcmUgY29tbWFuZHMgZW5hYmxlZCB1c2luZyBFeGVjUHJvY2Vzc1JlcXVlc3QgY29tbWFuZHMgYW5kL29yIHJlZ2V4IGZyb20gdGhlIHNldHRpbmdzIGZpbGUuCiAgICAjIFRoZXkgY2FuIGJlIGV4ZWN1dGVkIGludGVyYWN0aXZlbHkgc28gYWxsb3cgdGhlbSB0byB1c2UgYW55IHZhbHVlIGZvciBpX3Byb2Nlc3MuVGVybWluYWwuCgogICAgcHJpbnQoImFsbG93X2ludGVyYWN0aXZlX3Byb2Nlc3M6IHRydWUiKQp9CgojIENvbXBhcmUgdGhlIE9DSSBQcm9jZXNzIGZpZWxkIG9mIGEgcG9saWN5IGNvbnRhaW5lciB3aXRoIHRoZSBpbnB1dCBwcm9jZXNzIGZpZWxkIGZyb20gRXhlY1Byb2Nlc3NSZXF1ZXN0CmFsbG93X3Byb2JlX3Byb2Nlc3MocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19wcm9iZV9wcm9jZXNzOiBzdGFydCIpCgogICAgYWxsb3dfcHJvY2Vzc19jb21tb24ocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpCiAgICBhbGxvd19leGVjX2NhcHMoaV9wcm9jZXNzLkNhcGFiaWxpdGllcykKICAgIHBfcHJvY2Vzcy5UZXJtaW5hbCA9PSBpX3Byb2Nlc3MuVGVybWluYWwKCiAgICBwcmludCgiYWxsb3dfcHJvYmVfcHJvY2VzczogdHJ1ZSIpCn0KCmFsbG93X3VzZXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MpIHsKICAgIHBfdXNlciA6PSBwX3Byb2Nlc3MuVXNlcgogICAgaV91c2VyIDo9IGlfcHJvY2Vzcy5Vc2VyCgogICAgcHJpbnQoImFsbG93X3VzZXI6IGlucHV0IHVpZCA9IiwgaV91c2VyLlVJRCwgInBvbGljeSB1aWQgPSIsIHBfdXNlci5VSUQpCiAgICBwX3VzZXIuVUlEID09IGlfdXNlci5VSUQKCiAgICAjIFRPRE86IHRyYWNrIGRvd24gdGhlIHJlYXNvbiBmb3IgcmVnaXN0cnkuazhzLmlvL3BhdXNlOjMuOSBiZWluZwogICAgIyAgICAgICBleGVjdXRlZCB3aXRoIGdpZCA9IDAgZGVzcGl0ZSBoYXZpbmcgIjY1NTM1OjY1NTM1IiBpbiBpdHMgY29udGFpbmVyIGltYWdlCiAgICAjICAgICAgIGNvbmZpZy4KICAgICNwcmludCgiYWxsb3dfdXNlcjogaW5wdXQgZ2lkID0iLCBpX3VzZXIuR0lELCAicG9saWN5IGdpZCA9IiwgcF91c2VyLkdJRCkKICAgICNwX3VzZXIuR0lEID09IGlfdXNlci5HSUQKCiAgICAjIFRPRE86IGNvbXBhcmUgdGhlIGFkZGl0aW9uYWxHaWRzIGZpZWxkIHRvbyBhZnRlciBjb21wdXRpbmcgaXRzIHZhbHVlCiAgICAjIGJhc2VkIG9uIC9ldGMvcGFzc3dkIGFuZCAvZXRjL2dyb3VwIGZyb20gdGhlIGNvbnRhaW5lciBpbWFnZS4KfQoKYWxsb3dfZGVwcmVjYXRlZF9hcmdzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZ3MgMTogbm8gYXJncyIpCgogICAgbm90IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJncwogICAgbm90IGlfcHJvY2Vzcy5BcmdzCgogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAxOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZ3MocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSkgewogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiBwb2xpY3kgYXJncyA9IiwgcF9wcm9jZXNzLkRlcHJlY2F0ZWRBcmdzKQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiBpbnB1dCBhcmdzID0iLCBpX3Byb2Nlc3MuQXJncykKCiAgICBjb3VudChwX3Byb2Nlc3MuRGVwcmVjYXRlZEFyZ3MpID09IGNvdW50KGlfcHJvY2Vzcy5BcmdzKQoKICAgIGV2ZXJ5IGksIGlfYXJnIGluIGlfcHJvY2Vzcy5BcmdzIHsKICAgICAgICBhbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpCiAgICB9CgogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDE6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgcF9hcmcyIDo9IHJlcGxhY2UocF9hcmcsICIkJCIsICIkIikKICAgIHBfYXJnMiA9PSBpX2FyZwoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAxOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDI6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgIyBUT0RPOiBjYW4gJChub2RlLW5hbWUpIGJlIGhhbmRsZWQgYmV0dGVyPwogICAgY29udGFpbnMocF9hcmcsICIkKG5vZGUtbmFtZSkiKQoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAyOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDM6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgcF9hcmcyIDo9IHJlcGxhY2UocF9hcmcsICIkJCIsICIkIikKICAgIHBfYXJnMyA6PSByZXBsYWNlKHBfYXJnMiwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAzOiBwX2FyZzMgPSIsIHBfYXJnMykKICAgIHBfYXJnMyA9PSBpX2FyZwoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAzOiB0cnVlIikKfQoKIyBPQ0kgcHJvY2Vzcy5FbnYgZmllbGQKYWxsb3dfZW52KHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfZW52OiBwIGVudiA9IiwgcF9wcm9jZXNzLkVudikKICAgIHByaW50KCJhbGxvd19lbnY6IGkgZW52ID0iLCBpX3Byb2Nlc3MuRW52KQoKICAgIGV2ZXJ5IGlfdmFyIGluIGlfcHJvY2Vzcy5FbnYgewogICAgICAgIHByaW50KCJhbGxvd19lbnY6IGlfdmFyID0iLCBpX3ZhcikKICAgICAgICBhbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgfQoKICAgIHByaW50KCJhbGxvd19lbnY6IHRydWUiKQp9CgojIEFsbG93IGlucHV0IGVudiB2YXJpYWJsZXMgdGhhdCBhcmUgcHJlc2VudCBpbiB0aGUgcG9saWN5IGRhdGEgdG9vLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHBfdmFyID09IGlfdmFyCiAgICBwcmludCgiYWxsb3dfdmFyIDE6IHRydWUiKQp9CgojIE1hdGNoIGlucHV0IHdpdGggb25lIG9mIHRoZSBwb2xpY3kgdmFyaWFibGVzLCBhZnRlciBzdWJzdGl0dXRpbmcgJChzYW5kYm94LW5hbWUpLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHByaW50KCJhbGxvd192YXIgMjogcF92YXIgPSIsIHBfdmFyKQoKICAgIHBfdmFyX3NwbGl0IDo9IHNwbGl0KHBfdmFyLCAiPSIpCiAgICBjb3VudChwX3Zhcl9zcGxpdCkgPT0gMgoKICAgIHBfdmFyX3NwbGl0WzFdID09ICIkKHNhbmRib3gtbmFtZSkiCgogICAgaV92YXJfc3BsaXQgOj0gc3BsaXQoaV92YXIsICI9IikKICAgIGNvdW50KGlfdmFyX3NwbGl0KSA9PSAyCgogICAgaV92YXJfc3BsaXRbMF0gPT0gcF92YXJfc3BsaXRbMF0KICAgIHJlZ2V4Lm1hdGNoKHNfbmFtZSwgaV92YXJfc3BsaXRbMV0pCgogICAgcHJpbnQoImFsbG93X3ZhciAyOiB0cnVlIikKfQoKIyBBbGxvdyBpbnB1dCBlbnYgdmFyaWFibGVzIHRoYXQgbWF0Y2ggd2l0aCBhIHJlcXVlc3RfZGVmYXVsdHMgcmVnZXguCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHNvbWUgcF9yZWdleDEgaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5DcmVhdGVDb250YWluZXJSZXF1ZXN0LmFsbG93X2Vudl9yZWdleAogICAgcF9yZWdleDIgOj0gcmVwbGFjZShwX3JlZ2V4MSwgIiQoaXB2NF9hKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcHY0X2EpCiAgICBwX3JlZ2V4MyA6PSByZXBsYWNlKHBfcmVnZXgyLCAiJChpcF9wKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcF9wKQogICAgcF9yZWdleDQgOj0gcmVwbGFjZShwX3JlZ2V4MywgIiQoc3ZjX25hbWUpIiwgcG9saWN5X2RhdGEuY29tbW9uLnN2Y19uYW1lKQogICAgcF9yZWdleDUgOj0gcmVwbGFjZShwX3JlZ2V4NCwgIiQoZG5zX2xhYmVsKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5kbnNfbGFiZWwpCgogICAgcHJpbnQoImFsbG93X3ZhciAzOiBwX3JlZ2V4NSA9IiwgcF9yZWdleDUpCiAgICByZWdleC5tYXRjaChwX3JlZ2V4NSwgaV92YXIpCgogICAgcHJpbnQoImFsbG93X3ZhciAzOiB0cnVlIikKfQoKIyBBbGxvdyBmaWVsZFJlZiAiZmllbGRQYXRoOiBzdGF0dXMucG9kSVAiIHZhbHVlcy4KYWxsb3dfdmFyKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBpX3Zhciwgc19uYW1lLCBzX25hbWVzcGFjZSkgewogICAgbmFtZV92YWx1ZSA6PSBzcGxpdChpX3ZhciwgIj0iKQogICAgY291bnQobmFtZV92YWx1ZSkgPT0gMgogICAgaXNfaXAobmFtZV92YWx1ZVsxXSkKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIGFsbG93X3BvZF9pcF92YXIobmFtZV92YWx1ZVswXSwgcF92YXIpCgogICAgcHJpbnQoImFsbG93X3ZhciA0OiB0cnVlIikKfQoKIyBBbGxvdyBjb21tb24gZmllbGRSZWYgdmFyaWFibGVzLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBuYW1lX3ZhbHVlIDo9IHNwbGl0KGlfdmFyLCAiPSIpCiAgICBjb3VudChuYW1lX3ZhbHVlKSA9PSAyCgogICAgc29tZSBwX3ZhciBpbiBwX3Byb2Nlc3MuRW52CiAgICBwX25hbWVfdmFsdWUgOj0gc3BsaXQocF92YXIsICI9IikKICAgIGNvdW50KHBfbmFtZV92YWx1ZSkgPT0gMgoKICAgIHBfbmFtZV92YWx1ZVswXSA9PSBuYW1lX3ZhbHVlWzBdCgogICAgIyBUT0RPOiBzaG91bGQgdGhlc2UgYmUgaGFuZGxlZCBpbiBhIGRpZmZlcmVudCB3YXk/CiAgICBhbHdheXNfYWxsb3dlZCA6PSBbIiQoaG9zdC1uYW1lKSIsICIkKG5vZGUtbmFtZSkiLCAiJChwb2QtdWlkKSJdCiAgICBzb21lIGFsbG93ZWQgaW4gYWx3YXlzX2FsbG93ZWQKICAgIGNvbnRhaW5zKHBfbmFtZV92YWx1ZVsxXSwgYWxsb3dlZCkKCiAgICBwcmludCgiYWxsb3dfdmFyIDU6IHRydWUiKQp9CgojIEFsbG93IGZpZWxkUmVmICJmaWVsZFBhdGg6IHN0YXR1cy5ob3N0SVAiIHZhbHVlcy4KYWxsb3dfdmFyKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBpX3Zhciwgc19uYW1lLCBzX25hbWVzcGFjZSkgewogICAgbmFtZV92YWx1ZSA6PSBzcGxpdChpX3ZhciwgIj0iKQogICAgY291bnQobmFtZV92YWx1ZSkgPT0gMgogICAgaXNfaXAobmFtZV92YWx1ZVsxXSkKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIGFsbG93X2hvc3RfaXBfdmFyKG5hbWVfdmFsdWVbMF0sIHBfdmFyKQoKICAgIHByaW50KCJhbGxvd192YXIgNjogdHJ1ZSIpCn0KCiMgQWxsb3cgcmVzb3VyY2VGaWVsZFJlZiB2YWx1ZXMgKGUuZy4sICJsaW1pdHMuY3B1IikuCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIG5hbWVfdmFsdWUgOj0gc3BsaXQoaV92YXIsICI9IikKICAgIGNvdW50KG5hbWVfdmFsdWUpID09IDIKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHBfbmFtZV92YWx1ZSA6PSBzcGxpdChwX3ZhciwgIj0iKQogICAgY291bnQocF9uYW1lX3ZhbHVlKSA9PSAyCgogICAgcF9uYW1lX3ZhbHVlWzBdID09IG5hbWVfdmFsdWVbMF0KCiAgICAjIGEgdmFyaWFibGUgd2Ugc2hvdWxkIGJlIHZhbGlkYXRpbmcgdXNpbmcgYSByZWdleCBmcm9tIHNldHRpbmdzCiAgICBwX25hbWVfdmFsdWVbMV0gPT0gIiQodmFsaWRhdGUtZnJvbS1zZXR0aW5ncykiCgogICAgcmVnZXhfdmFsIDo9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuQ3JlYXRlQ29udGFpbmVyUmVxdWVzdC5hbGxvd19lbnZfcmVnZXhfbWFwW25hbWVfdmFsdWVbMF1dCgogICAgcHJpbnQoImFsbG93X3ZhciA3OiB2YWwgPSIsIG5hbWVfdmFsdWVbMV0pCiAgICBwcmludCgiYWxsb3dfdmFyIDc6IHJlZ2V4X3ZhbCA9IiwgcmVnZXhfdmFsKQoKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4X3ZhbCwgbmFtZV92YWx1ZVsxXSkKCiAgICBwcmludCgiYWxsb3dfdmFyIDc6IHRydWUiKQp9CgojIE1hdGNoIGlucHV0IHdpdGggb25lIG9mIHRoZSBwb2xpY3kgdmFyaWFibGVzLCBhZnRlciBzdWJzdGl0dXRpbmcgJChzYW5kYm94LW5hbWVzcGFjZSkuCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHNvbWUgcF92YXIgaW4gcF9wcm9jZXNzLkVudgogICAgcF92YXIyIDo9IHJlcGxhY2UocF92YXIsICIkKHNhbmRib3gtbmFtZXNwYWNlKSIsIHNfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd192YXIgODogcF92YXIyID0iLCBwX3ZhcjIpCiAgICBwX3ZhcjIgPT0gaV92YXIKCiAgICBwcmludCgiYWxsb3dfdmFyIDg6IHRydWUiKQp9CgphbGxvd19wb2RfaXBfdmFyKHZhcl9uYW1lLCBwX3ZhcikgewogICAgcHJpbnQoImFsbG93X3BvZF9pcF92YXI6IHZhcl9uYW1lID0iLCB2YXJfbmFtZSwgInBfdmFyID0iLCBwX3ZhcikKCiAgICBwX25hbWVfdmFsdWUgOj0gc3BsaXQocF92YXIsICI9IikKICAgIGNvdW50KHBfbmFtZV92YWx1ZSkgPT0gMgoKICAgIHBfbmFtZV92YWx1ZVswXSA9PSB2YXJfbmFtZQogICAgcF9uYW1lX3ZhbHVlWzFdID09ICIkKHBvZC1pcCkiCgogICAgcHJpbnQoImFsbG93X3BvZF9pcF92YXI6IHRydWUiKQp9CgphbGxvd19ob3N0X2lwX3Zhcih2YXJfbmFtZSwgcF92YXIpIHsKICAgIHByaW50KCJhbGxvd19ob3N0X2lwX3ZhcjogdmFyX25hbWUgPSIsIHZhcl9uYW1lLCAicF92YXIgPSIsIHBfdmFyKQoKICAgIHBfbmFtZV92YWx1ZSA6PSBzcGxpdChwX3ZhciwgIj0iKQogICAgY291bnQocF9uYW1lX3ZhbHVlKSA9PSAyCgogICAgcF9uYW1lX3ZhbHVlWzBdID09IHZhcl9uYW1lCiAgICBwX25hbWVfdmFsdWVbMV0gPT0gIiQoaG9zdC1pcCkiCgogICAgcHJpbnQoImFsbG93X2hvc3RfaXBfdmFyOiB0cnVlIikKfQoKaXNfaXAodmFsdWUpIHsKICAgIGJ5dGVzID0gc3BsaXQodmFsdWUsICIuIikKICAgIGNvdW50KGJ5dGVzKSA9PSA0CgogICAgaXNfaXBfZmlyc3RfYnl0ZShieXRlc1swXSkKICAgIGlzX2lwX290aGVyX2J5dGUoYnl0ZXNbMV0pCiAgICBpc19pcF9vdGhlcl9ieXRlKGJ5dGVzWzJdKQogICAgaXNfaXBfb3RoZXJfYnl0ZShieXRlc1szXSkKfQppc19pcF9maXJzdF9ieXRlKGNvbXBvbmVudCkgewogICAgbnVtYmVyID0gdG9fbnVtYmVyKGNvbXBvbmVudCkKICAgIG51bWJlciA+PSAxCiAgICBudW1iZXIgPD0gMjU1Cn0KaXNfaXBfb3RoZXJfYnl0ZShjb21wb25lbnQpIHsKICAgIG51bWJlciA9IHRvX251bWJlcihjb21wb25lbnQpCiAgICBudW1iZXIgPj0gMAogICAgbnVtYmVyIDw9IDI1NQp9CgojIE9DSSByb290LlBhdGgKYWxsb3dfcm9vdF9wYXRoKHBfb2NpLCBpX29jaSwgYnVuZGxlX2lkKSB7CiAgICBpX3BhdGggOj0gaV9vY2kuUm9vdC5QYXRoCiAgICBwX3BhdGgxIDo9IHBfb2NpLlJvb3QuUGF0aAogICAgcHJpbnQoImFsbG93X3Jvb3RfcGF0aDogaV9wYXRoID0iLCBpX3BhdGgsICJwX3BhdGgxID0iLCBwX3BhdGgxKQoKICAgIHBfcGF0aDIgOj0gcmVwbGFjZShwX3BhdGgxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfcm9vdF9wYXRoOiBwX3BhdGgyID0iLCBwX3BhdGgyKQoKICAgIHBfcGF0aDMgOj0gcmVwbGFjZShwX3BhdGgyLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X3Jvb3RfcGF0aDogcF9wYXRoMyA9IiwgcF9wYXRoMykKCiAgICBwX3BhdGgzID09IGlfcGF0aAoKICAgIHByaW50KCJhbGxvd19yb290X3BhdGg6IHRydWUiKQp9CgojIGRldmljZSBtb3VudHMKYWxsb3dfbW91bnQocF9vY2ksIGlfbW91bnQsIGlfc3RvcmFnZXMsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcHJpbnQoImFsbG93X21vdW50OiBpX21vdW50ID0iLCBpX21vdW50KQoKICAgIHNvbWUgcF9tb3VudCBpbiBwX29jaS5Nb3VudHMKICAgIHNvbWUgaV9zdG9yYWdlIGluIGlfc3RvcmFnZXMKCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IHBfbW91bnQgPSIsIHBfbW91bnQpCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IGlfc3RvcmFnZSA9IiwgaV9zdG9yYWdlKQoKICAgIGNoZWNrX21vdW50KHBfbW91bnQsIGlfbW91bnQsIGlfc3RvcmFnZSwgYnVuZGxlX2lkLCBzYW5kYm94X2lkKQoKICAgICMgVE9ETzogYXJlIHRoZXJlIGFueSBvdGhlciByZXF1aXJlZCBwb2xpY3kgY2hlY2tzIGZvciBtb3VudHMgLSBlLmcuLAogICAgIyAgICAgICBtdWx0aXBsZSBtb3VudHMgd2l0aCBzYW1lIHNvdXJjZSBvciBkZXN0aW5hdGlvbj8KCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IHRydWUiKQp9CgpjaGVja19tb3VudChwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcF9tb3VudCA9PSBpX21vdW50CiAgICBwcmludCgiY2hlY2tfbW91bnQgMTogdHJ1ZSIpCn0KY2hlY2tfbW91bnQocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHBfbW91bnQuZGVzdGluYXRpb24gPT0gaV9tb3VudC5kZXN0aW5hdGlvbgogICAgcF9tb3VudC50eXBlXyA9PSBpX21vdW50LnR5cGVfCiAgICBwX21vdW50Lm9wdGlvbnMgPT0gaV9tb3VudC5vcHRpb25zCgogICAgbW91bnRfc291cmNlX2FsbG93cyhwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkKCiAgICBwcmludCgiY2hlY2tfbW91bnQgMjogdHJ1ZSIpCn0KCm1vdW50X3NvdXJjZV9hbGxvd3MocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHJlZ2V4MSA6PSBwX21vdW50LnNvdXJjZQogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5tb3VudF9zb3VyY2VfY3BhdGgpCiAgICByZWdleDQgOj0gcmVwbGFjZShyZWdleDMsICIkKGJ1bmRsZS1pZCkiLCBidW5kbGVfaWQpCgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMTogcmVnZXg0ID0iLCByZWdleDQpCiAgICByZWdleC5tYXRjaChyZWdleDQsIGlfbW91bnQuc291cmNlKQoKICAgIHByaW50KCJtb3VudF9zb3VyY2VfYWxsb3dzIDE6IHRydWUiKQp9Cm1vdW50X3NvdXJjZV9hbGxvd3MocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHJlZ2V4MSA6PSBwX21vdW50LnNvdXJjZQogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5tb3VudF9zb3VyY2VfY3BhdGgpCiAgICByZWdleDQgOj0gcmVwbGFjZShyZWdleDMsICIkKHNhbmRib3gtaWQpIiwgc2FuZGJveF9pZCkKCiAgICBwcmludCgibW91bnRfc291cmNlX2FsbG93cyAyOiByZWdleDQgPSIsIHJlZ2V4NCkKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4NCwgaV9tb3VudC5zb3VyY2UpCgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMjogdHJ1ZSIpCn0KbW91bnRfc291cmNlX2FsbG93cyhwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogaV9tb3VudC5zb3VyY2UgPSIsIGlfbW91bnQuc291cmNlKQogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogaV9zdG9yYWdlLm1vdW50X3BvaW50ID0iLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCgogICAgaV9tb3VudC5zb3VyY2UgPT0gaV9zdG9yYWdlLm1vdW50X3BvaW50CgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogdHJ1ZSIpCn0KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBDcmVhdGUgY29udGFpbmVyIFN0b3JhZ2VzCgphbGxvd19zdG9yYWdlcyhwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHBfY291bnQgOj0gY291bnQocF9zdG9yYWdlcykKICAgIGlfY291bnQgOj0gY291bnQoaV9zdG9yYWdlcykKICAgIHByaW50KCJhbGxvd19zdG9yYWdlczogcF9jb3VudCA9IiwgcF9jb3VudCwgImlfY291bnQgPSIsIGlfY291bnQpCgogICAgcF9jb3VudCA9PSBpX2NvdW50CgogICAgIyBHZXQgdGhlIGNvbnRhaW5lciBpbWFnZSBsYXllciBJRHMgYW5kIHZlcml0eSByb290IGhhc2hlcywgZnJvbSB0aGUgIm92ZXJsYXlmcyIgc3RvcmFnZS4KICAgIHNvbWUgb3ZlcmxheV9zdG9yYWdlIGluIHBfc3RvcmFnZXMKICAgIG92ZXJsYXlfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIHByaW50KCJhbGxvd19zdG9yYWdlczogb3ZlcmxheV9zdG9yYWdlID0iLCBvdmVybGF5X3N0b3JhZ2UpCiAgICBjb3VudChvdmVybGF5X3N0b3JhZ2Uub3B0aW9ucykgPT0gMgoKICAgIGxheWVyX2lkcyA6PSBzcGxpdChvdmVybGF5X3N0b3JhZ2Uub3B0aW9uc1swXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiBsYXllcl9pZHMgPSIsIGxheWVyX2lkcykKCiAgICByb290X2hhc2hlcyA6PSBzcGxpdChvdmVybGF5X3N0b3JhZ2Uub3B0aW9uc1sxXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiByb290X2hhc2hlcyA9Iiwgcm9vdF9oYXNoZXMpCgogICAgZXZlcnkgaV9zdG9yYWdlIGluIGlfc3RvcmFnZXMgewogICAgICAgIGFsbG93X3N0b3JhZ2UocF9zdG9yYWdlcywgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpCiAgICB9CgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiB0cnVlIikKfQoKYWxsb3dfc3RvcmFnZShwX3N0b3JhZ2VzLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgc29tZSBwX3N0b3JhZ2UgaW4gcF9zdG9yYWdlcwoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiBwX3N0b3JhZ2UgPSIsIHBfc3RvcmFnZSkKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiBpX3N0b3JhZ2UgPSIsIGlfc3RvcmFnZSkKCiAgICBwX3N0b3JhZ2UuZHJpdmVyICAgICAgICAgICA9PSBpX3N0b3JhZ2UuZHJpdmVyCiAgICBwX3N0b3JhZ2UuZHJpdmVyX29wdGlvbnMgICA9PSBpX3N0b3JhZ2UuZHJpdmVyX29wdGlvbnMKICAgIHBfc3RvcmFnZS5mc19ncm91cCAgICAgICAgID09IGlfc3RvcmFnZS5mc19ncm91cAogICAgcF9zdG9yYWdlLmZzdHlwZSAgICAgICAgICAgPT0gaV9zdG9yYWdlLmZzdHlwZQoKICAgIGFsbG93X3N0b3JhZ2Vfc291cmNlKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKQogICAgYWxsb3dfc3RvcmFnZV9vcHRpb25zKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKQogICAgYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKQoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiB0cnVlIikKfQoKYWxsb3dfc3RvcmFnZV9zb3VyY2UocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX3NvdXJjZSAxOiBzdGFydCIpCgogICAgcF9zdG9yYWdlLnNvdXJjZSA9PSBpX3N0b3JhZ2Uuc291cmNlCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDE6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX3NvdXJjZShwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDI6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCgogICAgIyBEREREOkJCOkRELkY6IERvbWFpbjpCdXM6RGV2aWNlLkZ1bmN0aW9uCiAgICAjIGh0dHBzOi8vd3d3Lmtlcm5lbC5vcmcvZG9jL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtYnVzLXBjaQogICAgcmVnZXgubWF0Y2goYF5bYS1mMC05XXs0fTpbYS1mMC05XXsyfTpbYS1mMC05XXsyfVwuW2EtZjAtOV0kYCwgaV9zdG9yYWdlLnNvdXJjZSkKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9zb3VyY2UgMjogdHJ1ZSIpCn0KCmFsbG93X3N0b3JhZ2Vfc291cmNlKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKSB7CiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9zb3VyY2UgMzogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIGlfc3RvcmFnZS5zb3VyY2UgPT0gIm5vbmUiCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDM6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX3NvdXJjZShwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDQ6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJzbWIiCgogICAgIyBQYXR0ZXJuOiAvLzxzdG9yYWdlLWFjY291bnQtbmFtZT4uZmlsZS5jb3JlLndpbmRvd3MubmV0LzxrOHMtUFZDLW5hbWU+CiAgICAjIFN0b3JhZ2UgYWNjb3VudCBuYW1lOiBodHRwczovL2xlYXJuLm1pY3Jvc29mdC5jb20vZW4tdXMvYXp1cmUvc3RvcmFnZS9jb21tb24vc3RvcmFnZS1hY2NvdW50LW92ZXJ2aWV3I3N0b3JhZ2UtYWNjb3VudC1uYW1lCiAgICAjIEs4cyBQVkMgbmFtZTogaHR0cHM6Ly9rdWJlcm5ldGVzLmlvL2RvY3MvY29uY2VwdHMvb3ZlcnZpZXcvd29ya2luZy13aXRoLW9iamVjdHMvbmFtZXMvI2Rucy1zdWJkb21haW4tbmFtZXMKICAgIHJlZ2V4Lm1hdGNoKGBeXC9cLyhbYS16MC05XXszLDI0fSlcLmZpbGVcLmNvcmVcLndpbmRvd3NcLm5ldFwvW2EtejAtOV0oW2EtejAtOS4tXXswLDI1MX1bYS16MC05XSk/JGAsIGlfc3RvcmFnZS5zb3VyY2UpCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDQ6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMTogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgIT0gIm92ZXJsYXlmcyIKICAgIHBfc3RvcmFnZS5vcHRpb25zID09IGlfc3RvcmFnZS5vcHRpb25zCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAxOiB0cnVlIikKfQphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIGNvdW50KHBfc3RvcmFnZS5vcHRpb25zKSA9PSAyCgogICAgcG9saWN5X2lkcyA6PSBzcGxpdChwX3N0b3JhZ2Uub3B0aW9uc1swXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBwb2xpY3lfaWRzID0iLCBwb2xpY3lfaWRzKQogICAgcG9saWN5X2lkcyA9PSBsYXllcl9pZHMKCiAgICBwb2xpY3lfaGFzaGVzIDo9IHNwbGl0KHBfc3RvcmFnZS5vcHRpb25zWzFdLCAiOiIpCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IHBvbGljeV9oYXNoZXMgPSIsIHBvbGljeV9oYXNoZXMpCgogICAgcF9jb3VudCA6PSBjb3VudChwb2xpY3lfaWRzKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBwX2NvdW50ID0iLCBwX2NvdW50KQogICAgcF9jb3VudCA+PSAxCiAgICBwX2NvdW50ID09IGNvdW50KHBvbGljeV9oYXNoZXMpCgogICAgaV9jb3VudCA6PSBjb3VudChpX3N0b3JhZ2Uub3B0aW9ucykKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogaV9jb3VudCA9IiwgaV9jb3VudCkKICAgIGlfY291bnQgPT0gcF9jb3VudCArIDMKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zWzBdID0iLCBpX3N0b3JhZ2Uub3B0aW9uc1swXSkKICAgIGlfc3RvcmFnZS5vcHRpb25zWzBdID09ICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQubGF5ZXItc3JjLXByZWZpeD0vdmFyL2xpYi9jb250YWluZXJkL2lvLmNvbnRhaW5lcmQuc25hcHNob3R0ZXIudjEudGFyZGV2L2xheWVycyIKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zW2lfY291bnQgLSAyXSA9IiwgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDJdKQogICAgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDJdID09ICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQub3ZlcmxheS1ydyIKCiAgICBsb3dlcmRpciA6PSBjb25jYXQoIj0iLCBbImxvd2VyZGlyIiwgcF9zdG9yYWdlLm9wdGlvbnNbMF1dKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBsb3dlcmRpciA9IiwgbG93ZXJkaXIpCgogICAgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDFdID09IGxvd2VyZGlyCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zW2lfY291bnQgLSAxXSA9IiwgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDFdKQoKICAgIGV2ZXJ5IGksIHBvbGljeV9pZCBpbiBwb2xpY3lfaWRzIHsKICAgICAgICBhbGxvd19vdmVybGF5X2xheWVyKHBvbGljeV9pZCwgcG9saWN5X2hhc2hlc1tpXSwgaV9zdG9yYWdlLm9wdGlvbnNbaSArIDFdKQogICAgfQoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogdHJ1ZSIpCn0KYWxsb3dfc3RvcmFnZV9vcHRpb25zKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKSB7CiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDM6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCiAgICBjb3VudChwX3N0b3JhZ2Uub3B0aW9ucykgPT0gMQoKICAgIHN0YXJ0c3dpdGgocF9zdG9yYWdlLm9wdGlvbnNbMF0sICIkKGhhc2giKQogICAgaGFzaF9zdWZmaXggOj0gdHJpbV9sZWZ0KHBfc3RvcmFnZS5vcHRpb25zWzBdLCAiJChoYXNoIikKCiAgICBlbmRzd2l0aChoYXNoX3N1ZmZpeCwgIikiKQogICAgaGFzaF9pbmRleCA6PSB0cmltX3JpZ2h0KGhhc2hfc3VmZml4LCAiKSIpCiAgICBpIDo9IHRvX251bWJlcihoYXNoX2luZGV4KQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAzOiBpID0iLCBpKQoKICAgIGhhc2hfb3B0aW9uIDo9IGNvbmNhdCgiPSIsIFsiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LnJvb3QtaGFzaCIsIHJvb3RfaGFzaGVzW2ldXSkKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMzogaGFzaF9vcHRpb24gPSIsIGhhc2hfb3B0aW9uKQoKICAgIGNvdW50KGlfc3RvcmFnZS5vcHRpb25zKSA9PSA0CiAgICBpX3N0b3JhZ2Uub3B0aW9uc1swXSA9PSAicm8iCiAgICBpX3N0b3JhZ2Uub3B0aW9uc1sxXSA9PSAiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmJsb2NrX2RldmljZT1maWxlIgogICAgaV9zdG9yYWdlLm9wdGlvbnNbMl0gPT0gImlvLmthdGFjb250YWluZXJzLmZzLW9wdC5pcy1sYXllciIKICAgIGlfc3RvcmFnZS5vcHRpb25zWzNdID09IGhhc2hfb3B0aW9uCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAzOiB0cnVlIikKfQphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgNDogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gInNtYiIKICAgIHBfb3B0c19jb3VudCA6PSBjb3VudChwX3N0b3JhZ2Uub3B0aW9ucykKICAgIGlfb3B0c19jb3VudCA6PSBjb3VudChpX3N0b3JhZ2Uub3B0aW9ucykKICAgIGlfb3B0c19jb3VudCA9PSBwX29wdHNfY291bnQgKyAyCgogICAgaV9vcHRfbWF0Y2hlcyA6PSBbaSB8IGkgOj0gaWR4OyBpZHggPCBwX29wdHNfY291bnQ7IHBfc3RvcmFnZS5vcHRpb25zW2lkeF0gPT0gaV9zdG9yYWdlLm9wdGlvbnNbaWR4XV0KICAgIGNvdW50KGlfb3B0X21hdGNoZXMpID09IHBfb3B0c19jb3VudAoKICAgIHN0YXJ0c3dpdGgoaV9zdG9yYWdlLm9wdGlvbnNbaV9vcHRzX2NvdW50LTJdLCAiYWRkcj0iKQogICAgY3JlZHMgPSBzcGxpdChpX3N0b3JhZ2Uub3B0aW9uc1tpX29wdHNfY291bnQtMV0sICIsIikKICAgIGNvdW50KGNyZWRzKSA9PSAyCiAgICBzdGFydHN3aXRoKGNyZWRzWzBdLCAidXNlcm5hbWU9IikKICAgIHN0YXJ0c3dpdGgoY3JlZHNbMV0sICJwYXNzd29yZD0iKQogICAgCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDQ6IHRydWUiKQp9CgphbGxvd19vdmVybGF5X2xheWVyKHBvbGljeV9pZCwgcG9saWN5X2hhc2gsIGlfb3B0aW9uKSB7CiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogcG9saWN5X2lkID0iLCBwb2xpY3lfaWQsICJwb2xpY3lfaGFzaCA9IiwgcG9saWN5X2hhc2gpCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogaV9vcHRpb24gPSIsIGlfb3B0aW9uKQoKICAgIHN0YXJ0c3dpdGgoaV9vcHRpb24sICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQubGF5ZXI9IikKICAgIGlfdmFsdWUgOj0gcmVwbGFjZShpX29wdGlvbiwgImlvLmthdGFjb250YWluZXJzLmZzLW9wdC5sYXllcj0iLCAiIikKICAgIGlfdmFsdWVfZGVjb2RlZCA6PSBiYXNlNjQuZGVjb2RlKGlfdmFsdWUpCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogaV92YWx1ZV9kZWNvZGVkID0iLCBpX3ZhbHVlX2RlY29kZWQpCgogICAgcG9saWN5X3N1ZmZpeCA6PSBjb25jYXQoIj0iLCBbInRhcixybyxpby5rYXRhY29udGFpbmVycy5mcy1vcHQuYmxvY2tfZGV2aWNlPWZpbGUsaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmlzLWxheWVyLGlvLmthdGFjb250YWluZXJzLmZzLW9wdC5yb290LWhhc2giLCBwb2xpY3lfaGFzaF0pCiAgICBwX3ZhbHVlIDo9IGNvbmNhdCgiLCIsIFtwb2xpY3lfaWQsIHBvbGljeV9zdWZmaXhdKQogICAgcHJpbnQoImFsbG93X292ZXJsYXlfbGF5ZXI6IHBfdmFsdWUgPSIsIHBfdmFsdWUpCgogICAgcF92YWx1ZSA9PSBpX3ZhbHVlX2RlY29kZWQKCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogdHJ1ZSIpCn0KCmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAidGFyIgoKICAgIHN0YXJ0c3dpdGgocF9zdG9yYWdlLm1vdW50X3BvaW50LCAiJChsYXllciIpCiAgICBtb3VudF9zdWZmaXggOj0gdHJpbV9sZWZ0KHBfc3RvcmFnZS5tb3VudF9wb2ludCwgIiQobGF5ZXIiKQoKICAgIGVuZHN3aXRoKG1vdW50X3N1ZmZpeCwgIikiKQogICAgbGF5ZXJfaW5kZXggOj0gdHJpbV9yaWdodChtb3VudF9zdWZmaXgsICIpIikKICAgIGkgOj0gdG9fbnVtYmVyKGxheWVyX2luZGV4KQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDE6IGkgPSIsIGkpCgogICAgbGF5ZXJfaWQgOj0gbGF5ZXJfaWRzW2ldCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMTogbGF5ZXJfaWQgPSIsIGxheWVyX2lkKQoKICAgIHBfbW91bnQgOj0gY29uY2F0KCIvIiwgWyIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L2xheWVycyIsIGxheWVyX2lkXSkKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCAxOiBwX21vdW50ID0iLCBwX21vdW50KQoKICAgIHBfbW91bnQgPT0gaV9zdG9yYWdlLm1vdW50X3BvaW50CgogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDE6IHRydWUiKQp9CmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAiZnVzZTMua2F0YS1vdmVybGF5IgoKICAgIG1vdW50MSA6PSByZXBsYWNlKHBfc3RvcmFnZS5tb3VudF9wb2ludCwgIiQoY3BhdGgpIiwgcG9saWN5X2RhdGEuY29tbW9uLmNwYXRoKQogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDI6IG1vdW50MiA9IiwgbW91bnQyKQoKICAgIG1vdW50MiA9PSBpX3N0b3JhZ2UubW91bnRfcG9pbnQKCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMjogdHJ1ZSIpCn0KYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKSB7CiAgICBwX3N0b3JhZ2UuZnN0eXBlID09ICJsb2NhbCIKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQyID0iLCBtb3VudDIpCgogICAgbW91bnQzIDo9IHJlcGxhY2UobW91bnQyLCAiJChzYW5kYm94LWlkKSIsIHNhbmRib3hfaWQpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQzID0iLCBtb3VudDMpCgogICAgcmVnZXgubWF0Y2gobW91bnQzLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCgogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDM6IHRydWUiKQp9CmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAiYmluZCIKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNDogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNDogbW91bnQyID0iLCBtb3VudDIpCgogICAgbW91bnQzIDo9IHJlcGxhY2UobW91bnQyLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDQ6IG1vdW50MyA9IiwgbW91bnQzKQoKICAgIHJlZ2V4Lm1hdGNoKG1vdW50MywgaV9zdG9yYWdlLm1vdW50X3BvaW50KQoKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA0OiB0cnVlIikKfQphbGxvd19tb3VudF9wb2ludChwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgYnVuZGxlX2lkLCBzYW5kYm94X2lkLCBsYXllcl9pZHMpIHsKICAgIHBfc3RvcmFnZS5mc3R5cGUgPT0gInRtcGZzIgoKICAgIG1vdW50MSA6PSBwX3N0b3JhZ2UubW91bnRfcG9pbnQKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA1OiBtb3VudDEgPSIsIG1vdW50MSkKCiAgICByZWdleC5tYXRjaChtb3VudDEsIGlfc3RvcmFnZS5tb3VudF9wb2ludCkKCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNTogdHJ1ZSIpCn0KYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKSB7CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogaV9zdG9yYWdlLm1vdW50X3BvaW50ID0iLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCiAgICBhbGxvd19kaXJlY3Rfdm9sX2RyaXZlcihwX3N0b3JhZ2UsIGlfc3RvcmFnZSkKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChzcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQyID0iLCBtb3VudDIpCgogICAgZGlyZWN0X3ZvbF9wYXRoIDo9IGlfc3RvcmFnZS5zb3VyY2UKICAgIG1vdW50MyA6PSByZXBsYWNlKG1vdW50MiwgIiQoYjY0LWRpcmVjdC12b2wtcGF0aCkiLCBiYXNlNjR1cmwuZW5jb2RlKGRpcmVjdF92b2xfcGF0aCkpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQzID0iLCBtb3VudDMpCgogICAgbW91bnQzID09IGlfc3RvcmFnZS5tb3VudF9wb2ludAoKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA2OiB0cnVlIikKfQoKYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIocF9zdG9yYWdlLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19kaXJlY3Rfdm9sX2RyaXZlciAxOiBzdGFydCIpCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCiAgICBwcmludCgiYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIgMTogdHJ1ZSIpCn0KYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIocF9zdG9yYWdlLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19kaXJlY3Rfdm9sX2RyaXZlciAyOiBzdGFydCIpCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJzbWIiCiAgICBwcmludCgiYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIgMjogdHJ1ZSIpCn0KCiMgRXhlY1Byb2Nlc3NSZXF1ZXN0LnByb2Nlc3MuQ2FwYWJpbGl0aWVzCmFsbG93X2V4ZWNfY2FwcyhpX2NhcHMpIHsKICAgIG5vdCBpX2NhcHMuQW1iaWVudAogICAgbm90IGlfY2Fwcy5Cb3VuZGluZwogICAgbm90IGlfY2Fwcy5FZmZlY3RpdmUKICAgIG5vdCBpX2NhcHMuSW5oZXJpdGFibGUKICAgIG5vdCBpX2NhcHMuUGVybWl0dGVkCn0KCiMgT0NJLlByb2Nlc3MuQ2FwYWJpbGl0aWVzCmFsbG93X2NhcHMocF9jYXBzLCBpX2NhcHMpIHsKICAgIHByaW50KCJhbGxvd19jYXBzOiBwb2xpY3kgQW1iaWVudCA9IiwgcF9jYXBzLkFtYmllbnQpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgQW1iaWVudCA9IiwgaV9jYXBzLkFtYmllbnQpCiAgICBtYXRjaF9jYXBzKHBfY2Fwcy5BbWJpZW50LCBpX2NhcHMuQW1iaWVudCkKCiAgICBwcmludCgiYWxsb3dfY2FwczogcG9saWN5IEJvdW5kaW5nID0iLCBwX2NhcHMuQm91bmRpbmcpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgQm91bmRpbmcgPSIsIGlfY2Fwcy5Cb3VuZGluZykKICAgIG1hdGNoX2NhcHMocF9jYXBzLkJvdW5kaW5nLCBpX2NhcHMuQm91bmRpbmcpCgogICAgcHJpbnQoImFsbG93X2NhcHM6IHBvbGljeSBFZmZlY3RpdmUgPSIsIHBfY2Fwcy5FZmZlY3RpdmUpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgRWZmZWN0aXZlID0iLCBpX2NhcHMuRWZmZWN0aXZlKQogICAgbWF0Y2hfY2FwcyhwX2NhcHMuRWZmZWN0aXZlLCBpX2NhcHMuRWZmZWN0aXZlKQoKICAgIHByaW50KCJhbGxvd19jYXBzOiBwb2xpY3kgSW5oZXJpdGFibGUgPSIsIHBfY2Fwcy5Jbmhlcml0YWJsZSkKICAgIHByaW50KCJhbGxvd19jYXBzOiBpbnB1dCBJbmhlcml0YWJsZSA9IiwgaV9jYXBzLkluaGVyaXRhYmxlKQogICAgbWF0Y2hfY2FwcyhwX2NhcHMuSW5oZXJpdGFibGUsIGlfY2Fwcy5Jbmhlcml0YWJsZSkKCiAgICBwcmludCgiYWxsb3dfY2FwczogcG9saWN5IFBlcm1pdHRlZCA9IiwgcF9jYXBzLlBlcm1pdHRlZCkKICAgIHByaW50KCJhbGxvd19jYXBzOiBpbnB1dCBQZXJtaXR0ZWQgPSIsIGlfY2Fwcy5QZXJtaXR0ZWQpCiAgICBtYXRjaF9jYXBzKHBfY2Fwcy5QZXJtaXR0ZWQsIGlfY2Fwcy5QZXJtaXR0ZWQpCn0KCm1hdGNoX2NhcHMocF9jYXBzLCBpX2NhcHMpIHsKICAgIHByaW50KCJtYXRjaF9jYXBzIDE6IHN0YXJ0IikKCiAgICBwX2NhcHMgPT0gaV9jYXBzCgogICAgcHJpbnQoIm1hdGNoX2NhcHMgMTogdHJ1ZSIpCn0KbWF0Y2hfY2FwcyhwX2NhcHMsIGlfY2FwcykgewogICAgcHJpbnQoIm1hdGNoX2NhcHMgMjogc3RhcnQiKQoKICAgIGNvdW50KHBfY2FwcykgPT0gMQogICAgcF9jYXBzWzBdID09ICIkKGRlZmF1bHRfY2FwcykiCgogICAgcHJpbnQoIm1hdGNoX2NhcHMgMjogZGVmYXVsdF9jYXBzID0iLCBwb2xpY3lfZGF0YS5jb21tb24uZGVmYXVsdF9jYXBzKQogICAgcG9saWN5X2RhdGEuY29tbW9uLmRlZmF1bHRfY2FwcyA9PSBpX2NhcHMKCiAgICBwcmludCgibWF0Y2hfY2FwcyAyOiB0cnVlIikKfQptYXRjaF9jYXBzKHBfY2FwcywgaV9jYXBzKSB7CiAgICBwcmludCgibWF0Y2hfY2FwcyAzOiBzdGFydCIpCgogICAgY291bnQocF9jYXBzKSA9PSAxCiAgICBwX2NhcHNbMF0gPT0gIiQocHJpdmlsZWdlZF9jYXBzKSIKCiAgICBwcmludCgibWF0Y2hfY2FwcyAzOiBwcml2aWxlZ2VkX2NhcHMgPSIsIHBvbGljeV9kYXRhLmNvbW1vbi5wcml2aWxlZ2VkX2NhcHMpCiAgICBwb2xpY3lfZGF0YS5jb21tb24ucHJpdmlsZWdlZF9jYXBzID09IGlfY2FwcwoKICAgIHByaW50KCJtYXRjaF9jYXBzIDM6IHRydWUiKQp9CgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgpjaGVja19kaXJlY3RvcnlfdHJhdmVyc2FsKGlfcGF0aCkgewogICAgbm90IHJlZ2V4Lm1hdGNoKCIoXnwvKS4uKCR8LykiLCBpX3BhdGgpCn0KCmNoZWNrX3N5bWxpbmtfc291cmNlKGlfc3JjKSB7CiAgICBpX3NyYyA9PSAiIgogICAgcHJpbnQoImNoZWNrX3N5bWxpbmtfc291cmNlIDE6IHRydWUiKQp9CmNoZWNrX3N5bWxpbmtfc291cmNlKGlfc3JjKSB7CiAgICBpX3NyYyAhPSAiIgogICAgcHJpbnQoImNoZWNrX3N5bWxpbmtfc291cmNlIDI6IGlfc3JjID0iLCBpX3NyYykKCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24uc19zb3VyY2UxLCBpX3NyYykKCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMjogdHJ1ZSIpCn0KY2hlY2tfc3ltbGlua19zb3VyY2UoaV9zcmMpIHsKICAgIGlfc3JjICE9ICIiCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMzogaV9zcmMgPSIsIGlfc3JjKQoKICAgIHJlZ2V4Lm1hdGNoKHBvbGljeV9kYXRhLmNvbW1vbi5zX3NvdXJjZTIsIGlfc3JjKQogICAgY2hlY2tfZGlyZWN0b3J5X3RyYXZlcnNhbChpX3NyYykKCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMzogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfc3RvcmFnZXMoaV9zdG9yYWdlcykgewogICAgcHJpbnQoImFsbG93X3NhbmRib3hfc3RvcmFnZXM6IGlfc3RvcmFnZXMgPSIsIGlfc3RvcmFnZXMpCgogICAgcF9zdG9yYWdlcyA6PSBwb2xpY3lfZGF0YS5zYW5kYm94LnN0b3JhZ2VzCiAgICBldmVyeSBpX3N0b3JhZ2UgaW4gaV9zdG9yYWdlcyB7CiAgICAgICAgYWxsb3dfc2FuZGJveF9zdG9yYWdlKHBfc3RvcmFnZXMsIGlfc3RvcmFnZSkKICAgIH0KCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9zdG9yYWdlczogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfc3RvcmFnZShwX3N0b3JhZ2VzLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IGlfc3RvcmFnZSA9IiwgaV9zdG9yYWdlKQoKICAgIHNvbWUgcF9zdG9yYWdlIGluIHBfc3RvcmFnZXMKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IHBfc3RvcmFnZSA9IiwgcF9zdG9yYWdlKQogICAgaV9zdG9yYWdlID09IHBfc3RvcmFnZQoKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IHRydWUiKQp9CgpDb3B5RmlsZVJlcXVlc3QgewogICAgcHJpbnQoIkNvcHlGaWxlUmVxdWVzdDogaW5wdXQucGF0aCA9IiwgaW5wdXQucGF0aCkKCiAgICBjaGVja19zeW1saW5rX3NvdXJjZShpbnB1dC5zeW1saW5rX3NyYykKICAgIGNoZWNrX2RpcmVjdG9yeV90cmF2ZXJzYWwoaW5wdXQucGF0aCkKCiAgICBzb21lIHJlZ2V4MSBpbiBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLkNvcHlGaWxlUmVxdWVzdAogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5jcGF0aCkKICAgIHJlZ2V4NCA6PSByZXBsYWNlKHJlZ2V4MywgIiQoYnVuZGxlLWlkKSIsIEJVTkRMRV9JRCkKICAgIHByaW50KCJDb3B5RmlsZVJlcXVlc3Q6IHJlZ2V4NCA9IiwgcmVnZXg0KQoKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4NCwgaW5wdXQucGF0aCkKCiAgICBwcmludCgiQ29weUZpbGVSZXF1ZXN0OiB0cnVlIikKfQoKQ3JlYXRlU2FuZGJveFJlcXVlc3QgewogICAgcHJpbnQoIkNyZWF0ZVNhbmRib3hSZXF1ZXN0OiBpbnB1dC5ndWVzdF9ob29rX3BhdGggPSIsIGlucHV0Lmd1ZXN0X2hvb2tfcGF0aCkKICAgIGNvdW50KGlucHV0Lmd1ZXN0X2hvb2tfcGF0aCkgPT0gMAoKICAgIHByaW50KCJDcmVhdGVTYW5kYm94UmVxdWVzdDogaW5wdXQua2VybmVsX21vZHVsZXMgPSIsIGlucHV0Lmtlcm5lbF9tb2R1bGVzKQogICAgY291bnQoaW5wdXQua2VybmVsX21vZHVsZXMpID09IDAKCiAgICBpX3BpZG5zIDo9IGlucHV0LnNhbmRib3hfcGlkbnMKICAgIHByaW50KCJDcmVhdGVTYW5kYm94UmVxdWVzdDogaV9waWRucyA9IiwgaV9waWRucykKICAgIGlfcGlkbnMgPT0gZmFsc2UKICAgIGFsbG93X3NhbmRib3hfc3RvcmFnZXMoaW5wdXQuc3RvcmFnZXMpCn0KCmFsbG93X2V4ZWMocF9jb250YWluZXIsIGlfcHJvY2VzcykgewogICAgcHJpbnQoImFsbG93X2V4ZWM6IHN0YXJ0IikKCiAgICBwX29jaSA9IHBfY29udGFpbmVyLk9DSQogICAgcF9zX25hbWUgPSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc19uYW1lc3BhY2UgPSBnZXRfc3RhdGVfdmFsKCJuYW1lc3BhY2UiKQogICAgYWxsb3dfcHJvYmVfcHJvY2VzcyhwX29jaS5Qcm9jZXNzLCBpX3Byb2Nlc3MsIHBfc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfZXhlYzogdHJ1ZSIpCn0KCmFsbG93X2ludGVyYWN0aXZlX2V4ZWMocF9jb250YWluZXIsIGlfcHJvY2VzcykgewogICAgcHJpbnQoImFsbG93X2ludGVyYWN0aXZlX2V4ZWM6IHN0YXJ0IikKCiAgICBwX29jaSA9IHBfY29udGFpbmVyLk9DSQogICAgcF9zX25hbWUgPSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc19uYW1lc3BhY2UgPSBnZXRfc3RhdGVfdmFsKCJuYW1lc3BhY2UiKQogICAgYWxsb3dfaW50ZXJhY3RpdmVfcHJvY2VzcyhwX29jaS5Qcm9jZXNzLCBpX3Byb2Nlc3MsIHBfc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfaW50ZXJhY3RpdmVfZXhlYzogdHJ1ZSIpCn0KCiMgVE9ETzogc2hvdWxkIG90aGVyIEV4ZWNQcm9jZXNzUmVxdWVzdCBpbnB1dCBkYXRhIGZpZWxkcyBiZSB2YWxpZGF0ZWQgYXMgd2VsbD8KRXhlY1Byb2Nlc3NSZXF1ZXN0IHsKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMTogaW5wdXQgPSIsIGlucHV0KQoKICAgIHNvbWUgcF9jb21tYW5kIGluIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuRXhlY1Byb2Nlc3NSZXF1ZXN0LmFsbG93ZWRfY29tbWFuZHMKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMTogcF9jb21tYW5kID0iLCBwX2NvbW1hbmQpCiAgICBwX2NvbW1hbmQgPT0gaW5wdXQucHJvY2Vzcy5BcmdzCgogICAgIyBUT0RPOiBtYXRjaCBwX2NvbnRhaW5lcidzIElEIHdpdGggdGhlIGlucHV0IGNvbnRhaW5lcl9pZC4KICAgIHNvbWUgcF9jb250YWluZXIgaW4gcG9saWN5X2RhdGEuY29udGFpbmVycwogICAgYWxsb3dfaW50ZXJhY3RpdmVfZXhlYyhwX2NvbnRhaW5lciwgaW5wdXQucHJvY2VzcykKCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDE6IHRydWUiKQp9CkV4ZWNQcm9jZXNzUmVxdWVzdCB7CiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDI6IGlucHV0ID0iLCBpbnB1dCkKCiAgICAjIFRPRE86IG1hdGNoIGlucHV0IGNvbnRhaW5lciBJRCB3aXRoIGl0cyBjb3JyZXNwb25kaW5nIGNvbnRhaW5lci5leGVjX2NvbW1hbmRzLgogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBzb21lIHBfY29tbWFuZCBpbiBwX2NvbnRhaW5lci5leGVjX2NvbW1hbmRzCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDI6IHBfY29tbWFuZCA9IiwgcF9jb21tYW5kKQoKICAgICMgVE9ETzogc2hvdWxkIG90aGVyIGlucHV0IGRhdGEgZmllbGRzIGJlIHZhbGlkYXRlZCBhcyB3ZWxsPwogICAgcF9jb21tYW5kID09IGlucHV0LnByb2Nlc3MuQXJncwoKICAgIGFsbG93X2V4ZWMocF9jb250YWluZXIsIGlucHV0LnByb2Nlc3MpCgogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAyOiB0cnVlIikKfQpFeGVjUHJvY2Vzc1JlcXVlc3QgewogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAzOiBpbnB1dCA9IiwgaW5wdXQpCgogICAgaV9jb21tYW5kID0gY29uY2F0KCIgIiwgaW5wdXQucHJvY2Vzcy5BcmdzKQogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAzOiBpX2NvbW1hbmQgPSIsIGlfY29tbWFuZCkKCiAgICBzb21lIHBfcmVnZXggaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5FeGVjUHJvY2Vzc1JlcXVlc3QucmVnZXgKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMzogcF9yZWdleCA9IiwgcF9yZWdleCkKCiAgICByZWdleC5tYXRjaChwX3JlZ2V4LCBpX2NvbW1hbmQpCgogICAgIyBUT0RPOiBtYXRjaCBwX2NvbnRhaW5lcidzIElEIHdpdGggdGhlIGlucHV0IGNvbnRhaW5lcl9pZC4KICAgIHNvbWUgcF9jb250YWluZXIgaW4gcG9saWN5X2RhdGEuY29udGFpbmVycwogICAgYWxsb3dfaW50ZXJhY3RpdmVfZXhlYyhwX2NvbnRhaW5lciwgaW5wdXQucHJvY2VzcykKCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDM6IHRydWUiKQp9CgpVcGRhdGVSb3V0ZXNSZXF1ZXN0IHsKICAgIHByaW50KCJVcGRhdGVSb3V0ZXNSZXF1ZXN0OiBpbnB1dCA9IiwgaW5wdXQpCiAgICBwcmludCgiVXBkYXRlUm91dGVzUmVxdWVzdDogcG9saWN5ID0iLCBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLlVwZGF0ZVJvdXRlc1JlcXVlc3QpCgogICAgaV9yb3V0ZXMgOj0gaW5wdXQucm91dGVzLlJvdXRlcwogICAgcF9zb3VyY2VfcmVnZXggPSBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLlVwZGF0ZVJvdXRlc1JlcXVlc3QuZm9yYmlkZGVuX3NvdXJjZV9yZWdleAogICAgcF9uYW1lcyA9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuVXBkYXRlUm91dGVzUmVxdWVzdC5mb3JiaWRkZW5fZGV2aWNlX25hbWVzCgogICAgZXZlcnkgaV9yb3V0ZSBpbiBpX3JvdXRlcyB7CiAgICAgICAgcHJpbnQoImlfcm91dGUuc291cmNlID0iLCBpX3JvdXRlLnNvdXJjZSkKICAgICAgICBldmVyeSBwX3JlZ2V4IGluIHBfc291cmNlX3JlZ2V4IHsKICAgICAgICAgICAgcHJpbnQoInBfcmVnZXggPSIsIHBfcmVnZXgpCiAgICAgICAgICAgIG5vdCByZWdleC5tYXRjaChwX3JlZ2V4LCBpX3JvdXRlLnNvdXJjZSkKICAgICAgICB9CgogICAgICAgIHByaW50KCJpX3JvdXRlLmRldmljZSA9IiwgaV9yb3V0ZS5kZXZpY2UpCiAgICAgICAgbm90IGlfcm91dGUuZGV2aWNlIGluIHBfbmFtZXMKICAgIH0KCiAgICBwcmludCgiVXBkYXRlUm91dGVzUmVxdWVzdDogdHJ1ZSIpCn0KClVwZGF0ZUludGVyZmFjZVJlcXVlc3QgewogICAgcHJpbnQoIlVwZGF0ZUludGVyZmFjZVJlcXVlc3Q6IGlucHV0ID0iLCBpbnB1dCkKICAgIHByaW50KCJVcGRhdGVJbnRlcmZhY2VSZXF1ZXN0OiBwb2xpY3kgPSIsIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuVXBkYXRlSW50ZXJmYWNlUmVxdWVzdCkKCiAgICBpX2ludGVyZmFjZSA6PSBpbnB1dC5pbnRlcmZhY2UKICAgIHBfZmxhZ3MgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmFsbG93X3Jhd19mbGFncwoKICAgICMgVHlwaWNhbGx5LCBqdXN0IElGRl9OT0FSUCBpcyB1c2VkLgogICAgYml0cy5hbmQoaV9pbnRlcmZhY2UucmF3X2ZsYWdzLCBiaXRzLm5lZ2F0ZShwX2ZsYWdzKSkgPT0gMAoKICAgIHBfbmFtZXMgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmZvcmJpZGRlbl9uYW1lcwoKICAgIG5vdCBpX2ludGVyZmFjZS5uYW1lIGluIHBfbmFtZXMKCiAgICBwX2h3YWRkcnMgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmZvcmJpZGRlbl9od19hZGRycwoKICAgIG5vdCBpX2ludGVyZmFjZS5od0FkZHIgaW4gcF9od2FkZHJzCgogICAgcHJpbnQoIlVwZGF0ZUludGVyZmFjZVJlcXVlc3Q6IHRydWUiKQp9CgpDbG9zZVN0ZGluUmVxdWVzdCB7CiAgICBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLkNsb3NlU3RkaW5SZXF1ZXN0ID09IHRydWUKfQoKUmVhZFN0cmVhbVJlcXVlc3QgewogICAgcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5SZWFkU3RyZWFtUmVxdWVzdCA9PSB0cnVlCn0KClVwZGF0ZUVwaGVtZXJhbE1vdW50c1JlcXVlc3QgewogICAgcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVFcGhlbWVyYWxNb3VudHNSZXF1ZXN0ID09IHRydWUKfQoKV3JpdGVTdHJlYW1SZXF1ZXN0IHsKICAgIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuV3JpdGVTdHJlYW1SZXF1ZXN0ID09IHRydWUKfQoKcG9saWN5X2RhdGEgOj0gewogICJjb250YWluZXJzIjogWwogICAgewogICAgICAiT0NJIjogewogICAgICAgICJWZXJzaW9uIjogIjEuMS4wLXJjLjEiLAogICAgICAgICJQcm9jZXNzIjogewogICAgICAgICAgIlRlcm1pbmFsIjogZmFsc2UsCiAgICAgICAgICAiVXNlciI6IHsKICAgICAgICAgICAgIlVJRCI6IDY1NTM1LAogICAgICAgICAgICAiR0lEIjogNjU1MzUsCiAgICAgICAgICAgICJBZGRpdGlvbmFsR2lkcyI6IFtdLAogICAgICAgICAgICAiVXNlcm5hbWUiOiAiIgogICAgICAgICAgfSwKICAgICAgICAgICJEZXByZWNhdGVkQXJncyI6IFsKICAgICAgICAgICAgIi9wYXVzZSIKICAgICAgICAgIF0sCiAgICAgICAgICAiQXJncyI6IFsKICAgICAgICAgICAgIi9wYXVzZSIKICAgICAgICAgIF0sCiAgICAgICAgICAiRW52IjogWwogICAgICAgICAgICAiUEFUSD0vdXNyL2xvY2FsL3NiaW46L3Vzci9sb2NhbC9iaW46L3Vzci9zYmluOi91c3IvYmluOi9zYmluOi9iaW4iCiAgICAgICAgICBdLAogICAgICAgICAgIkN3ZCI6ICIvIiwKICAgICAgICAgICJDYXBhYmlsaXRpZXMiOiB7CiAgICAgICAgICAgICJBbWJpZW50IjogW10sCiAgICAgICAgICAgICJCb3VuZGluZyI6IFsKICAgICAgICAgICAgICAiJChkZWZhdWx0X2NhcHMpIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiRWZmZWN0aXZlIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJJbmhlcml0YWJsZSI6IFtdLAogICAgICAgICAgICAiUGVybWl0dGVkIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICAiTm9OZXdQcml2aWxlZ2VzIjogdHJ1ZQogICAgICAgIH0sCiAgICAgICAgIlJvb3QiOiB7CiAgICAgICAgICAiUGF0aCI6ICIkKGNwYXRoKS8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgIlJlYWRvbmx5IjogdHJ1ZQogICAgICAgIH0sCiAgICAgICAgIk1vdW50cyI6IFsKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9wcm9jIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJwcm9jIiwKICAgICAgICAgICAgInR5cGVfIjogInByb2MiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2IiwKICAgICAgICAgICAgInNvdXJjZSI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJzdHJpY3RhdGltZSIsCiAgICAgICAgICAgICAgIm1vZGU9NzU1IiwKICAgICAgICAgICAgICAic2l6ZT02NTUzNmsiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L3B0cyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiZGV2cHRzIiwKICAgICAgICAgICAgInR5cGVfIjogImRldnB0cyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJuZXdpbnN0YW5jZSIsCiAgICAgICAgICAgICAgInB0bXhtb2RlPTA2NjYiLAogICAgICAgICAgICAgICJtb2RlPTA2MjAiLAogICAgICAgICAgICAgICJnaWQ9NSIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvc2htIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L3NobSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi9tcXVldWUiLAogICAgICAgICAgICAic291cmNlIjogIm1xdWV1ZSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJtcXVldWUiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvc3lzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJzeXNmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJzeXNmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2V0Yy9yZXNvbHYuY29uZiIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClyZXNvbHYuY29uZiQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJvIiwKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9kZXYiLAogICAgICAgICAgICAgICJub2V4ZWMiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0KICAgICAgICBdLAogICAgICAgICJBbm5vdGF0aW9ucyI6IHsKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmJ1bmRsZV9wYXRoIjogIi9ydW4vY29udGFpbmVyZC9pby5jb250YWluZXJkLnJ1bnRpbWUudjIudGFzay9rOHMuaW8vJChidW5kbGUtaWQpIiwKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIjogInBvZF9zYW5kYm94IiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSI6ICJzYW5kYm94IiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWlkIjogIl5bYS16MC05XXs2NH0kIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWxvZy1kaXJlY3RvcnkiOiAiXi92YXIvbG9nL3BvZHMvJChzYW5kYm94LW5hbWVzcGFjZSlfJChzYW5kYm94LW5hbWUpX1swLTlhLWZdezh9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezEyfSQiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZSI6ICJedWJ1bnR1JCIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1uYW1lc3BhY2UiOiAiIiwKICAgICAgICAgICJuZXJkY3RsL25ldHdvcmstbmFtZXNwYWNlIjogIl4vdmFyL3J1bi9uZXRucy9jbmktWzAtOWEtZl17OH0tWzAtOWEtZl17NH0tWzAtOWEtZl17NH0tWzAtOWEtZl17NH0tWzAtOWEtZl17MTJ9JCIKICAgICAgICB9LAogICAgICAgICJMaW51eCI6IHsKICAgICAgICAgICJOYW1lc3BhY2VzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgIlR5cGUiOiAiaXBjIiwKICAgICAgICAgICAgICAiUGF0aCI6ICIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiVHlwZSI6ICJ1dHMiLAogICAgICAgICAgICAgICJQYXRoIjogIiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJUeXBlIjogIm1vdW50IiwKICAgICAgICAgICAgICAiUGF0aCI6ICIiCiAgICAgICAgICAgIH0KICAgICAgICAgIF0sCiAgICAgICAgICAiTWFza2VkUGF0aHMiOiBbCiAgICAgICAgICAgICIvcHJvYy9hY3BpIiwKICAgICAgICAgICAgIi9wcm9jL2Fzb3VuZCIsCiAgICAgICAgICAgICIvcHJvYy9rY29yZSIsCiAgICAgICAgICAgICIvcHJvYy9rZXlzIiwKICAgICAgICAgICAgIi9wcm9jL2xhdGVuY3lfc3RhdHMiLAogICAgICAgICAgICAiL3Byb2MvdGltZXJfbGlzdCIsCiAgICAgICAgICAgICIvcHJvYy90aW1lcl9zdGF0cyIsCiAgICAgICAgICAgICIvcHJvYy9zY2hlZF9kZWJ1ZyIsCiAgICAgICAgICAgICIvc3lzL2Zpcm13YXJlIiwKICAgICAgICAgICAgIi9wcm9jL3Njc2kiCiAgICAgICAgICBdLAogICAgICAgICAgIlJlYWRvbmx5UGF0aHMiOiBbCiAgICAgICAgICAgICIvcHJvYy9idXMiLAogICAgICAgICAgICAiL3Byb2MvZnMiLAogICAgICAgICAgICAiL3Byb2MvaXJxIiwKICAgICAgICAgICAgIi9wcm9jL3N5cyIsCiAgICAgICAgICAgICIvcHJvYy9zeXNycS10cmlnZ2VyIgogICAgICAgICAgXSwKICAgICAgICAgICJEZXZpY2VzIjogW10sCiAgICAgICAgICAiU3lzY3RsIjogewogICAgICAgICAgICAibmV0LmlwdjQuaXBfdW5wcml2aWxlZ2VkX3BvcnRfc3RhcnQiOiAiMCIsCiAgICAgICAgICAgICJuZXQuaXB2NC5waW5nX2dyb3VwX3JhbmdlIjogIjAgMjE0NzQ4MzY0NyIKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0sCiAgICAgICJzdG9yYWdlcyI6IFsKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoMCkiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXIwKSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogIm92ZXJsYXlmcyIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAiZnVzZTMua2F0YS1vdmVybGF5IiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiNWE1YWFkODAwNTVmZjIwMDEyYTUwZGMyNWY4ZGY3YTI5OTI0NDc0MzI0ZDY1ZjdkNTMwNmVlOGVlMjdmZjcxZCIsCiAgICAgICAgICAgICI4MTcyNTBmMWEzZTMzNmRhNzZmNWJkM2ZhNzg0ZTFiMjZkOTU5YjljMTMxODc2ODE1YmEyNjA0MDQ4YjcwYzE4IgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGNwYXRoKS8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0KICAgICAgXSwKICAgICAgImRldmljZXMiOiBbXSwKICAgICAgInNhbmRib3hfcGlkbnMiOiBmYWxzZSwKICAgICAgImV4ZWNfY29tbWFuZHMiOiBbXSwKICAgICAgImVudl9tYXAiOiB7CiAgICAgICAgIlBBVEgiOiAiL3Vzci9sb2NhbC9zYmluOi91c3IvbG9jYWwvYmluOi91c3Ivc2JpbjovdXNyL2Jpbjovc2JpbjovYmluIgogICAgICB9CiAgICB9LAogICAgewogICAgICAiT0NJIjogewogICAgICAgICJWZXJzaW9uIjogIjEuMS4wLXJjLjEiLAogICAgICAgICJQcm9jZXNzIjogewogICAgICAgICAgIlRlcm1pbmFsIjogZmFsc2UsCiAgICAgICAgICAiVXNlciI6IHsKICAgICAgICAgICAgIlVJRCI6IDAsCiAgICAgICAgICAgICJHSUQiOiAwLAogICAgICAgICAgICAiQWRkaXRpb25hbEdpZHMiOiBbXSwKICAgICAgICAgICAgIlVzZXJuYW1lIjogIiIKICAgICAgICAgIH0sCiAgICAgICAgICAiRGVwcmVjYXRlZEFyZ3MiOiBbCiAgICAgICAgICAgICIvYmluL2Jhc2giLAogICAgICAgICAgICAiLWMiLAogICAgICAgICAgICAiLS0iLAogICAgICAgICAgICAid2hpbGUgdHJ1ZTsgZWNobyBoaTsgZG8gc2xlZXAgMzA7IGRvbmU7IgogICAgICAgICAgXSwKICAgICAgICAgICJBcmdzIjogWwogICAgICAgICAgICAiL2Jpbi9iYXNoIiwKICAgICAgICAgICAgIi1jIiwKICAgICAgICAgICAgIi0tIiwKICAgICAgICAgICAgIndoaWxlIHRydWU7IGVjaG8gaGk7IGRvIHNsZWVwIDMwOyBkb25lOyIKICAgICAgICAgIF0sCiAgICAgICAgICAiRW52IjogWwogICAgICAgICAgICAiUEFUSD0vdXNyL2xvY2FsL3NiaW46L3Vzci9sb2NhbC9iaW46L3Vzci9zYmluOi91c3IvYmluOi9zYmluOi9iaW4iLAogICAgICAgICAgICAiSE9TVE5BTUU9JChob3N0LW5hbWUpIgogICAgICAgICAgXSwKICAgICAgICAgICJDd2QiOiAiLyIsCiAgICAgICAgICAiQ2FwYWJpbGl0aWVzIjogewogICAgICAgICAgICAiQW1iaWVudCI6IFtdLAogICAgICAgICAgICAiQm91bmRpbmciOiBbCiAgICAgICAgICAgICAgIiQoZGVmYXVsdF9jYXBzKSIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgIkVmZmVjdGl2ZSI6IFsKICAgICAgICAgICAgICAiJChkZWZhdWx0X2NhcHMpIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiSW5oZXJpdGFibGUiOiBbXSwKICAgICAgICAgICAgIlBlcm1pdHRlZCI6IFsKICAgICAgICAgICAgICAiJChkZWZhdWx0X2NhcHMpIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgIk5vTmV3UHJpdmlsZWdlcyI6IGZhbHNlCiAgICAgICAgfSwKICAgICAgICAiUm9vdCI6IHsKICAgICAgICAgICJQYXRoIjogIiQoY3BhdGgpLyQoYnVuZGxlLWlkKSIsCiAgICAgICAgICAiUmVhZG9ubHkiOiBmYWxzZQogICAgICAgIH0sCiAgICAgICAgIk1vdW50cyI6IFsKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9wcm9jIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJwcm9jIiwKICAgICAgICAgICAgInR5cGVfIjogInByb2MiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2IiwKICAgICAgICAgICAgInNvdXJjZSI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJzdHJpY3RhdGltZSIsCiAgICAgICAgICAgICAgIm1vZGU9NzU1IiwKICAgICAgICAgICAgICAic2l6ZT02NTUzNmsiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L3B0cyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiZGV2cHRzIiwKICAgICAgICAgICAgInR5cGVfIjogImRldnB0cyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJuZXdpbnN0YW5jZSIsCiAgICAgICAgICAgICAgInB0bXhtb2RlPTA2NjYiLAogICAgICAgICAgICAgICJtb2RlPTA2MjAiLAogICAgICAgICAgICAgICJnaWQ9NSIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvc2htIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L3NobSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi9tcXVldWUiLAogICAgICAgICAgICAic291cmNlIjogIm1xdWV1ZSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJtcXVldWUiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvc3lzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJzeXNmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJzeXNmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL3N5cy9mcy9jZ3JvdXAiLAogICAgICAgICAgICAic291cmNlIjogImNncm91cCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJjZ3JvdXAiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiLAogICAgICAgICAgICAgICJyZWxhdGltZSIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2V0Yy9ob3N0cyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClob3N0cyQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicnciCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L3Rlcm1pbmF0aW9uLWxvZyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeCl0ZXJtaW5hdGlvbi1sb2ckIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJ3IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2V0Yy9ob3N0bmFtZSIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClob3N0bmFtZSQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicnciCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZXRjL3Jlc29sdi5jb25mIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KXJlc29sdi5jb25mJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJydyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi92YXIvcnVuL3NlY3JldHMva3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudCIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClzZXJ2aWNlYWNjb3VudCQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicm8iCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvdmFyL3J1bi9zZWNyZXRzL2F6dXJlL3Rva2VucyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeCl0b2tlbnMkIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9CiAgICAgICAgXSwKICAgICAgICAiQW5ub3RhdGlvbnMiOiB7CiAgICAgICAgICAiaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5idW5kbGVfcGF0aCI6ICIvcnVuL2NvbnRhaW5lcmQvaW8uY29udGFpbmVyZC5ydW50aW1lLnYyLnRhc2svazhzLmlvLyQoYnVuZGxlLWlkKSIsCiAgICAgICAgICAiaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5jb250YWluZXJfdHlwZSI6ICJwb2RfY29udGFpbmVyIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItbmFtZSI6ICJ1YnVudHUtbWFpbiIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLXR5cGUiOiAiY29udGFpbmVyIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5pbWFnZS1uYW1lIjogIm1jci5taWNyb3NvZnQuY29tL21pcnJvci9kb2NrZXIvbGlicmFyeS91YnVudHU6MTguMDQiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtaWQiOiAiXlthLXowLTldezY0fSQiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZSI6ICJedWJ1bnR1JCIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1uYW1lc3BhY2UiOiAiIgogICAgICAgIH0sCiAgICAgICAgIkxpbnV4IjogewogICAgICAgICAgIk5hbWVzcGFjZXMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiVHlwZSI6ICJpcGMiLAogICAgICAgICAgICAgICJQYXRoIjogIiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJUeXBlIjogInV0cyIsCiAgICAgICAgICAgICAgIlBhdGgiOiAiIgogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgIlR5cGUiOiAibW91bnQiLAogICAgICAgICAgICAgICJQYXRoIjogIiIKICAgICAgICAgICAgfQogICAgICAgICAgXSwKICAgICAgICAgICJNYXNrZWRQYXRocyI6IFsKICAgICAgICAgICAgIi9wcm9jL2FjcGkiLAogICAgICAgICAgICAiL3Byb2Mva2NvcmUiLAogICAgICAgICAgICAiL3Byb2Mva2V5cyIsCiAgICAgICAgICAgICIvcHJvYy9sYXRlbmN5X3N0YXRzIiwKICAgICAgICAgICAgIi9wcm9jL3RpbWVyX2xpc3QiLAogICAgICAgICAgICAiL3Byb2MvdGltZXJfc3RhdHMiLAogICAgICAgICAgICAiL3Byb2Mvc2NoZWRfZGVidWciLAogICAgICAgICAgICAiL3Byb2Mvc2NzaSIsCiAgICAgICAgICAgICIvc3lzL2Zpcm13YXJlIgogICAgICAgICAgXSwKICAgICAgICAgICJSZWFkb25seVBhdGhzIjogWwogICAgICAgICAgICAiL3Byb2MvYXNvdW5kIiwKICAgICAgICAgICAgIi9wcm9jL2J1cyIsCiAgICAgICAgICAgICIvcHJvYy9mcyIsCiAgICAgICAgICAgICIvcHJvYy9pcnEiLAogICAgICAgICAgICAiL3Byb2Mvc3lzIiwKICAgICAgICAgICAgIi9wcm9jL3N5c3JxLXRyaWdnZXIiCiAgICAgICAgICBdLAogICAgICAgICAgIkRldmljZXMiOiBbXSwKICAgICAgICAgICJTeXNjdGwiOiB7CiAgICAgICAgICAgICJuZXQuaXB2NC5pcF91bnByaXZpbGVnZWRfcG9ydF9zdGFydCI6ICIwIiwKICAgICAgICAgICAgIm5ldC5pcHY0LnBpbmdfZ3JvdXBfcmFuZ2UiOiAiMCAyMTQ3NDgzNjQ3IgogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSwKICAgICAgInN0b3JhZ2VzIjogWwogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2gwKSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjApIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAib3ZlcmxheWZzIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJmdXNlMy5rYXRhLW92ZXJsYXkiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIzYWFjZTNkNDRjYWJlYzNlODcwYTI4MDg1NWIzNzhkNzI4NmJlNTZlYmE2ZWU2YzA4ZmNhMjM0YjhkZDkyYzU1IiwKICAgICAgICAgICAgIjJkZmY0MmFhNDA0OGE5YWZlYzQ3MTA0MjRlZjYzMzU0M2UwZTRkMGEyMmI0NGExYjQzMmZhNmYxNDk1ZmQ3ODYiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQoY3BhdGgpLyQoYnVuZGxlLWlkKSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfQogICAgICBdLAogICAgICAiZGV2aWNlcyI6IFtdLAogICAgICAic2FuZGJveF9waWRucyI6IGZhbHNlLAogICAgICAiZXhlY19jb21tYW5kcyI6IFtdLAogICAgICAiZW52X21hcCI6IHsKICAgICAgICAiSE9TVE5BTUUiOiAiJChob3N0LW5hbWUpIiwKICAgICAgICAiUEFUSCI6ICIvdXNyL2xvY2FsL3NiaW46L3Vzci9sb2NhbC9iaW46L3Vzci9zYmluOi91c3IvYmluOi9zYmluOi9iaW4iCiAgICAgIH0KICAgIH0KICBdLAogICJjb21tb24iOiB7CiAgICAiY3BhdGgiOiAiL3J1bi9rYXRhLWNvbnRhaW5lcnMvc2hhcmVkL2NvbnRhaW5lcnMiLAogICAgIm1vdW50X3NvdXJjZV9jcGF0aCI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zaGFyZWQvY29udGFpbmVycyIsCiAgICAic2ZwcmVmaXgiOiAiXiQoY3BhdGgpLyQoYnVuZGxlLWlkKS1bYS16MC05XXsxNn0tIiwKICAgICJzcGF0aCI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L3N0b3JhZ2UiLAogICAgImlwdjRfYSI6ICIoKFswLTldfFsxLTldWzAtOV18MVswLTldezJ9fDJbMC00XVswLTldfDI1WzAtNV0pXFwuKXszfShbMC05XXxbMS05XVswLTldfDFbMC05XXsyfXwyWzAtNF1bMC05XXwyNVswLTVdKSIsCiAgICAiaXBfcCI6ICJbMC05XXsxLDV9IiwKICAgICJzdmNfbmFtZSI6ICJbQS1aX1xcLlxcLV0rIiwKICAgICJkbnNfbGFiZWwiOiAiW2EtekEtWjAtOV9cXC5cXC1dKyIsCiAgICAic19zb3VyY2UxIjogIl4uLjJbMC05XXszfV9bMC0xXVswLTldX1swLTNdWzAtOV1fWzAtMl1bMC05XV9bMC01XVswLTldX1swLTVdWzAtOV1cXC5bMC05XXsxLDEwfSQiLAogICAgInNfc291cmNlMiI6ICJeLi5kYXRhLyIsCiAgICAiZG5zX3N1YmRvbWFpbiI6ICJeW2EtejAtOV0oWy1hLXowLTldKlthLXowLTldKT8kIiwKICAgICJwb2RfdWlkIjogIl5bMC05YS1mQS1GXXs4fS1bMC05YS1mQS1GXXs0fS1bMC05YS1mQS1GXXs0fS1bMC05YS1mQS1GXXs0fS1bMC05YS1mQS1GXXsxMn0kIiwKICAgICJkZWZhdWx0X2NhcHMiOiBbCiAgICAgICJDQVBfQ0hPV04iLAogICAgICAiQ0FQX0RBQ19PVkVSUklERSIsCiAgICAgICJDQVBfRlNFVElEIiwKICAgICAgIkNBUF9GT1dORVIiLAogICAgICAiQ0FQX01LTk9EIiwKICAgICAgIkNBUF9ORVRfUkFXIiwKICAgICAgIkNBUF9TRVRHSUQiLAogICAgICAiQ0FQX1NFVFVJRCIsCiAgICAgICJDQVBfU0VURkNBUCIsCiAgICAgICJDQVBfU0VUUENBUCIsCiAgICAgICJDQVBfTkVUX0JJTkRfU0VSVklDRSIsCiAgICAgICJDQVBfU1lTX0NIUk9PVCIsCiAgICAgICJDQVBfS0lMTCIsCiAgICAgICJDQVBfQVVESVRfV1JJVEUiCiAgICBdLAogICAgInByaXZpbGVnZWRfY2FwcyI6IFsKICAgICAgIkNBUF9DSE9XTiIsCiAgICAgICJDQVBfREFDX09WRVJSSURFIiwKICAgICAgIkNBUF9EQUNfUkVBRF9TRUFSQ0giLAogICAgICAiQ0FQX0ZPV05FUiIsCiAgICAgICJDQVBfRlNFVElEIiwKICAgICAgIkNBUF9LSUxMIiwKICAgICAgIkNBUF9TRVRHSUQiLAogICAgICAiQ0FQX1NFVFVJRCIsCiAgICAgICJDQVBfU0VUUENBUCIsCiAgICAgICJDQVBfTElOVVhfSU1NVVRBQkxFIiwKICAgICAgIkNBUF9ORVRfQklORF9TRVJWSUNFIiwKICAgICAgIkNBUF9ORVRfQlJPQURDQVNUIiwKICAgICAgIkNBUF9ORVRfQURNSU4iLAogICAgICAiQ0FQX05FVF9SQVciLAogICAgICAiQ0FQX0lQQ19MT0NLIiwKICAgICAgIkNBUF9JUENfT1dORVIiLAogICAgICAiQ0FQX1NZU19NT0RVTEUiLAogICAgICAiQ0FQX1NZU19SQVdJTyIsCiAgICAgICJDQVBfU1lTX0NIUk9PVCIsCiAgICAgICJDQVBfU1lTX1BUUkFDRSIsCiAgICAgICJDQVBfU1lTX1BBQ0NUIiwKICAgICAgIkNBUF9TWVNfQURNSU4iLAogICAgICAiQ0FQX1NZU19CT09UIiwKICAgICAgIkNBUF9TWVNfTklDRSIsCiAgICAgICJDQVBfU1lTX1JFU09VUkNFIiwKICAgICAgIkNBUF9TWVNfVElNRSIsCiAgICAgICJDQVBfU1lTX1RUWV9DT05GSUciLAogICAgICAiQ0FQX01LTk9EIiwKICAgICAgIkNBUF9MRUFTRSIsCiAgICAgICJDQVBfQVVESVRfV1JJVEUiLAogICAgICAiQ0FQX0FVRElUX0NPTlRST0wiLAogICAgICAiQ0FQX1NFVEZDQVAiLAogICAgICAiQ0FQX01BQ19PVkVSUklERSIsCiAgICAgICJDQVBfTUFDX0FETUlOIiwKICAgICAgIkNBUF9TWVNMT0ciLAogICAgICAiQ0FQX1dBS0VfQUxBUk0iLAogICAgICAiQ0FQX0JMT0NLX1NVU1BFTkQiLAogICAgICAiQ0FQX0FVRElUX1JFQUQiLAogICAgICAiQ0FQX1BFUkZNT04iLAogICAgICAiQ0FQX0JQRiIsCiAgICAgICJDQVBfQ0hFQ0tQT0lOVF9SRVNUT1JFIgogICAgXSwKICAgICJ2aXJ0aW9fYmxrX3N0b3JhZ2VfY2xhc3NlcyI6IFsKICAgICAgImNjLWxvY2FsLWNzaSIsCiAgICAgICJjYy1tYW5hZ2VkLWNzaSIsCiAgICAgICJjYy1tYW5hZ2VkLXByZW1pdW0tY3NpIgogICAgXSwKICAgICJzbWJfc3RvcmFnZV9jbGFzc2VzIjogWwogICAgICB7CiAgICAgICAgIm5hbWUiOiAiYXp1cmVmaWxlLWNzaS1rYXRhLWNjIiwKICAgICAgICAibW91bnRfb3B0aW9ucyI6IFsKICAgICAgICAgICJkaXJfbW9kZT0wNzc3IiwKICAgICAgICAgICJmaWxlX21vZGU9MDc3NyIsCiAgICAgICAgICAibWZzeW1saW5rcyIsCiAgICAgICAgICAiY2FjaGU9c3RyaWN0IiwKICAgICAgICAgICJub3NoYXJlc29jayIsCiAgICAgICAgICAiYWN0aW1lbz0zMCIsCiAgICAgICAgICAibm9icmwiCiAgICAgICAgXQogICAgICB9CiAgICBdCiAgfSwKICAic2FuZGJveCI6IHsKICAgICJzdG9yYWdlcyI6IFsKICAgICAgewogICAgICAgICJkcml2ZXIiOiAiZXBoZW1lcmFsIiwKICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAic291cmNlIjogInNobSIsCiAgICAgICAgImZzdHlwZSI6ICJ0bXBmcyIsCiAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgIm5vZGV2IiwKICAgICAgICAgICJtb2RlPTE3NzciLAogICAgICAgICAgInNpemU9NjcxMDg4NjQiCiAgICAgICAgXSwKICAgICAgICAibW91bnRfcG9pbnQiOiAiL3J1bi9rYXRhLWNvbnRhaW5lcnMvc2FuZGJveC9zaG0iLAogICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgfQogICAgXQogIH0sCiAgInJlcXVlc3RfZGVmYXVsdHMiOiB7CiAgICAiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdCI6IHsKICAgICAgImFsbG93X2Vudl9yZWdleCI6IFsKICAgICAgICAiXkhPU1ROQU1FPSQoZG5zX2xhYmVsKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfUE9SVF8kKGlwX3ApX1RDUD10Y3A6Ly8kKGlwdjRfYSk6JChpcF9wKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfUE9SVF8kKGlwX3ApX1RDUF9QUk9UTz10Y3AkIiwKICAgICAgICAiXiQoc3ZjX25hbWUpX1BPUlRfJChpcF9wKV9UQ1BfUE9SVD0kKGlwX3ApJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9QT1JUXyQoaXBfcClfVENQX0FERFI9JChpcHY0X2EpJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9TRVJWSUNFX0hPU1Q9JChpcHY0X2EpJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9TRVJWSUNFX1BPUlQ9JChpcF9wKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfU0VSVklDRV9QT1JUXyQoZG5zX2xhYmVsKT0kKGlwX3ApJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9QT1JUPXRjcDovLyQoaXB2NF9hKTokKGlwX3ApJCIsCiAgICAgICAgIl5BWlVSRV9DTElFTlRfSUQ9W0EtRmEtZjAtOS1dKiQiLAogICAgICAgICJeQVpVUkVfVEVOQU5UX0lEPVtBLUZhLWYwLTktXSokIiwKICAgICAgICAiXkFaVVJFX0ZFREVSQVRFRF9UT0tFTl9GSUxFPS92YXIvcnVuL3NlY3JldHMvYXp1cmUvdG9rZW5zL2F6dXJlLWlkZW50aXR5LXRva2VuJCIsCiAgICAgICAgIl5BWlVSRV9BVVRIT1JJVFlfSE9TVD1odHRwczovL2xvZ2luXFwubWljcm9zb2Z0b25saW5lXFwuY29tLyQiLAogICAgICAgICJeVEVSTT14dGVybSQiCiAgICAgIF0sCiAgICAgICJhbGxvd19lbnZfcmVnZXhfbWFwIjogewogICAgICAgICJDUFVfTElNSVQiOiAiXlswLTldKyQiLAogICAgICAgICJKT0JfQ09NUExFVElPTl9JTkRFWCI6ICJeWzAtOV0qJCIsCiAgICAgICAgIk1FTU9SWV9MSU1JVCI6ICJeWzAtOV0rJCIKICAgICAgfQogICAgfSwKICAgICJDb3B5RmlsZVJlcXVlc3QiOiBbCiAgICAgICIkKHNmcHJlZml4KSIKICAgIF0sCiAgICAiRXhlY1Byb2Nlc3NSZXF1ZXN0IjogewogICAgICAiYWxsb3dlZF9jb21tYW5kcyI6IFtdLAogICAgICAicmVnZXgiOiBbXQogICAgfSwKICAgICJVcGRhdGVSb3V0ZXNSZXF1ZXN0IjogewogICAgICAiZm9yYmlkZGVuX2RldmljZV9uYW1lcyI6IFsKICAgICAgICAibG8iCiAgICAgIF0sCiAgICAgICJmb3JiaWRkZW5fc291cmNlX3JlZ2V4IjogWwogICAgICAgICJeKD86MHswLDR9Oil7MCw3fTB7MCwzfTEkIiwKICAgICAgICAiXjEyN1xcLig/OlswLTldezEsM31cXC4pezJ9WzAtOV17MSwzfSQiCiAgICAgIF0KICAgIH0sCiAgICAiVXBkYXRlSW50ZXJmYWNlUmVxdWVzdCI6IHsKICAgICAgImFsbG93X3Jhd19mbGFncyI6IDEyOCwKICAgICAgImZvcmJpZGRlbl9uYW1lcyI6IFsKICAgICAgICAibG8iCiAgICAgIF0sCiAgICAgICJmb3JiaWRkZW5faHdfYWRkcnMiOiBbCiAgICAgICAgIjAwOjAwOjAwOjAwOjAwOjAwIgogICAgICBdCiAgICB9LAogICAgIkNsb3NlU3RkaW5SZXF1ZXN0IjogZmFsc2UsCiAgICAiUmVhZFN0cmVhbVJlcXVlc3QiOiBmYWxzZSwKICAgICJVcGRhdGVFcGhlbWVyYWxNb3VudHNSZXF1ZXN0IjogZmFsc2UsCiAgICAiV3JpdGVTdHJlYW1SZXF1ZXN0IjogZmFsc2UKICB9Cn0= +spec: + containers: + - name: ubuntu-main + image: "mcr.microsoft.com/mirror/docker/library/ubuntu:18.04" + command: + - /bin/bash + - "-c" + - "--" + args: + - while true; echo hi; do sleep 30; done; + runtimeClassName: kata-cc + priorityClassName: high-priority diff --git a/src/agent/samples/policy/yaml/replica-set/replica-busy.yaml b/src/agent/samples/policy/yaml/replica-set/replica-busy.yaml new file mode 100644 index 000000000000..937cdb68be26 --- /dev/null +++ b/src/agent/samples/policy/yaml/replica-set/replica-busy.yaml @@ -0,0 +1,34 @@ +--- +apiVersion: apps/v1 +kind: ReplicaSet +metadata: + name: replica1 + labels: + app: busybox +spec: + selector: + matchLabels: + app: replica1 + template: + metadata: + labels: + app: replica1 + annotations: + io.katacontainers.config.agent.policy: IyBDb3B5cmlnaHQgKGMpIDIwMjMgTWljcm9zb2Z0IENvcnBvcmF0aW9uCiMKIyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMAojCnBhY2thZ2UgYWdlbnRfcG9saWN5CgppbXBvcnQgZnV0dXJlLmtleXdvcmRzLmluCmltcG9ydCBmdXR1cmUua2V5d29yZHMuZXZlcnkKCiMgRGVmYXVsdCB2YWx1ZXMsIHJldHVybmVkIGJ5IE9QQSB3aGVuIHJ1bGVzIGNhbm5vdCBiZSBldmFsdWF0ZWQgdG8gdHJ1ZS4KZGVmYXVsdCBBZGRBUlBOZWlnaGJvcnNSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgQWRkU3dhcFJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBDbG9zZVN0ZGluUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IENvcHlGaWxlUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IENyZWF0ZUNvbnRhaW5lclJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBDcmVhdGVTYW5kYm94UmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IERlc3Ryb3lTYW5kYm94UmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgRXhlY1Byb2Nlc3NSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgR2V0T09NRXZlbnRSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBHdWVzdERldGFpbHNSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBMaXN0SW50ZXJmYWNlc1JlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBMaXN0Um91dGVzUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IE1lbUhvdHBsdWdCeVByb2JlUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IE9ubGluZUNQVU1lbVJlcXVlc3QgOj0gdHJ1ZQpkZWZhdWx0IFBhdXNlQ29udGFpbmVyUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFJlYWRTdHJlYW1SZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgUmVtb3ZlQ29udGFpbmVyUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgUmVtb3ZlU3RhbGVWaXJ0aW9mc1NoYXJlTW91bnRzUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgUmVzZWVkUmFuZG9tRGV2UmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFJlc3VtZUNvbnRhaW5lclJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBTZXRHdWVzdERhdGVUaW1lUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFNldFBvbGljeVJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBTaWduYWxQcm9jZXNzUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgU3RhcnRDb250YWluZXJSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBTdGFydFRyYWNpbmdSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgU3RhdHNDb250YWluZXJSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBTdG9wVHJhY2luZ1JlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBUdHlXaW5SZXNpemVSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBVcGRhdGVDb250YWluZXJSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgVXBkYXRlRXBoZW1lcmFsTW91bnRzUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFVwZGF0ZUludGVyZmFjZVJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBVcGRhdGVSb3V0ZXNSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgV2FpdFByb2Nlc3NSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBXcml0ZVN0cmVhbVJlcXVlc3QgOj0gZmFsc2UKCiMgQWxsb3dSZXF1ZXN0c0ZhaWxpbmdQb2xpY3kgOj0gdHJ1ZSBjb25maWd1cmVzIHRoZSBBZ2VudCB0byAqYWxsb3cgYW55CiMgcmVxdWVzdHMgY2F1c2luZyBhIHBvbGljeSBmYWlsdXJlKi4gVGhpcyBpcyBhbiB1bnNlY3VyZSBjb25maWd1cmF0aW9uCiMgYnV0IGlzIHVzZWZ1bCBmb3IgYWxsb3dpbmcgdW5zZWN1cmUgcG9kcyB0byBzdGFydCwgdGhlbiBjb25uZWN0IHRvCiMgdGhlbSBhbmQgaW5zcGVjdCBPUEEgbG9ncyBmb3IgdGhlIHJvb3QgY2F1c2Ugb2YgYSBmYWlsdXJlLgpkZWZhdWx0IEFsbG93UmVxdWVzdHNGYWlsaW5nUG9saWN5IDo9IGZhbHNlCgojIENvbnN0YW50cwpTX05BTUVfS0VZID0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZSIKU19OQU1FU1BBQ0VfS0VZID0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZXNwYWNlIgpCVU5ETEVfSUQgPSAiW2EtejAtOV17NjR9IgoKQ3JlYXRlQ29udGFpbmVyUmVxdWVzdDo9IHJlc3AgewogICAgbm90IGlzX251bGwoaW5wdXQuZW52X21hcCkKICAgIAogICAgaV9lbnZfbWFwIDo9IGlucHV0LmVudl9tYXAKICAgIAogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBwX2Vudl9tYXAgOj0gcF9jb250YWluZXIuZW52X21hcCAgCiAgICBhbGxvd19lbnZfbWFwKHBfZW52X21hcCwgaV9lbnZfbWFwKQogICAgCiAgICBpX3Byb2Nlc3MgOj0gaW5wdXQuYmFzZS5PQ0kuUHJvY2VzcwogICAgCiAgICBwX3Byb2Nlc3MgOj0gcF9jb250YWluZXIuT0NJLlByb2Nlc3MKICAgIAogICAgYWxsb3dfYXJncyhpX3Byb2Nlc3MsIHBfcHJvY2VzcywgaV9lbnZfbWFwKQoKICAgIHJlc3AgPSBDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uKGlucHV0LmJhc2UpCiAgICBwcmludCgiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdDogdHJ1ZSIpCn0KCmFsbG93X2FyZ3MoaV9wcm9jZXNzLCBwX3Byb2Nlc3MsIGlfZW52X21hcCkgewogICAgaV9hcmdzIDo9IGlfcHJvY2Vzcy5BcmdzCiAgICBwX2FyZ3MgOj0gcF9wcm9jZXNzLkFyZ3MKICAgIHByaW50KCJhbGxvd19hcmdzOiBpX2FyZ3MgPSIsIGlfYXJncywgInBfYXJncyA9IiwgcF9hcmdzKQogICAgY291bnQoaV9hcmdzKSA9PSBjb3VudChwX2FyZ3MpCiAgICBldmVyeSBpLCBpX2FyZyBpbiBpX2FyZ3MgewogICAgICAgIHByaW50KCJhbGxvd19hcmdzOiBpX2FyZyA9IiwgaV9hcmcpCiAgICAgICAgcF9hcmdfcmVwbGFjZWQgOj0gcmVwbGFjZV9lbnZfdmFyaWFibGVzKHBfYXJnc1tpXSwgaV9lbnZfbWFwKQogICAgICAgIHByaW50KCJhbGxvd19hcmdzOiBwX2FyZ19yZXBsYWNlZCA9IiwgcF9hcmdfcmVwbGFjZWQpCiAgICAgICAgcF9hcmdfcmVwbGFjZWQyIDo9IHJlcGxhY2UocF9hcmdfcmVwbGFjZWQsICIkJCIsICIkIikKICAgICAgICBwcmludCgiYWxsb3dfYXJnczogcF9hcmdfcmVwbGFjZWQyID0iLCBwX2FyZ19yZXBsYWNlZDIpCiAgICAgICAgaV9hcmcgPT0gcF9hcmdfcmVwbGFjZWQyCiAgICB9CiAgICBwcmludCgiYWxsb3dfYXJnczogdHJ1ZSIpCn0KCmFsbG93X2FyZ3MoaV9wcm9jZXNzLCBwX3Byb2Nlc3MsIGlfZW52X21hcCkgewogICAgbm90IGlfcHJvY2Vzcy5BcmdzCiAgICBub3QgcF9wcm9jZXNzLkFyZ3MKICAgIHByaW50KCJhbGxvd19hcmdzMjogbm8gYXJncyIpCn0KCiMgdGhpcyBmdW5jdGlvbiByZXBsYWNlcyBhbGwgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyBpbiBhIHN0cmluZywgZ2l2ZW4gYSBtYXAgb2YgZW52aXJvbm1lbnQga2V5cyB0byBlbnZpcm9ubWVudCB2YWx1ZXMKIyBlZyBzdHIgPSAiZWNobyAkKENMVVNURVJfSUQpOyBlY2hvICQoTk9ERV9OQU1FKTsiCiMgZW52X21hcCA9IHsiQ0xVU1RFUl9JRCI6ICJhYmMiLCAiTk9ERV9OQU1FIiA6ICJ4eXoifQojIHJlc3VsdCA9ICJlY2hvIGFiYzsgZWNobyB4eXo7IgpyZXBsYWNlX2Vudl92YXJpYWJsZXMoc3RyLCBlbnZfbWFwKSA9IHJlc3VsdCB7CiAgICAjIG1ha2UgYW4gYXJyYXkgb2YgdGhlIGtleXMgZWcgWyJDTFVTVEVSX0lEIiwgIk5PREVfTkFNRSJdCiAgICBrZXlzIDo9IFt4IHwgc29tZSB4IGluIG9iamVjdC5rZXlzKGVudl9tYXApXQogICAgcmVzdWx0IDo9IHJlcGxhY2Vfc3RyX3JlYyhzdHIsIGVudl9tYXAsIGtleXMsIGNvdW50KGtleXMpIC0gMSkKfQoKIyBiYXNlIGNhc2UKcmVwbGFjZV9zdHJfcmVjKHN0ciwgZW52X21hcCwgYXJyX2tleXMsIGkpID0gcmVzdWx0IHsKICAgIGkgPCAwCiAgICByZXN1bHQgOj0gc3RyCn0KCiMgcmVjdXJzaXZlIHN0ZXAKcmVwbGFjZV9zdHJfcmVjKHN0ciwgZW52X21hcCwgYXJyX2tleXMsIGkpID0gcmVzdWx0IHsKICAgIGkgPj0gMAogICAga2V5IDo9IGFycl9rZXlzW2ldCiAgICBlbnZfa2V5MSA6PSBjb25jYXQoIiIsIFsiJCgiLCBrZXksICIpIl0pCiAgICAjIHJlcGxhY2UgJChWQVIpIHdpdGggdmFsdWUKICAgIG5ld19zdHIxIDo9IHJlcGxhY2Uoc3RyLCBlbnZfa2V5MSwgZW52X21hcFtrZXldKQogICAgIyByZXBsYWNlIG5leHQgZW52aXJvbm1lbnQgdmFyaWFibGUKICAgIHJlc3VsdCA9IHJlcGxhY2Vfc3RyX3JlYyhuZXdfc3RyMSwgZW52X21hcCwgYXJyX2tleXMsIGkgLSAxKQp9CgphbGxvd19lbnZfbWFwKHBfZW52X21hcCwgaV9lbnZfbWFwKSB7CiAgICBwcmludCgiYWxsb3dfZW52X21hcDogcF9lbnZfbWFwID0iLCBwX2Vudl9tYXApCiAgICBldmVyeSBlbnZfa2V5LCBlbnZfdmFsIGluIGlfZW52X21hcCB7CiAgICAgICAgcHJpbnQoImFsbG93X2VudjogZW52X2tleSA9IiwgZW52X2tleSwgImVudl92YWwgPSIsIGVudl92YWwpCiAgICAgICAgYWxsb3dfZW52X21hcF9lbnRyeShlbnZfa2V5LCBlbnZfdmFsLCBwX2Vudl9tYXApCiAgICB9CiAgICBwcmludCgiYWxsb3dfZW52X21hcDogdHJ1ZSIpCn0KCiMgQWxsb3cgZXhhY3QgbWF0Y2gKYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBpX3ZhbCA9PSBwX3ZhbAogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnk6IHRydWUiKQp9CgojIEFsbG93IHJlc291cmNlRmllbGRSZWYgdmFsdWVzIChlLmcuLCAibGltaXRzLmNwdSIpLgphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgICMgYSB2YXJpYWJsZSB3ZSBzaG91bGQgYmUgdmFsaWRhdGluZyB1c2luZyBhIHJlZ2V4IGZyb20gc2V0dGluZ3MKICAgIHBfdmFsID09ICIkKHZhbGlkYXRlLWZyb20tc2V0dGluZ3MpIgogICAgcmVnZXhfdmFsIDo9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuQ3JlYXRlQ29udGFpbmVyUmVxdWVzdC5hbGxvd19lbnZfcmVnZXhfbWFwW2tleV0KICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4X3ZhbCwgaV92YWwpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSAyOiB0cnVlIikKfQoKIyBBbGxvdyBub2RlLW5hbWUKYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChub2RlLW5hbWUpIgogICAgcmVnZXgubWF0Y2gocG9saWN5X2RhdGEuY29tbW9uLmRuc19zdWJkb21haW4gLCBpX3ZhbCkKICAgIHByaW50KCJhbGxvd19lbnZfbWFwX2VudHJ5IDM6IHRydWUiKQp9CgojIEFsbG93IGhvc3QtbmFtZQphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgIHBfdmFsID09ICIkKGhvc3QtbmFtZSkiCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24uZG5zX2xhYmVsICwgaV92YWwpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSA0OiB0cnVlIikKfQoKIyBBbGxvdyBwb2QtdWlkCmFsbG93X2Vudl9tYXBfZW50cnkoa2V5LCBpX3ZhbCwgcF9lbnZfbWFwKSB7CiAgICBwX3ZhbCA6PSBwX2Vudl9tYXBba2V5XQogICAgcF92YWwgPT0gIiQocG9kLXVpZCkiCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24ucG9kX3VpZCAsIGlfdmFsKQogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgNTogdHJ1ZSIpCn0KCiMgQWxsb3cgZmllbGRSZWYgImZpZWxkUGF0aDogc3RhdHVzLnBvZElQIiB2YWx1ZXMuCmFsbG93X2Vudl9tYXBfZW50cnkoa2V5LCBpX3ZhbCwgcF9lbnZfbWFwKSB7CiAgICBpc19pcChpX3ZhbCkKCiAgICBwX3ZhbCA6PSBwX2Vudl9tYXBba2V5XQogICAgcF92YXIgOj0gY29uY2F0KCI9IiwgW2tleSwgcF92YWxdKQogICAgYWxsb3dfcG9kX2lwX3ZhcihrZXksIHBfdmFyKQogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgNjogdHJ1ZSIpCn0KCiMgQWxsb3cgZmllbGRSZWYgImZpZWxkUGF0aDogc3RhdHVzLmhvc3RJUCIgdmFsdWVzLgphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgaXNfaXAoaV92YWwpCgogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgIHBfdmFyIDo9IGNvbmNhdCgiPSIsIFtrZXksIHBfdmFsXSkKICAgIGFsbG93X2hvc3RfaXBfdmFyKGtleSwgcF92YXIpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSA3OiB0cnVlIikKfQoKIyBNYXRjaCBpbnB1dCB3aXRoIG9uZSBvZiB0aGUgcG9saWN5IHZhcmlhYmxlcywgYWZ0ZXIgc3Vic3RpdHV0aW5nICQoc2FuZGJveC1uYW1lKS4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChzYW5kYm94LW5hbWUpIgogICAgc19uYW1lIDo9IGlucHV0LmJhc2UuT0NJLkFubm90YXRpb25zW1NfTkFNRV9LRVldCiAgICBwX3ZhcjIgOj0gcmVwbGFjZShwX3ZhbCwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHBfdmFyMiA9PSBpX3ZhbAogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgODogdHJ1ZSIpCn0KCiMgTWF0Y2ggaW5wdXQgd2l0aCBvbmUgb2YgdGhlIHBvbGljeSB2YXJpYWJsZXMsIGFmdGVyIHN1YnN0aXR1dGluZyAkKHNhbmRib3gtbmFtZXNwYWNlKS4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChzYW5kYm94LW5hbWVzcGFjZSkiCiAgICBzX25hbWVzcGFjZSA6PSBpbnB1dC5iYXNlLk9DSS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwX3ZhcjIgOj0gcmVwbGFjZShwX3ZhbCwgIiQoc2FuZGJveC1uYW1lc3BhY2UpIiwgc19uYW1lc3BhY2UpCiAgICBwX3ZhcjIgPT0gaV92YWwKICAgIHByaW50KCJhbGxvd19lbnZfbWFwX2VudHJ5IDk6IHRydWUiKQp9CgojIEFsbG93IGlucHV0IGVudiB2YXJpYWJsZXMgdGhhdCBtYXRjaCB3aXRoIGEgcmVxdWVzdF9kZWZhdWx0cyByZWdleC4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHNvbWUgcF9yZWdleDEgaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5DcmVhdGVDb250YWluZXJSZXF1ZXN0LmFsbG93X2Vudl9yZWdleAogICAgcF9yZWdleDIgOj0gcmVwbGFjZShwX3JlZ2V4MSwgIiQoaXB2NF9hKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcHY0X2EpCiAgICBwX3JlZ2V4MyA6PSByZXBsYWNlKHBfcmVnZXgyLCAiJChpcF9wKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcF9wKQogICAgcF9yZWdleDQgOj0gcmVwbGFjZShwX3JlZ2V4MywgIiQoc3ZjX25hbWUpIiwgcG9saWN5X2RhdGEuY29tbW9uLnN2Y19uYW1lKQogICAgcF9yZWdleDUgOj0gcmVwbGFjZShwX3JlZ2V4NCwgIiQoZG5zX2xhYmVsKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5kbnNfbGFiZWwpCgogICAgcmVzdWx0IDo9IGNvbmNhdCgiPSIsIFtrZXksIGlfdmFsXSkKICAgIHJlZ2V4Lm1hdGNoKHBfcmVnZXg1LCByZXN1bHQpCgogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgMTA6IHRydWUiKQp9CgpDcmVhdGVDb250YWluZXJSZXF1ZXN0Oj0gcmVzcCB7CiAgICBub3QgaW5wdXQuZW52X21hcAogICAgaV9wcm9jZXNzID0gaW5wdXQuT0NJLlByb2Nlc3MKICAgIHNfbmFtZSA9IGlucHV0Lk9DSS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBwX3Byb2Nlc3MgPSBwX2NvbnRhaW5lci5PQ0kuUHJvY2VzcwogICAgYWxsb3dfZGVwcmVjYXRlZF9hcmdzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUpCiAgICByZXNwID0gQ3JlYXRlQ29udGFpbmVyUmVxdWVzdENvbW1vbihpbnB1dCkKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0MjogdHJ1ZSIpCn0KCkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb24ocmVxKTo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgICMgQ2hlY2sgaWYgdGhlIGlucHV0IHJlcXVlc3Qgc2hvdWxkIGJlIHJlamVjdGVkIGV2ZW4gYmVmb3JlIGNoZWNraW5nIHRoZQogICAgIyBwb2xpY3lfZGF0YS5jb250YWluZXJzIGluZm9ybWF0aW9uLgogICAgYWxsb3dfY3JlYXRlX2NvbnRhaW5lcl9pbnB1dChyZXEpCgogICAgaV9vY2kgOj0gcmVxLk9DSQogICAgaV9zdG9yYWdlcyA6PSByZXEuc3RvcmFnZXMKICAgIGlfZGV2aWNlcyA6PSByZXEuZGV2aWNlcwoKICAgICMgYXJyYXkgb2YgcG9zc2libGUgc3RhdGUgb3BlcmF0aW9ucwogICAgb3BzX2J1aWxkZXIgOj0gW10KCiAgICAjIGNoZWNrIHNhbmRib3ggbmFtZQogICAgc2FuZGJveF9uYW1lID0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FX0tFWV0KICAgIGFkZF9zYW5kYm94X25hbWVfdG9fc3RhdGUgOj0gc3RhdGVfYWxsb3dzKCJzYW5kYm94X25hbWUiLCBzYW5kYm94X25hbWUpCiAgICBvcHNfYnVpbGRlcjEgOj0gY29uY2F0X29wX2lmX25vdF9udWxsKG9wc19idWlsZGVyLCBhZGRfc2FuZGJveF9uYW1lX3RvX3N0YXRlKQoKICAgICMgQ2hlY2sgaWYgYW55IGVsZW1lbnQgZnJvbSB0aGUgcG9saWN5X2RhdGEuY29udGFpbmVycyBhcnJheSBhbGxvd3MgdGhlIGlucHV0IHJlcXVlc3QuCiAgICBzb21lIHBfY29udGFpbmVyIGluIHBvbGljeV9kYXRhLmNvbnRhaW5lcnMKICAgIHByaW50KCI9PT09PT09PSBDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiB0cnlpbmcgbmV4dCBwb2xpY3kgY29udGFpbmVyIikKCiAgICBwX3BpZG5zIDo9IHBfY29udGFpbmVyLnNhbmRib3hfcGlkbnMKICAgIGlfcGlkbnMgOj0gcmVxLnNhbmRib3hfcGlkbnMKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiBwX3BpZG5zID0iLCBwX3BpZG5zLCAiaV9waWRucyA9IiwgaV9waWRucykKICAgIHBfcGlkbnMgPT0gaV9waWRucwoKICAgIHBfb2NpIDo9IHBfY29udGFpbmVyLk9DSQoKICAgICMgY2hlY2sgbmFtZXNwYWNlCiAgICBwX25hbWVzcGFjZSA6PSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBpX25hbWVzcGFjZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwcmludCAoIkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb246IHBfbmFtZXNwYWNlID0iLCBwX25hbWVzcGFjZSwgImlfbmFtZXNwYWNlID0iLCBpX25hbWVzcGFjZSkKICAgIGFkZF9uYW1lc3BhY2VfdG9fc3RhdGUgOj0gYWxsb3dfbmFtZXNwYWNlKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkKICAgIG9wc19idWlsZGVyMiA6PSBjb25jYXRfb3BfaWZfbm90X251bGwob3BzX2J1aWxkZXIxLCBhZGRfbmFtZXNwYWNlX3RvX3N0YXRlKQoKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiBwIFZlcnNpb24gPSIsIHBfb2NpLlZlcnNpb24sICJpIFZlcnNpb24gPSIsIGlfb2NpLlZlcnNpb24pCiAgICBwX29jaS5WZXJzaW9uID09IGlfb2NpLlZlcnNpb24KCiAgICBwcmludCgiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdENvbW1vbjogcCBSZWFkb25seSA9IiwgcF9vY2kuUm9vdC5SZWFkb25seSwgImkgUmVhZG9ubHkgPSIsIGlfb2NpLlJvb3QuUmVhZG9ubHkpCiAgICBwX29jaS5Sb290LlJlYWRvbmx5ID09IGlfb2NpLlJvb3QuUmVhZG9ubHkKCiAgICBhbGxvd19hbm5vKHBfb2NpLCBpX29jaSkKCiAgICBwX3N0b3JhZ2VzIDo9IHBfY29udGFpbmVyLnN0b3JhZ2VzCiAgICBhbGxvd19ieV9hbm5vKHBfb2NpLCBpX29jaSwgcF9zdG9yYWdlcywgaV9zdG9yYWdlcykKCiAgICBwX2RldmljZXMgOj0gcF9jb250YWluZXIuZGV2aWNlcwogICAgYWxsb3dfZGV2aWNlcyhwX2RldmljZXMsIGlfZGV2aWNlcykKCiAgICByZXQgOj0gYWxsb3dfbGludXgob3BzX2J1aWxkZXIyLCBwX29jaSwgaV9vY2kpCiAgICByZXQuYWxsb3dlZAoKICAgIG9wcyA6PSByZXQub3BzCgogICAgcHJpbnQoIkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb246IHRydWUiKQp9CgphbGxvd19jcmVhdGVfY29udGFpbmVyX2lucHV0KHJlcSkgewogICAgcHJpbnQoImFsbG93X2NyZWF0ZV9jb250YWluZXJfaW5wdXQ6IGlucHV0ID0iLCByZXEpCgogICAgY291bnQocmVxLnNoYXJlZF9tb3VudHMpID09IDAKICAgIGlzX251bGwocmVxLnN0cmluZ191c2VyKQoKICAgIGlfb2NpIDo9IHJlcS5PQ0kKICAgIGlzX251bGwoaV9vY2kuSG9va3MpCiAgICBpc19udWxsKGlfb2NpLlNvbGFyaXMpCiAgICBpc19udWxsKGlfb2NpLldpbmRvd3MpCgogICAgaV9saW51eCA6PSBpX29jaS5MaW51eAogICAgY291bnQoaV9saW51eC5HSURNYXBwaW5ncykgPT0gMAogICAgY291bnQoaV9saW51eC5Nb3VudExhYmVsKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlJlc291cmNlcy5EZXZpY2VzKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlJvb3Rmc1Byb3BhZ2F0aW9uKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlVJRE1hcHBpbmdzKSA9PSAwCiAgICBpc19udWxsKGlfbGludXguSW50ZWxSZHQpCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLkJsb2NrSU8pCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLk5ldHdvcmspCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLlBpZHMpCiAgICBpc19udWxsKGlfbGludXguU2VjY29tcCkKCiAgICBpX3Byb2Nlc3MgOj0gaV9vY2kuUHJvY2VzcwogICAgY291bnQoaV9wcm9jZXNzLlNlbGludXhMYWJlbCkgPT0gMAogICAgY291bnQoaV9wcm9jZXNzLlVzZXIuVXNlcm5hbWUpID09IDAKCiAgICBwcmludCgiYWxsb3dfY3JlYXRlX2NvbnRhaW5lcl9pbnB1dDogdHJ1ZSIpCn0KCmFsbG93X25hbWVzcGFjZShwX25hbWVzcGFjZSwgaV9uYW1lc3BhY2UpID0gYWRkX25hbWVzcGFjZSB7CiAgICBwX25hbWVzcGFjZSA9PSBpX25hbWVzcGFjZQogICAgYWRkX25hbWVzcGFjZSA6PSBudWxsCiAgICBwcmludCgiYWxsb3dfbmFtZXNwYWNlIDE6IGlucHV0IG5hbWVzcGFjZSBtYXRjaGVzIHBvbGljeSBkYXRhIikKfQoKYWxsb3dfbmFtZXNwYWNlKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkgPSBhZGRfbmFtZXNwYWNlIHsKICAgIHBfbmFtZXNwYWNlID09ICIiCiAgICBwcmludCgiYWxsb3dfbmFtZXNwYWNlIDI6IG5vIG5hbWVzcGFjZSBmb3VuZCBvbiBwb2xpY3kgZGF0YSIpCiAgICBhZGRfbmFtZXNwYWNlIDo9IHN0YXRlX2FsbG93cygibmFtZXNwYWNlIiwgaV9uYW1lc3BhY2UpCn0KCiMgdmFsdWUgaGFzbid0IGJlZW4gc2VlbiBiZWZvcmUsIHNhdmUgaXQgdG8gc3RhdGUKc3RhdGVfYWxsb3dzKGtleSwgdmFsdWUpID0gYWN0aW9uIHsKICBzdGF0ZSA6PSBnZXRfc3RhdGUoKQogIHByaW50KCJzdGF0ZV9hbGxvd3MgMTogc3RhdGVba2V5XSA9Iiwgc3RhdGVba2V5XSwgInZhbHVlID0iLCB2YWx1ZSkKICBub3Qgc3RhdGVba2V5XQogIHByaW50KCJzdGF0ZV9hbGxvd3MgMTogc2F2aW5nIHRvIHN0YXRlIGtleSA9Iiwga2V5LCAidmFsdWUgPSIsIHZhbHVlKQogIHBhdGggOj0gZ2V0X3N0YXRlX3BhdGgoa2V5KSAKICBhY3Rpb24gOj0gewogICAgIm9wIjogImFkZCIsCiAgICAicGF0aCI6IHBhdGgsIAogICAgInZhbHVlIjogdmFsdWUsCiAgfQp9CgojIHZhbHVlIG1hdGNoZXMgd2hhdCdzIGluIHN0YXRlLCBhbGxvdyBpdApzdGF0ZV9hbGxvd3Moa2V5LCB2YWx1ZSkgPSBhY3Rpb24gewogIHByaW50KCJzdGF0ZV9hbGxvd3MgMjogc3RhcnQiKQogIHN0YXRlIDo9IGdldF9zdGF0ZSgpCiAgcHJpbnQoInN0YXRlX2FsbG93cyAyOiBzdGF0ZVtrZXldID0iLCBzdGF0ZVtrZXldLCAidmFsdWUgPSIsIHZhbHVlKQogIHZhbHVlID09IHN0YXRlW2tleV0KICBwcmludCgic3RhdGVfYWxsb3dzIDI6IGZvdW5kIGtleSA9Iiwga2V5LCAidmFsdWUgPSIsIHZhbHVlLCAiIGluIHN0YXRlIikKICBhY3Rpb24gOj0gbnVsbAp9CgojIGhlbHBlciBmdW5jdGlvbnMgdG8gaW50ZXJhY3Qgd2l0aCB0aGUgc3RhdGUKZ2V0X3N0YXRlKCkgPSBzdGF0ZSB7CiAgc3RhdGUgOj0gZGF0YVsicHN0YXRlIl0KfQoKZ2V0X3N0YXRlX3ZhbChrZXkpID0gdmFsdWUgewogICAgc3RhdGUgOj0gZ2V0X3N0YXRlKCkKICAgIHZhbHVlIDo9IHN0YXRlW2tleV0KfQoKZ2V0X3N0YXRlX3BhdGgoa2V5KSA9IHBhdGggewogICAgIyBwcmVwZW5kICIvcHN0YXRlLyIgdG8ga2V5CiAgICBwYXRoIDo9IGNvbmNhdCgiLyIsIFsiL3BzdGF0ZSIsIGtleV0pCn0KCiMgSGVscGVyIGZ1bmN0aW9ucyB0byBjb25kaXRpb25hbGx5IGNvbmNhdGVuYXRlIG9wIGlzIG5vdCBudWxsCmNvbmNhdF9vcF9pZl9ub3RfbnVsbChvcHMsIG9wKSA9IHJlc3VsdCB7CiAgICBvcCA9PSBudWxsCiAgICByZXN1bHQgOj0gb3BzCn0KCmNvbmNhdF9vcF9pZl9ub3RfbnVsbChvcHMsIG9wKSA9IHJlc3VsdCB7CiAgICBvcCAhPSBudWxsCiAgICByZXN1bHQgOj0gYXJyYXkuY29uY2F0KG9wcywgW29wXSkKfQoKIyBSZWplY3QgdW5leHBlY3RlZCBhbm5vdGF0aW9ucy4KYWxsb3dfYW5ubyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19hbm5vIDE6IHN0YXJ0IikKCiAgICBub3QgaV9vY2kuQW5ub3RhdGlvbnMKCiAgICBwcmludCgiYWxsb3dfYW5ubyAxOiB0cnVlIikKfQphbGxvd19hbm5vKHBfb2NpLCBpX29jaSkgewogICAgcHJpbnQoImFsbG93X2Fubm8gMjogcCBBbm5vdGF0aW9ucyA9IiwgcF9vY2kuQW5ub3RhdGlvbnMpCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiBpIEFubm90YXRpb25zID0iLCBpX29jaS5Bbm5vdGF0aW9ucykKCiAgICBpX2tleXMgOj0gb2JqZWN0LmtleXMoaV9vY2kuQW5ub3RhdGlvbnMpCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiBpIGtleXMgPSIsIGlfa2V5cykKCiAgICBldmVyeSBpX2tleSBpbiBpX2tleXMgewogICAgICAgIGFsbG93X2Fubm9fa2V5KGlfa2V5LCBwX29jaSkKICAgIH0KCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiB0cnVlIikKfQoKYWxsb3dfYW5ub19rZXkoaV9rZXksIHBfb2NpKSB7CiAgICBwcmludCgiYWxsb3dfYW5ub19rZXkgMTogaSBrZXkgPSIsIGlfa2V5KQoKICAgIHN0YXJ0c3dpdGgoaV9rZXksICJpby5rdWJlcm5ldGVzLmNyaS4iKQoKICAgIHByaW50KCJhbGxvd19hbm5vX2tleSAxOiB0cnVlIikKfQphbGxvd19hbm5vX2tleShpX2tleSwgcF9vY2kpIHsKICAgIHByaW50KCJhbGxvd19hbm5vX2tleSAyOiBpIGtleSA9IiwgaV9rZXkpCgogICAgc29tZSBwX2tleSwgXyBpbiBwX29jaS5Bbm5vdGF0aW9ucwogICAgcF9rZXkgPT0gaV9rZXkKCiAgICBwcmludCgiYWxsb3dfYW5ub19rZXkgMjogdHJ1ZSIpCn0KCiMgR2V0IHRoZSB2YWx1ZSBvZiB0aGUgU19OQU1FX0tFWSBhbm5vdGF0aW9uIGFuZAojIGNvcnJlbGF0ZSBpdCB3aXRoIG90aGVyIGFubm90YXRpb25zIGFuZCBwcm9jZXNzIGZpZWxkcy4KYWxsb3dfYnlfYW5ubyhwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpIHsKICAgIHByaW50KCJhbGxvd19ieV9hbm5vIDE6IHN0YXJ0IikKCiAgICBub3QgcF9vY2kuQW5ub3RhdGlvbnNbU19OQU1FX0tFWV0KCiAgICBpX3NfbmFtZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMTogaV9zX25hbWUgPSIsIGlfc19uYW1lKQoKICAgIGlfc19uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FU1BBQ0VfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMTogaV9zX25hbWVzcGFjZSA9IiwgaV9zX25hbWVzcGFjZSkKCiAgICBhbGxvd19ieV9zYW5kYm94X25hbWUocF9vY2ksIGlfb2NpLCBwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBpX3NfbmFtZSwgaV9zX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfYnlfYW5ubyAxOiB0cnVlIikKfQphbGxvd19ieV9hbm5vKHBfb2NpLCBpX29jaSwgcF9zdG9yYWdlcywgaV9zdG9yYWdlcykgewogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMjogc3RhcnQiKQoKICAgIHBfc19uYW1lIDo9IHBfb2NpLkFubm90YXRpb25zW1NfTkFNRV9LRVldCiAgICBpX3NfbmFtZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMjogaV9zX25hbWUgPSIsIGlfc19uYW1lLCAicF9zX25hbWUgPSIsIHBfc19uYW1lKQoKICAgIGFsbG93X3NhbmRib3hfbmFtZShwX3NfbmFtZSwgaV9zX25hbWUpCgogICAgaV9zX25hbWVzcGFjZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwcmludCgiYWxsb3dfYnlfYW5ubyAyOiBpX3NfbmFtZXNwYWNlID0iLCBpX3NfbmFtZXNwYWNlKQoKICAgIGFsbG93X2J5X3NhbmRib3hfbmFtZShwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMsIGlfc19uYW1lLCBpX3NfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd19ieV9hbm5vIDI6IHRydWUiKQp9CgphbGxvd19ieV9zYW5kYm94X25hbWUocF9vY2ksIGlfb2NpLCBwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfYnlfc2FuZGJveF9uYW1lOiBzdGFydCIpCgogICAgaV9uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FU1BBQ0VfS0VZXQoKICAgIGFsbG93X2J5X2NvbnRhaW5lcl90eXBlcyhwX29jaSwgaV9vY2ksIHNfbmFtZSwgaV9uYW1lc3BhY2UpCiAgICBhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZChwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpCiAgICBhbGxvd19wcm9jZXNzKHBfb2NpLlByb2Nlc3MsIGlfb2NpLlByb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpCgogICAgcHJpbnQoImFsbG93X2J5X3NhbmRib3hfbmFtZTogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfbmFtZShwX3NfbmFtZSwgaV9zX25hbWUpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X25hbWU6IHN0YXJ0IikKICAgIHJlZ2V4Lm1hdGNoKHBfc19uYW1lLCBpX3NfbmFtZSkKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9uYW1lOiB0cnVlIikKfQoKIyBDaGVjayB0aGF0IHRoZSAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLXR5cGUiIGFuZAojICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIiBhbm5vdGF0aW9ucyBkZXNpZ25hdGUgdGhlCiMgZXhwZWN0ZWQgdHlwZSAtIGVpdGhlciBhICJzYW5kYm94IiBvciBhICJjb250YWluZXIiLiBUaGVuLCB2YWxpZGF0ZQojIG90aGVyIGFubm90YXRpb25zIGJhc2VkIG9uIHRoZSBhY3R1YWwgInNhbmRib3giIG9yICJjb250YWluZXIiIHZhbHVlCiMgZnJvbSB0aGUgaW5wdXQgY29udGFpbmVyLgphbGxvd19ieV9jb250YWluZXJfdHlwZXMocF9vY2ksIGlfb2NpLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfYnlfY29udGFpbmVyX3R5cGVzOiBjaGVja2luZyBpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSIpCgogICAgY190eXBlIDo9ICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSIKICAgIAogICAgcF9jcmlfdHlwZSA6PSBwX29jaS5Bbm5vdGF0aW9uc1tjX3R5cGVdCiAgICBpX2NyaV90eXBlIDo9IGlfb2NpLkFubm90YXRpb25zW2NfdHlwZV0KICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZXM6IHBfY3JpX3R5cGUgPSIsIHBfY3JpX3R5cGUsICJpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgcF9jcmlfdHlwZSA9PSBpX2NyaV90eXBlCgogICAgYWxsb3dfYnlfY29udGFpbmVyX3R5cGUoaV9jcmlfdHlwZSwgcF9vY2ksIGlfb2NpLCBzX25hbWUsIHNfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZXM6IHRydWUiKQp9CgphbGxvd19ieV9jb250YWluZXJfdHlwZShpX2NyaV90eXBlLCBwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAxOiBpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgaV9jcmlfdHlwZSA9PSAic2FuZGJveCIKCiAgICBpX2thdGFfdHlwZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1siaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5jb250YWluZXJfdHlwZSJdCiAgICBwcmludCgiYWxsb3dfYnlfY29udGFpbmVyX3R5cGUgMTogaV9rYXRhX3R5cGUgPSIsIGlfa2F0YV90eXBlKQogICAgaV9rYXRhX3R5cGUgPT0gInBvZF9zYW5kYm94IgoKICAgIGFsbG93X3NhbmRib3hfY29udGFpbmVyX25hbWUocF9vY2ksIGlfb2NpKQogICAgYWxsb3dfc2FuZGJveF9uZXRfbmFtZXNwYWNlKHBfb2NpLCBpX29jaSkKICAgIGFsbG93X3NhbmRib3hfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpCgogICAgcHJpbnQoImFsbG93X2J5X2NvbnRhaW5lcl90eXBlIDE6IHRydWUiKQp9CgphbGxvd19ieV9jb250YWluZXJfdHlwZShpX2NyaV90eXBlLCBwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiBpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgaV9jcmlfdHlwZSA9PSAiY29udGFpbmVyIgoKICAgIGlfa2F0YV90eXBlIDo9IGlfb2NpLkFubm90YXRpb25zWyJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIl0KICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiBpX2thdGFfdHlwZSA9IiwgaV9rYXRhX3R5cGUpCiAgICBpX2thdGFfdHlwZSA9PSAicG9kX2NvbnRhaW5lciIKCiAgICBhbGxvd19jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpCiAgICBhbGxvd19uZXRfbmFtZXNwYWNlKHBfb2NpLCBpX29jaSkKICAgIGFsbG93X2xvZ19kaXJlY3RvcnkocF9vY2ksIGlfb2NpKQoKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiB0cnVlIikKfQoKIyAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLW5hbWUiIGFubm90YXRpb24KYWxsb3dfc2FuZGJveF9jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X2NvbnRhaW5lcl9uYW1lOiBzdGFydCIpCgogICAgY29udGFpbmVyX2Fubm90YXRpb25fbWlzc2luZyhwX29jaSwgaV9vY2ksICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItbmFtZSIpCgogICAgcHJpbnQoImFsbG93X3NhbmRib3hfY29udGFpbmVyX25hbWU6IHRydWUiKQp9CgphbGxvd19jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19jb250YWluZXJfbmFtZTogc3RhcnQiKQoKICAgIGFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uKHBfb2NpLCBpX29jaSwgImlvLmt1YmVybmV0ZXMuY3JpLmNvbnRhaW5lci1uYW1lIikKCiAgICBwcmludCgiYWxsb3dfY29udGFpbmVyX25hbWU6IHRydWUiKQp9Cgpjb250YWluZXJfYW5ub3RhdGlvbl9taXNzaW5nKHBfb2NpLCBpX29jaSwga2V5KSB7CiAgICBwcmludCgiY29udGFpbmVyX2Fubm90YXRpb25fbWlzc2luZzoiLCBrZXkpCgogICAgbm90IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIG5vdCBpX29jaS5Bbm5vdGF0aW9uc1trZXldCgogICAgcHJpbnQoImNvbnRhaW5lcl9hbm5vdGF0aW9uX21pc3Npbmc6IHRydWUiKQp9CgphbGxvd19jb250YWluZXJfYW5ub3RhdGlvbihwX29jaSwgaV9vY2ksIGtleSkgewogICAgcHJpbnQoImFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uOiBrZXkgPSIsIGtleSkKCiAgICBwX3ZhbHVlIDo9IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIGlfdmFsdWUgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgcHJpbnQoImFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uOiBwX3ZhbHVlID0iLCBwX3ZhbHVlLCAiaV92YWx1ZSA9IiwgaV92YWx1ZSkKCiAgICBwX3ZhbHVlID09IGlfdmFsdWUKCiAgICBwcmludCgiYWxsb3dfY29udGFpbmVyX2Fubm90YXRpb246IHRydWUiKQp9CgojICJuZXJkY3RsL25ldHdvcmstbmFtZXNwYWNlIiBhbm5vdGF0aW9uCmFsbG93X3NhbmRib3hfbmV0X25hbWVzcGFjZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X25ldF9uYW1lc3BhY2U6IHN0YXJ0IikKCiAgICBrZXkgOj0gIm5lcmRjdGwvbmV0d29yay1uYW1lc3BhY2UiCgogICAgcF9uYW1lc3BhY2UgOj0gcF9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgaV9uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgcHJpbnQoImFsbG93X3NhbmRib3hfbmV0X25hbWVzcGFjZTogcF9uYW1lc3BhY2UgPSIsIHBfbmFtZXNwYWNlLCAiaV9uYW1lc3BhY2UgPSIsIGlfbmFtZXNwYWNlKQoKICAgIHJlZ2V4Lm1hdGNoKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9uZXRfbmFtZXNwYWNlOiB0cnVlIikKfQoKYWxsb3dfbmV0X25hbWVzcGFjZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19uZXRfbmFtZXNwYWNlOiBzdGFydCIpCgogICAga2V5IDo9ICJuZXJkY3RsL25ldHdvcmstbmFtZXNwYWNlIgoKICAgIG5vdCBwX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICBub3QgaV9vY2kuQW5ub3RhdGlvbnNba2V5XQoKICAgIHByaW50KCJhbGxvd19uZXRfbmFtZXNwYWNlOiB0cnVlIikKfQoKIyAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1sb2ctZGlyZWN0b3J5IiBhbm5vdGF0aW9uCmFsbG93X3NhbmRib3hfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X2xvZ19kaXJlY3Rvcnk6IHN0YXJ0IikKCiAgICBrZXkgOj0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbG9nLWRpcmVjdG9yeSIKCiAgICBwX2RpciA6PSBwX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICByZWdleDEgOj0gcmVwbGFjZShwX2RpciwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHJlZ2V4MiA6PSByZXBsYWNlKHJlZ2V4MSwgIiQoc2FuZGJveC1uYW1lc3BhY2UpIiwgc19uYW1lc3BhY2UpCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiByZWdleDIgPSIsIHJlZ2V4MikKCiAgICBpX2RpciA6PSBpX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiBpX2RpciA9IiwgaV9kaXIpCgogICAgcmVnZXgubWF0Y2gocmVnZXgyLCBpX2RpcikKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiB0cnVlIikKfQoKYWxsb3dfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19sb2dfZGlyZWN0b3J5OiBzdGFydCIpCgogICAga2V5IDo9ICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWxvZy1kaXJlY3RvcnkiCgogICAgbm90IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIG5vdCBpX29jaS5Bbm5vdGF0aW9uc1trZXldCgogICAgcHJpbnQoImFsbG93X2xvZ19kaXJlY3Rvcnk6IHRydWUiKQp9CgphbGxvd19kZXZpY2VzKHBfZGV2aWNlcywgaV9kZXZpY2VzKSB7CiAgICBwcmludCgiYWxsb3dfZGV2aWNlczogc3RhcnQiKQogICAgZXZlcnkgaV9kZXZpY2UgaW4gaV9kZXZpY2VzIHsKICAgICAgICBwcmludCgiYWxsb3dfZGV2aWNlczogaV9kZXZpY2UgPSIsIGlfZGV2aWNlKQogICAgICAgIHNvbWUgcF9kZXZpY2UgaW4gcF9kZXZpY2VzCiAgICAgICAgcF9kZXZpY2UuY29udGFpbmVyX3BhdGggPT0gaV9kZXZpY2UuY29udGFpbmVyX3BhdGgKICAgIH0KICAgIHByaW50KCJhbGxvd19kZXZpY2VzOiB0cnVlIikKfQoKYWxsb3dfbGludXgoc3RhdGVfb3BzLCBwX29jaSwgaV9vY2kpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIHBfbmFtZXNwYWNlcyA6PSBwX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbGludXg6IHAgbmFtZXNwYWNlcyA9IiwgcF9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlcyA6PSBpX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbGludXg6IGkgbmFtZXNwYWNlcyA9IiwgaV9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlX3dpdGhvdXRfbmV0d29yayA6PSBbb2JqIHwgb2JqIDo9IGlfbmFtZXNwYWNlc1tfXTsgb2JqLlR5cGUgIT0gIm5ldHdvcmsiXQoKICAgIHByaW50KCJhbGxvd19saW51eDogaV9uYW1lc3BhY2Vfd2l0aG91dF9uZXR3b3JrID0iLCBpX25hbWVzcGFjZV93aXRob3V0X25ldHdvcmspCgogICAgcF9uYW1lc3BhY2VzID09IGlfbmFtZXNwYWNlX3dpdGhvdXRfbmV0d29yawoKICAgIGFsbG93X21hc2tlZF9wYXRocyhwX29jaSwgaV9vY2kpCiAgICBhbGxvd19yZWFkb25seV9wYXRocyhwX29jaSwgaV9vY2kpCiAgICBhbGxvd19saW51eF9kZXZpY2VzKHBfb2NpLkxpbnV4LkRldmljZXMsIGlfb2NpLkxpbnV4LkRldmljZXMpCiAgICBhbGxvd19saW51eF9zeXNjdGwocF9vY2kuTGludXgsIGlfb2NpLkxpbnV4KQogICAgcmV0IDo9IGFsbG93X25ldHdvcmtfbmFtZXNwYWNlX3N0YXJ0KHN0YXRlX29wcywgcF9vY2ksIGlfb2NpKQogICAgcmV0LmFsbG93ZWQKCiAgICBvcHMgOj0gcmV0Lm9wcwoKICAgIHByaW50KCJhbGxvd19saW51eDogdHJ1ZSIpCn0KCiMgUmV0cmlldmUgdGhlICJuZXR3b3JrIiBuYW1lc3BhY2UgZnJvbSB0aGUgaW5wdXQgZGF0YSBhbmQgcGFzcyBpdCBvbiBmb3IgdGhlCiMgbmV0d29yayBuYW1lc3BhY2UgcG9saWN5IGNoZWNrcy4KYWxsb3dfbmV0d29ya19uYW1lc3BhY2Vfc3RhcnQoc3RhdGVfb3BzLCBwX29jaSwgaV9vY2kpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIHByaW50KCJhbGxvd19uZXR3b3JrX25hbWVzcGFjZSBzdGFydDogc3RhcnQiKQoKICAgIHBfbmFtZXNwYWNlcyA6PSBwX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IHAgbmFtZXNwYWNlcyA9IiwgcF9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlcyA6PSBpX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IGkgbmFtZXNwYWNlcyA9IiwgaV9uYW1lc3BhY2VzKQoKICAgICMgUmV0dXJuIHBhdGggb2YgdGhlICJuZXR3b3JrIiBuYW1lc3BhY2UKICAgIG5ldHdvcmtfbnMgOj0gW29iaiB8IG9iaiA6PSBpX25hbWVzcGFjZXNbX107IG9iai5UeXBlID09ICJuZXR3b3JrIl0KCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IG5ldHdvcmtfbnMgPSIsIG5ldHdvcmtfbnMpCgogICAgcmV0IDo9IGFsbG93X25ldHdvcmtfbmFtZXNwYWNlKHN0YXRlX29wcywgbmV0d29ya19ucykKICAgIHJldC5hbGxvd2VkCgogICAgb3BzIDo9IHJldC5vcHMKfQoKIyBUaGlzIHJ1bGUgaXMgd2hlbiB0aGVyZSdzIG5vIG5ldHdvcmsgbmFtZXNwYWNlIGluIHRoZSBpbnB1dCBkYXRhLgphbGxvd19uZXR3b3JrX25hbWVzcGFjZShzdGF0ZV9vcHMsIG5ldHdvcmtfbnMpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIGNvdW50KG5ldHdvcmtfbnMpID09IDAKCiAgICBuZXR3b3JrX25zX3BhdGggPSAiIgoKICAgIGFkZF9uZXR3b3JrX25hbWVzcGFjZV90b19zdGF0ZSA6PSBzdGF0ZV9hbGxvd3MoIm5ldHdvcmtfbmFtZXNwYWNlIiwgbmV0d29ya19uc19wYXRoKQogICAgb3BzIDo9IGNvbmNhdF9vcF9pZl9ub3RfbnVsbChzdGF0ZV9vcHMsIGFkZF9uZXR3b3JrX25hbWVzcGFjZV90b19zdGF0ZSkKCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2UgMTogdHJ1ZSIpCn0KCiMgVGhpcyBydWxlIGlzIHdoZW4gdGhlcmUncyBleGFjdGx5IG9uZSBuZXR3b3JrIG5hbWVzcGFjZSBpbiB0aGUgaW5wdXQgZGF0YS4KYWxsb3dfbmV0d29ya19uYW1lc3BhY2Uoc3RhdGVfb3BzLCBuZXR3b3JrX25zKSA6PSB7Im9wcyI6IG9wcywgImFsbG93ZWQiOiB0cnVlfSB7CiAgICBjb3VudChuZXR3b3JrX25zKSA9PSAxCgogICAgYWRkX25ldHdvcmtfbmFtZXNwYWNlX3RvX3N0YXRlIDo9IHN0YXRlX2FsbG93cygibmV0d29ya19uYW1lc3BhY2UiLCBuZXR3b3JrX25zWzBdLlBhdGgpCiAgICBvcHMgOj0gY29uY2F0X29wX2lmX25vdF9udWxsKHN0YXRlX29wcywgYWRkX25ldHdvcmtfbmFtZXNwYWNlX3RvX3N0YXRlKQoKICAgIHByaW50KCJhbGxvd19uZXR3b3JrX25hbWVzcGFjZSAyOiB0cnVlIikKfQoKYWxsb3dfbWFza2VkX3BhdGhzKHBfb2NpLCBpX29jaSkgewogICAgcF9wYXRocyA6PSBwX29jaS5MaW51eC5NYXNrZWRQYXRocwogICAgcHJpbnQoImFsbG93X21hc2tlZF9wYXRocyAxOiBwX3BhdGhzID0iLCBwX3BhdGhzKQoKICAgIGlfcGF0aHMgOj0gaV9vY2kuTGludXguTWFza2VkUGF0aHMKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aHMgMTogaV9wYXRocyA9IiwgaV9wYXRocykKCiAgICBhbGxvd19tYXNrZWRfcGF0aHNfYXJyYXkocF9wYXRocywgaV9wYXRocykKCiAgICBwcmludCgiYWxsb3dfbWFza2VkX3BhdGhzIDE6IHRydWUiKQp9CmFsbG93X21hc2tlZF9wYXRocyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aHMgMjogc3RhcnQiKQoKICAgIG5vdCBwX29jaS5MaW51eC5NYXNrZWRQYXRocwogICAgbm90IGlfb2NpLkxpbnV4Lk1hc2tlZFBhdGhzCgogICAgcHJpbnQoImFsbG93X21hc2tlZF9wYXRocyAyOiB0cnVlIikKfQoKIyBBbGwgdGhlIHBvbGljeSBtYXNrZWQgcGF0aHMgbXVzdCBiZSBtYXNrZWQgaW4gdGhlIGlucHV0IGRhdGEgdG9vLgojIElucHV0IGlzIGFsbG93ZWQgdG8gaGF2ZSBtb3JlIG1hc2tlZCBwYXRocyB0aGFuIHRoZSBwb2xpY3kuCmFsbG93X21hc2tlZF9wYXRoc19hcnJheShwX2FycmF5LCBpX2FycmF5KSB7CiAgICBldmVyeSBwX2VsZW0gaW4gcF9hcnJheSB7CiAgICAgICAgYWxsb3dfbWFza2VkX3BhdGgocF9lbGVtLCBpX2FycmF5KQogICAgfQp9CgphbGxvd19tYXNrZWRfcGF0aChwX2VsZW0sIGlfYXJyYXkpIHsKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aDogcF9lbGVtID0iLCBwX2VsZW0pCgogICAgc29tZSBpX2VsZW0gaW4gaV9hcnJheQogICAgcF9lbGVtID09IGlfZWxlbQoKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aDogdHJ1ZSIpCn0KCmFsbG93X3JlYWRvbmx5X3BhdGhzKHBfb2NpLCBpX29jaSkgewogICAgcF9wYXRocyA6PSBwX29jaS5MaW51eC5SZWFkb25seVBhdGhzCiAgICBwcmludCgiYWxsb3dfcmVhZG9ubHlfcGF0aHMgMTogcF9wYXRocyA9IiwgcF9wYXRocykKCiAgICBpX3BhdGhzIDo9IGlfb2NpLkxpbnV4LlJlYWRvbmx5UGF0aHMKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAxOiBpX3BhdGhzID0iLCBpX3BhdGhzKQoKICAgIGFsbG93X3JlYWRvbmx5X3BhdGhzX2FycmF5KHBfcGF0aHMsIGlfcGF0aHMsIGlfb2NpLkxpbnV4Lk1hc2tlZFBhdGhzKQoKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAxOiB0cnVlIikKfQphbGxvd19yZWFkb25seV9wYXRocyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAyOiBzdGFydCIpCgogICAgbm90IHBfb2NpLkxpbnV4LlJlYWRvbmx5UGF0aHMKICAgIG5vdCBpX29jaS5MaW51eC5SZWFkb25seVBhdGhzCgogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGhzIDI6IHRydWUiKQp9CgojIEFsbCB0aGUgcG9saWN5IHJlYWRvbmx5IHBhdGhzIG11c3QgYmUgZWl0aGVyOgojIC0gUHJlc2VudCBpbiB0aGUgaW5wdXQgcmVhZG9ubHkgcGF0aHMsIG9yCiMgLSBQcmVzZW50IGluIHRoZSBpbnB1dCBtYXNrZWQgcGF0aHMuCiMgSW5wdXQgaXMgYWxsb3dlZCB0byBoYXZlIG1vcmUgcmVhZG9ubHkgcGF0aHMgdGhhbiB0aGUgcG9saWN5LgphbGxvd19yZWFkb25seV9wYXRoc19hcnJheShwX2FycmF5LCBpX2FycmF5LCBtYXNrZWRfcGF0aHMpIHsKICAgIGV2ZXJ5IHBfZWxlbSBpbiBwX2FycmF5IHsKICAgICAgICBhbGxvd19yZWFkb25seV9wYXRoKHBfZWxlbSwgaV9hcnJheSwgbWFza2VkX3BhdGhzKQogICAgfQp9CgphbGxvd19yZWFkb25seV9wYXRoKHBfZWxlbSwgaV9hcnJheSwgbWFza2VkX3BhdGhzKSB7CiAgICBwcmludCgiYWxsb3dfcmVhZG9ubHlfcGF0aCAxOiBwX2VsZW0gPSIsIHBfZWxlbSkKCiAgICBzb21lIGlfZWxlbSBpbiBpX2FycmF5CiAgICBwX2VsZW0gPT0gaV9lbGVtCgogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGggMTogdHJ1ZSIpCn0KYWxsb3dfcmVhZG9ubHlfcGF0aChwX2VsZW0sIGlfYXJyYXksIG1hc2tlZF9wYXRocykgewogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGggMjogcF9lbGVtID0iLCBwX2VsZW0pCgogICAgc29tZSBpX21hc2tlZCBpbiBtYXNrZWRfcGF0aHMKICAgIHBfZWxlbSA9PSBpX21hc2tlZAoKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRoIDI6IHRydWUiKQp9CgphbGxvd19saW51eF9kZXZpY2VzKHBfZGV2aWNlcywgaV9kZXZpY2VzKSB7CiAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogc3RhcnQiKQogICAgZXZlcnkgaV9kZXZpY2UgaW4gaV9kZXZpY2VzIHsKICAgICAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogaV9kZXZpY2UgPSIsIGlfZGV2aWNlKQogICAgICAgIHNvbWUgcF9kZXZpY2UgaW4gcF9kZXZpY2VzCiAgICAgICAgaV9kZXZpY2UuUGF0aCA9PSBwX2RldmljZS5QYXRoCiAgICB9CiAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogdHJ1ZSIpCn0KCmFsbG93X2xpbnV4X3N5c2N0bChwX2xpbnV4LCBpX2xpbnV4KSB7CiAgICBwcmludCgiYWxsb3dfbGludXhfc3lzY3RsIDE6IHN0YXJ0IikKICAgIG5vdCBpX2xpbnV4LlN5c2N0bAogICAgcHJpbnQoImFsbG93X2xpbnV4X3N5c2N0bCAxOiB0cnVlIikKfQoKYWxsb3dfbGludXhfc3lzY3RsKHBfbGludXgsIGlfbGludXgpIHsKICAgIHByaW50KCJhbGxvd19saW51eF9zeXNjdGwgMjogc3RhcnQiKQogICAgcF9zeXNjdGwgOj0gcF9saW51eC5TeXNjdGwKICAgIGlfc3lzY3RsIDo9IGlfbGludXguU3lzY3RsCiAgICBldmVyeSBpX25hbWUsIGlfdmFsIGluIGlfc3lzY3RsIHsKICAgICAgICBwcmludCgiYWxsb3dfbGludXhfc3lzY3RsIDI6IGlfbmFtZSA9IiwgaV9uYW1lLCAiaV92YWwgPSIsIGlfdmFsKQogICAgICAgIHBfc3lzY3RsW2lfbmFtZV0gPT0gaV92YWwKICAgIH0KICAgIHByaW50KCJhbGxvd19saW51eF9zeXNjdGwgMjogdHJ1ZSIpCn0KCiMgQ2hlY2sgdGhlIGNvbnNpc3RlbmN5IG9mIHRoZSBpbnB1dCAiaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5idW5kbGVfcGF0aCIKIyBhbmQgaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCIgdmFsdWVzIHdpdGggb3RoZXIgZmllbGRzLgphbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZChwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpIHsKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogc3RhcnQiKQoKICAgIGJ1bmRsZV9wYXRoIDo9IGlfb2NpLkFubm90YXRpb25zWyJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmJ1bmRsZV9wYXRoIl0KICAgIGJ1bmRsZV9pZCA6PSByZXBsYWNlKGJ1bmRsZV9wYXRoLCAiL3J1bi9jb250YWluZXJkL2lvLmNvbnRhaW5lcmQucnVudGltZS52Mi50YXNrL2s4cy5pby8iLCAiIikKCiAgICBidW5kbGVfaWRfZm9ybWF0IDo9IGNvbmNhdCgiIiwgWyJeIiwgQlVORExFX0lELCAiJCJdKQogICAgcmVnZXgubWF0Y2goYnVuZGxlX2lkX2Zvcm1hdCwgYnVuZGxlX2lkKQoKICAgIGtleSA6PSAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCIKCiAgICBwX3JlZ2V4IDo9IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIHNhbmRib3hfaWQgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQoKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogc2FuZGJveF9pZCA9Iiwgc2FuZGJveF9pZCwgInJlZ2V4ID0iLCBwX3JlZ2V4KQogICAgcmVnZXgubWF0Y2gocF9yZWdleCwgc2FuZGJveF9pZCkKCiAgICBhbGxvd19yb290X3BhdGgocF9vY2ksIGlfb2NpLCBidW5kbGVfaWQpCgogICAgZXZlcnkgaV9tb3VudCBpbiBpX29jaS5Nb3VudHMgewogICAgICAgIGFsbG93X21vdW50KHBfb2NpLCBpX21vdW50LCBpX3N0b3JhZ2VzLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpCiAgICB9CgogICAgYWxsb3dfc3RvcmFnZXMocF9zdG9yYWdlcywgaV9zdG9yYWdlcywgYnVuZGxlX2lkLCBzYW5kYm94X2lkKQoKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogdHJ1ZSIpCn0KCmFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHBfcHJvY2VzcyA9IiwgcF9wcm9jZXNzKQogICAgcHJpbnQoImFsbG93X3Byb2Nlc3NfY29tbW9uOiBpX3Byb2Nlc3MgPSAiLCBpX3Byb2Nlc3MpCiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHNfbmFtZSA9Iiwgc19uYW1lKQoKICAgIHBfcHJvY2Vzcy5Dd2QgPT0gaV9wcm9jZXNzLkN3ZAogICAgcF9wcm9jZXNzLk5vTmV3UHJpdmlsZWdlcyA9PSBpX3Byb2Nlc3MuTm9OZXdQcml2aWxlZ2VzCgogICAgYWxsb3dfdXNlcihwX3Byb2Nlc3MsIGlfcHJvY2VzcykKICAgIGFsbG93X2VudihwX3Byb2Nlc3MsIGlfcHJvY2Vzcywgc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHRydWUiKQp9CgojIENvbXBhcmUgdGhlIE9DSSBQcm9jZXNzIGZpZWxkIG9mIGEgcG9saWN5IGNvbnRhaW5lciB3aXRoIHRoZSBpbnB1dCBPQ0kgUHJvY2VzcyBmcm9tIGEgQ3JlYXRlQ29udGFpbmVyUmVxdWVzdAphbGxvd19wcm9jZXNzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfcHJvY2Vzczogc3RhcnQiKQoKICAgIGFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgYWxsb3dfY2FwcyhwX3Byb2Nlc3MuQ2FwYWJpbGl0aWVzLCBpX3Byb2Nlc3MuQ2FwYWJpbGl0aWVzKQogICAgcF9wcm9jZXNzLlRlcm1pbmFsID09IGlfcHJvY2Vzcy5UZXJtaW5hbAoKICAgIHByaW50KCJhbGxvd19wcm9jZXNzOiB0cnVlIikKfQoKIyBDb21wYXJlIHRoZSBPQ0kgUHJvY2VzcyBmaWVsZCBvZiBhIHBvbGljeSBjb250YWluZXIgd2l0aCB0aGUgaW5wdXQgcHJvY2VzcyBmaWVsZCBmcm9tIEV4ZWNQcm9jZXNzUmVxdWVzdAphbGxvd19pbnRlcmFjdGl2ZV9wcm9jZXNzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfaW50ZXJhY3RpdmVfcHJvY2Vzczogc3RhcnQiKQoKICAgIGFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgYWxsb3dfZXhlY19jYXBzKGlfcHJvY2Vzcy5DYXBhYmlsaXRpZXMpCgogICAgIyBUaGVzZSBhcmUgY29tbWFuZHMgZW5hYmxlZCB1c2luZyBFeGVjUHJvY2Vzc1JlcXVlc3QgY29tbWFuZHMgYW5kL29yIHJlZ2V4IGZyb20gdGhlIHNldHRpbmdzIGZpbGUuCiAgICAjIFRoZXkgY2FuIGJlIGV4ZWN1dGVkIGludGVyYWN0aXZlbHkgc28gYWxsb3cgdGhlbSB0byB1c2UgYW55IHZhbHVlIGZvciBpX3Byb2Nlc3MuVGVybWluYWwuCgogICAgcHJpbnQoImFsbG93X2ludGVyYWN0aXZlX3Byb2Nlc3M6IHRydWUiKQp9CgojIENvbXBhcmUgdGhlIE9DSSBQcm9jZXNzIGZpZWxkIG9mIGEgcG9saWN5IGNvbnRhaW5lciB3aXRoIHRoZSBpbnB1dCBwcm9jZXNzIGZpZWxkIGZyb20gRXhlY1Byb2Nlc3NSZXF1ZXN0CmFsbG93X3Byb2JlX3Byb2Nlc3MocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19wcm9iZV9wcm9jZXNzOiBzdGFydCIpCgogICAgYWxsb3dfcHJvY2Vzc19jb21tb24ocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpCiAgICBhbGxvd19leGVjX2NhcHMoaV9wcm9jZXNzLkNhcGFiaWxpdGllcykKICAgIHBfcHJvY2Vzcy5UZXJtaW5hbCA9PSBpX3Byb2Nlc3MuVGVybWluYWwKCiAgICBwcmludCgiYWxsb3dfcHJvYmVfcHJvY2VzczogdHJ1ZSIpCn0KCmFsbG93X3VzZXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MpIHsKICAgIHBfdXNlciA6PSBwX3Byb2Nlc3MuVXNlcgogICAgaV91c2VyIDo9IGlfcHJvY2Vzcy5Vc2VyCgogICAgcHJpbnQoImFsbG93X3VzZXI6IGlucHV0IHVpZCA9IiwgaV91c2VyLlVJRCwgInBvbGljeSB1aWQgPSIsIHBfdXNlci5VSUQpCiAgICBwX3VzZXIuVUlEID09IGlfdXNlci5VSUQKCiAgICAjIFRPRE86IHRyYWNrIGRvd24gdGhlIHJlYXNvbiBmb3IgcmVnaXN0cnkuazhzLmlvL3BhdXNlOjMuOSBiZWluZwogICAgIyAgICAgICBleGVjdXRlZCB3aXRoIGdpZCA9IDAgZGVzcGl0ZSBoYXZpbmcgIjY1NTM1OjY1NTM1IiBpbiBpdHMgY29udGFpbmVyIGltYWdlCiAgICAjICAgICAgIGNvbmZpZy4KICAgICNwcmludCgiYWxsb3dfdXNlcjogaW5wdXQgZ2lkID0iLCBpX3VzZXIuR0lELCAicG9saWN5IGdpZCA9IiwgcF91c2VyLkdJRCkKICAgICNwX3VzZXIuR0lEID09IGlfdXNlci5HSUQKCiAgICAjIFRPRE86IGNvbXBhcmUgdGhlIGFkZGl0aW9uYWxHaWRzIGZpZWxkIHRvbyBhZnRlciBjb21wdXRpbmcgaXRzIHZhbHVlCiAgICAjIGJhc2VkIG9uIC9ldGMvcGFzc3dkIGFuZCAvZXRjL2dyb3VwIGZyb20gdGhlIGNvbnRhaW5lciBpbWFnZS4KfQoKYWxsb3dfZGVwcmVjYXRlZF9hcmdzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZ3MgMTogbm8gYXJncyIpCgogICAgbm90IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJncwogICAgbm90IGlfcHJvY2Vzcy5BcmdzCgogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAxOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZ3MocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSkgewogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiBwb2xpY3kgYXJncyA9IiwgcF9wcm9jZXNzLkRlcHJlY2F0ZWRBcmdzKQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiBpbnB1dCBhcmdzID0iLCBpX3Byb2Nlc3MuQXJncykKCiAgICBjb3VudChwX3Byb2Nlc3MuRGVwcmVjYXRlZEFyZ3MpID09IGNvdW50KGlfcHJvY2Vzcy5BcmdzKQoKICAgIGV2ZXJ5IGksIGlfYXJnIGluIGlfcHJvY2Vzcy5BcmdzIHsKICAgICAgICBhbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpCiAgICB9CgogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDE6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgcF9hcmcyIDo9IHJlcGxhY2UocF9hcmcsICIkJCIsICIkIikKICAgIHBfYXJnMiA9PSBpX2FyZwoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAxOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDI6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgIyBUT0RPOiBjYW4gJChub2RlLW5hbWUpIGJlIGhhbmRsZWQgYmV0dGVyPwogICAgY29udGFpbnMocF9hcmcsICIkKG5vZGUtbmFtZSkiKQoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAyOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDM6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgcF9hcmcyIDo9IHJlcGxhY2UocF9hcmcsICIkJCIsICIkIikKICAgIHBfYXJnMyA6PSByZXBsYWNlKHBfYXJnMiwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAzOiBwX2FyZzMgPSIsIHBfYXJnMykKICAgIHBfYXJnMyA9PSBpX2FyZwoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAzOiB0cnVlIikKfQoKIyBPQ0kgcHJvY2Vzcy5FbnYgZmllbGQKYWxsb3dfZW52KHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfZW52OiBwIGVudiA9IiwgcF9wcm9jZXNzLkVudikKICAgIHByaW50KCJhbGxvd19lbnY6IGkgZW52ID0iLCBpX3Byb2Nlc3MuRW52KQoKICAgIGV2ZXJ5IGlfdmFyIGluIGlfcHJvY2Vzcy5FbnYgewogICAgICAgIHByaW50KCJhbGxvd19lbnY6IGlfdmFyID0iLCBpX3ZhcikKICAgICAgICBhbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgfQoKICAgIHByaW50KCJhbGxvd19lbnY6IHRydWUiKQp9CgojIEFsbG93IGlucHV0IGVudiB2YXJpYWJsZXMgdGhhdCBhcmUgcHJlc2VudCBpbiB0aGUgcG9saWN5IGRhdGEgdG9vLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHBfdmFyID09IGlfdmFyCiAgICBwcmludCgiYWxsb3dfdmFyIDE6IHRydWUiKQp9CgojIE1hdGNoIGlucHV0IHdpdGggb25lIG9mIHRoZSBwb2xpY3kgdmFyaWFibGVzLCBhZnRlciBzdWJzdGl0dXRpbmcgJChzYW5kYm94LW5hbWUpLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHByaW50KCJhbGxvd192YXIgMjogcF92YXIgPSIsIHBfdmFyKQoKICAgIHBfdmFyX3NwbGl0IDo9IHNwbGl0KHBfdmFyLCAiPSIpCiAgICBjb3VudChwX3Zhcl9zcGxpdCkgPT0gMgoKICAgIHBfdmFyX3NwbGl0WzFdID09ICIkKHNhbmRib3gtbmFtZSkiCgogICAgaV92YXJfc3BsaXQgOj0gc3BsaXQoaV92YXIsICI9IikKICAgIGNvdW50KGlfdmFyX3NwbGl0KSA9PSAyCgogICAgaV92YXJfc3BsaXRbMF0gPT0gcF92YXJfc3BsaXRbMF0KICAgIHJlZ2V4Lm1hdGNoKHNfbmFtZSwgaV92YXJfc3BsaXRbMV0pCgogICAgcHJpbnQoImFsbG93X3ZhciAyOiB0cnVlIikKfQoKIyBBbGxvdyBpbnB1dCBlbnYgdmFyaWFibGVzIHRoYXQgbWF0Y2ggd2l0aCBhIHJlcXVlc3RfZGVmYXVsdHMgcmVnZXguCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHNvbWUgcF9yZWdleDEgaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5DcmVhdGVDb250YWluZXJSZXF1ZXN0LmFsbG93X2Vudl9yZWdleAogICAgcF9yZWdleDIgOj0gcmVwbGFjZShwX3JlZ2V4MSwgIiQoaXB2NF9hKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcHY0X2EpCiAgICBwX3JlZ2V4MyA6PSByZXBsYWNlKHBfcmVnZXgyLCAiJChpcF9wKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcF9wKQogICAgcF9yZWdleDQgOj0gcmVwbGFjZShwX3JlZ2V4MywgIiQoc3ZjX25hbWUpIiwgcG9saWN5X2RhdGEuY29tbW9uLnN2Y19uYW1lKQogICAgcF9yZWdleDUgOj0gcmVwbGFjZShwX3JlZ2V4NCwgIiQoZG5zX2xhYmVsKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5kbnNfbGFiZWwpCgogICAgcHJpbnQoImFsbG93X3ZhciAzOiBwX3JlZ2V4NSA9IiwgcF9yZWdleDUpCiAgICByZWdleC5tYXRjaChwX3JlZ2V4NSwgaV92YXIpCgogICAgcHJpbnQoImFsbG93X3ZhciAzOiB0cnVlIikKfQoKIyBBbGxvdyBmaWVsZFJlZiAiZmllbGRQYXRoOiBzdGF0dXMucG9kSVAiIHZhbHVlcy4KYWxsb3dfdmFyKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBpX3Zhciwgc19uYW1lLCBzX25hbWVzcGFjZSkgewogICAgbmFtZV92YWx1ZSA6PSBzcGxpdChpX3ZhciwgIj0iKQogICAgY291bnQobmFtZV92YWx1ZSkgPT0gMgogICAgaXNfaXAobmFtZV92YWx1ZVsxXSkKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIGFsbG93X3BvZF9pcF92YXIobmFtZV92YWx1ZVswXSwgcF92YXIpCgogICAgcHJpbnQoImFsbG93X3ZhciA0OiB0cnVlIikKfQoKIyBBbGxvdyBjb21tb24gZmllbGRSZWYgdmFyaWFibGVzLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBuYW1lX3ZhbHVlIDo9IHNwbGl0KGlfdmFyLCAiPSIpCiAgICBjb3VudChuYW1lX3ZhbHVlKSA9PSAyCgogICAgc29tZSBwX3ZhciBpbiBwX3Byb2Nlc3MuRW52CiAgICBwX25hbWVfdmFsdWUgOj0gc3BsaXQocF92YXIsICI9IikKICAgIGNvdW50KHBfbmFtZV92YWx1ZSkgPT0gMgoKICAgIHBfbmFtZV92YWx1ZVswXSA9PSBuYW1lX3ZhbHVlWzBdCgogICAgIyBUT0RPOiBzaG91bGQgdGhlc2UgYmUgaGFuZGxlZCBpbiBhIGRpZmZlcmVudCB3YXk/CiAgICBhbHdheXNfYWxsb3dlZCA6PSBbIiQoaG9zdC1uYW1lKSIsICIkKG5vZGUtbmFtZSkiLCAiJChwb2QtdWlkKSJdCiAgICBzb21lIGFsbG93ZWQgaW4gYWx3YXlzX2FsbG93ZWQKICAgIGNvbnRhaW5zKHBfbmFtZV92YWx1ZVsxXSwgYWxsb3dlZCkKCiAgICBwcmludCgiYWxsb3dfdmFyIDU6IHRydWUiKQp9CgojIEFsbG93IGZpZWxkUmVmICJmaWVsZFBhdGg6IHN0YXR1cy5ob3N0SVAiIHZhbHVlcy4KYWxsb3dfdmFyKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBpX3Zhciwgc19uYW1lLCBzX25hbWVzcGFjZSkgewogICAgbmFtZV92YWx1ZSA6PSBzcGxpdChpX3ZhciwgIj0iKQogICAgY291bnQobmFtZV92YWx1ZSkgPT0gMgogICAgaXNfaXAobmFtZV92YWx1ZVsxXSkKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIGFsbG93X2hvc3RfaXBfdmFyKG5hbWVfdmFsdWVbMF0sIHBfdmFyKQoKICAgIHByaW50KCJhbGxvd192YXIgNjogdHJ1ZSIpCn0KCiMgQWxsb3cgcmVzb3VyY2VGaWVsZFJlZiB2YWx1ZXMgKGUuZy4sICJsaW1pdHMuY3B1IikuCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIG5hbWVfdmFsdWUgOj0gc3BsaXQoaV92YXIsICI9IikKICAgIGNvdW50KG5hbWVfdmFsdWUpID09IDIKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHBfbmFtZV92YWx1ZSA6PSBzcGxpdChwX3ZhciwgIj0iKQogICAgY291bnQocF9uYW1lX3ZhbHVlKSA9PSAyCgogICAgcF9uYW1lX3ZhbHVlWzBdID09IG5hbWVfdmFsdWVbMF0KCiAgICAjIGEgdmFyaWFibGUgd2Ugc2hvdWxkIGJlIHZhbGlkYXRpbmcgdXNpbmcgYSByZWdleCBmcm9tIHNldHRpbmdzCiAgICBwX25hbWVfdmFsdWVbMV0gPT0gIiQodmFsaWRhdGUtZnJvbS1zZXR0aW5ncykiCgogICAgcmVnZXhfdmFsIDo9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuQ3JlYXRlQ29udGFpbmVyUmVxdWVzdC5hbGxvd19lbnZfcmVnZXhfbWFwW25hbWVfdmFsdWVbMF1dCgogICAgcHJpbnQoImFsbG93X3ZhciA3OiB2YWwgPSIsIG5hbWVfdmFsdWVbMV0pCiAgICBwcmludCgiYWxsb3dfdmFyIDc6IHJlZ2V4X3ZhbCA9IiwgcmVnZXhfdmFsKQoKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4X3ZhbCwgbmFtZV92YWx1ZVsxXSkKCiAgICBwcmludCgiYWxsb3dfdmFyIDc6IHRydWUiKQp9CgojIE1hdGNoIGlucHV0IHdpdGggb25lIG9mIHRoZSBwb2xpY3kgdmFyaWFibGVzLCBhZnRlciBzdWJzdGl0dXRpbmcgJChzYW5kYm94LW5hbWVzcGFjZSkuCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHNvbWUgcF92YXIgaW4gcF9wcm9jZXNzLkVudgogICAgcF92YXIyIDo9IHJlcGxhY2UocF92YXIsICIkKHNhbmRib3gtbmFtZXNwYWNlKSIsIHNfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd192YXIgODogcF92YXIyID0iLCBwX3ZhcjIpCiAgICBwX3ZhcjIgPT0gaV92YXIKCiAgICBwcmludCgiYWxsb3dfdmFyIDg6IHRydWUiKQp9CgphbGxvd19wb2RfaXBfdmFyKHZhcl9uYW1lLCBwX3ZhcikgewogICAgcHJpbnQoImFsbG93X3BvZF9pcF92YXI6IHZhcl9uYW1lID0iLCB2YXJfbmFtZSwgInBfdmFyID0iLCBwX3ZhcikKCiAgICBwX25hbWVfdmFsdWUgOj0gc3BsaXQocF92YXIsICI9IikKICAgIGNvdW50KHBfbmFtZV92YWx1ZSkgPT0gMgoKICAgIHBfbmFtZV92YWx1ZVswXSA9PSB2YXJfbmFtZQogICAgcF9uYW1lX3ZhbHVlWzFdID09ICIkKHBvZC1pcCkiCgogICAgcHJpbnQoImFsbG93X3BvZF9pcF92YXI6IHRydWUiKQp9CgphbGxvd19ob3N0X2lwX3Zhcih2YXJfbmFtZSwgcF92YXIpIHsKICAgIHByaW50KCJhbGxvd19ob3N0X2lwX3ZhcjogdmFyX25hbWUgPSIsIHZhcl9uYW1lLCAicF92YXIgPSIsIHBfdmFyKQoKICAgIHBfbmFtZV92YWx1ZSA6PSBzcGxpdChwX3ZhciwgIj0iKQogICAgY291bnQocF9uYW1lX3ZhbHVlKSA9PSAyCgogICAgcF9uYW1lX3ZhbHVlWzBdID09IHZhcl9uYW1lCiAgICBwX25hbWVfdmFsdWVbMV0gPT0gIiQoaG9zdC1pcCkiCgogICAgcHJpbnQoImFsbG93X2hvc3RfaXBfdmFyOiB0cnVlIikKfQoKaXNfaXAodmFsdWUpIHsKICAgIGJ5dGVzID0gc3BsaXQodmFsdWUsICIuIikKICAgIGNvdW50KGJ5dGVzKSA9PSA0CgogICAgaXNfaXBfZmlyc3RfYnl0ZShieXRlc1swXSkKICAgIGlzX2lwX290aGVyX2J5dGUoYnl0ZXNbMV0pCiAgICBpc19pcF9vdGhlcl9ieXRlKGJ5dGVzWzJdKQogICAgaXNfaXBfb3RoZXJfYnl0ZShieXRlc1szXSkKfQppc19pcF9maXJzdF9ieXRlKGNvbXBvbmVudCkgewogICAgbnVtYmVyID0gdG9fbnVtYmVyKGNvbXBvbmVudCkKICAgIG51bWJlciA+PSAxCiAgICBudW1iZXIgPD0gMjU1Cn0KaXNfaXBfb3RoZXJfYnl0ZShjb21wb25lbnQpIHsKICAgIG51bWJlciA9IHRvX251bWJlcihjb21wb25lbnQpCiAgICBudW1iZXIgPj0gMAogICAgbnVtYmVyIDw9IDI1NQp9CgojIE9DSSByb290LlBhdGgKYWxsb3dfcm9vdF9wYXRoKHBfb2NpLCBpX29jaSwgYnVuZGxlX2lkKSB7CiAgICBpX3BhdGggOj0gaV9vY2kuUm9vdC5QYXRoCiAgICBwX3BhdGgxIDo9IHBfb2NpLlJvb3QuUGF0aAogICAgcHJpbnQoImFsbG93X3Jvb3RfcGF0aDogaV9wYXRoID0iLCBpX3BhdGgsICJwX3BhdGgxID0iLCBwX3BhdGgxKQoKICAgIHBfcGF0aDIgOj0gcmVwbGFjZShwX3BhdGgxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfcm9vdF9wYXRoOiBwX3BhdGgyID0iLCBwX3BhdGgyKQoKICAgIHBfcGF0aDMgOj0gcmVwbGFjZShwX3BhdGgyLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X3Jvb3RfcGF0aDogcF9wYXRoMyA9IiwgcF9wYXRoMykKCiAgICBwX3BhdGgzID09IGlfcGF0aAoKICAgIHByaW50KCJhbGxvd19yb290X3BhdGg6IHRydWUiKQp9CgojIGRldmljZSBtb3VudHMKYWxsb3dfbW91bnQocF9vY2ksIGlfbW91bnQsIGlfc3RvcmFnZXMsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcHJpbnQoImFsbG93X21vdW50OiBpX21vdW50ID0iLCBpX21vdW50KQoKICAgIHNvbWUgcF9tb3VudCBpbiBwX29jaS5Nb3VudHMKICAgIHNvbWUgaV9zdG9yYWdlIGluIGlfc3RvcmFnZXMKCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IHBfbW91bnQgPSIsIHBfbW91bnQpCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IGlfc3RvcmFnZSA9IiwgaV9zdG9yYWdlKQoKICAgIGNoZWNrX21vdW50KHBfbW91bnQsIGlfbW91bnQsIGlfc3RvcmFnZSwgYnVuZGxlX2lkLCBzYW5kYm94X2lkKQoKICAgICMgVE9ETzogYXJlIHRoZXJlIGFueSBvdGhlciByZXF1aXJlZCBwb2xpY3kgY2hlY2tzIGZvciBtb3VudHMgLSBlLmcuLAogICAgIyAgICAgICBtdWx0aXBsZSBtb3VudHMgd2l0aCBzYW1lIHNvdXJjZSBvciBkZXN0aW5hdGlvbj8KCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IHRydWUiKQp9CgpjaGVja19tb3VudChwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcF9tb3VudCA9PSBpX21vdW50CiAgICBwcmludCgiY2hlY2tfbW91bnQgMTogdHJ1ZSIpCn0KY2hlY2tfbW91bnQocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHBfbW91bnQuZGVzdGluYXRpb24gPT0gaV9tb3VudC5kZXN0aW5hdGlvbgogICAgcF9tb3VudC50eXBlXyA9PSBpX21vdW50LnR5cGVfCiAgICBwX21vdW50Lm9wdGlvbnMgPT0gaV9tb3VudC5vcHRpb25zCgogICAgbW91bnRfc291cmNlX2FsbG93cyhwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkKCiAgICBwcmludCgiY2hlY2tfbW91bnQgMjogdHJ1ZSIpCn0KCm1vdW50X3NvdXJjZV9hbGxvd3MocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHJlZ2V4MSA6PSBwX21vdW50LnNvdXJjZQogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5tb3VudF9zb3VyY2VfY3BhdGgpCiAgICByZWdleDQgOj0gcmVwbGFjZShyZWdleDMsICIkKGJ1bmRsZS1pZCkiLCBidW5kbGVfaWQpCgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMTogcmVnZXg0ID0iLCByZWdleDQpCiAgICByZWdleC5tYXRjaChyZWdleDQsIGlfbW91bnQuc291cmNlKQoKICAgIHByaW50KCJtb3VudF9zb3VyY2VfYWxsb3dzIDE6IHRydWUiKQp9Cm1vdW50X3NvdXJjZV9hbGxvd3MocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHJlZ2V4MSA6PSBwX21vdW50LnNvdXJjZQogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5tb3VudF9zb3VyY2VfY3BhdGgpCiAgICByZWdleDQgOj0gcmVwbGFjZShyZWdleDMsICIkKHNhbmRib3gtaWQpIiwgc2FuZGJveF9pZCkKCiAgICBwcmludCgibW91bnRfc291cmNlX2FsbG93cyAyOiByZWdleDQgPSIsIHJlZ2V4NCkKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4NCwgaV9tb3VudC5zb3VyY2UpCgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMjogdHJ1ZSIpCn0KbW91bnRfc291cmNlX2FsbG93cyhwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogaV9tb3VudC5zb3VyY2UgPSIsIGlfbW91bnQuc291cmNlKQogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogaV9zdG9yYWdlLm1vdW50X3BvaW50ID0iLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCgogICAgaV9tb3VudC5zb3VyY2UgPT0gaV9zdG9yYWdlLm1vdW50X3BvaW50CgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogdHJ1ZSIpCn0KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBDcmVhdGUgY29udGFpbmVyIFN0b3JhZ2VzCgphbGxvd19zdG9yYWdlcyhwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHBfY291bnQgOj0gY291bnQocF9zdG9yYWdlcykKICAgIGlfY291bnQgOj0gY291bnQoaV9zdG9yYWdlcykKICAgIHByaW50KCJhbGxvd19zdG9yYWdlczogcF9jb3VudCA9IiwgcF9jb3VudCwgImlfY291bnQgPSIsIGlfY291bnQpCgogICAgcF9jb3VudCA9PSBpX2NvdW50CgogICAgIyBHZXQgdGhlIGNvbnRhaW5lciBpbWFnZSBsYXllciBJRHMgYW5kIHZlcml0eSByb290IGhhc2hlcywgZnJvbSB0aGUgIm92ZXJsYXlmcyIgc3RvcmFnZS4KICAgIHNvbWUgb3ZlcmxheV9zdG9yYWdlIGluIHBfc3RvcmFnZXMKICAgIG92ZXJsYXlfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIHByaW50KCJhbGxvd19zdG9yYWdlczogb3ZlcmxheV9zdG9yYWdlID0iLCBvdmVybGF5X3N0b3JhZ2UpCiAgICBjb3VudChvdmVybGF5X3N0b3JhZ2Uub3B0aW9ucykgPT0gMgoKICAgIGxheWVyX2lkcyA6PSBzcGxpdChvdmVybGF5X3N0b3JhZ2Uub3B0aW9uc1swXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiBsYXllcl9pZHMgPSIsIGxheWVyX2lkcykKCiAgICByb290X2hhc2hlcyA6PSBzcGxpdChvdmVybGF5X3N0b3JhZ2Uub3B0aW9uc1sxXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiByb290X2hhc2hlcyA9Iiwgcm9vdF9oYXNoZXMpCgogICAgZXZlcnkgaV9zdG9yYWdlIGluIGlfc3RvcmFnZXMgewogICAgICAgIGFsbG93X3N0b3JhZ2UocF9zdG9yYWdlcywgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpCiAgICB9CgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiB0cnVlIikKfQoKYWxsb3dfc3RvcmFnZShwX3N0b3JhZ2VzLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgc29tZSBwX3N0b3JhZ2UgaW4gcF9zdG9yYWdlcwoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiBwX3N0b3JhZ2UgPSIsIHBfc3RvcmFnZSkKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiBpX3N0b3JhZ2UgPSIsIGlfc3RvcmFnZSkKCiAgICBwX3N0b3JhZ2UuZHJpdmVyICAgICAgICAgICA9PSBpX3N0b3JhZ2UuZHJpdmVyCiAgICBwX3N0b3JhZ2UuZHJpdmVyX29wdGlvbnMgICA9PSBpX3N0b3JhZ2UuZHJpdmVyX29wdGlvbnMKICAgIHBfc3RvcmFnZS5mc19ncm91cCAgICAgICAgID09IGlfc3RvcmFnZS5mc19ncm91cAogICAgcF9zdG9yYWdlLmZzdHlwZSAgICAgICAgICAgPT0gaV9zdG9yYWdlLmZzdHlwZQoKICAgIGFsbG93X3N0b3JhZ2Vfc291cmNlKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKQogICAgYWxsb3dfc3RvcmFnZV9vcHRpb25zKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKQogICAgYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKQoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiB0cnVlIikKfQoKYWxsb3dfc3RvcmFnZV9zb3VyY2UocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX3NvdXJjZSAxOiBzdGFydCIpCgogICAgcF9zdG9yYWdlLnNvdXJjZSA9PSBpX3N0b3JhZ2Uuc291cmNlCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDE6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX3NvdXJjZShwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDI6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCgogICAgIyBEREREOkJCOkRELkY6IERvbWFpbjpCdXM6RGV2aWNlLkZ1bmN0aW9uCiAgICAjIGh0dHBzOi8vd3d3Lmtlcm5lbC5vcmcvZG9jL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtYnVzLXBjaQogICAgcmVnZXgubWF0Y2goYF5bYS1mMC05XXs0fTpbYS1mMC05XXsyfTpbYS1mMC05XXsyfVwuW2EtZjAtOV0kYCwgaV9zdG9yYWdlLnNvdXJjZSkKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9zb3VyY2UgMjogdHJ1ZSIpCn0KCmFsbG93X3N0b3JhZ2Vfc291cmNlKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKSB7CiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9zb3VyY2UgMzogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIGlfc3RvcmFnZS5zb3VyY2UgPT0gIm5vbmUiCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDM6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX3NvdXJjZShwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDQ6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJzbWIiCgogICAgIyBQYXR0ZXJuOiAvLzxzdG9yYWdlLWFjY291bnQtbmFtZT4uZmlsZS5jb3JlLndpbmRvd3MubmV0LzxrOHMtUFZDLW5hbWU+CiAgICAjIFN0b3JhZ2UgYWNjb3VudCBuYW1lOiBodHRwczovL2xlYXJuLm1pY3Jvc29mdC5jb20vZW4tdXMvYXp1cmUvc3RvcmFnZS9jb21tb24vc3RvcmFnZS1hY2NvdW50LW92ZXJ2aWV3I3N0b3JhZ2UtYWNjb3VudC1uYW1lCiAgICAjIEs4cyBQVkMgbmFtZTogaHR0cHM6Ly9rdWJlcm5ldGVzLmlvL2RvY3MvY29uY2VwdHMvb3ZlcnZpZXcvd29ya2luZy13aXRoLW9iamVjdHMvbmFtZXMvI2Rucy1zdWJkb21haW4tbmFtZXMKICAgIHJlZ2V4Lm1hdGNoKGBeXC9cLyhbYS16MC05XXszLDI0fSlcLmZpbGVcLmNvcmVcLndpbmRvd3NcLm5ldFwvW2EtejAtOV0oW2EtejAtOS4tXXswLDI1MX1bYS16MC05XSk/JGAsIGlfc3RvcmFnZS5zb3VyY2UpCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDQ6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMTogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgIT0gIm92ZXJsYXlmcyIKICAgIHBfc3RvcmFnZS5vcHRpb25zID09IGlfc3RvcmFnZS5vcHRpb25zCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAxOiB0cnVlIikKfQphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIGNvdW50KHBfc3RvcmFnZS5vcHRpb25zKSA9PSAyCgogICAgcG9saWN5X2lkcyA6PSBzcGxpdChwX3N0b3JhZ2Uub3B0aW9uc1swXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBwb2xpY3lfaWRzID0iLCBwb2xpY3lfaWRzKQogICAgcG9saWN5X2lkcyA9PSBsYXllcl9pZHMKCiAgICBwb2xpY3lfaGFzaGVzIDo9IHNwbGl0KHBfc3RvcmFnZS5vcHRpb25zWzFdLCAiOiIpCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IHBvbGljeV9oYXNoZXMgPSIsIHBvbGljeV9oYXNoZXMpCgogICAgcF9jb3VudCA6PSBjb3VudChwb2xpY3lfaWRzKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBwX2NvdW50ID0iLCBwX2NvdW50KQogICAgcF9jb3VudCA+PSAxCiAgICBwX2NvdW50ID09IGNvdW50KHBvbGljeV9oYXNoZXMpCgogICAgaV9jb3VudCA6PSBjb3VudChpX3N0b3JhZ2Uub3B0aW9ucykKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogaV9jb3VudCA9IiwgaV9jb3VudCkKICAgIGlfY291bnQgPT0gcF9jb3VudCArIDMKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zWzBdID0iLCBpX3N0b3JhZ2Uub3B0aW9uc1swXSkKICAgIGlfc3RvcmFnZS5vcHRpb25zWzBdID09ICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQubGF5ZXItc3JjLXByZWZpeD0vdmFyL2xpYi9jb250YWluZXJkL2lvLmNvbnRhaW5lcmQuc25hcHNob3R0ZXIudjEudGFyZGV2L2xheWVycyIKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zW2lfY291bnQgLSAyXSA9IiwgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDJdKQogICAgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDJdID09ICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQub3ZlcmxheS1ydyIKCiAgICBsb3dlcmRpciA6PSBjb25jYXQoIj0iLCBbImxvd2VyZGlyIiwgcF9zdG9yYWdlLm9wdGlvbnNbMF1dKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBsb3dlcmRpciA9IiwgbG93ZXJkaXIpCgogICAgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDFdID09IGxvd2VyZGlyCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zW2lfY291bnQgLSAxXSA9IiwgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDFdKQoKICAgIGV2ZXJ5IGksIHBvbGljeV9pZCBpbiBwb2xpY3lfaWRzIHsKICAgICAgICBhbGxvd19vdmVybGF5X2xheWVyKHBvbGljeV9pZCwgcG9saWN5X2hhc2hlc1tpXSwgaV9zdG9yYWdlLm9wdGlvbnNbaSArIDFdKQogICAgfQoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogdHJ1ZSIpCn0KYWxsb3dfc3RvcmFnZV9vcHRpb25zKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKSB7CiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDM6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCiAgICBjb3VudChwX3N0b3JhZ2Uub3B0aW9ucykgPT0gMQoKICAgIHN0YXJ0c3dpdGgocF9zdG9yYWdlLm9wdGlvbnNbMF0sICIkKGhhc2giKQogICAgaGFzaF9zdWZmaXggOj0gdHJpbV9sZWZ0KHBfc3RvcmFnZS5vcHRpb25zWzBdLCAiJChoYXNoIikKCiAgICBlbmRzd2l0aChoYXNoX3N1ZmZpeCwgIikiKQogICAgaGFzaF9pbmRleCA6PSB0cmltX3JpZ2h0KGhhc2hfc3VmZml4LCAiKSIpCiAgICBpIDo9IHRvX251bWJlcihoYXNoX2luZGV4KQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAzOiBpID0iLCBpKQoKICAgIGhhc2hfb3B0aW9uIDo9IGNvbmNhdCgiPSIsIFsiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LnJvb3QtaGFzaCIsIHJvb3RfaGFzaGVzW2ldXSkKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMzogaGFzaF9vcHRpb24gPSIsIGhhc2hfb3B0aW9uKQoKICAgIGNvdW50KGlfc3RvcmFnZS5vcHRpb25zKSA9PSA0CiAgICBpX3N0b3JhZ2Uub3B0aW9uc1swXSA9PSAicm8iCiAgICBpX3N0b3JhZ2Uub3B0aW9uc1sxXSA9PSAiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmJsb2NrX2RldmljZT1maWxlIgogICAgaV9zdG9yYWdlLm9wdGlvbnNbMl0gPT0gImlvLmthdGFjb250YWluZXJzLmZzLW9wdC5pcy1sYXllciIKICAgIGlfc3RvcmFnZS5vcHRpb25zWzNdID09IGhhc2hfb3B0aW9uCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAzOiB0cnVlIikKfQphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgNDogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gInNtYiIKICAgIHBfb3B0c19jb3VudCA6PSBjb3VudChwX3N0b3JhZ2Uub3B0aW9ucykKICAgIGlfb3B0c19jb3VudCA6PSBjb3VudChpX3N0b3JhZ2Uub3B0aW9ucykKICAgIGlfb3B0c19jb3VudCA9PSBwX29wdHNfY291bnQgKyAyCgogICAgaV9vcHRfbWF0Y2hlcyA6PSBbaSB8IGkgOj0gaWR4OyBpZHggPCBwX29wdHNfY291bnQ7IHBfc3RvcmFnZS5vcHRpb25zW2lkeF0gPT0gaV9zdG9yYWdlLm9wdGlvbnNbaWR4XV0KICAgIGNvdW50KGlfb3B0X21hdGNoZXMpID09IHBfb3B0c19jb3VudAoKICAgIHN0YXJ0c3dpdGgoaV9zdG9yYWdlLm9wdGlvbnNbaV9vcHRzX2NvdW50LTJdLCAiYWRkcj0iKQogICAgY3JlZHMgPSBzcGxpdChpX3N0b3JhZ2Uub3B0aW9uc1tpX29wdHNfY291bnQtMV0sICIsIikKICAgIGNvdW50KGNyZWRzKSA9PSAyCiAgICBzdGFydHN3aXRoKGNyZWRzWzBdLCAidXNlcm5hbWU9IikKICAgIHN0YXJ0c3dpdGgoY3JlZHNbMV0sICJwYXNzd29yZD0iKQogICAgCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDQ6IHRydWUiKQp9CgphbGxvd19vdmVybGF5X2xheWVyKHBvbGljeV9pZCwgcG9saWN5X2hhc2gsIGlfb3B0aW9uKSB7CiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogcG9saWN5X2lkID0iLCBwb2xpY3lfaWQsICJwb2xpY3lfaGFzaCA9IiwgcG9saWN5X2hhc2gpCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogaV9vcHRpb24gPSIsIGlfb3B0aW9uKQoKICAgIHN0YXJ0c3dpdGgoaV9vcHRpb24sICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQubGF5ZXI9IikKICAgIGlfdmFsdWUgOj0gcmVwbGFjZShpX29wdGlvbiwgImlvLmthdGFjb250YWluZXJzLmZzLW9wdC5sYXllcj0iLCAiIikKICAgIGlfdmFsdWVfZGVjb2RlZCA6PSBiYXNlNjQuZGVjb2RlKGlfdmFsdWUpCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogaV92YWx1ZV9kZWNvZGVkID0iLCBpX3ZhbHVlX2RlY29kZWQpCgogICAgcG9saWN5X3N1ZmZpeCA6PSBjb25jYXQoIj0iLCBbInRhcixybyxpby5rYXRhY29udGFpbmVycy5mcy1vcHQuYmxvY2tfZGV2aWNlPWZpbGUsaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmlzLWxheWVyLGlvLmthdGFjb250YWluZXJzLmZzLW9wdC5yb290LWhhc2giLCBwb2xpY3lfaGFzaF0pCiAgICBwX3ZhbHVlIDo9IGNvbmNhdCgiLCIsIFtwb2xpY3lfaWQsIHBvbGljeV9zdWZmaXhdKQogICAgcHJpbnQoImFsbG93X292ZXJsYXlfbGF5ZXI6IHBfdmFsdWUgPSIsIHBfdmFsdWUpCgogICAgcF92YWx1ZSA9PSBpX3ZhbHVlX2RlY29kZWQKCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogdHJ1ZSIpCn0KCmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAidGFyIgoKICAgIHN0YXJ0c3dpdGgocF9zdG9yYWdlLm1vdW50X3BvaW50LCAiJChsYXllciIpCiAgICBtb3VudF9zdWZmaXggOj0gdHJpbV9sZWZ0KHBfc3RvcmFnZS5tb3VudF9wb2ludCwgIiQobGF5ZXIiKQoKICAgIGVuZHN3aXRoKG1vdW50X3N1ZmZpeCwgIikiKQogICAgbGF5ZXJfaW5kZXggOj0gdHJpbV9yaWdodChtb3VudF9zdWZmaXgsICIpIikKICAgIGkgOj0gdG9fbnVtYmVyKGxheWVyX2luZGV4KQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDE6IGkgPSIsIGkpCgogICAgbGF5ZXJfaWQgOj0gbGF5ZXJfaWRzW2ldCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMTogbGF5ZXJfaWQgPSIsIGxheWVyX2lkKQoKICAgIHBfbW91bnQgOj0gY29uY2F0KCIvIiwgWyIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L2xheWVycyIsIGxheWVyX2lkXSkKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCAxOiBwX21vdW50ID0iLCBwX21vdW50KQoKICAgIHBfbW91bnQgPT0gaV9zdG9yYWdlLm1vdW50X3BvaW50CgogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDE6IHRydWUiKQp9CmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAiZnVzZTMua2F0YS1vdmVybGF5IgoKICAgIG1vdW50MSA6PSByZXBsYWNlKHBfc3RvcmFnZS5tb3VudF9wb2ludCwgIiQoY3BhdGgpIiwgcG9saWN5X2RhdGEuY29tbW9uLmNwYXRoKQogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDI6IG1vdW50MiA9IiwgbW91bnQyKQoKICAgIG1vdW50MiA9PSBpX3N0b3JhZ2UubW91bnRfcG9pbnQKCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMjogdHJ1ZSIpCn0KYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKSB7CiAgICBwX3N0b3JhZ2UuZnN0eXBlID09ICJsb2NhbCIKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQyID0iLCBtb3VudDIpCgogICAgbW91bnQzIDo9IHJlcGxhY2UobW91bnQyLCAiJChzYW5kYm94LWlkKSIsIHNhbmRib3hfaWQpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQzID0iLCBtb3VudDMpCgogICAgcmVnZXgubWF0Y2gobW91bnQzLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCgogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDM6IHRydWUiKQp9CmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAiYmluZCIKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNDogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNDogbW91bnQyID0iLCBtb3VudDIpCgogICAgbW91bnQzIDo9IHJlcGxhY2UobW91bnQyLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDQ6IG1vdW50MyA9IiwgbW91bnQzKQoKICAgIHJlZ2V4Lm1hdGNoKG1vdW50MywgaV9zdG9yYWdlLm1vdW50X3BvaW50KQoKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA0OiB0cnVlIikKfQphbGxvd19tb3VudF9wb2ludChwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgYnVuZGxlX2lkLCBzYW5kYm94X2lkLCBsYXllcl9pZHMpIHsKICAgIHBfc3RvcmFnZS5mc3R5cGUgPT0gInRtcGZzIgoKICAgIG1vdW50MSA6PSBwX3N0b3JhZ2UubW91bnRfcG9pbnQKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA1OiBtb3VudDEgPSIsIG1vdW50MSkKCiAgICByZWdleC5tYXRjaChtb3VudDEsIGlfc3RvcmFnZS5tb3VudF9wb2ludCkKCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNTogdHJ1ZSIpCn0KYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKSB7CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogaV9zdG9yYWdlLm1vdW50X3BvaW50ID0iLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCiAgICBhbGxvd19kaXJlY3Rfdm9sX2RyaXZlcihwX3N0b3JhZ2UsIGlfc3RvcmFnZSkKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChzcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQyID0iLCBtb3VudDIpCgogICAgZGlyZWN0X3ZvbF9wYXRoIDo9IGlfc3RvcmFnZS5zb3VyY2UKICAgIG1vdW50MyA6PSByZXBsYWNlKG1vdW50MiwgIiQoYjY0LWRpcmVjdC12b2wtcGF0aCkiLCBiYXNlNjR1cmwuZW5jb2RlKGRpcmVjdF92b2xfcGF0aCkpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQzID0iLCBtb3VudDMpCgogICAgbW91bnQzID09IGlfc3RvcmFnZS5tb3VudF9wb2ludAoKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA2OiB0cnVlIikKfQoKYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIocF9zdG9yYWdlLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19kaXJlY3Rfdm9sX2RyaXZlciAxOiBzdGFydCIpCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCiAgICBwcmludCgiYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIgMTogdHJ1ZSIpCn0KYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIocF9zdG9yYWdlLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19kaXJlY3Rfdm9sX2RyaXZlciAyOiBzdGFydCIpCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJzbWIiCiAgICBwcmludCgiYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIgMjogdHJ1ZSIpCn0KCiMgRXhlY1Byb2Nlc3NSZXF1ZXN0LnByb2Nlc3MuQ2FwYWJpbGl0aWVzCmFsbG93X2V4ZWNfY2FwcyhpX2NhcHMpIHsKICAgIG5vdCBpX2NhcHMuQW1iaWVudAogICAgbm90IGlfY2Fwcy5Cb3VuZGluZwogICAgbm90IGlfY2Fwcy5FZmZlY3RpdmUKICAgIG5vdCBpX2NhcHMuSW5oZXJpdGFibGUKICAgIG5vdCBpX2NhcHMuUGVybWl0dGVkCn0KCiMgT0NJLlByb2Nlc3MuQ2FwYWJpbGl0aWVzCmFsbG93X2NhcHMocF9jYXBzLCBpX2NhcHMpIHsKICAgIHByaW50KCJhbGxvd19jYXBzOiBwb2xpY3kgQW1iaWVudCA9IiwgcF9jYXBzLkFtYmllbnQpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgQW1iaWVudCA9IiwgaV9jYXBzLkFtYmllbnQpCiAgICBtYXRjaF9jYXBzKHBfY2Fwcy5BbWJpZW50LCBpX2NhcHMuQW1iaWVudCkKCiAgICBwcmludCgiYWxsb3dfY2FwczogcG9saWN5IEJvdW5kaW5nID0iLCBwX2NhcHMuQm91bmRpbmcpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgQm91bmRpbmcgPSIsIGlfY2Fwcy5Cb3VuZGluZykKICAgIG1hdGNoX2NhcHMocF9jYXBzLkJvdW5kaW5nLCBpX2NhcHMuQm91bmRpbmcpCgogICAgcHJpbnQoImFsbG93X2NhcHM6IHBvbGljeSBFZmZlY3RpdmUgPSIsIHBfY2Fwcy5FZmZlY3RpdmUpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgRWZmZWN0aXZlID0iLCBpX2NhcHMuRWZmZWN0aXZlKQogICAgbWF0Y2hfY2FwcyhwX2NhcHMuRWZmZWN0aXZlLCBpX2NhcHMuRWZmZWN0aXZlKQoKICAgIHByaW50KCJhbGxvd19jYXBzOiBwb2xpY3kgSW5oZXJpdGFibGUgPSIsIHBfY2Fwcy5Jbmhlcml0YWJsZSkKICAgIHByaW50KCJhbGxvd19jYXBzOiBpbnB1dCBJbmhlcml0YWJsZSA9IiwgaV9jYXBzLkluaGVyaXRhYmxlKQogICAgbWF0Y2hfY2FwcyhwX2NhcHMuSW5oZXJpdGFibGUsIGlfY2Fwcy5Jbmhlcml0YWJsZSkKCiAgICBwcmludCgiYWxsb3dfY2FwczogcG9saWN5IFBlcm1pdHRlZCA9IiwgcF9jYXBzLlBlcm1pdHRlZCkKICAgIHByaW50KCJhbGxvd19jYXBzOiBpbnB1dCBQZXJtaXR0ZWQgPSIsIGlfY2Fwcy5QZXJtaXR0ZWQpCiAgICBtYXRjaF9jYXBzKHBfY2Fwcy5QZXJtaXR0ZWQsIGlfY2Fwcy5QZXJtaXR0ZWQpCn0KCm1hdGNoX2NhcHMocF9jYXBzLCBpX2NhcHMpIHsKICAgIHByaW50KCJtYXRjaF9jYXBzIDE6IHN0YXJ0IikKCiAgICBwX2NhcHMgPT0gaV9jYXBzCgogICAgcHJpbnQoIm1hdGNoX2NhcHMgMTogdHJ1ZSIpCn0KbWF0Y2hfY2FwcyhwX2NhcHMsIGlfY2FwcykgewogICAgcHJpbnQoIm1hdGNoX2NhcHMgMjogc3RhcnQiKQoKICAgIGNvdW50KHBfY2FwcykgPT0gMQogICAgcF9jYXBzWzBdID09ICIkKGRlZmF1bHRfY2FwcykiCgogICAgcHJpbnQoIm1hdGNoX2NhcHMgMjogZGVmYXVsdF9jYXBzID0iLCBwb2xpY3lfZGF0YS5jb21tb24uZGVmYXVsdF9jYXBzKQogICAgcG9saWN5X2RhdGEuY29tbW9uLmRlZmF1bHRfY2FwcyA9PSBpX2NhcHMKCiAgICBwcmludCgibWF0Y2hfY2FwcyAyOiB0cnVlIikKfQptYXRjaF9jYXBzKHBfY2FwcywgaV9jYXBzKSB7CiAgICBwcmludCgibWF0Y2hfY2FwcyAzOiBzdGFydCIpCgogICAgY291bnQocF9jYXBzKSA9PSAxCiAgICBwX2NhcHNbMF0gPT0gIiQocHJpdmlsZWdlZF9jYXBzKSIKCiAgICBwcmludCgibWF0Y2hfY2FwcyAzOiBwcml2aWxlZ2VkX2NhcHMgPSIsIHBvbGljeV9kYXRhLmNvbW1vbi5wcml2aWxlZ2VkX2NhcHMpCiAgICBwb2xpY3lfZGF0YS5jb21tb24ucHJpdmlsZWdlZF9jYXBzID09IGlfY2FwcwoKICAgIHByaW50KCJtYXRjaF9jYXBzIDM6IHRydWUiKQp9CgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgpjaGVja19kaXJlY3RvcnlfdHJhdmVyc2FsKGlfcGF0aCkgewogICAgbm90IHJlZ2V4Lm1hdGNoKCIoXnwvKS4uKCR8LykiLCBpX3BhdGgpCn0KCmNoZWNrX3N5bWxpbmtfc291cmNlKGlfc3JjKSB7CiAgICBpX3NyYyA9PSAiIgogICAgcHJpbnQoImNoZWNrX3N5bWxpbmtfc291cmNlIDE6IHRydWUiKQp9CmNoZWNrX3N5bWxpbmtfc291cmNlKGlfc3JjKSB7CiAgICBpX3NyYyAhPSAiIgogICAgcHJpbnQoImNoZWNrX3N5bWxpbmtfc291cmNlIDI6IGlfc3JjID0iLCBpX3NyYykKCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24uc19zb3VyY2UxLCBpX3NyYykKCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMjogdHJ1ZSIpCn0KY2hlY2tfc3ltbGlua19zb3VyY2UoaV9zcmMpIHsKICAgIGlfc3JjICE9ICIiCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMzogaV9zcmMgPSIsIGlfc3JjKQoKICAgIHJlZ2V4Lm1hdGNoKHBvbGljeV9kYXRhLmNvbW1vbi5zX3NvdXJjZTIsIGlfc3JjKQogICAgY2hlY2tfZGlyZWN0b3J5X3RyYXZlcnNhbChpX3NyYykKCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMzogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfc3RvcmFnZXMoaV9zdG9yYWdlcykgewogICAgcHJpbnQoImFsbG93X3NhbmRib3hfc3RvcmFnZXM6IGlfc3RvcmFnZXMgPSIsIGlfc3RvcmFnZXMpCgogICAgcF9zdG9yYWdlcyA6PSBwb2xpY3lfZGF0YS5zYW5kYm94LnN0b3JhZ2VzCiAgICBldmVyeSBpX3N0b3JhZ2UgaW4gaV9zdG9yYWdlcyB7CiAgICAgICAgYWxsb3dfc2FuZGJveF9zdG9yYWdlKHBfc3RvcmFnZXMsIGlfc3RvcmFnZSkKICAgIH0KCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9zdG9yYWdlczogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfc3RvcmFnZShwX3N0b3JhZ2VzLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IGlfc3RvcmFnZSA9IiwgaV9zdG9yYWdlKQoKICAgIHNvbWUgcF9zdG9yYWdlIGluIHBfc3RvcmFnZXMKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IHBfc3RvcmFnZSA9IiwgcF9zdG9yYWdlKQogICAgaV9zdG9yYWdlID09IHBfc3RvcmFnZQoKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IHRydWUiKQp9CgpDb3B5RmlsZVJlcXVlc3QgewogICAgcHJpbnQoIkNvcHlGaWxlUmVxdWVzdDogaW5wdXQucGF0aCA9IiwgaW5wdXQucGF0aCkKCiAgICBjaGVja19zeW1saW5rX3NvdXJjZShpbnB1dC5zeW1saW5rX3NyYykKICAgIGNoZWNrX2RpcmVjdG9yeV90cmF2ZXJzYWwoaW5wdXQucGF0aCkKCiAgICBzb21lIHJlZ2V4MSBpbiBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLkNvcHlGaWxlUmVxdWVzdAogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5jcGF0aCkKICAgIHJlZ2V4NCA6PSByZXBsYWNlKHJlZ2V4MywgIiQoYnVuZGxlLWlkKSIsIEJVTkRMRV9JRCkKICAgIHByaW50KCJDb3B5RmlsZVJlcXVlc3Q6IHJlZ2V4NCA9IiwgcmVnZXg0KQoKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4NCwgaW5wdXQucGF0aCkKCiAgICBwcmludCgiQ29weUZpbGVSZXF1ZXN0OiB0cnVlIikKfQoKQ3JlYXRlU2FuZGJveFJlcXVlc3QgewogICAgcHJpbnQoIkNyZWF0ZVNhbmRib3hSZXF1ZXN0OiBpbnB1dC5ndWVzdF9ob29rX3BhdGggPSIsIGlucHV0Lmd1ZXN0X2hvb2tfcGF0aCkKICAgIGNvdW50KGlucHV0Lmd1ZXN0X2hvb2tfcGF0aCkgPT0gMAoKICAgIHByaW50KCJDcmVhdGVTYW5kYm94UmVxdWVzdDogaW5wdXQua2VybmVsX21vZHVsZXMgPSIsIGlucHV0Lmtlcm5lbF9tb2R1bGVzKQogICAgY291bnQoaW5wdXQua2VybmVsX21vZHVsZXMpID09IDAKCiAgICBpX3BpZG5zIDo9IGlucHV0LnNhbmRib3hfcGlkbnMKICAgIHByaW50KCJDcmVhdGVTYW5kYm94UmVxdWVzdDogaV9waWRucyA9IiwgaV9waWRucykKICAgIGlfcGlkbnMgPT0gZmFsc2UKICAgIGFsbG93X3NhbmRib3hfc3RvcmFnZXMoaW5wdXQuc3RvcmFnZXMpCn0KCmFsbG93X2V4ZWMocF9jb250YWluZXIsIGlfcHJvY2VzcykgewogICAgcHJpbnQoImFsbG93X2V4ZWM6IHN0YXJ0IikKCiAgICBwX29jaSA9IHBfY29udGFpbmVyLk9DSQogICAgcF9zX25hbWUgPSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc19uYW1lc3BhY2UgPSBnZXRfc3RhdGVfdmFsKCJuYW1lc3BhY2UiKQogICAgYWxsb3dfcHJvYmVfcHJvY2VzcyhwX29jaS5Qcm9jZXNzLCBpX3Byb2Nlc3MsIHBfc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfZXhlYzogdHJ1ZSIpCn0KCmFsbG93X2ludGVyYWN0aXZlX2V4ZWMocF9jb250YWluZXIsIGlfcHJvY2VzcykgewogICAgcHJpbnQoImFsbG93X2ludGVyYWN0aXZlX2V4ZWM6IHN0YXJ0IikKCiAgICBwX29jaSA9IHBfY29udGFpbmVyLk9DSQogICAgcF9zX25hbWUgPSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc19uYW1lc3BhY2UgPSBnZXRfc3RhdGVfdmFsKCJuYW1lc3BhY2UiKQogICAgYWxsb3dfaW50ZXJhY3RpdmVfcHJvY2VzcyhwX29jaS5Qcm9jZXNzLCBpX3Byb2Nlc3MsIHBfc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfaW50ZXJhY3RpdmVfZXhlYzogdHJ1ZSIpCn0KCiMgVE9ETzogc2hvdWxkIG90aGVyIEV4ZWNQcm9jZXNzUmVxdWVzdCBpbnB1dCBkYXRhIGZpZWxkcyBiZSB2YWxpZGF0ZWQgYXMgd2VsbD8KRXhlY1Byb2Nlc3NSZXF1ZXN0IHsKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMTogaW5wdXQgPSIsIGlucHV0KQoKICAgIHNvbWUgcF9jb21tYW5kIGluIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuRXhlY1Byb2Nlc3NSZXF1ZXN0LmFsbG93ZWRfY29tbWFuZHMKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMTogcF9jb21tYW5kID0iLCBwX2NvbW1hbmQpCiAgICBwX2NvbW1hbmQgPT0gaW5wdXQucHJvY2Vzcy5BcmdzCgogICAgIyBUT0RPOiBtYXRjaCBwX2NvbnRhaW5lcidzIElEIHdpdGggdGhlIGlucHV0IGNvbnRhaW5lcl9pZC4KICAgIHNvbWUgcF9jb250YWluZXIgaW4gcG9saWN5X2RhdGEuY29udGFpbmVycwogICAgYWxsb3dfaW50ZXJhY3RpdmVfZXhlYyhwX2NvbnRhaW5lciwgaW5wdXQucHJvY2VzcykKCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDE6IHRydWUiKQp9CkV4ZWNQcm9jZXNzUmVxdWVzdCB7CiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDI6IGlucHV0ID0iLCBpbnB1dCkKCiAgICAjIFRPRE86IG1hdGNoIGlucHV0IGNvbnRhaW5lciBJRCB3aXRoIGl0cyBjb3JyZXNwb25kaW5nIGNvbnRhaW5lci5leGVjX2NvbW1hbmRzLgogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBzb21lIHBfY29tbWFuZCBpbiBwX2NvbnRhaW5lci5leGVjX2NvbW1hbmRzCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDI6IHBfY29tbWFuZCA9IiwgcF9jb21tYW5kKQoKICAgICMgVE9ETzogc2hvdWxkIG90aGVyIGlucHV0IGRhdGEgZmllbGRzIGJlIHZhbGlkYXRlZCBhcyB3ZWxsPwogICAgcF9jb21tYW5kID09IGlucHV0LnByb2Nlc3MuQXJncwoKICAgIGFsbG93X2V4ZWMocF9jb250YWluZXIsIGlucHV0LnByb2Nlc3MpCgogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAyOiB0cnVlIikKfQpFeGVjUHJvY2Vzc1JlcXVlc3QgewogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAzOiBpbnB1dCA9IiwgaW5wdXQpCgogICAgaV9jb21tYW5kID0gY29uY2F0KCIgIiwgaW5wdXQucHJvY2Vzcy5BcmdzKQogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAzOiBpX2NvbW1hbmQgPSIsIGlfY29tbWFuZCkKCiAgICBzb21lIHBfcmVnZXggaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5FeGVjUHJvY2Vzc1JlcXVlc3QucmVnZXgKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMzogcF9yZWdleCA9IiwgcF9yZWdleCkKCiAgICByZWdleC5tYXRjaChwX3JlZ2V4LCBpX2NvbW1hbmQpCgogICAgIyBUT0RPOiBtYXRjaCBwX2NvbnRhaW5lcidzIElEIHdpdGggdGhlIGlucHV0IGNvbnRhaW5lcl9pZC4KICAgIHNvbWUgcF9jb250YWluZXIgaW4gcG9saWN5X2RhdGEuY29udGFpbmVycwogICAgYWxsb3dfaW50ZXJhY3RpdmVfZXhlYyhwX2NvbnRhaW5lciwgaW5wdXQucHJvY2VzcykKCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDM6IHRydWUiKQp9CgpVcGRhdGVSb3V0ZXNSZXF1ZXN0IHsKICAgIHByaW50KCJVcGRhdGVSb3V0ZXNSZXF1ZXN0OiBpbnB1dCA9IiwgaW5wdXQpCiAgICBwcmludCgiVXBkYXRlUm91dGVzUmVxdWVzdDogcG9saWN5ID0iLCBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLlVwZGF0ZVJvdXRlc1JlcXVlc3QpCgogICAgaV9yb3V0ZXMgOj0gaW5wdXQucm91dGVzLlJvdXRlcwogICAgcF9zb3VyY2VfcmVnZXggPSBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLlVwZGF0ZVJvdXRlc1JlcXVlc3QuZm9yYmlkZGVuX3NvdXJjZV9yZWdleAogICAgcF9uYW1lcyA9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuVXBkYXRlUm91dGVzUmVxdWVzdC5mb3JiaWRkZW5fZGV2aWNlX25hbWVzCgogICAgZXZlcnkgaV9yb3V0ZSBpbiBpX3JvdXRlcyB7CiAgICAgICAgcHJpbnQoImlfcm91dGUuc291cmNlID0iLCBpX3JvdXRlLnNvdXJjZSkKICAgICAgICBldmVyeSBwX3JlZ2V4IGluIHBfc291cmNlX3JlZ2V4IHsKICAgICAgICAgICAgcHJpbnQoInBfcmVnZXggPSIsIHBfcmVnZXgpCiAgICAgICAgICAgIG5vdCByZWdleC5tYXRjaChwX3JlZ2V4LCBpX3JvdXRlLnNvdXJjZSkKICAgICAgICB9CgogICAgICAgIHByaW50KCJpX3JvdXRlLmRldmljZSA9IiwgaV9yb3V0ZS5kZXZpY2UpCiAgICAgICAgbm90IGlfcm91dGUuZGV2aWNlIGluIHBfbmFtZXMKICAgIH0KCiAgICBwcmludCgiVXBkYXRlUm91dGVzUmVxdWVzdDogdHJ1ZSIpCn0KClVwZGF0ZUludGVyZmFjZVJlcXVlc3QgewogICAgcHJpbnQoIlVwZGF0ZUludGVyZmFjZVJlcXVlc3Q6IGlucHV0ID0iLCBpbnB1dCkKICAgIHByaW50KCJVcGRhdGVJbnRlcmZhY2VSZXF1ZXN0OiBwb2xpY3kgPSIsIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuVXBkYXRlSW50ZXJmYWNlUmVxdWVzdCkKCiAgICBpX2ludGVyZmFjZSA6PSBpbnB1dC5pbnRlcmZhY2UKICAgIHBfZmxhZ3MgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmFsbG93X3Jhd19mbGFncwoKICAgICMgVHlwaWNhbGx5LCBqdXN0IElGRl9OT0FSUCBpcyB1c2VkLgogICAgYml0cy5hbmQoaV9pbnRlcmZhY2UucmF3X2ZsYWdzLCBiaXRzLm5lZ2F0ZShwX2ZsYWdzKSkgPT0gMAoKICAgIHBfbmFtZXMgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmZvcmJpZGRlbl9uYW1lcwoKICAgIG5vdCBpX2ludGVyZmFjZS5uYW1lIGluIHBfbmFtZXMKCiAgICBwX2h3YWRkcnMgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmZvcmJpZGRlbl9od19hZGRycwoKICAgIG5vdCBpX2ludGVyZmFjZS5od0FkZHIgaW4gcF9od2FkZHJzCgogICAgcHJpbnQoIlVwZGF0ZUludGVyZmFjZVJlcXVlc3Q6IHRydWUiKQp9CgpDbG9zZVN0ZGluUmVxdWVzdCB7CiAgICBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLkNsb3NlU3RkaW5SZXF1ZXN0ID09IHRydWUKfQoKUmVhZFN0cmVhbVJlcXVlc3QgewogICAgcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5SZWFkU3RyZWFtUmVxdWVzdCA9PSB0cnVlCn0KClVwZGF0ZUVwaGVtZXJhbE1vdW50c1JlcXVlc3QgewogICAgcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVFcGhlbWVyYWxNb3VudHNSZXF1ZXN0ID09IHRydWUKfQoKV3JpdGVTdHJlYW1SZXF1ZXN0IHsKICAgIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuV3JpdGVTdHJlYW1SZXF1ZXN0ID09IHRydWUKfQoKcG9saWN5X2RhdGEgOj0gewogICJjb250YWluZXJzIjogWwogICAgewogICAgICAiT0NJIjogewogICAgICAgICJWZXJzaW9uIjogIjEuMS4wLXJjLjEiLAogICAgICAgICJQcm9jZXNzIjogewogICAgICAgICAgIlRlcm1pbmFsIjogZmFsc2UsCiAgICAgICAgICAiVXNlciI6IHsKICAgICAgICAgICAgIlVJRCI6IDAsCiAgICAgICAgICAgICJHSUQiOiA2NTUzNSwKICAgICAgICAgICAgIkFkZGl0aW9uYWxHaWRzIjogW10sCiAgICAgICAgICAgICJVc2VybmFtZSI6ICIiCiAgICAgICAgICB9LAogICAgICAgICAgIkRlcHJlY2F0ZWRBcmdzIjogWwogICAgICAgICAgICAiL3BhdXNlIgogICAgICAgICAgXSwKICAgICAgICAgICJBcmdzIjogWwogICAgICAgICAgICAiL3BhdXNlIgogICAgICAgICAgXSwKICAgICAgICAgICJFbnYiOiBbCiAgICAgICAgICAgICJQQVRIPS91c3IvbG9jYWwvc2JpbjovdXNyL2xvY2FsL2JpbjovdXNyL3NiaW46L3Vzci9iaW46L3NiaW46L2JpbiIKICAgICAgICAgIF0sCiAgICAgICAgICAiQ3dkIjogIi8iLAogICAgICAgICAgIkNhcGFiaWxpdGllcyI6IHsKICAgICAgICAgICAgIkFtYmllbnQiOiBbXSwKICAgICAgICAgICAgIkJvdW5kaW5nIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJFZmZlY3RpdmUiOiBbCiAgICAgICAgICAgICAgIiQoZGVmYXVsdF9jYXBzKSIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgIkluaGVyaXRhYmxlIjogW10sCiAgICAgICAgICAgICJQZXJtaXR0ZWQiOiBbCiAgICAgICAgICAgICAgIiQoZGVmYXVsdF9jYXBzKSIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgICJOb05ld1ByaXZpbGVnZXMiOiB0cnVlCiAgICAgICAgfSwKICAgICAgICAiUm9vdCI6IHsKICAgICAgICAgICJQYXRoIjogIiQoY3BhdGgpLyQoYnVuZGxlLWlkKSIsCiAgICAgICAgICAiUmVhZG9ubHkiOiB0cnVlCiAgICAgICAgfSwKICAgICAgICAiTW91bnRzIjogWwogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL3Byb2MiLAogICAgICAgICAgICAic291cmNlIjogInByb2MiLAogICAgICAgICAgICAidHlwZV8iOiAicHJvYyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYiLAogICAgICAgICAgICAic291cmNlIjogInRtcGZzIiwKICAgICAgICAgICAgInR5cGVfIjogInRtcGZzIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgInN0cmljdGF0aW1lIiwKICAgICAgICAgICAgICAibW9kZT03NTUiLAogICAgICAgICAgICAgICJzaXplPTY1NTM2ayIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvcHRzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJkZXZwdHMiLAogICAgICAgICAgICAidHlwZV8iOiAiZGV2cHRzIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAgICAgIm5ld2luc3RhbmNlIiwKICAgICAgICAgICAgICAicHRteG1vZGU9MDY2NiIsCiAgICAgICAgICAgICAgIm1vZGU9MDYyMCIsCiAgICAgICAgICAgICAgImdpZD01IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi9zaG0iLAogICAgICAgICAgICAic291cmNlIjogIi9ydW4va2F0YS1jb250YWluZXJzL3NhbmRib3gvc2htIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L21xdWV1ZSIsCiAgICAgICAgICAgICJzb3VyY2UiOiAibXF1ZXVlIiwKICAgICAgICAgICAgInR5cGVfIjogIm1xdWV1ZSIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9zeXMiLAogICAgICAgICAgICAic291cmNlIjogInN5c2ZzIiwKICAgICAgICAgICAgInR5cGVfIjogInN5c2ZzIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAgICAgIm5vZGV2IiwKICAgICAgICAgICAgICAicm8iCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZXRjL3Jlc29sdi5jb25mIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KXJlc29sdi5jb25mJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicm8iLAogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2RldiIsCiAgICAgICAgICAgICAgIm5vZXhlYyIKICAgICAgICAgICAgXQogICAgICAgICAgfQogICAgICAgIF0sCiAgICAgICAgIkFubm90YXRpb25zIjogewogICAgICAgICAgImlvLmthdGFjb250YWluZXJzLnBrZy5vY2kuYnVuZGxlX3BhdGgiOiAiL3J1bi9jb250YWluZXJkL2lvLmNvbnRhaW5lcmQucnVudGltZS52Mi50YXNrL2s4cy5pby8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgImlvLmthdGFjb250YWluZXJzLnBrZy5vY2kuY29udGFpbmVyX3R5cGUiOiAicG9kX3NhbmRib3giLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLmNvbnRhaW5lci10eXBlIjogInNhbmRib3giLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtaWQiOiAiXlthLXowLTldezY0fSQiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbG9nLWRpcmVjdG9yeSI6ICJeL3Zhci9sb2cvcG9kcy8kKHNhbmRib3gtbmFtZXNwYWNlKV8kKHNhbmRib3gtbmFtZSlfWzAtOWEtZl17OH0tWzAtOWEtZl17NH0tWzAtOWEtZl17NH0tWzAtOWEtZl17NH0tWzAtOWEtZl17MTJ9JCIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1uYW1lc3BhY2UiOiAiIiwKICAgICAgICAgICJuZXJkY3RsL25ldHdvcmstbmFtZXNwYWNlIjogIl4vdmFyL3J1bi9uZXRucy9jbmktWzAtOWEtZl17OH0tWzAtOWEtZl17NH0tWzAtOWEtZl17NH0tWzAtOWEtZl17NH0tWzAtOWEtZl17MTJ9JCIKICAgICAgICB9LAogICAgICAgICJMaW51eCI6IHsKICAgICAgICAgICJOYW1lc3BhY2VzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgIlR5cGUiOiAiaXBjIiwKICAgICAgICAgICAgICAiUGF0aCI6ICIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiVHlwZSI6ICJ1dHMiLAogICAgICAgICAgICAgICJQYXRoIjogIiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJUeXBlIjogIm1vdW50IiwKICAgICAgICAgICAgICAiUGF0aCI6ICIiCiAgICAgICAgICAgIH0KICAgICAgICAgIF0sCiAgICAgICAgICAiTWFza2VkUGF0aHMiOiBbCiAgICAgICAgICAgICIvcHJvYy9hY3BpIiwKICAgICAgICAgICAgIi9wcm9jL2Fzb3VuZCIsCiAgICAgICAgICAgICIvcHJvYy9rY29yZSIsCiAgICAgICAgICAgICIvcHJvYy9rZXlzIiwKICAgICAgICAgICAgIi9wcm9jL2xhdGVuY3lfc3RhdHMiLAogICAgICAgICAgICAiL3Byb2MvdGltZXJfbGlzdCIsCiAgICAgICAgICAgICIvcHJvYy90aW1lcl9zdGF0cyIsCiAgICAgICAgICAgICIvcHJvYy9zY2hlZF9kZWJ1ZyIsCiAgICAgICAgICAgICIvc3lzL2Zpcm13YXJlIiwKICAgICAgICAgICAgIi9wcm9jL3Njc2kiCiAgICAgICAgICBdLAogICAgICAgICAgIlJlYWRvbmx5UGF0aHMiOiBbCiAgICAgICAgICAgICIvcHJvYy9idXMiLAogICAgICAgICAgICAiL3Byb2MvZnMiLAogICAgICAgICAgICAiL3Byb2MvaXJxIiwKICAgICAgICAgICAgIi9wcm9jL3N5cyIsCiAgICAgICAgICAgICIvcHJvYy9zeXNycS10cmlnZ2VyIgogICAgICAgICAgXSwKICAgICAgICAgICJEZXZpY2VzIjogW10sCiAgICAgICAgICAiU3lzY3RsIjogewogICAgICAgICAgICAibmV0LmlwdjQuaXBfdW5wcml2aWxlZ2VkX3BvcnRfc3RhcnQiOiAiMCIsCiAgICAgICAgICAgICJuZXQuaXB2NC5waW5nX2dyb3VwX3JhbmdlIjogIjAgMjE0NzQ4MzY0NyIKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0sCiAgICAgICJzdG9yYWdlcyI6IFsKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoMCkiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXIwKSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogIm92ZXJsYXlmcyIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAiZnVzZTMua2F0YS1vdmVybGF5IiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiNWE1YWFkODAwNTVmZjIwMDEyYTUwZGMyNWY4ZGY3YTI5OTI0NDc0MzI0ZDY1ZjdkNTMwNmVlOGVlMjdmZjcxZCIsCiAgICAgICAgICAgICI4MTcyNTBmMWEzZTMzNmRhNzZmNWJkM2ZhNzg0ZTFiMjZkOTU5YjljMTMxODc2ODE1YmEyNjA0MDQ4YjcwYzE4IgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGNwYXRoKS8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0KICAgICAgXSwKICAgICAgImRldmljZXMiOiBbXSwKICAgICAgInNhbmRib3hfcGlkbnMiOiBmYWxzZSwKICAgICAgImV4ZWNfY29tbWFuZHMiOiBbXSwKICAgICAgImVudl9tYXAiOiB7CiAgICAgICAgIlBBVEgiOiAiL3Vzci9sb2NhbC9zYmluOi91c3IvbG9jYWwvYmluOi91c3Ivc2JpbjovdXNyL2Jpbjovc2JpbjovYmluIgogICAgICB9CiAgICB9LAogICAgewogICAgICAiT0NJIjogewogICAgICAgICJWZXJzaW9uIjogIjEuMS4wLXJjLjEiLAogICAgICAgICJQcm9jZXNzIjogewogICAgICAgICAgIlRlcm1pbmFsIjogZmFsc2UsCiAgICAgICAgICAiVXNlciI6IHsKICAgICAgICAgICAgIlVJRCI6IDAsCiAgICAgICAgICAgICJHSUQiOiAwLAogICAgICAgICAgICAiQWRkaXRpb25hbEdpZHMiOiBbXSwKICAgICAgICAgICAgIlVzZXJuYW1lIjogIiIKICAgICAgICAgIH0sCiAgICAgICAgICAiRGVwcmVjYXRlZEFyZ3MiOiBbCiAgICAgICAgICAgICJzaCIKICAgICAgICAgIF0sCiAgICAgICAgICAiQXJncyI6IFsKICAgICAgICAgICAgInNoIgogICAgICAgICAgXSwKICAgICAgICAgICJFbnYiOiBbCiAgICAgICAgICAgICJQQVRIPS91c3IvbG9jYWwvc2JpbjovdXNyL2xvY2FsL2JpbjovdXNyL3NiaW46L3Vzci9iaW46L3NiaW46L2JpbiIsCiAgICAgICAgICAgICJIT1NUTkFNRT0kKGhvc3QtbmFtZSkiLAogICAgICAgICAgICAiR0VUX0hPU1RTX0ZST009ZG5zIgogICAgICAgICAgXSwKICAgICAgICAgICJDd2QiOiAiLyIsCiAgICAgICAgICAiQ2FwYWJpbGl0aWVzIjogewogICAgICAgICAgICAiQW1iaWVudCI6IFtdLAogICAgICAgICAgICAiQm91bmRpbmciOiBbCiAgICAgICAgICAgICAgIiQoZGVmYXVsdF9jYXBzKSIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgIkVmZmVjdGl2ZSI6IFsKICAgICAgICAgICAgICAiJChkZWZhdWx0X2NhcHMpIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiSW5oZXJpdGFibGUiOiBbXSwKICAgICAgICAgICAgIlBlcm1pdHRlZCI6IFsKICAgICAgICAgICAgICAiJChkZWZhdWx0X2NhcHMpIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgIk5vTmV3UHJpdmlsZWdlcyI6IGZhbHNlCiAgICAgICAgfSwKICAgICAgICAiUm9vdCI6IHsKICAgICAgICAgICJQYXRoIjogIiQoY3BhdGgpLyQoYnVuZGxlLWlkKSIsCiAgICAgICAgICAiUmVhZG9ubHkiOiBmYWxzZQogICAgICAgIH0sCiAgICAgICAgIk1vdW50cyI6IFsKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9wcm9jIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJwcm9jIiwKICAgICAgICAgICAgInR5cGVfIjogInByb2MiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2IiwKICAgICAgICAgICAgInNvdXJjZSI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJzdHJpY3RhdGltZSIsCiAgICAgICAgICAgICAgIm1vZGU9NzU1IiwKICAgICAgICAgICAgICAic2l6ZT02NTUzNmsiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L3B0cyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiZGV2cHRzIiwKICAgICAgICAgICAgInR5cGVfIjogImRldnB0cyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJuZXdpbnN0YW5jZSIsCiAgICAgICAgICAgICAgInB0bXhtb2RlPTA2NjYiLAogICAgICAgICAgICAgICJtb2RlPTA2MjAiLAogICAgICAgICAgICAgICJnaWQ9NSIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvc2htIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L3NobSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi9tcXVldWUiLAogICAgICAgICAgICAic291cmNlIjogIm1xdWV1ZSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJtcXVldWUiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvc3lzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJzeXNmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJzeXNmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL3N5cy9mcy9jZ3JvdXAiLAogICAgICAgICAgICAic291cmNlIjogImNncm91cCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJjZ3JvdXAiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiLAogICAgICAgICAgICAgICJyZWxhdGltZSIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2V0Yy9ob3N0cyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClob3N0cyQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicnciCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L3Rlcm1pbmF0aW9uLWxvZyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeCl0ZXJtaW5hdGlvbi1sb2ckIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJ3IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2V0Yy9ob3N0bmFtZSIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClob3N0bmFtZSQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicnciCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZXRjL3Jlc29sdi5jb25mIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KXJlc29sdi5jb25mJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJydyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi92YXIvcnVuL3NlY3JldHMva3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudCIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClzZXJ2aWNlYWNjb3VudCQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicm8iCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvdmFyL3J1bi9zZWNyZXRzL2F6dXJlL3Rva2VucyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeCl0b2tlbnMkIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9CiAgICAgICAgXSwKICAgICAgICAiQW5ub3RhdGlvbnMiOiB7CiAgICAgICAgICAiaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5idW5kbGVfcGF0aCI6ICIvcnVuL2NvbnRhaW5lcmQvaW8uY29udGFpbmVyZC5ydW50aW1lLnYyLnRhc2svazhzLmlvLyQoYnVuZGxlLWlkKSIsCiAgICAgICAgICAiaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5jb250YWluZXJfdHlwZSI6ICJwb2RfY29udGFpbmVyIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItbmFtZSI6ICJidXN5IiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSI6ICJjb250YWluZXIiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLmltYWdlLW5hbWUiOiAibWNyLm1pY3Jvc29mdC5jb20vYWtzL2UyZS9saWJyYXJ5LWJ1c3lib3g6bWFzdGVyLjIyMDMxNC4xLWxpbnV4LWFtZDY0IiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWlkIjogIl5bYS16MC05XXs2NH0kIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LW5hbWVzcGFjZSI6ICIiCiAgICAgICAgfSwKICAgICAgICAiTGludXgiOiB7CiAgICAgICAgICAiTmFtZXNwYWNlcyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICJUeXBlIjogImlwYyIsCiAgICAgICAgICAgICAgIlBhdGgiOiAiIgogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgIlR5cGUiOiAidXRzIiwKICAgICAgICAgICAgICAiUGF0aCI6ICIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiVHlwZSI6ICJtb3VudCIsCiAgICAgICAgICAgICAgIlBhdGgiOiAiIgogICAgICAgICAgICB9CiAgICAgICAgICBdLAogICAgICAgICAgIk1hc2tlZFBhdGhzIjogWwogICAgICAgICAgICAiL3Byb2MvYWNwaSIsCiAgICAgICAgICAgICIvcHJvYy9rY29yZSIsCiAgICAgICAgICAgICIvcHJvYy9rZXlzIiwKICAgICAgICAgICAgIi9wcm9jL2xhdGVuY3lfc3RhdHMiLAogICAgICAgICAgICAiL3Byb2MvdGltZXJfbGlzdCIsCiAgICAgICAgICAgICIvcHJvYy90aW1lcl9zdGF0cyIsCiAgICAgICAgICAgICIvcHJvYy9zY2hlZF9kZWJ1ZyIsCiAgICAgICAgICAgICIvcHJvYy9zY3NpIiwKICAgICAgICAgICAgIi9zeXMvZmlybXdhcmUiCiAgICAgICAgICBdLAogICAgICAgICAgIlJlYWRvbmx5UGF0aHMiOiBbCiAgICAgICAgICAgICIvcHJvYy9hc291bmQiLAogICAgICAgICAgICAiL3Byb2MvYnVzIiwKICAgICAgICAgICAgIi9wcm9jL2ZzIiwKICAgICAgICAgICAgIi9wcm9jL2lycSIsCiAgICAgICAgICAgICIvcHJvYy9zeXMiLAogICAgICAgICAgICAiL3Byb2Mvc3lzcnEtdHJpZ2dlciIKICAgICAgICAgIF0sCiAgICAgICAgICAiRGV2aWNlcyI6IFtdLAogICAgICAgICAgIlN5c2N0bCI6IHsKICAgICAgICAgICAgIm5ldC5pcHY0LmlwX3VucHJpdmlsZWdlZF9wb3J0X3N0YXJ0IjogIjAiLAogICAgICAgICAgICAibmV0LmlwdjQucGluZ19ncm91cF9yYW5nZSI6ICIwIDIxNDc0ODM2NDciCiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9LAogICAgICAic3RvcmFnZXMiOiBbCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJibGsiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogInRhciIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIiQoaGFzaDApIgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGxheWVyMCkiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJibGsiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogInRhciIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIiQoaGFzaDEpIgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGxheWVyMSkiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJvdmVybGF5ZnMiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogImZ1c2UzLmthdGEtb3ZlcmxheSIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIjJjMzQyYTEzN2U2OTNjNzg5OGFlYzM2ZGExMDQ3ZjE5MWRjN2MxNjg3ZTY2MTk4YWRhY2M0MzljZjRhZGYzNzk6MjU3MGUzYTE5ZTFiZjIwZGRkYTQ1NDk4YTk2MjdmNjE1NTVkMmQ2YzAxNDc5YjliNzY0NjBiNjc5YjI3ZDU1MiIsCiAgICAgICAgICAgICI4NTY4YzcwYzBjY2ZlMDA1MTA5MmU4MThkYTc2OTExMWE1OTg4MmNkMTlkZDc5OWQzYmNhNWZmYTgyNzkxMDgwOmI2NDNiNjIxNzc0ODk4MzgzMGIyNmFjMTRhMzVhMzMyMmRkNTI4YzAwOTYzZWFhZGQ5MWVmNTVmNTEzZGM3M2YiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQoY3BhdGgpLyQoYnVuZGxlLWlkKSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfQogICAgICBdLAogICAgICAiZGV2aWNlcyI6IFtdLAogICAgICAic2FuZGJveF9waWRucyI6IGZhbHNlLAogICAgICAiZXhlY19jb21tYW5kcyI6IFtdLAogICAgICAiZW52X21hcCI6IHsKICAgICAgICAiR0VUX0hPU1RTX0ZST00iOiAiZG5zIiwKICAgICAgICAiSE9TVE5BTUUiOiAiJChob3N0LW5hbWUpIiwKICAgICAgICAiUEFUSCI6ICIvdXNyL2xvY2FsL3NiaW46L3Vzci9sb2NhbC9iaW46L3Vzci9zYmluOi91c3IvYmluOi9zYmluOi9iaW4iCiAgICAgIH0KICAgIH0KICBdLAogICJjb21tb24iOiB7CiAgICAiY3BhdGgiOiAiL3J1bi9rYXRhLWNvbnRhaW5lcnMvc2hhcmVkL2NvbnRhaW5lcnMiLAogICAgIm1vdW50X3NvdXJjZV9jcGF0aCI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zaGFyZWQvY29udGFpbmVycyIsCiAgICAic2ZwcmVmaXgiOiAiXiQoY3BhdGgpLyQoYnVuZGxlLWlkKS1bYS16MC05XXsxNn0tIiwKICAgICJzcGF0aCI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L3N0b3JhZ2UiLAogICAgImlwdjRfYSI6ICIoKFswLTldfFsxLTldWzAtOV18MVswLTldezJ9fDJbMC00XVswLTldfDI1WzAtNV0pXFwuKXszfShbMC05XXxbMS05XVswLTldfDFbMC05XXsyfXwyWzAtNF1bMC05XXwyNVswLTVdKSIsCiAgICAiaXBfcCI6ICJbMC05XXsxLDV9IiwKICAgICJzdmNfbmFtZSI6ICJbQS1aX1xcLlxcLV0rIiwKICAgICJkbnNfbGFiZWwiOiAiW2EtekEtWjAtOV9cXC5cXC1dKyIsCiAgICAic19zb3VyY2UxIjogIl4uLjJbMC05XXszfV9bMC0xXVswLTldX1swLTNdWzAtOV1fWzAtMl1bMC05XV9bMC01XVswLTldX1swLTVdWzAtOV1cXC5bMC05XXsxLDEwfSQiLAogICAgInNfc291cmNlMiI6ICJeLi5kYXRhLyIsCiAgICAiZG5zX3N1YmRvbWFpbiI6ICJeW2EtejAtOV0oWy1hLXowLTldKlthLXowLTldKT8kIiwKICAgICJwb2RfdWlkIjogIl5bMC05YS1mQS1GXXs4fS1bMC05YS1mQS1GXXs0fS1bMC05YS1mQS1GXXs0fS1bMC05YS1mQS1GXXs0fS1bMC05YS1mQS1GXXsxMn0kIiwKICAgICJkZWZhdWx0X2NhcHMiOiBbCiAgICAgICJDQVBfQ0hPV04iLAogICAgICAiQ0FQX0RBQ19PVkVSUklERSIsCiAgICAgICJDQVBfRlNFVElEIiwKICAgICAgIkNBUF9GT1dORVIiLAogICAgICAiQ0FQX01LTk9EIiwKICAgICAgIkNBUF9ORVRfUkFXIiwKICAgICAgIkNBUF9TRVRHSUQiLAogICAgICAiQ0FQX1NFVFVJRCIsCiAgICAgICJDQVBfU0VURkNBUCIsCiAgICAgICJDQVBfU0VUUENBUCIsCiAgICAgICJDQVBfTkVUX0JJTkRfU0VSVklDRSIsCiAgICAgICJDQVBfU1lTX0NIUk9PVCIsCiAgICAgICJDQVBfS0lMTCIsCiAgICAgICJDQVBfQVVESVRfV1JJVEUiCiAgICBdLAogICAgInByaXZpbGVnZWRfY2FwcyI6IFsKICAgICAgIkNBUF9DSE9XTiIsCiAgICAgICJDQVBfREFDX09WRVJSSURFIiwKICAgICAgIkNBUF9EQUNfUkVBRF9TRUFSQ0giLAogICAgICAiQ0FQX0ZPV05FUiIsCiAgICAgICJDQVBfRlNFVElEIiwKICAgICAgIkNBUF9LSUxMIiwKICAgICAgIkNBUF9TRVRHSUQiLAogICAgICAiQ0FQX1NFVFVJRCIsCiAgICAgICJDQVBfU0VUUENBUCIsCiAgICAgICJDQVBfTElOVVhfSU1NVVRBQkxFIiwKICAgICAgIkNBUF9ORVRfQklORF9TRVJWSUNFIiwKICAgICAgIkNBUF9ORVRfQlJPQURDQVNUIiwKICAgICAgIkNBUF9ORVRfQURNSU4iLAogICAgICAiQ0FQX05FVF9SQVciLAogICAgICAiQ0FQX0lQQ19MT0NLIiwKICAgICAgIkNBUF9JUENfT1dORVIiLAogICAgICAiQ0FQX1NZU19NT0RVTEUiLAogICAgICAiQ0FQX1NZU19SQVdJTyIsCiAgICAgICJDQVBfU1lTX0NIUk9PVCIsCiAgICAgICJDQVBfU1lTX1BUUkFDRSIsCiAgICAgICJDQVBfU1lTX1BBQ0NUIiwKICAgICAgIkNBUF9TWVNfQURNSU4iLAogICAgICAiQ0FQX1NZU19CT09UIiwKICAgICAgIkNBUF9TWVNfTklDRSIsCiAgICAgICJDQVBfU1lTX1JFU09VUkNFIiwKICAgICAgIkNBUF9TWVNfVElNRSIsCiAgICAgICJDQVBfU1lTX1RUWV9DT05GSUciLAogICAgICAiQ0FQX01LTk9EIiwKICAgICAgIkNBUF9MRUFTRSIsCiAgICAgICJDQVBfQVVESVRfV1JJVEUiLAogICAgICAiQ0FQX0FVRElUX0NPTlRST0wiLAogICAgICAiQ0FQX1NFVEZDQVAiLAogICAgICAiQ0FQX01BQ19PVkVSUklERSIsCiAgICAgICJDQVBfTUFDX0FETUlOIiwKICAgICAgIkNBUF9TWVNMT0ciLAogICAgICAiQ0FQX1dBS0VfQUxBUk0iLAogICAgICAiQ0FQX0JMT0NLX1NVU1BFTkQiLAogICAgICAiQ0FQX0FVRElUX1JFQUQiLAogICAgICAiQ0FQX1BFUkZNT04iLAogICAgICAiQ0FQX0JQRiIsCiAgICAgICJDQVBfQ0hFQ0tQT0lOVF9SRVNUT1JFIgogICAgXSwKICAgICJ2aXJ0aW9fYmxrX3N0b3JhZ2VfY2xhc3NlcyI6IFsKICAgICAgImNjLWxvY2FsLWNzaSIsCiAgICAgICJjYy1tYW5hZ2VkLWNzaSIsCiAgICAgICJjYy1tYW5hZ2VkLXByZW1pdW0tY3NpIgogICAgXSwKICAgICJzbWJfc3RvcmFnZV9jbGFzc2VzIjogWwogICAgICB7CiAgICAgICAgIm5hbWUiOiAiYXp1cmVmaWxlLWNzaS1rYXRhLWNjIiwKICAgICAgICAibW91bnRfb3B0aW9ucyI6IFsKICAgICAgICAgICJkaXJfbW9kZT0wNzc3IiwKICAgICAgICAgICJmaWxlX21vZGU9MDc3NyIsCiAgICAgICAgICAibWZzeW1saW5rcyIsCiAgICAgICAgICAiY2FjaGU9c3RyaWN0IiwKICAgICAgICAgICJub3NoYXJlc29jayIsCiAgICAgICAgICAiYWN0aW1lbz0zMCIsCiAgICAgICAgICAibm9icmwiCiAgICAgICAgXQogICAgICB9CiAgICBdCiAgfSwKICAic2FuZGJveCI6IHsKICAgICJzdG9yYWdlcyI6IFsKICAgICAgewogICAgICAgICJkcml2ZXIiOiAiZXBoZW1lcmFsIiwKICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAic291cmNlIjogInNobSIsCiAgICAgICAgImZzdHlwZSI6ICJ0bXBmcyIsCiAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgIm5vZGV2IiwKICAgICAgICAgICJtb2RlPTE3NzciLAogICAgICAgICAgInNpemU9NjcxMDg4NjQiCiAgICAgICAgXSwKICAgICAgICAibW91bnRfcG9pbnQiOiAiL3J1bi9rYXRhLWNvbnRhaW5lcnMvc2FuZGJveC9zaG0iLAogICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgfQogICAgXQogIH0sCiAgInJlcXVlc3RfZGVmYXVsdHMiOiB7CiAgICAiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdCI6IHsKICAgICAgImFsbG93X2Vudl9yZWdleCI6IFsKICAgICAgICAiXkhPU1ROQU1FPSQoZG5zX2xhYmVsKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfUE9SVF8kKGlwX3ApX1RDUD10Y3A6Ly8kKGlwdjRfYSk6JChpcF9wKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfUE9SVF8kKGlwX3ApX1RDUF9QUk9UTz10Y3AkIiwKICAgICAgICAiXiQoc3ZjX25hbWUpX1BPUlRfJChpcF9wKV9UQ1BfUE9SVD0kKGlwX3ApJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9QT1JUXyQoaXBfcClfVENQX0FERFI9JChpcHY0X2EpJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9TRVJWSUNFX0hPU1Q9JChpcHY0X2EpJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9TRVJWSUNFX1BPUlQ9JChpcF9wKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfU0VSVklDRV9QT1JUXyQoZG5zX2xhYmVsKT0kKGlwX3ApJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9QT1JUPXRjcDovLyQoaXB2NF9hKTokKGlwX3ApJCIsCiAgICAgICAgIl5BWlVSRV9DTElFTlRfSUQ9W0EtRmEtZjAtOS1dKiQiLAogICAgICAgICJeQVpVUkVfVEVOQU5UX0lEPVtBLUZhLWYwLTktXSokIiwKICAgICAgICAiXkFaVVJFX0ZFREVSQVRFRF9UT0tFTl9GSUxFPS92YXIvcnVuL3NlY3JldHMvYXp1cmUvdG9rZW5zL2F6dXJlLWlkZW50aXR5LXRva2VuJCIsCiAgICAgICAgIl5BWlVSRV9BVVRIT1JJVFlfSE9TVD1odHRwczovL2xvZ2luXFwubWljcm9zb2Z0b25saW5lXFwuY29tLyQiLAogICAgICAgICJeVEVSTT14dGVybSQiCiAgICAgIF0sCiAgICAgICJhbGxvd19lbnZfcmVnZXhfbWFwIjogewogICAgICAgICJDUFVfTElNSVQiOiAiXlswLTldKyQiLAogICAgICAgICJKT0JfQ09NUExFVElPTl9JTkRFWCI6ICJeWzAtOV0qJCIsCiAgICAgICAgIk1FTU9SWV9MSU1JVCI6ICJeWzAtOV0rJCIKICAgICAgfQogICAgfSwKICAgICJDb3B5RmlsZVJlcXVlc3QiOiBbCiAgICAgICIkKHNmcHJlZml4KSIKICAgIF0sCiAgICAiRXhlY1Byb2Nlc3NSZXF1ZXN0IjogewogICAgICAiYWxsb3dlZF9jb21tYW5kcyI6IFtdLAogICAgICAicmVnZXgiOiBbXQogICAgfSwKICAgICJVcGRhdGVSb3V0ZXNSZXF1ZXN0IjogewogICAgICAiZm9yYmlkZGVuX2RldmljZV9uYW1lcyI6IFsKICAgICAgICAibG8iCiAgICAgIF0sCiAgICAgICJmb3JiaWRkZW5fc291cmNlX3JlZ2V4IjogWwogICAgICAgICJeKD86MHswLDR9Oil7MCw3fTB7MCwzfTEkIiwKICAgICAgICAiXjEyN1xcLig/OlswLTldezEsM31cXC4pezJ9WzAtOV17MSwzfSQiCiAgICAgIF0KICAgIH0sCiAgICAiVXBkYXRlSW50ZXJmYWNlUmVxdWVzdCI6IHsKICAgICAgImFsbG93X3Jhd19mbGFncyI6IDEyOCwKICAgICAgImZvcmJpZGRlbl9uYW1lcyI6IFsKICAgICAgICAibG8iCiAgICAgIF0sCiAgICAgICJmb3JiaWRkZW5faHdfYWRkcnMiOiBbCiAgICAgICAgIjAwOjAwOjAwOjAwOjAwOjAwIgogICAgICBdCiAgICB9LAogICAgIkNsb3NlU3RkaW5SZXF1ZXN0IjogZmFsc2UsCiAgICAiUmVhZFN0cmVhbVJlcXVlc3QiOiBmYWxzZSwKICAgICJVcGRhdGVFcGhlbWVyYWxNb3VudHNSZXF1ZXN0IjogZmFsc2UsCiAgICAiV3JpdGVTdHJlYW1SZXF1ZXN0IjogZmFsc2UKICB9Cn0= + spec: + runtimeClassName: kata-cc + securityContext: + runAsUser: 0 + containers: + - name: busy + image: "mcr.microsoft.com/aks/e2e/library-busybox:master.220314.1-linux-amd64" + env: + - name: GET_HOSTS_FROM + value: dns + resources: + requests: + cpu: 100m + memory: 100Mi + ports: + - containerPort: 6379 + replicas: 2 diff --git a/src/agent/samples/policy/yaml/replica-set/replica2.yaml b/src/agent/samples/policy/yaml/replica-set/replica2.yaml new file mode 100644 index 000000000000..da5dc3cdd416 --- /dev/null +++ b/src/agent/samples/policy/yaml/replica-set/replica2.yaml @@ -0,0 +1,26 @@ +--- +apiVersion: apps/v1 +kind: ReplicaSet +metadata: + name: replica2 + labels: + app: busybox2 +spec: + selector: + matchLabels: + app: replica2 + template: + metadata: + labels: + app: replica2 + annotations: + io.katacontainers.config.agent.policy: IyBDb3B5cmlnaHQgKGMpIDIwMjMgTWljcm9zb2Z0IENvcnBvcmF0aW9uCiMKIyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMAojCnBhY2thZ2UgYWdlbnRfcG9saWN5CgppbXBvcnQgZnV0dXJlLmtleXdvcmRzLmluCmltcG9ydCBmdXR1cmUua2V5d29yZHMuZXZlcnkKCiMgRGVmYXVsdCB2YWx1ZXMsIHJldHVybmVkIGJ5IE9QQSB3aGVuIHJ1bGVzIGNhbm5vdCBiZSBldmFsdWF0ZWQgdG8gdHJ1ZS4KZGVmYXVsdCBBZGRBUlBOZWlnaGJvcnNSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgQWRkU3dhcFJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBDbG9zZVN0ZGluUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IENvcHlGaWxlUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IENyZWF0ZUNvbnRhaW5lclJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBDcmVhdGVTYW5kYm94UmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IERlc3Ryb3lTYW5kYm94UmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgRXhlY1Byb2Nlc3NSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgR2V0T09NRXZlbnRSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBHdWVzdERldGFpbHNSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBMaXN0SW50ZXJmYWNlc1JlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBMaXN0Um91dGVzUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IE1lbUhvdHBsdWdCeVByb2JlUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IE9ubGluZUNQVU1lbVJlcXVlc3QgOj0gdHJ1ZQpkZWZhdWx0IFBhdXNlQ29udGFpbmVyUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFJlYWRTdHJlYW1SZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgUmVtb3ZlQ29udGFpbmVyUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgUmVtb3ZlU3RhbGVWaXJ0aW9mc1NoYXJlTW91bnRzUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgUmVzZWVkUmFuZG9tRGV2UmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFJlc3VtZUNvbnRhaW5lclJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBTZXRHdWVzdERhdGVUaW1lUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFNldFBvbGljeVJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBTaWduYWxQcm9jZXNzUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgU3RhcnRDb250YWluZXJSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBTdGFydFRyYWNpbmdSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgU3RhdHNDb250YWluZXJSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBTdG9wVHJhY2luZ1JlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBUdHlXaW5SZXNpemVSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBVcGRhdGVDb250YWluZXJSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgVXBkYXRlRXBoZW1lcmFsTW91bnRzUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFVwZGF0ZUludGVyZmFjZVJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBVcGRhdGVSb3V0ZXNSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgV2FpdFByb2Nlc3NSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBXcml0ZVN0cmVhbVJlcXVlc3QgOj0gZmFsc2UKCiMgQWxsb3dSZXF1ZXN0c0ZhaWxpbmdQb2xpY3kgOj0gdHJ1ZSBjb25maWd1cmVzIHRoZSBBZ2VudCB0byAqYWxsb3cgYW55CiMgcmVxdWVzdHMgY2F1c2luZyBhIHBvbGljeSBmYWlsdXJlKi4gVGhpcyBpcyBhbiB1bnNlY3VyZSBjb25maWd1cmF0aW9uCiMgYnV0IGlzIHVzZWZ1bCBmb3IgYWxsb3dpbmcgdW5zZWN1cmUgcG9kcyB0byBzdGFydCwgdGhlbiBjb25uZWN0IHRvCiMgdGhlbSBhbmQgaW5zcGVjdCBPUEEgbG9ncyBmb3IgdGhlIHJvb3QgY2F1c2Ugb2YgYSBmYWlsdXJlLgpkZWZhdWx0IEFsbG93UmVxdWVzdHNGYWlsaW5nUG9saWN5IDo9IGZhbHNlCgojIENvbnN0YW50cwpTX05BTUVfS0VZID0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZSIKU19OQU1FU1BBQ0VfS0VZID0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZXNwYWNlIgpCVU5ETEVfSUQgPSAiW2EtejAtOV17NjR9IgoKQ3JlYXRlQ29udGFpbmVyUmVxdWVzdDo9IHJlc3AgewogICAgbm90IGlzX251bGwoaW5wdXQuZW52X21hcCkKICAgIAogICAgaV9lbnZfbWFwIDo9IGlucHV0LmVudl9tYXAKICAgIAogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBwX2Vudl9tYXAgOj0gcF9jb250YWluZXIuZW52X21hcCAgCiAgICBhbGxvd19lbnZfbWFwKHBfZW52X21hcCwgaV9lbnZfbWFwKQogICAgCiAgICBpX3Byb2Nlc3MgOj0gaW5wdXQuYmFzZS5PQ0kuUHJvY2VzcwogICAgCiAgICBwX3Byb2Nlc3MgOj0gcF9jb250YWluZXIuT0NJLlByb2Nlc3MKICAgIAogICAgYWxsb3dfYXJncyhpX3Byb2Nlc3MsIHBfcHJvY2VzcywgaV9lbnZfbWFwKQoKICAgIHJlc3AgPSBDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uKGlucHV0LmJhc2UpCiAgICBwcmludCgiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdDogdHJ1ZSIpCn0KCmFsbG93X2FyZ3MoaV9wcm9jZXNzLCBwX3Byb2Nlc3MsIGlfZW52X21hcCkgewogICAgaV9hcmdzIDo9IGlfcHJvY2Vzcy5BcmdzCiAgICBwX2FyZ3MgOj0gcF9wcm9jZXNzLkFyZ3MKICAgIHByaW50KCJhbGxvd19hcmdzOiBpX2FyZ3MgPSIsIGlfYXJncywgInBfYXJncyA9IiwgcF9hcmdzKQogICAgY291bnQoaV9hcmdzKSA9PSBjb3VudChwX2FyZ3MpCiAgICBldmVyeSBpLCBpX2FyZyBpbiBpX2FyZ3MgewogICAgICAgIHByaW50KCJhbGxvd19hcmdzOiBpX2FyZyA9IiwgaV9hcmcpCiAgICAgICAgcF9hcmdfcmVwbGFjZWQgOj0gcmVwbGFjZV9lbnZfdmFyaWFibGVzKHBfYXJnc1tpXSwgaV9lbnZfbWFwKQogICAgICAgIHByaW50KCJhbGxvd19hcmdzOiBwX2FyZ19yZXBsYWNlZCA9IiwgcF9hcmdfcmVwbGFjZWQpCiAgICAgICAgcF9hcmdfcmVwbGFjZWQyIDo9IHJlcGxhY2UocF9hcmdfcmVwbGFjZWQsICIkJCIsICIkIikKICAgICAgICBwcmludCgiYWxsb3dfYXJnczogcF9hcmdfcmVwbGFjZWQyID0iLCBwX2FyZ19yZXBsYWNlZDIpCiAgICAgICAgaV9hcmcgPT0gcF9hcmdfcmVwbGFjZWQyCiAgICB9CiAgICBwcmludCgiYWxsb3dfYXJnczogdHJ1ZSIpCn0KCmFsbG93X2FyZ3MoaV9wcm9jZXNzLCBwX3Byb2Nlc3MsIGlfZW52X21hcCkgewogICAgbm90IGlfcHJvY2Vzcy5BcmdzCiAgICBub3QgcF9wcm9jZXNzLkFyZ3MKICAgIHByaW50KCJhbGxvd19hcmdzMjogbm8gYXJncyIpCn0KCiMgdGhpcyBmdW5jdGlvbiByZXBsYWNlcyBhbGwgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyBpbiBhIHN0cmluZywgZ2l2ZW4gYSBtYXAgb2YgZW52aXJvbm1lbnQga2V5cyB0byBlbnZpcm9ubWVudCB2YWx1ZXMKIyBlZyBzdHIgPSAiZWNobyAkKENMVVNURVJfSUQpOyBlY2hvICQoTk9ERV9OQU1FKTsiCiMgZW52X21hcCA9IHsiQ0xVU1RFUl9JRCI6ICJhYmMiLCAiTk9ERV9OQU1FIiA6ICJ4eXoifQojIHJlc3VsdCA9ICJlY2hvIGFiYzsgZWNobyB4eXo7IgpyZXBsYWNlX2Vudl92YXJpYWJsZXMoc3RyLCBlbnZfbWFwKSA9IHJlc3VsdCB7CiAgICAjIG1ha2UgYW4gYXJyYXkgb2YgdGhlIGtleXMgZWcgWyJDTFVTVEVSX0lEIiwgIk5PREVfTkFNRSJdCiAgICBrZXlzIDo9IFt4IHwgc29tZSB4IGluIG9iamVjdC5rZXlzKGVudl9tYXApXQogICAgcmVzdWx0IDo9IHJlcGxhY2Vfc3RyX3JlYyhzdHIsIGVudl9tYXAsIGtleXMsIGNvdW50KGtleXMpIC0gMSkKfQoKIyBiYXNlIGNhc2UKcmVwbGFjZV9zdHJfcmVjKHN0ciwgZW52X21hcCwgYXJyX2tleXMsIGkpID0gcmVzdWx0IHsKICAgIGkgPCAwCiAgICByZXN1bHQgOj0gc3RyCn0KCiMgcmVjdXJzaXZlIHN0ZXAKcmVwbGFjZV9zdHJfcmVjKHN0ciwgZW52X21hcCwgYXJyX2tleXMsIGkpID0gcmVzdWx0IHsKICAgIGkgPj0gMAogICAga2V5IDo9IGFycl9rZXlzW2ldCiAgICBlbnZfa2V5MSA6PSBjb25jYXQoIiIsIFsiJCgiLCBrZXksICIpIl0pCiAgICAjIHJlcGxhY2UgJChWQVIpIHdpdGggdmFsdWUKICAgIG5ld19zdHIxIDo9IHJlcGxhY2Uoc3RyLCBlbnZfa2V5MSwgZW52X21hcFtrZXldKQogICAgIyByZXBsYWNlIG5leHQgZW52aXJvbm1lbnQgdmFyaWFibGUKICAgIHJlc3VsdCA9IHJlcGxhY2Vfc3RyX3JlYyhuZXdfc3RyMSwgZW52X21hcCwgYXJyX2tleXMsIGkgLSAxKQp9CgphbGxvd19lbnZfbWFwKHBfZW52X21hcCwgaV9lbnZfbWFwKSB7CiAgICBwcmludCgiYWxsb3dfZW52X21hcDogcF9lbnZfbWFwID0iLCBwX2Vudl9tYXApCiAgICBldmVyeSBlbnZfa2V5LCBlbnZfdmFsIGluIGlfZW52X21hcCB7CiAgICAgICAgcHJpbnQoImFsbG93X2VudjogZW52X2tleSA9IiwgZW52X2tleSwgImVudl92YWwgPSIsIGVudl92YWwpCiAgICAgICAgYWxsb3dfZW52X21hcF9lbnRyeShlbnZfa2V5LCBlbnZfdmFsLCBwX2Vudl9tYXApCiAgICB9CiAgICBwcmludCgiYWxsb3dfZW52X21hcDogdHJ1ZSIpCn0KCiMgQWxsb3cgZXhhY3QgbWF0Y2gKYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBpX3ZhbCA9PSBwX3ZhbAogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnk6IHRydWUiKQp9CgojIEFsbG93IHJlc291cmNlRmllbGRSZWYgdmFsdWVzIChlLmcuLCAibGltaXRzLmNwdSIpLgphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgICMgYSB2YXJpYWJsZSB3ZSBzaG91bGQgYmUgdmFsaWRhdGluZyB1c2luZyBhIHJlZ2V4IGZyb20gc2V0dGluZ3MKICAgIHBfdmFsID09ICIkKHZhbGlkYXRlLWZyb20tc2V0dGluZ3MpIgogICAgcmVnZXhfdmFsIDo9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuQ3JlYXRlQ29udGFpbmVyUmVxdWVzdC5hbGxvd19lbnZfcmVnZXhfbWFwW2tleV0KICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4X3ZhbCwgaV92YWwpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSAyOiB0cnVlIikKfQoKIyBBbGxvdyBub2RlLW5hbWUKYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChub2RlLW5hbWUpIgogICAgcmVnZXgubWF0Y2gocG9saWN5X2RhdGEuY29tbW9uLmRuc19zdWJkb21haW4gLCBpX3ZhbCkKICAgIHByaW50KCJhbGxvd19lbnZfbWFwX2VudHJ5IDM6IHRydWUiKQp9CgojIEFsbG93IGhvc3QtbmFtZQphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgIHBfdmFsID09ICIkKGhvc3QtbmFtZSkiCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24uZG5zX2xhYmVsICwgaV92YWwpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSA0OiB0cnVlIikKfQoKIyBBbGxvdyBwb2QtdWlkCmFsbG93X2Vudl9tYXBfZW50cnkoa2V5LCBpX3ZhbCwgcF9lbnZfbWFwKSB7CiAgICBwX3ZhbCA6PSBwX2Vudl9tYXBba2V5XQogICAgcF92YWwgPT0gIiQocG9kLXVpZCkiCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24ucG9kX3VpZCAsIGlfdmFsKQogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgNTogdHJ1ZSIpCn0KCiMgQWxsb3cgZmllbGRSZWYgImZpZWxkUGF0aDogc3RhdHVzLnBvZElQIiB2YWx1ZXMuCmFsbG93X2Vudl9tYXBfZW50cnkoa2V5LCBpX3ZhbCwgcF9lbnZfbWFwKSB7CiAgICBpc19pcChpX3ZhbCkKCiAgICBwX3ZhbCA6PSBwX2Vudl9tYXBba2V5XQogICAgcF92YXIgOj0gY29uY2F0KCI9IiwgW2tleSwgcF92YWxdKQogICAgYWxsb3dfcG9kX2lwX3ZhcihrZXksIHBfdmFyKQogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgNjogdHJ1ZSIpCn0KCiMgQWxsb3cgZmllbGRSZWYgImZpZWxkUGF0aDogc3RhdHVzLmhvc3RJUCIgdmFsdWVzLgphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgaXNfaXAoaV92YWwpCgogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgIHBfdmFyIDo9IGNvbmNhdCgiPSIsIFtrZXksIHBfdmFsXSkKICAgIGFsbG93X2hvc3RfaXBfdmFyKGtleSwgcF92YXIpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSA3OiB0cnVlIikKfQoKIyBNYXRjaCBpbnB1dCB3aXRoIG9uZSBvZiB0aGUgcG9saWN5IHZhcmlhYmxlcywgYWZ0ZXIgc3Vic3RpdHV0aW5nICQoc2FuZGJveC1uYW1lKS4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChzYW5kYm94LW5hbWUpIgogICAgc19uYW1lIDo9IGlucHV0LmJhc2UuT0NJLkFubm90YXRpb25zW1NfTkFNRV9LRVldCiAgICBwX3ZhcjIgOj0gcmVwbGFjZShwX3ZhbCwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHBfdmFyMiA9PSBpX3ZhbAogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgODogdHJ1ZSIpCn0KCiMgTWF0Y2ggaW5wdXQgd2l0aCBvbmUgb2YgdGhlIHBvbGljeSB2YXJpYWJsZXMsIGFmdGVyIHN1YnN0aXR1dGluZyAkKHNhbmRib3gtbmFtZXNwYWNlKS4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChzYW5kYm94LW5hbWVzcGFjZSkiCiAgICBzX25hbWVzcGFjZSA6PSBpbnB1dC5iYXNlLk9DSS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwX3ZhcjIgOj0gcmVwbGFjZShwX3ZhbCwgIiQoc2FuZGJveC1uYW1lc3BhY2UpIiwgc19uYW1lc3BhY2UpCiAgICBwX3ZhcjIgPT0gaV92YWwKICAgIHByaW50KCJhbGxvd19lbnZfbWFwX2VudHJ5IDk6IHRydWUiKQp9CgojIEFsbG93IGlucHV0IGVudiB2YXJpYWJsZXMgdGhhdCBtYXRjaCB3aXRoIGEgcmVxdWVzdF9kZWZhdWx0cyByZWdleC4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHNvbWUgcF9yZWdleDEgaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5DcmVhdGVDb250YWluZXJSZXF1ZXN0LmFsbG93X2Vudl9yZWdleAogICAgcF9yZWdleDIgOj0gcmVwbGFjZShwX3JlZ2V4MSwgIiQoaXB2NF9hKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcHY0X2EpCiAgICBwX3JlZ2V4MyA6PSByZXBsYWNlKHBfcmVnZXgyLCAiJChpcF9wKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcF9wKQogICAgcF9yZWdleDQgOj0gcmVwbGFjZShwX3JlZ2V4MywgIiQoc3ZjX25hbWUpIiwgcG9saWN5X2RhdGEuY29tbW9uLnN2Y19uYW1lKQogICAgcF9yZWdleDUgOj0gcmVwbGFjZShwX3JlZ2V4NCwgIiQoZG5zX2xhYmVsKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5kbnNfbGFiZWwpCgogICAgcmVzdWx0IDo9IGNvbmNhdCgiPSIsIFtrZXksIGlfdmFsXSkKICAgIHJlZ2V4Lm1hdGNoKHBfcmVnZXg1LCByZXN1bHQpCgogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgMTA6IHRydWUiKQp9CgpDcmVhdGVDb250YWluZXJSZXF1ZXN0Oj0gcmVzcCB7CiAgICBub3QgaW5wdXQuZW52X21hcAogICAgaV9wcm9jZXNzID0gaW5wdXQuT0NJLlByb2Nlc3MKICAgIHNfbmFtZSA9IGlucHV0Lk9DSS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBwX3Byb2Nlc3MgPSBwX2NvbnRhaW5lci5PQ0kuUHJvY2VzcwogICAgYWxsb3dfZGVwcmVjYXRlZF9hcmdzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUpCiAgICByZXNwID0gQ3JlYXRlQ29udGFpbmVyUmVxdWVzdENvbW1vbihpbnB1dCkKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0MjogdHJ1ZSIpCn0KCkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb24ocmVxKTo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgICMgQ2hlY2sgaWYgdGhlIGlucHV0IHJlcXVlc3Qgc2hvdWxkIGJlIHJlamVjdGVkIGV2ZW4gYmVmb3JlIGNoZWNraW5nIHRoZQogICAgIyBwb2xpY3lfZGF0YS5jb250YWluZXJzIGluZm9ybWF0aW9uLgogICAgYWxsb3dfY3JlYXRlX2NvbnRhaW5lcl9pbnB1dChyZXEpCgogICAgaV9vY2kgOj0gcmVxLk9DSQogICAgaV9zdG9yYWdlcyA6PSByZXEuc3RvcmFnZXMKICAgIGlfZGV2aWNlcyA6PSByZXEuZGV2aWNlcwoKICAgICMgYXJyYXkgb2YgcG9zc2libGUgc3RhdGUgb3BlcmF0aW9ucwogICAgb3BzX2J1aWxkZXIgOj0gW10KCiAgICAjIGNoZWNrIHNhbmRib3ggbmFtZQogICAgc2FuZGJveF9uYW1lID0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FX0tFWV0KICAgIGFkZF9zYW5kYm94X25hbWVfdG9fc3RhdGUgOj0gc3RhdGVfYWxsb3dzKCJzYW5kYm94X25hbWUiLCBzYW5kYm94X25hbWUpCiAgICBvcHNfYnVpbGRlcjEgOj0gY29uY2F0X29wX2lmX25vdF9udWxsKG9wc19idWlsZGVyLCBhZGRfc2FuZGJveF9uYW1lX3RvX3N0YXRlKQoKICAgICMgQ2hlY2sgaWYgYW55IGVsZW1lbnQgZnJvbSB0aGUgcG9saWN5X2RhdGEuY29udGFpbmVycyBhcnJheSBhbGxvd3MgdGhlIGlucHV0IHJlcXVlc3QuCiAgICBzb21lIHBfY29udGFpbmVyIGluIHBvbGljeV9kYXRhLmNvbnRhaW5lcnMKICAgIHByaW50KCI9PT09PT09PSBDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiB0cnlpbmcgbmV4dCBwb2xpY3kgY29udGFpbmVyIikKCiAgICBwX3BpZG5zIDo9IHBfY29udGFpbmVyLnNhbmRib3hfcGlkbnMKICAgIGlfcGlkbnMgOj0gcmVxLnNhbmRib3hfcGlkbnMKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiBwX3BpZG5zID0iLCBwX3BpZG5zLCAiaV9waWRucyA9IiwgaV9waWRucykKICAgIHBfcGlkbnMgPT0gaV9waWRucwoKICAgIHBfb2NpIDo9IHBfY29udGFpbmVyLk9DSQoKICAgICMgY2hlY2sgbmFtZXNwYWNlCiAgICBwX25hbWVzcGFjZSA6PSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBpX25hbWVzcGFjZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwcmludCAoIkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb246IHBfbmFtZXNwYWNlID0iLCBwX25hbWVzcGFjZSwgImlfbmFtZXNwYWNlID0iLCBpX25hbWVzcGFjZSkKICAgIGFkZF9uYW1lc3BhY2VfdG9fc3RhdGUgOj0gYWxsb3dfbmFtZXNwYWNlKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkKICAgIG9wc19idWlsZGVyMiA6PSBjb25jYXRfb3BfaWZfbm90X251bGwob3BzX2J1aWxkZXIxLCBhZGRfbmFtZXNwYWNlX3RvX3N0YXRlKQoKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiBwIFZlcnNpb24gPSIsIHBfb2NpLlZlcnNpb24sICJpIFZlcnNpb24gPSIsIGlfb2NpLlZlcnNpb24pCiAgICBwX29jaS5WZXJzaW9uID09IGlfb2NpLlZlcnNpb24KCiAgICBwcmludCgiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdENvbW1vbjogcCBSZWFkb25seSA9IiwgcF9vY2kuUm9vdC5SZWFkb25seSwgImkgUmVhZG9ubHkgPSIsIGlfb2NpLlJvb3QuUmVhZG9ubHkpCiAgICBwX29jaS5Sb290LlJlYWRvbmx5ID09IGlfb2NpLlJvb3QuUmVhZG9ubHkKCiAgICBhbGxvd19hbm5vKHBfb2NpLCBpX29jaSkKCiAgICBwX3N0b3JhZ2VzIDo9IHBfY29udGFpbmVyLnN0b3JhZ2VzCiAgICBhbGxvd19ieV9hbm5vKHBfb2NpLCBpX29jaSwgcF9zdG9yYWdlcywgaV9zdG9yYWdlcykKCiAgICBwX2RldmljZXMgOj0gcF9jb250YWluZXIuZGV2aWNlcwogICAgYWxsb3dfZGV2aWNlcyhwX2RldmljZXMsIGlfZGV2aWNlcykKCiAgICByZXQgOj0gYWxsb3dfbGludXgob3BzX2J1aWxkZXIyLCBwX29jaSwgaV9vY2kpCiAgICByZXQuYWxsb3dlZAoKICAgIG9wcyA6PSByZXQub3BzCgogICAgcHJpbnQoIkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb246IHRydWUiKQp9CgphbGxvd19jcmVhdGVfY29udGFpbmVyX2lucHV0KHJlcSkgewogICAgcHJpbnQoImFsbG93X2NyZWF0ZV9jb250YWluZXJfaW5wdXQ6IGlucHV0ID0iLCByZXEpCgogICAgY291bnQocmVxLnNoYXJlZF9tb3VudHMpID09IDAKICAgIGlzX251bGwocmVxLnN0cmluZ191c2VyKQoKICAgIGlfb2NpIDo9IHJlcS5PQ0kKICAgIGlzX251bGwoaV9vY2kuSG9va3MpCiAgICBpc19udWxsKGlfb2NpLlNvbGFyaXMpCiAgICBpc19udWxsKGlfb2NpLldpbmRvd3MpCgogICAgaV9saW51eCA6PSBpX29jaS5MaW51eAogICAgY291bnQoaV9saW51eC5HSURNYXBwaW5ncykgPT0gMAogICAgY291bnQoaV9saW51eC5Nb3VudExhYmVsKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlJlc291cmNlcy5EZXZpY2VzKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlJvb3Rmc1Byb3BhZ2F0aW9uKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlVJRE1hcHBpbmdzKSA9PSAwCiAgICBpc19udWxsKGlfbGludXguSW50ZWxSZHQpCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLkJsb2NrSU8pCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLk5ldHdvcmspCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLlBpZHMpCiAgICBpc19udWxsKGlfbGludXguU2VjY29tcCkKCiAgICBpX3Byb2Nlc3MgOj0gaV9vY2kuUHJvY2VzcwogICAgY291bnQoaV9wcm9jZXNzLlNlbGludXhMYWJlbCkgPT0gMAogICAgY291bnQoaV9wcm9jZXNzLlVzZXIuVXNlcm5hbWUpID09IDAKCiAgICBwcmludCgiYWxsb3dfY3JlYXRlX2NvbnRhaW5lcl9pbnB1dDogdHJ1ZSIpCn0KCmFsbG93X25hbWVzcGFjZShwX25hbWVzcGFjZSwgaV9uYW1lc3BhY2UpID0gYWRkX25hbWVzcGFjZSB7CiAgICBwX25hbWVzcGFjZSA9PSBpX25hbWVzcGFjZQogICAgYWRkX25hbWVzcGFjZSA6PSBudWxsCiAgICBwcmludCgiYWxsb3dfbmFtZXNwYWNlIDE6IGlucHV0IG5hbWVzcGFjZSBtYXRjaGVzIHBvbGljeSBkYXRhIikKfQoKYWxsb3dfbmFtZXNwYWNlKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkgPSBhZGRfbmFtZXNwYWNlIHsKICAgIHBfbmFtZXNwYWNlID09ICIiCiAgICBwcmludCgiYWxsb3dfbmFtZXNwYWNlIDI6IG5vIG5hbWVzcGFjZSBmb3VuZCBvbiBwb2xpY3kgZGF0YSIpCiAgICBhZGRfbmFtZXNwYWNlIDo9IHN0YXRlX2FsbG93cygibmFtZXNwYWNlIiwgaV9uYW1lc3BhY2UpCn0KCiMgdmFsdWUgaGFzbid0IGJlZW4gc2VlbiBiZWZvcmUsIHNhdmUgaXQgdG8gc3RhdGUKc3RhdGVfYWxsb3dzKGtleSwgdmFsdWUpID0gYWN0aW9uIHsKICBzdGF0ZSA6PSBnZXRfc3RhdGUoKQogIHByaW50KCJzdGF0ZV9hbGxvd3MgMTogc3RhdGVba2V5XSA9Iiwgc3RhdGVba2V5XSwgInZhbHVlID0iLCB2YWx1ZSkKICBub3Qgc3RhdGVba2V5XQogIHByaW50KCJzdGF0ZV9hbGxvd3MgMTogc2F2aW5nIHRvIHN0YXRlIGtleSA9Iiwga2V5LCAidmFsdWUgPSIsIHZhbHVlKQogIHBhdGggOj0gZ2V0X3N0YXRlX3BhdGgoa2V5KSAKICBhY3Rpb24gOj0gewogICAgIm9wIjogImFkZCIsCiAgICAicGF0aCI6IHBhdGgsIAogICAgInZhbHVlIjogdmFsdWUsCiAgfQp9CgojIHZhbHVlIG1hdGNoZXMgd2hhdCdzIGluIHN0YXRlLCBhbGxvdyBpdApzdGF0ZV9hbGxvd3Moa2V5LCB2YWx1ZSkgPSBhY3Rpb24gewogIHByaW50KCJzdGF0ZV9hbGxvd3MgMjogc3RhcnQiKQogIHN0YXRlIDo9IGdldF9zdGF0ZSgpCiAgcHJpbnQoInN0YXRlX2FsbG93cyAyOiBzdGF0ZVtrZXldID0iLCBzdGF0ZVtrZXldLCAidmFsdWUgPSIsIHZhbHVlKQogIHZhbHVlID09IHN0YXRlW2tleV0KICBwcmludCgic3RhdGVfYWxsb3dzIDI6IGZvdW5kIGtleSA9Iiwga2V5LCAidmFsdWUgPSIsIHZhbHVlLCAiIGluIHN0YXRlIikKICBhY3Rpb24gOj0gbnVsbAp9CgojIGhlbHBlciBmdW5jdGlvbnMgdG8gaW50ZXJhY3Qgd2l0aCB0aGUgc3RhdGUKZ2V0X3N0YXRlKCkgPSBzdGF0ZSB7CiAgc3RhdGUgOj0gZGF0YVsicHN0YXRlIl0KfQoKZ2V0X3N0YXRlX3ZhbChrZXkpID0gdmFsdWUgewogICAgc3RhdGUgOj0gZ2V0X3N0YXRlKCkKICAgIHZhbHVlIDo9IHN0YXRlW2tleV0KfQoKZ2V0X3N0YXRlX3BhdGgoa2V5KSA9IHBhdGggewogICAgIyBwcmVwZW5kICIvcHN0YXRlLyIgdG8ga2V5CiAgICBwYXRoIDo9IGNvbmNhdCgiLyIsIFsiL3BzdGF0ZSIsIGtleV0pCn0KCiMgSGVscGVyIGZ1bmN0aW9ucyB0byBjb25kaXRpb25hbGx5IGNvbmNhdGVuYXRlIG9wIGlzIG5vdCBudWxsCmNvbmNhdF9vcF9pZl9ub3RfbnVsbChvcHMsIG9wKSA9IHJlc3VsdCB7CiAgICBvcCA9PSBudWxsCiAgICByZXN1bHQgOj0gb3BzCn0KCmNvbmNhdF9vcF9pZl9ub3RfbnVsbChvcHMsIG9wKSA9IHJlc3VsdCB7CiAgICBvcCAhPSBudWxsCiAgICByZXN1bHQgOj0gYXJyYXkuY29uY2F0KG9wcywgW29wXSkKfQoKIyBSZWplY3QgdW5leHBlY3RlZCBhbm5vdGF0aW9ucy4KYWxsb3dfYW5ubyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19hbm5vIDE6IHN0YXJ0IikKCiAgICBub3QgaV9vY2kuQW5ub3RhdGlvbnMKCiAgICBwcmludCgiYWxsb3dfYW5ubyAxOiB0cnVlIikKfQphbGxvd19hbm5vKHBfb2NpLCBpX29jaSkgewogICAgcHJpbnQoImFsbG93X2Fubm8gMjogcCBBbm5vdGF0aW9ucyA9IiwgcF9vY2kuQW5ub3RhdGlvbnMpCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiBpIEFubm90YXRpb25zID0iLCBpX29jaS5Bbm5vdGF0aW9ucykKCiAgICBpX2tleXMgOj0gb2JqZWN0LmtleXMoaV9vY2kuQW5ub3RhdGlvbnMpCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiBpIGtleXMgPSIsIGlfa2V5cykKCiAgICBldmVyeSBpX2tleSBpbiBpX2tleXMgewogICAgICAgIGFsbG93X2Fubm9fa2V5KGlfa2V5LCBwX29jaSkKICAgIH0KCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiB0cnVlIikKfQoKYWxsb3dfYW5ub19rZXkoaV9rZXksIHBfb2NpKSB7CiAgICBwcmludCgiYWxsb3dfYW5ub19rZXkgMTogaSBrZXkgPSIsIGlfa2V5KQoKICAgIHN0YXJ0c3dpdGgoaV9rZXksICJpby5rdWJlcm5ldGVzLmNyaS4iKQoKICAgIHByaW50KCJhbGxvd19hbm5vX2tleSAxOiB0cnVlIikKfQphbGxvd19hbm5vX2tleShpX2tleSwgcF9vY2kpIHsKICAgIHByaW50KCJhbGxvd19hbm5vX2tleSAyOiBpIGtleSA9IiwgaV9rZXkpCgogICAgc29tZSBwX2tleSwgXyBpbiBwX29jaS5Bbm5vdGF0aW9ucwogICAgcF9rZXkgPT0gaV9rZXkKCiAgICBwcmludCgiYWxsb3dfYW5ub19rZXkgMjogdHJ1ZSIpCn0KCiMgR2V0IHRoZSB2YWx1ZSBvZiB0aGUgU19OQU1FX0tFWSBhbm5vdGF0aW9uIGFuZAojIGNvcnJlbGF0ZSBpdCB3aXRoIG90aGVyIGFubm90YXRpb25zIGFuZCBwcm9jZXNzIGZpZWxkcy4KYWxsb3dfYnlfYW5ubyhwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpIHsKICAgIHByaW50KCJhbGxvd19ieV9hbm5vIDE6IHN0YXJ0IikKCiAgICBub3QgcF9vY2kuQW5ub3RhdGlvbnNbU19OQU1FX0tFWV0KCiAgICBpX3NfbmFtZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMTogaV9zX25hbWUgPSIsIGlfc19uYW1lKQoKICAgIGlfc19uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FU1BBQ0VfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMTogaV9zX25hbWVzcGFjZSA9IiwgaV9zX25hbWVzcGFjZSkKCiAgICBhbGxvd19ieV9zYW5kYm94X25hbWUocF9vY2ksIGlfb2NpLCBwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBpX3NfbmFtZSwgaV9zX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfYnlfYW5ubyAxOiB0cnVlIikKfQphbGxvd19ieV9hbm5vKHBfb2NpLCBpX29jaSwgcF9zdG9yYWdlcywgaV9zdG9yYWdlcykgewogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMjogc3RhcnQiKQoKICAgIHBfc19uYW1lIDo9IHBfb2NpLkFubm90YXRpb25zW1NfTkFNRV9LRVldCiAgICBpX3NfbmFtZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMjogaV9zX25hbWUgPSIsIGlfc19uYW1lLCAicF9zX25hbWUgPSIsIHBfc19uYW1lKQoKICAgIGFsbG93X3NhbmRib3hfbmFtZShwX3NfbmFtZSwgaV9zX25hbWUpCgogICAgaV9zX25hbWVzcGFjZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwcmludCgiYWxsb3dfYnlfYW5ubyAyOiBpX3NfbmFtZXNwYWNlID0iLCBpX3NfbmFtZXNwYWNlKQoKICAgIGFsbG93X2J5X3NhbmRib3hfbmFtZShwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMsIGlfc19uYW1lLCBpX3NfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd19ieV9hbm5vIDI6IHRydWUiKQp9CgphbGxvd19ieV9zYW5kYm94X25hbWUocF9vY2ksIGlfb2NpLCBwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfYnlfc2FuZGJveF9uYW1lOiBzdGFydCIpCgogICAgaV9uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FU1BBQ0VfS0VZXQoKICAgIGFsbG93X2J5X2NvbnRhaW5lcl90eXBlcyhwX29jaSwgaV9vY2ksIHNfbmFtZSwgaV9uYW1lc3BhY2UpCiAgICBhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZChwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpCiAgICBhbGxvd19wcm9jZXNzKHBfb2NpLlByb2Nlc3MsIGlfb2NpLlByb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpCgogICAgcHJpbnQoImFsbG93X2J5X3NhbmRib3hfbmFtZTogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfbmFtZShwX3NfbmFtZSwgaV9zX25hbWUpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X25hbWU6IHN0YXJ0IikKICAgIHJlZ2V4Lm1hdGNoKHBfc19uYW1lLCBpX3NfbmFtZSkKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9uYW1lOiB0cnVlIikKfQoKIyBDaGVjayB0aGF0IHRoZSAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLXR5cGUiIGFuZAojICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIiBhbm5vdGF0aW9ucyBkZXNpZ25hdGUgdGhlCiMgZXhwZWN0ZWQgdHlwZSAtIGVpdGhlciBhICJzYW5kYm94IiBvciBhICJjb250YWluZXIiLiBUaGVuLCB2YWxpZGF0ZQojIG90aGVyIGFubm90YXRpb25zIGJhc2VkIG9uIHRoZSBhY3R1YWwgInNhbmRib3giIG9yICJjb250YWluZXIiIHZhbHVlCiMgZnJvbSB0aGUgaW5wdXQgY29udGFpbmVyLgphbGxvd19ieV9jb250YWluZXJfdHlwZXMocF9vY2ksIGlfb2NpLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfYnlfY29udGFpbmVyX3R5cGVzOiBjaGVja2luZyBpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSIpCgogICAgY190eXBlIDo9ICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSIKICAgIAogICAgcF9jcmlfdHlwZSA6PSBwX29jaS5Bbm5vdGF0aW9uc1tjX3R5cGVdCiAgICBpX2NyaV90eXBlIDo9IGlfb2NpLkFubm90YXRpb25zW2NfdHlwZV0KICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZXM6IHBfY3JpX3R5cGUgPSIsIHBfY3JpX3R5cGUsICJpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgcF9jcmlfdHlwZSA9PSBpX2NyaV90eXBlCgogICAgYWxsb3dfYnlfY29udGFpbmVyX3R5cGUoaV9jcmlfdHlwZSwgcF9vY2ksIGlfb2NpLCBzX25hbWUsIHNfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZXM6IHRydWUiKQp9CgphbGxvd19ieV9jb250YWluZXJfdHlwZShpX2NyaV90eXBlLCBwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAxOiBpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgaV9jcmlfdHlwZSA9PSAic2FuZGJveCIKCiAgICBpX2thdGFfdHlwZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1siaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5jb250YWluZXJfdHlwZSJdCiAgICBwcmludCgiYWxsb3dfYnlfY29udGFpbmVyX3R5cGUgMTogaV9rYXRhX3R5cGUgPSIsIGlfa2F0YV90eXBlKQogICAgaV9rYXRhX3R5cGUgPT0gInBvZF9zYW5kYm94IgoKICAgIGFsbG93X3NhbmRib3hfY29udGFpbmVyX25hbWUocF9vY2ksIGlfb2NpKQogICAgYWxsb3dfc2FuZGJveF9uZXRfbmFtZXNwYWNlKHBfb2NpLCBpX29jaSkKICAgIGFsbG93X3NhbmRib3hfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpCgogICAgcHJpbnQoImFsbG93X2J5X2NvbnRhaW5lcl90eXBlIDE6IHRydWUiKQp9CgphbGxvd19ieV9jb250YWluZXJfdHlwZShpX2NyaV90eXBlLCBwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiBpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgaV9jcmlfdHlwZSA9PSAiY29udGFpbmVyIgoKICAgIGlfa2F0YV90eXBlIDo9IGlfb2NpLkFubm90YXRpb25zWyJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIl0KICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiBpX2thdGFfdHlwZSA9IiwgaV9rYXRhX3R5cGUpCiAgICBpX2thdGFfdHlwZSA9PSAicG9kX2NvbnRhaW5lciIKCiAgICBhbGxvd19jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpCiAgICBhbGxvd19uZXRfbmFtZXNwYWNlKHBfb2NpLCBpX29jaSkKICAgIGFsbG93X2xvZ19kaXJlY3RvcnkocF9vY2ksIGlfb2NpKQoKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiB0cnVlIikKfQoKIyAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLW5hbWUiIGFubm90YXRpb24KYWxsb3dfc2FuZGJveF9jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X2NvbnRhaW5lcl9uYW1lOiBzdGFydCIpCgogICAgY29udGFpbmVyX2Fubm90YXRpb25fbWlzc2luZyhwX29jaSwgaV9vY2ksICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItbmFtZSIpCgogICAgcHJpbnQoImFsbG93X3NhbmRib3hfY29udGFpbmVyX25hbWU6IHRydWUiKQp9CgphbGxvd19jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19jb250YWluZXJfbmFtZTogc3RhcnQiKQoKICAgIGFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uKHBfb2NpLCBpX29jaSwgImlvLmt1YmVybmV0ZXMuY3JpLmNvbnRhaW5lci1uYW1lIikKCiAgICBwcmludCgiYWxsb3dfY29udGFpbmVyX25hbWU6IHRydWUiKQp9Cgpjb250YWluZXJfYW5ub3RhdGlvbl9taXNzaW5nKHBfb2NpLCBpX29jaSwga2V5KSB7CiAgICBwcmludCgiY29udGFpbmVyX2Fubm90YXRpb25fbWlzc2luZzoiLCBrZXkpCgogICAgbm90IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIG5vdCBpX29jaS5Bbm5vdGF0aW9uc1trZXldCgogICAgcHJpbnQoImNvbnRhaW5lcl9hbm5vdGF0aW9uX21pc3Npbmc6IHRydWUiKQp9CgphbGxvd19jb250YWluZXJfYW5ub3RhdGlvbihwX29jaSwgaV9vY2ksIGtleSkgewogICAgcHJpbnQoImFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uOiBrZXkgPSIsIGtleSkKCiAgICBwX3ZhbHVlIDo9IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIGlfdmFsdWUgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgcHJpbnQoImFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uOiBwX3ZhbHVlID0iLCBwX3ZhbHVlLCAiaV92YWx1ZSA9IiwgaV92YWx1ZSkKCiAgICBwX3ZhbHVlID09IGlfdmFsdWUKCiAgICBwcmludCgiYWxsb3dfY29udGFpbmVyX2Fubm90YXRpb246IHRydWUiKQp9CgojICJuZXJkY3RsL25ldHdvcmstbmFtZXNwYWNlIiBhbm5vdGF0aW9uCmFsbG93X3NhbmRib3hfbmV0X25hbWVzcGFjZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X25ldF9uYW1lc3BhY2U6IHN0YXJ0IikKCiAgICBrZXkgOj0gIm5lcmRjdGwvbmV0d29yay1uYW1lc3BhY2UiCgogICAgcF9uYW1lc3BhY2UgOj0gcF9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgaV9uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgcHJpbnQoImFsbG93X3NhbmRib3hfbmV0X25hbWVzcGFjZTogcF9uYW1lc3BhY2UgPSIsIHBfbmFtZXNwYWNlLCAiaV9uYW1lc3BhY2UgPSIsIGlfbmFtZXNwYWNlKQoKICAgIHJlZ2V4Lm1hdGNoKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9uZXRfbmFtZXNwYWNlOiB0cnVlIikKfQoKYWxsb3dfbmV0X25hbWVzcGFjZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19uZXRfbmFtZXNwYWNlOiBzdGFydCIpCgogICAga2V5IDo9ICJuZXJkY3RsL25ldHdvcmstbmFtZXNwYWNlIgoKICAgIG5vdCBwX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICBub3QgaV9vY2kuQW5ub3RhdGlvbnNba2V5XQoKICAgIHByaW50KCJhbGxvd19uZXRfbmFtZXNwYWNlOiB0cnVlIikKfQoKIyAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1sb2ctZGlyZWN0b3J5IiBhbm5vdGF0aW9uCmFsbG93X3NhbmRib3hfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X2xvZ19kaXJlY3Rvcnk6IHN0YXJ0IikKCiAgICBrZXkgOj0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbG9nLWRpcmVjdG9yeSIKCiAgICBwX2RpciA6PSBwX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICByZWdleDEgOj0gcmVwbGFjZShwX2RpciwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHJlZ2V4MiA6PSByZXBsYWNlKHJlZ2V4MSwgIiQoc2FuZGJveC1uYW1lc3BhY2UpIiwgc19uYW1lc3BhY2UpCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiByZWdleDIgPSIsIHJlZ2V4MikKCiAgICBpX2RpciA6PSBpX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiBpX2RpciA9IiwgaV9kaXIpCgogICAgcmVnZXgubWF0Y2gocmVnZXgyLCBpX2RpcikKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiB0cnVlIikKfQoKYWxsb3dfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19sb2dfZGlyZWN0b3J5OiBzdGFydCIpCgogICAga2V5IDo9ICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWxvZy1kaXJlY3RvcnkiCgogICAgbm90IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIG5vdCBpX29jaS5Bbm5vdGF0aW9uc1trZXldCgogICAgcHJpbnQoImFsbG93X2xvZ19kaXJlY3Rvcnk6IHRydWUiKQp9CgphbGxvd19kZXZpY2VzKHBfZGV2aWNlcywgaV9kZXZpY2VzKSB7CiAgICBwcmludCgiYWxsb3dfZGV2aWNlczogc3RhcnQiKQogICAgZXZlcnkgaV9kZXZpY2UgaW4gaV9kZXZpY2VzIHsKICAgICAgICBwcmludCgiYWxsb3dfZGV2aWNlczogaV9kZXZpY2UgPSIsIGlfZGV2aWNlKQogICAgICAgIHNvbWUgcF9kZXZpY2UgaW4gcF9kZXZpY2VzCiAgICAgICAgcF9kZXZpY2UuY29udGFpbmVyX3BhdGggPT0gaV9kZXZpY2UuY29udGFpbmVyX3BhdGgKICAgIH0KICAgIHByaW50KCJhbGxvd19kZXZpY2VzOiB0cnVlIikKfQoKYWxsb3dfbGludXgoc3RhdGVfb3BzLCBwX29jaSwgaV9vY2kpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIHBfbmFtZXNwYWNlcyA6PSBwX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbGludXg6IHAgbmFtZXNwYWNlcyA9IiwgcF9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlcyA6PSBpX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbGludXg6IGkgbmFtZXNwYWNlcyA9IiwgaV9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlX3dpdGhvdXRfbmV0d29yayA6PSBbb2JqIHwgb2JqIDo9IGlfbmFtZXNwYWNlc1tfXTsgb2JqLlR5cGUgIT0gIm5ldHdvcmsiXQoKICAgIHByaW50KCJhbGxvd19saW51eDogaV9uYW1lc3BhY2Vfd2l0aG91dF9uZXR3b3JrID0iLCBpX25hbWVzcGFjZV93aXRob3V0X25ldHdvcmspCgogICAgcF9uYW1lc3BhY2VzID09IGlfbmFtZXNwYWNlX3dpdGhvdXRfbmV0d29yawoKICAgIGFsbG93X21hc2tlZF9wYXRocyhwX29jaSwgaV9vY2kpCiAgICBhbGxvd19yZWFkb25seV9wYXRocyhwX29jaSwgaV9vY2kpCiAgICBhbGxvd19saW51eF9kZXZpY2VzKHBfb2NpLkxpbnV4LkRldmljZXMsIGlfb2NpLkxpbnV4LkRldmljZXMpCiAgICBhbGxvd19saW51eF9zeXNjdGwocF9vY2kuTGludXgsIGlfb2NpLkxpbnV4KQogICAgcmV0IDo9IGFsbG93X25ldHdvcmtfbmFtZXNwYWNlX3N0YXJ0KHN0YXRlX29wcywgcF9vY2ksIGlfb2NpKQogICAgcmV0LmFsbG93ZWQKCiAgICBvcHMgOj0gcmV0Lm9wcwoKICAgIHByaW50KCJhbGxvd19saW51eDogdHJ1ZSIpCn0KCiMgUmV0cmlldmUgdGhlICJuZXR3b3JrIiBuYW1lc3BhY2UgZnJvbSB0aGUgaW5wdXQgZGF0YSBhbmQgcGFzcyBpdCBvbiBmb3IgdGhlCiMgbmV0d29yayBuYW1lc3BhY2UgcG9saWN5IGNoZWNrcy4KYWxsb3dfbmV0d29ya19uYW1lc3BhY2Vfc3RhcnQoc3RhdGVfb3BzLCBwX29jaSwgaV9vY2kpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIHByaW50KCJhbGxvd19uZXR3b3JrX25hbWVzcGFjZSBzdGFydDogc3RhcnQiKQoKICAgIHBfbmFtZXNwYWNlcyA6PSBwX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IHAgbmFtZXNwYWNlcyA9IiwgcF9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlcyA6PSBpX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IGkgbmFtZXNwYWNlcyA9IiwgaV9uYW1lc3BhY2VzKQoKICAgICMgUmV0dXJuIHBhdGggb2YgdGhlICJuZXR3b3JrIiBuYW1lc3BhY2UKICAgIG5ldHdvcmtfbnMgOj0gW29iaiB8IG9iaiA6PSBpX25hbWVzcGFjZXNbX107IG9iai5UeXBlID09ICJuZXR3b3JrIl0KCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IG5ldHdvcmtfbnMgPSIsIG5ldHdvcmtfbnMpCgogICAgcmV0IDo9IGFsbG93X25ldHdvcmtfbmFtZXNwYWNlKHN0YXRlX29wcywgbmV0d29ya19ucykKICAgIHJldC5hbGxvd2VkCgogICAgb3BzIDo9IHJldC5vcHMKfQoKIyBUaGlzIHJ1bGUgaXMgd2hlbiB0aGVyZSdzIG5vIG5ldHdvcmsgbmFtZXNwYWNlIGluIHRoZSBpbnB1dCBkYXRhLgphbGxvd19uZXR3b3JrX25hbWVzcGFjZShzdGF0ZV9vcHMsIG5ldHdvcmtfbnMpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIGNvdW50KG5ldHdvcmtfbnMpID09IDAKCiAgICBuZXR3b3JrX25zX3BhdGggPSAiIgoKICAgIGFkZF9uZXR3b3JrX25hbWVzcGFjZV90b19zdGF0ZSA6PSBzdGF0ZV9hbGxvd3MoIm5ldHdvcmtfbmFtZXNwYWNlIiwgbmV0d29ya19uc19wYXRoKQogICAgb3BzIDo9IGNvbmNhdF9vcF9pZl9ub3RfbnVsbChzdGF0ZV9vcHMsIGFkZF9uZXR3b3JrX25hbWVzcGFjZV90b19zdGF0ZSkKCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2UgMTogdHJ1ZSIpCn0KCiMgVGhpcyBydWxlIGlzIHdoZW4gdGhlcmUncyBleGFjdGx5IG9uZSBuZXR3b3JrIG5hbWVzcGFjZSBpbiB0aGUgaW5wdXQgZGF0YS4KYWxsb3dfbmV0d29ya19uYW1lc3BhY2Uoc3RhdGVfb3BzLCBuZXR3b3JrX25zKSA6PSB7Im9wcyI6IG9wcywgImFsbG93ZWQiOiB0cnVlfSB7CiAgICBjb3VudChuZXR3b3JrX25zKSA9PSAxCgogICAgYWRkX25ldHdvcmtfbmFtZXNwYWNlX3RvX3N0YXRlIDo9IHN0YXRlX2FsbG93cygibmV0d29ya19uYW1lc3BhY2UiLCBuZXR3b3JrX25zWzBdLlBhdGgpCiAgICBvcHMgOj0gY29uY2F0X29wX2lmX25vdF9udWxsKHN0YXRlX29wcywgYWRkX25ldHdvcmtfbmFtZXNwYWNlX3RvX3N0YXRlKQoKICAgIHByaW50KCJhbGxvd19uZXR3b3JrX25hbWVzcGFjZSAyOiB0cnVlIikKfQoKYWxsb3dfbWFza2VkX3BhdGhzKHBfb2NpLCBpX29jaSkgewogICAgcF9wYXRocyA6PSBwX29jaS5MaW51eC5NYXNrZWRQYXRocwogICAgcHJpbnQoImFsbG93X21hc2tlZF9wYXRocyAxOiBwX3BhdGhzID0iLCBwX3BhdGhzKQoKICAgIGlfcGF0aHMgOj0gaV9vY2kuTGludXguTWFza2VkUGF0aHMKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aHMgMTogaV9wYXRocyA9IiwgaV9wYXRocykKCiAgICBhbGxvd19tYXNrZWRfcGF0aHNfYXJyYXkocF9wYXRocywgaV9wYXRocykKCiAgICBwcmludCgiYWxsb3dfbWFza2VkX3BhdGhzIDE6IHRydWUiKQp9CmFsbG93X21hc2tlZF9wYXRocyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aHMgMjogc3RhcnQiKQoKICAgIG5vdCBwX29jaS5MaW51eC5NYXNrZWRQYXRocwogICAgbm90IGlfb2NpLkxpbnV4Lk1hc2tlZFBhdGhzCgogICAgcHJpbnQoImFsbG93X21hc2tlZF9wYXRocyAyOiB0cnVlIikKfQoKIyBBbGwgdGhlIHBvbGljeSBtYXNrZWQgcGF0aHMgbXVzdCBiZSBtYXNrZWQgaW4gdGhlIGlucHV0IGRhdGEgdG9vLgojIElucHV0IGlzIGFsbG93ZWQgdG8gaGF2ZSBtb3JlIG1hc2tlZCBwYXRocyB0aGFuIHRoZSBwb2xpY3kuCmFsbG93X21hc2tlZF9wYXRoc19hcnJheShwX2FycmF5LCBpX2FycmF5KSB7CiAgICBldmVyeSBwX2VsZW0gaW4gcF9hcnJheSB7CiAgICAgICAgYWxsb3dfbWFza2VkX3BhdGgocF9lbGVtLCBpX2FycmF5KQogICAgfQp9CgphbGxvd19tYXNrZWRfcGF0aChwX2VsZW0sIGlfYXJyYXkpIHsKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aDogcF9lbGVtID0iLCBwX2VsZW0pCgogICAgc29tZSBpX2VsZW0gaW4gaV9hcnJheQogICAgcF9lbGVtID09IGlfZWxlbQoKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aDogdHJ1ZSIpCn0KCmFsbG93X3JlYWRvbmx5X3BhdGhzKHBfb2NpLCBpX29jaSkgewogICAgcF9wYXRocyA6PSBwX29jaS5MaW51eC5SZWFkb25seVBhdGhzCiAgICBwcmludCgiYWxsb3dfcmVhZG9ubHlfcGF0aHMgMTogcF9wYXRocyA9IiwgcF9wYXRocykKCiAgICBpX3BhdGhzIDo9IGlfb2NpLkxpbnV4LlJlYWRvbmx5UGF0aHMKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAxOiBpX3BhdGhzID0iLCBpX3BhdGhzKQoKICAgIGFsbG93X3JlYWRvbmx5X3BhdGhzX2FycmF5KHBfcGF0aHMsIGlfcGF0aHMsIGlfb2NpLkxpbnV4Lk1hc2tlZFBhdGhzKQoKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAxOiB0cnVlIikKfQphbGxvd19yZWFkb25seV9wYXRocyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAyOiBzdGFydCIpCgogICAgbm90IHBfb2NpLkxpbnV4LlJlYWRvbmx5UGF0aHMKICAgIG5vdCBpX29jaS5MaW51eC5SZWFkb25seVBhdGhzCgogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGhzIDI6IHRydWUiKQp9CgojIEFsbCB0aGUgcG9saWN5IHJlYWRvbmx5IHBhdGhzIG11c3QgYmUgZWl0aGVyOgojIC0gUHJlc2VudCBpbiB0aGUgaW5wdXQgcmVhZG9ubHkgcGF0aHMsIG9yCiMgLSBQcmVzZW50IGluIHRoZSBpbnB1dCBtYXNrZWQgcGF0aHMuCiMgSW5wdXQgaXMgYWxsb3dlZCB0byBoYXZlIG1vcmUgcmVhZG9ubHkgcGF0aHMgdGhhbiB0aGUgcG9saWN5LgphbGxvd19yZWFkb25seV9wYXRoc19hcnJheShwX2FycmF5LCBpX2FycmF5LCBtYXNrZWRfcGF0aHMpIHsKICAgIGV2ZXJ5IHBfZWxlbSBpbiBwX2FycmF5IHsKICAgICAgICBhbGxvd19yZWFkb25seV9wYXRoKHBfZWxlbSwgaV9hcnJheSwgbWFza2VkX3BhdGhzKQogICAgfQp9CgphbGxvd19yZWFkb25seV9wYXRoKHBfZWxlbSwgaV9hcnJheSwgbWFza2VkX3BhdGhzKSB7CiAgICBwcmludCgiYWxsb3dfcmVhZG9ubHlfcGF0aCAxOiBwX2VsZW0gPSIsIHBfZWxlbSkKCiAgICBzb21lIGlfZWxlbSBpbiBpX2FycmF5CiAgICBwX2VsZW0gPT0gaV9lbGVtCgogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGggMTogdHJ1ZSIpCn0KYWxsb3dfcmVhZG9ubHlfcGF0aChwX2VsZW0sIGlfYXJyYXksIG1hc2tlZF9wYXRocykgewogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGggMjogcF9lbGVtID0iLCBwX2VsZW0pCgogICAgc29tZSBpX21hc2tlZCBpbiBtYXNrZWRfcGF0aHMKICAgIHBfZWxlbSA9PSBpX21hc2tlZAoKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRoIDI6IHRydWUiKQp9CgphbGxvd19saW51eF9kZXZpY2VzKHBfZGV2aWNlcywgaV9kZXZpY2VzKSB7CiAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogc3RhcnQiKQogICAgZXZlcnkgaV9kZXZpY2UgaW4gaV9kZXZpY2VzIHsKICAgICAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogaV9kZXZpY2UgPSIsIGlfZGV2aWNlKQogICAgICAgIHNvbWUgcF9kZXZpY2UgaW4gcF9kZXZpY2VzCiAgICAgICAgaV9kZXZpY2UuUGF0aCA9PSBwX2RldmljZS5QYXRoCiAgICB9CiAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogdHJ1ZSIpCn0KCmFsbG93X2xpbnV4X3N5c2N0bChwX2xpbnV4LCBpX2xpbnV4KSB7CiAgICBwcmludCgiYWxsb3dfbGludXhfc3lzY3RsIDE6IHN0YXJ0IikKICAgIG5vdCBpX2xpbnV4LlN5c2N0bAogICAgcHJpbnQoImFsbG93X2xpbnV4X3N5c2N0bCAxOiB0cnVlIikKfQoKYWxsb3dfbGludXhfc3lzY3RsKHBfbGludXgsIGlfbGludXgpIHsKICAgIHByaW50KCJhbGxvd19saW51eF9zeXNjdGwgMjogc3RhcnQiKQogICAgcF9zeXNjdGwgOj0gcF9saW51eC5TeXNjdGwKICAgIGlfc3lzY3RsIDo9IGlfbGludXguU3lzY3RsCiAgICBldmVyeSBpX25hbWUsIGlfdmFsIGluIGlfc3lzY3RsIHsKICAgICAgICBwcmludCgiYWxsb3dfbGludXhfc3lzY3RsIDI6IGlfbmFtZSA9IiwgaV9uYW1lLCAiaV92YWwgPSIsIGlfdmFsKQogICAgICAgIHBfc3lzY3RsW2lfbmFtZV0gPT0gaV92YWwKICAgIH0KICAgIHByaW50KCJhbGxvd19saW51eF9zeXNjdGwgMjogdHJ1ZSIpCn0KCiMgQ2hlY2sgdGhlIGNvbnNpc3RlbmN5IG9mIHRoZSBpbnB1dCAiaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5idW5kbGVfcGF0aCIKIyBhbmQgaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCIgdmFsdWVzIHdpdGggb3RoZXIgZmllbGRzLgphbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZChwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpIHsKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogc3RhcnQiKQoKICAgIGJ1bmRsZV9wYXRoIDo9IGlfb2NpLkFubm90YXRpb25zWyJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmJ1bmRsZV9wYXRoIl0KICAgIGJ1bmRsZV9pZCA6PSByZXBsYWNlKGJ1bmRsZV9wYXRoLCAiL3J1bi9jb250YWluZXJkL2lvLmNvbnRhaW5lcmQucnVudGltZS52Mi50YXNrL2s4cy5pby8iLCAiIikKCiAgICBidW5kbGVfaWRfZm9ybWF0IDo9IGNvbmNhdCgiIiwgWyJeIiwgQlVORExFX0lELCAiJCJdKQogICAgcmVnZXgubWF0Y2goYnVuZGxlX2lkX2Zvcm1hdCwgYnVuZGxlX2lkKQoKICAgIGtleSA6PSAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCIKCiAgICBwX3JlZ2V4IDo9IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIHNhbmRib3hfaWQgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQoKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogc2FuZGJveF9pZCA9Iiwgc2FuZGJveF9pZCwgInJlZ2V4ID0iLCBwX3JlZ2V4KQogICAgcmVnZXgubWF0Y2gocF9yZWdleCwgc2FuZGJveF9pZCkKCiAgICBhbGxvd19yb290X3BhdGgocF9vY2ksIGlfb2NpLCBidW5kbGVfaWQpCgogICAgZXZlcnkgaV9tb3VudCBpbiBpX29jaS5Nb3VudHMgewogICAgICAgIGFsbG93X21vdW50KHBfb2NpLCBpX21vdW50LCBpX3N0b3JhZ2VzLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpCiAgICB9CgogICAgYWxsb3dfc3RvcmFnZXMocF9zdG9yYWdlcywgaV9zdG9yYWdlcywgYnVuZGxlX2lkLCBzYW5kYm94X2lkKQoKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogdHJ1ZSIpCn0KCmFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHBfcHJvY2VzcyA9IiwgcF9wcm9jZXNzKQogICAgcHJpbnQoImFsbG93X3Byb2Nlc3NfY29tbW9uOiBpX3Byb2Nlc3MgPSAiLCBpX3Byb2Nlc3MpCiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHNfbmFtZSA9Iiwgc19uYW1lKQoKICAgIHBfcHJvY2Vzcy5Dd2QgPT0gaV9wcm9jZXNzLkN3ZAogICAgcF9wcm9jZXNzLk5vTmV3UHJpdmlsZWdlcyA9PSBpX3Byb2Nlc3MuTm9OZXdQcml2aWxlZ2VzCgogICAgYWxsb3dfdXNlcihwX3Byb2Nlc3MsIGlfcHJvY2VzcykKICAgIGFsbG93X2VudihwX3Byb2Nlc3MsIGlfcHJvY2Vzcywgc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHRydWUiKQp9CgojIENvbXBhcmUgdGhlIE9DSSBQcm9jZXNzIGZpZWxkIG9mIGEgcG9saWN5IGNvbnRhaW5lciB3aXRoIHRoZSBpbnB1dCBPQ0kgUHJvY2VzcyBmcm9tIGEgQ3JlYXRlQ29udGFpbmVyUmVxdWVzdAphbGxvd19wcm9jZXNzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfcHJvY2Vzczogc3RhcnQiKQoKICAgIGFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgYWxsb3dfY2FwcyhwX3Byb2Nlc3MuQ2FwYWJpbGl0aWVzLCBpX3Byb2Nlc3MuQ2FwYWJpbGl0aWVzKQogICAgcF9wcm9jZXNzLlRlcm1pbmFsID09IGlfcHJvY2Vzcy5UZXJtaW5hbAoKICAgIHByaW50KCJhbGxvd19wcm9jZXNzOiB0cnVlIikKfQoKIyBDb21wYXJlIHRoZSBPQ0kgUHJvY2VzcyBmaWVsZCBvZiBhIHBvbGljeSBjb250YWluZXIgd2l0aCB0aGUgaW5wdXQgcHJvY2VzcyBmaWVsZCBmcm9tIEV4ZWNQcm9jZXNzUmVxdWVzdAphbGxvd19pbnRlcmFjdGl2ZV9wcm9jZXNzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfaW50ZXJhY3RpdmVfcHJvY2Vzczogc3RhcnQiKQoKICAgIGFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgYWxsb3dfZXhlY19jYXBzKGlfcHJvY2Vzcy5DYXBhYmlsaXRpZXMpCgogICAgIyBUaGVzZSBhcmUgY29tbWFuZHMgZW5hYmxlZCB1c2luZyBFeGVjUHJvY2Vzc1JlcXVlc3QgY29tbWFuZHMgYW5kL29yIHJlZ2V4IGZyb20gdGhlIHNldHRpbmdzIGZpbGUuCiAgICAjIFRoZXkgY2FuIGJlIGV4ZWN1dGVkIGludGVyYWN0aXZlbHkgc28gYWxsb3cgdGhlbSB0byB1c2UgYW55IHZhbHVlIGZvciBpX3Byb2Nlc3MuVGVybWluYWwuCgogICAgcHJpbnQoImFsbG93X2ludGVyYWN0aXZlX3Byb2Nlc3M6IHRydWUiKQp9CgojIENvbXBhcmUgdGhlIE9DSSBQcm9jZXNzIGZpZWxkIG9mIGEgcG9saWN5IGNvbnRhaW5lciB3aXRoIHRoZSBpbnB1dCBwcm9jZXNzIGZpZWxkIGZyb20gRXhlY1Byb2Nlc3NSZXF1ZXN0CmFsbG93X3Byb2JlX3Byb2Nlc3MocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19wcm9iZV9wcm9jZXNzOiBzdGFydCIpCgogICAgYWxsb3dfcHJvY2Vzc19jb21tb24ocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpCiAgICBhbGxvd19leGVjX2NhcHMoaV9wcm9jZXNzLkNhcGFiaWxpdGllcykKICAgIHBfcHJvY2Vzcy5UZXJtaW5hbCA9PSBpX3Byb2Nlc3MuVGVybWluYWwKCiAgICBwcmludCgiYWxsb3dfcHJvYmVfcHJvY2VzczogdHJ1ZSIpCn0KCmFsbG93X3VzZXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MpIHsKICAgIHBfdXNlciA6PSBwX3Byb2Nlc3MuVXNlcgogICAgaV91c2VyIDo9IGlfcHJvY2Vzcy5Vc2VyCgogICAgcHJpbnQoImFsbG93X3VzZXI6IGlucHV0IHVpZCA9IiwgaV91c2VyLlVJRCwgInBvbGljeSB1aWQgPSIsIHBfdXNlci5VSUQpCiAgICBwX3VzZXIuVUlEID09IGlfdXNlci5VSUQKCiAgICAjIFRPRE86IHRyYWNrIGRvd24gdGhlIHJlYXNvbiBmb3IgcmVnaXN0cnkuazhzLmlvL3BhdXNlOjMuOSBiZWluZwogICAgIyAgICAgICBleGVjdXRlZCB3aXRoIGdpZCA9IDAgZGVzcGl0ZSBoYXZpbmcgIjY1NTM1OjY1NTM1IiBpbiBpdHMgY29udGFpbmVyIGltYWdlCiAgICAjICAgICAgIGNvbmZpZy4KICAgICNwcmludCgiYWxsb3dfdXNlcjogaW5wdXQgZ2lkID0iLCBpX3VzZXIuR0lELCAicG9saWN5IGdpZCA9IiwgcF91c2VyLkdJRCkKICAgICNwX3VzZXIuR0lEID09IGlfdXNlci5HSUQKCiAgICAjIFRPRE86IGNvbXBhcmUgdGhlIGFkZGl0aW9uYWxHaWRzIGZpZWxkIHRvbyBhZnRlciBjb21wdXRpbmcgaXRzIHZhbHVlCiAgICAjIGJhc2VkIG9uIC9ldGMvcGFzc3dkIGFuZCAvZXRjL2dyb3VwIGZyb20gdGhlIGNvbnRhaW5lciBpbWFnZS4KfQoKYWxsb3dfZGVwcmVjYXRlZF9hcmdzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZ3MgMTogbm8gYXJncyIpCgogICAgbm90IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJncwogICAgbm90IGlfcHJvY2Vzcy5BcmdzCgogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAxOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZ3MocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSkgewogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiBwb2xpY3kgYXJncyA9IiwgcF9wcm9jZXNzLkRlcHJlY2F0ZWRBcmdzKQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiBpbnB1dCBhcmdzID0iLCBpX3Byb2Nlc3MuQXJncykKCiAgICBjb3VudChwX3Byb2Nlc3MuRGVwcmVjYXRlZEFyZ3MpID09IGNvdW50KGlfcHJvY2Vzcy5BcmdzKQoKICAgIGV2ZXJ5IGksIGlfYXJnIGluIGlfcHJvY2Vzcy5BcmdzIHsKICAgICAgICBhbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpCiAgICB9CgogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDE6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgcF9hcmcyIDo9IHJlcGxhY2UocF9hcmcsICIkJCIsICIkIikKICAgIHBfYXJnMiA9PSBpX2FyZwoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAxOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDI6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgIyBUT0RPOiBjYW4gJChub2RlLW5hbWUpIGJlIGhhbmRsZWQgYmV0dGVyPwogICAgY29udGFpbnMocF9hcmcsICIkKG5vZGUtbmFtZSkiKQoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAyOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDM6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgcF9hcmcyIDo9IHJlcGxhY2UocF9hcmcsICIkJCIsICIkIikKICAgIHBfYXJnMyA6PSByZXBsYWNlKHBfYXJnMiwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAzOiBwX2FyZzMgPSIsIHBfYXJnMykKICAgIHBfYXJnMyA9PSBpX2FyZwoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAzOiB0cnVlIikKfQoKIyBPQ0kgcHJvY2Vzcy5FbnYgZmllbGQKYWxsb3dfZW52KHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfZW52OiBwIGVudiA9IiwgcF9wcm9jZXNzLkVudikKICAgIHByaW50KCJhbGxvd19lbnY6IGkgZW52ID0iLCBpX3Byb2Nlc3MuRW52KQoKICAgIGV2ZXJ5IGlfdmFyIGluIGlfcHJvY2Vzcy5FbnYgewogICAgICAgIHByaW50KCJhbGxvd19lbnY6IGlfdmFyID0iLCBpX3ZhcikKICAgICAgICBhbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgfQoKICAgIHByaW50KCJhbGxvd19lbnY6IHRydWUiKQp9CgojIEFsbG93IGlucHV0IGVudiB2YXJpYWJsZXMgdGhhdCBhcmUgcHJlc2VudCBpbiB0aGUgcG9saWN5IGRhdGEgdG9vLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHBfdmFyID09IGlfdmFyCiAgICBwcmludCgiYWxsb3dfdmFyIDE6IHRydWUiKQp9CgojIE1hdGNoIGlucHV0IHdpdGggb25lIG9mIHRoZSBwb2xpY3kgdmFyaWFibGVzLCBhZnRlciBzdWJzdGl0dXRpbmcgJChzYW5kYm94LW5hbWUpLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHByaW50KCJhbGxvd192YXIgMjogcF92YXIgPSIsIHBfdmFyKQoKICAgIHBfdmFyX3NwbGl0IDo9IHNwbGl0KHBfdmFyLCAiPSIpCiAgICBjb3VudChwX3Zhcl9zcGxpdCkgPT0gMgoKICAgIHBfdmFyX3NwbGl0WzFdID09ICIkKHNhbmRib3gtbmFtZSkiCgogICAgaV92YXJfc3BsaXQgOj0gc3BsaXQoaV92YXIsICI9IikKICAgIGNvdW50KGlfdmFyX3NwbGl0KSA9PSAyCgogICAgaV92YXJfc3BsaXRbMF0gPT0gcF92YXJfc3BsaXRbMF0KICAgIHJlZ2V4Lm1hdGNoKHNfbmFtZSwgaV92YXJfc3BsaXRbMV0pCgogICAgcHJpbnQoImFsbG93X3ZhciAyOiB0cnVlIikKfQoKIyBBbGxvdyBpbnB1dCBlbnYgdmFyaWFibGVzIHRoYXQgbWF0Y2ggd2l0aCBhIHJlcXVlc3RfZGVmYXVsdHMgcmVnZXguCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHNvbWUgcF9yZWdleDEgaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5DcmVhdGVDb250YWluZXJSZXF1ZXN0LmFsbG93X2Vudl9yZWdleAogICAgcF9yZWdleDIgOj0gcmVwbGFjZShwX3JlZ2V4MSwgIiQoaXB2NF9hKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcHY0X2EpCiAgICBwX3JlZ2V4MyA6PSByZXBsYWNlKHBfcmVnZXgyLCAiJChpcF9wKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcF9wKQogICAgcF9yZWdleDQgOj0gcmVwbGFjZShwX3JlZ2V4MywgIiQoc3ZjX25hbWUpIiwgcG9saWN5X2RhdGEuY29tbW9uLnN2Y19uYW1lKQogICAgcF9yZWdleDUgOj0gcmVwbGFjZShwX3JlZ2V4NCwgIiQoZG5zX2xhYmVsKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5kbnNfbGFiZWwpCgogICAgcHJpbnQoImFsbG93X3ZhciAzOiBwX3JlZ2V4NSA9IiwgcF9yZWdleDUpCiAgICByZWdleC5tYXRjaChwX3JlZ2V4NSwgaV92YXIpCgogICAgcHJpbnQoImFsbG93X3ZhciAzOiB0cnVlIikKfQoKIyBBbGxvdyBmaWVsZFJlZiAiZmllbGRQYXRoOiBzdGF0dXMucG9kSVAiIHZhbHVlcy4KYWxsb3dfdmFyKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBpX3Zhciwgc19uYW1lLCBzX25hbWVzcGFjZSkgewogICAgbmFtZV92YWx1ZSA6PSBzcGxpdChpX3ZhciwgIj0iKQogICAgY291bnQobmFtZV92YWx1ZSkgPT0gMgogICAgaXNfaXAobmFtZV92YWx1ZVsxXSkKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIGFsbG93X3BvZF9pcF92YXIobmFtZV92YWx1ZVswXSwgcF92YXIpCgogICAgcHJpbnQoImFsbG93X3ZhciA0OiB0cnVlIikKfQoKIyBBbGxvdyBjb21tb24gZmllbGRSZWYgdmFyaWFibGVzLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBuYW1lX3ZhbHVlIDo9IHNwbGl0KGlfdmFyLCAiPSIpCiAgICBjb3VudChuYW1lX3ZhbHVlKSA9PSAyCgogICAgc29tZSBwX3ZhciBpbiBwX3Byb2Nlc3MuRW52CiAgICBwX25hbWVfdmFsdWUgOj0gc3BsaXQocF92YXIsICI9IikKICAgIGNvdW50KHBfbmFtZV92YWx1ZSkgPT0gMgoKICAgIHBfbmFtZV92YWx1ZVswXSA9PSBuYW1lX3ZhbHVlWzBdCgogICAgIyBUT0RPOiBzaG91bGQgdGhlc2UgYmUgaGFuZGxlZCBpbiBhIGRpZmZlcmVudCB3YXk/CiAgICBhbHdheXNfYWxsb3dlZCA6PSBbIiQoaG9zdC1uYW1lKSIsICIkKG5vZGUtbmFtZSkiLCAiJChwb2QtdWlkKSJdCiAgICBzb21lIGFsbG93ZWQgaW4gYWx3YXlzX2FsbG93ZWQKICAgIGNvbnRhaW5zKHBfbmFtZV92YWx1ZVsxXSwgYWxsb3dlZCkKCiAgICBwcmludCgiYWxsb3dfdmFyIDU6IHRydWUiKQp9CgojIEFsbG93IGZpZWxkUmVmICJmaWVsZFBhdGg6IHN0YXR1cy5ob3N0SVAiIHZhbHVlcy4KYWxsb3dfdmFyKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBpX3Zhciwgc19uYW1lLCBzX25hbWVzcGFjZSkgewogICAgbmFtZV92YWx1ZSA6PSBzcGxpdChpX3ZhciwgIj0iKQogICAgY291bnQobmFtZV92YWx1ZSkgPT0gMgogICAgaXNfaXAobmFtZV92YWx1ZVsxXSkKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIGFsbG93X2hvc3RfaXBfdmFyKG5hbWVfdmFsdWVbMF0sIHBfdmFyKQoKICAgIHByaW50KCJhbGxvd192YXIgNjogdHJ1ZSIpCn0KCiMgQWxsb3cgcmVzb3VyY2VGaWVsZFJlZiB2YWx1ZXMgKGUuZy4sICJsaW1pdHMuY3B1IikuCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIG5hbWVfdmFsdWUgOj0gc3BsaXQoaV92YXIsICI9IikKICAgIGNvdW50KG5hbWVfdmFsdWUpID09IDIKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHBfbmFtZV92YWx1ZSA6PSBzcGxpdChwX3ZhciwgIj0iKQogICAgY291bnQocF9uYW1lX3ZhbHVlKSA9PSAyCgogICAgcF9uYW1lX3ZhbHVlWzBdID09IG5hbWVfdmFsdWVbMF0KCiAgICAjIGEgdmFyaWFibGUgd2Ugc2hvdWxkIGJlIHZhbGlkYXRpbmcgdXNpbmcgYSByZWdleCBmcm9tIHNldHRpbmdzCiAgICBwX25hbWVfdmFsdWVbMV0gPT0gIiQodmFsaWRhdGUtZnJvbS1zZXR0aW5ncykiCgogICAgcmVnZXhfdmFsIDo9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuQ3JlYXRlQ29udGFpbmVyUmVxdWVzdC5hbGxvd19lbnZfcmVnZXhfbWFwW25hbWVfdmFsdWVbMF1dCgogICAgcHJpbnQoImFsbG93X3ZhciA3OiB2YWwgPSIsIG5hbWVfdmFsdWVbMV0pCiAgICBwcmludCgiYWxsb3dfdmFyIDc6IHJlZ2V4X3ZhbCA9IiwgcmVnZXhfdmFsKQoKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4X3ZhbCwgbmFtZV92YWx1ZVsxXSkKCiAgICBwcmludCgiYWxsb3dfdmFyIDc6IHRydWUiKQp9CgojIE1hdGNoIGlucHV0IHdpdGggb25lIG9mIHRoZSBwb2xpY3kgdmFyaWFibGVzLCBhZnRlciBzdWJzdGl0dXRpbmcgJChzYW5kYm94LW5hbWVzcGFjZSkuCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHNvbWUgcF92YXIgaW4gcF9wcm9jZXNzLkVudgogICAgcF92YXIyIDo9IHJlcGxhY2UocF92YXIsICIkKHNhbmRib3gtbmFtZXNwYWNlKSIsIHNfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd192YXIgODogcF92YXIyID0iLCBwX3ZhcjIpCiAgICBwX3ZhcjIgPT0gaV92YXIKCiAgICBwcmludCgiYWxsb3dfdmFyIDg6IHRydWUiKQp9CgphbGxvd19wb2RfaXBfdmFyKHZhcl9uYW1lLCBwX3ZhcikgewogICAgcHJpbnQoImFsbG93X3BvZF9pcF92YXI6IHZhcl9uYW1lID0iLCB2YXJfbmFtZSwgInBfdmFyID0iLCBwX3ZhcikKCiAgICBwX25hbWVfdmFsdWUgOj0gc3BsaXQocF92YXIsICI9IikKICAgIGNvdW50KHBfbmFtZV92YWx1ZSkgPT0gMgoKICAgIHBfbmFtZV92YWx1ZVswXSA9PSB2YXJfbmFtZQogICAgcF9uYW1lX3ZhbHVlWzFdID09ICIkKHBvZC1pcCkiCgogICAgcHJpbnQoImFsbG93X3BvZF9pcF92YXI6IHRydWUiKQp9CgphbGxvd19ob3N0X2lwX3Zhcih2YXJfbmFtZSwgcF92YXIpIHsKICAgIHByaW50KCJhbGxvd19ob3N0X2lwX3ZhcjogdmFyX25hbWUgPSIsIHZhcl9uYW1lLCAicF92YXIgPSIsIHBfdmFyKQoKICAgIHBfbmFtZV92YWx1ZSA6PSBzcGxpdChwX3ZhciwgIj0iKQogICAgY291bnQocF9uYW1lX3ZhbHVlKSA9PSAyCgogICAgcF9uYW1lX3ZhbHVlWzBdID09IHZhcl9uYW1lCiAgICBwX25hbWVfdmFsdWVbMV0gPT0gIiQoaG9zdC1pcCkiCgogICAgcHJpbnQoImFsbG93X2hvc3RfaXBfdmFyOiB0cnVlIikKfQoKaXNfaXAodmFsdWUpIHsKICAgIGJ5dGVzID0gc3BsaXQodmFsdWUsICIuIikKICAgIGNvdW50KGJ5dGVzKSA9PSA0CgogICAgaXNfaXBfZmlyc3RfYnl0ZShieXRlc1swXSkKICAgIGlzX2lwX290aGVyX2J5dGUoYnl0ZXNbMV0pCiAgICBpc19pcF9vdGhlcl9ieXRlKGJ5dGVzWzJdKQogICAgaXNfaXBfb3RoZXJfYnl0ZShieXRlc1szXSkKfQppc19pcF9maXJzdF9ieXRlKGNvbXBvbmVudCkgewogICAgbnVtYmVyID0gdG9fbnVtYmVyKGNvbXBvbmVudCkKICAgIG51bWJlciA+PSAxCiAgICBudW1iZXIgPD0gMjU1Cn0KaXNfaXBfb3RoZXJfYnl0ZShjb21wb25lbnQpIHsKICAgIG51bWJlciA9IHRvX251bWJlcihjb21wb25lbnQpCiAgICBudW1iZXIgPj0gMAogICAgbnVtYmVyIDw9IDI1NQp9CgojIE9DSSByb290LlBhdGgKYWxsb3dfcm9vdF9wYXRoKHBfb2NpLCBpX29jaSwgYnVuZGxlX2lkKSB7CiAgICBpX3BhdGggOj0gaV9vY2kuUm9vdC5QYXRoCiAgICBwX3BhdGgxIDo9IHBfb2NpLlJvb3QuUGF0aAogICAgcHJpbnQoImFsbG93X3Jvb3RfcGF0aDogaV9wYXRoID0iLCBpX3BhdGgsICJwX3BhdGgxID0iLCBwX3BhdGgxKQoKICAgIHBfcGF0aDIgOj0gcmVwbGFjZShwX3BhdGgxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfcm9vdF9wYXRoOiBwX3BhdGgyID0iLCBwX3BhdGgyKQoKICAgIHBfcGF0aDMgOj0gcmVwbGFjZShwX3BhdGgyLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X3Jvb3RfcGF0aDogcF9wYXRoMyA9IiwgcF9wYXRoMykKCiAgICBwX3BhdGgzID09IGlfcGF0aAoKICAgIHByaW50KCJhbGxvd19yb290X3BhdGg6IHRydWUiKQp9CgojIGRldmljZSBtb3VudHMKYWxsb3dfbW91bnQocF9vY2ksIGlfbW91bnQsIGlfc3RvcmFnZXMsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcHJpbnQoImFsbG93X21vdW50OiBpX21vdW50ID0iLCBpX21vdW50KQoKICAgIHNvbWUgcF9tb3VudCBpbiBwX29jaS5Nb3VudHMKICAgIHNvbWUgaV9zdG9yYWdlIGluIGlfc3RvcmFnZXMKCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IHBfbW91bnQgPSIsIHBfbW91bnQpCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IGlfc3RvcmFnZSA9IiwgaV9zdG9yYWdlKQoKICAgIGNoZWNrX21vdW50KHBfbW91bnQsIGlfbW91bnQsIGlfc3RvcmFnZSwgYnVuZGxlX2lkLCBzYW5kYm94X2lkKQoKICAgICMgVE9ETzogYXJlIHRoZXJlIGFueSBvdGhlciByZXF1aXJlZCBwb2xpY3kgY2hlY2tzIGZvciBtb3VudHMgLSBlLmcuLAogICAgIyAgICAgICBtdWx0aXBsZSBtb3VudHMgd2l0aCBzYW1lIHNvdXJjZSBvciBkZXN0aW5hdGlvbj8KCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IHRydWUiKQp9CgpjaGVja19tb3VudChwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcF9tb3VudCA9PSBpX21vdW50CiAgICBwcmludCgiY2hlY2tfbW91bnQgMTogdHJ1ZSIpCn0KY2hlY2tfbW91bnQocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHBfbW91bnQuZGVzdGluYXRpb24gPT0gaV9tb3VudC5kZXN0aW5hdGlvbgogICAgcF9tb3VudC50eXBlXyA9PSBpX21vdW50LnR5cGVfCiAgICBwX21vdW50Lm9wdGlvbnMgPT0gaV9tb3VudC5vcHRpb25zCgogICAgbW91bnRfc291cmNlX2FsbG93cyhwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkKCiAgICBwcmludCgiY2hlY2tfbW91bnQgMjogdHJ1ZSIpCn0KCm1vdW50X3NvdXJjZV9hbGxvd3MocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHJlZ2V4MSA6PSBwX21vdW50LnNvdXJjZQogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5tb3VudF9zb3VyY2VfY3BhdGgpCiAgICByZWdleDQgOj0gcmVwbGFjZShyZWdleDMsICIkKGJ1bmRsZS1pZCkiLCBidW5kbGVfaWQpCgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMTogcmVnZXg0ID0iLCByZWdleDQpCiAgICByZWdleC5tYXRjaChyZWdleDQsIGlfbW91bnQuc291cmNlKQoKICAgIHByaW50KCJtb3VudF9zb3VyY2VfYWxsb3dzIDE6IHRydWUiKQp9Cm1vdW50X3NvdXJjZV9hbGxvd3MocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHJlZ2V4MSA6PSBwX21vdW50LnNvdXJjZQogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5tb3VudF9zb3VyY2VfY3BhdGgpCiAgICByZWdleDQgOj0gcmVwbGFjZShyZWdleDMsICIkKHNhbmRib3gtaWQpIiwgc2FuZGJveF9pZCkKCiAgICBwcmludCgibW91bnRfc291cmNlX2FsbG93cyAyOiByZWdleDQgPSIsIHJlZ2V4NCkKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4NCwgaV9tb3VudC5zb3VyY2UpCgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMjogdHJ1ZSIpCn0KbW91bnRfc291cmNlX2FsbG93cyhwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogaV9tb3VudC5zb3VyY2UgPSIsIGlfbW91bnQuc291cmNlKQogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogaV9zdG9yYWdlLm1vdW50X3BvaW50ID0iLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCgogICAgaV9tb3VudC5zb3VyY2UgPT0gaV9zdG9yYWdlLm1vdW50X3BvaW50CgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogdHJ1ZSIpCn0KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBDcmVhdGUgY29udGFpbmVyIFN0b3JhZ2VzCgphbGxvd19zdG9yYWdlcyhwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHBfY291bnQgOj0gY291bnQocF9zdG9yYWdlcykKICAgIGlfY291bnQgOj0gY291bnQoaV9zdG9yYWdlcykKICAgIHByaW50KCJhbGxvd19zdG9yYWdlczogcF9jb3VudCA9IiwgcF9jb3VudCwgImlfY291bnQgPSIsIGlfY291bnQpCgogICAgcF9jb3VudCA9PSBpX2NvdW50CgogICAgIyBHZXQgdGhlIGNvbnRhaW5lciBpbWFnZSBsYXllciBJRHMgYW5kIHZlcml0eSByb290IGhhc2hlcywgZnJvbSB0aGUgIm92ZXJsYXlmcyIgc3RvcmFnZS4KICAgIHNvbWUgb3ZlcmxheV9zdG9yYWdlIGluIHBfc3RvcmFnZXMKICAgIG92ZXJsYXlfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIHByaW50KCJhbGxvd19zdG9yYWdlczogb3ZlcmxheV9zdG9yYWdlID0iLCBvdmVybGF5X3N0b3JhZ2UpCiAgICBjb3VudChvdmVybGF5X3N0b3JhZ2Uub3B0aW9ucykgPT0gMgoKICAgIGxheWVyX2lkcyA6PSBzcGxpdChvdmVybGF5X3N0b3JhZ2Uub3B0aW9uc1swXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiBsYXllcl9pZHMgPSIsIGxheWVyX2lkcykKCiAgICByb290X2hhc2hlcyA6PSBzcGxpdChvdmVybGF5X3N0b3JhZ2Uub3B0aW9uc1sxXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiByb290X2hhc2hlcyA9Iiwgcm9vdF9oYXNoZXMpCgogICAgZXZlcnkgaV9zdG9yYWdlIGluIGlfc3RvcmFnZXMgewogICAgICAgIGFsbG93X3N0b3JhZ2UocF9zdG9yYWdlcywgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpCiAgICB9CgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiB0cnVlIikKfQoKYWxsb3dfc3RvcmFnZShwX3N0b3JhZ2VzLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgc29tZSBwX3N0b3JhZ2UgaW4gcF9zdG9yYWdlcwoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiBwX3N0b3JhZ2UgPSIsIHBfc3RvcmFnZSkKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiBpX3N0b3JhZ2UgPSIsIGlfc3RvcmFnZSkKCiAgICBwX3N0b3JhZ2UuZHJpdmVyICAgICAgICAgICA9PSBpX3N0b3JhZ2UuZHJpdmVyCiAgICBwX3N0b3JhZ2UuZHJpdmVyX29wdGlvbnMgICA9PSBpX3N0b3JhZ2UuZHJpdmVyX29wdGlvbnMKICAgIHBfc3RvcmFnZS5mc19ncm91cCAgICAgICAgID09IGlfc3RvcmFnZS5mc19ncm91cAogICAgcF9zdG9yYWdlLmZzdHlwZSAgICAgICAgICAgPT0gaV9zdG9yYWdlLmZzdHlwZQoKICAgIGFsbG93X3N0b3JhZ2Vfc291cmNlKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKQogICAgYWxsb3dfc3RvcmFnZV9vcHRpb25zKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKQogICAgYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKQoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiB0cnVlIikKfQoKYWxsb3dfc3RvcmFnZV9zb3VyY2UocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX3NvdXJjZSAxOiBzdGFydCIpCgogICAgcF9zdG9yYWdlLnNvdXJjZSA9PSBpX3N0b3JhZ2Uuc291cmNlCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDE6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX3NvdXJjZShwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDI6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCgogICAgIyBEREREOkJCOkRELkY6IERvbWFpbjpCdXM6RGV2aWNlLkZ1bmN0aW9uCiAgICAjIGh0dHBzOi8vd3d3Lmtlcm5lbC5vcmcvZG9jL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtYnVzLXBjaQogICAgcmVnZXgubWF0Y2goYF5bYS1mMC05XXs0fTpbYS1mMC05XXsyfTpbYS1mMC05XXsyfVwuW2EtZjAtOV0kYCwgaV9zdG9yYWdlLnNvdXJjZSkKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9zb3VyY2UgMjogdHJ1ZSIpCn0KCmFsbG93X3N0b3JhZ2Vfc291cmNlKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKSB7CiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9zb3VyY2UgMzogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIGlfc3RvcmFnZS5zb3VyY2UgPT0gIm5vbmUiCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDM6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX3NvdXJjZShwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDQ6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJzbWIiCgogICAgIyBQYXR0ZXJuOiAvLzxzdG9yYWdlLWFjY291bnQtbmFtZT4uZmlsZS5jb3JlLndpbmRvd3MubmV0LzxrOHMtUFZDLW5hbWU+CiAgICAjIFN0b3JhZ2UgYWNjb3VudCBuYW1lOiBodHRwczovL2xlYXJuLm1pY3Jvc29mdC5jb20vZW4tdXMvYXp1cmUvc3RvcmFnZS9jb21tb24vc3RvcmFnZS1hY2NvdW50LW92ZXJ2aWV3I3N0b3JhZ2UtYWNjb3VudC1uYW1lCiAgICAjIEs4cyBQVkMgbmFtZTogaHR0cHM6Ly9rdWJlcm5ldGVzLmlvL2RvY3MvY29uY2VwdHMvb3ZlcnZpZXcvd29ya2luZy13aXRoLW9iamVjdHMvbmFtZXMvI2Rucy1zdWJkb21haW4tbmFtZXMKICAgIHJlZ2V4Lm1hdGNoKGBeXC9cLyhbYS16MC05XXszLDI0fSlcLmZpbGVcLmNvcmVcLndpbmRvd3NcLm5ldFwvW2EtejAtOV0oW2EtejAtOS4tXXswLDI1MX1bYS16MC05XSk/JGAsIGlfc3RvcmFnZS5zb3VyY2UpCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDQ6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMTogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgIT0gIm92ZXJsYXlmcyIKICAgIHBfc3RvcmFnZS5vcHRpb25zID09IGlfc3RvcmFnZS5vcHRpb25zCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAxOiB0cnVlIikKfQphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIGNvdW50KHBfc3RvcmFnZS5vcHRpb25zKSA9PSAyCgogICAgcG9saWN5X2lkcyA6PSBzcGxpdChwX3N0b3JhZ2Uub3B0aW9uc1swXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBwb2xpY3lfaWRzID0iLCBwb2xpY3lfaWRzKQogICAgcG9saWN5X2lkcyA9PSBsYXllcl9pZHMKCiAgICBwb2xpY3lfaGFzaGVzIDo9IHNwbGl0KHBfc3RvcmFnZS5vcHRpb25zWzFdLCAiOiIpCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IHBvbGljeV9oYXNoZXMgPSIsIHBvbGljeV9oYXNoZXMpCgogICAgcF9jb3VudCA6PSBjb3VudChwb2xpY3lfaWRzKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBwX2NvdW50ID0iLCBwX2NvdW50KQogICAgcF9jb3VudCA+PSAxCiAgICBwX2NvdW50ID09IGNvdW50KHBvbGljeV9oYXNoZXMpCgogICAgaV9jb3VudCA6PSBjb3VudChpX3N0b3JhZ2Uub3B0aW9ucykKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogaV9jb3VudCA9IiwgaV9jb3VudCkKICAgIGlfY291bnQgPT0gcF9jb3VudCArIDMKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zWzBdID0iLCBpX3N0b3JhZ2Uub3B0aW9uc1swXSkKICAgIGlfc3RvcmFnZS5vcHRpb25zWzBdID09ICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQubGF5ZXItc3JjLXByZWZpeD0vdmFyL2xpYi9jb250YWluZXJkL2lvLmNvbnRhaW5lcmQuc25hcHNob3R0ZXIudjEudGFyZGV2L2xheWVycyIKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zW2lfY291bnQgLSAyXSA9IiwgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDJdKQogICAgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDJdID09ICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQub3ZlcmxheS1ydyIKCiAgICBsb3dlcmRpciA6PSBjb25jYXQoIj0iLCBbImxvd2VyZGlyIiwgcF9zdG9yYWdlLm9wdGlvbnNbMF1dKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBsb3dlcmRpciA9IiwgbG93ZXJkaXIpCgogICAgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDFdID09IGxvd2VyZGlyCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zW2lfY291bnQgLSAxXSA9IiwgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDFdKQoKICAgIGV2ZXJ5IGksIHBvbGljeV9pZCBpbiBwb2xpY3lfaWRzIHsKICAgICAgICBhbGxvd19vdmVybGF5X2xheWVyKHBvbGljeV9pZCwgcG9saWN5X2hhc2hlc1tpXSwgaV9zdG9yYWdlLm9wdGlvbnNbaSArIDFdKQogICAgfQoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogdHJ1ZSIpCn0KYWxsb3dfc3RvcmFnZV9vcHRpb25zKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKSB7CiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDM6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCiAgICBjb3VudChwX3N0b3JhZ2Uub3B0aW9ucykgPT0gMQoKICAgIHN0YXJ0c3dpdGgocF9zdG9yYWdlLm9wdGlvbnNbMF0sICIkKGhhc2giKQogICAgaGFzaF9zdWZmaXggOj0gdHJpbV9sZWZ0KHBfc3RvcmFnZS5vcHRpb25zWzBdLCAiJChoYXNoIikKCiAgICBlbmRzd2l0aChoYXNoX3N1ZmZpeCwgIikiKQogICAgaGFzaF9pbmRleCA6PSB0cmltX3JpZ2h0KGhhc2hfc3VmZml4LCAiKSIpCiAgICBpIDo9IHRvX251bWJlcihoYXNoX2luZGV4KQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAzOiBpID0iLCBpKQoKICAgIGhhc2hfb3B0aW9uIDo9IGNvbmNhdCgiPSIsIFsiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LnJvb3QtaGFzaCIsIHJvb3RfaGFzaGVzW2ldXSkKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMzogaGFzaF9vcHRpb24gPSIsIGhhc2hfb3B0aW9uKQoKICAgIGNvdW50KGlfc3RvcmFnZS5vcHRpb25zKSA9PSA0CiAgICBpX3N0b3JhZ2Uub3B0aW9uc1swXSA9PSAicm8iCiAgICBpX3N0b3JhZ2Uub3B0aW9uc1sxXSA9PSAiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmJsb2NrX2RldmljZT1maWxlIgogICAgaV9zdG9yYWdlLm9wdGlvbnNbMl0gPT0gImlvLmthdGFjb250YWluZXJzLmZzLW9wdC5pcy1sYXllciIKICAgIGlfc3RvcmFnZS5vcHRpb25zWzNdID09IGhhc2hfb3B0aW9uCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAzOiB0cnVlIikKfQphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgNDogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gInNtYiIKICAgIHBfb3B0c19jb3VudCA6PSBjb3VudChwX3N0b3JhZ2Uub3B0aW9ucykKICAgIGlfb3B0c19jb3VudCA6PSBjb3VudChpX3N0b3JhZ2Uub3B0aW9ucykKICAgIGlfb3B0c19jb3VudCA9PSBwX29wdHNfY291bnQgKyAyCgogICAgaV9vcHRfbWF0Y2hlcyA6PSBbaSB8IGkgOj0gaWR4OyBpZHggPCBwX29wdHNfY291bnQ7IHBfc3RvcmFnZS5vcHRpb25zW2lkeF0gPT0gaV9zdG9yYWdlLm9wdGlvbnNbaWR4XV0KICAgIGNvdW50KGlfb3B0X21hdGNoZXMpID09IHBfb3B0c19jb3VudAoKICAgIHN0YXJ0c3dpdGgoaV9zdG9yYWdlLm9wdGlvbnNbaV9vcHRzX2NvdW50LTJdLCAiYWRkcj0iKQogICAgY3JlZHMgPSBzcGxpdChpX3N0b3JhZ2Uub3B0aW9uc1tpX29wdHNfY291bnQtMV0sICIsIikKICAgIGNvdW50KGNyZWRzKSA9PSAyCiAgICBzdGFydHN3aXRoKGNyZWRzWzBdLCAidXNlcm5hbWU9IikKICAgIHN0YXJ0c3dpdGgoY3JlZHNbMV0sICJwYXNzd29yZD0iKQogICAgCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDQ6IHRydWUiKQp9CgphbGxvd19vdmVybGF5X2xheWVyKHBvbGljeV9pZCwgcG9saWN5X2hhc2gsIGlfb3B0aW9uKSB7CiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogcG9saWN5X2lkID0iLCBwb2xpY3lfaWQsICJwb2xpY3lfaGFzaCA9IiwgcG9saWN5X2hhc2gpCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogaV9vcHRpb24gPSIsIGlfb3B0aW9uKQoKICAgIHN0YXJ0c3dpdGgoaV9vcHRpb24sICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQubGF5ZXI9IikKICAgIGlfdmFsdWUgOj0gcmVwbGFjZShpX29wdGlvbiwgImlvLmthdGFjb250YWluZXJzLmZzLW9wdC5sYXllcj0iLCAiIikKICAgIGlfdmFsdWVfZGVjb2RlZCA6PSBiYXNlNjQuZGVjb2RlKGlfdmFsdWUpCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogaV92YWx1ZV9kZWNvZGVkID0iLCBpX3ZhbHVlX2RlY29kZWQpCgogICAgcG9saWN5X3N1ZmZpeCA6PSBjb25jYXQoIj0iLCBbInRhcixybyxpby5rYXRhY29udGFpbmVycy5mcy1vcHQuYmxvY2tfZGV2aWNlPWZpbGUsaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmlzLWxheWVyLGlvLmthdGFjb250YWluZXJzLmZzLW9wdC5yb290LWhhc2giLCBwb2xpY3lfaGFzaF0pCiAgICBwX3ZhbHVlIDo9IGNvbmNhdCgiLCIsIFtwb2xpY3lfaWQsIHBvbGljeV9zdWZmaXhdKQogICAgcHJpbnQoImFsbG93X292ZXJsYXlfbGF5ZXI6IHBfdmFsdWUgPSIsIHBfdmFsdWUpCgogICAgcF92YWx1ZSA9PSBpX3ZhbHVlX2RlY29kZWQKCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogdHJ1ZSIpCn0KCmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAidGFyIgoKICAgIHN0YXJ0c3dpdGgocF9zdG9yYWdlLm1vdW50X3BvaW50LCAiJChsYXllciIpCiAgICBtb3VudF9zdWZmaXggOj0gdHJpbV9sZWZ0KHBfc3RvcmFnZS5tb3VudF9wb2ludCwgIiQobGF5ZXIiKQoKICAgIGVuZHN3aXRoKG1vdW50X3N1ZmZpeCwgIikiKQogICAgbGF5ZXJfaW5kZXggOj0gdHJpbV9yaWdodChtb3VudF9zdWZmaXgsICIpIikKICAgIGkgOj0gdG9fbnVtYmVyKGxheWVyX2luZGV4KQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDE6IGkgPSIsIGkpCgogICAgbGF5ZXJfaWQgOj0gbGF5ZXJfaWRzW2ldCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMTogbGF5ZXJfaWQgPSIsIGxheWVyX2lkKQoKICAgIHBfbW91bnQgOj0gY29uY2F0KCIvIiwgWyIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L2xheWVycyIsIGxheWVyX2lkXSkKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCAxOiBwX21vdW50ID0iLCBwX21vdW50KQoKICAgIHBfbW91bnQgPT0gaV9zdG9yYWdlLm1vdW50X3BvaW50CgogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDE6IHRydWUiKQp9CmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAiZnVzZTMua2F0YS1vdmVybGF5IgoKICAgIG1vdW50MSA6PSByZXBsYWNlKHBfc3RvcmFnZS5tb3VudF9wb2ludCwgIiQoY3BhdGgpIiwgcG9saWN5X2RhdGEuY29tbW9uLmNwYXRoKQogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDI6IG1vdW50MiA9IiwgbW91bnQyKQoKICAgIG1vdW50MiA9PSBpX3N0b3JhZ2UubW91bnRfcG9pbnQKCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMjogdHJ1ZSIpCn0KYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKSB7CiAgICBwX3N0b3JhZ2UuZnN0eXBlID09ICJsb2NhbCIKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQyID0iLCBtb3VudDIpCgogICAgbW91bnQzIDo9IHJlcGxhY2UobW91bnQyLCAiJChzYW5kYm94LWlkKSIsIHNhbmRib3hfaWQpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQzID0iLCBtb3VudDMpCgogICAgcmVnZXgubWF0Y2gobW91bnQzLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCgogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDM6IHRydWUiKQp9CmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAiYmluZCIKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNDogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNDogbW91bnQyID0iLCBtb3VudDIpCgogICAgbW91bnQzIDo9IHJlcGxhY2UobW91bnQyLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDQ6IG1vdW50MyA9IiwgbW91bnQzKQoKICAgIHJlZ2V4Lm1hdGNoKG1vdW50MywgaV9zdG9yYWdlLm1vdW50X3BvaW50KQoKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA0OiB0cnVlIikKfQphbGxvd19tb3VudF9wb2ludChwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgYnVuZGxlX2lkLCBzYW5kYm94X2lkLCBsYXllcl9pZHMpIHsKICAgIHBfc3RvcmFnZS5mc3R5cGUgPT0gInRtcGZzIgoKICAgIG1vdW50MSA6PSBwX3N0b3JhZ2UubW91bnRfcG9pbnQKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA1OiBtb3VudDEgPSIsIG1vdW50MSkKCiAgICByZWdleC5tYXRjaChtb3VudDEsIGlfc3RvcmFnZS5tb3VudF9wb2ludCkKCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNTogdHJ1ZSIpCn0KYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKSB7CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogaV9zdG9yYWdlLm1vdW50X3BvaW50ID0iLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCiAgICBhbGxvd19kaXJlY3Rfdm9sX2RyaXZlcihwX3N0b3JhZ2UsIGlfc3RvcmFnZSkKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChzcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQyID0iLCBtb3VudDIpCgogICAgZGlyZWN0X3ZvbF9wYXRoIDo9IGlfc3RvcmFnZS5zb3VyY2UKICAgIG1vdW50MyA6PSByZXBsYWNlKG1vdW50MiwgIiQoYjY0LWRpcmVjdC12b2wtcGF0aCkiLCBiYXNlNjR1cmwuZW5jb2RlKGRpcmVjdF92b2xfcGF0aCkpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQzID0iLCBtb3VudDMpCgogICAgbW91bnQzID09IGlfc3RvcmFnZS5tb3VudF9wb2ludAoKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA2OiB0cnVlIikKfQoKYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIocF9zdG9yYWdlLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19kaXJlY3Rfdm9sX2RyaXZlciAxOiBzdGFydCIpCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCiAgICBwcmludCgiYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIgMTogdHJ1ZSIpCn0KYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIocF9zdG9yYWdlLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19kaXJlY3Rfdm9sX2RyaXZlciAyOiBzdGFydCIpCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJzbWIiCiAgICBwcmludCgiYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIgMjogdHJ1ZSIpCn0KCiMgRXhlY1Byb2Nlc3NSZXF1ZXN0LnByb2Nlc3MuQ2FwYWJpbGl0aWVzCmFsbG93X2V4ZWNfY2FwcyhpX2NhcHMpIHsKICAgIG5vdCBpX2NhcHMuQW1iaWVudAogICAgbm90IGlfY2Fwcy5Cb3VuZGluZwogICAgbm90IGlfY2Fwcy5FZmZlY3RpdmUKICAgIG5vdCBpX2NhcHMuSW5oZXJpdGFibGUKICAgIG5vdCBpX2NhcHMuUGVybWl0dGVkCn0KCiMgT0NJLlByb2Nlc3MuQ2FwYWJpbGl0aWVzCmFsbG93X2NhcHMocF9jYXBzLCBpX2NhcHMpIHsKICAgIHByaW50KCJhbGxvd19jYXBzOiBwb2xpY3kgQW1iaWVudCA9IiwgcF9jYXBzLkFtYmllbnQpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgQW1iaWVudCA9IiwgaV9jYXBzLkFtYmllbnQpCiAgICBtYXRjaF9jYXBzKHBfY2Fwcy5BbWJpZW50LCBpX2NhcHMuQW1iaWVudCkKCiAgICBwcmludCgiYWxsb3dfY2FwczogcG9saWN5IEJvdW5kaW5nID0iLCBwX2NhcHMuQm91bmRpbmcpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgQm91bmRpbmcgPSIsIGlfY2Fwcy5Cb3VuZGluZykKICAgIG1hdGNoX2NhcHMocF9jYXBzLkJvdW5kaW5nLCBpX2NhcHMuQm91bmRpbmcpCgogICAgcHJpbnQoImFsbG93X2NhcHM6IHBvbGljeSBFZmZlY3RpdmUgPSIsIHBfY2Fwcy5FZmZlY3RpdmUpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgRWZmZWN0aXZlID0iLCBpX2NhcHMuRWZmZWN0aXZlKQogICAgbWF0Y2hfY2FwcyhwX2NhcHMuRWZmZWN0aXZlLCBpX2NhcHMuRWZmZWN0aXZlKQoKICAgIHByaW50KCJhbGxvd19jYXBzOiBwb2xpY3kgSW5oZXJpdGFibGUgPSIsIHBfY2Fwcy5Jbmhlcml0YWJsZSkKICAgIHByaW50KCJhbGxvd19jYXBzOiBpbnB1dCBJbmhlcml0YWJsZSA9IiwgaV9jYXBzLkluaGVyaXRhYmxlKQogICAgbWF0Y2hfY2FwcyhwX2NhcHMuSW5oZXJpdGFibGUsIGlfY2Fwcy5Jbmhlcml0YWJsZSkKCiAgICBwcmludCgiYWxsb3dfY2FwczogcG9saWN5IFBlcm1pdHRlZCA9IiwgcF9jYXBzLlBlcm1pdHRlZCkKICAgIHByaW50KCJhbGxvd19jYXBzOiBpbnB1dCBQZXJtaXR0ZWQgPSIsIGlfY2Fwcy5QZXJtaXR0ZWQpCiAgICBtYXRjaF9jYXBzKHBfY2Fwcy5QZXJtaXR0ZWQsIGlfY2Fwcy5QZXJtaXR0ZWQpCn0KCm1hdGNoX2NhcHMocF9jYXBzLCBpX2NhcHMpIHsKICAgIHByaW50KCJtYXRjaF9jYXBzIDE6IHN0YXJ0IikKCiAgICBwX2NhcHMgPT0gaV9jYXBzCgogICAgcHJpbnQoIm1hdGNoX2NhcHMgMTogdHJ1ZSIpCn0KbWF0Y2hfY2FwcyhwX2NhcHMsIGlfY2FwcykgewogICAgcHJpbnQoIm1hdGNoX2NhcHMgMjogc3RhcnQiKQoKICAgIGNvdW50KHBfY2FwcykgPT0gMQogICAgcF9jYXBzWzBdID09ICIkKGRlZmF1bHRfY2FwcykiCgogICAgcHJpbnQoIm1hdGNoX2NhcHMgMjogZGVmYXVsdF9jYXBzID0iLCBwb2xpY3lfZGF0YS5jb21tb24uZGVmYXVsdF9jYXBzKQogICAgcG9saWN5X2RhdGEuY29tbW9uLmRlZmF1bHRfY2FwcyA9PSBpX2NhcHMKCiAgICBwcmludCgibWF0Y2hfY2FwcyAyOiB0cnVlIikKfQptYXRjaF9jYXBzKHBfY2FwcywgaV9jYXBzKSB7CiAgICBwcmludCgibWF0Y2hfY2FwcyAzOiBzdGFydCIpCgogICAgY291bnQocF9jYXBzKSA9PSAxCiAgICBwX2NhcHNbMF0gPT0gIiQocHJpdmlsZWdlZF9jYXBzKSIKCiAgICBwcmludCgibWF0Y2hfY2FwcyAzOiBwcml2aWxlZ2VkX2NhcHMgPSIsIHBvbGljeV9kYXRhLmNvbW1vbi5wcml2aWxlZ2VkX2NhcHMpCiAgICBwb2xpY3lfZGF0YS5jb21tb24ucHJpdmlsZWdlZF9jYXBzID09IGlfY2FwcwoKICAgIHByaW50KCJtYXRjaF9jYXBzIDM6IHRydWUiKQp9CgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgpjaGVja19kaXJlY3RvcnlfdHJhdmVyc2FsKGlfcGF0aCkgewogICAgbm90IHJlZ2V4Lm1hdGNoKCIoXnwvKS4uKCR8LykiLCBpX3BhdGgpCn0KCmNoZWNrX3N5bWxpbmtfc291cmNlKGlfc3JjKSB7CiAgICBpX3NyYyA9PSAiIgogICAgcHJpbnQoImNoZWNrX3N5bWxpbmtfc291cmNlIDE6IHRydWUiKQp9CmNoZWNrX3N5bWxpbmtfc291cmNlKGlfc3JjKSB7CiAgICBpX3NyYyAhPSAiIgogICAgcHJpbnQoImNoZWNrX3N5bWxpbmtfc291cmNlIDI6IGlfc3JjID0iLCBpX3NyYykKCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24uc19zb3VyY2UxLCBpX3NyYykKCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMjogdHJ1ZSIpCn0KY2hlY2tfc3ltbGlua19zb3VyY2UoaV9zcmMpIHsKICAgIGlfc3JjICE9ICIiCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMzogaV9zcmMgPSIsIGlfc3JjKQoKICAgIHJlZ2V4Lm1hdGNoKHBvbGljeV9kYXRhLmNvbW1vbi5zX3NvdXJjZTIsIGlfc3JjKQogICAgY2hlY2tfZGlyZWN0b3J5X3RyYXZlcnNhbChpX3NyYykKCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMzogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfc3RvcmFnZXMoaV9zdG9yYWdlcykgewogICAgcHJpbnQoImFsbG93X3NhbmRib3hfc3RvcmFnZXM6IGlfc3RvcmFnZXMgPSIsIGlfc3RvcmFnZXMpCgogICAgcF9zdG9yYWdlcyA6PSBwb2xpY3lfZGF0YS5zYW5kYm94LnN0b3JhZ2VzCiAgICBldmVyeSBpX3N0b3JhZ2UgaW4gaV9zdG9yYWdlcyB7CiAgICAgICAgYWxsb3dfc2FuZGJveF9zdG9yYWdlKHBfc3RvcmFnZXMsIGlfc3RvcmFnZSkKICAgIH0KCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9zdG9yYWdlczogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfc3RvcmFnZShwX3N0b3JhZ2VzLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IGlfc3RvcmFnZSA9IiwgaV9zdG9yYWdlKQoKICAgIHNvbWUgcF9zdG9yYWdlIGluIHBfc3RvcmFnZXMKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IHBfc3RvcmFnZSA9IiwgcF9zdG9yYWdlKQogICAgaV9zdG9yYWdlID09IHBfc3RvcmFnZQoKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IHRydWUiKQp9CgpDb3B5RmlsZVJlcXVlc3QgewogICAgcHJpbnQoIkNvcHlGaWxlUmVxdWVzdDogaW5wdXQucGF0aCA9IiwgaW5wdXQucGF0aCkKCiAgICBjaGVja19zeW1saW5rX3NvdXJjZShpbnB1dC5zeW1saW5rX3NyYykKICAgIGNoZWNrX2RpcmVjdG9yeV90cmF2ZXJzYWwoaW5wdXQucGF0aCkKCiAgICBzb21lIHJlZ2V4MSBpbiBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLkNvcHlGaWxlUmVxdWVzdAogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5jcGF0aCkKICAgIHJlZ2V4NCA6PSByZXBsYWNlKHJlZ2V4MywgIiQoYnVuZGxlLWlkKSIsIEJVTkRMRV9JRCkKICAgIHByaW50KCJDb3B5RmlsZVJlcXVlc3Q6IHJlZ2V4NCA9IiwgcmVnZXg0KQoKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4NCwgaW5wdXQucGF0aCkKCiAgICBwcmludCgiQ29weUZpbGVSZXF1ZXN0OiB0cnVlIikKfQoKQ3JlYXRlU2FuZGJveFJlcXVlc3QgewogICAgcHJpbnQoIkNyZWF0ZVNhbmRib3hSZXF1ZXN0OiBpbnB1dC5ndWVzdF9ob29rX3BhdGggPSIsIGlucHV0Lmd1ZXN0X2hvb2tfcGF0aCkKICAgIGNvdW50KGlucHV0Lmd1ZXN0X2hvb2tfcGF0aCkgPT0gMAoKICAgIHByaW50KCJDcmVhdGVTYW5kYm94UmVxdWVzdDogaW5wdXQua2VybmVsX21vZHVsZXMgPSIsIGlucHV0Lmtlcm5lbF9tb2R1bGVzKQogICAgY291bnQoaW5wdXQua2VybmVsX21vZHVsZXMpID09IDAKCiAgICBpX3BpZG5zIDo9IGlucHV0LnNhbmRib3hfcGlkbnMKICAgIHByaW50KCJDcmVhdGVTYW5kYm94UmVxdWVzdDogaV9waWRucyA9IiwgaV9waWRucykKICAgIGlfcGlkbnMgPT0gZmFsc2UKICAgIGFsbG93X3NhbmRib3hfc3RvcmFnZXMoaW5wdXQuc3RvcmFnZXMpCn0KCmFsbG93X2V4ZWMocF9jb250YWluZXIsIGlfcHJvY2VzcykgewogICAgcHJpbnQoImFsbG93X2V4ZWM6IHN0YXJ0IikKCiAgICBwX29jaSA9IHBfY29udGFpbmVyLk9DSQogICAgcF9zX25hbWUgPSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc19uYW1lc3BhY2UgPSBnZXRfc3RhdGVfdmFsKCJuYW1lc3BhY2UiKQogICAgYWxsb3dfcHJvYmVfcHJvY2VzcyhwX29jaS5Qcm9jZXNzLCBpX3Byb2Nlc3MsIHBfc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfZXhlYzogdHJ1ZSIpCn0KCmFsbG93X2ludGVyYWN0aXZlX2V4ZWMocF9jb250YWluZXIsIGlfcHJvY2VzcykgewogICAgcHJpbnQoImFsbG93X2ludGVyYWN0aXZlX2V4ZWM6IHN0YXJ0IikKCiAgICBwX29jaSA9IHBfY29udGFpbmVyLk9DSQogICAgcF9zX25hbWUgPSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc19uYW1lc3BhY2UgPSBnZXRfc3RhdGVfdmFsKCJuYW1lc3BhY2UiKQogICAgYWxsb3dfaW50ZXJhY3RpdmVfcHJvY2VzcyhwX29jaS5Qcm9jZXNzLCBpX3Byb2Nlc3MsIHBfc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfaW50ZXJhY3RpdmVfZXhlYzogdHJ1ZSIpCn0KCiMgVE9ETzogc2hvdWxkIG90aGVyIEV4ZWNQcm9jZXNzUmVxdWVzdCBpbnB1dCBkYXRhIGZpZWxkcyBiZSB2YWxpZGF0ZWQgYXMgd2VsbD8KRXhlY1Byb2Nlc3NSZXF1ZXN0IHsKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMTogaW5wdXQgPSIsIGlucHV0KQoKICAgIHNvbWUgcF9jb21tYW5kIGluIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuRXhlY1Byb2Nlc3NSZXF1ZXN0LmFsbG93ZWRfY29tbWFuZHMKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMTogcF9jb21tYW5kID0iLCBwX2NvbW1hbmQpCiAgICBwX2NvbW1hbmQgPT0gaW5wdXQucHJvY2Vzcy5BcmdzCgogICAgIyBUT0RPOiBtYXRjaCBwX2NvbnRhaW5lcidzIElEIHdpdGggdGhlIGlucHV0IGNvbnRhaW5lcl9pZC4KICAgIHNvbWUgcF9jb250YWluZXIgaW4gcG9saWN5X2RhdGEuY29udGFpbmVycwogICAgYWxsb3dfaW50ZXJhY3RpdmVfZXhlYyhwX2NvbnRhaW5lciwgaW5wdXQucHJvY2VzcykKCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDE6IHRydWUiKQp9CkV4ZWNQcm9jZXNzUmVxdWVzdCB7CiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDI6IGlucHV0ID0iLCBpbnB1dCkKCiAgICAjIFRPRE86IG1hdGNoIGlucHV0IGNvbnRhaW5lciBJRCB3aXRoIGl0cyBjb3JyZXNwb25kaW5nIGNvbnRhaW5lci5leGVjX2NvbW1hbmRzLgogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBzb21lIHBfY29tbWFuZCBpbiBwX2NvbnRhaW5lci5leGVjX2NvbW1hbmRzCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDI6IHBfY29tbWFuZCA9IiwgcF9jb21tYW5kKQoKICAgICMgVE9ETzogc2hvdWxkIG90aGVyIGlucHV0IGRhdGEgZmllbGRzIGJlIHZhbGlkYXRlZCBhcyB3ZWxsPwogICAgcF9jb21tYW5kID09IGlucHV0LnByb2Nlc3MuQXJncwoKICAgIGFsbG93X2V4ZWMocF9jb250YWluZXIsIGlucHV0LnByb2Nlc3MpCgogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAyOiB0cnVlIikKfQpFeGVjUHJvY2Vzc1JlcXVlc3QgewogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAzOiBpbnB1dCA9IiwgaW5wdXQpCgogICAgaV9jb21tYW5kID0gY29uY2F0KCIgIiwgaW5wdXQucHJvY2Vzcy5BcmdzKQogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAzOiBpX2NvbW1hbmQgPSIsIGlfY29tbWFuZCkKCiAgICBzb21lIHBfcmVnZXggaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5FeGVjUHJvY2Vzc1JlcXVlc3QucmVnZXgKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMzogcF9yZWdleCA9IiwgcF9yZWdleCkKCiAgICByZWdleC5tYXRjaChwX3JlZ2V4LCBpX2NvbW1hbmQpCgogICAgIyBUT0RPOiBtYXRjaCBwX2NvbnRhaW5lcidzIElEIHdpdGggdGhlIGlucHV0IGNvbnRhaW5lcl9pZC4KICAgIHNvbWUgcF9jb250YWluZXIgaW4gcG9saWN5X2RhdGEuY29udGFpbmVycwogICAgYWxsb3dfaW50ZXJhY3RpdmVfZXhlYyhwX2NvbnRhaW5lciwgaW5wdXQucHJvY2VzcykKCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDM6IHRydWUiKQp9CgpVcGRhdGVSb3V0ZXNSZXF1ZXN0IHsKICAgIHByaW50KCJVcGRhdGVSb3V0ZXNSZXF1ZXN0OiBpbnB1dCA9IiwgaW5wdXQpCiAgICBwcmludCgiVXBkYXRlUm91dGVzUmVxdWVzdDogcG9saWN5ID0iLCBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLlVwZGF0ZVJvdXRlc1JlcXVlc3QpCgogICAgaV9yb3V0ZXMgOj0gaW5wdXQucm91dGVzLlJvdXRlcwogICAgcF9zb3VyY2VfcmVnZXggPSBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLlVwZGF0ZVJvdXRlc1JlcXVlc3QuZm9yYmlkZGVuX3NvdXJjZV9yZWdleAogICAgcF9uYW1lcyA9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuVXBkYXRlUm91dGVzUmVxdWVzdC5mb3JiaWRkZW5fZGV2aWNlX25hbWVzCgogICAgZXZlcnkgaV9yb3V0ZSBpbiBpX3JvdXRlcyB7CiAgICAgICAgcHJpbnQoImlfcm91dGUuc291cmNlID0iLCBpX3JvdXRlLnNvdXJjZSkKICAgICAgICBldmVyeSBwX3JlZ2V4IGluIHBfc291cmNlX3JlZ2V4IHsKICAgICAgICAgICAgcHJpbnQoInBfcmVnZXggPSIsIHBfcmVnZXgpCiAgICAgICAgICAgIG5vdCByZWdleC5tYXRjaChwX3JlZ2V4LCBpX3JvdXRlLnNvdXJjZSkKICAgICAgICB9CgogICAgICAgIHByaW50KCJpX3JvdXRlLmRldmljZSA9IiwgaV9yb3V0ZS5kZXZpY2UpCiAgICAgICAgbm90IGlfcm91dGUuZGV2aWNlIGluIHBfbmFtZXMKICAgIH0KCiAgICBwcmludCgiVXBkYXRlUm91dGVzUmVxdWVzdDogdHJ1ZSIpCn0KClVwZGF0ZUludGVyZmFjZVJlcXVlc3QgewogICAgcHJpbnQoIlVwZGF0ZUludGVyZmFjZVJlcXVlc3Q6IGlucHV0ID0iLCBpbnB1dCkKICAgIHByaW50KCJVcGRhdGVJbnRlcmZhY2VSZXF1ZXN0OiBwb2xpY3kgPSIsIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuVXBkYXRlSW50ZXJmYWNlUmVxdWVzdCkKCiAgICBpX2ludGVyZmFjZSA6PSBpbnB1dC5pbnRlcmZhY2UKICAgIHBfZmxhZ3MgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmFsbG93X3Jhd19mbGFncwoKICAgICMgVHlwaWNhbGx5LCBqdXN0IElGRl9OT0FSUCBpcyB1c2VkLgogICAgYml0cy5hbmQoaV9pbnRlcmZhY2UucmF3X2ZsYWdzLCBiaXRzLm5lZ2F0ZShwX2ZsYWdzKSkgPT0gMAoKICAgIHBfbmFtZXMgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmZvcmJpZGRlbl9uYW1lcwoKICAgIG5vdCBpX2ludGVyZmFjZS5uYW1lIGluIHBfbmFtZXMKCiAgICBwX2h3YWRkcnMgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmZvcmJpZGRlbl9od19hZGRycwoKICAgIG5vdCBpX2ludGVyZmFjZS5od0FkZHIgaW4gcF9od2FkZHJzCgogICAgcHJpbnQoIlVwZGF0ZUludGVyZmFjZVJlcXVlc3Q6IHRydWUiKQp9CgpDbG9zZVN0ZGluUmVxdWVzdCB7CiAgICBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLkNsb3NlU3RkaW5SZXF1ZXN0ID09IHRydWUKfQoKUmVhZFN0cmVhbVJlcXVlc3QgewogICAgcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5SZWFkU3RyZWFtUmVxdWVzdCA9PSB0cnVlCn0KClVwZGF0ZUVwaGVtZXJhbE1vdW50c1JlcXVlc3QgewogICAgcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVFcGhlbWVyYWxNb3VudHNSZXF1ZXN0ID09IHRydWUKfQoKV3JpdGVTdHJlYW1SZXF1ZXN0IHsKICAgIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuV3JpdGVTdHJlYW1SZXF1ZXN0ID09IHRydWUKfQoKcG9saWN5X2RhdGEgOj0gewogICJjb250YWluZXJzIjogWwogICAgewogICAgICAiT0NJIjogewogICAgICAgICJWZXJzaW9uIjogIjEuMS4wLXJjLjEiLAogICAgICAgICJQcm9jZXNzIjogewogICAgICAgICAgIlRlcm1pbmFsIjogZmFsc2UsCiAgICAgICAgICAiVXNlciI6IHsKICAgICAgICAgICAgIlVJRCI6IDY1NTM1LAogICAgICAgICAgICAiR0lEIjogNjU1MzUsCiAgICAgICAgICAgICJBZGRpdGlvbmFsR2lkcyI6IFtdLAogICAgICAgICAgICAiVXNlcm5hbWUiOiAiIgogICAgICAgICAgfSwKICAgICAgICAgICJEZXByZWNhdGVkQXJncyI6IFsKICAgICAgICAgICAgIi9wYXVzZSIKICAgICAgICAgIF0sCiAgICAgICAgICAiQXJncyI6IFsKICAgICAgICAgICAgIi9wYXVzZSIKICAgICAgICAgIF0sCiAgICAgICAgICAiRW52IjogWwogICAgICAgICAgICAiUEFUSD0vdXNyL2xvY2FsL3NiaW46L3Vzci9sb2NhbC9iaW46L3Vzci9zYmluOi91c3IvYmluOi9zYmluOi9iaW4iCiAgICAgICAgICBdLAogICAgICAgICAgIkN3ZCI6ICIvIiwKICAgICAgICAgICJDYXBhYmlsaXRpZXMiOiB7CiAgICAgICAgICAgICJBbWJpZW50IjogW10sCiAgICAgICAgICAgICJCb3VuZGluZyI6IFsKICAgICAgICAgICAgICAiJChkZWZhdWx0X2NhcHMpIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiRWZmZWN0aXZlIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJJbmhlcml0YWJsZSI6IFtdLAogICAgICAgICAgICAiUGVybWl0dGVkIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICAiTm9OZXdQcml2aWxlZ2VzIjogdHJ1ZQogICAgICAgIH0sCiAgICAgICAgIlJvb3QiOiB7CiAgICAgICAgICAiUGF0aCI6ICIkKGNwYXRoKS8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgIlJlYWRvbmx5IjogdHJ1ZQogICAgICAgIH0sCiAgICAgICAgIk1vdW50cyI6IFsKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9wcm9jIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJwcm9jIiwKICAgICAgICAgICAgInR5cGVfIjogInByb2MiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2IiwKICAgICAgICAgICAgInNvdXJjZSI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJzdHJpY3RhdGltZSIsCiAgICAgICAgICAgICAgIm1vZGU9NzU1IiwKICAgICAgICAgICAgICAic2l6ZT02NTUzNmsiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L3B0cyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiZGV2cHRzIiwKICAgICAgICAgICAgInR5cGVfIjogImRldnB0cyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJuZXdpbnN0YW5jZSIsCiAgICAgICAgICAgICAgInB0bXhtb2RlPTA2NjYiLAogICAgICAgICAgICAgICJtb2RlPTA2MjAiLAogICAgICAgICAgICAgICJnaWQ9NSIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvc2htIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L3NobSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi9tcXVldWUiLAogICAgICAgICAgICAic291cmNlIjogIm1xdWV1ZSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJtcXVldWUiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvc3lzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJzeXNmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJzeXNmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2V0Yy9yZXNvbHYuY29uZiIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClyZXNvbHYuY29uZiQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJvIiwKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9kZXYiLAogICAgICAgICAgICAgICJub2V4ZWMiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0KICAgICAgICBdLAogICAgICAgICJBbm5vdGF0aW9ucyI6IHsKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmJ1bmRsZV9wYXRoIjogIi9ydW4vY29udGFpbmVyZC9pby5jb250YWluZXJkLnJ1bnRpbWUudjIudGFzay9rOHMuaW8vJChidW5kbGUtaWQpIiwKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIjogInBvZF9zYW5kYm94IiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSI6ICJzYW5kYm94IiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWlkIjogIl5bYS16MC05XXs2NH0kIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWxvZy1kaXJlY3RvcnkiOiAiXi92YXIvbG9nL3BvZHMvJChzYW5kYm94LW5hbWVzcGFjZSlfJChzYW5kYm94LW5hbWUpX1swLTlhLWZdezh9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezEyfSQiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZXNwYWNlIjogIiIsCiAgICAgICAgICAibmVyZGN0bC9uZXR3b3JrLW5hbWVzcGFjZSI6ICJeL3Zhci9ydW4vbmV0bnMvY25pLVswLTlhLWZdezh9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezEyfSQiCiAgICAgICAgfSwKICAgICAgICAiTGludXgiOiB7CiAgICAgICAgICAiTmFtZXNwYWNlcyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICJUeXBlIjogImlwYyIsCiAgICAgICAgICAgICAgIlBhdGgiOiAiIgogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgIlR5cGUiOiAidXRzIiwKICAgICAgICAgICAgICAiUGF0aCI6ICIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiVHlwZSI6ICJtb3VudCIsCiAgICAgICAgICAgICAgIlBhdGgiOiAiIgogICAgICAgICAgICB9CiAgICAgICAgICBdLAogICAgICAgICAgIk1hc2tlZFBhdGhzIjogWwogICAgICAgICAgICAiL3Byb2MvYWNwaSIsCiAgICAgICAgICAgICIvcHJvYy9hc291bmQiLAogICAgICAgICAgICAiL3Byb2Mva2NvcmUiLAogICAgICAgICAgICAiL3Byb2Mva2V5cyIsCiAgICAgICAgICAgICIvcHJvYy9sYXRlbmN5X3N0YXRzIiwKICAgICAgICAgICAgIi9wcm9jL3RpbWVyX2xpc3QiLAogICAgICAgICAgICAiL3Byb2MvdGltZXJfc3RhdHMiLAogICAgICAgICAgICAiL3Byb2Mvc2NoZWRfZGVidWciLAogICAgICAgICAgICAiL3N5cy9maXJtd2FyZSIsCiAgICAgICAgICAgICIvcHJvYy9zY3NpIgogICAgICAgICAgXSwKICAgICAgICAgICJSZWFkb25seVBhdGhzIjogWwogICAgICAgICAgICAiL3Byb2MvYnVzIiwKICAgICAgICAgICAgIi9wcm9jL2ZzIiwKICAgICAgICAgICAgIi9wcm9jL2lycSIsCiAgICAgICAgICAgICIvcHJvYy9zeXMiLAogICAgICAgICAgICAiL3Byb2Mvc3lzcnEtdHJpZ2dlciIKICAgICAgICAgIF0sCiAgICAgICAgICAiRGV2aWNlcyI6IFtdLAogICAgICAgICAgIlN5c2N0bCI6IHsKICAgICAgICAgICAgIm5ldC5pcHY0LmlwX3VucHJpdmlsZWdlZF9wb3J0X3N0YXJ0IjogIjAiLAogICAgICAgICAgICAibmV0LmlwdjQucGluZ19ncm91cF9yYW5nZSI6ICIwIDIxNDc0ODM2NDciCiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9LAogICAgICAic3RvcmFnZXMiOiBbCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJibGsiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogInRhciIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIiQoaGFzaDApIgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGxheWVyMCkiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJvdmVybGF5ZnMiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogImZ1c2UzLmthdGEtb3ZlcmxheSIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIjVhNWFhZDgwMDU1ZmYyMDAxMmE1MGRjMjVmOGRmN2EyOTkyNDQ3NDMyNGQ2NWY3ZDUzMDZlZThlZTI3ZmY3MWQiLAogICAgICAgICAgICAiODE3MjUwZjFhM2UzMzZkYTc2ZjViZDNmYTc4NGUxYjI2ZDk1OWI5YzEzMTg3NjgxNWJhMjYwNDA0OGI3MGMxOCIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChjcGF0aCkvJChidW5kbGUtaWQpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9CiAgICAgIF0sCiAgICAgICJkZXZpY2VzIjogW10sCiAgICAgICJzYW5kYm94X3BpZG5zIjogZmFsc2UsCiAgICAgICJleGVjX2NvbW1hbmRzIjogW10sCiAgICAgICJlbnZfbWFwIjogewogICAgICAgICJQQVRIIjogIi91c3IvbG9jYWwvc2JpbjovdXNyL2xvY2FsL2JpbjovdXNyL3NiaW46L3Vzci9iaW46L3NiaW46L2JpbiIKICAgICAgfQogICAgfSwKICAgIHsKICAgICAgIk9DSSI6IHsKICAgICAgICAiVmVyc2lvbiI6ICIxLjEuMC1yYy4xIiwKICAgICAgICAiUHJvY2VzcyI6IHsKICAgICAgICAgICJUZXJtaW5hbCI6IGZhbHNlLAogICAgICAgICAgIlVzZXIiOiB7CiAgICAgICAgICAgICJVSUQiOiAwLAogICAgICAgICAgICAiR0lEIjogMCwKICAgICAgICAgICAgIkFkZGl0aW9uYWxHaWRzIjogW10sCiAgICAgICAgICAgICJVc2VybmFtZSI6ICIiCiAgICAgICAgICB9LAogICAgICAgICAgIkRlcHJlY2F0ZWRBcmdzIjogWwogICAgICAgICAgICAic2giCiAgICAgICAgICBdLAogICAgICAgICAgIkFyZ3MiOiBbCiAgICAgICAgICAgICJzaCIKICAgICAgICAgIF0sCiAgICAgICAgICAiRW52IjogWwogICAgICAgICAgICAiUEFUSD0vdXNyL2xvY2FsL3NiaW46L3Vzci9sb2NhbC9iaW46L3Vzci9zYmluOi91c3IvYmluOi9zYmluOi9iaW4iLAogICAgICAgICAgICAiSE9TVE5BTUU9JChob3N0LW5hbWUpIgogICAgICAgICAgXSwKICAgICAgICAgICJDd2QiOiAiLyIsCiAgICAgICAgICAiQ2FwYWJpbGl0aWVzIjogewogICAgICAgICAgICAiQW1iaWVudCI6IFtdLAogICAgICAgICAgICAiQm91bmRpbmciOiBbCiAgICAgICAgICAgICAgIiQoZGVmYXVsdF9jYXBzKSIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgIkVmZmVjdGl2ZSI6IFsKICAgICAgICAgICAgICAiJChkZWZhdWx0X2NhcHMpIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiSW5oZXJpdGFibGUiOiBbXSwKICAgICAgICAgICAgIlBlcm1pdHRlZCI6IFsKICAgICAgICAgICAgICAiJChkZWZhdWx0X2NhcHMpIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgIk5vTmV3UHJpdmlsZWdlcyI6IGZhbHNlCiAgICAgICAgfSwKICAgICAgICAiUm9vdCI6IHsKICAgICAgICAgICJQYXRoIjogIiQoY3BhdGgpLyQoYnVuZGxlLWlkKSIsCiAgICAgICAgICAiUmVhZG9ubHkiOiBmYWxzZQogICAgICAgIH0sCiAgICAgICAgIk1vdW50cyI6IFsKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9wcm9jIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJwcm9jIiwKICAgICAgICAgICAgInR5cGVfIjogInByb2MiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2IiwKICAgICAgICAgICAgInNvdXJjZSI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJzdHJpY3RhdGltZSIsCiAgICAgICAgICAgICAgIm1vZGU9NzU1IiwKICAgICAgICAgICAgICAic2l6ZT02NTUzNmsiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L3B0cyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiZGV2cHRzIiwKICAgICAgICAgICAgInR5cGVfIjogImRldnB0cyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJuZXdpbnN0YW5jZSIsCiAgICAgICAgICAgICAgInB0bXhtb2RlPTA2NjYiLAogICAgICAgICAgICAgICJtb2RlPTA2MjAiLAogICAgICAgICAgICAgICJnaWQ9NSIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvc2htIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L3NobSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi9tcXVldWUiLAogICAgICAgICAgICAic291cmNlIjogIm1xdWV1ZSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJtcXVldWUiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvc3lzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJzeXNmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJzeXNmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL3N5cy9mcy9jZ3JvdXAiLAogICAgICAgICAgICAic291cmNlIjogImNncm91cCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJjZ3JvdXAiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiLAogICAgICAgICAgICAgICJyZWxhdGltZSIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2V0Yy9ob3N0cyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClob3N0cyQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicnciCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L3Rlcm1pbmF0aW9uLWxvZyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeCl0ZXJtaW5hdGlvbi1sb2ckIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJ3IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2V0Yy9ob3N0bmFtZSIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClob3N0bmFtZSQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicnciCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZXRjL3Jlc29sdi5jb25mIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KXJlc29sdi5jb25mJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJydyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi92YXIvcnVuL3NlY3JldHMva3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudCIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClzZXJ2aWNlYWNjb3VudCQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicm8iCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvdmFyL3J1bi9zZWNyZXRzL2F6dXJlL3Rva2VucyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeCl0b2tlbnMkIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9CiAgICAgICAgXSwKICAgICAgICAiQW5ub3RhdGlvbnMiOiB7CiAgICAgICAgICAiaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5idW5kbGVfcGF0aCI6ICIvcnVuL2NvbnRhaW5lcmQvaW8uY29udGFpbmVyZC5ydW50aW1lLnYyLnRhc2svazhzLmlvLyQoYnVuZGxlLWlkKSIsCiAgICAgICAgICAiaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5jb250YWluZXJfdHlwZSI6ICJwb2RfY29udGFpbmVyIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItbmFtZSI6ICJidXN5IiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSI6ICJjb250YWluZXIiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLmltYWdlLW5hbWUiOiAibWNyLm1pY3Jvc29mdC5jb20vYWtzL2UyZS9saWJyYXJ5LWJ1c3lib3g6bWFzdGVyLjIyMDMxNC4xLWxpbnV4LWFtZDY0IiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWlkIjogIl5bYS16MC05XXs2NH0kIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LW5hbWVzcGFjZSI6ICIiCiAgICAgICAgfSwKICAgICAgICAiTGludXgiOiB7CiAgICAgICAgICAiTmFtZXNwYWNlcyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICJUeXBlIjogImlwYyIsCiAgICAgICAgICAgICAgIlBhdGgiOiAiIgogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgIlR5cGUiOiAidXRzIiwKICAgICAgICAgICAgICAiUGF0aCI6ICIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiVHlwZSI6ICJtb3VudCIsCiAgICAgICAgICAgICAgIlBhdGgiOiAiIgogICAgICAgICAgICB9CiAgICAgICAgICBdLAogICAgICAgICAgIk1hc2tlZFBhdGhzIjogWwogICAgICAgICAgICAiL3Byb2MvYWNwaSIsCiAgICAgICAgICAgICIvcHJvYy9rY29yZSIsCiAgICAgICAgICAgICIvcHJvYy9rZXlzIiwKICAgICAgICAgICAgIi9wcm9jL2xhdGVuY3lfc3RhdHMiLAogICAgICAgICAgICAiL3Byb2MvdGltZXJfbGlzdCIsCiAgICAgICAgICAgICIvcHJvYy90aW1lcl9zdGF0cyIsCiAgICAgICAgICAgICIvcHJvYy9zY2hlZF9kZWJ1ZyIsCiAgICAgICAgICAgICIvcHJvYy9zY3NpIiwKICAgICAgICAgICAgIi9zeXMvZmlybXdhcmUiCiAgICAgICAgICBdLAogICAgICAgICAgIlJlYWRvbmx5UGF0aHMiOiBbCiAgICAgICAgICAgICIvcHJvYy9hc291bmQiLAogICAgICAgICAgICAiL3Byb2MvYnVzIiwKICAgICAgICAgICAgIi9wcm9jL2ZzIiwKICAgICAgICAgICAgIi9wcm9jL2lycSIsCiAgICAgICAgICAgICIvcHJvYy9zeXMiLAogICAgICAgICAgICAiL3Byb2Mvc3lzcnEtdHJpZ2dlciIKICAgICAgICAgIF0sCiAgICAgICAgICAiRGV2aWNlcyI6IFtdLAogICAgICAgICAgIlN5c2N0bCI6IHsKICAgICAgICAgICAgIm5ldC5pcHY0LmlwX3VucHJpdmlsZWdlZF9wb3J0X3N0YXJ0IjogIjAiLAogICAgICAgICAgICAibmV0LmlwdjQucGluZ19ncm91cF9yYW5nZSI6ICIwIDIxNDc0ODM2NDciCiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9LAogICAgICAic3RvcmFnZXMiOiBbCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJibGsiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogInRhciIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIiQoaGFzaDApIgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGxheWVyMCkiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJibGsiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogInRhciIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIiQoaGFzaDEpIgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGxheWVyMSkiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJvdmVybGF5ZnMiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogImZ1c2UzLmthdGEtb3ZlcmxheSIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIjJjMzQyYTEzN2U2OTNjNzg5OGFlYzM2ZGExMDQ3ZjE5MWRjN2MxNjg3ZTY2MTk4YWRhY2M0MzljZjRhZGYzNzk6MjU3MGUzYTE5ZTFiZjIwZGRkYTQ1NDk4YTk2MjdmNjE1NTVkMmQ2YzAxNDc5YjliNzY0NjBiNjc5YjI3ZDU1MiIsCiAgICAgICAgICAgICI4NTY4YzcwYzBjY2ZlMDA1MTA5MmU4MThkYTc2OTExMWE1OTg4MmNkMTlkZDc5OWQzYmNhNWZmYTgyNzkxMDgwOmI2NDNiNjIxNzc0ODk4MzgzMGIyNmFjMTRhMzVhMzMyMmRkNTI4YzAwOTYzZWFhZGQ5MWVmNTVmNTEzZGM3M2YiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQoY3BhdGgpLyQoYnVuZGxlLWlkKSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfQogICAgICBdLAogICAgICAiZGV2aWNlcyI6IFtdLAogICAgICAic2FuZGJveF9waWRucyI6IHRydWUsCiAgICAgICJleGVjX2NvbW1hbmRzIjogW10sCiAgICAgICJlbnZfbWFwIjogewogICAgICAgICJIT1NUTkFNRSI6ICIkKGhvc3QtbmFtZSkiLAogICAgICAgICJQQVRIIjogIi91c3IvbG9jYWwvc2JpbjovdXNyL2xvY2FsL2JpbjovdXNyL3NiaW46L3Vzci9iaW46L3NiaW46L2JpbiIKICAgICAgfQogICAgfQogIF0sCiAgImNvbW1vbiI6IHsKICAgICJjcGF0aCI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zaGFyZWQvY29udGFpbmVycyIsCiAgICAibW91bnRfc291cmNlX2NwYXRoIjogIi9ydW4va2F0YS1jb250YWluZXJzL3NoYXJlZC9jb250YWluZXJzIiwKICAgICJzZnByZWZpeCI6ICJeJChjcGF0aCkvJChidW5kbGUtaWQpLVthLXowLTldezE2fS0iLAogICAgInNwYXRoIjogIi9ydW4va2F0YS1jb250YWluZXJzL3NhbmRib3gvc3RvcmFnZSIsCiAgICAiaXB2NF9hIjogIigoWzAtOV18WzEtOV1bMC05XXwxWzAtOV17Mn18MlswLTRdWzAtOV18MjVbMC01XSlcXC4pezN9KFswLTldfFsxLTldWzAtOV18MVswLTldezJ9fDJbMC00XVswLTldfDI1WzAtNV0pIiwKICAgICJpcF9wIjogIlswLTldezEsNX0iLAogICAgInN2Y19uYW1lIjogIltBLVpfXFwuXFwtXSsiLAogICAgImRuc19sYWJlbCI6ICJbYS16QS1aMC05X1xcLlxcLV0rIiwKICAgICJzX3NvdXJjZTEiOiAiXi4uMlswLTldezN9X1swLTFdWzAtOV1fWzAtM11bMC05XV9bMC0yXVswLTldX1swLTVdWzAtOV1fWzAtNV1bMC05XVxcLlswLTldezEsMTB9JCIsCiAgICAic19zb3VyY2UyIjogIl4uLmRhdGEvIiwKICAgICJkbnNfc3ViZG9tYWluIjogIl5bYS16MC05XShbLWEtejAtOV0qW2EtejAtOV0pPyQiLAogICAgInBvZF91aWQiOiAiXlswLTlhLWZBLUZdezh9LVswLTlhLWZBLUZdezR9LVswLTlhLWZBLUZdezR9LVswLTlhLWZBLUZdezR9LVswLTlhLWZBLUZdezEyfSQiLAogICAgImRlZmF1bHRfY2FwcyI6IFsKICAgICAgIkNBUF9DSE9XTiIsCiAgICAgICJDQVBfREFDX09WRVJSSURFIiwKICAgICAgIkNBUF9GU0VUSUQiLAogICAgICAiQ0FQX0ZPV05FUiIsCiAgICAgICJDQVBfTUtOT0QiLAogICAgICAiQ0FQX05FVF9SQVciLAogICAgICAiQ0FQX1NFVEdJRCIsCiAgICAgICJDQVBfU0VUVUlEIiwKICAgICAgIkNBUF9TRVRGQ0FQIiwKICAgICAgIkNBUF9TRVRQQ0FQIiwKICAgICAgIkNBUF9ORVRfQklORF9TRVJWSUNFIiwKICAgICAgIkNBUF9TWVNfQ0hST09UIiwKICAgICAgIkNBUF9LSUxMIiwKICAgICAgIkNBUF9BVURJVF9XUklURSIKICAgIF0sCiAgICAicHJpdmlsZWdlZF9jYXBzIjogWwogICAgICAiQ0FQX0NIT1dOIiwKICAgICAgIkNBUF9EQUNfT1ZFUlJJREUiLAogICAgICAiQ0FQX0RBQ19SRUFEX1NFQVJDSCIsCiAgICAgICJDQVBfRk9XTkVSIiwKICAgICAgIkNBUF9GU0VUSUQiLAogICAgICAiQ0FQX0tJTEwiLAogICAgICAiQ0FQX1NFVEdJRCIsCiAgICAgICJDQVBfU0VUVUlEIiwKICAgICAgIkNBUF9TRVRQQ0FQIiwKICAgICAgIkNBUF9MSU5VWF9JTU1VVEFCTEUiLAogICAgICAiQ0FQX05FVF9CSU5EX1NFUlZJQ0UiLAogICAgICAiQ0FQX05FVF9CUk9BRENBU1QiLAogICAgICAiQ0FQX05FVF9BRE1JTiIsCiAgICAgICJDQVBfTkVUX1JBVyIsCiAgICAgICJDQVBfSVBDX0xPQ0siLAogICAgICAiQ0FQX0lQQ19PV05FUiIsCiAgICAgICJDQVBfU1lTX01PRFVMRSIsCiAgICAgICJDQVBfU1lTX1JBV0lPIiwKICAgICAgIkNBUF9TWVNfQ0hST09UIiwKICAgICAgIkNBUF9TWVNfUFRSQUNFIiwKICAgICAgIkNBUF9TWVNfUEFDQ1QiLAogICAgICAiQ0FQX1NZU19BRE1JTiIsCiAgICAgICJDQVBfU1lTX0JPT1QiLAogICAgICAiQ0FQX1NZU19OSUNFIiwKICAgICAgIkNBUF9TWVNfUkVTT1VSQ0UiLAogICAgICAiQ0FQX1NZU19USU1FIiwKICAgICAgIkNBUF9TWVNfVFRZX0NPTkZJRyIsCiAgICAgICJDQVBfTUtOT0QiLAogICAgICAiQ0FQX0xFQVNFIiwKICAgICAgIkNBUF9BVURJVF9XUklURSIsCiAgICAgICJDQVBfQVVESVRfQ09OVFJPTCIsCiAgICAgICJDQVBfU0VURkNBUCIsCiAgICAgICJDQVBfTUFDX09WRVJSSURFIiwKICAgICAgIkNBUF9NQUNfQURNSU4iLAogICAgICAiQ0FQX1NZU0xPRyIsCiAgICAgICJDQVBfV0FLRV9BTEFSTSIsCiAgICAgICJDQVBfQkxPQ0tfU1VTUEVORCIsCiAgICAgICJDQVBfQVVESVRfUkVBRCIsCiAgICAgICJDQVBfUEVSRk1PTiIsCiAgICAgICJDQVBfQlBGIiwKICAgICAgIkNBUF9DSEVDS1BPSU5UX1JFU1RPUkUiCiAgICBdLAogICAgInZpcnRpb19ibGtfc3RvcmFnZV9jbGFzc2VzIjogWwogICAgICAiY2MtbG9jYWwtY3NpIiwKICAgICAgImNjLW1hbmFnZWQtY3NpIiwKICAgICAgImNjLW1hbmFnZWQtcHJlbWl1bS1jc2kiCiAgICBdLAogICAgInNtYl9zdG9yYWdlX2NsYXNzZXMiOiBbCiAgICAgIHsKICAgICAgICAibmFtZSI6ICJhenVyZWZpbGUtY3NpLWthdGEtY2MiLAogICAgICAgICJtb3VudF9vcHRpb25zIjogWwogICAgICAgICAgImRpcl9tb2RlPTA3NzciLAogICAgICAgICAgImZpbGVfbW9kZT0wNzc3IiwKICAgICAgICAgICJtZnN5bWxpbmtzIiwKICAgICAgICAgICJjYWNoZT1zdHJpY3QiLAogICAgICAgICAgIm5vc2hhcmVzb2NrIiwKICAgICAgICAgICJhY3RpbWVvPTMwIiwKICAgICAgICAgICJub2JybCIKICAgICAgICBdCiAgICAgIH0KICAgIF0KICB9LAogICJzYW5kYm94IjogewogICAgInN0b3JhZ2VzIjogWwogICAgICB7CiAgICAgICAgImRyaXZlciI6ICJlcGhlbWVyYWwiLAogICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICJzb3VyY2UiOiAic2htIiwKICAgICAgICAiZnN0eXBlIjogInRtcGZzIiwKICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAibm9kZXYiLAogICAgICAgICAgIm1vZGU9MTc3NyIsCiAgICAgICAgICAic2l6ZT02NzEwODg2NCIKICAgICAgICBdLAogICAgICAgICJtb3VudF9wb2ludCI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L3NobSIsCiAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICB9CiAgICBdCiAgfSwKICAicmVxdWVzdF9kZWZhdWx0cyI6IHsKICAgICJDcmVhdGVDb250YWluZXJSZXF1ZXN0IjogewogICAgICAiYWxsb3dfZW52X3JlZ2V4IjogWwogICAgICAgICJeSE9TVE5BTUU9JChkbnNfbGFiZWwpJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9QT1JUXyQoaXBfcClfVENQPXRjcDovLyQoaXB2NF9hKTokKGlwX3ApJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9QT1JUXyQoaXBfcClfVENQX1BST1RPPXRjcCQiLAogICAgICAgICJeJChzdmNfbmFtZSlfUE9SVF8kKGlwX3ApX1RDUF9QT1JUPSQoaXBfcCkkIiwKICAgICAgICAiXiQoc3ZjX25hbWUpX1BPUlRfJChpcF9wKV9UQ1BfQUREUj0kKGlwdjRfYSkkIiwKICAgICAgICAiXiQoc3ZjX25hbWUpX1NFUlZJQ0VfSE9TVD0kKGlwdjRfYSkkIiwKICAgICAgICAiXiQoc3ZjX25hbWUpX1NFUlZJQ0VfUE9SVD0kKGlwX3ApJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9TRVJWSUNFX1BPUlRfJChkbnNfbGFiZWwpPSQoaXBfcCkkIiwKICAgICAgICAiXiQoc3ZjX25hbWUpX1BPUlQ9dGNwOi8vJChpcHY0X2EpOiQoaXBfcCkkIiwKICAgICAgICAiXkFaVVJFX0NMSUVOVF9JRD1bQS1GYS1mMC05LV0qJCIsCiAgICAgICAgIl5BWlVSRV9URU5BTlRfSUQ9W0EtRmEtZjAtOS1dKiQiLAogICAgICAgICJeQVpVUkVfRkVERVJBVEVEX1RPS0VOX0ZJTEU9L3Zhci9ydW4vc2VjcmV0cy9henVyZS90b2tlbnMvYXp1cmUtaWRlbnRpdHktdG9rZW4kIiwKICAgICAgICAiXkFaVVJFX0FVVEhPUklUWV9IT1NUPWh0dHBzOi8vbG9naW5cXC5taWNyb3NvZnRvbmxpbmVcXC5jb20vJCIsCiAgICAgICAgIl5URVJNPXh0ZXJtJCIKICAgICAgXSwKICAgICAgImFsbG93X2Vudl9yZWdleF9tYXAiOiB7CiAgICAgICAgIkNQVV9MSU1JVCI6ICJeWzAtOV0rJCIsCiAgICAgICAgIkpPQl9DT01QTEVUSU9OX0lOREVYIjogIl5bMC05XSokIiwKICAgICAgICAiTUVNT1JZX0xJTUlUIjogIl5bMC05XSskIgogICAgICB9CiAgICB9LAogICAgIkNvcHlGaWxlUmVxdWVzdCI6IFsKICAgICAgIiQoc2ZwcmVmaXgpIgogICAgXSwKICAgICJFeGVjUHJvY2Vzc1JlcXVlc3QiOiB7CiAgICAgICJhbGxvd2VkX2NvbW1hbmRzIjogW10sCiAgICAgICJyZWdleCI6IFtdCiAgICB9LAogICAgIlVwZGF0ZVJvdXRlc1JlcXVlc3QiOiB7CiAgICAgICJmb3JiaWRkZW5fZGV2aWNlX25hbWVzIjogWwogICAgICAgICJsbyIKICAgICAgXSwKICAgICAgImZvcmJpZGRlbl9zb3VyY2VfcmVnZXgiOiBbCiAgICAgICAgIl4oPzowezAsNH06KXswLDd9MHswLDN9MSQiLAogICAgICAgICJeMTI3XFwuKD86WzAtOV17MSwzfVxcLil7Mn1bMC05XXsxLDN9JCIKICAgICAgXQogICAgfSwKICAgICJVcGRhdGVJbnRlcmZhY2VSZXF1ZXN0IjogewogICAgICAiYWxsb3dfcmF3X2ZsYWdzIjogMTI4LAogICAgICAiZm9yYmlkZGVuX25hbWVzIjogWwogICAgICAgICJsbyIKICAgICAgXSwKICAgICAgImZvcmJpZGRlbl9od19hZGRycyI6IFsKICAgICAgICAiMDA6MDA6MDA6MDA6MDA6MDAiCiAgICAgIF0KICAgIH0sCiAgICAiQ2xvc2VTdGRpblJlcXVlc3QiOiBmYWxzZSwKICAgICJSZWFkU3RyZWFtUmVxdWVzdCI6IGZhbHNlLAogICAgIlVwZGF0ZUVwaGVtZXJhbE1vdW50c1JlcXVlc3QiOiBmYWxzZSwKICAgICJXcml0ZVN0cmVhbVJlcXVlc3QiOiBmYWxzZQogIH0KfQ== + spec: + runtimeClassName: kata-cc + shareProcessNamespace: true + containers: + - name: busy + image: "mcr.microsoft.com/aks/e2e/library-busybox:master.220314.1-linux-amd64" + ports: + - containerPort: 6379 + replicas: 3 diff --git a/src/agent/samples/policy/yaml/secrets/azure-file-secrets.yaml b/src/agent/samples/policy/yaml/secrets/azure-file-secrets.yaml new file mode 100644 index 000000000000..082d1cecaba8 --- /dev/null +++ b/src/agent/samples/policy/yaml/secrets/azure-file-secrets.yaml @@ -0,0 +1,26 @@ +--- +apiVersion: v1 +kind: Pod +metadata: + name: azure-file-secrets + labels: + run: busybox + annotations: + io.katacontainers.config.agent.policy: IyBDb3B5cmlnaHQgKGMpIDIwMjMgTWljcm9zb2Z0IENvcnBvcmF0aW9uCiMKIyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMAojCnBhY2thZ2UgYWdlbnRfcG9saWN5CgppbXBvcnQgZnV0dXJlLmtleXdvcmRzLmluCmltcG9ydCBmdXR1cmUua2V5d29yZHMuZXZlcnkKCiMgRGVmYXVsdCB2YWx1ZXMsIHJldHVybmVkIGJ5IE9QQSB3aGVuIHJ1bGVzIGNhbm5vdCBiZSBldmFsdWF0ZWQgdG8gdHJ1ZS4KZGVmYXVsdCBBZGRBUlBOZWlnaGJvcnNSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgQWRkU3dhcFJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBDbG9zZVN0ZGluUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IENvcHlGaWxlUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IENyZWF0ZUNvbnRhaW5lclJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBDcmVhdGVTYW5kYm94UmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IERlc3Ryb3lTYW5kYm94UmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgRXhlY1Byb2Nlc3NSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgR2V0T09NRXZlbnRSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBHdWVzdERldGFpbHNSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBMaXN0SW50ZXJmYWNlc1JlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBMaXN0Um91dGVzUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IE1lbUhvdHBsdWdCeVByb2JlUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IE9ubGluZUNQVU1lbVJlcXVlc3QgOj0gdHJ1ZQpkZWZhdWx0IFBhdXNlQ29udGFpbmVyUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFJlYWRTdHJlYW1SZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgUmVtb3ZlQ29udGFpbmVyUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgUmVtb3ZlU3RhbGVWaXJ0aW9mc1NoYXJlTW91bnRzUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgUmVzZWVkUmFuZG9tRGV2UmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFJlc3VtZUNvbnRhaW5lclJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBTZXRHdWVzdERhdGVUaW1lUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFNldFBvbGljeVJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBTaWduYWxQcm9jZXNzUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgU3RhcnRDb250YWluZXJSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBTdGFydFRyYWNpbmdSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgU3RhdHNDb250YWluZXJSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBTdG9wVHJhY2luZ1JlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBUdHlXaW5SZXNpemVSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBVcGRhdGVDb250YWluZXJSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgVXBkYXRlRXBoZW1lcmFsTW91bnRzUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFVwZGF0ZUludGVyZmFjZVJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBVcGRhdGVSb3V0ZXNSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgV2FpdFByb2Nlc3NSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBXcml0ZVN0cmVhbVJlcXVlc3QgOj0gZmFsc2UKCiMgQWxsb3dSZXF1ZXN0c0ZhaWxpbmdQb2xpY3kgOj0gdHJ1ZSBjb25maWd1cmVzIHRoZSBBZ2VudCB0byAqYWxsb3cgYW55CiMgcmVxdWVzdHMgY2F1c2luZyBhIHBvbGljeSBmYWlsdXJlKi4gVGhpcyBpcyBhbiB1bnNlY3VyZSBjb25maWd1cmF0aW9uCiMgYnV0IGlzIHVzZWZ1bCBmb3IgYWxsb3dpbmcgdW5zZWN1cmUgcG9kcyB0byBzdGFydCwgdGhlbiBjb25uZWN0IHRvCiMgdGhlbSBhbmQgaW5zcGVjdCBPUEEgbG9ncyBmb3IgdGhlIHJvb3QgY2F1c2Ugb2YgYSBmYWlsdXJlLgpkZWZhdWx0IEFsbG93UmVxdWVzdHNGYWlsaW5nUG9saWN5IDo9IGZhbHNlCgojIENvbnN0YW50cwpTX05BTUVfS0VZID0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZSIKU19OQU1FU1BBQ0VfS0VZID0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZXNwYWNlIgpCVU5ETEVfSUQgPSAiW2EtejAtOV17NjR9IgoKQ3JlYXRlQ29udGFpbmVyUmVxdWVzdDo9IHJlc3AgewogICAgbm90IGlzX251bGwoaW5wdXQuZW52X21hcCkKICAgIAogICAgaV9lbnZfbWFwIDo9IGlucHV0LmVudl9tYXAKICAgIAogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBwX2Vudl9tYXAgOj0gcF9jb250YWluZXIuZW52X21hcCAgCiAgICBhbGxvd19lbnZfbWFwKHBfZW52X21hcCwgaV9lbnZfbWFwKQogICAgCiAgICBpX3Byb2Nlc3MgOj0gaW5wdXQuYmFzZS5PQ0kuUHJvY2VzcwogICAgCiAgICBwX3Byb2Nlc3MgOj0gcF9jb250YWluZXIuT0NJLlByb2Nlc3MKICAgIAogICAgYWxsb3dfYXJncyhpX3Byb2Nlc3MsIHBfcHJvY2VzcywgaV9lbnZfbWFwKQoKICAgIHJlc3AgPSBDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uKGlucHV0LmJhc2UpCiAgICBwcmludCgiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdDogdHJ1ZSIpCn0KCmFsbG93X2FyZ3MoaV9wcm9jZXNzLCBwX3Byb2Nlc3MsIGlfZW52X21hcCkgewogICAgaV9hcmdzIDo9IGlfcHJvY2Vzcy5BcmdzCiAgICBwX2FyZ3MgOj0gcF9wcm9jZXNzLkFyZ3MKICAgIHByaW50KCJhbGxvd19hcmdzOiBpX2FyZ3MgPSIsIGlfYXJncywgInBfYXJncyA9IiwgcF9hcmdzKQogICAgY291bnQoaV9hcmdzKSA9PSBjb3VudChwX2FyZ3MpCiAgICBldmVyeSBpLCBpX2FyZyBpbiBpX2FyZ3MgewogICAgICAgIHByaW50KCJhbGxvd19hcmdzOiBpX2FyZyA9IiwgaV9hcmcpCiAgICAgICAgcF9hcmdfcmVwbGFjZWQgOj0gcmVwbGFjZV9lbnZfdmFyaWFibGVzKHBfYXJnc1tpXSwgaV9lbnZfbWFwKQogICAgICAgIHByaW50KCJhbGxvd19hcmdzOiBwX2FyZ19yZXBsYWNlZCA9IiwgcF9hcmdfcmVwbGFjZWQpCiAgICAgICAgcF9hcmdfcmVwbGFjZWQyIDo9IHJlcGxhY2UocF9hcmdfcmVwbGFjZWQsICIkJCIsICIkIikKICAgICAgICBwcmludCgiYWxsb3dfYXJnczogcF9hcmdfcmVwbGFjZWQyID0iLCBwX2FyZ19yZXBsYWNlZDIpCiAgICAgICAgaV9hcmcgPT0gcF9hcmdfcmVwbGFjZWQyCiAgICB9CiAgICBwcmludCgiYWxsb3dfYXJnczogdHJ1ZSIpCn0KCmFsbG93X2FyZ3MoaV9wcm9jZXNzLCBwX3Byb2Nlc3MsIGlfZW52X21hcCkgewogICAgbm90IGlfcHJvY2Vzcy5BcmdzCiAgICBub3QgcF9wcm9jZXNzLkFyZ3MKICAgIHByaW50KCJhbGxvd19hcmdzMjogbm8gYXJncyIpCn0KCiMgdGhpcyBmdW5jdGlvbiByZXBsYWNlcyBhbGwgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyBpbiBhIHN0cmluZywgZ2l2ZW4gYSBtYXAgb2YgZW52aXJvbm1lbnQga2V5cyB0byBlbnZpcm9ubWVudCB2YWx1ZXMKIyBlZyBzdHIgPSAiZWNobyAkKENMVVNURVJfSUQpOyBlY2hvICQoTk9ERV9OQU1FKTsiCiMgZW52X21hcCA9IHsiQ0xVU1RFUl9JRCI6ICJhYmMiLCAiTk9ERV9OQU1FIiA6ICJ4eXoifQojIHJlc3VsdCA9ICJlY2hvIGFiYzsgZWNobyB4eXo7IgpyZXBsYWNlX2Vudl92YXJpYWJsZXMoc3RyLCBlbnZfbWFwKSA9IHJlc3VsdCB7CiAgICAjIG1ha2UgYW4gYXJyYXkgb2YgdGhlIGtleXMgZWcgWyJDTFVTVEVSX0lEIiwgIk5PREVfTkFNRSJdCiAgICBrZXlzIDo9IFt4IHwgc29tZSB4IGluIG9iamVjdC5rZXlzKGVudl9tYXApXQogICAgcmVzdWx0IDo9IHJlcGxhY2Vfc3RyX3JlYyhzdHIsIGVudl9tYXAsIGtleXMsIGNvdW50KGtleXMpIC0gMSkKfQoKIyBiYXNlIGNhc2UKcmVwbGFjZV9zdHJfcmVjKHN0ciwgZW52X21hcCwgYXJyX2tleXMsIGkpID0gcmVzdWx0IHsKICAgIGkgPCAwCiAgICByZXN1bHQgOj0gc3RyCn0KCiMgcmVjdXJzaXZlIHN0ZXAKcmVwbGFjZV9zdHJfcmVjKHN0ciwgZW52X21hcCwgYXJyX2tleXMsIGkpID0gcmVzdWx0IHsKICAgIGkgPj0gMAogICAga2V5IDo9IGFycl9rZXlzW2ldCiAgICBlbnZfa2V5MSA6PSBjb25jYXQoIiIsIFsiJCgiLCBrZXksICIpIl0pCiAgICAjIHJlcGxhY2UgJChWQVIpIHdpdGggdmFsdWUKICAgIG5ld19zdHIxIDo9IHJlcGxhY2Uoc3RyLCBlbnZfa2V5MSwgZW52X21hcFtrZXldKQogICAgIyByZXBsYWNlIG5leHQgZW52aXJvbm1lbnQgdmFyaWFibGUKICAgIHJlc3VsdCA9IHJlcGxhY2Vfc3RyX3JlYyhuZXdfc3RyMSwgZW52X21hcCwgYXJyX2tleXMsIGkgLSAxKQp9CgphbGxvd19lbnZfbWFwKHBfZW52X21hcCwgaV9lbnZfbWFwKSB7CiAgICBwcmludCgiYWxsb3dfZW52X21hcDogcF9lbnZfbWFwID0iLCBwX2Vudl9tYXApCiAgICBldmVyeSBlbnZfa2V5LCBlbnZfdmFsIGluIGlfZW52X21hcCB7CiAgICAgICAgcHJpbnQoImFsbG93X2VudjogZW52X2tleSA9IiwgZW52X2tleSwgImVudl92YWwgPSIsIGVudl92YWwpCiAgICAgICAgYWxsb3dfZW52X21hcF9lbnRyeShlbnZfa2V5LCBlbnZfdmFsLCBwX2Vudl9tYXApCiAgICB9CiAgICBwcmludCgiYWxsb3dfZW52X21hcDogdHJ1ZSIpCn0KCiMgQWxsb3cgZXhhY3QgbWF0Y2gKYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBpX3ZhbCA9PSBwX3ZhbAogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnk6IHRydWUiKQp9CgojIEFsbG93IHJlc291cmNlRmllbGRSZWYgdmFsdWVzIChlLmcuLCAibGltaXRzLmNwdSIpLgphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgICMgYSB2YXJpYWJsZSB3ZSBzaG91bGQgYmUgdmFsaWRhdGluZyB1c2luZyBhIHJlZ2V4IGZyb20gc2V0dGluZ3MKICAgIHBfdmFsID09ICIkKHZhbGlkYXRlLWZyb20tc2V0dGluZ3MpIgogICAgcmVnZXhfdmFsIDo9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuQ3JlYXRlQ29udGFpbmVyUmVxdWVzdC5hbGxvd19lbnZfcmVnZXhfbWFwW2tleV0KICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4X3ZhbCwgaV92YWwpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSAyOiB0cnVlIikKfQoKIyBBbGxvdyBub2RlLW5hbWUKYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChub2RlLW5hbWUpIgogICAgcmVnZXgubWF0Y2gocG9saWN5X2RhdGEuY29tbW9uLmRuc19zdWJkb21haW4gLCBpX3ZhbCkKICAgIHByaW50KCJhbGxvd19lbnZfbWFwX2VudHJ5IDM6IHRydWUiKQp9CgojIEFsbG93IGhvc3QtbmFtZQphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgIHBfdmFsID09ICIkKGhvc3QtbmFtZSkiCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24uZG5zX2xhYmVsICwgaV92YWwpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSA0OiB0cnVlIikKfQoKIyBBbGxvdyBwb2QtdWlkCmFsbG93X2Vudl9tYXBfZW50cnkoa2V5LCBpX3ZhbCwgcF9lbnZfbWFwKSB7CiAgICBwX3ZhbCA6PSBwX2Vudl9tYXBba2V5XQogICAgcF92YWwgPT0gIiQocG9kLXVpZCkiCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24ucG9kX3VpZCAsIGlfdmFsKQogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgNTogdHJ1ZSIpCn0KCiMgQWxsb3cgZmllbGRSZWYgImZpZWxkUGF0aDogc3RhdHVzLnBvZElQIiB2YWx1ZXMuCmFsbG93X2Vudl9tYXBfZW50cnkoa2V5LCBpX3ZhbCwgcF9lbnZfbWFwKSB7CiAgICBpc19pcChpX3ZhbCkKCiAgICBwX3ZhbCA6PSBwX2Vudl9tYXBba2V5XQogICAgcF92YXIgOj0gY29uY2F0KCI9IiwgW2tleSwgcF92YWxdKQogICAgYWxsb3dfcG9kX2lwX3ZhcihrZXksIHBfdmFyKQogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgNjogdHJ1ZSIpCn0KCiMgQWxsb3cgZmllbGRSZWYgImZpZWxkUGF0aDogc3RhdHVzLmhvc3RJUCIgdmFsdWVzLgphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgaXNfaXAoaV92YWwpCgogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgIHBfdmFyIDo9IGNvbmNhdCgiPSIsIFtrZXksIHBfdmFsXSkKICAgIGFsbG93X2hvc3RfaXBfdmFyKGtleSwgcF92YXIpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSA3OiB0cnVlIikKfQoKIyBNYXRjaCBpbnB1dCB3aXRoIG9uZSBvZiB0aGUgcG9saWN5IHZhcmlhYmxlcywgYWZ0ZXIgc3Vic3RpdHV0aW5nICQoc2FuZGJveC1uYW1lKS4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChzYW5kYm94LW5hbWUpIgogICAgc19uYW1lIDo9IGlucHV0LmJhc2UuT0NJLkFubm90YXRpb25zW1NfTkFNRV9LRVldCiAgICBwX3ZhcjIgOj0gcmVwbGFjZShwX3ZhbCwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHBfdmFyMiA9PSBpX3ZhbAogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgODogdHJ1ZSIpCn0KCiMgTWF0Y2ggaW5wdXQgd2l0aCBvbmUgb2YgdGhlIHBvbGljeSB2YXJpYWJsZXMsIGFmdGVyIHN1YnN0aXR1dGluZyAkKHNhbmRib3gtbmFtZXNwYWNlKS4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChzYW5kYm94LW5hbWVzcGFjZSkiCiAgICBzX25hbWVzcGFjZSA6PSBpbnB1dC5iYXNlLk9DSS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwX3ZhcjIgOj0gcmVwbGFjZShwX3ZhbCwgIiQoc2FuZGJveC1uYW1lc3BhY2UpIiwgc19uYW1lc3BhY2UpCiAgICBwX3ZhcjIgPT0gaV92YWwKICAgIHByaW50KCJhbGxvd19lbnZfbWFwX2VudHJ5IDk6IHRydWUiKQp9CgojIEFsbG93IGlucHV0IGVudiB2YXJpYWJsZXMgdGhhdCBtYXRjaCB3aXRoIGEgcmVxdWVzdF9kZWZhdWx0cyByZWdleC4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHNvbWUgcF9yZWdleDEgaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5DcmVhdGVDb250YWluZXJSZXF1ZXN0LmFsbG93X2Vudl9yZWdleAogICAgcF9yZWdleDIgOj0gcmVwbGFjZShwX3JlZ2V4MSwgIiQoaXB2NF9hKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcHY0X2EpCiAgICBwX3JlZ2V4MyA6PSByZXBsYWNlKHBfcmVnZXgyLCAiJChpcF9wKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcF9wKQogICAgcF9yZWdleDQgOj0gcmVwbGFjZShwX3JlZ2V4MywgIiQoc3ZjX25hbWUpIiwgcG9saWN5X2RhdGEuY29tbW9uLnN2Y19uYW1lKQogICAgcF9yZWdleDUgOj0gcmVwbGFjZShwX3JlZ2V4NCwgIiQoZG5zX2xhYmVsKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5kbnNfbGFiZWwpCgogICAgcmVzdWx0IDo9IGNvbmNhdCgiPSIsIFtrZXksIGlfdmFsXSkKICAgIHJlZ2V4Lm1hdGNoKHBfcmVnZXg1LCByZXN1bHQpCgogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgMTA6IHRydWUiKQp9CgpDcmVhdGVDb250YWluZXJSZXF1ZXN0Oj0gcmVzcCB7CiAgICBub3QgaW5wdXQuZW52X21hcAogICAgaV9wcm9jZXNzID0gaW5wdXQuT0NJLlByb2Nlc3MKICAgIHNfbmFtZSA9IGlucHV0Lk9DSS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBwX3Byb2Nlc3MgPSBwX2NvbnRhaW5lci5PQ0kuUHJvY2VzcwogICAgYWxsb3dfZGVwcmVjYXRlZF9hcmdzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUpCiAgICByZXNwID0gQ3JlYXRlQ29udGFpbmVyUmVxdWVzdENvbW1vbihpbnB1dCkKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0MjogdHJ1ZSIpCn0KCkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb24ocmVxKTo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgICMgQ2hlY2sgaWYgdGhlIGlucHV0IHJlcXVlc3Qgc2hvdWxkIGJlIHJlamVjdGVkIGV2ZW4gYmVmb3JlIGNoZWNraW5nIHRoZQogICAgIyBwb2xpY3lfZGF0YS5jb250YWluZXJzIGluZm9ybWF0aW9uLgogICAgYWxsb3dfY3JlYXRlX2NvbnRhaW5lcl9pbnB1dChyZXEpCgogICAgaV9vY2kgOj0gcmVxLk9DSQogICAgaV9zdG9yYWdlcyA6PSByZXEuc3RvcmFnZXMKICAgIGlfZGV2aWNlcyA6PSByZXEuZGV2aWNlcwoKICAgICMgYXJyYXkgb2YgcG9zc2libGUgc3RhdGUgb3BlcmF0aW9ucwogICAgb3BzX2J1aWxkZXIgOj0gW10KCiAgICAjIGNoZWNrIHNhbmRib3ggbmFtZQogICAgc2FuZGJveF9uYW1lID0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FX0tFWV0KICAgIGFkZF9zYW5kYm94X25hbWVfdG9fc3RhdGUgOj0gc3RhdGVfYWxsb3dzKCJzYW5kYm94X25hbWUiLCBzYW5kYm94X25hbWUpCiAgICBvcHNfYnVpbGRlcjEgOj0gY29uY2F0X29wX2lmX25vdF9udWxsKG9wc19idWlsZGVyLCBhZGRfc2FuZGJveF9uYW1lX3RvX3N0YXRlKQoKICAgICMgQ2hlY2sgaWYgYW55IGVsZW1lbnQgZnJvbSB0aGUgcG9saWN5X2RhdGEuY29udGFpbmVycyBhcnJheSBhbGxvd3MgdGhlIGlucHV0IHJlcXVlc3QuCiAgICBzb21lIHBfY29udGFpbmVyIGluIHBvbGljeV9kYXRhLmNvbnRhaW5lcnMKICAgIHByaW50KCI9PT09PT09PSBDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiB0cnlpbmcgbmV4dCBwb2xpY3kgY29udGFpbmVyIikKCiAgICBwX3BpZG5zIDo9IHBfY29udGFpbmVyLnNhbmRib3hfcGlkbnMKICAgIGlfcGlkbnMgOj0gcmVxLnNhbmRib3hfcGlkbnMKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiBwX3BpZG5zID0iLCBwX3BpZG5zLCAiaV9waWRucyA9IiwgaV9waWRucykKICAgIHBfcGlkbnMgPT0gaV9waWRucwoKICAgIHBfb2NpIDo9IHBfY29udGFpbmVyLk9DSQoKICAgICMgY2hlY2sgbmFtZXNwYWNlCiAgICBwX25hbWVzcGFjZSA6PSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBpX25hbWVzcGFjZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwcmludCAoIkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb246IHBfbmFtZXNwYWNlID0iLCBwX25hbWVzcGFjZSwgImlfbmFtZXNwYWNlID0iLCBpX25hbWVzcGFjZSkKICAgIGFkZF9uYW1lc3BhY2VfdG9fc3RhdGUgOj0gYWxsb3dfbmFtZXNwYWNlKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkKICAgIG9wc19idWlsZGVyMiA6PSBjb25jYXRfb3BfaWZfbm90X251bGwob3BzX2J1aWxkZXIxLCBhZGRfbmFtZXNwYWNlX3RvX3N0YXRlKQoKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiBwIFZlcnNpb24gPSIsIHBfb2NpLlZlcnNpb24sICJpIFZlcnNpb24gPSIsIGlfb2NpLlZlcnNpb24pCiAgICBwX29jaS5WZXJzaW9uID09IGlfb2NpLlZlcnNpb24KCiAgICBwcmludCgiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdENvbW1vbjogcCBSZWFkb25seSA9IiwgcF9vY2kuUm9vdC5SZWFkb25seSwgImkgUmVhZG9ubHkgPSIsIGlfb2NpLlJvb3QuUmVhZG9ubHkpCiAgICBwX29jaS5Sb290LlJlYWRvbmx5ID09IGlfb2NpLlJvb3QuUmVhZG9ubHkKCiAgICBhbGxvd19hbm5vKHBfb2NpLCBpX29jaSkKCiAgICBwX3N0b3JhZ2VzIDo9IHBfY29udGFpbmVyLnN0b3JhZ2VzCiAgICBhbGxvd19ieV9hbm5vKHBfb2NpLCBpX29jaSwgcF9zdG9yYWdlcywgaV9zdG9yYWdlcykKCiAgICBwX2RldmljZXMgOj0gcF9jb250YWluZXIuZGV2aWNlcwogICAgYWxsb3dfZGV2aWNlcyhwX2RldmljZXMsIGlfZGV2aWNlcykKCiAgICByZXQgOj0gYWxsb3dfbGludXgob3BzX2J1aWxkZXIyLCBwX29jaSwgaV9vY2kpCiAgICByZXQuYWxsb3dlZAoKICAgIG9wcyA6PSByZXQub3BzCgogICAgcHJpbnQoIkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb246IHRydWUiKQp9CgphbGxvd19jcmVhdGVfY29udGFpbmVyX2lucHV0KHJlcSkgewogICAgcHJpbnQoImFsbG93X2NyZWF0ZV9jb250YWluZXJfaW5wdXQ6IGlucHV0ID0iLCByZXEpCgogICAgY291bnQocmVxLnNoYXJlZF9tb3VudHMpID09IDAKICAgIGlzX251bGwocmVxLnN0cmluZ191c2VyKQoKICAgIGlfb2NpIDo9IHJlcS5PQ0kKICAgIGlzX251bGwoaV9vY2kuSG9va3MpCiAgICBpc19udWxsKGlfb2NpLlNvbGFyaXMpCiAgICBpc19udWxsKGlfb2NpLldpbmRvd3MpCgogICAgaV9saW51eCA6PSBpX29jaS5MaW51eAogICAgY291bnQoaV9saW51eC5HSURNYXBwaW5ncykgPT0gMAogICAgY291bnQoaV9saW51eC5Nb3VudExhYmVsKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlJlc291cmNlcy5EZXZpY2VzKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlJvb3Rmc1Byb3BhZ2F0aW9uKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlVJRE1hcHBpbmdzKSA9PSAwCiAgICBpc19udWxsKGlfbGludXguSW50ZWxSZHQpCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLkJsb2NrSU8pCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLk5ldHdvcmspCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLlBpZHMpCiAgICBpc19udWxsKGlfbGludXguU2VjY29tcCkKCiAgICBpX3Byb2Nlc3MgOj0gaV9vY2kuUHJvY2VzcwogICAgY291bnQoaV9wcm9jZXNzLlNlbGludXhMYWJlbCkgPT0gMAogICAgY291bnQoaV9wcm9jZXNzLlVzZXIuVXNlcm5hbWUpID09IDAKCiAgICBwcmludCgiYWxsb3dfY3JlYXRlX2NvbnRhaW5lcl9pbnB1dDogdHJ1ZSIpCn0KCmFsbG93X25hbWVzcGFjZShwX25hbWVzcGFjZSwgaV9uYW1lc3BhY2UpID0gYWRkX25hbWVzcGFjZSB7CiAgICBwX25hbWVzcGFjZSA9PSBpX25hbWVzcGFjZQogICAgYWRkX25hbWVzcGFjZSA6PSBudWxsCiAgICBwcmludCgiYWxsb3dfbmFtZXNwYWNlIDE6IGlucHV0IG5hbWVzcGFjZSBtYXRjaGVzIHBvbGljeSBkYXRhIikKfQoKYWxsb3dfbmFtZXNwYWNlKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkgPSBhZGRfbmFtZXNwYWNlIHsKICAgIHBfbmFtZXNwYWNlID09ICIiCiAgICBwcmludCgiYWxsb3dfbmFtZXNwYWNlIDI6IG5vIG5hbWVzcGFjZSBmb3VuZCBvbiBwb2xpY3kgZGF0YSIpCiAgICBhZGRfbmFtZXNwYWNlIDo9IHN0YXRlX2FsbG93cygibmFtZXNwYWNlIiwgaV9uYW1lc3BhY2UpCn0KCiMgdmFsdWUgaGFzbid0IGJlZW4gc2VlbiBiZWZvcmUsIHNhdmUgaXQgdG8gc3RhdGUKc3RhdGVfYWxsb3dzKGtleSwgdmFsdWUpID0gYWN0aW9uIHsKICBzdGF0ZSA6PSBnZXRfc3RhdGUoKQogIHByaW50KCJzdGF0ZV9hbGxvd3MgMTogc3RhdGVba2V5XSA9Iiwgc3RhdGVba2V5XSwgInZhbHVlID0iLCB2YWx1ZSkKICBub3Qgc3RhdGVba2V5XQogIHByaW50KCJzdGF0ZV9hbGxvd3MgMTogc2F2aW5nIHRvIHN0YXRlIGtleSA9Iiwga2V5LCAidmFsdWUgPSIsIHZhbHVlKQogIHBhdGggOj0gZ2V0X3N0YXRlX3BhdGgoa2V5KSAKICBhY3Rpb24gOj0gewogICAgIm9wIjogImFkZCIsCiAgICAicGF0aCI6IHBhdGgsIAogICAgInZhbHVlIjogdmFsdWUsCiAgfQp9CgojIHZhbHVlIG1hdGNoZXMgd2hhdCdzIGluIHN0YXRlLCBhbGxvdyBpdApzdGF0ZV9hbGxvd3Moa2V5LCB2YWx1ZSkgPSBhY3Rpb24gewogIHByaW50KCJzdGF0ZV9hbGxvd3MgMjogc3RhcnQiKQogIHN0YXRlIDo9IGdldF9zdGF0ZSgpCiAgcHJpbnQoInN0YXRlX2FsbG93cyAyOiBzdGF0ZVtrZXldID0iLCBzdGF0ZVtrZXldLCAidmFsdWUgPSIsIHZhbHVlKQogIHZhbHVlID09IHN0YXRlW2tleV0KICBwcmludCgic3RhdGVfYWxsb3dzIDI6IGZvdW5kIGtleSA9Iiwga2V5LCAidmFsdWUgPSIsIHZhbHVlLCAiIGluIHN0YXRlIikKICBhY3Rpb24gOj0gbnVsbAp9CgojIGhlbHBlciBmdW5jdGlvbnMgdG8gaW50ZXJhY3Qgd2l0aCB0aGUgc3RhdGUKZ2V0X3N0YXRlKCkgPSBzdGF0ZSB7CiAgc3RhdGUgOj0gZGF0YVsicHN0YXRlIl0KfQoKZ2V0X3N0YXRlX3ZhbChrZXkpID0gdmFsdWUgewogICAgc3RhdGUgOj0gZ2V0X3N0YXRlKCkKICAgIHZhbHVlIDo9IHN0YXRlW2tleV0KfQoKZ2V0X3N0YXRlX3BhdGgoa2V5KSA9IHBhdGggewogICAgIyBwcmVwZW5kICIvcHN0YXRlLyIgdG8ga2V5CiAgICBwYXRoIDo9IGNvbmNhdCgiLyIsIFsiL3BzdGF0ZSIsIGtleV0pCn0KCiMgSGVscGVyIGZ1bmN0aW9ucyB0byBjb25kaXRpb25hbGx5IGNvbmNhdGVuYXRlIG9wIGlzIG5vdCBudWxsCmNvbmNhdF9vcF9pZl9ub3RfbnVsbChvcHMsIG9wKSA9IHJlc3VsdCB7CiAgICBvcCA9PSBudWxsCiAgICByZXN1bHQgOj0gb3BzCn0KCmNvbmNhdF9vcF9pZl9ub3RfbnVsbChvcHMsIG9wKSA9IHJlc3VsdCB7CiAgICBvcCAhPSBudWxsCiAgICByZXN1bHQgOj0gYXJyYXkuY29uY2F0KG9wcywgW29wXSkKfQoKIyBSZWplY3QgdW5leHBlY3RlZCBhbm5vdGF0aW9ucy4KYWxsb3dfYW5ubyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19hbm5vIDE6IHN0YXJ0IikKCiAgICBub3QgaV9vY2kuQW5ub3RhdGlvbnMKCiAgICBwcmludCgiYWxsb3dfYW5ubyAxOiB0cnVlIikKfQphbGxvd19hbm5vKHBfb2NpLCBpX29jaSkgewogICAgcHJpbnQoImFsbG93X2Fubm8gMjogcCBBbm5vdGF0aW9ucyA9IiwgcF9vY2kuQW5ub3RhdGlvbnMpCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiBpIEFubm90YXRpb25zID0iLCBpX29jaS5Bbm5vdGF0aW9ucykKCiAgICBpX2tleXMgOj0gb2JqZWN0LmtleXMoaV9vY2kuQW5ub3RhdGlvbnMpCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiBpIGtleXMgPSIsIGlfa2V5cykKCiAgICBldmVyeSBpX2tleSBpbiBpX2tleXMgewogICAgICAgIGFsbG93X2Fubm9fa2V5KGlfa2V5LCBwX29jaSkKICAgIH0KCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiB0cnVlIikKfQoKYWxsb3dfYW5ub19rZXkoaV9rZXksIHBfb2NpKSB7CiAgICBwcmludCgiYWxsb3dfYW5ub19rZXkgMTogaSBrZXkgPSIsIGlfa2V5KQoKICAgIHN0YXJ0c3dpdGgoaV9rZXksICJpby5rdWJlcm5ldGVzLmNyaS4iKQoKICAgIHByaW50KCJhbGxvd19hbm5vX2tleSAxOiB0cnVlIikKfQphbGxvd19hbm5vX2tleShpX2tleSwgcF9vY2kpIHsKICAgIHByaW50KCJhbGxvd19hbm5vX2tleSAyOiBpIGtleSA9IiwgaV9rZXkpCgogICAgc29tZSBwX2tleSwgXyBpbiBwX29jaS5Bbm5vdGF0aW9ucwogICAgcF9rZXkgPT0gaV9rZXkKCiAgICBwcmludCgiYWxsb3dfYW5ub19rZXkgMjogdHJ1ZSIpCn0KCiMgR2V0IHRoZSB2YWx1ZSBvZiB0aGUgU19OQU1FX0tFWSBhbm5vdGF0aW9uIGFuZAojIGNvcnJlbGF0ZSBpdCB3aXRoIG90aGVyIGFubm90YXRpb25zIGFuZCBwcm9jZXNzIGZpZWxkcy4KYWxsb3dfYnlfYW5ubyhwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpIHsKICAgIHByaW50KCJhbGxvd19ieV9hbm5vIDE6IHN0YXJ0IikKCiAgICBub3QgcF9vY2kuQW5ub3RhdGlvbnNbU19OQU1FX0tFWV0KCiAgICBpX3NfbmFtZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMTogaV9zX25hbWUgPSIsIGlfc19uYW1lKQoKICAgIGlfc19uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FU1BBQ0VfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMTogaV9zX25hbWVzcGFjZSA9IiwgaV9zX25hbWVzcGFjZSkKCiAgICBhbGxvd19ieV9zYW5kYm94X25hbWUocF9vY2ksIGlfb2NpLCBwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBpX3NfbmFtZSwgaV9zX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfYnlfYW5ubyAxOiB0cnVlIikKfQphbGxvd19ieV9hbm5vKHBfb2NpLCBpX29jaSwgcF9zdG9yYWdlcywgaV9zdG9yYWdlcykgewogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMjogc3RhcnQiKQoKICAgIHBfc19uYW1lIDo9IHBfb2NpLkFubm90YXRpb25zW1NfTkFNRV9LRVldCiAgICBpX3NfbmFtZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMjogaV9zX25hbWUgPSIsIGlfc19uYW1lLCAicF9zX25hbWUgPSIsIHBfc19uYW1lKQoKICAgIGFsbG93X3NhbmRib3hfbmFtZShwX3NfbmFtZSwgaV9zX25hbWUpCgogICAgaV9zX25hbWVzcGFjZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwcmludCgiYWxsb3dfYnlfYW5ubyAyOiBpX3NfbmFtZXNwYWNlID0iLCBpX3NfbmFtZXNwYWNlKQoKICAgIGFsbG93X2J5X3NhbmRib3hfbmFtZShwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMsIGlfc19uYW1lLCBpX3NfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd19ieV9hbm5vIDI6IHRydWUiKQp9CgphbGxvd19ieV9zYW5kYm94X25hbWUocF9vY2ksIGlfb2NpLCBwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfYnlfc2FuZGJveF9uYW1lOiBzdGFydCIpCgogICAgaV9uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FU1BBQ0VfS0VZXQoKICAgIGFsbG93X2J5X2NvbnRhaW5lcl90eXBlcyhwX29jaSwgaV9vY2ksIHNfbmFtZSwgaV9uYW1lc3BhY2UpCiAgICBhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZChwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpCiAgICBhbGxvd19wcm9jZXNzKHBfb2NpLlByb2Nlc3MsIGlfb2NpLlByb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpCgogICAgcHJpbnQoImFsbG93X2J5X3NhbmRib3hfbmFtZTogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfbmFtZShwX3NfbmFtZSwgaV9zX25hbWUpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X25hbWU6IHN0YXJ0IikKICAgIHJlZ2V4Lm1hdGNoKHBfc19uYW1lLCBpX3NfbmFtZSkKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9uYW1lOiB0cnVlIikKfQoKIyBDaGVjayB0aGF0IHRoZSAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLXR5cGUiIGFuZAojICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIiBhbm5vdGF0aW9ucyBkZXNpZ25hdGUgdGhlCiMgZXhwZWN0ZWQgdHlwZSAtIGVpdGhlciBhICJzYW5kYm94IiBvciBhICJjb250YWluZXIiLiBUaGVuLCB2YWxpZGF0ZQojIG90aGVyIGFubm90YXRpb25zIGJhc2VkIG9uIHRoZSBhY3R1YWwgInNhbmRib3giIG9yICJjb250YWluZXIiIHZhbHVlCiMgZnJvbSB0aGUgaW5wdXQgY29udGFpbmVyLgphbGxvd19ieV9jb250YWluZXJfdHlwZXMocF9vY2ksIGlfb2NpLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfYnlfY29udGFpbmVyX3R5cGVzOiBjaGVja2luZyBpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSIpCgogICAgY190eXBlIDo9ICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSIKICAgIAogICAgcF9jcmlfdHlwZSA6PSBwX29jaS5Bbm5vdGF0aW9uc1tjX3R5cGVdCiAgICBpX2NyaV90eXBlIDo9IGlfb2NpLkFubm90YXRpb25zW2NfdHlwZV0KICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZXM6IHBfY3JpX3R5cGUgPSIsIHBfY3JpX3R5cGUsICJpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgcF9jcmlfdHlwZSA9PSBpX2NyaV90eXBlCgogICAgYWxsb3dfYnlfY29udGFpbmVyX3R5cGUoaV9jcmlfdHlwZSwgcF9vY2ksIGlfb2NpLCBzX25hbWUsIHNfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZXM6IHRydWUiKQp9CgphbGxvd19ieV9jb250YWluZXJfdHlwZShpX2NyaV90eXBlLCBwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAxOiBpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgaV9jcmlfdHlwZSA9PSAic2FuZGJveCIKCiAgICBpX2thdGFfdHlwZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1siaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5jb250YWluZXJfdHlwZSJdCiAgICBwcmludCgiYWxsb3dfYnlfY29udGFpbmVyX3R5cGUgMTogaV9rYXRhX3R5cGUgPSIsIGlfa2F0YV90eXBlKQogICAgaV9rYXRhX3R5cGUgPT0gInBvZF9zYW5kYm94IgoKICAgIGFsbG93X3NhbmRib3hfY29udGFpbmVyX25hbWUocF9vY2ksIGlfb2NpKQogICAgYWxsb3dfc2FuZGJveF9uZXRfbmFtZXNwYWNlKHBfb2NpLCBpX29jaSkKICAgIGFsbG93X3NhbmRib3hfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpCgogICAgcHJpbnQoImFsbG93X2J5X2NvbnRhaW5lcl90eXBlIDE6IHRydWUiKQp9CgphbGxvd19ieV9jb250YWluZXJfdHlwZShpX2NyaV90eXBlLCBwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiBpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgaV9jcmlfdHlwZSA9PSAiY29udGFpbmVyIgoKICAgIGlfa2F0YV90eXBlIDo9IGlfb2NpLkFubm90YXRpb25zWyJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIl0KICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiBpX2thdGFfdHlwZSA9IiwgaV9rYXRhX3R5cGUpCiAgICBpX2thdGFfdHlwZSA9PSAicG9kX2NvbnRhaW5lciIKCiAgICBhbGxvd19jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpCiAgICBhbGxvd19uZXRfbmFtZXNwYWNlKHBfb2NpLCBpX29jaSkKICAgIGFsbG93X2xvZ19kaXJlY3RvcnkocF9vY2ksIGlfb2NpKQoKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiB0cnVlIikKfQoKIyAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLW5hbWUiIGFubm90YXRpb24KYWxsb3dfc2FuZGJveF9jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X2NvbnRhaW5lcl9uYW1lOiBzdGFydCIpCgogICAgY29udGFpbmVyX2Fubm90YXRpb25fbWlzc2luZyhwX29jaSwgaV9vY2ksICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItbmFtZSIpCgogICAgcHJpbnQoImFsbG93X3NhbmRib3hfY29udGFpbmVyX25hbWU6IHRydWUiKQp9CgphbGxvd19jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19jb250YWluZXJfbmFtZTogc3RhcnQiKQoKICAgIGFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uKHBfb2NpLCBpX29jaSwgImlvLmt1YmVybmV0ZXMuY3JpLmNvbnRhaW5lci1uYW1lIikKCiAgICBwcmludCgiYWxsb3dfY29udGFpbmVyX25hbWU6IHRydWUiKQp9Cgpjb250YWluZXJfYW5ub3RhdGlvbl9taXNzaW5nKHBfb2NpLCBpX29jaSwga2V5KSB7CiAgICBwcmludCgiY29udGFpbmVyX2Fubm90YXRpb25fbWlzc2luZzoiLCBrZXkpCgogICAgbm90IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIG5vdCBpX29jaS5Bbm5vdGF0aW9uc1trZXldCgogICAgcHJpbnQoImNvbnRhaW5lcl9hbm5vdGF0aW9uX21pc3Npbmc6IHRydWUiKQp9CgphbGxvd19jb250YWluZXJfYW5ub3RhdGlvbihwX29jaSwgaV9vY2ksIGtleSkgewogICAgcHJpbnQoImFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uOiBrZXkgPSIsIGtleSkKCiAgICBwX3ZhbHVlIDo9IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIGlfdmFsdWUgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgcHJpbnQoImFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uOiBwX3ZhbHVlID0iLCBwX3ZhbHVlLCAiaV92YWx1ZSA9IiwgaV92YWx1ZSkKCiAgICBwX3ZhbHVlID09IGlfdmFsdWUKCiAgICBwcmludCgiYWxsb3dfY29udGFpbmVyX2Fubm90YXRpb246IHRydWUiKQp9CgojICJuZXJkY3RsL25ldHdvcmstbmFtZXNwYWNlIiBhbm5vdGF0aW9uCmFsbG93X3NhbmRib3hfbmV0X25hbWVzcGFjZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X25ldF9uYW1lc3BhY2U6IHN0YXJ0IikKCiAgICBrZXkgOj0gIm5lcmRjdGwvbmV0d29yay1uYW1lc3BhY2UiCgogICAgcF9uYW1lc3BhY2UgOj0gcF9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgaV9uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgcHJpbnQoImFsbG93X3NhbmRib3hfbmV0X25hbWVzcGFjZTogcF9uYW1lc3BhY2UgPSIsIHBfbmFtZXNwYWNlLCAiaV9uYW1lc3BhY2UgPSIsIGlfbmFtZXNwYWNlKQoKICAgIHJlZ2V4Lm1hdGNoKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9uZXRfbmFtZXNwYWNlOiB0cnVlIikKfQoKYWxsb3dfbmV0X25hbWVzcGFjZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19uZXRfbmFtZXNwYWNlOiBzdGFydCIpCgogICAga2V5IDo9ICJuZXJkY3RsL25ldHdvcmstbmFtZXNwYWNlIgoKICAgIG5vdCBwX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICBub3QgaV9vY2kuQW5ub3RhdGlvbnNba2V5XQoKICAgIHByaW50KCJhbGxvd19uZXRfbmFtZXNwYWNlOiB0cnVlIikKfQoKIyAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1sb2ctZGlyZWN0b3J5IiBhbm5vdGF0aW9uCmFsbG93X3NhbmRib3hfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X2xvZ19kaXJlY3Rvcnk6IHN0YXJ0IikKCiAgICBrZXkgOj0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbG9nLWRpcmVjdG9yeSIKCiAgICBwX2RpciA6PSBwX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICByZWdleDEgOj0gcmVwbGFjZShwX2RpciwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHJlZ2V4MiA6PSByZXBsYWNlKHJlZ2V4MSwgIiQoc2FuZGJveC1uYW1lc3BhY2UpIiwgc19uYW1lc3BhY2UpCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiByZWdleDIgPSIsIHJlZ2V4MikKCiAgICBpX2RpciA6PSBpX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiBpX2RpciA9IiwgaV9kaXIpCgogICAgcmVnZXgubWF0Y2gocmVnZXgyLCBpX2RpcikKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiB0cnVlIikKfQoKYWxsb3dfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19sb2dfZGlyZWN0b3J5OiBzdGFydCIpCgogICAga2V5IDo9ICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWxvZy1kaXJlY3RvcnkiCgogICAgbm90IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIG5vdCBpX29jaS5Bbm5vdGF0aW9uc1trZXldCgogICAgcHJpbnQoImFsbG93X2xvZ19kaXJlY3Rvcnk6IHRydWUiKQp9CgphbGxvd19kZXZpY2VzKHBfZGV2aWNlcywgaV9kZXZpY2VzKSB7CiAgICBwcmludCgiYWxsb3dfZGV2aWNlczogc3RhcnQiKQogICAgZXZlcnkgaV9kZXZpY2UgaW4gaV9kZXZpY2VzIHsKICAgICAgICBwcmludCgiYWxsb3dfZGV2aWNlczogaV9kZXZpY2UgPSIsIGlfZGV2aWNlKQogICAgICAgIHNvbWUgcF9kZXZpY2UgaW4gcF9kZXZpY2VzCiAgICAgICAgcF9kZXZpY2UuY29udGFpbmVyX3BhdGggPT0gaV9kZXZpY2UuY29udGFpbmVyX3BhdGgKICAgIH0KICAgIHByaW50KCJhbGxvd19kZXZpY2VzOiB0cnVlIikKfQoKYWxsb3dfbGludXgoc3RhdGVfb3BzLCBwX29jaSwgaV9vY2kpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIHBfbmFtZXNwYWNlcyA6PSBwX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbGludXg6IHAgbmFtZXNwYWNlcyA9IiwgcF9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlcyA6PSBpX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbGludXg6IGkgbmFtZXNwYWNlcyA9IiwgaV9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlX3dpdGhvdXRfbmV0d29yayA6PSBbb2JqIHwgb2JqIDo9IGlfbmFtZXNwYWNlc1tfXTsgb2JqLlR5cGUgIT0gIm5ldHdvcmsiXQoKICAgIHByaW50KCJhbGxvd19saW51eDogaV9uYW1lc3BhY2Vfd2l0aG91dF9uZXR3b3JrID0iLCBpX25hbWVzcGFjZV93aXRob3V0X25ldHdvcmspCgogICAgcF9uYW1lc3BhY2VzID09IGlfbmFtZXNwYWNlX3dpdGhvdXRfbmV0d29yawoKICAgIGFsbG93X21hc2tlZF9wYXRocyhwX29jaSwgaV9vY2kpCiAgICBhbGxvd19yZWFkb25seV9wYXRocyhwX29jaSwgaV9vY2kpCiAgICBhbGxvd19saW51eF9kZXZpY2VzKHBfb2NpLkxpbnV4LkRldmljZXMsIGlfb2NpLkxpbnV4LkRldmljZXMpCiAgICBhbGxvd19saW51eF9zeXNjdGwocF9vY2kuTGludXgsIGlfb2NpLkxpbnV4KQogICAgcmV0IDo9IGFsbG93X25ldHdvcmtfbmFtZXNwYWNlX3N0YXJ0KHN0YXRlX29wcywgcF9vY2ksIGlfb2NpKQogICAgcmV0LmFsbG93ZWQKCiAgICBvcHMgOj0gcmV0Lm9wcwoKICAgIHByaW50KCJhbGxvd19saW51eDogdHJ1ZSIpCn0KCiMgUmV0cmlldmUgdGhlICJuZXR3b3JrIiBuYW1lc3BhY2UgZnJvbSB0aGUgaW5wdXQgZGF0YSBhbmQgcGFzcyBpdCBvbiBmb3IgdGhlCiMgbmV0d29yayBuYW1lc3BhY2UgcG9saWN5IGNoZWNrcy4KYWxsb3dfbmV0d29ya19uYW1lc3BhY2Vfc3RhcnQoc3RhdGVfb3BzLCBwX29jaSwgaV9vY2kpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIHByaW50KCJhbGxvd19uZXR3b3JrX25hbWVzcGFjZSBzdGFydDogc3RhcnQiKQoKICAgIHBfbmFtZXNwYWNlcyA6PSBwX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IHAgbmFtZXNwYWNlcyA9IiwgcF9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlcyA6PSBpX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IGkgbmFtZXNwYWNlcyA9IiwgaV9uYW1lc3BhY2VzKQoKICAgICMgUmV0dXJuIHBhdGggb2YgdGhlICJuZXR3b3JrIiBuYW1lc3BhY2UKICAgIG5ldHdvcmtfbnMgOj0gW29iaiB8IG9iaiA6PSBpX25hbWVzcGFjZXNbX107IG9iai5UeXBlID09ICJuZXR3b3JrIl0KCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IG5ldHdvcmtfbnMgPSIsIG5ldHdvcmtfbnMpCgogICAgcmV0IDo9IGFsbG93X25ldHdvcmtfbmFtZXNwYWNlKHN0YXRlX29wcywgbmV0d29ya19ucykKICAgIHJldC5hbGxvd2VkCgogICAgb3BzIDo9IHJldC5vcHMKfQoKIyBUaGlzIHJ1bGUgaXMgd2hlbiB0aGVyZSdzIG5vIG5ldHdvcmsgbmFtZXNwYWNlIGluIHRoZSBpbnB1dCBkYXRhLgphbGxvd19uZXR3b3JrX25hbWVzcGFjZShzdGF0ZV9vcHMsIG5ldHdvcmtfbnMpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIGNvdW50KG5ldHdvcmtfbnMpID09IDAKCiAgICBuZXR3b3JrX25zX3BhdGggPSAiIgoKICAgIGFkZF9uZXR3b3JrX25hbWVzcGFjZV90b19zdGF0ZSA6PSBzdGF0ZV9hbGxvd3MoIm5ldHdvcmtfbmFtZXNwYWNlIiwgbmV0d29ya19uc19wYXRoKQogICAgb3BzIDo9IGNvbmNhdF9vcF9pZl9ub3RfbnVsbChzdGF0ZV9vcHMsIGFkZF9uZXR3b3JrX25hbWVzcGFjZV90b19zdGF0ZSkKCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2UgMTogdHJ1ZSIpCn0KCiMgVGhpcyBydWxlIGlzIHdoZW4gdGhlcmUncyBleGFjdGx5IG9uZSBuZXR3b3JrIG5hbWVzcGFjZSBpbiB0aGUgaW5wdXQgZGF0YS4KYWxsb3dfbmV0d29ya19uYW1lc3BhY2Uoc3RhdGVfb3BzLCBuZXR3b3JrX25zKSA6PSB7Im9wcyI6IG9wcywgImFsbG93ZWQiOiB0cnVlfSB7CiAgICBjb3VudChuZXR3b3JrX25zKSA9PSAxCgogICAgYWRkX25ldHdvcmtfbmFtZXNwYWNlX3RvX3N0YXRlIDo9IHN0YXRlX2FsbG93cygibmV0d29ya19uYW1lc3BhY2UiLCBuZXR3b3JrX25zWzBdLlBhdGgpCiAgICBvcHMgOj0gY29uY2F0X29wX2lmX25vdF9udWxsKHN0YXRlX29wcywgYWRkX25ldHdvcmtfbmFtZXNwYWNlX3RvX3N0YXRlKQoKICAgIHByaW50KCJhbGxvd19uZXR3b3JrX25hbWVzcGFjZSAyOiB0cnVlIikKfQoKYWxsb3dfbWFza2VkX3BhdGhzKHBfb2NpLCBpX29jaSkgewogICAgcF9wYXRocyA6PSBwX29jaS5MaW51eC5NYXNrZWRQYXRocwogICAgcHJpbnQoImFsbG93X21hc2tlZF9wYXRocyAxOiBwX3BhdGhzID0iLCBwX3BhdGhzKQoKICAgIGlfcGF0aHMgOj0gaV9vY2kuTGludXguTWFza2VkUGF0aHMKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aHMgMTogaV9wYXRocyA9IiwgaV9wYXRocykKCiAgICBhbGxvd19tYXNrZWRfcGF0aHNfYXJyYXkocF9wYXRocywgaV9wYXRocykKCiAgICBwcmludCgiYWxsb3dfbWFza2VkX3BhdGhzIDE6IHRydWUiKQp9CmFsbG93X21hc2tlZF9wYXRocyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aHMgMjogc3RhcnQiKQoKICAgIG5vdCBwX29jaS5MaW51eC5NYXNrZWRQYXRocwogICAgbm90IGlfb2NpLkxpbnV4Lk1hc2tlZFBhdGhzCgogICAgcHJpbnQoImFsbG93X21hc2tlZF9wYXRocyAyOiB0cnVlIikKfQoKIyBBbGwgdGhlIHBvbGljeSBtYXNrZWQgcGF0aHMgbXVzdCBiZSBtYXNrZWQgaW4gdGhlIGlucHV0IGRhdGEgdG9vLgojIElucHV0IGlzIGFsbG93ZWQgdG8gaGF2ZSBtb3JlIG1hc2tlZCBwYXRocyB0aGFuIHRoZSBwb2xpY3kuCmFsbG93X21hc2tlZF9wYXRoc19hcnJheShwX2FycmF5LCBpX2FycmF5KSB7CiAgICBldmVyeSBwX2VsZW0gaW4gcF9hcnJheSB7CiAgICAgICAgYWxsb3dfbWFza2VkX3BhdGgocF9lbGVtLCBpX2FycmF5KQogICAgfQp9CgphbGxvd19tYXNrZWRfcGF0aChwX2VsZW0sIGlfYXJyYXkpIHsKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aDogcF9lbGVtID0iLCBwX2VsZW0pCgogICAgc29tZSBpX2VsZW0gaW4gaV9hcnJheQogICAgcF9lbGVtID09IGlfZWxlbQoKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aDogdHJ1ZSIpCn0KCmFsbG93X3JlYWRvbmx5X3BhdGhzKHBfb2NpLCBpX29jaSkgewogICAgcF9wYXRocyA6PSBwX29jaS5MaW51eC5SZWFkb25seVBhdGhzCiAgICBwcmludCgiYWxsb3dfcmVhZG9ubHlfcGF0aHMgMTogcF9wYXRocyA9IiwgcF9wYXRocykKCiAgICBpX3BhdGhzIDo9IGlfb2NpLkxpbnV4LlJlYWRvbmx5UGF0aHMKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAxOiBpX3BhdGhzID0iLCBpX3BhdGhzKQoKICAgIGFsbG93X3JlYWRvbmx5X3BhdGhzX2FycmF5KHBfcGF0aHMsIGlfcGF0aHMsIGlfb2NpLkxpbnV4Lk1hc2tlZFBhdGhzKQoKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAxOiB0cnVlIikKfQphbGxvd19yZWFkb25seV9wYXRocyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAyOiBzdGFydCIpCgogICAgbm90IHBfb2NpLkxpbnV4LlJlYWRvbmx5UGF0aHMKICAgIG5vdCBpX29jaS5MaW51eC5SZWFkb25seVBhdGhzCgogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGhzIDI6IHRydWUiKQp9CgojIEFsbCB0aGUgcG9saWN5IHJlYWRvbmx5IHBhdGhzIG11c3QgYmUgZWl0aGVyOgojIC0gUHJlc2VudCBpbiB0aGUgaW5wdXQgcmVhZG9ubHkgcGF0aHMsIG9yCiMgLSBQcmVzZW50IGluIHRoZSBpbnB1dCBtYXNrZWQgcGF0aHMuCiMgSW5wdXQgaXMgYWxsb3dlZCB0byBoYXZlIG1vcmUgcmVhZG9ubHkgcGF0aHMgdGhhbiB0aGUgcG9saWN5LgphbGxvd19yZWFkb25seV9wYXRoc19hcnJheShwX2FycmF5LCBpX2FycmF5LCBtYXNrZWRfcGF0aHMpIHsKICAgIGV2ZXJ5IHBfZWxlbSBpbiBwX2FycmF5IHsKICAgICAgICBhbGxvd19yZWFkb25seV9wYXRoKHBfZWxlbSwgaV9hcnJheSwgbWFza2VkX3BhdGhzKQogICAgfQp9CgphbGxvd19yZWFkb25seV9wYXRoKHBfZWxlbSwgaV9hcnJheSwgbWFza2VkX3BhdGhzKSB7CiAgICBwcmludCgiYWxsb3dfcmVhZG9ubHlfcGF0aCAxOiBwX2VsZW0gPSIsIHBfZWxlbSkKCiAgICBzb21lIGlfZWxlbSBpbiBpX2FycmF5CiAgICBwX2VsZW0gPT0gaV9lbGVtCgogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGggMTogdHJ1ZSIpCn0KYWxsb3dfcmVhZG9ubHlfcGF0aChwX2VsZW0sIGlfYXJyYXksIG1hc2tlZF9wYXRocykgewogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGggMjogcF9lbGVtID0iLCBwX2VsZW0pCgogICAgc29tZSBpX21hc2tlZCBpbiBtYXNrZWRfcGF0aHMKICAgIHBfZWxlbSA9PSBpX21hc2tlZAoKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRoIDI6IHRydWUiKQp9CgphbGxvd19saW51eF9kZXZpY2VzKHBfZGV2aWNlcywgaV9kZXZpY2VzKSB7CiAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogc3RhcnQiKQogICAgZXZlcnkgaV9kZXZpY2UgaW4gaV9kZXZpY2VzIHsKICAgICAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogaV9kZXZpY2UgPSIsIGlfZGV2aWNlKQogICAgICAgIHNvbWUgcF9kZXZpY2UgaW4gcF9kZXZpY2VzCiAgICAgICAgaV9kZXZpY2UuUGF0aCA9PSBwX2RldmljZS5QYXRoCiAgICB9CiAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogdHJ1ZSIpCn0KCmFsbG93X2xpbnV4X3N5c2N0bChwX2xpbnV4LCBpX2xpbnV4KSB7CiAgICBwcmludCgiYWxsb3dfbGludXhfc3lzY3RsIDE6IHN0YXJ0IikKICAgIG5vdCBpX2xpbnV4LlN5c2N0bAogICAgcHJpbnQoImFsbG93X2xpbnV4X3N5c2N0bCAxOiB0cnVlIikKfQoKYWxsb3dfbGludXhfc3lzY3RsKHBfbGludXgsIGlfbGludXgpIHsKICAgIHByaW50KCJhbGxvd19saW51eF9zeXNjdGwgMjogc3RhcnQiKQogICAgcF9zeXNjdGwgOj0gcF9saW51eC5TeXNjdGwKICAgIGlfc3lzY3RsIDo9IGlfbGludXguU3lzY3RsCiAgICBldmVyeSBpX25hbWUsIGlfdmFsIGluIGlfc3lzY3RsIHsKICAgICAgICBwcmludCgiYWxsb3dfbGludXhfc3lzY3RsIDI6IGlfbmFtZSA9IiwgaV9uYW1lLCAiaV92YWwgPSIsIGlfdmFsKQogICAgICAgIHBfc3lzY3RsW2lfbmFtZV0gPT0gaV92YWwKICAgIH0KICAgIHByaW50KCJhbGxvd19saW51eF9zeXNjdGwgMjogdHJ1ZSIpCn0KCiMgQ2hlY2sgdGhlIGNvbnNpc3RlbmN5IG9mIHRoZSBpbnB1dCAiaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5idW5kbGVfcGF0aCIKIyBhbmQgaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCIgdmFsdWVzIHdpdGggb3RoZXIgZmllbGRzLgphbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZChwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpIHsKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogc3RhcnQiKQoKICAgIGJ1bmRsZV9wYXRoIDo9IGlfb2NpLkFubm90YXRpb25zWyJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmJ1bmRsZV9wYXRoIl0KICAgIGJ1bmRsZV9pZCA6PSByZXBsYWNlKGJ1bmRsZV9wYXRoLCAiL3J1bi9jb250YWluZXJkL2lvLmNvbnRhaW5lcmQucnVudGltZS52Mi50YXNrL2s4cy5pby8iLCAiIikKCiAgICBidW5kbGVfaWRfZm9ybWF0IDo9IGNvbmNhdCgiIiwgWyJeIiwgQlVORExFX0lELCAiJCJdKQogICAgcmVnZXgubWF0Y2goYnVuZGxlX2lkX2Zvcm1hdCwgYnVuZGxlX2lkKQoKICAgIGtleSA6PSAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCIKCiAgICBwX3JlZ2V4IDo9IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIHNhbmRib3hfaWQgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQoKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogc2FuZGJveF9pZCA9Iiwgc2FuZGJveF9pZCwgInJlZ2V4ID0iLCBwX3JlZ2V4KQogICAgcmVnZXgubWF0Y2gocF9yZWdleCwgc2FuZGJveF9pZCkKCiAgICBhbGxvd19yb290X3BhdGgocF9vY2ksIGlfb2NpLCBidW5kbGVfaWQpCgogICAgZXZlcnkgaV9tb3VudCBpbiBpX29jaS5Nb3VudHMgewogICAgICAgIGFsbG93X21vdW50KHBfb2NpLCBpX21vdW50LCBpX3N0b3JhZ2VzLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpCiAgICB9CgogICAgYWxsb3dfc3RvcmFnZXMocF9zdG9yYWdlcywgaV9zdG9yYWdlcywgYnVuZGxlX2lkLCBzYW5kYm94X2lkKQoKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogdHJ1ZSIpCn0KCmFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHBfcHJvY2VzcyA9IiwgcF9wcm9jZXNzKQogICAgcHJpbnQoImFsbG93X3Byb2Nlc3NfY29tbW9uOiBpX3Byb2Nlc3MgPSAiLCBpX3Byb2Nlc3MpCiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHNfbmFtZSA9Iiwgc19uYW1lKQoKICAgIHBfcHJvY2Vzcy5Dd2QgPT0gaV9wcm9jZXNzLkN3ZAogICAgcF9wcm9jZXNzLk5vTmV3UHJpdmlsZWdlcyA9PSBpX3Byb2Nlc3MuTm9OZXdQcml2aWxlZ2VzCgogICAgYWxsb3dfdXNlcihwX3Byb2Nlc3MsIGlfcHJvY2VzcykKICAgIGFsbG93X2VudihwX3Byb2Nlc3MsIGlfcHJvY2Vzcywgc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHRydWUiKQp9CgojIENvbXBhcmUgdGhlIE9DSSBQcm9jZXNzIGZpZWxkIG9mIGEgcG9saWN5IGNvbnRhaW5lciB3aXRoIHRoZSBpbnB1dCBPQ0kgUHJvY2VzcyBmcm9tIGEgQ3JlYXRlQ29udGFpbmVyUmVxdWVzdAphbGxvd19wcm9jZXNzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfcHJvY2Vzczogc3RhcnQiKQoKICAgIGFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgYWxsb3dfY2FwcyhwX3Byb2Nlc3MuQ2FwYWJpbGl0aWVzLCBpX3Byb2Nlc3MuQ2FwYWJpbGl0aWVzKQogICAgcF9wcm9jZXNzLlRlcm1pbmFsID09IGlfcHJvY2Vzcy5UZXJtaW5hbAoKICAgIHByaW50KCJhbGxvd19wcm9jZXNzOiB0cnVlIikKfQoKIyBDb21wYXJlIHRoZSBPQ0kgUHJvY2VzcyBmaWVsZCBvZiBhIHBvbGljeSBjb250YWluZXIgd2l0aCB0aGUgaW5wdXQgcHJvY2VzcyBmaWVsZCBmcm9tIEV4ZWNQcm9jZXNzUmVxdWVzdAphbGxvd19pbnRlcmFjdGl2ZV9wcm9jZXNzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfaW50ZXJhY3RpdmVfcHJvY2Vzczogc3RhcnQiKQoKICAgIGFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgYWxsb3dfZXhlY19jYXBzKGlfcHJvY2Vzcy5DYXBhYmlsaXRpZXMpCgogICAgIyBUaGVzZSBhcmUgY29tbWFuZHMgZW5hYmxlZCB1c2luZyBFeGVjUHJvY2Vzc1JlcXVlc3QgY29tbWFuZHMgYW5kL29yIHJlZ2V4IGZyb20gdGhlIHNldHRpbmdzIGZpbGUuCiAgICAjIFRoZXkgY2FuIGJlIGV4ZWN1dGVkIGludGVyYWN0aXZlbHkgc28gYWxsb3cgdGhlbSB0byB1c2UgYW55IHZhbHVlIGZvciBpX3Byb2Nlc3MuVGVybWluYWwuCgogICAgcHJpbnQoImFsbG93X2ludGVyYWN0aXZlX3Byb2Nlc3M6IHRydWUiKQp9CgojIENvbXBhcmUgdGhlIE9DSSBQcm9jZXNzIGZpZWxkIG9mIGEgcG9saWN5IGNvbnRhaW5lciB3aXRoIHRoZSBpbnB1dCBwcm9jZXNzIGZpZWxkIGZyb20gRXhlY1Byb2Nlc3NSZXF1ZXN0CmFsbG93X3Byb2JlX3Byb2Nlc3MocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19wcm9iZV9wcm9jZXNzOiBzdGFydCIpCgogICAgYWxsb3dfcHJvY2Vzc19jb21tb24ocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpCiAgICBhbGxvd19leGVjX2NhcHMoaV9wcm9jZXNzLkNhcGFiaWxpdGllcykKICAgIHBfcHJvY2Vzcy5UZXJtaW5hbCA9PSBpX3Byb2Nlc3MuVGVybWluYWwKCiAgICBwcmludCgiYWxsb3dfcHJvYmVfcHJvY2VzczogdHJ1ZSIpCn0KCmFsbG93X3VzZXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MpIHsKICAgIHBfdXNlciA6PSBwX3Byb2Nlc3MuVXNlcgogICAgaV91c2VyIDo9IGlfcHJvY2Vzcy5Vc2VyCgogICAgcHJpbnQoImFsbG93X3VzZXI6IGlucHV0IHVpZCA9IiwgaV91c2VyLlVJRCwgInBvbGljeSB1aWQgPSIsIHBfdXNlci5VSUQpCiAgICBwX3VzZXIuVUlEID09IGlfdXNlci5VSUQKCiAgICAjIFRPRE86IHRyYWNrIGRvd24gdGhlIHJlYXNvbiBmb3IgcmVnaXN0cnkuazhzLmlvL3BhdXNlOjMuOSBiZWluZwogICAgIyAgICAgICBleGVjdXRlZCB3aXRoIGdpZCA9IDAgZGVzcGl0ZSBoYXZpbmcgIjY1NTM1OjY1NTM1IiBpbiBpdHMgY29udGFpbmVyIGltYWdlCiAgICAjICAgICAgIGNvbmZpZy4KICAgICNwcmludCgiYWxsb3dfdXNlcjogaW5wdXQgZ2lkID0iLCBpX3VzZXIuR0lELCAicG9saWN5IGdpZCA9IiwgcF91c2VyLkdJRCkKICAgICNwX3VzZXIuR0lEID09IGlfdXNlci5HSUQKCiAgICAjIFRPRE86IGNvbXBhcmUgdGhlIGFkZGl0aW9uYWxHaWRzIGZpZWxkIHRvbyBhZnRlciBjb21wdXRpbmcgaXRzIHZhbHVlCiAgICAjIGJhc2VkIG9uIC9ldGMvcGFzc3dkIGFuZCAvZXRjL2dyb3VwIGZyb20gdGhlIGNvbnRhaW5lciBpbWFnZS4KfQoKYWxsb3dfZGVwcmVjYXRlZF9hcmdzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZ3MgMTogbm8gYXJncyIpCgogICAgbm90IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJncwogICAgbm90IGlfcHJvY2Vzcy5BcmdzCgogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAxOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZ3MocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSkgewogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiBwb2xpY3kgYXJncyA9IiwgcF9wcm9jZXNzLkRlcHJlY2F0ZWRBcmdzKQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiBpbnB1dCBhcmdzID0iLCBpX3Byb2Nlc3MuQXJncykKCiAgICBjb3VudChwX3Byb2Nlc3MuRGVwcmVjYXRlZEFyZ3MpID09IGNvdW50KGlfcHJvY2Vzcy5BcmdzKQoKICAgIGV2ZXJ5IGksIGlfYXJnIGluIGlfcHJvY2Vzcy5BcmdzIHsKICAgICAgICBhbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpCiAgICB9CgogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDE6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgcF9hcmcyIDo9IHJlcGxhY2UocF9hcmcsICIkJCIsICIkIikKICAgIHBfYXJnMiA9PSBpX2FyZwoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAxOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDI6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgIyBUT0RPOiBjYW4gJChub2RlLW5hbWUpIGJlIGhhbmRsZWQgYmV0dGVyPwogICAgY29udGFpbnMocF9hcmcsICIkKG5vZGUtbmFtZSkiKQoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAyOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDM6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgcF9hcmcyIDo9IHJlcGxhY2UocF9hcmcsICIkJCIsICIkIikKICAgIHBfYXJnMyA6PSByZXBsYWNlKHBfYXJnMiwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAzOiBwX2FyZzMgPSIsIHBfYXJnMykKICAgIHBfYXJnMyA9PSBpX2FyZwoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAzOiB0cnVlIikKfQoKIyBPQ0kgcHJvY2Vzcy5FbnYgZmllbGQKYWxsb3dfZW52KHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfZW52OiBwIGVudiA9IiwgcF9wcm9jZXNzLkVudikKICAgIHByaW50KCJhbGxvd19lbnY6IGkgZW52ID0iLCBpX3Byb2Nlc3MuRW52KQoKICAgIGV2ZXJ5IGlfdmFyIGluIGlfcHJvY2Vzcy5FbnYgewogICAgICAgIHByaW50KCJhbGxvd19lbnY6IGlfdmFyID0iLCBpX3ZhcikKICAgICAgICBhbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgfQoKICAgIHByaW50KCJhbGxvd19lbnY6IHRydWUiKQp9CgojIEFsbG93IGlucHV0IGVudiB2YXJpYWJsZXMgdGhhdCBhcmUgcHJlc2VudCBpbiB0aGUgcG9saWN5IGRhdGEgdG9vLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHBfdmFyID09IGlfdmFyCiAgICBwcmludCgiYWxsb3dfdmFyIDE6IHRydWUiKQp9CgojIE1hdGNoIGlucHV0IHdpdGggb25lIG9mIHRoZSBwb2xpY3kgdmFyaWFibGVzLCBhZnRlciBzdWJzdGl0dXRpbmcgJChzYW5kYm94LW5hbWUpLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHByaW50KCJhbGxvd192YXIgMjogcF92YXIgPSIsIHBfdmFyKQoKICAgIHBfdmFyX3NwbGl0IDo9IHNwbGl0KHBfdmFyLCAiPSIpCiAgICBjb3VudChwX3Zhcl9zcGxpdCkgPT0gMgoKICAgIHBfdmFyX3NwbGl0WzFdID09ICIkKHNhbmRib3gtbmFtZSkiCgogICAgaV92YXJfc3BsaXQgOj0gc3BsaXQoaV92YXIsICI9IikKICAgIGNvdW50KGlfdmFyX3NwbGl0KSA9PSAyCgogICAgaV92YXJfc3BsaXRbMF0gPT0gcF92YXJfc3BsaXRbMF0KICAgIHJlZ2V4Lm1hdGNoKHNfbmFtZSwgaV92YXJfc3BsaXRbMV0pCgogICAgcHJpbnQoImFsbG93X3ZhciAyOiB0cnVlIikKfQoKIyBBbGxvdyBpbnB1dCBlbnYgdmFyaWFibGVzIHRoYXQgbWF0Y2ggd2l0aCBhIHJlcXVlc3RfZGVmYXVsdHMgcmVnZXguCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHNvbWUgcF9yZWdleDEgaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5DcmVhdGVDb250YWluZXJSZXF1ZXN0LmFsbG93X2Vudl9yZWdleAogICAgcF9yZWdleDIgOj0gcmVwbGFjZShwX3JlZ2V4MSwgIiQoaXB2NF9hKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcHY0X2EpCiAgICBwX3JlZ2V4MyA6PSByZXBsYWNlKHBfcmVnZXgyLCAiJChpcF9wKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcF9wKQogICAgcF9yZWdleDQgOj0gcmVwbGFjZShwX3JlZ2V4MywgIiQoc3ZjX25hbWUpIiwgcG9saWN5X2RhdGEuY29tbW9uLnN2Y19uYW1lKQogICAgcF9yZWdleDUgOj0gcmVwbGFjZShwX3JlZ2V4NCwgIiQoZG5zX2xhYmVsKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5kbnNfbGFiZWwpCgogICAgcHJpbnQoImFsbG93X3ZhciAzOiBwX3JlZ2V4NSA9IiwgcF9yZWdleDUpCiAgICByZWdleC5tYXRjaChwX3JlZ2V4NSwgaV92YXIpCgogICAgcHJpbnQoImFsbG93X3ZhciAzOiB0cnVlIikKfQoKIyBBbGxvdyBmaWVsZFJlZiAiZmllbGRQYXRoOiBzdGF0dXMucG9kSVAiIHZhbHVlcy4KYWxsb3dfdmFyKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBpX3Zhciwgc19uYW1lLCBzX25hbWVzcGFjZSkgewogICAgbmFtZV92YWx1ZSA6PSBzcGxpdChpX3ZhciwgIj0iKQogICAgY291bnQobmFtZV92YWx1ZSkgPT0gMgogICAgaXNfaXAobmFtZV92YWx1ZVsxXSkKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIGFsbG93X3BvZF9pcF92YXIobmFtZV92YWx1ZVswXSwgcF92YXIpCgogICAgcHJpbnQoImFsbG93X3ZhciA0OiB0cnVlIikKfQoKIyBBbGxvdyBjb21tb24gZmllbGRSZWYgdmFyaWFibGVzLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBuYW1lX3ZhbHVlIDo9IHNwbGl0KGlfdmFyLCAiPSIpCiAgICBjb3VudChuYW1lX3ZhbHVlKSA9PSAyCgogICAgc29tZSBwX3ZhciBpbiBwX3Byb2Nlc3MuRW52CiAgICBwX25hbWVfdmFsdWUgOj0gc3BsaXQocF92YXIsICI9IikKICAgIGNvdW50KHBfbmFtZV92YWx1ZSkgPT0gMgoKICAgIHBfbmFtZV92YWx1ZVswXSA9PSBuYW1lX3ZhbHVlWzBdCgogICAgIyBUT0RPOiBzaG91bGQgdGhlc2UgYmUgaGFuZGxlZCBpbiBhIGRpZmZlcmVudCB3YXk/CiAgICBhbHdheXNfYWxsb3dlZCA6PSBbIiQoaG9zdC1uYW1lKSIsICIkKG5vZGUtbmFtZSkiLCAiJChwb2QtdWlkKSJdCiAgICBzb21lIGFsbG93ZWQgaW4gYWx3YXlzX2FsbG93ZWQKICAgIGNvbnRhaW5zKHBfbmFtZV92YWx1ZVsxXSwgYWxsb3dlZCkKCiAgICBwcmludCgiYWxsb3dfdmFyIDU6IHRydWUiKQp9CgojIEFsbG93IGZpZWxkUmVmICJmaWVsZFBhdGg6IHN0YXR1cy5ob3N0SVAiIHZhbHVlcy4KYWxsb3dfdmFyKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBpX3Zhciwgc19uYW1lLCBzX25hbWVzcGFjZSkgewogICAgbmFtZV92YWx1ZSA6PSBzcGxpdChpX3ZhciwgIj0iKQogICAgY291bnQobmFtZV92YWx1ZSkgPT0gMgogICAgaXNfaXAobmFtZV92YWx1ZVsxXSkKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIGFsbG93X2hvc3RfaXBfdmFyKG5hbWVfdmFsdWVbMF0sIHBfdmFyKQoKICAgIHByaW50KCJhbGxvd192YXIgNjogdHJ1ZSIpCn0KCiMgQWxsb3cgcmVzb3VyY2VGaWVsZFJlZiB2YWx1ZXMgKGUuZy4sICJsaW1pdHMuY3B1IikuCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIG5hbWVfdmFsdWUgOj0gc3BsaXQoaV92YXIsICI9IikKICAgIGNvdW50KG5hbWVfdmFsdWUpID09IDIKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHBfbmFtZV92YWx1ZSA6PSBzcGxpdChwX3ZhciwgIj0iKQogICAgY291bnQocF9uYW1lX3ZhbHVlKSA9PSAyCgogICAgcF9uYW1lX3ZhbHVlWzBdID09IG5hbWVfdmFsdWVbMF0KCiAgICAjIGEgdmFyaWFibGUgd2Ugc2hvdWxkIGJlIHZhbGlkYXRpbmcgdXNpbmcgYSByZWdleCBmcm9tIHNldHRpbmdzCiAgICBwX25hbWVfdmFsdWVbMV0gPT0gIiQodmFsaWRhdGUtZnJvbS1zZXR0aW5ncykiCgogICAgcmVnZXhfdmFsIDo9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuQ3JlYXRlQ29udGFpbmVyUmVxdWVzdC5hbGxvd19lbnZfcmVnZXhfbWFwW25hbWVfdmFsdWVbMF1dCgogICAgcHJpbnQoImFsbG93X3ZhciA3OiB2YWwgPSIsIG5hbWVfdmFsdWVbMV0pCiAgICBwcmludCgiYWxsb3dfdmFyIDc6IHJlZ2V4X3ZhbCA9IiwgcmVnZXhfdmFsKQoKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4X3ZhbCwgbmFtZV92YWx1ZVsxXSkKCiAgICBwcmludCgiYWxsb3dfdmFyIDc6IHRydWUiKQp9CgojIE1hdGNoIGlucHV0IHdpdGggb25lIG9mIHRoZSBwb2xpY3kgdmFyaWFibGVzLCBhZnRlciBzdWJzdGl0dXRpbmcgJChzYW5kYm94LW5hbWVzcGFjZSkuCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHNvbWUgcF92YXIgaW4gcF9wcm9jZXNzLkVudgogICAgcF92YXIyIDo9IHJlcGxhY2UocF92YXIsICIkKHNhbmRib3gtbmFtZXNwYWNlKSIsIHNfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd192YXIgODogcF92YXIyID0iLCBwX3ZhcjIpCiAgICBwX3ZhcjIgPT0gaV92YXIKCiAgICBwcmludCgiYWxsb3dfdmFyIDg6IHRydWUiKQp9CgphbGxvd19wb2RfaXBfdmFyKHZhcl9uYW1lLCBwX3ZhcikgewogICAgcHJpbnQoImFsbG93X3BvZF9pcF92YXI6IHZhcl9uYW1lID0iLCB2YXJfbmFtZSwgInBfdmFyID0iLCBwX3ZhcikKCiAgICBwX25hbWVfdmFsdWUgOj0gc3BsaXQocF92YXIsICI9IikKICAgIGNvdW50KHBfbmFtZV92YWx1ZSkgPT0gMgoKICAgIHBfbmFtZV92YWx1ZVswXSA9PSB2YXJfbmFtZQogICAgcF9uYW1lX3ZhbHVlWzFdID09ICIkKHBvZC1pcCkiCgogICAgcHJpbnQoImFsbG93X3BvZF9pcF92YXI6IHRydWUiKQp9CgphbGxvd19ob3N0X2lwX3Zhcih2YXJfbmFtZSwgcF92YXIpIHsKICAgIHByaW50KCJhbGxvd19ob3N0X2lwX3ZhcjogdmFyX25hbWUgPSIsIHZhcl9uYW1lLCAicF92YXIgPSIsIHBfdmFyKQoKICAgIHBfbmFtZV92YWx1ZSA6PSBzcGxpdChwX3ZhciwgIj0iKQogICAgY291bnQocF9uYW1lX3ZhbHVlKSA9PSAyCgogICAgcF9uYW1lX3ZhbHVlWzBdID09IHZhcl9uYW1lCiAgICBwX25hbWVfdmFsdWVbMV0gPT0gIiQoaG9zdC1pcCkiCgogICAgcHJpbnQoImFsbG93X2hvc3RfaXBfdmFyOiB0cnVlIikKfQoKaXNfaXAodmFsdWUpIHsKICAgIGJ5dGVzID0gc3BsaXQodmFsdWUsICIuIikKICAgIGNvdW50KGJ5dGVzKSA9PSA0CgogICAgaXNfaXBfZmlyc3RfYnl0ZShieXRlc1swXSkKICAgIGlzX2lwX290aGVyX2J5dGUoYnl0ZXNbMV0pCiAgICBpc19pcF9vdGhlcl9ieXRlKGJ5dGVzWzJdKQogICAgaXNfaXBfb3RoZXJfYnl0ZShieXRlc1szXSkKfQppc19pcF9maXJzdF9ieXRlKGNvbXBvbmVudCkgewogICAgbnVtYmVyID0gdG9fbnVtYmVyKGNvbXBvbmVudCkKICAgIG51bWJlciA+PSAxCiAgICBudW1iZXIgPD0gMjU1Cn0KaXNfaXBfb3RoZXJfYnl0ZShjb21wb25lbnQpIHsKICAgIG51bWJlciA9IHRvX251bWJlcihjb21wb25lbnQpCiAgICBudW1iZXIgPj0gMAogICAgbnVtYmVyIDw9IDI1NQp9CgojIE9DSSByb290LlBhdGgKYWxsb3dfcm9vdF9wYXRoKHBfb2NpLCBpX29jaSwgYnVuZGxlX2lkKSB7CiAgICBpX3BhdGggOj0gaV9vY2kuUm9vdC5QYXRoCiAgICBwX3BhdGgxIDo9IHBfb2NpLlJvb3QuUGF0aAogICAgcHJpbnQoImFsbG93X3Jvb3RfcGF0aDogaV9wYXRoID0iLCBpX3BhdGgsICJwX3BhdGgxID0iLCBwX3BhdGgxKQoKICAgIHBfcGF0aDIgOj0gcmVwbGFjZShwX3BhdGgxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfcm9vdF9wYXRoOiBwX3BhdGgyID0iLCBwX3BhdGgyKQoKICAgIHBfcGF0aDMgOj0gcmVwbGFjZShwX3BhdGgyLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X3Jvb3RfcGF0aDogcF9wYXRoMyA9IiwgcF9wYXRoMykKCiAgICBwX3BhdGgzID09IGlfcGF0aAoKICAgIHByaW50KCJhbGxvd19yb290X3BhdGg6IHRydWUiKQp9CgojIGRldmljZSBtb3VudHMKYWxsb3dfbW91bnQocF9vY2ksIGlfbW91bnQsIGlfc3RvcmFnZXMsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcHJpbnQoImFsbG93X21vdW50OiBpX21vdW50ID0iLCBpX21vdW50KQoKICAgIHNvbWUgcF9tb3VudCBpbiBwX29jaS5Nb3VudHMKICAgIHNvbWUgaV9zdG9yYWdlIGluIGlfc3RvcmFnZXMKCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IHBfbW91bnQgPSIsIHBfbW91bnQpCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IGlfc3RvcmFnZSA9IiwgaV9zdG9yYWdlKQoKICAgIGNoZWNrX21vdW50KHBfbW91bnQsIGlfbW91bnQsIGlfc3RvcmFnZSwgYnVuZGxlX2lkLCBzYW5kYm94X2lkKQoKICAgICMgVE9ETzogYXJlIHRoZXJlIGFueSBvdGhlciByZXF1aXJlZCBwb2xpY3kgY2hlY2tzIGZvciBtb3VudHMgLSBlLmcuLAogICAgIyAgICAgICBtdWx0aXBsZSBtb3VudHMgd2l0aCBzYW1lIHNvdXJjZSBvciBkZXN0aW5hdGlvbj8KCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IHRydWUiKQp9CgpjaGVja19tb3VudChwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcF9tb3VudCA9PSBpX21vdW50CiAgICBwcmludCgiY2hlY2tfbW91bnQgMTogdHJ1ZSIpCn0KY2hlY2tfbW91bnQocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHBfbW91bnQuZGVzdGluYXRpb24gPT0gaV9tb3VudC5kZXN0aW5hdGlvbgogICAgcF9tb3VudC50eXBlXyA9PSBpX21vdW50LnR5cGVfCiAgICBwX21vdW50Lm9wdGlvbnMgPT0gaV9tb3VudC5vcHRpb25zCgogICAgbW91bnRfc291cmNlX2FsbG93cyhwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkKCiAgICBwcmludCgiY2hlY2tfbW91bnQgMjogdHJ1ZSIpCn0KCm1vdW50X3NvdXJjZV9hbGxvd3MocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHJlZ2V4MSA6PSBwX21vdW50LnNvdXJjZQogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5tb3VudF9zb3VyY2VfY3BhdGgpCiAgICByZWdleDQgOj0gcmVwbGFjZShyZWdleDMsICIkKGJ1bmRsZS1pZCkiLCBidW5kbGVfaWQpCgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMTogcmVnZXg0ID0iLCByZWdleDQpCiAgICByZWdleC5tYXRjaChyZWdleDQsIGlfbW91bnQuc291cmNlKQoKICAgIHByaW50KCJtb3VudF9zb3VyY2VfYWxsb3dzIDE6IHRydWUiKQp9Cm1vdW50X3NvdXJjZV9hbGxvd3MocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHJlZ2V4MSA6PSBwX21vdW50LnNvdXJjZQogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5tb3VudF9zb3VyY2VfY3BhdGgpCiAgICByZWdleDQgOj0gcmVwbGFjZShyZWdleDMsICIkKHNhbmRib3gtaWQpIiwgc2FuZGJveF9pZCkKCiAgICBwcmludCgibW91bnRfc291cmNlX2FsbG93cyAyOiByZWdleDQgPSIsIHJlZ2V4NCkKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4NCwgaV9tb3VudC5zb3VyY2UpCgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMjogdHJ1ZSIpCn0KbW91bnRfc291cmNlX2FsbG93cyhwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogaV9tb3VudC5zb3VyY2UgPSIsIGlfbW91bnQuc291cmNlKQogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogaV9zdG9yYWdlLm1vdW50X3BvaW50ID0iLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCgogICAgaV9tb3VudC5zb3VyY2UgPT0gaV9zdG9yYWdlLm1vdW50X3BvaW50CgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogdHJ1ZSIpCn0KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBDcmVhdGUgY29udGFpbmVyIFN0b3JhZ2VzCgphbGxvd19zdG9yYWdlcyhwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHBfY291bnQgOj0gY291bnQocF9zdG9yYWdlcykKICAgIGlfY291bnQgOj0gY291bnQoaV9zdG9yYWdlcykKICAgIHByaW50KCJhbGxvd19zdG9yYWdlczogcF9jb3VudCA9IiwgcF9jb3VudCwgImlfY291bnQgPSIsIGlfY291bnQpCgogICAgcF9jb3VudCA9PSBpX2NvdW50CgogICAgIyBHZXQgdGhlIGNvbnRhaW5lciBpbWFnZSBsYXllciBJRHMgYW5kIHZlcml0eSByb290IGhhc2hlcywgZnJvbSB0aGUgIm92ZXJsYXlmcyIgc3RvcmFnZS4KICAgIHNvbWUgb3ZlcmxheV9zdG9yYWdlIGluIHBfc3RvcmFnZXMKICAgIG92ZXJsYXlfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIHByaW50KCJhbGxvd19zdG9yYWdlczogb3ZlcmxheV9zdG9yYWdlID0iLCBvdmVybGF5X3N0b3JhZ2UpCiAgICBjb3VudChvdmVybGF5X3N0b3JhZ2Uub3B0aW9ucykgPT0gMgoKICAgIGxheWVyX2lkcyA6PSBzcGxpdChvdmVybGF5X3N0b3JhZ2Uub3B0aW9uc1swXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiBsYXllcl9pZHMgPSIsIGxheWVyX2lkcykKCiAgICByb290X2hhc2hlcyA6PSBzcGxpdChvdmVybGF5X3N0b3JhZ2Uub3B0aW9uc1sxXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiByb290X2hhc2hlcyA9Iiwgcm9vdF9oYXNoZXMpCgogICAgZXZlcnkgaV9zdG9yYWdlIGluIGlfc3RvcmFnZXMgewogICAgICAgIGFsbG93X3N0b3JhZ2UocF9zdG9yYWdlcywgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpCiAgICB9CgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiB0cnVlIikKfQoKYWxsb3dfc3RvcmFnZShwX3N0b3JhZ2VzLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgc29tZSBwX3N0b3JhZ2UgaW4gcF9zdG9yYWdlcwoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiBwX3N0b3JhZ2UgPSIsIHBfc3RvcmFnZSkKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiBpX3N0b3JhZ2UgPSIsIGlfc3RvcmFnZSkKCiAgICBwX3N0b3JhZ2UuZHJpdmVyICAgICAgICAgICA9PSBpX3N0b3JhZ2UuZHJpdmVyCiAgICBwX3N0b3JhZ2UuZHJpdmVyX29wdGlvbnMgICA9PSBpX3N0b3JhZ2UuZHJpdmVyX29wdGlvbnMKICAgIHBfc3RvcmFnZS5mc19ncm91cCAgICAgICAgID09IGlfc3RvcmFnZS5mc19ncm91cAogICAgcF9zdG9yYWdlLmZzdHlwZSAgICAgICAgICAgPT0gaV9zdG9yYWdlLmZzdHlwZQoKICAgIGFsbG93X3N0b3JhZ2Vfc291cmNlKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKQogICAgYWxsb3dfc3RvcmFnZV9vcHRpb25zKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKQogICAgYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKQoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiB0cnVlIikKfQoKYWxsb3dfc3RvcmFnZV9zb3VyY2UocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX3NvdXJjZSAxOiBzdGFydCIpCgogICAgcF9zdG9yYWdlLnNvdXJjZSA9PSBpX3N0b3JhZ2Uuc291cmNlCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDE6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX3NvdXJjZShwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDI6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCgogICAgIyBEREREOkJCOkRELkY6IERvbWFpbjpCdXM6RGV2aWNlLkZ1bmN0aW9uCiAgICAjIGh0dHBzOi8vd3d3Lmtlcm5lbC5vcmcvZG9jL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtYnVzLXBjaQogICAgcmVnZXgubWF0Y2goYF5bYS1mMC05XXs0fTpbYS1mMC05XXsyfTpbYS1mMC05XXsyfVwuW2EtZjAtOV0kYCwgaV9zdG9yYWdlLnNvdXJjZSkKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9zb3VyY2UgMjogdHJ1ZSIpCn0KCmFsbG93X3N0b3JhZ2Vfc291cmNlKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKSB7CiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9zb3VyY2UgMzogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIGlfc3RvcmFnZS5zb3VyY2UgPT0gIm5vbmUiCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDM6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX3NvdXJjZShwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDQ6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJzbWIiCgogICAgIyBQYXR0ZXJuOiAvLzxzdG9yYWdlLWFjY291bnQtbmFtZT4uZmlsZS5jb3JlLndpbmRvd3MubmV0LzxrOHMtUFZDLW5hbWU+CiAgICAjIFN0b3JhZ2UgYWNjb3VudCBuYW1lOiBodHRwczovL2xlYXJuLm1pY3Jvc29mdC5jb20vZW4tdXMvYXp1cmUvc3RvcmFnZS9jb21tb24vc3RvcmFnZS1hY2NvdW50LW92ZXJ2aWV3I3N0b3JhZ2UtYWNjb3VudC1uYW1lCiAgICAjIEs4cyBQVkMgbmFtZTogaHR0cHM6Ly9rdWJlcm5ldGVzLmlvL2RvY3MvY29uY2VwdHMvb3ZlcnZpZXcvd29ya2luZy13aXRoLW9iamVjdHMvbmFtZXMvI2Rucy1zdWJkb21haW4tbmFtZXMKICAgIHJlZ2V4Lm1hdGNoKGBeXC9cLyhbYS16MC05XXszLDI0fSlcLmZpbGVcLmNvcmVcLndpbmRvd3NcLm5ldFwvW2EtejAtOV0oW2EtejAtOS4tXXswLDI1MX1bYS16MC05XSk/JGAsIGlfc3RvcmFnZS5zb3VyY2UpCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDQ6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMTogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgIT0gIm92ZXJsYXlmcyIKICAgIHBfc3RvcmFnZS5vcHRpb25zID09IGlfc3RvcmFnZS5vcHRpb25zCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAxOiB0cnVlIikKfQphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIGNvdW50KHBfc3RvcmFnZS5vcHRpb25zKSA9PSAyCgogICAgcG9saWN5X2lkcyA6PSBzcGxpdChwX3N0b3JhZ2Uub3B0aW9uc1swXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBwb2xpY3lfaWRzID0iLCBwb2xpY3lfaWRzKQogICAgcG9saWN5X2lkcyA9PSBsYXllcl9pZHMKCiAgICBwb2xpY3lfaGFzaGVzIDo9IHNwbGl0KHBfc3RvcmFnZS5vcHRpb25zWzFdLCAiOiIpCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IHBvbGljeV9oYXNoZXMgPSIsIHBvbGljeV9oYXNoZXMpCgogICAgcF9jb3VudCA6PSBjb3VudChwb2xpY3lfaWRzKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBwX2NvdW50ID0iLCBwX2NvdW50KQogICAgcF9jb3VudCA+PSAxCiAgICBwX2NvdW50ID09IGNvdW50KHBvbGljeV9oYXNoZXMpCgogICAgaV9jb3VudCA6PSBjb3VudChpX3N0b3JhZ2Uub3B0aW9ucykKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogaV9jb3VudCA9IiwgaV9jb3VudCkKICAgIGlfY291bnQgPT0gcF9jb3VudCArIDMKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zWzBdID0iLCBpX3N0b3JhZ2Uub3B0aW9uc1swXSkKICAgIGlfc3RvcmFnZS5vcHRpb25zWzBdID09ICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQubGF5ZXItc3JjLXByZWZpeD0vdmFyL2xpYi9jb250YWluZXJkL2lvLmNvbnRhaW5lcmQuc25hcHNob3R0ZXIudjEudGFyZGV2L2xheWVycyIKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zW2lfY291bnQgLSAyXSA9IiwgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDJdKQogICAgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDJdID09ICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQub3ZlcmxheS1ydyIKCiAgICBsb3dlcmRpciA6PSBjb25jYXQoIj0iLCBbImxvd2VyZGlyIiwgcF9zdG9yYWdlLm9wdGlvbnNbMF1dKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBsb3dlcmRpciA9IiwgbG93ZXJkaXIpCgogICAgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDFdID09IGxvd2VyZGlyCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zW2lfY291bnQgLSAxXSA9IiwgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDFdKQoKICAgIGV2ZXJ5IGksIHBvbGljeV9pZCBpbiBwb2xpY3lfaWRzIHsKICAgICAgICBhbGxvd19vdmVybGF5X2xheWVyKHBvbGljeV9pZCwgcG9saWN5X2hhc2hlc1tpXSwgaV9zdG9yYWdlLm9wdGlvbnNbaSArIDFdKQogICAgfQoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogdHJ1ZSIpCn0KYWxsb3dfc3RvcmFnZV9vcHRpb25zKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKSB7CiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDM6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCiAgICBjb3VudChwX3N0b3JhZ2Uub3B0aW9ucykgPT0gMQoKICAgIHN0YXJ0c3dpdGgocF9zdG9yYWdlLm9wdGlvbnNbMF0sICIkKGhhc2giKQogICAgaGFzaF9zdWZmaXggOj0gdHJpbV9sZWZ0KHBfc3RvcmFnZS5vcHRpb25zWzBdLCAiJChoYXNoIikKCiAgICBlbmRzd2l0aChoYXNoX3N1ZmZpeCwgIikiKQogICAgaGFzaF9pbmRleCA6PSB0cmltX3JpZ2h0KGhhc2hfc3VmZml4LCAiKSIpCiAgICBpIDo9IHRvX251bWJlcihoYXNoX2luZGV4KQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAzOiBpID0iLCBpKQoKICAgIGhhc2hfb3B0aW9uIDo9IGNvbmNhdCgiPSIsIFsiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LnJvb3QtaGFzaCIsIHJvb3RfaGFzaGVzW2ldXSkKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMzogaGFzaF9vcHRpb24gPSIsIGhhc2hfb3B0aW9uKQoKICAgIGNvdW50KGlfc3RvcmFnZS5vcHRpb25zKSA9PSA0CiAgICBpX3N0b3JhZ2Uub3B0aW9uc1swXSA9PSAicm8iCiAgICBpX3N0b3JhZ2Uub3B0aW9uc1sxXSA9PSAiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmJsb2NrX2RldmljZT1maWxlIgogICAgaV9zdG9yYWdlLm9wdGlvbnNbMl0gPT0gImlvLmthdGFjb250YWluZXJzLmZzLW9wdC5pcy1sYXllciIKICAgIGlfc3RvcmFnZS5vcHRpb25zWzNdID09IGhhc2hfb3B0aW9uCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAzOiB0cnVlIikKfQphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgNDogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gInNtYiIKICAgIHBfb3B0c19jb3VudCA6PSBjb3VudChwX3N0b3JhZ2Uub3B0aW9ucykKICAgIGlfb3B0c19jb3VudCA6PSBjb3VudChpX3N0b3JhZ2Uub3B0aW9ucykKICAgIGlfb3B0c19jb3VudCA9PSBwX29wdHNfY291bnQgKyAyCgogICAgaV9vcHRfbWF0Y2hlcyA6PSBbaSB8IGkgOj0gaWR4OyBpZHggPCBwX29wdHNfY291bnQ7IHBfc3RvcmFnZS5vcHRpb25zW2lkeF0gPT0gaV9zdG9yYWdlLm9wdGlvbnNbaWR4XV0KICAgIGNvdW50KGlfb3B0X21hdGNoZXMpID09IHBfb3B0c19jb3VudAoKICAgIHN0YXJ0c3dpdGgoaV9zdG9yYWdlLm9wdGlvbnNbaV9vcHRzX2NvdW50LTJdLCAiYWRkcj0iKQogICAgY3JlZHMgPSBzcGxpdChpX3N0b3JhZ2Uub3B0aW9uc1tpX29wdHNfY291bnQtMV0sICIsIikKICAgIGNvdW50KGNyZWRzKSA9PSAyCiAgICBzdGFydHN3aXRoKGNyZWRzWzBdLCAidXNlcm5hbWU9IikKICAgIHN0YXJ0c3dpdGgoY3JlZHNbMV0sICJwYXNzd29yZD0iKQogICAgCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDQ6IHRydWUiKQp9CgphbGxvd19vdmVybGF5X2xheWVyKHBvbGljeV9pZCwgcG9saWN5X2hhc2gsIGlfb3B0aW9uKSB7CiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogcG9saWN5X2lkID0iLCBwb2xpY3lfaWQsICJwb2xpY3lfaGFzaCA9IiwgcG9saWN5X2hhc2gpCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogaV9vcHRpb24gPSIsIGlfb3B0aW9uKQoKICAgIHN0YXJ0c3dpdGgoaV9vcHRpb24sICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQubGF5ZXI9IikKICAgIGlfdmFsdWUgOj0gcmVwbGFjZShpX29wdGlvbiwgImlvLmthdGFjb250YWluZXJzLmZzLW9wdC5sYXllcj0iLCAiIikKICAgIGlfdmFsdWVfZGVjb2RlZCA6PSBiYXNlNjQuZGVjb2RlKGlfdmFsdWUpCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogaV92YWx1ZV9kZWNvZGVkID0iLCBpX3ZhbHVlX2RlY29kZWQpCgogICAgcG9saWN5X3N1ZmZpeCA6PSBjb25jYXQoIj0iLCBbInRhcixybyxpby5rYXRhY29udGFpbmVycy5mcy1vcHQuYmxvY2tfZGV2aWNlPWZpbGUsaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmlzLWxheWVyLGlvLmthdGFjb250YWluZXJzLmZzLW9wdC5yb290LWhhc2giLCBwb2xpY3lfaGFzaF0pCiAgICBwX3ZhbHVlIDo9IGNvbmNhdCgiLCIsIFtwb2xpY3lfaWQsIHBvbGljeV9zdWZmaXhdKQogICAgcHJpbnQoImFsbG93X292ZXJsYXlfbGF5ZXI6IHBfdmFsdWUgPSIsIHBfdmFsdWUpCgogICAgcF92YWx1ZSA9PSBpX3ZhbHVlX2RlY29kZWQKCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogdHJ1ZSIpCn0KCmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAidGFyIgoKICAgIHN0YXJ0c3dpdGgocF9zdG9yYWdlLm1vdW50X3BvaW50LCAiJChsYXllciIpCiAgICBtb3VudF9zdWZmaXggOj0gdHJpbV9sZWZ0KHBfc3RvcmFnZS5tb3VudF9wb2ludCwgIiQobGF5ZXIiKQoKICAgIGVuZHN3aXRoKG1vdW50X3N1ZmZpeCwgIikiKQogICAgbGF5ZXJfaW5kZXggOj0gdHJpbV9yaWdodChtb3VudF9zdWZmaXgsICIpIikKICAgIGkgOj0gdG9fbnVtYmVyKGxheWVyX2luZGV4KQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDE6IGkgPSIsIGkpCgogICAgbGF5ZXJfaWQgOj0gbGF5ZXJfaWRzW2ldCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMTogbGF5ZXJfaWQgPSIsIGxheWVyX2lkKQoKICAgIHBfbW91bnQgOj0gY29uY2F0KCIvIiwgWyIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L2xheWVycyIsIGxheWVyX2lkXSkKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCAxOiBwX21vdW50ID0iLCBwX21vdW50KQoKICAgIHBfbW91bnQgPT0gaV9zdG9yYWdlLm1vdW50X3BvaW50CgogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDE6IHRydWUiKQp9CmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAiZnVzZTMua2F0YS1vdmVybGF5IgoKICAgIG1vdW50MSA6PSByZXBsYWNlKHBfc3RvcmFnZS5tb3VudF9wb2ludCwgIiQoY3BhdGgpIiwgcG9saWN5X2RhdGEuY29tbW9uLmNwYXRoKQogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDI6IG1vdW50MiA9IiwgbW91bnQyKQoKICAgIG1vdW50MiA9PSBpX3N0b3JhZ2UubW91bnRfcG9pbnQKCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMjogdHJ1ZSIpCn0KYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKSB7CiAgICBwX3N0b3JhZ2UuZnN0eXBlID09ICJsb2NhbCIKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQyID0iLCBtb3VudDIpCgogICAgbW91bnQzIDo9IHJlcGxhY2UobW91bnQyLCAiJChzYW5kYm94LWlkKSIsIHNhbmRib3hfaWQpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQzID0iLCBtb3VudDMpCgogICAgcmVnZXgubWF0Y2gobW91bnQzLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCgogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDM6IHRydWUiKQp9CmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAiYmluZCIKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNDogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNDogbW91bnQyID0iLCBtb3VudDIpCgogICAgbW91bnQzIDo9IHJlcGxhY2UobW91bnQyLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDQ6IG1vdW50MyA9IiwgbW91bnQzKQoKICAgIHJlZ2V4Lm1hdGNoKG1vdW50MywgaV9zdG9yYWdlLm1vdW50X3BvaW50KQoKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA0OiB0cnVlIikKfQphbGxvd19tb3VudF9wb2ludChwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgYnVuZGxlX2lkLCBzYW5kYm94X2lkLCBsYXllcl9pZHMpIHsKICAgIHBfc3RvcmFnZS5mc3R5cGUgPT0gInRtcGZzIgoKICAgIG1vdW50MSA6PSBwX3N0b3JhZ2UubW91bnRfcG9pbnQKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA1OiBtb3VudDEgPSIsIG1vdW50MSkKCiAgICByZWdleC5tYXRjaChtb3VudDEsIGlfc3RvcmFnZS5tb3VudF9wb2ludCkKCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNTogdHJ1ZSIpCn0KYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKSB7CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogaV9zdG9yYWdlLm1vdW50X3BvaW50ID0iLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCiAgICBhbGxvd19kaXJlY3Rfdm9sX2RyaXZlcihwX3N0b3JhZ2UsIGlfc3RvcmFnZSkKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChzcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQyID0iLCBtb3VudDIpCgogICAgZGlyZWN0X3ZvbF9wYXRoIDo9IGlfc3RvcmFnZS5zb3VyY2UKICAgIG1vdW50MyA6PSByZXBsYWNlKG1vdW50MiwgIiQoYjY0LWRpcmVjdC12b2wtcGF0aCkiLCBiYXNlNjR1cmwuZW5jb2RlKGRpcmVjdF92b2xfcGF0aCkpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQzID0iLCBtb3VudDMpCgogICAgbW91bnQzID09IGlfc3RvcmFnZS5tb3VudF9wb2ludAoKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA2OiB0cnVlIikKfQoKYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIocF9zdG9yYWdlLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19kaXJlY3Rfdm9sX2RyaXZlciAxOiBzdGFydCIpCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCiAgICBwcmludCgiYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIgMTogdHJ1ZSIpCn0KYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIocF9zdG9yYWdlLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19kaXJlY3Rfdm9sX2RyaXZlciAyOiBzdGFydCIpCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJzbWIiCiAgICBwcmludCgiYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIgMjogdHJ1ZSIpCn0KCiMgRXhlY1Byb2Nlc3NSZXF1ZXN0LnByb2Nlc3MuQ2FwYWJpbGl0aWVzCmFsbG93X2V4ZWNfY2FwcyhpX2NhcHMpIHsKICAgIG5vdCBpX2NhcHMuQW1iaWVudAogICAgbm90IGlfY2Fwcy5Cb3VuZGluZwogICAgbm90IGlfY2Fwcy5FZmZlY3RpdmUKICAgIG5vdCBpX2NhcHMuSW5oZXJpdGFibGUKICAgIG5vdCBpX2NhcHMuUGVybWl0dGVkCn0KCiMgT0NJLlByb2Nlc3MuQ2FwYWJpbGl0aWVzCmFsbG93X2NhcHMocF9jYXBzLCBpX2NhcHMpIHsKICAgIHByaW50KCJhbGxvd19jYXBzOiBwb2xpY3kgQW1iaWVudCA9IiwgcF9jYXBzLkFtYmllbnQpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgQW1iaWVudCA9IiwgaV9jYXBzLkFtYmllbnQpCiAgICBtYXRjaF9jYXBzKHBfY2Fwcy5BbWJpZW50LCBpX2NhcHMuQW1iaWVudCkKCiAgICBwcmludCgiYWxsb3dfY2FwczogcG9saWN5IEJvdW5kaW5nID0iLCBwX2NhcHMuQm91bmRpbmcpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgQm91bmRpbmcgPSIsIGlfY2Fwcy5Cb3VuZGluZykKICAgIG1hdGNoX2NhcHMocF9jYXBzLkJvdW5kaW5nLCBpX2NhcHMuQm91bmRpbmcpCgogICAgcHJpbnQoImFsbG93X2NhcHM6IHBvbGljeSBFZmZlY3RpdmUgPSIsIHBfY2Fwcy5FZmZlY3RpdmUpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgRWZmZWN0aXZlID0iLCBpX2NhcHMuRWZmZWN0aXZlKQogICAgbWF0Y2hfY2FwcyhwX2NhcHMuRWZmZWN0aXZlLCBpX2NhcHMuRWZmZWN0aXZlKQoKICAgIHByaW50KCJhbGxvd19jYXBzOiBwb2xpY3kgSW5oZXJpdGFibGUgPSIsIHBfY2Fwcy5Jbmhlcml0YWJsZSkKICAgIHByaW50KCJhbGxvd19jYXBzOiBpbnB1dCBJbmhlcml0YWJsZSA9IiwgaV9jYXBzLkluaGVyaXRhYmxlKQogICAgbWF0Y2hfY2FwcyhwX2NhcHMuSW5oZXJpdGFibGUsIGlfY2Fwcy5Jbmhlcml0YWJsZSkKCiAgICBwcmludCgiYWxsb3dfY2FwczogcG9saWN5IFBlcm1pdHRlZCA9IiwgcF9jYXBzLlBlcm1pdHRlZCkKICAgIHByaW50KCJhbGxvd19jYXBzOiBpbnB1dCBQZXJtaXR0ZWQgPSIsIGlfY2Fwcy5QZXJtaXR0ZWQpCiAgICBtYXRjaF9jYXBzKHBfY2Fwcy5QZXJtaXR0ZWQsIGlfY2Fwcy5QZXJtaXR0ZWQpCn0KCm1hdGNoX2NhcHMocF9jYXBzLCBpX2NhcHMpIHsKICAgIHByaW50KCJtYXRjaF9jYXBzIDE6IHN0YXJ0IikKCiAgICBwX2NhcHMgPT0gaV9jYXBzCgogICAgcHJpbnQoIm1hdGNoX2NhcHMgMTogdHJ1ZSIpCn0KbWF0Y2hfY2FwcyhwX2NhcHMsIGlfY2FwcykgewogICAgcHJpbnQoIm1hdGNoX2NhcHMgMjogc3RhcnQiKQoKICAgIGNvdW50KHBfY2FwcykgPT0gMQogICAgcF9jYXBzWzBdID09ICIkKGRlZmF1bHRfY2FwcykiCgogICAgcHJpbnQoIm1hdGNoX2NhcHMgMjogZGVmYXVsdF9jYXBzID0iLCBwb2xpY3lfZGF0YS5jb21tb24uZGVmYXVsdF9jYXBzKQogICAgcG9saWN5X2RhdGEuY29tbW9uLmRlZmF1bHRfY2FwcyA9PSBpX2NhcHMKCiAgICBwcmludCgibWF0Y2hfY2FwcyAyOiB0cnVlIikKfQptYXRjaF9jYXBzKHBfY2FwcywgaV9jYXBzKSB7CiAgICBwcmludCgibWF0Y2hfY2FwcyAzOiBzdGFydCIpCgogICAgY291bnQocF9jYXBzKSA9PSAxCiAgICBwX2NhcHNbMF0gPT0gIiQocHJpdmlsZWdlZF9jYXBzKSIKCiAgICBwcmludCgibWF0Y2hfY2FwcyAzOiBwcml2aWxlZ2VkX2NhcHMgPSIsIHBvbGljeV9kYXRhLmNvbW1vbi5wcml2aWxlZ2VkX2NhcHMpCiAgICBwb2xpY3lfZGF0YS5jb21tb24ucHJpdmlsZWdlZF9jYXBzID09IGlfY2FwcwoKICAgIHByaW50KCJtYXRjaF9jYXBzIDM6IHRydWUiKQp9CgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgpjaGVja19kaXJlY3RvcnlfdHJhdmVyc2FsKGlfcGF0aCkgewogICAgbm90IHJlZ2V4Lm1hdGNoKCIoXnwvKS4uKCR8LykiLCBpX3BhdGgpCn0KCmNoZWNrX3N5bWxpbmtfc291cmNlKGlfc3JjKSB7CiAgICBpX3NyYyA9PSAiIgogICAgcHJpbnQoImNoZWNrX3N5bWxpbmtfc291cmNlIDE6IHRydWUiKQp9CmNoZWNrX3N5bWxpbmtfc291cmNlKGlfc3JjKSB7CiAgICBpX3NyYyAhPSAiIgogICAgcHJpbnQoImNoZWNrX3N5bWxpbmtfc291cmNlIDI6IGlfc3JjID0iLCBpX3NyYykKCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24uc19zb3VyY2UxLCBpX3NyYykKCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMjogdHJ1ZSIpCn0KY2hlY2tfc3ltbGlua19zb3VyY2UoaV9zcmMpIHsKICAgIGlfc3JjICE9ICIiCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMzogaV9zcmMgPSIsIGlfc3JjKQoKICAgIHJlZ2V4Lm1hdGNoKHBvbGljeV9kYXRhLmNvbW1vbi5zX3NvdXJjZTIsIGlfc3JjKQogICAgY2hlY2tfZGlyZWN0b3J5X3RyYXZlcnNhbChpX3NyYykKCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMzogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfc3RvcmFnZXMoaV9zdG9yYWdlcykgewogICAgcHJpbnQoImFsbG93X3NhbmRib3hfc3RvcmFnZXM6IGlfc3RvcmFnZXMgPSIsIGlfc3RvcmFnZXMpCgogICAgcF9zdG9yYWdlcyA6PSBwb2xpY3lfZGF0YS5zYW5kYm94LnN0b3JhZ2VzCiAgICBldmVyeSBpX3N0b3JhZ2UgaW4gaV9zdG9yYWdlcyB7CiAgICAgICAgYWxsb3dfc2FuZGJveF9zdG9yYWdlKHBfc3RvcmFnZXMsIGlfc3RvcmFnZSkKICAgIH0KCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9zdG9yYWdlczogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfc3RvcmFnZShwX3N0b3JhZ2VzLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IGlfc3RvcmFnZSA9IiwgaV9zdG9yYWdlKQoKICAgIHNvbWUgcF9zdG9yYWdlIGluIHBfc3RvcmFnZXMKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IHBfc3RvcmFnZSA9IiwgcF9zdG9yYWdlKQogICAgaV9zdG9yYWdlID09IHBfc3RvcmFnZQoKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IHRydWUiKQp9CgpDb3B5RmlsZVJlcXVlc3QgewogICAgcHJpbnQoIkNvcHlGaWxlUmVxdWVzdDogaW5wdXQucGF0aCA9IiwgaW5wdXQucGF0aCkKCiAgICBjaGVja19zeW1saW5rX3NvdXJjZShpbnB1dC5zeW1saW5rX3NyYykKICAgIGNoZWNrX2RpcmVjdG9yeV90cmF2ZXJzYWwoaW5wdXQucGF0aCkKCiAgICBzb21lIHJlZ2V4MSBpbiBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLkNvcHlGaWxlUmVxdWVzdAogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5jcGF0aCkKICAgIHJlZ2V4NCA6PSByZXBsYWNlKHJlZ2V4MywgIiQoYnVuZGxlLWlkKSIsIEJVTkRMRV9JRCkKICAgIHByaW50KCJDb3B5RmlsZVJlcXVlc3Q6IHJlZ2V4NCA9IiwgcmVnZXg0KQoKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4NCwgaW5wdXQucGF0aCkKCiAgICBwcmludCgiQ29weUZpbGVSZXF1ZXN0OiB0cnVlIikKfQoKQ3JlYXRlU2FuZGJveFJlcXVlc3QgewogICAgcHJpbnQoIkNyZWF0ZVNhbmRib3hSZXF1ZXN0OiBpbnB1dC5ndWVzdF9ob29rX3BhdGggPSIsIGlucHV0Lmd1ZXN0X2hvb2tfcGF0aCkKICAgIGNvdW50KGlucHV0Lmd1ZXN0X2hvb2tfcGF0aCkgPT0gMAoKICAgIHByaW50KCJDcmVhdGVTYW5kYm94UmVxdWVzdDogaW5wdXQua2VybmVsX21vZHVsZXMgPSIsIGlucHV0Lmtlcm5lbF9tb2R1bGVzKQogICAgY291bnQoaW5wdXQua2VybmVsX21vZHVsZXMpID09IDAKCiAgICBpX3BpZG5zIDo9IGlucHV0LnNhbmRib3hfcGlkbnMKICAgIHByaW50KCJDcmVhdGVTYW5kYm94UmVxdWVzdDogaV9waWRucyA9IiwgaV9waWRucykKICAgIGlfcGlkbnMgPT0gZmFsc2UKICAgIGFsbG93X3NhbmRib3hfc3RvcmFnZXMoaW5wdXQuc3RvcmFnZXMpCn0KCmFsbG93X2V4ZWMocF9jb250YWluZXIsIGlfcHJvY2VzcykgewogICAgcHJpbnQoImFsbG93X2V4ZWM6IHN0YXJ0IikKCiAgICBwX29jaSA9IHBfY29udGFpbmVyLk9DSQogICAgcF9zX25hbWUgPSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc19uYW1lc3BhY2UgPSBnZXRfc3RhdGVfdmFsKCJuYW1lc3BhY2UiKQogICAgYWxsb3dfcHJvYmVfcHJvY2VzcyhwX29jaS5Qcm9jZXNzLCBpX3Byb2Nlc3MsIHBfc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfZXhlYzogdHJ1ZSIpCn0KCmFsbG93X2ludGVyYWN0aXZlX2V4ZWMocF9jb250YWluZXIsIGlfcHJvY2VzcykgewogICAgcHJpbnQoImFsbG93X2ludGVyYWN0aXZlX2V4ZWM6IHN0YXJ0IikKCiAgICBwX29jaSA9IHBfY29udGFpbmVyLk9DSQogICAgcF9zX25hbWUgPSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc19uYW1lc3BhY2UgPSBnZXRfc3RhdGVfdmFsKCJuYW1lc3BhY2UiKQogICAgYWxsb3dfaW50ZXJhY3RpdmVfcHJvY2VzcyhwX29jaS5Qcm9jZXNzLCBpX3Byb2Nlc3MsIHBfc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfaW50ZXJhY3RpdmVfZXhlYzogdHJ1ZSIpCn0KCiMgVE9ETzogc2hvdWxkIG90aGVyIEV4ZWNQcm9jZXNzUmVxdWVzdCBpbnB1dCBkYXRhIGZpZWxkcyBiZSB2YWxpZGF0ZWQgYXMgd2VsbD8KRXhlY1Byb2Nlc3NSZXF1ZXN0IHsKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMTogaW5wdXQgPSIsIGlucHV0KQoKICAgIHNvbWUgcF9jb21tYW5kIGluIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuRXhlY1Byb2Nlc3NSZXF1ZXN0LmFsbG93ZWRfY29tbWFuZHMKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMTogcF9jb21tYW5kID0iLCBwX2NvbW1hbmQpCiAgICBwX2NvbW1hbmQgPT0gaW5wdXQucHJvY2Vzcy5BcmdzCgogICAgIyBUT0RPOiBtYXRjaCBwX2NvbnRhaW5lcidzIElEIHdpdGggdGhlIGlucHV0IGNvbnRhaW5lcl9pZC4KICAgIHNvbWUgcF9jb250YWluZXIgaW4gcG9saWN5X2RhdGEuY29udGFpbmVycwogICAgYWxsb3dfaW50ZXJhY3RpdmVfZXhlYyhwX2NvbnRhaW5lciwgaW5wdXQucHJvY2VzcykKCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDE6IHRydWUiKQp9CkV4ZWNQcm9jZXNzUmVxdWVzdCB7CiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDI6IGlucHV0ID0iLCBpbnB1dCkKCiAgICAjIFRPRE86IG1hdGNoIGlucHV0IGNvbnRhaW5lciBJRCB3aXRoIGl0cyBjb3JyZXNwb25kaW5nIGNvbnRhaW5lci5leGVjX2NvbW1hbmRzLgogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBzb21lIHBfY29tbWFuZCBpbiBwX2NvbnRhaW5lci5leGVjX2NvbW1hbmRzCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDI6IHBfY29tbWFuZCA9IiwgcF9jb21tYW5kKQoKICAgICMgVE9ETzogc2hvdWxkIG90aGVyIGlucHV0IGRhdGEgZmllbGRzIGJlIHZhbGlkYXRlZCBhcyB3ZWxsPwogICAgcF9jb21tYW5kID09IGlucHV0LnByb2Nlc3MuQXJncwoKICAgIGFsbG93X2V4ZWMocF9jb250YWluZXIsIGlucHV0LnByb2Nlc3MpCgogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAyOiB0cnVlIikKfQpFeGVjUHJvY2Vzc1JlcXVlc3QgewogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAzOiBpbnB1dCA9IiwgaW5wdXQpCgogICAgaV9jb21tYW5kID0gY29uY2F0KCIgIiwgaW5wdXQucHJvY2Vzcy5BcmdzKQogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAzOiBpX2NvbW1hbmQgPSIsIGlfY29tbWFuZCkKCiAgICBzb21lIHBfcmVnZXggaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5FeGVjUHJvY2Vzc1JlcXVlc3QucmVnZXgKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMzogcF9yZWdleCA9IiwgcF9yZWdleCkKCiAgICByZWdleC5tYXRjaChwX3JlZ2V4LCBpX2NvbW1hbmQpCgogICAgIyBUT0RPOiBtYXRjaCBwX2NvbnRhaW5lcidzIElEIHdpdGggdGhlIGlucHV0IGNvbnRhaW5lcl9pZC4KICAgIHNvbWUgcF9jb250YWluZXIgaW4gcG9saWN5X2RhdGEuY29udGFpbmVycwogICAgYWxsb3dfaW50ZXJhY3RpdmVfZXhlYyhwX2NvbnRhaW5lciwgaW5wdXQucHJvY2VzcykKCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDM6IHRydWUiKQp9CgpVcGRhdGVSb3V0ZXNSZXF1ZXN0IHsKICAgIHByaW50KCJVcGRhdGVSb3V0ZXNSZXF1ZXN0OiBpbnB1dCA9IiwgaW5wdXQpCiAgICBwcmludCgiVXBkYXRlUm91dGVzUmVxdWVzdDogcG9saWN5ID0iLCBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLlVwZGF0ZVJvdXRlc1JlcXVlc3QpCgogICAgaV9yb3V0ZXMgOj0gaW5wdXQucm91dGVzLlJvdXRlcwogICAgcF9zb3VyY2VfcmVnZXggPSBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLlVwZGF0ZVJvdXRlc1JlcXVlc3QuZm9yYmlkZGVuX3NvdXJjZV9yZWdleAogICAgcF9uYW1lcyA9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuVXBkYXRlUm91dGVzUmVxdWVzdC5mb3JiaWRkZW5fZGV2aWNlX25hbWVzCgogICAgZXZlcnkgaV9yb3V0ZSBpbiBpX3JvdXRlcyB7CiAgICAgICAgcHJpbnQoImlfcm91dGUuc291cmNlID0iLCBpX3JvdXRlLnNvdXJjZSkKICAgICAgICBldmVyeSBwX3JlZ2V4IGluIHBfc291cmNlX3JlZ2V4IHsKICAgICAgICAgICAgcHJpbnQoInBfcmVnZXggPSIsIHBfcmVnZXgpCiAgICAgICAgICAgIG5vdCByZWdleC5tYXRjaChwX3JlZ2V4LCBpX3JvdXRlLnNvdXJjZSkKICAgICAgICB9CgogICAgICAgIHByaW50KCJpX3JvdXRlLmRldmljZSA9IiwgaV9yb3V0ZS5kZXZpY2UpCiAgICAgICAgbm90IGlfcm91dGUuZGV2aWNlIGluIHBfbmFtZXMKICAgIH0KCiAgICBwcmludCgiVXBkYXRlUm91dGVzUmVxdWVzdDogdHJ1ZSIpCn0KClVwZGF0ZUludGVyZmFjZVJlcXVlc3QgewogICAgcHJpbnQoIlVwZGF0ZUludGVyZmFjZVJlcXVlc3Q6IGlucHV0ID0iLCBpbnB1dCkKICAgIHByaW50KCJVcGRhdGVJbnRlcmZhY2VSZXF1ZXN0OiBwb2xpY3kgPSIsIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuVXBkYXRlSW50ZXJmYWNlUmVxdWVzdCkKCiAgICBpX2ludGVyZmFjZSA6PSBpbnB1dC5pbnRlcmZhY2UKICAgIHBfZmxhZ3MgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmFsbG93X3Jhd19mbGFncwoKICAgICMgVHlwaWNhbGx5LCBqdXN0IElGRl9OT0FSUCBpcyB1c2VkLgogICAgYml0cy5hbmQoaV9pbnRlcmZhY2UucmF3X2ZsYWdzLCBiaXRzLm5lZ2F0ZShwX2ZsYWdzKSkgPT0gMAoKICAgIHBfbmFtZXMgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmZvcmJpZGRlbl9uYW1lcwoKICAgIG5vdCBpX2ludGVyZmFjZS5uYW1lIGluIHBfbmFtZXMKCiAgICBwX2h3YWRkcnMgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmZvcmJpZGRlbl9od19hZGRycwoKICAgIG5vdCBpX2ludGVyZmFjZS5od0FkZHIgaW4gcF9od2FkZHJzCgogICAgcHJpbnQoIlVwZGF0ZUludGVyZmFjZVJlcXVlc3Q6IHRydWUiKQp9CgpDbG9zZVN0ZGluUmVxdWVzdCB7CiAgICBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLkNsb3NlU3RkaW5SZXF1ZXN0ID09IHRydWUKfQoKUmVhZFN0cmVhbVJlcXVlc3QgewogICAgcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5SZWFkU3RyZWFtUmVxdWVzdCA9PSB0cnVlCn0KClVwZGF0ZUVwaGVtZXJhbE1vdW50c1JlcXVlc3QgewogICAgcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVFcGhlbWVyYWxNb3VudHNSZXF1ZXN0ID09IHRydWUKfQoKV3JpdGVTdHJlYW1SZXF1ZXN0IHsKICAgIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuV3JpdGVTdHJlYW1SZXF1ZXN0ID09IHRydWUKfQoKcG9saWN5X2RhdGEgOj0gewogICJjb250YWluZXJzIjogWwogICAgewogICAgICAiT0NJIjogewogICAgICAgICJWZXJzaW9uIjogIjEuMS4wLXJjLjEiLAogICAgICAgICJQcm9jZXNzIjogewogICAgICAgICAgIlRlcm1pbmFsIjogZmFsc2UsCiAgICAgICAgICAiVXNlciI6IHsKICAgICAgICAgICAgIlVJRCI6IDY1NTM1LAogICAgICAgICAgICAiR0lEIjogNjU1MzUsCiAgICAgICAgICAgICJBZGRpdGlvbmFsR2lkcyI6IFtdLAogICAgICAgICAgICAiVXNlcm5hbWUiOiAiIgogICAgICAgICAgfSwKICAgICAgICAgICJEZXByZWNhdGVkQXJncyI6IFsKICAgICAgICAgICAgIi9wYXVzZSIKICAgICAgICAgIF0sCiAgICAgICAgICAiQXJncyI6IFsKICAgICAgICAgICAgIi9wYXVzZSIKICAgICAgICAgIF0sCiAgICAgICAgICAiRW52IjogWwogICAgICAgICAgICAiUEFUSD0vdXNyL2xvY2FsL3NiaW46L3Vzci9sb2NhbC9iaW46L3Vzci9zYmluOi91c3IvYmluOi9zYmluOi9iaW4iCiAgICAgICAgICBdLAogICAgICAgICAgIkN3ZCI6ICIvIiwKICAgICAgICAgICJDYXBhYmlsaXRpZXMiOiB7CiAgICAgICAgICAgICJBbWJpZW50IjogW10sCiAgICAgICAgICAgICJCb3VuZGluZyI6IFsKICAgICAgICAgICAgICAiJChkZWZhdWx0X2NhcHMpIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiRWZmZWN0aXZlIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJJbmhlcml0YWJsZSI6IFtdLAogICAgICAgICAgICAiUGVybWl0dGVkIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICAiTm9OZXdQcml2aWxlZ2VzIjogdHJ1ZQogICAgICAgIH0sCiAgICAgICAgIlJvb3QiOiB7CiAgICAgICAgICAiUGF0aCI6ICIkKGNwYXRoKS8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgIlJlYWRvbmx5IjogdHJ1ZQogICAgICAgIH0sCiAgICAgICAgIk1vdW50cyI6IFsKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9wcm9jIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJwcm9jIiwKICAgICAgICAgICAgInR5cGVfIjogInByb2MiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2IiwKICAgICAgICAgICAgInNvdXJjZSI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJzdHJpY3RhdGltZSIsCiAgICAgICAgICAgICAgIm1vZGU9NzU1IiwKICAgICAgICAgICAgICAic2l6ZT02NTUzNmsiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L3B0cyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiZGV2cHRzIiwKICAgICAgICAgICAgInR5cGVfIjogImRldnB0cyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJuZXdpbnN0YW5jZSIsCiAgICAgICAgICAgICAgInB0bXhtb2RlPTA2NjYiLAogICAgICAgICAgICAgICJtb2RlPTA2MjAiLAogICAgICAgICAgICAgICJnaWQ9NSIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvc2htIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L3NobSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi9tcXVldWUiLAogICAgICAgICAgICAic291cmNlIjogIm1xdWV1ZSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJtcXVldWUiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvc3lzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJzeXNmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJzeXNmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2V0Yy9yZXNvbHYuY29uZiIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClyZXNvbHYuY29uZiQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJvIiwKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9kZXYiLAogICAgICAgICAgICAgICJub2V4ZWMiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0KICAgICAgICBdLAogICAgICAgICJBbm5vdGF0aW9ucyI6IHsKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmJ1bmRsZV9wYXRoIjogIi9ydW4vY29udGFpbmVyZC9pby5jb250YWluZXJkLnJ1bnRpbWUudjIudGFzay9rOHMuaW8vJChidW5kbGUtaWQpIiwKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIjogInBvZF9zYW5kYm94IiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSI6ICJzYW5kYm94IiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWlkIjogIl5bYS16MC05XXs2NH0kIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWxvZy1kaXJlY3RvcnkiOiAiXi92YXIvbG9nL3BvZHMvJChzYW5kYm94LW5hbWVzcGFjZSlfJChzYW5kYm94LW5hbWUpX1swLTlhLWZdezh9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezEyfSQiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZSI6ICJeYXp1cmVcXC1maWxlXFwtc2VjcmV0cyQiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZXNwYWNlIjogIiIsCiAgICAgICAgICAibmVyZGN0bC9uZXR3b3JrLW5hbWVzcGFjZSI6ICJeL3Zhci9ydW4vbmV0bnMvY25pLVswLTlhLWZdezh9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezEyfSQiCiAgICAgICAgfSwKICAgICAgICAiTGludXgiOiB7CiAgICAgICAgICAiTmFtZXNwYWNlcyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICJUeXBlIjogImlwYyIsCiAgICAgICAgICAgICAgIlBhdGgiOiAiIgogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgIlR5cGUiOiAidXRzIiwKICAgICAgICAgICAgICAiUGF0aCI6ICIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiVHlwZSI6ICJtb3VudCIsCiAgICAgICAgICAgICAgIlBhdGgiOiAiIgogICAgICAgICAgICB9CiAgICAgICAgICBdLAogICAgICAgICAgIk1hc2tlZFBhdGhzIjogWwogICAgICAgICAgICAiL3Byb2MvYWNwaSIsCiAgICAgICAgICAgICIvcHJvYy9hc291bmQiLAogICAgICAgICAgICAiL3Byb2Mva2NvcmUiLAogICAgICAgICAgICAiL3Byb2Mva2V5cyIsCiAgICAgICAgICAgICIvcHJvYy9sYXRlbmN5X3N0YXRzIiwKICAgICAgICAgICAgIi9wcm9jL3RpbWVyX2xpc3QiLAogICAgICAgICAgICAiL3Byb2MvdGltZXJfc3RhdHMiLAogICAgICAgICAgICAiL3Byb2Mvc2NoZWRfZGVidWciLAogICAgICAgICAgICAiL3N5cy9maXJtd2FyZSIsCiAgICAgICAgICAgICIvcHJvYy9zY3NpIgogICAgICAgICAgXSwKICAgICAgICAgICJSZWFkb25seVBhdGhzIjogWwogICAgICAgICAgICAiL3Byb2MvYnVzIiwKICAgICAgICAgICAgIi9wcm9jL2ZzIiwKICAgICAgICAgICAgIi9wcm9jL2lycSIsCiAgICAgICAgICAgICIvcHJvYy9zeXMiLAogICAgICAgICAgICAiL3Byb2Mvc3lzcnEtdHJpZ2dlciIKICAgICAgICAgIF0sCiAgICAgICAgICAiRGV2aWNlcyI6IFtdLAogICAgICAgICAgIlN5c2N0bCI6IHsKICAgICAgICAgICAgIm5ldC5pcHY0LmlwX3VucHJpdmlsZWdlZF9wb3J0X3N0YXJ0IjogIjAiLAogICAgICAgICAgICAibmV0LmlwdjQucGluZ19ncm91cF9yYW5nZSI6ICIwIDIxNDc0ODM2NDciCiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9LAogICAgICAic3RvcmFnZXMiOiBbCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJibGsiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogInRhciIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIiQoaGFzaDApIgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGxheWVyMCkiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJvdmVybGF5ZnMiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogImZ1c2UzLmthdGEtb3ZlcmxheSIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIjVhNWFhZDgwMDU1ZmYyMDAxMmE1MGRjMjVmOGRmN2EyOTkyNDQ3NDMyNGQ2NWY3ZDUzMDZlZThlZTI3ZmY3MWQiLAogICAgICAgICAgICAiODE3MjUwZjFhM2UzMzZkYTc2ZjViZDNmYTc4NGUxYjI2ZDk1OWI5YzEzMTg3NjgxNWJhMjYwNDA0OGI3MGMxOCIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChjcGF0aCkvJChidW5kbGUtaWQpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9CiAgICAgIF0sCiAgICAgICJkZXZpY2VzIjogW10sCiAgICAgICJzYW5kYm94X3BpZG5zIjogZmFsc2UsCiAgICAgICJleGVjX2NvbW1hbmRzIjogW10sCiAgICAgICJlbnZfbWFwIjogewogICAgICAgICJQQVRIIjogIi91c3IvbG9jYWwvc2JpbjovdXNyL2xvY2FsL2JpbjovdXNyL3NiaW46L3Vzci9iaW46L3NiaW46L2JpbiIKICAgICAgfQogICAgfSwKICAgIHsKICAgICAgIk9DSSI6IHsKICAgICAgICAiVmVyc2lvbiI6ICIxLjEuMC1yYy4xIiwKICAgICAgICAiUHJvY2VzcyI6IHsKICAgICAgICAgICJUZXJtaW5hbCI6IGZhbHNlLAogICAgICAgICAgIlVzZXIiOiB7CiAgICAgICAgICAgICJVSUQiOiAwLAogICAgICAgICAgICAiR0lEIjogMCwKICAgICAgICAgICAgIkFkZGl0aW9uYWxHaWRzIjogW10sCiAgICAgICAgICAgICJVc2VybmFtZSI6ICIiCiAgICAgICAgICB9LAogICAgICAgICAgIkRlcHJlY2F0ZWRBcmdzIjogWwogICAgICAgICAgICAic2giCiAgICAgICAgICBdLAogICAgICAgICAgIkFyZ3MiOiBbCiAgICAgICAgICAgICJzaCIKICAgICAgICAgIF0sCiAgICAgICAgICAiRW52IjogWwogICAgICAgICAgICAiUEFUSD0vdXNyL2xvY2FsL3NiaW46L3Vzci9sb2NhbC9iaW46L3Vzci9zYmluOi91c3IvYmluOi9zYmluOi9iaW4iLAogICAgICAgICAgICAiSE9TVE5BTUU9JChob3N0LW5hbWUpIgogICAgICAgICAgXSwKICAgICAgICAgICJDd2QiOiAiLyIsCiAgICAgICAgICAiQ2FwYWJpbGl0aWVzIjogewogICAgICAgICAgICAiQW1iaWVudCI6IFtdLAogICAgICAgICAgICAiQm91bmRpbmciOiBbCiAgICAgICAgICAgICAgIiQoZGVmYXVsdF9jYXBzKSIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgIkVmZmVjdGl2ZSI6IFsKICAgICAgICAgICAgICAiJChkZWZhdWx0X2NhcHMpIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiSW5oZXJpdGFibGUiOiBbXSwKICAgICAgICAgICAgIlBlcm1pdHRlZCI6IFsKICAgICAgICAgICAgICAiJChkZWZhdWx0X2NhcHMpIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgIk5vTmV3UHJpdmlsZWdlcyI6IGZhbHNlCiAgICAgICAgfSwKICAgICAgICAiUm9vdCI6IHsKICAgICAgICAgICJQYXRoIjogIiQoY3BhdGgpLyQoYnVuZGxlLWlkKSIsCiAgICAgICAgICAiUmVhZG9ubHkiOiB0cnVlCiAgICAgICAgfSwKICAgICAgICAiTW91bnRzIjogWwogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL3Byb2MiLAogICAgICAgICAgICAic291cmNlIjogInByb2MiLAogICAgICAgICAgICAidHlwZV8iOiAicHJvYyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYiLAogICAgICAgICAgICAic291cmNlIjogInRtcGZzIiwKICAgICAgICAgICAgInR5cGVfIjogInRtcGZzIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgInN0cmljdGF0aW1lIiwKICAgICAgICAgICAgICAibW9kZT03NTUiLAogICAgICAgICAgICAgICJzaXplPTY1NTM2ayIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvcHRzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJkZXZwdHMiLAogICAgICAgICAgICAidHlwZV8iOiAiZGV2cHRzIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAgICAgIm5ld2luc3RhbmNlIiwKICAgICAgICAgICAgICAicHRteG1vZGU9MDY2NiIsCiAgICAgICAgICAgICAgIm1vZGU9MDYyMCIsCiAgICAgICAgICAgICAgImdpZD01IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi9zaG0iLAogICAgICAgICAgICAic291cmNlIjogIi9ydW4va2F0YS1jb250YWluZXJzL3NhbmRib3gvc2htIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L21xdWV1ZSIsCiAgICAgICAgICAgICJzb3VyY2UiOiAibXF1ZXVlIiwKICAgICAgICAgICAgInR5cGVfIjogIm1xdWV1ZSIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9zeXMiLAogICAgICAgICAgICAic291cmNlIjogInN5c2ZzIiwKICAgICAgICAgICAgInR5cGVfIjogInN5c2ZzIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAgICAgIm5vZGV2IiwKICAgICAgICAgICAgICAicm8iCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvc3lzL2ZzL2Nncm91cCIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiY2dyb3VwIiwKICAgICAgICAgICAgInR5cGVfIjogImNncm91cCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIsCiAgICAgICAgICAgICAgInJlbGF0aW1lIiwKICAgICAgICAgICAgICAicm8iCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZXRjL2hvc3RzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KWhvc3RzJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJydyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvdGVybWluYXRpb24tbG9nIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KXRlcm1pbmF0aW9uLWxvZyQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicnciCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZXRjL2hvc3RuYW1lIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KWhvc3RuYW1lJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJybyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9ldGMvcmVzb2x2LmNvbmYiLAogICAgICAgICAgICAic291cmNlIjogIiQoc2ZwcmVmaXgpcmVzb2x2LmNvbmYkIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL3Zhci9ydW4vc2VjcmV0cy9rdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50IiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KXNlcnZpY2VhY2NvdW50JCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJybyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi92YXIvcnVuL3NlY3JldHMvYXp1cmUvdG9rZW5zIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KXRva2VucyQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicm8iCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvbW50L3BlcmZzaGFyZSIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClwZXJmc2hhcmUkIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJ3IgogICAgICAgICAgICBdCiAgICAgICAgICB9CiAgICAgICAgXSwKICAgICAgICAiQW5ub3RhdGlvbnMiOiB7CiAgICAgICAgICAiaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5idW5kbGVfcGF0aCI6ICIvcnVuL2NvbnRhaW5lcmQvaW8uY29udGFpbmVyZC5ydW50aW1lLnYyLnRhc2svazhzLmlvLyQoYnVuZGxlLWlkKSIsCiAgICAgICAgICAiaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5jb250YWluZXJfdHlwZSI6ICJwb2RfY29udGFpbmVyIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItbmFtZSI6ICJidXN5Ym94IiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSI6ICJjb250YWluZXIiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLmltYWdlLW5hbWUiOiAibWNyLm1pY3Jvc29mdC5jb20vYWtzL2UyZS9saWJyYXJ5LWJ1c3lib3g6bWFzdGVyLjIyMDMxNC4xLWxpbnV4LWFtZDY0IiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWlkIjogIl5bYS16MC05XXs2NH0kIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LW5hbWUiOiAiXmF6dXJlXFwtZmlsZVxcLXNlY3JldHMkIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LW5hbWVzcGFjZSI6ICIiCiAgICAgICAgfSwKICAgICAgICAiTGludXgiOiB7CiAgICAgICAgICAiTmFtZXNwYWNlcyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICJUeXBlIjogImlwYyIsCiAgICAgICAgICAgICAgIlBhdGgiOiAiIgogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgIlR5cGUiOiAidXRzIiwKICAgICAgICAgICAgICAiUGF0aCI6ICIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiVHlwZSI6ICJtb3VudCIsCiAgICAgICAgICAgICAgIlBhdGgiOiAiIgogICAgICAgICAgICB9CiAgICAgICAgICBdLAogICAgICAgICAgIk1hc2tlZFBhdGhzIjogWwogICAgICAgICAgICAiL3Byb2MvYWNwaSIsCiAgICAgICAgICAgICIvcHJvYy9rY29yZSIsCiAgICAgICAgICAgICIvcHJvYy9rZXlzIiwKICAgICAgICAgICAgIi9wcm9jL2xhdGVuY3lfc3RhdHMiLAogICAgICAgICAgICAiL3Byb2MvdGltZXJfbGlzdCIsCiAgICAgICAgICAgICIvcHJvYy90aW1lcl9zdGF0cyIsCiAgICAgICAgICAgICIvcHJvYy9zY2hlZF9kZWJ1ZyIsCiAgICAgICAgICAgICIvcHJvYy9zY3NpIiwKICAgICAgICAgICAgIi9zeXMvZmlybXdhcmUiCiAgICAgICAgICBdLAogICAgICAgICAgIlJlYWRvbmx5UGF0aHMiOiBbCiAgICAgICAgICAgICIvcHJvYy9hc291bmQiLAogICAgICAgICAgICAiL3Byb2MvYnVzIiwKICAgICAgICAgICAgIi9wcm9jL2ZzIiwKICAgICAgICAgICAgIi9wcm9jL2lycSIsCiAgICAgICAgICAgICIvcHJvYy9zeXMiLAogICAgICAgICAgICAiL3Byb2Mvc3lzcnEtdHJpZ2dlciIKICAgICAgICAgIF0sCiAgICAgICAgICAiRGV2aWNlcyI6IFtdLAogICAgICAgICAgIlN5c2N0bCI6IHsKICAgICAgICAgICAgIm5ldC5pcHY0LmlwX3VucHJpdmlsZWdlZF9wb3J0X3N0YXJ0IjogIjAiLAogICAgICAgICAgICAibmV0LmlwdjQucGluZ19ncm91cF9yYW5nZSI6ICIwIDIxNDc0ODM2NDciCiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9LAogICAgICAic3RvcmFnZXMiOiBbCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJibGsiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogInRhciIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIiQoaGFzaDApIgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGxheWVyMCkiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJibGsiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogInRhciIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIiQoaGFzaDEpIgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGxheWVyMSkiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJvdmVybGF5ZnMiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogImZ1c2UzLmthdGEtb3ZlcmxheSIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIjJjMzQyYTEzN2U2OTNjNzg5OGFlYzM2ZGExMDQ3ZjE5MWRjN2MxNjg3ZTY2MTk4YWRhY2M0MzljZjRhZGYzNzk6MjU3MGUzYTE5ZTFiZjIwZGRkYTQ1NDk4YTk2MjdmNjE1NTVkMmQ2YzAxNDc5YjliNzY0NjBiNjc5YjI3ZDU1MiIsCiAgICAgICAgICAgICI4NTY4YzcwYzBjY2ZlMDA1MTA5MmU4MThkYTc2OTExMWE1OTg4MmNkMTlkZDc5OWQzYmNhNWZmYTgyNzkxMDgwOmI2NDNiNjIxNzc0ODk4MzgzMGIyNmFjMTRhMzVhMzMyMmRkNTI4YzAwOTYzZWFhZGQ5MWVmNTVmNTEzZGM3M2YiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQoY3BhdGgpLyQoYnVuZGxlLWlkKSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfQogICAgICBdLAogICAgICAiZGV2aWNlcyI6IFtdLAogICAgICAic2FuZGJveF9waWRucyI6IGZhbHNlLAogICAgICAiZXhlY19jb21tYW5kcyI6IFtdLAogICAgICAiZW52X21hcCI6IHsKICAgICAgICAiSE9TVE5BTUUiOiAiJChob3N0LW5hbWUpIiwKICAgICAgICAiUEFUSCI6ICIvdXNyL2xvY2FsL3NiaW46L3Vzci9sb2NhbC9iaW46L3Vzci9zYmluOi91c3IvYmluOi9zYmluOi9iaW4iCiAgICAgIH0KICAgIH0KICBdLAogICJjb21tb24iOiB7CiAgICAiY3BhdGgiOiAiL3J1bi9rYXRhLWNvbnRhaW5lcnMvc2hhcmVkL2NvbnRhaW5lcnMiLAogICAgIm1vdW50X3NvdXJjZV9jcGF0aCI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zaGFyZWQvY29udGFpbmVycyIsCiAgICAic2ZwcmVmaXgiOiAiXiQoY3BhdGgpLyQoYnVuZGxlLWlkKS1bYS16MC05XXsxNn0tIiwKICAgICJzcGF0aCI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L3N0b3JhZ2UiLAogICAgImlwdjRfYSI6ICIoKFswLTldfFsxLTldWzAtOV18MVswLTldezJ9fDJbMC00XVswLTldfDI1WzAtNV0pXFwuKXszfShbMC05XXxbMS05XVswLTldfDFbMC05XXsyfXwyWzAtNF1bMC05XXwyNVswLTVdKSIsCiAgICAiaXBfcCI6ICJbMC05XXsxLDV9IiwKICAgICJzdmNfbmFtZSI6ICJbQS1aX1xcLlxcLV0rIiwKICAgICJkbnNfbGFiZWwiOiAiW2EtekEtWjAtOV9cXC5cXC1dKyIsCiAgICAic19zb3VyY2UxIjogIl4uLjJbMC05XXszfV9bMC0xXVswLTldX1swLTNdWzAtOV1fWzAtMl1bMC05XV9bMC01XVswLTldX1swLTVdWzAtOV1cXC5bMC05XXsxLDEwfSQiLAogICAgInNfc291cmNlMiI6ICJeLi5kYXRhLyIsCiAgICAiZG5zX3N1YmRvbWFpbiI6ICJeW2EtejAtOV0oWy1hLXowLTldKlthLXowLTldKT8kIiwKICAgICJwb2RfdWlkIjogIl5bMC05YS1mQS1GXXs4fS1bMC05YS1mQS1GXXs0fS1bMC05YS1mQS1GXXs0fS1bMC05YS1mQS1GXXs0fS1bMC05YS1mQS1GXXsxMn0kIiwKICAgICJkZWZhdWx0X2NhcHMiOiBbCiAgICAgICJDQVBfQ0hPV04iLAogICAgICAiQ0FQX0RBQ19PVkVSUklERSIsCiAgICAgICJDQVBfRlNFVElEIiwKICAgICAgIkNBUF9GT1dORVIiLAogICAgICAiQ0FQX01LTk9EIiwKICAgICAgIkNBUF9ORVRfUkFXIiwKICAgICAgIkNBUF9TRVRHSUQiLAogICAgICAiQ0FQX1NFVFVJRCIsCiAgICAgICJDQVBfU0VURkNBUCIsCiAgICAgICJDQVBfU0VUUENBUCIsCiAgICAgICJDQVBfTkVUX0JJTkRfU0VSVklDRSIsCiAgICAgICJDQVBfU1lTX0NIUk9PVCIsCiAgICAgICJDQVBfS0lMTCIsCiAgICAgICJDQVBfQVVESVRfV1JJVEUiCiAgICBdLAogICAgInByaXZpbGVnZWRfY2FwcyI6IFsKICAgICAgIkNBUF9DSE9XTiIsCiAgICAgICJDQVBfREFDX09WRVJSSURFIiwKICAgICAgIkNBUF9EQUNfUkVBRF9TRUFSQ0giLAogICAgICAiQ0FQX0ZPV05FUiIsCiAgICAgICJDQVBfRlNFVElEIiwKICAgICAgIkNBUF9LSUxMIiwKICAgICAgIkNBUF9TRVRHSUQiLAogICAgICAiQ0FQX1NFVFVJRCIsCiAgICAgICJDQVBfU0VUUENBUCIsCiAgICAgICJDQVBfTElOVVhfSU1NVVRBQkxFIiwKICAgICAgIkNBUF9ORVRfQklORF9TRVJWSUNFIiwKICAgICAgIkNBUF9ORVRfQlJPQURDQVNUIiwKICAgICAgIkNBUF9ORVRfQURNSU4iLAogICAgICAiQ0FQX05FVF9SQVciLAogICAgICAiQ0FQX0lQQ19MT0NLIiwKICAgICAgIkNBUF9JUENfT1dORVIiLAogICAgICAiQ0FQX1NZU19NT0RVTEUiLAogICAgICAiQ0FQX1NZU19SQVdJTyIsCiAgICAgICJDQVBfU1lTX0NIUk9PVCIsCiAgICAgICJDQVBfU1lTX1BUUkFDRSIsCiAgICAgICJDQVBfU1lTX1BBQ0NUIiwKICAgICAgIkNBUF9TWVNfQURNSU4iLAogICAgICAiQ0FQX1NZU19CT09UIiwKICAgICAgIkNBUF9TWVNfTklDRSIsCiAgICAgICJDQVBfU1lTX1JFU09VUkNFIiwKICAgICAgIkNBUF9TWVNfVElNRSIsCiAgICAgICJDQVBfU1lTX1RUWV9DT05GSUciLAogICAgICAiQ0FQX01LTk9EIiwKICAgICAgIkNBUF9MRUFTRSIsCiAgICAgICJDQVBfQVVESVRfV1JJVEUiLAogICAgICAiQ0FQX0FVRElUX0NPTlRST0wiLAogICAgICAiQ0FQX1NFVEZDQVAiLAogICAgICAiQ0FQX01BQ19PVkVSUklERSIsCiAgICAgICJDQVBfTUFDX0FETUlOIiwKICAgICAgIkNBUF9TWVNMT0ciLAogICAgICAiQ0FQX1dBS0VfQUxBUk0iLAogICAgICAiQ0FQX0JMT0NLX1NVU1BFTkQiLAogICAgICAiQ0FQX0FVRElUX1JFQUQiLAogICAgICAiQ0FQX1BFUkZNT04iLAogICAgICAiQ0FQX0JQRiIsCiAgICAgICJDQVBfQ0hFQ0tQT0lOVF9SRVNUT1JFIgogICAgXSwKICAgICJ2aXJ0aW9fYmxrX3N0b3JhZ2VfY2xhc3NlcyI6IFsKICAgICAgImNjLWxvY2FsLWNzaSIsCiAgICAgICJjYy1tYW5hZ2VkLWNzaSIsCiAgICAgICJjYy1tYW5hZ2VkLXByZW1pdW0tY3NpIgogICAgXSwKICAgICJzbWJfc3RvcmFnZV9jbGFzc2VzIjogWwogICAgICB7CiAgICAgICAgIm5hbWUiOiAiYXp1cmVmaWxlLWNzaS1rYXRhLWNjIiwKICAgICAgICAibW91bnRfb3B0aW9ucyI6IFsKICAgICAgICAgICJkaXJfbW9kZT0wNzc3IiwKICAgICAgICAgICJmaWxlX21vZGU9MDc3NyIsCiAgICAgICAgICAibWZzeW1saW5rcyIsCiAgICAgICAgICAiY2FjaGU9c3RyaWN0IiwKICAgICAgICAgICJub3NoYXJlc29jayIsCiAgICAgICAgICAiYWN0aW1lbz0zMCIsCiAgICAgICAgICAibm9icmwiCiAgICAgICAgXQogICAgICB9CiAgICBdCiAgfSwKICAic2FuZGJveCI6IHsKICAgICJzdG9yYWdlcyI6IFsKICAgICAgewogICAgICAgICJkcml2ZXIiOiAiZXBoZW1lcmFsIiwKICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAic291cmNlIjogInNobSIsCiAgICAgICAgImZzdHlwZSI6ICJ0bXBmcyIsCiAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgIm5vZGV2IiwKICAgICAgICAgICJtb2RlPTE3NzciLAogICAgICAgICAgInNpemU9NjcxMDg4NjQiCiAgICAgICAgXSwKICAgICAgICAibW91bnRfcG9pbnQiOiAiL3J1bi9rYXRhLWNvbnRhaW5lcnMvc2FuZGJveC9zaG0iLAogICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgfQogICAgXQogIH0sCiAgInJlcXVlc3RfZGVmYXVsdHMiOiB7CiAgICAiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdCI6IHsKICAgICAgImFsbG93X2Vudl9yZWdleCI6IFsKICAgICAgICAiXkhPU1ROQU1FPSQoZG5zX2xhYmVsKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfUE9SVF8kKGlwX3ApX1RDUD10Y3A6Ly8kKGlwdjRfYSk6JChpcF9wKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfUE9SVF8kKGlwX3ApX1RDUF9QUk9UTz10Y3AkIiwKICAgICAgICAiXiQoc3ZjX25hbWUpX1BPUlRfJChpcF9wKV9UQ1BfUE9SVD0kKGlwX3ApJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9QT1JUXyQoaXBfcClfVENQX0FERFI9JChpcHY0X2EpJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9TRVJWSUNFX0hPU1Q9JChpcHY0X2EpJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9TRVJWSUNFX1BPUlQ9JChpcF9wKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfU0VSVklDRV9QT1JUXyQoZG5zX2xhYmVsKT0kKGlwX3ApJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9QT1JUPXRjcDovLyQoaXB2NF9hKTokKGlwX3ApJCIsCiAgICAgICAgIl5BWlVSRV9DTElFTlRfSUQ9W0EtRmEtZjAtOS1dKiQiLAogICAgICAgICJeQVpVUkVfVEVOQU5UX0lEPVtBLUZhLWYwLTktXSokIiwKICAgICAgICAiXkFaVVJFX0ZFREVSQVRFRF9UT0tFTl9GSUxFPS92YXIvcnVuL3NlY3JldHMvYXp1cmUvdG9rZW5zL2F6dXJlLWlkZW50aXR5LXRva2VuJCIsCiAgICAgICAgIl5BWlVSRV9BVVRIT1JJVFlfSE9TVD1odHRwczovL2xvZ2luXFwubWljcm9zb2Z0b25saW5lXFwuY29tLyQiLAogICAgICAgICJeVEVSTT14dGVybSQiCiAgICAgIF0sCiAgICAgICJhbGxvd19lbnZfcmVnZXhfbWFwIjogewogICAgICAgICJDUFVfTElNSVQiOiAiXlswLTldKyQiLAogICAgICAgICJKT0JfQ09NUExFVElPTl9JTkRFWCI6ICJeWzAtOV0qJCIsCiAgICAgICAgIk1FTU9SWV9MSU1JVCI6ICJeWzAtOV0rJCIKICAgICAgfQogICAgfSwKICAgICJDb3B5RmlsZVJlcXVlc3QiOiBbCiAgICAgICIkKHNmcHJlZml4KSIKICAgIF0sCiAgICAiRXhlY1Byb2Nlc3NSZXF1ZXN0IjogewogICAgICAiYWxsb3dlZF9jb21tYW5kcyI6IFtdLAogICAgICAicmVnZXgiOiBbXQogICAgfSwKICAgICJVcGRhdGVSb3V0ZXNSZXF1ZXN0IjogewogICAgICAiZm9yYmlkZGVuX2RldmljZV9uYW1lcyI6IFsKICAgICAgICAibG8iCiAgICAgIF0sCiAgICAgICJmb3JiaWRkZW5fc291cmNlX3JlZ2V4IjogWwogICAgICAgICJeKD86MHswLDR9Oil7MCw3fTB7MCwzfTEkIiwKICAgICAgICAiXjEyN1xcLig/OlswLTldezEsM31cXC4pezJ9WzAtOV17MSwzfSQiCiAgICAgIF0KICAgIH0sCiAgICAiVXBkYXRlSW50ZXJmYWNlUmVxdWVzdCI6IHsKICAgICAgImFsbG93X3Jhd19mbGFncyI6IDEyOCwKICAgICAgImZvcmJpZGRlbl9uYW1lcyI6IFsKICAgICAgICAibG8iCiAgICAgIF0sCiAgICAgICJmb3JiaWRkZW5faHdfYWRkcnMiOiBbCiAgICAgICAgIjAwOjAwOjAwOjAwOjAwOjAwIgogICAgICBdCiAgICB9LAogICAgIkNsb3NlU3RkaW5SZXF1ZXN0IjogZmFsc2UsCiAgICAiUmVhZFN0cmVhbVJlcXVlc3QiOiBmYWxzZSwKICAgICJVcGRhdGVFcGhlbWVyYWxNb3VudHNSZXF1ZXN0IjogZmFsc2UsCiAgICAiV3JpdGVTdHJlYW1SZXF1ZXN0IjogZmFsc2UKICB9Cn0= +spec: + restartPolicy: Never + runtimeClassName: kata-cc + containers: + - name: busybox + image: "mcr.microsoft.com/aks/e2e/library-busybox:master.220314.1-linux-amd64" + securityContext: + readOnlyRootFilesystem: true + volumeMounts: + - mountPath: /mnt/perfshare + name: perfshare + volumes: + - name: perfshare + azureFile: + secretName: azure-secret + shareName: tempshare + readOnly: false diff --git a/src/agent/samples/policy/yaml/secrets/pull-secrets.yaml b/src/agent/samples/policy/yaml/secrets/pull-secrets.yaml new file mode 100644 index 000000000000..5ac76b989cac --- /dev/null +++ b/src/agent/samples/policy/yaml/secrets/pull-secrets.yaml @@ -0,0 +1,20 @@ +--- +apiVersion: v1 +kind: Pod +metadata: + name: pull-secrets +spec: + restartPolicy: Never + runtimeClassName: kata-cc + imagePullSecrets: + - name: acr-secret + containers: + - name: dmihai-redis + image: "dmihaiacr.azurecr.io/redis:6.0.8" + imagePullPolicy: Always + env: + - name: ALLOW_EMPTY_PASSWORD + value: "yes" + ports: + - containerPort: 6379 + name: redis diff --git a/src/agent/samples/policy/yaml/stateful-set/web.yaml b/src/agent/samples/policy/yaml/stateful-set/web.yaml new file mode 100644 index 000000000000..d700c3dfba9b --- /dev/null +++ b/src/agent/samples/policy/yaml/stateful-set/web.yaml @@ -0,0 +1,85 @@ +--- +apiVersion: v1 +kind: Service +metadata: + name: nginx + labels: + app: nginx +spec: + selector: + app: nginx + ports: + - port: 80 + name: web + clusterIP: None +--- +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: web +spec: + podManagementPolicy: Parallel + serviceName: nginx + replicas: 2 + selector: + matchLabels: + app: nginx + template: + metadata: + labels: + app: nginx + annotations: + io.katacontainers.config.agent.policy: IyBDb3B5cmlnaHQgKGMpIDIwMjMgTWljcm9zb2Z0IENvcnBvcmF0aW9uCiMKIyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMAojCnBhY2thZ2UgYWdlbnRfcG9saWN5CgppbXBvcnQgZnV0dXJlLmtleXdvcmRzLmluCmltcG9ydCBmdXR1cmUua2V5d29yZHMuZXZlcnkKCiMgRGVmYXVsdCB2YWx1ZXMsIHJldHVybmVkIGJ5IE9QQSB3aGVuIHJ1bGVzIGNhbm5vdCBiZSBldmFsdWF0ZWQgdG8gdHJ1ZS4KZGVmYXVsdCBBZGRBUlBOZWlnaGJvcnNSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgQWRkU3dhcFJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBDbG9zZVN0ZGluUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IENvcHlGaWxlUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IENyZWF0ZUNvbnRhaW5lclJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBDcmVhdGVTYW5kYm94UmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IERlc3Ryb3lTYW5kYm94UmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgRXhlY1Byb2Nlc3NSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgR2V0T09NRXZlbnRSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBHdWVzdERldGFpbHNSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBMaXN0SW50ZXJmYWNlc1JlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBMaXN0Um91dGVzUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IE1lbUhvdHBsdWdCeVByb2JlUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IE9ubGluZUNQVU1lbVJlcXVlc3QgOj0gdHJ1ZQpkZWZhdWx0IFBhdXNlQ29udGFpbmVyUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFJlYWRTdHJlYW1SZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgUmVtb3ZlQ29udGFpbmVyUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgUmVtb3ZlU3RhbGVWaXJ0aW9mc1NoYXJlTW91bnRzUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgUmVzZWVkUmFuZG9tRGV2UmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFJlc3VtZUNvbnRhaW5lclJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBTZXRHdWVzdERhdGVUaW1lUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFNldFBvbGljeVJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBTaWduYWxQcm9jZXNzUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgU3RhcnRDb250YWluZXJSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBTdGFydFRyYWNpbmdSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgU3RhdHNDb250YWluZXJSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBTdG9wVHJhY2luZ1JlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBUdHlXaW5SZXNpemVSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBVcGRhdGVDb250YWluZXJSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgVXBkYXRlRXBoZW1lcmFsTW91bnRzUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFVwZGF0ZUludGVyZmFjZVJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBVcGRhdGVSb3V0ZXNSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgV2FpdFByb2Nlc3NSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBXcml0ZVN0cmVhbVJlcXVlc3QgOj0gZmFsc2UKCiMgQWxsb3dSZXF1ZXN0c0ZhaWxpbmdQb2xpY3kgOj0gdHJ1ZSBjb25maWd1cmVzIHRoZSBBZ2VudCB0byAqYWxsb3cgYW55CiMgcmVxdWVzdHMgY2F1c2luZyBhIHBvbGljeSBmYWlsdXJlKi4gVGhpcyBpcyBhbiB1bnNlY3VyZSBjb25maWd1cmF0aW9uCiMgYnV0IGlzIHVzZWZ1bCBmb3IgYWxsb3dpbmcgdW5zZWN1cmUgcG9kcyB0byBzdGFydCwgdGhlbiBjb25uZWN0IHRvCiMgdGhlbSBhbmQgaW5zcGVjdCBPUEEgbG9ncyBmb3IgdGhlIHJvb3QgY2F1c2Ugb2YgYSBmYWlsdXJlLgpkZWZhdWx0IEFsbG93UmVxdWVzdHNGYWlsaW5nUG9saWN5IDo9IGZhbHNlCgojIENvbnN0YW50cwpTX05BTUVfS0VZID0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZSIKU19OQU1FU1BBQ0VfS0VZID0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZXNwYWNlIgpCVU5ETEVfSUQgPSAiW2EtejAtOV17NjR9IgoKQ3JlYXRlQ29udGFpbmVyUmVxdWVzdDo9IHJlc3AgewogICAgbm90IGlzX251bGwoaW5wdXQuZW52X21hcCkKICAgIAogICAgaV9lbnZfbWFwIDo9IGlucHV0LmVudl9tYXAKICAgIAogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBwX2Vudl9tYXAgOj0gcF9jb250YWluZXIuZW52X21hcCAgCiAgICBhbGxvd19lbnZfbWFwKHBfZW52X21hcCwgaV9lbnZfbWFwKQogICAgCiAgICBpX3Byb2Nlc3MgOj0gaW5wdXQuYmFzZS5PQ0kuUHJvY2VzcwogICAgCiAgICBwX3Byb2Nlc3MgOj0gcF9jb250YWluZXIuT0NJLlByb2Nlc3MKICAgIAogICAgYWxsb3dfYXJncyhpX3Byb2Nlc3MsIHBfcHJvY2VzcywgaV9lbnZfbWFwKQoKICAgIHJlc3AgPSBDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uKGlucHV0LmJhc2UpCiAgICBwcmludCgiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdDogdHJ1ZSIpCn0KCmFsbG93X2FyZ3MoaV9wcm9jZXNzLCBwX3Byb2Nlc3MsIGlfZW52X21hcCkgewogICAgaV9hcmdzIDo9IGlfcHJvY2Vzcy5BcmdzCiAgICBwX2FyZ3MgOj0gcF9wcm9jZXNzLkFyZ3MKICAgIHByaW50KCJhbGxvd19hcmdzOiBpX2FyZ3MgPSIsIGlfYXJncywgInBfYXJncyA9IiwgcF9hcmdzKQogICAgY291bnQoaV9hcmdzKSA9PSBjb3VudChwX2FyZ3MpCiAgICBldmVyeSBpLCBpX2FyZyBpbiBpX2FyZ3MgewogICAgICAgIHByaW50KCJhbGxvd19hcmdzOiBpX2FyZyA9IiwgaV9hcmcpCiAgICAgICAgcF9hcmdfcmVwbGFjZWQgOj0gcmVwbGFjZV9lbnZfdmFyaWFibGVzKHBfYXJnc1tpXSwgaV9lbnZfbWFwKQogICAgICAgIHByaW50KCJhbGxvd19hcmdzOiBwX2FyZ19yZXBsYWNlZCA9IiwgcF9hcmdfcmVwbGFjZWQpCiAgICAgICAgcF9hcmdfcmVwbGFjZWQyIDo9IHJlcGxhY2UocF9hcmdfcmVwbGFjZWQsICIkJCIsICIkIikKICAgICAgICBwcmludCgiYWxsb3dfYXJnczogcF9hcmdfcmVwbGFjZWQyID0iLCBwX2FyZ19yZXBsYWNlZDIpCiAgICAgICAgaV9hcmcgPT0gcF9hcmdfcmVwbGFjZWQyCiAgICB9CiAgICBwcmludCgiYWxsb3dfYXJnczogdHJ1ZSIpCn0KCmFsbG93X2FyZ3MoaV9wcm9jZXNzLCBwX3Byb2Nlc3MsIGlfZW52X21hcCkgewogICAgbm90IGlfcHJvY2Vzcy5BcmdzCiAgICBub3QgcF9wcm9jZXNzLkFyZ3MKICAgIHByaW50KCJhbGxvd19hcmdzMjogbm8gYXJncyIpCn0KCiMgdGhpcyBmdW5jdGlvbiByZXBsYWNlcyBhbGwgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyBpbiBhIHN0cmluZywgZ2l2ZW4gYSBtYXAgb2YgZW52aXJvbm1lbnQga2V5cyB0byBlbnZpcm9ubWVudCB2YWx1ZXMKIyBlZyBzdHIgPSAiZWNobyAkKENMVVNURVJfSUQpOyBlY2hvICQoTk9ERV9OQU1FKTsiCiMgZW52X21hcCA9IHsiQ0xVU1RFUl9JRCI6ICJhYmMiLCAiTk9ERV9OQU1FIiA6ICJ4eXoifQojIHJlc3VsdCA9ICJlY2hvIGFiYzsgZWNobyB4eXo7IgpyZXBsYWNlX2Vudl92YXJpYWJsZXMoc3RyLCBlbnZfbWFwKSA9IHJlc3VsdCB7CiAgICAjIG1ha2UgYW4gYXJyYXkgb2YgdGhlIGtleXMgZWcgWyJDTFVTVEVSX0lEIiwgIk5PREVfTkFNRSJdCiAgICBrZXlzIDo9IFt4IHwgc29tZSB4IGluIG9iamVjdC5rZXlzKGVudl9tYXApXQogICAgcmVzdWx0IDo9IHJlcGxhY2Vfc3RyX3JlYyhzdHIsIGVudl9tYXAsIGtleXMsIGNvdW50KGtleXMpIC0gMSkKfQoKIyBiYXNlIGNhc2UKcmVwbGFjZV9zdHJfcmVjKHN0ciwgZW52X21hcCwgYXJyX2tleXMsIGkpID0gcmVzdWx0IHsKICAgIGkgPCAwCiAgICByZXN1bHQgOj0gc3RyCn0KCiMgcmVjdXJzaXZlIHN0ZXAKcmVwbGFjZV9zdHJfcmVjKHN0ciwgZW52X21hcCwgYXJyX2tleXMsIGkpID0gcmVzdWx0IHsKICAgIGkgPj0gMAogICAga2V5IDo9IGFycl9rZXlzW2ldCiAgICBlbnZfa2V5MSA6PSBjb25jYXQoIiIsIFsiJCgiLCBrZXksICIpIl0pCiAgICAjIHJlcGxhY2UgJChWQVIpIHdpdGggdmFsdWUKICAgIG5ld19zdHIxIDo9IHJlcGxhY2Uoc3RyLCBlbnZfa2V5MSwgZW52X21hcFtrZXldKQogICAgIyByZXBsYWNlIG5leHQgZW52aXJvbm1lbnQgdmFyaWFibGUKICAgIHJlc3VsdCA9IHJlcGxhY2Vfc3RyX3JlYyhuZXdfc3RyMSwgZW52X21hcCwgYXJyX2tleXMsIGkgLSAxKQp9CgphbGxvd19lbnZfbWFwKHBfZW52X21hcCwgaV9lbnZfbWFwKSB7CiAgICBwcmludCgiYWxsb3dfZW52X21hcDogcF9lbnZfbWFwID0iLCBwX2Vudl9tYXApCiAgICBldmVyeSBlbnZfa2V5LCBlbnZfdmFsIGluIGlfZW52X21hcCB7CiAgICAgICAgcHJpbnQoImFsbG93X2VudjogZW52X2tleSA9IiwgZW52X2tleSwgImVudl92YWwgPSIsIGVudl92YWwpCiAgICAgICAgYWxsb3dfZW52X21hcF9lbnRyeShlbnZfa2V5LCBlbnZfdmFsLCBwX2Vudl9tYXApCiAgICB9CiAgICBwcmludCgiYWxsb3dfZW52X21hcDogdHJ1ZSIpCn0KCiMgQWxsb3cgZXhhY3QgbWF0Y2gKYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBpX3ZhbCA9PSBwX3ZhbAogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnk6IHRydWUiKQp9CgojIEFsbG93IHJlc291cmNlRmllbGRSZWYgdmFsdWVzIChlLmcuLCAibGltaXRzLmNwdSIpLgphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgICMgYSB2YXJpYWJsZSB3ZSBzaG91bGQgYmUgdmFsaWRhdGluZyB1c2luZyBhIHJlZ2V4IGZyb20gc2V0dGluZ3MKICAgIHBfdmFsID09ICIkKHZhbGlkYXRlLWZyb20tc2V0dGluZ3MpIgogICAgcmVnZXhfdmFsIDo9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuQ3JlYXRlQ29udGFpbmVyUmVxdWVzdC5hbGxvd19lbnZfcmVnZXhfbWFwW2tleV0KICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4X3ZhbCwgaV92YWwpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSAyOiB0cnVlIikKfQoKIyBBbGxvdyBub2RlLW5hbWUKYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChub2RlLW5hbWUpIgogICAgcmVnZXgubWF0Y2gocG9saWN5X2RhdGEuY29tbW9uLmRuc19zdWJkb21haW4gLCBpX3ZhbCkKICAgIHByaW50KCJhbGxvd19lbnZfbWFwX2VudHJ5IDM6IHRydWUiKQp9CgojIEFsbG93IGhvc3QtbmFtZQphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgIHBfdmFsID09ICIkKGhvc3QtbmFtZSkiCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24uZG5zX2xhYmVsICwgaV92YWwpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSA0OiB0cnVlIikKfQoKIyBBbGxvdyBwb2QtdWlkCmFsbG93X2Vudl9tYXBfZW50cnkoa2V5LCBpX3ZhbCwgcF9lbnZfbWFwKSB7CiAgICBwX3ZhbCA6PSBwX2Vudl9tYXBba2V5XQogICAgcF92YWwgPT0gIiQocG9kLXVpZCkiCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24ucG9kX3VpZCAsIGlfdmFsKQogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgNTogdHJ1ZSIpCn0KCiMgQWxsb3cgZmllbGRSZWYgImZpZWxkUGF0aDogc3RhdHVzLnBvZElQIiB2YWx1ZXMuCmFsbG93X2Vudl9tYXBfZW50cnkoa2V5LCBpX3ZhbCwgcF9lbnZfbWFwKSB7CiAgICBpc19pcChpX3ZhbCkKCiAgICBwX3ZhbCA6PSBwX2Vudl9tYXBba2V5XQogICAgcF92YXIgOj0gY29uY2F0KCI9IiwgW2tleSwgcF92YWxdKQogICAgYWxsb3dfcG9kX2lwX3ZhcihrZXksIHBfdmFyKQogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgNjogdHJ1ZSIpCn0KCiMgQWxsb3cgZmllbGRSZWYgImZpZWxkUGF0aDogc3RhdHVzLmhvc3RJUCIgdmFsdWVzLgphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgaXNfaXAoaV92YWwpCgogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgIHBfdmFyIDo9IGNvbmNhdCgiPSIsIFtrZXksIHBfdmFsXSkKICAgIGFsbG93X2hvc3RfaXBfdmFyKGtleSwgcF92YXIpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSA3OiB0cnVlIikKfQoKIyBNYXRjaCBpbnB1dCB3aXRoIG9uZSBvZiB0aGUgcG9saWN5IHZhcmlhYmxlcywgYWZ0ZXIgc3Vic3RpdHV0aW5nICQoc2FuZGJveC1uYW1lKS4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChzYW5kYm94LW5hbWUpIgogICAgc19uYW1lIDo9IGlucHV0LmJhc2UuT0NJLkFubm90YXRpb25zW1NfTkFNRV9LRVldCiAgICBwX3ZhcjIgOj0gcmVwbGFjZShwX3ZhbCwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHBfdmFyMiA9PSBpX3ZhbAogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgODogdHJ1ZSIpCn0KCiMgTWF0Y2ggaW5wdXQgd2l0aCBvbmUgb2YgdGhlIHBvbGljeSB2YXJpYWJsZXMsIGFmdGVyIHN1YnN0aXR1dGluZyAkKHNhbmRib3gtbmFtZXNwYWNlKS4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChzYW5kYm94LW5hbWVzcGFjZSkiCiAgICBzX25hbWVzcGFjZSA6PSBpbnB1dC5iYXNlLk9DSS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwX3ZhcjIgOj0gcmVwbGFjZShwX3ZhbCwgIiQoc2FuZGJveC1uYW1lc3BhY2UpIiwgc19uYW1lc3BhY2UpCiAgICBwX3ZhcjIgPT0gaV92YWwKICAgIHByaW50KCJhbGxvd19lbnZfbWFwX2VudHJ5IDk6IHRydWUiKQp9CgojIEFsbG93IGlucHV0IGVudiB2YXJpYWJsZXMgdGhhdCBtYXRjaCB3aXRoIGEgcmVxdWVzdF9kZWZhdWx0cyByZWdleC4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHNvbWUgcF9yZWdleDEgaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5DcmVhdGVDb250YWluZXJSZXF1ZXN0LmFsbG93X2Vudl9yZWdleAogICAgcF9yZWdleDIgOj0gcmVwbGFjZShwX3JlZ2V4MSwgIiQoaXB2NF9hKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcHY0X2EpCiAgICBwX3JlZ2V4MyA6PSByZXBsYWNlKHBfcmVnZXgyLCAiJChpcF9wKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcF9wKQogICAgcF9yZWdleDQgOj0gcmVwbGFjZShwX3JlZ2V4MywgIiQoc3ZjX25hbWUpIiwgcG9saWN5X2RhdGEuY29tbW9uLnN2Y19uYW1lKQogICAgcF9yZWdleDUgOj0gcmVwbGFjZShwX3JlZ2V4NCwgIiQoZG5zX2xhYmVsKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5kbnNfbGFiZWwpCgogICAgcmVzdWx0IDo9IGNvbmNhdCgiPSIsIFtrZXksIGlfdmFsXSkKICAgIHJlZ2V4Lm1hdGNoKHBfcmVnZXg1LCByZXN1bHQpCgogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgMTA6IHRydWUiKQp9CgpDcmVhdGVDb250YWluZXJSZXF1ZXN0Oj0gcmVzcCB7CiAgICBub3QgaW5wdXQuZW52X21hcAogICAgaV9wcm9jZXNzID0gaW5wdXQuT0NJLlByb2Nlc3MKICAgIHNfbmFtZSA9IGlucHV0Lk9DSS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBwX3Byb2Nlc3MgPSBwX2NvbnRhaW5lci5PQ0kuUHJvY2VzcwogICAgYWxsb3dfZGVwcmVjYXRlZF9hcmdzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUpCiAgICByZXNwID0gQ3JlYXRlQ29udGFpbmVyUmVxdWVzdENvbW1vbihpbnB1dCkKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0MjogdHJ1ZSIpCn0KCkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb24ocmVxKTo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgICMgQ2hlY2sgaWYgdGhlIGlucHV0IHJlcXVlc3Qgc2hvdWxkIGJlIHJlamVjdGVkIGV2ZW4gYmVmb3JlIGNoZWNraW5nIHRoZQogICAgIyBwb2xpY3lfZGF0YS5jb250YWluZXJzIGluZm9ybWF0aW9uLgogICAgYWxsb3dfY3JlYXRlX2NvbnRhaW5lcl9pbnB1dChyZXEpCgogICAgaV9vY2kgOj0gcmVxLk9DSQogICAgaV9zdG9yYWdlcyA6PSByZXEuc3RvcmFnZXMKICAgIGlfZGV2aWNlcyA6PSByZXEuZGV2aWNlcwoKICAgICMgYXJyYXkgb2YgcG9zc2libGUgc3RhdGUgb3BlcmF0aW9ucwogICAgb3BzX2J1aWxkZXIgOj0gW10KCiAgICAjIGNoZWNrIHNhbmRib3ggbmFtZQogICAgc2FuZGJveF9uYW1lID0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FX0tFWV0KICAgIGFkZF9zYW5kYm94X25hbWVfdG9fc3RhdGUgOj0gc3RhdGVfYWxsb3dzKCJzYW5kYm94X25hbWUiLCBzYW5kYm94X25hbWUpCiAgICBvcHNfYnVpbGRlcjEgOj0gY29uY2F0X29wX2lmX25vdF9udWxsKG9wc19idWlsZGVyLCBhZGRfc2FuZGJveF9uYW1lX3RvX3N0YXRlKQoKICAgICMgQ2hlY2sgaWYgYW55IGVsZW1lbnQgZnJvbSB0aGUgcG9saWN5X2RhdGEuY29udGFpbmVycyBhcnJheSBhbGxvd3MgdGhlIGlucHV0IHJlcXVlc3QuCiAgICBzb21lIHBfY29udGFpbmVyIGluIHBvbGljeV9kYXRhLmNvbnRhaW5lcnMKICAgIHByaW50KCI9PT09PT09PSBDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiB0cnlpbmcgbmV4dCBwb2xpY3kgY29udGFpbmVyIikKCiAgICBwX3BpZG5zIDo9IHBfY29udGFpbmVyLnNhbmRib3hfcGlkbnMKICAgIGlfcGlkbnMgOj0gcmVxLnNhbmRib3hfcGlkbnMKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiBwX3BpZG5zID0iLCBwX3BpZG5zLCAiaV9waWRucyA9IiwgaV9waWRucykKICAgIHBfcGlkbnMgPT0gaV9waWRucwoKICAgIHBfb2NpIDo9IHBfY29udGFpbmVyLk9DSQoKICAgICMgY2hlY2sgbmFtZXNwYWNlCiAgICBwX25hbWVzcGFjZSA6PSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBpX25hbWVzcGFjZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwcmludCAoIkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb246IHBfbmFtZXNwYWNlID0iLCBwX25hbWVzcGFjZSwgImlfbmFtZXNwYWNlID0iLCBpX25hbWVzcGFjZSkKICAgIGFkZF9uYW1lc3BhY2VfdG9fc3RhdGUgOj0gYWxsb3dfbmFtZXNwYWNlKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkKICAgIG9wc19idWlsZGVyMiA6PSBjb25jYXRfb3BfaWZfbm90X251bGwob3BzX2J1aWxkZXIxLCBhZGRfbmFtZXNwYWNlX3RvX3N0YXRlKQoKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiBwIFZlcnNpb24gPSIsIHBfb2NpLlZlcnNpb24sICJpIFZlcnNpb24gPSIsIGlfb2NpLlZlcnNpb24pCiAgICBwX29jaS5WZXJzaW9uID09IGlfb2NpLlZlcnNpb24KCiAgICBwcmludCgiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdENvbW1vbjogcCBSZWFkb25seSA9IiwgcF9vY2kuUm9vdC5SZWFkb25seSwgImkgUmVhZG9ubHkgPSIsIGlfb2NpLlJvb3QuUmVhZG9ubHkpCiAgICBwX29jaS5Sb290LlJlYWRvbmx5ID09IGlfb2NpLlJvb3QuUmVhZG9ubHkKCiAgICBhbGxvd19hbm5vKHBfb2NpLCBpX29jaSkKCiAgICBwX3N0b3JhZ2VzIDo9IHBfY29udGFpbmVyLnN0b3JhZ2VzCiAgICBhbGxvd19ieV9hbm5vKHBfb2NpLCBpX29jaSwgcF9zdG9yYWdlcywgaV9zdG9yYWdlcykKCiAgICBwX2RldmljZXMgOj0gcF9jb250YWluZXIuZGV2aWNlcwogICAgYWxsb3dfZGV2aWNlcyhwX2RldmljZXMsIGlfZGV2aWNlcykKCiAgICByZXQgOj0gYWxsb3dfbGludXgob3BzX2J1aWxkZXIyLCBwX29jaSwgaV9vY2kpCiAgICByZXQuYWxsb3dlZAoKICAgIG9wcyA6PSByZXQub3BzCgogICAgcHJpbnQoIkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb246IHRydWUiKQp9CgphbGxvd19jcmVhdGVfY29udGFpbmVyX2lucHV0KHJlcSkgewogICAgcHJpbnQoImFsbG93X2NyZWF0ZV9jb250YWluZXJfaW5wdXQ6IGlucHV0ID0iLCByZXEpCgogICAgY291bnQocmVxLnNoYXJlZF9tb3VudHMpID09IDAKICAgIGlzX251bGwocmVxLnN0cmluZ191c2VyKQoKICAgIGlfb2NpIDo9IHJlcS5PQ0kKICAgIGlzX251bGwoaV9vY2kuSG9va3MpCiAgICBpc19udWxsKGlfb2NpLlNvbGFyaXMpCiAgICBpc19udWxsKGlfb2NpLldpbmRvd3MpCgogICAgaV9saW51eCA6PSBpX29jaS5MaW51eAogICAgY291bnQoaV9saW51eC5HSURNYXBwaW5ncykgPT0gMAogICAgY291bnQoaV9saW51eC5Nb3VudExhYmVsKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlJlc291cmNlcy5EZXZpY2VzKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlJvb3Rmc1Byb3BhZ2F0aW9uKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlVJRE1hcHBpbmdzKSA9PSAwCiAgICBpc19udWxsKGlfbGludXguSW50ZWxSZHQpCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLkJsb2NrSU8pCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLk5ldHdvcmspCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLlBpZHMpCiAgICBpc19udWxsKGlfbGludXguU2VjY29tcCkKCiAgICBpX3Byb2Nlc3MgOj0gaV9vY2kuUHJvY2VzcwogICAgY291bnQoaV9wcm9jZXNzLlNlbGludXhMYWJlbCkgPT0gMAogICAgY291bnQoaV9wcm9jZXNzLlVzZXIuVXNlcm5hbWUpID09IDAKCiAgICBwcmludCgiYWxsb3dfY3JlYXRlX2NvbnRhaW5lcl9pbnB1dDogdHJ1ZSIpCn0KCmFsbG93X25hbWVzcGFjZShwX25hbWVzcGFjZSwgaV9uYW1lc3BhY2UpID0gYWRkX25hbWVzcGFjZSB7CiAgICBwX25hbWVzcGFjZSA9PSBpX25hbWVzcGFjZQogICAgYWRkX25hbWVzcGFjZSA6PSBudWxsCiAgICBwcmludCgiYWxsb3dfbmFtZXNwYWNlIDE6IGlucHV0IG5hbWVzcGFjZSBtYXRjaGVzIHBvbGljeSBkYXRhIikKfQoKYWxsb3dfbmFtZXNwYWNlKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkgPSBhZGRfbmFtZXNwYWNlIHsKICAgIHBfbmFtZXNwYWNlID09ICIiCiAgICBwcmludCgiYWxsb3dfbmFtZXNwYWNlIDI6IG5vIG5hbWVzcGFjZSBmb3VuZCBvbiBwb2xpY3kgZGF0YSIpCiAgICBhZGRfbmFtZXNwYWNlIDo9IHN0YXRlX2FsbG93cygibmFtZXNwYWNlIiwgaV9uYW1lc3BhY2UpCn0KCiMgdmFsdWUgaGFzbid0IGJlZW4gc2VlbiBiZWZvcmUsIHNhdmUgaXQgdG8gc3RhdGUKc3RhdGVfYWxsb3dzKGtleSwgdmFsdWUpID0gYWN0aW9uIHsKICBzdGF0ZSA6PSBnZXRfc3RhdGUoKQogIHByaW50KCJzdGF0ZV9hbGxvd3MgMTogc3RhdGVba2V5XSA9Iiwgc3RhdGVba2V5XSwgInZhbHVlID0iLCB2YWx1ZSkKICBub3Qgc3RhdGVba2V5XQogIHByaW50KCJzdGF0ZV9hbGxvd3MgMTogc2F2aW5nIHRvIHN0YXRlIGtleSA9Iiwga2V5LCAidmFsdWUgPSIsIHZhbHVlKQogIHBhdGggOj0gZ2V0X3N0YXRlX3BhdGgoa2V5KSAKICBhY3Rpb24gOj0gewogICAgIm9wIjogImFkZCIsCiAgICAicGF0aCI6IHBhdGgsIAogICAgInZhbHVlIjogdmFsdWUsCiAgfQp9CgojIHZhbHVlIG1hdGNoZXMgd2hhdCdzIGluIHN0YXRlLCBhbGxvdyBpdApzdGF0ZV9hbGxvd3Moa2V5LCB2YWx1ZSkgPSBhY3Rpb24gewogIHByaW50KCJzdGF0ZV9hbGxvd3MgMjogc3RhcnQiKQogIHN0YXRlIDo9IGdldF9zdGF0ZSgpCiAgcHJpbnQoInN0YXRlX2FsbG93cyAyOiBzdGF0ZVtrZXldID0iLCBzdGF0ZVtrZXldLCAidmFsdWUgPSIsIHZhbHVlKQogIHZhbHVlID09IHN0YXRlW2tleV0KICBwcmludCgic3RhdGVfYWxsb3dzIDI6IGZvdW5kIGtleSA9Iiwga2V5LCAidmFsdWUgPSIsIHZhbHVlLCAiIGluIHN0YXRlIikKICBhY3Rpb24gOj0gbnVsbAp9CgojIGhlbHBlciBmdW5jdGlvbnMgdG8gaW50ZXJhY3Qgd2l0aCB0aGUgc3RhdGUKZ2V0X3N0YXRlKCkgPSBzdGF0ZSB7CiAgc3RhdGUgOj0gZGF0YVsicHN0YXRlIl0KfQoKZ2V0X3N0YXRlX3ZhbChrZXkpID0gdmFsdWUgewogICAgc3RhdGUgOj0gZ2V0X3N0YXRlKCkKICAgIHZhbHVlIDo9IHN0YXRlW2tleV0KfQoKZ2V0X3N0YXRlX3BhdGgoa2V5KSA9IHBhdGggewogICAgIyBwcmVwZW5kICIvcHN0YXRlLyIgdG8ga2V5CiAgICBwYXRoIDo9IGNvbmNhdCgiLyIsIFsiL3BzdGF0ZSIsIGtleV0pCn0KCiMgSGVscGVyIGZ1bmN0aW9ucyB0byBjb25kaXRpb25hbGx5IGNvbmNhdGVuYXRlIG9wIGlzIG5vdCBudWxsCmNvbmNhdF9vcF9pZl9ub3RfbnVsbChvcHMsIG9wKSA9IHJlc3VsdCB7CiAgICBvcCA9PSBudWxsCiAgICByZXN1bHQgOj0gb3BzCn0KCmNvbmNhdF9vcF9pZl9ub3RfbnVsbChvcHMsIG9wKSA9IHJlc3VsdCB7CiAgICBvcCAhPSBudWxsCiAgICByZXN1bHQgOj0gYXJyYXkuY29uY2F0KG9wcywgW29wXSkKfQoKIyBSZWplY3QgdW5leHBlY3RlZCBhbm5vdGF0aW9ucy4KYWxsb3dfYW5ubyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19hbm5vIDE6IHN0YXJ0IikKCiAgICBub3QgaV9vY2kuQW5ub3RhdGlvbnMKCiAgICBwcmludCgiYWxsb3dfYW5ubyAxOiB0cnVlIikKfQphbGxvd19hbm5vKHBfb2NpLCBpX29jaSkgewogICAgcHJpbnQoImFsbG93X2Fubm8gMjogcCBBbm5vdGF0aW9ucyA9IiwgcF9vY2kuQW5ub3RhdGlvbnMpCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiBpIEFubm90YXRpb25zID0iLCBpX29jaS5Bbm5vdGF0aW9ucykKCiAgICBpX2tleXMgOj0gb2JqZWN0LmtleXMoaV9vY2kuQW5ub3RhdGlvbnMpCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiBpIGtleXMgPSIsIGlfa2V5cykKCiAgICBldmVyeSBpX2tleSBpbiBpX2tleXMgewogICAgICAgIGFsbG93X2Fubm9fa2V5KGlfa2V5LCBwX29jaSkKICAgIH0KCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiB0cnVlIikKfQoKYWxsb3dfYW5ub19rZXkoaV9rZXksIHBfb2NpKSB7CiAgICBwcmludCgiYWxsb3dfYW5ub19rZXkgMTogaSBrZXkgPSIsIGlfa2V5KQoKICAgIHN0YXJ0c3dpdGgoaV9rZXksICJpby5rdWJlcm5ldGVzLmNyaS4iKQoKICAgIHByaW50KCJhbGxvd19hbm5vX2tleSAxOiB0cnVlIikKfQphbGxvd19hbm5vX2tleShpX2tleSwgcF9vY2kpIHsKICAgIHByaW50KCJhbGxvd19hbm5vX2tleSAyOiBpIGtleSA9IiwgaV9rZXkpCgogICAgc29tZSBwX2tleSwgXyBpbiBwX29jaS5Bbm5vdGF0aW9ucwogICAgcF9rZXkgPT0gaV9rZXkKCiAgICBwcmludCgiYWxsb3dfYW5ub19rZXkgMjogdHJ1ZSIpCn0KCiMgR2V0IHRoZSB2YWx1ZSBvZiB0aGUgU19OQU1FX0tFWSBhbm5vdGF0aW9uIGFuZAojIGNvcnJlbGF0ZSBpdCB3aXRoIG90aGVyIGFubm90YXRpb25zIGFuZCBwcm9jZXNzIGZpZWxkcy4KYWxsb3dfYnlfYW5ubyhwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpIHsKICAgIHByaW50KCJhbGxvd19ieV9hbm5vIDE6IHN0YXJ0IikKCiAgICBub3QgcF9vY2kuQW5ub3RhdGlvbnNbU19OQU1FX0tFWV0KCiAgICBpX3NfbmFtZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMTogaV9zX25hbWUgPSIsIGlfc19uYW1lKQoKICAgIGlfc19uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FU1BBQ0VfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMTogaV9zX25hbWVzcGFjZSA9IiwgaV9zX25hbWVzcGFjZSkKCiAgICBhbGxvd19ieV9zYW5kYm94X25hbWUocF9vY2ksIGlfb2NpLCBwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBpX3NfbmFtZSwgaV9zX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfYnlfYW5ubyAxOiB0cnVlIikKfQphbGxvd19ieV9hbm5vKHBfb2NpLCBpX29jaSwgcF9zdG9yYWdlcywgaV9zdG9yYWdlcykgewogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMjogc3RhcnQiKQoKICAgIHBfc19uYW1lIDo9IHBfb2NpLkFubm90YXRpb25zW1NfTkFNRV9LRVldCiAgICBpX3NfbmFtZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMjogaV9zX25hbWUgPSIsIGlfc19uYW1lLCAicF9zX25hbWUgPSIsIHBfc19uYW1lKQoKICAgIGFsbG93X3NhbmRib3hfbmFtZShwX3NfbmFtZSwgaV9zX25hbWUpCgogICAgaV9zX25hbWVzcGFjZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwcmludCgiYWxsb3dfYnlfYW5ubyAyOiBpX3NfbmFtZXNwYWNlID0iLCBpX3NfbmFtZXNwYWNlKQoKICAgIGFsbG93X2J5X3NhbmRib3hfbmFtZShwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMsIGlfc19uYW1lLCBpX3NfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd19ieV9hbm5vIDI6IHRydWUiKQp9CgphbGxvd19ieV9zYW5kYm94X25hbWUocF9vY2ksIGlfb2NpLCBwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfYnlfc2FuZGJveF9uYW1lOiBzdGFydCIpCgogICAgaV9uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FU1BBQ0VfS0VZXQoKICAgIGFsbG93X2J5X2NvbnRhaW5lcl90eXBlcyhwX29jaSwgaV9vY2ksIHNfbmFtZSwgaV9uYW1lc3BhY2UpCiAgICBhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZChwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpCiAgICBhbGxvd19wcm9jZXNzKHBfb2NpLlByb2Nlc3MsIGlfb2NpLlByb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpCgogICAgcHJpbnQoImFsbG93X2J5X3NhbmRib3hfbmFtZTogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfbmFtZShwX3NfbmFtZSwgaV9zX25hbWUpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X25hbWU6IHN0YXJ0IikKICAgIHJlZ2V4Lm1hdGNoKHBfc19uYW1lLCBpX3NfbmFtZSkKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9uYW1lOiB0cnVlIikKfQoKIyBDaGVjayB0aGF0IHRoZSAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLXR5cGUiIGFuZAojICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIiBhbm5vdGF0aW9ucyBkZXNpZ25hdGUgdGhlCiMgZXhwZWN0ZWQgdHlwZSAtIGVpdGhlciBhICJzYW5kYm94IiBvciBhICJjb250YWluZXIiLiBUaGVuLCB2YWxpZGF0ZQojIG90aGVyIGFubm90YXRpb25zIGJhc2VkIG9uIHRoZSBhY3R1YWwgInNhbmRib3giIG9yICJjb250YWluZXIiIHZhbHVlCiMgZnJvbSB0aGUgaW5wdXQgY29udGFpbmVyLgphbGxvd19ieV9jb250YWluZXJfdHlwZXMocF9vY2ksIGlfb2NpLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfYnlfY29udGFpbmVyX3R5cGVzOiBjaGVja2luZyBpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSIpCgogICAgY190eXBlIDo9ICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSIKICAgIAogICAgcF9jcmlfdHlwZSA6PSBwX29jaS5Bbm5vdGF0aW9uc1tjX3R5cGVdCiAgICBpX2NyaV90eXBlIDo9IGlfb2NpLkFubm90YXRpb25zW2NfdHlwZV0KICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZXM6IHBfY3JpX3R5cGUgPSIsIHBfY3JpX3R5cGUsICJpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgcF9jcmlfdHlwZSA9PSBpX2NyaV90eXBlCgogICAgYWxsb3dfYnlfY29udGFpbmVyX3R5cGUoaV9jcmlfdHlwZSwgcF9vY2ksIGlfb2NpLCBzX25hbWUsIHNfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZXM6IHRydWUiKQp9CgphbGxvd19ieV9jb250YWluZXJfdHlwZShpX2NyaV90eXBlLCBwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAxOiBpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgaV9jcmlfdHlwZSA9PSAic2FuZGJveCIKCiAgICBpX2thdGFfdHlwZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1siaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5jb250YWluZXJfdHlwZSJdCiAgICBwcmludCgiYWxsb3dfYnlfY29udGFpbmVyX3R5cGUgMTogaV9rYXRhX3R5cGUgPSIsIGlfa2F0YV90eXBlKQogICAgaV9rYXRhX3R5cGUgPT0gInBvZF9zYW5kYm94IgoKICAgIGFsbG93X3NhbmRib3hfY29udGFpbmVyX25hbWUocF9vY2ksIGlfb2NpKQogICAgYWxsb3dfc2FuZGJveF9uZXRfbmFtZXNwYWNlKHBfb2NpLCBpX29jaSkKICAgIGFsbG93X3NhbmRib3hfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpCgogICAgcHJpbnQoImFsbG93X2J5X2NvbnRhaW5lcl90eXBlIDE6IHRydWUiKQp9CgphbGxvd19ieV9jb250YWluZXJfdHlwZShpX2NyaV90eXBlLCBwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiBpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgaV9jcmlfdHlwZSA9PSAiY29udGFpbmVyIgoKICAgIGlfa2F0YV90eXBlIDo9IGlfb2NpLkFubm90YXRpb25zWyJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIl0KICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiBpX2thdGFfdHlwZSA9IiwgaV9rYXRhX3R5cGUpCiAgICBpX2thdGFfdHlwZSA9PSAicG9kX2NvbnRhaW5lciIKCiAgICBhbGxvd19jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpCiAgICBhbGxvd19uZXRfbmFtZXNwYWNlKHBfb2NpLCBpX29jaSkKICAgIGFsbG93X2xvZ19kaXJlY3RvcnkocF9vY2ksIGlfb2NpKQoKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiB0cnVlIikKfQoKIyAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLW5hbWUiIGFubm90YXRpb24KYWxsb3dfc2FuZGJveF9jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X2NvbnRhaW5lcl9uYW1lOiBzdGFydCIpCgogICAgY29udGFpbmVyX2Fubm90YXRpb25fbWlzc2luZyhwX29jaSwgaV9vY2ksICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItbmFtZSIpCgogICAgcHJpbnQoImFsbG93X3NhbmRib3hfY29udGFpbmVyX25hbWU6IHRydWUiKQp9CgphbGxvd19jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19jb250YWluZXJfbmFtZTogc3RhcnQiKQoKICAgIGFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uKHBfb2NpLCBpX29jaSwgImlvLmt1YmVybmV0ZXMuY3JpLmNvbnRhaW5lci1uYW1lIikKCiAgICBwcmludCgiYWxsb3dfY29udGFpbmVyX25hbWU6IHRydWUiKQp9Cgpjb250YWluZXJfYW5ub3RhdGlvbl9taXNzaW5nKHBfb2NpLCBpX29jaSwga2V5KSB7CiAgICBwcmludCgiY29udGFpbmVyX2Fubm90YXRpb25fbWlzc2luZzoiLCBrZXkpCgogICAgbm90IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIG5vdCBpX29jaS5Bbm5vdGF0aW9uc1trZXldCgogICAgcHJpbnQoImNvbnRhaW5lcl9hbm5vdGF0aW9uX21pc3Npbmc6IHRydWUiKQp9CgphbGxvd19jb250YWluZXJfYW5ub3RhdGlvbihwX29jaSwgaV9vY2ksIGtleSkgewogICAgcHJpbnQoImFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uOiBrZXkgPSIsIGtleSkKCiAgICBwX3ZhbHVlIDo9IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIGlfdmFsdWUgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgcHJpbnQoImFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uOiBwX3ZhbHVlID0iLCBwX3ZhbHVlLCAiaV92YWx1ZSA9IiwgaV92YWx1ZSkKCiAgICBwX3ZhbHVlID09IGlfdmFsdWUKCiAgICBwcmludCgiYWxsb3dfY29udGFpbmVyX2Fubm90YXRpb246IHRydWUiKQp9CgojICJuZXJkY3RsL25ldHdvcmstbmFtZXNwYWNlIiBhbm5vdGF0aW9uCmFsbG93X3NhbmRib3hfbmV0X25hbWVzcGFjZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X25ldF9uYW1lc3BhY2U6IHN0YXJ0IikKCiAgICBrZXkgOj0gIm5lcmRjdGwvbmV0d29yay1uYW1lc3BhY2UiCgogICAgcF9uYW1lc3BhY2UgOj0gcF9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgaV9uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgcHJpbnQoImFsbG93X3NhbmRib3hfbmV0X25hbWVzcGFjZTogcF9uYW1lc3BhY2UgPSIsIHBfbmFtZXNwYWNlLCAiaV9uYW1lc3BhY2UgPSIsIGlfbmFtZXNwYWNlKQoKICAgIHJlZ2V4Lm1hdGNoKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9uZXRfbmFtZXNwYWNlOiB0cnVlIikKfQoKYWxsb3dfbmV0X25hbWVzcGFjZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19uZXRfbmFtZXNwYWNlOiBzdGFydCIpCgogICAga2V5IDo9ICJuZXJkY3RsL25ldHdvcmstbmFtZXNwYWNlIgoKICAgIG5vdCBwX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICBub3QgaV9vY2kuQW5ub3RhdGlvbnNba2V5XQoKICAgIHByaW50KCJhbGxvd19uZXRfbmFtZXNwYWNlOiB0cnVlIikKfQoKIyAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1sb2ctZGlyZWN0b3J5IiBhbm5vdGF0aW9uCmFsbG93X3NhbmRib3hfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X2xvZ19kaXJlY3Rvcnk6IHN0YXJ0IikKCiAgICBrZXkgOj0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbG9nLWRpcmVjdG9yeSIKCiAgICBwX2RpciA6PSBwX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICByZWdleDEgOj0gcmVwbGFjZShwX2RpciwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHJlZ2V4MiA6PSByZXBsYWNlKHJlZ2V4MSwgIiQoc2FuZGJveC1uYW1lc3BhY2UpIiwgc19uYW1lc3BhY2UpCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiByZWdleDIgPSIsIHJlZ2V4MikKCiAgICBpX2RpciA6PSBpX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiBpX2RpciA9IiwgaV9kaXIpCgogICAgcmVnZXgubWF0Y2gocmVnZXgyLCBpX2RpcikKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiB0cnVlIikKfQoKYWxsb3dfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19sb2dfZGlyZWN0b3J5OiBzdGFydCIpCgogICAga2V5IDo9ICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWxvZy1kaXJlY3RvcnkiCgogICAgbm90IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIG5vdCBpX29jaS5Bbm5vdGF0aW9uc1trZXldCgogICAgcHJpbnQoImFsbG93X2xvZ19kaXJlY3Rvcnk6IHRydWUiKQp9CgphbGxvd19kZXZpY2VzKHBfZGV2aWNlcywgaV9kZXZpY2VzKSB7CiAgICBwcmludCgiYWxsb3dfZGV2aWNlczogc3RhcnQiKQogICAgZXZlcnkgaV9kZXZpY2UgaW4gaV9kZXZpY2VzIHsKICAgICAgICBwcmludCgiYWxsb3dfZGV2aWNlczogaV9kZXZpY2UgPSIsIGlfZGV2aWNlKQogICAgICAgIHNvbWUgcF9kZXZpY2UgaW4gcF9kZXZpY2VzCiAgICAgICAgcF9kZXZpY2UuY29udGFpbmVyX3BhdGggPT0gaV9kZXZpY2UuY29udGFpbmVyX3BhdGgKICAgIH0KICAgIHByaW50KCJhbGxvd19kZXZpY2VzOiB0cnVlIikKfQoKYWxsb3dfbGludXgoc3RhdGVfb3BzLCBwX29jaSwgaV9vY2kpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIHBfbmFtZXNwYWNlcyA6PSBwX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbGludXg6IHAgbmFtZXNwYWNlcyA9IiwgcF9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlcyA6PSBpX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbGludXg6IGkgbmFtZXNwYWNlcyA9IiwgaV9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlX3dpdGhvdXRfbmV0d29yayA6PSBbb2JqIHwgb2JqIDo9IGlfbmFtZXNwYWNlc1tfXTsgb2JqLlR5cGUgIT0gIm5ldHdvcmsiXQoKICAgIHByaW50KCJhbGxvd19saW51eDogaV9uYW1lc3BhY2Vfd2l0aG91dF9uZXR3b3JrID0iLCBpX25hbWVzcGFjZV93aXRob3V0X25ldHdvcmspCgogICAgcF9uYW1lc3BhY2VzID09IGlfbmFtZXNwYWNlX3dpdGhvdXRfbmV0d29yawoKICAgIGFsbG93X21hc2tlZF9wYXRocyhwX29jaSwgaV9vY2kpCiAgICBhbGxvd19yZWFkb25seV9wYXRocyhwX29jaSwgaV9vY2kpCiAgICBhbGxvd19saW51eF9kZXZpY2VzKHBfb2NpLkxpbnV4LkRldmljZXMsIGlfb2NpLkxpbnV4LkRldmljZXMpCiAgICBhbGxvd19saW51eF9zeXNjdGwocF9vY2kuTGludXgsIGlfb2NpLkxpbnV4KQogICAgcmV0IDo9IGFsbG93X25ldHdvcmtfbmFtZXNwYWNlX3N0YXJ0KHN0YXRlX29wcywgcF9vY2ksIGlfb2NpKQogICAgcmV0LmFsbG93ZWQKCiAgICBvcHMgOj0gcmV0Lm9wcwoKICAgIHByaW50KCJhbGxvd19saW51eDogdHJ1ZSIpCn0KCiMgUmV0cmlldmUgdGhlICJuZXR3b3JrIiBuYW1lc3BhY2UgZnJvbSB0aGUgaW5wdXQgZGF0YSBhbmQgcGFzcyBpdCBvbiBmb3IgdGhlCiMgbmV0d29yayBuYW1lc3BhY2UgcG9saWN5IGNoZWNrcy4KYWxsb3dfbmV0d29ya19uYW1lc3BhY2Vfc3RhcnQoc3RhdGVfb3BzLCBwX29jaSwgaV9vY2kpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIHByaW50KCJhbGxvd19uZXR3b3JrX25hbWVzcGFjZSBzdGFydDogc3RhcnQiKQoKICAgIHBfbmFtZXNwYWNlcyA6PSBwX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IHAgbmFtZXNwYWNlcyA9IiwgcF9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlcyA6PSBpX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IGkgbmFtZXNwYWNlcyA9IiwgaV9uYW1lc3BhY2VzKQoKICAgICMgUmV0dXJuIHBhdGggb2YgdGhlICJuZXR3b3JrIiBuYW1lc3BhY2UKICAgIG5ldHdvcmtfbnMgOj0gW29iaiB8IG9iaiA6PSBpX25hbWVzcGFjZXNbX107IG9iai5UeXBlID09ICJuZXR3b3JrIl0KCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IG5ldHdvcmtfbnMgPSIsIG5ldHdvcmtfbnMpCgogICAgcmV0IDo9IGFsbG93X25ldHdvcmtfbmFtZXNwYWNlKHN0YXRlX29wcywgbmV0d29ya19ucykKICAgIHJldC5hbGxvd2VkCgogICAgb3BzIDo9IHJldC5vcHMKfQoKIyBUaGlzIHJ1bGUgaXMgd2hlbiB0aGVyZSdzIG5vIG5ldHdvcmsgbmFtZXNwYWNlIGluIHRoZSBpbnB1dCBkYXRhLgphbGxvd19uZXR3b3JrX25hbWVzcGFjZShzdGF0ZV9vcHMsIG5ldHdvcmtfbnMpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIGNvdW50KG5ldHdvcmtfbnMpID09IDAKCiAgICBuZXR3b3JrX25zX3BhdGggPSAiIgoKICAgIGFkZF9uZXR3b3JrX25hbWVzcGFjZV90b19zdGF0ZSA6PSBzdGF0ZV9hbGxvd3MoIm5ldHdvcmtfbmFtZXNwYWNlIiwgbmV0d29ya19uc19wYXRoKQogICAgb3BzIDo9IGNvbmNhdF9vcF9pZl9ub3RfbnVsbChzdGF0ZV9vcHMsIGFkZF9uZXR3b3JrX25hbWVzcGFjZV90b19zdGF0ZSkKCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2UgMTogdHJ1ZSIpCn0KCiMgVGhpcyBydWxlIGlzIHdoZW4gdGhlcmUncyBleGFjdGx5IG9uZSBuZXR3b3JrIG5hbWVzcGFjZSBpbiB0aGUgaW5wdXQgZGF0YS4KYWxsb3dfbmV0d29ya19uYW1lc3BhY2Uoc3RhdGVfb3BzLCBuZXR3b3JrX25zKSA6PSB7Im9wcyI6IG9wcywgImFsbG93ZWQiOiB0cnVlfSB7CiAgICBjb3VudChuZXR3b3JrX25zKSA9PSAxCgogICAgYWRkX25ldHdvcmtfbmFtZXNwYWNlX3RvX3N0YXRlIDo9IHN0YXRlX2FsbG93cygibmV0d29ya19uYW1lc3BhY2UiLCBuZXR3b3JrX25zWzBdLlBhdGgpCiAgICBvcHMgOj0gY29uY2F0X29wX2lmX25vdF9udWxsKHN0YXRlX29wcywgYWRkX25ldHdvcmtfbmFtZXNwYWNlX3RvX3N0YXRlKQoKICAgIHByaW50KCJhbGxvd19uZXR3b3JrX25hbWVzcGFjZSAyOiB0cnVlIikKfQoKYWxsb3dfbWFza2VkX3BhdGhzKHBfb2NpLCBpX29jaSkgewogICAgcF9wYXRocyA6PSBwX29jaS5MaW51eC5NYXNrZWRQYXRocwogICAgcHJpbnQoImFsbG93X21hc2tlZF9wYXRocyAxOiBwX3BhdGhzID0iLCBwX3BhdGhzKQoKICAgIGlfcGF0aHMgOj0gaV9vY2kuTGludXguTWFza2VkUGF0aHMKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aHMgMTogaV9wYXRocyA9IiwgaV9wYXRocykKCiAgICBhbGxvd19tYXNrZWRfcGF0aHNfYXJyYXkocF9wYXRocywgaV9wYXRocykKCiAgICBwcmludCgiYWxsb3dfbWFza2VkX3BhdGhzIDE6IHRydWUiKQp9CmFsbG93X21hc2tlZF9wYXRocyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aHMgMjogc3RhcnQiKQoKICAgIG5vdCBwX29jaS5MaW51eC5NYXNrZWRQYXRocwogICAgbm90IGlfb2NpLkxpbnV4Lk1hc2tlZFBhdGhzCgogICAgcHJpbnQoImFsbG93X21hc2tlZF9wYXRocyAyOiB0cnVlIikKfQoKIyBBbGwgdGhlIHBvbGljeSBtYXNrZWQgcGF0aHMgbXVzdCBiZSBtYXNrZWQgaW4gdGhlIGlucHV0IGRhdGEgdG9vLgojIElucHV0IGlzIGFsbG93ZWQgdG8gaGF2ZSBtb3JlIG1hc2tlZCBwYXRocyB0aGFuIHRoZSBwb2xpY3kuCmFsbG93X21hc2tlZF9wYXRoc19hcnJheShwX2FycmF5LCBpX2FycmF5KSB7CiAgICBldmVyeSBwX2VsZW0gaW4gcF9hcnJheSB7CiAgICAgICAgYWxsb3dfbWFza2VkX3BhdGgocF9lbGVtLCBpX2FycmF5KQogICAgfQp9CgphbGxvd19tYXNrZWRfcGF0aChwX2VsZW0sIGlfYXJyYXkpIHsKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aDogcF9lbGVtID0iLCBwX2VsZW0pCgogICAgc29tZSBpX2VsZW0gaW4gaV9hcnJheQogICAgcF9lbGVtID09IGlfZWxlbQoKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aDogdHJ1ZSIpCn0KCmFsbG93X3JlYWRvbmx5X3BhdGhzKHBfb2NpLCBpX29jaSkgewogICAgcF9wYXRocyA6PSBwX29jaS5MaW51eC5SZWFkb25seVBhdGhzCiAgICBwcmludCgiYWxsb3dfcmVhZG9ubHlfcGF0aHMgMTogcF9wYXRocyA9IiwgcF9wYXRocykKCiAgICBpX3BhdGhzIDo9IGlfb2NpLkxpbnV4LlJlYWRvbmx5UGF0aHMKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAxOiBpX3BhdGhzID0iLCBpX3BhdGhzKQoKICAgIGFsbG93X3JlYWRvbmx5X3BhdGhzX2FycmF5KHBfcGF0aHMsIGlfcGF0aHMsIGlfb2NpLkxpbnV4Lk1hc2tlZFBhdGhzKQoKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAxOiB0cnVlIikKfQphbGxvd19yZWFkb25seV9wYXRocyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAyOiBzdGFydCIpCgogICAgbm90IHBfb2NpLkxpbnV4LlJlYWRvbmx5UGF0aHMKICAgIG5vdCBpX29jaS5MaW51eC5SZWFkb25seVBhdGhzCgogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGhzIDI6IHRydWUiKQp9CgojIEFsbCB0aGUgcG9saWN5IHJlYWRvbmx5IHBhdGhzIG11c3QgYmUgZWl0aGVyOgojIC0gUHJlc2VudCBpbiB0aGUgaW5wdXQgcmVhZG9ubHkgcGF0aHMsIG9yCiMgLSBQcmVzZW50IGluIHRoZSBpbnB1dCBtYXNrZWQgcGF0aHMuCiMgSW5wdXQgaXMgYWxsb3dlZCB0byBoYXZlIG1vcmUgcmVhZG9ubHkgcGF0aHMgdGhhbiB0aGUgcG9saWN5LgphbGxvd19yZWFkb25seV9wYXRoc19hcnJheShwX2FycmF5LCBpX2FycmF5LCBtYXNrZWRfcGF0aHMpIHsKICAgIGV2ZXJ5IHBfZWxlbSBpbiBwX2FycmF5IHsKICAgICAgICBhbGxvd19yZWFkb25seV9wYXRoKHBfZWxlbSwgaV9hcnJheSwgbWFza2VkX3BhdGhzKQogICAgfQp9CgphbGxvd19yZWFkb25seV9wYXRoKHBfZWxlbSwgaV9hcnJheSwgbWFza2VkX3BhdGhzKSB7CiAgICBwcmludCgiYWxsb3dfcmVhZG9ubHlfcGF0aCAxOiBwX2VsZW0gPSIsIHBfZWxlbSkKCiAgICBzb21lIGlfZWxlbSBpbiBpX2FycmF5CiAgICBwX2VsZW0gPT0gaV9lbGVtCgogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGggMTogdHJ1ZSIpCn0KYWxsb3dfcmVhZG9ubHlfcGF0aChwX2VsZW0sIGlfYXJyYXksIG1hc2tlZF9wYXRocykgewogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGggMjogcF9lbGVtID0iLCBwX2VsZW0pCgogICAgc29tZSBpX21hc2tlZCBpbiBtYXNrZWRfcGF0aHMKICAgIHBfZWxlbSA9PSBpX21hc2tlZAoKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRoIDI6IHRydWUiKQp9CgphbGxvd19saW51eF9kZXZpY2VzKHBfZGV2aWNlcywgaV9kZXZpY2VzKSB7CiAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogc3RhcnQiKQogICAgZXZlcnkgaV9kZXZpY2UgaW4gaV9kZXZpY2VzIHsKICAgICAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogaV9kZXZpY2UgPSIsIGlfZGV2aWNlKQogICAgICAgIHNvbWUgcF9kZXZpY2UgaW4gcF9kZXZpY2VzCiAgICAgICAgaV9kZXZpY2UuUGF0aCA9PSBwX2RldmljZS5QYXRoCiAgICB9CiAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogdHJ1ZSIpCn0KCmFsbG93X2xpbnV4X3N5c2N0bChwX2xpbnV4LCBpX2xpbnV4KSB7CiAgICBwcmludCgiYWxsb3dfbGludXhfc3lzY3RsIDE6IHN0YXJ0IikKICAgIG5vdCBpX2xpbnV4LlN5c2N0bAogICAgcHJpbnQoImFsbG93X2xpbnV4X3N5c2N0bCAxOiB0cnVlIikKfQoKYWxsb3dfbGludXhfc3lzY3RsKHBfbGludXgsIGlfbGludXgpIHsKICAgIHByaW50KCJhbGxvd19saW51eF9zeXNjdGwgMjogc3RhcnQiKQogICAgcF9zeXNjdGwgOj0gcF9saW51eC5TeXNjdGwKICAgIGlfc3lzY3RsIDo9IGlfbGludXguU3lzY3RsCiAgICBldmVyeSBpX25hbWUsIGlfdmFsIGluIGlfc3lzY3RsIHsKICAgICAgICBwcmludCgiYWxsb3dfbGludXhfc3lzY3RsIDI6IGlfbmFtZSA9IiwgaV9uYW1lLCAiaV92YWwgPSIsIGlfdmFsKQogICAgICAgIHBfc3lzY3RsW2lfbmFtZV0gPT0gaV92YWwKICAgIH0KICAgIHByaW50KCJhbGxvd19saW51eF9zeXNjdGwgMjogdHJ1ZSIpCn0KCiMgQ2hlY2sgdGhlIGNvbnNpc3RlbmN5IG9mIHRoZSBpbnB1dCAiaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5idW5kbGVfcGF0aCIKIyBhbmQgaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCIgdmFsdWVzIHdpdGggb3RoZXIgZmllbGRzLgphbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZChwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpIHsKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogc3RhcnQiKQoKICAgIGJ1bmRsZV9wYXRoIDo9IGlfb2NpLkFubm90YXRpb25zWyJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmJ1bmRsZV9wYXRoIl0KICAgIGJ1bmRsZV9pZCA6PSByZXBsYWNlKGJ1bmRsZV9wYXRoLCAiL3J1bi9jb250YWluZXJkL2lvLmNvbnRhaW5lcmQucnVudGltZS52Mi50YXNrL2s4cy5pby8iLCAiIikKCiAgICBidW5kbGVfaWRfZm9ybWF0IDo9IGNvbmNhdCgiIiwgWyJeIiwgQlVORExFX0lELCAiJCJdKQogICAgcmVnZXgubWF0Y2goYnVuZGxlX2lkX2Zvcm1hdCwgYnVuZGxlX2lkKQoKICAgIGtleSA6PSAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCIKCiAgICBwX3JlZ2V4IDo9IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIHNhbmRib3hfaWQgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQoKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogc2FuZGJveF9pZCA9Iiwgc2FuZGJveF9pZCwgInJlZ2V4ID0iLCBwX3JlZ2V4KQogICAgcmVnZXgubWF0Y2gocF9yZWdleCwgc2FuZGJveF9pZCkKCiAgICBhbGxvd19yb290X3BhdGgocF9vY2ksIGlfb2NpLCBidW5kbGVfaWQpCgogICAgZXZlcnkgaV9tb3VudCBpbiBpX29jaS5Nb3VudHMgewogICAgICAgIGFsbG93X21vdW50KHBfb2NpLCBpX21vdW50LCBpX3N0b3JhZ2VzLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpCiAgICB9CgogICAgYWxsb3dfc3RvcmFnZXMocF9zdG9yYWdlcywgaV9zdG9yYWdlcywgYnVuZGxlX2lkLCBzYW5kYm94X2lkKQoKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogdHJ1ZSIpCn0KCmFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHBfcHJvY2VzcyA9IiwgcF9wcm9jZXNzKQogICAgcHJpbnQoImFsbG93X3Byb2Nlc3NfY29tbW9uOiBpX3Byb2Nlc3MgPSAiLCBpX3Byb2Nlc3MpCiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHNfbmFtZSA9Iiwgc19uYW1lKQoKICAgIHBfcHJvY2Vzcy5Dd2QgPT0gaV9wcm9jZXNzLkN3ZAogICAgcF9wcm9jZXNzLk5vTmV3UHJpdmlsZWdlcyA9PSBpX3Byb2Nlc3MuTm9OZXdQcml2aWxlZ2VzCgogICAgYWxsb3dfdXNlcihwX3Byb2Nlc3MsIGlfcHJvY2VzcykKICAgIGFsbG93X2VudihwX3Byb2Nlc3MsIGlfcHJvY2Vzcywgc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHRydWUiKQp9CgojIENvbXBhcmUgdGhlIE9DSSBQcm9jZXNzIGZpZWxkIG9mIGEgcG9saWN5IGNvbnRhaW5lciB3aXRoIHRoZSBpbnB1dCBPQ0kgUHJvY2VzcyBmcm9tIGEgQ3JlYXRlQ29udGFpbmVyUmVxdWVzdAphbGxvd19wcm9jZXNzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfcHJvY2Vzczogc3RhcnQiKQoKICAgIGFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgYWxsb3dfY2FwcyhwX3Byb2Nlc3MuQ2FwYWJpbGl0aWVzLCBpX3Byb2Nlc3MuQ2FwYWJpbGl0aWVzKQogICAgcF9wcm9jZXNzLlRlcm1pbmFsID09IGlfcHJvY2Vzcy5UZXJtaW5hbAoKICAgIHByaW50KCJhbGxvd19wcm9jZXNzOiB0cnVlIikKfQoKIyBDb21wYXJlIHRoZSBPQ0kgUHJvY2VzcyBmaWVsZCBvZiBhIHBvbGljeSBjb250YWluZXIgd2l0aCB0aGUgaW5wdXQgcHJvY2VzcyBmaWVsZCBmcm9tIEV4ZWNQcm9jZXNzUmVxdWVzdAphbGxvd19pbnRlcmFjdGl2ZV9wcm9jZXNzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfaW50ZXJhY3RpdmVfcHJvY2Vzczogc3RhcnQiKQoKICAgIGFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgYWxsb3dfZXhlY19jYXBzKGlfcHJvY2Vzcy5DYXBhYmlsaXRpZXMpCgogICAgIyBUaGVzZSBhcmUgY29tbWFuZHMgZW5hYmxlZCB1c2luZyBFeGVjUHJvY2Vzc1JlcXVlc3QgY29tbWFuZHMgYW5kL29yIHJlZ2V4IGZyb20gdGhlIHNldHRpbmdzIGZpbGUuCiAgICAjIFRoZXkgY2FuIGJlIGV4ZWN1dGVkIGludGVyYWN0aXZlbHkgc28gYWxsb3cgdGhlbSB0byB1c2UgYW55IHZhbHVlIGZvciBpX3Byb2Nlc3MuVGVybWluYWwuCgogICAgcHJpbnQoImFsbG93X2ludGVyYWN0aXZlX3Byb2Nlc3M6IHRydWUiKQp9CgojIENvbXBhcmUgdGhlIE9DSSBQcm9jZXNzIGZpZWxkIG9mIGEgcG9saWN5IGNvbnRhaW5lciB3aXRoIHRoZSBpbnB1dCBwcm9jZXNzIGZpZWxkIGZyb20gRXhlY1Byb2Nlc3NSZXF1ZXN0CmFsbG93X3Byb2JlX3Byb2Nlc3MocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19wcm9iZV9wcm9jZXNzOiBzdGFydCIpCgogICAgYWxsb3dfcHJvY2Vzc19jb21tb24ocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpCiAgICBhbGxvd19leGVjX2NhcHMoaV9wcm9jZXNzLkNhcGFiaWxpdGllcykKICAgIHBfcHJvY2Vzcy5UZXJtaW5hbCA9PSBpX3Byb2Nlc3MuVGVybWluYWwKCiAgICBwcmludCgiYWxsb3dfcHJvYmVfcHJvY2VzczogdHJ1ZSIpCn0KCmFsbG93X3VzZXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MpIHsKICAgIHBfdXNlciA6PSBwX3Byb2Nlc3MuVXNlcgogICAgaV91c2VyIDo9IGlfcHJvY2Vzcy5Vc2VyCgogICAgcHJpbnQoImFsbG93X3VzZXI6IGlucHV0IHVpZCA9IiwgaV91c2VyLlVJRCwgInBvbGljeSB1aWQgPSIsIHBfdXNlci5VSUQpCiAgICBwX3VzZXIuVUlEID09IGlfdXNlci5VSUQKCiAgICAjIFRPRE86IHRyYWNrIGRvd24gdGhlIHJlYXNvbiBmb3IgcmVnaXN0cnkuazhzLmlvL3BhdXNlOjMuOSBiZWluZwogICAgIyAgICAgICBleGVjdXRlZCB3aXRoIGdpZCA9IDAgZGVzcGl0ZSBoYXZpbmcgIjY1NTM1OjY1NTM1IiBpbiBpdHMgY29udGFpbmVyIGltYWdlCiAgICAjICAgICAgIGNvbmZpZy4KICAgICNwcmludCgiYWxsb3dfdXNlcjogaW5wdXQgZ2lkID0iLCBpX3VzZXIuR0lELCAicG9saWN5IGdpZCA9IiwgcF91c2VyLkdJRCkKICAgICNwX3VzZXIuR0lEID09IGlfdXNlci5HSUQKCiAgICAjIFRPRE86IGNvbXBhcmUgdGhlIGFkZGl0aW9uYWxHaWRzIGZpZWxkIHRvbyBhZnRlciBjb21wdXRpbmcgaXRzIHZhbHVlCiAgICAjIGJhc2VkIG9uIC9ldGMvcGFzc3dkIGFuZCAvZXRjL2dyb3VwIGZyb20gdGhlIGNvbnRhaW5lciBpbWFnZS4KfQoKYWxsb3dfZGVwcmVjYXRlZF9hcmdzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZ3MgMTogbm8gYXJncyIpCgogICAgbm90IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJncwogICAgbm90IGlfcHJvY2Vzcy5BcmdzCgogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAxOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZ3MocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSkgewogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiBwb2xpY3kgYXJncyA9IiwgcF9wcm9jZXNzLkRlcHJlY2F0ZWRBcmdzKQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiBpbnB1dCBhcmdzID0iLCBpX3Byb2Nlc3MuQXJncykKCiAgICBjb3VudChwX3Byb2Nlc3MuRGVwcmVjYXRlZEFyZ3MpID09IGNvdW50KGlfcHJvY2Vzcy5BcmdzKQoKICAgIGV2ZXJ5IGksIGlfYXJnIGluIGlfcHJvY2Vzcy5BcmdzIHsKICAgICAgICBhbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpCiAgICB9CgogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDE6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgcF9hcmcyIDo9IHJlcGxhY2UocF9hcmcsICIkJCIsICIkIikKICAgIHBfYXJnMiA9PSBpX2FyZwoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAxOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDI6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgIyBUT0RPOiBjYW4gJChub2RlLW5hbWUpIGJlIGhhbmRsZWQgYmV0dGVyPwogICAgY29udGFpbnMocF9hcmcsICIkKG5vZGUtbmFtZSkiKQoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAyOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDM6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgcF9hcmcyIDo9IHJlcGxhY2UocF9hcmcsICIkJCIsICIkIikKICAgIHBfYXJnMyA6PSByZXBsYWNlKHBfYXJnMiwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAzOiBwX2FyZzMgPSIsIHBfYXJnMykKICAgIHBfYXJnMyA9PSBpX2FyZwoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAzOiB0cnVlIikKfQoKIyBPQ0kgcHJvY2Vzcy5FbnYgZmllbGQKYWxsb3dfZW52KHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfZW52OiBwIGVudiA9IiwgcF9wcm9jZXNzLkVudikKICAgIHByaW50KCJhbGxvd19lbnY6IGkgZW52ID0iLCBpX3Byb2Nlc3MuRW52KQoKICAgIGV2ZXJ5IGlfdmFyIGluIGlfcHJvY2Vzcy5FbnYgewogICAgICAgIHByaW50KCJhbGxvd19lbnY6IGlfdmFyID0iLCBpX3ZhcikKICAgICAgICBhbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgfQoKICAgIHByaW50KCJhbGxvd19lbnY6IHRydWUiKQp9CgojIEFsbG93IGlucHV0IGVudiB2YXJpYWJsZXMgdGhhdCBhcmUgcHJlc2VudCBpbiB0aGUgcG9saWN5IGRhdGEgdG9vLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHBfdmFyID09IGlfdmFyCiAgICBwcmludCgiYWxsb3dfdmFyIDE6IHRydWUiKQp9CgojIE1hdGNoIGlucHV0IHdpdGggb25lIG9mIHRoZSBwb2xpY3kgdmFyaWFibGVzLCBhZnRlciBzdWJzdGl0dXRpbmcgJChzYW5kYm94LW5hbWUpLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHByaW50KCJhbGxvd192YXIgMjogcF92YXIgPSIsIHBfdmFyKQoKICAgIHBfdmFyX3NwbGl0IDo9IHNwbGl0KHBfdmFyLCAiPSIpCiAgICBjb3VudChwX3Zhcl9zcGxpdCkgPT0gMgoKICAgIHBfdmFyX3NwbGl0WzFdID09ICIkKHNhbmRib3gtbmFtZSkiCgogICAgaV92YXJfc3BsaXQgOj0gc3BsaXQoaV92YXIsICI9IikKICAgIGNvdW50KGlfdmFyX3NwbGl0KSA9PSAyCgogICAgaV92YXJfc3BsaXRbMF0gPT0gcF92YXJfc3BsaXRbMF0KICAgIHJlZ2V4Lm1hdGNoKHNfbmFtZSwgaV92YXJfc3BsaXRbMV0pCgogICAgcHJpbnQoImFsbG93X3ZhciAyOiB0cnVlIikKfQoKIyBBbGxvdyBpbnB1dCBlbnYgdmFyaWFibGVzIHRoYXQgbWF0Y2ggd2l0aCBhIHJlcXVlc3RfZGVmYXVsdHMgcmVnZXguCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHNvbWUgcF9yZWdleDEgaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5DcmVhdGVDb250YWluZXJSZXF1ZXN0LmFsbG93X2Vudl9yZWdleAogICAgcF9yZWdleDIgOj0gcmVwbGFjZShwX3JlZ2V4MSwgIiQoaXB2NF9hKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcHY0X2EpCiAgICBwX3JlZ2V4MyA6PSByZXBsYWNlKHBfcmVnZXgyLCAiJChpcF9wKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcF9wKQogICAgcF9yZWdleDQgOj0gcmVwbGFjZShwX3JlZ2V4MywgIiQoc3ZjX25hbWUpIiwgcG9saWN5X2RhdGEuY29tbW9uLnN2Y19uYW1lKQogICAgcF9yZWdleDUgOj0gcmVwbGFjZShwX3JlZ2V4NCwgIiQoZG5zX2xhYmVsKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5kbnNfbGFiZWwpCgogICAgcHJpbnQoImFsbG93X3ZhciAzOiBwX3JlZ2V4NSA9IiwgcF9yZWdleDUpCiAgICByZWdleC5tYXRjaChwX3JlZ2V4NSwgaV92YXIpCgogICAgcHJpbnQoImFsbG93X3ZhciAzOiB0cnVlIikKfQoKIyBBbGxvdyBmaWVsZFJlZiAiZmllbGRQYXRoOiBzdGF0dXMucG9kSVAiIHZhbHVlcy4KYWxsb3dfdmFyKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBpX3Zhciwgc19uYW1lLCBzX25hbWVzcGFjZSkgewogICAgbmFtZV92YWx1ZSA6PSBzcGxpdChpX3ZhciwgIj0iKQogICAgY291bnQobmFtZV92YWx1ZSkgPT0gMgogICAgaXNfaXAobmFtZV92YWx1ZVsxXSkKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIGFsbG93X3BvZF9pcF92YXIobmFtZV92YWx1ZVswXSwgcF92YXIpCgogICAgcHJpbnQoImFsbG93X3ZhciA0OiB0cnVlIikKfQoKIyBBbGxvdyBjb21tb24gZmllbGRSZWYgdmFyaWFibGVzLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBuYW1lX3ZhbHVlIDo9IHNwbGl0KGlfdmFyLCAiPSIpCiAgICBjb3VudChuYW1lX3ZhbHVlKSA9PSAyCgogICAgc29tZSBwX3ZhciBpbiBwX3Byb2Nlc3MuRW52CiAgICBwX25hbWVfdmFsdWUgOj0gc3BsaXQocF92YXIsICI9IikKICAgIGNvdW50KHBfbmFtZV92YWx1ZSkgPT0gMgoKICAgIHBfbmFtZV92YWx1ZVswXSA9PSBuYW1lX3ZhbHVlWzBdCgogICAgIyBUT0RPOiBzaG91bGQgdGhlc2UgYmUgaGFuZGxlZCBpbiBhIGRpZmZlcmVudCB3YXk/CiAgICBhbHdheXNfYWxsb3dlZCA6PSBbIiQoaG9zdC1uYW1lKSIsICIkKG5vZGUtbmFtZSkiLCAiJChwb2QtdWlkKSJdCiAgICBzb21lIGFsbG93ZWQgaW4gYWx3YXlzX2FsbG93ZWQKICAgIGNvbnRhaW5zKHBfbmFtZV92YWx1ZVsxXSwgYWxsb3dlZCkKCiAgICBwcmludCgiYWxsb3dfdmFyIDU6IHRydWUiKQp9CgojIEFsbG93IGZpZWxkUmVmICJmaWVsZFBhdGg6IHN0YXR1cy5ob3N0SVAiIHZhbHVlcy4KYWxsb3dfdmFyKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBpX3Zhciwgc19uYW1lLCBzX25hbWVzcGFjZSkgewogICAgbmFtZV92YWx1ZSA6PSBzcGxpdChpX3ZhciwgIj0iKQogICAgY291bnQobmFtZV92YWx1ZSkgPT0gMgogICAgaXNfaXAobmFtZV92YWx1ZVsxXSkKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIGFsbG93X2hvc3RfaXBfdmFyKG5hbWVfdmFsdWVbMF0sIHBfdmFyKQoKICAgIHByaW50KCJhbGxvd192YXIgNjogdHJ1ZSIpCn0KCiMgQWxsb3cgcmVzb3VyY2VGaWVsZFJlZiB2YWx1ZXMgKGUuZy4sICJsaW1pdHMuY3B1IikuCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIG5hbWVfdmFsdWUgOj0gc3BsaXQoaV92YXIsICI9IikKICAgIGNvdW50KG5hbWVfdmFsdWUpID09IDIKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHBfbmFtZV92YWx1ZSA6PSBzcGxpdChwX3ZhciwgIj0iKQogICAgY291bnQocF9uYW1lX3ZhbHVlKSA9PSAyCgogICAgcF9uYW1lX3ZhbHVlWzBdID09IG5hbWVfdmFsdWVbMF0KCiAgICAjIGEgdmFyaWFibGUgd2Ugc2hvdWxkIGJlIHZhbGlkYXRpbmcgdXNpbmcgYSByZWdleCBmcm9tIHNldHRpbmdzCiAgICBwX25hbWVfdmFsdWVbMV0gPT0gIiQodmFsaWRhdGUtZnJvbS1zZXR0aW5ncykiCgogICAgcmVnZXhfdmFsIDo9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuQ3JlYXRlQ29udGFpbmVyUmVxdWVzdC5hbGxvd19lbnZfcmVnZXhfbWFwW25hbWVfdmFsdWVbMF1dCgogICAgcHJpbnQoImFsbG93X3ZhciA3OiB2YWwgPSIsIG5hbWVfdmFsdWVbMV0pCiAgICBwcmludCgiYWxsb3dfdmFyIDc6IHJlZ2V4X3ZhbCA9IiwgcmVnZXhfdmFsKQoKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4X3ZhbCwgbmFtZV92YWx1ZVsxXSkKCiAgICBwcmludCgiYWxsb3dfdmFyIDc6IHRydWUiKQp9CgojIE1hdGNoIGlucHV0IHdpdGggb25lIG9mIHRoZSBwb2xpY3kgdmFyaWFibGVzLCBhZnRlciBzdWJzdGl0dXRpbmcgJChzYW5kYm94LW5hbWVzcGFjZSkuCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHNvbWUgcF92YXIgaW4gcF9wcm9jZXNzLkVudgogICAgcF92YXIyIDo9IHJlcGxhY2UocF92YXIsICIkKHNhbmRib3gtbmFtZXNwYWNlKSIsIHNfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd192YXIgODogcF92YXIyID0iLCBwX3ZhcjIpCiAgICBwX3ZhcjIgPT0gaV92YXIKCiAgICBwcmludCgiYWxsb3dfdmFyIDg6IHRydWUiKQp9CgphbGxvd19wb2RfaXBfdmFyKHZhcl9uYW1lLCBwX3ZhcikgewogICAgcHJpbnQoImFsbG93X3BvZF9pcF92YXI6IHZhcl9uYW1lID0iLCB2YXJfbmFtZSwgInBfdmFyID0iLCBwX3ZhcikKCiAgICBwX25hbWVfdmFsdWUgOj0gc3BsaXQocF92YXIsICI9IikKICAgIGNvdW50KHBfbmFtZV92YWx1ZSkgPT0gMgoKICAgIHBfbmFtZV92YWx1ZVswXSA9PSB2YXJfbmFtZQogICAgcF9uYW1lX3ZhbHVlWzFdID09ICIkKHBvZC1pcCkiCgogICAgcHJpbnQoImFsbG93X3BvZF9pcF92YXI6IHRydWUiKQp9CgphbGxvd19ob3N0X2lwX3Zhcih2YXJfbmFtZSwgcF92YXIpIHsKICAgIHByaW50KCJhbGxvd19ob3N0X2lwX3ZhcjogdmFyX25hbWUgPSIsIHZhcl9uYW1lLCAicF92YXIgPSIsIHBfdmFyKQoKICAgIHBfbmFtZV92YWx1ZSA6PSBzcGxpdChwX3ZhciwgIj0iKQogICAgY291bnQocF9uYW1lX3ZhbHVlKSA9PSAyCgogICAgcF9uYW1lX3ZhbHVlWzBdID09IHZhcl9uYW1lCiAgICBwX25hbWVfdmFsdWVbMV0gPT0gIiQoaG9zdC1pcCkiCgogICAgcHJpbnQoImFsbG93X2hvc3RfaXBfdmFyOiB0cnVlIikKfQoKaXNfaXAodmFsdWUpIHsKICAgIGJ5dGVzID0gc3BsaXQodmFsdWUsICIuIikKICAgIGNvdW50KGJ5dGVzKSA9PSA0CgogICAgaXNfaXBfZmlyc3RfYnl0ZShieXRlc1swXSkKICAgIGlzX2lwX290aGVyX2J5dGUoYnl0ZXNbMV0pCiAgICBpc19pcF9vdGhlcl9ieXRlKGJ5dGVzWzJdKQogICAgaXNfaXBfb3RoZXJfYnl0ZShieXRlc1szXSkKfQppc19pcF9maXJzdF9ieXRlKGNvbXBvbmVudCkgewogICAgbnVtYmVyID0gdG9fbnVtYmVyKGNvbXBvbmVudCkKICAgIG51bWJlciA+PSAxCiAgICBudW1iZXIgPD0gMjU1Cn0KaXNfaXBfb3RoZXJfYnl0ZShjb21wb25lbnQpIHsKICAgIG51bWJlciA9IHRvX251bWJlcihjb21wb25lbnQpCiAgICBudW1iZXIgPj0gMAogICAgbnVtYmVyIDw9IDI1NQp9CgojIE9DSSByb290LlBhdGgKYWxsb3dfcm9vdF9wYXRoKHBfb2NpLCBpX29jaSwgYnVuZGxlX2lkKSB7CiAgICBpX3BhdGggOj0gaV9vY2kuUm9vdC5QYXRoCiAgICBwX3BhdGgxIDo9IHBfb2NpLlJvb3QuUGF0aAogICAgcHJpbnQoImFsbG93X3Jvb3RfcGF0aDogaV9wYXRoID0iLCBpX3BhdGgsICJwX3BhdGgxID0iLCBwX3BhdGgxKQoKICAgIHBfcGF0aDIgOj0gcmVwbGFjZShwX3BhdGgxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfcm9vdF9wYXRoOiBwX3BhdGgyID0iLCBwX3BhdGgyKQoKICAgIHBfcGF0aDMgOj0gcmVwbGFjZShwX3BhdGgyLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X3Jvb3RfcGF0aDogcF9wYXRoMyA9IiwgcF9wYXRoMykKCiAgICBwX3BhdGgzID09IGlfcGF0aAoKICAgIHByaW50KCJhbGxvd19yb290X3BhdGg6IHRydWUiKQp9CgojIGRldmljZSBtb3VudHMKYWxsb3dfbW91bnQocF9vY2ksIGlfbW91bnQsIGlfc3RvcmFnZXMsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcHJpbnQoImFsbG93X21vdW50OiBpX21vdW50ID0iLCBpX21vdW50KQoKICAgIHNvbWUgcF9tb3VudCBpbiBwX29jaS5Nb3VudHMKICAgIHNvbWUgaV9zdG9yYWdlIGluIGlfc3RvcmFnZXMKCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IHBfbW91bnQgPSIsIHBfbW91bnQpCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IGlfc3RvcmFnZSA9IiwgaV9zdG9yYWdlKQoKICAgIGNoZWNrX21vdW50KHBfbW91bnQsIGlfbW91bnQsIGlfc3RvcmFnZSwgYnVuZGxlX2lkLCBzYW5kYm94X2lkKQoKICAgICMgVE9ETzogYXJlIHRoZXJlIGFueSBvdGhlciByZXF1aXJlZCBwb2xpY3kgY2hlY2tzIGZvciBtb3VudHMgLSBlLmcuLAogICAgIyAgICAgICBtdWx0aXBsZSBtb3VudHMgd2l0aCBzYW1lIHNvdXJjZSBvciBkZXN0aW5hdGlvbj8KCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IHRydWUiKQp9CgpjaGVja19tb3VudChwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcF9tb3VudCA9PSBpX21vdW50CiAgICBwcmludCgiY2hlY2tfbW91bnQgMTogdHJ1ZSIpCn0KY2hlY2tfbW91bnQocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHBfbW91bnQuZGVzdGluYXRpb24gPT0gaV9tb3VudC5kZXN0aW5hdGlvbgogICAgcF9tb3VudC50eXBlXyA9PSBpX21vdW50LnR5cGVfCiAgICBwX21vdW50Lm9wdGlvbnMgPT0gaV9tb3VudC5vcHRpb25zCgogICAgbW91bnRfc291cmNlX2FsbG93cyhwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkKCiAgICBwcmludCgiY2hlY2tfbW91bnQgMjogdHJ1ZSIpCn0KCm1vdW50X3NvdXJjZV9hbGxvd3MocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHJlZ2V4MSA6PSBwX21vdW50LnNvdXJjZQogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5tb3VudF9zb3VyY2VfY3BhdGgpCiAgICByZWdleDQgOj0gcmVwbGFjZShyZWdleDMsICIkKGJ1bmRsZS1pZCkiLCBidW5kbGVfaWQpCgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMTogcmVnZXg0ID0iLCByZWdleDQpCiAgICByZWdleC5tYXRjaChyZWdleDQsIGlfbW91bnQuc291cmNlKQoKICAgIHByaW50KCJtb3VudF9zb3VyY2VfYWxsb3dzIDE6IHRydWUiKQp9Cm1vdW50X3NvdXJjZV9hbGxvd3MocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHJlZ2V4MSA6PSBwX21vdW50LnNvdXJjZQogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5tb3VudF9zb3VyY2VfY3BhdGgpCiAgICByZWdleDQgOj0gcmVwbGFjZShyZWdleDMsICIkKHNhbmRib3gtaWQpIiwgc2FuZGJveF9pZCkKCiAgICBwcmludCgibW91bnRfc291cmNlX2FsbG93cyAyOiByZWdleDQgPSIsIHJlZ2V4NCkKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4NCwgaV9tb3VudC5zb3VyY2UpCgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMjogdHJ1ZSIpCn0KbW91bnRfc291cmNlX2FsbG93cyhwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogaV9tb3VudC5zb3VyY2UgPSIsIGlfbW91bnQuc291cmNlKQogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogaV9zdG9yYWdlLm1vdW50X3BvaW50ID0iLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCgogICAgaV9tb3VudC5zb3VyY2UgPT0gaV9zdG9yYWdlLm1vdW50X3BvaW50CgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogdHJ1ZSIpCn0KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBDcmVhdGUgY29udGFpbmVyIFN0b3JhZ2VzCgphbGxvd19zdG9yYWdlcyhwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHBfY291bnQgOj0gY291bnQocF9zdG9yYWdlcykKICAgIGlfY291bnQgOj0gY291bnQoaV9zdG9yYWdlcykKICAgIHByaW50KCJhbGxvd19zdG9yYWdlczogcF9jb3VudCA9IiwgcF9jb3VudCwgImlfY291bnQgPSIsIGlfY291bnQpCgogICAgcF9jb3VudCA9PSBpX2NvdW50CgogICAgIyBHZXQgdGhlIGNvbnRhaW5lciBpbWFnZSBsYXllciBJRHMgYW5kIHZlcml0eSByb290IGhhc2hlcywgZnJvbSB0aGUgIm92ZXJsYXlmcyIgc3RvcmFnZS4KICAgIHNvbWUgb3ZlcmxheV9zdG9yYWdlIGluIHBfc3RvcmFnZXMKICAgIG92ZXJsYXlfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIHByaW50KCJhbGxvd19zdG9yYWdlczogb3ZlcmxheV9zdG9yYWdlID0iLCBvdmVybGF5X3N0b3JhZ2UpCiAgICBjb3VudChvdmVybGF5X3N0b3JhZ2Uub3B0aW9ucykgPT0gMgoKICAgIGxheWVyX2lkcyA6PSBzcGxpdChvdmVybGF5X3N0b3JhZ2Uub3B0aW9uc1swXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiBsYXllcl9pZHMgPSIsIGxheWVyX2lkcykKCiAgICByb290X2hhc2hlcyA6PSBzcGxpdChvdmVybGF5X3N0b3JhZ2Uub3B0aW9uc1sxXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiByb290X2hhc2hlcyA9Iiwgcm9vdF9oYXNoZXMpCgogICAgZXZlcnkgaV9zdG9yYWdlIGluIGlfc3RvcmFnZXMgewogICAgICAgIGFsbG93X3N0b3JhZ2UocF9zdG9yYWdlcywgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpCiAgICB9CgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiB0cnVlIikKfQoKYWxsb3dfc3RvcmFnZShwX3N0b3JhZ2VzLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgc29tZSBwX3N0b3JhZ2UgaW4gcF9zdG9yYWdlcwoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiBwX3N0b3JhZ2UgPSIsIHBfc3RvcmFnZSkKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiBpX3N0b3JhZ2UgPSIsIGlfc3RvcmFnZSkKCiAgICBwX3N0b3JhZ2UuZHJpdmVyICAgICAgICAgICA9PSBpX3N0b3JhZ2UuZHJpdmVyCiAgICBwX3N0b3JhZ2UuZHJpdmVyX29wdGlvbnMgICA9PSBpX3N0b3JhZ2UuZHJpdmVyX29wdGlvbnMKICAgIHBfc3RvcmFnZS5mc19ncm91cCAgICAgICAgID09IGlfc3RvcmFnZS5mc19ncm91cAogICAgcF9zdG9yYWdlLmZzdHlwZSAgICAgICAgICAgPT0gaV9zdG9yYWdlLmZzdHlwZQoKICAgIGFsbG93X3N0b3JhZ2Vfc291cmNlKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKQogICAgYWxsb3dfc3RvcmFnZV9vcHRpb25zKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKQogICAgYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKQoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiB0cnVlIikKfQoKYWxsb3dfc3RvcmFnZV9zb3VyY2UocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX3NvdXJjZSAxOiBzdGFydCIpCgogICAgcF9zdG9yYWdlLnNvdXJjZSA9PSBpX3N0b3JhZ2Uuc291cmNlCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDE6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX3NvdXJjZShwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDI6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCgogICAgIyBEREREOkJCOkRELkY6IERvbWFpbjpCdXM6RGV2aWNlLkZ1bmN0aW9uCiAgICAjIGh0dHBzOi8vd3d3Lmtlcm5lbC5vcmcvZG9jL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtYnVzLXBjaQogICAgcmVnZXgubWF0Y2goYF5bYS1mMC05XXs0fTpbYS1mMC05XXsyfTpbYS1mMC05XXsyfVwuW2EtZjAtOV0kYCwgaV9zdG9yYWdlLnNvdXJjZSkKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9zb3VyY2UgMjogdHJ1ZSIpCn0KCmFsbG93X3N0b3JhZ2Vfc291cmNlKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKSB7CiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9zb3VyY2UgMzogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIGlfc3RvcmFnZS5zb3VyY2UgPT0gIm5vbmUiCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDM6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX3NvdXJjZShwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDQ6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJzbWIiCgogICAgIyBQYXR0ZXJuOiAvLzxzdG9yYWdlLWFjY291bnQtbmFtZT4uZmlsZS5jb3JlLndpbmRvd3MubmV0LzxrOHMtUFZDLW5hbWU+CiAgICAjIFN0b3JhZ2UgYWNjb3VudCBuYW1lOiBodHRwczovL2xlYXJuLm1pY3Jvc29mdC5jb20vZW4tdXMvYXp1cmUvc3RvcmFnZS9jb21tb24vc3RvcmFnZS1hY2NvdW50LW92ZXJ2aWV3I3N0b3JhZ2UtYWNjb3VudC1uYW1lCiAgICAjIEs4cyBQVkMgbmFtZTogaHR0cHM6Ly9rdWJlcm5ldGVzLmlvL2RvY3MvY29uY2VwdHMvb3ZlcnZpZXcvd29ya2luZy13aXRoLW9iamVjdHMvbmFtZXMvI2Rucy1zdWJkb21haW4tbmFtZXMKICAgIHJlZ2V4Lm1hdGNoKGBeXC9cLyhbYS16MC05XXszLDI0fSlcLmZpbGVcLmNvcmVcLndpbmRvd3NcLm5ldFwvW2EtejAtOV0oW2EtejAtOS4tXXswLDI1MX1bYS16MC05XSk/JGAsIGlfc3RvcmFnZS5zb3VyY2UpCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDQ6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMTogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgIT0gIm92ZXJsYXlmcyIKICAgIHBfc3RvcmFnZS5vcHRpb25zID09IGlfc3RvcmFnZS5vcHRpb25zCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAxOiB0cnVlIikKfQphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIGNvdW50KHBfc3RvcmFnZS5vcHRpb25zKSA9PSAyCgogICAgcG9saWN5X2lkcyA6PSBzcGxpdChwX3N0b3JhZ2Uub3B0aW9uc1swXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBwb2xpY3lfaWRzID0iLCBwb2xpY3lfaWRzKQogICAgcG9saWN5X2lkcyA9PSBsYXllcl9pZHMKCiAgICBwb2xpY3lfaGFzaGVzIDo9IHNwbGl0KHBfc3RvcmFnZS5vcHRpb25zWzFdLCAiOiIpCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IHBvbGljeV9oYXNoZXMgPSIsIHBvbGljeV9oYXNoZXMpCgogICAgcF9jb3VudCA6PSBjb3VudChwb2xpY3lfaWRzKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBwX2NvdW50ID0iLCBwX2NvdW50KQogICAgcF9jb3VudCA+PSAxCiAgICBwX2NvdW50ID09IGNvdW50KHBvbGljeV9oYXNoZXMpCgogICAgaV9jb3VudCA6PSBjb3VudChpX3N0b3JhZ2Uub3B0aW9ucykKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogaV9jb3VudCA9IiwgaV9jb3VudCkKICAgIGlfY291bnQgPT0gcF9jb3VudCArIDMKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zWzBdID0iLCBpX3N0b3JhZ2Uub3B0aW9uc1swXSkKICAgIGlfc3RvcmFnZS5vcHRpb25zWzBdID09ICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQubGF5ZXItc3JjLXByZWZpeD0vdmFyL2xpYi9jb250YWluZXJkL2lvLmNvbnRhaW5lcmQuc25hcHNob3R0ZXIudjEudGFyZGV2L2xheWVycyIKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zW2lfY291bnQgLSAyXSA9IiwgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDJdKQogICAgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDJdID09ICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQub3ZlcmxheS1ydyIKCiAgICBsb3dlcmRpciA6PSBjb25jYXQoIj0iLCBbImxvd2VyZGlyIiwgcF9zdG9yYWdlLm9wdGlvbnNbMF1dKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBsb3dlcmRpciA9IiwgbG93ZXJkaXIpCgogICAgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDFdID09IGxvd2VyZGlyCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zW2lfY291bnQgLSAxXSA9IiwgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDFdKQoKICAgIGV2ZXJ5IGksIHBvbGljeV9pZCBpbiBwb2xpY3lfaWRzIHsKICAgICAgICBhbGxvd19vdmVybGF5X2xheWVyKHBvbGljeV9pZCwgcG9saWN5X2hhc2hlc1tpXSwgaV9zdG9yYWdlLm9wdGlvbnNbaSArIDFdKQogICAgfQoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogdHJ1ZSIpCn0KYWxsb3dfc3RvcmFnZV9vcHRpb25zKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKSB7CiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDM6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCiAgICBjb3VudChwX3N0b3JhZ2Uub3B0aW9ucykgPT0gMQoKICAgIHN0YXJ0c3dpdGgocF9zdG9yYWdlLm9wdGlvbnNbMF0sICIkKGhhc2giKQogICAgaGFzaF9zdWZmaXggOj0gdHJpbV9sZWZ0KHBfc3RvcmFnZS5vcHRpb25zWzBdLCAiJChoYXNoIikKCiAgICBlbmRzd2l0aChoYXNoX3N1ZmZpeCwgIikiKQogICAgaGFzaF9pbmRleCA6PSB0cmltX3JpZ2h0KGhhc2hfc3VmZml4LCAiKSIpCiAgICBpIDo9IHRvX251bWJlcihoYXNoX2luZGV4KQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAzOiBpID0iLCBpKQoKICAgIGhhc2hfb3B0aW9uIDo9IGNvbmNhdCgiPSIsIFsiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LnJvb3QtaGFzaCIsIHJvb3RfaGFzaGVzW2ldXSkKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMzogaGFzaF9vcHRpb24gPSIsIGhhc2hfb3B0aW9uKQoKICAgIGNvdW50KGlfc3RvcmFnZS5vcHRpb25zKSA9PSA0CiAgICBpX3N0b3JhZ2Uub3B0aW9uc1swXSA9PSAicm8iCiAgICBpX3N0b3JhZ2Uub3B0aW9uc1sxXSA9PSAiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmJsb2NrX2RldmljZT1maWxlIgogICAgaV9zdG9yYWdlLm9wdGlvbnNbMl0gPT0gImlvLmthdGFjb250YWluZXJzLmZzLW9wdC5pcy1sYXllciIKICAgIGlfc3RvcmFnZS5vcHRpb25zWzNdID09IGhhc2hfb3B0aW9uCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAzOiB0cnVlIikKfQphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgNDogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gInNtYiIKICAgIHBfb3B0c19jb3VudCA6PSBjb3VudChwX3N0b3JhZ2Uub3B0aW9ucykKICAgIGlfb3B0c19jb3VudCA6PSBjb3VudChpX3N0b3JhZ2Uub3B0aW9ucykKICAgIGlfb3B0c19jb3VudCA9PSBwX29wdHNfY291bnQgKyAyCgogICAgaV9vcHRfbWF0Y2hlcyA6PSBbaSB8IGkgOj0gaWR4OyBpZHggPCBwX29wdHNfY291bnQ7IHBfc3RvcmFnZS5vcHRpb25zW2lkeF0gPT0gaV9zdG9yYWdlLm9wdGlvbnNbaWR4XV0KICAgIGNvdW50KGlfb3B0X21hdGNoZXMpID09IHBfb3B0c19jb3VudAoKICAgIHN0YXJ0c3dpdGgoaV9zdG9yYWdlLm9wdGlvbnNbaV9vcHRzX2NvdW50LTJdLCAiYWRkcj0iKQogICAgY3JlZHMgPSBzcGxpdChpX3N0b3JhZ2Uub3B0aW9uc1tpX29wdHNfY291bnQtMV0sICIsIikKICAgIGNvdW50KGNyZWRzKSA9PSAyCiAgICBzdGFydHN3aXRoKGNyZWRzWzBdLCAidXNlcm5hbWU9IikKICAgIHN0YXJ0c3dpdGgoY3JlZHNbMV0sICJwYXNzd29yZD0iKQogICAgCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDQ6IHRydWUiKQp9CgphbGxvd19vdmVybGF5X2xheWVyKHBvbGljeV9pZCwgcG9saWN5X2hhc2gsIGlfb3B0aW9uKSB7CiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogcG9saWN5X2lkID0iLCBwb2xpY3lfaWQsICJwb2xpY3lfaGFzaCA9IiwgcG9saWN5X2hhc2gpCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogaV9vcHRpb24gPSIsIGlfb3B0aW9uKQoKICAgIHN0YXJ0c3dpdGgoaV9vcHRpb24sICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQubGF5ZXI9IikKICAgIGlfdmFsdWUgOj0gcmVwbGFjZShpX29wdGlvbiwgImlvLmthdGFjb250YWluZXJzLmZzLW9wdC5sYXllcj0iLCAiIikKICAgIGlfdmFsdWVfZGVjb2RlZCA6PSBiYXNlNjQuZGVjb2RlKGlfdmFsdWUpCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogaV92YWx1ZV9kZWNvZGVkID0iLCBpX3ZhbHVlX2RlY29kZWQpCgogICAgcG9saWN5X3N1ZmZpeCA6PSBjb25jYXQoIj0iLCBbInRhcixybyxpby5rYXRhY29udGFpbmVycy5mcy1vcHQuYmxvY2tfZGV2aWNlPWZpbGUsaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmlzLWxheWVyLGlvLmthdGFjb250YWluZXJzLmZzLW9wdC5yb290LWhhc2giLCBwb2xpY3lfaGFzaF0pCiAgICBwX3ZhbHVlIDo9IGNvbmNhdCgiLCIsIFtwb2xpY3lfaWQsIHBvbGljeV9zdWZmaXhdKQogICAgcHJpbnQoImFsbG93X292ZXJsYXlfbGF5ZXI6IHBfdmFsdWUgPSIsIHBfdmFsdWUpCgogICAgcF92YWx1ZSA9PSBpX3ZhbHVlX2RlY29kZWQKCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogdHJ1ZSIpCn0KCmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAidGFyIgoKICAgIHN0YXJ0c3dpdGgocF9zdG9yYWdlLm1vdW50X3BvaW50LCAiJChsYXllciIpCiAgICBtb3VudF9zdWZmaXggOj0gdHJpbV9sZWZ0KHBfc3RvcmFnZS5tb3VudF9wb2ludCwgIiQobGF5ZXIiKQoKICAgIGVuZHN3aXRoKG1vdW50X3N1ZmZpeCwgIikiKQogICAgbGF5ZXJfaW5kZXggOj0gdHJpbV9yaWdodChtb3VudF9zdWZmaXgsICIpIikKICAgIGkgOj0gdG9fbnVtYmVyKGxheWVyX2luZGV4KQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDE6IGkgPSIsIGkpCgogICAgbGF5ZXJfaWQgOj0gbGF5ZXJfaWRzW2ldCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMTogbGF5ZXJfaWQgPSIsIGxheWVyX2lkKQoKICAgIHBfbW91bnQgOj0gY29uY2F0KCIvIiwgWyIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L2xheWVycyIsIGxheWVyX2lkXSkKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCAxOiBwX21vdW50ID0iLCBwX21vdW50KQoKICAgIHBfbW91bnQgPT0gaV9zdG9yYWdlLm1vdW50X3BvaW50CgogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDE6IHRydWUiKQp9CmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAiZnVzZTMua2F0YS1vdmVybGF5IgoKICAgIG1vdW50MSA6PSByZXBsYWNlKHBfc3RvcmFnZS5tb3VudF9wb2ludCwgIiQoY3BhdGgpIiwgcG9saWN5X2RhdGEuY29tbW9uLmNwYXRoKQogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDI6IG1vdW50MiA9IiwgbW91bnQyKQoKICAgIG1vdW50MiA9PSBpX3N0b3JhZ2UubW91bnRfcG9pbnQKCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMjogdHJ1ZSIpCn0KYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKSB7CiAgICBwX3N0b3JhZ2UuZnN0eXBlID09ICJsb2NhbCIKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQyID0iLCBtb3VudDIpCgogICAgbW91bnQzIDo9IHJlcGxhY2UobW91bnQyLCAiJChzYW5kYm94LWlkKSIsIHNhbmRib3hfaWQpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQzID0iLCBtb3VudDMpCgogICAgcmVnZXgubWF0Y2gobW91bnQzLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCgogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDM6IHRydWUiKQp9CmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAiYmluZCIKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNDogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNDogbW91bnQyID0iLCBtb3VudDIpCgogICAgbW91bnQzIDo9IHJlcGxhY2UobW91bnQyLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDQ6IG1vdW50MyA9IiwgbW91bnQzKQoKICAgIHJlZ2V4Lm1hdGNoKG1vdW50MywgaV9zdG9yYWdlLm1vdW50X3BvaW50KQoKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA0OiB0cnVlIikKfQphbGxvd19tb3VudF9wb2ludChwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgYnVuZGxlX2lkLCBzYW5kYm94X2lkLCBsYXllcl9pZHMpIHsKICAgIHBfc3RvcmFnZS5mc3R5cGUgPT0gInRtcGZzIgoKICAgIG1vdW50MSA6PSBwX3N0b3JhZ2UubW91bnRfcG9pbnQKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA1OiBtb3VudDEgPSIsIG1vdW50MSkKCiAgICByZWdleC5tYXRjaChtb3VudDEsIGlfc3RvcmFnZS5tb3VudF9wb2ludCkKCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNTogdHJ1ZSIpCn0KYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKSB7CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogaV9zdG9yYWdlLm1vdW50X3BvaW50ID0iLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCiAgICBhbGxvd19kaXJlY3Rfdm9sX2RyaXZlcihwX3N0b3JhZ2UsIGlfc3RvcmFnZSkKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChzcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQyID0iLCBtb3VudDIpCgogICAgZGlyZWN0X3ZvbF9wYXRoIDo9IGlfc3RvcmFnZS5zb3VyY2UKICAgIG1vdW50MyA6PSByZXBsYWNlKG1vdW50MiwgIiQoYjY0LWRpcmVjdC12b2wtcGF0aCkiLCBiYXNlNjR1cmwuZW5jb2RlKGRpcmVjdF92b2xfcGF0aCkpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQzID0iLCBtb3VudDMpCgogICAgbW91bnQzID09IGlfc3RvcmFnZS5tb3VudF9wb2ludAoKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA2OiB0cnVlIikKfQoKYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIocF9zdG9yYWdlLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19kaXJlY3Rfdm9sX2RyaXZlciAxOiBzdGFydCIpCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCiAgICBwcmludCgiYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIgMTogdHJ1ZSIpCn0KYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIocF9zdG9yYWdlLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19kaXJlY3Rfdm9sX2RyaXZlciAyOiBzdGFydCIpCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJzbWIiCiAgICBwcmludCgiYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIgMjogdHJ1ZSIpCn0KCiMgRXhlY1Byb2Nlc3NSZXF1ZXN0LnByb2Nlc3MuQ2FwYWJpbGl0aWVzCmFsbG93X2V4ZWNfY2FwcyhpX2NhcHMpIHsKICAgIG5vdCBpX2NhcHMuQW1iaWVudAogICAgbm90IGlfY2Fwcy5Cb3VuZGluZwogICAgbm90IGlfY2Fwcy5FZmZlY3RpdmUKICAgIG5vdCBpX2NhcHMuSW5oZXJpdGFibGUKICAgIG5vdCBpX2NhcHMuUGVybWl0dGVkCn0KCiMgT0NJLlByb2Nlc3MuQ2FwYWJpbGl0aWVzCmFsbG93X2NhcHMocF9jYXBzLCBpX2NhcHMpIHsKICAgIHByaW50KCJhbGxvd19jYXBzOiBwb2xpY3kgQW1iaWVudCA9IiwgcF9jYXBzLkFtYmllbnQpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgQW1iaWVudCA9IiwgaV9jYXBzLkFtYmllbnQpCiAgICBtYXRjaF9jYXBzKHBfY2Fwcy5BbWJpZW50LCBpX2NhcHMuQW1iaWVudCkKCiAgICBwcmludCgiYWxsb3dfY2FwczogcG9saWN5IEJvdW5kaW5nID0iLCBwX2NhcHMuQm91bmRpbmcpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgQm91bmRpbmcgPSIsIGlfY2Fwcy5Cb3VuZGluZykKICAgIG1hdGNoX2NhcHMocF9jYXBzLkJvdW5kaW5nLCBpX2NhcHMuQm91bmRpbmcpCgogICAgcHJpbnQoImFsbG93X2NhcHM6IHBvbGljeSBFZmZlY3RpdmUgPSIsIHBfY2Fwcy5FZmZlY3RpdmUpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgRWZmZWN0aXZlID0iLCBpX2NhcHMuRWZmZWN0aXZlKQogICAgbWF0Y2hfY2FwcyhwX2NhcHMuRWZmZWN0aXZlLCBpX2NhcHMuRWZmZWN0aXZlKQoKICAgIHByaW50KCJhbGxvd19jYXBzOiBwb2xpY3kgSW5oZXJpdGFibGUgPSIsIHBfY2Fwcy5Jbmhlcml0YWJsZSkKICAgIHByaW50KCJhbGxvd19jYXBzOiBpbnB1dCBJbmhlcml0YWJsZSA9IiwgaV9jYXBzLkluaGVyaXRhYmxlKQogICAgbWF0Y2hfY2FwcyhwX2NhcHMuSW5oZXJpdGFibGUsIGlfY2Fwcy5Jbmhlcml0YWJsZSkKCiAgICBwcmludCgiYWxsb3dfY2FwczogcG9saWN5IFBlcm1pdHRlZCA9IiwgcF9jYXBzLlBlcm1pdHRlZCkKICAgIHByaW50KCJhbGxvd19jYXBzOiBpbnB1dCBQZXJtaXR0ZWQgPSIsIGlfY2Fwcy5QZXJtaXR0ZWQpCiAgICBtYXRjaF9jYXBzKHBfY2Fwcy5QZXJtaXR0ZWQsIGlfY2Fwcy5QZXJtaXR0ZWQpCn0KCm1hdGNoX2NhcHMocF9jYXBzLCBpX2NhcHMpIHsKICAgIHByaW50KCJtYXRjaF9jYXBzIDE6IHN0YXJ0IikKCiAgICBwX2NhcHMgPT0gaV9jYXBzCgogICAgcHJpbnQoIm1hdGNoX2NhcHMgMTogdHJ1ZSIpCn0KbWF0Y2hfY2FwcyhwX2NhcHMsIGlfY2FwcykgewogICAgcHJpbnQoIm1hdGNoX2NhcHMgMjogc3RhcnQiKQoKICAgIGNvdW50KHBfY2FwcykgPT0gMQogICAgcF9jYXBzWzBdID09ICIkKGRlZmF1bHRfY2FwcykiCgogICAgcHJpbnQoIm1hdGNoX2NhcHMgMjogZGVmYXVsdF9jYXBzID0iLCBwb2xpY3lfZGF0YS5jb21tb24uZGVmYXVsdF9jYXBzKQogICAgcG9saWN5X2RhdGEuY29tbW9uLmRlZmF1bHRfY2FwcyA9PSBpX2NhcHMKCiAgICBwcmludCgibWF0Y2hfY2FwcyAyOiB0cnVlIikKfQptYXRjaF9jYXBzKHBfY2FwcywgaV9jYXBzKSB7CiAgICBwcmludCgibWF0Y2hfY2FwcyAzOiBzdGFydCIpCgogICAgY291bnQocF9jYXBzKSA9PSAxCiAgICBwX2NhcHNbMF0gPT0gIiQocHJpdmlsZWdlZF9jYXBzKSIKCiAgICBwcmludCgibWF0Y2hfY2FwcyAzOiBwcml2aWxlZ2VkX2NhcHMgPSIsIHBvbGljeV9kYXRhLmNvbW1vbi5wcml2aWxlZ2VkX2NhcHMpCiAgICBwb2xpY3lfZGF0YS5jb21tb24ucHJpdmlsZWdlZF9jYXBzID09IGlfY2FwcwoKICAgIHByaW50KCJtYXRjaF9jYXBzIDM6IHRydWUiKQp9CgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgpjaGVja19kaXJlY3RvcnlfdHJhdmVyc2FsKGlfcGF0aCkgewogICAgbm90IHJlZ2V4Lm1hdGNoKCIoXnwvKS4uKCR8LykiLCBpX3BhdGgpCn0KCmNoZWNrX3N5bWxpbmtfc291cmNlKGlfc3JjKSB7CiAgICBpX3NyYyA9PSAiIgogICAgcHJpbnQoImNoZWNrX3N5bWxpbmtfc291cmNlIDE6IHRydWUiKQp9CmNoZWNrX3N5bWxpbmtfc291cmNlKGlfc3JjKSB7CiAgICBpX3NyYyAhPSAiIgogICAgcHJpbnQoImNoZWNrX3N5bWxpbmtfc291cmNlIDI6IGlfc3JjID0iLCBpX3NyYykKCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24uc19zb3VyY2UxLCBpX3NyYykKCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMjogdHJ1ZSIpCn0KY2hlY2tfc3ltbGlua19zb3VyY2UoaV9zcmMpIHsKICAgIGlfc3JjICE9ICIiCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMzogaV9zcmMgPSIsIGlfc3JjKQoKICAgIHJlZ2V4Lm1hdGNoKHBvbGljeV9kYXRhLmNvbW1vbi5zX3NvdXJjZTIsIGlfc3JjKQogICAgY2hlY2tfZGlyZWN0b3J5X3RyYXZlcnNhbChpX3NyYykKCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMzogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfc3RvcmFnZXMoaV9zdG9yYWdlcykgewogICAgcHJpbnQoImFsbG93X3NhbmRib3hfc3RvcmFnZXM6IGlfc3RvcmFnZXMgPSIsIGlfc3RvcmFnZXMpCgogICAgcF9zdG9yYWdlcyA6PSBwb2xpY3lfZGF0YS5zYW5kYm94LnN0b3JhZ2VzCiAgICBldmVyeSBpX3N0b3JhZ2UgaW4gaV9zdG9yYWdlcyB7CiAgICAgICAgYWxsb3dfc2FuZGJveF9zdG9yYWdlKHBfc3RvcmFnZXMsIGlfc3RvcmFnZSkKICAgIH0KCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9zdG9yYWdlczogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfc3RvcmFnZShwX3N0b3JhZ2VzLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IGlfc3RvcmFnZSA9IiwgaV9zdG9yYWdlKQoKICAgIHNvbWUgcF9zdG9yYWdlIGluIHBfc3RvcmFnZXMKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IHBfc3RvcmFnZSA9IiwgcF9zdG9yYWdlKQogICAgaV9zdG9yYWdlID09IHBfc3RvcmFnZQoKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IHRydWUiKQp9CgpDb3B5RmlsZVJlcXVlc3QgewogICAgcHJpbnQoIkNvcHlGaWxlUmVxdWVzdDogaW5wdXQucGF0aCA9IiwgaW5wdXQucGF0aCkKCiAgICBjaGVja19zeW1saW5rX3NvdXJjZShpbnB1dC5zeW1saW5rX3NyYykKICAgIGNoZWNrX2RpcmVjdG9yeV90cmF2ZXJzYWwoaW5wdXQucGF0aCkKCiAgICBzb21lIHJlZ2V4MSBpbiBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLkNvcHlGaWxlUmVxdWVzdAogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5jcGF0aCkKICAgIHJlZ2V4NCA6PSByZXBsYWNlKHJlZ2V4MywgIiQoYnVuZGxlLWlkKSIsIEJVTkRMRV9JRCkKICAgIHByaW50KCJDb3B5RmlsZVJlcXVlc3Q6IHJlZ2V4NCA9IiwgcmVnZXg0KQoKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4NCwgaW5wdXQucGF0aCkKCiAgICBwcmludCgiQ29weUZpbGVSZXF1ZXN0OiB0cnVlIikKfQoKQ3JlYXRlU2FuZGJveFJlcXVlc3QgewogICAgcHJpbnQoIkNyZWF0ZVNhbmRib3hSZXF1ZXN0OiBpbnB1dC5ndWVzdF9ob29rX3BhdGggPSIsIGlucHV0Lmd1ZXN0X2hvb2tfcGF0aCkKICAgIGNvdW50KGlucHV0Lmd1ZXN0X2hvb2tfcGF0aCkgPT0gMAoKICAgIHByaW50KCJDcmVhdGVTYW5kYm94UmVxdWVzdDogaW5wdXQua2VybmVsX21vZHVsZXMgPSIsIGlucHV0Lmtlcm5lbF9tb2R1bGVzKQogICAgY291bnQoaW5wdXQua2VybmVsX21vZHVsZXMpID09IDAKCiAgICBpX3BpZG5zIDo9IGlucHV0LnNhbmRib3hfcGlkbnMKICAgIHByaW50KCJDcmVhdGVTYW5kYm94UmVxdWVzdDogaV9waWRucyA9IiwgaV9waWRucykKICAgIGlfcGlkbnMgPT0gZmFsc2UKICAgIGFsbG93X3NhbmRib3hfc3RvcmFnZXMoaW5wdXQuc3RvcmFnZXMpCn0KCmFsbG93X2V4ZWMocF9jb250YWluZXIsIGlfcHJvY2VzcykgewogICAgcHJpbnQoImFsbG93X2V4ZWM6IHN0YXJ0IikKCiAgICBwX29jaSA9IHBfY29udGFpbmVyLk9DSQogICAgcF9zX25hbWUgPSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc19uYW1lc3BhY2UgPSBnZXRfc3RhdGVfdmFsKCJuYW1lc3BhY2UiKQogICAgYWxsb3dfcHJvYmVfcHJvY2VzcyhwX29jaS5Qcm9jZXNzLCBpX3Byb2Nlc3MsIHBfc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfZXhlYzogdHJ1ZSIpCn0KCmFsbG93X2ludGVyYWN0aXZlX2V4ZWMocF9jb250YWluZXIsIGlfcHJvY2VzcykgewogICAgcHJpbnQoImFsbG93X2ludGVyYWN0aXZlX2V4ZWM6IHN0YXJ0IikKCiAgICBwX29jaSA9IHBfY29udGFpbmVyLk9DSQogICAgcF9zX25hbWUgPSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc19uYW1lc3BhY2UgPSBnZXRfc3RhdGVfdmFsKCJuYW1lc3BhY2UiKQogICAgYWxsb3dfaW50ZXJhY3RpdmVfcHJvY2VzcyhwX29jaS5Qcm9jZXNzLCBpX3Byb2Nlc3MsIHBfc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfaW50ZXJhY3RpdmVfZXhlYzogdHJ1ZSIpCn0KCiMgVE9ETzogc2hvdWxkIG90aGVyIEV4ZWNQcm9jZXNzUmVxdWVzdCBpbnB1dCBkYXRhIGZpZWxkcyBiZSB2YWxpZGF0ZWQgYXMgd2VsbD8KRXhlY1Byb2Nlc3NSZXF1ZXN0IHsKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMTogaW5wdXQgPSIsIGlucHV0KQoKICAgIHNvbWUgcF9jb21tYW5kIGluIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuRXhlY1Byb2Nlc3NSZXF1ZXN0LmFsbG93ZWRfY29tbWFuZHMKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMTogcF9jb21tYW5kID0iLCBwX2NvbW1hbmQpCiAgICBwX2NvbW1hbmQgPT0gaW5wdXQucHJvY2Vzcy5BcmdzCgogICAgIyBUT0RPOiBtYXRjaCBwX2NvbnRhaW5lcidzIElEIHdpdGggdGhlIGlucHV0IGNvbnRhaW5lcl9pZC4KICAgIHNvbWUgcF9jb250YWluZXIgaW4gcG9saWN5X2RhdGEuY29udGFpbmVycwogICAgYWxsb3dfaW50ZXJhY3RpdmVfZXhlYyhwX2NvbnRhaW5lciwgaW5wdXQucHJvY2VzcykKCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDE6IHRydWUiKQp9CkV4ZWNQcm9jZXNzUmVxdWVzdCB7CiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDI6IGlucHV0ID0iLCBpbnB1dCkKCiAgICAjIFRPRE86IG1hdGNoIGlucHV0IGNvbnRhaW5lciBJRCB3aXRoIGl0cyBjb3JyZXNwb25kaW5nIGNvbnRhaW5lci5leGVjX2NvbW1hbmRzLgogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBzb21lIHBfY29tbWFuZCBpbiBwX2NvbnRhaW5lci5leGVjX2NvbW1hbmRzCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDI6IHBfY29tbWFuZCA9IiwgcF9jb21tYW5kKQoKICAgICMgVE9ETzogc2hvdWxkIG90aGVyIGlucHV0IGRhdGEgZmllbGRzIGJlIHZhbGlkYXRlZCBhcyB3ZWxsPwogICAgcF9jb21tYW5kID09IGlucHV0LnByb2Nlc3MuQXJncwoKICAgIGFsbG93X2V4ZWMocF9jb250YWluZXIsIGlucHV0LnByb2Nlc3MpCgogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAyOiB0cnVlIikKfQpFeGVjUHJvY2Vzc1JlcXVlc3QgewogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAzOiBpbnB1dCA9IiwgaW5wdXQpCgogICAgaV9jb21tYW5kID0gY29uY2F0KCIgIiwgaW5wdXQucHJvY2Vzcy5BcmdzKQogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAzOiBpX2NvbW1hbmQgPSIsIGlfY29tbWFuZCkKCiAgICBzb21lIHBfcmVnZXggaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5FeGVjUHJvY2Vzc1JlcXVlc3QucmVnZXgKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMzogcF9yZWdleCA9IiwgcF9yZWdleCkKCiAgICByZWdleC5tYXRjaChwX3JlZ2V4LCBpX2NvbW1hbmQpCgogICAgIyBUT0RPOiBtYXRjaCBwX2NvbnRhaW5lcidzIElEIHdpdGggdGhlIGlucHV0IGNvbnRhaW5lcl9pZC4KICAgIHNvbWUgcF9jb250YWluZXIgaW4gcG9saWN5X2RhdGEuY29udGFpbmVycwogICAgYWxsb3dfaW50ZXJhY3RpdmVfZXhlYyhwX2NvbnRhaW5lciwgaW5wdXQucHJvY2VzcykKCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDM6IHRydWUiKQp9CgpVcGRhdGVSb3V0ZXNSZXF1ZXN0IHsKICAgIHByaW50KCJVcGRhdGVSb3V0ZXNSZXF1ZXN0OiBpbnB1dCA9IiwgaW5wdXQpCiAgICBwcmludCgiVXBkYXRlUm91dGVzUmVxdWVzdDogcG9saWN5ID0iLCBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLlVwZGF0ZVJvdXRlc1JlcXVlc3QpCgogICAgaV9yb3V0ZXMgOj0gaW5wdXQucm91dGVzLlJvdXRlcwogICAgcF9zb3VyY2VfcmVnZXggPSBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLlVwZGF0ZVJvdXRlc1JlcXVlc3QuZm9yYmlkZGVuX3NvdXJjZV9yZWdleAogICAgcF9uYW1lcyA9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuVXBkYXRlUm91dGVzUmVxdWVzdC5mb3JiaWRkZW5fZGV2aWNlX25hbWVzCgogICAgZXZlcnkgaV9yb3V0ZSBpbiBpX3JvdXRlcyB7CiAgICAgICAgcHJpbnQoImlfcm91dGUuc291cmNlID0iLCBpX3JvdXRlLnNvdXJjZSkKICAgICAgICBldmVyeSBwX3JlZ2V4IGluIHBfc291cmNlX3JlZ2V4IHsKICAgICAgICAgICAgcHJpbnQoInBfcmVnZXggPSIsIHBfcmVnZXgpCiAgICAgICAgICAgIG5vdCByZWdleC5tYXRjaChwX3JlZ2V4LCBpX3JvdXRlLnNvdXJjZSkKICAgICAgICB9CgogICAgICAgIHByaW50KCJpX3JvdXRlLmRldmljZSA9IiwgaV9yb3V0ZS5kZXZpY2UpCiAgICAgICAgbm90IGlfcm91dGUuZGV2aWNlIGluIHBfbmFtZXMKICAgIH0KCiAgICBwcmludCgiVXBkYXRlUm91dGVzUmVxdWVzdDogdHJ1ZSIpCn0KClVwZGF0ZUludGVyZmFjZVJlcXVlc3QgewogICAgcHJpbnQoIlVwZGF0ZUludGVyZmFjZVJlcXVlc3Q6IGlucHV0ID0iLCBpbnB1dCkKICAgIHByaW50KCJVcGRhdGVJbnRlcmZhY2VSZXF1ZXN0OiBwb2xpY3kgPSIsIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuVXBkYXRlSW50ZXJmYWNlUmVxdWVzdCkKCiAgICBpX2ludGVyZmFjZSA6PSBpbnB1dC5pbnRlcmZhY2UKICAgIHBfZmxhZ3MgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmFsbG93X3Jhd19mbGFncwoKICAgICMgVHlwaWNhbGx5LCBqdXN0IElGRl9OT0FSUCBpcyB1c2VkLgogICAgYml0cy5hbmQoaV9pbnRlcmZhY2UucmF3X2ZsYWdzLCBiaXRzLm5lZ2F0ZShwX2ZsYWdzKSkgPT0gMAoKICAgIHBfbmFtZXMgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmZvcmJpZGRlbl9uYW1lcwoKICAgIG5vdCBpX2ludGVyZmFjZS5uYW1lIGluIHBfbmFtZXMKCiAgICBwX2h3YWRkcnMgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmZvcmJpZGRlbl9od19hZGRycwoKICAgIG5vdCBpX2ludGVyZmFjZS5od0FkZHIgaW4gcF9od2FkZHJzCgogICAgcHJpbnQoIlVwZGF0ZUludGVyZmFjZVJlcXVlc3Q6IHRydWUiKQp9CgpDbG9zZVN0ZGluUmVxdWVzdCB7CiAgICBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLkNsb3NlU3RkaW5SZXF1ZXN0ID09IHRydWUKfQoKUmVhZFN0cmVhbVJlcXVlc3QgewogICAgcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5SZWFkU3RyZWFtUmVxdWVzdCA9PSB0cnVlCn0KClVwZGF0ZUVwaGVtZXJhbE1vdW50c1JlcXVlc3QgewogICAgcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVFcGhlbWVyYWxNb3VudHNSZXF1ZXN0ID09IHRydWUKfQoKV3JpdGVTdHJlYW1SZXF1ZXN0IHsKICAgIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuV3JpdGVTdHJlYW1SZXF1ZXN0ID09IHRydWUKfQoKcG9saWN5X2RhdGEgOj0gewogICJjb250YWluZXJzIjogWwogICAgewogICAgICAiT0NJIjogewogICAgICAgICJWZXJzaW9uIjogIjEuMS4wLXJjLjEiLAogICAgICAgICJQcm9jZXNzIjogewogICAgICAgICAgIlRlcm1pbmFsIjogZmFsc2UsCiAgICAgICAgICAiVXNlciI6IHsKICAgICAgICAgICAgIlVJRCI6IDIyMjIyLAogICAgICAgICAgICAiR0lEIjogNjU1MzUsCiAgICAgICAgICAgICJBZGRpdGlvbmFsR2lkcyI6IFtdLAogICAgICAgICAgICAiVXNlcm5hbWUiOiAiIgogICAgICAgICAgfSwKICAgICAgICAgICJEZXByZWNhdGVkQXJncyI6IFsKICAgICAgICAgICAgIi9wYXVzZSIKICAgICAgICAgIF0sCiAgICAgICAgICAiQXJncyI6IFsKICAgICAgICAgICAgIi9wYXVzZSIKICAgICAgICAgIF0sCiAgICAgICAgICAiRW52IjogWwogICAgICAgICAgICAiUEFUSD0vdXNyL2xvY2FsL3NiaW46L3Vzci9sb2NhbC9iaW46L3Vzci9zYmluOi91c3IvYmluOi9zYmluOi9iaW4iCiAgICAgICAgICBdLAogICAgICAgICAgIkN3ZCI6ICIvIiwKICAgICAgICAgICJDYXBhYmlsaXRpZXMiOiB7CiAgICAgICAgICAgICJBbWJpZW50IjogW10sCiAgICAgICAgICAgICJCb3VuZGluZyI6IFsKICAgICAgICAgICAgICAiJChkZWZhdWx0X2NhcHMpIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiRWZmZWN0aXZlIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJJbmhlcml0YWJsZSI6IFtdLAogICAgICAgICAgICAiUGVybWl0dGVkIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICAiTm9OZXdQcml2aWxlZ2VzIjogdHJ1ZQogICAgICAgIH0sCiAgICAgICAgIlJvb3QiOiB7CiAgICAgICAgICAiUGF0aCI6ICIkKGNwYXRoKS8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgIlJlYWRvbmx5IjogdHJ1ZQogICAgICAgIH0sCiAgICAgICAgIk1vdW50cyI6IFsKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9wcm9jIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJwcm9jIiwKICAgICAgICAgICAgInR5cGVfIjogInByb2MiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2IiwKICAgICAgICAgICAgInNvdXJjZSI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJzdHJpY3RhdGltZSIsCiAgICAgICAgICAgICAgIm1vZGU9NzU1IiwKICAgICAgICAgICAgICAic2l6ZT02NTUzNmsiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L3B0cyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiZGV2cHRzIiwKICAgICAgICAgICAgInR5cGVfIjogImRldnB0cyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJuZXdpbnN0YW5jZSIsCiAgICAgICAgICAgICAgInB0bXhtb2RlPTA2NjYiLAogICAgICAgICAgICAgICJtb2RlPTA2MjAiLAogICAgICAgICAgICAgICJnaWQ9NSIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvc2htIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L3NobSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi9tcXVldWUiLAogICAgICAgICAgICAic291cmNlIjogIm1xdWV1ZSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJtcXVldWUiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvc3lzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJzeXNmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJzeXNmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2V0Yy9yZXNvbHYuY29uZiIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClyZXNvbHYuY29uZiQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJvIiwKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9kZXYiLAogICAgICAgICAgICAgICJub2V4ZWMiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0KICAgICAgICBdLAogICAgICAgICJBbm5vdGF0aW9ucyI6IHsKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmJ1bmRsZV9wYXRoIjogIi9ydW4vY29udGFpbmVyZC9pby5jb250YWluZXJkLnJ1bnRpbWUudjIudGFzay9rOHMuaW8vJChidW5kbGUtaWQpIiwKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIjogInBvZF9zYW5kYm94IiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSI6ICJzYW5kYm94IiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWlkIjogIl5bYS16MC05XXs2NH0kIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWxvZy1kaXJlY3RvcnkiOiAiXi92YXIvbG9nL3BvZHMvJChzYW5kYm94LW5hbWVzcGFjZSlfJChzYW5kYm94LW5hbWUpX1swLTlhLWZdezh9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezEyfSQiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZXNwYWNlIjogIiIsCiAgICAgICAgICAibmVyZGN0bC9uZXR3b3JrLW5hbWVzcGFjZSI6ICJeL3Zhci9ydW4vbmV0bnMvY25pLVswLTlhLWZdezh9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezEyfSQiCiAgICAgICAgfSwKICAgICAgICAiTGludXgiOiB7CiAgICAgICAgICAiTmFtZXNwYWNlcyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICJUeXBlIjogImlwYyIsCiAgICAgICAgICAgICAgIlBhdGgiOiAiIgogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgIlR5cGUiOiAidXRzIiwKICAgICAgICAgICAgICAiUGF0aCI6ICIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiVHlwZSI6ICJtb3VudCIsCiAgICAgICAgICAgICAgIlBhdGgiOiAiIgogICAgICAgICAgICB9CiAgICAgICAgICBdLAogICAgICAgICAgIk1hc2tlZFBhdGhzIjogWwogICAgICAgICAgICAiL3Byb2MvYWNwaSIsCiAgICAgICAgICAgICIvcHJvYy9hc291bmQiLAogICAgICAgICAgICAiL3Byb2Mva2NvcmUiLAogICAgICAgICAgICAiL3Byb2Mva2V5cyIsCiAgICAgICAgICAgICIvcHJvYy9sYXRlbmN5X3N0YXRzIiwKICAgICAgICAgICAgIi9wcm9jL3RpbWVyX2xpc3QiLAogICAgICAgICAgICAiL3Byb2MvdGltZXJfc3RhdHMiLAogICAgICAgICAgICAiL3Byb2Mvc2NoZWRfZGVidWciLAogICAgICAgICAgICAiL3N5cy9maXJtd2FyZSIsCiAgICAgICAgICAgICIvcHJvYy9zY3NpIgogICAgICAgICAgXSwKICAgICAgICAgICJSZWFkb25seVBhdGhzIjogWwogICAgICAgICAgICAiL3Byb2MvYnVzIiwKICAgICAgICAgICAgIi9wcm9jL2ZzIiwKICAgICAgICAgICAgIi9wcm9jL2lycSIsCiAgICAgICAgICAgICIvcHJvYy9zeXMiLAogICAgICAgICAgICAiL3Byb2Mvc3lzcnEtdHJpZ2dlciIKICAgICAgICAgIF0sCiAgICAgICAgICAiRGV2aWNlcyI6IFtdLAogICAgICAgICAgIlN5c2N0bCI6IHsKICAgICAgICAgICAgIm5ldC5pcHY0LmlwX3VucHJpdmlsZWdlZF9wb3J0X3N0YXJ0IjogIjAiLAogICAgICAgICAgICAibmV0LmlwdjQucGluZ19ncm91cF9yYW5nZSI6ICIwIDIxNDc0ODM2NDciCiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9LAogICAgICAic3RvcmFnZXMiOiBbCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJibGsiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogInRhciIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIiQoaGFzaDApIgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGxheWVyMCkiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJvdmVybGF5ZnMiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogImZ1c2UzLmthdGEtb3ZlcmxheSIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIjVhNWFhZDgwMDU1ZmYyMDAxMmE1MGRjMjVmOGRmN2EyOTkyNDQ3NDMyNGQ2NWY3ZDUzMDZlZThlZTI3ZmY3MWQiLAogICAgICAgICAgICAiODE3MjUwZjFhM2UzMzZkYTc2ZjViZDNmYTc4NGUxYjI2ZDk1OWI5YzEzMTg3NjgxNWJhMjYwNDA0OGI3MGMxOCIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChjcGF0aCkvJChidW5kbGUtaWQpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9CiAgICAgIF0sCiAgICAgICJkZXZpY2VzIjogW10sCiAgICAgICJzYW5kYm94X3BpZG5zIjogZmFsc2UsCiAgICAgICJleGVjX2NvbW1hbmRzIjogW10sCiAgICAgICJlbnZfbWFwIjogewogICAgICAgICJQQVRIIjogIi91c3IvbG9jYWwvc2JpbjovdXNyL2xvY2FsL2JpbjovdXNyL3NiaW46L3Vzci9iaW46L3NiaW46L2JpbiIKICAgICAgfQogICAgfSwKICAgIHsKICAgICAgIk9DSSI6IHsKICAgICAgICAiVmVyc2lvbiI6ICIxLjEuMC1yYy4xIiwKICAgICAgICAiUHJvY2VzcyI6IHsKICAgICAgICAgICJUZXJtaW5hbCI6IGZhbHNlLAogICAgICAgICAgIlVzZXIiOiB7CiAgICAgICAgICAgICJVSUQiOiAyMjIyMiwKICAgICAgICAgICAgIkdJRCI6IDAsCiAgICAgICAgICAgICJBZGRpdGlvbmFsR2lkcyI6IFtdLAogICAgICAgICAgICAiVXNlcm5hbWUiOiAiIgogICAgICAgICAgfSwKICAgICAgICAgICJEZXByZWNhdGVkQXJncyI6IFsKICAgICAgICAgICAgIi9iaW4vc2giLAogICAgICAgICAgICAiLWMiLAogICAgICAgICAgICAid2hpbGUgdHJ1ZTsgZG8gZWNobyAkKHNhbmRib3gtbmFtZSk7IHNsZWVwIDEwOyBkb25lIgogICAgICAgICAgXSwKICAgICAgICAgICJBcmdzIjogWwogICAgICAgICAgICAiL2Jpbi9zaCIsCiAgICAgICAgICAgICItYyIsCiAgICAgICAgICAgICJ3aGlsZSB0cnVlOyBkbyBlY2hvICQoTUVUQV9OQU1FKTsgc2xlZXAgMTA7IGRvbmUiCiAgICAgICAgICBdLAogICAgICAgICAgIkVudiI6IFsKICAgICAgICAgICAgIlBBVEg9L3Vzci9sb2NhbC9zYmluOi91c3IvbG9jYWwvYmluOi91c3Ivc2JpbjovdXNyL2Jpbjovc2JpbjovYmluIiwKICAgICAgICAgICAgIkhPU1ROQU1FPSQoaG9zdC1uYW1lKSIsCiAgICAgICAgICAgICJNRVRBX05BTUU9JChzYW5kYm94LW5hbWUpIgogICAgICAgICAgXSwKICAgICAgICAgICJDd2QiOiAiLyIsCiAgICAgICAgICAiQ2FwYWJpbGl0aWVzIjogewogICAgICAgICAgICAiQW1iaWVudCI6IFtdLAogICAgICAgICAgICAiQm91bmRpbmciOiBbCiAgICAgICAgICAgICAgIiQoZGVmYXVsdF9jYXBzKSIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgIkVmZmVjdGl2ZSI6IFsKICAgICAgICAgICAgICAiJChkZWZhdWx0X2NhcHMpIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiSW5oZXJpdGFibGUiOiBbXSwKICAgICAgICAgICAgIlBlcm1pdHRlZCI6IFsKICAgICAgICAgICAgICAiJChkZWZhdWx0X2NhcHMpIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgIk5vTmV3UHJpdmlsZWdlcyI6IGZhbHNlCiAgICAgICAgfSwKICAgICAgICAiUm9vdCI6IHsKICAgICAgICAgICJQYXRoIjogIiQoY3BhdGgpLyQoYnVuZGxlLWlkKSIsCiAgICAgICAgICAiUmVhZG9ubHkiOiBmYWxzZQogICAgICAgIH0sCiAgICAgICAgIk1vdW50cyI6IFsKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9wcm9jIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJwcm9jIiwKICAgICAgICAgICAgInR5cGVfIjogInByb2MiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2IiwKICAgICAgICAgICAgInNvdXJjZSI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJzdHJpY3RhdGltZSIsCiAgICAgICAgICAgICAgIm1vZGU9NzU1IiwKICAgICAgICAgICAgICAic2l6ZT02NTUzNmsiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L3B0cyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiZGV2cHRzIiwKICAgICAgICAgICAgInR5cGVfIjogImRldnB0cyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJuZXdpbnN0YW5jZSIsCiAgICAgICAgICAgICAgInB0bXhtb2RlPTA2NjYiLAogICAgICAgICAgICAgICJtb2RlPTA2MjAiLAogICAgICAgICAgICAgICJnaWQ9NSIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvc2htIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L3NobSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi9tcXVldWUiLAogICAgICAgICAgICAic291cmNlIjogIm1xdWV1ZSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJtcXVldWUiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvc3lzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJzeXNmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJzeXNmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL3N5cy9mcy9jZ3JvdXAiLAogICAgICAgICAgICAic291cmNlIjogImNncm91cCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJjZ3JvdXAiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiLAogICAgICAgICAgICAgICJyZWxhdGltZSIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2V0Yy9ob3N0cyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClob3N0cyQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicnciCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L3Rlcm1pbmF0aW9uLWxvZyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeCl0ZXJtaW5hdGlvbi1sb2ckIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJ3IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2V0Yy9ob3N0bmFtZSIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClob3N0bmFtZSQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicnciCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZXRjL3Jlc29sdi5jb25mIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KXJlc29sdi5jb25mJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJydyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi92YXIvcnVuL3NlY3JldHMva3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudCIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClzZXJ2aWNlYWNjb3VudCQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicm8iCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvdmFyL3J1bi9zZWNyZXRzL2F6dXJlL3Rva2VucyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeCl0b2tlbnMkIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL3Vzci9zaGFyZS9uZ2lueC9odG1sIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KWh0bWwkIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJ3IgogICAgICAgICAgICBdCiAgICAgICAgICB9CiAgICAgICAgXSwKICAgICAgICAiQW5ub3RhdGlvbnMiOiB7CiAgICAgICAgICAiaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5idW5kbGVfcGF0aCI6ICIvcnVuL2NvbnRhaW5lcmQvaW8uY29udGFpbmVyZC5ydW50aW1lLnYyLnRhc2svazhzLmlvLyQoYnVuZGxlLWlkKSIsCiAgICAgICAgICAiaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5jb250YWluZXJfdHlwZSI6ICJwb2RfY29udGFpbmVyIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItbmFtZSI6ICJuZ2lueCIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLXR5cGUiOiAiY29udGFpbmVyIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5pbWFnZS1uYW1lIjogIm1hcmluZXJjb25mcG9kc3Rlc3QuYXp1cmVjci5pby9henVyZWxpbnV4L2Jhc2Uvbmdpbng6MS4yNSIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCI6ICJeW2EtejAtOV17NjR9JCIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1uYW1lc3BhY2UiOiAiIgogICAgICAgIH0sCiAgICAgICAgIkxpbnV4IjogewogICAgICAgICAgIk5hbWVzcGFjZXMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiVHlwZSI6ICJpcGMiLAogICAgICAgICAgICAgICJQYXRoIjogIiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJUeXBlIjogInV0cyIsCiAgICAgICAgICAgICAgIlBhdGgiOiAiIgogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgIlR5cGUiOiAibW91bnQiLAogICAgICAgICAgICAgICJQYXRoIjogIiIKICAgICAgICAgICAgfQogICAgICAgICAgXSwKICAgICAgICAgICJNYXNrZWRQYXRocyI6IFsKICAgICAgICAgICAgIi9wcm9jL2FjcGkiLAogICAgICAgICAgICAiL3Byb2Mva2NvcmUiLAogICAgICAgICAgICAiL3Byb2Mva2V5cyIsCiAgICAgICAgICAgICIvcHJvYy9sYXRlbmN5X3N0YXRzIiwKICAgICAgICAgICAgIi9wcm9jL3RpbWVyX2xpc3QiLAogICAgICAgICAgICAiL3Byb2MvdGltZXJfc3RhdHMiLAogICAgICAgICAgICAiL3Byb2Mvc2NoZWRfZGVidWciLAogICAgICAgICAgICAiL3Byb2Mvc2NzaSIsCiAgICAgICAgICAgICIvc3lzL2Zpcm13YXJlIgogICAgICAgICAgXSwKICAgICAgICAgICJSZWFkb25seVBhdGhzIjogWwogICAgICAgICAgICAiL3Byb2MvYXNvdW5kIiwKICAgICAgICAgICAgIi9wcm9jL2J1cyIsCiAgICAgICAgICAgICIvcHJvYy9mcyIsCiAgICAgICAgICAgICIvcHJvYy9pcnEiLAogICAgICAgICAgICAiL3Byb2Mvc3lzIiwKICAgICAgICAgICAgIi9wcm9jL3N5c3JxLXRyaWdnZXIiCiAgICAgICAgICBdLAogICAgICAgICAgIkRldmljZXMiOiBbXSwKICAgICAgICAgICJTeXNjdGwiOiB7CiAgICAgICAgICAgICJuZXQuaXB2NC5pcF91bnByaXZpbGVnZWRfcG9ydF9zdGFydCI6ICIwIiwKICAgICAgICAgICAgIm5ldC5pcHY0LnBpbmdfZ3JvdXBfcmFuZ2UiOiAiMCAyMTQ3NDgzNjQ3IgogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSwKICAgICAgInN0b3JhZ2VzIjogWwogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2gwKSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjApIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2gxKSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjEpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2gyKSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjIpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2gzKSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjMpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2g0KSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjQpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAib3ZlcmxheWZzIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJmdXNlMy5rYXRhLW92ZXJsYXkiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICI4YmZiYmE3Njk2NjM2NTI0MDRhNjRhMjNhN2VlYWI3OTQzOGRhZWQ3MWFjY2YzMjlhNDBhNGY2OGVmYWYwZmY0OjhjYzdhZmJjZGQwNGYxN2FmZjhmNmQ0OTM1ZTRmNTRhMWY1YWRkNDdkY2E1MTZlOGQzNTQ1M2YxZjQyMTgxNjc6OTAzMGU2MGFhOGQ4YWI5YzI3ZjA1MWUyYzc4NWE1NDlkOGFlYzE4ODgxNjk5ZWFiMzIwYTA0MDlmN2ZkYmUzOTozNmFmOWMwODE0NmU2ZDI1MWQ1MTNlNTllNWExYzYyZDYyY2ZiOWViZTg1NmQ3NTM5NGJlZmRkZWNlNzQ4NGMxOjAxNjVhMGMwNzg2NTc3NWRlYTgzYTQ1MTdjMTI1ZmYzMGMxZTJjMWEwOThlN2NiY2U3YmNhZmUyYjcxOTljYmMiLAogICAgICAgICAgICAiMjQ5ZWY1NWZjZDQxMWM1YTgwNTRhYmI2MGU3MTUxMTVkNTk5ZWJiZTY4MmQ2Yjc0YmUzYmQxOTI3MjQ4ODVjMTo1MDJiNTM3MjAxYzcxMTVlZjBkMTcxNTMwYzdjZjVjMGU1MTE3NTRlOWM5NWYwNTk0MWVjMjdkMTVjOWUwMTk4OjQ4YWExMThmZGZkYTlhMzAzODdlOTBlMDY2MWYyYjViNmM4ZTg3MzU0ZDFmYTlhMzdiZjU4NTEzYWMzZTQ1MTI6OWY2MjU0NjRjN2IzNGE1NTM2ZjQzMWY1ZDI5NDYzNDNkMjcyNTgwZTM2NDQ2ZGRiMTJiMDQwMTYyZTU0M2NlMTpkNDQ5MWVhMTg4NzEwNWVmMDYwMWY0ZTVmYTM5ODNmZmU1N2Q3YTU3ZWU4ZjZiMDM3MDkxZjQyMThjMWE2MzU4IgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGNwYXRoKS8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0KICAgICAgXSwKICAgICAgImRldmljZXMiOiBbXSwKICAgICAgInNhbmRib3hfcGlkbnMiOiBmYWxzZSwKICAgICAgImV4ZWNfY29tbWFuZHMiOiBbXSwKICAgICAgImVudl9tYXAiOiB7CiAgICAgICAgIkhPU1ROQU1FIjogIiQoaG9zdC1uYW1lKSIsCiAgICAgICAgIk1FVEFfTkFNRSI6ICIkKHNhbmRib3gtbmFtZSkiLAogICAgICAgICJQQVRIIjogIi91c3IvbG9jYWwvc2JpbjovdXNyL2xvY2FsL2JpbjovdXNyL3NiaW46L3Vzci9iaW46L3NiaW46L2JpbiIKICAgICAgfQogICAgfQogIF0sCiAgImNvbW1vbiI6IHsKICAgICJjcGF0aCI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zaGFyZWQvY29udGFpbmVycyIsCiAgICAibW91bnRfc291cmNlX2NwYXRoIjogIi9ydW4va2F0YS1jb250YWluZXJzL3NoYXJlZC9jb250YWluZXJzIiwKICAgICJzZnByZWZpeCI6ICJeJChjcGF0aCkvJChidW5kbGUtaWQpLVthLXowLTldezE2fS0iLAogICAgInNwYXRoIjogIi9ydW4va2F0YS1jb250YWluZXJzL3NhbmRib3gvc3RvcmFnZSIsCiAgICAiaXB2NF9hIjogIigoWzAtOV18WzEtOV1bMC05XXwxWzAtOV17Mn18MlswLTRdWzAtOV18MjVbMC01XSlcXC4pezN9KFswLTldfFsxLTldWzAtOV18MVswLTldezJ9fDJbMC00XVswLTldfDI1WzAtNV0pIiwKICAgICJpcF9wIjogIlswLTldezEsNX0iLAogICAgInN2Y19uYW1lIjogIltBLVpfXFwuXFwtXSsiLAogICAgImRuc19sYWJlbCI6ICJbYS16QS1aMC05X1xcLlxcLV0rIiwKICAgICJzX3NvdXJjZTEiOiAiXi4uMlswLTldezN9X1swLTFdWzAtOV1fWzAtM11bMC05XV9bMC0yXVswLTldX1swLTVdWzAtOV1fWzAtNV1bMC05XVxcLlswLTldezEsMTB9JCIsCiAgICAic19zb3VyY2UyIjogIl4uLmRhdGEvIiwKICAgICJkbnNfc3ViZG9tYWluIjogIl5bYS16MC05XShbLWEtejAtOV0qW2EtejAtOV0pPyQiLAogICAgInBvZF91aWQiOiAiXlswLTlhLWZBLUZdezh9LVswLTlhLWZBLUZdezR9LVswLTlhLWZBLUZdezR9LVswLTlhLWZBLUZdezR9LVswLTlhLWZBLUZdezEyfSQiLAogICAgImRlZmF1bHRfY2FwcyI6IFsKICAgICAgIkNBUF9DSE9XTiIsCiAgICAgICJDQVBfREFDX09WRVJSSURFIiwKICAgICAgIkNBUF9GU0VUSUQiLAogICAgICAiQ0FQX0ZPV05FUiIsCiAgICAgICJDQVBfTUtOT0QiLAogICAgICAiQ0FQX05FVF9SQVciLAogICAgICAiQ0FQX1NFVEdJRCIsCiAgICAgICJDQVBfU0VUVUlEIiwKICAgICAgIkNBUF9TRVRGQ0FQIiwKICAgICAgIkNBUF9TRVRQQ0FQIiwKICAgICAgIkNBUF9ORVRfQklORF9TRVJWSUNFIiwKICAgICAgIkNBUF9TWVNfQ0hST09UIiwKICAgICAgIkNBUF9LSUxMIiwKICAgICAgIkNBUF9BVURJVF9XUklURSIKICAgIF0sCiAgICAicHJpdmlsZWdlZF9jYXBzIjogWwogICAgICAiQ0FQX0NIT1dOIiwKICAgICAgIkNBUF9EQUNfT1ZFUlJJREUiLAogICAgICAiQ0FQX0RBQ19SRUFEX1NFQVJDSCIsCiAgICAgICJDQVBfRk9XTkVSIiwKICAgICAgIkNBUF9GU0VUSUQiLAogICAgICAiQ0FQX0tJTEwiLAogICAgICAiQ0FQX1NFVEdJRCIsCiAgICAgICJDQVBfU0VUVUlEIiwKICAgICAgIkNBUF9TRVRQQ0FQIiwKICAgICAgIkNBUF9MSU5VWF9JTU1VVEFCTEUiLAogICAgICAiQ0FQX05FVF9CSU5EX1NFUlZJQ0UiLAogICAgICAiQ0FQX05FVF9CUk9BRENBU1QiLAogICAgICAiQ0FQX05FVF9BRE1JTiIsCiAgICAgICJDQVBfTkVUX1JBVyIsCiAgICAgICJDQVBfSVBDX0xPQ0siLAogICAgICAiQ0FQX0lQQ19PV05FUiIsCiAgICAgICJDQVBfU1lTX01PRFVMRSIsCiAgICAgICJDQVBfU1lTX1JBV0lPIiwKICAgICAgIkNBUF9TWVNfQ0hST09UIiwKICAgICAgIkNBUF9TWVNfUFRSQUNFIiwKICAgICAgIkNBUF9TWVNfUEFDQ1QiLAogICAgICAiQ0FQX1NZU19BRE1JTiIsCiAgICAgICJDQVBfU1lTX0JPT1QiLAogICAgICAiQ0FQX1NZU19OSUNFIiwKICAgICAgIkNBUF9TWVNfUkVTT1VSQ0UiLAogICAgICAiQ0FQX1NZU19USU1FIiwKICAgICAgIkNBUF9TWVNfVFRZX0NPTkZJRyIsCiAgICAgICJDQVBfTUtOT0QiLAogICAgICAiQ0FQX0xFQVNFIiwKICAgICAgIkNBUF9BVURJVF9XUklURSIsCiAgICAgICJDQVBfQVVESVRfQ09OVFJPTCIsCiAgICAgICJDQVBfU0VURkNBUCIsCiAgICAgICJDQVBfTUFDX09WRVJSSURFIiwKICAgICAgIkNBUF9NQUNfQURNSU4iLAogICAgICAiQ0FQX1NZU0xPRyIsCiAgICAgICJDQVBfV0FLRV9BTEFSTSIsCiAgICAgICJDQVBfQkxPQ0tfU1VTUEVORCIsCiAgICAgICJDQVBfQVVESVRfUkVBRCIsCiAgICAgICJDQVBfUEVSRk1PTiIsCiAgICAgICJDQVBfQlBGIiwKICAgICAgIkNBUF9DSEVDS1BPSU5UX1JFU1RPUkUiCiAgICBdLAogICAgInZpcnRpb19ibGtfc3RvcmFnZV9jbGFzc2VzIjogWwogICAgICAiY2MtbG9jYWwtY3NpIiwKICAgICAgImNjLW1hbmFnZWQtY3NpIiwKICAgICAgImNjLW1hbmFnZWQtcHJlbWl1bS1jc2kiCiAgICBdLAogICAgInNtYl9zdG9yYWdlX2NsYXNzZXMiOiBbCiAgICAgIHsKICAgICAgICAibmFtZSI6ICJhenVyZWZpbGUtY3NpLWthdGEtY2MiLAogICAgICAgICJtb3VudF9vcHRpb25zIjogWwogICAgICAgICAgImRpcl9tb2RlPTA3NzciLAogICAgICAgICAgImZpbGVfbW9kZT0wNzc3IiwKICAgICAgICAgICJtZnN5bWxpbmtzIiwKICAgICAgICAgICJjYWNoZT1zdHJpY3QiLAogICAgICAgICAgIm5vc2hhcmVzb2NrIiwKICAgICAgICAgICJhY3RpbWVvPTMwIiwKICAgICAgICAgICJub2JybCIKICAgICAgICBdCiAgICAgIH0KICAgIF0KICB9LAogICJzYW5kYm94IjogewogICAgInN0b3JhZ2VzIjogWwogICAgICB7CiAgICAgICAgImRyaXZlciI6ICJlcGhlbWVyYWwiLAogICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICJzb3VyY2UiOiAic2htIiwKICAgICAgICAiZnN0eXBlIjogInRtcGZzIiwKICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAibm9kZXYiLAogICAgICAgICAgIm1vZGU9MTc3NyIsCiAgICAgICAgICAic2l6ZT02NzEwODg2NCIKICAgICAgICBdLAogICAgICAgICJtb3VudF9wb2ludCI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L3NobSIsCiAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICB9CiAgICBdCiAgfSwKICAicmVxdWVzdF9kZWZhdWx0cyI6IHsKICAgICJDcmVhdGVDb250YWluZXJSZXF1ZXN0IjogewogICAgICAiYWxsb3dfZW52X3JlZ2V4IjogWwogICAgICAgICJeSE9TVE5BTUU9JChkbnNfbGFiZWwpJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9QT1JUXyQoaXBfcClfVENQPXRjcDovLyQoaXB2NF9hKTokKGlwX3ApJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9QT1JUXyQoaXBfcClfVENQX1BST1RPPXRjcCQiLAogICAgICAgICJeJChzdmNfbmFtZSlfUE9SVF8kKGlwX3ApX1RDUF9QT1JUPSQoaXBfcCkkIiwKICAgICAgICAiXiQoc3ZjX25hbWUpX1BPUlRfJChpcF9wKV9UQ1BfQUREUj0kKGlwdjRfYSkkIiwKICAgICAgICAiXiQoc3ZjX25hbWUpX1NFUlZJQ0VfSE9TVD0kKGlwdjRfYSkkIiwKICAgICAgICAiXiQoc3ZjX25hbWUpX1NFUlZJQ0VfUE9SVD0kKGlwX3ApJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9TRVJWSUNFX1BPUlRfJChkbnNfbGFiZWwpPSQoaXBfcCkkIiwKICAgICAgICAiXiQoc3ZjX25hbWUpX1BPUlQ9dGNwOi8vJChpcHY0X2EpOiQoaXBfcCkkIiwKICAgICAgICAiXkFaVVJFX0NMSUVOVF9JRD1bQS1GYS1mMC05LV0qJCIsCiAgICAgICAgIl5BWlVSRV9URU5BTlRfSUQ9W0EtRmEtZjAtOS1dKiQiLAogICAgICAgICJeQVpVUkVfRkVERVJBVEVEX1RPS0VOX0ZJTEU9L3Zhci9ydW4vc2VjcmV0cy9henVyZS90b2tlbnMvYXp1cmUtaWRlbnRpdHktdG9rZW4kIiwKICAgICAgICAiXkFaVVJFX0FVVEhPUklUWV9IT1NUPWh0dHBzOi8vbG9naW5cXC5taWNyb3NvZnRvbmxpbmVcXC5jb20vJCIsCiAgICAgICAgIl5URVJNPXh0ZXJtJCIKICAgICAgXSwKICAgICAgImFsbG93X2Vudl9yZWdleF9tYXAiOiB7CiAgICAgICAgIkNQVV9MSU1JVCI6ICJeWzAtOV0rJCIsCiAgICAgICAgIkpPQl9DT01QTEVUSU9OX0lOREVYIjogIl5bMC05XSokIiwKICAgICAgICAiTUVNT1JZX0xJTUlUIjogIl5bMC05XSskIgogICAgICB9CiAgICB9LAogICAgIkNvcHlGaWxlUmVxdWVzdCI6IFsKICAgICAgIiQoc2ZwcmVmaXgpIgogICAgXSwKICAgICJFeGVjUHJvY2Vzc1JlcXVlc3QiOiB7CiAgICAgICJhbGxvd2VkX2NvbW1hbmRzIjogW10sCiAgICAgICJyZWdleCI6IFtdCiAgICB9LAogICAgIlVwZGF0ZVJvdXRlc1JlcXVlc3QiOiB7CiAgICAgICJmb3JiaWRkZW5fZGV2aWNlX25hbWVzIjogWwogICAgICAgICJsbyIKICAgICAgXSwKICAgICAgImZvcmJpZGRlbl9zb3VyY2VfcmVnZXgiOiBbCiAgICAgICAgIl4oPzowezAsNH06KXswLDd9MHswLDN9MSQiLAogICAgICAgICJeMTI3XFwuKD86WzAtOV17MSwzfVxcLil7Mn1bMC05XXsxLDN9JCIKICAgICAgXQogICAgfSwKICAgICJVcGRhdGVJbnRlcmZhY2VSZXF1ZXN0IjogewogICAgICAiYWxsb3dfcmF3X2ZsYWdzIjogMTI4LAogICAgICAiZm9yYmlkZGVuX25hbWVzIjogWwogICAgICAgICJsbyIKICAgICAgXSwKICAgICAgImZvcmJpZGRlbl9od19hZGRycyI6IFsKICAgICAgICAiMDA6MDA6MDA6MDA6MDA6MDAiCiAgICAgIF0KICAgIH0sCiAgICAiQ2xvc2VTdGRpblJlcXVlc3QiOiBmYWxzZSwKICAgICJSZWFkU3RyZWFtUmVxdWVzdCI6IGZhbHNlLAogICAgIlVwZGF0ZUVwaGVtZXJhbE1vdW50c1JlcXVlc3QiOiBmYWxzZSwKICAgICJXcml0ZVN0cmVhbVJlcXVlc3QiOiBmYWxzZQogIH0KfQ== + spec: + runtimeClassName: kata-cc + affinity: + podAntiAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchExpressions: + - key: app.kubernetes.io/name + operator: In + values: + - foo + topologyKey: kubernetes.io/hostname + securityContext: + runAsUser: 22222 + containers: + - name: nginx + image: "marinerconfpodstest.azurecr.io/azurelinux/base/nginx:1.25" + volumeMounts: + - mountPath: /usr/share/nginx/html + name: wwwtest + ports: + - containerPort: 80 + name: web + command: + - /bin/sh + args: + - "-c" + - while true; do echo $(META_NAME); sleep 10; done + env: + - name: META_NAME + valueFrom: + fieldRef: + fieldPath: metadata.name + volumeClaimTemplates: + - metadata: + name: wwwtest + spec: + storageClassName: default + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi + minReadySeconds: 1 + updateStrategy: + type: RollingUpdate + rollingUpdate: + maxUnavailable: 20% + partition: 1 + revisionHistoryLimit: 9 + persistentVolumeClaimRetentionPolicy: + whenDeleted: Delete + whenScaled: Retain diff --git a/src/agent/samples/policy/yaml/stateful-set/web2.yaml b/src/agent/samples/policy/yaml/stateful-set/web2.yaml new file mode 100644 index 000000000000..b03190a24f11 --- /dev/null +++ b/src/agent/samples/policy/yaml/stateful-set/web2.yaml @@ -0,0 +1,66 @@ +--- +apiVersion: v1 +kind: Service +metadata: + name: nginx2 + labels: + app: nginx2 +spec: + selector: + app: nginx2 + ports: + - port: 80 + name: web + clusterIP: None +--- +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: web2 +spec: + serviceName: nginx2 + replicas: 1 + selector: + matchLabels: + app: nginx2 + template: + metadata: + labels: + app: nginx2 + annotations: + io.katacontainers.config.agent.policy: IyBDb3B5cmlnaHQgKGMpIDIwMjMgTWljcm9zb2Z0IENvcnBvcmF0aW9uCiMKIyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMAojCnBhY2thZ2UgYWdlbnRfcG9saWN5CgppbXBvcnQgZnV0dXJlLmtleXdvcmRzLmluCmltcG9ydCBmdXR1cmUua2V5d29yZHMuZXZlcnkKCiMgRGVmYXVsdCB2YWx1ZXMsIHJldHVybmVkIGJ5IE9QQSB3aGVuIHJ1bGVzIGNhbm5vdCBiZSBldmFsdWF0ZWQgdG8gdHJ1ZS4KZGVmYXVsdCBBZGRBUlBOZWlnaGJvcnNSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgQWRkU3dhcFJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBDbG9zZVN0ZGluUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IENvcHlGaWxlUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IENyZWF0ZUNvbnRhaW5lclJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBDcmVhdGVTYW5kYm94UmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IERlc3Ryb3lTYW5kYm94UmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgRXhlY1Byb2Nlc3NSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgR2V0T09NRXZlbnRSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBHdWVzdERldGFpbHNSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBMaXN0SW50ZXJmYWNlc1JlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBMaXN0Um91dGVzUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IE1lbUhvdHBsdWdCeVByb2JlUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IE9ubGluZUNQVU1lbVJlcXVlc3QgOj0gdHJ1ZQpkZWZhdWx0IFBhdXNlQ29udGFpbmVyUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFJlYWRTdHJlYW1SZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgUmVtb3ZlQ29udGFpbmVyUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgUmVtb3ZlU3RhbGVWaXJ0aW9mc1NoYXJlTW91bnRzUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgUmVzZWVkUmFuZG9tRGV2UmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFJlc3VtZUNvbnRhaW5lclJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBTZXRHdWVzdERhdGVUaW1lUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFNldFBvbGljeVJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBTaWduYWxQcm9jZXNzUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgU3RhcnRDb250YWluZXJSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBTdGFydFRyYWNpbmdSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgU3RhdHNDb250YWluZXJSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBTdG9wVHJhY2luZ1JlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBUdHlXaW5SZXNpemVSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBVcGRhdGVDb250YWluZXJSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgVXBkYXRlRXBoZW1lcmFsTW91bnRzUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFVwZGF0ZUludGVyZmFjZVJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBVcGRhdGVSb3V0ZXNSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgV2FpdFByb2Nlc3NSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBXcml0ZVN0cmVhbVJlcXVlc3QgOj0gZmFsc2UKCiMgQWxsb3dSZXF1ZXN0c0ZhaWxpbmdQb2xpY3kgOj0gdHJ1ZSBjb25maWd1cmVzIHRoZSBBZ2VudCB0byAqYWxsb3cgYW55CiMgcmVxdWVzdHMgY2F1c2luZyBhIHBvbGljeSBmYWlsdXJlKi4gVGhpcyBpcyBhbiB1bnNlY3VyZSBjb25maWd1cmF0aW9uCiMgYnV0IGlzIHVzZWZ1bCBmb3IgYWxsb3dpbmcgdW5zZWN1cmUgcG9kcyB0byBzdGFydCwgdGhlbiBjb25uZWN0IHRvCiMgdGhlbSBhbmQgaW5zcGVjdCBPUEEgbG9ncyBmb3IgdGhlIHJvb3QgY2F1c2Ugb2YgYSBmYWlsdXJlLgpkZWZhdWx0IEFsbG93UmVxdWVzdHNGYWlsaW5nUG9saWN5IDo9IGZhbHNlCgojIENvbnN0YW50cwpTX05BTUVfS0VZID0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZSIKU19OQU1FU1BBQ0VfS0VZID0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZXNwYWNlIgpCVU5ETEVfSUQgPSAiW2EtejAtOV17NjR9IgoKQ3JlYXRlQ29udGFpbmVyUmVxdWVzdDo9IHJlc3AgewogICAgbm90IGlzX251bGwoaW5wdXQuZW52X21hcCkKICAgIAogICAgaV9lbnZfbWFwIDo9IGlucHV0LmVudl9tYXAKICAgIAogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBwX2Vudl9tYXAgOj0gcF9jb250YWluZXIuZW52X21hcCAgCiAgICBhbGxvd19lbnZfbWFwKHBfZW52X21hcCwgaV9lbnZfbWFwKQogICAgCiAgICBpX3Byb2Nlc3MgOj0gaW5wdXQuYmFzZS5PQ0kuUHJvY2VzcwogICAgCiAgICBwX3Byb2Nlc3MgOj0gcF9jb250YWluZXIuT0NJLlByb2Nlc3MKICAgIAogICAgYWxsb3dfYXJncyhpX3Byb2Nlc3MsIHBfcHJvY2VzcywgaV9lbnZfbWFwKQoKICAgIHJlc3AgPSBDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uKGlucHV0LmJhc2UpCiAgICBwcmludCgiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdDogdHJ1ZSIpCn0KCmFsbG93X2FyZ3MoaV9wcm9jZXNzLCBwX3Byb2Nlc3MsIGlfZW52X21hcCkgewogICAgaV9hcmdzIDo9IGlfcHJvY2Vzcy5BcmdzCiAgICBwX2FyZ3MgOj0gcF9wcm9jZXNzLkFyZ3MKICAgIHByaW50KCJhbGxvd19hcmdzOiBpX2FyZ3MgPSIsIGlfYXJncywgInBfYXJncyA9IiwgcF9hcmdzKQogICAgY291bnQoaV9hcmdzKSA9PSBjb3VudChwX2FyZ3MpCiAgICBldmVyeSBpLCBpX2FyZyBpbiBpX2FyZ3MgewogICAgICAgIHByaW50KCJhbGxvd19hcmdzOiBpX2FyZyA9IiwgaV9hcmcpCiAgICAgICAgcF9hcmdfcmVwbGFjZWQgOj0gcmVwbGFjZV9lbnZfdmFyaWFibGVzKHBfYXJnc1tpXSwgaV9lbnZfbWFwKQogICAgICAgIHByaW50KCJhbGxvd19hcmdzOiBwX2FyZ19yZXBsYWNlZCA9IiwgcF9hcmdfcmVwbGFjZWQpCiAgICAgICAgcF9hcmdfcmVwbGFjZWQyIDo9IHJlcGxhY2UocF9hcmdfcmVwbGFjZWQsICIkJCIsICIkIikKICAgICAgICBwcmludCgiYWxsb3dfYXJnczogcF9hcmdfcmVwbGFjZWQyID0iLCBwX2FyZ19yZXBsYWNlZDIpCiAgICAgICAgaV9hcmcgPT0gcF9hcmdfcmVwbGFjZWQyCiAgICB9CiAgICBwcmludCgiYWxsb3dfYXJnczogdHJ1ZSIpCn0KCmFsbG93X2FyZ3MoaV9wcm9jZXNzLCBwX3Byb2Nlc3MsIGlfZW52X21hcCkgewogICAgbm90IGlfcHJvY2Vzcy5BcmdzCiAgICBub3QgcF9wcm9jZXNzLkFyZ3MKICAgIHByaW50KCJhbGxvd19hcmdzMjogbm8gYXJncyIpCn0KCiMgdGhpcyBmdW5jdGlvbiByZXBsYWNlcyBhbGwgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyBpbiBhIHN0cmluZywgZ2l2ZW4gYSBtYXAgb2YgZW52aXJvbm1lbnQga2V5cyB0byBlbnZpcm9ubWVudCB2YWx1ZXMKIyBlZyBzdHIgPSAiZWNobyAkKENMVVNURVJfSUQpOyBlY2hvICQoTk9ERV9OQU1FKTsiCiMgZW52X21hcCA9IHsiQ0xVU1RFUl9JRCI6ICJhYmMiLCAiTk9ERV9OQU1FIiA6ICJ4eXoifQojIHJlc3VsdCA9ICJlY2hvIGFiYzsgZWNobyB4eXo7IgpyZXBsYWNlX2Vudl92YXJpYWJsZXMoc3RyLCBlbnZfbWFwKSA9IHJlc3VsdCB7CiAgICAjIG1ha2UgYW4gYXJyYXkgb2YgdGhlIGtleXMgZWcgWyJDTFVTVEVSX0lEIiwgIk5PREVfTkFNRSJdCiAgICBrZXlzIDo9IFt4IHwgc29tZSB4IGluIG9iamVjdC5rZXlzKGVudl9tYXApXQogICAgcmVzdWx0IDo9IHJlcGxhY2Vfc3RyX3JlYyhzdHIsIGVudl9tYXAsIGtleXMsIGNvdW50KGtleXMpIC0gMSkKfQoKIyBiYXNlIGNhc2UKcmVwbGFjZV9zdHJfcmVjKHN0ciwgZW52X21hcCwgYXJyX2tleXMsIGkpID0gcmVzdWx0IHsKICAgIGkgPCAwCiAgICByZXN1bHQgOj0gc3RyCn0KCiMgcmVjdXJzaXZlIHN0ZXAKcmVwbGFjZV9zdHJfcmVjKHN0ciwgZW52X21hcCwgYXJyX2tleXMsIGkpID0gcmVzdWx0IHsKICAgIGkgPj0gMAogICAga2V5IDo9IGFycl9rZXlzW2ldCiAgICBlbnZfa2V5MSA6PSBjb25jYXQoIiIsIFsiJCgiLCBrZXksICIpIl0pCiAgICAjIHJlcGxhY2UgJChWQVIpIHdpdGggdmFsdWUKICAgIG5ld19zdHIxIDo9IHJlcGxhY2Uoc3RyLCBlbnZfa2V5MSwgZW52X21hcFtrZXldKQogICAgIyByZXBsYWNlIG5leHQgZW52aXJvbm1lbnQgdmFyaWFibGUKICAgIHJlc3VsdCA9IHJlcGxhY2Vfc3RyX3JlYyhuZXdfc3RyMSwgZW52X21hcCwgYXJyX2tleXMsIGkgLSAxKQp9CgphbGxvd19lbnZfbWFwKHBfZW52X21hcCwgaV9lbnZfbWFwKSB7CiAgICBwcmludCgiYWxsb3dfZW52X21hcDogcF9lbnZfbWFwID0iLCBwX2Vudl9tYXApCiAgICBldmVyeSBlbnZfa2V5LCBlbnZfdmFsIGluIGlfZW52X21hcCB7CiAgICAgICAgcHJpbnQoImFsbG93X2VudjogZW52X2tleSA9IiwgZW52X2tleSwgImVudl92YWwgPSIsIGVudl92YWwpCiAgICAgICAgYWxsb3dfZW52X21hcF9lbnRyeShlbnZfa2V5LCBlbnZfdmFsLCBwX2Vudl9tYXApCiAgICB9CiAgICBwcmludCgiYWxsb3dfZW52X21hcDogdHJ1ZSIpCn0KCiMgQWxsb3cgZXhhY3QgbWF0Y2gKYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBpX3ZhbCA9PSBwX3ZhbAogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnk6IHRydWUiKQp9CgojIEFsbG93IHJlc291cmNlRmllbGRSZWYgdmFsdWVzIChlLmcuLCAibGltaXRzLmNwdSIpLgphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgICMgYSB2YXJpYWJsZSB3ZSBzaG91bGQgYmUgdmFsaWRhdGluZyB1c2luZyBhIHJlZ2V4IGZyb20gc2V0dGluZ3MKICAgIHBfdmFsID09ICIkKHZhbGlkYXRlLWZyb20tc2V0dGluZ3MpIgogICAgcmVnZXhfdmFsIDo9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuQ3JlYXRlQ29udGFpbmVyUmVxdWVzdC5hbGxvd19lbnZfcmVnZXhfbWFwW2tleV0KICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4X3ZhbCwgaV92YWwpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSAyOiB0cnVlIikKfQoKIyBBbGxvdyBub2RlLW5hbWUKYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChub2RlLW5hbWUpIgogICAgcmVnZXgubWF0Y2gocG9saWN5X2RhdGEuY29tbW9uLmRuc19zdWJkb21haW4gLCBpX3ZhbCkKICAgIHByaW50KCJhbGxvd19lbnZfbWFwX2VudHJ5IDM6IHRydWUiKQp9CgojIEFsbG93IGhvc3QtbmFtZQphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgIHBfdmFsID09ICIkKGhvc3QtbmFtZSkiCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24uZG5zX2xhYmVsICwgaV92YWwpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSA0OiB0cnVlIikKfQoKIyBBbGxvdyBwb2QtdWlkCmFsbG93X2Vudl9tYXBfZW50cnkoa2V5LCBpX3ZhbCwgcF9lbnZfbWFwKSB7CiAgICBwX3ZhbCA6PSBwX2Vudl9tYXBba2V5XQogICAgcF92YWwgPT0gIiQocG9kLXVpZCkiCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24ucG9kX3VpZCAsIGlfdmFsKQogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgNTogdHJ1ZSIpCn0KCiMgQWxsb3cgZmllbGRSZWYgImZpZWxkUGF0aDogc3RhdHVzLnBvZElQIiB2YWx1ZXMuCmFsbG93X2Vudl9tYXBfZW50cnkoa2V5LCBpX3ZhbCwgcF9lbnZfbWFwKSB7CiAgICBpc19pcChpX3ZhbCkKCiAgICBwX3ZhbCA6PSBwX2Vudl9tYXBba2V5XQogICAgcF92YXIgOj0gY29uY2F0KCI9IiwgW2tleSwgcF92YWxdKQogICAgYWxsb3dfcG9kX2lwX3ZhcihrZXksIHBfdmFyKQogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgNjogdHJ1ZSIpCn0KCiMgQWxsb3cgZmllbGRSZWYgImZpZWxkUGF0aDogc3RhdHVzLmhvc3RJUCIgdmFsdWVzLgphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgaXNfaXAoaV92YWwpCgogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgIHBfdmFyIDo9IGNvbmNhdCgiPSIsIFtrZXksIHBfdmFsXSkKICAgIGFsbG93X2hvc3RfaXBfdmFyKGtleSwgcF92YXIpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSA3OiB0cnVlIikKfQoKIyBNYXRjaCBpbnB1dCB3aXRoIG9uZSBvZiB0aGUgcG9saWN5IHZhcmlhYmxlcywgYWZ0ZXIgc3Vic3RpdHV0aW5nICQoc2FuZGJveC1uYW1lKS4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChzYW5kYm94LW5hbWUpIgogICAgc19uYW1lIDo9IGlucHV0LmJhc2UuT0NJLkFubm90YXRpb25zW1NfTkFNRV9LRVldCiAgICBwX3ZhcjIgOj0gcmVwbGFjZShwX3ZhbCwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHBfdmFyMiA9PSBpX3ZhbAogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgODogdHJ1ZSIpCn0KCiMgTWF0Y2ggaW5wdXQgd2l0aCBvbmUgb2YgdGhlIHBvbGljeSB2YXJpYWJsZXMsIGFmdGVyIHN1YnN0aXR1dGluZyAkKHNhbmRib3gtbmFtZXNwYWNlKS4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChzYW5kYm94LW5hbWVzcGFjZSkiCiAgICBzX25hbWVzcGFjZSA6PSBpbnB1dC5iYXNlLk9DSS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwX3ZhcjIgOj0gcmVwbGFjZShwX3ZhbCwgIiQoc2FuZGJveC1uYW1lc3BhY2UpIiwgc19uYW1lc3BhY2UpCiAgICBwX3ZhcjIgPT0gaV92YWwKICAgIHByaW50KCJhbGxvd19lbnZfbWFwX2VudHJ5IDk6IHRydWUiKQp9CgojIEFsbG93IGlucHV0IGVudiB2YXJpYWJsZXMgdGhhdCBtYXRjaCB3aXRoIGEgcmVxdWVzdF9kZWZhdWx0cyByZWdleC4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHNvbWUgcF9yZWdleDEgaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5DcmVhdGVDb250YWluZXJSZXF1ZXN0LmFsbG93X2Vudl9yZWdleAogICAgcF9yZWdleDIgOj0gcmVwbGFjZShwX3JlZ2V4MSwgIiQoaXB2NF9hKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcHY0X2EpCiAgICBwX3JlZ2V4MyA6PSByZXBsYWNlKHBfcmVnZXgyLCAiJChpcF9wKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcF9wKQogICAgcF9yZWdleDQgOj0gcmVwbGFjZShwX3JlZ2V4MywgIiQoc3ZjX25hbWUpIiwgcG9saWN5X2RhdGEuY29tbW9uLnN2Y19uYW1lKQogICAgcF9yZWdleDUgOj0gcmVwbGFjZShwX3JlZ2V4NCwgIiQoZG5zX2xhYmVsKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5kbnNfbGFiZWwpCgogICAgcmVzdWx0IDo9IGNvbmNhdCgiPSIsIFtrZXksIGlfdmFsXSkKICAgIHJlZ2V4Lm1hdGNoKHBfcmVnZXg1LCByZXN1bHQpCgogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgMTA6IHRydWUiKQp9CgpDcmVhdGVDb250YWluZXJSZXF1ZXN0Oj0gcmVzcCB7CiAgICBub3QgaW5wdXQuZW52X21hcAogICAgaV9wcm9jZXNzID0gaW5wdXQuT0NJLlByb2Nlc3MKICAgIHNfbmFtZSA9IGlucHV0Lk9DSS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBwX3Byb2Nlc3MgPSBwX2NvbnRhaW5lci5PQ0kuUHJvY2VzcwogICAgYWxsb3dfZGVwcmVjYXRlZF9hcmdzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUpCiAgICByZXNwID0gQ3JlYXRlQ29udGFpbmVyUmVxdWVzdENvbW1vbihpbnB1dCkKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0MjogdHJ1ZSIpCn0KCkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb24ocmVxKTo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgICMgQ2hlY2sgaWYgdGhlIGlucHV0IHJlcXVlc3Qgc2hvdWxkIGJlIHJlamVjdGVkIGV2ZW4gYmVmb3JlIGNoZWNraW5nIHRoZQogICAgIyBwb2xpY3lfZGF0YS5jb250YWluZXJzIGluZm9ybWF0aW9uLgogICAgYWxsb3dfY3JlYXRlX2NvbnRhaW5lcl9pbnB1dChyZXEpCgogICAgaV9vY2kgOj0gcmVxLk9DSQogICAgaV9zdG9yYWdlcyA6PSByZXEuc3RvcmFnZXMKICAgIGlfZGV2aWNlcyA6PSByZXEuZGV2aWNlcwoKICAgICMgYXJyYXkgb2YgcG9zc2libGUgc3RhdGUgb3BlcmF0aW9ucwogICAgb3BzX2J1aWxkZXIgOj0gW10KCiAgICAjIGNoZWNrIHNhbmRib3ggbmFtZQogICAgc2FuZGJveF9uYW1lID0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FX0tFWV0KICAgIGFkZF9zYW5kYm94X25hbWVfdG9fc3RhdGUgOj0gc3RhdGVfYWxsb3dzKCJzYW5kYm94X25hbWUiLCBzYW5kYm94X25hbWUpCiAgICBvcHNfYnVpbGRlcjEgOj0gY29uY2F0X29wX2lmX25vdF9udWxsKG9wc19idWlsZGVyLCBhZGRfc2FuZGJveF9uYW1lX3RvX3N0YXRlKQoKICAgICMgQ2hlY2sgaWYgYW55IGVsZW1lbnQgZnJvbSB0aGUgcG9saWN5X2RhdGEuY29udGFpbmVycyBhcnJheSBhbGxvd3MgdGhlIGlucHV0IHJlcXVlc3QuCiAgICBzb21lIHBfY29udGFpbmVyIGluIHBvbGljeV9kYXRhLmNvbnRhaW5lcnMKICAgIHByaW50KCI9PT09PT09PSBDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiB0cnlpbmcgbmV4dCBwb2xpY3kgY29udGFpbmVyIikKCiAgICBwX3BpZG5zIDo9IHBfY29udGFpbmVyLnNhbmRib3hfcGlkbnMKICAgIGlfcGlkbnMgOj0gcmVxLnNhbmRib3hfcGlkbnMKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiBwX3BpZG5zID0iLCBwX3BpZG5zLCAiaV9waWRucyA9IiwgaV9waWRucykKICAgIHBfcGlkbnMgPT0gaV9waWRucwoKICAgIHBfb2NpIDo9IHBfY29udGFpbmVyLk9DSQoKICAgICMgY2hlY2sgbmFtZXNwYWNlCiAgICBwX25hbWVzcGFjZSA6PSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBpX25hbWVzcGFjZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwcmludCAoIkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb246IHBfbmFtZXNwYWNlID0iLCBwX25hbWVzcGFjZSwgImlfbmFtZXNwYWNlID0iLCBpX25hbWVzcGFjZSkKICAgIGFkZF9uYW1lc3BhY2VfdG9fc3RhdGUgOj0gYWxsb3dfbmFtZXNwYWNlKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkKICAgIG9wc19idWlsZGVyMiA6PSBjb25jYXRfb3BfaWZfbm90X251bGwob3BzX2J1aWxkZXIxLCBhZGRfbmFtZXNwYWNlX3RvX3N0YXRlKQoKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiBwIFZlcnNpb24gPSIsIHBfb2NpLlZlcnNpb24sICJpIFZlcnNpb24gPSIsIGlfb2NpLlZlcnNpb24pCiAgICBwX29jaS5WZXJzaW9uID09IGlfb2NpLlZlcnNpb24KCiAgICBwcmludCgiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdENvbW1vbjogcCBSZWFkb25seSA9IiwgcF9vY2kuUm9vdC5SZWFkb25seSwgImkgUmVhZG9ubHkgPSIsIGlfb2NpLlJvb3QuUmVhZG9ubHkpCiAgICBwX29jaS5Sb290LlJlYWRvbmx5ID09IGlfb2NpLlJvb3QuUmVhZG9ubHkKCiAgICBhbGxvd19hbm5vKHBfb2NpLCBpX29jaSkKCiAgICBwX3N0b3JhZ2VzIDo9IHBfY29udGFpbmVyLnN0b3JhZ2VzCiAgICBhbGxvd19ieV9hbm5vKHBfb2NpLCBpX29jaSwgcF9zdG9yYWdlcywgaV9zdG9yYWdlcykKCiAgICBwX2RldmljZXMgOj0gcF9jb250YWluZXIuZGV2aWNlcwogICAgYWxsb3dfZGV2aWNlcyhwX2RldmljZXMsIGlfZGV2aWNlcykKCiAgICByZXQgOj0gYWxsb3dfbGludXgob3BzX2J1aWxkZXIyLCBwX29jaSwgaV9vY2kpCiAgICByZXQuYWxsb3dlZAoKICAgIG9wcyA6PSByZXQub3BzCgogICAgcHJpbnQoIkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb246IHRydWUiKQp9CgphbGxvd19jcmVhdGVfY29udGFpbmVyX2lucHV0KHJlcSkgewogICAgcHJpbnQoImFsbG93X2NyZWF0ZV9jb250YWluZXJfaW5wdXQ6IGlucHV0ID0iLCByZXEpCgogICAgY291bnQocmVxLnNoYXJlZF9tb3VudHMpID09IDAKICAgIGlzX251bGwocmVxLnN0cmluZ191c2VyKQoKICAgIGlfb2NpIDo9IHJlcS5PQ0kKICAgIGlzX251bGwoaV9vY2kuSG9va3MpCiAgICBpc19udWxsKGlfb2NpLlNvbGFyaXMpCiAgICBpc19udWxsKGlfb2NpLldpbmRvd3MpCgogICAgaV9saW51eCA6PSBpX29jaS5MaW51eAogICAgY291bnQoaV9saW51eC5HSURNYXBwaW5ncykgPT0gMAogICAgY291bnQoaV9saW51eC5Nb3VudExhYmVsKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlJlc291cmNlcy5EZXZpY2VzKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlJvb3Rmc1Byb3BhZ2F0aW9uKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlVJRE1hcHBpbmdzKSA9PSAwCiAgICBpc19udWxsKGlfbGludXguSW50ZWxSZHQpCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLkJsb2NrSU8pCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLk5ldHdvcmspCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLlBpZHMpCiAgICBpc19udWxsKGlfbGludXguU2VjY29tcCkKCiAgICBpX3Byb2Nlc3MgOj0gaV9vY2kuUHJvY2VzcwogICAgY291bnQoaV9wcm9jZXNzLlNlbGludXhMYWJlbCkgPT0gMAogICAgY291bnQoaV9wcm9jZXNzLlVzZXIuVXNlcm5hbWUpID09IDAKCiAgICBwcmludCgiYWxsb3dfY3JlYXRlX2NvbnRhaW5lcl9pbnB1dDogdHJ1ZSIpCn0KCmFsbG93X25hbWVzcGFjZShwX25hbWVzcGFjZSwgaV9uYW1lc3BhY2UpID0gYWRkX25hbWVzcGFjZSB7CiAgICBwX25hbWVzcGFjZSA9PSBpX25hbWVzcGFjZQogICAgYWRkX25hbWVzcGFjZSA6PSBudWxsCiAgICBwcmludCgiYWxsb3dfbmFtZXNwYWNlIDE6IGlucHV0IG5hbWVzcGFjZSBtYXRjaGVzIHBvbGljeSBkYXRhIikKfQoKYWxsb3dfbmFtZXNwYWNlKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkgPSBhZGRfbmFtZXNwYWNlIHsKICAgIHBfbmFtZXNwYWNlID09ICIiCiAgICBwcmludCgiYWxsb3dfbmFtZXNwYWNlIDI6IG5vIG5hbWVzcGFjZSBmb3VuZCBvbiBwb2xpY3kgZGF0YSIpCiAgICBhZGRfbmFtZXNwYWNlIDo9IHN0YXRlX2FsbG93cygibmFtZXNwYWNlIiwgaV9uYW1lc3BhY2UpCn0KCiMgdmFsdWUgaGFzbid0IGJlZW4gc2VlbiBiZWZvcmUsIHNhdmUgaXQgdG8gc3RhdGUKc3RhdGVfYWxsb3dzKGtleSwgdmFsdWUpID0gYWN0aW9uIHsKICBzdGF0ZSA6PSBnZXRfc3RhdGUoKQogIHByaW50KCJzdGF0ZV9hbGxvd3MgMTogc3RhdGVba2V5XSA9Iiwgc3RhdGVba2V5XSwgInZhbHVlID0iLCB2YWx1ZSkKICBub3Qgc3RhdGVba2V5XQogIHByaW50KCJzdGF0ZV9hbGxvd3MgMTogc2F2aW5nIHRvIHN0YXRlIGtleSA9Iiwga2V5LCAidmFsdWUgPSIsIHZhbHVlKQogIHBhdGggOj0gZ2V0X3N0YXRlX3BhdGgoa2V5KSAKICBhY3Rpb24gOj0gewogICAgIm9wIjogImFkZCIsCiAgICAicGF0aCI6IHBhdGgsIAogICAgInZhbHVlIjogdmFsdWUsCiAgfQp9CgojIHZhbHVlIG1hdGNoZXMgd2hhdCdzIGluIHN0YXRlLCBhbGxvdyBpdApzdGF0ZV9hbGxvd3Moa2V5LCB2YWx1ZSkgPSBhY3Rpb24gewogIHByaW50KCJzdGF0ZV9hbGxvd3MgMjogc3RhcnQiKQogIHN0YXRlIDo9IGdldF9zdGF0ZSgpCiAgcHJpbnQoInN0YXRlX2FsbG93cyAyOiBzdGF0ZVtrZXldID0iLCBzdGF0ZVtrZXldLCAidmFsdWUgPSIsIHZhbHVlKQogIHZhbHVlID09IHN0YXRlW2tleV0KICBwcmludCgic3RhdGVfYWxsb3dzIDI6IGZvdW5kIGtleSA9Iiwga2V5LCAidmFsdWUgPSIsIHZhbHVlLCAiIGluIHN0YXRlIikKICBhY3Rpb24gOj0gbnVsbAp9CgojIGhlbHBlciBmdW5jdGlvbnMgdG8gaW50ZXJhY3Qgd2l0aCB0aGUgc3RhdGUKZ2V0X3N0YXRlKCkgPSBzdGF0ZSB7CiAgc3RhdGUgOj0gZGF0YVsicHN0YXRlIl0KfQoKZ2V0X3N0YXRlX3ZhbChrZXkpID0gdmFsdWUgewogICAgc3RhdGUgOj0gZ2V0X3N0YXRlKCkKICAgIHZhbHVlIDo9IHN0YXRlW2tleV0KfQoKZ2V0X3N0YXRlX3BhdGgoa2V5KSA9IHBhdGggewogICAgIyBwcmVwZW5kICIvcHN0YXRlLyIgdG8ga2V5CiAgICBwYXRoIDo9IGNvbmNhdCgiLyIsIFsiL3BzdGF0ZSIsIGtleV0pCn0KCiMgSGVscGVyIGZ1bmN0aW9ucyB0byBjb25kaXRpb25hbGx5IGNvbmNhdGVuYXRlIG9wIGlzIG5vdCBudWxsCmNvbmNhdF9vcF9pZl9ub3RfbnVsbChvcHMsIG9wKSA9IHJlc3VsdCB7CiAgICBvcCA9PSBudWxsCiAgICByZXN1bHQgOj0gb3BzCn0KCmNvbmNhdF9vcF9pZl9ub3RfbnVsbChvcHMsIG9wKSA9IHJlc3VsdCB7CiAgICBvcCAhPSBudWxsCiAgICByZXN1bHQgOj0gYXJyYXkuY29uY2F0KG9wcywgW29wXSkKfQoKIyBSZWplY3QgdW5leHBlY3RlZCBhbm5vdGF0aW9ucy4KYWxsb3dfYW5ubyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19hbm5vIDE6IHN0YXJ0IikKCiAgICBub3QgaV9vY2kuQW5ub3RhdGlvbnMKCiAgICBwcmludCgiYWxsb3dfYW5ubyAxOiB0cnVlIikKfQphbGxvd19hbm5vKHBfb2NpLCBpX29jaSkgewogICAgcHJpbnQoImFsbG93X2Fubm8gMjogcCBBbm5vdGF0aW9ucyA9IiwgcF9vY2kuQW5ub3RhdGlvbnMpCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiBpIEFubm90YXRpb25zID0iLCBpX29jaS5Bbm5vdGF0aW9ucykKCiAgICBpX2tleXMgOj0gb2JqZWN0LmtleXMoaV9vY2kuQW5ub3RhdGlvbnMpCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiBpIGtleXMgPSIsIGlfa2V5cykKCiAgICBldmVyeSBpX2tleSBpbiBpX2tleXMgewogICAgICAgIGFsbG93X2Fubm9fa2V5KGlfa2V5LCBwX29jaSkKICAgIH0KCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiB0cnVlIikKfQoKYWxsb3dfYW5ub19rZXkoaV9rZXksIHBfb2NpKSB7CiAgICBwcmludCgiYWxsb3dfYW5ub19rZXkgMTogaSBrZXkgPSIsIGlfa2V5KQoKICAgIHN0YXJ0c3dpdGgoaV9rZXksICJpby5rdWJlcm5ldGVzLmNyaS4iKQoKICAgIHByaW50KCJhbGxvd19hbm5vX2tleSAxOiB0cnVlIikKfQphbGxvd19hbm5vX2tleShpX2tleSwgcF9vY2kpIHsKICAgIHByaW50KCJhbGxvd19hbm5vX2tleSAyOiBpIGtleSA9IiwgaV9rZXkpCgogICAgc29tZSBwX2tleSwgXyBpbiBwX29jaS5Bbm5vdGF0aW9ucwogICAgcF9rZXkgPT0gaV9rZXkKCiAgICBwcmludCgiYWxsb3dfYW5ub19rZXkgMjogdHJ1ZSIpCn0KCiMgR2V0IHRoZSB2YWx1ZSBvZiB0aGUgU19OQU1FX0tFWSBhbm5vdGF0aW9uIGFuZAojIGNvcnJlbGF0ZSBpdCB3aXRoIG90aGVyIGFubm90YXRpb25zIGFuZCBwcm9jZXNzIGZpZWxkcy4KYWxsb3dfYnlfYW5ubyhwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpIHsKICAgIHByaW50KCJhbGxvd19ieV9hbm5vIDE6IHN0YXJ0IikKCiAgICBub3QgcF9vY2kuQW5ub3RhdGlvbnNbU19OQU1FX0tFWV0KCiAgICBpX3NfbmFtZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMTogaV9zX25hbWUgPSIsIGlfc19uYW1lKQoKICAgIGlfc19uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FU1BBQ0VfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMTogaV9zX25hbWVzcGFjZSA9IiwgaV9zX25hbWVzcGFjZSkKCiAgICBhbGxvd19ieV9zYW5kYm94X25hbWUocF9vY2ksIGlfb2NpLCBwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBpX3NfbmFtZSwgaV9zX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfYnlfYW5ubyAxOiB0cnVlIikKfQphbGxvd19ieV9hbm5vKHBfb2NpLCBpX29jaSwgcF9zdG9yYWdlcywgaV9zdG9yYWdlcykgewogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMjogc3RhcnQiKQoKICAgIHBfc19uYW1lIDo9IHBfb2NpLkFubm90YXRpb25zW1NfTkFNRV9LRVldCiAgICBpX3NfbmFtZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMjogaV9zX25hbWUgPSIsIGlfc19uYW1lLCAicF9zX25hbWUgPSIsIHBfc19uYW1lKQoKICAgIGFsbG93X3NhbmRib3hfbmFtZShwX3NfbmFtZSwgaV9zX25hbWUpCgogICAgaV9zX25hbWVzcGFjZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwcmludCgiYWxsb3dfYnlfYW5ubyAyOiBpX3NfbmFtZXNwYWNlID0iLCBpX3NfbmFtZXNwYWNlKQoKICAgIGFsbG93X2J5X3NhbmRib3hfbmFtZShwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMsIGlfc19uYW1lLCBpX3NfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd19ieV9hbm5vIDI6IHRydWUiKQp9CgphbGxvd19ieV9zYW5kYm94X25hbWUocF9vY2ksIGlfb2NpLCBwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfYnlfc2FuZGJveF9uYW1lOiBzdGFydCIpCgogICAgaV9uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FU1BBQ0VfS0VZXQoKICAgIGFsbG93X2J5X2NvbnRhaW5lcl90eXBlcyhwX29jaSwgaV9vY2ksIHNfbmFtZSwgaV9uYW1lc3BhY2UpCiAgICBhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZChwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpCiAgICBhbGxvd19wcm9jZXNzKHBfb2NpLlByb2Nlc3MsIGlfb2NpLlByb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpCgogICAgcHJpbnQoImFsbG93X2J5X3NhbmRib3hfbmFtZTogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfbmFtZShwX3NfbmFtZSwgaV9zX25hbWUpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X25hbWU6IHN0YXJ0IikKICAgIHJlZ2V4Lm1hdGNoKHBfc19uYW1lLCBpX3NfbmFtZSkKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9uYW1lOiB0cnVlIikKfQoKIyBDaGVjayB0aGF0IHRoZSAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLXR5cGUiIGFuZAojICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIiBhbm5vdGF0aW9ucyBkZXNpZ25hdGUgdGhlCiMgZXhwZWN0ZWQgdHlwZSAtIGVpdGhlciBhICJzYW5kYm94IiBvciBhICJjb250YWluZXIiLiBUaGVuLCB2YWxpZGF0ZQojIG90aGVyIGFubm90YXRpb25zIGJhc2VkIG9uIHRoZSBhY3R1YWwgInNhbmRib3giIG9yICJjb250YWluZXIiIHZhbHVlCiMgZnJvbSB0aGUgaW5wdXQgY29udGFpbmVyLgphbGxvd19ieV9jb250YWluZXJfdHlwZXMocF9vY2ksIGlfb2NpLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfYnlfY29udGFpbmVyX3R5cGVzOiBjaGVja2luZyBpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSIpCgogICAgY190eXBlIDo9ICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSIKICAgIAogICAgcF9jcmlfdHlwZSA6PSBwX29jaS5Bbm5vdGF0aW9uc1tjX3R5cGVdCiAgICBpX2NyaV90eXBlIDo9IGlfb2NpLkFubm90YXRpb25zW2NfdHlwZV0KICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZXM6IHBfY3JpX3R5cGUgPSIsIHBfY3JpX3R5cGUsICJpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgcF9jcmlfdHlwZSA9PSBpX2NyaV90eXBlCgogICAgYWxsb3dfYnlfY29udGFpbmVyX3R5cGUoaV9jcmlfdHlwZSwgcF9vY2ksIGlfb2NpLCBzX25hbWUsIHNfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZXM6IHRydWUiKQp9CgphbGxvd19ieV9jb250YWluZXJfdHlwZShpX2NyaV90eXBlLCBwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAxOiBpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgaV9jcmlfdHlwZSA9PSAic2FuZGJveCIKCiAgICBpX2thdGFfdHlwZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1siaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5jb250YWluZXJfdHlwZSJdCiAgICBwcmludCgiYWxsb3dfYnlfY29udGFpbmVyX3R5cGUgMTogaV9rYXRhX3R5cGUgPSIsIGlfa2F0YV90eXBlKQogICAgaV9rYXRhX3R5cGUgPT0gInBvZF9zYW5kYm94IgoKICAgIGFsbG93X3NhbmRib3hfY29udGFpbmVyX25hbWUocF9vY2ksIGlfb2NpKQogICAgYWxsb3dfc2FuZGJveF9uZXRfbmFtZXNwYWNlKHBfb2NpLCBpX29jaSkKICAgIGFsbG93X3NhbmRib3hfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpCgogICAgcHJpbnQoImFsbG93X2J5X2NvbnRhaW5lcl90eXBlIDE6IHRydWUiKQp9CgphbGxvd19ieV9jb250YWluZXJfdHlwZShpX2NyaV90eXBlLCBwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiBpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgaV9jcmlfdHlwZSA9PSAiY29udGFpbmVyIgoKICAgIGlfa2F0YV90eXBlIDo9IGlfb2NpLkFubm90YXRpb25zWyJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIl0KICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiBpX2thdGFfdHlwZSA9IiwgaV9rYXRhX3R5cGUpCiAgICBpX2thdGFfdHlwZSA9PSAicG9kX2NvbnRhaW5lciIKCiAgICBhbGxvd19jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpCiAgICBhbGxvd19uZXRfbmFtZXNwYWNlKHBfb2NpLCBpX29jaSkKICAgIGFsbG93X2xvZ19kaXJlY3RvcnkocF9vY2ksIGlfb2NpKQoKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiB0cnVlIikKfQoKIyAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLW5hbWUiIGFubm90YXRpb24KYWxsb3dfc2FuZGJveF9jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X2NvbnRhaW5lcl9uYW1lOiBzdGFydCIpCgogICAgY29udGFpbmVyX2Fubm90YXRpb25fbWlzc2luZyhwX29jaSwgaV9vY2ksICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItbmFtZSIpCgogICAgcHJpbnQoImFsbG93X3NhbmRib3hfY29udGFpbmVyX25hbWU6IHRydWUiKQp9CgphbGxvd19jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19jb250YWluZXJfbmFtZTogc3RhcnQiKQoKICAgIGFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uKHBfb2NpLCBpX29jaSwgImlvLmt1YmVybmV0ZXMuY3JpLmNvbnRhaW5lci1uYW1lIikKCiAgICBwcmludCgiYWxsb3dfY29udGFpbmVyX25hbWU6IHRydWUiKQp9Cgpjb250YWluZXJfYW5ub3RhdGlvbl9taXNzaW5nKHBfb2NpLCBpX29jaSwga2V5KSB7CiAgICBwcmludCgiY29udGFpbmVyX2Fubm90YXRpb25fbWlzc2luZzoiLCBrZXkpCgogICAgbm90IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIG5vdCBpX29jaS5Bbm5vdGF0aW9uc1trZXldCgogICAgcHJpbnQoImNvbnRhaW5lcl9hbm5vdGF0aW9uX21pc3Npbmc6IHRydWUiKQp9CgphbGxvd19jb250YWluZXJfYW5ub3RhdGlvbihwX29jaSwgaV9vY2ksIGtleSkgewogICAgcHJpbnQoImFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uOiBrZXkgPSIsIGtleSkKCiAgICBwX3ZhbHVlIDo9IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIGlfdmFsdWUgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgcHJpbnQoImFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uOiBwX3ZhbHVlID0iLCBwX3ZhbHVlLCAiaV92YWx1ZSA9IiwgaV92YWx1ZSkKCiAgICBwX3ZhbHVlID09IGlfdmFsdWUKCiAgICBwcmludCgiYWxsb3dfY29udGFpbmVyX2Fubm90YXRpb246IHRydWUiKQp9CgojICJuZXJkY3RsL25ldHdvcmstbmFtZXNwYWNlIiBhbm5vdGF0aW9uCmFsbG93X3NhbmRib3hfbmV0X25hbWVzcGFjZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X25ldF9uYW1lc3BhY2U6IHN0YXJ0IikKCiAgICBrZXkgOj0gIm5lcmRjdGwvbmV0d29yay1uYW1lc3BhY2UiCgogICAgcF9uYW1lc3BhY2UgOj0gcF9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgaV9uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgcHJpbnQoImFsbG93X3NhbmRib3hfbmV0X25hbWVzcGFjZTogcF9uYW1lc3BhY2UgPSIsIHBfbmFtZXNwYWNlLCAiaV9uYW1lc3BhY2UgPSIsIGlfbmFtZXNwYWNlKQoKICAgIHJlZ2V4Lm1hdGNoKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9uZXRfbmFtZXNwYWNlOiB0cnVlIikKfQoKYWxsb3dfbmV0X25hbWVzcGFjZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19uZXRfbmFtZXNwYWNlOiBzdGFydCIpCgogICAga2V5IDo9ICJuZXJkY3RsL25ldHdvcmstbmFtZXNwYWNlIgoKICAgIG5vdCBwX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICBub3QgaV9vY2kuQW5ub3RhdGlvbnNba2V5XQoKICAgIHByaW50KCJhbGxvd19uZXRfbmFtZXNwYWNlOiB0cnVlIikKfQoKIyAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1sb2ctZGlyZWN0b3J5IiBhbm5vdGF0aW9uCmFsbG93X3NhbmRib3hfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X2xvZ19kaXJlY3Rvcnk6IHN0YXJ0IikKCiAgICBrZXkgOj0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbG9nLWRpcmVjdG9yeSIKCiAgICBwX2RpciA6PSBwX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICByZWdleDEgOj0gcmVwbGFjZShwX2RpciwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHJlZ2V4MiA6PSByZXBsYWNlKHJlZ2V4MSwgIiQoc2FuZGJveC1uYW1lc3BhY2UpIiwgc19uYW1lc3BhY2UpCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiByZWdleDIgPSIsIHJlZ2V4MikKCiAgICBpX2RpciA6PSBpX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiBpX2RpciA9IiwgaV9kaXIpCgogICAgcmVnZXgubWF0Y2gocmVnZXgyLCBpX2RpcikKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiB0cnVlIikKfQoKYWxsb3dfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19sb2dfZGlyZWN0b3J5OiBzdGFydCIpCgogICAga2V5IDo9ICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWxvZy1kaXJlY3RvcnkiCgogICAgbm90IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIG5vdCBpX29jaS5Bbm5vdGF0aW9uc1trZXldCgogICAgcHJpbnQoImFsbG93X2xvZ19kaXJlY3Rvcnk6IHRydWUiKQp9CgphbGxvd19kZXZpY2VzKHBfZGV2aWNlcywgaV9kZXZpY2VzKSB7CiAgICBwcmludCgiYWxsb3dfZGV2aWNlczogc3RhcnQiKQogICAgZXZlcnkgaV9kZXZpY2UgaW4gaV9kZXZpY2VzIHsKICAgICAgICBwcmludCgiYWxsb3dfZGV2aWNlczogaV9kZXZpY2UgPSIsIGlfZGV2aWNlKQogICAgICAgIHNvbWUgcF9kZXZpY2UgaW4gcF9kZXZpY2VzCiAgICAgICAgcF9kZXZpY2UuY29udGFpbmVyX3BhdGggPT0gaV9kZXZpY2UuY29udGFpbmVyX3BhdGgKICAgIH0KICAgIHByaW50KCJhbGxvd19kZXZpY2VzOiB0cnVlIikKfQoKYWxsb3dfbGludXgoc3RhdGVfb3BzLCBwX29jaSwgaV9vY2kpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIHBfbmFtZXNwYWNlcyA6PSBwX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbGludXg6IHAgbmFtZXNwYWNlcyA9IiwgcF9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlcyA6PSBpX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbGludXg6IGkgbmFtZXNwYWNlcyA9IiwgaV9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlX3dpdGhvdXRfbmV0d29yayA6PSBbb2JqIHwgb2JqIDo9IGlfbmFtZXNwYWNlc1tfXTsgb2JqLlR5cGUgIT0gIm5ldHdvcmsiXQoKICAgIHByaW50KCJhbGxvd19saW51eDogaV9uYW1lc3BhY2Vfd2l0aG91dF9uZXR3b3JrID0iLCBpX25hbWVzcGFjZV93aXRob3V0X25ldHdvcmspCgogICAgcF9uYW1lc3BhY2VzID09IGlfbmFtZXNwYWNlX3dpdGhvdXRfbmV0d29yawoKICAgIGFsbG93X21hc2tlZF9wYXRocyhwX29jaSwgaV9vY2kpCiAgICBhbGxvd19yZWFkb25seV9wYXRocyhwX29jaSwgaV9vY2kpCiAgICBhbGxvd19saW51eF9kZXZpY2VzKHBfb2NpLkxpbnV4LkRldmljZXMsIGlfb2NpLkxpbnV4LkRldmljZXMpCiAgICBhbGxvd19saW51eF9zeXNjdGwocF9vY2kuTGludXgsIGlfb2NpLkxpbnV4KQogICAgcmV0IDo9IGFsbG93X25ldHdvcmtfbmFtZXNwYWNlX3N0YXJ0KHN0YXRlX29wcywgcF9vY2ksIGlfb2NpKQogICAgcmV0LmFsbG93ZWQKCiAgICBvcHMgOj0gcmV0Lm9wcwoKICAgIHByaW50KCJhbGxvd19saW51eDogdHJ1ZSIpCn0KCiMgUmV0cmlldmUgdGhlICJuZXR3b3JrIiBuYW1lc3BhY2UgZnJvbSB0aGUgaW5wdXQgZGF0YSBhbmQgcGFzcyBpdCBvbiBmb3IgdGhlCiMgbmV0d29yayBuYW1lc3BhY2UgcG9saWN5IGNoZWNrcy4KYWxsb3dfbmV0d29ya19uYW1lc3BhY2Vfc3RhcnQoc3RhdGVfb3BzLCBwX29jaSwgaV9vY2kpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIHByaW50KCJhbGxvd19uZXR3b3JrX25hbWVzcGFjZSBzdGFydDogc3RhcnQiKQoKICAgIHBfbmFtZXNwYWNlcyA6PSBwX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IHAgbmFtZXNwYWNlcyA9IiwgcF9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlcyA6PSBpX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IGkgbmFtZXNwYWNlcyA9IiwgaV9uYW1lc3BhY2VzKQoKICAgICMgUmV0dXJuIHBhdGggb2YgdGhlICJuZXR3b3JrIiBuYW1lc3BhY2UKICAgIG5ldHdvcmtfbnMgOj0gW29iaiB8IG9iaiA6PSBpX25hbWVzcGFjZXNbX107IG9iai5UeXBlID09ICJuZXR3b3JrIl0KCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IG5ldHdvcmtfbnMgPSIsIG5ldHdvcmtfbnMpCgogICAgcmV0IDo9IGFsbG93X25ldHdvcmtfbmFtZXNwYWNlKHN0YXRlX29wcywgbmV0d29ya19ucykKICAgIHJldC5hbGxvd2VkCgogICAgb3BzIDo9IHJldC5vcHMKfQoKIyBUaGlzIHJ1bGUgaXMgd2hlbiB0aGVyZSdzIG5vIG5ldHdvcmsgbmFtZXNwYWNlIGluIHRoZSBpbnB1dCBkYXRhLgphbGxvd19uZXR3b3JrX25hbWVzcGFjZShzdGF0ZV9vcHMsIG5ldHdvcmtfbnMpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIGNvdW50KG5ldHdvcmtfbnMpID09IDAKCiAgICBuZXR3b3JrX25zX3BhdGggPSAiIgoKICAgIGFkZF9uZXR3b3JrX25hbWVzcGFjZV90b19zdGF0ZSA6PSBzdGF0ZV9hbGxvd3MoIm5ldHdvcmtfbmFtZXNwYWNlIiwgbmV0d29ya19uc19wYXRoKQogICAgb3BzIDo9IGNvbmNhdF9vcF9pZl9ub3RfbnVsbChzdGF0ZV9vcHMsIGFkZF9uZXR3b3JrX25hbWVzcGFjZV90b19zdGF0ZSkKCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2UgMTogdHJ1ZSIpCn0KCiMgVGhpcyBydWxlIGlzIHdoZW4gdGhlcmUncyBleGFjdGx5IG9uZSBuZXR3b3JrIG5hbWVzcGFjZSBpbiB0aGUgaW5wdXQgZGF0YS4KYWxsb3dfbmV0d29ya19uYW1lc3BhY2Uoc3RhdGVfb3BzLCBuZXR3b3JrX25zKSA6PSB7Im9wcyI6IG9wcywgImFsbG93ZWQiOiB0cnVlfSB7CiAgICBjb3VudChuZXR3b3JrX25zKSA9PSAxCgogICAgYWRkX25ldHdvcmtfbmFtZXNwYWNlX3RvX3N0YXRlIDo9IHN0YXRlX2FsbG93cygibmV0d29ya19uYW1lc3BhY2UiLCBuZXR3b3JrX25zWzBdLlBhdGgpCiAgICBvcHMgOj0gY29uY2F0X29wX2lmX25vdF9udWxsKHN0YXRlX29wcywgYWRkX25ldHdvcmtfbmFtZXNwYWNlX3RvX3N0YXRlKQoKICAgIHByaW50KCJhbGxvd19uZXR3b3JrX25hbWVzcGFjZSAyOiB0cnVlIikKfQoKYWxsb3dfbWFza2VkX3BhdGhzKHBfb2NpLCBpX29jaSkgewogICAgcF9wYXRocyA6PSBwX29jaS5MaW51eC5NYXNrZWRQYXRocwogICAgcHJpbnQoImFsbG93X21hc2tlZF9wYXRocyAxOiBwX3BhdGhzID0iLCBwX3BhdGhzKQoKICAgIGlfcGF0aHMgOj0gaV9vY2kuTGludXguTWFza2VkUGF0aHMKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aHMgMTogaV9wYXRocyA9IiwgaV9wYXRocykKCiAgICBhbGxvd19tYXNrZWRfcGF0aHNfYXJyYXkocF9wYXRocywgaV9wYXRocykKCiAgICBwcmludCgiYWxsb3dfbWFza2VkX3BhdGhzIDE6IHRydWUiKQp9CmFsbG93X21hc2tlZF9wYXRocyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aHMgMjogc3RhcnQiKQoKICAgIG5vdCBwX29jaS5MaW51eC5NYXNrZWRQYXRocwogICAgbm90IGlfb2NpLkxpbnV4Lk1hc2tlZFBhdGhzCgogICAgcHJpbnQoImFsbG93X21hc2tlZF9wYXRocyAyOiB0cnVlIikKfQoKIyBBbGwgdGhlIHBvbGljeSBtYXNrZWQgcGF0aHMgbXVzdCBiZSBtYXNrZWQgaW4gdGhlIGlucHV0IGRhdGEgdG9vLgojIElucHV0IGlzIGFsbG93ZWQgdG8gaGF2ZSBtb3JlIG1hc2tlZCBwYXRocyB0aGFuIHRoZSBwb2xpY3kuCmFsbG93X21hc2tlZF9wYXRoc19hcnJheShwX2FycmF5LCBpX2FycmF5KSB7CiAgICBldmVyeSBwX2VsZW0gaW4gcF9hcnJheSB7CiAgICAgICAgYWxsb3dfbWFza2VkX3BhdGgocF9lbGVtLCBpX2FycmF5KQogICAgfQp9CgphbGxvd19tYXNrZWRfcGF0aChwX2VsZW0sIGlfYXJyYXkpIHsKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aDogcF9lbGVtID0iLCBwX2VsZW0pCgogICAgc29tZSBpX2VsZW0gaW4gaV9hcnJheQogICAgcF9lbGVtID09IGlfZWxlbQoKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aDogdHJ1ZSIpCn0KCmFsbG93X3JlYWRvbmx5X3BhdGhzKHBfb2NpLCBpX29jaSkgewogICAgcF9wYXRocyA6PSBwX29jaS5MaW51eC5SZWFkb25seVBhdGhzCiAgICBwcmludCgiYWxsb3dfcmVhZG9ubHlfcGF0aHMgMTogcF9wYXRocyA9IiwgcF9wYXRocykKCiAgICBpX3BhdGhzIDo9IGlfb2NpLkxpbnV4LlJlYWRvbmx5UGF0aHMKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAxOiBpX3BhdGhzID0iLCBpX3BhdGhzKQoKICAgIGFsbG93X3JlYWRvbmx5X3BhdGhzX2FycmF5KHBfcGF0aHMsIGlfcGF0aHMsIGlfb2NpLkxpbnV4Lk1hc2tlZFBhdGhzKQoKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAxOiB0cnVlIikKfQphbGxvd19yZWFkb25seV9wYXRocyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAyOiBzdGFydCIpCgogICAgbm90IHBfb2NpLkxpbnV4LlJlYWRvbmx5UGF0aHMKICAgIG5vdCBpX29jaS5MaW51eC5SZWFkb25seVBhdGhzCgogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGhzIDI6IHRydWUiKQp9CgojIEFsbCB0aGUgcG9saWN5IHJlYWRvbmx5IHBhdGhzIG11c3QgYmUgZWl0aGVyOgojIC0gUHJlc2VudCBpbiB0aGUgaW5wdXQgcmVhZG9ubHkgcGF0aHMsIG9yCiMgLSBQcmVzZW50IGluIHRoZSBpbnB1dCBtYXNrZWQgcGF0aHMuCiMgSW5wdXQgaXMgYWxsb3dlZCB0byBoYXZlIG1vcmUgcmVhZG9ubHkgcGF0aHMgdGhhbiB0aGUgcG9saWN5LgphbGxvd19yZWFkb25seV9wYXRoc19hcnJheShwX2FycmF5LCBpX2FycmF5LCBtYXNrZWRfcGF0aHMpIHsKICAgIGV2ZXJ5IHBfZWxlbSBpbiBwX2FycmF5IHsKICAgICAgICBhbGxvd19yZWFkb25seV9wYXRoKHBfZWxlbSwgaV9hcnJheSwgbWFza2VkX3BhdGhzKQogICAgfQp9CgphbGxvd19yZWFkb25seV9wYXRoKHBfZWxlbSwgaV9hcnJheSwgbWFza2VkX3BhdGhzKSB7CiAgICBwcmludCgiYWxsb3dfcmVhZG9ubHlfcGF0aCAxOiBwX2VsZW0gPSIsIHBfZWxlbSkKCiAgICBzb21lIGlfZWxlbSBpbiBpX2FycmF5CiAgICBwX2VsZW0gPT0gaV9lbGVtCgogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGggMTogdHJ1ZSIpCn0KYWxsb3dfcmVhZG9ubHlfcGF0aChwX2VsZW0sIGlfYXJyYXksIG1hc2tlZF9wYXRocykgewogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGggMjogcF9lbGVtID0iLCBwX2VsZW0pCgogICAgc29tZSBpX21hc2tlZCBpbiBtYXNrZWRfcGF0aHMKICAgIHBfZWxlbSA9PSBpX21hc2tlZAoKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRoIDI6IHRydWUiKQp9CgphbGxvd19saW51eF9kZXZpY2VzKHBfZGV2aWNlcywgaV9kZXZpY2VzKSB7CiAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogc3RhcnQiKQogICAgZXZlcnkgaV9kZXZpY2UgaW4gaV9kZXZpY2VzIHsKICAgICAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogaV9kZXZpY2UgPSIsIGlfZGV2aWNlKQogICAgICAgIHNvbWUgcF9kZXZpY2UgaW4gcF9kZXZpY2VzCiAgICAgICAgaV9kZXZpY2UuUGF0aCA9PSBwX2RldmljZS5QYXRoCiAgICB9CiAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogdHJ1ZSIpCn0KCmFsbG93X2xpbnV4X3N5c2N0bChwX2xpbnV4LCBpX2xpbnV4KSB7CiAgICBwcmludCgiYWxsb3dfbGludXhfc3lzY3RsIDE6IHN0YXJ0IikKICAgIG5vdCBpX2xpbnV4LlN5c2N0bAogICAgcHJpbnQoImFsbG93X2xpbnV4X3N5c2N0bCAxOiB0cnVlIikKfQoKYWxsb3dfbGludXhfc3lzY3RsKHBfbGludXgsIGlfbGludXgpIHsKICAgIHByaW50KCJhbGxvd19saW51eF9zeXNjdGwgMjogc3RhcnQiKQogICAgcF9zeXNjdGwgOj0gcF9saW51eC5TeXNjdGwKICAgIGlfc3lzY3RsIDo9IGlfbGludXguU3lzY3RsCiAgICBldmVyeSBpX25hbWUsIGlfdmFsIGluIGlfc3lzY3RsIHsKICAgICAgICBwcmludCgiYWxsb3dfbGludXhfc3lzY3RsIDI6IGlfbmFtZSA9IiwgaV9uYW1lLCAiaV92YWwgPSIsIGlfdmFsKQogICAgICAgIHBfc3lzY3RsW2lfbmFtZV0gPT0gaV92YWwKICAgIH0KICAgIHByaW50KCJhbGxvd19saW51eF9zeXNjdGwgMjogdHJ1ZSIpCn0KCiMgQ2hlY2sgdGhlIGNvbnNpc3RlbmN5IG9mIHRoZSBpbnB1dCAiaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5idW5kbGVfcGF0aCIKIyBhbmQgaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCIgdmFsdWVzIHdpdGggb3RoZXIgZmllbGRzLgphbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZChwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpIHsKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogc3RhcnQiKQoKICAgIGJ1bmRsZV9wYXRoIDo9IGlfb2NpLkFubm90YXRpb25zWyJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmJ1bmRsZV9wYXRoIl0KICAgIGJ1bmRsZV9pZCA6PSByZXBsYWNlKGJ1bmRsZV9wYXRoLCAiL3J1bi9jb250YWluZXJkL2lvLmNvbnRhaW5lcmQucnVudGltZS52Mi50YXNrL2s4cy5pby8iLCAiIikKCiAgICBidW5kbGVfaWRfZm9ybWF0IDo9IGNvbmNhdCgiIiwgWyJeIiwgQlVORExFX0lELCAiJCJdKQogICAgcmVnZXgubWF0Y2goYnVuZGxlX2lkX2Zvcm1hdCwgYnVuZGxlX2lkKQoKICAgIGtleSA6PSAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCIKCiAgICBwX3JlZ2V4IDo9IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIHNhbmRib3hfaWQgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQoKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogc2FuZGJveF9pZCA9Iiwgc2FuZGJveF9pZCwgInJlZ2V4ID0iLCBwX3JlZ2V4KQogICAgcmVnZXgubWF0Y2gocF9yZWdleCwgc2FuZGJveF9pZCkKCiAgICBhbGxvd19yb290X3BhdGgocF9vY2ksIGlfb2NpLCBidW5kbGVfaWQpCgogICAgZXZlcnkgaV9tb3VudCBpbiBpX29jaS5Nb3VudHMgewogICAgICAgIGFsbG93X21vdW50KHBfb2NpLCBpX21vdW50LCBpX3N0b3JhZ2VzLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpCiAgICB9CgogICAgYWxsb3dfc3RvcmFnZXMocF9zdG9yYWdlcywgaV9zdG9yYWdlcywgYnVuZGxlX2lkLCBzYW5kYm94X2lkKQoKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogdHJ1ZSIpCn0KCmFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHBfcHJvY2VzcyA9IiwgcF9wcm9jZXNzKQogICAgcHJpbnQoImFsbG93X3Byb2Nlc3NfY29tbW9uOiBpX3Byb2Nlc3MgPSAiLCBpX3Byb2Nlc3MpCiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHNfbmFtZSA9Iiwgc19uYW1lKQoKICAgIHBfcHJvY2Vzcy5Dd2QgPT0gaV9wcm9jZXNzLkN3ZAogICAgcF9wcm9jZXNzLk5vTmV3UHJpdmlsZWdlcyA9PSBpX3Byb2Nlc3MuTm9OZXdQcml2aWxlZ2VzCgogICAgYWxsb3dfdXNlcihwX3Byb2Nlc3MsIGlfcHJvY2VzcykKICAgIGFsbG93X2VudihwX3Byb2Nlc3MsIGlfcHJvY2Vzcywgc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHRydWUiKQp9CgojIENvbXBhcmUgdGhlIE9DSSBQcm9jZXNzIGZpZWxkIG9mIGEgcG9saWN5IGNvbnRhaW5lciB3aXRoIHRoZSBpbnB1dCBPQ0kgUHJvY2VzcyBmcm9tIGEgQ3JlYXRlQ29udGFpbmVyUmVxdWVzdAphbGxvd19wcm9jZXNzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfcHJvY2Vzczogc3RhcnQiKQoKICAgIGFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgYWxsb3dfY2FwcyhwX3Byb2Nlc3MuQ2FwYWJpbGl0aWVzLCBpX3Byb2Nlc3MuQ2FwYWJpbGl0aWVzKQogICAgcF9wcm9jZXNzLlRlcm1pbmFsID09IGlfcHJvY2Vzcy5UZXJtaW5hbAoKICAgIHByaW50KCJhbGxvd19wcm9jZXNzOiB0cnVlIikKfQoKIyBDb21wYXJlIHRoZSBPQ0kgUHJvY2VzcyBmaWVsZCBvZiBhIHBvbGljeSBjb250YWluZXIgd2l0aCB0aGUgaW5wdXQgcHJvY2VzcyBmaWVsZCBmcm9tIEV4ZWNQcm9jZXNzUmVxdWVzdAphbGxvd19pbnRlcmFjdGl2ZV9wcm9jZXNzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfaW50ZXJhY3RpdmVfcHJvY2Vzczogc3RhcnQiKQoKICAgIGFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgYWxsb3dfZXhlY19jYXBzKGlfcHJvY2Vzcy5DYXBhYmlsaXRpZXMpCgogICAgIyBUaGVzZSBhcmUgY29tbWFuZHMgZW5hYmxlZCB1c2luZyBFeGVjUHJvY2Vzc1JlcXVlc3QgY29tbWFuZHMgYW5kL29yIHJlZ2V4IGZyb20gdGhlIHNldHRpbmdzIGZpbGUuCiAgICAjIFRoZXkgY2FuIGJlIGV4ZWN1dGVkIGludGVyYWN0aXZlbHkgc28gYWxsb3cgdGhlbSB0byB1c2UgYW55IHZhbHVlIGZvciBpX3Byb2Nlc3MuVGVybWluYWwuCgogICAgcHJpbnQoImFsbG93X2ludGVyYWN0aXZlX3Byb2Nlc3M6IHRydWUiKQp9CgojIENvbXBhcmUgdGhlIE9DSSBQcm9jZXNzIGZpZWxkIG9mIGEgcG9saWN5IGNvbnRhaW5lciB3aXRoIHRoZSBpbnB1dCBwcm9jZXNzIGZpZWxkIGZyb20gRXhlY1Byb2Nlc3NSZXF1ZXN0CmFsbG93X3Byb2JlX3Byb2Nlc3MocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19wcm9iZV9wcm9jZXNzOiBzdGFydCIpCgogICAgYWxsb3dfcHJvY2Vzc19jb21tb24ocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpCiAgICBhbGxvd19leGVjX2NhcHMoaV9wcm9jZXNzLkNhcGFiaWxpdGllcykKICAgIHBfcHJvY2Vzcy5UZXJtaW5hbCA9PSBpX3Byb2Nlc3MuVGVybWluYWwKCiAgICBwcmludCgiYWxsb3dfcHJvYmVfcHJvY2VzczogdHJ1ZSIpCn0KCmFsbG93X3VzZXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MpIHsKICAgIHBfdXNlciA6PSBwX3Byb2Nlc3MuVXNlcgogICAgaV91c2VyIDo9IGlfcHJvY2Vzcy5Vc2VyCgogICAgcHJpbnQoImFsbG93X3VzZXI6IGlucHV0IHVpZCA9IiwgaV91c2VyLlVJRCwgInBvbGljeSB1aWQgPSIsIHBfdXNlci5VSUQpCiAgICBwX3VzZXIuVUlEID09IGlfdXNlci5VSUQKCiAgICAjIFRPRE86IHRyYWNrIGRvd24gdGhlIHJlYXNvbiBmb3IgcmVnaXN0cnkuazhzLmlvL3BhdXNlOjMuOSBiZWluZwogICAgIyAgICAgICBleGVjdXRlZCB3aXRoIGdpZCA9IDAgZGVzcGl0ZSBoYXZpbmcgIjY1NTM1OjY1NTM1IiBpbiBpdHMgY29udGFpbmVyIGltYWdlCiAgICAjICAgICAgIGNvbmZpZy4KICAgICNwcmludCgiYWxsb3dfdXNlcjogaW5wdXQgZ2lkID0iLCBpX3VzZXIuR0lELCAicG9saWN5IGdpZCA9IiwgcF91c2VyLkdJRCkKICAgICNwX3VzZXIuR0lEID09IGlfdXNlci5HSUQKCiAgICAjIFRPRE86IGNvbXBhcmUgdGhlIGFkZGl0aW9uYWxHaWRzIGZpZWxkIHRvbyBhZnRlciBjb21wdXRpbmcgaXRzIHZhbHVlCiAgICAjIGJhc2VkIG9uIC9ldGMvcGFzc3dkIGFuZCAvZXRjL2dyb3VwIGZyb20gdGhlIGNvbnRhaW5lciBpbWFnZS4KfQoKYWxsb3dfZGVwcmVjYXRlZF9hcmdzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZ3MgMTogbm8gYXJncyIpCgogICAgbm90IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJncwogICAgbm90IGlfcHJvY2Vzcy5BcmdzCgogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAxOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZ3MocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSkgewogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiBwb2xpY3kgYXJncyA9IiwgcF9wcm9jZXNzLkRlcHJlY2F0ZWRBcmdzKQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiBpbnB1dCBhcmdzID0iLCBpX3Byb2Nlc3MuQXJncykKCiAgICBjb3VudChwX3Byb2Nlc3MuRGVwcmVjYXRlZEFyZ3MpID09IGNvdW50KGlfcHJvY2Vzcy5BcmdzKQoKICAgIGV2ZXJ5IGksIGlfYXJnIGluIGlfcHJvY2Vzcy5BcmdzIHsKICAgICAgICBhbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpCiAgICB9CgogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDE6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgcF9hcmcyIDo9IHJlcGxhY2UocF9hcmcsICIkJCIsICIkIikKICAgIHBfYXJnMiA9PSBpX2FyZwoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAxOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDI6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgIyBUT0RPOiBjYW4gJChub2RlLW5hbWUpIGJlIGhhbmRsZWQgYmV0dGVyPwogICAgY29udGFpbnMocF9hcmcsICIkKG5vZGUtbmFtZSkiKQoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAyOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDM6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgcF9hcmcyIDo9IHJlcGxhY2UocF9hcmcsICIkJCIsICIkIikKICAgIHBfYXJnMyA6PSByZXBsYWNlKHBfYXJnMiwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAzOiBwX2FyZzMgPSIsIHBfYXJnMykKICAgIHBfYXJnMyA9PSBpX2FyZwoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAzOiB0cnVlIikKfQoKIyBPQ0kgcHJvY2Vzcy5FbnYgZmllbGQKYWxsb3dfZW52KHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfZW52OiBwIGVudiA9IiwgcF9wcm9jZXNzLkVudikKICAgIHByaW50KCJhbGxvd19lbnY6IGkgZW52ID0iLCBpX3Byb2Nlc3MuRW52KQoKICAgIGV2ZXJ5IGlfdmFyIGluIGlfcHJvY2Vzcy5FbnYgewogICAgICAgIHByaW50KCJhbGxvd19lbnY6IGlfdmFyID0iLCBpX3ZhcikKICAgICAgICBhbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgfQoKICAgIHByaW50KCJhbGxvd19lbnY6IHRydWUiKQp9CgojIEFsbG93IGlucHV0IGVudiB2YXJpYWJsZXMgdGhhdCBhcmUgcHJlc2VudCBpbiB0aGUgcG9saWN5IGRhdGEgdG9vLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHBfdmFyID09IGlfdmFyCiAgICBwcmludCgiYWxsb3dfdmFyIDE6IHRydWUiKQp9CgojIE1hdGNoIGlucHV0IHdpdGggb25lIG9mIHRoZSBwb2xpY3kgdmFyaWFibGVzLCBhZnRlciBzdWJzdGl0dXRpbmcgJChzYW5kYm94LW5hbWUpLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHByaW50KCJhbGxvd192YXIgMjogcF92YXIgPSIsIHBfdmFyKQoKICAgIHBfdmFyX3NwbGl0IDo9IHNwbGl0KHBfdmFyLCAiPSIpCiAgICBjb3VudChwX3Zhcl9zcGxpdCkgPT0gMgoKICAgIHBfdmFyX3NwbGl0WzFdID09ICIkKHNhbmRib3gtbmFtZSkiCgogICAgaV92YXJfc3BsaXQgOj0gc3BsaXQoaV92YXIsICI9IikKICAgIGNvdW50KGlfdmFyX3NwbGl0KSA9PSAyCgogICAgaV92YXJfc3BsaXRbMF0gPT0gcF92YXJfc3BsaXRbMF0KICAgIHJlZ2V4Lm1hdGNoKHNfbmFtZSwgaV92YXJfc3BsaXRbMV0pCgogICAgcHJpbnQoImFsbG93X3ZhciAyOiB0cnVlIikKfQoKIyBBbGxvdyBpbnB1dCBlbnYgdmFyaWFibGVzIHRoYXQgbWF0Y2ggd2l0aCBhIHJlcXVlc3RfZGVmYXVsdHMgcmVnZXguCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHNvbWUgcF9yZWdleDEgaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5DcmVhdGVDb250YWluZXJSZXF1ZXN0LmFsbG93X2Vudl9yZWdleAogICAgcF9yZWdleDIgOj0gcmVwbGFjZShwX3JlZ2V4MSwgIiQoaXB2NF9hKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcHY0X2EpCiAgICBwX3JlZ2V4MyA6PSByZXBsYWNlKHBfcmVnZXgyLCAiJChpcF9wKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcF9wKQogICAgcF9yZWdleDQgOj0gcmVwbGFjZShwX3JlZ2V4MywgIiQoc3ZjX25hbWUpIiwgcG9saWN5X2RhdGEuY29tbW9uLnN2Y19uYW1lKQogICAgcF9yZWdleDUgOj0gcmVwbGFjZShwX3JlZ2V4NCwgIiQoZG5zX2xhYmVsKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5kbnNfbGFiZWwpCgogICAgcHJpbnQoImFsbG93X3ZhciAzOiBwX3JlZ2V4NSA9IiwgcF9yZWdleDUpCiAgICByZWdleC5tYXRjaChwX3JlZ2V4NSwgaV92YXIpCgogICAgcHJpbnQoImFsbG93X3ZhciAzOiB0cnVlIikKfQoKIyBBbGxvdyBmaWVsZFJlZiAiZmllbGRQYXRoOiBzdGF0dXMucG9kSVAiIHZhbHVlcy4KYWxsb3dfdmFyKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBpX3Zhciwgc19uYW1lLCBzX25hbWVzcGFjZSkgewogICAgbmFtZV92YWx1ZSA6PSBzcGxpdChpX3ZhciwgIj0iKQogICAgY291bnQobmFtZV92YWx1ZSkgPT0gMgogICAgaXNfaXAobmFtZV92YWx1ZVsxXSkKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIGFsbG93X3BvZF9pcF92YXIobmFtZV92YWx1ZVswXSwgcF92YXIpCgogICAgcHJpbnQoImFsbG93X3ZhciA0OiB0cnVlIikKfQoKIyBBbGxvdyBjb21tb24gZmllbGRSZWYgdmFyaWFibGVzLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBuYW1lX3ZhbHVlIDo9IHNwbGl0KGlfdmFyLCAiPSIpCiAgICBjb3VudChuYW1lX3ZhbHVlKSA9PSAyCgogICAgc29tZSBwX3ZhciBpbiBwX3Byb2Nlc3MuRW52CiAgICBwX25hbWVfdmFsdWUgOj0gc3BsaXQocF92YXIsICI9IikKICAgIGNvdW50KHBfbmFtZV92YWx1ZSkgPT0gMgoKICAgIHBfbmFtZV92YWx1ZVswXSA9PSBuYW1lX3ZhbHVlWzBdCgogICAgIyBUT0RPOiBzaG91bGQgdGhlc2UgYmUgaGFuZGxlZCBpbiBhIGRpZmZlcmVudCB3YXk/CiAgICBhbHdheXNfYWxsb3dlZCA6PSBbIiQoaG9zdC1uYW1lKSIsICIkKG5vZGUtbmFtZSkiLCAiJChwb2QtdWlkKSJdCiAgICBzb21lIGFsbG93ZWQgaW4gYWx3YXlzX2FsbG93ZWQKICAgIGNvbnRhaW5zKHBfbmFtZV92YWx1ZVsxXSwgYWxsb3dlZCkKCiAgICBwcmludCgiYWxsb3dfdmFyIDU6IHRydWUiKQp9CgojIEFsbG93IGZpZWxkUmVmICJmaWVsZFBhdGg6IHN0YXR1cy5ob3N0SVAiIHZhbHVlcy4KYWxsb3dfdmFyKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBpX3Zhciwgc19uYW1lLCBzX25hbWVzcGFjZSkgewogICAgbmFtZV92YWx1ZSA6PSBzcGxpdChpX3ZhciwgIj0iKQogICAgY291bnQobmFtZV92YWx1ZSkgPT0gMgogICAgaXNfaXAobmFtZV92YWx1ZVsxXSkKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIGFsbG93X2hvc3RfaXBfdmFyKG5hbWVfdmFsdWVbMF0sIHBfdmFyKQoKICAgIHByaW50KCJhbGxvd192YXIgNjogdHJ1ZSIpCn0KCiMgQWxsb3cgcmVzb3VyY2VGaWVsZFJlZiB2YWx1ZXMgKGUuZy4sICJsaW1pdHMuY3B1IikuCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIG5hbWVfdmFsdWUgOj0gc3BsaXQoaV92YXIsICI9IikKICAgIGNvdW50KG5hbWVfdmFsdWUpID09IDIKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHBfbmFtZV92YWx1ZSA6PSBzcGxpdChwX3ZhciwgIj0iKQogICAgY291bnQocF9uYW1lX3ZhbHVlKSA9PSAyCgogICAgcF9uYW1lX3ZhbHVlWzBdID09IG5hbWVfdmFsdWVbMF0KCiAgICAjIGEgdmFyaWFibGUgd2Ugc2hvdWxkIGJlIHZhbGlkYXRpbmcgdXNpbmcgYSByZWdleCBmcm9tIHNldHRpbmdzCiAgICBwX25hbWVfdmFsdWVbMV0gPT0gIiQodmFsaWRhdGUtZnJvbS1zZXR0aW5ncykiCgogICAgcmVnZXhfdmFsIDo9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuQ3JlYXRlQ29udGFpbmVyUmVxdWVzdC5hbGxvd19lbnZfcmVnZXhfbWFwW25hbWVfdmFsdWVbMF1dCgogICAgcHJpbnQoImFsbG93X3ZhciA3OiB2YWwgPSIsIG5hbWVfdmFsdWVbMV0pCiAgICBwcmludCgiYWxsb3dfdmFyIDc6IHJlZ2V4X3ZhbCA9IiwgcmVnZXhfdmFsKQoKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4X3ZhbCwgbmFtZV92YWx1ZVsxXSkKCiAgICBwcmludCgiYWxsb3dfdmFyIDc6IHRydWUiKQp9CgojIE1hdGNoIGlucHV0IHdpdGggb25lIG9mIHRoZSBwb2xpY3kgdmFyaWFibGVzLCBhZnRlciBzdWJzdGl0dXRpbmcgJChzYW5kYm94LW5hbWVzcGFjZSkuCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHNvbWUgcF92YXIgaW4gcF9wcm9jZXNzLkVudgogICAgcF92YXIyIDo9IHJlcGxhY2UocF92YXIsICIkKHNhbmRib3gtbmFtZXNwYWNlKSIsIHNfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd192YXIgODogcF92YXIyID0iLCBwX3ZhcjIpCiAgICBwX3ZhcjIgPT0gaV92YXIKCiAgICBwcmludCgiYWxsb3dfdmFyIDg6IHRydWUiKQp9CgphbGxvd19wb2RfaXBfdmFyKHZhcl9uYW1lLCBwX3ZhcikgewogICAgcHJpbnQoImFsbG93X3BvZF9pcF92YXI6IHZhcl9uYW1lID0iLCB2YXJfbmFtZSwgInBfdmFyID0iLCBwX3ZhcikKCiAgICBwX25hbWVfdmFsdWUgOj0gc3BsaXQocF92YXIsICI9IikKICAgIGNvdW50KHBfbmFtZV92YWx1ZSkgPT0gMgoKICAgIHBfbmFtZV92YWx1ZVswXSA9PSB2YXJfbmFtZQogICAgcF9uYW1lX3ZhbHVlWzFdID09ICIkKHBvZC1pcCkiCgogICAgcHJpbnQoImFsbG93X3BvZF9pcF92YXI6IHRydWUiKQp9CgphbGxvd19ob3N0X2lwX3Zhcih2YXJfbmFtZSwgcF92YXIpIHsKICAgIHByaW50KCJhbGxvd19ob3N0X2lwX3ZhcjogdmFyX25hbWUgPSIsIHZhcl9uYW1lLCAicF92YXIgPSIsIHBfdmFyKQoKICAgIHBfbmFtZV92YWx1ZSA6PSBzcGxpdChwX3ZhciwgIj0iKQogICAgY291bnQocF9uYW1lX3ZhbHVlKSA9PSAyCgogICAgcF9uYW1lX3ZhbHVlWzBdID09IHZhcl9uYW1lCiAgICBwX25hbWVfdmFsdWVbMV0gPT0gIiQoaG9zdC1pcCkiCgogICAgcHJpbnQoImFsbG93X2hvc3RfaXBfdmFyOiB0cnVlIikKfQoKaXNfaXAodmFsdWUpIHsKICAgIGJ5dGVzID0gc3BsaXQodmFsdWUsICIuIikKICAgIGNvdW50KGJ5dGVzKSA9PSA0CgogICAgaXNfaXBfZmlyc3RfYnl0ZShieXRlc1swXSkKICAgIGlzX2lwX290aGVyX2J5dGUoYnl0ZXNbMV0pCiAgICBpc19pcF9vdGhlcl9ieXRlKGJ5dGVzWzJdKQogICAgaXNfaXBfb3RoZXJfYnl0ZShieXRlc1szXSkKfQppc19pcF9maXJzdF9ieXRlKGNvbXBvbmVudCkgewogICAgbnVtYmVyID0gdG9fbnVtYmVyKGNvbXBvbmVudCkKICAgIG51bWJlciA+PSAxCiAgICBudW1iZXIgPD0gMjU1Cn0KaXNfaXBfb3RoZXJfYnl0ZShjb21wb25lbnQpIHsKICAgIG51bWJlciA9IHRvX251bWJlcihjb21wb25lbnQpCiAgICBudW1iZXIgPj0gMAogICAgbnVtYmVyIDw9IDI1NQp9CgojIE9DSSByb290LlBhdGgKYWxsb3dfcm9vdF9wYXRoKHBfb2NpLCBpX29jaSwgYnVuZGxlX2lkKSB7CiAgICBpX3BhdGggOj0gaV9vY2kuUm9vdC5QYXRoCiAgICBwX3BhdGgxIDo9IHBfb2NpLlJvb3QuUGF0aAogICAgcHJpbnQoImFsbG93X3Jvb3RfcGF0aDogaV9wYXRoID0iLCBpX3BhdGgsICJwX3BhdGgxID0iLCBwX3BhdGgxKQoKICAgIHBfcGF0aDIgOj0gcmVwbGFjZShwX3BhdGgxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfcm9vdF9wYXRoOiBwX3BhdGgyID0iLCBwX3BhdGgyKQoKICAgIHBfcGF0aDMgOj0gcmVwbGFjZShwX3BhdGgyLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X3Jvb3RfcGF0aDogcF9wYXRoMyA9IiwgcF9wYXRoMykKCiAgICBwX3BhdGgzID09IGlfcGF0aAoKICAgIHByaW50KCJhbGxvd19yb290X3BhdGg6IHRydWUiKQp9CgojIGRldmljZSBtb3VudHMKYWxsb3dfbW91bnQocF9vY2ksIGlfbW91bnQsIGlfc3RvcmFnZXMsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcHJpbnQoImFsbG93X21vdW50OiBpX21vdW50ID0iLCBpX21vdW50KQoKICAgIHNvbWUgcF9tb3VudCBpbiBwX29jaS5Nb3VudHMKICAgIHNvbWUgaV9zdG9yYWdlIGluIGlfc3RvcmFnZXMKCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IHBfbW91bnQgPSIsIHBfbW91bnQpCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IGlfc3RvcmFnZSA9IiwgaV9zdG9yYWdlKQoKICAgIGNoZWNrX21vdW50KHBfbW91bnQsIGlfbW91bnQsIGlfc3RvcmFnZSwgYnVuZGxlX2lkLCBzYW5kYm94X2lkKQoKICAgICMgVE9ETzogYXJlIHRoZXJlIGFueSBvdGhlciByZXF1aXJlZCBwb2xpY3kgY2hlY2tzIGZvciBtb3VudHMgLSBlLmcuLAogICAgIyAgICAgICBtdWx0aXBsZSBtb3VudHMgd2l0aCBzYW1lIHNvdXJjZSBvciBkZXN0aW5hdGlvbj8KCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IHRydWUiKQp9CgpjaGVja19tb3VudChwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcF9tb3VudCA9PSBpX21vdW50CiAgICBwcmludCgiY2hlY2tfbW91bnQgMTogdHJ1ZSIpCn0KY2hlY2tfbW91bnQocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHBfbW91bnQuZGVzdGluYXRpb24gPT0gaV9tb3VudC5kZXN0aW5hdGlvbgogICAgcF9tb3VudC50eXBlXyA9PSBpX21vdW50LnR5cGVfCiAgICBwX21vdW50Lm9wdGlvbnMgPT0gaV9tb3VudC5vcHRpb25zCgogICAgbW91bnRfc291cmNlX2FsbG93cyhwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkKCiAgICBwcmludCgiY2hlY2tfbW91bnQgMjogdHJ1ZSIpCn0KCm1vdW50X3NvdXJjZV9hbGxvd3MocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHJlZ2V4MSA6PSBwX21vdW50LnNvdXJjZQogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5tb3VudF9zb3VyY2VfY3BhdGgpCiAgICByZWdleDQgOj0gcmVwbGFjZShyZWdleDMsICIkKGJ1bmRsZS1pZCkiLCBidW5kbGVfaWQpCgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMTogcmVnZXg0ID0iLCByZWdleDQpCiAgICByZWdleC5tYXRjaChyZWdleDQsIGlfbW91bnQuc291cmNlKQoKICAgIHByaW50KCJtb3VudF9zb3VyY2VfYWxsb3dzIDE6IHRydWUiKQp9Cm1vdW50X3NvdXJjZV9hbGxvd3MocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHJlZ2V4MSA6PSBwX21vdW50LnNvdXJjZQogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5tb3VudF9zb3VyY2VfY3BhdGgpCiAgICByZWdleDQgOj0gcmVwbGFjZShyZWdleDMsICIkKHNhbmRib3gtaWQpIiwgc2FuZGJveF9pZCkKCiAgICBwcmludCgibW91bnRfc291cmNlX2FsbG93cyAyOiByZWdleDQgPSIsIHJlZ2V4NCkKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4NCwgaV9tb3VudC5zb3VyY2UpCgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMjogdHJ1ZSIpCn0KbW91bnRfc291cmNlX2FsbG93cyhwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogaV9tb3VudC5zb3VyY2UgPSIsIGlfbW91bnQuc291cmNlKQogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogaV9zdG9yYWdlLm1vdW50X3BvaW50ID0iLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCgogICAgaV9tb3VudC5zb3VyY2UgPT0gaV9zdG9yYWdlLm1vdW50X3BvaW50CgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogdHJ1ZSIpCn0KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBDcmVhdGUgY29udGFpbmVyIFN0b3JhZ2VzCgphbGxvd19zdG9yYWdlcyhwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHBfY291bnQgOj0gY291bnQocF9zdG9yYWdlcykKICAgIGlfY291bnQgOj0gY291bnQoaV9zdG9yYWdlcykKICAgIHByaW50KCJhbGxvd19zdG9yYWdlczogcF9jb3VudCA9IiwgcF9jb3VudCwgImlfY291bnQgPSIsIGlfY291bnQpCgogICAgcF9jb3VudCA9PSBpX2NvdW50CgogICAgIyBHZXQgdGhlIGNvbnRhaW5lciBpbWFnZSBsYXllciBJRHMgYW5kIHZlcml0eSByb290IGhhc2hlcywgZnJvbSB0aGUgIm92ZXJsYXlmcyIgc3RvcmFnZS4KICAgIHNvbWUgb3ZlcmxheV9zdG9yYWdlIGluIHBfc3RvcmFnZXMKICAgIG92ZXJsYXlfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIHByaW50KCJhbGxvd19zdG9yYWdlczogb3ZlcmxheV9zdG9yYWdlID0iLCBvdmVybGF5X3N0b3JhZ2UpCiAgICBjb3VudChvdmVybGF5X3N0b3JhZ2Uub3B0aW9ucykgPT0gMgoKICAgIGxheWVyX2lkcyA6PSBzcGxpdChvdmVybGF5X3N0b3JhZ2Uub3B0aW9uc1swXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiBsYXllcl9pZHMgPSIsIGxheWVyX2lkcykKCiAgICByb290X2hhc2hlcyA6PSBzcGxpdChvdmVybGF5X3N0b3JhZ2Uub3B0aW9uc1sxXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiByb290X2hhc2hlcyA9Iiwgcm9vdF9oYXNoZXMpCgogICAgZXZlcnkgaV9zdG9yYWdlIGluIGlfc3RvcmFnZXMgewogICAgICAgIGFsbG93X3N0b3JhZ2UocF9zdG9yYWdlcywgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpCiAgICB9CgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiB0cnVlIikKfQoKYWxsb3dfc3RvcmFnZShwX3N0b3JhZ2VzLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgc29tZSBwX3N0b3JhZ2UgaW4gcF9zdG9yYWdlcwoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiBwX3N0b3JhZ2UgPSIsIHBfc3RvcmFnZSkKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiBpX3N0b3JhZ2UgPSIsIGlfc3RvcmFnZSkKCiAgICBwX3N0b3JhZ2UuZHJpdmVyICAgICAgICAgICA9PSBpX3N0b3JhZ2UuZHJpdmVyCiAgICBwX3N0b3JhZ2UuZHJpdmVyX29wdGlvbnMgICA9PSBpX3N0b3JhZ2UuZHJpdmVyX29wdGlvbnMKICAgIHBfc3RvcmFnZS5mc19ncm91cCAgICAgICAgID09IGlfc3RvcmFnZS5mc19ncm91cAogICAgcF9zdG9yYWdlLmZzdHlwZSAgICAgICAgICAgPT0gaV9zdG9yYWdlLmZzdHlwZQoKICAgIGFsbG93X3N0b3JhZ2Vfc291cmNlKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKQogICAgYWxsb3dfc3RvcmFnZV9vcHRpb25zKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKQogICAgYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKQoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiB0cnVlIikKfQoKYWxsb3dfc3RvcmFnZV9zb3VyY2UocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX3NvdXJjZSAxOiBzdGFydCIpCgogICAgcF9zdG9yYWdlLnNvdXJjZSA9PSBpX3N0b3JhZ2Uuc291cmNlCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDE6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX3NvdXJjZShwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDI6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCgogICAgIyBEREREOkJCOkRELkY6IERvbWFpbjpCdXM6RGV2aWNlLkZ1bmN0aW9uCiAgICAjIGh0dHBzOi8vd3d3Lmtlcm5lbC5vcmcvZG9jL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtYnVzLXBjaQogICAgcmVnZXgubWF0Y2goYF5bYS1mMC05XXs0fTpbYS1mMC05XXsyfTpbYS1mMC05XXsyfVwuW2EtZjAtOV0kYCwgaV9zdG9yYWdlLnNvdXJjZSkKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9zb3VyY2UgMjogdHJ1ZSIpCn0KCmFsbG93X3N0b3JhZ2Vfc291cmNlKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKSB7CiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9zb3VyY2UgMzogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIGlfc3RvcmFnZS5zb3VyY2UgPT0gIm5vbmUiCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDM6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX3NvdXJjZShwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDQ6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJzbWIiCgogICAgIyBQYXR0ZXJuOiAvLzxzdG9yYWdlLWFjY291bnQtbmFtZT4uZmlsZS5jb3JlLndpbmRvd3MubmV0LzxrOHMtUFZDLW5hbWU+CiAgICAjIFN0b3JhZ2UgYWNjb3VudCBuYW1lOiBodHRwczovL2xlYXJuLm1pY3Jvc29mdC5jb20vZW4tdXMvYXp1cmUvc3RvcmFnZS9jb21tb24vc3RvcmFnZS1hY2NvdW50LW92ZXJ2aWV3I3N0b3JhZ2UtYWNjb3VudC1uYW1lCiAgICAjIEs4cyBQVkMgbmFtZTogaHR0cHM6Ly9rdWJlcm5ldGVzLmlvL2RvY3MvY29uY2VwdHMvb3ZlcnZpZXcvd29ya2luZy13aXRoLW9iamVjdHMvbmFtZXMvI2Rucy1zdWJkb21haW4tbmFtZXMKICAgIHJlZ2V4Lm1hdGNoKGBeXC9cLyhbYS16MC05XXszLDI0fSlcLmZpbGVcLmNvcmVcLndpbmRvd3NcLm5ldFwvW2EtejAtOV0oW2EtejAtOS4tXXswLDI1MX1bYS16MC05XSk/JGAsIGlfc3RvcmFnZS5zb3VyY2UpCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDQ6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMTogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgIT0gIm92ZXJsYXlmcyIKICAgIHBfc3RvcmFnZS5vcHRpb25zID09IGlfc3RvcmFnZS5vcHRpb25zCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAxOiB0cnVlIikKfQphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIGNvdW50KHBfc3RvcmFnZS5vcHRpb25zKSA9PSAyCgogICAgcG9saWN5X2lkcyA6PSBzcGxpdChwX3N0b3JhZ2Uub3B0aW9uc1swXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBwb2xpY3lfaWRzID0iLCBwb2xpY3lfaWRzKQogICAgcG9saWN5X2lkcyA9PSBsYXllcl9pZHMKCiAgICBwb2xpY3lfaGFzaGVzIDo9IHNwbGl0KHBfc3RvcmFnZS5vcHRpb25zWzFdLCAiOiIpCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IHBvbGljeV9oYXNoZXMgPSIsIHBvbGljeV9oYXNoZXMpCgogICAgcF9jb3VudCA6PSBjb3VudChwb2xpY3lfaWRzKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBwX2NvdW50ID0iLCBwX2NvdW50KQogICAgcF9jb3VudCA+PSAxCiAgICBwX2NvdW50ID09IGNvdW50KHBvbGljeV9oYXNoZXMpCgogICAgaV9jb3VudCA6PSBjb3VudChpX3N0b3JhZ2Uub3B0aW9ucykKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogaV9jb3VudCA9IiwgaV9jb3VudCkKICAgIGlfY291bnQgPT0gcF9jb3VudCArIDMKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zWzBdID0iLCBpX3N0b3JhZ2Uub3B0aW9uc1swXSkKICAgIGlfc3RvcmFnZS5vcHRpb25zWzBdID09ICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQubGF5ZXItc3JjLXByZWZpeD0vdmFyL2xpYi9jb250YWluZXJkL2lvLmNvbnRhaW5lcmQuc25hcHNob3R0ZXIudjEudGFyZGV2L2xheWVycyIKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zW2lfY291bnQgLSAyXSA9IiwgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDJdKQogICAgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDJdID09ICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQub3ZlcmxheS1ydyIKCiAgICBsb3dlcmRpciA6PSBjb25jYXQoIj0iLCBbImxvd2VyZGlyIiwgcF9zdG9yYWdlLm9wdGlvbnNbMF1dKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBsb3dlcmRpciA9IiwgbG93ZXJkaXIpCgogICAgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDFdID09IGxvd2VyZGlyCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zW2lfY291bnQgLSAxXSA9IiwgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDFdKQoKICAgIGV2ZXJ5IGksIHBvbGljeV9pZCBpbiBwb2xpY3lfaWRzIHsKICAgICAgICBhbGxvd19vdmVybGF5X2xheWVyKHBvbGljeV9pZCwgcG9saWN5X2hhc2hlc1tpXSwgaV9zdG9yYWdlLm9wdGlvbnNbaSArIDFdKQogICAgfQoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogdHJ1ZSIpCn0KYWxsb3dfc3RvcmFnZV9vcHRpb25zKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKSB7CiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDM6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCiAgICBjb3VudChwX3N0b3JhZ2Uub3B0aW9ucykgPT0gMQoKICAgIHN0YXJ0c3dpdGgocF9zdG9yYWdlLm9wdGlvbnNbMF0sICIkKGhhc2giKQogICAgaGFzaF9zdWZmaXggOj0gdHJpbV9sZWZ0KHBfc3RvcmFnZS5vcHRpb25zWzBdLCAiJChoYXNoIikKCiAgICBlbmRzd2l0aChoYXNoX3N1ZmZpeCwgIikiKQogICAgaGFzaF9pbmRleCA6PSB0cmltX3JpZ2h0KGhhc2hfc3VmZml4LCAiKSIpCiAgICBpIDo9IHRvX251bWJlcihoYXNoX2luZGV4KQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAzOiBpID0iLCBpKQoKICAgIGhhc2hfb3B0aW9uIDo9IGNvbmNhdCgiPSIsIFsiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LnJvb3QtaGFzaCIsIHJvb3RfaGFzaGVzW2ldXSkKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMzogaGFzaF9vcHRpb24gPSIsIGhhc2hfb3B0aW9uKQoKICAgIGNvdW50KGlfc3RvcmFnZS5vcHRpb25zKSA9PSA0CiAgICBpX3N0b3JhZ2Uub3B0aW9uc1swXSA9PSAicm8iCiAgICBpX3N0b3JhZ2Uub3B0aW9uc1sxXSA9PSAiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmJsb2NrX2RldmljZT1maWxlIgogICAgaV9zdG9yYWdlLm9wdGlvbnNbMl0gPT0gImlvLmthdGFjb250YWluZXJzLmZzLW9wdC5pcy1sYXllciIKICAgIGlfc3RvcmFnZS5vcHRpb25zWzNdID09IGhhc2hfb3B0aW9uCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAzOiB0cnVlIikKfQphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgNDogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gInNtYiIKICAgIHBfb3B0c19jb3VudCA6PSBjb3VudChwX3N0b3JhZ2Uub3B0aW9ucykKICAgIGlfb3B0c19jb3VudCA6PSBjb3VudChpX3N0b3JhZ2Uub3B0aW9ucykKICAgIGlfb3B0c19jb3VudCA9PSBwX29wdHNfY291bnQgKyAyCgogICAgaV9vcHRfbWF0Y2hlcyA6PSBbaSB8IGkgOj0gaWR4OyBpZHggPCBwX29wdHNfY291bnQ7IHBfc3RvcmFnZS5vcHRpb25zW2lkeF0gPT0gaV9zdG9yYWdlLm9wdGlvbnNbaWR4XV0KICAgIGNvdW50KGlfb3B0X21hdGNoZXMpID09IHBfb3B0c19jb3VudAoKICAgIHN0YXJ0c3dpdGgoaV9zdG9yYWdlLm9wdGlvbnNbaV9vcHRzX2NvdW50LTJdLCAiYWRkcj0iKQogICAgY3JlZHMgPSBzcGxpdChpX3N0b3JhZ2Uub3B0aW9uc1tpX29wdHNfY291bnQtMV0sICIsIikKICAgIGNvdW50KGNyZWRzKSA9PSAyCiAgICBzdGFydHN3aXRoKGNyZWRzWzBdLCAidXNlcm5hbWU9IikKICAgIHN0YXJ0c3dpdGgoY3JlZHNbMV0sICJwYXNzd29yZD0iKQogICAgCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDQ6IHRydWUiKQp9CgphbGxvd19vdmVybGF5X2xheWVyKHBvbGljeV9pZCwgcG9saWN5X2hhc2gsIGlfb3B0aW9uKSB7CiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogcG9saWN5X2lkID0iLCBwb2xpY3lfaWQsICJwb2xpY3lfaGFzaCA9IiwgcG9saWN5X2hhc2gpCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogaV9vcHRpb24gPSIsIGlfb3B0aW9uKQoKICAgIHN0YXJ0c3dpdGgoaV9vcHRpb24sICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQubGF5ZXI9IikKICAgIGlfdmFsdWUgOj0gcmVwbGFjZShpX29wdGlvbiwgImlvLmthdGFjb250YWluZXJzLmZzLW9wdC5sYXllcj0iLCAiIikKICAgIGlfdmFsdWVfZGVjb2RlZCA6PSBiYXNlNjQuZGVjb2RlKGlfdmFsdWUpCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogaV92YWx1ZV9kZWNvZGVkID0iLCBpX3ZhbHVlX2RlY29kZWQpCgogICAgcG9saWN5X3N1ZmZpeCA6PSBjb25jYXQoIj0iLCBbInRhcixybyxpby5rYXRhY29udGFpbmVycy5mcy1vcHQuYmxvY2tfZGV2aWNlPWZpbGUsaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmlzLWxheWVyLGlvLmthdGFjb250YWluZXJzLmZzLW9wdC5yb290LWhhc2giLCBwb2xpY3lfaGFzaF0pCiAgICBwX3ZhbHVlIDo9IGNvbmNhdCgiLCIsIFtwb2xpY3lfaWQsIHBvbGljeV9zdWZmaXhdKQogICAgcHJpbnQoImFsbG93X292ZXJsYXlfbGF5ZXI6IHBfdmFsdWUgPSIsIHBfdmFsdWUpCgogICAgcF92YWx1ZSA9PSBpX3ZhbHVlX2RlY29kZWQKCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogdHJ1ZSIpCn0KCmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAidGFyIgoKICAgIHN0YXJ0c3dpdGgocF9zdG9yYWdlLm1vdW50X3BvaW50LCAiJChsYXllciIpCiAgICBtb3VudF9zdWZmaXggOj0gdHJpbV9sZWZ0KHBfc3RvcmFnZS5tb3VudF9wb2ludCwgIiQobGF5ZXIiKQoKICAgIGVuZHN3aXRoKG1vdW50X3N1ZmZpeCwgIikiKQogICAgbGF5ZXJfaW5kZXggOj0gdHJpbV9yaWdodChtb3VudF9zdWZmaXgsICIpIikKICAgIGkgOj0gdG9fbnVtYmVyKGxheWVyX2luZGV4KQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDE6IGkgPSIsIGkpCgogICAgbGF5ZXJfaWQgOj0gbGF5ZXJfaWRzW2ldCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMTogbGF5ZXJfaWQgPSIsIGxheWVyX2lkKQoKICAgIHBfbW91bnQgOj0gY29uY2F0KCIvIiwgWyIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L2xheWVycyIsIGxheWVyX2lkXSkKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCAxOiBwX21vdW50ID0iLCBwX21vdW50KQoKICAgIHBfbW91bnQgPT0gaV9zdG9yYWdlLm1vdW50X3BvaW50CgogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDE6IHRydWUiKQp9CmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAiZnVzZTMua2F0YS1vdmVybGF5IgoKICAgIG1vdW50MSA6PSByZXBsYWNlKHBfc3RvcmFnZS5tb3VudF9wb2ludCwgIiQoY3BhdGgpIiwgcG9saWN5X2RhdGEuY29tbW9uLmNwYXRoKQogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDI6IG1vdW50MiA9IiwgbW91bnQyKQoKICAgIG1vdW50MiA9PSBpX3N0b3JhZ2UubW91bnRfcG9pbnQKCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMjogdHJ1ZSIpCn0KYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKSB7CiAgICBwX3N0b3JhZ2UuZnN0eXBlID09ICJsb2NhbCIKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQyID0iLCBtb3VudDIpCgogICAgbW91bnQzIDo9IHJlcGxhY2UobW91bnQyLCAiJChzYW5kYm94LWlkKSIsIHNhbmRib3hfaWQpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQzID0iLCBtb3VudDMpCgogICAgcmVnZXgubWF0Y2gobW91bnQzLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCgogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDM6IHRydWUiKQp9CmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAiYmluZCIKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNDogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNDogbW91bnQyID0iLCBtb3VudDIpCgogICAgbW91bnQzIDo9IHJlcGxhY2UobW91bnQyLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDQ6IG1vdW50MyA9IiwgbW91bnQzKQoKICAgIHJlZ2V4Lm1hdGNoKG1vdW50MywgaV9zdG9yYWdlLm1vdW50X3BvaW50KQoKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA0OiB0cnVlIikKfQphbGxvd19tb3VudF9wb2ludChwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgYnVuZGxlX2lkLCBzYW5kYm94X2lkLCBsYXllcl9pZHMpIHsKICAgIHBfc3RvcmFnZS5mc3R5cGUgPT0gInRtcGZzIgoKICAgIG1vdW50MSA6PSBwX3N0b3JhZ2UubW91bnRfcG9pbnQKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA1OiBtb3VudDEgPSIsIG1vdW50MSkKCiAgICByZWdleC5tYXRjaChtb3VudDEsIGlfc3RvcmFnZS5tb3VudF9wb2ludCkKCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNTogdHJ1ZSIpCn0KYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKSB7CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogaV9zdG9yYWdlLm1vdW50X3BvaW50ID0iLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCiAgICBhbGxvd19kaXJlY3Rfdm9sX2RyaXZlcihwX3N0b3JhZ2UsIGlfc3RvcmFnZSkKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChzcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQyID0iLCBtb3VudDIpCgogICAgZGlyZWN0X3ZvbF9wYXRoIDo9IGlfc3RvcmFnZS5zb3VyY2UKICAgIG1vdW50MyA6PSByZXBsYWNlKG1vdW50MiwgIiQoYjY0LWRpcmVjdC12b2wtcGF0aCkiLCBiYXNlNjR1cmwuZW5jb2RlKGRpcmVjdF92b2xfcGF0aCkpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQzID0iLCBtb3VudDMpCgogICAgbW91bnQzID09IGlfc3RvcmFnZS5tb3VudF9wb2ludAoKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA2OiB0cnVlIikKfQoKYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIocF9zdG9yYWdlLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19kaXJlY3Rfdm9sX2RyaXZlciAxOiBzdGFydCIpCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCiAgICBwcmludCgiYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIgMTogdHJ1ZSIpCn0KYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIocF9zdG9yYWdlLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19kaXJlY3Rfdm9sX2RyaXZlciAyOiBzdGFydCIpCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJzbWIiCiAgICBwcmludCgiYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIgMjogdHJ1ZSIpCn0KCiMgRXhlY1Byb2Nlc3NSZXF1ZXN0LnByb2Nlc3MuQ2FwYWJpbGl0aWVzCmFsbG93X2V4ZWNfY2FwcyhpX2NhcHMpIHsKICAgIG5vdCBpX2NhcHMuQW1iaWVudAogICAgbm90IGlfY2Fwcy5Cb3VuZGluZwogICAgbm90IGlfY2Fwcy5FZmZlY3RpdmUKICAgIG5vdCBpX2NhcHMuSW5oZXJpdGFibGUKICAgIG5vdCBpX2NhcHMuUGVybWl0dGVkCn0KCiMgT0NJLlByb2Nlc3MuQ2FwYWJpbGl0aWVzCmFsbG93X2NhcHMocF9jYXBzLCBpX2NhcHMpIHsKICAgIHByaW50KCJhbGxvd19jYXBzOiBwb2xpY3kgQW1iaWVudCA9IiwgcF9jYXBzLkFtYmllbnQpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgQW1iaWVudCA9IiwgaV9jYXBzLkFtYmllbnQpCiAgICBtYXRjaF9jYXBzKHBfY2Fwcy5BbWJpZW50LCBpX2NhcHMuQW1iaWVudCkKCiAgICBwcmludCgiYWxsb3dfY2FwczogcG9saWN5IEJvdW5kaW5nID0iLCBwX2NhcHMuQm91bmRpbmcpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgQm91bmRpbmcgPSIsIGlfY2Fwcy5Cb3VuZGluZykKICAgIG1hdGNoX2NhcHMocF9jYXBzLkJvdW5kaW5nLCBpX2NhcHMuQm91bmRpbmcpCgogICAgcHJpbnQoImFsbG93X2NhcHM6IHBvbGljeSBFZmZlY3RpdmUgPSIsIHBfY2Fwcy5FZmZlY3RpdmUpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgRWZmZWN0aXZlID0iLCBpX2NhcHMuRWZmZWN0aXZlKQogICAgbWF0Y2hfY2FwcyhwX2NhcHMuRWZmZWN0aXZlLCBpX2NhcHMuRWZmZWN0aXZlKQoKICAgIHByaW50KCJhbGxvd19jYXBzOiBwb2xpY3kgSW5oZXJpdGFibGUgPSIsIHBfY2Fwcy5Jbmhlcml0YWJsZSkKICAgIHByaW50KCJhbGxvd19jYXBzOiBpbnB1dCBJbmhlcml0YWJsZSA9IiwgaV9jYXBzLkluaGVyaXRhYmxlKQogICAgbWF0Y2hfY2FwcyhwX2NhcHMuSW5oZXJpdGFibGUsIGlfY2Fwcy5Jbmhlcml0YWJsZSkKCiAgICBwcmludCgiYWxsb3dfY2FwczogcG9saWN5IFBlcm1pdHRlZCA9IiwgcF9jYXBzLlBlcm1pdHRlZCkKICAgIHByaW50KCJhbGxvd19jYXBzOiBpbnB1dCBQZXJtaXR0ZWQgPSIsIGlfY2Fwcy5QZXJtaXR0ZWQpCiAgICBtYXRjaF9jYXBzKHBfY2Fwcy5QZXJtaXR0ZWQsIGlfY2Fwcy5QZXJtaXR0ZWQpCn0KCm1hdGNoX2NhcHMocF9jYXBzLCBpX2NhcHMpIHsKICAgIHByaW50KCJtYXRjaF9jYXBzIDE6IHN0YXJ0IikKCiAgICBwX2NhcHMgPT0gaV9jYXBzCgogICAgcHJpbnQoIm1hdGNoX2NhcHMgMTogdHJ1ZSIpCn0KbWF0Y2hfY2FwcyhwX2NhcHMsIGlfY2FwcykgewogICAgcHJpbnQoIm1hdGNoX2NhcHMgMjogc3RhcnQiKQoKICAgIGNvdW50KHBfY2FwcykgPT0gMQogICAgcF9jYXBzWzBdID09ICIkKGRlZmF1bHRfY2FwcykiCgogICAgcHJpbnQoIm1hdGNoX2NhcHMgMjogZGVmYXVsdF9jYXBzID0iLCBwb2xpY3lfZGF0YS5jb21tb24uZGVmYXVsdF9jYXBzKQogICAgcG9saWN5X2RhdGEuY29tbW9uLmRlZmF1bHRfY2FwcyA9PSBpX2NhcHMKCiAgICBwcmludCgibWF0Y2hfY2FwcyAyOiB0cnVlIikKfQptYXRjaF9jYXBzKHBfY2FwcywgaV9jYXBzKSB7CiAgICBwcmludCgibWF0Y2hfY2FwcyAzOiBzdGFydCIpCgogICAgY291bnQocF9jYXBzKSA9PSAxCiAgICBwX2NhcHNbMF0gPT0gIiQocHJpdmlsZWdlZF9jYXBzKSIKCiAgICBwcmludCgibWF0Y2hfY2FwcyAzOiBwcml2aWxlZ2VkX2NhcHMgPSIsIHBvbGljeV9kYXRhLmNvbW1vbi5wcml2aWxlZ2VkX2NhcHMpCiAgICBwb2xpY3lfZGF0YS5jb21tb24ucHJpdmlsZWdlZF9jYXBzID09IGlfY2FwcwoKICAgIHByaW50KCJtYXRjaF9jYXBzIDM6IHRydWUiKQp9CgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgpjaGVja19kaXJlY3RvcnlfdHJhdmVyc2FsKGlfcGF0aCkgewogICAgbm90IHJlZ2V4Lm1hdGNoKCIoXnwvKS4uKCR8LykiLCBpX3BhdGgpCn0KCmNoZWNrX3N5bWxpbmtfc291cmNlKGlfc3JjKSB7CiAgICBpX3NyYyA9PSAiIgogICAgcHJpbnQoImNoZWNrX3N5bWxpbmtfc291cmNlIDE6IHRydWUiKQp9CmNoZWNrX3N5bWxpbmtfc291cmNlKGlfc3JjKSB7CiAgICBpX3NyYyAhPSAiIgogICAgcHJpbnQoImNoZWNrX3N5bWxpbmtfc291cmNlIDI6IGlfc3JjID0iLCBpX3NyYykKCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24uc19zb3VyY2UxLCBpX3NyYykKCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMjogdHJ1ZSIpCn0KY2hlY2tfc3ltbGlua19zb3VyY2UoaV9zcmMpIHsKICAgIGlfc3JjICE9ICIiCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMzogaV9zcmMgPSIsIGlfc3JjKQoKICAgIHJlZ2V4Lm1hdGNoKHBvbGljeV9kYXRhLmNvbW1vbi5zX3NvdXJjZTIsIGlfc3JjKQogICAgY2hlY2tfZGlyZWN0b3J5X3RyYXZlcnNhbChpX3NyYykKCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMzogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfc3RvcmFnZXMoaV9zdG9yYWdlcykgewogICAgcHJpbnQoImFsbG93X3NhbmRib3hfc3RvcmFnZXM6IGlfc3RvcmFnZXMgPSIsIGlfc3RvcmFnZXMpCgogICAgcF9zdG9yYWdlcyA6PSBwb2xpY3lfZGF0YS5zYW5kYm94LnN0b3JhZ2VzCiAgICBldmVyeSBpX3N0b3JhZ2UgaW4gaV9zdG9yYWdlcyB7CiAgICAgICAgYWxsb3dfc2FuZGJveF9zdG9yYWdlKHBfc3RvcmFnZXMsIGlfc3RvcmFnZSkKICAgIH0KCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9zdG9yYWdlczogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfc3RvcmFnZShwX3N0b3JhZ2VzLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IGlfc3RvcmFnZSA9IiwgaV9zdG9yYWdlKQoKICAgIHNvbWUgcF9zdG9yYWdlIGluIHBfc3RvcmFnZXMKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IHBfc3RvcmFnZSA9IiwgcF9zdG9yYWdlKQogICAgaV9zdG9yYWdlID09IHBfc3RvcmFnZQoKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IHRydWUiKQp9CgpDb3B5RmlsZVJlcXVlc3QgewogICAgcHJpbnQoIkNvcHlGaWxlUmVxdWVzdDogaW5wdXQucGF0aCA9IiwgaW5wdXQucGF0aCkKCiAgICBjaGVja19zeW1saW5rX3NvdXJjZShpbnB1dC5zeW1saW5rX3NyYykKICAgIGNoZWNrX2RpcmVjdG9yeV90cmF2ZXJzYWwoaW5wdXQucGF0aCkKCiAgICBzb21lIHJlZ2V4MSBpbiBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLkNvcHlGaWxlUmVxdWVzdAogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5jcGF0aCkKICAgIHJlZ2V4NCA6PSByZXBsYWNlKHJlZ2V4MywgIiQoYnVuZGxlLWlkKSIsIEJVTkRMRV9JRCkKICAgIHByaW50KCJDb3B5RmlsZVJlcXVlc3Q6IHJlZ2V4NCA9IiwgcmVnZXg0KQoKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4NCwgaW5wdXQucGF0aCkKCiAgICBwcmludCgiQ29weUZpbGVSZXF1ZXN0OiB0cnVlIikKfQoKQ3JlYXRlU2FuZGJveFJlcXVlc3QgewogICAgcHJpbnQoIkNyZWF0ZVNhbmRib3hSZXF1ZXN0OiBpbnB1dC5ndWVzdF9ob29rX3BhdGggPSIsIGlucHV0Lmd1ZXN0X2hvb2tfcGF0aCkKICAgIGNvdW50KGlucHV0Lmd1ZXN0X2hvb2tfcGF0aCkgPT0gMAoKICAgIHByaW50KCJDcmVhdGVTYW5kYm94UmVxdWVzdDogaW5wdXQua2VybmVsX21vZHVsZXMgPSIsIGlucHV0Lmtlcm5lbF9tb2R1bGVzKQogICAgY291bnQoaW5wdXQua2VybmVsX21vZHVsZXMpID09IDAKCiAgICBpX3BpZG5zIDo9IGlucHV0LnNhbmRib3hfcGlkbnMKICAgIHByaW50KCJDcmVhdGVTYW5kYm94UmVxdWVzdDogaV9waWRucyA9IiwgaV9waWRucykKICAgIGlfcGlkbnMgPT0gZmFsc2UKICAgIGFsbG93X3NhbmRib3hfc3RvcmFnZXMoaW5wdXQuc3RvcmFnZXMpCn0KCmFsbG93X2V4ZWMocF9jb250YWluZXIsIGlfcHJvY2VzcykgewogICAgcHJpbnQoImFsbG93X2V4ZWM6IHN0YXJ0IikKCiAgICBwX29jaSA9IHBfY29udGFpbmVyLk9DSQogICAgcF9zX25hbWUgPSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc19uYW1lc3BhY2UgPSBnZXRfc3RhdGVfdmFsKCJuYW1lc3BhY2UiKQogICAgYWxsb3dfcHJvYmVfcHJvY2VzcyhwX29jaS5Qcm9jZXNzLCBpX3Byb2Nlc3MsIHBfc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfZXhlYzogdHJ1ZSIpCn0KCmFsbG93X2ludGVyYWN0aXZlX2V4ZWMocF9jb250YWluZXIsIGlfcHJvY2VzcykgewogICAgcHJpbnQoImFsbG93X2ludGVyYWN0aXZlX2V4ZWM6IHN0YXJ0IikKCiAgICBwX29jaSA9IHBfY29udGFpbmVyLk9DSQogICAgcF9zX25hbWUgPSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc19uYW1lc3BhY2UgPSBnZXRfc3RhdGVfdmFsKCJuYW1lc3BhY2UiKQogICAgYWxsb3dfaW50ZXJhY3RpdmVfcHJvY2VzcyhwX29jaS5Qcm9jZXNzLCBpX3Byb2Nlc3MsIHBfc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfaW50ZXJhY3RpdmVfZXhlYzogdHJ1ZSIpCn0KCiMgVE9ETzogc2hvdWxkIG90aGVyIEV4ZWNQcm9jZXNzUmVxdWVzdCBpbnB1dCBkYXRhIGZpZWxkcyBiZSB2YWxpZGF0ZWQgYXMgd2VsbD8KRXhlY1Byb2Nlc3NSZXF1ZXN0IHsKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMTogaW5wdXQgPSIsIGlucHV0KQoKICAgIHNvbWUgcF9jb21tYW5kIGluIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuRXhlY1Byb2Nlc3NSZXF1ZXN0LmFsbG93ZWRfY29tbWFuZHMKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMTogcF9jb21tYW5kID0iLCBwX2NvbW1hbmQpCiAgICBwX2NvbW1hbmQgPT0gaW5wdXQucHJvY2Vzcy5BcmdzCgogICAgIyBUT0RPOiBtYXRjaCBwX2NvbnRhaW5lcidzIElEIHdpdGggdGhlIGlucHV0IGNvbnRhaW5lcl9pZC4KICAgIHNvbWUgcF9jb250YWluZXIgaW4gcG9saWN5X2RhdGEuY29udGFpbmVycwogICAgYWxsb3dfaW50ZXJhY3RpdmVfZXhlYyhwX2NvbnRhaW5lciwgaW5wdXQucHJvY2VzcykKCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDE6IHRydWUiKQp9CkV4ZWNQcm9jZXNzUmVxdWVzdCB7CiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDI6IGlucHV0ID0iLCBpbnB1dCkKCiAgICAjIFRPRE86IG1hdGNoIGlucHV0IGNvbnRhaW5lciBJRCB3aXRoIGl0cyBjb3JyZXNwb25kaW5nIGNvbnRhaW5lci5leGVjX2NvbW1hbmRzLgogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBzb21lIHBfY29tbWFuZCBpbiBwX2NvbnRhaW5lci5leGVjX2NvbW1hbmRzCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDI6IHBfY29tbWFuZCA9IiwgcF9jb21tYW5kKQoKICAgICMgVE9ETzogc2hvdWxkIG90aGVyIGlucHV0IGRhdGEgZmllbGRzIGJlIHZhbGlkYXRlZCBhcyB3ZWxsPwogICAgcF9jb21tYW5kID09IGlucHV0LnByb2Nlc3MuQXJncwoKICAgIGFsbG93X2V4ZWMocF9jb250YWluZXIsIGlucHV0LnByb2Nlc3MpCgogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAyOiB0cnVlIikKfQpFeGVjUHJvY2Vzc1JlcXVlc3QgewogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAzOiBpbnB1dCA9IiwgaW5wdXQpCgogICAgaV9jb21tYW5kID0gY29uY2F0KCIgIiwgaW5wdXQucHJvY2Vzcy5BcmdzKQogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAzOiBpX2NvbW1hbmQgPSIsIGlfY29tbWFuZCkKCiAgICBzb21lIHBfcmVnZXggaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5FeGVjUHJvY2Vzc1JlcXVlc3QucmVnZXgKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMzogcF9yZWdleCA9IiwgcF9yZWdleCkKCiAgICByZWdleC5tYXRjaChwX3JlZ2V4LCBpX2NvbW1hbmQpCgogICAgIyBUT0RPOiBtYXRjaCBwX2NvbnRhaW5lcidzIElEIHdpdGggdGhlIGlucHV0IGNvbnRhaW5lcl9pZC4KICAgIHNvbWUgcF9jb250YWluZXIgaW4gcG9saWN5X2RhdGEuY29udGFpbmVycwogICAgYWxsb3dfaW50ZXJhY3RpdmVfZXhlYyhwX2NvbnRhaW5lciwgaW5wdXQucHJvY2VzcykKCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDM6IHRydWUiKQp9CgpVcGRhdGVSb3V0ZXNSZXF1ZXN0IHsKICAgIHByaW50KCJVcGRhdGVSb3V0ZXNSZXF1ZXN0OiBpbnB1dCA9IiwgaW5wdXQpCiAgICBwcmludCgiVXBkYXRlUm91dGVzUmVxdWVzdDogcG9saWN5ID0iLCBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLlVwZGF0ZVJvdXRlc1JlcXVlc3QpCgogICAgaV9yb3V0ZXMgOj0gaW5wdXQucm91dGVzLlJvdXRlcwogICAgcF9zb3VyY2VfcmVnZXggPSBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLlVwZGF0ZVJvdXRlc1JlcXVlc3QuZm9yYmlkZGVuX3NvdXJjZV9yZWdleAogICAgcF9uYW1lcyA9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuVXBkYXRlUm91dGVzUmVxdWVzdC5mb3JiaWRkZW5fZGV2aWNlX25hbWVzCgogICAgZXZlcnkgaV9yb3V0ZSBpbiBpX3JvdXRlcyB7CiAgICAgICAgcHJpbnQoImlfcm91dGUuc291cmNlID0iLCBpX3JvdXRlLnNvdXJjZSkKICAgICAgICBldmVyeSBwX3JlZ2V4IGluIHBfc291cmNlX3JlZ2V4IHsKICAgICAgICAgICAgcHJpbnQoInBfcmVnZXggPSIsIHBfcmVnZXgpCiAgICAgICAgICAgIG5vdCByZWdleC5tYXRjaChwX3JlZ2V4LCBpX3JvdXRlLnNvdXJjZSkKICAgICAgICB9CgogICAgICAgIHByaW50KCJpX3JvdXRlLmRldmljZSA9IiwgaV9yb3V0ZS5kZXZpY2UpCiAgICAgICAgbm90IGlfcm91dGUuZGV2aWNlIGluIHBfbmFtZXMKICAgIH0KCiAgICBwcmludCgiVXBkYXRlUm91dGVzUmVxdWVzdDogdHJ1ZSIpCn0KClVwZGF0ZUludGVyZmFjZVJlcXVlc3QgewogICAgcHJpbnQoIlVwZGF0ZUludGVyZmFjZVJlcXVlc3Q6IGlucHV0ID0iLCBpbnB1dCkKICAgIHByaW50KCJVcGRhdGVJbnRlcmZhY2VSZXF1ZXN0OiBwb2xpY3kgPSIsIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuVXBkYXRlSW50ZXJmYWNlUmVxdWVzdCkKCiAgICBpX2ludGVyZmFjZSA6PSBpbnB1dC5pbnRlcmZhY2UKICAgIHBfZmxhZ3MgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmFsbG93X3Jhd19mbGFncwoKICAgICMgVHlwaWNhbGx5LCBqdXN0IElGRl9OT0FSUCBpcyB1c2VkLgogICAgYml0cy5hbmQoaV9pbnRlcmZhY2UucmF3X2ZsYWdzLCBiaXRzLm5lZ2F0ZShwX2ZsYWdzKSkgPT0gMAoKICAgIHBfbmFtZXMgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmZvcmJpZGRlbl9uYW1lcwoKICAgIG5vdCBpX2ludGVyZmFjZS5uYW1lIGluIHBfbmFtZXMKCiAgICBwX2h3YWRkcnMgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmZvcmJpZGRlbl9od19hZGRycwoKICAgIG5vdCBpX2ludGVyZmFjZS5od0FkZHIgaW4gcF9od2FkZHJzCgogICAgcHJpbnQoIlVwZGF0ZUludGVyZmFjZVJlcXVlc3Q6IHRydWUiKQp9CgpDbG9zZVN0ZGluUmVxdWVzdCB7CiAgICBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLkNsb3NlU3RkaW5SZXF1ZXN0ID09IHRydWUKfQoKUmVhZFN0cmVhbVJlcXVlc3QgewogICAgcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5SZWFkU3RyZWFtUmVxdWVzdCA9PSB0cnVlCn0KClVwZGF0ZUVwaGVtZXJhbE1vdW50c1JlcXVlc3QgewogICAgcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVFcGhlbWVyYWxNb3VudHNSZXF1ZXN0ID09IHRydWUKfQoKV3JpdGVTdHJlYW1SZXF1ZXN0IHsKICAgIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuV3JpdGVTdHJlYW1SZXF1ZXN0ID09IHRydWUKfQoKcG9saWN5X2RhdGEgOj0gewogICJjb250YWluZXJzIjogWwogICAgewogICAgICAiT0NJIjogewogICAgICAgICJWZXJzaW9uIjogIjEuMS4wLXJjLjEiLAogICAgICAgICJQcm9jZXNzIjogewogICAgICAgICAgIlRlcm1pbmFsIjogZmFsc2UsCiAgICAgICAgICAiVXNlciI6IHsKICAgICAgICAgICAgIlVJRCI6IDY1NTM1LAogICAgICAgICAgICAiR0lEIjogNjU1MzUsCiAgICAgICAgICAgICJBZGRpdGlvbmFsR2lkcyI6IFtdLAogICAgICAgICAgICAiVXNlcm5hbWUiOiAiIgogICAgICAgICAgfSwKICAgICAgICAgICJEZXByZWNhdGVkQXJncyI6IFsKICAgICAgICAgICAgIi9wYXVzZSIKICAgICAgICAgIF0sCiAgICAgICAgICAiQXJncyI6IFsKICAgICAgICAgICAgIi9wYXVzZSIKICAgICAgICAgIF0sCiAgICAgICAgICAiRW52IjogWwogICAgICAgICAgICAiUEFUSD0vdXNyL2xvY2FsL3NiaW46L3Vzci9sb2NhbC9iaW46L3Vzci9zYmluOi91c3IvYmluOi9zYmluOi9iaW4iCiAgICAgICAgICBdLAogICAgICAgICAgIkN3ZCI6ICIvIiwKICAgICAgICAgICJDYXBhYmlsaXRpZXMiOiB7CiAgICAgICAgICAgICJBbWJpZW50IjogW10sCiAgICAgICAgICAgICJCb3VuZGluZyI6IFsKICAgICAgICAgICAgICAiJChkZWZhdWx0X2NhcHMpIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiRWZmZWN0aXZlIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJJbmhlcml0YWJsZSI6IFtdLAogICAgICAgICAgICAiUGVybWl0dGVkIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICAiTm9OZXdQcml2aWxlZ2VzIjogdHJ1ZQogICAgICAgIH0sCiAgICAgICAgIlJvb3QiOiB7CiAgICAgICAgICAiUGF0aCI6ICIkKGNwYXRoKS8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgIlJlYWRvbmx5IjogdHJ1ZQogICAgICAgIH0sCiAgICAgICAgIk1vdW50cyI6IFsKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9wcm9jIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJwcm9jIiwKICAgICAgICAgICAgInR5cGVfIjogInByb2MiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2IiwKICAgICAgICAgICAgInNvdXJjZSI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJzdHJpY3RhdGltZSIsCiAgICAgICAgICAgICAgIm1vZGU9NzU1IiwKICAgICAgICAgICAgICAic2l6ZT02NTUzNmsiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L3B0cyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiZGV2cHRzIiwKICAgICAgICAgICAgInR5cGVfIjogImRldnB0cyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJuZXdpbnN0YW5jZSIsCiAgICAgICAgICAgICAgInB0bXhtb2RlPTA2NjYiLAogICAgICAgICAgICAgICJtb2RlPTA2MjAiLAogICAgICAgICAgICAgICJnaWQ9NSIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvc2htIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L3NobSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi9tcXVldWUiLAogICAgICAgICAgICAic291cmNlIjogIm1xdWV1ZSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJtcXVldWUiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvc3lzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJzeXNmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJzeXNmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2V0Yy9yZXNvbHYuY29uZiIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClyZXNvbHYuY29uZiQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJvIiwKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9kZXYiLAogICAgICAgICAgICAgICJub2V4ZWMiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0KICAgICAgICBdLAogICAgICAgICJBbm5vdGF0aW9ucyI6IHsKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmJ1bmRsZV9wYXRoIjogIi9ydW4vY29udGFpbmVyZC9pby5jb250YWluZXJkLnJ1bnRpbWUudjIudGFzay9rOHMuaW8vJChidW5kbGUtaWQpIiwKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIjogInBvZF9zYW5kYm94IiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSI6ICJzYW5kYm94IiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWlkIjogIl5bYS16MC05XXs2NH0kIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWxvZy1kaXJlY3RvcnkiOiAiXi92YXIvbG9nL3BvZHMvJChzYW5kYm94LW5hbWVzcGFjZSlfJChzYW5kYm94LW5hbWUpX1swLTlhLWZdezh9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezEyfSQiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZXNwYWNlIjogIiIsCiAgICAgICAgICAibmVyZGN0bC9uZXR3b3JrLW5hbWVzcGFjZSI6ICJeL3Zhci9ydW4vbmV0bnMvY25pLVswLTlhLWZdezh9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezEyfSQiCiAgICAgICAgfSwKICAgICAgICAiTGludXgiOiB7CiAgICAgICAgICAiTmFtZXNwYWNlcyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICJUeXBlIjogImlwYyIsCiAgICAgICAgICAgICAgIlBhdGgiOiAiIgogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgIlR5cGUiOiAidXRzIiwKICAgICAgICAgICAgICAiUGF0aCI6ICIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiVHlwZSI6ICJtb3VudCIsCiAgICAgICAgICAgICAgIlBhdGgiOiAiIgogICAgICAgICAgICB9CiAgICAgICAgICBdLAogICAgICAgICAgIk1hc2tlZFBhdGhzIjogWwogICAgICAgICAgICAiL3Byb2MvYWNwaSIsCiAgICAgICAgICAgICIvcHJvYy9hc291bmQiLAogICAgICAgICAgICAiL3Byb2Mva2NvcmUiLAogICAgICAgICAgICAiL3Byb2Mva2V5cyIsCiAgICAgICAgICAgICIvcHJvYy9sYXRlbmN5X3N0YXRzIiwKICAgICAgICAgICAgIi9wcm9jL3RpbWVyX2xpc3QiLAogICAgICAgICAgICAiL3Byb2MvdGltZXJfc3RhdHMiLAogICAgICAgICAgICAiL3Byb2Mvc2NoZWRfZGVidWciLAogICAgICAgICAgICAiL3N5cy9maXJtd2FyZSIsCiAgICAgICAgICAgICIvcHJvYy9zY3NpIgogICAgICAgICAgXSwKICAgICAgICAgICJSZWFkb25seVBhdGhzIjogWwogICAgICAgICAgICAiL3Byb2MvYnVzIiwKICAgICAgICAgICAgIi9wcm9jL2ZzIiwKICAgICAgICAgICAgIi9wcm9jL2lycSIsCiAgICAgICAgICAgICIvcHJvYy9zeXMiLAogICAgICAgICAgICAiL3Byb2Mvc3lzcnEtdHJpZ2dlciIKICAgICAgICAgIF0sCiAgICAgICAgICAiRGV2aWNlcyI6IFtdLAogICAgICAgICAgIlN5c2N0bCI6IHsKICAgICAgICAgICAgIm5ldC5pcHY0LmlwX3VucHJpdmlsZWdlZF9wb3J0X3N0YXJ0IjogIjAiLAogICAgICAgICAgICAibmV0LmlwdjQucGluZ19ncm91cF9yYW5nZSI6ICIwIDIxNDc0ODM2NDciCiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9LAogICAgICAic3RvcmFnZXMiOiBbCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJibGsiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogInRhciIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIiQoaGFzaDApIgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGxheWVyMCkiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJvdmVybGF5ZnMiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogImZ1c2UzLmthdGEtb3ZlcmxheSIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIjVhNWFhZDgwMDU1ZmYyMDAxMmE1MGRjMjVmOGRmN2EyOTkyNDQ3NDMyNGQ2NWY3ZDUzMDZlZThlZTI3ZmY3MWQiLAogICAgICAgICAgICAiODE3MjUwZjFhM2UzMzZkYTc2ZjViZDNmYTc4NGUxYjI2ZDk1OWI5YzEzMTg3NjgxNWJhMjYwNDA0OGI3MGMxOCIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChjcGF0aCkvJChidW5kbGUtaWQpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9CiAgICAgIF0sCiAgICAgICJkZXZpY2VzIjogW10sCiAgICAgICJzYW5kYm94X3BpZG5zIjogZmFsc2UsCiAgICAgICJleGVjX2NvbW1hbmRzIjogW10sCiAgICAgICJlbnZfbWFwIjogewogICAgICAgICJQQVRIIjogIi91c3IvbG9jYWwvc2JpbjovdXNyL2xvY2FsL2JpbjovdXNyL3NiaW46L3Vzci9iaW46L3NiaW46L2JpbiIKICAgICAgfQogICAgfSwKICAgIHsKICAgICAgIk9DSSI6IHsKICAgICAgICAiVmVyc2lvbiI6ICIxLjEuMC1yYy4xIiwKICAgICAgICAiUHJvY2VzcyI6IHsKICAgICAgICAgICJUZXJtaW5hbCI6IGZhbHNlLAogICAgICAgICAgIlVzZXIiOiB7CiAgICAgICAgICAgICJVSUQiOiAwLAogICAgICAgICAgICAiR0lEIjogMCwKICAgICAgICAgICAgIkFkZGl0aW9uYWxHaWRzIjogW10sCiAgICAgICAgICAgICJVc2VybmFtZSI6ICIiCiAgICAgICAgICB9LAogICAgICAgICAgIkRlcHJlY2F0ZWRBcmdzIjogWwogICAgICAgICAgICAiL2Jpbi9zaCIsCiAgICAgICAgICAgICItYyIsCiAgICAgICAgICAgICJ3aGlsZSB0cnVlOyBkbyBlY2hvICQoc2FuZGJveC1uYW1lKTsgc2xlZXAgMTA7IGRvbmUiCiAgICAgICAgICBdLAogICAgICAgICAgIkFyZ3MiOiBbCiAgICAgICAgICAgICIvYmluL3NoIiwKICAgICAgICAgICAgIi1jIiwKICAgICAgICAgICAgIndoaWxlIHRydWU7IGRvIGVjaG8gJChNRVRBX05BTUUpOyBzbGVlcCAxMDsgZG9uZSIKICAgICAgICAgIF0sCiAgICAgICAgICAiRW52IjogWwogICAgICAgICAgICAiUEFUSD0vdXNyL2xvY2FsL3NiaW46L3Vzci9sb2NhbC9iaW46L3Vzci9zYmluOi91c3IvYmluOi9zYmluOi9iaW4iLAogICAgICAgICAgICAiSE9TVE5BTUU9JChob3N0LW5hbWUpIiwKICAgICAgICAgICAgIk1FVEFfTkFNRT0kKHNhbmRib3gtbmFtZSkiCiAgICAgICAgICBdLAogICAgICAgICAgIkN3ZCI6ICIvIiwKICAgICAgICAgICJDYXBhYmlsaXRpZXMiOiB7CiAgICAgICAgICAgICJBbWJpZW50IjogW10sCiAgICAgICAgICAgICJCb3VuZGluZyI6IFsKICAgICAgICAgICAgICAiJChkZWZhdWx0X2NhcHMpIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiRWZmZWN0aXZlIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJJbmhlcml0YWJsZSI6IFtdLAogICAgICAgICAgICAiUGVybWl0dGVkIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICAiTm9OZXdQcml2aWxlZ2VzIjogZmFsc2UKICAgICAgICB9LAogICAgICAgICJSb290IjogewogICAgICAgICAgIlBhdGgiOiAiJChjcGF0aCkvJChidW5kbGUtaWQpIiwKICAgICAgICAgICJSZWFkb25seSI6IGZhbHNlCiAgICAgICAgfSwKICAgICAgICAiTW91bnRzIjogWwogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL3Byb2MiLAogICAgICAgICAgICAic291cmNlIjogInByb2MiLAogICAgICAgICAgICAidHlwZV8iOiAicHJvYyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYiLAogICAgICAgICAgICAic291cmNlIjogInRtcGZzIiwKICAgICAgICAgICAgInR5cGVfIjogInRtcGZzIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgInN0cmljdGF0aW1lIiwKICAgICAgICAgICAgICAibW9kZT03NTUiLAogICAgICAgICAgICAgICJzaXplPTY1NTM2ayIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvcHRzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJkZXZwdHMiLAogICAgICAgICAgICAidHlwZV8iOiAiZGV2cHRzIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAgICAgIm5ld2luc3RhbmNlIiwKICAgICAgICAgICAgICAicHRteG1vZGU9MDY2NiIsCiAgICAgICAgICAgICAgIm1vZGU9MDYyMCIsCiAgICAgICAgICAgICAgImdpZD01IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi9zaG0iLAogICAgICAgICAgICAic291cmNlIjogIi9ydW4va2F0YS1jb250YWluZXJzL3NhbmRib3gvc2htIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L21xdWV1ZSIsCiAgICAgICAgICAgICJzb3VyY2UiOiAibXF1ZXVlIiwKICAgICAgICAgICAgInR5cGVfIjogIm1xdWV1ZSIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9zeXMiLAogICAgICAgICAgICAic291cmNlIjogInN5c2ZzIiwKICAgICAgICAgICAgInR5cGVfIjogInN5c2ZzIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAgICAgIm5vZGV2IiwKICAgICAgICAgICAgICAicm8iCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvc3lzL2ZzL2Nncm91cCIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiY2dyb3VwIiwKICAgICAgICAgICAgInR5cGVfIjogImNncm91cCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIsCiAgICAgICAgICAgICAgInJlbGF0aW1lIiwKICAgICAgICAgICAgICAicm8iCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZXRjL2hvc3RzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KWhvc3RzJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJydyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvdGVybWluYXRpb24tbG9nIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KXRlcm1pbmF0aW9uLWxvZyQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicnciCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZXRjL2hvc3RuYW1lIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KWhvc3RuYW1lJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJydyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9ldGMvcmVzb2x2LmNvbmYiLAogICAgICAgICAgICAic291cmNlIjogIiQoc2ZwcmVmaXgpcmVzb2x2LmNvbmYkIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJ3IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL3Zhci9ydW4vc2VjcmV0cy9rdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50IiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KXNlcnZpY2VhY2NvdW50JCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJybyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi92YXIvcnVuL3NlY3JldHMvYXp1cmUvdG9rZW5zIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KXRva2VucyQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicm8iCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvdXNyL3NoYXJlL25naW54L2h0bWwiLAogICAgICAgICAgICAic291cmNlIjogIiQoc2ZwcmVmaXgpaHRtbCQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicnciCiAgICAgICAgICAgIF0KICAgICAgICAgIH0KICAgICAgICBdLAogICAgICAgICJBbm5vdGF0aW9ucyI6IHsKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmJ1bmRsZV9wYXRoIjogIi9ydW4vY29udGFpbmVyZC9pby5jb250YWluZXJkLnJ1bnRpbWUudjIudGFzay9rOHMuaW8vJChidW5kbGUtaWQpIiwKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIjogInBvZF9jb250YWluZXIiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLmNvbnRhaW5lci1uYW1lIjogIm5naW54MiIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLXR5cGUiOiAiY29udGFpbmVyIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5pbWFnZS1uYW1lIjogIm1hcmluZXJjb25mcG9kc3Rlc3QuYXp1cmVjci5pby9henVyZWxpbnV4L2Jhc2Uvbmdpbng6MS4yNSIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCI6ICJeW2EtejAtOV17NjR9JCIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1uYW1lc3BhY2UiOiAiIgogICAgICAgIH0sCiAgICAgICAgIkxpbnV4IjogewogICAgICAgICAgIk5hbWVzcGFjZXMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiVHlwZSI6ICJpcGMiLAogICAgICAgICAgICAgICJQYXRoIjogIiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJUeXBlIjogInV0cyIsCiAgICAgICAgICAgICAgIlBhdGgiOiAiIgogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgIlR5cGUiOiAibW91bnQiLAogICAgICAgICAgICAgICJQYXRoIjogIiIKICAgICAgICAgICAgfQogICAgICAgICAgXSwKICAgICAgICAgICJNYXNrZWRQYXRocyI6IFsKICAgICAgICAgICAgIi9wcm9jL2FjcGkiLAogICAgICAgICAgICAiL3Byb2Mva2NvcmUiLAogICAgICAgICAgICAiL3Byb2Mva2V5cyIsCiAgICAgICAgICAgICIvcHJvYy9sYXRlbmN5X3N0YXRzIiwKICAgICAgICAgICAgIi9wcm9jL3RpbWVyX2xpc3QiLAogICAgICAgICAgICAiL3Byb2MvdGltZXJfc3RhdHMiLAogICAgICAgICAgICAiL3Byb2Mvc2NoZWRfZGVidWciLAogICAgICAgICAgICAiL3Byb2Mvc2NzaSIsCiAgICAgICAgICAgICIvc3lzL2Zpcm13YXJlIgogICAgICAgICAgXSwKICAgICAgICAgICJSZWFkb25seVBhdGhzIjogWwogICAgICAgICAgICAiL3Byb2MvYXNvdW5kIiwKICAgICAgICAgICAgIi9wcm9jL2J1cyIsCiAgICAgICAgICAgICIvcHJvYy9mcyIsCiAgICAgICAgICAgICIvcHJvYy9pcnEiLAogICAgICAgICAgICAiL3Byb2Mvc3lzIiwKICAgICAgICAgICAgIi9wcm9jL3N5c3JxLXRyaWdnZXIiCiAgICAgICAgICBdLAogICAgICAgICAgIkRldmljZXMiOiBbXSwKICAgICAgICAgICJTeXNjdGwiOiB7CiAgICAgICAgICAgICJuZXQuaXB2NC5pcF91bnByaXZpbGVnZWRfcG9ydF9zdGFydCI6ICIwIiwKICAgICAgICAgICAgIm5ldC5pcHY0LnBpbmdfZ3JvdXBfcmFuZ2UiOiAiMCAyMTQ3NDgzNjQ3IgogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSwKICAgICAgInN0b3JhZ2VzIjogWwogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2gwKSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjApIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2gxKSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjEpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2gyKSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjIpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2gzKSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjMpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2g0KSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjQpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAib3ZlcmxheWZzIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJmdXNlMy5rYXRhLW92ZXJsYXkiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICI4YmZiYmE3Njk2NjM2NTI0MDRhNjRhMjNhN2VlYWI3OTQzOGRhZWQ3MWFjY2YzMjlhNDBhNGY2OGVmYWYwZmY0OjhjYzdhZmJjZGQwNGYxN2FmZjhmNmQ0OTM1ZTRmNTRhMWY1YWRkNDdkY2E1MTZlOGQzNTQ1M2YxZjQyMTgxNjc6OTAzMGU2MGFhOGQ4YWI5YzI3ZjA1MWUyYzc4NWE1NDlkOGFlYzE4ODgxNjk5ZWFiMzIwYTA0MDlmN2ZkYmUzOTozNmFmOWMwODE0NmU2ZDI1MWQ1MTNlNTllNWExYzYyZDYyY2ZiOWViZTg1NmQ3NTM5NGJlZmRkZWNlNzQ4NGMxOjAxNjVhMGMwNzg2NTc3NWRlYTgzYTQ1MTdjMTI1ZmYzMGMxZTJjMWEwOThlN2NiY2U3YmNhZmUyYjcxOTljYmMiLAogICAgICAgICAgICAiMjQ5ZWY1NWZjZDQxMWM1YTgwNTRhYmI2MGU3MTUxMTVkNTk5ZWJiZTY4MmQ2Yjc0YmUzYmQxOTI3MjQ4ODVjMTo1MDJiNTM3MjAxYzcxMTVlZjBkMTcxNTMwYzdjZjVjMGU1MTE3NTRlOWM5NWYwNTk0MWVjMjdkMTVjOWUwMTk4OjQ4YWExMThmZGZkYTlhMzAzODdlOTBlMDY2MWYyYjViNmM4ZTg3MzU0ZDFmYTlhMzdiZjU4NTEzYWMzZTQ1MTI6OWY2MjU0NjRjN2IzNGE1NTM2ZjQzMWY1ZDI5NDYzNDNkMjcyNTgwZTM2NDQ2ZGRiMTJiMDQwMTYyZTU0M2NlMTpkNDQ5MWVhMTg4NzEwNWVmMDYwMWY0ZTVmYTM5ODNmZmU1N2Q3YTU3ZWU4ZjZiMDM3MDkxZjQyMThjMWE2MzU4IgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGNwYXRoKS8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0KICAgICAgXSwKICAgICAgImRldmljZXMiOiBbXSwKICAgICAgInNhbmRib3hfcGlkbnMiOiB0cnVlLAogICAgICAiZXhlY19jb21tYW5kcyI6IFtdLAogICAgICAiZW52X21hcCI6IHsKICAgICAgICAiSE9TVE5BTUUiOiAiJChob3N0LW5hbWUpIiwKICAgICAgICAiTUVUQV9OQU1FIjogIiQoc2FuZGJveC1uYW1lKSIsCiAgICAgICAgIlBBVEgiOiAiL3Vzci9sb2NhbC9zYmluOi91c3IvbG9jYWwvYmluOi91c3Ivc2JpbjovdXNyL2Jpbjovc2JpbjovYmluIgogICAgICB9CiAgICB9CiAgXSwKICAiY29tbW9uIjogewogICAgImNwYXRoIjogIi9ydW4va2F0YS1jb250YWluZXJzL3NoYXJlZC9jb250YWluZXJzIiwKICAgICJtb3VudF9zb3VyY2VfY3BhdGgiOiAiL3J1bi9rYXRhLWNvbnRhaW5lcnMvc2hhcmVkL2NvbnRhaW5lcnMiLAogICAgInNmcHJlZml4IjogIl4kKGNwYXRoKS8kKGJ1bmRsZS1pZCktW2EtejAtOV17MTZ9LSIsCiAgICAic3BhdGgiOiAiL3J1bi9rYXRhLWNvbnRhaW5lcnMvc2FuZGJveC9zdG9yYWdlIiwKICAgICJpcHY0X2EiOiAiKChbMC05XXxbMS05XVswLTldfDFbMC05XXsyfXwyWzAtNF1bMC05XXwyNVswLTVdKVxcLil7M30oWzAtOV18WzEtOV1bMC05XXwxWzAtOV17Mn18MlswLTRdWzAtOV18MjVbMC01XSkiLAogICAgImlwX3AiOiAiWzAtOV17MSw1fSIsCiAgICAic3ZjX25hbWUiOiAiW0EtWl9cXC5cXC1dKyIsCiAgICAiZG5zX2xhYmVsIjogIlthLXpBLVowLTlfXFwuXFwtXSsiLAogICAgInNfc291cmNlMSI6ICJeLi4yWzAtOV17M31fWzAtMV1bMC05XV9bMC0zXVswLTldX1swLTJdWzAtOV1fWzAtNV1bMC05XV9bMC01XVswLTldXFwuWzAtOV17MSwxMH0kIiwKICAgICJzX3NvdXJjZTIiOiAiXi4uZGF0YS8iLAogICAgImRuc19zdWJkb21haW4iOiAiXlthLXowLTldKFstYS16MC05XSpbYS16MC05XSk/JCIsCiAgICAicG9kX3VpZCI6ICJeWzAtOWEtZkEtRl17OH0tWzAtOWEtZkEtRl17NH0tWzAtOWEtZkEtRl17NH0tWzAtOWEtZkEtRl17NH0tWzAtOWEtZkEtRl17MTJ9JCIsCiAgICAiZGVmYXVsdF9jYXBzIjogWwogICAgICAiQ0FQX0NIT1dOIiwKICAgICAgIkNBUF9EQUNfT1ZFUlJJREUiLAogICAgICAiQ0FQX0ZTRVRJRCIsCiAgICAgICJDQVBfRk9XTkVSIiwKICAgICAgIkNBUF9NS05PRCIsCiAgICAgICJDQVBfTkVUX1JBVyIsCiAgICAgICJDQVBfU0VUR0lEIiwKICAgICAgIkNBUF9TRVRVSUQiLAogICAgICAiQ0FQX1NFVEZDQVAiLAogICAgICAiQ0FQX1NFVFBDQVAiLAogICAgICAiQ0FQX05FVF9CSU5EX1NFUlZJQ0UiLAogICAgICAiQ0FQX1NZU19DSFJPT1QiLAogICAgICAiQ0FQX0tJTEwiLAogICAgICAiQ0FQX0FVRElUX1dSSVRFIgogICAgXSwKICAgICJwcml2aWxlZ2VkX2NhcHMiOiBbCiAgICAgICJDQVBfQ0hPV04iLAogICAgICAiQ0FQX0RBQ19PVkVSUklERSIsCiAgICAgICJDQVBfREFDX1JFQURfU0VBUkNIIiwKICAgICAgIkNBUF9GT1dORVIiLAogICAgICAiQ0FQX0ZTRVRJRCIsCiAgICAgICJDQVBfS0lMTCIsCiAgICAgICJDQVBfU0VUR0lEIiwKICAgICAgIkNBUF9TRVRVSUQiLAogICAgICAiQ0FQX1NFVFBDQVAiLAogICAgICAiQ0FQX0xJTlVYX0lNTVVUQUJMRSIsCiAgICAgICJDQVBfTkVUX0JJTkRfU0VSVklDRSIsCiAgICAgICJDQVBfTkVUX0JST0FEQ0FTVCIsCiAgICAgICJDQVBfTkVUX0FETUlOIiwKICAgICAgIkNBUF9ORVRfUkFXIiwKICAgICAgIkNBUF9JUENfTE9DSyIsCiAgICAgICJDQVBfSVBDX09XTkVSIiwKICAgICAgIkNBUF9TWVNfTU9EVUxFIiwKICAgICAgIkNBUF9TWVNfUkFXSU8iLAogICAgICAiQ0FQX1NZU19DSFJPT1QiLAogICAgICAiQ0FQX1NZU19QVFJBQ0UiLAogICAgICAiQ0FQX1NZU19QQUNDVCIsCiAgICAgICJDQVBfU1lTX0FETUlOIiwKICAgICAgIkNBUF9TWVNfQk9PVCIsCiAgICAgICJDQVBfU1lTX05JQ0UiLAogICAgICAiQ0FQX1NZU19SRVNPVVJDRSIsCiAgICAgICJDQVBfU1lTX1RJTUUiLAogICAgICAiQ0FQX1NZU19UVFlfQ09ORklHIiwKICAgICAgIkNBUF9NS05PRCIsCiAgICAgICJDQVBfTEVBU0UiLAogICAgICAiQ0FQX0FVRElUX1dSSVRFIiwKICAgICAgIkNBUF9BVURJVF9DT05UUk9MIiwKICAgICAgIkNBUF9TRVRGQ0FQIiwKICAgICAgIkNBUF9NQUNfT1ZFUlJJREUiLAogICAgICAiQ0FQX01BQ19BRE1JTiIsCiAgICAgICJDQVBfU1lTTE9HIiwKICAgICAgIkNBUF9XQUtFX0FMQVJNIiwKICAgICAgIkNBUF9CTE9DS19TVVNQRU5EIiwKICAgICAgIkNBUF9BVURJVF9SRUFEIiwKICAgICAgIkNBUF9QRVJGTU9OIiwKICAgICAgIkNBUF9CUEYiLAogICAgICAiQ0FQX0NIRUNLUE9JTlRfUkVTVE9SRSIKICAgIF0sCiAgICAidmlydGlvX2Jsa19zdG9yYWdlX2NsYXNzZXMiOiBbCiAgICAgICJjYy1sb2NhbC1jc2kiLAogICAgICAiY2MtbWFuYWdlZC1jc2kiLAogICAgICAiY2MtbWFuYWdlZC1wcmVtaXVtLWNzaSIKICAgIF0sCiAgICAic21iX3N0b3JhZ2VfY2xhc3NlcyI6IFsKICAgICAgewogICAgICAgICJuYW1lIjogImF6dXJlZmlsZS1jc2kta2F0YS1jYyIsCiAgICAgICAgIm1vdW50X29wdGlvbnMiOiBbCiAgICAgICAgICAiZGlyX21vZGU9MDc3NyIsCiAgICAgICAgICAiZmlsZV9tb2RlPTA3NzciLAogICAgICAgICAgIm1mc3ltbGlua3MiLAogICAgICAgICAgImNhY2hlPXN0cmljdCIsCiAgICAgICAgICAibm9zaGFyZXNvY2siLAogICAgICAgICAgImFjdGltZW89MzAiLAogICAgICAgICAgIm5vYnJsIgogICAgICAgIF0KICAgICAgfQogICAgXQogIH0sCiAgInNhbmRib3giOiB7CiAgICAic3RvcmFnZXMiOiBbCiAgICAgIHsKICAgICAgICAiZHJpdmVyIjogImVwaGVtZXJhbCIsCiAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgInNvdXJjZSI6ICJzaG0iLAogICAgICAgICJmc3R5cGUiOiAidG1wZnMiLAogICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICJub2RldiIsCiAgICAgICAgICAibW9kZT0xNzc3IiwKICAgICAgICAgICJzaXplPTY3MTA4ODY0IgogICAgICAgIF0sCiAgICAgICAgIm1vdW50X3BvaW50IjogIi9ydW4va2F0YS1jb250YWluZXJzL3NhbmRib3gvc2htIiwKICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgIH0KICAgIF0KICB9LAogICJyZXF1ZXN0X2RlZmF1bHRzIjogewogICAgIkNyZWF0ZUNvbnRhaW5lclJlcXVlc3QiOiB7CiAgICAgICJhbGxvd19lbnZfcmVnZXgiOiBbCiAgICAgICAgIl5IT1NUTkFNRT0kKGRuc19sYWJlbCkkIiwKICAgICAgICAiXiQoc3ZjX25hbWUpX1BPUlRfJChpcF9wKV9UQ1A9dGNwOi8vJChpcHY0X2EpOiQoaXBfcCkkIiwKICAgICAgICAiXiQoc3ZjX25hbWUpX1BPUlRfJChpcF9wKV9UQ1BfUFJPVE89dGNwJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9QT1JUXyQoaXBfcClfVENQX1BPUlQ9JChpcF9wKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfUE9SVF8kKGlwX3ApX1RDUF9BRERSPSQoaXB2NF9hKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfU0VSVklDRV9IT1NUPSQoaXB2NF9hKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfU0VSVklDRV9QT1JUPSQoaXBfcCkkIiwKICAgICAgICAiXiQoc3ZjX25hbWUpX1NFUlZJQ0VfUE9SVF8kKGRuc19sYWJlbCk9JChpcF9wKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfUE9SVD10Y3A6Ly8kKGlwdjRfYSk6JChpcF9wKSQiLAogICAgICAgICJeQVpVUkVfQ0xJRU5UX0lEPVtBLUZhLWYwLTktXSokIiwKICAgICAgICAiXkFaVVJFX1RFTkFOVF9JRD1bQS1GYS1mMC05LV0qJCIsCiAgICAgICAgIl5BWlVSRV9GRURFUkFURURfVE9LRU5fRklMRT0vdmFyL3J1bi9zZWNyZXRzL2F6dXJlL3Rva2Vucy9henVyZS1pZGVudGl0eS10b2tlbiQiLAogICAgICAgICJeQVpVUkVfQVVUSE9SSVRZX0hPU1Q9aHR0cHM6Ly9sb2dpblxcLm1pY3Jvc29mdG9ubGluZVxcLmNvbS8kIiwKICAgICAgICAiXlRFUk09eHRlcm0kIgogICAgICBdLAogICAgICAiYWxsb3dfZW52X3JlZ2V4X21hcCI6IHsKICAgICAgICAiQ1BVX0xJTUlUIjogIl5bMC05XSskIiwKICAgICAgICAiSk9CX0NPTVBMRVRJT05fSU5ERVgiOiAiXlswLTldKiQiLAogICAgICAgICJNRU1PUllfTElNSVQiOiAiXlswLTldKyQiCiAgICAgIH0KICAgIH0sCiAgICAiQ29weUZpbGVSZXF1ZXN0IjogWwogICAgICAiJChzZnByZWZpeCkiCiAgICBdLAogICAgIkV4ZWNQcm9jZXNzUmVxdWVzdCI6IHsKICAgICAgImFsbG93ZWRfY29tbWFuZHMiOiBbXSwKICAgICAgInJlZ2V4IjogW10KICAgIH0sCiAgICAiVXBkYXRlUm91dGVzUmVxdWVzdCI6IHsKICAgICAgImZvcmJpZGRlbl9kZXZpY2VfbmFtZXMiOiBbCiAgICAgICAgImxvIgogICAgICBdLAogICAgICAiZm9yYmlkZGVuX3NvdXJjZV9yZWdleCI6IFsKICAgICAgICAiXig/OjB7MCw0fTopezAsN30wezAsM30xJCIsCiAgICAgICAgIl4xMjdcXC4oPzpbMC05XXsxLDN9XFwuKXsyfVswLTldezEsM30kIgogICAgICBdCiAgICB9LAogICAgIlVwZGF0ZUludGVyZmFjZVJlcXVlc3QiOiB7CiAgICAgICJhbGxvd19yYXdfZmxhZ3MiOiAxMjgsCiAgICAgICJmb3JiaWRkZW5fbmFtZXMiOiBbCiAgICAgICAgImxvIgogICAgICBdLAogICAgICAiZm9yYmlkZGVuX2h3X2FkZHJzIjogWwogICAgICAgICIwMDowMDowMDowMDowMDowMCIKICAgICAgXQogICAgfSwKICAgICJDbG9zZVN0ZGluUmVxdWVzdCI6IGZhbHNlLAogICAgIlJlYWRTdHJlYW1SZXF1ZXN0IjogZmFsc2UsCiAgICAiVXBkYXRlRXBoZW1lcmFsTW91bnRzUmVxdWVzdCI6IGZhbHNlLAogICAgIldyaXRlU3RyZWFtUmVxdWVzdCI6IGZhbHNlCiAgfQp9 + spec: + runtimeClassName: kata-cc + shareProcessNamespace: true + containers: + - name: nginx2 + image: "marinerconfpodstest.azurecr.io/azurelinux/base/nginx:1.25" + volumeMounts: + - mountPath: /usr/share/nginx/html + name: wwwtest2 + ports: + - containerPort: 80 + name: web + command: + - /bin/sh + args: + - "-c" + - while true; do echo $(META_NAME); sleep 10; done + env: + - name: META_NAME + valueFrom: + fieldRef: + fieldPath: metadata.name + volumeClaimTemplates: + - metadata: + name: wwwtest2 + spec: + storageClassName: azurefile-csi + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 500Mi + minReadySeconds: 2 + persistentVolumeClaimRetentionPolicy: + whenScaled: Delete diff --git a/src/agent/samples/policy/yaml/webhook/webhook-pod1.yaml b/src/agent/samples/policy/yaml/webhook/webhook-pod1.yaml new file mode 100644 index 000000000000..593531636d78 --- /dev/null +++ b/src/agent/samples/policy/yaml/webhook/webhook-pod1.yaml @@ -0,0 +1,93 @@ +--- +apiVersion: v1 +kind: Pod +metadata: + annotations: + kubectl.kubernetes.io/last-applied-configuration: "{\"apiVersion\":\"v1\",\"kind\":\"Pod\",\"metadata\":{\"annotations\":{},\"name\":\"hello-kata-webhook\",\"namespace\":\"default\"},\"spec\":{\"containers\":[{\"command\":[\"echo\",\"Hello Webhook\"],\"image\":\"quay.io/prometheus/busybox:latest\",\"imagePullPolicy\":\"IfNotPresent\",\"name\":\"hello-kata-webhook\"}],\"restartPolicy\":\"Never\"}}\n" + io.katacontainers.config.agent.policy: IyBDb3B5cmlnaHQgKGMpIDIwMjMgTWljcm9zb2Z0IENvcnBvcmF0aW9uCiMKIyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMAojCnBhY2thZ2UgYWdlbnRfcG9saWN5CgppbXBvcnQgZnV0dXJlLmtleXdvcmRzLmluCmltcG9ydCBmdXR1cmUua2V5d29yZHMuZXZlcnkKCiMgRGVmYXVsdCB2YWx1ZXMsIHJldHVybmVkIGJ5IE9QQSB3aGVuIHJ1bGVzIGNhbm5vdCBiZSBldmFsdWF0ZWQgdG8gdHJ1ZS4KZGVmYXVsdCBBZGRBUlBOZWlnaGJvcnNSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgQWRkU3dhcFJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBDbG9zZVN0ZGluUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IENvcHlGaWxlUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IENyZWF0ZUNvbnRhaW5lclJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBDcmVhdGVTYW5kYm94UmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IERlc3Ryb3lTYW5kYm94UmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgRXhlY1Byb2Nlc3NSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgR2V0T09NRXZlbnRSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBHdWVzdERldGFpbHNSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBMaXN0SW50ZXJmYWNlc1JlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBMaXN0Um91dGVzUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IE1lbUhvdHBsdWdCeVByb2JlUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IE9ubGluZUNQVU1lbVJlcXVlc3QgOj0gdHJ1ZQpkZWZhdWx0IFBhdXNlQ29udGFpbmVyUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFJlYWRTdHJlYW1SZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgUmVtb3ZlQ29udGFpbmVyUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgUmVtb3ZlU3RhbGVWaXJ0aW9mc1NoYXJlTW91bnRzUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgUmVzZWVkUmFuZG9tRGV2UmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFJlc3VtZUNvbnRhaW5lclJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBTZXRHdWVzdERhdGVUaW1lUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFNldFBvbGljeVJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBTaWduYWxQcm9jZXNzUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgU3RhcnRDb250YWluZXJSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBTdGFydFRyYWNpbmdSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgU3RhdHNDb250YWluZXJSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBTdG9wVHJhY2luZ1JlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBUdHlXaW5SZXNpemVSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBVcGRhdGVDb250YWluZXJSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgVXBkYXRlRXBoZW1lcmFsTW91bnRzUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFVwZGF0ZUludGVyZmFjZVJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBVcGRhdGVSb3V0ZXNSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgV2FpdFByb2Nlc3NSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBXcml0ZVN0cmVhbVJlcXVlc3QgOj0gZmFsc2UKCiMgQWxsb3dSZXF1ZXN0c0ZhaWxpbmdQb2xpY3kgOj0gdHJ1ZSBjb25maWd1cmVzIHRoZSBBZ2VudCB0byAqYWxsb3cgYW55CiMgcmVxdWVzdHMgY2F1c2luZyBhIHBvbGljeSBmYWlsdXJlKi4gVGhpcyBpcyBhbiB1bnNlY3VyZSBjb25maWd1cmF0aW9uCiMgYnV0IGlzIHVzZWZ1bCBmb3IgYWxsb3dpbmcgdW5zZWN1cmUgcG9kcyB0byBzdGFydCwgdGhlbiBjb25uZWN0IHRvCiMgdGhlbSBhbmQgaW5zcGVjdCBPUEEgbG9ncyBmb3IgdGhlIHJvb3QgY2F1c2Ugb2YgYSBmYWlsdXJlLgpkZWZhdWx0IEFsbG93UmVxdWVzdHNGYWlsaW5nUG9saWN5IDo9IGZhbHNlCgojIENvbnN0YW50cwpTX05BTUVfS0VZID0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZSIKU19OQU1FU1BBQ0VfS0VZID0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZXNwYWNlIgpCVU5ETEVfSUQgPSAiW2EtejAtOV17NjR9IgoKQ3JlYXRlQ29udGFpbmVyUmVxdWVzdDo9IHJlc3AgewogICAgbm90IGlzX251bGwoaW5wdXQuZW52X21hcCkKICAgIAogICAgaV9lbnZfbWFwIDo9IGlucHV0LmVudl9tYXAKICAgIAogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBwX2Vudl9tYXAgOj0gcF9jb250YWluZXIuZW52X21hcCAgCiAgICBhbGxvd19lbnZfbWFwKHBfZW52X21hcCwgaV9lbnZfbWFwKQogICAgCiAgICBpX3Byb2Nlc3MgOj0gaW5wdXQuYmFzZS5PQ0kuUHJvY2VzcwogICAgCiAgICBwX3Byb2Nlc3MgOj0gcF9jb250YWluZXIuT0NJLlByb2Nlc3MKICAgIAogICAgYWxsb3dfYXJncyhpX3Byb2Nlc3MsIHBfcHJvY2VzcywgaV9lbnZfbWFwKQoKICAgIHJlc3AgPSBDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uKGlucHV0LmJhc2UpCiAgICBwcmludCgiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdDogdHJ1ZSIpCn0KCmFsbG93X2FyZ3MoaV9wcm9jZXNzLCBwX3Byb2Nlc3MsIGlfZW52X21hcCkgewogICAgaV9hcmdzIDo9IGlfcHJvY2Vzcy5BcmdzCiAgICBwX2FyZ3MgOj0gcF9wcm9jZXNzLkFyZ3MKICAgIHByaW50KCJhbGxvd19hcmdzOiBpX2FyZ3MgPSIsIGlfYXJncywgInBfYXJncyA9IiwgcF9hcmdzKQogICAgY291bnQoaV9hcmdzKSA9PSBjb3VudChwX2FyZ3MpCiAgICBldmVyeSBpLCBpX2FyZyBpbiBpX2FyZ3MgewogICAgICAgIHByaW50KCJhbGxvd19hcmdzOiBpX2FyZyA9IiwgaV9hcmcpCiAgICAgICAgcF9hcmdfcmVwbGFjZWQgOj0gcmVwbGFjZV9lbnZfdmFyaWFibGVzKHBfYXJnc1tpXSwgaV9lbnZfbWFwKQogICAgICAgIHByaW50KCJhbGxvd19hcmdzOiBwX2FyZ19yZXBsYWNlZCA9IiwgcF9hcmdfcmVwbGFjZWQpCiAgICAgICAgcF9hcmdfcmVwbGFjZWQyIDo9IHJlcGxhY2UocF9hcmdfcmVwbGFjZWQsICIkJCIsICIkIikKICAgICAgICBwcmludCgiYWxsb3dfYXJnczogcF9hcmdfcmVwbGFjZWQyID0iLCBwX2FyZ19yZXBsYWNlZDIpCiAgICAgICAgaV9hcmcgPT0gcF9hcmdfcmVwbGFjZWQyCiAgICB9CiAgICBwcmludCgiYWxsb3dfYXJnczogdHJ1ZSIpCn0KCmFsbG93X2FyZ3MoaV9wcm9jZXNzLCBwX3Byb2Nlc3MsIGlfZW52X21hcCkgewogICAgbm90IGlfcHJvY2Vzcy5BcmdzCiAgICBub3QgcF9wcm9jZXNzLkFyZ3MKICAgIHByaW50KCJhbGxvd19hcmdzMjogbm8gYXJncyIpCn0KCiMgdGhpcyBmdW5jdGlvbiByZXBsYWNlcyBhbGwgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyBpbiBhIHN0cmluZywgZ2l2ZW4gYSBtYXAgb2YgZW52aXJvbm1lbnQga2V5cyB0byBlbnZpcm9ubWVudCB2YWx1ZXMKIyBlZyBzdHIgPSAiZWNobyAkKENMVVNURVJfSUQpOyBlY2hvICQoTk9ERV9OQU1FKTsiCiMgZW52X21hcCA9IHsiQ0xVU1RFUl9JRCI6ICJhYmMiLCAiTk9ERV9OQU1FIiA6ICJ4eXoifQojIHJlc3VsdCA9ICJlY2hvIGFiYzsgZWNobyB4eXo7IgpyZXBsYWNlX2Vudl92YXJpYWJsZXMoc3RyLCBlbnZfbWFwKSA9IHJlc3VsdCB7CiAgICAjIG1ha2UgYW4gYXJyYXkgb2YgdGhlIGtleXMgZWcgWyJDTFVTVEVSX0lEIiwgIk5PREVfTkFNRSJdCiAgICBrZXlzIDo9IFt4IHwgc29tZSB4IGluIG9iamVjdC5rZXlzKGVudl9tYXApXQogICAgcmVzdWx0IDo9IHJlcGxhY2Vfc3RyX3JlYyhzdHIsIGVudl9tYXAsIGtleXMsIGNvdW50KGtleXMpIC0gMSkKfQoKIyBiYXNlIGNhc2UKcmVwbGFjZV9zdHJfcmVjKHN0ciwgZW52X21hcCwgYXJyX2tleXMsIGkpID0gcmVzdWx0IHsKICAgIGkgPCAwCiAgICByZXN1bHQgOj0gc3RyCn0KCiMgcmVjdXJzaXZlIHN0ZXAKcmVwbGFjZV9zdHJfcmVjKHN0ciwgZW52X21hcCwgYXJyX2tleXMsIGkpID0gcmVzdWx0IHsKICAgIGkgPj0gMAogICAga2V5IDo9IGFycl9rZXlzW2ldCiAgICBlbnZfa2V5MSA6PSBjb25jYXQoIiIsIFsiJCgiLCBrZXksICIpIl0pCiAgICAjIHJlcGxhY2UgJChWQVIpIHdpdGggdmFsdWUKICAgIG5ld19zdHIxIDo9IHJlcGxhY2Uoc3RyLCBlbnZfa2V5MSwgZW52X21hcFtrZXldKQogICAgIyByZXBsYWNlIG5leHQgZW52aXJvbm1lbnQgdmFyaWFibGUKICAgIHJlc3VsdCA9IHJlcGxhY2Vfc3RyX3JlYyhuZXdfc3RyMSwgZW52X21hcCwgYXJyX2tleXMsIGkgLSAxKQp9CgphbGxvd19lbnZfbWFwKHBfZW52X21hcCwgaV9lbnZfbWFwKSB7CiAgICBwcmludCgiYWxsb3dfZW52X21hcDogcF9lbnZfbWFwID0iLCBwX2Vudl9tYXApCiAgICBldmVyeSBlbnZfa2V5LCBlbnZfdmFsIGluIGlfZW52X21hcCB7CiAgICAgICAgcHJpbnQoImFsbG93X2VudjogZW52X2tleSA9IiwgZW52X2tleSwgImVudl92YWwgPSIsIGVudl92YWwpCiAgICAgICAgYWxsb3dfZW52X21hcF9lbnRyeShlbnZfa2V5LCBlbnZfdmFsLCBwX2Vudl9tYXApCiAgICB9CiAgICBwcmludCgiYWxsb3dfZW52X21hcDogdHJ1ZSIpCn0KCiMgQWxsb3cgZXhhY3QgbWF0Y2gKYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBpX3ZhbCA9PSBwX3ZhbAogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnk6IHRydWUiKQp9CgojIEFsbG93IHJlc291cmNlRmllbGRSZWYgdmFsdWVzIChlLmcuLCAibGltaXRzLmNwdSIpLgphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgICMgYSB2YXJpYWJsZSB3ZSBzaG91bGQgYmUgdmFsaWRhdGluZyB1c2luZyBhIHJlZ2V4IGZyb20gc2V0dGluZ3MKICAgIHBfdmFsID09ICIkKHZhbGlkYXRlLWZyb20tc2V0dGluZ3MpIgogICAgcmVnZXhfdmFsIDo9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuQ3JlYXRlQ29udGFpbmVyUmVxdWVzdC5hbGxvd19lbnZfcmVnZXhfbWFwW2tleV0KICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4X3ZhbCwgaV92YWwpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSAyOiB0cnVlIikKfQoKIyBBbGxvdyBub2RlLW5hbWUKYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChub2RlLW5hbWUpIgogICAgcmVnZXgubWF0Y2gocG9saWN5X2RhdGEuY29tbW9uLmRuc19zdWJkb21haW4gLCBpX3ZhbCkKICAgIHByaW50KCJhbGxvd19lbnZfbWFwX2VudHJ5IDM6IHRydWUiKQp9CgojIEFsbG93IGhvc3QtbmFtZQphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgIHBfdmFsID09ICIkKGhvc3QtbmFtZSkiCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24uZG5zX2xhYmVsICwgaV92YWwpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSA0OiB0cnVlIikKfQoKIyBBbGxvdyBwb2QtdWlkCmFsbG93X2Vudl9tYXBfZW50cnkoa2V5LCBpX3ZhbCwgcF9lbnZfbWFwKSB7CiAgICBwX3ZhbCA6PSBwX2Vudl9tYXBba2V5XQogICAgcF92YWwgPT0gIiQocG9kLXVpZCkiCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24ucG9kX3VpZCAsIGlfdmFsKQogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgNTogdHJ1ZSIpCn0KCiMgQWxsb3cgZmllbGRSZWYgImZpZWxkUGF0aDogc3RhdHVzLnBvZElQIiB2YWx1ZXMuCmFsbG93X2Vudl9tYXBfZW50cnkoa2V5LCBpX3ZhbCwgcF9lbnZfbWFwKSB7CiAgICBpc19pcChpX3ZhbCkKCiAgICBwX3ZhbCA6PSBwX2Vudl9tYXBba2V5XQogICAgcF92YXIgOj0gY29uY2F0KCI9IiwgW2tleSwgcF92YWxdKQogICAgYWxsb3dfcG9kX2lwX3ZhcihrZXksIHBfdmFyKQogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgNjogdHJ1ZSIpCn0KCiMgQWxsb3cgZmllbGRSZWYgImZpZWxkUGF0aDogc3RhdHVzLmhvc3RJUCIgdmFsdWVzLgphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgaXNfaXAoaV92YWwpCgogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgIHBfdmFyIDo9IGNvbmNhdCgiPSIsIFtrZXksIHBfdmFsXSkKICAgIGFsbG93X2hvc3RfaXBfdmFyKGtleSwgcF92YXIpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSA3OiB0cnVlIikKfQoKIyBNYXRjaCBpbnB1dCB3aXRoIG9uZSBvZiB0aGUgcG9saWN5IHZhcmlhYmxlcywgYWZ0ZXIgc3Vic3RpdHV0aW5nICQoc2FuZGJveC1uYW1lKS4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChzYW5kYm94LW5hbWUpIgogICAgc19uYW1lIDo9IGlucHV0LmJhc2UuT0NJLkFubm90YXRpb25zW1NfTkFNRV9LRVldCiAgICBwX3ZhcjIgOj0gcmVwbGFjZShwX3ZhbCwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHBfdmFyMiA9PSBpX3ZhbAogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgODogdHJ1ZSIpCn0KCiMgTWF0Y2ggaW5wdXQgd2l0aCBvbmUgb2YgdGhlIHBvbGljeSB2YXJpYWJsZXMsIGFmdGVyIHN1YnN0aXR1dGluZyAkKHNhbmRib3gtbmFtZXNwYWNlKS4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChzYW5kYm94LW5hbWVzcGFjZSkiCiAgICBzX25hbWVzcGFjZSA6PSBpbnB1dC5iYXNlLk9DSS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwX3ZhcjIgOj0gcmVwbGFjZShwX3ZhbCwgIiQoc2FuZGJveC1uYW1lc3BhY2UpIiwgc19uYW1lc3BhY2UpCiAgICBwX3ZhcjIgPT0gaV92YWwKICAgIHByaW50KCJhbGxvd19lbnZfbWFwX2VudHJ5IDk6IHRydWUiKQp9CgojIEFsbG93IGlucHV0IGVudiB2YXJpYWJsZXMgdGhhdCBtYXRjaCB3aXRoIGEgcmVxdWVzdF9kZWZhdWx0cyByZWdleC4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHNvbWUgcF9yZWdleDEgaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5DcmVhdGVDb250YWluZXJSZXF1ZXN0LmFsbG93X2Vudl9yZWdleAogICAgcF9yZWdleDIgOj0gcmVwbGFjZShwX3JlZ2V4MSwgIiQoaXB2NF9hKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcHY0X2EpCiAgICBwX3JlZ2V4MyA6PSByZXBsYWNlKHBfcmVnZXgyLCAiJChpcF9wKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcF9wKQogICAgcF9yZWdleDQgOj0gcmVwbGFjZShwX3JlZ2V4MywgIiQoc3ZjX25hbWUpIiwgcG9saWN5X2RhdGEuY29tbW9uLnN2Y19uYW1lKQogICAgcF9yZWdleDUgOj0gcmVwbGFjZShwX3JlZ2V4NCwgIiQoZG5zX2xhYmVsKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5kbnNfbGFiZWwpCgogICAgcmVzdWx0IDo9IGNvbmNhdCgiPSIsIFtrZXksIGlfdmFsXSkKICAgIHJlZ2V4Lm1hdGNoKHBfcmVnZXg1LCByZXN1bHQpCgogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgMTA6IHRydWUiKQp9CgpDcmVhdGVDb250YWluZXJSZXF1ZXN0Oj0gcmVzcCB7CiAgICBub3QgaW5wdXQuZW52X21hcAogICAgaV9wcm9jZXNzID0gaW5wdXQuT0NJLlByb2Nlc3MKICAgIHNfbmFtZSA9IGlucHV0Lk9DSS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBwX3Byb2Nlc3MgPSBwX2NvbnRhaW5lci5PQ0kuUHJvY2VzcwogICAgYWxsb3dfZGVwcmVjYXRlZF9hcmdzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUpCiAgICByZXNwID0gQ3JlYXRlQ29udGFpbmVyUmVxdWVzdENvbW1vbihpbnB1dCkKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0MjogdHJ1ZSIpCn0KCkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb24ocmVxKTo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgICMgQ2hlY2sgaWYgdGhlIGlucHV0IHJlcXVlc3Qgc2hvdWxkIGJlIHJlamVjdGVkIGV2ZW4gYmVmb3JlIGNoZWNraW5nIHRoZQogICAgIyBwb2xpY3lfZGF0YS5jb250YWluZXJzIGluZm9ybWF0aW9uLgogICAgYWxsb3dfY3JlYXRlX2NvbnRhaW5lcl9pbnB1dChyZXEpCgogICAgaV9vY2kgOj0gcmVxLk9DSQogICAgaV9zdG9yYWdlcyA6PSByZXEuc3RvcmFnZXMKICAgIGlfZGV2aWNlcyA6PSByZXEuZGV2aWNlcwoKICAgICMgYXJyYXkgb2YgcG9zc2libGUgc3RhdGUgb3BlcmF0aW9ucwogICAgb3BzX2J1aWxkZXIgOj0gW10KCiAgICAjIGNoZWNrIHNhbmRib3ggbmFtZQogICAgc2FuZGJveF9uYW1lID0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FX0tFWV0KICAgIGFkZF9zYW5kYm94X25hbWVfdG9fc3RhdGUgOj0gc3RhdGVfYWxsb3dzKCJzYW5kYm94X25hbWUiLCBzYW5kYm94X25hbWUpCiAgICBvcHNfYnVpbGRlcjEgOj0gY29uY2F0X29wX2lmX25vdF9udWxsKG9wc19idWlsZGVyLCBhZGRfc2FuZGJveF9uYW1lX3RvX3N0YXRlKQoKICAgICMgQ2hlY2sgaWYgYW55IGVsZW1lbnQgZnJvbSB0aGUgcG9saWN5X2RhdGEuY29udGFpbmVycyBhcnJheSBhbGxvd3MgdGhlIGlucHV0IHJlcXVlc3QuCiAgICBzb21lIHBfY29udGFpbmVyIGluIHBvbGljeV9kYXRhLmNvbnRhaW5lcnMKICAgIHByaW50KCI9PT09PT09PSBDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiB0cnlpbmcgbmV4dCBwb2xpY3kgY29udGFpbmVyIikKCiAgICBwX3BpZG5zIDo9IHBfY29udGFpbmVyLnNhbmRib3hfcGlkbnMKICAgIGlfcGlkbnMgOj0gcmVxLnNhbmRib3hfcGlkbnMKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiBwX3BpZG5zID0iLCBwX3BpZG5zLCAiaV9waWRucyA9IiwgaV9waWRucykKICAgIHBfcGlkbnMgPT0gaV9waWRucwoKICAgIHBfb2NpIDo9IHBfY29udGFpbmVyLk9DSQoKICAgICMgY2hlY2sgbmFtZXNwYWNlCiAgICBwX25hbWVzcGFjZSA6PSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBpX25hbWVzcGFjZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwcmludCAoIkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb246IHBfbmFtZXNwYWNlID0iLCBwX25hbWVzcGFjZSwgImlfbmFtZXNwYWNlID0iLCBpX25hbWVzcGFjZSkKICAgIGFkZF9uYW1lc3BhY2VfdG9fc3RhdGUgOj0gYWxsb3dfbmFtZXNwYWNlKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkKICAgIG9wc19idWlsZGVyMiA6PSBjb25jYXRfb3BfaWZfbm90X251bGwob3BzX2J1aWxkZXIxLCBhZGRfbmFtZXNwYWNlX3RvX3N0YXRlKQoKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiBwIFZlcnNpb24gPSIsIHBfb2NpLlZlcnNpb24sICJpIFZlcnNpb24gPSIsIGlfb2NpLlZlcnNpb24pCiAgICBwX29jaS5WZXJzaW9uID09IGlfb2NpLlZlcnNpb24KCiAgICBwcmludCgiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdENvbW1vbjogcCBSZWFkb25seSA9IiwgcF9vY2kuUm9vdC5SZWFkb25seSwgImkgUmVhZG9ubHkgPSIsIGlfb2NpLlJvb3QuUmVhZG9ubHkpCiAgICBwX29jaS5Sb290LlJlYWRvbmx5ID09IGlfb2NpLlJvb3QuUmVhZG9ubHkKCiAgICBhbGxvd19hbm5vKHBfb2NpLCBpX29jaSkKCiAgICBwX3N0b3JhZ2VzIDo9IHBfY29udGFpbmVyLnN0b3JhZ2VzCiAgICBhbGxvd19ieV9hbm5vKHBfb2NpLCBpX29jaSwgcF9zdG9yYWdlcywgaV9zdG9yYWdlcykKCiAgICBwX2RldmljZXMgOj0gcF9jb250YWluZXIuZGV2aWNlcwogICAgYWxsb3dfZGV2aWNlcyhwX2RldmljZXMsIGlfZGV2aWNlcykKCiAgICByZXQgOj0gYWxsb3dfbGludXgob3BzX2J1aWxkZXIyLCBwX29jaSwgaV9vY2kpCiAgICByZXQuYWxsb3dlZAoKICAgIG9wcyA6PSByZXQub3BzCgogICAgcHJpbnQoIkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb246IHRydWUiKQp9CgphbGxvd19jcmVhdGVfY29udGFpbmVyX2lucHV0KHJlcSkgewogICAgcHJpbnQoImFsbG93X2NyZWF0ZV9jb250YWluZXJfaW5wdXQ6IGlucHV0ID0iLCByZXEpCgogICAgY291bnQocmVxLnNoYXJlZF9tb3VudHMpID09IDAKICAgIGlzX251bGwocmVxLnN0cmluZ191c2VyKQoKICAgIGlfb2NpIDo9IHJlcS5PQ0kKICAgIGlzX251bGwoaV9vY2kuSG9va3MpCiAgICBpc19udWxsKGlfb2NpLlNvbGFyaXMpCiAgICBpc19udWxsKGlfb2NpLldpbmRvd3MpCgogICAgaV9saW51eCA6PSBpX29jaS5MaW51eAogICAgY291bnQoaV9saW51eC5HSURNYXBwaW5ncykgPT0gMAogICAgY291bnQoaV9saW51eC5Nb3VudExhYmVsKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlJlc291cmNlcy5EZXZpY2VzKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlJvb3Rmc1Byb3BhZ2F0aW9uKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlVJRE1hcHBpbmdzKSA9PSAwCiAgICBpc19udWxsKGlfbGludXguSW50ZWxSZHQpCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLkJsb2NrSU8pCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLk5ldHdvcmspCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLlBpZHMpCiAgICBpc19udWxsKGlfbGludXguU2VjY29tcCkKCiAgICBpX3Byb2Nlc3MgOj0gaV9vY2kuUHJvY2VzcwogICAgY291bnQoaV9wcm9jZXNzLlNlbGludXhMYWJlbCkgPT0gMAogICAgY291bnQoaV9wcm9jZXNzLlVzZXIuVXNlcm5hbWUpID09IDAKCiAgICBwcmludCgiYWxsb3dfY3JlYXRlX2NvbnRhaW5lcl9pbnB1dDogdHJ1ZSIpCn0KCmFsbG93X25hbWVzcGFjZShwX25hbWVzcGFjZSwgaV9uYW1lc3BhY2UpID0gYWRkX25hbWVzcGFjZSB7CiAgICBwX25hbWVzcGFjZSA9PSBpX25hbWVzcGFjZQogICAgYWRkX25hbWVzcGFjZSA6PSBudWxsCiAgICBwcmludCgiYWxsb3dfbmFtZXNwYWNlIDE6IGlucHV0IG5hbWVzcGFjZSBtYXRjaGVzIHBvbGljeSBkYXRhIikKfQoKYWxsb3dfbmFtZXNwYWNlKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkgPSBhZGRfbmFtZXNwYWNlIHsKICAgIHBfbmFtZXNwYWNlID09ICIiCiAgICBwcmludCgiYWxsb3dfbmFtZXNwYWNlIDI6IG5vIG5hbWVzcGFjZSBmb3VuZCBvbiBwb2xpY3kgZGF0YSIpCiAgICBhZGRfbmFtZXNwYWNlIDo9IHN0YXRlX2FsbG93cygibmFtZXNwYWNlIiwgaV9uYW1lc3BhY2UpCn0KCiMgdmFsdWUgaGFzbid0IGJlZW4gc2VlbiBiZWZvcmUsIHNhdmUgaXQgdG8gc3RhdGUKc3RhdGVfYWxsb3dzKGtleSwgdmFsdWUpID0gYWN0aW9uIHsKICBzdGF0ZSA6PSBnZXRfc3RhdGUoKQogIHByaW50KCJzdGF0ZV9hbGxvd3MgMTogc3RhdGVba2V5XSA9Iiwgc3RhdGVba2V5XSwgInZhbHVlID0iLCB2YWx1ZSkKICBub3Qgc3RhdGVba2V5XQogIHByaW50KCJzdGF0ZV9hbGxvd3MgMTogc2F2aW5nIHRvIHN0YXRlIGtleSA9Iiwga2V5LCAidmFsdWUgPSIsIHZhbHVlKQogIHBhdGggOj0gZ2V0X3N0YXRlX3BhdGgoa2V5KSAKICBhY3Rpb24gOj0gewogICAgIm9wIjogImFkZCIsCiAgICAicGF0aCI6IHBhdGgsIAogICAgInZhbHVlIjogdmFsdWUsCiAgfQp9CgojIHZhbHVlIG1hdGNoZXMgd2hhdCdzIGluIHN0YXRlLCBhbGxvdyBpdApzdGF0ZV9hbGxvd3Moa2V5LCB2YWx1ZSkgPSBhY3Rpb24gewogIHByaW50KCJzdGF0ZV9hbGxvd3MgMjogc3RhcnQiKQogIHN0YXRlIDo9IGdldF9zdGF0ZSgpCiAgcHJpbnQoInN0YXRlX2FsbG93cyAyOiBzdGF0ZVtrZXldID0iLCBzdGF0ZVtrZXldLCAidmFsdWUgPSIsIHZhbHVlKQogIHZhbHVlID09IHN0YXRlW2tleV0KICBwcmludCgic3RhdGVfYWxsb3dzIDI6IGZvdW5kIGtleSA9Iiwga2V5LCAidmFsdWUgPSIsIHZhbHVlLCAiIGluIHN0YXRlIikKICBhY3Rpb24gOj0gbnVsbAp9CgojIGhlbHBlciBmdW5jdGlvbnMgdG8gaW50ZXJhY3Qgd2l0aCB0aGUgc3RhdGUKZ2V0X3N0YXRlKCkgPSBzdGF0ZSB7CiAgc3RhdGUgOj0gZGF0YVsicHN0YXRlIl0KfQoKZ2V0X3N0YXRlX3ZhbChrZXkpID0gdmFsdWUgewogICAgc3RhdGUgOj0gZ2V0X3N0YXRlKCkKICAgIHZhbHVlIDo9IHN0YXRlW2tleV0KfQoKZ2V0X3N0YXRlX3BhdGgoa2V5KSA9IHBhdGggewogICAgIyBwcmVwZW5kICIvcHN0YXRlLyIgdG8ga2V5CiAgICBwYXRoIDo9IGNvbmNhdCgiLyIsIFsiL3BzdGF0ZSIsIGtleV0pCn0KCiMgSGVscGVyIGZ1bmN0aW9ucyB0byBjb25kaXRpb25hbGx5IGNvbmNhdGVuYXRlIG9wIGlzIG5vdCBudWxsCmNvbmNhdF9vcF9pZl9ub3RfbnVsbChvcHMsIG9wKSA9IHJlc3VsdCB7CiAgICBvcCA9PSBudWxsCiAgICByZXN1bHQgOj0gb3BzCn0KCmNvbmNhdF9vcF9pZl9ub3RfbnVsbChvcHMsIG9wKSA9IHJlc3VsdCB7CiAgICBvcCAhPSBudWxsCiAgICByZXN1bHQgOj0gYXJyYXkuY29uY2F0KG9wcywgW29wXSkKfQoKIyBSZWplY3QgdW5leHBlY3RlZCBhbm5vdGF0aW9ucy4KYWxsb3dfYW5ubyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19hbm5vIDE6IHN0YXJ0IikKCiAgICBub3QgaV9vY2kuQW5ub3RhdGlvbnMKCiAgICBwcmludCgiYWxsb3dfYW5ubyAxOiB0cnVlIikKfQphbGxvd19hbm5vKHBfb2NpLCBpX29jaSkgewogICAgcHJpbnQoImFsbG93X2Fubm8gMjogcCBBbm5vdGF0aW9ucyA9IiwgcF9vY2kuQW5ub3RhdGlvbnMpCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiBpIEFubm90YXRpb25zID0iLCBpX29jaS5Bbm5vdGF0aW9ucykKCiAgICBpX2tleXMgOj0gb2JqZWN0LmtleXMoaV9vY2kuQW5ub3RhdGlvbnMpCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiBpIGtleXMgPSIsIGlfa2V5cykKCiAgICBldmVyeSBpX2tleSBpbiBpX2tleXMgewogICAgICAgIGFsbG93X2Fubm9fa2V5KGlfa2V5LCBwX29jaSkKICAgIH0KCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiB0cnVlIikKfQoKYWxsb3dfYW5ub19rZXkoaV9rZXksIHBfb2NpKSB7CiAgICBwcmludCgiYWxsb3dfYW5ub19rZXkgMTogaSBrZXkgPSIsIGlfa2V5KQoKICAgIHN0YXJ0c3dpdGgoaV9rZXksICJpby5rdWJlcm5ldGVzLmNyaS4iKQoKICAgIHByaW50KCJhbGxvd19hbm5vX2tleSAxOiB0cnVlIikKfQphbGxvd19hbm5vX2tleShpX2tleSwgcF9vY2kpIHsKICAgIHByaW50KCJhbGxvd19hbm5vX2tleSAyOiBpIGtleSA9IiwgaV9rZXkpCgogICAgc29tZSBwX2tleSwgXyBpbiBwX29jaS5Bbm5vdGF0aW9ucwogICAgcF9rZXkgPT0gaV9rZXkKCiAgICBwcmludCgiYWxsb3dfYW5ub19rZXkgMjogdHJ1ZSIpCn0KCiMgR2V0IHRoZSB2YWx1ZSBvZiB0aGUgU19OQU1FX0tFWSBhbm5vdGF0aW9uIGFuZAojIGNvcnJlbGF0ZSBpdCB3aXRoIG90aGVyIGFubm90YXRpb25zIGFuZCBwcm9jZXNzIGZpZWxkcy4KYWxsb3dfYnlfYW5ubyhwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpIHsKICAgIHByaW50KCJhbGxvd19ieV9hbm5vIDE6IHN0YXJ0IikKCiAgICBub3QgcF9vY2kuQW5ub3RhdGlvbnNbU19OQU1FX0tFWV0KCiAgICBpX3NfbmFtZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMTogaV9zX25hbWUgPSIsIGlfc19uYW1lKQoKICAgIGlfc19uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FU1BBQ0VfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMTogaV9zX25hbWVzcGFjZSA9IiwgaV9zX25hbWVzcGFjZSkKCiAgICBhbGxvd19ieV9zYW5kYm94X25hbWUocF9vY2ksIGlfb2NpLCBwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBpX3NfbmFtZSwgaV9zX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfYnlfYW5ubyAxOiB0cnVlIikKfQphbGxvd19ieV9hbm5vKHBfb2NpLCBpX29jaSwgcF9zdG9yYWdlcywgaV9zdG9yYWdlcykgewogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMjogc3RhcnQiKQoKICAgIHBfc19uYW1lIDo9IHBfb2NpLkFubm90YXRpb25zW1NfTkFNRV9LRVldCiAgICBpX3NfbmFtZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMjogaV9zX25hbWUgPSIsIGlfc19uYW1lLCAicF9zX25hbWUgPSIsIHBfc19uYW1lKQoKICAgIGFsbG93X3NhbmRib3hfbmFtZShwX3NfbmFtZSwgaV9zX25hbWUpCgogICAgaV9zX25hbWVzcGFjZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwcmludCgiYWxsb3dfYnlfYW5ubyAyOiBpX3NfbmFtZXNwYWNlID0iLCBpX3NfbmFtZXNwYWNlKQoKICAgIGFsbG93X2J5X3NhbmRib3hfbmFtZShwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMsIGlfc19uYW1lLCBpX3NfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd19ieV9hbm5vIDI6IHRydWUiKQp9CgphbGxvd19ieV9zYW5kYm94X25hbWUocF9vY2ksIGlfb2NpLCBwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfYnlfc2FuZGJveF9uYW1lOiBzdGFydCIpCgogICAgaV9uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FU1BBQ0VfS0VZXQoKICAgIGFsbG93X2J5X2NvbnRhaW5lcl90eXBlcyhwX29jaSwgaV9vY2ksIHNfbmFtZSwgaV9uYW1lc3BhY2UpCiAgICBhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZChwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpCiAgICBhbGxvd19wcm9jZXNzKHBfb2NpLlByb2Nlc3MsIGlfb2NpLlByb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpCgogICAgcHJpbnQoImFsbG93X2J5X3NhbmRib3hfbmFtZTogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfbmFtZShwX3NfbmFtZSwgaV9zX25hbWUpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X25hbWU6IHN0YXJ0IikKICAgIHJlZ2V4Lm1hdGNoKHBfc19uYW1lLCBpX3NfbmFtZSkKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9uYW1lOiB0cnVlIikKfQoKIyBDaGVjayB0aGF0IHRoZSAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLXR5cGUiIGFuZAojICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIiBhbm5vdGF0aW9ucyBkZXNpZ25hdGUgdGhlCiMgZXhwZWN0ZWQgdHlwZSAtIGVpdGhlciBhICJzYW5kYm94IiBvciBhICJjb250YWluZXIiLiBUaGVuLCB2YWxpZGF0ZQojIG90aGVyIGFubm90YXRpb25zIGJhc2VkIG9uIHRoZSBhY3R1YWwgInNhbmRib3giIG9yICJjb250YWluZXIiIHZhbHVlCiMgZnJvbSB0aGUgaW5wdXQgY29udGFpbmVyLgphbGxvd19ieV9jb250YWluZXJfdHlwZXMocF9vY2ksIGlfb2NpLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfYnlfY29udGFpbmVyX3R5cGVzOiBjaGVja2luZyBpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSIpCgogICAgY190eXBlIDo9ICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSIKICAgIAogICAgcF9jcmlfdHlwZSA6PSBwX29jaS5Bbm5vdGF0aW9uc1tjX3R5cGVdCiAgICBpX2NyaV90eXBlIDo9IGlfb2NpLkFubm90YXRpb25zW2NfdHlwZV0KICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZXM6IHBfY3JpX3R5cGUgPSIsIHBfY3JpX3R5cGUsICJpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgcF9jcmlfdHlwZSA9PSBpX2NyaV90eXBlCgogICAgYWxsb3dfYnlfY29udGFpbmVyX3R5cGUoaV9jcmlfdHlwZSwgcF9vY2ksIGlfb2NpLCBzX25hbWUsIHNfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZXM6IHRydWUiKQp9CgphbGxvd19ieV9jb250YWluZXJfdHlwZShpX2NyaV90eXBlLCBwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAxOiBpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgaV9jcmlfdHlwZSA9PSAic2FuZGJveCIKCiAgICBpX2thdGFfdHlwZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1siaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5jb250YWluZXJfdHlwZSJdCiAgICBwcmludCgiYWxsb3dfYnlfY29udGFpbmVyX3R5cGUgMTogaV9rYXRhX3R5cGUgPSIsIGlfa2F0YV90eXBlKQogICAgaV9rYXRhX3R5cGUgPT0gInBvZF9zYW5kYm94IgoKICAgIGFsbG93X3NhbmRib3hfY29udGFpbmVyX25hbWUocF9vY2ksIGlfb2NpKQogICAgYWxsb3dfc2FuZGJveF9uZXRfbmFtZXNwYWNlKHBfb2NpLCBpX29jaSkKICAgIGFsbG93X3NhbmRib3hfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpCgogICAgcHJpbnQoImFsbG93X2J5X2NvbnRhaW5lcl90eXBlIDE6IHRydWUiKQp9CgphbGxvd19ieV9jb250YWluZXJfdHlwZShpX2NyaV90eXBlLCBwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiBpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgaV9jcmlfdHlwZSA9PSAiY29udGFpbmVyIgoKICAgIGlfa2F0YV90eXBlIDo9IGlfb2NpLkFubm90YXRpb25zWyJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIl0KICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiBpX2thdGFfdHlwZSA9IiwgaV9rYXRhX3R5cGUpCiAgICBpX2thdGFfdHlwZSA9PSAicG9kX2NvbnRhaW5lciIKCiAgICBhbGxvd19jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpCiAgICBhbGxvd19uZXRfbmFtZXNwYWNlKHBfb2NpLCBpX29jaSkKICAgIGFsbG93X2xvZ19kaXJlY3RvcnkocF9vY2ksIGlfb2NpKQoKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiB0cnVlIikKfQoKIyAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLW5hbWUiIGFubm90YXRpb24KYWxsb3dfc2FuZGJveF9jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X2NvbnRhaW5lcl9uYW1lOiBzdGFydCIpCgogICAgY29udGFpbmVyX2Fubm90YXRpb25fbWlzc2luZyhwX29jaSwgaV9vY2ksICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItbmFtZSIpCgogICAgcHJpbnQoImFsbG93X3NhbmRib3hfY29udGFpbmVyX25hbWU6IHRydWUiKQp9CgphbGxvd19jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19jb250YWluZXJfbmFtZTogc3RhcnQiKQoKICAgIGFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uKHBfb2NpLCBpX29jaSwgImlvLmt1YmVybmV0ZXMuY3JpLmNvbnRhaW5lci1uYW1lIikKCiAgICBwcmludCgiYWxsb3dfY29udGFpbmVyX25hbWU6IHRydWUiKQp9Cgpjb250YWluZXJfYW5ub3RhdGlvbl9taXNzaW5nKHBfb2NpLCBpX29jaSwga2V5KSB7CiAgICBwcmludCgiY29udGFpbmVyX2Fubm90YXRpb25fbWlzc2luZzoiLCBrZXkpCgogICAgbm90IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIG5vdCBpX29jaS5Bbm5vdGF0aW9uc1trZXldCgogICAgcHJpbnQoImNvbnRhaW5lcl9hbm5vdGF0aW9uX21pc3Npbmc6IHRydWUiKQp9CgphbGxvd19jb250YWluZXJfYW5ub3RhdGlvbihwX29jaSwgaV9vY2ksIGtleSkgewogICAgcHJpbnQoImFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uOiBrZXkgPSIsIGtleSkKCiAgICBwX3ZhbHVlIDo9IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIGlfdmFsdWUgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgcHJpbnQoImFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uOiBwX3ZhbHVlID0iLCBwX3ZhbHVlLCAiaV92YWx1ZSA9IiwgaV92YWx1ZSkKCiAgICBwX3ZhbHVlID09IGlfdmFsdWUKCiAgICBwcmludCgiYWxsb3dfY29udGFpbmVyX2Fubm90YXRpb246IHRydWUiKQp9CgojICJuZXJkY3RsL25ldHdvcmstbmFtZXNwYWNlIiBhbm5vdGF0aW9uCmFsbG93X3NhbmRib3hfbmV0X25hbWVzcGFjZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X25ldF9uYW1lc3BhY2U6IHN0YXJ0IikKCiAgICBrZXkgOj0gIm5lcmRjdGwvbmV0d29yay1uYW1lc3BhY2UiCgogICAgcF9uYW1lc3BhY2UgOj0gcF9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgaV9uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgcHJpbnQoImFsbG93X3NhbmRib3hfbmV0X25hbWVzcGFjZTogcF9uYW1lc3BhY2UgPSIsIHBfbmFtZXNwYWNlLCAiaV9uYW1lc3BhY2UgPSIsIGlfbmFtZXNwYWNlKQoKICAgIHJlZ2V4Lm1hdGNoKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9uZXRfbmFtZXNwYWNlOiB0cnVlIikKfQoKYWxsb3dfbmV0X25hbWVzcGFjZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19uZXRfbmFtZXNwYWNlOiBzdGFydCIpCgogICAga2V5IDo9ICJuZXJkY3RsL25ldHdvcmstbmFtZXNwYWNlIgoKICAgIG5vdCBwX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICBub3QgaV9vY2kuQW5ub3RhdGlvbnNba2V5XQoKICAgIHByaW50KCJhbGxvd19uZXRfbmFtZXNwYWNlOiB0cnVlIikKfQoKIyAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1sb2ctZGlyZWN0b3J5IiBhbm5vdGF0aW9uCmFsbG93X3NhbmRib3hfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X2xvZ19kaXJlY3Rvcnk6IHN0YXJ0IikKCiAgICBrZXkgOj0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbG9nLWRpcmVjdG9yeSIKCiAgICBwX2RpciA6PSBwX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICByZWdleDEgOj0gcmVwbGFjZShwX2RpciwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHJlZ2V4MiA6PSByZXBsYWNlKHJlZ2V4MSwgIiQoc2FuZGJveC1uYW1lc3BhY2UpIiwgc19uYW1lc3BhY2UpCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiByZWdleDIgPSIsIHJlZ2V4MikKCiAgICBpX2RpciA6PSBpX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiBpX2RpciA9IiwgaV9kaXIpCgogICAgcmVnZXgubWF0Y2gocmVnZXgyLCBpX2RpcikKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiB0cnVlIikKfQoKYWxsb3dfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19sb2dfZGlyZWN0b3J5OiBzdGFydCIpCgogICAga2V5IDo9ICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWxvZy1kaXJlY3RvcnkiCgogICAgbm90IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIG5vdCBpX29jaS5Bbm5vdGF0aW9uc1trZXldCgogICAgcHJpbnQoImFsbG93X2xvZ19kaXJlY3Rvcnk6IHRydWUiKQp9CgphbGxvd19kZXZpY2VzKHBfZGV2aWNlcywgaV9kZXZpY2VzKSB7CiAgICBwcmludCgiYWxsb3dfZGV2aWNlczogc3RhcnQiKQogICAgZXZlcnkgaV9kZXZpY2UgaW4gaV9kZXZpY2VzIHsKICAgICAgICBwcmludCgiYWxsb3dfZGV2aWNlczogaV9kZXZpY2UgPSIsIGlfZGV2aWNlKQogICAgICAgIHNvbWUgcF9kZXZpY2UgaW4gcF9kZXZpY2VzCiAgICAgICAgcF9kZXZpY2UuY29udGFpbmVyX3BhdGggPT0gaV9kZXZpY2UuY29udGFpbmVyX3BhdGgKICAgIH0KICAgIHByaW50KCJhbGxvd19kZXZpY2VzOiB0cnVlIikKfQoKYWxsb3dfbGludXgoc3RhdGVfb3BzLCBwX29jaSwgaV9vY2kpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIHBfbmFtZXNwYWNlcyA6PSBwX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbGludXg6IHAgbmFtZXNwYWNlcyA9IiwgcF9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlcyA6PSBpX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbGludXg6IGkgbmFtZXNwYWNlcyA9IiwgaV9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlX3dpdGhvdXRfbmV0d29yayA6PSBbb2JqIHwgb2JqIDo9IGlfbmFtZXNwYWNlc1tfXTsgb2JqLlR5cGUgIT0gIm5ldHdvcmsiXQoKICAgIHByaW50KCJhbGxvd19saW51eDogaV9uYW1lc3BhY2Vfd2l0aG91dF9uZXR3b3JrID0iLCBpX25hbWVzcGFjZV93aXRob3V0X25ldHdvcmspCgogICAgcF9uYW1lc3BhY2VzID09IGlfbmFtZXNwYWNlX3dpdGhvdXRfbmV0d29yawoKICAgIGFsbG93X21hc2tlZF9wYXRocyhwX29jaSwgaV9vY2kpCiAgICBhbGxvd19yZWFkb25seV9wYXRocyhwX29jaSwgaV9vY2kpCiAgICBhbGxvd19saW51eF9kZXZpY2VzKHBfb2NpLkxpbnV4LkRldmljZXMsIGlfb2NpLkxpbnV4LkRldmljZXMpCiAgICBhbGxvd19saW51eF9zeXNjdGwocF9vY2kuTGludXgsIGlfb2NpLkxpbnV4KQogICAgcmV0IDo9IGFsbG93X25ldHdvcmtfbmFtZXNwYWNlX3N0YXJ0KHN0YXRlX29wcywgcF9vY2ksIGlfb2NpKQogICAgcmV0LmFsbG93ZWQKCiAgICBvcHMgOj0gcmV0Lm9wcwoKICAgIHByaW50KCJhbGxvd19saW51eDogdHJ1ZSIpCn0KCiMgUmV0cmlldmUgdGhlICJuZXR3b3JrIiBuYW1lc3BhY2UgZnJvbSB0aGUgaW5wdXQgZGF0YSBhbmQgcGFzcyBpdCBvbiBmb3IgdGhlCiMgbmV0d29yayBuYW1lc3BhY2UgcG9saWN5IGNoZWNrcy4KYWxsb3dfbmV0d29ya19uYW1lc3BhY2Vfc3RhcnQoc3RhdGVfb3BzLCBwX29jaSwgaV9vY2kpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIHByaW50KCJhbGxvd19uZXR3b3JrX25hbWVzcGFjZSBzdGFydDogc3RhcnQiKQoKICAgIHBfbmFtZXNwYWNlcyA6PSBwX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IHAgbmFtZXNwYWNlcyA9IiwgcF9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlcyA6PSBpX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IGkgbmFtZXNwYWNlcyA9IiwgaV9uYW1lc3BhY2VzKQoKICAgICMgUmV0dXJuIHBhdGggb2YgdGhlICJuZXR3b3JrIiBuYW1lc3BhY2UKICAgIG5ldHdvcmtfbnMgOj0gW29iaiB8IG9iaiA6PSBpX25hbWVzcGFjZXNbX107IG9iai5UeXBlID09ICJuZXR3b3JrIl0KCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IG5ldHdvcmtfbnMgPSIsIG5ldHdvcmtfbnMpCgogICAgcmV0IDo9IGFsbG93X25ldHdvcmtfbmFtZXNwYWNlKHN0YXRlX29wcywgbmV0d29ya19ucykKICAgIHJldC5hbGxvd2VkCgogICAgb3BzIDo9IHJldC5vcHMKfQoKIyBUaGlzIHJ1bGUgaXMgd2hlbiB0aGVyZSdzIG5vIG5ldHdvcmsgbmFtZXNwYWNlIGluIHRoZSBpbnB1dCBkYXRhLgphbGxvd19uZXR3b3JrX25hbWVzcGFjZShzdGF0ZV9vcHMsIG5ldHdvcmtfbnMpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIGNvdW50KG5ldHdvcmtfbnMpID09IDAKCiAgICBuZXR3b3JrX25zX3BhdGggPSAiIgoKICAgIGFkZF9uZXR3b3JrX25hbWVzcGFjZV90b19zdGF0ZSA6PSBzdGF0ZV9hbGxvd3MoIm5ldHdvcmtfbmFtZXNwYWNlIiwgbmV0d29ya19uc19wYXRoKQogICAgb3BzIDo9IGNvbmNhdF9vcF9pZl9ub3RfbnVsbChzdGF0ZV9vcHMsIGFkZF9uZXR3b3JrX25hbWVzcGFjZV90b19zdGF0ZSkKCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2UgMTogdHJ1ZSIpCn0KCiMgVGhpcyBydWxlIGlzIHdoZW4gdGhlcmUncyBleGFjdGx5IG9uZSBuZXR3b3JrIG5hbWVzcGFjZSBpbiB0aGUgaW5wdXQgZGF0YS4KYWxsb3dfbmV0d29ya19uYW1lc3BhY2Uoc3RhdGVfb3BzLCBuZXR3b3JrX25zKSA6PSB7Im9wcyI6IG9wcywgImFsbG93ZWQiOiB0cnVlfSB7CiAgICBjb3VudChuZXR3b3JrX25zKSA9PSAxCgogICAgYWRkX25ldHdvcmtfbmFtZXNwYWNlX3RvX3N0YXRlIDo9IHN0YXRlX2FsbG93cygibmV0d29ya19uYW1lc3BhY2UiLCBuZXR3b3JrX25zWzBdLlBhdGgpCiAgICBvcHMgOj0gY29uY2F0X29wX2lmX25vdF9udWxsKHN0YXRlX29wcywgYWRkX25ldHdvcmtfbmFtZXNwYWNlX3RvX3N0YXRlKQoKICAgIHByaW50KCJhbGxvd19uZXR3b3JrX25hbWVzcGFjZSAyOiB0cnVlIikKfQoKYWxsb3dfbWFza2VkX3BhdGhzKHBfb2NpLCBpX29jaSkgewogICAgcF9wYXRocyA6PSBwX29jaS5MaW51eC5NYXNrZWRQYXRocwogICAgcHJpbnQoImFsbG93X21hc2tlZF9wYXRocyAxOiBwX3BhdGhzID0iLCBwX3BhdGhzKQoKICAgIGlfcGF0aHMgOj0gaV9vY2kuTGludXguTWFza2VkUGF0aHMKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aHMgMTogaV9wYXRocyA9IiwgaV9wYXRocykKCiAgICBhbGxvd19tYXNrZWRfcGF0aHNfYXJyYXkocF9wYXRocywgaV9wYXRocykKCiAgICBwcmludCgiYWxsb3dfbWFza2VkX3BhdGhzIDE6IHRydWUiKQp9CmFsbG93X21hc2tlZF9wYXRocyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aHMgMjogc3RhcnQiKQoKICAgIG5vdCBwX29jaS5MaW51eC5NYXNrZWRQYXRocwogICAgbm90IGlfb2NpLkxpbnV4Lk1hc2tlZFBhdGhzCgogICAgcHJpbnQoImFsbG93X21hc2tlZF9wYXRocyAyOiB0cnVlIikKfQoKIyBBbGwgdGhlIHBvbGljeSBtYXNrZWQgcGF0aHMgbXVzdCBiZSBtYXNrZWQgaW4gdGhlIGlucHV0IGRhdGEgdG9vLgojIElucHV0IGlzIGFsbG93ZWQgdG8gaGF2ZSBtb3JlIG1hc2tlZCBwYXRocyB0aGFuIHRoZSBwb2xpY3kuCmFsbG93X21hc2tlZF9wYXRoc19hcnJheShwX2FycmF5LCBpX2FycmF5KSB7CiAgICBldmVyeSBwX2VsZW0gaW4gcF9hcnJheSB7CiAgICAgICAgYWxsb3dfbWFza2VkX3BhdGgocF9lbGVtLCBpX2FycmF5KQogICAgfQp9CgphbGxvd19tYXNrZWRfcGF0aChwX2VsZW0sIGlfYXJyYXkpIHsKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aDogcF9lbGVtID0iLCBwX2VsZW0pCgogICAgc29tZSBpX2VsZW0gaW4gaV9hcnJheQogICAgcF9lbGVtID09IGlfZWxlbQoKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aDogdHJ1ZSIpCn0KCmFsbG93X3JlYWRvbmx5X3BhdGhzKHBfb2NpLCBpX29jaSkgewogICAgcF9wYXRocyA6PSBwX29jaS5MaW51eC5SZWFkb25seVBhdGhzCiAgICBwcmludCgiYWxsb3dfcmVhZG9ubHlfcGF0aHMgMTogcF9wYXRocyA9IiwgcF9wYXRocykKCiAgICBpX3BhdGhzIDo9IGlfb2NpLkxpbnV4LlJlYWRvbmx5UGF0aHMKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAxOiBpX3BhdGhzID0iLCBpX3BhdGhzKQoKICAgIGFsbG93X3JlYWRvbmx5X3BhdGhzX2FycmF5KHBfcGF0aHMsIGlfcGF0aHMsIGlfb2NpLkxpbnV4Lk1hc2tlZFBhdGhzKQoKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAxOiB0cnVlIikKfQphbGxvd19yZWFkb25seV9wYXRocyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAyOiBzdGFydCIpCgogICAgbm90IHBfb2NpLkxpbnV4LlJlYWRvbmx5UGF0aHMKICAgIG5vdCBpX29jaS5MaW51eC5SZWFkb25seVBhdGhzCgogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGhzIDI6IHRydWUiKQp9CgojIEFsbCB0aGUgcG9saWN5IHJlYWRvbmx5IHBhdGhzIG11c3QgYmUgZWl0aGVyOgojIC0gUHJlc2VudCBpbiB0aGUgaW5wdXQgcmVhZG9ubHkgcGF0aHMsIG9yCiMgLSBQcmVzZW50IGluIHRoZSBpbnB1dCBtYXNrZWQgcGF0aHMuCiMgSW5wdXQgaXMgYWxsb3dlZCB0byBoYXZlIG1vcmUgcmVhZG9ubHkgcGF0aHMgdGhhbiB0aGUgcG9saWN5LgphbGxvd19yZWFkb25seV9wYXRoc19hcnJheShwX2FycmF5LCBpX2FycmF5LCBtYXNrZWRfcGF0aHMpIHsKICAgIGV2ZXJ5IHBfZWxlbSBpbiBwX2FycmF5IHsKICAgICAgICBhbGxvd19yZWFkb25seV9wYXRoKHBfZWxlbSwgaV9hcnJheSwgbWFza2VkX3BhdGhzKQogICAgfQp9CgphbGxvd19yZWFkb25seV9wYXRoKHBfZWxlbSwgaV9hcnJheSwgbWFza2VkX3BhdGhzKSB7CiAgICBwcmludCgiYWxsb3dfcmVhZG9ubHlfcGF0aCAxOiBwX2VsZW0gPSIsIHBfZWxlbSkKCiAgICBzb21lIGlfZWxlbSBpbiBpX2FycmF5CiAgICBwX2VsZW0gPT0gaV9lbGVtCgogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGggMTogdHJ1ZSIpCn0KYWxsb3dfcmVhZG9ubHlfcGF0aChwX2VsZW0sIGlfYXJyYXksIG1hc2tlZF9wYXRocykgewogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGggMjogcF9lbGVtID0iLCBwX2VsZW0pCgogICAgc29tZSBpX21hc2tlZCBpbiBtYXNrZWRfcGF0aHMKICAgIHBfZWxlbSA9PSBpX21hc2tlZAoKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRoIDI6IHRydWUiKQp9CgphbGxvd19saW51eF9kZXZpY2VzKHBfZGV2aWNlcywgaV9kZXZpY2VzKSB7CiAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogc3RhcnQiKQogICAgZXZlcnkgaV9kZXZpY2UgaW4gaV9kZXZpY2VzIHsKICAgICAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogaV9kZXZpY2UgPSIsIGlfZGV2aWNlKQogICAgICAgIHNvbWUgcF9kZXZpY2UgaW4gcF9kZXZpY2VzCiAgICAgICAgaV9kZXZpY2UuUGF0aCA9PSBwX2RldmljZS5QYXRoCiAgICB9CiAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogdHJ1ZSIpCn0KCmFsbG93X2xpbnV4X3N5c2N0bChwX2xpbnV4LCBpX2xpbnV4KSB7CiAgICBwcmludCgiYWxsb3dfbGludXhfc3lzY3RsIDE6IHN0YXJ0IikKICAgIG5vdCBpX2xpbnV4LlN5c2N0bAogICAgcHJpbnQoImFsbG93X2xpbnV4X3N5c2N0bCAxOiB0cnVlIikKfQoKYWxsb3dfbGludXhfc3lzY3RsKHBfbGludXgsIGlfbGludXgpIHsKICAgIHByaW50KCJhbGxvd19saW51eF9zeXNjdGwgMjogc3RhcnQiKQogICAgcF9zeXNjdGwgOj0gcF9saW51eC5TeXNjdGwKICAgIGlfc3lzY3RsIDo9IGlfbGludXguU3lzY3RsCiAgICBldmVyeSBpX25hbWUsIGlfdmFsIGluIGlfc3lzY3RsIHsKICAgICAgICBwcmludCgiYWxsb3dfbGludXhfc3lzY3RsIDI6IGlfbmFtZSA9IiwgaV9uYW1lLCAiaV92YWwgPSIsIGlfdmFsKQogICAgICAgIHBfc3lzY3RsW2lfbmFtZV0gPT0gaV92YWwKICAgIH0KICAgIHByaW50KCJhbGxvd19saW51eF9zeXNjdGwgMjogdHJ1ZSIpCn0KCiMgQ2hlY2sgdGhlIGNvbnNpc3RlbmN5IG9mIHRoZSBpbnB1dCAiaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5idW5kbGVfcGF0aCIKIyBhbmQgaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCIgdmFsdWVzIHdpdGggb3RoZXIgZmllbGRzLgphbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZChwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpIHsKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogc3RhcnQiKQoKICAgIGJ1bmRsZV9wYXRoIDo9IGlfb2NpLkFubm90YXRpb25zWyJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmJ1bmRsZV9wYXRoIl0KICAgIGJ1bmRsZV9pZCA6PSByZXBsYWNlKGJ1bmRsZV9wYXRoLCAiL3J1bi9jb250YWluZXJkL2lvLmNvbnRhaW5lcmQucnVudGltZS52Mi50YXNrL2s4cy5pby8iLCAiIikKCiAgICBidW5kbGVfaWRfZm9ybWF0IDo9IGNvbmNhdCgiIiwgWyJeIiwgQlVORExFX0lELCAiJCJdKQogICAgcmVnZXgubWF0Y2goYnVuZGxlX2lkX2Zvcm1hdCwgYnVuZGxlX2lkKQoKICAgIGtleSA6PSAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCIKCiAgICBwX3JlZ2V4IDo9IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIHNhbmRib3hfaWQgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQoKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogc2FuZGJveF9pZCA9Iiwgc2FuZGJveF9pZCwgInJlZ2V4ID0iLCBwX3JlZ2V4KQogICAgcmVnZXgubWF0Y2gocF9yZWdleCwgc2FuZGJveF9pZCkKCiAgICBhbGxvd19yb290X3BhdGgocF9vY2ksIGlfb2NpLCBidW5kbGVfaWQpCgogICAgZXZlcnkgaV9tb3VudCBpbiBpX29jaS5Nb3VudHMgewogICAgICAgIGFsbG93X21vdW50KHBfb2NpLCBpX21vdW50LCBpX3N0b3JhZ2VzLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpCiAgICB9CgogICAgYWxsb3dfc3RvcmFnZXMocF9zdG9yYWdlcywgaV9zdG9yYWdlcywgYnVuZGxlX2lkLCBzYW5kYm94X2lkKQoKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogdHJ1ZSIpCn0KCmFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHBfcHJvY2VzcyA9IiwgcF9wcm9jZXNzKQogICAgcHJpbnQoImFsbG93X3Byb2Nlc3NfY29tbW9uOiBpX3Byb2Nlc3MgPSAiLCBpX3Byb2Nlc3MpCiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHNfbmFtZSA9Iiwgc19uYW1lKQoKICAgIHBfcHJvY2Vzcy5Dd2QgPT0gaV9wcm9jZXNzLkN3ZAogICAgcF9wcm9jZXNzLk5vTmV3UHJpdmlsZWdlcyA9PSBpX3Byb2Nlc3MuTm9OZXdQcml2aWxlZ2VzCgogICAgYWxsb3dfdXNlcihwX3Byb2Nlc3MsIGlfcHJvY2VzcykKICAgIGFsbG93X2VudihwX3Byb2Nlc3MsIGlfcHJvY2Vzcywgc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHRydWUiKQp9CgojIENvbXBhcmUgdGhlIE9DSSBQcm9jZXNzIGZpZWxkIG9mIGEgcG9saWN5IGNvbnRhaW5lciB3aXRoIHRoZSBpbnB1dCBPQ0kgUHJvY2VzcyBmcm9tIGEgQ3JlYXRlQ29udGFpbmVyUmVxdWVzdAphbGxvd19wcm9jZXNzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfcHJvY2Vzczogc3RhcnQiKQoKICAgIGFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgYWxsb3dfY2FwcyhwX3Byb2Nlc3MuQ2FwYWJpbGl0aWVzLCBpX3Byb2Nlc3MuQ2FwYWJpbGl0aWVzKQogICAgcF9wcm9jZXNzLlRlcm1pbmFsID09IGlfcHJvY2Vzcy5UZXJtaW5hbAoKICAgIHByaW50KCJhbGxvd19wcm9jZXNzOiB0cnVlIikKfQoKIyBDb21wYXJlIHRoZSBPQ0kgUHJvY2VzcyBmaWVsZCBvZiBhIHBvbGljeSBjb250YWluZXIgd2l0aCB0aGUgaW5wdXQgcHJvY2VzcyBmaWVsZCBmcm9tIEV4ZWNQcm9jZXNzUmVxdWVzdAphbGxvd19pbnRlcmFjdGl2ZV9wcm9jZXNzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfaW50ZXJhY3RpdmVfcHJvY2Vzczogc3RhcnQiKQoKICAgIGFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgYWxsb3dfZXhlY19jYXBzKGlfcHJvY2Vzcy5DYXBhYmlsaXRpZXMpCgogICAgIyBUaGVzZSBhcmUgY29tbWFuZHMgZW5hYmxlZCB1c2luZyBFeGVjUHJvY2Vzc1JlcXVlc3QgY29tbWFuZHMgYW5kL29yIHJlZ2V4IGZyb20gdGhlIHNldHRpbmdzIGZpbGUuCiAgICAjIFRoZXkgY2FuIGJlIGV4ZWN1dGVkIGludGVyYWN0aXZlbHkgc28gYWxsb3cgdGhlbSB0byB1c2UgYW55IHZhbHVlIGZvciBpX3Byb2Nlc3MuVGVybWluYWwuCgogICAgcHJpbnQoImFsbG93X2ludGVyYWN0aXZlX3Byb2Nlc3M6IHRydWUiKQp9CgojIENvbXBhcmUgdGhlIE9DSSBQcm9jZXNzIGZpZWxkIG9mIGEgcG9saWN5IGNvbnRhaW5lciB3aXRoIHRoZSBpbnB1dCBwcm9jZXNzIGZpZWxkIGZyb20gRXhlY1Byb2Nlc3NSZXF1ZXN0CmFsbG93X3Byb2JlX3Byb2Nlc3MocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19wcm9iZV9wcm9jZXNzOiBzdGFydCIpCgogICAgYWxsb3dfcHJvY2Vzc19jb21tb24ocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpCiAgICBhbGxvd19leGVjX2NhcHMoaV9wcm9jZXNzLkNhcGFiaWxpdGllcykKICAgIHBfcHJvY2Vzcy5UZXJtaW5hbCA9PSBpX3Byb2Nlc3MuVGVybWluYWwKCiAgICBwcmludCgiYWxsb3dfcHJvYmVfcHJvY2VzczogdHJ1ZSIpCn0KCmFsbG93X3VzZXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MpIHsKICAgIHBfdXNlciA6PSBwX3Byb2Nlc3MuVXNlcgogICAgaV91c2VyIDo9IGlfcHJvY2Vzcy5Vc2VyCgogICAgcHJpbnQoImFsbG93X3VzZXI6IGlucHV0IHVpZCA9IiwgaV91c2VyLlVJRCwgInBvbGljeSB1aWQgPSIsIHBfdXNlci5VSUQpCiAgICBwX3VzZXIuVUlEID09IGlfdXNlci5VSUQKCiAgICAjIFRPRE86IHRyYWNrIGRvd24gdGhlIHJlYXNvbiBmb3IgcmVnaXN0cnkuazhzLmlvL3BhdXNlOjMuOSBiZWluZwogICAgIyAgICAgICBleGVjdXRlZCB3aXRoIGdpZCA9IDAgZGVzcGl0ZSBoYXZpbmcgIjY1NTM1OjY1NTM1IiBpbiBpdHMgY29udGFpbmVyIGltYWdlCiAgICAjICAgICAgIGNvbmZpZy4KICAgICNwcmludCgiYWxsb3dfdXNlcjogaW5wdXQgZ2lkID0iLCBpX3VzZXIuR0lELCAicG9saWN5IGdpZCA9IiwgcF91c2VyLkdJRCkKICAgICNwX3VzZXIuR0lEID09IGlfdXNlci5HSUQKCiAgICAjIFRPRE86IGNvbXBhcmUgdGhlIGFkZGl0aW9uYWxHaWRzIGZpZWxkIHRvbyBhZnRlciBjb21wdXRpbmcgaXRzIHZhbHVlCiAgICAjIGJhc2VkIG9uIC9ldGMvcGFzc3dkIGFuZCAvZXRjL2dyb3VwIGZyb20gdGhlIGNvbnRhaW5lciBpbWFnZS4KfQoKYWxsb3dfZGVwcmVjYXRlZF9hcmdzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZ3MgMTogbm8gYXJncyIpCgogICAgbm90IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJncwogICAgbm90IGlfcHJvY2Vzcy5BcmdzCgogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAxOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZ3MocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSkgewogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiBwb2xpY3kgYXJncyA9IiwgcF9wcm9jZXNzLkRlcHJlY2F0ZWRBcmdzKQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiBpbnB1dCBhcmdzID0iLCBpX3Byb2Nlc3MuQXJncykKCiAgICBjb3VudChwX3Byb2Nlc3MuRGVwcmVjYXRlZEFyZ3MpID09IGNvdW50KGlfcHJvY2Vzcy5BcmdzKQoKICAgIGV2ZXJ5IGksIGlfYXJnIGluIGlfcHJvY2Vzcy5BcmdzIHsKICAgICAgICBhbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpCiAgICB9CgogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDE6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgcF9hcmcyIDo9IHJlcGxhY2UocF9hcmcsICIkJCIsICIkIikKICAgIHBfYXJnMiA9PSBpX2FyZwoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAxOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDI6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgIyBUT0RPOiBjYW4gJChub2RlLW5hbWUpIGJlIGhhbmRsZWQgYmV0dGVyPwogICAgY29udGFpbnMocF9hcmcsICIkKG5vZGUtbmFtZSkiKQoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAyOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDM6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgcF9hcmcyIDo9IHJlcGxhY2UocF9hcmcsICIkJCIsICIkIikKICAgIHBfYXJnMyA6PSByZXBsYWNlKHBfYXJnMiwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAzOiBwX2FyZzMgPSIsIHBfYXJnMykKICAgIHBfYXJnMyA9PSBpX2FyZwoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAzOiB0cnVlIikKfQoKIyBPQ0kgcHJvY2Vzcy5FbnYgZmllbGQKYWxsb3dfZW52KHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfZW52OiBwIGVudiA9IiwgcF9wcm9jZXNzLkVudikKICAgIHByaW50KCJhbGxvd19lbnY6IGkgZW52ID0iLCBpX3Byb2Nlc3MuRW52KQoKICAgIGV2ZXJ5IGlfdmFyIGluIGlfcHJvY2Vzcy5FbnYgewogICAgICAgIHByaW50KCJhbGxvd19lbnY6IGlfdmFyID0iLCBpX3ZhcikKICAgICAgICBhbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgfQoKICAgIHByaW50KCJhbGxvd19lbnY6IHRydWUiKQp9CgojIEFsbG93IGlucHV0IGVudiB2YXJpYWJsZXMgdGhhdCBhcmUgcHJlc2VudCBpbiB0aGUgcG9saWN5IGRhdGEgdG9vLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHBfdmFyID09IGlfdmFyCiAgICBwcmludCgiYWxsb3dfdmFyIDE6IHRydWUiKQp9CgojIE1hdGNoIGlucHV0IHdpdGggb25lIG9mIHRoZSBwb2xpY3kgdmFyaWFibGVzLCBhZnRlciBzdWJzdGl0dXRpbmcgJChzYW5kYm94LW5hbWUpLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHByaW50KCJhbGxvd192YXIgMjogcF92YXIgPSIsIHBfdmFyKQoKICAgIHBfdmFyX3NwbGl0IDo9IHNwbGl0KHBfdmFyLCAiPSIpCiAgICBjb3VudChwX3Zhcl9zcGxpdCkgPT0gMgoKICAgIHBfdmFyX3NwbGl0WzFdID09ICIkKHNhbmRib3gtbmFtZSkiCgogICAgaV92YXJfc3BsaXQgOj0gc3BsaXQoaV92YXIsICI9IikKICAgIGNvdW50KGlfdmFyX3NwbGl0KSA9PSAyCgogICAgaV92YXJfc3BsaXRbMF0gPT0gcF92YXJfc3BsaXRbMF0KICAgIHJlZ2V4Lm1hdGNoKHNfbmFtZSwgaV92YXJfc3BsaXRbMV0pCgogICAgcHJpbnQoImFsbG93X3ZhciAyOiB0cnVlIikKfQoKIyBBbGxvdyBpbnB1dCBlbnYgdmFyaWFibGVzIHRoYXQgbWF0Y2ggd2l0aCBhIHJlcXVlc3RfZGVmYXVsdHMgcmVnZXguCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHNvbWUgcF9yZWdleDEgaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5DcmVhdGVDb250YWluZXJSZXF1ZXN0LmFsbG93X2Vudl9yZWdleAogICAgcF9yZWdleDIgOj0gcmVwbGFjZShwX3JlZ2V4MSwgIiQoaXB2NF9hKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcHY0X2EpCiAgICBwX3JlZ2V4MyA6PSByZXBsYWNlKHBfcmVnZXgyLCAiJChpcF9wKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcF9wKQogICAgcF9yZWdleDQgOj0gcmVwbGFjZShwX3JlZ2V4MywgIiQoc3ZjX25hbWUpIiwgcG9saWN5X2RhdGEuY29tbW9uLnN2Y19uYW1lKQogICAgcF9yZWdleDUgOj0gcmVwbGFjZShwX3JlZ2V4NCwgIiQoZG5zX2xhYmVsKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5kbnNfbGFiZWwpCgogICAgcHJpbnQoImFsbG93X3ZhciAzOiBwX3JlZ2V4NSA9IiwgcF9yZWdleDUpCiAgICByZWdleC5tYXRjaChwX3JlZ2V4NSwgaV92YXIpCgogICAgcHJpbnQoImFsbG93X3ZhciAzOiB0cnVlIikKfQoKIyBBbGxvdyBmaWVsZFJlZiAiZmllbGRQYXRoOiBzdGF0dXMucG9kSVAiIHZhbHVlcy4KYWxsb3dfdmFyKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBpX3Zhciwgc19uYW1lLCBzX25hbWVzcGFjZSkgewogICAgbmFtZV92YWx1ZSA6PSBzcGxpdChpX3ZhciwgIj0iKQogICAgY291bnQobmFtZV92YWx1ZSkgPT0gMgogICAgaXNfaXAobmFtZV92YWx1ZVsxXSkKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIGFsbG93X3BvZF9pcF92YXIobmFtZV92YWx1ZVswXSwgcF92YXIpCgogICAgcHJpbnQoImFsbG93X3ZhciA0OiB0cnVlIikKfQoKIyBBbGxvdyBjb21tb24gZmllbGRSZWYgdmFyaWFibGVzLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBuYW1lX3ZhbHVlIDo9IHNwbGl0KGlfdmFyLCAiPSIpCiAgICBjb3VudChuYW1lX3ZhbHVlKSA9PSAyCgogICAgc29tZSBwX3ZhciBpbiBwX3Byb2Nlc3MuRW52CiAgICBwX25hbWVfdmFsdWUgOj0gc3BsaXQocF92YXIsICI9IikKICAgIGNvdW50KHBfbmFtZV92YWx1ZSkgPT0gMgoKICAgIHBfbmFtZV92YWx1ZVswXSA9PSBuYW1lX3ZhbHVlWzBdCgogICAgIyBUT0RPOiBzaG91bGQgdGhlc2UgYmUgaGFuZGxlZCBpbiBhIGRpZmZlcmVudCB3YXk/CiAgICBhbHdheXNfYWxsb3dlZCA6PSBbIiQoaG9zdC1uYW1lKSIsICIkKG5vZGUtbmFtZSkiLCAiJChwb2QtdWlkKSJdCiAgICBzb21lIGFsbG93ZWQgaW4gYWx3YXlzX2FsbG93ZWQKICAgIGNvbnRhaW5zKHBfbmFtZV92YWx1ZVsxXSwgYWxsb3dlZCkKCiAgICBwcmludCgiYWxsb3dfdmFyIDU6IHRydWUiKQp9CgojIEFsbG93IGZpZWxkUmVmICJmaWVsZFBhdGg6IHN0YXR1cy5ob3N0SVAiIHZhbHVlcy4KYWxsb3dfdmFyKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBpX3Zhciwgc19uYW1lLCBzX25hbWVzcGFjZSkgewogICAgbmFtZV92YWx1ZSA6PSBzcGxpdChpX3ZhciwgIj0iKQogICAgY291bnQobmFtZV92YWx1ZSkgPT0gMgogICAgaXNfaXAobmFtZV92YWx1ZVsxXSkKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIGFsbG93X2hvc3RfaXBfdmFyKG5hbWVfdmFsdWVbMF0sIHBfdmFyKQoKICAgIHByaW50KCJhbGxvd192YXIgNjogdHJ1ZSIpCn0KCiMgQWxsb3cgcmVzb3VyY2VGaWVsZFJlZiB2YWx1ZXMgKGUuZy4sICJsaW1pdHMuY3B1IikuCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIG5hbWVfdmFsdWUgOj0gc3BsaXQoaV92YXIsICI9IikKICAgIGNvdW50KG5hbWVfdmFsdWUpID09IDIKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHBfbmFtZV92YWx1ZSA6PSBzcGxpdChwX3ZhciwgIj0iKQogICAgY291bnQocF9uYW1lX3ZhbHVlKSA9PSAyCgogICAgcF9uYW1lX3ZhbHVlWzBdID09IG5hbWVfdmFsdWVbMF0KCiAgICAjIGEgdmFyaWFibGUgd2Ugc2hvdWxkIGJlIHZhbGlkYXRpbmcgdXNpbmcgYSByZWdleCBmcm9tIHNldHRpbmdzCiAgICBwX25hbWVfdmFsdWVbMV0gPT0gIiQodmFsaWRhdGUtZnJvbS1zZXR0aW5ncykiCgogICAgcmVnZXhfdmFsIDo9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuQ3JlYXRlQ29udGFpbmVyUmVxdWVzdC5hbGxvd19lbnZfcmVnZXhfbWFwW25hbWVfdmFsdWVbMF1dCgogICAgcHJpbnQoImFsbG93X3ZhciA3OiB2YWwgPSIsIG5hbWVfdmFsdWVbMV0pCiAgICBwcmludCgiYWxsb3dfdmFyIDc6IHJlZ2V4X3ZhbCA9IiwgcmVnZXhfdmFsKQoKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4X3ZhbCwgbmFtZV92YWx1ZVsxXSkKCiAgICBwcmludCgiYWxsb3dfdmFyIDc6IHRydWUiKQp9CgojIE1hdGNoIGlucHV0IHdpdGggb25lIG9mIHRoZSBwb2xpY3kgdmFyaWFibGVzLCBhZnRlciBzdWJzdGl0dXRpbmcgJChzYW5kYm94LW5hbWVzcGFjZSkuCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHNvbWUgcF92YXIgaW4gcF9wcm9jZXNzLkVudgogICAgcF92YXIyIDo9IHJlcGxhY2UocF92YXIsICIkKHNhbmRib3gtbmFtZXNwYWNlKSIsIHNfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd192YXIgODogcF92YXIyID0iLCBwX3ZhcjIpCiAgICBwX3ZhcjIgPT0gaV92YXIKCiAgICBwcmludCgiYWxsb3dfdmFyIDg6IHRydWUiKQp9CgphbGxvd19wb2RfaXBfdmFyKHZhcl9uYW1lLCBwX3ZhcikgewogICAgcHJpbnQoImFsbG93X3BvZF9pcF92YXI6IHZhcl9uYW1lID0iLCB2YXJfbmFtZSwgInBfdmFyID0iLCBwX3ZhcikKCiAgICBwX25hbWVfdmFsdWUgOj0gc3BsaXQocF92YXIsICI9IikKICAgIGNvdW50KHBfbmFtZV92YWx1ZSkgPT0gMgoKICAgIHBfbmFtZV92YWx1ZVswXSA9PSB2YXJfbmFtZQogICAgcF9uYW1lX3ZhbHVlWzFdID09ICIkKHBvZC1pcCkiCgogICAgcHJpbnQoImFsbG93X3BvZF9pcF92YXI6IHRydWUiKQp9CgphbGxvd19ob3N0X2lwX3Zhcih2YXJfbmFtZSwgcF92YXIpIHsKICAgIHByaW50KCJhbGxvd19ob3N0X2lwX3ZhcjogdmFyX25hbWUgPSIsIHZhcl9uYW1lLCAicF92YXIgPSIsIHBfdmFyKQoKICAgIHBfbmFtZV92YWx1ZSA6PSBzcGxpdChwX3ZhciwgIj0iKQogICAgY291bnQocF9uYW1lX3ZhbHVlKSA9PSAyCgogICAgcF9uYW1lX3ZhbHVlWzBdID09IHZhcl9uYW1lCiAgICBwX25hbWVfdmFsdWVbMV0gPT0gIiQoaG9zdC1pcCkiCgogICAgcHJpbnQoImFsbG93X2hvc3RfaXBfdmFyOiB0cnVlIikKfQoKaXNfaXAodmFsdWUpIHsKICAgIGJ5dGVzID0gc3BsaXQodmFsdWUsICIuIikKICAgIGNvdW50KGJ5dGVzKSA9PSA0CgogICAgaXNfaXBfZmlyc3RfYnl0ZShieXRlc1swXSkKICAgIGlzX2lwX290aGVyX2J5dGUoYnl0ZXNbMV0pCiAgICBpc19pcF9vdGhlcl9ieXRlKGJ5dGVzWzJdKQogICAgaXNfaXBfb3RoZXJfYnl0ZShieXRlc1szXSkKfQppc19pcF9maXJzdF9ieXRlKGNvbXBvbmVudCkgewogICAgbnVtYmVyID0gdG9fbnVtYmVyKGNvbXBvbmVudCkKICAgIG51bWJlciA+PSAxCiAgICBudW1iZXIgPD0gMjU1Cn0KaXNfaXBfb3RoZXJfYnl0ZShjb21wb25lbnQpIHsKICAgIG51bWJlciA9IHRvX251bWJlcihjb21wb25lbnQpCiAgICBudW1iZXIgPj0gMAogICAgbnVtYmVyIDw9IDI1NQp9CgojIE9DSSByb290LlBhdGgKYWxsb3dfcm9vdF9wYXRoKHBfb2NpLCBpX29jaSwgYnVuZGxlX2lkKSB7CiAgICBpX3BhdGggOj0gaV9vY2kuUm9vdC5QYXRoCiAgICBwX3BhdGgxIDo9IHBfb2NpLlJvb3QuUGF0aAogICAgcHJpbnQoImFsbG93X3Jvb3RfcGF0aDogaV9wYXRoID0iLCBpX3BhdGgsICJwX3BhdGgxID0iLCBwX3BhdGgxKQoKICAgIHBfcGF0aDIgOj0gcmVwbGFjZShwX3BhdGgxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfcm9vdF9wYXRoOiBwX3BhdGgyID0iLCBwX3BhdGgyKQoKICAgIHBfcGF0aDMgOj0gcmVwbGFjZShwX3BhdGgyLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X3Jvb3RfcGF0aDogcF9wYXRoMyA9IiwgcF9wYXRoMykKCiAgICBwX3BhdGgzID09IGlfcGF0aAoKICAgIHByaW50KCJhbGxvd19yb290X3BhdGg6IHRydWUiKQp9CgojIGRldmljZSBtb3VudHMKYWxsb3dfbW91bnQocF9vY2ksIGlfbW91bnQsIGlfc3RvcmFnZXMsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcHJpbnQoImFsbG93X21vdW50OiBpX21vdW50ID0iLCBpX21vdW50KQoKICAgIHNvbWUgcF9tb3VudCBpbiBwX29jaS5Nb3VudHMKICAgIHNvbWUgaV9zdG9yYWdlIGluIGlfc3RvcmFnZXMKCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IHBfbW91bnQgPSIsIHBfbW91bnQpCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IGlfc3RvcmFnZSA9IiwgaV9zdG9yYWdlKQoKICAgIGNoZWNrX21vdW50KHBfbW91bnQsIGlfbW91bnQsIGlfc3RvcmFnZSwgYnVuZGxlX2lkLCBzYW5kYm94X2lkKQoKICAgICMgVE9ETzogYXJlIHRoZXJlIGFueSBvdGhlciByZXF1aXJlZCBwb2xpY3kgY2hlY2tzIGZvciBtb3VudHMgLSBlLmcuLAogICAgIyAgICAgICBtdWx0aXBsZSBtb3VudHMgd2l0aCBzYW1lIHNvdXJjZSBvciBkZXN0aW5hdGlvbj8KCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IHRydWUiKQp9CgpjaGVja19tb3VudChwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcF9tb3VudCA9PSBpX21vdW50CiAgICBwcmludCgiY2hlY2tfbW91bnQgMTogdHJ1ZSIpCn0KY2hlY2tfbW91bnQocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHBfbW91bnQuZGVzdGluYXRpb24gPT0gaV9tb3VudC5kZXN0aW5hdGlvbgogICAgcF9tb3VudC50eXBlXyA9PSBpX21vdW50LnR5cGVfCiAgICBwX21vdW50Lm9wdGlvbnMgPT0gaV9tb3VudC5vcHRpb25zCgogICAgbW91bnRfc291cmNlX2FsbG93cyhwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkKCiAgICBwcmludCgiY2hlY2tfbW91bnQgMjogdHJ1ZSIpCn0KCm1vdW50X3NvdXJjZV9hbGxvd3MocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHJlZ2V4MSA6PSBwX21vdW50LnNvdXJjZQogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5tb3VudF9zb3VyY2VfY3BhdGgpCiAgICByZWdleDQgOj0gcmVwbGFjZShyZWdleDMsICIkKGJ1bmRsZS1pZCkiLCBidW5kbGVfaWQpCgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMTogcmVnZXg0ID0iLCByZWdleDQpCiAgICByZWdleC5tYXRjaChyZWdleDQsIGlfbW91bnQuc291cmNlKQoKICAgIHByaW50KCJtb3VudF9zb3VyY2VfYWxsb3dzIDE6IHRydWUiKQp9Cm1vdW50X3NvdXJjZV9hbGxvd3MocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHJlZ2V4MSA6PSBwX21vdW50LnNvdXJjZQogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5tb3VudF9zb3VyY2VfY3BhdGgpCiAgICByZWdleDQgOj0gcmVwbGFjZShyZWdleDMsICIkKHNhbmRib3gtaWQpIiwgc2FuZGJveF9pZCkKCiAgICBwcmludCgibW91bnRfc291cmNlX2FsbG93cyAyOiByZWdleDQgPSIsIHJlZ2V4NCkKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4NCwgaV9tb3VudC5zb3VyY2UpCgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMjogdHJ1ZSIpCn0KbW91bnRfc291cmNlX2FsbG93cyhwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogaV9tb3VudC5zb3VyY2UgPSIsIGlfbW91bnQuc291cmNlKQogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogaV9zdG9yYWdlLm1vdW50X3BvaW50ID0iLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCgogICAgaV9tb3VudC5zb3VyY2UgPT0gaV9zdG9yYWdlLm1vdW50X3BvaW50CgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogdHJ1ZSIpCn0KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBDcmVhdGUgY29udGFpbmVyIFN0b3JhZ2VzCgphbGxvd19zdG9yYWdlcyhwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHBfY291bnQgOj0gY291bnQocF9zdG9yYWdlcykKICAgIGlfY291bnQgOj0gY291bnQoaV9zdG9yYWdlcykKICAgIHByaW50KCJhbGxvd19zdG9yYWdlczogcF9jb3VudCA9IiwgcF9jb3VudCwgImlfY291bnQgPSIsIGlfY291bnQpCgogICAgcF9jb3VudCA9PSBpX2NvdW50CgogICAgIyBHZXQgdGhlIGNvbnRhaW5lciBpbWFnZSBsYXllciBJRHMgYW5kIHZlcml0eSByb290IGhhc2hlcywgZnJvbSB0aGUgIm92ZXJsYXlmcyIgc3RvcmFnZS4KICAgIHNvbWUgb3ZlcmxheV9zdG9yYWdlIGluIHBfc3RvcmFnZXMKICAgIG92ZXJsYXlfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIHByaW50KCJhbGxvd19zdG9yYWdlczogb3ZlcmxheV9zdG9yYWdlID0iLCBvdmVybGF5X3N0b3JhZ2UpCiAgICBjb3VudChvdmVybGF5X3N0b3JhZ2Uub3B0aW9ucykgPT0gMgoKICAgIGxheWVyX2lkcyA6PSBzcGxpdChvdmVybGF5X3N0b3JhZ2Uub3B0aW9uc1swXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiBsYXllcl9pZHMgPSIsIGxheWVyX2lkcykKCiAgICByb290X2hhc2hlcyA6PSBzcGxpdChvdmVybGF5X3N0b3JhZ2Uub3B0aW9uc1sxXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiByb290X2hhc2hlcyA9Iiwgcm9vdF9oYXNoZXMpCgogICAgZXZlcnkgaV9zdG9yYWdlIGluIGlfc3RvcmFnZXMgewogICAgICAgIGFsbG93X3N0b3JhZ2UocF9zdG9yYWdlcywgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpCiAgICB9CgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiB0cnVlIikKfQoKYWxsb3dfc3RvcmFnZShwX3N0b3JhZ2VzLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgc29tZSBwX3N0b3JhZ2UgaW4gcF9zdG9yYWdlcwoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiBwX3N0b3JhZ2UgPSIsIHBfc3RvcmFnZSkKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiBpX3N0b3JhZ2UgPSIsIGlfc3RvcmFnZSkKCiAgICBwX3N0b3JhZ2UuZHJpdmVyICAgICAgICAgICA9PSBpX3N0b3JhZ2UuZHJpdmVyCiAgICBwX3N0b3JhZ2UuZHJpdmVyX29wdGlvbnMgICA9PSBpX3N0b3JhZ2UuZHJpdmVyX29wdGlvbnMKICAgIHBfc3RvcmFnZS5mc19ncm91cCAgICAgICAgID09IGlfc3RvcmFnZS5mc19ncm91cAogICAgcF9zdG9yYWdlLmZzdHlwZSAgICAgICAgICAgPT0gaV9zdG9yYWdlLmZzdHlwZQoKICAgIGFsbG93X3N0b3JhZ2Vfc291cmNlKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKQogICAgYWxsb3dfc3RvcmFnZV9vcHRpb25zKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKQogICAgYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKQoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiB0cnVlIikKfQoKYWxsb3dfc3RvcmFnZV9zb3VyY2UocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX3NvdXJjZSAxOiBzdGFydCIpCgogICAgcF9zdG9yYWdlLnNvdXJjZSA9PSBpX3N0b3JhZ2Uuc291cmNlCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDE6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX3NvdXJjZShwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDI6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCgogICAgIyBEREREOkJCOkRELkY6IERvbWFpbjpCdXM6RGV2aWNlLkZ1bmN0aW9uCiAgICAjIGh0dHBzOi8vd3d3Lmtlcm5lbC5vcmcvZG9jL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtYnVzLXBjaQogICAgcmVnZXgubWF0Y2goYF5bYS1mMC05XXs0fTpbYS1mMC05XXsyfTpbYS1mMC05XXsyfVwuW2EtZjAtOV0kYCwgaV9zdG9yYWdlLnNvdXJjZSkKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9zb3VyY2UgMjogdHJ1ZSIpCn0KCmFsbG93X3N0b3JhZ2Vfc291cmNlKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKSB7CiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9zb3VyY2UgMzogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIGlfc3RvcmFnZS5zb3VyY2UgPT0gIm5vbmUiCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDM6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX3NvdXJjZShwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDQ6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJzbWIiCgogICAgIyBQYXR0ZXJuOiAvLzxzdG9yYWdlLWFjY291bnQtbmFtZT4uZmlsZS5jb3JlLndpbmRvd3MubmV0LzxrOHMtUFZDLW5hbWU+CiAgICAjIFN0b3JhZ2UgYWNjb3VudCBuYW1lOiBodHRwczovL2xlYXJuLm1pY3Jvc29mdC5jb20vZW4tdXMvYXp1cmUvc3RvcmFnZS9jb21tb24vc3RvcmFnZS1hY2NvdW50LW92ZXJ2aWV3I3N0b3JhZ2UtYWNjb3VudC1uYW1lCiAgICAjIEs4cyBQVkMgbmFtZTogaHR0cHM6Ly9rdWJlcm5ldGVzLmlvL2RvY3MvY29uY2VwdHMvb3ZlcnZpZXcvd29ya2luZy13aXRoLW9iamVjdHMvbmFtZXMvI2Rucy1zdWJkb21haW4tbmFtZXMKICAgIHJlZ2V4Lm1hdGNoKGBeXC9cLyhbYS16MC05XXszLDI0fSlcLmZpbGVcLmNvcmVcLndpbmRvd3NcLm5ldFwvW2EtejAtOV0oW2EtejAtOS4tXXswLDI1MX1bYS16MC05XSk/JGAsIGlfc3RvcmFnZS5zb3VyY2UpCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDQ6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMTogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgIT0gIm92ZXJsYXlmcyIKICAgIHBfc3RvcmFnZS5vcHRpb25zID09IGlfc3RvcmFnZS5vcHRpb25zCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAxOiB0cnVlIikKfQphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIGNvdW50KHBfc3RvcmFnZS5vcHRpb25zKSA9PSAyCgogICAgcG9saWN5X2lkcyA6PSBzcGxpdChwX3N0b3JhZ2Uub3B0aW9uc1swXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBwb2xpY3lfaWRzID0iLCBwb2xpY3lfaWRzKQogICAgcG9saWN5X2lkcyA9PSBsYXllcl9pZHMKCiAgICBwb2xpY3lfaGFzaGVzIDo9IHNwbGl0KHBfc3RvcmFnZS5vcHRpb25zWzFdLCAiOiIpCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IHBvbGljeV9oYXNoZXMgPSIsIHBvbGljeV9oYXNoZXMpCgogICAgcF9jb3VudCA6PSBjb3VudChwb2xpY3lfaWRzKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBwX2NvdW50ID0iLCBwX2NvdW50KQogICAgcF9jb3VudCA+PSAxCiAgICBwX2NvdW50ID09IGNvdW50KHBvbGljeV9oYXNoZXMpCgogICAgaV9jb3VudCA6PSBjb3VudChpX3N0b3JhZ2Uub3B0aW9ucykKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogaV9jb3VudCA9IiwgaV9jb3VudCkKICAgIGlfY291bnQgPT0gcF9jb3VudCArIDMKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zWzBdID0iLCBpX3N0b3JhZ2Uub3B0aW9uc1swXSkKICAgIGlfc3RvcmFnZS5vcHRpb25zWzBdID09ICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQubGF5ZXItc3JjLXByZWZpeD0vdmFyL2xpYi9jb250YWluZXJkL2lvLmNvbnRhaW5lcmQuc25hcHNob3R0ZXIudjEudGFyZGV2L2xheWVycyIKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zW2lfY291bnQgLSAyXSA9IiwgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDJdKQogICAgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDJdID09ICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQub3ZlcmxheS1ydyIKCiAgICBsb3dlcmRpciA6PSBjb25jYXQoIj0iLCBbImxvd2VyZGlyIiwgcF9zdG9yYWdlLm9wdGlvbnNbMF1dKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBsb3dlcmRpciA9IiwgbG93ZXJkaXIpCgogICAgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDFdID09IGxvd2VyZGlyCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zW2lfY291bnQgLSAxXSA9IiwgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDFdKQoKICAgIGV2ZXJ5IGksIHBvbGljeV9pZCBpbiBwb2xpY3lfaWRzIHsKICAgICAgICBhbGxvd19vdmVybGF5X2xheWVyKHBvbGljeV9pZCwgcG9saWN5X2hhc2hlc1tpXSwgaV9zdG9yYWdlLm9wdGlvbnNbaSArIDFdKQogICAgfQoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogdHJ1ZSIpCn0KYWxsb3dfc3RvcmFnZV9vcHRpb25zKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKSB7CiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDM6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCiAgICBjb3VudChwX3N0b3JhZ2Uub3B0aW9ucykgPT0gMQoKICAgIHN0YXJ0c3dpdGgocF9zdG9yYWdlLm9wdGlvbnNbMF0sICIkKGhhc2giKQogICAgaGFzaF9zdWZmaXggOj0gdHJpbV9sZWZ0KHBfc3RvcmFnZS5vcHRpb25zWzBdLCAiJChoYXNoIikKCiAgICBlbmRzd2l0aChoYXNoX3N1ZmZpeCwgIikiKQogICAgaGFzaF9pbmRleCA6PSB0cmltX3JpZ2h0KGhhc2hfc3VmZml4LCAiKSIpCiAgICBpIDo9IHRvX251bWJlcihoYXNoX2luZGV4KQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAzOiBpID0iLCBpKQoKICAgIGhhc2hfb3B0aW9uIDo9IGNvbmNhdCgiPSIsIFsiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LnJvb3QtaGFzaCIsIHJvb3RfaGFzaGVzW2ldXSkKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMzogaGFzaF9vcHRpb24gPSIsIGhhc2hfb3B0aW9uKQoKICAgIGNvdW50KGlfc3RvcmFnZS5vcHRpb25zKSA9PSA0CiAgICBpX3N0b3JhZ2Uub3B0aW9uc1swXSA9PSAicm8iCiAgICBpX3N0b3JhZ2Uub3B0aW9uc1sxXSA9PSAiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmJsb2NrX2RldmljZT1maWxlIgogICAgaV9zdG9yYWdlLm9wdGlvbnNbMl0gPT0gImlvLmthdGFjb250YWluZXJzLmZzLW9wdC5pcy1sYXllciIKICAgIGlfc3RvcmFnZS5vcHRpb25zWzNdID09IGhhc2hfb3B0aW9uCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAzOiB0cnVlIikKfQphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgNDogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gInNtYiIKICAgIHBfb3B0c19jb3VudCA6PSBjb3VudChwX3N0b3JhZ2Uub3B0aW9ucykKICAgIGlfb3B0c19jb3VudCA6PSBjb3VudChpX3N0b3JhZ2Uub3B0aW9ucykKICAgIGlfb3B0c19jb3VudCA9PSBwX29wdHNfY291bnQgKyAyCgogICAgaV9vcHRfbWF0Y2hlcyA6PSBbaSB8IGkgOj0gaWR4OyBpZHggPCBwX29wdHNfY291bnQ7IHBfc3RvcmFnZS5vcHRpb25zW2lkeF0gPT0gaV9zdG9yYWdlLm9wdGlvbnNbaWR4XV0KICAgIGNvdW50KGlfb3B0X21hdGNoZXMpID09IHBfb3B0c19jb3VudAoKICAgIHN0YXJ0c3dpdGgoaV9zdG9yYWdlLm9wdGlvbnNbaV9vcHRzX2NvdW50LTJdLCAiYWRkcj0iKQogICAgY3JlZHMgPSBzcGxpdChpX3N0b3JhZ2Uub3B0aW9uc1tpX29wdHNfY291bnQtMV0sICIsIikKICAgIGNvdW50KGNyZWRzKSA9PSAyCiAgICBzdGFydHN3aXRoKGNyZWRzWzBdLCAidXNlcm5hbWU9IikKICAgIHN0YXJ0c3dpdGgoY3JlZHNbMV0sICJwYXNzd29yZD0iKQogICAgCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDQ6IHRydWUiKQp9CgphbGxvd19vdmVybGF5X2xheWVyKHBvbGljeV9pZCwgcG9saWN5X2hhc2gsIGlfb3B0aW9uKSB7CiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogcG9saWN5X2lkID0iLCBwb2xpY3lfaWQsICJwb2xpY3lfaGFzaCA9IiwgcG9saWN5X2hhc2gpCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogaV9vcHRpb24gPSIsIGlfb3B0aW9uKQoKICAgIHN0YXJ0c3dpdGgoaV9vcHRpb24sICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQubGF5ZXI9IikKICAgIGlfdmFsdWUgOj0gcmVwbGFjZShpX29wdGlvbiwgImlvLmthdGFjb250YWluZXJzLmZzLW9wdC5sYXllcj0iLCAiIikKICAgIGlfdmFsdWVfZGVjb2RlZCA6PSBiYXNlNjQuZGVjb2RlKGlfdmFsdWUpCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogaV92YWx1ZV9kZWNvZGVkID0iLCBpX3ZhbHVlX2RlY29kZWQpCgogICAgcG9saWN5X3N1ZmZpeCA6PSBjb25jYXQoIj0iLCBbInRhcixybyxpby5rYXRhY29udGFpbmVycy5mcy1vcHQuYmxvY2tfZGV2aWNlPWZpbGUsaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmlzLWxheWVyLGlvLmthdGFjb250YWluZXJzLmZzLW9wdC5yb290LWhhc2giLCBwb2xpY3lfaGFzaF0pCiAgICBwX3ZhbHVlIDo9IGNvbmNhdCgiLCIsIFtwb2xpY3lfaWQsIHBvbGljeV9zdWZmaXhdKQogICAgcHJpbnQoImFsbG93X292ZXJsYXlfbGF5ZXI6IHBfdmFsdWUgPSIsIHBfdmFsdWUpCgogICAgcF92YWx1ZSA9PSBpX3ZhbHVlX2RlY29kZWQKCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogdHJ1ZSIpCn0KCmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAidGFyIgoKICAgIHN0YXJ0c3dpdGgocF9zdG9yYWdlLm1vdW50X3BvaW50LCAiJChsYXllciIpCiAgICBtb3VudF9zdWZmaXggOj0gdHJpbV9sZWZ0KHBfc3RvcmFnZS5tb3VudF9wb2ludCwgIiQobGF5ZXIiKQoKICAgIGVuZHN3aXRoKG1vdW50X3N1ZmZpeCwgIikiKQogICAgbGF5ZXJfaW5kZXggOj0gdHJpbV9yaWdodChtb3VudF9zdWZmaXgsICIpIikKICAgIGkgOj0gdG9fbnVtYmVyKGxheWVyX2luZGV4KQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDE6IGkgPSIsIGkpCgogICAgbGF5ZXJfaWQgOj0gbGF5ZXJfaWRzW2ldCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMTogbGF5ZXJfaWQgPSIsIGxheWVyX2lkKQoKICAgIHBfbW91bnQgOj0gY29uY2F0KCIvIiwgWyIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L2xheWVycyIsIGxheWVyX2lkXSkKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCAxOiBwX21vdW50ID0iLCBwX21vdW50KQoKICAgIHBfbW91bnQgPT0gaV9zdG9yYWdlLm1vdW50X3BvaW50CgogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDE6IHRydWUiKQp9CmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAiZnVzZTMua2F0YS1vdmVybGF5IgoKICAgIG1vdW50MSA6PSByZXBsYWNlKHBfc3RvcmFnZS5tb3VudF9wb2ludCwgIiQoY3BhdGgpIiwgcG9saWN5X2RhdGEuY29tbW9uLmNwYXRoKQogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDI6IG1vdW50MiA9IiwgbW91bnQyKQoKICAgIG1vdW50MiA9PSBpX3N0b3JhZ2UubW91bnRfcG9pbnQKCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMjogdHJ1ZSIpCn0KYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKSB7CiAgICBwX3N0b3JhZ2UuZnN0eXBlID09ICJsb2NhbCIKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQyID0iLCBtb3VudDIpCgogICAgbW91bnQzIDo9IHJlcGxhY2UobW91bnQyLCAiJChzYW5kYm94LWlkKSIsIHNhbmRib3hfaWQpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQzID0iLCBtb3VudDMpCgogICAgcmVnZXgubWF0Y2gobW91bnQzLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCgogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDM6IHRydWUiKQp9CmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAiYmluZCIKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNDogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNDogbW91bnQyID0iLCBtb3VudDIpCgogICAgbW91bnQzIDo9IHJlcGxhY2UobW91bnQyLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDQ6IG1vdW50MyA9IiwgbW91bnQzKQoKICAgIHJlZ2V4Lm1hdGNoKG1vdW50MywgaV9zdG9yYWdlLm1vdW50X3BvaW50KQoKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA0OiB0cnVlIikKfQphbGxvd19tb3VudF9wb2ludChwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgYnVuZGxlX2lkLCBzYW5kYm94X2lkLCBsYXllcl9pZHMpIHsKICAgIHBfc3RvcmFnZS5mc3R5cGUgPT0gInRtcGZzIgoKICAgIG1vdW50MSA6PSBwX3N0b3JhZ2UubW91bnRfcG9pbnQKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA1OiBtb3VudDEgPSIsIG1vdW50MSkKCiAgICByZWdleC5tYXRjaChtb3VudDEsIGlfc3RvcmFnZS5tb3VudF9wb2ludCkKCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNTogdHJ1ZSIpCn0KYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKSB7CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogaV9zdG9yYWdlLm1vdW50X3BvaW50ID0iLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCiAgICBhbGxvd19kaXJlY3Rfdm9sX2RyaXZlcihwX3N0b3JhZ2UsIGlfc3RvcmFnZSkKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChzcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQyID0iLCBtb3VudDIpCgogICAgZGlyZWN0X3ZvbF9wYXRoIDo9IGlfc3RvcmFnZS5zb3VyY2UKICAgIG1vdW50MyA6PSByZXBsYWNlKG1vdW50MiwgIiQoYjY0LWRpcmVjdC12b2wtcGF0aCkiLCBiYXNlNjR1cmwuZW5jb2RlKGRpcmVjdF92b2xfcGF0aCkpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQzID0iLCBtb3VudDMpCgogICAgbW91bnQzID09IGlfc3RvcmFnZS5tb3VudF9wb2ludAoKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA2OiB0cnVlIikKfQoKYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIocF9zdG9yYWdlLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19kaXJlY3Rfdm9sX2RyaXZlciAxOiBzdGFydCIpCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCiAgICBwcmludCgiYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIgMTogdHJ1ZSIpCn0KYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIocF9zdG9yYWdlLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19kaXJlY3Rfdm9sX2RyaXZlciAyOiBzdGFydCIpCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJzbWIiCiAgICBwcmludCgiYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIgMjogdHJ1ZSIpCn0KCiMgRXhlY1Byb2Nlc3NSZXF1ZXN0LnByb2Nlc3MuQ2FwYWJpbGl0aWVzCmFsbG93X2V4ZWNfY2FwcyhpX2NhcHMpIHsKICAgIG5vdCBpX2NhcHMuQW1iaWVudAogICAgbm90IGlfY2Fwcy5Cb3VuZGluZwogICAgbm90IGlfY2Fwcy5FZmZlY3RpdmUKICAgIG5vdCBpX2NhcHMuSW5oZXJpdGFibGUKICAgIG5vdCBpX2NhcHMuUGVybWl0dGVkCn0KCiMgT0NJLlByb2Nlc3MuQ2FwYWJpbGl0aWVzCmFsbG93X2NhcHMocF9jYXBzLCBpX2NhcHMpIHsKICAgIHByaW50KCJhbGxvd19jYXBzOiBwb2xpY3kgQW1iaWVudCA9IiwgcF9jYXBzLkFtYmllbnQpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgQW1iaWVudCA9IiwgaV9jYXBzLkFtYmllbnQpCiAgICBtYXRjaF9jYXBzKHBfY2Fwcy5BbWJpZW50LCBpX2NhcHMuQW1iaWVudCkKCiAgICBwcmludCgiYWxsb3dfY2FwczogcG9saWN5IEJvdW5kaW5nID0iLCBwX2NhcHMuQm91bmRpbmcpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgQm91bmRpbmcgPSIsIGlfY2Fwcy5Cb3VuZGluZykKICAgIG1hdGNoX2NhcHMocF9jYXBzLkJvdW5kaW5nLCBpX2NhcHMuQm91bmRpbmcpCgogICAgcHJpbnQoImFsbG93X2NhcHM6IHBvbGljeSBFZmZlY3RpdmUgPSIsIHBfY2Fwcy5FZmZlY3RpdmUpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgRWZmZWN0aXZlID0iLCBpX2NhcHMuRWZmZWN0aXZlKQogICAgbWF0Y2hfY2FwcyhwX2NhcHMuRWZmZWN0aXZlLCBpX2NhcHMuRWZmZWN0aXZlKQoKICAgIHByaW50KCJhbGxvd19jYXBzOiBwb2xpY3kgSW5oZXJpdGFibGUgPSIsIHBfY2Fwcy5Jbmhlcml0YWJsZSkKICAgIHByaW50KCJhbGxvd19jYXBzOiBpbnB1dCBJbmhlcml0YWJsZSA9IiwgaV9jYXBzLkluaGVyaXRhYmxlKQogICAgbWF0Y2hfY2FwcyhwX2NhcHMuSW5oZXJpdGFibGUsIGlfY2Fwcy5Jbmhlcml0YWJsZSkKCiAgICBwcmludCgiYWxsb3dfY2FwczogcG9saWN5IFBlcm1pdHRlZCA9IiwgcF9jYXBzLlBlcm1pdHRlZCkKICAgIHByaW50KCJhbGxvd19jYXBzOiBpbnB1dCBQZXJtaXR0ZWQgPSIsIGlfY2Fwcy5QZXJtaXR0ZWQpCiAgICBtYXRjaF9jYXBzKHBfY2Fwcy5QZXJtaXR0ZWQsIGlfY2Fwcy5QZXJtaXR0ZWQpCn0KCm1hdGNoX2NhcHMocF9jYXBzLCBpX2NhcHMpIHsKICAgIHByaW50KCJtYXRjaF9jYXBzIDE6IHN0YXJ0IikKCiAgICBwX2NhcHMgPT0gaV9jYXBzCgogICAgcHJpbnQoIm1hdGNoX2NhcHMgMTogdHJ1ZSIpCn0KbWF0Y2hfY2FwcyhwX2NhcHMsIGlfY2FwcykgewogICAgcHJpbnQoIm1hdGNoX2NhcHMgMjogc3RhcnQiKQoKICAgIGNvdW50KHBfY2FwcykgPT0gMQogICAgcF9jYXBzWzBdID09ICIkKGRlZmF1bHRfY2FwcykiCgogICAgcHJpbnQoIm1hdGNoX2NhcHMgMjogZGVmYXVsdF9jYXBzID0iLCBwb2xpY3lfZGF0YS5jb21tb24uZGVmYXVsdF9jYXBzKQogICAgcG9saWN5X2RhdGEuY29tbW9uLmRlZmF1bHRfY2FwcyA9PSBpX2NhcHMKCiAgICBwcmludCgibWF0Y2hfY2FwcyAyOiB0cnVlIikKfQptYXRjaF9jYXBzKHBfY2FwcywgaV9jYXBzKSB7CiAgICBwcmludCgibWF0Y2hfY2FwcyAzOiBzdGFydCIpCgogICAgY291bnQocF9jYXBzKSA9PSAxCiAgICBwX2NhcHNbMF0gPT0gIiQocHJpdmlsZWdlZF9jYXBzKSIKCiAgICBwcmludCgibWF0Y2hfY2FwcyAzOiBwcml2aWxlZ2VkX2NhcHMgPSIsIHBvbGljeV9kYXRhLmNvbW1vbi5wcml2aWxlZ2VkX2NhcHMpCiAgICBwb2xpY3lfZGF0YS5jb21tb24ucHJpdmlsZWdlZF9jYXBzID09IGlfY2FwcwoKICAgIHByaW50KCJtYXRjaF9jYXBzIDM6IHRydWUiKQp9CgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgpjaGVja19kaXJlY3RvcnlfdHJhdmVyc2FsKGlfcGF0aCkgewogICAgbm90IHJlZ2V4Lm1hdGNoKCIoXnwvKS4uKCR8LykiLCBpX3BhdGgpCn0KCmNoZWNrX3N5bWxpbmtfc291cmNlKGlfc3JjKSB7CiAgICBpX3NyYyA9PSAiIgogICAgcHJpbnQoImNoZWNrX3N5bWxpbmtfc291cmNlIDE6IHRydWUiKQp9CmNoZWNrX3N5bWxpbmtfc291cmNlKGlfc3JjKSB7CiAgICBpX3NyYyAhPSAiIgogICAgcHJpbnQoImNoZWNrX3N5bWxpbmtfc291cmNlIDI6IGlfc3JjID0iLCBpX3NyYykKCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24uc19zb3VyY2UxLCBpX3NyYykKCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMjogdHJ1ZSIpCn0KY2hlY2tfc3ltbGlua19zb3VyY2UoaV9zcmMpIHsKICAgIGlfc3JjICE9ICIiCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMzogaV9zcmMgPSIsIGlfc3JjKQoKICAgIHJlZ2V4Lm1hdGNoKHBvbGljeV9kYXRhLmNvbW1vbi5zX3NvdXJjZTIsIGlfc3JjKQogICAgY2hlY2tfZGlyZWN0b3J5X3RyYXZlcnNhbChpX3NyYykKCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMzogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfc3RvcmFnZXMoaV9zdG9yYWdlcykgewogICAgcHJpbnQoImFsbG93X3NhbmRib3hfc3RvcmFnZXM6IGlfc3RvcmFnZXMgPSIsIGlfc3RvcmFnZXMpCgogICAgcF9zdG9yYWdlcyA6PSBwb2xpY3lfZGF0YS5zYW5kYm94LnN0b3JhZ2VzCiAgICBldmVyeSBpX3N0b3JhZ2UgaW4gaV9zdG9yYWdlcyB7CiAgICAgICAgYWxsb3dfc2FuZGJveF9zdG9yYWdlKHBfc3RvcmFnZXMsIGlfc3RvcmFnZSkKICAgIH0KCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9zdG9yYWdlczogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfc3RvcmFnZShwX3N0b3JhZ2VzLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IGlfc3RvcmFnZSA9IiwgaV9zdG9yYWdlKQoKICAgIHNvbWUgcF9zdG9yYWdlIGluIHBfc3RvcmFnZXMKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IHBfc3RvcmFnZSA9IiwgcF9zdG9yYWdlKQogICAgaV9zdG9yYWdlID09IHBfc3RvcmFnZQoKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IHRydWUiKQp9CgpDb3B5RmlsZVJlcXVlc3QgewogICAgcHJpbnQoIkNvcHlGaWxlUmVxdWVzdDogaW5wdXQucGF0aCA9IiwgaW5wdXQucGF0aCkKCiAgICBjaGVja19zeW1saW5rX3NvdXJjZShpbnB1dC5zeW1saW5rX3NyYykKICAgIGNoZWNrX2RpcmVjdG9yeV90cmF2ZXJzYWwoaW5wdXQucGF0aCkKCiAgICBzb21lIHJlZ2V4MSBpbiBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLkNvcHlGaWxlUmVxdWVzdAogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5jcGF0aCkKICAgIHJlZ2V4NCA6PSByZXBsYWNlKHJlZ2V4MywgIiQoYnVuZGxlLWlkKSIsIEJVTkRMRV9JRCkKICAgIHByaW50KCJDb3B5RmlsZVJlcXVlc3Q6IHJlZ2V4NCA9IiwgcmVnZXg0KQoKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4NCwgaW5wdXQucGF0aCkKCiAgICBwcmludCgiQ29weUZpbGVSZXF1ZXN0OiB0cnVlIikKfQoKQ3JlYXRlU2FuZGJveFJlcXVlc3QgewogICAgcHJpbnQoIkNyZWF0ZVNhbmRib3hSZXF1ZXN0OiBpbnB1dC5ndWVzdF9ob29rX3BhdGggPSIsIGlucHV0Lmd1ZXN0X2hvb2tfcGF0aCkKICAgIGNvdW50KGlucHV0Lmd1ZXN0X2hvb2tfcGF0aCkgPT0gMAoKICAgIHByaW50KCJDcmVhdGVTYW5kYm94UmVxdWVzdDogaW5wdXQua2VybmVsX21vZHVsZXMgPSIsIGlucHV0Lmtlcm5lbF9tb2R1bGVzKQogICAgY291bnQoaW5wdXQua2VybmVsX21vZHVsZXMpID09IDAKCiAgICBpX3BpZG5zIDo9IGlucHV0LnNhbmRib3hfcGlkbnMKICAgIHByaW50KCJDcmVhdGVTYW5kYm94UmVxdWVzdDogaV9waWRucyA9IiwgaV9waWRucykKICAgIGlfcGlkbnMgPT0gZmFsc2UKICAgIGFsbG93X3NhbmRib3hfc3RvcmFnZXMoaW5wdXQuc3RvcmFnZXMpCn0KCmFsbG93X2V4ZWMocF9jb250YWluZXIsIGlfcHJvY2VzcykgewogICAgcHJpbnQoImFsbG93X2V4ZWM6IHN0YXJ0IikKCiAgICBwX29jaSA9IHBfY29udGFpbmVyLk9DSQogICAgcF9zX25hbWUgPSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc19uYW1lc3BhY2UgPSBnZXRfc3RhdGVfdmFsKCJuYW1lc3BhY2UiKQogICAgYWxsb3dfcHJvYmVfcHJvY2VzcyhwX29jaS5Qcm9jZXNzLCBpX3Byb2Nlc3MsIHBfc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfZXhlYzogdHJ1ZSIpCn0KCmFsbG93X2ludGVyYWN0aXZlX2V4ZWMocF9jb250YWluZXIsIGlfcHJvY2VzcykgewogICAgcHJpbnQoImFsbG93X2ludGVyYWN0aXZlX2V4ZWM6IHN0YXJ0IikKCiAgICBwX29jaSA9IHBfY29udGFpbmVyLk9DSQogICAgcF9zX25hbWUgPSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc19uYW1lc3BhY2UgPSBnZXRfc3RhdGVfdmFsKCJuYW1lc3BhY2UiKQogICAgYWxsb3dfaW50ZXJhY3RpdmVfcHJvY2VzcyhwX29jaS5Qcm9jZXNzLCBpX3Byb2Nlc3MsIHBfc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfaW50ZXJhY3RpdmVfZXhlYzogdHJ1ZSIpCn0KCiMgVE9ETzogc2hvdWxkIG90aGVyIEV4ZWNQcm9jZXNzUmVxdWVzdCBpbnB1dCBkYXRhIGZpZWxkcyBiZSB2YWxpZGF0ZWQgYXMgd2VsbD8KRXhlY1Byb2Nlc3NSZXF1ZXN0IHsKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMTogaW5wdXQgPSIsIGlucHV0KQoKICAgIHNvbWUgcF9jb21tYW5kIGluIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuRXhlY1Byb2Nlc3NSZXF1ZXN0LmFsbG93ZWRfY29tbWFuZHMKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMTogcF9jb21tYW5kID0iLCBwX2NvbW1hbmQpCiAgICBwX2NvbW1hbmQgPT0gaW5wdXQucHJvY2Vzcy5BcmdzCgogICAgIyBUT0RPOiBtYXRjaCBwX2NvbnRhaW5lcidzIElEIHdpdGggdGhlIGlucHV0IGNvbnRhaW5lcl9pZC4KICAgIHNvbWUgcF9jb250YWluZXIgaW4gcG9saWN5X2RhdGEuY29udGFpbmVycwogICAgYWxsb3dfaW50ZXJhY3RpdmVfZXhlYyhwX2NvbnRhaW5lciwgaW5wdXQucHJvY2VzcykKCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDE6IHRydWUiKQp9CkV4ZWNQcm9jZXNzUmVxdWVzdCB7CiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDI6IGlucHV0ID0iLCBpbnB1dCkKCiAgICAjIFRPRE86IG1hdGNoIGlucHV0IGNvbnRhaW5lciBJRCB3aXRoIGl0cyBjb3JyZXNwb25kaW5nIGNvbnRhaW5lci5leGVjX2NvbW1hbmRzLgogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBzb21lIHBfY29tbWFuZCBpbiBwX2NvbnRhaW5lci5leGVjX2NvbW1hbmRzCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDI6IHBfY29tbWFuZCA9IiwgcF9jb21tYW5kKQoKICAgICMgVE9ETzogc2hvdWxkIG90aGVyIGlucHV0IGRhdGEgZmllbGRzIGJlIHZhbGlkYXRlZCBhcyB3ZWxsPwogICAgcF9jb21tYW5kID09IGlucHV0LnByb2Nlc3MuQXJncwoKICAgIGFsbG93X2V4ZWMocF9jb250YWluZXIsIGlucHV0LnByb2Nlc3MpCgogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAyOiB0cnVlIikKfQpFeGVjUHJvY2Vzc1JlcXVlc3QgewogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAzOiBpbnB1dCA9IiwgaW5wdXQpCgogICAgaV9jb21tYW5kID0gY29uY2F0KCIgIiwgaW5wdXQucHJvY2Vzcy5BcmdzKQogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAzOiBpX2NvbW1hbmQgPSIsIGlfY29tbWFuZCkKCiAgICBzb21lIHBfcmVnZXggaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5FeGVjUHJvY2Vzc1JlcXVlc3QucmVnZXgKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMzogcF9yZWdleCA9IiwgcF9yZWdleCkKCiAgICByZWdleC5tYXRjaChwX3JlZ2V4LCBpX2NvbW1hbmQpCgogICAgIyBUT0RPOiBtYXRjaCBwX2NvbnRhaW5lcidzIElEIHdpdGggdGhlIGlucHV0IGNvbnRhaW5lcl9pZC4KICAgIHNvbWUgcF9jb250YWluZXIgaW4gcG9saWN5X2RhdGEuY29udGFpbmVycwogICAgYWxsb3dfaW50ZXJhY3RpdmVfZXhlYyhwX2NvbnRhaW5lciwgaW5wdXQucHJvY2VzcykKCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDM6IHRydWUiKQp9CgpVcGRhdGVSb3V0ZXNSZXF1ZXN0IHsKICAgIHByaW50KCJVcGRhdGVSb3V0ZXNSZXF1ZXN0OiBpbnB1dCA9IiwgaW5wdXQpCiAgICBwcmludCgiVXBkYXRlUm91dGVzUmVxdWVzdDogcG9saWN5ID0iLCBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLlVwZGF0ZVJvdXRlc1JlcXVlc3QpCgogICAgaV9yb3V0ZXMgOj0gaW5wdXQucm91dGVzLlJvdXRlcwogICAgcF9zb3VyY2VfcmVnZXggPSBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLlVwZGF0ZVJvdXRlc1JlcXVlc3QuZm9yYmlkZGVuX3NvdXJjZV9yZWdleAogICAgcF9uYW1lcyA9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuVXBkYXRlUm91dGVzUmVxdWVzdC5mb3JiaWRkZW5fZGV2aWNlX25hbWVzCgogICAgZXZlcnkgaV9yb3V0ZSBpbiBpX3JvdXRlcyB7CiAgICAgICAgcHJpbnQoImlfcm91dGUuc291cmNlID0iLCBpX3JvdXRlLnNvdXJjZSkKICAgICAgICBldmVyeSBwX3JlZ2V4IGluIHBfc291cmNlX3JlZ2V4IHsKICAgICAgICAgICAgcHJpbnQoInBfcmVnZXggPSIsIHBfcmVnZXgpCiAgICAgICAgICAgIG5vdCByZWdleC5tYXRjaChwX3JlZ2V4LCBpX3JvdXRlLnNvdXJjZSkKICAgICAgICB9CgogICAgICAgIHByaW50KCJpX3JvdXRlLmRldmljZSA9IiwgaV9yb3V0ZS5kZXZpY2UpCiAgICAgICAgbm90IGlfcm91dGUuZGV2aWNlIGluIHBfbmFtZXMKICAgIH0KCiAgICBwcmludCgiVXBkYXRlUm91dGVzUmVxdWVzdDogdHJ1ZSIpCn0KClVwZGF0ZUludGVyZmFjZVJlcXVlc3QgewogICAgcHJpbnQoIlVwZGF0ZUludGVyZmFjZVJlcXVlc3Q6IGlucHV0ID0iLCBpbnB1dCkKICAgIHByaW50KCJVcGRhdGVJbnRlcmZhY2VSZXF1ZXN0OiBwb2xpY3kgPSIsIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuVXBkYXRlSW50ZXJmYWNlUmVxdWVzdCkKCiAgICBpX2ludGVyZmFjZSA6PSBpbnB1dC5pbnRlcmZhY2UKICAgIHBfZmxhZ3MgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmFsbG93X3Jhd19mbGFncwoKICAgICMgVHlwaWNhbGx5LCBqdXN0IElGRl9OT0FSUCBpcyB1c2VkLgogICAgYml0cy5hbmQoaV9pbnRlcmZhY2UucmF3X2ZsYWdzLCBiaXRzLm5lZ2F0ZShwX2ZsYWdzKSkgPT0gMAoKICAgIHBfbmFtZXMgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmZvcmJpZGRlbl9uYW1lcwoKICAgIG5vdCBpX2ludGVyZmFjZS5uYW1lIGluIHBfbmFtZXMKCiAgICBwX2h3YWRkcnMgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmZvcmJpZGRlbl9od19hZGRycwoKICAgIG5vdCBpX2ludGVyZmFjZS5od0FkZHIgaW4gcF9od2FkZHJzCgogICAgcHJpbnQoIlVwZGF0ZUludGVyZmFjZVJlcXVlc3Q6IHRydWUiKQp9CgpDbG9zZVN0ZGluUmVxdWVzdCB7CiAgICBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLkNsb3NlU3RkaW5SZXF1ZXN0ID09IHRydWUKfQoKUmVhZFN0cmVhbVJlcXVlc3QgewogICAgcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5SZWFkU3RyZWFtUmVxdWVzdCA9PSB0cnVlCn0KClVwZGF0ZUVwaGVtZXJhbE1vdW50c1JlcXVlc3QgewogICAgcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVFcGhlbWVyYWxNb3VudHNSZXF1ZXN0ID09IHRydWUKfQoKV3JpdGVTdHJlYW1SZXF1ZXN0IHsKICAgIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuV3JpdGVTdHJlYW1SZXF1ZXN0ID09IHRydWUKfQoKcG9saWN5X2RhdGEgOj0gewogICJjb250YWluZXJzIjogWwogICAgewogICAgICAiT0NJIjogewogICAgICAgICJWZXJzaW9uIjogIjEuMS4wLXJjLjEiLAogICAgICAgICJQcm9jZXNzIjogewogICAgICAgICAgIlRlcm1pbmFsIjogZmFsc2UsCiAgICAgICAgICAiVXNlciI6IHsKICAgICAgICAgICAgIlVJRCI6IDY1NTM1LAogICAgICAgICAgICAiR0lEIjogNjU1MzUsCiAgICAgICAgICAgICJBZGRpdGlvbmFsR2lkcyI6IFtdLAogICAgICAgICAgICAiVXNlcm5hbWUiOiAiIgogICAgICAgICAgfSwKICAgICAgICAgICJEZXByZWNhdGVkQXJncyI6IFsKICAgICAgICAgICAgIi9wYXVzZSIKICAgICAgICAgIF0sCiAgICAgICAgICAiQXJncyI6IFsKICAgICAgICAgICAgIi9wYXVzZSIKICAgICAgICAgIF0sCiAgICAgICAgICAiRW52IjogWwogICAgICAgICAgICAiUEFUSD0vdXNyL2xvY2FsL3NiaW46L3Vzci9sb2NhbC9iaW46L3Vzci9zYmluOi91c3IvYmluOi9zYmluOi9iaW4iCiAgICAgICAgICBdLAogICAgICAgICAgIkN3ZCI6ICIvIiwKICAgICAgICAgICJDYXBhYmlsaXRpZXMiOiB7CiAgICAgICAgICAgICJBbWJpZW50IjogW10sCiAgICAgICAgICAgICJCb3VuZGluZyI6IFsKICAgICAgICAgICAgICAiJChkZWZhdWx0X2NhcHMpIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiRWZmZWN0aXZlIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJJbmhlcml0YWJsZSI6IFtdLAogICAgICAgICAgICAiUGVybWl0dGVkIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICAiTm9OZXdQcml2aWxlZ2VzIjogdHJ1ZQogICAgICAgIH0sCiAgICAgICAgIlJvb3QiOiB7CiAgICAgICAgICAiUGF0aCI6ICIkKGNwYXRoKS8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgIlJlYWRvbmx5IjogdHJ1ZQogICAgICAgIH0sCiAgICAgICAgIk1vdW50cyI6IFsKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9wcm9jIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJwcm9jIiwKICAgICAgICAgICAgInR5cGVfIjogInByb2MiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2IiwKICAgICAgICAgICAgInNvdXJjZSI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJzdHJpY3RhdGltZSIsCiAgICAgICAgICAgICAgIm1vZGU9NzU1IiwKICAgICAgICAgICAgICAic2l6ZT02NTUzNmsiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L3B0cyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiZGV2cHRzIiwKICAgICAgICAgICAgInR5cGVfIjogImRldnB0cyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJuZXdpbnN0YW5jZSIsCiAgICAgICAgICAgICAgInB0bXhtb2RlPTA2NjYiLAogICAgICAgICAgICAgICJtb2RlPTA2MjAiLAogICAgICAgICAgICAgICJnaWQ9NSIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvc2htIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L3NobSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi9tcXVldWUiLAogICAgICAgICAgICAic291cmNlIjogIm1xdWV1ZSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJtcXVldWUiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvc3lzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJzeXNmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJzeXNmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2V0Yy9yZXNvbHYuY29uZiIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClyZXNvbHYuY29uZiQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJvIiwKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9kZXYiLAogICAgICAgICAgICAgICJub2V4ZWMiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0KICAgICAgICBdLAogICAgICAgICJBbm5vdGF0aW9ucyI6IHsKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmJ1bmRsZV9wYXRoIjogIi9ydW4vY29udGFpbmVyZC9pby5jb250YWluZXJkLnJ1bnRpbWUudjIudGFzay9rOHMuaW8vJChidW5kbGUtaWQpIiwKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIjogInBvZF9zYW5kYm94IiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSI6ICJzYW5kYm94IiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWlkIjogIl5bYS16MC05XXs2NH0kIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWxvZy1kaXJlY3RvcnkiOiAiXi92YXIvbG9nL3BvZHMvJChzYW5kYm94LW5hbWVzcGFjZSlfJChzYW5kYm94LW5hbWUpX1swLTlhLWZdezh9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezEyfSQiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZSI6ICJeaGVsbG9cXC1rYXRhXFwtd2ViaG9vayQiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZXNwYWNlIjogImRlZmF1bHQiLAogICAgICAgICAgImt1YmVjdGwua3ViZXJuZXRlcy5pby9sYXN0LWFwcGxpZWQtY29uZmlndXJhdGlvbiI6ICJ7XCJhcGlWZXJzaW9uXCI6XCJ2MVwiLFwia2luZFwiOlwiUG9kXCIsXCJtZXRhZGF0YVwiOntcImFubm90YXRpb25zXCI6e30sXCJuYW1lXCI6XCJoZWxsby1rYXRhLXdlYmhvb2tcIixcIm5hbWVzcGFjZVwiOlwiZGVmYXVsdFwifSxcInNwZWNcIjp7XCJjb250YWluZXJzXCI6W3tcImNvbW1hbmRcIjpbXCJlY2hvXCIsXCJIZWxsbyBXZWJob29rXCJdLFwiaW1hZ2VcIjpcInF1YXkuaW8vcHJvbWV0aGV1cy9idXN5Ym94OmxhdGVzdFwiLFwiaW1hZ2VQdWxsUG9saWN5XCI6XCJJZk5vdFByZXNlbnRcIixcIm5hbWVcIjpcImhlbGxvLWthdGEtd2ViaG9va1wifV0sXCJyZXN0YXJ0UG9saWN5XCI6XCJOZXZlclwifX1cbiIsCiAgICAgICAgICAibmVyZGN0bC9uZXR3b3JrLW5hbWVzcGFjZSI6ICJeL3Zhci9ydW4vbmV0bnMvY25pLVswLTlhLWZdezh9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezEyfSQiCiAgICAgICAgfSwKICAgICAgICAiTGludXgiOiB7CiAgICAgICAgICAiTmFtZXNwYWNlcyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICJUeXBlIjogImlwYyIsCiAgICAgICAgICAgICAgIlBhdGgiOiAiIgogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgIlR5cGUiOiAidXRzIiwKICAgICAgICAgICAgICAiUGF0aCI6ICIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiVHlwZSI6ICJtb3VudCIsCiAgICAgICAgICAgICAgIlBhdGgiOiAiIgogICAgICAgICAgICB9CiAgICAgICAgICBdLAogICAgICAgICAgIk1hc2tlZFBhdGhzIjogWwogICAgICAgICAgICAiL3Byb2MvYWNwaSIsCiAgICAgICAgICAgICIvcHJvYy9hc291bmQiLAogICAgICAgICAgICAiL3Byb2Mva2NvcmUiLAogICAgICAgICAgICAiL3Byb2Mva2V5cyIsCiAgICAgICAgICAgICIvcHJvYy9sYXRlbmN5X3N0YXRzIiwKICAgICAgICAgICAgIi9wcm9jL3RpbWVyX2xpc3QiLAogICAgICAgICAgICAiL3Byb2MvdGltZXJfc3RhdHMiLAogICAgICAgICAgICAiL3Byb2Mvc2NoZWRfZGVidWciLAogICAgICAgICAgICAiL3N5cy9maXJtd2FyZSIsCiAgICAgICAgICAgICIvcHJvYy9zY3NpIgogICAgICAgICAgXSwKICAgICAgICAgICJSZWFkb25seVBhdGhzIjogWwogICAgICAgICAgICAiL3Byb2MvYnVzIiwKICAgICAgICAgICAgIi9wcm9jL2ZzIiwKICAgICAgICAgICAgIi9wcm9jL2lycSIsCiAgICAgICAgICAgICIvcHJvYy9zeXMiLAogICAgICAgICAgICAiL3Byb2Mvc3lzcnEtdHJpZ2dlciIKICAgICAgICAgIF0sCiAgICAgICAgICAiRGV2aWNlcyI6IFtdLAogICAgICAgICAgIlN5c2N0bCI6IHsKICAgICAgICAgICAgIm5ldC5pcHY0LmlwX3VucHJpdmlsZWdlZF9wb3J0X3N0YXJ0IjogIjAiLAogICAgICAgICAgICAibmV0LmlwdjQucGluZ19ncm91cF9yYW5nZSI6ICIwIDIxNDc0ODM2NDciCiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9LAogICAgICAic3RvcmFnZXMiOiBbCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJibGsiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogInRhciIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIiQoaGFzaDApIgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGxheWVyMCkiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJvdmVybGF5ZnMiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogImZ1c2UzLmthdGEtb3ZlcmxheSIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIjVhNWFhZDgwMDU1ZmYyMDAxMmE1MGRjMjVmOGRmN2EyOTkyNDQ3NDMyNGQ2NWY3ZDUzMDZlZThlZTI3ZmY3MWQiLAogICAgICAgICAgICAiODE3MjUwZjFhM2UzMzZkYTc2ZjViZDNmYTc4NGUxYjI2ZDk1OWI5YzEzMTg3NjgxNWJhMjYwNDA0OGI3MGMxOCIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChjcGF0aCkvJChidW5kbGUtaWQpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9CiAgICAgIF0sCiAgICAgICJkZXZpY2VzIjogW10sCiAgICAgICJzYW5kYm94X3BpZG5zIjogZmFsc2UsCiAgICAgICJleGVjX2NvbW1hbmRzIjogW10sCiAgICAgICJlbnZfbWFwIjogewogICAgICAgICJQQVRIIjogIi91c3IvbG9jYWwvc2JpbjovdXNyL2xvY2FsL2JpbjovdXNyL3NiaW46L3Vzci9iaW46L3NiaW46L2JpbiIKICAgICAgfQogICAgfSwKICAgIHsKICAgICAgIk9DSSI6IHsKICAgICAgICAiVmVyc2lvbiI6ICIxLjEuMC1yYy4xIiwKICAgICAgICAiUHJvY2VzcyI6IHsKICAgICAgICAgICJUZXJtaW5hbCI6IGZhbHNlLAogICAgICAgICAgIlVzZXIiOiB7CiAgICAgICAgICAgICJVSUQiOiAwLAogICAgICAgICAgICAiR0lEIjogMCwKICAgICAgICAgICAgIkFkZGl0aW9uYWxHaWRzIjogW10sCiAgICAgICAgICAgICJVc2VybmFtZSI6ICIiCiAgICAgICAgICB9LAogICAgICAgICAgIkRlcHJlY2F0ZWRBcmdzIjogWwogICAgICAgICAgICAiZWNobyIsCiAgICAgICAgICAgICJIZWxsbyBXZWJob29rIgogICAgICAgICAgXSwKICAgICAgICAgICJBcmdzIjogWwogICAgICAgICAgICAiZWNobyIsCiAgICAgICAgICAgICJIZWxsbyBXZWJob29rIgogICAgICAgICAgXSwKICAgICAgICAgICJFbnYiOiBbCiAgICAgICAgICAgICJQQVRIPS91c3IvbG9jYWwvc2JpbjovdXNyL2xvY2FsL2JpbjovdXNyL3NiaW46L3Vzci9iaW46L3NiaW46L2JpbiIsCiAgICAgICAgICAgICJIT1NUTkFNRT0kKGhvc3QtbmFtZSkiCiAgICAgICAgICBdLAogICAgICAgICAgIkN3ZCI6ICIvIiwKICAgICAgICAgICJDYXBhYmlsaXRpZXMiOiB7CiAgICAgICAgICAgICJBbWJpZW50IjogW10sCiAgICAgICAgICAgICJCb3VuZGluZyI6IFsKICAgICAgICAgICAgICAiJChkZWZhdWx0X2NhcHMpIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiRWZmZWN0aXZlIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJJbmhlcml0YWJsZSI6IFtdLAogICAgICAgICAgICAiUGVybWl0dGVkIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICAiTm9OZXdQcml2aWxlZ2VzIjogZmFsc2UKICAgICAgICB9LAogICAgICAgICJSb290IjogewogICAgICAgICAgIlBhdGgiOiAiJChjcGF0aCkvJChidW5kbGUtaWQpIiwKICAgICAgICAgICJSZWFkb25seSI6IGZhbHNlCiAgICAgICAgfSwKICAgICAgICAiTW91bnRzIjogWwogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL3Byb2MiLAogICAgICAgICAgICAic291cmNlIjogInByb2MiLAogICAgICAgICAgICAidHlwZV8iOiAicHJvYyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYiLAogICAgICAgICAgICAic291cmNlIjogInRtcGZzIiwKICAgICAgICAgICAgInR5cGVfIjogInRtcGZzIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgInN0cmljdGF0aW1lIiwKICAgICAgICAgICAgICAibW9kZT03NTUiLAogICAgICAgICAgICAgICJzaXplPTY1NTM2ayIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvcHRzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJkZXZwdHMiLAogICAgICAgICAgICAidHlwZV8iOiAiZGV2cHRzIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAgICAgIm5ld2luc3RhbmNlIiwKICAgICAgICAgICAgICAicHRteG1vZGU9MDY2NiIsCiAgICAgICAgICAgICAgIm1vZGU9MDYyMCIsCiAgICAgICAgICAgICAgImdpZD01IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi9zaG0iLAogICAgICAgICAgICAic291cmNlIjogIi9ydW4va2F0YS1jb250YWluZXJzL3NhbmRib3gvc2htIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L21xdWV1ZSIsCiAgICAgICAgICAgICJzb3VyY2UiOiAibXF1ZXVlIiwKICAgICAgICAgICAgInR5cGVfIjogIm1xdWV1ZSIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9zeXMiLAogICAgICAgICAgICAic291cmNlIjogInN5c2ZzIiwKICAgICAgICAgICAgInR5cGVfIjogInN5c2ZzIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAgICAgIm5vZGV2IiwKICAgICAgICAgICAgICAicm8iCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvc3lzL2ZzL2Nncm91cCIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiY2dyb3VwIiwKICAgICAgICAgICAgInR5cGVfIjogImNncm91cCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIsCiAgICAgICAgICAgICAgInJlbGF0aW1lIiwKICAgICAgICAgICAgICAicm8iCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZXRjL2hvc3RzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KWhvc3RzJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJydyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvdGVybWluYXRpb24tbG9nIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KXRlcm1pbmF0aW9uLWxvZyQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicnciCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZXRjL2hvc3RuYW1lIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KWhvc3RuYW1lJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJydyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9ldGMvcmVzb2x2LmNvbmYiLAogICAgICAgICAgICAic291cmNlIjogIiQoc2ZwcmVmaXgpcmVzb2x2LmNvbmYkIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJ3IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL3Zhci9ydW4vc2VjcmV0cy9rdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50IiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KXNlcnZpY2VhY2NvdW50JCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJybyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi92YXIvcnVuL3NlY3JldHMvYXp1cmUvdG9rZW5zIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KXRva2VucyQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicm8iCiAgICAgICAgICAgIF0KICAgICAgICAgIH0KICAgICAgICBdLAogICAgICAgICJBbm5vdGF0aW9ucyI6IHsKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmJ1bmRsZV9wYXRoIjogIi9ydW4vY29udGFpbmVyZC9pby5jb250YWluZXJkLnJ1bnRpbWUudjIudGFzay9rOHMuaW8vJChidW5kbGUtaWQpIiwKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIjogInBvZF9jb250YWluZXIiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLmNvbnRhaW5lci1uYW1lIjogImhlbGxvLWthdGEtd2ViaG9vayIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLXR5cGUiOiAiY29udGFpbmVyIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5pbWFnZS1uYW1lIjogIm1jci5taWNyb3NvZnQuY29tL2Frcy9lMmUvbGlicmFyeS1idXN5Ym94Om1hc3Rlci4yMjAzMTQuMS1saW51eC1hbWQ2NCIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCI6ICJeW2EtejAtOV17NjR9JCIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1uYW1lIjogIl5oZWxsb1xcLWthdGFcXC13ZWJob29rJCIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1uYW1lc3BhY2UiOiAiZGVmYXVsdCIsCiAgICAgICAgICAia3ViZWN0bC5rdWJlcm5ldGVzLmlvL2xhc3QtYXBwbGllZC1jb25maWd1cmF0aW9uIjogIntcImFwaVZlcnNpb25cIjpcInYxXCIsXCJraW5kXCI6XCJQb2RcIixcIm1ldGFkYXRhXCI6e1wiYW5ub3RhdGlvbnNcIjp7fSxcIm5hbWVcIjpcImhlbGxvLWthdGEtd2ViaG9va1wiLFwibmFtZXNwYWNlXCI6XCJkZWZhdWx0XCJ9LFwic3BlY1wiOntcImNvbnRhaW5lcnNcIjpbe1wiY29tbWFuZFwiOltcImVjaG9cIixcIkhlbGxvIFdlYmhvb2tcIl0sXCJpbWFnZVwiOlwicXVheS5pby9wcm9tZXRoZXVzL2J1c3lib3g6bGF0ZXN0XCIsXCJpbWFnZVB1bGxQb2xpY3lcIjpcIklmTm90UHJlc2VudFwiLFwibmFtZVwiOlwiaGVsbG8ta2F0YS13ZWJob29rXCJ9XSxcInJlc3RhcnRQb2xpY3lcIjpcIk5ldmVyXCJ9fVxuIgogICAgICAgIH0sCiAgICAgICAgIkxpbnV4IjogewogICAgICAgICAgIk5hbWVzcGFjZXMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiVHlwZSI6ICJpcGMiLAogICAgICAgICAgICAgICJQYXRoIjogIiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJUeXBlIjogInV0cyIsCiAgICAgICAgICAgICAgIlBhdGgiOiAiIgogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgIlR5cGUiOiAibW91bnQiLAogICAgICAgICAgICAgICJQYXRoIjogIiIKICAgICAgICAgICAgfQogICAgICAgICAgXSwKICAgICAgICAgICJNYXNrZWRQYXRocyI6IFsKICAgICAgICAgICAgIi9wcm9jL2FjcGkiLAogICAgICAgICAgICAiL3Byb2Mva2NvcmUiLAogICAgICAgICAgICAiL3Byb2Mva2V5cyIsCiAgICAgICAgICAgICIvcHJvYy9sYXRlbmN5X3N0YXRzIiwKICAgICAgICAgICAgIi9wcm9jL3RpbWVyX2xpc3QiLAogICAgICAgICAgICAiL3Byb2MvdGltZXJfc3RhdHMiLAogICAgICAgICAgICAiL3Byb2Mvc2NoZWRfZGVidWciLAogICAgICAgICAgICAiL3Byb2Mvc2NzaSIsCiAgICAgICAgICAgICIvc3lzL2Zpcm13YXJlIgogICAgICAgICAgXSwKICAgICAgICAgICJSZWFkb25seVBhdGhzIjogWwogICAgICAgICAgICAiL3Byb2MvYXNvdW5kIiwKICAgICAgICAgICAgIi9wcm9jL2J1cyIsCiAgICAgICAgICAgICIvcHJvYy9mcyIsCiAgICAgICAgICAgICIvcHJvYy9pcnEiLAogICAgICAgICAgICAiL3Byb2Mvc3lzIiwKICAgICAgICAgICAgIi9wcm9jL3N5c3JxLXRyaWdnZXIiCiAgICAgICAgICBdLAogICAgICAgICAgIkRldmljZXMiOiBbXSwKICAgICAgICAgICJTeXNjdGwiOiB7CiAgICAgICAgICAgICJuZXQuaXB2NC5pcF91bnByaXZpbGVnZWRfcG9ydF9zdGFydCI6ICIwIiwKICAgICAgICAgICAgIm5ldC5pcHY0LnBpbmdfZ3JvdXBfcmFuZ2UiOiAiMCAyMTQ3NDgzNjQ3IgogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSwKICAgICAgInN0b3JhZ2VzIjogWwogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2gwKSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjApIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2gxKSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjEpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAib3ZlcmxheWZzIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJmdXNlMy5rYXRhLW92ZXJsYXkiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIyYzM0MmExMzdlNjkzYzc4OThhZWMzNmRhMTA0N2YxOTFkYzdjMTY4N2U2NjE5OGFkYWNjNDM5Y2Y0YWRmMzc5OjI1NzBlM2ExOWUxYmYyMGRkZGE0NTQ5OGE5NjI3ZjYxNTU1ZDJkNmMwMTQ3OWI5Yjc2NDYwYjY3OWIyN2Q1NTIiLAogICAgICAgICAgICAiODU2OGM3MGMwY2NmZTAwNTEwOTJlODE4ZGE3NjkxMTFhNTk4ODJjZDE5ZGQ3OTlkM2JjYTVmZmE4Mjc5MTA4MDpiNjQzYjYyMTc3NDg5ODM4MzBiMjZhYzE0YTM1YTMzMjJkZDUyOGMwMDk2M2VhYWRkOTFlZjU1ZjUxM2RjNzNmIgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGNwYXRoKS8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0KICAgICAgXSwKICAgICAgImRldmljZXMiOiBbXSwKICAgICAgInNhbmRib3hfcGlkbnMiOiBmYWxzZSwKICAgICAgImV4ZWNfY29tbWFuZHMiOiBbXSwKICAgICAgImVudl9tYXAiOiB7CiAgICAgICAgIkhPU1ROQU1FIjogIiQoaG9zdC1uYW1lKSIsCiAgICAgICAgIlBBVEgiOiAiL3Vzci9sb2NhbC9zYmluOi91c3IvbG9jYWwvYmluOi91c3Ivc2JpbjovdXNyL2Jpbjovc2JpbjovYmluIgogICAgICB9CiAgICB9CiAgXSwKICAiY29tbW9uIjogewogICAgImNwYXRoIjogIi9ydW4va2F0YS1jb250YWluZXJzL3NoYXJlZC9jb250YWluZXJzIiwKICAgICJtb3VudF9zb3VyY2VfY3BhdGgiOiAiL3J1bi9rYXRhLWNvbnRhaW5lcnMvc2hhcmVkL2NvbnRhaW5lcnMiLAogICAgInNmcHJlZml4IjogIl4kKGNwYXRoKS8kKGJ1bmRsZS1pZCktW2EtejAtOV17MTZ9LSIsCiAgICAic3BhdGgiOiAiL3J1bi9rYXRhLWNvbnRhaW5lcnMvc2FuZGJveC9zdG9yYWdlIiwKICAgICJpcHY0X2EiOiAiKChbMC05XXxbMS05XVswLTldfDFbMC05XXsyfXwyWzAtNF1bMC05XXwyNVswLTVdKVxcLil7M30oWzAtOV18WzEtOV1bMC05XXwxWzAtOV17Mn18MlswLTRdWzAtOV18MjVbMC01XSkiLAogICAgImlwX3AiOiAiWzAtOV17MSw1fSIsCiAgICAic3ZjX25hbWUiOiAiW0EtWl9cXC5cXC1dKyIsCiAgICAiZG5zX2xhYmVsIjogIlthLXpBLVowLTlfXFwuXFwtXSsiLAogICAgInNfc291cmNlMSI6ICJeLi4yWzAtOV17M31fWzAtMV1bMC05XV9bMC0zXVswLTldX1swLTJdWzAtOV1fWzAtNV1bMC05XV9bMC01XVswLTldXFwuWzAtOV17MSwxMH0kIiwKICAgICJzX3NvdXJjZTIiOiAiXi4uZGF0YS8iLAogICAgImRuc19zdWJkb21haW4iOiAiXlthLXowLTldKFstYS16MC05XSpbYS16MC05XSk/JCIsCiAgICAicG9kX3VpZCI6ICJeWzAtOWEtZkEtRl17OH0tWzAtOWEtZkEtRl17NH0tWzAtOWEtZkEtRl17NH0tWzAtOWEtZkEtRl17NH0tWzAtOWEtZkEtRl17MTJ9JCIsCiAgICAiZGVmYXVsdF9jYXBzIjogWwogICAgICAiQ0FQX0NIT1dOIiwKICAgICAgIkNBUF9EQUNfT1ZFUlJJREUiLAogICAgICAiQ0FQX0ZTRVRJRCIsCiAgICAgICJDQVBfRk9XTkVSIiwKICAgICAgIkNBUF9NS05PRCIsCiAgICAgICJDQVBfTkVUX1JBVyIsCiAgICAgICJDQVBfU0VUR0lEIiwKICAgICAgIkNBUF9TRVRVSUQiLAogICAgICAiQ0FQX1NFVEZDQVAiLAogICAgICAiQ0FQX1NFVFBDQVAiLAogICAgICAiQ0FQX05FVF9CSU5EX1NFUlZJQ0UiLAogICAgICAiQ0FQX1NZU19DSFJPT1QiLAogICAgICAiQ0FQX0tJTEwiLAogICAgICAiQ0FQX0FVRElUX1dSSVRFIgogICAgXSwKICAgICJwcml2aWxlZ2VkX2NhcHMiOiBbCiAgICAgICJDQVBfQ0hPV04iLAogICAgICAiQ0FQX0RBQ19PVkVSUklERSIsCiAgICAgICJDQVBfREFDX1JFQURfU0VBUkNIIiwKICAgICAgIkNBUF9GT1dORVIiLAogICAgICAiQ0FQX0ZTRVRJRCIsCiAgICAgICJDQVBfS0lMTCIsCiAgICAgICJDQVBfU0VUR0lEIiwKICAgICAgIkNBUF9TRVRVSUQiLAogICAgICAiQ0FQX1NFVFBDQVAiLAogICAgICAiQ0FQX0xJTlVYX0lNTVVUQUJMRSIsCiAgICAgICJDQVBfTkVUX0JJTkRfU0VSVklDRSIsCiAgICAgICJDQVBfTkVUX0JST0FEQ0FTVCIsCiAgICAgICJDQVBfTkVUX0FETUlOIiwKICAgICAgIkNBUF9ORVRfUkFXIiwKICAgICAgIkNBUF9JUENfTE9DSyIsCiAgICAgICJDQVBfSVBDX09XTkVSIiwKICAgICAgIkNBUF9TWVNfTU9EVUxFIiwKICAgICAgIkNBUF9TWVNfUkFXSU8iLAogICAgICAiQ0FQX1NZU19DSFJPT1QiLAogICAgICAiQ0FQX1NZU19QVFJBQ0UiLAogICAgICAiQ0FQX1NZU19QQUNDVCIsCiAgICAgICJDQVBfU1lTX0FETUlOIiwKICAgICAgIkNBUF9TWVNfQk9PVCIsCiAgICAgICJDQVBfU1lTX05JQ0UiLAogICAgICAiQ0FQX1NZU19SRVNPVVJDRSIsCiAgICAgICJDQVBfU1lTX1RJTUUiLAogICAgICAiQ0FQX1NZU19UVFlfQ09ORklHIiwKICAgICAgIkNBUF9NS05PRCIsCiAgICAgICJDQVBfTEVBU0UiLAogICAgICAiQ0FQX0FVRElUX1dSSVRFIiwKICAgICAgIkNBUF9BVURJVF9DT05UUk9MIiwKICAgICAgIkNBUF9TRVRGQ0FQIiwKICAgICAgIkNBUF9NQUNfT1ZFUlJJREUiLAogICAgICAiQ0FQX01BQ19BRE1JTiIsCiAgICAgICJDQVBfU1lTTE9HIiwKICAgICAgIkNBUF9XQUtFX0FMQVJNIiwKICAgICAgIkNBUF9CTE9DS19TVVNQRU5EIiwKICAgICAgIkNBUF9BVURJVF9SRUFEIiwKICAgICAgIkNBUF9QRVJGTU9OIiwKICAgICAgIkNBUF9CUEYiLAogICAgICAiQ0FQX0NIRUNLUE9JTlRfUkVTVE9SRSIKICAgIF0sCiAgICAidmlydGlvX2Jsa19zdG9yYWdlX2NsYXNzZXMiOiBbCiAgICAgICJjYy1sb2NhbC1jc2kiLAogICAgICAiY2MtbWFuYWdlZC1jc2kiLAogICAgICAiY2MtbWFuYWdlZC1wcmVtaXVtLWNzaSIKICAgIF0sCiAgICAic21iX3N0b3JhZ2VfY2xhc3NlcyI6IFsKICAgICAgewogICAgICAgICJuYW1lIjogImF6dXJlZmlsZS1jc2kta2F0YS1jYyIsCiAgICAgICAgIm1vdW50X29wdGlvbnMiOiBbCiAgICAgICAgICAiZGlyX21vZGU9MDc3NyIsCiAgICAgICAgICAiZmlsZV9tb2RlPTA3NzciLAogICAgICAgICAgIm1mc3ltbGlua3MiLAogICAgICAgICAgImNhY2hlPXN0cmljdCIsCiAgICAgICAgICAibm9zaGFyZXNvY2siLAogICAgICAgICAgImFjdGltZW89MzAiLAogICAgICAgICAgIm5vYnJsIgogICAgICAgIF0KICAgICAgfQogICAgXQogIH0sCiAgInNhbmRib3giOiB7CiAgICAic3RvcmFnZXMiOiBbCiAgICAgIHsKICAgICAgICAiZHJpdmVyIjogImVwaGVtZXJhbCIsCiAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgInNvdXJjZSI6ICJzaG0iLAogICAgICAgICJmc3R5cGUiOiAidG1wZnMiLAogICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICJub2RldiIsCiAgICAgICAgICAibW9kZT0xNzc3IiwKICAgICAgICAgICJzaXplPTY3MTA4ODY0IgogICAgICAgIF0sCiAgICAgICAgIm1vdW50X3BvaW50IjogIi9ydW4va2F0YS1jb250YWluZXJzL3NhbmRib3gvc2htIiwKICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgIH0KICAgIF0KICB9LAogICJyZXF1ZXN0X2RlZmF1bHRzIjogewogICAgIkNyZWF0ZUNvbnRhaW5lclJlcXVlc3QiOiB7CiAgICAgICJhbGxvd19lbnZfcmVnZXgiOiBbCiAgICAgICAgIl5IT1NUTkFNRT0kKGRuc19sYWJlbCkkIiwKICAgICAgICAiXiQoc3ZjX25hbWUpX1BPUlRfJChpcF9wKV9UQ1A9dGNwOi8vJChpcHY0X2EpOiQoaXBfcCkkIiwKICAgICAgICAiXiQoc3ZjX25hbWUpX1BPUlRfJChpcF9wKV9UQ1BfUFJPVE89dGNwJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9QT1JUXyQoaXBfcClfVENQX1BPUlQ9JChpcF9wKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfUE9SVF8kKGlwX3ApX1RDUF9BRERSPSQoaXB2NF9hKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfU0VSVklDRV9IT1NUPSQoaXB2NF9hKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfU0VSVklDRV9QT1JUPSQoaXBfcCkkIiwKICAgICAgICAiXiQoc3ZjX25hbWUpX1NFUlZJQ0VfUE9SVF8kKGRuc19sYWJlbCk9JChpcF9wKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfUE9SVD10Y3A6Ly8kKGlwdjRfYSk6JChpcF9wKSQiLAogICAgICAgICJeQVpVUkVfQ0xJRU5UX0lEPVtBLUZhLWYwLTktXSokIiwKICAgICAgICAiXkFaVVJFX1RFTkFOVF9JRD1bQS1GYS1mMC05LV0qJCIsCiAgICAgICAgIl5BWlVSRV9GRURFUkFURURfVE9LRU5fRklMRT0vdmFyL3J1bi9zZWNyZXRzL2F6dXJlL3Rva2Vucy9henVyZS1pZGVudGl0eS10b2tlbiQiLAogICAgICAgICJeQVpVUkVfQVVUSE9SSVRZX0hPU1Q9aHR0cHM6Ly9sb2dpblxcLm1pY3Jvc29mdG9ubGluZVxcLmNvbS8kIiwKICAgICAgICAiXlRFUk09eHRlcm0kIgogICAgICBdLAogICAgICAiYWxsb3dfZW52X3JlZ2V4X21hcCI6IHsKICAgICAgICAiQ1BVX0xJTUlUIjogIl5bMC05XSskIiwKICAgICAgICAiSk9CX0NPTVBMRVRJT05fSU5ERVgiOiAiXlswLTldKiQiLAogICAgICAgICJNRU1PUllfTElNSVQiOiAiXlswLTldKyQiCiAgICAgIH0KICAgIH0sCiAgICAiQ29weUZpbGVSZXF1ZXN0IjogWwogICAgICAiJChzZnByZWZpeCkiCiAgICBdLAogICAgIkV4ZWNQcm9jZXNzUmVxdWVzdCI6IHsKICAgICAgImFsbG93ZWRfY29tbWFuZHMiOiBbXSwKICAgICAgInJlZ2V4IjogW10KICAgIH0sCiAgICAiVXBkYXRlUm91dGVzUmVxdWVzdCI6IHsKICAgICAgImZvcmJpZGRlbl9kZXZpY2VfbmFtZXMiOiBbCiAgICAgICAgImxvIgogICAgICBdLAogICAgICAiZm9yYmlkZGVuX3NvdXJjZV9yZWdleCI6IFsKICAgICAgICAiXig/OjB7MCw0fTopezAsN30wezAsM30xJCIsCiAgICAgICAgIl4xMjdcXC4oPzpbMC05XXsxLDN9XFwuKXsyfVswLTldezEsM30kIgogICAgICBdCiAgICB9LAogICAgIlVwZGF0ZUludGVyZmFjZVJlcXVlc3QiOiB7CiAgICAgICJhbGxvd19yYXdfZmxhZ3MiOiAxMjgsCiAgICAgICJmb3JiaWRkZW5fbmFtZXMiOiBbCiAgICAgICAgImxvIgogICAgICBdLAogICAgICAiZm9yYmlkZGVuX2h3X2FkZHJzIjogWwogICAgICAgICIwMDowMDowMDowMDowMDowMCIKICAgICAgXQogICAgfSwKICAgICJDbG9zZVN0ZGluUmVxdWVzdCI6IGZhbHNlLAogICAgIlJlYWRTdHJlYW1SZXF1ZXN0IjogZmFsc2UsCiAgICAiVXBkYXRlRXBoZW1lcmFsTW91bnRzUmVxdWVzdCI6IGZhbHNlLAogICAgIldyaXRlU3RyZWFtUmVxdWVzdCI6IGZhbHNlCiAgfQp9 + creationTimestamp: ~ + managedFields: + - apiVersion: v1 + fieldsType: FieldsV1 + fieldsV1: + "f:metadata": + "f:annotations": + ".": {} + "f:kubectl.kubernetes.io/last-applied-configuration": {} + "f:spec": + "f:containers": + "k:{\"name\":\"hello-kata-webhook\"}": + ".": {} + "f:command": {} + "f:image": {} + "f:imagePullPolicy": {} + "f:name": {} + "f:resources": {} + "f:terminationMessagePath": {} + "f:terminationMessagePolicy": {} + "f:dnsPolicy": {} + "f:enableServiceLinks": {} + "f:restartPolicy": {} + "f:schedulerName": {} + "f:securityContext": {} + "f:terminationGracePeriodSeconds": {} + manager: kubectl-client-side-apply + operation: Update + time: "2023-06-13T23:45:46Z" + name: hello-kata-webhook + namespace: default +spec: + runtimeClassName: kata-cc + containers: + - command: + - echo + - Hello Webhook + image: "mcr.microsoft.com/aks/e2e/library-busybox:master.220314.1-linux-amd64" + imagePullPolicy: IfNotPresent + name: hello-kata-webhook + resources: {} + terminationMessagePath: /dev/termination-log + terminationMessagePolicy: File + volumeMounts: + - mountPath: /var/run/secrets/kubernetes.io/serviceaccount + name: kube-api-access-8wcms + readOnly: true + dnsPolicy: ClusterFirst + enableServiceLinks: true + preemptionPolicy: PreemptLowerPriority + priority: 0 + restartPolicy: Never + schedulerName: default-scheduler + securityContext: {} + serviceAccount: default + serviceAccountName: default + terminationGracePeriodSeconds: 30 + tolerations: + - effect: NoExecute + key: node.kubernetes.io/not-ready + operator: Exists + tolerationSeconds: 300 + - effect: NoExecute + key: node.kubernetes.io/unreachable + operator: Exists + tolerationSeconds: 300 + volumes: + - name: kube-api-access-8wcms + projected: + defaultMode: 420 + sources: + - serviceAccountToken: + expirationSeconds: 3607 + path: token + - configMap: + items: + - key: ca.crt + path: ca.crt + name: kube-root-ca.crt + - downwardAPI: + items: + - fieldRef: + apiVersion: v1 + fieldPath: metadata.namespace + path: namespace +status: {} diff --git a/src/agent/samples/policy/yaml/webhook/webhook-pod2.yaml b/src/agent/samples/policy/yaml/webhook/webhook-pod2.yaml new file mode 100644 index 000000000000..e4f3533bcdc7 --- /dev/null +++ b/src/agent/samples/policy/yaml/webhook/webhook-pod2.yaml @@ -0,0 +1,125 @@ +--- +apiVersion: v1 +kind: Namespace +metadata: + name: secrets-7157 +--- +apiVersion: v1 +kind: Secret +metadata: + namespace: secrets-7157 + name: secret-test-map-a464d595-bac4-4b14-bade-3ffd0c195a08 +data: + data-1: bWVnYV9zZWNyZXRfa2V5Cg== +--- +apiVersion: v1 +kind: Pod +metadata: + creationTimestamp: ~ + managedFields: + - apiVersion: v1 + fieldsType: FieldsV1 + fieldsV1: + "f:spec": + "f:containers": + "k:{\"name\":\"secret-volume-test\"}": + ".": {} + "f:args": {} + "f:image": {} + "f:imagePullPolicy": {} + "f:name": {} + "f:resources": {} + "f:terminationMessagePath": {} + "f:terminationMessagePolicy": {} + "f:volumeMounts": + ".": {} + "k:{\"mountPath\":\"/etc/secret-volume\"}": + ".": {} + "f:mountPath": {} + "f:name": {} + "f:dnsPolicy": {} + "f:enableServiceLinks": {} + "f:restartPolicy": {} + "f:schedulerName": {} + "f:securityContext": {} + "f:terminationGracePeriodSeconds": {} + "f:volumes": + ".": {} + "k:{\"name\":\"secret-volume\"}": + ".": {} + "f:name": {} + "f:secret": + ".": {} + "f:defaultMode": {} + "f:items": {} + "f:secretName": {} + manager: e2e.test + operation: Update + time: "2023-06-16T17:37:09Z" + name: pod-secrets-918a3370-ad19-46b2-a2e6-a4e393f2ee2b + namespace: secrets-7157 + annotations: + io.katacontainers.config.agent.policy: IyBDb3B5cmlnaHQgKGMpIDIwMjMgTWljcm9zb2Z0IENvcnBvcmF0aW9uCiMKIyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMAojCnBhY2thZ2UgYWdlbnRfcG9saWN5CgppbXBvcnQgZnV0dXJlLmtleXdvcmRzLmluCmltcG9ydCBmdXR1cmUua2V5d29yZHMuZXZlcnkKCiMgRGVmYXVsdCB2YWx1ZXMsIHJldHVybmVkIGJ5IE9QQSB3aGVuIHJ1bGVzIGNhbm5vdCBiZSBldmFsdWF0ZWQgdG8gdHJ1ZS4KZGVmYXVsdCBBZGRBUlBOZWlnaGJvcnNSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgQWRkU3dhcFJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBDbG9zZVN0ZGluUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IENvcHlGaWxlUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IENyZWF0ZUNvbnRhaW5lclJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBDcmVhdGVTYW5kYm94UmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IERlc3Ryb3lTYW5kYm94UmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgRXhlY1Byb2Nlc3NSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgR2V0T09NRXZlbnRSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBHdWVzdERldGFpbHNSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBMaXN0SW50ZXJmYWNlc1JlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBMaXN0Um91dGVzUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IE1lbUhvdHBsdWdCeVByb2JlUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IE9ubGluZUNQVU1lbVJlcXVlc3QgOj0gdHJ1ZQpkZWZhdWx0IFBhdXNlQ29udGFpbmVyUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFJlYWRTdHJlYW1SZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgUmVtb3ZlQ29udGFpbmVyUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgUmVtb3ZlU3RhbGVWaXJ0aW9mc1NoYXJlTW91bnRzUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgUmVzZWVkUmFuZG9tRGV2UmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFJlc3VtZUNvbnRhaW5lclJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBTZXRHdWVzdERhdGVUaW1lUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFNldFBvbGljeVJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBTaWduYWxQcm9jZXNzUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgU3RhcnRDb250YWluZXJSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBTdGFydFRyYWNpbmdSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgU3RhdHNDb250YWluZXJSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBTdG9wVHJhY2luZ1JlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBUdHlXaW5SZXNpemVSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBVcGRhdGVDb250YWluZXJSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgVXBkYXRlRXBoZW1lcmFsTW91bnRzUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFVwZGF0ZUludGVyZmFjZVJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBVcGRhdGVSb3V0ZXNSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgV2FpdFByb2Nlc3NSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBXcml0ZVN0cmVhbVJlcXVlc3QgOj0gZmFsc2UKCiMgQWxsb3dSZXF1ZXN0c0ZhaWxpbmdQb2xpY3kgOj0gdHJ1ZSBjb25maWd1cmVzIHRoZSBBZ2VudCB0byAqYWxsb3cgYW55CiMgcmVxdWVzdHMgY2F1c2luZyBhIHBvbGljeSBmYWlsdXJlKi4gVGhpcyBpcyBhbiB1bnNlY3VyZSBjb25maWd1cmF0aW9uCiMgYnV0IGlzIHVzZWZ1bCBmb3IgYWxsb3dpbmcgdW5zZWN1cmUgcG9kcyB0byBzdGFydCwgdGhlbiBjb25uZWN0IHRvCiMgdGhlbSBhbmQgaW5zcGVjdCBPUEEgbG9ncyBmb3IgdGhlIHJvb3QgY2F1c2Ugb2YgYSBmYWlsdXJlLgpkZWZhdWx0IEFsbG93UmVxdWVzdHNGYWlsaW5nUG9saWN5IDo9IGZhbHNlCgojIENvbnN0YW50cwpTX05BTUVfS0VZID0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZSIKU19OQU1FU1BBQ0VfS0VZID0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZXNwYWNlIgpCVU5ETEVfSUQgPSAiW2EtejAtOV17NjR9IgoKQ3JlYXRlQ29udGFpbmVyUmVxdWVzdDo9IHJlc3AgewogICAgbm90IGlzX251bGwoaW5wdXQuZW52X21hcCkKICAgIAogICAgaV9lbnZfbWFwIDo9IGlucHV0LmVudl9tYXAKICAgIAogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBwX2Vudl9tYXAgOj0gcF9jb250YWluZXIuZW52X21hcCAgCiAgICBhbGxvd19lbnZfbWFwKHBfZW52X21hcCwgaV9lbnZfbWFwKQogICAgCiAgICBpX3Byb2Nlc3MgOj0gaW5wdXQuYmFzZS5PQ0kuUHJvY2VzcwogICAgCiAgICBwX3Byb2Nlc3MgOj0gcF9jb250YWluZXIuT0NJLlByb2Nlc3MKICAgIAogICAgYWxsb3dfYXJncyhpX3Byb2Nlc3MsIHBfcHJvY2VzcywgaV9lbnZfbWFwKQoKICAgIHJlc3AgPSBDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uKGlucHV0LmJhc2UpCiAgICBwcmludCgiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdDogdHJ1ZSIpCn0KCmFsbG93X2FyZ3MoaV9wcm9jZXNzLCBwX3Byb2Nlc3MsIGlfZW52X21hcCkgewogICAgaV9hcmdzIDo9IGlfcHJvY2Vzcy5BcmdzCiAgICBwX2FyZ3MgOj0gcF9wcm9jZXNzLkFyZ3MKICAgIHByaW50KCJhbGxvd19hcmdzOiBpX2FyZ3MgPSIsIGlfYXJncywgInBfYXJncyA9IiwgcF9hcmdzKQogICAgY291bnQoaV9hcmdzKSA9PSBjb3VudChwX2FyZ3MpCiAgICBldmVyeSBpLCBpX2FyZyBpbiBpX2FyZ3MgewogICAgICAgIHByaW50KCJhbGxvd19hcmdzOiBpX2FyZyA9IiwgaV9hcmcpCiAgICAgICAgcF9hcmdfcmVwbGFjZWQgOj0gcmVwbGFjZV9lbnZfdmFyaWFibGVzKHBfYXJnc1tpXSwgaV9lbnZfbWFwKQogICAgICAgIHByaW50KCJhbGxvd19hcmdzOiBwX2FyZ19yZXBsYWNlZCA9IiwgcF9hcmdfcmVwbGFjZWQpCiAgICAgICAgcF9hcmdfcmVwbGFjZWQyIDo9IHJlcGxhY2UocF9hcmdfcmVwbGFjZWQsICIkJCIsICIkIikKICAgICAgICBwcmludCgiYWxsb3dfYXJnczogcF9hcmdfcmVwbGFjZWQyID0iLCBwX2FyZ19yZXBsYWNlZDIpCiAgICAgICAgaV9hcmcgPT0gcF9hcmdfcmVwbGFjZWQyCiAgICB9CiAgICBwcmludCgiYWxsb3dfYXJnczogdHJ1ZSIpCn0KCmFsbG93X2FyZ3MoaV9wcm9jZXNzLCBwX3Byb2Nlc3MsIGlfZW52X21hcCkgewogICAgbm90IGlfcHJvY2Vzcy5BcmdzCiAgICBub3QgcF9wcm9jZXNzLkFyZ3MKICAgIHByaW50KCJhbGxvd19hcmdzMjogbm8gYXJncyIpCn0KCiMgdGhpcyBmdW5jdGlvbiByZXBsYWNlcyBhbGwgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyBpbiBhIHN0cmluZywgZ2l2ZW4gYSBtYXAgb2YgZW52aXJvbm1lbnQga2V5cyB0byBlbnZpcm9ubWVudCB2YWx1ZXMKIyBlZyBzdHIgPSAiZWNobyAkKENMVVNURVJfSUQpOyBlY2hvICQoTk9ERV9OQU1FKTsiCiMgZW52X21hcCA9IHsiQ0xVU1RFUl9JRCI6ICJhYmMiLCAiTk9ERV9OQU1FIiA6ICJ4eXoifQojIHJlc3VsdCA9ICJlY2hvIGFiYzsgZWNobyB4eXo7IgpyZXBsYWNlX2Vudl92YXJpYWJsZXMoc3RyLCBlbnZfbWFwKSA9IHJlc3VsdCB7CiAgICAjIG1ha2UgYW4gYXJyYXkgb2YgdGhlIGtleXMgZWcgWyJDTFVTVEVSX0lEIiwgIk5PREVfTkFNRSJdCiAgICBrZXlzIDo9IFt4IHwgc29tZSB4IGluIG9iamVjdC5rZXlzKGVudl9tYXApXQogICAgcmVzdWx0IDo9IHJlcGxhY2Vfc3RyX3JlYyhzdHIsIGVudl9tYXAsIGtleXMsIGNvdW50KGtleXMpIC0gMSkKfQoKIyBiYXNlIGNhc2UKcmVwbGFjZV9zdHJfcmVjKHN0ciwgZW52X21hcCwgYXJyX2tleXMsIGkpID0gcmVzdWx0IHsKICAgIGkgPCAwCiAgICByZXN1bHQgOj0gc3RyCn0KCiMgcmVjdXJzaXZlIHN0ZXAKcmVwbGFjZV9zdHJfcmVjKHN0ciwgZW52X21hcCwgYXJyX2tleXMsIGkpID0gcmVzdWx0IHsKICAgIGkgPj0gMAogICAga2V5IDo9IGFycl9rZXlzW2ldCiAgICBlbnZfa2V5MSA6PSBjb25jYXQoIiIsIFsiJCgiLCBrZXksICIpIl0pCiAgICAjIHJlcGxhY2UgJChWQVIpIHdpdGggdmFsdWUKICAgIG5ld19zdHIxIDo9IHJlcGxhY2Uoc3RyLCBlbnZfa2V5MSwgZW52X21hcFtrZXldKQogICAgIyByZXBsYWNlIG5leHQgZW52aXJvbm1lbnQgdmFyaWFibGUKICAgIHJlc3VsdCA9IHJlcGxhY2Vfc3RyX3JlYyhuZXdfc3RyMSwgZW52X21hcCwgYXJyX2tleXMsIGkgLSAxKQp9CgphbGxvd19lbnZfbWFwKHBfZW52X21hcCwgaV9lbnZfbWFwKSB7CiAgICBwcmludCgiYWxsb3dfZW52X21hcDogcF9lbnZfbWFwID0iLCBwX2Vudl9tYXApCiAgICBldmVyeSBlbnZfa2V5LCBlbnZfdmFsIGluIGlfZW52X21hcCB7CiAgICAgICAgcHJpbnQoImFsbG93X2VudjogZW52X2tleSA9IiwgZW52X2tleSwgImVudl92YWwgPSIsIGVudl92YWwpCiAgICAgICAgYWxsb3dfZW52X21hcF9lbnRyeShlbnZfa2V5LCBlbnZfdmFsLCBwX2Vudl9tYXApCiAgICB9CiAgICBwcmludCgiYWxsb3dfZW52X21hcDogdHJ1ZSIpCn0KCiMgQWxsb3cgZXhhY3QgbWF0Y2gKYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBpX3ZhbCA9PSBwX3ZhbAogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnk6IHRydWUiKQp9CgojIEFsbG93IHJlc291cmNlRmllbGRSZWYgdmFsdWVzIChlLmcuLCAibGltaXRzLmNwdSIpLgphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgICMgYSB2YXJpYWJsZSB3ZSBzaG91bGQgYmUgdmFsaWRhdGluZyB1c2luZyBhIHJlZ2V4IGZyb20gc2V0dGluZ3MKICAgIHBfdmFsID09ICIkKHZhbGlkYXRlLWZyb20tc2V0dGluZ3MpIgogICAgcmVnZXhfdmFsIDo9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuQ3JlYXRlQ29udGFpbmVyUmVxdWVzdC5hbGxvd19lbnZfcmVnZXhfbWFwW2tleV0KICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4X3ZhbCwgaV92YWwpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSAyOiB0cnVlIikKfQoKIyBBbGxvdyBub2RlLW5hbWUKYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChub2RlLW5hbWUpIgogICAgcmVnZXgubWF0Y2gocG9saWN5X2RhdGEuY29tbW9uLmRuc19zdWJkb21haW4gLCBpX3ZhbCkKICAgIHByaW50KCJhbGxvd19lbnZfbWFwX2VudHJ5IDM6IHRydWUiKQp9CgojIEFsbG93IGhvc3QtbmFtZQphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgIHBfdmFsID09ICIkKGhvc3QtbmFtZSkiCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24uZG5zX2xhYmVsICwgaV92YWwpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSA0OiB0cnVlIikKfQoKIyBBbGxvdyBwb2QtdWlkCmFsbG93X2Vudl9tYXBfZW50cnkoa2V5LCBpX3ZhbCwgcF9lbnZfbWFwKSB7CiAgICBwX3ZhbCA6PSBwX2Vudl9tYXBba2V5XQogICAgcF92YWwgPT0gIiQocG9kLXVpZCkiCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24ucG9kX3VpZCAsIGlfdmFsKQogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgNTogdHJ1ZSIpCn0KCiMgQWxsb3cgZmllbGRSZWYgImZpZWxkUGF0aDogc3RhdHVzLnBvZElQIiB2YWx1ZXMuCmFsbG93X2Vudl9tYXBfZW50cnkoa2V5LCBpX3ZhbCwgcF9lbnZfbWFwKSB7CiAgICBpc19pcChpX3ZhbCkKCiAgICBwX3ZhbCA6PSBwX2Vudl9tYXBba2V5XQogICAgcF92YXIgOj0gY29uY2F0KCI9IiwgW2tleSwgcF92YWxdKQogICAgYWxsb3dfcG9kX2lwX3ZhcihrZXksIHBfdmFyKQogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgNjogdHJ1ZSIpCn0KCiMgQWxsb3cgZmllbGRSZWYgImZpZWxkUGF0aDogc3RhdHVzLmhvc3RJUCIgdmFsdWVzLgphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgaXNfaXAoaV92YWwpCgogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgIHBfdmFyIDo9IGNvbmNhdCgiPSIsIFtrZXksIHBfdmFsXSkKICAgIGFsbG93X2hvc3RfaXBfdmFyKGtleSwgcF92YXIpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSA3OiB0cnVlIikKfQoKIyBNYXRjaCBpbnB1dCB3aXRoIG9uZSBvZiB0aGUgcG9saWN5IHZhcmlhYmxlcywgYWZ0ZXIgc3Vic3RpdHV0aW5nICQoc2FuZGJveC1uYW1lKS4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChzYW5kYm94LW5hbWUpIgogICAgc19uYW1lIDo9IGlucHV0LmJhc2UuT0NJLkFubm90YXRpb25zW1NfTkFNRV9LRVldCiAgICBwX3ZhcjIgOj0gcmVwbGFjZShwX3ZhbCwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHBfdmFyMiA9PSBpX3ZhbAogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgODogdHJ1ZSIpCn0KCiMgTWF0Y2ggaW5wdXQgd2l0aCBvbmUgb2YgdGhlIHBvbGljeSB2YXJpYWJsZXMsIGFmdGVyIHN1YnN0aXR1dGluZyAkKHNhbmRib3gtbmFtZXNwYWNlKS4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChzYW5kYm94LW5hbWVzcGFjZSkiCiAgICBzX25hbWVzcGFjZSA6PSBpbnB1dC5iYXNlLk9DSS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwX3ZhcjIgOj0gcmVwbGFjZShwX3ZhbCwgIiQoc2FuZGJveC1uYW1lc3BhY2UpIiwgc19uYW1lc3BhY2UpCiAgICBwX3ZhcjIgPT0gaV92YWwKICAgIHByaW50KCJhbGxvd19lbnZfbWFwX2VudHJ5IDk6IHRydWUiKQp9CgojIEFsbG93IGlucHV0IGVudiB2YXJpYWJsZXMgdGhhdCBtYXRjaCB3aXRoIGEgcmVxdWVzdF9kZWZhdWx0cyByZWdleC4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHNvbWUgcF9yZWdleDEgaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5DcmVhdGVDb250YWluZXJSZXF1ZXN0LmFsbG93X2Vudl9yZWdleAogICAgcF9yZWdleDIgOj0gcmVwbGFjZShwX3JlZ2V4MSwgIiQoaXB2NF9hKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcHY0X2EpCiAgICBwX3JlZ2V4MyA6PSByZXBsYWNlKHBfcmVnZXgyLCAiJChpcF9wKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcF9wKQogICAgcF9yZWdleDQgOj0gcmVwbGFjZShwX3JlZ2V4MywgIiQoc3ZjX25hbWUpIiwgcG9saWN5X2RhdGEuY29tbW9uLnN2Y19uYW1lKQogICAgcF9yZWdleDUgOj0gcmVwbGFjZShwX3JlZ2V4NCwgIiQoZG5zX2xhYmVsKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5kbnNfbGFiZWwpCgogICAgcmVzdWx0IDo9IGNvbmNhdCgiPSIsIFtrZXksIGlfdmFsXSkKICAgIHJlZ2V4Lm1hdGNoKHBfcmVnZXg1LCByZXN1bHQpCgogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgMTA6IHRydWUiKQp9CgpDcmVhdGVDb250YWluZXJSZXF1ZXN0Oj0gcmVzcCB7CiAgICBub3QgaW5wdXQuZW52X21hcAogICAgaV9wcm9jZXNzID0gaW5wdXQuT0NJLlByb2Nlc3MKICAgIHNfbmFtZSA9IGlucHV0Lk9DSS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBwX3Byb2Nlc3MgPSBwX2NvbnRhaW5lci5PQ0kuUHJvY2VzcwogICAgYWxsb3dfZGVwcmVjYXRlZF9hcmdzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUpCiAgICByZXNwID0gQ3JlYXRlQ29udGFpbmVyUmVxdWVzdENvbW1vbihpbnB1dCkKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0MjogdHJ1ZSIpCn0KCkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb24ocmVxKTo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgICMgQ2hlY2sgaWYgdGhlIGlucHV0IHJlcXVlc3Qgc2hvdWxkIGJlIHJlamVjdGVkIGV2ZW4gYmVmb3JlIGNoZWNraW5nIHRoZQogICAgIyBwb2xpY3lfZGF0YS5jb250YWluZXJzIGluZm9ybWF0aW9uLgogICAgYWxsb3dfY3JlYXRlX2NvbnRhaW5lcl9pbnB1dChyZXEpCgogICAgaV9vY2kgOj0gcmVxLk9DSQogICAgaV9zdG9yYWdlcyA6PSByZXEuc3RvcmFnZXMKICAgIGlfZGV2aWNlcyA6PSByZXEuZGV2aWNlcwoKICAgICMgYXJyYXkgb2YgcG9zc2libGUgc3RhdGUgb3BlcmF0aW9ucwogICAgb3BzX2J1aWxkZXIgOj0gW10KCiAgICAjIGNoZWNrIHNhbmRib3ggbmFtZQogICAgc2FuZGJveF9uYW1lID0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FX0tFWV0KICAgIGFkZF9zYW5kYm94X25hbWVfdG9fc3RhdGUgOj0gc3RhdGVfYWxsb3dzKCJzYW5kYm94X25hbWUiLCBzYW5kYm94X25hbWUpCiAgICBvcHNfYnVpbGRlcjEgOj0gY29uY2F0X29wX2lmX25vdF9udWxsKG9wc19idWlsZGVyLCBhZGRfc2FuZGJveF9uYW1lX3RvX3N0YXRlKQoKICAgICMgQ2hlY2sgaWYgYW55IGVsZW1lbnQgZnJvbSB0aGUgcG9saWN5X2RhdGEuY29udGFpbmVycyBhcnJheSBhbGxvd3MgdGhlIGlucHV0IHJlcXVlc3QuCiAgICBzb21lIHBfY29udGFpbmVyIGluIHBvbGljeV9kYXRhLmNvbnRhaW5lcnMKICAgIHByaW50KCI9PT09PT09PSBDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiB0cnlpbmcgbmV4dCBwb2xpY3kgY29udGFpbmVyIikKCiAgICBwX3BpZG5zIDo9IHBfY29udGFpbmVyLnNhbmRib3hfcGlkbnMKICAgIGlfcGlkbnMgOj0gcmVxLnNhbmRib3hfcGlkbnMKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiBwX3BpZG5zID0iLCBwX3BpZG5zLCAiaV9waWRucyA9IiwgaV9waWRucykKICAgIHBfcGlkbnMgPT0gaV9waWRucwoKICAgIHBfb2NpIDo9IHBfY29udGFpbmVyLk9DSQoKICAgICMgY2hlY2sgbmFtZXNwYWNlCiAgICBwX25hbWVzcGFjZSA6PSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBpX25hbWVzcGFjZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwcmludCAoIkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb246IHBfbmFtZXNwYWNlID0iLCBwX25hbWVzcGFjZSwgImlfbmFtZXNwYWNlID0iLCBpX25hbWVzcGFjZSkKICAgIGFkZF9uYW1lc3BhY2VfdG9fc3RhdGUgOj0gYWxsb3dfbmFtZXNwYWNlKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkKICAgIG9wc19idWlsZGVyMiA6PSBjb25jYXRfb3BfaWZfbm90X251bGwob3BzX2J1aWxkZXIxLCBhZGRfbmFtZXNwYWNlX3RvX3N0YXRlKQoKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiBwIFZlcnNpb24gPSIsIHBfb2NpLlZlcnNpb24sICJpIFZlcnNpb24gPSIsIGlfb2NpLlZlcnNpb24pCiAgICBwX29jaS5WZXJzaW9uID09IGlfb2NpLlZlcnNpb24KCiAgICBwcmludCgiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdENvbW1vbjogcCBSZWFkb25seSA9IiwgcF9vY2kuUm9vdC5SZWFkb25seSwgImkgUmVhZG9ubHkgPSIsIGlfb2NpLlJvb3QuUmVhZG9ubHkpCiAgICBwX29jaS5Sb290LlJlYWRvbmx5ID09IGlfb2NpLlJvb3QuUmVhZG9ubHkKCiAgICBhbGxvd19hbm5vKHBfb2NpLCBpX29jaSkKCiAgICBwX3N0b3JhZ2VzIDo9IHBfY29udGFpbmVyLnN0b3JhZ2VzCiAgICBhbGxvd19ieV9hbm5vKHBfb2NpLCBpX29jaSwgcF9zdG9yYWdlcywgaV9zdG9yYWdlcykKCiAgICBwX2RldmljZXMgOj0gcF9jb250YWluZXIuZGV2aWNlcwogICAgYWxsb3dfZGV2aWNlcyhwX2RldmljZXMsIGlfZGV2aWNlcykKCiAgICByZXQgOj0gYWxsb3dfbGludXgob3BzX2J1aWxkZXIyLCBwX29jaSwgaV9vY2kpCiAgICByZXQuYWxsb3dlZAoKICAgIG9wcyA6PSByZXQub3BzCgogICAgcHJpbnQoIkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb246IHRydWUiKQp9CgphbGxvd19jcmVhdGVfY29udGFpbmVyX2lucHV0KHJlcSkgewogICAgcHJpbnQoImFsbG93X2NyZWF0ZV9jb250YWluZXJfaW5wdXQ6IGlucHV0ID0iLCByZXEpCgogICAgY291bnQocmVxLnNoYXJlZF9tb3VudHMpID09IDAKICAgIGlzX251bGwocmVxLnN0cmluZ191c2VyKQoKICAgIGlfb2NpIDo9IHJlcS5PQ0kKICAgIGlzX251bGwoaV9vY2kuSG9va3MpCiAgICBpc19udWxsKGlfb2NpLlNvbGFyaXMpCiAgICBpc19udWxsKGlfb2NpLldpbmRvd3MpCgogICAgaV9saW51eCA6PSBpX29jaS5MaW51eAogICAgY291bnQoaV9saW51eC5HSURNYXBwaW5ncykgPT0gMAogICAgY291bnQoaV9saW51eC5Nb3VudExhYmVsKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlJlc291cmNlcy5EZXZpY2VzKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlJvb3Rmc1Byb3BhZ2F0aW9uKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlVJRE1hcHBpbmdzKSA9PSAwCiAgICBpc19udWxsKGlfbGludXguSW50ZWxSZHQpCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLkJsb2NrSU8pCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLk5ldHdvcmspCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLlBpZHMpCiAgICBpc19udWxsKGlfbGludXguU2VjY29tcCkKCiAgICBpX3Byb2Nlc3MgOj0gaV9vY2kuUHJvY2VzcwogICAgY291bnQoaV9wcm9jZXNzLlNlbGludXhMYWJlbCkgPT0gMAogICAgY291bnQoaV9wcm9jZXNzLlVzZXIuVXNlcm5hbWUpID09IDAKCiAgICBwcmludCgiYWxsb3dfY3JlYXRlX2NvbnRhaW5lcl9pbnB1dDogdHJ1ZSIpCn0KCmFsbG93X25hbWVzcGFjZShwX25hbWVzcGFjZSwgaV9uYW1lc3BhY2UpID0gYWRkX25hbWVzcGFjZSB7CiAgICBwX25hbWVzcGFjZSA9PSBpX25hbWVzcGFjZQogICAgYWRkX25hbWVzcGFjZSA6PSBudWxsCiAgICBwcmludCgiYWxsb3dfbmFtZXNwYWNlIDE6IGlucHV0IG5hbWVzcGFjZSBtYXRjaGVzIHBvbGljeSBkYXRhIikKfQoKYWxsb3dfbmFtZXNwYWNlKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkgPSBhZGRfbmFtZXNwYWNlIHsKICAgIHBfbmFtZXNwYWNlID09ICIiCiAgICBwcmludCgiYWxsb3dfbmFtZXNwYWNlIDI6IG5vIG5hbWVzcGFjZSBmb3VuZCBvbiBwb2xpY3kgZGF0YSIpCiAgICBhZGRfbmFtZXNwYWNlIDo9IHN0YXRlX2FsbG93cygibmFtZXNwYWNlIiwgaV9uYW1lc3BhY2UpCn0KCiMgdmFsdWUgaGFzbid0IGJlZW4gc2VlbiBiZWZvcmUsIHNhdmUgaXQgdG8gc3RhdGUKc3RhdGVfYWxsb3dzKGtleSwgdmFsdWUpID0gYWN0aW9uIHsKICBzdGF0ZSA6PSBnZXRfc3RhdGUoKQogIHByaW50KCJzdGF0ZV9hbGxvd3MgMTogc3RhdGVba2V5XSA9Iiwgc3RhdGVba2V5XSwgInZhbHVlID0iLCB2YWx1ZSkKICBub3Qgc3RhdGVba2V5XQogIHByaW50KCJzdGF0ZV9hbGxvd3MgMTogc2F2aW5nIHRvIHN0YXRlIGtleSA9Iiwga2V5LCAidmFsdWUgPSIsIHZhbHVlKQogIHBhdGggOj0gZ2V0X3N0YXRlX3BhdGgoa2V5KSAKICBhY3Rpb24gOj0gewogICAgIm9wIjogImFkZCIsCiAgICAicGF0aCI6IHBhdGgsIAogICAgInZhbHVlIjogdmFsdWUsCiAgfQp9CgojIHZhbHVlIG1hdGNoZXMgd2hhdCdzIGluIHN0YXRlLCBhbGxvdyBpdApzdGF0ZV9hbGxvd3Moa2V5LCB2YWx1ZSkgPSBhY3Rpb24gewogIHByaW50KCJzdGF0ZV9hbGxvd3MgMjogc3RhcnQiKQogIHN0YXRlIDo9IGdldF9zdGF0ZSgpCiAgcHJpbnQoInN0YXRlX2FsbG93cyAyOiBzdGF0ZVtrZXldID0iLCBzdGF0ZVtrZXldLCAidmFsdWUgPSIsIHZhbHVlKQogIHZhbHVlID09IHN0YXRlW2tleV0KICBwcmludCgic3RhdGVfYWxsb3dzIDI6IGZvdW5kIGtleSA9Iiwga2V5LCAidmFsdWUgPSIsIHZhbHVlLCAiIGluIHN0YXRlIikKICBhY3Rpb24gOj0gbnVsbAp9CgojIGhlbHBlciBmdW5jdGlvbnMgdG8gaW50ZXJhY3Qgd2l0aCB0aGUgc3RhdGUKZ2V0X3N0YXRlKCkgPSBzdGF0ZSB7CiAgc3RhdGUgOj0gZGF0YVsicHN0YXRlIl0KfQoKZ2V0X3N0YXRlX3ZhbChrZXkpID0gdmFsdWUgewogICAgc3RhdGUgOj0gZ2V0X3N0YXRlKCkKICAgIHZhbHVlIDo9IHN0YXRlW2tleV0KfQoKZ2V0X3N0YXRlX3BhdGgoa2V5KSA9IHBhdGggewogICAgIyBwcmVwZW5kICIvcHN0YXRlLyIgdG8ga2V5CiAgICBwYXRoIDo9IGNvbmNhdCgiLyIsIFsiL3BzdGF0ZSIsIGtleV0pCn0KCiMgSGVscGVyIGZ1bmN0aW9ucyB0byBjb25kaXRpb25hbGx5IGNvbmNhdGVuYXRlIG9wIGlzIG5vdCBudWxsCmNvbmNhdF9vcF9pZl9ub3RfbnVsbChvcHMsIG9wKSA9IHJlc3VsdCB7CiAgICBvcCA9PSBudWxsCiAgICByZXN1bHQgOj0gb3BzCn0KCmNvbmNhdF9vcF9pZl9ub3RfbnVsbChvcHMsIG9wKSA9IHJlc3VsdCB7CiAgICBvcCAhPSBudWxsCiAgICByZXN1bHQgOj0gYXJyYXkuY29uY2F0KG9wcywgW29wXSkKfQoKIyBSZWplY3QgdW5leHBlY3RlZCBhbm5vdGF0aW9ucy4KYWxsb3dfYW5ubyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19hbm5vIDE6IHN0YXJ0IikKCiAgICBub3QgaV9vY2kuQW5ub3RhdGlvbnMKCiAgICBwcmludCgiYWxsb3dfYW5ubyAxOiB0cnVlIikKfQphbGxvd19hbm5vKHBfb2NpLCBpX29jaSkgewogICAgcHJpbnQoImFsbG93X2Fubm8gMjogcCBBbm5vdGF0aW9ucyA9IiwgcF9vY2kuQW5ub3RhdGlvbnMpCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiBpIEFubm90YXRpb25zID0iLCBpX29jaS5Bbm5vdGF0aW9ucykKCiAgICBpX2tleXMgOj0gb2JqZWN0LmtleXMoaV9vY2kuQW5ub3RhdGlvbnMpCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiBpIGtleXMgPSIsIGlfa2V5cykKCiAgICBldmVyeSBpX2tleSBpbiBpX2tleXMgewogICAgICAgIGFsbG93X2Fubm9fa2V5KGlfa2V5LCBwX29jaSkKICAgIH0KCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiB0cnVlIikKfQoKYWxsb3dfYW5ub19rZXkoaV9rZXksIHBfb2NpKSB7CiAgICBwcmludCgiYWxsb3dfYW5ub19rZXkgMTogaSBrZXkgPSIsIGlfa2V5KQoKICAgIHN0YXJ0c3dpdGgoaV9rZXksICJpby5rdWJlcm5ldGVzLmNyaS4iKQoKICAgIHByaW50KCJhbGxvd19hbm5vX2tleSAxOiB0cnVlIikKfQphbGxvd19hbm5vX2tleShpX2tleSwgcF9vY2kpIHsKICAgIHByaW50KCJhbGxvd19hbm5vX2tleSAyOiBpIGtleSA9IiwgaV9rZXkpCgogICAgc29tZSBwX2tleSwgXyBpbiBwX29jaS5Bbm5vdGF0aW9ucwogICAgcF9rZXkgPT0gaV9rZXkKCiAgICBwcmludCgiYWxsb3dfYW5ub19rZXkgMjogdHJ1ZSIpCn0KCiMgR2V0IHRoZSB2YWx1ZSBvZiB0aGUgU19OQU1FX0tFWSBhbm5vdGF0aW9uIGFuZAojIGNvcnJlbGF0ZSBpdCB3aXRoIG90aGVyIGFubm90YXRpb25zIGFuZCBwcm9jZXNzIGZpZWxkcy4KYWxsb3dfYnlfYW5ubyhwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpIHsKICAgIHByaW50KCJhbGxvd19ieV9hbm5vIDE6IHN0YXJ0IikKCiAgICBub3QgcF9vY2kuQW5ub3RhdGlvbnNbU19OQU1FX0tFWV0KCiAgICBpX3NfbmFtZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMTogaV9zX25hbWUgPSIsIGlfc19uYW1lKQoKICAgIGlfc19uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FU1BBQ0VfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMTogaV9zX25hbWVzcGFjZSA9IiwgaV9zX25hbWVzcGFjZSkKCiAgICBhbGxvd19ieV9zYW5kYm94X25hbWUocF9vY2ksIGlfb2NpLCBwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBpX3NfbmFtZSwgaV9zX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfYnlfYW5ubyAxOiB0cnVlIikKfQphbGxvd19ieV9hbm5vKHBfb2NpLCBpX29jaSwgcF9zdG9yYWdlcywgaV9zdG9yYWdlcykgewogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMjogc3RhcnQiKQoKICAgIHBfc19uYW1lIDo9IHBfb2NpLkFubm90YXRpb25zW1NfTkFNRV9LRVldCiAgICBpX3NfbmFtZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMjogaV9zX25hbWUgPSIsIGlfc19uYW1lLCAicF9zX25hbWUgPSIsIHBfc19uYW1lKQoKICAgIGFsbG93X3NhbmRib3hfbmFtZShwX3NfbmFtZSwgaV9zX25hbWUpCgogICAgaV9zX25hbWVzcGFjZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwcmludCgiYWxsb3dfYnlfYW5ubyAyOiBpX3NfbmFtZXNwYWNlID0iLCBpX3NfbmFtZXNwYWNlKQoKICAgIGFsbG93X2J5X3NhbmRib3hfbmFtZShwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMsIGlfc19uYW1lLCBpX3NfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd19ieV9hbm5vIDI6IHRydWUiKQp9CgphbGxvd19ieV9zYW5kYm94X25hbWUocF9vY2ksIGlfb2NpLCBwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfYnlfc2FuZGJveF9uYW1lOiBzdGFydCIpCgogICAgaV9uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FU1BBQ0VfS0VZXQoKICAgIGFsbG93X2J5X2NvbnRhaW5lcl90eXBlcyhwX29jaSwgaV9vY2ksIHNfbmFtZSwgaV9uYW1lc3BhY2UpCiAgICBhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZChwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpCiAgICBhbGxvd19wcm9jZXNzKHBfb2NpLlByb2Nlc3MsIGlfb2NpLlByb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpCgogICAgcHJpbnQoImFsbG93X2J5X3NhbmRib3hfbmFtZTogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfbmFtZShwX3NfbmFtZSwgaV9zX25hbWUpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X25hbWU6IHN0YXJ0IikKICAgIHJlZ2V4Lm1hdGNoKHBfc19uYW1lLCBpX3NfbmFtZSkKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9uYW1lOiB0cnVlIikKfQoKIyBDaGVjayB0aGF0IHRoZSAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLXR5cGUiIGFuZAojICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIiBhbm5vdGF0aW9ucyBkZXNpZ25hdGUgdGhlCiMgZXhwZWN0ZWQgdHlwZSAtIGVpdGhlciBhICJzYW5kYm94IiBvciBhICJjb250YWluZXIiLiBUaGVuLCB2YWxpZGF0ZQojIG90aGVyIGFubm90YXRpb25zIGJhc2VkIG9uIHRoZSBhY3R1YWwgInNhbmRib3giIG9yICJjb250YWluZXIiIHZhbHVlCiMgZnJvbSB0aGUgaW5wdXQgY29udGFpbmVyLgphbGxvd19ieV9jb250YWluZXJfdHlwZXMocF9vY2ksIGlfb2NpLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfYnlfY29udGFpbmVyX3R5cGVzOiBjaGVja2luZyBpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSIpCgogICAgY190eXBlIDo9ICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSIKICAgIAogICAgcF9jcmlfdHlwZSA6PSBwX29jaS5Bbm5vdGF0aW9uc1tjX3R5cGVdCiAgICBpX2NyaV90eXBlIDo9IGlfb2NpLkFubm90YXRpb25zW2NfdHlwZV0KICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZXM6IHBfY3JpX3R5cGUgPSIsIHBfY3JpX3R5cGUsICJpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgcF9jcmlfdHlwZSA9PSBpX2NyaV90eXBlCgogICAgYWxsb3dfYnlfY29udGFpbmVyX3R5cGUoaV9jcmlfdHlwZSwgcF9vY2ksIGlfb2NpLCBzX25hbWUsIHNfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZXM6IHRydWUiKQp9CgphbGxvd19ieV9jb250YWluZXJfdHlwZShpX2NyaV90eXBlLCBwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAxOiBpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgaV9jcmlfdHlwZSA9PSAic2FuZGJveCIKCiAgICBpX2thdGFfdHlwZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1siaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5jb250YWluZXJfdHlwZSJdCiAgICBwcmludCgiYWxsb3dfYnlfY29udGFpbmVyX3R5cGUgMTogaV9rYXRhX3R5cGUgPSIsIGlfa2F0YV90eXBlKQogICAgaV9rYXRhX3R5cGUgPT0gInBvZF9zYW5kYm94IgoKICAgIGFsbG93X3NhbmRib3hfY29udGFpbmVyX25hbWUocF9vY2ksIGlfb2NpKQogICAgYWxsb3dfc2FuZGJveF9uZXRfbmFtZXNwYWNlKHBfb2NpLCBpX29jaSkKICAgIGFsbG93X3NhbmRib3hfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpCgogICAgcHJpbnQoImFsbG93X2J5X2NvbnRhaW5lcl90eXBlIDE6IHRydWUiKQp9CgphbGxvd19ieV9jb250YWluZXJfdHlwZShpX2NyaV90eXBlLCBwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiBpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgaV9jcmlfdHlwZSA9PSAiY29udGFpbmVyIgoKICAgIGlfa2F0YV90eXBlIDo9IGlfb2NpLkFubm90YXRpb25zWyJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIl0KICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiBpX2thdGFfdHlwZSA9IiwgaV9rYXRhX3R5cGUpCiAgICBpX2thdGFfdHlwZSA9PSAicG9kX2NvbnRhaW5lciIKCiAgICBhbGxvd19jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpCiAgICBhbGxvd19uZXRfbmFtZXNwYWNlKHBfb2NpLCBpX29jaSkKICAgIGFsbG93X2xvZ19kaXJlY3RvcnkocF9vY2ksIGlfb2NpKQoKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiB0cnVlIikKfQoKIyAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLW5hbWUiIGFubm90YXRpb24KYWxsb3dfc2FuZGJveF9jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X2NvbnRhaW5lcl9uYW1lOiBzdGFydCIpCgogICAgY29udGFpbmVyX2Fubm90YXRpb25fbWlzc2luZyhwX29jaSwgaV9vY2ksICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItbmFtZSIpCgogICAgcHJpbnQoImFsbG93X3NhbmRib3hfY29udGFpbmVyX25hbWU6IHRydWUiKQp9CgphbGxvd19jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19jb250YWluZXJfbmFtZTogc3RhcnQiKQoKICAgIGFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uKHBfb2NpLCBpX29jaSwgImlvLmt1YmVybmV0ZXMuY3JpLmNvbnRhaW5lci1uYW1lIikKCiAgICBwcmludCgiYWxsb3dfY29udGFpbmVyX25hbWU6IHRydWUiKQp9Cgpjb250YWluZXJfYW5ub3RhdGlvbl9taXNzaW5nKHBfb2NpLCBpX29jaSwga2V5KSB7CiAgICBwcmludCgiY29udGFpbmVyX2Fubm90YXRpb25fbWlzc2luZzoiLCBrZXkpCgogICAgbm90IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIG5vdCBpX29jaS5Bbm5vdGF0aW9uc1trZXldCgogICAgcHJpbnQoImNvbnRhaW5lcl9hbm5vdGF0aW9uX21pc3Npbmc6IHRydWUiKQp9CgphbGxvd19jb250YWluZXJfYW5ub3RhdGlvbihwX29jaSwgaV9vY2ksIGtleSkgewogICAgcHJpbnQoImFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uOiBrZXkgPSIsIGtleSkKCiAgICBwX3ZhbHVlIDo9IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIGlfdmFsdWUgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgcHJpbnQoImFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uOiBwX3ZhbHVlID0iLCBwX3ZhbHVlLCAiaV92YWx1ZSA9IiwgaV92YWx1ZSkKCiAgICBwX3ZhbHVlID09IGlfdmFsdWUKCiAgICBwcmludCgiYWxsb3dfY29udGFpbmVyX2Fubm90YXRpb246IHRydWUiKQp9CgojICJuZXJkY3RsL25ldHdvcmstbmFtZXNwYWNlIiBhbm5vdGF0aW9uCmFsbG93X3NhbmRib3hfbmV0X25hbWVzcGFjZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X25ldF9uYW1lc3BhY2U6IHN0YXJ0IikKCiAgICBrZXkgOj0gIm5lcmRjdGwvbmV0d29yay1uYW1lc3BhY2UiCgogICAgcF9uYW1lc3BhY2UgOj0gcF9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgaV9uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgcHJpbnQoImFsbG93X3NhbmRib3hfbmV0X25hbWVzcGFjZTogcF9uYW1lc3BhY2UgPSIsIHBfbmFtZXNwYWNlLCAiaV9uYW1lc3BhY2UgPSIsIGlfbmFtZXNwYWNlKQoKICAgIHJlZ2V4Lm1hdGNoKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9uZXRfbmFtZXNwYWNlOiB0cnVlIikKfQoKYWxsb3dfbmV0X25hbWVzcGFjZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19uZXRfbmFtZXNwYWNlOiBzdGFydCIpCgogICAga2V5IDo9ICJuZXJkY3RsL25ldHdvcmstbmFtZXNwYWNlIgoKICAgIG5vdCBwX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICBub3QgaV9vY2kuQW5ub3RhdGlvbnNba2V5XQoKICAgIHByaW50KCJhbGxvd19uZXRfbmFtZXNwYWNlOiB0cnVlIikKfQoKIyAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1sb2ctZGlyZWN0b3J5IiBhbm5vdGF0aW9uCmFsbG93X3NhbmRib3hfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X2xvZ19kaXJlY3Rvcnk6IHN0YXJ0IikKCiAgICBrZXkgOj0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbG9nLWRpcmVjdG9yeSIKCiAgICBwX2RpciA6PSBwX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICByZWdleDEgOj0gcmVwbGFjZShwX2RpciwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHJlZ2V4MiA6PSByZXBsYWNlKHJlZ2V4MSwgIiQoc2FuZGJveC1uYW1lc3BhY2UpIiwgc19uYW1lc3BhY2UpCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiByZWdleDIgPSIsIHJlZ2V4MikKCiAgICBpX2RpciA6PSBpX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiBpX2RpciA9IiwgaV9kaXIpCgogICAgcmVnZXgubWF0Y2gocmVnZXgyLCBpX2RpcikKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiB0cnVlIikKfQoKYWxsb3dfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19sb2dfZGlyZWN0b3J5OiBzdGFydCIpCgogICAga2V5IDo9ICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWxvZy1kaXJlY3RvcnkiCgogICAgbm90IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIG5vdCBpX29jaS5Bbm5vdGF0aW9uc1trZXldCgogICAgcHJpbnQoImFsbG93X2xvZ19kaXJlY3Rvcnk6IHRydWUiKQp9CgphbGxvd19kZXZpY2VzKHBfZGV2aWNlcywgaV9kZXZpY2VzKSB7CiAgICBwcmludCgiYWxsb3dfZGV2aWNlczogc3RhcnQiKQogICAgZXZlcnkgaV9kZXZpY2UgaW4gaV9kZXZpY2VzIHsKICAgICAgICBwcmludCgiYWxsb3dfZGV2aWNlczogaV9kZXZpY2UgPSIsIGlfZGV2aWNlKQogICAgICAgIHNvbWUgcF9kZXZpY2UgaW4gcF9kZXZpY2VzCiAgICAgICAgcF9kZXZpY2UuY29udGFpbmVyX3BhdGggPT0gaV9kZXZpY2UuY29udGFpbmVyX3BhdGgKICAgIH0KICAgIHByaW50KCJhbGxvd19kZXZpY2VzOiB0cnVlIikKfQoKYWxsb3dfbGludXgoc3RhdGVfb3BzLCBwX29jaSwgaV9vY2kpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIHBfbmFtZXNwYWNlcyA6PSBwX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbGludXg6IHAgbmFtZXNwYWNlcyA9IiwgcF9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlcyA6PSBpX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbGludXg6IGkgbmFtZXNwYWNlcyA9IiwgaV9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlX3dpdGhvdXRfbmV0d29yayA6PSBbb2JqIHwgb2JqIDo9IGlfbmFtZXNwYWNlc1tfXTsgb2JqLlR5cGUgIT0gIm5ldHdvcmsiXQoKICAgIHByaW50KCJhbGxvd19saW51eDogaV9uYW1lc3BhY2Vfd2l0aG91dF9uZXR3b3JrID0iLCBpX25hbWVzcGFjZV93aXRob3V0X25ldHdvcmspCgogICAgcF9uYW1lc3BhY2VzID09IGlfbmFtZXNwYWNlX3dpdGhvdXRfbmV0d29yawoKICAgIGFsbG93X21hc2tlZF9wYXRocyhwX29jaSwgaV9vY2kpCiAgICBhbGxvd19yZWFkb25seV9wYXRocyhwX29jaSwgaV9vY2kpCiAgICBhbGxvd19saW51eF9kZXZpY2VzKHBfb2NpLkxpbnV4LkRldmljZXMsIGlfb2NpLkxpbnV4LkRldmljZXMpCiAgICBhbGxvd19saW51eF9zeXNjdGwocF9vY2kuTGludXgsIGlfb2NpLkxpbnV4KQogICAgcmV0IDo9IGFsbG93X25ldHdvcmtfbmFtZXNwYWNlX3N0YXJ0KHN0YXRlX29wcywgcF9vY2ksIGlfb2NpKQogICAgcmV0LmFsbG93ZWQKCiAgICBvcHMgOj0gcmV0Lm9wcwoKICAgIHByaW50KCJhbGxvd19saW51eDogdHJ1ZSIpCn0KCiMgUmV0cmlldmUgdGhlICJuZXR3b3JrIiBuYW1lc3BhY2UgZnJvbSB0aGUgaW5wdXQgZGF0YSBhbmQgcGFzcyBpdCBvbiBmb3IgdGhlCiMgbmV0d29yayBuYW1lc3BhY2UgcG9saWN5IGNoZWNrcy4KYWxsb3dfbmV0d29ya19uYW1lc3BhY2Vfc3RhcnQoc3RhdGVfb3BzLCBwX29jaSwgaV9vY2kpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIHByaW50KCJhbGxvd19uZXR3b3JrX25hbWVzcGFjZSBzdGFydDogc3RhcnQiKQoKICAgIHBfbmFtZXNwYWNlcyA6PSBwX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IHAgbmFtZXNwYWNlcyA9IiwgcF9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlcyA6PSBpX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IGkgbmFtZXNwYWNlcyA9IiwgaV9uYW1lc3BhY2VzKQoKICAgICMgUmV0dXJuIHBhdGggb2YgdGhlICJuZXR3b3JrIiBuYW1lc3BhY2UKICAgIG5ldHdvcmtfbnMgOj0gW29iaiB8IG9iaiA6PSBpX25hbWVzcGFjZXNbX107IG9iai5UeXBlID09ICJuZXR3b3JrIl0KCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IG5ldHdvcmtfbnMgPSIsIG5ldHdvcmtfbnMpCgogICAgcmV0IDo9IGFsbG93X25ldHdvcmtfbmFtZXNwYWNlKHN0YXRlX29wcywgbmV0d29ya19ucykKICAgIHJldC5hbGxvd2VkCgogICAgb3BzIDo9IHJldC5vcHMKfQoKIyBUaGlzIHJ1bGUgaXMgd2hlbiB0aGVyZSdzIG5vIG5ldHdvcmsgbmFtZXNwYWNlIGluIHRoZSBpbnB1dCBkYXRhLgphbGxvd19uZXR3b3JrX25hbWVzcGFjZShzdGF0ZV9vcHMsIG5ldHdvcmtfbnMpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIGNvdW50KG5ldHdvcmtfbnMpID09IDAKCiAgICBuZXR3b3JrX25zX3BhdGggPSAiIgoKICAgIGFkZF9uZXR3b3JrX25hbWVzcGFjZV90b19zdGF0ZSA6PSBzdGF0ZV9hbGxvd3MoIm5ldHdvcmtfbmFtZXNwYWNlIiwgbmV0d29ya19uc19wYXRoKQogICAgb3BzIDo9IGNvbmNhdF9vcF9pZl9ub3RfbnVsbChzdGF0ZV9vcHMsIGFkZF9uZXR3b3JrX25hbWVzcGFjZV90b19zdGF0ZSkKCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2UgMTogdHJ1ZSIpCn0KCiMgVGhpcyBydWxlIGlzIHdoZW4gdGhlcmUncyBleGFjdGx5IG9uZSBuZXR3b3JrIG5hbWVzcGFjZSBpbiB0aGUgaW5wdXQgZGF0YS4KYWxsb3dfbmV0d29ya19uYW1lc3BhY2Uoc3RhdGVfb3BzLCBuZXR3b3JrX25zKSA6PSB7Im9wcyI6IG9wcywgImFsbG93ZWQiOiB0cnVlfSB7CiAgICBjb3VudChuZXR3b3JrX25zKSA9PSAxCgogICAgYWRkX25ldHdvcmtfbmFtZXNwYWNlX3RvX3N0YXRlIDo9IHN0YXRlX2FsbG93cygibmV0d29ya19uYW1lc3BhY2UiLCBuZXR3b3JrX25zWzBdLlBhdGgpCiAgICBvcHMgOj0gY29uY2F0X29wX2lmX25vdF9udWxsKHN0YXRlX29wcywgYWRkX25ldHdvcmtfbmFtZXNwYWNlX3RvX3N0YXRlKQoKICAgIHByaW50KCJhbGxvd19uZXR3b3JrX25hbWVzcGFjZSAyOiB0cnVlIikKfQoKYWxsb3dfbWFza2VkX3BhdGhzKHBfb2NpLCBpX29jaSkgewogICAgcF9wYXRocyA6PSBwX29jaS5MaW51eC5NYXNrZWRQYXRocwogICAgcHJpbnQoImFsbG93X21hc2tlZF9wYXRocyAxOiBwX3BhdGhzID0iLCBwX3BhdGhzKQoKICAgIGlfcGF0aHMgOj0gaV9vY2kuTGludXguTWFza2VkUGF0aHMKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aHMgMTogaV9wYXRocyA9IiwgaV9wYXRocykKCiAgICBhbGxvd19tYXNrZWRfcGF0aHNfYXJyYXkocF9wYXRocywgaV9wYXRocykKCiAgICBwcmludCgiYWxsb3dfbWFza2VkX3BhdGhzIDE6IHRydWUiKQp9CmFsbG93X21hc2tlZF9wYXRocyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aHMgMjogc3RhcnQiKQoKICAgIG5vdCBwX29jaS5MaW51eC5NYXNrZWRQYXRocwogICAgbm90IGlfb2NpLkxpbnV4Lk1hc2tlZFBhdGhzCgogICAgcHJpbnQoImFsbG93X21hc2tlZF9wYXRocyAyOiB0cnVlIikKfQoKIyBBbGwgdGhlIHBvbGljeSBtYXNrZWQgcGF0aHMgbXVzdCBiZSBtYXNrZWQgaW4gdGhlIGlucHV0IGRhdGEgdG9vLgojIElucHV0IGlzIGFsbG93ZWQgdG8gaGF2ZSBtb3JlIG1hc2tlZCBwYXRocyB0aGFuIHRoZSBwb2xpY3kuCmFsbG93X21hc2tlZF9wYXRoc19hcnJheShwX2FycmF5LCBpX2FycmF5KSB7CiAgICBldmVyeSBwX2VsZW0gaW4gcF9hcnJheSB7CiAgICAgICAgYWxsb3dfbWFza2VkX3BhdGgocF9lbGVtLCBpX2FycmF5KQogICAgfQp9CgphbGxvd19tYXNrZWRfcGF0aChwX2VsZW0sIGlfYXJyYXkpIHsKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aDogcF9lbGVtID0iLCBwX2VsZW0pCgogICAgc29tZSBpX2VsZW0gaW4gaV9hcnJheQogICAgcF9lbGVtID09IGlfZWxlbQoKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aDogdHJ1ZSIpCn0KCmFsbG93X3JlYWRvbmx5X3BhdGhzKHBfb2NpLCBpX29jaSkgewogICAgcF9wYXRocyA6PSBwX29jaS5MaW51eC5SZWFkb25seVBhdGhzCiAgICBwcmludCgiYWxsb3dfcmVhZG9ubHlfcGF0aHMgMTogcF9wYXRocyA9IiwgcF9wYXRocykKCiAgICBpX3BhdGhzIDo9IGlfb2NpLkxpbnV4LlJlYWRvbmx5UGF0aHMKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAxOiBpX3BhdGhzID0iLCBpX3BhdGhzKQoKICAgIGFsbG93X3JlYWRvbmx5X3BhdGhzX2FycmF5KHBfcGF0aHMsIGlfcGF0aHMsIGlfb2NpLkxpbnV4Lk1hc2tlZFBhdGhzKQoKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAxOiB0cnVlIikKfQphbGxvd19yZWFkb25seV9wYXRocyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAyOiBzdGFydCIpCgogICAgbm90IHBfb2NpLkxpbnV4LlJlYWRvbmx5UGF0aHMKICAgIG5vdCBpX29jaS5MaW51eC5SZWFkb25seVBhdGhzCgogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGhzIDI6IHRydWUiKQp9CgojIEFsbCB0aGUgcG9saWN5IHJlYWRvbmx5IHBhdGhzIG11c3QgYmUgZWl0aGVyOgojIC0gUHJlc2VudCBpbiB0aGUgaW5wdXQgcmVhZG9ubHkgcGF0aHMsIG9yCiMgLSBQcmVzZW50IGluIHRoZSBpbnB1dCBtYXNrZWQgcGF0aHMuCiMgSW5wdXQgaXMgYWxsb3dlZCB0byBoYXZlIG1vcmUgcmVhZG9ubHkgcGF0aHMgdGhhbiB0aGUgcG9saWN5LgphbGxvd19yZWFkb25seV9wYXRoc19hcnJheShwX2FycmF5LCBpX2FycmF5LCBtYXNrZWRfcGF0aHMpIHsKICAgIGV2ZXJ5IHBfZWxlbSBpbiBwX2FycmF5IHsKICAgICAgICBhbGxvd19yZWFkb25seV9wYXRoKHBfZWxlbSwgaV9hcnJheSwgbWFza2VkX3BhdGhzKQogICAgfQp9CgphbGxvd19yZWFkb25seV9wYXRoKHBfZWxlbSwgaV9hcnJheSwgbWFza2VkX3BhdGhzKSB7CiAgICBwcmludCgiYWxsb3dfcmVhZG9ubHlfcGF0aCAxOiBwX2VsZW0gPSIsIHBfZWxlbSkKCiAgICBzb21lIGlfZWxlbSBpbiBpX2FycmF5CiAgICBwX2VsZW0gPT0gaV9lbGVtCgogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGggMTogdHJ1ZSIpCn0KYWxsb3dfcmVhZG9ubHlfcGF0aChwX2VsZW0sIGlfYXJyYXksIG1hc2tlZF9wYXRocykgewogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGggMjogcF9lbGVtID0iLCBwX2VsZW0pCgogICAgc29tZSBpX21hc2tlZCBpbiBtYXNrZWRfcGF0aHMKICAgIHBfZWxlbSA9PSBpX21hc2tlZAoKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRoIDI6IHRydWUiKQp9CgphbGxvd19saW51eF9kZXZpY2VzKHBfZGV2aWNlcywgaV9kZXZpY2VzKSB7CiAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogc3RhcnQiKQogICAgZXZlcnkgaV9kZXZpY2UgaW4gaV9kZXZpY2VzIHsKICAgICAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogaV9kZXZpY2UgPSIsIGlfZGV2aWNlKQogICAgICAgIHNvbWUgcF9kZXZpY2UgaW4gcF9kZXZpY2VzCiAgICAgICAgaV9kZXZpY2UuUGF0aCA9PSBwX2RldmljZS5QYXRoCiAgICB9CiAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogdHJ1ZSIpCn0KCmFsbG93X2xpbnV4X3N5c2N0bChwX2xpbnV4LCBpX2xpbnV4KSB7CiAgICBwcmludCgiYWxsb3dfbGludXhfc3lzY3RsIDE6IHN0YXJ0IikKICAgIG5vdCBpX2xpbnV4LlN5c2N0bAogICAgcHJpbnQoImFsbG93X2xpbnV4X3N5c2N0bCAxOiB0cnVlIikKfQoKYWxsb3dfbGludXhfc3lzY3RsKHBfbGludXgsIGlfbGludXgpIHsKICAgIHByaW50KCJhbGxvd19saW51eF9zeXNjdGwgMjogc3RhcnQiKQogICAgcF9zeXNjdGwgOj0gcF9saW51eC5TeXNjdGwKICAgIGlfc3lzY3RsIDo9IGlfbGludXguU3lzY3RsCiAgICBldmVyeSBpX25hbWUsIGlfdmFsIGluIGlfc3lzY3RsIHsKICAgICAgICBwcmludCgiYWxsb3dfbGludXhfc3lzY3RsIDI6IGlfbmFtZSA9IiwgaV9uYW1lLCAiaV92YWwgPSIsIGlfdmFsKQogICAgICAgIHBfc3lzY3RsW2lfbmFtZV0gPT0gaV92YWwKICAgIH0KICAgIHByaW50KCJhbGxvd19saW51eF9zeXNjdGwgMjogdHJ1ZSIpCn0KCiMgQ2hlY2sgdGhlIGNvbnNpc3RlbmN5IG9mIHRoZSBpbnB1dCAiaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5idW5kbGVfcGF0aCIKIyBhbmQgaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCIgdmFsdWVzIHdpdGggb3RoZXIgZmllbGRzLgphbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZChwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpIHsKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogc3RhcnQiKQoKICAgIGJ1bmRsZV9wYXRoIDo9IGlfb2NpLkFubm90YXRpb25zWyJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmJ1bmRsZV9wYXRoIl0KICAgIGJ1bmRsZV9pZCA6PSByZXBsYWNlKGJ1bmRsZV9wYXRoLCAiL3J1bi9jb250YWluZXJkL2lvLmNvbnRhaW5lcmQucnVudGltZS52Mi50YXNrL2s4cy5pby8iLCAiIikKCiAgICBidW5kbGVfaWRfZm9ybWF0IDo9IGNvbmNhdCgiIiwgWyJeIiwgQlVORExFX0lELCAiJCJdKQogICAgcmVnZXgubWF0Y2goYnVuZGxlX2lkX2Zvcm1hdCwgYnVuZGxlX2lkKQoKICAgIGtleSA6PSAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCIKCiAgICBwX3JlZ2V4IDo9IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIHNhbmRib3hfaWQgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQoKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogc2FuZGJveF9pZCA9Iiwgc2FuZGJveF9pZCwgInJlZ2V4ID0iLCBwX3JlZ2V4KQogICAgcmVnZXgubWF0Y2gocF9yZWdleCwgc2FuZGJveF9pZCkKCiAgICBhbGxvd19yb290X3BhdGgocF9vY2ksIGlfb2NpLCBidW5kbGVfaWQpCgogICAgZXZlcnkgaV9tb3VudCBpbiBpX29jaS5Nb3VudHMgewogICAgICAgIGFsbG93X21vdW50KHBfb2NpLCBpX21vdW50LCBpX3N0b3JhZ2VzLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpCiAgICB9CgogICAgYWxsb3dfc3RvcmFnZXMocF9zdG9yYWdlcywgaV9zdG9yYWdlcywgYnVuZGxlX2lkLCBzYW5kYm94X2lkKQoKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogdHJ1ZSIpCn0KCmFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHBfcHJvY2VzcyA9IiwgcF9wcm9jZXNzKQogICAgcHJpbnQoImFsbG93X3Byb2Nlc3NfY29tbW9uOiBpX3Byb2Nlc3MgPSAiLCBpX3Byb2Nlc3MpCiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHNfbmFtZSA9Iiwgc19uYW1lKQoKICAgIHBfcHJvY2Vzcy5Dd2QgPT0gaV9wcm9jZXNzLkN3ZAogICAgcF9wcm9jZXNzLk5vTmV3UHJpdmlsZWdlcyA9PSBpX3Byb2Nlc3MuTm9OZXdQcml2aWxlZ2VzCgogICAgYWxsb3dfdXNlcihwX3Byb2Nlc3MsIGlfcHJvY2VzcykKICAgIGFsbG93X2VudihwX3Byb2Nlc3MsIGlfcHJvY2Vzcywgc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHRydWUiKQp9CgojIENvbXBhcmUgdGhlIE9DSSBQcm9jZXNzIGZpZWxkIG9mIGEgcG9saWN5IGNvbnRhaW5lciB3aXRoIHRoZSBpbnB1dCBPQ0kgUHJvY2VzcyBmcm9tIGEgQ3JlYXRlQ29udGFpbmVyUmVxdWVzdAphbGxvd19wcm9jZXNzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfcHJvY2Vzczogc3RhcnQiKQoKICAgIGFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgYWxsb3dfY2FwcyhwX3Byb2Nlc3MuQ2FwYWJpbGl0aWVzLCBpX3Byb2Nlc3MuQ2FwYWJpbGl0aWVzKQogICAgcF9wcm9jZXNzLlRlcm1pbmFsID09IGlfcHJvY2Vzcy5UZXJtaW5hbAoKICAgIHByaW50KCJhbGxvd19wcm9jZXNzOiB0cnVlIikKfQoKIyBDb21wYXJlIHRoZSBPQ0kgUHJvY2VzcyBmaWVsZCBvZiBhIHBvbGljeSBjb250YWluZXIgd2l0aCB0aGUgaW5wdXQgcHJvY2VzcyBmaWVsZCBmcm9tIEV4ZWNQcm9jZXNzUmVxdWVzdAphbGxvd19pbnRlcmFjdGl2ZV9wcm9jZXNzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfaW50ZXJhY3RpdmVfcHJvY2Vzczogc3RhcnQiKQoKICAgIGFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgYWxsb3dfZXhlY19jYXBzKGlfcHJvY2Vzcy5DYXBhYmlsaXRpZXMpCgogICAgIyBUaGVzZSBhcmUgY29tbWFuZHMgZW5hYmxlZCB1c2luZyBFeGVjUHJvY2Vzc1JlcXVlc3QgY29tbWFuZHMgYW5kL29yIHJlZ2V4IGZyb20gdGhlIHNldHRpbmdzIGZpbGUuCiAgICAjIFRoZXkgY2FuIGJlIGV4ZWN1dGVkIGludGVyYWN0aXZlbHkgc28gYWxsb3cgdGhlbSB0byB1c2UgYW55IHZhbHVlIGZvciBpX3Byb2Nlc3MuVGVybWluYWwuCgogICAgcHJpbnQoImFsbG93X2ludGVyYWN0aXZlX3Byb2Nlc3M6IHRydWUiKQp9CgojIENvbXBhcmUgdGhlIE9DSSBQcm9jZXNzIGZpZWxkIG9mIGEgcG9saWN5IGNvbnRhaW5lciB3aXRoIHRoZSBpbnB1dCBwcm9jZXNzIGZpZWxkIGZyb20gRXhlY1Byb2Nlc3NSZXF1ZXN0CmFsbG93X3Byb2JlX3Byb2Nlc3MocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19wcm9iZV9wcm9jZXNzOiBzdGFydCIpCgogICAgYWxsb3dfcHJvY2Vzc19jb21tb24ocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpCiAgICBhbGxvd19leGVjX2NhcHMoaV9wcm9jZXNzLkNhcGFiaWxpdGllcykKICAgIHBfcHJvY2Vzcy5UZXJtaW5hbCA9PSBpX3Byb2Nlc3MuVGVybWluYWwKCiAgICBwcmludCgiYWxsb3dfcHJvYmVfcHJvY2VzczogdHJ1ZSIpCn0KCmFsbG93X3VzZXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MpIHsKICAgIHBfdXNlciA6PSBwX3Byb2Nlc3MuVXNlcgogICAgaV91c2VyIDo9IGlfcHJvY2Vzcy5Vc2VyCgogICAgcHJpbnQoImFsbG93X3VzZXI6IGlucHV0IHVpZCA9IiwgaV91c2VyLlVJRCwgInBvbGljeSB1aWQgPSIsIHBfdXNlci5VSUQpCiAgICBwX3VzZXIuVUlEID09IGlfdXNlci5VSUQKCiAgICAjIFRPRE86IHRyYWNrIGRvd24gdGhlIHJlYXNvbiBmb3IgcmVnaXN0cnkuazhzLmlvL3BhdXNlOjMuOSBiZWluZwogICAgIyAgICAgICBleGVjdXRlZCB3aXRoIGdpZCA9IDAgZGVzcGl0ZSBoYXZpbmcgIjY1NTM1OjY1NTM1IiBpbiBpdHMgY29udGFpbmVyIGltYWdlCiAgICAjICAgICAgIGNvbmZpZy4KICAgICNwcmludCgiYWxsb3dfdXNlcjogaW5wdXQgZ2lkID0iLCBpX3VzZXIuR0lELCAicG9saWN5IGdpZCA9IiwgcF91c2VyLkdJRCkKICAgICNwX3VzZXIuR0lEID09IGlfdXNlci5HSUQKCiAgICAjIFRPRE86IGNvbXBhcmUgdGhlIGFkZGl0aW9uYWxHaWRzIGZpZWxkIHRvbyBhZnRlciBjb21wdXRpbmcgaXRzIHZhbHVlCiAgICAjIGJhc2VkIG9uIC9ldGMvcGFzc3dkIGFuZCAvZXRjL2dyb3VwIGZyb20gdGhlIGNvbnRhaW5lciBpbWFnZS4KfQoKYWxsb3dfZGVwcmVjYXRlZF9hcmdzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZ3MgMTogbm8gYXJncyIpCgogICAgbm90IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJncwogICAgbm90IGlfcHJvY2Vzcy5BcmdzCgogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAxOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZ3MocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSkgewogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiBwb2xpY3kgYXJncyA9IiwgcF9wcm9jZXNzLkRlcHJlY2F0ZWRBcmdzKQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiBpbnB1dCBhcmdzID0iLCBpX3Byb2Nlc3MuQXJncykKCiAgICBjb3VudChwX3Byb2Nlc3MuRGVwcmVjYXRlZEFyZ3MpID09IGNvdW50KGlfcHJvY2Vzcy5BcmdzKQoKICAgIGV2ZXJ5IGksIGlfYXJnIGluIGlfcHJvY2Vzcy5BcmdzIHsKICAgICAgICBhbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpCiAgICB9CgogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDE6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgcF9hcmcyIDo9IHJlcGxhY2UocF9hcmcsICIkJCIsICIkIikKICAgIHBfYXJnMiA9PSBpX2FyZwoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAxOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDI6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgIyBUT0RPOiBjYW4gJChub2RlLW5hbWUpIGJlIGhhbmRsZWQgYmV0dGVyPwogICAgY29udGFpbnMocF9hcmcsICIkKG5vZGUtbmFtZSkiKQoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAyOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDM6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgcF9hcmcyIDo9IHJlcGxhY2UocF9hcmcsICIkJCIsICIkIikKICAgIHBfYXJnMyA6PSByZXBsYWNlKHBfYXJnMiwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAzOiBwX2FyZzMgPSIsIHBfYXJnMykKICAgIHBfYXJnMyA9PSBpX2FyZwoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAzOiB0cnVlIikKfQoKIyBPQ0kgcHJvY2Vzcy5FbnYgZmllbGQKYWxsb3dfZW52KHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfZW52OiBwIGVudiA9IiwgcF9wcm9jZXNzLkVudikKICAgIHByaW50KCJhbGxvd19lbnY6IGkgZW52ID0iLCBpX3Byb2Nlc3MuRW52KQoKICAgIGV2ZXJ5IGlfdmFyIGluIGlfcHJvY2Vzcy5FbnYgewogICAgICAgIHByaW50KCJhbGxvd19lbnY6IGlfdmFyID0iLCBpX3ZhcikKICAgICAgICBhbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgfQoKICAgIHByaW50KCJhbGxvd19lbnY6IHRydWUiKQp9CgojIEFsbG93IGlucHV0IGVudiB2YXJpYWJsZXMgdGhhdCBhcmUgcHJlc2VudCBpbiB0aGUgcG9saWN5IGRhdGEgdG9vLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHBfdmFyID09IGlfdmFyCiAgICBwcmludCgiYWxsb3dfdmFyIDE6IHRydWUiKQp9CgojIE1hdGNoIGlucHV0IHdpdGggb25lIG9mIHRoZSBwb2xpY3kgdmFyaWFibGVzLCBhZnRlciBzdWJzdGl0dXRpbmcgJChzYW5kYm94LW5hbWUpLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHByaW50KCJhbGxvd192YXIgMjogcF92YXIgPSIsIHBfdmFyKQoKICAgIHBfdmFyX3NwbGl0IDo9IHNwbGl0KHBfdmFyLCAiPSIpCiAgICBjb3VudChwX3Zhcl9zcGxpdCkgPT0gMgoKICAgIHBfdmFyX3NwbGl0WzFdID09ICIkKHNhbmRib3gtbmFtZSkiCgogICAgaV92YXJfc3BsaXQgOj0gc3BsaXQoaV92YXIsICI9IikKICAgIGNvdW50KGlfdmFyX3NwbGl0KSA9PSAyCgogICAgaV92YXJfc3BsaXRbMF0gPT0gcF92YXJfc3BsaXRbMF0KICAgIHJlZ2V4Lm1hdGNoKHNfbmFtZSwgaV92YXJfc3BsaXRbMV0pCgogICAgcHJpbnQoImFsbG93X3ZhciAyOiB0cnVlIikKfQoKIyBBbGxvdyBpbnB1dCBlbnYgdmFyaWFibGVzIHRoYXQgbWF0Y2ggd2l0aCBhIHJlcXVlc3RfZGVmYXVsdHMgcmVnZXguCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHNvbWUgcF9yZWdleDEgaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5DcmVhdGVDb250YWluZXJSZXF1ZXN0LmFsbG93X2Vudl9yZWdleAogICAgcF9yZWdleDIgOj0gcmVwbGFjZShwX3JlZ2V4MSwgIiQoaXB2NF9hKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcHY0X2EpCiAgICBwX3JlZ2V4MyA6PSByZXBsYWNlKHBfcmVnZXgyLCAiJChpcF9wKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcF9wKQogICAgcF9yZWdleDQgOj0gcmVwbGFjZShwX3JlZ2V4MywgIiQoc3ZjX25hbWUpIiwgcG9saWN5X2RhdGEuY29tbW9uLnN2Y19uYW1lKQogICAgcF9yZWdleDUgOj0gcmVwbGFjZShwX3JlZ2V4NCwgIiQoZG5zX2xhYmVsKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5kbnNfbGFiZWwpCgogICAgcHJpbnQoImFsbG93X3ZhciAzOiBwX3JlZ2V4NSA9IiwgcF9yZWdleDUpCiAgICByZWdleC5tYXRjaChwX3JlZ2V4NSwgaV92YXIpCgogICAgcHJpbnQoImFsbG93X3ZhciAzOiB0cnVlIikKfQoKIyBBbGxvdyBmaWVsZFJlZiAiZmllbGRQYXRoOiBzdGF0dXMucG9kSVAiIHZhbHVlcy4KYWxsb3dfdmFyKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBpX3Zhciwgc19uYW1lLCBzX25hbWVzcGFjZSkgewogICAgbmFtZV92YWx1ZSA6PSBzcGxpdChpX3ZhciwgIj0iKQogICAgY291bnQobmFtZV92YWx1ZSkgPT0gMgogICAgaXNfaXAobmFtZV92YWx1ZVsxXSkKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIGFsbG93X3BvZF9pcF92YXIobmFtZV92YWx1ZVswXSwgcF92YXIpCgogICAgcHJpbnQoImFsbG93X3ZhciA0OiB0cnVlIikKfQoKIyBBbGxvdyBjb21tb24gZmllbGRSZWYgdmFyaWFibGVzLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBuYW1lX3ZhbHVlIDo9IHNwbGl0KGlfdmFyLCAiPSIpCiAgICBjb3VudChuYW1lX3ZhbHVlKSA9PSAyCgogICAgc29tZSBwX3ZhciBpbiBwX3Byb2Nlc3MuRW52CiAgICBwX25hbWVfdmFsdWUgOj0gc3BsaXQocF92YXIsICI9IikKICAgIGNvdW50KHBfbmFtZV92YWx1ZSkgPT0gMgoKICAgIHBfbmFtZV92YWx1ZVswXSA9PSBuYW1lX3ZhbHVlWzBdCgogICAgIyBUT0RPOiBzaG91bGQgdGhlc2UgYmUgaGFuZGxlZCBpbiBhIGRpZmZlcmVudCB3YXk/CiAgICBhbHdheXNfYWxsb3dlZCA6PSBbIiQoaG9zdC1uYW1lKSIsICIkKG5vZGUtbmFtZSkiLCAiJChwb2QtdWlkKSJdCiAgICBzb21lIGFsbG93ZWQgaW4gYWx3YXlzX2FsbG93ZWQKICAgIGNvbnRhaW5zKHBfbmFtZV92YWx1ZVsxXSwgYWxsb3dlZCkKCiAgICBwcmludCgiYWxsb3dfdmFyIDU6IHRydWUiKQp9CgojIEFsbG93IGZpZWxkUmVmICJmaWVsZFBhdGg6IHN0YXR1cy5ob3N0SVAiIHZhbHVlcy4KYWxsb3dfdmFyKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBpX3Zhciwgc19uYW1lLCBzX25hbWVzcGFjZSkgewogICAgbmFtZV92YWx1ZSA6PSBzcGxpdChpX3ZhciwgIj0iKQogICAgY291bnQobmFtZV92YWx1ZSkgPT0gMgogICAgaXNfaXAobmFtZV92YWx1ZVsxXSkKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIGFsbG93X2hvc3RfaXBfdmFyKG5hbWVfdmFsdWVbMF0sIHBfdmFyKQoKICAgIHByaW50KCJhbGxvd192YXIgNjogdHJ1ZSIpCn0KCiMgQWxsb3cgcmVzb3VyY2VGaWVsZFJlZiB2YWx1ZXMgKGUuZy4sICJsaW1pdHMuY3B1IikuCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIG5hbWVfdmFsdWUgOj0gc3BsaXQoaV92YXIsICI9IikKICAgIGNvdW50KG5hbWVfdmFsdWUpID09IDIKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHBfbmFtZV92YWx1ZSA6PSBzcGxpdChwX3ZhciwgIj0iKQogICAgY291bnQocF9uYW1lX3ZhbHVlKSA9PSAyCgogICAgcF9uYW1lX3ZhbHVlWzBdID09IG5hbWVfdmFsdWVbMF0KCiAgICAjIGEgdmFyaWFibGUgd2Ugc2hvdWxkIGJlIHZhbGlkYXRpbmcgdXNpbmcgYSByZWdleCBmcm9tIHNldHRpbmdzCiAgICBwX25hbWVfdmFsdWVbMV0gPT0gIiQodmFsaWRhdGUtZnJvbS1zZXR0aW5ncykiCgogICAgcmVnZXhfdmFsIDo9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuQ3JlYXRlQ29udGFpbmVyUmVxdWVzdC5hbGxvd19lbnZfcmVnZXhfbWFwW25hbWVfdmFsdWVbMF1dCgogICAgcHJpbnQoImFsbG93X3ZhciA3OiB2YWwgPSIsIG5hbWVfdmFsdWVbMV0pCiAgICBwcmludCgiYWxsb3dfdmFyIDc6IHJlZ2V4X3ZhbCA9IiwgcmVnZXhfdmFsKQoKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4X3ZhbCwgbmFtZV92YWx1ZVsxXSkKCiAgICBwcmludCgiYWxsb3dfdmFyIDc6IHRydWUiKQp9CgojIE1hdGNoIGlucHV0IHdpdGggb25lIG9mIHRoZSBwb2xpY3kgdmFyaWFibGVzLCBhZnRlciBzdWJzdGl0dXRpbmcgJChzYW5kYm94LW5hbWVzcGFjZSkuCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHNvbWUgcF92YXIgaW4gcF9wcm9jZXNzLkVudgogICAgcF92YXIyIDo9IHJlcGxhY2UocF92YXIsICIkKHNhbmRib3gtbmFtZXNwYWNlKSIsIHNfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd192YXIgODogcF92YXIyID0iLCBwX3ZhcjIpCiAgICBwX3ZhcjIgPT0gaV92YXIKCiAgICBwcmludCgiYWxsb3dfdmFyIDg6IHRydWUiKQp9CgphbGxvd19wb2RfaXBfdmFyKHZhcl9uYW1lLCBwX3ZhcikgewogICAgcHJpbnQoImFsbG93X3BvZF9pcF92YXI6IHZhcl9uYW1lID0iLCB2YXJfbmFtZSwgInBfdmFyID0iLCBwX3ZhcikKCiAgICBwX25hbWVfdmFsdWUgOj0gc3BsaXQocF92YXIsICI9IikKICAgIGNvdW50KHBfbmFtZV92YWx1ZSkgPT0gMgoKICAgIHBfbmFtZV92YWx1ZVswXSA9PSB2YXJfbmFtZQogICAgcF9uYW1lX3ZhbHVlWzFdID09ICIkKHBvZC1pcCkiCgogICAgcHJpbnQoImFsbG93X3BvZF9pcF92YXI6IHRydWUiKQp9CgphbGxvd19ob3N0X2lwX3Zhcih2YXJfbmFtZSwgcF92YXIpIHsKICAgIHByaW50KCJhbGxvd19ob3N0X2lwX3ZhcjogdmFyX25hbWUgPSIsIHZhcl9uYW1lLCAicF92YXIgPSIsIHBfdmFyKQoKICAgIHBfbmFtZV92YWx1ZSA6PSBzcGxpdChwX3ZhciwgIj0iKQogICAgY291bnQocF9uYW1lX3ZhbHVlKSA9PSAyCgogICAgcF9uYW1lX3ZhbHVlWzBdID09IHZhcl9uYW1lCiAgICBwX25hbWVfdmFsdWVbMV0gPT0gIiQoaG9zdC1pcCkiCgogICAgcHJpbnQoImFsbG93X2hvc3RfaXBfdmFyOiB0cnVlIikKfQoKaXNfaXAodmFsdWUpIHsKICAgIGJ5dGVzID0gc3BsaXQodmFsdWUsICIuIikKICAgIGNvdW50KGJ5dGVzKSA9PSA0CgogICAgaXNfaXBfZmlyc3RfYnl0ZShieXRlc1swXSkKICAgIGlzX2lwX290aGVyX2J5dGUoYnl0ZXNbMV0pCiAgICBpc19pcF9vdGhlcl9ieXRlKGJ5dGVzWzJdKQogICAgaXNfaXBfb3RoZXJfYnl0ZShieXRlc1szXSkKfQppc19pcF9maXJzdF9ieXRlKGNvbXBvbmVudCkgewogICAgbnVtYmVyID0gdG9fbnVtYmVyKGNvbXBvbmVudCkKICAgIG51bWJlciA+PSAxCiAgICBudW1iZXIgPD0gMjU1Cn0KaXNfaXBfb3RoZXJfYnl0ZShjb21wb25lbnQpIHsKICAgIG51bWJlciA9IHRvX251bWJlcihjb21wb25lbnQpCiAgICBudW1iZXIgPj0gMAogICAgbnVtYmVyIDw9IDI1NQp9CgojIE9DSSByb290LlBhdGgKYWxsb3dfcm9vdF9wYXRoKHBfb2NpLCBpX29jaSwgYnVuZGxlX2lkKSB7CiAgICBpX3BhdGggOj0gaV9vY2kuUm9vdC5QYXRoCiAgICBwX3BhdGgxIDo9IHBfb2NpLlJvb3QuUGF0aAogICAgcHJpbnQoImFsbG93X3Jvb3RfcGF0aDogaV9wYXRoID0iLCBpX3BhdGgsICJwX3BhdGgxID0iLCBwX3BhdGgxKQoKICAgIHBfcGF0aDIgOj0gcmVwbGFjZShwX3BhdGgxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfcm9vdF9wYXRoOiBwX3BhdGgyID0iLCBwX3BhdGgyKQoKICAgIHBfcGF0aDMgOj0gcmVwbGFjZShwX3BhdGgyLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X3Jvb3RfcGF0aDogcF9wYXRoMyA9IiwgcF9wYXRoMykKCiAgICBwX3BhdGgzID09IGlfcGF0aAoKICAgIHByaW50KCJhbGxvd19yb290X3BhdGg6IHRydWUiKQp9CgojIGRldmljZSBtb3VudHMKYWxsb3dfbW91bnQocF9vY2ksIGlfbW91bnQsIGlfc3RvcmFnZXMsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcHJpbnQoImFsbG93X21vdW50OiBpX21vdW50ID0iLCBpX21vdW50KQoKICAgIHNvbWUgcF9tb3VudCBpbiBwX29jaS5Nb3VudHMKICAgIHNvbWUgaV9zdG9yYWdlIGluIGlfc3RvcmFnZXMKCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IHBfbW91bnQgPSIsIHBfbW91bnQpCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IGlfc3RvcmFnZSA9IiwgaV9zdG9yYWdlKQoKICAgIGNoZWNrX21vdW50KHBfbW91bnQsIGlfbW91bnQsIGlfc3RvcmFnZSwgYnVuZGxlX2lkLCBzYW5kYm94X2lkKQoKICAgICMgVE9ETzogYXJlIHRoZXJlIGFueSBvdGhlciByZXF1aXJlZCBwb2xpY3kgY2hlY2tzIGZvciBtb3VudHMgLSBlLmcuLAogICAgIyAgICAgICBtdWx0aXBsZSBtb3VudHMgd2l0aCBzYW1lIHNvdXJjZSBvciBkZXN0aW5hdGlvbj8KCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IHRydWUiKQp9CgpjaGVja19tb3VudChwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcF9tb3VudCA9PSBpX21vdW50CiAgICBwcmludCgiY2hlY2tfbW91bnQgMTogdHJ1ZSIpCn0KY2hlY2tfbW91bnQocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHBfbW91bnQuZGVzdGluYXRpb24gPT0gaV9tb3VudC5kZXN0aW5hdGlvbgogICAgcF9tb3VudC50eXBlXyA9PSBpX21vdW50LnR5cGVfCiAgICBwX21vdW50Lm9wdGlvbnMgPT0gaV9tb3VudC5vcHRpb25zCgogICAgbW91bnRfc291cmNlX2FsbG93cyhwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkKCiAgICBwcmludCgiY2hlY2tfbW91bnQgMjogdHJ1ZSIpCn0KCm1vdW50X3NvdXJjZV9hbGxvd3MocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHJlZ2V4MSA6PSBwX21vdW50LnNvdXJjZQogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5tb3VudF9zb3VyY2VfY3BhdGgpCiAgICByZWdleDQgOj0gcmVwbGFjZShyZWdleDMsICIkKGJ1bmRsZS1pZCkiLCBidW5kbGVfaWQpCgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMTogcmVnZXg0ID0iLCByZWdleDQpCiAgICByZWdleC5tYXRjaChyZWdleDQsIGlfbW91bnQuc291cmNlKQoKICAgIHByaW50KCJtb3VudF9zb3VyY2VfYWxsb3dzIDE6IHRydWUiKQp9Cm1vdW50X3NvdXJjZV9hbGxvd3MocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHJlZ2V4MSA6PSBwX21vdW50LnNvdXJjZQogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5tb3VudF9zb3VyY2VfY3BhdGgpCiAgICByZWdleDQgOj0gcmVwbGFjZShyZWdleDMsICIkKHNhbmRib3gtaWQpIiwgc2FuZGJveF9pZCkKCiAgICBwcmludCgibW91bnRfc291cmNlX2FsbG93cyAyOiByZWdleDQgPSIsIHJlZ2V4NCkKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4NCwgaV9tb3VudC5zb3VyY2UpCgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMjogdHJ1ZSIpCn0KbW91bnRfc291cmNlX2FsbG93cyhwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogaV9tb3VudC5zb3VyY2UgPSIsIGlfbW91bnQuc291cmNlKQogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogaV9zdG9yYWdlLm1vdW50X3BvaW50ID0iLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCgogICAgaV9tb3VudC5zb3VyY2UgPT0gaV9zdG9yYWdlLm1vdW50X3BvaW50CgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogdHJ1ZSIpCn0KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBDcmVhdGUgY29udGFpbmVyIFN0b3JhZ2VzCgphbGxvd19zdG9yYWdlcyhwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHBfY291bnQgOj0gY291bnQocF9zdG9yYWdlcykKICAgIGlfY291bnQgOj0gY291bnQoaV9zdG9yYWdlcykKICAgIHByaW50KCJhbGxvd19zdG9yYWdlczogcF9jb3VudCA9IiwgcF9jb3VudCwgImlfY291bnQgPSIsIGlfY291bnQpCgogICAgcF9jb3VudCA9PSBpX2NvdW50CgogICAgIyBHZXQgdGhlIGNvbnRhaW5lciBpbWFnZSBsYXllciBJRHMgYW5kIHZlcml0eSByb290IGhhc2hlcywgZnJvbSB0aGUgIm92ZXJsYXlmcyIgc3RvcmFnZS4KICAgIHNvbWUgb3ZlcmxheV9zdG9yYWdlIGluIHBfc3RvcmFnZXMKICAgIG92ZXJsYXlfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIHByaW50KCJhbGxvd19zdG9yYWdlczogb3ZlcmxheV9zdG9yYWdlID0iLCBvdmVybGF5X3N0b3JhZ2UpCiAgICBjb3VudChvdmVybGF5X3N0b3JhZ2Uub3B0aW9ucykgPT0gMgoKICAgIGxheWVyX2lkcyA6PSBzcGxpdChvdmVybGF5X3N0b3JhZ2Uub3B0aW9uc1swXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiBsYXllcl9pZHMgPSIsIGxheWVyX2lkcykKCiAgICByb290X2hhc2hlcyA6PSBzcGxpdChvdmVybGF5X3N0b3JhZ2Uub3B0aW9uc1sxXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiByb290X2hhc2hlcyA9Iiwgcm9vdF9oYXNoZXMpCgogICAgZXZlcnkgaV9zdG9yYWdlIGluIGlfc3RvcmFnZXMgewogICAgICAgIGFsbG93X3N0b3JhZ2UocF9zdG9yYWdlcywgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpCiAgICB9CgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiB0cnVlIikKfQoKYWxsb3dfc3RvcmFnZShwX3N0b3JhZ2VzLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgc29tZSBwX3N0b3JhZ2UgaW4gcF9zdG9yYWdlcwoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiBwX3N0b3JhZ2UgPSIsIHBfc3RvcmFnZSkKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiBpX3N0b3JhZ2UgPSIsIGlfc3RvcmFnZSkKCiAgICBwX3N0b3JhZ2UuZHJpdmVyICAgICAgICAgICA9PSBpX3N0b3JhZ2UuZHJpdmVyCiAgICBwX3N0b3JhZ2UuZHJpdmVyX29wdGlvbnMgICA9PSBpX3N0b3JhZ2UuZHJpdmVyX29wdGlvbnMKICAgIHBfc3RvcmFnZS5mc19ncm91cCAgICAgICAgID09IGlfc3RvcmFnZS5mc19ncm91cAogICAgcF9zdG9yYWdlLmZzdHlwZSAgICAgICAgICAgPT0gaV9zdG9yYWdlLmZzdHlwZQoKICAgIGFsbG93X3N0b3JhZ2Vfc291cmNlKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKQogICAgYWxsb3dfc3RvcmFnZV9vcHRpb25zKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKQogICAgYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKQoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiB0cnVlIikKfQoKYWxsb3dfc3RvcmFnZV9zb3VyY2UocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX3NvdXJjZSAxOiBzdGFydCIpCgogICAgcF9zdG9yYWdlLnNvdXJjZSA9PSBpX3N0b3JhZ2Uuc291cmNlCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDE6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX3NvdXJjZShwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDI6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCgogICAgIyBEREREOkJCOkRELkY6IERvbWFpbjpCdXM6RGV2aWNlLkZ1bmN0aW9uCiAgICAjIGh0dHBzOi8vd3d3Lmtlcm5lbC5vcmcvZG9jL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtYnVzLXBjaQogICAgcmVnZXgubWF0Y2goYF5bYS1mMC05XXs0fTpbYS1mMC05XXsyfTpbYS1mMC05XXsyfVwuW2EtZjAtOV0kYCwgaV9zdG9yYWdlLnNvdXJjZSkKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9zb3VyY2UgMjogdHJ1ZSIpCn0KCmFsbG93X3N0b3JhZ2Vfc291cmNlKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKSB7CiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9zb3VyY2UgMzogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIGlfc3RvcmFnZS5zb3VyY2UgPT0gIm5vbmUiCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDM6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX3NvdXJjZShwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDQ6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJzbWIiCgogICAgIyBQYXR0ZXJuOiAvLzxzdG9yYWdlLWFjY291bnQtbmFtZT4uZmlsZS5jb3JlLndpbmRvd3MubmV0LzxrOHMtUFZDLW5hbWU+CiAgICAjIFN0b3JhZ2UgYWNjb3VudCBuYW1lOiBodHRwczovL2xlYXJuLm1pY3Jvc29mdC5jb20vZW4tdXMvYXp1cmUvc3RvcmFnZS9jb21tb24vc3RvcmFnZS1hY2NvdW50LW92ZXJ2aWV3I3N0b3JhZ2UtYWNjb3VudC1uYW1lCiAgICAjIEs4cyBQVkMgbmFtZTogaHR0cHM6Ly9rdWJlcm5ldGVzLmlvL2RvY3MvY29uY2VwdHMvb3ZlcnZpZXcvd29ya2luZy13aXRoLW9iamVjdHMvbmFtZXMvI2Rucy1zdWJkb21haW4tbmFtZXMKICAgIHJlZ2V4Lm1hdGNoKGBeXC9cLyhbYS16MC05XXszLDI0fSlcLmZpbGVcLmNvcmVcLndpbmRvd3NcLm5ldFwvW2EtejAtOV0oW2EtejAtOS4tXXswLDI1MX1bYS16MC05XSk/JGAsIGlfc3RvcmFnZS5zb3VyY2UpCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDQ6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMTogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgIT0gIm92ZXJsYXlmcyIKICAgIHBfc3RvcmFnZS5vcHRpb25zID09IGlfc3RvcmFnZS5vcHRpb25zCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAxOiB0cnVlIikKfQphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIGNvdW50KHBfc3RvcmFnZS5vcHRpb25zKSA9PSAyCgogICAgcG9saWN5X2lkcyA6PSBzcGxpdChwX3N0b3JhZ2Uub3B0aW9uc1swXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBwb2xpY3lfaWRzID0iLCBwb2xpY3lfaWRzKQogICAgcG9saWN5X2lkcyA9PSBsYXllcl9pZHMKCiAgICBwb2xpY3lfaGFzaGVzIDo9IHNwbGl0KHBfc3RvcmFnZS5vcHRpb25zWzFdLCAiOiIpCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IHBvbGljeV9oYXNoZXMgPSIsIHBvbGljeV9oYXNoZXMpCgogICAgcF9jb3VudCA6PSBjb3VudChwb2xpY3lfaWRzKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBwX2NvdW50ID0iLCBwX2NvdW50KQogICAgcF9jb3VudCA+PSAxCiAgICBwX2NvdW50ID09IGNvdW50KHBvbGljeV9oYXNoZXMpCgogICAgaV9jb3VudCA6PSBjb3VudChpX3N0b3JhZ2Uub3B0aW9ucykKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogaV9jb3VudCA9IiwgaV9jb3VudCkKICAgIGlfY291bnQgPT0gcF9jb3VudCArIDMKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zWzBdID0iLCBpX3N0b3JhZ2Uub3B0aW9uc1swXSkKICAgIGlfc3RvcmFnZS5vcHRpb25zWzBdID09ICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQubGF5ZXItc3JjLXByZWZpeD0vdmFyL2xpYi9jb250YWluZXJkL2lvLmNvbnRhaW5lcmQuc25hcHNob3R0ZXIudjEudGFyZGV2L2xheWVycyIKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zW2lfY291bnQgLSAyXSA9IiwgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDJdKQogICAgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDJdID09ICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQub3ZlcmxheS1ydyIKCiAgICBsb3dlcmRpciA6PSBjb25jYXQoIj0iLCBbImxvd2VyZGlyIiwgcF9zdG9yYWdlLm9wdGlvbnNbMF1dKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBsb3dlcmRpciA9IiwgbG93ZXJkaXIpCgogICAgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDFdID09IGxvd2VyZGlyCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zW2lfY291bnQgLSAxXSA9IiwgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDFdKQoKICAgIGV2ZXJ5IGksIHBvbGljeV9pZCBpbiBwb2xpY3lfaWRzIHsKICAgICAgICBhbGxvd19vdmVybGF5X2xheWVyKHBvbGljeV9pZCwgcG9saWN5X2hhc2hlc1tpXSwgaV9zdG9yYWdlLm9wdGlvbnNbaSArIDFdKQogICAgfQoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogdHJ1ZSIpCn0KYWxsb3dfc3RvcmFnZV9vcHRpb25zKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKSB7CiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDM6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCiAgICBjb3VudChwX3N0b3JhZ2Uub3B0aW9ucykgPT0gMQoKICAgIHN0YXJ0c3dpdGgocF9zdG9yYWdlLm9wdGlvbnNbMF0sICIkKGhhc2giKQogICAgaGFzaF9zdWZmaXggOj0gdHJpbV9sZWZ0KHBfc3RvcmFnZS5vcHRpb25zWzBdLCAiJChoYXNoIikKCiAgICBlbmRzd2l0aChoYXNoX3N1ZmZpeCwgIikiKQogICAgaGFzaF9pbmRleCA6PSB0cmltX3JpZ2h0KGhhc2hfc3VmZml4LCAiKSIpCiAgICBpIDo9IHRvX251bWJlcihoYXNoX2luZGV4KQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAzOiBpID0iLCBpKQoKICAgIGhhc2hfb3B0aW9uIDo9IGNvbmNhdCgiPSIsIFsiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LnJvb3QtaGFzaCIsIHJvb3RfaGFzaGVzW2ldXSkKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMzogaGFzaF9vcHRpb24gPSIsIGhhc2hfb3B0aW9uKQoKICAgIGNvdW50KGlfc3RvcmFnZS5vcHRpb25zKSA9PSA0CiAgICBpX3N0b3JhZ2Uub3B0aW9uc1swXSA9PSAicm8iCiAgICBpX3N0b3JhZ2Uub3B0aW9uc1sxXSA9PSAiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmJsb2NrX2RldmljZT1maWxlIgogICAgaV9zdG9yYWdlLm9wdGlvbnNbMl0gPT0gImlvLmthdGFjb250YWluZXJzLmZzLW9wdC5pcy1sYXllciIKICAgIGlfc3RvcmFnZS5vcHRpb25zWzNdID09IGhhc2hfb3B0aW9uCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAzOiB0cnVlIikKfQphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgNDogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gInNtYiIKICAgIHBfb3B0c19jb3VudCA6PSBjb3VudChwX3N0b3JhZ2Uub3B0aW9ucykKICAgIGlfb3B0c19jb3VudCA6PSBjb3VudChpX3N0b3JhZ2Uub3B0aW9ucykKICAgIGlfb3B0c19jb3VudCA9PSBwX29wdHNfY291bnQgKyAyCgogICAgaV9vcHRfbWF0Y2hlcyA6PSBbaSB8IGkgOj0gaWR4OyBpZHggPCBwX29wdHNfY291bnQ7IHBfc3RvcmFnZS5vcHRpb25zW2lkeF0gPT0gaV9zdG9yYWdlLm9wdGlvbnNbaWR4XV0KICAgIGNvdW50KGlfb3B0X21hdGNoZXMpID09IHBfb3B0c19jb3VudAoKICAgIHN0YXJ0c3dpdGgoaV9zdG9yYWdlLm9wdGlvbnNbaV9vcHRzX2NvdW50LTJdLCAiYWRkcj0iKQogICAgY3JlZHMgPSBzcGxpdChpX3N0b3JhZ2Uub3B0aW9uc1tpX29wdHNfY291bnQtMV0sICIsIikKICAgIGNvdW50KGNyZWRzKSA9PSAyCiAgICBzdGFydHN3aXRoKGNyZWRzWzBdLCAidXNlcm5hbWU9IikKICAgIHN0YXJ0c3dpdGgoY3JlZHNbMV0sICJwYXNzd29yZD0iKQogICAgCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDQ6IHRydWUiKQp9CgphbGxvd19vdmVybGF5X2xheWVyKHBvbGljeV9pZCwgcG9saWN5X2hhc2gsIGlfb3B0aW9uKSB7CiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogcG9saWN5X2lkID0iLCBwb2xpY3lfaWQsICJwb2xpY3lfaGFzaCA9IiwgcG9saWN5X2hhc2gpCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogaV9vcHRpb24gPSIsIGlfb3B0aW9uKQoKICAgIHN0YXJ0c3dpdGgoaV9vcHRpb24sICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQubGF5ZXI9IikKICAgIGlfdmFsdWUgOj0gcmVwbGFjZShpX29wdGlvbiwgImlvLmthdGFjb250YWluZXJzLmZzLW9wdC5sYXllcj0iLCAiIikKICAgIGlfdmFsdWVfZGVjb2RlZCA6PSBiYXNlNjQuZGVjb2RlKGlfdmFsdWUpCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogaV92YWx1ZV9kZWNvZGVkID0iLCBpX3ZhbHVlX2RlY29kZWQpCgogICAgcG9saWN5X3N1ZmZpeCA6PSBjb25jYXQoIj0iLCBbInRhcixybyxpby5rYXRhY29udGFpbmVycy5mcy1vcHQuYmxvY2tfZGV2aWNlPWZpbGUsaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmlzLWxheWVyLGlvLmthdGFjb250YWluZXJzLmZzLW9wdC5yb290LWhhc2giLCBwb2xpY3lfaGFzaF0pCiAgICBwX3ZhbHVlIDo9IGNvbmNhdCgiLCIsIFtwb2xpY3lfaWQsIHBvbGljeV9zdWZmaXhdKQogICAgcHJpbnQoImFsbG93X292ZXJsYXlfbGF5ZXI6IHBfdmFsdWUgPSIsIHBfdmFsdWUpCgogICAgcF92YWx1ZSA9PSBpX3ZhbHVlX2RlY29kZWQKCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogdHJ1ZSIpCn0KCmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAidGFyIgoKICAgIHN0YXJ0c3dpdGgocF9zdG9yYWdlLm1vdW50X3BvaW50LCAiJChsYXllciIpCiAgICBtb3VudF9zdWZmaXggOj0gdHJpbV9sZWZ0KHBfc3RvcmFnZS5tb3VudF9wb2ludCwgIiQobGF5ZXIiKQoKICAgIGVuZHN3aXRoKG1vdW50X3N1ZmZpeCwgIikiKQogICAgbGF5ZXJfaW5kZXggOj0gdHJpbV9yaWdodChtb3VudF9zdWZmaXgsICIpIikKICAgIGkgOj0gdG9fbnVtYmVyKGxheWVyX2luZGV4KQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDE6IGkgPSIsIGkpCgogICAgbGF5ZXJfaWQgOj0gbGF5ZXJfaWRzW2ldCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMTogbGF5ZXJfaWQgPSIsIGxheWVyX2lkKQoKICAgIHBfbW91bnQgOj0gY29uY2F0KCIvIiwgWyIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L2xheWVycyIsIGxheWVyX2lkXSkKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCAxOiBwX21vdW50ID0iLCBwX21vdW50KQoKICAgIHBfbW91bnQgPT0gaV9zdG9yYWdlLm1vdW50X3BvaW50CgogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDE6IHRydWUiKQp9CmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAiZnVzZTMua2F0YS1vdmVybGF5IgoKICAgIG1vdW50MSA6PSByZXBsYWNlKHBfc3RvcmFnZS5tb3VudF9wb2ludCwgIiQoY3BhdGgpIiwgcG9saWN5X2RhdGEuY29tbW9uLmNwYXRoKQogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDI6IG1vdW50MiA9IiwgbW91bnQyKQoKICAgIG1vdW50MiA9PSBpX3N0b3JhZ2UubW91bnRfcG9pbnQKCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMjogdHJ1ZSIpCn0KYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKSB7CiAgICBwX3N0b3JhZ2UuZnN0eXBlID09ICJsb2NhbCIKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQyID0iLCBtb3VudDIpCgogICAgbW91bnQzIDo9IHJlcGxhY2UobW91bnQyLCAiJChzYW5kYm94LWlkKSIsIHNhbmRib3hfaWQpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQzID0iLCBtb3VudDMpCgogICAgcmVnZXgubWF0Y2gobW91bnQzLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCgogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDM6IHRydWUiKQp9CmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAiYmluZCIKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNDogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNDogbW91bnQyID0iLCBtb3VudDIpCgogICAgbW91bnQzIDo9IHJlcGxhY2UobW91bnQyLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDQ6IG1vdW50MyA9IiwgbW91bnQzKQoKICAgIHJlZ2V4Lm1hdGNoKG1vdW50MywgaV9zdG9yYWdlLm1vdW50X3BvaW50KQoKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA0OiB0cnVlIikKfQphbGxvd19tb3VudF9wb2ludChwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgYnVuZGxlX2lkLCBzYW5kYm94X2lkLCBsYXllcl9pZHMpIHsKICAgIHBfc3RvcmFnZS5mc3R5cGUgPT0gInRtcGZzIgoKICAgIG1vdW50MSA6PSBwX3N0b3JhZ2UubW91bnRfcG9pbnQKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA1OiBtb3VudDEgPSIsIG1vdW50MSkKCiAgICByZWdleC5tYXRjaChtb3VudDEsIGlfc3RvcmFnZS5tb3VudF9wb2ludCkKCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNTogdHJ1ZSIpCn0KYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKSB7CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogaV9zdG9yYWdlLm1vdW50X3BvaW50ID0iLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCiAgICBhbGxvd19kaXJlY3Rfdm9sX2RyaXZlcihwX3N0b3JhZ2UsIGlfc3RvcmFnZSkKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChzcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQyID0iLCBtb3VudDIpCgogICAgZGlyZWN0X3ZvbF9wYXRoIDo9IGlfc3RvcmFnZS5zb3VyY2UKICAgIG1vdW50MyA6PSByZXBsYWNlKG1vdW50MiwgIiQoYjY0LWRpcmVjdC12b2wtcGF0aCkiLCBiYXNlNjR1cmwuZW5jb2RlKGRpcmVjdF92b2xfcGF0aCkpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQzID0iLCBtb3VudDMpCgogICAgbW91bnQzID09IGlfc3RvcmFnZS5tb3VudF9wb2ludAoKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA2OiB0cnVlIikKfQoKYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIocF9zdG9yYWdlLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19kaXJlY3Rfdm9sX2RyaXZlciAxOiBzdGFydCIpCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCiAgICBwcmludCgiYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIgMTogdHJ1ZSIpCn0KYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIocF9zdG9yYWdlLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19kaXJlY3Rfdm9sX2RyaXZlciAyOiBzdGFydCIpCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJzbWIiCiAgICBwcmludCgiYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIgMjogdHJ1ZSIpCn0KCiMgRXhlY1Byb2Nlc3NSZXF1ZXN0LnByb2Nlc3MuQ2FwYWJpbGl0aWVzCmFsbG93X2V4ZWNfY2FwcyhpX2NhcHMpIHsKICAgIG5vdCBpX2NhcHMuQW1iaWVudAogICAgbm90IGlfY2Fwcy5Cb3VuZGluZwogICAgbm90IGlfY2Fwcy5FZmZlY3RpdmUKICAgIG5vdCBpX2NhcHMuSW5oZXJpdGFibGUKICAgIG5vdCBpX2NhcHMuUGVybWl0dGVkCn0KCiMgT0NJLlByb2Nlc3MuQ2FwYWJpbGl0aWVzCmFsbG93X2NhcHMocF9jYXBzLCBpX2NhcHMpIHsKICAgIHByaW50KCJhbGxvd19jYXBzOiBwb2xpY3kgQW1iaWVudCA9IiwgcF9jYXBzLkFtYmllbnQpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgQW1iaWVudCA9IiwgaV9jYXBzLkFtYmllbnQpCiAgICBtYXRjaF9jYXBzKHBfY2Fwcy5BbWJpZW50LCBpX2NhcHMuQW1iaWVudCkKCiAgICBwcmludCgiYWxsb3dfY2FwczogcG9saWN5IEJvdW5kaW5nID0iLCBwX2NhcHMuQm91bmRpbmcpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgQm91bmRpbmcgPSIsIGlfY2Fwcy5Cb3VuZGluZykKICAgIG1hdGNoX2NhcHMocF9jYXBzLkJvdW5kaW5nLCBpX2NhcHMuQm91bmRpbmcpCgogICAgcHJpbnQoImFsbG93X2NhcHM6IHBvbGljeSBFZmZlY3RpdmUgPSIsIHBfY2Fwcy5FZmZlY3RpdmUpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgRWZmZWN0aXZlID0iLCBpX2NhcHMuRWZmZWN0aXZlKQogICAgbWF0Y2hfY2FwcyhwX2NhcHMuRWZmZWN0aXZlLCBpX2NhcHMuRWZmZWN0aXZlKQoKICAgIHByaW50KCJhbGxvd19jYXBzOiBwb2xpY3kgSW5oZXJpdGFibGUgPSIsIHBfY2Fwcy5Jbmhlcml0YWJsZSkKICAgIHByaW50KCJhbGxvd19jYXBzOiBpbnB1dCBJbmhlcml0YWJsZSA9IiwgaV9jYXBzLkluaGVyaXRhYmxlKQogICAgbWF0Y2hfY2FwcyhwX2NhcHMuSW5oZXJpdGFibGUsIGlfY2Fwcy5Jbmhlcml0YWJsZSkKCiAgICBwcmludCgiYWxsb3dfY2FwczogcG9saWN5IFBlcm1pdHRlZCA9IiwgcF9jYXBzLlBlcm1pdHRlZCkKICAgIHByaW50KCJhbGxvd19jYXBzOiBpbnB1dCBQZXJtaXR0ZWQgPSIsIGlfY2Fwcy5QZXJtaXR0ZWQpCiAgICBtYXRjaF9jYXBzKHBfY2Fwcy5QZXJtaXR0ZWQsIGlfY2Fwcy5QZXJtaXR0ZWQpCn0KCm1hdGNoX2NhcHMocF9jYXBzLCBpX2NhcHMpIHsKICAgIHByaW50KCJtYXRjaF9jYXBzIDE6IHN0YXJ0IikKCiAgICBwX2NhcHMgPT0gaV9jYXBzCgogICAgcHJpbnQoIm1hdGNoX2NhcHMgMTogdHJ1ZSIpCn0KbWF0Y2hfY2FwcyhwX2NhcHMsIGlfY2FwcykgewogICAgcHJpbnQoIm1hdGNoX2NhcHMgMjogc3RhcnQiKQoKICAgIGNvdW50KHBfY2FwcykgPT0gMQogICAgcF9jYXBzWzBdID09ICIkKGRlZmF1bHRfY2FwcykiCgogICAgcHJpbnQoIm1hdGNoX2NhcHMgMjogZGVmYXVsdF9jYXBzID0iLCBwb2xpY3lfZGF0YS5jb21tb24uZGVmYXVsdF9jYXBzKQogICAgcG9saWN5X2RhdGEuY29tbW9uLmRlZmF1bHRfY2FwcyA9PSBpX2NhcHMKCiAgICBwcmludCgibWF0Y2hfY2FwcyAyOiB0cnVlIikKfQptYXRjaF9jYXBzKHBfY2FwcywgaV9jYXBzKSB7CiAgICBwcmludCgibWF0Y2hfY2FwcyAzOiBzdGFydCIpCgogICAgY291bnQocF9jYXBzKSA9PSAxCiAgICBwX2NhcHNbMF0gPT0gIiQocHJpdmlsZWdlZF9jYXBzKSIKCiAgICBwcmludCgibWF0Y2hfY2FwcyAzOiBwcml2aWxlZ2VkX2NhcHMgPSIsIHBvbGljeV9kYXRhLmNvbW1vbi5wcml2aWxlZ2VkX2NhcHMpCiAgICBwb2xpY3lfZGF0YS5jb21tb24ucHJpdmlsZWdlZF9jYXBzID09IGlfY2FwcwoKICAgIHByaW50KCJtYXRjaF9jYXBzIDM6IHRydWUiKQp9CgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgpjaGVja19kaXJlY3RvcnlfdHJhdmVyc2FsKGlfcGF0aCkgewogICAgbm90IHJlZ2V4Lm1hdGNoKCIoXnwvKS4uKCR8LykiLCBpX3BhdGgpCn0KCmNoZWNrX3N5bWxpbmtfc291cmNlKGlfc3JjKSB7CiAgICBpX3NyYyA9PSAiIgogICAgcHJpbnQoImNoZWNrX3N5bWxpbmtfc291cmNlIDE6IHRydWUiKQp9CmNoZWNrX3N5bWxpbmtfc291cmNlKGlfc3JjKSB7CiAgICBpX3NyYyAhPSAiIgogICAgcHJpbnQoImNoZWNrX3N5bWxpbmtfc291cmNlIDI6IGlfc3JjID0iLCBpX3NyYykKCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24uc19zb3VyY2UxLCBpX3NyYykKCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMjogdHJ1ZSIpCn0KY2hlY2tfc3ltbGlua19zb3VyY2UoaV9zcmMpIHsKICAgIGlfc3JjICE9ICIiCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMzogaV9zcmMgPSIsIGlfc3JjKQoKICAgIHJlZ2V4Lm1hdGNoKHBvbGljeV9kYXRhLmNvbW1vbi5zX3NvdXJjZTIsIGlfc3JjKQogICAgY2hlY2tfZGlyZWN0b3J5X3RyYXZlcnNhbChpX3NyYykKCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMzogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfc3RvcmFnZXMoaV9zdG9yYWdlcykgewogICAgcHJpbnQoImFsbG93X3NhbmRib3hfc3RvcmFnZXM6IGlfc3RvcmFnZXMgPSIsIGlfc3RvcmFnZXMpCgogICAgcF9zdG9yYWdlcyA6PSBwb2xpY3lfZGF0YS5zYW5kYm94LnN0b3JhZ2VzCiAgICBldmVyeSBpX3N0b3JhZ2UgaW4gaV9zdG9yYWdlcyB7CiAgICAgICAgYWxsb3dfc2FuZGJveF9zdG9yYWdlKHBfc3RvcmFnZXMsIGlfc3RvcmFnZSkKICAgIH0KCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9zdG9yYWdlczogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfc3RvcmFnZShwX3N0b3JhZ2VzLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IGlfc3RvcmFnZSA9IiwgaV9zdG9yYWdlKQoKICAgIHNvbWUgcF9zdG9yYWdlIGluIHBfc3RvcmFnZXMKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IHBfc3RvcmFnZSA9IiwgcF9zdG9yYWdlKQogICAgaV9zdG9yYWdlID09IHBfc3RvcmFnZQoKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IHRydWUiKQp9CgpDb3B5RmlsZVJlcXVlc3QgewogICAgcHJpbnQoIkNvcHlGaWxlUmVxdWVzdDogaW5wdXQucGF0aCA9IiwgaW5wdXQucGF0aCkKCiAgICBjaGVja19zeW1saW5rX3NvdXJjZShpbnB1dC5zeW1saW5rX3NyYykKICAgIGNoZWNrX2RpcmVjdG9yeV90cmF2ZXJzYWwoaW5wdXQucGF0aCkKCiAgICBzb21lIHJlZ2V4MSBpbiBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLkNvcHlGaWxlUmVxdWVzdAogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5jcGF0aCkKICAgIHJlZ2V4NCA6PSByZXBsYWNlKHJlZ2V4MywgIiQoYnVuZGxlLWlkKSIsIEJVTkRMRV9JRCkKICAgIHByaW50KCJDb3B5RmlsZVJlcXVlc3Q6IHJlZ2V4NCA9IiwgcmVnZXg0KQoKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4NCwgaW5wdXQucGF0aCkKCiAgICBwcmludCgiQ29weUZpbGVSZXF1ZXN0OiB0cnVlIikKfQoKQ3JlYXRlU2FuZGJveFJlcXVlc3QgewogICAgcHJpbnQoIkNyZWF0ZVNhbmRib3hSZXF1ZXN0OiBpbnB1dC5ndWVzdF9ob29rX3BhdGggPSIsIGlucHV0Lmd1ZXN0X2hvb2tfcGF0aCkKICAgIGNvdW50KGlucHV0Lmd1ZXN0X2hvb2tfcGF0aCkgPT0gMAoKICAgIHByaW50KCJDcmVhdGVTYW5kYm94UmVxdWVzdDogaW5wdXQua2VybmVsX21vZHVsZXMgPSIsIGlucHV0Lmtlcm5lbF9tb2R1bGVzKQogICAgY291bnQoaW5wdXQua2VybmVsX21vZHVsZXMpID09IDAKCiAgICBpX3BpZG5zIDo9IGlucHV0LnNhbmRib3hfcGlkbnMKICAgIHByaW50KCJDcmVhdGVTYW5kYm94UmVxdWVzdDogaV9waWRucyA9IiwgaV9waWRucykKICAgIGlfcGlkbnMgPT0gZmFsc2UKICAgIGFsbG93X3NhbmRib3hfc3RvcmFnZXMoaW5wdXQuc3RvcmFnZXMpCn0KCmFsbG93X2V4ZWMocF9jb250YWluZXIsIGlfcHJvY2VzcykgewogICAgcHJpbnQoImFsbG93X2V4ZWM6IHN0YXJ0IikKCiAgICBwX29jaSA9IHBfY29udGFpbmVyLk9DSQogICAgcF9zX25hbWUgPSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc19uYW1lc3BhY2UgPSBnZXRfc3RhdGVfdmFsKCJuYW1lc3BhY2UiKQogICAgYWxsb3dfcHJvYmVfcHJvY2VzcyhwX29jaS5Qcm9jZXNzLCBpX3Byb2Nlc3MsIHBfc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfZXhlYzogdHJ1ZSIpCn0KCmFsbG93X2ludGVyYWN0aXZlX2V4ZWMocF9jb250YWluZXIsIGlfcHJvY2VzcykgewogICAgcHJpbnQoImFsbG93X2ludGVyYWN0aXZlX2V4ZWM6IHN0YXJ0IikKCiAgICBwX29jaSA9IHBfY29udGFpbmVyLk9DSQogICAgcF9zX25hbWUgPSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc19uYW1lc3BhY2UgPSBnZXRfc3RhdGVfdmFsKCJuYW1lc3BhY2UiKQogICAgYWxsb3dfaW50ZXJhY3RpdmVfcHJvY2VzcyhwX29jaS5Qcm9jZXNzLCBpX3Byb2Nlc3MsIHBfc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfaW50ZXJhY3RpdmVfZXhlYzogdHJ1ZSIpCn0KCiMgVE9ETzogc2hvdWxkIG90aGVyIEV4ZWNQcm9jZXNzUmVxdWVzdCBpbnB1dCBkYXRhIGZpZWxkcyBiZSB2YWxpZGF0ZWQgYXMgd2VsbD8KRXhlY1Byb2Nlc3NSZXF1ZXN0IHsKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMTogaW5wdXQgPSIsIGlucHV0KQoKICAgIHNvbWUgcF9jb21tYW5kIGluIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuRXhlY1Byb2Nlc3NSZXF1ZXN0LmFsbG93ZWRfY29tbWFuZHMKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMTogcF9jb21tYW5kID0iLCBwX2NvbW1hbmQpCiAgICBwX2NvbW1hbmQgPT0gaW5wdXQucHJvY2Vzcy5BcmdzCgogICAgIyBUT0RPOiBtYXRjaCBwX2NvbnRhaW5lcidzIElEIHdpdGggdGhlIGlucHV0IGNvbnRhaW5lcl9pZC4KICAgIHNvbWUgcF9jb250YWluZXIgaW4gcG9saWN5X2RhdGEuY29udGFpbmVycwogICAgYWxsb3dfaW50ZXJhY3RpdmVfZXhlYyhwX2NvbnRhaW5lciwgaW5wdXQucHJvY2VzcykKCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDE6IHRydWUiKQp9CkV4ZWNQcm9jZXNzUmVxdWVzdCB7CiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDI6IGlucHV0ID0iLCBpbnB1dCkKCiAgICAjIFRPRE86IG1hdGNoIGlucHV0IGNvbnRhaW5lciBJRCB3aXRoIGl0cyBjb3JyZXNwb25kaW5nIGNvbnRhaW5lci5leGVjX2NvbW1hbmRzLgogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBzb21lIHBfY29tbWFuZCBpbiBwX2NvbnRhaW5lci5leGVjX2NvbW1hbmRzCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDI6IHBfY29tbWFuZCA9IiwgcF9jb21tYW5kKQoKICAgICMgVE9ETzogc2hvdWxkIG90aGVyIGlucHV0IGRhdGEgZmllbGRzIGJlIHZhbGlkYXRlZCBhcyB3ZWxsPwogICAgcF9jb21tYW5kID09IGlucHV0LnByb2Nlc3MuQXJncwoKICAgIGFsbG93X2V4ZWMocF9jb250YWluZXIsIGlucHV0LnByb2Nlc3MpCgogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAyOiB0cnVlIikKfQpFeGVjUHJvY2Vzc1JlcXVlc3QgewogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAzOiBpbnB1dCA9IiwgaW5wdXQpCgogICAgaV9jb21tYW5kID0gY29uY2F0KCIgIiwgaW5wdXQucHJvY2Vzcy5BcmdzKQogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAzOiBpX2NvbW1hbmQgPSIsIGlfY29tbWFuZCkKCiAgICBzb21lIHBfcmVnZXggaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5FeGVjUHJvY2Vzc1JlcXVlc3QucmVnZXgKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMzogcF9yZWdleCA9IiwgcF9yZWdleCkKCiAgICByZWdleC5tYXRjaChwX3JlZ2V4LCBpX2NvbW1hbmQpCgogICAgIyBUT0RPOiBtYXRjaCBwX2NvbnRhaW5lcidzIElEIHdpdGggdGhlIGlucHV0IGNvbnRhaW5lcl9pZC4KICAgIHNvbWUgcF9jb250YWluZXIgaW4gcG9saWN5X2RhdGEuY29udGFpbmVycwogICAgYWxsb3dfaW50ZXJhY3RpdmVfZXhlYyhwX2NvbnRhaW5lciwgaW5wdXQucHJvY2VzcykKCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDM6IHRydWUiKQp9CgpVcGRhdGVSb3V0ZXNSZXF1ZXN0IHsKICAgIHByaW50KCJVcGRhdGVSb3V0ZXNSZXF1ZXN0OiBpbnB1dCA9IiwgaW5wdXQpCiAgICBwcmludCgiVXBkYXRlUm91dGVzUmVxdWVzdDogcG9saWN5ID0iLCBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLlVwZGF0ZVJvdXRlc1JlcXVlc3QpCgogICAgaV9yb3V0ZXMgOj0gaW5wdXQucm91dGVzLlJvdXRlcwogICAgcF9zb3VyY2VfcmVnZXggPSBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLlVwZGF0ZVJvdXRlc1JlcXVlc3QuZm9yYmlkZGVuX3NvdXJjZV9yZWdleAogICAgcF9uYW1lcyA9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuVXBkYXRlUm91dGVzUmVxdWVzdC5mb3JiaWRkZW5fZGV2aWNlX25hbWVzCgogICAgZXZlcnkgaV9yb3V0ZSBpbiBpX3JvdXRlcyB7CiAgICAgICAgcHJpbnQoImlfcm91dGUuc291cmNlID0iLCBpX3JvdXRlLnNvdXJjZSkKICAgICAgICBldmVyeSBwX3JlZ2V4IGluIHBfc291cmNlX3JlZ2V4IHsKICAgICAgICAgICAgcHJpbnQoInBfcmVnZXggPSIsIHBfcmVnZXgpCiAgICAgICAgICAgIG5vdCByZWdleC5tYXRjaChwX3JlZ2V4LCBpX3JvdXRlLnNvdXJjZSkKICAgICAgICB9CgogICAgICAgIHByaW50KCJpX3JvdXRlLmRldmljZSA9IiwgaV9yb3V0ZS5kZXZpY2UpCiAgICAgICAgbm90IGlfcm91dGUuZGV2aWNlIGluIHBfbmFtZXMKICAgIH0KCiAgICBwcmludCgiVXBkYXRlUm91dGVzUmVxdWVzdDogdHJ1ZSIpCn0KClVwZGF0ZUludGVyZmFjZVJlcXVlc3QgewogICAgcHJpbnQoIlVwZGF0ZUludGVyZmFjZVJlcXVlc3Q6IGlucHV0ID0iLCBpbnB1dCkKICAgIHByaW50KCJVcGRhdGVJbnRlcmZhY2VSZXF1ZXN0OiBwb2xpY3kgPSIsIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuVXBkYXRlSW50ZXJmYWNlUmVxdWVzdCkKCiAgICBpX2ludGVyZmFjZSA6PSBpbnB1dC5pbnRlcmZhY2UKICAgIHBfZmxhZ3MgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmFsbG93X3Jhd19mbGFncwoKICAgICMgVHlwaWNhbGx5LCBqdXN0IElGRl9OT0FSUCBpcyB1c2VkLgogICAgYml0cy5hbmQoaV9pbnRlcmZhY2UucmF3X2ZsYWdzLCBiaXRzLm5lZ2F0ZShwX2ZsYWdzKSkgPT0gMAoKICAgIHBfbmFtZXMgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmZvcmJpZGRlbl9uYW1lcwoKICAgIG5vdCBpX2ludGVyZmFjZS5uYW1lIGluIHBfbmFtZXMKCiAgICBwX2h3YWRkcnMgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmZvcmJpZGRlbl9od19hZGRycwoKICAgIG5vdCBpX2ludGVyZmFjZS5od0FkZHIgaW4gcF9od2FkZHJzCgogICAgcHJpbnQoIlVwZGF0ZUludGVyZmFjZVJlcXVlc3Q6IHRydWUiKQp9CgpDbG9zZVN0ZGluUmVxdWVzdCB7CiAgICBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLkNsb3NlU3RkaW5SZXF1ZXN0ID09IHRydWUKfQoKUmVhZFN0cmVhbVJlcXVlc3QgewogICAgcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5SZWFkU3RyZWFtUmVxdWVzdCA9PSB0cnVlCn0KClVwZGF0ZUVwaGVtZXJhbE1vdW50c1JlcXVlc3QgewogICAgcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVFcGhlbWVyYWxNb3VudHNSZXF1ZXN0ID09IHRydWUKfQoKV3JpdGVTdHJlYW1SZXF1ZXN0IHsKICAgIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuV3JpdGVTdHJlYW1SZXF1ZXN0ID09IHRydWUKfQoKcG9saWN5X2RhdGEgOj0gewogICJjb250YWluZXJzIjogWwogICAgewogICAgICAiT0NJIjogewogICAgICAgICJWZXJzaW9uIjogIjEuMS4wLXJjLjEiLAogICAgICAgICJQcm9jZXNzIjogewogICAgICAgICAgIlRlcm1pbmFsIjogZmFsc2UsCiAgICAgICAgICAiVXNlciI6IHsKICAgICAgICAgICAgIlVJRCI6IDY1NTM1LAogICAgICAgICAgICAiR0lEIjogNjU1MzUsCiAgICAgICAgICAgICJBZGRpdGlvbmFsR2lkcyI6IFtdLAogICAgICAgICAgICAiVXNlcm5hbWUiOiAiIgogICAgICAgICAgfSwKICAgICAgICAgICJEZXByZWNhdGVkQXJncyI6IFsKICAgICAgICAgICAgIi9wYXVzZSIKICAgICAgICAgIF0sCiAgICAgICAgICAiQXJncyI6IFsKICAgICAgICAgICAgIi9wYXVzZSIKICAgICAgICAgIF0sCiAgICAgICAgICAiRW52IjogWwogICAgICAgICAgICAiUEFUSD0vdXNyL2xvY2FsL3NiaW46L3Vzci9sb2NhbC9iaW46L3Vzci9zYmluOi91c3IvYmluOi9zYmluOi9iaW4iCiAgICAgICAgICBdLAogICAgICAgICAgIkN3ZCI6ICIvIiwKICAgICAgICAgICJDYXBhYmlsaXRpZXMiOiB7CiAgICAgICAgICAgICJBbWJpZW50IjogW10sCiAgICAgICAgICAgICJCb3VuZGluZyI6IFsKICAgICAgICAgICAgICAiJChkZWZhdWx0X2NhcHMpIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiRWZmZWN0aXZlIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJJbmhlcml0YWJsZSI6IFtdLAogICAgICAgICAgICAiUGVybWl0dGVkIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICAiTm9OZXdQcml2aWxlZ2VzIjogdHJ1ZQogICAgICAgIH0sCiAgICAgICAgIlJvb3QiOiB7CiAgICAgICAgICAiUGF0aCI6ICIkKGNwYXRoKS8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgIlJlYWRvbmx5IjogdHJ1ZQogICAgICAgIH0sCiAgICAgICAgIk1vdW50cyI6IFsKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9wcm9jIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJwcm9jIiwKICAgICAgICAgICAgInR5cGVfIjogInByb2MiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2IiwKICAgICAgICAgICAgInNvdXJjZSI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJzdHJpY3RhdGltZSIsCiAgICAgICAgICAgICAgIm1vZGU9NzU1IiwKICAgICAgICAgICAgICAic2l6ZT02NTUzNmsiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L3B0cyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiZGV2cHRzIiwKICAgICAgICAgICAgInR5cGVfIjogImRldnB0cyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJuZXdpbnN0YW5jZSIsCiAgICAgICAgICAgICAgInB0bXhtb2RlPTA2NjYiLAogICAgICAgICAgICAgICJtb2RlPTA2MjAiLAogICAgICAgICAgICAgICJnaWQ9NSIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvc2htIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L3NobSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi9tcXVldWUiLAogICAgICAgICAgICAic291cmNlIjogIm1xdWV1ZSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJtcXVldWUiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvc3lzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJzeXNmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJzeXNmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2V0Yy9yZXNvbHYuY29uZiIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClyZXNvbHYuY29uZiQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJvIiwKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9kZXYiLAogICAgICAgICAgICAgICJub2V4ZWMiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0KICAgICAgICBdLAogICAgICAgICJBbm5vdGF0aW9ucyI6IHsKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmJ1bmRsZV9wYXRoIjogIi9ydW4vY29udGFpbmVyZC9pby5jb250YWluZXJkLnJ1bnRpbWUudjIudGFzay9rOHMuaW8vJChidW5kbGUtaWQpIiwKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIjogInBvZF9zYW5kYm94IiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSI6ICJzYW5kYm94IiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWlkIjogIl5bYS16MC05XXs2NH0kIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWxvZy1kaXJlY3RvcnkiOiAiXi92YXIvbG9nL3BvZHMvJChzYW5kYm94LW5hbWVzcGFjZSlfJChzYW5kYm94LW5hbWUpX1swLTlhLWZdezh9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezEyfSQiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZSI6ICJecG9kXFwtc2VjcmV0c1xcLTkxOGEzMzcwXFwtYWQxOVxcLTQ2YjJcXC1hMmU2XFwtYTRlMzkzZjJlZTJiJCIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1uYW1lc3BhY2UiOiAic2VjcmV0cy03MTU3IiwKICAgICAgICAgICJuZXJkY3RsL25ldHdvcmstbmFtZXNwYWNlIjogIl4vdmFyL3J1bi9uZXRucy9jbmktWzAtOWEtZl17OH0tWzAtOWEtZl17NH0tWzAtOWEtZl17NH0tWzAtOWEtZl17NH0tWzAtOWEtZl17MTJ9JCIKICAgICAgICB9LAogICAgICAgICJMaW51eCI6IHsKICAgICAgICAgICJOYW1lc3BhY2VzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgIlR5cGUiOiAiaXBjIiwKICAgICAgICAgICAgICAiUGF0aCI6ICIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiVHlwZSI6ICJ1dHMiLAogICAgICAgICAgICAgICJQYXRoIjogIiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJUeXBlIjogIm1vdW50IiwKICAgICAgICAgICAgICAiUGF0aCI6ICIiCiAgICAgICAgICAgIH0KICAgICAgICAgIF0sCiAgICAgICAgICAiTWFza2VkUGF0aHMiOiBbCiAgICAgICAgICAgICIvcHJvYy9hY3BpIiwKICAgICAgICAgICAgIi9wcm9jL2Fzb3VuZCIsCiAgICAgICAgICAgICIvcHJvYy9rY29yZSIsCiAgICAgICAgICAgICIvcHJvYy9rZXlzIiwKICAgICAgICAgICAgIi9wcm9jL2xhdGVuY3lfc3RhdHMiLAogICAgICAgICAgICAiL3Byb2MvdGltZXJfbGlzdCIsCiAgICAgICAgICAgICIvcHJvYy90aW1lcl9zdGF0cyIsCiAgICAgICAgICAgICIvcHJvYy9zY2hlZF9kZWJ1ZyIsCiAgICAgICAgICAgICIvc3lzL2Zpcm13YXJlIiwKICAgICAgICAgICAgIi9wcm9jL3Njc2kiCiAgICAgICAgICBdLAogICAgICAgICAgIlJlYWRvbmx5UGF0aHMiOiBbCiAgICAgICAgICAgICIvcHJvYy9idXMiLAogICAgICAgICAgICAiL3Byb2MvZnMiLAogICAgICAgICAgICAiL3Byb2MvaXJxIiwKICAgICAgICAgICAgIi9wcm9jL3N5cyIsCiAgICAgICAgICAgICIvcHJvYy9zeXNycS10cmlnZ2VyIgogICAgICAgICAgXSwKICAgICAgICAgICJEZXZpY2VzIjogW10sCiAgICAgICAgICAiU3lzY3RsIjogewogICAgICAgICAgICAibmV0LmlwdjQuaXBfdW5wcml2aWxlZ2VkX3BvcnRfc3RhcnQiOiAiMCIsCiAgICAgICAgICAgICJuZXQuaXB2NC5waW5nX2dyb3VwX3JhbmdlIjogIjAgMjE0NzQ4MzY0NyIKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0sCiAgICAgICJzdG9yYWdlcyI6IFsKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoMCkiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXIwKSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogIm92ZXJsYXlmcyIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAiZnVzZTMua2F0YS1vdmVybGF5IiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiNWE1YWFkODAwNTVmZjIwMDEyYTUwZGMyNWY4ZGY3YTI5OTI0NDc0MzI0ZDY1ZjdkNTMwNmVlOGVlMjdmZjcxZCIsCiAgICAgICAgICAgICI4MTcyNTBmMWEzZTMzNmRhNzZmNWJkM2ZhNzg0ZTFiMjZkOTU5YjljMTMxODc2ODE1YmEyNjA0MDQ4YjcwYzE4IgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGNwYXRoKS8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0KICAgICAgXSwKICAgICAgImRldmljZXMiOiBbXSwKICAgICAgInNhbmRib3hfcGlkbnMiOiBmYWxzZSwKICAgICAgImV4ZWNfY29tbWFuZHMiOiBbXSwKICAgICAgImVudl9tYXAiOiB7CiAgICAgICAgIlBBVEgiOiAiL3Vzci9sb2NhbC9zYmluOi91c3IvbG9jYWwvYmluOi91c3Ivc2JpbjovdXNyL2Jpbjovc2JpbjovYmluIgogICAgICB9CiAgICB9LAogICAgewogICAgICAiT0NJIjogewogICAgICAgICJWZXJzaW9uIjogIjEuMS4wLXJjLjEiLAogICAgICAgICJQcm9jZXNzIjogewogICAgICAgICAgIlRlcm1pbmFsIjogZmFsc2UsCiAgICAgICAgICAiVXNlciI6IHsKICAgICAgICAgICAgIlVJRCI6IDAsCiAgICAgICAgICAgICJHSUQiOiAwLAogICAgICAgICAgICAiQWRkaXRpb25hbEdpZHMiOiBbXSwKICAgICAgICAgICAgIlVzZXJuYW1lIjogIiIKICAgICAgICAgIH0sCiAgICAgICAgICAiRGVwcmVjYXRlZEFyZ3MiOiBbCiAgICAgICAgICAgICIvYmluL3NoIgogICAgICAgICAgXSwKICAgICAgICAgICJBcmdzIjogWwogICAgICAgICAgICAiL2Jpbi9zaCIKICAgICAgICAgIF0sCiAgICAgICAgICAiRW52IjogWwogICAgICAgICAgICAiUEFUSD0vdXNyL2xvY2FsL3NiaW46L3Vzci9sb2NhbC9iaW46L3Vzci9zYmluOi91c3IvYmluOi9zYmluOi9iaW4iLAogICAgICAgICAgICAiSE9TVE5BTUU9JChob3N0LW5hbWUpIgogICAgICAgICAgXSwKICAgICAgICAgICJDd2QiOiAiLyIsCiAgICAgICAgICAiQ2FwYWJpbGl0aWVzIjogewogICAgICAgICAgICAiQW1iaWVudCI6IFtdLAogICAgICAgICAgICAiQm91bmRpbmciOiBbCiAgICAgICAgICAgICAgIiQoZGVmYXVsdF9jYXBzKSIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgIkVmZmVjdGl2ZSI6IFsKICAgICAgICAgICAgICAiJChkZWZhdWx0X2NhcHMpIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiSW5oZXJpdGFibGUiOiBbXSwKICAgICAgICAgICAgIlBlcm1pdHRlZCI6IFsKICAgICAgICAgICAgICAiJChkZWZhdWx0X2NhcHMpIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgIk5vTmV3UHJpdmlsZWdlcyI6IGZhbHNlCiAgICAgICAgfSwKICAgICAgICAiUm9vdCI6IHsKICAgICAgICAgICJQYXRoIjogIiQoY3BhdGgpLyQoYnVuZGxlLWlkKSIsCiAgICAgICAgICAiUmVhZG9ubHkiOiBmYWxzZQogICAgICAgIH0sCiAgICAgICAgIk1vdW50cyI6IFsKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9wcm9jIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJwcm9jIiwKICAgICAgICAgICAgInR5cGVfIjogInByb2MiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2IiwKICAgICAgICAgICAgInNvdXJjZSI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJzdHJpY3RhdGltZSIsCiAgICAgICAgICAgICAgIm1vZGU9NzU1IiwKICAgICAgICAgICAgICAic2l6ZT02NTUzNmsiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L3B0cyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiZGV2cHRzIiwKICAgICAgICAgICAgInR5cGVfIjogImRldnB0cyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJuZXdpbnN0YW5jZSIsCiAgICAgICAgICAgICAgInB0bXhtb2RlPTA2NjYiLAogICAgICAgICAgICAgICJtb2RlPTA2MjAiLAogICAgICAgICAgICAgICJnaWQ9NSIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvc2htIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L3NobSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi9tcXVldWUiLAogICAgICAgICAgICAic291cmNlIjogIm1xdWV1ZSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJtcXVldWUiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvc3lzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJzeXNmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJzeXNmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL3N5cy9mcy9jZ3JvdXAiLAogICAgICAgICAgICAic291cmNlIjogImNncm91cCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJjZ3JvdXAiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiLAogICAgICAgICAgICAgICJyZWxhdGltZSIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2V0Yy9ob3N0cyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClob3N0cyQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicnciCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L3Rlcm1pbmF0aW9uLWxvZyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeCl0ZXJtaW5hdGlvbi1sb2ckIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJ3IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2V0Yy9ob3N0bmFtZSIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClob3N0bmFtZSQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicnciCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZXRjL3Jlc29sdi5jb25mIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KXJlc29sdi5jb25mJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJydyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi92YXIvcnVuL3NlY3JldHMva3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudCIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClzZXJ2aWNlYWNjb3VudCQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicm8iCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvdmFyL3J1bi9zZWNyZXRzL2F6dXJlL3Rva2VucyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeCl0b2tlbnMkIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2V0Yy9zZWNyZXQtdm9sdW1lIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KXNlY3JldC12b2x1bWUkIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9CiAgICAgICAgXSwKICAgICAgICAiQW5ub3RhdGlvbnMiOiB7CiAgICAgICAgICAiaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5idW5kbGVfcGF0aCI6ICIvcnVuL2NvbnRhaW5lcmQvaW8uY29udGFpbmVyZC5ydW50aW1lLnYyLnRhc2svazhzLmlvLyQoYnVuZGxlLWlkKSIsCiAgICAgICAgICAiaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5jb250YWluZXJfdHlwZSI6ICJwb2RfY29udGFpbmVyIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItbmFtZSI6ICJzZWNyZXQtdm9sdW1lLXRlc3QiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLmNvbnRhaW5lci10eXBlIjogImNvbnRhaW5lciIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuaW1hZ2UtbmFtZSI6ICJtY3IubWljcm9zb2Z0LmNvbS9ha3MvZTJlL2xpYnJhcnktYnVzeWJveDptYXN0ZXIuMjIwMzE0LjEtbGludXgtYW1kNjQiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtaWQiOiAiXlthLXowLTldezY0fSQiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZSI6ICJecG9kXFwtc2VjcmV0c1xcLTkxOGEzMzcwXFwtYWQxOVxcLTQ2YjJcXC1hMmU2XFwtYTRlMzkzZjJlZTJiJCIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1uYW1lc3BhY2UiOiAic2VjcmV0cy03MTU3IgogICAgICAgIH0sCiAgICAgICAgIkxpbnV4IjogewogICAgICAgICAgIk5hbWVzcGFjZXMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiVHlwZSI6ICJpcGMiLAogICAgICAgICAgICAgICJQYXRoIjogIiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJUeXBlIjogInV0cyIsCiAgICAgICAgICAgICAgIlBhdGgiOiAiIgogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgIlR5cGUiOiAibW91bnQiLAogICAgICAgICAgICAgICJQYXRoIjogIiIKICAgICAgICAgICAgfQogICAgICAgICAgXSwKICAgICAgICAgICJNYXNrZWRQYXRocyI6IFsKICAgICAgICAgICAgIi9wcm9jL2FjcGkiLAogICAgICAgICAgICAiL3Byb2Mva2NvcmUiLAogICAgICAgICAgICAiL3Byb2Mva2V5cyIsCiAgICAgICAgICAgICIvcHJvYy9sYXRlbmN5X3N0YXRzIiwKICAgICAgICAgICAgIi9wcm9jL3RpbWVyX2xpc3QiLAogICAgICAgICAgICAiL3Byb2MvdGltZXJfc3RhdHMiLAogICAgICAgICAgICAiL3Byb2Mvc2NoZWRfZGVidWciLAogICAgICAgICAgICAiL3Byb2Mvc2NzaSIsCiAgICAgICAgICAgICIvc3lzL2Zpcm13YXJlIgogICAgICAgICAgXSwKICAgICAgICAgICJSZWFkb25seVBhdGhzIjogWwogICAgICAgICAgICAiL3Byb2MvYXNvdW5kIiwKICAgICAgICAgICAgIi9wcm9jL2J1cyIsCiAgICAgICAgICAgICIvcHJvYy9mcyIsCiAgICAgICAgICAgICIvcHJvYy9pcnEiLAogICAgICAgICAgICAiL3Byb2Mvc3lzIiwKICAgICAgICAgICAgIi9wcm9jL3N5c3JxLXRyaWdnZXIiCiAgICAgICAgICBdLAogICAgICAgICAgIkRldmljZXMiOiBbXSwKICAgICAgICAgICJTeXNjdGwiOiB7CiAgICAgICAgICAgICJuZXQuaXB2NC5pcF91bnByaXZpbGVnZWRfcG9ydF9zdGFydCI6ICIwIiwKICAgICAgICAgICAgIm5ldC5pcHY0LnBpbmdfZ3JvdXBfcmFuZ2UiOiAiMCAyMTQ3NDgzNjQ3IgogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSwKICAgICAgInN0b3JhZ2VzIjogWwogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2gwKSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjApIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2gxKSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjEpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAib3ZlcmxheWZzIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJmdXNlMy5rYXRhLW92ZXJsYXkiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIyYzM0MmExMzdlNjkzYzc4OThhZWMzNmRhMTA0N2YxOTFkYzdjMTY4N2U2NjE5OGFkYWNjNDM5Y2Y0YWRmMzc5OjI1NzBlM2ExOWUxYmYyMGRkZGE0NTQ5OGE5NjI3ZjYxNTU1ZDJkNmMwMTQ3OWI5Yjc2NDYwYjY3OWIyN2Q1NTIiLAogICAgICAgICAgICAiODU2OGM3MGMwY2NmZTAwNTEwOTJlODE4ZGE3NjkxMTFhNTk4ODJjZDE5ZGQ3OTlkM2JjYTVmZmE4Mjc5MTA4MDpiNjQzYjYyMTc3NDg5ODM4MzBiMjZhYzE0YTM1YTMzMjJkZDUyOGMwMDk2M2VhYWRkOTFlZjU1ZjUxM2RjNzNmIgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGNwYXRoKS8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0KICAgICAgXSwKICAgICAgImRldmljZXMiOiBbXSwKICAgICAgInNhbmRib3hfcGlkbnMiOiBmYWxzZSwKICAgICAgImV4ZWNfY29tbWFuZHMiOiBbXSwKICAgICAgImVudl9tYXAiOiB7CiAgICAgICAgIkhPU1ROQU1FIjogIiQoaG9zdC1uYW1lKSIsCiAgICAgICAgIlBBVEgiOiAiL3Vzci9sb2NhbC9zYmluOi91c3IvbG9jYWwvYmluOi91c3Ivc2JpbjovdXNyL2Jpbjovc2JpbjovYmluIgogICAgICB9CiAgICB9CiAgXSwKICAiY29tbW9uIjogewogICAgImNwYXRoIjogIi9ydW4va2F0YS1jb250YWluZXJzL3NoYXJlZC9jb250YWluZXJzIiwKICAgICJtb3VudF9zb3VyY2VfY3BhdGgiOiAiL3J1bi9rYXRhLWNvbnRhaW5lcnMvc2hhcmVkL2NvbnRhaW5lcnMiLAogICAgInNmcHJlZml4IjogIl4kKGNwYXRoKS8kKGJ1bmRsZS1pZCktW2EtejAtOV17MTZ9LSIsCiAgICAic3BhdGgiOiAiL3J1bi9rYXRhLWNvbnRhaW5lcnMvc2FuZGJveC9zdG9yYWdlIiwKICAgICJpcHY0X2EiOiAiKChbMC05XXxbMS05XVswLTldfDFbMC05XXsyfXwyWzAtNF1bMC05XXwyNVswLTVdKVxcLil7M30oWzAtOV18WzEtOV1bMC05XXwxWzAtOV17Mn18MlswLTRdWzAtOV18MjVbMC01XSkiLAogICAgImlwX3AiOiAiWzAtOV17MSw1fSIsCiAgICAic3ZjX25hbWUiOiAiW0EtWl9cXC5cXC1dKyIsCiAgICAiZG5zX2xhYmVsIjogIlthLXpBLVowLTlfXFwuXFwtXSsiLAogICAgInNfc291cmNlMSI6ICJeLi4yWzAtOV17M31fWzAtMV1bMC05XV9bMC0zXVswLTldX1swLTJdWzAtOV1fWzAtNV1bMC05XV9bMC01XVswLTldXFwuWzAtOV17MSwxMH0kIiwKICAgICJzX3NvdXJjZTIiOiAiXi4uZGF0YS8iLAogICAgImRuc19zdWJkb21haW4iOiAiXlthLXowLTldKFstYS16MC05XSpbYS16MC05XSk/JCIsCiAgICAicG9kX3VpZCI6ICJeWzAtOWEtZkEtRl17OH0tWzAtOWEtZkEtRl17NH0tWzAtOWEtZkEtRl17NH0tWzAtOWEtZkEtRl17NH0tWzAtOWEtZkEtRl17MTJ9JCIsCiAgICAiZGVmYXVsdF9jYXBzIjogWwogICAgICAiQ0FQX0NIT1dOIiwKICAgICAgIkNBUF9EQUNfT1ZFUlJJREUiLAogICAgICAiQ0FQX0ZTRVRJRCIsCiAgICAgICJDQVBfRk9XTkVSIiwKICAgICAgIkNBUF9NS05PRCIsCiAgICAgICJDQVBfTkVUX1JBVyIsCiAgICAgICJDQVBfU0VUR0lEIiwKICAgICAgIkNBUF9TRVRVSUQiLAogICAgICAiQ0FQX1NFVEZDQVAiLAogICAgICAiQ0FQX1NFVFBDQVAiLAogICAgICAiQ0FQX05FVF9CSU5EX1NFUlZJQ0UiLAogICAgICAiQ0FQX1NZU19DSFJPT1QiLAogICAgICAiQ0FQX0tJTEwiLAogICAgICAiQ0FQX0FVRElUX1dSSVRFIgogICAgXSwKICAgICJwcml2aWxlZ2VkX2NhcHMiOiBbCiAgICAgICJDQVBfQ0hPV04iLAogICAgICAiQ0FQX0RBQ19PVkVSUklERSIsCiAgICAgICJDQVBfREFDX1JFQURfU0VBUkNIIiwKICAgICAgIkNBUF9GT1dORVIiLAogICAgICAiQ0FQX0ZTRVRJRCIsCiAgICAgICJDQVBfS0lMTCIsCiAgICAgICJDQVBfU0VUR0lEIiwKICAgICAgIkNBUF9TRVRVSUQiLAogICAgICAiQ0FQX1NFVFBDQVAiLAogICAgICAiQ0FQX0xJTlVYX0lNTVVUQUJMRSIsCiAgICAgICJDQVBfTkVUX0JJTkRfU0VSVklDRSIsCiAgICAgICJDQVBfTkVUX0JST0FEQ0FTVCIsCiAgICAgICJDQVBfTkVUX0FETUlOIiwKICAgICAgIkNBUF9ORVRfUkFXIiwKICAgICAgIkNBUF9JUENfTE9DSyIsCiAgICAgICJDQVBfSVBDX09XTkVSIiwKICAgICAgIkNBUF9TWVNfTU9EVUxFIiwKICAgICAgIkNBUF9TWVNfUkFXSU8iLAogICAgICAiQ0FQX1NZU19DSFJPT1QiLAogICAgICAiQ0FQX1NZU19QVFJBQ0UiLAogICAgICAiQ0FQX1NZU19QQUNDVCIsCiAgICAgICJDQVBfU1lTX0FETUlOIiwKICAgICAgIkNBUF9TWVNfQk9PVCIsCiAgICAgICJDQVBfU1lTX05JQ0UiLAogICAgICAiQ0FQX1NZU19SRVNPVVJDRSIsCiAgICAgICJDQVBfU1lTX1RJTUUiLAogICAgICAiQ0FQX1NZU19UVFlfQ09ORklHIiwKICAgICAgIkNBUF9NS05PRCIsCiAgICAgICJDQVBfTEVBU0UiLAogICAgICAiQ0FQX0FVRElUX1dSSVRFIiwKICAgICAgIkNBUF9BVURJVF9DT05UUk9MIiwKICAgICAgIkNBUF9TRVRGQ0FQIiwKICAgICAgIkNBUF9NQUNfT1ZFUlJJREUiLAogICAgICAiQ0FQX01BQ19BRE1JTiIsCiAgICAgICJDQVBfU1lTTE9HIiwKICAgICAgIkNBUF9XQUtFX0FMQVJNIiwKICAgICAgIkNBUF9CTE9DS19TVVNQRU5EIiwKICAgICAgIkNBUF9BVURJVF9SRUFEIiwKICAgICAgIkNBUF9QRVJGTU9OIiwKICAgICAgIkNBUF9CUEYiLAogICAgICAiQ0FQX0NIRUNLUE9JTlRfUkVTVE9SRSIKICAgIF0sCiAgICAidmlydGlvX2Jsa19zdG9yYWdlX2NsYXNzZXMiOiBbCiAgICAgICJjYy1sb2NhbC1jc2kiLAogICAgICAiY2MtbWFuYWdlZC1jc2kiLAogICAgICAiY2MtbWFuYWdlZC1wcmVtaXVtLWNzaSIKICAgIF0sCiAgICAic21iX3N0b3JhZ2VfY2xhc3NlcyI6IFsKICAgICAgewogICAgICAgICJuYW1lIjogImF6dXJlZmlsZS1jc2kta2F0YS1jYyIsCiAgICAgICAgIm1vdW50X29wdGlvbnMiOiBbCiAgICAgICAgICAiZGlyX21vZGU9MDc3NyIsCiAgICAgICAgICAiZmlsZV9tb2RlPTA3NzciLAogICAgICAgICAgIm1mc3ltbGlua3MiLAogICAgICAgICAgImNhY2hlPXN0cmljdCIsCiAgICAgICAgICAibm9zaGFyZXNvY2siLAogICAgICAgICAgImFjdGltZW89MzAiLAogICAgICAgICAgIm5vYnJsIgogICAgICAgIF0KICAgICAgfQogICAgXQogIH0sCiAgInNhbmRib3giOiB7CiAgICAic3RvcmFnZXMiOiBbCiAgICAgIHsKICAgICAgICAiZHJpdmVyIjogImVwaGVtZXJhbCIsCiAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgInNvdXJjZSI6ICJzaG0iLAogICAgICAgICJmc3R5cGUiOiAidG1wZnMiLAogICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICJub2RldiIsCiAgICAgICAgICAibW9kZT0xNzc3IiwKICAgICAgICAgICJzaXplPTY3MTA4ODY0IgogICAgICAgIF0sCiAgICAgICAgIm1vdW50X3BvaW50IjogIi9ydW4va2F0YS1jb250YWluZXJzL3NhbmRib3gvc2htIiwKICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgIH0KICAgIF0KICB9LAogICJyZXF1ZXN0X2RlZmF1bHRzIjogewogICAgIkNyZWF0ZUNvbnRhaW5lclJlcXVlc3QiOiB7CiAgICAgICJhbGxvd19lbnZfcmVnZXgiOiBbCiAgICAgICAgIl5IT1NUTkFNRT0kKGRuc19sYWJlbCkkIiwKICAgICAgICAiXiQoc3ZjX25hbWUpX1BPUlRfJChpcF9wKV9UQ1A9dGNwOi8vJChpcHY0X2EpOiQoaXBfcCkkIiwKICAgICAgICAiXiQoc3ZjX25hbWUpX1BPUlRfJChpcF9wKV9UQ1BfUFJPVE89dGNwJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9QT1JUXyQoaXBfcClfVENQX1BPUlQ9JChpcF9wKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfUE9SVF8kKGlwX3ApX1RDUF9BRERSPSQoaXB2NF9hKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfU0VSVklDRV9IT1NUPSQoaXB2NF9hKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfU0VSVklDRV9QT1JUPSQoaXBfcCkkIiwKICAgICAgICAiXiQoc3ZjX25hbWUpX1NFUlZJQ0VfUE9SVF8kKGRuc19sYWJlbCk9JChpcF9wKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfUE9SVD10Y3A6Ly8kKGlwdjRfYSk6JChpcF9wKSQiLAogICAgICAgICJeQVpVUkVfQ0xJRU5UX0lEPVtBLUZhLWYwLTktXSokIiwKICAgICAgICAiXkFaVVJFX1RFTkFOVF9JRD1bQS1GYS1mMC05LV0qJCIsCiAgICAgICAgIl5BWlVSRV9GRURFUkFURURfVE9LRU5fRklMRT0vdmFyL3J1bi9zZWNyZXRzL2F6dXJlL3Rva2Vucy9henVyZS1pZGVudGl0eS10b2tlbiQiLAogICAgICAgICJeQVpVUkVfQVVUSE9SSVRZX0hPU1Q9aHR0cHM6Ly9sb2dpblxcLm1pY3Jvc29mdG9ubGluZVxcLmNvbS8kIiwKICAgICAgICAiXlRFUk09eHRlcm0kIgogICAgICBdLAogICAgICAiYWxsb3dfZW52X3JlZ2V4X21hcCI6IHsKICAgICAgICAiQ1BVX0xJTUlUIjogIl5bMC05XSskIiwKICAgICAgICAiSk9CX0NPTVBMRVRJT05fSU5ERVgiOiAiXlswLTldKiQiLAogICAgICAgICJNRU1PUllfTElNSVQiOiAiXlswLTldKyQiCiAgICAgIH0KICAgIH0sCiAgICAiQ29weUZpbGVSZXF1ZXN0IjogWwogICAgICAiJChzZnByZWZpeCkiCiAgICBdLAogICAgIkV4ZWNQcm9jZXNzUmVxdWVzdCI6IHsKICAgICAgImFsbG93ZWRfY29tbWFuZHMiOiBbXSwKICAgICAgInJlZ2V4IjogW10KICAgIH0sCiAgICAiVXBkYXRlUm91dGVzUmVxdWVzdCI6IHsKICAgICAgImZvcmJpZGRlbl9kZXZpY2VfbmFtZXMiOiBbCiAgICAgICAgImxvIgogICAgICBdLAogICAgICAiZm9yYmlkZGVuX3NvdXJjZV9yZWdleCI6IFsKICAgICAgICAiXig/OjB7MCw0fTopezAsN30wezAsM30xJCIsCiAgICAgICAgIl4xMjdcXC4oPzpbMC05XXsxLDN9XFwuKXsyfVswLTldezEsM30kIgogICAgICBdCiAgICB9LAogICAgIlVwZGF0ZUludGVyZmFjZVJlcXVlc3QiOiB7CiAgICAgICJhbGxvd19yYXdfZmxhZ3MiOiAxMjgsCiAgICAgICJmb3JiaWRkZW5fbmFtZXMiOiBbCiAgICAgICAgImxvIgogICAgICBdLAogICAgICAiZm9yYmlkZGVuX2h3X2FkZHJzIjogWwogICAgICAgICIwMDowMDowMDowMDowMDowMCIKICAgICAgXQogICAgfSwKICAgICJDbG9zZVN0ZGluUmVxdWVzdCI6IGZhbHNlLAogICAgIlJlYWRTdHJlYW1SZXF1ZXN0IjogZmFsc2UsCiAgICAiVXBkYXRlRXBoZW1lcmFsTW91bnRzUmVxdWVzdCI6IGZhbHNlLAogICAgIldyaXRlU3RyZWFtUmVxdWVzdCI6IGZhbHNlCiAgfQp9 +spec: + containers: + - args: + - /bin/sh + image: "mcr.microsoft.com/aks/e2e/library-busybox:master.220314.1-linux-amd64" + imagePullPolicy: IfNotPresent + name: secret-volume-test + resources: {} + terminationMessagePath: /dev/termination-log + terminationMessagePolicy: File + volumeMounts: + - mountPath: /etc/secret-volume + name: secret-volume + - mountPath: /var/run/secrets/kubernetes.io/serviceaccount + name: kube-api-access-rrjzc + readOnly: true + dnsPolicy: ClusterFirst + enableServiceLinks: true + preemptionPolicy: PreemptLowerPriority + priority: 0 + restartPolicy: Never + runtimeClassName: kata-cc + schedulerName: default-scheduler + securityContext: {} + serviceAccount: default + serviceAccountName: default + terminationGracePeriodSeconds: 30 + tolerations: + - effect: NoExecute + key: node.kubernetes.io/not-ready + operator: Exists + tolerationSeconds: 300 + - effect: NoExecute + key: node.kubernetes.io/unreachable + operator: Exists + tolerationSeconds: 300 + volumes: + - name: secret-volume + secret: + defaultMode: 420 + items: + - key: data-1 + path: new-path-data-1 + secretName: secret-test-map-a464d595-bac4-4b14-bade-3ffd0c195a08 + - name: kube-api-access-rrjzc + projected: + defaultMode: 420 + sources: + - serviceAccountToken: + expirationSeconds: 3607 + path: token + - configMap: + items: + - key: ca.crt + path: ca.crt + name: kube-root-ca.crt + - downwardAPI: + items: + - fieldRef: + apiVersion: v1 + fieldPath: metadata.namespace + path: namespace +status: {} diff --git a/src/agent/samples/policy/yaml/webhook/webhook-pod3.yaml b/src/agent/samples/policy/yaml/webhook/webhook-pod3.yaml new file mode 100644 index 000000000000..e5f43af59584 --- /dev/null +++ b/src/agent/samples/policy/yaml/webhook/webhook-pod3.yaml @@ -0,0 +1,148 @@ +--- +apiVersion: v1 +kind: Namespace +metadata: + name: emptydir-wrapper-9641 +--- +apiVersion: v1 +kind: ConfigMap +metadata: + name: emptydir-wrapper-test-434a02c7-a53e-4aaa-aa85-90213274e068 + namespace: emptydir-wrapper-9641 +data: + file1.json: "{key1: value1, key2: value2, key123: value123, 321key: value321}\n" +--- +apiVersion: v1 +kind: Secret +metadata: + namespace: emptydir-wrapper-9641 + name: emptydir-wrapper-test-434a02c7-a53e-4aaa-aa85-90213274e068 +data: + data-1: bWVnYV9zZWNyZXRfa2V5Cg== +--- +apiVersion: v1 +kind: Pod +metadata: + creationTimestamp: ~ + managedFields: + - apiVersion: v1 + fieldsType: FieldsV1 + fieldsV1: + "f:spec": + "f:containers": + "k:{\"name\":\"secret-test\"}": + ".": {} + "f:args": {} + "f:image": {} + "f:imagePullPolicy": {} + "f:name": {} + "f:resources": {} + "f:terminationMessagePath": {} + "f:terminationMessagePolicy": {} + "f:volumeMounts": + ".": {} + "k:{\"mountPath\":\"/etc/configmap-volume\"}": + ".": {} + "f:mountPath": {} + "f:name": {} + "k:{\"mountPath\":\"/etc/secret-volume\"}": + ".": {} + "f:mountPath": {} + "f:name": {} + "f:readOnly": {} + "f:dnsPolicy": {} + "f:enableServiceLinks": {} + "f:restartPolicy": {} + "f:schedulerName": {} + "f:securityContext": {} + "f:terminationGracePeriodSeconds": {} + "f:volumes": + ".": {} + "k:{\"name\":\"configmap-volume\"}": + ".": {} + "f:configMap": + ".": {} + "f:defaultMode": {} + "f:name": {} + "f:name": {} + "k:{\"name\":\"secret-volume\"}": + ".": {} + "f:name": {} + "f:secret": + ".": {} + "f:defaultMode": {} + "f:secretName": {} + manager: e2e.test + operation: Update + time: "2023-06-16T17:39:41Z" + name: pod-secrets-df473706-9a13-4759-84bd-eea6ed2d7b61 + namespace: emptydir-wrapper-9641 + annotations: + io.katacontainers.config.agent.policy: IyBDb3B5cmlnaHQgKGMpIDIwMjMgTWljcm9zb2Z0IENvcnBvcmF0aW9uCiMKIyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMAojCnBhY2thZ2UgYWdlbnRfcG9saWN5CgppbXBvcnQgZnV0dXJlLmtleXdvcmRzLmluCmltcG9ydCBmdXR1cmUua2V5d29yZHMuZXZlcnkKCiMgRGVmYXVsdCB2YWx1ZXMsIHJldHVybmVkIGJ5IE9QQSB3aGVuIHJ1bGVzIGNhbm5vdCBiZSBldmFsdWF0ZWQgdG8gdHJ1ZS4KZGVmYXVsdCBBZGRBUlBOZWlnaGJvcnNSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgQWRkU3dhcFJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBDbG9zZVN0ZGluUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IENvcHlGaWxlUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IENyZWF0ZUNvbnRhaW5lclJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBDcmVhdGVTYW5kYm94UmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IERlc3Ryb3lTYW5kYm94UmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgRXhlY1Byb2Nlc3NSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgR2V0T09NRXZlbnRSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBHdWVzdERldGFpbHNSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBMaXN0SW50ZXJmYWNlc1JlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBMaXN0Um91dGVzUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IE1lbUhvdHBsdWdCeVByb2JlUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IE9ubGluZUNQVU1lbVJlcXVlc3QgOj0gdHJ1ZQpkZWZhdWx0IFBhdXNlQ29udGFpbmVyUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFJlYWRTdHJlYW1SZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgUmVtb3ZlQ29udGFpbmVyUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgUmVtb3ZlU3RhbGVWaXJ0aW9mc1NoYXJlTW91bnRzUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgUmVzZWVkUmFuZG9tRGV2UmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFJlc3VtZUNvbnRhaW5lclJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBTZXRHdWVzdERhdGVUaW1lUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFNldFBvbGljeVJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBTaWduYWxQcm9jZXNzUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgU3RhcnRDb250YWluZXJSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBTdGFydFRyYWNpbmdSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgU3RhdHNDb250YWluZXJSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBTdG9wVHJhY2luZ1JlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBUdHlXaW5SZXNpemVSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBVcGRhdGVDb250YWluZXJSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgVXBkYXRlRXBoZW1lcmFsTW91bnRzUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFVwZGF0ZUludGVyZmFjZVJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBVcGRhdGVSb3V0ZXNSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgV2FpdFByb2Nlc3NSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBXcml0ZVN0cmVhbVJlcXVlc3QgOj0gZmFsc2UKCiMgQWxsb3dSZXF1ZXN0c0ZhaWxpbmdQb2xpY3kgOj0gdHJ1ZSBjb25maWd1cmVzIHRoZSBBZ2VudCB0byAqYWxsb3cgYW55CiMgcmVxdWVzdHMgY2F1c2luZyBhIHBvbGljeSBmYWlsdXJlKi4gVGhpcyBpcyBhbiB1bnNlY3VyZSBjb25maWd1cmF0aW9uCiMgYnV0IGlzIHVzZWZ1bCBmb3IgYWxsb3dpbmcgdW5zZWN1cmUgcG9kcyB0byBzdGFydCwgdGhlbiBjb25uZWN0IHRvCiMgdGhlbSBhbmQgaW5zcGVjdCBPUEEgbG9ncyBmb3IgdGhlIHJvb3QgY2F1c2Ugb2YgYSBmYWlsdXJlLgpkZWZhdWx0IEFsbG93UmVxdWVzdHNGYWlsaW5nUG9saWN5IDo9IGZhbHNlCgojIENvbnN0YW50cwpTX05BTUVfS0VZID0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZSIKU19OQU1FU1BBQ0VfS0VZID0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZXNwYWNlIgpCVU5ETEVfSUQgPSAiW2EtejAtOV17NjR9IgoKQ3JlYXRlQ29udGFpbmVyUmVxdWVzdDo9IHJlc3AgewogICAgbm90IGlzX251bGwoaW5wdXQuZW52X21hcCkKICAgIAogICAgaV9lbnZfbWFwIDo9IGlucHV0LmVudl9tYXAKICAgIAogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBwX2Vudl9tYXAgOj0gcF9jb250YWluZXIuZW52X21hcCAgCiAgICBhbGxvd19lbnZfbWFwKHBfZW52X21hcCwgaV9lbnZfbWFwKQogICAgCiAgICBpX3Byb2Nlc3MgOj0gaW5wdXQuYmFzZS5PQ0kuUHJvY2VzcwogICAgCiAgICBwX3Byb2Nlc3MgOj0gcF9jb250YWluZXIuT0NJLlByb2Nlc3MKICAgIAogICAgYWxsb3dfYXJncyhpX3Byb2Nlc3MsIHBfcHJvY2VzcywgaV9lbnZfbWFwKQoKICAgIHJlc3AgPSBDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uKGlucHV0LmJhc2UpCiAgICBwcmludCgiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdDogdHJ1ZSIpCn0KCmFsbG93X2FyZ3MoaV9wcm9jZXNzLCBwX3Byb2Nlc3MsIGlfZW52X21hcCkgewogICAgaV9hcmdzIDo9IGlfcHJvY2Vzcy5BcmdzCiAgICBwX2FyZ3MgOj0gcF9wcm9jZXNzLkFyZ3MKICAgIHByaW50KCJhbGxvd19hcmdzOiBpX2FyZ3MgPSIsIGlfYXJncywgInBfYXJncyA9IiwgcF9hcmdzKQogICAgY291bnQoaV9hcmdzKSA9PSBjb3VudChwX2FyZ3MpCiAgICBldmVyeSBpLCBpX2FyZyBpbiBpX2FyZ3MgewogICAgICAgIHByaW50KCJhbGxvd19hcmdzOiBpX2FyZyA9IiwgaV9hcmcpCiAgICAgICAgcF9hcmdfcmVwbGFjZWQgOj0gcmVwbGFjZV9lbnZfdmFyaWFibGVzKHBfYXJnc1tpXSwgaV9lbnZfbWFwKQogICAgICAgIHByaW50KCJhbGxvd19hcmdzOiBwX2FyZ19yZXBsYWNlZCA9IiwgcF9hcmdfcmVwbGFjZWQpCiAgICAgICAgcF9hcmdfcmVwbGFjZWQyIDo9IHJlcGxhY2UocF9hcmdfcmVwbGFjZWQsICIkJCIsICIkIikKICAgICAgICBwcmludCgiYWxsb3dfYXJnczogcF9hcmdfcmVwbGFjZWQyID0iLCBwX2FyZ19yZXBsYWNlZDIpCiAgICAgICAgaV9hcmcgPT0gcF9hcmdfcmVwbGFjZWQyCiAgICB9CiAgICBwcmludCgiYWxsb3dfYXJnczogdHJ1ZSIpCn0KCmFsbG93X2FyZ3MoaV9wcm9jZXNzLCBwX3Byb2Nlc3MsIGlfZW52X21hcCkgewogICAgbm90IGlfcHJvY2Vzcy5BcmdzCiAgICBub3QgcF9wcm9jZXNzLkFyZ3MKICAgIHByaW50KCJhbGxvd19hcmdzMjogbm8gYXJncyIpCn0KCiMgdGhpcyBmdW5jdGlvbiByZXBsYWNlcyBhbGwgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyBpbiBhIHN0cmluZywgZ2l2ZW4gYSBtYXAgb2YgZW52aXJvbm1lbnQga2V5cyB0byBlbnZpcm9ubWVudCB2YWx1ZXMKIyBlZyBzdHIgPSAiZWNobyAkKENMVVNURVJfSUQpOyBlY2hvICQoTk9ERV9OQU1FKTsiCiMgZW52X21hcCA9IHsiQ0xVU1RFUl9JRCI6ICJhYmMiLCAiTk9ERV9OQU1FIiA6ICJ4eXoifQojIHJlc3VsdCA9ICJlY2hvIGFiYzsgZWNobyB4eXo7IgpyZXBsYWNlX2Vudl92YXJpYWJsZXMoc3RyLCBlbnZfbWFwKSA9IHJlc3VsdCB7CiAgICAjIG1ha2UgYW4gYXJyYXkgb2YgdGhlIGtleXMgZWcgWyJDTFVTVEVSX0lEIiwgIk5PREVfTkFNRSJdCiAgICBrZXlzIDo9IFt4IHwgc29tZSB4IGluIG9iamVjdC5rZXlzKGVudl9tYXApXQogICAgcmVzdWx0IDo9IHJlcGxhY2Vfc3RyX3JlYyhzdHIsIGVudl9tYXAsIGtleXMsIGNvdW50KGtleXMpIC0gMSkKfQoKIyBiYXNlIGNhc2UKcmVwbGFjZV9zdHJfcmVjKHN0ciwgZW52X21hcCwgYXJyX2tleXMsIGkpID0gcmVzdWx0IHsKICAgIGkgPCAwCiAgICByZXN1bHQgOj0gc3RyCn0KCiMgcmVjdXJzaXZlIHN0ZXAKcmVwbGFjZV9zdHJfcmVjKHN0ciwgZW52X21hcCwgYXJyX2tleXMsIGkpID0gcmVzdWx0IHsKICAgIGkgPj0gMAogICAga2V5IDo9IGFycl9rZXlzW2ldCiAgICBlbnZfa2V5MSA6PSBjb25jYXQoIiIsIFsiJCgiLCBrZXksICIpIl0pCiAgICAjIHJlcGxhY2UgJChWQVIpIHdpdGggdmFsdWUKICAgIG5ld19zdHIxIDo9IHJlcGxhY2Uoc3RyLCBlbnZfa2V5MSwgZW52X21hcFtrZXldKQogICAgIyByZXBsYWNlIG5leHQgZW52aXJvbm1lbnQgdmFyaWFibGUKICAgIHJlc3VsdCA9IHJlcGxhY2Vfc3RyX3JlYyhuZXdfc3RyMSwgZW52X21hcCwgYXJyX2tleXMsIGkgLSAxKQp9CgphbGxvd19lbnZfbWFwKHBfZW52X21hcCwgaV9lbnZfbWFwKSB7CiAgICBwcmludCgiYWxsb3dfZW52X21hcDogcF9lbnZfbWFwID0iLCBwX2Vudl9tYXApCiAgICBldmVyeSBlbnZfa2V5LCBlbnZfdmFsIGluIGlfZW52X21hcCB7CiAgICAgICAgcHJpbnQoImFsbG93X2VudjogZW52X2tleSA9IiwgZW52X2tleSwgImVudl92YWwgPSIsIGVudl92YWwpCiAgICAgICAgYWxsb3dfZW52X21hcF9lbnRyeShlbnZfa2V5LCBlbnZfdmFsLCBwX2Vudl9tYXApCiAgICB9CiAgICBwcmludCgiYWxsb3dfZW52X21hcDogdHJ1ZSIpCn0KCiMgQWxsb3cgZXhhY3QgbWF0Y2gKYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBpX3ZhbCA9PSBwX3ZhbAogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnk6IHRydWUiKQp9CgojIEFsbG93IHJlc291cmNlRmllbGRSZWYgdmFsdWVzIChlLmcuLCAibGltaXRzLmNwdSIpLgphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgICMgYSB2YXJpYWJsZSB3ZSBzaG91bGQgYmUgdmFsaWRhdGluZyB1c2luZyBhIHJlZ2V4IGZyb20gc2V0dGluZ3MKICAgIHBfdmFsID09ICIkKHZhbGlkYXRlLWZyb20tc2V0dGluZ3MpIgogICAgcmVnZXhfdmFsIDo9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuQ3JlYXRlQ29udGFpbmVyUmVxdWVzdC5hbGxvd19lbnZfcmVnZXhfbWFwW2tleV0KICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4X3ZhbCwgaV92YWwpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSAyOiB0cnVlIikKfQoKIyBBbGxvdyBub2RlLW5hbWUKYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChub2RlLW5hbWUpIgogICAgcmVnZXgubWF0Y2gocG9saWN5X2RhdGEuY29tbW9uLmRuc19zdWJkb21haW4gLCBpX3ZhbCkKICAgIHByaW50KCJhbGxvd19lbnZfbWFwX2VudHJ5IDM6IHRydWUiKQp9CgojIEFsbG93IGhvc3QtbmFtZQphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgIHBfdmFsID09ICIkKGhvc3QtbmFtZSkiCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24uZG5zX2xhYmVsICwgaV92YWwpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSA0OiB0cnVlIikKfQoKIyBBbGxvdyBwb2QtdWlkCmFsbG93X2Vudl9tYXBfZW50cnkoa2V5LCBpX3ZhbCwgcF9lbnZfbWFwKSB7CiAgICBwX3ZhbCA6PSBwX2Vudl9tYXBba2V5XQogICAgcF92YWwgPT0gIiQocG9kLXVpZCkiCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24ucG9kX3VpZCAsIGlfdmFsKQogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgNTogdHJ1ZSIpCn0KCiMgQWxsb3cgZmllbGRSZWYgImZpZWxkUGF0aDogc3RhdHVzLnBvZElQIiB2YWx1ZXMuCmFsbG93X2Vudl9tYXBfZW50cnkoa2V5LCBpX3ZhbCwgcF9lbnZfbWFwKSB7CiAgICBpc19pcChpX3ZhbCkKCiAgICBwX3ZhbCA6PSBwX2Vudl9tYXBba2V5XQogICAgcF92YXIgOj0gY29uY2F0KCI9IiwgW2tleSwgcF92YWxdKQogICAgYWxsb3dfcG9kX2lwX3ZhcihrZXksIHBfdmFyKQogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgNjogdHJ1ZSIpCn0KCiMgQWxsb3cgZmllbGRSZWYgImZpZWxkUGF0aDogc3RhdHVzLmhvc3RJUCIgdmFsdWVzLgphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgaXNfaXAoaV92YWwpCgogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgIHBfdmFyIDo9IGNvbmNhdCgiPSIsIFtrZXksIHBfdmFsXSkKICAgIGFsbG93X2hvc3RfaXBfdmFyKGtleSwgcF92YXIpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSA3OiB0cnVlIikKfQoKIyBNYXRjaCBpbnB1dCB3aXRoIG9uZSBvZiB0aGUgcG9saWN5IHZhcmlhYmxlcywgYWZ0ZXIgc3Vic3RpdHV0aW5nICQoc2FuZGJveC1uYW1lKS4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChzYW5kYm94LW5hbWUpIgogICAgc19uYW1lIDo9IGlucHV0LmJhc2UuT0NJLkFubm90YXRpb25zW1NfTkFNRV9LRVldCiAgICBwX3ZhcjIgOj0gcmVwbGFjZShwX3ZhbCwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHBfdmFyMiA9PSBpX3ZhbAogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgODogdHJ1ZSIpCn0KCiMgTWF0Y2ggaW5wdXQgd2l0aCBvbmUgb2YgdGhlIHBvbGljeSB2YXJpYWJsZXMsIGFmdGVyIHN1YnN0aXR1dGluZyAkKHNhbmRib3gtbmFtZXNwYWNlKS4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChzYW5kYm94LW5hbWVzcGFjZSkiCiAgICBzX25hbWVzcGFjZSA6PSBpbnB1dC5iYXNlLk9DSS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwX3ZhcjIgOj0gcmVwbGFjZShwX3ZhbCwgIiQoc2FuZGJveC1uYW1lc3BhY2UpIiwgc19uYW1lc3BhY2UpCiAgICBwX3ZhcjIgPT0gaV92YWwKICAgIHByaW50KCJhbGxvd19lbnZfbWFwX2VudHJ5IDk6IHRydWUiKQp9CgojIEFsbG93IGlucHV0IGVudiB2YXJpYWJsZXMgdGhhdCBtYXRjaCB3aXRoIGEgcmVxdWVzdF9kZWZhdWx0cyByZWdleC4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHNvbWUgcF9yZWdleDEgaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5DcmVhdGVDb250YWluZXJSZXF1ZXN0LmFsbG93X2Vudl9yZWdleAogICAgcF9yZWdleDIgOj0gcmVwbGFjZShwX3JlZ2V4MSwgIiQoaXB2NF9hKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcHY0X2EpCiAgICBwX3JlZ2V4MyA6PSByZXBsYWNlKHBfcmVnZXgyLCAiJChpcF9wKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcF9wKQogICAgcF9yZWdleDQgOj0gcmVwbGFjZShwX3JlZ2V4MywgIiQoc3ZjX25hbWUpIiwgcG9saWN5X2RhdGEuY29tbW9uLnN2Y19uYW1lKQogICAgcF9yZWdleDUgOj0gcmVwbGFjZShwX3JlZ2V4NCwgIiQoZG5zX2xhYmVsKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5kbnNfbGFiZWwpCgogICAgcmVzdWx0IDo9IGNvbmNhdCgiPSIsIFtrZXksIGlfdmFsXSkKICAgIHJlZ2V4Lm1hdGNoKHBfcmVnZXg1LCByZXN1bHQpCgogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgMTA6IHRydWUiKQp9CgpDcmVhdGVDb250YWluZXJSZXF1ZXN0Oj0gcmVzcCB7CiAgICBub3QgaW5wdXQuZW52X21hcAogICAgaV9wcm9jZXNzID0gaW5wdXQuT0NJLlByb2Nlc3MKICAgIHNfbmFtZSA9IGlucHV0Lk9DSS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBwX3Byb2Nlc3MgPSBwX2NvbnRhaW5lci5PQ0kuUHJvY2VzcwogICAgYWxsb3dfZGVwcmVjYXRlZF9hcmdzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUpCiAgICByZXNwID0gQ3JlYXRlQ29udGFpbmVyUmVxdWVzdENvbW1vbihpbnB1dCkKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0MjogdHJ1ZSIpCn0KCkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb24ocmVxKTo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgICMgQ2hlY2sgaWYgdGhlIGlucHV0IHJlcXVlc3Qgc2hvdWxkIGJlIHJlamVjdGVkIGV2ZW4gYmVmb3JlIGNoZWNraW5nIHRoZQogICAgIyBwb2xpY3lfZGF0YS5jb250YWluZXJzIGluZm9ybWF0aW9uLgogICAgYWxsb3dfY3JlYXRlX2NvbnRhaW5lcl9pbnB1dChyZXEpCgogICAgaV9vY2kgOj0gcmVxLk9DSQogICAgaV9zdG9yYWdlcyA6PSByZXEuc3RvcmFnZXMKICAgIGlfZGV2aWNlcyA6PSByZXEuZGV2aWNlcwoKICAgICMgYXJyYXkgb2YgcG9zc2libGUgc3RhdGUgb3BlcmF0aW9ucwogICAgb3BzX2J1aWxkZXIgOj0gW10KCiAgICAjIGNoZWNrIHNhbmRib3ggbmFtZQogICAgc2FuZGJveF9uYW1lID0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FX0tFWV0KICAgIGFkZF9zYW5kYm94X25hbWVfdG9fc3RhdGUgOj0gc3RhdGVfYWxsb3dzKCJzYW5kYm94X25hbWUiLCBzYW5kYm94X25hbWUpCiAgICBvcHNfYnVpbGRlcjEgOj0gY29uY2F0X29wX2lmX25vdF9udWxsKG9wc19idWlsZGVyLCBhZGRfc2FuZGJveF9uYW1lX3RvX3N0YXRlKQoKICAgICMgQ2hlY2sgaWYgYW55IGVsZW1lbnQgZnJvbSB0aGUgcG9saWN5X2RhdGEuY29udGFpbmVycyBhcnJheSBhbGxvd3MgdGhlIGlucHV0IHJlcXVlc3QuCiAgICBzb21lIHBfY29udGFpbmVyIGluIHBvbGljeV9kYXRhLmNvbnRhaW5lcnMKICAgIHByaW50KCI9PT09PT09PSBDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiB0cnlpbmcgbmV4dCBwb2xpY3kgY29udGFpbmVyIikKCiAgICBwX3BpZG5zIDo9IHBfY29udGFpbmVyLnNhbmRib3hfcGlkbnMKICAgIGlfcGlkbnMgOj0gcmVxLnNhbmRib3hfcGlkbnMKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiBwX3BpZG5zID0iLCBwX3BpZG5zLCAiaV9waWRucyA9IiwgaV9waWRucykKICAgIHBfcGlkbnMgPT0gaV9waWRucwoKICAgIHBfb2NpIDo9IHBfY29udGFpbmVyLk9DSQoKICAgICMgY2hlY2sgbmFtZXNwYWNlCiAgICBwX25hbWVzcGFjZSA6PSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBpX25hbWVzcGFjZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwcmludCAoIkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb246IHBfbmFtZXNwYWNlID0iLCBwX25hbWVzcGFjZSwgImlfbmFtZXNwYWNlID0iLCBpX25hbWVzcGFjZSkKICAgIGFkZF9uYW1lc3BhY2VfdG9fc3RhdGUgOj0gYWxsb3dfbmFtZXNwYWNlKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkKICAgIG9wc19idWlsZGVyMiA6PSBjb25jYXRfb3BfaWZfbm90X251bGwob3BzX2J1aWxkZXIxLCBhZGRfbmFtZXNwYWNlX3RvX3N0YXRlKQoKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiBwIFZlcnNpb24gPSIsIHBfb2NpLlZlcnNpb24sICJpIFZlcnNpb24gPSIsIGlfb2NpLlZlcnNpb24pCiAgICBwX29jaS5WZXJzaW9uID09IGlfb2NpLlZlcnNpb24KCiAgICBwcmludCgiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdENvbW1vbjogcCBSZWFkb25seSA9IiwgcF9vY2kuUm9vdC5SZWFkb25seSwgImkgUmVhZG9ubHkgPSIsIGlfb2NpLlJvb3QuUmVhZG9ubHkpCiAgICBwX29jaS5Sb290LlJlYWRvbmx5ID09IGlfb2NpLlJvb3QuUmVhZG9ubHkKCiAgICBhbGxvd19hbm5vKHBfb2NpLCBpX29jaSkKCiAgICBwX3N0b3JhZ2VzIDo9IHBfY29udGFpbmVyLnN0b3JhZ2VzCiAgICBhbGxvd19ieV9hbm5vKHBfb2NpLCBpX29jaSwgcF9zdG9yYWdlcywgaV9zdG9yYWdlcykKCiAgICBwX2RldmljZXMgOj0gcF9jb250YWluZXIuZGV2aWNlcwogICAgYWxsb3dfZGV2aWNlcyhwX2RldmljZXMsIGlfZGV2aWNlcykKCiAgICByZXQgOj0gYWxsb3dfbGludXgob3BzX2J1aWxkZXIyLCBwX29jaSwgaV9vY2kpCiAgICByZXQuYWxsb3dlZAoKICAgIG9wcyA6PSByZXQub3BzCgogICAgcHJpbnQoIkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb246IHRydWUiKQp9CgphbGxvd19jcmVhdGVfY29udGFpbmVyX2lucHV0KHJlcSkgewogICAgcHJpbnQoImFsbG93X2NyZWF0ZV9jb250YWluZXJfaW5wdXQ6IGlucHV0ID0iLCByZXEpCgogICAgY291bnQocmVxLnNoYXJlZF9tb3VudHMpID09IDAKICAgIGlzX251bGwocmVxLnN0cmluZ191c2VyKQoKICAgIGlfb2NpIDo9IHJlcS5PQ0kKICAgIGlzX251bGwoaV9vY2kuSG9va3MpCiAgICBpc19udWxsKGlfb2NpLlNvbGFyaXMpCiAgICBpc19udWxsKGlfb2NpLldpbmRvd3MpCgogICAgaV9saW51eCA6PSBpX29jaS5MaW51eAogICAgY291bnQoaV9saW51eC5HSURNYXBwaW5ncykgPT0gMAogICAgY291bnQoaV9saW51eC5Nb3VudExhYmVsKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlJlc291cmNlcy5EZXZpY2VzKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlJvb3Rmc1Byb3BhZ2F0aW9uKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlVJRE1hcHBpbmdzKSA9PSAwCiAgICBpc19udWxsKGlfbGludXguSW50ZWxSZHQpCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLkJsb2NrSU8pCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLk5ldHdvcmspCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLlBpZHMpCiAgICBpc19udWxsKGlfbGludXguU2VjY29tcCkKCiAgICBpX3Byb2Nlc3MgOj0gaV9vY2kuUHJvY2VzcwogICAgY291bnQoaV9wcm9jZXNzLlNlbGludXhMYWJlbCkgPT0gMAogICAgY291bnQoaV9wcm9jZXNzLlVzZXIuVXNlcm5hbWUpID09IDAKCiAgICBwcmludCgiYWxsb3dfY3JlYXRlX2NvbnRhaW5lcl9pbnB1dDogdHJ1ZSIpCn0KCmFsbG93X25hbWVzcGFjZShwX25hbWVzcGFjZSwgaV9uYW1lc3BhY2UpID0gYWRkX25hbWVzcGFjZSB7CiAgICBwX25hbWVzcGFjZSA9PSBpX25hbWVzcGFjZQogICAgYWRkX25hbWVzcGFjZSA6PSBudWxsCiAgICBwcmludCgiYWxsb3dfbmFtZXNwYWNlIDE6IGlucHV0IG5hbWVzcGFjZSBtYXRjaGVzIHBvbGljeSBkYXRhIikKfQoKYWxsb3dfbmFtZXNwYWNlKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkgPSBhZGRfbmFtZXNwYWNlIHsKICAgIHBfbmFtZXNwYWNlID09ICIiCiAgICBwcmludCgiYWxsb3dfbmFtZXNwYWNlIDI6IG5vIG5hbWVzcGFjZSBmb3VuZCBvbiBwb2xpY3kgZGF0YSIpCiAgICBhZGRfbmFtZXNwYWNlIDo9IHN0YXRlX2FsbG93cygibmFtZXNwYWNlIiwgaV9uYW1lc3BhY2UpCn0KCiMgdmFsdWUgaGFzbid0IGJlZW4gc2VlbiBiZWZvcmUsIHNhdmUgaXQgdG8gc3RhdGUKc3RhdGVfYWxsb3dzKGtleSwgdmFsdWUpID0gYWN0aW9uIHsKICBzdGF0ZSA6PSBnZXRfc3RhdGUoKQogIHByaW50KCJzdGF0ZV9hbGxvd3MgMTogc3RhdGVba2V5XSA9Iiwgc3RhdGVba2V5XSwgInZhbHVlID0iLCB2YWx1ZSkKICBub3Qgc3RhdGVba2V5XQogIHByaW50KCJzdGF0ZV9hbGxvd3MgMTogc2F2aW5nIHRvIHN0YXRlIGtleSA9Iiwga2V5LCAidmFsdWUgPSIsIHZhbHVlKQogIHBhdGggOj0gZ2V0X3N0YXRlX3BhdGgoa2V5KSAKICBhY3Rpb24gOj0gewogICAgIm9wIjogImFkZCIsCiAgICAicGF0aCI6IHBhdGgsIAogICAgInZhbHVlIjogdmFsdWUsCiAgfQp9CgojIHZhbHVlIG1hdGNoZXMgd2hhdCdzIGluIHN0YXRlLCBhbGxvdyBpdApzdGF0ZV9hbGxvd3Moa2V5LCB2YWx1ZSkgPSBhY3Rpb24gewogIHByaW50KCJzdGF0ZV9hbGxvd3MgMjogc3RhcnQiKQogIHN0YXRlIDo9IGdldF9zdGF0ZSgpCiAgcHJpbnQoInN0YXRlX2FsbG93cyAyOiBzdGF0ZVtrZXldID0iLCBzdGF0ZVtrZXldLCAidmFsdWUgPSIsIHZhbHVlKQogIHZhbHVlID09IHN0YXRlW2tleV0KICBwcmludCgic3RhdGVfYWxsb3dzIDI6IGZvdW5kIGtleSA9Iiwga2V5LCAidmFsdWUgPSIsIHZhbHVlLCAiIGluIHN0YXRlIikKICBhY3Rpb24gOj0gbnVsbAp9CgojIGhlbHBlciBmdW5jdGlvbnMgdG8gaW50ZXJhY3Qgd2l0aCB0aGUgc3RhdGUKZ2V0X3N0YXRlKCkgPSBzdGF0ZSB7CiAgc3RhdGUgOj0gZGF0YVsicHN0YXRlIl0KfQoKZ2V0X3N0YXRlX3ZhbChrZXkpID0gdmFsdWUgewogICAgc3RhdGUgOj0gZ2V0X3N0YXRlKCkKICAgIHZhbHVlIDo9IHN0YXRlW2tleV0KfQoKZ2V0X3N0YXRlX3BhdGgoa2V5KSA9IHBhdGggewogICAgIyBwcmVwZW5kICIvcHN0YXRlLyIgdG8ga2V5CiAgICBwYXRoIDo9IGNvbmNhdCgiLyIsIFsiL3BzdGF0ZSIsIGtleV0pCn0KCiMgSGVscGVyIGZ1bmN0aW9ucyB0byBjb25kaXRpb25hbGx5IGNvbmNhdGVuYXRlIG9wIGlzIG5vdCBudWxsCmNvbmNhdF9vcF9pZl9ub3RfbnVsbChvcHMsIG9wKSA9IHJlc3VsdCB7CiAgICBvcCA9PSBudWxsCiAgICByZXN1bHQgOj0gb3BzCn0KCmNvbmNhdF9vcF9pZl9ub3RfbnVsbChvcHMsIG9wKSA9IHJlc3VsdCB7CiAgICBvcCAhPSBudWxsCiAgICByZXN1bHQgOj0gYXJyYXkuY29uY2F0KG9wcywgW29wXSkKfQoKIyBSZWplY3QgdW5leHBlY3RlZCBhbm5vdGF0aW9ucy4KYWxsb3dfYW5ubyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19hbm5vIDE6IHN0YXJ0IikKCiAgICBub3QgaV9vY2kuQW5ub3RhdGlvbnMKCiAgICBwcmludCgiYWxsb3dfYW5ubyAxOiB0cnVlIikKfQphbGxvd19hbm5vKHBfb2NpLCBpX29jaSkgewogICAgcHJpbnQoImFsbG93X2Fubm8gMjogcCBBbm5vdGF0aW9ucyA9IiwgcF9vY2kuQW5ub3RhdGlvbnMpCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiBpIEFubm90YXRpb25zID0iLCBpX29jaS5Bbm5vdGF0aW9ucykKCiAgICBpX2tleXMgOj0gb2JqZWN0LmtleXMoaV9vY2kuQW5ub3RhdGlvbnMpCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiBpIGtleXMgPSIsIGlfa2V5cykKCiAgICBldmVyeSBpX2tleSBpbiBpX2tleXMgewogICAgICAgIGFsbG93X2Fubm9fa2V5KGlfa2V5LCBwX29jaSkKICAgIH0KCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiB0cnVlIikKfQoKYWxsb3dfYW5ub19rZXkoaV9rZXksIHBfb2NpKSB7CiAgICBwcmludCgiYWxsb3dfYW5ub19rZXkgMTogaSBrZXkgPSIsIGlfa2V5KQoKICAgIHN0YXJ0c3dpdGgoaV9rZXksICJpby5rdWJlcm5ldGVzLmNyaS4iKQoKICAgIHByaW50KCJhbGxvd19hbm5vX2tleSAxOiB0cnVlIikKfQphbGxvd19hbm5vX2tleShpX2tleSwgcF9vY2kpIHsKICAgIHByaW50KCJhbGxvd19hbm5vX2tleSAyOiBpIGtleSA9IiwgaV9rZXkpCgogICAgc29tZSBwX2tleSwgXyBpbiBwX29jaS5Bbm5vdGF0aW9ucwogICAgcF9rZXkgPT0gaV9rZXkKCiAgICBwcmludCgiYWxsb3dfYW5ub19rZXkgMjogdHJ1ZSIpCn0KCiMgR2V0IHRoZSB2YWx1ZSBvZiB0aGUgU19OQU1FX0tFWSBhbm5vdGF0aW9uIGFuZAojIGNvcnJlbGF0ZSBpdCB3aXRoIG90aGVyIGFubm90YXRpb25zIGFuZCBwcm9jZXNzIGZpZWxkcy4KYWxsb3dfYnlfYW5ubyhwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpIHsKICAgIHByaW50KCJhbGxvd19ieV9hbm5vIDE6IHN0YXJ0IikKCiAgICBub3QgcF9vY2kuQW5ub3RhdGlvbnNbU19OQU1FX0tFWV0KCiAgICBpX3NfbmFtZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMTogaV9zX25hbWUgPSIsIGlfc19uYW1lKQoKICAgIGlfc19uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FU1BBQ0VfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMTogaV9zX25hbWVzcGFjZSA9IiwgaV9zX25hbWVzcGFjZSkKCiAgICBhbGxvd19ieV9zYW5kYm94X25hbWUocF9vY2ksIGlfb2NpLCBwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBpX3NfbmFtZSwgaV9zX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfYnlfYW5ubyAxOiB0cnVlIikKfQphbGxvd19ieV9hbm5vKHBfb2NpLCBpX29jaSwgcF9zdG9yYWdlcywgaV9zdG9yYWdlcykgewogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMjogc3RhcnQiKQoKICAgIHBfc19uYW1lIDo9IHBfb2NpLkFubm90YXRpb25zW1NfTkFNRV9LRVldCiAgICBpX3NfbmFtZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMjogaV9zX25hbWUgPSIsIGlfc19uYW1lLCAicF9zX25hbWUgPSIsIHBfc19uYW1lKQoKICAgIGFsbG93X3NhbmRib3hfbmFtZShwX3NfbmFtZSwgaV9zX25hbWUpCgogICAgaV9zX25hbWVzcGFjZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwcmludCgiYWxsb3dfYnlfYW5ubyAyOiBpX3NfbmFtZXNwYWNlID0iLCBpX3NfbmFtZXNwYWNlKQoKICAgIGFsbG93X2J5X3NhbmRib3hfbmFtZShwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMsIGlfc19uYW1lLCBpX3NfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd19ieV9hbm5vIDI6IHRydWUiKQp9CgphbGxvd19ieV9zYW5kYm94X25hbWUocF9vY2ksIGlfb2NpLCBwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfYnlfc2FuZGJveF9uYW1lOiBzdGFydCIpCgogICAgaV9uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FU1BBQ0VfS0VZXQoKICAgIGFsbG93X2J5X2NvbnRhaW5lcl90eXBlcyhwX29jaSwgaV9vY2ksIHNfbmFtZSwgaV9uYW1lc3BhY2UpCiAgICBhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZChwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpCiAgICBhbGxvd19wcm9jZXNzKHBfb2NpLlByb2Nlc3MsIGlfb2NpLlByb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpCgogICAgcHJpbnQoImFsbG93X2J5X3NhbmRib3hfbmFtZTogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfbmFtZShwX3NfbmFtZSwgaV9zX25hbWUpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X25hbWU6IHN0YXJ0IikKICAgIHJlZ2V4Lm1hdGNoKHBfc19uYW1lLCBpX3NfbmFtZSkKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9uYW1lOiB0cnVlIikKfQoKIyBDaGVjayB0aGF0IHRoZSAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLXR5cGUiIGFuZAojICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIiBhbm5vdGF0aW9ucyBkZXNpZ25hdGUgdGhlCiMgZXhwZWN0ZWQgdHlwZSAtIGVpdGhlciBhICJzYW5kYm94IiBvciBhICJjb250YWluZXIiLiBUaGVuLCB2YWxpZGF0ZQojIG90aGVyIGFubm90YXRpb25zIGJhc2VkIG9uIHRoZSBhY3R1YWwgInNhbmRib3giIG9yICJjb250YWluZXIiIHZhbHVlCiMgZnJvbSB0aGUgaW5wdXQgY29udGFpbmVyLgphbGxvd19ieV9jb250YWluZXJfdHlwZXMocF9vY2ksIGlfb2NpLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfYnlfY29udGFpbmVyX3R5cGVzOiBjaGVja2luZyBpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSIpCgogICAgY190eXBlIDo9ICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSIKICAgIAogICAgcF9jcmlfdHlwZSA6PSBwX29jaS5Bbm5vdGF0aW9uc1tjX3R5cGVdCiAgICBpX2NyaV90eXBlIDo9IGlfb2NpLkFubm90YXRpb25zW2NfdHlwZV0KICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZXM6IHBfY3JpX3R5cGUgPSIsIHBfY3JpX3R5cGUsICJpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgcF9jcmlfdHlwZSA9PSBpX2NyaV90eXBlCgogICAgYWxsb3dfYnlfY29udGFpbmVyX3R5cGUoaV9jcmlfdHlwZSwgcF9vY2ksIGlfb2NpLCBzX25hbWUsIHNfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZXM6IHRydWUiKQp9CgphbGxvd19ieV9jb250YWluZXJfdHlwZShpX2NyaV90eXBlLCBwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAxOiBpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgaV9jcmlfdHlwZSA9PSAic2FuZGJveCIKCiAgICBpX2thdGFfdHlwZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1siaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5jb250YWluZXJfdHlwZSJdCiAgICBwcmludCgiYWxsb3dfYnlfY29udGFpbmVyX3R5cGUgMTogaV9rYXRhX3R5cGUgPSIsIGlfa2F0YV90eXBlKQogICAgaV9rYXRhX3R5cGUgPT0gInBvZF9zYW5kYm94IgoKICAgIGFsbG93X3NhbmRib3hfY29udGFpbmVyX25hbWUocF9vY2ksIGlfb2NpKQogICAgYWxsb3dfc2FuZGJveF9uZXRfbmFtZXNwYWNlKHBfb2NpLCBpX29jaSkKICAgIGFsbG93X3NhbmRib3hfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpCgogICAgcHJpbnQoImFsbG93X2J5X2NvbnRhaW5lcl90eXBlIDE6IHRydWUiKQp9CgphbGxvd19ieV9jb250YWluZXJfdHlwZShpX2NyaV90eXBlLCBwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiBpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgaV9jcmlfdHlwZSA9PSAiY29udGFpbmVyIgoKICAgIGlfa2F0YV90eXBlIDo9IGlfb2NpLkFubm90YXRpb25zWyJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIl0KICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiBpX2thdGFfdHlwZSA9IiwgaV9rYXRhX3R5cGUpCiAgICBpX2thdGFfdHlwZSA9PSAicG9kX2NvbnRhaW5lciIKCiAgICBhbGxvd19jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpCiAgICBhbGxvd19uZXRfbmFtZXNwYWNlKHBfb2NpLCBpX29jaSkKICAgIGFsbG93X2xvZ19kaXJlY3RvcnkocF9vY2ksIGlfb2NpKQoKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiB0cnVlIikKfQoKIyAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLW5hbWUiIGFubm90YXRpb24KYWxsb3dfc2FuZGJveF9jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X2NvbnRhaW5lcl9uYW1lOiBzdGFydCIpCgogICAgY29udGFpbmVyX2Fubm90YXRpb25fbWlzc2luZyhwX29jaSwgaV9vY2ksICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItbmFtZSIpCgogICAgcHJpbnQoImFsbG93X3NhbmRib3hfY29udGFpbmVyX25hbWU6IHRydWUiKQp9CgphbGxvd19jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19jb250YWluZXJfbmFtZTogc3RhcnQiKQoKICAgIGFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uKHBfb2NpLCBpX29jaSwgImlvLmt1YmVybmV0ZXMuY3JpLmNvbnRhaW5lci1uYW1lIikKCiAgICBwcmludCgiYWxsb3dfY29udGFpbmVyX25hbWU6IHRydWUiKQp9Cgpjb250YWluZXJfYW5ub3RhdGlvbl9taXNzaW5nKHBfb2NpLCBpX29jaSwga2V5KSB7CiAgICBwcmludCgiY29udGFpbmVyX2Fubm90YXRpb25fbWlzc2luZzoiLCBrZXkpCgogICAgbm90IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIG5vdCBpX29jaS5Bbm5vdGF0aW9uc1trZXldCgogICAgcHJpbnQoImNvbnRhaW5lcl9hbm5vdGF0aW9uX21pc3Npbmc6IHRydWUiKQp9CgphbGxvd19jb250YWluZXJfYW5ub3RhdGlvbihwX29jaSwgaV9vY2ksIGtleSkgewogICAgcHJpbnQoImFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uOiBrZXkgPSIsIGtleSkKCiAgICBwX3ZhbHVlIDo9IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIGlfdmFsdWUgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgcHJpbnQoImFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uOiBwX3ZhbHVlID0iLCBwX3ZhbHVlLCAiaV92YWx1ZSA9IiwgaV92YWx1ZSkKCiAgICBwX3ZhbHVlID09IGlfdmFsdWUKCiAgICBwcmludCgiYWxsb3dfY29udGFpbmVyX2Fubm90YXRpb246IHRydWUiKQp9CgojICJuZXJkY3RsL25ldHdvcmstbmFtZXNwYWNlIiBhbm5vdGF0aW9uCmFsbG93X3NhbmRib3hfbmV0X25hbWVzcGFjZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X25ldF9uYW1lc3BhY2U6IHN0YXJ0IikKCiAgICBrZXkgOj0gIm5lcmRjdGwvbmV0d29yay1uYW1lc3BhY2UiCgogICAgcF9uYW1lc3BhY2UgOj0gcF9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgaV9uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgcHJpbnQoImFsbG93X3NhbmRib3hfbmV0X25hbWVzcGFjZTogcF9uYW1lc3BhY2UgPSIsIHBfbmFtZXNwYWNlLCAiaV9uYW1lc3BhY2UgPSIsIGlfbmFtZXNwYWNlKQoKICAgIHJlZ2V4Lm1hdGNoKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9uZXRfbmFtZXNwYWNlOiB0cnVlIikKfQoKYWxsb3dfbmV0X25hbWVzcGFjZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19uZXRfbmFtZXNwYWNlOiBzdGFydCIpCgogICAga2V5IDo9ICJuZXJkY3RsL25ldHdvcmstbmFtZXNwYWNlIgoKICAgIG5vdCBwX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICBub3QgaV9vY2kuQW5ub3RhdGlvbnNba2V5XQoKICAgIHByaW50KCJhbGxvd19uZXRfbmFtZXNwYWNlOiB0cnVlIikKfQoKIyAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1sb2ctZGlyZWN0b3J5IiBhbm5vdGF0aW9uCmFsbG93X3NhbmRib3hfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X2xvZ19kaXJlY3Rvcnk6IHN0YXJ0IikKCiAgICBrZXkgOj0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbG9nLWRpcmVjdG9yeSIKCiAgICBwX2RpciA6PSBwX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICByZWdleDEgOj0gcmVwbGFjZShwX2RpciwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHJlZ2V4MiA6PSByZXBsYWNlKHJlZ2V4MSwgIiQoc2FuZGJveC1uYW1lc3BhY2UpIiwgc19uYW1lc3BhY2UpCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiByZWdleDIgPSIsIHJlZ2V4MikKCiAgICBpX2RpciA6PSBpX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiBpX2RpciA9IiwgaV9kaXIpCgogICAgcmVnZXgubWF0Y2gocmVnZXgyLCBpX2RpcikKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiB0cnVlIikKfQoKYWxsb3dfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19sb2dfZGlyZWN0b3J5OiBzdGFydCIpCgogICAga2V5IDo9ICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWxvZy1kaXJlY3RvcnkiCgogICAgbm90IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIG5vdCBpX29jaS5Bbm5vdGF0aW9uc1trZXldCgogICAgcHJpbnQoImFsbG93X2xvZ19kaXJlY3Rvcnk6IHRydWUiKQp9CgphbGxvd19kZXZpY2VzKHBfZGV2aWNlcywgaV9kZXZpY2VzKSB7CiAgICBwcmludCgiYWxsb3dfZGV2aWNlczogc3RhcnQiKQogICAgZXZlcnkgaV9kZXZpY2UgaW4gaV9kZXZpY2VzIHsKICAgICAgICBwcmludCgiYWxsb3dfZGV2aWNlczogaV9kZXZpY2UgPSIsIGlfZGV2aWNlKQogICAgICAgIHNvbWUgcF9kZXZpY2UgaW4gcF9kZXZpY2VzCiAgICAgICAgcF9kZXZpY2UuY29udGFpbmVyX3BhdGggPT0gaV9kZXZpY2UuY29udGFpbmVyX3BhdGgKICAgIH0KICAgIHByaW50KCJhbGxvd19kZXZpY2VzOiB0cnVlIikKfQoKYWxsb3dfbGludXgoc3RhdGVfb3BzLCBwX29jaSwgaV9vY2kpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIHBfbmFtZXNwYWNlcyA6PSBwX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbGludXg6IHAgbmFtZXNwYWNlcyA9IiwgcF9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlcyA6PSBpX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbGludXg6IGkgbmFtZXNwYWNlcyA9IiwgaV9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlX3dpdGhvdXRfbmV0d29yayA6PSBbb2JqIHwgb2JqIDo9IGlfbmFtZXNwYWNlc1tfXTsgb2JqLlR5cGUgIT0gIm5ldHdvcmsiXQoKICAgIHByaW50KCJhbGxvd19saW51eDogaV9uYW1lc3BhY2Vfd2l0aG91dF9uZXR3b3JrID0iLCBpX25hbWVzcGFjZV93aXRob3V0X25ldHdvcmspCgogICAgcF9uYW1lc3BhY2VzID09IGlfbmFtZXNwYWNlX3dpdGhvdXRfbmV0d29yawoKICAgIGFsbG93X21hc2tlZF9wYXRocyhwX29jaSwgaV9vY2kpCiAgICBhbGxvd19yZWFkb25seV9wYXRocyhwX29jaSwgaV9vY2kpCiAgICBhbGxvd19saW51eF9kZXZpY2VzKHBfb2NpLkxpbnV4LkRldmljZXMsIGlfb2NpLkxpbnV4LkRldmljZXMpCiAgICBhbGxvd19saW51eF9zeXNjdGwocF9vY2kuTGludXgsIGlfb2NpLkxpbnV4KQogICAgcmV0IDo9IGFsbG93X25ldHdvcmtfbmFtZXNwYWNlX3N0YXJ0KHN0YXRlX29wcywgcF9vY2ksIGlfb2NpKQogICAgcmV0LmFsbG93ZWQKCiAgICBvcHMgOj0gcmV0Lm9wcwoKICAgIHByaW50KCJhbGxvd19saW51eDogdHJ1ZSIpCn0KCiMgUmV0cmlldmUgdGhlICJuZXR3b3JrIiBuYW1lc3BhY2UgZnJvbSB0aGUgaW5wdXQgZGF0YSBhbmQgcGFzcyBpdCBvbiBmb3IgdGhlCiMgbmV0d29yayBuYW1lc3BhY2UgcG9saWN5IGNoZWNrcy4KYWxsb3dfbmV0d29ya19uYW1lc3BhY2Vfc3RhcnQoc3RhdGVfb3BzLCBwX29jaSwgaV9vY2kpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIHByaW50KCJhbGxvd19uZXR3b3JrX25hbWVzcGFjZSBzdGFydDogc3RhcnQiKQoKICAgIHBfbmFtZXNwYWNlcyA6PSBwX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IHAgbmFtZXNwYWNlcyA9IiwgcF9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlcyA6PSBpX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IGkgbmFtZXNwYWNlcyA9IiwgaV9uYW1lc3BhY2VzKQoKICAgICMgUmV0dXJuIHBhdGggb2YgdGhlICJuZXR3b3JrIiBuYW1lc3BhY2UKICAgIG5ldHdvcmtfbnMgOj0gW29iaiB8IG9iaiA6PSBpX25hbWVzcGFjZXNbX107IG9iai5UeXBlID09ICJuZXR3b3JrIl0KCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IG5ldHdvcmtfbnMgPSIsIG5ldHdvcmtfbnMpCgogICAgcmV0IDo9IGFsbG93X25ldHdvcmtfbmFtZXNwYWNlKHN0YXRlX29wcywgbmV0d29ya19ucykKICAgIHJldC5hbGxvd2VkCgogICAgb3BzIDo9IHJldC5vcHMKfQoKIyBUaGlzIHJ1bGUgaXMgd2hlbiB0aGVyZSdzIG5vIG5ldHdvcmsgbmFtZXNwYWNlIGluIHRoZSBpbnB1dCBkYXRhLgphbGxvd19uZXR3b3JrX25hbWVzcGFjZShzdGF0ZV9vcHMsIG5ldHdvcmtfbnMpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIGNvdW50KG5ldHdvcmtfbnMpID09IDAKCiAgICBuZXR3b3JrX25zX3BhdGggPSAiIgoKICAgIGFkZF9uZXR3b3JrX25hbWVzcGFjZV90b19zdGF0ZSA6PSBzdGF0ZV9hbGxvd3MoIm5ldHdvcmtfbmFtZXNwYWNlIiwgbmV0d29ya19uc19wYXRoKQogICAgb3BzIDo9IGNvbmNhdF9vcF9pZl9ub3RfbnVsbChzdGF0ZV9vcHMsIGFkZF9uZXR3b3JrX25hbWVzcGFjZV90b19zdGF0ZSkKCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2UgMTogdHJ1ZSIpCn0KCiMgVGhpcyBydWxlIGlzIHdoZW4gdGhlcmUncyBleGFjdGx5IG9uZSBuZXR3b3JrIG5hbWVzcGFjZSBpbiB0aGUgaW5wdXQgZGF0YS4KYWxsb3dfbmV0d29ya19uYW1lc3BhY2Uoc3RhdGVfb3BzLCBuZXR3b3JrX25zKSA6PSB7Im9wcyI6IG9wcywgImFsbG93ZWQiOiB0cnVlfSB7CiAgICBjb3VudChuZXR3b3JrX25zKSA9PSAxCgogICAgYWRkX25ldHdvcmtfbmFtZXNwYWNlX3RvX3N0YXRlIDo9IHN0YXRlX2FsbG93cygibmV0d29ya19uYW1lc3BhY2UiLCBuZXR3b3JrX25zWzBdLlBhdGgpCiAgICBvcHMgOj0gY29uY2F0X29wX2lmX25vdF9udWxsKHN0YXRlX29wcywgYWRkX25ldHdvcmtfbmFtZXNwYWNlX3RvX3N0YXRlKQoKICAgIHByaW50KCJhbGxvd19uZXR3b3JrX25hbWVzcGFjZSAyOiB0cnVlIikKfQoKYWxsb3dfbWFza2VkX3BhdGhzKHBfb2NpLCBpX29jaSkgewogICAgcF9wYXRocyA6PSBwX29jaS5MaW51eC5NYXNrZWRQYXRocwogICAgcHJpbnQoImFsbG93X21hc2tlZF9wYXRocyAxOiBwX3BhdGhzID0iLCBwX3BhdGhzKQoKICAgIGlfcGF0aHMgOj0gaV9vY2kuTGludXguTWFza2VkUGF0aHMKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aHMgMTogaV9wYXRocyA9IiwgaV9wYXRocykKCiAgICBhbGxvd19tYXNrZWRfcGF0aHNfYXJyYXkocF9wYXRocywgaV9wYXRocykKCiAgICBwcmludCgiYWxsb3dfbWFza2VkX3BhdGhzIDE6IHRydWUiKQp9CmFsbG93X21hc2tlZF9wYXRocyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aHMgMjogc3RhcnQiKQoKICAgIG5vdCBwX29jaS5MaW51eC5NYXNrZWRQYXRocwogICAgbm90IGlfb2NpLkxpbnV4Lk1hc2tlZFBhdGhzCgogICAgcHJpbnQoImFsbG93X21hc2tlZF9wYXRocyAyOiB0cnVlIikKfQoKIyBBbGwgdGhlIHBvbGljeSBtYXNrZWQgcGF0aHMgbXVzdCBiZSBtYXNrZWQgaW4gdGhlIGlucHV0IGRhdGEgdG9vLgojIElucHV0IGlzIGFsbG93ZWQgdG8gaGF2ZSBtb3JlIG1hc2tlZCBwYXRocyB0aGFuIHRoZSBwb2xpY3kuCmFsbG93X21hc2tlZF9wYXRoc19hcnJheShwX2FycmF5LCBpX2FycmF5KSB7CiAgICBldmVyeSBwX2VsZW0gaW4gcF9hcnJheSB7CiAgICAgICAgYWxsb3dfbWFza2VkX3BhdGgocF9lbGVtLCBpX2FycmF5KQogICAgfQp9CgphbGxvd19tYXNrZWRfcGF0aChwX2VsZW0sIGlfYXJyYXkpIHsKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aDogcF9lbGVtID0iLCBwX2VsZW0pCgogICAgc29tZSBpX2VsZW0gaW4gaV9hcnJheQogICAgcF9lbGVtID09IGlfZWxlbQoKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aDogdHJ1ZSIpCn0KCmFsbG93X3JlYWRvbmx5X3BhdGhzKHBfb2NpLCBpX29jaSkgewogICAgcF9wYXRocyA6PSBwX29jaS5MaW51eC5SZWFkb25seVBhdGhzCiAgICBwcmludCgiYWxsb3dfcmVhZG9ubHlfcGF0aHMgMTogcF9wYXRocyA9IiwgcF9wYXRocykKCiAgICBpX3BhdGhzIDo9IGlfb2NpLkxpbnV4LlJlYWRvbmx5UGF0aHMKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAxOiBpX3BhdGhzID0iLCBpX3BhdGhzKQoKICAgIGFsbG93X3JlYWRvbmx5X3BhdGhzX2FycmF5KHBfcGF0aHMsIGlfcGF0aHMsIGlfb2NpLkxpbnV4Lk1hc2tlZFBhdGhzKQoKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAxOiB0cnVlIikKfQphbGxvd19yZWFkb25seV9wYXRocyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAyOiBzdGFydCIpCgogICAgbm90IHBfb2NpLkxpbnV4LlJlYWRvbmx5UGF0aHMKICAgIG5vdCBpX29jaS5MaW51eC5SZWFkb25seVBhdGhzCgogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGhzIDI6IHRydWUiKQp9CgojIEFsbCB0aGUgcG9saWN5IHJlYWRvbmx5IHBhdGhzIG11c3QgYmUgZWl0aGVyOgojIC0gUHJlc2VudCBpbiB0aGUgaW5wdXQgcmVhZG9ubHkgcGF0aHMsIG9yCiMgLSBQcmVzZW50IGluIHRoZSBpbnB1dCBtYXNrZWQgcGF0aHMuCiMgSW5wdXQgaXMgYWxsb3dlZCB0byBoYXZlIG1vcmUgcmVhZG9ubHkgcGF0aHMgdGhhbiB0aGUgcG9saWN5LgphbGxvd19yZWFkb25seV9wYXRoc19hcnJheShwX2FycmF5LCBpX2FycmF5LCBtYXNrZWRfcGF0aHMpIHsKICAgIGV2ZXJ5IHBfZWxlbSBpbiBwX2FycmF5IHsKICAgICAgICBhbGxvd19yZWFkb25seV9wYXRoKHBfZWxlbSwgaV9hcnJheSwgbWFza2VkX3BhdGhzKQogICAgfQp9CgphbGxvd19yZWFkb25seV9wYXRoKHBfZWxlbSwgaV9hcnJheSwgbWFza2VkX3BhdGhzKSB7CiAgICBwcmludCgiYWxsb3dfcmVhZG9ubHlfcGF0aCAxOiBwX2VsZW0gPSIsIHBfZWxlbSkKCiAgICBzb21lIGlfZWxlbSBpbiBpX2FycmF5CiAgICBwX2VsZW0gPT0gaV9lbGVtCgogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGggMTogdHJ1ZSIpCn0KYWxsb3dfcmVhZG9ubHlfcGF0aChwX2VsZW0sIGlfYXJyYXksIG1hc2tlZF9wYXRocykgewogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGggMjogcF9lbGVtID0iLCBwX2VsZW0pCgogICAgc29tZSBpX21hc2tlZCBpbiBtYXNrZWRfcGF0aHMKICAgIHBfZWxlbSA9PSBpX21hc2tlZAoKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRoIDI6IHRydWUiKQp9CgphbGxvd19saW51eF9kZXZpY2VzKHBfZGV2aWNlcywgaV9kZXZpY2VzKSB7CiAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogc3RhcnQiKQogICAgZXZlcnkgaV9kZXZpY2UgaW4gaV9kZXZpY2VzIHsKICAgICAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogaV9kZXZpY2UgPSIsIGlfZGV2aWNlKQogICAgICAgIHNvbWUgcF9kZXZpY2UgaW4gcF9kZXZpY2VzCiAgICAgICAgaV9kZXZpY2UuUGF0aCA9PSBwX2RldmljZS5QYXRoCiAgICB9CiAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogdHJ1ZSIpCn0KCmFsbG93X2xpbnV4X3N5c2N0bChwX2xpbnV4LCBpX2xpbnV4KSB7CiAgICBwcmludCgiYWxsb3dfbGludXhfc3lzY3RsIDE6IHN0YXJ0IikKICAgIG5vdCBpX2xpbnV4LlN5c2N0bAogICAgcHJpbnQoImFsbG93X2xpbnV4X3N5c2N0bCAxOiB0cnVlIikKfQoKYWxsb3dfbGludXhfc3lzY3RsKHBfbGludXgsIGlfbGludXgpIHsKICAgIHByaW50KCJhbGxvd19saW51eF9zeXNjdGwgMjogc3RhcnQiKQogICAgcF9zeXNjdGwgOj0gcF9saW51eC5TeXNjdGwKICAgIGlfc3lzY3RsIDo9IGlfbGludXguU3lzY3RsCiAgICBldmVyeSBpX25hbWUsIGlfdmFsIGluIGlfc3lzY3RsIHsKICAgICAgICBwcmludCgiYWxsb3dfbGludXhfc3lzY3RsIDI6IGlfbmFtZSA9IiwgaV9uYW1lLCAiaV92YWwgPSIsIGlfdmFsKQogICAgICAgIHBfc3lzY3RsW2lfbmFtZV0gPT0gaV92YWwKICAgIH0KICAgIHByaW50KCJhbGxvd19saW51eF9zeXNjdGwgMjogdHJ1ZSIpCn0KCiMgQ2hlY2sgdGhlIGNvbnNpc3RlbmN5IG9mIHRoZSBpbnB1dCAiaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5idW5kbGVfcGF0aCIKIyBhbmQgaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCIgdmFsdWVzIHdpdGggb3RoZXIgZmllbGRzLgphbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZChwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpIHsKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogc3RhcnQiKQoKICAgIGJ1bmRsZV9wYXRoIDo9IGlfb2NpLkFubm90YXRpb25zWyJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmJ1bmRsZV9wYXRoIl0KICAgIGJ1bmRsZV9pZCA6PSByZXBsYWNlKGJ1bmRsZV9wYXRoLCAiL3J1bi9jb250YWluZXJkL2lvLmNvbnRhaW5lcmQucnVudGltZS52Mi50YXNrL2s4cy5pby8iLCAiIikKCiAgICBidW5kbGVfaWRfZm9ybWF0IDo9IGNvbmNhdCgiIiwgWyJeIiwgQlVORExFX0lELCAiJCJdKQogICAgcmVnZXgubWF0Y2goYnVuZGxlX2lkX2Zvcm1hdCwgYnVuZGxlX2lkKQoKICAgIGtleSA6PSAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCIKCiAgICBwX3JlZ2V4IDo9IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIHNhbmRib3hfaWQgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQoKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogc2FuZGJveF9pZCA9Iiwgc2FuZGJveF9pZCwgInJlZ2V4ID0iLCBwX3JlZ2V4KQogICAgcmVnZXgubWF0Y2gocF9yZWdleCwgc2FuZGJveF9pZCkKCiAgICBhbGxvd19yb290X3BhdGgocF9vY2ksIGlfb2NpLCBidW5kbGVfaWQpCgogICAgZXZlcnkgaV9tb3VudCBpbiBpX29jaS5Nb3VudHMgewogICAgICAgIGFsbG93X21vdW50KHBfb2NpLCBpX21vdW50LCBpX3N0b3JhZ2VzLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpCiAgICB9CgogICAgYWxsb3dfc3RvcmFnZXMocF9zdG9yYWdlcywgaV9zdG9yYWdlcywgYnVuZGxlX2lkLCBzYW5kYm94X2lkKQoKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogdHJ1ZSIpCn0KCmFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHBfcHJvY2VzcyA9IiwgcF9wcm9jZXNzKQogICAgcHJpbnQoImFsbG93X3Byb2Nlc3NfY29tbW9uOiBpX3Byb2Nlc3MgPSAiLCBpX3Byb2Nlc3MpCiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHNfbmFtZSA9Iiwgc19uYW1lKQoKICAgIHBfcHJvY2Vzcy5Dd2QgPT0gaV9wcm9jZXNzLkN3ZAogICAgcF9wcm9jZXNzLk5vTmV3UHJpdmlsZWdlcyA9PSBpX3Byb2Nlc3MuTm9OZXdQcml2aWxlZ2VzCgogICAgYWxsb3dfdXNlcihwX3Byb2Nlc3MsIGlfcHJvY2VzcykKICAgIGFsbG93X2VudihwX3Byb2Nlc3MsIGlfcHJvY2Vzcywgc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHRydWUiKQp9CgojIENvbXBhcmUgdGhlIE9DSSBQcm9jZXNzIGZpZWxkIG9mIGEgcG9saWN5IGNvbnRhaW5lciB3aXRoIHRoZSBpbnB1dCBPQ0kgUHJvY2VzcyBmcm9tIGEgQ3JlYXRlQ29udGFpbmVyUmVxdWVzdAphbGxvd19wcm9jZXNzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfcHJvY2Vzczogc3RhcnQiKQoKICAgIGFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgYWxsb3dfY2FwcyhwX3Byb2Nlc3MuQ2FwYWJpbGl0aWVzLCBpX3Byb2Nlc3MuQ2FwYWJpbGl0aWVzKQogICAgcF9wcm9jZXNzLlRlcm1pbmFsID09IGlfcHJvY2Vzcy5UZXJtaW5hbAoKICAgIHByaW50KCJhbGxvd19wcm9jZXNzOiB0cnVlIikKfQoKIyBDb21wYXJlIHRoZSBPQ0kgUHJvY2VzcyBmaWVsZCBvZiBhIHBvbGljeSBjb250YWluZXIgd2l0aCB0aGUgaW5wdXQgcHJvY2VzcyBmaWVsZCBmcm9tIEV4ZWNQcm9jZXNzUmVxdWVzdAphbGxvd19pbnRlcmFjdGl2ZV9wcm9jZXNzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfaW50ZXJhY3RpdmVfcHJvY2Vzczogc3RhcnQiKQoKICAgIGFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgYWxsb3dfZXhlY19jYXBzKGlfcHJvY2Vzcy5DYXBhYmlsaXRpZXMpCgogICAgIyBUaGVzZSBhcmUgY29tbWFuZHMgZW5hYmxlZCB1c2luZyBFeGVjUHJvY2Vzc1JlcXVlc3QgY29tbWFuZHMgYW5kL29yIHJlZ2V4IGZyb20gdGhlIHNldHRpbmdzIGZpbGUuCiAgICAjIFRoZXkgY2FuIGJlIGV4ZWN1dGVkIGludGVyYWN0aXZlbHkgc28gYWxsb3cgdGhlbSB0byB1c2UgYW55IHZhbHVlIGZvciBpX3Byb2Nlc3MuVGVybWluYWwuCgogICAgcHJpbnQoImFsbG93X2ludGVyYWN0aXZlX3Byb2Nlc3M6IHRydWUiKQp9CgojIENvbXBhcmUgdGhlIE9DSSBQcm9jZXNzIGZpZWxkIG9mIGEgcG9saWN5IGNvbnRhaW5lciB3aXRoIHRoZSBpbnB1dCBwcm9jZXNzIGZpZWxkIGZyb20gRXhlY1Byb2Nlc3NSZXF1ZXN0CmFsbG93X3Byb2JlX3Byb2Nlc3MocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19wcm9iZV9wcm9jZXNzOiBzdGFydCIpCgogICAgYWxsb3dfcHJvY2Vzc19jb21tb24ocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpCiAgICBhbGxvd19leGVjX2NhcHMoaV9wcm9jZXNzLkNhcGFiaWxpdGllcykKICAgIHBfcHJvY2Vzcy5UZXJtaW5hbCA9PSBpX3Byb2Nlc3MuVGVybWluYWwKCiAgICBwcmludCgiYWxsb3dfcHJvYmVfcHJvY2VzczogdHJ1ZSIpCn0KCmFsbG93X3VzZXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MpIHsKICAgIHBfdXNlciA6PSBwX3Byb2Nlc3MuVXNlcgogICAgaV91c2VyIDo9IGlfcHJvY2Vzcy5Vc2VyCgogICAgcHJpbnQoImFsbG93X3VzZXI6IGlucHV0IHVpZCA9IiwgaV91c2VyLlVJRCwgInBvbGljeSB1aWQgPSIsIHBfdXNlci5VSUQpCiAgICBwX3VzZXIuVUlEID09IGlfdXNlci5VSUQKCiAgICAjIFRPRE86IHRyYWNrIGRvd24gdGhlIHJlYXNvbiBmb3IgcmVnaXN0cnkuazhzLmlvL3BhdXNlOjMuOSBiZWluZwogICAgIyAgICAgICBleGVjdXRlZCB3aXRoIGdpZCA9IDAgZGVzcGl0ZSBoYXZpbmcgIjY1NTM1OjY1NTM1IiBpbiBpdHMgY29udGFpbmVyIGltYWdlCiAgICAjICAgICAgIGNvbmZpZy4KICAgICNwcmludCgiYWxsb3dfdXNlcjogaW5wdXQgZ2lkID0iLCBpX3VzZXIuR0lELCAicG9saWN5IGdpZCA9IiwgcF91c2VyLkdJRCkKICAgICNwX3VzZXIuR0lEID09IGlfdXNlci5HSUQKCiAgICAjIFRPRE86IGNvbXBhcmUgdGhlIGFkZGl0aW9uYWxHaWRzIGZpZWxkIHRvbyBhZnRlciBjb21wdXRpbmcgaXRzIHZhbHVlCiAgICAjIGJhc2VkIG9uIC9ldGMvcGFzc3dkIGFuZCAvZXRjL2dyb3VwIGZyb20gdGhlIGNvbnRhaW5lciBpbWFnZS4KfQoKYWxsb3dfZGVwcmVjYXRlZF9hcmdzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZ3MgMTogbm8gYXJncyIpCgogICAgbm90IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJncwogICAgbm90IGlfcHJvY2Vzcy5BcmdzCgogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAxOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZ3MocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSkgewogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiBwb2xpY3kgYXJncyA9IiwgcF9wcm9jZXNzLkRlcHJlY2F0ZWRBcmdzKQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiBpbnB1dCBhcmdzID0iLCBpX3Byb2Nlc3MuQXJncykKCiAgICBjb3VudChwX3Byb2Nlc3MuRGVwcmVjYXRlZEFyZ3MpID09IGNvdW50KGlfcHJvY2Vzcy5BcmdzKQoKICAgIGV2ZXJ5IGksIGlfYXJnIGluIGlfcHJvY2Vzcy5BcmdzIHsKICAgICAgICBhbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpCiAgICB9CgogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDE6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgcF9hcmcyIDo9IHJlcGxhY2UocF9hcmcsICIkJCIsICIkIikKICAgIHBfYXJnMiA9PSBpX2FyZwoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAxOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDI6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgIyBUT0RPOiBjYW4gJChub2RlLW5hbWUpIGJlIGhhbmRsZWQgYmV0dGVyPwogICAgY29udGFpbnMocF9hcmcsICIkKG5vZGUtbmFtZSkiKQoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAyOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDM6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgcF9hcmcyIDo9IHJlcGxhY2UocF9hcmcsICIkJCIsICIkIikKICAgIHBfYXJnMyA6PSByZXBsYWNlKHBfYXJnMiwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAzOiBwX2FyZzMgPSIsIHBfYXJnMykKICAgIHBfYXJnMyA9PSBpX2FyZwoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAzOiB0cnVlIikKfQoKIyBPQ0kgcHJvY2Vzcy5FbnYgZmllbGQKYWxsb3dfZW52KHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfZW52OiBwIGVudiA9IiwgcF9wcm9jZXNzLkVudikKICAgIHByaW50KCJhbGxvd19lbnY6IGkgZW52ID0iLCBpX3Byb2Nlc3MuRW52KQoKICAgIGV2ZXJ5IGlfdmFyIGluIGlfcHJvY2Vzcy5FbnYgewogICAgICAgIHByaW50KCJhbGxvd19lbnY6IGlfdmFyID0iLCBpX3ZhcikKICAgICAgICBhbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgfQoKICAgIHByaW50KCJhbGxvd19lbnY6IHRydWUiKQp9CgojIEFsbG93IGlucHV0IGVudiB2YXJpYWJsZXMgdGhhdCBhcmUgcHJlc2VudCBpbiB0aGUgcG9saWN5IGRhdGEgdG9vLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHBfdmFyID09IGlfdmFyCiAgICBwcmludCgiYWxsb3dfdmFyIDE6IHRydWUiKQp9CgojIE1hdGNoIGlucHV0IHdpdGggb25lIG9mIHRoZSBwb2xpY3kgdmFyaWFibGVzLCBhZnRlciBzdWJzdGl0dXRpbmcgJChzYW5kYm94LW5hbWUpLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHByaW50KCJhbGxvd192YXIgMjogcF92YXIgPSIsIHBfdmFyKQoKICAgIHBfdmFyX3NwbGl0IDo9IHNwbGl0KHBfdmFyLCAiPSIpCiAgICBjb3VudChwX3Zhcl9zcGxpdCkgPT0gMgoKICAgIHBfdmFyX3NwbGl0WzFdID09ICIkKHNhbmRib3gtbmFtZSkiCgogICAgaV92YXJfc3BsaXQgOj0gc3BsaXQoaV92YXIsICI9IikKICAgIGNvdW50KGlfdmFyX3NwbGl0KSA9PSAyCgogICAgaV92YXJfc3BsaXRbMF0gPT0gcF92YXJfc3BsaXRbMF0KICAgIHJlZ2V4Lm1hdGNoKHNfbmFtZSwgaV92YXJfc3BsaXRbMV0pCgogICAgcHJpbnQoImFsbG93X3ZhciAyOiB0cnVlIikKfQoKIyBBbGxvdyBpbnB1dCBlbnYgdmFyaWFibGVzIHRoYXQgbWF0Y2ggd2l0aCBhIHJlcXVlc3RfZGVmYXVsdHMgcmVnZXguCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHNvbWUgcF9yZWdleDEgaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5DcmVhdGVDb250YWluZXJSZXF1ZXN0LmFsbG93X2Vudl9yZWdleAogICAgcF9yZWdleDIgOj0gcmVwbGFjZShwX3JlZ2V4MSwgIiQoaXB2NF9hKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcHY0X2EpCiAgICBwX3JlZ2V4MyA6PSByZXBsYWNlKHBfcmVnZXgyLCAiJChpcF9wKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcF9wKQogICAgcF9yZWdleDQgOj0gcmVwbGFjZShwX3JlZ2V4MywgIiQoc3ZjX25hbWUpIiwgcG9saWN5X2RhdGEuY29tbW9uLnN2Y19uYW1lKQogICAgcF9yZWdleDUgOj0gcmVwbGFjZShwX3JlZ2V4NCwgIiQoZG5zX2xhYmVsKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5kbnNfbGFiZWwpCgogICAgcHJpbnQoImFsbG93X3ZhciAzOiBwX3JlZ2V4NSA9IiwgcF9yZWdleDUpCiAgICByZWdleC5tYXRjaChwX3JlZ2V4NSwgaV92YXIpCgogICAgcHJpbnQoImFsbG93X3ZhciAzOiB0cnVlIikKfQoKIyBBbGxvdyBmaWVsZFJlZiAiZmllbGRQYXRoOiBzdGF0dXMucG9kSVAiIHZhbHVlcy4KYWxsb3dfdmFyKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBpX3Zhciwgc19uYW1lLCBzX25hbWVzcGFjZSkgewogICAgbmFtZV92YWx1ZSA6PSBzcGxpdChpX3ZhciwgIj0iKQogICAgY291bnQobmFtZV92YWx1ZSkgPT0gMgogICAgaXNfaXAobmFtZV92YWx1ZVsxXSkKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIGFsbG93X3BvZF9pcF92YXIobmFtZV92YWx1ZVswXSwgcF92YXIpCgogICAgcHJpbnQoImFsbG93X3ZhciA0OiB0cnVlIikKfQoKIyBBbGxvdyBjb21tb24gZmllbGRSZWYgdmFyaWFibGVzLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBuYW1lX3ZhbHVlIDo9IHNwbGl0KGlfdmFyLCAiPSIpCiAgICBjb3VudChuYW1lX3ZhbHVlKSA9PSAyCgogICAgc29tZSBwX3ZhciBpbiBwX3Byb2Nlc3MuRW52CiAgICBwX25hbWVfdmFsdWUgOj0gc3BsaXQocF92YXIsICI9IikKICAgIGNvdW50KHBfbmFtZV92YWx1ZSkgPT0gMgoKICAgIHBfbmFtZV92YWx1ZVswXSA9PSBuYW1lX3ZhbHVlWzBdCgogICAgIyBUT0RPOiBzaG91bGQgdGhlc2UgYmUgaGFuZGxlZCBpbiBhIGRpZmZlcmVudCB3YXk/CiAgICBhbHdheXNfYWxsb3dlZCA6PSBbIiQoaG9zdC1uYW1lKSIsICIkKG5vZGUtbmFtZSkiLCAiJChwb2QtdWlkKSJdCiAgICBzb21lIGFsbG93ZWQgaW4gYWx3YXlzX2FsbG93ZWQKICAgIGNvbnRhaW5zKHBfbmFtZV92YWx1ZVsxXSwgYWxsb3dlZCkKCiAgICBwcmludCgiYWxsb3dfdmFyIDU6IHRydWUiKQp9CgojIEFsbG93IGZpZWxkUmVmICJmaWVsZFBhdGg6IHN0YXR1cy5ob3N0SVAiIHZhbHVlcy4KYWxsb3dfdmFyKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBpX3Zhciwgc19uYW1lLCBzX25hbWVzcGFjZSkgewogICAgbmFtZV92YWx1ZSA6PSBzcGxpdChpX3ZhciwgIj0iKQogICAgY291bnQobmFtZV92YWx1ZSkgPT0gMgogICAgaXNfaXAobmFtZV92YWx1ZVsxXSkKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIGFsbG93X2hvc3RfaXBfdmFyKG5hbWVfdmFsdWVbMF0sIHBfdmFyKQoKICAgIHByaW50KCJhbGxvd192YXIgNjogdHJ1ZSIpCn0KCiMgQWxsb3cgcmVzb3VyY2VGaWVsZFJlZiB2YWx1ZXMgKGUuZy4sICJsaW1pdHMuY3B1IikuCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIG5hbWVfdmFsdWUgOj0gc3BsaXQoaV92YXIsICI9IikKICAgIGNvdW50KG5hbWVfdmFsdWUpID09IDIKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHBfbmFtZV92YWx1ZSA6PSBzcGxpdChwX3ZhciwgIj0iKQogICAgY291bnQocF9uYW1lX3ZhbHVlKSA9PSAyCgogICAgcF9uYW1lX3ZhbHVlWzBdID09IG5hbWVfdmFsdWVbMF0KCiAgICAjIGEgdmFyaWFibGUgd2Ugc2hvdWxkIGJlIHZhbGlkYXRpbmcgdXNpbmcgYSByZWdleCBmcm9tIHNldHRpbmdzCiAgICBwX25hbWVfdmFsdWVbMV0gPT0gIiQodmFsaWRhdGUtZnJvbS1zZXR0aW5ncykiCgogICAgcmVnZXhfdmFsIDo9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuQ3JlYXRlQ29udGFpbmVyUmVxdWVzdC5hbGxvd19lbnZfcmVnZXhfbWFwW25hbWVfdmFsdWVbMF1dCgogICAgcHJpbnQoImFsbG93X3ZhciA3OiB2YWwgPSIsIG5hbWVfdmFsdWVbMV0pCiAgICBwcmludCgiYWxsb3dfdmFyIDc6IHJlZ2V4X3ZhbCA9IiwgcmVnZXhfdmFsKQoKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4X3ZhbCwgbmFtZV92YWx1ZVsxXSkKCiAgICBwcmludCgiYWxsb3dfdmFyIDc6IHRydWUiKQp9CgojIE1hdGNoIGlucHV0IHdpdGggb25lIG9mIHRoZSBwb2xpY3kgdmFyaWFibGVzLCBhZnRlciBzdWJzdGl0dXRpbmcgJChzYW5kYm94LW5hbWVzcGFjZSkuCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHNvbWUgcF92YXIgaW4gcF9wcm9jZXNzLkVudgogICAgcF92YXIyIDo9IHJlcGxhY2UocF92YXIsICIkKHNhbmRib3gtbmFtZXNwYWNlKSIsIHNfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd192YXIgODogcF92YXIyID0iLCBwX3ZhcjIpCiAgICBwX3ZhcjIgPT0gaV92YXIKCiAgICBwcmludCgiYWxsb3dfdmFyIDg6IHRydWUiKQp9CgphbGxvd19wb2RfaXBfdmFyKHZhcl9uYW1lLCBwX3ZhcikgewogICAgcHJpbnQoImFsbG93X3BvZF9pcF92YXI6IHZhcl9uYW1lID0iLCB2YXJfbmFtZSwgInBfdmFyID0iLCBwX3ZhcikKCiAgICBwX25hbWVfdmFsdWUgOj0gc3BsaXQocF92YXIsICI9IikKICAgIGNvdW50KHBfbmFtZV92YWx1ZSkgPT0gMgoKICAgIHBfbmFtZV92YWx1ZVswXSA9PSB2YXJfbmFtZQogICAgcF9uYW1lX3ZhbHVlWzFdID09ICIkKHBvZC1pcCkiCgogICAgcHJpbnQoImFsbG93X3BvZF9pcF92YXI6IHRydWUiKQp9CgphbGxvd19ob3N0X2lwX3Zhcih2YXJfbmFtZSwgcF92YXIpIHsKICAgIHByaW50KCJhbGxvd19ob3N0X2lwX3ZhcjogdmFyX25hbWUgPSIsIHZhcl9uYW1lLCAicF92YXIgPSIsIHBfdmFyKQoKICAgIHBfbmFtZV92YWx1ZSA6PSBzcGxpdChwX3ZhciwgIj0iKQogICAgY291bnQocF9uYW1lX3ZhbHVlKSA9PSAyCgogICAgcF9uYW1lX3ZhbHVlWzBdID09IHZhcl9uYW1lCiAgICBwX25hbWVfdmFsdWVbMV0gPT0gIiQoaG9zdC1pcCkiCgogICAgcHJpbnQoImFsbG93X2hvc3RfaXBfdmFyOiB0cnVlIikKfQoKaXNfaXAodmFsdWUpIHsKICAgIGJ5dGVzID0gc3BsaXQodmFsdWUsICIuIikKICAgIGNvdW50KGJ5dGVzKSA9PSA0CgogICAgaXNfaXBfZmlyc3RfYnl0ZShieXRlc1swXSkKICAgIGlzX2lwX290aGVyX2J5dGUoYnl0ZXNbMV0pCiAgICBpc19pcF9vdGhlcl9ieXRlKGJ5dGVzWzJdKQogICAgaXNfaXBfb3RoZXJfYnl0ZShieXRlc1szXSkKfQppc19pcF9maXJzdF9ieXRlKGNvbXBvbmVudCkgewogICAgbnVtYmVyID0gdG9fbnVtYmVyKGNvbXBvbmVudCkKICAgIG51bWJlciA+PSAxCiAgICBudW1iZXIgPD0gMjU1Cn0KaXNfaXBfb3RoZXJfYnl0ZShjb21wb25lbnQpIHsKICAgIG51bWJlciA9IHRvX251bWJlcihjb21wb25lbnQpCiAgICBudW1iZXIgPj0gMAogICAgbnVtYmVyIDw9IDI1NQp9CgojIE9DSSByb290LlBhdGgKYWxsb3dfcm9vdF9wYXRoKHBfb2NpLCBpX29jaSwgYnVuZGxlX2lkKSB7CiAgICBpX3BhdGggOj0gaV9vY2kuUm9vdC5QYXRoCiAgICBwX3BhdGgxIDo9IHBfb2NpLlJvb3QuUGF0aAogICAgcHJpbnQoImFsbG93X3Jvb3RfcGF0aDogaV9wYXRoID0iLCBpX3BhdGgsICJwX3BhdGgxID0iLCBwX3BhdGgxKQoKICAgIHBfcGF0aDIgOj0gcmVwbGFjZShwX3BhdGgxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfcm9vdF9wYXRoOiBwX3BhdGgyID0iLCBwX3BhdGgyKQoKICAgIHBfcGF0aDMgOj0gcmVwbGFjZShwX3BhdGgyLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X3Jvb3RfcGF0aDogcF9wYXRoMyA9IiwgcF9wYXRoMykKCiAgICBwX3BhdGgzID09IGlfcGF0aAoKICAgIHByaW50KCJhbGxvd19yb290X3BhdGg6IHRydWUiKQp9CgojIGRldmljZSBtb3VudHMKYWxsb3dfbW91bnQocF9vY2ksIGlfbW91bnQsIGlfc3RvcmFnZXMsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcHJpbnQoImFsbG93X21vdW50OiBpX21vdW50ID0iLCBpX21vdW50KQoKICAgIHNvbWUgcF9tb3VudCBpbiBwX29jaS5Nb3VudHMKICAgIHNvbWUgaV9zdG9yYWdlIGluIGlfc3RvcmFnZXMKCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IHBfbW91bnQgPSIsIHBfbW91bnQpCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IGlfc3RvcmFnZSA9IiwgaV9zdG9yYWdlKQoKICAgIGNoZWNrX21vdW50KHBfbW91bnQsIGlfbW91bnQsIGlfc3RvcmFnZSwgYnVuZGxlX2lkLCBzYW5kYm94X2lkKQoKICAgICMgVE9ETzogYXJlIHRoZXJlIGFueSBvdGhlciByZXF1aXJlZCBwb2xpY3kgY2hlY2tzIGZvciBtb3VudHMgLSBlLmcuLAogICAgIyAgICAgICBtdWx0aXBsZSBtb3VudHMgd2l0aCBzYW1lIHNvdXJjZSBvciBkZXN0aW5hdGlvbj8KCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IHRydWUiKQp9CgpjaGVja19tb3VudChwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcF9tb3VudCA9PSBpX21vdW50CiAgICBwcmludCgiY2hlY2tfbW91bnQgMTogdHJ1ZSIpCn0KY2hlY2tfbW91bnQocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHBfbW91bnQuZGVzdGluYXRpb24gPT0gaV9tb3VudC5kZXN0aW5hdGlvbgogICAgcF9tb3VudC50eXBlXyA9PSBpX21vdW50LnR5cGVfCiAgICBwX21vdW50Lm9wdGlvbnMgPT0gaV9tb3VudC5vcHRpb25zCgogICAgbW91bnRfc291cmNlX2FsbG93cyhwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkKCiAgICBwcmludCgiY2hlY2tfbW91bnQgMjogdHJ1ZSIpCn0KCm1vdW50X3NvdXJjZV9hbGxvd3MocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHJlZ2V4MSA6PSBwX21vdW50LnNvdXJjZQogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5tb3VudF9zb3VyY2VfY3BhdGgpCiAgICByZWdleDQgOj0gcmVwbGFjZShyZWdleDMsICIkKGJ1bmRsZS1pZCkiLCBidW5kbGVfaWQpCgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMTogcmVnZXg0ID0iLCByZWdleDQpCiAgICByZWdleC5tYXRjaChyZWdleDQsIGlfbW91bnQuc291cmNlKQoKICAgIHByaW50KCJtb3VudF9zb3VyY2VfYWxsb3dzIDE6IHRydWUiKQp9Cm1vdW50X3NvdXJjZV9hbGxvd3MocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHJlZ2V4MSA6PSBwX21vdW50LnNvdXJjZQogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5tb3VudF9zb3VyY2VfY3BhdGgpCiAgICByZWdleDQgOj0gcmVwbGFjZShyZWdleDMsICIkKHNhbmRib3gtaWQpIiwgc2FuZGJveF9pZCkKCiAgICBwcmludCgibW91bnRfc291cmNlX2FsbG93cyAyOiByZWdleDQgPSIsIHJlZ2V4NCkKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4NCwgaV9tb3VudC5zb3VyY2UpCgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMjogdHJ1ZSIpCn0KbW91bnRfc291cmNlX2FsbG93cyhwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogaV9tb3VudC5zb3VyY2UgPSIsIGlfbW91bnQuc291cmNlKQogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogaV9zdG9yYWdlLm1vdW50X3BvaW50ID0iLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCgogICAgaV9tb3VudC5zb3VyY2UgPT0gaV9zdG9yYWdlLm1vdW50X3BvaW50CgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogdHJ1ZSIpCn0KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBDcmVhdGUgY29udGFpbmVyIFN0b3JhZ2VzCgphbGxvd19zdG9yYWdlcyhwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHBfY291bnQgOj0gY291bnQocF9zdG9yYWdlcykKICAgIGlfY291bnQgOj0gY291bnQoaV9zdG9yYWdlcykKICAgIHByaW50KCJhbGxvd19zdG9yYWdlczogcF9jb3VudCA9IiwgcF9jb3VudCwgImlfY291bnQgPSIsIGlfY291bnQpCgogICAgcF9jb3VudCA9PSBpX2NvdW50CgogICAgIyBHZXQgdGhlIGNvbnRhaW5lciBpbWFnZSBsYXllciBJRHMgYW5kIHZlcml0eSByb290IGhhc2hlcywgZnJvbSB0aGUgIm92ZXJsYXlmcyIgc3RvcmFnZS4KICAgIHNvbWUgb3ZlcmxheV9zdG9yYWdlIGluIHBfc3RvcmFnZXMKICAgIG92ZXJsYXlfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIHByaW50KCJhbGxvd19zdG9yYWdlczogb3ZlcmxheV9zdG9yYWdlID0iLCBvdmVybGF5X3N0b3JhZ2UpCiAgICBjb3VudChvdmVybGF5X3N0b3JhZ2Uub3B0aW9ucykgPT0gMgoKICAgIGxheWVyX2lkcyA6PSBzcGxpdChvdmVybGF5X3N0b3JhZ2Uub3B0aW9uc1swXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiBsYXllcl9pZHMgPSIsIGxheWVyX2lkcykKCiAgICByb290X2hhc2hlcyA6PSBzcGxpdChvdmVybGF5X3N0b3JhZ2Uub3B0aW9uc1sxXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiByb290X2hhc2hlcyA9Iiwgcm9vdF9oYXNoZXMpCgogICAgZXZlcnkgaV9zdG9yYWdlIGluIGlfc3RvcmFnZXMgewogICAgICAgIGFsbG93X3N0b3JhZ2UocF9zdG9yYWdlcywgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpCiAgICB9CgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiB0cnVlIikKfQoKYWxsb3dfc3RvcmFnZShwX3N0b3JhZ2VzLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgc29tZSBwX3N0b3JhZ2UgaW4gcF9zdG9yYWdlcwoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiBwX3N0b3JhZ2UgPSIsIHBfc3RvcmFnZSkKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiBpX3N0b3JhZ2UgPSIsIGlfc3RvcmFnZSkKCiAgICBwX3N0b3JhZ2UuZHJpdmVyICAgICAgICAgICA9PSBpX3N0b3JhZ2UuZHJpdmVyCiAgICBwX3N0b3JhZ2UuZHJpdmVyX29wdGlvbnMgICA9PSBpX3N0b3JhZ2UuZHJpdmVyX29wdGlvbnMKICAgIHBfc3RvcmFnZS5mc19ncm91cCAgICAgICAgID09IGlfc3RvcmFnZS5mc19ncm91cAogICAgcF9zdG9yYWdlLmZzdHlwZSAgICAgICAgICAgPT0gaV9zdG9yYWdlLmZzdHlwZQoKICAgIGFsbG93X3N0b3JhZ2Vfc291cmNlKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKQogICAgYWxsb3dfc3RvcmFnZV9vcHRpb25zKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKQogICAgYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKQoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiB0cnVlIikKfQoKYWxsb3dfc3RvcmFnZV9zb3VyY2UocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX3NvdXJjZSAxOiBzdGFydCIpCgogICAgcF9zdG9yYWdlLnNvdXJjZSA9PSBpX3N0b3JhZ2Uuc291cmNlCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDE6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX3NvdXJjZShwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDI6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCgogICAgIyBEREREOkJCOkRELkY6IERvbWFpbjpCdXM6RGV2aWNlLkZ1bmN0aW9uCiAgICAjIGh0dHBzOi8vd3d3Lmtlcm5lbC5vcmcvZG9jL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtYnVzLXBjaQogICAgcmVnZXgubWF0Y2goYF5bYS1mMC05XXs0fTpbYS1mMC05XXsyfTpbYS1mMC05XXsyfVwuW2EtZjAtOV0kYCwgaV9zdG9yYWdlLnNvdXJjZSkKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9zb3VyY2UgMjogdHJ1ZSIpCn0KCmFsbG93X3N0b3JhZ2Vfc291cmNlKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKSB7CiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9zb3VyY2UgMzogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIGlfc3RvcmFnZS5zb3VyY2UgPT0gIm5vbmUiCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDM6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX3NvdXJjZShwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDQ6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJzbWIiCgogICAgIyBQYXR0ZXJuOiAvLzxzdG9yYWdlLWFjY291bnQtbmFtZT4uZmlsZS5jb3JlLndpbmRvd3MubmV0LzxrOHMtUFZDLW5hbWU+CiAgICAjIFN0b3JhZ2UgYWNjb3VudCBuYW1lOiBodHRwczovL2xlYXJuLm1pY3Jvc29mdC5jb20vZW4tdXMvYXp1cmUvc3RvcmFnZS9jb21tb24vc3RvcmFnZS1hY2NvdW50LW92ZXJ2aWV3I3N0b3JhZ2UtYWNjb3VudC1uYW1lCiAgICAjIEs4cyBQVkMgbmFtZTogaHR0cHM6Ly9rdWJlcm5ldGVzLmlvL2RvY3MvY29uY2VwdHMvb3ZlcnZpZXcvd29ya2luZy13aXRoLW9iamVjdHMvbmFtZXMvI2Rucy1zdWJkb21haW4tbmFtZXMKICAgIHJlZ2V4Lm1hdGNoKGBeXC9cLyhbYS16MC05XXszLDI0fSlcLmZpbGVcLmNvcmVcLndpbmRvd3NcLm5ldFwvW2EtejAtOV0oW2EtejAtOS4tXXswLDI1MX1bYS16MC05XSk/JGAsIGlfc3RvcmFnZS5zb3VyY2UpCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDQ6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMTogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgIT0gIm92ZXJsYXlmcyIKICAgIHBfc3RvcmFnZS5vcHRpb25zID09IGlfc3RvcmFnZS5vcHRpb25zCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAxOiB0cnVlIikKfQphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIGNvdW50KHBfc3RvcmFnZS5vcHRpb25zKSA9PSAyCgogICAgcG9saWN5X2lkcyA6PSBzcGxpdChwX3N0b3JhZ2Uub3B0aW9uc1swXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBwb2xpY3lfaWRzID0iLCBwb2xpY3lfaWRzKQogICAgcG9saWN5X2lkcyA9PSBsYXllcl9pZHMKCiAgICBwb2xpY3lfaGFzaGVzIDo9IHNwbGl0KHBfc3RvcmFnZS5vcHRpb25zWzFdLCAiOiIpCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IHBvbGljeV9oYXNoZXMgPSIsIHBvbGljeV9oYXNoZXMpCgogICAgcF9jb3VudCA6PSBjb3VudChwb2xpY3lfaWRzKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBwX2NvdW50ID0iLCBwX2NvdW50KQogICAgcF9jb3VudCA+PSAxCiAgICBwX2NvdW50ID09IGNvdW50KHBvbGljeV9oYXNoZXMpCgogICAgaV9jb3VudCA6PSBjb3VudChpX3N0b3JhZ2Uub3B0aW9ucykKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogaV9jb3VudCA9IiwgaV9jb3VudCkKICAgIGlfY291bnQgPT0gcF9jb3VudCArIDMKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zWzBdID0iLCBpX3N0b3JhZ2Uub3B0aW9uc1swXSkKICAgIGlfc3RvcmFnZS5vcHRpb25zWzBdID09ICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQubGF5ZXItc3JjLXByZWZpeD0vdmFyL2xpYi9jb250YWluZXJkL2lvLmNvbnRhaW5lcmQuc25hcHNob3R0ZXIudjEudGFyZGV2L2xheWVycyIKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zW2lfY291bnQgLSAyXSA9IiwgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDJdKQogICAgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDJdID09ICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQub3ZlcmxheS1ydyIKCiAgICBsb3dlcmRpciA6PSBjb25jYXQoIj0iLCBbImxvd2VyZGlyIiwgcF9zdG9yYWdlLm9wdGlvbnNbMF1dKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBsb3dlcmRpciA9IiwgbG93ZXJkaXIpCgogICAgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDFdID09IGxvd2VyZGlyCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zW2lfY291bnQgLSAxXSA9IiwgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDFdKQoKICAgIGV2ZXJ5IGksIHBvbGljeV9pZCBpbiBwb2xpY3lfaWRzIHsKICAgICAgICBhbGxvd19vdmVybGF5X2xheWVyKHBvbGljeV9pZCwgcG9saWN5X2hhc2hlc1tpXSwgaV9zdG9yYWdlLm9wdGlvbnNbaSArIDFdKQogICAgfQoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogdHJ1ZSIpCn0KYWxsb3dfc3RvcmFnZV9vcHRpb25zKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKSB7CiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDM6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCiAgICBjb3VudChwX3N0b3JhZ2Uub3B0aW9ucykgPT0gMQoKICAgIHN0YXJ0c3dpdGgocF9zdG9yYWdlLm9wdGlvbnNbMF0sICIkKGhhc2giKQogICAgaGFzaF9zdWZmaXggOj0gdHJpbV9sZWZ0KHBfc3RvcmFnZS5vcHRpb25zWzBdLCAiJChoYXNoIikKCiAgICBlbmRzd2l0aChoYXNoX3N1ZmZpeCwgIikiKQogICAgaGFzaF9pbmRleCA6PSB0cmltX3JpZ2h0KGhhc2hfc3VmZml4LCAiKSIpCiAgICBpIDo9IHRvX251bWJlcihoYXNoX2luZGV4KQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAzOiBpID0iLCBpKQoKICAgIGhhc2hfb3B0aW9uIDo9IGNvbmNhdCgiPSIsIFsiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LnJvb3QtaGFzaCIsIHJvb3RfaGFzaGVzW2ldXSkKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMzogaGFzaF9vcHRpb24gPSIsIGhhc2hfb3B0aW9uKQoKICAgIGNvdW50KGlfc3RvcmFnZS5vcHRpb25zKSA9PSA0CiAgICBpX3N0b3JhZ2Uub3B0aW9uc1swXSA9PSAicm8iCiAgICBpX3N0b3JhZ2Uub3B0aW9uc1sxXSA9PSAiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmJsb2NrX2RldmljZT1maWxlIgogICAgaV9zdG9yYWdlLm9wdGlvbnNbMl0gPT0gImlvLmthdGFjb250YWluZXJzLmZzLW9wdC5pcy1sYXllciIKICAgIGlfc3RvcmFnZS5vcHRpb25zWzNdID09IGhhc2hfb3B0aW9uCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAzOiB0cnVlIikKfQphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgNDogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gInNtYiIKICAgIHBfb3B0c19jb3VudCA6PSBjb3VudChwX3N0b3JhZ2Uub3B0aW9ucykKICAgIGlfb3B0c19jb3VudCA6PSBjb3VudChpX3N0b3JhZ2Uub3B0aW9ucykKICAgIGlfb3B0c19jb3VudCA9PSBwX29wdHNfY291bnQgKyAyCgogICAgaV9vcHRfbWF0Y2hlcyA6PSBbaSB8IGkgOj0gaWR4OyBpZHggPCBwX29wdHNfY291bnQ7IHBfc3RvcmFnZS5vcHRpb25zW2lkeF0gPT0gaV9zdG9yYWdlLm9wdGlvbnNbaWR4XV0KICAgIGNvdW50KGlfb3B0X21hdGNoZXMpID09IHBfb3B0c19jb3VudAoKICAgIHN0YXJ0c3dpdGgoaV9zdG9yYWdlLm9wdGlvbnNbaV9vcHRzX2NvdW50LTJdLCAiYWRkcj0iKQogICAgY3JlZHMgPSBzcGxpdChpX3N0b3JhZ2Uub3B0aW9uc1tpX29wdHNfY291bnQtMV0sICIsIikKICAgIGNvdW50KGNyZWRzKSA9PSAyCiAgICBzdGFydHN3aXRoKGNyZWRzWzBdLCAidXNlcm5hbWU9IikKICAgIHN0YXJ0c3dpdGgoY3JlZHNbMV0sICJwYXNzd29yZD0iKQogICAgCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDQ6IHRydWUiKQp9CgphbGxvd19vdmVybGF5X2xheWVyKHBvbGljeV9pZCwgcG9saWN5X2hhc2gsIGlfb3B0aW9uKSB7CiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogcG9saWN5X2lkID0iLCBwb2xpY3lfaWQsICJwb2xpY3lfaGFzaCA9IiwgcG9saWN5X2hhc2gpCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogaV9vcHRpb24gPSIsIGlfb3B0aW9uKQoKICAgIHN0YXJ0c3dpdGgoaV9vcHRpb24sICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQubGF5ZXI9IikKICAgIGlfdmFsdWUgOj0gcmVwbGFjZShpX29wdGlvbiwgImlvLmthdGFjb250YWluZXJzLmZzLW9wdC5sYXllcj0iLCAiIikKICAgIGlfdmFsdWVfZGVjb2RlZCA6PSBiYXNlNjQuZGVjb2RlKGlfdmFsdWUpCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogaV92YWx1ZV9kZWNvZGVkID0iLCBpX3ZhbHVlX2RlY29kZWQpCgogICAgcG9saWN5X3N1ZmZpeCA6PSBjb25jYXQoIj0iLCBbInRhcixybyxpby5rYXRhY29udGFpbmVycy5mcy1vcHQuYmxvY2tfZGV2aWNlPWZpbGUsaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmlzLWxheWVyLGlvLmthdGFjb250YWluZXJzLmZzLW9wdC5yb290LWhhc2giLCBwb2xpY3lfaGFzaF0pCiAgICBwX3ZhbHVlIDo9IGNvbmNhdCgiLCIsIFtwb2xpY3lfaWQsIHBvbGljeV9zdWZmaXhdKQogICAgcHJpbnQoImFsbG93X292ZXJsYXlfbGF5ZXI6IHBfdmFsdWUgPSIsIHBfdmFsdWUpCgogICAgcF92YWx1ZSA9PSBpX3ZhbHVlX2RlY29kZWQKCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogdHJ1ZSIpCn0KCmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAidGFyIgoKICAgIHN0YXJ0c3dpdGgocF9zdG9yYWdlLm1vdW50X3BvaW50LCAiJChsYXllciIpCiAgICBtb3VudF9zdWZmaXggOj0gdHJpbV9sZWZ0KHBfc3RvcmFnZS5tb3VudF9wb2ludCwgIiQobGF5ZXIiKQoKICAgIGVuZHN3aXRoKG1vdW50X3N1ZmZpeCwgIikiKQogICAgbGF5ZXJfaW5kZXggOj0gdHJpbV9yaWdodChtb3VudF9zdWZmaXgsICIpIikKICAgIGkgOj0gdG9fbnVtYmVyKGxheWVyX2luZGV4KQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDE6IGkgPSIsIGkpCgogICAgbGF5ZXJfaWQgOj0gbGF5ZXJfaWRzW2ldCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMTogbGF5ZXJfaWQgPSIsIGxheWVyX2lkKQoKICAgIHBfbW91bnQgOj0gY29uY2F0KCIvIiwgWyIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L2xheWVycyIsIGxheWVyX2lkXSkKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCAxOiBwX21vdW50ID0iLCBwX21vdW50KQoKICAgIHBfbW91bnQgPT0gaV9zdG9yYWdlLm1vdW50X3BvaW50CgogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDE6IHRydWUiKQp9CmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAiZnVzZTMua2F0YS1vdmVybGF5IgoKICAgIG1vdW50MSA6PSByZXBsYWNlKHBfc3RvcmFnZS5tb3VudF9wb2ludCwgIiQoY3BhdGgpIiwgcG9saWN5X2RhdGEuY29tbW9uLmNwYXRoKQogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDI6IG1vdW50MiA9IiwgbW91bnQyKQoKICAgIG1vdW50MiA9PSBpX3N0b3JhZ2UubW91bnRfcG9pbnQKCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMjogdHJ1ZSIpCn0KYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKSB7CiAgICBwX3N0b3JhZ2UuZnN0eXBlID09ICJsb2NhbCIKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQyID0iLCBtb3VudDIpCgogICAgbW91bnQzIDo9IHJlcGxhY2UobW91bnQyLCAiJChzYW5kYm94LWlkKSIsIHNhbmRib3hfaWQpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQzID0iLCBtb3VudDMpCgogICAgcmVnZXgubWF0Y2gobW91bnQzLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCgogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDM6IHRydWUiKQp9CmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAiYmluZCIKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNDogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNDogbW91bnQyID0iLCBtb3VudDIpCgogICAgbW91bnQzIDo9IHJlcGxhY2UobW91bnQyLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDQ6IG1vdW50MyA9IiwgbW91bnQzKQoKICAgIHJlZ2V4Lm1hdGNoKG1vdW50MywgaV9zdG9yYWdlLm1vdW50X3BvaW50KQoKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA0OiB0cnVlIikKfQphbGxvd19tb3VudF9wb2ludChwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgYnVuZGxlX2lkLCBzYW5kYm94X2lkLCBsYXllcl9pZHMpIHsKICAgIHBfc3RvcmFnZS5mc3R5cGUgPT0gInRtcGZzIgoKICAgIG1vdW50MSA6PSBwX3N0b3JhZ2UubW91bnRfcG9pbnQKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA1OiBtb3VudDEgPSIsIG1vdW50MSkKCiAgICByZWdleC5tYXRjaChtb3VudDEsIGlfc3RvcmFnZS5tb3VudF9wb2ludCkKCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNTogdHJ1ZSIpCn0KYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKSB7CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogaV9zdG9yYWdlLm1vdW50X3BvaW50ID0iLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCiAgICBhbGxvd19kaXJlY3Rfdm9sX2RyaXZlcihwX3N0b3JhZ2UsIGlfc3RvcmFnZSkKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChzcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQyID0iLCBtb3VudDIpCgogICAgZGlyZWN0X3ZvbF9wYXRoIDo9IGlfc3RvcmFnZS5zb3VyY2UKICAgIG1vdW50MyA6PSByZXBsYWNlKG1vdW50MiwgIiQoYjY0LWRpcmVjdC12b2wtcGF0aCkiLCBiYXNlNjR1cmwuZW5jb2RlKGRpcmVjdF92b2xfcGF0aCkpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQzID0iLCBtb3VudDMpCgogICAgbW91bnQzID09IGlfc3RvcmFnZS5tb3VudF9wb2ludAoKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA2OiB0cnVlIikKfQoKYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIocF9zdG9yYWdlLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19kaXJlY3Rfdm9sX2RyaXZlciAxOiBzdGFydCIpCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCiAgICBwcmludCgiYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIgMTogdHJ1ZSIpCn0KYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIocF9zdG9yYWdlLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19kaXJlY3Rfdm9sX2RyaXZlciAyOiBzdGFydCIpCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJzbWIiCiAgICBwcmludCgiYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIgMjogdHJ1ZSIpCn0KCiMgRXhlY1Byb2Nlc3NSZXF1ZXN0LnByb2Nlc3MuQ2FwYWJpbGl0aWVzCmFsbG93X2V4ZWNfY2FwcyhpX2NhcHMpIHsKICAgIG5vdCBpX2NhcHMuQW1iaWVudAogICAgbm90IGlfY2Fwcy5Cb3VuZGluZwogICAgbm90IGlfY2Fwcy5FZmZlY3RpdmUKICAgIG5vdCBpX2NhcHMuSW5oZXJpdGFibGUKICAgIG5vdCBpX2NhcHMuUGVybWl0dGVkCn0KCiMgT0NJLlByb2Nlc3MuQ2FwYWJpbGl0aWVzCmFsbG93X2NhcHMocF9jYXBzLCBpX2NhcHMpIHsKICAgIHByaW50KCJhbGxvd19jYXBzOiBwb2xpY3kgQW1iaWVudCA9IiwgcF9jYXBzLkFtYmllbnQpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgQW1iaWVudCA9IiwgaV9jYXBzLkFtYmllbnQpCiAgICBtYXRjaF9jYXBzKHBfY2Fwcy5BbWJpZW50LCBpX2NhcHMuQW1iaWVudCkKCiAgICBwcmludCgiYWxsb3dfY2FwczogcG9saWN5IEJvdW5kaW5nID0iLCBwX2NhcHMuQm91bmRpbmcpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgQm91bmRpbmcgPSIsIGlfY2Fwcy5Cb3VuZGluZykKICAgIG1hdGNoX2NhcHMocF9jYXBzLkJvdW5kaW5nLCBpX2NhcHMuQm91bmRpbmcpCgogICAgcHJpbnQoImFsbG93X2NhcHM6IHBvbGljeSBFZmZlY3RpdmUgPSIsIHBfY2Fwcy5FZmZlY3RpdmUpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgRWZmZWN0aXZlID0iLCBpX2NhcHMuRWZmZWN0aXZlKQogICAgbWF0Y2hfY2FwcyhwX2NhcHMuRWZmZWN0aXZlLCBpX2NhcHMuRWZmZWN0aXZlKQoKICAgIHByaW50KCJhbGxvd19jYXBzOiBwb2xpY3kgSW5oZXJpdGFibGUgPSIsIHBfY2Fwcy5Jbmhlcml0YWJsZSkKICAgIHByaW50KCJhbGxvd19jYXBzOiBpbnB1dCBJbmhlcml0YWJsZSA9IiwgaV9jYXBzLkluaGVyaXRhYmxlKQogICAgbWF0Y2hfY2FwcyhwX2NhcHMuSW5oZXJpdGFibGUsIGlfY2Fwcy5Jbmhlcml0YWJsZSkKCiAgICBwcmludCgiYWxsb3dfY2FwczogcG9saWN5IFBlcm1pdHRlZCA9IiwgcF9jYXBzLlBlcm1pdHRlZCkKICAgIHByaW50KCJhbGxvd19jYXBzOiBpbnB1dCBQZXJtaXR0ZWQgPSIsIGlfY2Fwcy5QZXJtaXR0ZWQpCiAgICBtYXRjaF9jYXBzKHBfY2Fwcy5QZXJtaXR0ZWQsIGlfY2Fwcy5QZXJtaXR0ZWQpCn0KCm1hdGNoX2NhcHMocF9jYXBzLCBpX2NhcHMpIHsKICAgIHByaW50KCJtYXRjaF9jYXBzIDE6IHN0YXJ0IikKCiAgICBwX2NhcHMgPT0gaV9jYXBzCgogICAgcHJpbnQoIm1hdGNoX2NhcHMgMTogdHJ1ZSIpCn0KbWF0Y2hfY2FwcyhwX2NhcHMsIGlfY2FwcykgewogICAgcHJpbnQoIm1hdGNoX2NhcHMgMjogc3RhcnQiKQoKICAgIGNvdW50KHBfY2FwcykgPT0gMQogICAgcF9jYXBzWzBdID09ICIkKGRlZmF1bHRfY2FwcykiCgogICAgcHJpbnQoIm1hdGNoX2NhcHMgMjogZGVmYXVsdF9jYXBzID0iLCBwb2xpY3lfZGF0YS5jb21tb24uZGVmYXVsdF9jYXBzKQogICAgcG9saWN5X2RhdGEuY29tbW9uLmRlZmF1bHRfY2FwcyA9PSBpX2NhcHMKCiAgICBwcmludCgibWF0Y2hfY2FwcyAyOiB0cnVlIikKfQptYXRjaF9jYXBzKHBfY2FwcywgaV9jYXBzKSB7CiAgICBwcmludCgibWF0Y2hfY2FwcyAzOiBzdGFydCIpCgogICAgY291bnQocF9jYXBzKSA9PSAxCiAgICBwX2NhcHNbMF0gPT0gIiQocHJpdmlsZWdlZF9jYXBzKSIKCiAgICBwcmludCgibWF0Y2hfY2FwcyAzOiBwcml2aWxlZ2VkX2NhcHMgPSIsIHBvbGljeV9kYXRhLmNvbW1vbi5wcml2aWxlZ2VkX2NhcHMpCiAgICBwb2xpY3lfZGF0YS5jb21tb24ucHJpdmlsZWdlZF9jYXBzID09IGlfY2FwcwoKICAgIHByaW50KCJtYXRjaF9jYXBzIDM6IHRydWUiKQp9CgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgpjaGVja19kaXJlY3RvcnlfdHJhdmVyc2FsKGlfcGF0aCkgewogICAgbm90IHJlZ2V4Lm1hdGNoKCIoXnwvKS4uKCR8LykiLCBpX3BhdGgpCn0KCmNoZWNrX3N5bWxpbmtfc291cmNlKGlfc3JjKSB7CiAgICBpX3NyYyA9PSAiIgogICAgcHJpbnQoImNoZWNrX3N5bWxpbmtfc291cmNlIDE6IHRydWUiKQp9CmNoZWNrX3N5bWxpbmtfc291cmNlKGlfc3JjKSB7CiAgICBpX3NyYyAhPSAiIgogICAgcHJpbnQoImNoZWNrX3N5bWxpbmtfc291cmNlIDI6IGlfc3JjID0iLCBpX3NyYykKCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24uc19zb3VyY2UxLCBpX3NyYykKCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMjogdHJ1ZSIpCn0KY2hlY2tfc3ltbGlua19zb3VyY2UoaV9zcmMpIHsKICAgIGlfc3JjICE9ICIiCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMzogaV9zcmMgPSIsIGlfc3JjKQoKICAgIHJlZ2V4Lm1hdGNoKHBvbGljeV9kYXRhLmNvbW1vbi5zX3NvdXJjZTIsIGlfc3JjKQogICAgY2hlY2tfZGlyZWN0b3J5X3RyYXZlcnNhbChpX3NyYykKCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMzogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfc3RvcmFnZXMoaV9zdG9yYWdlcykgewogICAgcHJpbnQoImFsbG93X3NhbmRib3hfc3RvcmFnZXM6IGlfc3RvcmFnZXMgPSIsIGlfc3RvcmFnZXMpCgogICAgcF9zdG9yYWdlcyA6PSBwb2xpY3lfZGF0YS5zYW5kYm94LnN0b3JhZ2VzCiAgICBldmVyeSBpX3N0b3JhZ2UgaW4gaV9zdG9yYWdlcyB7CiAgICAgICAgYWxsb3dfc2FuZGJveF9zdG9yYWdlKHBfc3RvcmFnZXMsIGlfc3RvcmFnZSkKICAgIH0KCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9zdG9yYWdlczogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfc3RvcmFnZShwX3N0b3JhZ2VzLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IGlfc3RvcmFnZSA9IiwgaV9zdG9yYWdlKQoKICAgIHNvbWUgcF9zdG9yYWdlIGluIHBfc3RvcmFnZXMKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IHBfc3RvcmFnZSA9IiwgcF9zdG9yYWdlKQogICAgaV9zdG9yYWdlID09IHBfc3RvcmFnZQoKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IHRydWUiKQp9CgpDb3B5RmlsZVJlcXVlc3QgewogICAgcHJpbnQoIkNvcHlGaWxlUmVxdWVzdDogaW5wdXQucGF0aCA9IiwgaW5wdXQucGF0aCkKCiAgICBjaGVja19zeW1saW5rX3NvdXJjZShpbnB1dC5zeW1saW5rX3NyYykKICAgIGNoZWNrX2RpcmVjdG9yeV90cmF2ZXJzYWwoaW5wdXQucGF0aCkKCiAgICBzb21lIHJlZ2V4MSBpbiBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLkNvcHlGaWxlUmVxdWVzdAogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5jcGF0aCkKICAgIHJlZ2V4NCA6PSByZXBsYWNlKHJlZ2V4MywgIiQoYnVuZGxlLWlkKSIsIEJVTkRMRV9JRCkKICAgIHByaW50KCJDb3B5RmlsZVJlcXVlc3Q6IHJlZ2V4NCA9IiwgcmVnZXg0KQoKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4NCwgaW5wdXQucGF0aCkKCiAgICBwcmludCgiQ29weUZpbGVSZXF1ZXN0OiB0cnVlIikKfQoKQ3JlYXRlU2FuZGJveFJlcXVlc3QgewogICAgcHJpbnQoIkNyZWF0ZVNhbmRib3hSZXF1ZXN0OiBpbnB1dC5ndWVzdF9ob29rX3BhdGggPSIsIGlucHV0Lmd1ZXN0X2hvb2tfcGF0aCkKICAgIGNvdW50KGlucHV0Lmd1ZXN0X2hvb2tfcGF0aCkgPT0gMAoKICAgIHByaW50KCJDcmVhdGVTYW5kYm94UmVxdWVzdDogaW5wdXQua2VybmVsX21vZHVsZXMgPSIsIGlucHV0Lmtlcm5lbF9tb2R1bGVzKQogICAgY291bnQoaW5wdXQua2VybmVsX21vZHVsZXMpID09IDAKCiAgICBpX3BpZG5zIDo9IGlucHV0LnNhbmRib3hfcGlkbnMKICAgIHByaW50KCJDcmVhdGVTYW5kYm94UmVxdWVzdDogaV9waWRucyA9IiwgaV9waWRucykKICAgIGlfcGlkbnMgPT0gZmFsc2UKICAgIGFsbG93X3NhbmRib3hfc3RvcmFnZXMoaW5wdXQuc3RvcmFnZXMpCn0KCmFsbG93X2V4ZWMocF9jb250YWluZXIsIGlfcHJvY2VzcykgewogICAgcHJpbnQoImFsbG93X2V4ZWM6IHN0YXJ0IikKCiAgICBwX29jaSA9IHBfY29udGFpbmVyLk9DSQogICAgcF9zX25hbWUgPSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc19uYW1lc3BhY2UgPSBnZXRfc3RhdGVfdmFsKCJuYW1lc3BhY2UiKQogICAgYWxsb3dfcHJvYmVfcHJvY2VzcyhwX29jaS5Qcm9jZXNzLCBpX3Byb2Nlc3MsIHBfc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfZXhlYzogdHJ1ZSIpCn0KCmFsbG93X2ludGVyYWN0aXZlX2V4ZWMocF9jb250YWluZXIsIGlfcHJvY2VzcykgewogICAgcHJpbnQoImFsbG93X2ludGVyYWN0aXZlX2V4ZWM6IHN0YXJ0IikKCiAgICBwX29jaSA9IHBfY29udGFpbmVyLk9DSQogICAgcF9zX25hbWUgPSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc19uYW1lc3BhY2UgPSBnZXRfc3RhdGVfdmFsKCJuYW1lc3BhY2UiKQogICAgYWxsb3dfaW50ZXJhY3RpdmVfcHJvY2VzcyhwX29jaS5Qcm9jZXNzLCBpX3Byb2Nlc3MsIHBfc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfaW50ZXJhY3RpdmVfZXhlYzogdHJ1ZSIpCn0KCiMgVE9ETzogc2hvdWxkIG90aGVyIEV4ZWNQcm9jZXNzUmVxdWVzdCBpbnB1dCBkYXRhIGZpZWxkcyBiZSB2YWxpZGF0ZWQgYXMgd2VsbD8KRXhlY1Byb2Nlc3NSZXF1ZXN0IHsKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMTogaW5wdXQgPSIsIGlucHV0KQoKICAgIHNvbWUgcF9jb21tYW5kIGluIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuRXhlY1Byb2Nlc3NSZXF1ZXN0LmFsbG93ZWRfY29tbWFuZHMKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMTogcF9jb21tYW5kID0iLCBwX2NvbW1hbmQpCiAgICBwX2NvbW1hbmQgPT0gaW5wdXQucHJvY2Vzcy5BcmdzCgogICAgIyBUT0RPOiBtYXRjaCBwX2NvbnRhaW5lcidzIElEIHdpdGggdGhlIGlucHV0IGNvbnRhaW5lcl9pZC4KICAgIHNvbWUgcF9jb250YWluZXIgaW4gcG9saWN5X2RhdGEuY29udGFpbmVycwogICAgYWxsb3dfaW50ZXJhY3RpdmVfZXhlYyhwX2NvbnRhaW5lciwgaW5wdXQucHJvY2VzcykKCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDE6IHRydWUiKQp9CkV4ZWNQcm9jZXNzUmVxdWVzdCB7CiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDI6IGlucHV0ID0iLCBpbnB1dCkKCiAgICAjIFRPRE86IG1hdGNoIGlucHV0IGNvbnRhaW5lciBJRCB3aXRoIGl0cyBjb3JyZXNwb25kaW5nIGNvbnRhaW5lci5leGVjX2NvbW1hbmRzLgogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBzb21lIHBfY29tbWFuZCBpbiBwX2NvbnRhaW5lci5leGVjX2NvbW1hbmRzCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDI6IHBfY29tbWFuZCA9IiwgcF9jb21tYW5kKQoKICAgICMgVE9ETzogc2hvdWxkIG90aGVyIGlucHV0IGRhdGEgZmllbGRzIGJlIHZhbGlkYXRlZCBhcyB3ZWxsPwogICAgcF9jb21tYW5kID09IGlucHV0LnByb2Nlc3MuQXJncwoKICAgIGFsbG93X2V4ZWMocF9jb250YWluZXIsIGlucHV0LnByb2Nlc3MpCgogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAyOiB0cnVlIikKfQpFeGVjUHJvY2Vzc1JlcXVlc3QgewogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAzOiBpbnB1dCA9IiwgaW5wdXQpCgogICAgaV9jb21tYW5kID0gY29uY2F0KCIgIiwgaW5wdXQucHJvY2Vzcy5BcmdzKQogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAzOiBpX2NvbW1hbmQgPSIsIGlfY29tbWFuZCkKCiAgICBzb21lIHBfcmVnZXggaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5FeGVjUHJvY2Vzc1JlcXVlc3QucmVnZXgKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMzogcF9yZWdleCA9IiwgcF9yZWdleCkKCiAgICByZWdleC5tYXRjaChwX3JlZ2V4LCBpX2NvbW1hbmQpCgogICAgIyBUT0RPOiBtYXRjaCBwX2NvbnRhaW5lcidzIElEIHdpdGggdGhlIGlucHV0IGNvbnRhaW5lcl9pZC4KICAgIHNvbWUgcF9jb250YWluZXIgaW4gcG9saWN5X2RhdGEuY29udGFpbmVycwogICAgYWxsb3dfaW50ZXJhY3RpdmVfZXhlYyhwX2NvbnRhaW5lciwgaW5wdXQucHJvY2VzcykKCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDM6IHRydWUiKQp9CgpVcGRhdGVSb3V0ZXNSZXF1ZXN0IHsKICAgIHByaW50KCJVcGRhdGVSb3V0ZXNSZXF1ZXN0OiBpbnB1dCA9IiwgaW5wdXQpCiAgICBwcmludCgiVXBkYXRlUm91dGVzUmVxdWVzdDogcG9saWN5ID0iLCBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLlVwZGF0ZVJvdXRlc1JlcXVlc3QpCgogICAgaV9yb3V0ZXMgOj0gaW5wdXQucm91dGVzLlJvdXRlcwogICAgcF9zb3VyY2VfcmVnZXggPSBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLlVwZGF0ZVJvdXRlc1JlcXVlc3QuZm9yYmlkZGVuX3NvdXJjZV9yZWdleAogICAgcF9uYW1lcyA9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuVXBkYXRlUm91dGVzUmVxdWVzdC5mb3JiaWRkZW5fZGV2aWNlX25hbWVzCgogICAgZXZlcnkgaV9yb3V0ZSBpbiBpX3JvdXRlcyB7CiAgICAgICAgcHJpbnQoImlfcm91dGUuc291cmNlID0iLCBpX3JvdXRlLnNvdXJjZSkKICAgICAgICBldmVyeSBwX3JlZ2V4IGluIHBfc291cmNlX3JlZ2V4IHsKICAgICAgICAgICAgcHJpbnQoInBfcmVnZXggPSIsIHBfcmVnZXgpCiAgICAgICAgICAgIG5vdCByZWdleC5tYXRjaChwX3JlZ2V4LCBpX3JvdXRlLnNvdXJjZSkKICAgICAgICB9CgogICAgICAgIHByaW50KCJpX3JvdXRlLmRldmljZSA9IiwgaV9yb3V0ZS5kZXZpY2UpCiAgICAgICAgbm90IGlfcm91dGUuZGV2aWNlIGluIHBfbmFtZXMKICAgIH0KCiAgICBwcmludCgiVXBkYXRlUm91dGVzUmVxdWVzdDogdHJ1ZSIpCn0KClVwZGF0ZUludGVyZmFjZVJlcXVlc3QgewogICAgcHJpbnQoIlVwZGF0ZUludGVyZmFjZVJlcXVlc3Q6IGlucHV0ID0iLCBpbnB1dCkKICAgIHByaW50KCJVcGRhdGVJbnRlcmZhY2VSZXF1ZXN0OiBwb2xpY3kgPSIsIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuVXBkYXRlSW50ZXJmYWNlUmVxdWVzdCkKCiAgICBpX2ludGVyZmFjZSA6PSBpbnB1dC5pbnRlcmZhY2UKICAgIHBfZmxhZ3MgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmFsbG93X3Jhd19mbGFncwoKICAgICMgVHlwaWNhbGx5LCBqdXN0IElGRl9OT0FSUCBpcyB1c2VkLgogICAgYml0cy5hbmQoaV9pbnRlcmZhY2UucmF3X2ZsYWdzLCBiaXRzLm5lZ2F0ZShwX2ZsYWdzKSkgPT0gMAoKICAgIHBfbmFtZXMgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmZvcmJpZGRlbl9uYW1lcwoKICAgIG5vdCBpX2ludGVyZmFjZS5uYW1lIGluIHBfbmFtZXMKCiAgICBwX2h3YWRkcnMgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmZvcmJpZGRlbl9od19hZGRycwoKICAgIG5vdCBpX2ludGVyZmFjZS5od0FkZHIgaW4gcF9od2FkZHJzCgogICAgcHJpbnQoIlVwZGF0ZUludGVyZmFjZVJlcXVlc3Q6IHRydWUiKQp9CgpDbG9zZVN0ZGluUmVxdWVzdCB7CiAgICBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLkNsb3NlU3RkaW5SZXF1ZXN0ID09IHRydWUKfQoKUmVhZFN0cmVhbVJlcXVlc3QgewogICAgcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5SZWFkU3RyZWFtUmVxdWVzdCA9PSB0cnVlCn0KClVwZGF0ZUVwaGVtZXJhbE1vdW50c1JlcXVlc3QgewogICAgcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVFcGhlbWVyYWxNb3VudHNSZXF1ZXN0ID09IHRydWUKfQoKV3JpdGVTdHJlYW1SZXF1ZXN0IHsKICAgIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuV3JpdGVTdHJlYW1SZXF1ZXN0ID09IHRydWUKfQoKcG9saWN5X2RhdGEgOj0gewogICJjb250YWluZXJzIjogWwogICAgewogICAgICAiT0NJIjogewogICAgICAgICJWZXJzaW9uIjogIjEuMS4wLXJjLjEiLAogICAgICAgICJQcm9jZXNzIjogewogICAgICAgICAgIlRlcm1pbmFsIjogZmFsc2UsCiAgICAgICAgICAiVXNlciI6IHsKICAgICAgICAgICAgIlVJRCI6IDY1NTM1LAogICAgICAgICAgICAiR0lEIjogNjU1MzUsCiAgICAgICAgICAgICJBZGRpdGlvbmFsR2lkcyI6IFtdLAogICAgICAgICAgICAiVXNlcm5hbWUiOiAiIgogICAgICAgICAgfSwKICAgICAgICAgICJEZXByZWNhdGVkQXJncyI6IFsKICAgICAgICAgICAgIi9wYXVzZSIKICAgICAgICAgIF0sCiAgICAgICAgICAiQXJncyI6IFsKICAgICAgICAgICAgIi9wYXVzZSIKICAgICAgICAgIF0sCiAgICAgICAgICAiRW52IjogWwogICAgICAgICAgICAiUEFUSD0vdXNyL2xvY2FsL3NiaW46L3Vzci9sb2NhbC9iaW46L3Vzci9zYmluOi91c3IvYmluOi9zYmluOi9iaW4iCiAgICAgICAgICBdLAogICAgICAgICAgIkN3ZCI6ICIvIiwKICAgICAgICAgICJDYXBhYmlsaXRpZXMiOiB7CiAgICAgICAgICAgICJBbWJpZW50IjogW10sCiAgICAgICAgICAgICJCb3VuZGluZyI6IFsKICAgICAgICAgICAgICAiJChkZWZhdWx0X2NhcHMpIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiRWZmZWN0aXZlIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJJbmhlcml0YWJsZSI6IFtdLAogICAgICAgICAgICAiUGVybWl0dGVkIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICAiTm9OZXdQcml2aWxlZ2VzIjogdHJ1ZQogICAgICAgIH0sCiAgICAgICAgIlJvb3QiOiB7CiAgICAgICAgICAiUGF0aCI6ICIkKGNwYXRoKS8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgIlJlYWRvbmx5IjogdHJ1ZQogICAgICAgIH0sCiAgICAgICAgIk1vdW50cyI6IFsKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9wcm9jIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJwcm9jIiwKICAgICAgICAgICAgInR5cGVfIjogInByb2MiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2IiwKICAgICAgICAgICAgInNvdXJjZSI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJzdHJpY3RhdGltZSIsCiAgICAgICAgICAgICAgIm1vZGU9NzU1IiwKICAgICAgICAgICAgICAic2l6ZT02NTUzNmsiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L3B0cyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiZGV2cHRzIiwKICAgICAgICAgICAgInR5cGVfIjogImRldnB0cyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJuZXdpbnN0YW5jZSIsCiAgICAgICAgICAgICAgInB0bXhtb2RlPTA2NjYiLAogICAgICAgICAgICAgICJtb2RlPTA2MjAiLAogICAgICAgICAgICAgICJnaWQ9NSIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvc2htIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L3NobSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi9tcXVldWUiLAogICAgICAgICAgICAic291cmNlIjogIm1xdWV1ZSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJtcXVldWUiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvc3lzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJzeXNmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJzeXNmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2V0Yy9yZXNvbHYuY29uZiIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClyZXNvbHYuY29uZiQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJvIiwKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9kZXYiLAogICAgICAgICAgICAgICJub2V4ZWMiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0KICAgICAgICBdLAogICAgICAgICJBbm5vdGF0aW9ucyI6IHsKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmJ1bmRsZV9wYXRoIjogIi9ydW4vY29udGFpbmVyZC9pby5jb250YWluZXJkLnJ1bnRpbWUudjIudGFzay9rOHMuaW8vJChidW5kbGUtaWQpIiwKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIjogInBvZF9zYW5kYm94IiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSI6ICJzYW5kYm94IiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWlkIjogIl5bYS16MC05XXs2NH0kIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWxvZy1kaXJlY3RvcnkiOiAiXi92YXIvbG9nL3BvZHMvJChzYW5kYm94LW5hbWVzcGFjZSlfJChzYW5kYm94LW5hbWUpX1swLTlhLWZdezh9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezEyfSQiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZSI6ICJecG9kXFwtc2VjcmV0c1xcLWRmNDczNzA2XFwtOWExM1xcLTQ3NTlcXC04NGJkXFwtZWVhNmVkMmQ3YjYxJCIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1uYW1lc3BhY2UiOiAiZW1wdHlkaXItd3JhcHBlci05NjQxIiwKICAgICAgICAgICJuZXJkY3RsL25ldHdvcmstbmFtZXNwYWNlIjogIl4vdmFyL3J1bi9uZXRucy9jbmktWzAtOWEtZl17OH0tWzAtOWEtZl17NH0tWzAtOWEtZl17NH0tWzAtOWEtZl17NH0tWzAtOWEtZl17MTJ9JCIKICAgICAgICB9LAogICAgICAgICJMaW51eCI6IHsKICAgICAgICAgICJOYW1lc3BhY2VzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgIlR5cGUiOiAiaXBjIiwKICAgICAgICAgICAgICAiUGF0aCI6ICIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiVHlwZSI6ICJ1dHMiLAogICAgICAgICAgICAgICJQYXRoIjogIiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJUeXBlIjogIm1vdW50IiwKICAgICAgICAgICAgICAiUGF0aCI6ICIiCiAgICAgICAgICAgIH0KICAgICAgICAgIF0sCiAgICAgICAgICAiTWFza2VkUGF0aHMiOiBbCiAgICAgICAgICAgICIvcHJvYy9hY3BpIiwKICAgICAgICAgICAgIi9wcm9jL2Fzb3VuZCIsCiAgICAgICAgICAgICIvcHJvYy9rY29yZSIsCiAgICAgICAgICAgICIvcHJvYy9rZXlzIiwKICAgICAgICAgICAgIi9wcm9jL2xhdGVuY3lfc3RhdHMiLAogICAgICAgICAgICAiL3Byb2MvdGltZXJfbGlzdCIsCiAgICAgICAgICAgICIvcHJvYy90aW1lcl9zdGF0cyIsCiAgICAgICAgICAgICIvcHJvYy9zY2hlZF9kZWJ1ZyIsCiAgICAgICAgICAgICIvc3lzL2Zpcm13YXJlIiwKICAgICAgICAgICAgIi9wcm9jL3Njc2kiCiAgICAgICAgICBdLAogICAgICAgICAgIlJlYWRvbmx5UGF0aHMiOiBbCiAgICAgICAgICAgICIvcHJvYy9idXMiLAogICAgICAgICAgICAiL3Byb2MvZnMiLAogICAgICAgICAgICAiL3Byb2MvaXJxIiwKICAgICAgICAgICAgIi9wcm9jL3N5cyIsCiAgICAgICAgICAgICIvcHJvYy9zeXNycS10cmlnZ2VyIgogICAgICAgICAgXSwKICAgICAgICAgICJEZXZpY2VzIjogW10sCiAgICAgICAgICAiU3lzY3RsIjogewogICAgICAgICAgICAibmV0LmlwdjQuaXBfdW5wcml2aWxlZ2VkX3BvcnRfc3RhcnQiOiAiMCIsCiAgICAgICAgICAgICJuZXQuaXB2NC5waW5nX2dyb3VwX3JhbmdlIjogIjAgMjE0NzQ4MzY0NyIKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0sCiAgICAgICJzdG9yYWdlcyI6IFsKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoMCkiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXIwKSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogIm92ZXJsYXlmcyIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAiZnVzZTMua2F0YS1vdmVybGF5IiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiNWE1YWFkODAwNTVmZjIwMDEyYTUwZGMyNWY4ZGY3YTI5OTI0NDc0MzI0ZDY1ZjdkNTMwNmVlOGVlMjdmZjcxZCIsCiAgICAgICAgICAgICI4MTcyNTBmMWEzZTMzNmRhNzZmNWJkM2ZhNzg0ZTFiMjZkOTU5YjljMTMxODc2ODE1YmEyNjA0MDQ4YjcwYzE4IgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGNwYXRoKS8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0KICAgICAgXSwKICAgICAgImRldmljZXMiOiBbXSwKICAgICAgInNhbmRib3hfcGlkbnMiOiBmYWxzZSwKICAgICAgImV4ZWNfY29tbWFuZHMiOiBbXSwKICAgICAgImVudl9tYXAiOiB7CiAgICAgICAgIlBBVEgiOiAiL3Vzci9sb2NhbC9zYmluOi91c3IvbG9jYWwvYmluOi91c3Ivc2JpbjovdXNyL2Jpbjovc2JpbjovYmluIgogICAgICB9CiAgICB9LAogICAgewogICAgICAiT0NJIjogewogICAgICAgICJWZXJzaW9uIjogIjEuMS4wLXJjLjEiLAogICAgICAgICJQcm9jZXNzIjogewogICAgICAgICAgIlRlcm1pbmFsIjogZmFsc2UsCiAgICAgICAgICAiVXNlciI6IHsKICAgICAgICAgICAgIlVJRCI6IDAsCiAgICAgICAgICAgICJHSUQiOiAwLAogICAgICAgICAgICAiQWRkaXRpb25hbEdpZHMiOiBbXSwKICAgICAgICAgICAgIlVzZXJuYW1lIjogIiIKICAgICAgICAgIH0sCiAgICAgICAgICAiRGVwcmVjYXRlZEFyZ3MiOiBbCiAgICAgICAgICAgICIvYWduaG9zdCIsCiAgICAgICAgICAgICJ0ZXN0LXdlYnNlcnZlciIKICAgICAgICAgIF0sCiAgICAgICAgICAiQXJncyI6IFsKICAgICAgICAgICAgIi9hZ25ob3N0IiwKICAgICAgICAgICAgInRlc3Qtd2Vic2VydmVyIgogICAgICAgICAgXSwKICAgICAgICAgICJFbnYiOiBbCiAgICAgICAgICAgICJQQVRIPS91c3IvbG9jYWwvc2JpbjovdXNyL2xvY2FsL2JpbjovdXNyL3NiaW46L3Vzci9iaW46L3NiaW46L2JpbiIsCiAgICAgICAgICAgICJIT1NUTkFNRT0kKGhvc3QtbmFtZSkiCiAgICAgICAgICBdLAogICAgICAgICAgIkN3ZCI6ICIvIiwKICAgICAgICAgICJDYXBhYmlsaXRpZXMiOiB7CiAgICAgICAgICAgICJBbWJpZW50IjogW10sCiAgICAgICAgICAgICJCb3VuZGluZyI6IFsKICAgICAgICAgICAgICAiJChkZWZhdWx0X2NhcHMpIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiRWZmZWN0aXZlIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJJbmhlcml0YWJsZSI6IFtdLAogICAgICAgICAgICAiUGVybWl0dGVkIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICAiTm9OZXdQcml2aWxlZ2VzIjogZmFsc2UKICAgICAgICB9LAogICAgICAgICJSb290IjogewogICAgICAgICAgIlBhdGgiOiAiJChjcGF0aCkvJChidW5kbGUtaWQpIiwKICAgICAgICAgICJSZWFkb25seSI6IGZhbHNlCiAgICAgICAgfSwKICAgICAgICAiTW91bnRzIjogWwogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL3Byb2MiLAogICAgICAgICAgICAic291cmNlIjogInByb2MiLAogICAgICAgICAgICAidHlwZV8iOiAicHJvYyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYiLAogICAgICAgICAgICAic291cmNlIjogInRtcGZzIiwKICAgICAgICAgICAgInR5cGVfIjogInRtcGZzIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgInN0cmljdGF0aW1lIiwKICAgICAgICAgICAgICAibW9kZT03NTUiLAogICAgICAgICAgICAgICJzaXplPTY1NTM2ayIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvcHRzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJkZXZwdHMiLAogICAgICAgICAgICAidHlwZV8iOiAiZGV2cHRzIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAgICAgIm5ld2luc3RhbmNlIiwKICAgICAgICAgICAgICAicHRteG1vZGU9MDY2NiIsCiAgICAgICAgICAgICAgIm1vZGU9MDYyMCIsCiAgICAgICAgICAgICAgImdpZD01IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi9zaG0iLAogICAgICAgICAgICAic291cmNlIjogIi9ydW4va2F0YS1jb250YWluZXJzL3NhbmRib3gvc2htIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L21xdWV1ZSIsCiAgICAgICAgICAgICJzb3VyY2UiOiAibXF1ZXVlIiwKICAgICAgICAgICAgInR5cGVfIjogIm1xdWV1ZSIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9zeXMiLAogICAgICAgICAgICAic291cmNlIjogInN5c2ZzIiwKICAgICAgICAgICAgInR5cGVfIjogInN5c2ZzIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAgICAgIm5vZGV2IiwKICAgICAgICAgICAgICAicm8iCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvc3lzL2ZzL2Nncm91cCIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiY2dyb3VwIiwKICAgICAgICAgICAgInR5cGVfIjogImNncm91cCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIsCiAgICAgICAgICAgICAgInJlbGF0aW1lIiwKICAgICAgICAgICAgICAicm8iCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZXRjL2hvc3RzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KWhvc3RzJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJydyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvdGVybWluYXRpb24tbG9nIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KXRlcm1pbmF0aW9uLWxvZyQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicnciCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZXRjL2hvc3RuYW1lIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KWhvc3RuYW1lJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJydyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9ldGMvcmVzb2x2LmNvbmYiLAogICAgICAgICAgICAic291cmNlIjogIiQoc2ZwcmVmaXgpcmVzb2x2LmNvbmYkIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJ3IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL3Zhci9ydW4vc2VjcmV0cy9rdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50IiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KXNlcnZpY2VhY2NvdW50JCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJybyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi92YXIvcnVuL3NlY3JldHMvYXp1cmUvdG9rZW5zIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KXRva2VucyQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicm8iCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZXRjL3NlY3JldC12b2x1bWUiLAogICAgICAgICAgICAic291cmNlIjogIiQoc2ZwcmVmaXgpc2VjcmV0LXZvbHVtZSQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicm8iCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZXRjL2NvbmZpZ21hcC12b2x1bWUiLAogICAgICAgICAgICAic291cmNlIjogIiQoc2ZwcmVmaXgpY29uZmlnbWFwLXZvbHVtZSQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicm8iCiAgICAgICAgICAgIF0KICAgICAgICAgIH0KICAgICAgICBdLAogICAgICAgICJBbm5vdGF0aW9ucyI6IHsKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmJ1bmRsZV9wYXRoIjogIi9ydW4vY29udGFpbmVyZC9pby5jb250YWluZXJkLnJ1bnRpbWUudjIudGFzay9rOHMuaW8vJChidW5kbGUtaWQpIiwKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIjogInBvZF9jb250YWluZXIiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLmNvbnRhaW5lci1uYW1lIjogInNlY3JldC10ZXN0IiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSI6ICJjb250YWluZXIiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLmltYWdlLW5hbWUiOiAicmVnaXN0cnkuazhzLmlvL2UyZS10ZXN0LWltYWdlcy9hZ25ob3N0OjIuNDAiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtaWQiOiAiXlthLXowLTldezY0fSQiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZSI6ICJecG9kXFwtc2VjcmV0c1xcLWRmNDczNzA2XFwtOWExM1xcLTQ3NTlcXC04NGJkXFwtZWVhNmVkMmQ3YjYxJCIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1uYW1lc3BhY2UiOiAiZW1wdHlkaXItd3JhcHBlci05NjQxIgogICAgICAgIH0sCiAgICAgICAgIkxpbnV4IjogewogICAgICAgICAgIk5hbWVzcGFjZXMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiVHlwZSI6ICJpcGMiLAogICAgICAgICAgICAgICJQYXRoIjogIiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJUeXBlIjogInV0cyIsCiAgICAgICAgICAgICAgIlBhdGgiOiAiIgogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgIlR5cGUiOiAibW91bnQiLAogICAgICAgICAgICAgICJQYXRoIjogIiIKICAgICAgICAgICAgfQogICAgICAgICAgXSwKICAgICAgICAgICJNYXNrZWRQYXRocyI6IFsKICAgICAgICAgICAgIi9wcm9jL2FjcGkiLAogICAgICAgICAgICAiL3Byb2Mva2NvcmUiLAogICAgICAgICAgICAiL3Byb2Mva2V5cyIsCiAgICAgICAgICAgICIvcHJvYy9sYXRlbmN5X3N0YXRzIiwKICAgICAgICAgICAgIi9wcm9jL3RpbWVyX2xpc3QiLAogICAgICAgICAgICAiL3Byb2MvdGltZXJfc3RhdHMiLAogICAgICAgICAgICAiL3Byb2Mvc2NoZWRfZGVidWciLAogICAgICAgICAgICAiL3Byb2Mvc2NzaSIsCiAgICAgICAgICAgICIvc3lzL2Zpcm13YXJlIgogICAgICAgICAgXSwKICAgICAgICAgICJSZWFkb25seVBhdGhzIjogWwogICAgICAgICAgICAiL3Byb2MvYXNvdW5kIiwKICAgICAgICAgICAgIi9wcm9jL2J1cyIsCiAgICAgICAgICAgICIvcHJvYy9mcyIsCiAgICAgICAgICAgICIvcHJvYy9pcnEiLAogICAgICAgICAgICAiL3Byb2Mvc3lzIiwKICAgICAgICAgICAgIi9wcm9jL3N5c3JxLXRyaWdnZXIiCiAgICAgICAgICBdLAogICAgICAgICAgIkRldmljZXMiOiBbXSwKICAgICAgICAgICJTeXNjdGwiOiB7CiAgICAgICAgICAgICJuZXQuaXB2NC5pcF91bnByaXZpbGVnZWRfcG9ydF9zdGFydCI6ICIwIiwKICAgICAgICAgICAgIm5ldC5pcHY0LnBpbmdfZ3JvdXBfcmFuZ2UiOiAiMCAyMTQ3NDgzNjQ3IgogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSwKICAgICAgInN0b3JhZ2VzIjogWwogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2gwKSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjApIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2gxKSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjEpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2gyKSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjIpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2gzKSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjMpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2g0KSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjQpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2g1KSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjUpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2g2KSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjYpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2g3KSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjcpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2g4KSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjgpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAib3ZlcmxheWZzIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJmdXNlMy5rYXRhLW92ZXJsYXkiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIwNDM2ZDkzOTkzNGEyOWIzZDU5NzkzNTM0ZmY5M2UxOTlmOTQzOGY5Yjk0MWUxM2FlNjMyMTVmMTY3YzQ5M2I4OmJmMWM3ZjFmOWY3Zjk5NWFhOTZiMGMwZWI1NDM5MmRiNGVjNzc5M2VlYjUzMmI0MzgyYjUzZjcwMDQ0NDYzNWY6MTI3NjI2MmI5MTA0ZjE4NjcwNDEwY2NhZTUzYmEzMmMzZDIxOTVlYjExN2NlZGFmYjY3ZjI1OWI4OWNkNGQ3YTpjZjU0MzIxZjA5Y2U0OTc5M2IxM2YwYTFiOWYyNWM4NjkzZDQ0NjZkNGMxODUxZGYyNmU1YzdlZjI4MmUxODU2OmE3MDRmYjAwNmU5NjdhZjk4MTExMmY0NjE4NmJmNmIzZGMzZGZjOWYxZWQ2MjYxNGVlOWZkYzgxMTMwNTc0ZGU6NmE3MGQ3YWRkZTRiZjM1N2U0NzM0ZDRmYWQ4ODE2MDkyMDBmYTNlYmIyNzkyZjJiYWMwZTNiY2E4MzFiNGMyMjplMjI0ZTUzZmNjYWRhN2M5NjI3MTRiMzhmYzZiNDNlZWM1NTY0ZWQzNTAxYjUzMTg4NDEyZGVjNTVjYTllNGMxOmVlZjY1M2Y5NWNhMzI2NTJiODdlNjc2YzBhMzdjMGYyMDRlNTgxNDVkODY2YjRjNjhiZTBlZjNkZDM2YjQyMTE6ZGE1OTgwYTdlMzQzNDQwOWRhMTIzMjQxN2ExZDFjYzAyOTY3YjYyYTA5OTUwMmNhY2QxM2NjMmUzNDIwNmZhNCIsCiAgICAgICAgICAgICIxMWViYzUzZGZjZjAwOGRkYWNmNDVlZTY2MzlkYjU4ZGY0NjZlZDc5NzVlMDEwYjQ3YTIxNjIyZDY3MDQ4ZjYwOjgzNTIyYTM4OGZkZjdhMjBlNWMwNTViM2Q4ZGE3YTc3MjZmYjA0YjcxNmI3YzUyMjhiZTM5OWU3ODIyMDQ0Yjk6NmM3ZWEwZjZjNDgxMTdlZjBiNWEyNWQwOGU3MDMzMTk0NjY1NTk0YWFhZDE4MmM1ZDcyMjY3ODhlNzc5YmYwODo1NjhkOTExMWI1NzlhOWViNjYxZWQ3OTc4ZWNiNDliMDM1MWY4ZmI3Yzk4NzEyOTBiZTRlYzNiNWY4NWEwN2E5OmMwY2RlNDA5MWUyMGJiMjY0YzU5MjhmY2NmM2UzMTU3Zjg4MGQ4NjRkZjNmYzMyMWJiOWY2YjVjMzVmOWU0ZTQ6MzU5OTJlMmNhYmE5NjJmYzBkM2NiYjIyZjIzOGJiZTUyYmUwZDU0NGIzYjNhOWViMjg3ZDZiZmQ5N2ZhN2RmMjpiMTFlYzIyOTA1OTc1OTcxMzVhOTFkZjg0ODEyODc0N2JhNzY4YWQzZmNhZjBiYjc1MGIyOTIxNmUyZTNjMmQxOmFmMzFlNjUxZWRkMWYyNWJkODM5NDM0YjZkNjA1NjJiY2JkOTA3MWVjNTE2ZjQxYzZiMmVmYjI5ZTg0MGM0M2U6MjU0YzUzMTQ4NzNjMjdhOGRlM2RiNTM0N2Y1NmViZDllYjJiZjQ2Y2M4ODEyYTQzNjExZjk4ZTM4YWMzN2JhMiIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChjcGF0aCkvJChidW5kbGUtaWQpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9CiAgICAgIF0sCiAgICAgICJkZXZpY2VzIjogW10sCiAgICAgICJzYW5kYm94X3BpZG5zIjogZmFsc2UsCiAgICAgICJleGVjX2NvbW1hbmRzIjogW10sCiAgICAgICJlbnZfbWFwIjogewogICAgICAgICJIT1NUTkFNRSI6ICIkKGhvc3QtbmFtZSkiLAogICAgICAgICJQQVRIIjogIi91c3IvbG9jYWwvc2JpbjovdXNyL2xvY2FsL2JpbjovdXNyL3NiaW46L3Vzci9iaW46L3NiaW46L2JpbiIKICAgICAgfQogICAgfQogIF0sCiAgImNvbW1vbiI6IHsKICAgICJjcGF0aCI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zaGFyZWQvY29udGFpbmVycyIsCiAgICAibW91bnRfc291cmNlX2NwYXRoIjogIi9ydW4va2F0YS1jb250YWluZXJzL3NoYXJlZC9jb250YWluZXJzIiwKICAgICJzZnByZWZpeCI6ICJeJChjcGF0aCkvJChidW5kbGUtaWQpLVthLXowLTldezE2fS0iLAogICAgInNwYXRoIjogIi9ydW4va2F0YS1jb250YWluZXJzL3NhbmRib3gvc3RvcmFnZSIsCiAgICAiaXB2NF9hIjogIigoWzAtOV18WzEtOV1bMC05XXwxWzAtOV17Mn18MlswLTRdWzAtOV18MjVbMC01XSlcXC4pezN9KFswLTldfFsxLTldWzAtOV18MVswLTldezJ9fDJbMC00XVswLTldfDI1WzAtNV0pIiwKICAgICJpcF9wIjogIlswLTldezEsNX0iLAogICAgInN2Y19uYW1lIjogIltBLVpfXFwuXFwtXSsiLAogICAgImRuc19sYWJlbCI6ICJbYS16QS1aMC05X1xcLlxcLV0rIiwKICAgICJzX3NvdXJjZTEiOiAiXi4uMlswLTldezN9X1swLTFdWzAtOV1fWzAtM11bMC05XV9bMC0yXVswLTldX1swLTVdWzAtOV1fWzAtNV1bMC05XVxcLlswLTldezEsMTB9JCIsCiAgICAic19zb3VyY2UyIjogIl4uLmRhdGEvIiwKICAgICJkbnNfc3ViZG9tYWluIjogIl5bYS16MC05XShbLWEtejAtOV0qW2EtejAtOV0pPyQiLAogICAgInBvZF91aWQiOiAiXlswLTlhLWZBLUZdezh9LVswLTlhLWZBLUZdezR9LVswLTlhLWZBLUZdezR9LVswLTlhLWZBLUZdezR9LVswLTlhLWZBLUZdezEyfSQiLAogICAgImRlZmF1bHRfY2FwcyI6IFsKICAgICAgIkNBUF9DSE9XTiIsCiAgICAgICJDQVBfREFDX09WRVJSSURFIiwKICAgICAgIkNBUF9GU0VUSUQiLAogICAgICAiQ0FQX0ZPV05FUiIsCiAgICAgICJDQVBfTUtOT0QiLAogICAgICAiQ0FQX05FVF9SQVciLAogICAgICAiQ0FQX1NFVEdJRCIsCiAgICAgICJDQVBfU0VUVUlEIiwKICAgICAgIkNBUF9TRVRGQ0FQIiwKICAgICAgIkNBUF9TRVRQQ0FQIiwKICAgICAgIkNBUF9ORVRfQklORF9TRVJWSUNFIiwKICAgICAgIkNBUF9TWVNfQ0hST09UIiwKICAgICAgIkNBUF9LSUxMIiwKICAgICAgIkNBUF9BVURJVF9XUklURSIKICAgIF0sCiAgICAicHJpdmlsZWdlZF9jYXBzIjogWwogICAgICAiQ0FQX0NIT1dOIiwKICAgICAgIkNBUF9EQUNfT1ZFUlJJREUiLAogICAgICAiQ0FQX0RBQ19SRUFEX1NFQVJDSCIsCiAgICAgICJDQVBfRk9XTkVSIiwKICAgICAgIkNBUF9GU0VUSUQiLAogICAgICAiQ0FQX0tJTEwiLAogICAgICAiQ0FQX1NFVEdJRCIsCiAgICAgICJDQVBfU0VUVUlEIiwKICAgICAgIkNBUF9TRVRQQ0FQIiwKICAgICAgIkNBUF9MSU5VWF9JTU1VVEFCTEUiLAogICAgICAiQ0FQX05FVF9CSU5EX1NFUlZJQ0UiLAogICAgICAiQ0FQX05FVF9CUk9BRENBU1QiLAogICAgICAiQ0FQX05FVF9BRE1JTiIsCiAgICAgICJDQVBfTkVUX1JBVyIsCiAgICAgICJDQVBfSVBDX0xPQ0siLAogICAgICAiQ0FQX0lQQ19PV05FUiIsCiAgICAgICJDQVBfU1lTX01PRFVMRSIsCiAgICAgICJDQVBfU1lTX1JBV0lPIiwKICAgICAgIkNBUF9TWVNfQ0hST09UIiwKICAgICAgIkNBUF9TWVNfUFRSQUNFIiwKICAgICAgIkNBUF9TWVNfUEFDQ1QiLAogICAgICAiQ0FQX1NZU19BRE1JTiIsCiAgICAgICJDQVBfU1lTX0JPT1QiLAogICAgICAiQ0FQX1NZU19OSUNFIiwKICAgICAgIkNBUF9TWVNfUkVTT1VSQ0UiLAogICAgICAiQ0FQX1NZU19USU1FIiwKICAgICAgIkNBUF9TWVNfVFRZX0NPTkZJRyIsCiAgICAgICJDQVBfTUtOT0QiLAogICAgICAiQ0FQX0xFQVNFIiwKICAgICAgIkNBUF9BVURJVF9XUklURSIsCiAgICAgICJDQVBfQVVESVRfQ09OVFJPTCIsCiAgICAgICJDQVBfU0VURkNBUCIsCiAgICAgICJDQVBfTUFDX09WRVJSSURFIiwKICAgICAgIkNBUF9NQUNfQURNSU4iLAogICAgICAiQ0FQX1NZU0xPRyIsCiAgICAgICJDQVBfV0FLRV9BTEFSTSIsCiAgICAgICJDQVBfQkxPQ0tfU1VTUEVORCIsCiAgICAgICJDQVBfQVVESVRfUkVBRCIsCiAgICAgICJDQVBfUEVSRk1PTiIsCiAgICAgICJDQVBfQlBGIiwKICAgICAgIkNBUF9DSEVDS1BPSU5UX1JFU1RPUkUiCiAgICBdLAogICAgInZpcnRpb19ibGtfc3RvcmFnZV9jbGFzc2VzIjogWwogICAgICAiY2MtbG9jYWwtY3NpIiwKICAgICAgImNjLW1hbmFnZWQtY3NpIiwKICAgICAgImNjLW1hbmFnZWQtcHJlbWl1bS1jc2kiCiAgICBdLAogICAgInNtYl9zdG9yYWdlX2NsYXNzZXMiOiBbCiAgICAgIHsKICAgICAgICAibmFtZSI6ICJhenVyZWZpbGUtY3NpLWthdGEtY2MiLAogICAgICAgICJtb3VudF9vcHRpb25zIjogWwogICAgICAgICAgImRpcl9tb2RlPTA3NzciLAogICAgICAgICAgImZpbGVfbW9kZT0wNzc3IiwKICAgICAgICAgICJtZnN5bWxpbmtzIiwKICAgICAgICAgICJjYWNoZT1zdHJpY3QiLAogICAgICAgICAgIm5vc2hhcmVzb2NrIiwKICAgICAgICAgICJhY3RpbWVvPTMwIiwKICAgICAgICAgICJub2JybCIKICAgICAgICBdCiAgICAgIH0KICAgIF0KICB9LAogICJzYW5kYm94IjogewogICAgInN0b3JhZ2VzIjogWwogICAgICB7CiAgICAgICAgImRyaXZlciI6ICJlcGhlbWVyYWwiLAogICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICJzb3VyY2UiOiAic2htIiwKICAgICAgICAiZnN0eXBlIjogInRtcGZzIiwKICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAibm9kZXYiLAogICAgICAgICAgIm1vZGU9MTc3NyIsCiAgICAgICAgICAic2l6ZT02NzEwODg2NCIKICAgICAgICBdLAogICAgICAgICJtb3VudF9wb2ludCI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L3NobSIsCiAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICB9CiAgICBdCiAgfSwKICAicmVxdWVzdF9kZWZhdWx0cyI6IHsKICAgICJDcmVhdGVDb250YWluZXJSZXF1ZXN0IjogewogICAgICAiYWxsb3dfZW52X3JlZ2V4IjogWwogICAgICAgICJeSE9TVE5BTUU9JChkbnNfbGFiZWwpJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9QT1JUXyQoaXBfcClfVENQPXRjcDovLyQoaXB2NF9hKTokKGlwX3ApJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9QT1JUXyQoaXBfcClfVENQX1BST1RPPXRjcCQiLAogICAgICAgICJeJChzdmNfbmFtZSlfUE9SVF8kKGlwX3ApX1RDUF9QT1JUPSQoaXBfcCkkIiwKICAgICAgICAiXiQoc3ZjX25hbWUpX1BPUlRfJChpcF9wKV9UQ1BfQUREUj0kKGlwdjRfYSkkIiwKICAgICAgICAiXiQoc3ZjX25hbWUpX1NFUlZJQ0VfSE9TVD0kKGlwdjRfYSkkIiwKICAgICAgICAiXiQoc3ZjX25hbWUpX1NFUlZJQ0VfUE9SVD0kKGlwX3ApJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9TRVJWSUNFX1BPUlRfJChkbnNfbGFiZWwpPSQoaXBfcCkkIiwKICAgICAgICAiXiQoc3ZjX25hbWUpX1BPUlQ9dGNwOi8vJChpcHY0X2EpOiQoaXBfcCkkIiwKICAgICAgICAiXkFaVVJFX0NMSUVOVF9JRD1bQS1GYS1mMC05LV0qJCIsCiAgICAgICAgIl5BWlVSRV9URU5BTlRfSUQ9W0EtRmEtZjAtOS1dKiQiLAogICAgICAgICJeQVpVUkVfRkVERVJBVEVEX1RPS0VOX0ZJTEU9L3Zhci9ydW4vc2VjcmV0cy9henVyZS90b2tlbnMvYXp1cmUtaWRlbnRpdHktdG9rZW4kIiwKICAgICAgICAiXkFaVVJFX0FVVEhPUklUWV9IT1NUPWh0dHBzOi8vbG9naW5cXC5taWNyb3NvZnRvbmxpbmVcXC5jb20vJCIsCiAgICAgICAgIl5URVJNPXh0ZXJtJCIKICAgICAgXSwKICAgICAgImFsbG93X2Vudl9yZWdleF9tYXAiOiB7CiAgICAgICAgIkNQVV9MSU1JVCI6ICJeWzAtOV0rJCIsCiAgICAgICAgIkpPQl9DT01QTEVUSU9OX0lOREVYIjogIl5bMC05XSokIiwKICAgICAgICAiTUVNT1JZX0xJTUlUIjogIl5bMC05XSskIgogICAgICB9CiAgICB9LAogICAgIkNvcHlGaWxlUmVxdWVzdCI6IFsKICAgICAgIiQoc2ZwcmVmaXgpIgogICAgXSwKICAgICJFeGVjUHJvY2Vzc1JlcXVlc3QiOiB7CiAgICAgICJhbGxvd2VkX2NvbW1hbmRzIjogW10sCiAgICAgICJyZWdleCI6IFtdCiAgICB9LAogICAgIlVwZGF0ZVJvdXRlc1JlcXVlc3QiOiB7CiAgICAgICJmb3JiaWRkZW5fZGV2aWNlX25hbWVzIjogWwogICAgICAgICJsbyIKICAgICAgXSwKICAgICAgImZvcmJpZGRlbl9zb3VyY2VfcmVnZXgiOiBbCiAgICAgICAgIl4oPzowezAsNH06KXswLDd9MHswLDN9MSQiLAogICAgICAgICJeMTI3XFwuKD86WzAtOV17MSwzfVxcLil7Mn1bMC05XXsxLDN9JCIKICAgICAgXQogICAgfSwKICAgICJVcGRhdGVJbnRlcmZhY2VSZXF1ZXN0IjogewogICAgICAiYWxsb3dfcmF3X2ZsYWdzIjogMTI4LAogICAgICAiZm9yYmlkZGVuX25hbWVzIjogWwogICAgICAgICJsbyIKICAgICAgXSwKICAgICAgImZvcmJpZGRlbl9od19hZGRycyI6IFsKICAgICAgICAiMDA6MDA6MDA6MDA6MDA6MDAiCiAgICAgIF0KICAgIH0sCiAgICAiQ2xvc2VTdGRpblJlcXVlc3QiOiBmYWxzZSwKICAgICJSZWFkU3RyZWFtUmVxdWVzdCI6IGZhbHNlLAogICAgIlVwZGF0ZUVwaGVtZXJhbE1vdW50c1JlcXVlc3QiOiBmYWxzZSwKICAgICJXcml0ZVN0cmVhbVJlcXVlc3QiOiBmYWxzZQogIH0KfQ== +spec: + runtimeClassName: kata-cc + containers: + - args: + - test-webserver + image: "registry.k8s.io/e2e-test-images/agnhost:2.40" + imagePullPolicy: IfNotPresent + name: secret-test + resources: {} + terminationMessagePath: /dev/termination-log + terminationMessagePolicy: File + volumeMounts: + - mountPath: /etc/secret-volume + name: secret-volume + readOnly: true + - mountPath: /etc/configmap-volume + name: configmap-volume + - mountPath: /var/run/secrets/kubernetes.io/serviceaccount + name: kube-api-access-s2fk4 + readOnly: true + dnsPolicy: ClusterFirst + enableServiceLinks: true + preemptionPolicy: PreemptLowerPriority + priority: 0 + restartPolicy: Always + schedulerName: default-scheduler + securityContext: {} + serviceAccount: default + serviceAccountName: default + terminationGracePeriodSeconds: 30 + tolerations: + - effect: NoExecute + key: node.kubernetes.io/not-ready + operator: Exists + tolerationSeconds: 300 + - effect: NoExecute + key: node.kubernetes.io/unreachable + operator: Exists + tolerationSeconds: 300 + volumes: + - name: secret-volume + secret: + defaultMode: 420 + secretName: emptydir-wrapper-test-434a02c7-a53e-4aaa-aa85-90213274e068 + - configMap: + defaultMode: 420 + name: emptydir-wrapper-test-434a02c7-a53e-4aaa-aa85-90213274e068 + name: configmap-volume + - name: kube-api-access-s2fk4 + projected: + defaultMode: 420 + sources: + - serviceAccountToken: + expirationSeconds: 3607 + path: token + - configMap: + items: + - key: ca.crt + path: ca.crt + name: kube-root-ca.crt + - downwardAPI: + items: + - fieldRef: + apiVersion: v1 + fieldPath: metadata.namespace + path: namespace +status: {} diff --git a/src/agent/samples/policy/yaml/webhook/webhook-pod4.yaml b/src/agent/samples/policy/yaml/webhook/webhook-pod4.yaml new file mode 100644 index 000000000000..2d0e55c7c901 --- /dev/null +++ b/src/agent/samples/policy/yaml/webhook/webhook-pod4.yaml @@ -0,0 +1,155 @@ +--- +apiVersion: v1 +kind: Namespace +metadata: + name: projected-1359 +--- +apiVersion: v1 +kind: Pod +metadata: + creationTimestamp: ~ + managedFields: + - apiVersion: v1 + fieldsType: FieldsV1 + fieldsV1: + "f:spec": + "f:containers": + "k:{\"name\":\"client-container\"}": + ".": {} + "f:args": {} + "f:image": {} + "f:imagePullPolicy": {} + "f:name": {} + "f:resources": + ".": {} + "f:limits": + ".": {} + "f:cpu": {} + "f:memory": {} + "f:requests": + ".": {} + "f:cpu": {} + "f:memory": {} + "f:terminationMessagePath": {} + "f:terminationMessagePolicy": {} + "f:volumeMounts": + ".": {} + "k:{\"mountPath\":\"/etc/podinfo\"}": + ".": {} + "f:mountPath": {} + "f:name": {} + "f:dnsPolicy": {} + "f:enableServiceLinks": {} + "f:restartPolicy": {} + "f:schedulerName": {} + "f:securityContext": {} + "f:terminationGracePeriodSeconds": {} + "f:volumes": + ".": {} + "k:{\"name\":\"podinfo\"}": + ".": {} + "f:downwardAPI": + ".": {} + "f:defaultMode": {} + "f:items": {} + "f:name": {} + manager: e2e.test + operation: Update + time: "2023-06-16T17:41:36Z" + name: downwardapi-volume-f25d7949-f03b-4194-aab7-b2a2f2132b80 + namespace: projected-1359 + annotations: + io.katacontainers.config.agent.policy: IyBDb3B5cmlnaHQgKGMpIDIwMjMgTWljcm9zb2Z0IENvcnBvcmF0aW9uCiMKIyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMAojCnBhY2thZ2UgYWdlbnRfcG9saWN5CgppbXBvcnQgZnV0dXJlLmtleXdvcmRzLmluCmltcG9ydCBmdXR1cmUua2V5d29yZHMuZXZlcnkKCiMgRGVmYXVsdCB2YWx1ZXMsIHJldHVybmVkIGJ5IE9QQSB3aGVuIHJ1bGVzIGNhbm5vdCBiZSBldmFsdWF0ZWQgdG8gdHJ1ZS4KZGVmYXVsdCBBZGRBUlBOZWlnaGJvcnNSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgQWRkU3dhcFJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBDbG9zZVN0ZGluUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IENvcHlGaWxlUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IENyZWF0ZUNvbnRhaW5lclJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBDcmVhdGVTYW5kYm94UmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IERlc3Ryb3lTYW5kYm94UmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgRXhlY1Byb2Nlc3NSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgR2V0T09NRXZlbnRSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBHdWVzdERldGFpbHNSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBMaXN0SW50ZXJmYWNlc1JlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBMaXN0Um91dGVzUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IE1lbUhvdHBsdWdCeVByb2JlUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IE9ubGluZUNQVU1lbVJlcXVlc3QgOj0gdHJ1ZQpkZWZhdWx0IFBhdXNlQ29udGFpbmVyUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFJlYWRTdHJlYW1SZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgUmVtb3ZlQ29udGFpbmVyUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgUmVtb3ZlU3RhbGVWaXJ0aW9mc1NoYXJlTW91bnRzUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgUmVzZWVkUmFuZG9tRGV2UmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFJlc3VtZUNvbnRhaW5lclJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBTZXRHdWVzdERhdGVUaW1lUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFNldFBvbGljeVJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBTaWduYWxQcm9jZXNzUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgU3RhcnRDb250YWluZXJSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBTdGFydFRyYWNpbmdSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgU3RhdHNDb250YWluZXJSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBTdG9wVHJhY2luZ1JlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBUdHlXaW5SZXNpemVSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBVcGRhdGVDb250YWluZXJSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgVXBkYXRlRXBoZW1lcmFsTW91bnRzUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFVwZGF0ZUludGVyZmFjZVJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBVcGRhdGVSb3V0ZXNSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgV2FpdFByb2Nlc3NSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBXcml0ZVN0cmVhbVJlcXVlc3QgOj0gZmFsc2UKCiMgQWxsb3dSZXF1ZXN0c0ZhaWxpbmdQb2xpY3kgOj0gdHJ1ZSBjb25maWd1cmVzIHRoZSBBZ2VudCB0byAqYWxsb3cgYW55CiMgcmVxdWVzdHMgY2F1c2luZyBhIHBvbGljeSBmYWlsdXJlKi4gVGhpcyBpcyBhbiB1bnNlY3VyZSBjb25maWd1cmF0aW9uCiMgYnV0IGlzIHVzZWZ1bCBmb3IgYWxsb3dpbmcgdW5zZWN1cmUgcG9kcyB0byBzdGFydCwgdGhlbiBjb25uZWN0IHRvCiMgdGhlbSBhbmQgaW5zcGVjdCBPUEEgbG9ncyBmb3IgdGhlIHJvb3QgY2F1c2Ugb2YgYSBmYWlsdXJlLgpkZWZhdWx0IEFsbG93UmVxdWVzdHNGYWlsaW5nUG9saWN5IDo9IGZhbHNlCgojIENvbnN0YW50cwpTX05BTUVfS0VZID0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZSIKU19OQU1FU1BBQ0VfS0VZID0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZXNwYWNlIgpCVU5ETEVfSUQgPSAiW2EtejAtOV17NjR9IgoKQ3JlYXRlQ29udGFpbmVyUmVxdWVzdDo9IHJlc3AgewogICAgbm90IGlzX251bGwoaW5wdXQuZW52X21hcCkKICAgIAogICAgaV9lbnZfbWFwIDo9IGlucHV0LmVudl9tYXAKICAgIAogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBwX2Vudl9tYXAgOj0gcF9jb250YWluZXIuZW52X21hcCAgCiAgICBhbGxvd19lbnZfbWFwKHBfZW52X21hcCwgaV9lbnZfbWFwKQogICAgCiAgICBpX3Byb2Nlc3MgOj0gaW5wdXQuYmFzZS5PQ0kuUHJvY2VzcwogICAgCiAgICBwX3Byb2Nlc3MgOj0gcF9jb250YWluZXIuT0NJLlByb2Nlc3MKICAgIAogICAgYWxsb3dfYXJncyhpX3Byb2Nlc3MsIHBfcHJvY2VzcywgaV9lbnZfbWFwKQoKICAgIHJlc3AgPSBDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uKGlucHV0LmJhc2UpCiAgICBwcmludCgiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdDogdHJ1ZSIpCn0KCmFsbG93X2FyZ3MoaV9wcm9jZXNzLCBwX3Byb2Nlc3MsIGlfZW52X21hcCkgewogICAgaV9hcmdzIDo9IGlfcHJvY2Vzcy5BcmdzCiAgICBwX2FyZ3MgOj0gcF9wcm9jZXNzLkFyZ3MKICAgIHByaW50KCJhbGxvd19hcmdzOiBpX2FyZ3MgPSIsIGlfYXJncywgInBfYXJncyA9IiwgcF9hcmdzKQogICAgY291bnQoaV9hcmdzKSA9PSBjb3VudChwX2FyZ3MpCiAgICBldmVyeSBpLCBpX2FyZyBpbiBpX2FyZ3MgewogICAgICAgIHByaW50KCJhbGxvd19hcmdzOiBpX2FyZyA9IiwgaV9hcmcpCiAgICAgICAgcF9hcmdfcmVwbGFjZWQgOj0gcmVwbGFjZV9lbnZfdmFyaWFibGVzKHBfYXJnc1tpXSwgaV9lbnZfbWFwKQogICAgICAgIHByaW50KCJhbGxvd19hcmdzOiBwX2FyZ19yZXBsYWNlZCA9IiwgcF9hcmdfcmVwbGFjZWQpCiAgICAgICAgcF9hcmdfcmVwbGFjZWQyIDo9IHJlcGxhY2UocF9hcmdfcmVwbGFjZWQsICIkJCIsICIkIikKICAgICAgICBwcmludCgiYWxsb3dfYXJnczogcF9hcmdfcmVwbGFjZWQyID0iLCBwX2FyZ19yZXBsYWNlZDIpCiAgICAgICAgaV9hcmcgPT0gcF9hcmdfcmVwbGFjZWQyCiAgICB9CiAgICBwcmludCgiYWxsb3dfYXJnczogdHJ1ZSIpCn0KCmFsbG93X2FyZ3MoaV9wcm9jZXNzLCBwX3Byb2Nlc3MsIGlfZW52X21hcCkgewogICAgbm90IGlfcHJvY2Vzcy5BcmdzCiAgICBub3QgcF9wcm9jZXNzLkFyZ3MKICAgIHByaW50KCJhbGxvd19hcmdzMjogbm8gYXJncyIpCn0KCiMgdGhpcyBmdW5jdGlvbiByZXBsYWNlcyBhbGwgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyBpbiBhIHN0cmluZywgZ2l2ZW4gYSBtYXAgb2YgZW52aXJvbm1lbnQga2V5cyB0byBlbnZpcm9ubWVudCB2YWx1ZXMKIyBlZyBzdHIgPSAiZWNobyAkKENMVVNURVJfSUQpOyBlY2hvICQoTk9ERV9OQU1FKTsiCiMgZW52X21hcCA9IHsiQ0xVU1RFUl9JRCI6ICJhYmMiLCAiTk9ERV9OQU1FIiA6ICJ4eXoifQojIHJlc3VsdCA9ICJlY2hvIGFiYzsgZWNobyB4eXo7IgpyZXBsYWNlX2Vudl92YXJpYWJsZXMoc3RyLCBlbnZfbWFwKSA9IHJlc3VsdCB7CiAgICAjIG1ha2UgYW4gYXJyYXkgb2YgdGhlIGtleXMgZWcgWyJDTFVTVEVSX0lEIiwgIk5PREVfTkFNRSJdCiAgICBrZXlzIDo9IFt4IHwgc29tZSB4IGluIG9iamVjdC5rZXlzKGVudl9tYXApXQogICAgcmVzdWx0IDo9IHJlcGxhY2Vfc3RyX3JlYyhzdHIsIGVudl9tYXAsIGtleXMsIGNvdW50KGtleXMpIC0gMSkKfQoKIyBiYXNlIGNhc2UKcmVwbGFjZV9zdHJfcmVjKHN0ciwgZW52X21hcCwgYXJyX2tleXMsIGkpID0gcmVzdWx0IHsKICAgIGkgPCAwCiAgICByZXN1bHQgOj0gc3RyCn0KCiMgcmVjdXJzaXZlIHN0ZXAKcmVwbGFjZV9zdHJfcmVjKHN0ciwgZW52X21hcCwgYXJyX2tleXMsIGkpID0gcmVzdWx0IHsKICAgIGkgPj0gMAogICAga2V5IDo9IGFycl9rZXlzW2ldCiAgICBlbnZfa2V5MSA6PSBjb25jYXQoIiIsIFsiJCgiLCBrZXksICIpIl0pCiAgICAjIHJlcGxhY2UgJChWQVIpIHdpdGggdmFsdWUKICAgIG5ld19zdHIxIDo9IHJlcGxhY2Uoc3RyLCBlbnZfa2V5MSwgZW52X21hcFtrZXldKQogICAgIyByZXBsYWNlIG5leHQgZW52aXJvbm1lbnQgdmFyaWFibGUKICAgIHJlc3VsdCA9IHJlcGxhY2Vfc3RyX3JlYyhuZXdfc3RyMSwgZW52X21hcCwgYXJyX2tleXMsIGkgLSAxKQp9CgphbGxvd19lbnZfbWFwKHBfZW52X21hcCwgaV9lbnZfbWFwKSB7CiAgICBwcmludCgiYWxsb3dfZW52X21hcDogcF9lbnZfbWFwID0iLCBwX2Vudl9tYXApCiAgICBldmVyeSBlbnZfa2V5LCBlbnZfdmFsIGluIGlfZW52X21hcCB7CiAgICAgICAgcHJpbnQoImFsbG93X2VudjogZW52X2tleSA9IiwgZW52X2tleSwgImVudl92YWwgPSIsIGVudl92YWwpCiAgICAgICAgYWxsb3dfZW52X21hcF9lbnRyeShlbnZfa2V5LCBlbnZfdmFsLCBwX2Vudl9tYXApCiAgICB9CiAgICBwcmludCgiYWxsb3dfZW52X21hcDogdHJ1ZSIpCn0KCiMgQWxsb3cgZXhhY3QgbWF0Y2gKYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBpX3ZhbCA9PSBwX3ZhbAogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnk6IHRydWUiKQp9CgojIEFsbG93IHJlc291cmNlRmllbGRSZWYgdmFsdWVzIChlLmcuLCAibGltaXRzLmNwdSIpLgphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgICMgYSB2YXJpYWJsZSB3ZSBzaG91bGQgYmUgdmFsaWRhdGluZyB1c2luZyBhIHJlZ2V4IGZyb20gc2V0dGluZ3MKICAgIHBfdmFsID09ICIkKHZhbGlkYXRlLWZyb20tc2V0dGluZ3MpIgogICAgcmVnZXhfdmFsIDo9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuQ3JlYXRlQ29udGFpbmVyUmVxdWVzdC5hbGxvd19lbnZfcmVnZXhfbWFwW2tleV0KICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4X3ZhbCwgaV92YWwpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSAyOiB0cnVlIikKfQoKIyBBbGxvdyBub2RlLW5hbWUKYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChub2RlLW5hbWUpIgogICAgcmVnZXgubWF0Y2gocG9saWN5X2RhdGEuY29tbW9uLmRuc19zdWJkb21haW4gLCBpX3ZhbCkKICAgIHByaW50KCJhbGxvd19lbnZfbWFwX2VudHJ5IDM6IHRydWUiKQp9CgojIEFsbG93IGhvc3QtbmFtZQphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgIHBfdmFsID09ICIkKGhvc3QtbmFtZSkiCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24uZG5zX2xhYmVsICwgaV92YWwpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSA0OiB0cnVlIikKfQoKIyBBbGxvdyBwb2QtdWlkCmFsbG93X2Vudl9tYXBfZW50cnkoa2V5LCBpX3ZhbCwgcF9lbnZfbWFwKSB7CiAgICBwX3ZhbCA6PSBwX2Vudl9tYXBba2V5XQogICAgcF92YWwgPT0gIiQocG9kLXVpZCkiCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24ucG9kX3VpZCAsIGlfdmFsKQogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgNTogdHJ1ZSIpCn0KCiMgQWxsb3cgZmllbGRSZWYgImZpZWxkUGF0aDogc3RhdHVzLnBvZElQIiB2YWx1ZXMuCmFsbG93X2Vudl9tYXBfZW50cnkoa2V5LCBpX3ZhbCwgcF9lbnZfbWFwKSB7CiAgICBpc19pcChpX3ZhbCkKCiAgICBwX3ZhbCA6PSBwX2Vudl9tYXBba2V5XQogICAgcF92YXIgOj0gY29uY2F0KCI9IiwgW2tleSwgcF92YWxdKQogICAgYWxsb3dfcG9kX2lwX3ZhcihrZXksIHBfdmFyKQogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgNjogdHJ1ZSIpCn0KCiMgQWxsb3cgZmllbGRSZWYgImZpZWxkUGF0aDogc3RhdHVzLmhvc3RJUCIgdmFsdWVzLgphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgaXNfaXAoaV92YWwpCgogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgIHBfdmFyIDo9IGNvbmNhdCgiPSIsIFtrZXksIHBfdmFsXSkKICAgIGFsbG93X2hvc3RfaXBfdmFyKGtleSwgcF92YXIpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSA3OiB0cnVlIikKfQoKIyBNYXRjaCBpbnB1dCB3aXRoIG9uZSBvZiB0aGUgcG9saWN5IHZhcmlhYmxlcywgYWZ0ZXIgc3Vic3RpdHV0aW5nICQoc2FuZGJveC1uYW1lKS4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChzYW5kYm94LW5hbWUpIgogICAgc19uYW1lIDo9IGlucHV0LmJhc2UuT0NJLkFubm90YXRpb25zW1NfTkFNRV9LRVldCiAgICBwX3ZhcjIgOj0gcmVwbGFjZShwX3ZhbCwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHBfdmFyMiA9PSBpX3ZhbAogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgODogdHJ1ZSIpCn0KCiMgTWF0Y2ggaW5wdXQgd2l0aCBvbmUgb2YgdGhlIHBvbGljeSB2YXJpYWJsZXMsIGFmdGVyIHN1YnN0aXR1dGluZyAkKHNhbmRib3gtbmFtZXNwYWNlKS4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChzYW5kYm94LW5hbWVzcGFjZSkiCiAgICBzX25hbWVzcGFjZSA6PSBpbnB1dC5iYXNlLk9DSS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwX3ZhcjIgOj0gcmVwbGFjZShwX3ZhbCwgIiQoc2FuZGJveC1uYW1lc3BhY2UpIiwgc19uYW1lc3BhY2UpCiAgICBwX3ZhcjIgPT0gaV92YWwKICAgIHByaW50KCJhbGxvd19lbnZfbWFwX2VudHJ5IDk6IHRydWUiKQp9CgojIEFsbG93IGlucHV0IGVudiB2YXJpYWJsZXMgdGhhdCBtYXRjaCB3aXRoIGEgcmVxdWVzdF9kZWZhdWx0cyByZWdleC4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHNvbWUgcF9yZWdleDEgaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5DcmVhdGVDb250YWluZXJSZXF1ZXN0LmFsbG93X2Vudl9yZWdleAogICAgcF9yZWdleDIgOj0gcmVwbGFjZShwX3JlZ2V4MSwgIiQoaXB2NF9hKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcHY0X2EpCiAgICBwX3JlZ2V4MyA6PSByZXBsYWNlKHBfcmVnZXgyLCAiJChpcF9wKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcF9wKQogICAgcF9yZWdleDQgOj0gcmVwbGFjZShwX3JlZ2V4MywgIiQoc3ZjX25hbWUpIiwgcG9saWN5X2RhdGEuY29tbW9uLnN2Y19uYW1lKQogICAgcF9yZWdleDUgOj0gcmVwbGFjZShwX3JlZ2V4NCwgIiQoZG5zX2xhYmVsKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5kbnNfbGFiZWwpCgogICAgcmVzdWx0IDo9IGNvbmNhdCgiPSIsIFtrZXksIGlfdmFsXSkKICAgIHJlZ2V4Lm1hdGNoKHBfcmVnZXg1LCByZXN1bHQpCgogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgMTA6IHRydWUiKQp9CgpDcmVhdGVDb250YWluZXJSZXF1ZXN0Oj0gcmVzcCB7CiAgICBub3QgaW5wdXQuZW52X21hcAogICAgaV9wcm9jZXNzID0gaW5wdXQuT0NJLlByb2Nlc3MKICAgIHNfbmFtZSA9IGlucHV0Lk9DSS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBwX3Byb2Nlc3MgPSBwX2NvbnRhaW5lci5PQ0kuUHJvY2VzcwogICAgYWxsb3dfZGVwcmVjYXRlZF9hcmdzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUpCiAgICByZXNwID0gQ3JlYXRlQ29udGFpbmVyUmVxdWVzdENvbW1vbihpbnB1dCkKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0MjogdHJ1ZSIpCn0KCkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb24ocmVxKTo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgICMgQ2hlY2sgaWYgdGhlIGlucHV0IHJlcXVlc3Qgc2hvdWxkIGJlIHJlamVjdGVkIGV2ZW4gYmVmb3JlIGNoZWNraW5nIHRoZQogICAgIyBwb2xpY3lfZGF0YS5jb250YWluZXJzIGluZm9ybWF0aW9uLgogICAgYWxsb3dfY3JlYXRlX2NvbnRhaW5lcl9pbnB1dChyZXEpCgogICAgaV9vY2kgOj0gcmVxLk9DSQogICAgaV9zdG9yYWdlcyA6PSByZXEuc3RvcmFnZXMKICAgIGlfZGV2aWNlcyA6PSByZXEuZGV2aWNlcwoKICAgICMgYXJyYXkgb2YgcG9zc2libGUgc3RhdGUgb3BlcmF0aW9ucwogICAgb3BzX2J1aWxkZXIgOj0gW10KCiAgICAjIGNoZWNrIHNhbmRib3ggbmFtZQogICAgc2FuZGJveF9uYW1lID0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FX0tFWV0KICAgIGFkZF9zYW5kYm94X25hbWVfdG9fc3RhdGUgOj0gc3RhdGVfYWxsb3dzKCJzYW5kYm94X25hbWUiLCBzYW5kYm94X25hbWUpCiAgICBvcHNfYnVpbGRlcjEgOj0gY29uY2F0X29wX2lmX25vdF9udWxsKG9wc19idWlsZGVyLCBhZGRfc2FuZGJveF9uYW1lX3RvX3N0YXRlKQoKICAgICMgQ2hlY2sgaWYgYW55IGVsZW1lbnQgZnJvbSB0aGUgcG9saWN5X2RhdGEuY29udGFpbmVycyBhcnJheSBhbGxvd3MgdGhlIGlucHV0IHJlcXVlc3QuCiAgICBzb21lIHBfY29udGFpbmVyIGluIHBvbGljeV9kYXRhLmNvbnRhaW5lcnMKICAgIHByaW50KCI9PT09PT09PSBDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiB0cnlpbmcgbmV4dCBwb2xpY3kgY29udGFpbmVyIikKCiAgICBwX3BpZG5zIDo9IHBfY29udGFpbmVyLnNhbmRib3hfcGlkbnMKICAgIGlfcGlkbnMgOj0gcmVxLnNhbmRib3hfcGlkbnMKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiBwX3BpZG5zID0iLCBwX3BpZG5zLCAiaV9waWRucyA9IiwgaV9waWRucykKICAgIHBfcGlkbnMgPT0gaV9waWRucwoKICAgIHBfb2NpIDo9IHBfY29udGFpbmVyLk9DSQoKICAgICMgY2hlY2sgbmFtZXNwYWNlCiAgICBwX25hbWVzcGFjZSA6PSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBpX25hbWVzcGFjZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwcmludCAoIkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb246IHBfbmFtZXNwYWNlID0iLCBwX25hbWVzcGFjZSwgImlfbmFtZXNwYWNlID0iLCBpX25hbWVzcGFjZSkKICAgIGFkZF9uYW1lc3BhY2VfdG9fc3RhdGUgOj0gYWxsb3dfbmFtZXNwYWNlKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkKICAgIG9wc19idWlsZGVyMiA6PSBjb25jYXRfb3BfaWZfbm90X251bGwob3BzX2J1aWxkZXIxLCBhZGRfbmFtZXNwYWNlX3RvX3N0YXRlKQoKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiBwIFZlcnNpb24gPSIsIHBfb2NpLlZlcnNpb24sICJpIFZlcnNpb24gPSIsIGlfb2NpLlZlcnNpb24pCiAgICBwX29jaS5WZXJzaW9uID09IGlfb2NpLlZlcnNpb24KCiAgICBwcmludCgiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdENvbW1vbjogcCBSZWFkb25seSA9IiwgcF9vY2kuUm9vdC5SZWFkb25seSwgImkgUmVhZG9ubHkgPSIsIGlfb2NpLlJvb3QuUmVhZG9ubHkpCiAgICBwX29jaS5Sb290LlJlYWRvbmx5ID09IGlfb2NpLlJvb3QuUmVhZG9ubHkKCiAgICBhbGxvd19hbm5vKHBfb2NpLCBpX29jaSkKCiAgICBwX3N0b3JhZ2VzIDo9IHBfY29udGFpbmVyLnN0b3JhZ2VzCiAgICBhbGxvd19ieV9hbm5vKHBfb2NpLCBpX29jaSwgcF9zdG9yYWdlcywgaV9zdG9yYWdlcykKCiAgICBwX2RldmljZXMgOj0gcF9jb250YWluZXIuZGV2aWNlcwogICAgYWxsb3dfZGV2aWNlcyhwX2RldmljZXMsIGlfZGV2aWNlcykKCiAgICByZXQgOj0gYWxsb3dfbGludXgob3BzX2J1aWxkZXIyLCBwX29jaSwgaV9vY2kpCiAgICByZXQuYWxsb3dlZAoKICAgIG9wcyA6PSByZXQub3BzCgogICAgcHJpbnQoIkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb246IHRydWUiKQp9CgphbGxvd19jcmVhdGVfY29udGFpbmVyX2lucHV0KHJlcSkgewogICAgcHJpbnQoImFsbG93X2NyZWF0ZV9jb250YWluZXJfaW5wdXQ6IGlucHV0ID0iLCByZXEpCgogICAgY291bnQocmVxLnNoYXJlZF9tb3VudHMpID09IDAKICAgIGlzX251bGwocmVxLnN0cmluZ191c2VyKQoKICAgIGlfb2NpIDo9IHJlcS5PQ0kKICAgIGlzX251bGwoaV9vY2kuSG9va3MpCiAgICBpc19udWxsKGlfb2NpLlNvbGFyaXMpCiAgICBpc19udWxsKGlfb2NpLldpbmRvd3MpCgogICAgaV9saW51eCA6PSBpX29jaS5MaW51eAogICAgY291bnQoaV9saW51eC5HSURNYXBwaW5ncykgPT0gMAogICAgY291bnQoaV9saW51eC5Nb3VudExhYmVsKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlJlc291cmNlcy5EZXZpY2VzKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlJvb3Rmc1Byb3BhZ2F0aW9uKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlVJRE1hcHBpbmdzKSA9PSAwCiAgICBpc19udWxsKGlfbGludXguSW50ZWxSZHQpCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLkJsb2NrSU8pCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLk5ldHdvcmspCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLlBpZHMpCiAgICBpc19udWxsKGlfbGludXguU2VjY29tcCkKCiAgICBpX3Byb2Nlc3MgOj0gaV9vY2kuUHJvY2VzcwogICAgY291bnQoaV9wcm9jZXNzLlNlbGludXhMYWJlbCkgPT0gMAogICAgY291bnQoaV9wcm9jZXNzLlVzZXIuVXNlcm5hbWUpID09IDAKCiAgICBwcmludCgiYWxsb3dfY3JlYXRlX2NvbnRhaW5lcl9pbnB1dDogdHJ1ZSIpCn0KCmFsbG93X25hbWVzcGFjZShwX25hbWVzcGFjZSwgaV9uYW1lc3BhY2UpID0gYWRkX25hbWVzcGFjZSB7CiAgICBwX25hbWVzcGFjZSA9PSBpX25hbWVzcGFjZQogICAgYWRkX25hbWVzcGFjZSA6PSBudWxsCiAgICBwcmludCgiYWxsb3dfbmFtZXNwYWNlIDE6IGlucHV0IG5hbWVzcGFjZSBtYXRjaGVzIHBvbGljeSBkYXRhIikKfQoKYWxsb3dfbmFtZXNwYWNlKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkgPSBhZGRfbmFtZXNwYWNlIHsKICAgIHBfbmFtZXNwYWNlID09ICIiCiAgICBwcmludCgiYWxsb3dfbmFtZXNwYWNlIDI6IG5vIG5hbWVzcGFjZSBmb3VuZCBvbiBwb2xpY3kgZGF0YSIpCiAgICBhZGRfbmFtZXNwYWNlIDo9IHN0YXRlX2FsbG93cygibmFtZXNwYWNlIiwgaV9uYW1lc3BhY2UpCn0KCiMgdmFsdWUgaGFzbid0IGJlZW4gc2VlbiBiZWZvcmUsIHNhdmUgaXQgdG8gc3RhdGUKc3RhdGVfYWxsb3dzKGtleSwgdmFsdWUpID0gYWN0aW9uIHsKICBzdGF0ZSA6PSBnZXRfc3RhdGUoKQogIHByaW50KCJzdGF0ZV9hbGxvd3MgMTogc3RhdGVba2V5XSA9Iiwgc3RhdGVba2V5XSwgInZhbHVlID0iLCB2YWx1ZSkKICBub3Qgc3RhdGVba2V5XQogIHByaW50KCJzdGF0ZV9hbGxvd3MgMTogc2F2aW5nIHRvIHN0YXRlIGtleSA9Iiwga2V5LCAidmFsdWUgPSIsIHZhbHVlKQogIHBhdGggOj0gZ2V0X3N0YXRlX3BhdGgoa2V5KSAKICBhY3Rpb24gOj0gewogICAgIm9wIjogImFkZCIsCiAgICAicGF0aCI6IHBhdGgsIAogICAgInZhbHVlIjogdmFsdWUsCiAgfQp9CgojIHZhbHVlIG1hdGNoZXMgd2hhdCdzIGluIHN0YXRlLCBhbGxvdyBpdApzdGF0ZV9hbGxvd3Moa2V5LCB2YWx1ZSkgPSBhY3Rpb24gewogIHByaW50KCJzdGF0ZV9hbGxvd3MgMjogc3RhcnQiKQogIHN0YXRlIDo9IGdldF9zdGF0ZSgpCiAgcHJpbnQoInN0YXRlX2FsbG93cyAyOiBzdGF0ZVtrZXldID0iLCBzdGF0ZVtrZXldLCAidmFsdWUgPSIsIHZhbHVlKQogIHZhbHVlID09IHN0YXRlW2tleV0KICBwcmludCgic3RhdGVfYWxsb3dzIDI6IGZvdW5kIGtleSA9Iiwga2V5LCAidmFsdWUgPSIsIHZhbHVlLCAiIGluIHN0YXRlIikKICBhY3Rpb24gOj0gbnVsbAp9CgojIGhlbHBlciBmdW5jdGlvbnMgdG8gaW50ZXJhY3Qgd2l0aCB0aGUgc3RhdGUKZ2V0X3N0YXRlKCkgPSBzdGF0ZSB7CiAgc3RhdGUgOj0gZGF0YVsicHN0YXRlIl0KfQoKZ2V0X3N0YXRlX3ZhbChrZXkpID0gdmFsdWUgewogICAgc3RhdGUgOj0gZ2V0X3N0YXRlKCkKICAgIHZhbHVlIDo9IHN0YXRlW2tleV0KfQoKZ2V0X3N0YXRlX3BhdGgoa2V5KSA9IHBhdGggewogICAgIyBwcmVwZW5kICIvcHN0YXRlLyIgdG8ga2V5CiAgICBwYXRoIDo9IGNvbmNhdCgiLyIsIFsiL3BzdGF0ZSIsIGtleV0pCn0KCiMgSGVscGVyIGZ1bmN0aW9ucyB0byBjb25kaXRpb25hbGx5IGNvbmNhdGVuYXRlIG9wIGlzIG5vdCBudWxsCmNvbmNhdF9vcF9pZl9ub3RfbnVsbChvcHMsIG9wKSA9IHJlc3VsdCB7CiAgICBvcCA9PSBudWxsCiAgICByZXN1bHQgOj0gb3BzCn0KCmNvbmNhdF9vcF9pZl9ub3RfbnVsbChvcHMsIG9wKSA9IHJlc3VsdCB7CiAgICBvcCAhPSBudWxsCiAgICByZXN1bHQgOj0gYXJyYXkuY29uY2F0KG9wcywgW29wXSkKfQoKIyBSZWplY3QgdW5leHBlY3RlZCBhbm5vdGF0aW9ucy4KYWxsb3dfYW5ubyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19hbm5vIDE6IHN0YXJ0IikKCiAgICBub3QgaV9vY2kuQW5ub3RhdGlvbnMKCiAgICBwcmludCgiYWxsb3dfYW5ubyAxOiB0cnVlIikKfQphbGxvd19hbm5vKHBfb2NpLCBpX29jaSkgewogICAgcHJpbnQoImFsbG93X2Fubm8gMjogcCBBbm5vdGF0aW9ucyA9IiwgcF9vY2kuQW5ub3RhdGlvbnMpCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiBpIEFubm90YXRpb25zID0iLCBpX29jaS5Bbm5vdGF0aW9ucykKCiAgICBpX2tleXMgOj0gb2JqZWN0LmtleXMoaV9vY2kuQW5ub3RhdGlvbnMpCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiBpIGtleXMgPSIsIGlfa2V5cykKCiAgICBldmVyeSBpX2tleSBpbiBpX2tleXMgewogICAgICAgIGFsbG93X2Fubm9fa2V5KGlfa2V5LCBwX29jaSkKICAgIH0KCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiB0cnVlIikKfQoKYWxsb3dfYW5ub19rZXkoaV9rZXksIHBfb2NpKSB7CiAgICBwcmludCgiYWxsb3dfYW5ub19rZXkgMTogaSBrZXkgPSIsIGlfa2V5KQoKICAgIHN0YXJ0c3dpdGgoaV9rZXksICJpby5rdWJlcm5ldGVzLmNyaS4iKQoKICAgIHByaW50KCJhbGxvd19hbm5vX2tleSAxOiB0cnVlIikKfQphbGxvd19hbm5vX2tleShpX2tleSwgcF9vY2kpIHsKICAgIHByaW50KCJhbGxvd19hbm5vX2tleSAyOiBpIGtleSA9IiwgaV9rZXkpCgogICAgc29tZSBwX2tleSwgXyBpbiBwX29jaS5Bbm5vdGF0aW9ucwogICAgcF9rZXkgPT0gaV9rZXkKCiAgICBwcmludCgiYWxsb3dfYW5ub19rZXkgMjogdHJ1ZSIpCn0KCiMgR2V0IHRoZSB2YWx1ZSBvZiB0aGUgU19OQU1FX0tFWSBhbm5vdGF0aW9uIGFuZAojIGNvcnJlbGF0ZSBpdCB3aXRoIG90aGVyIGFubm90YXRpb25zIGFuZCBwcm9jZXNzIGZpZWxkcy4KYWxsb3dfYnlfYW5ubyhwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpIHsKICAgIHByaW50KCJhbGxvd19ieV9hbm5vIDE6IHN0YXJ0IikKCiAgICBub3QgcF9vY2kuQW5ub3RhdGlvbnNbU19OQU1FX0tFWV0KCiAgICBpX3NfbmFtZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMTogaV9zX25hbWUgPSIsIGlfc19uYW1lKQoKICAgIGlfc19uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FU1BBQ0VfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMTogaV9zX25hbWVzcGFjZSA9IiwgaV9zX25hbWVzcGFjZSkKCiAgICBhbGxvd19ieV9zYW5kYm94X25hbWUocF9vY2ksIGlfb2NpLCBwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBpX3NfbmFtZSwgaV9zX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfYnlfYW5ubyAxOiB0cnVlIikKfQphbGxvd19ieV9hbm5vKHBfb2NpLCBpX29jaSwgcF9zdG9yYWdlcywgaV9zdG9yYWdlcykgewogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMjogc3RhcnQiKQoKICAgIHBfc19uYW1lIDo9IHBfb2NpLkFubm90YXRpb25zW1NfTkFNRV9LRVldCiAgICBpX3NfbmFtZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMjogaV9zX25hbWUgPSIsIGlfc19uYW1lLCAicF9zX25hbWUgPSIsIHBfc19uYW1lKQoKICAgIGFsbG93X3NhbmRib3hfbmFtZShwX3NfbmFtZSwgaV9zX25hbWUpCgogICAgaV9zX25hbWVzcGFjZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwcmludCgiYWxsb3dfYnlfYW5ubyAyOiBpX3NfbmFtZXNwYWNlID0iLCBpX3NfbmFtZXNwYWNlKQoKICAgIGFsbG93X2J5X3NhbmRib3hfbmFtZShwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMsIGlfc19uYW1lLCBpX3NfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd19ieV9hbm5vIDI6IHRydWUiKQp9CgphbGxvd19ieV9zYW5kYm94X25hbWUocF9vY2ksIGlfb2NpLCBwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfYnlfc2FuZGJveF9uYW1lOiBzdGFydCIpCgogICAgaV9uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FU1BBQ0VfS0VZXQoKICAgIGFsbG93X2J5X2NvbnRhaW5lcl90eXBlcyhwX29jaSwgaV9vY2ksIHNfbmFtZSwgaV9uYW1lc3BhY2UpCiAgICBhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZChwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpCiAgICBhbGxvd19wcm9jZXNzKHBfb2NpLlByb2Nlc3MsIGlfb2NpLlByb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpCgogICAgcHJpbnQoImFsbG93X2J5X3NhbmRib3hfbmFtZTogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfbmFtZShwX3NfbmFtZSwgaV9zX25hbWUpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X25hbWU6IHN0YXJ0IikKICAgIHJlZ2V4Lm1hdGNoKHBfc19uYW1lLCBpX3NfbmFtZSkKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9uYW1lOiB0cnVlIikKfQoKIyBDaGVjayB0aGF0IHRoZSAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLXR5cGUiIGFuZAojICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIiBhbm5vdGF0aW9ucyBkZXNpZ25hdGUgdGhlCiMgZXhwZWN0ZWQgdHlwZSAtIGVpdGhlciBhICJzYW5kYm94IiBvciBhICJjb250YWluZXIiLiBUaGVuLCB2YWxpZGF0ZQojIG90aGVyIGFubm90YXRpb25zIGJhc2VkIG9uIHRoZSBhY3R1YWwgInNhbmRib3giIG9yICJjb250YWluZXIiIHZhbHVlCiMgZnJvbSB0aGUgaW5wdXQgY29udGFpbmVyLgphbGxvd19ieV9jb250YWluZXJfdHlwZXMocF9vY2ksIGlfb2NpLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfYnlfY29udGFpbmVyX3R5cGVzOiBjaGVja2luZyBpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSIpCgogICAgY190eXBlIDo9ICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSIKICAgIAogICAgcF9jcmlfdHlwZSA6PSBwX29jaS5Bbm5vdGF0aW9uc1tjX3R5cGVdCiAgICBpX2NyaV90eXBlIDo9IGlfb2NpLkFubm90YXRpb25zW2NfdHlwZV0KICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZXM6IHBfY3JpX3R5cGUgPSIsIHBfY3JpX3R5cGUsICJpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgcF9jcmlfdHlwZSA9PSBpX2NyaV90eXBlCgogICAgYWxsb3dfYnlfY29udGFpbmVyX3R5cGUoaV9jcmlfdHlwZSwgcF9vY2ksIGlfb2NpLCBzX25hbWUsIHNfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZXM6IHRydWUiKQp9CgphbGxvd19ieV9jb250YWluZXJfdHlwZShpX2NyaV90eXBlLCBwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAxOiBpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgaV9jcmlfdHlwZSA9PSAic2FuZGJveCIKCiAgICBpX2thdGFfdHlwZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1siaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5jb250YWluZXJfdHlwZSJdCiAgICBwcmludCgiYWxsb3dfYnlfY29udGFpbmVyX3R5cGUgMTogaV9rYXRhX3R5cGUgPSIsIGlfa2F0YV90eXBlKQogICAgaV9rYXRhX3R5cGUgPT0gInBvZF9zYW5kYm94IgoKICAgIGFsbG93X3NhbmRib3hfY29udGFpbmVyX25hbWUocF9vY2ksIGlfb2NpKQogICAgYWxsb3dfc2FuZGJveF9uZXRfbmFtZXNwYWNlKHBfb2NpLCBpX29jaSkKICAgIGFsbG93X3NhbmRib3hfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpCgogICAgcHJpbnQoImFsbG93X2J5X2NvbnRhaW5lcl90eXBlIDE6IHRydWUiKQp9CgphbGxvd19ieV9jb250YWluZXJfdHlwZShpX2NyaV90eXBlLCBwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiBpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgaV9jcmlfdHlwZSA9PSAiY29udGFpbmVyIgoKICAgIGlfa2F0YV90eXBlIDo9IGlfb2NpLkFubm90YXRpb25zWyJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIl0KICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiBpX2thdGFfdHlwZSA9IiwgaV9rYXRhX3R5cGUpCiAgICBpX2thdGFfdHlwZSA9PSAicG9kX2NvbnRhaW5lciIKCiAgICBhbGxvd19jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpCiAgICBhbGxvd19uZXRfbmFtZXNwYWNlKHBfb2NpLCBpX29jaSkKICAgIGFsbG93X2xvZ19kaXJlY3RvcnkocF9vY2ksIGlfb2NpKQoKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiB0cnVlIikKfQoKIyAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLW5hbWUiIGFubm90YXRpb24KYWxsb3dfc2FuZGJveF9jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X2NvbnRhaW5lcl9uYW1lOiBzdGFydCIpCgogICAgY29udGFpbmVyX2Fubm90YXRpb25fbWlzc2luZyhwX29jaSwgaV9vY2ksICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItbmFtZSIpCgogICAgcHJpbnQoImFsbG93X3NhbmRib3hfY29udGFpbmVyX25hbWU6IHRydWUiKQp9CgphbGxvd19jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19jb250YWluZXJfbmFtZTogc3RhcnQiKQoKICAgIGFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uKHBfb2NpLCBpX29jaSwgImlvLmt1YmVybmV0ZXMuY3JpLmNvbnRhaW5lci1uYW1lIikKCiAgICBwcmludCgiYWxsb3dfY29udGFpbmVyX25hbWU6IHRydWUiKQp9Cgpjb250YWluZXJfYW5ub3RhdGlvbl9taXNzaW5nKHBfb2NpLCBpX29jaSwga2V5KSB7CiAgICBwcmludCgiY29udGFpbmVyX2Fubm90YXRpb25fbWlzc2luZzoiLCBrZXkpCgogICAgbm90IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIG5vdCBpX29jaS5Bbm5vdGF0aW9uc1trZXldCgogICAgcHJpbnQoImNvbnRhaW5lcl9hbm5vdGF0aW9uX21pc3Npbmc6IHRydWUiKQp9CgphbGxvd19jb250YWluZXJfYW5ub3RhdGlvbihwX29jaSwgaV9vY2ksIGtleSkgewogICAgcHJpbnQoImFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uOiBrZXkgPSIsIGtleSkKCiAgICBwX3ZhbHVlIDo9IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIGlfdmFsdWUgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgcHJpbnQoImFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uOiBwX3ZhbHVlID0iLCBwX3ZhbHVlLCAiaV92YWx1ZSA9IiwgaV92YWx1ZSkKCiAgICBwX3ZhbHVlID09IGlfdmFsdWUKCiAgICBwcmludCgiYWxsb3dfY29udGFpbmVyX2Fubm90YXRpb246IHRydWUiKQp9CgojICJuZXJkY3RsL25ldHdvcmstbmFtZXNwYWNlIiBhbm5vdGF0aW9uCmFsbG93X3NhbmRib3hfbmV0X25hbWVzcGFjZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X25ldF9uYW1lc3BhY2U6IHN0YXJ0IikKCiAgICBrZXkgOj0gIm5lcmRjdGwvbmV0d29yay1uYW1lc3BhY2UiCgogICAgcF9uYW1lc3BhY2UgOj0gcF9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgaV9uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgcHJpbnQoImFsbG93X3NhbmRib3hfbmV0X25hbWVzcGFjZTogcF9uYW1lc3BhY2UgPSIsIHBfbmFtZXNwYWNlLCAiaV9uYW1lc3BhY2UgPSIsIGlfbmFtZXNwYWNlKQoKICAgIHJlZ2V4Lm1hdGNoKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9uZXRfbmFtZXNwYWNlOiB0cnVlIikKfQoKYWxsb3dfbmV0X25hbWVzcGFjZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19uZXRfbmFtZXNwYWNlOiBzdGFydCIpCgogICAga2V5IDo9ICJuZXJkY3RsL25ldHdvcmstbmFtZXNwYWNlIgoKICAgIG5vdCBwX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICBub3QgaV9vY2kuQW5ub3RhdGlvbnNba2V5XQoKICAgIHByaW50KCJhbGxvd19uZXRfbmFtZXNwYWNlOiB0cnVlIikKfQoKIyAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1sb2ctZGlyZWN0b3J5IiBhbm5vdGF0aW9uCmFsbG93X3NhbmRib3hfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X2xvZ19kaXJlY3Rvcnk6IHN0YXJ0IikKCiAgICBrZXkgOj0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbG9nLWRpcmVjdG9yeSIKCiAgICBwX2RpciA6PSBwX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICByZWdleDEgOj0gcmVwbGFjZShwX2RpciwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHJlZ2V4MiA6PSByZXBsYWNlKHJlZ2V4MSwgIiQoc2FuZGJveC1uYW1lc3BhY2UpIiwgc19uYW1lc3BhY2UpCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiByZWdleDIgPSIsIHJlZ2V4MikKCiAgICBpX2RpciA6PSBpX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiBpX2RpciA9IiwgaV9kaXIpCgogICAgcmVnZXgubWF0Y2gocmVnZXgyLCBpX2RpcikKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiB0cnVlIikKfQoKYWxsb3dfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19sb2dfZGlyZWN0b3J5OiBzdGFydCIpCgogICAga2V5IDo9ICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWxvZy1kaXJlY3RvcnkiCgogICAgbm90IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIG5vdCBpX29jaS5Bbm5vdGF0aW9uc1trZXldCgogICAgcHJpbnQoImFsbG93X2xvZ19kaXJlY3Rvcnk6IHRydWUiKQp9CgphbGxvd19kZXZpY2VzKHBfZGV2aWNlcywgaV9kZXZpY2VzKSB7CiAgICBwcmludCgiYWxsb3dfZGV2aWNlczogc3RhcnQiKQogICAgZXZlcnkgaV9kZXZpY2UgaW4gaV9kZXZpY2VzIHsKICAgICAgICBwcmludCgiYWxsb3dfZGV2aWNlczogaV9kZXZpY2UgPSIsIGlfZGV2aWNlKQogICAgICAgIHNvbWUgcF9kZXZpY2UgaW4gcF9kZXZpY2VzCiAgICAgICAgcF9kZXZpY2UuY29udGFpbmVyX3BhdGggPT0gaV9kZXZpY2UuY29udGFpbmVyX3BhdGgKICAgIH0KICAgIHByaW50KCJhbGxvd19kZXZpY2VzOiB0cnVlIikKfQoKYWxsb3dfbGludXgoc3RhdGVfb3BzLCBwX29jaSwgaV9vY2kpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIHBfbmFtZXNwYWNlcyA6PSBwX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbGludXg6IHAgbmFtZXNwYWNlcyA9IiwgcF9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlcyA6PSBpX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbGludXg6IGkgbmFtZXNwYWNlcyA9IiwgaV9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlX3dpdGhvdXRfbmV0d29yayA6PSBbb2JqIHwgb2JqIDo9IGlfbmFtZXNwYWNlc1tfXTsgb2JqLlR5cGUgIT0gIm5ldHdvcmsiXQoKICAgIHByaW50KCJhbGxvd19saW51eDogaV9uYW1lc3BhY2Vfd2l0aG91dF9uZXR3b3JrID0iLCBpX25hbWVzcGFjZV93aXRob3V0X25ldHdvcmspCgogICAgcF9uYW1lc3BhY2VzID09IGlfbmFtZXNwYWNlX3dpdGhvdXRfbmV0d29yawoKICAgIGFsbG93X21hc2tlZF9wYXRocyhwX29jaSwgaV9vY2kpCiAgICBhbGxvd19yZWFkb25seV9wYXRocyhwX29jaSwgaV9vY2kpCiAgICBhbGxvd19saW51eF9kZXZpY2VzKHBfb2NpLkxpbnV4LkRldmljZXMsIGlfb2NpLkxpbnV4LkRldmljZXMpCiAgICBhbGxvd19saW51eF9zeXNjdGwocF9vY2kuTGludXgsIGlfb2NpLkxpbnV4KQogICAgcmV0IDo9IGFsbG93X25ldHdvcmtfbmFtZXNwYWNlX3N0YXJ0KHN0YXRlX29wcywgcF9vY2ksIGlfb2NpKQogICAgcmV0LmFsbG93ZWQKCiAgICBvcHMgOj0gcmV0Lm9wcwoKICAgIHByaW50KCJhbGxvd19saW51eDogdHJ1ZSIpCn0KCiMgUmV0cmlldmUgdGhlICJuZXR3b3JrIiBuYW1lc3BhY2UgZnJvbSB0aGUgaW5wdXQgZGF0YSBhbmQgcGFzcyBpdCBvbiBmb3IgdGhlCiMgbmV0d29yayBuYW1lc3BhY2UgcG9saWN5IGNoZWNrcy4KYWxsb3dfbmV0d29ya19uYW1lc3BhY2Vfc3RhcnQoc3RhdGVfb3BzLCBwX29jaSwgaV9vY2kpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIHByaW50KCJhbGxvd19uZXR3b3JrX25hbWVzcGFjZSBzdGFydDogc3RhcnQiKQoKICAgIHBfbmFtZXNwYWNlcyA6PSBwX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IHAgbmFtZXNwYWNlcyA9IiwgcF9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlcyA6PSBpX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IGkgbmFtZXNwYWNlcyA9IiwgaV9uYW1lc3BhY2VzKQoKICAgICMgUmV0dXJuIHBhdGggb2YgdGhlICJuZXR3b3JrIiBuYW1lc3BhY2UKICAgIG5ldHdvcmtfbnMgOj0gW29iaiB8IG9iaiA6PSBpX25hbWVzcGFjZXNbX107IG9iai5UeXBlID09ICJuZXR3b3JrIl0KCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IG5ldHdvcmtfbnMgPSIsIG5ldHdvcmtfbnMpCgogICAgcmV0IDo9IGFsbG93X25ldHdvcmtfbmFtZXNwYWNlKHN0YXRlX29wcywgbmV0d29ya19ucykKICAgIHJldC5hbGxvd2VkCgogICAgb3BzIDo9IHJldC5vcHMKfQoKIyBUaGlzIHJ1bGUgaXMgd2hlbiB0aGVyZSdzIG5vIG5ldHdvcmsgbmFtZXNwYWNlIGluIHRoZSBpbnB1dCBkYXRhLgphbGxvd19uZXR3b3JrX25hbWVzcGFjZShzdGF0ZV9vcHMsIG5ldHdvcmtfbnMpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIGNvdW50KG5ldHdvcmtfbnMpID09IDAKCiAgICBuZXR3b3JrX25zX3BhdGggPSAiIgoKICAgIGFkZF9uZXR3b3JrX25hbWVzcGFjZV90b19zdGF0ZSA6PSBzdGF0ZV9hbGxvd3MoIm5ldHdvcmtfbmFtZXNwYWNlIiwgbmV0d29ya19uc19wYXRoKQogICAgb3BzIDo9IGNvbmNhdF9vcF9pZl9ub3RfbnVsbChzdGF0ZV9vcHMsIGFkZF9uZXR3b3JrX25hbWVzcGFjZV90b19zdGF0ZSkKCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2UgMTogdHJ1ZSIpCn0KCiMgVGhpcyBydWxlIGlzIHdoZW4gdGhlcmUncyBleGFjdGx5IG9uZSBuZXR3b3JrIG5hbWVzcGFjZSBpbiB0aGUgaW5wdXQgZGF0YS4KYWxsb3dfbmV0d29ya19uYW1lc3BhY2Uoc3RhdGVfb3BzLCBuZXR3b3JrX25zKSA6PSB7Im9wcyI6IG9wcywgImFsbG93ZWQiOiB0cnVlfSB7CiAgICBjb3VudChuZXR3b3JrX25zKSA9PSAxCgogICAgYWRkX25ldHdvcmtfbmFtZXNwYWNlX3RvX3N0YXRlIDo9IHN0YXRlX2FsbG93cygibmV0d29ya19uYW1lc3BhY2UiLCBuZXR3b3JrX25zWzBdLlBhdGgpCiAgICBvcHMgOj0gY29uY2F0X29wX2lmX25vdF9udWxsKHN0YXRlX29wcywgYWRkX25ldHdvcmtfbmFtZXNwYWNlX3RvX3N0YXRlKQoKICAgIHByaW50KCJhbGxvd19uZXR3b3JrX25hbWVzcGFjZSAyOiB0cnVlIikKfQoKYWxsb3dfbWFza2VkX3BhdGhzKHBfb2NpLCBpX29jaSkgewogICAgcF9wYXRocyA6PSBwX29jaS5MaW51eC5NYXNrZWRQYXRocwogICAgcHJpbnQoImFsbG93X21hc2tlZF9wYXRocyAxOiBwX3BhdGhzID0iLCBwX3BhdGhzKQoKICAgIGlfcGF0aHMgOj0gaV9vY2kuTGludXguTWFza2VkUGF0aHMKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aHMgMTogaV9wYXRocyA9IiwgaV9wYXRocykKCiAgICBhbGxvd19tYXNrZWRfcGF0aHNfYXJyYXkocF9wYXRocywgaV9wYXRocykKCiAgICBwcmludCgiYWxsb3dfbWFza2VkX3BhdGhzIDE6IHRydWUiKQp9CmFsbG93X21hc2tlZF9wYXRocyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aHMgMjogc3RhcnQiKQoKICAgIG5vdCBwX29jaS5MaW51eC5NYXNrZWRQYXRocwogICAgbm90IGlfb2NpLkxpbnV4Lk1hc2tlZFBhdGhzCgogICAgcHJpbnQoImFsbG93X21hc2tlZF9wYXRocyAyOiB0cnVlIikKfQoKIyBBbGwgdGhlIHBvbGljeSBtYXNrZWQgcGF0aHMgbXVzdCBiZSBtYXNrZWQgaW4gdGhlIGlucHV0IGRhdGEgdG9vLgojIElucHV0IGlzIGFsbG93ZWQgdG8gaGF2ZSBtb3JlIG1hc2tlZCBwYXRocyB0aGFuIHRoZSBwb2xpY3kuCmFsbG93X21hc2tlZF9wYXRoc19hcnJheShwX2FycmF5LCBpX2FycmF5KSB7CiAgICBldmVyeSBwX2VsZW0gaW4gcF9hcnJheSB7CiAgICAgICAgYWxsb3dfbWFza2VkX3BhdGgocF9lbGVtLCBpX2FycmF5KQogICAgfQp9CgphbGxvd19tYXNrZWRfcGF0aChwX2VsZW0sIGlfYXJyYXkpIHsKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aDogcF9lbGVtID0iLCBwX2VsZW0pCgogICAgc29tZSBpX2VsZW0gaW4gaV9hcnJheQogICAgcF9lbGVtID09IGlfZWxlbQoKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aDogdHJ1ZSIpCn0KCmFsbG93X3JlYWRvbmx5X3BhdGhzKHBfb2NpLCBpX29jaSkgewogICAgcF9wYXRocyA6PSBwX29jaS5MaW51eC5SZWFkb25seVBhdGhzCiAgICBwcmludCgiYWxsb3dfcmVhZG9ubHlfcGF0aHMgMTogcF9wYXRocyA9IiwgcF9wYXRocykKCiAgICBpX3BhdGhzIDo9IGlfb2NpLkxpbnV4LlJlYWRvbmx5UGF0aHMKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAxOiBpX3BhdGhzID0iLCBpX3BhdGhzKQoKICAgIGFsbG93X3JlYWRvbmx5X3BhdGhzX2FycmF5KHBfcGF0aHMsIGlfcGF0aHMsIGlfb2NpLkxpbnV4Lk1hc2tlZFBhdGhzKQoKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAxOiB0cnVlIikKfQphbGxvd19yZWFkb25seV9wYXRocyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAyOiBzdGFydCIpCgogICAgbm90IHBfb2NpLkxpbnV4LlJlYWRvbmx5UGF0aHMKICAgIG5vdCBpX29jaS5MaW51eC5SZWFkb25seVBhdGhzCgogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGhzIDI6IHRydWUiKQp9CgojIEFsbCB0aGUgcG9saWN5IHJlYWRvbmx5IHBhdGhzIG11c3QgYmUgZWl0aGVyOgojIC0gUHJlc2VudCBpbiB0aGUgaW5wdXQgcmVhZG9ubHkgcGF0aHMsIG9yCiMgLSBQcmVzZW50IGluIHRoZSBpbnB1dCBtYXNrZWQgcGF0aHMuCiMgSW5wdXQgaXMgYWxsb3dlZCB0byBoYXZlIG1vcmUgcmVhZG9ubHkgcGF0aHMgdGhhbiB0aGUgcG9saWN5LgphbGxvd19yZWFkb25seV9wYXRoc19hcnJheShwX2FycmF5LCBpX2FycmF5LCBtYXNrZWRfcGF0aHMpIHsKICAgIGV2ZXJ5IHBfZWxlbSBpbiBwX2FycmF5IHsKICAgICAgICBhbGxvd19yZWFkb25seV9wYXRoKHBfZWxlbSwgaV9hcnJheSwgbWFza2VkX3BhdGhzKQogICAgfQp9CgphbGxvd19yZWFkb25seV9wYXRoKHBfZWxlbSwgaV9hcnJheSwgbWFza2VkX3BhdGhzKSB7CiAgICBwcmludCgiYWxsb3dfcmVhZG9ubHlfcGF0aCAxOiBwX2VsZW0gPSIsIHBfZWxlbSkKCiAgICBzb21lIGlfZWxlbSBpbiBpX2FycmF5CiAgICBwX2VsZW0gPT0gaV9lbGVtCgogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGggMTogdHJ1ZSIpCn0KYWxsb3dfcmVhZG9ubHlfcGF0aChwX2VsZW0sIGlfYXJyYXksIG1hc2tlZF9wYXRocykgewogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGggMjogcF9lbGVtID0iLCBwX2VsZW0pCgogICAgc29tZSBpX21hc2tlZCBpbiBtYXNrZWRfcGF0aHMKICAgIHBfZWxlbSA9PSBpX21hc2tlZAoKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRoIDI6IHRydWUiKQp9CgphbGxvd19saW51eF9kZXZpY2VzKHBfZGV2aWNlcywgaV9kZXZpY2VzKSB7CiAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogc3RhcnQiKQogICAgZXZlcnkgaV9kZXZpY2UgaW4gaV9kZXZpY2VzIHsKICAgICAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogaV9kZXZpY2UgPSIsIGlfZGV2aWNlKQogICAgICAgIHNvbWUgcF9kZXZpY2UgaW4gcF9kZXZpY2VzCiAgICAgICAgaV9kZXZpY2UuUGF0aCA9PSBwX2RldmljZS5QYXRoCiAgICB9CiAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogdHJ1ZSIpCn0KCmFsbG93X2xpbnV4X3N5c2N0bChwX2xpbnV4LCBpX2xpbnV4KSB7CiAgICBwcmludCgiYWxsb3dfbGludXhfc3lzY3RsIDE6IHN0YXJ0IikKICAgIG5vdCBpX2xpbnV4LlN5c2N0bAogICAgcHJpbnQoImFsbG93X2xpbnV4X3N5c2N0bCAxOiB0cnVlIikKfQoKYWxsb3dfbGludXhfc3lzY3RsKHBfbGludXgsIGlfbGludXgpIHsKICAgIHByaW50KCJhbGxvd19saW51eF9zeXNjdGwgMjogc3RhcnQiKQogICAgcF9zeXNjdGwgOj0gcF9saW51eC5TeXNjdGwKICAgIGlfc3lzY3RsIDo9IGlfbGludXguU3lzY3RsCiAgICBldmVyeSBpX25hbWUsIGlfdmFsIGluIGlfc3lzY3RsIHsKICAgICAgICBwcmludCgiYWxsb3dfbGludXhfc3lzY3RsIDI6IGlfbmFtZSA9IiwgaV9uYW1lLCAiaV92YWwgPSIsIGlfdmFsKQogICAgICAgIHBfc3lzY3RsW2lfbmFtZV0gPT0gaV92YWwKICAgIH0KICAgIHByaW50KCJhbGxvd19saW51eF9zeXNjdGwgMjogdHJ1ZSIpCn0KCiMgQ2hlY2sgdGhlIGNvbnNpc3RlbmN5IG9mIHRoZSBpbnB1dCAiaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5idW5kbGVfcGF0aCIKIyBhbmQgaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCIgdmFsdWVzIHdpdGggb3RoZXIgZmllbGRzLgphbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZChwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpIHsKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogc3RhcnQiKQoKICAgIGJ1bmRsZV9wYXRoIDo9IGlfb2NpLkFubm90YXRpb25zWyJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmJ1bmRsZV9wYXRoIl0KICAgIGJ1bmRsZV9pZCA6PSByZXBsYWNlKGJ1bmRsZV9wYXRoLCAiL3J1bi9jb250YWluZXJkL2lvLmNvbnRhaW5lcmQucnVudGltZS52Mi50YXNrL2s4cy5pby8iLCAiIikKCiAgICBidW5kbGVfaWRfZm9ybWF0IDo9IGNvbmNhdCgiIiwgWyJeIiwgQlVORExFX0lELCAiJCJdKQogICAgcmVnZXgubWF0Y2goYnVuZGxlX2lkX2Zvcm1hdCwgYnVuZGxlX2lkKQoKICAgIGtleSA6PSAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCIKCiAgICBwX3JlZ2V4IDo9IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIHNhbmRib3hfaWQgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQoKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogc2FuZGJveF9pZCA9Iiwgc2FuZGJveF9pZCwgInJlZ2V4ID0iLCBwX3JlZ2V4KQogICAgcmVnZXgubWF0Y2gocF9yZWdleCwgc2FuZGJveF9pZCkKCiAgICBhbGxvd19yb290X3BhdGgocF9vY2ksIGlfb2NpLCBidW5kbGVfaWQpCgogICAgZXZlcnkgaV9tb3VudCBpbiBpX29jaS5Nb3VudHMgewogICAgICAgIGFsbG93X21vdW50KHBfb2NpLCBpX21vdW50LCBpX3N0b3JhZ2VzLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpCiAgICB9CgogICAgYWxsb3dfc3RvcmFnZXMocF9zdG9yYWdlcywgaV9zdG9yYWdlcywgYnVuZGxlX2lkLCBzYW5kYm94X2lkKQoKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogdHJ1ZSIpCn0KCmFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHBfcHJvY2VzcyA9IiwgcF9wcm9jZXNzKQogICAgcHJpbnQoImFsbG93X3Byb2Nlc3NfY29tbW9uOiBpX3Byb2Nlc3MgPSAiLCBpX3Byb2Nlc3MpCiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHNfbmFtZSA9Iiwgc19uYW1lKQoKICAgIHBfcHJvY2Vzcy5Dd2QgPT0gaV9wcm9jZXNzLkN3ZAogICAgcF9wcm9jZXNzLk5vTmV3UHJpdmlsZWdlcyA9PSBpX3Byb2Nlc3MuTm9OZXdQcml2aWxlZ2VzCgogICAgYWxsb3dfdXNlcihwX3Byb2Nlc3MsIGlfcHJvY2VzcykKICAgIGFsbG93X2VudihwX3Byb2Nlc3MsIGlfcHJvY2Vzcywgc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHRydWUiKQp9CgojIENvbXBhcmUgdGhlIE9DSSBQcm9jZXNzIGZpZWxkIG9mIGEgcG9saWN5IGNvbnRhaW5lciB3aXRoIHRoZSBpbnB1dCBPQ0kgUHJvY2VzcyBmcm9tIGEgQ3JlYXRlQ29udGFpbmVyUmVxdWVzdAphbGxvd19wcm9jZXNzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfcHJvY2Vzczogc3RhcnQiKQoKICAgIGFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgYWxsb3dfY2FwcyhwX3Byb2Nlc3MuQ2FwYWJpbGl0aWVzLCBpX3Byb2Nlc3MuQ2FwYWJpbGl0aWVzKQogICAgcF9wcm9jZXNzLlRlcm1pbmFsID09IGlfcHJvY2Vzcy5UZXJtaW5hbAoKICAgIHByaW50KCJhbGxvd19wcm9jZXNzOiB0cnVlIikKfQoKIyBDb21wYXJlIHRoZSBPQ0kgUHJvY2VzcyBmaWVsZCBvZiBhIHBvbGljeSBjb250YWluZXIgd2l0aCB0aGUgaW5wdXQgcHJvY2VzcyBmaWVsZCBmcm9tIEV4ZWNQcm9jZXNzUmVxdWVzdAphbGxvd19pbnRlcmFjdGl2ZV9wcm9jZXNzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfaW50ZXJhY3RpdmVfcHJvY2Vzczogc3RhcnQiKQoKICAgIGFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgYWxsb3dfZXhlY19jYXBzKGlfcHJvY2Vzcy5DYXBhYmlsaXRpZXMpCgogICAgIyBUaGVzZSBhcmUgY29tbWFuZHMgZW5hYmxlZCB1c2luZyBFeGVjUHJvY2Vzc1JlcXVlc3QgY29tbWFuZHMgYW5kL29yIHJlZ2V4IGZyb20gdGhlIHNldHRpbmdzIGZpbGUuCiAgICAjIFRoZXkgY2FuIGJlIGV4ZWN1dGVkIGludGVyYWN0aXZlbHkgc28gYWxsb3cgdGhlbSB0byB1c2UgYW55IHZhbHVlIGZvciBpX3Byb2Nlc3MuVGVybWluYWwuCgogICAgcHJpbnQoImFsbG93X2ludGVyYWN0aXZlX3Byb2Nlc3M6IHRydWUiKQp9CgojIENvbXBhcmUgdGhlIE9DSSBQcm9jZXNzIGZpZWxkIG9mIGEgcG9saWN5IGNvbnRhaW5lciB3aXRoIHRoZSBpbnB1dCBwcm9jZXNzIGZpZWxkIGZyb20gRXhlY1Byb2Nlc3NSZXF1ZXN0CmFsbG93X3Byb2JlX3Byb2Nlc3MocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19wcm9iZV9wcm9jZXNzOiBzdGFydCIpCgogICAgYWxsb3dfcHJvY2Vzc19jb21tb24ocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpCiAgICBhbGxvd19leGVjX2NhcHMoaV9wcm9jZXNzLkNhcGFiaWxpdGllcykKICAgIHBfcHJvY2Vzcy5UZXJtaW5hbCA9PSBpX3Byb2Nlc3MuVGVybWluYWwKCiAgICBwcmludCgiYWxsb3dfcHJvYmVfcHJvY2VzczogdHJ1ZSIpCn0KCmFsbG93X3VzZXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MpIHsKICAgIHBfdXNlciA6PSBwX3Byb2Nlc3MuVXNlcgogICAgaV91c2VyIDo9IGlfcHJvY2Vzcy5Vc2VyCgogICAgcHJpbnQoImFsbG93X3VzZXI6IGlucHV0IHVpZCA9IiwgaV91c2VyLlVJRCwgInBvbGljeSB1aWQgPSIsIHBfdXNlci5VSUQpCiAgICBwX3VzZXIuVUlEID09IGlfdXNlci5VSUQKCiAgICAjIFRPRE86IHRyYWNrIGRvd24gdGhlIHJlYXNvbiBmb3IgcmVnaXN0cnkuazhzLmlvL3BhdXNlOjMuOSBiZWluZwogICAgIyAgICAgICBleGVjdXRlZCB3aXRoIGdpZCA9IDAgZGVzcGl0ZSBoYXZpbmcgIjY1NTM1OjY1NTM1IiBpbiBpdHMgY29udGFpbmVyIGltYWdlCiAgICAjICAgICAgIGNvbmZpZy4KICAgICNwcmludCgiYWxsb3dfdXNlcjogaW5wdXQgZ2lkID0iLCBpX3VzZXIuR0lELCAicG9saWN5IGdpZCA9IiwgcF91c2VyLkdJRCkKICAgICNwX3VzZXIuR0lEID09IGlfdXNlci5HSUQKCiAgICAjIFRPRE86IGNvbXBhcmUgdGhlIGFkZGl0aW9uYWxHaWRzIGZpZWxkIHRvbyBhZnRlciBjb21wdXRpbmcgaXRzIHZhbHVlCiAgICAjIGJhc2VkIG9uIC9ldGMvcGFzc3dkIGFuZCAvZXRjL2dyb3VwIGZyb20gdGhlIGNvbnRhaW5lciBpbWFnZS4KfQoKYWxsb3dfZGVwcmVjYXRlZF9hcmdzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZ3MgMTogbm8gYXJncyIpCgogICAgbm90IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJncwogICAgbm90IGlfcHJvY2Vzcy5BcmdzCgogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAxOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZ3MocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSkgewogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiBwb2xpY3kgYXJncyA9IiwgcF9wcm9jZXNzLkRlcHJlY2F0ZWRBcmdzKQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiBpbnB1dCBhcmdzID0iLCBpX3Byb2Nlc3MuQXJncykKCiAgICBjb3VudChwX3Byb2Nlc3MuRGVwcmVjYXRlZEFyZ3MpID09IGNvdW50KGlfcHJvY2Vzcy5BcmdzKQoKICAgIGV2ZXJ5IGksIGlfYXJnIGluIGlfcHJvY2Vzcy5BcmdzIHsKICAgICAgICBhbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpCiAgICB9CgogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDE6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgcF9hcmcyIDo9IHJlcGxhY2UocF9hcmcsICIkJCIsICIkIikKICAgIHBfYXJnMiA9PSBpX2FyZwoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAxOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDI6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgIyBUT0RPOiBjYW4gJChub2RlLW5hbWUpIGJlIGhhbmRsZWQgYmV0dGVyPwogICAgY29udGFpbnMocF9hcmcsICIkKG5vZGUtbmFtZSkiKQoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAyOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDM6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgcF9hcmcyIDo9IHJlcGxhY2UocF9hcmcsICIkJCIsICIkIikKICAgIHBfYXJnMyA6PSByZXBsYWNlKHBfYXJnMiwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAzOiBwX2FyZzMgPSIsIHBfYXJnMykKICAgIHBfYXJnMyA9PSBpX2FyZwoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAzOiB0cnVlIikKfQoKIyBPQ0kgcHJvY2Vzcy5FbnYgZmllbGQKYWxsb3dfZW52KHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfZW52OiBwIGVudiA9IiwgcF9wcm9jZXNzLkVudikKICAgIHByaW50KCJhbGxvd19lbnY6IGkgZW52ID0iLCBpX3Byb2Nlc3MuRW52KQoKICAgIGV2ZXJ5IGlfdmFyIGluIGlfcHJvY2Vzcy5FbnYgewogICAgICAgIHByaW50KCJhbGxvd19lbnY6IGlfdmFyID0iLCBpX3ZhcikKICAgICAgICBhbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgfQoKICAgIHByaW50KCJhbGxvd19lbnY6IHRydWUiKQp9CgojIEFsbG93IGlucHV0IGVudiB2YXJpYWJsZXMgdGhhdCBhcmUgcHJlc2VudCBpbiB0aGUgcG9saWN5IGRhdGEgdG9vLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHBfdmFyID09IGlfdmFyCiAgICBwcmludCgiYWxsb3dfdmFyIDE6IHRydWUiKQp9CgojIE1hdGNoIGlucHV0IHdpdGggb25lIG9mIHRoZSBwb2xpY3kgdmFyaWFibGVzLCBhZnRlciBzdWJzdGl0dXRpbmcgJChzYW5kYm94LW5hbWUpLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHByaW50KCJhbGxvd192YXIgMjogcF92YXIgPSIsIHBfdmFyKQoKICAgIHBfdmFyX3NwbGl0IDo9IHNwbGl0KHBfdmFyLCAiPSIpCiAgICBjb3VudChwX3Zhcl9zcGxpdCkgPT0gMgoKICAgIHBfdmFyX3NwbGl0WzFdID09ICIkKHNhbmRib3gtbmFtZSkiCgogICAgaV92YXJfc3BsaXQgOj0gc3BsaXQoaV92YXIsICI9IikKICAgIGNvdW50KGlfdmFyX3NwbGl0KSA9PSAyCgogICAgaV92YXJfc3BsaXRbMF0gPT0gcF92YXJfc3BsaXRbMF0KICAgIHJlZ2V4Lm1hdGNoKHNfbmFtZSwgaV92YXJfc3BsaXRbMV0pCgogICAgcHJpbnQoImFsbG93X3ZhciAyOiB0cnVlIikKfQoKIyBBbGxvdyBpbnB1dCBlbnYgdmFyaWFibGVzIHRoYXQgbWF0Y2ggd2l0aCBhIHJlcXVlc3RfZGVmYXVsdHMgcmVnZXguCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHNvbWUgcF9yZWdleDEgaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5DcmVhdGVDb250YWluZXJSZXF1ZXN0LmFsbG93X2Vudl9yZWdleAogICAgcF9yZWdleDIgOj0gcmVwbGFjZShwX3JlZ2V4MSwgIiQoaXB2NF9hKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcHY0X2EpCiAgICBwX3JlZ2V4MyA6PSByZXBsYWNlKHBfcmVnZXgyLCAiJChpcF9wKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcF9wKQogICAgcF9yZWdleDQgOj0gcmVwbGFjZShwX3JlZ2V4MywgIiQoc3ZjX25hbWUpIiwgcG9saWN5X2RhdGEuY29tbW9uLnN2Y19uYW1lKQogICAgcF9yZWdleDUgOj0gcmVwbGFjZShwX3JlZ2V4NCwgIiQoZG5zX2xhYmVsKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5kbnNfbGFiZWwpCgogICAgcHJpbnQoImFsbG93X3ZhciAzOiBwX3JlZ2V4NSA9IiwgcF9yZWdleDUpCiAgICByZWdleC5tYXRjaChwX3JlZ2V4NSwgaV92YXIpCgogICAgcHJpbnQoImFsbG93X3ZhciAzOiB0cnVlIikKfQoKIyBBbGxvdyBmaWVsZFJlZiAiZmllbGRQYXRoOiBzdGF0dXMucG9kSVAiIHZhbHVlcy4KYWxsb3dfdmFyKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBpX3Zhciwgc19uYW1lLCBzX25hbWVzcGFjZSkgewogICAgbmFtZV92YWx1ZSA6PSBzcGxpdChpX3ZhciwgIj0iKQogICAgY291bnQobmFtZV92YWx1ZSkgPT0gMgogICAgaXNfaXAobmFtZV92YWx1ZVsxXSkKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIGFsbG93X3BvZF9pcF92YXIobmFtZV92YWx1ZVswXSwgcF92YXIpCgogICAgcHJpbnQoImFsbG93X3ZhciA0OiB0cnVlIikKfQoKIyBBbGxvdyBjb21tb24gZmllbGRSZWYgdmFyaWFibGVzLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBuYW1lX3ZhbHVlIDo9IHNwbGl0KGlfdmFyLCAiPSIpCiAgICBjb3VudChuYW1lX3ZhbHVlKSA9PSAyCgogICAgc29tZSBwX3ZhciBpbiBwX3Byb2Nlc3MuRW52CiAgICBwX25hbWVfdmFsdWUgOj0gc3BsaXQocF92YXIsICI9IikKICAgIGNvdW50KHBfbmFtZV92YWx1ZSkgPT0gMgoKICAgIHBfbmFtZV92YWx1ZVswXSA9PSBuYW1lX3ZhbHVlWzBdCgogICAgIyBUT0RPOiBzaG91bGQgdGhlc2UgYmUgaGFuZGxlZCBpbiBhIGRpZmZlcmVudCB3YXk/CiAgICBhbHdheXNfYWxsb3dlZCA6PSBbIiQoaG9zdC1uYW1lKSIsICIkKG5vZGUtbmFtZSkiLCAiJChwb2QtdWlkKSJdCiAgICBzb21lIGFsbG93ZWQgaW4gYWx3YXlzX2FsbG93ZWQKICAgIGNvbnRhaW5zKHBfbmFtZV92YWx1ZVsxXSwgYWxsb3dlZCkKCiAgICBwcmludCgiYWxsb3dfdmFyIDU6IHRydWUiKQp9CgojIEFsbG93IGZpZWxkUmVmICJmaWVsZFBhdGg6IHN0YXR1cy5ob3N0SVAiIHZhbHVlcy4KYWxsb3dfdmFyKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBpX3Zhciwgc19uYW1lLCBzX25hbWVzcGFjZSkgewogICAgbmFtZV92YWx1ZSA6PSBzcGxpdChpX3ZhciwgIj0iKQogICAgY291bnQobmFtZV92YWx1ZSkgPT0gMgogICAgaXNfaXAobmFtZV92YWx1ZVsxXSkKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIGFsbG93X2hvc3RfaXBfdmFyKG5hbWVfdmFsdWVbMF0sIHBfdmFyKQoKICAgIHByaW50KCJhbGxvd192YXIgNjogdHJ1ZSIpCn0KCiMgQWxsb3cgcmVzb3VyY2VGaWVsZFJlZiB2YWx1ZXMgKGUuZy4sICJsaW1pdHMuY3B1IikuCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIG5hbWVfdmFsdWUgOj0gc3BsaXQoaV92YXIsICI9IikKICAgIGNvdW50KG5hbWVfdmFsdWUpID09IDIKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHBfbmFtZV92YWx1ZSA6PSBzcGxpdChwX3ZhciwgIj0iKQogICAgY291bnQocF9uYW1lX3ZhbHVlKSA9PSAyCgogICAgcF9uYW1lX3ZhbHVlWzBdID09IG5hbWVfdmFsdWVbMF0KCiAgICAjIGEgdmFyaWFibGUgd2Ugc2hvdWxkIGJlIHZhbGlkYXRpbmcgdXNpbmcgYSByZWdleCBmcm9tIHNldHRpbmdzCiAgICBwX25hbWVfdmFsdWVbMV0gPT0gIiQodmFsaWRhdGUtZnJvbS1zZXR0aW5ncykiCgogICAgcmVnZXhfdmFsIDo9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuQ3JlYXRlQ29udGFpbmVyUmVxdWVzdC5hbGxvd19lbnZfcmVnZXhfbWFwW25hbWVfdmFsdWVbMF1dCgogICAgcHJpbnQoImFsbG93X3ZhciA3OiB2YWwgPSIsIG5hbWVfdmFsdWVbMV0pCiAgICBwcmludCgiYWxsb3dfdmFyIDc6IHJlZ2V4X3ZhbCA9IiwgcmVnZXhfdmFsKQoKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4X3ZhbCwgbmFtZV92YWx1ZVsxXSkKCiAgICBwcmludCgiYWxsb3dfdmFyIDc6IHRydWUiKQp9CgojIE1hdGNoIGlucHV0IHdpdGggb25lIG9mIHRoZSBwb2xpY3kgdmFyaWFibGVzLCBhZnRlciBzdWJzdGl0dXRpbmcgJChzYW5kYm94LW5hbWVzcGFjZSkuCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHNvbWUgcF92YXIgaW4gcF9wcm9jZXNzLkVudgogICAgcF92YXIyIDo9IHJlcGxhY2UocF92YXIsICIkKHNhbmRib3gtbmFtZXNwYWNlKSIsIHNfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd192YXIgODogcF92YXIyID0iLCBwX3ZhcjIpCiAgICBwX3ZhcjIgPT0gaV92YXIKCiAgICBwcmludCgiYWxsb3dfdmFyIDg6IHRydWUiKQp9CgphbGxvd19wb2RfaXBfdmFyKHZhcl9uYW1lLCBwX3ZhcikgewogICAgcHJpbnQoImFsbG93X3BvZF9pcF92YXI6IHZhcl9uYW1lID0iLCB2YXJfbmFtZSwgInBfdmFyID0iLCBwX3ZhcikKCiAgICBwX25hbWVfdmFsdWUgOj0gc3BsaXQocF92YXIsICI9IikKICAgIGNvdW50KHBfbmFtZV92YWx1ZSkgPT0gMgoKICAgIHBfbmFtZV92YWx1ZVswXSA9PSB2YXJfbmFtZQogICAgcF9uYW1lX3ZhbHVlWzFdID09ICIkKHBvZC1pcCkiCgogICAgcHJpbnQoImFsbG93X3BvZF9pcF92YXI6IHRydWUiKQp9CgphbGxvd19ob3N0X2lwX3Zhcih2YXJfbmFtZSwgcF92YXIpIHsKICAgIHByaW50KCJhbGxvd19ob3N0X2lwX3ZhcjogdmFyX25hbWUgPSIsIHZhcl9uYW1lLCAicF92YXIgPSIsIHBfdmFyKQoKICAgIHBfbmFtZV92YWx1ZSA6PSBzcGxpdChwX3ZhciwgIj0iKQogICAgY291bnQocF9uYW1lX3ZhbHVlKSA9PSAyCgogICAgcF9uYW1lX3ZhbHVlWzBdID09IHZhcl9uYW1lCiAgICBwX25hbWVfdmFsdWVbMV0gPT0gIiQoaG9zdC1pcCkiCgogICAgcHJpbnQoImFsbG93X2hvc3RfaXBfdmFyOiB0cnVlIikKfQoKaXNfaXAodmFsdWUpIHsKICAgIGJ5dGVzID0gc3BsaXQodmFsdWUsICIuIikKICAgIGNvdW50KGJ5dGVzKSA9PSA0CgogICAgaXNfaXBfZmlyc3RfYnl0ZShieXRlc1swXSkKICAgIGlzX2lwX290aGVyX2J5dGUoYnl0ZXNbMV0pCiAgICBpc19pcF9vdGhlcl9ieXRlKGJ5dGVzWzJdKQogICAgaXNfaXBfb3RoZXJfYnl0ZShieXRlc1szXSkKfQppc19pcF9maXJzdF9ieXRlKGNvbXBvbmVudCkgewogICAgbnVtYmVyID0gdG9fbnVtYmVyKGNvbXBvbmVudCkKICAgIG51bWJlciA+PSAxCiAgICBudW1iZXIgPD0gMjU1Cn0KaXNfaXBfb3RoZXJfYnl0ZShjb21wb25lbnQpIHsKICAgIG51bWJlciA9IHRvX251bWJlcihjb21wb25lbnQpCiAgICBudW1iZXIgPj0gMAogICAgbnVtYmVyIDw9IDI1NQp9CgojIE9DSSByb290LlBhdGgKYWxsb3dfcm9vdF9wYXRoKHBfb2NpLCBpX29jaSwgYnVuZGxlX2lkKSB7CiAgICBpX3BhdGggOj0gaV9vY2kuUm9vdC5QYXRoCiAgICBwX3BhdGgxIDo9IHBfb2NpLlJvb3QuUGF0aAogICAgcHJpbnQoImFsbG93X3Jvb3RfcGF0aDogaV9wYXRoID0iLCBpX3BhdGgsICJwX3BhdGgxID0iLCBwX3BhdGgxKQoKICAgIHBfcGF0aDIgOj0gcmVwbGFjZShwX3BhdGgxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfcm9vdF9wYXRoOiBwX3BhdGgyID0iLCBwX3BhdGgyKQoKICAgIHBfcGF0aDMgOj0gcmVwbGFjZShwX3BhdGgyLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X3Jvb3RfcGF0aDogcF9wYXRoMyA9IiwgcF9wYXRoMykKCiAgICBwX3BhdGgzID09IGlfcGF0aAoKICAgIHByaW50KCJhbGxvd19yb290X3BhdGg6IHRydWUiKQp9CgojIGRldmljZSBtb3VudHMKYWxsb3dfbW91bnQocF9vY2ksIGlfbW91bnQsIGlfc3RvcmFnZXMsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcHJpbnQoImFsbG93X21vdW50OiBpX21vdW50ID0iLCBpX21vdW50KQoKICAgIHNvbWUgcF9tb3VudCBpbiBwX29jaS5Nb3VudHMKICAgIHNvbWUgaV9zdG9yYWdlIGluIGlfc3RvcmFnZXMKCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IHBfbW91bnQgPSIsIHBfbW91bnQpCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IGlfc3RvcmFnZSA9IiwgaV9zdG9yYWdlKQoKICAgIGNoZWNrX21vdW50KHBfbW91bnQsIGlfbW91bnQsIGlfc3RvcmFnZSwgYnVuZGxlX2lkLCBzYW5kYm94X2lkKQoKICAgICMgVE9ETzogYXJlIHRoZXJlIGFueSBvdGhlciByZXF1aXJlZCBwb2xpY3kgY2hlY2tzIGZvciBtb3VudHMgLSBlLmcuLAogICAgIyAgICAgICBtdWx0aXBsZSBtb3VudHMgd2l0aCBzYW1lIHNvdXJjZSBvciBkZXN0aW5hdGlvbj8KCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IHRydWUiKQp9CgpjaGVja19tb3VudChwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcF9tb3VudCA9PSBpX21vdW50CiAgICBwcmludCgiY2hlY2tfbW91bnQgMTogdHJ1ZSIpCn0KY2hlY2tfbW91bnQocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHBfbW91bnQuZGVzdGluYXRpb24gPT0gaV9tb3VudC5kZXN0aW5hdGlvbgogICAgcF9tb3VudC50eXBlXyA9PSBpX21vdW50LnR5cGVfCiAgICBwX21vdW50Lm9wdGlvbnMgPT0gaV9tb3VudC5vcHRpb25zCgogICAgbW91bnRfc291cmNlX2FsbG93cyhwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkKCiAgICBwcmludCgiY2hlY2tfbW91bnQgMjogdHJ1ZSIpCn0KCm1vdW50X3NvdXJjZV9hbGxvd3MocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHJlZ2V4MSA6PSBwX21vdW50LnNvdXJjZQogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5tb3VudF9zb3VyY2VfY3BhdGgpCiAgICByZWdleDQgOj0gcmVwbGFjZShyZWdleDMsICIkKGJ1bmRsZS1pZCkiLCBidW5kbGVfaWQpCgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMTogcmVnZXg0ID0iLCByZWdleDQpCiAgICByZWdleC5tYXRjaChyZWdleDQsIGlfbW91bnQuc291cmNlKQoKICAgIHByaW50KCJtb3VudF9zb3VyY2VfYWxsb3dzIDE6IHRydWUiKQp9Cm1vdW50X3NvdXJjZV9hbGxvd3MocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHJlZ2V4MSA6PSBwX21vdW50LnNvdXJjZQogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5tb3VudF9zb3VyY2VfY3BhdGgpCiAgICByZWdleDQgOj0gcmVwbGFjZShyZWdleDMsICIkKHNhbmRib3gtaWQpIiwgc2FuZGJveF9pZCkKCiAgICBwcmludCgibW91bnRfc291cmNlX2FsbG93cyAyOiByZWdleDQgPSIsIHJlZ2V4NCkKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4NCwgaV9tb3VudC5zb3VyY2UpCgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMjogdHJ1ZSIpCn0KbW91bnRfc291cmNlX2FsbG93cyhwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogaV9tb3VudC5zb3VyY2UgPSIsIGlfbW91bnQuc291cmNlKQogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogaV9zdG9yYWdlLm1vdW50X3BvaW50ID0iLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCgogICAgaV9tb3VudC5zb3VyY2UgPT0gaV9zdG9yYWdlLm1vdW50X3BvaW50CgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogdHJ1ZSIpCn0KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBDcmVhdGUgY29udGFpbmVyIFN0b3JhZ2VzCgphbGxvd19zdG9yYWdlcyhwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHBfY291bnQgOj0gY291bnQocF9zdG9yYWdlcykKICAgIGlfY291bnQgOj0gY291bnQoaV9zdG9yYWdlcykKICAgIHByaW50KCJhbGxvd19zdG9yYWdlczogcF9jb3VudCA9IiwgcF9jb3VudCwgImlfY291bnQgPSIsIGlfY291bnQpCgogICAgcF9jb3VudCA9PSBpX2NvdW50CgogICAgIyBHZXQgdGhlIGNvbnRhaW5lciBpbWFnZSBsYXllciBJRHMgYW5kIHZlcml0eSByb290IGhhc2hlcywgZnJvbSB0aGUgIm92ZXJsYXlmcyIgc3RvcmFnZS4KICAgIHNvbWUgb3ZlcmxheV9zdG9yYWdlIGluIHBfc3RvcmFnZXMKICAgIG92ZXJsYXlfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIHByaW50KCJhbGxvd19zdG9yYWdlczogb3ZlcmxheV9zdG9yYWdlID0iLCBvdmVybGF5X3N0b3JhZ2UpCiAgICBjb3VudChvdmVybGF5X3N0b3JhZ2Uub3B0aW9ucykgPT0gMgoKICAgIGxheWVyX2lkcyA6PSBzcGxpdChvdmVybGF5X3N0b3JhZ2Uub3B0aW9uc1swXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiBsYXllcl9pZHMgPSIsIGxheWVyX2lkcykKCiAgICByb290X2hhc2hlcyA6PSBzcGxpdChvdmVybGF5X3N0b3JhZ2Uub3B0aW9uc1sxXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiByb290X2hhc2hlcyA9Iiwgcm9vdF9oYXNoZXMpCgogICAgZXZlcnkgaV9zdG9yYWdlIGluIGlfc3RvcmFnZXMgewogICAgICAgIGFsbG93X3N0b3JhZ2UocF9zdG9yYWdlcywgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpCiAgICB9CgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiB0cnVlIikKfQoKYWxsb3dfc3RvcmFnZShwX3N0b3JhZ2VzLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgc29tZSBwX3N0b3JhZ2UgaW4gcF9zdG9yYWdlcwoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiBwX3N0b3JhZ2UgPSIsIHBfc3RvcmFnZSkKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiBpX3N0b3JhZ2UgPSIsIGlfc3RvcmFnZSkKCiAgICBwX3N0b3JhZ2UuZHJpdmVyICAgICAgICAgICA9PSBpX3N0b3JhZ2UuZHJpdmVyCiAgICBwX3N0b3JhZ2UuZHJpdmVyX29wdGlvbnMgICA9PSBpX3N0b3JhZ2UuZHJpdmVyX29wdGlvbnMKICAgIHBfc3RvcmFnZS5mc19ncm91cCAgICAgICAgID09IGlfc3RvcmFnZS5mc19ncm91cAogICAgcF9zdG9yYWdlLmZzdHlwZSAgICAgICAgICAgPT0gaV9zdG9yYWdlLmZzdHlwZQoKICAgIGFsbG93X3N0b3JhZ2Vfc291cmNlKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKQogICAgYWxsb3dfc3RvcmFnZV9vcHRpb25zKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKQogICAgYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKQoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiB0cnVlIikKfQoKYWxsb3dfc3RvcmFnZV9zb3VyY2UocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX3NvdXJjZSAxOiBzdGFydCIpCgogICAgcF9zdG9yYWdlLnNvdXJjZSA9PSBpX3N0b3JhZ2Uuc291cmNlCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDE6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX3NvdXJjZShwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDI6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCgogICAgIyBEREREOkJCOkRELkY6IERvbWFpbjpCdXM6RGV2aWNlLkZ1bmN0aW9uCiAgICAjIGh0dHBzOi8vd3d3Lmtlcm5lbC5vcmcvZG9jL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtYnVzLXBjaQogICAgcmVnZXgubWF0Y2goYF5bYS1mMC05XXs0fTpbYS1mMC05XXsyfTpbYS1mMC05XXsyfVwuW2EtZjAtOV0kYCwgaV9zdG9yYWdlLnNvdXJjZSkKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9zb3VyY2UgMjogdHJ1ZSIpCn0KCmFsbG93X3N0b3JhZ2Vfc291cmNlKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKSB7CiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9zb3VyY2UgMzogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIGlfc3RvcmFnZS5zb3VyY2UgPT0gIm5vbmUiCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDM6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX3NvdXJjZShwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDQ6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJzbWIiCgogICAgIyBQYXR0ZXJuOiAvLzxzdG9yYWdlLWFjY291bnQtbmFtZT4uZmlsZS5jb3JlLndpbmRvd3MubmV0LzxrOHMtUFZDLW5hbWU+CiAgICAjIFN0b3JhZ2UgYWNjb3VudCBuYW1lOiBodHRwczovL2xlYXJuLm1pY3Jvc29mdC5jb20vZW4tdXMvYXp1cmUvc3RvcmFnZS9jb21tb24vc3RvcmFnZS1hY2NvdW50LW92ZXJ2aWV3I3N0b3JhZ2UtYWNjb3VudC1uYW1lCiAgICAjIEs4cyBQVkMgbmFtZTogaHR0cHM6Ly9rdWJlcm5ldGVzLmlvL2RvY3MvY29uY2VwdHMvb3ZlcnZpZXcvd29ya2luZy13aXRoLW9iamVjdHMvbmFtZXMvI2Rucy1zdWJkb21haW4tbmFtZXMKICAgIHJlZ2V4Lm1hdGNoKGBeXC9cLyhbYS16MC05XXszLDI0fSlcLmZpbGVcLmNvcmVcLndpbmRvd3NcLm5ldFwvW2EtejAtOV0oW2EtejAtOS4tXXswLDI1MX1bYS16MC05XSk/JGAsIGlfc3RvcmFnZS5zb3VyY2UpCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDQ6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMTogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgIT0gIm92ZXJsYXlmcyIKICAgIHBfc3RvcmFnZS5vcHRpb25zID09IGlfc3RvcmFnZS5vcHRpb25zCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAxOiB0cnVlIikKfQphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIGNvdW50KHBfc3RvcmFnZS5vcHRpb25zKSA9PSAyCgogICAgcG9saWN5X2lkcyA6PSBzcGxpdChwX3N0b3JhZ2Uub3B0aW9uc1swXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBwb2xpY3lfaWRzID0iLCBwb2xpY3lfaWRzKQogICAgcG9saWN5X2lkcyA9PSBsYXllcl9pZHMKCiAgICBwb2xpY3lfaGFzaGVzIDo9IHNwbGl0KHBfc3RvcmFnZS5vcHRpb25zWzFdLCAiOiIpCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IHBvbGljeV9oYXNoZXMgPSIsIHBvbGljeV9oYXNoZXMpCgogICAgcF9jb3VudCA6PSBjb3VudChwb2xpY3lfaWRzKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBwX2NvdW50ID0iLCBwX2NvdW50KQogICAgcF9jb3VudCA+PSAxCiAgICBwX2NvdW50ID09IGNvdW50KHBvbGljeV9oYXNoZXMpCgogICAgaV9jb3VudCA6PSBjb3VudChpX3N0b3JhZ2Uub3B0aW9ucykKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogaV9jb3VudCA9IiwgaV9jb3VudCkKICAgIGlfY291bnQgPT0gcF9jb3VudCArIDMKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zWzBdID0iLCBpX3N0b3JhZ2Uub3B0aW9uc1swXSkKICAgIGlfc3RvcmFnZS5vcHRpb25zWzBdID09ICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQubGF5ZXItc3JjLXByZWZpeD0vdmFyL2xpYi9jb250YWluZXJkL2lvLmNvbnRhaW5lcmQuc25hcHNob3R0ZXIudjEudGFyZGV2L2xheWVycyIKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zW2lfY291bnQgLSAyXSA9IiwgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDJdKQogICAgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDJdID09ICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQub3ZlcmxheS1ydyIKCiAgICBsb3dlcmRpciA6PSBjb25jYXQoIj0iLCBbImxvd2VyZGlyIiwgcF9zdG9yYWdlLm9wdGlvbnNbMF1dKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBsb3dlcmRpciA9IiwgbG93ZXJkaXIpCgogICAgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDFdID09IGxvd2VyZGlyCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zW2lfY291bnQgLSAxXSA9IiwgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDFdKQoKICAgIGV2ZXJ5IGksIHBvbGljeV9pZCBpbiBwb2xpY3lfaWRzIHsKICAgICAgICBhbGxvd19vdmVybGF5X2xheWVyKHBvbGljeV9pZCwgcG9saWN5X2hhc2hlc1tpXSwgaV9zdG9yYWdlLm9wdGlvbnNbaSArIDFdKQogICAgfQoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogdHJ1ZSIpCn0KYWxsb3dfc3RvcmFnZV9vcHRpb25zKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKSB7CiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDM6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCiAgICBjb3VudChwX3N0b3JhZ2Uub3B0aW9ucykgPT0gMQoKICAgIHN0YXJ0c3dpdGgocF9zdG9yYWdlLm9wdGlvbnNbMF0sICIkKGhhc2giKQogICAgaGFzaF9zdWZmaXggOj0gdHJpbV9sZWZ0KHBfc3RvcmFnZS5vcHRpb25zWzBdLCAiJChoYXNoIikKCiAgICBlbmRzd2l0aChoYXNoX3N1ZmZpeCwgIikiKQogICAgaGFzaF9pbmRleCA6PSB0cmltX3JpZ2h0KGhhc2hfc3VmZml4LCAiKSIpCiAgICBpIDo9IHRvX251bWJlcihoYXNoX2luZGV4KQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAzOiBpID0iLCBpKQoKICAgIGhhc2hfb3B0aW9uIDo9IGNvbmNhdCgiPSIsIFsiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LnJvb3QtaGFzaCIsIHJvb3RfaGFzaGVzW2ldXSkKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMzogaGFzaF9vcHRpb24gPSIsIGhhc2hfb3B0aW9uKQoKICAgIGNvdW50KGlfc3RvcmFnZS5vcHRpb25zKSA9PSA0CiAgICBpX3N0b3JhZ2Uub3B0aW9uc1swXSA9PSAicm8iCiAgICBpX3N0b3JhZ2Uub3B0aW9uc1sxXSA9PSAiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmJsb2NrX2RldmljZT1maWxlIgogICAgaV9zdG9yYWdlLm9wdGlvbnNbMl0gPT0gImlvLmthdGFjb250YWluZXJzLmZzLW9wdC5pcy1sYXllciIKICAgIGlfc3RvcmFnZS5vcHRpb25zWzNdID09IGhhc2hfb3B0aW9uCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAzOiB0cnVlIikKfQphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgNDogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gInNtYiIKICAgIHBfb3B0c19jb3VudCA6PSBjb3VudChwX3N0b3JhZ2Uub3B0aW9ucykKICAgIGlfb3B0c19jb3VudCA6PSBjb3VudChpX3N0b3JhZ2Uub3B0aW9ucykKICAgIGlfb3B0c19jb3VudCA9PSBwX29wdHNfY291bnQgKyAyCgogICAgaV9vcHRfbWF0Y2hlcyA6PSBbaSB8IGkgOj0gaWR4OyBpZHggPCBwX29wdHNfY291bnQ7IHBfc3RvcmFnZS5vcHRpb25zW2lkeF0gPT0gaV9zdG9yYWdlLm9wdGlvbnNbaWR4XV0KICAgIGNvdW50KGlfb3B0X21hdGNoZXMpID09IHBfb3B0c19jb3VudAoKICAgIHN0YXJ0c3dpdGgoaV9zdG9yYWdlLm9wdGlvbnNbaV9vcHRzX2NvdW50LTJdLCAiYWRkcj0iKQogICAgY3JlZHMgPSBzcGxpdChpX3N0b3JhZ2Uub3B0aW9uc1tpX29wdHNfY291bnQtMV0sICIsIikKICAgIGNvdW50KGNyZWRzKSA9PSAyCiAgICBzdGFydHN3aXRoKGNyZWRzWzBdLCAidXNlcm5hbWU9IikKICAgIHN0YXJ0c3dpdGgoY3JlZHNbMV0sICJwYXNzd29yZD0iKQogICAgCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDQ6IHRydWUiKQp9CgphbGxvd19vdmVybGF5X2xheWVyKHBvbGljeV9pZCwgcG9saWN5X2hhc2gsIGlfb3B0aW9uKSB7CiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogcG9saWN5X2lkID0iLCBwb2xpY3lfaWQsICJwb2xpY3lfaGFzaCA9IiwgcG9saWN5X2hhc2gpCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogaV9vcHRpb24gPSIsIGlfb3B0aW9uKQoKICAgIHN0YXJ0c3dpdGgoaV9vcHRpb24sICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQubGF5ZXI9IikKICAgIGlfdmFsdWUgOj0gcmVwbGFjZShpX29wdGlvbiwgImlvLmthdGFjb250YWluZXJzLmZzLW9wdC5sYXllcj0iLCAiIikKICAgIGlfdmFsdWVfZGVjb2RlZCA6PSBiYXNlNjQuZGVjb2RlKGlfdmFsdWUpCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogaV92YWx1ZV9kZWNvZGVkID0iLCBpX3ZhbHVlX2RlY29kZWQpCgogICAgcG9saWN5X3N1ZmZpeCA6PSBjb25jYXQoIj0iLCBbInRhcixybyxpby5rYXRhY29udGFpbmVycy5mcy1vcHQuYmxvY2tfZGV2aWNlPWZpbGUsaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmlzLWxheWVyLGlvLmthdGFjb250YWluZXJzLmZzLW9wdC5yb290LWhhc2giLCBwb2xpY3lfaGFzaF0pCiAgICBwX3ZhbHVlIDo9IGNvbmNhdCgiLCIsIFtwb2xpY3lfaWQsIHBvbGljeV9zdWZmaXhdKQogICAgcHJpbnQoImFsbG93X292ZXJsYXlfbGF5ZXI6IHBfdmFsdWUgPSIsIHBfdmFsdWUpCgogICAgcF92YWx1ZSA9PSBpX3ZhbHVlX2RlY29kZWQKCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogdHJ1ZSIpCn0KCmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAidGFyIgoKICAgIHN0YXJ0c3dpdGgocF9zdG9yYWdlLm1vdW50X3BvaW50LCAiJChsYXllciIpCiAgICBtb3VudF9zdWZmaXggOj0gdHJpbV9sZWZ0KHBfc3RvcmFnZS5tb3VudF9wb2ludCwgIiQobGF5ZXIiKQoKICAgIGVuZHN3aXRoKG1vdW50X3N1ZmZpeCwgIikiKQogICAgbGF5ZXJfaW5kZXggOj0gdHJpbV9yaWdodChtb3VudF9zdWZmaXgsICIpIikKICAgIGkgOj0gdG9fbnVtYmVyKGxheWVyX2luZGV4KQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDE6IGkgPSIsIGkpCgogICAgbGF5ZXJfaWQgOj0gbGF5ZXJfaWRzW2ldCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMTogbGF5ZXJfaWQgPSIsIGxheWVyX2lkKQoKICAgIHBfbW91bnQgOj0gY29uY2F0KCIvIiwgWyIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L2xheWVycyIsIGxheWVyX2lkXSkKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCAxOiBwX21vdW50ID0iLCBwX21vdW50KQoKICAgIHBfbW91bnQgPT0gaV9zdG9yYWdlLm1vdW50X3BvaW50CgogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDE6IHRydWUiKQp9CmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAiZnVzZTMua2F0YS1vdmVybGF5IgoKICAgIG1vdW50MSA6PSByZXBsYWNlKHBfc3RvcmFnZS5tb3VudF9wb2ludCwgIiQoY3BhdGgpIiwgcG9saWN5X2RhdGEuY29tbW9uLmNwYXRoKQogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDI6IG1vdW50MiA9IiwgbW91bnQyKQoKICAgIG1vdW50MiA9PSBpX3N0b3JhZ2UubW91bnRfcG9pbnQKCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMjogdHJ1ZSIpCn0KYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKSB7CiAgICBwX3N0b3JhZ2UuZnN0eXBlID09ICJsb2NhbCIKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQyID0iLCBtb3VudDIpCgogICAgbW91bnQzIDo9IHJlcGxhY2UobW91bnQyLCAiJChzYW5kYm94LWlkKSIsIHNhbmRib3hfaWQpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQzID0iLCBtb3VudDMpCgogICAgcmVnZXgubWF0Y2gobW91bnQzLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCgogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDM6IHRydWUiKQp9CmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAiYmluZCIKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNDogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNDogbW91bnQyID0iLCBtb3VudDIpCgogICAgbW91bnQzIDo9IHJlcGxhY2UobW91bnQyLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDQ6IG1vdW50MyA9IiwgbW91bnQzKQoKICAgIHJlZ2V4Lm1hdGNoKG1vdW50MywgaV9zdG9yYWdlLm1vdW50X3BvaW50KQoKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA0OiB0cnVlIikKfQphbGxvd19tb3VudF9wb2ludChwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgYnVuZGxlX2lkLCBzYW5kYm94X2lkLCBsYXllcl9pZHMpIHsKICAgIHBfc3RvcmFnZS5mc3R5cGUgPT0gInRtcGZzIgoKICAgIG1vdW50MSA6PSBwX3N0b3JhZ2UubW91bnRfcG9pbnQKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA1OiBtb3VudDEgPSIsIG1vdW50MSkKCiAgICByZWdleC5tYXRjaChtb3VudDEsIGlfc3RvcmFnZS5tb3VudF9wb2ludCkKCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNTogdHJ1ZSIpCn0KYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKSB7CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogaV9zdG9yYWdlLm1vdW50X3BvaW50ID0iLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCiAgICBhbGxvd19kaXJlY3Rfdm9sX2RyaXZlcihwX3N0b3JhZ2UsIGlfc3RvcmFnZSkKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChzcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQyID0iLCBtb3VudDIpCgogICAgZGlyZWN0X3ZvbF9wYXRoIDo9IGlfc3RvcmFnZS5zb3VyY2UKICAgIG1vdW50MyA6PSByZXBsYWNlKG1vdW50MiwgIiQoYjY0LWRpcmVjdC12b2wtcGF0aCkiLCBiYXNlNjR1cmwuZW5jb2RlKGRpcmVjdF92b2xfcGF0aCkpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQzID0iLCBtb3VudDMpCgogICAgbW91bnQzID09IGlfc3RvcmFnZS5tb3VudF9wb2ludAoKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA2OiB0cnVlIikKfQoKYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIocF9zdG9yYWdlLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19kaXJlY3Rfdm9sX2RyaXZlciAxOiBzdGFydCIpCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCiAgICBwcmludCgiYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIgMTogdHJ1ZSIpCn0KYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIocF9zdG9yYWdlLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19kaXJlY3Rfdm9sX2RyaXZlciAyOiBzdGFydCIpCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJzbWIiCiAgICBwcmludCgiYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIgMjogdHJ1ZSIpCn0KCiMgRXhlY1Byb2Nlc3NSZXF1ZXN0LnByb2Nlc3MuQ2FwYWJpbGl0aWVzCmFsbG93X2V4ZWNfY2FwcyhpX2NhcHMpIHsKICAgIG5vdCBpX2NhcHMuQW1iaWVudAogICAgbm90IGlfY2Fwcy5Cb3VuZGluZwogICAgbm90IGlfY2Fwcy5FZmZlY3RpdmUKICAgIG5vdCBpX2NhcHMuSW5oZXJpdGFibGUKICAgIG5vdCBpX2NhcHMuUGVybWl0dGVkCn0KCiMgT0NJLlByb2Nlc3MuQ2FwYWJpbGl0aWVzCmFsbG93X2NhcHMocF9jYXBzLCBpX2NhcHMpIHsKICAgIHByaW50KCJhbGxvd19jYXBzOiBwb2xpY3kgQW1iaWVudCA9IiwgcF9jYXBzLkFtYmllbnQpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgQW1iaWVudCA9IiwgaV9jYXBzLkFtYmllbnQpCiAgICBtYXRjaF9jYXBzKHBfY2Fwcy5BbWJpZW50LCBpX2NhcHMuQW1iaWVudCkKCiAgICBwcmludCgiYWxsb3dfY2FwczogcG9saWN5IEJvdW5kaW5nID0iLCBwX2NhcHMuQm91bmRpbmcpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgQm91bmRpbmcgPSIsIGlfY2Fwcy5Cb3VuZGluZykKICAgIG1hdGNoX2NhcHMocF9jYXBzLkJvdW5kaW5nLCBpX2NhcHMuQm91bmRpbmcpCgogICAgcHJpbnQoImFsbG93X2NhcHM6IHBvbGljeSBFZmZlY3RpdmUgPSIsIHBfY2Fwcy5FZmZlY3RpdmUpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgRWZmZWN0aXZlID0iLCBpX2NhcHMuRWZmZWN0aXZlKQogICAgbWF0Y2hfY2FwcyhwX2NhcHMuRWZmZWN0aXZlLCBpX2NhcHMuRWZmZWN0aXZlKQoKICAgIHByaW50KCJhbGxvd19jYXBzOiBwb2xpY3kgSW5oZXJpdGFibGUgPSIsIHBfY2Fwcy5Jbmhlcml0YWJsZSkKICAgIHByaW50KCJhbGxvd19jYXBzOiBpbnB1dCBJbmhlcml0YWJsZSA9IiwgaV9jYXBzLkluaGVyaXRhYmxlKQogICAgbWF0Y2hfY2FwcyhwX2NhcHMuSW5oZXJpdGFibGUsIGlfY2Fwcy5Jbmhlcml0YWJsZSkKCiAgICBwcmludCgiYWxsb3dfY2FwczogcG9saWN5IFBlcm1pdHRlZCA9IiwgcF9jYXBzLlBlcm1pdHRlZCkKICAgIHByaW50KCJhbGxvd19jYXBzOiBpbnB1dCBQZXJtaXR0ZWQgPSIsIGlfY2Fwcy5QZXJtaXR0ZWQpCiAgICBtYXRjaF9jYXBzKHBfY2Fwcy5QZXJtaXR0ZWQsIGlfY2Fwcy5QZXJtaXR0ZWQpCn0KCm1hdGNoX2NhcHMocF9jYXBzLCBpX2NhcHMpIHsKICAgIHByaW50KCJtYXRjaF9jYXBzIDE6IHN0YXJ0IikKCiAgICBwX2NhcHMgPT0gaV9jYXBzCgogICAgcHJpbnQoIm1hdGNoX2NhcHMgMTogdHJ1ZSIpCn0KbWF0Y2hfY2FwcyhwX2NhcHMsIGlfY2FwcykgewogICAgcHJpbnQoIm1hdGNoX2NhcHMgMjogc3RhcnQiKQoKICAgIGNvdW50KHBfY2FwcykgPT0gMQogICAgcF9jYXBzWzBdID09ICIkKGRlZmF1bHRfY2FwcykiCgogICAgcHJpbnQoIm1hdGNoX2NhcHMgMjogZGVmYXVsdF9jYXBzID0iLCBwb2xpY3lfZGF0YS5jb21tb24uZGVmYXVsdF9jYXBzKQogICAgcG9saWN5X2RhdGEuY29tbW9uLmRlZmF1bHRfY2FwcyA9PSBpX2NhcHMKCiAgICBwcmludCgibWF0Y2hfY2FwcyAyOiB0cnVlIikKfQptYXRjaF9jYXBzKHBfY2FwcywgaV9jYXBzKSB7CiAgICBwcmludCgibWF0Y2hfY2FwcyAzOiBzdGFydCIpCgogICAgY291bnQocF9jYXBzKSA9PSAxCiAgICBwX2NhcHNbMF0gPT0gIiQocHJpdmlsZWdlZF9jYXBzKSIKCiAgICBwcmludCgibWF0Y2hfY2FwcyAzOiBwcml2aWxlZ2VkX2NhcHMgPSIsIHBvbGljeV9kYXRhLmNvbW1vbi5wcml2aWxlZ2VkX2NhcHMpCiAgICBwb2xpY3lfZGF0YS5jb21tb24ucHJpdmlsZWdlZF9jYXBzID09IGlfY2FwcwoKICAgIHByaW50KCJtYXRjaF9jYXBzIDM6IHRydWUiKQp9CgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgpjaGVja19kaXJlY3RvcnlfdHJhdmVyc2FsKGlfcGF0aCkgewogICAgbm90IHJlZ2V4Lm1hdGNoKCIoXnwvKS4uKCR8LykiLCBpX3BhdGgpCn0KCmNoZWNrX3N5bWxpbmtfc291cmNlKGlfc3JjKSB7CiAgICBpX3NyYyA9PSAiIgogICAgcHJpbnQoImNoZWNrX3N5bWxpbmtfc291cmNlIDE6IHRydWUiKQp9CmNoZWNrX3N5bWxpbmtfc291cmNlKGlfc3JjKSB7CiAgICBpX3NyYyAhPSAiIgogICAgcHJpbnQoImNoZWNrX3N5bWxpbmtfc291cmNlIDI6IGlfc3JjID0iLCBpX3NyYykKCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24uc19zb3VyY2UxLCBpX3NyYykKCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMjogdHJ1ZSIpCn0KY2hlY2tfc3ltbGlua19zb3VyY2UoaV9zcmMpIHsKICAgIGlfc3JjICE9ICIiCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMzogaV9zcmMgPSIsIGlfc3JjKQoKICAgIHJlZ2V4Lm1hdGNoKHBvbGljeV9kYXRhLmNvbW1vbi5zX3NvdXJjZTIsIGlfc3JjKQogICAgY2hlY2tfZGlyZWN0b3J5X3RyYXZlcnNhbChpX3NyYykKCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMzogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfc3RvcmFnZXMoaV9zdG9yYWdlcykgewogICAgcHJpbnQoImFsbG93X3NhbmRib3hfc3RvcmFnZXM6IGlfc3RvcmFnZXMgPSIsIGlfc3RvcmFnZXMpCgogICAgcF9zdG9yYWdlcyA6PSBwb2xpY3lfZGF0YS5zYW5kYm94LnN0b3JhZ2VzCiAgICBldmVyeSBpX3N0b3JhZ2UgaW4gaV9zdG9yYWdlcyB7CiAgICAgICAgYWxsb3dfc2FuZGJveF9zdG9yYWdlKHBfc3RvcmFnZXMsIGlfc3RvcmFnZSkKICAgIH0KCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9zdG9yYWdlczogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfc3RvcmFnZShwX3N0b3JhZ2VzLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IGlfc3RvcmFnZSA9IiwgaV9zdG9yYWdlKQoKICAgIHNvbWUgcF9zdG9yYWdlIGluIHBfc3RvcmFnZXMKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IHBfc3RvcmFnZSA9IiwgcF9zdG9yYWdlKQogICAgaV9zdG9yYWdlID09IHBfc3RvcmFnZQoKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IHRydWUiKQp9CgpDb3B5RmlsZVJlcXVlc3QgewogICAgcHJpbnQoIkNvcHlGaWxlUmVxdWVzdDogaW5wdXQucGF0aCA9IiwgaW5wdXQucGF0aCkKCiAgICBjaGVja19zeW1saW5rX3NvdXJjZShpbnB1dC5zeW1saW5rX3NyYykKICAgIGNoZWNrX2RpcmVjdG9yeV90cmF2ZXJzYWwoaW5wdXQucGF0aCkKCiAgICBzb21lIHJlZ2V4MSBpbiBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLkNvcHlGaWxlUmVxdWVzdAogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5jcGF0aCkKICAgIHJlZ2V4NCA6PSByZXBsYWNlKHJlZ2V4MywgIiQoYnVuZGxlLWlkKSIsIEJVTkRMRV9JRCkKICAgIHByaW50KCJDb3B5RmlsZVJlcXVlc3Q6IHJlZ2V4NCA9IiwgcmVnZXg0KQoKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4NCwgaW5wdXQucGF0aCkKCiAgICBwcmludCgiQ29weUZpbGVSZXF1ZXN0OiB0cnVlIikKfQoKQ3JlYXRlU2FuZGJveFJlcXVlc3QgewogICAgcHJpbnQoIkNyZWF0ZVNhbmRib3hSZXF1ZXN0OiBpbnB1dC5ndWVzdF9ob29rX3BhdGggPSIsIGlucHV0Lmd1ZXN0X2hvb2tfcGF0aCkKICAgIGNvdW50KGlucHV0Lmd1ZXN0X2hvb2tfcGF0aCkgPT0gMAoKICAgIHByaW50KCJDcmVhdGVTYW5kYm94UmVxdWVzdDogaW5wdXQua2VybmVsX21vZHVsZXMgPSIsIGlucHV0Lmtlcm5lbF9tb2R1bGVzKQogICAgY291bnQoaW5wdXQua2VybmVsX21vZHVsZXMpID09IDAKCiAgICBpX3BpZG5zIDo9IGlucHV0LnNhbmRib3hfcGlkbnMKICAgIHByaW50KCJDcmVhdGVTYW5kYm94UmVxdWVzdDogaV9waWRucyA9IiwgaV9waWRucykKICAgIGlfcGlkbnMgPT0gZmFsc2UKICAgIGFsbG93X3NhbmRib3hfc3RvcmFnZXMoaW5wdXQuc3RvcmFnZXMpCn0KCmFsbG93X2V4ZWMocF9jb250YWluZXIsIGlfcHJvY2VzcykgewogICAgcHJpbnQoImFsbG93X2V4ZWM6IHN0YXJ0IikKCiAgICBwX29jaSA9IHBfY29udGFpbmVyLk9DSQogICAgcF9zX25hbWUgPSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc19uYW1lc3BhY2UgPSBnZXRfc3RhdGVfdmFsKCJuYW1lc3BhY2UiKQogICAgYWxsb3dfcHJvYmVfcHJvY2VzcyhwX29jaS5Qcm9jZXNzLCBpX3Byb2Nlc3MsIHBfc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfZXhlYzogdHJ1ZSIpCn0KCmFsbG93X2ludGVyYWN0aXZlX2V4ZWMocF9jb250YWluZXIsIGlfcHJvY2VzcykgewogICAgcHJpbnQoImFsbG93X2ludGVyYWN0aXZlX2V4ZWM6IHN0YXJ0IikKCiAgICBwX29jaSA9IHBfY29udGFpbmVyLk9DSQogICAgcF9zX25hbWUgPSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc19uYW1lc3BhY2UgPSBnZXRfc3RhdGVfdmFsKCJuYW1lc3BhY2UiKQogICAgYWxsb3dfaW50ZXJhY3RpdmVfcHJvY2VzcyhwX29jaS5Qcm9jZXNzLCBpX3Byb2Nlc3MsIHBfc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfaW50ZXJhY3RpdmVfZXhlYzogdHJ1ZSIpCn0KCiMgVE9ETzogc2hvdWxkIG90aGVyIEV4ZWNQcm9jZXNzUmVxdWVzdCBpbnB1dCBkYXRhIGZpZWxkcyBiZSB2YWxpZGF0ZWQgYXMgd2VsbD8KRXhlY1Byb2Nlc3NSZXF1ZXN0IHsKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMTogaW5wdXQgPSIsIGlucHV0KQoKICAgIHNvbWUgcF9jb21tYW5kIGluIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuRXhlY1Byb2Nlc3NSZXF1ZXN0LmFsbG93ZWRfY29tbWFuZHMKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMTogcF9jb21tYW5kID0iLCBwX2NvbW1hbmQpCiAgICBwX2NvbW1hbmQgPT0gaW5wdXQucHJvY2Vzcy5BcmdzCgogICAgIyBUT0RPOiBtYXRjaCBwX2NvbnRhaW5lcidzIElEIHdpdGggdGhlIGlucHV0IGNvbnRhaW5lcl9pZC4KICAgIHNvbWUgcF9jb250YWluZXIgaW4gcG9saWN5X2RhdGEuY29udGFpbmVycwogICAgYWxsb3dfaW50ZXJhY3RpdmVfZXhlYyhwX2NvbnRhaW5lciwgaW5wdXQucHJvY2VzcykKCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDE6IHRydWUiKQp9CkV4ZWNQcm9jZXNzUmVxdWVzdCB7CiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDI6IGlucHV0ID0iLCBpbnB1dCkKCiAgICAjIFRPRE86IG1hdGNoIGlucHV0IGNvbnRhaW5lciBJRCB3aXRoIGl0cyBjb3JyZXNwb25kaW5nIGNvbnRhaW5lci5leGVjX2NvbW1hbmRzLgogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBzb21lIHBfY29tbWFuZCBpbiBwX2NvbnRhaW5lci5leGVjX2NvbW1hbmRzCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDI6IHBfY29tbWFuZCA9IiwgcF9jb21tYW5kKQoKICAgICMgVE9ETzogc2hvdWxkIG90aGVyIGlucHV0IGRhdGEgZmllbGRzIGJlIHZhbGlkYXRlZCBhcyB3ZWxsPwogICAgcF9jb21tYW5kID09IGlucHV0LnByb2Nlc3MuQXJncwoKICAgIGFsbG93X2V4ZWMocF9jb250YWluZXIsIGlucHV0LnByb2Nlc3MpCgogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAyOiB0cnVlIikKfQpFeGVjUHJvY2Vzc1JlcXVlc3QgewogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAzOiBpbnB1dCA9IiwgaW5wdXQpCgogICAgaV9jb21tYW5kID0gY29uY2F0KCIgIiwgaW5wdXQucHJvY2Vzcy5BcmdzKQogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAzOiBpX2NvbW1hbmQgPSIsIGlfY29tbWFuZCkKCiAgICBzb21lIHBfcmVnZXggaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5FeGVjUHJvY2Vzc1JlcXVlc3QucmVnZXgKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMzogcF9yZWdleCA9IiwgcF9yZWdleCkKCiAgICByZWdleC5tYXRjaChwX3JlZ2V4LCBpX2NvbW1hbmQpCgogICAgIyBUT0RPOiBtYXRjaCBwX2NvbnRhaW5lcidzIElEIHdpdGggdGhlIGlucHV0IGNvbnRhaW5lcl9pZC4KICAgIHNvbWUgcF9jb250YWluZXIgaW4gcG9saWN5X2RhdGEuY29udGFpbmVycwogICAgYWxsb3dfaW50ZXJhY3RpdmVfZXhlYyhwX2NvbnRhaW5lciwgaW5wdXQucHJvY2VzcykKCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDM6IHRydWUiKQp9CgpVcGRhdGVSb3V0ZXNSZXF1ZXN0IHsKICAgIHByaW50KCJVcGRhdGVSb3V0ZXNSZXF1ZXN0OiBpbnB1dCA9IiwgaW5wdXQpCiAgICBwcmludCgiVXBkYXRlUm91dGVzUmVxdWVzdDogcG9saWN5ID0iLCBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLlVwZGF0ZVJvdXRlc1JlcXVlc3QpCgogICAgaV9yb3V0ZXMgOj0gaW5wdXQucm91dGVzLlJvdXRlcwogICAgcF9zb3VyY2VfcmVnZXggPSBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLlVwZGF0ZVJvdXRlc1JlcXVlc3QuZm9yYmlkZGVuX3NvdXJjZV9yZWdleAogICAgcF9uYW1lcyA9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuVXBkYXRlUm91dGVzUmVxdWVzdC5mb3JiaWRkZW5fZGV2aWNlX25hbWVzCgogICAgZXZlcnkgaV9yb3V0ZSBpbiBpX3JvdXRlcyB7CiAgICAgICAgcHJpbnQoImlfcm91dGUuc291cmNlID0iLCBpX3JvdXRlLnNvdXJjZSkKICAgICAgICBldmVyeSBwX3JlZ2V4IGluIHBfc291cmNlX3JlZ2V4IHsKICAgICAgICAgICAgcHJpbnQoInBfcmVnZXggPSIsIHBfcmVnZXgpCiAgICAgICAgICAgIG5vdCByZWdleC5tYXRjaChwX3JlZ2V4LCBpX3JvdXRlLnNvdXJjZSkKICAgICAgICB9CgogICAgICAgIHByaW50KCJpX3JvdXRlLmRldmljZSA9IiwgaV9yb3V0ZS5kZXZpY2UpCiAgICAgICAgbm90IGlfcm91dGUuZGV2aWNlIGluIHBfbmFtZXMKICAgIH0KCiAgICBwcmludCgiVXBkYXRlUm91dGVzUmVxdWVzdDogdHJ1ZSIpCn0KClVwZGF0ZUludGVyZmFjZVJlcXVlc3QgewogICAgcHJpbnQoIlVwZGF0ZUludGVyZmFjZVJlcXVlc3Q6IGlucHV0ID0iLCBpbnB1dCkKICAgIHByaW50KCJVcGRhdGVJbnRlcmZhY2VSZXF1ZXN0OiBwb2xpY3kgPSIsIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuVXBkYXRlSW50ZXJmYWNlUmVxdWVzdCkKCiAgICBpX2ludGVyZmFjZSA6PSBpbnB1dC5pbnRlcmZhY2UKICAgIHBfZmxhZ3MgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmFsbG93X3Jhd19mbGFncwoKICAgICMgVHlwaWNhbGx5LCBqdXN0IElGRl9OT0FSUCBpcyB1c2VkLgogICAgYml0cy5hbmQoaV9pbnRlcmZhY2UucmF3X2ZsYWdzLCBiaXRzLm5lZ2F0ZShwX2ZsYWdzKSkgPT0gMAoKICAgIHBfbmFtZXMgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmZvcmJpZGRlbl9uYW1lcwoKICAgIG5vdCBpX2ludGVyZmFjZS5uYW1lIGluIHBfbmFtZXMKCiAgICBwX2h3YWRkcnMgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmZvcmJpZGRlbl9od19hZGRycwoKICAgIG5vdCBpX2ludGVyZmFjZS5od0FkZHIgaW4gcF9od2FkZHJzCgogICAgcHJpbnQoIlVwZGF0ZUludGVyZmFjZVJlcXVlc3Q6IHRydWUiKQp9CgpDbG9zZVN0ZGluUmVxdWVzdCB7CiAgICBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLkNsb3NlU3RkaW5SZXF1ZXN0ID09IHRydWUKfQoKUmVhZFN0cmVhbVJlcXVlc3QgewogICAgcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5SZWFkU3RyZWFtUmVxdWVzdCA9PSB0cnVlCn0KClVwZGF0ZUVwaGVtZXJhbE1vdW50c1JlcXVlc3QgewogICAgcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVFcGhlbWVyYWxNb3VudHNSZXF1ZXN0ID09IHRydWUKfQoKV3JpdGVTdHJlYW1SZXF1ZXN0IHsKICAgIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuV3JpdGVTdHJlYW1SZXF1ZXN0ID09IHRydWUKfQoKcG9saWN5X2RhdGEgOj0gewogICJjb250YWluZXJzIjogWwogICAgewogICAgICAiT0NJIjogewogICAgICAgICJWZXJzaW9uIjogIjEuMS4wLXJjLjEiLAogICAgICAgICJQcm9jZXNzIjogewogICAgICAgICAgIlRlcm1pbmFsIjogZmFsc2UsCiAgICAgICAgICAiVXNlciI6IHsKICAgICAgICAgICAgIlVJRCI6IDY1NTM1LAogICAgICAgICAgICAiR0lEIjogNjU1MzUsCiAgICAgICAgICAgICJBZGRpdGlvbmFsR2lkcyI6IFtdLAogICAgICAgICAgICAiVXNlcm5hbWUiOiAiIgogICAgICAgICAgfSwKICAgICAgICAgICJEZXByZWNhdGVkQXJncyI6IFsKICAgICAgICAgICAgIi9wYXVzZSIKICAgICAgICAgIF0sCiAgICAgICAgICAiQXJncyI6IFsKICAgICAgICAgICAgIi9wYXVzZSIKICAgICAgICAgIF0sCiAgICAgICAgICAiRW52IjogWwogICAgICAgICAgICAiUEFUSD0vdXNyL2xvY2FsL3NiaW46L3Vzci9sb2NhbC9iaW46L3Vzci9zYmluOi91c3IvYmluOi9zYmluOi9iaW4iCiAgICAgICAgICBdLAogICAgICAgICAgIkN3ZCI6ICIvIiwKICAgICAgICAgICJDYXBhYmlsaXRpZXMiOiB7CiAgICAgICAgICAgICJBbWJpZW50IjogW10sCiAgICAgICAgICAgICJCb3VuZGluZyI6IFsKICAgICAgICAgICAgICAiJChkZWZhdWx0X2NhcHMpIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiRWZmZWN0aXZlIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJJbmhlcml0YWJsZSI6IFtdLAogICAgICAgICAgICAiUGVybWl0dGVkIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICAiTm9OZXdQcml2aWxlZ2VzIjogdHJ1ZQogICAgICAgIH0sCiAgICAgICAgIlJvb3QiOiB7CiAgICAgICAgICAiUGF0aCI6ICIkKGNwYXRoKS8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgIlJlYWRvbmx5IjogdHJ1ZQogICAgICAgIH0sCiAgICAgICAgIk1vdW50cyI6IFsKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9wcm9jIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJwcm9jIiwKICAgICAgICAgICAgInR5cGVfIjogInByb2MiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2IiwKICAgICAgICAgICAgInNvdXJjZSI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJzdHJpY3RhdGltZSIsCiAgICAgICAgICAgICAgIm1vZGU9NzU1IiwKICAgICAgICAgICAgICAic2l6ZT02NTUzNmsiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L3B0cyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiZGV2cHRzIiwKICAgICAgICAgICAgInR5cGVfIjogImRldnB0cyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJuZXdpbnN0YW5jZSIsCiAgICAgICAgICAgICAgInB0bXhtb2RlPTA2NjYiLAogICAgICAgICAgICAgICJtb2RlPTA2MjAiLAogICAgICAgICAgICAgICJnaWQ9NSIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvc2htIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L3NobSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi9tcXVldWUiLAogICAgICAgICAgICAic291cmNlIjogIm1xdWV1ZSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJtcXVldWUiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvc3lzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJzeXNmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJzeXNmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2V0Yy9yZXNvbHYuY29uZiIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClyZXNvbHYuY29uZiQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJvIiwKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9kZXYiLAogICAgICAgICAgICAgICJub2V4ZWMiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0KICAgICAgICBdLAogICAgICAgICJBbm5vdGF0aW9ucyI6IHsKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmJ1bmRsZV9wYXRoIjogIi9ydW4vY29udGFpbmVyZC9pby5jb250YWluZXJkLnJ1bnRpbWUudjIudGFzay9rOHMuaW8vJChidW5kbGUtaWQpIiwKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIjogInBvZF9zYW5kYm94IiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSI6ICJzYW5kYm94IiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWlkIjogIl5bYS16MC05XXs2NH0kIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWxvZy1kaXJlY3RvcnkiOiAiXi92YXIvbG9nL3BvZHMvJChzYW5kYm94LW5hbWVzcGFjZSlfJChzYW5kYm94LW5hbWUpX1swLTlhLWZdezh9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezEyfSQiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZSI6ICJeZG93bndhcmRhcGlcXC12b2x1bWVcXC1mMjVkNzk0OVxcLWYwM2JcXC00MTk0XFwtYWFiN1xcLWIyYTJmMjEzMmI4MCQiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZXNwYWNlIjogInByb2plY3RlZC0xMzU5IiwKICAgICAgICAgICJuZXJkY3RsL25ldHdvcmstbmFtZXNwYWNlIjogIl4vdmFyL3J1bi9uZXRucy9jbmktWzAtOWEtZl17OH0tWzAtOWEtZl17NH0tWzAtOWEtZl17NH0tWzAtOWEtZl17NH0tWzAtOWEtZl17MTJ9JCIKICAgICAgICB9LAogICAgICAgICJMaW51eCI6IHsKICAgICAgICAgICJOYW1lc3BhY2VzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgIlR5cGUiOiAiaXBjIiwKICAgICAgICAgICAgICAiUGF0aCI6ICIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiVHlwZSI6ICJ1dHMiLAogICAgICAgICAgICAgICJQYXRoIjogIiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJUeXBlIjogIm1vdW50IiwKICAgICAgICAgICAgICAiUGF0aCI6ICIiCiAgICAgICAgICAgIH0KICAgICAgICAgIF0sCiAgICAgICAgICAiTWFza2VkUGF0aHMiOiBbCiAgICAgICAgICAgICIvcHJvYy9hY3BpIiwKICAgICAgICAgICAgIi9wcm9jL2Fzb3VuZCIsCiAgICAgICAgICAgICIvcHJvYy9rY29yZSIsCiAgICAgICAgICAgICIvcHJvYy9rZXlzIiwKICAgICAgICAgICAgIi9wcm9jL2xhdGVuY3lfc3RhdHMiLAogICAgICAgICAgICAiL3Byb2MvdGltZXJfbGlzdCIsCiAgICAgICAgICAgICIvcHJvYy90aW1lcl9zdGF0cyIsCiAgICAgICAgICAgICIvcHJvYy9zY2hlZF9kZWJ1ZyIsCiAgICAgICAgICAgICIvc3lzL2Zpcm13YXJlIiwKICAgICAgICAgICAgIi9wcm9jL3Njc2kiCiAgICAgICAgICBdLAogICAgICAgICAgIlJlYWRvbmx5UGF0aHMiOiBbCiAgICAgICAgICAgICIvcHJvYy9idXMiLAogICAgICAgICAgICAiL3Byb2MvZnMiLAogICAgICAgICAgICAiL3Byb2MvaXJxIiwKICAgICAgICAgICAgIi9wcm9jL3N5cyIsCiAgICAgICAgICAgICIvcHJvYy9zeXNycS10cmlnZ2VyIgogICAgICAgICAgXSwKICAgICAgICAgICJEZXZpY2VzIjogW10sCiAgICAgICAgICAiU3lzY3RsIjogewogICAgICAgICAgICAibmV0LmlwdjQuaXBfdW5wcml2aWxlZ2VkX3BvcnRfc3RhcnQiOiAiMCIsCiAgICAgICAgICAgICJuZXQuaXB2NC5waW5nX2dyb3VwX3JhbmdlIjogIjAgMjE0NzQ4MzY0NyIKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0sCiAgICAgICJzdG9yYWdlcyI6IFsKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoMCkiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXIwKSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogIm92ZXJsYXlmcyIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAiZnVzZTMua2F0YS1vdmVybGF5IiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiNWE1YWFkODAwNTVmZjIwMDEyYTUwZGMyNWY4ZGY3YTI5OTI0NDc0MzI0ZDY1ZjdkNTMwNmVlOGVlMjdmZjcxZCIsCiAgICAgICAgICAgICI4MTcyNTBmMWEzZTMzNmRhNzZmNWJkM2ZhNzg0ZTFiMjZkOTU5YjljMTMxODc2ODE1YmEyNjA0MDQ4YjcwYzE4IgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGNwYXRoKS8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0KICAgICAgXSwKICAgICAgImRldmljZXMiOiBbXSwKICAgICAgInNhbmRib3hfcGlkbnMiOiBmYWxzZSwKICAgICAgImV4ZWNfY29tbWFuZHMiOiBbXSwKICAgICAgImVudl9tYXAiOiB7CiAgICAgICAgIlBBVEgiOiAiL3Vzci9sb2NhbC9zYmluOi91c3IvbG9jYWwvYmluOi91c3Ivc2JpbjovdXNyL2Jpbjovc2JpbjovYmluIgogICAgICB9CiAgICB9LAogICAgewogICAgICAiT0NJIjogewogICAgICAgICJWZXJzaW9uIjogIjEuMS4wLXJjLjEiLAogICAgICAgICJQcm9jZXNzIjogewogICAgICAgICAgIlRlcm1pbmFsIjogZmFsc2UsCiAgICAgICAgICAiVXNlciI6IHsKICAgICAgICAgICAgIlVJRCI6IDAsCiAgICAgICAgICAgICJHSUQiOiAwLAogICAgICAgICAgICAiQWRkaXRpb25hbEdpZHMiOiBbXSwKICAgICAgICAgICAgIlVzZXJuYW1lIjogIiIKICAgICAgICAgIH0sCiAgICAgICAgICAiRGVwcmVjYXRlZEFyZ3MiOiBbCiAgICAgICAgICAgICIvYmluL3NoIgogICAgICAgICAgXSwKICAgICAgICAgICJBcmdzIjogWwogICAgICAgICAgICAiL2Jpbi9zaCIKICAgICAgICAgIF0sCiAgICAgICAgICAiRW52IjogWwogICAgICAgICAgICAiUEFUSD0vdXNyL2xvY2FsL3NiaW46L3Vzci9sb2NhbC9iaW46L3Vzci9zYmluOi91c3IvYmluOi9zYmluOi9iaW4iLAogICAgICAgICAgICAiSE9TVE5BTUU9JChob3N0LW5hbWUpIgogICAgICAgICAgXSwKICAgICAgICAgICJDd2QiOiAiLyIsCiAgICAgICAgICAiQ2FwYWJpbGl0aWVzIjogewogICAgICAgICAgICAiQW1iaWVudCI6IFtdLAogICAgICAgICAgICAiQm91bmRpbmciOiBbCiAgICAgICAgICAgICAgIiQoZGVmYXVsdF9jYXBzKSIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgIkVmZmVjdGl2ZSI6IFsKICAgICAgICAgICAgICAiJChkZWZhdWx0X2NhcHMpIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiSW5oZXJpdGFibGUiOiBbXSwKICAgICAgICAgICAgIlBlcm1pdHRlZCI6IFsKICAgICAgICAgICAgICAiJChkZWZhdWx0X2NhcHMpIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgIk5vTmV3UHJpdmlsZWdlcyI6IGZhbHNlCiAgICAgICAgfSwKICAgICAgICAiUm9vdCI6IHsKICAgICAgICAgICJQYXRoIjogIiQoY3BhdGgpLyQoYnVuZGxlLWlkKSIsCiAgICAgICAgICAiUmVhZG9ubHkiOiBmYWxzZQogICAgICAgIH0sCiAgICAgICAgIk1vdW50cyI6IFsKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9wcm9jIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJwcm9jIiwKICAgICAgICAgICAgInR5cGVfIjogInByb2MiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2IiwKICAgICAgICAgICAgInNvdXJjZSI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJzdHJpY3RhdGltZSIsCiAgICAgICAgICAgICAgIm1vZGU9NzU1IiwKICAgICAgICAgICAgICAic2l6ZT02NTUzNmsiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L3B0cyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiZGV2cHRzIiwKICAgICAgICAgICAgInR5cGVfIjogImRldnB0cyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJuZXdpbnN0YW5jZSIsCiAgICAgICAgICAgICAgInB0bXhtb2RlPTA2NjYiLAogICAgICAgICAgICAgICJtb2RlPTA2MjAiLAogICAgICAgICAgICAgICJnaWQ9NSIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvc2htIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L3NobSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi9tcXVldWUiLAogICAgICAgICAgICAic291cmNlIjogIm1xdWV1ZSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJtcXVldWUiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvc3lzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJzeXNmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJzeXNmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL3N5cy9mcy9jZ3JvdXAiLAogICAgICAgICAgICAic291cmNlIjogImNncm91cCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJjZ3JvdXAiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiLAogICAgICAgICAgICAgICJyZWxhdGltZSIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2V0Yy9ob3N0cyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClob3N0cyQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicnciCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L3Rlcm1pbmF0aW9uLWxvZyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeCl0ZXJtaW5hdGlvbi1sb2ckIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJ3IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2V0Yy9ob3N0bmFtZSIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClob3N0bmFtZSQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicnciCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZXRjL3Jlc29sdi5jb25mIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KXJlc29sdi5jb25mJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJydyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi92YXIvcnVuL3NlY3JldHMva3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudCIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClzZXJ2aWNlYWNjb3VudCQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicm8iCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvdmFyL3J1bi9zZWNyZXRzL2F6dXJlL3Rva2VucyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeCl0b2tlbnMkIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2V0Yy9wb2RpbmZvIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KXBvZGluZm8kIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9CiAgICAgICAgXSwKICAgICAgICAiQW5ub3RhdGlvbnMiOiB7CiAgICAgICAgICAiaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5idW5kbGVfcGF0aCI6ICIvcnVuL2NvbnRhaW5lcmQvaW8uY29udGFpbmVyZC5ydW50aW1lLnYyLnRhc2svazhzLmlvLyQoYnVuZGxlLWlkKSIsCiAgICAgICAgICAiaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5jb250YWluZXJfdHlwZSI6ICJwb2RfY29udGFpbmVyIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItbmFtZSI6ICJjbGllbnQtY29udGFpbmVyIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSI6ICJjb250YWluZXIiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLmltYWdlLW5hbWUiOiAibWNyLm1pY3Jvc29mdC5jb20vYWtzL2UyZS9saWJyYXJ5LWJ1c3lib3g6bWFzdGVyLjIyMDMxNC4xLWxpbnV4LWFtZDY0IiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWlkIjogIl5bYS16MC05XXs2NH0kIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LW5hbWUiOiAiXmRvd253YXJkYXBpXFwtdm9sdW1lXFwtZjI1ZDc5NDlcXC1mMDNiXFwtNDE5NFxcLWFhYjdcXC1iMmEyZjIxMzJiODAkIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LW5hbWVzcGFjZSI6ICJwcm9qZWN0ZWQtMTM1OSIKICAgICAgICB9LAogICAgICAgICJMaW51eCI6IHsKICAgICAgICAgICJOYW1lc3BhY2VzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgIlR5cGUiOiAiaXBjIiwKICAgICAgICAgICAgICAiUGF0aCI6ICIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiVHlwZSI6ICJ1dHMiLAogICAgICAgICAgICAgICJQYXRoIjogIiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJUeXBlIjogIm1vdW50IiwKICAgICAgICAgICAgICAiUGF0aCI6ICIiCiAgICAgICAgICAgIH0KICAgICAgICAgIF0sCiAgICAgICAgICAiTWFza2VkUGF0aHMiOiBbCiAgICAgICAgICAgICIvcHJvYy9hY3BpIiwKICAgICAgICAgICAgIi9wcm9jL2tjb3JlIiwKICAgICAgICAgICAgIi9wcm9jL2tleXMiLAogICAgICAgICAgICAiL3Byb2MvbGF0ZW5jeV9zdGF0cyIsCiAgICAgICAgICAgICIvcHJvYy90aW1lcl9saXN0IiwKICAgICAgICAgICAgIi9wcm9jL3RpbWVyX3N0YXRzIiwKICAgICAgICAgICAgIi9wcm9jL3NjaGVkX2RlYnVnIiwKICAgICAgICAgICAgIi9wcm9jL3Njc2kiLAogICAgICAgICAgICAiL3N5cy9maXJtd2FyZSIKICAgICAgICAgIF0sCiAgICAgICAgICAiUmVhZG9ubHlQYXRocyI6IFsKICAgICAgICAgICAgIi9wcm9jL2Fzb3VuZCIsCiAgICAgICAgICAgICIvcHJvYy9idXMiLAogICAgICAgICAgICAiL3Byb2MvZnMiLAogICAgICAgICAgICAiL3Byb2MvaXJxIiwKICAgICAgICAgICAgIi9wcm9jL3N5cyIsCiAgICAgICAgICAgICIvcHJvYy9zeXNycS10cmlnZ2VyIgogICAgICAgICAgXSwKICAgICAgICAgICJEZXZpY2VzIjogW10sCiAgICAgICAgICAiU3lzY3RsIjogewogICAgICAgICAgICAibmV0LmlwdjQuaXBfdW5wcml2aWxlZ2VkX3BvcnRfc3RhcnQiOiAiMCIsCiAgICAgICAgICAgICJuZXQuaXB2NC5waW5nX2dyb3VwX3JhbmdlIjogIjAgMjE0NzQ4MzY0NyIKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0sCiAgICAgICJzdG9yYWdlcyI6IFsKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoMCkiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXIwKSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoMSkiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXIxKSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogIm92ZXJsYXlmcyIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAiZnVzZTMua2F0YS1vdmVybGF5IiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiMmMzNDJhMTM3ZTY5M2M3ODk4YWVjMzZkYTEwNDdmMTkxZGM3YzE2ODdlNjYxOThhZGFjYzQzOWNmNGFkZjM3OToyNTcwZTNhMTllMWJmMjBkZGRhNDU0OThhOTYyN2Y2MTU1NWQyZDZjMDE0NzliOWI3NjQ2MGI2NzliMjdkNTUyIiwKICAgICAgICAgICAgIjg1NjhjNzBjMGNjZmUwMDUxMDkyZTgxOGRhNzY5MTExYTU5ODgyY2QxOWRkNzk5ZDNiY2E1ZmZhODI3OTEwODA6YjY0M2I2MjE3NzQ4OTgzODMwYjI2YWMxNGEzNWEzMzIyZGQ1MjhjMDA5NjNlYWFkZDkxZWY1NWY1MTNkYzczZiIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChjcGF0aCkvJChidW5kbGUtaWQpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9CiAgICAgIF0sCiAgICAgICJkZXZpY2VzIjogW10sCiAgICAgICJzYW5kYm94X3BpZG5zIjogZmFsc2UsCiAgICAgICJleGVjX2NvbW1hbmRzIjogW10sCiAgICAgICJlbnZfbWFwIjogewogICAgICAgICJIT1NUTkFNRSI6ICIkKGhvc3QtbmFtZSkiLAogICAgICAgICJQQVRIIjogIi91c3IvbG9jYWwvc2JpbjovdXNyL2xvY2FsL2JpbjovdXNyL3NiaW46L3Vzci9iaW46L3NiaW46L2JpbiIKICAgICAgfQogICAgfQogIF0sCiAgImNvbW1vbiI6IHsKICAgICJjcGF0aCI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zaGFyZWQvY29udGFpbmVycyIsCiAgICAibW91bnRfc291cmNlX2NwYXRoIjogIi9ydW4va2F0YS1jb250YWluZXJzL3NoYXJlZC9jb250YWluZXJzIiwKICAgICJzZnByZWZpeCI6ICJeJChjcGF0aCkvJChidW5kbGUtaWQpLVthLXowLTldezE2fS0iLAogICAgInNwYXRoIjogIi9ydW4va2F0YS1jb250YWluZXJzL3NhbmRib3gvc3RvcmFnZSIsCiAgICAiaXB2NF9hIjogIigoWzAtOV18WzEtOV1bMC05XXwxWzAtOV17Mn18MlswLTRdWzAtOV18MjVbMC01XSlcXC4pezN9KFswLTldfFsxLTldWzAtOV18MVswLTldezJ9fDJbMC00XVswLTldfDI1WzAtNV0pIiwKICAgICJpcF9wIjogIlswLTldezEsNX0iLAogICAgInN2Y19uYW1lIjogIltBLVpfXFwuXFwtXSsiLAogICAgImRuc19sYWJlbCI6ICJbYS16QS1aMC05X1xcLlxcLV0rIiwKICAgICJzX3NvdXJjZTEiOiAiXi4uMlswLTldezN9X1swLTFdWzAtOV1fWzAtM11bMC05XV9bMC0yXVswLTldX1swLTVdWzAtOV1fWzAtNV1bMC05XVxcLlswLTldezEsMTB9JCIsCiAgICAic19zb3VyY2UyIjogIl4uLmRhdGEvIiwKICAgICJkbnNfc3ViZG9tYWluIjogIl5bYS16MC05XShbLWEtejAtOV0qW2EtejAtOV0pPyQiLAogICAgInBvZF91aWQiOiAiXlswLTlhLWZBLUZdezh9LVswLTlhLWZBLUZdezR9LVswLTlhLWZBLUZdezR9LVswLTlhLWZBLUZdezR9LVswLTlhLWZBLUZdezEyfSQiLAogICAgImRlZmF1bHRfY2FwcyI6IFsKICAgICAgIkNBUF9DSE9XTiIsCiAgICAgICJDQVBfREFDX09WRVJSSURFIiwKICAgICAgIkNBUF9GU0VUSUQiLAogICAgICAiQ0FQX0ZPV05FUiIsCiAgICAgICJDQVBfTUtOT0QiLAogICAgICAiQ0FQX05FVF9SQVciLAogICAgICAiQ0FQX1NFVEdJRCIsCiAgICAgICJDQVBfU0VUVUlEIiwKICAgICAgIkNBUF9TRVRGQ0FQIiwKICAgICAgIkNBUF9TRVRQQ0FQIiwKICAgICAgIkNBUF9ORVRfQklORF9TRVJWSUNFIiwKICAgICAgIkNBUF9TWVNfQ0hST09UIiwKICAgICAgIkNBUF9LSUxMIiwKICAgICAgIkNBUF9BVURJVF9XUklURSIKICAgIF0sCiAgICAicHJpdmlsZWdlZF9jYXBzIjogWwogICAgICAiQ0FQX0NIT1dOIiwKICAgICAgIkNBUF9EQUNfT1ZFUlJJREUiLAogICAgICAiQ0FQX0RBQ19SRUFEX1NFQVJDSCIsCiAgICAgICJDQVBfRk9XTkVSIiwKICAgICAgIkNBUF9GU0VUSUQiLAogICAgICAiQ0FQX0tJTEwiLAogICAgICAiQ0FQX1NFVEdJRCIsCiAgICAgICJDQVBfU0VUVUlEIiwKICAgICAgIkNBUF9TRVRQQ0FQIiwKICAgICAgIkNBUF9MSU5VWF9JTU1VVEFCTEUiLAogICAgICAiQ0FQX05FVF9CSU5EX1NFUlZJQ0UiLAogICAgICAiQ0FQX05FVF9CUk9BRENBU1QiLAogICAgICAiQ0FQX05FVF9BRE1JTiIsCiAgICAgICJDQVBfTkVUX1JBVyIsCiAgICAgICJDQVBfSVBDX0xPQ0siLAogICAgICAiQ0FQX0lQQ19PV05FUiIsCiAgICAgICJDQVBfU1lTX01PRFVMRSIsCiAgICAgICJDQVBfU1lTX1JBV0lPIiwKICAgICAgIkNBUF9TWVNfQ0hST09UIiwKICAgICAgIkNBUF9TWVNfUFRSQUNFIiwKICAgICAgIkNBUF9TWVNfUEFDQ1QiLAogICAgICAiQ0FQX1NZU19BRE1JTiIsCiAgICAgICJDQVBfU1lTX0JPT1QiLAogICAgICAiQ0FQX1NZU19OSUNFIiwKICAgICAgIkNBUF9TWVNfUkVTT1VSQ0UiLAogICAgICAiQ0FQX1NZU19USU1FIiwKICAgICAgIkNBUF9TWVNfVFRZX0NPTkZJRyIsCiAgICAgICJDQVBfTUtOT0QiLAogICAgICAiQ0FQX0xFQVNFIiwKICAgICAgIkNBUF9BVURJVF9XUklURSIsCiAgICAgICJDQVBfQVVESVRfQ09OVFJPTCIsCiAgICAgICJDQVBfU0VURkNBUCIsCiAgICAgICJDQVBfTUFDX09WRVJSSURFIiwKICAgICAgIkNBUF9NQUNfQURNSU4iLAogICAgICAiQ0FQX1NZU0xPRyIsCiAgICAgICJDQVBfV0FLRV9BTEFSTSIsCiAgICAgICJDQVBfQkxPQ0tfU1VTUEVORCIsCiAgICAgICJDQVBfQVVESVRfUkVBRCIsCiAgICAgICJDQVBfUEVSRk1PTiIsCiAgICAgICJDQVBfQlBGIiwKICAgICAgIkNBUF9DSEVDS1BPSU5UX1JFU1RPUkUiCiAgICBdLAogICAgInZpcnRpb19ibGtfc3RvcmFnZV9jbGFzc2VzIjogWwogICAgICAiY2MtbG9jYWwtY3NpIiwKICAgICAgImNjLW1hbmFnZWQtY3NpIiwKICAgICAgImNjLW1hbmFnZWQtcHJlbWl1bS1jc2kiCiAgICBdLAogICAgInNtYl9zdG9yYWdlX2NsYXNzZXMiOiBbCiAgICAgIHsKICAgICAgICAibmFtZSI6ICJhenVyZWZpbGUtY3NpLWthdGEtY2MiLAogICAgICAgICJtb3VudF9vcHRpb25zIjogWwogICAgICAgICAgImRpcl9tb2RlPTA3NzciLAogICAgICAgICAgImZpbGVfbW9kZT0wNzc3IiwKICAgICAgICAgICJtZnN5bWxpbmtzIiwKICAgICAgICAgICJjYWNoZT1zdHJpY3QiLAogICAgICAgICAgIm5vc2hhcmVzb2NrIiwKICAgICAgICAgICJhY3RpbWVvPTMwIiwKICAgICAgICAgICJub2JybCIKICAgICAgICBdCiAgICAgIH0KICAgIF0KICB9LAogICJzYW5kYm94IjogewogICAgInN0b3JhZ2VzIjogWwogICAgICB7CiAgICAgICAgImRyaXZlciI6ICJlcGhlbWVyYWwiLAogICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICJzb3VyY2UiOiAic2htIiwKICAgICAgICAiZnN0eXBlIjogInRtcGZzIiwKICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAibm9kZXYiLAogICAgICAgICAgIm1vZGU9MTc3NyIsCiAgICAgICAgICAic2l6ZT02NzEwODg2NCIKICAgICAgICBdLAogICAgICAgICJtb3VudF9wb2ludCI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L3NobSIsCiAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICB9CiAgICBdCiAgfSwKICAicmVxdWVzdF9kZWZhdWx0cyI6IHsKICAgICJDcmVhdGVDb250YWluZXJSZXF1ZXN0IjogewogICAgICAiYWxsb3dfZW52X3JlZ2V4IjogWwogICAgICAgICJeSE9TVE5BTUU9JChkbnNfbGFiZWwpJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9QT1JUXyQoaXBfcClfVENQPXRjcDovLyQoaXB2NF9hKTokKGlwX3ApJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9QT1JUXyQoaXBfcClfVENQX1BST1RPPXRjcCQiLAogICAgICAgICJeJChzdmNfbmFtZSlfUE9SVF8kKGlwX3ApX1RDUF9QT1JUPSQoaXBfcCkkIiwKICAgICAgICAiXiQoc3ZjX25hbWUpX1BPUlRfJChpcF9wKV9UQ1BfQUREUj0kKGlwdjRfYSkkIiwKICAgICAgICAiXiQoc3ZjX25hbWUpX1NFUlZJQ0VfSE9TVD0kKGlwdjRfYSkkIiwKICAgICAgICAiXiQoc3ZjX25hbWUpX1NFUlZJQ0VfUE9SVD0kKGlwX3ApJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9TRVJWSUNFX1BPUlRfJChkbnNfbGFiZWwpPSQoaXBfcCkkIiwKICAgICAgICAiXiQoc3ZjX25hbWUpX1BPUlQ9dGNwOi8vJChpcHY0X2EpOiQoaXBfcCkkIiwKICAgICAgICAiXkFaVVJFX0NMSUVOVF9JRD1bQS1GYS1mMC05LV0qJCIsCiAgICAgICAgIl5BWlVSRV9URU5BTlRfSUQ9W0EtRmEtZjAtOS1dKiQiLAogICAgICAgICJeQVpVUkVfRkVERVJBVEVEX1RPS0VOX0ZJTEU9L3Zhci9ydW4vc2VjcmV0cy9henVyZS90b2tlbnMvYXp1cmUtaWRlbnRpdHktdG9rZW4kIiwKICAgICAgICAiXkFaVVJFX0FVVEhPUklUWV9IT1NUPWh0dHBzOi8vbG9naW5cXC5taWNyb3NvZnRvbmxpbmVcXC5jb20vJCIsCiAgICAgICAgIl5URVJNPXh0ZXJtJCIKICAgICAgXSwKICAgICAgImFsbG93X2Vudl9yZWdleF9tYXAiOiB7CiAgICAgICAgIkNQVV9MSU1JVCI6ICJeWzAtOV0rJCIsCiAgICAgICAgIkpPQl9DT01QTEVUSU9OX0lOREVYIjogIl5bMC05XSokIiwKICAgICAgICAiTUVNT1JZX0xJTUlUIjogIl5bMC05XSskIgogICAgICB9CiAgICB9LAogICAgIkNvcHlGaWxlUmVxdWVzdCI6IFsKICAgICAgIiQoc2ZwcmVmaXgpIgogICAgXSwKICAgICJFeGVjUHJvY2Vzc1JlcXVlc3QiOiB7CiAgICAgICJhbGxvd2VkX2NvbW1hbmRzIjogW10sCiAgICAgICJyZWdleCI6IFtdCiAgICB9LAogICAgIlVwZGF0ZVJvdXRlc1JlcXVlc3QiOiB7CiAgICAgICJmb3JiaWRkZW5fZGV2aWNlX25hbWVzIjogWwogICAgICAgICJsbyIKICAgICAgXSwKICAgICAgImZvcmJpZGRlbl9zb3VyY2VfcmVnZXgiOiBbCiAgICAgICAgIl4oPzowezAsNH06KXswLDd9MHswLDN9MSQiLAogICAgICAgICJeMTI3XFwuKD86WzAtOV17MSwzfVxcLil7Mn1bMC05XXsxLDN9JCIKICAgICAgXQogICAgfSwKICAgICJVcGRhdGVJbnRlcmZhY2VSZXF1ZXN0IjogewogICAgICAiYWxsb3dfcmF3X2ZsYWdzIjogMTI4LAogICAgICAiZm9yYmlkZGVuX25hbWVzIjogWwogICAgICAgICJsbyIKICAgICAgXSwKICAgICAgImZvcmJpZGRlbl9od19hZGRycyI6IFsKICAgICAgICAiMDA6MDA6MDA6MDA6MDA6MDAiCiAgICAgIF0KICAgIH0sCiAgICAiQ2xvc2VTdGRpblJlcXVlc3QiOiBmYWxzZSwKICAgICJSZWFkU3RyZWFtUmVxdWVzdCI6IGZhbHNlLAogICAgIlVwZGF0ZUVwaGVtZXJhbE1vdW50c1JlcXVlc3QiOiBmYWxzZSwKICAgICJXcml0ZVN0cmVhbVJlcXVlc3QiOiBmYWxzZQogIH0KfQ== +spec: + runtimeClassName: kata-cc + containers: + - args: + - /bin/sh + image: "mcr.microsoft.com/aks/e2e/library-busybox:master.220314.1-linux-amd64" + imagePullPolicy: IfNotPresent + name: client-container + resources: + limits: + cpu: 1250m + memory: 256Mi + requests: + cpu: 250m + memory: 32Mi + terminationMessagePath: /dev/termination-log + terminationMessagePolicy: File + volumeMounts: + - mountPath: /etc/podinfo + name: podinfo + - mountPath: /var/run/secrets/kubernetes.io/serviceaccount + name: kube-api-access-vttbb + readOnly: true + dnsPolicy: ClusterFirst + enableServiceLinks: true + preemptionPolicy: PreemptLowerPriority + priority: 0 + restartPolicy: Never + schedulerName: default-scheduler + securityContext: {} + serviceAccount: default + serviceAccountName: default + terminationGracePeriodSeconds: 30 + tolerations: + - effect: NoExecute + key: node.kubernetes.io/not-ready + operator: Exists + tolerationSeconds: 300 + - effect: NoExecute + key: node.kubernetes.io/unreachable + operator: Exists + tolerationSeconds: 300 + - effect: NoSchedule + key: node.kubernetes.io/memory-pressure + operator: Exists + volumes: + - downwardAPI: + defaultMode: 420 + items: + - fieldRef: + apiVersion: v1 + fieldPath: metadata.name + path: podname + - path: cpu_limit + resourceFieldRef: + containerName: client-container + divisor: "0" + resource: limits.cpu + - path: cpu_request + resourceFieldRef: + containerName: client-container + divisor: "0" + resource: requests.cpu + - path: memory_limit + resourceFieldRef: + containerName: client-container + divisor: "0" + resource: limits.memory + - path: memory_request + resourceFieldRef: + containerName: client-container + divisor: "0" + resource: requests.memory + name: podinfo + - name: kube-api-access-vttbb + projected: + defaultMode: 420 + sources: + - serviceAccountToken: + expirationSeconds: 3607 + path: token + - configMap: + items: + - key: ca.crt + path: ca.crt + name: kube-root-ca.crt + - downwardAPI: + items: + - fieldRef: + apiVersion: v1 + fieldPath: metadata.namespace + path: namespace +status: {} diff --git a/src/agent/samples/policy/yaml/webhook/webhook-pod5.yaml b/src/agent/samples/policy/yaml/webhook/webhook-pod5.yaml new file mode 100644 index 000000000000..ca107accae73 --- /dev/null +++ b/src/agent/samples/policy/yaml/webhook/webhook-pod5.yaml @@ -0,0 +1,114 @@ +--- +apiVersion: v1 +kind: Namespace +metadata: + name: secrets-7426 +--- +apiVersion: v1 +kind: Secret +metadata: + name: secret-test-3ce4e77c-45b6-4058-ab6e-3a8bf03d410e + namespace: secrets-7426 +data: + data-1: bWVnYV9zZWNyZXRfa2V5Cg== +--- +apiVersion: v1 +kind: Pod +metadata: + creationTimestamp: ~ + managedFields: + - apiVersion: v1 + fieldsType: FieldsV1 + fieldsV1: + "f:spec": + "f:containers": + "k:{\"name\":\"secret-env-test\"}": + ".": {} + "f:command": {} + "f:env": + ".": {} + "k:{\"name\":\"SECRET_DATA\"}": + ".": {} + "f:name": {} + "f:valueFrom": + ".": {} + "f:secretKeyRef": {} + "f:image": {} + "f:imagePullPolicy": {} + "f:name": {} + "f:resources": {} + "f:terminationMessagePath": {} + "f:terminationMessagePolicy": {} + "f:dnsPolicy": {} + "f:enableServiceLinks": {} + "f:restartPolicy": {} + "f:schedulerName": {} + "f:securityContext": {} + "f:terminationGracePeriodSeconds": {} + manager: e2e.test + operation: Update + time: "2023-06-16T18:26:11Z" + name: pod-secrets-a4fbd6f0-741e-44f8-8f26-0bb67906102f + namespace: secrets-7426 + annotations: + io.katacontainers.config.agent.policy: IyBDb3B5cmlnaHQgKGMpIDIwMjMgTWljcm9zb2Z0IENvcnBvcmF0aW9uCiMKIyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMAojCnBhY2thZ2UgYWdlbnRfcG9saWN5CgppbXBvcnQgZnV0dXJlLmtleXdvcmRzLmluCmltcG9ydCBmdXR1cmUua2V5d29yZHMuZXZlcnkKCiMgRGVmYXVsdCB2YWx1ZXMsIHJldHVybmVkIGJ5IE9QQSB3aGVuIHJ1bGVzIGNhbm5vdCBiZSBldmFsdWF0ZWQgdG8gdHJ1ZS4KZGVmYXVsdCBBZGRBUlBOZWlnaGJvcnNSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgQWRkU3dhcFJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBDbG9zZVN0ZGluUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IENvcHlGaWxlUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IENyZWF0ZUNvbnRhaW5lclJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBDcmVhdGVTYW5kYm94UmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IERlc3Ryb3lTYW5kYm94UmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgRXhlY1Byb2Nlc3NSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgR2V0T09NRXZlbnRSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBHdWVzdERldGFpbHNSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBMaXN0SW50ZXJmYWNlc1JlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBMaXN0Um91dGVzUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IE1lbUhvdHBsdWdCeVByb2JlUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IE9ubGluZUNQVU1lbVJlcXVlc3QgOj0gdHJ1ZQpkZWZhdWx0IFBhdXNlQ29udGFpbmVyUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFJlYWRTdHJlYW1SZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgUmVtb3ZlQ29udGFpbmVyUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgUmVtb3ZlU3RhbGVWaXJ0aW9mc1NoYXJlTW91bnRzUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgUmVzZWVkUmFuZG9tRGV2UmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFJlc3VtZUNvbnRhaW5lclJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBTZXRHdWVzdERhdGVUaW1lUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFNldFBvbGljeVJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBTaWduYWxQcm9jZXNzUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgU3RhcnRDb250YWluZXJSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBTdGFydFRyYWNpbmdSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgU3RhdHNDb250YWluZXJSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBTdG9wVHJhY2luZ1JlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBUdHlXaW5SZXNpemVSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBVcGRhdGVDb250YWluZXJSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgVXBkYXRlRXBoZW1lcmFsTW91bnRzUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFVwZGF0ZUludGVyZmFjZVJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBVcGRhdGVSb3V0ZXNSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgV2FpdFByb2Nlc3NSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBXcml0ZVN0cmVhbVJlcXVlc3QgOj0gZmFsc2UKCiMgQWxsb3dSZXF1ZXN0c0ZhaWxpbmdQb2xpY3kgOj0gdHJ1ZSBjb25maWd1cmVzIHRoZSBBZ2VudCB0byAqYWxsb3cgYW55CiMgcmVxdWVzdHMgY2F1c2luZyBhIHBvbGljeSBmYWlsdXJlKi4gVGhpcyBpcyBhbiB1bnNlY3VyZSBjb25maWd1cmF0aW9uCiMgYnV0IGlzIHVzZWZ1bCBmb3IgYWxsb3dpbmcgdW5zZWN1cmUgcG9kcyB0byBzdGFydCwgdGhlbiBjb25uZWN0IHRvCiMgdGhlbSBhbmQgaW5zcGVjdCBPUEEgbG9ncyBmb3IgdGhlIHJvb3QgY2F1c2Ugb2YgYSBmYWlsdXJlLgpkZWZhdWx0IEFsbG93UmVxdWVzdHNGYWlsaW5nUG9saWN5IDo9IGZhbHNlCgojIENvbnN0YW50cwpTX05BTUVfS0VZID0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZSIKU19OQU1FU1BBQ0VfS0VZID0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZXNwYWNlIgpCVU5ETEVfSUQgPSAiW2EtejAtOV17NjR9IgoKQ3JlYXRlQ29udGFpbmVyUmVxdWVzdDo9IHJlc3AgewogICAgbm90IGlzX251bGwoaW5wdXQuZW52X21hcCkKICAgIAogICAgaV9lbnZfbWFwIDo9IGlucHV0LmVudl9tYXAKICAgIAogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBwX2Vudl9tYXAgOj0gcF9jb250YWluZXIuZW52X21hcCAgCiAgICBhbGxvd19lbnZfbWFwKHBfZW52X21hcCwgaV9lbnZfbWFwKQogICAgCiAgICBpX3Byb2Nlc3MgOj0gaW5wdXQuYmFzZS5PQ0kuUHJvY2VzcwogICAgCiAgICBwX3Byb2Nlc3MgOj0gcF9jb250YWluZXIuT0NJLlByb2Nlc3MKICAgIAogICAgYWxsb3dfYXJncyhpX3Byb2Nlc3MsIHBfcHJvY2VzcywgaV9lbnZfbWFwKQoKICAgIHJlc3AgPSBDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uKGlucHV0LmJhc2UpCiAgICBwcmludCgiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdDogdHJ1ZSIpCn0KCmFsbG93X2FyZ3MoaV9wcm9jZXNzLCBwX3Byb2Nlc3MsIGlfZW52X21hcCkgewogICAgaV9hcmdzIDo9IGlfcHJvY2Vzcy5BcmdzCiAgICBwX2FyZ3MgOj0gcF9wcm9jZXNzLkFyZ3MKICAgIHByaW50KCJhbGxvd19hcmdzOiBpX2FyZ3MgPSIsIGlfYXJncywgInBfYXJncyA9IiwgcF9hcmdzKQogICAgY291bnQoaV9hcmdzKSA9PSBjb3VudChwX2FyZ3MpCiAgICBldmVyeSBpLCBpX2FyZyBpbiBpX2FyZ3MgewogICAgICAgIHByaW50KCJhbGxvd19hcmdzOiBpX2FyZyA9IiwgaV9hcmcpCiAgICAgICAgcF9hcmdfcmVwbGFjZWQgOj0gcmVwbGFjZV9lbnZfdmFyaWFibGVzKHBfYXJnc1tpXSwgaV9lbnZfbWFwKQogICAgICAgIHByaW50KCJhbGxvd19hcmdzOiBwX2FyZ19yZXBsYWNlZCA9IiwgcF9hcmdfcmVwbGFjZWQpCiAgICAgICAgcF9hcmdfcmVwbGFjZWQyIDo9IHJlcGxhY2UocF9hcmdfcmVwbGFjZWQsICIkJCIsICIkIikKICAgICAgICBwcmludCgiYWxsb3dfYXJnczogcF9hcmdfcmVwbGFjZWQyID0iLCBwX2FyZ19yZXBsYWNlZDIpCiAgICAgICAgaV9hcmcgPT0gcF9hcmdfcmVwbGFjZWQyCiAgICB9CiAgICBwcmludCgiYWxsb3dfYXJnczogdHJ1ZSIpCn0KCmFsbG93X2FyZ3MoaV9wcm9jZXNzLCBwX3Byb2Nlc3MsIGlfZW52X21hcCkgewogICAgbm90IGlfcHJvY2Vzcy5BcmdzCiAgICBub3QgcF9wcm9jZXNzLkFyZ3MKICAgIHByaW50KCJhbGxvd19hcmdzMjogbm8gYXJncyIpCn0KCiMgdGhpcyBmdW5jdGlvbiByZXBsYWNlcyBhbGwgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyBpbiBhIHN0cmluZywgZ2l2ZW4gYSBtYXAgb2YgZW52aXJvbm1lbnQga2V5cyB0byBlbnZpcm9ubWVudCB2YWx1ZXMKIyBlZyBzdHIgPSAiZWNobyAkKENMVVNURVJfSUQpOyBlY2hvICQoTk9ERV9OQU1FKTsiCiMgZW52X21hcCA9IHsiQ0xVU1RFUl9JRCI6ICJhYmMiLCAiTk9ERV9OQU1FIiA6ICJ4eXoifQojIHJlc3VsdCA9ICJlY2hvIGFiYzsgZWNobyB4eXo7IgpyZXBsYWNlX2Vudl92YXJpYWJsZXMoc3RyLCBlbnZfbWFwKSA9IHJlc3VsdCB7CiAgICAjIG1ha2UgYW4gYXJyYXkgb2YgdGhlIGtleXMgZWcgWyJDTFVTVEVSX0lEIiwgIk5PREVfTkFNRSJdCiAgICBrZXlzIDo9IFt4IHwgc29tZSB4IGluIG9iamVjdC5rZXlzKGVudl9tYXApXQogICAgcmVzdWx0IDo9IHJlcGxhY2Vfc3RyX3JlYyhzdHIsIGVudl9tYXAsIGtleXMsIGNvdW50KGtleXMpIC0gMSkKfQoKIyBiYXNlIGNhc2UKcmVwbGFjZV9zdHJfcmVjKHN0ciwgZW52X21hcCwgYXJyX2tleXMsIGkpID0gcmVzdWx0IHsKICAgIGkgPCAwCiAgICByZXN1bHQgOj0gc3RyCn0KCiMgcmVjdXJzaXZlIHN0ZXAKcmVwbGFjZV9zdHJfcmVjKHN0ciwgZW52X21hcCwgYXJyX2tleXMsIGkpID0gcmVzdWx0IHsKICAgIGkgPj0gMAogICAga2V5IDo9IGFycl9rZXlzW2ldCiAgICBlbnZfa2V5MSA6PSBjb25jYXQoIiIsIFsiJCgiLCBrZXksICIpIl0pCiAgICAjIHJlcGxhY2UgJChWQVIpIHdpdGggdmFsdWUKICAgIG5ld19zdHIxIDo9IHJlcGxhY2Uoc3RyLCBlbnZfa2V5MSwgZW52X21hcFtrZXldKQogICAgIyByZXBsYWNlIG5leHQgZW52aXJvbm1lbnQgdmFyaWFibGUKICAgIHJlc3VsdCA9IHJlcGxhY2Vfc3RyX3JlYyhuZXdfc3RyMSwgZW52X21hcCwgYXJyX2tleXMsIGkgLSAxKQp9CgphbGxvd19lbnZfbWFwKHBfZW52X21hcCwgaV9lbnZfbWFwKSB7CiAgICBwcmludCgiYWxsb3dfZW52X21hcDogcF9lbnZfbWFwID0iLCBwX2Vudl9tYXApCiAgICBldmVyeSBlbnZfa2V5LCBlbnZfdmFsIGluIGlfZW52X21hcCB7CiAgICAgICAgcHJpbnQoImFsbG93X2VudjogZW52X2tleSA9IiwgZW52X2tleSwgImVudl92YWwgPSIsIGVudl92YWwpCiAgICAgICAgYWxsb3dfZW52X21hcF9lbnRyeShlbnZfa2V5LCBlbnZfdmFsLCBwX2Vudl9tYXApCiAgICB9CiAgICBwcmludCgiYWxsb3dfZW52X21hcDogdHJ1ZSIpCn0KCiMgQWxsb3cgZXhhY3QgbWF0Y2gKYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBpX3ZhbCA9PSBwX3ZhbAogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnk6IHRydWUiKQp9CgojIEFsbG93IHJlc291cmNlRmllbGRSZWYgdmFsdWVzIChlLmcuLCAibGltaXRzLmNwdSIpLgphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgICMgYSB2YXJpYWJsZSB3ZSBzaG91bGQgYmUgdmFsaWRhdGluZyB1c2luZyBhIHJlZ2V4IGZyb20gc2V0dGluZ3MKICAgIHBfdmFsID09ICIkKHZhbGlkYXRlLWZyb20tc2V0dGluZ3MpIgogICAgcmVnZXhfdmFsIDo9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuQ3JlYXRlQ29udGFpbmVyUmVxdWVzdC5hbGxvd19lbnZfcmVnZXhfbWFwW2tleV0KICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4X3ZhbCwgaV92YWwpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSAyOiB0cnVlIikKfQoKIyBBbGxvdyBub2RlLW5hbWUKYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChub2RlLW5hbWUpIgogICAgcmVnZXgubWF0Y2gocG9saWN5X2RhdGEuY29tbW9uLmRuc19zdWJkb21haW4gLCBpX3ZhbCkKICAgIHByaW50KCJhbGxvd19lbnZfbWFwX2VudHJ5IDM6IHRydWUiKQp9CgojIEFsbG93IGhvc3QtbmFtZQphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgIHBfdmFsID09ICIkKGhvc3QtbmFtZSkiCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24uZG5zX2xhYmVsICwgaV92YWwpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSA0OiB0cnVlIikKfQoKIyBBbGxvdyBwb2QtdWlkCmFsbG93X2Vudl9tYXBfZW50cnkoa2V5LCBpX3ZhbCwgcF9lbnZfbWFwKSB7CiAgICBwX3ZhbCA6PSBwX2Vudl9tYXBba2V5XQogICAgcF92YWwgPT0gIiQocG9kLXVpZCkiCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24ucG9kX3VpZCAsIGlfdmFsKQogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgNTogdHJ1ZSIpCn0KCiMgQWxsb3cgZmllbGRSZWYgImZpZWxkUGF0aDogc3RhdHVzLnBvZElQIiB2YWx1ZXMuCmFsbG93X2Vudl9tYXBfZW50cnkoa2V5LCBpX3ZhbCwgcF9lbnZfbWFwKSB7CiAgICBpc19pcChpX3ZhbCkKCiAgICBwX3ZhbCA6PSBwX2Vudl9tYXBba2V5XQogICAgcF92YXIgOj0gY29uY2F0KCI9IiwgW2tleSwgcF92YWxdKQogICAgYWxsb3dfcG9kX2lwX3ZhcihrZXksIHBfdmFyKQogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgNjogdHJ1ZSIpCn0KCiMgQWxsb3cgZmllbGRSZWYgImZpZWxkUGF0aDogc3RhdHVzLmhvc3RJUCIgdmFsdWVzLgphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgaXNfaXAoaV92YWwpCgogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgIHBfdmFyIDo9IGNvbmNhdCgiPSIsIFtrZXksIHBfdmFsXSkKICAgIGFsbG93X2hvc3RfaXBfdmFyKGtleSwgcF92YXIpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSA3OiB0cnVlIikKfQoKIyBNYXRjaCBpbnB1dCB3aXRoIG9uZSBvZiB0aGUgcG9saWN5IHZhcmlhYmxlcywgYWZ0ZXIgc3Vic3RpdHV0aW5nICQoc2FuZGJveC1uYW1lKS4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChzYW5kYm94LW5hbWUpIgogICAgc19uYW1lIDo9IGlucHV0LmJhc2UuT0NJLkFubm90YXRpb25zW1NfTkFNRV9LRVldCiAgICBwX3ZhcjIgOj0gcmVwbGFjZShwX3ZhbCwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHBfdmFyMiA9PSBpX3ZhbAogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgODogdHJ1ZSIpCn0KCiMgTWF0Y2ggaW5wdXQgd2l0aCBvbmUgb2YgdGhlIHBvbGljeSB2YXJpYWJsZXMsIGFmdGVyIHN1YnN0aXR1dGluZyAkKHNhbmRib3gtbmFtZXNwYWNlKS4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChzYW5kYm94LW5hbWVzcGFjZSkiCiAgICBzX25hbWVzcGFjZSA6PSBpbnB1dC5iYXNlLk9DSS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwX3ZhcjIgOj0gcmVwbGFjZShwX3ZhbCwgIiQoc2FuZGJveC1uYW1lc3BhY2UpIiwgc19uYW1lc3BhY2UpCiAgICBwX3ZhcjIgPT0gaV92YWwKICAgIHByaW50KCJhbGxvd19lbnZfbWFwX2VudHJ5IDk6IHRydWUiKQp9CgojIEFsbG93IGlucHV0IGVudiB2YXJpYWJsZXMgdGhhdCBtYXRjaCB3aXRoIGEgcmVxdWVzdF9kZWZhdWx0cyByZWdleC4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHNvbWUgcF9yZWdleDEgaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5DcmVhdGVDb250YWluZXJSZXF1ZXN0LmFsbG93X2Vudl9yZWdleAogICAgcF9yZWdleDIgOj0gcmVwbGFjZShwX3JlZ2V4MSwgIiQoaXB2NF9hKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcHY0X2EpCiAgICBwX3JlZ2V4MyA6PSByZXBsYWNlKHBfcmVnZXgyLCAiJChpcF9wKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcF9wKQogICAgcF9yZWdleDQgOj0gcmVwbGFjZShwX3JlZ2V4MywgIiQoc3ZjX25hbWUpIiwgcG9saWN5X2RhdGEuY29tbW9uLnN2Y19uYW1lKQogICAgcF9yZWdleDUgOj0gcmVwbGFjZShwX3JlZ2V4NCwgIiQoZG5zX2xhYmVsKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5kbnNfbGFiZWwpCgogICAgcmVzdWx0IDo9IGNvbmNhdCgiPSIsIFtrZXksIGlfdmFsXSkKICAgIHJlZ2V4Lm1hdGNoKHBfcmVnZXg1LCByZXN1bHQpCgogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgMTA6IHRydWUiKQp9CgpDcmVhdGVDb250YWluZXJSZXF1ZXN0Oj0gcmVzcCB7CiAgICBub3QgaW5wdXQuZW52X21hcAogICAgaV9wcm9jZXNzID0gaW5wdXQuT0NJLlByb2Nlc3MKICAgIHNfbmFtZSA9IGlucHV0Lk9DSS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBwX3Byb2Nlc3MgPSBwX2NvbnRhaW5lci5PQ0kuUHJvY2VzcwogICAgYWxsb3dfZGVwcmVjYXRlZF9hcmdzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUpCiAgICByZXNwID0gQ3JlYXRlQ29udGFpbmVyUmVxdWVzdENvbW1vbihpbnB1dCkKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0MjogdHJ1ZSIpCn0KCkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb24ocmVxKTo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgICMgQ2hlY2sgaWYgdGhlIGlucHV0IHJlcXVlc3Qgc2hvdWxkIGJlIHJlamVjdGVkIGV2ZW4gYmVmb3JlIGNoZWNraW5nIHRoZQogICAgIyBwb2xpY3lfZGF0YS5jb250YWluZXJzIGluZm9ybWF0aW9uLgogICAgYWxsb3dfY3JlYXRlX2NvbnRhaW5lcl9pbnB1dChyZXEpCgogICAgaV9vY2kgOj0gcmVxLk9DSQogICAgaV9zdG9yYWdlcyA6PSByZXEuc3RvcmFnZXMKICAgIGlfZGV2aWNlcyA6PSByZXEuZGV2aWNlcwoKICAgICMgYXJyYXkgb2YgcG9zc2libGUgc3RhdGUgb3BlcmF0aW9ucwogICAgb3BzX2J1aWxkZXIgOj0gW10KCiAgICAjIGNoZWNrIHNhbmRib3ggbmFtZQogICAgc2FuZGJveF9uYW1lID0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FX0tFWV0KICAgIGFkZF9zYW5kYm94X25hbWVfdG9fc3RhdGUgOj0gc3RhdGVfYWxsb3dzKCJzYW5kYm94X25hbWUiLCBzYW5kYm94X25hbWUpCiAgICBvcHNfYnVpbGRlcjEgOj0gY29uY2F0X29wX2lmX25vdF9udWxsKG9wc19idWlsZGVyLCBhZGRfc2FuZGJveF9uYW1lX3RvX3N0YXRlKQoKICAgICMgQ2hlY2sgaWYgYW55IGVsZW1lbnQgZnJvbSB0aGUgcG9saWN5X2RhdGEuY29udGFpbmVycyBhcnJheSBhbGxvd3MgdGhlIGlucHV0IHJlcXVlc3QuCiAgICBzb21lIHBfY29udGFpbmVyIGluIHBvbGljeV9kYXRhLmNvbnRhaW5lcnMKICAgIHByaW50KCI9PT09PT09PSBDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiB0cnlpbmcgbmV4dCBwb2xpY3kgY29udGFpbmVyIikKCiAgICBwX3BpZG5zIDo9IHBfY29udGFpbmVyLnNhbmRib3hfcGlkbnMKICAgIGlfcGlkbnMgOj0gcmVxLnNhbmRib3hfcGlkbnMKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiBwX3BpZG5zID0iLCBwX3BpZG5zLCAiaV9waWRucyA9IiwgaV9waWRucykKICAgIHBfcGlkbnMgPT0gaV9waWRucwoKICAgIHBfb2NpIDo9IHBfY29udGFpbmVyLk9DSQoKICAgICMgY2hlY2sgbmFtZXNwYWNlCiAgICBwX25hbWVzcGFjZSA6PSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBpX25hbWVzcGFjZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwcmludCAoIkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb246IHBfbmFtZXNwYWNlID0iLCBwX25hbWVzcGFjZSwgImlfbmFtZXNwYWNlID0iLCBpX25hbWVzcGFjZSkKICAgIGFkZF9uYW1lc3BhY2VfdG9fc3RhdGUgOj0gYWxsb3dfbmFtZXNwYWNlKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkKICAgIG9wc19idWlsZGVyMiA6PSBjb25jYXRfb3BfaWZfbm90X251bGwob3BzX2J1aWxkZXIxLCBhZGRfbmFtZXNwYWNlX3RvX3N0YXRlKQoKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiBwIFZlcnNpb24gPSIsIHBfb2NpLlZlcnNpb24sICJpIFZlcnNpb24gPSIsIGlfb2NpLlZlcnNpb24pCiAgICBwX29jaS5WZXJzaW9uID09IGlfb2NpLlZlcnNpb24KCiAgICBwcmludCgiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdENvbW1vbjogcCBSZWFkb25seSA9IiwgcF9vY2kuUm9vdC5SZWFkb25seSwgImkgUmVhZG9ubHkgPSIsIGlfb2NpLlJvb3QuUmVhZG9ubHkpCiAgICBwX29jaS5Sb290LlJlYWRvbmx5ID09IGlfb2NpLlJvb3QuUmVhZG9ubHkKCiAgICBhbGxvd19hbm5vKHBfb2NpLCBpX29jaSkKCiAgICBwX3N0b3JhZ2VzIDo9IHBfY29udGFpbmVyLnN0b3JhZ2VzCiAgICBhbGxvd19ieV9hbm5vKHBfb2NpLCBpX29jaSwgcF9zdG9yYWdlcywgaV9zdG9yYWdlcykKCiAgICBwX2RldmljZXMgOj0gcF9jb250YWluZXIuZGV2aWNlcwogICAgYWxsb3dfZGV2aWNlcyhwX2RldmljZXMsIGlfZGV2aWNlcykKCiAgICByZXQgOj0gYWxsb3dfbGludXgob3BzX2J1aWxkZXIyLCBwX29jaSwgaV9vY2kpCiAgICByZXQuYWxsb3dlZAoKICAgIG9wcyA6PSByZXQub3BzCgogICAgcHJpbnQoIkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb246IHRydWUiKQp9CgphbGxvd19jcmVhdGVfY29udGFpbmVyX2lucHV0KHJlcSkgewogICAgcHJpbnQoImFsbG93X2NyZWF0ZV9jb250YWluZXJfaW5wdXQ6IGlucHV0ID0iLCByZXEpCgogICAgY291bnQocmVxLnNoYXJlZF9tb3VudHMpID09IDAKICAgIGlzX251bGwocmVxLnN0cmluZ191c2VyKQoKICAgIGlfb2NpIDo9IHJlcS5PQ0kKICAgIGlzX251bGwoaV9vY2kuSG9va3MpCiAgICBpc19udWxsKGlfb2NpLlNvbGFyaXMpCiAgICBpc19udWxsKGlfb2NpLldpbmRvd3MpCgogICAgaV9saW51eCA6PSBpX29jaS5MaW51eAogICAgY291bnQoaV9saW51eC5HSURNYXBwaW5ncykgPT0gMAogICAgY291bnQoaV9saW51eC5Nb3VudExhYmVsKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlJlc291cmNlcy5EZXZpY2VzKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlJvb3Rmc1Byb3BhZ2F0aW9uKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlVJRE1hcHBpbmdzKSA9PSAwCiAgICBpc19udWxsKGlfbGludXguSW50ZWxSZHQpCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLkJsb2NrSU8pCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLk5ldHdvcmspCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLlBpZHMpCiAgICBpc19udWxsKGlfbGludXguU2VjY29tcCkKCiAgICBpX3Byb2Nlc3MgOj0gaV9vY2kuUHJvY2VzcwogICAgY291bnQoaV9wcm9jZXNzLlNlbGludXhMYWJlbCkgPT0gMAogICAgY291bnQoaV9wcm9jZXNzLlVzZXIuVXNlcm5hbWUpID09IDAKCiAgICBwcmludCgiYWxsb3dfY3JlYXRlX2NvbnRhaW5lcl9pbnB1dDogdHJ1ZSIpCn0KCmFsbG93X25hbWVzcGFjZShwX25hbWVzcGFjZSwgaV9uYW1lc3BhY2UpID0gYWRkX25hbWVzcGFjZSB7CiAgICBwX25hbWVzcGFjZSA9PSBpX25hbWVzcGFjZQogICAgYWRkX25hbWVzcGFjZSA6PSBudWxsCiAgICBwcmludCgiYWxsb3dfbmFtZXNwYWNlIDE6IGlucHV0IG5hbWVzcGFjZSBtYXRjaGVzIHBvbGljeSBkYXRhIikKfQoKYWxsb3dfbmFtZXNwYWNlKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkgPSBhZGRfbmFtZXNwYWNlIHsKICAgIHBfbmFtZXNwYWNlID09ICIiCiAgICBwcmludCgiYWxsb3dfbmFtZXNwYWNlIDI6IG5vIG5hbWVzcGFjZSBmb3VuZCBvbiBwb2xpY3kgZGF0YSIpCiAgICBhZGRfbmFtZXNwYWNlIDo9IHN0YXRlX2FsbG93cygibmFtZXNwYWNlIiwgaV9uYW1lc3BhY2UpCn0KCiMgdmFsdWUgaGFzbid0IGJlZW4gc2VlbiBiZWZvcmUsIHNhdmUgaXQgdG8gc3RhdGUKc3RhdGVfYWxsb3dzKGtleSwgdmFsdWUpID0gYWN0aW9uIHsKICBzdGF0ZSA6PSBnZXRfc3RhdGUoKQogIHByaW50KCJzdGF0ZV9hbGxvd3MgMTogc3RhdGVba2V5XSA9Iiwgc3RhdGVba2V5XSwgInZhbHVlID0iLCB2YWx1ZSkKICBub3Qgc3RhdGVba2V5XQogIHByaW50KCJzdGF0ZV9hbGxvd3MgMTogc2F2aW5nIHRvIHN0YXRlIGtleSA9Iiwga2V5LCAidmFsdWUgPSIsIHZhbHVlKQogIHBhdGggOj0gZ2V0X3N0YXRlX3BhdGgoa2V5KSAKICBhY3Rpb24gOj0gewogICAgIm9wIjogImFkZCIsCiAgICAicGF0aCI6IHBhdGgsIAogICAgInZhbHVlIjogdmFsdWUsCiAgfQp9CgojIHZhbHVlIG1hdGNoZXMgd2hhdCdzIGluIHN0YXRlLCBhbGxvdyBpdApzdGF0ZV9hbGxvd3Moa2V5LCB2YWx1ZSkgPSBhY3Rpb24gewogIHByaW50KCJzdGF0ZV9hbGxvd3MgMjogc3RhcnQiKQogIHN0YXRlIDo9IGdldF9zdGF0ZSgpCiAgcHJpbnQoInN0YXRlX2FsbG93cyAyOiBzdGF0ZVtrZXldID0iLCBzdGF0ZVtrZXldLCAidmFsdWUgPSIsIHZhbHVlKQogIHZhbHVlID09IHN0YXRlW2tleV0KICBwcmludCgic3RhdGVfYWxsb3dzIDI6IGZvdW5kIGtleSA9Iiwga2V5LCAidmFsdWUgPSIsIHZhbHVlLCAiIGluIHN0YXRlIikKICBhY3Rpb24gOj0gbnVsbAp9CgojIGhlbHBlciBmdW5jdGlvbnMgdG8gaW50ZXJhY3Qgd2l0aCB0aGUgc3RhdGUKZ2V0X3N0YXRlKCkgPSBzdGF0ZSB7CiAgc3RhdGUgOj0gZGF0YVsicHN0YXRlIl0KfQoKZ2V0X3N0YXRlX3ZhbChrZXkpID0gdmFsdWUgewogICAgc3RhdGUgOj0gZ2V0X3N0YXRlKCkKICAgIHZhbHVlIDo9IHN0YXRlW2tleV0KfQoKZ2V0X3N0YXRlX3BhdGgoa2V5KSA9IHBhdGggewogICAgIyBwcmVwZW5kICIvcHN0YXRlLyIgdG8ga2V5CiAgICBwYXRoIDo9IGNvbmNhdCgiLyIsIFsiL3BzdGF0ZSIsIGtleV0pCn0KCiMgSGVscGVyIGZ1bmN0aW9ucyB0byBjb25kaXRpb25hbGx5IGNvbmNhdGVuYXRlIG9wIGlzIG5vdCBudWxsCmNvbmNhdF9vcF9pZl9ub3RfbnVsbChvcHMsIG9wKSA9IHJlc3VsdCB7CiAgICBvcCA9PSBudWxsCiAgICByZXN1bHQgOj0gb3BzCn0KCmNvbmNhdF9vcF9pZl9ub3RfbnVsbChvcHMsIG9wKSA9IHJlc3VsdCB7CiAgICBvcCAhPSBudWxsCiAgICByZXN1bHQgOj0gYXJyYXkuY29uY2F0KG9wcywgW29wXSkKfQoKIyBSZWplY3QgdW5leHBlY3RlZCBhbm5vdGF0aW9ucy4KYWxsb3dfYW5ubyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19hbm5vIDE6IHN0YXJ0IikKCiAgICBub3QgaV9vY2kuQW5ub3RhdGlvbnMKCiAgICBwcmludCgiYWxsb3dfYW5ubyAxOiB0cnVlIikKfQphbGxvd19hbm5vKHBfb2NpLCBpX29jaSkgewogICAgcHJpbnQoImFsbG93X2Fubm8gMjogcCBBbm5vdGF0aW9ucyA9IiwgcF9vY2kuQW5ub3RhdGlvbnMpCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiBpIEFubm90YXRpb25zID0iLCBpX29jaS5Bbm5vdGF0aW9ucykKCiAgICBpX2tleXMgOj0gb2JqZWN0LmtleXMoaV9vY2kuQW5ub3RhdGlvbnMpCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiBpIGtleXMgPSIsIGlfa2V5cykKCiAgICBldmVyeSBpX2tleSBpbiBpX2tleXMgewogICAgICAgIGFsbG93X2Fubm9fa2V5KGlfa2V5LCBwX29jaSkKICAgIH0KCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiB0cnVlIikKfQoKYWxsb3dfYW5ub19rZXkoaV9rZXksIHBfb2NpKSB7CiAgICBwcmludCgiYWxsb3dfYW5ub19rZXkgMTogaSBrZXkgPSIsIGlfa2V5KQoKICAgIHN0YXJ0c3dpdGgoaV9rZXksICJpby5rdWJlcm5ldGVzLmNyaS4iKQoKICAgIHByaW50KCJhbGxvd19hbm5vX2tleSAxOiB0cnVlIikKfQphbGxvd19hbm5vX2tleShpX2tleSwgcF9vY2kpIHsKICAgIHByaW50KCJhbGxvd19hbm5vX2tleSAyOiBpIGtleSA9IiwgaV9rZXkpCgogICAgc29tZSBwX2tleSwgXyBpbiBwX29jaS5Bbm5vdGF0aW9ucwogICAgcF9rZXkgPT0gaV9rZXkKCiAgICBwcmludCgiYWxsb3dfYW5ub19rZXkgMjogdHJ1ZSIpCn0KCiMgR2V0IHRoZSB2YWx1ZSBvZiB0aGUgU19OQU1FX0tFWSBhbm5vdGF0aW9uIGFuZAojIGNvcnJlbGF0ZSBpdCB3aXRoIG90aGVyIGFubm90YXRpb25zIGFuZCBwcm9jZXNzIGZpZWxkcy4KYWxsb3dfYnlfYW5ubyhwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpIHsKICAgIHByaW50KCJhbGxvd19ieV9hbm5vIDE6IHN0YXJ0IikKCiAgICBub3QgcF9vY2kuQW5ub3RhdGlvbnNbU19OQU1FX0tFWV0KCiAgICBpX3NfbmFtZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMTogaV9zX25hbWUgPSIsIGlfc19uYW1lKQoKICAgIGlfc19uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FU1BBQ0VfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMTogaV9zX25hbWVzcGFjZSA9IiwgaV9zX25hbWVzcGFjZSkKCiAgICBhbGxvd19ieV9zYW5kYm94X25hbWUocF9vY2ksIGlfb2NpLCBwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBpX3NfbmFtZSwgaV9zX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfYnlfYW5ubyAxOiB0cnVlIikKfQphbGxvd19ieV9hbm5vKHBfb2NpLCBpX29jaSwgcF9zdG9yYWdlcywgaV9zdG9yYWdlcykgewogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMjogc3RhcnQiKQoKICAgIHBfc19uYW1lIDo9IHBfb2NpLkFubm90YXRpb25zW1NfTkFNRV9LRVldCiAgICBpX3NfbmFtZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMjogaV9zX25hbWUgPSIsIGlfc19uYW1lLCAicF9zX25hbWUgPSIsIHBfc19uYW1lKQoKICAgIGFsbG93X3NhbmRib3hfbmFtZShwX3NfbmFtZSwgaV9zX25hbWUpCgogICAgaV9zX25hbWVzcGFjZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwcmludCgiYWxsb3dfYnlfYW5ubyAyOiBpX3NfbmFtZXNwYWNlID0iLCBpX3NfbmFtZXNwYWNlKQoKICAgIGFsbG93X2J5X3NhbmRib3hfbmFtZShwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMsIGlfc19uYW1lLCBpX3NfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd19ieV9hbm5vIDI6IHRydWUiKQp9CgphbGxvd19ieV9zYW5kYm94X25hbWUocF9vY2ksIGlfb2NpLCBwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfYnlfc2FuZGJveF9uYW1lOiBzdGFydCIpCgogICAgaV9uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FU1BBQ0VfS0VZXQoKICAgIGFsbG93X2J5X2NvbnRhaW5lcl90eXBlcyhwX29jaSwgaV9vY2ksIHNfbmFtZSwgaV9uYW1lc3BhY2UpCiAgICBhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZChwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpCiAgICBhbGxvd19wcm9jZXNzKHBfb2NpLlByb2Nlc3MsIGlfb2NpLlByb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpCgogICAgcHJpbnQoImFsbG93X2J5X3NhbmRib3hfbmFtZTogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfbmFtZShwX3NfbmFtZSwgaV9zX25hbWUpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X25hbWU6IHN0YXJ0IikKICAgIHJlZ2V4Lm1hdGNoKHBfc19uYW1lLCBpX3NfbmFtZSkKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9uYW1lOiB0cnVlIikKfQoKIyBDaGVjayB0aGF0IHRoZSAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLXR5cGUiIGFuZAojICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIiBhbm5vdGF0aW9ucyBkZXNpZ25hdGUgdGhlCiMgZXhwZWN0ZWQgdHlwZSAtIGVpdGhlciBhICJzYW5kYm94IiBvciBhICJjb250YWluZXIiLiBUaGVuLCB2YWxpZGF0ZQojIG90aGVyIGFubm90YXRpb25zIGJhc2VkIG9uIHRoZSBhY3R1YWwgInNhbmRib3giIG9yICJjb250YWluZXIiIHZhbHVlCiMgZnJvbSB0aGUgaW5wdXQgY29udGFpbmVyLgphbGxvd19ieV9jb250YWluZXJfdHlwZXMocF9vY2ksIGlfb2NpLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfYnlfY29udGFpbmVyX3R5cGVzOiBjaGVja2luZyBpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSIpCgogICAgY190eXBlIDo9ICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSIKICAgIAogICAgcF9jcmlfdHlwZSA6PSBwX29jaS5Bbm5vdGF0aW9uc1tjX3R5cGVdCiAgICBpX2NyaV90eXBlIDo9IGlfb2NpLkFubm90YXRpb25zW2NfdHlwZV0KICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZXM6IHBfY3JpX3R5cGUgPSIsIHBfY3JpX3R5cGUsICJpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgcF9jcmlfdHlwZSA9PSBpX2NyaV90eXBlCgogICAgYWxsb3dfYnlfY29udGFpbmVyX3R5cGUoaV9jcmlfdHlwZSwgcF9vY2ksIGlfb2NpLCBzX25hbWUsIHNfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZXM6IHRydWUiKQp9CgphbGxvd19ieV9jb250YWluZXJfdHlwZShpX2NyaV90eXBlLCBwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAxOiBpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgaV9jcmlfdHlwZSA9PSAic2FuZGJveCIKCiAgICBpX2thdGFfdHlwZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1siaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5jb250YWluZXJfdHlwZSJdCiAgICBwcmludCgiYWxsb3dfYnlfY29udGFpbmVyX3R5cGUgMTogaV9rYXRhX3R5cGUgPSIsIGlfa2F0YV90eXBlKQogICAgaV9rYXRhX3R5cGUgPT0gInBvZF9zYW5kYm94IgoKICAgIGFsbG93X3NhbmRib3hfY29udGFpbmVyX25hbWUocF9vY2ksIGlfb2NpKQogICAgYWxsb3dfc2FuZGJveF9uZXRfbmFtZXNwYWNlKHBfb2NpLCBpX29jaSkKICAgIGFsbG93X3NhbmRib3hfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpCgogICAgcHJpbnQoImFsbG93X2J5X2NvbnRhaW5lcl90eXBlIDE6IHRydWUiKQp9CgphbGxvd19ieV9jb250YWluZXJfdHlwZShpX2NyaV90eXBlLCBwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiBpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgaV9jcmlfdHlwZSA9PSAiY29udGFpbmVyIgoKICAgIGlfa2F0YV90eXBlIDo9IGlfb2NpLkFubm90YXRpb25zWyJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIl0KICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiBpX2thdGFfdHlwZSA9IiwgaV9rYXRhX3R5cGUpCiAgICBpX2thdGFfdHlwZSA9PSAicG9kX2NvbnRhaW5lciIKCiAgICBhbGxvd19jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpCiAgICBhbGxvd19uZXRfbmFtZXNwYWNlKHBfb2NpLCBpX29jaSkKICAgIGFsbG93X2xvZ19kaXJlY3RvcnkocF9vY2ksIGlfb2NpKQoKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiB0cnVlIikKfQoKIyAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLW5hbWUiIGFubm90YXRpb24KYWxsb3dfc2FuZGJveF9jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X2NvbnRhaW5lcl9uYW1lOiBzdGFydCIpCgogICAgY29udGFpbmVyX2Fubm90YXRpb25fbWlzc2luZyhwX29jaSwgaV9vY2ksICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItbmFtZSIpCgogICAgcHJpbnQoImFsbG93X3NhbmRib3hfY29udGFpbmVyX25hbWU6IHRydWUiKQp9CgphbGxvd19jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19jb250YWluZXJfbmFtZTogc3RhcnQiKQoKICAgIGFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uKHBfb2NpLCBpX29jaSwgImlvLmt1YmVybmV0ZXMuY3JpLmNvbnRhaW5lci1uYW1lIikKCiAgICBwcmludCgiYWxsb3dfY29udGFpbmVyX25hbWU6IHRydWUiKQp9Cgpjb250YWluZXJfYW5ub3RhdGlvbl9taXNzaW5nKHBfb2NpLCBpX29jaSwga2V5KSB7CiAgICBwcmludCgiY29udGFpbmVyX2Fubm90YXRpb25fbWlzc2luZzoiLCBrZXkpCgogICAgbm90IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIG5vdCBpX29jaS5Bbm5vdGF0aW9uc1trZXldCgogICAgcHJpbnQoImNvbnRhaW5lcl9hbm5vdGF0aW9uX21pc3Npbmc6IHRydWUiKQp9CgphbGxvd19jb250YWluZXJfYW5ub3RhdGlvbihwX29jaSwgaV9vY2ksIGtleSkgewogICAgcHJpbnQoImFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uOiBrZXkgPSIsIGtleSkKCiAgICBwX3ZhbHVlIDo9IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIGlfdmFsdWUgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgcHJpbnQoImFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uOiBwX3ZhbHVlID0iLCBwX3ZhbHVlLCAiaV92YWx1ZSA9IiwgaV92YWx1ZSkKCiAgICBwX3ZhbHVlID09IGlfdmFsdWUKCiAgICBwcmludCgiYWxsb3dfY29udGFpbmVyX2Fubm90YXRpb246IHRydWUiKQp9CgojICJuZXJkY3RsL25ldHdvcmstbmFtZXNwYWNlIiBhbm5vdGF0aW9uCmFsbG93X3NhbmRib3hfbmV0X25hbWVzcGFjZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X25ldF9uYW1lc3BhY2U6IHN0YXJ0IikKCiAgICBrZXkgOj0gIm5lcmRjdGwvbmV0d29yay1uYW1lc3BhY2UiCgogICAgcF9uYW1lc3BhY2UgOj0gcF9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgaV9uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgcHJpbnQoImFsbG93X3NhbmRib3hfbmV0X25hbWVzcGFjZTogcF9uYW1lc3BhY2UgPSIsIHBfbmFtZXNwYWNlLCAiaV9uYW1lc3BhY2UgPSIsIGlfbmFtZXNwYWNlKQoKICAgIHJlZ2V4Lm1hdGNoKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9uZXRfbmFtZXNwYWNlOiB0cnVlIikKfQoKYWxsb3dfbmV0X25hbWVzcGFjZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19uZXRfbmFtZXNwYWNlOiBzdGFydCIpCgogICAga2V5IDo9ICJuZXJkY3RsL25ldHdvcmstbmFtZXNwYWNlIgoKICAgIG5vdCBwX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICBub3QgaV9vY2kuQW5ub3RhdGlvbnNba2V5XQoKICAgIHByaW50KCJhbGxvd19uZXRfbmFtZXNwYWNlOiB0cnVlIikKfQoKIyAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1sb2ctZGlyZWN0b3J5IiBhbm5vdGF0aW9uCmFsbG93X3NhbmRib3hfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X2xvZ19kaXJlY3Rvcnk6IHN0YXJ0IikKCiAgICBrZXkgOj0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbG9nLWRpcmVjdG9yeSIKCiAgICBwX2RpciA6PSBwX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICByZWdleDEgOj0gcmVwbGFjZShwX2RpciwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHJlZ2V4MiA6PSByZXBsYWNlKHJlZ2V4MSwgIiQoc2FuZGJveC1uYW1lc3BhY2UpIiwgc19uYW1lc3BhY2UpCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiByZWdleDIgPSIsIHJlZ2V4MikKCiAgICBpX2RpciA6PSBpX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiBpX2RpciA9IiwgaV9kaXIpCgogICAgcmVnZXgubWF0Y2gocmVnZXgyLCBpX2RpcikKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiB0cnVlIikKfQoKYWxsb3dfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19sb2dfZGlyZWN0b3J5OiBzdGFydCIpCgogICAga2V5IDo9ICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWxvZy1kaXJlY3RvcnkiCgogICAgbm90IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIG5vdCBpX29jaS5Bbm5vdGF0aW9uc1trZXldCgogICAgcHJpbnQoImFsbG93X2xvZ19kaXJlY3Rvcnk6IHRydWUiKQp9CgphbGxvd19kZXZpY2VzKHBfZGV2aWNlcywgaV9kZXZpY2VzKSB7CiAgICBwcmludCgiYWxsb3dfZGV2aWNlczogc3RhcnQiKQogICAgZXZlcnkgaV9kZXZpY2UgaW4gaV9kZXZpY2VzIHsKICAgICAgICBwcmludCgiYWxsb3dfZGV2aWNlczogaV9kZXZpY2UgPSIsIGlfZGV2aWNlKQogICAgICAgIHNvbWUgcF9kZXZpY2UgaW4gcF9kZXZpY2VzCiAgICAgICAgcF9kZXZpY2UuY29udGFpbmVyX3BhdGggPT0gaV9kZXZpY2UuY29udGFpbmVyX3BhdGgKICAgIH0KICAgIHByaW50KCJhbGxvd19kZXZpY2VzOiB0cnVlIikKfQoKYWxsb3dfbGludXgoc3RhdGVfb3BzLCBwX29jaSwgaV9vY2kpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIHBfbmFtZXNwYWNlcyA6PSBwX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbGludXg6IHAgbmFtZXNwYWNlcyA9IiwgcF9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlcyA6PSBpX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbGludXg6IGkgbmFtZXNwYWNlcyA9IiwgaV9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlX3dpdGhvdXRfbmV0d29yayA6PSBbb2JqIHwgb2JqIDo9IGlfbmFtZXNwYWNlc1tfXTsgb2JqLlR5cGUgIT0gIm5ldHdvcmsiXQoKICAgIHByaW50KCJhbGxvd19saW51eDogaV9uYW1lc3BhY2Vfd2l0aG91dF9uZXR3b3JrID0iLCBpX25hbWVzcGFjZV93aXRob3V0X25ldHdvcmspCgogICAgcF9uYW1lc3BhY2VzID09IGlfbmFtZXNwYWNlX3dpdGhvdXRfbmV0d29yawoKICAgIGFsbG93X21hc2tlZF9wYXRocyhwX29jaSwgaV9vY2kpCiAgICBhbGxvd19yZWFkb25seV9wYXRocyhwX29jaSwgaV9vY2kpCiAgICBhbGxvd19saW51eF9kZXZpY2VzKHBfb2NpLkxpbnV4LkRldmljZXMsIGlfb2NpLkxpbnV4LkRldmljZXMpCiAgICBhbGxvd19saW51eF9zeXNjdGwocF9vY2kuTGludXgsIGlfb2NpLkxpbnV4KQogICAgcmV0IDo9IGFsbG93X25ldHdvcmtfbmFtZXNwYWNlX3N0YXJ0KHN0YXRlX29wcywgcF9vY2ksIGlfb2NpKQogICAgcmV0LmFsbG93ZWQKCiAgICBvcHMgOj0gcmV0Lm9wcwoKICAgIHByaW50KCJhbGxvd19saW51eDogdHJ1ZSIpCn0KCiMgUmV0cmlldmUgdGhlICJuZXR3b3JrIiBuYW1lc3BhY2UgZnJvbSB0aGUgaW5wdXQgZGF0YSBhbmQgcGFzcyBpdCBvbiBmb3IgdGhlCiMgbmV0d29yayBuYW1lc3BhY2UgcG9saWN5IGNoZWNrcy4KYWxsb3dfbmV0d29ya19uYW1lc3BhY2Vfc3RhcnQoc3RhdGVfb3BzLCBwX29jaSwgaV9vY2kpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIHByaW50KCJhbGxvd19uZXR3b3JrX25hbWVzcGFjZSBzdGFydDogc3RhcnQiKQoKICAgIHBfbmFtZXNwYWNlcyA6PSBwX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IHAgbmFtZXNwYWNlcyA9IiwgcF9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlcyA6PSBpX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IGkgbmFtZXNwYWNlcyA9IiwgaV9uYW1lc3BhY2VzKQoKICAgICMgUmV0dXJuIHBhdGggb2YgdGhlICJuZXR3b3JrIiBuYW1lc3BhY2UKICAgIG5ldHdvcmtfbnMgOj0gW29iaiB8IG9iaiA6PSBpX25hbWVzcGFjZXNbX107IG9iai5UeXBlID09ICJuZXR3b3JrIl0KCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IG5ldHdvcmtfbnMgPSIsIG5ldHdvcmtfbnMpCgogICAgcmV0IDo9IGFsbG93X25ldHdvcmtfbmFtZXNwYWNlKHN0YXRlX29wcywgbmV0d29ya19ucykKICAgIHJldC5hbGxvd2VkCgogICAgb3BzIDo9IHJldC5vcHMKfQoKIyBUaGlzIHJ1bGUgaXMgd2hlbiB0aGVyZSdzIG5vIG5ldHdvcmsgbmFtZXNwYWNlIGluIHRoZSBpbnB1dCBkYXRhLgphbGxvd19uZXR3b3JrX25hbWVzcGFjZShzdGF0ZV9vcHMsIG5ldHdvcmtfbnMpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIGNvdW50KG5ldHdvcmtfbnMpID09IDAKCiAgICBuZXR3b3JrX25zX3BhdGggPSAiIgoKICAgIGFkZF9uZXR3b3JrX25hbWVzcGFjZV90b19zdGF0ZSA6PSBzdGF0ZV9hbGxvd3MoIm5ldHdvcmtfbmFtZXNwYWNlIiwgbmV0d29ya19uc19wYXRoKQogICAgb3BzIDo9IGNvbmNhdF9vcF9pZl9ub3RfbnVsbChzdGF0ZV9vcHMsIGFkZF9uZXR3b3JrX25hbWVzcGFjZV90b19zdGF0ZSkKCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2UgMTogdHJ1ZSIpCn0KCiMgVGhpcyBydWxlIGlzIHdoZW4gdGhlcmUncyBleGFjdGx5IG9uZSBuZXR3b3JrIG5hbWVzcGFjZSBpbiB0aGUgaW5wdXQgZGF0YS4KYWxsb3dfbmV0d29ya19uYW1lc3BhY2Uoc3RhdGVfb3BzLCBuZXR3b3JrX25zKSA6PSB7Im9wcyI6IG9wcywgImFsbG93ZWQiOiB0cnVlfSB7CiAgICBjb3VudChuZXR3b3JrX25zKSA9PSAxCgogICAgYWRkX25ldHdvcmtfbmFtZXNwYWNlX3RvX3N0YXRlIDo9IHN0YXRlX2FsbG93cygibmV0d29ya19uYW1lc3BhY2UiLCBuZXR3b3JrX25zWzBdLlBhdGgpCiAgICBvcHMgOj0gY29uY2F0X29wX2lmX25vdF9udWxsKHN0YXRlX29wcywgYWRkX25ldHdvcmtfbmFtZXNwYWNlX3RvX3N0YXRlKQoKICAgIHByaW50KCJhbGxvd19uZXR3b3JrX25hbWVzcGFjZSAyOiB0cnVlIikKfQoKYWxsb3dfbWFza2VkX3BhdGhzKHBfb2NpLCBpX29jaSkgewogICAgcF9wYXRocyA6PSBwX29jaS5MaW51eC5NYXNrZWRQYXRocwogICAgcHJpbnQoImFsbG93X21hc2tlZF9wYXRocyAxOiBwX3BhdGhzID0iLCBwX3BhdGhzKQoKICAgIGlfcGF0aHMgOj0gaV9vY2kuTGludXguTWFza2VkUGF0aHMKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aHMgMTogaV9wYXRocyA9IiwgaV9wYXRocykKCiAgICBhbGxvd19tYXNrZWRfcGF0aHNfYXJyYXkocF9wYXRocywgaV9wYXRocykKCiAgICBwcmludCgiYWxsb3dfbWFza2VkX3BhdGhzIDE6IHRydWUiKQp9CmFsbG93X21hc2tlZF9wYXRocyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aHMgMjogc3RhcnQiKQoKICAgIG5vdCBwX29jaS5MaW51eC5NYXNrZWRQYXRocwogICAgbm90IGlfb2NpLkxpbnV4Lk1hc2tlZFBhdGhzCgogICAgcHJpbnQoImFsbG93X21hc2tlZF9wYXRocyAyOiB0cnVlIikKfQoKIyBBbGwgdGhlIHBvbGljeSBtYXNrZWQgcGF0aHMgbXVzdCBiZSBtYXNrZWQgaW4gdGhlIGlucHV0IGRhdGEgdG9vLgojIElucHV0IGlzIGFsbG93ZWQgdG8gaGF2ZSBtb3JlIG1hc2tlZCBwYXRocyB0aGFuIHRoZSBwb2xpY3kuCmFsbG93X21hc2tlZF9wYXRoc19hcnJheShwX2FycmF5LCBpX2FycmF5KSB7CiAgICBldmVyeSBwX2VsZW0gaW4gcF9hcnJheSB7CiAgICAgICAgYWxsb3dfbWFza2VkX3BhdGgocF9lbGVtLCBpX2FycmF5KQogICAgfQp9CgphbGxvd19tYXNrZWRfcGF0aChwX2VsZW0sIGlfYXJyYXkpIHsKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aDogcF9lbGVtID0iLCBwX2VsZW0pCgogICAgc29tZSBpX2VsZW0gaW4gaV9hcnJheQogICAgcF9lbGVtID09IGlfZWxlbQoKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aDogdHJ1ZSIpCn0KCmFsbG93X3JlYWRvbmx5X3BhdGhzKHBfb2NpLCBpX29jaSkgewogICAgcF9wYXRocyA6PSBwX29jaS5MaW51eC5SZWFkb25seVBhdGhzCiAgICBwcmludCgiYWxsb3dfcmVhZG9ubHlfcGF0aHMgMTogcF9wYXRocyA9IiwgcF9wYXRocykKCiAgICBpX3BhdGhzIDo9IGlfb2NpLkxpbnV4LlJlYWRvbmx5UGF0aHMKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAxOiBpX3BhdGhzID0iLCBpX3BhdGhzKQoKICAgIGFsbG93X3JlYWRvbmx5X3BhdGhzX2FycmF5KHBfcGF0aHMsIGlfcGF0aHMsIGlfb2NpLkxpbnV4Lk1hc2tlZFBhdGhzKQoKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAxOiB0cnVlIikKfQphbGxvd19yZWFkb25seV9wYXRocyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAyOiBzdGFydCIpCgogICAgbm90IHBfb2NpLkxpbnV4LlJlYWRvbmx5UGF0aHMKICAgIG5vdCBpX29jaS5MaW51eC5SZWFkb25seVBhdGhzCgogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGhzIDI6IHRydWUiKQp9CgojIEFsbCB0aGUgcG9saWN5IHJlYWRvbmx5IHBhdGhzIG11c3QgYmUgZWl0aGVyOgojIC0gUHJlc2VudCBpbiB0aGUgaW5wdXQgcmVhZG9ubHkgcGF0aHMsIG9yCiMgLSBQcmVzZW50IGluIHRoZSBpbnB1dCBtYXNrZWQgcGF0aHMuCiMgSW5wdXQgaXMgYWxsb3dlZCB0byBoYXZlIG1vcmUgcmVhZG9ubHkgcGF0aHMgdGhhbiB0aGUgcG9saWN5LgphbGxvd19yZWFkb25seV9wYXRoc19hcnJheShwX2FycmF5LCBpX2FycmF5LCBtYXNrZWRfcGF0aHMpIHsKICAgIGV2ZXJ5IHBfZWxlbSBpbiBwX2FycmF5IHsKICAgICAgICBhbGxvd19yZWFkb25seV9wYXRoKHBfZWxlbSwgaV9hcnJheSwgbWFza2VkX3BhdGhzKQogICAgfQp9CgphbGxvd19yZWFkb25seV9wYXRoKHBfZWxlbSwgaV9hcnJheSwgbWFza2VkX3BhdGhzKSB7CiAgICBwcmludCgiYWxsb3dfcmVhZG9ubHlfcGF0aCAxOiBwX2VsZW0gPSIsIHBfZWxlbSkKCiAgICBzb21lIGlfZWxlbSBpbiBpX2FycmF5CiAgICBwX2VsZW0gPT0gaV9lbGVtCgogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGggMTogdHJ1ZSIpCn0KYWxsb3dfcmVhZG9ubHlfcGF0aChwX2VsZW0sIGlfYXJyYXksIG1hc2tlZF9wYXRocykgewogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGggMjogcF9lbGVtID0iLCBwX2VsZW0pCgogICAgc29tZSBpX21hc2tlZCBpbiBtYXNrZWRfcGF0aHMKICAgIHBfZWxlbSA9PSBpX21hc2tlZAoKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRoIDI6IHRydWUiKQp9CgphbGxvd19saW51eF9kZXZpY2VzKHBfZGV2aWNlcywgaV9kZXZpY2VzKSB7CiAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogc3RhcnQiKQogICAgZXZlcnkgaV9kZXZpY2UgaW4gaV9kZXZpY2VzIHsKICAgICAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogaV9kZXZpY2UgPSIsIGlfZGV2aWNlKQogICAgICAgIHNvbWUgcF9kZXZpY2UgaW4gcF9kZXZpY2VzCiAgICAgICAgaV9kZXZpY2UuUGF0aCA9PSBwX2RldmljZS5QYXRoCiAgICB9CiAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogdHJ1ZSIpCn0KCmFsbG93X2xpbnV4X3N5c2N0bChwX2xpbnV4LCBpX2xpbnV4KSB7CiAgICBwcmludCgiYWxsb3dfbGludXhfc3lzY3RsIDE6IHN0YXJ0IikKICAgIG5vdCBpX2xpbnV4LlN5c2N0bAogICAgcHJpbnQoImFsbG93X2xpbnV4X3N5c2N0bCAxOiB0cnVlIikKfQoKYWxsb3dfbGludXhfc3lzY3RsKHBfbGludXgsIGlfbGludXgpIHsKICAgIHByaW50KCJhbGxvd19saW51eF9zeXNjdGwgMjogc3RhcnQiKQogICAgcF9zeXNjdGwgOj0gcF9saW51eC5TeXNjdGwKICAgIGlfc3lzY3RsIDo9IGlfbGludXguU3lzY3RsCiAgICBldmVyeSBpX25hbWUsIGlfdmFsIGluIGlfc3lzY3RsIHsKICAgICAgICBwcmludCgiYWxsb3dfbGludXhfc3lzY3RsIDI6IGlfbmFtZSA9IiwgaV9uYW1lLCAiaV92YWwgPSIsIGlfdmFsKQogICAgICAgIHBfc3lzY3RsW2lfbmFtZV0gPT0gaV92YWwKICAgIH0KICAgIHByaW50KCJhbGxvd19saW51eF9zeXNjdGwgMjogdHJ1ZSIpCn0KCiMgQ2hlY2sgdGhlIGNvbnNpc3RlbmN5IG9mIHRoZSBpbnB1dCAiaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5idW5kbGVfcGF0aCIKIyBhbmQgaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCIgdmFsdWVzIHdpdGggb3RoZXIgZmllbGRzLgphbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZChwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpIHsKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogc3RhcnQiKQoKICAgIGJ1bmRsZV9wYXRoIDo9IGlfb2NpLkFubm90YXRpb25zWyJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmJ1bmRsZV9wYXRoIl0KICAgIGJ1bmRsZV9pZCA6PSByZXBsYWNlKGJ1bmRsZV9wYXRoLCAiL3J1bi9jb250YWluZXJkL2lvLmNvbnRhaW5lcmQucnVudGltZS52Mi50YXNrL2s4cy5pby8iLCAiIikKCiAgICBidW5kbGVfaWRfZm9ybWF0IDo9IGNvbmNhdCgiIiwgWyJeIiwgQlVORExFX0lELCAiJCJdKQogICAgcmVnZXgubWF0Y2goYnVuZGxlX2lkX2Zvcm1hdCwgYnVuZGxlX2lkKQoKICAgIGtleSA6PSAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCIKCiAgICBwX3JlZ2V4IDo9IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIHNhbmRib3hfaWQgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQoKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogc2FuZGJveF9pZCA9Iiwgc2FuZGJveF9pZCwgInJlZ2V4ID0iLCBwX3JlZ2V4KQogICAgcmVnZXgubWF0Y2gocF9yZWdleCwgc2FuZGJveF9pZCkKCiAgICBhbGxvd19yb290X3BhdGgocF9vY2ksIGlfb2NpLCBidW5kbGVfaWQpCgogICAgZXZlcnkgaV9tb3VudCBpbiBpX29jaS5Nb3VudHMgewogICAgICAgIGFsbG93X21vdW50KHBfb2NpLCBpX21vdW50LCBpX3N0b3JhZ2VzLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpCiAgICB9CgogICAgYWxsb3dfc3RvcmFnZXMocF9zdG9yYWdlcywgaV9zdG9yYWdlcywgYnVuZGxlX2lkLCBzYW5kYm94X2lkKQoKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogdHJ1ZSIpCn0KCmFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHBfcHJvY2VzcyA9IiwgcF9wcm9jZXNzKQogICAgcHJpbnQoImFsbG93X3Byb2Nlc3NfY29tbW9uOiBpX3Byb2Nlc3MgPSAiLCBpX3Byb2Nlc3MpCiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHNfbmFtZSA9Iiwgc19uYW1lKQoKICAgIHBfcHJvY2Vzcy5Dd2QgPT0gaV9wcm9jZXNzLkN3ZAogICAgcF9wcm9jZXNzLk5vTmV3UHJpdmlsZWdlcyA9PSBpX3Byb2Nlc3MuTm9OZXdQcml2aWxlZ2VzCgogICAgYWxsb3dfdXNlcihwX3Byb2Nlc3MsIGlfcHJvY2VzcykKICAgIGFsbG93X2VudihwX3Byb2Nlc3MsIGlfcHJvY2Vzcywgc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHRydWUiKQp9CgojIENvbXBhcmUgdGhlIE9DSSBQcm9jZXNzIGZpZWxkIG9mIGEgcG9saWN5IGNvbnRhaW5lciB3aXRoIHRoZSBpbnB1dCBPQ0kgUHJvY2VzcyBmcm9tIGEgQ3JlYXRlQ29udGFpbmVyUmVxdWVzdAphbGxvd19wcm9jZXNzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfcHJvY2Vzczogc3RhcnQiKQoKICAgIGFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgYWxsb3dfY2FwcyhwX3Byb2Nlc3MuQ2FwYWJpbGl0aWVzLCBpX3Byb2Nlc3MuQ2FwYWJpbGl0aWVzKQogICAgcF9wcm9jZXNzLlRlcm1pbmFsID09IGlfcHJvY2Vzcy5UZXJtaW5hbAoKICAgIHByaW50KCJhbGxvd19wcm9jZXNzOiB0cnVlIikKfQoKIyBDb21wYXJlIHRoZSBPQ0kgUHJvY2VzcyBmaWVsZCBvZiBhIHBvbGljeSBjb250YWluZXIgd2l0aCB0aGUgaW5wdXQgcHJvY2VzcyBmaWVsZCBmcm9tIEV4ZWNQcm9jZXNzUmVxdWVzdAphbGxvd19pbnRlcmFjdGl2ZV9wcm9jZXNzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfaW50ZXJhY3RpdmVfcHJvY2Vzczogc3RhcnQiKQoKICAgIGFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgYWxsb3dfZXhlY19jYXBzKGlfcHJvY2Vzcy5DYXBhYmlsaXRpZXMpCgogICAgIyBUaGVzZSBhcmUgY29tbWFuZHMgZW5hYmxlZCB1c2luZyBFeGVjUHJvY2Vzc1JlcXVlc3QgY29tbWFuZHMgYW5kL29yIHJlZ2V4IGZyb20gdGhlIHNldHRpbmdzIGZpbGUuCiAgICAjIFRoZXkgY2FuIGJlIGV4ZWN1dGVkIGludGVyYWN0aXZlbHkgc28gYWxsb3cgdGhlbSB0byB1c2UgYW55IHZhbHVlIGZvciBpX3Byb2Nlc3MuVGVybWluYWwuCgogICAgcHJpbnQoImFsbG93X2ludGVyYWN0aXZlX3Byb2Nlc3M6IHRydWUiKQp9CgojIENvbXBhcmUgdGhlIE9DSSBQcm9jZXNzIGZpZWxkIG9mIGEgcG9saWN5IGNvbnRhaW5lciB3aXRoIHRoZSBpbnB1dCBwcm9jZXNzIGZpZWxkIGZyb20gRXhlY1Byb2Nlc3NSZXF1ZXN0CmFsbG93X3Byb2JlX3Byb2Nlc3MocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19wcm9iZV9wcm9jZXNzOiBzdGFydCIpCgogICAgYWxsb3dfcHJvY2Vzc19jb21tb24ocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpCiAgICBhbGxvd19leGVjX2NhcHMoaV9wcm9jZXNzLkNhcGFiaWxpdGllcykKICAgIHBfcHJvY2Vzcy5UZXJtaW5hbCA9PSBpX3Byb2Nlc3MuVGVybWluYWwKCiAgICBwcmludCgiYWxsb3dfcHJvYmVfcHJvY2VzczogdHJ1ZSIpCn0KCmFsbG93X3VzZXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MpIHsKICAgIHBfdXNlciA6PSBwX3Byb2Nlc3MuVXNlcgogICAgaV91c2VyIDo9IGlfcHJvY2Vzcy5Vc2VyCgogICAgcHJpbnQoImFsbG93X3VzZXI6IGlucHV0IHVpZCA9IiwgaV91c2VyLlVJRCwgInBvbGljeSB1aWQgPSIsIHBfdXNlci5VSUQpCiAgICBwX3VzZXIuVUlEID09IGlfdXNlci5VSUQKCiAgICAjIFRPRE86IHRyYWNrIGRvd24gdGhlIHJlYXNvbiBmb3IgcmVnaXN0cnkuazhzLmlvL3BhdXNlOjMuOSBiZWluZwogICAgIyAgICAgICBleGVjdXRlZCB3aXRoIGdpZCA9IDAgZGVzcGl0ZSBoYXZpbmcgIjY1NTM1OjY1NTM1IiBpbiBpdHMgY29udGFpbmVyIGltYWdlCiAgICAjICAgICAgIGNvbmZpZy4KICAgICNwcmludCgiYWxsb3dfdXNlcjogaW5wdXQgZ2lkID0iLCBpX3VzZXIuR0lELCAicG9saWN5IGdpZCA9IiwgcF91c2VyLkdJRCkKICAgICNwX3VzZXIuR0lEID09IGlfdXNlci5HSUQKCiAgICAjIFRPRE86IGNvbXBhcmUgdGhlIGFkZGl0aW9uYWxHaWRzIGZpZWxkIHRvbyBhZnRlciBjb21wdXRpbmcgaXRzIHZhbHVlCiAgICAjIGJhc2VkIG9uIC9ldGMvcGFzc3dkIGFuZCAvZXRjL2dyb3VwIGZyb20gdGhlIGNvbnRhaW5lciBpbWFnZS4KfQoKYWxsb3dfZGVwcmVjYXRlZF9hcmdzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZ3MgMTogbm8gYXJncyIpCgogICAgbm90IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJncwogICAgbm90IGlfcHJvY2Vzcy5BcmdzCgogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAxOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZ3MocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSkgewogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiBwb2xpY3kgYXJncyA9IiwgcF9wcm9jZXNzLkRlcHJlY2F0ZWRBcmdzKQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiBpbnB1dCBhcmdzID0iLCBpX3Byb2Nlc3MuQXJncykKCiAgICBjb3VudChwX3Byb2Nlc3MuRGVwcmVjYXRlZEFyZ3MpID09IGNvdW50KGlfcHJvY2Vzcy5BcmdzKQoKICAgIGV2ZXJ5IGksIGlfYXJnIGluIGlfcHJvY2Vzcy5BcmdzIHsKICAgICAgICBhbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpCiAgICB9CgogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDE6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgcF9hcmcyIDo9IHJlcGxhY2UocF9hcmcsICIkJCIsICIkIikKICAgIHBfYXJnMiA9PSBpX2FyZwoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAxOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDI6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgIyBUT0RPOiBjYW4gJChub2RlLW5hbWUpIGJlIGhhbmRsZWQgYmV0dGVyPwogICAgY29udGFpbnMocF9hcmcsICIkKG5vZGUtbmFtZSkiKQoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAyOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDM6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgcF9hcmcyIDo9IHJlcGxhY2UocF9hcmcsICIkJCIsICIkIikKICAgIHBfYXJnMyA6PSByZXBsYWNlKHBfYXJnMiwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAzOiBwX2FyZzMgPSIsIHBfYXJnMykKICAgIHBfYXJnMyA9PSBpX2FyZwoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAzOiB0cnVlIikKfQoKIyBPQ0kgcHJvY2Vzcy5FbnYgZmllbGQKYWxsb3dfZW52KHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfZW52OiBwIGVudiA9IiwgcF9wcm9jZXNzLkVudikKICAgIHByaW50KCJhbGxvd19lbnY6IGkgZW52ID0iLCBpX3Byb2Nlc3MuRW52KQoKICAgIGV2ZXJ5IGlfdmFyIGluIGlfcHJvY2Vzcy5FbnYgewogICAgICAgIHByaW50KCJhbGxvd19lbnY6IGlfdmFyID0iLCBpX3ZhcikKICAgICAgICBhbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgfQoKICAgIHByaW50KCJhbGxvd19lbnY6IHRydWUiKQp9CgojIEFsbG93IGlucHV0IGVudiB2YXJpYWJsZXMgdGhhdCBhcmUgcHJlc2VudCBpbiB0aGUgcG9saWN5IGRhdGEgdG9vLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHBfdmFyID09IGlfdmFyCiAgICBwcmludCgiYWxsb3dfdmFyIDE6IHRydWUiKQp9CgojIE1hdGNoIGlucHV0IHdpdGggb25lIG9mIHRoZSBwb2xpY3kgdmFyaWFibGVzLCBhZnRlciBzdWJzdGl0dXRpbmcgJChzYW5kYm94LW5hbWUpLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHByaW50KCJhbGxvd192YXIgMjogcF92YXIgPSIsIHBfdmFyKQoKICAgIHBfdmFyX3NwbGl0IDo9IHNwbGl0KHBfdmFyLCAiPSIpCiAgICBjb3VudChwX3Zhcl9zcGxpdCkgPT0gMgoKICAgIHBfdmFyX3NwbGl0WzFdID09ICIkKHNhbmRib3gtbmFtZSkiCgogICAgaV92YXJfc3BsaXQgOj0gc3BsaXQoaV92YXIsICI9IikKICAgIGNvdW50KGlfdmFyX3NwbGl0KSA9PSAyCgogICAgaV92YXJfc3BsaXRbMF0gPT0gcF92YXJfc3BsaXRbMF0KICAgIHJlZ2V4Lm1hdGNoKHNfbmFtZSwgaV92YXJfc3BsaXRbMV0pCgogICAgcHJpbnQoImFsbG93X3ZhciAyOiB0cnVlIikKfQoKIyBBbGxvdyBpbnB1dCBlbnYgdmFyaWFibGVzIHRoYXQgbWF0Y2ggd2l0aCBhIHJlcXVlc3RfZGVmYXVsdHMgcmVnZXguCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHNvbWUgcF9yZWdleDEgaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5DcmVhdGVDb250YWluZXJSZXF1ZXN0LmFsbG93X2Vudl9yZWdleAogICAgcF9yZWdleDIgOj0gcmVwbGFjZShwX3JlZ2V4MSwgIiQoaXB2NF9hKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcHY0X2EpCiAgICBwX3JlZ2V4MyA6PSByZXBsYWNlKHBfcmVnZXgyLCAiJChpcF9wKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcF9wKQogICAgcF9yZWdleDQgOj0gcmVwbGFjZShwX3JlZ2V4MywgIiQoc3ZjX25hbWUpIiwgcG9saWN5X2RhdGEuY29tbW9uLnN2Y19uYW1lKQogICAgcF9yZWdleDUgOj0gcmVwbGFjZShwX3JlZ2V4NCwgIiQoZG5zX2xhYmVsKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5kbnNfbGFiZWwpCgogICAgcHJpbnQoImFsbG93X3ZhciAzOiBwX3JlZ2V4NSA9IiwgcF9yZWdleDUpCiAgICByZWdleC5tYXRjaChwX3JlZ2V4NSwgaV92YXIpCgogICAgcHJpbnQoImFsbG93X3ZhciAzOiB0cnVlIikKfQoKIyBBbGxvdyBmaWVsZFJlZiAiZmllbGRQYXRoOiBzdGF0dXMucG9kSVAiIHZhbHVlcy4KYWxsb3dfdmFyKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBpX3Zhciwgc19uYW1lLCBzX25hbWVzcGFjZSkgewogICAgbmFtZV92YWx1ZSA6PSBzcGxpdChpX3ZhciwgIj0iKQogICAgY291bnQobmFtZV92YWx1ZSkgPT0gMgogICAgaXNfaXAobmFtZV92YWx1ZVsxXSkKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIGFsbG93X3BvZF9pcF92YXIobmFtZV92YWx1ZVswXSwgcF92YXIpCgogICAgcHJpbnQoImFsbG93X3ZhciA0OiB0cnVlIikKfQoKIyBBbGxvdyBjb21tb24gZmllbGRSZWYgdmFyaWFibGVzLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBuYW1lX3ZhbHVlIDo9IHNwbGl0KGlfdmFyLCAiPSIpCiAgICBjb3VudChuYW1lX3ZhbHVlKSA9PSAyCgogICAgc29tZSBwX3ZhciBpbiBwX3Byb2Nlc3MuRW52CiAgICBwX25hbWVfdmFsdWUgOj0gc3BsaXQocF92YXIsICI9IikKICAgIGNvdW50KHBfbmFtZV92YWx1ZSkgPT0gMgoKICAgIHBfbmFtZV92YWx1ZVswXSA9PSBuYW1lX3ZhbHVlWzBdCgogICAgIyBUT0RPOiBzaG91bGQgdGhlc2UgYmUgaGFuZGxlZCBpbiBhIGRpZmZlcmVudCB3YXk/CiAgICBhbHdheXNfYWxsb3dlZCA6PSBbIiQoaG9zdC1uYW1lKSIsICIkKG5vZGUtbmFtZSkiLCAiJChwb2QtdWlkKSJdCiAgICBzb21lIGFsbG93ZWQgaW4gYWx3YXlzX2FsbG93ZWQKICAgIGNvbnRhaW5zKHBfbmFtZV92YWx1ZVsxXSwgYWxsb3dlZCkKCiAgICBwcmludCgiYWxsb3dfdmFyIDU6IHRydWUiKQp9CgojIEFsbG93IGZpZWxkUmVmICJmaWVsZFBhdGg6IHN0YXR1cy5ob3N0SVAiIHZhbHVlcy4KYWxsb3dfdmFyKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBpX3Zhciwgc19uYW1lLCBzX25hbWVzcGFjZSkgewogICAgbmFtZV92YWx1ZSA6PSBzcGxpdChpX3ZhciwgIj0iKQogICAgY291bnQobmFtZV92YWx1ZSkgPT0gMgogICAgaXNfaXAobmFtZV92YWx1ZVsxXSkKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIGFsbG93X2hvc3RfaXBfdmFyKG5hbWVfdmFsdWVbMF0sIHBfdmFyKQoKICAgIHByaW50KCJhbGxvd192YXIgNjogdHJ1ZSIpCn0KCiMgQWxsb3cgcmVzb3VyY2VGaWVsZFJlZiB2YWx1ZXMgKGUuZy4sICJsaW1pdHMuY3B1IikuCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIG5hbWVfdmFsdWUgOj0gc3BsaXQoaV92YXIsICI9IikKICAgIGNvdW50KG5hbWVfdmFsdWUpID09IDIKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHBfbmFtZV92YWx1ZSA6PSBzcGxpdChwX3ZhciwgIj0iKQogICAgY291bnQocF9uYW1lX3ZhbHVlKSA9PSAyCgogICAgcF9uYW1lX3ZhbHVlWzBdID09IG5hbWVfdmFsdWVbMF0KCiAgICAjIGEgdmFyaWFibGUgd2Ugc2hvdWxkIGJlIHZhbGlkYXRpbmcgdXNpbmcgYSByZWdleCBmcm9tIHNldHRpbmdzCiAgICBwX25hbWVfdmFsdWVbMV0gPT0gIiQodmFsaWRhdGUtZnJvbS1zZXR0aW5ncykiCgogICAgcmVnZXhfdmFsIDo9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuQ3JlYXRlQ29udGFpbmVyUmVxdWVzdC5hbGxvd19lbnZfcmVnZXhfbWFwW25hbWVfdmFsdWVbMF1dCgogICAgcHJpbnQoImFsbG93X3ZhciA3OiB2YWwgPSIsIG5hbWVfdmFsdWVbMV0pCiAgICBwcmludCgiYWxsb3dfdmFyIDc6IHJlZ2V4X3ZhbCA9IiwgcmVnZXhfdmFsKQoKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4X3ZhbCwgbmFtZV92YWx1ZVsxXSkKCiAgICBwcmludCgiYWxsb3dfdmFyIDc6IHRydWUiKQp9CgojIE1hdGNoIGlucHV0IHdpdGggb25lIG9mIHRoZSBwb2xpY3kgdmFyaWFibGVzLCBhZnRlciBzdWJzdGl0dXRpbmcgJChzYW5kYm94LW5hbWVzcGFjZSkuCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHNvbWUgcF92YXIgaW4gcF9wcm9jZXNzLkVudgogICAgcF92YXIyIDo9IHJlcGxhY2UocF92YXIsICIkKHNhbmRib3gtbmFtZXNwYWNlKSIsIHNfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd192YXIgODogcF92YXIyID0iLCBwX3ZhcjIpCiAgICBwX3ZhcjIgPT0gaV92YXIKCiAgICBwcmludCgiYWxsb3dfdmFyIDg6IHRydWUiKQp9CgphbGxvd19wb2RfaXBfdmFyKHZhcl9uYW1lLCBwX3ZhcikgewogICAgcHJpbnQoImFsbG93X3BvZF9pcF92YXI6IHZhcl9uYW1lID0iLCB2YXJfbmFtZSwgInBfdmFyID0iLCBwX3ZhcikKCiAgICBwX25hbWVfdmFsdWUgOj0gc3BsaXQocF92YXIsICI9IikKICAgIGNvdW50KHBfbmFtZV92YWx1ZSkgPT0gMgoKICAgIHBfbmFtZV92YWx1ZVswXSA9PSB2YXJfbmFtZQogICAgcF9uYW1lX3ZhbHVlWzFdID09ICIkKHBvZC1pcCkiCgogICAgcHJpbnQoImFsbG93X3BvZF9pcF92YXI6IHRydWUiKQp9CgphbGxvd19ob3N0X2lwX3Zhcih2YXJfbmFtZSwgcF92YXIpIHsKICAgIHByaW50KCJhbGxvd19ob3N0X2lwX3ZhcjogdmFyX25hbWUgPSIsIHZhcl9uYW1lLCAicF92YXIgPSIsIHBfdmFyKQoKICAgIHBfbmFtZV92YWx1ZSA6PSBzcGxpdChwX3ZhciwgIj0iKQogICAgY291bnQocF9uYW1lX3ZhbHVlKSA9PSAyCgogICAgcF9uYW1lX3ZhbHVlWzBdID09IHZhcl9uYW1lCiAgICBwX25hbWVfdmFsdWVbMV0gPT0gIiQoaG9zdC1pcCkiCgogICAgcHJpbnQoImFsbG93X2hvc3RfaXBfdmFyOiB0cnVlIikKfQoKaXNfaXAodmFsdWUpIHsKICAgIGJ5dGVzID0gc3BsaXQodmFsdWUsICIuIikKICAgIGNvdW50KGJ5dGVzKSA9PSA0CgogICAgaXNfaXBfZmlyc3RfYnl0ZShieXRlc1swXSkKICAgIGlzX2lwX290aGVyX2J5dGUoYnl0ZXNbMV0pCiAgICBpc19pcF9vdGhlcl9ieXRlKGJ5dGVzWzJdKQogICAgaXNfaXBfb3RoZXJfYnl0ZShieXRlc1szXSkKfQppc19pcF9maXJzdF9ieXRlKGNvbXBvbmVudCkgewogICAgbnVtYmVyID0gdG9fbnVtYmVyKGNvbXBvbmVudCkKICAgIG51bWJlciA+PSAxCiAgICBudW1iZXIgPD0gMjU1Cn0KaXNfaXBfb3RoZXJfYnl0ZShjb21wb25lbnQpIHsKICAgIG51bWJlciA9IHRvX251bWJlcihjb21wb25lbnQpCiAgICBudW1iZXIgPj0gMAogICAgbnVtYmVyIDw9IDI1NQp9CgojIE9DSSByb290LlBhdGgKYWxsb3dfcm9vdF9wYXRoKHBfb2NpLCBpX29jaSwgYnVuZGxlX2lkKSB7CiAgICBpX3BhdGggOj0gaV9vY2kuUm9vdC5QYXRoCiAgICBwX3BhdGgxIDo9IHBfb2NpLlJvb3QuUGF0aAogICAgcHJpbnQoImFsbG93X3Jvb3RfcGF0aDogaV9wYXRoID0iLCBpX3BhdGgsICJwX3BhdGgxID0iLCBwX3BhdGgxKQoKICAgIHBfcGF0aDIgOj0gcmVwbGFjZShwX3BhdGgxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfcm9vdF9wYXRoOiBwX3BhdGgyID0iLCBwX3BhdGgyKQoKICAgIHBfcGF0aDMgOj0gcmVwbGFjZShwX3BhdGgyLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X3Jvb3RfcGF0aDogcF9wYXRoMyA9IiwgcF9wYXRoMykKCiAgICBwX3BhdGgzID09IGlfcGF0aAoKICAgIHByaW50KCJhbGxvd19yb290X3BhdGg6IHRydWUiKQp9CgojIGRldmljZSBtb3VudHMKYWxsb3dfbW91bnQocF9vY2ksIGlfbW91bnQsIGlfc3RvcmFnZXMsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcHJpbnQoImFsbG93X21vdW50OiBpX21vdW50ID0iLCBpX21vdW50KQoKICAgIHNvbWUgcF9tb3VudCBpbiBwX29jaS5Nb3VudHMKICAgIHNvbWUgaV9zdG9yYWdlIGluIGlfc3RvcmFnZXMKCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IHBfbW91bnQgPSIsIHBfbW91bnQpCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IGlfc3RvcmFnZSA9IiwgaV9zdG9yYWdlKQoKICAgIGNoZWNrX21vdW50KHBfbW91bnQsIGlfbW91bnQsIGlfc3RvcmFnZSwgYnVuZGxlX2lkLCBzYW5kYm94X2lkKQoKICAgICMgVE9ETzogYXJlIHRoZXJlIGFueSBvdGhlciByZXF1aXJlZCBwb2xpY3kgY2hlY2tzIGZvciBtb3VudHMgLSBlLmcuLAogICAgIyAgICAgICBtdWx0aXBsZSBtb3VudHMgd2l0aCBzYW1lIHNvdXJjZSBvciBkZXN0aW5hdGlvbj8KCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IHRydWUiKQp9CgpjaGVja19tb3VudChwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcF9tb3VudCA9PSBpX21vdW50CiAgICBwcmludCgiY2hlY2tfbW91bnQgMTogdHJ1ZSIpCn0KY2hlY2tfbW91bnQocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHBfbW91bnQuZGVzdGluYXRpb24gPT0gaV9tb3VudC5kZXN0aW5hdGlvbgogICAgcF9tb3VudC50eXBlXyA9PSBpX21vdW50LnR5cGVfCiAgICBwX21vdW50Lm9wdGlvbnMgPT0gaV9tb3VudC5vcHRpb25zCgogICAgbW91bnRfc291cmNlX2FsbG93cyhwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkKCiAgICBwcmludCgiY2hlY2tfbW91bnQgMjogdHJ1ZSIpCn0KCm1vdW50X3NvdXJjZV9hbGxvd3MocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHJlZ2V4MSA6PSBwX21vdW50LnNvdXJjZQogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5tb3VudF9zb3VyY2VfY3BhdGgpCiAgICByZWdleDQgOj0gcmVwbGFjZShyZWdleDMsICIkKGJ1bmRsZS1pZCkiLCBidW5kbGVfaWQpCgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMTogcmVnZXg0ID0iLCByZWdleDQpCiAgICByZWdleC5tYXRjaChyZWdleDQsIGlfbW91bnQuc291cmNlKQoKICAgIHByaW50KCJtb3VudF9zb3VyY2VfYWxsb3dzIDE6IHRydWUiKQp9Cm1vdW50X3NvdXJjZV9hbGxvd3MocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHJlZ2V4MSA6PSBwX21vdW50LnNvdXJjZQogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5tb3VudF9zb3VyY2VfY3BhdGgpCiAgICByZWdleDQgOj0gcmVwbGFjZShyZWdleDMsICIkKHNhbmRib3gtaWQpIiwgc2FuZGJveF9pZCkKCiAgICBwcmludCgibW91bnRfc291cmNlX2FsbG93cyAyOiByZWdleDQgPSIsIHJlZ2V4NCkKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4NCwgaV9tb3VudC5zb3VyY2UpCgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMjogdHJ1ZSIpCn0KbW91bnRfc291cmNlX2FsbG93cyhwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogaV9tb3VudC5zb3VyY2UgPSIsIGlfbW91bnQuc291cmNlKQogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogaV9zdG9yYWdlLm1vdW50X3BvaW50ID0iLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCgogICAgaV9tb3VudC5zb3VyY2UgPT0gaV9zdG9yYWdlLm1vdW50X3BvaW50CgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogdHJ1ZSIpCn0KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBDcmVhdGUgY29udGFpbmVyIFN0b3JhZ2VzCgphbGxvd19zdG9yYWdlcyhwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHBfY291bnQgOj0gY291bnQocF9zdG9yYWdlcykKICAgIGlfY291bnQgOj0gY291bnQoaV9zdG9yYWdlcykKICAgIHByaW50KCJhbGxvd19zdG9yYWdlczogcF9jb3VudCA9IiwgcF9jb3VudCwgImlfY291bnQgPSIsIGlfY291bnQpCgogICAgcF9jb3VudCA9PSBpX2NvdW50CgogICAgIyBHZXQgdGhlIGNvbnRhaW5lciBpbWFnZSBsYXllciBJRHMgYW5kIHZlcml0eSByb290IGhhc2hlcywgZnJvbSB0aGUgIm92ZXJsYXlmcyIgc3RvcmFnZS4KICAgIHNvbWUgb3ZlcmxheV9zdG9yYWdlIGluIHBfc3RvcmFnZXMKICAgIG92ZXJsYXlfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIHByaW50KCJhbGxvd19zdG9yYWdlczogb3ZlcmxheV9zdG9yYWdlID0iLCBvdmVybGF5X3N0b3JhZ2UpCiAgICBjb3VudChvdmVybGF5X3N0b3JhZ2Uub3B0aW9ucykgPT0gMgoKICAgIGxheWVyX2lkcyA6PSBzcGxpdChvdmVybGF5X3N0b3JhZ2Uub3B0aW9uc1swXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiBsYXllcl9pZHMgPSIsIGxheWVyX2lkcykKCiAgICByb290X2hhc2hlcyA6PSBzcGxpdChvdmVybGF5X3N0b3JhZ2Uub3B0aW9uc1sxXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiByb290X2hhc2hlcyA9Iiwgcm9vdF9oYXNoZXMpCgogICAgZXZlcnkgaV9zdG9yYWdlIGluIGlfc3RvcmFnZXMgewogICAgICAgIGFsbG93X3N0b3JhZ2UocF9zdG9yYWdlcywgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpCiAgICB9CgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiB0cnVlIikKfQoKYWxsb3dfc3RvcmFnZShwX3N0b3JhZ2VzLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgc29tZSBwX3N0b3JhZ2UgaW4gcF9zdG9yYWdlcwoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiBwX3N0b3JhZ2UgPSIsIHBfc3RvcmFnZSkKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiBpX3N0b3JhZ2UgPSIsIGlfc3RvcmFnZSkKCiAgICBwX3N0b3JhZ2UuZHJpdmVyICAgICAgICAgICA9PSBpX3N0b3JhZ2UuZHJpdmVyCiAgICBwX3N0b3JhZ2UuZHJpdmVyX29wdGlvbnMgICA9PSBpX3N0b3JhZ2UuZHJpdmVyX29wdGlvbnMKICAgIHBfc3RvcmFnZS5mc19ncm91cCAgICAgICAgID09IGlfc3RvcmFnZS5mc19ncm91cAogICAgcF9zdG9yYWdlLmZzdHlwZSAgICAgICAgICAgPT0gaV9zdG9yYWdlLmZzdHlwZQoKICAgIGFsbG93X3N0b3JhZ2Vfc291cmNlKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKQogICAgYWxsb3dfc3RvcmFnZV9vcHRpb25zKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKQogICAgYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKQoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiB0cnVlIikKfQoKYWxsb3dfc3RvcmFnZV9zb3VyY2UocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX3NvdXJjZSAxOiBzdGFydCIpCgogICAgcF9zdG9yYWdlLnNvdXJjZSA9PSBpX3N0b3JhZ2Uuc291cmNlCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDE6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX3NvdXJjZShwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDI6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCgogICAgIyBEREREOkJCOkRELkY6IERvbWFpbjpCdXM6RGV2aWNlLkZ1bmN0aW9uCiAgICAjIGh0dHBzOi8vd3d3Lmtlcm5lbC5vcmcvZG9jL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtYnVzLXBjaQogICAgcmVnZXgubWF0Y2goYF5bYS1mMC05XXs0fTpbYS1mMC05XXsyfTpbYS1mMC05XXsyfVwuW2EtZjAtOV0kYCwgaV9zdG9yYWdlLnNvdXJjZSkKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9zb3VyY2UgMjogdHJ1ZSIpCn0KCmFsbG93X3N0b3JhZ2Vfc291cmNlKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKSB7CiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9zb3VyY2UgMzogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIGlfc3RvcmFnZS5zb3VyY2UgPT0gIm5vbmUiCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDM6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX3NvdXJjZShwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDQ6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJzbWIiCgogICAgIyBQYXR0ZXJuOiAvLzxzdG9yYWdlLWFjY291bnQtbmFtZT4uZmlsZS5jb3JlLndpbmRvd3MubmV0LzxrOHMtUFZDLW5hbWU+CiAgICAjIFN0b3JhZ2UgYWNjb3VudCBuYW1lOiBodHRwczovL2xlYXJuLm1pY3Jvc29mdC5jb20vZW4tdXMvYXp1cmUvc3RvcmFnZS9jb21tb24vc3RvcmFnZS1hY2NvdW50LW92ZXJ2aWV3I3N0b3JhZ2UtYWNjb3VudC1uYW1lCiAgICAjIEs4cyBQVkMgbmFtZTogaHR0cHM6Ly9rdWJlcm5ldGVzLmlvL2RvY3MvY29uY2VwdHMvb3ZlcnZpZXcvd29ya2luZy13aXRoLW9iamVjdHMvbmFtZXMvI2Rucy1zdWJkb21haW4tbmFtZXMKICAgIHJlZ2V4Lm1hdGNoKGBeXC9cLyhbYS16MC05XXszLDI0fSlcLmZpbGVcLmNvcmVcLndpbmRvd3NcLm5ldFwvW2EtejAtOV0oW2EtejAtOS4tXXswLDI1MX1bYS16MC05XSk/JGAsIGlfc3RvcmFnZS5zb3VyY2UpCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDQ6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMTogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgIT0gIm92ZXJsYXlmcyIKICAgIHBfc3RvcmFnZS5vcHRpb25zID09IGlfc3RvcmFnZS5vcHRpb25zCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAxOiB0cnVlIikKfQphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIGNvdW50KHBfc3RvcmFnZS5vcHRpb25zKSA9PSAyCgogICAgcG9saWN5X2lkcyA6PSBzcGxpdChwX3N0b3JhZ2Uub3B0aW9uc1swXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBwb2xpY3lfaWRzID0iLCBwb2xpY3lfaWRzKQogICAgcG9saWN5X2lkcyA9PSBsYXllcl9pZHMKCiAgICBwb2xpY3lfaGFzaGVzIDo9IHNwbGl0KHBfc3RvcmFnZS5vcHRpb25zWzFdLCAiOiIpCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IHBvbGljeV9oYXNoZXMgPSIsIHBvbGljeV9oYXNoZXMpCgogICAgcF9jb3VudCA6PSBjb3VudChwb2xpY3lfaWRzKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBwX2NvdW50ID0iLCBwX2NvdW50KQogICAgcF9jb3VudCA+PSAxCiAgICBwX2NvdW50ID09IGNvdW50KHBvbGljeV9oYXNoZXMpCgogICAgaV9jb3VudCA6PSBjb3VudChpX3N0b3JhZ2Uub3B0aW9ucykKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogaV9jb3VudCA9IiwgaV9jb3VudCkKICAgIGlfY291bnQgPT0gcF9jb3VudCArIDMKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zWzBdID0iLCBpX3N0b3JhZ2Uub3B0aW9uc1swXSkKICAgIGlfc3RvcmFnZS5vcHRpb25zWzBdID09ICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQubGF5ZXItc3JjLXByZWZpeD0vdmFyL2xpYi9jb250YWluZXJkL2lvLmNvbnRhaW5lcmQuc25hcHNob3R0ZXIudjEudGFyZGV2L2xheWVycyIKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zW2lfY291bnQgLSAyXSA9IiwgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDJdKQogICAgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDJdID09ICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQub3ZlcmxheS1ydyIKCiAgICBsb3dlcmRpciA6PSBjb25jYXQoIj0iLCBbImxvd2VyZGlyIiwgcF9zdG9yYWdlLm9wdGlvbnNbMF1dKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBsb3dlcmRpciA9IiwgbG93ZXJkaXIpCgogICAgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDFdID09IGxvd2VyZGlyCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zW2lfY291bnQgLSAxXSA9IiwgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDFdKQoKICAgIGV2ZXJ5IGksIHBvbGljeV9pZCBpbiBwb2xpY3lfaWRzIHsKICAgICAgICBhbGxvd19vdmVybGF5X2xheWVyKHBvbGljeV9pZCwgcG9saWN5X2hhc2hlc1tpXSwgaV9zdG9yYWdlLm9wdGlvbnNbaSArIDFdKQogICAgfQoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogdHJ1ZSIpCn0KYWxsb3dfc3RvcmFnZV9vcHRpb25zKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKSB7CiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDM6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCiAgICBjb3VudChwX3N0b3JhZ2Uub3B0aW9ucykgPT0gMQoKICAgIHN0YXJ0c3dpdGgocF9zdG9yYWdlLm9wdGlvbnNbMF0sICIkKGhhc2giKQogICAgaGFzaF9zdWZmaXggOj0gdHJpbV9sZWZ0KHBfc3RvcmFnZS5vcHRpb25zWzBdLCAiJChoYXNoIikKCiAgICBlbmRzd2l0aChoYXNoX3N1ZmZpeCwgIikiKQogICAgaGFzaF9pbmRleCA6PSB0cmltX3JpZ2h0KGhhc2hfc3VmZml4LCAiKSIpCiAgICBpIDo9IHRvX251bWJlcihoYXNoX2luZGV4KQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAzOiBpID0iLCBpKQoKICAgIGhhc2hfb3B0aW9uIDo9IGNvbmNhdCgiPSIsIFsiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LnJvb3QtaGFzaCIsIHJvb3RfaGFzaGVzW2ldXSkKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMzogaGFzaF9vcHRpb24gPSIsIGhhc2hfb3B0aW9uKQoKICAgIGNvdW50KGlfc3RvcmFnZS5vcHRpb25zKSA9PSA0CiAgICBpX3N0b3JhZ2Uub3B0aW9uc1swXSA9PSAicm8iCiAgICBpX3N0b3JhZ2Uub3B0aW9uc1sxXSA9PSAiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmJsb2NrX2RldmljZT1maWxlIgogICAgaV9zdG9yYWdlLm9wdGlvbnNbMl0gPT0gImlvLmthdGFjb250YWluZXJzLmZzLW9wdC5pcy1sYXllciIKICAgIGlfc3RvcmFnZS5vcHRpb25zWzNdID09IGhhc2hfb3B0aW9uCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAzOiB0cnVlIikKfQphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgNDogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gInNtYiIKICAgIHBfb3B0c19jb3VudCA6PSBjb3VudChwX3N0b3JhZ2Uub3B0aW9ucykKICAgIGlfb3B0c19jb3VudCA6PSBjb3VudChpX3N0b3JhZ2Uub3B0aW9ucykKICAgIGlfb3B0c19jb3VudCA9PSBwX29wdHNfY291bnQgKyAyCgogICAgaV9vcHRfbWF0Y2hlcyA6PSBbaSB8IGkgOj0gaWR4OyBpZHggPCBwX29wdHNfY291bnQ7IHBfc3RvcmFnZS5vcHRpb25zW2lkeF0gPT0gaV9zdG9yYWdlLm9wdGlvbnNbaWR4XV0KICAgIGNvdW50KGlfb3B0X21hdGNoZXMpID09IHBfb3B0c19jb3VudAoKICAgIHN0YXJ0c3dpdGgoaV9zdG9yYWdlLm9wdGlvbnNbaV9vcHRzX2NvdW50LTJdLCAiYWRkcj0iKQogICAgY3JlZHMgPSBzcGxpdChpX3N0b3JhZ2Uub3B0aW9uc1tpX29wdHNfY291bnQtMV0sICIsIikKICAgIGNvdW50KGNyZWRzKSA9PSAyCiAgICBzdGFydHN3aXRoKGNyZWRzWzBdLCAidXNlcm5hbWU9IikKICAgIHN0YXJ0c3dpdGgoY3JlZHNbMV0sICJwYXNzd29yZD0iKQogICAgCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDQ6IHRydWUiKQp9CgphbGxvd19vdmVybGF5X2xheWVyKHBvbGljeV9pZCwgcG9saWN5X2hhc2gsIGlfb3B0aW9uKSB7CiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogcG9saWN5X2lkID0iLCBwb2xpY3lfaWQsICJwb2xpY3lfaGFzaCA9IiwgcG9saWN5X2hhc2gpCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogaV9vcHRpb24gPSIsIGlfb3B0aW9uKQoKICAgIHN0YXJ0c3dpdGgoaV9vcHRpb24sICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQubGF5ZXI9IikKICAgIGlfdmFsdWUgOj0gcmVwbGFjZShpX29wdGlvbiwgImlvLmthdGFjb250YWluZXJzLmZzLW9wdC5sYXllcj0iLCAiIikKICAgIGlfdmFsdWVfZGVjb2RlZCA6PSBiYXNlNjQuZGVjb2RlKGlfdmFsdWUpCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogaV92YWx1ZV9kZWNvZGVkID0iLCBpX3ZhbHVlX2RlY29kZWQpCgogICAgcG9saWN5X3N1ZmZpeCA6PSBjb25jYXQoIj0iLCBbInRhcixybyxpby5rYXRhY29udGFpbmVycy5mcy1vcHQuYmxvY2tfZGV2aWNlPWZpbGUsaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmlzLWxheWVyLGlvLmthdGFjb250YWluZXJzLmZzLW9wdC5yb290LWhhc2giLCBwb2xpY3lfaGFzaF0pCiAgICBwX3ZhbHVlIDo9IGNvbmNhdCgiLCIsIFtwb2xpY3lfaWQsIHBvbGljeV9zdWZmaXhdKQogICAgcHJpbnQoImFsbG93X292ZXJsYXlfbGF5ZXI6IHBfdmFsdWUgPSIsIHBfdmFsdWUpCgogICAgcF92YWx1ZSA9PSBpX3ZhbHVlX2RlY29kZWQKCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogdHJ1ZSIpCn0KCmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAidGFyIgoKICAgIHN0YXJ0c3dpdGgocF9zdG9yYWdlLm1vdW50X3BvaW50LCAiJChsYXllciIpCiAgICBtb3VudF9zdWZmaXggOj0gdHJpbV9sZWZ0KHBfc3RvcmFnZS5tb3VudF9wb2ludCwgIiQobGF5ZXIiKQoKICAgIGVuZHN3aXRoKG1vdW50X3N1ZmZpeCwgIikiKQogICAgbGF5ZXJfaW5kZXggOj0gdHJpbV9yaWdodChtb3VudF9zdWZmaXgsICIpIikKICAgIGkgOj0gdG9fbnVtYmVyKGxheWVyX2luZGV4KQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDE6IGkgPSIsIGkpCgogICAgbGF5ZXJfaWQgOj0gbGF5ZXJfaWRzW2ldCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMTogbGF5ZXJfaWQgPSIsIGxheWVyX2lkKQoKICAgIHBfbW91bnQgOj0gY29uY2F0KCIvIiwgWyIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L2xheWVycyIsIGxheWVyX2lkXSkKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCAxOiBwX21vdW50ID0iLCBwX21vdW50KQoKICAgIHBfbW91bnQgPT0gaV9zdG9yYWdlLm1vdW50X3BvaW50CgogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDE6IHRydWUiKQp9CmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAiZnVzZTMua2F0YS1vdmVybGF5IgoKICAgIG1vdW50MSA6PSByZXBsYWNlKHBfc3RvcmFnZS5tb3VudF9wb2ludCwgIiQoY3BhdGgpIiwgcG9saWN5X2RhdGEuY29tbW9uLmNwYXRoKQogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDI6IG1vdW50MiA9IiwgbW91bnQyKQoKICAgIG1vdW50MiA9PSBpX3N0b3JhZ2UubW91bnRfcG9pbnQKCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMjogdHJ1ZSIpCn0KYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKSB7CiAgICBwX3N0b3JhZ2UuZnN0eXBlID09ICJsb2NhbCIKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQyID0iLCBtb3VudDIpCgogICAgbW91bnQzIDo9IHJlcGxhY2UobW91bnQyLCAiJChzYW5kYm94LWlkKSIsIHNhbmRib3hfaWQpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQzID0iLCBtb3VudDMpCgogICAgcmVnZXgubWF0Y2gobW91bnQzLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCgogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDM6IHRydWUiKQp9CmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAiYmluZCIKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNDogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNDogbW91bnQyID0iLCBtb3VudDIpCgogICAgbW91bnQzIDo9IHJlcGxhY2UobW91bnQyLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDQ6IG1vdW50MyA9IiwgbW91bnQzKQoKICAgIHJlZ2V4Lm1hdGNoKG1vdW50MywgaV9zdG9yYWdlLm1vdW50X3BvaW50KQoKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA0OiB0cnVlIikKfQphbGxvd19tb3VudF9wb2ludChwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgYnVuZGxlX2lkLCBzYW5kYm94X2lkLCBsYXllcl9pZHMpIHsKICAgIHBfc3RvcmFnZS5mc3R5cGUgPT0gInRtcGZzIgoKICAgIG1vdW50MSA6PSBwX3N0b3JhZ2UubW91bnRfcG9pbnQKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA1OiBtb3VudDEgPSIsIG1vdW50MSkKCiAgICByZWdleC5tYXRjaChtb3VudDEsIGlfc3RvcmFnZS5tb3VudF9wb2ludCkKCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNTogdHJ1ZSIpCn0KYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKSB7CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogaV9zdG9yYWdlLm1vdW50X3BvaW50ID0iLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCiAgICBhbGxvd19kaXJlY3Rfdm9sX2RyaXZlcihwX3N0b3JhZ2UsIGlfc3RvcmFnZSkKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChzcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQyID0iLCBtb3VudDIpCgogICAgZGlyZWN0X3ZvbF9wYXRoIDo9IGlfc3RvcmFnZS5zb3VyY2UKICAgIG1vdW50MyA6PSByZXBsYWNlKG1vdW50MiwgIiQoYjY0LWRpcmVjdC12b2wtcGF0aCkiLCBiYXNlNjR1cmwuZW5jb2RlKGRpcmVjdF92b2xfcGF0aCkpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQzID0iLCBtb3VudDMpCgogICAgbW91bnQzID09IGlfc3RvcmFnZS5tb3VudF9wb2ludAoKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA2OiB0cnVlIikKfQoKYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIocF9zdG9yYWdlLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19kaXJlY3Rfdm9sX2RyaXZlciAxOiBzdGFydCIpCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCiAgICBwcmludCgiYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIgMTogdHJ1ZSIpCn0KYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIocF9zdG9yYWdlLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19kaXJlY3Rfdm9sX2RyaXZlciAyOiBzdGFydCIpCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJzbWIiCiAgICBwcmludCgiYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIgMjogdHJ1ZSIpCn0KCiMgRXhlY1Byb2Nlc3NSZXF1ZXN0LnByb2Nlc3MuQ2FwYWJpbGl0aWVzCmFsbG93X2V4ZWNfY2FwcyhpX2NhcHMpIHsKICAgIG5vdCBpX2NhcHMuQW1iaWVudAogICAgbm90IGlfY2Fwcy5Cb3VuZGluZwogICAgbm90IGlfY2Fwcy5FZmZlY3RpdmUKICAgIG5vdCBpX2NhcHMuSW5oZXJpdGFibGUKICAgIG5vdCBpX2NhcHMuUGVybWl0dGVkCn0KCiMgT0NJLlByb2Nlc3MuQ2FwYWJpbGl0aWVzCmFsbG93X2NhcHMocF9jYXBzLCBpX2NhcHMpIHsKICAgIHByaW50KCJhbGxvd19jYXBzOiBwb2xpY3kgQW1iaWVudCA9IiwgcF9jYXBzLkFtYmllbnQpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgQW1iaWVudCA9IiwgaV9jYXBzLkFtYmllbnQpCiAgICBtYXRjaF9jYXBzKHBfY2Fwcy5BbWJpZW50LCBpX2NhcHMuQW1iaWVudCkKCiAgICBwcmludCgiYWxsb3dfY2FwczogcG9saWN5IEJvdW5kaW5nID0iLCBwX2NhcHMuQm91bmRpbmcpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgQm91bmRpbmcgPSIsIGlfY2Fwcy5Cb3VuZGluZykKICAgIG1hdGNoX2NhcHMocF9jYXBzLkJvdW5kaW5nLCBpX2NhcHMuQm91bmRpbmcpCgogICAgcHJpbnQoImFsbG93X2NhcHM6IHBvbGljeSBFZmZlY3RpdmUgPSIsIHBfY2Fwcy5FZmZlY3RpdmUpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgRWZmZWN0aXZlID0iLCBpX2NhcHMuRWZmZWN0aXZlKQogICAgbWF0Y2hfY2FwcyhwX2NhcHMuRWZmZWN0aXZlLCBpX2NhcHMuRWZmZWN0aXZlKQoKICAgIHByaW50KCJhbGxvd19jYXBzOiBwb2xpY3kgSW5oZXJpdGFibGUgPSIsIHBfY2Fwcy5Jbmhlcml0YWJsZSkKICAgIHByaW50KCJhbGxvd19jYXBzOiBpbnB1dCBJbmhlcml0YWJsZSA9IiwgaV9jYXBzLkluaGVyaXRhYmxlKQogICAgbWF0Y2hfY2FwcyhwX2NhcHMuSW5oZXJpdGFibGUsIGlfY2Fwcy5Jbmhlcml0YWJsZSkKCiAgICBwcmludCgiYWxsb3dfY2FwczogcG9saWN5IFBlcm1pdHRlZCA9IiwgcF9jYXBzLlBlcm1pdHRlZCkKICAgIHByaW50KCJhbGxvd19jYXBzOiBpbnB1dCBQZXJtaXR0ZWQgPSIsIGlfY2Fwcy5QZXJtaXR0ZWQpCiAgICBtYXRjaF9jYXBzKHBfY2Fwcy5QZXJtaXR0ZWQsIGlfY2Fwcy5QZXJtaXR0ZWQpCn0KCm1hdGNoX2NhcHMocF9jYXBzLCBpX2NhcHMpIHsKICAgIHByaW50KCJtYXRjaF9jYXBzIDE6IHN0YXJ0IikKCiAgICBwX2NhcHMgPT0gaV9jYXBzCgogICAgcHJpbnQoIm1hdGNoX2NhcHMgMTogdHJ1ZSIpCn0KbWF0Y2hfY2FwcyhwX2NhcHMsIGlfY2FwcykgewogICAgcHJpbnQoIm1hdGNoX2NhcHMgMjogc3RhcnQiKQoKICAgIGNvdW50KHBfY2FwcykgPT0gMQogICAgcF9jYXBzWzBdID09ICIkKGRlZmF1bHRfY2FwcykiCgogICAgcHJpbnQoIm1hdGNoX2NhcHMgMjogZGVmYXVsdF9jYXBzID0iLCBwb2xpY3lfZGF0YS5jb21tb24uZGVmYXVsdF9jYXBzKQogICAgcG9saWN5X2RhdGEuY29tbW9uLmRlZmF1bHRfY2FwcyA9PSBpX2NhcHMKCiAgICBwcmludCgibWF0Y2hfY2FwcyAyOiB0cnVlIikKfQptYXRjaF9jYXBzKHBfY2FwcywgaV9jYXBzKSB7CiAgICBwcmludCgibWF0Y2hfY2FwcyAzOiBzdGFydCIpCgogICAgY291bnQocF9jYXBzKSA9PSAxCiAgICBwX2NhcHNbMF0gPT0gIiQocHJpdmlsZWdlZF9jYXBzKSIKCiAgICBwcmludCgibWF0Y2hfY2FwcyAzOiBwcml2aWxlZ2VkX2NhcHMgPSIsIHBvbGljeV9kYXRhLmNvbW1vbi5wcml2aWxlZ2VkX2NhcHMpCiAgICBwb2xpY3lfZGF0YS5jb21tb24ucHJpdmlsZWdlZF9jYXBzID09IGlfY2FwcwoKICAgIHByaW50KCJtYXRjaF9jYXBzIDM6IHRydWUiKQp9CgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgpjaGVja19kaXJlY3RvcnlfdHJhdmVyc2FsKGlfcGF0aCkgewogICAgbm90IHJlZ2V4Lm1hdGNoKCIoXnwvKS4uKCR8LykiLCBpX3BhdGgpCn0KCmNoZWNrX3N5bWxpbmtfc291cmNlKGlfc3JjKSB7CiAgICBpX3NyYyA9PSAiIgogICAgcHJpbnQoImNoZWNrX3N5bWxpbmtfc291cmNlIDE6IHRydWUiKQp9CmNoZWNrX3N5bWxpbmtfc291cmNlKGlfc3JjKSB7CiAgICBpX3NyYyAhPSAiIgogICAgcHJpbnQoImNoZWNrX3N5bWxpbmtfc291cmNlIDI6IGlfc3JjID0iLCBpX3NyYykKCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24uc19zb3VyY2UxLCBpX3NyYykKCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMjogdHJ1ZSIpCn0KY2hlY2tfc3ltbGlua19zb3VyY2UoaV9zcmMpIHsKICAgIGlfc3JjICE9ICIiCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMzogaV9zcmMgPSIsIGlfc3JjKQoKICAgIHJlZ2V4Lm1hdGNoKHBvbGljeV9kYXRhLmNvbW1vbi5zX3NvdXJjZTIsIGlfc3JjKQogICAgY2hlY2tfZGlyZWN0b3J5X3RyYXZlcnNhbChpX3NyYykKCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMzogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfc3RvcmFnZXMoaV9zdG9yYWdlcykgewogICAgcHJpbnQoImFsbG93X3NhbmRib3hfc3RvcmFnZXM6IGlfc3RvcmFnZXMgPSIsIGlfc3RvcmFnZXMpCgogICAgcF9zdG9yYWdlcyA6PSBwb2xpY3lfZGF0YS5zYW5kYm94LnN0b3JhZ2VzCiAgICBldmVyeSBpX3N0b3JhZ2UgaW4gaV9zdG9yYWdlcyB7CiAgICAgICAgYWxsb3dfc2FuZGJveF9zdG9yYWdlKHBfc3RvcmFnZXMsIGlfc3RvcmFnZSkKICAgIH0KCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9zdG9yYWdlczogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfc3RvcmFnZShwX3N0b3JhZ2VzLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IGlfc3RvcmFnZSA9IiwgaV9zdG9yYWdlKQoKICAgIHNvbWUgcF9zdG9yYWdlIGluIHBfc3RvcmFnZXMKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IHBfc3RvcmFnZSA9IiwgcF9zdG9yYWdlKQogICAgaV9zdG9yYWdlID09IHBfc3RvcmFnZQoKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IHRydWUiKQp9CgpDb3B5RmlsZVJlcXVlc3QgewogICAgcHJpbnQoIkNvcHlGaWxlUmVxdWVzdDogaW5wdXQucGF0aCA9IiwgaW5wdXQucGF0aCkKCiAgICBjaGVja19zeW1saW5rX3NvdXJjZShpbnB1dC5zeW1saW5rX3NyYykKICAgIGNoZWNrX2RpcmVjdG9yeV90cmF2ZXJzYWwoaW5wdXQucGF0aCkKCiAgICBzb21lIHJlZ2V4MSBpbiBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLkNvcHlGaWxlUmVxdWVzdAogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5jcGF0aCkKICAgIHJlZ2V4NCA6PSByZXBsYWNlKHJlZ2V4MywgIiQoYnVuZGxlLWlkKSIsIEJVTkRMRV9JRCkKICAgIHByaW50KCJDb3B5RmlsZVJlcXVlc3Q6IHJlZ2V4NCA9IiwgcmVnZXg0KQoKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4NCwgaW5wdXQucGF0aCkKCiAgICBwcmludCgiQ29weUZpbGVSZXF1ZXN0OiB0cnVlIikKfQoKQ3JlYXRlU2FuZGJveFJlcXVlc3QgewogICAgcHJpbnQoIkNyZWF0ZVNhbmRib3hSZXF1ZXN0OiBpbnB1dC5ndWVzdF9ob29rX3BhdGggPSIsIGlucHV0Lmd1ZXN0X2hvb2tfcGF0aCkKICAgIGNvdW50KGlucHV0Lmd1ZXN0X2hvb2tfcGF0aCkgPT0gMAoKICAgIHByaW50KCJDcmVhdGVTYW5kYm94UmVxdWVzdDogaW5wdXQua2VybmVsX21vZHVsZXMgPSIsIGlucHV0Lmtlcm5lbF9tb2R1bGVzKQogICAgY291bnQoaW5wdXQua2VybmVsX21vZHVsZXMpID09IDAKCiAgICBpX3BpZG5zIDo9IGlucHV0LnNhbmRib3hfcGlkbnMKICAgIHByaW50KCJDcmVhdGVTYW5kYm94UmVxdWVzdDogaV9waWRucyA9IiwgaV9waWRucykKICAgIGlfcGlkbnMgPT0gZmFsc2UKICAgIGFsbG93X3NhbmRib3hfc3RvcmFnZXMoaW5wdXQuc3RvcmFnZXMpCn0KCmFsbG93X2V4ZWMocF9jb250YWluZXIsIGlfcHJvY2VzcykgewogICAgcHJpbnQoImFsbG93X2V4ZWM6IHN0YXJ0IikKCiAgICBwX29jaSA9IHBfY29udGFpbmVyLk9DSQogICAgcF9zX25hbWUgPSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc19uYW1lc3BhY2UgPSBnZXRfc3RhdGVfdmFsKCJuYW1lc3BhY2UiKQogICAgYWxsb3dfcHJvYmVfcHJvY2VzcyhwX29jaS5Qcm9jZXNzLCBpX3Byb2Nlc3MsIHBfc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfZXhlYzogdHJ1ZSIpCn0KCmFsbG93X2ludGVyYWN0aXZlX2V4ZWMocF9jb250YWluZXIsIGlfcHJvY2VzcykgewogICAgcHJpbnQoImFsbG93X2ludGVyYWN0aXZlX2V4ZWM6IHN0YXJ0IikKCiAgICBwX29jaSA9IHBfY29udGFpbmVyLk9DSQogICAgcF9zX25hbWUgPSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc19uYW1lc3BhY2UgPSBnZXRfc3RhdGVfdmFsKCJuYW1lc3BhY2UiKQogICAgYWxsb3dfaW50ZXJhY3RpdmVfcHJvY2VzcyhwX29jaS5Qcm9jZXNzLCBpX3Byb2Nlc3MsIHBfc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfaW50ZXJhY3RpdmVfZXhlYzogdHJ1ZSIpCn0KCiMgVE9ETzogc2hvdWxkIG90aGVyIEV4ZWNQcm9jZXNzUmVxdWVzdCBpbnB1dCBkYXRhIGZpZWxkcyBiZSB2YWxpZGF0ZWQgYXMgd2VsbD8KRXhlY1Byb2Nlc3NSZXF1ZXN0IHsKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMTogaW5wdXQgPSIsIGlucHV0KQoKICAgIHNvbWUgcF9jb21tYW5kIGluIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuRXhlY1Byb2Nlc3NSZXF1ZXN0LmFsbG93ZWRfY29tbWFuZHMKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMTogcF9jb21tYW5kID0iLCBwX2NvbW1hbmQpCiAgICBwX2NvbW1hbmQgPT0gaW5wdXQucHJvY2Vzcy5BcmdzCgogICAgIyBUT0RPOiBtYXRjaCBwX2NvbnRhaW5lcidzIElEIHdpdGggdGhlIGlucHV0IGNvbnRhaW5lcl9pZC4KICAgIHNvbWUgcF9jb250YWluZXIgaW4gcG9saWN5X2RhdGEuY29udGFpbmVycwogICAgYWxsb3dfaW50ZXJhY3RpdmVfZXhlYyhwX2NvbnRhaW5lciwgaW5wdXQucHJvY2VzcykKCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDE6IHRydWUiKQp9CkV4ZWNQcm9jZXNzUmVxdWVzdCB7CiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDI6IGlucHV0ID0iLCBpbnB1dCkKCiAgICAjIFRPRE86IG1hdGNoIGlucHV0IGNvbnRhaW5lciBJRCB3aXRoIGl0cyBjb3JyZXNwb25kaW5nIGNvbnRhaW5lci5leGVjX2NvbW1hbmRzLgogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBzb21lIHBfY29tbWFuZCBpbiBwX2NvbnRhaW5lci5leGVjX2NvbW1hbmRzCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDI6IHBfY29tbWFuZCA9IiwgcF9jb21tYW5kKQoKICAgICMgVE9ETzogc2hvdWxkIG90aGVyIGlucHV0IGRhdGEgZmllbGRzIGJlIHZhbGlkYXRlZCBhcyB3ZWxsPwogICAgcF9jb21tYW5kID09IGlucHV0LnByb2Nlc3MuQXJncwoKICAgIGFsbG93X2V4ZWMocF9jb250YWluZXIsIGlucHV0LnByb2Nlc3MpCgogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAyOiB0cnVlIikKfQpFeGVjUHJvY2Vzc1JlcXVlc3QgewogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAzOiBpbnB1dCA9IiwgaW5wdXQpCgogICAgaV9jb21tYW5kID0gY29uY2F0KCIgIiwgaW5wdXQucHJvY2Vzcy5BcmdzKQogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAzOiBpX2NvbW1hbmQgPSIsIGlfY29tbWFuZCkKCiAgICBzb21lIHBfcmVnZXggaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5FeGVjUHJvY2Vzc1JlcXVlc3QucmVnZXgKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMzogcF9yZWdleCA9IiwgcF9yZWdleCkKCiAgICByZWdleC5tYXRjaChwX3JlZ2V4LCBpX2NvbW1hbmQpCgogICAgIyBUT0RPOiBtYXRjaCBwX2NvbnRhaW5lcidzIElEIHdpdGggdGhlIGlucHV0IGNvbnRhaW5lcl9pZC4KICAgIHNvbWUgcF9jb250YWluZXIgaW4gcG9saWN5X2RhdGEuY29udGFpbmVycwogICAgYWxsb3dfaW50ZXJhY3RpdmVfZXhlYyhwX2NvbnRhaW5lciwgaW5wdXQucHJvY2VzcykKCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDM6IHRydWUiKQp9CgpVcGRhdGVSb3V0ZXNSZXF1ZXN0IHsKICAgIHByaW50KCJVcGRhdGVSb3V0ZXNSZXF1ZXN0OiBpbnB1dCA9IiwgaW5wdXQpCiAgICBwcmludCgiVXBkYXRlUm91dGVzUmVxdWVzdDogcG9saWN5ID0iLCBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLlVwZGF0ZVJvdXRlc1JlcXVlc3QpCgogICAgaV9yb3V0ZXMgOj0gaW5wdXQucm91dGVzLlJvdXRlcwogICAgcF9zb3VyY2VfcmVnZXggPSBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLlVwZGF0ZVJvdXRlc1JlcXVlc3QuZm9yYmlkZGVuX3NvdXJjZV9yZWdleAogICAgcF9uYW1lcyA9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuVXBkYXRlUm91dGVzUmVxdWVzdC5mb3JiaWRkZW5fZGV2aWNlX25hbWVzCgogICAgZXZlcnkgaV9yb3V0ZSBpbiBpX3JvdXRlcyB7CiAgICAgICAgcHJpbnQoImlfcm91dGUuc291cmNlID0iLCBpX3JvdXRlLnNvdXJjZSkKICAgICAgICBldmVyeSBwX3JlZ2V4IGluIHBfc291cmNlX3JlZ2V4IHsKICAgICAgICAgICAgcHJpbnQoInBfcmVnZXggPSIsIHBfcmVnZXgpCiAgICAgICAgICAgIG5vdCByZWdleC5tYXRjaChwX3JlZ2V4LCBpX3JvdXRlLnNvdXJjZSkKICAgICAgICB9CgogICAgICAgIHByaW50KCJpX3JvdXRlLmRldmljZSA9IiwgaV9yb3V0ZS5kZXZpY2UpCiAgICAgICAgbm90IGlfcm91dGUuZGV2aWNlIGluIHBfbmFtZXMKICAgIH0KCiAgICBwcmludCgiVXBkYXRlUm91dGVzUmVxdWVzdDogdHJ1ZSIpCn0KClVwZGF0ZUludGVyZmFjZVJlcXVlc3QgewogICAgcHJpbnQoIlVwZGF0ZUludGVyZmFjZVJlcXVlc3Q6IGlucHV0ID0iLCBpbnB1dCkKICAgIHByaW50KCJVcGRhdGVJbnRlcmZhY2VSZXF1ZXN0OiBwb2xpY3kgPSIsIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuVXBkYXRlSW50ZXJmYWNlUmVxdWVzdCkKCiAgICBpX2ludGVyZmFjZSA6PSBpbnB1dC5pbnRlcmZhY2UKICAgIHBfZmxhZ3MgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmFsbG93X3Jhd19mbGFncwoKICAgICMgVHlwaWNhbGx5LCBqdXN0IElGRl9OT0FSUCBpcyB1c2VkLgogICAgYml0cy5hbmQoaV9pbnRlcmZhY2UucmF3X2ZsYWdzLCBiaXRzLm5lZ2F0ZShwX2ZsYWdzKSkgPT0gMAoKICAgIHBfbmFtZXMgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmZvcmJpZGRlbl9uYW1lcwoKICAgIG5vdCBpX2ludGVyZmFjZS5uYW1lIGluIHBfbmFtZXMKCiAgICBwX2h3YWRkcnMgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmZvcmJpZGRlbl9od19hZGRycwoKICAgIG5vdCBpX2ludGVyZmFjZS5od0FkZHIgaW4gcF9od2FkZHJzCgogICAgcHJpbnQoIlVwZGF0ZUludGVyZmFjZVJlcXVlc3Q6IHRydWUiKQp9CgpDbG9zZVN0ZGluUmVxdWVzdCB7CiAgICBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLkNsb3NlU3RkaW5SZXF1ZXN0ID09IHRydWUKfQoKUmVhZFN0cmVhbVJlcXVlc3QgewogICAgcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5SZWFkU3RyZWFtUmVxdWVzdCA9PSB0cnVlCn0KClVwZGF0ZUVwaGVtZXJhbE1vdW50c1JlcXVlc3QgewogICAgcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVFcGhlbWVyYWxNb3VudHNSZXF1ZXN0ID09IHRydWUKfQoKV3JpdGVTdHJlYW1SZXF1ZXN0IHsKICAgIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuV3JpdGVTdHJlYW1SZXF1ZXN0ID09IHRydWUKfQoKcG9saWN5X2RhdGEgOj0gewogICJjb250YWluZXJzIjogWwogICAgewogICAgICAiT0NJIjogewogICAgICAgICJWZXJzaW9uIjogIjEuMS4wLXJjLjEiLAogICAgICAgICJQcm9jZXNzIjogewogICAgICAgICAgIlRlcm1pbmFsIjogZmFsc2UsCiAgICAgICAgICAiVXNlciI6IHsKICAgICAgICAgICAgIlVJRCI6IDY1NTM1LAogICAgICAgICAgICAiR0lEIjogNjU1MzUsCiAgICAgICAgICAgICJBZGRpdGlvbmFsR2lkcyI6IFtdLAogICAgICAgICAgICAiVXNlcm5hbWUiOiAiIgogICAgICAgICAgfSwKICAgICAgICAgICJEZXByZWNhdGVkQXJncyI6IFsKICAgICAgICAgICAgIi9wYXVzZSIKICAgICAgICAgIF0sCiAgICAgICAgICAiQXJncyI6IFsKICAgICAgICAgICAgIi9wYXVzZSIKICAgICAgICAgIF0sCiAgICAgICAgICAiRW52IjogWwogICAgICAgICAgICAiUEFUSD0vdXNyL2xvY2FsL3NiaW46L3Vzci9sb2NhbC9iaW46L3Vzci9zYmluOi91c3IvYmluOi9zYmluOi9iaW4iCiAgICAgICAgICBdLAogICAgICAgICAgIkN3ZCI6ICIvIiwKICAgICAgICAgICJDYXBhYmlsaXRpZXMiOiB7CiAgICAgICAgICAgICJBbWJpZW50IjogW10sCiAgICAgICAgICAgICJCb3VuZGluZyI6IFsKICAgICAgICAgICAgICAiJChkZWZhdWx0X2NhcHMpIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiRWZmZWN0aXZlIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJJbmhlcml0YWJsZSI6IFtdLAogICAgICAgICAgICAiUGVybWl0dGVkIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICAiTm9OZXdQcml2aWxlZ2VzIjogdHJ1ZQogICAgICAgIH0sCiAgICAgICAgIlJvb3QiOiB7CiAgICAgICAgICAiUGF0aCI6ICIkKGNwYXRoKS8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgIlJlYWRvbmx5IjogdHJ1ZQogICAgICAgIH0sCiAgICAgICAgIk1vdW50cyI6IFsKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9wcm9jIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJwcm9jIiwKICAgICAgICAgICAgInR5cGVfIjogInByb2MiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2IiwKICAgICAgICAgICAgInNvdXJjZSI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJzdHJpY3RhdGltZSIsCiAgICAgICAgICAgICAgIm1vZGU9NzU1IiwKICAgICAgICAgICAgICAic2l6ZT02NTUzNmsiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L3B0cyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiZGV2cHRzIiwKICAgICAgICAgICAgInR5cGVfIjogImRldnB0cyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJuZXdpbnN0YW5jZSIsCiAgICAgICAgICAgICAgInB0bXhtb2RlPTA2NjYiLAogICAgICAgICAgICAgICJtb2RlPTA2MjAiLAogICAgICAgICAgICAgICJnaWQ9NSIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvc2htIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L3NobSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi9tcXVldWUiLAogICAgICAgICAgICAic291cmNlIjogIm1xdWV1ZSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJtcXVldWUiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvc3lzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJzeXNmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJzeXNmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2V0Yy9yZXNvbHYuY29uZiIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClyZXNvbHYuY29uZiQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJvIiwKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9kZXYiLAogICAgICAgICAgICAgICJub2V4ZWMiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0KICAgICAgICBdLAogICAgICAgICJBbm5vdGF0aW9ucyI6IHsKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmJ1bmRsZV9wYXRoIjogIi9ydW4vY29udGFpbmVyZC9pby5jb250YWluZXJkLnJ1bnRpbWUudjIudGFzay9rOHMuaW8vJChidW5kbGUtaWQpIiwKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIjogInBvZF9zYW5kYm94IiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSI6ICJzYW5kYm94IiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWlkIjogIl5bYS16MC05XXs2NH0kIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWxvZy1kaXJlY3RvcnkiOiAiXi92YXIvbG9nL3BvZHMvJChzYW5kYm94LW5hbWVzcGFjZSlfJChzYW5kYm94LW5hbWUpX1swLTlhLWZdezh9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezEyfSQiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZSI6ICJecG9kXFwtc2VjcmV0c1xcLWE0ZmJkNmYwXFwtNzQxZVxcLTQ0ZjhcXC04ZjI2XFwtMGJiNjc5MDYxMDJmJCIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1uYW1lc3BhY2UiOiAic2VjcmV0cy03NDI2IiwKICAgICAgICAgICJuZXJkY3RsL25ldHdvcmstbmFtZXNwYWNlIjogIl4vdmFyL3J1bi9uZXRucy9jbmktWzAtOWEtZl17OH0tWzAtOWEtZl17NH0tWzAtOWEtZl17NH0tWzAtOWEtZl17NH0tWzAtOWEtZl17MTJ9JCIKICAgICAgICB9LAogICAgICAgICJMaW51eCI6IHsKICAgICAgICAgICJOYW1lc3BhY2VzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgIlR5cGUiOiAiaXBjIiwKICAgICAgICAgICAgICAiUGF0aCI6ICIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiVHlwZSI6ICJ1dHMiLAogICAgICAgICAgICAgICJQYXRoIjogIiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJUeXBlIjogIm1vdW50IiwKICAgICAgICAgICAgICAiUGF0aCI6ICIiCiAgICAgICAgICAgIH0KICAgICAgICAgIF0sCiAgICAgICAgICAiTWFza2VkUGF0aHMiOiBbCiAgICAgICAgICAgICIvcHJvYy9hY3BpIiwKICAgICAgICAgICAgIi9wcm9jL2Fzb3VuZCIsCiAgICAgICAgICAgICIvcHJvYy9rY29yZSIsCiAgICAgICAgICAgICIvcHJvYy9rZXlzIiwKICAgICAgICAgICAgIi9wcm9jL2xhdGVuY3lfc3RhdHMiLAogICAgICAgICAgICAiL3Byb2MvdGltZXJfbGlzdCIsCiAgICAgICAgICAgICIvcHJvYy90aW1lcl9zdGF0cyIsCiAgICAgICAgICAgICIvcHJvYy9zY2hlZF9kZWJ1ZyIsCiAgICAgICAgICAgICIvc3lzL2Zpcm13YXJlIiwKICAgICAgICAgICAgIi9wcm9jL3Njc2kiCiAgICAgICAgICBdLAogICAgICAgICAgIlJlYWRvbmx5UGF0aHMiOiBbCiAgICAgICAgICAgICIvcHJvYy9idXMiLAogICAgICAgICAgICAiL3Byb2MvZnMiLAogICAgICAgICAgICAiL3Byb2MvaXJxIiwKICAgICAgICAgICAgIi9wcm9jL3N5cyIsCiAgICAgICAgICAgICIvcHJvYy9zeXNycS10cmlnZ2VyIgogICAgICAgICAgXSwKICAgICAgICAgICJEZXZpY2VzIjogW10sCiAgICAgICAgICAiU3lzY3RsIjogewogICAgICAgICAgICAibmV0LmlwdjQuaXBfdW5wcml2aWxlZ2VkX3BvcnRfc3RhcnQiOiAiMCIsCiAgICAgICAgICAgICJuZXQuaXB2NC5waW5nX2dyb3VwX3JhbmdlIjogIjAgMjE0NzQ4MzY0NyIKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0sCiAgICAgICJzdG9yYWdlcyI6IFsKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoMCkiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXIwKSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogIm92ZXJsYXlmcyIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAiZnVzZTMua2F0YS1vdmVybGF5IiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiNWE1YWFkODAwNTVmZjIwMDEyYTUwZGMyNWY4ZGY3YTI5OTI0NDc0MzI0ZDY1ZjdkNTMwNmVlOGVlMjdmZjcxZCIsCiAgICAgICAgICAgICI4MTcyNTBmMWEzZTMzNmRhNzZmNWJkM2ZhNzg0ZTFiMjZkOTU5YjljMTMxODc2ODE1YmEyNjA0MDQ4YjcwYzE4IgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGNwYXRoKS8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0KICAgICAgXSwKICAgICAgImRldmljZXMiOiBbXSwKICAgICAgInNhbmRib3hfcGlkbnMiOiBmYWxzZSwKICAgICAgImV4ZWNfY29tbWFuZHMiOiBbXSwKICAgICAgImVudl9tYXAiOiB7CiAgICAgICAgIlBBVEgiOiAiL3Vzci9sb2NhbC9zYmluOi91c3IvbG9jYWwvYmluOi91c3Ivc2JpbjovdXNyL2Jpbjovc2JpbjovYmluIgogICAgICB9CiAgICB9LAogICAgewogICAgICAiT0NJIjogewogICAgICAgICJWZXJzaW9uIjogIjEuMS4wLXJjLjEiLAogICAgICAgICJQcm9jZXNzIjogewogICAgICAgICAgIlRlcm1pbmFsIjogZmFsc2UsCiAgICAgICAgICAiVXNlciI6IHsKICAgICAgICAgICAgIlVJRCI6IDAsCiAgICAgICAgICAgICJHSUQiOiAwLAogICAgICAgICAgICAiQWRkaXRpb25hbEdpZHMiOiBbXSwKICAgICAgICAgICAgIlVzZXJuYW1lIjogIiIKICAgICAgICAgIH0sCiAgICAgICAgICAiRGVwcmVjYXRlZEFyZ3MiOiBbCiAgICAgICAgICAgICJzaCIKICAgICAgICAgIF0sCiAgICAgICAgICAiQXJncyI6IFsKICAgICAgICAgICAgInNoIgogICAgICAgICAgXSwKICAgICAgICAgICJFbnYiOiBbCiAgICAgICAgICAgICJQQVRIPS91c3IvbG9jYWwvc2JpbjovdXNyL2xvY2FsL2JpbjovdXNyL3NiaW46L3Vzci9iaW46L3NiaW46L2JpbiIsCiAgICAgICAgICAgICJIT1NUTkFNRT0kKGhvc3QtbmFtZSkiLAogICAgICAgICAgICAiU0VDUkVUX0RBVEE9bWVnYV9zZWNyZXRfa2V5XG4iCiAgICAgICAgICBdLAogICAgICAgICAgIkN3ZCI6ICIvIiwKICAgICAgICAgICJDYXBhYmlsaXRpZXMiOiB7CiAgICAgICAgICAgICJBbWJpZW50IjogW10sCiAgICAgICAgICAgICJCb3VuZGluZyI6IFsKICAgICAgICAgICAgICAiJChkZWZhdWx0X2NhcHMpIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiRWZmZWN0aXZlIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJJbmhlcml0YWJsZSI6IFtdLAogICAgICAgICAgICAiUGVybWl0dGVkIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICAiTm9OZXdQcml2aWxlZ2VzIjogZmFsc2UKICAgICAgICB9LAogICAgICAgICJSb290IjogewogICAgICAgICAgIlBhdGgiOiAiJChjcGF0aCkvJChidW5kbGUtaWQpIiwKICAgICAgICAgICJSZWFkb25seSI6IGZhbHNlCiAgICAgICAgfSwKICAgICAgICAiTW91bnRzIjogWwogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL3Byb2MiLAogICAgICAgICAgICAic291cmNlIjogInByb2MiLAogICAgICAgICAgICAidHlwZV8iOiAicHJvYyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYiLAogICAgICAgICAgICAic291cmNlIjogInRtcGZzIiwKICAgICAgICAgICAgInR5cGVfIjogInRtcGZzIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgInN0cmljdGF0aW1lIiwKICAgICAgICAgICAgICAibW9kZT03NTUiLAogICAgICAgICAgICAgICJzaXplPTY1NTM2ayIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvcHRzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJkZXZwdHMiLAogICAgICAgICAgICAidHlwZV8iOiAiZGV2cHRzIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAgICAgIm5ld2luc3RhbmNlIiwKICAgICAgICAgICAgICAicHRteG1vZGU9MDY2NiIsCiAgICAgICAgICAgICAgIm1vZGU9MDYyMCIsCiAgICAgICAgICAgICAgImdpZD01IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi9zaG0iLAogICAgICAgICAgICAic291cmNlIjogIi9ydW4va2F0YS1jb250YWluZXJzL3NhbmRib3gvc2htIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L21xdWV1ZSIsCiAgICAgICAgICAgICJzb3VyY2UiOiAibXF1ZXVlIiwKICAgICAgICAgICAgInR5cGVfIjogIm1xdWV1ZSIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9zeXMiLAogICAgICAgICAgICAic291cmNlIjogInN5c2ZzIiwKICAgICAgICAgICAgInR5cGVfIjogInN5c2ZzIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAgICAgIm5vZGV2IiwKICAgICAgICAgICAgICAicm8iCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvc3lzL2ZzL2Nncm91cCIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiY2dyb3VwIiwKICAgICAgICAgICAgInR5cGVfIjogImNncm91cCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIsCiAgICAgICAgICAgICAgInJlbGF0aW1lIiwKICAgICAgICAgICAgICAicm8iCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZXRjL2hvc3RzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KWhvc3RzJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJydyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvdGVybWluYXRpb24tbG9nIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KXRlcm1pbmF0aW9uLWxvZyQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicnciCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZXRjL2hvc3RuYW1lIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KWhvc3RuYW1lJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJydyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9ldGMvcmVzb2x2LmNvbmYiLAogICAgICAgICAgICAic291cmNlIjogIiQoc2ZwcmVmaXgpcmVzb2x2LmNvbmYkIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJ3IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL3Zhci9ydW4vc2VjcmV0cy9rdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50IiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KXNlcnZpY2VhY2NvdW50JCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJybyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi92YXIvcnVuL3NlY3JldHMvYXp1cmUvdG9rZW5zIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KXRva2VucyQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicm8iCiAgICAgICAgICAgIF0KICAgICAgICAgIH0KICAgICAgICBdLAogICAgICAgICJBbm5vdGF0aW9ucyI6IHsKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmJ1bmRsZV9wYXRoIjogIi9ydW4vY29udGFpbmVyZC9pby5jb250YWluZXJkLnJ1bnRpbWUudjIudGFzay9rOHMuaW8vJChidW5kbGUtaWQpIiwKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIjogInBvZF9jb250YWluZXIiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLmNvbnRhaW5lci1uYW1lIjogInNlY3JldC1lbnYtdGVzdCIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLXR5cGUiOiAiY29udGFpbmVyIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5pbWFnZS1uYW1lIjogInJlZ2lzdHJ5Lms4cy5pby9lMmUtdGVzdC1pbWFnZXMvYnVzeWJveDoxLjI5LTIiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtaWQiOiAiXlthLXowLTldezY0fSQiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZSI6ICJecG9kXFwtc2VjcmV0c1xcLWE0ZmJkNmYwXFwtNzQxZVxcLTQ0ZjhcXC04ZjI2XFwtMGJiNjc5MDYxMDJmJCIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1uYW1lc3BhY2UiOiAic2VjcmV0cy03NDI2IgogICAgICAgIH0sCiAgICAgICAgIkxpbnV4IjogewogICAgICAgICAgIk5hbWVzcGFjZXMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiVHlwZSI6ICJpcGMiLAogICAgICAgICAgICAgICJQYXRoIjogIiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJUeXBlIjogInV0cyIsCiAgICAgICAgICAgICAgIlBhdGgiOiAiIgogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgIlR5cGUiOiAibW91bnQiLAogICAgICAgICAgICAgICJQYXRoIjogIiIKICAgICAgICAgICAgfQogICAgICAgICAgXSwKICAgICAgICAgICJNYXNrZWRQYXRocyI6IFsKICAgICAgICAgICAgIi9wcm9jL2FjcGkiLAogICAgICAgICAgICAiL3Byb2Mva2NvcmUiLAogICAgICAgICAgICAiL3Byb2Mva2V5cyIsCiAgICAgICAgICAgICIvcHJvYy9sYXRlbmN5X3N0YXRzIiwKICAgICAgICAgICAgIi9wcm9jL3RpbWVyX2xpc3QiLAogICAgICAgICAgICAiL3Byb2MvdGltZXJfc3RhdHMiLAogICAgICAgICAgICAiL3Byb2Mvc2NoZWRfZGVidWciLAogICAgICAgICAgICAiL3Byb2Mvc2NzaSIsCiAgICAgICAgICAgICIvc3lzL2Zpcm13YXJlIgogICAgICAgICAgXSwKICAgICAgICAgICJSZWFkb25seVBhdGhzIjogWwogICAgICAgICAgICAiL3Byb2MvYXNvdW5kIiwKICAgICAgICAgICAgIi9wcm9jL2J1cyIsCiAgICAgICAgICAgICIvcHJvYy9mcyIsCiAgICAgICAgICAgICIvcHJvYy9pcnEiLAogICAgICAgICAgICAiL3Byb2Mvc3lzIiwKICAgICAgICAgICAgIi9wcm9jL3N5c3JxLXRyaWdnZXIiCiAgICAgICAgICBdLAogICAgICAgICAgIkRldmljZXMiOiBbXSwKICAgICAgICAgICJTeXNjdGwiOiB7CiAgICAgICAgICAgICJuZXQuaXB2NC5pcF91bnByaXZpbGVnZWRfcG9ydF9zdGFydCI6ICIwIiwKICAgICAgICAgICAgIm5ldC5pcHY0LnBpbmdfZ3JvdXBfcmFuZ2UiOiAiMCAyMTQ3NDgzNjQ3IgogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSwKICAgICAgInN0b3JhZ2VzIjogWwogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2gwKSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjApIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAib3ZlcmxheWZzIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJmdXNlMy5rYXRhLW92ZXJsYXkiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICI0ZDA2NTNmN2M3ZTNmNDliNDkwMDZhOWY0ZTgxM2FhMTE2NmM1MzJhMzRhNzY1MGFmYTZmYWE1MjI2ZjFlYzVmIiwKICAgICAgICAgICAgImJkNWJiMzg3MDlkMjk0M2EzNmEwMmU0NTRlMzRkM2Q2Y2FhMjM4NWZiMTQwZDdmMTc5N2ZkMGEyN2E5MzdkZGIiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQoY3BhdGgpLyQoYnVuZGxlLWlkKSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfQogICAgICBdLAogICAgICAiZGV2aWNlcyI6IFtdLAogICAgICAic2FuZGJveF9waWRucyI6IGZhbHNlLAogICAgICAiZXhlY19jb21tYW5kcyI6IFtdLAogICAgICAiZW52X21hcCI6IHsKICAgICAgICAiSE9TVE5BTUUiOiAiJChob3N0LW5hbWUpIiwKICAgICAgICAiUEFUSCI6ICIvdXNyL2xvY2FsL3NiaW46L3Vzci9sb2NhbC9iaW46L3Vzci9zYmluOi91c3IvYmluOi9zYmluOi9iaW4iLAogICAgICAgICJTRUNSRVRfREFUQSI6ICJtZWdhX3NlY3JldF9rZXlcbiIKICAgICAgfQogICAgfQogIF0sCiAgImNvbW1vbiI6IHsKICAgICJjcGF0aCI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zaGFyZWQvY29udGFpbmVycyIsCiAgICAibW91bnRfc291cmNlX2NwYXRoIjogIi9ydW4va2F0YS1jb250YWluZXJzL3NoYXJlZC9jb250YWluZXJzIiwKICAgICJzZnByZWZpeCI6ICJeJChjcGF0aCkvJChidW5kbGUtaWQpLVthLXowLTldezE2fS0iLAogICAgInNwYXRoIjogIi9ydW4va2F0YS1jb250YWluZXJzL3NhbmRib3gvc3RvcmFnZSIsCiAgICAiaXB2NF9hIjogIigoWzAtOV18WzEtOV1bMC05XXwxWzAtOV17Mn18MlswLTRdWzAtOV18MjVbMC01XSlcXC4pezN9KFswLTldfFsxLTldWzAtOV18MVswLTldezJ9fDJbMC00XVswLTldfDI1WzAtNV0pIiwKICAgICJpcF9wIjogIlswLTldezEsNX0iLAogICAgInN2Y19uYW1lIjogIltBLVpfXFwuXFwtXSsiLAogICAgImRuc19sYWJlbCI6ICJbYS16QS1aMC05X1xcLlxcLV0rIiwKICAgICJzX3NvdXJjZTEiOiAiXi4uMlswLTldezN9X1swLTFdWzAtOV1fWzAtM11bMC05XV9bMC0yXVswLTldX1swLTVdWzAtOV1fWzAtNV1bMC05XVxcLlswLTldezEsMTB9JCIsCiAgICAic19zb3VyY2UyIjogIl4uLmRhdGEvIiwKICAgICJkbnNfc3ViZG9tYWluIjogIl5bYS16MC05XShbLWEtejAtOV0qW2EtejAtOV0pPyQiLAogICAgInBvZF91aWQiOiAiXlswLTlhLWZBLUZdezh9LVswLTlhLWZBLUZdezR9LVswLTlhLWZBLUZdezR9LVswLTlhLWZBLUZdezR9LVswLTlhLWZBLUZdezEyfSQiLAogICAgImRlZmF1bHRfY2FwcyI6IFsKICAgICAgIkNBUF9DSE9XTiIsCiAgICAgICJDQVBfREFDX09WRVJSSURFIiwKICAgICAgIkNBUF9GU0VUSUQiLAogICAgICAiQ0FQX0ZPV05FUiIsCiAgICAgICJDQVBfTUtOT0QiLAogICAgICAiQ0FQX05FVF9SQVciLAogICAgICAiQ0FQX1NFVEdJRCIsCiAgICAgICJDQVBfU0VUVUlEIiwKICAgICAgIkNBUF9TRVRGQ0FQIiwKICAgICAgIkNBUF9TRVRQQ0FQIiwKICAgICAgIkNBUF9ORVRfQklORF9TRVJWSUNFIiwKICAgICAgIkNBUF9TWVNfQ0hST09UIiwKICAgICAgIkNBUF9LSUxMIiwKICAgICAgIkNBUF9BVURJVF9XUklURSIKICAgIF0sCiAgICAicHJpdmlsZWdlZF9jYXBzIjogWwogICAgICAiQ0FQX0NIT1dOIiwKICAgICAgIkNBUF9EQUNfT1ZFUlJJREUiLAogICAgICAiQ0FQX0RBQ19SRUFEX1NFQVJDSCIsCiAgICAgICJDQVBfRk9XTkVSIiwKICAgICAgIkNBUF9GU0VUSUQiLAogICAgICAiQ0FQX0tJTEwiLAogICAgICAiQ0FQX1NFVEdJRCIsCiAgICAgICJDQVBfU0VUVUlEIiwKICAgICAgIkNBUF9TRVRQQ0FQIiwKICAgICAgIkNBUF9MSU5VWF9JTU1VVEFCTEUiLAogICAgICAiQ0FQX05FVF9CSU5EX1NFUlZJQ0UiLAogICAgICAiQ0FQX05FVF9CUk9BRENBU1QiLAogICAgICAiQ0FQX05FVF9BRE1JTiIsCiAgICAgICJDQVBfTkVUX1JBVyIsCiAgICAgICJDQVBfSVBDX0xPQ0siLAogICAgICAiQ0FQX0lQQ19PV05FUiIsCiAgICAgICJDQVBfU1lTX01PRFVMRSIsCiAgICAgICJDQVBfU1lTX1JBV0lPIiwKICAgICAgIkNBUF9TWVNfQ0hST09UIiwKICAgICAgIkNBUF9TWVNfUFRSQUNFIiwKICAgICAgIkNBUF9TWVNfUEFDQ1QiLAogICAgICAiQ0FQX1NZU19BRE1JTiIsCiAgICAgICJDQVBfU1lTX0JPT1QiLAogICAgICAiQ0FQX1NZU19OSUNFIiwKICAgICAgIkNBUF9TWVNfUkVTT1VSQ0UiLAogICAgICAiQ0FQX1NZU19USU1FIiwKICAgICAgIkNBUF9TWVNfVFRZX0NPTkZJRyIsCiAgICAgICJDQVBfTUtOT0QiLAogICAgICAiQ0FQX0xFQVNFIiwKICAgICAgIkNBUF9BVURJVF9XUklURSIsCiAgICAgICJDQVBfQVVESVRfQ09OVFJPTCIsCiAgICAgICJDQVBfU0VURkNBUCIsCiAgICAgICJDQVBfTUFDX09WRVJSSURFIiwKICAgICAgIkNBUF9NQUNfQURNSU4iLAogICAgICAiQ0FQX1NZU0xPRyIsCiAgICAgICJDQVBfV0FLRV9BTEFSTSIsCiAgICAgICJDQVBfQkxPQ0tfU1VTUEVORCIsCiAgICAgICJDQVBfQVVESVRfUkVBRCIsCiAgICAgICJDQVBfUEVSRk1PTiIsCiAgICAgICJDQVBfQlBGIiwKICAgICAgIkNBUF9DSEVDS1BPSU5UX1JFU1RPUkUiCiAgICBdLAogICAgInZpcnRpb19ibGtfc3RvcmFnZV9jbGFzc2VzIjogWwogICAgICAiY2MtbG9jYWwtY3NpIiwKICAgICAgImNjLW1hbmFnZWQtY3NpIiwKICAgICAgImNjLW1hbmFnZWQtcHJlbWl1bS1jc2kiCiAgICBdLAogICAgInNtYl9zdG9yYWdlX2NsYXNzZXMiOiBbCiAgICAgIHsKICAgICAgICAibmFtZSI6ICJhenVyZWZpbGUtY3NpLWthdGEtY2MiLAogICAgICAgICJtb3VudF9vcHRpb25zIjogWwogICAgICAgICAgImRpcl9tb2RlPTA3NzciLAogICAgICAgICAgImZpbGVfbW9kZT0wNzc3IiwKICAgICAgICAgICJtZnN5bWxpbmtzIiwKICAgICAgICAgICJjYWNoZT1zdHJpY3QiLAogICAgICAgICAgIm5vc2hhcmVzb2NrIiwKICAgICAgICAgICJhY3RpbWVvPTMwIiwKICAgICAgICAgICJub2JybCIKICAgICAgICBdCiAgICAgIH0KICAgIF0KICB9LAogICJzYW5kYm94IjogewogICAgInN0b3JhZ2VzIjogWwogICAgICB7CiAgICAgICAgImRyaXZlciI6ICJlcGhlbWVyYWwiLAogICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICJzb3VyY2UiOiAic2htIiwKICAgICAgICAiZnN0eXBlIjogInRtcGZzIiwKICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAibm9kZXYiLAogICAgICAgICAgIm1vZGU9MTc3NyIsCiAgICAgICAgICAic2l6ZT02NzEwODg2NCIKICAgICAgICBdLAogICAgICAgICJtb3VudF9wb2ludCI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L3NobSIsCiAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICB9CiAgICBdCiAgfSwKICAicmVxdWVzdF9kZWZhdWx0cyI6IHsKICAgICJDcmVhdGVDb250YWluZXJSZXF1ZXN0IjogewogICAgICAiYWxsb3dfZW52X3JlZ2V4IjogWwogICAgICAgICJeSE9TVE5BTUU9JChkbnNfbGFiZWwpJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9QT1JUXyQoaXBfcClfVENQPXRjcDovLyQoaXB2NF9hKTokKGlwX3ApJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9QT1JUXyQoaXBfcClfVENQX1BST1RPPXRjcCQiLAogICAgICAgICJeJChzdmNfbmFtZSlfUE9SVF8kKGlwX3ApX1RDUF9QT1JUPSQoaXBfcCkkIiwKICAgICAgICAiXiQoc3ZjX25hbWUpX1BPUlRfJChpcF9wKV9UQ1BfQUREUj0kKGlwdjRfYSkkIiwKICAgICAgICAiXiQoc3ZjX25hbWUpX1NFUlZJQ0VfSE9TVD0kKGlwdjRfYSkkIiwKICAgICAgICAiXiQoc3ZjX25hbWUpX1NFUlZJQ0VfUE9SVD0kKGlwX3ApJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9TRVJWSUNFX1BPUlRfJChkbnNfbGFiZWwpPSQoaXBfcCkkIiwKICAgICAgICAiXiQoc3ZjX25hbWUpX1BPUlQ9dGNwOi8vJChpcHY0X2EpOiQoaXBfcCkkIiwKICAgICAgICAiXkFaVVJFX0NMSUVOVF9JRD1bQS1GYS1mMC05LV0qJCIsCiAgICAgICAgIl5BWlVSRV9URU5BTlRfSUQ9W0EtRmEtZjAtOS1dKiQiLAogICAgICAgICJeQVpVUkVfRkVERVJBVEVEX1RPS0VOX0ZJTEU9L3Zhci9ydW4vc2VjcmV0cy9henVyZS90b2tlbnMvYXp1cmUtaWRlbnRpdHktdG9rZW4kIiwKICAgICAgICAiXkFaVVJFX0FVVEhPUklUWV9IT1NUPWh0dHBzOi8vbG9naW5cXC5taWNyb3NvZnRvbmxpbmVcXC5jb20vJCIsCiAgICAgICAgIl5URVJNPXh0ZXJtJCIKICAgICAgXSwKICAgICAgImFsbG93X2Vudl9yZWdleF9tYXAiOiB7CiAgICAgICAgIkNQVV9MSU1JVCI6ICJeWzAtOV0rJCIsCiAgICAgICAgIkpPQl9DT01QTEVUSU9OX0lOREVYIjogIl5bMC05XSokIiwKICAgICAgICAiTUVNT1JZX0xJTUlUIjogIl5bMC05XSskIgogICAgICB9CiAgICB9LAogICAgIkNvcHlGaWxlUmVxdWVzdCI6IFsKICAgICAgIiQoc2ZwcmVmaXgpIgogICAgXSwKICAgICJFeGVjUHJvY2Vzc1JlcXVlc3QiOiB7CiAgICAgICJhbGxvd2VkX2NvbW1hbmRzIjogW10sCiAgICAgICJyZWdleCI6IFtdCiAgICB9LAogICAgIlVwZGF0ZVJvdXRlc1JlcXVlc3QiOiB7CiAgICAgICJmb3JiaWRkZW5fZGV2aWNlX25hbWVzIjogWwogICAgICAgICJsbyIKICAgICAgXSwKICAgICAgImZvcmJpZGRlbl9zb3VyY2VfcmVnZXgiOiBbCiAgICAgICAgIl4oPzowezAsNH06KXswLDd9MHswLDN9MSQiLAogICAgICAgICJeMTI3XFwuKD86WzAtOV17MSwzfVxcLil7Mn1bMC05XXsxLDN9JCIKICAgICAgXQogICAgfSwKICAgICJVcGRhdGVJbnRlcmZhY2VSZXF1ZXN0IjogewogICAgICAiYWxsb3dfcmF3X2ZsYWdzIjogMTI4LAogICAgICAiZm9yYmlkZGVuX25hbWVzIjogWwogICAgICAgICJsbyIKICAgICAgXSwKICAgICAgImZvcmJpZGRlbl9od19hZGRycyI6IFsKICAgICAgICAiMDA6MDA6MDA6MDA6MDA6MDAiCiAgICAgIF0KICAgIH0sCiAgICAiQ2xvc2VTdGRpblJlcXVlc3QiOiBmYWxzZSwKICAgICJSZWFkU3RyZWFtUmVxdWVzdCI6IGZhbHNlLAogICAgIlVwZGF0ZUVwaGVtZXJhbE1vdW50c1JlcXVlc3QiOiBmYWxzZSwKICAgICJXcml0ZVN0cmVhbVJlcXVlc3QiOiBmYWxzZQogIH0KfQ== +spec: + containers: + - command: + - sh + env: + - name: SECRET_DATA + valueFrom: + secretKeyRef: + key: data-1 + name: secret-test-3ce4e77c-45b6-4058-ab6e-3a8bf03d410e + image: "registry.k8s.io/e2e-test-images/busybox:1.29-2" + imagePullPolicy: IfNotPresent + name: secret-env-test + resources: {} + terminationMessagePath: /dev/termination-log + terminationMessagePolicy: File + volumeMounts: + - mountPath: /var/run/secrets/kubernetes.io/serviceaccount + name: kube-api-access-pck8d + readOnly: true + dnsPolicy: ClusterFirst + enableServiceLinks: true + preemptionPolicy: PreemptLowerPriority + priority: 0 + restartPolicy: Never + runtimeClassName: kata-cc + schedulerName: default-scheduler + securityContext: {} + serviceAccount: default + serviceAccountName: default + terminationGracePeriodSeconds: 30 + tolerations: + - effect: NoExecute + key: node.kubernetes.io/not-ready + operator: Exists + tolerationSeconds: 300 + - effect: NoExecute + key: node.kubernetes.io/unreachable + operator: Exists + tolerationSeconds: 300 + volumes: + - name: kube-api-access-pck8d + projected: + defaultMode: 420 + sources: + - serviceAccountToken: + expirationSeconds: 3607 + path: token + - configMap: + items: + - key: ca.crt + path: ca.crt + name: kube-root-ca.crt + - downwardAPI: + items: + - fieldRef: + apiVersion: v1 + fieldPath: metadata.namespace + path: namespace +status: {} diff --git a/src/agent/samples/policy/yaml/webhook/webhook-pod6.yaml b/src/agent/samples/policy/yaml/webhook/webhook-pod6.yaml new file mode 100644 index 000000000000..8631b1ffaa3b --- /dev/null +++ b/src/agent/samples/policy/yaml/webhook/webhook-pod6.yaml @@ -0,0 +1,123 @@ +--- +apiVersion: v1 +kind: Namespace +metadata: + name: projected-943 +--- +apiVersion: v1 +kind: Secret +metadata: + name: projected-secret-test-cf8fb82d-d193-47d2-9cce-189dbef9414c + namespace: projected-943 +data: + data-1: bWVnYV9zZWNyZXRfa2V5Cg== +--- +apiVersion: v1 +kind: Pod +metadata: + creationTimestamp: ~ + managedFields: + - apiVersion: v1 + fieldsType: FieldsV1 + fieldsV1: + "f:spec": + "f:containers": + "k:{\"name\":\"projected-secret-volume-test\"}": + ".": {} + "f:args": {} + "f:image": {} + "f:imagePullPolicy": {} + "f:name": {} + "f:resources": {} + "f:terminationMessagePath": {} + "f:terminationMessagePolicy": {} + "f:volumeMounts": + ".": {} + "k:{\"mountPath\":\"/etc/projected-secret-volume\"}": + ".": {} + "f:mountPath": {} + "f:name": {} + "f:dnsPolicy": {} + "f:enableServiceLinks": {} + "f:restartPolicy": {} + "f:schedulerName": {} + "f:securityContext": {} + "f:terminationGracePeriodSeconds": {} + "f:volumes": + ".": {} + "k:{\"name\":\"projected-secret-volume\"}": + ".": {} + "f:name": {} + "f:projected": + ".": {} + "f:defaultMode": {} + "f:sources": {} + manager: e2e.test + operation: Update + time: "2023-06-20T21:06:10Z" + name: pod-projected-secrets-c64e2cb2-f7ba-418d-a63b-27f49707ea3d + namespace: projected-943 + annotations: + io.katacontainers.config.agent.policy: IyBDb3B5cmlnaHQgKGMpIDIwMjMgTWljcm9zb2Z0IENvcnBvcmF0aW9uCiMKIyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMAojCnBhY2thZ2UgYWdlbnRfcG9saWN5CgppbXBvcnQgZnV0dXJlLmtleXdvcmRzLmluCmltcG9ydCBmdXR1cmUua2V5d29yZHMuZXZlcnkKCiMgRGVmYXVsdCB2YWx1ZXMsIHJldHVybmVkIGJ5IE9QQSB3aGVuIHJ1bGVzIGNhbm5vdCBiZSBldmFsdWF0ZWQgdG8gdHJ1ZS4KZGVmYXVsdCBBZGRBUlBOZWlnaGJvcnNSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgQWRkU3dhcFJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBDbG9zZVN0ZGluUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IENvcHlGaWxlUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IENyZWF0ZUNvbnRhaW5lclJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBDcmVhdGVTYW5kYm94UmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IERlc3Ryb3lTYW5kYm94UmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgRXhlY1Byb2Nlc3NSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgR2V0T09NRXZlbnRSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBHdWVzdERldGFpbHNSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBMaXN0SW50ZXJmYWNlc1JlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBMaXN0Um91dGVzUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IE1lbUhvdHBsdWdCeVByb2JlUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IE9ubGluZUNQVU1lbVJlcXVlc3QgOj0gdHJ1ZQpkZWZhdWx0IFBhdXNlQ29udGFpbmVyUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFJlYWRTdHJlYW1SZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgUmVtb3ZlQ29udGFpbmVyUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgUmVtb3ZlU3RhbGVWaXJ0aW9mc1NoYXJlTW91bnRzUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgUmVzZWVkUmFuZG9tRGV2UmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFJlc3VtZUNvbnRhaW5lclJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBTZXRHdWVzdERhdGVUaW1lUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFNldFBvbGljeVJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBTaWduYWxQcm9jZXNzUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgU3RhcnRDb250YWluZXJSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBTdGFydFRyYWNpbmdSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgU3RhdHNDb250YWluZXJSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBTdG9wVHJhY2luZ1JlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBUdHlXaW5SZXNpemVSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBVcGRhdGVDb250YWluZXJSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgVXBkYXRlRXBoZW1lcmFsTW91bnRzUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFVwZGF0ZUludGVyZmFjZVJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBVcGRhdGVSb3V0ZXNSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgV2FpdFByb2Nlc3NSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBXcml0ZVN0cmVhbVJlcXVlc3QgOj0gZmFsc2UKCiMgQWxsb3dSZXF1ZXN0c0ZhaWxpbmdQb2xpY3kgOj0gdHJ1ZSBjb25maWd1cmVzIHRoZSBBZ2VudCB0byAqYWxsb3cgYW55CiMgcmVxdWVzdHMgY2F1c2luZyBhIHBvbGljeSBmYWlsdXJlKi4gVGhpcyBpcyBhbiB1bnNlY3VyZSBjb25maWd1cmF0aW9uCiMgYnV0IGlzIHVzZWZ1bCBmb3IgYWxsb3dpbmcgdW5zZWN1cmUgcG9kcyB0byBzdGFydCwgdGhlbiBjb25uZWN0IHRvCiMgdGhlbSBhbmQgaW5zcGVjdCBPUEEgbG9ncyBmb3IgdGhlIHJvb3QgY2F1c2Ugb2YgYSBmYWlsdXJlLgpkZWZhdWx0IEFsbG93UmVxdWVzdHNGYWlsaW5nUG9saWN5IDo9IGZhbHNlCgojIENvbnN0YW50cwpTX05BTUVfS0VZID0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZSIKU19OQU1FU1BBQ0VfS0VZID0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZXNwYWNlIgpCVU5ETEVfSUQgPSAiW2EtejAtOV17NjR9IgoKQ3JlYXRlQ29udGFpbmVyUmVxdWVzdDo9IHJlc3AgewogICAgbm90IGlzX251bGwoaW5wdXQuZW52X21hcCkKICAgIAogICAgaV9lbnZfbWFwIDo9IGlucHV0LmVudl9tYXAKICAgIAogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBwX2Vudl9tYXAgOj0gcF9jb250YWluZXIuZW52X21hcCAgCiAgICBhbGxvd19lbnZfbWFwKHBfZW52X21hcCwgaV9lbnZfbWFwKQogICAgCiAgICBpX3Byb2Nlc3MgOj0gaW5wdXQuYmFzZS5PQ0kuUHJvY2VzcwogICAgCiAgICBwX3Byb2Nlc3MgOj0gcF9jb250YWluZXIuT0NJLlByb2Nlc3MKICAgIAogICAgYWxsb3dfYXJncyhpX3Byb2Nlc3MsIHBfcHJvY2VzcywgaV9lbnZfbWFwKQoKICAgIHJlc3AgPSBDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uKGlucHV0LmJhc2UpCiAgICBwcmludCgiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdDogdHJ1ZSIpCn0KCmFsbG93X2FyZ3MoaV9wcm9jZXNzLCBwX3Byb2Nlc3MsIGlfZW52X21hcCkgewogICAgaV9hcmdzIDo9IGlfcHJvY2Vzcy5BcmdzCiAgICBwX2FyZ3MgOj0gcF9wcm9jZXNzLkFyZ3MKICAgIHByaW50KCJhbGxvd19hcmdzOiBpX2FyZ3MgPSIsIGlfYXJncywgInBfYXJncyA9IiwgcF9hcmdzKQogICAgY291bnQoaV9hcmdzKSA9PSBjb3VudChwX2FyZ3MpCiAgICBldmVyeSBpLCBpX2FyZyBpbiBpX2FyZ3MgewogICAgICAgIHByaW50KCJhbGxvd19hcmdzOiBpX2FyZyA9IiwgaV9hcmcpCiAgICAgICAgcF9hcmdfcmVwbGFjZWQgOj0gcmVwbGFjZV9lbnZfdmFyaWFibGVzKHBfYXJnc1tpXSwgaV9lbnZfbWFwKQogICAgICAgIHByaW50KCJhbGxvd19hcmdzOiBwX2FyZ19yZXBsYWNlZCA9IiwgcF9hcmdfcmVwbGFjZWQpCiAgICAgICAgcF9hcmdfcmVwbGFjZWQyIDo9IHJlcGxhY2UocF9hcmdfcmVwbGFjZWQsICIkJCIsICIkIikKICAgICAgICBwcmludCgiYWxsb3dfYXJnczogcF9hcmdfcmVwbGFjZWQyID0iLCBwX2FyZ19yZXBsYWNlZDIpCiAgICAgICAgaV9hcmcgPT0gcF9hcmdfcmVwbGFjZWQyCiAgICB9CiAgICBwcmludCgiYWxsb3dfYXJnczogdHJ1ZSIpCn0KCmFsbG93X2FyZ3MoaV9wcm9jZXNzLCBwX3Byb2Nlc3MsIGlfZW52X21hcCkgewogICAgbm90IGlfcHJvY2Vzcy5BcmdzCiAgICBub3QgcF9wcm9jZXNzLkFyZ3MKICAgIHByaW50KCJhbGxvd19hcmdzMjogbm8gYXJncyIpCn0KCiMgdGhpcyBmdW5jdGlvbiByZXBsYWNlcyBhbGwgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyBpbiBhIHN0cmluZywgZ2l2ZW4gYSBtYXAgb2YgZW52aXJvbm1lbnQga2V5cyB0byBlbnZpcm9ubWVudCB2YWx1ZXMKIyBlZyBzdHIgPSAiZWNobyAkKENMVVNURVJfSUQpOyBlY2hvICQoTk9ERV9OQU1FKTsiCiMgZW52X21hcCA9IHsiQ0xVU1RFUl9JRCI6ICJhYmMiLCAiTk9ERV9OQU1FIiA6ICJ4eXoifQojIHJlc3VsdCA9ICJlY2hvIGFiYzsgZWNobyB4eXo7IgpyZXBsYWNlX2Vudl92YXJpYWJsZXMoc3RyLCBlbnZfbWFwKSA9IHJlc3VsdCB7CiAgICAjIG1ha2UgYW4gYXJyYXkgb2YgdGhlIGtleXMgZWcgWyJDTFVTVEVSX0lEIiwgIk5PREVfTkFNRSJdCiAgICBrZXlzIDo9IFt4IHwgc29tZSB4IGluIG9iamVjdC5rZXlzKGVudl9tYXApXQogICAgcmVzdWx0IDo9IHJlcGxhY2Vfc3RyX3JlYyhzdHIsIGVudl9tYXAsIGtleXMsIGNvdW50KGtleXMpIC0gMSkKfQoKIyBiYXNlIGNhc2UKcmVwbGFjZV9zdHJfcmVjKHN0ciwgZW52X21hcCwgYXJyX2tleXMsIGkpID0gcmVzdWx0IHsKICAgIGkgPCAwCiAgICByZXN1bHQgOj0gc3RyCn0KCiMgcmVjdXJzaXZlIHN0ZXAKcmVwbGFjZV9zdHJfcmVjKHN0ciwgZW52X21hcCwgYXJyX2tleXMsIGkpID0gcmVzdWx0IHsKICAgIGkgPj0gMAogICAga2V5IDo9IGFycl9rZXlzW2ldCiAgICBlbnZfa2V5MSA6PSBjb25jYXQoIiIsIFsiJCgiLCBrZXksICIpIl0pCiAgICAjIHJlcGxhY2UgJChWQVIpIHdpdGggdmFsdWUKICAgIG5ld19zdHIxIDo9IHJlcGxhY2Uoc3RyLCBlbnZfa2V5MSwgZW52X21hcFtrZXldKQogICAgIyByZXBsYWNlIG5leHQgZW52aXJvbm1lbnQgdmFyaWFibGUKICAgIHJlc3VsdCA9IHJlcGxhY2Vfc3RyX3JlYyhuZXdfc3RyMSwgZW52X21hcCwgYXJyX2tleXMsIGkgLSAxKQp9CgphbGxvd19lbnZfbWFwKHBfZW52X21hcCwgaV9lbnZfbWFwKSB7CiAgICBwcmludCgiYWxsb3dfZW52X21hcDogcF9lbnZfbWFwID0iLCBwX2Vudl9tYXApCiAgICBldmVyeSBlbnZfa2V5LCBlbnZfdmFsIGluIGlfZW52X21hcCB7CiAgICAgICAgcHJpbnQoImFsbG93X2VudjogZW52X2tleSA9IiwgZW52X2tleSwgImVudl92YWwgPSIsIGVudl92YWwpCiAgICAgICAgYWxsb3dfZW52X21hcF9lbnRyeShlbnZfa2V5LCBlbnZfdmFsLCBwX2Vudl9tYXApCiAgICB9CiAgICBwcmludCgiYWxsb3dfZW52X21hcDogdHJ1ZSIpCn0KCiMgQWxsb3cgZXhhY3QgbWF0Y2gKYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBpX3ZhbCA9PSBwX3ZhbAogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnk6IHRydWUiKQp9CgojIEFsbG93IHJlc291cmNlRmllbGRSZWYgdmFsdWVzIChlLmcuLCAibGltaXRzLmNwdSIpLgphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgICMgYSB2YXJpYWJsZSB3ZSBzaG91bGQgYmUgdmFsaWRhdGluZyB1c2luZyBhIHJlZ2V4IGZyb20gc2V0dGluZ3MKICAgIHBfdmFsID09ICIkKHZhbGlkYXRlLWZyb20tc2V0dGluZ3MpIgogICAgcmVnZXhfdmFsIDo9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuQ3JlYXRlQ29udGFpbmVyUmVxdWVzdC5hbGxvd19lbnZfcmVnZXhfbWFwW2tleV0KICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4X3ZhbCwgaV92YWwpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSAyOiB0cnVlIikKfQoKIyBBbGxvdyBub2RlLW5hbWUKYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChub2RlLW5hbWUpIgogICAgcmVnZXgubWF0Y2gocG9saWN5X2RhdGEuY29tbW9uLmRuc19zdWJkb21haW4gLCBpX3ZhbCkKICAgIHByaW50KCJhbGxvd19lbnZfbWFwX2VudHJ5IDM6IHRydWUiKQp9CgojIEFsbG93IGhvc3QtbmFtZQphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgIHBfdmFsID09ICIkKGhvc3QtbmFtZSkiCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24uZG5zX2xhYmVsICwgaV92YWwpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSA0OiB0cnVlIikKfQoKIyBBbGxvdyBwb2QtdWlkCmFsbG93X2Vudl9tYXBfZW50cnkoa2V5LCBpX3ZhbCwgcF9lbnZfbWFwKSB7CiAgICBwX3ZhbCA6PSBwX2Vudl9tYXBba2V5XQogICAgcF92YWwgPT0gIiQocG9kLXVpZCkiCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24ucG9kX3VpZCAsIGlfdmFsKQogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgNTogdHJ1ZSIpCn0KCiMgQWxsb3cgZmllbGRSZWYgImZpZWxkUGF0aDogc3RhdHVzLnBvZElQIiB2YWx1ZXMuCmFsbG93X2Vudl9tYXBfZW50cnkoa2V5LCBpX3ZhbCwgcF9lbnZfbWFwKSB7CiAgICBpc19pcChpX3ZhbCkKCiAgICBwX3ZhbCA6PSBwX2Vudl9tYXBba2V5XQogICAgcF92YXIgOj0gY29uY2F0KCI9IiwgW2tleSwgcF92YWxdKQogICAgYWxsb3dfcG9kX2lwX3ZhcihrZXksIHBfdmFyKQogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgNjogdHJ1ZSIpCn0KCiMgQWxsb3cgZmllbGRSZWYgImZpZWxkUGF0aDogc3RhdHVzLmhvc3RJUCIgdmFsdWVzLgphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgaXNfaXAoaV92YWwpCgogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgIHBfdmFyIDo9IGNvbmNhdCgiPSIsIFtrZXksIHBfdmFsXSkKICAgIGFsbG93X2hvc3RfaXBfdmFyKGtleSwgcF92YXIpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSA3OiB0cnVlIikKfQoKIyBNYXRjaCBpbnB1dCB3aXRoIG9uZSBvZiB0aGUgcG9saWN5IHZhcmlhYmxlcywgYWZ0ZXIgc3Vic3RpdHV0aW5nICQoc2FuZGJveC1uYW1lKS4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChzYW5kYm94LW5hbWUpIgogICAgc19uYW1lIDo9IGlucHV0LmJhc2UuT0NJLkFubm90YXRpb25zW1NfTkFNRV9LRVldCiAgICBwX3ZhcjIgOj0gcmVwbGFjZShwX3ZhbCwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHBfdmFyMiA9PSBpX3ZhbAogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgODogdHJ1ZSIpCn0KCiMgTWF0Y2ggaW5wdXQgd2l0aCBvbmUgb2YgdGhlIHBvbGljeSB2YXJpYWJsZXMsIGFmdGVyIHN1YnN0aXR1dGluZyAkKHNhbmRib3gtbmFtZXNwYWNlKS4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChzYW5kYm94LW5hbWVzcGFjZSkiCiAgICBzX25hbWVzcGFjZSA6PSBpbnB1dC5iYXNlLk9DSS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwX3ZhcjIgOj0gcmVwbGFjZShwX3ZhbCwgIiQoc2FuZGJveC1uYW1lc3BhY2UpIiwgc19uYW1lc3BhY2UpCiAgICBwX3ZhcjIgPT0gaV92YWwKICAgIHByaW50KCJhbGxvd19lbnZfbWFwX2VudHJ5IDk6IHRydWUiKQp9CgojIEFsbG93IGlucHV0IGVudiB2YXJpYWJsZXMgdGhhdCBtYXRjaCB3aXRoIGEgcmVxdWVzdF9kZWZhdWx0cyByZWdleC4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHNvbWUgcF9yZWdleDEgaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5DcmVhdGVDb250YWluZXJSZXF1ZXN0LmFsbG93X2Vudl9yZWdleAogICAgcF9yZWdleDIgOj0gcmVwbGFjZShwX3JlZ2V4MSwgIiQoaXB2NF9hKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcHY0X2EpCiAgICBwX3JlZ2V4MyA6PSByZXBsYWNlKHBfcmVnZXgyLCAiJChpcF9wKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcF9wKQogICAgcF9yZWdleDQgOj0gcmVwbGFjZShwX3JlZ2V4MywgIiQoc3ZjX25hbWUpIiwgcG9saWN5X2RhdGEuY29tbW9uLnN2Y19uYW1lKQogICAgcF9yZWdleDUgOj0gcmVwbGFjZShwX3JlZ2V4NCwgIiQoZG5zX2xhYmVsKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5kbnNfbGFiZWwpCgogICAgcmVzdWx0IDo9IGNvbmNhdCgiPSIsIFtrZXksIGlfdmFsXSkKICAgIHJlZ2V4Lm1hdGNoKHBfcmVnZXg1LCByZXN1bHQpCgogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgMTA6IHRydWUiKQp9CgpDcmVhdGVDb250YWluZXJSZXF1ZXN0Oj0gcmVzcCB7CiAgICBub3QgaW5wdXQuZW52X21hcAogICAgaV9wcm9jZXNzID0gaW5wdXQuT0NJLlByb2Nlc3MKICAgIHNfbmFtZSA9IGlucHV0Lk9DSS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBwX3Byb2Nlc3MgPSBwX2NvbnRhaW5lci5PQ0kuUHJvY2VzcwogICAgYWxsb3dfZGVwcmVjYXRlZF9hcmdzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUpCiAgICByZXNwID0gQ3JlYXRlQ29udGFpbmVyUmVxdWVzdENvbW1vbihpbnB1dCkKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0MjogdHJ1ZSIpCn0KCkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb24ocmVxKTo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgICMgQ2hlY2sgaWYgdGhlIGlucHV0IHJlcXVlc3Qgc2hvdWxkIGJlIHJlamVjdGVkIGV2ZW4gYmVmb3JlIGNoZWNraW5nIHRoZQogICAgIyBwb2xpY3lfZGF0YS5jb250YWluZXJzIGluZm9ybWF0aW9uLgogICAgYWxsb3dfY3JlYXRlX2NvbnRhaW5lcl9pbnB1dChyZXEpCgogICAgaV9vY2kgOj0gcmVxLk9DSQogICAgaV9zdG9yYWdlcyA6PSByZXEuc3RvcmFnZXMKICAgIGlfZGV2aWNlcyA6PSByZXEuZGV2aWNlcwoKICAgICMgYXJyYXkgb2YgcG9zc2libGUgc3RhdGUgb3BlcmF0aW9ucwogICAgb3BzX2J1aWxkZXIgOj0gW10KCiAgICAjIGNoZWNrIHNhbmRib3ggbmFtZQogICAgc2FuZGJveF9uYW1lID0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FX0tFWV0KICAgIGFkZF9zYW5kYm94X25hbWVfdG9fc3RhdGUgOj0gc3RhdGVfYWxsb3dzKCJzYW5kYm94X25hbWUiLCBzYW5kYm94X25hbWUpCiAgICBvcHNfYnVpbGRlcjEgOj0gY29uY2F0X29wX2lmX25vdF9udWxsKG9wc19idWlsZGVyLCBhZGRfc2FuZGJveF9uYW1lX3RvX3N0YXRlKQoKICAgICMgQ2hlY2sgaWYgYW55IGVsZW1lbnQgZnJvbSB0aGUgcG9saWN5X2RhdGEuY29udGFpbmVycyBhcnJheSBhbGxvd3MgdGhlIGlucHV0IHJlcXVlc3QuCiAgICBzb21lIHBfY29udGFpbmVyIGluIHBvbGljeV9kYXRhLmNvbnRhaW5lcnMKICAgIHByaW50KCI9PT09PT09PSBDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiB0cnlpbmcgbmV4dCBwb2xpY3kgY29udGFpbmVyIikKCiAgICBwX3BpZG5zIDo9IHBfY29udGFpbmVyLnNhbmRib3hfcGlkbnMKICAgIGlfcGlkbnMgOj0gcmVxLnNhbmRib3hfcGlkbnMKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiBwX3BpZG5zID0iLCBwX3BpZG5zLCAiaV9waWRucyA9IiwgaV9waWRucykKICAgIHBfcGlkbnMgPT0gaV9waWRucwoKICAgIHBfb2NpIDo9IHBfY29udGFpbmVyLk9DSQoKICAgICMgY2hlY2sgbmFtZXNwYWNlCiAgICBwX25hbWVzcGFjZSA6PSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBpX25hbWVzcGFjZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwcmludCAoIkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb246IHBfbmFtZXNwYWNlID0iLCBwX25hbWVzcGFjZSwgImlfbmFtZXNwYWNlID0iLCBpX25hbWVzcGFjZSkKICAgIGFkZF9uYW1lc3BhY2VfdG9fc3RhdGUgOj0gYWxsb3dfbmFtZXNwYWNlKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkKICAgIG9wc19idWlsZGVyMiA6PSBjb25jYXRfb3BfaWZfbm90X251bGwob3BzX2J1aWxkZXIxLCBhZGRfbmFtZXNwYWNlX3RvX3N0YXRlKQoKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiBwIFZlcnNpb24gPSIsIHBfb2NpLlZlcnNpb24sICJpIFZlcnNpb24gPSIsIGlfb2NpLlZlcnNpb24pCiAgICBwX29jaS5WZXJzaW9uID09IGlfb2NpLlZlcnNpb24KCiAgICBwcmludCgiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdENvbW1vbjogcCBSZWFkb25seSA9IiwgcF9vY2kuUm9vdC5SZWFkb25seSwgImkgUmVhZG9ubHkgPSIsIGlfb2NpLlJvb3QuUmVhZG9ubHkpCiAgICBwX29jaS5Sb290LlJlYWRvbmx5ID09IGlfb2NpLlJvb3QuUmVhZG9ubHkKCiAgICBhbGxvd19hbm5vKHBfb2NpLCBpX29jaSkKCiAgICBwX3N0b3JhZ2VzIDo9IHBfY29udGFpbmVyLnN0b3JhZ2VzCiAgICBhbGxvd19ieV9hbm5vKHBfb2NpLCBpX29jaSwgcF9zdG9yYWdlcywgaV9zdG9yYWdlcykKCiAgICBwX2RldmljZXMgOj0gcF9jb250YWluZXIuZGV2aWNlcwogICAgYWxsb3dfZGV2aWNlcyhwX2RldmljZXMsIGlfZGV2aWNlcykKCiAgICByZXQgOj0gYWxsb3dfbGludXgob3BzX2J1aWxkZXIyLCBwX29jaSwgaV9vY2kpCiAgICByZXQuYWxsb3dlZAoKICAgIG9wcyA6PSByZXQub3BzCgogICAgcHJpbnQoIkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb246IHRydWUiKQp9CgphbGxvd19jcmVhdGVfY29udGFpbmVyX2lucHV0KHJlcSkgewogICAgcHJpbnQoImFsbG93X2NyZWF0ZV9jb250YWluZXJfaW5wdXQ6IGlucHV0ID0iLCByZXEpCgogICAgY291bnQocmVxLnNoYXJlZF9tb3VudHMpID09IDAKICAgIGlzX251bGwocmVxLnN0cmluZ191c2VyKQoKICAgIGlfb2NpIDo9IHJlcS5PQ0kKICAgIGlzX251bGwoaV9vY2kuSG9va3MpCiAgICBpc19udWxsKGlfb2NpLlNvbGFyaXMpCiAgICBpc19udWxsKGlfb2NpLldpbmRvd3MpCgogICAgaV9saW51eCA6PSBpX29jaS5MaW51eAogICAgY291bnQoaV9saW51eC5HSURNYXBwaW5ncykgPT0gMAogICAgY291bnQoaV9saW51eC5Nb3VudExhYmVsKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlJlc291cmNlcy5EZXZpY2VzKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlJvb3Rmc1Byb3BhZ2F0aW9uKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlVJRE1hcHBpbmdzKSA9PSAwCiAgICBpc19udWxsKGlfbGludXguSW50ZWxSZHQpCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLkJsb2NrSU8pCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLk5ldHdvcmspCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLlBpZHMpCiAgICBpc19udWxsKGlfbGludXguU2VjY29tcCkKCiAgICBpX3Byb2Nlc3MgOj0gaV9vY2kuUHJvY2VzcwogICAgY291bnQoaV9wcm9jZXNzLlNlbGludXhMYWJlbCkgPT0gMAogICAgY291bnQoaV9wcm9jZXNzLlVzZXIuVXNlcm5hbWUpID09IDAKCiAgICBwcmludCgiYWxsb3dfY3JlYXRlX2NvbnRhaW5lcl9pbnB1dDogdHJ1ZSIpCn0KCmFsbG93X25hbWVzcGFjZShwX25hbWVzcGFjZSwgaV9uYW1lc3BhY2UpID0gYWRkX25hbWVzcGFjZSB7CiAgICBwX25hbWVzcGFjZSA9PSBpX25hbWVzcGFjZQogICAgYWRkX25hbWVzcGFjZSA6PSBudWxsCiAgICBwcmludCgiYWxsb3dfbmFtZXNwYWNlIDE6IGlucHV0IG5hbWVzcGFjZSBtYXRjaGVzIHBvbGljeSBkYXRhIikKfQoKYWxsb3dfbmFtZXNwYWNlKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkgPSBhZGRfbmFtZXNwYWNlIHsKICAgIHBfbmFtZXNwYWNlID09ICIiCiAgICBwcmludCgiYWxsb3dfbmFtZXNwYWNlIDI6IG5vIG5hbWVzcGFjZSBmb3VuZCBvbiBwb2xpY3kgZGF0YSIpCiAgICBhZGRfbmFtZXNwYWNlIDo9IHN0YXRlX2FsbG93cygibmFtZXNwYWNlIiwgaV9uYW1lc3BhY2UpCn0KCiMgdmFsdWUgaGFzbid0IGJlZW4gc2VlbiBiZWZvcmUsIHNhdmUgaXQgdG8gc3RhdGUKc3RhdGVfYWxsb3dzKGtleSwgdmFsdWUpID0gYWN0aW9uIHsKICBzdGF0ZSA6PSBnZXRfc3RhdGUoKQogIHByaW50KCJzdGF0ZV9hbGxvd3MgMTogc3RhdGVba2V5XSA9Iiwgc3RhdGVba2V5XSwgInZhbHVlID0iLCB2YWx1ZSkKICBub3Qgc3RhdGVba2V5XQogIHByaW50KCJzdGF0ZV9hbGxvd3MgMTogc2F2aW5nIHRvIHN0YXRlIGtleSA9Iiwga2V5LCAidmFsdWUgPSIsIHZhbHVlKQogIHBhdGggOj0gZ2V0X3N0YXRlX3BhdGgoa2V5KSAKICBhY3Rpb24gOj0gewogICAgIm9wIjogImFkZCIsCiAgICAicGF0aCI6IHBhdGgsIAogICAgInZhbHVlIjogdmFsdWUsCiAgfQp9CgojIHZhbHVlIG1hdGNoZXMgd2hhdCdzIGluIHN0YXRlLCBhbGxvdyBpdApzdGF0ZV9hbGxvd3Moa2V5LCB2YWx1ZSkgPSBhY3Rpb24gewogIHByaW50KCJzdGF0ZV9hbGxvd3MgMjogc3RhcnQiKQogIHN0YXRlIDo9IGdldF9zdGF0ZSgpCiAgcHJpbnQoInN0YXRlX2FsbG93cyAyOiBzdGF0ZVtrZXldID0iLCBzdGF0ZVtrZXldLCAidmFsdWUgPSIsIHZhbHVlKQogIHZhbHVlID09IHN0YXRlW2tleV0KICBwcmludCgic3RhdGVfYWxsb3dzIDI6IGZvdW5kIGtleSA9Iiwga2V5LCAidmFsdWUgPSIsIHZhbHVlLCAiIGluIHN0YXRlIikKICBhY3Rpb24gOj0gbnVsbAp9CgojIGhlbHBlciBmdW5jdGlvbnMgdG8gaW50ZXJhY3Qgd2l0aCB0aGUgc3RhdGUKZ2V0X3N0YXRlKCkgPSBzdGF0ZSB7CiAgc3RhdGUgOj0gZGF0YVsicHN0YXRlIl0KfQoKZ2V0X3N0YXRlX3ZhbChrZXkpID0gdmFsdWUgewogICAgc3RhdGUgOj0gZ2V0X3N0YXRlKCkKICAgIHZhbHVlIDo9IHN0YXRlW2tleV0KfQoKZ2V0X3N0YXRlX3BhdGgoa2V5KSA9IHBhdGggewogICAgIyBwcmVwZW5kICIvcHN0YXRlLyIgdG8ga2V5CiAgICBwYXRoIDo9IGNvbmNhdCgiLyIsIFsiL3BzdGF0ZSIsIGtleV0pCn0KCiMgSGVscGVyIGZ1bmN0aW9ucyB0byBjb25kaXRpb25hbGx5IGNvbmNhdGVuYXRlIG9wIGlzIG5vdCBudWxsCmNvbmNhdF9vcF9pZl9ub3RfbnVsbChvcHMsIG9wKSA9IHJlc3VsdCB7CiAgICBvcCA9PSBudWxsCiAgICByZXN1bHQgOj0gb3BzCn0KCmNvbmNhdF9vcF9pZl9ub3RfbnVsbChvcHMsIG9wKSA9IHJlc3VsdCB7CiAgICBvcCAhPSBudWxsCiAgICByZXN1bHQgOj0gYXJyYXkuY29uY2F0KG9wcywgW29wXSkKfQoKIyBSZWplY3QgdW5leHBlY3RlZCBhbm5vdGF0aW9ucy4KYWxsb3dfYW5ubyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19hbm5vIDE6IHN0YXJ0IikKCiAgICBub3QgaV9vY2kuQW5ub3RhdGlvbnMKCiAgICBwcmludCgiYWxsb3dfYW5ubyAxOiB0cnVlIikKfQphbGxvd19hbm5vKHBfb2NpLCBpX29jaSkgewogICAgcHJpbnQoImFsbG93X2Fubm8gMjogcCBBbm5vdGF0aW9ucyA9IiwgcF9vY2kuQW5ub3RhdGlvbnMpCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiBpIEFubm90YXRpb25zID0iLCBpX29jaS5Bbm5vdGF0aW9ucykKCiAgICBpX2tleXMgOj0gb2JqZWN0LmtleXMoaV9vY2kuQW5ub3RhdGlvbnMpCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiBpIGtleXMgPSIsIGlfa2V5cykKCiAgICBldmVyeSBpX2tleSBpbiBpX2tleXMgewogICAgICAgIGFsbG93X2Fubm9fa2V5KGlfa2V5LCBwX29jaSkKICAgIH0KCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiB0cnVlIikKfQoKYWxsb3dfYW5ub19rZXkoaV9rZXksIHBfb2NpKSB7CiAgICBwcmludCgiYWxsb3dfYW5ub19rZXkgMTogaSBrZXkgPSIsIGlfa2V5KQoKICAgIHN0YXJ0c3dpdGgoaV9rZXksICJpby5rdWJlcm5ldGVzLmNyaS4iKQoKICAgIHByaW50KCJhbGxvd19hbm5vX2tleSAxOiB0cnVlIikKfQphbGxvd19hbm5vX2tleShpX2tleSwgcF9vY2kpIHsKICAgIHByaW50KCJhbGxvd19hbm5vX2tleSAyOiBpIGtleSA9IiwgaV9rZXkpCgogICAgc29tZSBwX2tleSwgXyBpbiBwX29jaS5Bbm5vdGF0aW9ucwogICAgcF9rZXkgPT0gaV9rZXkKCiAgICBwcmludCgiYWxsb3dfYW5ub19rZXkgMjogdHJ1ZSIpCn0KCiMgR2V0IHRoZSB2YWx1ZSBvZiB0aGUgU19OQU1FX0tFWSBhbm5vdGF0aW9uIGFuZAojIGNvcnJlbGF0ZSBpdCB3aXRoIG90aGVyIGFubm90YXRpb25zIGFuZCBwcm9jZXNzIGZpZWxkcy4KYWxsb3dfYnlfYW5ubyhwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpIHsKICAgIHByaW50KCJhbGxvd19ieV9hbm5vIDE6IHN0YXJ0IikKCiAgICBub3QgcF9vY2kuQW5ub3RhdGlvbnNbU19OQU1FX0tFWV0KCiAgICBpX3NfbmFtZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMTogaV9zX25hbWUgPSIsIGlfc19uYW1lKQoKICAgIGlfc19uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FU1BBQ0VfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMTogaV9zX25hbWVzcGFjZSA9IiwgaV9zX25hbWVzcGFjZSkKCiAgICBhbGxvd19ieV9zYW5kYm94X25hbWUocF9vY2ksIGlfb2NpLCBwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBpX3NfbmFtZSwgaV9zX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfYnlfYW5ubyAxOiB0cnVlIikKfQphbGxvd19ieV9hbm5vKHBfb2NpLCBpX29jaSwgcF9zdG9yYWdlcywgaV9zdG9yYWdlcykgewogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMjogc3RhcnQiKQoKICAgIHBfc19uYW1lIDo9IHBfb2NpLkFubm90YXRpb25zW1NfTkFNRV9LRVldCiAgICBpX3NfbmFtZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMjogaV9zX25hbWUgPSIsIGlfc19uYW1lLCAicF9zX25hbWUgPSIsIHBfc19uYW1lKQoKICAgIGFsbG93X3NhbmRib3hfbmFtZShwX3NfbmFtZSwgaV9zX25hbWUpCgogICAgaV9zX25hbWVzcGFjZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwcmludCgiYWxsb3dfYnlfYW5ubyAyOiBpX3NfbmFtZXNwYWNlID0iLCBpX3NfbmFtZXNwYWNlKQoKICAgIGFsbG93X2J5X3NhbmRib3hfbmFtZShwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMsIGlfc19uYW1lLCBpX3NfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd19ieV9hbm5vIDI6IHRydWUiKQp9CgphbGxvd19ieV9zYW5kYm94X25hbWUocF9vY2ksIGlfb2NpLCBwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfYnlfc2FuZGJveF9uYW1lOiBzdGFydCIpCgogICAgaV9uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FU1BBQ0VfS0VZXQoKICAgIGFsbG93X2J5X2NvbnRhaW5lcl90eXBlcyhwX29jaSwgaV9vY2ksIHNfbmFtZSwgaV9uYW1lc3BhY2UpCiAgICBhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZChwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpCiAgICBhbGxvd19wcm9jZXNzKHBfb2NpLlByb2Nlc3MsIGlfb2NpLlByb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpCgogICAgcHJpbnQoImFsbG93X2J5X3NhbmRib3hfbmFtZTogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfbmFtZShwX3NfbmFtZSwgaV9zX25hbWUpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X25hbWU6IHN0YXJ0IikKICAgIHJlZ2V4Lm1hdGNoKHBfc19uYW1lLCBpX3NfbmFtZSkKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9uYW1lOiB0cnVlIikKfQoKIyBDaGVjayB0aGF0IHRoZSAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLXR5cGUiIGFuZAojICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIiBhbm5vdGF0aW9ucyBkZXNpZ25hdGUgdGhlCiMgZXhwZWN0ZWQgdHlwZSAtIGVpdGhlciBhICJzYW5kYm94IiBvciBhICJjb250YWluZXIiLiBUaGVuLCB2YWxpZGF0ZQojIG90aGVyIGFubm90YXRpb25zIGJhc2VkIG9uIHRoZSBhY3R1YWwgInNhbmRib3giIG9yICJjb250YWluZXIiIHZhbHVlCiMgZnJvbSB0aGUgaW5wdXQgY29udGFpbmVyLgphbGxvd19ieV9jb250YWluZXJfdHlwZXMocF9vY2ksIGlfb2NpLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfYnlfY29udGFpbmVyX3R5cGVzOiBjaGVja2luZyBpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSIpCgogICAgY190eXBlIDo9ICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSIKICAgIAogICAgcF9jcmlfdHlwZSA6PSBwX29jaS5Bbm5vdGF0aW9uc1tjX3R5cGVdCiAgICBpX2NyaV90eXBlIDo9IGlfb2NpLkFubm90YXRpb25zW2NfdHlwZV0KICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZXM6IHBfY3JpX3R5cGUgPSIsIHBfY3JpX3R5cGUsICJpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgcF9jcmlfdHlwZSA9PSBpX2NyaV90eXBlCgogICAgYWxsb3dfYnlfY29udGFpbmVyX3R5cGUoaV9jcmlfdHlwZSwgcF9vY2ksIGlfb2NpLCBzX25hbWUsIHNfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZXM6IHRydWUiKQp9CgphbGxvd19ieV9jb250YWluZXJfdHlwZShpX2NyaV90eXBlLCBwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAxOiBpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgaV9jcmlfdHlwZSA9PSAic2FuZGJveCIKCiAgICBpX2thdGFfdHlwZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1siaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5jb250YWluZXJfdHlwZSJdCiAgICBwcmludCgiYWxsb3dfYnlfY29udGFpbmVyX3R5cGUgMTogaV9rYXRhX3R5cGUgPSIsIGlfa2F0YV90eXBlKQogICAgaV9rYXRhX3R5cGUgPT0gInBvZF9zYW5kYm94IgoKICAgIGFsbG93X3NhbmRib3hfY29udGFpbmVyX25hbWUocF9vY2ksIGlfb2NpKQogICAgYWxsb3dfc2FuZGJveF9uZXRfbmFtZXNwYWNlKHBfb2NpLCBpX29jaSkKICAgIGFsbG93X3NhbmRib3hfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpCgogICAgcHJpbnQoImFsbG93X2J5X2NvbnRhaW5lcl90eXBlIDE6IHRydWUiKQp9CgphbGxvd19ieV9jb250YWluZXJfdHlwZShpX2NyaV90eXBlLCBwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiBpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgaV9jcmlfdHlwZSA9PSAiY29udGFpbmVyIgoKICAgIGlfa2F0YV90eXBlIDo9IGlfb2NpLkFubm90YXRpb25zWyJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIl0KICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiBpX2thdGFfdHlwZSA9IiwgaV9rYXRhX3R5cGUpCiAgICBpX2thdGFfdHlwZSA9PSAicG9kX2NvbnRhaW5lciIKCiAgICBhbGxvd19jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpCiAgICBhbGxvd19uZXRfbmFtZXNwYWNlKHBfb2NpLCBpX29jaSkKICAgIGFsbG93X2xvZ19kaXJlY3RvcnkocF9vY2ksIGlfb2NpKQoKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiB0cnVlIikKfQoKIyAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLW5hbWUiIGFubm90YXRpb24KYWxsb3dfc2FuZGJveF9jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X2NvbnRhaW5lcl9uYW1lOiBzdGFydCIpCgogICAgY29udGFpbmVyX2Fubm90YXRpb25fbWlzc2luZyhwX29jaSwgaV9vY2ksICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItbmFtZSIpCgogICAgcHJpbnQoImFsbG93X3NhbmRib3hfY29udGFpbmVyX25hbWU6IHRydWUiKQp9CgphbGxvd19jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19jb250YWluZXJfbmFtZTogc3RhcnQiKQoKICAgIGFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uKHBfb2NpLCBpX29jaSwgImlvLmt1YmVybmV0ZXMuY3JpLmNvbnRhaW5lci1uYW1lIikKCiAgICBwcmludCgiYWxsb3dfY29udGFpbmVyX25hbWU6IHRydWUiKQp9Cgpjb250YWluZXJfYW5ub3RhdGlvbl9taXNzaW5nKHBfb2NpLCBpX29jaSwga2V5KSB7CiAgICBwcmludCgiY29udGFpbmVyX2Fubm90YXRpb25fbWlzc2luZzoiLCBrZXkpCgogICAgbm90IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIG5vdCBpX29jaS5Bbm5vdGF0aW9uc1trZXldCgogICAgcHJpbnQoImNvbnRhaW5lcl9hbm5vdGF0aW9uX21pc3Npbmc6IHRydWUiKQp9CgphbGxvd19jb250YWluZXJfYW5ub3RhdGlvbihwX29jaSwgaV9vY2ksIGtleSkgewogICAgcHJpbnQoImFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uOiBrZXkgPSIsIGtleSkKCiAgICBwX3ZhbHVlIDo9IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIGlfdmFsdWUgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgcHJpbnQoImFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uOiBwX3ZhbHVlID0iLCBwX3ZhbHVlLCAiaV92YWx1ZSA9IiwgaV92YWx1ZSkKCiAgICBwX3ZhbHVlID09IGlfdmFsdWUKCiAgICBwcmludCgiYWxsb3dfY29udGFpbmVyX2Fubm90YXRpb246IHRydWUiKQp9CgojICJuZXJkY3RsL25ldHdvcmstbmFtZXNwYWNlIiBhbm5vdGF0aW9uCmFsbG93X3NhbmRib3hfbmV0X25hbWVzcGFjZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X25ldF9uYW1lc3BhY2U6IHN0YXJ0IikKCiAgICBrZXkgOj0gIm5lcmRjdGwvbmV0d29yay1uYW1lc3BhY2UiCgogICAgcF9uYW1lc3BhY2UgOj0gcF9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgaV9uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgcHJpbnQoImFsbG93X3NhbmRib3hfbmV0X25hbWVzcGFjZTogcF9uYW1lc3BhY2UgPSIsIHBfbmFtZXNwYWNlLCAiaV9uYW1lc3BhY2UgPSIsIGlfbmFtZXNwYWNlKQoKICAgIHJlZ2V4Lm1hdGNoKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9uZXRfbmFtZXNwYWNlOiB0cnVlIikKfQoKYWxsb3dfbmV0X25hbWVzcGFjZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19uZXRfbmFtZXNwYWNlOiBzdGFydCIpCgogICAga2V5IDo9ICJuZXJkY3RsL25ldHdvcmstbmFtZXNwYWNlIgoKICAgIG5vdCBwX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICBub3QgaV9vY2kuQW5ub3RhdGlvbnNba2V5XQoKICAgIHByaW50KCJhbGxvd19uZXRfbmFtZXNwYWNlOiB0cnVlIikKfQoKIyAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1sb2ctZGlyZWN0b3J5IiBhbm5vdGF0aW9uCmFsbG93X3NhbmRib3hfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X2xvZ19kaXJlY3Rvcnk6IHN0YXJ0IikKCiAgICBrZXkgOj0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbG9nLWRpcmVjdG9yeSIKCiAgICBwX2RpciA6PSBwX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICByZWdleDEgOj0gcmVwbGFjZShwX2RpciwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHJlZ2V4MiA6PSByZXBsYWNlKHJlZ2V4MSwgIiQoc2FuZGJveC1uYW1lc3BhY2UpIiwgc19uYW1lc3BhY2UpCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiByZWdleDIgPSIsIHJlZ2V4MikKCiAgICBpX2RpciA6PSBpX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiBpX2RpciA9IiwgaV9kaXIpCgogICAgcmVnZXgubWF0Y2gocmVnZXgyLCBpX2RpcikKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiB0cnVlIikKfQoKYWxsb3dfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19sb2dfZGlyZWN0b3J5OiBzdGFydCIpCgogICAga2V5IDo9ICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWxvZy1kaXJlY3RvcnkiCgogICAgbm90IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIG5vdCBpX29jaS5Bbm5vdGF0aW9uc1trZXldCgogICAgcHJpbnQoImFsbG93X2xvZ19kaXJlY3Rvcnk6IHRydWUiKQp9CgphbGxvd19kZXZpY2VzKHBfZGV2aWNlcywgaV9kZXZpY2VzKSB7CiAgICBwcmludCgiYWxsb3dfZGV2aWNlczogc3RhcnQiKQogICAgZXZlcnkgaV9kZXZpY2UgaW4gaV9kZXZpY2VzIHsKICAgICAgICBwcmludCgiYWxsb3dfZGV2aWNlczogaV9kZXZpY2UgPSIsIGlfZGV2aWNlKQogICAgICAgIHNvbWUgcF9kZXZpY2UgaW4gcF9kZXZpY2VzCiAgICAgICAgcF9kZXZpY2UuY29udGFpbmVyX3BhdGggPT0gaV9kZXZpY2UuY29udGFpbmVyX3BhdGgKICAgIH0KICAgIHByaW50KCJhbGxvd19kZXZpY2VzOiB0cnVlIikKfQoKYWxsb3dfbGludXgoc3RhdGVfb3BzLCBwX29jaSwgaV9vY2kpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIHBfbmFtZXNwYWNlcyA6PSBwX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbGludXg6IHAgbmFtZXNwYWNlcyA9IiwgcF9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlcyA6PSBpX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbGludXg6IGkgbmFtZXNwYWNlcyA9IiwgaV9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlX3dpdGhvdXRfbmV0d29yayA6PSBbb2JqIHwgb2JqIDo9IGlfbmFtZXNwYWNlc1tfXTsgb2JqLlR5cGUgIT0gIm5ldHdvcmsiXQoKICAgIHByaW50KCJhbGxvd19saW51eDogaV9uYW1lc3BhY2Vfd2l0aG91dF9uZXR3b3JrID0iLCBpX25hbWVzcGFjZV93aXRob3V0X25ldHdvcmspCgogICAgcF9uYW1lc3BhY2VzID09IGlfbmFtZXNwYWNlX3dpdGhvdXRfbmV0d29yawoKICAgIGFsbG93X21hc2tlZF9wYXRocyhwX29jaSwgaV9vY2kpCiAgICBhbGxvd19yZWFkb25seV9wYXRocyhwX29jaSwgaV9vY2kpCiAgICBhbGxvd19saW51eF9kZXZpY2VzKHBfb2NpLkxpbnV4LkRldmljZXMsIGlfb2NpLkxpbnV4LkRldmljZXMpCiAgICBhbGxvd19saW51eF9zeXNjdGwocF9vY2kuTGludXgsIGlfb2NpLkxpbnV4KQogICAgcmV0IDo9IGFsbG93X25ldHdvcmtfbmFtZXNwYWNlX3N0YXJ0KHN0YXRlX29wcywgcF9vY2ksIGlfb2NpKQogICAgcmV0LmFsbG93ZWQKCiAgICBvcHMgOj0gcmV0Lm9wcwoKICAgIHByaW50KCJhbGxvd19saW51eDogdHJ1ZSIpCn0KCiMgUmV0cmlldmUgdGhlICJuZXR3b3JrIiBuYW1lc3BhY2UgZnJvbSB0aGUgaW5wdXQgZGF0YSBhbmQgcGFzcyBpdCBvbiBmb3IgdGhlCiMgbmV0d29yayBuYW1lc3BhY2UgcG9saWN5IGNoZWNrcy4KYWxsb3dfbmV0d29ya19uYW1lc3BhY2Vfc3RhcnQoc3RhdGVfb3BzLCBwX29jaSwgaV9vY2kpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIHByaW50KCJhbGxvd19uZXR3b3JrX25hbWVzcGFjZSBzdGFydDogc3RhcnQiKQoKICAgIHBfbmFtZXNwYWNlcyA6PSBwX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IHAgbmFtZXNwYWNlcyA9IiwgcF9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlcyA6PSBpX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IGkgbmFtZXNwYWNlcyA9IiwgaV9uYW1lc3BhY2VzKQoKICAgICMgUmV0dXJuIHBhdGggb2YgdGhlICJuZXR3b3JrIiBuYW1lc3BhY2UKICAgIG5ldHdvcmtfbnMgOj0gW29iaiB8IG9iaiA6PSBpX25hbWVzcGFjZXNbX107IG9iai5UeXBlID09ICJuZXR3b3JrIl0KCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IG5ldHdvcmtfbnMgPSIsIG5ldHdvcmtfbnMpCgogICAgcmV0IDo9IGFsbG93X25ldHdvcmtfbmFtZXNwYWNlKHN0YXRlX29wcywgbmV0d29ya19ucykKICAgIHJldC5hbGxvd2VkCgogICAgb3BzIDo9IHJldC5vcHMKfQoKIyBUaGlzIHJ1bGUgaXMgd2hlbiB0aGVyZSdzIG5vIG5ldHdvcmsgbmFtZXNwYWNlIGluIHRoZSBpbnB1dCBkYXRhLgphbGxvd19uZXR3b3JrX25hbWVzcGFjZShzdGF0ZV9vcHMsIG5ldHdvcmtfbnMpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIGNvdW50KG5ldHdvcmtfbnMpID09IDAKCiAgICBuZXR3b3JrX25zX3BhdGggPSAiIgoKICAgIGFkZF9uZXR3b3JrX25hbWVzcGFjZV90b19zdGF0ZSA6PSBzdGF0ZV9hbGxvd3MoIm5ldHdvcmtfbmFtZXNwYWNlIiwgbmV0d29ya19uc19wYXRoKQogICAgb3BzIDo9IGNvbmNhdF9vcF9pZl9ub3RfbnVsbChzdGF0ZV9vcHMsIGFkZF9uZXR3b3JrX25hbWVzcGFjZV90b19zdGF0ZSkKCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2UgMTogdHJ1ZSIpCn0KCiMgVGhpcyBydWxlIGlzIHdoZW4gdGhlcmUncyBleGFjdGx5IG9uZSBuZXR3b3JrIG5hbWVzcGFjZSBpbiB0aGUgaW5wdXQgZGF0YS4KYWxsb3dfbmV0d29ya19uYW1lc3BhY2Uoc3RhdGVfb3BzLCBuZXR3b3JrX25zKSA6PSB7Im9wcyI6IG9wcywgImFsbG93ZWQiOiB0cnVlfSB7CiAgICBjb3VudChuZXR3b3JrX25zKSA9PSAxCgogICAgYWRkX25ldHdvcmtfbmFtZXNwYWNlX3RvX3N0YXRlIDo9IHN0YXRlX2FsbG93cygibmV0d29ya19uYW1lc3BhY2UiLCBuZXR3b3JrX25zWzBdLlBhdGgpCiAgICBvcHMgOj0gY29uY2F0X29wX2lmX25vdF9udWxsKHN0YXRlX29wcywgYWRkX25ldHdvcmtfbmFtZXNwYWNlX3RvX3N0YXRlKQoKICAgIHByaW50KCJhbGxvd19uZXR3b3JrX25hbWVzcGFjZSAyOiB0cnVlIikKfQoKYWxsb3dfbWFza2VkX3BhdGhzKHBfb2NpLCBpX29jaSkgewogICAgcF9wYXRocyA6PSBwX29jaS5MaW51eC5NYXNrZWRQYXRocwogICAgcHJpbnQoImFsbG93X21hc2tlZF9wYXRocyAxOiBwX3BhdGhzID0iLCBwX3BhdGhzKQoKICAgIGlfcGF0aHMgOj0gaV9vY2kuTGludXguTWFza2VkUGF0aHMKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aHMgMTogaV9wYXRocyA9IiwgaV9wYXRocykKCiAgICBhbGxvd19tYXNrZWRfcGF0aHNfYXJyYXkocF9wYXRocywgaV9wYXRocykKCiAgICBwcmludCgiYWxsb3dfbWFza2VkX3BhdGhzIDE6IHRydWUiKQp9CmFsbG93X21hc2tlZF9wYXRocyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aHMgMjogc3RhcnQiKQoKICAgIG5vdCBwX29jaS5MaW51eC5NYXNrZWRQYXRocwogICAgbm90IGlfb2NpLkxpbnV4Lk1hc2tlZFBhdGhzCgogICAgcHJpbnQoImFsbG93X21hc2tlZF9wYXRocyAyOiB0cnVlIikKfQoKIyBBbGwgdGhlIHBvbGljeSBtYXNrZWQgcGF0aHMgbXVzdCBiZSBtYXNrZWQgaW4gdGhlIGlucHV0IGRhdGEgdG9vLgojIElucHV0IGlzIGFsbG93ZWQgdG8gaGF2ZSBtb3JlIG1hc2tlZCBwYXRocyB0aGFuIHRoZSBwb2xpY3kuCmFsbG93X21hc2tlZF9wYXRoc19hcnJheShwX2FycmF5LCBpX2FycmF5KSB7CiAgICBldmVyeSBwX2VsZW0gaW4gcF9hcnJheSB7CiAgICAgICAgYWxsb3dfbWFza2VkX3BhdGgocF9lbGVtLCBpX2FycmF5KQogICAgfQp9CgphbGxvd19tYXNrZWRfcGF0aChwX2VsZW0sIGlfYXJyYXkpIHsKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aDogcF9lbGVtID0iLCBwX2VsZW0pCgogICAgc29tZSBpX2VsZW0gaW4gaV9hcnJheQogICAgcF9lbGVtID09IGlfZWxlbQoKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aDogdHJ1ZSIpCn0KCmFsbG93X3JlYWRvbmx5X3BhdGhzKHBfb2NpLCBpX29jaSkgewogICAgcF9wYXRocyA6PSBwX29jaS5MaW51eC5SZWFkb25seVBhdGhzCiAgICBwcmludCgiYWxsb3dfcmVhZG9ubHlfcGF0aHMgMTogcF9wYXRocyA9IiwgcF9wYXRocykKCiAgICBpX3BhdGhzIDo9IGlfb2NpLkxpbnV4LlJlYWRvbmx5UGF0aHMKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAxOiBpX3BhdGhzID0iLCBpX3BhdGhzKQoKICAgIGFsbG93X3JlYWRvbmx5X3BhdGhzX2FycmF5KHBfcGF0aHMsIGlfcGF0aHMsIGlfb2NpLkxpbnV4Lk1hc2tlZFBhdGhzKQoKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAxOiB0cnVlIikKfQphbGxvd19yZWFkb25seV9wYXRocyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAyOiBzdGFydCIpCgogICAgbm90IHBfb2NpLkxpbnV4LlJlYWRvbmx5UGF0aHMKICAgIG5vdCBpX29jaS5MaW51eC5SZWFkb25seVBhdGhzCgogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGhzIDI6IHRydWUiKQp9CgojIEFsbCB0aGUgcG9saWN5IHJlYWRvbmx5IHBhdGhzIG11c3QgYmUgZWl0aGVyOgojIC0gUHJlc2VudCBpbiB0aGUgaW5wdXQgcmVhZG9ubHkgcGF0aHMsIG9yCiMgLSBQcmVzZW50IGluIHRoZSBpbnB1dCBtYXNrZWQgcGF0aHMuCiMgSW5wdXQgaXMgYWxsb3dlZCB0byBoYXZlIG1vcmUgcmVhZG9ubHkgcGF0aHMgdGhhbiB0aGUgcG9saWN5LgphbGxvd19yZWFkb25seV9wYXRoc19hcnJheShwX2FycmF5LCBpX2FycmF5LCBtYXNrZWRfcGF0aHMpIHsKICAgIGV2ZXJ5IHBfZWxlbSBpbiBwX2FycmF5IHsKICAgICAgICBhbGxvd19yZWFkb25seV9wYXRoKHBfZWxlbSwgaV9hcnJheSwgbWFza2VkX3BhdGhzKQogICAgfQp9CgphbGxvd19yZWFkb25seV9wYXRoKHBfZWxlbSwgaV9hcnJheSwgbWFza2VkX3BhdGhzKSB7CiAgICBwcmludCgiYWxsb3dfcmVhZG9ubHlfcGF0aCAxOiBwX2VsZW0gPSIsIHBfZWxlbSkKCiAgICBzb21lIGlfZWxlbSBpbiBpX2FycmF5CiAgICBwX2VsZW0gPT0gaV9lbGVtCgogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGggMTogdHJ1ZSIpCn0KYWxsb3dfcmVhZG9ubHlfcGF0aChwX2VsZW0sIGlfYXJyYXksIG1hc2tlZF9wYXRocykgewogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGggMjogcF9lbGVtID0iLCBwX2VsZW0pCgogICAgc29tZSBpX21hc2tlZCBpbiBtYXNrZWRfcGF0aHMKICAgIHBfZWxlbSA9PSBpX21hc2tlZAoKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRoIDI6IHRydWUiKQp9CgphbGxvd19saW51eF9kZXZpY2VzKHBfZGV2aWNlcywgaV9kZXZpY2VzKSB7CiAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogc3RhcnQiKQogICAgZXZlcnkgaV9kZXZpY2UgaW4gaV9kZXZpY2VzIHsKICAgICAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogaV9kZXZpY2UgPSIsIGlfZGV2aWNlKQogICAgICAgIHNvbWUgcF9kZXZpY2UgaW4gcF9kZXZpY2VzCiAgICAgICAgaV9kZXZpY2UuUGF0aCA9PSBwX2RldmljZS5QYXRoCiAgICB9CiAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogdHJ1ZSIpCn0KCmFsbG93X2xpbnV4X3N5c2N0bChwX2xpbnV4LCBpX2xpbnV4KSB7CiAgICBwcmludCgiYWxsb3dfbGludXhfc3lzY3RsIDE6IHN0YXJ0IikKICAgIG5vdCBpX2xpbnV4LlN5c2N0bAogICAgcHJpbnQoImFsbG93X2xpbnV4X3N5c2N0bCAxOiB0cnVlIikKfQoKYWxsb3dfbGludXhfc3lzY3RsKHBfbGludXgsIGlfbGludXgpIHsKICAgIHByaW50KCJhbGxvd19saW51eF9zeXNjdGwgMjogc3RhcnQiKQogICAgcF9zeXNjdGwgOj0gcF9saW51eC5TeXNjdGwKICAgIGlfc3lzY3RsIDo9IGlfbGludXguU3lzY3RsCiAgICBldmVyeSBpX25hbWUsIGlfdmFsIGluIGlfc3lzY3RsIHsKICAgICAgICBwcmludCgiYWxsb3dfbGludXhfc3lzY3RsIDI6IGlfbmFtZSA9IiwgaV9uYW1lLCAiaV92YWwgPSIsIGlfdmFsKQogICAgICAgIHBfc3lzY3RsW2lfbmFtZV0gPT0gaV92YWwKICAgIH0KICAgIHByaW50KCJhbGxvd19saW51eF9zeXNjdGwgMjogdHJ1ZSIpCn0KCiMgQ2hlY2sgdGhlIGNvbnNpc3RlbmN5IG9mIHRoZSBpbnB1dCAiaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5idW5kbGVfcGF0aCIKIyBhbmQgaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCIgdmFsdWVzIHdpdGggb3RoZXIgZmllbGRzLgphbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZChwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpIHsKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogc3RhcnQiKQoKICAgIGJ1bmRsZV9wYXRoIDo9IGlfb2NpLkFubm90YXRpb25zWyJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmJ1bmRsZV9wYXRoIl0KICAgIGJ1bmRsZV9pZCA6PSByZXBsYWNlKGJ1bmRsZV9wYXRoLCAiL3J1bi9jb250YWluZXJkL2lvLmNvbnRhaW5lcmQucnVudGltZS52Mi50YXNrL2s4cy5pby8iLCAiIikKCiAgICBidW5kbGVfaWRfZm9ybWF0IDo9IGNvbmNhdCgiIiwgWyJeIiwgQlVORExFX0lELCAiJCJdKQogICAgcmVnZXgubWF0Y2goYnVuZGxlX2lkX2Zvcm1hdCwgYnVuZGxlX2lkKQoKICAgIGtleSA6PSAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCIKCiAgICBwX3JlZ2V4IDo9IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIHNhbmRib3hfaWQgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQoKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogc2FuZGJveF9pZCA9Iiwgc2FuZGJveF9pZCwgInJlZ2V4ID0iLCBwX3JlZ2V4KQogICAgcmVnZXgubWF0Y2gocF9yZWdleCwgc2FuZGJveF9pZCkKCiAgICBhbGxvd19yb290X3BhdGgocF9vY2ksIGlfb2NpLCBidW5kbGVfaWQpCgogICAgZXZlcnkgaV9tb3VudCBpbiBpX29jaS5Nb3VudHMgewogICAgICAgIGFsbG93X21vdW50KHBfb2NpLCBpX21vdW50LCBpX3N0b3JhZ2VzLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpCiAgICB9CgogICAgYWxsb3dfc3RvcmFnZXMocF9zdG9yYWdlcywgaV9zdG9yYWdlcywgYnVuZGxlX2lkLCBzYW5kYm94X2lkKQoKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogdHJ1ZSIpCn0KCmFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHBfcHJvY2VzcyA9IiwgcF9wcm9jZXNzKQogICAgcHJpbnQoImFsbG93X3Byb2Nlc3NfY29tbW9uOiBpX3Byb2Nlc3MgPSAiLCBpX3Byb2Nlc3MpCiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHNfbmFtZSA9Iiwgc19uYW1lKQoKICAgIHBfcHJvY2Vzcy5Dd2QgPT0gaV9wcm9jZXNzLkN3ZAogICAgcF9wcm9jZXNzLk5vTmV3UHJpdmlsZWdlcyA9PSBpX3Byb2Nlc3MuTm9OZXdQcml2aWxlZ2VzCgogICAgYWxsb3dfdXNlcihwX3Byb2Nlc3MsIGlfcHJvY2VzcykKICAgIGFsbG93X2VudihwX3Byb2Nlc3MsIGlfcHJvY2Vzcywgc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHRydWUiKQp9CgojIENvbXBhcmUgdGhlIE9DSSBQcm9jZXNzIGZpZWxkIG9mIGEgcG9saWN5IGNvbnRhaW5lciB3aXRoIHRoZSBpbnB1dCBPQ0kgUHJvY2VzcyBmcm9tIGEgQ3JlYXRlQ29udGFpbmVyUmVxdWVzdAphbGxvd19wcm9jZXNzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfcHJvY2Vzczogc3RhcnQiKQoKICAgIGFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgYWxsb3dfY2FwcyhwX3Byb2Nlc3MuQ2FwYWJpbGl0aWVzLCBpX3Byb2Nlc3MuQ2FwYWJpbGl0aWVzKQogICAgcF9wcm9jZXNzLlRlcm1pbmFsID09IGlfcHJvY2Vzcy5UZXJtaW5hbAoKICAgIHByaW50KCJhbGxvd19wcm9jZXNzOiB0cnVlIikKfQoKIyBDb21wYXJlIHRoZSBPQ0kgUHJvY2VzcyBmaWVsZCBvZiBhIHBvbGljeSBjb250YWluZXIgd2l0aCB0aGUgaW5wdXQgcHJvY2VzcyBmaWVsZCBmcm9tIEV4ZWNQcm9jZXNzUmVxdWVzdAphbGxvd19pbnRlcmFjdGl2ZV9wcm9jZXNzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfaW50ZXJhY3RpdmVfcHJvY2Vzczogc3RhcnQiKQoKICAgIGFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgYWxsb3dfZXhlY19jYXBzKGlfcHJvY2Vzcy5DYXBhYmlsaXRpZXMpCgogICAgIyBUaGVzZSBhcmUgY29tbWFuZHMgZW5hYmxlZCB1c2luZyBFeGVjUHJvY2Vzc1JlcXVlc3QgY29tbWFuZHMgYW5kL29yIHJlZ2V4IGZyb20gdGhlIHNldHRpbmdzIGZpbGUuCiAgICAjIFRoZXkgY2FuIGJlIGV4ZWN1dGVkIGludGVyYWN0aXZlbHkgc28gYWxsb3cgdGhlbSB0byB1c2UgYW55IHZhbHVlIGZvciBpX3Byb2Nlc3MuVGVybWluYWwuCgogICAgcHJpbnQoImFsbG93X2ludGVyYWN0aXZlX3Byb2Nlc3M6IHRydWUiKQp9CgojIENvbXBhcmUgdGhlIE9DSSBQcm9jZXNzIGZpZWxkIG9mIGEgcG9saWN5IGNvbnRhaW5lciB3aXRoIHRoZSBpbnB1dCBwcm9jZXNzIGZpZWxkIGZyb20gRXhlY1Byb2Nlc3NSZXF1ZXN0CmFsbG93X3Byb2JlX3Byb2Nlc3MocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19wcm9iZV9wcm9jZXNzOiBzdGFydCIpCgogICAgYWxsb3dfcHJvY2Vzc19jb21tb24ocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpCiAgICBhbGxvd19leGVjX2NhcHMoaV9wcm9jZXNzLkNhcGFiaWxpdGllcykKICAgIHBfcHJvY2Vzcy5UZXJtaW5hbCA9PSBpX3Byb2Nlc3MuVGVybWluYWwKCiAgICBwcmludCgiYWxsb3dfcHJvYmVfcHJvY2VzczogdHJ1ZSIpCn0KCmFsbG93X3VzZXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MpIHsKICAgIHBfdXNlciA6PSBwX3Byb2Nlc3MuVXNlcgogICAgaV91c2VyIDo9IGlfcHJvY2Vzcy5Vc2VyCgogICAgcHJpbnQoImFsbG93X3VzZXI6IGlucHV0IHVpZCA9IiwgaV91c2VyLlVJRCwgInBvbGljeSB1aWQgPSIsIHBfdXNlci5VSUQpCiAgICBwX3VzZXIuVUlEID09IGlfdXNlci5VSUQKCiAgICAjIFRPRE86IHRyYWNrIGRvd24gdGhlIHJlYXNvbiBmb3IgcmVnaXN0cnkuazhzLmlvL3BhdXNlOjMuOSBiZWluZwogICAgIyAgICAgICBleGVjdXRlZCB3aXRoIGdpZCA9IDAgZGVzcGl0ZSBoYXZpbmcgIjY1NTM1OjY1NTM1IiBpbiBpdHMgY29udGFpbmVyIGltYWdlCiAgICAjICAgICAgIGNvbmZpZy4KICAgICNwcmludCgiYWxsb3dfdXNlcjogaW5wdXQgZ2lkID0iLCBpX3VzZXIuR0lELCAicG9saWN5IGdpZCA9IiwgcF91c2VyLkdJRCkKICAgICNwX3VzZXIuR0lEID09IGlfdXNlci5HSUQKCiAgICAjIFRPRE86IGNvbXBhcmUgdGhlIGFkZGl0aW9uYWxHaWRzIGZpZWxkIHRvbyBhZnRlciBjb21wdXRpbmcgaXRzIHZhbHVlCiAgICAjIGJhc2VkIG9uIC9ldGMvcGFzc3dkIGFuZCAvZXRjL2dyb3VwIGZyb20gdGhlIGNvbnRhaW5lciBpbWFnZS4KfQoKYWxsb3dfZGVwcmVjYXRlZF9hcmdzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZ3MgMTogbm8gYXJncyIpCgogICAgbm90IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJncwogICAgbm90IGlfcHJvY2Vzcy5BcmdzCgogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAxOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZ3MocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSkgewogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiBwb2xpY3kgYXJncyA9IiwgcF9wcm9jZXNzLkRlcHJlY2F0ZWRBcmdzKQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiBpbnB1dCBhcmdzID0iLCBpX3Byb2Nlc3MuQXJncykKCiAgICBjb3VudChwX3Byb2Nlc3MuRGVwcmVjYXRlZEFyZ3MpID09IGNvdW50KGlfcHJvY2Vzcy5BcmdzKQoKICAgIGV2ZXJ5IGksIGlfYXJnIGluIGlfcHJvY2Vzcy5BcmdzIHsKICAgICAgICBhbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpCiAgICB9CgogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDE6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgcF9hcmcyIDo9IHJlcGxhY2UocF9hcmcsICIkJCIsICIkIikKICAgIHBfYXJnMiA9PSBpX2FyZwoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAxOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDI6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgIyBUT0RPOiBjYW4gJChub2RlLW5hbWUpIGJlIGhhbmRsZWQgYmV0dGVyPwogICAgY29udGFpbnMocF9hcmcsICIkKG5vZGUtbmFtZSkiKQoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAyOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDM6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgcF9hcmcyIDo9IHJlcGxhY2UocF9hcmcsICIkJCIsICIkIikKICAgIHBfYXJnMyA6PSByZXBsYWNlKHBfYXJnMiwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAzOiBwX2FyZzMgPSIsIHBfYXJnMykKICAgIHBfYXJnMyA9PSBpX2FyZwoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAzOiB0cnVlIikKfQoKIyBPQ0kgcHJvY2Vzcy5FbnYgZmllbGQKYWxsb3dfZW52KHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfZW52OiBwIGVudiA9IiwgcF9wcm9jZXNzLkVudikKICAgIHByaW50KCJhbGxvd19lbnY6IGkgZW52ID0iLCBpX3Byb2Nlc3MuRW52KQoKICAgIGV2ZXJ5IGlfdmFyIGluIGlfcHJvY2Vzcy5FbnYgewogICAgICAgIHByaW50KCJhbGxvd19lbnY6IGlfdmFyID0iLCBpX3ZhcikKICAgICAgICBhbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgfQoKICAgIHByaW50KCJhbGxvd19lbnY6IHRydWUiKQp9CgojIEFsbG93IGlucHV0IGVudiB2YXJpYWJsZXMgdGhhdCBhcmUgcHJlc2VudCBpbiB0aGUgcG9saWN5IGRhdGEgdG9vLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHBfdmFyID09IGlfdmFyCiAgICBwcmludCgiYWxsb3dfdmFyIDE6IHRydWUiKQp9CgojIE1hdGNoIGlucHV0IHdpdGggb25lIG9mIHRoZSBwb2xpY3kgdmFyaWFibGVzLCBhZnRlciBzdWJzdGl0dXRpbmcgJChzYW5kYm94LW5hbWUpLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHByaW50KCJhbGxvd192YXIgMjogcF92YXIgPSIsIHBfdmFyKQoKICAgIHBfdmFyX3NwbGl0IDo9IHNwbGl0KHBfdmFyLCAiPSIpCiAgICBjb3VudChwX3Zhcl9zcGxpdCkgPT0gMgoKICAgIHBfdmFyX3NwbGl0WzFdID09ICIkKHNhbmRib3gtbmFtZSkiCgogICAgaV92YXJfc3BsaXQgOj0gc3BsaXQoaV92YXIsICI9IikKICAgIGNvdW50KGlfdmFyX3NwbGl0KSA9PSAyCgogICAgaV92YXJfc3BsaXRbMF0gPT0gcF92YXJfc3BsaXRbMF0KICAgIHJlZ2V4Lm1hdGNoKHNfbmFtZSwgaV92YXJfc3BsaXRbMV0pCgogICAgcHJpbnQoImFsbG93X3ZhciAyOiB0cnVlIikKfQoKIyBBbGxvdyBpbnB1dCBlbnYgdmFyaWFibGVzIHRoYXQgbWF0Y2ggd2l0aCBhIHJlcXVlc3RfZGVmYXVsdHMgcmVnZXguCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHNvbWUgcF9yZWdleDEgaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5DcmVhdGVDb250YWluZXJSZXF1ZXN0LmFsbG93X2Vudl9yZWdleAogICAgcF9yZWdleDIgOj0gcmVwbGFjZShwX3JlZ2V4MSwgIiQoaXB2NF9hKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcHY0X2EpCiAgICBwX3JlZ2V4MyA6PSByZXBsYWNlKHBfcmVnZXgyLCAiJChpcF9wKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcF9wKQogICAgcF9yZWdleDQgOj0gcmVwbGFjZShwX3JlZ2V4MywgIiQoc3ZjX25hbWUpIiwgcG9saWN5X2RhdGEuY29tbW9uLnN2Y19uYW1lKQogICAgcF9yZWdleDUgOj0gcmVwbGFjZShwX3JlZ2V4NCwgIiQoZG5zX2xhYmVsKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5kbnNfbGFiZWwpCgogICAgcHJpbnQoImFsbG93X3ZhciAzOiBwX3JlZ2V4NSA9IiwgcF9yZWdleDUpCiAgICByZWdleC5tYXRjaChwX3JlZ2V4NSwgaV92YXIpCgogICAgcHJpbnQoImFsbG93X3ZhciAzOiB0cnVlIikKfQoKIyBBbGxvdyBmaWVsZFJlZiAiZmllbGRQYXRoOiBzdGF0dXMucG9kSVAiIHZhbHVlcy4KYWxsb3dfdmFyKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBpX3Zhciwgc19uYW1lLCBzX25hbWVzcGFjZSkgewogICAgbmFtZV92YWx1ZSA6PSBzcGxpdChpX3ZhciwgIj0iKQogICAgY291bnQobmFtZV92YWx1ZSkgPT0gMgogICAgaXNfaXAobmFtZV92YWx1ZVsxXSkKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIGFsbG93X3BvZF9pcF92YXIobmFtZV92YWx1ZVswXSwgcF92YXIpCgogICAgcHJpbnQoImFsbG93X3ZhciA0OiB0cnVlIikKfQoKIyBBbGxvdyBjb21tb24gZmllbGRSZWYgdmFyaWFibGVzLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBuYW1lX3ZhbHVlIDo9IHNwbGl0KGlfdmFyLCAiPSIpCiAgICBjb3VudChuYW1lX3ZhbHVlKSA9PSAyCgogICAgc29tZSBwX3ZhciBpbiBwX3Byb2Nlc3MuRW52CiAgICBwX25hbWVfdmFsdWUgOj0gc3BsaXQocF92YXIsICI9IikKICAgIGNvdW50KHBfbmFtZV92YWx1ZSkgPT0gMgoKICAgIHBfbmFtZV92YWx1ZVswXSA9PSBuYW1lX3ZhbHVlWzBdCgogICAgIyBUT0RPOiBzaG91bGQgdGhlc2UgYmUgaGFuZGxlZCBpbiBhIGRpZmZlcmVudCB3YXk/CiAgICBhbHdheXNfYWxsb3dlZCA6PSBbIiQoaG9zdC1uYW1lKSIsICIkKG5vZGUtbmFtZSkiLCAiJChwb2QtdWlkKSJdCiAgICBzb21lIGFsbG93ZWQgaW4gYWx3YXlzX2FsbG93ZWQKICAgIGNvbnRhaW5zKHBfbmFtZV92YWx1ZVsxXSwgYWxsb3dlZCkKCiAgICBwcmludCgiYWxsb3dfdmFyIDU6IHRydWUiKQp9CgojIEFsbG93IGZpZWxkUmVmICJmaWVsZFBhdGg6IHN0YXR1cy5ob3N0SVAiIHZhbHVlcy4KYWxsb3dfdmFyKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBpX3Zhciwgc19uYW1lLCBzX25hbWVzcGFjZSkgewogICAgbmFtZV92YWx1ZSA6PSBzcGxpdChpX3ZhciwgIj0iKQogICAgY291bnQobmFtZV92YWx1ZSkgPT0gMgogICAgaXNfaXAobmFtZV92YWx1ZVsxXSkKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIGFsbG93X2hvc3RfaXBfdmFyKG5hbWVfdmFsdWVbMF0sIHBfdmFyKQoKICAgIHByaW50KCJhbGxvd192YXIgNjogdHJ1ZSIpCn0KCiMgQWxsb3cgcmVzb3VyY2VGaWVsZFJlZiB2YWx1ZXMgKGUuZy4sICJsaW1pdHMuY3B1IikuCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIG5hbWVfdmFsdWUgOj0gc3BsaXQoaV92YXIsICI9IikKICAgIGNvdW50KG5hbWVfdmFsdWUpID09IDIKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHBfbmFtZV92YWx1ZSA6PSBzcGxpdChwX3ZhciwgIj0iKQogICAgY291bnQocF9uYW1lX3ZhbHVlKSA9PSAyCgogICAgcF9uYW1lX3ZhbHVlWzBdID09IG5hbWVfdmFsdWVbMF0KCiAgICAjIGEgdmFyaWFibGUgd2Ugc2hvdWxkIGJlIHZhbGlkYXRpbmcgdXNpbmcgYSByZWdleCBmcm9tIHNldHRpbmdzCiAgICBwX25hbWVfdmFsdWVbMV0gPT0gIiQodmFsaWRhdGUtZnJvbS1zZXR0aW5ncykiCgogICAgcmVnZXhfdmFsIDo9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuQ3JlYXRlQ29udGFpbmVyUmVxdWVzdC5hbGxvd19lbnZfcmVnZXhfbWFwW25hbWVfdmFsdWVbMF1dCgogICAgcHJpbnQoImFsbG93X3ZhciA3OiB2YWwgPSIsIG5hbWVfdmFsdWVbMV0pCiAgICBwcmludCgiYWxsb3dfdmFyIDc6IHJlZ2V4X3ZhbCA9IiwgcmVnZXhfdmFsKQoKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4X3ZhbCwgbmFtZV92YWx1ZVsxXSkKCiAgICBwcmludCgiYWxsb3dfdmFyIDc6IHRydWUiKQp9CgojIE1hdGNoIGlucHV0IHdpdGggb25lIG9mIHRoZSBwb2xpY3kgdmFyaWFibGVzLCBhZnRlciBzdWJzdGl0dXRpbmcgJChzYW5kYm94LW5hbWVzcGFjZSkuCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHNvbWUgcF92YXIgaW4gcF9wcm9jZXNzLkVudgogICAgcF92YXIyIDo9IHJlcGxhY2UocF92YXIsICIkKHNhbmRib3gtbmFtZXNwYWNlKSIsIHNfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd192YXIgODogcF92YXIyID0iLCBwX3ZhcjIpCiAgICBwX3ZhcjIgPT0gaV92YXIKCiAgICBwcmludCgiYWxsb3dfdmFyIDg6IHRydWUiKQp9CgphbGxvd19wb2RfaXBfdmFyKHZhcl9uYW1lLCBwX3ZhcikgewogICAgcHJpbnQoImFsbG93X3BvZF9pcF92YXI6IHZhcl9uYW1lID0iLCB2YXJfbmFtZSwgInBfdmFyID0iLCBwX3ZhcikKCiAgICBwX25hbWVfdmFsdWUgOj0gc3BsaXQocF92YXIsICI9IikKICAgIGNvdW50KHBfbmFtZV92YWx1ZSkgPT0gMgoKICAgIHBfbmFtZV92YWx1ZVswXSA9PSB2YXJfbmFtZQogICAgcF9uYW1lX3ZhbHVlWzFdID09ICIkKHBvZC1pcCkiCgogICAgcHJpbnQoImFsbG93X3BvZF9pcF92YXI6IHRydWUiKQp9CgphbGxvd19ob3N0X2lwX3Zhcih2YXJfbmFtZSwgcF92YXIpIHsKICAgIHByaW50KCJhbGxvd19ob3N0X2lwX3ZhcjogdmFyX25hbWUgPSIsIHZhcl9uYW1lLCAicF92YXIgPSIsIHBfdmFyKQoKICAgIHBfbmFtZV92YWx1ZSA6PSBzcGxpdChwX3ZhciwgIj0iKQogICAgY291bnQocF9uYW1lX3ZhbHVlKSA9PSAyCgogICAgcF9uYW1lX3ZhbHVlWzBdID09IHZhcl9uYW1lCiAgICBwX25hbWVfdmFsdWVbMV0gPT0gIiQoaG9zdC1pcCkiCgogICAgcHJpbnQoImFsbG93X2hvc3RfaXBfdmFyOiB0cnVlIikKfQoKaXNfaXAodmFsdWUpIHsKICAgIGJ5dGVzID0gc3BsaXQodmFsdWUsICIuIikKICAgIGNvdW50KGJ5dGVzKSA9PSA0CgogICAgaXNfaXBfZmlyc3RfYnl0ZShieXRlc1swXSkKICAgIGlzX2lwX290aGVyX2J5dGUoYnl0ZXNbMV0pCiAgICBpc19pcF9vdGhlcl9ieXRlKGJ5dGVzWzJdKQogICAgaXNfaXBfb3RoZXJfYnl0ZShieXRlc1szXSkKfQppc19pcF9maXJzdF9ieXRlKGNvbXBvbmVudCkgewogICAgbnVtYmVyID0gdG9fbnVtYmVyKGNvbXBvbmVudCkKICAgIG51bWJlciA+PSAxCiAgICBudW1iZXIgPD0gMjU1Cn0KaXNfaXBfb3RoZXJfYnl0ZShjb21wb25lbnQpIHsKICAgIG51bWJlciA9IHRvX251bWJlcihjb21wb25lbnQpCiAgICBudW1iZXIgPj0gMAogICAgbnVtYmVyIDw9IDI1NQp9CgojIE9DSSByb290LlBhdGgKYWxsb3dfcm9vdF9wYXRoKHBfb2NpLCBpX29jaSwgYnVuZGxlX2lkKSB7CiAgICBpX3BhdGggOj0gaV9vY2kuUm9vdC5QYXRoCiAgICBwX3BhdGgxIDo9IHBfb2NpLlJvb3QuUGF0aAogICAgcHJpbnQoImFsbG93X3Jvb3RfcGF0aDogaV9wYXRoID0iLCBpX3BhdGgsICJwX3BhdGgxID0iLCBwX3BhdGgxKQoKICAgIHBfcGF0aDIgOj0gcmVwbGFjZShwX3BhdGgxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfcm9vdF9wYXRoOiBwX3BhdGgyID0iLCBwX3BhdGgyKQoKICAgIHBfcGF0aDMgOj0gcmVwbGFjZShwX3BhdGgyLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X3Jvb3RfcGF0aDogcF9wYXRoMyA9IiwgcF9wYXRoMykKCiAgICBwX3BhdGgzID09IGlfcGF0aAoKICAgIHByaW50KCJhbGxvd19yb290X3BhdGg6IHRydWUiKQp9CgojIGRldmljZSBtb3VudHMKYWxsb3dfbW91bnQocF9vY2ksIGlfbW91bnQsIGlfc3RvcmFnZXMsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcHJpbnQoImFsbG93X21vdW50OiBpX21vdW50ID0iLCBpX21vdW50KQoKICAgIHNvbWUgcF9tb3VudCBpbiBwX29jaS5Nb3VudHMKICAgIHNvbWUgaV9zdG9yYWdlIGluIGlfc3RvcmFnZXMKCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IHBfbW91bnQgPSIsIHBfbW91bnQpCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IGlfc3RvcmFnZSA9IiwgaV9zdG9yYWdlKQoKICAgIGNoZWNrX21vdW50KHBfbW91bnQsIGlfbW91bnQsIGlfc3RvcmFnZSwgYnVuZGxlX2lkLCBzYW5kYm94X2lkKQoKICAgICMgVE9ETzogYXJlIHRoZXJlIGFueSBvdGhlciByZXF1aXJlZCBwb2xpY3kgY2hlY2tzIGZvciBtb3VudHMgLSBlLmcuLAogICAgIyAgICAgICBtdWx0aXBsZSBtb3VudHMgd2l0aCBzYW1lIHNvdXJjZSBvciBkZXN0aW5hdGlvbj8KCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IHRydWUiKQp9CgpjaGVja19tb3VudChwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcF9tb3VudCA9PSBpX21vdW50CiAgICBwcmludCgiY2hlY2tfbW91bnQgMTogdHJ1ZSIpCn0KY2hlY2tfbW91bnQocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHBfbW91bnQuZGVzdGluYXRpb24gPT0gaV9tb3VudC5kZXN0aW5hdGlvbgogICAgcF9tb3VudC50eXBlXyA9PSBpX21vdW50LnR5cGVfCiAgICBwX21vdW50Lm9wdGlvbnMgPT0gaV9tb3VudC5vcHRpb25zCgogICAgbW91bnRfc291cmNlX2FsbG93cyhwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkKCiAgICBwcmludCgiY2hlY2tfbW91bnQgMjogdHJ1ZSIpCn0KCm1vdW50X3NvdXJjZV9hbGxvd3MocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHJlZ2V4MSA6PSBwX21vdW50LnNvdXJjZQogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5tb3VudF9zb3VyY2VfY3BhdGgpCiAgICByZWdleDQgOj0gcmVwbGFjZShyZWdleDMsICIkKGJ1bmRsZS1pZCkiLCBidW5kbGVfaWQpCgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMTogcmVnZXg0ID0iLCByZWdleDQpCiAgICByZWdleC5tYXRjaChyZWdleDQsIGlfbW91bnQuc291cmNlKQoKICAgIHByaW50KCJtb3VudF9zb3VyY2VfYWxsb3dzIDE6IHRydWUiKQp9Cm1vdW50X3NvdXJjZV9hbGxvd3MocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHJlZ2V4MSA6PSBwX21vdW50LnNvdXJjZQogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5tb3VudF9zb3VyY2VfY3BhdGgpCiAgICByZWdleDQgOj0gcmVwbGFjZShyZWdleDMsICIkKHNhbmRib3gtaWQpIiwgc2FuZGJveF9pZCkKCiAgICBwcmludCgibW91bnRfc291cmNlX2FsbG93cyAyOiByZWdleDQgPSIsIHJlZ2V4NCkKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4NCwgaV9tb3VudC5zb3VyY2UpCgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMjogdHJ1ZSIpCn0KbW91bnRfc291cmNlX2FsbG93cyhwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogaV9tb3VudC5zb3VyY2UgPSIsIGlfbW91bnQuc291cmNlKQogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogaV9zdG9yYWdlLm1vdW50X3BvaW50ID0iLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCgogICAgaV9tb3VudC5zb3VyY2UgPT0gaV9zdG9yYWdlLm1vdW50X3BvaW50CgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogdHJ1ZSIpCn0KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBDcmVhdGUgY29udGFpbmVyIFN0b3JhZ2VzCgphbGxvd19zdG9yYWdlcyhwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHBfY291bnQgOj0gY291bnQocF9zdG9yYWdlcykKICAgIGlfY291bnQgOj0gY291bnQoaV9zdG9yYWdlcykKICAgIHByaW50KCJhbGxvd19zdG9yYWdlczogcF9jb3VudCA9IiwgcF9jb3VudCwgImlfY291bnQgPSIsIGlfY291bnQpCgogICAgcF9jb3VudCA9PSBpX2NvdW50CgogICAgIyBHZXQgdGhlIGNvbnRhaW5lciBpbWFnZSBsYXllciBJRHMgYW5kIHZlcml0eSByb290IGhhc2hlcywgZnJvbSB0aGUgIm92ZXJsYXlmcyIgc3RvcmFnZS4KICAgIHNvbWUgb3ZlcmxheV9zdG9yYWdlIGluIHBfc3RvcmFnZXMKICAgIG92ZXJsYXlfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIHByaW50KCJhbGxvd19zdG9yYWdlczogb3ZlcmxheV9zdG9yYWdlID0iLCBvdmVybGF5X3N0b3JhZ2UpCiAgICBjb3VudChvdmVybGF5X3N0b3JhZ2Uub3B0aW9ucykgPT0gMgoKICAgIGxheWVyX2lkcyA6PSBzcGxpdChvdmVybGF5X3N0b3JhZ2Uub3B0aW9uc1swXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiBsYXllcl9pZHMgPSIsIGxheWVyX2lkcykKCiAgICByb290X2hhc2hlcyA6PSBzcGxpdChvdmVybGF5X3N0b3JhZ2Uub3B0aW9uc1sxXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiByb290X2hhc2hlcyA9Iiwgcm9vdF9oYXNoZXMpCgogICAgZXZlcnkgaV9zdG9yYWdlIGluIGlfc3RvcmFnZXMgewogICAgICAgIGFsbG93X3N0b3JhZ2UocF9zdG9yYWdlcywgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpCiAgICB9CgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiB0cnVlIikKfQoKYWxsb3dfc3RvcmFnZShwX3N0b3JhZ2VzLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgc29tZSBwX3N0b3JhZ2UgaW4gcF9zdG9yYWdlcwoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiBwX3N0b3JhZ2UgPSIsIHBfc3RvcmFnZSkKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiBpX3N0b3JhZ2UgPSIsIGlfc3RvcmFnZSkKCiAgICBwX3N0b3JhZ2UuZHJpdmVyICAgICAgICAgICA9PSBpX3N0b3JhZ2UuZHJpdmVyCiAgICBwX3N0b3JhZ2UuZHJpdmVyX29wdGlvbnMgICA9PSBpX3N0b3JhZ2UuZHJpdmVyX29wdGlvbnMKICAgIHBfc3RvcmFnZS5mc19ncm91cCAgICAgICAgID09IGlfc3RvcmFnZS5mc19ncm91cAogICAgcF9zdG9yYWdlLmZzdHlwZSAgICAgICAgICAgPT0gaV9zdG9yYWdlLmZzdHlwZQoKICAgIGFsbG93X3N0b3JhZ2Vfc291cmNlKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKQogICAgYWxsb3dfc3RvcmFnZV9vcHRpb25zKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKQogICAgYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKQoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiB0cnVlIikKfQoKYWxsb3dfc3RvcmFnZV9zb3VyY2UocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX3NvdXJjZSAxOiBzdGFydCIpCgogICAgcF9zdG9yYWdlLnNvdXJjZSA9PSBpX3N0b3JhZ2Uuc291cmNlCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDE6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX3NvdXJjZShwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDI6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCgogICAgIyBEREREOkJCOkRELkY6IERvbWFpbjpCdXM6RGV2aWNlLkZ1bmN0aW9uCiAgICAjIGh0dHBzOi8vd3d3Lmtlcm5lbC5vcmcvZG9jL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtYnVzLXBjaQogICAgcmVnZXgubWF0Y2goYF5bYS1mMC05XXs0fTpbYS1mMC05XXsyfTpbYS1mMC05XXsyfVwuW2EtZjAtOV0kYCwgaV9zdG9yYWdlLnNvdXJjZSkKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9zb3VyY2UgMjogdHJ1ZSIpCn0KCmFsbG93X3N0b3JhZ2Vfc291cmNlKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKSB7CiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9zb3VyY2UgMzogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIGlfc3RvcmFnZS5zb3VyY2UgPT0gIm5vbmUiCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDM6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX3NvdXJjZShwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDQ6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJzbWIiCgogICAgIyBQYXR0ZXJuOiAvLzxzdG9yYWdlLWFjY291bnQtbmFtZT4uZmlsZS5jb3JlLndpbmRvd3MubmV0LzxrOHMtUFZDLW5hbWU+CiAgICAjIFN0b3JhZ2UgYWNjb3VudCBuYW1lOiBodHRwczovL2xlYXJuLm1pY3Jvc29mdC5jb20vZW4tdXMvYXp1cmUvc3RvcmFnZS9jb21tb24vc3RvcmFnZS1hY2NvdW50LW92ZXJ2aWV3I3N0b3JhZ2UtYWNjb3VudC1uYW1lCiAgICAjIEs4cyBQVkMgbmFtZTogaHR0cHM6Ly9rdWJlcm5ldGVzLmlvL2RvY3MvY29uY2VwdHMvb3ZlcnZpZXcvd29ya2luZy13aXRoLW9iamVjdHMvbmFtZXMvI2Rucy1zdWJkb21haW4tbmFtZXMKICAgIHJlZ2V4Lm1hdGNoKGBeXC9cLyhbYS16MC05XXszLDI0fSlcLmZpbGVcLmNvcmVcLndpbmRvd3NcLm5ldFwvW2EtejAtOV0oW2EtejAtOS4tXXswLDI1MX1bYS16MC05XSk/JGAsIGlfc3RvcmFnZS5zb3VyY2UpCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDQ6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMTogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgIT0gIm92ZXJsYXlmcyIKICAgIHBfc3RvcmFnZS5vcHRpb25zID09IGlfc3RvcmFnZS5vcHRpb25zCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAxOiB0cnVlIikKfQphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIGNvdW50KHBfc3RvcmFnZS5vcHRpb25zKSA9PSAyCgogICAgcG9saWN5X2lkcyA6PSBzcGxpdChwX3N0b3JhZ2Uub3B0aW9uc1swXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBwb2xpY3lfaWRzID0iLCBwb2xpY3lfaWRzKQogICAgcG9saWN5X2lkcyA9PSBsYXllcl9pZHMKCiAgICBwb2xpY3lfaGFzaGVzIDo9IHNwbGl0KHBfc3RvcmFnZS5vcHRpb25zWzFdLCAiOiIpCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IHBvbGljeV9oYXNoZXMgPSIsIHBvbGljeV9oYXNoZXMpCgogICAgcF9jb3VudCA6PSBjb3VudChwb2xpY3lfaWRzKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBwX2NvdW50ID0iLCBwX2NvdW50KQogICAgcF9jb3VudCA+PSAxCiAgICBwX2NvdW50ID09IGNvdW50KHBvbGljeV9oYXNoZXMpCgogICAgaV9jb3VudCA6PSBjb3VudChpX3N0b3JhZ2Uub3B0aW9ucykKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogaV9jb3VudCA9IiwgaV9jb3VudCkKICAgIGlfY291bnQgPT0gcF9jb3VudCArIDMKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zWzBdID0iLCBpX3N0b3JhZ2Uub3B0aW9uc1swXSkKICAgIGlfc3RvcmFnZS5vcHRpb25zWzBdID09ICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQubGF5ZXItc3JjLXByZWZpeD0vdmFyL2xpYi9jb250YWluZXJkL2lvLmNvbnRhaW5lcmQuc25hcHNob3R0ZXIudjEudGFyZGV2L2xheWVycyIKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zW2lfY291bnQgLSAyXSA9IiwgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDJdKQogICAgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDJdID09ICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQub3ZlcmxheS1ydyIKCiAgICBsb3dlcmRpciA6PSBjb25jYXQoIj0iLCBbImxvd2VyZGlyIiwgcF9zdG9yYWdlLm9wdGlvbnNbMF1dKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBsb3dlcmRpciA9IiwgbG93ZXJkaXIpCgogICAgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDFdID09IGxvd2VyZGlyCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zW2lfY291bnQgLSAxXSA9IiwgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDFdKQoKICAgIGV2ZXJ5IGksIHBvbGljeV9pZCBpbiBwb2xpY3lfaWRzIHsKICAgICAgICBhbGxvd19vdmVybGF5X2xheWVyKHBvbGljeV9pZCwgcG9saWN5X2hhc2hlc1tpXSwgaV9zdG9yYWdlLm9wdGlvbnNbaSArIDFdKQogICAgfQoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogdHJ1ZSIpCn0KYWxsb3dfc3RvcmFnZV9vcHRpb25zKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKSB7CiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDM6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCiAgICBjb3VudChwX3N0b3JhZ2Uub3B0aW9ucykgPT0gMQoKICAgIHN0YXJ0c3dpdGgocF9zdG9yYWdlLm9wdGlvbnNbMF0sICIkKGhhc2giKQogICAgaGFzaF9zdWZmaXggOj0gdHJpbV9sZWZ0KHBfc3RvcmFnZS5vcHRpb25zWzBdLCAiJChoYXNoIikKCiAgICBlbmRzd2l0aChoYXNoX3N1ZmZpeCwgIikiKQogICAgaGFzaF9pbmRleCA6PSB0cmltX3JpZ2h0KGhhc2hfc3VmZml4LCAiKSIpCiAgICBpIDo9IHRvX251bWJlcihoYXNoX2luZGV4KQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAzOiBpID0iLCBpKQoKICAgIGhhc2hfb3B0aW9uIDo9IGNvbmNhdCgiPSIsIFsiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LnJvb3QtaGFzaCIsIHJvb3RfaGFzaGVzW2ldXSkKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMzogaGFzaF9vcHRpb24gPSIsIGhhc2hfb3B0aW9uKQoKICAgIGNvdW50KGlfc3RvcmFnZS5vcHRpb25zKSA9PSA0CiAgICBpX3N0b3JhZ2Uub3B0aW9uc1swXSA9PSAicm8iCiAgICBpX3N0b3JhZ2Uub3B0aW9uc1sxXSA9PSAiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmJsb2NrX2RldmljZT1maWxlIgogICAgaV9zdG9yYWdlLm9wdGlvbnNbMl0gPT0gImlvLmthdGFjb250YWluZXJzLmZzLW9wdC5pcy1sYXllciIKICAgIGlfc3RvcmFnZS5vcHRpb25zWzNdID09IGhhc2hfb3B0aW9uCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAzOiB0cnVlIikKfQphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgNDogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gInNtYiIKICAgIHBfb3B0c19jb3VudCA6PSBjb3VudChwX3N0b3JhZ2Uub3B0aW9ucykKICAgIGlfb3B0c19jb3VudCA6PSBjb3VudChpX3N0b3JhZ2Uub3B0aW9ucykKICAgIGlfb3B0c19jb3VudCA9PSBwX29wdHNfY291bnQgKyAyCgogICAgaV9vcHRfbWF0Y2hlcyA6PSBbaSB8IGkgOj0gaWR4OyBpZHggPCBwX29wdHNfY291bnQ7IHBfc3RvcmFnZS5vcHRpb25zW2lkeF0gPT0gaV9zdG9yYWdlLm9wdGlvbnNbaWR4XV0KICAgIGNvdW50KGlfb3B0X21hdGNoZXMpID09IHBfb3B0c19jb3VudAoKICAgIHN0YXJ0c3dpdGgoaV9zdG9yYWdlLm9wdGlvbnNbaV9vcHRzX2NvdW50LTJdLCAiYWRkcj0iKQogICAgY3JlZHMgPSBzcGxpdChpX3N0b3JhZ2Uub3B0aW9uc1tpX29wdHNfY291bnQtMV0sICIsIikKICAgIGNvdW50KGNyZWRzKSA9PSAyCiAgICBzdGFydHN3aXRoKGNyZWRzWzBdLCAidXNlcm5hbWU9IikKICAgIHN0YXJ0c3dpdGgoY3JlZHNbMV0sICJwYXNzd29yZD0iKQogICAgCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDQ6IHRydWUiKQp9CgphbGxvd19vdmVybGF5X2xheWVyKHBvbGljeV9pZCwgcG9saWN5X2hhc2gsIGlfb3B0aW9uKSB7CiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogcG9saWN5X2lkID0iLCBwb2xpY3lfaWQsICJwb2xpY3lfaGFzaCA9IiwgcG9saWN5X2hhc2gpCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogaV9vcHRpb24gPSIsIGlfb3B0aW9uKQoKICAgIHN0YXJ0c3dpdGgoaV9vcHRpb24sICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQubGF5ZXI9IikKICAgIGlfdmFsdWUgOj0gcmVwbGFjZShpX29wdGlvbiwgImlvLmthdGFjb250YWluZXJzLmZzLW9wdC5sYXllcj0iLCAiIikKICAgIGlfdmFsdWVfZGVjb2RlZCA6PSBiYXNlNjQuZGVjb2RlKGlfdmFsdWUpCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogaV92YWx1ZV9kZWNvZGVkID0iLCBpX3ZhbHVlX2RlY29kZWQpCgogICAgcG9saWN5X3N1ZmZpeCA6PSBjb25jYXQoIj0iLCBbInRhcixybyxpby5rYXRhY29udGFpbmVycy5mcy1vcHQuYmxvY2tfZGV2aWNlPWZpbGUsaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmlzLWxheWVyLGlvLmthdGFjb250YWluZXJzLmZzLW9wdC5yb290LWhhc2giLCBwb2xpY3lfaGFzaF0pCiAgICBwX3ZhbHVlIDo9IGNvbmNhdCgiLCIsIFtwb2xpY3lfaWQsIHBvbGljeV9zdWZmaXhdKQogICAgcHJpbnQoImFsbG93X292ZXJsYXlfbGF5ZXI6IHBfdmFsdWUgPSIsIHBfdmFsdWUpCgogICAgcF92YWx1ZSA9PSBpX3ZhbHVlX2RlY29kZWQKCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogdHJ1ZSIpCn0KCmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAidGFyIgoKICAgIHN0YXJ0c3dpdGgocF9zdG9yYWdlLm1vdW50X3BvaW50LCAiJChsYXllciIpCiAgICBtb3VudF9zdWZmaXggOj0gdHJpbV9sZWZ0KHBfc3RvcmFnZS5tb3VudF9wb2ludCwgIiQobGF5ZXIiKQoKICAgIGVuZHN3aXRoKG1vdW50X3N1ZmZpeCwgIikiKQogICAgbGF5ZXJfaW5kZXggOj0gdHJpbV9yaWdodChtb3VudF9zdWZmaXgsICIpIikKICAgIGkgOj0gdG9fbnVtYmVyKGxheWVyX2luZGV4KQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDE6IGkgPSIsIGkpCgogICAgbGF5ZXJfaWQgOj0gbGF5ZXJfaWRzW2ldCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMTogbGF5ZXJfaWQgPSIsIGxheWVyX2lkKQoKICAgIHBfbW91bnQgOj0gY29uY2F0KCIvIiwgWyIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L2xheWVycyIsIGxheWVyX2lkXSkKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCAxOiBwX21vdW50ID0iLCBwX21vdW50KQoKICAgIHBfbW91bnQgPT0gaV9zdG9yYWdlLm1vdW50X3BvaW50CgogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDE6IHRydWUiKQp9CmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAiZnVzZTMua2F0YS1vdmVybGF5IgoKICAgIG1vdW50MSA6PSByZXBsYWNlKHBfc3RvcmFnZS5tb3VudF9wb2ludCwgIiQoY3BhdGgpIiwgcG9saWN5X2RhdGEuY29tbW9uLmNwYXRoKQogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDI6IG1vdW50MiA9IiwgbW91bnQyKQoKICAgIG1vdW50MiA9PSBpX3N0b3JhZ2UubW91bnRfcG9pbnQKCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMjogdHJ1ZSIpCn0KYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKSB7CiAgICBwX3N0b3JhZ2UuZnN0eXBlID09ICJsb2NhbCIKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQyID0iLCBtb3VudDIpCgogICAgbW91bnQzIDo9IHJlcGxhY2UobW91bnQyLCAiJChzYW5kYm94LWlkKSIsIHNhbmRib3hfaWQpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQzID0iLCBtb3VudDMpCgogICAgcmVnZXgubWF0Y2gobW91bnQzLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCgogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDM6IHRydWUiKQp9CmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAiYmluZCIKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNDogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNDogbW91bnQyID0iLCBtb3VudDIpCgogICAgbW91bnQzIDo9IHJlcGxhY2UobW91bnQyLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDQ6IG1vdW50MyA9IiwgbW91bnQzKQoKICAgIHJlZ2V4Lm1hdGNoKG1vdW50MywgaV9zdG9yYWdlLm1vdW50X3BvaW50KQoKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA0OiB0cnVlIikKfQphbGxvd19tb3VudF9wb2ludChwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgYnVuZGxlX2lkLCBzYW5kYm94X2lkLCBsYXllcl9pZHMpIHsKICAgIHBfc3RvcmFnZS5mc3R5cGUgPT0gInRtcGZzIgoKICAgIG1vdW50MSA6PSBwX3N0b3JhZ2UubW91bnRfcG9pbnQKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA1OiBtb3VudDEgPSIsIG1vdW50MSkKCiAgICByZWdleC5tYXRjaChtb3VudDEsIGlfc3RvcmFnZS5tb3VudF9wb2ludCkKCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNTogdHJ1ZSIpCn0KYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKSB7CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogaV9zdG9yYWdlLm1vdW50X3BvaW50ID0iLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCiAgICBhbGxvd19kaXJlY3Rfdm9sX2RyaXZlcihwX3N0b3JhZ2UsIGlfc3RvcmFnZSkKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChzcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQyID0iLCBtb3VudDIpCgogICAgZGlyZWN0X3ZvbF9wYXRoIDo9IGlfc3RvcmFnZS5zb3VyY2UKICAgIG1vdW50MyA6PSByZXBsYWNlKG1vdW50MiwgIiQoYjY0LWRpcmVjdC12b2wtcGF0aCkiLCBiYXNlNjR1cmwuZW5jb2RlKGRpcmVjdF92b2xfcGF0aCkpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQzID0iLCBtb3VudDMpCgogICAgbW91bnQzID09IGlfc3RvcmFnZS5tb3VudF9wb2ludAoKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA2OiB0cnVlIikKfQoKYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIocF9zdG9yYWdlLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19kaXJlY3Rfdm9sX2RyaXZlciAxOiBzdGFydCIpCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCiAgICBwcmludCgiYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIgMTogdHJ1ZSIpCn0KYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIocF9zdG9yYWdlLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19kaXJlY3Rfdm9sX2RyaXZlciAyOiBzdGFydCIpCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJzbWIiCiAgICBwcmludCgiYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIgMjogdHJ1ZSIpCn0KCiMgRXhlY1Byb2Nlc3NSZXF1ZXN0LnByb2Nlc3MuQ2FwYWJpbGl0aWVzCmFsbG93X2V4ZWNfY2FwcyhpX2NhcHMpIHsKICAgIG5vdCBpX2NhcHMuQW1iaWVudAogICAgbm90IGlfY2Fwcy5Cb3VuZGluZwogICAgbm90IGlfY2Fwcy5FZmZlY3RpdmUKICAgIG5vdCBpX2NhcHMuSW5oZXJpdGFibGUKICAgIG5vdCBpX2NhcHMuUGVybWl0dGVkCn0KCiMgT0NJLlByb2Nlc3MuQ2FwYWJpbGl0aWVzCmFsbG93X2NhcHMocF9jYXBzLCBpX2NhcHMpIHsKICAgIHByaW50KCJhbGxvd19jYXBzOiBwb2xpY3kgQW1iaWVudCA9IiwgcF9jYXBzLkFtYmllbnQpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgQW1iaWVudCA9IiwgaV9jYXBzLkFtYmllbnQpCiAgICBtYXRjaF9jYXBzKHBfY2Fwcy5BbWJpZW50LCBpX2NhcHMuQW1iaWVudCkKCiAgICBwcmludCgiYWxsb3dfY2FwczogcG9saWN5IEJvdW5kaW5nID0iLCBwX2NhcHMuQm91bmRpbmcpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgQm91bmRpbmcgPSIsIGlfY2Fwcy5Cb3VuZGluZykKICAgIG1hdGNoX2NhcHMocF9jYXBzLkJvdW5kaW5nLCBpX2NhcHMuQm91bmRpbmcpCgogICAgcHJpbnQoImFsbG93X2NhcHM6IHBvbGljeSBFZmZlY3RpdmUgPSIsIHBfY2Fwcy5FZmZlY3RpdmUpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgRWZmZWN0aXZlID0iLCBpX2NhcHMuRWZmZWN0aXZlKQogICAgbWF0Y2hfY2FwcyhwX2NhcHMuRWZmZWN0aXZlLCBpX2NhcHMuRWZmZWN0aXZlKQoKICAgIHByaW50KCJhbGxvd19jYXBzOiBwb2xpY3kgSW5oZXJpdGFibGUgPSIsIHBfY2Fwcy5Jbmhlcml0YWJsZSkKICAgIHByaW50KCJhbGxvd19jYXBzOiBpbnB1dCBJbmhlcml0YWJsZSA9IiwgaV9jYXBzLkluaGVyaXRhYmxlKQogICAgbWF0Y2hfY2FwcyhwX2NhcHMuSW5oZXJpdGFibGUsIGlfY2Fwcy5Jbmhlcml0YWJsZSkKCiAgICBwcmludCgiYWxsb3dfY2FwczogcG9saWN5IFBlcm1pdHRlZCA9IiwgcF9jYXBzLlBlcm1pdHRlZCkKICAgIHByaW50KCJhbGxvd19jYXBzOiBpbnB1dCBQZXJtaXR0ZWQgPSIsIGlfY2Fwcy5QZXJtaXR0ZWQpCiAgICBtYXRjaF9jYXBzKHBfY2Fwcy5QZXJtaXR0ZWQsIGlfY2Fwcy5QZXJtaXR0ZWQpCn0KCm1hdGNoX2NhcHMocF9jYXBzLCBpX2NhcHMpIHsKICAgIHByaW50KCJtYXRjaF9jYXBzIDE6IHN0YXJ0IikKCiAgICBwX2NhcHMgPT0gaV9jYXBzCgogICAgcHJpbnQoIm1hdGNoX2NhcHMgMTogdHJ1ZSIpCn0KbWF0Y2hfY2FwcyhwX2NhcHMsIGlfY2FwcykgewogICAgcHJpbnQoIm1hdGNoX2NhcHMgMjogc3RhcnQiKQoKICAgIGNvdW50KHBfY2FwcykgPT0gMQogICAgcF9jYXBzWzBdID09ICIkKGRlZmF1bHRfY2FwcykiCgogICAgcHJpbnQoIm1hdGNoX2NhcHMgMjogZGVmYXVsdF9jYXBzID0iLCBwb2xpY3lfZGF0YS5jb21tb24uZGVmYXVsdF9jYXBzKQogICAgcG9saWN5X2RhdGEuY29tbW9uLmRlZmF1bHRfY2FwcyA9PSBpX2NhcHMKCiAgICBwcmludCgibWF0Y2hfY2FwcyAyOiB0cnVlIikKfQptYXRjaF9jYXBzKHBfY2FwcywgaV9jYXBzKSB7CiAgICBwcmludCgibWF0Y2hfY2FwcyAzOiBzdGFydCIpCgogICAgY291bnQocF9jYXBzKSA9PSAxCiAgICBwX2NhcHNbMF0gPT0gIiQocHJpdmlsZWdlZF9jYXBzKSIKCiAgICBwcmludCgibWF0Y2hfY2FwcyAzOiBwcml2aWxlZ2VkX2NhcHMgPSIsIHBvbGljeV9kYXRhLmNvbW1vbi5wcml2aWxlZ2VkX2NhcHMpCiAgICBwb2xpY3lfZGF0YS5jb21tb24ucHJpdmlsZWdlZF9jYXBzID09IGlfY2FwcwoKICAgIHByaW50KCJtYXRjaF9jYXBzIDM6IHRydWUiKQp9CgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgpjaGVja19kaXJlY3RvcnlfdHJhdmVyc2FsKGlfcGF0aCkgewogICAgbm90IHJlZ2V4Lm1hdGNoKCIoXnwvKS4uKCR8LykiLCBpX3BhdGgpCn0KCmNoZWNrX3N5bWxpbmtfc291cmNlKGlfc3JjKSB7CiAgICBpX3NyYyA9PSAiIgogICAgcHJpbnQoImNoZWNrX3N5bWxpbmtfc291cmNlIDE6IHRydWUiKQp9CmNoZWNrX3N5bWxpbmtfc291cmNlKGlfc3JjKSB7CiAgICBpX3NyYyAhPSAiIgogICAgcHJpbnQoImNoZWNrX3N5bWxpbmtfc291cmNlIDI6IGlfc3JjID0iLCBpX3NyYykKCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24uc19zb3VyY2UxLCBpX3NyYykKCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMjogdHJ1ZSIpCn0KY2hlY2tfc3ltbGlua19zb3VyY2UoaV9zcmMpIHsKICAgIGlfc3JjICE9ICIiCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMzogaV9zcmMgPSIsIGlfc3JjKQoKICAgIHJlZ2V4Lm1hdGNoKHBvbGljeV9kYXRhLmNvbW1vbi5zX3NvdXJjZTIsIGlfc3JjKQogICAgY2hlY2tfZGlyZWN0b3J5X3RyYXZlcnNhbChpX3NyYykKCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMzogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfc3RvcmFnZXMoaV9zdG9yYWdlcykgewogICAgcHJpbnQoImFsbG93X3NhbmRib3hfc3RvcmFnZXM6IGlfc3RvcmFnZXMgPSIsIGlfc3RvcmFnZXMpCgogICAgcF9zdG9yYWdlcyA6PSBwb2xpY3lfZGF0YS5zYW5kYm94LnN0b3JhZ2VzCiAgICBldmVyeSBpX3N0b3JhZ2UgaW4gaV9zdG9yYWdlcyB7CiAgICAgICAgYWxsb3dfc2FuZGJveF9zdG9yYWdlKHBfc3RvcmFnZXMsIGlfc3RvcmFnZSkKICAgIH0KCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9zdG9yYWdlczogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfc3RvcmFnZShwX3N0b3JhZ2VzLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IGlfc3RvcmFnZSA9IiwgaV9zdG9yYWdlKQoKICAgIHNvbWUgcF9zdG9yYWdlIGluIHBfc3RvcmFnZXMKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IHBfc3RvcmFnZSA9IiwgcF9zdG9yYWdlKQogICAgaV9zdG9yYWdlID09IHBfc3RvcmFnZQoKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IHRydWUiKQp9CgpDb3B5RmlsZVJlcXVlc3QgewogICAgcHJpbnQoIkNvcHlGaWxlUmVxdWVzdDogaW5wdXQucGF0aCA9IiwgaW5wdXQucGF0aCkKCiAgICBjaGVja19zeW1saW5rX3NvdXJjZShpbnB1dC5zeW1saW5rX3NyYykKICAgIGNoZWNrX2RpcmVjdG9yeV90cmF2ZXJzYWwoaW5wdXQucGF0aCkKCiAgICBzb21lIHJlZ2V4MSBpbiBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLkNvcHlGaWxlUmVxdWVzdAogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5jcGF0aCkKICAgIHJlZ2V4NCA6PSByZXBsYWNlKHJlZ2V4MywgIiQoYnVuZGxlLWlkKSIsIEJVTkRMRV9JRCkKICAgIHByaW50KCJDb3B5RmlsZVJlcXVlc3Q6IHJlZ2V4NCA9IiwgcmVnZXg0KQoKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4NCwgaW5wdXQucGF0aCkKCiAgICBwcmludCgiQ29weUZpbGVSZXF1ZXN0OiB0cnVlIikKfQoKQ3JlYXRlU2FuZGJveFJlcXVlc3QgewogICAgcHJpbnQoIkNyZWF0ZVNhbmRib3hSZXF1ZXN0OiBpbnB1dC5ndWVzdF9ob29rX3BhdGggPSIsIGlucHV0Lmd1ZXN0X2hvb2tfcGF0aCkKICAgIGNvdW50KGlucHV0Lmd1ZXN0X2hvb2tfcGF0aCkgPT0gMAoKICAgIHByaW50KCJDcmVhdGVTYW5kYm94UmVxdWVzdDogaW5wdXQua2VybmVsX21vZHVsZXMgPSIsIGlucHV0Lmtlcm5lbF9tb2R1bGVzKQogICAgY291bnQoaW5wdXQua2VybmVsX21vZHVsZXMpID09IDAKCiAgICBpX3BpZG5zIDo9IGlucHV0LnNhbmRib3hfcGlkbnMKICAgIHByaW50KCJDcmVhdGVTYW5kYm94UmVxdWVzdDogaV9waWRucyA9IiwgaV9waWRucykKICAgIGlfcGlkbnMgPT0gZmFsc2UKICAgIGFsbG93X3NhbmRib3hfc3RvcmFnZXMoaW5wdXQuc3RvcmFnZXMpCn0KCmFsbG93X2V4ZWMocF9jb250YWluZXIsIGlfcHJvY2VzcykgewogICAgcHJpbnQoImFsbG93X2V4ZWM6IHN0YXJ0IikKCiAgICBwX29jaSA9IHBfY29udGFpbmVyLk9DSQogICAgcF9zX25hbWUgPSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc19uYW1lc3BhY2UgPSBnZXRfc3RhdGVfdmFsKCJuYW1lc3BhY2UiKQogICAgYWxsb3dfcHJvYmVfcHJvY2VzcyhwX29jaS5Qcm9jZXNzLCBpX3Byb2Nlc3MsIHBfc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfZXhlYzogdHJ1ZSIpCn0KCmFsbG93X2ludGVyYWN0aXZlX2V4ZWMocF9jb250YWluZXIsIGlfcHJvY2VzcykgewogICAgcHJpbnQoImFsbG93X2ludGVyYWN0aXZlX2V4ZWM6IHN0YXJ0IikKCiAgICBwX29jaSA9IHBfY29udGFpbmVyLk9DSQogICAgcF9zX25hbWUgPSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc19uYW1lc3BhY2UgPSBnZXRfc3RhdGVfdmFsKCJuYW1lc3BhY2UiKQogICAgYWxsb3dfaW50ZXJhY3RpdmVfcHJvY2VzcyhwX29jaS5Qcm9jZXNzLCBpX3Byb2Nlc3MsIHBfc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfaW50ZXJhY3RpdmVfZXhlYzogdHJ1ZSIpCn0KCiMgVE9ETzogc2hvdWxkIG90aGVyIEV4ZWNQcm9jZXNzUmVxdWVzdCBpbnB1dCBkYXRhIGZpZWxkcyBiZSB2YWxpZGF0ZWQgYXMgd2VsbD8KRXhlY1Byb2Nlc3NSZXF1ZXN0IHsKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMTogaW5wdXQgPSIsIGlucHV0KQoKICAgIHNvbWUgcF9jb21tYW5kIGluIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuRXhlY1Byb2Nlc3NSZXF1ZXN0LmFsbG93ZWRfY29tbWFuZHMKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMTogcF9jb21tYW5kID0iLCBwX2NvbW1hbmQpCiAgICBwX2NvbW1hbmQgPT0gaW5wdXQucHJvY2Vzcy5BcmdzCgogICAgIyBUT0RPOiBtYXRjaCBwX2NvbnRhaW5lcidzIElEIHdpdGggdGhlIGlucHV0IGNvbnRhaW5lcl9pZC4KICAgIHNvbWUgcF9jb250YWluZXIgaW4gcG9saWN5X2RhdGEuY29udGFpbmVycwogICAgYWxsb3dfaW50ZXJhY3RpdmVfZXhlYyhwX2NvbnRhaW5lciwgaW5wdXQucHJvY2VzcykKCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDE6IHRydWUiKQp9CkV4ZWNQcm9jZXNzUmVxdWVzdCB7CiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDI6IGlucHV0ID0iLCBpbnB1dCkKCiAgICAjIFRPRE86IG1hdGNoIGlucHV0IGNvbnRhaW5lciBJRCB3aXRoIGl0cyBjb3JyZXNwb25kaW5nIGNvbnRhaW5lci5leGVjX2NvbW1hbmRzLgogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBzb21lIHBfY29tbWFuZCBpbiBwX2NvbnRhaW5lci5leGVjX2NvbW1hbmRzCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDI6IHBfY29tbWFuZCA9IiwgcF9jb21tYW5kKQoKICAgICMgVE9ETzogc2hvdWxkIG90aGVyIGlucHV0IGRhdGEgZmllbGRzIGJlIHZhbGlkYXRlZCBhcyB3ZWxsPwogICAgcF9jb21tYW5kID09IGlucHV0LnByb2Nlc3MuQXJncwoKICAgIGFsbG93X2V4ZWMocF9jb250YWluZXIsIGlucHV0LnByb2Nlc3MpCgogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAyOiB0cnVlIikKfQpFeGVjUHJvY2Vzc1JlcXVlc3QgewogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAzOiBpbnB1dCA9IiwgaW5wdXQpCgogICAgaV9jb21tYW5kID0gY29uY2F0KCIgIiwgaW5wdXQucHJvY2Vzcy5BcmdzKQogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAzOiBpX2NvbW1hbmQgPSIsIGlfY29tbWFuZCkKCiAgICBzb21lIHBfcmVnZXggaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5FeGVjUHJvY2Vzc1JlcXVlc3QucmVnZXgKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMzogcF9yZWdleCA9IiwgcF9yZWdleCkKCiAgICByZWdleC5tYXRjaChwX3JlZ2V4LCBpX2NvbW1hbmQpCgogICAgIyBUT0RPOiBtYXRjaCBwX2NvbnRhaW5lcidzIElEIHdpdGggdGhlIGlucHV0IGNvbnRhaW5lcl9pZC4KICAgIHNvbWUgcF9jb250YWluZXIgaW4gcG9saWN5X2RhdGEuY29udGFpbmVycwogICAgYWxsb3dfaW50ZXJhY3RpdmVfZXhlYyhwX2NvbnRhaW5lciwgaW5wdXQucHJvY2VzcykKCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDM6IHRydWUiKQp9CgpVcGRhdGVSb3V0ZXNSZXF1ZXN0IHsKICAgIHByaW50KCJVcGRhdGVSb3V0ZXNSZXF1ZXN0OiBpbnB1dCA9IiwgaW5wdXQpCiAgICBwcmludCgiVXBkYXRlUm91dGVzUmVxdWVzdDogcG9saWN5ID0iLCBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLlVwZGF0ZVJvdXRlc1JlcXVlc3QpCgogICAgaV9yb3V0ZXMgOj0gaW5wdXQucm91dGVzLlJvdXRlcwogICAgcF9zb3VyY2VfcmVnZXggPSBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLlVwZGF0ZVJvdXRlc1JlcXVlc3QuZm9yYmlkZGVuX3NvdXJjZV9yZWdleAogICAgcF9uYW1lcyA9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuVXBkYXRlUm91dGVzUmVxdWVzdC5mb3JiaWRkZW5fZGV2aWNlX25hbWVzCgogICAgZXZlcnkgaV9yb3V0ZSBpbiBpX3JvdXRlcyB7CiAgICAgICAgcHJpbnQoImlfcm91dGUuc291cmNlID0iLCBpX3JvdXRlLnNvdXJjZSkKICAgICAgICBldmVyeSBwX3JlZ2V4IGluIHBfc291cmNlX3JlZ2V4IHsKICAgICAgICAgICAgcHJpbnQoInBfcmVnZXggPSIsIHBfcmVnZXgpCiAgICAgICAgICAgIG5vdCByZWdleC5tYXRjaChwX3JlZ2V4LCBpX3JvdXRlLnNvdXJjZSkKICAgICAgICB9CgogICAgICAgIHByaW50KCJpX3JvdXRlLmRldmljZSA9IiwgaV9yb3V0ZS5kZXZpY2UpCiAgICAgICAgbm90IGlfcm91dGUuZGV2aWNlIGluIHBfbmFtZXMKICAgIH0KCiAgICBwcmludCgiVXBkYXRlUm91dGVzUmVxdWVzdDogdHJ1ZSIpCn0KClVwZGF0ZUludGVyZmFjZVJlcXVlc3QgewogICAgcHJpbnQoIlVwZGF0ZUludGVyZmFjZVJlcXVlc3Q6IGlucHV0ID0iLCBpbnB1dCkKICAgIHByaW50KCJVcGRhdGVJbnRlcmZhY2VSZXF1ZXN0OiBwb2xpY3kgPSIsIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuVXBkYXRlSW50ZXJmYWNlUmVxdWVzdCkKCiAgICBpX2ludGVyZmFjZSA6PSBpbnB1dC5pbnRlcmZhY2UKICAgIHBfZmxhZ3MgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmFsbG93X3Jhd19mbGFncwoKICAgICMgVHlwaWNhbGx5LCBqdXN0IElGRl9OT0FSUCBpcyB1c2VkLgogICAgYml0cy5hbmQoaV9pbnRlcmZhY2UucmF3X2ZsYWdzLCBiaXRzLm5lZ2F0ZShwX2ZsYWdzKSkgPT0gMAoKICAgIHBfbmFtZXMgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmZvcmJpZGRlbl9uYW1lcwoKICAgIG5vdCBpX2ludGVyZmFjZS5uYW1lIGluIHBfbmFtZXMKCiAgICBwX2h3YWRkcnMgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmZvcmJpZGRlbl9od19hZGRycwoKICAgIG5vdCBpX2ludGVyZmFjZS5od0FkZHIgaW4gcF9od2FkZHJzCgogICAgcHJpbnQoIlVwZGF0ZUludGVyZmFjZVJlcXVlc3Q6IHRydWUiKQp9CgpDbG9zZVN0ZGluUmVxdWVzdCB7CiAgICBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLkNsb3NlU3RkaW5SZXF1ZXN0ID09IHRydWUKfQoKUmVhZFN0cmVhbVJlcXVlc3QgewogICAgcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5SZWFkU3RyZWFtUmVxdWVzdCA9PSB0cnVlCn0KClVwZGF0ZUVwaGVtZXJhbE1vdW50c1JlcXVlc3QgewogICAgcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVFcGhlbWVyYWxNb3VudHNSZXF1ZXN0ID09IHRydWUKfQoKV3JpdGVTdHJlYW1SZXF1ZXN0IHsKICAgIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuV3JpdGVTdHJlYW1SZXF1ZXN0ID09IHRydWUKfQoKcG9saWN5X2RhdGEgOj0gewogICJjb250YWluZXJzIjogWwogICAgewogICAgICAiT0NJIjogewogICAgICAgICJWZXJzaW9uIjogIjEuMS4wLXJjLjEiLAogICAgICAgICJQcm9jZXNzIjogewogICAgICAgICAgIlRlcm1pbmFsIjogZmFsc2UsCiAgICAgICAgICAiVXNlciI6IHsKICAgICAgICAgICAgIlVJRCI6IDY1NTM1LAogICAgICAgICAgICAiR0lEIjogNjU1MzUsCiAgICAgICAgICAgICJBZGRpdGlvbmFsR2lkcyI6IFtdLAogICAgICAgICAgICAiVXNlcm5hbWUiOiAiIgogICAgICAgICAgfSwKICAgICAgICAgICJEZXByZWNhdGVkQXJncyI6IFsKICAgICAgICAgICAgIi9wYXVzZSIKICAgICAgICAgIF0sCiAgICAgICAgICAiQXJncyI6IFsKICAgICAgICAgICAgIi9wYXVzZSIKICAgICAgICAgIF0sCiAgICAgICAgICAiRW52IjogWwogICAgICAgICAgICAiUEFUSD0vdXNyL2xvY2FsL3NiaW46L3Vzci9sb2NhbC9iaW46L3Vzci9zYmluOi91c3IvYmluOi9zYmluOi9iaW4iCiAgICAgICAgICBdLAogICAgICAgICAgIkN3ZCI6ICIvIiwKICAgICAgICAgICJDYXBhYmlsaXRpZXMiOiB7CiAgICAgICAgICAgICJBbWJpZW50IjogW10sCiAgICAgICAgICAgICJCb3VuZGluZyI6IFsKICAgICAgICAgICAgICAiJChkZWZhdWx0X2NhcHMpIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiRWZmZWN0aXZlIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJJbmhlcml0YWJsZSI6IFtdLAogICAgICAgICAgICAiUGVybWl0dGVkIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICAiTm9OZXdQcml2aWxlZ2VzIjogdHJ1ZQogICAgICAgIH0sCiAgICAgICAgIlJvb3QiOiB7CiAgICAgICAgICAiUGF0aCI6ICIkKGNwYXRoKS8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgIlJlYWRvbmx5IjogdHJ1ZQogICAgICAgIH0sCiAgICAgICAgIk1vdW50cyI6IFsKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9wcm9jIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJwcm9jIiwKICAgICAgICAgICAgInR5cGVfIjogInByb2MiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2IiwKICAgICAgICAgICAgInNvdXJjZSI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJzdHJpY3RhdGltZSIsCiAgICAgICAgICAgICAgIm1vZGU9NzU1IiwKICAgICAgICAgICAgICAic2l6ZT02NTUzNmsiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L3B0cyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiZGV2cHRzIiwKICAgICAgICAgICAgInR5cGVfIjogImRldnB0cyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJuZXdpbnN0YW5jZSIsCiAgICAgICAgICAgICAgInB0bXhtb2RlPTA2NjYiLAogICAgICAgICAgICAgICJtb2RlPTA2MjAiLAogICAgICAgICAgICAgICJnaWQ9NSIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvc2htIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L3NobSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi9tcXVldWUiLAogICAgICAgICAgICAic291cmNlIjogIm1xdWV1ZSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJtcXVldWUiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvc3lzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJzeXNmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJzeXNmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2V0Yy9yZXNvbHYuY29uZiIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClyZXNvbHYuY29uZiQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJvIiwKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9kZXYiLAogICAgICAgICAgICAgICJub2V4ZWMiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0KICAgICAgICBdLAogICAgICAgICJBbm5vdGF0aW9ucyI6IHsKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmJ1bmRsZV9wYXRoIjogIi9ydW4vY29udGFpbmVyZC9pby5jb250YWluZXJkLnJ1bnRpbWUudjIudGFzay9rOHMuaW8vJChidW5kbGUtaWQpIiwKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIjogInBvZF9zYW5kYm94IiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSI6ICJzYW5kYm94IiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWlkIjogIl5bYS16MC05XXs2NH0kIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWxvZy1kaXJlY3RvcnkiOiAiXi92YXIvbG9nL3BvZHMvJChzYW5kYm94LW5hbWVzcGFjZSlfJChzYW5kYm94LW5hbWUpX1swLTlhLWZdezh9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezEyfSQiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZSI6ICJecG9kXFwtcHJvamVjdGVkXFwtc2VjcmV0c1xcLWM2NGUyY2IyXFwtZjdiYVxcLTQxOGRcXC1hNjNiXFwtMjdmNDk3MDdlYTNkJCIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1uYW1lc3BhY2UiOiAicHJvamVjdGVkLTk0MyIsCiAgICAgICAgICAibmVyZGN0bC9uZXR3b3JrLW5hbWVzcGFjZSI6ICJeL3Zhci9ydW4vbmV0bnMvY25pLVswLTlhLWZdezh9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezEyfSQiCiAgICAgICAgfSwKICAgICAgICAiTGludXgiOiB7CiAgICAgICAgICAiTmFtZXNwYWNlcyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICJUeXBlIjogImlwYyIsCiAgICAgICAgICAgICAgIlBhdGgiOiAiIgogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgIlR5cGUiOiAidXRzIiwKICAgICAgICAgICAgICAiUGF0aCI6ICIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiVHlwZSI6ICJtb3VudCIsCiAgICAgICAgICAgICAgIlBhdGgiOiAiIgogICAgICAgICAgICB9CiAgICAgICAgICBdLAogICAgICAgICAgIk1hc2tlZFBhdGhzIjogWwogICAgICAgICAgICAiL3Byb2MvYWNwaSIsCiAgICAgICAgICAgICIvcHJvYy9hc291bmQiLAogICAgICAgICAgICAiL3Byb2Mva2NvcmUiLAogICAgICAgICAgICAiL3Byb2Mva2V5cyIsCiAgICAgICAgICAgICIvcHJvYy9sYXRlbmN5X3N0YXRzIiwKICAgICAgICAgICAgIi9wcm9jL3RpbWVyX2xpc3QiLAogICAgICAgICAgICAiL3Byb2MvdGltZXJfc3RhdHMiLAogICAgICAgICAgICAiL3Byb2Mvc2NoZWRfZGVidWciLAogICAgICAgICAgICAiL3N5cy9maXJtd2FyZSIsCiAgICAgICAgICAgICIvcHJvYy9zY3NpIgogICAgICAgICAgXSwKICAgICAgICAgICJSZWFkb25seVBhdGhzIjogWwogICAgICAgICAgICAiL3Byb2MvYnVzIiwKICAgICAgICAgICAgIi9wcm9jL2ZzIiwKICAgICAgICAgICAgIi9wcm9jL2lycSIsCiAgICAgICAgICAgICIvcHJvYy9zeXMiLAogICAgICAgICAgICAiL3Byb2Mvc3lzcnEtdHJpZ2dlciIKICAgICAgICAgIF0sCiAgICAgICAgICAiRGV2aWNlcyI6IFtdLAogICAgICAgICAgIlN5c2N0bCI6IHsKICAgICAgICAgICAgIm5ldC5pcHY0LmlwX3VucHJpdmlsZWdlZF9wb3J0X3N0YXJ0IjogIjAiLAogICAgICAgICAgICAibmV0LmlwdjQucGluZ19ncm91cF9yYW5nZSI6ICIwIDIxNDc0ODM2NDciCiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9LAogICAgICAic3RvcmFnZXMiOiBbCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJibGsiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogInRhciIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIiQoaGFzaDApIgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGxheWVyMCkiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJvdmVybGF5ZnMiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogImZ1c2UzLmthdGEtb3ZlcmxheSIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIjVhNWFhZDgwMDU1ZmYyMDAxMmE1MGRjMjVmOGRmN2EyOTkyNDQ3NDMyNGQ2NWY3ZDUzMDZlZThlZTI3ZmY3MWQiLAogICAgICAgICAgICAiODE3MjUwZjFhM2UzMzZkYTc2ZjViZDNmYTc4NGUxYjI2ZDk1OWI5YzEzMTg3NjgxNWJhMjYwNDA0OGI3MGMxOCIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChjcGF0aCkvJChidW5kbGUtaWQpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9CiAgICAgIF0sCiAgICAgICJkZXZpY2VzIjogW10sCiAgICAgICJzYW5kYm94X3BpZG5zIjogZmFsc2UsCiAgICAgICJleGVjX2NvbW1hbmRzIjogW10sCiAgICAgICJlbnZfbWFwIjogewogICAgICAgICJQQVRIIjogIi91c3IvbG9jYWwvc2JpbjovdXNyL2xvY2FsL2JpbjovdXNyL3NiaW46L3Vzci9iaW46L3NiaW46L2JpbiIKICAgICAgfQogICAgfSwKICAgIHsKICAgICAgIk9DSSI6IHsKICAgICAgICAiVmVyc2lvbiI6ICIxLjEuMC1yYy4xIiwKICAgICAgICAiUHJvY2VzcyI6IHsKICAgICAgICAgICJUZXJtaW5hbCI6IGZhbHNlLAogICAgICAgICAgIlVzZXIiOiB7CiAgICAgICAgICAgICJVSUQiOiAwLAogICAgICAgICAgICAiR0lEIjogMCwKICAgICAgICAgICAgIkFkZGl0aW9uYWxHaWRzIjogW10sCiAgICAgICAgICAgICJVc2VybmFtZSI6ICIiCiAgICAgICAgICB9LAogICAgICAgICAgIkRlcHJlY2F0ZWRBcmdzIjogWwogICAgICAgICAgICAic2giCiAgICAgICAgICBdLAogICAgICAgICAgIkFyZ3MiOiBbCiAgICAgICAgICAgICJzaCIKICAgICAgICAgIF0sCiAgICAgICAgICAiRW52IjogWwogICAgICAgICAgICAiUEFUSD0vdXNyL2xvY2FsL3NiaW46L3Vzci9sb2NhbC9iaW46L3Vzci9zYmluOi91c3IvYmluOi9zYmluOi9iaW4iLAogICAgICAgICAgICAiSE9TVE5BTUU9JChob3N0LW5hbWUpIgogICAgICAgICAgXSwKICAgICAgICAgICJDd2QiOiAiLyIsCiAgICAgICAgICAiQ2FwYWJpbGl0aWVzIjogewogICAgICAgICAgICAiQW1iaWVudCI6IFtdLAogICAgICAgICAgICAiQm91bmRpbmciOiBbCiAgICAgICAgICAgICAgIiQoZGVmYXVsdF9jYXBzKSIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgIkVmZmVjdGl2ZSI6IFsKICAgICAgICAgICAgICAiJChkZWZhdWx0X2NhcHMpIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiSW5oZXJpdGFibGUiOiBbXSwKICAgICAgICAgICAgIlBlcm1pdHRlZCI6IFsKICAgICAgICAgICAgICAiJChkZWZhdWx0X2NhcHMpIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgIk5vTmV3UHJpdmlsZWdlcyI6IGZhbHNlCiAgICAgICAgfSwKICAgICAgICAiUm9vdCI6IHsKICAgICAgICAgICJQYXRoIjogIiQoY3BhdGgpLyQoYnVuZGxlLWlkKSIsCiAgICAgICAgICAiUmVhZG9ubHkiOiBmYWxzZQogICAgICAgIH0sCiAgICAgICAgIk1vdW50cyI6IFsKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9wcm9jIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJwcm9jIiwKICAgICAgICAgICAgInR5cGVfIjogInByb2MiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2IiwKICAgICAgICAgICAgInNvdXJjZSI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJzdHJpY3RhdGltZSIsCiAgICAgICAgICAgICAgIm1vZGU9NzU1IiwKICAgICAgICAgICAgICAic2l6ZT02NTUzNmsiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L3B0cyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiZGV2cHRzIiwKICAgICAgICAgICAgInR5cGVfIjogImRldnB0cyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJuZXdpbnN0YW5jZSIsCiAgICAgICAgICAgICAgInB0bXhtb2RlPTA2NjYiLAogICAgICAgICAgICAgICJtb2RlPTA2MjAiLAogICAgICAgICAgICAgICJnaWQ9NSIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvc2htIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L3NobSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi9tcXVldWUiLAogICAgICAgICAgICAic291cmNlIjogIm1xdWV1ZSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJtcXVldWUiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvc3lzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJzeXNmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJzeXNmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL3N5cy9mcy9jZ3JvdXAiLAogICAgICAgICAgICAic291cmNlIjogImNncm91cCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJjZ3JvdXAiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiLAogICAgICAgICAgICAgICJyZWxhdGltZSIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2V0Yy9ob3N0cyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClob3N0cyQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicnciCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L3Rlcm1pbmF0aW9uLWxvZyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeCl0ZXJtaW5hdGlvbi1sb2ckIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJ3IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2V0Yy9ob3N0bmFtZSIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClob3N0bmFtZSQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicnciCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZXRjL3Jlc29sdi5jb25mIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KXJlc29sdi5jb25mJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJydyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi92YXIvcnVuL3NlY3JldHMva3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudCIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClzZXJ2aWNlYWNjb3VudCQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicm8iCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvdmFyL3J1bi9zZWNyZXRzL2F6dXJlL3Rva2VucyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeCl0b2tlbnMkIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2V0Yy9wcm9qZWN0ZWQtc2VjcmV0LXZvbHVtZSIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClwcm9qZWN0ZWQtc2VjcmV0LXZvbHVtZSQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicm8iCiAgICAgICAgICAgIF0KICAgICAgICAgIH0KICAgICAgICBdLAogICAgICAgICJBbm5vdGF0aW9ucyI6IHsKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmJ1bmRsZV9wYXRoIjogIi9ydW4vY29udGFpbmVyZC9pby5jb250YWluZXJkLnJ1bnRpbWUudjIudGFzay9rOHMuaW8vJChidW5kbGUtaWQpIiwKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIjogInBvZF9jb250YWluZXIiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLmNvbnRhaW5lci1uYW1lIjogInByb2plY3RlZC1zZWNyZXQtdm9sdW1lLXRlc3QiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLmNvbnRhaW5lci10eXBlIjogImNvbnRhaW5lciIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuaW1hZ2UtbmFtZSI6ICJyZWdpc3RyeS5rOHMuaW8vZTJlLXRlc3QtaW1hZ2VzL2Fnbmhvc3Q6Mi40MCIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCI6ICJeW2EtejAtOV17NjR9JCIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1uYW1lIjogIl5wb2RcXC1wcm9qZWN0ZWRcXC1zZWNyZXRzXFwtYzY0ZTJjYjJcXC1mN2JhXFwtNDE4ZFxcLWE2M2JcXC0yN2Y0OTcwN2VhM2QkIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LW5hbWVzcGFjZSI6ICJwcm9qZWN0ZWQtOTQzIgogICAgICAgIH0sCiAgICAgICAgIkxpbnV4IjogewogICAgICAgICAgIk5hbWVzcGFjZXMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiVHlwZSI6ICJpcGMiLAogICAgICAgICAgICAgICJQYXRoIjogIiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJUeXBlIjogInV0cyIsCiAgICAgICAgICAgICAgIlBhdGgiOiAiIgogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgIlR5cGUiOiAibW91bnQiLAogICAgICAgICAgICAgICJQYXRoIjogIiIKICAgICAgICAgICAgfQogICAgICAgICAgXSwKICAgICAgICAgICJNYXNrZWRQYXRocyI6IFsKICAgICAgICAgICAgIi9wcm9jL2FjcGkiLAogICAgICAgICAgICAiL3Byb2Mva2NvcmUiLAogICAgICAgICAgICAiL3Byb2Mva2V5cyIsCiAgICAgICAgICAgICIvcHJvYy9sYXRlbmN5X3N0YXRzIiwKICAgICAgICAgICAgIi9wcm9jL3RpbWVyX2xpc3QiLAogICAgICAgICAgICAiL3Byb2MvdGltZXJfc3RhdHMiLAogICAgICAgICAgICAiL3Byb2Mvc2NoZWRfZGVidWciLAogICAgICAgICAgICAiL3Byb2Mvc2NzaSIsCiAgICAgICAgICAgICIvc3lzL2Zpcm13YXJlIgogICAgICAgICAgXSwKICAgICAgICAgICJSZWFkb25seVBhdGhzIjogWwogICAgICAgICAgICAiL3Byb2MvYXNvdW5kIiwKICAgICAgICAgICAgIi9wcm9jL2J1cyIsCiAgICAgICAgICAgICIvcHJvYy9mcyIsCiAgICAgICAgICAgICIvcHJvYy9pcnEiLAogICAgICAgICAgICAiL3Byb2Mvc3lzIiwKICAgICAgICAgICAgIi9wcm9jL3N5c3JxLXRyaWdnZXIiCiAgICAgICAgICBdLAogICAgICAgICAgIkRldmljZXMiOiBbXSwKICAgICAgICAgICJTeXNjdGwiOiB7CiAgICAgICAgICAgICJuZXQuaXB2NC5pcF91bnByaXZpbGVnZWRfcG9ydF9zdGFydCI6ICIwIiwKICAgICAgICAgICAgIm5ldC5pcHY0LnBpbmdfZ3JvdXBfcmFuZ2UiOiAiMCAyMTQ3NDgzNjQ3IgogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSwKICAgICAgInN0b3JhZ2VzIjogWwogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2gwKSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjApIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2gxKSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjEpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2gyKSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjIpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2gzKSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjMpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2g0KSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjQpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2g1KSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjUpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2g2KSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjYpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2g3KSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjcpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2g4KSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjgpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAib3ZlcmxheWZzIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJmdXNlMy5rYXRhLW92ZXJsYXkiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIwNDM2ZDkzOTkzNGEyOWIzZDU5NzkzNTM0ZmY5M2UxOTlmOTQzOGY5Yjk0MWUxM2FlNjMyMTVmMTY3YzQ5M2I4OmJmMWM3ZjFmOWY3Zjk5NWFhOTZiMGMwZWI1NDM5MmRiNGVjNzc5M2VlYjUzMmI0MzgyYjUzZjcwMDQ0NDYzNWY6MTI3NjI2MmI5MTA0ZjE4NjcwNDEwY2NhZTUzYmEzMmMzZDIxOTVlYjExN2NlZGFmYjY3ZjI1OWI4OWNkNGQ3YTpjZjU0MzIxZjA5Y2U0OTc5M2IxM2YwYTFiOWYyNWM4NjkzZDQ0NjZkNGMxODUxZGYyNmU1YzdlZjI4MmUxODU2OmE3MDRmYjAwNmU5NjdhZjk4MTExMmY0NjE4NmJmNmIzZGMzZGZjOWYxZWQ2MjYxNGVlOWZkYzgxMTMwNTc0ZGU6NmE3MGQ3YWRkZTRiZjM1N2U0NzM0ZDRmYWQ4ODE2MDkyMDBmYTNlYmIyNzkyZjJiYWMwZTNiY2E4MzFiNGMyMjplMjI0ZTUzZmNjYWRhN2M5NjI3MTRiMzhmYzZiNDNlZWM1NTY0ZWQzNTAxYjUzMTg4NDEyZGVjNTVjYTllNGMxOmVlZjY1M2Y5NWNhMzI2NTJiODdlNjc2YzBhMzdjMGYyMDRlNTgxNDVkODY2YjRjNjhiZTBlZjNkZDM2YjQyMTE6ZGE1OTgwYTdlMzQzNDQwOWRhMTIzMjQxN2ExZDFjYzAyOTY3YjYyYTA5OTUwMmNhY2QxM2NjMmUzNDIwNmZhNCIsCiAgICAgICAgICAgICIxMWViYzUzZGZjZjAwOGRkYWNmNDVlZTY2MzlkYjU4ZGY0NjZlZDc5NzVlMDEwYjQ3YTIxNjIyZDY3MDQ4ZjYwOjgzNTIyYTM4OGZkZjdhMjBlNWMwNTViM2Q4ZGE3YTc3MjZmYjA0YjcxNmI3YzUyMjhiZTM5OWU3ODIyMDQ0Yjk6NmM3ZWEwZjZjNDgxMTdlZjBiNWEyNWQwOGU3MDMzMTk0NjY1NTk0YWFhZDE4MmM1ZDcyMjY3ODhlNzc5YmYwODo1NjhkOTExMWI1NzlhOWViNjYxZWQ3OTc4ZWNiNDliMDM1MWY4ZmI3Yzk4NzEyOTBiZTRlYzNiNWY4NWEwN2E5OmMwY2RlNDA5MWUyMGJiMjY0YzU5MjhmY2NmM2UzMTU3Zjg4MGQ4NjRkZjNmYzMyMWJiOWY2YjVjMzVmOWU0ZTQ6MzU5OTJlMmNhYmE5NjJmYzBkM2NiYjIyZjIzOGJiZTUyYmUwZDU0NGIzYjNhOWViMjg3ZDZiZmQ5N2ZhN2RmMjpiMTFlYzIyOTA1OTc1OTcxMzVhOTFkZjg0ODEyODc0N2JhNzY4YWQzZmNhZjBiYjc1MGIyOTIxNmUyZTNjMmQxOmFmMzFlNjUxZWRkMWYyNWJkODM5NDM0YjZkNjA1NjJiY2JkOTA3MWVjNTE2ZjQxYzZiMmVmYjI5ZTg0MGM0M2U6MjU0YzUzMTQ4NzNjMjdhOGRlM2RiNTM0N2Y1NmViZDllYjJiZjQ2Y2M4ODEyYTQzNjExZjk4ZTM4YWMzN2JhMiIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChjcGF0aCkvJChidW5kbGUtaWQpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9CiAgICAgIF0sCiAgICAgICJkZXZpY2VzIjogW10sCiAgICAgICJzYW5kYm94X3BpZG5zIjogZmFsc2UsCiAgICAgICJleGVjX2NvbW1hbmRzIjogW10sCiAgICAgICJlbnZfbWFwIjogewogICAgICAgICJIT1NUTkFNRSI6ICIkKGhvc3QtbmFtZSkiLAogICAgICAgICJQQVRIIjogIi91c3IvbG9jYWwvc2JpbjovdXNyL2xvY2FsL2JpbjovdXNyL3NiaW46L3Vzci9iaW46L3NiaW46L2JpbiIKICAgICAgfQogICAgfQogIF0sCiAgImNvbW1vbiI6IHsKICAgICJjcGF0aCI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zaGFyZWQvY29udGFpbmVycyIsCiAgICAibW91bnRfc291cmNlX2NwYXRoIjogIi9ydW4va2F0YS1jb250YWluZXJzL3NoYXJlZC9jb250YWluZXJzIiwKICAgICJzZnByZWZpeCI6ICJeJChjcGF0aCkvJChidW5kbGUtaWQpLVthLXowLTldezE2fS0iLAogICAgInNwYXRoIjogIi9ydW4va2F0YS1jb250YWluZXJzL3NhbmRib3gvc3RvcmFnZSIsCiAgICAiaXB2NF9hIjogIigoWzAtOV18WzEtOV1bMC05XXwxWzAtOV17Mn18MlswLTRdWzAtOV18MjVbMC01XSlcXC4pezN9KFswLTldfFsxLTldWzAtOV18MVswLTldezJ9fDJbMC00XVswLTldfDI1WzAtNV0pIiwKICAgICJpcF9wIjogIlswLTldezEsNX0iLAogICAgInN2Y19uYW1lIjogIltBLVpfXFwuXFwtXSsiLAogICAgImRuc19sYWJlbCI6ICJbYS16QS1aMC05X1xcLlxcLV0rIiwKICAgICJzX3NvdXJjZTEiOiAiXi4uMlswLTldezN9X1swLTFdWzAtOV1fWzAtM11bMC05XV9bMC0yXVswLTldX1swLTVdWzAtOV1fWzAtNV1bMC05XVxcLlswLTldezEsMTB9JCIsCiAgICAic19zb3VyY2UyIjogIl4uLmRhdGEvIiwKICAgICJkbnNfc3ViZG9tYWluIjogIl5bYS16MC05XShbLWEtejAtOV0qW2EtejAtOV0pPyQiLAogICAgInBvZF91aWQiOiAiXlswLTlhLWZBLUZdezh9LVswLTlhLWZBLUZdezR9LVswLTlhLWZBLUZdezR9LVswLTlhLWZBLUZdezR9LVswLTlhLWZBLUZdezEyfSQiLAogICAgImRlZmF1bHRfY2FwcyI6IFsKICAgICAgIkNBUF9DSE9XTiIsCiAgICAgICJDQVBfREFDX09WRVJSSURFIiwKICAgICAgIkNBUF9GU0VUSUQiLAogICAgICAiQ0FQX0ZPV05FUiIsCiAgICAgICJDQVBfTUtOT0QiLAogICAgICAiQ0FQX05FVF9SQVciLAogICAgICAiQ0FQX1NFVEdJRCIsCiAgICAgICJDQVBfU0VUVUlEIiwKICAgICAgIkNBUF9TRVRGQ0FQIiwKICAgICAgIkNBUF9TRVRQQ0FQIiwKICAgICAgIkNBUF9ORVRfQklORF9TRVJWSUNFIiwKICAgICAgIkNBUF9TWVNfQ0hST09UIiwKICAgICAgIkNBUF9LSUxMIiwKICAgICAgIkNBUF9BVURJVF9XUklURSIKICAgIF0sCiAgICAicHJpdmlsZWdlZF9jYXBzIjogWwogICAgICAiQ0FQX0NIT1dOIiwKICAgICAgIkNBUF9EQUNfT1ZFUlJJREUiLAogICAgICAiQ0FQX0RBQ19SRUFEX1NFQVJDSCIsCiAgICAgICJDQVBfRk9XTkVSIiwKICAgICAgIkNBUF9GU0VUSUQiLAogICAgICAiQ0FQX0tJTEwiLAogICAgICAiQ0FQX1NFVEdJRCIsCiAgICAgICJDQVBfU0VUVUlEIiwKICAgICAgIkNBUF9TRVRQQ0FQIiwKICAgICAgIkNBUF9MSU5VWF9JTU1VVEFCTEUiLAogICAgICAiQ0FQX05FVF9CSU5EX1NFUlZJQ0UiLAogICAgICAiQ0FQX05FVF9CUk9BRENBU1QiLAogICAgICAiQ0FQX05FVF9BRE1JTiIsCiAgICAgICJDQVBfTkVUX1JBVyIsCiAgICAgICJDQVBfSVBDX0xPQ0siLAogICAgICAiQ0FQX0lQQ19PV05FUiIsCiAgICAgICJDQVBfU1lTX01PRFVMRSIsCiAgICAgICJDQVBfU1lTX1JBV0lPIiwKICAgICAgIkNBUF9TWVNfQ0hST09UIiwKICAgICAgIkNBUF9TWVNfUFRSQUNFIiwKICAgICAgIkNBUF9TWVNfUEFDQ1QiLAogICAgICAiQ0FQX1NZU19BRE1JTiIsCiAgICAgICJDQVBfU1lTX0JPT1QiLAogICAgICAiQ0FQX1NZU19OSUNFIiwKICAgICAgIkNBUF9TWVNfUkVTT1VSQ0UiLAogICAgICAiQ0FQX1NZU19USU1FIiwKICAgICAgIkNBUF9TWVNfVFRZX0NPTkZJRyIsCiAgICAgICJDQVBfTUtOT0QiLAogICAgICAiQ0FQX0xFQVNFIiwKICAgICAgIkNBUF9BVURJVF9XUklURSIsCiAgICAgICJDQVBfQVVESVRfQ09OVFJPTCIsCiAgICAgICJDQVBfU0VURkNBUCIsCiAgICAgICJDQVBfTUFDX09WRVJSSURFIiwKICAgICAgIkNBUF9NQUNfQURNSU4iLAogICAgICAiQ0FQX1NZU0xPRyIsCiAgICAgICJDQVBfV0FLRV9BTEFSTSIsCiAgICAgICJDQVBfQkxPQ0tfU1VTUEVORCIsCiAgICAgICJDQVBfQVVESVRfUkVBRCIsCiAgICAgICJDQVBfUEVSRk1PTiIsCiAgICAgICJDQVBfQlBGIiwKICAgICAgIkNBUF9DSEVDS1BPSU5UX1JFU1RPUkUiCiAgICBdLAogICAgInZpcnRpb19ibGtfc3RvcmFnZV9jbGFzc2VzIjogWwogICAgICAiY2MtbG9jYWwtY3NpIiwKICAgICAgImNjLW1hbmFnZWQtY3NpIiwKICAgICAgImNjLW1hbmFnZWQtcHJlbWl1bS1jc2kiCiAgICBdLAogICAgInNtYl9zdG9yYWdlX2NsYXNzZXMiOiBbCiAgICAgIHsKICAgICAgICAibmFtZSI6ICJhenVyZWZpbGUtY3NpLWthdGEtY2MiLAogICAgICAgICJtb3VudF9vcHRpb25zIjogWwogICAgICAgICAgImRpcl9tb2RlPTA3NzciLAogICAgICAgICAgImZpbGVfbW9kZT0wNzc3IiwKICAgICAgICAgICJtZnN5bWxpbmtzIiwKICAgICAgICAgICJjYWNoZT1zdHJpY3QiLAogICAgICAgICAgIm5vc2hhcmVzb2NrIiwKICAgICAgICAgICJhY3RpbWVvPTMwIiwKICAgICAgICAgICJub2JybCIKICAgICAgICBdCiAgICAgIH0KICAgIF0KICB9LAogICJzYW5kYm94IjogewogICAgInN0b3JhZ2VzIjogWwogICAgICB7CiAgICAgICAgImRyaXZlciI6ICJlcGhlbWVyYWwiLAogICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICJzb3VyY2UiOiAic2htIiwKICAgICAgICAiZnN0eXBlIjogInRtcGZzIiwKICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAibm9kZXYiLAogICAgICAgICAgIm1vZGU9MTc3NyIsCiAgICAgICAgICAic2l6ZT02NzEwODg2NCIKICAgICAgICBdLAogICAgICAgICJtb3VudF9wb2ludCI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L3NobSIsCiAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICB9CiAgICBdCiAgfSwKICAicmVxdWVzdF9kZWZhdWx0cyI6IHsKICAgICJDcmVhdGVDb250YWluZXJSZXF1ZXN0IjogewogICAgICAiYWxsb3dfZW52X3JlZ2V4IjogWwogICAgICAgICJeSE9TVE5BTUU9JChkbnNfbGFiZWwpJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9QT1JUXyQoaXBfcClfVENQPXRjcDovLyQoaXB2NF9hKTokKGlwX3ApJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9QT1JUXyQoaXBfcClfVENQX1BST1RPPXRjcCQiLAogICAgICAgICJeJChzdmNfbmFtZSlfUE9SVF8kKGlwX3ApX1RDUF9QT1JUPSQoaXBfcCkkIiwKICAgICAgICAiXiQoc3ZjX25hbWUpX1BPUlRfJChpcF9wKV9UQ1BfQUREUj0kKGlwdjRfYSkkIiwKICAgICAgICAiXiQoc3ZjX25hbWUpX1NFUlZJQ0VfSE9TVD0kKGlwdjRfYSkkIiwKICAgICAgICAiXiQoc3ZjX25hbWUpX1NFUlZJQ0VfUE9SVD0kKGlwX3ApJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9TRVJWSUNFX1BPUlRfJChkbnNfbGFiZWwpPSQoaXBfcCkkIiwKICAgICAgICAiXiQoc3ZjX25hbWUpX1BPUlQ9dGNwOi8vJChpcHY0X2EpOiQoaXBfcCkkIiwKICAgICAgICAiXkFaVVJFX0NMSUVOVF9JRD1bQS1GYS1mMC05LV0qJCIsCiAgICAgICAgIl5BWlVSRV9URU5BTlRfSUQ9W0EtRmEtZjAtOS1dKiQiLAogICAgICAgICJeQVpVUkVfRkVERVJBVEVEX1RPS0VOX0ZJTEU9L3Zhci9ydW4vc2VjcmV0cy9henVyZS90b2tlbnMvYXp1cmUtaWRlbnRpdHktdG9rZW4kIiwKICAgICAgICAiXkFaVVJFX0FVVEhPUklUWV9IT1NUPWh0dHBzOi8vbG9naW5cXC5taWNyb3NvZnRvbmxpbmVcXC5jb20vJCIsCiAgICAgICAgIl5URVJNPXh0ZXJtJCIKICAgICAgXSwKICAgICAgImFsbG93X2Vudl9yZWdleF9tYXAiOiB7CiAgICAgICAgIkNQVV9MSU1JVCI6ICJeWzAtOV0rJCIsCiAgICAgICAgIkpPQl9DT01QTEVUSU9OX0lOREVYIjogIl5bMC05XSokIiwKICAgICAgICAiTUVNT1JZX0xJTUlUIjogIl5bMC05XSskIgogICAgICB9CiAgICB9LAogICAgIkNvcHlGaWxlUmVxdWVzdCI6IFsKICAgICAgIiQoc2ZwcmVmaXgpIgogICAgXSwKICAgICJFeGVjUHJvY2Vzc1JlcXVlc3QiOiB7CiAgICAgICJhbGxvd2VkX2NvbW1hbmRzIjogW10sCiAgICAgICJyZWdleCI6IFtdCiAgICB9LAogICAgIlVwZGF0ZVJvdXRlc1JlcXVlc3QiOiB7CiAgICAgICJmb3JiaWRkZW5fZGV2aWNlX25hbWVzIjogWwogICAgICAgICJsbyIKICAgICAgXSwKICAgICAgImZvcmJpZGRlbl9zb3VyY2VfcmVnZXgiOiBbCiAgICAgICAgIl4oPzowezAsNH06KXswLDd9MHswLDN9MSQiLAogICAgICAgICJeMTI3XFwuKD86WzAtOV17MSwzfVxcLil7Mn1bMC05XXsxLDN9JCIKICAgICAgXQogICAgfSwKICAgICJVcGRhdGVJbnRlcmZhY2VSZXF1ZXN0IjogewogICAgICAiYWxsb3dfcmF3X2ZsYWdzIjogMTI4LAogICAgICAiZm9yYmlkZGVuX25hbWVzIjogWwogICAgICAgICJsbyIKICAgICAgXSwKICAgICAgImZvcmJpZGRlbl9od19hZGRycyI6IFsKICAgICAgICAiMDA6MDA6MDA6MDA6MDA6MDAiCiAgICAgIF0KICAgIH0sCiAgICAiQ2xvc2VTdGRpblJlcXVlc3QiOiBmYWxzZSwKICAgICJSZWFkU3RyZWFtUmVxdWVzdCI6IGZhbHNlLAogICAgIlVwZGF0ZUVwaGVtZXJhbE1vdW50c1JlcXVlc3QiOiBmYWxzZSwKICAgICJXcml0ZVN0cmVhbVJlcXVlc3QiOiBmYWxzZQogIH0KfQ== +spec: + containers: + - command: + - sh + image: "registry.k8s.io/e2e-test-images/agnhost:2.40" + imagePullPolicy: IfNotPresent + name: projected-secret-volume-test + resources: {} + terminationMessagePath: /dev/termination-log + terminationMessagePolicy: File + volumeMounts: + - mountPath: /etc/projected-secret-volume + name: projected-secret-volume + - mountPath: /var/run/secrets/kubernetes.io/serviceaccount + name: kube-api-access-9sn9c + readOnly: true + dnsPolicy: ClusterFirst + enableServiceLinks: true + preemptionPolicy: PreemptLowerPriority + priority: 0 + restartPolicy: Never + runtimeClassName: kata-cc + schedulerName: default-scheduler + securityContext: {} + serviceAccount: default + serviceAccountName: default + terminationGracePeriodSeconds: 30 + tolerations: + - effect: NoExecute + key: node.kubernetes.io/not-ready + operator: Exists + tolerationSeconds: 300 + - effect: NoExecute + key: node.kubernetes.io/unreachable + operator: Exists + tolerationSeconds: 300 + volumes: + - name: projected-secret-volume + projected: + defaultMode: 256 + sources: + - secret: + name: projected-secret-test-cf8fb82d-d193-47d2-9cce-189dbef9414c + - name: kube-api-access-9sn9c + projected: + defaultMode: 420 + sources: + - serviceAccountToken: + expirationSeconds: 3607 + path: token + - configMap: + items: + - key: ca.crt + path: ca.crt + name: kube-root-ca.crt + - downwardAPI: + items: + - fieldRef: + apiVersion: v1 + fieldPath: metadata.namespace + path: namespace +status: {} diff --git a/src/agent/samples/policy/yaml/webhook/webhook-pod7.yaml b/src/agent/samples/policy/yaml/webhook/webhook-pod7.yaml new file mode 100644 index 000000000000..71a876ca3479 --- /dev/null +++ b/src/agent/samples/policy/yaml/webhook/webhook-pod7.yaml @@ -0,0 +1,120 @@ +--- +apiVersion: v1 +kind: Namespace +metadata: + name: svcaccounts-8341 +--- +apiVersion: v1 +kind: Pod +metadata: + creationTimestamp: ~ + managedFields: + - apiVersion: v1 + fieldsType: FieldsV1 + fieldsV1: + "f:spec": + "f:containers": + "k:{\"name\":\"agnhost-container\"}": + ".": {} + "f:args": {} + "f:image": {} + "f:imagePullPolicy": {} + "f:name": {} + "f:resources": {} + "f:securityContext": {} + "f:terminationMessagePath": {} + "f:terminationMessagePolicy": {} + "f:volumeMounts": + ".": {} + "k:{\"mountPath\":\"/test-volume\"}": + ".": {} + "f:mountPath": {} + "f:name": {} + "f:readOnly": {} + "f:dnsPolicy": {} + "f:enableServiceLinks": {} + "f:restartPolicy": {} + "f:schedulerName": {} + "f:securityContext": {} + "f:terminationGracePeriodSeconds": {} + "f:volumes": + ".": {} + "k:{\"name\":\"test-volume\"}": + ".": {} + "f:name": {} + "f:projected": + ".": {} + "f:defaultMode": {} + "f:sources": {} + manager: e2e.test + operation: Update + time: "2023-06-20T21:07:26Z" + name: test-pod-98011b43-2060-4473-a3bd-c5622997e4a7 + namespace: svcaccounts-8341 + annotations: + io.katacontainers.config.agent.policy: IyBDb3B5cmlnaHQgKGMpIDIwMjMgTWljcm9zb2Z0IENvcnBvcmF0aW9uCiMKIyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMAojCnBhY2thZ2UgYWdlbnRfcG9saWN5CgppbXBvcnQgZnV0dXJlLmtleXdvcmRzLmluCmltcG9ydCBmdXR1cmUua2V5d29yZHMuZXZlcnkKCiMgRGVmYXVsdCB2YWx1ZXMsIHJldHVybmVkIGJ5IE9QQSB3aGVuIHJ1bGVzIGNhbm5vdCBiZSBldmFsdWF0ZWQgdG8gdHJ1ZS4KZGVmYXVsdCBBZGRBUlBOZWlnaGJvcnNSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgQWRkU3dhcFJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBDbG9zZVN0ZGluUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IENvcHlGaWxlUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IENyZWF0ZUNvbnRhaW5lclJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBDcmVhdGVTYW5kYm94UmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IERlc3Ryb3lTYW5kYm94UmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgRXhlY1Byb2Nlc3NSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgR2V0T09NRXZlbnRSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBHdWVzdERldGFpbHNSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBMaXN0SW50ZXJmYWNlc1JlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBMaXN0Um91dGVzUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IE1lbUhvdHBsdWdCeVByb2JlUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IE9ubGluZUNQVU1lbVJlcXVlc3QgOj0gdHJ1ZQpkZWZhdWx0IFBhdXNlQ29udGFpbmVyUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFJlYWRTdHJlYW1SZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgUmVtb3ZlQ29udGFpbmVyUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgUmVtb3ZlU3RhbGVWaXJ0aW9mc1NoYXJlTW91bnRzUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgUmVzZWVkUmFuZG9tRGV2UmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFJlc3VtZUNvbnRhaW5lclJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBTZXRHdWVzdERhdGVUaW1lUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFNldFBvbGljeVJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBTaWduYWxQcm9jZXNzUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgU3RhcnRDb250YWluZXJSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBTdGFydFRyYWNpbmdSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgU3RhdHNDb250YWluZXJSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBTdG9wVHJhY2luZ1JlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBUdHlXaW5SZXNpemVSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBVcGRhdGVDb250YWluZXJSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgVXBkYXRlRXBoZW1lcmFsTW91bnRzUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFVwZGF0ZUludGVyZmFjZVJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBVcGRhdGVSb3V0ZXNSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgV2FpdFByb2Nlc3NSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBXcml0ZVN0cmVhbVJlcXVlc3QgOj0gZmFsc2UKCiMgQWxsb3dSZXF1ZXN0c0ZhaWxpbmdQb2xpY3kgOj0gdHJ1ZSBjb25maWd1cmVzIHRoZSBBZ2VudCB0byAqYWxsb3cgYW55CiMgcmVxdWVzdHMgY2F1c2luZyBhIHBvbGljeSBmYWlsdXJlKi4gVGhpcyBpcyBhbiB1bnNlY3VyZSBjb25maWd1cmF0aW9uCiMgYnV0IGlzIHVzZWZ1bCBmb3IgYWxsb3dpbmcgdW5zZWN1cmUgcG9kcyB0byBzdGFydCwgdGhlbiBjb25uZWN0IHRvCiMgdGhlbSBhbmQgaW5zcGVjdCBPUEEgbG9ncyBmb3IgdGhlIHJvb3QgY2F1c2Ugb2YgYSBmYWlsdXJlLgpkZWZhdWx0IEFsbG93UmVxdWVzdHNGYWlsaW5nUG9saWN5IDo9IGZhbHNlCgojIENvbnN0YW50cwpTX05BTUVfS0VZID0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZSIKU19OQU1FU1BBQ0VfS0VZID0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZXNwYWNlIgpCVU5ETEVfSUQgPSAiW2EtejAtOV17NjR9IgoKQ3JlYXRlQ29udGFpbmVyUmVxdWVzdDo9IHJlc3AgewogICAgbm90IGlzX251bGwoaW5wdXQuZW52X21hcCkKICAgIAogICAgaV9lbnZfbWFwIDo9IGlucHV0LmVudl9tYXAKICAgIAogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBwX2Vudl9tYXAgOj0gcF9jb250YWluZXIuZW52X21hcCAgCiAgICBhbGxvd19lbnZfbWFwKHBfZW52X21hcCwgaV9lbnZfbWFwKQogICAgCiAgICBpX3Byb2Nlc3MgOj0gaW5wdXQuYmFzZS5PQ0kuUHJvY2VzcwogICAgCiAgICBwX3Byb2Nlc3MgOj0gcF9jb250YWluZXIuT0NJLlByb2Nlc3MKICAgIAogICAgYWxsb3dfYXJncyhpX3Byb2Nlc3MsIHBfcHJvY2VzcywgaV9lbnZfbWFwKQoKICAgIHJlc3AgPSBDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uKGlucHV0LmJhc2UpCiAgICBwcmludCgiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdDogdHJ1ZSIpCn0KCmFsbG93X2FyZ3MoaV9wcm9jZXNzLCBwX3Byb2Nlc3MsIGlfZW52X21hcCkgewogICAgaV9hcmdzIDo9IGlfcHJvY2Vzcy5BcmdzCiAgICBwX2FyZ3MgOj0gcF9wcm9jZXNzLkFyZ3MKICAgIHByaW50KCJhbGxvd19hcmdzOiBpX2FyZ3MgPSIsIGlfYXJncywgInBfYXJncyA9IiwgcF9hcmdzKQogICAgY291bnQoaV9hcmdzKSA9PSBjb3VudChwX2FyZ3MpCiAgICBldmVyeSBpLCBpX2FyZyBpbiBpX2FyZ3MgewogICAgICAgIHByaW50KCJhbGxvd19hcmdzOiBpX2FyZyA9IiwgaV9hcmcpCiAgICAgICAgcF9hcmdfcmVwbGFjZWQgOj0gcmVwbGFjZV9lbnZfdmFyaWFibGVzKHBfYXJnc1tpXSwgaV9lbnZfbWFwKQogICAgICAgIHByaW50KCJhbGxvd19hcmdzOiBwX2FyZ19yZXBsYWNlZCA9IiwgcF9hcmdfcmVwbGFjZWQpCiAgICAgICAgcF9hcmdfcmVwbGFjZWQyIDo9IHJlcGxhY2UocF9hcmdfcmVwbGFjZWQsICIkJCIsICIkIikKICAgICAgICBwcmludCgiYWxsb3dfYXJnczogcF9hcmdfcmVwbGFjZWQyID0iLCBwX2FyZ19yZXBsYWNlZDIpCiAgICAgICAgaV9hcmcgPT0gcF9hcmdfcmVwbGFjZWQyCiAgICB9CiAgICBwcmludCgiYWxsb3dfYXJnczogdHJ1ZSIpCn0KCmFsbG93X2FyZ3MoaV9wcm9jZXNzLCBwX3Byb2Nlc3MsIGlfZW52X21hcCkgewogICAgbm90IGlfcHJvY2Vzcy5BcmdzCiAgICBub3QgcF9wcm9jZXNzLkFyZ3MKICAgIHByaW50KCJhbGxvd19hcmdzMjogbm8gYXJncyIpCn0KCiMgdGhpcyBmdW5jdGlvbiByZXBsYWNlcyBhbGwgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyBpbiBhIHN0cmluZywgZ2l2ZW4gYSBtYXAgb2YgZW52aXJvbm1lbnQga2V5cyB0byBlbnZpcm9ubWVudCB2YWx1ZXMKIyBlZyBzdHIgPSAiZWNobyAkKENMVVNURVJfSUQpOyBlY2hvICQoTk9ERV9OQU1FKTsiCiMgZW52X21hcCA9IHsiQ0xVU1RFUl9JRCI6ICJhYmMiLCAiTk9ERV9OQU1FIiA6ICJ4eXoifQojIHJlc3VsdCA9ICJlY2hvIGFiYzsgZWNobyB4eXo7IgpyZXBsYWNlX2Vudl92YXJpYWJsZXMoc3RyLCBlbnZfbWFwKSA9IHJlc3VsdCB7CiAgICAjIG1ha2UgYW4gYXJyYXkgb2YgdGhlIGtleXMgZWcgWyJDTFVTVEVSX0lEIiwgIk5PREVfTkFNRSJdCiAgICBrZXlzIDo9IFt4IHwgc29tZSB4IGluIG9iamVjdC5rZXlzKGVudl9tYXApXQogICAgcmVzdWx0IDo9IHJlcGxhY2Vfc3RyX3JlYyhzdHIsIGVudl9tYXAsIGtleXMsIGNvdW50KGtleXMpIC0gMSkKfQoKIyBiYXNlIGNhc2UKcmVwbGFjZV9zdHJfcmVjKHN0ciwgZW52X21hcCwgYXJyX2tleXMsIGkpID0gcmVzdWx0IHsKICAgIGkgPCAwCiAgICByZXN1bHQgOj0gc3RyCn0KCiMgcmVjdXJzaXZlIHN0ZXAKcmVwbGFjZV9zdHJfcmVjKHN0ciwgZW52X21hcCwgYXJyX2tleXMsIGkpID0gcmVzdWx0IHsKICAgIGkgPj0gMAogICAga2V5IDo9IGFycl9rZXlzW2ldCiAgICBlbnZfa2V5MSA6PSBjb25jYXQoIiIsIFsiJCgiLCBrZXksICIpIl0pCiAgICAjIHJlcGxhY2UgJChWQVIpIHdpdGggdmFsdWUKICAgIG5ld19zdHIxIDo9IHJlcGxhY2Uoc3RyLCBlbnZfa2V5MSwgZW52X21hcFtrZXldKQogICAgIyByZXBsYWNlIG5leHQgZW52aXJvbm1lbnQgdmFyaWFibGUKICAgIHJlc3VsdCA9IHJlcGxhY2Vfc3RyX3JlYyhuZXdfc3RyMSwgZW52X21hcCwgYXJyX2tleXMsIGkgLSAxKQp9CgphbGxvd19lbnZfbWFwKHBfZW52X21hcCwgaV9lbnZfbWFwKSB7CiAgICBwcmludCgiYWxsb3dfZW52X21hcDogcF9lbnZfbWFwID0iLCBwX2Vudl9tYXApCiAgICBldmVyeSBlbnZfa2V5LCBlbnZfdmFsIGluIGlfZW52X21hcCB7CiAgICAgICAgcHJpbnQoImFsbG93X2VudjogZW52X2tleSA9IiwgZW52X2tleSwgImVudl92YWwgPSIsIGVudl92YWwpCiAgICAgICAgYWxsb3dfZW52X21hcF9lbnRyeShlbnZfa2V5LCBlbnZfdmFsLCBwX2Vudl9tYXApCiAgICB9CiAgICBwcmludCgiYWxsb3dfZW52X21hcDogdHJ1ZSIpCn0KCiMgQWxsb3cgZXhhY3QgbWF0Y2gKYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBpX3ZhbCA9PSBwX3ZhbAogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnk6IHRydWUiKQp9CgojIEFsbG93IHJlc291cmNlRmllbGRSZWYgdmFsdWVzIChlLmcuLCAibGltaXRzLmNwdSIpLgphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgICMgYSB2YXJpYWJsZSB3ZSBzaG91bGQgYmUgdmFsaWRhdGluZyB1c2luZyBhIHJlZ2V4IGZyb20gc2V0dGluZ3MKICAgIHBfdmFsID09ICIkKHZhbGlkYXRlLWZyb20tc2V0dGluZ3MpIgogICAgcmVnZXhfdmFsIDo9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuQ3JlYXRlQ29udGFpbmVyUmVxdWVzdC5hbGxvd19lbnZfcmVnZXhfbWFwW2tleV0KICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4X3ZhbCwgaV92YWwpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSAyOiB0cnVlIikKfQoKIyBBbGxvdyBub2RlLW5hbWUKYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChub2RlLW5hbWUpIgogICAgcmVnZXgubWF0Y2gocG9saWN5X2RhdGEuY29tbW9uLmRuc19zdWJkb21haW4gLCBpX3ZhbCkKICAgIHByaW50KCJhbGxvd19lbnZfbWFwX2VudHJ5IDM6IHRydWUiKQp9CgojIEFsbG93IGhvc3QtbmFtZQphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgIHBfdmFsID09ICIkKGhvc3QtbmFtZSkiCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24uZG5zX2xhYmVsICwgaV92YWwpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSA0OiB0cnVlIikKfQoKIyBBbGxvdyBwb2QtdWlkCmFsbG93X2Vudl9tYXBfZW50cnkoa2V5LCBpX3ZhbCwgcF9lbnZfbWFwKSB7CiAgICBwX3ZhbCA6PSBwX2Vudl9tYXBba2V5XQogICAgcF92YWwgPT0gIiQocG9kLXVpZCkiCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24ucG9kX3VpZCAsIGlfdmFsKQogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgNTogdHJ1ZSIpCn0KCiMgQWxsb3cgZmllbGRSZWYgImZpZWxkUGF0aDogc3RhdHVzLnBvZElQIiB2YWx1ZXMuCmFsbG93X2Vudl9tYXBfZW50cnkoa2V5LCBpX3ZhbCwgcF9lbnZfbWFwKSB7CiAgICBpc19pcChpX3ZhbCkKCiAgICBwX3ZhbCA6PSBwX2Vudl9tYXBba2V5XQogICAgcF92YXIgOj0gY29uY2F0KCI9IiwgW2tleSwgcF92YWxdKQogICAgYWxsb3dfcG9kX2lwX3ZhcihrZXksIHBfdmFyKQogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgNjogdHJ1ZSIpCn0KCiMgQWxsb3cgZmllbGRSZWYgImZpZWxkUGF0aDogc3RhdHVzLmhvc3RJUCIgdmFsdWVzLgphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgaXNfaXAoaV92YWwpCgogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgIHBfdmFyIDo9IGNvbmNhdCgiPSIsIFtrZXksIHBfdmFsXSkKICAgIGFsbG93X2hvc3RfaXBfdmFyKGtleSwgcF92YXIpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSA3OiB0cnVlIikKfQoKIyBNYXRjaCBpbnB1dCB3aXRoIG9uZSBvZiB0aGUgcG9saWN5IHZhcmlhYmxlcywgYWZ0ZXIgc3Vic3RpdHV0aW5nICQoc2FuZGJveC1uYW1lKS4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChzYW5kYm94LW5hbWUpIgogICAgc19uYW1lIDo9IGlucHV0LmJhc2UuT0NJLkFubm90YXRpb25zW1NfTkFNRV9LRVldCiAgICBwX3ZhcjIgOj0gcmVwbGFjZShwX3ZhbCwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHBfdmFyMiA9PSBpX3ZhbAogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgODogdHJ1ZSIpCn0KCiMgTWF0Y2ggaW5wdXQgd2l0aCBvbmUgb2YgdGhlIHBvbGljeSB2YXJpYWJsZXMsIGFmdGVyIHN1YnN0aXR1dGluZyAkKHNhbmRib3gtbmFtZXNwYWNlKS4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChzYW5kYm94LW5hbWVzcGFjZSkiCiAgICBzX25hbWVzcGFjZSA6PSBpbnB1dC5iYXNlLk9DSS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwX3ZhcjIgOj0gcmVwbGFjZShwX3ZhbCwgIiQoc2FuZGJveC1uYW1lc3BhY2UpIiwgc19uYW1lc3BhY2UpCiAgICBwX3ZhcjIgPT0gaV92YWwKICAgIHByaW50KCJhbGxvd19lbnZfbWFwX2VudHJ5IDk6IHRydWUiKQp9CgojIEFsbG93IGlucHV0IGVudiB2YXJpYWJsZXMgdGhhdCBtYXRjaCB3aXRoIGEgcmVxdWVzdF9kZWZhdWx0cyByZWdleC4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHNvbWUgcF9yZWdleDEgaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5DcmVhdGVDb250YWluZXJSZXF1ZXN0LmFsbG93X2Vudl9yZWdleAogICAgcF9yZWdleDIgOj0gcmVwbGFjZShwX3JlZ2V4MSwgIiQoaXB2NF9hKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcHY0X2EpCiAgICBwX3JlZ2V4MyA6PSByZXBsYWNlKHBfcmVnZXgyLCAiJChpcF9wKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcF9wKQogICAgcF9yZWdleDQgOj0gcmVwbGFjZShwX3JlZ2V4MywgIiQoc3ZjX25hbWUpIiwgcG9saWN5X2RhdGEuY29tbW9uLnN2Y19uYW1lKQogICAgcF9yZWdleDUgOj0gcmVwbGFjZShwX3JlZ2V4NCwgIiQoZG5zX2xhYmVsKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5kbnNfbGFiZWwpCgogICAgcmVzdWx0IDo9IGNvbmNhdCgiPSIsIFtrZXksIGlfdmFsXSkKICAgIHJlZ2V4Lm1hdGNoKHBfcmVnZXg1LCByZXN1bHQpCgogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgMTA6IHRydWUiKQp9CgpDcmVhdGVDb250YWluZXJSZXF1ZXN0Oj0gcmVzcCB7CiAgICBub3QgaW5wdXQuZW52X21hcAogICAgaV9wcm9jZXNzID0gaW5wdXQuT0NJLlByb2Nlc3MKICAgIHNfbmFtZSA9IGlucHV0Lk9DSS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBwX3Byb2Nlc3MgPSBwX2NvbnRhaW5lci5PQ0kuUHJvY2VzcwogICAgYWxsb3dfZGVwcmVjYXRlZF9hcmdzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUpCiAgICByZXNwID0gQ3JlYXRlQ29udGFpbmVyUmVxdWVzdENvbW1vbihpbnB1dCkKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0MjogdHJ1ZSIpCn0KCkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb24ocmVxKTo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgICMgQ2hlY2sgaWYgdGhlIGlucHV0IHJlcXVlc3Qgc2hvdWxkIGJlIHJlamVjdGVkIGV2ZW4gYmVmb3JlIGNoZWNraW5nIHRoZQogICAgIyBwb2xpY3lfZGF0YS5jb250YWluZXJzIGluZm9ybWF0aW9uLgogICAgYWxsb3dfY3JlYXRlX2NvbnRhaW5lcl9pbnB1dChyZXEpCgogICAgaV9vY2kgOj0gcmVxLk9DSQogICAgaV9zdG9yYWdlcyA6PSByZXEuc3RvcmFnZXMKICAgIGlfZGV2aWNlcyA6PSByZXEuZGV2aWNlcwoKICAgICMgYXJyYXkgb2YgcG9zc2libGUgc3RhdGUgb3BlcmF0aW9ucwogICAgb3BzX2J1aWxkZXIgOj0gW10KCiAgICAjIGNoZWNrIHNhbmRib3ggbmFtZQogICAgc2FuZGJveF9uYW1lID0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FX0tFWV0KICAgIGFkZF9zYW5kYm94X25hbWVfdG9fc3RhdGUgOj0gc3RhdGVfYWxsb3dzKCJzYW5kYm94X25hbWUiLCBzYW5kYm94X25hbWUpCiAgICBvcHNfYnVpbGRlcjEgOj0gY29uY2F0X29wX2lmX25vdF9udWxsKG9wc19idWlsZGVyLCBhZGRfc2FuZGJveF9uYW1lX3RvX3N0YXRlKQoKICAgICMgQ2hlY2sgaWYgYW55IGVsZW1lbnQgZnJvbSB0aGUgcG9saWN5X2RhdGEuY29udGFpbmVycyBhcnJheSBhbGxvd3MgdGhlIGlucHV0IHJlcXVlc3QuCiAgICBzb21lIHBfY29udGFpbmVyIGluIHBvbGljeV9kYXRhLmNvbnRhaW5lcnMKICAgIHByaW50KCI9PT09PT09PSBDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiB0cnlpbmcgbmV4dCBwb2xpY3kgY29udGFpbmVyIikKCiAgICBwX3BpZG5zIDo9IHBfY29udGFpbmVyLnNhbmRib3hfcGlkbnMKICAgIGlfcGlkbnMgOj0gcmVxLnNhbmRib3hfcGlkbnMKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiBwX3BpZG5zID0iLCBwX3BpZG5zLCAiaV9waWRucyA9IiwgaV9waWRucykKICAgIHBfcGlkbnMgPT0gaV9waWRucwoKICAgIHBfb2NpIDo9IHBfY29udGFpbmVyLk9DSQoKICAgICMgY2hlY2sgbmFtZXNwYWNlCiAgICBwX25hbWVzcGFjZSA6PSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBpX25hbWVzcGFjZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwcmludCAoIkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb246IHBfbmFtZXNwYWNlID0iLCBwX25hbWVzcGFjZSwgImlfbmFtZXNwYWNlID0iLCBpX25hbWVzcGFjZSkKICAgIGFkZF9uYW1lc3BhY2VfdG9fc3RhdGUgOj0gYWxsb3dfbmFtZXNwYWNlKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkKICAgIG9wc19idWlsZGVyMiA6PSBjb25jYXRfb3BfaWZfbm90X251bGwob3BzX2J1aWxkZXIxLCBhZGRfbmFtZXNwYWNlX3RvX3N0YXRlKQoKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiBwIFZlcnNpb24gPSIsIHBfb2NpLlZlcnNpb24sICJpIFZlcnNpb24gPSIsIGlfb2NpLlZlcnNpb24pCiAgICBwX29jaS5WZXJzaW9uID09IGlfb2NpLlZlcnNpb24KCiAgICBwcmludCgiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdENvbW1vbjogcCBSZWFkb25seSA9IiwgcF9vY2kuUm9vdC5SZWFkb25seSwgImkgUmVhZG9ubHkgPSIsIGlfb2NpLlJvb3QuUmVhZG9ubHkpCiAgICBwX29jaS5Sb290LlJlYWRvbmx5ID09IGlfb2NpLlJvb3QuUmVhZG9ubHkKCiAgICBhbGxvd19hbm5vKHBfb2NpLCBpX29jaSkKCiAgICBwX3N0b3JhZ2VzIDo9IHBfY29udGFpbmVyLnN0b3JhZ2VzCiAgICBhbGxvd19ieV9hbm5vKHBfb2NpLCBpX29jaSwgcF9zdG9yYWdlcywgaV9zdG9yYWdlcykKCiAgICBwX2RldmljZXMgOj0gcF9jb250YWluZXIuZGV2aWNlcwogICAgYWxsb3dfZGV2aWNlcyhwX2RldmljZXMsIGlfZGV2aWNlcykKCiAgICByZXQgOj0gYWxsb3dfbGludXgob3BzX2J1aWxkZXIyLCBwX29jaSwgaV9vY2kpCiAgICByZXQuYWxsb3dlZAoKICAgIG9wcyA6PSByZXQub3BzCgogICAgcHJpbnQoIkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb246IHRydWUiKQp9CgphbGxvd19jcmVhdGVfY29udGFpbmVyX2lucHV0KHJlcSkgewogICAgcHJpbnQoImFsbG93X2NyZWF0ZV9jb250YWluZXJfaW5wdXQ6IGlucHV0ID0iLCByZXEpCgogICAgY291bnQocmVxLnNoYXJlZF9tb3VudHMpID09IDAKICAgIGlzX251bGwocmVxLnN0cmluZ191c2VyKQoKICAgIGlfb2NpIDo9IHJlcS5PQ0kKICAgIGlzX251bGwoaV9vY2kuSG9va3MpCiAgICBpc19udWxsKGlfb2NpLlNvbGFyaXMpCiAgICBpc19udWxsKGlfb2NpLldpbmRvd3MpCgogICAgaV9saW51eCA6PSBpX29jaS5MaW51eAogICAgY291bnQoaV9saW51eC5HSURNYXBwaW5ncykgPT0gMAogICAgY291bnQoaV9saW51eC5Nb3VudExhYmVsKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlJlc291cmNlcy5EZXZpY2VzKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlJvb3Rmc1Byb3BhZ2F0aW9uKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlVJRE1hcHBpbmdzKSA9PSAwCiAgICBpc19udWxsKGlfbGludXguSW50ZWxSZHQpCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLkJsb2NrSU8pCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLk5ldHdvcmspCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLlBpZHMpCiAgICBpc19udWxsKGlfbGludXguU2VjY29tcCkKCiAgICBpX3Byb2Nlc3MgOj0gaV9vY2kuUHJvY2VzcwogICAgY291bnQoaV9wcm9jZXNzLlNlbGludXhMYWJlbCkgPT0gMAogICAgY291bnQoaV9wcm9jZXNzLlVzZXIuVXNlcm5hbWUpID09IDAKCiAgICBwcmludCgiYWxsb3dfY3JlYXRlX2NvbnRhaW5lcl9pbnB1dDogdHJ1ZSIpCn0KCmFsbG93X25hbWVzcGFjZShwX25hbWVzcGFjZSwgaV9uYW1lc3BhY2UpID0gYWRkX25hbWVzcGFjZSB7CiAgICBwX25hbWVzcGFjZSA9PSBpX25hbWVzcGFjZQogICAgYWRkX25hbWVzcGFjZSA6PSBudWxsCiAgICBwcmludCgiYWxsb3dfbmFtZXNwYWNlIDE6IGlucHV0IG5hbWVzcGFjZSBtYXRjaGVzIHBvbGljeSBkYXRhIikKfQoKYWxsb3dfbmFtZXNwYWNlKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkgPSBhZGRfbmFtZXNwYWNlIHsKICAgIHBfbmFtZXNwYWNlID09ICIiCiAgICBwcmludCgiYWxsb3dfbmFtZXNwYWNlIDI6IG5vIG5hbWVzcGFjZSBmb3VuZCBvbiBwb2xpY3kgZGF0YSIpCiAgICBhZGRfbmFtZXNwYWNlIDo9IHN0YXRlX2FsbG93cygibmFtZXNwYWNlIiwgaV9uYW1lc3BhY2UpCn0KCiMgdmFsdWUgaGFzbid0IGJlZW4gc2VlbiBiZWZvcmUsIHNhdmUgaXQgdG8gc3RhdGUKc3RhdGVfYWxsb3dzKGtleSwgdmFsdWUpID0gYWN0aW9uIHsKICBzdGF0ZSA6PSBnZXRfc3RhdGUoKQogIHByaW50KCJzdGF0ZV9hbGxvd3MgMTogc3RhdGVba2V5XSA9Iiwgc3RhdGVba2V5XSwgInZhbHVlID0iLCB2YWx1ZSkKICBub3Qgc3RhdGVba2V5XQogIHByaW50KCJzdGF0ZV9hbGxvd3MgMTogc2F2aW5nIHRvIHN0YXRlIGtleSA9Iiwga2V5LCAidmFsdWUgPSIsIHZhbHVlKQogIHBhdGggOj0gZ2V0X3N0YXRlX3BhdGgoa2V5KSAKICBhY3Rpb24gOj0gewogICAgIm9wIjogImFkZCIsCiAgICAicGF0aCI6IHBhdGgsIAogICAgInZhbHVlIjogdmFsdWUsCiAgfQp9CgojIHZhbHVlIG1hdGNoZXMgd2hhdCdzIGluIHN0YXRlLCBhbGxvdyBpdApzdGF0ZV9hbGxvd3Moa2V5LCB2YWx1ZSkgPSBhY3Rpb24gewogIHByaW50KCJzdGF0ZV9hbGxvd3MgMjogc3RhcnQiKQogIHN0YXRlIDo9IGdldF9zdGF0ZSgpCiAgcHJpbnQoInN0YXRlX2FsbG93cyAyOiBzdGF0ZVtrZXldID0iLCBzdGF0ZVtrZXldLCAidmFsdWUgPSIsIHZhbHVlKQogIHZhbHVlID09IHN0YXRlW2tleV0KICBwcmludCgic3RhdGVfYWxsb3dzIDI6IGZvdW5kIGtleSA9Iiwga2V5LCAidmFsdWUgPSIsIHZhbHVlLCAiIGluIHN0YXRlIikKICBhY3Rpb24gOj0gbnVsbAp9CgojIGhlbHBlciBmdW5jdGlvbnMgdG8gaW50ZXJhY3Qgd2l0aCB0aGUgc3RhdGUKZ2V0X3N0YXRlKCkgPSBzdGF0ZSB7CiAgc3RhdGUgOj0gZGF0YVsicHN0YXRlIl0KfQoKZ2V0X3N0YXRlX3ZhbChrZXkpID0gdmFsdWUgewogICAgc3RhdGUgOj0gZ2V0X3N0YXRlKCkKICAgIHZhbHVlIDo9IHN0YXRlW2tleV0KfQoKZ2V0X3N0YXRlX3BhdGgoa2V5KSA9IHBhdGggewogICAgIyBwcmVwZW5kICIvcHN0YXRlLyIgdG8ga2V5CiAgICBwYXRoIDo9IGNvbmNhdCgiLyIsIFsiL3BzdGF0ZSIsIGtleV0pCn0KCiMgSGVscGVyIGZ1bmN0aW9ucyB0byBjb25kaXRpb25hbGx5IGNvbmNhdGVuYXRlIG9wIGlzIG5vdCBudWxsCmNvbmNhdF9vcF9pZl9ub3RfbnVsbChvcHMsIG9wKSA9IHJlc3VsdCB7CiAgICBvcCA9PSBudWxsCiAgICByZXN1bHQgOj0gb3BzCn0KCmNvbmNhdF9vcF9pZl9ub3RfbnVsbChvcHMsIG9wKSA9IHJlc3VsdCB7CiAgICBvcCAhPSBudWxsCiAgICByZXN1bHQgOj0gYXJyYXkuY29uY2F0KG9wcywgW29wXSkKfQoKIyBSZWplY3QgdW5leHBlY3RlZCBhbm5vdGF0aW9ucy4KYWxsb3dfYW5ubyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19hbm5vIDE6IHN0YXJ0IikKCiAgICBub3QgaV9vY2kuQW5ub3RhdGlvbnMKCiAgICBwcmludCgiYWxsb3dfYW5ubyAxOiB0cnVlIikKfQphbGxvd19hbm5vKHBfb2NpLCBpX29jaSkgewogICAgcHJpbnQoImFsbG93X2Fubm8gMjogcCBBbm5vdGF0aW9ucyA9IiwgcF9vY2kuQW5ub3RhdGlvbnMpCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiBpIEFubm90YXRpb25zID0iLCBpX29jaS5Bbm5vdGF0aW9ucykKCiAgICBpX2tleXMgOj0gb2JqZWN0LmtleXMoaV9vY2kuQW5ub3RhdGlvbnMpCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiBpIGtleXMgPSIsIGlfa2V5cykKCiAgICBldmVyeSBpX2tleSBpbiBpX2tleXMgewogICAgICAgIGFsbG93X2Fubm9fa2V5KGlfa2V5LCBwX29jaSkKICAgIH0KCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiB0cnVlIikKfQoKYWxsb3dfYW5ub19rZXkoaV9rZXksIHBfb2NpKSB7CiAgICBwcmludCgiYWxsb3dfYW5ub19rZXkgMTogaSBrZXkgPSIsIGlfa2V5KQoKICAgIHN0YXJ0c3dpdGgoaV9rZXksICJpby5rdWJlcm5ldGVzLmNyaS4iKQoKICAgIHByaW50KCJhbGxvd19hbm5vX2tleSAxOiB0cnVlIikKfQphbGxvd19hbm5vX2tleShpX2tleSwgcF9vY2kpIHsKICAgIHByaW50KCJhbGxvd19hbm5vX2tleSAyOiBpIGtleSA9IiwgaV9rZXkpCgogICAgc29tZSBwX2tleSwgXyBpbiBwX29jaS5Bbm5vdGF0aW9ucwogICAgcF9rZXkgPT0gaV9rZXkKCiAgICBwcmludCgiYWxsb3dfYW5ub19rZXkgMjogdHJ1ZSIpCn0KCiMgR2V0IHRoZSB2YWx1ZSBvZiB0aGUgU19OQU1FX0tFWSBhbm5vdGF0aW9uIGFuZAojIGNvcnJlbGF0ZSBpdCB3aXRoIG90aGVyIGFubm90YXRpb25zIGFuZCBwcm9jZXNzIGZpZWxkcy4KYWxsb3dfYnlfYW5ubyhwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpIHsKICAgIHByaW50KCJhbGxvd19ieV9hbm5vIDE6IHN0YXJ0IikKCiAgICBub3QgcF9vY2kuQW5ub3RhdGlvbnNbU19OQU1FX0tFWV0KCiAgICBpX3NfbmFtZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMTogaV9zX25hbWUgPSIsIGlfc19uYW1lKQoKICAgIGlfc19uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FU1BBQ0VfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMTogaV9zX25hbWVzcGFjZSA9IiwgaV9zX25hbWVzcGFjZSkKCiAgICBhbGxvd19ieV9zYW5kYm94X25hbWUocF9vY2ksIGlfb2NpLCBwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBpX3NfbmFtZSwgaV9zX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfYnlfYW5ubyAxOiB0cnVlIikKfQphbGxvd19ieV9hbm5vKHBfb2NpLCBpX29jaSwgcF9zdG9yYWdlcywgaV9zdG9yYWdlcykgewogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMjogc3RhcnQiKQoKICAgIHBfc19uYW1lIDo9IHBfb2NpLkFubm90YXRpb25zW1NfTkFNRV9LRVldCiAgICBpX3NfbmFtZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMjogaV9zX25hbWUgPSIsIGlfc19uYW1lLCAicF9zX25hbWUgPSIsIHBfc19uYW1lKQoKICAgIGFsbG93X3NhbmRib3hfbmFtZShwX3NfbmFtZSwgaV9zX25hbWUpCgogICAgaV9zX25hbWVzcGFjZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwcmludCgiYWxsb3dfYnlfYW5ubyAyOiBpX3NfbmFtZXNwYWNlID0iLCBpX3NfbmFtZXNwYWNlKQoKICAgIGFsbG93X2J5X3NhbmRib3hfbmFtZShwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMsIGlfc19uYW1lLCBpX3NfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd19ieV9hbm5vIDI6IHRydWUiKQp9CgphbGxvd19ieV9zYW5kYm94X25hbWUocF9vY2ksIGlfb2NpLCBwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfYnlfc2FuZGJveF9uYW1lOiBzdGFydCIpCgogICAgaV9uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FU1BBQ0VfS0VZXQoKICAgIGFsbG93X2J5X2NvbnRhaW5lcl90eXBlcyhwX29jaSwgaV9vY2ksIHNfbmFtZSwgaV9uYW1lc3BhY2UpCiAgICBhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZChwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpCiAgICBhbGxvd19wcm9jZXNzKHBfb2NpLlByb2Nlc3MsIGlfb2NpLlByb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpCgogICAgcHJpbnQoImFsbG93X2J5X3NhbmRib3hfbmFtZTogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfbmFtZShwX3NfbmFtZSwgaV9zX25hbWUpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X25hbWU6IHN0YXJ0IikKICAgIHJlZ2V4Lm1hdGNoKHBfc19uYW1lLCBpX3NfbmFtZSkKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9uYW1lOiB0cnVlIikKfQoKIyBDaGVjayB0aGF0IHRoZSAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLXR5cGUiIGFuZAojICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIiBhbm5vdGF0aW9ucyBkZXNpZ25hdGUgdGhlCiMgZXhwZWN0ZWQgdHlwZSAtIGVpdGhlciBhICJzYW5kYm94IiBvciBhICJjb250YWluZXIiLiBUaGVuLCB2YWxpZGF0ZQojIG90aGVyIGFubm90YXRpb25zIGJhc2VkIG9uIHRoZSBhY3R1YWwgInNhbmRib3giIG9yICJjb250YWluZXIiIHZhbHVlCiMgZnJvbSB0aGUgaW5wdXQgY29udGFpbmVyLgphbGxvd19ieV9jb250YWluZXJfdHlwZXMocF9vY2ksIGlfb2NpLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfYnlfY29udGFpbmVyX3R5cGVzOiBjaGVja2luZyBpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSIpCgogICAgY190eXBlIDo9ICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSIKICAgIAogICAgcF9jcmlfdHlwZSA6PSBwX29jaS5Bbm5vdGF0aW9uc1tjX3R5cGVdCiAgICBpX2NyaV90eXBlIDo9IGlfb2NpLkFubm90YXRpb25zW2NfdHlwZV0KICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZXM6IHBfY3JpX3R5cGUgPSIsIHBfY3JpX3R5cGUsICJpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgcF9jcmlfdHlwZSA9PSBpX2NyaV90eXBlCgogICAgYWxsb3dfYnlfY29udGFpbmVyX3R5cGUoaV9jcmlfdHlwZSwgcF9vY2ksIGlfb2NpLCBzX25hbWUsIHNfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZXM6IHRydWUiKQp9CgphbGxvd19ieV9jb250YWluZXJfdHlwZShpX2NyaV90eXBlLCBwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAxOiBpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgaV9jcmlfdHlwZSA9PSAic2FuZGJveCIKCiAgICBpX2thdGFfdHlwZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1siaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5jb250YWluZXJfdHlwZSJdCiAgICBwcmludCgiYWxsb3dfYnlfY29udGFpbmVyX3R5cGUgMTogaV9rYXRhX3R5cGUgPSIsIGlfa2F0YV90eXBlKQogICAgaV9rYXRhX3R5cGUgPT0gInBvZF9zYW5kYm94IgoKICAgIGFsbG93X3NhbmRib3hfY29udGFpbmVyX25hbWUocF9vY2ksIGlfb2NpKQogICAgYWxsb3dfc2FuZGJveF9uZXRfbmFtZXNwYWNlKHBfb2NpLCBpX29jaSkKICAgIGFsbG93X3NhbmRib3hfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpCgogICAgcHJpbnQoImFsbG93X2J5X2NvbnRhaW5lcl90eXBlIDE6IHRydWUiKQp9CgphbGxvd19ieV9jb250YWluZXJfdHlwZShpX2NyaV90eXBlLCBwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiBpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgaV9jcmlfdHlwZSA9PSAiY29udGFpbmVyIgoKICAgIGlfa2F0YV90eXBlIDo9IGlfb2NpLkFubm90YXRpb25zWyJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIl0KICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiBpX2thdGFfdHlwZSA9IiwgaV9rYXRhX3R5cGUpCiAgICBpX2thdGFfdHlwZSA9PSAicG9kX2NvbnRhaW5lciIKCiAgICBhbGxvd19jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpCiAgICBhbGxvd19uZXRfbmFtZXNwYWNlKHBfb2NpLCBpX29jaSkKICAgIGFsbG93X2xvZ19kaXJlY3RvcnkocF9vY2ksIGlfb2NpKQoKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiB0cnVlIikKfQoKIyAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLW5hbWUiIGFubm90YXRpb24KYWxsb3dfc2FuZGJveF9jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X2NvbnRhaW5lcl9uYW1lOiBzdGFydCIpCgogICAgY29udGFpbmVyX2Fubm90YXRpb25fbWlzc2luZyhwX29jaSwgaV9vY2ksICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItbmFtZSIpCgogICAgcHJpbnQoImFsbG93X3NhbmRib3hfY29udGFpbmVyX25hbWU6IHRydWUiKQp9CgphbGxvd19jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19jb250YWluZXJfbmFtZTogc3RhcnQiKQoKICAgIGFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uKHBfb2NpLCBpX29jaSwgImlvLmt1YmVybmV0ZXMuY3JpLmNvbnRhaW5lci1uYW1lIikKCiAgICBwcmludCgiYWxsb3dfY29udGFpbmVyX25hbWU6IHRydWUiKQp9Cgpjb250YWluZXJfYW5ub3RhdGlvbl9taXNzaW5nKHBfb2NpLCBpX29jaSwga2V5KSB7CiAgICBwcmludCgiY29udGFpbmVyX2Fubm90YXRpb25fbWlzc2luZzoiLCBrZXkpCgogICAgbm90IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIG5vdCBpX29jaS5Bbm5vdGF0aW9uc1trZXldCgogICAgcHJpbnQoImNvbnRhaW5lcl9hbm5vdGF0aW9uX21pc3Npbmc6IHRydWUiKQp9CgphbGxvd19jb250YWluZXJfYW5ub3RhdGlvbihwX29jaSwgaV9vY2ksIGtleSkgewogICAgcHJpbnQoImFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uOiBrZXkgPSIsIGtleSkKCiAgICBwX3ZhbHVlIDo9IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIGlfdmFsdWUgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgcHJpbnQoImFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uOiBwX3ZhbHVlID0iLCBwX3ZhbHVlLCAiaV92YWx1ZSA9IiwgaV92YWx1ZSkKCiAgICBwX3ZhbHVlID09IGlfdmFsdWUKCiAgICBwcmludCgiYWxsb3dfY29udGFpbmVyX2Fubm90YXRpb246IHRydWUiKQp9CgojICJuZXJkY3RsL25ldHdvcmstbmFtZXNwYWNlIiBhbm5vdGF0aW9uCmFsbG93X3NhbmRib3hfbmV0X25hbWVzcGFjZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X25ldF9uYW1lc3BhY2U6IHN0YXJ0IikKCiAgICBrZXkgOj0gIm5lcmRjdGwvbmV0d29yay1uYW1lc3BhY2UiCgogICAgcF9uYW1lc3BhY2UgOj0gcF9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgaV9uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgcHJpbnQoImFsbG93X3NhbmRib3hfbmV0X25hbWVzcGFjZTogcF9uYW1lc3BhY2UgPSIsIHBfbmFtZXNwYWNlLCAiaV9uYW1lc3BhY2UgPSIsIGlfbmFtZXNwYWNlKQoKICAgIHJlZ2V4Lm1hdGNoKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9uZXRfbmFtZXNwYWNlOiB0cnVlIikKfQoKYWxsb3dfbmV0X25hbWVzcGFjZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19uZXRfbmFtZXNwYWNlOiBzdGFydCIpCgogICAga2V5IDo9ICJuZXJkY3RsL25ldHdvcmstbmFtZXNwYWNlIgoKICAgIG5vdCBwX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICBub3QgaV9vY2kuQW5ub3RhdGlvbnNba2V5XQoKICAgIHByaW50KCJhbGxvd19uZXRfbmFtZXNwYWNlOiB0cnVlIikKfQoKIyAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1sb2ctZGlyZWN0b3J5IiBhbm5vdGF0aW9uCmFsbG93X3NhbmRib3hfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X2xvZ19kaXJlY3Rvcnk6IHN0YXJ0IikKCiAgICBrZXkgOj0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbG9nLWRpcmVjdG9yeSIKCiAgICBwX2RpciA6PSBwX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICByZWdleDEgOj0gcmVwbGFjZShwX2RpciwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHJlZ2V4MiA6PSByZXBsYWNlKHJlZ2V4MSwgIiQoc2FuZGJveC1uYW1lc3BhY2UpIiwgc19uYW1lc3BhY2UpCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiByZWdleDIgPSIsIHJlZ2V4MikKCiAgICBpX2RpciA6PSBpX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiBpX2RpciA9IiwgaV9kaXIpCgogICAgcmVnZXgubWF0Y2gocmVnZXgyLCBpX2RpcikKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiB0cnVlIikKfQoKYWxsb3dfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19sb2dfZGlyZWN0b3J5OiBzdGFydCIpCgogICAga2V5IDo9ICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWxvZy1kaXJlY3RvcnkiCgogICAgbm90IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIG5vdCBpX29jaS5Bbm5vdGF0aW9uc1trZXldCgogICAgcHJpbnQoImFsbG93X2xvZ19kaXJlY3Rvcnk6IHRydWUiKQp9CgphbGxvd19kZXZpY2VzKHBfZGV2aWNlcywgaV9kZXZpY2VzKSB7CiAgICBwcmludCgiYWxsb3dfZGV2aWNlczogc3RhcnQiKQogICAgZXZlcnkgaV9kZXZpY2UgaW4gaV9kZXZpY2VzIHsKICAgICAgICBwcmludCgiYWxsb3dfZGV2aWNlczogaV9kZXZpY2UgPSIsIGlfZGV2aWNlKQogICAgICAgIHNvbWUgcF9kZXZpY2UgaW4gcF9kZXZpY2VzCiAgICAgICAgcF9kZXZpY2UuY29udGFpbmVyX3BhdGggPT0gaV9kZXZpY2UuY29udGFpbmVyX3BhdGgKICAgIH0KICAgIHByaW50KCJhbGxvd19kZXZpY2VzOiB0cnVlIikKfQoKYWxsb3dfbGludXgoc3RhdGVfb3BzLCBwX29jaSwgaV9vY2kpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIHBfbmFtZXNwYWNlcyA6PSBwX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbGludXg6IHAgbmFtZXNwYWNlcyA9IiwgcF9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlcyA6PSBpX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbGludXg6IGkgbmFtZXNwYWNlcyA9IiwgaV9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlX3dpdGhvdXRfbmV0d29yayA6PSBbb2JqIHwgb2JqIDo9IGlfbmFtZXNwYWNlc1tfXTsgb2JqLlR5cGUgIT0gIm5ldHdvcmsiXQoKICAgIHByaW50KCJhbGxvd19saW51eDogaV9uYW1lc3BhY2Vfd2l0aG91dF9uZXR3b3JrID0iLCBpX25hbWVzcGFjZV93aXRob3V0X25ldHdvcmspCgogICAgcF9uYW1lc3BhY2VzID09IGlfbmFtZXNwYWNlX3dpdGhvdXRfbmV0d29yawoKICAgIGFsbG93X21hc2tlZF9wYXRocyhwX29jaSwgaV9vY2kpCiAgICBhbGxvd19yZWFkb25seV9wYXRocyhwX29jaSwgaV9vY2kpCiAgICBhbGxvd19saW51eF9kZXZpY2VzKHBfb2NpLkxpbnV4LkRldmljZXMsIGlfb2NpLkxpbnV4LkRldmljZXMpCiAgICBhbGxvd19saW51eF9zeXNjdGwocF9vY2kuTGludXgsIGlfb2NpLkxpbnV4KQogICAgcmV0IDo9IGFsbG93X25ldHdvcmtfbmFtZXNwYWNlX3N0YXJ0KHN0YXRlX29wcywgcF9vY2ksIGlfb2NpKQogICAgcmV0LmFsbG93ZWQKCiAgICBvcHMgOj0gcmV0Lm9wcwoKICAgIHByaW50KCJhbGxvd19saW51eDogdHJ1ZSIpCn0KCiMgUmV0cmlldmUgdGhlICJuZXR3b3JrIiBuYW1lc3BhY2UgZnJvbSB0aGUgaW5wdXQgZGF0YSBhbmQgcGFzcyBpdCBvbiBmb3IgdGhlCiMgbmV0d29yayBuYW1lc3BhY2UgcG9saWN5IGNoZWNrcy4KYWxsb3dfbmV0d29ya19uYW1lc3BhY2Vfc3RhcnQoc3RhdGVfb3BzLCBwX29jaSwgaV9vY2kpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIHByaW50KCJhbGxvd19uZXR3b3JrX25hbWVzcGFjZSBzdGFydDogc3RhcnQiKQoKICAgIHBfbmFtZXNwYWNlcyA6PSBwX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IHAgbmFtZXNwYWNlcyA9IiwgcF9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlcyA6PSBpX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IGkgbmFtZXNwYWNlcyA9IiwgaV9uYW1lc3BhY2VzKQoKICAgICMgUmV0dXJuIHBhdGggb2YgdGhlICJuZXR3b3JrIiBuYW1lc3BhY2UKICAgIG5ldHdvcmtfbnMgOj0gW29iaiB8IG9iaiA6PSBpX25hbWVzcGFjZXNbX107IG9iai5UeXBlID09ICJuZXR3b3JrIl0KCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IG5ldHdvcmtfbnMgPSIsIG5ldHdvcmtfbnMpCgogICAgcmV0IDo9IGFsbG93X25ldHdvcmtfbmFtZXNwYWNlKHN0YXRlX29wcywgbmV0d29ya19ucykKICAgIHJldC5hbGxvd2VkCgogICAgb3BzIDo9IHJldC5vcHMKfQoKIyBUaGlzIHJ1bGUgaXMgd2hlbiB0aGVyZSdzIG5vIG5ldHdvcmsgbmFtZXNwYWNlIGluIHRoZSBpbnB1dCBkYXRhLgphbGxvd19uZXR3b3JrX25hbWVzcGFjZShzdGF0ZV9vcHMsIG5ldHdvcmtfbnMpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIGNvdW50KG5ldHdvcmtfbnMpID09IDAKCiAgICBuZXR3b3JrX25zX3BhdGggPSAiIgoKICAgIGFkZF9uZXR3b3JrX25hbWVzcGFjZV90b19zdGF0ZSA6PSBzdGF0ZV9hbGxvd3MoIm5ldHdvcmtfbmFtZXNwYWNlIiwgbmV0d29ya19uc19wYXRoKQogICAgb3BzIDo9IGNvbmNhdF9vcF9pZl9ub3RfbnVsbChzdGF0ZV9vcHMsIGFkZF9uZXR3b3JrX25hbWVzcGFjZV90b19zdGF0ZSkKCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2UgMTogdHJ1ZSIpCn0KCiMgVGhpcyBydWxlIGlzIHdoZW4gdGhlcmUncyBleGFjdGx5IG9uZSBuZXR3b3JrIG5hbWVzcGFjZSBpbiB0aGUgaW5wdXQgZGF0YS4KYWxsb3dfbmV0d29ya19uYW1lc3BhY2Uoc3RhdGVfb3BzLCBuZXR3b3JrX25zKSA6PSB7Im9wcyI6IG9wcywgImFsbG93ZWQiOiB0cnVlfSB7CiAgICBjb3VudChuZXR3b3JrX25zKSA9PSAxCgogICAgYWRkX25ldHdvcmtfbmFtZXNwYWNlX3RvX3N0YXRlIDo9IHN0YXRlX2FsbG93cygibmV0d29ya19uYW1lc3BhY2UiLCBuZXR3b3JrX25zWzBdLlBhdGgpCiAgICBvcHMgOj0gY29uY2F0X29wX2lmX25vdF9udWxsKHN0YXRlX29wcywgYWRkX25ldHdvcmtfbmFtZXNwYWNlX3RvX3N0YXRlKQoKICAgIHByaW50KCJhbGxvd19uZXR3b3JrX25hbWVzcGFjZSAyOiB0cnVlIikKfQoKYWxsb3dfbWFza2VkX3BhdGhzKHBfb2NpLCBpX29jaSkgewogICAgcF9wYXRocyA6PSBwX29jaS5MaW51eC5NYXNrZWRQYXRocwogICAgcHJpbnQoImFsbG93X21hc2tlZF9wYXRocyAxOiBwX3BhdGhzID0iLCBwX3BhdGhzKQoKICAgIGlfcGF0aHMgOj0gaV9vY2kuTGludXguTWFza2VkUGF0aHMKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aHMgMTogaV9wYXRocyA9IiwgaV9wYXRocykKCiAgICBhbGxvd19tYXNrZWRfcGF0aHNfYXJyYXkocF9wYXRocywgaV9wYXRocykKCiAgICBwcmludCgiYWxsb3dfbWFza2VkX3BhdGhzIDE6IHRydWUiKQp9CmFsbG93X21hc2tlZF9wYXRocyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aHMgMjogc3RhcnQiKQoKICAgIG5vdCBwX29jaS5MaW51eC5NYXNrZWRQYXRocwogICAgbm90IGlfb2NpLkxpbnV4Lk1hc2tlZFBhdGhzCgogICAgcHJpbnQoImFsbG93X21hc2tlZF9wYXRocyAyOiB0cnVlIikKfQoKIyBBbGwgdGhlIHBvbGljeSBtYXNrZWQgcGF0aHMgbXVzdCBiZSBtYXNrZWQgaW4gdGhlIGlucHV0IGRhdGEgdG9vLgojIElucHV0IGlzIGFsbG93ZWQgdG8gaGF2ZSBtb3JlIG1hc2tlZCBwYXRocyB0aGFuIHRoZSBwb2xpY3kuCmFsbG93X21hc2tlZF9wYXRoc19hcnJheShwX2FycmF5LCBpX2FycmF5KSB7CiAgICBldmVyeSBwX2VsZW0gaW4gcF9hcnJheSB7CiAgICAgICAgYWxsb3dfbWFza2VkX3BhdGgocF9lbGVtLCBpX2FycmF5KQogICAgfQp9CgphbGxvd19tYXNrZWRfcGF0aChwX2VsZW0sIGlfYXJyYXkpIHsKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aDogcF9lbGVtID0iLCBwX2VsZW0pCgogICAgc29tZSBpX2VsZW0gaW4gaV9hcnJheQogICAgcF9lbGVtID09IGlfZWxlbQoKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aDogdHJ1ZSIpCn0KCmFsbG93X3JlYWRvbmx5X3BhdGhzKHBfb2NpLCBpX29jaSkgewogICAgcF9wYXRocyA6PSBwX29jaS5MaW51eC5SZWFkb25seVBhdGhzCiAgICBwcmludCgiYWxsb3dfcmVhZG9ubHlfcGF0aHMgMTogcF9wYXRocyA9IiwgcF9wYXRocykKCiAgICBpX3BhdGhzIDo9IGlfb2NpLkxpbnV4LlJlYWRvbmx5UGF0aHMKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAxOiBpX3BhdGhzID0iLCBpX3BhdGhzKQoKICAgIGFsbG93X3JlYWRvbmx5X3BhdGhzX2FycmF5KHBfcGF0aHMsIGlfcGF0aHMsIGlfb2NpLkxpbnV4Lk1hc2tlZFBhdGhzKQoKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAxOiB0cnVlIikKfQphbGxvd19yZWFkb25seV9wYXRocyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAyOiBzdGFydCIpCgogICAgbm90IHBfb2NpLkxpbnV4LlJlYWRvbmx5UGF0aHMKICAgIG5vdCBpX29jaS5MaW51eC5SZWFkb25seVBhdGhzCgogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGhzIDI6IHRydWUiKQp9CgojIEFsbCB0aGUgcG9saWN5IHJlYWRvbmx5IHBhdGhzIG11c3QgYmUgZWl0aGVyOgojIC0gUHJlc2VudCBpbiB0aGUgaW5wdXQgcmVhZG9ubHkgcGF0aHMsIG9yCiMgLSBQcmVzZW50IGluIHRoZSBpbnB1dCBtYXNrZWQgcGF0aHMuCiMgSW5wdXQgaXMgYWxsb3dlZCB0byBoYXZlIG1vcmUgcmVhZG9ubHkgcGF0aHMgdGhhbiB0aGUgcG9saWN5LgphbGxvd19yZWFkb25seV9wYXRoc19hcnJheShwX2FycmF5LCBpX2FycmF5LCBtYXNrZWRfcGF0aHMpIHsKICAgIGV2ZXJ5IHBfZWxlbSBpbiBwX2FycmF5IHsKICAgICAgICBhbGxvd19yZWFkb25seV9wYXRoKHBfZWxlbSwgaV9hcnJheSwgbWFza2VkX3BhdGhzKQogICAgfQp9CgphbGxvd19yZWFkb25seV9wYXRoKHBfZWxlbSwgaV9hcnJheSwgbWFza2VkX3BhdGhzKSB7CiAgICBwcmludCgiYWxsb3dfcmVhZG9ubHlfcGF0aCAxOiBwX2VsZW0gPSIsIHBfZWxlbSkKCiAgICBzb21lIGlfZWxlbSBpbiBpX2FycmF5CiAgICBwX2VsZW0gPT0gaV9lbGVtCgogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGggMTogdHJ1ZSIpCn0KYWxsb3dfcmVhZG9ubHlfcGF0aChwX2VsZW0sIGlfYXJyYXksIG1hc2tlZF9wYXRocykgewogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGggMjogcF9lbGVtID0iLCBwX2VsZW0pCgogICAgc29tZSBpX21hc2tlZCBpbiBtYXNrZWRfcGF0aHMKICAgIHBfZWxlbSA9PSBpX21hc2tlZAoKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRoIDI6IHRydWUiKQp9CgphbGxvd19saW51eF9kZXZpY2VzKHBfZGV2aWNlcywgaV9kZXZpY2VzKSB7CiAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogc3RhcnQiKQogICAgZXZlcnkgaV9kZXZpY2UgaW4gaV9kZXZpY2VzIHsKICAgICAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogaV9kZXZpY2UgPSIsIGlfZGV2aWNlKQogICAgICAgIHNvbWUgcF9kZXZpY2UgaW4gcF9kZXZpY2VzCiAgICAgICAgaV9kZXZpY2UuUGF0aCA9PSBwX2RldmljZS5QYXRoCiAgICB9CiAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogdHJ1ZSIpCn0KCmFsbG93X2xpbnV4X3N5c2N0bChwX2xpbnV4LCBpX2xpbnV4KSB7CiAgICBwcmludCgiYWxsb3dfbGludXhfc3lzY3RsIDE6IHN0YXJ0IikKICAgIG5vdCBpX2xpbnV4LlN5c2N0bAogICAgcHJpbnQoImFsbG93X2xpbnV4X3N5c2N0bCAxOiB0cnVlIikKfQoKYWxsb3dfbGludXhfc3lzY3RsKHBfbGludXgsIGlfbGludXgpIHsKICAgIHByaW50KCJhbGxvd19saW51eF9zeXNjdGwgMjogc3RhcnQiKQogICAgcF9zeXNjdGwgOj0gcF9saW51eC5TeXNjdGwKICAgIGlfc3lzY3RsIDo9IGlfbGludXguU3lzY3RsCiAgICBldmVyeSBpX25hbWUsIGlfdmFsIGluIGlfc3lzY3RsIHsKICAgICAgICBwcmludCgiYWxsb3dfbGludXhfc3lzY3RsIDI6IGlfbmFtZSA9IiwgaV9uYW1lLCAiaV92YWwgPSIsIGlfdmFsKQogICAgICAgIHBfc3lzY3RsW2lfbmFtZV0gPT0gaV92YWwKICAgIH0KICAgIHByaW50KCJhbGxvd19saW51eF9zeXNjdGwgMjogdHJ1ZSIpCn0KCiMgQ2hlY2sgdGhlIGNvbnNpc3RlbmN5IG9mIHRoZSBpbnB1dCAiaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5idW5kbGVfcGF0aCIKIyBhbmQgaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCIgdmFsdWVzIHdpdGggb3RoZXIgZmllbGRzLgphbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZChwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpIHsKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogc3RhcnQiKQoKICAgIGJ1bmRsZV9wYXRoIDo9IGlfb2NpLkFubm90YXRpb25zWyJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmJ1bmRsZV9wYXRoIl0KICAgIGJ1bmRsZV9pZCA6PSByZXBsYWNlKGJ1bmRsZV9wYXRoLCAiL3J1bi9jb250YWluZXJkL2lvLmNvbnRhaW5lcmQucnVudGltZS52Mi50YXNrL2s4cy5pby8iLCAiIikKCiAgICBidW5kbGVfaWRfZm9ybWF0IDo9IGNvbmNhdCgiIiwgWyJeIiwgQlVORExFX0lELCAiJCJdKQogICAgcmVnZXgubWF0Y2goYnVuZGxlX2lkX2Zvcm1hdCwgYnVuZGxlX2lkKQoKICAgIGtleSA6PSAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCIKCiAgICBwX3JlZ2V4IDo9IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIHNhbmRib3hfaWQgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQoKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogc2FuZGJveF9pZCA9Iiwgc2FuZGJveF9pZCwgInJlZ2V4ID0iLCBwX3JlZ2V4KQogICAgcmVnZXgubWF0Y2gocF9yZWdleCwgc2FuZGJveF9pZCkKCiAgICBhbGxvd19yb290X3BhdGgocF9vY2ksIGlfb2NpLCBidW5kbGVfaWQpCgogICAgZXZlcnkgaV9tb3VudCBpbiBpX29jaS5Nb3VudHMgewogICAgICAgIGFsbG93X21vdW50KHBfb2NpLCBpX21vdW50LCBpX3N0b3JhZ2VzLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpCiAgICB9CgogICAgYWxsb3dfc3RvcmFnZXMocF9zdG9yYWdlcywgaV9zdG9yYWdlcywgYnVuZGxlX2lkLCBzYW5kYm94X2lkKQoKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogdHJ1ZSIpCn0KCmFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHBfcHJvY2VzcyA9IiwgcF9wcm9jZXNzKQogICAgcHJpbnQoImFsbG93X3Byb2Nlc3NfY29tbW9uOiBpX3Byb2Nlc3MgPSAiLCBpX3Byb2Nlc3MpCiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHNfbmFtZSA9Iiwgc19uYW1lKQoKICAgIHBfcHJvY2Vzcy5Dd2QgPT0gaV9wcm9jZXNzLkN3ZAogICAgcF9wcm9jZXNzLk5vTmV3UHJpdmlsZWdlcyA9PSBpX3Byb2Nlc3MuTm9OZXdQcml2aWxlZ2VzCgogICAgYWxsb3dfdXNlcihwX3Byb2Nlc3MsIGlfcHJvY2VzcykKICAgIGFsbG93X2VudihwX3Byb2Nlc3MsIGlfcHJvY2Vzcywgc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHRydWUiKQp9CgojIENvbXBhcmUgdGhlIE9DSSBQcm9jZXNzIGZpZWxkIG9mIGEgcG9saWN5IGNvbnRhaW5lciB3aXRoIHRoZSBpbnB1dCBPQ0kgUHJvY2VzcyBmcm9tIGEgQ3JlYXRlQ29udGFpbmVyUmVxdWVzdAphbGxvd19wcm9jZXNzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfcHJvY2Vzczogc3RhcnQiKQoKICAgIGFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgYWxsb3dfY2FwcyhwX3Byb2Nlc3MuQ2FwYWJpbGl0aWVzLCBpX3Byb2Nlc3MuQ2FwYWJpbGl0aWVzKQogICAgcF9wcm9jZXNzLlRlcm1pbmFsID09IGlfcHJvY2Vzcy5UZXJtaW5hbAoKICAgIHByaW50KCJhbGxvd19wcm9jZXNzOiB0cnVlIikKfQoKIyBDb21wYXJlIHRoZSBPQ0kgUHJvY2VzcyBmaWVsZCBvZiBhIHBvbGljeSBjb250YWluZXIgd2l0aCB0aGUgaW5wdXQgcHJvY2VzcyBmaWVsZCBmcm9tIEV4ZWNQcm9jZXNzUmVxdWVzdAphbGxvd19pbnRlcmFjdGl2ZV9wcm9jZXNzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfaW50ZXJhY3RpdmVfcHJvY2Vzczogc3RhcnQiKQoKICAgIGFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgYWxsb3dfZXhlY19jYXBzKGlfcHJvY2Vzcy5DYXBhYmlsaXRpZXMpCgogICAgIyBUaGVzZSBhcmUgY29tbWFuZHMgZW5hYmxlZCB1c2luZyBFeGVjUHJvY2Vzc1JlcXVlc3QgY29tbWFuZHMgYW5kL29yIHJlZ2V4IGZyb20gdGhlIHNldHRpbmdzIGZpbGUuCiAgICAjIFRoZXkgY2FuIGJlIGV4ZWN1dGVkIGludGVyYWN0aXZlbHkgc28gYWxsb3cgdGhlbSB0byB1c2UgYW55IHZhbHVlIGZvciBpX3Byb2Nlc3MuVGVybWluYWwuCgogICAgcHJpbnQoImFsbG93X2ludGVyYWN0aXZlX3Byb2Nlc3M6IHRydWUiKQp9CgojIENvbXBhcmUgdGhlIE9DSSBQcm9jZXNzIGZpZWxkIG9mIGEgcG9saWN5IGNvbnRhaW5lciB3aXRoIHRoZSBpbnB1dCBwcm9jZXNzIGZpZWxkIGZyb20gRXhlY1Byb2Nlc3NSZXF1ZXN0CmFsbG93X3Byb2JlX3Byb2Nlc3MocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19wcm9iZV9wcm9jZXNzOiBzdGFydCIpCgogICAgYWxsb3dfcHJvY2Vzc19jb21tb24ocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpCiAgICBhbGxvd19leGVjX2NhcHMoaV9wcm9jZXNzLkNhcGFiaWxpdGllcykKICAgIHBfcHJvY2Vzcy5UZXJtaW5hbCA9PSBpX3Byb2Nlc3MuVGVybWluYWwKCiAgICBwcmludCgiYWxsb3dfcHJvYmVfcHJvY2VzczogdHJ1ZSIpCn0KCmFsbG93X3VzZXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MpIHsKICAgIHBfdXNlciA6PSBwX3Byb2Nlc3MuVXNlcgogICAgaV91c2VyIDo9IGlfcHJvY2Vzcy5Vc2VyCgogICAgcHJpbnQoImFsbG93X3VzZXI6IGlucHV0IHVpZCA9IiwgaV91c2VyLlVJRCwgInBvbGljeSB1aWQgPSIsIHBfdXNlci5VSUQpCiAgICBwX3VzZXIuVUlEID09IGlfdXNlci5VSUQKCiAgICAjIFRPRE86IHRyYWNrIGRvd24gdGhlIHJlYXNvbiBmb3IgcmVnaXN0cnkuazhzLmlvL3BhdXNlOjMuOSBiZWluZwogICAgIyAgICAgICBleGVjdXRlZCB3aXRoIGdpZCA9IDAgZGVzcGl0ZSBoYXZpbmcgIjY1NTM1OjY1NTM1IiBpbiBpdHMgY29udGFpbmVyIGltYWdlCiAgICAjICAgICAgIGNvbmZpZy4KICAgICNwcmludCgiYWxsb3dfdXNlcjogaW5wdXQgZ2lkID0iLCBpX3VzZXIuR0lELCAicG9saWN5IGdpZCA9IiwgcF91c2VyLkdJRCkKICAgICNwX3VzZXIuR0lEID09IGlfdXNlci5HSUQKCiAgICAjIFRPRE86IGNvbXBhcmUgdGhlIGFkZGl0aW9uYWxHaWRzIGZpZWxkIHRvbyBhZnRlciBjb21wdXRpbmcgaXRzIHZhbHVlCiAgICAjIGJhc2VkIG9uIC9ldGMvcGFzc3dkIGFuZCAvZXRjL2dyb3VwIGZyb20gdGhlIGNvbnRhaW5lciBpbWFnZS4KfQoKYWxsb3dfZGVwcmVjYXRlZF9hcmdzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZ3MgMTogbm8gYXJncyIpCgogICAgbm90IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJncwogICAgbm90IGlfcHJvY2Vzcy5BcmdzCgogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAxOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZ3MocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSkgewogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiBwb2xpY3kgYXJncyA9IiwgcF9wcm9jZXNzLkRlcHJlY2F0ZWRBcmdzKQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiBpbnB1dCBhcmdzID0iLCBpX3Byb2Nlc3MuQXJncykKCiAgICBjb3VudChwX3Byb2Nlc3MuRGVwcmVjYXRlZEFyZ3MpID09IGNvdW50KGlfcHJvY2Vzcy5BcmdzKQoKICAgIGV2ZXJ5IGksIGlfYXJnIGluIGlfcHJvY2Vzcy5BcmdzIHsKICAgICAgICBhbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpCiAgICB9CgogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDE6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgcF9hcmcyIDo9IHJlcGxhY2UocF9hcmcsICIkJCIsICIkIikKICAgIHBfYXJnMiA9PSBpX2FyZwoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAxOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDI6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgIyBUT0RPOiBjYW4gJChub2RlLW5hbWUpIGJlIGhhbmRsZWQgYmV0dGVyPwogICAgY29udGFpbnMocF9hcmcsICIkKG5vZGUtbmFtZSkiKQoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAyOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDM6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgcF9hcmcyIDo9IHJlcGxhY2UocF9hcmcsICIkJCIsICIkIikKICAgIHBfYXJnMyA6PSByZXBsYWNlKHBfYXJnMiwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAzOiBwX2FyZzMgPSIsIHBfYXJnMykKICAgIHBfYXJnMyA9PSBpX2FyZwoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAzOiB0cnVlIikKfQoKIyBPQ0kgcHJvY2Vzcy5FbnYgZmllbGQKYWxsb3dfZW52KHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfZW52OiBwIGVudiA9IiwgcF9wcm9jZXNzLkVudikKICAgIHByaW50KCJhbGxvd19lbnY6IGkgZW52ID0iLCBpX3Byb2Nlc3MuRW52KQoKICAgIGV2ZXJ5IGlfdmFyIGluIGlfcHJvY2Vzcy5FbnYgewogICAgICAgIHByaW50KCJhbGxvd19lbnY6IGlfdmFyID0iLCBpX3ZhcikKICAgICAgICBhbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgfQoKICAgIHByaW50KCJhbGxvd19lbnY6IHRydWUiKQp9CgojIEFsbG93IGlucHV0IGVudiB2YXJpYWJsZXMgdGhhdCBhcmUgcHJlc2VudCBpbiB0aGUgcG9saWN5IGRhdGEgdG9vLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHBfdmFyID09IGlfdmFyCiAgICBwcmludCgiYWxsb3dfdmFyIDE6IHRydWUiKQp9CgojIE1hdGNoIGlucHV0IHdpdGggb25lIG9mIHRoZSBwb2xpY3kgdmFyaWFibGVzLCBhZnRlciBzdWJzdGl0dXRpbmcgJChzYW5kYm94LW5hbWUpLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHByaW50KCJhbGxvd192YXIgMjogcF92YXIgPSIsIHBfdmFyKQoKICAgIHBfdmFyX3NwbGl0IDo9IHNwbGl0KHBfdmFyLCAiPSIpCiAgICBjb3VudChwX3Zhcl9zcGxpdCkgPT0gMgoKICAgIHBfdmFyX3NwbGl0WzFdID09ICIkKHNhbmRib3gtbmFtZSkiCgogICAgaV92YXJfc3BsaXQgOj0gc3BsaXQoaV92YXIsICI9IikKICAgIGNvdW50KGlfdmFyX3NwbGl0KSA9PSAyCgogICAgaV92YXJfc3BsaXRbMF0gPT0gcF92YXJfc3BsaXRbMF0KICAgIHJlZ2V4Lm1hdGNoKHNfbmFtZSwgaV92YXJfc3BsaXRbMV0pCgogICAgcHJpbnQoImFsbG93X3ZhciAyOiB0cnVlIikKfQoKIyBBbGxvdyBpbnB1dCBlbnYgdmFyaWFibGVzIHRoYXQgbWF0Y2ggd2l0aCBhIHJlcXVlc3RfZGVmYXVsdHMgcmVnZXguCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHNvbWUgcF9yZWdleDEgaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5DcmVhdGVDb250YWluZXJSZXF1ZXN0LmFsbG93X2Vudl9yZWdleAogICAgcF9yZWdleDIgOj0gcmVwbGFjZShwX3JlZ2V4MSwgIiQoaXB2NF9hKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcHY0X2EpCiAgICBwX3JlZ2V4MyA6PSByZXBsYWNlKHBfcmVnZXgyLCAiJChpcF9wKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcF9wKQogICAgcF9yZWdleDQgOj0gcmVwbGFjZShwX3JlZ2V4MywgIiQoc3ZjX25hbWUpIiwgcG9saWN5X2RhdGEuY29tbW9uLnN2Y19uYW1lKQogICAgcF9yZWdleDUgOj0gcmVwbGFjZShwX3JlZ2V4NCwgIiQoZG5zX2xhYmVsKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5kbnNfbGFiZWwpCgogICAgcHJpbnQoImFsbG93X3ZhciAzOiBwX3JlZ2V4NSA9IiwgcF9yZWdleDUpCiAgICByZWdleC5tYXRjaChwX3JlZ2V4NSwgaV92YXIpCgogICAgcHJpbnQoImFsbG93X3ZhciAzOiB0cnVlIikKfQoKIyBBbGxvdyBmaWVsZFJlZiAiZmllbGRQYXRoOiBzdGF0dXMucG9kSVAiIHZhbHVlcy4KYWxsb3dfdmFyKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBpX3Zhciwgc19uYW1lLCBzX25hbWVzcGFjZSkgewogICAgbmFtZV92YWx1ZSA6PSBzcGxpdChpX3ZhciwgIj0iKQogICAgY291bnQobmFtZV92YWx1ZSkgPT0gMgogICAgaXNfaXAobmFtZV92YWx1ZVsxXSkKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIGFsbG93X3BvZF9pcF92YXIobmFtZV92YWx1ZVswXSwgcF92YXIpCgogICAgcHJpbnQoImFsbG93X3ZhciA0OiB0cnVlIikKfQoKIyBBbGxvdyBjb21tb24gZmllbGRSZWYgdmFyaWFibGVzLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBuYW1lX3ZhbHVlIDo9IHNwbGl0KGlfdmFyLCAiPSIpCiAgICBjb3VudChuYW1lX3ZhbHVlKSA9PSAyCgogICAgc29tZSBwX3ZhciBpbiBwX3Byb2Nlc3MuRW52CiAgICBwX25hbWVfdmFsdWUgOj0gc3BsaXQocF92YXIsICI9IikKICAgIGNvdW50KHBfbmFtZV92YWx1ZSkgPT0gMgoKICAgIHBfbmFtZV92YWx1ZVswXSA9PSBuYW1lX3ZhbHVlWzBdCgogICAgIyBUT0RPOiBzaG91bGQgdGhlc2UgYmUgaGFuZGxlZCBpbiBhIGRpZmZlcmVudCB3YXk/CiAgICBhbHdheXNfYWxsb3dlZCA6PSBbIiQoaG9zdC1uYW1lKSIsICIkKG5vZGUtbmFtZSkiLCAiJChwb2QtdWlkKSJdCiAgICBzb21lIGFsbG93ZWQgaW4gYWx3YXlzX2FsbG93ZWQKICAgIGNvbnRhaW5zKHBfbmFtZV92YWx1ZVsxXSwgYWxsb3dlZCkKCiAgICBwcmludCgiYWxsb3dfdmFyIDU6IHRydWUiKQp9CgojIEFsbG93IGZpZWxkUmVmICJmaWVsZFBhdGg6IHN0YXR1cy5ob3N0SVAiIHZhbHVlcy4KYWxsb3dfdmFyKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBpX3Zhciwgc19uYW1lLCBzX25hbWVzcGFjZSkgewogICAgbmFtZV92YWx1ZSA6PSBzcGxpdChpX3ZhciwgIj0iKQogICAgY291bnQobmFtZV92YWx1ZSkgPT0gMgogICAgaXNfaXAobmFtZV92YWx1ZVsxXSkKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIGFsbG93X2hvc3RfaXBfdmFyKG5hbWVfdmFsdWVbMF0sIHBfdmFyKQoKICAgIHByaW50KCJhbGxvd192YXIgNjogdHJ1ZSIpCn0KCiMgQWxsb3cgcmVzb3VyY2VGaWVsZFJlZiB2YWx1ZXMgKGUuZy4sICJsaW1pdHMuY3B1IikuCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIG5hbWVfdmFsdWUgOj0gc3BsaXQoaV92YXIsICI9IikKICAgIGNvdW50KG5hbWVfdmFsdWUpID09IDIKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHBfbmFtZV92YWx1ZSA6PSBzcGxpdChwX3ZhciwgIj0iKQogICAgY291bnQocF9uYW1lX3ZhbHVlKSA9PSAyCgogICAgcF9uYW1lX3ZhbHVlWzBdID09IG5hbWVfdmFsdWVbMF0KCiAgICAjIGEgdmFyaWFibGUgd2Ugc2hvdWxkIGJlIHZhbGlkYXRpbmcgdXNpbmcgYSByZWdleCBmcm9tIHNldHRpbmdzCiAgICBwX25hbWVfdmFsdWVbMV0gPT0gIiQodmFsaWRhdGUtZnJvbS1zZXR0aW5ncykiCgogICAgcmVnZXhfdmFsIDo9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuQ3JlYXRlQ29udGFpbmVyUmVxdWVzdC5hbGxvd19lbnZfcmVnZXhfbWFwW25hbWVfdmFsdWVbMF1dCgogICAgcHJpbnQoImFsbG93X3ZhciA3OiB2YWwgPSIsIG5hbWVfdmFsdWVbMV0pCiAgICBwcmludCgiYWxsb3dfdmFyIDc6IHJlZ2V4X3ZhbCA9IiwgcmVnZXhfdmFsKQoKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4X3ZhbCwgbmFtZV92YWx1ZVsxXSkKCiAgICBwcmludCgiYWxsb3dfdmFyIDc6IHRydWUiKQp9CgojIE1hdGNoIGlucHV0IHdpdGggb25lIG9mIHRoZSBwb2xpY3kgdmFyaWFibGVzLCBhZnRlciBzdWJzdGl0dXRpbmcgJChzYW5kYm94LW5hbWVzcGFjZSkuCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHNvbWUgcF92YXIgaW4gcF9wcm9jZXNzLkVudgogICAgcF92YXIyIDo9IHJlcGxhY2UocF92YXIsICIkKHNhbmRib3gtbmFtZXNwYWNlKSIsIHNfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd192YXIgODogcF92YXIyID0iLCBwX3ZhcjIpCiAgICBwX3ZhcjIgPT0gaV92YXIKCiAgICBwcmludCgiYWxsb3dfdmFyIDg6IHRydWUiKQp9CgphbGxvd19wb2RfaXBfdmFyKHZhcl9uYW1lLCBwX3ZhcikgewogICAgcHJpbnQoImFsbG93X3BvZF9pcF92YXI6IHZhcl9uYW1lID0iLCB2YXJfbmFtZSwgInBfdmFyID0iLCBwX3ZhcikKCiAgICBwX25hbWVfdmFsdWUgOj0gc3BsaXQocF92YXIsICI9IikKICAgIGNvdW50KHBfbmFtZV92YWx1ZSkgPT0gMgoKICAgIHBfbmFtZV92YWx1ZVswXSA9PSB2YXJfbmFtZQogICAgcF9uYW1lX3ZhbHVlWzFdID09ICIkKHBvZC1pcCkiCgogICAgcHJpbnQoImFsbG93X3BvZF9pcF92YXI6IHRydWUiKQp9CgphbGxvd19ob3N0X2lwX3Zhcih2YXJfbmFtZSwgcF92YXIpIHsKICAgIHByaW50KCJhbGxvd19ob3N0X2lwX3ZhcjogdmFyX25hbWUgPSIsIHZhcl9uYW1lLCAicF92YXIgPSIsIHBfdmFyKQoKICAgIHBfbmFtZV92YWx1ZSA6PSBzcGxpdChwX3ZhciwgIj0iKQogICAgY291bnQocF9uYW1lX3ZhbHVlKSA9PSAyCgogICAgcF9uYW1lX3ZhbHVlWzBdID09IHZhcl9uYW1lCiAgICBwX25hbWVfdmFsdWVbMV0gPT0gIiQoaG9zdC1pcCkiCgogICAgcHJpbnQoImFsbG93X2hvc3RfaXBfdmFyOiB0cnVlIikKfQoKaXNfaXAodmFsdWUpIHsKICAgIGJ5dGVzID0gc3BsaXQodmFsdWUsICIuIikKICAgIGNvdW50KGJ5dGVzKSA9PSA0CgogICAgaXNfaXBfZmlyc3RfYnl0ZShieXRlc1swXSkKICAgIGlzX2lwX290aGVyX2J5dGUoYnl0ZXNbMV0pCiAgICBpc19pcF9vdGhlcl9ieXRlKGJ5dGVzWzJdKQogICAgaXNfaXBfb3RoZXJfYnl0ZShieXRlc1szXSkKfQppc19pcF9maXJzdF9ieXRlKGNvbXBvbmVudCkgewogICAgbnVtYmVyID0gdG9fbnVtYmVyKGNvbXBvbmVudCkKICAgIG51bWJlciA+PSAxCiAgICBudW1iZXIgPD0gMjU1Cn0KaXNfaXBfb3RoZXJfYnl0ZShjb21wb25lbnQpIHsKICAgIG51bWJlciA9IHRvX251bWJlcihjb21wb25lbnQpCiAgICBudW1iZXIgPj0gMAogICAgbnVtYmVyIDw9IDI1NQp9CgojIE9DSSByb290LlBhdGgKYWxsb3dfcm9vdF9wYXRoKHBfb2NpLCBpX29jaSwgYnVuZGxlX2lkKSB7CiAgICBpX3BhdGggOj0gaV9vY2kuUm9vdC5QYXRoCiAgICBwX3BhdGgxIDo9IHBfb2NpLlJvb3QuUGF0aAogICAgcHJpbnQoImFsbG93X3Jvb3RfcGF0aDogaV9wYXRoID0iLCBpX3BhdGgsICJwX3BhdGgxID0iLCBwX3BhdGgxKQoKICAgIHBfcGF0aDIgOj0gcmVwbGFjZShwX3BhdGgxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfcm9vdF9wYXRoOiBwX3BhdGgyID0iLCBwX3BhdGgyKQoKICAgIHBfcGF0aDMgOj0gcmVwbGFjZShwX3BhdGgyLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X3Jvb3RfcGF0aDogcF9wYXRoMyA9IiwgcF9wYXRoMykKCiAgICBwX3BhdGgzID09IGlfcGF0aAoKICAgIHByaW50KCJhbGxvd19yb290X3BhdGg6IHRydWUiKQp9CgojIGRldmljZSBtb3VudHMKYWxsb3dfbW91bnQocF9vY2ksIGlfbW91bnQsIGlfc3RvcmFnZXMsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcHJpbnQoImFsbG93X21vdW50OiBpX21vdW50ID0iLCBpX21vdW50KQoKICAgIHNvbWUgcF9tb3VudCBpbiBwX29jaS5Nb3VudHMKICAgIHNvbWUgaV9zdG9yYWdlIGluIGlfc3RvcmFnZXMKCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IHBfbW91bnQgPSIsIHBfbW91bnQpCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IGlfc3RvcmFnZSA9IiwgaV9zdG9yYWdlKQoKICAgIGNoZWNrX21vdW50KHBfbW91bnQsIGlfbW91bnQsIGlfc3RvcmFnZSwgYnVuZGxlX2lkLCBzYW5kYm94X2lkKQoKICAgICMgVE9ETzogYXJlIHRoZXJlIGFueSBvdGhlciByZXF1aXJlZCBwb2xpY3kgY2hlY2tzIGZvciBtb3VudHMgLSBlLmcuLAogICAgIyAgICAgICBtdWx0aXBsZSBtb3VudHMgd2l0aCBzYW1lIHNvdXJjZSBvciBkZXN0aW5hdGlvbj8KCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IHRydWUiKQp9CgpjaGVja19tb3VudChwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcF9tb3VudCA9PSBpX21vdW50CiAgICBwcmludCgiY2hlY2tfbW91bnQgMTogdHJ1ZSIpCn0KY2hlY2tfbW91bnQocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHBfbW91bnQuZGVzdGluYXRpb24gPT0gaV9tb3VudC5kZXN0aW5hdGlvbgogICAgcF9tb3VudC50eXBlXyA9PSBpX21vdW50LnR5cGVfCiAgICBwX21vdW50Lm9wdGlvbnMgPT0gaV9tb3VudC5vcHRpb25zCgogICAgbW91bnRfc291cmNlX2FsbG93cyhwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkKCiAgICBwcmludCgiY2hlY2tfbW91bnQgMjogdHJ1ZSIpCn0KCm1vdW50X3NvdXJjZV9hbGxvd3MocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHJlZ2V4MSA6PSBwX21vdW50LnNvdXJjZQogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5tb3VudF9zb3VyY2VfY3BhdGgpCiAgICByZWdleDQgOj0gcmVwbGFjZShyZWdleDMsICIkKGJ1bmRsZS1pZCkiLCBidW5kbGVfaWQpCgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMTogcmVnZXg0ID0iLCByZWdleDQpCiAgICByZWdleC5tYXRjaChyZWdleDQsIGlfbW91bnQuc291cmNlKQoKICAgIHByaW50KCJtb3VudF9zb3VyY2VfYWxsb3dzIDE6IHRydWUiKQp9Cm1vdW50X3NvdXJjZV9hbGxvd3MocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHJlZ2V4MSA6PSBwX21vdW50LnNvdXJjZQogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5tb3VudF9zb3VyY2VfY3BhdGgpCiAgICByZWdleDQgOj0gcmVwbGFjZShyZWdleDMsICIkKHNhbmRib3gtaWQpIiwgc2FuZGJveF9pZCkKCiAgICBwcmludCgibW91bnRfc291cmNlX2FsbG93cyAyOiByZWdleDQgPSIsIHJlZ2V4NCkKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4NCwgaV9tb3VudC5zb3VyY2UpCgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMjogdHJ1ZSIpCn0KbW91bnRfc291cmNlX2FsbG93cyhwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogaV9tb3VudC5zb3VyY2UgPSIsIGlfbW91bnQuc291cmNlKQogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogaV9zdG9yYWdlLm1vdW50X3BvaW50ID0iLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCgogICAgaV9tb3VudC5zb3VyY2UgPT0gaV9zdG9yYWdlLm1vdW50X3BvaW50CgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogdHJ1ZSIpCn0KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBDcmVhdGUgY29udGFpbmVyIFN0b3JhZ2VzCgphbGxvd19zdG9yYWdlcyhwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHBfY291bnQgOj0gY291bnQocF9zdG9yYWdlcykKICAgIGlfY291bnQgOj0gY291bnQoaV9zdG9yYWdlcykKICAgIHByaW50KCJhbGxvd19zdG9yYWdlczogcF9jb3VudCA9IiwgcF9jb3VudCwgImlfY291bnQgPSIsIGlfY291bnQpCgogICAgcF9jb3VudCA9PSBpX2NvdW50CgogICAgIyBHZXQgdGhlIGNvbnRhaW5lciBpbWFnZSBsYXllciBJRHMgYW5kIHZlcml0eSByb290IGhhc2hlcywgZnJvbSB0aGUgIm92ZXJsYXlmcyIgc3RvcmFnZS4KICAgIHNvbWUgb3ZlcmxheV9zdG9yYWdlIGluIHBfc3RvcmFnZXMKICAgIG92ZXJsYXlfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIHByaW50KCJhbGxvd19zdG9yYWdlczogb3ZlcmxheV9zdG9yYWdlID0iLCBvdmVybGF5X3N0b3JhZ2UpCiAgICBjb3VudChvdmVybGF5X3N0b3JhZ2Uub3B0aW9ucykgPT0gMgoKICAgIGxheWVyX2lkcyA6PSBzcGxpdChvdmVybGF5X3N0b3JhZ2Uub3B0aW9uc1swXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiBsYXllcl9pZHMgPSIsIGxheWVyX2lkcykKCiAgICByb290X2hhc2hlcyA6PSBzcGxpdChvdmVybGF5X3N0b3JhZ2Uub3B0aW9uc1sxXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiByb290X2hhc2hlcyA9Iiwgcm9vdF9oYXNoZXMpCgogICAgZXZlcnkgaV9zdG9yYWdlIGluIGlfc3RvcmFnZXMgewogICAgICAgIGFsbG93X3N0b3JhZ2UocF9zdG9yYWdlcywgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpCiAgICB9CgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiB0cnVlIikKfQoKYWxsb3dfc3RvcmFnZShwX3N0b3JhZ2VzLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgc29tZSBwX3N0b3JhZ2UgaW4gcF9zdG9yYWdlcwoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiBwX3N0b3JhZ2UgPSIsIHBfc3RvcmFnZSkKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiBpX3N0b3JhZ2UgPSIsIGlfc3RvcmFnZSkKCiAgICBwX3N0b3JhZ2UuZHJpdmVyICAgICAgICAgICA9PSBpX3N0b3JhZ2UuZHJpdmVyCiAgICBwX3N0b3JhZ2UuZHJpdmVyX29wdGlvbnMgICA9PSBpX3N0b3JhZ2UuZHJpdmVyX29wdGlvbnMKICAgIHBfc3RvcmFnZS5mc19ncm91cCAgICAgICAgID09IGlfc3RvcmFnZS5mc19ncm91cAogICAgcF9zdG9yYWdlLmZzdHlwZSAgICAgICAgICAgPT0gaV9zdG9yYWdlLmZzdHlwZQoKICAgIGFsbG93X3N0b3JhZ2Vfc291cmNlKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKQogICAgYWxsb3dfc3RvcmFnZV9vcHRpb25zKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKQogICAgYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKQoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiB0cnVlIikKfQoKYWxsb3dfc3RvcmFnZV9zb3VyY2UocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX3NvdXJjZSAxOiBzdGFydCIpCgogICAgcF9zdG9yYWdlLnNvdXJjZSA9PSBpX3N0b3JhZ2Uuc291cmNlCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDE6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX3NvdXJjZShwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDI6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCgogICAgIyBEREREOkJCOkRELkY6IERvbWFpbjpCdXM6RGV2aWNlLkZ1bmN0aW9uCiAgICAjIGh0dHBzOi8vd3d3Lmtlcm5lbC5vcmcvZG9jL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtYnVzLXBjaQogICAgcmVnZXgubWF0Y2goYF5bYS1mMC05XXs0fTpbYS1mMC05XXsyfTpbYS1mMC05XXsyfVwuW2EtZjAtOV0kYCwgaV9zdG9yYWdlLnNvdXJjZSkKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9zb3VyY2UgMjogdHJ1ZSIpCn0KCmFsbG93X3N0b3JhZ2Vfc291cmNlKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKSB7CiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9zb3VyY2UgMzogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIGlfc3RvcmFnZS5zb3VyY2UgPT0gIm5vbmUiCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDM6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX3NvdXJjZShwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDQ6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJzbWIiCgogICAgIyBQYXR0ZXJuOiAvLzxzdG9yYWdlLWFjY291bnQtbmFtZT4uZmlsZS5jb3JlLndpbmRvd3MubmV0LzxrOHMtUFZDLW5hbWU+CiAgICAjIFN0b3JhZ2UgYWNjb3VudCBuYW1lOiBodHRwczovL2xlYXJuLm1pY3Jvc29mdC5jb20vZW4tdXMvYXp1cmUvc3RvcmFnZS9jb21tb24vc3RvcmFnZS1hY2NvdW50LW92ZXJ2aWV3I3N0b3JhZ2UtYWNjb3VudC1uYW1lCiAgICAjIEs4cyBQVkMgbmFtZTogaHR0cHM6Ly9rdWJlcm5ldGVzLmlvL2RvY3MvY29uY2VwdHMvb3ZlcnZpZXcvd29ya2luZy13aXRoLW9iamVjdHMvbmFtZXMvI2Rucy1zdWJkb21haW4tbmFtZXMKICAgIHJlZ2V4Lm1hdGNoKGBeXC9cLyhbYS16MC05XXszLDI0fSlcLmZpbGVcLmNvcmVcLndpbmRvd3NcLm5ldFwvW2EtejAtOV0oW2EtejAtOS4tXXswLDI1MX1bYS16MC05XSk/JGAsIGlfc3RvcmFnZS5zb3VyY2UpCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDQ6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMTogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgIT0gIm92ZXJsYXlmcyIKICAgIHBfc3RvcmFnZS5vcHRpb25zID09IGlfc3RvcmFnZS5vcHRpb25zCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAxOiB0cnVlIikKfQphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIGNvdW50KHBfc3RvcmFnZS5vcHRpb25zKSA9PSAyCgogICAgcG9saWN5X2lkcyA6PSBzcGxpdChwX3N0b3JhZ2Uub3B0aW9uc1swXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBwb2xpY3lfaWRzID0iLCBwb2xpY3lfaWRzKQogICAgcG9saWN5X2lkcyA9PSBsYXllcl9pZHMKCiAgICBwb2xpY3lfaGFzaGVzIDo9IHNwbGl0KHBfc3RvcmFnZS5vcHRpb25zWzFdLCAiOiIpCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IHBvbGljeV9oYXNoZXMgPSIsIHBvbGljeV9oYXNoZXMpCgogICAgcF9jb3VudCA6PSBjb3VudChwb2xpY3lfaWRzKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBwX2NvdW50ID0iLCBwX2NvdW50KQogICAgcF9jb3VudCA+PSAxCiAgICBwX2NvdW50ID09IGNvdW50KHBvbGljeV9oYXNoZXMpCgogICAgaV9jb3VudCA6PSBjb3VudChpX3N0b3JhZ2Uub3B0aW9ucykKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogaV9jb3VudCA9IiwgaV9jb3VudCkKICAgIGlfY291bnQgPT0gcF9jb3VudCArIDMKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zWzBdID0iLCBpX3N0b3JhZ2Uub3B0aW9uc1swXSkKICAgIGlfc3RvcmFnZS5vcHRpb25zWzBdID09ICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQubGF5ZXItc3JjLXByZWZpeD0vdmFyL2xpYi9jb250YWluZXJkL2lvLmNvbnRhaW5lcmQuc25hcHNob3R0ZXIudjEudGFyZGV2L2xheWVycyIKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zW2lfY291bnQgLSAyXSA9IiwgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDJdKQogICAgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDJdID09ICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQub3ZlcmxheS1ydyIKCiAgICBsb3dlcmRpciA6PSBjb25jYXQoIj0iLCBbImxvd2VyZGlyIiwgcF9zdG9yYWdlLm9wdGlvbnNbMF1dKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBsb3dlcmRpciA9IiwgbG93ZXJkaXIpCgogICAgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDFdID09IGxvd2VyZGlyCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zW2lfY291bnQgLSAxXSA9IiwgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDFdKQoKICAgIGV2ZXJ5IGksIHBvbGljeV9pZCBpbiBwb2xpY3lfaWRzIHsKICAgICAgICBhbGxvd19vdmVybGF5X2xheWVyKHBvbGljeV9pZCwgcG9saWN5X2hhc2hlc1tpXSwgaV9zdG9yYWdlLm9wdGlvbnNbaSArIDFdKQogICAgfQoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogdHJ1ZSIpCn0KYWxsb3dfc3RvcmFnZV9vcHRpb25zKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKSB7CiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDM6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCiAgICBjb3VudChwX3N0b3JhZ2Uub3B0aW9ucykgPT0gMQoKICAgIHN0YXJ0c3dpdGgocF9zdG9yYWdlLm9wdGlvbnNbMF0sICIkKGhhc2giKQogICAgaGFzaF9zdWZmaXggOj0gdHJpbV9sZWZ0KHBfc3RvcmFnZS5vcHRpb25zWzBdLCAiJChoYXNoIikKCiAgICBlbmRzd2l0aChoYXNoX3N1ZmZpeCwgIikiKQogICAgaGFzaF9pbmRleCA6PSB0cmltX3JpZ2h0KGhhc2hfc3VmZml4LCAiKSIpCiAgICBpIDo9IHRvX251bWJlcihoYXNoX2luZGV4KQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAzOiBpID0iLCBpKQoKICAgIGhhc2hfb3B0aW9uIDo9IGNvbmNhdCgiPSIsIFsiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LnJvb3QtaGFzaCIsIHJvb3RfaGFzaGVzW2ldXSkKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMzogaGFzaF9vcHRpb24gPSIsIGhhc2hfb3B0aW9uKQoKICAgIGNvdW50KGlfc3RvcmFnZS5vcHRpb25zKSA9PSA0CiAgICBpX3N0b3JhZ2Uub3B0aW9uc1swXSA9PSAicm8iCiAgICBpX3N0b3JhZ2Uub3B0aW9uc1sxXSA9PSAiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmJsb2NrX2RldmljZT1maWxlIgogICAgaV9zdG9yYWdlLm9wdGlvbnNbMl0gPT0gImlvLmthdGFjb250YWluZXJzLmZzLW9wdC5pcy1sYXllciIKICAgIGlfc3RvcmFnZS5vcHRpb25zWzNdID09IGhhc2hfb3B0aW9uCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAzOiB0cnVlIikKfQphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgNDogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gInNtYiIKICAgIHBfb3B0c19jb3VudCA6PSBjb3VudChwX3N0b3JhZ2Uub3B0aW9ucykKICAgIGlfb3B0c19jb3VudCA6PSBjb3VudChpX3N0b3JhZ2Uub3B0aW9ucykKICAgIGlfb3B0c19jb3VudCA9PSBwX29wdHNfY291bnQgKyAyCgogICAgaV9vcHRfbWF0Y2hlcyA6PSBbaSB8IGkgOj0gaWR4OyBpZHggPCBwX29wdHNfY291bnQ7IHBfc3RvcmFnZS5vcHRpb25zW2lkeF0gPT0gaV9zdG9yYWdlLm9wdGlvbnNbaWR4XV0KICAgIGNvdW50KGlfb3B0X21hdGNoZXMpID09IHBfb3B0c19jb3VudAoKICAgIHN0YXJ0c3dpdGgoaV9zdG9yYWdlLm9wdGlvbnNbaV9vcHRzX2NvdW50LTJdLCAiYWRkcj0iKQogICAgY3JlZHMgPSBzcGxpdChpX3N0b3JhZ2Uub3B0aW9uc1tpX29wdHNfY291bnQtMV0sICIsIikKICAgIGNvdW50KGNyZWRzKSA9PSAyCiAgICBzdGFydHN3aXRoKGNyZWRzWzBdLCAidXNlcm5hbWU9IikKICAgIHN0YXJ0c3dpdGgoY3JlZHNbMV0sICJwYXNzd29yZD0iKQogICAgCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDQ6IHRydWUiKQp9CgphbGxvd19vdmVybGF5X2xheWVyKHBvbGljeV9pZCwgcG9saWN5X2hhc2gsIGlfb3B0aW9uKSB7CiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogcG9saWN5X2lkID0iLCBwb2xpY3lfaWQsICJwb2xpY3lfaGFzaCA9IiwgcG9saWN5X2hhc2gpCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogaV9vcHRpb24gPSIsIGlfb3B0aW9uKQoKICAgIHN0YXJ0c3dpdGgoaV9vcHRpb24sICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQubGF5ZXI9IikKICAgIGlfdmFsdWUgOj0gcmVwbGFjZShpX29wdGlvbiwgImlvLmthdGFjb250YWluZXJzLmZzLW9wdC5sYXllcj0iLCAiIikKICAgIGlfdmFsdWVfZGVjb2RlZCA6PSBiYXNlNjQuZGVjb2RlKGlfdmFsdWUpCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogaV92YWx1ZV9kZWNvZGVkID0iLCBpX3ZhbHVlX2RlY29kZWQpCgogICAgcG9saWN5X3N1ZmZpeCA6PSBjb25jYXQoIj0iLCBbInRhcixybyxpby5rYXRhY29udGFpbmVycy5mcy1vcHQuYmxvY2tfZGV2aWNlPWZpbGUsaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmlzLWxheWVyLGlvLmthdGFjb250YWluZXJzLmZzLW9wdC5yb290LWhhc2giLCBwb2xpY3lfaGFzaF0pCiAgICBwX3ZhbHVlIDo9IGNvbmNhdCgiLCIsIFtwb2xpY3lfaWQsIHBvbGljeV9zdWZmaXhdKQogICAgcHJpbnQoImFsbG93X292ZXJsYXlfbGF5ZXI6IHBfdmFsdWUgPSIsIHBfdmFsdWUpCgogICAgcF92YWx1ZSA9PSBpX3ZhbHVlX2RlY29kZWQKCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogdHJ1ZSIpCn0KCmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAidGFyIgoKICAgIHN0YXJ0c3dpdGgocF9zdG9yYWdlLm1vdW50X3BvaW50LCAiJChsYXllciIpCiAgICBtb3VudF9zdWZmaXggOj0gdHJpbV9sZWZ0KHBfc3RvcmFnZS5tb3VudF9wb2ludCwgIiQobGF5ZXIiKQoKICAgIGVuZHN3aXRoKG1vdW50X3N1ZmZpeCwgIikiKQogICAgbGF5ZXJfaW5kZXggOj0gdHJpbV9yaWdodChtb3VudF9zdWZmaXgsICIpIikKICAgIGkgOj0gdG9fbnVtYmVyKGxheWVyX2luZGV4KQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDE6IGkgPSIsIGkpCgogICAgbGF5ZXJfaWQgOj0gbGF5ZXJfaWRzW2ldCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMTogbGF5ZXJfaWQgPSIsIGxheWVyX2lkKQoKICAgIHBfbW91bnQgOj0gY29uY2F0KCIvIiwgWyIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L2xheWVycyIsIGxheWVyX2lkXSkKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCAxOiBwX21vdW50ID0iLCBwX21vdW50KQoKICAgIHBfbW91bnQgPT0gaV9zdG9yYWdlLm1vdW50X3BvaW50CgogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDE6IHRydWUiKQp9CmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAiZnVzZTMua2F0YS1vdmVybGF5IgoKICAgIG1vdW50MSA6PSByZXBsYWNlKHBfc3RvcmFnZS5tb3VudF9wb2ludCwgIiQoY3BhdGgpIiwgcG9saWN5X2RhdGEuY29tbW9uLmNwYXRoKQogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDI6IG1vdW50MiA9IiwgbW91bnQyKQoKICAgIG1vdW50MiA9PSBpX3N0b3JhZ2UubW91bnRfcG9pbnQKCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMjogdHJ1ZSIpCn0KYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKSB7CiAgICBwX3N0b3JhZ2UuZnN0eXBlID09ICJsb2NhbCIKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQyID0iLCBtb3VudDIpCgogICAgbW91bnQzIDo9IHJlcGxhY2UobW91bnQyLCAiJChzYW5kYm94LWlkKSIsIHNhbmRib3hfaWQpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQzID0iLCBtb3VudDMpCgogICAgcmVnZXgubWF0Y2gobW91bnQzLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCgogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDM6IHRydWUiKQp9CmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAiYmluZCIKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNDogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNDogbW91bnQyID0iLCBtb3VudDIpCgogICAgbW91bnQzIDo9IHJlcGxhY2UobW91bnQyLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDQ6IG1vdW50MyA9IiwgbW91bnQzKQoKICAgIHJlZ2V4Lm1hdGNoKG1vdW50MywgaV9zdG9yYWdlLm1vdW50X3BvaW50KQoKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA0OiB0cnVlIikKfQphbGxvd19tb3VudF9wb2ludChwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgYnVuZGxlX2lkLCBzYW5kYm94X2lkLCBsYXllcl9pZHMpIHsKICAgIHBfc3RvcmFnZS5mc3R5cGUgPT0gInRtcGZzIgoKICAgIG1vdW50MSA6PSBwX3N0b3JhZ2UubW91bnRfcG9pbnQKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA1OiBtb3VudDEgPSIsIG1vdW50MSkKCiAgICByZWdleC5tYXRjaChtb3VudDEsIGlfc3RvcmFnZS5tb3VudF9wb2ludCkKCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNTogdHJ1ZSIpCn0KYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKSB7CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogaV9zdG9yYWdlLm1vdW50X3BvaW50ID0iLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCiAgICBhbGxvd19kaXJlY3Rfdm9sX2RyaXZlcihwX3N0b3JhZ2UsIGlfc3RvcmFnZSkKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChzcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQyID0iLCBtb3VudDIpCgogICAgZGlyZWN0X3ZvbF9wYXRoIDo9IGlfc3RvcmFnZS5zb3VyY2UKICAgIG1vdW50MyA6PSByZXBsYWNlKG1vdW50MiwgIiQoYjY0LWRpcmVjdC12b2wtcGF0aCkiLCBiYXNlNjR1cmwuZW5jb2RlKGRpcmVjdF92b2xfcGF0aCkpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQzID0iLCBtb3VudDMpCgogICAgbW91bnQzID09IGlfc3RvcmFnZS5tb3VudF9wb2ludAoKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA2OiB0cnVlIikKfQoKYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIocF9zdG9yYWdlLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19kaXJlY3Rfdm9sX2RyaXZlciAxOiBzdGFydCIpCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCiAgICBwcmludCgiYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIgMTogdHJ1ZSIpCn0KYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIocF9zdG9yYWdlLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19kaXJlY3Rfdm9sX2RyaXZlciAyOiBzdGFydCIpCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJzbWIiCiAgICBwcmludCgiYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIgMjogdHJ1ZSIpCn0KCiMgRXhlY1Byb2Nlc3NSZXF1ZXN0LnByb2Nlc3MuQ2FwYWJpbGl0aWVzCmFsbG93X2V4ZWNfY2FwcyhpX2NhcHMpIHsKICAgIG5vdCBpX2NhcHMuQW1iaWVudAogICAgbm90IGlfY2Fwcy5Cb3VuZGluZwogICAgbm90IGlfY2Fwcy5FZmZlY3RpdmUKICAgIG5vdCBpX2NhcHMuSW5oZXJpdGFibGUKICAgIG5vdCBpX2NhcHMuUGVybWl0dGVkCn0KCiMgT0NJLlByb2Nlc3MuQ2FwYWJpbGl0aWVzCmFsbG93X2NhcHMocF9jYXBzLCBpX2NhcHMpIHsKICAgIHByaW50KCJhbGxvd19jYXBzOiBwb2xpY3kgQW1iaWVudCA9IiwgcF9jYXBzLkFtYmllbnQpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgQW1iaWVudCA9IiwgaV9jYXBzLkFtYmllbnQpCiAgICBtYXRjaF9jYXBzKHBfY2Fwcy5BbWJpZW50LCBpX2NhcHMuQW1iaWVudCkKCiAgICBwcmludCgiYWxsb3dfY2FwczogcG9saWN5IEJvdW5kaW5nID0iLCBwX2NhcHMuQm91bmRpbmcpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgQm91bmRpbmcgPSIsIGlfY2Fwcy5Cb3VuZGluZykKICAgIG1hdGNoX2NhcHMocF9jYXBzLkJvdW5kaW5nLCBpX2NhcHMuQm91bmRpbmcpCgogICAgcHJpbnQoImFsbG93X2NhcHM6IHBvbGljeSBFZmZlY3RpdmUgPSIsIHBfY2Fwcy5FZmZlY3RpdmUpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgRWZmZWN0aXZlID0iLCBpX2NhcHMuRWZmZWN0aXZlKQogICAgbWF0Y2hfY2FwcyhwX2NhcHMuRWZmZWN0aXZlLCBpX2NhcHMuRWZmZWN0aXZlKQoKICAgIHByaW50KCJhbGxvd19jYXBzOiBwb2xpY3kgSW5oZXJpdGFibGUgPSIsIHBfY2Fwcy5Jbmhlcml0YWJsZSkKICAgIHByaW50KCJhbGxvd19jYXBzOiBpbnB1dCBJbmhlcml0YWJsZSA9IiwgaV9jYXBzLkluaGVyaXRhYmxlKQogICAgbWF0Y2hfY2FwcyhwX2NhcHMuSW5oZXJpdGFibGUsIGlfY2Fwcy5Jbmhlcml0YWJsZSkKCiAgICBwcmludCgiYWxsb3dfY2FwczogcG9saWN5IFBlcm1pdHRlZCA9IiwgcF9jYXBzLlBlcm1pdHRlZCkKICAgIHByaW50KCJhbGxvd19jYXBzOiBpbnB1dCBQZXJtaXR0ZWQgPSIsIGlfY2Fwcy5QZXJtaXR0ZWQpCiAgICBtYXRjaF9jYXBzKHBfY2Fwcy5QZXJtaXR0ZWQsIGlfY2Fwcy5QZXJtaXR0ZWQpCn0KCm1hdGNoX2NhcHMocF9jYXBzLCBpX2NhcHMpIHsKICAgIHByaW50KCJtYXRjaF9jYXBzIDE6IHN0YXJ0IikKCiAgICBwX2NhcHMgPT0gaV9jYXBzCgogICAgcHJpbnQoIm1hdGNoX2NhcHMgMTogdHJ1ZSIpCn0KbWF0Y2hfY2FwcyhwX2NhcHMsIGlfY2FwcykgewogICAgcHJpbnQoIm1hdGNoX2NhcHMgMjogc3RhcnQiKQoKICAgIGNvdW50KHBfY2FwcykgPT0gMQogICAgcF9jYXBzWzBdID09ICIkKGRlZmF1bHRfY2FwcykiCgogICAgcHJpbnQoIm1hdGNoX2NhcHMgMjogZGVmYXVsdF9jYXBzID0iLCBwb2xpY3lfZGF0YS5jb21tb24uZGVmYXVsdF9jYXBzKQogICAgcG9saWN5X2RhdGEuY29tbW9uLmRlZmF1bHRfY2FwcyA9PSBpX2NhcHMKCiAgICBwcmludCgibWF0Y2hfY2FwcyAyOiB0cnVlIikKfQptYXRjaF9jYXBzKHBfY2FwcywgaV9jYXBzKSB7CiAgICBwcmludCgibWF0Y2hfY2FwcyAzOiBzdGFydCIpCgogICAgY291bnQocF9jYXBzKSA9PSAxCiAgICBwX2NhcHNbMF0gPT0gIiQocHJpdmlsZWdlZF9jYXBzKSIKCiAgICBwcmludCgibWF0Y2hfY2FwcyAzOiBwcml2aWxlZ2VkX2NhcHMgPSIsIHBvbGljeV9kYXRhLmNvbW1vbi5wcml2aWxlZ2VkX2NhcHMpCiAgICBwb2xpY3lfZGF0YS5jb21tb24ucHJpdmlsZWdlZF9jYXBzID09IGlfY2FwcwoKICAgIHByaW50KCJtYXRjaF9jYXBzIDM6IHRydWUiKQp9CgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgpjaGVja19kaXJlY3RvcnlfdHJhdmVyc2FsKGlfcGF0aCkgewogICAgbm90IHJlZ2V4Lm1hdGNoKCIoXnwvKS4uKCR8LykiLCBpX3BhdGgpCn0KCmNoZWNrX3N5bWxpbmtfc291cmNlKGlfc3JjKSB7CiAgICBpX3NyYyA9PSAiIgogICAgcHJpbnQoImNoZWNrX3N5bWxpbmtfc291cmNlIDE6IHRydWUiKQp9CmNoZWNrX3N5bWxpbmtfc291cmNlKGlfc3JjKSB7CiAgICBpX3NyYyAhPSAiIgogICAgcHJpbnQoImNoZWNrX3N5bWxpbmtfc291cmNlIDI6IGlfc3JjID0iLCBpX3NyYykKCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24uc19zb3VyY2UxLCBpX3NyYykKCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMjogdHJ1ZSIpCn0KY2hlY2tfc3ltbGlua19zb3VyY2UoaV9zcmMpIHsKICAgIGlfc3JjICE9ICIiCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMzogaV9zcmMgPSIsIGlfc3JjKQoKICAgIHJlZ2V4Lm1hdGNoKHBvbGljeV9kYXRhLmNvbW1vbi5zX3NvdXJjZTIsIGlfc3JjKQogICAgY2hlY2tfZGlyZWN0b3J5X3RyYXZlcnNhbChpX3NyYykKCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMzogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfc3RvcmFnZXMoaV9zdG9yYWdlcykgewogICAgcHJpbnQoImFsbG93X3NhbmRib3hfc3RvcmFnZXM6IGlfc3RvcmFnZXMgPSIsIGlfc3RvcmFnZXMpCgogICAgcF9zdG9yYWdlcyA6PSBwb2xpY3lfZGF0YS5zYW5kYm94LnN0b3JhZ2VzCiAgICBldmVyeSBpX3N0b3JhZ2UgaW4gaV9zdG9yYWdlcyB7CiAgICAgICAgYWxsb3dfc2FuZGJveF9zdG9yYWdlKHBfc3RvcmFnZXMsIGlfc3RvcmFnZSkKICAgIH0KCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9zdG9yYWdlczogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfc3RvcmFnZShwX3N0b3JhZ2VzLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IGlfc3RvcmFnZSA9IiwgaV9zdG9yYWdlKQoKICAgIHNvbWUgcF9zdG9yYWdlIGluIHBfc3RvcmFnZXMKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IHBfc3RvcmFnZSA9IiwgcF9zdG9yYWdlKQogICAgaV9zdG9yYWdlID09IHBfc3RvcmFnZQoKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IHRydWUiKQp9CgpDb3B5RmlsZVJlcXVlc3QgewogICAgcHJpbnQoIkNvcHlGaWxlUmVxdWVzdDogaW5wdXQucGF0aCA9IiwgaW5wdXQucGF0aCkKCiAgICBjaGVja19zeW1saW5rX3NvdXJjZShpbnB1dC5zeW1saW5rX3NyYykKICAgIGNoZWNrX2RpcmVjdG9yeV90cmF2ZXJzYWwoaW5wdXQucGF0aCkKCiAgICBzb21lIHJlZ2V4MSBpbiBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLkNvcHlGaWxlUmVxdWVzdAogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5jcGF0aCkKICAgIHJlZ2V4NCA6PSByZXBsYWNlKHJlZ2V4MywgIiQoYnVuZGxlLWlkKSIsIEJVTkRMRV9JRCkKICAgIHByaW50KCJDb3B5RmlsZVJlcXVlc3Q6IHJlZ2V4NCA9IiwgcmVnZXg0KQoKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4NCwgaW5wdXQucGF0aCkKCiAgICBwcmludCgiQ29weUZpbGVSZXF1ZXN0OiB0cnVlIikKfQoKQ3JlYXRlU2FuZGJveFJlcXVlc3QgewogICAgcHJpbnQoIkNyZWF0ZVNhbmRib3hSZXF1ZXN0OiBpbnB1dC5ndWVzdF9ob29rX3BhdGggPSIsIGlucHV0Lmd1ZXN0X2hvb2tfcGF0aCkKICAgIGNvdW50KGlucHV0Lmd1ZXN0X2hvb2tfcGF0aCkgPT0gMAoKICAgIHByaW50KCJDcmVhdGVTYW5kYm94UmVxdWVzdDogaW5wdXQua2VybmVsX21vZHVsZXMgPSIsIGlucHV0Lmtlcm5lbF9tb2R1bGVzKQogICAgY291bnQoaW5wdXQua2VybmVsX21vZHVsZXMpID09IDAKCiAgICBpX3BpZG5zIDo9IGlucHV0LnNhbmRib3hfcGlkbnMKICAgIHByaW50KCJDcmVhdGVTYW5kYm94UmVxdWVzdDogaV9waWRucyA9IiwgaV9waWRucykKICAgIGlfcGlkbnMgPT0gZmFsc2UKICAgIGFsbG93X3NhbmRib3hfc3RvcmFnZXMoaW5wdXQuc3RvcmFnZXMpCn0KCmFsbG93X2V4ZWMocF9jb250YWluZXIsIGlfcHJvY2VzcykgewogICAgcHJpbnQoImFsbG93X2V4ZWM6IHN0YXJ0IikKCiAgICBwX29jaSA9IHBfY29udGFpbmVyLk9DSQogICAgcF9zX25hbWUgPSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc19uYW1lc3BhY2UgPSBnZXRfc3RhdGVfdmFsKCJuYW1lc3BhY2UiKQogICAgYWxsb3dfcHJvYmVfcHJvY2VzcyhwX29jaS5Qcm9jZXNzLCBpX3Byb2Nlc3MsIHBfc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfZXhlYzogdHJ1ZSIpCn0KCmFsbG93X2ludGVyYWN0aXZlX2V4ZWMocF9jb250YWluZXIsIGlfcHJvY2VzcykgewogICAgcHJpbnQoImFsbG93X2ludGVyYWN0aXZlX2V4ZWM6IHN0YXJ0IikKCiAgICBwX29jaSA9IHBfY29udGFpbmVyLk9DSQogICAgcF9zX25hbWUgPSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc19uYW1lc3BhY2UgPSBnZXRfc3RhdGVfdmFsKCJuYW1lc3BhY2UiKQogICAgYWxsb3dfaW50ZXJhY3RpdmVfcHJvY2VzcyhwX29jaS5Qcm9jZXNzLCBpX3Byb2Nlc3MsIHBfc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfaW50ZXJhY3RpdmVfZXhlYzogdHJ1ZSIpCn0KCiMgVE9ETzogc2hvdWxkIG90aGVyIEV4ZWNQcm9jZXNzUmVxdWVzdCBpbnB1dCBkYXRhIGZpZWxkcyBiZSB2YWxpZGF0ZWQgYXMgd2VsbD8KRXhlY1Byb2Nlc3NSZXF1ZXN0IHsKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMTogaW5wdXQgPSIsIGlucHV0KQoKICAgIHNvbWUgcF9jb21tYW5kIGluIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuRXhlY1Byb2Nlc3NSZXF1ZXN0LmFsbG93ZWRfY29tbWFuZHMKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMTogcF9jb21tYW5kID0iLCBwX2NvbW1hbmQpCiAgICBwX2NvbW1hbmQgPT0gaW5wdXQucHJvY2Vzcy5BcmdzCgogICAgIyBUT0RPOiBtYXRjaCBwX2NvbnRhaW5lcidzIElEIHdpdGggdGhlIGlucHV0IGNvbnRhaW5lcl9pZC4KICAgIHNvbWUgcF9jb250YWluZXIgaW4gcG9saWN5X2RhdGEuY29udGFpbmVycwogICAgYWxsb3dfaW50ZXJhY3RpdmVfZXhlYyhwX2NvbnRhaW5lciwgaW5wdXQucHJvY2VzcykKCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDE6IHRydWUiKQp9CkV4ZWNQcm9jZXNzUmVxdWVzdCB7CiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDI6IGlucHV0ID0iLCBpbnB1dCkKCiAgICAjIFRPRE86IG1hdGNoIGlucHV0IGNvbnRhaW5lciBJRCB3aXRoIGl0cyBjb3JyZXNwb25kaW5nIGNvbnRhaW5lci5leGVjX2NvbW1hbmRzLgogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBzb21lIHBfY29tbWFuZCBpbiBwX2NvbnRhaW5lci5leGVjX2NvbW1hbmRzCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDI6IHBfY29tbWFuZCA9IiwgcF9jb21tYW5kKQoKICAgICMgVE9ETzogc2hvdWxkIG90aGVyIGlucHV0IGRhdGEgZmllbGRzIGJlIHZhbGlkYXRlZCBhcyB3ZWxsPwogICAgcF9jb21tYW5kID09IGlucHV0LnByb2Nlc3MuQXJncwoKICAgIGFsbG93X2V4ZWMocF9jb250YWluZXIsIGlucHV0LnByb2Nlc3MpCgogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAyOiB0cnVlIikKfQpFeGVjUHJvY2Vzc1JlcXVlc3QgewogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAzOiBpbnB1dCA9IiwgaW5wdXQpCgogICAgaV9jb21tYW5kID0gY29uY2F0KCIgIiwgaW5wdXQucHJvY2Vzcy5BcmdzKQogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAzOiBpX2NvbW1hbmQgPSIsIGlfY29tbWFuZCkKCiAgICBzb21lIHBfcmVnZXggaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5FeGVjUHJvY2Vzc1JlcXVlc3QucmVnZXgKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMzogcF9yZWdleCA9IiwgcF9yZWdleCkKCiAgICByZWdleC5tYXRjaChwX3JlZ2V4LCBpX2NvbW1hbmQpCgogICAgIyBUT0RPOiBtYXRjaCBwX2NvbnRhaW5lcidzIElEIHdpdGggdGhlIGlucHV0IGNvbnRhaW5lcl9pZC4KICAgIHNvbWUgcF9jb250YWluZXIgaW4gcG9saWN5X2RhdGEuY29udGFpbmVycwogICAgYWxsb3dfaW50ZXJhY3RpdmVfZXhlYyhwX2NvbnRhaW5lciwgaW5wdXQucHJvY2VzcykKCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDM6IHRydWUiKQp9CgpVcGRhdGVSb3V0ZXNSZXF1ZXN0IHsKICAgIHByaW50KCJVcGRhdGVSb3V0ZXNSZXF1ZXN0OiBpbnB1dCA9IiwgaW5wdXQpCiAgICBwcmludCgiVXBkYXRlUm91dGVzUmVxdWVzdDogcG9saWN5ID0iLCBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLlVwZGF0ZVJvdXRlc1JlcXVlc3QpCgogICAgaV9yb3V0ZXMgOj0gaW5wdXQucm91dGVzLlJvdXRlcwogICAgcF9zb3VyY2VfcmVnZXggPSBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLlVwZGF0ZVJvdXRlc1JlcXVlc3QuZm9yYmlkZGVuX3NvdXJjZV9yZWdleAogICAgcF9uYW1lcyA9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuVXBkYXRlUm91dGVzUmVxdWVzdC5mb3JiaWRkZW5fZGV2aWNlX25hbWVzCgogICAgZXZlcnkgaV9yb3V0ZSBpbiBpX3JvdXRlcyB7CiAgICAgICAgcHJpbnQoImlfcm91dGUuc291cmNlID0iLCBpX3JvdXRlLnNvdXJjZSkKICAgICAgICBldmVyeSBwX3JlZ2V4IGluIHBfc291cmNlX3JlZ2V4IHsKICAgICAgICAgICAgcHJpbnQoInBfcmVnZXggPSIsIHBfcmVnZXgpCiAgICAgICAgICAgIG5vdCByZWdleC5tYXRjaChwX3JlZ2V4LCBpX3JvdXRlLnNvdXJjZSkKICAgICAgICB9CgogICAgICAgIHByaW50KCJpX3JvdXRlLmRldmljZSA9IiwgaV9yb3V0ZS5kZXZpY2UpCiAgICAgICAgbm90IGlfcm91dGUuZGV2aWNlIGluIHBfbmFtZXMKICAgIH0KCiAgICBwcmludCgiVXBkYXRlUm91dGVzUmVxdWVzdDogdHJ1ZSIpCn0KClVwZGF0ZUludGVyZmFjZVJlcXVlc3QgewogICAgcHJpbnQoIlVwZGF0ZUludGVyZmFjZVJlcXVlc3Q6IGlucHV0ID0iLCBpbnB1dCkKICAgIHByaW50KCJVcGRhdGVJbnRlcmZhY2VSZXF1ZXN0OiBwb2xpY3kgPSIsIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuVXBkYXRlSW50ZXJmYWNlUmVxdWVzdCkKCiAgICBpX2ludGVyZmFjZSA6PSBpbnB1dC5pbnRlcmZhY2UKICAgIHBfZmxhZ3MgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmFsbG93X3Jhd19mbGFncwoKICAgICMgVHlwaWNhbGx5LCBqdXN0IElGRl9OT0FSUCBpcyB1c2VkLgogICAgYml0cy5hbmQoaV9pbnRlcmZhY2UucmF3X2ZsYWdzLCBiaXRzLm5lZ2F0ZShwX2ZsYWdzKSkgPT0gMAoKICAgIHBfbmFtZXMgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmZvcmJpZGRlbl9uYW1lcwoKICAgIG5vdCBpX2ludGVyZmFjZS5uYW1lIGluIHBfbmFtZXMKCiAgICBwX2h3YWRkcnMgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmZvcmJpZGRlbl9od19hZGRycwoKICAgIG5vdCBpX2ludGVyZmFjZS5od0FkZHIgaW4gcF9od2FkZHJzCgogICAgcHJpbnQoIlVwZGF0ZUludGVyZmFjZVJlcXVlc3Q6IHRydWUiKQp9CgpDbG9zZVN0ZGluUmVxdWVzdCB7CiAgICBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLkNsb3NlU3RkaW5SZXF1ZXN0ID09IHRydWUKfQoKUmVhZFN0cmVhbVJlcXVlc3QgewogICAgcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5SZWFkU3RyZWFtUmVxdWVzdCA9PSB0cnVlCn0KClVwZGF0ZUVwaGVtZXJhbE1vdW50c1JlcXVlc3QgewogICAgcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVFcGhlbWVyYWxNb3VudHNSZXF1ZXN0ID09IHRydWUKfQoKV3JpdGVTdHJlYW1SZXF1ZXN0IHsKICAgIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuV3JpdGVTdHJlYW1SZXF1ZXN0ID09IHRydWUKfQoKcG9saWN5X2RhdGEgOj0gewogICJjb250YWluZXJzIjogWwogICAgewogICAgICAiT0NJIjogewogICAgICAgICJWZXJzaW9uIjogIjEuMS4wLXJjLjEiLAogICAgICAgICJQcm9jZXNzIjogewogICAgICAgICAgIlRlcm1pbmFsIjogZmFsc2UsCiAgICAgICAgICAiVXNlciI6IHsKICAgICAgICAgICAgIlVJRCI6IDY1NTM1LAogICAgICAgICAgICAiR0lEIjogNjU1MzUsCiAgICAgICAgICAgICJBZGRpdGlvbmFsR2lkcyI6IFtdLAogICAgICAgICAgICAiVXNlcm5hbWUiOiAiIgogICAgICAgICAgfSwKICAgICAgICAgICJEZXByZWNhdGVkQXJncyI6IFsKICAgICAgICAgICAgIi9wYXVzZSIKICAgICAgICAgIF0sCiAgICAgICAgICAiQXJncyI6IFsKICAgICAgICAgICAgIi9wYXVzZSIKICAgICAgICAgIF0sCiAgICAgICAgICAiRW52IjogWwogICAgICAgICAgICAiUEFUSD0vdXNyL2xvY2FsL3NiaW46L3Vzci9sb2NhbC9iaW46L3Vzci9zYmluOi91c3IvYmluOi9zYmluOi9iaW4iCiAgICAgICAgICBdLAogICAgICAgICAgIkN3ZCI6ICIvIiwKICAgICAgICAgICJDYXBhYmlsaXRpZXMiOiB7CiAgICAgICAgICAgICJBbWJpZW50IjogW10sCiAgICAgICAgICAgICJCb3VuZGluZyI6IFsKICAgICAgICAgICAgICAiJChkZWZhdWx0X2NhcHMpIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiRWZmZWN0aXZlIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJJbmhlcml0YWJsZSI6IFtdLAogICAgICAgICAgICAiUGVybWl0dGVkIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICAiTm9OZXdQcml2aWxlZ2VzIjogdHJ1ZQogICAgICAgIH0sCiAgICAgICAgIlJvb3QiOiB7CiAgICAgICAgICAiUGF0aCI6ICIkKGNwYXRoKS8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgIlJlYWRvbmx5IjogdHJ1ZQogICAgICAgIH0sCiAgICAgICAgIk1vdW50cyI6IFsKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9wcm9jIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJwcm9jIiwKICAgICAgICAgICAgInR5cGVfIjogInByb2MiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2IiwKICAgICAgICAgICAgInNvdXJjZSI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJzdHJpY3RhdGltZSIsCiAgICAgICAgICAgICAgIm1vZGU9NzU1IiwKICAgICAgICAgICAgICAic2l6ZT02NTUzNmsiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L3B0cyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiZGV2cHRzIiwKICAgICAgICAgICAgInR5cGVfIjogImRldnB0cyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJuZXdpbnN0YW5jZSIsCiAgICAgICAgICAgICAgInB0bXhtb2RlPTA2NjYiLAogICAgICAgICAgICAgICJtb2RlPTA2MjAiLAogICAgICAgICAgICAgICJnaWQ9NSIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvc2htIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L3NobSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi9tcXVldWUiLAogICAgICAgICAgICAic291cmNlIjogIm1xdWV1ZSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJtcXVldWUiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvc3lzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJzeXNmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJzeXNmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2V0Yy9yZXNvbHYuY29uZiIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClyZXNvbHYuY29uZiQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJvIiwKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9kZXYiLAogICAgICAgICAgICAgICJub2V4ZWMiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0KICAgICAgICBdLAogICAgICAgICJBbm5vdGF0aW9ucyI6IHsKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmJ1bmRsZV9wYXRoIjogIi9ydW4vY29udGFpbmVyZC9pby5jb250YWluZXJkLnJ1bnRpbWUudjIudGFzay9rOHMuaW8vJChidW5kbGUtaWQpIiwKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIjogInBvZF9zYW5kYm94IiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSI6ICJzYW5kYm94IiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWlkIjogIl5bYS16MC05XXs2NH0kIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWxvZy1kaXJlY3RvcnkiOiAiXi92YXIvbG9nL3BvZHMvJChzYW5kYm94LW5hbWVzcGFjZSlfJChzYW5kYm94LW5hbWUpX1swLTlhLWZdezh9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezEyfSQiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZSI6ICJedGVzdFxcLXBvZFxcLTk4MDExYjQzXFwtMjA2MFxcLTQ0NzNcXC1hM2JkXFwtYzU2MjI5OTdlNGE3JCIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1uYW1lc3BhY2UiOiAic3ZjYWNjb3VudHMtODM0MSIsCiAgICAgICAgICAibmVyZGN0bC9uZXR3b3JrLW5hbWVzcGFjZSI6ICJeL3Zhci9ydW4vbmV0bnMvY25pLVswLTlhLWZdezh9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezEyfSQiCiAgICAgICAgfSwKICAgICAgICAiTGludXgiOiB7CiAgICAgICAgICAiTmFtZXNwYWNlcyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICJUeXBlIjogImlwYyIsCiAgICAgICAgICAgICAgIlBhdGgiOiAiIgogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgIlR5cGUiOiAidXRzIiwKICAgICAgICAgICAgICAiUGF0aCI6ICIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiVHlwZSI6ICJtb3VudCIsCiAgICAgICAgICAgICAgIlBhdGgiOiAiIgogICAgICAgICAgICB9CiAgICAgICAgICBdLAogICAgICAgICAgIk1hc2tlZFBhdGhzIjogWwogICAgICAgICAgICAiL3Byb2MvYWNwaSIsCiAgICAgICAgICAgICIvcHJvYy9hc291bmQiLAogICAgICAgICAgICAiL3Byb2Mva2NvcmUiLAogICAgICAgICAgICAiL3Byb2Mva2V5cyIsCiAgICAgICAgICAgICIvcHJvYy9sYXRlbmN5X3N0YXRzIiwKICAgICAgICAgICAgIi9wcm9jL3RpbWVyX2xpc3QiLAogICAgICAgICAgICAiL3Byb2MvdGltZXJfc3RhdHMiLAogICAgICAgICAgICAiL3Byb2Mvc2NoZWRfZGVidWciLAogICAgICAgICAgICAiL3N5cy9maXJtd2FyZSIsCiAgICAgICAgICAgICIvcHJvYy9zY3NpIgogICAgICAgICAgXSwKICAgICAgICAgICJSZWFkb25seVBhdGhzIjogWwogICAgICAgICAgICAiL3Byb2MvYnVzIiwKICAgICAgICAgICAgIi9wcm9jL2ZzIiwKICAgICAgICAgICAgIi9wcm9jL2lycSIsCiAgICAgICAgICAgICIvcHJvYy9zeXMiLAogICAgICAgICAgICAiL3Byb2Mvc3lzcnEtdHJpZ2dlciIKICAgICAgICAgIF0sCiAgICAgICAgICAiRGV2aWNlcyI6IFtdLAogICAgICAgICAgIlN5c2N0bCI6IHsKICAgICAgICAgICAgIm5ldC5pcHY0LmlwX3VucHJpdmlsZWdlZF9wb3J0X3N0YXJ0IjogIjAiLAogICAgICAgICAgICAibmV0LmlwdjQucGluZ19ncm91cF9yYW5nZSI6ICIwIDIxNDc0ODM2NDciCiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9LAogICAgICAic3RvcmFnZXMiOiBbCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJibGsiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogInRhciIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIiQoaGFzaDApIgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGxheWVyMCkiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJvdmVybGF5ZnMiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogImZ1c2UzLmthdGEtb3ZlcmxheSIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIjVhNWFhZDgwMDU1ZmYyMDAxMmE1MGRjMjVmOGRmN2EyOTkyNDQ3NDMyNGQ2NWY3ZDUzMDZlZThlZTI3ZmY3MWQiLAogICAgICAgICAgICAiODE3MjUwZjFhM2UzMzZkYTc2ZjViZDNmYTc4NGUxYjI2ZDk1OWI5YzEzMTg3NjgxNWJhMjYwNDA0OGI3MGMxOCIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChjcGF0aCkvJChidW5kbGUtaWQpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9CiAgICAgIF0sCiAgICAgICJkZXZpY2VzIjogW10sCiAgICAgICJzYW5kYm94X3BpZG5zIjogZmFsc2UsCiAgICAgICJleGVjX2NvbW1hbmRzIjogW10sCiAgICAgICJlbnZfbWFwIjogewogICAgICAgICJQQVRIIjogIi91c3IvbG9jYWwvc2JpbjovdXNyL2xvY2FsL2JpbjovdXNyL3NiaW46L3Vzci9iaW46L3NiaW46L2JpbiIKICAgICAgfQogICAgfSwKICAgIHsKICAgICAgIk9DSSI6IHsKICAgICAgICAiVmVyc2lvbiI6ICIxLjEuMC1yYy4xIiwKICAgICAgICAiUHJvY2VzcyI6IHsKICAgICAgICAgICJUZXJtaW5hbCI6IGZhbHNlLAogICAgICAgICAgIlVzZXIiOiB7CiAgICAgICAgICAgICJVSUQiOiAwLAogICAgICAgICAgICAiR0lEIjogMCwKICAgICAgICAgICAgIkFkZGl0aW9uYWxHaWRzIjogW10sCiAgICAgICAgICAgICJVc2VybmFtZSI6ICIiCiAgICAgICAgICB9LAogICAgICAgICAgIkRlcHJlY2F0ZWRBcmdzIjogWwogICAgICAgICAgICAic2giCiAgICAgICAgICBdLAogICAgICAgICAgIkFyZ3MiOiBbCiAgICAgICAgICAgICJzaCIKICAgICAgICAgIF0sCiAgICAgICAgICAiRW52IjogWwogICAgICAgICAgICAiUEFUSD0vdXNyL2xvY2FsL3NiaW46L3Vzci9sb2NhbC9iaW46L3Vzci9zYmluOi91c3IvYmluOi9zYmluOi9iaW4iLAogICAgICAgICAgICAiSE9TVE5BTUU9JChob3N0LW5hbWUpIgogICAgICAgICAgXSwKICAgICAgICAgICJDd2QiOiAiLyIsCiAgICAgICAgICAiQ2FwYWJpbGl0aWVzIjogewogICAgICAgICAgICAiQW1iaWVudCI6IFtdLAogICAgICAgICAgICAiQm91bmRpbmciOiBbCiAgICAgICAgICAgICAgIiQoZGVmYXVsdF9jYXBzKSIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgIkVmZmVjdGl2ZSI6IFsKICAgICAgICAgICAgICAiJChkZWZhdWx0X2NhcHMpIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiSW5oZXJpdGFibGUiOiBbXSwKICAgICAgICAgICAgIlBlcm1pdHRlZCI6IFsKICAgICAgICAgICAgICAiJChkZWZhdWx0X2NhcHMpIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgIk5vTmV3UHJpdmlsZWdlcyI6IGZhbHNlCiAgICAgICAgfSwKICAgICAgICAiUm9vdCI6IHsKICAgICAgICAgICJQYXRoIjogIiQoY3BhdGgpLyQoYnVuZGxlLWlkKSIsCiAgICAgICAgICAiUmVhZG9ubHkiOiBmYWxzZQogICAgICAgIH0sCiAgICAgICAgIk1vdW50cyI6IFsKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9wcm9jIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJwcm9jIiwKICAgICAgICAgICAgInR5cGVfIjogInByb2MiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2IiwKICAgICAgICAgICAgInNvdXJjZSI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJzdHJpY3RhdGltZSIsCiAgICAgICAgICAgICAgIm1vZGU9NzU1IiwKICAgICAgICAgICAgICAic2l6ZT02NTUzNmsiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L3B0cyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiZGV2cHRzIiwKICAgICAgICAgICAgInR5cGVfIjogImRldnB0cyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJuZXdpbnN0YW5jZSIsCiAgICAgICAgICAgICAgInB0bXhtb2RlPTA2NjYiLAogICAgICAgICAgICAgICJtb2RlPTA2MjAiLAogICAgICAgICAgICAgICJnaWQ9NSIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvc2htIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L3NobSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi9tcXVldWUiLAogICAgICAgICAgICAic291cmNlIjogIm1xdWV1ZSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJtcXVldWUiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvc3lzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJzeXNmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJzeXNmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL3N5cy9mcy9jZ3JvdXAiLAogICAgICAgICAgICAic291cmNlIjogImNncm91cCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJjZ3JvdXAiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiLAogICAgICAgICAgICAgICJyZWxhdGltZSIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2V0Yy9ob3N0cyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClob3N0cyQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicnciCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L3Rlcm1pbmF0aW9uLWxvZyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeCl0ZXJtaW5hdGlvbi1sb2ckIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJ3IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2V0Yy9ob3N0bmFtZSIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClob3N0bmFtZSQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicnciCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZXRjL3Jlc29sdi5jb25mIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KXJlc29sdi5jb25mJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJydyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi92YXIvcnVuL3NlY3JldHMva3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudCIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClzZXJ2aWNlYWNjb3VudCQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicm8iCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvdmFyL3J1bi9zZWNyZXRzL2F6dXJlL3Rva2VucyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeCl0b2tlbnMkIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL3Rlc3Qtdm9sdW1lIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KXRlc3Qtdm9sdW1lJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJybyIKICAgICAgICAgICAgXQogICAgICAgICAgfQogICAgICAgIF0sCiAgICAgICAgIkFubm90YXRpb25zIjogewogICAgICAgICAgImlvLmthdGFjb250YWluZXJzLnBrZy5vY2kuYnVuZGxlX3BhdGgiOiAiL3J1bi9jb250YWluZXJkL2lvLmNvbnRhaW5lcmQucnVudGltZS52Mi50YXNrL2s4cy5pby8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgImlvLmthdGFjb250YWluZXJzLnBrZy5vY2kuY29udGFpbmVyX3R5cGUiOiAicG9kX2NvbnRhaW5lciIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLW5hbWUiOiAiYWduaG9zdC1jb250YWluZXIiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLmNvbnRhaW5lci10eXBlIjogImNvbnRhaW5lciIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuaW1hZ2UtbmFtZSI6ICJyZWdpc3RyeS5rOHMuaW8vZTJlLXRlc3QtaW1hZ2VzL2Fnbmhvc3Q6Mi40MCIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCI6ICJeW2EtejAtOV17NjR9JCIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1uYW1lIjogIl50ZXN0XFwtcG9kXFwtOTgwMTFiNDNcXC0yMDYwXFwtNDQ3M1xcLWEzYmRcXC1jNTYyMjk5N2U0YTckIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LW5hbWVzcGFjZSI6ICJzdmNhY2NvdW50cy04MzQxIgogICAgICAgIH0sCiAgICAgICAgIkxpbnV4IjogewogICAgICAgICAgIk5hbWVzcGFjZXMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiVHlwZSI6ICJpcGMiLAogICAgICAgICAgICAgICJQYXRoIjogIiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJUeXBlIjogInV0cyIsCiAgICAgICAgICAgICAgIlBhdGgiOiAiIgogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgIlR5cGUiOiAibW91bnQiLAogICAgICAgICAgICAgICJQYXRoIjogIiIKICAgICAgICAgICAgfQogICAgICAgICAgXSwKICAgICAgICAgICJNYXNrZWRQYXRocyI6IFsKICAgICAgICAgICAgIi9wcm9jL2FjcGkiLAogICAgICAgICAgICAiL3Byb2Mva2NvcmUiLAogICAgICAgICAgICAiL3Byb2Mva2V5cyIsCiAgICAgICAgICAgICIvcHJvYy9sYXRlbmN5X3N0YXRzIiwKICAgICAgICAgICAgIi9wcm9jL3RpbWVyX2xpc3QiLAogICAgICAgICAgICAiL3Byb2MvdGltZXJfc3RhdHMiLAogICAgICAgICAgICAiL3Byb2Mvc2NoZWRfZGVidWciLAogICAgICAgICAgICAiL3Byb2Mvc2NzaSIsCiAgICAgICAgICAgICIvc3lzL2Zpcm13YXJlIgogICAgICAgICAgXSwKICAgICAgICAgICJSZWFkb25seVBhdGhzIjogWwogICAgICAgICAgICAiL3Byb2MvYXNvdW5kIiwKICAgICAgICAgICAgIi9wcm9jL2J1cyIsCiAgICAgICAgICAgICIvcHJvYy9mcyIsCiAgICAgICAgICAgICIvcHJvYy9pcnEiLAogICAgICAgICAgICAiL3Byb2Mvc3lzIiwKICAgICAgICAgICAgIi9wcm9jL3N5c3JxLXRyaWdnZXIiCiAgICAgICAgICBdLAogICAgICAgICAgIkRldmljZXMiOiBbXSwKICAgICAgICAgICJTeXNjdGwiOiB7CiAgICAgICAgICAgICJuZXQuaXB2NC5pcF91bnByaXZpbGVnZWRfcG9ydF9zdGFydCI6ICIwIiwKICAgICAgICAgICAgIm5ldC5pcHY0LnBpbmdfZ3JvdXBfcmFuZ2UiOiAiMCAyMTQ3NDgzNjQ3IgogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSwKICAgICAgInN0b3JhZ2VzIjogWwogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2gwKSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjApIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2gxKSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjEpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2gyKSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjIpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2gzKSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjMpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2g0KSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjQpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2g1KSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjUpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2g2KSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjYpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2g3KSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjcpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2g4KSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjgpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAib3ZlcmxheWZzIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJmdXNlMy5rYXRhLW92ZXJsYXkiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIwNDM2ZDkzOTkzNGEyOWIzZDU5NzkzNTM0ZmY5M2UxOTlmOTQzOGY5Yjk0MWUxM2FlNjMyMTVmMTY3YzQ5M2I4OmJmMWM3ZjFmOWY3Zjk5NWFhOTZiMGMwZWI1NDM5MmRiNGVjNzc5M2VlYjUzMmI0MzgyYjUzZjcwMDQ0NDYzNWY6MTI3NjI2MmI5MTA0ZjE4NjcwNDEwY2NhZTUzYmEzMmMzZDIxOTVlYjExN2NlZGFmYjY3ZjI1OWI4OWNkNGQ3YTpjZjU0MzIxZjA5Y2U0OTc5M2IxM2YwYTFiOWYyNWM4NjkzZDQ0NjZkNGMxODUxZGYyNmU1YzdlZjI4MmUxODU2OmE3MDRmYjAwNmU5NjdhZjk4MTExMmY0NjE4NmJmNmIzZGMzZGZjOWYxZWQ2MjYxNGVlOWZkYzgxMTMwNTc0ZGU6NmE3MGQ3YWRkZTRiZjM1N2U0NzM0ZDRmYWQ4ODE2MDkyMDBmYTNlYmIyNzkyZjJiYWMwZTNiY2E4MzFiNGMyMjplMjI0ZTUzZmNjYWRhN2M5NjI3MTRiMzhmYzZiNDNlZWM1NTY0ZWQzNTAxYjUzMTg4NDEyZGVjNTVjYTllNGMxOmVlZjY1M2Y5NWNhMzI2NTJiODdlNjc2YzBhMzdjMGYyMDRlNTgxNDVkODY2YjRjNjhiZTBlZjNkZDM2YjQyMTE6ZGE1OTgwYTdlMzQzNDQwOWRhMTIzMjQxN2ExZDFjYzAyOTY3YjYyYTA5OTUwMmNhY2QxM2NjMmUzNDIwNmZhNCIsCiAgICAgICAgICAgICIxMWViYzUzZGZjZjAwOGRkYWNmNDVlZTY2MzlkYjU4ZGY0NjZlZDc5NzVlMDEwYjQ3YTIxNjIyZDY3MDQ4ZjYwOjgzNTIyYTM4OGZkZjdhMjBlNWMwNTViM2Q4ZGE3YTc3MjZmYjA0YjcxNmI3YzUyMjhiZTM5OWU3ODIyMDQ0Yjk6NmM3ZWEwZjZjNDgxMTdlZjBiNWEyNWQwOGU3MDMzMTk0NjY1NTk0YWFhZDE4MmM1ZDcyMjY3ODhlNzc5YmYwODo1NjhkOTExMWI1NzlhOWViNjYxZWQ3OTc4ZWNiNDliMDM1MWY4ZmI3Yzk4NzEyOTBiZTRlYzNiNWY4NWEwN2E5OmMwY2RlNDA5MWUyMGJiMjY0YzU5MjhmY2NmM2UzMTU3Zjg4MGQ4NjRkZjNmYzMyMWJiOWY2YjVjMzVmOWU0ZTQ6MzU5OTJlMmNhYmE5NjJmYzBkM2NiYjIyZjIzOGJiZTUyYmUwZDU0NGIzYjNhOWViMjg3ZDZiZmQ5N2ZhN2RmMjpiMTFlYzIyOTA1OTc1OTcxMzVhOTFkZjg0ODEyODc0N2JhNzY4YWQzZmNhZjBiYjc1MGIyOTIxNmUyZTNjMmQxOmFmMzFlNjUxZWRkMWYyNWJkODM5NDM0YjZkNjA1NjJiY2JkOTA3MWVjNTE2ZjQxYzZiMmVmYjI5ZTg0MGM0M2U6MjU0YzUzMTQ4NzNjMjdhOGRlM2RiNTM0N2Y1NmViZDllYjJiZjQ2Y2M4ODEyYTQzNjExZjk4ZTM4YWMzN2JhMiIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChjcGF0aCkvJChidW5kbGUtaWQpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9CiAgICAgIF0sCiAgICAgICJkZXZpY2VzIjogW10sCiAgICAgICJzYW5kYm94X3BpZG5zIjogZmFsc2UsCiAgICAgICJleGVjX2NvbW1hbmRzIjogW10sCiAgICAgICJlbnZfbWFwIjogewogICAgICAgICJIT1NUTkFNRSI6ICIkKGhvc3QtbmFtZSkiLAogICAgICAgICJQQVRIIjogIi91c3IvbG9jYWwvc2JpbjovdXNyL2xvY2FsL2JpbjovdXNyL3NiaW46L3Vzci9iaW46L3NiaW46L2JpbiIKICAgICAgfQogICAgfQogIF0sCiAgImNvbW1vbiI6IHsKICAgICJjcGF0aCI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zaGFyZWQvY29udGFpbmVycyIsCiAgICAibW91bnRfc291cmNlX2NwYXRoIjogIi9ydW4va2F0YS1jb250YWluZXJzL3NoYXJlZC9jb250YWluZXJzIiwKICAgICJzZnByZWZpeCI6ICJeJChjcGF0aCkvJChidW5kbGUtaWQpLVthLXowLTldezE2fS0iLAogICAgInNwYXRoIjogIi9ydW4va2F0YS1jb250YWluZXJzL3NhbmRib3gvc3RvcmFnZSIsCiAgICAiaXB2NF9hIjogIigoWzAtOV18WzEtOV1bMC05XXwxWzAtOV17Mn18MlswLTRdWzAtOV18MjVbMC01XSlcXC4pezN9KFswLTldfFsxLTldWzAtOV18MVswLTldezJ9fDJbMC00XVswLTldfDI1WzAtNV0pIiwKICAgICJpcF9wIjogIlswLTldezEsNX0iLAogICAgInN2Y19uYW1lIjogIltBLVpfXFwuXFwtXSsiLAogICAgImRuc19sYWJlbCI6ICJbYS16QS1aMC05X1xcLlxcLV0rIiwKICAgICJzX3NvdXJjZTEiOiAiXi4uMlswLTldezN9X1swLTFdWzAtOV1fWzAtM11bMC05XV9bMC0yXVswLTldX1swLTVdWzAtOV1fWzAtNV1bMC05XVxcLlswLTldezEsMTB9JCIsCiAgICAic19zb3VyY2UyIjogIl4uLmRhdGEvIiwKICAgICJkbnNfc3ViZG9tYWluIjogIl5bYS16MC05XShbLWEtejAtOV0qW2EtejAtOV0pPyQiLAogICAgInBvZF91aWQiOiAiXlswLTlhLWZBLUZdezh9LVswLTlhLWZBLUZdezR9LVswLTlhLWZBLUZdezR9LVswLTlhLWZBLUZdezR9LVswLTlhLWZBLUZdezEyfSQiLAogICAgImRlZmF1bHRfY2FwcyI6IFsKICAgICAgIkNBUF9DSE9XTiIsCiAgICAgICJDQVBfREFDX09WRVJSSURFIiwKICAgICAgIkNBUF9GU0VUSUQiLAogICAgICAiQ0FQX0ZPV05FUiIsCiAgICAgICJDQVBfTUtOT0QiLAogICAgICAiQ0FQX05FVF9SQVciLAogICAgICAiQ0FQX1NFVEdJRCIsCiAgICAgICJDQVBfU0VUVUlEIiwKICAgICAgIkNBUF9TRVRGQ0FQIiwKICAgICAgIkNBUF9TRVRQQ0FQIiwKICAgICAgIkNBUF9ORVRfQklORF9TRVJWSUNFIiwKICAgICAgIkNBUF9TWVNfQ0hST09UIiwKICAgICAgIkNBUF9LSUxMIiwKICAgICAgIkNBUF9BVURJVF9XUklURSIKICAgIF0sCiAgICAicHJpdmlsZWdlZF9jYXBzIjogWwogICAgICAiQ0FQX0NIT1dOIiwKICAgICAgIkNBUF9EQUNfT1ZFUlJJREUiLAogICAgICAiQ0FQX0RBQ19SRUFEX1NFQVJDSCIsCiAgICAgICJDQVBfRk9XTkVSIiwKICAgICAgIkNBUF9GU0VUSUQiLAogICAgICAiQ0FQX0tJTEwiLAogICAgICAiQ0FQX1NFVEdJRCIsCiAgICAgICJDQVBfU0VUVUlEIiwKICAgICAgIkNBUF9TRVRQQ0FQIiwKICAgICAgIkNBUF9MSU5VWF9JTU1VVEFCTEUiLAogICAgICAiQ0FQX05FVF9CSU5EX1NFUlZJQ0UiLAogICAgICAiQ0FQX05FVF9CUk9BRENBU1QiLAogICAgICAiQ0FQX05FVF9BRE1JTiIsCiAgICAgICJDQVBfTkVUX1JBVyIsCiAgICAgICJDQVBfSVBDX0xPQ0siLAogICAgICAiQ0FQX0lQQ19PV05FUiIsCiAgICAgICJDQVBfU1lTX01PRFVMRSIsCiAgICAgICJDQVBfU1lTX1JBV0lPIiwKICAgICAgIkNBUF9TWVNfQ0hST09UIiwKICAgICAgIkNBUF9TWVNfUFRSQUNFIiwKICAgICAgIkNBUF9TWVNfUEFDQ1QiLAogICAgICAiQ0FQX1NZU19BRE1JTiIsCiAgICAgICJDQVBfU1lTX0JPT1QiLAogICAgICAiQ0FQX1NZU19OSUNFIiwKICAgICAgIkNBUF9TWVNfUkVTT1VSQ0UiLAogICAgICAiQ0FQX1NZU19USU1FIiwKICAgICAgIkNBUF9TWVNfVFRZX0NPTkZJRyIsCiAgICAgICJDQVBfTUtOT0QiLAogICAgICAiQ0FQX0xFQVNFIiwKICAgICAgIkNBUF9BVURJVF9XUklURSIsCiAgICAgICJDQVBfQVVESVRfQ09OVFJPTCIsCiAgICAgICJDQVBfU0VURkNBUCIsCiAgICAgICJDQVBfTUFDX09WRVJSSURFIiwKICAgICAgIkNBUF9NQUNfQURNSU4iLAogICAgICAiQ0FQX1NZU0xPRyIsCiAgICAgICJDQVBfV0FLRV9BTEFSTSIsCiAgICAgICJDQVBfQkxPQ0tfU1VTUEVORCIsCiAgICAgICJDQVBfQVVESVRfUkVBRCIsCiAgICAgICJDQVBfUEVSRk1PTiIsCiAgICAgICJDQVBfQlBGIiwKICAgICAgIkNBUF9DSEVDS1BPSU5UX1JFU1RPUkUiCiAgICBdLAogICAgInZpcnRpb19ibGtfc3RvcmFnZV9jbGFzc2VzIjogWwogICAgICAiY2MtbG9jYWwtY3NpIiwKICAgICAgImNjLW1hbmFnZWQtY3NpIiwKICAgICAgImNjLW1hbmFnZWQtcHJlbWl1bS1jc2kiCiAgICBdLAogICAgInNtYl9zdG9yYWdlX2NsYXNzZXMiOiBbCiAgICAgIHsKICAgICAgICAibmFtZSI6ICJhenVyZWZpbGUtY3NpLWthdGEtY2MiLAogICAgICAgICJtb3VudF9vcHRpb25zIjogWwogICAgICAgICAgImRpcl9tb2RlPTA3NzciLAogICAgICAgICAgImZpbGVfbW9kZT0wNzc3IiwKICAgICAgICAgICJtZnN5bWxpbmtzIiwKICAgICAgICAgICJjYWNoZT1zdHJpY3QiLAogICAgICAgICAgIm5vc2hhcmVzb2NrIiwKICAgICAgICAgICJhY3RpbWVvPTMwIiwKICAgICAgICAgICJub2JybCIKICAgICAgICBdCiAgICAgIH0KICAgIF0KICB9LAogICJzYW5kYm94IjogewogICAgInN0b3JhZ2VzIjogWwogICAgICB7CiAgICAgICAgImRyaXZlciI6ICJlcGhlbWVyYWwiLAogICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICJzb3VyY2UiOiAic2htIiwKICAgICAgICAiZnN0eXBlIjogInRtcGZzIiwKICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAibm9kZXYiLAogICAgICAgICAgIm1vZGU9MTc3NyIsCiAgICAgICAgICAic2l6ZT02NzEwODg2NCIKICAgICAgICBdLAogICAgICAgICJtb3VudF9wb2ludCI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L3NobSIsCiAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICB9CiAgICBdCiAgfSwKICAicmVxdWVzdF9kZWZhdWx0cyI6IHsKICAgICJDcmVhdGVDb250YWluZXJSZXF1ZXN0IjogewogICAgICAiYWxsb3dfZW52X3JlZ2V4IjogWwogICAgICAgICJeSE9TVE5BTUU9JChkbnNfbGFiZWwpJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9QT1JUXyQoaXBfcClfVENQPXRjcDovLyQoaXB2NF9hKTokKGlwX3ApJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9QT1JUXyQoaXBfcClfVENQX1BST1RPPXRjcCQiLAogICAgICAgICJeJChzdmNfbmFtZSlfUE9SVF8kKGlwX3ApX1RDUF9QT1JUPSQoaXBfcCkkIiwKICAgICAgICAiXiQoc3ZjX25hbWUpX1BPUlRfJChpcF9wKV9UQ1BfQUREUj0kKGlwdjRfYSkkIiwKICAgICAgICAiXiQoc3ZjX25hbWUpX1NFUlZJQ0VfSE9TVD0kKGlwdjRfYSkkIiwKICAgICAgICAiXiQoc3ZjX25hbWUpX1NFUlZJQ0VfUE9SVD0kKGlwX3ApJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9TRVJWSUNFX1BPUlRfJChkbnNfbGFiZWwpPSQoaXBfcCkkIiwKICAgICAgICAiXiQoc3ZjX25hbWUpX1BPUlQ9dGNwOi8vJChpcHY0X2EpOiQoaXBfcCkkIiwKICAgICAgICAiXkFaVVJFX0NMSUVOVF9JRD1bQS1GYS1mMC05LV0qJCIsCiAgICAgICAgIl5BWlVSRV9URU5BTlRfSUQ9W0EtRmEtZjAtOS1dKiQiLAogICAgICAgICJeQVpVUkVfRkVERVJBVEVEX1RPS0VOX0ZJTEU9L3Zhci9ydW4vc2VjcmV0cy9henVyZS90b2tlbnMvYXp1cmUtaWRlbnRpdHktdG9rZW4kIiwKICAgICAgICAiXkFaVVJFX0FVVEhPUklUWV9IT1NUPWh0dHBzOi8vbG9naW5cXC5taWNyb3NvZnRvbmxpbmVcXC5jb20vJCIsCiAgICAgICAgIl5URVJNPXh0ZXJtJCIKICAgICAgXSwKICAgICAgImFsbG93X2Vudl9yZWdleF9tYXAiOiB7CiAgICAgICAgIkNQVV9MSU1JVCI6ICJeWzAtOV0rJCIsCiAgICAgICAgIkpPQl9DT01QTEVUSU9OX0lOREVYIjogIl5bMC05XSokIiwKICAgICAgICAiTUVNT1JZX0xJTUlUIjogIl5bMC05XSskIgogICAgICB9CiAgICB9LAogICAgIkNvcHlGaWxlUmVxdWVzdCI6IFsKICAgICAgIiQoc2ZwcmVmaXgpIgogICAgXSwKICAgICJFeGVjUHJvY2Vzc1JlcXVlc3QiOiB7CiAgICAgICJhbGxvd2VkX2NvbW1hbmRzIjogW10sCiAgICAgICJyZWdleCI6IFtdCiAgICB9LAogICAgIlVwZGF0ZVJvdXRlc1JlcXVlc3QiOiB7CiAgICAgICJmb3JiaWRkZW5fZGV2aWNlX25hbWVzIjogWwogICAgICAgICJsbyIKICAgICAgXSwKICAgICAgImZvcmJpZGRlbl9zb3VyY2VfcmVnZXgiOiBbCiAgICAgICAgIl4oPzowezAsNH06KXswLDd9MHswLDN9MSQiLAogICAgICAgICJeMTI3XFwuKD86WzAtOV17MSwzfVxcLil7Mn1bMC05XXsxLDN9JCIKICAgICAgXQogICAgfSwKICAgICJVcGRhdGVJbnRlcmZhY2VSZXF1ZXN0IjogewogICAgICAiYWxsb3dfcmF3X2ZsYWdzIjogMTI4LAogICAgICAiZm9yYmlkZGVuX25hbWVzIjogWwogICAgICAgICJsbyIKICAgICAgXSwKICAgICAgImZvcmJpZGRlbl9od19hZGRycyI6IFsKICAgICAgICAiMDA6MDA6MDA6MDA6MDA6MDAiCiAgICAgIF0KICAgIH0sCiAgICAiQ2xvc2VTdGRpblJlcXVlc3QiOiBmYWxzZSwKICAgICJSZWFkU3RyZWFtUmVxdWVzdCI6IGZhbHNlLAogICAgIlVwZGF0ZUVwaGVtZXJhbE1vdW50c1JlcXVlc3QiOiBmYWxzZSwKICAgICJXcml0ZVN0cmVhbVJlcXVlc3QiOiBmYWxzZQogIH0KfQ== +spec: + containers: + - command: + - sh + image: "registry.k8s.io/e2e-test-images/agnhost:2.40" + imagePullPolicy: IfNotPresent + name: agnhost-container + resources: {} + securityContext: {} + terminationMessagePath: /dev/termination-log + terminationMessagePolicy: File + volumeMounts: + - mountPath: /test-volume + name: test-volume + readOnly: true + - mountPath: /var/run/secrets/kubernetes.io/serviceaccount + name: kube-api-access-f8d29 + readOnly: true + dnsPolicy: ClusterFirst + enableServiceLinks: true + preemptionPolicy: PreemptLowerPriority + priority: 0 + restartPolicy: Never + runtimeClassName: kata-cc + schedulerName: default-scheduler + securityContext: {} + serviceAccount: default + serviceAccountName: default + terminationGracePeriodSeconds: 0 + tolerations: + - effect: NoExecute + key: node.kubernetes.io/not-ready + operator: Exists + tolerationSeconds: 300 + - effect: NoExecute + key: node.kubernetes.io/unreachable + operator: Exists + tolerationSeconds: 300 + volumes: + - name: test-volume + projected: + defaultMode: 420 + sources: + - serviceAccountToken: + expirationSeconds: 3600 + path: token + - name: kube-api-access-f8d29 + projected: + defaultMode: 420 + sources: + - serviceAccountToken: + expirationSeconds: 3607 + path: token + - configMap: + items: + - key: ca.crt + path: ca.crt + name: kube-root-ca.crt + - downwardAPI: + items: + - fieldRef: + apiVersion: v1 + fieldPath: metadata.namespace + path: namespace +status: {} diff --git a/src/agent/samples/policy/yaml/webhook2/webhook-pod10.yaml b/src/agent/samples/policy/yaml/webhook2/webhook-pod10.yaml new file mode 100644 index 000000000000..e2c91c56be50 --- /dev/null +++ b/src/agent/samples/policy/yaml/webhook2/webhook-pod10.yaml @@ -0,0 +1,130 @@ +--- +apiVersion: v1 +kind: Namespace +metadata: + name: downward-api-7206 +--- +apiVersion: v1 +kind: Pod +metadata: + creationTimestamp: ~ + labels: + name: downward-api-ec0a2ec1-9bc6-4c1b-b767-9f4611849b45 + managedFields: + - apiVersion: v1 + fieldsType: FieldsV1 + fieldsV1: + "f:metadata": + "f:labels": + ".": {} + "f:name": {} + "f:spec": + "f:containers": + "k:{\"name\":\"dapi-container\"}": + ".": {} + "f:command": {} + "f:env": + ".": {} + "k:{\"name\":\"POD_UID\"}": + ".": {} + "f:name": {} + "f:valueFrom": + ".": {} + "f:fieldRef": {} + "f:image": {} + "f:imagePullPolicy": {} + "f:name": {} + "f:resources": + ".": {} + "f:limits": + ".": {} + "f:cpu": {} + "f:memory": {} + "f:requests": + ".": {} + "f:cpu": {} + "f:memory": {} + "f:terminationMessagePath": {} + "f:terminationMessagePolicy": {} + "f:dnsPolicy": {} + "f:enableServiceLinks": {} + "f:restartPolicy": {} + "f:schedulerName": {} + "f:securityContext": {} + "f:terminationGracePeriodSeconds": {} + manager: e2e.test + operation: Update + time: "2023-06-20T22:08:50Z" + name: downward-api-ec0a2ec1-9bc6-4c1b-b767-9f4611849b45 + namespace: downward-api-7206 + annotations: + io.katacontainers.config.agent.policy: IyBDb3B5cmlnaHQgKGMpIDIwMjMgTWljcm9zb2Z0IENvcnBvcmF0aW9uCiMKIyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMAojCnBhY2thZ2UgYWdlbnRfcG9saWN5CgppbXBvcnQgZnV0dXJlLmtleXdvcmRzLmluCmltcG9ydCBmdXR1cmUua2V5d29yZHMuZXZlcnkKCiMgRGVmYXVsdCB2YWx1ZXMsIHJldHVybmVkIGJ5IE9QQSB3aGVuIHJ1bGVzIGNhbm5vdCBiZSBldmFsdWF0ZWQgdG8gdHJ1ZS4KZGVmYXVsdCBBZGRBUlBOZWlnaGJvcnNSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgQWRkU3dhcFJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBDbG9zZVN0ZGluUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IENvcHlGaWxlUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IENyZWF0ZUNvbnRhaW5lclJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBDcmVhdGVTYW5kYm94UmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IERlc3Ryb3lTYW5kYm94UmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgRXhlY1Byb2Nlc3NSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgR2V0T09NRXZlbnRSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBHdWVzdERldGFpbHNSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBMaXN0SW50ZXJmYWNlc1JlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBMaXN0Um91dGVzUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IE1lbUhvdHBsdWdCeVByb2JlUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IE9ubGluZUNQVU1lbVJlcXVlc3QgOj0gdHJ1ZQpkZWZhdWx0IFBhdXNlQ29udGFpbmVyUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFJlYWRTdHJlYW1SZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgUmVtb3ZlQ29udGFpbmVyUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgUmVtb3ZlU3RhbGVWaXJ0aW9mc1NoYXJlTW91bnRzUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgUmVzZWVkUmFuZG9tRGV2UmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFJlc3VtZUNvbnRhaW5lclJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBTZXRHdWVzdERhdGVUaW1lUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFNldFBvbGljeVJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBTaWduYWxQcm9jZXNzUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgU3RhcnRDb250YWluZXJSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBTdGFydFRyYWNpbmdSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgU3RhdHNDb250YWluZXJSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBTdG9wVHJhY2luZ1JlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBUdHlXaW5SZXNpemVSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBVcGRhdGVDb250YWluZXJSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgVXBkYXRlRXBoZW1lcmFsTW91bnRzUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFVwZGF0ZUludGVyZmFjZVJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBVcGRhdGVSb3V0ZXNSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgV2FpdFByb2Nlc3NSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBXcml0ZVN0cmVhbVJlcXVlc3QgOj0gZmFsc2UKCiMgQWxsb3dSZXF1ZXN0c0ZhaWxpbmdQb2xpY3kgOj0gdHJ1ZSBjb25maWd1cmVzIHRoZSBBZ2VudCB0byAqYWxsb3cgYW55CiMgcmVxdWVzdHMgY2F1c2luZyBhIHBvbGljeSBmYWlsdXJlKi4gVGhpcyBpcyBhbiB1bnNlY3VyZSBjb25maWd1cmF0aW9uCiMgYnV0IGlzIHVzZWZ1bCBmb3IgYWxsb3dpbmcgdW5zZWN1cmUgcG9kcyB0byBzdGFydCwgdGhlbiBjb25uZWN0IHRvCiMgdGhlbSBhbmQgaW5zcGVjdCBPUEEgbG9ncyBmb3IgdGhlIHJvb3QgY2F1c2Ugb2YgYSBmYWlsdXJlLgpkZWZhdWx0IEFsbG93UmVxdWVzdHNGYWlsaW5nUG9saWN5IDo9IGZhbHNlCgojIENvbnN0YW50cwpTX05BTUVfS0VZID0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZSIKU19OQU1FU1BBQ0VfS0VZID0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZXNwYWNlIgpCVU5ETEVfSUQgPSAiW2EtejAtOV17NjR9IgoKQ3JlYXRlQ29udGFpbmVyUmVxdWVzdDo9IHJlc3AgewogICAgbm90IGlzX251bGwoaW5wdXQuZW52X21hcCkKICAgIAogICAgaV9lbnZfbWFwIDo9IGlucHV0LmVudl9tYXAKICAgIAogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBwX2Vudl9tYXAgOj0gcF9jb250YWluZXIuZW52X21hcCAgCiAgICBhbGxvd19lbnZfbWFwKHBfZW52X21hcCwgaV9lbnZfbWFwKQogICAgCiAgICBpX3Byb2Nlc3MgOj0gaW5wdXQuYmFzZS5PQ0kuUHJvY2VzcwogICAgCiAgICBwX3Byb2Nlc3MgOj0gcF9jb250YWluZXIuT0NJLlByb2Nlc3MKICAgIAogICAgYWxsb3dfYXJncyhpX3Byb2Nlc3MsIHBfcHJvY2VzcywgaV9lbnZfbWFwKQoKICAgIHJlc3AgPSBDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uKGlucHV0LmJhc2UpCiAgICBwcmludCgiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdDogdHJ1ZSIpCn0KCmFsbG93X2FyZ3MoaV9wcm9jZXNzLCBwX3Byb2Nlc3MsIGlfZW52X21hcCkgewogICAgaV9hcmdzIDo9IGlfcHJvY2Vzcy5BcmdzCiAgICBwX2FyZ3MgOj0gcF9wcm9jZXNzLkFyZ3MKICAgIHByaW50KCJhbGxvd19hcmdzOiBpX2FyZ3MgPSIsIGlfYXJncywgInBfYXJncyA9IiwgcF9hcmdzKQogICAgY291bnQoaV9hcmdzKSA9PSBjb3VudChwX2FyZ3MpCiAgICBldmVyeSBpLCBpX2FyZyBpbiBpX2FyZ3MgewogICAgICAgIHByaW50KCJhbGxvd19hcmdzOiBpX2FyZyA9IiwgaV9hcmcpCiAgICAgICAgcF9hcmdfcmVwbGFjZWQgOj0gcmVwbGFjZV9lbnZfdmFyaWFibGVzKHBfYXJnc1tpXSwgaV9lbnZfbWFwKQogICAgICAgIHByaW50KCJhbGxvd19hcmdzOiBwX2FyZ19yZXBsYWNlZCA9IiwgcF9hcmdfcmVwbGFjZWQpCiAgICAgICAgcF9hcmdfcmVwbGFjZWQyIDo9IHJlcGxhY2UocF9hcmdfcmVwbGFjZWQsICIkJCIsICIkIikKICAgICAgICBwcmludCgiYWxsb3dfYXJnczogcF9hcmdfcmVwbGFjZWQyID0iLCBwX2FyZ19yZXBsYWNlZDIpCiAgICAgICAgaV9hcmcgPT0gcF9hcmdfcmVwbGFjZWQyCiAgICB9CiAgICBwcmludCgiYWxsb3dfYXJnczogdHJ1ZSIpCn0KCmFsbG93X2FyZ3MoaV9wcm9jZXNzLCBwX3Byb2Nlc3MsIGlfZW52X21hcCkgewogICAgbm90IGlfcHJvY2Vzcy5BcmdzCiAgICBub3QgcF9wcm9jZXNzLkFyZ3MKICAgIHByaW50KCJhbGxvd19hcmdzMjogbm8gYXJncyIpCn0KCiMgdGhpcyBmdW5jdGlvbiByZXBsYWNlcyBhbGwgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyBpbiBhIHN0cmluZywgZ2l2ZW4gYSBtYXAgb2YgZW52aXJvbm1lbnQga2V5cyB0byBlbnZpcm9ubWVudCB2YWx1ZXMKIyBlZyBzdHIgPSAiZWNobyAkKENMVVNURVJfSUQpOyBlY2hvICQoTk9ERV9OQU1FKTsiCiMgZW52X21hcCA9IHsiQ0xVU1RFUl9JRCI6ICJhYmMiLCAiTk9ERV9OQU1FIiA6ICJ4eXoifQojIHJlc3VsdCA9ICJlY2hvIGFiYzsgZWNobyB4eXo7IgpyZXBsYWNlX2Vudl92YXJpYWJsZXMoc3RyLCBlbnZfbWFwKSA9IHJlc3VsdCB7CiAgICAjIG1ha2UgYW4gYXJyYXkgb2YgdGhlIGtleXMgZWcgWyJDTFVTVEVSX0lEIiwgIk5PREVfTkFNRSJdCiAgICBrZXlzIDo9IFt4IHwgc29tZSB4IGluIG9iamVjdC5rZXlzKGVudl9tYXApXQogICAgcmVzdWx0IDo9IHJlcGxhY2Vfc3RyX3JlYyhzdHIsIGVudl9tYXAsIGtleXMsIGNvdW50KGtleXMpIC0gMSkKfQoKIyBiYXNlIGNhc2UKcmVwbGFjZV9zdHJfcmVjKHN0ciwgZW52X21hcCwgYXJyX2tleXMsIGkpID0gcmVzdWx0IHsKICAgIGkgPCAwCiAgICByZXN1bHQgOj0gc3RyCn0KCiMgcmVjdXJzaXZlIHN0ZXAKcmVwbGFjZV9zdHJfcmVjKHN0ciwgZW52X21hcCwgYXJyX2tleXMsIGkpID0gcmVzdWx0IHsKICAgIGkgPj0gMAogICAga2V5IDo9IGFycl9rZXlzW2ldCiAgICBlbnZfa2V5MSA6PSBjb25jYXQoIiIsIFsiJCgiLCBrZXksICIpIl0pCiAgICAjIHJlcGxhY2UgJChWQVIpIHdpdGggdmFsdWUKICAgIG5ld19zdHIxIDo9IHJlcGxhY2Uoc3RyLCBlbnZfa2V5MSwgZW52X21hcFtrZXldKQogICAgIyByZXBsYWNlIG5leHQgZW52aXJvbm1lbnQgdmFyaWFibGUKICAgIHJlc3VsdCA9IHJlcGxhY2Vfc3RyX3JlYyhuZXdfc3RyMSwgZW52X21hcCwgYXJyX2tleXMsIGkgLSAxKQp9CgphbGxvd19lbnZfbWFwKHBfZW52X21hcCwgaV9lbnZfbWFwKSB7CiAgICBwcmludCgiYWxsb3dfZW52X21hcDogcF9lbnZfbWFwID0iLCBwX2Vudl9tYXApCiAgICBldmVyeSBlbnZfa2V5LCBlbnZfdmFsIGluIGlfZW52X21hcCB7CiAgICAgICAgcHJpbnQoImFsbG93X2VudjogZW52X2tleSA9IiwgZW52X2tleSwgImVudl92YWwgPSIsIGVudl92YWwpCiAgICAgICAgYWxsb3dfZW52X21hcF9lbnRyeShlbnZfa2V5LCBlbnZfdmFsLCBwX2Vudl9tYXApCiAgICB9CiAgICBwcmludCgiYWxsb3dfZW52X21hcDogdHJ1ZSIpCn0KCiMgQWxsb3cgZXhhY3QgbWF0Y2gKYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBpX3ZhbCA9PSBwX3ZhbAogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnk6IHRydWUiKQp9CgojIEFsbG93IHJlc291cmNlRmllbGRSZWYgdmFsdWVzIChlLmcuLCAibGltaXRzLmNwdSIpLgphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgICMgYSB2YXJpYWJsZSB3ZSBzaG91bGQgYmUgdmFsaWRhdGluZyB1c2luZyBhIHJlZ2V4IGZyb20gc2V0dGluZ3MKICAgIHBfdmFsID09ICIkKHZhbGlkYXRlLWZyb20tc2V0dGluZ3MpIgogICAgcmVnZXhfdmFsIDo9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuQ3JlYXRlQ29udGFpbmVyUmVxdWVzdC5hbGxvd19lbnZfcmVnZXhfbWFwW2tleV0KICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4X3ZhbCwgaV92YWwpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSAyOiB0cnVlIikKfQoKIyBBbGxvdyBub2RlLW5hbWUKYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChub2RlLW5hbWUpIgogICAgcmVnZXgubWF0Y2gocG9saWN5X2RhdGEuY29tbW9uLmRuc19zdWJkb21haW4gLCBpX3ZhbCkKICAgIHByaW50KCJhbGxvd19lbnZfbWFwX2VudHJ5IDM6IHRydWUiKQp9CgojIEFsbG93IGhvc3QtbmFtZQphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgIHBfdmFsID09ICIkKGhvc3QtbmFtZSkiCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24uZG5zX2xhYmVsICwgaV92YWwpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSA0OiB0cnVlIikKfQoKIyBBbGxvdyBwb2QtdWlkCmFsbG93X2Vudl9tYXBfZW50cnkoa2V5LCBpX3ZhbCwgcF9lbnZfbWFwKSB7CiAgICBwX3ZhbCA6PSBwX2Vudl9tYXBba2V5XQogICAgcF92YWwgPT0gIiQocG9kLXVpZCkiCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24ucG9kX3VpZCAsIGlfdmFsKQogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgNTogdHJ1ZSIpCn0KCiMgQWxsb3cgZmllbGRSZWYgImZpZWxkUGF0aDogc3RhdHVzLnBvZElQIiB2YWx1ZXMuCmFsbG93X2Vudl9tYXBfZW50cnkoa2V5LCBpX3ZhbCwgcF9lbnZfbWFwKSB7CiAgICBpc19pcChpX3ZhbCkKCiAgICBwX3ZhbCA6PSBwX2Vudl9tYXBba2V5XQogICAgcF92YXIgOj0gY29uY2F0KCI9IiwgW2tleSwgcF92YWxdKQogICAgYWxsb3dfcG9kX2lwX3ZhcihrZXksIHBfdmFyKQogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgNjogdHJ1ZSIpCn0KCiMgQWxsb3cgZmllbGRSZWYgImZpZWxkUGF0aDogc3RhdHVzLmhvc3RJUCIgdmFsdWVzLgphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgaXNfaXAoaV92YWwpCgogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgIHBfdmFyIDo9IGNvbmNhdCgiPSIsIFtrZXksIHBfdmFsXSkKICAgIGFsbG93X2hvc3RfaXBfdmFyKGtleSwgcF92YXIpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSA3OiB0cnVlIikKfQoKIyBNYXRjaCBpbnB1dCB3aXRoIG9uZSBvZiB0aGUgcG9saWN5IHZhcmlhYmxlcywgYWZ0ZXIgc3Vic3RpdHV0aW5nICQoc2FuZGJveC1uYW1lKS4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChzYW5kYm94LW5hbWUpIgogICAgc19uYW1lIDo9IGlucHV0LmJhc2UuT0NJLkFubm90YXRpb25zW1NfTkFNRV9LRVldCiAgICBwX3ZhcjIgOj0gcmVwbGFjZShwX3ZhbCwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHBfdmFyMiA9PSBpX3ZhbAogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgODogdHJ1ZSIpCn0KCiMgTWF0Y2ggaW5wdXQgd2l0aCBvbmUgb2YgdGhlIHBvbGljeSB2YXJpYWJsZXMsIGFmdGVyIHN1YnN0aXR1dGluZyAkKHNhbmRib3gtbmFtZXNwYWNlKS4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChzYW5kYm94LW5hbWVzcGFjZSkiCiAgICBzX25hbWVzcGFjZSA6PSBpbnB1dC5iYXNlLk9DSS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwX3ZhcjIgOj0gcmVwbGFjZShwX3ZhbCwgIiQoc2FuZGJveC1uYW1lc3BhY2UpIiwgc19uYW1lc3BhY2UpCiAgICBwX3ZhcjIgPT0gaV92YWwKICAgIHByaW50KCJhbGxvd19lbnZfbWFwX2VudHJ5IDk6IHRydWUiKQp9CgojIEFsbG93IGlucHV0IGVudiB2YXJpYWJsZXMgdGhhdCBtYXRjaCB3aXRoIGEgcmVxdWVzdF9kZWZhdWx0cyByZWdleC4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHNvbWUgcF9yZWdleDEgaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5DcmVhdGVDb250YWluZXJSZXF1ZXN0LmFsbG93X2Vudl9yZWdleAogICAgcF9yZWdleDIgOj0gcmVwbGFjZShwX3JlZ2V4MSwgIiQoaXB2NF9hKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcHY0X2EpCiAgICBwX3JlZ2V4MyA6PSByZXBsYWNlKHBfcmVnZXgyLCAiJChpcF9wKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcF9wKQogICAgcF9yZWdleDQgOj0gcmVwbGFjZShwX3JlZ2V4MywgIiQoc3ZjX25hbWUpIiwgcG9saWN5X2RhdGEuY29tbW9uLnN2Y19uYW1lKQogICAgcF9yZWdleDUgOj0gcmVwbGFjZShwX3JlZ2V4NCwgIiQoZG5zX2xhYmVsKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5kbnNfbGFiZWwpCgogICAgcmVzdWx0IDo9IGNvbmNhdCgiPSIsIFtrZXksIGlfdmFsXSkKICAgIHJlZ2V4Lm1hdGNoKHBfcmVnZXg1LCByZXN1bHQpCgogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgMTA6IHRydWUiKQp9CgpDcmVhdGVDb250YWluZXJSZXF1ZXN0Oj0gcmVzcCB7CiAgICBub3QgaW5wdXQuZW52X21hcAogICAgaV9wcm9jZXNzID0gaW5wdXQuT0NJLlByb2Nlc3MKICAgIHNfbmFtZSA9IGlucHV0Lk9DSS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBwX3Byb2Nlc3MgPSBwX2NvbnRhaW5lci5PQ0kuUHJvY2VzcwogICAgYWxsb3dfZGVwcmVjYXRlZF9hcmdzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUpCiAgICByZXNwID0gQ3JlYXRlQ29udGFpbmVyUmVxdWVzdENvbW1vbihpbnB1dCkKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0MjogdHJ1ZSIpCn0KCkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb24ocmVxKTo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgICMgQ2hlY2sgaWYgdGhlIGlucHV0IHJlcXVlc3Qgc2hvdWxkIGJlIHJlamVjdGVkIGV2ZW4gYmVmb3JlIGNoZWNraW5nIHRoZQogICAgIyBwb2xpY3lfZGF0YS5jb250YWluZXJzIGluZm9ybWF0aW9uLgogICAgYWxsb3dfY3JlYXRlX2NvbnRhaW5lcl9pbnB1dChyZXEpCgogICAgaV9vY2kgOj0gcmVxLk9DSQogICAgaV9zdG9yYWdlcyA6PSByZXEuc3RvcmFnZXMKICAgIGlfZGV2aWNlcyA6PSByZXEuZGV2aWNlcwoKICAgICMgYXJyYXkgb2YgcG9zc2libGUgc3RhdGUgb3BlcmF0aW9ucwogICAgb3BzX2J1aWxkZXIgOj0gW10KCiAgICAjIGNoZWNrIHNhbmRib3ggbmFtZQogICAgc2FuZGJveF9uYW1lID0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FX0tFWV0KICAgIGFkZF9zYW5kYm94X25hbWVfdG9fc3RhdGUgOj0gc3RhdGVfYWxsb3dzKCJzYW5kYm94X25hbWUiLCBzYW5kYm94X25hbWUpCiAgICBvcHNfYnVpbGRlcjEgOj0gY29uY2F0X29wX2lmX25vdF9udWxsKG9wc19idWlsZGVyLCBhZGRfc2FuZGJveF9uYW1lX3RvX3N0YXRlKQoKICAgICMgQ2hlY2sgaWYgYW55IGVsZW1lbnQgZnJvbSB0aGUgcG9saWN5X2RhdGEuY29udGFpbmVycyBhcnJheSBhbGxvd3MgdGhlIGlucHV0IHJlcXVlc3QuCiAgICBzb21lIHBfY29udGFpbmVyIGluIHBvbGljeV9kYXRhLmNvbnRhaW5lcnMKICAgIHByaW50KCI9PT09PT09PSBDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiB0cnlpbmcgbmV4dCBwb2xpY3kgY29udGFpbmVyIikKCiAgICBwX3BpZG5zIDo9IHBfY29udGFpbmVyLnNhbmRib3hfcGlkbnMKICAgIGlfcGlkbnMgOj0gcmVxLnNhbmRib3hfcGlkbnMKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiBwX3BpZG5zID0iLCBwX3BpZG5zLCAiaV9waWRucyA9IiwgaV9waWRucykKICAgIHBfcGlkbnMgPT0gaV9waWRucwoKICAgIHBfb2NpIDo9IHBfY29udGFpbmVyLk9DSQoKICAgICMgY2hlY2sgbmFtZXNwYWNlCiAgICBwX25hbWVzcGFjZSA6PSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBpX25hbWVzcGFjZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwcmludCAoIkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb246IHBfbmFtZXNwYWNlID0iLCBwX25hbWVzcGFjZSwgImlfbmFtZXNwYWNlID0iLCBpX25hbWVzcGFjZSkKICAgIGFkZF9uYW1lc3BhY2VfdG9fc3RhdGUgOj0gYWxsb3dfbmFtZXNwYWNlKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkKICAgIG9wc19idWlsZGVyMiA6PSBjb25jYXRfb3BfaWZfbm90X251bGwob3BzX2J1aWxkZXIxLCBhZGRfbmFtZXNwYWNlX3RvX3N0YXRlKQoKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiBwIFZlcnNpb24gPSIsIHBfb2NpLlZlcnNpb24sICJpIFZlcnNpb24gPSIsIGlfb2NpLlZlcnNpb24pCiAgICBwX29jaS5WZXJzaW9uID09IGlfb2NpLlZlcnNpb24KCiAgICBwcmludCgiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdENvbW1vbjogcCBSZWFkb25seSA9IiwgcF9vY2kuUm9vdC5SZWFkb25seSwgImkgUmVhZG9ubHkgPSIsIGlfb2NpLlJvb3QuUmVhZG9ubHkpCiAgICBwX29jaS5Sb290LlJlYWRvbmx5ID09IGlfb2NpLlJvb3QuUmVhZG9ubHkKCiAgICBhbGxvd19hbm5vKHBfb2NpLCBpX29jaSkKCiAgICBwX3N0b3JhZ2VzIDo9IHBfY29udGFpbmVyLnN0b3JhZ2VzCiAgICBhbGxvd19ieV9hbm5vKHBfb2NpLCBpX29jaSwgcF9zdG9yYWdlcywgaV9zdG9yYWdlcykKCiAgICBwX2RldmljZXMgOj0gcF9jb250YWluZXIuZGV2aWNlcwogICAgYWxsb3dfZGV2aWNlcyhwX2RldmljZXMsIGlfZGV2aWNlcykKCiAgICByZXQgOj0gYWxsb3dfbGludXgob3BzX2J1aWxkZXIyLCBwX29jaSwgaV9vY2kpCiAgICByZXQuYWxsb3dlZAoKICAgIG9wcyA6PSByZXQub3BzCgogICAgcHJpbnQoIkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb246IHRydWUiKQp9CgphbGxvd19jcmVhdGVfY29udGFpbmVyX2lucHV0KHJlcSkgewogICAgcHJpbnQoImFsbG93X2NyZWF0ZV9jb250YWluZXJfaW5wdXQ6IGlucHV0ID0iLCByZXEpCgogICAgY291bnQocmVxLnNoYXJlZF9tb3VudHMpID09IDAKICAgIGlzX251bGwocmVxLnN0cmluZ191c2VyKQoKICAgIGlfb2NpIDo9IHJlcS5PQ0kKICAgIGlzX251bGwoaV9vY2kuSG9va3MpCiAgICBpc19udWxsKGlfb2NpLlNvbGFyaXMpCiAgICBpc19udWxsKGlfb2NpLldpbmRvd3MpCgogICAgaV9saW51eCA6PSBpX29jaS5MaW51eAogICAgY291bnQoaV9saW51eC5HSURNYXBwaW5ncykgPT0gMAogICAgY291bnQoaV9saW51eC5Nb3VudExhYmVsKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlJlc291cmNlcy5EZXZpY2VzKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlJvb3Rmc1Byb3BhZ2F0aW9uKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlVJRE1hcHBpbmdzKSA9PSAwCiAgICBpc19udWxsKGlfbGludXguSW50ZWxSZHQpCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLkJsb2NrSU8pCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLk5ldHdvcmspCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLlBpZHMpCiAgICBpc19udWxsKGlfbGludXguU2VjY29tcCkKCiAgICBpX3Byb2Nlc3MgOj0gaV9vY2kuUHJvY2VzcwogICAgY291bnQoaV9wcm9jZXNzLlNlbGludXhMYWJlbCkgPT0gMAogICAgY291bnQoaV9wcm9jZXNzLlVzZXIuVXNlcm5hbWUpID09IDAKCiAgICBwcmludCgiYWxsb3dfY3JlYXRlX2NvbnRhaW5lcl9pbnB1dDogdHJ1ZSIpCn0KCmFsbG93X25hbWVzcGFjZShwX25hbWVzcGFjZSwgaV9uYW1lc3BhY2UpID0gYWRkX25hbWVzcGFjZSB7CiAgICBwX25hbWVzcGFjZSA9PSBpX25hbWVzcGFjZQogICAgYWRkX25hbWVzcGFjZSA6PSBudWxsCiAgICBwcmludCgiYWxsb3dfbmFtZXNwYWNlIDE6IGlucHV0IG5hbWVzcGFjZSBtYXRjaGVzIHBvbGljeSBkYXRhIikKfQoKYWxsb3dfbmFtZXNwYWNlKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkgPSBhZGRfbmFtZXNwYWNlIHsKICAgIHBfbmFtZXNwYWNlID09ICIiCiAgICBwcmludCgiYWxsb3dfbmFtZXNwYWNlIDI6IG5vIG5hbWVzcGFjZSBmb3VuZCBvbiBwb2xpY3kgZGF0YSIpCiAgICBhZGRfbmFtZXNwYWNlIDo9IHN0YXRlX2FsbG93cygibmFtZXNwYWNlIiwgaV9uYW1lc3BhY2UpCn0KCiMgdmFsdWUgaGFzbid0IGJlZW4gc2VlbiBiZWZvcmUsIHNhdmUgaXQgdG8gc3RhdGUKc3RhdGVfYWxsb3dzKGtleSwgdmFsdWUpID0gYWN0aW9uIHsKICBzdGF0ZSA6PSBnZXRfc3RhdGUoKQogIHByaW50KCJzdGF0ZV9hbGxvd3MgMTogc3RhdGVba2V5XSA9Iiwgc3RhdGVba2V5XSwgInZhbHVlID0iLCB2YWx1ZSkKICBub3Qgc3RhdGVba2V5XQogIHByaW50KCJzdGF0ZV9hbGxvd3MgMTogc2F2aW5nIHRvIHN0YXRlIGtleSA9Iiwga2V5LCAidmFsdWUgPSIsIHZhbHVlKQogIHBhdGggOj0gZ2V0X3N0YXRlX3BhdGgoa2V5KSAKICBhY3Rpb24gOj0gewogICAgIm9wIjogImFkZCIsCiAgICAicGF0aCI6IHBhdGgsIAogICAgInZhbHVlIjogdmFsdWUsCiAgfQp9CgojIHZhbHVlIG1hdGNoZXMgd2hhdCdzIGluIHN0YXRlLCBhbGxvdyBpdApzdGF0ZV9hbGxvd3Moa2V5LCB2YWx1ZSkgPSBhY3Rpb24gewogIHByaW50KCJzdGF0ZV9hbGxvd3MgMjogc3RhcnQiKQogIHN0YXRlIDo9IGdldF9zdGF0ZSgpCiAgcHJpbnQoInN0YXRlX2FsbG93cyAyOiBzdGF0ZVtrZXldID0iLCBzdGF0ZVtrZXldLCAidmFsdWUgPSIsIHZhbHVlKQogIHZhbHVlID09IHN0YXRlW2tleV0KICBwcmludCgic3RhdGVfYWxsb3dzIDI6IGZvdW5kIGtleSA9Iiwga2V5LCAidmFsdWUgPSIsIHZhbHVlLCAiIGluIHN0YXRlIikKICBhY3Rpb24gOj0gbnVsbAp9CgojIGhlbHBlciBmdW5jdGlvbnMgdG8gaW50ZXJhY3Qgd2l0aCB0aGUgc3RhdGUKZ2V0X3N0YXRlKCkgPSBzdGF0ZSB7CiAgc3RhdGUgOj0gZGF0YVsicHN0YXRlIl0KfQoKZ2V0X3N0YXRlX3ZhbChrZXkpID0gdmFsdWUgewogICAgc3RhdGUgOj0gZ2V0X3N0YXRlKCkKICAgIHZhbHVlIDo9IHN0YXRlW2tleV0KfQoKZ2V0X3N0YXRlX3BhdGgoa2V5KSA9IHBhdGggewogICAgIyBwcmVwZW5kICIvcHN0YXRlLyIgdG8ga2V5CiAgICBwYXRoIDo9IGNvbmNhdCgiLyIsIFsiL3BzdGF0ZSIsIGtleV0pCn0KCiMgSGVscGVyIGZ1bmN0aW9ucyB0byBjb25kaXRpb25hbGx5IGNvbmNhdGVuYXRlIG9wIGlzIG5vdCBudWxsCmNvbmNhdF9vcF9pZl9ub3RfbnVsbChvcHMsIG9wKSA9IHJlc3VsdCB7CiAgICBvcCA9PSBudWxsCiAgICByZXN1bHQgOj0gb3BzCn0KCmNvbmNhdF9vcF9pZl9ub3RfbnVsbChvcHMsIG9wKSA9IHJlc3VsdCB7CiAgICBvcCAhPSBudWxsCiAgICByZXN1bHQgOj0gYXJyYXkuY29uY2F0KG9wcywgW29wXSkKfQoKIyBSZWplY3QgdW5leHBlY3RlZCBhbm5vdGF0aW9ucy4KYWxsb3dfYW5ubyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19hbm5vIDE6IHN0YXJ0IikKCiAgICBub3QgaV9vY2kuQW5ub3RhdGlvbnMKCiAgICBwcmludCgiYWxsb3dfYW5ubyAxOiB0cnVlIikKfQphbGxvd19hbm5vKHBfb2NpLCBpX29jaSkgewogICAgcHJpbnQoImFsbG93X2Fubm8gMjogcCBBbm5vdGF0aW9ucyA9IiwgcF9vY2kuQW5ub3RhdGlvbnMpCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiBpIEFubm90YXRpb25zID0iLCBpX29jaS5Bbm5vdGF0aW9ucykKCiAgICBpX2tleXMgOj0gb2JqZWN0LmtleXMoaV9vY2kuQW5ub3RhdGlvbnMpCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiBpIGtleXMgPSIsIGlfa2V5cykKCiAgICBldmVyeSBpX2tleSBpbiBpX2tleXMgewogICAgICAgIGFsbG93X2Fubm9fa2V5KGlfa2V5LCBwX29jaSkKICAgIH0KCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiB0cnVlIikKfQoKYWxsb3dfYW5ub19rZXkoaV9rZXksIHBfb2NpKSB7CiAgICBwcmludCgiYWxsb3dfYW5ub19rZXkgMTogaSBrZXkgPSIsIGlfa2V5KQoKICAgIHN0YXJ0c3dpdGgoaV9rZXksICJpby5rdWJlcm5ldGVzLmNyaS4iKQoKICAgIHByaW50KCJhbGxvd19hbm5vX2tleSAxOiB0cnVlIikKfQphbGxvd19hbm5vX2tleShpX2tleSwgcF9vY2kpIHsKICAgIHByaW50KCJhbGxvd19hbm5vX2tleSAyOiBpIGtleSA9IiwgaV9rZXkpCgogICAgc29tZSBwX2tleSwgXyBpbiBwX29jaS5Bbm5vdGF0aW9ucwogICAgcF9rZXkgPT0gaV9rZXkKCiAgICBwcmludCgiYWxsb3dfYW5ub19rZXkgMjogdHJ1ZSIpCn0KCiMgR2V0IHRoZSB2YWx1ZSBvZiB0aGUgU19OQU1FX0tFWSBhbm5vdGF0aW9uIGFuZAojIGNvcnJlbGF0ZSBpdCB3aXRoIG90aGVyIGFubm90YXRpb25zIGFuZCBwcm9jZXNzIGZpZWxkcy4KYWxsb3dfYnlfYW5ubyhwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpIHsKICAgIHByaW50KCJhbGxvd19ieV9hbm5vIDE6IHN0YXJ0IikKCiAgICBub3QgcF9vY2kuQW5ub3RhdGlvbnNbU19OQU1FX0tFWV0KCiAgICBpX3NfbmFtZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMTogaV9zX25hbWUgPSIsIGlfc19uYW1lKQoKICAgIGlfc19uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FU1BBQ0VfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMTogaV9zX25hbWVzcGFjZSA9IiwgaV9zX25hbWVzcGFjZSkKCiAgICBhbGxvd19ieV9zYW5kYm94X25hbWUocF9vY2ksIGlfb2NpLCBwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBpX3NfbmFtZSwgaV9zX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfYnlfYW5ubyAxOiB0cnVlIikKfQphbGxvd19ieV9hbm5vKHBfb2NpLCBpX29jaSwgcF9zdG9yYWdlcywgaV9zdG9yYWdlcykgewogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMjogc3RhcnQiKQoKICAgIHBfc19uYW1lIDo9IHBfb2NpLkFubm90YXRpb25zW1NfTkFNRV9LRVldCiAgICBpX3NfbmFtZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMjogaV9zX25hbWUgPSIsIGlfc19uYW1lLCAicF9zX25hbWUgPSIsIHBfc19uYW1lKQoKICAgIGFsbG93X3NhbmRib3hfbmFtZShwX3NfbmFtZSwgaV9zX25hbWUpCgogICAgaV9zX25hbWVzcGFjZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwcmludCgiYWxsb3dfYnlfYW5ubyAyOiBpX3NfbmFtZXNwYWNlID0iLCBpX3NfbmFtZXNwYWNlKQoKICAgIGFsbG93X2J5X3NhbmRib3hfbmFtZShwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMsIGlfc19uYW1lLCBpX3NfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd19ieV9hbm5vIDI6IHRydWUiKQp9CgphbGxvd19ieV9zYW5kYm94X25hbWUocF9vY2ksIGlfb2NpLCBwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfYnlfc2FuZGJveF9uYW1lOiBzdGFydCIpCgogICAgaV9uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FU1BBQ0VfS0VZXQoKICAgIGFsbG93X2J5X2NvbnRhaW5lcl90eXBlcyhwX29jaSwgaV9vY2ksIHNfbmFtZSwgaV9uYW1lc3BhY2UpCiAgICBhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZChwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpCiAgICBhbGxvd19wcm9jZXNzKHBfb2NpLlByb2Nlc3MsIGlfb2NpLlByb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpCgogICAgcHJpbnQoImFsbG93X2J5X3NhbmRib3hfbmFtZTogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfbmFtZShwX3NfbmFtZSwgaV9zX25hbWUpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X25hbWU6IHN0YXJ0IikKICAgIHJlZ2V4Lm1hdGNoKHBfc19uYW1lLCBpX3NfbmFtZSkKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9uYW1lOiB0cnVlIikKfQoKIyBDaGVjayB0aGF0IHRoZSAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLXR5cGUiIGFuZAojICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIiBhbm5vdGF0aW9ucyBkZXNpZ25hdGUgdGhlCiMgZXhwZWN0ZWQgdHlwZSAtIGVpdGhlciBhICJzYW5kYm94IiBvciBhICJjb250YWluZXIiLiBUaGVuLCB2YWxpZGF0ZQojIG90aGVyIGFubm90YXRpb25zIGJhc2VkIG9uIHRoZSBhY3R1YWwgInNhbmRib3giIG9yICJjb250YWluZXIiIHZhbHVlCiMgZnJvbSB0aGUgaW5wdXQgY29udGFpbmVyLgphbGxvd19ieV9jb250YWluZXJfdHlwZXMocF9vY2ksIGlfb2NpLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfYnlfY29udGFpbmVyX3R5cGVzOiBjaGVja2luZyBpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSIpCgogICAgY190eXBlIDo9ICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSIKICAgIAogICAgcF9jcmlfdHlwZSA6PSBwX29jaS5Bbm5vdGF0aW9uc1tjX3R5cGVdCiAgICBpX2NyaV90eXBlIDo9IGlfb2NpLkFubm90YXRpb25zW2NfdHlwZV0KICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZXM6IHBfY3JpX3R5cGUgPSIsIHBfY3JpX3R5cGUsICJpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgcF9jcmlfdHlwZSA9PSBpX2NyaV90eXBlCgogICAgYWxsb3dfYnlfY29udGFpbmVyX3R5cGUoaV9jcmlfdHlwZSwgcF9vY2ksIGlfb2NpLCBzX25hbWUsIHNfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZXM6IHRydWUiKQp9CgphbGxvd19ieV9jb250YWluZXJfdHlwZShpX2NyaV90eXBlLCBwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAxOiBpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgaV9jcmlfdHlwZSA9PSAic2FuZGJveCIKCiAgICBpX2thdGFfdHlwZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1siaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5jb250YWluZXJfdHlwZSJdCiAgICBwcmludCgiYWxsb3dfYnlfY29udGFpbmVyX3R5cGUgMTogaV9rYXRhX3R5cGUgPSIsIGlfa2F0YV90eXBlKQogICAgaV9rYXRhX3R5cGUgPT0gInBvZF9zYW5kYm94IgoKICAgIGFsbG93X3NhbmRib3hfY29udGFpbmVyX25hbWUocF9vY2ksIGlfb2NpKQogICAgYWxsb3dfc2FuZGJveF9uZXRfbmFtZXNwYWNlKHBfb2NpLCBpX29jaSkKICAgIGFsbG93X3NhbmRib3hfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpCgogICAgcHJpbnQoImFsbG93X2J5X2NvbnRhaW5lcl90eXBlIDE6IHRydWUiKQp9CgphbGxvd19ieV9jb250YWluZXJfdHlwZShpX2NyaV90eXBlLCBwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiBpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgaV9jcmlfdHlwZSA9PSAiY29udGFpbmVyIgoKICAgIGlfa2F0YV90eXBlIDo9IGlfb2NpLkFubm90YXRpb25zWyJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIl0KICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiBpX2thdGFfdHlwZSA9IiwgaV9rYXRhX3R5cGUpCiAgICBpX2thdGFfdHlwZSA9PSAicG9kX2NvbnRhaW5lciIKCiAgICBhbGxvd19jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpCiAgICBhbGxvd19uZXRfbmFtZXNwYWNlKHBfb2NpLCBpX29jaSkKICAgIGFsbG93X2xvZ19kaXJlY3RvcnkocF9vY2ksIGlfb2NpKQoKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiB0cnVlIikKfQoKIyAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLW5hbWUiIGFubm90YXRpb24KYWxsb3dfc2FuZGJveF9jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X2NvbnRhaW5lcl9uYW1lOiBzdGFydCIpCgogICAgY29udGFpbmVyX2Fubm90YXRpb25fbWlzc2luZyhwX29jaSwgaV9vY2ksICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItbmFtZSIpCgogICAgcHJpbnQoImFsbG93X3NhbmRib3hfY29udGFpbmVyX25hbWU6IHRydWUiKQp9CgphbGxvd19jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19jb250YWluZXJfbmFtZTogc3RhcnQiKQoKICAgIGFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uKHBfb2NpLCBpX29jaSwgImlvLmt1YmVybmV0ZXMuY3JpLmNvbnRhaW5lci1uYW1lIikKCiAgICBwcmludCgiYWxsb3dfY29udGFpbmVyX25hbWU6IHRydWUiKQp9Cgpjb250YWluZXJfYW5ub3RhdGlvbl9taXNzaW5nKHBfb2NpLCBpX29jaSwga2V5KSB7CiAgICBwcmludCgiY29udGFpbmVyX2Fubm90YXRpb25fbWlzc2luZzoiLCBrZXkpCgogICAgbm90IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIG5vdCBpX29jaS5Bbm5vdGF0aW9uc1trZXldCgogICAgcHJpbnQoImNvbnRhaW5lcl9hbm5vdGF0aW9uX21pc3Npbmc6IHRydWUiKQp9CgphbGxvd19jb250YWluZXJfYW5ub3RhdGlvbihwX29jaSwgaV9vY2ksIGtleSkgewogICAgcHJpbnQoImFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uOiBrZXkgPSIsIGtleSkKCiAgICBwX3ZhbHVlIDo9IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIGlfdmFsdWUgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgcHJpbnQoImFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uOiBwX3ZhbHVlID0iLCBwX3ZhbHVlLCAiaV92YWx1ZSA9IiwgaV92YWx1ZSkKCiAgICBwX3ZhbHVlID09IGlfdmFsdWUKCiAgICBwcmludCgiYWxsb3dfY29udGFpbmVyX2Fubm90YXRpb246IHRydWUiKQp9CgojICJuZXJkY3RsL25ldHdvcmstbmFtZXNwYWNlIiBhbm5vdGF0aW9uCmFsbG93X3NhbmRib3hfbmV0X25hbWVzcGFjZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X25ldF9uYW1lc3BhY2U6IHN0YXJ0IikKCiAgICBrZXkgOj0gIm5lcmRjdGwvbmV0d29yay1uYW1lc3BhY2UiCgogICAgcF9uYW1lc3BhY2UgOj0gcF9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgaV9uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgcHJpbnQoImFsbG93X3NhbmRib3hfbmV0X25hbWVzcGFjZTogcF9uYW1lc3BhY2UgPSIsIHBfbmFtZXNwYWNlLCAiaV9uYW1lc3BhY2UgPSIsIGlfbmFtZXNwYWNlKQoKICAgIHJlZ2V4Lm1hdGNoKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9uZXRfbmFtZXNwYWNlOiB0cnVlIikKfQoKYWxsb3dfbmV0X25hbWVzcGFjZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19uZXRfbmFtZXNwYWNlOiBzdGFydCIpCgogICAga2V5IDo9ICJuZXJkY3RsL25ldHdvcmstbmFtZXNwYWNlIgoKICAgIG5vdCBwX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICBub3QgaV9vY2kuQW5ub3RhdGlvbnNba2V5XQoKICAgIHByaW50KCJhbGxvd19uZXRfbmFtZXNwYWNlOiB0cnVlIikKfQoKIyAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1sb2ctZGlyZWN0b3J5IiBhbm5vdGF0aW9uCmFsbG93X3NhbmRib3hfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X2xvZ19kaXJlY3Rvcnk6IHN0YXJ0IikKCiAgICBrZXkgOj0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbG9nLWRpcmVjdG9yeSIKCiAgICBwX2RpciA6PSBwX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICByZWdleDEgOj0gcmVwbGFjZShwX2RpciwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHJlZ2V4MiA6PSByZXBsYWNlKHJlZ2V4MSwgIiQoc2FuZGJveC1uYW1lc3BhY2UpIiwgc19uYW1lc3BhY2UpCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiByZWdleDIgPSIsIHJlZ2V4MikKCiAgICBpX2RpciA6PSBpX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiBpX2RpciA9IiwgaV9kaXIpCgogICAgcmVnZXgubWF0Y2gocmVnZXgyLCBpX2RpcikKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiB0cnVlIikKfQoKYWxsb3dfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19sb2dfZGlyZWN0b3J5OiBzdGFydCIpCgogICAga2V5IDo9ICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWxvZy1kaXJlY3RvcnkiCgogICAgbm90IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIG5vdCBpX29jaS5Bbm5vdGF0aW9uc1trZXldCgogICAgcHJpbnQoImFsbG93X2xvZ19kaXJlY3Rvcnk6IHRydWUiKQp9CgphbGxvd19kZXZpY2VzKHBfZGV2aWNlcywgaV9kZXZpY2VzKSB7CiAgICBwcmludCgiYWxsb3dfZGV2aWNlczogc3RhcnQiKQogICAgZXZlcnkgaV9kZXZpY2UgaW4gaV9kZXZpY2VzIHsKICAgICAgICBwcmludCgiYWxsb3dfZGV2aWNlczogaV9kZXZpY2UgPSIsIGlfZGV2aWNlKQogICAgICAgIHNvbWUgcF9kZXZpY2UgaW4gcF9kZXZpY2VzCiAgICAgICAgcF9kZXZpY2UuY29udGFpbmVyX3BhdGggPT0gaV9kZXZpY2UuY29udGFpbmVyX3BhdGgKICAgIH0KICAgIHByaW50KCJhbGxvd19kZXZpY2VzOiB0cnVlIikKfQoKYWxsb3dfbGludXgoc3RhdGVfb3BzLCBwX29jaSwgaV9vY2kpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIHBfbmFtZXNwYWNlcyA6PSBwX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbGludXg6IHAgbmFtZXNwYWNlcyA9IiwgcF9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlcyA6PSBpX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbGludXg6IGkgbmFtZXNwYWNlcyA9IiwgaV9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlX3dpdGhvdXRfbmV0d29yayA6PSBbb2JqIHwgb2JqIDo9IGlfbmFtZXNwYWNlc1tfXTsgb2JqLlR5cGUgIT0gIm5ldHdvcmsiXQoKICAgIHByaW50KCJhbGxvd19saW51eDogaV9uYW1lc3BhY2Vfd2l0aG91dF9uZXR3b3JrID0iLCBpX25hbWVzcGFjZV93aXRob3V0X25ldHdvcmspCgogICAgcF9uYW1lc3BhY2VzID09IGlfbmFtZXNwYWNlX3dpdGhvdXRfbmV0d29yawoKICAgIGFsbG93X21hc2tlZF9wYXRocyhwX29jaSwgaV9vY2kpCiAgICBhbGxvd19yZWFkb25seV9wYXRocyhwX29jaSwgaV9vY2kpCiAgICBhbGxvd19saW51eF9kZXZpY2VzKHBfb2NpLkxpbnV4LkRldmljZXMsIGlfb2NpLkxpbnV4LkRldmljZXMpCiAgICBhbGxvd19saW51eF9zeXNjdGwocF9vY2kuTGludXgsIGlfb2NpLkxpbnV4KQogICAgcmV0IDo9IGFsbG93X25ldHdvcmtfbmFtZXNwYWNlX3N0YXJ0KHN0YXRlX29wcywgcF9vY2ksIGlfb2NpKQogICAgcmV0LmFsbG93ZWQKCiAgICBvcHMgOj0gcmV0Lm9wcwoKICAgIHByaW50KCJhbGxvd19saW51eDogdHJ1ZSIpCn0KCiMgUmV0cmlldmUgdGhlICJuZXR3b3JrIiBuYW1lc3BhY2UgZnJvbSB0aGUgaW5wdXQgZGF0YSBhbmQgcGFzcyBpdCBvbiBmb3IgdGhlCiMgbmV0d29yayBuYW1lc3BhY2UgcG9saWN5IGNoZWNrcy4KYWxsb3dfbmV0d29ya19uYW1lc3BhY2Vfc3RhcnQoc3RhdGVfb3BzLCBwX29jaSwgaV9vY2kpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIHByaW50KCJhbGxvd19uZXR3b3JrX25hbWVzcGFjZSBzdGFydDogc3RhcnQiKQoKICAgIHBfbmFtZXNwYWNlcyA6PSBwX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IHAgbmFtZXNwYWNlcyA9IiwgcF9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlcyA6PSBpX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IGkgbmFtZXNwYWNlcyA9IiwgaV9uYW1lc3BhY2VzKQoKICAgICMgUmV0dXJuIHBhdGggb2YgdGhlICJuZXR3b3JrIiBuYW1lc3BhY2UKICAgIG5ldHdvcmtfbnMgOj0gW29iaiB8IG9iaiA6PSBpX25hbWVzcGFjZXNbX107IG9iai5UeXBlID09ICJuZXR3b3JrIl0KCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IG5ldHdvcmtfbnMgPSIsIG5ldHdvcmtfbnMpCgogICAgcmV0IDo9IGFsbG93X25ldHdvcmtfbmFtZXNwYWNlKHN0YXRlX29wcywgbmV0d29ya19ucykKICAgIHJldC5hbGxvd2VkCgogICAgb3BzIDo9IHJldC5vcHMKfQoKIyBUaGlzIHJ1bGUgaXMgd2hlbiB0aGVyZSdzIG5vIG5ldHdvcmsgbmFtZXNwYWNlIGluIHRoZSBpbnB1dCBkYXRhLgphbGxvd19uZXR3b3JrX25hbWVzcGFjZShzdGF0ZV9vcHMsIG5ldHdvcmtfbnMpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIGNvdW50KG5ldHdvcmtfbnMpID09IDAKCiAgICBuZXR3b3JrX25zX3BhdGggPSAiIgoKICAgIGFkZF9uZXR3b3JrX25hbWVzcGFjZV90b19zdGF0ZSA6PSBzdGF0ZV9hbGxvd3MoIm5ldHdvcmtfbmFtZXNwYWNlIiwgbmV0d29ya19uc19wYXRoKQogICAgb3BzIDo9IGNvbmNhdF9vcF9pZl9ub3RfbnVsbChzdGF0ZV9vcHMsIGFkZF9uZXR3b3JrX25hbWVzcGFjZV90b19zdGF0ZSkKCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2UgMTogdHJ1ZSIpCn0KCiMgVGhpcyBydWxlIGlzIHdoZW4gdGhlcmUncyBleGFjdGx5IG9uZSBuZXR3b3JrIG5hbWVzcGFjZSBpbiB0aGUgaW5wdXQgZGF0YS4KYWxsb3dfbmV0d29ya19uYW1lc3BhY2Uoc3RhdGVfb3BzLCBuZXR3b3JrX25zKSA6PSB7Im9wcyI6IG9wcywgImFsbG93ZWQiOiB0cnVlfSB7CiAgICBjb3VudChuZXR3b3JrX25zKSA9PSAxCgogICAgYWRkX25ldHdvcmtfbmFtZXNwYWNlX3RvX3N0YXRlIDo9IHN0YXRlX2FsbG93cygibmV0d29ya19uYW1lc3BhY2UiLCBuZXR3b3JrX25zWzBdLlBhdGgpCiAgICBvcHMgOj0gY29uY2F0X29wX2lmX25vdF9udWxsKHN0YXRlX29wcywgYWRkX25ldHdvcmtfbmFtZXNwYWNlX3RvX3N0YXRlKQoKICAgIHByaW50KCJhbGxvd19uZXR3b3JrX25hbWVzcGFjZSAyOiB0cnVlIikKfQoKYWxsb3dfbWFza2VkX3BhdGhzKHBfb2NpLCBpX29jaSkgewogICAgcF9wYXRocyA6PSBwX29jaS5MaW51eC5NYXNrZWRQYXRocwogICAgcHJpbnQoImFsbG93X21hc2tlZF9wYXRocyAxOiBwX3BhdGhzID0iLCBwX3BhdGhzKQoKICAgIGlfcGF0aHMgOj0gaV9vY2kuTGludXguTWFza2VkUGF0aHMKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aHMgMTogaV9wYXRocyA9IiwgaV9wYXRocykKCiAgICBhbGxvd19tYXNrZWRfcGF0aHNfYXJyYXkocF9wYXRocywgaV9wYXRocykKCiAgICBwcmludCgiYWxsb3dfbWFza2VkX3BhdGhzIDE6IHRydWUiKQp9CmFsbG93X21hc2tlZF9wYXRocyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aHMgMjogc3RhcnQiKQoKICAgIG5vdCBwX29jaS5MaW51eC5NYXNrZWRQYXRocwogICAgbm90IGlfb2NpLkxpbnV4Lk1hc2tlZFBhdGhzCgogICAgcHJpbnQoImFsbG93X21hc2tlZF9wYXRocyAyOiB0cnVlIikKfQoKIyBBbGwgdGhlIHBvbGljeSBtYXNrZWQgcGF0aHMgbXVzdCBiZSBtYXNrZWQgaW4gdGhlIGlucHV0IGRhdGEgdG9vLgojIElucHV0IGlzIGFsbG93ZWQgdG8gaGF2ZSBtb3JlIG1hc2tlZCBwYXRocyB0aGFuIHRoZSBwb2xpY3kuCmFsbG93X21hc2tlZF9wYXRoc19hcnJheShwX2FycmF5LCBpX2FycmF5KSB7CiAgICBldmVyeSBwX2VsZW0gaW4gcF9hcnJheSB7CiAgICAgICAgYWxsb3dfbWFza2VkX3BhdGgocF9lbGVtLCBpX2FycmF5KQogICAgfQp9CgphbGxvd19tYXNrZWRfcGF0aChwX2VsZW0sIGlfYXJyYXkpIHsKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aDogcF9lbGVtID0iLCBwX2VsZW0pCgogICAgc29tZSBpX2VsZW0gaW4gaV9hcnJheQogICAgcF9lbGVtID09IGlfZWxlbQoKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aDogdHJ1ZSIpCn0KCmFsbG93X3JlYWRvbmx5X3BhdGhzKHBfb2NpLCBpX29jaSkgewogICAgcF9wYXRocyA6PSBwX29jaS5MaW51eC5SZWFkb25seVBhdGhzCiAgICBwcmludCgiYWxsb3dfcmVhZG9ubHlfcGF0aHMgMTogcF9wYXRocyA9IiwgcF9wYXRocykKCiAgICBpX3BhdGhzIDo9IGlfb2NpLkxpbnV4LlJlYWRvbmx5UGF0aHMKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAxOiBpX3BhdGhzID0iLCBpX3BhdGhzKQoKICAgIGFsbG93X3JlYWRvbmx5X3BhdGhzX2FycmF5KHBfcGF0aHMsIGlfcGF0aHMsIGlfb2NpLkxpbnV4Lk1hc2tlZFBhdGhzKQoKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAxOiB0cnVlIikKfQphbGxvd19yZWFkb25seV9wYXRocyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAyOiBzdGFydCIpCgogICAgbm90IHBfb2NpLkxpbnV4LlJlYWRvbmx5UGF0aHMKICAgIG5vdCBpX29jaS5MaW51eC5SZWFkb25seVBhdGhzCgogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGhzIDI6IHRydWUiKQp9CgojIEFsbCB0aGUgcG9saWN5IHJlYWRvbmx5IHBhdGhzIG11c3QgYmUgZWl0aGVyOgojIC0gUHJlc2VudCBpbiB0aGUgaW5wdXQgcmVhZG9ubHkgcGF0aHMsIG9yCiMgLSBQcmVzZW50IGluIHRoZSBpbnB1dCBtYXNrZWQgcGF0aHMuCiMgSW5wdXQgaXMgYWxsb3dlZCB0byBoYXZlIG1vcmUgcmVhZG9ubHkgcGF0aHMgdGhhbiB0aGUgcG9saWN5LgphbGxvd19yZWFkb25seV9wYXRoc19hcnJheShwX2FycmF5LCBpX2FycmF5LCBtYXNrZWRfcGF0aHMpIHsKICAgIGV2ZXJ5IHBfZWxlbSBpbiBwX2FycmF5IHsKICAgICAgICBhbGxvd19yZWFkb25seV9wYXRoKHBfZWxlbSwgaV9hcnJheSwgbWFza2VkX3BhdGhzKQogICAgfQp9CgphbGxvd19yZWFkb25seV9wYXRoKHBfZWxlbSwgaV9hcnJheSwgbWFza2VkX3BhdGhzKSB7CiAgICBwcmludCgiYWxsb3dfcmVhZG9ubHlfcGF0aCAxOiBwX2VsZW0gPSIsIHBfZWxlbSkKCiAgICBzb21lIGlfZWxlbSBpbiBpX2FycmF5CiAgICBwX2VsZW0gPT0gaV9lbGVtCgogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGggMTogdHJ1ZSIpCn0KYWxsb3dfcmVhZG9ubHlfcGF0aChwX2VsZW0sIGlfYXJyYXksIG1hc2tlZF9wYXRocykgewogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGggMjogcF9lbGVtID0iLCBwX2VsZW0pCgogICAgc29tZSBpX21hc2tlZCBpbiBtYXNrZWRfcGF0aHMKICAgIHBfZWxlbSA9PSBpX21hc2tlZAoKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRoIDI6IHRydWUiKQp9CgphbGxvd19saW51eF9kZXZpY2VzKHBfZGV2aWNlcywgaV9kZXZpY2VzKSB7CiAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogc3RhcnQiKQogICAgZXZlcnkgaV9kZXZpY2UgaW4gaV9kZXZpY2VzIHsKICAgICAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogaV9kZXZpY2UgPSIsIGlfZGV2aWNlKQogICAgICAgIHNvbWUgcF9kZXZpY2UgaW4gcF9kZXZpY2VzCiAgICAgICAgaV9kZXZpY2UuUGF0aCA9PSBwX2RldmljZS5QYXRoCiAgICB9CiAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogdHJ1ZSIpCn0KCmFsbG93X2xpbnV4X3N5c2N0bChwX2xpbnV4LCBpX2xpbnV4KSB7CiAgICBwcmludCgiYWxsb3dfbGludXhfc3lzY3RsIDE6IHN0YXJ0IikKICAgIG5vdCBpX2xpbnV4LlN5c2N0bAogICAgcHJpbnQoImFsbG93X2xpbnV4X3N5c2N0bCAxOiB0cnVlIikKfQoKYWxsb3dfbGludXhfc3lzY3RsKHBfbGludXgsIGlfbGludXgpIHsKICAgIHByaW50KCJhbGxvd19saW51eF9zeXNjdGwgMjogc3RhcnQiKQogICAgcF9zeXNjdGwgOj0gcF9saW51eC5TeXNjdGwKICAgIGlfc3lzY3RsIDo9IGlfbGludXguU3lzY3RsCiAgICBldmVyeSBpX25hbWUsIGlfdmFsIGluIGlfc3lzY3RsIHsKICAgICAgICBwcmludCgiYWxsb3dfbGludXhfc3lzY3RsIDI6IGlfbmFtZSA9IiwgaV9uYW1lLCAiaV92YWwgPSIsIGlfdmFsKQogICAgICAgIHBfc3lzY3RsW2lfbmFtZV0gPT0gaV92YWwKICAgIH0KICAgIHByaW50KCJhbGxvd19saW51eF9zeXNjdGwgMjogdHJ1ZSIpCn0KCiMgQ2hlY2sgdGhlIGNvbnNpc3RlbmN5IG9mIHRoZSBpbnB1dCAiaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5idW5kbGVfcGF0aCIKIyBhbmQgaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCIgdmFsdWVzIHdpdGggb3RoZXIgZmllbGRzLgphbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZChwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpIHsKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogc3RhcnQiKQoKICAgIGJ1bmRsZV9wYXRoIDo9IGlfb2NpLkFubm90YXRpb25zWyJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmJ1bmRsZV9wYXRoIl0KICAgIGJ1bmRsZV9pZCA6PSByZXBsYWNlKGJ1bmRsZV9wYXRoLCAiL3J1bi9jb250YWluZXJkL2lvLmNvbnRhaW5lcmQucnVudGltZS52Mi50YXNrL2s4cy5pby8iLCAiIikKCiAgICBidW5kbGVfaWRfZm9ybWF0IDo9IGNvbmNhdCgiIiwgWyJeIiwgQlVORExFX0lELCAiJCJdKQogICAgcmVnZXgubWF0Y2goYnVuZGxlX2lkX2Zvcm1hdCwgYnVuZGxlX2lkKQoKICAgIGtleSA6PSAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCIKCiAgICBwX3JlZ2V4IDo9IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIHNhbmRib3hfaWQgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQoKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogc2FuZGJveF9pZCA9Iiwgc2FuZGJveF9pZCwgInJlZ2V4ID0iLCBwX3JlZ2V4KQogICAgcmVnZXgubWF0Y2gocF9yZWdleCwgc2FuZGJveF9pZCkKCiAgICBhbGxvd19yb290X3BhdGgocF9vY2ksIGlfb2NpLCBidW5kbGVfaWQpCgogICAgZXZlcnkgaV9tb3VudCBpbiBpX29jaS5Nb3VudHMgewogICAgICAgIGFsbG93X21vdW50KHBfb2NpLCBpX21vdW50LCBpX3N0b3JhZ2VzLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpCiAgICB9CgogICAgYWxsb3dfc3RvcmFnZXMocF9zdG9yYWdlcywgaV9zdG9yYWdlcywgYnVuZGxlX2lkLCBzYW5kYm94X2lkKQoKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogdHJ1ZSIpCn0KCmFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHBfcHJvY2VzcyA9IiwgcF9wcm9jZXNzKQogICAgcHJpbnQoImFsbG93X3Byb2Nlc3NfY29tbW9uOiBpX3Byb2Nlc3MgPSAiLCBpX3Byb2Nlc3MpCiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHNfbmFtZSA9Iiwgc19uYW1lKQoKICAgIHBfcHJvY2Vzcy5Dd2QgPT0gaV9wcm9jZXNzLkN3ZAogICAgcF9wcm9jZXNzLk5vTmV3UHJpdmlsZWdlcyA9PSBpX3Byb2Nlc3MuTm9OZXdQcml2aWxlZ2VzCgogICAgYWxsb3dfdXNlcihwX3Byb2Nlc3MsIGlfcHJvY2VzcykKICAgIGFsbG93X2VudihwX3Byb2Nlc3MsIGlfcHJvY2Vzcywgc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHRydWUiKQp9CgojIENvbXBhcmUgdGhlIE9DSSBQcm9jZXNzIGZpZWxkIG9mIGEgcG9saWN5IGNvbnRhaW5lciB3aXRoIHRoZSBpbnB1dCBPQ0kgUHJvY2VzcyBmcm9tIGEgQ3JlYXRlQ29udGFpbmVyUmVxdWVzdAphbGxvd19wcm9jZXNzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfcHJvY2Vzczogc3RhcnQiKQoKICAgIGFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgYWxsb3dfY2FwcyhwX3Byb2Nlc3MuQ2FwYWJpbGl0aWVzLCBpX3Byb2Nlc3MuQ2FwYWJpbGl0aWVzKQogICAgcF9wcm9jZXNzLlRlcm1pbmFsID09IGlfcHJvY2Vzcy5UZXJtaW5hbAoKICAgIHByaW50KCJhbGxvd19wcm9jZXNzOiB0cnVlIikKfQoKIyBDb21wYXJlIHRoZSBPQ0kgUHJvY2VzcyBmaWVsZCBvZiBhIHBvbGljeSBjb250YWluZXIgd2l0aCB0aGUgaW5wdXQgcHJvY2VzcyBmaWVsZCBmcm9tIEV4ZWNQcm9jZXNzUmVxdWVzdAphbGxvd19pbnRlcmFjdGl2ZV9wcm9jZXNzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfaW50ZXJhY3RpdmVfcHJvY2Vzczogc3RhcnQiKQoKICAgIGFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgYWxsb3dfZXhlY19jYXBzKGlfcHJvY2Vzcy5DYXBhYmlsaXRpZXMpCgogICAgIyBUaGVzZSBhcmUgY29tbWFuZHMgZW5hYmxlZCB1c2luZyBFeGVjUHJvY2Vzc1JlcXVlc3QgY29tbWFuZHMgYW5kL29yIHJlZ2V4IGZyb20gdGhlIHNldHRpbmdzIGZpbGUuCiAgICAjIFRoZXkgY2FuIGJlIGV4ZWN1dGVkIGludGVyYWN0aXZlbHkgc28gYWxsb3cgdGhlbSB0byB1c2UgYW55IHZhbHVlIGZvciBpX3Byb2Nlc3MuVGVybWluYWwuCgogICAgcHJpbnQoImFsbG93X2ludGVyYWN0aXZlX3Byb2Nlc3M6IHRydWUiKQp9CgojIENvbXBhcmUgdGhlIE9DSSBQcm9jZXNzIGZpZWxkIG9mIGEgcG9saWN5IGNvbnRhaW5lciB3aXRoIHRoZSBpbnB1dCBwcm9jZXNzIGZpZWxkIGZyb20gRXhlY1Byb2Nlc3NSZXF1ZXN0CmFsbG93X3Byb2JlX3Byb2Nlc3MocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19wcm9iZV9wcm9jZXNzOiBzdGFydCIpCgogICAgYWxsb3dfcHJvY2Vzc19jb21tb24ocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpCiAgICBhbGxvd19leGVjX2NhcHMoaV9wcm9jZXNzLkNhcGFiaWxpdGllcykKICAgIHBfcHJvY2Vzcy5UZXJtaW5hbCA9PSBpX3Byb2Nlc3MuVGVybWluYWwKCiAgICBwcmludCgiYWxsb3dfcHJvYmVfcHJvY2VzczogdHJ1ZSIpCn0KCmFsbG93X3VzZXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MpIHsKICAgIHBfdXNlciA6PSBwX3Byb2Nlc3MuVXNlcgogICAgaV91c2VyIDo9IGlfcHJvY2Vzcy5Vc2VyCgogICAgcHJpbnQoImFsbG93X3VzZXI6IGlucHV0IHVpZCA9IiwgaV91c2VyLlVJRCwgInBvbGljeSB1aWQgPSIsIHBfdXNlci5VSUQpCiAgICBwX3VzZXIuVUlEID09IGlfdXNlci5VSUQKCiAgICAjIFRPRE86IHRyYWNrIGRvd24gdGhlIHJlYXNvbiBmb3IgcmVnaXN0cnkuazhzLmlvL3BhdXNlOjMuOSBiZWluZwogICAgIyAgICAgICBleGVjdXRlZCB3aXRoIGdpZCA9IDAgZGVzcGl0ZSBoYXZpbmcgIjY1NTM1OjY1NTM1IiBpbiBpdHMgY29udGFpbmVyIGltYWdlCiAgICAjICAgICAgIGNvbmZpZy4KICAgICNwcmludCgiYWxsb3dfdXNlcjogaW5wdXQgZ2lkID0iLCBpX3VzZXIuR0lELCAicG9saWN5IGdpZCA9IiwgcF91c2VyLkdJRCkKICAgICNwX3VzZXIuR0lEID09IGlfdXNlci5HSUQKCiAgICAjIFRPRE86IGNvbXBhcmUgdGhlIGFkZGl0aW9uYWxHaWRzIGZpZWxkIHRvbyBhZnRlciBjb21wdXRpbmcgaXRzIHZhbHVlCiAgICAjIGJhc2VkIG9uIC9ldGMvcGFzc3dkIGFuZCAvZXRjL2dyb3VwIGZyb20gdGhlIGNvbnRhaW5lciBpbWFnZS4KfQoKYWxsb3dfZGVwcmVjYXRlZF9hcmdzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZ3MgMTogbm8gYXJncyIpCgogICAgbm90IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJncwogICAgbm90IGlfcHJvY2Vzcy5BcmdzCgogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAxOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZ3MocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSkgewogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiBwb2xpY3kgYXJncyA9IiwgcF9wcm9jZXNzLkRlcHJlY2F0ZWRBcmdzKQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiBpbnB1dCBhcmdzID0iLCBpX3Byb2Nlc3MuQXJncykKCiAgICBjb3VudChwX3Byb2Nlc3MuRGVwcmVjYXRlZEFyZ3MpID09IGNvdW50KGlfcHJvY2Vzcy5BcmdzKQoKICAgIGV2ZXJ5IGksIGlfYXJnIGluIGlfcHJvY2Vzcy5BcmdzIHsKICAgICAgICBhbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpCiAgICB9CgogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDE6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgcF9hcmcyIDo9IHJlcGxhY2UocF9hcmcsICIkJCIsICIkIikKICAgIHBfYXJnMiA9PSBpX2FyZwoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAxOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDI6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgIyBUT0RPOiBjYW4gJChub2RlLW5hbWUpIGJlIGhhbmRsZWQgYmV0dGVyPwogICAgY29udGFpbnMocF9hcmcsICIkKG5vZGUtbmFtZSkiKQoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAyOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDM6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgcF9hcmcyIDo9IHJlcGxhY2UocF9hcmcsICIkJCIsICIkIikKICAgIHBfYXJnMyA6PSByZXBsYWNlKHBfYXJnMiwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAzOiBwX2FyZzMgPSIsIHBfYXJnMykKICAgIHBfYXJnMyA9PSBpX2FyZwoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAzOiB0cnVlIikKfQoKIyBPQ0kgcHJvY2Vzcy5FbnYgZmllbGQKYWxsb3dfZW52KHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfZW52OiBwIGVudiA9IiwgcF9wcm9jZXNzLkVudikKICAgIHByaW50KCJhbGxvd19lbnY6IGkgZW52ID0iLCBpX3Byb2Nlc3MuRW52KQoKICAgIGV2ZXJ5IGlfdmFyIGluIGlfcHJvY2Vzcy5FbnYgewogICAgICAgIHByaW50KCJhbGxvd19lbnY6IGlfdmFyID0iLCBpX3ZhcikKICAgICAgICBhbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgfQoKICAgIHByaW50KCJhbGxvd19lbnY6IHRydWUiKQp9CgojIEFsbG93IGlucHV0IGVudiB2YXJpYWJsZXMgdGhhdCBhcmUgcHJlc2VudCBpbiB0aGUgcG9saWN5IGRhdGEgdG9vLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHBfdmFyID09IGlfdmFyCiAgICBwcmludCgiYWxsb3dfdmFyIDE6IHRydWUiKQp9CgojIE1hdGNoIGlucHV0IHdpdGggb25lIG9mIHRoZSBwb2xpY3kgdmFyaWFibGVzLCBhZnRlciBzdWJzdGl0dXRpbmcgJChzYW5kYm94LW5hbWUpLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHByaW50KCJhbGxvd192YXIgMjogcF92YXIgPSIsIHBfdmFyKQoKICAgIHBfdmFyX3NwbGl0IDo9IHNwbGl0KHBfdmFyLCAiPSIpCiAgICBjb3VudChwX3Zhcl9zcGxpdCkgPT0gMgoKICAgIHBfdmFyX3NwbGl0WzFdID09ICIkKHNhbmRib3gtbmFtZSkiCgogICAgaV92YXJfc3BsaXQgOj0gc3BsaXQoaV92YXIsICI9IikKICAgIGNvdW50KGlfdmFyX3NwbGl0KSA9PSAyCgogICAgaV92YXJfc3BsaXRbMF0gPT0gcF92YXJfc3BsaXRbMF0KICAgIHJlZ2V4Lm1hdGNoKHNfbmFtZSwgaV92YXJfc3BsaXRbMV0pCgogICAgcHJpbnQoImFsbG93X3ZhciAyOiB0cnVlIikKfQoKIyBBbGxvdyBpbnB1dCBlbnYgdmFyaWFibGVzIHRoYXQgbWF0Y2ggd2l0aCBhIHJlcXVlc3RfZGVmYXVsdHMgcmVnZXguCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHNvbWUgcF9yZWdleDEgaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5DcmVhdGVDb250YWluZXJSZXF1ZXN0LmFsbG93X2Vudl9yZWdleAogICAgcF9yZWdleDIgOj0gcmVwbGFjZShwX3JlZ2V4MSwgIiQoaXB2NF9hKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcHY0X2EpCiAgICBwX3JlZ2V4MyA6PSByZXBsYWNlKHBfcmVnZXgyLCAiJChpcF9wKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcF9wKQogICAgcF9yZWdleDQgOj0gcmVwbGFjZShwX3JlZ2V4MywgIiQoc3ZjX25hbWUpIiwgcG9saWN5X2RhdGEuY29tbW9uLnN2Y19uYW1lKQogICAgcF9yZWdleDUgOj0gcmVwbGFjZShwX3JlZ2V4NCwgIiQoZG5zX2xhYmVsKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5kbnNfbGFiZWwpCgogICAgcHJpbnQoImFsbG93X3ZhciAzOiBwX3JlZ2V4NSA9IiwgcF9yZWdleDUpCiAgICByZWdleC5tYXRjaChwX3JlZ2V4NSwgaV92YXIpCgogICAgcHJpbnQoImFsbG93X3ZhciAzOiB0cnVlIikKfQoKIyBBbGxvdyBmaWVsZFJlZiAiZmllbGRQYXRoOiBzdGF0dXMucG9kSVAiIHZhbHVlcy4KYWxsb3dfdmFyKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBpX3Zhciwgc19uYW1lLCBzX25hbWVzcGFjZSkgewogICAgbmFtZV92YWx1ZSA6PSBzcGxpdChpX3ZhciwgIj0iKQogICAgY291bnQobmFtZV92YWx1ZSkgPT0gMgogICAgaXNfaXAobmFtZV92YWx1ZVsxXSkKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIGFsbG93X3BvZF9pcF92YXIobmFtZV92YWx1ZVswXSwgcF92YXIpCgogICAgcHJpbnQoImFsbG93X3ZhciA0OiB0cnVlIikKfQoKIyBBbGxvdyBjb21tb24gZmllbGRSZWYgdmFyaWFibGVzLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBuYW1lX3ZhbHVlIDo9IHNwbGl0KGlfdmFyLCAiPSIpCiAgICBjb3VudChuYW1lX3ZhbHVlKSA9PSAyCgogICAgc29tZSBwX3ZhciBpbiBwX3Byb2Nlc3MuRW52CiAgICBwX25hbWVfdmFsdWUgOj0gc3BsaXQocF92YXIsICI9IikKICAgIGNvdW50KHBfbmFtZV92YWx1ZSkgPT0gMgoKICAgIHBfbmFtZV92YWx1ZVswXSA9PSBuYW1lX3ZhbHVlWzBdCgogICAgIyBUT0RPOiBzaG91bGQgdGhlc2UgYmUgaGFuZGxlZCBpbiBhIGRpZmZlcmVudCB3YXk/CiAgICBhbHdheXNfYWxsb3dlZCA6PSBbIiQoaG9zdC1uYW1lKSIsICIkKG5vZGUtbmFtZSkiLCAiJChwb2QtdWlkKSJdCiAgICBzb21lIGFsbG93ZWQgaW4gYWx3YXlzX2FsbG93ZWQKICAgIGNvbnRhaW5zKHBfbmFtZV92YWx1ZVsxXSwgYWxsb3dlZCkKCiAgICBwcmludCgiYWxsb3dfdmFyIDU6IHRydWUiKQp9CgojIEFsbG93IGZpZWxkUmVmICJmaWVsZFBhdGg6IHN0YXR1cy5ob3N0SVAiIHZhbHVlcy4KYWxsb3dfdmFyKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBpX3Zhciwgc19uYW1lLCBzX25hbWVzcGFjZSkgewogICAgbmFtZV92YWx1ZSA6PSBzcGxpdChpX3ZhciwgIj0iKQogICAgY291bnQobmFtZV92YWx1ZSkgPT0gMgogICAgaXNfaXAobmFtZV92YWx1ZVsxXSkKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIGFsbG93X2hvc3RfaXBfdmFyKG5hbWVfdmFsdWVbMF0sIHBfdmFyKQoKICAgIHByaW50KCJhbGxvd192YXIgNjogdHJ1ZSIpCn0KCiMgQWxsb3cgcmVzb3VyY2VGaWVsZFJlZiB2YWx1ZXMgKGUuZy4sICJsaW1pdHMuY3B1IikuCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIG5hbWVfdmFsdWUgOj0gc3BsaXQoaV92YXIsICI9IikKICAgIGNvdW50KG5hbWVfdmFsdWUpID09IDIKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHBfbmFtZV92YWx1ZSA6PSBzcGxpdChwX3ZhciwgIj0iKQogICAgY291bnQocF9uYW1lX3ZhbHVlKSA9PSAyCgogICAgcF9uYW1lX3ZhbHVlWzBdID09IG5hbWVfdmFsdWVbMF0KCiAgICAjIGEgdmFyaWFibGUgd2Ugc2hvdWxkIGJlIHZhbGlkYXRpbmcgdXNpbmcgYSByZWdleCBmcm9tIHNldHRpbmdzCiAgICBwX25hbWVfdmFsdWVbMV0gPT0gIiQodmFsaWRhdGUtZnJvbS1zZXR0aW5ncykiCgogICAgcmVnZXhfdmFsIDo9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuQ3JlYXRlQ29udGFpbmVyUmVxdWVzdC5hbGxvd19lbnZfcmVnZXhfbWFwW25hbWVfdmFsdWVbMF1dCgogICAgcHJpbnQoImFsbG93X3ZhciA3OiB2YWwgPSIsIG5hbWVfdmFsdWVbMV0pCiAgICBwcmludCgiYWxsb3dfdmFyIDc6IHJlZ2V4X3ZhbCA9IiwgcmVnZXhfdmFsKQoKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4X3ZhbCwgbmFtZV92YWx1ZVsxXSkKCiAgICBwcmludCgiYWxsb3dfdmFyIDc6IHRydWUiKQp9CgojIE1hdGNoIGlucHV0IHdpdGggb25lIG9mIHRoZSBwb2xpY3kgdmFyaWFibGVzLCBhZnRlciBzdWJzdGl0dXRpbmcgJChzYW5kYm94LW5hbWVzcGFjZSkuCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHNvbWUgcF92YXIgaW4gcF9wcm9jZXNzLkVudgogICAgcF92YXIyIDo9IHJlcGxhY2UocF92YXIsICIkKHNhbmRib3gtbmFtZXNwYWNlKSIsIHNfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd192YXIgODogcF92YXIyID0iLCBwX3ZhcjIpCiAgICBwX3ZhcjIgPT0gaV92YXIKCiAgICBwcmludCgiYWxsb3dfdmFyIDg6IHRydWUiKQp9CgphbGxvd19wb2RfaXBfdmFyKHZhcl9uYW1lLCBwX3ZhcikgewogICAgcHJpbnQoImFsbG93X3BvZF9pcF92YXI6IHZhcl9uYW1lID0iLCB2YXJfbmFtZSwgInBfdmFyID0iLCBwX3ZhcikKCiAgICBwX25hbWVfdmFsdWUgOj0gc3BsaXQocF92YXIsICI9IikKICAgIGNvdW50KHBfbmFtZV92YWx1ZSkgPT0gMgoKICAgIHBfbmFtZV92YWx1ZVswXSA9PSB2YXJfbmFtZQogICAgcF9uYW1lX3ZhbHVlWzFdID09ICIkKHBvZC1pcCkiCgogICAgcHJpbnQoImFsbG93X3BvZF9pcF92YXI6IHRydWUiKQp9CgphbGxvd19ob3N0X2lwX3Zhcih2YXJfbmFtZSwgcF92YXIpIHsKICAgIHByaW50KCJhbGxvd19ob3N0X2lwX3ZhcjogdmFyX25hbWUgPSIsIHZhcl9uYW1lLCAicF92YXIgPSIsIHBfdmFyKQoKICAgIHBfbmFtZV92YWx1ZSA6PSBzcGxpdChwX3ZhciwgIj0iKQogICAgY291bnQocF9uYW1lX3ZhbHVlKSA9PSAyCgogICAgcF9uYW1lX3ZhbHVlWzBdID09IHZhcl9uYW1lCiAgICBwX25hbWVfdmFsdWVbMV0gPT0gIiQoaG9zdC1pcCkiCgogICAgcHJpbnQoImFsbG93X2hvc3RfaXBfdmFyOiB0cnVlIikKfQoKaXNfaXAodmFsdWUpIHsKICAgIGJ5dGVzID0gc3BsaXQodmFsdWUsICIuIikKICAgIGNvdW50KGJ5dGVzKSA9PSA0CgogICAgaXNfaXBfZmlyc3RfYnl0ZShieXRlc1swXSkKICAgIGlzX2lwX290aGVyX2J5dGUoYnl0ZXNbMV0pCiAgICBpc19pcF9vdGhlcl9ieXRlKGJ5dGVzWzJdKQogICAgaXNfaXBfb3RoZXJfYnl0ZShieXRlc1szXSkKfQppc19pcF9maXJzdF9ieXRlKGNvbXBvbmVudCkgewogICAgbnVtYmVyID0gdG9fbnVtYmVyKGNvbXBvbmVudCkKICAgIG51bWJlciA+PSAxCiAgICBudW1iZXIgPD0gMjU1Cn0KaXNfaXBfb3RoZXJfYnl0ZShjb21wb25lbnQpIHsKICAgIG51bWJlciA9IHRvX251bWJlcihjb21wb25lbnQpCiAgICBudW1iZXIgPj0gMAogICAgbnVtYmVyIDw9IDI1NQp9CgojIE9DSSByb290LlBhdGgKYWxsb3dfcm9vdF9wYXRoKHBfb2NpLCBpX29jaSwgYnVuZGxlX2lkKSB7CiAgICBpX3BhdGggOj0gaV9vY2kuUm9vdC5QYXRoCiAgICBwX3BhdGgxIDo9IHBfb2NpLlJvb3QuUGF0aAogICAgcHJpbnQoImFsbG93X3Jvb3RfcGF0aDogaV9wYXRoID0iLCBpX3BhdGgsICJwX3BhdGgxID0iLCBwX3BhdGgxKQoKICAgIHBfcGF0aDIgOj0gcmVwbGFjZShwX3BhdGgxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfcm9vdF9wYXRoOiBwX3BhdGgyID0iLCBwX3BhdGgyKQoKICAgIHBfcGF0aDMgOj0gcmVwbGFjZShwX3BhdGgyLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X3Jvb3RfcGF0aDogcF9wYXRoMyA9IiwgcF9wYXRoMykKCiAgICBwX3BhdGgzID09IGlfcGF0aAoKICAgIHByaW50KCJhbGxvd19yb290X3BhdGg6IHRydWUiKQp9CgojIGRldmljZSBtb3VudHMKYWxsb3dfbW91bnQocF9vY2ksIGlfbW91bnQsIGlfc3RvcmFnZXMsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcHJpbnQoImFsbG93X21vdW50OiBpX21vdW50ID0iLCBpX21vdW50KQoKICAgIHNvbWUgcF9tb3VudCBpbiBwX29jaS5Nb3VudHMKICAgIHNvbWUgaV9zdG9yYWdlIGluIGlfc3RvcmFnZXMKCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IHBfbW91bnQgPSIsIHBfbW91bnQpCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IGlfc3RvcmFnZSA9IiwgaV9zdG9yYWdlKQoKICAgIGNoZWNrX21vdW50KHBfbW91bnQsIGlfbW91bnQsIGlfc3RvcmFnZSwgYnVuZGxlX2lkLCBzYW5kYm94X2lkKQoKICAgICMgVE9ETzogYXJlIHRoZXJlIGFueSBvdGhlciByZXF1aXJlZCBwb2xpY3kgY2hlY2tzIGZvciBtb3VudHMgLSBlLmcuLAogICAgIyAgICAgICBtdWx0aXBsZSBtb3VudHMgd2l0aCBzYW1lIHNvdXJjZSBvciBkZXN0aW5hdGlvbj8KCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IHRydWUiKQp9CgpjaGVja19tb3VudChwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcF9tb3VudCA9PSBpX21vdW50CiAgICBwcmludCgiY2hlY2tfbW91bnQgMTogdHJ1ZSIpCn0KY2hlY2tfbW91bnQocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHBfbW91bnQuZGVzdGluYXRpb24gPT0gaV9tb3VudC5kZXN0aW5hdGlvbgogICAgcF9tb3VudC50eXBlXyA9PSBpX21vdW50LnR5cGVfCiAgICBwX21vdW50Lm9wdGlvbnMgPT0gaV9tb3VudC5vcHRpb25zCgogICAgbW91bnRfc291cmNlX2FsbG93cyhwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkKCiAgICBwcmludCgiY2hlY2tfbW91bnQgMjogdHJ1ZSIpCn0KCm1vdW50X3NvdXJjZV9hbGxvd3MocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHJlZ2V4MSA6PSBwX21vdW50LnNvdXJjZQogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5tb3VudF9zb3VyY2VfY3BhdGgpCiAgICByZWdleDQgOj0gcmVwbGFjZShyZWdleDMsICIkKGJ1bmRsZS1pZCkiLCBidW5kbGVfaWQpCgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMTogcmVnZXg0ID0iLCByZWdleDQpCiAgICByZWdleC5tYXRjaChyZWdleDQsIGlfbW91bnQuc291cmNlKQoKICAgIHByaW50KCJtb3VudF9zb3VyY2VfYWxsb3dzIDE6IHRydWUiKQp9Cm1vdW50X3NvdXJjZV9hbGxvd3MocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHJlZ2V4MSA6PSBwX21vdW50LnNvdXJjZQogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5tb3VudF9zb3VyY2VfY3BhdGgpCiAgICByZWdleDQgOj0gcmVwbGFjZShyZWdleDMsICIkKHNhbmRib3gtaWQpIiwgc2FuZGJveF9pZCkKCiAgICBwcmludCgibW91bnRfc291cmNlX2FsbG93cyAyOiByZWdleDQgPSIsIHJlZ2V4NCkKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4NCwgaV9tb3VudC5zb3VyY2UpCgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMjogdHJ1ZSIpCn0KbW91bnRfc291cmNlX2FsbG93cyhwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogaV9tb3VudC5zb3VyY2UgPSIsIGlfbW91bnQuc291cmNlKQogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogaV9zdG9yYWdlLm1vdW50X3BvaW50ID0iLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCgogICAgaV9tb3VudC5zb3VyY2UgPT0gaV9zdG9yYWdlLm1vdW50X3BvaW50CgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogdHJ1ZSIpCn0KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBDcmVhdGUgY29udGFpbmVyIFN0b3JhZ2VzCgphbGxvd19zdG9yYWdlcyhwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHBfY291bnQgOj0gY291bnQocF9zdG9yYWdlcykKICAgIGlfY291bnQgOj0gY291bnQoaV9zdG9yYWdlcykKICAgIHByaW50KCJhbGxvd19zdG9yYWdlczogcF9jb3VudCA9IiwgcF9jb3VudCwgImlfY291bnQgPSIsIGlfY291bnQpCgogICAgcF9jb3VudCA9PSBpX2NvdW50CgogICAgIyBHZXQgdGhlIGNvbnRhaW5lciBpbWFnZSBsYXllciBJRHMgYW5kIHZlcml0eSByb290IGhhc2hlcywgZnJvbSB0aGUgIm92ZXJsYXlmcyIgc3RvcmFnZS4KICAgIHNvbWUgb3ZlcmxheV9zdG9yYWdlIGluIHBfc3RvcmFnZXMKICAgIG92ZXJsYXlfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIHByaW50KCJhbGxvd19zdG9yYWdlczogb3ZlcmxheV9zdG9yYWdlID0iLCBvdmVybGF5X3N0b3JhZ2UpCiAgICBjb3VudChvdmVybGF5X3N0b3JhZ2Uub3B0aW9ucykgPT0gMgoKICAgIGxheWVyX2lkcyA6PSBzcGxpdChvdmVybGF5X3N0b3JhZ2Uub3B0aW9uc1swXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiBsYXllcl9pZHMgPSIsIGxheWVyX2lkcykKCiAgICByb290X2hhc2hlcyA6PSBzcGxpdChvdmVybGF5X3N0b3JhZ2Uub3B0aW9uc1sxXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiByb290X2hhc2hlcyA9Iiwgcm9vdF9oYXNoZXMpCgogICAgZXZlcnkgaV9zdG9yYWdlIGluIGlfc3RvcmFnZXMgewogICAgICAgIGFsbG93X3N0b3JhZ2UocF9zdG9yYWdlcywgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpCiAgICB9CgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiB0cnVlIikKfQoKYWxsb3dfc3RvcmFnZShwX3N0b3JhZ2VzLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgc29tZSBwX3N0b3JhZ2UgaW4gcF9zdG9yYWdlcwoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiBwX3N0b3JhZ2UgPSIsIHBfc3RvcmFnZSkKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiBpX3N0b3JhZ2UgPSIsIGlfc3RvcmFnZSkKCiAgICBwX3N0b3JhZ2UuZHJpdmVyICAgICAgICAgICA9PSBpX3N0b3JhZ2UuZHJpdmVyCiAgICBwX3N0b3JhZ2UuZHJpdmVyX29wdGlvbnMgICA9PSBpX3N0b3JhZ2UuZHJpdmVyX29wdGlvbnMKICAgIHBfc3RvcmFnZS5mc19ncm91cCAgICAgICAgID09IGlfc3RvcmFnZS5mc19ncm91cAogICAgcF9zdG9yYWdlLmZzdHlwZSAgICAgICAgICAgPT0gaV9zdG9yYWdlLmZzdHlwZQoKICAgIGFsbG93X3N0b3JhZ2Vfc291cmNlKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKQogICAgYWxsb3dfc3RvcmFnZV9vcHRpb25zKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKQogICAgYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKQoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiB0cnVlIikKfQoKYWxsb3dfc3RvcmFnZV9zb3VyY2UocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX3NvdXJjZSAxOiBzdGFydCIpCgogICAgcF9zdG9yYWdlLnNvdXJjZSA9PSBpX3N0b3JhZ2Uuc291cmNlCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDE6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX3NvdXJjZShwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDI6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCgogICAgIyBEREREOkJCOkRELkY6IERvbWFpbjpCdXM6RGV2aWNlLkZ1bmN0aW9uCiAgICAjIGh0dHBzOi8vd3d3Lmtlcm5lbC5vcmcvZG9jL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtYnVzLXBjaQogICAgcmVnZXgubWF0Y2goYF5bYS1mMC05XXs0fTpbYS1mMC05XXsyfTpbYS1mMC05XXsyfVwuW2EtZjAtOV0kYCwgaV9zdG9yYWdlLnNvdXJjZSkKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9zb3VyY2UgMjogdHJ1ZSIpCn0KCmFsbG93X3N0b3JhZ2Vfc291cmNlKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKSB7CiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9zb3VyY2UgMzogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIGlfc3RvcmFnZS5zb3VyY2UgPT0gIm5vbmUiCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDM6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX3NvdXJjZShwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDQ6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJzbWIiCgogICAgIyBQYXR0ZXJuOiAvLzxzdG9yYWdlLWFjY291bnQtbmFtZT4uZmlsZS5jb3JlLndpbmRvd3MubmV0LzxrOHMtUFZDLW5hbWU+CiAgICAjIFN0b3JhZ2UgYWNjb3VudCBuYW1lOiBodHRwczovL2xlYXJuLm1pY3Jvc29mdC5jb20vZW4tdXMvYXp1cmUvc3RvcmFnZS9jb21tb24vc3RvcmFnZS1hY2NvdW50LW92ZXJ2aWV3I3N0b3JhZ2UtYWNjb3VudC1uYW1lCiAgICAjIEs4cyBQVkMgbmFtZTogaHR0cHM6Ly9rdWJlcm5ldGVzLmlvL2RvY3MvY29uY2VwdHMvb3ZlcnZpZXcvd29ya2luZy13aXRoLW9iamVjdHMvbmFtZXMvI2Rucy1zdWJkb21haW4tbmFtZXMKICAgIHJlZ2V4Lm1hdGNoKGBeXC9cLyhbYS16MC05XXszLDI0fSlcLmZpbGVcLmNvcmVcLndpbmRvd3NcLm5ldFwvW2EtejAtOV0oW2EtejAtOS4tXXswLDI1MX1bYS16MC05XSk/JGAsIGlfc3RvcmFnZS5zb3VyY2UpCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDQ6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMTogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgIT0gIm92ZXJsYXlmcyIKICAgIHBfc3RvcmFnZS5vcHRpb25zID09IGlfc3RvcmFnZS5vcHRpb25zCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAxOiB0cnVlIikKfQphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIGNvdW50KHBfc3RvcmFnZS5vcHRpb25zKSA9PSAyCgogICAgcG9saWN5X2lkcyA6PSBzcGxpdChwX3N0b3JhZ2Uub3B0aW9uc1swXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBwb2xpY3lfaWRzID0iLCBwb2xpY3lfaWRzKQogICAgcG9saWN5X2lkcyA9PSBsYXllcl9pZHMKCiAgICBwb2xpY3lfaGFzaGVzIDo9IHNwbGl0KHBfc3RvcmFnZS5vcHRpb25zWzFdLCAiOiIpCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IHBvbGljeV9oYXNoZXMgPSIsIHBvbGljeV9oYXNoZXMpCgogICAgcF9jb3VudCA6PSBjb3VudChwb2xpY3lfaWRzKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBwX2NvdW50ID0iLCBwX2NvdW50KQogICAgcF9jb3VudCA+PSAxCiAgICBwX2NvdW50ID09IGNvdW50KHBvbGljeV9oYXNoZXMpCgogICAgaV9jb3VudCA6PSBjb3VudChpX3N0b3JhZ2Uub3B0aW9ucykKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogaV9jb3VudCA9IiwgaV9jb3VudCkKICAgIGlfY291bnQgPT0gcF9jb3VudCArIDMKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zWzBdID0iLCBpX3N0b3JhZ2Uub3B0aW9uc1swXSkKICAgIGlfc3RvcmFnZS5vcHRpb25zWzBdID09ICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQubGF5ZXItc3JjLXByZWZpeD0vdmFyL2xpYi9jb250YWluZXJkL2lvLmNvbnRhaW5lcmQuc25hcHNob3R0ZXIudjEudGFyZGV2L2xheWVycyIKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zW2lfY291bnQgLSAyXSA9IiwgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDJdKQogICAgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDJdID09ICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQub3ZlcmxheS1ydyIKCiAgICBsb3dlcmRpciA6PSBjb25jYXQoIj0iLCBbImxvd2VyZGlyIiwgcF9zdG9yYWdlLm9wdGlvbnNbMF1dKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBsb3dlcmRpciA9IiwgbG93ZXJkaXIpCgogICAgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDFdID09IGxvd2VyZGlyCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zW2lfY291bnQgLSAxXSA9IiwgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDFdKQoKICAgIGV2ZXJ5IGksIHBvbGljeV9pZCBpbiBwb2xpY3lfaWRzIHsKICAgICAgICBhbGxvd19vdmVybGF5X2xheWVyKHBvbGljeV9pZCwgcG9saWN5X2hhc2hlc1tpXSwgaV9zdG9yYWdlLm9wdGlvbnNbaSArIDFdKQogICAgfQoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogdHJ1ZSIpCn0KYWxsb3dfc3RvcmFnZV9vcHRpb25zKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKSB7CiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDM6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCiAgICBjb3VudChwX3N0b3JhZ2Uub3B0aW9ucykgPT0gMQoKICAgIHN0YXJ0c3dpdGgocF9zdG9yYWdlLm9wdGlvbnNbMF0sICIkKGhhc2giKQogICAgaGFzaF9zdWZmaXggOj0gdHJpbV9sZWZ0KHBfc3RvcmFnZS5vcHRpb25zWzBdLCAiJChoYXNoIikKCiAgICBlbmRzd2l0aChoYXNoX3N1ZmZpeCwgIikiKQogICAgaGFzaF9pbmRleCA6PSB0cmltX3JpZ2h0KGhhc2hfc3VmZml4LCAiKSIpCiAgICBpIDo9IHRvX251bWJlcihoYXNoX2luZGV4KQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAzOiBpID0iLCBpKQoKICAgIGhhc2hfb3B0aW9uIDo9IGNvbmNhdCgiPSIsIFsiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LnJvb3QtaGFzaCIsIHJvb3RfaGFzaGVzW2ldXSkKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMzogaGFzaF9vcHRpb24gPSIsIGhhc2hfb3B0aW9uKQoKICAgIGNvdW50KGlfc3RvcmFnZS5vcHRpb25zKSA9PSA0CiAgICBpX3N0b3JhZ2Uub3B0aW9uc1swXSA9PSAicm8iCiAgICBpX3N0b3JhZ2Uub3B0aW9uc1sxXSA9PSAiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmJsb2NrX2RldmljZT1maWxlIgogICAgaV9zdG9yYWdlLm9wdGlvbnNbMl0gPT0gImlvLmthdGFjb250YWluZXJzLmZzLW9wdC5pcy1sYXllciIKICAgIGlfc3RvcmFnZS5vcHRpb25zWzNdID09IGhhc2hfb3B0aW9uCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAzOiB0cnVlIikKfQphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgNDogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gInNtYiIKICAgIHBfb3B0c19jb3VudCA6PSBjb3VudChwX3N0b3JhZ2Uub3B0aW9ucykKICAgIGlfb3B0c19jb3VudCA6PSBjb3VudChpX3N0b3JhZ2Uub3B0aW9ucykKICAgIGlfb3B0c19jb3VudCA9PSBwX29wdHNfY291bnQgKyAyCgogICAgaV9vcHRfbWF0Y2hlcyA6PSBbaSB8IGkgOj0gaWR4OyBpZHggPCBwX29wdHNfY291bnQ7IHBfc3RvcmFnZS5vcHRpb25zW2lkeF0gPT0gaV9zdG9yYWdlLm9wdGlvbnNbaWR4XV0KICAgIGNvdW50KGlfb3B0X21hdGNoZXMpID09IHBfb3B0c19jb3VudAoKICAgIHN0YXJ0c3dpdGgoaV9zdG9yYWdlLm9wdGlvbnNbaV9vcHRzX2NvdW50LTJdLCAiYWRkcj0iKQogICAgY3JlZHMgPSBzcGxpdChpX3N0b3JhZ2Uub3B0aW9uc1tpX29wdHNfY291bnQtMV0sICIsIikKICAgIGNvdW50KGNyZWRzKSA9PSAyCiAgICBzdGFydHN3aXRoKGNyZWRzWzBdLCAidXNlcm5hbWU9IikKICAgIHN0YXJ0c3dpdGgoY3JlZHNbMV0sICJwYXNzd29yZD0iKQogICAgCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDQ6IHRydWUiKQp9CgphbGxvd19vdmVybGF5X2xheWVyKHBvbGljeV9pZCwgcG9saWN5X2hhc2gsIGlfb3B0aW9uKSB7CiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogcG9saWN5X2lkID0iLCBwb2xpY3lfaWQsICJwb2xpY3lfaGFzaCA9IiwgcG9saWN5X2hhc2gpCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogaV9vcHRpb24gPSIsIGlfb3B0aW9uKQoKICAgIHN0YXJ0c3dpdGgoaV9vcHRpb24sICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQubGF5ZXI9IikKICAgIGlfdmFsdWUgOj0gcmVwbGFjZShpX29wdGlvbiwgImlvLmthdGFjb250YWluZXJzLmZzLW9wdC5sYXllcj0iLCAiIikKICAgIGlfdmFsdWVfZGVjb2RlZCA6PSBiYXNlNjQuZGVjb2RlKGlfdmFsdWUpCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogaV92YWx1ZV9kZWNvZGVkID0iLCBpX3ZhbHVlX2RlY29kZWQpCgogICAgcG9saWN5X3N1ZmZpeCA6PSBjb25jYXQoIj0iLCBbInRhcixybyxpby5rYXRhY29udGFpbmVycy5mcy1vcHQuYmxvY2tfZGV2aWNlPWZpbGUsaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmlzLWxheWVyLGlvLmthdGFjb250YWluZXJzLmZzLW9wdC5yb290LWhhc2giLCBwb2xpY3lfaGFzaF0pCiAgICBwX3ZhbHVlIDo9IGNvbmNhdCgiLCIsIFtwb2xpY3lfaWQsIHBvbGljeV9zdWZmaXhdKQogICAgcHJpbnQoImFsbG93X292ZXJsYXlfbGF5ZXI6IHBfdmFsdWUgPSIsIHBfdmFsdWUpCgogICAgcF92YWx1ZSA9PSBpX3ZhbHVlX2RlY29kZWQKCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogdHJ1ZSIpCn0KCmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAidGFyIgoKICAgIHN0YXJ0c3dpdGgocF9zdG9yYWdlLm1vdW50X3BvaW50LCAiJChsYXllciIpCiAgICBtb3VudF9zdWZmaXggOj0gdHJpbV9sZWZ0KHBfc3RvcmFnZS5tb3VudF9wb2ludCwgIiQobGF5ZXIiKQoKICAgIGVuZHN3aXRoKG1vdW50X3N1ZmZpeCwgIikiKQogICAgbGF5ZXJfaW5kZXggOj0gdHJpbV9yaWdodChtb3VudF9zdWZmaXgsICIpIikKICAgIGkgOj0gdG9fbnVtYmVyKGxheWVyX2luZGV4KQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDE6IGkgPSIsIGkpCgogICAgbGF5ZXJfaWQgOj0gbGF5ZXJfaWRzW2ldCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMTogbGF5ZXJfaWQgPSIsIGxheWVyX2lkKQoKICAgIHBfbW91bnQgOj0gY29uY2F0KCIvIiwgWyIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L2xheWVycyIsIGxheWVyX2lkXSkKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCAxOiBwX21vdW50ID0iLCBwX21vdW50KQoKICAgIHBfbW91bnQgPT0gaV9zdG9yYWdlLm1vdW50X3BvaW50CgogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDE6IHRydWUiKQp9CmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAiZnVzZTMua2F0YS1vdmVybGF5IgoKICAgIG1vdW50MSA6PSByZXBsYWNlKHBfc3RvcmFnZS5tb3VudF9wb2ludCwgIiQoY3BhdGgpIiwgcG9saWN5X2RhdGEuY29tbW9uLmNwYXRoKQogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDI6IG1vdW50MiA9IiwgbW91bnQyKQoKICAgIG1vdW50MiA9PSBpX3N0b3JhZ2UubW91bnRfcG9pbnQKCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMjogdHJ1ZSIpCn0KYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKSB7CiAgICBwX3N0b3JhZ2UuZnN0eXBlID09ICJsb2NhbCIKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQyID0iLCBtb3VudDIpCgogICAgbW91bnQzIDo9IHJlcGxhY2UobW91bnQyLCAiJChzYW5kYm94LWlkKSIsIHNhbmRib3hfaWQpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQzID0iLCBtb3VudDMpCgogICAgcmVnZXgubWF0Y2gobW91bnQzLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCgogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDM6IHRydWUiKQp9CmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAiYmluZCIKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNDogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNDogbW91bnQyID0iLCBtb3VudDIpCgogICAgbW91bnQzIDo9IHJlcGxhY2UobW91bnQyLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDQ6IG1vdW50MyA9IiwgbW91bnQzKQoKICAgIHJlZ2V4Lm1hdGNoKG1vdW50MywgaV9zdG9yYWdlLm1vdW50X3BvaW50KQoKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA0OiB0cnVlIikKfQphbGxvd19tb3VudF9wb2ludChwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgYnVuZGxlX2lkLCBzYW5kYm94X2lkLCBsYXllcl9pZHMpIHsKICAgIHBfc3RvcmFnZS5mc3R5cGUgPT0gInRtcGZzIgoKICAgIG1vdW50MSA6PSBwX3N0b3JhZ2UubW91bnRfcG9pbnQKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA1OiBtb3VudDEgPSIsIG1vdW50MSkKCiAgICByZWdleC5tYXRjaChtb3VudDEsIGlfc3RvcmFnZS5tb3VudF9wb2ludCkKCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNTogdHJ1ZSIpCn0KYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKSB7CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogaV9zdG9yYWdlLm1vdW50X3BvaW50ID0iLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCiAgICBhbGxvd19kaXJlY3Rfdm9sX2RyaXZlcihwX3N0b3JhZ2UsIGlfc3RvcmFnZSkKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChzcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQyID0iLCBtb3VudDIpCgogICAgZGlyZWN0X3ZvbF9wYXRoIDo9IGlfc3RvcmFnZS5zb3VyY2UKICAgIG1vdW50MyA6PSByZXBsYWNlKG1vdW50MiwgIiQoYjY0LWRpcmVjdC12b2wtcGF0aCkiLCBiYXNlNjR1cmwuZW5jb2RlKGRpcmVjdF92b2xfcGF0aCkpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQzID0iLCBtb3VudDMpCgogICAgbW91bnQzID09IGlfc3RvcmFnZS5tb3VudF9wb2ludAoKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA2OiB0cnVlIikKfQoKYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIocF9zdG9yYWdlLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19kaXJlY3Rfdm9sX2RyaXZlciAxOiBzdGFydCIpCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCiAgICBwcmludCgiYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIgMTogdHJ1ZSIpCn0KYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIocF9zdG9yYWdlLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19kaXJlY3Rfdm9sX2RyaXZlciAyOiBzdGFydCIpCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJzbWIiCiAgICBwcmludCgiYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIgMjogdHJ1ZSIpCn0KCiMgRXhlY1Byb2Nlc3NSZXF1ZXN0LnByb2Nlc3MuQ2FwYWJpbGl0aWVzCmFsbG93X2V4ZWNfY2FwcyhpX2NhcHMpIHsKICAgIG5vdCBpX2NhcHMuQW1iaWVudAogICAgbm90IGlfY2Fwcy5Cb3VuZGluZwogICAgbm90IGlfY2Fwcy5FZmZlY3RpdmUKICAgIG5vdCBpX2NhcHMuSW5oZXJpdGFibGUKICAgIG5vdCBpX2NhcHMuUGVybWl0dGVkCn0KCiMgT0NJLlByb2Nlc3MuQ2FwYWJpbGl0aWVzCmFsbG93X2NhcHMocF9jYXBzLCBpX2NhcHMpIHsKICAgIHByaW50KCJhbGxvd19jYXBzOiBwb2xpY3kgQW1iaWVudCA9IiwgcF9jYXBzLkFtYmllbnQpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgQW1iaWVudCA9IiwgaV9jYXBzLkFtYmllbnQpCiAgICBtYXRjaF9jYXBzKHBfY2Fwcy5BbWJpZW50LCBpX2NhcHMuQW1iaWVudCkKCiAgICBwcmludCgiYWxsb3dfY2FwczogcG9saWN5IEJvdW5kaW5nID0iLCBwX2NhcHMuQm91bmRpbmcpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgQm91bmRpbmcgPSIsIGlfY2Fwcy5Cb3VuZGluZykKICAgIG1hdGNoX2NhcHMocF9jYXBzLkJvdW5kaW5nLCBpX2NhcHMuQm91bmRpbmcpCgogICAgcHJpbnQoImFsbG93X2NhcHM6IHBvbGljeSBFZmZlY3RpdmUgPSIsIHBfY2Fwcy5FZmZlY3RpdmUpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgRWZmZWN0aXZlID0iLCBpX2NhcHMuRWZmZWN0aXZlKQogICAgbWF0Y2hfY2FwcyhwX2NhcHMuRWZmZWN0aXZlLCBpX2NhcHMuRWZmZWN0aXZlKQoKICAgIHByaW50KCJhbGxvd19jYXBzOiBwb2xpY3kgSW5oZXJpdGFibGUgPSIsIHBfY2Fwcy5Jbmhlcml0YWJsZSkKICAgIHByaW50KCJhbGxvd19jYXBzOiBpbnB1dCBJbmhlcml0YWJsZSA9IiwgaV9jYXBzLkluaGVyaXRhYmxlKQogICAgbWF0Y2hfY2FwcyhwX2NhcHMuSW5oZXJpdGFibGUsIGlfY2Fwcy5Jbmhlcml0YWJsZSkKCiAgICBwcmludCgiYWxsb3dfY2FwczogcG9saWN5IFBlcm1pdHRlZCA9IiwgcF9jYXBzLlBlcm1pdHRlZCkKICAgIHByaW50KCJhbGxvd19jYXBzOiBpbnB1dCBQZXJtaXR0ZWQgPSIsIGlfY2Fwcy5QZXJtaXR0ZWQpCiAgICBtYXRjaF9jYXBzKHBfY2Fwcy5QZXJtaXR0ZWQsIGlfY2Fwcy5QZXJtaXR0ZWQpCn0KCm1hdGNoX2NhcHMocF9jYXBzLCBpX2NhcHMpIHsKICAgIHByaW50KCJtYXRjaF9jYXBzIDE6IHN0YXJ0IikKCiAgICBwX2NhcHMgPT0gaV9jYXBzCgogICAgcHJpbnQoIm1hdGNoX2NhcHMgMTogdHJ1ZSIpCn0KbWF0Y2hfY2FwcyhwX2NhcHMsIGlfY2FwcykgewogICAgcHJpbnQoIm1hdGNoX2NhcHMgMjogc3RhcnQiKQoKICAgIGNvdW50KHBfY2FwcykgPT0gMQogICAgcF9jYXBzWzBdID09ICIkKGRlZmF1bHRfY2FwcykiCgogICAgcHJpbnQoIm1hdGNoX2NhcHMgMjogZGVmYXVsdF9jYXBzID0iLCBwb2xpY3lfZGF0YS5jb21tb24uZGVmYXVsdF9jYXBzKQogICAgcG9saWN5X2RhdGEuY29tbW9uLmRlZmF1bHRfY2FwcyA9PSBpX2NhcHMKCiAgICBwcmludCgibWF0Y2hfY2FwcyAyOiB0cnVlIikKfQptYXRjaF9jYXBzKHBfY2FwcywgaV9jYXBzKSB7CiAgICBwcmludCgibWF0Y2hfY2FwcyAzOiBzdGFydCIpCgogICAgY291bnQocF9jYXBzKSA9PSAxCiAgICBwX2NhcHNbMF0gPT0gIiQocHJpdmlsZWdlZF9jYXBzKSIKCiAgICBwcmludCgibWF0Y2hfY2FwcyAzOiBwcml2aWxlZ2VkX2NhcHMgPSIsIHBvbGljeV9kYXRhLmNvbW1vbi5wcml2aWxlZ2VkX2NhcHMpCiAgICBwb2xpY3lfZGF0YS5jb21tb24ucHJpdmlsZWdlZF9jYXBzID09IGlfY2FwcwoKICAgIHByaW50KCJtYXRjaF9jYXBzIDM6IHRydWUiKQp9CgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgpjaGVja19kaXJlY3RvcnlfdHJhdmVyc2FsKGlfcGF0aCkgewogICAgbm90IHJlZ2V4Lm1hdGNoKCIoXnwvKS4uKCR8LykiLCBpX3BhdGgpCn0KCmNoZWNrX3N5bWxpbmtfc291cmNlKGlfc3JjKSB7CiAgICBpX3NyYyA9PSAiIgogICAgcHJpbnQoImNoZWNrX3N5bWxpbmtfc291cmNlIDE6IHRydWUiKQp9CmNoZWNrX3N5bWxpbmtfc291cmNlKGlfc3JjKSB7CiAgICBpX3NyYyAhPSAiIgogICAgcHJpbnQoImNoZWNrX3N5bWxpbmtfc291cmNlIDI6IGlfc3JjID0iLCBpX3NyYykKCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24uc19zb3VyY2UxLCBpX3NyYykKCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMjogdHJ1ZSIpCn0KY2hlY2tfc3ltbGlua19zb3VyY2UoaV9zcmMpIHsKICAgIGlfc3JjICE9ICIiCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMzogaV9zcmMgPSIsIGlfc3JjKQoKICAgIHJlZ2V4Lm1hdGNoKHBvbGljeV9kYXRhLmNvbW1vbi5zX3NvdXJjZTIsIGlfc3JjKQogICAgY2hlY2tfZGlyZWN0b3J5X3RyYXZlcnNhbChpX3NyYykKCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMzogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfc3RvcmFnZXMoaV9zdG9yYWdlcykgewogICAgcHJpbnQoImFsbG93X3NhbmRib3hfc3RvcmFnZXM6IGlfc3RvcmFnZXMgPSIsIGlfc3RvcmFnZXMpCgogICAgcF9zdG9yYWdlcyA6PSBwb2xpY3lfZGF0YS5zYW5kYm94LnN0b3JhZ2VzCiAgICBldmVyeSBpX3N0b3JhZ2UgaW4gaV9zdG9yYWdlcyB7CiAgICAgICAgYWxsb3dfc2FuZGJveF9zdG9yYWdlKHBfc3RvcmFnZXMsIGlfc3RvcmFnZSkKICAgIH0KCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9zdG9yYWdlczogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfc3RvcmFnZShwX3N0b3JhZ2VzLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IGlfc3RvcmFnZSA9IiwgaV9zdG9yYWdlKQoKICAgIHNvbWUgcF9zdG9yYWdlIGluIHBfc3RvcmFnZXMKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IHBfc3RvcmFnZSA9IiwgcF9zdG9yYWdlKQogICAgaV9zdG9yYWdlID09IHBfc3RvcmFnZQoKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IHRydWUiKQp9CgpDb3B5RmlsZVJlcXVlc3QgewogICAgcHJpbnQoIkNvcHlGaWxlUmVxdWVzdDogaW5wdXQucGF0aCA9IiwgaW5wdXQucGF0aCkKCiAgICBjaGVja19zeW1saW5rX3NvdXJjZShpbnB1dC5zeW1saW5rX3NyYykKICAgIGNoZWNrX2RpcmVjdG9yeV90cmF2ZXJzYWwoaW5wdXQucGF0aCkKCiAgICBzb21lIHJlZ2V4MSBpbiBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLkNvcHlGaWxlUmVxdWVzdAogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5jcGF0aCkKICAgIHJlZ2V4NCA6PSByZXBsYWNlKHJlZ2V4MywgIiQoYnVuZGxlLWlkKSIsIEJVTkRMRV9JRCkKICAgIHByaW50KCJDb3B5RmlsZVJlcXVlc3Q6IHJlZ2V4NCA9IiwgcmVnZXg0KQoKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4NCwgaW5wdXQucGF0aCkKCiAgICBwcmludCgiQ29weUZpbGVSZXF1ZXN0OiB0cnVlIikKfQoKQ3JlYXRlU2FuZGJveFJlcXVlc3QgewogICAgcHJpbnQoIkNyZWF0ZVNhbmRib3hSZXF1ZXN0OiBpbnB1dC5ndWVzdF9ob29rX3BhdGggPSIsIGlucHV0Lmd1ZXN0X2hvb2tfcGF0aCkKICAgIGNvdW50KGlucHV0Lmd1ZXN0X2hvb2tfcGF0aCkgPT0gMAoKICAgIHByaW50KCJDcmVhdGVTYW5kYm94UmVxdWVzdDogaW5wdXQua2VybmVsX21vZHVsZXMgPSIsIGlucHV0Lmtlcm5lbF9tb2R1bGVzKQogICAgY291bnQoaW5wdXQua2VybmVsX21vZHVsZXMpID09IDAKCiAgICBpX3BpZG5zIDo9IGlucHV0LnNhbmRib3hfcGlkbnMKICAgIHByaW50KCJDcmVhdGVTYW5kYm94UmVxdWVzdDogaV9waWRucyA9IiwgaV9waWRucykKICAgIGlfcGlkbnMgPT0gZmFsc2UKICAgIGFsbG93X3NhbmRib3hfc3RvcmFnZXMoaW5wdXQuc3RvcmFnZXMpCn0KCmFsbG93X2V4ZWMocF9jb250YWluZXIsIGlfcHJvY2VzcykgewogICAgcHJpbnQoImFsbG93X2V4ZWM6IHN0YXJ0IikKCiAgICBwX29jaSA9IHBfY29udGFpbmVyLk9DSQogICAgcF9zX25hbWUgPSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc19uYW1lc3BhY2UgPSBnZXRfc3RhdGVfdmFsKCJuYW1lc3BhY2UiKQogICAgYWxsb3dfcHJvYmVfcHJvY2VzcyhwX29jaS5Qcm9jZXNzLCBpX3Byb2Nlc3MsIHBfc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfZXhlYzogdHJ1ZSIpCn0KCmFsbG93X2ludGVyYWN0aXZlX2V4ZWMocF9jb250YWluZXIsIGlfcHJvY2VzcykgewogICAgcHJpbnQoImFsbG93X2ludGVyYWN0aXZlX2V4ZWM6IHN0YXJ0IikKCiAgICBwX29jaSA9IHBfY29udGFpbmVyLk9DSQogICAgcF9zX25hbWUgPSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc19uYW1lc3BhY2UgPSBnZXRfc3RhdGVfdmFsKCJuYW1lc3BhY2UiKQogICAgYWxsb3dfaW50ZXJhY3RpdmVfcHJvY2VzcyhwX29jaS5Qcm9jZXNzLCBpX3Byb2Nlc3MsIHBfc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfaW50ZXJhY3RpdmVfZXhlYzogdHJ1ZSIpCn0KCiMgVE9ETzogc2hvdWxkIG90aGVyIEV4ZWNQcm9jZXNzUmVxdWVzdCBpbnB1dCBkYXRhIGZpZWxkcyBiZSB2YWxpZGF0ZWQgYXMgd2VsbD8KRXhlY1Byb2Nlc3NSZXF1ZXN0IHsKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMTogaW5wdXQgPSIsIGlucHV0KQoKICAgIHNvbWUgcF9jb21tYW5kIGluIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuRXhlY1Byb2Nlc3NSZXF1ZXN0LmFsbG93ZWRfY29tbWFuZHMKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMTogcF9jb21tYW5kID0iLCBwX2NvbW1hbmQpCiAgICBwX2NvbW1hbmQgPT0gaW5wdXQucHJvY2Vzcy5BcmdzCgogICAgIyBUT0RPOiBtYXRjaCBwX2NvbnRhaW5lcidzIElEIHdpdGggdGhlIGlucHV0IGNvbnRhaW5lcl9pZC4KICAgIHNvbWUgcF9jb250YWluZXIgaW4gcG9saWN5X2RhdGEuY29udGFpbmVycwogICAgYWxsb3dfaW50ZXJhY3RpdmVfZXhlYyhwX2NvbnRhaW5lciwgaW5wdXQucHJvY2VzcykKCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDE6IHRydWUiKQp9CkV4ZWNQcm9jZXNzUmVxdWVzdCB7CiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDI6IGlucHV0ID0iLCBpbnB1dCkKCiAgICAjIFRPRE86IG1hdGNoIGlucHV0IGNvbnRhaW5lciBJRCB3aXRoIGl0cyBjb3JyZXNwb25kaW5nIGNvbnRhaW5lci5leGVjX2NvbW1hbmRzLgogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBzb21lIHBfY29tbWFuZCBpbiBwX2NvbnRhaW5lci5leGVjX2NvbW1hbmRzCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDI6IHBfY29tbWFuZCA9IiwgcF9jb21tYW5kKQoKICAgICMgVE9ETzogc2hvdWxkIG90aGVyIGlucHV0IGRhdGEgZmllbGRzIGJlIHZhbGlkYXRlZCBhcyB3ZWxsPwogICAgcF9jb21tYW5kID09IGlucHV0LnByb2Nlc3MuQXJncwoKICAgIGFsbG93X2V4ZWMocF9jb250YWluZXIsIGlucHV0LnByb2Nlc3MpCgogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAyOiB0cnVlIikKfQpFeGVjUHJvY2Vzc1JlcXVlc3QgewogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAzOiBpbnB1dCA9IiwgaW5wdXQpCgogICAgaV9jb21tYW5kID0gY29uY2F0KCIgIiwgaW5wdXQucHJvY2Vzcy5BcmdzKQogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAzOiBpX2NvbW1hbmQgPSIsIGlfY29tbWFuZCkKCiAgICBzb21lIHBfcmVnZXggaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5FeGVjUHJvY2Vzc1JlcXVlc3QucmVnZXgKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMzogcF9yZWdleCA9IiwgcF9yZWdleCkKCiAgICByZWdleC5tYXRjaChwX3JlZ2V4LCBpX2NvbW1hbmQpCgogICAgIyBUT0RPOiBtYXRjaCBwX2NvbnRhaW5lcidzIElEIHdpdGggdGhlIGlucHV0IGNvbnRhaW5lcl9pZC4KICAgIHNvbWUgcF9jb250YWluZXIgaW4gcG9saWN5X2RhdGEuY29udGFpbmVycwogICAgYWxsb3dfaW50ZXJhY3RpdmVfZXhlYyhwX2NvbnRhaW5lciwgaW5wdXQucHJvY2VzcykKCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDM6IHRydWUiKQp9CgpVcGRhdGVSb3V0ZXNSZXF1ZXN0IHsKICAgIHByaW50KCJVcGRhdGVSb3V0ZXNSZXF1ZXN0OiBpbnB1dCA9IiwgaW5wdXQpCiAgICBwcmludCgiVXBkYXRlUm91dGVzUmVxdWVzdDogcG9saWN5ID0iLCBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLlVwZGF0ZVJvdXRlc1JlcXVlc3QpCgogICAgaV9yb3V0ZXMgOj0gaW5wdXQucm91dGVzLlJvdXRlcwogICAgcF9zb3VyY2VfcmVnZXggPSBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLlVwZGF0ZVJvdXRlc1JlcXVlc3QuZm9yYmlkZGVuX3NvdXJjZV9yZWdleAogICAgcF9uYW1lcyA9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuVXBkYXRlUm91dGVzUmVxdWVzdC5mb3JiaWRkZW5fZGV2aWNlX25hbWVzCgogICAgZXZlcnkgaV9yb3V0ZSBpbiBpX3JvdXRlcyB7CiAgICAgICAgcHJpbnQoImlfcm91dGUuc291cmNlID0iLCBpX3JvdXRlLnNvdXJjZSkKICAgICAgICBldmVyeSBwX3JlZ2V4IGluIHBfc291cmNlX3JlZ2V4IHsKICAgICAgICAgICAgcHJpbnQoInBfcmVnZXggPSIsIHBfcmVnZXgpCiAgICAgICAgICAgIG5vdCByZWdleC5tYXRjaChwX3JlZ2V4LCBpX3JvdXRlLnNvdXJjZSkKICAgICAgICB9CgogICAgICAgIHByaW50KCJpX3JvdXRlLmRldmljZSA9IiwgaV9yb3V0ZS5kZXZpY2UpCiAgICAgICAgbm90IGlfcm91dGUuZGV2aWNlIGluIHBfbmFtZXMKICAgIH0KCiAgICBwcmludCgiVXBkYXRlUm91dGVzUmVxdWVzdDogdHJ1ZSIpCn0KClVwZGF0ZUludGVyZmFjZVJlcXVlc3QgewogICAgcHJpbnQoIlVwZGF0ZUludGVyZmFjZVJlcXVlc3Q6IGlucHV0ID0iLCBpbnB1dCkKICAgIHByaW50KCJVcGRhdGVJbnRlcmZhY2VSZXF1ZXN0OiBwb2xpY3kgPSIsIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuVXBkYXRlSW50ZXJmYWNlUmVxdWVzdCkKCiAgICBpX2ludGVyZmFjZSA6PSBpbnB1dC5pbnRlcmZhY2UKICAgIHBfZmxhZ3MgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmFsbG93X3Jhd19mbGFncwoKICAgICMgVHlwaWNhbGx5LCBqdXN0IElGRl9OT0FSUCBpcyB1c2VkLgogICAgYml0cy5hbmQoaV9pbnRlcmZhY2UucmF3X2ZsYWdzLCBiaXRzLm5lZ2F0ZShwX2ZsYWdzKSkgPT0gMAoKICAgIHBfbmFtZXMgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmZvcmJpZGRlbl9uYW1lcwoKICAgIG5vdCBpX2ludGVyZmFjZS5uYW1lIGluIHBfbmFtZXMKCiAgICBwX2h3YWRkcnMgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmZvcmJpZGRlbl9od19hZGRycwoKICAgIG5vdCBpX2ludGVyZmFjZS5od0FkZHIgaW4gcF9od2FkZHJzCgogICAgcHJpbnQoIlVwZGF0ZUludGVyZmFjZVJlcXVlc3Q6IHRydWUiKQp9CgpDbG9zZVN0ZGluUmVxdWVzdCB7CiAgICBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLkNsb3NlU3RkaW5SZXF1ZXN0ID09IHRydWUKfQoKUmVhZFN0cmVhbVJlcXVlc3QgewogICAgcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5SZWFkU3RyZWFtUmVxdWVzdCA9PSB0cnVlCn0KClVwZGF0ZUVwaGVtZXJhbE1vdW50c1JlcXVlc3QgewogICAgcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVFcGhlbWVyYWxNb3VudHNSZXF1ZXN0ID09IHRydWUKfQoKV3JpdGVTdHJlYW1SZXF1ZXN0IHsKICAgIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuV3JpdGVTdHJlYW1SZXF1ZXN0ID09IHRydWUKfQoKcG9saWN5X2RhdGEgOj0gewogICJjb250YWluZXJzIjogWwogICAgewogICAgICAiT0NJIjogewogICAgICAgICJWZXJzaW9uIjogIjEuMS4wLXJjLjEiLAogICAgICAgICJQcm9jZXNzIjogewogICAgICAgICAgIlRlcm1pbmFsIjogZmFsc2UsCiAgICAgICAgICAiVXNlciI6IHsKICAgICAgICAgICAgIlVJRCI6IDY1NTM1LAogICAgICAgICAgICAiR0lEIjogNjU1MzUsCiAgICAgICAgICAgICJBZGRpdGlvbmFsR2lkcyI6IFtdLAogICAgICAgICAgICAiVXNlcm5hbWUiOiAiIgogICAgICAgICAgfSwKICAgICAgICAgICJEZXByZWNhdGVkQXJncyI6IFsKICAgICAgICAgICAgIi9wYXVzZSIKICAgICAgICAgIF0sCiAgICAgICAgICAiQXJncyI6IFsKICAgICAgICAgICAgIi9wYXVzZSIKICAgICAgICAgIF0sCiAgICAgICAgICAiRW52IjogWwogICAgICAgICAgICAiUEFUSD0vdXNyL2xvY2FsL3NiaW46L3Vzci9sb2NhbC9iaW46L3Vzci9zYmluOi91c3IvYmluOi9zYmluOi9iaW4iCiAgICAgICAgICBdLAogICAgICAgICAgIkN3ZCI6ICIvIiwKICAgICAgICAgICJDYXBhYmlsaXRpZXMiOiB7CiAgICAgICAgICAgICJBbWJpZW50IjogW10sCiAgICAgICAgICAgICJCb3VuZGluZyI6IFsKICAgICAgICAgICAgICAiJChkZWZhdWx0X2NhcHMpIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiRWZmZWN0aXZlIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJJbmhlcml0YWJsZSI6IFtdLAogICAgICAgICAgICAiUGVybWl0dGVkIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICAiTm9OZXdQcml2aWxlZ2VzIjogdHJ1ZQogICAgICAgIH0sCiAgICAgICAgIlJvb3QiOiB7CiAgICAgICAgICAiUGF0aCI6ICIkKGNwYXRoKS8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgIlJlYWRvbmx5IjogdHJ1ZQogICAgICAgIH0sCiAgICAgICAgIk1vdW50cyI6IFsKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9wcm9jIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJwcm9jIiwKICAgICAgICAgICAgInR5cGVfIjogInByb2MiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2IiwKICAgICAgICAgICAgInNvdXJjZSI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJzdHJpY3RhdGltZSIsCiAgICAgICAgICAgICAgIm1vZGU9NzU1IiwKICAgICAgICAgICAgICAic2l6ZT02NTUzNmsiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L3B0cyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiZGV2cHRzIiwKICAgICAgICAgICAgInR5cGVfIjogImRldnB0cyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJuZXdpbnN0YW5jZSIsCiAgICAgICAgICAgICAgInB0bXhtb2RlPTA2NjYiLAogICAgICAgICAgICAgICJtb2RlPTA2MjAiLAogICAgICAgICAgICAgICJnaWQ9NSIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvc2htIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L3NobSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi9tcXVldWUiLAogICAgICAgICAgICAic291cmNlIjogIm1xdWV1ZSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJtcXVldWUiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvc3lzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJzeXNmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJzeXNmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2V0Yy9yZXNvbHYuY29uZiIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClyZXNvbHYuY29uZiQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJvIiwKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9kZXYiLAogICAgICAgICAgICAgICJub2V4ZWMiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0KICAgICAgICBdLAogICAgICAgICJBbm5vdGF0aW9ucyI6IHsKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmJ1bmRsZV9wYXRoIjogIi9ydW4vY29udGFpbmVyZC9pby5jb250YWluZXJkLnJ1bnRpbWUudjIudGFzay9rOHMuaW8vJChidW5kbGUtaWQpIiwKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIjogInBvZF9zYW5kYm94IiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSI6ICJzYW5kYm94IiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWlkIjogIl5bYS16MC05XXs2NH0kIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWxvZy1kaXJlY3RvcnkiOiAiXi92YXIvbG9nL3BvZHMvJChzYW5kYm94LW5hbWVzcGFjZSlfJChzYW5kYm94LW5hbWUpX1swLTlhLWZdezh9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezEyfSQiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZSI6ICJeZG93bndhcmRcXC1hcGlcXC1lYzBhMmVjMVxcLTliYzZcXC00YzFiXFwtYjc2N1xcLTlmNDYxMTg0OWI0NSQiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZXNwYWNlIjogImRvd253YXJkLWFwaS03MjA2IiwKICAgICAgICAgICJuZXJkY3RsL25ldHdvcmstbmFtZXNwYWNlIjogIl4vdmFyL3J1bi9uZXRucy9jbmktWzAtOWEtZl17OH0tWzAtOWEtZl17NH0tWzAtOWEtZl17NH0tWzAtOWEtZl17NH0tWzAtOWEtZl17MTJ9JCIKICAgICAgICB9LAogICAgICAgICJMaW51eCI6IHsKICAgICAgICAgICJOYW1lc3BhY2VzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgIlR5cGUiOiAiaXBjIiwKICAgICAgICAgICAgICAiUGF0aCI6ICIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiVHlwZSI6ICJ1dHMiLAogICAgICAgICAgICAgICJQYXRoIjogIiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJUeXBlIjogIm1vdW50IiwKICAgICAgICAgICAgICAiUGF0aCI6ICIiCiAgICAgICAgICAgIH0KICAgICAgICAgIF0sCiAgICAgICAgICAiTWFza2VkUGF0aHMiOiBbCiAgICAgICAgICAgICIvcHJvYy9hY3BpIiwKICAgICAgICAgICAgIi9wcm9jL2Fzb3VuZCIsCiAgICAgICAgICAgICIvcHJvYy9rY29yZSIsCiAgICAgICAgICAgICIvcHJvYy9rZXlzIiwKICAgICAgICAgICAgIi9wcm9jL2xhdGVuY3lfc3RhdHMiLAogICAgICAgICAgICAiL3Byb2MvdGltZXJfbGlzdCIsCiAgICAgICAgICAgICIvcHJvYy90aW1lcl9zdGF0cyIsCiAgICAgICAgICAgICIvcHJvYy9zY2hlZF9kZWJ1ZyIsCiAgICAgICAgICAgICIvc3lzL2Zpcm13YXJlIiwKICAgICAgICAgICAgIi9wcm9jL3Njc2kiCiAgICAgICAgICBdLAogICAgICAgICAgIlJlYWRvbmx5UGF0aHMiOiBbCiAgICAgICAgICAgICIvcHJvYy9idXMiLAogICAgICAgICAgICAiL3Byb2MvZnMiLAogICAgICAgICAgICAiL3Byb2MvaXJxIiwKICAgICAgICAgICAgIi9wcm9jL3N5cyIsCiAgICAgICAgICAgICIvcHJvYy9zeXNycS10cmlnZ2VyIgogICAgICAgICAgXSwKICAgICAgICAgICJEZXZpY2VzIjogW10sCiAgICAgICAgICAiU3lzY3RsIjogewogICAgICAgICAgICAibmV0LmlwdjQuaXBfdW5wcml2aWxlZ2VkX3BvcnRfc3RhcnQiOiAiMCIsCiAgICAgICAgICAgICJuZXQuaXB2NC5waW5nX2dyb3VwX3JhbmdlIjogIjAgMjE0NzQ4MzY0NyIKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0sCiAgICAgICJzdG9yYWdlcyI6IFsKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoMCkiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXIwKSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogIm92ZXJsYXlmcyIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAiZnVzZTMua2F0YS1vdmVybGF5IiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiNWE1YWFkODAwNTVmZjIwMDEyYTUwZGMyNWY4ZGY3YTI5OTI0NDc0MzI0ZDY1ZjdkNTMwNmVlOGVlMjdmZjcxZCIsCiAgICAgICAgICAgICI4MTcyNTBmMWEzZTMzNmRhNzZmNWJkM2ZhNzg0ZTFiMjZkOTU5YjljMTMxODc2ODE1YmEyNjA0MDQ4YjcwYzE4IgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGNwYXRoKS8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0KICAgICAgXSwKICAgICAgImRldmljZXMiOiBbXSwKICAgICAgInNhbmRib3hfcGlkbnMiOiBmYWxzZSwKICAgICAgImV4ZWNfY29tbWFuZHMiOiBbXSwKICAgICAgImVudl9tYXAiOiB7CiAgICAgICAgIlBBVEgiOiAiL3Vzci9sb2NhbC9zYmluOi91c3IvbG9jYWwvYmluOi91c3Ivc2JpbjovdXNyL2Jpbjovc2JpbjovYmluIgogICAgICB9CiAgICB9LAogICAgewogICAgICAiT0NJIjogewogICAgICAgICJWZXJzaW9uIjogIjEuMS4wLXJjLjEiLAogICAgICAgICJQcm9jZXNzIjogewogICAgICAgICAgIlRlcm1pbmFsIjogZmFsc2UsCiAgICAgICAgICAiVXNlciI6IHsKICAgICAgICAgICAgIlVJRCI6IDAsCiAgICAgICAgICAgICJHSUQiOiAwLAogICAgICAgICAgICAiQWRkaXRpb25hbEdpZHMiOiBbXSwKICAgICAgICAgICAgIlVzZXJuYW1lIjogIiIKICAgICAgICAgIH0sCiAgICAgICAgICAiRGVwcmVjYXRlZEFyZ3MiOiBbCiAgICAgICAgICAgICJzaCIKICAgICAgICAgIF0sCiAgICAgICAgICAiQXJncyI6IFsKICAgICAgICAgICAgInNoIgogICAgICAgICAgXSwKICAgICAgICAgICJFbnYiOiBbCiAgICAgICAgICAgICJQQVRIPS91c3IvbG9jYWwvc2JpbjovdXNyL2xvY2FsL2JpbjovdXNyL3NiaW46L3Vzci9iaW46L3NiaW46L2JpbiIsCiAgICAgICAgICAgICJIT1NUTkFNRT0kKGhvc3QtbmFtZSkiLAogICAgICAgICAgICAiUE9EX1VJRD0kKHBvZC11aWQpIgogICAgICAgICAgXSwKICAgICAgICAgICJDd2QiOiAiLyIsCiAgICAgICAgICAiQ2FwYWJpbGl0aWVzIjogewogICAgICAgICAgICAiQW1iaWVudCI6IFtdLAogICAgICAgICAgICAiQm91bmRpbmciOiBbCiAgICAgICAgICAgICAgIiQoZGVmYXVsdF9jYXBzKSIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgIkVmZmVjdGl2ZSI6IFsKICAgICAgICAgICAgICAiJChkZWZhdWx0X2NhcHMpIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiSW5oZXJpdGFibGUiOiBbXSwKICAgICAgICAgICAgIlBlcm1pdHRlZCI6IFsKICAgICAgICAgICAgICAiJChkZWZhdWx0X2NhcHMpIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgIk5vTmV3UHJpdmlsZWdlcyI6IGZhbHNlCiAgICAgICAgfSwKICAgICAgICAiUm9vdCI6IHsKICAgICAgICAgICJQYXRoIjogIiQoY3BhdGgpLyQoYnVuZGxlLWlkKSIsCiAgICAgICAgICAiUmVhZG9ubHkiOiBmYWxzZQogICAgICAgIH0sCiAgICAgICAgIk1vdW50cyI6IFsKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9wcm9jIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJwcm9jIiwKICAgICAgICAgICAgInR5cGVfIjogInByb2MiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2IiwKICAgICAgICAgICAgInNvdXJjZSI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJzdHJpY3RhdGltZSIsCiAgICAgICAgICAgICAgIm1vZGU9NzU1IiwKICAgICAgICAgICAgICAic2l6ZT02NTUzNmsiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L3B0cyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiZGV2cHRzIiwKICAgICAgICAgICAgInR5cGVfIjogImRldnB0cyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJuZXdpbnN0YW5jZSIsCiAgICAgICAgICAgICAgInB0bXhtb2RlPTA2NjYiLAogICAgICAgICAgICAgICJtb2RlPTA2MjAiLAogICAgICAgICAgICAgICJnaWQ9NSIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvc2htIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L3NobSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi9tcXVldWUiLAogICAgICAgICAgICAic291cmNlIjogIm1xdWV1ZSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJtcXVldWUiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvc3lzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJzeXNmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJzeXNmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL3N5cy9mcy9jZ3JvdXAiLAogICAgICAgICAgICAic291cmNlIjogImNncm91cCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJjZ3JvdXAiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiLAogICAgICAgICAgICAgICJyZWxhdGltZSIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2V0Yy9ob3N0cyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClob3N0cyQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicnciCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L3Rlcm1pbmF0aW9uLWxvZyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeCl0ZXJtaW5hdGlvbi1sb2ckIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJ3IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2V0Yy9ob3N0bmFtZSIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClob3N0bmFtZSQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicnciCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZXRjL3Jlc29sdi5jb25mIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KXJlc29sdi5jb25mJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJydyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi92YXIvcnVuL3NlY3JldHMva3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudCIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClzZXJ2aWNlYWNjb3VudCQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicm8iCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvdmFyL3J1bi9zZWNyZXRzL2F6dXJlL3Rva2VucyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeCl0b2tlbnMkIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9CiAgICAgICAgXSwKICAgICAgICAiQW5ub3RhdGlvbnMiOiB7CiAgICAgICAgICAiaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5idW5kbGVfcGF0aCI6ICIvcnVuL2NvbnRhaW5lcmQvaW8uY29udGFpbmVyZC5ydW50aW1lLnYyLnRhc2svazhzLmlvLyQoYnVuZGxlLWlkKSIsCiAgICAgICAgICAiaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5jb250YWluZXJfdHlwZSI6ICJwb2RfY29udGFpbmVyIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItbmFtZSI6ICJkYXBpLWNvbnRhaW5lciIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLXR5cGUiOiAiY29udGFpbmVyIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5pbWFnZS1uYW1lIjogInJlZ2lzdHJ5Lms4cy5pby9lMmUtdGVzdC1pbWFnZXMvYnVzeWJveDoxLjI5LTIiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtaWQiOiAiXlthLXowLTldezY0fSQiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZSI6ICJeZG93bndhcmRcXC1hcGlcXC1lYzBhMmVjMVxcLTliYzZcXC00YzFiXFwtYjc2N1xcLTlmNDYxMTg0OWI0NSQiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZXNwYWNlIjogImRvd253YXJkLWFwaS03MjA2IgogICAgICAgIH0sCiAgICAgICAgIkxpbnV4IjogewogICAgICAgICAgIk5hbWVzcGFjZXMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiVHlwZSI6ICJpcGMiLAogICAgICAgICAgICAgICJQYXRoIjogIiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJUeXBlIjogInV0cyIsCiAgICAgICAgICAgICAgIlBhdGgiOiAiIgogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgIlR5cGUiOiAibW91bnQiLAogICAgICAgICAgICAgICJQYXRoIjogIiIKICAgICAgICAgICAgfQogICAgICAgICAgXSwKICAgICAgICAgICJNYXNrZWRQYXRocyI6IFsKICAgICAgICAgICAgIi9wcm9jL2FjcGkiLAogICAgICAgICAgICAiL3Byb2Mva2NvcmUiLAogICAgICAgICAgICAiL3Byb2Mva2V5cyIsCiAgICAgICAgICAgICIvcHJvYy9sYXRlbmN5X3N0YXRzIiwKICAgICAgICAgICAgIi9wcm9jL3RpbWVyX2xpc3QiLAogICAgICAgICAgICAiL3Byb2MvdGltZXJfc3RhdHMiLAogICAgICAgICAgICAiL3Byb2Mvc2NoZWRfZGVidWciLAogICAgICAgICAgICAiL3Byb2Mvc2NzaSIsCiAgICAgICAgICAgICIvc3lzL2Zpcm13YXJlIgogICAgICAgICAgXSwKICAgICAgICAgICJSZWFkb25seVBhdGhzIjogWwogICAgICAgICAgICAiL3Byb2MvYXNvdW5kIiwKICAgICAgICAgICAgIi9wcm9jL2J1cyIsCiAgICAgICAgICAgICIvcHJvYy9mcyIsCiAgICAgICAgICAgICIvcHJvYy9pcnEiLAogICAgICAgICAgICAiL3Byb2Mvc3lzIiwKICAgICAgICAgICAgIi9wcm9jL3N5c3JxLXRyaWdnZXIiCiAgICAgICAgICBdLAogICAgICAgICAgIkRldmljZXMiOiBbXSwKICAgICAgICAgICJTeXNjdGwiOiB7CiAgICAgICAgICAgICJuZXQuaXB2NC5pcF91bnByaXZpbGVnZWRfcG9ydF9zdGFydCI6ICIwIiwKICAgICAgICAgICAgIm5ldC5pcHY0LnBpbmdfZ3JvdXBfcmFuZ2UiOiAiMCAyMTQ3NDgzNjQ3IgogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSwKICAgICAgInN0b3JhZ2VzIjogWwogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2gwKSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjApIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAib3ZlcmxheWZzIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJmdXNlMy5rYXRhLW92ZXJsYXkiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICI0ZDA2NTNmN2M3ZTNmNDliNDkwMDZhOWY0ZTgxM2FhMTE2NmM1MzJhMzRhNzY1MGFmYTZmYWE1MjI2ZjFlYzVmIiwKICAgICAgICAgICAgImJkNWJiMzg3MDlkMjk0M2EzNmEwMmU0NTRlMzRkM2Q2Y2FhMjM4NWZiMTQwZDdmMTc5N2ZkMGEyN2E5MzdkZGIiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQoY3BhdGgpLyQoYnVuZGxlLWlkKSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfQogICAgICBdLAogICAgICAiZGV2aWNlcyI6IFtdLAogICAgICAic2FuZGJveF9waWRucyI6IGZhbHNlLAogICAgICAiZXhlY19jb21tYW5kcyI6IFtdLAogICAgICAiZW52X21hcCI6IHsKICAgICAgICAiSE9TVE5BTUUiOiAiJChob3N0LW5hbWUpIiwKICAgICAgICAiUEFUSCI6ICIvdXNyL2xvY2FsL3NiaW46L3Vzci9sb2NhbC9iaW46L3Vzci9zYmluOi91c3IvYmluOi9zYmluOi9iaW4iLAogICAgICAgICJQT0RfVUlEIjogIiQocG9kLXVpZCkiCiAgICAgIH0KICAgIH0KICBdLAogICJjb21tb24iOiB7CiAgICAiY3BhdGgiOiAiL3J1bi9rYXRhLWNvbnRhaW5lcnMvc2hhcmVkL2NvbnRhaW5lcnMiLAogICAgIm1vdW50X3NvdXJjZV9jcGF0aCI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zaGFyZWQvY29udGFpbmVycyIsCiAgICAic2ZwcmVmaXgiOiAiXiQoY3BhdGgpLyQoYnVuZGxlLWlkKS1bYS16MC05XXsxNn0tIiwKICAgICJzcGF0aCI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L3N0b3JhZ2UiLAogICAgImlwdjRfYSI6ICIoKFswLTldfFsxLTldWzAtOV18MVswLTldezJ9fDJbMC00XVswLTldfDI1WzAtNV0pXFwuKXszfShbMC05XXxbMS05XVswLTldfDFbMC05XXsyfXwyWzAtNF1bMC05XXwyNVswLTVdKSIsCiAgICAiaXBfcCI6ICJbMC05XXsxLDV9IiwKICAgICJzdmNfbmFtZSI6ICJbQS1aX1xcLlxcLV0rIiwKICAgICJkbnNfbGFiZWwiOiAiW2EtekEtWjAtOV9cXC5cXC1dKyIsCiAgICAic19zb3VyY2UxIjogIl4uLjJbMC05XXszfV9bMC0xXVswLTldX1swLTNdWzAtOV1fWzAtMl1bMC05XV9bMC01XVswLTldX1swLTVdWzAtOV1cXC5bMC05XXsxLDEwfSQiLAogICAgInNfc291cmNlMiI6ICJeLi5kYXRhLyIsCiAgICAiZG5zX3N1YmRvbWFpbiI6ICJeW2EtejAtOV0oWy1hLXowLTldKlthLXowLTldKT8kIiwKICAgICJwb2RfdWlkIjogIl5bMC05YS1mQS1GXXs4fS1bMC05YS1mQS1GXXs0fS1bMC05YS1mQS1GXXs0fS1bMC05YS1mQS1GXXs0fS1bMC05YS1mQS1GXXsxMn0kIiwKICAgICJkZWZhdWx0X2NhcHMiOiBbCiAgICAgICJDQVBfQ0hPV04iLAogICAgICAiQ0FQX0RBQ19PVkVSUklERSIsCiAgICAgICJDQVBfRlNFVElEIiwKICAgICAgIkNBUF9GT1dORVIiLAogICAgICAiQ0FQX01LTk9EIiwKICAgICAgIkNBUF9ORVRfUkFXIiwKICAgICAgIkNBUF9TRVRHSUQiLAogICAgICAiQ0FQX1NFVFVJRCIsCiAgICAgICJDQVBfU0VURkNBUCIsCiAgICAgICJDQVBfU0VUUENBUCIsCiAgICAgICJDQVBfTkVUX0JJTkRfU0VSVklDRSIsCiAgICAgICJDQVBfU1lTX0NIUk9PVCIsCiAgICAgICJDQVBfS0lMTCIsCiAgICAgICJDQVBfQVVESVRfV1JJVEUiCiAgICBdLAogICAgInByaXZpbGVnZWRfY2FwcyI6IFsKICAgICAgIkNBUF9DSE9XTiIsCiAgICAgICJDQVBfREFDX09WRVJSSURFIiwKICAgICAgIkNBUF9EQUNfUkVBRF9TRUFSQ0giLAogICAgICAiQ0FQX0ZPV05FUiIsCiAgICAgICJDQVBfRlNFVElEIiwKICAgICAgIkNBUF9LSUxMIiwKICAgICAgIkNBUF9TRVRHSUQiLAogICAgICAiQ0FQX1NFVFVJRCIsCiAgICAgICJDQVBfU0VUUENBUCIsCiAgICAgICJDQVBfTElOVVhfSU1NVVRBQkxFIiwKICAgICAgIkNBUF9ORVRfQklORF9TRVJWSUNFIiwKICAgICAgIkNBUF9ORVRfQlJPQURDQVNUIiwKICAgICAgIkNBUF9ORVRfQURNSU4iLAogICAgICAiQ0FQX05FVF9SQVciLAogICAgICAiQ0FQX0lQQ19MT0NLIiwKICAgICAgIkNBUF9JUENfT1dORVIiLAogICAgICAiQ0FQX1NZU19NT0RVTEUiLAogICAgICAiQ0FQX1NZU19SQVdJTyIsCiAgICAgICJDQVBfU1lTX0NIUk9PVCIsCiAgICAgICJDQVBfU1lTX1BUUkFDRSIsCiAgICAgICJDQVBfU1lTX1BBQ0NUIiwKICAgICAgIkNBUF9TWVNfQURNSU4iLAogICAgICAiQ0FQX1NZU19CT09UIiwKICAgICAgIkNBUF9TWVNfTklDRSIsCiAgICAgICJDQVBfU1lTX1JFU09VUkNFIiwKICAgICAgIkNBUF9TWVNfVElNRSIsCiAgICAgICJDQVBfU1lTX1RUWV9DT05GSUciLAogICAgICAiQ0FQX01LTk9EIiwKICAgICAgIkNBUF9MRUFTRSIsCiAgICAgICJDQVBfQVVESVRfV1JJVEUiLAogICAgICAiQ0FQX0FVRElUX0NPTlRST0wiLAogICAgICAiQ0FQX1NFVEZDQVAiLAogICAgICAiQ0FQX01BQ19PVkVSUklERSIsCiAgICAgICJDQVBfTUFDX0FETUlOIiwKICAgICAgIkNBUF9TWVNMT0ciLAogICAgICAiQ0FQX1dBS0VfQUxBUk0iLAogICAgICAiQ0FQX0JMT0NLX1NVU1BFTkQiLAogICAgICAiQ0FQX0FVRElUX1JFQUQiLAogICAgICAiQ0FQX1BFUkZNT04iLAogICAgICAiQ0FQX0JQRiIsCiAgICAgICJDQVBfQ0hFQ0tQT0lOVF9SRVNUT1JFIgogICAgXSwKICAgICJ2aXJ0aW9fYmxrX3N0b3JhZ2VfY2xhc3NlcyI6IFsKICAgICAgImNjLWxvY2FsLWNzaSIsCiAgICAgICJjYy1tYW5hZ2VkLWNzaSIsCiAgICAgICJjYy1tYW5hZ2VkLXByZW1pdW0tY3NpIgogICAgXSwKICAgICJzbWJfc3RvcmFnZV9jbGFzc2VzIjogWwogICAgICB7CiAgICAgICAgIm5hbWUiOiAiYXp1cmVmaWxlLWNzaS1rYXRhLWNjIiwKICAgICAgICAibW91bnRfb3B0aW9ucyI6IFsKICAgICAgICAgICJkaXJfbW9kZT0wNzc3IiwKICAgICAgICAgICJmaWxlX21vZGU9MDc3NyIsCiAgICAgICAgICAibWZzeW1saW5rcyIsCiAgICAgICAgICAiY2FjaGU9c3RyaWN0IiwKICAgICAgICAgICJub3NoYXJlc29jayIsCiAgICAgICAgICAiYWN0aW1lbz0zMCIsCiAgICAgICAgICAibm9icmwiCiAgICAgICAgXQogICAgICB9CiAgICBdCiAgfSwKICAic2FuZGJveCI6IHsKICAgICJzdG9yYWdlcyI6IFsKICAgICAgewogICAgICAgICJkcml2ZXIiOiAiZXBoZW1lcmFsIiwKICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAic291cmNlIjogInNobSIsCiAgICAgICAgImZzdHlwZSI6ICJ0bXBmcyIsCiAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgIm5vZGV2IiwKICAgICAgICAgICJtb2RlPTE3NzciLAogICAgICAgICAgInNpemU9NjcxMDg4NjQiCiAgICAgICAgXSwKICAgICAgICAibW91bnRfcG9pbnQiOiAiL3J1bi9rYXRhLWNvbnRhaW5lcnMvc2FuZGJveC9zaG0iLAogICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgfQogICAgXQogIH0sCiAgInJlcXVlc3RfZGVmYXVsdHMiOiB7CiAgICAiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdCI6IHsKICAgICAgImFsbG93X2Vudl9yZWdleCI6IFsKICAgICAgICAiXkhPU1ROQU1FPSQoZG5zX2xhYmVsKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfUE9SVF8kKGlwX3ApX1RDUD10Y3A6Ly8kKGlwdjRfYSk6JChpcF9wKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfUE9SVF8kKGlwX3ApX1RDUF9QUk9UTz10Y3AkIiwKICAgICAgICAiXiQoc3ZjX25hbWUpX1BPUlRfJChpcF9wKV9UQ1BfUE9SVD0kKGlwX3ApJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9QT1JUXyQoaXBfcClfVENQX0FERFI9JChpcHY0X2EpJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9TRVJWSUNFX0hPU1Q9JChpcHY0X2EpJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9TRVJWSUNFX1BPUlQ9JChpcF9wKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfU0VSVklDRV9QT1JUXyQoZG5zX2xhYmVsKT0kKGlwX3ApJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9QT1JUPXRjcDovLyQoaXB2NF9hKTokKGlwX3ApJCIsCiAgICAgICAgIl5BWlVSRV9DTElFTlRfSUQ9W0EtRmEtZjAtOS1dKiQiLAogICAgICAgICJeQVpVUkVfVEVOQU5UX0lEPVtBLUZhLWYwLTktXSokIiwKICAgICAgICAiXkFaVVJFX0ZFREVSQVRFRF9UT0tFTl9GSUxFPS92YXIvcnVuL3NlY3JldHMvYXp1cmUvdG9rZW5zL2F6dXJlLWlkZW50aXR5LXRva2VuJCIsCiAgICAgICAgIl5BWlVSRV9BVVRIT1JJVFlfSE9TVD1odHRwczovL2xvZ2luXFwubWljcm9zb2Z0b25saW5lXFwuY29tLyQiLAogICAgICAgICJeVEVSTT14dGVybSQiCiAgICAgIF0sCiAgICAgICJhbGxvd19lbnZfcmVnZXhfbWFwIjogewogICAgICAgICJDUFVfTElNSVQiOiAiXlswLTldKyQiLAogICAgICAgICJKT0JfQ09NUExFVElPTl9JTkRFWCI6ICJeWzAtOV0qJCIsCiAgICAgICAgIk1FTU9SWV9MSU1JVCI6ICJeWzAtOV0rJCIKICAgICAgfQogICAgfSwKICAgICJDb3B5RmlsZVJlcXVlc3QiOiBbCiAgICAgICIkKHNmcHJlZml4KSIKICAgIF0sCiAgICAiRXhlY1Byb2Nlc3NSZXF1ZXN0IjogewogICAgICAiYWxsb3dlZF9jb21tYW5kcyI6IFtdLAogICAgICAicmVnZXgiOiBbXQogICAgfSwKICAgICJVcGRhdGVSb3V0ZXNSZXF1ZXN0IjogewogICAgICAiZm9yYmlkZGVuX2RldmljZV9uYW1lcyI6IFsKICAgICAgICAibG8iCiAgICAgIF0sCiAgICAgICJmb3JiaWRkZW5fc291cmNlX3JlZ2V4IjogWwogICAgICAgICJeKD86MHswLDR9Oil7MCw3fTB7MCwzfTEkIiwKICAgICAgICAiXjEyN1xcLig/OlswLTldezEsM31cXC4pezJ9WzAtOV17MSwzfSQiCiAgICAgIF0KICAgIH0sCiAgICAiVXBkYXRlSW50ZXJmYWNlUmVxdWVzdCI6IHsKICAgICAgImFsbG93X3Jhd19mbGFncyI6IDEyOCwKICAgICAgImZvcmJpZGRlbl9uYW1lcyI6IFsKICAgICAgICAibG8iCiAgICAgIF0sCiAgICAgICJmb3JiaWRkZW5faHdfYWRkcnMiOiBbCiAgICAgICAgIjAwOjAwOjAwOjAwOjAwOjAwIgogICAgICBdCiAgICB9LAogICAgIkNsb3NlU3RkaW5SZXF1ZXN0IjogZmFsc2UsCiAgICAiUmVhZFN0cmVhbVJlcXVlc3QiOiBmYWxzZSwKICAgICJVcGRhdGVFcGhlbWVyYWxNb3VudHNSZXF1ZXN0IjogZmFsc2UsCiAgICAiV3JpdGVTdHJlYW1SZXF1ZXN0IjogZmFsc2UKICB9Cn0= +spec: + containers: + - command: + - sh + env: + - name: POD_UID + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: metadata.uid + image: "registry.k8s.io/e2e-test-images/busybox:1.29-2" + imagePullPolicy: IfNotPresent + name: dapi-container + resources: + limits: + cpu: 1250m + memory: 256Mi + requests: + cpu: 250m + memory: 32Mi + terminationMessagePath: /dev/termination-log + terminationMessagePolicy: File + volumeMounts: + - mountPath: /var/run/secrets/kubernetes.io/serviceaccount + name: kube-api-access-tftbt + readOnly: true + dnsPolicy: ClusterFirst + enableServiceLinks: true + preemptionPolicy: PreemptLowerPriority + priority: 0 + restartPolicy: Never + runtimeClassName: kata-cc + schedulerName: default-scheduler + securityContext: {} + serviceAccount: default + serviceAccountName: default + terminationGracePeriodSeconds: 30 + tolerations: + - effect: NoExecute + key: node.kubernetes.io/not-ready + operator: Exists + tolerationSeconds: 300 + - effect: NoExecute + key: node.kubernetes.io/unreachable + operator: Exists + tolerationSeconds: 300 + - effect: NoSchedule + key: node.kubernetes.io/memory-pressure + operator: Exists + volumes: + - name: kube-api-access-tftbt + projected: + defaultMode: 420 + sources: + - serviceAccountToken: + expirationSeconds: 3607 + path: token + - configMap: + items: + - key: ca.crt + path: ca.crt + name: kube-root-ca.crt + - downwardAPI: + items: + - fieldRef: + apiVersion: v1 + fieldPath: metadata.namespace + path: namespace +status: {} diff --git a/src/agent/samples/policy/yaml/webhook2/webhook-pod11.yaml b/src/agent/samples/policy/yaml/webhook2/webhook-pod11.yaml new file mode 100644 index 000000000000..496c0dd6d1a8 --- /dev/null +++ b/src/agent/samples/policy/yaml/webhook2/webhook-pod11.yaml @@ -0,0 +1,147 @@ +--- +apiVersion: v1 +kind: Namespace +metadata: + name: var-expansion-6653 +--- +apiVersion: v1 +kind: Pod +metadata: + annotations: + notmysubpath: mypath + mysubpath: foo + io.katacontainers.config.agent.policy: IyBDb3B5cmlnaHQgKGMpIDIwMjMgTWljcm9zb2Z0IENvcnBvcmF0aW9uCiMKIyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMAojCnBhY2thZ2UgYWdlbnRfcG9saWN5CgppbXBvcnQgZnV0dXJlLmtleXdvcmRzLmluCmltcG9ydCBmdXR1cmUua2V5d29yZHMuZXZlcnkKCiMgRGVmYXVsdCB2YWx1ZXMsIHJldHVybmVkIGJ5IE9QQSB3aGVuIHJ1bGVzIGNhbm5vdCBiZSBldmFsdWF0ZWQgdG8gdHJ1ZS4KZGVmYXVsdCBBZGRBUlBOZWlnaGJvcnNSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgQWRkU3dhcFJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBDbG9zZVN0ZGluUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IENvcHlGaWxlUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IENyZWF0ZUNvbnRhaW5lclJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBDcmVhdGVTYW5kYm94UmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IERlc3Ryb3lTYW5kYm94UmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgRXhlY1Byb2Nlc3NSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgR2V0T09NRXZlbnRSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBHdWVzdERldGFpbHNSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBMaXN0SW50ZXJmYWNlc1JlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBMaXN0Um91dGVzUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IE1lbUhvdHBsdWdCeVByb2JlUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IE9ubGluZUNQVU1lbVJlcXVlc3QgOj0gdHJ1ZQpkZWZhdWx0IFBhdXNlQ29udGFpbmVyUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFJlYWRTdHJlYW1SZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgUmVtb3ZlQ29udGFpbmVyUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgUmVtb3ZlU3RhbGVWaXJ0aW9mc1NoYXJlTW91bnRzUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgUmVzZWVkUmFuZG9tRGV2UmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFJlc3VtZUNvbnRhaW5lclJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBTZXRHdWVzdERhdGVUaW1lUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFNldFBvbGljeVJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBTaWduYWxQcm9jZXNzUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgU3RhcnRDb250YWluZXJSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBTdGFydFRyYWNpbmdSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgU3RhdHNDb250YWluZXJSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBTdG9wVHJhY2luZ1JlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBUdHlXaW5SZXNpemVSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBVcGRhdGVDb250YWluZXJSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgVXBkYXRlRXBoZW1lcmFsTW91bnRzUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFVwZGF0ZUludGVyZmFjZVJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBVcGRhdGVSb3V0ZXNSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgV2FpdFByb2Nlc3NSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBXcml0ZVN0cmVhbVJlcXVlc3QgOj0gZmFsc2UKCiMgQWxsb3dSZXF1ZXN0c0ZhaWxpbmdQb2xpY3kgOj0gdHJ1ZSBjb25maWd1cmVzIHRoZSBBZ2VudCB0byAqYWxsb3cgYW55CiMgcmVxdWVzdHMgY2F1c2luZyBhIHBvbGljeSBmYWlsdXJlKi4gVGhpcyBpcyBhbiB1bnNlY3VyZSBjb25maWd1cmF0aW9uCiMgYnV0IGlzIHVzZWZ1bCBmb3IgYWxsb3dpbmcgdW5zZWN1cmUgcG9kcyB0byBzdGFydCwgdGhlbiBjb25uZWN0IHRvCiMgdGhlbSBhbmQgaW5zcGVjdCBPUEEgbG9ncyBmb3IgdGhlIHJvb3QgY2F1c2Ugb2YgYSBmYWlsdXJlLgpkZWZhdWx0IEFsbG93UmVxdWVzdHNGYWlsaW5nUG9saWN5IDo9IGZhbHNlCgojIENvbnN0YW50cwpTX05BTUVfS0VZID0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZSIKU19OQU1FU1BBQ0VfS0VZID0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZXNwYWNlIgpCVU5ETEVfSUQgPSAiW2EtejAtOV17NjR9IgoKQ3JlYXRlQ29udGFpbmVyUmVxdWVzdDo9IHJlc3AgewogICAgbm90IGlzX251bGwoaW5wdXQuZW52X21hcCkKICAgIAogICAgaV9lbnZfbWFwIDo9IGlucHV0LmVudl9tYXAKICAgIAogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBwX2Vudl9tYXAgOj0gcF9jb250YWluZXIuZW52X21hcCAgCiAgICBhbGxvd19lbnZfbWFwKHBfZW52X21hcCwgaV9lbnZfbWFwKQogICAgCiAgICBpX3Byb2Nlc3MgOj0gaW5wdXQuYmFzZS5PQ0kuUHJvY2VzcwogICAgCiAgICBwX3Byb2Nlc3MgOj0gcF9jb250YWluZXIuT0NJLlByb2Nlc3MKICAgIAogICAgYWxsb3dfYXJncyhpX3Byb2Nlc3MsIHBfcHJvY2VzcywgaV9lbnZfbWFwKQoKICAgIHJlc3AgPSBDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uKGlucHV0LmJhc2UpCiAgICBwcmludCgiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdDogdHJ1ZSIpCn0KCmFsbG93X2FyZ3MoaV9wcm9jZXNzLCBwX3Byb2Nlc3MsIGlfZW52X21hcCkgewogICAgaV9hcmdzIDo9IGlfcHJvY2Vzcy5BcmdzCiAgICBwX2FyZ3MgOj0gcF9wcm9jZXNzLkFyZ3MKICAgIHByaW50KCJhbGxvd19hcmdzOiBpX2FyZ3MgPSIsIGlfYXJncywgInBfYXJncyA9IiwgcF9hcmdzKQogICAgY291bnQoaV9hcmdzKSA9PSBjb3VudChwX2FyZ3MpCiAgICBldmVyeSBpLCBpX2FyZyBpbiBpX2FyZ3MgewogICAgICAgIHByaW50KCJhbGxvd19hcmdzOiBpX2FyZyA9IiwgaV9hcmcpCiAgICAgICAgcF9hcmdfcmVwbGFjZWQgOj0gcmVwbGFjZV9lbnZfdmFyaWFibGVzKHBfYXJnc1tpXSwgaV9lbnZfbWFwKQogICAgICAgIHByaW50KCJhbGxvd19hcmdzOiBwX2FyZ19yZXBsYWNlZCA9IiwgcF9hcmdfcmVwbGFjZWQpCiAgICAgICAgcF9hcmdfcmVwbGFjZWQyIDo9IHJlcGxhY2UocF9hcmdfcmVwbGFjZWQsICIkJCIsICIkIikKICAgICAgICBwcmludCgiYWxsb3dfYXJnczogcF9hcmdfcmVwbGFjZWQyID0iLCBwX2FyZ19yZXBsYWNlZDIpCiAgICAgICAgaV9hcmcgPT0gcF9hcmdfcmVwbGFjZWQyCiAgICB9CiAgICBwcmludCgiYWxsb3dfYXJnczogdHJ1ZSIpCn0KCmFsbG93X2FyZ3MoaV9wcm9jZXNzLCBwX3Byb2Nlc3MsIGlfZW52X21hcCkgewogICAgbm90IGlfcHJvY2Vzcy5BcmdzCiAgICBub3QgcF9wcm9jZXNzLkFyZ3MKICAgIHByaW50KCJhbGxvd19hcmdzMjogbm8gYXJncyIpCn0KCiMgdGhpcyBmdW5jdGlvbiByZXBsYWNlcyBhbGwgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyBpbiBhIHN0cmluZywgZ2l2ZW4gYSBtYXAgb2YgZW52aXJvbm1lbnQga2V5cyB0byBlbnZpcm9ubWVudCB2YWx1ZXMKIyBlZyBzdHIgPSAiZWNobyAkKENMVVNURVJfSUQpOyBlY2hvICQoTk9ERV9OQU1FKTsiCiMgZW52X21hcCA9IHsiQ0xVU1RFUl9JRCI6ICJhYmMiLCAiTk9ERV9OQU1FIiA6ICJ4eXoifQojIHJlc3VsdCA9ICJlY2hvIGFiYzsgZWNobyB4eXo7IgpyZXBsYWNlX2Vudl92YXJpYWJsZXMoc3RyLCBlbnZfbWFwKSA9IHJlc3VsdCB7CiAgICAjIG1ha2UgYW4gYXJyYXkgb2YgdGhlIGtleXMgZWcgWyJDTFVTVEVSX0lEIiwgIk5PREVfTkFNRSJdCiAgICBrZXlzIDo9IFt4IHwgc29tZSB4IGluIG9iamVjdC5rZXlzKGVudl9tYXApXQogICAgcmVzdWx0IDo9IHJlcGxhY2Vfc3RyX3JlYyhzdHIsIGVudl9tYXAsIGtleXMsIGNvdW50KGtleXMpIC0gMSkKfQoKIyBiYXNlIGNhc2UKcmVwbGFjZV9zdHJfcmVjKHN0ciwgZW52X21hcCwgYXJyX2tleXMsIGkpID0gcmVzdWx0IHsKICAgIGkgPCAwCiAgICByZXN1bHQgOj0gc3RyCn0KCiMgcmVjdXJzaXZlIHN0ZXAKcmVwbGFjZV9zdHJfcmVjKHN0ciwgZW52X21hcCwgYXJyX2tleXMsIGkpID0gcmVzdWx0IHsKICAgIGkgPj0gMAogICAga2V5IDo9IGFycl9rZXlzW2ldCiAgICBlbnZfa2V5MSA6PSBjb25jYXQoIiIsIFsiJCgiLCBrZXksICIpIl0pCiAgICAjIHJlcGxhY2UgJChWQVIpIHdpdGggdmFsdWUKICAgIG5ld19zdHIxIDo9IHJlcGxhY2Uoc3RyLCBlbnZfa2V5MSwgZW52X21hcFtrZXldKQogICAgIyByZXBsYWNlIG5leHQgZW52aXJvbm1lbnQgdmFyaWFibGUKICAgIHJlc3VsdCA9IHJlcGxhY2Vfc3RyX3JlYyhuZXdfc3RyMSwgZW52X21hcCwgYXJyX2tleXMsIGkgLSAxKQp9CgphbGxvd19lbnZfbWFwKHBfZW52X21hcCwgaV9lbnZfbWFwKSB7CiAgICBwcmludCgiYWxsb3dfZW52X21hcDogcF9lbnZfbWFwID0iLCBwX2Vudl9tYXApCiAgICBldmVyeSBlbnZfa2V5LCBlbnZfdmFsIGluIGlfZW52X21hcCB7CiAgICAgICAgcHJpbnQoImFsbG93X2VudjogZW52X2tleSA9IiwgZW52X2tleSwgImVudl92YWwgPSIsIGVudl92YWwpCiAgICAgICAgYWxsb3dfZW52X21hcF9lbnRyeShlbnZfa2V5LCBlbnZfdmFsLCBwX2Vudl9tYXApCiAgICB9CiAgICBwcmludCgiYWxsb3dfZW52X21hcDogdHJ1ZSIpCn0KCiMgQWxsb3cgZXhhY3QgbWF0Y2gKYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBpX3ZhbCA9PSBwX3ZhbAogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnk6IHRydWUiKQp9CgojIEFsbG93IHJlc291cmNlRmllbGRSZWYgdmFsdWVzIChlLmcuLCAibGltaXRzLmNwdSIpLgphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgICMgYSB2YXJpYWJsZSB3ZSBzaG91bGQgYmUgdmFsaWRhdGluZyB1c2luZyBhIHJlZ2V4IGZyb20gc2V0dGluZ3MKICAgIHBfdmFsID09ICIkKHZhbGlkYXRlLWZyb20tc2V0dGluZ3MpIgogICAgcmVnZXhfdmFsIDo9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuQ3JlYXRlQ29udGFpbmVyUmVxdWVzdC5hbGxvd19lbnZfcmVnZXhfbWFwW2tleV0KICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4X3ZhbCwgaV92YWwpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSAyOiB0cnVlIikKfQoKIyBBbGxvdyBub2RlLW5hbWUKYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChub2RlLW5hbWUpIgogICAgcmVnZXgubWF0Y2gocG9saWN5X2RhdGEuY29tbW9uLmRuc19zdWJkb21haW4gLCBpX3ZhbCkKICAgIHByaW50KCJhbGxvd19lbnZfbWFwX2VudHJ5IDM6IHRydWUiKQp9CgojIEFsbG93IGhvc3QtbmFtZQphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgIHBfdmFsID09ICIkKGhvc3QtbmFtZSkiCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24uZG5zX2xhYmVsICwgaV92YWwpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSA0OiB0cnVlIikKfQoKIyBBbGxvdyBwb2QtdWlkCmFsbG93X2Vudl9tYXBfZW50cnkoa2V5LCBpX3ZhbCwgcF9lbnZfbWFwKSB7CiAgICBwX3ZhbCA6PSBwX2Vudl9tYXBba2V5XQogICAgcF92YWwgPT0gIiQocG9kLXVpZCkiCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24ucG9kX3VpZCAsIGlfdmFsKQogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgNTogdHJ1ZSIpCn0KCiMgQWxsb3cgZmllbGRSZWYgImZpZWxkUGF0aDogc3RhdHVzLnBvZElQIiB2YWx1ZXMuCmFsbG93X2Vudl9tYXBfZW50cnkoa2V5LCBpX3ZhbCwgcF9lbnZfbWFwKSB7CiAgICBpc19pcChpX3ZhbCkKCiAgICBwX3ZhbCA6PSBwX2Vudl9tYXBba2V5XQogICAgcF92YXIgOj0gY29uY2F0KCI9IiwgW2tleSwgcF92YWxdKQogICAgYWxsb3dfcG9kX2lwX3ZhcihrZXksIHBfdmFyKQogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgNjogdHJ1ZSIpCn0KCiMgQWxsb3cgZmllbGRSZWYgImZpZWxkUGF0aDogc3RhdHVzLmhvc3RJUCIgdmFsdWVzLgphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgaXNfaXAoaV92YWwpCgogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgIHBfdmFyIDo9IGNvbmNhdCgiPSIsIFtrZXksIHBfdmFsXSkKICAgIGFsbG93X2hvc3RfaXBfdmFyKGtleSwgcF92YXIpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSA3OiB0cnVlIikKfQoKIyBNYXRjaCBpbnB1dCB3aXRoIG9uZSBvZiB0aGUgcG9saWN5IHZhcmlhYmxlcywgYWZ0ZXIgc3Vic3RpdHV0aW5nICQoc2FuZGJveC1uYW1lKS4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChzYW5kYm94LW5hbWUpIgogICAgc19uYW1lIDo9IGlucHV0LmJhc2UuT0NJLkFubm90YXRpb25zW1NfTkFNRV9LRVldCiAgICBwX3ZhcjIgOj0gcmVwbGFjZShwX3ZhbCwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHBfdmFyMiA9PSBpX3ZhbAogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgODogdHJ1ZSIpCn0KCiMgTWF0Y2ggaW5wdXQgd2l0aCBvbmUgb2YgdGhlIHBvbGljeSB2YXJpYWJsZXMsIGFmdGVyIHN1YnN0aXR1dGluZyAkKHNhbmRib3gtbmFtZXNwYWNlKS4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChzYW5kYm94LW5hbWVzcGFjZSkiCiAgICBzX25hbWVzcGFjZSA6PSBpbnB1dC5iYXNlLk9DSS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwX3ZhcjIgOj0gcmVwbGFjZShwX3ZhbCwgIiQoc2FuZGJveC1uYW1lc3BhY2UpIiwgc19uYW1lc3BhY2UpCiAgICBwX3ZhcjIgPT0gaV92YWwKICAgIHByaW50KCJhbGxvd19lbnZfbWFwX2VudHJ5IDk6IHRydWUiKQp9CgojIEFsbG93IGlucHV0IGVudiB2YXJpYWJsZXMgdGhhdCBtYXRjaCB3aXRoIGEgcmVxdWVzdF9kZWZhdWx0cyByZWdleC4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHNvbWUgcF9yZWdleDEgaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5DcmVhdGVDb250YWluZXJSZXF1ZXN0LmFsbG93X2Vudl9yZWdleAogICAgcF9yZWdleDIgOj0gcmVwbGFjZShwX3JlZ2V4MSwgIiQoaXB2NF9hKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcHY0X2EpCiAgICBwX3JlZ2V4MyA6PSByZXBsYWNlKHBfcmVnZXgyLCAiJChpcF9wKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcF9wKQogICAgcF9yZWdleDQgOj0gcmVwbGFjZShwX3JlZ2V4MywgIiQoc3ZjX25hbWUpIiwgcG9saWN5X2RhdGEuY29tbW9uLnN2Y19uYW1lKQogICAgcF9yZWdleDUgOj0gcmVwbGFjZShwX3JlZ2V4NCwgIiQoZG5zX2xhYmVsKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5kbnNfbGFiZWwpCgogICAgcmVzdWx0IDo9IGNvbmNhdCgiPSIsIFtrZXksIGlfdmFsXSkKICAgIHJlZ2V4Lm1hdGNoKHBfcmVnZXg1LCByZXN1bHQpCgogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgMTA6IHRydWUiKQp9CgpDcmVhdGVDb250YWluZXJSZXF1ZXN0Oj0gcmVzcCB7CiAgICBub3QgaW5wdXQuZW52X21hcAogICAgaV9wcm9jZXNzID0gaW5wdXQuT0NJLlByb2Nlc3MKICAgIHNfbmFtZSA9IGlucHV0Lk9DSS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBwX3Byb2Nlc3MgPSBwX2NvbnRhaW5lci5PQ0kuUHJvY2VzcwogICAgYWxsb3dfZGVwcmVjYXRlZF9hcmdzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUpCiAgICByZXNwID0gQ3JlYXRlQ29udGFpbmVyUmVxdWVzdENvbW1vbihpbnB1dCkKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0MjogdHJ1ZSIpCn0KCkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb24ocmVxKTo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgICMgQ2hlY2sgaWYgdGhlIGlucHV0IHJlcXVlc3Qgc2hvdWxkIGJlIHJlamVjdGVkIGV2ZW4gYmVmb3JlIGNoZWNraW5nIHRoZQogICAgIyBwb2xpY3lfZGF0YS5jb250YWluZXJzIGluZm9ybWF0aW9uLgogICAgYWxsb3dfY3JlYXRlX2NvbnRhaW5lcl9pbnB1dChyZXEpCgogICAgaV9vY2kgOj0gcmVxLk9DSQogICAgaV9zdG9yYWdlcyA6PSByZXEuc3RvcmFnZXMKICAgIGlfZGV2aWNlcyA6PSByZXEuZGV2aWNlcwoKICAgICMgYXJyYXkgb2YgcG9zc2libGUgc3RhdGUgb3BlcmF0aW9ucwogICAgb3BzX2J1aWxkZXIgOj0gW10KCiAgICAjIGNoZWNrIHNhbmRib3ggbmFtZQogICAgc2FuZGJveF9uYW1lID0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FX0tFWV0KICAgIGFkZF9zYW5kYm94X25hbWVfdG9fc3RhdGUgOj0gc3RhdGVfYWxsb3dzKCJzYW5kYm94X25hbWUiLCBzYW5kYm94X25hbWUpCiAgICBvcHNfYnVpbGRlcjEgOj0gY29uY2F0X29wX2lmX25vdF9udWxsKG9wc19idWlsZGVyLCBhZGRfc2FuZGJveF9uYW1lX3RvX3N0YXRlKQoKICAgICMgQ2hlY2sgaWYgYW55IGVsZW1lbnQgZnJvbSB0aGUgcG9saWN5X2RhdGEuY29udGFpbmVycyBhcnJheSBhbGxvd3MgdGhlIGlucHV0IHJlcXVlc3QuCiAgICBzb21lIHBfY29udGFpbmVyIGluIHBvbGljeV9kYXRhLmNvbnRhaW5lcnMKICAgIHByaW50KCI9PT09PT09PSBDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiB0cnlpbmcgbmV4dCBwb2xpY3kgY29udGFpbmVyIikKCiAgICBwX3BpZG5zIDo9IHBfY29udGFpbmVyLnNhbmRib3hfcGlkbnMKICAgIGlfcGlkbnMgOj0gcmVxLnNhbmRib3hfcGlkbnMKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiBwX3BpZG5zID0iLCBwX3BpZG5zLCAiaV9waWRucyA9IiwgaV9waWRucykKICAgIHBfcGlkbnMgPT0gaV9waWRucwoKICAgIHBfb2NpIDo9IHBfY29udGFpbmVyLk9DSQoKICAgICMgY2hlY2sgbmFtZXNwYWNlCiAgICBwX25hbWVzcGFjZSA6PSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBpX25hbWVzcGFjZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwcmludCAoIkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb246IHBfbmFtZXNwYWNlID0iLCBwX25hbWVzcGFjZSwgImlfbmFtZXNwYWNlID0iLCBpX25hbWVzcGFjZSkKICAgIGFkZF9uYW1lc3BhY2VfdG9fc3RhdGUgOj0gYWxsb3dfbmFtZXNwYWNlKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkKICAgIG9wc19idWlsZGVyMiA6PSBjb25jYXRfb3BfaWZfbm90X251bGwob3BzX2J1aWxkZXIxLCBhZGRfbmFtZXNwYWNlX3RvX3N0YXRlKQoKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiBwIFZlcnNpb24gPSIsIHBfb2NpLlZlcnNpb24sICJpIFZlcnNpb24gPSIsIGlfb2NpLlZlcnNpb24pCiAgICBwX29jaS5WZXJzaW9uID09IGlfb2NpLlZlcnNpb24KCiAgICBwcmludCgiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdENvbW1vbjogcCBSZWFkb25seSA9IiwgcF9vY2kuUm9vdC5SZWFkb25seSwgImkgUmVhZG9ubHkgPSIsIGlfb2NpLlJvb3QuUmVhZG9ubHkpCiAgICBwX29jaS5Sb290LlJlYWRvbmx5ID09IGlfb2NpLlJvb3QuUmVhZG9ubHkKCiAgICBhbGxvd19hbm5vKHBfb2NpLCBpX29jaSkKCiAgICBwX3N0b3JhZ2VzIDo9IHBfY29udGFpbmVyLnN0b3JhZ2VzCiAgICBhbGxvd19ieV9hbm5vKHBfb2NpLCBpX29jaSwgcF9zdG9yYWdlcywgaV9zdG9yYWdlcykKCiAgICBwX2RldmljZXMgOj0gcF9jb250YWluZXIuZGV2aWNlcwogICAgYWxsb3dfZGV2aWNlcyhwX2RldmljZXMsIGlfZGV2aWNlcykKCiAgICByZXQgOj0gYWxsb3dfbGludXgob3BzX2J1aWxkZXIyLCBwX29jaSwgaV9vY2kpCiAgICByZXQuYWxsb3dlZAoKICAgIG9wcyA6PSByZXQub3BzCgogICAgcHJpbnQoIkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb246IHRydWUiKQp9CgphbGxvd19jcmVhdGVfY29udGFpbmVyX2lucHV0KHJlcSkgewogICAgcHJpbnQoImFsbG93X2NyZWF0ZV9jb250YWluZXJfaW5wdXQ6IGlucHV0ID0iLCByZXEpCgogICAgY291bnQocmVxLnNoYXJlZF9tb3VudHMpID09IDAKICAgIGlzX251bGwocmVxLnN0cmluZ191c2VyKQoKICAgIGlfb2NpIDo9IHJlcS5PQ0kKICAgIGlzX251bGwoaV9vY2kuSG9va3MpCiAgICBpc19udWxsKGlfb2NpLlNvbGFyaXMpCiAgICBpc19udWxsKGlfb2NpLldpbmRvd3MpCgogICAgaV9saW51eCA6PSBpX29jaS5MaW51eAogICAgY291bnQoaV9saW51eC5HSURNYXBwaW5ncykgPT0gMAogICAgY291bnQoaV9saW51eC5Nb3VudExhYmVsKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlJlc291cmNlcy5EZXZpY2VzKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlJvb3Rmc1Byb3BhZ2F0aW9uKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlVJRE1hcHBpbmdzKSA9PSAwCiAgICBpc19udWxsKGlfbGludXguSW50ZWxSZHQpCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLkJsb2NrSU8pCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLk5ldHdvcmspCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLlBpZHMpCiAgICBpc19udWxsKGlfbGludXguU2VjY29tcCkKCiAgICBpX3Byb2Nlc3MgOj0gaV9vY2kuUHJvY2VzcwogICAgY291bnQoaV9wcm9jZXNzLlNlbGludXhMYWJlbCkgPT0gMAogICAgY291bnQoaV9wcm9jZXNzLlVzZXIuVXNlcm5hbWUpID09IDAKCiAgICBwcmludCgiYWxsb3dfY3JlYXRlX2NvbnRhaW5lcl9pbnB1dDogdHJ1ZSIpCn0KCmFsbG93X25hbWVzcGFjZShwX25hbWVzcGFjZSwgaV9uYW1lc3BhY2UpID0gYWRkX25hbWVzcGFjZSB7CiAgICBwX25hbWVzcGFjZSA9PSBpX25hbWVzcGFjZQogICAgYWRkX25hbWVzcGFjZSA6PSBudWxsCiAgICBwcmludCgiYWxsb3dfbmFtZXNwYWNlIDE6IGlucHV0IG5hbWVzcGFjZSBtYXRjaGVzIHBvbGljeSBkYXRhIikKfQoKYWxsb3dfbmFtZXNwYWNlKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkgPSBhZGRfbmFtZXNwYWNlIHsKICAgIHBfbmFtZXNwYWNlID09ICIiCiAgICBwcmludCgiYWxsb3dfbmFtZXNwYWNlIDI6IG5vIG5hbWVzcGFjZSBmb3VuZCBvbiBwb2xpY3kgZGF0YSIpCiAgICBhZGRfbmFtZXNwYWNlIDo9IHN0YXRlX2FsbG93cygibmFtZXNwYWNlIiwgaV9uYW1lc3BhY2UpCn0KCiMgdmFsdWUgaGFzbid0IGJlZW4gc2VlbiBiZWZvcmUsIHNhdmUgaXQgdG8gc3RhdGUKc3RhdGVfYWxsb3dzKGtleSwgdmFsdWUpID0gYWN0aW9uIHsKICBzdGF0ZSA6PSBnZXRfc3RhdGUoKQogIHByaW50KCJzdGF0ZV9hbGxvd3MgMTogc3RhdGVba2V5XSA9Iiwgc3RhdGVba2V5XSwgInZhbHVlID0iLCB2YWx1ZSkKICBub3Qgc3RhdGVba2V5XQogIHByaW50KCJzdGF0ZV9hbGxvd3MgMTogc2F2aW5nIHRvIHN0YXRlIGtleSA9Iiwga2V5LCAidmFsdWUgPSIsIHZhbHVlKQogIHBhdGggOj0gZ2V0X3N0YXRlX3BhdGgoa2V5KSAKICBhY3Rpb24gOj0gewogICAgIm9wIjogImFkZCIsCiAgICAicGF0aCI6IHBhdGgsIAogICAgInZhbHVlIjogdmFsdWUsCiAgfQp9CgojIHZhbHVlIG1hdGNoZXMgd2hhdCdzIGluIHN0YXRlLCBhbGxvdyBpdApzdGF0ZV9hbGxvd3Moa2V5LCB2YWx1ZSkgPSBhY3Rpb24gewogIHByaW50KCJzdGF0ZV9hbGxvd3MgMjogc3RhcnQiKQogIHN0YXRlIDo9IGdldF9zdGF0ZSgpCiAgcHJpbnQoInN0YXRlX2FsbG93cyAyOiBzdGF0ZVtrZXldID0iLCBzdGF0ZVtrZXldLCAidmFsdWUgPSIsIHZhbHVlKQogIHZhbHVlID09IHN0YXRlW2tleV0KICBwcmludCgic3RhdGVfYWxsb3dzIDI6IGZvdW5kIGtleSA9Iiwga2V5LCAidmFsdWUgPSIsIHZhbHVlLCAiIGluIHN0YXRlIikKICBhY3Rpb24gOj0gbnVsbAp9CgojIGhlbHBlciBmdW5jdGlvbnMgdG8gaW50ZXJhY3Qgd2l0aCB0aGUgc3RhdGUKZ2V0X3N0YXRlKCkgPSBzdGF0ZSB7CiAgc3RhdGUgOj0gZGF0YVsicHN0YXRlIl0KfQoKZ2V0X3N0YXRlX3ZhbChrZXkpID0gdmFsdWUgewogICAgc3RhdGUgOj0gZ2V0X3N0YXRlKCkKICAgIHZhbHVlIDo9IHN0YXRlW2tleV0KfQoKZ2V0X3N0YXRlX3BhdGgoa2V5KSA9IHBhdGggewogICAgIyBwcmVwZW5kICIvcHN0YXRlLyIgdG8ga2V5CiAgICBwYXRoIDo9IGNvbmNhdCgiLyIsIFsiL3BzdGF0ZSIsIGtleV0pCn0KCiMgSGVscGVyIGZ1bmN0aW9ucyB0byBjb25kaXRpb25hbGx5IGNvbmNhdGVuYXRlIG9wIGlzIG5vdCBudWxsCmNvbmNhdF9vcF9pZl9ub3RfbnVsbChvcHMsIG9wKSA9IHJlc3VsdCB7CiAgICBvcCA9PSBudWxsCiAgICByZXN1bHQgOj0gb3BzCn0KCmNvbmNhdF9vcF9pZl9ub3RfbnVsbChvcHMsIG9wKSA9IHJlc3VsdCB7CiAgICBvcCAhPSBudWxsCiAgICByZXN1bHQgOj0gYXJyYXkuY29uY2F0KG9wcywgW29wXSkKfQoKIyBSZWplY3QgdW5leHBlY3RlZCBhbm5vdGF0aW9ucy4KYWxsb3dfYW5ubyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19hbm5vIDE6IHN0YXJ0IikKCiAgICBub3QgaV9vY2kuQW5ub3RhdGlvbnMKCiAgICBwcmludCgiYWxsb3dfYW5ubyAxOiB0cnVlIikKfQphbGxvd19hbm5vKHBfb2NpLCBpX29jaSkgewogICAgcHJpbnQoImFsbG93X2Fubm8gMjogcCBBbm5vdGF0aW9ucyA9IiwgcF9vY2kuQW5ub3RhdGlvbnMpCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiBpIEFubm90YXRpb25zID0iLCBpX29jaS5Bbm5vdGF0aW9ucykKCiAgICBpX2tleXMgOj0gb2JqZWN0LmtleXMoaV9vY2kuQW5ub3RhdGlvbnMpCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiBpIGtleXMgPSIsIGlfa2V5cykKCiAgICBldmVyeSBpX2tleSBpbiBpX2tleXMgewogICAgICAgIGFsbG93X2Fubm9fa2V5KGlfa2V5LCBwX29jaSkKICAgIH0KCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiB0cnVlIikKfQoKYWxsb3dfYW5ub19rZXkoaV9rZXksIHBfb2NpKSB7CiAgICBwcmludCgiYWxsb3dfYW5ub19rZXkgMTogaSBrZXkgPSIsIGlfa2V5KQoKICAgIHN0YXJ0c3dpdGgoaV9rZXksICJpby5rdWJlcm5ldGVzLmNyaS4iKQoKICAgIHByaW50KCJhbGxvd19hbm5vX2tleSAxOiB0cnVlIikKfQphbGxvd19hbm5vX2tleShpX2tleSwgcF9vY2kpIHsKICAgIHByaW50KCJhbGxvd19hbm5vX2tleSAyOiBpIGtleSA9IiwgaV9rZXkpCgogICAgc29tZSBwX2tleSwgXyBpbiBwX29jaS5Bbm5vdGF0aW9ucwogICAgcF9rZXkgPT0gaV9rZXkKCiAgICBwcmludCgiYWxsb3dfYW5ub19rZXkgMjogdHJ1ZSIpCn0KCiMgR2V0IHRoZSB2YWx1ZSBvZiB0aGUgU19OQU1FX0tFWSBhbm5vdGF0aW9uIGFuZAojIGNvcnJlbGF0ZSBpdCB3aXRoIG90aGVyIGFubm90YXRpb25zIGFuZCBwcm9jZXNzIGZpZWxkcy4KYWxsb3dfYnlfYW5ubyhwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpIHsKICAgIHByaW50KCJhbGxvd19ieV9hbm5vIDE6IHN0YXJ0IikKCiAgICBub3QgcF9vY2kuQW5ub3RhdGlvbnNbU19OQU1FX0tFWV0KCiAgICBpX3NfbmFtZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMTogaV9zX25hbWUgPSIsIGlfc19uYW1lKQoKICAgIGlfc19uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FU1BBQ0VfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMTogaV9zX25hbWVzcGFjZSA9IiwgaV9zX25hbWVzcGFjZSkKCiAgICBhbGxvd19ieV9zYW5kYm94X25hbWUocF9vY2ksIGlfb2NpLCBwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBpX3NfbmFtZSwgaV9zX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfYnlfYW5ubyAxOiB0cnVlIikKfQphbGxvd19ieV9hbm5vKHBfb2NpLCBpX29jaSwgcF9zdG9yYWdlcywgaV9zdG9yYWdlcykgewogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMjogc3RhcnQiKQoKICAgIHBfc19uYW1lIDo9IHBfb2NpLkFubm90YXRpb25zW1NfTkFNRV9LRVldCiAgICBpX3NfbmFtZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMjogaV9zX25hbWUgPSIsIGlfc19uYW1lLCAicF9zX25hbWUgPSIsIHBfc19uYW1lKQoKICAgIGFsbG93X3NhbmRib3hfbmFtZShwX3NfbmFtZSwgaV9zX25hbWUpCgogICAgaV9zX25hbWVzcGFjZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwcmludCgiYWxsb3dfYnlfYW5ubyAyOiBpX3NfbmFtZXNwYWNlID0iLCBpX3NfbmFtZXNwYWNlKQoKICAgIGFsbG93X2J5X3NhbmRib3hfbmFtZShwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMsIGlfc19uYW1lLCBpX3NfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd19ieV9hbm5vIDI6IHRydWUiKQp9CgphbGxvd19ieV9zYW5kYm94X25hbWUocF9vY2ksIGlfb2NpLCBwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfYnlfc2FuZGJveF9uYW1lOiBzdGFydCIpCgogICAgaV9uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FU1BBQ0VfS0VZXQoKICAgIGFsbG93X2J5X2NvbnRhaW5lcl90eXBlcyhwX29jaSwgaV9vY2ksIHNfbmFtZSwgaV9uYW1lc3BhY2UpCiAgICBhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZChwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpCiAgICBhbGxvd19wcm9jZXNzKHBfb2NpLlByb2Nlc3MsIGlfb2NpLlByb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpCgogICAgcHJpbnQoImFsbG93X2J5X3NhbmRib3hfbmFtZTogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfbmFtZShwX3NfbmFtZSwgaV9zX25hbWUpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X25hbWU6IHN0YXJ0IikKICAgIHJlZ2V4Lm1hdGNoKHBfc19uYW1lLCBpX3NfbmFtZSkKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9uYW1lOiB0cnVlIikKfQoKIyBDaGVjayB0aGF0IHRoZSAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLXR5cGUiIGFuZAojICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIiBhbm5vdGF0aW9ucyBkZXNpZ25hdGUgdGhlCiMgZXhwZWN0ZWQgdHlwZSAtIGVpdGhlciBhICJzYW5kYm94IiBvciBhICJjb250YWluZXIiLiBUaGVuLCB2YWxpZGF0ZQojIG90aGVyIGFubm90YXRpb25zIGJhc2VkIG9uIHRoZSBhY3R1YWwgInNhbmRib3giIG9yICJjb250YWluZXIiIHZhbHVlCiMgZnJvbSB0aGUgaW5wdXQgY29udGFpbmVyLgphbGxvd19ieV9jb250YWluZXJfdHlwZXMocF9vY2ksIGlfb2NpLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfYnlfY29udGFpbmVyX3R5cGVzOiBjaGVja2luZyBpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSIpCgogICAgY190eXBlIDo9ICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSIKICAgIAogICAgcF9jcmlfdHlwZSA6PSBwX29jaS5Bbm5vdGF0aW9uc1tjX3R5cGVdCiAgICBpX2NyaV90eXBlIDo9IGlfb2NpLkFubm90YXRpb25zW2NfdHlwZV0KICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZXM6IHBfY3JpX3R5cGUgPSIsIHBfY3JpX3R5cGUsICJpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgcF9jcmlfdHlwZSA9PSBpX2NyaV90eXBlCgogICAgYWxsb3dfYnlfY29udGFpbmVyX3R5cGUoaV9jcmlfdHlwZSwgcF9vY2ksIGlfb2NpLCBzX25hbWUsIHNfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZXM6IHRydWUiKQp9CgphbGxvd19ieV9jb250YWluZXJfdHlwZShpX2NyaV90eXBlLCBwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAxOiBpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgaV9jcmlfdHlwZSA9PSAic2FuZGJveCIKCiAgICBpX2thdGFfdHlwZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1siaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5jb250YWluZXJfdHlwZSJdCiAgICBwcmludCgiYWxsb3dfYnlfY29udGFpbmVyX3R5cGUgMTogaV9rYXRhX3R5cGUgPSIsIGlfa2F0YV90eXBlKQogICAgaV9rYXRhX3R5cGUgPT0gInBvZF9zYW5kYm94IgoKICAgIGFsbG93X3NhbmRib3hfY29udGFpbmVyX25hbWUocF9vY2ksIGlfb2NpKQogICAgYWxsb3dfc2FuZGJveF9uZXRfbmFtZXNwYWNlKHBfb2NpLCBpX29jaSkKICAgIGFsbG93X3NhbmRib3hfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpCgogICAgcHJpbnQoImFsbG93X2J5X2NvbnRhaW5lcl90eXBlIDE6IHRydWUiKQp9CgphbGxvd19ieV9jb250YWluZXJfdHlwZShpX2NyaV90eXBlLCBwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiBpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgaV9jcmlfdHlwZSA9PSAiY29udGFpbmVyIgoKICAgIGlfa2F0YV90eXBlIDo9IGlfb2NpLkFubm90YXRpb25zWyJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIl0KICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiBpX2thdGFfdHlwZSA9IiwgaV9rYXRhX3R5cGUpCiAgICBpX2thdGFfdHlwZSA9PSAicG9kX2NvbnRhaW5lciIKCiAgICBhbGxvd19jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpCiAgICBhbGxvd19uZXRfbmFtZXNwYWNlKHBfb2NpLCBpX29jaSkKICAgIGFsbG93X2xvZ19kaXJlY3RvcnkocF9vY2ksIGlfb2NpKQoKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiB0cnVlIikKfQoKIyAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLW5hbWUiIGFubm90YXRpb24KYWxsb3dfc2FuZGJveF9jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X2NvbnRhaW5lcl9uYW1lOiBzdGFydCIpCgogICAgY29udGFpbmVyX2Fubm90YXRpb25fbWlzc2luZyhwX29jaSwgaV9vY2ksICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItbmFtZSIpCgogICAgcHJpbnQoImFsbG93X3NhbmRib3hfY29udGFpbmVyX25hbWU6IHRydWUiKQp9CgphbGxvd19jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19jb250YWluZXJfbmFtZTogc3RhcnQiKQoKICAgIGFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uKHBfb2NpLCBpX29jaSwgImlvLmt1YmVybmV0ZXMuY3JpLmNvbnRhaW5lci1uYW1lIikKCiAgICBwcmludCgiYWxsb3dfY29udGFpbmVyX25hbWU6IHRydWUiKQp9Cgpjb250YWluZXJfYW5ub3RhdGlvbl9taXNzaW5nKHBfb2NpLCBpX29jaSwga2V5KSB7CiAgICBwcmludCgiY29udGFpbmVyX2Fubm90YXRpb25fbWlzc2luZzoiLCBrZXkpCgogICAgbm90IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIG5vdCBpX29jaS5Bbm5vdGF0aW9uc1trZXldCgogICAgcHJpbnQoImNvbnRhaW5lcl9hbm5vdGF0aW9uX21pc3Npbmc6IHRydWUiKQp9CgphbGxvd19jb250YWluZXJfYW5ub3RhdGlvbihwX29jaSwgaV9vY2ksIGtleSkgewogICAgcHJpbnQoImFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uOiBrZXkgPSIsIGtleSkKCiAgICBwX3ZhbHVlIDo9IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIGlfdmFsdWUgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgcHJpbnQoImFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uOiBwX3ZhbHVlID0iLCBwX3ZhbHVlLCAiaV92YWx1ZSA9IiwgaV92YWx1ZSkKCiAgICBwX3ZhbHVlID09IGlfdmFsdWUKCiAgICBwcmludCgiYWxsb3dfY29udGFpbmVyX2Fubm90YXRpb246IHRydWUiKQp9CgojICJuZXJkY3RsL25ldHdvcmstbmFtZXNwYWNlIiBhbm5vdGF0aW9uCmFsbG93X3NhbmRib3hfbmV0X25hbWVzcGFjZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X25ldF9uYW1lc3BhY2U6IHN0YXJ0IikKCiAgICBrZXkgOj0gIm5lcmRjdGwvbmV0d29yay1uYW1lc3BhY2UiCgogICAgcF9uYW1lc3BhY2UgOj0gcF9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgaV9uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgcHJpbnQoImFsbG93X3NhbmRib3hfbmV0X25hbWVzcGFjZTogcF9uYW1lc3BhY2UgPSIsIHBfbmFtZXNwYWNlLCAiaV9uYW1lc3BhY2UgPSIsIGlfbmFtZXNwYWNlKQoKICAgIHJlZ2V4Lm1hdGNoKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9uZXRfbmFtZXNwYWNlOiB0cnVlIikKfQoKYWxsb3dfbmV0X25hbWVzcGFjZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19uZXRfbmFtZXNwYWNlOiBzdGFydCIpCgogICAga2V5IDo9ICJuZXJkY3RsL25ldHdvcmstbmFtZXNwYWNlIgoKICAgIG5vdCBwX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICBub3QgaV9vY2kuQW5ub3RhdGlvbnNba2V5XQoKICAgIHByaW50KCJhbGxvd19uZXRfbmFtZXNwYWNlOiB0cnVlIikKfQoKIyAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1sb2ctZGlyZWN0b3J5IiBhbm5vdGF0aW9uCmFsbG93X3NhbmRib3hfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X2xvZ19kaXJlY3Rvcnk6IHN0YXJ0IikKCiAgICBrZXkgOj0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbG9nLWRpcmVjdG9yeSIKCiAgICBwX2RpciA6PSBwX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICByZWdleDEgOj0gcmVwbGFjZShwX2RpciwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHJlZ2V4MiA6PSByZXBsYWNlKHJlZ2V4MSwgIiQoc2FuZGJveC1uYW1lc3BhY2UpIiwgc19uYW1lc3BhY2UpCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiByZWdleDIgPSIsIHJlZ2V4MikKCiAgICBpX2RpciA6PSBpX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiBpX2RpciA9IiwgaV9kaXIpCgogICAgcmVnZXgubWF0Y2gocmVnZXgyLCBpX2RpcikKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiB0cnVlIikKfQoKYWxsb3dfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19sb2dfZGlyZWN0b3J5OiBzdGFydCIpCgogICAga2V5IDo9ICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWxvZy1kaXJlY3RvcnkiCgogICAgbm90IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIG5vdCBpX29jaS5Bbm5vdGF0aW9uc1trZXldCgogICAgcHJpbnQoImFsbG93X2xvZ19kaXJlY3Rvcnk6IHRydWUiKQp9CgphbGxvd19kZXZpY2VzKHBfZGV2aWNlcywgaV9kZXZpY2VzKSB7CiAgICBwcmludCgiYWxsb3dfZGV2aWNlczogc3RhcnQiKQogICAgZXZlcnkgaV9kZXZpY2UgaW4gaV9kZXZpY2VzIHsKICAgICAgICBwcmludCgiYWxsb3dfZGV2aWNlczogaV9kZXZpY2UgPSIsIGlfZGV2aWNlKQogICAgICAgIHNvbWUgcF9kZXZpY2UgaW4gcF9kZXZpY2VzCiAgICAgICAgcF9kZXZpY2UuY29udGFpbmVyX3BhdGggPT0gaV9kZXZpY2UuY29udGFpbmVyX3BhdGgKICAgIH0KICAgIHByaW50KCJhbGxvd19kZXZpY2VzOiB0cnVlIikKfQoKYWxsb3dfbGludXgoc3RhdGVfb3BzLCBwX29jaSwgaV9vY2kpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIHBfbmFtZXNwYWNlcyA6PSBwX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbGludXg6IHAgbmFtZXNwYWNlcyA9IiwgcF9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlcyA6PSBpX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbGludXg6IGkgbmFtZXNwYWNlcyA9IiwgaV9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlX3dpdGhvdXRfbmV0d29yayA6PSBbb2JqIHwgb2JqIDo9IGlfbmFtZXNwYWNlc1tfXTsgb2JqLlR5cGUgIT0gIm5ldHdvcmsiXQoKICAgIHByaW50KCJhbGxvd19saW51eDogaV9uYW1lc3BhY2Vfd2l0aG91dF9uZXR3b3JrID0iLCBpX25hbWVzcGFjZV93aXRob3V0X25ldHdvcmspCgogICAgcF9uYW1lc3BhY2VzID09IGlfbmFtZXNwYWNlX3dpdGhvdXRfbmV0d29yawoKICAgIGFsbG93X21hc2tlZF9wYXRocyhwX29jaSwgaV9vY2kpCiAgICBhbGxvd19yZWFkb25seV9wYXRocyhwX29jaSwgaV9vY2kpCiAgICBhbGxvd19saW51eF9kZXZpY2VzKHBfb2NpLkxpbnV4LkRldmljZXMsIGlfb2NpLkxpbnV4LkRldmljZXMpCiAgICBhbGxvd19saW51eF9zeXNjdGwocF9vY2kuTGludXgsIGlfb2NpLkxpbnV4KQogICAgcmV0IDo9IGFsbG93X25ldHdvcmtfbmFtZXNwYWNlX3N0YXJ0KHN0YXRlX29wcywgcF9vY2ksIGlfb2NpKQogICAgcmV0LmFsbG93ZWQKCiAgICBvcHMgOj0gcmV0Lm9wcwoKICAgIHByaW50KCJhbGxvd19saW51eDogdHJ1ZSIpCn0KCiMgUmV0cmlldmUgdGhlICJuZXR3b3JrIiBuYW1lc3BhY2UgZnJvbSB0aGUgaW5wdXQgZGF0YSBhbmQgcGFzcyBpdCBvbiBmb3IgdGhlCiMgbmV0d29yayBuYW1lc3BhY2UgcG9saWN5IGNoZWNrcy4KYWxsb3dfbmV0d29ya19uYW1lc3BhY2Vfc3RhcnQoc3RhdGVfb3BzLCBwX29jaSwgaV9vY2kpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIHByaW50KCJhbGxvd19uZXR3b3JrX25hbWVzcGFjZSBzdGFydDogc3RhcnQiKQoKICAgIHBfbmFtZXNwYWNlcyA6PSBwX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IHAgbmFtZXNwYWNlcyA9IiwgcF9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlcyA6PSBpX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IGkgbmFtZXNwYWNlcyA9IiwgaV9uYW1lc3BhY2VzKQoKICAgICMgUmV0dXJuIHBhdGggb2YgdGhlICJuZXR3b3JrIiBuYW1lc3BhY2UKICAgIG5ldHdvcmtfbnMgOj0gW29iaiB8IG9iaiA6PSBpX25hbWVzcGFjZXNbX107IG9iai5UeXBlID09ICJuZXR3b3JrIl0KCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IG5ldHdvcmtfbnMgPSIsIG5ldHdvcmtfbnMpCgogICAgcmV0IDo9IGFsbG93X25ldHdvcmtfbmFtZXNwYWNlKHN0YXRlX29wcywgbmV0d29ya19ucykKICAgIHJldC5hbGxvd2VkCgogICAgb3BzIDo9IHJldC5vcHMKfQoKIyBUaGlzIHJ1bGUgaXMgd2hlbiB0aGVyZSdzIG5vIG5ldHdvcmsgbmFtZXNwYWNlIGluIHRoZSBpbnB1dCBkYXRhLgphbGxvd19uZXR3b3JrX25hbWVzcGFjZShzdGF0ZV9vcHMsIG5ldHdvcmtfbnMpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIGNvdW50KG5ldHdvcmtfbnMpID09IDAKCiAgICBuZXR3b3JrX25zX3BhdGggPSAiIgoKICAgIGFkZF9uZXR3b3JrX25hbWVzcGFjZV90b19zdGF0ZSA6PSBzdGF0ZV9hbGxvd3MoIm5ldHdvcmtfbmFtZXNwYWNlIiwgbmV0d29ya19uc19wYXRoKQogICAgb3BzIDo9IGNvbmNhdF9vcF9pZl9ub3RfbnVsbChzdGF0ZV9vcHMsIGFkZF9uZXR3b3JrX25hbWVzcGFjZV90b19zdGF0ZSkKCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2UgMTogdHJ1ZSIpCn0KCiMgVGhpcyBydWxlIGlzIHdoZW4gdGhlcmUncyBleGFjdGx5IG9uZSBuZXR3b3JrIG5hbWVzcGFjZSBpbiB0aGUgaW5wdXQgZGF0YS4KYWxsb3dfbmV0d29ya19uYW1lc3BhY2Uoc3RhdGVfb3BzLCBuZXR3b3JrX25zKSA6PSB7Im9wcyI6IG9wcywgImFsbG93ZWQiOiB0cnVlfSB7CiAgICBjb3VudChuZXR3b3JrX25zKSA9PSAxCgogICAgYWRkX25ldHdvcmtfbmFtZXNwYWNlX3RvX3N0YXRlIDo9IHN0YXRlX2FsbG93cygibmV0d29ya19uYW1lc3BhY2UiLCBuZXR3b3JrX25zWzBdLlBhdGgpCiAgICBvcHMgOj0gY29uY2F0X29wX2lmX25vdF9udWxsKHN0YXRlX29wcywgYWRkX25ldHdvcmtfbmFtZXNwYWNlX3RvX3N0YXRlKQoKICAgIHByaW50KCJhbGxvd19uZXR3b3JrX25hbWVzcGFjZSAyOiB0cnVlIikKfQoKYWxsb3dfbWFza2VkX3BhdGhzKHBfb2NpLCBpX29jaSkgewogICAgcF9wYXRocyA6PSBwX29jaS5MaW51eC5NYXNrZWRQYXRocwogICAgcHJpbnQoImFsbG93X21hc2tlZF9wYXRocyAxOiBwX3BhdGhzID0iLCBwX3BhdGhzKQoKICAgIGlfcGF0aHMgOj0gaV9vY2kuTGludXguTWFza2VkUGF0aHMKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aHMgMTogaV9wYXRocyA9IiwgaV9wYXRocykKCiAgICBhbGxvd19tYXNrZWRfcGF0aHNfYXJyYXkocF9wYXRocywgaV9wYXRocykKCiAgICBwcmludCgiYWxsb3dfbWFza2VkX3BhdGhzIDE6IHRydWUiKQp9CmFsbG93X21hc2tlZF9wYXRocyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aHMgMjogc3RhcnQiKQoKICAgIG5vdCBwX29jaS5MaW51eC5NYXNrZWRQYXRocwogICAgbm90IGlfb2NpLkxpbnV4Lk1hc2tlZFBhdGhzCgogICAgcHJpbnQoImFsbG93X21hc2tlZF9wYXRocyAyOiB0cnVlIikKfQoKIyBBbGwgdGhlIHBvbGljeSBtYXNrZWQgcGF0aHMgbXVzdCBiZSBtYXNrZWQgaW4gdGhlIGlucHV0IGRhdGEgdG9vLgojIElucHV0IGlzIGFsbG93ZWQgdG8gaGF2ZSBtb3JlIG1hc2tlZCBwYXRocyB0aGFuIHRoZSBwb2xpY3kuCmFsbG93X21hc2tlZF9wYXRoc19hcnJheShwX2FycmF5LCBpX2FycmF5KSB7CiAgICBldmVyeSBwX2VsZW0gaW4gcF9hcnJheSB7CiAgICAgICAgYWxsb3dfbWFza2VkX3BhdGgocF9lbGVtLCBpX2FycmF5KQogICAgfQp9CgphbGxvd19tYXNrZWRfcGF0aChwX2VsZW0sIGlfYXJyYXkpIHsKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aDogcF9lbGVtID0iLCBwX2VsZW0pCgogICAgc29tZSBpX2VsZW0gaW4gaV9hcnJheQogICAgcF9lbGVtID09IGlfZWxlbQoKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aDogdHJ1ZSIpCn0KCmFsbG93X3JlYWRvbmx5X3BhdGhzKHBfb2NpLCBpX29jaSkgewogICAgcF9wYXRocyA6PSBwX29jaS5MaW51eC5SZWFkb25seVBhdGhzCiAgICBwcmludCgiYWxsb3dfcmVhZG9ubHlfcGF0aHMgMTogcF9wYXRocyA9IiwgcF9wYXRocykKCiAgICBpX3BhdGhzIDo9IGlfb2NpLkxpbnV4LlJlYWRvbmx5UGF0aHMKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAxOiBpX3BhdGhzID0iLCBpX3BhdGhzKQoKICAgIGFsbG93X3JlYWRvbmx5X3BhdGhzX2FycmF5KHBfcGF0aHMsIGlfcGF0aHMsIGlfb2NpLkxpbnV4Lk1hc2tlZFBhdGhzKQoKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAxOiB0cnVlIikKfQphbGxvd19yZWFkb25seV9wYXRocyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAyOiBzdGFydCIpCgogICAgbm90IHBfb2NpLkxpbnV4LlJlYWRvbmx5UGF0aHMKICAgIG5vdCBpX29jaS5MaW51eC5SZWFkb25seVBhdGhzCgogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGhzIDI6IHRydWUiKQp9CgojIEFsbCB0aGUgcG9saWN5IHJlYWRvbmx5IHBhdGhzIG11c3QgYmUgZWl0aGVyOgojIC0gUHJlc2VudCBpbiB0aGUgaW5wdXQgcmVhZG9ubHkgcGF0aHMsIG9yCiMgLSBQcmVzZW50IGluIHRoZSBpbnB1dCBtYXNrZWQgcGF0aHMuCiMgSW5wdXQgaXMgYWxsb3dlZCB0byBoYXZlIG1vcmUgcmVhZG9ubHkgcGF0aHMgdGhhbiB0aGUgcG9saWN5LgphbGxvd19yZWFkb25seV9wYXRoc19hcnJheShwX2FycmF5LCBpX2FycmF5LCBtYXNrZWRfcGF0aHMpIHsKICAgIGV2ZXJ5IHBfZWxlbSBpbiBwX2FycmF5IHsKICAgICAgICBhbGxvd19yZWFkb25seV9wYXRoKHBfZWxlbSwgaV9hcnJheSwgbWFza2VkX3BhdGhzKQogICAgfQp9CgphbGxvd19yZWFkb25seV9wYXRoKHBfZWxlbSwgaV9hcnJheSwgbWFza2VkX3BhdGhzKSB7CiAgICBwcmludCgiYWxsb3dfcmVhZG9ubHlfcGF0aCAxOiBwX2VsZW0gPSIsIHBfZWxlbSkKCiAgICBzb21lIGlfZWxlbSBpbiBpX2FycmF5CiAgICBwX2VsZW0gPT0gaV9lbGVtCgogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGggMTogdHJ1ZSIpCn0KYWxsb3dfcmVhZG9ubHlfcGF0aChwX2VsZW0sIGlfYXJyYXksIG1hc2tlZF9wYXRocykgewogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGggMjogcF9lbGVtID0iLCBwX2VsZW0pCgogICAgc29tZSBpX21hc2tlZCBpbiBtYXNrZWRfcGF0aHMKICAgIHBfZWxlbSA9PSBpX21hc2tlZAoKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRoIDI6IHRydWUiKQp9CgphbGxvd19saW51eF9kZXZpY2VzKHBfZGV2aWNlcywgaV9kZXZpY2VzKSB7CiAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogc3RhcnQiKQogICAgZXZlcnkgaV9kZXZpY2UgaW4gaV9kZXZpY2VzIHsKICAgICAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogaV9kZXZpY2UgPSIsIGlfZGV2aWNlKQogICAgICAgIHNvbWUgcF9kZXZpY2UgaW4gcF9kZXZpY2VzCiAgICAgICAgaV9kZXZpY2UuUGF0aCA9PSBwX2RldmljZS5QYXRoCiAgICB9CiAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogdHJ1ZSIpCn0KCmFsbG93X2xpbnV4X3N5c2N0bChwX2xpbnV4LCBpX2xpbnV4KSB7CiAgICBwcmludCgiYWxsb3dfbGludXhfc3lzY3RsIDE6IHN0YXJ0IikKICAgIG5vdCBpX2xpbnV4LlN5c2N0bAogICAgcHJpbnQoImFsbG93X2xpbnV4X3N5c2N0bCAxOiB0cnVlIikKfQoKYWxsb3dfbGludXhfc3lzY3RsKHBfbGludXgsIGlfbGludXgpIHsKICAgIHByaW50KCJhbGxvd19saW51eF9zeXNjdGwgMjogc3RhcnQiKQogICAgcF9zeXNjdGwgOj0gcF9saW51eC5TeXNjdGwKICAgIGlfc3lzY3RsIDo9IGlfbGludXguU3lzY3RsCiAgICBldmVyeSBpX25hbWUsIGlfdmFsIGluIGlfc3lzY3RsIHsKICAgICAgICBwcmludCgiYWxsb3dfbGludXhfc3lzY3RsIDI6IGlfbmFtZSA9IiwgaV9uYW1lLCAiaV92YWwgPSIsIGlfdmFsKQogICAgICAgIHBfc3lzY3RsW2lfbmFtZV0gPT0gaV92YWwKICAgIH0KICAgIHByaW50KCJhbGxvd19saW51eF9zeXNjdGwgMjogdHJ1ZSIpCn0KCiMgQ2hlY2sgdGhlIGNvbnNpc3RlbmN5IG9mIHRoZSBpbnB1dCAiaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5idW5kbGVfcGF0aCIKIyBhbmQgaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCIgdmFsdWVzIHdpdGggb3RoZXIgZmllbGRzLgphbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZChwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpIHsKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogc3RhcnQiKQoKICAgIGJ1bmRsZV9wYXRoIDo9IGlfb2NpLkFubm90YXRpb25zWyJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmJ1bmRsZV9wYXRoIl0KICAgIGJ1bmRsZV9pZCA6PSByZXBsYWNlKGJ1bmRsZV9wYXRoLCAiL3J1bi9jb250YWluZXJkL2lvLmNvbnRhaW5lcmQucnVudGltZS52Mi50YXNrL2s4cy5pby8iLCAiIikKCiAgICBidW5kbGVfaWRfZm9ybWF0IDo9IGNvbmNhdCgiIiwgWyJeIiwgQlVORExFX0lELCAiJCJdKQogICAgcmVnZXgubWF0Y2goYnVuZGxlX2lkX2Zvcm1hdCwgYnVuZGxlX2lkKQoKICAgIGtleSA6PSAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCIKCiAgICBwX3JlZ2V4IDo9IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIHNhbmRib3hfaWQgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQoKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogc2FuZGJveF9pZCA9Iiwgc2FuZGJveF9pZCwgInJlZ2V4ID0iLCBwX3JlZ2V4KQogICAgcmVnZXgubWF0Y2gocF9yZWdleCwgc2FuZGJveF9pZCkKCiAgICBhbGxvd19yb290X3BhdGgocF9vY2ksIGlfb2NpLCBidW5kbGVfaWQpCgogICAgZXZlcnkgaV9tb3VudCBpbiBpX29jaS5Nb3VudHMgewogICAgICAgIGFsbG93X21vdW50KHBfb2NpLCBpX21vdW50LCBpX3N0b3JhZ2VzLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpCiAgICB9CgogICAgYWxsb3dfc3RvcmFnZXMocF9zdG9yYWdlcywgaV9zdG9yYWdlcywgYnVuZGxlX2lkLCBzYW5kYm94X2lkKQoKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogdHJ1ZSIpCn0KCmFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHBfcHJvY2VzcyA9IiwgcF9wcm9jZXNzKQogICAgcHJpbnQoImFsbG93X3Byb2Nlc3NfY29tbW9uOiBpX3Byb2Nlc3MgPSAiLCBpX3Byb2Nlc3MpCiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHNfbmFtZSA9Iiwgc19uYW1lKQoKICAgIHBfcHJvY2Vzcy5Dd2QgPT0gaV9wcm9jZXNzLkN3ZAogICAgcF9wcm9jZXNzLk5vTmV3UHJpdmlsZWdlcyA9PSBpX3Byb2Nlc3MuTm9OZXdQcml2aWxlZ2VzCgogICAgYWxsb3dfdXNlcihwX3Byb2Nlc3MsIGlfcHJvY2VzcykKICAgIGFsbG93X2VudihwX3Byb2Nlc3MsIGlfcHJvY2Vzcywgc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHRydWUiKQp9CgojIENvbXBhcmUgdGhlIE9DSSBQcm9jZXNzIGZpZWxkIG9mIGEgcG9saWN5IGNvbnRhaW5lciB3aXRoIHRoZSBpbnB1dCBPQ0kgUHJvY2VzcyBmcm9tIGEgQ3JlYXRlQ29udGFpbmVyUmVxdWVzdAphbGxvd19wcm9jZXNzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfcHJvY2Vzczogc3RhcnQiKQoKICAgIGFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgYWxsb3dfY2FwcyhwX3Byb2Nlc3MuQ2FwYWJpbGl0aWVzLCBpX3Byb2Nlc3MuQ2FwYWJpbGl0aWVzKQogICAgcF9wcm9jZXNzLlRlcm1pbmFsID09IGlfcHJvY2Vzcy5UZXJtaW5hbAoKICAgIHByaW50KCJhbGxvd19wcm9jZXNzOiB0cnVlIikKfQoKIyBDb21wYXJlIHRoZSBPQ0kgUHJvY2VzcyBmaWVsZCBvZiBhIHBvbGljeSBjb250YWluZXIgd2l0aCB0aGUgaW5wdXQgcHJvY2VzcyBmaWVsZCBmcm9tIEV4ZWNQcm9jZXNzUmVxdWVzdAphbGxvd19pbnRlcmFjdGl2ZV9wcm9jZXNzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfaW50ZXJhY3RpdmVfcHJvY2Vzczogc3RhcnQiKQoKICAgIGFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgYWxsb3dfZXhlY19jYXBzKGlfcHJvY2Vzcy5DYXBhYmlsaXRpZXMpCgogICAgIyBUaGVzZSBhcmUgY29tbWFuZHMgZW5hYmxlZCB1c2luZyBFeGVjUHJvY2Vzc1JlcXVlc3QgY29tbWFuZHMgYW5kL29yIHJlZ2V4IGZyb20gdGhlIHNldHRpbmdzIGZpbGUuCiAgICAjIFRoZXkgY2FuIGJlIGV4ZWN1dGVkIGludGVyYWN0aXZlbHkgc28gYWxsb3cgdGhlbSB0byB1c2UgYW55IHZhbHVlIGZvciBpX3Byb2Nlc3MuVGVybWluYWwuCgogICAgcHJpbnQoImFsbG93X2ludGVyYWN0aXZlX3Byb2Nlc3M6IHRydWUiKQp9CgojIENvbXBhcmUgdGhlIE9DSSBQcm9jZXNzIGZpZWxkIG9mIGEgcG9saWN5IGNvbnRhaW5lciB3aXRoIHRoZSBpbnB1dCBwcm9jZXNzIGZpZWxkIGZyb20gRXhlY1Byb2Nlc3NSZXF1ZXN0CmFsbG93X3Byb2JlX3Byb2Nlc3MocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19wcm9iZV9wcm9jZXNzOiBzdGFydCIpCgogICAgYWxsb3dfcHJvY2Vzc19jb21tb24ocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpCiAgICBhbGxvd19leGVjX2NhcHMoaV9wcm9jZXNzLkNhcGFiaWxpdGllcykKICAgIHBfcHJvY2Vzcy5UZXJtaW5hbCA9PSBpX3Byb2Nlc3MuVGVybWluYWwKCiAgICBwcmludCgiYWxsb3dfcHJvYmVfcHJvY2VzczogdHJ1ZSIpCn0KCmFsbG93X3VzZXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MpIHsKICAgIHBfdXNlciA6PSBwX3Byb2Nlc3MuVXNlcgogICAgaV91c2VyIDo9IGlfcHJvY2Vzcy5Vc2VyCgogICAgcHJpbnQoImFsbG93X3VzZXI6IGlucHV0IHVpZCA9IiwgaV91c2VyLlVJRCwgInBvbGljeSB1aWQgPSIsIHBfdXNlci5VSUQpCiAgICBwX3VzZXIuVUlEID09IGlfdXNlci5VSUQKCiAgICAjIFRPRE86IHRyYWNrIGRvd24gdGhlIHJlYXNvbiBmb3IgcmVnaXN0cnkuazhzLmlvL3BhdXNlOjMuOSBiZWluZwogICAgIyAgICAgICBleGVjdXRlZCB3aXRoIGdpZCA9IDAgZGVzcGl0ZSBoYXZpbmcgIjY1NTM1OjY1NTM1IiBpbiBpdHMgY29udGFpbmVyIGltYWdlCiAgICAjICAgICAgIGNvbmZpZy4KICAgICNwcmludCgiYWxsb3dfdXNlcjogaW5wdXQgZ2lkID0iLCBpX3VzZXIuR0lELCAicG9saWN5IGdpZCA9IiwgcF91c2VyLkdJRCkKICAgICNwX3VzZXIuR0lEID09IGlfdXNlci5HSUQKCiAgICAjIFRPRE86IGNvbXBhcmUgdGhlIGFkZGl0aW9uYWxHaWRzIGZpZWxkIHRvbyBhZnRlciBjb21wdXRpbmcgaXRzIHZhbHVlCiAgICAjIGJhc2VkIG9uIC9ldGMvcGFzc3dkIGFuZCAvZXRjL2dyb3VwIGZyb20gdGhlIGNvbnRhaW5lciBpbWFnZS4KfQoKYWxsb3dfZGVwcmVjYXRlZF9hcmdzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZ3MgMTogbm8gYXJncyIpCgogICAgbm90IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJncwogICAgbm90IGlfcHJvY2Vzcy5BcmdzCgogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAxOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZ3MocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSkgewogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiBwb2xpY3kgYXJncyA9IiwgcF9wcm9jZXNzLkRlcHJlY2F0ZWRBcmdzKQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiBpbnB1dCBhcmdzID0iLCBpX3Byb2Nlc3MuQXJncykKCiAgICBjb3VudChwX3Byb2Nlc3MuRGVwcmVjYXRlZEFyZ3MpID09IGNvdW50KGlfcHJvY2Vzcy5BcmdzKQoKICAgIGV2ZXJ5IGksIGlfYXJnIGluIGlfcHJvY2Vzcy5BcmdzIHsKICAgICAgICBhbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpCiAgICB9CgogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDE6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgcF9hcmcyIDo9IHJlcGxhY2UocF9hcmcsICIkJCIsICIkIikKICAgIHBfYXJnMiA9PSBpX2FyZwoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAxOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDI6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgIyBUT0RPOiBjYW4gJChub2RlLW5hbWUpIGJlIGhhbmRsZWQgYmV0dGVyPwogICAgY29udGFpbnMocF9hcmcsICIkKG5vZGUtbmFtZSkiKQoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAyOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDM6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgcF9hcmcyIDo9IHJlcGxhY2UocF9hcmcsICIkJCIsICIkIikKICAgIHBfYXJnMyA6PSByZXBsYWNlKHBfYXJnMiwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAzOiBwX2FyZzMgPSIsIHBfYXJnMykKICAgIHBfYXJnMyA9PSBpX2FyZwoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAzOiB0cnVlIikKfQoKIyBPQ0kgcHJvY2Vzcy5FbnYgZmllbGQKYWxsb3dfZW52KHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfZW52OiBwIGVudiA9IiwgcF9wcm9jZXNzLkVudikKICAgIHByaW50KCJhbGxvd19lbnY6IGkgZW52ID0iLCBpX3Byb2Nlc3MuRW52KQoKICAgIGV2ZXJ5IGlfdmFyIGluIGlfcHJvY2Vzcy5FbnYgewogICAgICAgIHByaW50KCJhbGxvd19lbnY6IGlfdmFyID0iLCBpX3ZhcikKICAgICAgICBhbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgfQoKICAgIHByaW50KCJhbGxvd19lbnY6IHRydWUiKQp9CgojIEFsbG93IGlucHV0IGVudiB2YXJpYWJsZXMgdGhhdCBhcmUgcHJlc2VudCBpbiB0aGUgcG9saWN5IGRhdGEgdG9vLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHBfdmFyID09IGlfdmFyCiAgICBwcmludCgiYWxsb3dfdmFyIDE6IHRydWUiKQp9CgojIE1hdGNoIGlucHV0IHdpdGggb25lIG9mIHRoZSBwb2xpY3kgdmFyaWFibGVzLCBhZnRlciBzdWJzdGl0dXRpbmcgJChzYW5kYm94LW5hbWUpLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHByaW50KCJhbGxvd192YXIgMjogcF92YXIgPSIsIHBfdmFyKQoKICAgIHBfdmFyX3NwbGl0IDo9IHNwbGl0KHBfdmFyLCAiPSIpCiAgICBjb3VudChwX3Zhcl9zcGxpdCkgPT0gMgoKICAgIHBfdmFyX3NwbGl0WzFdID09ICIkKHNhbmRib3gtbmFtZSkiCgogICAgaV92YXJfc3BsaXQgOj0gc3BsaXQoaV92YXIsICI9IikKICAgIGNvdW50KGlfdmFyX3NwbGl0KSA9PSAyCgogICAgaV92YXJfc3BsaXRbMF0gPT0gcF92YXJfc3BsaXRbMF0KICAgIHJlZ2V4Lm1hdGNoKHNfbmFtZSwgaV92YXJfc3BsaXRbMV0pCgogICAgcHJpbnQoImFsbG93X3ZhciAyOiB0cnVlIikKfQoKIyBBbGxvdyBpbnB1dCBlbnYgdmFyaWFibGVzIHRoYXQgbWF0Y2ggd2l0aCBhIHJlcXVlc3RfZGVmYXVsdHMgcmVnZXguCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHNvbWUgcF9yZWdleDEgaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5DcmVhdGVDb250YWluZXJSZXF1ZXN0LmFsbG93X2Vudl9yZWdleAogICAgcF9yZWdleDIgOj0gcmVwbGFjZShwX3JlZ2V4MSwgIiQoaXB2NF9hKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcHY0X2EpCiAgICBwX3JlZ2V4MyA6PSByZXBsYWNlKHBfcmVnZXgyLCAiJChpcF9wKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcF9wKQogICAgcF9yZWdleDQgOj0gcmVwbGFjZShwX3JlZ2V4MywgIiQoc3ZjX25hbWUpIiwgcG9saWN5X2RhdGEuY29tbW9uLnN2Y19uYW1lKQogICAgcF9yZWdleDUgOj0gcmVwbGFjZShwX3JlZ2V4NCwgIiQoZG5zX2xhYmVsKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5kbnNfbGFiZWwpCgogICAgcHJpbnQoImFsbG93X3ZhciAzOiBwX3JlZ2V4NSA9IiwgcF9yZWdleDUpCiAgICByZWdleC5tYXRjaChwX3JlZ2V4NSwgaV92YXIpCgogICAgcHJpbnQoImFsbG93X3ZhciAzOiB0cnVlIikKfQoKIyBBbGxvdyBmaWVsZFJlZiAiZmllbGRQYXRoOiBzdGF0dXMucG9kSVAiIHZhbHVlcy4KYWxsb3dfdmFyKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBpX3Zhciwgc19uYW1lLCBzX25hbWVzcGFjZSkgewogICAgbmFtZV92YWx1ZSA6PSBzcGxpdChpX3ZhciwgIj0iKQogICAgY291bnQobmFtZV92YWx1ZSkgPT0gMgogICAgaXNfaXAobmFtZV92YWx1ZVsxXSkKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIGFsbG93X3BvZF9pcF92YXIobmFtZV92YWx1ZVswXSwgcF92YXIpCgogICAgcHJpbnQoImFsbG93X3ZhciA0OiB0cnVlIikKfQoKIyBBbGxvdyBjb21tb24gZmllbGRSZWYgdmFyaWFibGVzLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBuYW1lX3ZhbHVlIDo9IHNwbGl0KGlfdmFyLCAiPSIpCiAgICBjb3VudChuYW1lX3ZhbHVlKSA9PSAyCgogICAgc29tZSBwX3ZhciBpbiBwX3Byb2Nlc3MuRW52CiAgICBwX25hbWVfdmFsdWUgOj0gc3BsaXQocF92YXIsICI9IikKICAgIGNvdW50KHBfbmFtZV92YWx1ZSkgPT0gMgoKICAgIHBfbmFtZV92YWx1ZVswXSA9PSBuYW1lX3ZhbHVlWzBdCgogICAgIyBUT0RPOiBzaG91bGQgdGhlc2UgYmUgaGFuZGxlZCBpbiBhIGRpZmZlcmVudCB3YXk/CiAgICBhbHdheXNfYWxsb3dlZCA6PSBbIiQoaG9zdC1uYW1lKSIsICIkKG5vZGUtbmFtZSkiLCAiJChwb2QtdWlkKSJdCiAgICBzb21lIGFsbG93ZWQgaW4gYWx3YXlzX2FsbG93ZWQKICAgIGNvbnRhaW5zKHBfbmFtZV92YWx1ZVsxXSwgYWxsb3dlZCkKCiAgICBwcmludCgiYWxsb3dfdmFyIDU6IHRydWUiKQp9CgojIEFsbG93IGZpZWxkUmVmICJmaWVsZFBhdGg6IHN0YXR1cy5ob3N0SVAiIHZhbHVlcy4KYWxsb3dfdmFyKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBpX3Zhciwgc19uYW1lLCBzX25hbWVzcGFjZSkgewogICAgbmFtZV92YWx1ZSA6PSBzcGxpdChpX3ZhciwgIj0iKQogICAgY291bnQobmFtZV92YWx1ZSkgPT0gMgogICAgaXNfaXAobmFtZV92YWx1ZVsxXSkKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIGFsbG93X2hvc3RfaXBfdmFyKG5hbWVfdmFsdWVbMF0sIHBfdmFyKQoKICAgIHByaW50KCJhbGxvd192YXIgNjogdHJ1ZSIpCn0KCiMgQWxsb3cgcmVzb3VyY2VGaWVsZFJlZiB2YWx1ZXMgKGUuZy4sICJsaW1pdHMuY3B1IikuCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIG5hbWVfdmFsdWUgOj0gc3BsaXQoaV92YXIsICI9IikKICAgIGNvdW50KG5hbWVfdmFsdWUpID09IDIKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHBfbmFtZV92YWx1ZSA6PSBzcGxpdChwX3ZhciwgIj0iKQogICAgY291bnQocF9uYW1lX3ZhbHVlKSA9PSAyCgogICAgcF9uYW1lX3ZhbHVlWzBdID09IG5hbWVfdmFsdWVbMF0KCiAgICAjIGEgdmFyaWFibGUgd2Ugc2hvdWxkIGJlIHZhbGlkYXRpbmcgdXNpbmcgYSByZWdleCBmcm9tIHNldHRpbmdzCiAgICBwX25hbWVfdmFsdWVbMV0gPT0gIiQodmFsaWRhdGUtZnJvbS1zZXR0aW5ncykiCgogICAgcmVnZXhfdmFsIDo9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuQ3JlYXRlQ29udGFpbmVyUmVxdWVzdC5hbGxvd19lbnZfcmVnZXhfbWFwW25hbWVfdmFsdWVbMF1dCgogICAgcHJpbnQoImFsbG93X3ZhciA3OiB2YWwgPSIsIG5hbWVfdmFsdWVbMV0pCiAgICBwcmludCgiYWxsb3dfdmFyIDc6IHJlZ2V4X3ZhbCA9IiwgcmVnZXhfdmFsKQoKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4X3ZhbCwgbmFtZV92YWx1ZVsxXSkKCiAgICBwcmludCgiYWxsb3dfdmFyIDc6IHRydWUiKQp9CgojIE1hdGNoIGlucHV0IHdpdGggb25lIG9mIHRoZSBwb2xpY3kgdmFyaWFibGVzLCBhZnRlciBzdWJzdGl0dXRpbmcgJChzYW5kYm94LW5hbWVzcGFjZSkuCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHNvbWUgcF92YXIgaW4gcF9wcm9jZXNzLkVudgogICAgcF92YXIyIDo9IHJlcGxhY2UocF92YXIsICIkKHNhbmRib3gtbmFtZXNwYWNlKSIsIHNfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd192YXIgODogcF92YXIyID0iLCBwX3ZhcjIpCiAgICBwX3ZhcjIgPT0gaV92YXIKCiAgICBwcmludCgiYWxsb3dfdmFyIDg6IHRydWUiKQp9CgphbGxvd19wb2RfaXBfdmFyKHZhcl9uYW1lLCBwX3ZhcikgewogICAgcHJpbnQoImFsbG93X3BvZF9pcF92YXI6IHZhcl9uYW1lID0iLCB2YXJfbmFtZSwgInBfdmFyID0iLCBwX3ZhcikKCiAgICBwX25hbWVfdmFsdWUgOj0gc3BsaXQocF92YXIsICI9IikKICAgIGNvdW50KHBfbmFtZV92YWx1ZSkgPT0gMgoKICAgIHBfbmFtZV92YWx1ZVswXSA9PSB2YXJfbmFtZQogICAgcF9uYW1lX3ZhbHVlWzFdID09ICIkKHBvZC1pcCkiCgogICAgcHJpbnQoImFsbG93X3BvZF9pcF92YXI6IHRydWUiKQp9CgphbGxvd19ob3N0X2lwX3Zhcih2YXJfbmFtZSwgcF92YXIpIHsKICAgIHByaW50KCJhbGxvd19ob3N0X2lwX3ZhcjogdmFyX25hbWUgPSIsIHZhcl9uYW1lLCAicF92YXIgPSIsIHBfdmFyKQoKICAgIHBfbmFtZV92YWx1ZSA6PSBzcGxpdChwX3ZhciwgIj0iKQogICAgY291bnQocF9uYW1lX3ZhbHVlKSA9PSAyCgogICAgcF9uYW1lX3ZhbHVlWzBdID09IHZhcl9uYW1lCiAgICBwX25hbWVfdmFsdWVbMV0gPT0gIiQoaG9zdC1pcCkiCgogICAgcHJpbnQoImFsbG93X2hvc3RfaXBfdmFyOiB0cnVlIikKfQoKaXNfaXAodmFsdWUpIHsKICAgIGJ5dGVzID0gc3BsaXQodmFsdWUsICIuIikKICAgIGNvdW50KGJ5dGVzKSA9PSA0CgogICAgaXNfaXBfZmlyc3RfYnl0ZShieXRlc1swXSkKICAgIGlzX2lwX290aGVyX2J5dGUoYnl0ZXNbMV0pCiAgICBpc19pcF9vdGhlcl9ieXRlKGJ5dGVzWzJdKQogICAgaXNfaXBfb3RoZXJfYnl0ZShieXRlc1szXSkKfQppc19pcF9maXJzdF9ieXRlKGNvbXBvbmVudCkgewogICAgbnVtYmVyID0gdG9fbnVtYmVyKGNvbXBvbmVudCkKICAgIG51bWJlciA+PSAxCiAgICBudW1iZXIgPD0gMjU1Cn0KaXNfaXBfb3RoZXJfYnl0ZShjb21wb25lbnQpIHsKICAgIG51bWJlciA9IHRvX251bWJlcihjb21wb25lbnQpCiAgICBudW1iZXIgPj0gMAogICAgbnVtYmVyIDw9IDI1NQp9CgojIE9DSSByb290LlBhdGgKYWxsb3dfcm9vdF9wYXRoKHBfb2NpLCBpX29jaSwgYnVuZGxlX2lkKSB7CiAgICBpX3BhdGggOj0gaV9vY2kuUm9vdC5QYXRoCiAgICBwX3BhdGgxIDo9IHBfb2NpLlJvb3QuUGF0aAogICAgcHJpbnQoImFsbG93X3Jvb3RfcGF0aDogaV9wYXRoID0iLCBpX3BhdGgsICJwX3BhdGgxID0iLCBwX3BhdGgxKQoKICAgIHBfcGF0aDIgOj0gcmVwbGFjZShwX3BhdGgxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfcm9vdF9wYXRoOiBwX3BhdGgyID0iLCBwX3BhdGgyKQoKICAgIHBfcGF0aDMgOj0gcmVwbGFjZShwX3BhdGgyLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X3Jvb3RfcGF0aDogcF9wYXRoMyA9IiwgcF9wYXRoMykKCiAgICBwX3BhdGgzID09IGlfcGF0aAoKICAgIHByaW50KCJhbGxvd19yb290X3BhdGg6IHRydWUiKQp9CgojIGRldmljZSBtb3VudHMKYWxsb3dfbW91bnQocF9vY2ksIGlfbW91bnQsIGlfc3RvcmFnZXMsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcHJpbnQoImFsbG93X21vdW50OiBpX21vdW50ID0iLCBpX21vdW50KQoKICAgIHNvbWUgcF9tb3VudCBpbiBwX29jaS5Nb3VudHMKICAgIHNvbWUgaV9zdG9yYWdlIGluIGlfc3RvcmFnZXMKCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IHBfbW91bnQgPSIsIHBfbW91bnQpCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IGlfc3RvcmFnZSA9IiwgaV9zdG9yYWdlKQoKICAgIGNoZWNrX21vdW50KHBfbW91bnQsIGlfbW91bnQsIGlfc3RvcmFnZSwgYnVuZGxlX2lkLCBzYW5kYm94X2lkKQoKICAgICMgVE9ETzogYXJlIHRoZXJlIGFueSBvdGhlciByZXF1aXJlZCBwb2xpY3kgY2hlY2tzIGZvciBtb3VudHMgLSBlLmcuLAogICAgIyAgICAgICBtdWx0aXBsZSBtb3VudHMgd2l0aCBzYW1lIHNvdXJjZSBvciBkZXN0aW5hdGlvbj8KCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IHRydWUiKQp9CgpjaGVja19tb3VudChwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcF9tb3VudCA9PSBpX21vdW50CiAgICBwcmludCgiY2hlY2tfbW91bnQgMTogdHJ1ZSIpCn0KY2hlY2tfbW91bnQocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHBfbW91bnQuZGVzdGluYXRpb24gPT0gaV9tb3VudC5kZXN0aW5hdGlvbgogICAgcF9tb3VudC50eXBlXyA9PSBpX21vdW50LnR5cGVfCiAgICBwX21vdW50Lm9wdGlvbnMgPT0gaV9tb3VudC5vcHRpb25zCgogICAgbW91bnRfc291cmNlX2FsbG93cyhwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkKCiAgICBwcmludCgiY2hlY2tfbW91bnQgMjogdHJ1ZSIpCn0KCm1vdW50X3NvdXJjZV9hbGxvd3MocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHJlZ2V4MSA6PSBwX21vdW50LnNvdXJjZQogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5tb3VudF9zb3VyY2VfY3BhdGgpCiAgICByZWdleDQgOj0gcmVwbGFjZShyZWdleDMsICIkKGJ1bmRsZS1pZCkiLCBidW5kbGVfaWQpCgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMTogcmVnZXg0ID0iLCByZWdleDQpCiAgICByZWdleC5tYXRjaChyZWdleDQsIGlfbW91bnQuc291cmNlKQoKICAgIHByaW50KCJtb3VudF9zb3VyY2VfYWxsb3dzIDE6IHRydWUiKQp9Cm1vdW50X3NvdXJjZV9hbGxvd3MocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHJlZ2V4MSA6PSBwX21vdW50LnNvdXJjZQogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5tb3VudF9zb3VyY2VfY3BhdGgpCiAgICByZWdleDQgOj0gcmVwbGFjZShyZWdleDMsICIkKHNhbmRib3gtaWQpIiwgc2FuZGJveF9pZCkKCiAgICBwcmludCgibW91bnRfc291cmNlX2FsbG93cyAyOiByZWdleDQgPSIsIHJlZ2V4NCkKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4NCwgaV9tb3VudC5zb3VyY2UpCgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMjogdHJ1ZSIpCn0KbW91bnRfc291cmNlX2FsbG93cyhwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogaV9tb3VudC5zb3VyY2UgPSIsIGlfbW91bnQuc291cmNlKQogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogaV9zdG9yYWdlLm1vdW50X3BvaW50ID0iLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCgogICAgaV9tb3VudC5zb3VyY2UgPT0gaV9zdG9yYWdlLm1vdW50X3BvaW50CgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogdHJ1ZSIpCn0KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBDcmVhdGUgY29udGFpbmVyIFN0b3JhZ2VzCgphbGxvd19zdG9yYWdlcyhwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHBfY291bnQgOj0gY291bnQocF9zdG9yYWdlcykKICAgIGlfY291bnQgOj0gY291bnQoaV9zdG9yYWdlcykKICAgIHByaW50KCJhbGxvd19zdG9yYWdlczogcF9jb3VudCA9IiwgcF9jb3VudCwgImlfY291bnQgPSIsIGlfY291bnQpCgogICAgcF9jb3VudCA9PSBpX2NvdW50CgogICAgIyBHZXQgdGhlIGNvbnRhaW5lciBpbWFnZSBsYXllciBJRHMgYW5kIHZlcml0eSByb290IGhhc2hlcywgZnJvbSB0aGUgIm92ZXJsYXlmcyIgc3RvcmFnZS4KICAgIHNvbWUgb3ZlcmxheV9zdG9yYWdlIGluIHBfc3RvcmFnZXMKICAgIG92ZXJsYXlfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIHByaW50KCJhbGxvd19zdG9yYWdlczogb3ZlcmxheV9zdG9yYWdlID0iLCBvdmVybGF5X3N0b3JhZ2UpCiAgICBjb3VudChvdmVybGF5X3N0b3JhZ2Uub3B0aW9ucykgPT0gMgoKICAgIGxheWVyX2lkcyA6PSBzcGxpdChvdmVybGF5X3N0b3JhZ2Uub3B0aW9uc1swXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiBsYXllcl9pZHMgPSIsIGxheWVyX2lkcykKCiAgICByb290X2hhc2hlcyA6PSBzcGxpdChvdmVybGF5X3N0b3JhZ2Uub3B0aW9uc1sxXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiByb290X2hhc2hlcyA9Iiwgcm9vdF9oYXNoZXMpCgogICAgZXZlcnkgaV9zdG9yYWdlIGluIGlfc3RvcmFnZXMgewogICAgICAgIGFsbG93X3N0b3JhZ2UocF9zdG9yYWdlcywgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpCiAgICB9CgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiB0cnVlIikKfQoKYWxsb3dfc3RvcmFnZShwX3N0b3JhZ2VzLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgc29tZSBwX3N0b3JhZ2UgaW4gcF9zdG9yYWdlcwoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiBwX3N0b3JhZ2UgPSIsIHBfc3RvcmFnZSkKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiBpX3N0b3JhZ2UgPSIsIGlfc3RvcmFnZSkKCiAgICBwX3N0b3JhZ2UuZHJpdmVyICAgICAgICAgICA9PSBpX3N0b3JhZ2UuZHJpdmVyCiAgICBwX3N0b3JhZ2UuZHJpdmVyX29wdGlvbnMgICA9PSBpX3N0b3JhZ2UuZHJpdmVyX29wdGlvbnMKICAgIHBfc3RvcmFnZS5mc19ncm91cCAgICAgICAgID09IGlfc3RvcmFnZS5mc19ncm91cAogICAgcF9zdG9yYWdlLmZzdHlwZSAgICAgICAgICAgPT0gaV9zdG9yYWdlLmZzdHlwZQoKICAgIGFsbG93X3N0b3JhZ2Vfc291cmNlKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKQogICAgYWxsb3dfc3RvcmFnZV9vcHRpb25zKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKQogICAgYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKQoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiB0cnVlIikKfQoKYWxsb3dfc3RvcmFnZV9zb3VyY2UocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX3NvdXJjZSAxOiBzdGFydCIpCgogICAgcF9zdG9yYWdlLnNvdXJjZSA9PSBpX3N0b3JhZ2Uuc291cmNlCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDE6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX3NvdXJjZShwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDI6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCgogICAgIyBEREREOkJCOkRELkY6IERvbWFpbjpCdXM6RGV2aWNlLkZ1bmN0aW9uCiAgICAjIGh0dHBzOi8vd3d3Lmtlcm5lbC5vcmcvZG9jL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtYnVzLXBjaQogICAgcmVnZXgubWF0Y2goYF5bYS1mMC05XXs0fTpbYS1mMC05XXsyfTpbYS1mMC05XXsyfVwuW2EtZjAtOV0kYCwgaV9zdG9yYWdlLnNvdXJjZSkKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9zb3VyY2UgMjogdHJ1ZSIpCn0KCmFsbG93X3N0b3JhZ2Vfc291cmNlKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKSB7CiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9zb3VyY2UgMzogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIGlfc3RvcmFnZS5zb3VyY2UgPT0gIm5vbmUiCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDM6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX3NvdXJjZShwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDQ6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJzbWIiCgogICAgIyBQYXR0ZXJuOiAvLzxzdG9yYWdlLWFjY291bnQtbmFtZT4uZmlsZS5jb3JlLndpbmRvd3MubmV0LzxrOHMtUFZDLW5hbWU+CiAgICAjIFN0b3JhZ2UgYWNjb3VudCBuYW1lOiBodHRwczovL2xlYXJuLm1pY3Jvc29mdC5jb20vZW4tdXMvYXp1cmUvc3RvcmFnZS9jb21tb24vc3RvcmFnZS1hY2NvdW50LW92ZXJ2aWV3I3N0b3JhZ2UtYWNjb3VudC1uYW1lCiAgICAjIEs4cyBQVkMgbmFtZTogaHR0cHM6Ly9rdWJlcm5ldGVzLmlvL2RvY3MvY29uY2VwdHMvb3ZlcnZpZXcvd29ya2luZy13aXRoLW9iamVjdHMvbmFtZXMvI2Rucy1zdWJkb21haW4tbmFtZXMKICAgIHJlZ2V4Lm1hdGNoKGBeXC9cLyhbYS16MC05XXszLDI0fSlcLmZpbGVcLmNvcmVcLndpbmRvd3NcLm5ldFwvW2EtejAtOV0oW2EtejAtOS4tXXswLDI1MX1bYS16MC05XSk/JGAsIGlfc3RvcmFnZS5zb3VyY2UpCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDQ6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMTogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgIT0gIm92ZXJsYXlmcyIKICAgIHBfc3RvcmFnZS5vcHRpb25zID09IGlfc3RvcmFnZS5vcHRpb25zCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAxOiB0cnVlIikKfQphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIGNvdW50KHBfc3RvcmFnZS5vcHRpb25zKSA9PSAyCgogICAgcG9saWN5X2lkcyA6PSBzcGxpdChwX3N0b3JhZ2Uub3B0aW9uc1swXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBwb2xpY3lfaWRzID0iLCBwb2xpY3lfaWRzKQogICAgcG9saWN5X2lkcyA9PSBsYXllcl9pZHMKCiAgICBwb2xpY3lfaGFzaGVzIDo9IHNwbGl0KHBfc3RvcmFnZS5vcHRpb25zWzFdLCAiOiIpCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IHBvbGljeV9oYXNoZXMgPSIsIHBvbGljeV9oYXNoZXMpCgogICAgcF9jb3VudCA6PSBjb3VudChwb2xpY3lfaWRzKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBwX2NvdW50ID0iLCBwX2NvdW50KQogICAgcF9jb3VudCA+PSAxCiAgICBwX2NvdW50ID09IGNvdW50KHBvbGljeV9oYXNoZXMpCgogICAgaV9jb3VudCA6PSBjb3VudChpX3N0b3JhZ2Uub3B0aW9ucykKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogaV9jb3VudCA9IiwgaV9jb3VudCkKICAgIGlfY291bnQgPT0gcF9jb3VudCArIDMKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zWzBdID0iLCBpX3N0b3JhZ2Uub3B0aW9uc1swXSkKICAgIGlfc3RvcmFnZS5vcHRpb25zWzBdID09ICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQubGF5ZXItc3JjLXByZWZpeD0vdmFyL2xpYi9jb250YWluZXJkL2lvLmNvbnRhaW5lcmQuc25hcHNob3R0ZXIudjEudGFyZGV2L2xheWVycyIKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zW2lfY291bnQgLSAyXSA9IiwgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDJdKQogICAgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDJdID09ICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQub3ZlcmxheS1ydyIKCiAgICBsb3dlcmRpciA6PSBjb25jYXQoIj0iLCBbImxvd2VyZGlyIiwgcF9zdG9yYWdlLm9wdGlvbnNbMF1dKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBsb3dlcmRpciA9IiwgbG93ZXJkaXIpCgogICAgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDFdID09IGxvd2VyZGlyCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zW2lfY291bnQgLSAxXSA9IiwgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDFdKQoKICAgIGV2ZXJ5IGksIHBvbGljeV9pZCBpbiBwb2xpY3lfaWRzIHsKICAgICAgICBhbGxvd19vdmVybGF5X2xheWVyKHBvbGljeV9pZCwgcG9saWN5X2hhc2hlc1tpXSwgaV9zdG9yYWdlLm9wdGlvbnNbaSArIDFdKQogICAgfQoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogdHJ1ZSIpCn0KYWxsb3dfc3RvcmFnZV9vcHRpb25zKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKSB7CiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDM6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCiAgICBjb3VudChwX3N0b3JhZ2Uub3B0aW9ucykgPT0gMQoKICAgIHN0YXJ0c3dpdGgocF9zdG9yYWdlLm9wdGlvbnNbMF0sICIkKGhhc2giKQogICAgaGFzaF9zdWZmaXggOj0gdHJpbV9sZWZ0KHBfc3RvcmFnZS5vcHRpb25zWzBdLCAiJChoYXNoIikKCiAgICBlbmRzd2l0aChoYXNoX3N1ZmZpeCwgIikiKQogICAgaGFzaF9pbmRleCA6PSB0cmltX3JpZ2h0KGhhc2hfc3VmZml4LCAiKSIpCiAgICBpIDo9IHRvX251bWJlcihoYXNoX2luZGV4KQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAzOiBpID0iLCBpKQoKICAgIGhhc2hfb3B0aW9uIDo9IGNvbmNhdCgiPSIsIFsiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LnJvb3QtaGFzaCIsIHJvb3RfaGFzaGVzW2ldXSkKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMzogaGFzaF9vcHRpb24gPSIsIGhhc2hfb3B0aW9uKQoKICAgIGNvdW50KGlfc3RvcmFnZS5vcHRpb25zKSA9PSA0CiAgICBpX3N0b3JhZ2Uub3B0aW9uc1swXSA9PSAicm8iCiAgICBpX3N0b3JhZ2Uub3B0aW9uc1sxXSA9PSAiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmJsb2NrX2RldmljZT1maWxlIgogICAgaV9zdG9yYWdlLm9wdGlvbnNbMl0gPT0gImlvLmthdGFjb250YWluZXJzLmZzLW9wdC5pcy1sYXllciIKICAgIGlfc3RvcmFnZS5vcHRpb25zWzNdID09IGhhc2hfb3B0aW9uCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAzOiB0cnVlIikKfQphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgNDogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gInNtYiIKICAgIHBfb3B0c19jb3VudCA6PSBjb3VudChwX3N0b3JhZ2Uub3B0aW9ucykKICAgIGlfb3B0c19jb3VudCA6PSBjb3VudChpX3N0b3JhZ2Uub3B0aW9ucykKICAgIGlfb3B0c19jb3VudCA9PSBwX29wdHNfY291bnQgKyAyCgogICAgaV9vcHRfbWF0Y2hlcyA6PSBbaSB8IGkgOj0gaWR4OyBpZHggPCBwX29wdHNfY291bnQ7IHBfc3RvcmFnZS5vcHRpb25zW2lkeF0gPT0gaV9zdG9yYWdlLm9wdGlvbnNbaWR4XV0KICAgIGNvdW50KGlfb3B0X21hdGNoZXMpID09IHBfb3B0c19jb3VudAoKICAgIHN0YXJ0c3dpdGgoaV9zdG9yYWdlLm9wdGlvbnNbaV9vcHRzX2NvdW50LTJdLCAiYWRkcj0iKQogICAgY3JlZHMgPSBzcGxpdChpX3N0b3JhZ2Uub3B0aW9uc1tpX29wdHNfY291bnQtMV0sICIsIikKICAgIGNvdW50KGNyZWRzKSA9PSAyCiAgICBzdGFydHN3aXRoKGNyZWRzWzBdLCAidXNlcm5hbWU9IikKICAgIHN0YXJ0c3dpdGgoY3JlZHNbMV0sICJwYXNzd29yZD0iKQogICAgCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDQ6IHRydWUiKQp9CgphbGxvd19vdmVybGF5X2xheWVyKHBvbGljeV9pZCwgcG9saWN5X2hhc2gsIGlfb3B0aW9uKSB7CiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogcG9saWN5X2lkID0iLCBwb2xpY3lfaWQsICJwb2xpY3lfaGFzaCA9IiwgcG9saWN5X2hhc2gpCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogaV9vcHRpb24gPSIsIGlfb3B0aW9uKQoKICAgIHN0YXJ0c3dpdGgoaV9vcHRpb24sICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQubGF5ZXI9IikKICAgIGlfdmFsdWUgOj0gcmVwbGFjZShpX29wdGlvbiwgImlvLmthdGFjb250YWluZXJzLmZzLW9wdC5sYXllcj0iLCAiIikKICAgIGlfdmFsdWVfZGVjb2RlZCA6PSBiYXNlNjQuZGVjb2RlKGlfdmFsdWUpCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogaV92YWx1ZV9kZWNvZGVkID0iLCBpX3ZhbHVlX2RlY29kZWQpCgogICAgcG9saWN5X3N1ZmZpeCA6PSBjb25jYXQoIj0iLCBbInRhcixybyxpby5rYXRhY29udGFpbmVycy5mcy1vcHQuYmxvY2tfZGV2aWNlPWZpbGUsaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmlzLWxheWVyLGlvLmthdGFjb250YWluZXJzLmZzLW9wdC5yb290LWhhc2giLCBwb2xpY3lfaGFzaF0pCiAgICBwX3ZhbHVlIDo9IGNvbmNhdCgiLCIsIFtwb2xpY3lfaWQsIHBvbGljeV9zdWZmaXhdKQogICAgcHJpbnQoImFsbG93X292ZXJsYXlfbGF5ZXI6IHBfdmFsdWUgPSIsIHBfdmFsdWUpCgogICAgcF92YWx1ZSA9PSBpX3ZhbHVlX2RlY29kZWQKCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogdHJ1ZSIpCn0KCmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAidGFyIgoKICAgIHN0YXJ0c3dpdGgocF9zdG9yYWdlLm1vdW50X3BvaW50LCAiJChsYXllciIpCiAgICBtb3VudF9zdWZmaXggOj0gdHJpbV9sZWZ0KHBfc3RvcmFnZS5tb3VudF9wb2ludCwgIiQobGF5ZXIiKQoKICAgIGVuZHN3aXRoKG1vdW50X3N1ZmZpeCwgIikiKQogICAgbGF5ZXJfaW5kZXggOj0gdHJpbV9yaWdodChtb3VudF9zdWZmaXgsICIpIikKICAgIGkgOj0gdG9fbnVtYmVyKGxheWVyX2luZGV4KQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDE6IGkgPSIsIGkpCgogICAgbGF5ZXJfaWQgOj0gbGF5ZXJfaWRzW2ldCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMTogbGF5ZXJfaWQgPSIsIGxheWVyX2lkKQoKICAgIHBfbW91bnQgOj0gY29uY2F0KCIvIiwgWyIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L2xheWVycyIsIGxheWVyX2lkXSkKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCAxOiBwX21vdW50ID0iLCBwX21vdW50KQoKICAgIHBfbW91bnQgPT0gaV9zdG9yYWdlLm1vdW50X3BvaW50CgogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDE6IHRydWUiKQp9CmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAiZnVzZTMua2F0YS1vdmVybGF5IgoKICAgIG1vdW50MSA6PSByZXBsYWNlKHBfc3RvcmFnZS5tb3VudF9wb2ludCwgIiQoY3BhdGgpIiwgcG9saWN5X2RhdGEuY29tbW9uLmNwYXRoKQogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDI6IG1vdW50MiA9IiwgbW91bnQyKQoKICAgIG1vdW50MiA9PSBpX3N0b3JhZ2UubW91bnRfcG9pbnQKCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMjogdHJ1ZSIpCn0KYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKSB7CiAgICBwX3N0b3JhZ2UuZnN0eXBlID09ICJsb2NhbCIKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQyID0iLCBtb3VudDIpCgogICAgbW91bnQzIDo9IHJlcGxhY2UobW91bnQyLCAiJChzYW5kYm94LWlkKSIsIHNhbmRib3hfaWQpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQzID0iLCBtb3VudDMpCgogICAgcmVnZXgubWF0Y2gobW91bnQzLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCgogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDM6IHRydWUiKQp9CmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAiYmluZCIKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNDogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNDogbW91bnQyID0iLCBtb3VudDIpCgogICAgbW91bnQzIDo9IHJlcGxhY2UobW91bnQyLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDQ6IG1vdW50MyA9IiwgbW91bnQzKQoKICAgIHJlZ2V4Lm1hdGNoKG1vdW50MywgaV9zdG9yYWdlLm1vdW50X3BvaW50KQoKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA0OiB0cnVlIikKfQphbGxvd19tb3VudF9wb2ludChwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgYnVuZGxlX2lkLCBzYW5kYm94X2lkLCBsYXllcl9pZHMpIHsKICAgIHBfc3RvcmFnZS5mc3R5cGUgPT0gInRtcGZzIgoKICAgIG1vdW50MSA6PSBwX3N0b3JhZ2UubW91bnRfcG9pbnQKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA1OiBtb3VudDEgPSIsIG1vdW50MSkKCiAgICByZWdleC5tYXRjaChtb3VudDEsIGlfc3RvcmFnZS5tb3VudF9wb2ludCkKCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNTogdHJ1ZSIpCn0KYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKSB7CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogaV9zdG9yYWdlLm1vdW50X3BvaW50ID0iLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCiAgICBhbGxvd19kaXJlY3Rfdm9sX2RyaXZlcihwX3N0b3JhZ2UsIGlfc3RvcmFnZSkKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChzcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQyID0iLCBtb3VudDIpCgogICAgZGlyZWN0X3ZvbF9wYXRoIDo9IGlfc3RvcmFnZS5zb3VyY2UKICAgIG1vdW50MyA6PSByZXBsYWNlKG1vdW50MiwgIiQoYjY0LWRpcmVjdC12b2wtcGF0aCkiLCBiYXNlNjR1cmwuZW5jb2RlKGRpcmVjdF92b2xfcGF0aCkpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQzID0iLCBtb3VudDMpCgogICAgbW91bnQzID09IGlfc3RvcmFnZS5tb3VudF9wb2ludAoKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA2OiB0cnVlIikKfQoKYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIocF9zdG9yYWdlLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19kaXJlY3Rfdm9sX2RyaXZlciAxOiBzdGFydCIpCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCiAgICBwcmludCgiYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIgMTogdHJ1ZSIpCn0KYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIocF9zdG9yYWdlLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19kaXJlY3Rfdm9sX2RyaXZlciAyOiBzdGFydCIpCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJzbWIiCiAgICBwcmludCgiYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIgMjogdHJ1ZSIpCn0KCiMgRXhlY1Byb2Nlc3NSZXF1ZXN0LnByb2Nlc3MuQ2FwYWJpbGl0aWVzCmFsbG93X2V4ZWNfY2FwcyhpX2NhcHMpIHsKICAgIG5vdCBpX2NhcHMuQW1iaWVudAogICAgbm90IGlfY2Fwcy5Cb3VuZGluZwogICAgbm90IGlfY2Fwcy5FZmZlY3RpdmUKICAgIG5vdCBpX2NhcHMuSW5oZXJpdGFibGUKICAgIG5vdCBpX2NhcHMuUGVybWl0dGVkCn0KCiMgT0NJLlByb2Nlc3MuQ2FwYWJpbGl0aWVzCmFsbG93X2NhcHMocF9jYXBzLCBpX2NhcHMpIHsKICAgIHByaW50KCJhbGxvd19jYXBzOiBwb2xpY3kgQW1iaWVudCA9IiwgcF9jYXBzLkFtYmllbnQpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgQW1iaWVudCA9IiwgaV9jYXBzLkFtYmllbnQpCiAgICBtYXRjaF9jYXBzKHBfY2Fwcy5BbWJpZW50LCBpX2NhcHMuQW1iaWVudCkKCiAgICBwcmludCgiYWxsb3dfY2FwczogcG9saWN5IEJvdW5kaW5nID0iLCBwX2NhcHMuQm91bmRpbmcpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgQm91bmRpbmcgPSIsIGlfY2Fwcy5Cb3VuZGluZykKICAgIG1hdGNoX2NhcHMocF9jYXBzLkJvdW5kaW5nLCBpX2NhcHMuQm91bmRpbmcpCgogICAgcHJpbnQoImFsbG93X2NhcHM6IHBvbGljeSBFZmZlY3RpdmUgPSIsIHBfY2Fwcy5FZmZlY3RpdmUpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgRWZmZWN0aXZlID0iLCBpX2NhcHMuRWZmZWN0aXZlKQogICAgbWF0Y2hfY2FwcyhwX2NhcHMuRWZmZWN0aXZlLCBpX2NhcHMuRWZmZWN0aXZlKQoKICAgIHByaW50KCJhbGxvd19jYXBzOiBwb2xpY3kgSW5oZXJpdGFibGUgPSIsIHBfY2Fwcy5Jbmhlcml0YWJsZSkKICAgIHByaW50KCJhbGxvd19jYXBzOiBpbnB1dCBJbmhlcml0YWJsZSA9IiwgaV9jYXBzLkluaGVyaXRhYmxlKQogICAgbWF0Y2hfY2FwcyhwX2NhcHMuSW5oZXJpdGFibGUsIGlfY2Fwcy5Jbmhlcml0YWJsZSkKCiAgICBwcmludCgiYWxsb3dfY2FwczogcG9saWN5IFBlcm1pdHRlZCA9IiwgcF9jYXBzLlBlcm1pdHRlZCkKICAgIHByaW50KCJhbGxvd19jYXBzOiBpbnB1dCBQZXJtaXR0ZWQgPSIsIGlfY2Fwcy5QZXJtaXR0ZWQpCiAgICBtYXRjaF9jYXBzKHBfY2Fwcy5QZXJtaXR0ZWQsIGlfY2Fwcy5QZXJtaXR0ZWQpCn0KCm1hdGNoX2NhcHMocF9jYXBzLCBpX2NhcHMpIHsKICAgIHByaW50KCJtYXRjaF9jYXBzIDE6IHN0YXJ0IikKCiAgICBwX2NhcHMgPT0gaV9jYXBzCgogICAgcHJpbnQoIm1hdGNoX2NhcHMgMTogdHJ1ZSIpCn0KbWF0Y2hfY2FwcyhwX2NhcHMsIGlfY2FwcykgewogICAgcHJpbnQoIm1hdGNoX2NhcHMgMjogc3RhcnQiKQoKICAgIGNvdW50KHBfY2FwcykgPT0gMQogICAgcF9jYXBzWzBdID09ICIkKGRlZmF1bHRfY2FwcykiCgogICAgcHJpbnQoIm1hdGNoX2NhcHMgMjogZGVmYXVsdF9jYXBzID0iLCBwb2xpY3lfZGF0YS5jb21tb24uZGVmYXVsdF9jYXBzKQogICAgcG9saWN5X2RhdGEuY29tbW9uLmRlZmF1bHRfY2FwcyA9PSBpX2NhcHMKCiAgICBwcmludCgibWF0Y2hfY2FwcyAyOiB0cnVlIikKfQptYXRjaF9jYXBzKHBfY2FwcywgaV9jYXBzKSB7CiAgICBwcmludCgibWF0Y2hfY2FwcyAzOiBzdGFydCIpCgogICAgY291bnQocF9jYXBzKSA9PSAxCiAgICBwX2NhcHNbMF0gPT0gIiQocHJpdmlsZWdlZF9jYXBzKSIKCiAgICBwcmludCgibWF0Y2hfY2FwcyAzOiBwcml2aWxlZ2VkX2NhcHMgPSIsIHBvbGljeV9kYXRhLmNvbW1vbi5wcml2aWxlZ2VkX2NhcHMpCiAgICBwb2xpY3lfZGF0YS5jb21tb24ucHJpdmlsZWdlZF9jYXBzID09IGlfY2FwcwoKICAgIHByaW50KCJtYXRjaF9jYXBzIDM6IHRydWUiKQp9CgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgpjaGVja19kaXJlY3RvcnlfdHJhdmVyc2FsKGlfcGF0aCkgewogICAgbm90IHJlZ2V4Lm1hdGNoKCIoXnwvKS4uKCR8LykiLCBpX3BhdGgpCn0KCmNoZWNrX3N5bWxpbmtfc291cmNlKGlfc3JjKSB7CiAgICBpX3NyYyA9PSAiIgogICAgcHJpbnQoImNoZWNrX3N5bWxpbmtfc291cmNlIDE6IHRydWUiKQp9CmNoZWNrX3N5bWxpbmtfc291cmNlKGlfc3JjKSB7CiAgICBpX3NyYyAhPSAiIgogICAgcHJpbnQoImNoZWNrX3N5bWxpbmtfc291cmNlIDI6IGlfc3JjID0iLCBpX3NyYykKCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24uc19zb3VyY2UxLCBpX3NyYykKCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMjogdHJ1ZSIpCn0KY2hlY2tfc3ltbGlua19zb3VyY2UoaV9zcmMpIHsKICAgIGlfc3JjICE9ICIiCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMzogaV9zcmMgPSIsIGlfc3JjKQoKICAgIHJlZ2V4Lm1hdGNoKHBvbGljeV9kYXRhLmNvbW1vbi5zX3NvdXJjZTIsIGlfc3JjKQogICAgY2hlY2tfZGlyZWN0b3J5X3RyYXZlcnNhbChpX3NyYykKCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMzogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfc3RvcmFnZXMoaV9zdG9yYWdlcykgewogICAgcHJpbnQoImFsbG93X3NhbmRib3hfc3RvcmFnZXM6IGlfc3RvcmFnZXMgPSIsIGlfc3RvcmFnZXMpCgogICAgcF9zdG9yYWdlcyA6PSBwb2xpY3lfZGF0YS5zYW5kYm94LnN0b3JhZ2VzCiAgICBldmVyeSBpX3N0b3JhZ2UgaW4gaV9zdG9yYWdlcyB7CiAgICAgICAgYWxsb3dfc2FuZGJveF9zdG9yYWdlKHBfc3RvcmFnZXMsIGlfc3RvcmFnZSkKICAgIH0KCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9zdG9yYWdlczogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfc3RvcmFnZShwX3N0b3JhZ2VzLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IGlfc3RvcmFnZSA9IiwgaV9zdG9yYWdlKQoKICAgIHNvbWUgcF9zdG9yYWdlIGluIHBfc3RvcmFnZXMKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IHBfc3RvcmFnZSA9IiwgcF9zdG9yYWdlKQogICAgaV9zdG9yYWdlID09IHBfc3RvcmFnZQoKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IHRydWUiKQp9CgpDb3B5RmlsZVJlcXVlc3QgewogICAgcHJpbnQoIkNvcHlGaWxlUmVxdWVzdDogaW5wdXQucGF0aCA9IiwgaW5wdXQucGF0aCkKCiAgICBjaGVja19zeW1saW5rX3NvdXJjZShpbnB1dC5zeW1saW5rX3NyYykKICAgIGNoZWNrX2RpcmVjdG9yeV90cmF2ZXJzYWwoaW5wdXQucGF0aCkKCiAgICBzb21lIHJlZ2V4MSBpbiBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLkNvcHlGaWxlUmVxdWVzdAogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5jcGF0aCkKICAgIHJlZ2V4NCA6PSByZXBsYWNlKHJlZ2V4MywgIiQoYnVuZGxlLWlkKSIsIEJVTkRMRV9JRCkKICAgIHByaW50KCJDb3B5RmlsZVJlcXVlc3Q6IHJlZ2V4NCA9IiwgcmVnZXg0KQoKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4NCwgaW5wdXQucGF0aCkKCiAgICBwcmludCgiQ29weUZpbGVSZXF1ZXN0OiB0cnVlIikKfQoKQ3JlYXRlU2FuZGJveFJlcXVlc3QgewogICAgcHJpbnQoIkNyZWF0ZVNhbmRib3hSZXF1ZXN0OiBpbnB1dC5ndWVzdF9ob29rX3BhdGggPSIsIGlucHV0Lmd1ZXN0X2hvb2tfcGF0aCkKICAgIGNvdW50KGlucHV0Lmd1ZXN0X2hvb2tfcGF0aCkgPT0gMAoKICAgIHByaW50KCJDcmVhdGVTYW5kYm94UmVxdWVzdDogaW5wdXQua2VybmVsX21vZHVsZXMgPSIsIGlucHV0Lmtlcm5lbF9tb2R1bGVzKQogICAgY291bnQoaW5wdXQua2VybmVsX21vZHVsZXMpID09IDAKCiAgICBpX3BpZG5zIDo9IGlucHV0LnNhbmRib3hfcGlkbnMKICAgIHByaW50KCJDcmVhdGVTYW5kYm94UmVxdWVzdDogaV9waWRucyA9IiwgaV9waWRucykKICAgIGlfcGlkbnMgPT0gZmFsc2UKICAgIGFsbG93X3NhbmRib3hfc3RvcmFnZXMoaW5wdXQuc3RvcmFnZXMpCn0KCmFsbG93X2V4ZWMocF9jb250YWluZXIsIGlfcHJvY2VzcykgewogICAgcHJpbnQoImFsbG93X2V4ZWM6IHN0YXJ0IikKCiAgICBwX29jaSA9IHBfY29udGFpbmVyLk9DSQogICAgcF9zX25hbWUgPSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc19uYW1lc3BhY2UgPSBnZXRfc3RhdGVfdmFsKCJuYW1lc3BhY2UiKQogICAgYWxsb3dfcHJvYmVfcHJvY2VzcyhwX29jaS5Qcm9jZXNzLCBpX3Byb2Nlc3MsIHBfc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfZXhlYzogdHJ1ZSIpCn0KCmFsbG93X2ludGVyYWN0aXZlX2V4ZWMocF9jb250YWluZXIsIGlfcHJvY2VzcykgewogICAgcHJpbnQoImFsbG93X2ludGVyYWN0aXZlX2V4ZWM6IHN0YXJ0IikKCiAgICBwX29jaSA9IHBfY29udGFpbmVyLk9DSQogICAgcF9zX25hbWUgPSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc19uYW1lc3BhY2UgPSBnZXRfc3RhdGVfdmFsKCJuYW1lc3BhY2UiKQogICAgYWxsb3dfaW50ZXJhY3RpdmVfcHJvY2VzcyhwX29jaS5Qcm9jZXNzLCBpX3Byb2Nlc3MsIHBfc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfaW50ZXJhY3RpdmVfZXhlYzogdHJ1ZSIpCn0KCiMgVE9ETzogc2hvdWxkIG90aGVyIEV4ZWNQcm9jZXNzUmVxdWVzdCBpbnB1dCBkYXRhIGZpZWxkcyBiZSB2YWxpZGF0ZWQgYXMgd2VsbD8KRXhlY1Byb2Nlc3NSZXF1ZXN0IHsKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMTogaW5wdXQgPSIsIGlucHV0KQoKICAgIHNvbWUgcF9jb21tYW5kIGluIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuRXhlY1Byb2Nlc3NSZXF1ZXN0LmFsbG93ZWRfY29tbWFuZHMKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMTogcF9jb21tYW5kID0iLCBwX2NvbW1hbmQpCiAgICBwX2NvbW1hbmQgPT0gaW5wdXQucHJvY2Vzcy5BcmdzCgogICAgIyBUT0RPOiBtYXRjaCBwX2NvbnRhaW5lcidzIElEIHdpdGggdGhlIGlucHV0IGNvbnRhaW5lcl9pZC4KICAgIHNvbWUgcF9jb250YWluZXIgaW4gcG9saWN5X2RhdGEuY29udGFpbmVycwogICAgYWxsb3dfaW50ZXJhY3RpdmVfZXhlYyhwX2NvbnRhaW5lciwgaW5wdXQucHJvY2VzcykKCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDE6IHRydWUiKQp9CkV4ZWNQcm9jZXNzUmVxdWVzdCB7CiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDI6IGlucHV0ID0iLCBpbnB1dCkKCiAgICAjIFRPRE86IG1hdGNoIGlucHV0IGNvbnRhaW5lciBJRCB3aXRoIGl0cyBjb3JyZXNwb25kaW5nIGNvbnRhaW5lci5leGVjX2NvbW1hbmRzLgogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBzb21lIHBfY29tbWFuZCBpbiBwX2NvbnRhaW5lci5leGVjX2NvbW1hbmRzCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDI6IHBfY29tbWFuZCA9IiwgcF9jb21tYW5kKQoKICAgICMgVE9ETzogc2hvdWxkIG90aGVyIGlucHV0IGRhdGEgZmllbGRzIGJlIHZhbGlkYXRlZCBhcyB3ZWxsPwogICAgcF9jb21tYW5kID09IGlucHV0LnByb2Nlc3MuQXJncwoKICAgIGFsbG93X2V4ZWMocF9jb250YWluZXIsIGlucHV0LnByb2Nlc3MpCgogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAyOiB0cnVlIikKfQpFeGVjUHJvY2Vzc1JlcXVlc3QgewogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAzOiBpbnB1dCA9IiwgaW5wdXQpCgogICAgaV9jb21tYW5kID0gY29uY2F0KCIgIiwgaW5wdXQucHJvY2Vzcy5BcmdzKQogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAzOiBpX2NvbW1hbmQgPSIsIGlfY29tbWFuZCkKCiAgICBzb21lIHBfcmVnZXggaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5FeGVjUHJvY2Vzc1JlcXVlc3QucmVnZXgKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMzogcF9yZWdleCA9IiwgcF9yZWdleCkKCiAgICByZWdleC5tYXRjaChwX3JlZ2V4LCBpX2NvbW1hbmQpCgogICAgIyBUT0RPOiBtYXRjaCBwX2NvbnRhaW5lcidzIElEIHdpdGggdGhlIGlucHV0IGNvbnRhaW5lcl9pZC4KICAgIHNvbWUgcF9jb250YWluZXIgaW4gcG9saWN5X2RhdGEuY29udGFpbmVycwogICAgYWxsb3dfaW50ZXJhY3RpdmVfZXhlYyhwX2NvbnRhaW5lciwgaW5wdXQucHJvY2VzcykKCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDM6IHRydWUiKQp9CgpVcGRhdGVSb3V0ZXNSZXF1ZXN0IHsKICAgIHByaW50KCJVcGRhdGVSb3V0ZXNSZXF1ZXN0OiBpbnB1dCA9IiwgaW5wdXQpCiAgICBwcmludCgiVXBkYXRlUm91dGVzUmVxdWVzdDogcG9saWN5ID0iLCBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLlVwZGF0ZVJvdXRlc1JlcXVlc3QpCgogICAgaV9yb3V0ZXMgOj0gaW5wdXQucm91dGVzLlJvdXRlcwogICAgcF9zb3VyY2VfcmVnZXggPSBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLlVwZGF0ZVJvdXRlc1JlcXVlc3QuZm9yYmlkZGVuX3NvdXJjZV9yZWdleAogICAgcF9uYW1lcyA9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuVXBkYXRlUm91dGVzUmVxdWVzdC5mb3JiaWRkZW5fZGV2aWNlX25hbWVzCgogICAgZXZlcnkgaV9yb3V0ZSBpbiBpX3JvdXRlcyB7CiAgICAgICAgcHJpbnQoImlfcm91dGUuc291cmNlID0iLCBpX3JvdXRlLnNvdXJjZSkKICAgICAgICBldmVyeSBwX3JlZ2V4IGluIHBfc291cmNlX3JlZ2V4IHsKICAgICAgICAgICAgcHJpbnQoInBfcmVnZXggPSIsIHBfcmVnZXgpCiAgICAgICAgICAgIG5vdCByZWdleC5tYXRjaChwX3JlZ2V4LCBpX3JvdXRlLnNvdXJjZSkKICAgICAgICB9CgogICAgICAgIHByaW50KCJpX3JvdXRlLmRldmljZSA9IiwgaV9yb3V0ZS5kZXZpY2UpCiAgICAgICAgbm90IGlfcm91dGUuZGV2aWNlIGluIHBfbmFtZXMKICAgIH0KCiAgICBwcmludCgiVXBkYXRlUm91dGVzUmVxdWVzdDogdHJ1ZSIpCn0KClVwZGF0ZUludGVyZmFjZVJlcXVlc3QgewogICAgcHJpbnQoIlVwZGF0ZUludGVyZmFjZVJlcXVlc3Q6IGlucHV0ID0iLCBpbnB1dCkKICAgIHByaW50KCJVcGRhdGVJbnRlcmZhY2VSZXF1ZXN0OiBwb2xpY3kgPSIsIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuVXBkYXRlSW50ZXJmYWNlUmVxdWVzdCkKCiAgICBpX2ludGVyZmFjZSA6PSBpbnB1dC5pbnRlcmZhY2UKICAgIHBfZmxhZ3MgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmFsbG93X3Jhd19mbGFncwoKICAgICMgVHlwaWNhbGx5LCBqdXN0IElGRl9OT0FSUCBpcyB1c2VkLgogICAgYml0cy5hbmQoaV9pbnRlcmZhY2UucmF3X2ZsYWdzLCBiaXRzLm5lZ2F0ZShwX2ZsYWdzKSkgPT0gMAoKICAgIHBfbmFtZXMgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmZvcmJpZGRlbl9uYW1lcwoKICAgIG5vdCBpX2ludGVyZmFjZS5uYW1lIGluIHBfbmFtZXMKCiAgICBwX2h3YWRkcnMgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmZvcmJpZGRlbl9od19hZGRycwoKICAgIG5vdCBpX2ludGVyZmFjZS5od0FkZHIgaW4gcF9od2FkZHJzCgogICAgcHJpbnQoIlVwZGF0ZUludGVyZmFjZVJlcXVlc3Q6IHRydWUiKQp9CgpDbG9zZVN0ZGluUmVxdWVzdCB7CiAgICBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLkNsb3NlU3RkaW5SZXF1ZXN0ID09IHRydWUKfQoKUmVhZFN0cmVhbVJlcXVlc3QgewogICAgcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5SZWFkU3RyZWFtUmVxdWVzdCA9PSB0cnVlCn0KClVwZGF0ZUVwaGVtZXJhbE1vdW50c1JlcXVlc3QgewogICAgcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVFcGhlbWVyYWxNb3VudHNSZXF1ZXN0ID09IHRydWUKfQoKV3JpdGVTdHJlYW1SZXF1ZXN0IHsKICAgIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuV3JpdGVTdHJlYW1SZXF1ZXN0ID09IHRydWUKfQoKcG9saWN5X2RhdGEgOj0gewogICJjb250YWluZXJzIjogWwogICAgewogICAgICAiT0NJIjogewogICAgICAgICJWZXJzaW9uIjogIjEuMS4wLXJjLjEiLAogICAgICAgICJQcm9jZXNzIjogewogICAgICAgICAgIlRlcm1pbmFsIjogZmFsc2UsCiAgICAgICAgICAiVXNlciI6IHsKICAgICAgICAgICAgIlVJRCI6IDY1NTM1LAogICAgICAgICAgICAiR0lEIjogNjU1MzUsCiAgICAgICAgICAgICJBZGRpdGlvbmFsR2lkcyI6IFtdLAogICAgICAgICAgICAiVXNlcm5hbWUiOiAiIgogICAgICAgICAgfSwKICAgICAgICAgICJEZXByZWNhdGVkQXJncyI6IFsKICAgICAgICAgICAgIi9wYXVzZSIKICAgICAgICAgIF0sCiAgICAgICAgICAiQXJncyI6IFsKICAgICAgICAgICAgIi9wYXVzZSIKICAgICAgICAgIF0sCiAgICAgICAgICAiRW52IjogWwogICAgICAgICAgICAiUEFUSD0vdXNyL2xvY2FsL3NiaW46L3Vzci9sb2NhbC9iaW46L3Vzci9zYmluOi91c3IvYmluOi9zYmluOi9iaW4iCiAgICAgICAgICBdLAogICAgICAgICAgIkN3ZCI6ICIvIiwKICAgICAgICAgICJDYXBhYmlsaXRpZXMiOiB7CiAgICAgICAgICAgICJBbWJpZW50IjogW10sCiAgICAgICAgICAgICJCb3VuZGluZyI6IFsKICAgICAgICAgICAgICAiJChkZWZhdWx0X2NhcHMpIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiRWZmZWN0aXZlIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJJbmhlcml0YWJsZSI6IFtdLAogICAgICAgICAgICAiUGVybWl0dGVkIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICAiTm9OZXdQcml2aWxlZ2VzIjogdHJ1ZQogICAgICAgIH0sCiAgICAgICAgIlJvb3QiOiB7CiAgICAgICAgICAiUGF0aCI6ICIkKGNwYXRoKS8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgIlJlYWRvbmx5IjogdHJ1ZQogICAgICAgIH0sCiAgICAgICAgIk1vdW50cyI6IFsKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9wcm9jIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJwcm9jIiwKICAgICAgICAgICAgInR5cGVfIjogInByb2MiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2IiwKICAgICAgICAgICAgInNvdXJjZSI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJzdHJpY3RhdGltZSIsCiAgICAgICAgICAgICAgIm1vZGU9NzU1IiwKICAgICAgICAgICAgICAic2l6ZT02NTUzNmsiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L3B0cyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiZGV2cHRzIiwKICAgICAgICAgICAgInR5cGVfIjogImRldnB0cyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJuZXdpbnN0YW5jZSIsCiAgICAgICAgICAgICAgInB0bXhtb2RlPTA2NjYiLAogICAgICAgICAgICAgICJtb2RlPTA2MjAiLAogICAgICAgICAgICAgICJnaWQ9NSIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvc2htIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L3NobSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi9tcXVldWUiLAogICAgICAgICAgICAic291cmNlIjogIm1xdWV1ZSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJtcXVldWUiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvc3lzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJzeXNmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJzeXNmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2V0Yy9yZXNvbHYuY29uZiIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClyZXNvbHYuY29uZiQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJvIiwKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9kZXYiLAogICAgICAgICAgICAgICJub2V4ZWMiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0KICAgICAgICBdLAogICAgICAgICJBbm5vdGF0aW9ucyI6IHsKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmJ1bmRsZV9wYXRoIjogIi9ydW4vY29udGFpbmVyZC9pby5jb250YWluZXJkLnJ1bnRpbWUudjIudGFzay9rOHMuaW8vJChidW5kbGUtaWQpIiwKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIjogInBvZF9zYW5kYm94IiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSI6ICJzYW5kYm94IiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWlkIjogIl5bYS16MC05XXs2NH0kIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWxvZy1kaXJlY3RvcnkiOiAiXi92YXIvbG9nL3BvZHMvJChzYW5kYm94LW5hbWVzcGFjZSlfJChzYW5kYm94LW5hbWUpX1swLTlhLWZdezh9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezEyfSQiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZSI6ICJedmFyXFwtZXhwYW5zaW9uXFwtMTU0N2U2YTZcXC0wMTI0XFwtNDA1MVxcLWI2NDBcXC1iYzI2M2I1NjEwMTckIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LW5hbWVzcGFjZSI6ICJ2YXItZXhwYW5zaW9uLTY2NTMiLAogICAgICAgICAgIm15c3VicGF0aCI6ICJmb28iLAogICAgICAgICAgIm5lcmRjdGwvbmV0d29yay1uYW1lc3BhY2UiOiAiXi92YXIvcnVuL25ldG5zL2NuaS1bMC05YS1mXXs4fS1bMC05YS1mXXs0fS1bMC05YS1mXXs0fS1bMC05YS1mXXs0fS1bMC05YS1mXXsxMn0kIiwKICAgICAgICAgICJub3RteXN1YnBhdGgiOiAibXlwYXRoIgogICAgICAgIH0sCiAgICAgICAgIkxpbnV4IjogewogICAgICAgICAgIk5hbWVzcGFjZXMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiVHlwZSI6ICJpcGMiLAogICAgICAgICAgICAgICJQYXRoIjogIiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJUeXBlIjogInV0cyIsCiAgICAgICAgICAgICAgIlBhdGgiOiAiIgogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgIlR5cGUiOiAibW91bnQiLAogICAgICAgICAgICAgICJQYXRoIjogIiIKICAgICAgICAgICAgfQogICAgICAgICAgXSwKICAgICAgICAgICJNYXNrZWRQYXRocyI6IFsKICAgICAgICAgICAgIi9wcm9jL2FjcGkiLAogICAgICAgICAgICAiL3Byb2MvYXNvdW5kIiwKICAgICAgICAgICAgIi9wcm9jL2tjb3JlIiwKICAgICAgICAgICAgIi9wcm9jL2tleXMiLAogICAgICAgICAgICAiL3Byb2MvbGF0ZW5jeV9zdGF0cyIsCiAgICAgICAgICAgICIvcHJvYy90aW1lcl9saXN0IiwKICAgICAgICAgICAgIi9wcm9jL3RpbWVyX3N0YXRzIiwKICAgICAgICAgICAgIi9wcm9jL3NjaGVkX2RlYnVnIiwKICAgICAgICAgICAgIi9zeXMvZmlybXdhcmUiLAogICAgICAgICAgICAiL3Byb2Mvc2NzaSIKICAgICAgICAgIF0sCiAgICAgICAgICAiUmVhZG9ubHlQYXRocyI6IFsKICAgICAgICAgICAgIi9wcm9jL2J1cyIsCiAgICAgICAgICAgICIvcHJvYy9mcyIsCiAgICAgICAgICAgICIvcHJvYy9pcnEiLAogICAgICAgICAgICAiL3Byb2Mvc3lzIiwKICAgICAgICAgICAgIi9wcm9jL3N5c3JxLXRyaWdnZXIiCiAgICAgICAgICBdLAogICAgICAgICAgIkRldmljZXMiOiBbXSwKICAgICAgICAgICJTeXNjdGwiOiB7CiAgICAgICAgICAgICJuZXQuaXB2NC5pcF91bnByaXZpbGVnZWRfcG9ydF9zdGFydCI6ICIwIiwKICAgICAgICAgICAgIm5ldC5pcHY0LnBpbmdfZ3JvdXBfcmFuZ2UiOiAiMCAyMTQ3NDgzNjQ3IgogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSwKICAgICAgInN0b3JhZ2VzIjogWwogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2gwKSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjApIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAib3ZlcmxheWZzIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJmdXNlMy5rYXRhLW92ZXJsYXkiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICI1YTVhYWQ4MDA1NWZmMjAwMTJhNTBkYzI1ZjhkZjdhMjk5MjQ0NzQzMjRkNjVmN2Q1MzA2ZWU4ZWUyN2ZmNzFkIiwKICAgICAgICAgICAgIjgxNzI1MGYxYTNlMzM2ZGE3NmY1YmQzZmE3ODRlMWIyNmQ5NTliOWMxMzE4NzY4MTViYTI2MDQwNDhiNzBjMTgiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQoY3BhdGgpLyQoYnVuZGxlLWlkKSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfQogICAgICBdLAogICAgICAiZGV2aWNlcyI6IFtdLAogICAgICAic2FuZGJveF9waWRucyI6IGZhbHNlLAogICAgICAiZXhlY19jb21tYW5kcyI6IFtdLAogICAgICAiZW52X21hcCI6IHsKICAgICAgICAiUEFUSCI6ICIvdXNyL2xvY2FsL3NiaW46L3Vzci9sb2NhbC9iaW46L3Vzci9zYmluOi91c3IvYmluOi9zYmluOi9iaW4iCiAgICAgIH0KICAgIH0sCiAgICB7CiAgICAgICJPQ0kiOiB7CiAgICAgICAgIlZlcnNpb24iOiAiMS4xLjAtcmMuMSIsCiAgICAgICAgIlByb2Nlc3MiOiB7CiAgICAgICAgICAiVGVybWluYWwiOiBmYWxzZSwKICAgICAgICAgICJVc2VyIjogewogICAgICAgICAgICAiVUlEIjogMCwKICAgICAgICAgICAgIkdJRCI6IDAsCiAgICAgICAgICAgICJBZGRpdGlvbmFsR2lkcyI6IFtdLAogICAgICAgICAgICAiVXNlcm5hbWUiOiAiIgogICAgICAgICAgfSwKICAgICAgICAgICJEZXByZWNhdGVkQXJncyI6IFsKICAgICAgICAgICAgInNoIgogICAgICAgICAgXSwKICAgICAgICAgICJBcmdzIjogWwogICAgICAgICAgICAic2giCiAgICAgICAgICBdLAogICAgICAgICAgIkVudiI6IFsKICAgICAgICAgICAgIlBBVEg9L3Vzci9sb2NhbC9zYmluOi91c3IvbG9jYWwvYmluOi91c3Ivc2JpbjovdXNyL2Jpbjovc2JpbjovYmluIiwKICAgICAgICAgICAgIkhPU1ROQU1FPSQoaG9zdC1uYW1lKSIsCiAgICAgICAgICAgICJQT0RfTkFNRT1mb28iLAogICAgICAgICAgICAiQU5OT1RBVElPTj1mb28iCiAgICAgICAgICBdLAogICAgICAgICAgIkN3ZCI6ICIvIiwKICAgICAgICAgICJDYXBhYmlsaXRpZXMiOiB7CiAgICAgICAgICAgICJBbWJpZW50IjogW10sCiAgICAgICAgICAgICJCb3VuZGluZyI6IFsKICAgICAgICAgICAgICAiJChkZWZhdWx0X2NhcHMpIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiRWZmZWN0aXZlIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJJbmhlcml0YWJsZSI6IFtdLAogICAgICAgICAgICAiUGVybWl0dGVkIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICAiTm9OZXdQcml2aWxlZ2VzIjogZmFsc2UKICAgICAgICB9LAogICAgICAgICJSb290IjogewogICAgICAgICAgIlBhdGgiOiAiJChjcGF0aCkvJChidW5kbGUtaWQpIiwKICAgICAgICAgICJSZWFkb25seSI6IGZhbHNlCiAgICAgICAgfSwKICAgICAgICAiTW91bnRzIjogWwogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL3Byb2MiLAogICAgICAgICAgICAic291cmNlIjogInByb2MiLAogICAgICAgICAgICAidHlwZV8iOiAicHJvYyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYiLAogICAgICAgICAgICAic291cmNlIjogInRtcGZzIiwKICAgICAgICAgICAgInR5cGVfIjogInRtcGZzIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgInN0cmljdGF0aW1lIiwKICAgICAgICAgICAgICAibW9kZT03NTUiLAogICAgICAgICAgICAgICJzaXplPTY1NTM2ayIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvcHRzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJkZXZwdHMiLAogICAgICAgICAgICAidHlwZV8iOiAiZGV2cHRzIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAgICAgIm5ld2luc3RhbmNlIiwKICAgICAgICAgICAgICAicHRteG1vZGU9MDY2NiIsCiAgICAgICAgICAgICAgIm1vZGU9MDYyMCIsCiAgICAgICAgICAgICAgImdpZD01IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi9zaG0iLAogICAgICAgICAgICAic291cmNlIjogIi9ydW4va2F0YS1jb250YWluZXJzL3NhbmRib3gvc2htIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L21xdWV1ZSIsCiAgICAgICAgICAgICJzb3VyY2UiOiAibXF1ZXVlIiwKICAgICAgICAgICAgInR5cGVfIjogIm1xdWV1ZSIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9zeXMiLAogICAgICAgICAgICAic291cmNlIjogInN5c2ZzIiwKICAgICAgICAgICAgInR5cGVfIjogInN5c2ZzIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAgICAgIm5vZGV2IiwKICAgICAgICAgICAgICAicm8iCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvc3lzL2ZzL2Nncm91cCIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiY2dyb3VwIiwKICAgICAgICAgICAgInR5cGVfIjogImNncm91cCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIsCiAgICAgICAgICAgICAgInJlbGF0aW1lIiwKICAgICAgICAgICAgICAicm8iCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZXRjL2hvc3RzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KWhvc3RzJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJydyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvdGVybWluYXRpb24tbG9nIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KXRlcm1pbmF0aW9uLWxvZyQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicnciCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZXRjL2hvc3RuYW1lIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KWhvc3RuYW1lJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJydyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9ldGMvcmVzb2x2LmNvbmYiLAogICAgICAgICAgICAic291cmNlIjogIiQoc2ZwcmVmaXgpcmVzb2x2LmNvbmYkIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJ3IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL3Zhci9ydW4vc2VjcmV0cy9rdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50IiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KXNlcnZpY2VhY2NvdW50JCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJybyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi92YXIvcnVuL3NlY3JldHMvYXp1cmUvdG9rZW5zIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KXRva2VucyQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicm8iCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvc3VicGF0aF9tb3VudCIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClzdWJwYXRoX21vdW50JCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJydyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi92b2x1bWVfbW91bnQiLAogICAgICAgICAgICAic291cmNlIjogIl4kKGNwYXRoKS8kKHNhbmRib3gtaWQpL2xvY2FsL3dvcmtkaXIxJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJsb2NhbCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicnciCiAgICAgICAgICAgIF0KICAgICAgICAgIH0KICAgICAgICBdLAogICAgICAgICJBbm5vdGF0aW9ucyI6IHsKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmJ1bmRsZV9wYXRoIjogIi9ydW4vY29udGFpbmVyZC9pby5jb250YWluZXJkLnJ1bnRpbWUudjIudGFzay9rOHMuaW8vJChidW5kbGUtaWQpIiwKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIjogInBvZF9jb250YWluZXIiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLmNvbnRhaW5lci1uYW1lIjogImRhcGktY29udGFpbmVyIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSI6ICJjb250YWluZXIiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLmltYWdlLW5hbWUiOiAicmVnaXN0cnkuazhzLmlvL2UyZS10ZXN0LWltYWdlcy9idXN5Ym94OjEuMjktMiIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCI6ICJeW2EtejAtOV17NjR9JCIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1uYW1lIjogIl52YXJcXC1leHBhbnNpb25cXC0xNTQ3ZTZhNlxcLTAxMjRcXC00MDUxXFwtYjY0MFxcLWJjMjYzYjU2MTAxNyQiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZXNwYWNlIjogInZhci1leHBhbnNpb24tNjY1MyIsCiAgICAgICAgICAibXlzdWJwYXRoIjogImZvbyIsCiAgICAgICAgICAibm90bXlzdWJwYXRoIjogIm15cGF0aCIKICAgICAgICB9LAogICAgICAgICJMaW51eCI6IHsKICAgICAgICAgICJOYW1lc3BhY2VzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgIlR5cGUiOiAiaXBjIiwKICAgICAgICAgICAgICAiUGF0aCI6ICIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiVHlwZSI6ICJ1dHMiLAogICAgICAgICAgICAgICJQYXRoIjogIiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJUeXBlIjogIm1vdW50IiwKICAgICAgICAgICAgICAiUGF0aCI6ICIiCiAgICAgICAgICAgIH0KICAgICAgICAgIF0sCiAgICAgICAgICAiTWFza2VkUGF0aHMiOiBbCiAgICAgICAgICAgICIvcHJvYy9hY3BpIiwKICAgICAgICAgICAgIi9wcm9jL2tjb3JlIiwKICAgICAgICAgICAgIi9wcm9jL2tleXMiLAogICAgICAgICAgICAiL3Byb2MvbGF0ZW5jeV9zdGF0cyIsCiAgICAgICAgICAgICIvcHJvYy90aW1lcl9saXN0IiwKICAgICAgICAgICAgIi9wcm9jL3RpbWVyX3N0YXRzIiwKICAgICAgICAgICAgIi9wcm9jL3NjaGVkX2RlYnVnIiwKICAgICAgICAgICAgIi9wcm9jL3Njc2kiLAogICAgICAgICAgICAiL3N5cy9maXJtd2FyZSIKICAgICAgICAgIF0sCiAgICAgICAgICAiUmVhZG9ubHlQYXRocyI6IFsKICAgICAgICAgICAgIi9wcm9jL2Fzb3VuZCIsCiAgICAgICAgICAgICIvcHJvYy9idXMiLAogICAgICAgICAgICAiL3Byb2MvZnMiLAogICAgICAgICAgICAiL3Byb2MvaXJxIiwKICAgICAgICAgICAgIi9wcm9jL3N5cyIsCiAgICAgICAgICAgICIvcHJvYy9zeXNycS10cmlnZ2VyIgogICAgICAgICAgXSwKICAgICAgICAgICJEZXZpY2VzIjogW10sCiAgICAgICAgICAiU3lzY3RsIjogewogICAgICAgICAgICAibmV0LmlwdjQuaXBfdW5wcml2aWxlZ2VkX3BvcnRfc3RhcnQiOiAiMCIsCiAgICAgICAgICAgICJuZXQuaXB2NC5waW5nX2dyb3VwX3JhbmdlIjogIjAgMjE0NzQ4MzY0NyIKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0sCiAgICAgICJzdG9yYWdlcyI6IFsKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoMCkiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXIwKSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogIm92ZXJsYXlmcyIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAiZnVzZTMua2F0YS1vdmVybGF5IiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiNGQwNjUzZjdjN2UzZjQ5YjQ5MDA2YTlmNGU4MTNhYTExNjZjNTMyYTM0YTc2NTBhZmE2ZmFhNTIyNmYxZWM1ZiIsCiAgICAgICAgICAgICJiZDViYjM4NzA5ZDI5NDNhMzZhMDJlNDU0ZTM0ZDNkNmNhYTIzODVmYjE0MGQ3ZjE3OTdmZDBhMjdhOTM3ZGRiIgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGNwYXRoKS8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJsb2NhbCIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAibG9jYWwiLAogICAgICAgICAgImZzdHlwZSI6ICJsb2NhbCIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIm1vZGU9MDc3NyIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiXiQoY3BhdGgpLyQoc2FuZGJveC1pZCkvbG9jYWwvd29ya2RpcjEkIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9CiAgICAgIF0sCiAgICAgICJkZXZpY2VzIjogW10sCiAgICAgICJzYW5kYm94X3BpZG5zIjogZmFsc2UsCiAgICAgICJleGVjX2NvbW1hbmRzIjogW10sCiAgICAgICJlbnZfbWFwIjogewogICAgICAgICJBTk5PVEFUSU9OIjogImZvbyIsCiAgICAgICAgIkhPU1ROQU1FIjogIiQoaG9zdC1uYW1lKSIsCiAgICAgICAgIlBBVEgiOiAiL3Vzci9sb2NhbC9zYmluOi91c3IvbG9jYWwvYmluOi91c3Ivc2JpbjovdXNyL2Jpbjovc2JpbjovYmluIiwKICAgICAgICAiUE9EX05BTUUiOiAiZm9vIgogICAgICB9CiAgICB9CiAgXSwKICAiY29tbW9uIjogewogICAgImNwYXRoIjogIi9ydW4va2F0YS1jb250YWluZXJzL3NoYXJlZC9jb250YWluZXJzIiwKICAgICJtb3VudF9zb3VyY2VfY3BhdGgiOiAiL3J1bi9rYXRhLWNvbnRhaW5lcnMvc2hhcmVkL2NvbnRhaW5lcnMiLAogICAgInNmcHJlZml4IjogIl4kKGNwYXRoKS8kKGJ1bmRsZS1pZCktW2EtejAtOV17MTZ9LSIsCiAgICAic3BhdGgiOiAiL3J1bi9rYXRhLWNvbnRhaW5lcnMvc2FuZGJveC9zdG9yYWdlIiwKICAgICJpcHY0X2EiOiAiKChbMC05XXxbMS05XVswLTldfDFbMC05XXsyfXwyWzAtNF1bMC05XXwyNVswLTVdKVxcLil7M30oWzAtOV18WzEtOV1bMC05XXwxWzAtOV17Mn18MlswLTRdWzAtOV18MjVbMC01XSkiLAogICAgImlwX3AiOiAiWzAtOV17MSw1fSIsCiAgICAic3ZjX25hbWUiOiAiW0EtWl9cXC5cXC1dKyIsCiAgICAiZG5zX2xhYmVsIjogIlthLXpBLVowLTlfXFwuXFwtXSsiLAogICAgInNfc291cmNlMSI6ICJeLi4yWzAtOV17M31fWzAtMV1bMC05XV9bMC0zXVswLTldX1swLTJdWzAtOV1fWzAtNV1bMC05XV9bMC01XVswLTldXFwuWzAtOV17MSwxMH0kIiwKICAgICJzX3NvdXJjZTIiOiAiXi4uZGF0YS8iLAogICAgImRuc19zdWJkb21haW4iOiAiXlthLXowLTldKFstYS16MC05XSpbYS16MC05XSk/JCIsCiAgICAicG9kX3VpZCI6ICJeWzAtOWEtZkEtRl17OH0tWzAtOWEtZkEtRl17NH0tWzAtOWEtZkEtRl17NH0tWzAtOWEtZkEtRl17NH0tWzAtOWEtZkEtRl17MTJ9JCIsCiAgICAiZGVmYXVsdF9jYXBzIjogWwogICAgICAiQ0FQX0NIT1dOIiwKICAgICAgIkNBUF9EQUNfT1ZFUlJJREUiLAogICAgICAiQ0FQX0ZTRVRJRCIsCiAgICAgICJDQVBfRk9XTkVSIiwKICAgICAgIkNBUF9NS05PRCIsCiAgICAgICJDQVBfTkVUX1JBVyIsCiAgICAgICJDQVBfU0VUR0lEIiwKICAgICAgIkNBUF9TRVRVSUQiLAogICAgICAiQ0FQX1NFVEZDQVAiLAogICAgICAiQ0FQX1NFVFBDQVAiLAogICAgICAiQ0FQX05FVF9CSU5EX1NFUlZJQ0UiLAogICAgICAiQ0FQX1NZU19DSFJPT1QiLAogICAgICAiQ0FQX0tJTEwiLAogICAgICAiQ0FQX0FVRElUX1dSSVRFIgogICAgXSwKICAgICJwcml2aWxlZ2VkX2NhcHMiOiBbCiAgICAgICJDQVBfQ0hPV04iLAogICAgICAiQ0FQX0RBQ19PVkVSUklERSIsCiAgICAgICJDQVBfREFDX1JFQURfU0VBUkNIIiwKICAgICAgIkNBUF9GT1dORVIiLAogICAgICAiQ0FQX0ZTRVRJRCIsCiAgICAgICJDQVBfS0lMTCIsCiAgICAgICJDQVBfU0VUR0lEIiwKICAgICAgIkNBUF9TRVRVSUQiLAogICAgICAiQ0FQX1NFVFBDQVAiLAogICAgICAiQ0FQX0xJTlVYX0lNTVVUQUJMRSIsCiAgICAgICJDQVBfTkVUX0JJTkRfU0VSVklDRSIsCiAgICAgICJDQVBfTkVUX0JST0FEQ0FTVCIsCiAgICAgICJDQVBfTkVUX0FETUlOIiwKICAgICAgIkNBUF9ORVRfUkFXIiwKICAgICAgIkNBUF9JUENfTE9DSyIsCiAgICAgICJDQVBfSVBDX09XTkVSIiwKICAgICAgIkNBUF9TWVNfTU9EVUxFIiwKICAgICAgIkNBUF9TWVNfUkFXSU8iLAogICAgICAiQ0FQX1NZU19DSFJPT1QiLAogICAgICAiQ0FQX1NZU19QVFJBQ0UiLAogICAgICAiQ0FQX1NZU19QQUNDVCIsCiAgICAgICJDQVBfU1lTX0FETUlOIiwKICAgICAgIkNBUF9TWVNfQk9PVCIsCiAgICAgICJDQVBfU1lTX05JQ0UiLAogICAgICAiQ0FQX1NZU19SRVNPVVJDRSIsCiAgICAgICJDQVBfU1lTX1RJTUUiLAogICAgICAiQ0FQX1NZU19UVFlfQ09ORklHIiwKICAgICAgIkNBUF9NS05PRCIsCiAgICAgICJDQVBfTEVBU0UiLAogICAgICAiQ0FQX0FVRElUX1dSSVRFIiwKICAgICAgIkNBUF9BVURJVF9DT05UUk9MIiwKICAgICAgIkNBUF9TRVRGQ0FQIiwKICAgICAgIkNBUF9NQUNfT1ZFUlJJREUiLAogICAgICAiQ0FQX01BQ19BRE1JTiIsCiAgICAgICJDQVBfU1lTTE9HIiwKICAgICAgIkNBUF9XQUtFX0FMQVJNIiwKICAgICAgIkNBUF9CTE9DS19TVVNQRU5EIiwKICAgICAgIkNBUF9BVURJVF9SRUFEIiwKICAgICAgIkNBUF9QRVJGTU9OIiwKICAgICAgIkNBUF9CUEYiLAogICAgICAiQ0FQX0NIRUNLUE9JTlRfUkVTVE9SRSIKICAgIF0sCiAgICAidmlydGlvX2Jsa19zdG9yYWdlX2NsYXNzZXMiOiBbCiAgICAgICJjYy1sb2NhbC1jc2kiLAogICAgICAiY2MtbWFuYWdlZC1jc2kiLAogICAgICAiY2MtbWFuYWdlZC1wcmVtaXVtLWNzaSIKICAgIF0sCiAgICAic21iX3N0b3JhZ2VfY2xhc3NlcyI6IFsKICAgICAgewogICAgICAgICJuYW1lIjogImF6dXJlZmlsZS1jc2kta2F0YS1jYyIsCiAgICAgICAgIm1vdW50X29wdGlvbnMiOiBbCiAgICAgICAgICAiZGlyX21vZGU9MDc3NyIsCiAgICAgICAgICAiZmlsZV9tb2RlPTA3NzciLAogICAgICAgICAgIm1mc3ltbGlua3MiLAogICAgICAgICAgImNhY2hlPXN0cmljdCIsCiAgICAgICAgICAibm9zaGFyZXNvY2siLAogICAgICAgICAgImFjdGltZW89MzAiLAogICAgICAgICAgIm5vYnJsIgogICAgICAgIF0KICAgICAgfQogICAgXQogIH0sCiAgInNhbmRib3giOiB7CiAgICAic3RvcmFnZXMiOiBbCiAgICAgIHsKICAgICAgICAiZHJpdmVyIjogImVwaGVtZXJhbCIsCiAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgInNvdXJjZSI6ICJzaG0iLAogICAgICAgICJmc3R5cGUiOiAidG1wZnMiLAogICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICJub2RldiIsCiAgICAgICAgICAibW9kZT0xNzc3IiwKICAgICAgICAgICJzaXplPTY3MTA4ODY0IgogICAgICAgIF0sCiAgICAgICAgIm1vdW50X3BvaW50IjogIi9ydW4va2F0YS1jb250YWluZXJzL3NhbmRib3gvc2htIiwKICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgIH0KICAgIF0KICB9LAogICJyZXF1ZXN0X2RlZmF1bHRzIjogewogICAgIkNyZWF0ZUNvbnRhaW5lclJlcXVlc3QiOiB7CiAgICAgICJhbGxvd19lbnZfcmVnZXgiOiBbCiAgICAgICAgIl5IT1NUTkFNRT0kKGRuc19sYWJlbCkkIiwKICAgICAgICAiXiQoc3ZjX25hbWUpX1BPUlRfJChpcF9wKV9UQ1A9dGNwOi8vJChpcHY0X2EpOiQoaXBfcCkkIiwKICAgICAgICAiXiQoc3ZjX25hbWUpX1BPUlRfJChpcF9wKV9UQ1BfUFJPVE89dGNwJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9QT1JUXyQoaXBfcClfVENQX1BPUlQ9JChpcF9wKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfUE9SVF8kKGlwX3ApX1RDUF9BRERSPSQoaXB2NF9hKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfU0VSVklDRV9IT1NUPSQoaXB2NF9hKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfU0VSVklDRV9QT1JUPSQoaXBfcCkkIiwKICAgICAgICAiXiQoc3ZjX25hbWUpX1NFUlZJQ0VfUE9SVF8kKGRuc19sYWJlbCk9JChpcF9wKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfUE9SVD10Y3A6Ly8kKGlwdjRfYSk6JChpcF9wKSQiLAogICAgICAgICJeQVpVUkVfQ0xJRU5UX0lEPVtBLUZhLWYwLTktXSokIiwKICAgICAgICAiXkFaVVJFX1RFTkFOVF9JRD1bQS1GYS1mMC05LV0qJCIsCiAgICAgICAgIl5BWlVSRV9GRURFUkFURURfVE9LRU5fRklMRT0vdmFyL3J1bi9zZWNyZXRzL2F6dXJlL3Rva2Vucy9henVyZS1pZGVudGl0eS10b2tlbiQiLAogICAgICAgICJeQVpVUkVfQVVUSE9SSVRZX0hPU1Q9aHR0cHM6Ly9sb2dpblxcLm1pY3Jvc29mdG9ubGluZVxcLmNvbS8kIiwKICAgICAgICAiXlRFUk09eHRlcm0kIgogICAgICBdLAogICAgICAiYWxsb3dfZW52X3JlZ2V4X21hcCI6IHsKICAgICAgICAiQ1BVX0xJTUlUIjogIl5bMC05XSskIiwKICAgICAgICAiSk9CX0NPTVBMRVRJT05fSU5ERVgiOiAiXlswLTldKiQiLAogICAgICAgICJNRU1PUllfTElNSVQiOiAiXlswLTldKyQiCiAgICAgIH0KICAgIH0sCiAgICAiQ29weUZpbGVSZXF1ZXN0IjogWwogICAgICAiJChzZnByZWZpeCkiCiAgICBdLAogICAgIkV4ZWNQcm9jZXNzUmVxdWVzdCI6IHsKICAgICAgImFsbG93ZWRfY29tbWFuZHMiOiBbXSwKICAgICAgInJlZ2V4IjogW10KICAgIH0sCiAgICAiVXBkYXRlUm91dGVzUmVxdWVzdCI6IHsKICAgICAgImZvcmJpZGRlbl9kZXZpY2VfbmFtZXMiOiBbCiAgICAgICAgImxvIgogICAgICBdLAogICAgICAiZm9yYmlkZGVuX3NvdXJjZV9yZWdleCI6IFsKICAgICAgICAiXig/OjB7MCw0fTopezAsN30wezAsM30xJCIsCiAgICAgICAgIl4xMjdcXC4oPzpbMC05XXsxLDN9XFwuKXsyfVswLTldezEsM30kIgogICAgICBdCiAgICB9LAogICAgIlVwZGF0ZUludGVyZmFjZVJlcXVlc3QiOiB7CiAgICAgICJhbGxvd19yYXdfZmxhZ3MiOiAxMjgsCiAgICAgICJmb3JiaWRkZW5fbmFtZXMiOiBbCiAgICAgICAgImxvIgogICAgICBdLAogICAgICAiZm9yYmlkZGVuX2h3X2FkZHJzIjogWwogICAgICAgICIwMDowMDowMDowMDowMDowMCIKICAgICAgXQogICAgfSwKICAgICJDbG9zZVN0ZGluUmVxdWVzdCI6IGZhbHNlLAogICAgIlJlYWRTdHJlYW1SZXF1ZXN0IjogZmFsc2UsCiAgICAiVXBkYXRlRXBoZW1lcmFsTW91bnRzUmVxdWVzdCI6IGZhbHNlLAogICAgIldyaXRlU3RyZWFtUmVxdWVzdCI6IGZhbHNlCiAgfQp9 + creationTimestamp: ~ + labels: + name: var-expansion-1547e6a6-0124-4051-b640-bc263b561017 + managedFields: + - apiVersion: v1 + fieldsType: FieldsV1 + fieldsV1: + "f:metadata": + "f:annotations": + ".": {} + "f:notmysubpath": {} + "f:labels": + ".": {} + "f:name": {} + "f:spec": + "f:containers": + "k:{\"name\":\"dapi-container\"}": + ".": {} + "f:command": {} + "f:env": + ".": {} + "k:{\"name\":\"ANNOTATION\"}": + ".": {} + "f:name": {} + "f:valueFrom": + ".": {} + "f:fieldRef": {} + "k:{\"name\":\"POD_NAME\"}": + ".": {} + "f:name": {} + "f:value": {} + "f:image": {} + "f:imagePullPolicy": {} + "f:name": {} + "f:resources": {} + "f:terminationMessagePath": {} + "f:terminationMessagePolicy": {} + "f:volumeMounts": + ".": {} + "k:{\"mountPath\":\"/subpath_mount\"}": + ".": {} + "f:mountPath": {} + "f:name": {} + "f:subPathExpr": {} + "k:{\"mountPath\":\"/volume_mount\"}": + ".": {} + "f:mountPath": {} + "f:name": {} + "f:dnsPolicy": {} + "f:enableServiceLinks": {} + "f:restartPolicy": {} + "f:schedulerName": {} + "f:securityContext": {} + "f:terminationGracePeriodSeconds": {} + "f:volumes": + ".": {} + "k:{\"name\":\"workdir1\"}": + ".": {} + "f:emptyDir": {} + "f:name": {} + manager: e2e.test + operation: Update + time: "2023-06-20T22:11:32Z" + name: var-expansion-1547e6a6-0124-4051-b640-bc263b561017 + namespace: var-expansion-6653 +spec: + containers: + - command: + - sh + env: + - name: POD_NAME + value: foo + - name: ANNOTATION + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: "metadata.annotations['mysubpath']" + image: "registry.k8s.io/e2e-test-images/busybox:1.29-2" + imagePullPolicy: IfNotPresent + name: dapi-container + resources: {} + terminationMessagePath: /dev/termination-log + terminationMessagePolicy: File + volumeMounts: + - mountPath: /subpath_mount + name: workdir1 + subPathExpr: $(ANNOTATION)/$(POD_NAME) + - mountPath: /volume_mount + name: workdir1 + - mountPath: /var/run/secrets/kubernetes.io/serviceaccount + name: kube-api-access-bcld9 + readOnly: true + dnsPolicy: ClusterFirst + enableServiceLinks: true + preemptionPolicy: PreemptLowerPriority + priority: 0 + restartPolicy: Never + runtimeClassName: kata-cc + schedulerName: default-scheduler + securityContext: {} + serviceAccount: default + serviceAccountName: default + terminationGracePeriodSeconds: 30 + tolerations: + - effect: NoExecute + key: node.kubernetes.io/not-ready + operator: Exists + tolerationSeconds: 300 + - effect: NoExecute + key: node.kubernetes.io/unreachable + operator: Exists + tolerationSeconds: 300 + volumes: + - emptyDir: {} + name: workdir1 + - name: kube-api-access-bcld9 + projected: + defaultMode: 420 + sources: + - serviceAccountToken: + expirationSeconds: 3607 + path: token + - configMap: + items: + - key: ca.crt + path: ca.crt + name: kube-root-ca.crt + - downwardAPI: + items: + - fieldRef: + apiVersion: v1 + fieldPath: metadata.namespace + path: namespace +status: {} diff --git a/src/agent/samples/policy/yaml/webhook2/webhook-pod12.yaml b/src/agent/samples/policy/yaml/webhook2/webhook-pod12.yaml new file mode 100644 index 000000000000..414e3c67beed --- /dev/null +++ b/src/agent/samples/policy/yaml/webhook2/webhook-pod12.yaml @@ -0,0 +1,144 @@ +--- +apiVersion: v1 +kind: Namespace +metadata: + name: job-4436 +--- +apiVersion: v1 +kind: Pod +metadata: + annotations: + batch.kubernetes.io/job-completion-index: "0" + io.katacontainers.config.agent.policy: IyBDb3B5cmlnaHQgKGMpIDIwMjMgTWljcm9zb2Z0IENvcnBvcmF0aW9uCiMKIyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMAojCnBhY2thZ2UgYWdlbnRfcG9saWN5CgppbXBvcnQgZnV0dXJlLmtleXdvcmRzLmluCmltcG9ydCBmdXR1cmUua2V5d29yZHMuZXZlcnkKCiMgRGVmYXVsdCB2YWx1ZXMsIHJldHVybmVkIGJ5IE9QQSB3aGVuIHJ1bGVzIGNhbm5vdCBiZSBldmFsdWF0ZWQgdG8gdHJ1ZS4KZGVmYXVsdCBBZGRBUlBOZWlnaGJvcnNSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgQWRkU3dhcFJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBDbG9zZVN0ZGluUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IENvcHlGaWxlUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IENyZWF0ZUNvbnRhaW5lclJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBDcmVhdGVTYW5kYm94UmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IERlc3Ryb3lTYW5kYm94UmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgRXhlY1Byb2Nlc3NSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgR2V0T09NRXZlbnRSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBHdWVzdERldGFpbHNSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBMaXN0SW50ZXJmYWNlc1JlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBMaXN0Um91dGVzUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IE1lbUhvdHBsdWdCeVByb2JlUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IE9ubGluZUNQVU1lbVJlcXVlc3QgOj0gdHJ1ZQpkZWZhdWx0IFBhdXNlQ29udGFpbmVyUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFJlYWRTdHJlYW1SZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgUmVtb3ZlQ29udGFpbmVyUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgUmVtb3ZlU3RhbGVWaXJ0aW9mc1NoYXJlTW91bnRzUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgUmVzZWVkUmFuZG9tRGV2UmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFJlc3VtZUNvbnRhaW5lclJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBTZXRHdWVzdERhdGVUaW1lUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFNldFBvbGljeVJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBTaWduYWxQcm9jZXNzUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgU3RhcnRDb250YWluZXJSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBTdGFydFRyYWNpbmdSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgU3RhdHNDb250YWluZXJSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBTdG9wVHJhY2luZ1JlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBUdHlXaW5SZXNpemVSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBVcGRhdGVDb250YWluZXJSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgVXBkYXRlRXBoZW1lcmFsTW91bnRzUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFVwZGF0ZUludGVyZmFjZVJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBVcGRhdGVSb3V0ZXNSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgV2FpdFByb2Nlc3NSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBXcml0ZVN0cmVhbVJlcXVlc3QgOj0gZmFsc2UKCiMgQWxsb3dSZXF1ZXN0c0ZhaWxpbmdQb2xpY3kgOj0gdHJ1ZSBjb25maWd1cmVzIHRoZSBBZ2VudCB0byAqYWxsb3cgYW55CiMgcmVxdWVzdHMgY2F1c2luZyBhIHBvbGljeSBmYWlsdXJlKi4gVGhpcyBpcyBhbiB1bnNlY3VyZSBjb25maWd1cmF0aW9uCiMgYnV0IGlzIHVzZWZ1bCBmb3IgYWxsb3dpbmcgdW5zZWN1cmUgcG9kcyB0byBzdGFydCwgdGhlbiBjb25uZWN0IHRvCiMgdGhlbSBhbmQgaW5zcGVjdCBPUEEgbG9ncyBmb3IgdGhlIHJvb3QgY2F1c2Ugb2YgYSBmYWlsdXJlLgpkZWZhdWx0IEFsbG93UmVxdWVzdHNGYWlsaW5nUG9saWN5IDo9IGZhbHNlCgojIENvbnN0YW50cwpTX05BTUVfS0VZID0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZSIKU19OQU1FU1BBQ0VfS0VZID0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZXNwYWNlIgpCVU5ETEVfSUQgPSAiW2EtejAtOV17NjR9IgoKQ3JlYXRlQ29udGFpbmVyUmVxdWVzdDo9IHJlc3AgewogICAgbm90IGlzX251bGwoaW5wdXQuZW52X21hcCkKICAgIAogICAgaV9lbnZfbWFwIDo9IGlucHV0LmVudl9tYXAKICAgIAogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBwX2Vudl9tYXAgOj0gcF9jb250YWluZXIuZW52X21hcCAgCiAgICBhbGxvd19lbnZfbWFwKHBfZW52X21hcCwgaV9lbnZfbWFwKQogICAgCiAgICBpX3Byb2Nlc3MgOj0gaW5wdXQuYmFzZS5PQ0kuUHJvY2VzcwogICAgCiAgICBwX3Byb2Nlc3MgOj0gcF9jb250YWluZXIuT0NJLlByb2Nlc3MKICAgIAogICAgYWxsb3dfYXJncyhpX3Byb2Nlc3MsIHBfcHJvY2VzcywgaV9lbnZfbWFwKQoKICAgIHJlc3AgPSBDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uKGlucHV0LmJhc2UpCiAgICBwcmludCgiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdDogdHJ1ZSIpCn0KCmFsbG93X2FyZ3MoaV9wcm9jZXNzLCBwX3Byb2Nlc3MsIGlfZW52X21hcCkgewogICAgaV9hcmdzIDo9IGlfcHJvY2Vzcy5BcmdzCiAgICBwX2FyZ3MgOj0gcF9wcm9jZXNzLkFyZ3MKICAgIHByaW50KCJhbGxvd19hcmdzOiBpX2FyZ3MgPSIsIGlfYXJncywgInBfYXJncyA9IiwgcF9hcmdzKQogICAgY291bnQoaV9hcmdzKSA9PSBjb3VudChwX2FyZ3MpCiAgICBldmVyeSBpLCBpX2FyZyBpbiBpX2FyZ3MgewogICAgICAgIHByaW50KCJhbGxvd19hcmdzOiBpX2FyZyA9IiwgaV9hcmcpCiAgICAgICAgcF9hcmdfcmVwbGFjZWQgOj0gcmVwbGFjZV9lbnZfdmFyaWFibGVzKHBfYXJnc1tpXSwgaV9lbnZfbWFwKQogICAgICAgIHByaW50KCJhbGxvd19hcmdzOiBwX2FyZ19yZXBsYWNlZCA9IiwgcF9hcmdfcmVwbGFjZWQpCiAgICAgICAgcF9hcmdfcmVwbGFjZWQyIDo9IHJlcGxhY2UocF9hcmdfcmVwbGFjZWQsICIkJCIsICIkIikKICAgICAgICBwcmludCgiYWxsb3dfYXJnczogcF9hcmdfcmVwbGFjZWQyID0iLCBwX2FyZ19yZXBsYWNlZDIpCiAgICAgICAgaV9hcmcgPT0gcF9hcmdfcmVwbGFjZWQyCiAgICB9CiAgICBwcmludCgiYWxsb3dfYXJnczogdHJ1ZSIpCn0KCmFsbG93X2FyZ3MoaV9wcm9jZXNzLCBwX3Byb2Nlc3MsIGlfZW52X21hcCkgewogICAgbm90IGlfcHJvY2Vzcy5BcmdzCiAgICBub3QgcF9wcm9jZXNzLkFyZ3MKICAgIHByaW50KCJhbGxvd19hcmdzMjogbm8gYXJncyIpCn0KCiMgdGhpcyBmdW5jdGlvbiByZXBsYWNlcyBhbGwgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyBpbiBhIHN0cmluZywgZ2l2ZW4gYSBtYXAgb2YgZW52aXJvbm1lbnQga2V5cyB0byBlbnZpcm9ubWVudCB2YWx1ZXMKIyBlZyBzdHIgPSAiZWNobyAkKENMVVNURVJfSUQpOyBlY2hvICQoTk9ERV9OQU1FKTsiCiMgZW52X21hcCA9IHsiQ0xVU1RFUl9JRCI6ICJhYmMiLCAiTk9ERV9OQU1FIiA6ICJ4eXoifQojIHJlc3VsdCA9ICJlY2hvIGFiYzsgZWNobyB4eXo7IgpyZXBsYWNlX2Vudl92YXJpYWJsZXMoc3RyLCBlbnZfbWFwKSA9IHJlc3VsdCB7CiAgICAjIG1ha2UgYW4gYXJyYXkgb2YgdGhlIGtleXMgZWcgWyJDTFVTVEVSX0lEIiwgIk5PREVfTkFNRSJdCiAgICBrZXlzIDo9IFt4IHwgc29tZSB4IGluIG9iamVjdC5rZXlzKGVudl9tYXApXQogICAgcmVzdWx0IDo9IHJlcGxhY2Vfc3RyX3JlYyhzdHIsIGVudl9tYXAsIGtleXMsIGNvdW50KGtleXMpIC0gMSkKfQoKIyBiYXNlIGNhc2UKcmVwbGFjZV9zdHJfcmVjKHN0ciwgZW52X21hcCwgYXJyX2tleXMsIGkpID0gcmVzdWx0IHsKICAgIGkgPCAwCiAgICByZXN1bHQgOj0gc3RyCn0KCiMgcmVjdXJzaXZlIHN0ZXAKcmVwbGFjZV9zdHJfcmVjKHN0ciwgZW52X21hcCwgYXJyX2tleXMsIGkpID0gcmVzdWx0IHsKICAgIGkgPj0gMAogICAga2V5IDo9IGFycl9rZXlzW2ldCiAgICBlbnZfa2V5MSA6PSBjb25jYXQoIiIsIFsiJCgiLCBrZXksICIpIl0pCiAgICAjIHJlcGxhY2UgJChWQVIpIHdpdGggdmFsdWUKICAgIG5ld19zdHIxIDo9IHJlcGxhY2Uoc3RyLCBlbnZfa2V5MSwgZW52X21hcFtrZXldKQogICAgIyByZXBsYWNlIG5leHQgZW52aXJvbm1lbnQgdmFyaWFibGUKICAgIHJlc3VsdCA9IHJlcGxhY2Vfc3RyX3JlYyhuZXdfc3RyMSwgZW52X21hcCwgYXJyX2tleXMsIGkgLSAxKQp9CgphbGxvd19lbnZfbWFwKHBfZW52X21hcCwgaV9lbnZfbWFwKSB7CiAgICBwcmludCgiYWxsb3dfZW52X21hcDogcF9lbnZfbWFwID0iLCBwX2Vudl9tYXApCiAgICBldmVyeSBlbnZfa2V5LCBlbnZfdmFsIGluIGlfZW52X21hcCB7CiAgICAgICAgcHJpbnQoImFsbG93X2VudjogZW52X2tleSA9IiwgZW52X2tleSwgImVudl92YWwgPSIsIGVudl92YWwpCiAgICAgICAgYWxsb3dfZW52X21hcF9lbnRyeShlbnZfa2V5LCBlbnZfdmFsLCBwX2Vudl9tYXApCiAgICB9CiAgICBwcmludCgiYWxsb3dfZW52X21hcDogdHJ1ZSIpCn0KCiMgQWxsb3cgZXhhY3QgbWF0Y2gKYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBpX3ZhbCA9PSBwX3ZhbAogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnk6IHRydWUiKQp9CgojIEFsbG93IHJlc291cmNlRmllbGRSZWYgdmFsdWVzIChlLmcuLCAibGltaXRzLmNwdSIpLgphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgICMgYSB2YXJpYWJsZSB3ZSBzaG91bGQgYmUgdmFsaWRhdGluZyB1c2luZyBhIHJlZ2V4IGZyb20gc2V0dGluZ3MKICAgIHBfdmFsID09ICIkKHZhbGlkYXRlLWZyb20tc2V0dGluZ3MpIgogICAgcmVnZXhfdmFsIDo9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuQ3JlYXRlQ29udGFpbmVyUmVxdWVzdC5hbGxvd19lbnZfcmVnZXhfbWFwW2tleV0KICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4X3ZhbCwgaV92YWwpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSAyOiB0cnVlIikKfQoKIyBBbGxvdyBub2RlLW5hbWUKYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChub2RlLW5hbWUpIgogICAgcmVnZXgubWF0Y2gocG9saWN5X2RhdGEuY29tbW9uLmRuc19zdWJkb21haW4gLCBpX3ZhbCkKICAgIHByaW50KCJhbGxvd19lbnZfbWFwX2VudHJ5IDM6IHRydWUiKQp9CgojIEFsbG93IGhvc3QtbmFtZQphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgIHBfdmFsID09ICIkKGhvc3QtbmFtZSkiCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24uZG5zX2xhYmVsICwgaV92YWwpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSA0OiB0cnVlIikKfQoKIyBBbGxvdyBwb2QtdWlkCmFsbG93X2Vudl9tYXBfZW50cnkoa2V5LCBpX3ZhbCwgcF9lbnZfbWFwKSB7CiAgICBwX3ZhbCA6PSBwX2Vudl9tYXBba2V5XQogICAgcF92YWwgPT0gIiQocG9kLXVpZCkiCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24ucG9kX3VpZCAsIGlfdmFsKQogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgNTogdHJ1ZSIpCn0KCiMgQWxsb3cgZmllbGRSZWYgImZpZWxkUGF0aDogc3RhdHVzLnBvZElQIiB2YWx1ZXMuCmFsbG93X2Vudl9tYXBfZW50cnkoa2V5LCBpX3ZhbCwgcF9lbnZfbWFwKSB7CiAgICBpc19pcChpX3ZhbCkKCiAgICBwX3ZhbCA6PSBwX2Vudl9tYXBba2V5XQogICAgcF92YXIgOj0gY29uY2F0KCI9IiwgW2tleSwgcF92YWxdKQogICAgYWxsb3dfcG9kX2lwX3ZhcihrZXksIHBfdmFyKQogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgNjogdHJ1ZSIpCn0KCiMgQWxsb3cgZmllbGRSZWYgImZpZWxkUGF0aDogc3RhdHVzLmhvc3RJUCIgdmFsdWVzLgphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgaXNfaXAoaV92YWwpCgogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgIHBfdmFyIDo9IGNvbmNhdCgiPSIsIFtrZXksIHBfdmFsXSkKICAgIGFsbG93X2hvc3RfaXBfdmFyKGtleSwgcF92YXIpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSA3OiB0cnVlIikKfQoKIyBNYXRjaCBpbnB1dCB3aXRoIG9uZSBvZiB0aGUgcG9saWN5IHZhcmlhYmxlcywgYWZ0ZXIgc3Vic3RpdHV0aW5nICQoc2FuZGJveC1uYW1lKS4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChzYW5kYm94LW5hbWUpIgogICAgc19uYW1lIDo9IGlucHV0LmJhc2UuT0NJLkFubm90YXRpb25zW1NfTkFNRV9LRVldCiAgICBwX3ZhcjIgOj0gcmVwbGFjZShwX3ZhbCwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHBfdmFyMiA9PSBpX3ZhbAogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgODogdHJ1ZSIpCn0KCiMgTWF0Y2ggaW5wdXQgd2l0aCBvbmUgb2YgdGhlIHBvbGljeSB2YXJpYWJsZXMsIGFmdGVyIHN1YnN0aXR1dGluZyAkKHNhbmRib3gtbmFtZXNwYWNlKS4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChzYW5kYm94LW5hbWVzcGFjZSkiCiAgICBzX25hbWVzcGFjZSA6PSBpbnB1dC5iYXNlLk9DSS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwX3ZhcjIgOj0gcmVwbGFjZShwX3ZhbCwgIiQoc2FuZGJveC1uYW1lc3BhY2UpIiwgc19uYW1lc3BhY2UpCiAgICBwX3ZhcjIgPT0gaV92YWwKICAgIHByaW50KCJhbGxvd19lbnZfbWFwX2VudHJ5IDk6IHRydWUiKQp9CgojIEFsbG93IGlucHV0IGVudiB2YXJpYWJsZXMgdGhhdCBtYXRjaCB3aXRoIGEgcmVxdWVzdF9kZWZhdWx0cyByZWdleC4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHNvbWUgcF9yZWdleDEgaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5DcmVhdGVDb250YWluZXJSZXF1ZXN0LmFsbG93X2Vudl9yZWdleAogICAgcF9yZWdleDIgOj0gcmVwbGFjZShwX3JlZ2V4MSwgIiQoaXB2NF9hKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcHY0X2EpCiAgICBwX3JlZ2V4MyA6PSByZXBsYWNlKHBfcmVnZXgyLCAiJChpcF9wKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcF9wKQogICAgcF9yZWdleDQgOj0gcmVwbGFjZShwX3JlZ2V4MywgIiQoc3ZjX25hbWUpIiwgcG9saWN5X2RhdGEuY29tbW9uLnN2Y19uYW1lKQogICAgcF9yZWdleDUgOj0gcmVwbGFjZShwX3JlZ2V4NCwgIiQoZG5zX2xhYmVsKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5kbnNfbGFiZWwpCgogICAgcmVzdWx0IDo9IGNvbmNhdCgiPSIsIFtrZXksIGlfdmFsXSkKICAgIHJlZ2V4Lm1hdGNoKHBfcmVnZXg1LCByZXN1bHQpCgogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgMTA6IHRydWUiKQp9CgpDcmVhdGVDb250YWluZXJSZXF1ZXN0Oj0gcmVzcCB7CiAgICBub3QgaW5wdXQuZW52X21hcAogICAgaV9wcm9jZXNzID0gaW5wdXQuT0NJLlByb2Nlc3MKICAgIHNfbmFtZSA9IGlucHV0Lk9DSS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBwX3Byb2Nlc3MgPSBwX2NvbnRhaW5lci5PQ0kuUHJvY2VzcwogICAgYWxsb3dfZGVwcmVjYXRlZF9hcmdzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUpCiAgICByZXNwID0gQ3JlYXRlQ29udGFpbmVyUmVxdWVzdENvbW1vbihpbnB1dCkKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0MjogdHJ1ZSIpCn0KCkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb24ocmVxKTo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgICMgQ2hlY2sgaWYgdGhlIGlucHV0IHJlcXVlc3Qgc2hvdWxkIGJlIHJlamVjdGVkIGV2ZW4gYmVmb3JlIGNoZWNraW5nIHRoZQogICAgIyBwb2xpY3lfZGF0YS5jb250YWluZXJzIGluZm9ybWF0aW9uLgogICAgYWxsb3dfY3JlYXRlX2NvbnRhaW5lcl9pbnB1dChyZXEpCgogICAgaV9vY2kgOj0gcmVxLk9DSQogICAgaV9zdG9yYWdlcyA6PSByZXEuc3RvcmFnZXMKICAgIGlfZGV2aWNlcyA6PSByZXEuZGV2aWNlcwoKICAgICMgYXJyYXkgb2YgcG9zc2libGUgc3RhdGUgb3BlcmF0aW9ucwogICAgb3BzX2J1aWxkZXIgOj0gW10KCiAgICAjIGNoZWNrIHNhbmRib3ggbmFtZQogICAgc2FuZGJveF9uYW1lID0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FX0tFWV0KICAgIGFkZF9zYW5kYm94X25hbWVfdG9fc3RhdGUgOj0gc3RhdGVfYWxsb3dzKCJzYW5kYm94X25hbWUiLCBzYW5kYm94X25hbWUpCiAgICBvcHNfYnVpbGRlcjEgOj0gY29uY2F0X29wX2lmX25vdF9udWxsKG9wc19idWlsZGVyLCBhZGRfc2FuZGJveF9uYW1lX3RvX3N0YXRlKQoKICAgICMgQ2hlY2sgaWYgYW55IGVsZW1lbnQgZnJvbSB0aGUgcG9saWN5X2RhdGEuY29udGFpbmVycyBhcnJheSBhbGxvd3MgdGhlIGlucHV0IHJlcXVlc3QuCiAgICBzb21lIHBfY29udGFpbmVyIGluIHBvbGljeV9kYXRhLmNvbnRhaW5lcnMKICAgIHByaW50KCI9PT09PT09PSBDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiB0cnlpbmcgbmV4dCBwb2xpY3kgY29udGFpbmVyIikKCiAgICBwX3BpZG5zIDo9IHBfY29udGFpbmVyLnNhbmRib3hfcGlkbnMKICAgIGlfcGlkbnMgOj0gcmVxLnNhbmRib3hfcGlkbnMKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiBwX3BpZG5zID0iLCBwX3BpZG5zLCAiaV9waWRucyA9IiwgaV9waWRucykKICAgIHBfcGlkbnMgPT0gaV9waWRucwoKICAgIHBfb2NpIDo9IHBfY29udGFpbmVyLk9DSQoKICAgICMgY2hlY2sgbmFtZXNwYWNlCiAgICBwX25hbWVzcGFjZSA6PSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBpX25hbWVzcGFjZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwcmludCAoIkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb246IHBfbmFtZXNwYWNlID0iLCBwX25hbWVzcGFjZSwgImlfbmFtZXNwYWNlID0iLCBpX25hbWVzcGFjZSkKICAgIGFkZF9uYW1lc3BhY2VfdG9fc3RhdGUgOj0gYWxsb3dfbmFtZXNwYWNlKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkKICAgIG9wc19idWlsZGVyMiA6PSBjb25jYXRfb3BfaWZfbm90X251bGwob3BzX2J1aWxkZXIxLCBhZGRfbmFtZXNwYWNlX3RvX3N0YXRlKQoKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiBwIFZlcnNpb24gPSIsIHBfb2NpLlZlcnNpb24sICJpIFZlcnNpb24gPSIsIGlfb2NpLlZlcnNpb24pCiAgICBwX29jaS5WZXJzaW9uID09IGlfb2NpLlZlcnNpb24KCiAgICBwcmludCgiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdENvbW1vbjogcCBSZWFkb25seSA9IiwgcF9vY2kuUm9vdC5SZWFkb25seSwgImkgUmVhZG9ubHkgPSIsIGlfb2NpLlJvb3QuUmVhZG9ubHkpCiAgICBwX29jaS5Sb290LlJlYWRvbmx5ID09IGlfb2NpLlJvb3QuUmVhZG9ubHkKCiAgICBhbGxvd19hbm5vKHBfb2NpLCBpX29jaSkKCiAgICBwX3N0b3JhZ2VzIDo9IHBfY29udGFpbmVyLnN0b3JhZ2VzCiAgICBhbGxvd19ieV9hbm5vKHBfb2NpLCBpX29jaSwgcF9zdG9yYWdlcywgaV9zdG9yYWdlcykKCiAgICBwX2RldmljZXMgOj0gcF9jb250YWluZXIuZGV2aWNlcwogICAgYWxsb3dfZGV2aWNlcyhwX2RldmljZXMsIGlfZGV2aWNlcykKCiAgICByZXQgOj0gYWxsb3dfbGludXgob3BzX2J1aWxkZXIyLCBwX29jaSwgaV9vY2kpCiAgICByZXQuYWxsb3dlZAoKICAgIG9wcyA6PSByZXQub3BzCgogICAgcHJpbnQoIkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb246IHRydWUiKQp9CgphbGxvd19jcmVhdGVfY29udGFpbmVyX2lucHV0KHJlcSkgewogICAgcHJpbnQoImFsbG93X2NyZWF0ZV9jb250YWluZXJfaW5wdXQ6IGlucHV0ID0iLCByZXEpCgogICAgY291bnQocmVxLnNoYXJlZF9tb3VudHMpID09IDAKICAgIGlzX251bGwocmVxLnN0cmluZ191c2VyKQoKICAgIGlfb2NpIDo9IHJlcS5PQ0kKICAgIGlzX251bGwoaV9vY2kuSG9va3MpCiAgICBpc19udWxsKGlfb2NpLlNvbGFyaXMpCiAgICBpc19udWxsKGlfb2NpLldpbmRvd3MpCgogICAgaV9saW51eCA6PSBpX29jaS5MaW51eAogICAgY291bnQoaV9saW51eC5HSURNYXBwaW5ncykgPT0gMAogICAgY291bnQoaV9saW51eC5Nb3VudExhYmVsKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlJlc291cmNlcy5EZXZpY2VzKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlJvb3Rmc1Byb3BhZ2F0aW9uKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlVJRE1hcHBpbmdzKSA9PSAwCiAgICBpc19udWxsKGlfbGludXguSW50ZWxSZHQpCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLkJsb2NrSU8pCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLk5ldHdvcmspCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLlBpZHMpCiAgICBpc19udWxsKGlfbGludXguU2VjY29tcCkKCiAgICBpX3Byb2Nlc3MgOj0gaV9vY2kuUHJvY2VzcwogICAgY291bnQoaV9wcm9jZXNzLlNlbGludXhMYWJlbCkgPT0gMAogICAgY291bnQoaV9wcm9jZXNzLlVzZXIuVXNlcm5hbWUpID09IDAKCiAgICBwcmludCgiYWxsb3dfY3JlYXRlX2NvbnRhaW5lcl9pbnB1dDogdHJ1ZSIpCn0KCmFsbG93X25hbWVzcGFjZShwX25hbWVzcGFjZSwgaV9uYW1lc3BhY2UpID0gYWRkX25hbWVzcGFjZSB7CiAgICBwX25hbWVzcGFjZSA9PSBpX25hbWVzcGFjZQogICAgYWRkX25hbWVzcGFjZSA6PSBudWxsCiAgICBwcmludCgiYWxsb3dfbmFtZXNwYWNlIDE6IGlucHV0IG5hbWVzcGFjZSBtYXRjaGVzIHBvbGljeSBkYXRhIikKfQoKYWxsb3dfbmFtZXNwYWNlKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkgPSBhZGRfbmFtZXNwYWNlIHsKICAgIHBfbmFtZXNwYWNlID09ICIiCiAgICBwcmludCgiYWxsb3dfbmFtZXNwYWNlIDI6IG5vIG5hbWVzcGFjZSBmb3VuZCBvbiBwb2xpY3kgZGF0YSIpCiAgICBhZGRfbmFtZXNwYWNlIDo9IHN0YXRlX2FsbG93cygibmFtZXNwYWNlIiwgaV9uYW1lc3BhY2UpCn0KCiMgdmFsdWUgaGFzbid0IGJlZW4gc2VlbiBiZWZvcmUsIHNhdmUgaXQgdG8gc3RhdGUKc3RhdGVfYWxsb3dzKGtleSwgdmFsdWUpID0gYWN0aW9uIHsKICBzdGF0ZSA6PSBnZXRfc3RhdGUoKQogIHByaW50KCJzdGF0ZV9hbGxvd3MgMTogc3RhdGVba2V5XSA9Iiwgc3RhdGVba2V5XSwgInZhbHVlID0iLCB2YWx1ZSkKICBub3Qgc3RhdGVba2V5XQogIHByaW50KCJzdGF0ZV9hbGxvd3MgMTogc2F2aW5nIHRvIHN0YXRlIGtleSA9Iiwga2V5LCAidmFsdWUgPSIsIHZhbHVlKQogIHBhdGggOj0gZ2V0X3N0YXRlX3BhdGgoa2V5KSAKICBhY3Rpb24gOj0gewogICAgIm9wIjogImFkZCIsCiAgICAicGF0aCI6IHBhdGgsIAogICAgInZhbHVlIjogdmFsdWUsCiAgfQp9CgojIHZhbHVlIG1hdGNoZXMgd2hhdCdzIGluIHN0YXRlLCBhbGxvdyBpdApzdGF0ZV9hbGxvd3Moa2V5LCB2YWx1ZSkgPSBhY3Rpb24gewogIHByaW50KCJzdGF0ZV9hbGxvd3MgMjogc3RhcnQiKQogIHN0YXRlIDo9IGdldF9zdGF0ZSgpCiAgcHJpbnQoInN0YXRlX2FsbG93cyAyOiBzdGF0ZVtrZXldID0iLCBzdGF0ZVtrZXldLCAidmFsdWUgPSIsIHZhbHVlKQogIHZhbHVlID09IHN0YXRlW2tleV0KICBwcmludCgic3RhdGVfYWxsb3dzIDI6IGZvdW5kIGtleSA9Iiwga2V5LCAidmFsdWUgPSIsIHZhbHVlLCAiIGluIHN0YXRlIikKICBhY3Rpb24gOj0gbnVsbAp9CgojIGhlbHBlciBmdW5jdGlvbnMgdG8gaW50ZXJhY3Qgd2l0aCB0aGUgc3RhdGUKZ2V0X3N0YXRlKCkgPSBzdGF0ZSB7CiAgc3RhdGUgOj0gZGF0YVsicHN0YXRlIl0KfQoKZ2V0X3N0YXRlX3ZhbChrZXkpID0gdmFsdWUgewogICAgc3RhdGUgOj0gZ2V0X3N0YXRlKCkKICAgIHZhbHVlIDo9IHN0YXRlW2tleV0KfQoKZ2V0X3N0YXRlX3BhdGgoa2V5KSA9IHBhdGggewogICAgIyBwcmVwZW5kICIvcHN0YXRlLyIgdG8ga2V5CiAgICBwYXRoIDo9IGNvbmNhdCgiLyIsIFsiL3BzdGF0ZSIsIGtleV0pCn0KCiMgSGVscGVyIGZ1bmN0aW9ucyB0byBjb25kaXRpb25hbGx5IGNvbmNhdGVuYXRlIG9wIGlzIG5vdCBudWxsCmNvbmNhdF9vcF9pZl9ub3RfbnVsbChvcHMsIG9wKSA9IHJlc3VsdCB7CiAgICBvcCA9PSBudWxsCiAgICByZXN1bHQgOj0gb3BzCn0KCmNvbmNhdF9vcF9pZl9ub3RfbnVsbChvcHMsIG9wKSA9IHJlc3VsdCB7CiAgICBvcCAhPSBudWxsCiAgICByZXN1bHQgOj0gYXJyYXkuY29uY2F0KG9wcywgW29wXSkKfQoKIyBSZWplY3QgdW5leHBlY3RlZCBhbm5vdGF0aW9ucy4KYWxsb3dfYW5ubyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19hbm5vIDE6IHN0YXJ0IikKCiAgICBub3QgaV9vY2kuQW5ub3RhdGlvbnMKCiAgICBwcmludCgiYWxsb3dfYW5ubyAxOiB0cnVlIikKfQphbGxvd19hbm5vKHBfb2NpLCBpX29jaSkgewogICAgcHJpbnQoImFsbG93X2Fubm8gMjogcCBBbm5vdGF0aW9ucyA9IiwgcF9vY2kuQW5ub3RhdGlvbnMpCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiBpIEFubm90YXRpb25zID0iLCBpX29jaS5Bbm5vdGF0aW9ucykKCiAgICBpX2tleXMgOj0gb2JqZWN0LmtleXMoaV9vY2kuQW5ub3RhdGlvbnMpCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiBpIGtleXMgPSIsIGlfa2V5cykKCiAgICBldmVyeSBpX2tleSBpbiBpX2tleXMgewogICAgICAgIGFsbG93X2Fubm9fa2V5KGlfa2V5LCBwX29jaSkKICAgIH0KCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiB0cnVlIikKfQoKYWxsb3dfYW5ub19rZXkoaV9rZXksIHBfb2NpKSB7CiAgICBwcmludCgiYWxsb3dfYW5ub19rZXkgMTogaSBrZXkgPSIsIGlfa2V5KQoKICAgIHN0YXJ0c3dpdGgoaV9rZXksICJpby5rdWJlcm5ldGVzLmNyaS4iKQoKICAgIHByaW50KCJhbGxvd19hbm5vX2tleSAxOiB0cnVlIikKfQphbGxvd19hbm5vX2tleShpX2tleSwgcF9vY2kpIHsKICAgIHByaW50KCJhbGxvd19hbm5vX2tleSAyOiBpIGtleSA9IiwgaV9rZXkpCgogICAgc29tZSBwX2tleSwgXyBpbiBwX29jaS5Bbm5vdGF0aW9ucwogICAgcF9rZXkgPT0gaV9rZXkKCiAgICBwcmludCgiYWxsb3dfYW5ub19rZXkgMjogdHJ1ZSIpCn0KCiMgR2V0IHRoZSB2YWx1ZSBvZiB0aGUgU19OQU1FX0tFWSBhbm5vdGF0aW9uIGFuZAojIGNvcnJlbGF0ZSBpdCB3aXRoIG90aGVyIGFubm90YXRpb25zIGFuZCBwcm9jZXNzIGZpZWxkcy4KYWxsb3dfYnlfYW5ubyhwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpIHsKICAgIHByaW50KCJhbGxvd19ieV9hbm5vIDE6IHN0YXJ0IikKCiAgICBub3QgcF9vY2kuQW5ub3RhdGlvbnNbU19OQU1FX0tFWV0KCiAgICBpX3NfbmFtZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMTogaV9zX25hbWUgPSIsIGlfc19uYW1lKQoKICAgIGlfc19uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FU1BBQ0VfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMTogaV9zX25hbWVzcGFjZSA9IiwgaV9zX25hbWVzcGFjZSkKCiAgICBhbGxvd19ieV9zYW5kYm94X25hbWUocF9vY2ksIGlfb2NpLCBwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBpX3NfbmFtZSwgaV9zX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfYnlfYW5ubyAxOiB0cnVlIikKfQphbGxvd19ieV9hbm5vKHBfb2NpLCBpX29jaSwgcF9zdG9yYWdlcywgaV9zdG9yYWdlcykgewogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMjogc3RhcnQiKQoKICAgIHBfc19uYW1lIDo9IHBfb2NpLkFubm90YXRpb25zW1NfTkFNRV9LRVldCiAgICBpX3NfbmFtZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMjogaV9zX25hbWUgPSIsIGlfc19uYW1lLCAicF9zX25hbWUgPSIsIHBfc19uYW1lKQoKICAgIGFsbG93X3NhbmRib3hfbmFtZShwX3NfbmFtZSwgaV9zX25hbWUpCgogICAgaV9zX25hbWVzcGFjZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwcmludCgiYWxsb3dfYnlfYW5ubyAyOiBpX3NfbmFtZXNwYWNlID0iLCBpX3NfbmFtZXNwYWNlKQoKICAgIGFsbG93X2J5X3NhbmRib3hfbmFtZShwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMsIGlfc19uYW1lLCBpX3NfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd19ieV9hbm5vIDI6IHRydWUiKQp9CgphbGxvd19ieV9zYW5kYm94X25hbWUocF9vY2ksIGlfb2NpLCBwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfYnlfc2FuZGJveF9uYW1lOiBzdGFydCIpCgogICAgaV9uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FU1BBQ0VfS0VZXQoKICAgIGFsbG93X2J5X2NvbnRhaW5lcl90eXBlcyhwX29jaSwgaV9vY2ksIHNfbmFtZSwgaV9uYW1lc3BhY2UpCiAgICBhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZChwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpCiAgICBhbGxvd19wcm9jZXNzKHBfb2NpLlByb2Nlc3MsIGlfb2NpLlByb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpCgogICAgcHJpbnQoImFsbG93X2J5X3NhbmRib3hfbmFtZTogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfbmFtZShwX3NfbmFtZSwgaV9zX25hbWUpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X25hbWU6IHN0YXJ0IikKICAgIHJlZ2V4Lm1hdGNoKHBfc19uYW1lLCBpX3NfbmFtZSkKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9uYW1lOiB0cnVlIikKfQoKIyBDaGVjayB0aGF0IHRoZSAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLXR5cGUiIGFuZAojICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIiBhbm5vdGF0aW9ucyBkZXNpZ25hdGUgdGhlCiMgZXhwZWN0ZWQgdHlwZSAtIGVpdGhlciBhICJzYW5kYm94IiBvciBhICJjb250YWluZXIiLiBUaGVuLCB2YWxpZGF0ZQojIG90aGVyIGFubm90YXRpb25zIGJhc2VkIG9uIHRoZSBhY3R1YWwgInNhbmRib3giIG9yICJjb250YWluZXIiIHZhbHVlCiMgZnJvbSB0aGUgaW5wdXQgY29udGFpbmVyLgphbGxvd19ieV9jb250YWluZXJfdHlwZXMocF9vY2ksIGlfb2NpLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfYnlfY29udGFpbmVyX3R5cGVzOiBjaGVja2luZyBpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSIpCgogICAgY190eXBlIDo9ICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSIKICAgIAogICAgcF9jcmlfdHlwZSA6PSBwX29jaS5Bbm5vdGF0aW9uc1tjX3R5cGVdCiAgICBpX2NyaV90eXBlIDo9IGlfb2NpLkFubm90YXRpb25zW2NfdHlwZV0KICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZXM6IHBfY3JpX3R5cGUgPSIsIHBfY3JpX3R5cGUsICJpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgcF9jcmlfdHlwZSA9PSBpX2NyaV90eXBlCgogICAgYWxsb3dfYnlfY29udGFpbmVyX3R5cGUoaV9jcmlfdHlwZSwgcF9vY2ksIGlfb2NpLCBzX25hbWUsIHNfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZXM6IHRydWUiKQp9CgphbGxvd19ieV9jb250YWluZXJfdHlwZShpX2NyaV90eXBlLCBwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAxOiBpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgaV9jcmlfdHlwZSA9PSAic2FuZGJveCIKCiAgICBpX2thdGFfdHlwZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1siaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5jb250YWluZXJfdHlwZSJdCiAgICBwcmludCgiYWxsb3dfYnlfY29udGFpbmVyX3R5cGUgMTogaV9rYXRhX3R5cGUgPSIsIGlfa2F0YV90eXBlKQogICAgaV9rYXRhX3R5cGUgPT0gInBvZF9zYW5kYm94IgoKICAgIGFsbG93X3NhbmRib3hfY29udGFpbmVyX25hbWUocF9vY2ksIGlfb2NpKQogICAgYWxsb3dfc2FuZGJveF9uZXRfbmFtZXNwYWNlKHBfb2NpLCBpX29jaSkKICAgIGFsbG93X3NhbmRib3hfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpCgogICAgcHJpbnQoImFsbG93X2J5X2NvbnRhaW5lcl90eXBlIDE6IHRydWUiKQp9CgphbGxvd19ieV9jb250YWluZXJfdHlwZShpX2NyaV90eXBlLCBwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiBpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgaV9jcmlfdHlwZSA9PSAiY29udGFpbmVyIgoKICAgIGlfa2F0YV90eXBlIDo9IGlfb2NpLkFubm90YXRpb25zWyJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIl0KICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiBpX2thdGFfdHlwZSA9IiwgaV9rYXRhX3R5cGUpCiAgICBpX2thdGFfdHlwZSA9PSAicG9kX2NvbnRhaW5lciIKCiAgICBhbGxvd19jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpCiAgICBhbGxvd19uZXRfbmFtZXNwYWNlKHBfb2NpLCBpX29jaSkKICAgIGFsbG93X2xvZ19kaXJlY3RvcnkocF9vY2ksIGlfb2NpKQoKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiB0cnVlIikKfQoKIyAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLW5hbWUiIGFubm90YXRpb24KYWxsb3dfc2FuZGJveF9jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X2NvbnRhaW5lcl9uYW1lOiBzdGFydCIpCgogICAgY29udGFpbmVyX2Fubm90YXRpb25fbWlzc2luZyhwX29jaSwgaV9vY2ksICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItbmFtZSIpCgogICAgcHJpbnQoImFsbG93X3NhbmRib3hfY29udGFpbmVyX25hbWU6IHRydWUiKQp9CgphbGxvd19jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19jb250YWluZXJfbmFtZTogc3RhcnQiKQoKICAgIGFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uKHBfb2NpLCBpX29jaSwgImlvLmt1YmVybmV0ZXMuY3JpLmNvbnRhaW5lci1uYW1lIikKCiAgICBwcmludCgiYWxsb3dfY29udGFpbmVyX25hbWU6IHRydWUiKQp9Cgpjb250YWluZXJfYW5ub3RhdGlvbl9taXNzaW5nKHBfb2NpLCBpX29jaSwga2V5KSB7CiAgICBwcmludCgiY29udGFpbmVyX2Fubm90YXRpb25fbWlzc2luZzoiLCBrZXkpCgogICAgbm90IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIG5vdCBpX29jaS5Bbm5vdGF0aW9uc1trZXldCgogICAgcHJpbnQoImNvbnRhaW5lcl9hbm5vdGF0aW9uX21pc3Npbmc6IHRydWUiKQp9CgphbGxvd19jb250YWluZXJfYW5ub3RhdGlvbihwX29jaSwgaV9vY2ksIGtleSkgewogICAgcHJpbnQoImFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uOiBrZXkgPSIsIGtleSkKCiAgICBwX3ZhbHVlIDo9IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIGlfdmFsdWUgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgcHJpbnQoImFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uOiBwX3ZhbHVlID0iLCBwX3ZhbHVlLCAiaV92YWx1ZSA9IiwgaV92YWx1ZSkKCiAgICBwX3ZhbHVlID09IGlfdmFsdWUKCiAgICBwcmludCgiYWxsb3dfY29udGFpbmVyX2Fubm90YXRpb246IHRydWUiKQp9CgojICJuZXJkY3RsL25ldHdvcmstbmFtZXNwYWNlIiBhbm5vdGF0aW9uCmFsbG93X3NhbmRib3hfbmV0X25hbWVzcGFjZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X25ldF9uYW1lc3BhY2U6IHN0YXJ0IikKCiAgICBrZXkgOj0gIm5lcmRjdGwvbmV0d29yay1uYW1lc3BhY2UiCgogICAgcF9uYW1lc3BhY2UgOj0gcF9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgaV9uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgcHJpbnQoImFsbG93X3NhbmRib3hfbmV0X25hbWVzcGFjZTogcF9uYW1lc3BhY2UgPSIsIHBfbmFtZXNwYWNlLCAiaV9uYW1lc3BhY2UgPSIsIGlfbmFtZXNwYWNlKQoKICAgIHJlZ2V4Lm1hdGNoKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9uZXRfbmFtZXNwYWNlOiB0cnVlIikKfQoKYWxsb3dfbmV0X25hbWVzcGFjZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19uZXRfbmFtZXNwYWNlOiBzdGFydCIpCgogICAga2V5IDo9ICJuZXJkY3RsL25ldHdvcmstbmFtZXNwYWNlIgoKICAgIG5vdCBwX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICBub3QgaV9vY2kuQW5ub3RhdGlvbnNba2V5XQoKICAgIHByaW50KCJhbGxvd19uZXRfbmFtZXNwYWNlOiB0cnVlIikKfQoKIyAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1sb2ctZGlyZWN0b3J5IiBhbm5vdGF0aW9uCmFsbG93X3NhbmRib3hfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X2xvZ19kaXJlY3Rvcnk6IHN0YXJ0IikKCiAgICBrZXkgOj0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbG9nLWRpcmVjdG9yeSIKCiAgICBwX2RpciA6PSBwX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICByZWdleDEgOj0gcmVwbGFjZShwX2RpciwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHJlZ2V4MiA6PSByZXBsYWNlKHJlZ2V4MSwgIiQoc2FuZGJveC1uYW1lc3BhY2UpIiwgc19uYW1lc3BhY2UpCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiByZWdleDIgPSIsIHJlZ2V4MikKCiAgICBpX2RpciA6PSBpX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiBpX2RpciA9IiwgaV9kaXIpCgogICAgcmVnZXgubWF0Y2gocmVnZXgyLCBpX2RpcikKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiB0cnVlIikKfQoKYWxsb3dfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19sb2dfZGlyZWN0b3J5OiBzdGFydCIpCgogICAga2V5IDo9ICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWxvZy1kaXJlY3RvcnkiCgogICAgbm90IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIG5vdCBpX29jaS5Bbm5vdGF0aW9uc1trZXldCgogICAgcHJpbnQoImFsbG93X2xvZ19kaXJlY3Rvcnk6IHRydWUiKQp9CgphbGxvd19kZXZpY2VzKHBfZGV2aWNlcywgaV9kZXZpY2VzKSB7CiAgICBwcmludCgiYWxsb3dfZGV2aWNlczogc3RhcnQiKQogICAgZXZlcnkgaV9kZXZpY2UgaW4gaV9kZXZpY2VzIHsKICAgICAgICBwcmludCgiYWxsb3dfZGV2aWNlczogaV9kZXZpY2UgPSIsIGlfZGV2aWNlKQogICAgICAgIHNvbWUgcF9kZXZpY2UgaW4gcF9kZXZpY2VzCiAgICAgICAgcF9kZXZpY2UuY29udGFpbmVyX3BhdGggPT0gaV9kZXZpY2UuY29udGFpbmVyX3BhdGgKICAgIH0KICAgIHByaW50KCJhbGxvd19kZXZpY2VzOiB0cnVlIikKfQoKYWxsb3dfbGludXgoc3RhdGVfb3BzLCBwX29jaSwgaV9vY2kpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIHBfbmFtZXNwYWNlcyA6PSBwX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbGludXg6IHAgbmFtZXNwYWNlcyA9IiwgcF9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlcyA6PSBpX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbGludXg6IGkgbmFtZXNwYWNlcyA9IiwgaV9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlX3dpdGhvdXRfbmV0d29yayA6PSBbb2JqIHwgb2JqIDo9IGlfbmFtZXNwYWNlc1tfXTsgb2JqLlR5cGUgIT0gIm5ldHdvcmsiXQoKICAgIHByaW50KCJhbGxvd19saW51eDogaV9uYW1lc3BhY2Vfd2l0aG91dF9uZXR3b3JrID0iLCBpX25hbWVzcGFjZV93aXRob3V0X25ldHdvcmspCgogICAgcF9uYW1lc3BhY2VzID09IGlfbmFtZXNwYWNlX3dpdGhvdXRfbmV0d29yawoKICAgIGFsbG93X21hc2tlZF9wYXRocyhwX29jaSwgaV9vY2kpCiAgICBhbGxvd19yZWFkb25seV9wYXRocyhwX29jaSwgaV9vY2kpCiAgICBhbGxvd19saW51eF9kZXZpY2VzKHBfb2NpLkxpbnV4LkRldmljZXMsIGlfb2NpLkxpbnV4LkRldmljZXMpCiAgICBhbGxvd19saW51eF9zeXNjdGwocF9vY2kuTGludXgsIGlfb2NpLkxpbnV4KQogICAgcmV0IDo9IGFsbG93X25ldHdvcmtfbmFtZXNwYWNlX3N0YXJ0KHN0YXRlX29wcywgcF9vY2ksIGlfb2NpKQogICAgcmV0LmFsbG93ZWQKCiAgICBvcHMgOj0gcmV0Lm9wcwoKICAgIHByaW50KCJhbGxvd19saW51eDogdHJ1ZSIpCn0KCiMgUmV0cmlldmUgdGhlICJuZXR3b3JrIiBuYW1lc3BhY2UgZnJvbSB0aGUgaW5wdXQgZGF0YSBhbmQgcGFzcyBpdCBvbiBmb3IgdGhlCiMgbmV0d29yayBuYW1lc3BhY2UgcG9saWN5IGNoZWNrcy4KYWxsb3dfbmV0d29ya19uYW1lc3BhY2Vfc3RhcnQoc3RhdGVfb3BzLCBwX29jaSwgaV9vY2kpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIHByaW50KCJhbGxvd19uZXR3b3JrX25hbWVzcGFjZSBzdGFydDogc3RhcnQiKQoKICAgIHBfbmFtZXNwYWNlcyA6PSBwX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IHAgbmFtZXNwYWNlcyA9IiwgcF9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlcyA6PSBpX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IGkgbmFtZXNwYWNlcyA9IiwgaV9uYW1lc3BhY2VzKQoKICAgICMgUmV0dXJuIHBhdGggb2YgdGhlICJuZXR3b3JrIiBuYW1lc3BhY2UKICAgIG5ldHdvcmtfbnMgOj0gW29iaiB8IG9iaiA6PSBpX25hbWVzcGFjZXNbX107IG9iai5UeXBlID09ICJuZXR3b3JrIl0KCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IG5ldHdvcmtfbnMgPSIsIG5ldHdvcmtfbnMpCgogICAgcmV0IDo9IGFsbG93X25ldHdvcmtfbmFtZXNwYWNlKHN0YXRlX29wcywgbmV0d29ya19ucykKICAgIHJldC5hbGxvd2VkCgogICAgb3BzIDo9IHJldC5vcHMKfQoKIyBUaGlzIHJ1bGUgaXMgd2hlbiB0aGVyZSdzIG5vIG5ldHdvcmsgbmFtZXNwYWNlIGluIHRoZSBpbnB1dCBkYXRhLgphbGxvd19uZXR3b3JrX25hbWVzcGFjZShzdGF0ZV9vcHMsIG5ldHdvcmtfbnMpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIGNvdW50KG5ldHdvcmtfbnMpID09IDAKCiAgICBuZXR3b3JrX25zX3BhdGggPSAiIgoKICAgIGFkZF9uZXR3b3JrX25hbWVzcGFjZV90b19zdGF0ZSA6PSBzdGF0ZV9hbGxvd3MoIm5ldHdvcmtfbmFtZXNwYWNlIiwgbmV0d29ya19uc19wYXRoKQogICAgb3BzIDo9IGNvbmNhdF9vcF9pZl9ub3RfbnVsbChzdGF0ZV9vcHMsIGFkZF9uZXR3b3JrX25hbWVzcGFjZV90b19zdGF0ZSkKCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2UgMTogdHJ1ZSIpCn0KCiMgVGhpcyBydWxlIGlzIHdoZW4gdGhlcmUncyBleGFjdGx5IG9uZSBuZXR3b3JrIG5hbWVzcGFjZSBpbiB0aGUgaW5wdXQgZGF0YS4KYWxsb3dfbmV0d29ya19uYW1lc3BhY2Uoc3RhdGVfb3BzLCBuZXR3b3JrX25zKSA6PSB7Im9wcyI6IG9wcywgImFsbG93ZWQiOiB0cnVlfSB7CiAgICBjb3VudChuZXR3b3JrX25zKSA9PSAxCgogICAgYWRkX25ldHdvcmtfbmFtZXNwYWNlX3RvX3N0YXRlIDo9IHN0YXRlX2FsbG93cygibmV0d29ya19uYW1lc3BhY2UiLCBuZXR3b3JrX25zWzBdLlBhdGgpCiAgICBvcHMgOj0gY29uY2F0X29wX2lmX25vdF9udWxsKHN0YXRlX29wcywgYWRkX25ldHdvcmtfbmFtZXNwYWNlX3RvX3N0YXRlKQoKICAgIHByaW50KCJhbGxvd19uZXR3b3JrX25hbWVzcGFjZSAyOiB0cnVlIikKfQoKYWxsb3dfbWFza2VkX3BhdGhzKHBfb2NpLCBpX29jaSkgewogICAgcF9wYXRocyA6PSBwX29jaS5MaW51eC5NYXNrZWRQYXRocwogICAgcHJpbnQoImFsbG93X21hc2tlZF9wYXRocyAxOiBwX3BhdGhzID0iLCBwX3BhdGhzKQoKICAgIGlfcGF0aHMgOj0gaV9vY2kuTGludXguTWFza2VkUGF0aHMKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aHMgMTogaV9wYXRocyA9IiwgaV9wYXRocykKCiAgICBhbGxvd19tYXNrZWRfcGF0aHNfYXJyYXkocF9wYXRocywgaV9wYXRocykKCiAgICBwcmludCgiYWxsb3dfbWFza2VkX3BhdGhzIDE6IHRydWUiKQp9CmFsbG93X21hc2tlZF9wYXRocyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aHMgMjogc3RhcnQiKQoKICAgIG5vdCBwX29jaS5MaW51eC5NYXNrZWRQYXRocwogICAgbm90IGlfb2NpLkxpbnV4Lk1hc2tlZFBhdGhzCgogICAgcHJpbnQoImFsbG93X21hc2tlZF9wYXRocyAyOiB0cnVlIikKfQoKIyBBbGwgdGhlIHBvbGljeSBtYXNrZWQgcGF0aHMgbXVzdCBiZSBtYXNrZWQgaW4gdGhlIGlucHV0IGRhdGEgdG9vLgojIElucHV0IGlzIGFsbG93ZWQgdG8gaGF2ZSBtb3JlIG1hc2tlZCBwYXRocyB0aGFuIHRoZSBwb2xpY3kuCmFsbG93X21hc2tlZF9wYXRoc19hcnJheShwX2FycmF5LCBpX2FycmF5KSB7CiAgICBldmVyeSBwX2VsZW0gaW4gcF9hcnJheSB7CiAgICAgICAgYWxsb3dfbWFza2VkX3BhdGgocF9lbGVtLCBpX2FycmF5KQogICAgfQp9CgphbGxvd19tYXNrZWRfcGF0aChwX2VsZW0sIGlfYXJyYXkpIHsKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aDogcF9lbGVtID0iLCBwX2VsZW0pCgogICAgc29tZSBpX2VsZW0gaW4gaV9hcnJheQogICAgcF9lbGVtID09IGlfZWxlbQoKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aDogdHJ1ZSIpCn0KCmFsbG93X3JlYWRvbmx5X3BhdGhzKHBfb2NpLCBpX29jaSkgewogICAgcF9wYXRocyA6PSBwX29jaS5MaW51eC5SZWFkb25seVBhdGhzCiAgICBwcmludCgiYWxsb3dfcmVhZG9ubHlfcGF0aHMgMTogcF9wYXRocyA9IiwgcF9wYXRocykKCiAgICBpX3BhdGhzIDo9IGlfb2NpLkxpbnV4LlJlYWRvbmx5UGF0aHMKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAxOiBpX3BhdGhzID0iLCBpX3BhdGhzKQoKICAgIGFsbG93X3JlYWRvbmx5X3BhdGhzX2FycmF5KHBfcGF0aHMsIGlfcGF0aHMsIGlfb2NpLkxpbnV4Lk1hc2tlZFBhdGhzKQoKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAxOiB0cnVlIikKfQphbGxvd19yZWFkb25seV9wYXRocyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAyOiBzdGFydCIpCgogICAgbm90IHBfb2NpLkxpbnV4LlJlYWRvbmx5UGF0aHMKICAgIG5vdCBpX29jaS5MaW51eC5SZWFkb25seVBhdGhzCgogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGhzIDI6IHRydWUiKQp9CgojIEFsbCB0aGUgcG9saWN5IHJlYWRvbmx5IHBhdGhzIG11c3QgYmUgZWl0aGVyOgojIC0gUHJlc2VudCBpbiB0aGUgaW5wdXQgcmVhZG9ubHkgcGF0aHMsIG9yCiMgLSBQcmVzZW50IGluIHRoZSBpbnB1dCBtYXNrZWQgcGF0aHMuCiMgSW5wdXQgaXMgYWxsb3dlZCB0byBoYXZlIG1vcmUgcmVhZG9ubHkgcGF0aHMgdGhhbiB0aGUgcG9saWN5LgphbGxvd19yZWFkb25seV9wYXRoc19hcnJheShwX2FycmF5LCBpX2FycmF5LCBtYXNrZWRfcGF0aHMpIHsKICAgIGV2ZXJ5IHBfZWxlbSBpbiBwX2FycmF5IHsKICAgICAgICBhbGxvd19yZWFkb25seV9wYXRoKHBfZWxlbSwgaV9hcnJheSwgbWFza2VkX3BhdGhzKQogICAgfQp9CgphbGxvd19yZWFkb25seV9wYXRoKHBfZWxlbSwgaV9hcnJheSwgbWFza2VkX3BhdGhzKSB7CiAgICBwcmludCgiYWxsb3dfcmVhZG9ubHlfcGF0aCAxOiBwX2VsZW0gPSIsIHBfZWxlbSkKCiAgICBzb21lIGlfZWxlbSBpbiBpX2FycmF5CiAgICBwX2VsZW0gPT0gaV9lbGVtCgogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGggMTogdHJ1ZSIpCn0KYWxsb3dfcmVhZG9ubHlfcGF0aChwX2VsZW0sIGlfYXJyYXksIG1hc2tlZF9wYXRocykgewogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGggMjogcF9lbGVtID0iLCBwX2VsZW0pCgogICAgc29tZSBpX21hc2tlZCBpbiBtYXNrZWRfcGF0aHMKICAgIHBfZWxlbSA9PSBpX21hc2tlZAoKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRoIDI6IHRydWUiKQp9CgphbGxvd19saW51eF9kZXZpY2VzKHBfZGV2aWNlcywgaV9kZXZpY2VzKSB7CiAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogc3RhcnQiKQogICAgZXZlcnkgaV9kZXZpY2UgaW4gaV9kZXZpY2VzIHsKICAgICAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogaV9kZXZpY2UgPSIsIGlfZGV2aWNlKQogICAgICAgIHNvbWUgcF9kZXZpY2UgaW4gcF9kZXZpY2VzCiAgICAgICAgaV9kZXZpY2UuUGF0aCA9PSBwX2RldmljZS5QYXRoCiAgICB9CiAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogdHJ1ZSIpCn0KCmFsbG93X2xpbnV4X3N5c2N0bChwX2xpbnV4LCBpX2xpbnV4KSB7CiAgICBwcmludCgiYWxsb3dfbGludXhfc3lzY3RsIDE6IHN0YXJ0IikKICAgIG5vdCBpX2xpbnV4LlN5c2N0bAogICAgcHJpbnQoImFsbG93X2xpbnV4X3N5c2N0bCAxOiB0cnVlIikKfQoKYWxsb3dfbGludXhfc3lzY3RsKHBfbGludXgsIGlfbGludXgpIHsKICAgIHByaW50KCJhbGxvd19saW51eF9zeXNjdGwgMjogc3RhcnQiKQogICAgcF9zeXNjdGwgOj0gcF9saW51eC5TeXNjdGwKICAgIGlfc3lzY3RsIDo9IGlfbGludXguU3lzY3RsCiAgICBldmVyeSBpX25hbWUsIGlfdmFsIGluIGlfc3lzY3RsIHsKICAgICAgICBwcmludCgiYWxsb3dfbGludXhfc3lzY3RsIDI6IGlfbmFtZSA9IiwgaV9uYW1lLCAiaV92YWwgPSIsIGlfdmFsKQogICAgICAgIHBfc3lzY3RsW2lfbmFtZV0gPT0gaV92YWwKICAgIH0KICAgIHByaW50KCJhbGxvd19saW51eF9zeXNjdGwgMjogdHJ1ZSIpCn0KCiMgQ2hlY2sgdGhlIGNvbnNpc3RlbmN5IG9mIHRoZSBpbnB1dCAiaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5idW5kbGVfcGF0aCIKIyBhbmQgaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCIgdmFsdWVzIHdpdGggb3RoZXIgZmllbGRzLgphbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZChwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpIHsKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogc3RhcnQiKQoKICAgIGJ1bmRsZV9wYXRoIDo9IGlfb2NpLkFubm90YXRpb25zWyJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmJ1bmRsZV9wYXRoIl0KICAgIGJ1bmRsZV9pZCA6PSByZXBsYWNlKGJ1bmRsZV9wYXRoLCAiL3J1bi9jb250YWluZXJkL2lvLmNvbnRhaW5lcmQucnVudGltZS52Mi50YXNrL2s4cy5pby8iLCAiIikKCiAgICBidW5kbGVfaWRfZm9ybWF0IDo9IGNvbmNhdCgiIiwgWyJeIiwgQlVORExFX0lELCAiJCJdKQogICAgcmVnZXgubWF0Y2goYnVuZGxlX2lkX2Zvcm1hdCwgYnVuZGxlX2lkKQoKICAgIGtleSA6PSAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCIKCiAgICBwX3JlZ2V4IDo9IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIHNhbmRib3hfaWQgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQoKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogc2FuZGJveF9pZCA9Iiwgc2FuZGJveF9pZCwgInJlZ2V4ID0iLCBwX3JlZ2V4KQogICAgcmVnZXgubWF0Y2gocF9yZWdleCwgc2FuZGJveF9pZCkKCiAgICBhbGxvd19yb290X3BhdGgocF9vY2ksIGlfb2NpLCBidW5kbGVfaWQpCgogICAgZXZlcnkgaV9tb3VudCBpbiBpX29jaS5Nb3VudHMgewogICAgICAgIGFsbG93X21vdW50KHBfb2NpLCBpX21vdW50LCBpX3N0b3JhZ2VzLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpCiAgICB9CgogICAgYWxsb3dfc3RvcmFnZXMocF9zdG9yYWdlcywgaV9zdG9yYWdlcywgYnVuZGxlX2lkLCBzYW5kYm94X2lkKQoKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogdHJ1ZSIpCn0KCmFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHBfcHJvY2VzcyA9IiwgcF9wcm9jZXNzKQogICAgcHJpbnQoImFsbG93X3Byb2Nlc3NfY29tbW9uOiBpX3Byb2Nlc3MgPSAiLCBpX3Byb2Nlc3MpCiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHNfbmFtZSA9Iiwgc19uYW1lKQoKICAgIHBfcHJvY2Vzcy5Dd2QgPT0gaV9wcm9jZXNzLkN3ZAogICAgcF9wcm9jZXNzLk5vTmV3UHJpdmlsZWdlcyA9PSBpX3Byb2Nlc3MuTm9OZXdQcml2aWxlZ2VzCgogICAgYWxsb3dfdXNlcihwX3Byb2Nlc3MsIGlfcHJvY2VzcykKICAgIGFsbG93X2VudihwX3Byb2Nlc3MsIGlfcHJvY2Vzcywgc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHRydWUiKQp9CgojIENvbXBhcmUgdGhlIE9DSSBQcm9jZXNzIGZpZWxkIG9mIGEgcG9saWN5IGNvbnRhaW5lciB3aXRoIHRoZSBpbnB1dCBPQ0kgUHJvY2VzcyBmcm9tIGEgQ3JlYXRlQ29udGFpbmVyUmVxdWVzdAphbGxvd19wcm9jZXNzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfcHJvY2Vzczogc3RhcnQiKQoKICAgIGFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgYWxsb3dfY2FwcyhwX3Byb2Nlc3MuQ2FwYWJpbGl0aWVzLCBpX3Byb2Nlc3MuQ2FwYWJpbGl0aWVzKQogICAgcF9wcm9jZXNzLlRlcm1pbmFsID09IGlfcHJvY2Vzcy5UZXJtaW5hbAoKICAgIHByaW50KCJhbGxvd19wcm9jZXNzOiB0cnVlIikKfQoKIyBDb21wYXJlIHRoZSBPQ0kgUHJvY2VzcyBmaWVsZCBvZiBhIHBvbGljeSBjb250YWluZXIgd2l0aCB0aGUgaW5wdXQgcHJvY2VzcyBmaWVsZCBmcm9tIEV4ZWNQcm9jZXNzUmVxdWVzdAphbGxvd19pbnRlcmFjdGl2ZV9wcm9jZXNzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfaW50ZXJhY3RpdmVfcHJvY2Vzczogc3RhcnQiKQoKICAgIGFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgYWxsb3dfZXhlY19jYXBzKGlfcHJvY2Vzcy5DYXBhYmlsaXRpZXMpCgogICAgIyBUaGVzZSBhcmUgY29tbWFuZHMgZW5hYmxlZCB1c2luZyBFeGVjUHJvY2Vzc1JlcXVlc3QgY29tbWFuZHMgYW5kL29yIHJlZ2V4IGZyb20gdGhlIHNldHRpbmdzIGZpbGUuCiAgICAjIFRoZXkgY2FuIGJlIGV4ZWN1dGVkIGludGVyYWN0aXZlbHkgc28gYWxsb3cgdGhlbSB0byB1c2UgYW55IHZhbHVlIGZvciBpX3Byb2Nlc3MuVGVybWluYWwuCgogICAgcHJpbnQoImFsbG93X2ludGVyYWN0aXZlX3Byb2Nlc3M6IHRydWUiKQp9CgojIENvbXBhcmUgdGhlIE9DSSBQcm9jZXNzIGZpZWxkIG9mIGEgcG9saWN5IGNvbnRhaW5lciB3aXRoIHRoZSBpbnB1dCBwcm9jZXNzIGZpZWxkIGZyb20gRXhlY1Byb2Nlc3NSZXF1ZXN0CmFsbG93X3Byb2JlX3Byb2Nlc3MocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19wcm9iZV9wcm9jZXNzOiBzdGFydCIpCgogICAgYWxsb3dfcHJvY2Vzc19jb21tb24ocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpCiAgICBhbGxvd19leGVjX2NhcHMoaV9wcm9jZXNzLkNhcGFiaWxpdGllcykKICAgIHBfcHJvY2Vzcy5UZXJtaW5hbCA9PSBpX3Byb2Nlc3MuVGVybWluYWwKCiAgICBwcmludCgiYWxsb3dfcHJvYmVfcHJvY2VzczogdHJ1ZSIpCn0KCmFsbG93X3VzZXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MpIHsKICAgIHBfdXNlciA6PSBwX3Byb2Nlc3MuVXNlcgogICAgaV91c2VyIDo9IGlfcHJvY2Vzcy5Vc2VyCgogICAgcHJpbnQoImFsbG93X3VzZXI6IGlucHV0IHVpZCA9IiwgaV91c2VyLlVJRCwgInBvbGljeSB1aWQgPSIsIHBfdXNlci5VSUQpCiAgICBwX3VzZXIuVUlEID09IGlfdXNlci5VSUQKCiAgICAjIFRPRE86IHRyYWNrIGRvd24gdGhlIHJlYXNvbiBmb3IgcmVnaXN0cnkuazhzLmlvL3BhdXNlOjMuOSBiZWluZwogICAgIyAgICAgICBleGVjdXRlZCB3aXRoIGdpZCA9IDAgZGVzcGl0ZSBoYXZpbmcgIjY1NTM1OjY1NTM1IiBpbiBpdHMgY29udGFpbmVyIGltYWdlCiAgICAjICAgICAgIGNvbmZpZy4KICAgICNwcmludCgiYWxsb3dfdXNlcjogaW5wdXQgZ2lkID0iLCBpX3VzZXIuR0lELCAicG9saWN5IGdpZCA9IiwgcF91c2VyLkdJRCkKICAgICNwX3VzZXIuR0lEID09IGlfdXNlci5HSUQKCiAgICAjIFRPRE86IGNvbXBhcmUgdGhlIGFkZGl0aW9uYWxHaWRzIGZpZWxkIHRvbyBhZnRlciBjb21wdXRpbmcgaXRzIHZhbHVlCiAgICAjIGJhc2VkIG9uIC9ldGMvcGFzc3dkIGFuZCAvZXRjL2dyb3VwIGZyb20gdGhlIGNvbnRhaW5lciBpbWFnZS4KfQoKYWxsb3dfZGVwcmVjYXRlZF9hcmdzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZ3MgMTogbm8gYXJncyIpCgogICAgbm90IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJncwogICAgbm90IGlfcHJvY2Vzcy5BcmdzCgogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAxOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZ3MocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSkgewogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiBwb2xpY3kgYXJncyA9IiwgcF9wcm9jZXNzLkRlcHJlY2F0ZWRBcmdzKQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiBpbnB1dCBhcmdzID0iLCBpX3Byb2Nlc3MuQXJncykKCiAgICBjb3VudChwX3Byb2Nlc3MuRGVwcmVjYXRlZEFyZ3MpID09IGNvdW50KGlfcHJvY2Vzcy5BcmdzKQoKICAgIGV2ZXJ5IGksIGlfYXJnIGluIGlfcHJvY2Vzcy5BcmdzIHsKICAgICAgICBhbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpCiAgICB9CgogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDE6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgcF9hcmcyIDo9IHJlcGxhY2UocF9hcmcsICIkJCIsICIkIikKICAgIHBfYXJnMiA9PSBpX2FyZwoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAxOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDI6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgIyBUT0RPOiBjYW4gJChub2RlLW5hbWUpIGJlIGhhbmRsZWQgYmV0dGVyPwogICAgY29udGFpbnMocF9hcmcsICIkKG5vZGUtbmFtZSkiKQoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAyOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDM6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgcF9hcmcyIDo9IHJlcGxhY2UocF9hcmcsICIkJCIsICIkIikKICAgIHBfYXJnMyA6PSByZXBsYWNlKHBfYXJnMiwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAzOiBwX2FyZzMgPSIsIHBfYXJnMykKICAgIHBfYXJnMyA9PSBpX2FyZwoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAzOiB0cnVlIikKfQoKIyBPQ0kgcHJvY2Vzcy5FbnYgZmllbGQKYWxsb3dfZW52KHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfZW52OiBwIGVudiA9IiwgcF9wcm9jZXNzLkVudikKICAgIHByaW50KCJhbGxvd19lbnY6IGkgZW52ID0iLCBpX3Byb2Nlc3MuRW52KQoKICAgIGV2ZXJ5IGlfdmFyIGluIGlfcHJvY2Vzcy5FbnYgewogICAgICAgIHByaW50KCJhbGxvd19lbnY6IGlfdmFyID0iLCBpX3ZhcikKICAgICAgICBhbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgfQoKICAgIHByaW50KCJhbGxvd19lbnY6IHRydWUiKQp9CgojIEFsbG93IGlucHV0IGVudiB2YXJpYWJsZXMgdGhhdCBhcmUgcHJlc2VudCBpbiB0aGUgcG9saWN5IGRhdGEgdG9vLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHBfdmFyID09IGlfdmFyCiAgICBwcmludCgiYWxsb3dfdmFyIDE6IHRydWUiKQp9CgojIE1hdGNoIGlucHV0IHdpdGggb25lIG9mIHRoZSBwb2xpY3kgdmFyaWFibGVzLCBhZnRlciBzdWJzdGl0dXRpbmcgJChzYW5kYm94LW5hbWUpLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHByaW50KCJhbGxvd192YXIgMjogcF92YXIgPSIsIHBfdmFyKQoKICAgIHBfdmFyX3NwbGl0IDo9IHNwbGl0KHBfdmFyLCAiPSIpCiAgICBjb3VudChwX3Zhcl9zcGxpdCkgPT0gMgoKICAgIHBfdmFyX3NwbGl0WzFdID09ICIkKHNhbmRib3gtbmFtZSkiCgogICAgaV92YXJfc3BsaXQgOj0gc3BsaXQoaV92YXIsICI9IikKICAgIGNvdW50KGlfdmFyX3NwbGl0KSA9PSAyCgogICAgaV92YXJfc3BsaXRbMF0gPT0gcF92YXJfc3BsaXRbMF0KICAgIHJlZ2V4Lm1hdGNoKHNfbmFtZSwgaV92YXJfc3BsaXRbMV0pCgogICAgcHJpbnQoImFsbG93X3ZhciAyOiB0cnVlIikKfQoKIyBBbGxvdyBpbnB1dCBlbnYgdmFyaWFibGVzIHRoYXQgbWF0Y2ggd2l0aCBhIHJlcXVlc3RfZGVmYXVsdHMgcmVnZXguCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHNvbWUgcF9yZWdleDEgaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5DcmVhdGVDb250YWluZXJSZXF1ZXN0LmFsbG93X2Vudl9yZWdleAogICAgcF9yZWdleDIgOj0gcmVwbGFjZShwX3JlZ2V4MSwgIiQoaXB2NF9hKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcHY0X2EpCiAgICBwX3JlZ2V4MyA6PSByZXBsYWNlKHBfcmVnZXgyLCAiJChpcF9wKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcF9wKQogICAgcF9yZWdleDQgOj0gcmVwbGFjZShwX3JlZ2V4MywgIiQoc3ZjX25hbWUpIiwgcG9saWN5X2RhdGEuY29tbW9uLnN2Y19uYW1lKQogICAgcF9yZWdleDUgOj0gcmVwbGFjZShwX3JlZ2V4NCwgIiQoZG5zX2xhYmVsKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5kbnNfbGFiZWwpCgogICAgcHJpbnQoImFsbG93X3ZhciAzOiBwX3JlZ2V4NSA9IiwgcF9yZWdleDUpCiAgICByZWdleC5tYXRjaChwX3JlZ2V4NSwgaV92YXIpCgogICAgcHJpbnQoImFsbG93X3ZhciAzOiB0cnVlIikKfQoKIyBBbGxvdyBmaWVsZFJlZiAiZmllbGRQYXRoOiBzdGF0dXMucG9kSVAiIHZhbHVlcy4KYWxsb3dfdmFyKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBpX3Zhciwgc19uYW1lLCBzX25hbWVzcGFjZSkgewogICAgbmFtZV92YWx1ZSA6PSBzcGxpdChpX3ZhciwgIj0iKQogICAgY291bnQobmFtZV92YWx1ZSkgPT0gMgogICAgaXNfaXAobmFtZV92YWx1ZVsxXSkKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIGFsbG93X3BvZF9pcF92YXIobmFtZV92YWx1ZVswXSwgcF92YXIpCgogICAgcHJpbnQoImFsbG93X3ZhciA0OiB0cnVlIikKfQoKIyBBbGxvdyBjb21tb24gZmllbGRSZWYgdmFyaWFibGVzLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBuYW1lX3ZhbHVlIDo9IHNwbGl0KGlfdmFyLCAiPSIpCiAgICBjb3VudChuYW1lX3ZhbHVlKSA9PSAyCgogICAgc29tZSBwX3ZhciBpbiBwX3Byb2Nlc3MuRW52CiAgICBwX25hbWVfdmFsdWUgOj0gc3BsaXQocF92YXIsICI9IikKICAgIGNvdW50KHBfbmFtZV92YWx1ZSkgPT0gMgoKICAgIHBfbmFtZV92YWx1ZVswXSA9PSBuYW1lX3ZhbHVlWzBdCgogICAgIyBUT0RPOiBzaG91bGQgdGhlc2UgYmUgaGFuZGxlZCBpbiBhIGRpZmZlcmVudCB3YXk/CiAgICBhbHdheXNfYWxsb3dlZCA6PSBbIiQoaG9zdC1uYW1lKSIsICIkKG5vZGUtbmFtZSkiLCAiJChwb2QtdWlkKSJdCiAgICBzb21lIGFsbG93ZWQgaW4gYWx3YXlzX2FsbG93ZWQKICAgIGNvbnRhaW5zKHBfbmFtZV92YWx1ZVsxXSwgYWxsb3dlZCkKCiAgICBwcmludCgiYWxsb3dfdmFyIDU6IHRydWUiKQp9CgojIEFsbG93IGZpZWxkUmVmICJmaWVsZFBhdGg6IHN0YXR1cy5ob3N0SVAiIHZhbHVlcy4KYWxsb3dfdmFyKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBpX3Zhciwgc19uYW1lLCBzX25hbWVzcGFjZSkgewogICAgbmFtZV92YWx1ZSA6PSBzcGxpdChpX3ZhciwgIj0iKQogICAgY291bnQobmFtZV92YWx1ZSkgPT0gMgogICAgaXNfaXAobmFtZV92YWx1ZVsxXSkKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIGFsbG93X2hvc3RfaXBfdmFyKG5hbWVfdmFsdWVbMF0sIHBfdmFyKQoKICAgIHByaW50KCJhbGxvd192YXIgNjogdHJ1ZSIpCn0KCiMgQWxsb3cgcmVzb3VyY2VGaWVsZFJlZiB2YWx1ZXMgKGUuZy4sICJsaW1pdHMuY3B1IikuCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIG5hbWVfdmFsdWUgOj0gc3BsaXQoaV92YXIsICI9IikKICAgIGNvdW50KG5hbWVfdmFsdWUpID09IDIKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHBfbmFtZV92YWx1ZSA6PSBzcGxpdChwX3ZhciwgIj0iKQogICAgY291bnQocF9uYW1lX3ZhbHVlKSA9PSAyCgogICAgcF9uYW1lX3ZhbHVlWzBdID09IG5hbWVfdmFsdWVbMF0KCiAgICAjIGEgdmFyaWFibGUgd2Ugc2hvdWxkIGJlIHZhbGlkYXRpbmcgdXNpbmcgYSByZWdleCBmcm9tIHNldHRpbmdzCiAgICBwX25hbWVfdmFsdWVbMV0gPT0gIiQodmFsaWRhdGUtZnJvbS1zZXR0aW5ncykiCgogICAgcmVnZXhfdmFsIDo9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuQ3JlYXRlQ29udGFpbmVyUmVxdWVzdC5hbGxvd19lbnZfcmVnZXhfbWFwW25hbWVfdmFsdWVbMF1dCgogICAgcHJpbnQoImFsbG93X3ZhciA3OiB2YWwgPSIsIG5hbWVfdmFsdWVbMV0pCiAgICBwcmludCgiYWxsb3dfdmFyIDc6IHJlZ2V4X3ZhbCA9IiwgcmVnZXhfdmFsKQoKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4X3ZhbCwgbmFtZV92YWx1ZVsxXSkKCiAgICBwcmludCgiYWxsb3dfdmFyIDc6IHRydWUiKQp9CgojIE1hdGNoIGlucHV0IHdpdGggb25lIG9mIHRoZSBwb2xpY3kgdmFyaWFibGVzLCBhZnRlciBzdWJzdGl0dXRpbmcgJChzYW5kYm94LW5hbWVzcGFjZSkuCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHNvbWUgcF92YXIgaW4gcF9wcm9jZXNzLkVudgogICAgcF92YXIyIDo9IHJlcGxhY2UocF92YXIsICIkKHNhbmRib3gtbmFtZXNwYWNlKSIsIHNfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd192YXIgODogcF92YXIyID0iLCBwX3ZhcjIpCiAgICBwX3ZhcjIgPT0gaV92YXIKCiAgICBwcmludCgiYWxsb3dfdmFyIDg6IHRydWUiKQp9CgphbGxvd19wb2RfaXBfdmFyKHZhcl9uYW1lLCBwX3ZhcikgewogICAgcHJpbnQoImFsbG93X3BvZF9pcF92YXI6IHZhcl9uYW1lID0iLCB2YXJfbmFtZSwgInBfdmFyID0iLCBwX3ZhcikKCiAgICBwX25hbWVfdmFsdWUgOj0gc3BsaXQocF92YXIsICI9IikKICAgIGNvdW50KHBfbmFtZV92YWx1ZSkgPT0gMgoKICAgIHBfbmFtZV92YWx1ZVswXSA9PSB2YXJfbmFtZQogICAgcF9uYW1lX3ZhbHVlWzFdID09ICIkKHBvZC1pcCkiCgogICAgcHJpbnQoImFsbG93X3BvZF9pcF92YXI6IHRydWUiKQp9CgphbGxvd19ob3N0X2lwX3Zhcih2YXJfbmFtZSwgcF92YXIpIHsKICAgIHByaW50KCJhbGxvd19ob3N0X2lwX3ZhcjogdmFyX25hbWUgPSIsIHZhcl9uYW1lLCAicF92YXIgPSIsIHBfdmFyKQoKICAgIHBfbmFtZV92YWx1ZSA6PSBzcGxpdChwX3ZhciwgIj0iKQogICAgY291bnQocF9uYW1lX3ZhbHVlKSA9PSAyCgogICAgcF9uYW1lX3ZhbHVlWzBdID09IHZhcl9uYW1lCiAgICBwX25hbWVfdmFsdWVbMV0gPT0gIiQoaG9zdC1pcCkiCgogICAgcHJpbnQoImFsbG93X2hvc3RfaXBfdmFyOiB0cnVlIikKfQoKaXNfaXAodmFsdWUpIHsKICAgIGJ5dGVzID0gc3BsaXQodmFsdWUsICIuIikKICAgIGNvdW50KGJ5dGVzKSA9PSA0CgogICAgaXNfaXBfZmlyc3RfYnl0ZShieXRlc1swXSkKICAgIGlzX2lwX290aGVyX2J5dGUoYnl0ZXNbMV0pCiAgICBpc19pcF9vdGhlcl9ieXRlKGJ5dGVzWzJdKQogICAgaXNfaXBfb3RoZXJfYnl0ZShieXRlc1szXSkKfQppc19pcF9maXJzdF9ieXRlKGNvbXBvbmVudCkgewogICAgbnVtYmVyID0gdG9fbnVtYmVyKGNvbXBvbmVudCkKICAgIG51bWJlciA+PSAxCiAgICBudW1iZXIgPD0gMjU1Cn0KaXNfaXBfb3RoZXJfYnl0ZShjb21wb25lbnQpIHsKICAgIG51bWJlciA9IHRvX251bWJlcihjb21wb25lbnQpCiAgICBudW1iZXIgPj0gMAogICAgbnVtYmVyIDw9IDI1NQp9CgojIE9DSSByb290LlBhdGgKYWxsb3dfcm9vdF9wYXRoKHBfb2NpLCBpX29jaSwgYnVuZGxlX2lkKSB7CiAgICBpX3BhdGggOj0gaV9vY2kuUm9vdC5QYXRoCiAgICBwX3BhdGgxIDo9IHBfb2NpLlJvb3QuUGF0aAogICAgcHJpbnQoImFsbG93X3Jvb3RfcGF0aDogaV9wYXRoID0iLCBpX3BhdGgsICJwX3BhdGgxID0iLCBwX3BhdGgxKQoKICAgIHBfcGF0aDIgOj0gcmVwbGFjZShwX3BhdGgxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfcm9vdF9wYXRoOiBwX3BhdGgyID0iLCBwX3BhdGgyKQoKICAgIHBfcGF0aDMgOj0gcmVwbGFjZShwX3BhdGgyLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X3Jvb3RfcGF0aDogcF9wYXRoMyA9IiwgcF9wYXRoMykKCiAgICBwX3BhdGgzID09IGlfcGF0aAoKICAgIHByaW50KCJhbGxvd19yb290X3BhdGg6IHRydWUiKQp9CgojIGRldmljZSBtb3VudHMKYWxsb3dfbW91bnQocF9vY2ksIGlfbW91bnQsIGlfc3RvcmFnZXMsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcHJpbnQoImFsbG93X21vdW50OiBpX21vdW50ID0iLCBpX21vdW50KQoKICAgIHNvbWUgcF9tb3VudCBpbiBwX29jaS5Nb3VudHMKICAgIHNvbWUgaV9zdG9yYWdlIGluIGlfc3RvcmFnZXMKCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IHBfbW91bnQgPSIsIHBfbW91bnQpCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IGlfc3RvcmFnZSA9IiwgaV9zdG9yYWdlKQoKICAgIGNoZWNrX21vdW50KHBfbW91bnQsIGlfbW91bnQsIGlfc3RvcmFnZSwgYnVuZGxlX2lkLCBzYW5kYm94X2lkKQoKICAgICMgVE9ETzogYXJlIHRoZXJlIGFueSBvdGhlciByZXF1aXJlZCBwb2xpY3kgY2hlY2tzIGZvciBtb3VudHMgLSBlLmcuLAogICAgIyAgICAgICBtdWx0aXBsZSBtb3VudHMgd2l0aCBzYW1lIHNvdXJjZSBvciBkZXN0aW5hdGlvbj8KCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IHRydWUiKQp9CgpjaGVja19tb3VudChwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcF9tb3VudCA9PSBpX21vdW50CiAgICBwcmludCgiY2hlY2tfbW91bnQgMTogdHJ1ZSIpCn0KY2hlY2tfbW91bnQocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHBfbW91bnQuZGVzdGluYXRpb24gPT0gaV9tb3VudC5kZXN0aW5hdGlvbgogICAgcF9tb3VudC50eXBlXyA9PSBpX21vdW50LnR5cGVfCiAgICBwX21vdW50Lm9wdGlvbnMgPT0gaV9tb3VudC5vcHRpb25zCgogICAgbW91bnRfc291cmNlX2FsbG93cyhwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkKCiAgICBwcmludCgiY2hlY2tfbW91bnQgMjogdHJ1ZSIpCn0KCm1vdW50X3NvdXJjZV9hbGxvd3MocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHJlZ2V4MSA6PSBwX21vdW50LnNvdXJjZQogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5tb3VudF9zb3VyY2VfY3BhdGgpCiAgICByZWdleDQgOj0gcmVwbGFjZShyZWdleDMsICIkKGJ1bmRsZS1pZCkiLCBidW5kbGVfaWQpCgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMTogcmVnZXg0ID0iLCByZWdleDQpCiAgICByZWdleC5tYXRjaChyZWdleDQsIGlfbW91bnQuc291cmNlKQoKICAgIHByaW50KCJtb3VudF9zb3VyY2VfYWxsb3dzIDE6IHRydWUiKQp9Cm1vdW50X3NvdXJjZV9hbGxvd3MocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHJlZ2V4MSA6PSBwX21vdW50LnNvdXJjZQogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5tb3VudF9zb3VyY2VfY3BhdGgpCiAgICByZWdleDQgOj0gcmVwbGFjZShyZWdleDMsICIkKHNhbmRib3gtaWQpIiwgc2FuZGJveF9pZCkKCiAgICBwcmludCgibW91bnRfc291cmNlX2FsbG93cyAyOiByZWdleDQgPSIsIHJlZ2V4NCkKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4NCwgaV9tb3VudC5zb3VyY2UpCgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMjogdHJ1ZSIpCn0KbW91bnRfc291cmNlX2FsbG93cyhwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogaV9tb3VudC5zb3VyY2UgPSIsIGlfbW91bnQuc291cmNlKQogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogaV9zdG9yYWdlLm1vdW50X3BvaW50ID0iLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCgogICAgaV9tb3VudC5zb3VyY2UgPT0gaV9zdG9yYWdlLm1vdW50X3BvaW50CgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogdHJ1ZSIpCn0KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBDcmVhdGUgY29udGFpbmVyIFN0b3JhZ2VzCgphbGxvd19zdG9yYWdlcyhwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHBfY291bnQgOj0gY291bnQocF9zdG9yYWdlcykKICAgIGlfY291bnQgOj0gY291bnQoaV9zdG9yYWdlcykKICAgIHByaW50KCJhbGxvd19zdG9yYWdlczogcF9jb3VudCA9IiwgcF9jb3VudCwgImlfY291bnQgPSIsIGlfY291bnQpCgogICAgcF9jb3VudCA9PSBpX2NvdW50CgogICAgIyBHZXQgdGhlIGNvbnRhaW5lciBpbWFnZSBsYXllciBJRHMgYW5kIHZlcml0eSByb290IGhhc2hlcywgZnJvbSB0aGUgIm92ZXJsYXlmcyIgc3RvcmFnZS4KICAgIHNvbWUgb3ZlcmxheV9zdG9yYWdlIGluIHBfc3RvcmFnZXMKICAgIG92ZXJsYXlfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIHByaW50KCJhbGxvd19zdG9yYWdlczogb3ZlcmxheV9zdG9yYWdlID0iLCBvdmVybGF5X3N0b3JhZ2UpCiAgICBjb3VudChvdmVybGF5X3N0b3JhZ2Uub3B0aW9ucykgPT0gMgoKICAgIGxheWVyX2lkcyA6PSBzcGxpdChvdmVybGF5X3N0b3JhZ2Uub3B0aW9uc1swXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiBsYXllcl9pZHMgPSIsIGxheWVyX2lkcykKCiAgICByb290X2hhc2hlcyA6PSBzcGxpdChvdmVybGF5X3N0b3JhZ2Uub3B0aW9uc1sxXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiByb290X2hhc2hlcyA9Iiwgcm9vdF9oYXNoZXMpCgogICAgZXZlcnkgaV9zdG9yYWdlIGluIGlfc3RvcmFnZXMgewogICAgICAgIGFsbG93X3N0b3JhZ2UocF9zdG9yYWdlcywgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpCiAgICB9CgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiB0cnVlIikKfQoKYWxsb3dfc3RvcmFnZShwX3N0b3JhZ2VzLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgc29tZSBwX3N0b3JhZ2UgaW4gcF9zdG9yYWdlcwoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiBwX3N0b3JhZ2UgPSIsIHBfc3RvcmFnZSkKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiBpX3N0b3JhZ2UgPSIsIGlfc3RvcmFnZSkKCiAgICBwX3N0b3JhZ2UuZHJpdmVyICAgICAgICAgICA9PSBpX3N0b3JhZ2UuZHJpdmVyCiAgICBwX3N0b3JhZ2UuZHJpdmVyX29wdGlvbnMgICA9PSBpX3N0b3JhZ2UuZHJpdmVyX29wdGlvbnMKICAgIHBfc3RvcmFnZS5mc19ncm91cCAgICAgICAgID09IGlfc3RvcmFnZS5mc19ncm91cAogICAgcF9zdG9yYWdlLmZzdHlwZSAgICAgICAgICAgPT0gaV9zdG9yYWdlLmZzdHlwZQoKICAgIGFsbG93X3N0b3JhZ2Vfc291cmNlKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKQogICAgYWxsb3dfc3RvcmFnZV9vcHRpb25zKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKQogICAgYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKQoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiB0cnVlIikKfQoKYWxsb3dfc3RvcmFnZV9zb3VyY2UocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX3NvdXJjZSAxOiBzdGFydCIpCgogICAgcF9zdG9yYWdlLnNvdXJjZSA9PSBpX3N0b3JhZ2Uuc291cmNlCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDE6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX3NvdXJjZShwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDI6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCgogICAgIyBEREREOkJCOkRELkY6IERvbWFpbjpCdXM6RGV2aWNlLkZ1bmN0aW9uCiAgICAjIGh0dHBzOi8vd3d3Lmtlcm5lbC5vcmcvZG9jL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtYnVzLXBjaQogICAgcmVnZXgubWF0Y2goYF5bYS1mMC05XXs0fTpbYS1mMC05XXsyfTpbYS1mMC05XXsyfVwuW2EtZjAtOV0kYCwgaV9zdG9yYWdlLnNvdXJjZSkKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9zb3VyY2UgMjogdHJ1ZSIpCn0KCmFsbG93X3N0b3JhZ2Vfc291cmNlKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKSB7CiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9zb3VyY2UgMzogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIGlfc3RvcmFnZS5zb3VyY2UgPT0gIm5vbmUiCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDM6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX3NvdXJjZShwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDQ6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJzbWIiCgogICAgIyBQYXR0ZXJuOiAvLzxzdG9yYWdlLWFjY291bnQtbmFtZT4uZmlsZS5jb3JlLndpbmRvd3MubmV0LzxrOHMtUFZDLW5hbWU+CiAgICAjIFN0b3JhZ2UgYWNjb3VudCBuYW1lOiBodHRwczovL2xlYXJuLm1pY3Jvc29mdC5jb20vZW4tdXMvYXp1cmUvc3RvcmFnZS9jb21tb24vc3RvcmFnZS1hY2NvdW50LW92ZXJ2aWV3I3N0b3JhZ2UtYWNjb3VudC1uYW1lCiAgICAjIEs4cyBQVkMgbmFtZTogaHR0cHM6Ly9rdWJlcm5ldGVzLmlvL2RvY3MvY29uY2VwdHMvb3ZlcnZpZXcvd29ya2luZy13aXRoLW9iamVjdHMvbmFtZXMvI2Rucy1zdWJkb21haW4tbmFtZXMKICAgIHJlZ2V4Lm1hdGNoKGBeXC9cLyhbYS16MC05XXszLDI0fSlcLmZpbGVcLmNvcmVcLndpbmRvd3NcLm5ldFwvW2EtejAtOV0oW2EtejAtOS4tXXswLDI1MX1bYS16MC05XSk/JGAsIGlfc3RvcmFnZS5zb3VyY2UpCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDQ6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMTogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgIT0gIm92ZXJsYXlmcyIKICAgIHBfc3RvcmFnZS5vcHRpb25zID09IGlfc3RvcmFnZS5vcHRpb25zCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAxOiB0cnVlIikKfQphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIGNvdW50KHBfc3RvcmFnZS5vcHRpb25zKSA9PSAyCgogICAgcG9saWN5X2lkcyA6PSBzcGxpdChwX3N0b3JhZ2Uub3B0aW9uc1swXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBwb2xpY3lfaWRzID0iLCBwb2xpY3lfaWRzKQogICAgcG9saWN5X2lkcyA9PSBsYXllcl9pZHMKCiAgICBwb2xpY3lfaGFzaGVzIDo9IHNwbGl0KHBfc3RvcmFnZS5vcHRpb25zWzFdLCAiOiIpCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IHBvbGljeV9oYXNoZXMgPSIsIHBvbGljeV9oYXNoZXMpCgogICAgcF9jb3VudCA6PSBjb3VudChwb2xpY3lfaWRzKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBwX2NvdW50ID0iLCBwX2NvdW50KQogICAgcF9jb3VudCA+PSAxCiAgICBwX2NvdW50ID09IGNvdW50KHBvbGljeV9oYXNoZXMpCgogICAgaV9jb3VudCA6PSBjb3VudChpX3N0b3JhZ2Uub3B0aW9ucykKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogaV9jb3VudCA9IiwgaV9jb3VudCkKICAgIGlfY291bnQgPT0gcF9jb3VudCArIDMKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zWzBdID0iLCBpX3N0b3JhZ2Uub3B0aW9uc1swXSkKICAgIGlfc3RvcmFnZS5vcHRpb25zWzBdID09ICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQubGF5ZXItc3JjLXByZWZpeD0vdmFyL2xpYi9jb250YWluZXJkL2lvLmNvbnRhaW5lcmQuc25hcHNob3R0ZXIudjEudGFyZGV2L2xheWVycyIKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zW2lfY291bnQgLSAyXSA9IiwgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDJdKQogICAgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDJdID09ICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQub3ZlcmxheS1ydyIKCiAgICBsb3dlcmRpciA6PSBjb25jYXQoIj0iLCBbImxvd2VyZGlyIiwgcF9zdG9yYWdlLm9wdGlvbnNbMF1dKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBsb3dlcmRpciA9IiwgbG93ZXJkaXIpCgogICAgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDFdID09IGxvd2VyZGlyCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zW2lfY291bnQgLSAxXSA9IiwgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDFdKQoKICAgIGV2ZXJ5IGksIHBvbGljeV9pZCBpbiBwb2xpY3lfaWRzIHsKICAgICAgICBhbGxvd19vdmVybGF5X2xheWVyKHBvbGljeV9pZCwgcG9saWN5X2hhc2hlc1tpXSwgaV9zdG9yYWdlLm9wdGlvbnNbaSArIDFdKQogICAgfQoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogdHJ1ZSIpCn0KYWxsb3dfc3RvcmFnZV9vcHRpb25zKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKSB7CiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDM6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCiAgICBjb3VudChwX3N0b3JhZ2Uub3B0aW9ucykgPT0gMQoKICAgIHN0YXJ0c3dpdGgocF9zdG9yYWdlLm9wdGlvbnNbMF0sICIkKGhhc2giKQogICAgaGFzaF9zdWZmaXggOj0gdHJpbV9sZWZ0KHBfc3RvcmFnZS5vcHRpb25zWzBdLCAiJChoYXNoIikKCiAgICBlbmRzd2l0aChoYXNoX3N1ZmZpeCwgIikiKQogICAgaGFzaF9pbmRleCA6PSB0cmltX3JpZ2h0KGhhc2hfc3VmZml4LCAiKSIpCiAgICBpIDo9IHRvX251bWJlcihoYXNoX2luZGV4KQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAzOiBpID0iLCBpKQoKICAgIGhhc2hfb3B0aW9uIDo9IGNvbmNhdCgiPSIsIFsiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LnJvb3QtaGFzaCIsIHJvb3RfaGFzaGVzW2ldXSkKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMzogaGFzaF9vcHRpb24gPSIsIGhhc2hfb3B0aW9uKQoKICAgIGNvdW50KGlfc3RvcmFnZS5vcHRpb25zKSA9PSA0CiAgICBpX3N0b3JhZ2Uub3B0aW9uc1swXSA9PSAicm8iCiAgICBpX3N0b3JhZ2Uub3B0aW9uc1sxXSA9PSAiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmJsb2NrX2RldmljZT1maWxlIgogICAgaV9zdG9yYWdlLm9wdGlvbnNbMl0gPT0gImlvLmthdGFjb250YWluZXJzLmZzLW9wdC5pcy1sYXllciIKICAgIGlfc3RvcmFnZS5vcHRpb25zWzNdID09IGhhc2hfb3B0aW9uCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAzOiB0cnVlIikKfQphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgNDogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gInNtYiIKICAgIHBfb3B0c19jb3VudCA6PSBjb3VudChwX3N0b3JhZ2Uub3B0aW9ucykKICAgIGlfb3B0c19jb3VudCA6PSBjb3VudChpX3N0b3JhZ2Uub3B0aW9ucykKICAgIGlfb3B0c19jb3VudCA9PSBwX29wdHNfY291bnQgKyAyCgogICAgaV9vcHRfbWF0Y2hlcyA6PSBbaSB8IGkgOj0gaWR4OyBpZHggPCBwX29wdHNfY291bnQ7IHBfc3RvcmFnZS5vcHRpb25zW2lkeF0gPT0gaV9zdG9yYWdlLm9wdGlvbnNbaWR4XV0KICAgIGNvdW50KGlfb3B0X21hdGNoZXMpID09IHBfb3B0c19jb3VudAoKICAgIHN0YXJ0c3dpdGgoaV9zdG9yYWdlLm9wdGlvbnNbaV9vcHRzX2NvdW50LTJdLCAiYWRkcj0iKQogICAgY3JlZHMgPSBzcGxpdChpX3N0b3JhZ2Uub3B0aW9uc1tpX29wdHNfY291bnQtMV0sICIsIikKICAgIGNvdW50KGNyZWRzKSA9PSAyCiAgICBzdGFydHN3aXRoKGNyZWRzWzBdLCAidXNlcm5hbWU9IikKICAgIHN0YXJ0c3dpdGgoY3JlZHNbMV0sICJwYXNzd29yZD0iKQogICAgCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDQ6IHRydWUiKQp9CgphbGxvd19vdmVybGF5X2xheWVyKHBvbGljeV9pZCwgcG9saWN5X2hhc2gsIGlfb3B0aW9uKSB7CiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogcG9saWN5X2lkID0iLCBwb2xpY3lfaWQsICJwb2xpY3lfaGFzaCA9IiwgcG9saWN5X2hhc2gpCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogaV9vcHRpb24gPSIsIGlfb3B0aW9uKQoKICAgIHN0YXJ0c3dpdGgoaV9vcHRpb24sICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQubGF5ZXI9IikKICAgIGlfdmFsdWUgOj0gcmVwbGFjZShpX29wdGlvbiwgImlvLmthdGFjb250YWluZXJzLmZzLW9wdC5sYXllcj0iLCAiIikKICAgIGlfdmFsdWVfZGVjb2RlZCA6PSBiYXNlNjQuZGVjb2RlKGlfdmFsdWUpCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogaV92YWx1ZV9kZWNvZGVkID0iLCBpX3ZhbHVlX2RlY29kZWQpCgogICAgcG9saWN5X3N1ZmZpeCA6PSBjb25jYXQoIj0iLCBbInRhcixybyxpby5rYXRhY29udGFpbmVycy5mcy1vcHQuYmxvY2tfZGV2aWNlPWZpbGUsaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmlzLWxheWVyLGlvLmthdGFjb250YWluZXJzLmZzLW9wdC5yb290LWhhc2giLCBwb2xpY3lfaGFzaF0pCiAgICBwX3ZhbHVlIDo9IGNvbmNhdCgiLCIsIFtwb2xpY3lfaWQsIHBvbGljeV9zdWZmaXhdKQogICAgcHJpbnQoImFsbG93X292ZXJsYXlfbGF5ZXI6IHBfdmFsdWUgPSIsIHBfdmFsdWUpCgogICAgcF92YWx1ZSA9PSBpX3ZhbHVlX2RlY29kZWQKCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogdHJ1ZSIpCn0KCmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAidGFyIgoKICAgIHN0YXJ0c3dpdGgocF9zdG9yYWdlLm1vdW50X3BvaW50LCAiJChsYXllciIpCiAgICBtb3VudF9zdWZmaXggOj0gdHJpbV9sZWZ0KHBfc3RvcmFnZS5tb3VudF9wb2ludCwgIiQobGF5ZXIiKQoKICAgIGVuZHN3aXRoKG1vdW50X3N1ZmZpeCwgIikiKQogICAgbGF5ZXJfaW5kZXggOj0gdHJpbV9yaWdodChtb3VudF9zdWZmaXgsICIpIikKICAgIGkgOj0gdG9fbnVtYmVyKGxheWVyX2luZGV4KQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDE6IGkgPSIsIGkpCgogICAgbGF5ZXJfaWQgOj0gbGF5ZXJfaWRzW2ldCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMTogbGF5ZXJfaWQgPSIsIGxheWVyX2lkKQoKICAgIHBfbW91bnQgOj0gY29uY2F0KCIvIiwgWyIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L2xheWVycyIsIGxheWVyX2lkXSkKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCAxOiBwX21vdW50ID0iLCBwX21vdW50KQoKICAgIHBfbW91bnQgPT0gaV9zdG9yYWdlLm1vdW50X3BvaW50CgogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDE6IHRydWUiKQp9CmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAiZnVzZTMua2F0YS1vdmVybGF5IgoKICAgIG1vdW50MSA6PSByZXBsYWNlKHBfc3RvcmFnZS5tb3VudF9wb2ludCwgIiQoY3BhdGgpIiwgcG9saWN5X2RhdGEuY29tbW9uLmNwYXRoKQogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDI6IG1vdW50MiA9IiwgbW91bnQyKQoKICAgIG1vdW50MiA9PSBpX3N0b3JhZ2UubW91bnRfcG9pbnQKCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMjogdHJ1ZSIpCn0KYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKSB7CiAgICBwX3N0b3JhZ2UuZnN0eXBlID09ICJsb2NhbCIKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQyID0iLCBtb3VudDIpCgogICAgbW91bnQzIDo9IHJlcGxhY2UobW91bnQyLCAiJChzYW5kYm94LWlkKSIsIHNhbmRib3hfaWQpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQzID0iLCBtb3VudDMpCgogICAgcmVnZXgubWF0Y2gobW91bnQzLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCgogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDM6IHRydWUiKQp9CmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAiYmluZCIKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNDogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNDogbW91bnQyID0iLCBtb3VudDIpCgogICAgbW91bnQzIDo9IHJlcGxhY2UobW91bnQyLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDQ6IG1vdW50MyA9IiwgbW91bnQzKQoKICAgIHJlZ2V4Lm1hdGNoKG1vdW50MywgaV9zdG9yYWdlLm1vdW50X3BvaW50KQoKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA0OiB0cnVlIikKfQphbGxvd19tb3VudF9wb2ludChwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgYnVuZGxlX2lkLCBzYW5kYm94X2lkLCBsYXllcl9pZHMpIHsKICAgIHBfc3RvcmFnZS5mc3R5cGUgPT0gInRtcGZzIgoKICAgIG1vdW50MSA6PSBwX3N0b3JhZ2UubW91bnRfcG9pbnQKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA1OiBtb3VudDEgPSIsIG1vdW50MSkKCiAgICByZWdleC5tYXRjaChtb3VudDEsIGlfc3RvcmFnZS5tb3VudF9wb2ludCkKCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNTogdHJ1ZSIpCn0KYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKSB7CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogaV9zdG9yYWdlLm1vdW50X3BvaW50ID0iLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCiAgICBhbGxvd19kaXJlY3Rfdm9sX2RyaXZlcihwX3N0b3JhZ2UsIGlfc3RvcmFnZSkKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChzcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQyID0iLCBtb3VudDIpCgogICAgZGlyZWN0X3ZvbF9wYXRoIDo9IGlfc3RvcmFnZS5zb3VyY2UKICAgIG1vdW50MyA6PSByZXBsYWNlKG1vdW50MiwgIiQoYjY0LWRpcmVjdC12b2wtcGF0aCkiLCBiYXNlNjR1cmwuZW5jb2RlKGRpcmVjdF92b2xfcGF0aCkpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQzID0iLCBtb3VudDMpCgogICAgbW91bnQzID09IGlfc3RvcmFnZS5tb3VudF9wb2ludAoKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA2OiB0cnVlIikKfQoKYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIocF9zdG9yYWdlLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19kaXJlY3Rfdm9sX2RyaXZlciAxOiBzdGFydCIpCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCiAgICBwcmludCgiYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIgMTogdHJ1ZSIpCn0KYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIocF9zdG9yYWdlLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19kaXJlY3Rfdm9sX2RyaXZlciAyOiBzdGFydCIpCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJzbWIiCiAgICBwcmludCgiYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIgMjogdHJ1ZSIpCn0KCiMgRXhlY1Byb2Nlc3NSZXF1ZXN0LnByb2Nlc3MuQ2FwYWJpbGl0aWVzCmFsbG93X2V4ZWNfY2FwcyhpX2NhcHMpIHsKICAgIG5vdCBpX2NhcHMuQW1iaWVudAogICAgbm90IGlfY2Fwcy5Cb3VuZGluZwogICAgbm90IGlfY2Fwcy5FZmZlY3RpdmUKICAgIG5vdCBpX2NhcHMuSW5oZXJpdGFibGUKICAgIG5vdCBpX2NhcHMuUGVybWl0dGVkCn0KCiMgT0NJLlByb2Nlc3MuQ2FwYWJpbGl0aWVzCmFsbG93X2NhcHMocF9jYXBzLCBpX2NhcHMpIHsKICAgIHByaW50KCJhbGxvd19jYXBzOiBwb2xpY3kgQW1iaWVudCA9IiwgcF9jYXBzLkFtYmllbnQpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgQW1iaWVudCA9IiwgaV9jYXBzLkFtYmllbnQpCiAgICBtYXRjaF9jYXBzKHBfY2Fwcy5BbWJpZW50LCBpX2NhcHMuQW1iaWVudCkKCiAgICBwcmludCgiYWxsb3dfY2FwczogcG9saWN5IEJvdW5kaW5nID0iLCBwX2NhcHMuQm91bmRpbmcpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgQm91bmRpbmcgPSIsIGlfY2Fwcy5Cb3VuZGluZykKICAgIG1hdGNoX2NhcHMocF9jYXBzLkJvdW5kaW5nLCBpX2NhcHMuQm91bmRpbmcpCgogICAgcHJpbnQoImFsbG93X2NhcHM6IHBvbGljeSBFZmZlY3RpdmUgPSIsIHBfY2Fwcy5FZmZlY3RpdmUpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgRWZmZWN0aXZlID0iLCBpX2NhcHMuRWZmZWN0aXZlKQogICAgbWF0Y2hfY2FwcyhwX2NhcHMuRWZmZWN0aXZlLCBpX2NhcHMuRWZmZWN0aXZlKQoKICAgIHByaW50KCJhbGxvd19jYXBzOiBwb2xpY3kgSW5oZXJpdGFibGUgPSIsIHBfY2Fwcy5Jbmhlcml0YWJsZSkKICAgIHByaW50KCJhbGxvd19jYXBzOiBpbnB1dCBJbmhlcml0YWJsZSA9IiwgaV9jYXBzLkluaGVyaXRhYmxlKQogICAgbWF0Y2hfY2FwcyhwX2NhcHMuSW5oZXJpdGFibGUsIGlfY2Fwcy5Jbmhlcml0YWJsZSkKCiAgICBwcmludCgiYWxsb3dfY2FwczogcG9saWN5IFBlcm1pdHRlZCA9IiwgcF9jYXBzLlBlcm1pdHRlZCkKICAgIHByaW50KCJhbGxvd19jYXBzOiBpbnB1dCBQZXJtaXR0ZWQgPSIsIGlfY2Fwcy5QZXJtaXR0ZWQpCiAgICBtYXRjaF9jYXBzKHBfY2Fwcy5QZXJtaXR0ZWQsIGlfY2Fwcy5QZXJtaXR0ZWQpCn0KCm1hdGNoX2NhcHMocF9jYXBzLCBpX2NhcHMpIHsKICAgIHByaW50KCJtYXRjaF9jYXBzIDE6IHN0YXJ0IikKCiAgICBwX2NhcHMgPT0gaV9jYXBzCgogICAgcHJpbnQoIm1hdGNoX2NhcHMgMTogdHJ1ZSIpCn0KbWF0Y2hfY2FwcyhwX2NhcHMsIGlfY2FwcykgewogICAgcHJpbnQoIm1hdGNoX2NhcHMgMjogc3RhcnQiKQoKICAgIGNvdW50KHBfY2FwcykgPT0gMQogICAgcF9jYXBzWzBdID09ICIkKGRlZmF1bHRfY2FwcykiCgogICAgcHJpbnQoIm1hdGNoX2NhcHMgMjogZGVmYXVsdF9jYXBzID0iLCBwb2xpY3lfZGF0YS5jb21tb24uZGVmYXVsdF9jYXBzKQogICAgcG9saWN5X2RhdGEuY29tbW9uLmRlZmF1bHRfY2FwcyA9PSBpX2NhcHMKCiAgICBwcmludCgibWF0Y2hfY2FwcyAyOiB0cnVlIikKfQptYXRjaF9jYXBzKHBfY2FwcywgaV9jYXBzKSB7CiAgICBwcmludCgibWF0Y2hfY2FwcyAzOiBzdGFydCIpCgogICAgY291bnQocF9jYXBzKSA9PSAxCiAgICBwX2NhcHNbMF0gPT0gIiQocHJpdmlsZWdlZF9jYXBzKSIKCiAgICBwcmludCgibWF0Y2hfY2FwcyAzOiBwcml2aWxlZ2VkX2NhcHMgPSIsIHBvbGljeV9kYXRhLmNvbW1vbi5wcml2aWxlZ2VkX2NhcHMpCiAgICBwb2xpY3lfZGF0YS5jb21tb24ucHJpdmlsZWdlZF9jYXBzID09IGlfY2FwcwoKICAgIHByaW50KCJtYXRjaF9jYXBzIDM6IHRydWUiKQp9CgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgpjaGVja19kaXJlY3RvcnlfdHJhdmVyc2FsKGlfcGF0aCkgewogICAgbm90IHJlZ2V4Lm1hdGNoKCIoXnwvKS4uKCR8LykiLCBpX3BhdGgpCn0KCmNoZWNrX3N5bWxpbmtfc291cmNlKGlfc3JjKSB7CiAgICBpX3NyYyA9PSAiIgogICAgcHJpbnQoImNoZWNrX3N5bWxpbmtfc291cmNlIDE6IHRydWUiKQp9CmNoZWNrX3N5bWxpbmtfc291cmNlKGlfc3JjKSB7CiAgICBpX3NyYyAhPSAiIgogICAgcHJpbnQoImNoZWNrX3N5bWxpbmtfc291cmNlIDI6IGlfc3JjID0iLCBpX3NyYykKCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24uc19zb3VyY2UxLCBpX3NyYykKCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMjogdHJ1ZSIpCn0KY2hlY2tfc3ltbGlua19zb3VyY2UoaV9zcmMpIHsKICAgIGlfc3JjICE9ICIiCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMzogaV9zcmMgPSIsIGlfc3JjKQoKICAgIHJlZ2V4Lm1hdGNoKHBvbGljeV9kYXRhLmNvbW1vbi5zX3NvdXJjZTIsIGlfc3JjKQogICAgY2hlY2tfZGlyZWN0b3J5X3RyYXZlcnNhbChpX3NyYykKCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMzogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfc3RvcmFnZXMoaV9zdG9yYWdlcykgewogICAgcHJpbnQoImFsbG93X3NhbmRib3hfc3RvcmFnZXM6IGlfc3RvcmFnZXMgPSIsIGlfc3RvcmFnZXMpCgogICAgcF9zdG9yYWdlcyA6PSBwb2xpY3lfZGF0YS5zYW5kYm94LnN0b3JhZ2VzCiAgICBldmVyeSBpX3N0b3JhZ2UgaW4gaV9zdG9yYWdlcyB7CiAgICAgICAgYWxsb3dfc2FuZGJveF9zdG9yYWdlKHBfc3RvcmFnZXMsIGlfc3RvcmFnZSkKICAgIH0KCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9zdG9yYWdlczogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfc3RvcmFnZShwX3N0b3JhZ2VzLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IGlfc3RvcmFnZSA9IiwgaV9zdG9yYWdlKQoKICAgIHNvbWUgcF9zdG9yYWdlIGluIHBfc3RvcmFnZXMKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IHBfc3RvcmFnZSA9IiwgcF9zdG9yYWdlKQogICAgaV9zdG9yYWdlID09IHBfc3RvcmFnZQoKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IHRydWUiKQp9CgpDb3B5RmlsZVJlcXVlc3QgewogICAgcHJpbnQoIkNvcHlGaWxlUmVxdWVzdDogaW5wdXQucGF0aCA9IiwgaW5wdXQucGF0aCkKCiAgICBjaGVja19zeW1saW5rX3NvdXJjZShpbnB1dC5zeW1saW5rX3NyYykKICAgIGNoZWNrX2RpcmVjdG9yeV90cmF2ZXJzYWwoaW5wdXQucGF0aCkKCiAgICBzb21lIHJlZ2V4MSBpbiBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLkNvcHlGaWxlUmVxdWVzdAogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5jcGF0aCkKICAgIHJlZ2V4NCA6PSByZXBsYWNlKHJlZ2V4MywgIiQoYnVuZGxlLWlkKSIsIEJVTkRMRV9JRCkKICAgIHByaW50KCJDb3B5RmlsZVJlcXVlc3Q6IHJlZ2V4NCA9IiwgcmVnZXg0KQoKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4NCwgaW5wdXQucGF0aCkKCiAgICBwcmludCgiQ29weUZpbGVSZXF1ZXN0OiB0cnVlIikKfQoKQ3JlYXRlU2FuZGJveFJlcXVlc3QgewogICAgcHJpbnQoIkNyZWF0ZVNhbmRib3hSZXF1ZXN0OiBpbnB1dC5ndWVzdF9ob29rX3BhdGggPSIsIGlucHV0Lmd1ZXN0X2hvb2tfcGF0aCkKICAgIGNvdW50KGlucHV0Lmd1ZXN0X2hvb2tfcGF0aCkgPT0gMAoKICAgIHByaW50KCJDcmVhdGVTYW5kYm94UmVxdWVzdDogaW5wdXQua2VybmVsX21vZHVsZXMgPSIsIGlucHV0Lmtlcm5lbF9tb2R1bGVzKQogICAgY291bnQoaW5wdXQua2VybmVsX21vZHVsZXMpID09IDAKCiAgICBpX3BpZG5zIDo9IGlucHV0LnNhbmRib3hfcGlkbnMKICAgIHByaW50KCJDcmVhdGVTYW5kYm94UmVxdWVzdDogaV9waWRucyA9IiwgaV9waWRucykKICAgIGlfcGlkbnMgPT0gZmFsc2UKICAgIGFsbG93X3NhbmRib3hfc3RvcmFnZXMoaW5wdXQuc3RvcmFnZXMpCn0KCmFsbG93X2V4ZWMocF9jb250YWluZXIsIGlfcHJvY2VzcykgewogICAgcHJpbnQoImFsbG93X2V4ZWM6IHN0YXJ0IikKCiAgICBwX29jaSA9IHBfY29udGFpbmVyLk9DSQogICAgcF9zX25hbWUgPSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc19uYW1lc3BhY2UgPSBnZXRfc3RhdGVfdmFsKCJuYW1lc3BhY2UiKQogICAgYWxsb3dfcHJvYmVfcHJvY2VzcyhwX29jaS5Qcm9jZXNzLCBpX3Byb2Nlc3MsIHBfc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfZXhlYzogdHJ1ZSIpCn0KCmFsbG93X2ludGVyYWN0aXZlX2V4ZWMocF9jb250YWluZXIsIGlfcHJvY2VzcykgewogICAgcHJpbnQoImFsbG93X2ludGVyYWN0aXZlX2V4ZWM6IHN0YXJ0IikKCiAgICBwX29jaSA9IHBfY29udGFpbmVyLk9DSQogICAgcF9zX25hbWUgPSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc19uYW1lc3BhY2UgPSBnZXRfc3RhdGVfdmFsKCJuYW1lc3BhY2UiKQogICAgYWxsb3dfaW50ZXJhY3RpdmVfcHJvY2VzcyhwX29jaS5Qcm9jZXNzLCBpX3Byb2Nlc3MsIHBfc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfaW50ZXJhY3RpdmVfZXhlYzogdHJ1ZSIpCn0KCiMgVE9ETzogc2hvdWxkIG90aGVyIEV4ZWNQcm9jZXNzUmVxdWVzdCBpbnB1dCBkYXRhIGZpZWxkcyBiZSB2YWxpZGF0ZWQgYXMgd2VsbD8KRXhlY1Byb2Nlc3NSZXF1ZXN0IHsKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMTogaW5wdXQgPSIsIGlucHV0KQoKICAgIHNvbWUgcF9jb21tYW5kIGluIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuRXhlY1Byb2Nlc3NSZXF1ZXN0LmFsbG93ZWRfY29tbWFuZHMKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMTogcF9jb21tYW5kID0iLCBwX2NvbW1hbmQpCiAgICBwX2NvbW1hbmQgPT0gaW5wdXQucHJvY2Vzcy5BcmdzCgogICAgIyBUT0RPOiBtYXRjaCBwX2NvbnRhaW5lcidzIElEIHdpdGggdGhlIGlucHV0IGNvbnRhaW5lcl9pZC4KICAgIHNvbWUgcF9jb250YWluZXIgaW4gcG9saWN5X2RhdGEuY29udGFpbmVycwogICAgYWxsb3dfaW50ZXJhY3RpdmVfZXhlYyhwX2NvbnRhaW5lciwgaW5wdXQucHJvY2VzcykKCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDE6IHRydWUiKQp9CkV4ZWNQcm9jZXNzUmVxdWVzdCB7CiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDI6IGlucHV0ID0iLCBpbnB1dCkKCiAgICAjIFRPRE86IG1hdGNoIGlucHV0IGNvbnRhaW5lciBJRCB3aXRoIGl0cyBjb3JyZXNwb25kaW5nIGNvbnRhaW5lci5leGVjX2NvbW1hbmRzLgogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBzb21lIHBfY29tbWFuZCBpbiBwX2NvbnRhaW5lci5leGVjX2NvbW1hbmRzCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDI6IHBfY29tbWFuZCA9IiwgcF9jb21tYW5kKQoKICAgICMgVE9ETzogc2hvdWxkIG90aGVyIGlucHV0IGRhdGEgZmllbGRzIGJlIHZhbGlkYXRlZCBhcyB3ZWxsPwogICAgcF9jb21tYW5kID09IGlucHV0LnByb2Nlc3MuQXJncwoKICAgIGFsbG93X2V4ZWMocF9jb250YWluZXIsIGlucHV0LnByb2Nlc3MpCgogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAyOiB0cnVlIikKfQpFeGVjUHJvY2Vzc1JlcXVlc3QgewogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAzOiBpbnB1dCA9IiwgaW5wdXQpCgogICAgaV9jb21tYW5kID0gY29uY2F0KCIgIiwgaW5wdXQucHJvY2Vzcy5BcmdzKQogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAzOiBpX2NvbW1hbmQgPSIsIGlfY29tbWFuZCkKCiAgICBzb21lIHBfcmVnZXggaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5FeGVjUHJvY2Vzc1JlcXVlc3QucmVnZXgKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMzogcF9yZWdleCA9IiwgcF9yZWdleCkKCiAgICByZWdleC5tYXRjaChwX3JlZ2V4LCBpX2NvbW1hbmQpCgogICAgIyBUT0RPOiBtYXRjaCBwX2NvbnRhaW5lcidzIElEIHdpdGggdGhlIGlucHV0IGNvbnRhaW5lcl9pZC4KICAgIHNvbWUgcF9jb250YWluZXIgaW4gcG9saWN5X2RhdGEuY29udGFpbmVycwogICAgYWxsb3dfaW50ZXJhY3RpdmVfZXhlYyhwX2NvbnRhaW5lciwgaW5wdXQucHJvY2VzcykKCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDM6IHRydWUiKQp9CgpVcGRhdGVSb3V0ZXNSZXF1ZXN0IHsKICAgIHByaW50KCJVcGRhdGVSb3V0ZXNSZXF1ZXN0OiBpbnB1dCA9IiwgaW5wdXQpCiAgICBwcmludCgiVXBkYXRlUm91dGVzUmVxdWVzdDogcG9saWN5ID0iLCBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLlVwZGF0ZVJvdXRlc1JlcXVlc3QpCgogICAgaV9yb3V0ZXMgOj0gaW5wdXQucm91dGVzLlJvdXRlcwogICAgcF9zb3VyY2VfcmVnZXggPSBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLlVwZGF0ZVJvdXRlc1JlcXVlc3QuZm9yYmlkZGVuX3NvdXJjZV9yZWdleAogICAgcF9uYW1lcyA9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuVXBkYXRlUm91dGVzUmVxdWVzdC5mb3JiaWRkZW5fZGV2aWNlX25hbWVzCgogICAgZXZlcnkgaV9yb3V0ZSBpbiBpX3JvdXRlcyB7CiAgICAgICAgcHJpbnQoImlfcm91dGUuc291cmNlID0iLCBpX3JvdXRlLnNvdXJjZSkKICAgICAgICBldmVyeSBwX3JlZ2V4IGluIHBfc291cmNlX3JlZ2V4IHsKICAgICAgICAgICAgcHJpbnQoInBfcmVnZXggPSIsIHBfcmVnZXgpCiAgICAgICAgICAgIG5vdCByZWdleC5tYXRjaChwX3JlZ2V4LCBpX3JvdXRlLnNvdXJjZSkKICAgICAgICB9CgogICAgICAgIHByaW50KCJpX3JvdXRlLmRldmljZSA9IiwgaV9yb3V0ZS5kZXZpY2UpCiAgICAgICAgbm90IGlfcm91dGUuZGV2aWNlIGluIHBfbmFtZXMKICAgIH0KCiAgICBwcmludCgiVXBkYXRlUm91dGVzUmVxdWVzdDogdHJ1ZSIpCn0KClVwZGF0ZUludGVyZmFjZVJlcXVlc3QgewogICAgcHJpbnQoIlVwZGF0ZUludGVyZmFjZVJlcXVlc3Q6IGlucHV0ID0iLCBpbnB1dCkKICAgIHByaW50KCJVcGRhdGVJbnRlcmZhY2VSZXF1ZXN0OiBwb2xpY3kgPSIsIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuVXBkYXRlSW50ZXJmYWNlUmVxdWVzdCkKCiAgICBpX2ludGVyZmFjZSA6PSBpbnB1dC5pbnRlcmZhY2UKICAgIHBfZmxhZ3MgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmFsbG93X3Jhd19mbGFncwoKICAgICMgVHlwaWNhbGx5LCBqdXN0IElGRl9OT0FSUCBpcyB1c2VkLgogICAgYml0cy5hbmQoaV9pbnRlcmZhY2UucmF3X2ZsYWdzLCBiaXRzLm5lZ2F0ZShwX2ZsYWdzKSkgPT0gMAoKICAgIHBfbmFtZXMgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmZvcmJpZGRlbl9uYW1lcwoKICAgIG5vdCBpX2ludGVyZmFjZS5uYW1lIGluIHBfbmFtZXMKCiAgICBwX2h3YWRkcnMgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmZvcmJpZGRlbl9od19hZGRycwoKICAgIG5vdCBpX2ludGVyZmFjZS5od0FkZHIgaW4gcF9od2FkZHJzCgogICAgcHJpbnQoIlVwZGF0ZUludGVyZmFjZVJlcXVlc3Q6IHRydWUiKQp9CgpDbG9zZVN0ZGluUmVxdWVzdCB7CiAgICBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLkNsb3NlU3RkaW5SZXF1ZXN0ID09IHRydWUKfQoKUmVhZFN0cmVhbVJlcXVlc3QgewogICAgcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5SZWFkU3RyZWFtUmVxdWVzdCA9PSB0cnVlCn0KClVwZGF0ZUVwaGVtZXJhbE1vdW50c1JlcXVlc3QgewogICAgcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVFcGhlbWVyYWxNb3VudHNSZXF1ZXN0ID09IHRydWUKfQoKV3JpdGVTdHJlYW1SZXF1ZXN0IHsKICAgIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuV3JpdGVTdHJlYW1SZXF1ZXN0ID09IHRydWUKfQoKcG9saWN5X2RhdGEgOj0gewogICJjb250YWluZXJzIjogWwogICAgewogICAgICAiT0NJIjogewogICAgICAgICJWZXJzaW9uIjogIjEuMS4wLXJjLjEiLAogICAgICAgICJQcm9jZXNzIjogewogICAgICAgICAgIlRlcm1pbmFsIjogZmFsc2UsCiAgICAgICAgICAiVXNlciI6IHsKICAgICAgICAgICAgIlVJRCI6IDY1NTM1LAogICAgICAgICAgICAiR0lEIjogNjU1MzUsCiAgICAgICAgICAgICJBZGRpdGlvbmFsR2lkcyI6IFtdLAogICAgICAgICAgICAiVXNlcm5hbWUiOiAiIgogICAgICAgICAgfSwKICAgICAgICAgICJEZXByZWNhdGVkQXJncyI6IFsKICAgICAgICAgICAgIi9wYXVzZSIKICAgICAgICAgIF0sCiAgICAgICAgICAiQXJncyI6IFsKICAgICAgICAgICAgIi9wYXVzZSIKICAgICAgICAgIF0sCiAgICAgICAgICAiRW52IjogWwogICAgICAgICAgICAiUEFUSD0vdXNyL2xvY2FsL3NiaW46L3Vzci9sb2NhbC9iaW46L3Vzci9zYmluOi91c3IvYmluOi9zYmluOi9iaW4iCiAgICAgICAgICBdLAogICAgICAgICAgIkN3ZCI6ICIvIiwKICAgICAgICAgICJDYXBhYmlsaXRpZXMiOiB7CiAgICAgICAgICAgICJBbWJpZW50IjogW10sCiAgICAgICAgICAgICJCb3VuZGluZyI6IFsKICAgICAgICAgICAgICAiJChkZWZhdWx0X2NhcHMpIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiRWZmZWN0aXZlIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJJbmhlcml0YWJsZSI6IFtdLAogICAgICAgICAgICAiUGVybWl0dGVkIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICAiTm9OZXdQcml2aWxlZ2VzIjogdHJ1ZQogICAgICAgIH0sCiAgICAgICAgIlJvb3QiOiB7CiAgICAgICAgICAiUGF0aCI6ICIkKGNwYXRoKS8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgIlJlYWRvbmx5IjogdHJ1ZQogICAgICAgIH0sCiAgICAgICAgIk1vdW50cyI6IFsKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9wcm9jIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJwcm9jIiwKICAgICAgICAgICAgInR5cGVfIjogInByb2MiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2IiwKICAgICAgICAgICAgInNvdXJjZSI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJzdHJpY3RhdGltZSIsCiAgICAgICAgICAgICAgIm1vZGU9NzU1IiwKICAgICAgICAgICAgICAic2l6ZT02NTUzNmsiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L3B0cyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiZGV2cHRzIiwKICAgICAgICAgICAgInR5cGVfIjogImRldnB0cyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJuZXdpbnN0YW5jZSIsCiAgICAgICAgICAgICAgInB0bXhtb2RlPTA2NjYiLAogICAgICAgICAgICAgICJtb2RlPTA2MjAiLAogICAgICAgICAgICAgICJnaWQ9NSIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvc2htIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L3NobSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi9tcXVldWUiLAogICAgICAgICAgICAic291cmNlIjogIm1xdWV1ZSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJtcXVldWUiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvc3lzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJzeXNmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJzeXNmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2V0Yy9yZXNvbHYuY29uZiIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClyZXNvbHYuY29uZiQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJvIiwKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9kZXYiLAogICAgICAgICAgICAgICJub2V4ZWMiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0KICAgICAgICBdLAogICAgICAgICJBbm5vdGF0aW9ucyI6IHsKICAgICAgICAgICJiYXRjaC5rdWJlcm5ldGVzLmlvL2pvYi1jb21wbGV0aW9uLWluZGV4IjogIjAiLAogICAgICAgICAgImlvLmthdGFjb250YWluZXJzLnBrZy5vY2kuYnVuZGxlX3BhdGgiOiAiL3J1bi9jb250YWluZXJkL2lvLmNvbnRhaW5lcmQucnVudGltZS52Mi50YXNrL2s4cy5pby8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgImlvLmthdGFjb250YWluZXJzLnBrZy5vY2kuY29udGFpbmVyX3R5cGUiOiAicG9kX3NhbmRib3giLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLmNvbnRhaW5lci10eXBlIjogInNhbmRib3giLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtaWQiOiAiXlthLXowLTldezY0fSQiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbG9nLWRpcmVjdG9yeSI6ICJeL3Zhci9sb2cvcG9kcy8kKHNhbmRib3gtbmFtZXNwYWNlKV8kKHNhbmRib3gtbmFtZSlfWzAtOWEtZl17OH0tWzAtOWEtZl17NH0tWzAtOWEtZl17NH0tWzAtOWEtZl17NH0tWzAtOWEtZl17MTJ9JCIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1uYW1lIjogIl5pbmRleGVkXFwtam9iXFwtMFxcLVthLXowLTkuLV0qW2EtejAtOV0kIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LW5hbWVzcGFjZSI6ICJqb2ItNDQzNiIsCiAgICAgICAgICAibmVyZGN0bC9uZXR3b3JrLW5hbWVzcGFjZSI6ICJeL3Zhci9ydW4vbmV0bnMvY25pLVswLTlhLWZdezh9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezEyfSQiCiAgICAgICAgfSwKICAgICAgICAiTGludXgiOiB7CiAgICAgICAgICAiTmFtZXNwYWNlcyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICJUeXBlIjogImlwYyIsCiAgICAgICAgICAgICAgIlBhdGgiOiAiIgogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgIlR5cGUiOiAidXRzIiwKICAgICAgICAgICAgICAiUGF0aCI6ICIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiVHlwZSI6ICJtb3VudCIsCiAgICAgICAgICAgICAgIlBhdGgiOiAiIgogICAgICAgICAgICB9CiAgICAgICAgICBdLAogICAgICAgICAgIk1hc2tlZFBhdGhzIjogWwogICAgICAgICAgICAiL3Byb2MvYWNwaSIsCiAgICAgICAgICAgICIvcHJvYy9hc291bmQiLAogICAgICAgICAgICAiL3Byb2Mva2NvcmUiLAogICAgICAgICAgICAiL3Byb2Mva2V5cyIsCiAgICAgICAgICAgICIvcHJvYy9sYXRlbmN5X3N0YXRzIiwKICAgICAgICAgICAgIi9wcm9jL3RpbWVyX2xpc3QiLAogICAgICAgICAgICAiL3Byb2MvdGltZXJfc3RhdHMiLAogICAgICAgICAgICAiL3Byb2Mvc2NoZWRfZGVidWciLAogICAgICAgICAgICAiL3N5cy9maXJtd2FyZSIsCiAgICAgICAgICAgICIvcHJvYy9zY3NpIgogICAgICAgICAgXSwKICAgICAgICAgICJSZWFkb25seVBhdGhzIjogWwogICAgICAgICAgICAiL3Byb2MvYnVzIiwKICAgICAgICAgICAgIi9wcm9jL2ZzIiwKICAgICAgICAgICAgIi9wcm9jL2lycSIsCiAgICAgICAgICAgICIvcHJvYy9zeXMiLAogICAgICAgICAgICAiL3Byb2Mvc3lzcnEtdHJpZ2dlciIKICAgICAgICAgIF0sCiAgICAgICAgICAiRGV2aWNlcyI6IFtdLAogICAgICAgICAgIlN5c2N0bCI6IHsKICAgICAgICAgICAgIm5ldC5pcHY0LmlwX3VucHJpdmlsZWdlZF9wb3J0X3N0YXJ0IjogIjAiLAogICAgICAgICAgICAibmV0LmlwdjQucGluZ19ncm91cF9yYW5nZSI6ICIwIDIxNDc0ODM2NDciCiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9LAogICAgICAic3RvcmFnZXMiOiBbCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJibGsiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogInRhciIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIiQoaGFzaDApIgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGxheWVyMCkiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJvdmVybGF5ZnMiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogImZ1c2UzLmthdGEtb3ZlcmxheSIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIjVhNWFhZDgwMDU1ZmYyMDAxMmE1MGRjMjVmOGRmN2EyOTkyNDQ3NDMyNGQ2NWY3ZDUzMDZlZThlZTI3ZmY3MWQiLAogICAgICAgICAgICAiODE3MjUwZjFhM2UzMzZkYTc2ZjViZDNmYTc4NGUxYjI2ZDk1OWI5YzEzMTg3NjgxNWJhMjYwNDA0OGI3MGMxOCIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChjcGF0aCkvJChidW5kbGUtaWQpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9CiAgICAgIF0sCiAgICAgICJkZXZpY2VzIjogW10sCiAgICAgICJzYW5kYm94X3BpZG5zIjogZmFsc2UsCiAgICAgICJleGVjX2NvbW1hbmRzIjogW10sCiAgICAgICJlbnZfbWFwIjogewogICAgICAgICJQQVRIIjogIi91c3IvbG9jYWwvc2JpbjovdXNyL2xvY2FsL2JpbjovdXNyL3NiaW46L3Vzci9iaW46L3NiaW46L2JpbiIKICAgICAgfQogICAgfSwKICAgIHsKICAgICAgIk9DSSI6IHsKICAgICAgICAiVmVyc2lvbiI6ICIxLjEuMC1yYy4xIiwKICAgICAgICAiUHJvY2VzcyI6IHsKICAgICAgICAgICJUZXJtaW5hbCI6IGZhbHNlLAogICAgICAgICAgIlVzZXIiOiB7CiAgICAgICAgICAgICJVSUQiOiAwLAogICAgICAgICAgICAiR0lEIjogMCwKICAgICAgICAgICAgIkFkZGl0aW9uYWxHaWRzIjogW10sCiAgICAgICAgICAgICJVc2VybmFtZSI6ICIiCiAgICAgICAgICB9LAogICAgICAgICAgIkRlcHJlY2F0ZWRBcmdzIjogWwogICAgICAgICAgICAiL2Jpbi9zaCIKICAgICAgICAgIF0sCiAgICAgICAgICAiQXJncyI6IFsKICAgICAgICAgICAgIi9iaW4vc2giCiAgICAgICAgICBdLAogICAgICAgICAgIkVudiI6IFsKICAgICAgICAgICAgIlBBVEg9L3Vzci9sb2NhbC9zYmluOi91c3IvbG9jYWwvYmluOi91c3Ivc2JpbjovdXNyL2Jpbjovc2JpbjovYmluIiwKICAgICAgICAgICAgIkhPU1ROQU1FPSQoaG9zdC1uYW1lKSIsCiAgICAgICAgICAgICJKT0JfQ09NUExFVElPTl9JTkRFWD0wIgogICAgICAgICAgXSwKICAgICAgICAgICJDd2QiOiAiLyIsCiAgICAgICAgICAiQ2FwYWJpbGl0aWVzIjogewogICAgICAgICAgICAiQW1iaWVudCI6IFtdLAogICAgICAgICAgICAiQm91bmRpbmciOiBbCiAgICAgICAgICAgICAgIiQoZGVmYXVsdF9jYXBzKSIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgIkVmZmVjdGl2ZSI6IFsKICAgICAgICAgICAgICAiJChkZWZhdWx0X2NhcHMpIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiSW5oZXJpdGFibGUiOiBbXSwKICAgICAgICAgICAgIlBlcm1pdHRlZCI6IFsKICAgICAgICAgICAgICAiJChkZWZhdWx0X2NhcHMpIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgIk5vTmV3UHJpdmlsZWdlcyI6IGZhbHNlCiAgICAgICAgfSwKICAgICAgICAiUm9vdCI6IHsKICAgICAgICAgICJQYXRoIjogIiQoY3BhdGgpLyQoYnVuZGxlLWlkKSIsCiAgICAgICAgICAiUmVhZG9ubHkiOiBmYWxzZQogICAgICAgIH0sCiAgICAgICAgIk1vdW50cyI6IFsKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9wcm9jIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJwcm9jIiwKICAgICAgICAgICAgInR5cGVfIjogInByb2MiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2IiwKICAgICAgICAgICAgInNvdXJjZSI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJzdHJpY3RhdGltZSIsCiAgICAgICAgICAgICAgIm1vZGU9NzU1IiwKICAgICAgICAgICAgICAic2l6ZT02NTUzNmsiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L3B0cyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiZGV2cHRzIiwKICAgICAgICAgICAgInR5cGVfIjogImRldnB0cyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJuZXdpbnN0YW5jZSIsCiAgICAgICAgICAgICAgInB0bXhtb2RlPTA2NjYiLAogICAgICAgICAgICAgICJtb2RlPTA2MjAiLAogICAgICAgICAgICAgICJnaWQ9NSIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvc2htIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L3NobSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi9tcXVldWUiLAogICAgICAgICAgICAic291cmNlIjogIm1xdWV1ZSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJtcXVldWUiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvc3lzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJzeXNmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJzeXNmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL3N5cy9mcy9jZ3JvdXAiLAogICAgICAgICAgICAic291cmNlIjogImNncm91cCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJjZ3JvdXAiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiLAogICAgICAgICAgICAgICJyZWxhdGltZSIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2V0Yy9ob3N0cyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClob3N0cyQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicnciCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L3Rlcm1pbmF0aW9uLWxvZyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeCl0ZXJtaW5hdGlvbi1sb2ckIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJ3IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2V0Yy9ob3N0bmFtZSIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClob3N0bmFtZSQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicnciCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZXRjL3Jlc29sdi5jb25mIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KXJlc29sdi5jb25mJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJydyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi92YXIvcnVuL3NlY3JldHMva3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudCIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClzZXJ2aWNlYWNjb3VudCQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicm8iCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvdmFyL3J1bi9zZWNyZXRzL2F6dXJlL3Rva2VucyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeCl0b2tlbnMkIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2RhdGEiLAogICAgICAgICAgICAic291cmNlIjogIl4kKGNwYXRoKS8kKHNhbmRib3gtaWQpL2xvY2FsL2RhdGEkIiwKICAgICAgICAgICAgInR5cGVfIjogImxvY2FsIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJydyIKICAgICAgICAgICAgXQogICAgICAgICAgfQogICAgICAgIF0sCiAgICAgICAgIkFubm90YXRpb25zIjogewogICAgICAgICAgImJhdGNoLmt1YmVybmV0ZXMuaW8vam9iLWNvbXBsZXRpb24taW5kZXgiOiAiMCIsCiAgICAgICAgICAiaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5idW5kbGVfcGF0aCI6ICIvcnVuL2NvbnRhaW5lcmQvaW8uY29udGFpbmVyZC5ydW50aW1lLnYyLnRhc2svazhzLmlvLyQoYnVuZGxlLWlkKSIsCiAgICAgICAgICAiaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5jb250YWluZXJfdHlwZSI6ICJwb2RfY29udGFpbmVyIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItbmFtZSI6ICJjIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSI6ICJjb250YWluZXIiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLmltYWdlLW5hbWUiOiAicmVnaXN0cnkuazhzLmlvL2UyZS10ZXN0LWltYWdlcy9idXN5Ym94OjEuMjktMiIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCI6ICJeW2EtejAtOV17NjR9JCIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1uYW1lIjogIl5pbmRleGVkXFwtam9iXFwtMFxcLVthLXowLTkuLV0qW2EtejAtOV0kIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LW5hbWVzcGFjZSI6ICJqb2ItNDQzNiIKICAgICAgICB9LAogICAgICAgICJMaW51eCI6IHsKICAgICAgICAgICJOYW1lc3BhY2VzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgIlR5cGUiOiAiaXBjIiwKICAgICAgICAgICAgICAiUGF0aCI6ICIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiVHlwZSI6ICJ1dHMiLAogICAgICAgICAgICAgICJQYXRoIjogIiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJUeXBlIjogIm1vdW50IiwKICAgICAgICAgICAgICAiUGF0aCI6ICIiCiAgICAgICAgICAgIH0KICAgICAgICAgIF0sCiAgICAgICAgICAiTWFza2VkUGF0aHMiOiBbCiAgICAgICAgICAgICIvcHJvYy9hY3BpIiwKICAgICAgICAgICAgIi9wcm9jL2tjb3JlIiwKICAgICAgICAgICAgIi9wcm9jL2tleXMiLAogICAgICAgICAgICAiL3Byb2MvbGF0ZW5jeV9zdGF0cyIsCiAgICAgICAgICAgICIvcHJvYy90aW1lcl9saXN0IiwKICAgICAgICAgICAgIi9wcm9jL3RpbWVyX3N0YXRzIiwKICAgICAgICAgICAgIi9wcm9jL3NjaGVkX2RlYnVnIiwKICAgICAgICAgICAgIi9wcm9jL3Njc2kiLAogICAgICAgICAgICAiL3N5cy9maXJtd2FyZSIKICAgICAgICAgIF0sCiAgICAgICAgICAiUmVhZG9ubHlQYXRocyI6IFsKICAgICAgICAgICAgIi9wcm9jL2Fzb3VuZCIsCiAgICAgICAgICAgICIvcHJvYy9idXMiLAogICAgICAgICAgICAiL3Byb2MvZnMiLAogICAgICAgICAgICAiL3Byb2MvaXJxIiwKICAgICAgICAgICAgIi9wcm9jL3N5cyIsCiAgICAgICAgICAgICIvcHJvYy9zeXNycS10cmlnZ2VyIgogICAgICAgICAgXSwKICAgICAgICAgICJEZXZpY2VzIjogW10sCiAgICAgICAgICAiU3lzY3RsIjogewogICAgICAgICAgICAibmV0LmlwdjQuaXBfdW5wcml2aWxlZ2VkX3BvcnRfc3RhcnQiOiAiMCIsCiAgICAgICAgICAgICJuZXQuaXB2NC5waW5nX2dyb3VwX3JhbmdlIjogIjAgMjE0NzQ4MzY0NyIKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0sCiAgICAgICJzdG9yYWdlcyI6IFsKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoMCkiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXIwKSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogIm92ZXJsYXlmcyIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAiZnVzZTMua2F0YS1vdmVybGF5IiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiNGQwNjUzZjdjN2UzZjQ5YjQ5MDA2YTlmNGU4MTNhYTExNjZjNTMyYTM0YTc2NTBhZmE2ZmFhNTIyNmYxZWM1ZiIsCiAgICAgICAgICAgICJiZDViYjM4NzA5ZDI5NDNhMzZhMDJlNDU0ZTM0ZDNkNmNhYTIzODVmYjE0MGQ3ZjE3OTdmZDBhMjdhOTM3ZGRiIgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGNwYXRoKS8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJsb2NhbCIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAibG9jYWwiLAogICAgICAgICAgImZzdHlwZSI6ICJsb2NhbCIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIm1vZGU9MDc3NyIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiXiQoY3BhdGgpLyQoc2FuZGJveC1pZCkvbG9jYWwvZGF0YSQiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0KICAgICAgXSwKICAgICAgImRldmljZXMiOiBbXSwKICAgICAgInNhbmRib3hfcGlkbnMiOiBmYWxzZSwKICAgICAgImV4ZWNfY29tbWFuZHMiOiBbXSwKICAgICAgImVudl9tYXAiOiB7CiAgICAgICAgIkhPU1ROQU1FIjogIiQoaG9zdC1uYW1lKSIsCiAgICAgICAgIkpPQl9DT01QTEVUSU9OX0lOREVYIjogIjAiLAogICAgICAgICJQQVRIIjogIi91c3IvbG9jYWwvc2JpbjovdXNyL2xvY2FsL2JpbjovdXNyL3NiaW46L3Vzci9iaW46L3NiaW46L2JpbiIKICAgICAgfQogICAgfQogIF0sCiAgImNvbW1vbiI6IHsKICAgICJjcGF0aCI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zaGFyZWQvY29udGFpbmVycyIsCiAgICAibW91bnRfc291cmNlX2NwYXRoIjogIi9ydW4va2F0YS1jb250YWluZXJzL3NoYXJlZC9jb250YWluZXJzIiwKICAgICJzZnByZWZpeCI6ICJeJChjcGF0aCkvJChidW5kbGUtaWQpLVthLXowLTldezE2fS0iLAogICAgInNwYXRoIjogIi9ydW4va2F0YS1jb250YWluZXJzL3NhbmRib3gvc3RvcmFnZSIsCiAgICAiaXB2NF9hIjogIigoWzAtOV18WzEtOV1bMC05XXwxWzAtOV17Mn18MlswLTRdWzAtOV18MjVbMC01XSlcXC4pezN9KFswLTldfFsxLTldWzAtOV18MVswLTldezJ9fDJbMC00XVswLTldfDI1WzAtNV0pIiwKICAgICJpcF9wIjogIlswLTldezEsNX0iLAogICAgInN2Y19uYW1lIjogIltBLVpfXFwuXFwtXSsiLAogICAgImRuc19sYWJlbCI6ICJbYS16QS1aMC05X1xcLlxcLV0rIiwKICAgICJzX3NvdXJjZTEiOiAiXi4uMlswLTldezN9X1swLTFdWzAtOV1fWzAtM11bMC05XV9bMC0yXVswLTldX1swLTVdWzAtOV1fWzAtNV1bMC05XVxcLlswLTldezEsMTB9JCIsCiAgICAic19zb3VyY2UyIjogIl4uLmRhdGEvIiwKICAgICJkbnNfc3ViZG9tYWluIjogIl5bYS16MC05XShbLWEtejAtOV0qW2EtejAtOV0pPyQiLAogICAgInBvZF91aWQiOiAiXlswLTlhLWZBLUZdezh9LVswLTlhLWZBLUZdezR9LVswLTlhLWZBLUZdezR9LVswLTlhLWZBLUZdezR9LVswLTlhLWZBLUZdezEyfSQiLAogICAgImRlZmF1bHRfY2FwcyI6IFsKICAgICAgIkNBUF9DSE9XTiIsCiAgICAgICJDQVBfREFDX09WRVJSSURFIiwKICAgICAgIkNBUF9GU0VUSUQiLAogICAgICAiQ0FQX0ZPV05FUiIsCiAgICAgICJDQVBfTUtOT0QiLAogICAgICAiQ0FQX05FVF9SQVciLAogICAgICAiQ0FQX1NFVEdJRCIsCiAgICAgICJDQVBfU0VUVUlEIiwKICAgICAgIkNBUF9TRVRGQ0FQIiwKICAgICAgIkNBUF9TRVRQQ0FQIiwKICAgICAgIkNBUF9ORVRfQklORF9TRVJWSUNFIiwKICAgICAgIkNBUF9TWVNfQ0hST09UIiwKICAgICAgIkNBUF9LSUxMIiwKICAgICAgIkNBUF9BVURJVF9XUklURSIKICAgIF0sCiAgICAicHJpdmlsZWdlZF9jYXBzIjogWwogICAgICAiQ0FQX0NIT1dOIiwKICAgICAgIkNBUF9EQUNfT1ZFUlJJREUiLAogICAgICAiQ0FQX0RBQ19SRUFEX1NFQVJDSCIsCiAgICAgICJDQVBfRk9XTkVSIiwKICAgICAgIkNBUF9GU0VUSUQiLAogICAgICAiQ0FQX0tJTEwiLAogICAgICAiQ0FQX1NFVEdJRCIsCiAgICAgICJDQVBfU0VUVUlEIiwKICAgICAgIkNBUF9TRVRQQ0FQIiwKICAgICAgIkNBUF9MSU5VWF9JTU1VVEFCTEUiLAogICAgICAiQ0FQX05FVF9CSU5EX1NFUlZJQ0UiLAogICAgICAiQ0FQX05FVF9CUk9BRENBU1QiLAogICAgICAiQ0FQX05FVF9BRE1JTiIsCiAgICAgICJDQVBfTkVUX1JBVyIsCiAgICAgICJDQVBfSVBDX0xPQ0siLAogICAgICAiQ0FQX0lQQ19PV05FUiIsCiAgICAgICJDQVBfU1lTX01PRFVMRSIsCiAgICAgICJDQVBfU1lTX1JBV0lPIiwKICAgICAgIkNBUF9TWVNfQ0hST09UIiwKICAgICAgIkNBUF9TWVNfUFRSQUNFIiwKICAgICAgIkNBUF9TWVNfUEFDQ1QiLAogICAgICAiQ0FQX1NZU19BRE1JTiIsCiAgICAgICJDQVBfU1lTX0JPT1QiLAogICAgICAiQ0FQX1NZU19OSUNFIiwKICAgICAgIkNBUF9TWVNfUkVTT1VSQ0UiLAogICAgICAiQ0FQX1NZU19USU1FIiwKICAgICAgIkNBUF9TWVNfVFRZX0NPTkZJRyIsCiAgICAgICJDQVBfTUtOT0QiLAogICAgICAiQ0FQX0xFQVNFIiwKICAgICAgIkNBUF9BVURJVF9XUklURSIsCiAgICAgICJDQVBfQVVESVRfQ09OVFJPTCIsCiAgICAgICJDQVBfU0VURkNBUCIsCiAgICAgICJDQVBfTUFDX09WRVJSSURFIiwKICAgICAgIkNBUF9NQUNfQURNSU4iLAogICAgICAiQ0FQX1NZU0xPRyIsCiAgICAgICJDQVBfV0FLRV9BTEFSTSIsCiAgICAgICJDQVBfQkxPQ0tfU1VTUEVORCIsCiAgICAgICJDQVBfQVVESVRfUkVBRCIsCiAgICAgICJDQVBfUEVSRk1PTiIsCiAgICAgICJDQVBfQlBGIiwKICAgICAgIkNBUF9DSEVDS1BPSU5UX1JFU1RPUkUiCiAgICBdLAogICAgInZpcnRpb19ibGtfc3RvcmFnZV9jbGFzc2VzIjogWwogICAgICAiY2MtbG9jYWwtY3NpIiwKICAgICAgImNjLW1hbmFnZWQtY3NpIiwKICAgICAgImNjLW1hbmFnZWQtcHJlbWl1bS1jc2kiCiAgICBdLAogICAgInNtYl9zdG9yYWdlX2NsYXNzZXMiOiBbCiAgICAgIHsKICAgICAgICAibmFtZSI6ICJhenVyZWZpbGUtY3NpLWthdGEtY2MiLAogICAgICAgICJtb3VudF9vcHRpb25zIjogWwogICAgICAgICAgImRpcl9tb2RlPTA3NzciLAogICAgICAgICAgImZpbGVfbW9kZT0wNzc3IiwKICAgICAgICAgICJtZnN5bWxpbmtzIiwKICAgICAgICAgICJjYWNoZT1zdHJpY3QiLAogICAgICAgICAgIm5vc2hhcmVzb2NrIiwKICAgICAgICAgICJhY3RpbWVvPTMwIiwKICAgICAgICAgICJub2JybCIKICAgICAgICBdCiAgICAgIH0KICAgIF0KICB9LAogICJzYW5kYm94IjogewogICAgInN0b3JhZ2VzIjogWwogICAgICB7CiAgICAgICAgImRyaXZlciI6ICJlcGhlbWVyYWwiLAogICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICJzb3VyY2UiOiAic2htIiwKICAgICAgICAiZnN0eXBlIjogInRtcGZzIiwKICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAibm9kZXYiLAogICAgICAgICAgIm1vZGU9MTc3NyIsCiAgICAgICAgICAic2l6ZT02NzEwODg2NCIKICAgICAgICBdLAogICAgICAgICJtb3VudF9wb2ludCI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L3NobSIsCiAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICB9CiAgICBdCiAgfSwKICAicmVxdWVzdF9kZWZhdWx0cyI6IHsKICAgICJDcmVhdGVDb250YWluZXJSZXF1ZXN0IjogewogICAgICAiYWxsb3dfZW52X3JlZ2V4IjogWwogICAgICAgICJeSE9TVE5BTUU9JChkbnNfbGFiZWwpJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9QT1JUXyQoaXBfcClfVENQPXRjcDovLyQoaXB2NF9hKTokKGlwX3ApJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9QT1JUXyQoaXBfcClfVENQX1BST1RPPXRjcCQiLAogICAgICAgICJeJChzdmNfbmFtZSlfUE9SVF8kKGlwX3ApX1RDUF9QT1JUPSQoaXBfcCkkIiwKICAgICAgICAiXiQoc3ZjX25hbWUpX1BPUlRfJChpcF9wKV9UQ1BfQUREUj0kKGlwdjRfYSkkIiwKICAgICAgICAiXiQoc3ZjX25hbWUpX1NFUlZJQ0VfSE9TVD0kKGlwdjRfYSkkIiwKICAgICAgICAiXiQoc3ZjX25hbWUpX1NFUlZJQ0VfUE9SVD0kKGlwX3ApJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9TRVJWSUNFX1BPUlRfJChkbnNfbGFiZWwpPSQoaXBfcCkkIiwKICAgICAgICAiXiQoc3ZjX25hbWUpX1BPUlQ9dGNwOi8vJChpcHY0X2EpOiQoaXBfcCkkIiwKICAgICAgICAiXkFaVVJFX0NMSUVOVF9JRD1bQS1GYS1mMC05LV0qJCIsCiAgICAgICAgIl5BWlVSRV9URU5BTlRfSUQ9W0EtRmEtZjAtOS1dKiQiLAogICAgICAgICJeQVpVUkVfRkVERVJBVEVEX1RPS0VOX0ZJTEU9L3Zhci9ydW4vc2VjcmV0cy9henVyZS90b2tlbnMvYXp1cmUtaWRlbnRpdHktdG9rZW4kIiwKICAgICAgICAiXkFaVVJFX0FVVEhPUklUWV9IT1NUPWh0dHBzOi8vbG9naW5cXC5taWNyb3NvZnRvbmxpbmVcXC5jb20vJCIsCiAgICAgICAgIl5URVJNPXh0ZXJtJCIKICAgICAgXSwKICAgICAgImFsbG93X2Vudl9yZWdleF9tYXAiOiB7CiAgICAgICAgIkNQVV9MSU1JVCI6ICJeWzAtOV0rJCIsCiAgICAgICAgIkpPQl9DT01QTEVUSU9OX0lOREVYIjogIl5bMC05XSokIiwKICAgICAgICAiTUVNT1JZX0xJTUlUIjogIl5bMC05XSskIgogICAgICB9CiAgICB9LAogICAgIkNvcHlGaWxlUmVxdWVzdCI6IFsKICAgICAgIiQoc2ZwcmVmaXgpIgogICAgXSwKICAgICJFeGVjUHJvY2Vzc1JlcXVlc3QiOiB7CiAgICAgICJhbGxvd2VkX2NvbW1hbmRzIjogW10sCiAgICAgICJyZWdleCI6IFtdCiAgICB9LAogICAgIlVwZGF0ZVJvdXRlc1JlcXVlc3QiOiB7CiAgICAgICJmb3JiaWRkZW5fZGV2aWNlX25hbWVzIjogWwogICAgICAgICJsbyIKICAgICAgXSwKICAgICAgImZvcmJpZGRlbl9zb3VyY2VfcmVnZXgiOiBbCiAgICAgICAgIl4oPzowezAsNH06KXswLDd9MHswLDN9MSQiLAogICAgICAgICJeMTI3XFwuKD86WzAtOV17MSwzfVxcLil7Mn1bMC05XXsxLDN9JCIKICAgICAgXQogICAgfSwKICAgICJVcGRhdGVJbnRlcmZhY2VSZXF1ZXN0IjogewogICAgICAiYWxsb3dfcmF3X2ZsYWdzIjogMTI4LAogICAgICAiZm9yYmlkZGVuX25hbWVzIjogWwogICAgICAgICJsbyIKICAgICAgXSwKICAgICAgImZvcmJpZGRlbl9od19hZGRycyI6IFsKICAgICAgICAiMDA6MDA6MDA6MDA6MDA6MDAiCiAgICAgIF0KICAgIH0sCiAgICAiQ2xvc2VTdGRpblJlcXVlc3QiOiBmYWxzZSwKICAgICJSZWFkU3RyZWFtUmVxdWVzdCI6IGZhbHNlLAogICAgIlVwZGF0ZUVwaGVtZXJhbE1vdW50c1JlcXVlc3QiOiBmYWxzZSwKICAgICJXcml0ZVN0cmVhbVJlcXVlc3QiOiBmYWxzZQogIH0KfQ== + creationTimestamp: ~ + generateName: indexed-job-0- + labels: + controller-uid: e239ff37-c75a-4f25-bac6-e2335502f4ef + job: indexed-job + job-name: indexed-job + managedFields: + - apiVersion: v1 + fieldsType: FieldsV1 + fieldsV1: + "f:metadata": + "f:annotations": + ".": {} + "f:batch.kubernetes.io/job-completion-index": {} + "f:generateName": {} + "f:labels": + ".": {} + "f:controller-uid": {} + "f:job": {} + "f:job-name": {} + "f:ownerReferences": + ".": {} + "k:{\"uid\":\"e239ff37-c75a-4f25-bac6-e2335502f4ef\"}": {} + "f:spec": + "f:containers": + "k:{\"name\":\"c\"}": + ".": {} + "f:command": {} + "f:env": + ".": {} + "k:{\"name\":\"JOB_COMPLETION_INDEX\"}": + ".": {} + "f:name": {} + "f:valueFrom": + ".": {} + "f:fieldRef": {} + "f:image": {} + "f:imagePullPolicy": {} + "f:name": {} + "f:resources": {} + "f:securityContext": {} + "f:terminationMessagePath": {} + "f:terminationMessagePolicy": {} + "f:volumeMounts": + ".": {} + "k:{\"mountPath\":\"/data\"}": + ".": {} + "f:mountPath": {} + "f:name": {} + "f:dnsPolicy": {} + "f:enableServiceLinks": {} + "f:hostname": {} + "f:restartPolicy": {} + "f:schedulerName": {} + "f:securityContext": {} + "f:terminationGracePeriodSeconds": {} + "f:volumes": + ".": {} + "k:{\"name\":\"data\"}": + ".": {} + "f:emptyDir": {} + "f:name": {} + manager: kube-controller-manager + operation: Update + time: "2023-06-20T21:22:55Z" + namespace: job-4436 +spec: + containers: + - command: + - /bin/sh + env: + - name: JOB_COMPLETION_INDEX + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: "metadata.annotations['batch.kubernetes.io/job-completion-index']" + image: "registry.k8s.io/e2e-test-images/busybox:1.29-2" + imagePullPolicy: IfNotPresent + name: c + resources: {} + securityContext: {} + terminationMessagePath: /dev/termination-log + terminationMessagePolicy: File + volumeMounts: + - mountPath: /data + name: data + - mountPath: /var/run/secrets/kubernetes.io/serviceaccount + name: kube-api-access-gck5t + readOnly: true + dnsPolicy: ClusterFirst + enableServiceLinks: true + hostname: indexed-job-0 + preemptionPolicy: PreemptLowerPriority + priority: 0 + restartPolicy: Never + runtimeClassName: kata-cc + schedulerName: default-scheduler + securityContext: {} + serviceAccount: default + serviceAccountName: default + terminationGracePeriodSeconds: 30 + tolerations: + - effect: NoExecute + key: node.kubernetes.io/not-ready + operator: Exists + tolerationSeconds: 300 + - effect: NoExecute + key: node.kubernetes.io/unreachable + operator: Exists + tolerationSeconds: 300 + volumes: + - emptyDir: {} + name: data + - name: kube-api-access-gck5t + projected: + defaultMode: 420 + sources: + - serviceAccountToken: + expirationSeconds: 3607 + path: token + - configMap: + items: + - key: ca.crt + path: ca.crt + name: kube-root-ca.crt + - downwardAPI: + items: + - fieldRef: + apiVersion: v1 + fieldPath: metadata.namespace + path: namespace +status: {} diff --git a/src/agent/samples/policy/yaml/webhook2/webhook-pod13.yaml b/src/agent/samples/policy/yaml/webhook2/webhook-pod13.yaml new file mode 100644 index 000000000000..52d75fc34c46 --- /dev/null +++ b/src/agent/samples/policy/yaml/webhook2/webhook-pod13.yaml @@ -0,0 +1,140 @@ +--- +apiVersion: v1 +kind: Namespace +metadata: + name: sched-preemption-path-7666 +--- +apiVersion: scheduling.k8s.io/v1 +kind: PriorityClass +metadata: + name: p3 + namespace: sched-preemption-path-7666 +value: 3 +description: This priority class should be used for pods. +--- +apiVersion: v1 +kind: Pod +metadata: + creationTimestamp: ~ + generateName: rs-pod3- + labels: + name: pod3 + managedFields: + - apiVersion: v1 + fieldsType: FieldsV1 + fieldsV1: + "f:metadata": + "f:generateName": {} + "f:labels": + ".": {} + "f:name": {} + "f:ownerReferences": + ".": {} + "k:{\"uid\":\"8731d744-5c72-4c5a-ac05-69bea5d97101\"}": {} + "f:spec": + "f:containers": + "k:{\"name\":\"pod3\"}": + ".": {} + "f:image": {} + "f:imagePullPolicy": {} + "f:name": {} + "f:resources": + ".": {} + "f:limits": + ".": {} + "f:example.com/fakecpu": {} + "f:requests": + ".": {} + "f:example.com/fakecpu": {} + "f:securityContext": + ".": {} + "f:allowPrivilegeEscalation": {} + "f:capabilities": + ".": {} + "f:drop": {} + "f:terminationMessagePath": {} + "f:terminationMessagePolicy": {} + "f:dnsPolicy": {} + "f:enableServiceLinks": {} + "f:nodeSelector": {} + "f:priorityClassName": {} + "f:restartPolicy": {} + "f:schedulerName": {} + "f:securityContext": + ".": {} + "f:runAsNonRoot": {} + "f:runAsUser": {} + "f:seccompProfile": + ".": {} + "f:type": {} + "f:terminationGracePeriodSeconds": {} + manager: kube-controller-manager + operation: Update + time: "2023-06-20T21:28:16Z" + namespace: sched-preemption-path-7666 + annotations: + io.katacontainers.config.agent.policy: IyBDb3B5cmlnaHQgKGMpIDIwMjMgTWljcm9zb2Z0IENvcnBvcmF0aW9uCiMKIyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMAojCnBhY2thZ2UgYWdlbnRfcG9saWN5CgppbXBvcnQgZnV0dXJlLmtleXdvcmRzLmluCmltcG9ydCBmdXR1cmUua2V5d29yZHMuZXZlcnkKCiMgRGVmYXVsdCB2YWx1ZXMsIHJldHVybmVkIGJ5IE9QQSB3aGVuIHJ1bGVzIGNhbm5vdCBiZSBldmFsdWF0ZWQgdG8gdHJ1ZS4KZGVmYXVsdCBBZGRBUlBOZWlnaGJvcnNSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgQWRkU3dhcFJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBDbG9zZVN0ZGluUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IENvcHlGaWxlUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IENyZWF0ZUNvbnRhaW5lclJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBDcmVhdGVTYW5kYm94UmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IERlc3Ryb3lTYW5kYm94UmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgRXhlY1Byb2Nlc3NSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgR2V0T09NRXZlbnRSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBHdWVzdERldGFpbHNSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBMaXN0SW50ZXJmYWNlc1JlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBMaXN0Um91dGVzUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IE1lbUhvdHBsdWdCeVByb2JlUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IE9ubGluZUNQVU1lbVJlcXVlc3QgOj0gdHJ1ZQpkZWZhdWx0IFBhdXNlQ29udGFpbmVyUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFJlYWRTdHJlYW1SZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgUmVtb3ZlQ29udGFpbmVyUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgUmVtb3ZlU3RhbGVWaXJ0aW9mc1NoYXJlTW91bnRzUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgUmVzZWVkUmFuZG9tRGV2UmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFJlc3VtZUNvbnRhaW5lclJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBTZXRHdWVzdERhdGVUaW1lUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFNldFBvbGljeVJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBTaWduYWxQcm9jZXNzUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgU3RhcnRDb250YWluZXJSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBTdGFydFRyYWNpbmdSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgU3RhdHNDb250YWluZXJSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBTdG9wVHJhY2luZ1JlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBUdHlXaW5SZXNpemVSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBVcGRhdGVDb250YWluZXJSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgVXBkYXRlRXBoZW1lcmFsTW91bnRzUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFVwZGF0ZUludGVyZmFjZVJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBVcGRhdGVSb3V0ZXNSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgV2FpdFByb2Nlc3NSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBXcml0ZVN0cmVhbVJlcXVlc3QgOj0gZmFsc2UKCiMgQWxsb3dSZXF1ZXN0c0ZhaWxpbmdQb2xpY3kgOj0gdHJ1ZSBjb25maWd1cmVzIHRoZSBBZ2VudCB0byAqYWxsb3cgYW55CiMgcmVxdWVzdHMgY2F1c2luZyBhIHBvbGljeSBmYWlsdXJlKi4gVGhpcyBpcyBhbiB1bnNlY3VyZSBjb25maWd1cmF0aW9uCiMgYnV0IGlzIHVzZWZ1bCBmb3IgYWxsb3dpbmcgdW5zZWN1cmUgcG9kcyB0byBzdGFydCwgdGhlbiBjb25uZWN0IHRvCiMgdGhlbSBhbmQgaW5zcGVjdCBPUEEgbG9ncyBmb3IgdGhlIHJvb3QgY2F1c2Ugb2YgYSBmYWlsdXJlLgpkZWZhdWx0IEFsbG93UmVxdWVzdHNGYWlsaW5nUG9saWN5IDo9IGZhbHNlCgojIENvbnN0YW50cwpTX05BTUVfS0VZID0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZSIKU19OQU1FU1BBQ0VfS0VZID0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZXNwYWNlIgpCVU5ETEVfSUQgPSAiW2EtejAtOV17NjR9IgoKQ3JlYXRlQ29udGFpbmVyUmVxdWVzdDo9IHJlc3AgewogICAgbm90IGlzX251bGwoaW5wdXQuZW52X21hcCkKICAgIAogICAgaV9lbnZfbWFwIDo9IGlucHV0LmVudl9tYXAKICAgIAogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBwX2Vudl9tYXAgOj0gcF9jb250YWluZXIuZW52X21hcCAgCiAgICBhbGxvd19lbnZfbWFwKHBfZW52X21hcCwgaV9lbnZfbWFwKQogICAgCiAgICBpX3Byb2Nlc3MgOj0gaW5wdXQuYmFzZS5PQ0kuUHJvY2VzcwogICAgCiAgICBwX3Byb2Nlc3MgOj0gcF9jb250YWluZXIuT0NJLlByb2Nlc3MKICAgIAogICAgYWxsb3dfYXJncyhpX3Byb2Nlc3MsIHBfcHJvY2VzcywgaV9lbnZfbWFwKQoKICAgIHJlc3AgPSBDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uKGlucHV0LmJhc2UpCiAgICBwcmludCgiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdDogdHJ1ZSIpCn0KCmFsbG93X2FyZ3MoaV9wcm9jZXNzLCBwX3Byb2Nlc3MsIGlfZW52X21hcCkgewogICAgaV9hcmdzIDo9IGlfcHJvY2Vzcy5BcmdzCiAgICBwX2FyZ3MgOj0gcF9wcm9jZXNzLkFyZ3MKICAgIHByaW50KCJhbGxvd19hcmdzOiBpX2FyZ3MgPSIsIGlfYXJncywgInBfYXJncyA9IiwgcF9hcmdzKQogICAgY291bnQoaV9hcmdzKSA9PSBjb3VudChwX2FyZ3MpCiAgICBldmVyeSBpLCBpX2FyZyBpbiBpX2FyZ3MgewogICAgICAgIHByaW50KCJhbGxvd19hcmdzOiBpX2FyZyA9IiwgaV9hcmcpCiAgICAgICAgcF9hcmdfcmVwbGFjZWQgOj0gcmVwbGFjZV9lbnZfdmFyaWFibGVzKHBfYXJnc1tpXSwgaV9lbnZfbWFwKQogICAgICAgIHByaW50KCJhbGxvd19hcmdzOiBwX2FyZ19yZXBsYWNlZCA9IiwgcF9hcmdfcmVwbGFjZWQpCiAgICAgICAgcF9hcmdfcmVwbGFjZWQyIDo9IHJlcGxhY2UocF9hcmdfcmVwbGFjZWQsICIkJCIsICIkIikKICAgICAgICBwcmludCgiYWxsb3dfYXJnczogcF9hcmdfcmVwbGFjZWQyID0iLCBwX2FyZ19yZXBsYWNlZDIpCiAgICAgICAgaV9hcmcgPT0gcF9hcmdfcmVwbGFjZWQyCiAgICB9CiAgICBwcmludCgiYWxsb3dfYXJnczogdHJ1ZSIpCn0KCmFsbG93X2FyZ3MoaV9wcm9jZXNzLCBwX3Byb2Nlc3MsIGlfZW52X21hcCkgewogICAgbm90IGlfcHJvY2Vzcy5BcmdzCiAgICBub3QgcF9wcm9jZXNzLkFyZ3MKICAgIHByaW50KCJhbGxvd19hcmdzMjogbm8gYXJncyIpCn0KCiMgdGhpcyBmdW5jdGlvbiByZXBsYWNlcyBhbGwgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyBpbiBhIHN0cmluZywgZ2l2ZW4gYSBtYXAgb2YgZW52aXJvbm1lbnQga2V5cyB0byBlbnZpcm9ubWVudCB2YWx1ZXMKIyBlZyBzdHIgPSAiZWNobyAkKENMVVNURVJfSUQpOyBlY2hvICQoTk9ERV9OQU1FKTsiCiMgZW52X21hcCA9IHsiQ0xVU1RFUl9JRCI6ICJhYmMiLCAiTk9ERV9OQU1FIiA6ICJ4eXoifQojIHJlc3VsdCA9ICJlY2hvIGFiYzsgZWNobyB4eXo7IgpyZXBsYWNlX2Vudl92YXJpYWJsZXMoc3RyLCBlbnZfbWFwKSA9IHJlc3VsdCB7CiAgICAjIG1ha2UgYW4gYXJyYXkgb2YgdGhlIGtleXMgZWcgWyJDTFVTVEVSX0lEIiwgIk5PREVfTkFNRSJdCiAgICBrZXlzIDo9IFt4IHwgc29tZSB4IGluIG9iamVjdC5rZXlzKGVudl9tYXApXQogICAgcmVzdWx0IDo9IHJlcGxhY2Vfc3RyX3JlYyhzdHIsIGVudl9tYXAsIGtleXMsIGNvdW50KGtleXMpIC0gMSkKfQoKIyBiYXNlIGNhc2UKcmVwbGFjZV9zdHJfcmVjKHN0ciwgZW52X21hcCwgYXJyX2tleXMsIGkpID0gcmVzdWx0IHsKICAgIGkgPCAwCiAgICByZXN1bHQgOj0gc3RyCn0KCiMgcmVjdXJzaXZlIHN0ZXAKcmVwbGFjZV9zdHJfcmVjKHN0ciwgZW52X21hcCwgYXJyX2tleXMsIGkpID0gcmVzdWx0IHsKICAgIGkgPj0gMAogICAga2V5IDo9IGFycl9rZXlzW2ldCiAgICBlbnZfa2V5MSA6PSBjb25jYXQoIiIsIFsiJCgiLCBrZXksICIpIl0pCiAgICAjIHJlcGxhY2UgJChWQVIpIHdpdGggdmFsdWUKICAgIG5ld19zdHIxIDo9IHJlcGxhY2Uoc3RyLCBlbnZfa2V5MSwgZW52X21hcFtrZXldKQogICAgIyByZXBsYWNlIG5leHQgZW52aXJvbm1lbnQgdmFyaWFibGUKICAgIHJlc3VsdCA9IHJlcGxhY2Vfc3RyX3JlYyhuZXdfc3RyMSwgZW52X21hcCwgYXJyX2tleXMsIGkgLSAxKQp9CgphbGxvd19lbnZfbWFwKHBfZW52X21hcCwgaV9lbnZfbWFwKSB7CiAgICBwcmludCgiYWxsb3dfZW52X21hcDogcF9lbnZfbWFwID0iLCBwX2Vudl9tYXApCiAgICBldmVyeSBlbnZfa2V5LCBlbnZfdmFsIGluIGlfZW52X21hcCB7CiAgICAgICAgcHJpbnQoImFsbG93X2VudjogZW52X2tleSA9IiwgZW52X2tleSwgImVudl92YWwgPSIsIGVudl92YWwpCiAgICAgICAgYWxsb3dfZW52X21hcF9lbnRyeShlbnZfa2V5LCBlbnZfdmFsLCBwX2Vudl9tYXApCiAgICB9CiAgICBwcmludCgiYWxsb3dfZW52X21hcDogdHJ1ZSIpCn0KCiMgQWxsb3cgZXhhY3QgbWF0Y2gKYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBpX3ZhbCA9PSBwX3ZhbAogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnk6IHRydWUiKQp9CgojIEFsbG93IHJlc291cmNlRmllbGRSZWYgdmFsdWVzIChlLmcuLCAibGltaXRzLmNwdSIpLgphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgICMgYSB2YXJpYWJsZSB3ZSBzaG91bGQgYmUgdmFsaWRhdGluZyB1c2luZyBhIHJlZ2V4IGZyb20gc2V0dGluZ3MKICAgIHBfdmFsID09ICIkKHZhbGlkYXRlLWZyb20tc2V0dGluZ3MpIgogICAgcmVnZXhfdmFsIDo9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuQ3JlYXRlQ29udGFpbmVyUmVxdWVzdC5hbGxvd19lbnZfcmVnZXhfbWFwW2tleV0KICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4X3ZhbCwgaV92YWwpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSAyOiB0cnVlIikKfQoKIyBBbGxvdyBub2RlLW5hbWUKYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChub2RlLW5hbWUpIgogICAgcmVnZXgubWF0Y2gocG9saWN5X2RhdGEuY29tbW9uLmRuc19zdWJkb21haW4gLCBpX3ZhbCkKICAgIHByaW50KCJhbGxvd19lbnZfbWFwX2VudHJ5IDM6IHRydWUiKQp9CgojIEFsbG93IGhvc3QtbmFtZQphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgIHBfdmFsID09ICIkKGhvc3QtbmFtZSkiCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24uZG5zX2xhYmVsICwgaV92YWwpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSA0OiB0cnVlIikKfQoKIyBBbGxvdyBwb2QtdWlkCmFsbG93X2Vudl9tYXBfZW50cnkoa2V5LCBpX3ZhbCwgcF9lbnZfbWFwKSB7CiAgICBwX3ZhbCA6PSBwX2Vudl9tYXBba2V5XQogICAgcF92YWwgPT0gIiQocG9kLXVpZCkiCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24ucG9kX3VpZCAsIGlfdmFsKQogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgNTogdHJ1ZSIpCn0KCiMgQWxsb3cgZmllbGRSZWYgImZpZWxkUGF0aDogc3RhdHVzLnBvZElQIiB2YWx1ZXMuCmFsbG93X2Vudl9tYXBfZW50cnkoa2V5LCBpX3ZhbCwgcF9lbnZfbWFwKSB7CiAgICBpc19pcChpX3ZhbCkKCiAgICBwX3ZhbCA6PSBwX2Vudl9tYXBba2V5XQogICAgcF92YXIgOj0gY29uY2F0KCI9IiwgW2tleSwgcF92YWxdKQogICAgYWxsb3dfcG9kX2lwX3ZhcihrZXksIHBfdmFyKQogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgNjogdHJ1ZSIpCn0KCiMgQWxsb3cgZmllbGRSZWYgImZpZWxkUGF0aDogc3RhdHVzLmhvc3RJUCIgdmFsdWVzLgphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgaXNfaXAoaV92YWwpCgogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgIHBfdmFyIDo9IGNvbmNhdCgiPSIsIFtrZXksIHBfdmFsXSkKICAgIGFsbG93X2hvc3RfaXBfdmFyKGtleSwgcF92YXIpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSA3OiB0cnVlIikKfQoKIyBNYXRjaCBpbnB1dCB3aXRoIG9uZSBvZiB0aGUgcG9saWN5IHZhcmlhYmxlcywgYWZ0ZXIgc3Vic3RpdHV0aW5nICQoc2FuZGJveC1uYW1lKS4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChzYW5kYm94LW5hbWUpIgogICAgc19uYW1lIDo9IGlucHV0LmJhc2UuT0NJLkFubm90YXRpb25zW1NfTkFNRV9LRVldCiAgICBwX3ZhcjIgOj0gcmVwbGFjZShwX3ZhbCwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHBfdmFyMiA9PSBpX3ZhbAogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgODogdHJ1ZSIpCn0KCiMgTWF0Y2ggaW5wdXQgd2l0aCBvbmUgb2YgdGhlIHBvbGljeSB2YXJpYWJsZXMsIGFmdGVyIHN1YnN0aXR1dGluZyAkKHNhbmRib3gtbmFtZXNwYWNlKS4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChzYW5kYm94LW5hbWVzcGFjZSkiCiAgICBzX25hbWVzcGFjZSA6PSBpbnB1dC5iYXNlLk9DSS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwX3ZhcjIgOj0gcmVwbGFjZShwX3ZhbCwgIiQoc2FuZGJveC1uYW1lc3BhY2UpIiwgc19uYW1lc3BhY2UpCiAgICBwX3ZhcjIgPT0gaV92YWwKICAgIHByaW50KCJhbGxvd19lbnZfbWFwX2VudHJ5IDk6IHRydWUiKQp9CgojIEFsbG93IGlucHV0IGVudiB2YXJpYWJsZXMgdGhhdCBtYXRjaCB3aXRoIGEgcmVxdWVzdF9kZWZhdWx0cyByZWdleC4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHNvbWUgcF9yZWdleDEgaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5DcmVhdGVDb250YWluZXJSZXF1ZXN0LmFsbG93X2Vudl9yZWdleAogICAgcF9yZWdleDIgOj0gcmVwbGFjZShwX3JlZ2V4MSwgIiQoaXB2NF9hKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcHY0X2EpCiAgICBwX3JlZ2V4MyA6PSByZXBsYWNlKHBfcmVnZXgyLCAiJChpcF9wKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcF9wKQogICAgcF9yZWdleDQgOj0gcmVwbGFjZShwX3JlZ2V4MywgIiQoc3ZjX25hbWUpIiwgcG9saWN5X2RhdGEuY29tbW9uLnN2Y19uYW1lKQogICAgcF9yZWdleDUgOj0gcmVwbGFjZShwX3JlZ2V4NCwgIiQoZG5zX2xhYmVsKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5kbnNfbGFiZWwpCgogICAgcmVzdWx0IDo9IGNvbmNhdCgiPSIsIFtrZXksIGlfdmFsXSkKICAgIHJlZ2V4Lm1hdGNoKHBfcmVnZXg1LCByZXN1bHQpCgogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgMTA6IHRydWUiKQp9CgpDcmVhdGVDb250YWluZXJSZXF1ZXN0Oj0gcmVzcCB7CiAgICBub3QgaW5wdXQuZW52X21hcAogICAgaV9wcm9jZXNzID0gaW5wdXQuT0NJLlByb2Nlc3MKICAgIHNfbmFtZSA9IGlucHV0Lk9DSS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBwX3Byb2Nlc3MgPSBwX2NvbnRhaW5lci5PQ0kuUHJvY2VzcwogICAgYWxsb3dfZGVwcmVjYXRlZF9hcmdzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUpCiAgICByZXNwID0gQ3JlYXRlQ29udGFpbmVyUmVxdWVzdENvbW1vbihpbnB1dCkKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0MjogdHJ1ZSIpCn0KCkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb24ocmVxKTo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgICMgQ2hlY2sgaWYgdGhlIGlucHV0IHJlcXVlc3Qgc2hvdWxkIGJlIHJlamVjdGVkIGV2ZW4gYmVmb3JlIGNoZWNraW5nIHRoZQogICAgIyBwb2xpY3lfZGF0YS5jb250YWluZXJzIGluZm9ybWF0aW9uLgogICAgYWxsb3dfY3JlYXRlX2NvbnRhaW5lcl9pbnB1dChyZXEpCgogICAgaV9vY2kgOj0gcmVxLk9DSQogICAgaV9zdG9yYWdlcyA6PSByZXEuc3RvcmFnZXMKICAgIGlfZGV2aWNlcyA6PSByZXEuZGV2aWNlcwoKICAgICMgYXJyYXkgb2YgcG9zc2libGUgc3RhdGUgb3BlcmF0aW9ucwogICAgb3BzX2J1aWxkZXIgOj0gW10KCiAgICAjIGNoZWNrIHNhbmRib3ggbmFtZQogICAgc2FuZGJveF9uYW1lID0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FX0tFWV0KICAgIGFkZF9zYW5kYm94X25hbWVfdG9fc3RhdGUgOj0gc3RhdGVfYWxsb3dzKCJzYW5kYm94X25hbWUiLCBzYW5kYm94X25hbWUpCiAgICBvcHNfYnVpbGRlcjEgOj0gY29uY2F0X29wX2lmX25vdF9udWxsKG9wc19idWlsZGVyLCBhZGRfc2FuZGJveF9uYW1lX3RvX3N0YXRlKQoKICAgICMgQ2hlY2sgaWYgYW55IGVsZW1lbnQgZnJvbSB0aGUgcG9saWN5X2RhdGEuY29udGFpbmVycyBhcnJheSBhbGxvd3MgdGhlIGlucHV0IHJlcXVlc3QuCiAgICBzb21lIHBfY29udGFpbmVyIGluIHBvbGljeV9kYXRhLmNvbnRhaW5lcnMKICAgIHByaW50KCI9PT09PT09PSBDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiB0cnlpbmcgbmV4dCBwb2xpY3kgY29udGFpbmVyIikKCiAgICBwX3BpZG5zIDo9IHBfY29udGFpbmVyLnNhbmRib3hfcGlkbnMKICAgIGlfcGlkbnMgOj0gcmVxLnNhbmRib3hfcGlkbnMKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiBwX3BpZG5zID0iLCBwX3BpZG5zLCAiaV9waWRucyA9IiwgaV9waWRucykKICAgIHBfcGlkbnMgPT0gaV9waWRucwoKICAgIHBfb2NpIDo9IHBfY29udGFpbmVyLk9DSQoKICAgICMgY2hlY2sgbmFtZXNwYWNlCiAgICBwX25hbWVzcGFjZSA6PSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBpX25hbWVzcGFjZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwcmludCAoIkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb246IHBfbmFtZXNwYWNlID0iLCBwX25hbWVzcGFjZSwgImlfbmFtZXNwYWNlID0iLCBpX25hbWVzcGFjZSkKICAgIGFkZF9uYW1lc3BhY2VfdG9fc3RhdGUgOj0gYWxsb3dfbmFtZXNwYWNlKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkKICAgIG9wc19idWlsZGVyMiA6PSBjb25jYXRfb3BfaWZfbm90X251bGwob3BzX2J1aWxkZXIxLCBhZGRfbmFtZXNwYWNlX3RvX3N0YXRlKQoKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiBwIFZlcnNpb24gPSIsIHBfb2NpLlZlcnNpb24sICJpIFZlcnNpb24gPSIsIGlfb2NpLlZlcnNpb24pCiAgICBwX29jaS5WZXJzaW9uID09IGlfb2NpLlZlcnNpb24KCiAgICBwcmludCgiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdENvbW1vbjogcCBSZWFkb25seSA9IiwgcF9vY2kuUm9vdC5SZWFkb25seSwgImkgUmVhZG9ubHkgPSIsIGlfb2NpLlJvb3QuUmVhZG9ubHkpCiAgICBwX29jaS5Sb290LlJlYWRvbmx5ID09IGlfb2NpLlJvb3QuUmVhZG9ubHkKCiAgICBhbGxvd19hbm5vKHBfb2NpLCBpX29jaSkKCiAgICBwX3N0b3JhZ2VzIDo9IHBfY29udGFpbmVyLnN0b3JhZ2VzCiAgICBhbGxvd19ieV9hbm5vKHBfb2NpLCBpX29jaSwgcF9zdG9yYWdlcywgaV9zdG9yYWdlcykKCiAgICBwX2RldmljZXMgOj0gcF9jb250YWluZXIuZGV2aWNlcwogICAgYWxsb3dfZGV2aWNlcyhwX2RldmljZXMsIGlfZGV2aWNlcykKCiAgICByZXQgOj0gYWxsb3dfbGludXgob3BzX2J1aWxkZXIyLCBwX29jaSwgaV9vY2kpCiAgICByZXQuYWxsb3dlZAoKICAgIG9wcyA6PSByZXQub3BzCgogICAgcHJpbnQoIkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb246IHRydWUiKQp9CgphbGxvd19jcmVhdGVfY29udGFpbmVyX2lucHV0KHJlcSkgewogICAgcHJpbnQoImFsbG93X2NyZWF0ZV9jb250YWluZXJfaW5wdXQ6IGlucHV0ID0iLCByZXEpCgogICAgY291bnQocmVxLnNoYXJlZF9tb3VudHMpID09IDAKICAgIGlzX251bGwocmVxLnN0cmluZ191c2VyKQoKICAgIGlfb2NpIDo9IHJlcS5PQ0kKICAgIGlzX251bGwoaV9vY2kuSG9va3MpCiAgICBpc19udWxsKGlfb2NpLlNvbGFyaXMpCiAgICBpc19udWxsKGlfb2NpLldpbmRvd3MpCgogICAgaV9saW51eCA6PSBpX29jaS5MaW51eAogICAgY291bnQoaV9saW51eC5HSURNYXBwaW5ncykgPT0gMAogICAgY291bnQoaV9saW51eC5Nb3VudExhYmVsKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlJlc291cmNlcy5EZXZpY2VzKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlJvb3Rmc1Byb3BhZ2F0aW9uKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlVJRE1hcHBpbmdzKSA9PSAwCiAgICBpc19udWxsKGlfbGludXguSW50ZWxSZHQpCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLkJsb2NrSU8pCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLk5ldHdvcmspCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLlBpZHMpCiAgICBpc19udWxsKGlfbGludXguU2VjY29tcCkKCiAgICBpX3Byb2Nlc3MgOj0gaV9vY2kuUHJvY2VzcwogICAgY291bnQoaV9wcm9jZXNzLlNlbGludXhMYWJlbCkgPT0gMAogICAgY291bnQoaV9wcm9jZXNzLlVzZXIuVXNlcm5hbWUpID09IDAKCiAgICBwcmludCgiYWxsb3dfY3JlYXRlX2NvbnRhaW5lcl9pbnB1dDogdHJ1ZSIpCn0KCmFsbG93X25hbWVzcGFjZShwX25hbWVzcGFjZSwgaV9uYW1lc3BhY2UpID0gYWRkX25hbWVzcGFjZSB7CiAgICBwX25hbWVzcGFjZSA9PSBpX25hbWVzcGFjZQogICAgYWRkX25hbWVzcGFjZSA6PSBudWxsCiAgICBwcmludCgiYWxsb3dfbmFtZXNwYWNlIDE6IGlucHV0IG5hbWVzcGFjZSBtYXRjaGVzIHBvbGljeSBkYXRhIikKfQoKYWxsb3dfbmFtZXNwYWNlKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkgPSBhZGRfbmFtZXNwYWNlIHsKICAgIHBfbmFtZXNwYWNlID09ICIiCiAgICBwcmludCgiYWxsb3dfbmFtZXNwYWNlIDI6IG5vIG5hbWVzcGFjZSBmb3VuZCBvbiBwb2xpY3kgZGF0YSIpCiAgICBhZGRfbmFtZXNwYWNlIDo9IHN0YXRlX2FsbG93cygibmFtZXNwYWNlIiwgaV9uYW1lc3BhY2UpCn0KCiMgdmFsdWUgaGFzbid0IGJlZW4gc2VlbiBiZWZvcmUsIHNhdmUgaXQgdG8gc3RhdGUKc3RhdGVfYWxsb3dzKGtleSwgdmFsdWUpID0gYWN0aW9uIHsKICBzdGF0ZSA6PSBnZXRfc3RhdGUoKQogIHByaW50KCJzdGF0ZV9hbGxvd3MgMTogc3RhdGVba2V5XSA9Iiwgc3RhdGVba2V5XSwgInZhbHVlID0iLCB2YWx1ZSkKICBub3Qgc3RhdGVba2V5XQogIHByaW50KCJzdGF0ZV9hbGxvd3MgMTogc2F2aW5nIHRvIHN0YXRlIGtleSA9Iiwga2V5LCAidmFsdWUgPSIsIHZhbHVlKQogIHBhdGggOj0gZ2V0X3N0YXRlX3BhdGgoa2V5KSAKICBhY3Rpb24gOj0gewogICAgIm9wIjogImFkZCIsCiAgICAicGF0aCI6IHBhdGgsIAogICAgInZhbHVlIjogdmFsdWUsCiAgfQp9CgojIHZhbHVlIG1hdGNoZXMgd2hhdCdzIGluIHN0YXRlLCBhbGxvdyBpdApzdGF0ZV9hbGxvd3Moa2V5LCB2YWx1ZSkgPSBhY3Rpb24gewogIHByaW50KCJzdGF0ZV9hbGxvd3MgMjogc3RhcnQiKQogIHN0YXRlIDo9IGdldF9zdGF0ZSgpCiAgcHJpbnQoInN0YXRlX2FsbG93cyAyOiBzdGF0ZVtrZXldID0iLCBzdGF0ZVtrZXldLCAidmFsdWUgPSIsIHZhbHVlKQogIHZhbHVlID09IHN0YXRlW2tleV0KICBwcmludCgic3RhdGVfYWxsb3dzIDI6IGZvdW5kIGtleSA9Iiwga2V5LCAidmFsdWUgPSIsIHZhbHVlLCAiIGluIHN0YXRlIikKICBhY3Rpb24gOj0gbnVsbAp9CgojIGhlbHBlciBmdW5jdGlvbnMgdG8gaW50ZXJhY3Qgd2l0aCB0aGUgc3RhdGUKZ2V0X3N0YXRlKCkgPSBzdGF0ZSB7CiAgc3RhdGUgOj0gZGF0YVsicHN0YXRlIl0KfQoKZ2V0X3N0YXRlX3ZhbChrZXkpID0gdmFsdWUgewogICAgc3RhdGUgOj0gZ2V0X3N0YXRlKCkKICAgIHZhbHVlIDo9IHN0YXRlW2tleV0KfQoKZ2V0X3N0YXRlX3BhdGgoa2V5KSA9IHBhdGggewogICAgIyBwcmVwZW5kICIvcHN0YXRlLyIgdG8ga2V5CiAgICBwYXRoIDo9IGNvbmNhdCgiLyIsIFsiL3BzdGF0ZSIsIGtleV0pCn0KCiMgSGVscGVyIGZ1bmN0aW9ucyB0byBjb25kaXRpb25hbGx5IGNvbmNhdGVuYXRlIG9wIGlzIG5vdCBudWxsCmNvbmNhdF9vcF9pZl9ub3RfbnVsbChvcHMsIG9wKSA9IHJlc3VsdCB7CiAgICBvcCA9PSBudWxsCiAgICByZXN1bHQgOj0gb3BzCn0KCmNvbmNhdF9vcF9pZl9ub3RfbnVsbChvcHMsIG9wKSA9IHJlc3VsdCB7CiAgICBvcCAhPSBudWxsCiAgICByZXN1bHQgOj0gYXJyYXkuY29uY2F0KG9wcywgW29wXSkKfQoKIyBSZWplY3QgdW5leHBlY3RlZCBhbm5vdGF0aW9ucy4KYWxsb3dfYW5ubyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19hbm5vIDE6IHN0YXJ0IikKCiAgICBub3QgaV9vY2kuQW5ub3RhdGlvbnMKCiAgICBwcmludCgiYWxsb3dfYW5ubyAxOiB0cnVlIikKfQphbGxvd19hbm5vKHBfb2NpLCBpX29jaSkgewogICAgcHJpbnQoImFsbG93X2Fubm8gMjogcCBBbm5vdGF0aW9ucyA9IiwgcF9vY2kuQW5ub3RhdGlvbnMpCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiBpIEFubm90YXRpb25zID0iLCBpX29jaS5Bbm5vdGF0aW9ucykKCiAgICBpX2tleXMgOj0gb2JqZWN0LmtleXMoaV9vY2kuQW5ub3RhdGlvbnMpCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiBpIGtleXMgPSIsIGlfa2V5cykKCiAgICBldmVyeSBpX2tleSBpbiBpX2tleXMgewogICAgICAgIGFsbG93X2Fubm9fa2V5KGlfa2V5LCBwX29jaSkKICAgIH0KCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiB0cnVlIikKfQoKYWxsb3dfYW5ub19rZXkoaV9rZXksIHBfb2NpKSB7CiAgICBwcmludCgiYWxsb3dfYW5ub19rZXkgMTogaSBrZXkgPSIsIGlfa2V5KQoKICAgIHN0YXJ0c3dpdGgoaV9rZXksICJpby5rdWJlcm5ldGVzLmNyaS4iKQoKICAgIHByaW50KCJhbGxvd19hbm5vX2tleSAxOiB0cnVlIikKfQphbGxvd19hbm5vX2tleShpX2tleSwgcF9vY2kpIHsKICAgIHByaW50KCJhbGxvd19hbm5vX2tleSAyOiBpIGtleSA9IiwgaV9rZXkpCgogICAgc29tZSBwX2tleSwgXyBpbiBwX29jaS5Bbm5vdGF0aW9ucwogICAgcF9rZXkgPT0gaV9rZXkKCiAgICBwcmludCgiYWxsb3dfYW5ub19rZXkgMjogdHJ1ZSIpCn0KCiMgR2V0IHRoZSB2YWx1ZSBvZiB0aGUgU19OQU1FX0tFWSBhbm5vdGF0aW9uIGFuZAojIGNvcnJlbGF0ZSBpdCB3aXRoIG90aGVyIGFubm90YXRpb25zIGFuZCBwcm9jZXNzIGZpZWxkcy4KYWxsb3dfYnlfYW5ubyhwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpIHsKICAgIHByaW50KCJhbGxvd19ieV9hbm5vIDE6IHN0YXJ0IikKCiAgICBub3QgcF9vY2kuQW5ub3RhdGlvbnNbU19OQU1FX0tFWV0KCiAgICBpX3NfbmFtZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMTogaV9zX25hbWUgPSIsIGlfc19uYW1lKQoKICAgIGlfc19uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FU1BBQ0VfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMTogaV9zX25hbWVzcGFjZSA9IiwgaV9zX25hbWVzcGFjZSkKCiAgICBhbGxvd19ieV9zYW5kYm94X25hbWUocF9vY2ksIGlfb2NpLCBwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBpX3NfbmFtZSwgaV9zX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfYnlfYW5ubyAxOiB0cnVlIikKfQphbGxvd19ieV9hbm5vKHBfb2NpLCBpX29jaSwgcF9zdG9yYWdlcywgaV9zdG9yYWdlcykgewogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMjogc3RhcnQiKQoKICAgIHBfc19uYW1lIDo9IHBfb2NpLkFubm90YXRpb25zW1NfTkFNRV9LRVldCiAgICBpX3NfbmFtZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMjogaV9zX25hbWUgPSIsIGlfc19uYW1lLCAicF9zX25hbWUgPSIsIHBfc19uYW1lKQoKICAgIGFsbG93X3NhbmRib3hfbmFtZShwX3NfbmFtZSwgaV9zX25hbWUpCgogICAgaV9zX25hbWVzcGFjZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwcmludCgiYWxsb3dfYnlfYW5ubyAyOiBpX3NfbmFtZXNwYWNlID0iLCBpX3NfbmFtZXNwYWNlKQoKICAgIGFsbG93X2J5X3NhbmRib3hfbmFtZShwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMsIGlfc19uYW1lLCBpX3NfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd19ieV9hbm5vIDI6IHRydWUiKQp9CgphbGxvd19ieV9zYW5kYm94X25hbWUocF9vY2ksIGlfb2NpLCBwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfYnlfc2FuZGJveF9uYW1lOiBzdGFydCIpCgogICAgaV9uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FU1BBQ0VfS0VZXQoKICAgIGFsbG93X2J5X2NvbnRhaW5lcl90eXBlcyhwX29jaSwgaV9vY2ksIHNfbmFtZSwgaV9uYW1lc3BhY2UpCiAgICBhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZChwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpCiAgICBhbGxvd19wcm9jZXNzKHBfb2NpLlByb2Nlc3MsIGlfb2NpLlByb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpCgogICAgcHJpbnQoImFsbG93X2J5X3NhbmRib3hfbmFtZTogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfbmFtZShwX3NfbmFtZSwgaV9zX25hbWUpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X25hbWU6IHN0YXJ0IikKICAgIHJlZ2V4Lm1hdGNoKHBfc19uYW1lLCBpX3NfbmFtZSkKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9uYW1lOiB0cnVlIikKfQoKIyBDaGVjayB0aGF0IHRoZSAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLXR5cGUiIGFuZAojICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIiBhbm5vdGF0aW9ucyBkZXNpZ25hdGUgdGhlCiMgZXhwZWN0ZWQgdHlwZSAtIGVpdGhlciBhICJzYW5kYm94IiBvciBhICJjb250YWluZXIiLiBUaGVuLCB2YWxpZGF0ZQojIG90aGVyIGFubm90YXRpb25zIGJhc2VkIG9uIHRoZSBhY3R1YWwgInNhbmRib3giIG9yICJjb250YWluZXIiIHZhbHVlCiMgZnJvbSB0aGUgaW5wdXQgY29udGFpbmVyLgphbGxvd19ieV9jb250YWluZXJfdHlwZXMocF9vY2ksIGlfb2NpLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfYnlfY29udGFpbmVyX3R5cGVzOiBjaGVja2luZyBpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSIpCgogICAgY190eXBlIDo9ICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSIKICAgIAogICAgcF9jcmlfdHlwZSA6PSBwX29jaS5Bbm5vdGF0aW9uc1tjX3R5cGVdCiAgICBpX2NyaV90eXBlIDo9IGlfb2NpLkFubm90YXRpb25zW2NfdHlwZV0KICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZXM6IHBfY3JpX3R5cGUgPSIsIHBfY3JpX3R5cGUsICJpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgcF9jcmlfdHlwZSA9PSBpX2NyaV90eXBlCgogICAgYWxsb3dfYnlfY29udGFpbmVyX3R5cGUoaV9jcmlfdHlwZSwgcF9vY2ksIGlfb2NpLCBzX25hbWUsIHNfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZXM6IHRydWUiKQp9CgphbGxvd19ieV9jb250YWluZXJfdHlwZShpX2NyaV90eXBlLCBwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAxOiBpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgaV9jcmlfdHlwZSA9PSAic2FuZGJveCIKCiAgICBpX2thdGFfdHlwZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1siaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5jb250YWluZXJfdHlwZSJdCiAgICBwcmludCgiYWxsb3dfYnlfY29udGFpbmVyX3R5cGUgMTogaV9rYXRhX3R5cGUgPSIsIGlfa2F0YV90eXBlKQogICAgaV9rYXRhX3R5cGUgPT0gInBvZF9zYW5kYm94IgoKICAgIGFsbG93X3NhbmRib3hfY29udGFpbmVyX25hbWUocF9vY2ksIGlfb2NpKQogICAgYWxsb3dfc2FuZGJveF9uZXRfbmFtZXNwYWNlKHBfb2NpLCBpX29jaSkKICAgIGFsbG93X3NhbmRib3hfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpCgogICAgcHJpbnQoImFsbG93X2J5X2NvbnRhaW5lcl90eXBlIDE6IHRydWUiKQp9CgphbGxvd19ieV9jb250YWluZXJfdHlwZShpX2NyaV90eXBlLCBwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiBpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgaV9jcmlfdHlwZSA9PSAiY29udGFpbmVyIgoKICAgIGlfa2F0YV90eXBlIDo9IGlfb2NpLkFubm90YXRpb25zWyJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIl0KICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiBpX2thdGFfdHlwZSA9IiwgaV9rYXRhX3R5cGUpCiAgICBpX2thdGFfdHlwZSA9PSAicG9kX2NvbnRhaW5lciIKCiAgICBhbGxvd19jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpCiAgICBhbGxvd19uZXRfbmFtZXNwYWNlKHBfb2NpLCBpX29jaSkKICAgIGFsbG93X2xvZ19kaXJlY3RvcnkocF9vY2ksIGlfb2NpKQoKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiB0cnVlIikKfQoKIyAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLW5hbWUiIGFubm90YXRpb24KYWxsb3dfc2FuZGJveF9jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X2NvbnRhaW5lcl9uYW1lOiBzdGFydCIpCgogICAgY29udGFpbmVyX2Fubm90YXRpb25fbWlzc2luZyhwX29jaSwgaV9vY2ksICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItbmFtZSIpCgogICAgcHJpbnQoImFsbG93X3NhbmRib3hfY29udGFpbmVyX25hbWU6IHRydWUiKQp9CgphbGxvd19jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19jb250YWluZXJfbmFtZTogc3RhcnQiKQoKICAgIGFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uKHBfb2NpLCBpX29jaSwgImlvLmt1YmVybmV0ZXMuY3JpLmNvbnRhaW5lci1uYW1lIikKCiAgICBwcmludCgiYWxsb3dfY29udGFpbmVyX25hbWU6IHRydWUiKQp9Cgpjb250YWluZXJfYW5ub3RhdGlvbl9taXNzaW5nKHBfb2NpLCBpX29jaSwga2V5KSB7CiAgICBwcmludCgiY29udGFpbmVyX2Fubm90YXRpb25fbWlzc2luZzoiLCBrZXkpCgogICAgbm90IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIG5vdCBpX29jaS5Bbm5vdGF0aW9uc1trZXldCgogICAgcHJpbnQoImNvbnRhaW5lcl9hbm5vdGF0aW9uX21pc3Npbmc6IHRydWUiKQp9CgphbGxvd19jb250YWluZXJfYW5ub3RhdGlvbihwX29jaSwgaV9vY2ksIGtleSkgewogICAgcHJpbnQoImFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uOiBrZXkgPSIsIGtleSkKCiAgICBwX3ZhbHVlIDo9IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIGlfdmFsdWUgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgcHJpbnQoImFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uOiBwX3ZhbHVlID0iLCBwX3ZhbHVlLCAiaV92YWx1ZSA9IiwgaV92YWx1ZSkKCiAgICBwX3ZhbHVlID09IGlfdmFsdWUKCiAgICBwcmludCgiYWxsb3dfY29udGFpbmVyX2Fubm90YXRpb246IHRydWUiKQp9CgojICJuZXJkY3RsL25ldHdvcmstbmFtZXNwYWNlIiBhbm5vdGF0aW9uCmFsbG93X3NhbmRib3hfbmV0X25hbWVzcGFjZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X25ldF9uYW1lc3BhY2U6IHN0YXJ0IikKCiAgICBrZXkgOj0gIm5lcmRjdGwvbmV0d29yay1uYW1lc3BhY2UiCgogICAgcF9uYW1lc3BhY2UgOj0gcF9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgaV9uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgcHJpbnQoImFsbG93X3NhbmRib3hfbmV0X25hbWVzcGFjZTogcF9uYW1lc3BhY2UgPSIsIHBfbmFtZXNwYWNlLCAiaV9uYW1lc3BhY2UgPSIsIGlfbmFtZXNwYWNlKQoKICAgIHJlZ2V4Lm1hdGNoKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9uZXRfbmFtZXNwYWNlOiB0cnVlIikKfQoKYWxsb3dfbmV0X25hbWVzcGFjZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19uZXRfbmFtZXNwYWNlOiBzdGFydCIpCgogICAga2V5IDo9ICJuZXJkY3RsL25ldHdvcmstbmFtZXNwYWNlIgoKICAgIG5vdCBwX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICBub3QgaV9vY2kuQW5ub3RhdGlvbnNba2V5XQoKICAgIHByaW50KCJhbGxvd19uZXRfbmFtZXNwYWNlOiB0cnVlIikKfQoKIyAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1sb2ctZGlyZWN0b3J5IiBhbm5vdGF0aW9uCmFsbG93X3NhbmRib3hfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X2xvZ19kaXJlY3Rvcnk6IHN0YXJ0IikKCiAgICBrZXkgOj0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbG9nLWRpcmVjdG9yeSIKCiAgICBwX2RpciA6PSBwX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICByZWdleDEgOj0gcmVwbGFjZShwX2RpciwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHJlZ2V4MiA6PSByZXBsYWNlKHJlZ2V4MSwgIiQoc2FuZGJveC1uYW1lc3BhY2UpIiwgc19uYW1lc3BhY2UpCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiByZWdleDIgPSIsIHJlZ2V4MikKCiAgICBpX2RpciA6PSBpX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiBpX2RpciA9IiwgaV9kaXIpCgogICAgcmVnZXgubWF0Y2gocmVnZXgyLCBpX2RpcikKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiB0cnVlIikKfQoKYWxsb3dfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19sb2dfZGlyZWN0b3J5OiBzdGFydCIpCgogICAga2V5IDo9ICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWxvZy1kaXJlY3RvcnkiCgogICAgbm90IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIG5vdCBpX29jaS5Bbm5vdGF0aW9uc1trZXldCgogICAgcHJpbnQoImFsbG93X2xvZ19kaXJlY3Rvcnk6IHRydWUiKQp9CgphbGxvd19kZXZpY2VzKHBfZGV2aWNlcywgaV9kZXZpY2VzKSB7CiAgICBwcmludCgiYWxsb3dfZGV2aWNlczogc3RhcnQiKQogICAgZXZlcnkgaV9kZXZpY2UgaW4gaV9kZXZpY2VzIHsKICAgICAgICBwcmludCgiYWxsb3dfZGV2aWNlczogaV9kZXZpY2UgPSIsIGlfZGV2aWNlKQogICAgICAgIHNvbWUgcF9kZXZpY2UgaW4gcF9kZXZpY2VzCiAgICAgICAgcF9kZXZpY2UuY29udGFpbmVyX3BhdGggPT0gaV9kZXZpY2UuY29udGFpbmVyX3BhdGgKICAgIH0KICAgIHByaW50KCJhbGxvd19kZXZpY2VzOiB0cnVlIikKfQoKYWxsb3dfbGludXgoc3RhdGVfb3BzLCBwX29jaSwgaV9vY2kpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIHBfbmFtZXNwYWNlcyA6PSBwX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbGludXg6IHAgbmFtZXNwYWNlcyA9IiwgcF9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlcyA6PSBpX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbGludXg6IGkgbmFtZXNwYWNlcyA9IiwgaV9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlX3dpdGhvdXRfbmV0d29yayA6PSBbb2JqIHwgb2JqIDo9IGlfbmFtZXNwYWNlc1tfXTsgb2JqLlR5cGUgIT0gIm5ldHdvcmsiXQoKICAgIHByaW50KCJhbGxvd19saW51eDogaV9uYW1lc3BhY2Vfd2l0aG91dF9uZXR3b3JrID0iLCBpX25hbWVzcGFjZV93aXRob3V0X25ldHdvcmspCgogICAgcF9uYW1lc3BhY2VzID09IGlfbmFtZXNwYWNlX3dpdGhvdXRfbmV0d29yawoKICAgIGFsbG93X21hc2tlZF9wYXRocyhwX29jaSwgaV9vY2kpCiAgICBhbGxvd19yZWFkb25seV9wYXRocyhwX29jaSwgaV9vY2kpCiAgICBhbGxvd19saW51eF9kZXZpY2VzKHBfb2NpLkxpbnV4LkRldmljZXMsIGlfb2NpLkxpbnV4LkRldmljZXMpCiAgICBhbGxvd19saW51eF9zeXNjdGwocF9vY2kuTGludXgsIGlfb2NpLkxpbnV4KQogICAgcmV0IDo9IGFsbG93X25ldHdvcmtfbmFtZXNwYWNlX3N0YXJ0KHN0YXRlX29wcywgcF9vY2ksIGlfb2NpKQogICAgcmV0LmFsbG93ZWQKCiAgICBvcHMgOj0gcmV0Lm9wcwoKICAgIHByaW50KCJhbGxvd19saW51eDogdHJ1ZSIpCn0KCiMgUmV0cmlldmUgdGhlICJuZXR3b3JrIiBuYW1lc3BhY2UgZnJvbSB0aGUgaW5wdXQgZGF0YSBhbmQgcGFzcyBpdCBvbiBmb3IgdGhlCiMgbmV0d29yayBuYW1lc3BhY2UgcG9saWN5IGNoZWNrcy4KYWxsb3dfbmV0d29ya19uYW1lc3BhY2Vfc3RhcnQoc3RhdGVfb3BzLCBwX29jaSwgaV9vY2kpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIHByaW50KCJhbGxvd19uZXR3b3JrX25hbWVzcGFjZSBzdGFydDogc3RhcnQiKQoKICAgIHBfbmFtZXNwYWNlcyA6PSBwX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IHAgbmFtZXNwYWNlcyA9IiwgcF9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlcyA6PSBpX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IGkgbmFtZXNwYWNlcyA9IiwgaV9uYW1lc3BhY2VzKQoKICAgICMgUmV0dXJuIHBhdGggb2YgdGhlICJuZXR3b3JrIiBuYW1lc3BhY2UKICAgIG5ldHdvcmtfbnMgOj0gW29iaiB8IG9iaiA6PSBpX25hbWVzcGFjZXNbX107IG9iai5UeXBlID09ICJuZXR3b3JrIl0KCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IG5ldHdvcmtfbnMgPSIsIG5ldHdvcmtfbnMpCgogICAgcmV0IDo9IGFsbG93X25ldHdvcmtfbmFtZXNwYWNlKHN0YXRlX29wcywgbmV0d29ya19ucykKICAgIHJldC5hbGxvd2VkCgogICAgb3BzIDo9IHJldC5vcHMKfQoKIyBUaGlzIHJ1bGUgaXMgd2hlbiB0aGVyZSdzIG5vIG5ldHdvcmsgbmFtZXNwYWNlIGluIHRoZSBpbnB1dCBkYXRhLgphbGxvd19uZXR3b3JrX25hbWVzcGFjZShzdGF0ZV9vcHMsIG5ldHdvcmtfbnMpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIGNvdW50KG5ldHdvcmtfbnMpID09IDAKCiAgICBuZXR3b3JrX25zX3BhdGggPSAiIgoKICAgIGFkZF9uZXR3b3JrX25hbWVzcGFjZV90b19zdGF0ZSA6PSBzdGF0ZV9hbGxvd3MoIm5ldHdvcmtfbmFtZXNwYWNlIiwgbmV0d29ya19uc19wYXRoKQogICAgb3BzIDo9IGNvbmNhdF9vcF9pZl9ub3RfbnVsbChzdGF0ZV9vcHMsIGFkZF9uZXR3b3JrX25hbWVzcGFjZV90b19zdGF0ZSkKCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2UgMTogdHJ1ZSIpCn0KCiMgVGhpcyBydWxlIGlzIHdoZW4gdGhlcmUncyBleGFjdGx5IG9uZSBuZXR3b3JrIG5hbWVzcGFjZSBpbiB0aGUgaW5wdXQgZGF0YS4KYWxsb3dfbmV0d29ya19uYW1lc3BhY2Uoc3RhdGVfb3BzLCBuZXR3b3JrX25zKSA6PSB7Im9wcyI6IG9wcywgImFsbG93ZWQiOiB0cnVlfSB7CiAgICBjb3VudChuZXR3b3JrX25zKSA9PSAxCgogICAgYWRkX25ldHdvcmtfbmFtZXNwYWNlX3RvX3N0YXRlIDo9IHN0YXRlX2FsbG93cygibmV0d29ya19uYW1lc3BhY2UiLCBuZXR3b3JrX25zWzBdLlBhdGgpCiAgICBvcHMgOj0gY29uY2F0X29wX2lmX25vdF9udWxsKHN0YXRlX29wcywgYWRkX25ldHdvcmtfbmFtZXNwYWNlX3RvX3N0YXRlKQoKICAgIHByaW50KCJhbGxvd19uZXR3b3JrX25hbWVzcGFjZSAyOiB0cnVlIikKfQoKYWxsb3dfbWFza2VkX3BhdGhzKHBfb2NpLCBpX29jaSkgewogICAgcF9wYXRocyA6PSBwX29jaS5MaW51eC5NYXNrZWRQYXRocwogICAgcHJpbnQoImFsbG93X21hc2tlZF9wYXRocyAxOiBwX3BhdGhzID0iLCBwX3BhdGhzKQoKICAgIGlfcGF0aHMgOj0gaV9vY2kuTGludXguTWFza2VkUGF0aHMKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aHMgMTogaV9wYXRocyA9IiwgaV9wYXRocykKCiAgICBhbGxvd19tYXNrZWRfcGF0aHNfYXJyYXkocF9wYXRocywgaV9wYXRocykKCiAgICBwcmludCgiYWxsb3dfbWFza2VkX3BhdGhzIDE6IHRydWUiKQp9CmFsbG93X21hc2tlZF9wYXRocyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aHMgMjogc3RhcnQiKQoKICAgIG5vdCBwX29jaS5MaW51eC5NYXNrZWRQYXRocwogICAgbm90IGlfb2NpLkxpbnV4Lk1hc2tlZFBhdGhzCgogICAgcHJpbnQoImFsbG93X21hc2tlZF9wYXRocyAyOiB0cnVlIikKfQoKIyBBbGwgdGhlIHBvbGljeSBtYXNrZWQgcGF0aHMgbXVzdCBiZSBtYXNrZWQgaW4gdGhlIGlucHV0IGRhdGEgdG9vLgojIElucHV0IGlzIGFsbG93ZWQgdG8gaGF2ZSBtb3JlIG1hc2tlZCBwYXRocyB0aGFuIHRoZSBwb2xpY3kuCmFsbG93X21hc2tlZF9wYXRoc19hcnJheShwX2FycmF5LCBpX2FycmF5KSB7CiAgICBldmVyeSBwX2VsZW0gaW4gcF9hcnJheSB7CiAgICAgICAgYWxsb3dfbWFza2VkX3BhdGgocF9lbGVtLCBpX2FycmF5KQogICAgfQp9CgphbGxvd19tYXNrZWRfcGF0aChwX2VsZW0sIGlfYXJyYXkpIHsKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aDogcF9lbGVtID0iLCBwX2VsZW0pCgogICAgc29tZSBpX2VsZW0gaW4gaV9hcnJheQogICAgcF9lbGVtID09IGlfZWxlbQoKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aDogdHJ1ZSIpCn0KCmFsbG93X3JlYWRvbmx5X3BhdGhzKHBfb2NpLCBpX29jaSkgewogICAgcF9wYXRocyA6PSBwX29jaS5MaW51eC5SZWFkb25seVBhdGhzCiAgICBwcmludCgiYWxsb3dfcmVhZG9ubHlfcGF0aHMgMTogcF9wYXRocyA9IiwgcF9wYXRocykKCiAgICBpX3BhdGhzIDo9IGlfb2NpLkxpbnV4LlJlYWRvbmx5UGF0aHMKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAxOiBpX3BhdGhzID0iLCBpX3BhdGhzKQoKICAgIGFsbG93X3JlYWRvbmx5X3BhdGhzX2FycmF5KHBfcGF0aHMsIGlfcGF0aHMsIGlfb2NpLkxpbnV4Lk1hc2tlZFBhdGhzKQoKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAxOiB0cnVlIikKfQphbGxvd19yZWFkb25seV9wYXRocyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAyOiBzdGFydCIpCgogICAgbm90IHBfb2NpLkxpbnV4LlJlYWRvbmx5UGF0aHMKICAgIG5vdCBpX29jaS5MaW51eC5SZWFkb25seVBhdGhzCgogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGhzIDI6IHRydWUiKQp9CgojIEFsbCB0aGUgcG9saWN5IHJlYWRvbmx5IHBhdGhzIG11c3QgYmUgZWl0aGVyOgojIC0gUHJlc2VudCBpbiB0aGUgaW5wdXQgcmVhZG9ubHkgcGF0aHMsIG9yCiMgLSBQcmVzZW50IGluIHRoZSBpbnB1dCBtYXNrZWQgcGF0aHMuCiMgSW5wdXQgaXMgYWxsb3dlZCB0byBoYXZlIG1vcmUgcmVhZG9ubHkgcGF0aHMgdGhhbiB0aGUgcG9saWN5LgphbGxvd19yZWFkb25seV9wYXRoc19hcnJheShwX2FycmF5LCBpX2FycmF5LCBtYXNrZWRfcGF0aHMpIHsKICAgIGV2ZXJ5IHBfZWxlbSBpbiBwX2FycmF5IHsKICAgICAgICBhbGxvd19yZWFkb25seV9wYXRoKHBfZWxlbSwgaV9hcnJheSwgbWFza2VkX3BhdGhzKQogICAgfQp9CgphbGxvd19yZWFkb25seV9wYXRoKHBfZWxlbSwgaV9hcnJheSwgbWFza2VkX3BhdGhzKSB7CiAgICBwcmludCgiYWxsb3dfcmVhZG9ubHlfcGF0aCAxOiBwX2VsZW0gPSIsIHBfZWxlbSkKCiAgICBzb21lIGlfZWxlbSBpbiBpX2FycmF5CiAgICBwX2VsZW0gPT0gaV9lbGVtCgogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGggMTogdHJ1ZSIpCn0KYWxsb3dfcmVhZG9ubHlfcGF0aChwX2VsZW0sIGlfYXJyYXksIG1hc2tlZF9wYXRocykgewogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGggMjogcF9lbGVtID0iLCBwX2VsZW0pCgogICAgc29tZSBpX21hc2tlZCBpbiBtYXNrZWRfcGF0aHMKICAgIHBfZWxlbSA9PSBpX21hc2tlZAoKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRoIDI6IHRydWUiKQp9CgphbGxvd19saW51eF9kZXZpY2VzKHBfZGV2aWNlcywgaV9kZXZpY2VzKSB7CiAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogc3RhcnQiKQogICAgZXZlcnkgaV9kZXZpY2UgaW4gaV9kZXZpY2VzIHsKICAgICAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogaV9kZXZpY2UgPSIsIGlfZGV2aWNlKQogICAgICAgIHNvbWUgcF9kZXZpY2UgaW4gcF9kZXZpY2VzCiAgICAgICAgaV9kZXZpY2UuUGF0aCA9PSBwX2RldmljZS5QYXRoCiAgICB9CiAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogdHJ1ZSIpCn0KCmFsbG93X2xpbnV4X3N5c2N0bChwX2xpbnV4LCBpX2xpbnV4KSB7CiAgICBwcmludCgiYWxsb3dfbGludXhfc3lzY3RsIDE6IHN0YXJ0IikKICAgIG5vdCBpX2xpbnV4LlN5c2N0bAogICAgcHJpbnQoImFsbG93X2xpbnV4X3N5c2N0bCAxOiB0cnVlIikKfQoKYWxsb3dfbGludXhfc3lzY3RsKHBfbGludXgsIGlfbGludXgpIHsKICAgIHByaW50KCJhbGxvd19saW51eF9zeXNjdGwgMjogc3RhcnQiKQogICAgcF9zeXNjdGwgOj0gcF9saW51eC5TeXNjdGwKICAgIGlfc3lzY3RsIDo9IGlfbGludXguU3lzY3RsCiAgICBldmVyeSBpX25hbWUsIGlfdmFsIGluIGlfc3lzY3RsIHsKICAgICAgICBwcmludCgiYWxsb3dfbGludXhfc3lzY3RsIDI6IGlfbmFtZSA9IiwgaV9uYW1lLCAiaV92YWwgPSIsIGlfdmFsKQogICAgICAgIHBfc3lzY3RsW2lfbmFtZV0gPT0gaV92YWwKICAgIH0KICAgIHByaW50KCJhbGxvd19saW51eF9zeXNjdGwgMjogdHJ1ZSIpCn0KCiMgQ2hlY2sgdGhlIGNvbnNpc3RlbmN5IG9mIHRoZSBpbnB1dCAiaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5idW5kbGVfcGF0aCIKIyBhbmQgaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCIgdmFsdWVzIHdpdGggb3RoZXIgZmllbGRzLgphbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZChwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpIHsKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogc3RhcnQiKQoKICAgIGJ1bmRsZV9wYXRoIDo9IGlfb2NpLkFubm90YXRpb25zWyJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmJ1bmRsZV9wYXRoIl0KICAgIGJ1bmRsZV9pZCA6PSByZXBsYWNlKGJ1bmRsZV9wYXRoLCAiL3J1bi9jb250YWluZXJkL2lvLmNvbnRhaW5lcmQucnVudGltZS52Mi50YXNrL2s4cy5pby8iLCAiIikKCiAgICBidW5kbGVfaWRfZm9ybWF0IDo9IGNvbmNhdCgiIiwgWyJeIiwgQlVORExFX0lELCAiJCJdKQogICAgcmVnZXgubWF0Y2goYnVuZGxlX2lkX2Zvcm1hdCwgYnVuZGxlX2lkKQoKICAgIGtleSA6PSAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCIKCiAgICBwX3JlZ2V4IDo9IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIHNhbmRib3hfaWQgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQoKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogc2FuZGJveF9pZCA9Iiwgc2FuZGJveF9pZCwgInJlZ2V4ID0iLCBwX3JlZ2V4KQogICAgcmVnZXgubWF0Y2gocF9yZWdleCwgc2FuZGJveF9pZCkKCiAgICBhbGxvd19yb290X3BhdGgocF9vY2ksIGlfb2NpLCBidW5kbGVfaWQpCgogICAgZXZlcnkgaV9tb3VudCBpbiBpX29jaS5Nb3VudHMgewogICAgICAgIGFsbG93X21vdW50KHBfb2NpLCBpX21vdW50LCBpX3N0b3JhZ2VzLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpCiAgICB9CgogICAgYWxsb3dfc3RvcmFnZXMocF9zdG9yYWdlcywgaV9zdG9yYWdlcywgYnVuZGxlX2lkLCBzYW5kYm94X2lkKQoKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogdHJ1ZSIpCn0KCmFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHBfcHJvY2VzcyA9IiwgcF9wcm9jZXNzKQogICAgcHJpbnQoImFsbG93X3Byb2Nlc3NfY29tbW9uOiBpX3Byb2Nlc3MgPSAiLCBpX3Byb2Nlc3MpCiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHNfbmFtZSA9Iiwgc19uYW1lKQoKICAgIHBfcHJvY2Vzcy5Dd2QgPT0gaV9wcm9jZXNzLkN3ZAogICAgcF9wcm9jZXNzLk5vTmV3UHJpdmlsZWdlcyA9PSBpX3Byb2Nlc3MuTm9OZXdQcml2aWxlZ2VzCgogICAgYWxsb3dfdXNlcihwX3Byb2Nlc3MsIGlfcHJvY2VzcykKICAgIGFsbG93X2VudihwX3Byb2Nlc3MsIGlfcHJvY2Vzcywgc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHRydWUiKQp9CgojIENvbXBhcmUgdGhlIE9DSSBQcm9jZXNzIGZpZWxkIG9mIGEgcG9saWN5IGNvbnRhaW5lciB3aXRoIHRoZSBpbnB1dCBPQ0kgUHJvY2VzcyBmcm9tIGEgQ3JlYXRlQ29udGFpbmVyUmVxdWVzdAphbGxvd19wcm9jZXNzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfcHJvY2Vzczogc3RhcnQiKQoKICAgIGFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgYWxsb3dfY2FwcyhwX3Byb2Nlc3MuQ2FwYWJpbGl0aWVzLCBpX3Byb2Nlc3MuQ2FwYWJpbGl0aWVzKQogICAgcF9wcm9jZXNzLlRlcm1pbmFsID09IGlfcHJvY2Vzcy5UZXJtaW5hbAoKICAgIHByaW50KCJhbGxvd19wcm9jZXNzOiB0cnVlIikKfQoKIyBDb21wYXJlIHRoZSBPQ0kgUHJvY2VzcyBmaWVsZCBvZiBhIHBvbGljeSBjb250YWluZXIgd2l0aCB0aGUgaW5wdXQgcHJvY2VzcyBmaWVsZCBmcm9tIEV4ZWNQcm9jZXNzUmVxdWVzdAphbGxvd19pbnRlcmFjdGl2ZV9wcm9jZXNzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfaW50ZXJhY3RpdmVfcHJvY2Vzczogc3RhcnQiKQoKICAgIGFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgYWxsb3dfZXhlY19jYXBzKGlfcHJvY2Vzcy5DYXBhYmlsaXRpZXMpCgogICAgIyBUaGVzZSBhcmUgY29tbWFuZHMgZW5hYmxlZCB1c2luZyBFeGVjUHJvY2Vzc1JlcXVlc3QgY29tbWFuZHMgYW5kL29yIHJlZ2V4IGZyb20gdGhlIHNldHRpbmdzIGZpbGUuCiAgICAjIFRoZXkgY2FuIGJlIGV4ZWN1dGVkIGludGVyYWN0aXZlbHkgc28gYWxsb3cgdGhlbSB0byB1c2UgYW55IHZhbHVlIGZvciBpX3Byb2Nlc3MuVGVybWluYWwuCgogICAgcHJpbnQoImFsbG93X2ludGVyYWN0aXZlX3Byb2Nlc3M6IHRydWUiKQp9CgojIENvbXBhcmUgdGhlIE9DSSBQcm9jZXNzIGZpZWxkIG9mIGEgcG9saWN5IGNvbnRhaW5lciB3aXRoIHRoZSBpbnB1dCBwcm9jZXNzIGZpZWxkIGZyb20gRXhlY1Byb2Nlc3NSZXF1ZXN0CmFsbG93X3Byb2JlX3Byb2Nlc3MocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19wcm9iZV9wcm9jZXNzOiBzdGFydCIpCgogICAgYWxsb3dfcHJvY2Vzc19jb21tb24ocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpCiAgICBhbGxvd19leGVjX2NhcHMoaV9wcm9jZXNzLkNhcGFiaWxpdGllcykKICAgIHBfcHJvY2Vzcy5UZXJtaW5hbCA9PSBpX3Byb2Nlc3MuVGVybWluYWwKCiAgICBwcmludCgiYWxsb3dfcHJvYmVfcHJvY2VzczogdHJ1ZSIpCn0KCmFsbG93X3VzZXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MpIHsKICAgIHBfdXNlciA6PSBwX3Byb2Nlc3MuVXNlcgogICAgaV91c2VyIDo9IGlfcHJvY2Vzcy5Vc2VyCgogICAgcHJpbnQoImFsbG93X3VzZXI6IGlucHV0IHVpZCA9IiwgaV91c2VyLlVJRCwgInBvbGljeSB1aWQgPSIsIHBfdXNlci5VSUQpCiAgICBwX3VzZXIuVUlEID09IGlfdXNlci5VSUQKCiAgICAjIFRPRE86IHRyYWNrIGRvd24gdGhlIHJlYXNvbiBmb3IgcmVnaXN0cnkuazhzLmlvL3BhdXNlOjMuOSBiZWluZwogICAgIyAgICAgICBleGVjdXRlZCB3aXRoIGdpZCA9IDAgZGVzcGl0ZSBoYXZpbmcgIjY1NTM1OjY1NTM1IiBpbiBpdHMgY29udGFpbmVyIGltYWdlCiAgICAjICAgICAgIGNvbmZpZy4KICAgICNwcmludCgiYWxsb3dfdXNlcjogaW5wdXQgZ2lkID0iLCBpX3VzZXIuR0lELCAicG9saWN5IGdpZCA9IiwgcF91c2VyLkdJRCkKICAgICNwX3VzZXIuR0lEID09IGlfdXNlci5HSUQKCiAgICAjIFRPRE86IGNvbXBhcmUgdGhlIGFkZGl0aW9uYWxHaWRzIGZpZWxkIHRvbyBhZnRlciBjb21wdXRpbmcgaXRzIHZhbHVlCiAgICAjIGJhc2VkIG9uIC9ldGMvcGFzc3dkIGFuZCAvZXRjL2dyb3VwIGZyb20gdGhlIGNvbnRhaW5lciBpbWFnZS4KfQoKYWxsb3dfZGVwcmVjYXRlZF9hcmdzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZ3MgMTogbm8gYXJncyIpCgogICAgbm90IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJncwogICAgbm90IGlfcHJvY2Vzcy5BcmdzCgogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAxOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZ3MocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSkgewogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiBwb2xpY3kgYXJncyA9IiwgcF9wcm9jZXNzLkRlcHJlY2F0ZWRBcmdzKQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiBpbnB1dCBhcmdzID0iLCBpX3Byb2Nlc3MuQXJncykKCiAgICBjb3VudChwX3Byb2Nlc3MuRGVwcmVjYXRlZEFyZ3MpID09IGNvdW50KGlfcHJvY2Vzcy5BcmdzKQoKICAgIGV2ZXJ5IGksIGlfYXJnIGluIGlfcHJvY2Vzcy5BcmdzIHsKICAgICAgICBhbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpCiAgICB9CgogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDE6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgcF9hcmcyIDo9IHJlcGxhY2UocF9hcmcsICIkJCIsICIkIikKICAgIHBfYXJnMiA9PSBpX2FyZwoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAxOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDI6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgIyBUT0RPOiBjYW4gJChub2RlLW5hbWUpIGJlIGhhbmRsZWQgYmV0dGVyPwogICAgY29udGFpbnMocF9hcmcsICIkKG5vZGUtbmFtZSkiKQoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAyOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDM6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgcF9hcmcyIDo9IHJlcGxhY2UocF9hcmcsICIkJCIsICIkIikKICAgIHBfYXJnMyA6PSByZXBsYWNlKHBfYXJnMiwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAzOiBwX2FyZzMgPSIsIHBfYXJnMykKICAgIHBfYXJnMyA9PSBpX2FyZwoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAzOiB0cnVlIikKfQoKIyBPQ0kgcHJvY2Vzcy5FbnYgZmllbGQKYWxsb3dfZW52KHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfZW52OiBwIGVudiA9IiwgcF9wcm9jZXNzLkVudikKICAgIHByaW50KCJhbGxvd19lbnY6IGkgZW52ID0iLCBpX3Byb2Nlc3MuRW52KQoKICAgIGV2ZXJ5IGlfdmFyIGluIGlfcHJvY2Vzcy5FbnYgewogICAgICAgIHByaW50KCJhbGxvd19lbnY6IGlfdmFyID0iLCBpX3ZhcikKICAgICAgICBhbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgfQoKICAgIHByaW50KCJhbGxvd19lbnY6IHRydWUiKQp9CgojIEFsbG93IGlucHV0IGVudiB2YXJpYWJsZXMgdGhhdCBhcmUgcHJlc2VudCBpbiB0aGUgcG9saWN5IGRhdGEgdG9vLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHBfdmFyID09IGlfdmFyCiAgICBwcmludCgiYWxsb3dfdmFyIDE6IHRydWUiKQp9CgojIE1hdGNoIGlucHV0IHdpdGggb25lIG9mIHRoZSBwb2xpY3kgdmFyaWFibGVzLCBhZnRlciBzdWJzdGl0dXRpbmcgJChzYW5kYm94LW5hbWUpLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHByaW50KCJhbGxvd192YXIgMjogcF92YXIgPSIsIHBfdmFyKQoKICAgIHBfdmFyX3NwbGl0IDo9IHNwbGl0KHBfdmFyLCAiPSIpCiAgICBjb3VudChwX3Zhcl9zcGxpdCkgPT0gMgoKICAgIHBfdmFyX3NwbGl0WzFdID09ICIkKHNhbmRib3gtbmFtZSkiCgogICAgaV92YXJfc3BsaXQgOj0gc3BsaXQoaV92YXIsICI9IikKICAgIGNvdW50KGlfdmFyX3NwbGl0KSA9PSAyCgogICAgaV92YXJfc3BsaXRbMF0gPT0gcF92YXJfc3BsaXRbMF0KICAgIHJlZ2V4Lm1hdGNoKHNfbmFtZSwgaV92YXJfc3BsaXRbMV0pCgogICAgcHJpbnQoImFsbG93X3ZhciAyOiB0cnVlIikKfQoKIyBBbGxvdyBpbnB1dCBlbnYgdmFyaWFibGVzIHRoYXQgbWF0Y2ggd2l0aCBhIHJlcXVlc3RfZGVmYXVsdHMgcmVnZXguCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHNvbWUgcF9yZWdleDEgaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5DcmVhdGVDb250YWluZXJSZXF1ZXN0LmFsbG93X2Vudl9yZWdleAogICAgcF9yZWdleDIgOj0gcmVwbGFjZShwX3JlZ2V4MSwgIiQoaXB2NF9hKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcHY0X2EpCiAgICBwX3JlZ2V4MyA6PSByZXBsYWNlKHBfcmVnZXgyLCAiJChpcF9wKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcF9wKQogICAgcF9yZWdleDQgOj0gcmVwbGFjZShwX3JlZ2V4MywgIiQoc3ZjX25hbWUpIiwgcG9saWN5X2RhdGEuY29tbW9uLnN2Y19uYW1lKQogICAgcF9yZWdleDUgOj0gcmVwbGFjZShwX3JlZ2V4NCwgIiQoZG5zX2xhYmVsKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5kbnNfbGFiZWwpCgogICAgcHJpbnQoImFsbG93X3ZhciAzOiBwX3JlZ2V4NSA9IiwgcF9yZWdleDUpCiAgICByZWdleC5tYXRjaChwX3JlZ2V4NSwgaV92YXIpCgogICAgcHJpbnQoImFsbG93X3ZhciAzOiB0cnVlIikKfQoKIyBBbGxvdyBmaWVsZFJlZiAiZmllbGRQYXRoOiBzdGF0dXMucG9kSVAiIHZhbHVlcy4KYWxsb3dfdmFyKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBpX3Zhciwgc19uYW1lLCBzX25hbWVzcGFjZSkgewogICAgbmFtZV92YWx1ZSA6PSBzcGxpdChpX3ZhciwgIj0iKQogICAgY291bnQobmFtZV92YWx1ZSkgPT0gMgogICAgaXNfaXAobmFtZV92YWx1ZVsxXSkKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIGFsbG93X3BvZF9pcF92YXIobmFtZV92YWx1ZVswXSwgcF92YXIpCgogICAgcHJpbnQoImFsbG93X3ZhciA0OiB0cnVlIikKfQoKIyBBbGxvdyBjb21tb24gZmllbGRSZWYgdmFyaWFibGVzLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBuYW1lX3ZhbHVlIDo9IHNwbGl0KGlfdmFyLCAiPSIpCiAgICBjb3VudChuYW1lX3ZhbHVlKSA9PSAyCgogICAgc29tZSBwX3ZhciBpbiBwX3Byb2Nlc3MuRW52CiAgICBwX25hbWVfdmFsdWUgOj0gc3BsaXQocF92YXIsICI9IikKICAgIGNvdW50KHBfbmFtZV92YWx1ZSkgPT0gMgoKICAgIHBfbmFtZV92YWx1ZVswXSA9PSBuYW1lX3ZhbHVlWzBdCgogICAgIyBUT0RPOiBzaG91bGQgdGhlc2UgYmUgaGFuZGxlZCBpbiBhIGRpZmZlcmVudCB3YXk/CiAgICBhbHdheXNfYWxsb3dlZCA6PSBbIiQoaG9zdC1uYW1lKSIsICIkKG5vZGUtbmFtZSkiLCAiJChwb2QtdWlkKSJdCiAgICBzb21lIGFsbG93ZWQgaW4gYWx3YXlzX2FsbG93ZWQKICAgIGNvbnRhaW5zKHBfbmFtZV92YWx1ZVsxXSwgYWxsb3dlZCkKCiAgICBwcmludCgiYWxsb3dfdmFyIDU6IHRydWUiKQp9CgojIEFsbG93IGZpZWxkUmVmICJmaWVsZFBhdGg6IHN0YXR1cy5ob3N0SVAiIHZhbHVlcy4KYWxsb3dfdmFyKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBpX3Zhciwgc19uYW1lLCBzX25hbWVzcGFjZSkgewogICAgbmFtZV92YWx1ZSA6PSBzcGxpdChpX3ZhciwgIj0iKQogICAgY291bnQobmFtZV92YWx1ZSkgPT0gMgogICAgaXNfaXAobmFtZV92YWx1ZVsxXSkKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIGFsbG93X2hvc3RfaXBfdmFyKG5hbWVfdmFsdWVbMF0sIHBfdmFyKQoKICAgIHByaW50KCJhbGxvd192YXIgNjogdHJ1ZSIpCn0KCiMgQWxsb3cgcmVzb3VyY2VGaWVsZFJlZiB2YWx1ZXMgKGUuZy4sICJsaW1pdHMuY3B1IikuCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIG5hbWVfdmFsdWUgOj0gc3BsaXQoaV92YXIsICI9IikKICAgIGNvdW50KG5hbWVfdmFsdWUpID09IDIKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHBfbmFtZV92YWx1ZSA6PSBzcGxpdChwX3ZhciwgIj0iKQogICAgY291bnQocF9uYW1lX3ZhbHVlKSA9PSAyCgogICAgcF9uYW1lX3ZhbHVlWzBdID09IG5hbWVfdmFsdWVbMF0KCiAgICAjIGEgdmFyaWFibGUgd2Ugc2hvdWxkIGJlIHZhbGlkYXRpbmcgdXNpbmcgYSByZWdleCBmcm9tIHNldHRpbmdzCiAgICBwX25hbWVfdmFsdWVbMV0gPT0gIiQodmFsaWRhdGUtZnJvbS1zZXR0aW5ncykiCgogICAgcmVnZXhfdmFsIDo9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuQ3JlYXRlQ29udGFpbmVyUmVxdWVzdC5hbGxvd19lbnZfcmVnZXhfbWFwW25hbWVfdmFsdWVbMF1dCgogICAgcHJpbnQoImFsbG93X3ZhciA3OiB2YWwgPSIsIG5hbWVfdmFsdWVbMV0pCiAgICBwcmludCgiYWxsb3dfdmFyIDc6IHJlZ2V4X3ZhbCA9IiwgcmVnZXhfdmFsKQoKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4X3ZhbCwgbmFtZV92YWx1ZVsxXSkKCiAgICBwcmludCgiYWxsb3dfdmFyIDc6IHRydWUiKQp9CgojIE1hdGNoIGlucHV0IHdpdGggb25lIG9mIHRoZSBwb2xpY3kgdmFyaWFibGVzLCBhZnRlciBzdWJzdGl0dXRpbmcgJChzYW5kYm94LW5hbWVzcGFjZSkuCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHNvbWUgcF92YXIgaW4gcF9wcm9jZXNzLkVudgogICAgcF92YXIyIDo9IHJlcGxhY2UocF92YXIsICIkKHNhbmRib3gtbmFtZXNwYWNlKSIsIHNfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd192YXIgODogcF92YXIyID0iLCBwX3ZhcjIpCiAgICBwX3ZhcjIgPT0gaV92YXIKCiAgICBwcmludCgiYWxsb3dfdmFyIDg6IHRydWUiKQp9CgphbGxvd19wb2RfaXBfdmFyKHZhcl9uYW1lLCBwX3ZhcikgewogICAgcHJpbnQoImFsbG93X3BvZF9pcF92YXI6IHZhcl9uYW1lID0iLCB2YXJfbmFtZSwgInBfdmFyID0iLCBwX3ZhcikKCiAgICBwX25hbWVfdmFsdWUgOj0gc3BsaXQocF92YXIsICI9IikKICAgIGNvdW50KHBfbmFtZV92YWx1ZSkgPT0gMgoKICAgIHBfbmFtZV92YWx1ZVswXSA9PSB2YXJfbmFtZQogICAgcF9uYW1lX3ZhbHVlWzFdID09ICIkKHBvZC1pcCkiCgogICAgcHJpbnQoImFsbG93X3BvZF9pcF92YXI6IHRydWUiKQp9CgphbGxvd19ob3N0X2lwX3Zhcih2YXJfbmFtZSwgcF92YXIpIHsKICAgIHByaW50KCJhbGxvd19ob3N0X2lwX3ZhcjogdmFyX25hbWUgPSIsIHZhcl9uYW1lLCAicF92YXIgPSIsIHBfdmFyKQoKICAgIHBfbmFtZV92YWx1ZSA6PSBzcGxpdChwX3ZhciwgIj0iKQogICAgY291bnQocF9uYW1lX3ZhbHVlKSA9PSAyCgogICAgcF9uYW1lX3ZhbHVlWzBdID09IHZhcl9uYW1lCiAgICBwX25hbWVfdmFsdWVbMV0gPT0gIiQoaG9zdC1pcCkiCgogICAgcHJpbnQoImFsbG93X2hvc3RfaXBfdmFyOiB0cnVlIikKfQoKaXNfaXAodmFsdWUpIHsKICAgIGJ5dGVzID0gc3BsaXQodmFsdWUsICIuIikKICAgIGNvdW50KGJ5dGVzKSA9PSA0CgogICAgaXNfaXBfZmlyc3RfYnl0ZShieXRlc1swXSkKICAgIGlzX2lwX290aGVyX2J5dGUoYnl0ZXNbMV0pCiAgICBpc19pcF9vdGhlcl9ieXRlKGJ5dGVzWzJdKQogICAgaXNfaXBfb3RoZXJfYnl0ZShieXRlc1szXSkKfQppc19pcF9maXJzdF9ieXRlKGNvbXBvbmVudCkgewogICAgbnVtYmVyID0gdG9fbnVtYmVyKGNvbXBvbmVudCkKICAgIG51bWJlciA+PSAxCiAgICBudW1iZXIgPD0gMjU1Cn0KaXNfaXBfb3RoZXJfYnl0ZShjb21wb25lbnQpIHsKICAgIG51bWJlciA9IHRvX251bWJlcihjb21wb25lbnQpCiAgICBudW1iZXIgPj0gMAogICAgbnVtYmVyIDw9IDI1NQp9CgojIE9DSSByb290LlBhdGgKYWxsb3dfcm9vdF9wYXRoKHBfb2NpLCBpX29jaSwgYnVuZGxlX2lkKSB7CiAgICBpX3BhdGggOj0gaV9vY2kuUm9vdC5QYXRoCiAgICBwX3BhdGgxIDo9IHBfb2NpLlJvb3QuUGF0aAogICAgcHJpbnQoImFsbG93X3Jvb3RfcGF0aDogaV9wYXRoID0iLCBpX3BhdGgsICJwX3BhdGgxID0iLCBwX3BhdGgxKQoKICAgIHBfcGF0aDIgOj0gcmVwbGFjZShwX3BhdGgxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfcm9vdF9wYXRoOiBwX3BhdGgyID0iLCBwX3BhdGgyKQoKICAgIHBfcGF0aDMgOj0gcmVwbGFjZShwX3BhdGgyLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X3Jvb3RfcGF0aDogcF9wYXRoMyA9IiwgcF9wYXRoMykKCiAgICBwX3BhdGgzID09IGlfcGF0aAoKICAgIHByaW50KCJhbGxvd19yb290X3BhdGg6IHRydWUiKQp9CgojIGRldmljZSBtb3VudHMKYWxsb3dfbW91bnQocF9vY2ksIGlfbW91bnQsIGlfc3RvcmFnZXMsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcHJpbnQoImFsbG93X21vdW50OiBpX21vdW50ID0iLCBpX21vdW50KQoKICAgIHNvbWUgcF9tb3VudCBpbiBwX29jaS5Nb3VudHMKICAgIHNvbWUgaV9zdG9yYWdlIGluIGlfc3RvcmFnZXMKCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IHBfbW91bnQgPSIsIHBfbW91bnQpCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IGlfc3RvcmFnZSA9IiwgaV9zdG9yYWdlKQoKICAgIGNoZWNrX21vdW50KHBfbW91bnQsIGlfbW91bnQsIGlfc3RvcmFnZSwgYnVuZGxlX2lkLCBzYW5kYm94X2lkKQoKICAgICMgVE9ETzogYXJlIHRoZXJlIGFueSBvdGhlciByZXF1aXJlZCBwb2xpY3kgY2hlY2tzIGZvciBtb3VudHMgLSBlLmcuLAogICAgIyAgICAgICBtdWx0aXBsZSBtb3VudHMgd2l0aCBzYW1lIHNvdXJjZSBvciBkZXN0aW5hdGlvbj8KCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IHRydWUiKQp9CgpjaGVja19tb3VudChwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcF9tb3VudCA9PSBpX21vdW50CiAgICBwcmludCgiY2hlY2tfbW91bnQgMTogdHJ1ZSIpCn0KY2hlY2tfbW91bnQocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHBfbW91bnQuZGVzdGluYXRpb24gPT0gaV9tb3VudC5kZXN0aW5hdGlvbgogICAgcF9tb3VudC50eXBlXyA9PSBpX21vdW50LnR5cGVfCiAgICBwX21vdW50Lm9wdGlvbnMgPT0gaV9tb3VudC5vcHRpb25zCgogICAgbW91bnRfc291cmNlX2FsbG93cyhwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkKCiAgICBwcmludCgiY2hlY2tfbW91bnQgMjogdHJ1ZSIpCn0KCm1vdW50X3NvdXJjZV9hbGxvd3MocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHJlZ2V4MSA6PSBwX21vdW50LnNvdXJjZQogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5tb3VudF9zb3VyY2VfY3BhdGgpCiAgICByZWdleDQgOj0gcmVwbGFjZShyZWdleDMsICIkKGJ1bmRsZS1pZCkiLCBidW5kbGVfaWQpCgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMTogcmVnZXg0ID0iLCByZWdleDQpCiAgICByZWdleC5tYXRjaChyZWdleDQsIGlfbW91bnQuc291cmNlKQoKICAgIHByaW50KCJtb3VudF9zb3VyY2VfYWxsb3dzIDE6IHRydWUiKQp9Cm1vdW50X3NvdXJjZV9hbGxvd3MocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHJlZ2V4MSA6PSBwX21vdW50LnNvdXJjZQogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5tb3VudF9zb3VyY2VfY3BhdGgpCiAgICByZWdleDQgOj0gcmVwbGFjZShyZWdleDMsICIkKHNhbmRib3gtaWQpIiwgc2FuZGJveF9pZCkKCiAgICBwcmludCgibW91bnRfc291cmNlX2FsbG93cyAyOiByZWdleDQgPSIsIHJlZ2V4NCkKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4NCwgaV9tb3VudC5zb3VyY2UpCgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMjogdHJ1ZSIpCn0KbW91bnRfc291cmNlX2FsbG93cyhwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogaV9tb3VudC5zb3VyY2UgPSIsIGlfbW91bnQuc291cmNlKQogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogaV9zdG9yYWdlLm1vdW50X3BvaW50ID0iLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCgogICAgaV9tb3VudC5zb3VyY2UgPT0gaV9zdG9yYWdlLm1vdW50X3BvaW50CgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogdHJ1ZSIpCn0KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBDcmVhdGUgY29udGFpbmVyIFN0b3JhZ2VzCgphbGxvd19zdG9yYWdlcyhwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHBfY291bnQgOj0gY291bnQocF9zdG9yYWdlcykKICAgIGlfY291bnQgOj0gY291bnQoaV9zdG9yYWdlcykKICAgIHByaW50KCJhbGxvd19zdG9yYWdlczogcF9jb3VudCA9IiwgcF9jb3VudCwgImlfY291bnQgPSIsIGlfY291bnQpCgogICAgcF9jb3VudCA9PSBpX2NvdW50CgogICAgIyBHZXQgdGhlIGNvbnRhaW5lciBpbWFnZSBsYXllciBJRHMgYW5kIHZlcml0eSByb290IGhhc2hlcywgZnJvbSB0aGUgIm92ZXJsYXlmcyIgc3RvcmFnZS4KICAgIHNvbWUgb3ZlcmxheV9zdG9yYWdlIGluIHBfc3RvcmFnZXMKICAgIG92ZXJsYXlfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIHByaW50KCJhbGxvd19zdG9yYWdlczogb3ZlcmxheV9zdG9yYWdlID0iLCBvdmVybGF5X3N0b3JhZ2UpCiAgICBjb3VudChvdmVybGF5X3N0b3JhZ2Uub3B0aW9ucykgPT0gMgoKICAgIGxheWVyX2lkcyA6PSBzcGxpdChvdmVybGF5X3N0b3JhZ2Uub3B0aW9uc1swXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiBsYXllcl9pZHMgPSIsIGxheWVyX2lkcykKCiAgICByb290X2hhc2hlcyA6PSBzcGxpdChvdmVybGF5X3N0b3JhZ2Uub3B0aW9uc1sxXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiByb290X2hhc2hlcyA9Iiwgcm9vdF9oYXNoZXMpCgogICAgZXZlcnkgaV9zdG9yYWdlIGluIGlfc3RvcmFnZXMgewogICAgICAgIGFsbG93X3N0b3JhZ2UocF9zdG9yYWdlcywgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpCiAgICB9CgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiB0cnVlIikKfQoKYWxsb3dfc3RvcmFnZShwX3N0b3JhZ2VzLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgc29tZSBwX3N0b3JhZ2UgaW4gcF9zdG9yYWdlcwoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiBwX3N0b3JhZ2UgPSIsIHBfc3RvcmFnZSkKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiBpX3N0b3JhZ2UgPSIsIGlfc3RvcmFnZSkKCiAgICBwX3N0b3JhZ2UuZHJpdmVyICAgICAgICAgICA9PSBpX3N0b3JhZ2UuZHJpdmVyCiAgICBwX3N0b3JhZ2UuZHJpdmVyX29wdGlvbnMgICA9PSBpX3N0b3JhZ2UuZHJpdmVyX29wdGlvbnMKICAgIHBfc3RvcmFnZS5mc19ncm91cCAgICAgICAgID09IGlfc3RvcmFnZS5mc19ncm91cAogICAgcF9zdG9yYWdlLmZzdHlwZSAgICAgICAgICAgPT0gaV9zdG9yYWdlLmZzdHlwZQoKICAgIGFsbG93X3N0b3JhZ2Vfc291cmNlKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKQogICAgYWxsb3dfc3RvcmFnZV9vcHRpb25zKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKQogICAgYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKQoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiB0cnVlIikKfQoKYWxsb3dfc3RvcmFnZV9zb3VyY2UocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX3NvdXJjZSAxOiBzdGFydCIpCgogICAgcF9zdG9yYWdlLnNvdXJjZSA9PSBpX3N0b3JhZ2Uuc291cmNlCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDE6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX3NvdXJjZShwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDI6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCgogICAgIyBEREREOkJCOkRELkY6IERvbWFpbjpCdXM6RGV2aWNlLkZ1bmN0aW9uCiAgICAjIGh0dHBzOi8vd3d3Lmtlcm5lbC5vcmcvZG9jL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtYnVzLXBjaQogICAgcmVnZXgubWF0Y2goYF5bYS1mMC05XXs0fTpbYS1mMC05XXsyfTpbYS1mMC05XXsyfVwuW2EtZjAtOV0kYCwgaV9zdG9yYWdlLnNvdXJjZSkKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9zb3VyY2UgMjogdHJ1ZSIpCn0KCmFsbG93X3N0b3JhZ2Vfc291cmNlKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKSB7CiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9zb3VyY2UgMzogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIGlfc3RvcmFnZS5zb3VyY2UgPT0gIm5vbmUiCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDM6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX3NvdXJjZShwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDQ6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJzbWIiCgogICAgIyBQYXR0ZXJuOiAvLzxzdG9yYWdlLWFjY291bnQtbmFtZT4uZmlsZS5jb3JlLndpbmRvd3MubmV0LzxrOHMtUFZDLW5hbWU+CiAgICAjIFN0b3JhZ2UgYWNjb3VudCBuYW1lOiBodHRwczovL2xlYXJuLm1pY3Jvc29mdC5jb20vZW4tdXMvYXp1cmUvc3RvcmFnZS9jb21tb24vc3RvcmFnZS1hY2NvdW50LW92ZXJ2aWV3I3N0b3JhZ2UtYWNjb3VudC1uYW1lCiAgICAjIEs4cyBQVkMgbmFtZTogaHR0cHM6Ly9rdWJlcm5ldGVzLmlvL2RvY3MvY29uY2VwdHMvb3ZlcnZpZXcvd29ya2luZy13aXRoLW9iamVjdHMvbmFtZXMvI2Rucy1zdWJkb21haW4tbmFtZXMKICAgIHJlZ2V4Lm1hdGNoKGBeXC9cLyhbYS16MC05XXszLDI0fSlcLmZpbGVcLmNvcmVcLndpbmRvd3NcLm5ldFwvW2EtejAtOV0oW2EtejAtOS4tXXswLDI1MX1bYS16MC05XSk/JGAsIGlfc3RvcmFnZS5zb3VyY2UpCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDQ6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMTogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgIT0gIm92ZXJsYXlmcyIKICAgIHBfc3RvcmFnZS5vcHRpb25zID09IGlfc3RvcmFnZS5vcHRpb25zCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAxOiB0cnVlIikKfQphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIGNvdW50KHBfc3RvcmFnZS5vcHRpb25zKSA9PSAyCgogICAgcG9saWN5X2lkcyA6PSBzcGxpdChwX3N0b3JhZ2Uub3B0aW9uc1swXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBwb2xpY3lfaWRzID0iLCBwb2xpY3lfaWRzKQogICAgcG9saWN5X2lkcyA9PSBsYXllcl9pZHMKCiAgICBwb2xpY3lfaGFzaGVzIDo9IHNwbGl0KHBfc3RvcmFnZS5vcHRpb25zWzFdLCAiOiIpCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IHBvbGljeV9oYXNoZXMgPSIsIHBvbGljeV9oYXNoZXMpCgogICAgcF9jb3VudCA6PSBjb3VudChwb2xpY3lfaWRzKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBwX2NvdW50ID0iLCBwX2NvdW50KQogICAgcF9jb3VudCA+PSAxCiAgICBwX2NvdW50ID09IGNvdW50KHBvbGljeV9oYXNoZXMpCgogICAgaV9jb3VudCA6PSBjb3VudChpX3N0b3JhZ2Uub3B0aW9ucykKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogaV9jb3VudCA9IiwgaV9jb3VudCkKICAgIGlfY291bnQgPT0gcF9jb3VudCArIDMKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zWzBdID0iLCBpX3N0b3JhZ2Uub3B0aW9uc1swXSkKICAgIGlfc3RvcmFnZS5vcHRpb25zWzBdID09ICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQubGF5ZXItc3JjLXByZWZpeD0vdmFyL2xpYi9jb250YWluZXJkL2lvLmNvbnRhaW5lcmQuc25hcHNob3R0ZXIudjEudGFyZGV2L2xheWVycyIKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zW2lfY291bnQgLSAyXSA9IiwgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDJdKQogICAgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDJdID09ICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQub3ZlcmxheS1ydyIKCiAgICBsb3dlcmRpciA6PSBjb25jYXQoIj0iLCBbImxvd2VyZGlyIiwgcF9zdG9yYWdlLm9wdGlvbnNbMF1dKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBsb3dlcmRpciA9IiwgbG93ZXJkaXIpCgogICAgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDFdID09IGxvd2VyZGlyCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zW2lfY291bnQgLSAxXSA9IiwgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDFdKQoKICAgIGV2ZXJ5IGksIHBvbGljeV9pZCBpbiBwb2xpY3lfaWRzIHsKICAgICAgICBhbGxvd19vdmVybGF5X2xheWVyKHBvbGljeV9pZCwgcG9saWN5X2hhc2hlc1tpXSwgaV9zdG9yYWdlLm9wdGlvbnNbaSArIDFdKQogICAgfQoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogdHJ1ZSIpCn0KYWxsb3dfc3RvcmFnZV9vcHRpb25zKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKSB7CiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDM6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCiAgICBjb3VudChwX3N0b3JhZ2Uub3B0aW9ucykgPT0gMQoKICAgIHN0YXJ0c3dpdGgocF9zdG9yYWdlLm9wdGlvbnNbMF0sICIkKGhhc2giKQogICAgaGFzaF9zdWZmaXggOj0gdHJpbV9sZWZ0KHBfc3RvcmFnZS5vcHRpb25zWzBdLCAiJChoYXNoIikKCiAgICBlbmRzd2l0aChoYXNoX3N1ZmZpeCwgIikiKQogICAgaGFzaF9pbmRleCA6PSB0cmltX3JpZ2h0KGhhc2hfc3VmZml4LCAiKSIpCiAgICBpIDo9IHRvX251bWJlcihoYXNoX2luZGV4KQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAzOiBpID0iLCBpKQoKICAgIGhhc2hfb3B0aW9uIDo9IGNvbmNhdCgiPSIsIFsiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LnJvb3QtaGFzaCIsIHJvb3RfaGFzaGVzW2ldXSkKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMzogaGFzaF9vcHRpb24gPSIsIGhhc2hfb3B0aW9uKQoKICAgIGNvdW50KGlfc3RvcmFnZS5vcHRpb25zKSA9PSA0CiAgICBpX3N0b3JhZ2Uub3B0aW9uc1swXSA9PSAicm8iCiAgICBpX3N0b3JhZ2Uub3B0aW9uc1sxXSA9PSAiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmJsb2NrX2RldmljZT1maWxlIgogICAgaV9zdG9yYWdlLm9wdGlvbnNbMl0gPT0gImlvLmthdGFjb250YWluZXJzLmZzLW9wdC5pcy1sYXllciIKICAgIGlfc3RvcmFnZS5vcHRpb25zWzNdID09IGhhc2hfb3B0aW9uCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAzOiB0cnVlIikKfQphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgNDogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gInNtYiIKICAgIHBfb3B0c19jb3VudCA6PSBjb3VudChwX3N0b3JhZ2Uub3B0aW9ucykKICAgIGlfb3B0c19jb3VudCA6PSBjb3VudChpX3N0b3JhZ2Uub3B0aW9ucykKICAgIGlfb3B0c19jb3VudCA9PSBwX29wdHNfY291bnQgKyAyCgogICAgaV9vcHRfbWF0Y2hlcyA6PSBbaSB8IGkgOj0gaWR4OyBpZHggPCBwX29wdHNfY291bnQ7IHBfc3RvcmFnZS5vcHRpb25zW2lkeF0gPT0gaV9zdG9yYWdlLm9wdGlvbnNbaWR4XV0KICAgIGNvdW50KGlfb3B0X21hdGNoZXMpID09IHBfb3B0c19jb3VudAoKICAgIHN0YXJ0c3dpdGgoaV9zdG9yYWdlLm9wdGlvbnNbaV9vcHRzX2NvdW50LTJdLCAiYWRkcj0iKQogICAgY3JlZHMgPSBzcGxpdChpX3N0b3JhZ2Uub3B0aW9uc1tpX29wdHNfY291bnQtMV0sICIsIikKICAgIGNvdW50KGNyZWRzKSA9PSAyCiAgICBzdGFydHN3aXRoKGNyZWRzWzBdLCAidXNlcm5hbWU9IikKICAgIHN0YXJ0c3dpdGgoY3JlZHNbMV0sICJwYXNzd29yZD0iKQogICAgCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDQ6IHRydWUiKQp9CgphbGxvd19vdmVybGF5X2xheWVyKHBvbGljeV9pZCwgcG9saWN5X2hhc2gsIGlfb3B0aW9uKSB7CiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogcG9saWN5X2lkID0iLCBwb2xpY3lfaWQsICJwb2xpY3lfaGFzaCA9IiwgcG9saWN5X2hhc2gpCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogaV9vcHRpb24gPSIsIGlfb3B0aW9uKQoKICAgIHN0YXJ0c3dpdGgoaV9vcHRpb24sICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQubGF5ZXI9IikKICAgIGlfdmFsdWUgOj0gcmVwbGFjZShpX29wdGlvbiwgImlvLmthdGFjb250YWluZXJzLmZzLW9wdC5sYXllcj0iLCAiIikKICAgIGlfdmFsdWVfZGVjb2RlZCA6PSBiYXNlNjQuZGVjb2RlKGlfdmFsdWUpCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogaV92YWx1ZV9kZWNvZGVkID0iLCBpX3ZhbHVlX2RlY29kZWQpCgogICAgcG9saWN5X3N1ZmZpeCA6PSBjb25jYXQoIj0iLCBbInRhcixybyxpby5rYXRhY29udGFpbmVycy5mcy1vcHQuYmxvY2tfZGV2aWNlPWZpbGUsaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmlzLWxheWVyLGlvLmthdGFjb250YWluZXJzLmZzLW9wdC5yb290LWhhc2giLCBwb2xpY3lfaGFzaF0pCiAgICBwX3ZhbHVlIDo9IGNvbmNhdCgiLCIsIFtwb2xpY3lfaWQsIHBvbGljeV9zdWZmaXhdKQogICAgcHJpbnQoImFsbG93X292ZXJsYXlfbGF5ZXI6IHBfdmFsdWUgPSIsIHBfdmFsdWUpCgogICAgcF92YWx1ZSA9PSBpX3ZhbHVlX2RlY29kZWQKCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogdHJ1ZSIpCn0KCmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAidGFyIgoKICAgIHN0YXJ0c3dpdGgocF9zdG9yYWdlLm1vdW50X3BvaW50LCAiJChsYXllciIpCiAgICBtb3VudF9zdWZmaXggOj0gdHJpbV9sZWZ0KHBfc3RvcmFnZS5tb3VudF9wb2ludCwgIiQobGF5ZXIiKQoKICAgIGVuZHN3aXRoKG1vdW50X3N1ZmZpeCwgIikiKQogICAgbGF5ZXJfaW5kZXggOj0gdHJpbV9yaWdodChtb3VudF9zdWZmaXgsICIpIikKICAgIGkgOj0gdG9fbnVtYmVyKGxheWVyX2luZGV4KQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDE6IGkgPSIsIGkpCgogICAgbGF5ZXJfaWQgOj0gbGF5ZXJfaWRzW2ldCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMTogbGF5ZXJfaWQgPSIsIGxheWVyX2lkKQoKICAgIHBfbW91bnQgOj0gY29uY2F0KCIvIiwgWyIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L2xheWVycyIsIGxheWVyX2lkXSkKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCAxOiBwX21vdW50ID0iLCBwX21vdW50KQoKICAgIHBfbW91bnQgPT0gaV9zdG9yYWdlLm1vdW50X3BvaW50CgogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDE6IHRydWUiKQp9CmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAiZnVzZTMua2F0YS1vdmVybGF5IgoKICAgIG1vdW50MSA6PSByZXBsYWNlKHBfc3RvcmFnZS5tb3VudF9wb2ludCwgIiQoY3BhdGgpIiwgcG9saWN5X2RhdGEuY29tbW9uLmNwYXRoKQogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDI6IG1vdW50MiA9IiwgbW91bnQyKQoKICAgIG1vdW50MiA9PSBpX3N0b3JhZ2UubW91bnRfcG9pbnQKCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMjogdHJ1ZSIpCn0KYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKSB7CiAgICBwX3N0b3JhZ2UuZnN0eXBlID09ICJsb2NhbCIKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQyID0iLCBtb3VudDIpCgogICAgbW91bnQzIDo9IHJlcGxhY2UobW91bnQyLCAiJChzYW5kYm94LWlkKSIsIHNhbmRib3hfaWQpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQzID0iLCBtb3VudDMpCgogICAgcmVnZXgubWF0Y2gobW91bnQzLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCgogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDM6IHRydWUiKQp9CmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAiYmluZCIKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNDogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNDogbW91bnQyID0iLCBtb3VudDIpCgogICAgbW91bnQzIDo9IHJlcGxhY2UobW91bnQyLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDQ6IG1vdW50MyA9IiwgbW91bnQzKQoKICAgIHJlZ2V4Lm1hdGNoKG1vdW50MywgaV9zdG9yYWdlLm1vdW50X3BvaW50KQoKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA0OiB0cnVlIikKfQphbGxvd19tb3VudF9wb2ludChwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgYnVuZGxlX2lkLCBzYW5kYm94X2lkLCBsYXllcl9pZHMpIHsKICAgIHBfc3RvcmFnZS5mc3R5cGUgPT0gInRtcGZzIgoKICAgIG1vdW50MSA6PSBwX3N0b3JhZ2UubW91bnRfcG9pbnQKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA1OiBtb3VudDEgPSIsIG1vdW50MSkKCiAgICByZWdleC5tYXRjaChtb3VudDEsIGlfc3RvcmFnZS5tb3VudF9wb2ludCkKCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNTogdHJ1ZSIpCn0KYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKSB7CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogaV9zdG9yYWdlLm1vdW50X3BvaW50ID0iLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCiAgICBhbGxvd19kaXJlY3Rfdm9sX2RyaXZlcihwX3N0b3JhZ2UsIGlfc3RvcmFnZSkKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChzcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQyID0iLCBtb3VudDIpCgogICAgZGlyZWN0X3ZvbF9wYXRoIDo9IGlfc3RvcmFnZS5zb3VyY2UKICAgIG1vdW50MyA6PSByZXBsYWNlKG1vdW50MiwgIiQoYjY0LWRpcmVjdC12b2wtcGF0aCkiLCBiYXNlNjR1cmwuZW5jb2RlKGRpcmVjdF92b2xfcGF0aCkpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQzID0iLCBtb3VudDMpCgogICAgbW91bnQzID09IGlfc3RvcmFnZS5tb3VudF9wb2ludAoKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA2OiB0cnVlIikKfQoKYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIocF9zdG9yYWdlLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19kaXJlY3Rfdm9sX2RyaXZlciAxOiBzdGFydCIpCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCiAgICBwcmludCgiYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIgMTogdHJ1ZSIpCn0KYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIocF9zdG9yYWdlLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19kaXJlY3Rfdm9sX2RyaXZlciAyOiBzdGFydCIpCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJzbWIiCiAgICBwcmludCgiYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIgMjogdHJ1ZSIpCn0KCiMgRXhlY1Byb2Nlc3NSZXF1ZXN0LnByb2Nlc3MuQ2FwYWJpbGl0aWVzCmFsbG93X2V4ZWNfY2FwcyhpX2NhcHMpIHsKICAgIG5vdCBpX2NhcHMuQW1iaWVudAogICAgbm90IGlfY2Fwcy5Cb3VuZGluZwogICAgbm90IGlfY2Fwcy5FZmZlY3RpdmUKICAgIG5vdCBpX2NhcHMuSW5oZXJpdGFibGUKICAgIG5vdCBpX2NhcHMuUGVybWl0dGVkCn0KCiMgT0NJLlByb2Nlc3MuQ2FwYWJpbGl0aWVzCmFsbG93X2NhcHMocF9jYXBzLCBpX2NhcHMpIHsKICAgIHByaW50KCJhbGxvd19jYXBzOiBwb2xpY3kgQW1iaWVudCA9IiwgcF9jYXBzLkFtYmllbnQpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgQW1iaWVudCA9IiwgaV9jYXBzLkFtYmllbnQpCiAgICBtYXRjaF9jYXBzKHBfY2Fwcy5BbWJpZW50LCBpX2NhcHMuQW1iaWVudCkKCiAgICBwcmludCgiYWxsb3dfY2FwczogcG9saWN5IEJvdW5kaW5nID0iLCBwX2NhcHMuQm91bmRpbmcpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgQm91bmRpbmcgPSIsIGlfY2Fwcy5Cb3VuZGluZykKICAgIG1hdGNoX2NhcHMocF9jYXBzLkJvdW5kaW5nLCBpX2NhcHMuQm91bmRpbmcpCgogICAgcHJpbnQoImFsbG93X2NhcHM6IHBvbGljeSBFZmZlY3RpdmUgPSIsIHBfY2Fwcy5FZmZlY3RpdmUpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgRWZmZWN0aXZlID0iLCBpX2NhcHMuRWZmZWN0aXZlKQogICAgbWF0Y2hfY2FwcyhwX2NhcHMuRWZmZWN0aXZlLCBpX2NhcHMuRWZmZWN0aXZlKQoKICAgIHByaW50KCJhbGxvd19jYXBzOiBwb2xpY3kgSW5oZXJpdGFibGUgPSIsIHBfY2Fwcy5Jbmhlcml0YWJsZSkKICAgIHByaW50KCJhbGxvd19jYXBzOiBpbnB1dCBJbmhlcml0YWJsZSA9IiwgaV9jYXBzLkluaGVyaXRhYmxlKQogICAgbWF0Y2hfY2FwcyhwX2NhcHMuSW5oZXJpdGFibGUsIGlfY2Fwcy5Jbmhlcml0YWJsZSkKCiAgICBwcmludCgiYWxsb3dfY2FwczogcG9saWN5IFBlcm1pdHRlZCA9IiwgcF9jYXBzLlBlcm1pdHRlZCkKICAgIHByaW50KCJhbGxvd19jYXBzOiBpbnB1dCBQZXJtaXR0ZWQgPSIsIGlfY2Fwcy5QZXJtaXR0ZWQpCiAgICBtYXRjaF9jYXBzKHBfY2Fwcy5QZXJtaXR0ZWQsIGlfY2Fwcy5QZXJtaXR0ZWQpCn0KCm1hdGNoX2NhcHMocF9jYXBzLCBpX2NhcHMpIHsKICAgIHByaW50KCJtYXRjaF9jYXBzIDE6IHN0YXJ0IikKCiAgICBwX2NhcHMgPT0gaV9jYXBzCgogICAgcHJpbnQoIm1hdGNoX2NhcHMgMTogdHJ1ZSIpCn0KbWF0Y2hfY2FwcyhwX2NhcHMsIGlfY2FwcykgewogICAgcHJpbnQoIm1hdGNoX2NhcHMgMjogc3RhcnQiKQoKICAgIGNvdW50KHBfY2FwcykgPT0gMQogICAgcF9jYXBzWzBdID09ICIkKGRlZmF1bHRfY2FwcykiCgogICAgcHJpbnQoIm1hdGNoX2NhcHMgMjogZGVmYXVsdF9jYXBzID0iLCBwb2xpY3lfZGF0YS5jb21tb24uZGVmYXVsdF9jYXBzKQogICAgcG9saWN5X2RhdGEuY29tbW9uLmRlZmF1bHRfY2FwcyA9PSBpX2NhcHMKCiAgICBwcmludCgibWF0Y2hfY2FwcyAyOiB0cnVlIikKfQptYXRjaF9jYXBzKHBfY2FwcywgaV9jYXBzKSB7CiAgICBwcmludCgibWF0Y2hfY2FwcyAzOiBzdGFydCIpCgogICAgY291bnQocF9jYXBzKSA9PSAxCiAgICBwX2NhcHNbMF0gPT0gIiQocHJpdmlsZWdlZF9jYXBzKSIKCiAgICBwcmludCgibWF0Y2hfY2FwcyAzOiBwcml2aWxlZ2VkX2NhcHMgPSIsIHBvbGljeV9kYXRhLmNvbW1vbi5wcml2aWxlZ2VkX2NhcHMpCiAgICBwb2xpY3lfZGF0YS5jb21tb24ucHJpdmlsZWdlZF9jYXBzID09IGlfY2FwcwoKICAgIHByaW50KCJtYXRjaF9jYXBzIDM6IHRydWUiKQp9CgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgpjaGVja19kaXJlY3RvcnlfdHJhdmVyc2FsKGlfcGF0aCkgewogICAgbm90IHJlZ2V4Lm1hdGNoKCIoXnwvKS4uKCR8LykiLCBpX3BhdGgpCn0KCmNoZWNrX3N5bWxpbmtfc291cmNlKGlfc3JjKSB7CiAgICBpX3NyYyA9PSAiIgogICAgcHJpbnQoImNoZWNrX3N5bWxpbmtfc291cmNlIDE6IHRydWUiKQp9CmNoZWNrX3N5bWxpbmtfc291cmNlKGlfc3JjKSB7CiAgICBpX3NyYyAhPSAiIgogICAgcHJpbnQoImNoZWNrX3N5bWxpbmtfc291cmNlIDI6IGlfc3JjID0iLCBpX3NyYykKCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24uc19zb3VyY2UxLCBpX3NyYykKCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMjogdHJ1ZSIpCn0KY2hlY2tfc3ltbGlua19zb3VyY2UoaV9zcmMpIHsKICAgIGlfc3JjICE9ICIiCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMzogaV9zcmMgPSIsIGlfc3JjKQoKICAgIHJlZ2V4Lm1hdGNoKHBvbGljeV9kYXRhLmNvbW1vbi5zX3NvdXJjZTIsIGlfc3JjKQogICAgY2hlY2tfZGlyZWN0b3J5X3RyYXZlcnNhbChpX3NyYykKCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMzogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfc3RvcmFnZXMoaV9zdG9yYWdlcykgewogICAgcHJpbnQoImFsbG93X3NhbmRib3hfc3RvcmFnZXM6IGlfc3RvcmFnZXMgPSIsIGlfc3RvcmFnZXMpCgogICAgcF9zdG9yYWdlcyA6PSBwb2xpY3lfZGF0YS5zYW5kYm94LnN0b3JhZ2VzCiAgICBldmVyeSBpX3N0b3JhZ2UgaW4gaV9zdG9yYWdlcyB7CiAgICAgICAgYWxsb3dfc2FuZGJveF9zdG9yYWdlKHBfc3RvcmFnZXMsIGlfc3RvcmFnZSkKICAgIH0KCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9zdG9yYWdlczogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfc3RvcmFnZShwX3N0b3JhZ2VzLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IGlfc3RvcmFnZSA9IiwgaV9zdG9yYWdlKQoKICAgIHNvbWUgcF9zdG9yYWdlIGluIHBfc3RvcmFnZXMKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IHBfc3RvcmFnZSA9IiwgcF9zdG9yYWdlKQogICAgaV9zdG9yYWdlID09IHBfc3RvcmFnZQoKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IHRydWUiKQp9CgpDb3B5RmlsZVJlcXVlc3QgewogICAgcHJpbnQoIkNvcHlGaWxlUmVxdWVzdDogaW5wdXQucGF0aCA9IiwgaW5wdXQucGF0aCkKCiAgICBjaGVja19zeW1saW5rX3NvdXJjZShpbnB1dC5zeW1saW5rX3NyYykKICAgIGNoZWNrX2RpcmVjdG9yeV90cmF2ZXJzYWwoaW5wdXQucGF0aCkKCiAgICBzb21lIHJlZ2V4MSBpbiBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLkNvcHlGaWxlUmVxdWVzdAogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5jcGF0aCkKICAgIHJlZ2V4NCA6PSByZXBsYWNlKHJlZ2V4MywgIiQoYnVuZGxlLWlkKSIsIEJVTkRMRV9JRCkKICAgIHByaW50KCJDb3B5RmlsZVJlcXVlc3Q6IHJlZ2V4NCA9IiwgcmVnZXg0KQoKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4NCwgaW5wdXQucGF0aCkKCiAgICBwcmludCgiQ29weUZpbGVSZXF1ZXN0OiB0cnVlIikKfQoKQ3JlYXRlU2FuZGJveFJlcXVlc3QgewogICAgcHJpbnQoIkNyZWF0ZVNhbmRib3hSZXF1ZXN0OiBpbnB1dC5ndWVzdF9ob29rX3BhdGggPSIsIGlucHV0Lmd1ZXN0X2hvb2tfcGF0aCkKICAgIGNvdW50KGlucHV0Lmd1ZXN0X2hvb2tfcGF0aCkgPT0gMAoKICAgIHByaW50KCJDcmVhdGVTYW5kYm94UmVxdWVzdDogaW5wdXQua2VybmVsX21vZHVsZXMgPSIsIGlucHV0Lmtlcm5lbF9tb2R1bGVzKQogICAgY291bnQoaW5wdXQua2VybmVsX21vZHVsZXMpID09IDAKCiAgICBpX3BpZG5zIDo9IGlucHV0LnNhbmRib3hfcGlkbnMKICAgIHByaW50KCJDcmVhdGVTYW5kYm94UmVxdWVzdDogaV9waWRucyA9IiwgaV9waWRucykKICAgIGlfcGlkbnMgPT0gZmFsc2UKICAgIGFsbG93X3NhbmRib3hfc3RvcmFnZXMoaW5wdXQuc3RvcmFnZXMpCn0KCmFsbG93X2V4ZWMocF9jb250YWluZXIsIGlfcHJvY2VzcykgewogICAgcHJpbnQoImFsbG93X2V4ZWM6IHN0YXJ0IikKCiAgICBwX29jaSA9IHBfY29udGFpbmVyLk9DSQogICAgcF9zX25hbWUgPSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc19uYW1lc3BhY2UgPSBnZXRfc3RhdGVfdmFsKCJuYW1lc3BhY2UiKQogICAgYWxsb3dfcHJvYmVfcHJvY2VzcyhwX29jaS5Qcm9jZXNzLCBpX3Byb2Nlc3MsIHBfc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfZXhlYzogdHJ1ZSIpCn0KCmFsbG93X2ludGVyYWN0aXZlX2V4ZWMocF9jb250YWluZXIsIGlfcHJvY2VzcykgewogICAgcHJpbnQoImFsbG93X2ludGVyYWN0aXZlX2V4ZWM6IHN0YXJ0IikKCiAgICBwX29jaSA9IHBfY29udGFpbmVyLk9DSQogICAgcF9zX25hbWUgPSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc19uYW1lc3BhY2UgPSBnZXRfc3RhdGVfdmFsKCJuYW1lc3BhY2UiKQogICAgYWxsb3dfaW50ZXJhY3RpdmVfcHJvY2VzcyhwX29jaS5Qcm9jZXNzLCBpX3Byb2Nlc3MsIHBfc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfaW50ZXJhY3RpdmVfZXhlYzogdHJ1ZSIpCn0KCiMgVE9ETzogc2hvdWxkIG90aGVyIEV4ZWNQcm9jZXNzUmVxdWVzdCBpbnB1dCBkYXRhIGZpZWxkcyBiZSB2YWxpZGF0ZWQgYXMgd2VsbD8KRXhlY1Byb2Nlc3NSZXF1ZXN0IHsKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMTogaW5wdXQgPSIsIGlucHV0KQoKICAgIHNvbWUgcF9jb21tYW5kIGluIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuRXhlY1Byb2Nlc3NSZXF1ZXN0LmFsbG93ZWRfY29tbWFuZHMKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMTogcF9jb21tYW5kID0iLCBwX2NvbW1hbmQpCiAgICBwX2NvbW1hbmQgPT0gaW5wdXQucHJvY2Vzcy5BcmdzCgogICAgIyBUT0RPOiBtYXRjaCBwX2NvbnRhaW5lcidzIElEIHdpdGggdGhlIGlucHV0IGNvbnRhaW5lcl9pZC4KICAgIHNvbWUgcF9jb250YWluZXIgaW4gcG9saWN5X2RhdGEuY29udGFpbmVycwogICAgYWxsb3dfaW50ZXJhY3RpdmVfZXhlYyhwX2NvbnRhaW5lciwgaW5wdXQucHJvY2VzcykKCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDE6IHRydWUiKQp9CkV4ZWNQcm9jZXNzUmVxdWVzdCB7CiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDI6IGlucHV0ID0iLCBpbnB1dCkKCiAgICAjIFRPRE86IG1hdGNoIGlucHV0IGNvbnRhaW5lciBJRCB3aXRoIGl0cyBjb3JyZXNwb25kaW5nIGNvbnRhaW5lci5leGVjX2NvbW1hbmRzLgogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBzb21lIHBfY29tbWFuZCBpbiBwX2NvbnRhaW5lci5leGVjX2NvbW1hbmRzCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDI6IHBfY29tbWFuZCA9IiwgcF9jb21tYW5kKQoKICAgICMgVE9ETzogc2hvdWxkIG90aGVyIGlucHV0IGRhdGEgZmllbGRzIGJlIHZhbGlkYXRlZCBhcyB3ZWxsPwogICAgcF9jb21tYW5kID09IGlucHV0LnByb2Nlc3MuQXJncwoKICAgIGFsbG93X2V4ZWMocF9jb250YWluZXIsIGlucHV0LnByb2Nlc3MpCgogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAyOiB0cnVlIikKfQpFeGVjUHJvY2Vzc1JlcXVlc3QgewogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAzOiBpbnB1dCA9IiwgaW5wdXQpCgogICAgaV9jb21tYW5kID0gY29uY2F0KCIgIiwgaW5wdXQucHJvY2Vzcy5BcmdzKQogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAzOiBpX2NvbW1hbmQgPSIsIGlfY29tbWFuZCkKCiAgICBzb21lIHBfcmVnZXggaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5FeGVjUHJvY2Vzc1JlcXVlc3QucmVnZXgKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMzogcF9yZWdleCA9IiwgcF9yZWdleCkKCiAgICByZWdleC5tYXRjaChwX3JlZ2V4LCBpX2NvbW1hbmQpCgogICAgIyBUT0RPOiBtYXRjaCBwX2NvbnRhaW5lcidzIElEIHdpdGggdGhlIGlucHV0IGNvbnRhaW5lcl9pZC4KICAgIHNvbWUgcF9jb250YWluZXIgaW4gcG9saWN5X2RhdGEuY29udGFpbmVycwogICAgYWxsb3dfaW50ZXJhY3RpdmVfZXhlYyhwX2NvbnRhaW5lciwgaW5wdXQucHJvY2VzcykKCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDM6IHRydWUiKQp9CgpVcGRhdGVSb3V0ZXNSZXF1ZXN0IHsKICAgIHByaW50KCJVcGRhdGVSb3V0ZXNSZXF1ZXN0OiBpbnB1dCA9IiwgaW5wdXQpCiAgICBwcmludCgiVXBkYXRlUm91dGVzUmVxdWVzdDogcG9saWN5ID0iLCBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLlVwZGF0ZVJvdXRlc1JlcXVlc3QpCgogICAgaV9yb3V0ZXMgOj0gaW5wdXQucm91dGVzLlJvdXRlcwogICAgcF9zb3VyY2VfcmVnZXggPSBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLlVwZGF0ZVJvdXRlc1JlcXVlc3QuZm9yYmlkZGVuX3NvdXJjZV9yZWdleAogICAgcF9uYW1lcyA9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuVXBkYXRlUm91dGVzUmVxdWVzdC5mb3JiaWRkZW5fZGV2aWNlX25hbWVzCgogICAgZXZlcnkgaV9yb3V0ZSBpbiBpX3JvdXRlcyB7CiAgICAgICAgcHJpbnQoImlfcm91dGUuc291cmNlID0iLCBpX3JvdXRlLnNvdXJjZSkKICAgICAgICBldmVyeSBwX3JlZ2V4IGluIHBfc291cmNlX3JlZ2V4IHsKICAgICAgICAgICAgcHJpbnQoInBfcmVnZXggPSIsIHBfcmVnZXgpCiAgICAgICAgICAgIG5vdCByZWdleC5tYXRjaChwX3JlZ2V4LCBpX3JvdXRlLnNvdXJjZSkKICAgICAgICB9CgogICAgICAgIHByaW50KCJpX3JvdXRlLmRldmljZSA9IiwgaV9yb3V0ZS5kZXZpY2UpCiAgICAgICAgbm90IGlfcm91dGUuZGV2aWNlIGluIHBfbmFtZXMKICAgIH0KCiAgICBwcmludCgiVXBkYXRlUm91dGVzUmVxdWVzdDogdHJ1ZSIpCn0KClVwZGF0ZUludGVyZmFjZVJlcXVlc3QgewogICAgcHJpbnQoIlVwZGF0ZUludGVyZmFjZVJlcXVlc3Q6IGlucHV0ID0iLCBpbnB1dCkKICAgIHByaW50KCJVcGRhdGVJbnRlcmZhY2VSZXF1ZXN0OiBwb2xpY3kgPSIsIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuVXBkYXRlSW50ZXJmYWNlUmVxdWVzdCkKCiAgICBpX2ludGVyZmFjZSA6PSBpbnB1dC5pbnRlcmZhY2UKICAgIHBfZmxhZ3MgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmFsbG93X3Jhd19mbGFncwoKICAgICMgVHlwaWNhbGx5LCBqdXN0IElGRl9OT0FSUCBpcyB1c2VkLgogICAgYml0cy5hbmQoaV9pbnRlcmZhY2UucmF3X2ZsYWdzLCBiaXRzLm5lZ2F0ZShwX2ZsYWdzKSkgPT0gMAoKICAgIHBfbmFtZXMgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmZvcmJpZGRlbl9uYW1lcwoKICAgIG5vdCBpX2ludGVyZmFjZS5uYW1lIGluIHBfbmFtZXMKCiAgICBwX2h3YWRkcnMgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmZvcmJpZGRlbl9od19hZGRycwoKICAgIG5vdCBpX2ludGVyZmFjZS5od0FkZHIgaW4gcF9od2FkZHJzCgogICAgcHJpbnQoIlVwZGF0ZUludGVyZmFjZVJlcXVlc3Q6IHRydWUiKQp9CgpDbG9zZVN0ZGluUmVxdWVzdCB7CiAgICBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLkNsb3NlU3RkaW5SZXF1ZXN0ID09IHRydWUKfQoKUmVhZFN0cmVhbVJlcXVlc3QgewogICAgcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5SZWFkU3RyZWFtUmVxdWVzdCA9PSB0cnVlCn0KClVwZGF0ZUVwaGVtZXJhbE1vdW50c1JlcXVlc3QgewogICAgcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVFcGhlbWVyYWxNb3VudHNSZXF1ZXN0ID09IHRydWUKfQoKV3JpdGVTdHJlYW1SZXF1ZXN0IHsKICAgIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuV3JpdGVTdHJlYW1SZXF1ZXN0ID09IHRydWUKfQoKcG9saWN5X2RhdGEgOj0gewogICJjb250YWluZXJzIjogWwogICAgewogICAgICAiT0NJIjogewogICAgICAgICJWZXJzaW9uIjogIjEuMS4wLXJjLjEiLAogICAgICAgICJQcm9jZXNzIjogewogICAgICAgICAgIlRlcm1pbmFsIjogZmFsc2UsCiAgICAgICAgICAiVXNlciI6IHsKICAgICAgICAgICAgIlVJRCI6IDEwMDAsCiAgICAgICAgICAgICJHSUQiOiA2NTUzNSwKICAgICAgICAgICAgIkFkZGl0aW9uYWxHaWRzIjogW10sCiAgICAgICAgICAgICJVc2VybmFtZSI6ICIiCiAgICAgICAgICB9LAogICAgICAgICAgIkRlcHJlY2F0ZWRBcmdzIjogWwogICAgICAgICAgICAiL3BhdXNlIgogICAgICAgICAgXSwKICAgICAgICAgICJBcmdzIjogWwogICAgICAgICAgICAiL3BhdXNlIgogICAgICAgICAgXSwKICAgICAgICAgICJFbnYiOiBbCiAgICAgICAgICAgICJQQVRIPS91c3IvbG9jYWwvc2JpbjovdXNyL2xvY2FsL2JpbjovdXNyL3NiaW46L3Vzci9iaW46L3NiaW46L2JpbiIKICAgICAgICAgIF0sCiAgICAgICAgICAiQ3dkIjogIi8iLAogICAgICAgICAgIkNhcGFiaWxpdGllcyI6IHsKICAgICAgICAgICAgIkFtYmllbnQiOiBbXSwKICAgICAgICAgICAgIkJvdW5kaW5nIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJFZmZlY3RpdmUiOiBbCiAgICAgICAgICAgICAgIiQoZGVmYXVsdF9jYXBzKSIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgIkluaGVyaXRhYmxlIjogW10sCiAgICAgICAgICAgICJQZXJtaXR0ZWQiOiBbCiAgICAgICAgICAgICAgIiQoZGVmYXVsdF9jYXBzKSIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgICJOb05ld1ByaXZpbGVnZXMiOiB0cnVlCiAgICAgICAgfSwKICAgICAgICAiUm9vdCI6IHsKICAgICAgICAgICJQYXRoIjogIiQoY3BhdGgpLyQoYnVuZGxlLWlkKSIsCiAgICAgICAgICAiUmVhZG9ubHkiOiB0cnVlCiAgICAgICAgfSwKICAgICAgICAiTW91bnRzIjogWwogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL3Byb2MiLAogICAgICAgICAgICAic291cmNlIjogInByb2MiLAogICAgICAgICAgICAidHlwZV8iOiAicHJvYyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYiLAogICAgICAgICAgICAic291cmNlIjogInRtcGZzIiwKICAgICAgICAgICAgInR5cGVfIjogInRtcGZzIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgInN0cmljdGF0aW1lIiwKICAgICAgICAgICAgICAibW9kZT03NTUiLAogICAgICAgICAgICAgICJzaXplPTY1NTM2ayIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvcHRzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJkZXZwdHMiLAogICAgICAgICAgICAidHlwZV8iOiAiZGV2cHRzIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAgICAgIm5ld2luc3RhbmNlIiwKICAgICAgICAgICAgICAicHRteG1vZGU9MDY2NiIsCiAgICAgICAgICAgICAgIm1vZGU9MDYyMCIsCiAgICAgICAgICAgICAgImdpZD01IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi9zaG0iLAogICAgICAgICAgICAic291cmNlIjogIi9ydW4va2F0YS1jb250YWluZXJzL3NhbmRib3gvc2htIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L21xdWV1ZSIsCiAgICAgICAgICAgICJzb3VyY2UiOiAibXF1ZXVlIiwKICAgICAgICAgICAgInR5cGVfIjogIm1xdWV1ZSIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9zeXMiLAogICAgICAgICAgICAic291cmNlIjogInN5c2ZzIiwKICAgICAgICAgICAgInR5cGVfIjogInN5c2ZzIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAgICAgIm5vZGV2IiwKICAgICAgICAgICAgICAicm8iCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZXRjL3Jlc29sdi5jb25mIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KXJlc29sdi5jb25mJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicm8iLAogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2RldiIsCiAgICAgICAgICAgICAgIm5vZXhlYyIKICAgICAgICAgICAgXQogICAgICAgICAgfQogICAgICAgIF0sCiAgICAgICAgIkFubm90YXRpb25zIjogewogICAgICAgICAgImlvLmthdGFjb250YWluZXJzLnBrZy5vY2kuYnVuZGxlX3BhdGgiOiAiL3J1bi9jb250YWluZXJkL2lvLmNvbnRhaW5lcmQucnVudGltZS52Mi50YXNrL2s4cy5pby8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgImlvLmthdGFjb250YWluZXJzLnBrZy5vY2kuY29udGFpbmVyX3R5cGUiOiAicG9kX3NhbmRib3giLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLmNvbnRhaW5lci10eXBlIjogInNhbmRib3giLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtaWQiOiAiXlthLXowLTldezY0fSQiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbG9nLWRpcmVjdG9yeSI6ICJeL3Zhci9sb2cvcG9kcy8kKHNhbmRib3gtbmFtZXNwYWNlKV8kKHNhbmRib3gtbmFtZSlfWzAtOWEtZl17OH0tWzAtOWEtZl17NH0tWzAtOWEtZl17NH0tWzAtOWEtZl17NH0tWzAtOWEtZl17MTJ9JCIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1uYW1lIjogIl5yc1xcLXBvZDNcXC1bYS16MC05Li1dKlthLXowLTldJCIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1uYW1lc3BhY2UiOiAic2NoZWQtcHJlZW1wdGlvbi1wYXRoLTc2NjYiLAogICAgICAgICAgIm5lcmRjdGwvbmV0d29yay1uYW1lc3BhY2UiOiAiXi92YXIvcnVuL25ldG5zL2NuaS1bMC05YS1mXXs4fS1bMC05YS1mXXs0fS1bMC05YS1mXXs0fS1bMC05YS1mXXs0fS1bMC05YS1mXXsxMn0kIgogICAgICAgIH0sCiAgICAgICAgIkxpbnV4IjogewogICAgICAgICAgIk5hbWVzcGFjZXMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiVHlwZSI6ICJpcGMiLAogICAgICAgICAgICAgICJQYXRoIjogIiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJUeXBlIjogInV0cyIsCiAgICAgICAgICAgICAgIlBhdGgiOiAiIgogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgIlR5cGUiOiAibW91bnQiLAogICAgICAgICAgICAgICJQYXRoIjogIiIKICAgICAgICAgICAgfQogICAgICAgICAgXSwKICAgICAgICAgICJNYXNrZWRQYXRocyI6IFsKICAgICAgICAgICAgIi9wcm9jL2FjcGkiLAogICAgICAgICAgICAiL3Byb2MvYXNvdW5kIiwKICAgICAgICAgICAgIi9wcm9jL2tjb3JlIiwKICAgICAgICAgICAgIi9wcm9jL2tleXMiLAogICAgICAgICAgICAiL3Byb2MvbGF0ZW5jeV9zdGF0cyIsCiAgICAgICAgICAgICIvcHJvYy90aW1lcl9saXN0IiwKICAgICAgICAgICAgIi9wcm9jL3RpbWVyX3N0YXRzIiwKICAgICAgICAgICAgIi9wcm9jL3NjaGVkX2RlYnVnIiwKICAgICAgICAgICAgIi9zeXMvZmlybXdhcmUiLAogICAgICAgICAgICAiL3Byb2Mvc2NzaSIKICAgICAgICAgIF0sCiAgICAgICAgICAiUmVhZG9ubHlQYXRocyI6IFsKICAgICAgICAgICAgIi9wcm9jL2J1cyIsCiAgICAgICAgICAgICIvcHJvYy9mcyIsCiAgICAgICAgICAgICIvcHJvYy9pcnEiLAogICAgICAgICAgICAiL3Byb2Mvc3lzIiwKICAgICAgICAgICAgIi9wcm9jL3N5c3JxLXRyaWdnZXIiCiAgICAgICAgICBdLAogICAgICAgICAgIkRldmljZXMiOiBbXSwKICAgICAgICAgICJTeXNjdGwiOiB7CiAgICAgICAgICAgICJuZXQuaXB2NC5pcF91bnByaXZpbGVnZWRfcG9ydF9zdGFydCI6ICIwIiwKICAgICAgICAgICAgIm5ldC5pcHY0LnBpbmdfZ3JvdXBfcmFuZ2UiOiAiMCAyMTQ3NDgzNjQ3IgogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSwKICAgICAgInN0b3JhZ2VzIjogWwogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2gwKSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjApIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAib3ZlcmxheWZzIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJmdXNlMy5rYXRhLW92ZXJsYXkiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICI1YTVhYWQ4MDA1NWZmMjAwMTJhNTBkYzI1ZjhkZjdhMjk5MjQ0NzQzMjRkNjVmN2Q1MzA2ZWU4ZWUyN2ZmNzFkIiwKICAgICAgICAgICAgIjgxNzI1MGYxYTNlMzM2ZGE3NmY1YmQzZmE3ODRlMWIyNmQ5NTliOWMxMzE4NzY4MTViYTI2MDQwNDhiNzBjMTgiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQoY3BhdGgpLyQoYnVuZGxlLWlkKSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfQogICAgICBdLAogICAgICAiZGV2aWNlcyI6IFtdLAogICAgICAic2FuZGJveF9waWRucyI6IGZhbHNlLAogICAgICAiZXhlY19jb21tYW5kcyI6IFtdLAogICAgICAiZW52X21hcCI6IHsKICAgICAgICAiUEFUSCI6ICIvdXNyL2xvY2FsL3NiaW46L3Vzci9sb2NhbC9iaW46L3Vzci9zYmluOi91c3IvYmluOi9zYmluOi9iaW4iCiAgICAgIH0KICAgIH0sCiAgICB7CiAgICAgICJPQ0kiOiB7CiAgICAgICAgIlZlcnNpb24iOiAiMS4xLjAtcmMuMSIsCiAgICAgICAgIlByb2Nlc3MiOiB7CiAgICAgICAgICAiVGVybWluYWwiOiBmYWxzZSwKICAgICAgICAgICJVc2VyIjogewogICAgICAgICAgICAiVUlEIjogMTAwMCwKICAgICAgICAgICAgIkdJRCI6IDY1NTM1LAogICAgICAgICAgICAiQWRkaXRpb25hbEdpZHMiOiBbXSwKICAgICAgICAgICAgIlVzZXJuYW1lIjogIiIKICAgICAgICAgIH0sCiAgICAgICAgICAiRGVwcmVjYXRlZEFyZ3MiOiBbCiAgICAgICAgICAgICIvcGF1c2UiCiAgICAgICAgICBdLAogICAgICAgICAgIkFyZ3MiOiBbCiAgICAgICAgICAgICIvcGF1c2UiCiAgICAgICAgICBdLAogICAgICAgICAgIkVudiI6IFsKICAgICAgICAgICAgIlBBVEg9L3Vzci9sb2NhbC9zYmluOi91c3IvbG9jYWwvYmluOi91c3Ivc2JpbjovdXNyL2Jpbjovc2JpbjovYmluIiwKICAgICAgICAgICAgIkhPU1ROQU1FPSQoaG9zdC1uYW1lKSIKICAgICAgICAgIF0sCiAgICAgICAgICAiQ3dkIjogIi8iLAogICAgICAgICAgIkNhcGFiaWxpdGllcyI6IHsKICAgICAgICAgICAgIkFtYmllbnQiOiBbXSwKICAgICAgICAgICAgIkJvdW5kaW5nIjogW10sCiAgICAgICAgICAgICJFZmZlY3RpdmUiOiBbXSwKICAgICAgICAgICAgIkluaGVyaXRhYmxlIjogW10sCiAgICAgICAgICAgICJQZXJtaXR0ZWQiOiBbXQogICAgICAgICAgfSwKICAgICAgICAgICJOb05ld1ByaXZpbGVnZXMiOiB0cnVlCiAgICAgICAgfSwKICAgICAgICAiUm9vdCI6IHsKICAgICAgICAgICJQYXRoIjogIiQoY3BhdGgpLyQoYnVuZGxlLWlkKSIsCiAgICAgICAgICAiUmVhZG9ubHkiOiBmYWxzZQogICAgICAgIH0sCiAgICAgICAgIk1vdW50cyI6IFsKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9wcm9jIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJwcm9jIiwKICAgICAgICAgICAgInR5cGVfIjogInByb2MiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2IiwKICAgICAgICAgICAgInNvdXJjZSI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJzdHJpY3RhdGltZSIsCiAgICAgICAgICAgICAgIm1vZGU9NzU1IiwKICAgICAgICAgICAgICAic2l6ZT02NTUzNmsiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L3B0cyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiZGV2cHRzIiwKICAgICAgICAgICAgInR5cGVfIjogImRldnB0cyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJuZXdpbnN0YW5jZSIsCiAgICAgICAgICAgICAgInB0bXhtb2RlPTA2NjYiLAogICAgICAgICAgICAgICJtb2RlPTA2MjAiLAogICAgICAgICAgICAgICJnaWQ9NSIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvc2htIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L3NobSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi9tcXVldWUiLAogICAgICAgICAgICAic291cmNlIjogIm1xdWV1ZSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJtcXVldWUiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvc3lzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJzeXNmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJzeXNmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL3N5cy9mcy9jZ3JvdXAiLAogICAgICAgICAgICAic291cmNlIjogImNncm91cCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJjZ3JvdXAiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiLAogICAgICAgICAgICAgICJyZWxhdGltZSIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2V0Yy9ob3N0cyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClob3N0cyQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicnciCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L3Rlcm1pbmF0aW9uLWxvZyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeCl0ZXJtaW5hdGlvbi1sb2ckIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJ3IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2V0Yy9ob3N0bmFtZSIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClob3N0bmFtZSQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicnciCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZXRjL3Jlc29sdi5jb25mIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KXJlc29sdi5jb25mJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJydyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi92YXIvcnVuL3NlY3JldHMva3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudCIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClzZXJ2aWNlYWNjb3VudCQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicm8iCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvdmFyL3J1bi9zZWNyZXRzL2F6dXJlL3Rva2VucyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeCl0b2tlbnMkIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9CiAgICAgICAgXSwKICAgICAgICAiQW5ub3RhdGlvbnMiOiB7CiAgICAgICAgICAiaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5idW5kbGVfcGF0aCI6ICIvcnVuL2NvbnRhaW5lcmQvaW8uY29udGFpbmVyZC5ydW50aW1lLnYyLnRhc2svazhzLmlvLyQoYnVuZGxlLWlkKSIsCiAgICAgICAgICAiaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5jb250YWluZXJfdHlwZSI6ICJwb2RfY29udGFpbmVyIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItbmFtZSI6ICJwb2QzIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSI6ICJjb250YWluZXIiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLmltYWdlLW5hbWUiOiAicmVnaXN0cnkuazhzLmlvL3BhdXNlOjMuOCIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCI6ICJeW2EtejAtOV17NjR9JCIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1uYW1lIjogIl5yc1xcLXBvZDNcXC1bYS16MC05Li1dKlthLXowLTldJCIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1uYW1lc3BhY2UiOiAic2NoZWQtcHJlZW1wdGlvbi1wYXRoLTc2NjYiCiAgICAgICAgfSwKICAgICAgICAiTGludXgiOiB7CiAgICAgICAgICAiTmFtZXNwYWNlcyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICJUeXBlIjogImlwYyIsCiAgICAgICAgICAgICAgIlBhdGgiOiAiIgogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgIlR5cGUiOiAidXRzIiwKICAgICAgICAgICAgICAiUGF0aCI6ICIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiVHlwZSI6ICJtb3VudCIsCiAgICAgICAgICAgICAgIlBhdGgiOiAiIgogICAgICAgICAgICB9CiAgICAgICAgICBdLAogICAgICAgICAgIk1hc2tlZFBhdGhzIjogWwogICAgICAgICAgICAiL3Byb2MvYWNwaSIsCiAgICAgICAgICAgICIvcHJvYy9rY29yZSIsCiAgICAgICAgICAgICIvcHJvYy9rZXlzIiwKICAgICAgICAgICAgIi9wcm9jL2xhdGVuY3lfc3RhdHMiLAogICAgICAgICAgICAiL3Byb2MvdGltZXJfbGlzdCIsCiAgICAgICAgICAgICIvcHJvYy90aW1lcl9zdGF0cyIsCiAgICAgICAgICAgICIvcHJvYy9zY2hlZF9kZWJ1ZyIsCiAgICAgICAgICAgICIvcHJvYy9zY3NpIiwKICAgICAgICAgICAgIi9zeXMvZmlybXdhcmUiCiAgICAgICAgICBdLAogICAgICAgICAgIlJlYWRvbmx5UGF0aHMiOiBbCiAgICAgICAgICAgICIvcHJvYy9hc291bmQiLAogICAgICAgICAgICAiL3Byb2MvYnVzIiwKICAgICAgICAgICAgIi9wcm9jL2ZzIiwKICAgICAgICAgICAgIi9wcm9jL2lycSIsCiAgICAgICAgICAgICIvcHJvYy9zeXMiLAogICAgICAgICAgICAiL3Byb2Mvc3lzcnEtdHJpZ2dlciIKICAgICAgICAgIF0sCiAgICAgICAgICAiRGV2aWNlcyI6IFtdLAogICAgICAgICAgIlN5c2N0bCI6IHsKICAgICAgICAgICAgIm5ldC5pcHY0LmlwX3VucHJpdmlsZWdlZF9wb3J0X3N0YXJ0IjogIjAiLAogICAgICAgICAgICAibmV0LmlwdjQucGluZ19ncm91cF9yYW5nZSI6ICIwIDIxNDc0ODM2NDciCiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9LAogICAgICAic3RvcmFnZXMiOiBbCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJibGsiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogInRhciIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIiQoaGFzaDApIgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGxheWVyMCkiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJvdmVybGF5ZnMiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogImZ1c2UzLmthdGEtb3ZlcmxheSIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgImVkNTdmNWYwODFiMGM4NTBjODZlZDA2YjFmMmExZWRmYjdmOGQ2ZjE4M2NiZjI2MjU2M2I2NzU5ZjIxYWY0OWUiLAogICAgICAgICAgICAiYWU2YTcxMWZjM2E1N2EwYjMxMzU4OTViOGQwMDJjYzE4NGEzMWQ3ZmQ2NTUxMTNjZDU1MWZlZWExNDQ2Mjg4YyIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChjcGF0aCkvJChidW5kbGUtaWQpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9CiAgICAgIF0sCiAgICAgICJkZXZpY2VzIjogW10sCiAgICAgICJzYW5kYm94X3BpZG5zIjogZmFsc2UsCiAgICAgICJleGVjX2NvbW1hbmRzIjogW10sCiAgICAgICJlbnZfbWFwIjogewogICAgICAgICJIT1NUTkFNRSI6ICIkKGhvc3QtbmFtZSkiLAogICAgICAgICJQQVRIIjogIi91c3IvbG9jYWwvc2JpbjovdXNyL2xvY2FsL2JpbjovdXNyL3NiaW46L3Vzci9iaW46L3NiaW46L2JpbiIKICAgICAgfQogICAgfQogIF0sCiAgImNvbW1vbiI6IHsKICAgICJjcGF0aCI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zaGFyZWQvY29udGFpbmVycyIsCiAgICAibW91bnRfc291cmNlX2NwYXRoIjogIi9ydW4va2F0YS1jb250YWluZXJzL3NoYXJlZC9jb250YWluZXJzIiwKICAgICJzZnByZWZpeCI6ICJeJChjcGF0aCkvJChidW5kbGUtaWQpLVthLXowLTldezE2fS0iLAogICAgInNwYXRoIjogIi9ydW4va2F0YS1jb250YWluZXJzL3NhbmRib3gvc3RvcmFnZSIsCiAgICAiaXB2NF9hIjogIigoWzAtOV18WzEtOV1bMC05XXwxWzAtOV17Mn18MlswLTRdWzAtOV18MjVbMC01XSlcXC4pezN9KFswLTldfFsxLTldWzAtOV18MVswLTldezJ9fDJbMC00XVswLTldfDI1WzAtNV0pIiwKICAgICJpcF9wIjogIlswLTldezEsNX0iLAogICAgInN2Y19uYW1lIjogIltBLVpfXFwuXFwtXSsiLAogICAgImRuc19sYWJlbCI6ICJbYS16QS1aMC05X1xcLlxcLV0rIiwKICAgICJzX3NvdXJjZTEiOiAiXi4uMlswLTldezN9X1swLTFdWzAtOV1fWzAtM11bMC05XV9bMC0yXVswLTldX1swLTVdWzAtOV1fWzAtNV1bMC05XVxcLlswLTldezEsMTB9JCIsCiAgICAic19zb3VyY2UyIjogIl4uLmRhdGEvIiwKICAgICJkbnNfc3ViZG9tYWluIjogIl5bYS16MC05XShbLWEtejAtOV0qW2EtejAtOV0pPyQiLAogICAgInBvZF91aWQiOiAiXlswLTlhLWZBLUZdezh9LVswLTlhLWZBLUZdezR9LVswLTlhLWZBLUZdezR9LVswLTlhLWZBLUZdezR9LVswLTlhLWZBLUZdezEyfSQiLAogICAgImRlZmF1bHRfY2FwcyI6IFsKICAgICAgIkNBUF9DSE9XTiIsCiAgICAgICJDQVBfREFDX09WRVJSSURFIiwKICAgICAgIkNBUF9GU0VUSUQiLAogICAgICAiQ0FQX0ZPV05FUiIsCiAgICAgICJDQVBfTUtOT0QiLAogICAgICAiQ0FQX05FVF9SQVciLAogICAgICAiQ0FQX1NFVEdJRCIsCiAgICAgICJDQVBfU0VUVUlEIiwKICAgICAgIkNBUF9TRVRGQ0FQIiwKICAgICAgIkNBUF9TRVRQQ0FQIiwKICAgICAgIkNBUF9ORVRfQklORF9TRVJWSUNFIiwKICAgICAgIkNBUF9TWVNfQ0hST09UIiwKICAgICAgIkNBUF9LSUxMIiwKICAgICAgIkNBUF9BVURJVF9XUklURSIKICAgIF0sCiAgICAicHJpdmlsZWdlZF9jYXBzIjogWwogICAgICAiQ0FQX0NIT1dOIiwKICAgICAgIkNBUF9EQUNfT1ZFUlJJREUiLAogICAgICAiQ0FQX0RBQ19SRUFEX1NFQVJDSCIsCiAgICAgICJDQVBfRk9XTkVSIiwKICAgICAgIkNBUF9GU0VUSUQiLAogICAgICAiQ0FQX0tJTEwiLAogICAgICAiQ0FQX1NFVEdJRCIsCiAgICAgICJDQVBfU0VUVUlEIiwKICAgICAgIkNBUF9TRVRQQ0FQIiwKICAgICAgIkNBUF9MSU5VWF9JTU1VVEFCTEUiLAogICAgICAiQ0FQX05FVF9CSU5EX1NFUlZJQ0UiLAogICAgICAiQ0FQX05FVF9CUk9BRENBU1QiLAogICAgICAiQ0FQX05FVF9BRE1JTiIsCiAgICAgICJDQVBfTkVUX1JBVyIsCiAgICAgICJDQVBfSVBDX0xPQ0siLAogICAgICAiQ0FQX0lQQ19PV05FUiIsCiAgICAgICJDQVBfU1lTX01PRFVMRSIsCiAgICAgICJDQVBfU1lTX1JBV0lPIiwKICAgICAgIkNBUF9TWVNfQ0hST09UIiwKICAgICAgIkNBUF9TWVNfUFRSQUNFIiwKICAgICAgIkNBUF9TWVNfUEFDQ1QiLAogICAgICAiQ0FQX1NZU19BRE1JTiIsCiAgICAgICJDQVBfU1lTX0JPT1QiLAogICAgICAiQ0FQX1NZU19OSUNFIiwKICAgICAgIkNBUF9TWVNfUkVTT1VSQ0UiLAogICAgICAiQ0FQX1NZU19USU1FIiwKICAgICAgIkNBUF9TWVNfVFRZX0NPTkZJRyIsCiAgICAgICJDQVBfTUtOT0QiLAogICAgICAiQ0FQX0xFQVNFIiwKICAgICAgIkNBUF9BVURJVF9XUklURSIsCiAgICAgICJDQVBfQVVESVRfQ09OVFJPTCIsCiAgICAgICJDQVBfU0VURkNBUCIsCiAgICAgICJDQVBfTUFDX09WRVJSSURFIiwKICAgICAgIkNBUF9NQUNfQURNSU4iLAogICAgICAiQ0FQX1NZU0xPRyIsCiAgICAgICJDQVBfV0FLRV9BTEFSTSIsCiAgICAgICJDQVBfQkxPQ0tfU1VTUEVORCIsCiAgICAgICJDQVBfQVVESVRfUkVBRCIsCiAgICAgICJDQVBfUEVSRk1PTiIsCiAgICAgICJDQVBfQlBGIiwKICAgICAgIkNBUF9DSEVDS1BPSU5UX1JFU1RPUkUiCiAgICBdLAogICAgInZpcnRpb19ibGtfc3RvcmFnZV9jbGFzc2VzIjogWwogICAgICAiY2MtbG9jYWwtY3NpIiwKICAgICAgImNjLW1hbmFnZWQtY3NpIiwKICAgICAgImNjLW1hbmFnZWQtcHJlbWl1bS1jc2kiCiAgICBdLAogICAgInNtYl9zdG9yYWdlX2NsYXNzZXMiOiBbCiAgICAgIHsKICAgICAgICAibmFtZSI6ICJhenVyZWZpbGUtY3NpLWthdGEtY2MiLAogICAgICAgICJtb3VudF9vcHRpb25zIjogWwogICAgICAgICAgImRpcl9tb2RlPTA3NzciLAogICAgICAgICAgImZpbGVfbW9kZT0wNzc3IiwKICAgICAgICAgICJtZnN5bWxpbmtzIiwKICAgICAgICAgICJjYWNoZT1zdHJpY3QiLAogICAgICAgICAgIm5vc2hhcmVzb2NrIiwKICAgICAgICAgICJhY3RpbWVvPTMwIiwKICAgICAgICAgICJub2JybCIKICAgICAgICBdCiAgICAgIH0KICAgIF0KICB9LAogICJzYW5kYm94IjogewogICAgInN0b3JhZ2VzIjogWwogICAgICB7CiAgICAgICAgImRyaXZlciI6ICJlcGhlbWVyYWwiLAogICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICJzb3VyY2UiOiAic2htIiwKICAgICAgICAiZnN0eXBlIjogInRtcGZzIiwKICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAibm9kZXYiLAogICAgICAgICAgIm1vZGU9MTc3NyIsCiAgICAgICAgICAic2l6ZT02NzEwODg2NCIKICAgICAgICBdLAogICAgICAgICJtb3VudF9wb2ludCI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L3NobSIsCiAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICB9CiAgICBdCiAgfSwKICAicmVxdWVzdF9kZWZhdWx0cyI6IHsKICAgICJDcmVhdGVDb250YWluZXJSZXF1ZXN0IjogewogICAgICAiYWxsb3dfZW52X3JlZ2V4IjogWwogICAgICAgICJeSE9TVE5BTUU9JChkbnNfbGFiZWwpJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9QT1JUXyQoaXBfcClfVENQPXRjcDovLyQoaXB2NF9hKTokKGlwX3ApJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9QT1JUXyQoaXBfcClfVENQX1BST1RPPXRjcCQiLAogICAgICAgICJeJChzdmNfbmFtZSlfUE9SVF8kKGlwX3ApX1RDUF9QT1JUPSQoaXBfcCkkIiwKICAgICAgICAiXiQoc3ZjX25hbWUpX1BPUlRfJChpcF9wKV9UQ1BfQUREUj0kKGlwdjRfYSkkIiwKICAgICAgICAiXiQoc3ZjX25hbWUpX1NFUlZJQ0VfSE9TVD0kKGlwdjRfYSkkIiwKICAgICAgICAiXiQoc3ZjX25hbWUpX1NFUlZJQ0VfUE9SVD0kKGlwX3ApJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9TRVJWSUNFX1BPUlRfJChkbnNfbGFiZWwpPSQoaXBfcCkkIiwKICAgICAgICAiXiQoc3ZjX25hbWUpX1BPUlQ9dGNwOi8vJChpcHY0X2EpOiQoaXBfcCkkIiwKICAgICAgICAiXkFaVVJFX0NMSUVOVF9JRD1bQS1GYS1mMC05LV0qJCIsCiAgICAgICAgIl5BWlVSRV9URU5BTlRfSUQ9W0EtRmEtZjAtOS1dKiQiLAogICAgICAgICJeQVpVUkVfRkVERVJBVEVEX1RPS0VOX0ZJTEU9L3Zhci9ydW4vc2VjcmV0cy9henVyZS90b2tlbnMvYXp1cmUtaWRlbnRpdHktdG9rZW4kIiwKICAgICAgICAiXkFaVVJFX0FVVEhPUklUWV9IT1NUPWh0dHBzOi8vbG9naW5cXC5taWNyb3NvZnRvbmxpbmVcXC5jb20vJCIsCiAgICAgICAgIl5URVJNPXh0ZXJtJCIKICAgICAgXSwKICAgICAgImFsbG93X2Vudl9yZWdleF9tYXAiOiB7CiAgICAgICAgIkNQVV9MSU1JVCI6ICJeWzAtOV0rJCIsCiAgICAgICAgIkpPQl9DT01QTEVUSU9OX0lOREVYIjogIl5bMC05XSokIiwKICAgICAgICAiTUVNT1JZX0xJTUlUIjogIl5bMC05XSskIgogICAgICB9CiAgICB9LAogICAgIkNvcHlGaWxlUmVxdWVzdCI6IFsKICAgICAgIiQoc2ZwcmVmaXgpIgogICAgXSwKICAgICJFeGVjUHJvY2Vzc1JlcXVlc3QiOiB7CiAgICAgICJhbGxvd2VkX2NvbW1hbmRzIjogW10sCiAgICAgICJyZWdleCI6IFtdCiAgICB9LAogICAgIlVwZGF0ZVJvdXRlc1JlcXVlc3QiOiB7CiAgICAgICJmb3JiaWRkZW5fZGV2aWNlX25hbWVzIjogWwogICAgICAgICJsbyIKICAgICAgXSwKICAgICAgImZvcmJpZGRlbl9zb3VyY2VfcmVnZXgiOiBbCiAgICAgICAgIl4oPzowezAsNH06KXswLDd9MHswLDN9MSQiLAogICAgICAgICJeMTI3XFwuKD86WzAtOV17MSwzfVxcLil7Mn1bMC05XXsxLDN9JCIKICAgICAgXQogICAgfSwKICAgICJVcGRhdGVJbnRlcmZhY2VSZXF1ZXN0IjogewogICAgICAiYWxsb3dfcmF3X2ZsYWdzIjogMTI4LAogICAgICAiZm9yYmlkZGVuX25hbWVzIjogWwogICAgICAgICJsbyIKICAgICAgXSwKICAgICAgImZvcmJpZGRlbl9od19hZGRycyI6IFsKICAgICAgICAiMDA6MDA6MDA6MDA6MDA6MDAiCiAgICAgIF0KICAgIH0sCiAgICAiQ2xvc2VTdGRpblJlcXVlc3QiOiBmYWxzZSwKICAgICJSZWFkU3RyZWFtUmVxdWVzdCI6IGZhbHNlLAogICAgIlVwZGF0ZUVwaGVtZXJhbE1vdW50c1JlcXVlc3QiOiBmYWxzZSwKICAgICJXcml0ZVN0cmVhbVJlcXVlc3QiOiBmYWxzZQogIH0KfQ== +spec: + containers: + - image: "registry.k8s.io/pause:3.8" + imagePullPolicy: IfNotPresent + name: pod3 + securityContext: + allowPrivilegeEscalation: false + capabilities: + drop: + - ALL + terminationMessagePath: /dev/termination-log + terminationMessagePolicy: File + volumeMounts: + - mountPath: /var/run/secrets/kubernetes.io/serviceaccount + name: kube-api-access-8xqx2 + readOnly: true + dnsPolicy: ClusterFirst + enableServiceLinks: true + preemptionPolicy: PreemptLowerPriority + priority: 3 + priorityClassName: p3 + restartPolicy: Always + runtimeClassName: kata-cc + schedulerName: default-scheduler + securityContext: + runAsNonRoot: true + runAsUser: 1000 + seccompProfile: + type: RuntimeDefault + serviceAccount: default + serviceAccountName: default + terminationGracePeriodSeconds: 1 + tolerations: + - effect: NoExecute + key: node.kubernetes.io/not-ready + operator: Exists + tolerationSeconds: 300 + - effect: NoExecute + key: node.kubernetes.io/unreachable + operator: Exists + tolerationSeconds: 300 + - effect: NoSchedule + key: example.com/fakecpu + operator: Exists + volumes: + - name: kube-api-access-8xqx2 + projected: + defaultMode: 420 + sources: + - serviceAccountToken: + expirationSeconds: 3607 + path: token + - configMap: + items: + - key: ca.crt + path: ca.crt + name: kube-root-ca.crt + - downwardAPI: + items: + - fieldRef: + apiVersion: v1 + fieldPath: metadata.namespace + path: namespace +status: {} diff --git a/src/agent/samples/policy/yaml/webhook2/webhook-pod8.yaml b/src/agent/samples/policy/yaml/webhook2/webhook-pod8.yaml new file mode 100644 index 000000000000..145066671c85 --- /dev/null +++ b/src/agent/samples/policy/yaml/webhook2/webhook-pod8.yaml @@ -0,0 +1,123 @@ +--- +apiVersion: v1 +kind: Namespace +metadata: + name: downward-api-6610 +--- +apiVersion: v1 +kind: Pod +metadata: + creationTimestamp: ~ + labels: + name: downward-api-a411e253-5a8e-4dff-b074-93827b5c34cf + managedFields: + - apiVersion: v1 + fieldsType: FieldsV1 + fieldsV1: + "f:metadata": + "f:labels": + ".": {} + "f:name": {} + "f:spec": + "f:containers": + "k:{\"name\":\"dapi-container\"}": + ".": {} + "f:command": {} + "f:env": + ".": {} + "k:{\"name\":\"CPU_LIMIT\"}": + ".": {} + "f:name": {} + "f:valueFrom": + ".": {} + "f:resourceFieldRef": {} + "k:{\"name\":\"MEMORY_LIMIT\"}": + ".": {} + "f:name": {} + "f:valueFrom": + ".": {} + "f:resourceFieldRef": {} + "f:image": {} + "f:imagePullPolicy": {} + "f:name": {} + "f:resources": {} + "f:terminationMessagePath": {} + "f:terminationMessagePolicy": {} + "f:dnsPolicy": {} + "f:enableServiceLinks": {} + "f:restartPolicy": {} + "f:schedulerName": {} + "f:securityContext": {} + "f:terminationGracePeriodSeconds": {} + manager: e2e.test + operation: Update + time: "2023-06-20T21:20:31Z" + name: downward-api-a411e253-5a8e-4dff-b074-93827b5c34cf + namespace: downward-api-6610 + annotations: + io.katacontainers.config.agent.policy: IyBDb3B5cmlnaHQgKGMpIDIwMjMgTWljcm9zb2Z0IENvcnBvcmF0aW9uCiMKIyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMAojCnBhY2thZ2UgYWdlbnRfcG9saWN5CgppbXBvcnQgZnV0dXJlLmtleXdvcmRzLmluCmltcG9ydCBmdXR1cmUua2V5d29yZHMuZXZlcnkKCiMgRGVmYXVsdCB2YWx1ZXMsIHJldHVybmVkIGJ5IE9QQSB3aGVuIHJ1bGVzIGNhbm5vdCBiZSBldmFsdWF0ZWQgdG8gdHJ1ZS4KZGVmYXVsdCBBZGRBUlBOZWlnaGJvcnNSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgQWRkU3dhcFJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBDbG9zZVN0ZGluUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IENvcHlGaWxlUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IENyZWF0ZUNvbnRhaW5lclJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBDcmVhdGVTYW5kYm94UmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IERlc3Ryb3lTYW5kYm94UmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgRXhlY1Byb2Nlc3NSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgR2V0T09NRXZlbnRSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBHdWVzdERldGFpbHNSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBMaXN0SW50ZXJmYWNlc1JlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBMaXN0Um91dGVzUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IE1lbUhvdHBsdWdCeVByb2JlUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IE9ubGluZUNQVU1lbVJlcXVlc3QgOj0gdHJ1ZQpkZWZhdWx0IFBhdXNlQ29udGFpbmVyUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFJlYWRTdHJlYW1SZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgUmVtb3ZlQ29udGFpbmVyUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgUmVtb3ZlU3RhbGVWaXJ0aW9mc1NoYXJlTW91bnRzUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgUmVzZWVkUmFuZG9tRGV2UmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFJlc3VtZUNvbnRhaW5lclJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBTZXRHdWVzdERhdGVUaW1lUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFNldFBvbGljeVJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBTaWduYWxQcm9jZXNzUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgU3RhcnRDb250YWluZXJSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBTdGFydFRyYWNpbmdSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgU3RhdHNDb250YWluZXJSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBTdG9wVHJhY2luZ1JlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBUdHlXaW5SZXNpemVSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBVcGRhdGVDb250YWluZXJSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgVXBkYXRlRXBoZW1lcmFsTW91bnRzUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFVwZGF0ZUludGVyZmFjZVJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBVcGRhdGVSb3V0ZXNSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgV2FpdFByb2Nlc3NSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBXcml0ZVN0cmVhbVJlcXVlc3QgOj0gZmFsc2UKCiMgQWxsb3dSZXF1ZXN0c0ZhaWxpbmdQb2xpY3kgOj0gdHJ1ZSBjb25maWd1cmVzIHRoZSBBZ2VudCB0byAqYWxsb3cgYW55CiMgcmVxdWVzdHMgY2F1c2luZyBhIHBvbGljeSBmYWlsdXJlKi4gVGhpcyBpcyBhbiB1bnNlY3VyZSBjb25maWd1cmF0aW9uCiMgYnV0IGlzIHVzZWZ1bCBmb3IgYWxsb3dpbmcgdW5zZWN1cmUgcG9kcyB0byBzdGFydCwgdGhlbiBjb25uZWN0IHRvCiMgdGhlbSBhbmQgaW5zcGVjdCBPUEEgbG9ncyBmb3IgdGhlIHJvb3QgY2F1c2Ugb2YgYSBmYWlsdXJlLgpkZWZhdWx0IEFsbG93UmVxdWVzdHNGYWlsaW5nUG9saWN5IDo9IGZhbHNlCgojIENvbnN0YW50cwpTX05BTUVfS0VZID0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZSIKU19OQU1FU1BBQ0VfS0VZID0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZXNwYWNlIgpCVU5ETEVfSUQgPSAiW2EtejAtOV17NjR9IgoKQ3JlYXRlQ29udGFpbmVyUmVxdWVzdDo9IHJlc3AgewogICAgbm90IGlzX251bGwoaW5wdXQuZW52X21hcCkKICAgIAogICAgaV9lbnZfbWFwIDo9IGlucHV0LmVudl9tYXAKICAgIAogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBwX2Vudl9tYXAgOj0gcF9jb250YWluZXIuZW52X21hcCAgCiAgICBhbGxvd19lbnZfbWFwKHBfZW52X21hcCwgaV9lbnZfbWFwKQogICAgCiAgICBpX3Byb2Nlc3MgOj0gaW5wdXQuYmFzZS5PQ0kuUHJvY2VzcwogICAgCiAgICBwX3Byb2Nlc3MgOj0gcF9jb250YWluZXIuT0NJLlByb2Nlc3MKICAgIAogICAgYWxsb3dfYXJncyhpX3Byb2Nlc3MsIHBfcHJvY2VzcywgaV9lbnZfbWFwKQoKICAgIHJlc3AgPSBDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uKGlucHV0LmJhc2UpCiAgICBwcmludCgiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdDogdHJ1ZSIpCn0KCmFsbG93X2FyZ3MoaV9wcm9jZXNzLCBwX3Byb2Nlc3MsIGlfZW52X21hcCkgewogICAgaV9hcmdzIDo9IGlfcHJvY2Vzcy5BcmdzCiAgICBwX2FyZ3MgOj0gcF9wcm9jZXNzLkFyZ3MKICAgIHByaW50KCJhbGxvd19hcmdzOiBpX2FyZ3MgPSIsIGlfYXJncywgInBfYXJncyA9IiwgcF9hcmdzKQogICAgY291bnQoaV9hcmdzKSA9PSBjb3VudChwX2FyZ3MpCiAgICBldmVyeSBpLCBpX2FyZyBpbiBpX2FyZ3MgewogICAgICAgIHByaW50KCJhbGxvd19hcmdzOiBpX2FyZyA9IiwgaV9hcmcpCiAgICAgICAgcF9hcmdfcmVwbGFjZWQgOj0gcmVwbGFjZV9lbnZfdmFyaWFibGVzKHBfYXJnc1tpXSwgaV9lbnZfbWFwKQogICAgICAgIHByaW50KCJhbGxvd19hcmdzOiBwX2FyZ19yZXBsYWNlZCA9IiwgcF9hcmdfcmVwbGFjZWQpCiAgICAgICAgcF9hcmdfcmVwbGFjZWQyIDo9IHJlcGxhY2UocF9hcmdfcmVwbGFjZWQsICIkJCIsICIkIikKICAgICAgICBwcmludCgiYWxsb3dfYXJnczogcF9hcmdfcmVwbGFjZWQyID0iLCBwX2FyZ19yZXBsYWNlZDIpCiAgICAgICAgaV9hcmcgPT0gcF9hcmdfcmVwbGFjZWQyCiAgICB9CiAgICBwcmludCgiYWxsb3dfYXJnczogdHJ1ZSIpCn0KCmFsbG93X2FyZ3MoaV9wcm9jZXNzLCBwX3Byb2Nlc3MsIGlfZW52X21hcCkgewogICAgbm90IGlfcHJvY2Vzcy5BcmdzCiAgICBub3QgcF9wcm9jZXNzLkFyZ3MKICAgIHByaW50KCJhbGxvd19hcmdzMjogbm8gYXJncyIpCn0KCiMgdGhpcyBmdW5jdGlvbiByZXBsYWNlcyBhbGwgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyBpbiBhIHN0cmluZywgZ2l2ZW4gYSBtYXAgb2YgZW52aXJvbm1lbnQga2V5cyB0byBlbnZpcm9ubWVudCB2YWx1ZXMKIyBlZyBzdHIgPSAiZWNobyAkKENMVVNURVJfSUQpOyBlY2hvICQoTk9ERV9OQU1FKTsiCiMgZW52X21hcCA9IHsiQ0xVU1RFUl9JRCI6ICJhYmMiLCAiTk9ERV9OQU1FIiA6ICJ4eXoifQojIHJlc3VsdCA9ICJlY2hvIGFiYzsgZWNobyB4eXo7IgpyZXBsYWNlX2Vudl92YXJpYWJsZXMoc3RyLCBlbnZfbWFwKSA9IHJlc3VsdCB7CiAgICAjIG1ha2UgYW4gYXJyYXkgb2YgdGhlIGtleXMgZWcgWyJDTFVTVEVSX0lEIiwgIk5PREVfTkFNRSJdCiAgICBrZXlzIDo9IFt4IHwgc29tZSB4IGluIG9iamVjdC5rZXlzKGVudl9tYXApXQogICAgcmVzdWx0IDo9IHJlcGxhY2Vfc3RyX3JlYyhzdHIsIGVudl9tYXAsIGtleXMsIGNvdW50KGtleXMpIC0gMSkKfQoKIyBiYXNlIGNhc2UKcmVwbGFjZV9zdHJfcmVjKHN0ciwgZW52X21hcCwgYXJyX2tleXMsIGkpID0gcmVzdWx0IHsKICAgIGkgPCAwCiAgICByZXN1bHQgOj0gc3RyCn0KCiMgcmVjdXJzaXZlIHN0ZXAKcmVwbGFjZV9zdHJfcmVjKHN0ciwgZW52X21hcCwgYXJyX2tleXMsIGkpID0gcmVzdWx0IHsKICAgIGkgPj0gMAogICAga2V5IDo9IGFycl9rZXlzW2ldCiAgICBlbnZfa2V5MSA6PSBjb25jYXQoIiIsIFsiJCgiLCBrZXksICIpIl0pCiAgICAjIHJlcGxhY2UgJChWQVIpIHdpdGggdmFsdWUKICAgIG5ld19zdHIxIDo9IHJlcGxhY2Uoc3RyLCBlbnZfa2V5MSwgZW52X21hcFtrZXldKQogICAgIyByZXBsYWNlIG5leHQgZW52aXJvbm1lbnQgdmFyaWFibGUKICAgIHJlc3VsdCA9IHJlcGxhY2Vfc3RyX3JlYyhuZXdfc3RyMSwgZW52X21hcCwgYXJyX2tleXMsIGkgLSAxKQp9CgphbGxvd19lbnZfbWFwKHBfZW52X21hcCwgaV9lbnZfbWFwKSB7CiAgICBwcmludCgiYWxsb3dfZW52X21hcDogcF9lbnZfbWFwID0iLCBwX2Vudl9tYXApCiAgICBldmVyeSBlbnZfa2V5LCBlbnZfdmFsIGluIGlfZW52X21hcCB7CiAgICAgICAgcHJpbnQoImFsbG93X2VudjogZW52X2tleSA9IiwgZW52X2tleSwgImVudl92YWwgPSIsIGVudl92YWwpCiAgICAgICAgYWxsb3dfZW52X21hcF9lbnRyeShlbnZfa2V5LCBlbnZfdmFsLCBwX2Vudl9tYXApCiAgICB9CiAgICBwcmludCgiYWxsb3dfZW52X21hcDogdHJ1ZSIpCn0KCiMgQWxsb3cgZXhhY3QgbWF0Y2gKYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBpX3ZhbCA9PSBwX3ZhbAogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnk6IHRydWUiKQp9CgojIEFsbG93IHJlc291cmNlRmllbGRSZWYgdmFsdWVzIChlLmcuLCAibGltaXRzLmNwdSIpLgphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgICMgYSB2YXJpYWJsZSB3ZSBzaG91bGQgYmUgdmFsaWRhdGluZyB1c2luZyBhIHJlZ2V4IGZyb20gc2V0dGluZ3MKICAgIHBfdmFsID09ICIkKHZhbGlkYXRlLWZyb20tc2V0dGluZ3MpIgogICAgcmVnZXhfdmFsIDo9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuQ3JlYXRlQ29udGFpbmVyUmVxdWVzdC5hbGxvd19lbnZfcmVnZXhfbWFwW2tleV0KICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4X3ZhbCwgaV92YWwpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSAyOiB0cnVlIikKfQoKIyBBbGxvdyBub2RlLW5hbWUKYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChub2RlLW5hbWUpIgogICAgcmVnZXgubWF0Y2gocG9saWN5X2RhdGEuY29tbW9uLmRuc19zdWJkb21haW4gLCBpX3ZhbCkKICAgIHByaW50KCJhbGxvd19lbnZfbWFwX2VudHJ5IDM6IHRydWUiKQp9CgojIEFsbG93IGhvc3QtbmFtZQphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgIHBfdmFsID09ICIkKGhvc3QtbmFtZSkiCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24uZG5zX2xhYmVsICwgaV92YWwpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSA0OiB0cnVlIikKfQoKIyBBbGxvdyBwb2QtdWlkCmFsbG93X2Vudl9tYXBfZW50cnkoa2V5LCBpX3ZhbCwgcF9lbnZfbWFwKSB7CiAgICBwX3ZhbCA6PSBwX2Vudl9tYXBba2V5XQogICAgcF92YWwgPT0gIiQocG9kLXVpZCkiCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24ucG9kX3VpZCAsIGlfdmFsKQogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgNTogdHJ1ZSIpCn0KCiMgQWxsb3cgZmllbGRSZWYgImZpZWxkUGF0aDogc3RhdHVzLnBvZElQIiB2YWx1ZXMuCmFsbG93X2Vudl9tYXBfZW50cnkoa2V5LCBpX3ZhbCwgcF9lbnZfbWFwKSB7CiAgICBpc19pcChpX3ZhbCkKCiAgICBwX3ZhbCA6PSBwX2Vudl9tYXBba2V5XQogICAgcF92YXIgOj0gY29uY2F0KCI9IiwgW2tleSwgcF92YWxdKQogICAgYWxsb3dfcG9kX2lwX3ZhcihrZXksIHBfdmFyKQogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgNjogdHJ1ZSIpCn0KCiMgQWxsb3cgZmllbGRSZWYgImZpZWxkUGF0aDogc3RhdHVzLmhvc3RJUCIgdmFsdWVzLgphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgaXNfaXAoaV92YWwpCgogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgIHBfdmFyIDo9IGNvbmNhdCgiPSIsIFtrZXksIHBfdmFsXSkKICAgIGFsbG93X2hvc3RfaXBfdmFyKGtleSwgcF92YXIpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSA3OiB0cnVlIikKfQoKIyBNYXRjaCBpbnB1dCB3aXRoIG9uZSBvZiB0aGUgcG9saWN5IHZhcmlhYmxlcywgYWZ0ZXIgc3Vic3RpdHV0aW5nICQoc2FuZGJveC1uYW1lKS4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChzYW5kYm94LW5hbWUpIgogICAgc19uYW1lIDo9IGlucHV0LmJhc2UuT0NJLkFubm90YXRpb25zW1NfTkFNRV9LRVldCiAgICBwX3ZhcjIgOj0gcmVwbGFjZShwX3ZhbCwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHBfdmFyMiA9PSBpX3ZhbAogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgODogdHJ1ZSIpCn0KCiMgTWF0Y2ggaW5wdXQgd2l0aCBvbmUgb2YgdGhlIHBvbGljeSB2YXJpYWJsZXMsIGFmdGVyIHN1YnN0aXR1dGluZyAkKHNhbmRib3gtbmFtZXNwYWNlKS4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChzYW5kYm94LW5hbWVzcGFjZSkiCiAgICBzX25hbWVzcGFjZSA6PSBpbnB1dC5iYXNlLk9DSS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwX3ZhcjIgOj0gcmVwbGFjZShwX3ZhbCwgIiQoc2FuZGJveC1uYW1lc3BhY2UpIiwgc19uYW1lc3BhY2UpCiAgICBwX3ZhcjIgPT0gaV92YWwKICAgIHByaW50KCJhbGxvd19lbnZfbWFwX2VudHJ5IDk6IHRydWUiKQp9CgojIEFsbG93IGlucHV0IGVudiB2YXJpYWJsZXMgdGhhdCBtYXRjaCB3aXRoIGEgcmVxdWVzdF9kZWZhdWx0cyByZWdleC4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHNvbWUgcF9yZWdleDEgaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5DcmVhdGVDb250YWluZXJSZXF1ZXN0LmFsbG93X2Vudl9yZWdleAogICAgcF9yZWdleDIgOj0gcmVwbGFjZShwX3JlZ2V4MSwgIiQoaXB2NF9hKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcHY0X2EpCiAgICBwX3JlZ2V4MyA6PSByZXBsYWNlKHBfcmVnZXgyLCAiJChpcF9wKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcF9wKQogICAgcF9yZWdleDQgOj0gcmVwbGFjZShwX3JlZ2V4MywgIiQoc3ZjX25hbWUpIiwgcG9saWN5X2RhdGEuY29tbW9uLnN2Y19uYW1lKQogICAgcF9yZWdleDUgOj0gcmVwbGFjZShwX3JlZ2V4NCwgIiQoZG5zX2xhYmVsKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5kbnNfbGFiZWwpCgogICAgcmVzdWx0IDo9IGNvbmNhdCgiPSIsIFtrZXksIGlfdmFsXSkKICAgIHJlZ2V4Lm1hdGNoKHBfcmVnZXg1LCByZXN1bHQpCgogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgMTA6IHRydWUiKQp9CgpDcmVhdGVDb250YWluZXJSZXF1ZXN0Oj0gcmVzcCB7CiAgICBub3QgaW5wdXQuZW52X21hcAogICAgaV9wcm9jZXNzID0gaW5wdXQuT0NJLlByb2Nlc3MKICAgIHNfbmFtZSA9IGlucHV0Lk9DSS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBwX3Byb2Nlc3MgPSBwX2NvbnRhaW5lci5PQ0kuUHJvY2VzcwogICAgYWxsb3dfZGVwcmVjYXRlZF9hcmdzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUpCiAgICByZXNwID0gQ3JlYXRlQ29udGFpbmVyUmVxdWVzdENvbW1vbihpbnB1dCkKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0MjogdHJ1ZSIpCn0KCkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb24ocmVxKTo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgICMgQ2hlY2sgaWYgdGhlIGlucHV0IHJlcXVlc3Qgc2hvdWxkIGJlIHJlamVjdGVkIGV2ZW4gYmVmb3JlIGNoZWNraW5nIHRoZQogICAgIyBwb2xpY3lfZGF0YS5jb250YWluZXJzIGluZm9ybWF0aW9uLgogICAgYWxsb3dfY3JlYXRlX2NvbnRhaW5lcl9pbnB1dChyZXEpCgogICAgaV9vY2kgOj0gcmVxLk9DSQogICAgaV9zdG9yYWdlcyA6PSByZXEuc3RvcmFnZXMKICAgIGlfZGV2aWNlcyA6PSByZXEuZGV2aWNlcwoKICAgICMgYXJyYXkgb2YgcG9zc2libGUgc3RhdGUgb3BlcmF0aW9ucwogICAgb3BzX2J1aWxkZXIgOj0gW10KCiAgICAjIGNoZWNrIHNhbmRib3ggbmFtZQogICAgc2FuZGJveF9uYW1lID0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FX0tFWV0KICAgIGFkZF9zYW5kYm94X25hbWVfdG9fc3RhdGUgOj0gc3RhdGVfYWxsb3dzKCJzYW5kYm94X25hbWUiLCBzYW5kYm94X25hbWUpCiAgICBvcHNfYnVpbGRlcjEgOj0gY29uY2F0X29wX2lmX25vdF9udWxsKG9wc19idWlsZGVyLCBhZGRfc2FuZGJveF9uYW1lX3RvX3N0YXRlKQoKICAgICMgQ2hlY2sgaWYgYW55IGVsZW1lbnQgZnJvbSB0aGUgcG9saWN5X2RhdGEuY29udGFpbmVycyBhcnJheSBhbGxvd3MgdGhlIGlucHV0IHJlcXVlc3QuCiAgICBzb21lIHBfY29udGFpbmVyIGluIHBvbGljeV9kYXRhLmNvbnRhaW5lcnMKICAgIHByaW50KCI9PT09PT09PSBDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiB0cnlpbmcgbmV4dCBwb2xpY3kgY29udGFpbmVyIikKCiAgICBwX3BpZG5zIDo9IHBfY29udGFpbmVyLnNhbmRib3hfcGlkbnMKICAgIGlfcGlkbnMgOj0gcmVxLnNhbmRib3hfcGlkbnMKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiBwX3BpZG5zID0iLCBwX3BpZG5zLCAiaV9waWRucyA9IiwgaV9waWRucykKICAgIHBfcGlkbnMgPT0gaV9waWRucwoKICAgIHBfb2NpIDo9IHBfY29udGFpbmVyLk9DSQoKICAgICMgY2hlY2sgbmFtZXNwYWNlCiAgICBwX25hbWVzcGFjZSA6PSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBpX25hbWVzcGFjZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwcmludCAoIkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb246IHBfbmFtZXNwYWNlID0iLCBwX25hbWVzcGFjZSwgImlfbmFtZXNwYWNlID0iLCBpX25hbWVzcGFjZSkKICAgIGFkZF9uYW1lc3BhY2VfdG9fc3RhdGUgOj0gYWxsb3dfbmFtZXNwYWNlKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkKICAgIG9wc19idWlsZGVyMiA6PSBjb25jYXRfb3BfaWZfbm90X251bGwob3BzX2J1aWxkZXIxLCBhZGRfbmFtZXNwYWNlX3RvX3N0YXRlKQoKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiBwIFZlcnNpb24gPSIsIHBfb2NpLlZlcnNpb24sICJpIFZlcnNpb24gPSIsIGlfb2NpLlZlcnNpb24pCiAgICBwX29jaS5WZXJzaW9uID09IGlfb2NpLlZlcnNpb24KCiAgICBwcmludCgiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdENvbW1vbjogcCBSZWFkb25seSA9IiwgcF9vY2kuUm9vdC5SZWFkb25seSwgImkgUmVhZG9ubHkgPSIsIGlfb2NpLlJvb3QuUmVhZG9ubHkpCiAgICBwX29jaS5Sb290LlJlYWRvbmx5ID09IGlfb2NpLlJvb3QuUmVhZG9ubHkKCiAgICBhbGxvd19hbm5vKHBfb2NpLCBpX29jaSkKCiAgICBwX3N0b3JhZ2VzIDo9IHBfY29udGFpbmVyLnN0b3JhZ2VzCiAgICBhbGxvd19ieV9hbm5vKHBfb2NpLCBpX29jaSwgcF9zdG9yYWdlcywgaV9zdG9yYWdlcykKCiAgICBwX2RldmljZXMgOj0gcF9jb250YWluZXIuZGV2aWNlcwogICAgYWxsb3dfZGV2aWNlcyhwX2RldmljZXMsIGlfZGV2aWNlcykKCiAgICByZXQgOj0gYWxsb3dfbGludXgob3BzX2J1aWxkZXIyLCBwX29jaSwgaV9vY2kpCiAgICByZXQuYWxsb3dlZAoKICAgIG9wcyA6PSByZXQub3BzCgogICAgcHJpbnQoIkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb246IHRydWUiKQp9CgphbGxvd19jcmVhdGVfY29udGFpbmVyX2lucHV0KHJlcSkgewogICAgcHJpbnQoImFsbG93X2NyZWF0ZV9jb250YWluZXJfaW5wdXQ6IGlucHV0ID0iLCByZXEpCgogICAgY291bnQocmVxLnNoYXJlZF9tb3VudHMpID09IDAKICAgIGlzX251bGwocmVxLnN0cmluZ191c2VyKQoKICAgIGlfb2NpIDo9IHJlcS5PQ0kKICAgIGlzX251bGwoaV9vY2kuSG9va3MpCiAgICBpc19udWxsKGlfb2NpLlNvbGFyaXMpCiAgICBpc19udWxsKGlfb2NpLldpbmRvd3MpCgogICAgaV9saW51eCA6PSBpX29jaS5MaW51eAogICAgY291bnQoaV9saW51eC5HSURNYXBwaW5ncykgPT0gMAogICAgY291bnQoaV9saW51eC5Nb3VudExhYmVsKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlJlc291cmNlcy5EZXZpY2VzKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlJvb3Rmc1Byb3BhZ2F0aW9uKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlVJRE1hcHBpbmdzKSA9PSAwCiAgICBpc19udWxsKGlfbGludXguSW50ZWxSZHQpCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLkJsb2NrSU8pCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLk5ldHdvcmspCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLlBpZHMpCiAgICBpc19udWxsKGlfbGludXguU2VjY29tcCkKCiAgICBpX3Byb2Nlc3MgOj0gaV9vY2kuUHJvY2VzcwogICAgY291bnQoaV9wcm9jZXNzLlNlbGludXhMYWJlbCkgPT0gMAogICAgY291bnQoaV9wcm9jZXNzLlVzZXIuVXNlcm5hbWUpID09IDAKCiAgICBwcmludCgiYWxsb3dfY3JlYXRlX2NvbnRhaW5lcl9pbnB1dDogdHJ1ZSIpCn0KCmFsbG93X25hbWVzcGFjZShwX25hbWVzcGFjZSwgaV9uYW1lc3BhY2UpID0gYWRkX25hbWVzcGFjZSB7CiAgICBwX25hbWVzcGFjZSA9PSBpX25hbWVzcGFjZQogICAgYWRkX25hbWVzcGFjZSA6PSBudWxsCiAgICBwcmludCgiYWxsb3dfbmFtZXNwYWNlIDE6IGlucHV0IG5hbWVzcGFjZSBtYXRjaGVzIHBvbGljeSBkYXRhIikKfQoKYWxsb3dfbmFtZXNwYWNlKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkgPSBhZGRfbmFtZXNwYWNlIHsKICAgIHBfbmFtZXNwYWNlID09ICIiCiAgICBwcmludCgiYWxsb3dfbmFtZXNwYWNlIDI6IG5vIG5hbWVzcGFjZSBmb3VuZCBvbiBwb2xpY3kgZGF0YSIpCiAgICBhZGRfbmFtZXNwYWNlIDo9IHN0YXRlX2FsbG93cygibmFtZXNwYWNlIiwgaV9uYW1lc3BhY2UpCn0KCiMgdmFsdWUgaGFzbid0IGJlZW4gc2VlbiBiZWZvcmUsIHNhdmUgaXQgdG8gc3RhdGUKc3RhdGVfYWxsb3dzKGtleSwgdmFsdWUpID0gYWN0aW9uIHsKICBzdGF0ZSA6PSBnZXRfc3RhdGUoKQogIHByaW50KCJzdGF0ZV9hbGxvd3MgMTogc3RhdGVba2V5XSA9Iiwgc3RhdGVba2V5XSwgInZhbHVlID0iLCB2YWx1ZSkKICBub3Qgc3RhdGVba2V5XQogIHByaW50KCJzdGF0ZV9hbGxvd3MgMTogc2F2aW5nIHRvIHN0YXRlIGtleSA9Iiwga2V5LCAidmFsdWUgPSIsIHZhbHVlKQogIHBhdGggOj0gZ2V0X3N0YXRlX3BhdGgoa2V5KSAKICBhY3Rpb24gOj0gewogICAgIm9wIjogImFkZCIsCiAgICAicGF0aCI6IHBhdGgsIAogICAgInZhbHVlIjogdmFsdWUsCiAgfQp9CgojIHZhbHVlIG1hdGNoZXMgd2hhdCdzIGluIHN0YXRlLCBhbGxvdyBpdApzdGF0ZV9hbGxvd3Moa2V5LCB2YWx1ZSkgPSBhY3Rpb24gewogIHByaW50KCJzdGF0ZV9hbGxvd3MgMjogc3RhcnQiKQogIHN0YXRlIDo9IGdldF9zdGF0ZSgpCiAgcHJpbnQoInN0YXRlX2FsbG93cyAyOiBzdGF0ZVtrZXldID0iLCBzdGF0ZVtrZXldLCAidmFsdWUgPSIsIHZhbHVlKQogIHZhbHVlID09IHN0YXRlW2tleV0KICBwcmludCgic3RhdGVfYWxsb3dzIDI6IGZvdW5kIGtleSA9Iiwga2V5LCAidmFsdWUgPSIsIHZhbHVlLCAiIGluIHN0YXRlIikKICBhY3Rpb24gOj0gbnVsbAp9CgojIGhlbHBlciBmdW5jdGlvbnMgdG8gaW50ZXJhY3Qgd2l0aCB0aGUgc3RhdGUKZ2V0X3N0YXRlKCkgPSBzdGF0ZSB7CiAgc3RhdGUgOj0gZGF0YVsicHN0YXRlIl0KfQoKZ2V0X3N0YXRlX3ZhbChrZXkpID0gdmFsdWUgewogICAgc3RhdGUgOj0gZ2V0X3N0YXRlKCkKICAgIHZhbHVlIDo9IHN0YXRlW2tleV0KfQoKZ2V0X3N0YXRlX3BhdGgoa2V5KSA9IHBhdGggewogICAgIyBwcmVwZW5kICIvcHN0YXRlLyIgdG8ga2V5CiAgICBwYXRoIDo9IGNvbmNhdCgiLyIsIFsiL3BzdGF0ZSIsIGtleV0pCn0KCiMgSGVscGVyIGZ1bmN0aW9ucyB0byBjb25kaXRpb25hbGx5IGNvbmNhdGVuYXRlIG9wIGlzIG5vdCBudWxsCmNvbmNhdF9vcF9pZl9ub3RfbnVsbChvcHMsIG9wKSA9IHJlc3VsdCB7CiAgICBvcCA9PSBudWxsCiAgICByZXN1bHQgOj0gb3BzCn0KCmNvbmNhdF9vcF9pZl9ub3RfbnVsbChvcHMsIG9wKSA9IHJlc3VsdCB7CiAgICBvcCAhPSBudWxsCiAgICByZXN1bHQgOj0gYXJyYXkuY29uY2F0KG9wcywgW29wXSkKfQoKIyBSZWplY3QgdW5leHBlY3RlZCBhbm5vdGF0aW9ucy4KYWxsb3dfYW5ubyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19hbm5vIDE6IHN0YXJ0IikKCiAgICBub3QgaV9vY2kuQW5ub3RhdGlvbnMKCiAgICBwcmludCgiYWxsb3dfYW5ubyAxOiB0cnVlIikKfQphbGxvd19hbm5vKHBfb2NpLCBpX29jaSkgewogICAgcHJpbnQoImFsbG93X2Fubm8gMjogcCBBbm5vdGF0aW9ucyA9IiwgcF9vY2kuQW5ub3RhdGlvbnMpCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiBpIEFubm90YXRpb25zID0iLCBpX29jaS5Bbm5vdGF0aW9ucykKCiAgICBpX2tleXMgOj0gb2JqZWN0LmtleXMoaV9vY2kuQW5ub3RhdGlvbnMpCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiBpIGtleXMgPSIsIGlfa2V5cykKCiAgICBldmVyeSBpX2tleSBpbiBpX2tleXMgewogICAgICAgIGFsbG93X2Fubm9fa2V5KGlfa2V5LCBwX29jaSkKICAgIH0KCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiB0cnVlIikKfQoKYWxsb3dfYW5ub19rZXkoaV9rZXksIHBfb2NpKSB7CiAgICBwcmludCgiYWxsb3dfYW5ub19rZXkgMTogaSBrZXkgPSIsIGlfa2V5KQoKICAgIHN0YXJ0c3dpdGgoaV9rZXksICJpby5rdWJlcm5ldGVzLmNyaS4iKQoKICAgIHByaW50KCJhbGxvd19hbm5vX2tleSAxOiB0cnVlIikKfQphbGxvd19hbm5vX2tleShpX2tleSwgcF9vY2kpIHsKICAgIHByaW50KCJhbGxvd19hbm5vX2tleSAyOiBpIGtleSA9IiwgaV9rZXkpCgogICAgc29tZSBwX2tleSwgXyBpbiBwX29jaS5Bbm5vdGF0aW9ucwogICAgcF9rZXkgPT0gaV9rZXkKCiAgICBwcmludCgiYWxsb3dfYW5ub19rZXkgMjogdHJ1ZSIpCn0KCiMgR2V0IHRoZSB2YWx1ZSBvZiB0aGUgU19OQU1FX0tFWSBhbm5vdGF0aW9uIGFuZAojIGNvcnJlbGF0ZSBpdCB3aXRoIG90aGVyIGFubm90YXRpb25zIGFuZCBwcm9jZXNzIGZpZWxkcy4KYWxsb3dfYnlfYW5ubyhwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpIHsKICAgIHByaW50KCJhbGxvd19ieV9hbm5vIDE6IHN0YXJ0IikKCiAgICBub3QgcF9vY2kuQW5ub3RhdGlvbnNbU19OQU1FX0tFWV0KCiAgICBpX3NfbmFtZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMTogaV9zX25hbWUgPSIsIGlfc19uYW1lKQoKICAgIGlfc19uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FU1BBQ0VfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMTogaV9zX25hbWVzcGFjZSA9IiwgaV9zX25hbWVzcGFjZSkKCiAgICBhbGxvd19ieV9zYW5kYm94X25hbWUocF9vY2ksIGlfb2NpLCBwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBpX3NfbmFtZSwgaV9zX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfYnlfYW5ubyAxOiB0cnVlIikKfQphbGxvd19ieV9hbm5vKHBfb2NpLCBpX29jaSwgcF9zdG9yYWdlcywgaV9zdG9yYWdlcykgewogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMjogc3RhcnQiKQoKICAgIHBfc19uYW1lIDo9IHBfb2NpLkFubm90YXRpb25zW1NfTkFNRV9LRVldCiAgICBpX3NfbmFtZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMjogaV9zX25hbWUgPSIsIGlfc19uYW1lLCAicF9zX25hbWUgPSIsIHBfc19uYW1lKQoKICAgIGFsbG93X3NhbmRib3hfbmFtZShwX3NfbmFtZSwgaV9zX25hbWUpCgogICAgaV9zX25hbWVzcGFjZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwcmludCgiYWxsb3dfYnlfYW5ubyAyOiBpX3NfbmFtZXNwYWNlID0iLCBpX3NfbmFtZXNwYWNlKQoKICAgIGFsbG93X2J5X3NhbmRib3hfbmFtZShwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMsIGlfc19uYW1lLCBpX3NfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd19ieV9hbm5vIDI6IHRydWUiKQp9CgphbGxvd19ieV9zYW5kYm94X25hbWUocF9vY2ksIGlfb2NpLCBwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfYnlfc2FuZGJveF9uYW1lOiBzdGFydCIpCgogICAgaV9uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FU1BBQ0VfS0VZXQoKICAgIGFsbG93X2J5X2NvbnRhaW5lcl90eXBlcyhwX29jaSwgaV9vY2ksIHNfbmFtZSwgaV9uYW1lc3BhY2UpCiAgICBhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZChwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpCiAgICBhbGxvd19wcm9jZXNzKHBfb2NpLlByb2Nlc3MsIGlfb2NpLlByb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpCgogICAgcHJpbnQoImFsbG93X2J5X3NhbmRib3hfbmFtZTogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfbmFtZShwX3NfbmFtZSwgaV9zX25hbWUpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X25hbWU6IHN0YXJ0IikKICAgIHJlZ2V4Lm1hdGNoKHBfc19uYW1lLCBpX3NfbmFtZSkKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9uYW1lOiB0cnVlIikKfQoKIyBDaGVjayB0aGF0IHRoZSAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLXR5cGUiIGFuZAojICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIiBhbm5vdGF0aW9ucyBkZXNpZ25hdGUgdGhlCiMgZXhwZWN0ZWQgdHlwZSAtIGVpdGhlciBhICJzYW5kYm94IiBvciBhICJjb250YWluZXIiLiBUaGVuLCB2YWxpZGF0ZQojIG90aGVyIGFubm90YXRpb25zIGJhc2VkIG9uIHRoZSBhY3R1YWwgInNhbmRib3giIG9yICJjb250YWluZXIiIHZhbHVlCiMgZnJvbSB0aGUgaW5wdXQgY29udGFpbmVyLgphbGxvd19ieV9jb250YWluZXJfdHlwZXMocF9vY2ksIGlfb2NpLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfYnlfY29udGFpbmVyX3R5cGVzOiBjaGVja2luZyBpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSIpCgogICAgY190eXBlIDo9ICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSIKICAgIAogICAgcF9jcmlfdHlwZSA6PSBwX29jaS5Bbm5vdGF0aW9uc1tjX3R5cGVdCiAgICBpX2NyaV90eXBlIDo9IGlfb2NpLkFubm90YXRpb25zW2NfdHlwZV0KICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZXM6IHBfY3JpX3R5cGUgPSIsIHBfY3JpX3R5cGUsICJpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgcF9jcmlfdHlwZSA9PSBpX2NyaV90eXBlCgogICAgYWxsb3dfYnlfY29udGFpbmVyX3R5cGUoaV9jcmlfdHlwZSwgcF9vY2ksIGlfb2NpLCBzX25hbWUsIHNfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZXM6IHRydWUiKQp9CgphbGxvd19ieV9jb250YWluZXJfdHlwZShpX2NyaV90eXBlLCBwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAxOiBpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgaV9jcmlfdHlwZSA9PSAic2FuZGJveCIKCiAgICBpX2thdGFfdHlwZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1siaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5jb250YWluZXJfdHlwZSJdCiAgICBwcmludCgiYWxsb3dfYnlfY29udGFpbmVyX3R5cGUgMTogaV9rYXRhX3R5cGUgPSIsIGlfa2F0YV90eXBlKQogICAgaV9rYXRhX3R5cGUgPT0gInBvZF9zYW5kYm94IgoKICAgIGFsbG93X3NhbmRib3hfY29udGFpbmVyX25hbWUocF9vY2ksIGlfb2NpKQogICAgYWxsb3dfc2FuZGJveF9uZXRfbmFtZXNwYWNlKHBfb2NpLCBpX29jaSkKICAgIGFsbG93X3NhbmRib3hfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpCgogICAgcHJpbnQoImFsbG93X2J5X2NvbnRhaW5lcl90eXBlIDE6IHRydWUiKQp9CgphbGxvd19ieV9jb250YWluZXJfdHlwZShpX2NyaV90eXBlLCBwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiBpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgaV9jcmlfdHlwZSA9PSAiY29udGFpbmVyIgoKICAgIGlfa2F0YV90eXBlIDo9IGlfb2NpLkFubm90YXRpb25zWyJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIl0KICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiBpX2thdGFfdHlwZSA9IiwgaV9rYXRhX3R5cGUpCiAgICBpX2thdGFfdHlwZSA9PSAicG9kX2NvbnRhaW5lciIKCiAgICBhbGxvd19jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpCiAgICBhbGxvd19uZXRfbmFtZXNwYWNlKHBfb2NpLCBpX29jaSkKICAgIGFsbG93X2xvZ19kaXJlY3RvcnkocF9vY2ksIGlfb2NpKQoKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiB0cnVlIikKfQoKIyAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLW5hbWUiIGFubm90YXRpb24KYWxsb3dfc2FuZGJveF9jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X2NvbnRhaW5lcl9uYW1lOiBzdGFydCIpCgogICAgY29udGFpbmVyX2Fubm90YXRpb25fbWlzc2luZyhwX29jaSwgaV9vY2ksICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItbmFtZSIpCgogICAgcHJpbnQoImFsbG93X3NhbmRib3hfY29udGFpbmVyX25hbWU6IHRydWUiKQp9CgphbGxvd19jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19jb250YWluZXJfbmFtZTogc3RhcnQiKQoKICAgIGFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uKHBfb2NpLCBpX29jaSwgImlvLmt1YmVybmV0ZXMuY3JpLmNvbnRhaW5lci1uYW1lIikKCiAgICBwcmludCgiYWxsb3dfY29udGFpbmVyX25hbWU6IHRydWUiKQp9Cgpjb250YWluZXJfYW5ub3RhdGlvbl9taXNzaW5nKHBfb2NpLCBpX29jaSwga2V5KSB7CiAgICBwcmludCgiY29udGFpbmVyX2Fubm90YXRpb25fbWlzc2luZzoiLCBrZXkpCgogICAgbm90IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIG5vdCBpX29jaS5Bbm5vdGF0aW9uc1trZXldCgogICAgcHJpbnQoImNvbnRhaW5lcl9hbm5vdGF0aW9uX21pc3Npbmc6IHRydWUiKQp9CgphbGxvd19jb250YWluZXJfYW5ub3RhdGlvbihwX29jaSwgaV9vY2ksIGtleSkgewogICAgcHJpbnQoImFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uOiBrZXkgPSIsIGtleSkKCiAgICBwX3ZhbHVlIDo9IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIGlfdmFsdWUgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgcHJpbnQoImFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uOiBwX3ZhbHVlID0iLCBwX3ZhbHVlLCAiaV92YWx1ZSA9IiwgaV92YWx1ZSkKCiAgICBwX3ZhbHVlID09IGlfdmFsdWUKCiAgICBwcmludCgiYWxsb3dfY29udGFpbmVyX2Fubm90YXRpb246IHRydWUiKQp9CgojICJuZXJkY3RsL25ldHdvcmstbmFtZXNwYWNlIiBhbm5vdGF0aW9uCmFsbG93X3NhbmRib3hfbmV0X25hbWVzcGFjZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X25ldF9uYW1lc3BhY2U6IHN0YXJ0IikKCiAgICBrZXkgOj0gIm5lcmRjdGwvbmV0d29yay1uYW1lc3BhY2UiCgogICAgcF9uYW1lc3BhY2UgOj0gcF9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgaV9uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgcHJpbnQoImFsbG93X3NhbmRib3hfbmV0X25hbWVzcGFjZTogcF9uYW1lc3BhY2UgPSIsIHBfbmFtZXNwYWNlLCAiaV9uYW1lc3BhY2UgPSIsIGlfbmFtZXNwYWNlKQoKICAgIHJlZ2V4Lm1hdGNoKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9uZXRfbmFtZXNwYWNlOiB0cnVlIikKfQoKYWxsb3dfbmV0X25hbWVzcGFjZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19uZXRfbmFtZXNwYWNlOiBzdGFydCIpCgogICAga2V5IDo9ICJuZXJkY3RsL25ldHdvcmstbmFtZXNwYWNlIgoKICAgIG5vdCBwX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICBub3QgaV9vY2kuQW5ub3RhdGlvbnNba2V5XQoKICAgIHByaW50KCJhbGxvd19uZXRfbmFtZXNwYWNlOiB0cnVlIikKfQoKIyAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1sb2ctZGlyZWN0b3J5IiBhbm5vdGF0aW9uCmFsbG93X3NhbmRib3hfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X2xvZ19kaXJlY3Rvcnk6IHN0YXJ0IikKCiAgICBrZXkgOj0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbG9nLWRpcmVjdG9yeSIKCiAgICBwX2RpciA6PSBwX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICByZWdleDEgOj0gcmVwbGFjZShwX2RpciwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHJlZ2V4MiA6PSByZXBsYWNlKHJlZ2V4MSwgIiQoc2FuZGJveC1uYW1lc3BhY2UpIiwgc19uYW1lc3BhY2UpCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiByZWdleDIgPSIsIHJlZ2V4MikKCiAgICBpX2RpciA6PSBpX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiBpX2RpciA9IiwgaV9kaXIpCgogICAgcmVnZXgubWF0Y2gocmVnZXgyLCBpX2RpcikKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiB0cnVlIikKfQoKYWxsb3dfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19sb2dfZGlyZWN0b3J5OiBzdGFydCIpCgogICAga2V5IDo9ICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWxvZy1kaXJlY3RvcnkiCgogICAgbm90IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIG5vdCBpX29jaS5Bbm5vdGF0aW9uc1trZXldCgogICAgcHJpbnQoImFsbG93X2xvZ19kaXJlY3Rvcnk6IHRydWUiKQp9CgphbGxvd19kZXZpY2VzKHBfZGV2aWNlcywgaV9kZXZpY2VzKSB7CiAgICBwcmludCgiYWxsb3dfZGV2aWNlczogc3RhcnQiKQogICAgZXZlcnkgaV9kZXZpY2UgaW4gaV9kZXZpY2VzIHsKICAgICAgICBwcmludCgiYWxsb3dfZGV2aWNlczogaV9kZXZpY2UgPSIsIGlfZGV2aWNlKQogICAgICAgIHNvbWUgcF9kZXZpY2UgaW4gcF9kZXZpY2VzCiAgICAgICAgcF9kZXZpY2UuY29udGFpbmVyX3BhdGggPT0gaV9kZXZpY2UuY29udGFpbmVyX3BhdGgKICAgIH0KICAgIHByaW50KCJhbGxvd19kZXZpY2VzOiB0cnVlIikKfQoKYWxsb3dfbGludXgoc3RhdGVfb3BzLCBwX29jaSwgaV9vY2kpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIHBfbmFtZXNwYWNlcyA6PSBwX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbGludXg6IHAgbmFtZXNwYWNlcyA9IiwgcF9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlcyA6PSBpX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbGludXg6IGkgbmFtZXNwYWNlcyA9IiwgaV9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlX3dpdGhvdXRfbmV0d29yayA6PSBbb2JqIHwgb2JqIDo9IGlfbmFtZXNwYWNlc1tfXTsgb2JqLlR5cGUgIT0gIm5ldHdvcmsiXQoKICAgIHByaW50KCJhbGxvd19saW51eDogaV9uYW1lc3BhY2Vfd2l0aG91dF9uZXR3b3JrID0iLCBpX25hbWVzcGFjZV93aXRob3V0X25ldHdvcmspCgogICAgcF9uYW1lc3BhY2VzID09IGlfbmFtZXNwYWNlX3dpdGhvdXRfbmV0d29yawoKICAgIGFsbG93X21hc2tlZF9wYXRocyhwX29jaSwgaV9vY2kpCiAgICBhbGxvd19yZWFkb25seV9wYXRocyhwX29jaSwgaV9vY2kpCiAgICBhbGxvd19saW51eF9kZXZpY2VzKHBfb2NpLkxpbnV4LkRldmljZXMsIGlfb2NpLkxpbnV4LkRldmljZXMpCiAgICBhbGxvd19saW51eF9zeXNjdGwocF9vY2kuTGludXgsIGlfb2NpLkxpbnV4KQogICAgcmV0IDo9IGFsbG93X25ldHdvcmtfbmFtZXNwYWNlX3N0YXJ0KHN0YXRlX29wcywgcF9vY2ksIGlfb2NpKQogICAgcmV0LmFsbG93ZWQKCiAgICBvcHMgOj0gcmV0Lm9wcwoKICAgIHByaW50KCJhbGxvd19saW51eDogdHJ1ZSIpCn0KCiMgUmV0cmlldmUgdGhlICJuZXR3b3JrIiBuYW1lc3BhY2UgZnJvbSB0aGUgaW5wdXQgZGF0YSBhbmQgcGFzcyBpdCBvbiBmb3IgdGhlCiMgbmV0d29yayBuYW1lc3BhY2UgcG9saWN5IGNoZWNrcy4KYWxsb3dfbmV0d29ya19uYW1lc3BhY2Vfc3RhcnQoc3RhdGVfb3BzLCBwX29jaSwgaV9vY2kpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIHByaW50KCJhbGxvd19uZXR3b3JrX25hbWVzcGFjZSBzdGFydDogc3RhcnQiKQoKICAgIHBfbmFtZXNwYWNlcyA6PSBwX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IHAgbmFtZXNwYWNlcyA9IiwgcF9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlcyA6PSBpX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IGkgbmFtZXNwYWNlcyA9IiwgaV9uYW1lc3BhY2VzKQoKICAgICMgUmV0dXJuIHBhdGggb2YgdGhlICJuZXR3b3JrIiBuYW1lc3BhY2UKICAgIG5ldHdvcmtfbnMgOj0gW29iaiB8IG9iaiA6PSBpX25hbWVzcGFjZXNbX107IG9iai5UeXBlID09ICJuZXR3b3JrIl0KCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IG5ldHdvcmtfbnMgPSIsIG5ldHdvcmtfbnMpCgogICAgcmV0IDo9IGFsbG93X25ldHdvcmtfbmFtZXNwYWNlKHN0YXRlX29wcywgbmV0d29ya19ucykKICAgIHJldC5hbGxvd2VkCgogICAgb3BzIDo9IHJldC5vcHMKfQoKIyBUaGlzIHJ1bGUgaXMgd2hlbiB0aGVyZSdzIG5vIG5ldHdvcmsgbmFtZXNwYWNlIGluIHRoZSBpbnB1dCBkYXRhLgphbGxvd19uZXR3b3JrX25hbWVzcGFjZShzdGF0ZV9vcHMsIG5ldHdvcmtfbnMpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIGNvdW50KG5ldHdvcmtfbnMpID09IDAKCiAgICBuZXR3b3JrX25zX3BhdGggPSAiIgoKICAgIGFkZF9uZXR3b3JrX25hbWVzcGFjZV90b19zdGF0ZSA6PSBzdGF0ZV9hbGxvd3MoIm5ldHdvcmtfbmFtZXNwYWNlIiwgbmV0d29ya19uc19wYXRoKQogICAgb3BzIDo9IGNvbmNhdF9vcF9pZl9ub3RfbnVsbChzdGF0ZV9vcHMsIGFkZF9uZXR3b3JrX25hbWVzcGFjZV90b19zdGF0ZSkKCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2UgMTogdHJ1ZSIpCn0KCiMgVGhpcyBydWxlIGlzIHdoZW4gdGhlcmUncyBleGFjdGx5IG9uZSBuZXR3b3JrIG5hbWVzcGFjZSBpbiB0aGUgaW5wdXQgZGF0YS4KYWxsb3dfbmV0d29ya19uYW1lc3BhY2Uoc3RhdGVfb3BzLCBuZXR3b3JrX25zKSA6PSB7Im9wcyI6IG9wcywgImFsbG93ZWQiOiB0cnVlfSB7CiAgICBjb3VudChuZXR3b3JrX25zKSA9PSAxCgogICAgYWRkX25ldHdvcmtfbmFtZXNwYWNlX3RvX3N0YXRlIDo9IHN0YXRlX2FsbG93cygibmV0d29ya19uYW1lc3BhY2UiLCBuZXR3b3JrX25zWzBdLlBhdGgpCiAgICBvcHMgOj0gY29uY2F0X29wX2lmX25vdF9udWxsKHN0YXRlX29wcywgYWRkX25ldHdvcmtfbmFtZXNwYWNlX3RvX3N0YXRlKQoKICAgIHByaW50KCJhbGxvd19uZXR3b3JrX25hbWVzcGFjZSAyOiB0cnVlIikKfQoKYWxsb3dfbWFza2VkX3BhdGhzKHBfb2NpLCBpX29jaSkgewogICAgcF9wYXRocyA6PSBwX29jaS5MaW51eC5NYXNrZWRQYXRocwogICAgcHJpbnQoImFsbG93X21hc2tlZF9wYXRocyAxOiBwX3BhdGhzID0iLCBwX3BhdGhzKQoKICAgIGlfcGF0aHMgOj0gaV9vY2kuTGludXguTWFza2VkUGF0aHMKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aHMgMTogaV9wYXRocyA9IiwgaV9wYXRocykKCiAgICBhbGxvd19tYXNrZWRfcGF0aHNfYXJyYXkocF9wYXRocywgaV9wYXRocykKCiAgICBwcmludCgiYWxsb3dfbWFza2VkX3BhdGhzIDE6IHRydWUiKQp9CmFsbG93X21hc2tlZF9wYXRocyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aHMgMjogc3RhcnQiKQoKICAgIG5vdCBwX29jaS5MaW51eC5NYXNrZWRQYXRocwogICAgbm90IGlfb2NpLkxpbnV4Lk1hc2tlZFBhdGhzCgogICAgcHJpbnQoImFsbG93X21hc2tlZF9wYXRocyAyOiB0cnVlIikKfQoKIyBBbGwgdGhlIHBvbGljeSBtYXNrZWQgcGF0aHMgbXVzdCBiZSBtYXNrZWQgaW4gdGhlIGlucHV0IGRhdGEgdG9vLgojIElucHV0IGlzIGFsbG93ZWQgdG8gaGF2ZSBtb3JlIG1hc2tlZCBwYXRocyB0aGFuIHRoZSBwb2xpY3kuCmFsbG93X21hc2tlZF9wYXRoc19hcnJheShwX2FycmF5LCBpX2FycmF5KSB7CiAgICBldmVyeSBwX2VsZW0gaW4gcF9hcnJheSB7CiAgICAgICAgYWxsb3dfbWFza2VkX3BhdGgocF9lbGVtLCBpX2FycmF5KQogICAgfQp9CgphbGxvd19tYXNrZWRfcGF0aChwX2VsZW0sIGlfYXJyYXkpIHsKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aDogcF9lbGVtID0iLCBwX2VsZW0pCgogICAgc29tZSBpX2VsZW0gaW4gaV9hcnJheQogICAgcF9lbGVtID09IGlfZWxlbQoKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aDogdHJ1ZSIpCn0KCmFsbG93X3JlYWRvbmx5X3BhdGhzKHBfb2NpLCBpX29jaSkgewogICAgcF9wYXRocyA6PSBwX29jaS5MaW51eC5SZWFkb25seVBhdGhzCiAgICBwcmludCgiYWxsb3dfcmVhZG9ubHlfcGF0aHMgMTogcF9wYXRocyA9IiwgcF9wYXRocykKCiAgICBpX3BhdGhzIDo9IGlfb2NpLkxpbnV4LlJlYWRvbmx5UGF0aHMKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAxOiBpX3BhdGhzID0iLCBpX3BhdGhzKQoKICAgIGFsbG93X3JlYWRvbmx5X3BhdGhzX2FycmF5KHBfcGF0aHMsIGlfcGF0aHMsIGlfb2NpLkxpbnV4Lk1hc2tlZFBhdGhzKQoKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAxOiB0cnVlIikKfQphbGxvd19yZWFkb25seV9wYXRocyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAyOiBzdGFydCIpCgogICAgbm90IHBfb2NpLkxpbnV4LlJlYWRvbmx5UGF0aHMKICAgIG5vdCBpX29jaS5MaW51eC5SZWFkb25seVBhdGhzCgogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGhzIDI6IHRydWUiKQp9CgojIEFsbCB0aGUgcG9saWN5IHJlYWRvbmx5IHBhdGhzIG11c3QgYmUgZWl0aGVyOgojIC0gUHJlc2VudCBpbiB0aGUgaW5wdXQgcmVhZG9ubHkgcGF0aHMsIG9yCiMgLSBQcmVzZW50IGluIHRoZSBpbnB1dCBtYXNrZWQgcGF0aHMuCiMgSW5wdXQgaXMgYWxsb3dlZCB0byBoYXZlIG1vcmUgcmVhZG9ubHkgcGF0aHMgdGhhbiB0aGUgcG9saWN5LgphbGxvd19yZWFkb25seV9wYXRoc19hcnJheShwX2FycmF5LCBpX2FycmF5LCBtYXNrZWRfcGF0aHMpIHsKICAgIGV2ZXJ5IHBfZWxlbSBpbiBwX2FycmF5IHsKICAgICAgICBhbGxvd19yZWFkb25seV9wYXRoKHBfZWxlbSwgaV9hcnJheSwgbWFza2VkX3BhdGhzKQogICAgfQp9CgphbGxvd19yZWFkb25seV9wYXRoKHBfZWxlbSwgaV9hcnJheSwgbWFza2VkX3BhdGhzKSB7CiAgICBwcmludCgiYWxsb3dfcmVhZG9ubHlfcGF0aCAxOiBwX2VsZW0gPSIsIHBfZWxlbSkKCiAgICBzb21lIGlfZWxlbSBpbiBpX2FycmF5CiAgICBwX2VsZW0gPT0gaV9lbGVtCgogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGggMTogdHJ1ZSIpCn0KYWxsb3dfcmVhZG9ubHlfcGF0aChwX2VsZW0sIGlfYXJyYXksIG1hc2tlZF9wYXRocykgewogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGggMjogcF9lbGVtID0iLCBwX2VsZW0pCgogICAgc29tZSBpX21hc2tlZCBpbiBtYXNrZWRfcGF0aHMKICAgIHBfZWxlbSA9PSBpX21hc2tlZAoKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRoIDI6IHRydWUiKQp9CgphbGxvd19saW51eF9kZXZpY2VzKHBfZGV2aWNlcywgaV9kZXZpY2VzKSB7CiAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogc3RhcnQiKQogICAgZXZlcnkgaV9kZXZpY2UgaW4gaV9kZXZpY2VzIHsKICAgICAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogaV9kZXZpY2UgPSIsIGlfZGV2aWNlKQogICAgICAgIHNvbWUgcF9kZXZpY2UgaW4gcF9kZXZpY2VzCiAgICAgICAgaV9kZXZpY2UuUGF0aCA9PSBwX2RldmljZS5QYXRoCiAgICB9CiAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogdHJ1ZSIpCn0KCmFsbG93X2xpbnV4X3N5c2N0bChwX2xpbnV4LCBpX2xpbnV4KSB7CiAgICBwcmludCgiYWxsb3dfbGludXhfc3lzY3RsIDE6IHN0YXJ0IikKICAgIG5vdCBpX2xpbnV4LlN5c2N0bAogICAgcHJpbnQoImFsbG93X2xpbnV4X3N5c2N0bCAxOiB0cnVlIikKfQoKYWxsb3dfbGludXhfc3lzY3RsKHBfbGludXgsIGlfbGludXgpIHsKICAgIHByaW50KCJhbGxvd19saW51eF9zeXNjdGwgMjogc3RhcnQiKQogICAgcF9zeXNjdGwgOj0gcF9saW51eC5TeXNjdGwKICAgIGlfc3lzY3RsIDo9IGlfbGludXguU3lzY3RsCiAgICBldmVyeSBpX25hbWUsIGlfdmFsIGluIGlfc3lzY3RsIHsKICAgICAgICBwcmludCgiYWxsb3dfbGludXhfc3lzY3RsIDI6IGlfbmFtZSA9IiwgaV9uYW1lLCAiaV92YWwgPSIsIGlfdmFsKQogICAgICAgIHBfc3lzY3RsW2lfbmFtZV0gPT0gaV92YWwKICAgIH0KICAgIHByaW50KCJhbGxvd19saW51eF9zeXNjdGwgMjogdHJ1ZSIpCn0KCiMgQ2hlY2sgdGhlIGNvbnNpc3RlbmN5IG9mIHRoZSBpbnB1dCAiaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5idW5kbGVfcGF0aCIKIyBhbmQgaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCIgdmFsdWVzIHdpdGggb3RoZXIgZmllbGRzLgphbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZChwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpIHsKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogc3RhcnQiKQoKICAgIGJ1bmRsZV9wYXRoIDo9IGlfb2NpLkFubm90YXRpb25zWyJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmJ1bmRsZV9wYXRoIl0KICAgIGJ1bmRsZV9pZCA6PSByZXBsYWNlKGJ1bmRsZV9wYXRoLCAiL3J1bi9jb250YWluZXJkL2lvLmNvbnRhaW5lcmQucnVudGltZS52Mi50YXNrL2s4cy5pby8iLCAiIikKCiAgICBidW5kbGVfaWRfZm9ybWF0IDo9IGNvbmNhdCgiIiwgWyJeIiwgQlVORExFX0lELCAiJCJdKQogICAgcmVnZXgubWF0Y2goYnVuZGxlX2lkX2Zvcm1hdCwgYnVuZGxlX2lkKQoKICAgIGtleSA6PSAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCIKCiAgICBwX3JlZ2V4IDo9IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIHNhbmRib3hfaWQgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQoKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogc2FuZGJveF9pZCA9Iiwgc2FuZGJveF9pZCwgInJlZ2V4ID0iLCBwX3JlZ2V4KQogICAgcmVnZXgubWF0Y2gocF9yZWdleCwgc2FuZGJveF9pZCkKCiAgICBhbGxvd19yb290X3BhdGgocF9vY2ksIGlfb2NpLCBidW5kbGVfaWQpCgogICAgZXZlcnkgaV9tb3VudCBpbiBpX29jaS5Nb3VudHMgewogICAgICAgIGFsbG93X21vdW50KHBfb2NpLCBpX21vdW50LCBpX3N0b3JhZ2VzLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpCiAgICB9CgogICAgYWxsb3dfc3RvcmFnZXMocF9zdG9yYWdlcywgaV9zdG9yYWdlcywgYnVuZGxlX2lkLCBzYW5kYm94X2lkKQoKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogdHJ1ZSIpCn0KCmFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHBfcHJvY2VzcyA9IiwgcF9wcm9jZXNzKQogICAgcHJpbnQoImFsbG93X3Byb2Nlc3NfY29tbW9uOiBpX3Byb2Nlc3MgPSAiLCBpX3Byb2Nlc3MpCiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHNfbmFtZSA9Iiwgc19uYW1lKQoKICAgIHBfcHJvY2Vzcy5Dd2QgPT0gaV9wcm9jZXNzLkN3ZAogICAgcF9wcm9jZXNzLk5vTmV3UHJpdmlsZWdlcyA9PSBpX3Byb2Nlc3MuTm9OZXdQcml2aWxlZ2VzCgogICAgYWxsb3dfdXNlcihwX3Byb2Nlc3MsIGlfcHJvY2VzcykKICAgIGFsbG93X2VudihwX3Byb2Nlc3MsIGlfcHJvY2Vzcywgc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHRydWUiKQp9CgojIENvbXBhcmUgdGhlIE9DSSBQcm9jZXNzIGZpZWxkIG9mIGEgcG9saWN5IGNvbnRhaW5lciB3aXRoIHRoZSBpbnB1dCBPQ0kgUHJvY2VzcyBmcm9tIGEgQ3JlYXRlQ29udGFpbmVyUmVxdWVzdAphbGxvd19wcm9jZXNzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfcHJvY2Vzczogc3RhcnQiKQoKICAgIGFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgYWxsb3dfY2FwcyhwX3Byb2Nlc3MuQ2FwYWJpbGl0aWVzLCBpX3Byb2Nlc3MuQ2FwYWJpbGl0aWVzKQogICAgcF9wcm9jZXNzLlRlcm1pbmFsID09IGlfcHJvY2Vzcy5UZXJtaW5hbAoKICAgIHByaW50KCJhbGxvd19wcm9jZXNzOiB0cnVlIikKfQoKIyBDb21wYXJlIHRoZSBPQ0kgUHJvY2VzcyBmaWVsZCBvZiBhIHBvbGljeSBjb250YWluZXIgd2l0aCB0aGUgaW5wdXQgcHJvY2VzcyBmaWVsZCBmcm9tIEV4ZWNQcm9jZXNzUmVxdWVzdAphbGxvd19pbnRlcmFjdGl2ZV9wcm9jZXNzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfaW50ZXJhY3RpdmVfcHJvY2Vzczogc3RhcnQiKQoKICAgIGFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgYWxsb3dfZXhlY19jYXBzKGlfcHJvY2Vzcy5DYXBhYmlsaXRpZXMpCgogICAgIyBUaGVzZSBhcmUgY29tbWFuZHMgZW5hYmxlZCB1c2luZyBFeGVjUHJvY2Vzc1JlcXVlc3QgY29tbWFuZHMgYW5kL29yIHJlZ2V4IGZyb20gdGhlIHNldHRpbmdzIGZpbGUuCiAgICAjIFRoZXkgY2FuIGJlIGV4ZWN1dGVkIGludGVyYWN0aXZlbHkgc28gYWxsb3cgdGhlbSB0byB1c2UgYW55IHZhbHVlIGZvciBpX3Byb2Nlc3MuVGVybWluYWwuCgogICAgcHJpbnQoImFsbG93X2ludGVyYWN0aXZlX3Byb2Nlc3M6IHRydWUiKQp9CgojIENvbXBhcmUgdGhlIE9DSSBQcm9jZXNzIGZpZWxkIG9mIGEgcG9saWN5IGNvbnRhaW5lciB3aXRoIHRoZSBpbnB1dCBwcm9jZXNzIGZpZWxkIGZyb20gRXhlY1Byb2Nlc3NSZXF1ZXN0CmFsbG93X3Byb2JlX3Byb2Nlc3MocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19wcm9iZV9wcm9jZXNzOiBzdGFydCIpCgogICAgYWxsb3dfcHJvY2Vzc19jb21tb24ocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpCiAgICBhbGxvd19leGVjX2NhcHMoaV9wcm9jZXNzLkNhcGFiaWxpdGllcykKICAgIHBfcHJvY2Vzcy5UZXJtaW5hbCA9PSBpX3Byb2Nlc3MuVGVybWluYWwKCiAgICBwcmludCgiYWxsb3dfcHJvYmVfcHJvY2VzczogdHJ1ZSIpCn0KCmFsbG93X3VzZXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MpIHsKICAgIHBfdXNlciA6PSBwX3Byb2Nlc3MuVXNlcgogICAgaV91c2VyIDo9IGlfcHJvY2Vzcy5Vc2VyCgogICAgcHJpbnQoImFsbG93X3VzZXI6IGlucHV0IHVpZCA9IiwgaV91c2VyLlVJRCwgInBvbGljeSB1aWQgPSIsIHBfdXNlci5VSUQpCiAgICBwX3VzZXIuVUlEID09IGlfdXNlci5VSUQKCiAgICAjIFRPRE86IHRyYWNrIGRvd24gdGhlIHJlYXNvbiBmb3IgcmVnaXN0cnkuazhzLmlvL3BhdXNlOjMuOSBiZWluZwogICAgIyAgICAgICBleGVjdXRlZCB3aXRoIGdpZCA9IDAgZGVzcGl0ZSBoYXZpbmcgIjY1NTM1OjY1NTM1IiBpbiBpdHMgY29udGFpbmVyIGltYWdlCiAgICAjICAgICAgIGNvbmZpZy4KICAgICNwcmludCgiYWxsb3dfdXNlcjogaW5wdXQgZ2lkID0iLCBpX3VzZXIuR0lELCAicG9saWN5IGdpZCA9IiwgcF91c2VyLkdJRCkKICAgICNwX3VzZXIuR0lEID09IGlfdXNlci5HSUQKCiAgICAjIFRPRE86IGNvbXBhcmUgdGhlIGFkZGl0aW9uYWxHaWRzIGZpZWxkIHRvbyBhZnRlciBjb21wdXRpbmcgaXRzIHZhbHVlCiAgICAjIGJhc2VkIG9uIC9ldGMvcGFzc3dkIGFuZCAvZXRjL2dyb3VwIGZyb20gdGhlIGNvbnRhaW5lciBpbWFnZS4KfQoKYWxsb3dfZGVwcmVjYXRlZF9hcmdzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZ3MgMTogbm8gYXJncyIpCgogICAgbm90IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJncwogICAgbm90IGlfcHJvY2Vzcy5BcmdzCgogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAxOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZ3MocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSkgewogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiBwb2xpY3kgYXJncyA9IiwgcF9wcm9jZXNzLkRlcHJlY2F0ZWRBcmdzKQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiBpbnB1dCBhcmdzID0iLCBpX3Byb2Nlc3MuQXJncykKCiAgICBjb3VudChwX3Byb2Nlc3MuRGVwcmVjYXRlZEFyZ3MpID09IGNvdW50KGlfcHJvY2Vzcy5BcmdzKQoKICAgIGV2ZXJ5IGksIGlfYXJnIGluIGlfcHJvY2Vzcy5BcmdzIHsKICAgICAgICBhbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpCiAgICB9CgogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDE6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgcF9hcmcyIDo9IHJlcGxhY2UocF9hcmcsICIkJCIsICIkIikKICAgIHBfYXJnMiA9PSBpX2FyZwoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAxOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDI6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgIyBUT0RPOiBjYW4gJChub2RlLW5hbWUpIGJlIGhhbmRsZWQgYmV0dGVyPwogICAgY29udGFpbnMocF9hcmcsICIkKG5vZGUtbmFtZSkiKQoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAyOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDM6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgcF9hcmcyIDo9IHJlcGxhY2UocF9hcmcsICIkJCIsICIkIikKICAgIHBfYXJnMyA6PSByZXBsYWNlKHBfYXJnMiwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAzOiBwX2FyZzMgPSIsIHBfYXJnMykKICAgIHBfYXJnMyA9PSBpX2FyZwoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAzOiB0cnVlIikKfQoKIyBPQ0kgcHJvY2Vzcy5FbnYgZmllbGQKYWxsb3dfZW52KHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfZW52OiBwIGVudiA9IiwgcF9wcm9jZXNzLkVudikKICAgIHByaW50KCJhbGxvd19lbnY6IGkgZW52ID0iLCBpX3Byb2Nlc3MuRW52KQoKICAgIGV2ZXJ5IGlfdmFyIGluIGlfcHJvY2Vzcy5FbnYgewogICAgICAgIHByaW50KCJhbGxvd19lbnY6IGlfdmFyID0iLCBpX3ZhcikKICAgICAgICBhbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgfQoKICAgIHByaW50KCJhbGxvd19lbnY6IHRydWUiKQp9CgojIEFsbG93IGlucHV0IGVudiB2YXJpYWJsZXMgdGhhdCBhcmUgcHJlc2VudCBpbiB0aGUgcG9saWN5IGRhdGEgdG9vLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHBfdmFyID09IGlfdmFyCiAgICBwcmludCgiYWxsb3dfdmFyIDE6IHRydWUiKQp9CgojIE1hdGNoIGlucHV0IHdpdGggb25lIG9mIHRoZSBwb2xpY3kgdmFyaWFibGVzLCBhZnRlciBzdWJzdGl0dXRpbmcgJChzYW5kYm94LW5hbWUpLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHByaW50KCJhbGxvd192YXIgMjogcF92YXIgPSIsIHBfdmFyKQoKICAgIHBfdmFyX3NwbGl0IDo9IHNwbGl0KHBfdmFyLCAiPSIpCiAgICBjb3VudChwX3Zhcl9zcGxpdCkgPT0gMgoKICAgIHBfdmFyX3NwbGl0WzFdID09ICIkKHNhbmRib3gtbmFtZSkiCgogICAgaV92YXJfc3BsaXQgOj0gc3BsaXQoaV92YXIsICI9IikKICAgIGNvdW50KGlfdmFyX3NwbGl0KSA9PSAyCgogICAgaV92YXJfc3BsaXRbMF0gPT0gcF92YXJfc3BsaXRbMF0KICAgIHJlZ2V4Lm1hdGNoKHNfbmFtZSwgaV92YXJfc3BsaXRbMV0pCgogICAgcHJpbnQoImFsbG93X3ZhciAyOiB0cnVlIikKfQoKIyBBbGxvdyBpbnB1dCBlbnYgdmFyaWFibGVzIHRoYXQgbWF0Y2ggd2l0aCBhIHJlcXVlc3RfZGVmYXVsdHMgcmVnZXguCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHNvbWUgcF9yZWdleDEgaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5DcmVhdGVDb250YWluZXJSZXF1ZXN0LmFsbG93X2Vudl9yZWdleAogICAgcF9yZWdleDIgOj0gcmVwbGFjZShwX3JlZ2V4MSwgIiQoaXB2NF9hKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcHY0X2EpCiAgICBwX3JlZ2V4MyA6PSByZXBsYWNlKHBfcmVnZXgyLCAiJChpcF9wKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcF9wKQogICAgcF9yZWdleDQgOj0gcmVwbGFjZShwX3JlZ2V4MywgIiQoc3ZjX25hbWUpIiwgcG9saWN5X2RhdGEuY29tbW9uLnN2Y19uYW1lKQogICAgcF9yZWdleDUgOj0gcmVwbGFjZShwX3JlZ2V4NCwgIiQoZG5zX2xhYmVsKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5kbnNfbGFiZWwpCgogICAgcHJpbnQoImFsbG93X3ZhciAzOiBwX3JlZ2V4NSA9IiwgcF9yZWdleDUpCiAgICByZWdleC5tYXRjaChwX3JlZ2V4NSwgaV92YXIpCgogICAgcHJpbnQoImFsbG93X3ZhciAzOiB0cnVlIikKfQoKIyBBbGxvdyBmaWVsZFJlZiAiZmllbGRQYXRoOiBzdGF0dXMucG9kSVAiIHZhbHVlcy4KYWxsb3dfdmFyKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBpX3Zhciwgc19uYW1lLCBzX25hbWVzcGFjZSkgewogICAgbmFtZV92YWx1ZSA6PSBzcGxpdChpX3ZhciwgIj0iKQogICAgY291bnQobmFtZV92YWx1ZSkgPT0gMgogICAgaXNfaXAobmFtZV92YWx1ZVsxXSkKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIGFsbG93X3BvZF9pcF92YXIobmFtZV92YWx1ZVswXSwgcF92YXIpCgogICAgcHJpbnQoImFsbG93X3ZhciA0OiB0cnVlIikKfQoKIyBBbGxvdyBjb21tb24gZmllbGRSZWYgdmFyaWFibGVzLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBuYW1lX3ZhbHVlIDo9IHNwbGl0KGlfdmFyLCAiPSIpCiAgICBjb3VudChuYW1lX3ZhbHVlKSA9PSAyCgogICAgc29tZSBwX3ZhciBpbiBwX3Byb2Nlc3MuRW52CiAgICBwX25hbWVfdmFsdWUgOj0gc3BsaXQocF92YXIsICI9IikKICAgIGNvdW50KHBfbmFtZV92YWx1ZSkgPT0gMgoKICAgIHBfbmFtZV92YWx1ZVswXSA9PSBuYW1lX3ZhbHVlWzBdCgogICAgIyBUT0RPOiBzaG91bGQgdGhlc2UgYmUgaGFuZGxlZCBpbiBhIGRpZmZlcmVudCB3YXk/CiAgICBhbHdheXNfYWxsb3dlZCA6PSBbIiQoaG9zdC1uYW1lKSIsICIkKG5vZGUtbmFtZSkiLCAiJChwb2QtdWlkKSJdCiAgICBzb21lIGFsbG93ZWQgaW4gYWx3YXlzX2FsbG93ZWQKICAgIGNvbnRhaW5zKHBfbmFtZV92YWx1ZVsxXSwgYWxsb3dlZCkKCiAgICBwcmludCgiYWxsb3dfdmFyIDU6IHRydWUiKQp9CgojIEFsbG93IGZpZWxkUmVmICJmaWVsZFBhdGg6IHN0YXR1cy5ob3N0SVAiIHZhbHVlcy4KYWxsb3dfdmFyKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBpX3Zhciwgc19uYW1lLCBzX25hbWVzcGFjZSkgewogICAgbmFtZV92YWx1ZSA6PSBzcGxpdChpX3ZhciwgIj0iKQogICAgY291bnQobmFtZV92YWx1ZSkgPT0gMgogICAgaXNfaXAobmFtZV92YWx1ZVsxXSkKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIGFsbG93X2hvc3RfaXBfdmFyKG5hbWVfdmFsdWVbMF0sIHBfdmFyKQoKICAgIHByaW50KCJhbGxvd192YXIgNjogdHJ1ZSIpCn0KCiMgQWxsb3cgcmVzb3VyY2VGaWVsZFJlZiB2YWx1ZXMgKGUuZy4sICJsaW1pdHMuY3B1IikuCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIG5hbWVfdmFsdWUgOj0gc3BsaXQoaV92YXIsICI9IikKICAgIGNvdW50KG5hbWVfdmFsdWUpID09IDIKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHBfbmFtZV92YWx1ZSA6PSBzcGxpdChwX3ZhciwgIj0iKQogICAgY291bnQocF9uYW1lX3ZhbHVlKSA9PSAyCgogICAgcF9uYW1lX3ZhbHVlWzBdID09IG5hbWVfdmFsdWVbMF0KCiAgICAjIGEgdmFyaWFibGUgd2Ugc2hvdWxkIGJlIHZhbGlkYXRpbmcgdXNpbmcgYSByZWdleCBmcm9tIHNldHRpbmdzCiAgICBwX25hbWVfdmFsdWVbMV0gPT0gIiQodmFsaWRhdGUtZnJvbS1zZXR0aW5ncykiCgogICAgcmVnZXhfdmFsIDo9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuQ3JlYXRlQ29udGFpbmVyUmVxdWVzdC5hbGxvd19lbnZfcmVnZXhfbWFwW25hbWVfdmFsdWVbMF1dCgogICAgcHJpbnQoImFsbG93X3ZhciA3OiB2YWwgPSIsIG5hbWVfdmFsdWVbMV0pCiAgICBwcmludCgiYWxsb3dfdmFyIDc6IHJlZ2V4X3ZhbCA9IiwgcmVnZXhfdmFsKQoKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4X3ZhbCwgbmFtZV92YWx1ZVsxXSkKCiAgICBwcmludCgiYWxsb3dfdmFyIDc6IHRydWUiKQp9CgojIE1hdGNoIGlucHV0IHdpdGggb25lIG9mIHRoZSBwb2xpY3kgdmFyaWFibGVzLCBhZnRlciBzdWJzdGl0dXRpbmcgJChzYW5kYm94LW5hbWVzcGFjZSkuCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHNvbWUgcF92YXIgaW4gcF9wcm9jZXNzLkVudgogICAgcF92YXIyIDo9IHJlcGxhY2UocF92YXIsICIkKHNhbmRib3gtbmFtZXNwYWNlKSIsIHNfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd192YXIgODogcF92YXIyID0iLCBwX3ZhcjIpCiAgICBwX3ZhcjIgPT0gaV92YXIKCiAgICBwcmludCgiYWxsb3dfdmFyIDg6IHRydWUiKQp9CgphbGxvd19wb2RfaXBfdmFyKHZhcl9uYW1lLCBwX3ZhcikgewogICAgcHJpbnQoImFsbG93X3BvZF9pcF92YXI6IHZhcl9uYW1lID0iLCB2YXJfbmFtZSwgInBfdmFyID0iLCBwX3ZhcikKCiAgICBwX25hbWVfdmFsdWUgOj0gc3BsaXQocF92YXIsICI9IikKICAgIGNvdW50KHBfbmFtZV92YWx1ZSkgPT0gMgoKICAgIHBfbmFtZV92YWx1ZVswXSA9PSB2YXJfbmFtZQogICAgcF9uYW1lX3ZhbHVlWzFdID09ICIkKHBvZC1pcCkiCgogICAgcHJpbnQoImFsbG93X3BvZF9pcF92YXI6IHRydWUiKQp9CgphbGxvd19ob3N0X2lwX3Zhcih2YXJfbmFtZSwgcF92YXIpIHsKICAgIHByaW50KCJhbGxvd19ob3N0X2lwX3ZhcjogdmFyX25hbWUgPSIsIHZhcl9uYW1lLCAicF92YXIgPSIsIHBfdmFyKQoKICAgIHBfbmFtZV92YWx1ZSA6PSBzcGxpdChwX3ZhciwgIj0iKQogICAgY291bnQocF9uYW1lX3ZhbHVlKSA9PSAyCgogICAgcF9uYW1lX3ZhbHVlWzBdID09IHZhcl9uYW1lCiAgICBwX25hbWVfdmFsdWVbMV0gPT0gIiQoaG9zdC1pcCkiCgogICAgcHJpbnQoImFsbG93X2hvc3RfaXBfdmFyOiB0cnVlIikKfQoKaXNfaXAodmFsdWUpIHsKICAgIGJ5dGVzID0gc3BsaXQodmFsdWUsICIuIikKICAgIGNvdW50KGJ5dGVzKSA9PSA0CgogICAgaXNfaXBfZmlyc3RfYnl0ZShieXRlc1swXSkKICAgIGlzX2lwX290aGVyX2J5dGUoYnl0ZXNbMV0pCiAgICBpc19pcF9vdGhlcl9ieXRlKGJ5dGVzWzJdKQogICAgaXNfaXBfb3RoZXJfYnl0ZShieXRlc1szXSkKfQppc19pcF9maXJzdF9ieXRlKGNvbXBvbmVudCkgewogICAgbnVtYmVyID0gdG9fbnVtYmVyKGNvbXBvbmVudCkKICAgIG51bWJlciA+PSAxCiAgICBudW1iZXIgPD0gMjU1Cn0KaXNfaXBfb3RoZXJfYnl0ZShjb21wb25lbnQpIHsKICAgIG51bWJlciA9IHRvX251bWJlcihjb21wb25lbnQpCiAgICBudW1iZXIgPj0gMAogICAgbnVtYmVyIDw9IDI1NQp9CgojIE9DSSByb290LlBhdGgKYWxsb3dfcm9vdF9wYXRoKHBfb2NpLCBpX29jaSwgYnVuZGxlX2lkKSB7CiAgICBpX3BhdGggOj0gaV9vY2kuUm9vdC5QYXRoCiAgICBwX3BhdGgxIDo9IHBfb2NpLlJvb3QuUGF0aAogICAgcHJpbnQoImFsbG93X3Jvb3RfcGF0aDogaV9wYXRoID0iLCBpX3BhdGgsICJwX3BhdGgxID0iLCBwX3BhdGgxKQoKICAgIHBfcGF0aDIgOj0gcmVwbGFjZShwX3BhdGgxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfcm9vdF9wYXRoOiBwX3BhdGgyID0iLCBwX3BhdGgyKQoKICAgIHBfcGF0aDMgOj0gcmVwbGFjZShwX3BhdGgyLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X3Jvb3RfcGF0aDogcF9wYXRoMyA9IiwgcF9wYXRoMykKCiAgICBwX3BhdGgzID09IGlfcGF0aAoKICAgIHByaW50KCJhbGxvd19yb290X3BhdGg6IHRydWUiKQp9CgojIGRldmljZSBtb3VudHMKYWxsb3dfbW91bnQocF9vY2ksIGlfbW91bnQsIGlfc3RvcmFnZXMsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcHJpbnQoImFsbG93X21vdW50OiBpX21vdW50ID0iLCBpX21vdW50KQoKICAgIHNvbWUgcF9tb3VudCBpbiBwX29jaS5Nb3VudHMKICAgIHNvbWUgaV9zdG9yYWdlIGluIGlfc3RvcmFnZXMKCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IHBfbW91bnQgPSIsIHBfbW91bnQpCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IGlfc3RvcmFnZSA9IiwgaV9zdG9yYWdlKQoKICAgIGNoZWNrX21vdW50KHBfbW91bnQsIGlfbW91bnQsIGlfc3RvcmFnZSwgYnVuZGxlX2lkLCBzYW5kYm94X2lkKQoKICAgICMgVE9ETzogYXJlIHRoZXJlIGFueSBvdGhlciByZXF1aXJlZCBwb2xpY3kgY2hlY2tzIGZvciBtb3VudHMgLSBlLmcuLAogICAgIyAgICAgICBtdWx0aXBsZSBtb3VudHMgd2l0aCBzYW1lIHNvdXJjZSBvciBkZXN0aW5hdGlvbj8KCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IHRydWUiKQp9CgpjaGVja19tb3VudChwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcF9tb3VudCA9PSBpX21vdW50CiAgICBwcmludCgiY2hlY2tfbW91bnQgMTogdHJ1ZSIpCn0KY2hlY2tfbW91bnQocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHBfbW91bnQuZGVzdGluYXRpb24gPT0gaV9tb3VudC5kZXN0aW5hdGlvbgogICAgcF9tb3VudC50eXBlXyA9PSBpX21vdW50LnR5cGVfCiAgICBwX21vdW50Lm9wdGlvbnMgPT0gaV9tb3VudC5vcHRpb25zCgogICAgbW91bnRfc291cmNlX2FsbG93cyhwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkKCiAgICBwcmludCgiY2hlY2tfbW91bnQgMjogdHJ1ZSIpCn0KCm1vdW50X3NvdXJjZV9hbGxvd3MocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHJlZ2V4MSA6PSBwX21vdW50LnNvdXJjZQogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5tb3VudF9zb3VyY2VfY3BhdGgpCiAgICByZWdleDQgOj0gcmVwbGFjZShyZWdleDMsICIkKGJ1bmRsZS1pZCkiLCBidW5kbGVfaWQpCgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMTogcmVnZXg0ID0iLCByZWdleDQpCiAgICByZWdleC5tYXRjaChyZWdleDQsIGlfbW91bnQuc291cmNlKQoKICAgIHByaW50KCJtb3VudF9zb3VyY2VfYWxsb3dzIDE6IHRydWUiKQp9Cm1vdW50X3NvdXJjZV9hbGxvd3MocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHJlZ2V4MSA6PSBwX21vdW50LnNvdXJjZQogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5tb3VudF9zb3VyY2VfY3BhdGgpCiAgICByZWdleDQgOj0gcmVwbGFjZShyZWdleDMsICIkKHNhbmRib3gtaWQpIiwgc2FuZGJveF9pZCkKCiAgICBwcmludCgibW91bnRfc291cmNlX2FsbG93cyAyOiByZWdleDQgPSIsIHJlZ2V4NCkKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4NCwgaV9tb3VudC5zb3VyY2UpCgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMjogdHJ1ZSIpCn0KbW91bnRfc291cmNlX2FsbG93cyhwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogaV9tb3VudC5zb3VyY2UgPSIsIGlfbW91bnQuc291cmNlKQogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogaV9zdG9yYWdlLm1vdW50X3BvaW50ID0iLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCgogICAgaV9tb3VudC5zb3VyY2UgPT0gaV9zdG9yYWdlLm1vdW50X3BvaW50CgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogdHJ1ZSIpCn0KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBDcmVhdGUgY29udGFpbmVyIFN0b3JhZ2VzCgphbGxvd19zdG9yYWdlcyhwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHBfY291bnQgOj0gY291bnQocF9zdG9yYWdlcykKICAgIGlfY291bnQgOj0gY291bnQoaV9zdG9yYWdlcykKICAgIHByaW50KCJhbGxvd19zdG9yYWdlczogcF9jb3VudCA9IiwgcF9jb3VudCwgImlfY291bnQgPSIsIGlfY291bnQpCgogICAgcF9jb3VudCA9PSBpX2NvdW50CgogICAgIyBHZXQgdGhlIGNvbnRhaW5lciBpbWFnZSBsYXllciBJRHMgYW5kIHZlcml0eSByb290IGhhc2hlcywgZnJvbSB0aGUgIm92ZXJsYXlmcyIgc3RvcmFnZS4KICAgIHNvbWUgb3ZlcmxheV9zdG9yYWdlIGluIHBfc3RvcmFnZXMKICAgIG92ZXJsYXlfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIHByaW50KCJhbGxvd19zdG9yYWdlczogb3ZlcmxheV9zdG9yYWdlID0iLCBvdmVybGF5X3N0b3JhZ2UpCiAgICBjb3VudChvdmVybGF5X3N0b3JhZ2Uub3B0aW9ucykgPT0gMgoKICAgIGxheWVyX2lkcyA6PSBzcGxpdChvdmVybGF5X3N0b3JhZ2Uub3B0aW9uc1swXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiBsYXllcl9pZHMgPSIsIGxheWVyX2lkcykKCiAgICByb290X2hhc2hlcyA6PSBzcGxpdChvdmVybGF5X3N0b3JhZ2Uub3B0aW9uc1sxXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiByb290X2hhc2hlcyA9Iiwgcm9vdF9oYXNoZXMpCgogICAgZXZlcnkgaV9zdG9yYWdlIGluIGlfc3RvcmFnZXMgewogICAgICAgIGFsbG93X3N0b3JhZ2UocF9zdG9yYWdlcywgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpCiAgICB9CgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiB0cnVlIikKfQoKYWxsb3dfc3RvcmFnZShwX3N0b3JhZ2VzLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgc29tZSBwX3N0b3JhZ2UgaW4gcF9zdG9yYWdlcwoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiBwX3N0b3JhZ2UgPSIsIHBfc3RvcmFnZSkKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiBpX3N0b3JhZ2UgPSIsIGlfc3RvcmFnZSkKCiAgICBwX3N0b3JhZ2UuZHJpdmVyICAgICAgICAgICA9PSBpX3N0b3JhZ2UuZHJpdmVyCiAgICBwX3N0b3JhZ2UuZHJpdmVyX29wdGlvbnMgICA9PSBpX3N0b3JhZ2UuZHJpdmVyX29wdGlvbnMKICAgIHBfc3RvcmFnZS5mc19ncm91cCAgICAgICAgID09IGlfc3RvcmFnZS5mc19ncm91cAogICAgcF9zdG9yYWdlLmZzdHlwZSAgICAgICAgICAgPT0gaV9zdG9yYWdlLmZzdHlwZQoKICAgIGFsbG93X3N0b3JhZ2Vfc291cmNlKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKQogICAgYWxsb3dfc3RvcmFnZV9vcHRpb25zKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKQogICAgYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKQoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiB0cnVlIikKfQoKYWxsb3dfc3RvcmFnZV9zb3VyY2UocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX3NvdXJjZSAxOiBzdGFydCIpCgogICAgcF9zdG9yYWdlLnNvdXJjZSA9PSBpX3N0b3JhZ2Uuc291cmNlCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDE6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX3NvdXJjZShwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDI6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCgogICAgIyBEREREOkJCOkRELkY6IERvbWFpbjpCdXM6RGV2aWNlLkZ1bmN0aW9uCiAgICAjIGh0dHBzOi8vd3d3Lmtlcm5lbC5vcmcvZG9jL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtYnVzLXBjaQogICAgcmVnZXgubWF0Y2goYF5bYS1mMC05XXs0fTpbYS1mMC05XXsyfTpbYS1mMC05XXsyfVwuW2EtZjAtOV0kYCwgaV9zdG9yYWdlLnNvdXJjZSkKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9zb3VyY2UgMjogdHJ1ZSIpCn0KCmFsbG93X3N0b3JhZ2Vfc291cmNlKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKSB7CiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9zb3VyY2UgMzogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIGlfc3RvcmFnZS5zb3VyY2UgPT0gIm5vbmUiCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDM6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX3NvdXJjZShwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDQ6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJzbWIiCgogICAgIyBQYXR0ZXJuOiAvLzxzdG9yYWdlLWFjY291bnQtbmFtZT4uZmlsZS5jb3JlLndpbmRvd3MubmV0LzxrOHMtUFZDLW5hbWU+CiAgICAjIFN0b3JhZ2UgYWNjb3VudCBuYW1lOiBodHRwczovL2xlYXJuLm1pY3Jvc29mdC5jb20vZW4tdXMvYXp1cmUvc3RvcmFnZS9jb21tb24vc3RvcmFnZS1hY2NvdW50LW92ZXJ2aWV3I3N0b3JhZ2UtYWNjb3VudC1uYW1lCiAgICAjIEs4cyBQVkMgbmFtZTogaHR0cHM6Ly9rdWJlcm5ldGVzLmlvL2RvY3MvY29uY2VwdHMvb3ZlcnZpZXcvd29ya2luZy13aXRoLW9iamVjdHMvbmFtZXMvI2Rucy1zdWJkb21haW4tbmFtZXMKICAgIHJlZ2V4Lm1hdGNoKGBeXC9cLyhbYS16MC05XXszLDI0fSlcLmZpbGVcLmNvcmVcLndpbmRvd3NcLm5ldFwvW2EtejAtOV0oW2EtejAtOS4tXXswLDI1MX1bYS16MC05XSk/JGAsIGlfc3RvcmFnZS5zb3VyY2UpCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDQ6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMTogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgIT0gIm92ZXJsYXlmcyIKICAgIHBfc3RvcmFnZS5vcHRpb25zID09IGlfc3RvcmFnZS5vcHRpb25zCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAxOiB0cnVlIikKfQphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIGNvdW50KHBfc3RvcmFnZS5vcHRpb25zKSA9PSAyCgogICAgcG9saWN5X2lkcyA6PSBzcGxpdChwX3N0b3JhZ2Uub3B0aW9uc1swXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBwb2xpY3lfaWRzID0iLCBwb2xpY3lfaWRzKQogICAgcG9saWN5X2lkcyA9PSBsYXllcl9pZHMKCiAgICBwb2xpY3lfaGFzaGVzIDo9IHNwbGl0KHBfc3RvcmFnZS5vcHRpb25zWzFdLCAiOiIpCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IHBvbGljeV9oYXNoZXMgPSIsIHBvbGljeV9oYXNoZXMpCgogICAgcF9jb3VudCA6PSBjb3VudChwb2xpY3lfaWRzKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBwX2NvdW50ID0iLCBwX2NvdW50KQogICAgcF9jb3VudCA+PSAxCiAgICBwX2NvdW50ID09IGNvdW50KHBvbGljeV9oYXNoZXMpCgogICAgaV9jb3VudCA6PSBjb3VudChpX3N0b3JhZ2Uub3B0aW9ucykKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogaV9jb3VudCA9IiwgaV9jb3VudCkKICAgIGlfY291bnQgPT0gcF9jb3VudCArIDMKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zWzBdID0iLCBpX3N0b3JhZ2Uub3B0aW9uc1swXSkKICAgIGlfc3RvcmFnZS5vcHRpb25zWzBdID09ICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQubGF5ZXItc3JjLXByZWZpeD0vdmFyL2xpYi9jb250YWluZXJkL2lvLmNvbnRhaW5lcmQuc25hcHNob3R0ZXIudjEudGFyZGV2L2xheWVycyIKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zW2lfY291bnQgLSAyXSA9IiwgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDJdKQogICAgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDJdID09ICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQub3ZlcmxheS1ydyIKCiAgICBsb3dlcmRpciA6PSBjb25jYXQoIj0iLCBbImxvd2VyZGlyIiwgcF9zdG9yYWdlLm9wdGlvbnNbMF1dKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBsb3dlcmRpciA9IiwgbG93ZXJkaXIpCgogICAgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDFdID09IGxvd2VyZGlyCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zW2lfY291bnQgLSAxXSA9IiwgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDFdKQoKICAgIGV2ZXJ5IGksIHBvbGljeV9pZCBpbiBwb2xpY3lfaWRzIHsKICAgICAgICBhbGxvd19vdmVybGF5X2xheWVyKHBvbGljeV9pZCwgcG9saWN5X2hhc2hlc1tpXSwgaV9zdG9yYWdlLm9wdGlvbnNbaSArIDFdKQogICAgfQoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogdHJ1ZSIpCn0KYWxsb3dfc3RvcmFnZV9vcHRpb25zKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKSB7CiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDM6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCiAgICBjb3VudChwX3N0b3JhZ2Uub3B0aW9ucykgPT0gMQoKICAgIHN0YXJ0c3dpdGgocF9zdG9yYWdlLm9wdGlvbnNbMF0sICIkKGhhc2giKQogICAgaGFzaF9zdWZmaXggOj0gdHJpbV9sZWZ0KHBfc3RvcmFnZS5vcHRpb25zWzBdLCAiJChoYXNoIikKCiAgICBlbmRzd2l0aChoYXNoX3N1ZmZpeCwgIikiKQogICAgaGFzaF9pbmRleCA6PSB0cmltX3JpZ2h0KGhhc2hfc3VmZml4LCAiKSIpCiAgICBpIDo9IHRvX251bWJlcihoYXNoX2luZGV4KQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAzOiBpID0iLCBpKQoKICAgIGhhc2hfb3B0aW9uIDo9IGNvbmNhdCgiPSIsIFsiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LnJvb3QtaGFzaCIsIHJvb3RfaGFzaGVzW2ldXSkKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMzogaGFzaF9vcHRpb24gPSIsIGhhc2hfb3B0aW9uKQoKICAgIGNvdW50KGlfc3RvcmFnZS5vcHRpb25zKSA9PSA0CiAgICBpX3N0b3JhZ2Uub3B0aW9uc1swXSA9PSAicm8iCiAgICBpX3N0b3JhZ2Uub3B0aW9uc1sxXSA9PSAiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmJsb2NrX2RldmljZT1maWxlIgogICAgaV9zdG9yYWdlLm9wdGlvbnNbMl0gPT0gImlvLmthdGFjb250YWluZXJzLmZzLW9wdC5pcy1sYXllciIKICAgIGlfc3RvcmFnZS5vcHRpb25zWzNdID09IGhhc2hfb3B0aW9uCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAzOiB0cnVlIikKfQphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgNDogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gInNtYiIKICAgIHBfb3B0c19jb3VudCA6PSBjb3VudChwX3N0b3JhZ2Uub3B0aW9ucykKICAgIGlfb3B0c19jb3VudCA6PSBjb3VudChpX3N0b3JhZ2Uub3B0aW9ucykKICAgIGlfb3B0c19jb3VudCA9PSBwX29wdHNfY291bnQgKyAyCgogICAgaV9vcHRfbWF0Y2hlcyA6PSBbaSB8IGkgOj0gaWR4OyBpZHggPCBwX29wdHNfY291bnQ7IHBfc3RvcmFnZS5vcHRpb25zW2lkeF0gPT0gaV9zdG9yYWdlLm9wdGlvbnNbaWR4XV0KICAgIGNvdW50KGlfb3B0X21hdGNoZXMpID09IHBfb3B0c19jb3VudAoKICAgIHN0YXJ0c3dpdGgoaV9zdG9yYWdlLm9wdGlvbnNbaV9vcHRzX2NvdW50LTJdLCAiYWRkcj0iKQogICAgY3JlZHMgPSBzcGxpdChpX3N0b3JhZ2Uub3B0aW9uc1tpX29wdHNfY291bnQtMV0sICIsIikKICAgIGNvdW50KGNyZWRzKSA9PSAyCiAgICBzdGFydHN3aXRoKGNyZWRzWzBdLCAidXNlcm5hbWU9IikKICAgIHN0YXJ0c3dpdGgoY3JlZHNbMV0sICJwYXNzd29yZD0iKQogICAgCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDQ6IHRydWUiKQp9CgphbGxvd19vdmVybGF5X2xheWVyKHBvbGljeV9pZCwgcG9saWN5X2hhc2gsIGlfb3B0aW9uKSB7CiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogcG9saWN5X2lkID0iLCBwb2xpY3lfaWQsICJwb2xpY3lfaGFzaCA9IiwgcG9saWN5X2hhc2gpCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogaV9vcHRpb24gPSIsIGlfb3B0aW9uKQoKICAgIHN0YXJ0c3dpdGgoaV9vcHRpb24sICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQubGF5ZXI9IikKICAgIGlfdmFsdWUgOj0gcmVwbGFjZShpX29wdGlvbiwgImlvLmthdGFjb250YWluZXJzLmZzLW9wdC5sYXllcj0iLCAiIikKICAgIGlfdmFsdWVfZGVjb2RlZCA6PSBiYXNlNjQuZGVjb2RlKGlfdmFsdWUpCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogaV92YWx1ZV9kZWNvZGVkID0iLCBpX3ZhbHVlX2RlY29kZWQpCgogICAgcG9saWN5X3N1ZmZpeCA6PSBjb25jYXQoIj0iLCBbInRhcixybyxpby5rYXRhY29udGFpbmVycy5mcy1vcHQuYmxvY2tfZGV2aWNlPWZpbGUsaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmlzLWxheWVyLGlvLmthdGFjb250YWluZXJzLmZzLW9wdC5yb290LWhhc2giLCBwb2xpY3lfaGFzaF0pCiAgICBwX3ZhbHVlIDo9IGNvbmNhdCgiLCIsIFtwb2xpY3lfaWQsIHBvbGljeV9zdWZmaXhdKQogICAgcHJpbnQoImFsbG93X292ZXJsYXlfbGF5ZXI6IHBfdmFsdWUgPSIsIHBfdmFsdWUpCgogICAgcF92YWx1ZSA9PSBpX3ZhbHVlX2RlY29kZWQKCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogdHJ1ZSIpCn0KCmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAidGFyIgoKICAgIHN0YXJ0c3dpdGgocF9zdG9yYWdlLm1vdW50X3BvaW50LCAiJChsYXllciIpCiAgICBtb3VudF9zdWZmaXggOj0gdHJpbV9sZWZ0KHBfc3RvcmFnZS5tb3VudF9wb2ludCwgIiQobGF5ZXIiKQoKICAgIGVuZHN3aXRoKG1vdW50X3N1ZmZpeCwgIikiKQogICAgbGF5ZXJfaW5kZXggOj0gdHJpbV9yaWdodChtb3VudF9zdWZmaXgsICIpIikKICAgIGkgOj0gdG9fbnVtYmVyKGxheWVyX2luZGV4KQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDE6IGkgPSIsIGkpCgogICAgbGF5ZXJfaWQgOj0gbGF5ZXJfaWRzW2ldCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMTogbGF5ZXJfaWQgPSIsIGxheWVyX2lkKQoKICAgIHBfbW91bnQgOj0gY29uY2F0KCIvIiwgWyIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L2xheWVycyIsIGxheWVyX2lkXSkKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCAxOiBwX21vdW50ID0iLCBwX21vdW50KQoKICAgIHBfbW91bnQgPT0gaV9zdG9yYWdlLm1vdW50X3BvaW50CgogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDE6IHRydWUiKQp9CmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAiZnVzZTMua2F0YS1vdmVybGF5IgoKICAgIG1vdW50MSA6PSByZXBsYWNlKHBfc3RvcmFnZS5tb3VudF9wb2ludCwgIiQoY3BhdGgpIiwgcG9saWN5X2RhdGEuY29tbW9uLmNwYXRoKQogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDI6IG1vdW50MiA9IiwgbW91bnQyKQoKICAgIG1vdW50MiA9PSBpX3N0b3JhZ2UubW91bnRfcG9pbnQKCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMjogdHJ1ZSIpCn0KYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKSB7CiAgICBwX3N0b3JhZ2UuZnN0eXBlID09ICJsb2NhbCIKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQyID0iLCBtb3VudDIpCgogICAgbW91bnQzIDo9IHJlcGxhY2UobW91bnQyLCAiJChzYW5kYm94LWlkKSIsIHNhbmRib3hfaWQpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQzID0iLCBtb3VudDMpCgogICAgcmVnZXgubWF0Y2gobW91bnQzLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCgogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDM6IHRydWUiKQp9CmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAiYmluZCIKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNDogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNDogbW91bnQyID0iLCBtb3VudDIpCgogICAgbW91bnQzIDo9IHJlcGxhY2UobW91bnQyLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDQ6IG1vdW50MyA9IiwgbW91bnQzKQoKICAgIHJlZ2V4Lm1hdGNoKG1vdW50MywgaV9zdG9yYWdlLm1vdW50X3BvaW50KQoKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA0OiB0cnVlIikKfQphbGxvd19tb3VudF9wb2ludChwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgYnVuZGxlX2lkLCBzYW5kYm94X2lkLCBsYXllcl9pZHMpIHsKICAgIHBfc3RvcmFnZS5mc3R5cGUgPT0gInRtcGZzIgoKICAgIG1vdW50MSA6PSBwX3N0b3JhZ2UubW91bnRfcG9pbnQKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA1OiBtb3VudDEgPSIsIG1vdW50MSkKCiAgICByZWdleC5tYXRjaChtb3VudDEsIGlfc3RvcmFnZS5tb3VudF9wb2ludCkKCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNTogdHJ1ZSIpCn0KYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKSB7CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogaV9zdG9yYWdlLm1vdW50X3BvaW50ID0iLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCiAgICBhbGxvd19kaXJlY3Rfdm9sX2RyaXZlcihwX3N0b3JhZ2UsIGlfc3RvcmFnZSkKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChzcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQyID0iLCBtb3VudDIpCgogICAgZGlyZWN0X3ZvbF9wYXRoIDo9IGlfc3RvcmFnZS5zb3VyY2UKICAgIG1vdW50MyA6PSByZXBsYWNlKG1vdW50MiwgIiQoYjY0LWRpcmVjdC12b2wtcGF0aCkiLCBiYXNlNjR1cmwuZW5jb2RlKGRpcmVjdF92b2xfcGF0aCkpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQzID0iLCBtb3VudDMpCgogICAgbW91bnQzID09IGlfc3RvcmFnZS5tb3VudF9wb2ludAoKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA2OiB0cnVlIikKfQoKYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIocF9zdG9yYWdlLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19kaXJlY3Rfdm9sX2RyaXZlciAxOiBzdGFydCIpCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCiAgICBwcmludCgiYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIgMTogdHJ1ZSIpCn0KYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIocF9zdG9yYWdlLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19kaXJlY3Rfdm9sX2RyaXZlciAyOiBzdGFydCIpCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJzbWIiCiAgICBwcmludCgiYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIgMjogdHJ1ZSIpCn0KCiMgRXhlY1Byb2Nlc3NSZXF1ZXN0LnByb2Nlc3MuQ2FwYWJpbGl0aWVzCmFsbG93X2V4ZWNfY2FwcyhpX2NhcHMpIHsKICAgIG5vdCBpX2NhcHMuQW1iaWVudAogICAgbm90IGlfY2Fwcy5Cb3VuZGluZwogICAgbm90IGlfY2Fwcy5FZmZlY3RpdmUKICAgIG5vdCBpX2NhcHMuSW5oZXJpdGFibGUKICAgIG5vdCBpX2NhcHMuUGVybWl0dGVkCn0KCiMgT0NJLlByb2Nlc3MuQ2FwYWJpbGl0aWVzCmFsbG93X2NhcHMocF9jYXBzLCBpX2NhcHMpIHsKICAgIHByaW50KCJhbGxvd19jYXBzOiBwb2xpY3kgQW1iaWVudCA9IiwgcF9jYXBzLkFtYmllbnQpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgQW1iaWVudCA9IiwgaV9jYXBzLkFtYmllbnQpCiAgICBtYXRjaF9jYXBzKHBfY2Fwcy5BbWJpZW50LCBpX2NhcHMuQW1iaWVudCkKCiAgICBwcmludCgiYWxsb3dfY2FwczogcG9saWN5IEJvdW5kaW5nID0iLCBwX2NhcHMuQm91bmRpbmcpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgQm91bmRpbmcgPSIsIGlfY2Fwcy5Cb3VuZGluZykKICAgIG1hdGNoX2NhcHMocF9jYXBzLkJvdW5kaW5nLCBpX2NhcHMuQm91bmRpbmcpCgogICAgcHJpbnQoImFsbG93X2NhcHM6IHBvbGljeSBFZmZlY3RpdmUgPSIsIHBfY2Fwcy5FZmZlY3RpdmUpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgRWZmZWN0aXZlID0iLCBpX2NhcHMuRWZmZWN0aXZlKQogICAgbWF0Y2hfY2FwcyhwX2NhcHMuRWZmZWN0aXZlLCBpX2NhcHMuRWZmZWN0aXZlKQoKICAgIHByaW50KCJhbGxvd19jYXBzOiBwb2xpY3kgSW5oZXJpdGFibGUgPSIsIHBfY2Fwcy5Jbmhlcml0YWJsZSkKICAgIHByaW50KCJhbGxvd19jYXBzOiBpbnB1dCBJbmhlcml0YWJsZSA9IiwgaV9jYXBzLkluaGVyaXRhYmxlKQogICAgbWF0Y2hfY2FwcyhwX2NhcHMuSW5oZXJpdGFibGUsIGlfY2Fwcy5Jbmhlcml0YWJsZSkKCiAgICBwcmludCgiYWxsb3dfY2FwczogcG9saWN5IFBlcm1pdHRlZCA9IiwgcF9jYXBzLlBlcm1pdHRlZCkKICAgIHByaW50KCJhbGxvd19jYXBzOiBpbnB1dCBQZXJtaXR0ZWQgPSIsIGlfY2Fwcy5QZXJtaXR0ZWQpCiAgICBtYXRjaF9jYXBzKHBfY2Fwcy5QZXJtaXR0ZWQsIGlfY2Fwcy5QZXJtaXR0ZWQpCn0KCm1hdGNoX2NhcHMocF9jYXBzLCBpX2NhcHMpIHsKICAgIHByaW50KCJtYXRjaF9jYXBzIDE6IHN0YXJ0IikKCiAgICBwX2NhcHMgPT0gaV9jYXBzCgogICAgcHJpbnQoIm1hdGNoX2NhcHMgMTogdHJ1ZSIpCn0KbWF0Y2hfY2FwcyhwX2NhcHMsIGlfY2FwcykgewogICAgcHJpbnQoIm1hdGNoX2NhcHMgMjogc3RhcnQiKQoKICAgIGNvdW50KHBfY2FwcykgPT0gMQogICAgcF9jYXBzWzBdID09ICIkKGRlZmF1bHRfY2FwcykiCgogICAgcHJpbnQoIm1hdGNoX2NhcHMgMjogZGVmYXVsdF9jYXBzID0iLCBwb2xpY3lfZGF0YS5jb21tb24uZGVmYXVsdF9jYXBzKQogICAgcG9saWN5X2RhdGEuY29tbW9uLmRlZmF1bHRfY2FwcyA9PSBpX2NhcHMKCiAgICBwcmludCgibWF0Y2hfY2FwcyAyOiB0cnVlIikKfQptYXRjaF9jYXBzKHBfY2FwcywgaV9jYXBzKSB7CiAgICBwcmludCgibWF0Y2hfY2FwcyAzOiBzdGFydCIpCgogICAgY291bnQocF9jYXBzKSA9PSAxCiAgICBwX2NhcHNbMF0gPT0gIiQocHJpdmlsZWdlZF9jYXBzKSIKCiAgICBwcmludCgibWF0Y2hfY2FwcyAzOiBwcml2aWxlZ2VkX2NhcHMgPSIsIHBvbGljeV9kYXRhLmNvbW1vbi5wcml2aWxlZ2VkX2NhcHMpCiAgICBwb2xpY3lfZGF0YS5jb21tb24ucHJpdmlsZWdlZF9jYXBzID09IGlfY2FwcwoKICAgIHByaW50KCJtYXRjaF9jYXBzIDM6IHRydWUiKQp9CgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgpjaGVja19kaXJlY3RvcnlfdHJhdmVyc2FsKGlfcGF0aCkgewogICAgbm90IHJlZ2V4Lm1hdGNoKCIoXnwvKS4uKCR8LykiLCBpX3BhdGgpCn0KCmNoZWNrX3N5bWxpbmtfc291cmNlKGlfc3JjKSB7CiAgICBpX3NyYyA9PSAiIgogICAgcHJpbnQoImNoZWNrX3N5bWxpbmtfc291cmNlIDE6IHRydWUiKQp9CmNoZWNrX3N5bWxpbmtfc291cmNlKGlfc3JjKSB7CiAgICBpX3NyYyAhPSAiIgogICAgcHJpbnQoImNoZWNrX3N5bWxpbmtfc291cmNlIDI6IGlfc3JjID0iLCBpX3NyYykKCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24uc19zb3VyY2UxLCBpX3NyYykKCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMjogdHJ1ZSIpCn0KY2hlY2tfc3ltbGlua19zb3VyY2UoaV9zcmMpIHsKICAgIGlfc3JjICE9ICIiCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMzogaV9zcmMgPSIsIGlfc3JjKQoKICAgIHJlZ2V4Lm1hdGNoKHBvbGljeV9kYXRhLmNvbW1vbi5zX3NvdXJjZTIsIGlfc3JjKQogICAgY2hlY2tfZGlyZWN0b3J5X3RyYXZlcnNhbChpX3NyYykKCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMzogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfc3RvcmFnZXMoaV9zdG9yYWdlcykgewogICAgcHJpbnQoImFsbG93X3NhbmRib3hfc3RvcmFnZXM6IGlfc3RvcmFnZXMgPSIsIGlfc3RvcmFnZXMpCgogICAgcF9zdG9yYWdlcyA6PSBwb2xpY3lfZGF0YS5zYW5kYm94LnN0b3JhZ2VzCiAgICBldmVyeSBpX3N0b3JhZ2UgaW4gaV9zdG9yYWdlcyB7CiAgICAgICAgYWxsb3dfc2FuZGJveF9zdG9yYWdlKHBfc3RvcmFnZXMsIGlfc3RvcmFnZSkKICAgIH0KCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9zdG9yYWdlczogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfc3RvcmFnZShwX3N0b3JhZ2VzLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IGlfc3RvcmFnZSA9IiwgaV9zdG9yYWdlKQoKICAgIHNvbWUgcF9zdG9yYWdlIGluIHBfc3RvcmFnZXMKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IHBfc3RvcmFnZSA9IiwgcF9zdG9yYWdlKQogICAgaV9zdG9yYWdlID09IHBfc3RvcmFnZQoKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IHRydWUiKQp9CgpDb3B5RmlsZVJlcXVlc3QgewogICAgcHJpbnQoIkNvcHlGaWxlUmVxdWVzdDogaW5wdXQucGF0aCA9IiwgaW5wdXQucGF0aCkKCiAgICBjaGVja19zeW1saW5rX3NvdXJjZShpbnB1dC5zeW1saW5rX3NyYykKICAgIGNoZWNrX2RpcmVjdG9yeV90cmF2ZXJzYWwoaW5wdXQucGF0aCkKCiAgICBzb21lIHJlZ2V4MSBpbiBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLkNvcHlGaWxlUmVxdWVzdAogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5jcGF0aCkKICAgIHJlZ2V4NCA6PSByZXBsYWNlKHJlZ2V4MywgIiQoYnVuZGxlLWlkKSIsIEJVTkRMRV9JRCkKICAgIHByaW50KCJDb3B5RmlsZVJlcXVlc3Q6IHJlZ2V4NCA9IiwgcmVnZXg0KQoKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4NCwgaW5wdXQucGF0aCkKCiAgICBwcmludCgiQ29weUZpbGVSZXF1ZXN0OiB0cnVlIikKfQoKQ3JlYXRlU2FuZGJveFJlcXVlc3QgewogICAgcHJpbnQoIkNyZWF0ZVNhbmRib3hSZXF1ZXN0OiBpbnB1dC5ndWVzdF9ob29rX3BhdGggPSIsIGlucHV0Lmd1ZXN0X2hvb2tfcGF0aCkKICAgIGNvdW50KGlucHV0Lmd1ZXN0X2hvb2tfcGF0aCkgPT0gMAoKICAgIHByaW50KCJDcmVhdGVTYW5kYm94UmVxdWVzdDogaW5wdXQua2VybmVsX21vZHVsZXMgPSIsIGlucHV0Lmtlcm5lbF9tb2R1bGVzKQogICAgY291bnQoaW5wdXQua2VybmVsX21vZHVsZXMpID09IDAKCiAgICBpX3BpZG5zIDo9IGlucHV0LnNhbmRib3hfcGlkbnMKICAgIHByaW50KCJDcmVhdGVTYW5kYm94UmVxdWVzdDogaV9waWRucyA9IiwgaV9waWRucykKICAgIGlfcGlkbnMgPT0gZmFsc2UKICAgIGFsbG93X3NhbmRib3hfc3RvcmFnZXMoaW5wdXQuc3RvcmFnZXMpCn0KCmFsbG93X2V4ZWMocF9jb250YWluZXIsIGlfcHJvY2VzcykgewogICAgcHJpbnQoImFsbG93X2V4ZWM6IHN0YXJ0IikKCiAgICBwX29jaSA9IHBfY29udGFpbmVyLk9DSQogICAgcF9zX25hbWUgPSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc19uYW1lc3BhY2UgPSBnZXRfc3RhdGVfdmFsKCJuYW1lc3BhY2UiKQogICAgYWxsb3dfcHJvYmVfcHJvY2VzcyhwX29jaS5Qcm9jZXNzLCBpX3Byb2Nlc3MsIHBfc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfZXhlYzogdHJ1ZSIpCn0KCmFsbG93X2ludGVyYWN0aXZlX2V4ZWMocF9jb250YWluZXIsIGlfcHJvY2VzcykgewogICAgcHJpbnQoImFsbG93X2ludGVyYWN0aXZlX2V4ZWM6IHN0YXJ0IikKCiAgICBwX29jaSA9IHBfY29udGFpbmVyLk9DSQogICAgcF9zX25hbWUgPSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc19uYW1lc3BhY2UgPSBnZXRfc3RhdGVfdmFsKCJuYW1lc3BhY2UiKQogICAgYWxsb3dfaW50ZXJhY3RpdmVfcHJvY2VzcyhwX29jaS5Qcm9jZXNzLCBpX3Byb2Nlc3MsIHBfc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfaW50ZXJhY3RpdmVfZXhlYzogdHJ1ZSIpCn0KCiMgVE9ETzogc2hvdWxkIG90aGVyIEV4ZWNQcm9jZXNzUmVxdWVzdCBpbnB1dCBkYXRhIGZpZWxkcyBiZSB2YWxpZGF0ZWQgYXMgd2VsbD8KRXhlY1Byb2Nlc3NSZXF1ZXN0IHsKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMTogaW5wdXQgPSIsIGlucHV0KQoKICAgIHNvbWUgcF9jb21tYW5kIGluIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuRXhlY1Byb2Nlc3NSZXF1ZXN0LmFsbG93ZWRfY29tbWFuZHMKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMTogcF9jb21tYW5kID0iLCBwX2NvbW1hbmQpCiAgICBwX2NvbW1hbmQgPT0gaW5wdXQucHJvY2Vzcy5BcmdzCgogICAgIyBUT0RPOiBtYXRjaCBwX2NvbnRhaW5lcidzIElEIHdpdGggdGhlIGlucHV0IGNvbnRhaW5lcl9pZC4KICAgIHNvbWUgcF9jb250YWluZXIgaW4gcG9saWN5X2RhdGEuY29udGFpbmVycwogICAgYWxsb3dfaW50ZXJhY3RpdmVfZXhlYyhwX2NvbnRhaW5lciwgaW5wdXQucHJvY2VzcykKCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDE6IHRydWUiKQp9CkV4ZWNQcm9jZXNzUmVxdWVzdCB7CiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDI6IGlucHV0ID0iLCBpbnB1dCkKCiAgICAjIFRPRE86IG1hdGNoIGlucHV0IGNvbnRhaW5lciBJRCB3aXRoIGl0cyBjb3JyZXNwb25kaW5nIGNvbnRhaW5lci5leGVjX2NvbW1hbmRzLgogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBzb21lIHBfY29tbWFuZCBpbiBwX2NvbnRhaW5lci5leGVjX2NvbW1hbmRzCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDI6IHBfY29tbWFuZCA9IiwgcF9jb21tYW5kKQoKICAgICMgVE9ETzogc2hvdWxkIG90aGVyIGlucHV0IGRhdGEgZmllbGRzIGJlIHZhbGlkYXRlZCBhcyB3ZWxsPwogICAgcF9jb21tYW5kID09IGlucHV0LnByb2Nlc3MuQXJncwoKICAgIGFsbG93X2V4ZWMocF9jb250YWluZXIsIGlucHV0LnByb2Nlc3MpCgogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAyOiB0cnVlIikKfQpFeGVjUHJvY2Vzc1JlcXVlc3QgewogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAzOiBpbnB1dCA9IiwgaW5wdXQpCgogICAgaV9jb21tYW5kID0gY29uY2F0KCIgIiwgaW5wdXQucHJvY2Vzcy5BcmdzKQogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAzOiBpX2NvbW1hbmQgPSIsIGlfY29tbWFuZCkKCiAgICBzb21lIHBfcmVnZXggaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5FeGVjUHJvY2Vzc1JlcXVlc3QucmVnZXgKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMzogcF9yZWdleCA9IiwgcF9yZWdleCkKCiAgICByZWdleC5tYXRjaChwX3JlZ2V4LCBpX2NvbW1hbmQpCgogICAgIyBUT0RPOiBtYXRjaCBwX2NvbnRhaW5lcidzIElEIHdpdGggdGhlIGlucHV0IGNvbnRhaW5lcl9pZC4KICAgIHNvbWUgcF9jb250YWluZXIgaW4gcG9saWN5X2RhdGEuY29udGFpbmVycwogICAgYWxsb3dfaW50ZXJhY3RpdmVfZXhlYyhwX2NvbnRhaW5lciwgaW5wdXQucHJvY2VzcykKCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDM6IHRydWUiKQp9CgpVcGRhdGVSb3V0ZXNSZXF1ZXN0IHsKICAgIHByaW50KCJVcGRhdGVSb3V0ZXNSZXF1ZXN0OiBpbnB1dCA9IiwgaW5wdXQpCiAgICBwcmludCgiVXBkYXRlUm91dGVzUmVxdWVzdDogcG9saWN5ID0iLCBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLlVwZGF0ZVJvdXRlc1JlcXVlc3QpCgogICAgaV9yb3V0ZXMgOj0gaW5wdXQucm91dGVzLlJvdXRlcwogICAgcF9zb3VyY2VfcmVnZXggPSBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLlVwZGF0ZVJvdXRlc1JlcXVlc3QuZm9yYmlkZGVuX3NvdXJjZV9yZWdleAogICAgcF9uYW1lcyA9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuVXBkYXRlUm91dGVzUmVxdWVzdC5mb3JiaWRkZW5fZGV2aWNlX25hbWVzCgogICAgZXZlcnkgaV9yb3V0ZSBpbiBpX3JvdXRlcyB7CiAgICAgICAgcHJpbnQoImlfcm91dGUuc291cmNlID0iLCBpX3JvdXRlLnNvdXJjZSkKICAgICAgICBldmVyeSBwX3JlZ2V4IGluIHBfc291cmNlX3JlZ2V4IHsKICAgICAgICAgICAgcHJpbnQoInBfcmVnZXggPSIsIHBfcmVnZXgpCiAgICAgICAgICAgIG5vdCByZWdleC5tYXRjaChwX3JlZ2V4LCBpX3JvdXRlLnNvdXJjZSkKICAgICAgICB9CgogICAgICAgIHByaW50KCJpX3JvdXRlLmRldmljZSA9IiwgaV9yb3V0ZS5kZXZpY2UpCiAgICAgICAgbm90IGlfcm91dGUuZGV2aWNlIGluIHBfbmFtZXMKICAgIH0KCiAgICBwcmludCgiVXBkYXRlUm91dGVzUmVxdWVzdDogdHJ1ZSIpCn0KClVwZGF0ZUludGVyZmFjZVJlcXVlc3QgewogICAgcHJpbnQoIlVwZGF0ZUludGVyZmFjZVJlcXVlc3Q6IGlucHV0ID0iLCBpbnB1dCkKICAgIHByaW50KCJVcGRhdGVJbnRlcmZhY2VSZXF1ZXN0OiBwb2xpY3kgPSIsIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuVXBkYXRlSW50ZXJmYWNlUmVxdWVzdCkKCiAgICBpX2ludGVyZmFjZSA6PSBpbnB1dC5pbnRlcmZhY2UKICAgIHBfZmxhZ3MgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmFsbG93X3Jhd19mbGFncwoKICAgICMgVHlwaWNhbGx5LCBqdXN0IElGRl9OT0FSUCBpcyB1c2VkLgogICAgYml0cy5hbmQoaV9pbnRlcmZhY2UucmF3X2ZsYWdzLCBiaXRzLm5lZ2F0ZShwX2ZsYWdzKSkgPT0gMAoKICAgIHBfbmFtZXMgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmZvcmJpZGRlbl9uYW1lcwoKICAgIG5vdCBpX2ludGVyZmFjZS5uYW1lIGluIHBfbmFtZXMKCiAgICBwX2h3YWRkcnMgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmZvcmJpZGRlbl9od19hZGRycwoKICAgIG5vdCBpX2ludGVyZmFjZS5od0FkZHIgaW4gcF9od2FkZHJzCgogICAgcHJpbnQoIlVwZGF0ZUludGVyZmFjZVJlcXVlc3Q6IHRydWUiKQp9CgpDbG9zZVN0ZGluUmVxdWVzdCB7CiAgICBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLkNsb3NlU3RkaW5SZXF1ZXN0ID09IHRydWUKfQoKUmVhZFN0cmVhbVJlcXVlc3QgewogICAgcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5SZWFkU3RyZWFtUmVxdWVzdCA9PSB0cnVlCn0KClVwZGF0ZUVwaGVtZXJhbE1vdW50c1JlcXVlc3QgewogICAgcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVFcGhlbWVyYWxNb3VudHNSZXF1ZXN0ID09IHRydWUKfQoKV3JpdGVTdHJlYW1SZXF1ZXN0IHsKICAgIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuV3JpdGVTdHJlYW1SZXF1ZXN0ID09IHRydWUKfQoKcG9saWN5X2RhdGEgOj0gewogICJjb250YWluZXJzIjogWwogICAgewogICAgICAiT0NJIjogewogICAgICAgICJWZXJzaW9uIjogIjEuMS4wLXJjLjEiLAogICAgICAgICJQcm9jZXNzIjogewogICAgICAgICAgIlRlcm1pbmFsIjogZmFsc2UsCiAgICAgICAgICAiVXNlciI6IHsKICAgICAgICAgICAgIlVJRCI6IDY1NTM1LAogICAgICAgICAgICAiR0lEIjogNjU1MzUsCiAgICAgICAgICAgICJBZGRpdGlvbmFsR2lkcyI6IFtdLAogICAgICAgICAgICAiVXNlcm5hbWUiOiAiIgogICAgICAgICAgfSwKICAgICAgICAgICJEZXByZWNhdGVkQXJncyI6IFsKICAgICAgICAgICAgIi9wYXVzZSIKICAgICAgICAgIF0sCiAgICAgICAgICAiQXJncyI6IFsKICAgICAgICAgICAgIi9wYXVzZSIKICAgICAgICAgIF0sCiAgICAgICAgICAiRW52IjogWwogICAgICAgICAgICAiUEFUSD0vdXNyL2xvY2FsL3NiaW46L3Vzci9sb2NhbC9iaW46L3Vzci9zYmluOi91c3IvYmluOi9zYmluOi9iaW4iCiAgICAgICAgICBdLAogICAgICAgICAgIkN3ZCI6ICIvIiwKICAgICAgICAgICJDYXBhYmlsaXRpZXMiOiB7CiAgICAgICAgICAgICJBbWJpZW50IjogW10sCiAgICAgICAgICAgICJCb3VuZGluZyI6IFsKICAgICAgICAgICAgICAiJChkZWZhdWx0X2NhcHMpIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiRWZmZWN0aXZlIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJJbmhlcml0YWJsZSI6IFtdLAogICAgICAgICAgICAiUGVybWl0dGVkIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICAiTm9OZXdQcml2aWxlZ2VzIjogdHJ1ZQogICAgICAgIH0sCiAgICAgICAgIlJvb3QiOiB7CiAgICAgICAgICAiUGF0aCI6ICIkKGNwYXRoKS8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgIlJlYWRvbmx5IjogdHJ1ZQogICAgICAgIH0sCiAgICAgICAgIk1vdW50cyI6IFsKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9wcm9jIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJwcm9jIiwKICAgICAgICAgICAgInR5cGVfIjogInByb2MiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2IiwKICAgICAgICAgICAgInNvdXJjZSI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJzdHJpY3RhdGltZSIsCiAgICAgICAgICAgICAgIm1vZGU9NzU1IiwKICAgICAgICAgICAgICAic2l6ZT02NTUzNmsiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L3B0cyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiZGV2cHRzIiwKICAgICAgICAgICAgInR5cGVfIjogImRldnB0cyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJuZXdpbnN0YW5jZSIsCiAgICAgICAgICAgICAgInB0bXhtb2RlPTA2NjYiLAogICAgICAgICAgICAgICJtb2RlPTA2MjAiLAogICAgICAgICAgICAgICJnaWQ9NSIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvc2htIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L3NobSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi9tcXVldWUiLAogICAgICAgICAgICAic291cmNlIjogIm1xdWV1ZSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJtcXVldWUiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvc3lzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJzeXNmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJzeXNmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2V0Yy9yZXNvbHYuY29uZiIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClyZXNvbHYuY29uZiQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJvIiwKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9kZXYiLAogICAgICAgICAgICAgICJub2V4ZWMiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0KICAgICAgICBdLAogICAgICAgICJBbm5vdGF0aW9ucyI6IHsKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmJ1bmRsZV9wYXRoIjogIi9ydW4vY29udGFpbmVyZC9pby5jb250YWluZXJkLnJ1bnRpbWUudjIudGFzay9rOHMuaW8vJChidW5kbGUtaWQpIiwKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIjogInBvZF9zYW5kYm94IiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSI6ICJzYW5kYm94IiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWlkIjogIl5bYS16MC05XXs2NH0kIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWxvZy1kaXJlY3RvcnkiOiAiXi92YXIvbG9nL3BvZHMvJChzYW5kYm94LW5hbWVzcGFjZSlfJChzYW5kYm94LW5hbWUpX1swLTlhLWZdezh9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezEyfSQiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZSI6ICJeZG93bndhcmRcXC1hcGlcXC1hNDExZTI1M1xcLTVhOGVcXC00ZGZmXFwtYjA3NFxcLTkzODI3YjVjMzRjZiQiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZXNwYWNlIjogImRvd253YXJkLWFwaS02NjEwIiwKICAgICAgICAgICJuZXJkY3RsL25ldHdvcmstbmFtZXNwYWNlIjogIl4vdmFyL3J1bi9uZXRucy9jbmktWzAtOWEtZl17OH0tWzAtOWEtZl17NH0tWzAtOWEtZl17NH0tWzAtOWEtZl17NH0tWzAtOWEtZl17MTJ9JCIKICAgICAgICB9LAogICAgICAgICJMaW51eCI6IHsKICAgICAgICAgICJOYW1lc3BhY2VzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgIlR5cGUiOiAiaXBjIiwKICAgICAgICAgICAgICAiUGF0aCI6ICIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiVHlwZSI6ICJ1dHMiLAogICAgICAgICAgICAgICJQYXRoIjogIiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJUeXBlIjogIm1vdW50IiwKICAgICAgICAgICAgICAiUGF0aCI6ICIiCiAgICAgICAgICAgIH0KICAgICAgICAgIF0sCiAgICAgICAgICAiTWFza2VkUGF0aHMiOiBbCiAgICAgICAgICAgICIvcHJvYy9hY3BpIiwKICAgICAgICAgICAgIi9wcm9jL2Fzb3VuZCIsCiAgICAgICAgICAgICIvcHJvYy9rY29yZSIsCiAgICAgICAgICAgICIvcHJvYy9rZXlzIiwKICAgICAgICAgICAgIi9wcm9jL2xhdGVuY3lfc3RhdHMiLAogICAgICAgICAgICAiL3Byb2MvdGltZXJfbGlzdCIsCiAgICAgICAgICAgICIvcHJvYy90aW1lcl9zdGF0cyIsCiAgICAgICAgICAgICIvcHJvYy9zY2hlZF9kZWJ1ZyIsCiAgICAgICAgICAgICIvc3lzL2Zpcm13YXJlIiwKICAgICAgICAgICAgIi9wcm9jL3Njc2kiCiAgICAgICAgICBdLAogICAgICAgICAgIlJlYWRvbmx5UGF0aHMiOiBbCiAgICAgICAgICAgICIvcHJvYy9idXMiLAogICAgICAgICAgICAiL3Byb2MvZnMiLAogICAgICAgICAgICAiL3Byb2MvaXJxIiwKICAgICAgICAgICAgIi9wcm9jL3N5cyIsCiAgICAgICAgICAgICIvcHJvYy9zeXNycS10cmlnZ2VyIgogICAgICAgICAgXSwKICAgICAgICAgICJEZXZpY2VzIjogW10sCiAgICAgICAgICAiU3lzY3RsIjogewogICAgICAgICAgICAibmV0LmlwdjQuaXBfdW5wcml2aWxlZ2VkX3BvcnRfc3RhcnQiOiAiMCIsCiAgICAgICAgICAgICJuZXQuaXB2NC5waW5nX2dyb3VwX3JhbmdlIjogIjAgMjE0NzQ4MzY0NyIKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0sCiAgICAgICJzdG9yYWdlcyI6IFsKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoMCkiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXIwKSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogIm92ZXJsYXlmcyIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAiZnVzZTMua2F0YS1vdmVybGF5IiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiNWE1YWFkODAwNTVmZjIwMDEyYTUwZGMyNWY4ZGY3YTI5OTI0NDc0MzI0ZDY1ZjdkNTMwNmVlOGVlMjdmZjcxZCIsCiAgICAgICAgICAgICI4MTcyNTBmMWEzZTMzNmRhNzZmNWJkM2ZhNzg0ZTFiMjZkOTU5YjljMTMxODc2ODE1YmEyNjA0MDQ4YjcwYzE4IgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGNwYXRoKS8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0KICAgICAgXSwKICAgICAgImRldmljZXMiOiBbXSwKICAgICAgInNhbmRib3hfcGlkbnMiOiBmYWxzZSwKICAgICAgImV4ZWNfY29tbWFuZHMiOiBbXSwKICAgICAgImVudl9tYXAiOiB7CiAgICAgICAgIlBBVEgiOiAiL3Vzci9sb2NhbC9zYmluOi91c3IvbG9jYWwvYmluOi91c3Ivc2JpbjovdXNyL2Jpbjovc2JpbjovYmluIgogICAgICB9CiAgICB9LAogICAgewogICAgICAiT0NJIjogewogICAgICAgICJWZXJzaW9uIjogIjEuMS4wLXJjLjEiLAogICAgICAgICJQcm9jZXNzIjogewogICAgICAgICAgIlRlcm1pbmFsIjogZmFsc2UsCiAgICAgICAgICAiVXNlciI6IHsKICAgICAgICAgICAgIlVJRCI6IDAsCiAgICAgICAgICAgICJHSUQiOiAwLAogICAgICAgICAgICAiQWRkaXRpb25hbEdpZHMiOiBbXSwKICAgICAgICAgICAgIlVzZXJuYW1lIjogIiIKICAgICAgICAgIH0sCiAgICAgICAgICAiRGVwcmVjYXRlZEFyZ3MiOiBbCiAgICAgICAgICAgICJzaCIKICAgICAgICAgIF0sCiAgICAgICAgICAiQXJncyI6IFsKICAgICAgICAgICAgInNoIgogICAgICAgICAgXSwKICAgICAgICAgICJFbnYiOiBbCiAgICAgICAgICAgICJQQVRIPS91c3IvbG9jYWwvc2JpbjovdXNyL2xvY2FsL2JpbjovdXNyL3NiaW46L3Vzci9iaW46L3NiaW46L2JpbiIsCiAgICAgICAgICAgICJIT1NUTkFNRT0kKGhvc3QtbmFtZSkiLAogICAgICAgICAgICAiQ1BVX0xJTUlUPSQodmFsaWRhdGUtZnJvbS1zZXR0aW5ncykiLAogICAgICAgICAgICAiTUVNT1JZX0xJTUlUPSQodmFsaWRhdGUtZnJvbS1zZXR0aW5ncykiCiAgICAgICAgICBdLAogICAgICAgICAgIkN3ZCI6ICIvIiwKICAgICAgICAgICJDYXBhYmlsaXRpZXMiOiB7CiAgICAgICAgICAgICJBbWJpZW50IjogW10sCiAgICAgICAgICAgICJCb3VuZGluZyI6IFsKICAgICAgICAgICAgICAiJChkZWZhdWx0X2NhcHMpIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiRWZmZWN0aXZlIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJJbmhlcml0YWJsZSI6IFtdLAogICAgICAgICAgICAiUGVybWl0dGVkIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICAiTm9OZXdQcml2aWxlZ2VzIjogZmFsc2UKICAgICAgICB9LAogICAgICAgICJSb290IjogewogICAgICAgICAgIlBhdGgiOiAiJChjcGF0aCkvJChidW5kbGUtaWQpIiwKICAgICAgICAgICJSZWFkb25seSI6IGZhbHNlCiAgICAgICAgfSwKICAgICAgICAiTW91bnRzIjogWwogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL3Byb2MiLAogICAgICAgICAgICAic291cmNlIjogInByb2MiLAogICAgICAgICAgICAidHlwZV8iOiAicHJvYyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYiLAogICAgICAgICAgICAic291cmNlIjogInRtcGZzIiwKICAgICAgICAgICAgInR5cGVfIjogInRtcGZzIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgInN0cmljdGF0aW1lIiwKICAgICAgICAgICAgICAibW9kZT03NTUiLAogICAgICAgICAgICAgICJzaXplPTY1NTM2ayIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvcHRzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJkZXZwdHMiLAogICAgICAgICAgICAidHlwZV8iOiAiZGV2cHRzIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAgICAgIm5ld2luc3RhbmNlIiwKICAgICAgICAgICAgICAicHRteG1vZGU9MDY2NiIsCiAgICAgICAgICAgICAgIm1vZGU9MDYyMCIsCiAgICAgICAgICAgICAgImdpZD01IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi9zaG0iLAogICAgICAgICAgICAic291cmNlIjogIi9ydW4va2F0YS1jb250YWluZXJzL3NhbmRib3gvc2htIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L21xdWV1ZSIsCiAgICAgICAgICAgICJzb3VyY2UiOiAibXF1ZXVlIiwKICAgICAgICAgICAgInR5cGVfIjogIm1xdWV1ZSIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9zeXMiLAogICAgICAgICAgICAic291cmNlIjogInN5c2ZzIiwKICAgICAgICAgICAgInR5cGVfIjogInN5c2ZzIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAgICAgIm5vZGV2IiwKICAgICAgICAgICAgICAicm8iCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvc3lzL2ZzL2Nncm91cCIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiY2dyb3VwIiwKICAgICAgICAgICAgInR5cGVfIjogImNncm91cCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIsCiAgICAgICAgICAgICAgInJlbGF0aW1lIiwKICAgICAgICAgICAgICAicm8iCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZXRjL2hvc3RzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KWhvc3RzJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJydyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvdGVybWluYXRpb24tbG9nIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KXRlcm1pbmF0aW9uLWxvZyQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicnciCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZXRjL2hvc3RuYW1lIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KWhvc3RuYW1lJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJydyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9ldGMvcmVzb2x2LmNvbmYiLAogICAgICAgICAgICAic291cmNlIjogIiQoc2ZwcmVmaXgpcmVzb2x2LmNvbmYkIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJ3IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL3Zhci9ydW4vc2VjcmV0cy9rdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50IiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KXNlcnZpY2VhY2NvdW50JCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJybyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi92YXIvcnVuL3NlY3JldHMvYXp1cmUvdG9rZW5zIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KXRva2VucyQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicm8iCiAgICAgICAgICAgIF0KICAgICAgICAgIH0KICAgICAgICBdLAogICAgICAgICJBbm5vdGF0aW9ucyI6IHsKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmJ1bmRsZV9wYXRoIjogIi9ydW4vY29udGFpbmVyZC9pby5jb250YWluZXJkLnJ1bnRpbWUudjIudGFzay9rOHMuaW8vJChidW5kbGUtaWQpIiwKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIjogInBvZF9jb250YWluZXIiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLmNvbnRhaW5lci1uYW1lIjogImRhcGktY29udGFpbmVyIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSI6ICJjb250YWluZXIiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLmltYWdlLW5hbWUiOiAicmVnaXN0cnkuazhzLmlvL2UyZS10ZXN0LWltYWdlcy9idXN5Ym94OjEuMjktMiIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCI6ICJeW2EtejAtOV17NjR9JCIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1uYW1lIjogIl5kb3dud2FyZFxcLWFwaVxcLWE0MTFlMjUzXFwtNWE4ZVxcLTRkZmZcXC1iMDc0XFwtOTM4MjdiNWMzNGNmJCIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1uYW1lc3BhY2UiOiAiZG93bndhcmQtYXBpLTY2MTAiCiAgICAgICAgfSwKICAgICAgICAiTGludXgiOiB7CiAgICAgICAgICAiTmFtZXNwYWNlcyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICJUeXBlIjogImlwYyIsCiAgICAgICAgICAgICAgIlBhdGgiOiAiIgogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgIlR5cGUiOiAidXRzIiwKICAgICAgICAgICAgICAiUGF0aCI6ICIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiVHlwZSI6ICJtb3VudCIsCiAgICAgICAgICAgICAgIlBhdGgiOiAiIgogICAgICAgICAgICB9CiAgICAgICAgICBdLAogICAgICAgICAgIk1hc2tlZFBhdGhzIjogWwogICAgICAgICAgICAiL3Byb2MvYWNwaSIsCiAgICAgICAgICAgICIvcHJvYy9rY29yZSIsCiAgICAgICAgICAgICIvcHJvYy9rZXlzIiwKICAgICAgICAgICAgIi9wcm9jL2xhdGVuY3lfc3RhdHMiLAogICAgICAgICAgICAiL3Byb2MvdGltZXJfbGlzdCIsCiAgICAgICAgICAgICIvcHJvYy90aW1lcl9zdGF0cyIsCiAgICAgICAgICAgICIvcHJvYy9zY2hlZF9kZWJ1ZyIsCiAgICAgICAgICAgICIvcHJvYy9zY3NpIiwKICAgICAgICAgICAgIi9zeXMvZmlybXdhcmUiCiAgICAgICAgICBdLAogICAgICAgICAgIlJlYWRvbmx5UGF0aHMiOiBbCiAgICAgICAgICAgICIvcHJvYy9hc291bmQiLAogICAgICAgICAgICAiL3Byb2MvYnVzIiwKICAgICAgICAgICAgIi9wcm9jL2ZzIiwKICAgICAgICAgICAgIi9wcm9jL2lycSIsCiAgICAgICAgICAgICIvcHJvYy9zeXMiLAogICAgICAgICAgICAiL3Byb2Mvc3lzcnEtdHJpZ2dlciIKICAgICAgICAgIF0sCiAgICAgICAgICAiRGV2aWNlcyI6IFtdLAogICAgICAgICAgIlN5c2N0bCI6IHsKICAgICAgICAgICAgIm5ldC5pcHY0LmlwX3VucHJpdmlsZWdlZF9wb3J0X3N0YXJ0IjogIjAiLAogICAgICAgICAgICAibmV0LmlwdjQucGluZ19ncm91cF9yYW5nZSI6ICIwIDIxNDc0ODM2NDciCiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9LAogICAgICAic3RvcmFnZXMiOiBbCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJibGsiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogInRhciIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIiQoaGFzaDApIgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGxheWVyMCkiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJvdmVybGF5ZnMiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogImZ1c2UzLmthdGEtb3ZlcmxheSIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIjRkMDY1M2Y3YzdlM2Y0OWI0OTAwNmE5ZjRlODEzYWExMTY2YzUzMmEzNGE3NjUwYWZhNmZhYTUyMjZmMWVjNWYiLAogICAgICAgICAgICAiYmQ1YmIzODcwOWQyOTQzYTM2YTAyZTQ1NGUzNGQzZDZjYWEyMzg1ZmIxNDBkN2YxNzk3ZmQwYTI3YTkzN2RkYiIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChjcGF0aCkvJChidW5kbGUtaWQpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9CiAgICAgIF0sCiAgICAgICJkZXZpY2VzIjogW10sCiAgICAgICJzYW5kYm94X3BpZG5zIjogZmFsc2UsCiAgICAgICJleGVjX2NvbW1hbmRzIjogW10sCiAgICAgICJlbnZfbWFwIjogewogICAgICAgICJDUFVfTElNSVQiOiAiJCh2YWxpZGF0ZS1mcm9tLXNldHRpbmdzKSIsCiAgICAgICAgIkhPU1ROQU1FIjogIiQoaG9zdC1uYW1lKSIsCiAgICAgICAgIk1FTU9SWV9MSU1JVCI6ICIkKHZhbGlkYXRlLWZyb20tc2V0dGluZ3MpIiwKICAgICAgICAiUEFUSCI6ICIvdXNyL2xvY2FsL3NiaW46L3Vzci9sb2NhbC9iaW46L3Vzci9zYmluOi91c3IvYmluOi9zYmluOi9iaW4iCiAgICAgIH0KICAgIH0KICBdLAogICJjb21tb24iOiB7CiAgICAiY3BhdGgiOiAiL3J1bi9rYXRhLWNvbnRhaW5lcnMvc2hhcmVkL2NvbnRhaW5lcnMiLAogICAgIm1vdW50X3NvdXJjZV9jcGF0aCI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zaGFyZWQvY29udGFpbmVycyIsCiAgICAic2ZwcmVmaXgiOiAiXiQoY3BhdGgpLyQoYnVuZGxlLWlkKS1bYS16MC05XXsxNn0tIiwKICAgICJzcGF0aCI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L3N0b3JhZ2UiLAogICAgImlwdjRfYSI6ICIoKFswLTldfFsxLTldWzAtOV18MVswLTldezJ9fDJbMC00XVswLTldfDI1WzAtNV0pXFwuKXszfShbMC05XXxbMS05XVswLTldfDFbMC05XXsyfXwyWzAtNF1bMC05XXwyNVswLTVdKSIsCiAgICAiaXBfcCI6ICJbMC05XXsxLDV9IiwKICAgICJzdmNfbmFtZSI6ICJbQS1aX1xcLlxcLV0rIiwKICAgICJkbnNfbGFiZWwiOiAiW2EtekEtWjAtOV9cXC5cXC1dKyIsCiAgICAic19zb3VyY2UxIjogIl4uLjJbMC05XXszfV9bMC0xXVswLTldX1swLTNdWzAtOV1fWzAtMl1bMC05XV9bMC01XVswLTldX1swLTVdWzAtOV1cXC5bMC05XXsxLDEwfSQiLAogICAgInNfc291cmNlMiI6ICJeLi5kYXRhLyIsCiAgICAiZG5zX3N1YmRvbWFpbiI6ICJeW2EtejAtOV0oWy1hLXowLTldKlthLXowLTldKT8kIiwKICAgICJwb2RfdWlkIjogIl5bMC05YS1mQS1GXXs4fS1bMC05YS1mQS1GXXs0fS1bMC05YS1mQS1GXXs0fS1bMC05YS1mQS1GXXs0fS1bMC05YS1mQS1GXXsxMn0kIiwKICAgICJkZWZhdWx0X2NhcHMiOiBbCiAgICAgICJDQVBfQ0hPV04iLAogICAgICAiQ0FQX0RBQ19PVkVSUklERSIsCiAgICAgICJDQVBfRlNFVElEIiwKICAgICAgIkNBUF9GT1dORVIiLAogICAgICAiQ0FQX01LTk9EIiwKICAgICAgIkNBUF9ORVRfUkFXIiwKICAgICAgIkNBUF9TRVRHSUQiLAogICAgICAiQ0FQX1NFVFVJRCIsCiAgICAgICJDQVBfU0VURkNBUCIsCiAgICAgICJDQVBfU0VUUENBUCIsCiAgICAgICJDQVBfTkVUX0JJTkRfU0VSVklDRSIsCiAgICAgICJDQVBfU1lTX0NIUk9PVCIsCiAgICAgICJDQVBfS0lMTCIsCiAgICAgICJDQVBfQVVESVRfV1JJVEUiCiAgICBdLAogICAgInByaXZpbGVnZWRfY2FwcyI6IFsKICAgICAgIkNBUF9DSE9XTiIsCiAgICAgICJDQVBfREFDX09WRVJSSURFIiwKICAgICAgIkNBUF9EQUNfUkVBRF9TRUFSQ0giLAogICAgICAiQ0FQX0ZPV05FUiIsCiAgICAgICJDQVBfRlNFVElEIiwKICAgICAgIkNBUF9LSUxMIiwKICAgICAgIkNBUF9TRVRHSUQiLAogICAgICAiQ0FQX1NFVFVJRCIsCiAgICAgICJDQVBfU0VUUENBUCIsCiAgICAgICJDQVBfTElOVVhfSU1NVVRBQkxFIiwKICAgICAgIkNBUF9ORVRfQklORF9TRVJWSUNFIiwKICAgICAgIkNBUF9ORVRfQlJPQURDQVNUIiwKICAgICAgIkNBUF9ORVRfQURNSU4iLAogICAgICAiQ0FQX05FVF9SQVciLAogICAgICAiQ0FQX0lQQ19MT0NLIiwKICAgICAgIkNBUF9JUENfT1dORVIiLAogICAgICAiQ0FQX1NZU19NT0RVTEUiLAogICAgICAiQ0FQX1NZU19SQVdJTyIsCiAgICAgICJDQVBfU1lTX0NIUk9PVCIsCiAgICAgICJDQVBfU1lTX1BUUkFDRSIsCiAgICAgICJDQVBfU1lTX1BBQ0NUIiwKICAgICAgIkNBUF9TWVNfQURNSU4iLAogICAgICAiQ0FQX1NZU19CT09UIiwKICAgICAgIkNBUF9TWVNfTklDRSIsCiAgICAgICJDQVBfU1lTX1JFU09VUkNFIiwKICAgICAgIkNBUF9TWVNfVElNRSIsCiAgICAgICJDQVBfU1lTX1RUWV9DT05GSUciLAogICAgICAiQ0FQX01LTk9EIiwKICAgICAgIkNBUF9MRUFTRSIsCiAgICAgICJDQVBfQVVESVRfV1JJVEUiLAogICAgICAiQ0FQX0FVRElUX0NPTlRST0wiLAogICAgICAiQ0FQX1NFVEZDQVAiLAogICAgICAiQ0FQX01BQ19PVkVSUklERSIsCiAgICAgICJDQVBfTUFDX0FETUlOIiwKICAgICAgIkNBUF9TWVNMT0ciLAogICAgICAiQ0FQX1dBS0VfQUxBUk0iLAogICAgICAiQ0FQX0JMT0NLX1NVU1BFTkQiLAogICAgICAiQ0FQX0FVRElUX1JFQUQiLAogICAgICAiQ0FQX1BFUkZNT04iLAogICAgICAiQ0FQX0JQRiIsCiAgICAgICJDQVBfQ0hFQ0tQT0lOVF9SRVNUT1JFIgogICAgXSwKICAgICJ2aXJ0aW9fYmxrX3N0b3JhZ2VfY2xhc3NlcyI6IFsKICAgICAgImNjLWxvY2FsLWNzaSIsCiAgICAgICJjYy1tYW5hZ2VkLWNzaSIsCiAgICAgICJjYy1tYW5hZ2VkLXByZW1pdW0tY3NpIgogICAgXSwKICAgICJzbWJfc3RvcmFnZV9jbGFzc2VzIjogWwogICAgICB7CiAgICAgICAgIm5hbWUiOiAiYXp1cmVmaWxlLWNzaS1rYXRhLWNjIiwKICAgICAgICAibW91bnRfb3B0aW9ucyI6IFsKICAgICAgICAgICJkaXJfbW9kZT0wNzc3IiwKICAgICAgICAgICJmaWxlX21vZGU9MDc3NyIsCiAgICAgICAgICAibWZzeW1saW5rcyIsCiAgICAgICAgICAiY2FjaGU9c3RyaWN0IiwKICAgICAgICAgICJub3NoYXJlc29jayIsCiAgICAgICAgICAiYWN0aW1lbz0zMCIsCiAgICAgICAgICAibm9icmwiCiAgICAgICAgXQogICAgICB9CiAgICBdCiAgfSwKICAic2FuZGJveCI6IHsKICAgICJzdG9yYWdlcyI6IFsKICAgICAgewogICAgICAgICJkcml2ZXIiOiAiZXBoZW1lcmFsIiwKICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAic291cmNlIjogInNobSIsCiAgICAgICAgImZzdHlwZSI6ICJ0bXBmcyIsCiAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgIm5vZGV2IiwKICAgICAgICAgICJtb2RlPTE3NzciLAogICAgICAgICAgInNpemU9NjcxMDg4NjQiCiAgICAgICAgXSwKICAgICAgICAibW91bnRfcG9pbnQiOiAiL3J1bi9rYXRhLWNvbnRhaW5lcnMvc2FuZGJveC9zaG0iLAogICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgfQogICAgXQogIH0sCiAgInJlcXVlc3RfZGVmYXVsdHMiOiB7CiAgICAiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdCI6IHsKICAgICAgImFsbG93X2Vudl9yZWdleCI6IFsKICAgICAgICAiXkhPU1ROQU1FPSQoZG5zX2xhYmVsKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfUE9SVF8kKGlwX3ApX1RDUD10Y3A6Ly8kKGlwdjRfYSk6JChpcF9wKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfUE9SVF8kKGlwX3ApX1RDUF9QUk9UTz10Y3AkIiwKICAgICAgICAiXiQoc3ZjX25hbWUpX1BPUlRfJChpcF9wKV9UQ1BfUE9SVD0kKGlwX3ApJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9QT1JUXyQoaXBfcClfVENQX0FERFI9JChpcHY0X2EpJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9TRVJWSUNFX0hPU1Q9JChpcHY0X2EpJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9TRVJWSUNFX1BPUlQ9JChpcF9wKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfU0VSVklDRV9QT1JUXyQoZG5zX2xhYmVsKT0kKGlwX3ApJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9QT1JUPXRjcDovLyQoaXB2NF9hKTokKGlwX3ApJCIsCiAgICAgICAgIl5BWlVSRV9DTElFTlRfSUQ9W0EtRmEtZjAtOS1dKiQiLAogICAgICAgICJeQVpVUkVfVEVOQU5UX0lEPVtBLUZhLWYwLTktXSokIiwKICAgICAgICAiXkFaVVJFX0ZFREVSQVRFRF9UT0tFTl9GSUxFPS92YXIvcnVuL3NlY3JldHMvYXp1cmUvdG9rZW5zL2F6dXJlLWlkZW50aXR5LXRva2VuJCIsCiAgICAgICAgIl5BWlVSRV9BVVRIT1JJVFlfSE9TVD1odHRwczovL2xvZ2luXFwubWljcm9zb2Z0b25saW5lXFwuY29tLyQiLAogICAgICAgICJeVEVSTT14dGVybSQiCiAgICAgIF0sCiAgICAgICJhbGxvd19lbnZfcmVnZXhfbWFwIjogewogICAgICAgICJDUFVfTElNSVQiOiAiXlswLTldKyQiLAogICAgICAgICJKT0JfQ09NUExFVElPTl9JTkRFWCI6ICJeWzAtOV0qJCIsCiAgICAgICAgIk1FTU9SWV9MSU1JVCI6ICJeWzAtOV0rJCIKICAgICAgfQogICAgfSwKICAgICJDb3B5RmlsZVJlcXVlc3QiOiBbCiAgICAgICIkKHNmcHJlZml4KSIKICAgIF0sCiAgICAiRXhlY1Byb2Nlc3NSZXF1ZXN0IjogewogICAgICAiYWxsb3dlZF9jb21tYW5kcyI6IFtdLAogICAgICAicmVnZXgiOiBbXQogICAgfSwKICAgICJVcGRhdGVSb3V0ZXNSZXF1ZXN0IjogewogICAgICAiZm9yYmlkZGVuX2RldmljZV9uYW1lcyI6IFsKICAgICAgICAibG8iCiAgICAgIF0sCiAgICAgICJmb3JiaWRkZW5fc291cmNlX3JlZ2V4IjogWwogICAgICAgICJeKD86MHswLDR9Oil7MCw3fTB7MCwzfTEkIiwKICAgICAgICAiXjEyN1xcLig/OlswLTldezEsM31cXC4pezJ9WzAtOV17MSwzfSQiCiAgICAgIF0KICAgIH0sCiAgICAiVXBkYXRlSW50ZXJmYWNlUmVxdWVzdCI6IHsKICAgICAgImFsbG93X3Jhd19mbGFncyI6IDEyOCwKICAgICAgImZvcmJpZGRlbl9uYW1lcyI6IFsKICAgICAgICAibG8iCiAgICAgIF0sCiAgICAgICJmb3JiaWRkZW5faHdfYWRkcnMiOiBbCiAgICAgICAgIjAwOjAwOjAwOjAwOjAwOjAwIgogICAgICBdCiAgICB9LAogICAgIkNsb3NlU3RkaW5SZXF1ZXN0IjogZmFsc2UsCiAgICAiUmVhZFN0cmVhbVJlcXVlc3QiOiBmYWxzZSwKICAgICJVcGRhdGVFcGhlbWVyYWxNb3VudHNSZXF1ZXN0IjogZmFsc2UsCiAgICAiV3JpdGVTdHJlYW1SZXF1ZXN0IjogZmFsc2UKICB9Cn0= +spec: + containers: + - command: + - sh + env: + - name: CPU_LIMIT + valueFrom: + resourceFieldRef: + divisor: "0" + resource: limits.cpu + - name: MEMORY_LIMIT + valueFrom: + resourceFieldRef: + divisor: "0" + resource: limits.memory + image: "registry.k8s.io/e2e-test-images/busybox:1.29-2" + imagePullPolicy: IfNotPresent + name: dapi-container + resources: {} + terminationMessagePath: /dev/termination-log + terminationMessagePolicy: File + volumeMounts: + - mountPath: /var/run/secrets/kubernetes.io/serviceaccount + name: kube-api-access-lcdcx + readOnly: true + dnsPolicy: ClusterFirst + enableServiceLinks: true + preemptionPolicy: PreemptLowerPriority + priority: 0 + restartPolicy: Never + runtimeClassName: kata-cc + schedulerName: default-scheduler + securityContext: {} + serviceAccount: default + serviceAccountName: default + terminationGracePeriodSeconds: 30 + tolerations: + - effect: NoExecute + key: node.kubernetes.io/not-ready + operator: Exists + tolerationSeconds: 300 + - effect: NoExecute + key: node.kubernetes.io/unreachable + operator: Exists + tolerationSeconds: 300 + volumes: + - name: kube-api-access-lcdcx + projected: + defaultMode: 420 + sources: + - serviceAccountToken: + expirationSeconds: 3607 + path: token + - configMap: + items: + - key: ca.crt + path: ca.crt + name: kube-root-ca.crt + - downwardAPI: + items: + - fieldRef: + apiVersion: v1 + fieldPath: metadata.namespace + path: namespace +status: {} diff --git a/src/agent/samples/policy/yaml/webhook2/webhook-pod9.yaml b/src/agent/samples/policy/yaml/webhook2/webhook-pod9.yaml new file mode 100644 index 000000000000..1f4d92b68604 --- /dev/null +++ b/src/agent/samples/policy/yaml/webhook2/webhook-pod9.yaml @@ -0,0 +1,114 @@ +--- +apiVersion: v1 +kind: Namespace +metadata: + name: configmap-7431 +--- +apiVersion: v1 +kind: ConfigMap +metadata: + name: configmap-test-f61a3180-8242-43d0-be72-659de4f65498 + namespace: configmap-7431 +data: + data-1: value1 +--- +apiVersion: v1 +kind: Pod +metadata: + creationTimestamp: ~ + managedFields: + - apiVersion: v1 + fieldsType: FieldsV1 + fieldsV1: + "f:spec": + "f:containers": + "k:{\"name\":\"env-test\"}": + ".": {} + "f:command": {} + "f:env": + ".": {} + "k:{\"name\":\"CONFIG_DATA_1\"}": + ".": {} + "f:name": {} + "f:valueFrom": + ".": {} + "f:configMapKeyRef": {} + "f:image": {} + "f:imagePullPolicy": {} + "f:name": {} + "f:resources": {} + "f:terminationMessagePath": {} + "f:terminationMessagePolicy": {} + "f:dnsPolicy": {} + "f:enableServiceLinks": {} + "f:restartPolicy": {} + "f:schedulerName": {} + "f:securityContext": {} + "f:terminationGracePeriodSeconds": {} + manager: e2e.test + operation: Update + time: "2023-06-20T21:24:59Z" + name: pod-configmaps-d11bf824-62d2-45b5-a372-042b7e615aae + namespace: configmap-7431 + annotations: + io.katacontainers.config.agent.policy: IyBDb3B5cmlnaHQgKGMpIDIwMjMgTWljcm9zb2Z0IENvcnBvcmF0aW9uCiMKIyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMAojCnBhY2thZ2UgYWdlbnRfcG9saWN5CgppbXBvcnQgZnV0dXJlLmtleXdvcmRzLmluCmltcG9ydCBmdXR1cmUua2V5d29yZHMuZXZlcnkKCiMgRGVmYXVsdCB2YWx1ZXMsIHJldHVybmVkIGJ5IE9QQSB3aGVuIHJ1bGVzIGNhbm5vdCBiZSBldmFsdWF0ZWQgdG8gdHJ1ZS4KZGVmYXVsdCBBZGRBUlBOZWlnaGJvcnNSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgQWRkU3dhcFJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBDbG9zZVN0ZGluUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IENvcHlGaWxlUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IENyZWF0ZUNvbnRhaW5lclJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBDcmVhdGVTYW5kYm94UmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IERlc3Ryb3lTYW5kYm94UmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgRXhlY1Byb2Nlc3NSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgR2V0T09NRXZlbnRSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBHdWVzdERldGFpbHNSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBMaXN0SW50ZXJmYWNlc1JlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBMaXN0Um91dGVzUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IE1lbUhvdHBsdWdCeVByb2JlUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IE9ubGluZUNQVU1lbVJlcXVlc3QgOj0gdHJ1ZQpkZWZhdWx0IFBhdXNlQ29udGFpbmVyUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFJlYWRTdHJlYW1SZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgUmVtb3ZlQ29udGFpbmVyUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgUmVtb3ZlU3RhbGVWaXJ0aW9mc1NoYXJlTW91bnRzUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgUmVzZWVkUmFuZG9tRGV2UmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFJlc3VtZUNvbnRhaW5lclJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBTZXRHdWVzdERhdGVUaW1lUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFNldFBvbGljeVJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBTaWduYWxQcm9jZXNzUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgU3RhcnRDb250YWluZXJSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBTdGFydFRyYWNpbmdSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgU3RhdHNDb250YWluZXJSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBTdG9wVHJhY2luZ1JlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBUdHlXaW5SZXNpemVSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBVcGRhdGVDb250YWluZXJSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgVXBkYXRlRXBoZW1lcmFsTW91bnRzUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFVwZGF0ZUludGVyZmFjZVJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBVcGRhdGVSb3V0ZXNSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgV2FpdFByb2Nlc3NSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBXcml0ZVN0cmVhbVJlcXVlc3QgOj0gZmFsc2UKCiMgQWxsb3dSZXF1ZXN0c0ZhaWxpbmdQb2xpY3kgOj0gdHJ1ZSBjb25maWd1cmVzIHRoZSBBZ2VudCB0byAqYWxsb3cgYW55CiMgcmVxdWVzdHMgY2F1c2luZyBhIHBvbGljeSBmYWlsdXJlKi4gVGhpcyBpcyBhbiB1bnNlY3VyZSBjb25maWd1cmF0aW9uCiMgYnV0IGlzIHVzZWZ1bCBmb3IgYWxsb3dpbmcgdW5zZWN1cmUgcG9kcyB0byBzdGFydCwgdGhlbiBjb25uZWN0IHRvCiMgdGhlbSBhbmQgaW5zcGVjdCBPUEEgbG9ncyBmb3IgdGhlIHJvb3QgY2F1c2Ugb2YgYSBmYWlsdXJlLgpkZWZhdWx0IEFsbG93UmVxdWVzdHNGYWlsaW5nUG9saWN5IDo9IGZhbHNlCgojIENvbnN0YW50cwpTX05BTUVfS0VZID0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZSIKU19OQU1FU1BBQ0VfS0VZID0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZXNwYWNlIgpCVU5ETEVfSUQgPSAiW2EtejAtOV17NjR9IgoKQ3JlYXRlQ29udGFpbmVyUmVxdWVzdDo9IHJlc3AgewogICAgbm90IGlzX251bGwoaW5wdXQuZW52X21hcCkKICAgIAogICAgaV9lbnZfbWFwIDo9IGlucHV0LmVudl9tYXAKICAgIAogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBwX2Vudl9tYXAgOj0gcF9jb250YWluZXIuZW52X21hcCAgCiAgICBhbGxvd19lbnZfbWFwKHBfZW52X21hcCwgaV9lbnZfbWFwKQogICAgCiAgICBpX3Byb2Nlc3MgOj0gaW5wdXQuYmFzZS5PQ0kuUHJvY2VzcwogICAgCiAgICBwX3Byb2Nlc3MgOj0gcF9jb250YWluZXIuT0NJLlByb2Nlc3MKICAgIAogICAgYWxsb3dfYXJncyhpX3Byb2Nlc3MsIHBfcHJvY2VzcywgaV9lbnZfbWFwKQoKICAgIHJlc3AgPSBDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uKGlucHV0LmJhc2UpCiAgICBwcmludCgiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdDogdHJ1ZSIpCn0KCmFsbG93X2FyZ3MoaV9wcm9jZXNzLCBwX3Byb2Nlc3MsIGlfZW52X21hcCkgewogICAgaV9hcmdzIDo9IGlfcHJvY2Vzcy5BcmdzCiAgICBwX2FyZ3MgOj0gcF9wcm9jZXNzLkFyZ3MKICAgIHByaW50KCJhbGxvd19hcmdzOiBpX2FyZ3MgPSIsIGlfYXJncywgInBfYXJncyA9IiwgcF9hcmdzKQogICAgY291bnQoaV9hcmdzKSA9PSBjb3VudChwX2FyZ3MpCiAgICBldmVyeSBpLCBpX2FyZyBpbiBpX2FyZ3MgewogICAgICAgIHByaW50KCJhbGxvd19hcmdzOiBpX2FyZyA9IiwgaV9hcmcpCiAgICAgICAgcF9hcmdfcmVwbGFjZWQgOj0gcmVwbGFjZV9lbnZfdmFyaWFibGVzKHBfYXJnc1tpXSwgaV9lbnZfbWFwKQogICAgICAgIHByaW50KCJhbGxvd19hcmdzOiBwX2FyZ19yZXBsYWNlZCA9IiwgcF9hcmdfcmVwbGFjZWQpCiAgICAgICAgcF9hcmdfcmVwbGFjZWQyIDo9IHJlcGxhY2UocF9hcmdfcmVwbGFjZWQsICIkJCIsICIkIikKICAgICAgICBwcmludCgiYWxsb3dfYXJnczogcF9hcmdfcmVwbGFjZWQyID0iLCBwX2FyZ19yZXBsYWNlZDIpCiAgICAgICAgaV9hcmcgPT0gcF9hcmdfcmVwbGFjZWQyCiAgICB9CiAgICBwcmludCgiYWxsb3dfYXJnczogdHJ1ZSIpCn0KCmFsbG93X2FyZ3MoaV9wcm9jZXNzLCBwX3Byb2Nlc3MsIGlfZW52X21hcCkgewogICAgbm90IGlfcHJvY2Vzcy5BcmdzCiAgICBub3QgcF9wcm9jZXNzLkFyZ3MKICAgIHByaW50KCJhbGxvd19hcmdzMjogbm8gYXJncyIpCn0KCiMgdGhpcyBmdW5jdGlvbiByZXBsYWNlcyBhbGwgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyBpbiBhIHN0cmluZywgZ2l2ZW4gYSBtYXAgb2YgZW52aXJvbm1lbnQga2V5cyB0byBlbnZpcm9ubWVudCB2YWx1ZXMKIyBlZyBzdHIgPSAiZWNobyAkKENMVVNURVJfSUQpOyBlY2hvICQoTk9ERV9OQU1FKTsiCiMgZW52X21hcCA9IHsiQ0xVU1RFUl9JRCI6ICJhYmMiLCAiTk9ERV9OQU1FIiA6ICJ4eXoifQojIHJlc3VsdCA9ICJlY2hvIGFiYzsgZWNobyB4eXo7IgpyZXBsYWNlX2Vudl92YXJpYWJsZXMoc3RyLCBlbnZfbWFwKSA9IHJlc3VsdCB7CiAgICAjIG1ha2UgYW4gYXJyYXkgb2YgdGhlIGtleXMgZWcgWyJDTFVTVEVSX0lEIiwgIk5PREVfTkFNRSJdCiAgICBrZXlzIDo9IFt4IHwgc29tZSB4IGluIG9iamVjdC5rZXlzKGVudl9tYXApXQogICAgcmVzdWx0IDo9IHJlcGxhY2Vfc3RyX3JlYyhzdHIsIGVudl9tYXAsIGtleXMsIGNvdW50KGtleXMpIC0gMSkKfQoKIyBiYXNlIGNhc2UKcmVwbGFjZV9zdHJfcmVjKHN0ciwgZW52X21hcCwgYXJyX2tleXMsIGkpID0gcmVzdWx0IHsKICAgIGkgPCAwCiAgICByZXN1bHQgOj0gc3RyCn0KCiMgcmVjdXJzaXZlIHN0ZXAKcmVwbGFjZV9zdHJfcmVjKHN0ciwgZW52X21hcCwgYXJyX2tleXMsIGkpID0gcmVzdWx0IHsKICAgIGkgPj0gMAogICAga2V5IDo9IGFycl9rZXlzW2ldCiAgICBlbnZfa2V5MSA6PSBjb25jYXQoIiIsIFsiJCgiLCBrZXksICIpIl0pCiAgICAjIHJlcGxhY2UgJChWQVIpIHdpdGggdmFsdWUKICAgIG5ld19zdHIxIDo9IHJlcGxhY2Uoc3RyLCBlbnZfa2V5MSwgZW52X21hcFtrZXldKQogICAgIyByZXBsYWNlIG5leHQgZW52aXJvbm1lbnQgdmFyaWFibGUKICAgIHJlc3VsdCA9IHJlcGxhY2Vfc3RyX3JlYyhuZXdfc3RyMSwgZW52X21hcCwgYXJyX2tleXMsIGkgLSAxKQp9CgphbGxvd19lbnZfbWFwKHBfZW52X21hcCwgaV9lbnZfbWFwKSB7CiAgICBwcmludCgiYWxsb3dfZW52X21hcDogcF9lbnZfbWFwID0iLCBwX2Vudl9tYXApCiAgICBldmVyeSBlbnZfa2V5LCBlbnZfdmFsIGluIGlfZW52X21hcCB7CiAgICAgICAgcHJpbnQoImFsbG93X2VudjogZW52X2tleSA9IiwgZW52X2tleSwgImVudl92YWwgPSIsIGVudl92YWwpCiAgICAgICAgYWxsb3dfZW52X21hcF9lbnRyeShlbnZfa2V5LCBlbnZfdmFsLCBwX2Vudl9tYXApCiAgICB9CiAgICBwcmludCgiYWxsb3dfZW52X21hcDogdHJ1ZSIpCn0KCiMgQWxsb3cgZXhhY3QgbWF0Y2gKYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBpX3ZhbCA9PSBwX3ZhbAogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnk6IHRydWUiKQp9CgojIEFsbG93IHJlc291cmNlRmllbGRSZWYgdmFsdWVzIChlLmcuLCAibGltaXRzLmNwdSIpLgphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgICMgYSB2YXJpYWJsZSB3ZSBzaG91bGQgYmUgdmFsaWRhdGluZyB1c2luZyBhIHJlZ2V4IGZyb20gc2V0dGluZ3MKICAgIHBfdmFsID09ICIkKHZhbGlkYXRlLWZyb20tc2V0dGluZ3MpIgogICAgcmVnZXhfdmFsIDo9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuQ3JlYXRlQ29udGFpbmVyUmVxdWVzdC5hbGxvd19lbnZfcmVnZXhfbWFwW2tleV0KICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4X3ZhbCwgaV92YWwpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSAyOiB0cnVlIikKfQoKIyBBbGxvdyBub2RlLW5hbWUKYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChub2RlLW5hbWUpIgogICAgcmVnZXgubWF0Y2gocG9saWN5X2RhdGEuY29tbW9uLmRuc19zdWJkb21haW4gLCBpX3ZhbCkKICAgIHByaW50KCJhbGxvd19lbnZfbWFwX2VudHJ5IDM6IHRydWUiKQp9CgojIEFsbG93IGhvc3QtbmFtZQphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgIHBfdmFsID09ICIkKGhvc3QtbmFtZSkiCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24uZG5zX2xhYmVsICwgaV92YWwpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSA0OiB0cnVlIikKfQoKIyBBbGxvdyBwb2QtdWlkCmFsbG93X2Vudl9tYXBfZW50cnkoa2V5LCBpX3ZhbCwgcF9lbnZfbWFwKSB7CiAgICBwX3ZhbCA6PSBwX2Vudl9tYXBba2V5XQogICAgcF92YWwgPT0gIiQocG9kLXVpZCkiCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24ucG9kX3VpZCAsIGlfdmFsKQogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgNTogdHJ1ZSIpCn0KCiMgQWxsb3cgZmllbGRSZWYgImZpZWxkUGF0aDogc3RhdHVzLnBvZElQIiB2YWx1ZXMuCmFsbG93X2Vudl9tYXBfZW50cnkoa2V5LCBpX3ZhbCwgcF9lbnZfbWFwKSB7CiAgICBpc19pcChpX3ZhbCkKCiAgICBwX3ZhbCA6PSBwX2Vudl9tYXBba2V5XQogICAgcF92YXIgOj0gY29uY2F0KCI9IiwgW2tleSwgcF92YWxdKQogICAgYWxsb3dfcG9kX2lwX3ZhcihrZXksIHBfdmFyKQogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgNjogdHJ1ZSIpCn0KCiMgQWxsb3cgZmllbGRSZWYgImZpZWxkUGF0aDogc3RhdHVzLmhvc3RJUCIgdmFsdWVzLgphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgaXNfaXAoaV92YWwpCgogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgIHBfdmFyIDo9IGNvbmNhdCgiPSIsIFtrZXksIHBfdmFsXSkKICAgIGFsbG93X2hvc3RfaXBfdmFyKGtleSwgcF92YXIpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSA3OiB0cnVlIikKfQoKIyBNYXRjaCBpbnB1dCB3aXRoIG9uZSBvZiB0aGUgcG9saWN5IHZhcmlhYmxlcywgYWZ0ZXIgc3Vic3RpdHV0aW5nICQoc2FuZGJveC1uYW1lKS4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChzYW5kYm94LW5hbWUpIgogICAgc19uYW1lIDo9IGlucHV0LmJhc2UuT0NJLkFubm90YXRpb25zW1NfTkFNRV9LRVldCiAgICBwX3ZhcjIgOj0gcmVwbGFjZShwX3ZhbCwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHBfdmFyMiA9PSBpX3ZhbAogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgODogdHJ1ZSIpCn0KCiMgTWF0Y2ggaW5wdXQgd2l0aCBvbmUgb2YgdGhlIHBvbGljeSB2YXJpYWJsZXMsIGFmdGVyIHN1YnN0aXR1dGluZyAkKHNhbmRib3gtbmFtZXNwYWNlKS4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChzYW5kYm94LW5hbWVzcGFjZSkiCiAgICBzX25hbWVzcGFjZSA6PSBpbnB1dC5iYXNlLk9DSS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwX3ZhcjIgOj0gcmVwbGFjZShwX3ZhbCwgIiQoc2FuZGJveC1uYW1lc3BhY2UpIiwgc19uYW1lc3BhY2UpCiAgICBwX3ZhcjIgPT0gaV92YWwKICAgIHByaW50KCJhbGxvd19lbnZfbWFwX2VudHJ5IDk6IHRydWUiKQp9CgojIEFsbG93IGlucHV0IGVudiB2YXJpYWJsZXMgdGhhdCBtYXRjaCB3aXRoIGEgcmVxdWVzdF9kZWZhdWx0cyByZWdleC4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHNvbWUgcF9yZWdleDEgaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5DcmVhdGVDb250YWluZXJSZXF1ZXN0LmFsbG93X2Vudl9yZWdleAogICAgcF9yZWdleDIgOj0gcmVwbGFjZShwX3JlZ2V4MSwgIiQoaXB2NF9hKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcHY0X2EpCiAgICBwX3JlZ2V4MyA6PSByZXBsYWNlKHBfcmVnZXgyLCAiJChpcF9wKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcF9wKQogICAgcF9yZWdleDQgOj0gcmVwbGFjZShwX3JlZ2V4MywgIiQoc3ZjX25hbWUpIiwgcG9saWN5X2RhdGEuY29tbW9uLnN2Y19uYW1lKQogICAgcF9yZWdleDUgOj0gcmVwbGFjZShwX3JlZ2V4NCwgIiQoZG5zX2xhYmVsKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5kbnNfbGFiZWwpCgogICAgcmVzdWx0IDo9IGNvbmNhdCgiPSIsIFtrZXksIGlfdmFsXSkKICAgIHJlZ2V4Lm1hdGNoKHBfcmVnZXg1LCByZXN1bHQpCgogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgMTA6IHRydWUiKQp9CgpDcmVhdGVDb250YWluZXJSZXF1ZXN0Oj0gcmVzcCB7CiAgICBub3QgaW5wdXQuZW52X21hcAogICAgaV9wcm9jZXNzID0gaW5wdXQuT0NJLlByb2Nlc3MKICAgIHNfbmFtZSA9IGlucHV0Lk9DSS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBwX3Byb2Nlc3MgPSBwX2NvbnRhaW5lci5PQ0kuUHJvY2VzcwogICAgYWxsb3dfZGVwcmVjYXRlZF9hcmdzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUpCiAgICByZXNwID0gQ3JlYXRlQ29udGFpbmVyUmVxdWVzdENvbW1vbihpbnB1dCkKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0MjogdHJ1ZSIpCn0KCkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb24ocmVxKTo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgICMgQ2hlY2sgaWYgdGhlIGlucHV0IHJlcXVlc3Qgc2hvdWxkIGJlIHJlamVjdGVkIGV2ZW4gYmVmb3JlIGNoZWNraW5nIHRoZQogICAgIyBwb2xpY3lfZGF0YS5jb250YWluZXJzIGluZm9ybWF0aW9uLgogICAgYWxsb3dfY3JlYXRlX2NvbnRhaW5lcl9pbnB1dChyZXEpCgogICAgaV9vY2kgOj0gcmVxLk9DSQogICAgaV9zdG9yYWdlcyA6PSByZXEuc3RvcmFnZXMKICAgIGlfZGV2aWNlcyA6PSByZXEuZGV2aWNlcwoKICAgICMgYXJyYXkgb2YgcG9zc2libGUgc3RhdGUgb3BlcmF0aW9ucwogICAgb3BzX2J1aWxkZXIgOj0gW10KCiAgICAjIGNoZWNrIHNhbmRib3ggbmFtZQogICAgc2FuZGJveF9uYW1lID0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FX0tFWV0KICAgIGFkZF9zYW5kYm94X25hbWVfdG9fc3RhdGUgOj0gc3RhdGVfYWxsb3dzKCJzYW5kYm94X25hbWUiLCBzYW5kYm94X25hbWUpCiAgICBvcHNfYnVpbGRlcjEgOj0gY29uY2F0X29wX2lmX25vdF9udWxsKG9wc19idWlsZGVyLCBhZGRfc2FuZGJveF9uYW1lX3RvX3N0YXRlKQoKICAgICMgQ2hlY2sgaWYgYW55IGVsZW1lbnQgZnJvbSB0aGUgcG9saWN5X2RhdGEuY29udGFpbmVycyBhcnJheSBhbGxvd3MgdGhlIGlucHV0IHJlcXVlc3QuCiAgICBzb21lIHBfY29udGFpbmVyIGluIHBvbGljeV9kYXRhLmNvbnRhaW5lcnMKICAgIHByaW50KCI9PT09PT09PSBDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiB0cnlpbmcgbmV4dCBwb2xpY3kgY29udGFpbmVyIikKCiAgICBwX3BpZG5zIDo9IHBfY29udGFpbmVyLnNhbmRib3hfcGlkbnMKICAgIGlfcGlkbnMgOj0gcmVxLnNhbmRib3hfcGlkbnMKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiBwX3BpZG5zID0iLCBwX3BpZG5zLCAiaV9waWRucyA9IiwgaV9waWRucykKICAgIHBfcGlkbnMgPT0gaV9waWRucwoKICAgIHBfb2NpIDo9IHBfY29udGFpbmVyLk9DSQoKICAgICMgY2hlY2sgbmFtZXNwYWNlCiAgICBwX25hbWVzcGFjZSA6PSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBpX25hbWVzcGFjZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwcmludCAoIkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb246IHBfbmFtZXNwYWNlID0iLCBwX25hbWVzcGFjZSwgImlfbmFtZXNwYWNlID0iLCBpX25hbWVzcGFjZSkKICAgIGFkZF9uYW1lc3BhY2VfdG9fc3RhdGUgOj0gYWxsb3dfbmFtZXNwYWNlKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkKICAgIG9wc19idWlsZGVyMiA6PSBjb25jYXRfb3BfaWZfbm90X251bGwob3BzX2J1aWxkZXIxLCBhZGRfbmFtZXNwYWNlX3RvX3N0YXRlKQoKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiBwIFZlcnNpb24gPSIsIHBfb2NpLlZlcnNpb24sICJpIFZlcnNpb24gPSIsIGlfb2NpLlZlcnNpb24pCiAgICBwX29jaS5WZXJzaW9uID09IGlfb2NpLlZlcnNpb24KCiAgICBwcmludCgiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdENvbW1vbjogcCBSZWFkb25seSA9IiwgcF9vY2kuUm9vdC5SZWFkb25seSwgImkgUmVhZG9ubHkgPSIsIGlfb2NpLlJvb3QuUmVhZG9ubHkpCiAgICBwX29jaS5Sb290LlJlYWRvbmx5ID09IGlfb2NpLlJvb3QuUmVhZG9ubHkKCiAgICBhbGxvd19hbm5vKHBfb2NpLCBpX29jaSkKCiAgICBwX3N0b3JhZ2VzIDo9IHBfY29udGFpbmVyLnN0b3JhZ2VzCiAgICBhbGxvd19ieV9hbm5vKHBfb2NpLCBpX29jaSwgcF9zdG9yYWdlcywgaV9zdG9yYWdlcykKCiAgICBwX2RldmljZXMgOj0gcF9jb250YWluZXIuZGV2aWNlcwogICAgYWxsb3dfZGV2aWNlcyhwX2RldmljZXMsIGlfZGV2aWNlcykKCiAgICByZXQgOj0gYWxsb3dfbGludXgob3BzX2J1aWxkZXIyLCBwX29jaSwgaV9vY2kpCiAgICByZXQuYWxsb3dlZAoKICAgIG9wcyA6PSByZXQub3BzCgogICAgcHJpbnQoIkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb246IHRydWUiKQp9CgphbGxvd19jcmVhdGVfY29udGFpbmVyX2lucHV0KHJlcSkgewogICAgcHJpbnQoImFsbG93X2NyZWF0ZV9jb250YWluZXJfaW5wdXQ6IGlucHV0ID0iLCByZXEpCgogICAgY291bnQocmVxLnNoYXJlZF9tb3VudHMpID09IDAKICAgIGlzX251bGwocmVxLnN0cmluZ191c2VyKQoKICAgIGlfb2NpIDo9IHJlcS5PQ0kKICAgIGlzX251bGwoaV9vY2kuSG9va3MpCiAgICBpc19udWxsKGlfb2NpLlNvbGFyaXMpCiAgICBpc19udWxsKGlfb2NpLldpbmRvd3MpCgogICAgaV9saW51eCA6PSBpX29jaS5MaW51eAogICAgY291bnQoaV9saW51eC5HSURNYXBwaW5ncykgPT0gMAogICAgY291bnQoaV9saW51eC5Nb3VudExhYmVsKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlJlc291cmNlcy5EZXZpY2VzKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlJvb3Rmc1Byb3BhZ2F0aW9uKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlVJRE1hcHBpbmdzKSA9PSAwCiAgICBpc19udWxsKGlfbGludXguSW50ZWxSZHQpCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLkJsb2NrSU8pCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLk5ldHdvcmspCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLlBpZHMpCiAgICBpc19udWxsKGlfbGludXguU2VjY29tcCkKCiAgICBpX3Byb2Nlc3MgOj0gaV9vY2kuUHJvY2VzcwogICAgY291bnQoaV9wcm9jZXNzLlNlbGludXhMYWJlbCkgPT0gMAogICAgY291bnQoaV9wcm9jZXNzLlVzZXIuVXNlcm5hbWUpID09IDAKCiAgICBwcmludCgiYWxsb3dfY3JlYXRlX2NvbnRhaW5lcl9pbnB1dDogdHJ1ZSIpCn0KCmFsbG93X25hbWVzcGFjZShwX25hbWVzcGFjZSwgaV9uYW1lc3BhY2UpID0gYWRkX25hbWVzcGFjZSB7CiAgICBwX25hbWVzcGFjZSA9PSBpX25hbWVzcGFjZQogICAgYWRkX25hbWVzcGFjZSA6PSBudWxsCiAgICBwcmludCgiYWxsb3dfbmFtZXNwYWNlIDE6IGlucHV0IG5hbWVzcGFjZSBtYXRjaGVzIHBvbGljeSBkYXRhIikKfQoKYWxsb3dfbmFtZXNwYWNlKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkgPSBhZGRfbmFtZXNwYWNlIHsKICAgIHBfbmFtZXNwYWNlID09ICIiCiAgICBwcmludCgiYWxsb3dfbmFtZXNwYWNlIDI6IG5vIG5hbWVzcGFjZSBmb3VuZCBvbiBwb2xpY3kgZGF0YSIpCiAgICBhZGRfbmFtZXNwYWNlIDo9IHN0YXRlX2FsbG93cygibmFtZXNwYWNlIiwgaV9uYW1lc3BhY2UpCn0KCiMgdmFsdWUgaGFzbid0IGJlZW4gc2VlbiBiZWZvcmUsIHNhdmUgaXQgdG8gc3RhdGUKc3RhdGVfYWxsb3dzKGtleSwgdmFsdWUpID0gYWN0aW9uIHsKICBzdGF0ZSA6PSBnZXRfc3RhdGUoKQogIHByaW50KCJzdGF0ZV9hbGxvd3MgMTogc3RhdGVba2V5XSA9Iiwgc3RhdGVba2V5XSwgInZhbHVlID0iLCB2YWx1ZSkKICBub3Qgc3RhdGVba2V5XQogIHByaW50KCJzdGF0ZV9hbGxvd3MgMTogc2F2aW5nIHRvIHN0YXRlIGtleSA9Iiwga2V5LCAidmFsdWUgPSIsIHZhbHVlKQogIHBhdGggOj0gZ2V0X3N0YXRlX3BhdGgoa2V5KSAKICBhY3Rpb24gOj0gewogICAgIm9wIjogImFkZCIsCiAgICAicGF0aCI6IHBhdGgsIAogICAgInZhbHVlIjogdmFsdWUsCiAgfQp9CgojIHZhbHVlIG1hdGNoZXMgd2hhdCdzIGluIHN0YXRlLCBhbGxvdyBpdApzdGF0ZV9hbGxvd3Moa2V5LCB2YWx1ZSkgPSBhY3Rpb24gewogIHByaW50KCJzdGF0ZV9hbGxvd3MgMjogc3RhcnQiKQogIHN0YXRlIDo9IGdldF9zdGF0ZSgpCiAgcHJpbnQoInN0YXRlX2FsbG93cyAyOiBzdGF0ZVtrZXldID0iLCBzdGF0ZVtrZXldLCAidmFsdWUgPSIsIHZhbHVlKQogIHZhbHVlID09IHN0YXRlW2tleV0KICBwcmludCgic3RhdGVfYWxsb3dzIDI6IGZvdW5kIGtleSA9Iiwga2V5LCAidmFsdWUgPSIsIHZhbHVlLCAiIGluIHN0YXRlIikKICBhY3Rpb24gOj0gbnVsbAp9CgojIGhlbHBlciBmdW5jdGlvbnMgdG8gaW50ZXJhY3Qgd2l0aCB0aGUgc3RhdGUKZ2V0X3N0YXRlKCkgPSBzdGF0ZSB7CiAgc3RhdGUgOj0gZGF0YVsicHN0YXRlIl0KfQoKZ2V0X3N0YXRlX3ZhbChrZXkpID0gdmFsdWUgewogICAgc3RhdGUgOj0gZ2V0X3N0YXRlKCkKICAgIHZhbHVlIDo9IHN0YXRlW2tleV0KfQoKZ2V0X3N0YXRlX3BhdGgoa2V5KSA9IHBhdGggewogICAgIyBwcmVwZW5kICIvcHN0YXRlLyIgdG8ga2V5CiAgICBwYXRoIDo9IGNvbmNhdCgiLyIsIFsiL3BzdGF0ZSIsIGtleV0pCn0KCiMgSGVscGVyIGZ1bmN0aW9ucyB0byBjb25kaXRpb25hbGx5IGNvbmNhdGVuYXRlIG9wIGlzIG5vdCBudWxsCmNvbmNhdF9vcF9pZl9ub3RfbnVsbChvcHMsIG9wKSA9IHJlc3VsdCB7CiAgICBvcCA9PSBudWxsCiAgICByZXN1bHQgOj0gb3BzCn0KCmNvbmNhdF9vcF9pZl9ub3RfbnVsbChvcHMsIG9wKSA9IHJlc3VsdCB7CiAgICBvcCAhPSBudWxsCiAgICByZXN1bHQgOj0gYXJyYXkuY29uY2F0KG9wcywgW29wXSkKfQoKIyBSZWplY3QgdW5leHBlY3RlZCBhbm5vdGF0aW9ucy4KYWxsb3dfYW5ubyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19hbm5vIDE6IHN0YXJ0IikKCiAgICBub3QgaV9vY2kuQW5ub3RhdGlvbnMKCiAgICBwcmludCgiYWxsb3dfYW5ubyAxOiB0cnVlIikKfQphbGxvd19hbm5vKHBfb2NpLCBpX29jaSkgewogICAgcHJpbnQoImFsbG93X2Fubm8gMjogcCBBbm5vdGF0aW9ucyA9IiwgcF9vY2kuQW5ub3RhdGlvbnMpCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiBpIEFubm90YXRpb25zID0iLCBpX29jaS5Bbm5vdGF0aW9ucykKCiAgICBpX2tleXMgOj0gb2JqZWN0LmtleXMoaV9vY2kuQW5ub3RhdGlvbnMpCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiBpIGtleXMgPSIsIGlfa2V5cykKCiAgICBldmVyeSBpX2tleSBpbiBpX2tleXMgewogICAgICAgIGFsbG93X2Fubm9fa2V5KGlfa2V5LCBwX29jaSkKICAgIH0KCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiB0cnVlIikKfQoKYWxsb3dfYW5ub19rZXkoaV9rZXksIHBfb2NpKSB7CiAgICBwcmludCgiYWxsb3dfYW5ub19rZXkgMTogaSBrZXkgPSIsIGlfa2V5KQoKICAgIHN0YXJ0c3dpdGgoaV9rZXksICJpby5rdWJlcm5ldGVzLmNyaS4iKQoKICAgIHByaW50KCJhbGxvd19hbm5vX2tleSAxOiB0cnVlIikKfQphbGxvd19hbm5vX2tleShpX2tleSwgcF9vY2kpIHsKICAgIHByaW50KCJhbGxvd19hbm5vX2tleSAyOiBpIGtleSA9IiwgaV9rZXkpCgogICAgc29tZSBwX2tleSwgXyBpbiBwX29jaS5Bbm5vdGF0aW9ucwogICAgcF9rZXkgPT0gaV9rZXkKCiAgICBwcmludCgiYWxsb3dfYW5ub19rZXkgMjogdHJ1ZSIpCn0KCiMgR2V0IHRoZSB2YWx1ZSBvZiB0aGUgU19OQU1FX0tFWSBhbm5vdGF0aW9uIGFuZAojIGNvcnJlbGF0ZSBpdCB3aXRoIG90aGVyIGFubm90YXRpb25zIGFuZCBwcm9jZXNzIGZpZWxkcy4KYWxsb3dfYnlfYW5ubyhwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpIHsKICAgIHByaW50KCJhbGxvd19ieV9hbm5vIDE6IHN0YXJ0IikKCiAgICBub3QgcF9vY2kuQW5ub3RhdGlvbnNbU19OQU1FX0tFWV0KCiAgICBpX3NfbmFtZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMTogaV9zX25hbWUgPSIsIGlfc19uYW1lKQoKICAgIGlfc19uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FU1BBQ0VfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMTogaV9zX25hbWVzcGFjZSA9IiwgaV9zX25hbWVzcGFjZSkKCiAgICBhbGxvd19ieV9zYW5kYm94X25hbWUocF9vY2ksIGlfb2NpLCBwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBpX3NfbmFtZSwgaV9zX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfYnlfYW5ubyAxOiB0cnVlIikKfQphbGxvd19ieV9hbm5vKHBfb2NpLCBpX29jaSwgcF9zdG9yYWdlcywgaV9zdG9yYWdlcykgewogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMjogc3RhcnQiKQoKICAgIHBfc19uYW1lIDo9IHBfb2NpLkFubm90YXRpb25zW1NfTkFNRV9LRVldCiAgICBpX3NfbmFtZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMjogaV9zX25hbWUgPSIsIGlfc19uYW1lLCAicF9zX25hbWUgPSIsIHBfc19uYW1lKQoKICAgIGFsbG93X3NhbmRib3hfbmFtZShwX3NfbmFtZSwgaV9zX25hbWUpCgogICAgaV9zX25hbWVzcGFjZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwcmludCgiYWxsb3dfYnlfYW5ubyAyOiBpX3NfbmFtZXNwYWNlID0iLCBpX3NfbmFtZXNwYWNlKQoKICAgIGFsbG93X2J5X3NhbmRib3hfbmFtZShwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMsIGlfc19uYW1lLCBpX3NfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd19ieV9hbm5vIDI6IHRydWUiKQp9CgphbGxvd19ieV9zYW5kYm94X25hbWUocF9vY2ksIGlfb2NpLCBwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfYnlfc2FuZGJveF9uYW1lOiBzdGFydCIpCgogICAgaV9uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FU1BBQ0VfS0VZXQoKICAgIGFsbG93X2J5X2NvbnRhaW5lcl90eXBlcyhwX29jaSwgaV9vY2ksIHNfbmFtZSwgaV9uYW1lc3BhY2UpCiAgICBhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZChwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpCiAgICBhbGxvd19wcm9jZXNzKHBfb2NpLlByb2Nlc3MsIGlfb2NpLlByb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpCgogICAgcHJpbnQoImFsbG93X2J5X3NhbmRib3hfbmFtZTogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfbmFtZShwX3NfbmFtZSwgaV9zX25hbWUpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X25hbWU6IHN0YXJ0IikKICAgIHJlZ2V4Lm1hdGNoKHBfc19uYW1lLCBpX3NfbmFtZSkKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9uYW1lOiB0cnVlIikKfQoKIyBDaGVjayB0aGF0IHRoZSAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLXR5cGUiIGFuZAojICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIiBhbm5vdGF0aW9ucyBkZXNpZ25hdGUgdGhlCiMgZXhwZWN0ZWQgdHlwZSAtIGVpdGhlciBhICJzYW5kYm94IiBvciBhICJjb250YWluZXIiLiBUaGVuLCB2YWxpZGF0ZQojIG90aGVyIGFubm90YXRpb25zIGJhc2VkIG9uIHRoZSBhY3R1YWwgInNhbmRib3giIG9yICJjb250YWluZXIiIHZhbHVlCiMgZnJvbSB0aGUgaW5wdXQgY29udGFpbmVyLgphbGxvd19ieV9jb250YWluZXJfdHlwZXMocF9vY2ksIGlfb2NpLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfYnlfY29udGFpbmVyX3R5cGVzOiBjaGVja2luZyBpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSIpCgogICAgY190eXBlIDo9ICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSIKICAgIAogICAgcF9jcmlfdHlwZSA6PSBwX29jaS5Bbm5vdGF0aW9uc1tjX3R5cGVdCiAgICBpX2NyaV90eXBlIDo9IGlfb2NpLkFubm90YXRpb25zW2NfdHlwZV0KICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZXM6IHBfY3JpX3R5cGUgPSIsIHBfY3JpX3R5cGUsICJpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgcF9jcmlfdHlwZSA9PSBpX2NyaV90eXBlCgogICAgYWxsb3dfYnlfY29udGFpbmVyX3R5cGUoaV9jcmlfdHlwZSwgcF9vY2ksIGlfb2NpLCBzX25hbWUsIHNfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZXM6IHRydWUiKQp9CgphbGxvd19ieV9jb250YWluZXJfdHlwZShpX2NyaV90eXBlLCBwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAxOiBpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgaV9jcmlfdHlwZSA9PSAic2FuZGJveCIKCiAgICBpX2thdGFfdHlwZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1siaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5jb250YWluZXJfdHlwZSJdCiAgICBwcmludCgiYWxsb3dfYnlfY29udGFpbmVyX3R5cGUgMTogaV9rYXRhX3R5cGUgPSIsIGlfa2F0YV90eXBlKQogICAgaV9rYXRhX3R5cGUgPT0gInBvZF9zYW5kYm94IgoKICAgIGFsbG93X3NhbmRib3hfY29udGFpbmVyX25hbWUocF9vY2ksIGlfb2NpKQogICAgYWxsb3dfc2FuZGJveF9uZXRfbmFtZXNwYWNlKHBfb2NpLCBpX29jaSkKICAgIGFsbG93X3NhbmRib3hfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpCgogICAgcHJpbnQoImFsbG93X2J5X2NvbnRhaW5lcl90eXBlIDE6IHRydWUiKQp9CgphbGxvd19ieV9jb250YWluZXJfdHlwZShpX2NyaV90eXBlLCBwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiBpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgaV9jcmlfdHlwZSA9PSAiY29udGFpbmVyIgoKICAgIGlfa2F0YV90eXBlIDo9IGlfb2NpLkFubm90YXRpb25zWyJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIl0KICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiBpX2thdGFfdHlwZSA9IiwgaV9rYXRhX3R5cGUpCiAgICBpX2thdGFfdHlwZSA9PSAicG9kX2NvbnRhaW5lciIKCiAgICBhbGxvd19jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpCiAgICBhbGxvd19uZXRfbmFtZXNwYWNlKHBfb2NpLCBpX29jaSkKICAgIGFsbG93X2xvZ19kaXJlY3RvcnkocF9vY2ksIGlfb2NpKQoKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiB0cnVlIikKfQoKIyAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLW5hbWUiIGFubm90YXRpb24KYWxsb3dfc2FuZGJveF9jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X2NvbnRhaW5lcl9uYW1lOiBzdGFydCIpCgogICAgY29udGFpbmVyX2Fubm90YXRpb25fbWlzc2luZyhwX29jaSwgaV9vY2ksICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItbmFtZSIpCgogICAgcHJpbnQoImFsbG93X3NhbmRib3hfY29udGFpbmVyX25hbWU6IHRydWUiKQp9CgphbGxvd19jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19jb250YWluZXJfbmFtZTogc3RhcnQiKQoKICAgIGFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uKHBfb2NpLCBpX29jaSwgImlvLmt1YmVybmV0ZXMuY3JpLmNvbnRhaW5lci1uYW1lIikKCiAgICBwcmludCgiYWxsb3dfY29udGFpbmVyX25hbWU6IHRydWUiKQp9Cgpjb250YWluZXJfYW5ub3RhdGlvbl9taXNzaW5nKHBfb2NpLCBpX29jaSwga2V5KSB7CiAgICBwcmludCgiY29udGFpbmVyX2Fubm90YXRpb25fbWlzc2luZzoiLCBrZXkpCgogICAgbm90IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIG5vdCBpX29jaS5Bbm5vdGF0aW9uc1trZXldCgogICAgcHJpbnQoImNvbnRhaW5lcl9hbm5vdGF0aW9uX21pc3Npbmc6IHRydWUiKQp9CgphbGxvd19jb250YWluZXJfYW5ub3RhdGlvbihwX29jaSwgaV9vY2ksIGtleSkgewogICAgcHJpbnQoImFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uOiBrZXkgPSIsIGtleSkKCiAgICBwX3ZhbHVlIDo9IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIGlfdmFsdWUgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgcHJpbnQoImFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uOiBwX3ZhbHVlID0iLCBwX3ZhbHVlLCAiaV92YWx1ZSA9IiwgaV92YWx1ZSkKCiAgICBwX3ZhbHVlID09IGlfdmFsdWUKCiAgICBwcmludCgiYWxsb3dfY29udGFpbmVyX2Fubm90YXRpb246IHRydWUiKQp9CgojICJuZXJkY3RsL25ldHdvcmstbmFtZXNwYWNlIiBhbm5vdGF0aW9uCmFsbG93X3NhbmRib3hfbmV0X25hbWVzcGFjZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X25ldF9uYW1lc3BhY2U6IHN0YXJ0IikKCiAgICBrZXkgOj0gIm5lcmRjdGwvbmV0d29yay1uYW1lc3BhY2UiCgogICAgcF9uYW1lc3BhY2UgOj0gcF9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgaV9uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgcHJpbnQoImFsbG93X3NhbmRib3hfbmV0X25hbWVzcGFjZTogcF9uYW1lc3BhY2UgPSIsIHBfbmFtZXNwYWNlLCAiaV9uYW1lc3BhY2UgPSIsIGlfbmFtZXNwYWNlKQoKICAgIHJlZ2V4Lm1hdGNoKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9uZXRfbmFtZXNwYWNlOiB0cnVlIikKfQoKYWxsb3dfbmV0X25hbWVzcGFjZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19uZXRfbmFtZXNwYWNlOiBzdGFydCIpCgogICAga2V5IDo9ICJuZXJkY3RsL25ldHdvcmstbmFtZXNwYWNlIgoKICAgIG5vdCBwX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICBub3QgaV9vY2kuQW5ub3RhdGlvbnNba2V5XQoKICAgIHByaW50KCJhbGxvd19uZXRfbmFtZXNwYWNlOiB0cnVlIikKfQoKIyAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1sb2ctZGlyZWN0b3J5IiBhbm5vdGF0aW9uCmFsbG93X3NhbmRib3hfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X2xvZ19kaXJlY3Rvcnk6IHN0YXJ0IikKCiAgICBrZXkgOj0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbG9nLWRpcmVjdG9yeSIKCiAgICBwX2RpciA6PSBwX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICByZWdleDEgOj0gcmVwbGFjZShwX2RpciwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHJlZ2V4MiA6PSByZXBsYWNlKHJlZ2V4MSwgIiQoc2FuZGJveC1uYW1lc3BhY2UpIiwgc19uYW1lc3BhY2UpCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiByZWdleDIgPSIsIHJlZ2V4MikKCiAgICBpX2RpciA6PSBpX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiBpX2RpciA9IiwgaV9kaXIpCgogICAgcmVnZXgubWF0Y2gocmVnZXgyLCBpX2RpcikKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiB0cnVlIikKfQoKYWxsb3dfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19sb2dfZGlyZWN0b3J5OiBzdGFydCIpCgogICAga2V5IDo9ICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWxvZy1kaXJlY3RvcnkiCgogICAgbm90IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIG5vdCBpX29jaS5Bbm5vdGF0aW9uc1trZXldCgogICAgcHJpbnQoImFsbG93X2xvZ19kaXJlY3Rvcnk6IHRydWUiKQp9CgphbGxvd19kZXZpY2VzKHBfZGV2aWNlcywgaV9kZXZpY2VzKSB7CiAgICBwcmludCgiYWxsb3dfZGV2aWNlczogc3RhcnQiKQogICAgZXZlcnkgaV9kZXZpY2UgaW4gaV9kZXZpY2VzIHsKICAgICAgICBwcmludCgiYWxsb3dfZGV2aWNlczogaV9kZXZpY2UgPSIsIGlfZGV2aWNlKQogICAgICAgIHNvbWUgcF9kZXZpY2UgaW4gcF9kZXZpY2VzCiAgICAgICAgcF9kZXZpY2UuY29udGFpbmVyX3BhdGggPT0gaV9kZXZpY2UuY29udGFpbmVyX3BhdGgKICAgIH0KICAgIHByaW50KCJhbGxvd19kZXZpY2VzOiB0cnVlIikKfQoKYWxsb3dfbGludXgoc3RhdGVfb3BzLCBwX29jaSwgaV9vY2kpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIHBfbmFtZXNwYWNlcyA6PSBwX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbGludXg6IHAgbmFtZXNwYWNlcyA9IiwgcF9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlcyA6PSBpX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbGludXg6IGkgbmFtZXNwYWNlcyA9IiwgaV9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlX3dpdGhvdXRfbmV0d29yayA6PSBbb2JqIHwgb2JqIDo9IGlfbmFtZXNwYWNlc1tfXTsgb2JqLlR5cGUgIT0gIm5ldHdvcmsiXQoKICAgIHByaW50KCJhbGxvd19saW51eDogaV9uYW1lc3BhY2Vfd2l0aG91dF9uZXR3b3JrID0iLCBpX25hbWVzcGFjZV93aXRob3V0X25ldHdvcmspCgogICAgcF9uYW1lc3BhY2VzID09IGlfbmFtZXNwYWNlX3dpdGhvdXRfbmV0d29yawoKICAgIGFsbG93X21hc2tlZF9wYXRocyhwX29jaSwgaV9vY2kpCiAgICBhbGxvd19yZWFkb25seV9wYXRocyhwX29jaSwgaV9vY2kpCiAgICBhbGxvd19saW51eF9kZXZpY2VzKHBfb2NpLkxpbnV4LkRldmljZXMsIGlfb2NpLkxpbnV4LkRldmljZXMpCiAgICBhbGxvd19saW51eF9zeXNjdGwocF9vY2kuTGludXgsIGlfb2NpLkxpbnV4KQogICAgcmV0IDo9IGFsbG93X25ldHdvcmtfbmFtZXNwYWNlX3N0YXJ0KHN0YXRlX29wcywgcF9vY2ksIGlfb2NpKQogICAgcmV0LmFsbG93ZWQKCiAgICBvcHMgOj0gcmV0Lm9wcwoKICAgIHByaW50KCJhbGxvd19saW51eDogdHJ1ZSIpCn0KCiMgUmV0cmlldmUgdGhlICJuZXR3b3JrIiBuYW1lc3BhY2UgZnJvbSB0aGUgaW5wdXQgZGF0YSBhbmQgcGFzcyBpdCBvbiBmb3IgdGhlCiMgbmV0d29yayBuYW1lc3BhY2UgcG9saWN5IGNoZWNrcy4KYWxsb3dfbmV0d29ya19uYW1lc3BhY2Vfc3RhcnQoc3RhdGVfb3BzLCBwX29jaSwgaV9vY2kpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIHByaW50KCJhbGxvd19uZXR3b3JrX25hbWVzcGFjZSBzdGFydDogc3RhcnQiKQoKICAgIHBfbmFtZXNwYWNlcyA6PSBwX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IHAgbmFtZXNwYWNlcyA9IiwgcF9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlcyA6PSBpX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IGkgbmFtZXNwYWNlcyA9IiwgaV9uYW1lc3BhY2VzKQoKICAgICMgUmV0dXJuIHBhdGggb2YgdGhlICJuZXR3b3JrIiBuYW1lc3BhY2UKICAgIG5ldHdvcmtfbnMgOj0gW29iaiB8IG9iaiA6PSBpX25hbWVzcGFjZXNbX107IG9iai5UeXBlID09ICJuZXR3b3JrIl0KCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IG5ldHdvcmtfbnMgPSIsIG5ldHdvcmtfbnMpCgogICAgcmV0IDo9IGFsbG93X25ldHdvcmtfbmFtZXNwYWNlKHN0YXRlX29wcywgbmV0d29ya19ucykKICAgIHJldC5hbGxvd2VkCgogICAgb3BzIDo9IHJldC5vcHMKfQoKIyBUaGlzIHJ1bGUgaXMgd2hlbiB0aGVyZSdzIG5vIG5ldHdvcmsgbmFtZXNwYWNlIGluIHRoZSBpbnB1dCBkYXRhLgphbGxvd19uZXR3b3JrX25hbWVzcGFjZShzdGF0ZV9vcHMsIG5ldHdvcmtfbnMpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIGNvdW50KG5ldHdvcmtfbnMpID09IDAKCiAgICBuZXR3b3JrX25zX3BhdGggPSAiIgoKICAgIGFkZF9uZXR3b3JrX25hbWVzcGFjZV90b19zdGF0ZSA6PSBzdGF0ZV9hbGxvd3MoIm5ldHdvcmtfbmFtZXNwYWNlIiwgbmV0d29ya19uc19wYXRoKQogICAgb3BzIDo9IGNvbmNhdF9vcF9pZl9ub3RfbnVsbChzdGF0ZV9vcHMsIGFkZF9uZXR3b3JrX25hbWVzcGFjZV90b19zdGF0ZSkKCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2UgMTogdHJ1ZSIpCn0KCiMgVGhpcyBydWxlIGlzIHdoZW4gdGhlcmUncyBleGFjdGx5IG9uZSBuZXR3b3JrIG5hbWVzcGFjZSBpbiB0aGUgaW5wdXQgZGF0YS4KYWxsb3dfbmV0d29ya19uYW1lc3BhY2Uoc3RhdGVfb3BzLCBuZXR3b3JrX25zKSA6PSB7Im9wcyI6IG9wcywgImFsbG93ZWQiOiB0cnVlfSB7CiAgICBjb3VudChuZXR3b3JrX25zKSA9PSAxCgogICAgYWRkX25ldHdvcmtfbmFtZXNwYWNlX3RvX3N0YXRlIDo9IHN0YXRlX2FsbG93cygibmV0d29ya19uYW1lc3BhY2UiLCBuZXR3b3JrX25zWzBdLlBhdGgpCiAgICBvcHMgOj0gY29uY2F0X29wX2lmX25vdF9udWxsKHN0YXRlX29wcywgYWRkX25ldHdvcmtfbmFtZXNwYWNlX3RvX3N0YXRlKQoKICAgIHByaW50KCJhbGxvd19uZXR3b3JrX25hbWVzcGFjZSAyOiB0cnVlIikKfQoKYWxsb3dfbWFza2VkX3BhdGhzKHBfb2NpLCBpX29jaSkgewogICAgcF9wYXRocyA6PSBwX29jaS5MaW51eC5NYXNrZWRQYXRocwogICAgcHJpbnQoImFsbG93X21hc2tlZF9wYXRocyAxOiBwX3BhdGhzID0iLCBwX3BhdGhzKQoKICAgIGlfcGF0aHMgOj0gaV9vY2kuTGludXguTWFza2VkUGF0aHMKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aHMgMTogaV9wYXRocyA9IiwgaV9wYXRocykKCiAgICBhbGxvd19tYXNrZWRfcGF0aHNfYXJyYXkocF9wYXRocywgaV9wYXRocykKCiAgICBwcmludCgiYWxsb3dfbWFza2VkX3BhdGhzIDE6IHRydWUiKQp9CmFsbG93X21hc2tlZF9wYXRocyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aHMgMjogc3RhcnQiKQoKICAgIG5vdCBwX29jaS5MaW51eC5NYXNrZWRQYXRocwogICAgbm90IGlfb2NpLkxpbnV4Lk1hc2tlZFBhdGhzCgogICAgcHJpbnQoImFsbG93X21hc2tlZF9wYXRocyAyOiB0cnVlIikKfQoKIyBBbGwgdGhlIHBvbGljeSBtYXNrZWQgcGF0aHMgbXVzdCBiZSBtYXNrZWQgaW4gdGhlIGlucHV0IGRhdGEgdG9vLgojIElucHV0IGlzIGFsbG93ZWQgdG8gaGF2ZSBtb3JlIG1hc2tlZCBwYXRocyB0aGFuIHRoZSBwb2xpY3kuCmFsbG93X21hc2tlZF9wYXRoc19hcnJheShwX2FycmF5LCBpX2FycmF5KSB7CiAgICBldmVyeSBwX2VsZW0gaW4gcF9hcnJheSB7CiAgICAgICAgYWxsb3dfbWFza2VkX3BhdGgocF9lbGVtLCBpX2FycmF5KQogICAgfQp9CgphbGxvd19tYXNrZWRfcGF0aChwX2VsZW0sIGlfYXJyYXkpIHsKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aDogcF9lbGVtID0iLCBwX2VsZW0pCgogICAgc29tZSBpX2VsZW0gaW4gaV9hcnJheQogICAgcF9lbGVtID09IGlfZWxlbQoKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aDogdHJ1ZSIpCn0KCmFsbG93X3JlYWRvbmx5X3BhdGhzKHBfb2NpLCBpX29jaSkgewogICAgcF9wYXRocyA6PSBwX29jaS5MaW51eC5SZWFkb25seVBhdGhzCiAgICBwcmludCgiYWxsb3dfcmVhZG9ubHlfcGF0aHMgMTogcF9wYXRocyA9IiwgcF9wYXRocykKCiAgICBpX3BhdGhzIDo9IGlfb2NpLkxpbnV4LlJlYWRvbmx5UGF0aHMKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAxOiBpX3BhdGhzID0iLCBpX3BhdGhzKQoKICAgIGFsbG93X3JlYWRvbmx5X3BhdGhzX2FycmF5KHBfcGF0aHMsIGlfcGF0aHMsIGlfb2NpLkxpbnV4Lk1hc2tlZFBhdGhzKQoKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAxOiB0cnVlIikKfQphbGxvd19yZWFkb25seV9wYXRocyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAyOiBzdGFydCIpCgogICAgbm90IHBfb2NpLkxpbnV4LlJlYWRvbmx5UGF0aHMKICAgIG5vdCBpX29jaS5MaW51eC5SZWFkb25seVBhdGhzCgogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGhzIDI6IHRydWUiKQp9CgojIEFsbCB0aGUgcG9saWN5IHJlYWRvbmx5IHBhdGhzIG11c3QgYmUgZWl0aGVyOgojIC0gUHJlc2VudCBpbiB0aGUgaW5wdXQgcmVhZG9ubHkgcGF0aHMsIG9yCiMgLSBQcmVzZW50IGluIHRoZSBpbnB1dCBtYXNrZWQgcGF0aHMuCiMgSW5wdXQgaXMgYWxsb3dlZCB0byBoYXZlIG1vcmUgcmVhZG9ubHkgcGF0aHMgdGhhbiB0aGUgcG9saWN5LgphbGxvd19yZWFkb25seV9wYXRoc19hcnJheShwX2FycmF5LCBpX2FycmF5LCBtYXNrZWRfcGF0aHMpIHsKICAgIGV2ZXJ5IHBfZWxlbSBpbiBwX2FycmF5IHsKICAgICAgICBhbGxvd19yZWFkb25seV9wYXRoKHBfZWxlbSwgaV9hcnJheSwgbWFza2VkX3BhdGhzKQogICAgfQp9CgphbGxvd19yZWFkb25seV9wYXRoKHBfZWxlbSwgaV9hcnJheSwgbWFza2VkX3BhdGhzKSB7CiAgICBwcmludCgiYWxsb3dfcmVhZG9ubHlfcGF0aCAxOiBwX2VsZW0gPSIsIHBfZWxlbSkKCiAgICBzb21lIGlfZWxlbSBpbiBpX2FycmF5CiAgICBwX2VsZW0gPT0gaV9lbGVtCgogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGggMTogdHJ1ZSIpCn0KYWxsb3dfcmVhZG9ubHlfcGF0aChwX2VsZW0sIGlfYXJyYXksIG1hc2tlZF9wYXRocykgewogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGggMjogcF9lbGVtID0iLCBwX2VsZW0pCgogICAgc29tZSBpX21hc2tlZCBpbiBtYXNrZWRfcGF0aHMKICAgIHBfZWxlbSA9PSBpX21hc2tlZAoKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRoIDI6IHRydWUiKQp9CgphbGxvd19saW51eF9kZXZpY2VzKHBfZGV2aWNlcywgaV9kZXZpY2VzKSB7CiAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogc3RhcnQiKQogICAgZXZlcnkgaV9kZXZpY2UgaW4gaV9kZXZpY2VzIHsKICAgICAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogaV9kZXZpY2UgPSIsIGlfZGV2aWNlKQogICAgICAgIHNvbWUgcF9kZXZpY2UgaW4gcF9kZXZpY2VzCiAgICAgICAgaV9kZXZpY2UuUGF0aCA9PSBwX2RldmljZS5QYXRoCiAgICB9CiAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogdHJ1ZSIpCn0KCmFsbG93X2xpbnV4X3N5c2N0bChwX2xpbnV4LCBpX2xpbnV4KSB7CiAgICBwcmludCgiYWxsb3dfbGludXhfc3lzY3RsIDE6IHN0YXJ0IikKICAgIG5vdCBpX2xpbnV4LlN5c2N0bAogICAgcHJpbnQoImFsbG93X2xpbnV4X3N5c2N0bCAxOiB0cnVlIikKfQoKYWxsb3dfbGludXhfc3lzY3RsKHBfbGludXgsIGlfbGludXgpIHsKICAgIHByaW50KCJhbGxvd19saW51eF9zeXNjdGwgMjogc3RhcnQiKQogICAgcF9zeXNjdGwgOj0gcF9saW51eC5TeXNjdGwKICAgIGlfc3lzY3RsIDo9IGlfbGludXguU3lzY3RsCiAgICBldmVyeSBpX25hbWUsIGlfdmFsIGluIGlfc3lzY3RsIHsKICAgICAgICBwcmludCgiYWxsb3dfbGludXhfc3lzY3RsIDI6IGlfbmFtZSA9IiwgaV9uYW1lLCAiaV92YWwgPSIsIGlfdmFsKQogICAgICAgIHBfc3lzY3RsW2lfbmFtZV0gPT0gaV92YWwKICAgIH0KICAgIHByaW50KCJhbGxvd19saW51eF9zeXNjdGwgMjogdHJ1ZSIpCn0KCiMgQ2hlY2sgdGhlIGNvbnNpc3RlbmN5IG9mIHRoZSBpbnB1dCAiaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5idW5kbGVfcGF0aCIKIyBhbmQgaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCIgdmFsdWVzIHdpdGggb3RoZXIgZmllbGRzLgphbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZChwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpIHsKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogc3RhcnQiKQoKICAgIGJ1bmRsZV9wYXRoIDo9IGlfb2NpLkFubm90YXRpb25zWyJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmJ1bmRsZV9wYXRoIl0KICAgIGJ1bmRsZV9pZCA6PSByZXBsYWNlKGJ1bmRsZV9wYXRoLCAiL3J1bi9jb250YWluZXJkL2lvLmNvbnRhaW5lcmQucnVudGltZS52Mi50YXNrL2s4cy5pby8iLCAiIikKCiAgICBidW5kbGVfaWRfZm9ybWF0IDo9IGNvbmNhdCgiIiwgWyJeIiwgQlVORExFX0lELCAiJCJdKQogICAgcmVnZXgubWF0Y2goYnVuZGxlX2lkX2Zvcm1hdCwgYnVuZGxlX2lkKQoKICAgIGtleSA6PSAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCIKCiAgICBwX3JlZ2V4IDo9IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIHNhbmRib3hfaWQgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQoKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogc2FuZGJveF9pZCA9Iiwgc2FuZGJveF9pZCwgInJlZ2V4ID0iLCBwX3JlZ2V4KQogICAgcmVnZXgubWF0Y2gocF9yZWdleCwgc2FuZGJveF9pZCkKCiAgICBhbGxvd19yb290X3BhdGgocF9vY2ksIGlfb2NpLCBidW5kbGVfaWQpCgogICAgZXZlcnkgaV9tb3VudCBpbiBpX29jaS5Nb3VudHMgewogICAgICAgIGFsbG93X21vdW50KHBfb2NpLCBpX21vdW50LCBpX3N0b3JhZ2VzLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpCiAgICB9CgogICAgYWxsb3dfc3RvcmFnZXMocF9zdG9yYWdlcywgaV9zdG9yYWdlcywgYnVuZGxlX2lkLCBzYW5kYm94X2lkKQoKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogdHJ1ZSIpCn0KCmFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHBfcHJvY2VzcyA9IiwgcF9wcm9jZXNzKQogICAgcHJpbnQoImFsbG93X3Byb2Nlc3NfY29tbW9uOiBpX3Byb2Nlc3MgPSAiLCBpX3Byb2Nlc3MpCiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHNfbmFtZSA9Iiwgc19uYW1lKQoKICAgIHBfcHJvY2Vzcy5Dd2QgPT0gaV9wcm9jZXNzLkN3ZAogICAgcF9wcm9jZXNzLk5vTmV3UHJpdmlsZWdlcyA9PSBpX3Byb2Nlc3MuTm9OZXdQcml2aWxlZ2VzCgogICAgYWxsb3dfdXNlcihwX3Byb2Nlc3MsIGlfcHJvY2VzcykKICAgIGFsbG93X2VudihwX3Byb2Nlc3MsIGlfcHJvY2Vzcywgc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHRydWUiKQp9CgojIENvbXBhcmUgdGhlIE9DSSBQcm9jZXNzIGZpZWxkIG9mIGEgcG9saWN5IGNvbnRhaW5lciB3aXRoIHRoZSBpbnB1dCBPQ0kgUHJvY2VzcyBmcm9tIGEgQ3JlYXRlQ29udGFpbmVyUmVxdWVzdAphbGxvd19wcm9jZXNzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfcHJvY2Vzczogc3RhcnQiKQoKICAgIGFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgYWxsb3dfY2FwcyhwX3Byb2Nlc3MuQ2FwYWJpbGl0aWVzLCBpX3Byb2Nlc3MuQ2FwYWJpbGl0aWVzKQogICAgcF9wcm9jZXNzLlRlcm1pbmFsID09IGlfcHJvY2Vzcy5UZXJtaW5hbAoKICAgIHByaW50KCJhbGxvd19wcm9jZXNzOiB0cnVlIikKfQoKIyBDb21wYXJlIHRoZSBPQ0kgUHJvY2VzcyBmaWVsZCBvZiBhIHBvbGljeSBjb250YWluZXIgd2l0aCB0aGUgaW5wdXQgcHJvY2VzcyBmaWVsZCBmcm9tIEV4ZWNQcm9jZXNzUmVxdWVzdAphbGxvd19pbnRlcmFjdGl2ZV9wcm9jZXNzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfaW50ZXJhY3RpdmVfcHJvY2Vzczogc3RhcnQiKQoKICAgIGFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgYWxsb3dfZXhlY19jYXBzKGlfcHJvY2Vzcy5DYXBhYmlsaXRpZXMpCgogICAgIyBUaGVzZSBhcmUgY29tbWFuZHMgZW5hYmxlZCB1c2luZyBFeGVjUHJvY2Vzc1JlcXVlc3QgY29tbWFuZHMgYW5kL29yIHJlZ2V4IGZyb20gdGhlIHNldHRpbmdzIGZpbGUuCiAgICAjIFRoZXkgY2FuIGJlIGV4ZWN1dGVkIGludGVyYWN0aXZlbHkgc28gYWxsb3cgdGhlbSB0byB1c2UgYW55IHZhbHVlIGZvciBpX3Byb2Nlc3MuVGVybWluYWwuCgogICAgcHJpbnQoImFsbG93X2ludGVyYWN0aXZlX3Byb2Nlc3M6IHRydWUiKQp9CgojIENvbXBhcmUgdGhlIE9DSSBQcm9jZXNzIGZpZWxkIG9mIGEgcG9saWN5IGNvbnRhaW5lciB3aXRoIHRoZSBpbnB1dCBwcm9jZXNzIGZpZWxkIGZyb20gRXhlY1Byb2Nlc3NSZXF1ZXN0CmFsbG93X3Byb2JlX3Byb2Nlc3MocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19wcm9iZV9wcm9jZXNzOiBzdGFydCIpCgogICAgYWxsb3dfcHJvY2Vzc19jb21tb24ocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpCiAgICBhbGxvd19leGVjX2NhcHMoaV9wcm9jZXNzLkNhcGFiaWxpdGllcykKICAgIHBfcHJvY2Vzcy5UZXJtaW5hbCA9PSBpX3Byb2Nlc3MuVGVybWluYWwKCiAgICBwcmludCgiYWxsb3dfcHJvYmVfcHJvY2VzczogdHJ1ZSIpCn0KCmFsbG93X3VzZXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MpIHsKICAgIHBfdXNlciA6PSBwX3Byb2Nlc3MuVXNlcgogICAgaV91c2VyIDo9IGlfcHJvY2Vzcy5Vc2VyCgogICAgcHJpbnQoImFsbG93X3VzZXI6IGlucHV0IHVpZCA9IiwgaV91c2VyLlVJRCwgInBvbGljeSB1aWQgPSIsIHBfdXNlci5VSUQpCiAgICBwX3VzZXIuVUlEID09IGlfdXNlci5VSUQKCiAgICAjIFRPRE86IHRyYWNrIGRvd24gdGhlIHJlYXNvbiBmb3IgcmVnaXN0cnkuazhzLmlvL3BhdXNlOjMuOSBiZWluZwogICAgIyAgICAgICBleGVjdXRlZCB3aXRoIGdpZCA9IDAgZGVzcGl0ZSBoYXZpbmcgIjY1NTM1OjY1NTM1IiBpbiBpdHMgY29udGFpbmVyIGltYWdlCiAgICAjICAgICAgIGNvbmZpZy4KICAgICNwcmludCgiYWxsb3dfdXNlcjogaW5wdXQgZ2lkID0iLCBpX3VzZXIuR0lELCAicG9saWN5IGdpZCA9IiwgcF91c2VyLkdJRCkKICAgICNwX3VzZXIuR0lEID09IGlfdXNlci5HSUQKCiAgICAjIFRPRE86IGNvbXBhcmUgdGhlIGFkZGl0aW9uYWxHaWRzIGZpZWxkIHRvbyBhZnRlciBjb21wdXRpbmcgaXRzIHZhbHVlCiAgICAjIGJhc2VkIG9uIC9ldGMvcGFzc3dkIGFuZCAvZXRjL2dyb3VwIGZyb20gdGhlIGNvbnRhaW5lciBpbWFnZS4KfQoKYWxsb3dfZGVwcmVjYXRlZF9hcmdzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZ3MgMTogbm8gYXJncyIpCgogICAgbm90IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJncwogICAgbm90IGlfcHJvY2Vzcy5BcmdzCgogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAxOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZ3MocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSkgewogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiBwb2xpY3kgYXJncyA9IiwgcF9wcm9jZXNzLkRlcHJlY2F0ZWRBcmdzKQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiBpbnB1dCBhcmdzID0iLCBpX3Byb2Nlc3MuQXJncykKCiAgICBjb3VudChwX3Byb2Nlc3MuRGVwcmVjYXRlZEFyZ3MpID09IGNvdW50KGlfcHJvY2Vzcy5BcmdzKQoKICAgIGV2ZXJ5IGksIGlfYXJnIGluIGlfcHJvY2Vzcy5BcmdzIHsKICAgICAgICBhbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpCiAgICB9CgogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDE6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgcF9hcmcyIDo9IHJlcGxhY2UocF9hcmcsICIkJCIsICIkIikKICAgIHBfYXJnMiA9PSBpX2FyZwoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAxOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDI6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgIyBUT0RPOiBjYW4gJChub2RlLW5hbWUpIGJlIGhhbmRsZWQgYmV0dGVyPwogICAgY29udGFpbnMocF9hcmcsICIkKG5vZGUtbmFtZSkiKQoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAyOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDM6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgcF9hcmcyIDo9IHJlcGxhY2UocF9hcmcsICIkJCIsICIkIikKICAgIHBfYXJnMyA6PSByZXBsYWNlKHBfYXJnMiwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAzOiBwX2FyZzMgPSIsIHBfYXJnMykKICAgIHBfYXJnMyA9PSBpX2FyZwoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAzOiB0cnVlIikKfQoKIyBPQ0kgcHJvY2Vzcy5FbnYgZmllbGQKYWxsb3dfZW52KHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfZW52OiBwIGVudiA9IiwgcF9wcm9jZXNzLkVudikKICAgIHByaW50KCJhbGxvd19lbnY6IGkgZW52ID0iLCBpX3Byb2Nlc3MuRW52KQoKICAgIGV2ZXJ5IGlfdmFyIGluIGlfcHJvY2Vzcy5FbnYgewogICAgICAgIHByaW50KCJhbGxvd19lbnY6IGlfdmFyID0iLCBpX3ZhcikKICAgICAgICBhbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgfQoKICAgIHByaW50KCJhbGxvd19lbnY6IHRydWUiKQp9CgojIEFsbG93IGlucHV0IGVudiB2YXJpYWJsZXMgdGhhdCBhcmUgcHJlc2VudCBpbiB0aGUgcG9saWN5IGRhdGEgdG9vLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHBfdmFyID09IGlfdmFyCiAgICBwcmludCgiYWxsb3dfdmFyIDE6IHRydWUiKQp9CgojIE1hdGNoIGlucHV0IHdpdGggb25lIG9mIHRoZSBwb2xpY3kgdmFyaWFibGVzLCBhZnRlciBzdWJzdGl0dXRpbmcgJChzYW5kYm94LW5hbWUpLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHByaW50KCJhbGxvd192YXIgMjogcF92YXIgPSIsIHBfdmFyKQoKICAgIHBfdmFyX3NwbGl0IDo9IHNwbGl0KHBfdmFyLCAiPSIpCiAgICBjb3VudChwX3Zhcl9zcGxpdCkgPT0gMgoKICAgIHBfdmFyX3NwbGl0WzFdID09ICIkKHNhbmRib3gtbmFtZSkiCgogICAgaV92YXJfc3BsaXQgOj0gc3BsaXQoaV92YXIsICI9IikKICAgIGNvdW50KGlfdmFyX3NwbGl0KSA9PSAyCgogICAgaV92YXJfc3BsaXRbMF0gPT0gcF92YXJfc3BsaXRbMF0KICAgIHJlZ2V4Lm1hdGNoKHNfbmFtZSwgaV92YXJfc3BsaXRbMV0pCgogICAgcHJpbnQoImFsbG93X3ZhciAyOiB0cnVlIikKfQoKIyBBbGxvdyBpbnB1dCBlbnYgdmFyaWFibGVzIHRoYXQgbWF0Y2ggd2l0aCBhIHJlcXVlc3RfZGVmYXVsdHMgcmVnZXguCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHNvbWUgcF9yZWdleDEgaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5DcmVhdGVDb250YWluZXJSZXF1ZXN0LmFsbG93X2Vudl9yZWdleAogICAgcF9yZWdleDIgOj0gcmVwbGFjZShwX3JlZ2V4MSwgIiQoaXB2NF9hKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcHY0X2EpCiAgICBwX3JlZ2V4MyA6PSByZXBsYWNlKHBfcmVnZXgyLCAiJChpcF9wKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcF9wKQogICAgcF9yZWdleDQgOj0gcmVwbGFjZShwX3JlZ2V4MywgIiQoc3ZjX25hbWUpIiwgcG9saWN5X2RhdGEuY29tbW9uLnN2Y19uYW1lKQogICAgcF9yZWdleDUgOj0gcmVwbGFjZShwX3JlZ2V4NCwgIiQoZG5zX2xhYmVsKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5kbnNfbGFiZWwpCgogICAgcHJpbnQoImFsbG93X3ZhciAzOiBwX3JlZ2V4NSA9IiwgcF9yZWdleDUpCiAgICByZWdleC5tYXRjaChwX3JlZ2V4NSwgaV92YXIpCgogICAgcHJpbnQoImFsbG93X3ZhciAzOiB0cnVlIikKfQoKIyBBbGxvdyBmaWVsZFJlZiAiZmllbGRQYXRoOiBzdGF0dXMucG9kSVAiIHZhbHVlcy4KYWxsb3dfdmFyKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBpX3Zhciwgc19uYW1lLCBzX25hbWVzcGFjZSkgewogICAgbmFtZV92YWx1ZSA6PSBzcGxpdChpX3ZhciwgIj0iKQogICAgY291bnQobmFtZV92YWx1ZSkgPT0gMgogICAgaXNfaXAobmFtZV92YWx1ZVsxXSkKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIGFsbG93X3BvZF9pcF92YXIobmFtZV92YWx1ZVswXSwgcF92YXIpCgogICAgcHJpbnQoImFsbG93X3ZhciA0OiB0cnVlIikKfQoKIyBBbGxvdyBjb21tb24gZmllbGRSZWYgdmFyaWFibGVzLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBuYW1lX3ZhbHVlIDo9IHNwbGl0KGlfdmFyLCAiPSIpCiAgICBjb3VudChuYW1lX3ZhbHVlKSA9PSAyCgogICAgc29tZSBwX3ZhciBpbiBwX3Byb2Nlc3MuRW52CiAgICBwX25hbWVfdmFsdWUgOj0gc3BsaXQocF92YXIsICI9IikKICAgIGNvdW50KHBfbmFtZV92YWx1ZSkgPT0gMgoKICAgIHBfbmFtZV92YWx1ZVswXSA9PSBuYW1lX3ZhbHVlWzBdCgogICAgIyBUT0RPOiBzaG91bGQgdGhlc2UgYmUgaGFuZGxlZCBpbiBhIGRpZmZlcmVudCB3YXk/CiAgICBhbHdheXNfYWxsb3dlZCA6PSBbIiQoaG9zdC1uYW1lKSIsICIkKG5vZGUtbmFtZSkiLCAiJChwb2QtdWlkKSJdCiAgICBzb21lIGFsbG93ZWQgaW4gYWx3YXlzX2FsbG93ZWQKICAgIGNvbnRhaW5zKHBfbmFtZV92YWx1ZVsxXSwgYWxsb3dlZCkKCiAgICBwcmludCgiYWxsb3dfdmFyIDU6IHRydWUiKQp9CgojIEFsbG93IGZpZWxkUmVmICJmaWVsZFBhdGg6IHN0YXR1cy5ob3N0SVAiIHZhbHVlcy4KYWxsb3dfdmFyKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBpX3Zhciwgc19uYW1lLCBzX25hbWVzcGFjZSkgewogICAgbmFtZV92YWx1ZSA6PSBzcGxpdChpX3ZhciwgIj0iKQogICAgY291bnQobmFtZV92YWx1ZSkgPT0gMgogICAgaXNfaXAobmFtZV92YWx1ZVsxXSkKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIGFsbG93X2hvc3RfaXBfdmFyKG5hbWVfdmFsdWVbMF0sIHBfdmFyKQoKICAgIHByaW50KCJhbGxvd192YXIgNjogdHJ1ZSIpCn0KCiMgQWxsb3cgcmVzb3VyY2VGaWVsZFJlZiB2YWx1ZXMgKGUuZy4sICJsaW1pdHMuY3B1IikuCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIG5hbWVfdmFsdWUgOj0gc3BsaXQoaV92YXIsICI9IikKICAgIGNvdW50KG5hbWVfdmFsdWUpID09IDIKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHBfbmFtZV92YWx1ZSA6PSBzcGxpdChwX3ZhciwgIj0iKQogICAgY291bnQocF9uYW1lX3ZhbHVlKSA9PSAyCgogICAgcF9uYW1lX3ZhbHVlWzBdID09IG5hbWVfdmFsdWVbMF0KCiAgICAjIGEgdmFyaWFibGUgd2Ugc2hvdWxkIGJlIHZhbGlkYXRpbmcgdXNpbmcgYSByZWdleCBmcm9tIHNldHRpbmdzCiAgICBwX25hbWVfdmFsdWVbMV0gPT0gIiQodmFsaWRhdGUtZnJvbS1zZXR0aW5ncykiCgogICAgcmVnZXhfdmFsIDo9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuQ3JlYXRlQ29udGFpbmVyUmVxdWVzdC5hbGxvd19lbnZfcmVnZXhfbWFwW25hbWVfdmFsdWVbMF1dCgogICAgcHJpbnQoImFsbG93X3ZhciA3OiB2YWwgPSIsIG5hbWVfdmFsdWVbMV0pCiAgICBwcmludCgiYWxsb3dfdmFyIDc6IHJlZ2V4X3ZhbCA9IiwgcmVnZXhfdmFsKQoKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4X3ZhbCwgbmFtZV92YWx1ZVsxXSkKCiAgICBwcmludCgiYWxsb3dfdmFyIDc6IHRydWUiKQp9CgojIE1hdGNoIGlucHV0IHdpdGggb25lIG9mIHRoZSBwb2xpY3kgdmFyaWFibGVzLCBhZnRlciBzdWJzdGl0dXRpbmcgJChzYW5kYm94LW5hbWVzcGFjZSkuCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHNvbWUgcF92YXIgaW4gcF9wcm9jZXNzLkVudgogICAgcF92YXIyIDo9IHJlcGxhY2UocF92YXIsICIkKHNhbmRib3gtbmFtZXNwYWNlKSIsIHNfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd192YXIgODogcF92YXIyID0iLCBwX3ZhcjIpCiAgICBwX3ZhcjIgPT0gaV92YXIKCiAgICBwcmludCgiYWxsb3dfdmFyIDg6IHRydWUiKQp9CgphbGxvd19wb2RfaXBfdmFyKHZhcl9uYW1lLCBwX3ZhcikgewogICAgcHJpbnQoImFsbG93X3BvZF9pcF92YXI6IHZhcl9uYW1lID0iLCB2YXJfbmFtZSwgInBfdmFyID0iLCBwX3ZhcikKCiAgICBwX25hbWVfdmFsdWUgOj0gc3BsaXQocF92YXIsICI9IikKICAgIGNvdW50KHBfbmFtZV92YWx1ZSkgPT0gMgoKICAgIHBfbmFtZV92YWx1ZVswXSA9PSB2YXJfbmFtZQogICAgcF9uYW1lX3ZhbHVlWzFdID09ICIkKHBvZC1pcCkiCgogICAgcHJpbnQoImFsbG93X3BvZF9pcF92YXI6IHRydWUiKQp9CgphbGxvd19ob3N0X2lwX3Zhcih2YXJfbmFtZSwgcF92YXIpIHsKICAgIHByaW50KCJhbGxvd19ob3N0X2lwX3ZhcjogdmFyX25hbWUgPSIsIHZhcl9uYW1lLCAicF92YXIgPSIsIHBfdmFyKQoKICAgIHBfbmFtZV92YWx1ZSA6PSBzcGxpdChwX3ZhciwgIj0iKQogICAgY291bnQocF9uYW1lX3ZhbHVlKSA9PSAyCgogICAgcF9uYW1lX3ZhbHVlWzBdID09IHZhcl9uYW1lCiAgICBwX25hbWVfdmFsdWVbMV0gPT0gIiQoaG9zdC1pcCkiCgogICAgcHJpbnQoImFsbG93X2hvc3RfaXBfdmFyOiB0cnVlIikKfQoKaXNfaXAodmFsdWUpIHsKICAgIGJ5dGVzID0gc3BsaXQodmFsdWUsICIuIikKICAgIGNvdW50KGJ5dGVzKSA9PSA0CgogICAgaXNfaXBfZmlyc3RfYnl0ZShieXRlc1swXSkKICAgIGlzX2lwX290aGVyX2J5dGUoYnl0ZXNbMV0pCiAgICBpc19pcF9vdGhlcl9ieXRlKGJ5dGVzWzJdKQogICAgaXNfaXBfb3RoZXJfYnl0ZShieXRlc1szXSkKfQppc19pcF9maXJzdF9ieXRlKGNvbXBvbmVudCkgewogICAgbnVtYmVyID0gdG9fbnVtYmVyKGNvbXBvbmVudCkKICAgIG51bWJlciA+PSAxCiAgICBudW1iZXIgPD0gMjU1Cn0KaXNfaXBfb3RoZXJfYnl0ZShjb21wb25lbnQpIHsKICAgIG51bWJlciA9IHRvX251bWJlcihjb21wb25lbnQpCiAgICBudW1iZXIgPj0gMAogICAgbnVtYmVyIDw9IDI1NQp9CgojIE9DSSByb290LlBhdGgKYWxsb3dfcm9vdF9wYXRoKHBfb2NpLCBpX29jaSwgYnVuZGxlX2lkKSB7CiAgICBpX3BhdGggOj0gaV9vY2kuUm9vdC5QYXRoCiAgICBwX3BhdGgxIDo9IHBfb2NpLlJvb3QuUGF0aAogICAgcHJpbnQoImFsbG93X3Jvb3RfcGF0aDogaV9wYXRoID0iLCBpX3BhdGgsICJwX3BhdGgxID0iLCBwX3BhdGgxKQoKICAgIHBfcGF0aDIgOj0gcmVwbGFjZShwX3BhdGgxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfcm9vdF9wYXRoOiBwX3BhdGgyID0iLCBwX3BhdGgyKQoKICAgIHBfcGF0aDMgOj0gcmVwbGFjZShwX3BhdGgyLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X3Jvb3RfcGF0aDogcF9wYXRoMyA9IiwgcF9wYXRoMykKCiAgICBwX3BhdGgzID09IGlfcGF0aAoKICAgIHByaW50KCJhbGxvd19yb290X3BhdGg6IHRydWUiKQp9CgojIGRldmljZSBtb3VudHMKYWxsb3dfbW91bnQocF9vY2ksIGlfbW91bnQsIGlfc3RvcmFnZXMsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcHJpbnQoImFsbG93X21vdW50OiBpX21vdW50ID0iLCBpX21vdW50KQoKICAgIHNvbWUgcF9tb3VudCBpbiBwX29jaS5Nb3VudHMKICAgIHNvbWUgaV9zdG9yYWdlIGluIGlfc3RvcmFnZXMKCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IHBfbW91bnQgPSIsIHBfbW91bnQpCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IGlfc3RvcmFnZSA9IiwgaV9zdG9yYWdlKQoKICAgIGNoZWNrX21vdW50KHBfbW91bnQsIGlfbW91bnQsIGlfc3RvcmFnZSwgYnVuZGxlX2lkLCBzYW5kYm94X2lkKQoKICAgICMgVE9ETzogYXJlIHRoZXJlIGFueSBvdGhlciByZXF1aXJlZCBwb2xpY3kgY2hlY2tzIGZvciBtb3VudHMgLSBlLmcuLAogICAgIyAgICAgICBtdWx0aXBsZSBtb3VudHMgd2l0aCBzYW1lIHNvdXJjZSBvciBkZXN0aW5hdGlvbj8KCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IHRydWUiKQp9CgpjaGVja19tb3VudChwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcF9tb3VudCA9PSBpX21vdW50CiAgICBwcmludCgiY2hlY2tfbW91bnQgMTogdHJ1ZSIpCn0KY2hlY2tfbW91bnQocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHBfbW91bnQuZGVzdGluYXRpb24gPT0gaV9tb3VudC5kZXN0aW5hdGlvbgogICAgcF9tb3VudC50eXBlXyA9PSBpX21vdW50LnR5cGVfCiAgICBwX21vdW50Lm9wdGlvbnMgPT0gaV9tb3VudC5vcHRpb25zCgogICAgbW91bnRfc291cmNlX2FsbG93cyhwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkKCiAgICBwcmludCgiY2hlY2tfbW91bnQgMjogdHJ1ZSIpCn0KCm1vdW50X3NvdXJjZV9hbGxvd3MocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHJlZ2V4MSA6PSBwX21vdW50LnNvdXJjZQogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5tb3VudF9zb3VyY2VfY3BhdGgpCiAgICByZWdleDQgOj0gcmVwbGFjZShyZWdleDMsICIkKGJ1bmRsZS1pZCkiLCBidW5kbGVfaWQpCgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMTogcmVnZXg0ID0iLCByZWdleDQpCiAgICByZWdleC5tYXRjaChyZWdleDQsIGlfbW91bnQuc291cmNlKQoKICAgIHByaW50KCJtb3VudF9zb3VyY2VfYWxsb3dzIDE6IHRydWUiKQp9Cm1vdW50X3NvdXJjZV9hbGxvd3MocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHJlZ2V4MSA6PSBwX21vdW50LnNvdXJjZQogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5tb3VudF9zb3VyY2VfY3BhdGgpCiAgICByZWdleDQgOj0gcmVwbGFjZShyZWdleDMsICIkKHNhbmRib3gtaWQpIiwgc2FuZGJveF9pZCkKCiAgICBwcmludCgibW91bnRfc291cmNlX2FsbG93cyAyOiByZWdleDQgPSIsIHJlZ2V4NCkKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4NCwgaV9tb3VudC5zb3VyY2UpCgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMjogdHJ1ZSIpCn0KbW91bnRfc291cmNlX2FsbG93cyhwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogaV9tb3VudC5zb3VyY2UgPSIsIGlfbW91bnQuc291cmNlKQogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogaV9zdG9yYWdlLm1vdW50X3BvaW50ID0iLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCgogICAgaV9tb3VudC5zb3VyY2UgPT0gaV9zdG9yYWdlLm1vdW50X3BvaW50CgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogdHJ1ZSIpCn0KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBDcmVhdGUgY29udGFpbmVyIFN0b3JhZ2VzCgphbGxvd19zdG9yYWdlcyhwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHBfY291bnQgOj0gY291bnQocF9zdG9yYWdlcykKICAgIGlfY291bnQgOj0gY291bnQoaV9zdG9yYWdlcykKICAgIHByaW50KCJhbGxvd19zdG9yYWdlczogcF9jb3VudCA9IiwgcF9jb3VudCwgImlfY291bnQgPSIsIGlfY291bnQpCgogICAgcF9jb3VudCA9PSBpX2NvdW50CgogICAgIyBHZXQgdGhlIGNvbnRhaW5lciBpbWFnZSBsYXllciBJRHMgYW5kIHZlcml0eSByb290IGhhc2hlcywgZnJvbSB0aGUgIm92ZXJsYXlmcyIgc3RvcmFnZS4KICAgIHNvbWUgb3ZlcmxheV9zdG9yYWdlIGluIHBfc3RvcmFnZXMKICAgIG92ZXJsYXlfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIHByaW50KCJhbGxvd19zdG9yYWdlczogb3ZlcmxheV9zdG9yYWdlID0iLCBvdmVybGF5X3N0b3JhZ2UpCiAgICBjb3VudChvdmVybGF5X3N0b3JhZ2Uub3B0aW9ucykgPT0gMgoKICAgIGxheWVyX2lkcyA6PSBzcGxpdChvdmVybGF5X3N0b3JhZ2Uub3B0aW9uc1swXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiBsYXllcl9pZHMgPSIsIGxheWVyX2lkcykKCiAgICByb290X2hhc2hlcyA6PSBzcGxpdChvdmVybGF5X3N0b3JhZ2Uub3B0aW9uc1sxXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiByb290X2hhc2hlcyA9Iiwgcm9vdF9oYXNoZXMpCgogICAgZXZlcnkgaV9zdG9yYWdlIGluIGlfc3RvcmFnZXMgewogICAgICAgIGFsbG93X3N0b3JhZ2UocF9zdG9yYWdlcywgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpCiAgICB9CgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiB0cnVlIikKfQoKYWxsb3dfc3RvcmFnZShwX3N0b3JhZ2VzLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgc29tZSBwX3N0b3JhZ2UgaW4gcF9zdG9yYWdlcwoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiBwX3N0b3JhZ2UgPSIsIHBfc3RvcmFnZSkKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiBpX3N0b3JhZ2UgPSIsIGlfc3RvcmFnZSkKCiAgICBwX3N0b3JhZ2UuZHJpdmVyICAgICAgICAgICA9PSBpX3N0b3JhZ2UuZHJpdmVyCiAgICBwX3N0b3JhZ2UuZHJpdmVyX29wdGlvbnMgICA9PSBpX3N0b3JhZ2UuZHJpdmVyX29wdGlvbnMKICAgIHBfc3RvcmFnZS5mc19ncm91cCAgICAgICAgID09IGlfc3RvcmFnZS5mc19ncm91cAogICAgcF9zdG9yYWdlLmZzdHlwZSAgICAgICAgICAgPT0gaV9zdG9yYWdlLmZzdHlwZQoKICAgIGFsbG93X3N0b3JhZ2Vfc291cmNlKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKQogICAgYWxsb3dfc3RvcmFnZV9vcHRpb25zKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKQogICAgYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKQoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiB0cnVlIikKfQoKYWxsb3dfc3RvcmFnZV9zb3VyY2UocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX3NvdXJjZSAxOiBzdGFydCIpCgogICAgcF9zdG9yYWdlLnNvdXJjZSA9PSBpX3N0b3JhZ2Uuc291cmNlCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDE6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX3NvdXJjZShwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDI6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCgogICAgIyBEREREOkJCOkRELkY6IERvbWFpbjpCdXM6RGV2aWNlLkZ1bmN0aW9uCiAgICAjIGh0dHBzOi8vd3d3Lmtlcm5lbC5vcmcvZG9jL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtYnVzLXBjaQogICAgcmVnZXgubWF0Y2goYF5bYS1mMC05XXs0fTpbYS1mMC05XXsyfTpbYS1mMC05XXsyfVwuW2EtZjAtOV0kYCwgaV9zdG9yYWdlLnNvdXJjZSkKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9zb3VyY2UgMjogdHJ1ZSIpCn0KCmFsbG93X3N0b3JhZ2Vfc291cmNlKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKSB7CiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9zb3VyY2UgMzogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIGlfc3RvcmFnZS5zb3VyY2UgPT0gIm5vbmUiCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDM6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX3NvdXJjZShwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDQ6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJzbWIiCgogICAgIyBQYXR0ZXJuOiAvLzxzdG9yYWdlLWFjY291bnQtbmFtZT4uZmlsZS5jb3JlLndpbmRvd3MubmV0LzxrOHMtUFZDLW5hbWU+CiAgICAjIFN0b3JhZ2UgYWNjb3VudCBuYW1lOiBodHRwczovL2xlYXJuLm1pY3Jvc29mdC5jb20vZW4tdXMvYXp1cmUvc3RvcmFnZS9jb21tb24vc3RvcmFnZS1hY2NvdW50LW92ZXJ2aWV3I3N0b3JhZ2UtYWNjb3VudC1uYW1lCiAgICAjIEs4cyBQVkMgbmFtZTogaHR0cHM6Ly9rdWJlcm5ldGVzLmlvL2RvY3MvY29uY2VwdHMvb3ZlcnZpZXcvd29ya2luZy13aXRoLW9iamVjdHMvbmFtZXMvI2Rucy1zdWJkb21haW4tbmFtZXMKICAgIHJlZ2V4Lm1hdGNoKGBeXC9cLyhbYS16MC05XXszLDI0fSlcLmZpbGVcLmNvcmVcLndpbmRvd3NcLm5ldFwvW2EtejAtOV0oW2EtejAtOS4tXXswLDI1MX1bYS16MC05XSk/JGAsIGlfc3RvcmFnZS5zb3VyY2UpCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDQ6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMTogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgIT0gIm92ZXJsYXlmcyIKICAgIHBfc3RvcmFnZS5vcHRpb25zID09IGlfc3RvcmFnZS5vcHRpb25zCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAxOiB0cnVlIikKfQphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIGNvdW50KHBfc3RvcmFnZS5vcHRpb25zKSA9PSAyCgogICAgcG9saWN5X2lkcyA6PSBzcGxpdChwX3N0b3JhZ2Uub3B0aW9uc1swXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBwb2xpY3lfaWRzID0iLCBwb2xpY3lfaWRzKQogICAgcG9saWN5X2lkcyA9PSBsYXllcl9pZHMKCiAgICBwb2xpY3lfaGFzaGVzIDo9IHNwbGl0KHBfc3RvcmFnZS5vcHRpb25zWzFdLCAiOiIpCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IHBvbGljeV9oYXNoZXMgPSIsIHBvbGljeV9oYXNoZXMpCgogICAgcF9jb3VudCA6PSBjb3VudChwb2xpY3lfaWRzKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBwX2NvdW50ID0iLCBwX2NvdW50KQogICAgcF9jb3VudCA+PSAxCiAgICBwX2NvdW50ID09IGNvdW50KHBvbGljeV9oYXNoZXMpCgogICAgaV9jb3VudCA6PSBjb3VudChpX3N0b3JhZ2Uub3B0aW9ucykKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogaV9jb3VudCA9IiwgaV9jb3VudCkKICAgIGlfY291bnQgPT0gcF9jb3VudCArIDMKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zWzBdID0iLCBpX3N0b3JhZ2Uub3B0aW9uc1swXSkKICAgIGlfc3RvcmFnZS5vcHRpb25zWzBdID09ICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQubGF5ZXItc3JjLXByZWZpeD0vdmFyL2xpYi9jb250YWluZXJkL2lvLmNvbnRhaW5lcmQuc25hcHNob3R0ZXIudjEudGFyZGV2L2xheWVycyIKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zW2lfY291bnQgLSAyXSA9IiwgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDJdKQogICAgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDJdID09ICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQub3ZlcmxheS1ydyIKCiAgICBsb3dlcmRpciA6PSBjb25jYXQoIj0iLCBbImxvd2VyZGlyIiwgcF9zdG9yYWdlLm9wdGlvbnNbMF1dKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBsb3dlcmRpciA9IiwgbG93ZXJkaXIpCgogICAgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDFdID09IGxvd2VyZGlyCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zW2lfY291bnQgLSAxXSA9IiwgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDFdKQoKICAgIGV2ZXJ5IGksIHBvbGljeV9pZCBpbiBwb2xpY3lfaWRzIHsKICAgICAgICBhbGxvd19vdmVybGF5X2xheWVyKHBvbGljeV9pZCwgcG9saWN5X2hhc2hlc1tpXSwgaV9zdG9yYWdlLm9wdGlvbnNbaSArIDFdKQogICAgfQoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogdHJ1ZSIpCn0KYWxsb3dfc3RvcmFnZV9vcHRpb25zKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKSB7CiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDM6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCiAgICBjb3VudChwX3N0b3JhZ2Uub3B0aW9ucykgPT0gMQoKICAgIHN0YXJ0c3dpdGgocF9zdG9yYWdlLm9wdGlvbnNbMF0sICIkKGhhc2giKQogICAgaGFzaF9zdWZmaXggOj0gdHJpbV9sZWZ0KHBfc3RvcmFnZS5vcHRpb25zWzBdLCAiJChoYXNoIikKCiAgICBlbmRzd2l0aChoYXNoX3N1ZmZpeCwgIikiKQogICAgaGFzaF9pbmRleCA6PSB0cmltX3JpZ2h0KGhhc2hfc3VmZml4LCAiKSIpCiAgICBpIDo9IHRvX251bWJlcihoYXNoX2luZGV4KQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAzOiBpID0iLCBpKQoKICAgIGhhc2hfb3B0aW9uIDo9IGNvbmNhdCgiPSIsIFsiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LnJvb3QtaGFzaCIsIHJvb3RfaGFzaGVzW2ldXSkKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMzogaGFzaF9vcHRpb24gPSIsIGhhc2hfb3B0aW9uKQoKICAgIGNvdW50KGlfc3RvcmFnZS5vcHRpb25zKSA9PSA0CiAgICBpX3N0b3JhZ2Uub3B0aW9uc1swXSA9PSAicm8iCiAgICBpX3N0b3JhZ2Uub3B0aW9uc1sxXSA9PSAiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmJsb2NrX2RldmljZT1maWxlIgogICAgaV9zdG9yYWdlLm9wdGlvbnNbMl0gPT0gImlvLmthdGFjb250YWluZXJzLmZzLW9wdC5pcy1sYXllciIKICAgIGlfc3RvcmFnZS5vcHRpb25zWzNdID09IGhhc2hfb3B0aW9uCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAzOiB0cnVlIikKfQphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgNDogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gInNtYiIKICAgIHBfb3B0c19jb3VudCA6PSBjb3VudChwX3N0b3JhZ2Uub3B0aW9ucykKICAgIGlfb3B0c19jb3VudCA6PSBjb3VudChpX3N0b3JhZ2Uub3B0aW9ucykKICAgIGlfb3B0c19jb3VudCA9PSBwX29wdHNfY291bnQgKyAyCgogICAgaV9vcHRfbWF0Y2hlcyA6PSBbaSB8IGkgOj0gaWR4OyBpZHggPCBwX29wdHNfY291bnQ7IHBfc3RvcmFnZS5vcHRpb25zW2lkeF0gPT0gaV9zdG9yYWdlLm9wdGlvbnNbaWR4XV0KICAgIGNvdW50KGlfb3B0X21hdGNoZXMpID09IHBfb3B0c19jb3VudAoKICAgIHN0YXJ0c3dpdGgoaV9zdG9yYWdlLm9wdGlvbnNbaV9vcHRzX2NvdW50LTJdLCAiYWRkcj0iKQogICAgY3JlZHMgPSBzcGxpdChpX3N0b3JhZ2Uub3B0aW9uc1tpX29wdHNfY291bnQtMV0sICIsIikKICAgIGNvdW50KGNyZWRzKSA9PSAyCiAgICBzdGFydHN3aXRoKGNyZWRzWzBdLCAidXNlcm5hbWU9IikKICAgIHN0YXJ0c3dpdGgoY3JlZHNbMV0sICJwYXNzd29yZD0iKQogICAgCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDQ6IHRydWUiKQp9CgphbGxvd19vdmVybGF5X2xheWVyKHBvbGljeV9pZCwgcG9saWN5X2hhc2gsIGlfb3B0aW9uKSB7CiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogcG9saWN5X2lkID0iLCBwb2xpY3lfaWQsICJwb2xpY3lfaGFzaCA9IiwgcG9saWN5X2hhc2gpCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogaV9vcHRpb24gPSIsIGlfb3B0aW9uKQoKICAgIHN0YXJ0c3dpdGgoaV9vcHRpb24sICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQubGF5ZXI9IikKICAgIGlfdmFsdWUgOj0gcmVwbGFjZShpX29wdGlvbiwgImlvLmthdGFjb250YWluZXJzLmZzLW9wdC5sYXllcj0iLCAiIikKICAgIGlfdmFsdWVfZGVjb2RlZCA6PSBiYXNlNjQuZGVjb2RlKGlfdmFsdWUpCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogaV92YWx1ZV9kZWNvZGVkID0iLCBpX3ZhbHVlX2RlY29kZWQpCgogICAgcG9saWN5X3N1ZmZpeCA6PSBjb25jYXQoIj0iLCBbInRhcixybyxpby5rYXRhY29udGFpbmVycy5mcy1vcHQuYmxvY2tfZGV2aWNlPWZpbGUsaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmlzLWxheWVyLGlvLmthdGFjb250YWluZXJzLmZzLW9wdC5yb290LWhhc2giLCBwb2xpY3lfaGFzaF0pCiAgICBwX3ZhbHVlIDo9IGNvbmNhdCgiLCIsIFtwb2xpY3lfaWQsIHBvbGljeV9zdWZmaXhdKQogICAgcHJpbnQoImFsbG93X292ZXJsYXlfbGF5ZXI6IHBfdmFsdWUgPSIsIHBfdmFsdWUpCgogICAgcF92YWx1ZSA9PSBpX3ZhbHVlX2RlY29kZWQKCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogdHJ1ZSIpCn0KCmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAidGFyIgoKICAgIHN0YXJ0c3dpdGgocF9zdG9yYWdlLm1vdW50X3BvaW50LCAiJChsYXllciIpCiAgICBtb3VudF9zdWZmaXggOj0gdHJpbV9sZWZ0KHBfc3RvcmFnZS5tb3VudF9wb2ludCwgIiQobGF5ZXIiKQoKICAgIGVuZHN3aXRoKG1vdW50X3N1ZmZpeCwgIikiKQogICAgbGF5ZXJfaW5kZXggOj0gdHJpbV9yaWdodChtb3VudF9zdWZmaXgsICIpIikKICAgIGkgOj0gdG9fbnVtYmVyKGxheWVyX2luZGV4KQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDE6IGkgPSIsIGkpCgogICAgbGF5ZXJfaWQgOj0gbGF5ZXJfaWRzW2ldCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMTogbGF5ZXJfaWQgPSIsIGxheWVyX2lkKQoKICAgIHBfbW91bnQgOj0gY29uY2F0KCIvIiwgWyIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L2xheWVycyIsIGxheWVyX2lkXSkKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCAxOiBwX21vdW50ID0iLCBwX21vdW50KQoKICAgIHBfbW91bnQgPT0gaV9zdG9yYWdlLm1vdW50X3BvaW50CgogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDE6IHRydWUiKQp9CmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAiZnVzZTMua2F0YS1vdmVybGF5IgoKICAgIG1vdW50MSA6PSByZXBsYWNlKHBfc3RvcmFnZS5tb3VudF9wb2ludCwgIiQoY3BhdGgpIiwgcG9saWN5X2RhdGEuY29tbW9uLmNwYXRoKQogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDI6IG1vdW50MiA9IiwgbW91bnQyKQoKICAgIG1vdW50MiA9PSBpX3N0b3JhZ2UubW91bnRfcG9pbnQKCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMjogdHJ1ZSIpCn0KYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKSB7CiAgICBwX3N0b3JhZ2UuZnN0eXBlID09ICJsb2NhbCIKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQyID0iLCBtb3VudDIpCgogICAgbW91bnQzIDo9IHJlcGxhY2UobW91bnQyLCAiJChzYW5kYm94LWlkKSIsIHNhbmRib3hfaWQpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQzID0iLCBtb3VudDMpCgogICAgcmVnZXgubWF0Y2gobW91bnQzLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCgogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDM6IHRydWUiKQp9CmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAiYmluZCIKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNDogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNDogbW91bnQyID0iLCBtb3VudDIpCgogICAgbW91bnQzIDo9IHJlcGxhY2UobW91bnQyLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDQ6IG1vdW50MyA9IiwgbW91bnQzKQoKICAgIHJlZ2V4Lm1hdGNoKG1vdW50MywgaV9zdG9yYWdlLm1vdW50X3BvaW50KQoKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA0OiB0cnVlIikKfQphbGxvd19tb3VudF9wb2ludChwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgYnVuZGxlX2lkLCBzYW5kYm94X2lkLCBsYXllcl9pZHMpIHsKICAgIHBfc3RvcmFnZS5mc3R5cGUgPT0gInRtcGZzIgoKICAgIG1vdW50MSA6PSBwX3N0b3JhZ2UubW91bnRfcG9pbnQKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA1OiBtb3VudDEgPSIsIG1vdW50MSkKCiAgICByZWdleC5tYXRjaChtb3VudDEsIGlfc3RvcmFnZS5tb3VudF9wb2ludCkKCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNTogdHJ1ZSIpCn0KYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKSB7CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogaV9zdG9yYWdlLm1vdW50X3BvaW50ID0iLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCiAgICBhbGxvd19kaXJlY3Rfdm9sX2RyaXZlcihwX3N0b3JhZ2UsIGlfc3RvcmFnZSkKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChzcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQyID0iLCBtb3VudDIpCgogICAgZGlyZWN0X3ZvbF9wYXRoIDo9IGlfc3RvcmFnZS5zb3VyY2UKICAgIG1vdW50MyA6PSByZXBsYWNlKG1vdW50MiwgIiQoYjY0LWRpcmVjdC12b2wtcGF0aCkiLCBiYXNlNjR1cmwuZW5jb2RlKGRpcmVjdF92b2xfcGF0aCkpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQzID0iLCBtb3VudDMpCgogICAgbW91bnQzID09IGlfc3RvcmFnZS5tb3VudF9wb2ludAoKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA2OiB0cnVlIikKfQoKYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIocF9zdG9yYWdlLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19kaXJlY3Rfdm9sX2RyaXZlciAxOiBzdGFydCIpCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCiAgICBwcmludCgiYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIgMTogdHJ1ZSIpCn0KYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIocF9zdG9yYWdlLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19kaXJlY3Rfdm9sX2RyaXZlciAyOiBzdGFydCIpCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJzbWIiCiAgICBwcmludCgiYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIgMjogdHJ1ZSIpCn0KCiMgRXhlY1Byb2Nlc3NSZXF1ZXN0LnByb2Nlc3MuQ2FwYWJpbGl0aWVzCmFsbG93X2V4ZWNfY2FwcyhpX2NhcHMpIHsKICAgIG5vdCBpX2NhcHMuQW1iaWVudAogICAgbm90IGlfY2Fwcy5Cb3VuZGluZwogICAgbm90IGlfY2Fwcy5FZmZlY3RpdmUKICAgIG5vdCBpX2NhcHMuSW5oZXJpdGFibGUKICAgIG5vdCBpX2NhcHMuUGVybWl0dGVkCn0KCiMgT0NJLlByb2Nlc3MuQ2FwYWJpbGl0aWVzCmFsbG93X2NhcHMocF9jYXBzLCBpX2NhcHMpIHsKICAgIHByaW50KCJhbGxvd19jYXBzOiBwb2xpY3kgQW1iaWVudCA9IiwgcF9jYXBzLkFtYmllbnQpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgQW1iaWVudCA9IiwgaV9jYXBzLkFtYmllbnQpCiAgICBtYXRjaF9jYXBzKHBfY2Fwcy5BbWJpZW50LCBpX2NhcHMuQW1iaWVudCkKCiAgICBwcmludCgiYWxsb3dfY2FwczogcG9saWN5IEJvdW5kaW5nID0iLCBwX2NhcHMuQm91bmRpbmcpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgQm91bmRpbmcgPSIsIGlfY2Fwcy5Cb3VuZGluZykKICAgIG1hdGNoX2NhcHMocF9jYXBzLkJvdW5kaW5nLCBpX2NhcHMuQm91bmRpbmcpCgogICAgcHJpbnQoImFsbG93X2NhcHM6IHBvbGljeSBFZmZlY3RpdmUgPSIsIHBfY2Fwcy5FZmZlY3RpdmUpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgRWZmZWN0aXZlID0iLCBpX2NhcHMuRWZmZWN0aXZlKQogICAgbWF0Y2hfY2FwcyhwX2NhcHMuRWZmZWN0aXZlLCBpX2NhcHMuRWZmZWN0aXZlKQoKICAgIHByaW50KCJhbGxvd19jYXBzOiBwb2xpY3kgSW5oZXJpdGFibGUgPSIsIHBfY2Fwcy5Jbmhlcml0YWJsZSkKICAgIHByaW50KCJhbGxvd19jYXBzOiBpbnB1dCBJbmhlcml0YWJsZSA9IiwgaV9jYXBzLkluaGVyaXRhYmxlKQogICAgbWF0Y2hfY2FwcyhwX2NhcHMuSW5oZXJpdGFibGUsIGlfY2Fwcy5Jbmhlcml0YWJsZSkKCiAgICBwcmludCgiYWxsb3dfY2FwczogcG9saWN5IFBlcm1pdHRlZCA9IiwgcF9jYXBzLlBlcm1pdHRlZCkKICAgIHByaW50KCJhbGxvd19jYXBzOiBpbnB1dCBQZXJtaXR0ZWQgPSIsIGlfY2Fwcy5QZXJtaXR0ZWQpCiAgICBtYXRjaF9jYXBzKHBfY2Fwcy5QZXJtaXR0ZWQsIGlfY2Fwcy5QZXJtaXR0ZWQpCn0KCm1hdGNoX2NhcHMocF9jYXBzLCBpX2NhcHMpIHsKICAgIHByaW50KCJtYXRjaF9jYXBzIDE6IHN0YXJ0IikKCiAgICBwX2NhcHMgPT0gaV9jYXBzCgogICAgcHJpbnQoIm1hdGNoX2NhcHMgMTogdHJ1ZSIpCn0KbWF0Y2hfY2FwcyhwX2NhcHMsIGlfY2FwcykgewogICAgcHJpbnQoIm1hdGNoX2NhcHMgMjogc3RhcnQiKQoKICAgIGNvdW50KHBfY2FwcykgPT0gMQogICAgcF9jYXBzWzBdID09ICIkKGRlZmF1bHRfY2FwcykiCgogICAgcHJpbnQoIm1hdGNoX2NhcHMgMjogZGVmYXVsdF9jYXBzID0iLCBwb2xpY3lfZGF0YS5jb21tb24uZGVmYXVsdF9jYXBzKQogICAgcG9saWN5X2RhdGEuY29tbW9uLmRlZmF1bHRfY2FwcyA9PSBpX2NhcHMKCiAgICBwcmludCgibWF0Y2hfY2FwcyAyOiB0cnVlIikKfQptYXRjaF9jYXBzKHBfY2FwcywgaV9jYXBzKSB7CiAgICBwcmludCgibWF0Y2hfY2FwcyAzOiBzdGFydCIpCgogICAgY291bnQocF9jYXBzKSA9PSAxCiAgICBwX2NhcHNbMF0gPT0gIiQocHJpdmlsZWdlZF9jYXBzKSIKCiAgICBwcmludCgibWF0Y2hfY2FwcyAzOiBwcml2aWxlZ2VkX2NhcHMgPSIsIHBvbGljeV9kYXRhLmNvbW1vbi5wcml2aWxlZ2VkX2NhcHMpCiAgICBwb2xpY3lfZGF0YS5jb21tb24ucHJpdmlsZWdlZF9jYXBzID09IGlfY2FwcwoKICAgIHByaW50KCJtYXRjaF9jYXBzIDM6IHRydWUiKQp9CgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgpjaGVja19kaXJlY3RvcnlfdHJhdmVyc2FsKGlfcGF0aCkgewogICAgbm90IHJlZ2V4Lm1hdGNoKCIoXnwvKS4uKCR8LykiLCBpX3BhdGgpCn0KCmNoZWNrX3N5bWxpbmtfc291cmNlKGlfc3JjKSB7CiAgICBpX3NyYyA9PSAiIgogICAgcHJpbnQoImNoZWNrX3N5bWxpbmtfc291cmNlIDE6IHRydWUiKQp9CmNoZWNrX3N5bWxpbmtfc291cmNlKGlfc3JjKSB7CiAgICBpX3NyYyAhPSAiIgogICAgcHJpbnQoImNoZWNrX3N5bWxpbmtfc291cmNlIDI6IGlfc3JjID0iLCBpX3NyYykKCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24uc19zb3VyY2UxLCBpX3NyYykKCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMjogdHJ1ZSIpCn0KY2hlY2tfc3ltbGlua19zb3VyY2UoaV9zcmMpIHsKICAgIGlfc3JjICE9ICIiCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMzogaV9zcmMgPSIsIGlfc3JjKQoKICAgIHJlZ2V4Lm1hdGNoKHBvbGljeV9kYXRhLmNvbW1vbi5zX3NvdXJjZTIsIGlfc3JjKQogICAgY2hlY2tfZGlyZWN0b3J5X3RyYXZlcnNhbChpX3NyYykKCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMzogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfc3RvcmFnZXMoaV9zdG9yYWdlcykgewogICAgcHJpbnQoImFsbG93X3NhbmRib3hfc3RvcmFnZXM6IGlfc3RvcmFnZXMgPSIsIGlfc3RvcmFnZXMpCgogICAgcF9zdG9yYWdlcyA6PSBwb2xpY3lfZGF0YS5zYW5kYm94LnN0b3JhZ2VzCiAgICBldmVyeSBpX3N0b3JhZ2UgaW4gaV9zdG9yYWdlcyB7CiAgICAgICAgYWxsb3dfc2FuZGJveF9zdG9yYWdlKHBfc3RvcmFnZXMsIGlfc3RvcmFnZSkKICAgIH0KCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9zdG9yYWdlczogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfc3RvcmFnZShwX3N0b3JhZ2VzLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IGlfc3RvcmFnZSA9IiwgaV9zdG9yYWdlKQoKICAgIHNvbWUgcF9zdG9yYWdlIGluIHBfc3RvcmFnZXMKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IHBfc3RvcmFnZSA9IiwgcF9zdG9yYWdlKQogICAgaV9zdG9yYWdlID09IHBfc3RvcmFnZQoKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IHRydWUiKQp9CgpDb3B5RmlsZVJlcXVlc3QgewogICAgcHJpbnQoIkNvcHlGaWxlUmVxdWVzdDogaW5wdXQucGF0aCA9IiwgaW5wdXQucGF0aCkKCiAgICBjaGVja19zeW1saW5rX3NvdXJjZShpbnB1dC5zeW1saW5rX3NyYykKICAgIGNoZWNrX2RpcmVjdG9yeV90cmF2ZXJzYWwoaW5wdXQucGF0aCkKCiAgICBzb21lIHJlZ2V4MSBpbiBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLkNvcHlGaWxlUmVxdWVzdAogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5jcGF0aCkKICAgIHJlZ2V4NCA6PSByZXBsYWNlKHJlZ2V4MywgIiQoYnVuZGxlLWlkKSIsIEJVTkRMRV9JRCkKICAgIHByaW50KCJDb3B5RmlsZVJlcXVlc3Q6IHJlZ2V4NCA9IiwgcmVnZXg0KQoKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4NCwgaW5wdXQucGF0aCkKCiAgICBwcmludCgiQ29weUZpbGVSZXF1ZXN0OiB0cnVlIikKfQoKQ3JlYXRlU2FuZGJveFJlcXVlc3QgewogICAgcHJpbnQoIkNyZWF0ZVNhbmRib3hSZXF1ZXN0OiBpbnB1dC5ndWVzdF9ob29rX3BhdGggPSIsIGlucHV0Lmd1ZXN0X2hvb2tfcGF0aCkKICAgIGNvdW50KGlucHV0Lmd1ZXN0X2hvb2tfcGF0aCkgPT0gMAoKICAgIHByaW50KCJDcmVhdGVTYW5kYm94UmVxdWVzdDogaW5wdXQua2VybmVsX21vZHVsZXMgPSIsIGlucHV0Lmtlcm5lbF9tb2R1bGVzKQogICAgY291bnQoaW5wdXQua2VybmVsX21vZHVsZXMpID09IDAKCiAgICBpX3BpZG5zIDo9IGlucHV0LnNhbmRib3hfcGlkbnMKICAgIHByaW50KCJDcmVhdGVTYW5kYm94UmVxdWVzdDogaV9waWRucyA9IiwgaV9waWRucykKICAgIGlfcGlkbnMgPT0gZmFsc2UKICAgIGFsbG93X3NhbmRib3hfc3RvcmFnZXMoaW5wdXQuc3RvcmFnZXMpCn0KCmFsbG93X2V4ZWMocF9jb250YWluZXIsIGlfcHJvY2VzcykgewogICAgcHJpbnQoImFsbG93X2V4ZWM6IHN0YXJ0IikKCiAgICBwX29jaSA9IHBfY29udGFpbmVyLk9DSQogICAgcF9zX25hbWUgPSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc19uYW1lc3BhY2UgPSBnZXRfc3RhdGVfdmFsKCJuYW1lc3BhY2UiKQogICAgYWxsb3dfcHJvYmVfcHJvY2VzcyhwX29jaS5Qcm9jZXNzLCBpX3Byb2Nlc3MsIHBfc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfZXhlYzogdHJ1ZSIpCn0KCmFsbG93X2ludGVyYWN0aXZlX2V4ZWMocF9jb250YWluZXIsIGlfcHJvY2VzcykgewogICAgcHJpbnQoImFsbG93X2ludGVyYWN0aXZlX2V4ZWM6IHN0YXJ0IikKCiAgICBwX29jaSA9IHBfY29udGFpbmVyLk9DSQogICAgcF9zX25hbWUgPSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc19uYW1lc3BhY2UgPSBnZXRfc3RhdGVfdmFsKCJuYW1lc3BhY2UiKQogICAgYWxsb3dfaW50ZXJhY3RpdmVfcHJvY2VzcyhwX29jaS5Qcm9jZXNzLCBpX3Byb2Nlc3MsIHBfc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfaW50ZXJhY3RpdmVfZXhlYzogdHJ1ZSIpCn0KCiMgVE9ETzogc2hvdWxkIG90aGVyIEV4ZWNQcm9jZXNzUmVxdWVzdCBpbnB1dCBkYXRhIGZpZWxkcyBiZSB2YWxpZGF0ZWQgYXMgd2VsbD8KRXhlY1Byb2Nlc3NSZXF1ZXN0IHsKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMTogaW5wdXQgPSIsIGlucHV0KQoKICAgIHNvbWUgcF9jb21tYW5kIGluIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuRXhlY1Byb2Nlc3NSZXF1ZXN0LmFsbG93ZWRfY29tbWFuZHMKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMTogcF9jb21tYW5kID0iLCBwX2NvbW1hbmQpCiAgICBwX2NvbW1hbmQgPT0gaW5wdXQucHJvY2Vzcy5BcmdzCgogICAgIyBUT0RPOiBtYXRjaCBwX2NvbnRhaW5lcidzIElEIHdpdGggdGhlIGlucHV0IGNvbnRhaW5lcl9pZC4KICAgIHNvbWUgcF9jb250YWluZXIgaW4gcG9saWN5X2RhdGEuY29udGFpbmVycwogICAgYWxsb3dfaW50ZXJhY3RpdmVfZXhlYyhwX2NvbnRhaW5lciwgaW5wdXQucHJvY2VzcykKCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDE6IHRydWUiKQp9CkV4ZWNQcm9jZXNzUmVxdWVzdCB7CiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDI6IGlucHV0ID0iLCBpbnB1dCkKCiAgICAjIFRPRE86IG1hdGNoIGlucHV0IGNvbnRhaW5lciBJRCB3aXRoIGl0cyBjb3JyZXNwb25kaW5nIGNvbnRhaW5lci5leGVjX2NvbW1hbmRzLgogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBzb21lIHBfY29tbWFuZCBpbiBwX2NvbnRhaW5lci5leGVjX2NvbW1hbmRzCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDI6IHBfY29tbWFuZCA9IiwgcF9jb21tYW5kKQoKICAgICMgVE9ETzogc2hvdWxkIG90aGVyIGlucHV0IGRhdGEgZmllbGRzIGJlIHZhbGlkYXRlZCBhcyB3ZWxsPwogICAgcF9jb21tYW5kID09IGlucHV0LnByb2Nlc3MuQXJncwoKICAgIGFsbG93X2V4ZWMocF9jb250YWluZXIsIGlucHV0LnByb2Nlc3MpCgogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAyOiB0cnVlIikKfQpFeGVjUHJvY2Vzc1JlcXVlc3QgewogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAzOiBpbnB1dCA9IiwgaW5wdXQpCgogICAgaV9jb21tYW5kID0gY29uY2F0KCIgIiwgaW5wdXQucHJvY2Vzcy5BcmdzKQogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAzOiBpX2NvbW1hbmQgPSIsIGlfY29tbWFuZCkKCiAgICBzb21lIHBfcmVnZXggaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5FeGVjUHJvY2Vzc1JlcXVlc3QucmVnZXgKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMzogcF9yZWdleCA9IiwgcF9yZWdleCkKCiAgICByZWdleC5tYXRjaChwX3JlZ2V4LCBpX2NvbW1hbmQpCgogICAgIyBUT0RPOiBtYXRjaCBwX2NvbnRhaW5lcidzIElEIHdpdGggdGhlIGlucHV0IGNvbnRhaW5lcl9pZC4KICAgIHNvbWUgcF9jb250YWluZXIgaW4gcG9saWN5X2RhdGEuY29udGFpbmVycwogICAgYWxsb3dfaW50ZXJhY3RpdmVfZXhlYyhwX2NvbnRhaW5lciwgaW5wdXQucHJvY2VzcykKCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDM6IHRydWUiKQp9CgpVcGRhdGVSb3V0ZXNSZXF1ZXN0IHsKICAgIHByaW50KCJVcGRhdGVSb3V0ZXNSZXF1ZXN0OiBpbnB1dCA9IiwgaW5wdXQpCiAgICBwcmludCgiVXBkYXRlUm91dGVzUmVxdWVzdDogcG9saWN5ID0iLCBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLlVwZGF0ZVJvdXRlc1JlcXVlc3QpCgogICAgaV9yb3V0ZXMgOj0gaW5wdXQucm91dGVzLlJvdXRlcwogICAgcF9zb3VyY2VfcmVnZXggPSBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLlVwZGF0ZVJvdXRlc1JlcXVlc3QuZm9yYmlkZGVuX3NvdXJjZV9yZWdleAogICAgcF9uYW1lcyA9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuVXBkYXRlUm91dGVzUmVxdWVzdC5mb3JiaWRkZW5fZGV2aWNlX25hbWVzCgogICAgZXZlcnkgaV9yb3V0ZSBpbiBpX3JvdXRlcyB7CiAgICAgICAgcHJpbnQoImlfcm91dGUuc291cmNlID0iLCBpX3JvdXRlLnNvdXJjZSkKICAgICAgICBldmVyeSBwX3JlZ2V4IGluIHBfc291cmNlX3JlZ2V4IHsKICAgICAgICAgICAgcHJpbnQoInBfcmVnZXggPSIsIHBfcmVnZXgpCiAgICAgICAgICAgIG5vdCByZWdleC5tYXRjaChwX3JlZ2V4LCBpX3JvdXRlLnNvdXJjZSkKICAgICAgICB9CgogICAgICAgIHByaW50KCJpX3JvdXRlLmRldmljZSA9IiwgaV9yb3V0ZS5kZXZpY2UpCiAgICAgICAgbm90IGlfcm91dGUuZGV2aWNlIGluIHBfbmFtZXMKICAgIH0KCiAgICBwcmludCgiVXBkYXRlUm91dGVzUmVxdWVzdDogdHJ1ZSIpCn0KClVwZGF0ZUludGVyZmFjZVJlcXVlc3QgewogICAgcHJpbnQoIlVwZGF0ZUludGVyZmFjZVJlcXVlc3Q6IGlucHV0ID0iLCBpbnB1dCkKICAgIHByaW50KCJVcGRhdGVJbnRlcmZhY2VSZXF1ZXN0OiBwb2xpY3kgPSIsIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuVXBkYXRlSW50ZXJmYWNlUmVxdWVzdCkKCiAgICBpX2ludGVyZmFjZSA6PSBpbnB1dC5pbnRlcmZhY2UKICAgIHBfZmxhZ3MgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmFsbG93X3Jhd19mbGFncwoKICAgICMgVHlwaWNhbGx5LCBqdXN0IElGRl9OT0FSUCBpcyB1c2VkLgogICAgYml0cy5hbmQoaV9pbnRlcmZhY2UucmF3X2ZsYWdzLCBiaXRzLm5lZ2F0ZShwX2ZsYWdzKSkgPT0gMAoKICAgIHBfbmFtZXMgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmZvcmJpZGRlbl9uYW1lcwoKICAgIG5vdCBpX2ludGVyZmFjZS5uYW1lIGluIHBfbmFtZXMKCiAgICBwX2h3YWRkcnMgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmZvcmJpZGRlbl9od19hZGRycwoKICAgIG5vdCBpX2ludGVyZmFjZS5od0FkZHIgaW4gcF9od2FkZHJzCgogICAgcHJpbnQoIlVwZGF0ZUludGVyZmFjZVJlcXVlc3Q6IHRydWUiKQp9CgpDbG9zZVN0ZGluUmVxdWVzdCB7CiAgICBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLkNsb3NlU3RkaW5SZXF1ZXN0ID09IHRydWUKfQoKUmVhZFN0cmVhbVJlcXVlc3QgewogICAgcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5SZWFkU3RyZWFtUmVxdWVzdCA9PSB0cnVlCn0KClVwZGF0ZUVwaGVtZXJhbE1vdW50c1JlcXVlc3QgewogICAgcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVFcGhlbWVyYWxNb3VudHNSZXF1ZXN0ID09IHRydWUKfQoKV3JpdGVTdHJlYW1SZXF1ZXN0IHsKICAgIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuV3JpdGVTdHJlYW1SZXF1ZXN0ID09IHRydWUKfQoKcG9saWN5X2RhdGEgOj0gewogICJjb250YWluZXJzIjogWwogICAgewogICAgICAiT0NJIjogewogICAgICAgICJWZXJzaW9uIjogIjEuMS4wLXJjLjEiLAogICAgICAgICJQcm9jZXNzIjogewogICAgICAgICAgIlRlcm1pbmFsIjogZmFsc2UsCiAgICAgICAgICAiVXNlciI6IHsKICAgICAgICAgICAgIlVJRCI6IDY1NTM1LAogICAgICAgICAgICAiR0lEIjogNjU1MzUsCiAgICAgICAgICAgICJBZGRpdGlvbmFsR2lkcyI6IFtdLAogICAgICAgICAgICAiVXNlcm5hbWUiOiAiIgogICAgICAgICAgfSwKICAgICAgICAgICJEZXByZWNhdGVkQXJncyI6IFsKICAgICAgICAgICAgIi9wYXVzZSIKICAgICAgICAgIF0sCiAgICAgICAgICAiQXJncyI6IFsKICAgICAgICAgICAgIi9wYXVzZSIKICAgICAgICAgIF0sCiAgICAgICAgICAiRW52IjogWwogICAgICAgICAgICAiUEFUSD0vdXNyL2xvY2FsL3NiaW46L3Vzci9sb2NhbC9iaW46L3Vzci9zYmluOi91c3IvYmluOi9zYmluOi9iaW4iCiAgICAgICAgICBdLAogICAgICAgICAgIkN3ZCI6ICIvIiwKICAgICAgICAgICJDYXBhYmlsaXRpZXMiOiB7CiAgICAgICAgICAgICJBbWJpZW50IjogW10sCiAgICAgICAgICAgICJCb3VuZGluZyI6IFsKICAgICAgICAgICAgICAiJChkZWZhdWx0X2NhcHMpIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiRWZmZWN0aXZlIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJJbmhlcml0YWJsZSI6IFtdLAogICAgICAgICAgICAiUGVybWl0dGVkIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICAiTm9OZXdQcml2aWxlZ2VzIjogdHJ1ZQogICAgICAgIH0sCiAgICAgICAgIlJvb3QiOiB7CiAgICAgICAgICAiUGF0aCI6ICIkKGNwYXRoKS8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgIlJlYWRvbmx5IjogdHJ1ZQogICAgICAgIH0sCiAgICAgICAgIk1vdW50cyI6IFsKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9wcm9jIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJwcm9jIiwKICAgICAgICAgICAgInR5cGVfIjogInByb2MiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2IiwKICAgICAgICAgICAgInNvdXJjZSI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJzdHJpY3RhdGltZSIsCiAgICAgICAgICAgICAgIm1vZGU9NzU1IiwKICAgICAgICAgICAgICAic2l6ZT02NTUzNmsiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L3B0cyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiZGV2cHRzIiwKICAgICAgICAgICAgInR5cGVfIjogImRldnB0cyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJuZXdpbnN0YW5jZSIsCiAgICAgICAgICAgICAgInB0bXhtb2RlPTA2NjYiLAogICAgICAgICAgICAgICJtb2RlPTA2MjAiLAogICAgICAgICAgICAgICJnaWQ9NSIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvc2htIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L3NobSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi9tcXVldWUiLAogICAgICAgICAgICAic291cmNlIjogIm1xdWV1ZSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJtcXVldWUiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvc3lzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJzeXNmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJzeXNmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2V0Yy9yZXNvbHYuY29uZiIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClyZXNvbHYuY29uZiQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJvIiwKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9kZXYiLAogICAgICAgICAgICAgICJub2V4ZWMiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0KICAgICAgICBdLAogICAgICAgICJBbm5vdGF0aW9ucyI6IHsKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmJ1bmRsZV9wYXRoIjogIi9ydW4vY29udGFpbmVyZC9pby5jb250YWluZXJkLnJ1bnRpbWUudjIudGFzay9rOHMuaW8vJChidW5kbGUtaWQpIiwKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIjogInBvZF9zYW5kYm94IiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSI6ICJzYW5kYm94IiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWlkIjogIl5bYS16MC05XXs2NH0kIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWxvZy1kaXJlY3RvcnkiOiAiXi92YXIvbG9nL3BvZHMvJChzYW5kYm94LW5hbWVzcGFjZSlfJChzYW5kYm94LW5hbWUpX1swLTlhLWZdezh9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezEyfSQiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZSI6ICJecG9kXFwtY29uZmlnbWFwc1xcLWQxMWJmODI0XFwtNjJkMlxcLTQ1YjVcXC1hMzcyXFwtMDQyYjdlNjE1YWFlJCIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1uYW1lc3BhY2UiOiAiY29uZmlnbWFwLTc0MzEiLAogICAgICAgICAgIm5lcmRjdGwvbmV0d29yay1uYW1lc3BhY2UiOiAiXi92YXIvcnVuL25ldG5zL2NuaS1bMC05YS1mXXs4fS1bMC05YS1mXXs0fS1bMC05YS1mXXs0fS1bMC05YS1mXXs0fS1bMC05YS1mXXsxMn0kIgogICAgICAgIH0sCiAgICAgICAgIkxpbnV4IjogewogICAgICAgICAgIk5hbWVzcGFjZXMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiVHlwZSI6ICJpcGMiLAogICAgICAgICAgICAgICJQYXRoIjogIiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJUeXBlIjogInV0cyIsCiAgICAgICAgICAgICAgIlBhdGgiOiAiIgogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgIlR5cGUiOiAibW91bnQiLAogICAgICAgICAgICAgICJQYXRoIjogIiIKICAgICAgICAgICAgfQogICAgICAgICAgXSwKICAgICAgICAgICJNYXNrZWRQYXRocyI6IFsKICAgICAgICAgICAgIi9wcm9jL2FjcGkiLAogICAgICAgICAgICAiL3Byb2MvYXNvdW5kIiwKICAgICAgICAgICAgIi9wcm9jL2tjb3JlIiwKICAgICAgICAgICAgIi9wcm9jL2tleXMiLAogICAgICAgICAgICAiL3Byb2MvbGF0ZW5jeV9zdGF0cyIsCiAgICAgICAgICAgICIvcHJvYy90aW1lcl9saXN0IiwKICAgICAgICAgICAgIi9wcm9jL3RpbWVyX3N0YXRzIiwKICAgICAgICAgICAgIi9wcm9jL3NjaGVkX2RlYnVnIiwKICAgICAgICAgICAgIi9zeXMvZmlybXdhcmUiLAogICAgICAgICAgICAiL3Byb2Mvc2NzaSIKICAgICAgICAgIF0sCiAgICAgICAgICAiUmVhZG9ubHlQYXRocyI6IFsKICAgICAgICAgICAgIi9wcm9jL2J1cyIsCiAgICAgICAgICAgICIvcHJvYy9mcyIsCiAgICAgICAgICAgICIvcHJvYy9pcnEiLAogICAgICAgICAgICAiL3Byb2Mvc3lzIiwKICAgICAgICAgICAgIi9wcm9jL3N5c3JxLXRyaWdnZXIiCiAgICAgICAgICBdLAogICAgICAgICAgIkRldmljZXMiOiBbXSwKICAgICAgICAgICJTeXNjdGwiOiB7CiAgICAgICAgICAgICJuZXQuaXB2NC5pcF91bnByaXZpbGVnZWRfcG9ydF9zdGFydCI6ICIwIiwKICAgICAgICAgICAgIm5ldC5pcHY0LnBpbmdfZ3JvdXBfcmFuZ2UiOiAiMCAyMTQ3NDgzNjQ3IgogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSwKICAgICAgInN0b3JhZ2VzIjogWwogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2gwKSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjApIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAib3ZlcmxheWZzIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJmdXNlMy5rYXRhLW92ZXJsYXkiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICI1YTVhYWQ4MDA1NWZmMjAwMTJhNTBkYzI1ZjhkZjdhMjk5MjQ0NzQzMjRkNjVmN2Q1MzA2ZWU4ZWUyN2ZmNzFkIiwKICAgICAgICAgICAgIjgxNzI1MGYxYTNlMzM2ZGE3NmY1YmQzZmE3ODRlMWIyNmQ5NTliOWMxMzE4NzY4MTViYTI2MDQwNDhiNzBjMTgiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQoY3BhdGgpLyQoYnVuZGxlLWlkKSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfQogICAgICBdLAogICAgICAiZGV2aWNlcyI6IFtdLAogICAgICAic2FuZGJveF9waWRucyI6IGZhbHNlLAogICAgICAiZXhlY19jb21tYW5kcyI6IFtdLAogICAgICAiZW52X21hcCI6IHsKICAgICAgICAiUEFUSCI6ICIvdXNyL2xvY2FsL3NiaW46L3Vzci9sb2NhbC9iaW46L3Vzci9zYmluOi91c3IvYmluOi9zYmluOi9iaW4iCiAgICAgIH0KICAgIH0sCiAgICB7CiAgICAgICJPQ0kiOiB7CiAgICAgICAgIlZlcnNpb24iOiAiMS4xLjAtcmMuMSIsCiAgICAgICAgIlByb2Nlc3MiOiB7CiAgICAgICAgICAiVGVybWluYWwiOiBmYWxzZSwKICAgICAgICAgICJVc2VyIjogewogICAgICAgICAgICAiVUlEIjogMCwKICAgICAgICAgICAgIkdJRCI6IDAsCiAgICAgICAgICAgICJBZGRpdGlvbmFsR2lkcyI6IFtdLAogICAgICAgICAgICAiVXNlcm5hbWUiOiAiIgogICAgICAgICAgfSwKICAgICAgICAgICJEZXByZWNhdGVkQXJncyI6IFsKICAgICAgICAgICAgInNoIgogICAgICAgICAgXSwKICAgICAgICAgICJBcmdzIjogWwogICAgICAgICAgICAic2giCiAgICAgICAgICBdLAogICAgICAgICAgIkVudiI6IFsKICAgICAgICAgICAgIlBBVEg9L3Vzci9sb2NhbC9zYmluOi91c3IvbG9jYWwvYmluOi91c3Ivc2JpbjovdXNyL2Jpbjovc2JpbjovYmluIiwKICAgICAgICAgICAgIkhPU1ROQU1FPSQoaG9zdC1uYW1lKSIsCiAgICAgICAgICAgICJDT05GSUdfREFUQV8xPXZhbHVlMSIKICAgICAgICAgIF0sCiAgICAgICAgICAiQ3dkIjogIi8iLAogICAgICAgICAgIkNhcGFiaWxpdGllcyI6IHsKICAgICAgICAgICAgIkFtYmllbnQiOiBbXSwKICAgICAgICAgICAgIkJvdW5kaW5nIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJFZmZlY3RpdmUiOiBbCiAgICAgICAgICAgICAgIiQoZGVmYXVsdF9jYXBzKSIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgIkluaGVyaXRhYmxlIjogW10sCiAgICAgICAgICAgICJQZXJtaXR0ZWQiOiBbCiAgICAgICAgICAgICAgIiQoZGVmYXVsdF9jYXBzKSIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgICJOb05ld1ByaXZpbGVnZXMiOiBmYWxzZQogICAgICAgIH0sCiAgICAgICAgIlJvb3QiOiB7CiAgICAgICAgICAiUGF0aCI6ICIkKGNwYXRoKS8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgIlJlYWRvbmx5IjogZmFsc2UKICAgICAgICB9LAogICAgICAgICJNb3VudHMiOiBbCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvcHJvYyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAicHJvYyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJwcm9jIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAgICAgIm5vZGV2IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2RldiIsCiAgICAgICAgICAgICJzb3VyY2UiOiAidG1wZnMiLAogICAgICAgICAgICAidHlwZV8iOiAidG1wZnMiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAic3RyaWN0YXRpbWUiLAogICAgICAgICAgICAgICJtb2RlPTc1NSIsCiAgICAgICAgICAgICAgInNpemU9NjU1MzZrIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi9wdHMiLAogICAgICAgICAgICAic291cmNlIjogImRldnB0cyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJkZXZwdHMiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibmV3aW5zdGFuY2UiLAogICAgICAgICAgICAgICJwdG14bW9kZT0wNjY2IiwKICAgICAgICAgICAgICAibW9kZT0wNjIwIiwKICAgICAgICAgICAgICAiZ2lkPTUiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L3NobSIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiL3J1bi9rYXRhLWNvbnRhaW5lcnMvc2FuZGJveC9zaG0iLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvbXF1ZXVlIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJtcXVldWUiLAogICAgICAgICAgICAidHlwZV8iOiAibXF1ZXVlIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAgICAgIm5vZGV2IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL3N5cyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAic3lzZnMiLAogICAgICAgICAgICAidHlwZV8iOiAic3lzZnMiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiLAogICAgICAgICAgICAgICJybyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9zeXMvZnMvY2dyb3VwIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJjZ3JvdXAiLAogICAgICAgICAgICAidHlwZV8iOiAiY2dyb3VwIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAgICAgIm5vZGV2IiwKICAgICAgICAgICAgICAicmVsYXRpbWUiLAogICAgICAgICAgICAgICJybyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9ldGMvaG9zdHMiLAogICAgICAgICAgICAic291cmNlIjogIiQoc2ZwcmVmaXgpaG9zdHMkIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJ3IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi90ZXJtaW5hdGlvbi1sb2ciLAogICAgICAgICAgICAic291cmNlIjogIiQoc2ZwcmVmaXgpdGVybWluYXRpb24tbG9nJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJydyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9ldGMvaG9zdG5hbWUiLAogICAgICAgICAgICAic291cmNlIjogIiQoc2ZwcmVmaXgpaG9zdG5hbWUkIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJ3IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2V0Yy9yZXNvbHYuY29uZiIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClyZXNvbHYuY29uZiQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicnciCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvdmFyL3J1bi9zZWNyZXRzL2t1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQiLAogICAgICAgICAgICAic291cmNlIjogIiQoc2ZwcmVmaXgpc2VydmljZWFjY291bnQkIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL3Zhci9ydW4vc2VjcmV0cy9henVyZS90b2tlbnMiLAogICAgICAgICAgICAic291cmNlIjogIiQoc2ZwcmVmaXgpdG9rZW5zJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJybyIKICAgICAgICAgICAgXQogICAgICAgICAgfQogICAgICAgIF0sCiAgICAgICAgIkFubm90YXRpb25zIjogewogICAgICAgICAgImlvLmthdGFjb250YWluZXJzLnBrZy5vY2kuYnVuZGxlX3BhdGgiOiAiL3J1bi9jb250YWluZXJkL2lvLmNvbnRhaW5lcmQucnVudGltZS52Mi50YXNrL2s4cy5pby8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgImlvLmthdGFjb250YWluZXJzLnBrZy5vY2kuY29udGFpbmVyX3R5cGUiOiAicG9kX2NvbnRhaW5lciIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLW5hbWUiOiAiZW52LXRlc3QiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLmNvbnRhaW5lci10eXBlIjogImNvbnRhaW5lciIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuaW1hZ2UtbmFtZSI6ICJyZWdpc3RyeS5rOHMuaW8vZTJlLXRlc3QtaW1hZ2VzL2J1c3lib3g6MS4yOS0yIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWlkIjogIl5bYS16MC05XXs2NH0kIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LW5hbWUiOiAiXnBvZFxcLWNvbmZpZ21hcHNcXC1kMTFiZjgyNFxcLTYyZDJcXC00NWI1XFwtYTM3MlxcLTA0MmI3ZTYxNWFhZSQiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZXNwYWNlIjogImNvbmZpZ21hcC03NDMxIgogICAgICAgIH0sCiAgICAgICAgIkxpbnV4IjogewogICAgICAgICAgIk5hbWVzcGFjZXMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiVHlwZSI6ICJpcGMiLAogICAgICAgICAgICAgICJQYXRoIjogIiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJUeXBlIjogInV0cyIsCiAgICAgICAgICAgICAgIlBhdGgiOiAiIgogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgIlR5cGUiOiAibW91bnQiLAogICAgICAgICAgICAgICJQYXRoIjogIiIKICAgICAgICAgICAgfQogICAgICAgICAgXSwKICAgICAgICAgICJNYXNrZWRQYXRocyI6IFsKICAgICAgICAgICAgIi9wcm9jL2FjcGkiLAogICAgICAgICAgICAiL3Byb2Mva2NvcmUiLAogICAgICAgICAgICAiL3Byb2Mva2V5cyIsCiAgICAgICAgICAgICIvcHJvYy9sYXRlbmN5X3N0YXRzIiwKICAgICAgICAgICAgIi9wcm9jL3RpbWVyX2xpc3QiLAogICAgICAgICAgICAiL3Byb2MvdGltZXJfc3RhdHMiLAogICAgICAgICAgICAiL3Byb2Mvc2NoZWRfZGVidWciLAogICAgICAgICAgICAiL3Byb2Mvc2NzaSIsCiAgICAgICAgICAgICIvc3lzL2Zpcm13YXJlIgogICAgICAgICAgXSwKICAgICAgICAgICJSZWFkb25seVBhdGhzIjogWwogICAgICAgICAgICAiL3Byb2MvYXNvdW5kIiwKICAgICAgICAgICAgIi9wcm9jL2J1cyIsCiAgICAgICAgICAgICIvcHJvYy9mcyIsCiAgICAgICAgICAgICIvcHJvYy9pcnEiLAogICAgICAgICAgICAiL3Byb2Mvc3lzIiwKICAgICAgICAgICAgIi9wcm9jL3N5c3JxLXRyaWdnZXIiCiAgICAgICAgICBdLAogICAgICAgICAgIkRldmljZXMiOiBbXSwKICAgICAgICAgICJTeXNjdGwiOiB7CiAgICAgICAgICAgICJuZXQuaXB2NC5pcF91bnByaXZpbGVnZWRfcG9ydF9zdGFydCI6ICIwIiwKICAgICAgICAgICAgIm5ldC5pcHY0LnBpbmdfZ3JvdXBfcmFuZ2UiOiAiMCAyMTQ3NDgzNjQ3IgogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSwKICAgICAgInN0b3JhZ2VzIjogWwogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2gwKSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjApIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAib3ZlcmxheWZzIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJmdXNlMy5rYXRhLW92ZXJsYXkiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICI0ZDA2NTNmN2M3ZTNmNDliNDkwMDZhOWY0ZTgxM2FhMTE2NmM1MzJhMzRhNzY1MGFmYTZmYWE1MjI2ZjFlYzVmIiwKICAgICAgICAgICAgImJkNWJiMzg3MDlkMjk0M2EzNmEwMmU0NTRlMzRkM2Q2Y2FhMjM4NWZiMTQwZDdmMTc5N2ZkMGEyN2E5MzdkZGIiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQoY3BhdGgpLyQoYnVuZGxlLWlkKSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfQogICAgICBdLAogICAgICAiZGV2aWNlcyI6IFtdLAogICAgICAic2FuZGJveF9waWRucyI6IGZhbHNlLAogICAgICAiZXhlY19jb21tYW5kcyI6IFtdLAogICAgICAiZW52X21hcCI6IHsKICAgICAgICAiQ09ORklHX0RBVEFfMSI6ICJ2YWx1ZTEiLAogICAgICAgICJIT1NUTkFNRSI6ICIkKGhvc3QtbmFtZSkiLAogICAgICAgICJQQVRIIjogIi91c3IvbG9jYWwvc2JpbjovdXNyL2xvY2FsL2JpbjovdXNyL3NiaW46L3Vzci9iaW46L3NiaW46L2JpbiIKICAgICAgfQogICAgfQogIF0sCiAgImNvbW1vbiI6IHsKICAgICJjcGF0aCI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zaGFyZWQvY29udGFpbmVycyIsCiAgICAibW91bnRfc291cmNlX2NwYXRoIjogIi9ydW4va2F0YS1jb250YWluZXJzL3NoYXJlZC9jb250YWluZXJzIiwKICAgICJzZnByZWZpeCI6ICJeJChjcGF0aCkvJChidW5kbGUtaWQpLVthLXowLTldezE2fS0iLAogICAgInNwYXRoIjogIi9ydW4va2F0YS1jb250YWluZXJzL3NhbmRib3gvc3RvcmFnZSIsCiAgICAiaXB2NF9hIjogIigoWzAtOV18WzEtOV1bMC05XXwxWzAtOV17Mn18MlswLTRdWzAtOV18MjVbMC01XSlcXC4pezN9KFswLTldfFsxLTldWzAtOV18MVswLTldezJ9fDJbMC00XVswLTldfDI1WzAtNV0pIiwKICAgICJpcF9wIjogIlswLTldezEsNX0iLAogICAgInN2Y19uYW1lIjogIltBLVpfXFwuXFwtXSsiLAogICAgImRuc19sYWJlbCI6ICJbYS16QS1aMC05X1xcLlxcLV0rIiwKICAgICJzX3NvdXJjZTEiOiAiXi4uMlswLTldezN9X1swLTFdWzAtOV1fWzAtM11bMC05XV9bMC0yXVswLTldX1swLTVdWzAtOV1fWzAtNV1bMC05XVxcLlswLTldezEsMTB9JCIsCiAgICAic19zb3VyY2UyIjogIl4uLmRhdGEvIiwKICAgICJkbnNfc3ViZG9tYWluIjogIl5bYS16MC05XShbLWEtejAtOV0qW2EtejAtOV0pPyQiLAogICAgInBvZF91aWQiOiAiXlswLTlhLWZBLUZdezh9LVswLTlhLWZBLUZdezR9LVswLTlhLWZBLUZdezR9LVswLTlhLWZBLUZdezR9LVswLTlhLWZBLUZdezEyfSQiLAogICAgImRlZmF1bHRfY2FwcyI6IFsKICAgICAgIkNBUF9DSE9XTiIsCiAgICAgICJDQVBfREFDX09WRVJSSURFIiwKICAgICAgIkNBUF9GU0VUSUQiLAogICAgICAiQ0FQX0ZPV05FUiIsCiAgICAgICJDQVBfTUtOT0QiLAogICAgICAiQ0FQX05FVF9SQVciLAogICAgICAiQ0FQX1NFVEdJRCIsCiAgICAgICJDQVBfU0VUVUlEIiwKICAgICAgIkNBUF9TRVRGQ0FQIiwKICAgICAgIkNBUF9TRVRQQ0FQIiwKICAgICAgIkNBUF9ORVRfQklORF9TRVJWSUNFIiwKICAgICAgIkNBUF9TWVNfQ0hST09UIiwKICAgICAgIkNBUF9LSUxMIiwKICAgICAgIkNBUF9BVURJVF9XUklURSIKICAgIF0sCiAgICAicHJpdmlsZWdlZF9jYXBzIjogWwogICAgICAiQ0FQX0NIT1dOIiwKICAgICAgIkNBUF9EQUNfT1ZFUlJJREUiLAogICAgICAiQ0FQX0RBQ19SRUFEX1NFQVJDSCIsCiAgICAgICJDQVBfRk9XTkVSIiwKICAgICAgIkNBUF9GU0VUSUQiLAogICAgICAiQ0FQX0tJTEwiLAogICAgICAiQ0FQX1NFVEdJRCIsCiAgICAgICJDQVBfU0VUVUlEIiwKICAgICAgIkNBUF9TRVRQQ0FQIiwKICAgICAgIkNBUF9MSU5VWF9JTU1VVEFCTEUiLAogICAgICAiQ0FQX05FVF9CSU5EX1NFUlZJQ0UiLAogICAgICAiQ0FQX05FVF9CUk9BRENBU1QiLAogICAgICAiQ0FQX05FVF9BRE1JTiIsCiAgICAgICJDQVBfTkVUX1JBVyIsCiAgICAgICJDQVBfSVBDX0xPQ0siLAogICAgICAiQ0FQX0lQQ19PV05FUiIsCiAgICAgICJDQVBfU1lTX01PRFVMRSIsCiAgICAgICJDQVBfU1lTX1JBV0lPIiwKICAgICAgIkNBUF9TWVNfQ0hST09UIiwKICAgICAgIkNBUF9TWVNfUFRSQUNFIiwKICAgICAgIkNBUF9TWVNfUEFDQ1QiLAogICAgICAiQ0FQX1NZU19BRE1JTiIsCiAgICAgICJDQVBfU1lTX0JPT1QiLAogICAgICAiQ0FQX1NZU19OSUNFIiwKICAgICAgIkNBUF9TWVNfUkVTT1VSQ0UiLAogICAgICAiQ0FQX1NZU19USU1FIiwKICAgICAgIkNBUF9TWVNfVFRZX0NPTkZJRyIsCiAgICAgICJDQVBfTUtOT0QiLAogICAgICAiQ0FQX0xFQVNFIiwKICAgICAgIkNBUF9BVURJVF9XUklURSIsCiAgICAgICJDQVBfQVVESVRfQ09OVFJPTCIsCiAgICAgICJDQVBfU0VURkNBUCIsCiAgICAgICJDQVBfTUFDX09WRVJSSURFIiwKICAgICAgIkNBUF9NQUNfQURNSU4iLAogICAgICAiQ0FQX1NZU0xPRyIsCiAgICAgICJDQVBfV0FLRV9BTEFSTSIsCiAgICAgICJDQVBfQkxPQ0tfU1VTUEVORCIsCiAgICAgICJDQVBfQVVESVRfUkVBRCIsCiAgICAgICJDQVBfUEVSRk1PTiIsCiAgICAgICJDQVBfQlBGIiwKICAgICAgIkNBUF9DSEVDS1BPSU5UX1JFU1RPUkUiCiAgICBdLAogICAgInZpcnRpb19ibGtfc3RvcmFnZV9jbGFzc2VzIjogWwogICAgICAiY2MtbG9jYWwtY3NpIiwKICAgICAgImNjLW1hbmFnZWQtY3NpIiwKICAgICAgImNjLW1hbmFnZWQtcHJlbWl1bS1jc2kiCiAgICBdLAogICAgInNtYl9zdG9yYWdlX2NsYXNzZXMiOiBbCiAgICAgIHsKICAgICAgICAibmFtZSI6ICJhenVyZWZpbGUtY3NpLWthdGEtY2MiLAogICAgICAgICJtb3VudF9vcHRpb25zIjogWwogICAgICAgICAgImRpcl9tb2RlPTA3NzciLAogICAgICAgICAgImZpbGVfbW9kZT0wNzc3IiwKICAgICAgICAgICJtZnN5bWxpbmtzIiwKICAgICAgICAgICJjYWNoZT1zdHJpY3QiLAogICAgICAgICAgIm5vc2hhcmVzb2NrIiwKICAgICAgICAgICJhY3RpbWVvPTMwIiwKICAgICAgICAgICJub2JybCIKICAgICAgICBdCiAgICAgIH0KICAgIF0KICB9LAogICJzYW5kYm94IjogewogICAgInN0b3JhZ2VzIjogWwogICAgICB7CiAgICAgICAgImRyaXZlciI6ICJlcGhlbWVyYWwiLAogICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICJzb3VyY2UiOiAic2htIiwKICAgICAgICAiZnN0eXBlIjogInRtcGZzIiwKICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAibm9kZXYiLAogICAgICAgICAgIm1vZGU9MTc3NyIsCiAgICAgICAgICAic2l6ZT02NzEwODg2NCIKICAgICAgICBdLAogICAgICAgICJtb3VudF9wb2ludCI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L3NobSIsCiAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICB9CiAgICBdCiAgfSwKICAicmVxdWVzdF9kZWZhdWx0cyI6IHsKICAgICJDcmVhdGVDb250YWluZXJSZXF1ZXN0IjogewogICAgICAiYWxsb3dfZW52X3JlZ2V4IjogWwogICAgICAgICJeSE9TVE5BTUU9JChkbnNfbGFiZWwpJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9QT1JUXyQoaXBfcClfVENQPXRjcDovLyQoaXB2NF9hKTokKGlwX3ApJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9QT1JUXyQoaXBfcClfVENQX1BST1RPPXRjcCQiLAogICAgICAgICJeJChzdmNfbmFtZSlfUE9SVF8kKGlwX3ApX1RDUF9QT1JUPSQoaXBfcCkkIiwKICAgICAgICAiXiQoc3ZjX25hbWUpX1BPUlRfJChpcF9wKV9UQ1BfQUREUj0kKGlwdjRfYSkkIiwKICAgICAgICAiXiQoc3ZjX25hbWUpX1NFUlZJQ0VfSE9TVD0kKGlwdjRfYSkkIiwKICAgICAgICAiXiQoc3ZjX25hbWUpX1NFUlZJQ0VfUE9SVD0kKGlwX3ApJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9TRVJWSUNFX1BPUlRfJChkbnNfbGFiZWwpPSQoaXBfcCkkIiwKICAgICAgICAiXiQoc3ZjX25hbWUpX1BPUlQ9dGNwOi8vJChpcHY0X2EpOiQoaXBfcCkkIiwKICAgICAgICAiXkFaVVJFX0NMSUVOVF9JRD1bQS1GYS1mMC05LV0qJCIsCiAgICAgICAgIl5BWlVSRV9URU5BTlRfSUQ9W0EtRmEtZjAtOS1dKiQiLAogICAgICAgICJeQVpVUkVfRkVERVJBVEVEX1RPS0VOX0ZJTEU9L3Zhci9ydW4vc2VjcmV0cy9henVyZS90b2tlbnMvYXp1cmUtaWRlbnRpdHktdG9rZW4kIiwKICAgICAgICAiXkFaVVJFX0FVVEhPUklUWV9IT1NUPWh0dHBzOi8vbG9naW5cXC5taWNyb3NvZnRvbmxpbmVcXC5jb20vJCIsCiAgICAgICAgIl5URVJNPXh0ZXJtJCIKICAgICAgXSwKICAgICAgImFsbG93X2Vudl9yZWdleF9tYXAiOiB7CiAgICAgICAgIkNQVV9MSU1JVCI6ICJeWzAtOV0rJCIsCiAgICAgICAgIkpPQl9DT01QTEVUSU9OX0lOREVYIjogIl5bMC05XSokIiwKICAgICAgICAiTUVNT1JZX0xJTUlUIjogIl5bMC05XSskIgogICAgICB9CiAgICB9LAogICAgIkNvcHlGaWxlUmVxdWVzdCI6IFsKICAgICAgIiQoc2ZwcmVmaXgpIgogICAgXSwKICAgICJFeGVjUHJvY2Vzc1JlcXVlc3QiOiB7CiAgICAgICJhbGxvd2VkX2NvbW1hbmRzIjogW10sCiAgICAgICJyZWdleCI6IFtdCiAgICB9LAogICAgIlVwZGF0ZVJvdXRlc1JlcXVlc3QiOiB7CiAgICAgICJmb3JiaWRkZW5fZGV2aWNlX25hbWVzIjogWwogICAgICAgICJsbyIKICAgICAgXSwKICAgICAgImZvcmJpZGRlbl9zb3VyY2VfcmVnZXgiOiBbCiAgICAgICAgIl4oPzowezAsNH06KXswLDd9MHswLDN9MSQiLAogICAgICAgICJeMTI3XFwuKD86WzAtOV17MSwzfVxcLil7Mn1bMC05XXsxLDN9JCIKICAgICAgXQogICAgfSwKICAgICJVcGRhdGVJbnRlcmZhY2VSZXF1ZXN0IjogewogICAgICAiYWxsb3dfcmF3X2ZsYWdzIjogMTI4LAogICAgICAiZm9yYmlkZGVuX25hbWVzIjogWwogICAgICAgICJsbyIKICAgICAgXSwKICAgICAgImZvcmJpZGRlbl9od19hZGRycyI6IFsKICAgICAgICAiMDA6MDA6MDA6MDA6MDA6MDAiCiAgICAgIF0KICAgIH0sCiAgICAiQ2xvc2VTdGRpblJlcXVlc3QiOiBmYWxzZSwKICAgICJSZWFkU3RyZWFtUmVxdWVzdCI6IGZhbHNlLAogICAgIlVwZGF0ZUVwaGVtZXJhbE1vdW50c1JlcXVlc3QiOiBmYWxzZSwKICAgICJXcml0ZVN0cmVhbVJlcXVlc3QiOiBmYWxzZQogIH0KfQ== +spec: + containers: + - command: + - sh + env: + - name: CONFIG_DATA_1 + valueFrom: + configMapKeyRef: + key: data-1 + name: configmap-test-f61a3180-8242-43d0-be72-659de4f65498 + image: "registry.k8s.io/e2e-test-images/busybox:1.29-2" + imagePullPolicy: IfNotPresent + name: env-test + resources: {} + terminationMessagePath: /dev/termination-log + terminationMessagePolicy: File + volumeMounts: + - mountPath: /var/run/secrets/kubernetes.io/serviceaccount + name: kube-api-access-q7g2m + readOnly: true + dnsPolicy: ClusterFirst + enableServiceLinks: true + preemptionPolicy: PreemptLowerPriority + priority: 0 + restartPolicy: Never + runtimeClassName: kata-cc + schedulerName: default-scheduler + securityContext: {} + serviceAccount: default + serviceAccountName: default + terminationGracePeriodSeconds: 30 + tolerations: + - effect: NoExecute + key: node.kubernetes.io/not-ready + operator: Exists + tolerationSeconds: 300 + - effect: NoExecute + key: node.kubernetes.io/unreachable + operator: Exists + tolerationSeconds: 300 + volumes: + - name: kube-api-access-q7g2m + projected: + defaultMode: 420 + sources: + - serviceAccountToken: + expirationSeconds: 3607 + path: token + - configMap: + items: + - key: ca.crt + path: ca.crt + name: kube-root-ca.crt + - downwardAPI: + items: + - fieldRef: + apiVersion: v1 + fieldPath: metadata.namespace + path: namespace +status: {} diff --git a/src/agent/samples/policy/yaml/webhook3/dns-test.yaml b/src/agent/samples/policy/yaml/webhook3/dns-test.yaml new file mode 100644 index 000000000000..98916cea0949 --- /dev/null +++ b/src/agent/samples/policy/yaml/webhook3/dns-test.yaml @@ -0,0 +1,169 @@ +--- +apiVersion: v1 +kind: Namespace +metadata: + name: dns-9988 +--- +apiVersion: v1 +kind: Pod +metadata: + creationTimestamp: "2023-09-18T23:08:02Z" + name: dns-test-f880e73f-1718-4455-9a78-766679e22471 + namespace: dns-9988 + resourceVersion: "1055416" + uid: 8a84dffd-88a8-4a20-8558-5c3081215436 + annotations: + io.katacontainers.config.agent.policy: IyBDb3B5cmlnaHQgKGMpIDIwMjMgTWljcm9zb2Z0IENvcnBvcmF0aW9uCiMKIyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMAojCnBhY2thZ2UgYWdlbnRfcG9saWN5CgppbXBvcnQgZnV0dXJlLmtleXdvcmRzLmluCmltcG9ydCBmdXR1cmUua2V5d29yZHMuZXZlcnkKCiMgRGVmYXVsdCB2YWx1ZXMsIHJldHVybmVkIGJ5IE9QQSB3aGVuIHJ1bGVzIGNhbm5vdCBiZSBldmFsdWF0ZWQgdG8gdHJ1ZS4KZGVmYXVsdCBBZGRBUlBOZWlnaGJvcnNSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgQWRkU3dhcFJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBDbG9zZVN0ZGluUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IENvcHlGaWxlUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IENyZWF0ZUNvbnRhaW5lclJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBDcmVhdGVTYW5kYm94UmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IERlc3Ryb3lTYW5kYm94UmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgRXhlY1Byb2Nlc3NSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgR2V0T09NRXZlbnRSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBHdWVzdERldGFpbHNSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBMaXN0SW50ZXJmYWNlc1JlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBMaXN0Um91dGVzUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IE1lbUhvdHBsdWdCeVByb2JlUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IE9ubGluZUNQVU1lbVJlcXVlc3QgOj0gdHJ1ZQpkZWZhdWx0IFBhdXNlQ29udGFpbmVyUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFJlYWRTdHJlYW1SZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgUmVtb3ZlQ29udGFpbmVyUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgUmVtb3ZlU3RhbGVWaXJ0aW9mc1NoYXJlTW91bnRzUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgUmVzZWVkUmFuZG9tRGV2UmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFJlc3VtZUNvbnRhaW5lclJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBTZXRHdWVzdERhdGVUaW1lUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFNldFBvbGljeVJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBTaWduYWxQcm9jZXNzUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgU3RhcnRDb250YWluZXJSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBTdGFydFRyYWNpbmdSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgU3RhdHNDb250YWluZXJSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBTdG9wVHJhY2luZ1JlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBUdHlXaW5SZXNpemVSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBVcGRhdGVDb250YWluZXJSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgVXBkYXRlRXBoZW1lcmFsTW91bnRzUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFVwZGF0ZUludGVyZmFjZVJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBVcGRhdGVSb3V0ZXNSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgV2FpdFByb2Nlc3NSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBXcml0ZVN0cmVhbVJlcXVlc3QgOj0gZmFsc2UKCiMgQWxsb3dSZXF1ZXN0c0ZhaWxpbmdQb2xpY3kgOj0gdHJ1ZSBjb25maWd1cmVzIHRoZSBBZ2VudCB0byAqYWxsb3cgYW55CiMgcmVxdWVzdHMgY2F1c2luZyBhIHBvbGljeSBmYWlsdXJlKi4gVGhpcyBpcyBhbiB1bnNlY3VyZSBjb25maWd1cmF0aW9uCiMgYnV0IGlzIHVzZWZ1bCBmb3IgYWxsb3dpbmcgdW5zZWN1cmUgcG9kcyB0byBzdGFydCwgdGhlbiBjb25uZWN0IHRvCiMgdGhlbSBhbmQgaW5zcGVjdCBPUEEgbG9ncyBmb3IgdGhlIHJvb3QgY2F1c2Ugb2YgYSBmYWlsdXJlLgpkZWZhdWx0IEFsbG93UmVxdWVzdHNGYWlsaW5nUG9saWN5IDo9IGZhbHNlCgojIENvbnN0YW50cwpTX05BTUVfS0VZID0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZSIKU19OQU1FU1BBQ0VfS0VZID0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZXNwYWNlIgpCVU5ETEVfSUQgPSAiW2EtejAtOV17NjR9IgoKQ3JlYXRlQ29udGFpbmVyUmVxdWVzdDo9IHJlc3AgewogICAgbm90IGlzX251bGwoaW5wdXQuZW52X21hcCkKICAgIAogICAgaV9lbnZfbWFwIDo9IGlucHV0LmVudl9tYXAKICAgIAogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBwX2Vudl9tYXAgOj0gcF9jb250YWluZXIuZW52X21hcCAgCiAgICBhbGxvd19lbnZfbWFwKHBfZW52X21hcCwgaV9lbnZfbWFwKQogICAgCiAgICBpX3Byb2Nlc3MgOj0gaW5wdXQuYmFzZS5PQ0kuUHJvY2VzcwogICAgCiAgICBwX3Byb2Nlc3MgOj0gcF9jb250YWluZXIuT0NJLlByb2Nlc3MKICAgIAogICAgYWxsb3dfYXJncyhpX3Byb2Nlc3MsIHBfcHJvY2VzcywgaV9lbnZfbWFwKQoKICAgIHJlc3AgPSBDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uKGlucHV0LmJhc2UpCiAgICBwcmludCgiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdDogdHJ1ZSIpCn0KCmFsbG93X2FyZ3MoaV9wcm9jZXNzLCBwX3Byb2Nlc3MsIGlfZW52X21hcCkgewogICAgaV9hcmdzIDo9IGlfcHJvY2Vzcy5BcmdzCiAgICBwX2FyZ3MgOj0gcF9wcm9jZXNzLkFyZ3MKICAgIHByaW50KCJhbGxvd19hcmdzOiBpX2FyZ3MgPSIsIGlfYXJncywgInBfYXJncyA9IiwgcF9hcmdzKQogICAgY291bnQoaV9hcmdzKSA9PSBjb3VudChwX2FyZ3MpCiAgICBldmVyeSBpLCBpX2FyZyBpbiBpX2FyZ3MgewogICAgICAgIHByaW50KCJhbGxvd19hcmdzOiBpX2FyZyA9IiwgaV9hcmcpCiAgICAgICAgcF9hcmdfcmVwbGFjZWQgOj0gcmVwbGFjZV9lbnZfdmFyaWFibGVzKHBfYXJnc1tpXSwgaV9lbnZfbWFwKQogICAgICAgIHByaW50KCJhbGxvd19hcmdzOiBwX2FyZ19yZXBsYWNlZCA9IiwgcF9hcmdfcmVwbGFjZWQpCiAgICAgICAgcF9hcmdfcmVwbGFjZWQyIDo9IHJlcGxhY2UocF9hcmdfcmVwbGFjZWQsICIkJCIsICIkIikKICAgICAgICBwcmludCgiYWxsb3dfYXJnczogcF9hcmdfcmVwbGFjZWQyID0iLCBwX2FyZ19yZXBsYWNlZDIpCiAgICAgICAgaV9hcmcgPT0gcF9hcmdfcmVwbGFjZWQyCiAgICB9CiAgICBwcmludCgiYWxsb3dfYXJnczogdHJ1ZSIpCn0KCmFsbG93X2FyZ3MoaV9wcm9jZXNzLCBwX3Byb2Nlc3MsIGlfZW52X21hcCkgewogICAgbm90IGlfcHJvY2Vzcy5BcmdzCiAgICBub3QgcF9wcm9jZXNzLkFyZ3MKICAgIHByaW50KCJhbGxvd19hcmdzMjogbm8gYXJncyIpCn0KCiMgdGhpcyBmdW5jdGlvbiByZXBsYWNlcyBhbGwgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyBpbiBhIHN0cmluZywgZ2l2ZW4gYSBtYXAgb2YgZW52aXJvbm1lbnQga2V5cyB0byBlbnZpcm9ubWVudCB2YWx1ZXMKIyBlZyBzdHIgPSAiZWNobyAkKENMVVNURVJfSUQpOyBlY2hvICQoTk9ERV9OQU1FKTsiCiMgZW52X21hcCA9IHsiQ0xVU1RFUl9JRCI6ICJhYmMiLCAiTk9ERV9OQU1FIiA6ICJ4eXoifQojIHJlc3VsdCA9ICJlY2hvIGFiYzsgZWNobyB4eXo7IgpyZXBsYWNlX2Vudl92YXJpYWJsZXMoc3RyLCBlbnZfbWFwKSA9IHJlc3VsdCB7CiAgICAjIG1ha2UgYW4gYXJyYXkgb2YgdGhlIGtleXMgZWcgWyJDTFVTVEVSX0lEIiwgIk5PREVfTkFNRSJdCiAgICBrZXlzIDo9IFt4IHwgc29tZSB4IGluIG9iamVjdC5rZXlzKGVudl9tYXApXQogICAgcmVzdWx0IDo9IHJlcGxhY2Vfc3RyX3JlYyhzdHIsIGVudl9tYXAsIGtleXMsIGNvdW50KGtleXMpIC0gMSkKfQoKIyBiYXNlIGNhc2UKcmVwbGFjZV9zdHJfcmVjKHN0ciwgZW52X21hcCwgYXJyX2tleXMsIGkpID0gcmVzdWx0IHsKICAgIGkgPCAwCiAgICByZXN1bHQgOj0gc3RyCn0KCiMgcmVjdXJzaXZlIHN0ZXAKcmVwbGFjZV9zdHJfcmVjKHN0ciwgZW52X21hcCwgYXJyX2tleXMsIGkpID0gcmVzdWx0IHsKICAgIGkgPj0gMAogICAga2V5IDo9IGFycl9rZXlzW2ldCiAgICBlbnZfa2V5MSA6PSBjb25jYXQoIiIsIFsiJCgiLCBrZXksICIpIl0pCiAgICAjIHJlcGxhY2UgJChWQVIpIHdpdGggdmFsdWUKICAgIG5ld19zdHIxIDo9IHJlcGxhY2Uoc3RyLCBlbnZfa2V5MSwgZW52X21hcFtrZXldKQogICAgIyByZXBsYWNlIG5leHQgZW52aXJvbm1lbnQgdmFyaWFibGUKICAgIHJlc3VsdCA9IHJlcGxhY2Vfc3RyX3JlYyhuZXdfc3RyMSwgZW52X21hcCwgYXJyX2tleXMsIGkgLSAxKQp9CgphbGxvd19lbnZfbWFwKHBfZW52X21hcCwgaV9lbnZfbWFwKSB7CiAgICBwcmludCgiYWxsb3dfZW52X21hcDogcF9lbnZfbWFwID0iLCBwX2Vudl9tYXApCiAgICBldmVyeSBlbnZfa2V5LCBlbnZfdmFsIGluIGlfZW52X21hcCB7CiAgICAgICAgcHJpbnQoImFsbG93X2VudjogZW52X2tleSA9IiwgZW52X2tleSwgImVudl92YWwgPSIsIGVudl92YWwpCiAgICAgICAgYWxsb3dfZW52X21hcF9lbnRyeShlbnZfa2V5LCBlbnZfdmFsLCBwX2Vudl9tYXApCiAgICB9CiAgICBwcmludCgiYWxsb3dfZW52X21hcDogdHJ1ZSIpCn0KCiMgQWxsb3cgZXhhY3QgbWF0Y2gKYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBpX3ZhbCA9PSBwX3ZhbAogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnk6IHRydWUiKQp9CgojIEFsbG93IHJlc291cmNlRmllbGRSZWYgdmFsdWVzIChlLmcuLCAibGltaXRzLmNwdSIpLgphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgICMgYSB2YXJpYWJsZSB3ZSBzaG91bGQgYmUgdmFsaWRhdGluZyB1c2luZyBhIHJlZ2V4IGZyb20gc2V0dGluZ3MKICAgIHBfdmFsID09ICIkKHZhbGlkYXRlLWZyb20tc2V0dGluZ3MpIgogICAgcmVnZXhfdmFsIDo9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuQ3JlYXRlQ29udGFpbmVyUmVxdWVzdC5hbGxvd19lbnZfcmVnZXhfbWFwW2tleV0KICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4X3ZhbCwgaV92YWwpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSAyOiB0cnVlIikKfQoKIyBBbGxvdyBub2RlLW5hbWUKYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChub2RlLW5hbWUpIgogICAgcmVnZXgubWF0Y2gocG9saWN5X2RhdGEuY29tbW9uLmRuc19zdWJkb21haW4gLCBpX3ZhbCkKICAgIHByaW50KCJhbGxvd19lbnZfbWFwX2VudHJ5IDM6IHRydWUiKQp9CgojIEFsbG93IGhvc3QtbmFtZQphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgIHBfdmFsID09ICIkKGhvc3QtbmFtZSkiCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24uZG5zX2xhYmVsICwgaV92YWwpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSA0OiB0cnVlIikKfQoKIyBBbGxvdyBwb2QtdWlkCmFsbG93X2Vudl9tYXBfZW50cnkoa2V5LCBpX3ZhbCwgcF9lbnZfbWFwKSB7CiAgICBwX3ZhbCA6PSBwX2Vudl9tYXBba2V5XQogICAgcF92YWwgPT0gIiQocG9kLXVpZCkiCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24ucG9kX3VpZCAsIGlfdmFsKQogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgNTogdHJ1ZSIpCn0KCiMgQWxsb3cgZmllbGRSZWYgImZpZWxkUGF0aDogc3RhdHVzLnBvZElQIiB2YWx1ZXMuCmFsbG93X2Vudl9tYXBfZW50cnkoa2V5LCBpX3ZhbCwgcF9lbnZfbWFwKSB7CiAgICBpc19pcChpX3ZhbCkKCiAgICBwX3ZhbCA6PSBwX2Vudl9tYXBba2V5XQogICAgcF92YXIgOj0gY29uY2F0KCI9IiwgW2tleSwgcF92YWxdKQogICAgYWxsb3dfcG9kX2lwX3ZhcihrZXksIHBfdmFyKQogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgNjogdHJ1ZSIpCn0KCiMgQWxsb3cgZmllbGRSZWYgImZpZWxkUGF0aDogc3RhdHVzLmhvc3RJUCIgdmFsdWVzLgphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgaXNfaXAoaV92YWwpCgogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgIHBfdmFyIDo9IGNvbmNhdCgiPSIsIFtrZXksIHBfdmFsXSkKICAgIGFsbG93X2hvc3RfaXBfdmFyKGtleSwgcF92YXIpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSA3OiB0cnVlIikKfQoKIyBNYXRjaCBpbnB1dCB3aXRoIG9uZSBvZiB0aGUgcG9saWN5IHZhcmlhYmxlcywgYWZ0ZXIgc3Vic3RpdHV0aW5nICQoc2FuZGJveC1uYW1lKS4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChzYW5kYm94LW5hbWUpIgogICAgc19uYW1lIDo9IGlucHV0LmJhc2UuT0NJLkFubm90YXRpb25zW1NfTkFNRV9LRVldCiAgICBwX3ZhcjIgOj0gcmVwbGFjZShwX3ZhbCwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHBfdmFyMiA9PSBpX3ZhbAogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgODogdHJ1ZSIpCn0KCiMgTWF0Y2ggaW5wdXQgd2l0aCBvbmUgb2YgdGhlIHBvbGljeSB2YXJpYWJsZXMsIGFmdGVyIHN1YnN0aXR1dGluZyAkKHNhbmRib3gtbmFtZXNwYWNlKS4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChzYW5kYm94LW5hbWVzcGFjZSkiCiAgICBzX25hbWVzcGFjZSA6PSBpbnB1dC5iYXNlLk9DSS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwX3ZhcjIgOj0gcmVwbGFjZShwX3ZhbCwgIiQoc2FuZGJveC1uYW1lc3BhY2UpIiwgc19uYW1lc3BhY2UpCiAgICBwX3ZhcjIgPT0gaV92YWwKICAgIHByaW50KCJhbGxvd19lbnZfbWFwX2VudHJ5IDk6IHRydWUiKQp9CgojIEFsbG93IGlucHV0IGVudiB2YXJpYWJsZXMgdGhhdCBtYXRjaCB3aXRoIGEgcmVxdWVzdF9kZWZhdWx0cyByZWdleC4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHNvbWUgcF9yZWdleDEgaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5DcmVhdGVDb250YWluZXJSZXF1ZXN0LmFsbG93X2Vudl9yZWdleAogICAgcF9yZWdleDIgOj0gcmVwbGFjZShwX3JlZ2V4MSwgIiQoaXB2NF9hKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcHY0X2EpCiAgICBwX3JlZ2V4MyA6PSByZXBsYWNlKHBfcmVnZXgyLCAiJChpcF9wKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcF9wKQogICAgcF9yZWdleDQgOj0gcmVwbGFjZShwX3JlZ2V4MywgIiQoc3ZjX25hbWUpIiwgcG9saWN5X2RhdGEuY29tbW9uLnN2Y19uYW1lKQogICAgcF9yZWdleDUgOj0gcmVwbGFjZShwX3JlZ2V4NCwgIiQoZG5zX2xhYmVsKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5kbnNfbGFiZWwpCgogICAgcmVzdWx0IDo9IGNvbmNhdCgiPSIsIFtrZXksIGlfdmFsXSkKICAgIHJlZ2V4Lm1hdGNoKHBfcmVnZXg1LCByZXN1bHQpCgogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgMTA6IHRydWUiKQp9CgpDcmVhdGVDb250YWluZXJSZXF1ZXN0Oj0gcmVzcCB7CiAgICBub3QgaW5wdXQuZW52X21hcAogICAgaV9wcm9jZXNzID0gaW5wdXQuT0NJLlByb2Nlc3MKICAgIHNfbmFtZSA9IGlucHV0Lk9DSS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBwX3Byb2Nlc3MgPSBwX2NvbnRhaW5lci5PQ0kuUHJvY2VzcwogICAgYWxsb3dfZGVwcmVjYXRlZF9hcmdzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUpCiAgICByZXNwID0gQ3JlYXRlQ29udGFpbmVyUmVxdWVzdENvbW1vbihpbnB1dCkKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0MjogdHJ1ZSIpCn0KCkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb24ocmVxKTo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgICMgQ2hlY2sgaWYgdGhlIGlucHV0IHJlcXVlc3Qgc2hvdWxkIGJlIHJlamVjdGVkIGV2ZW4gYmVmb3JlIGNoZWNraW5nIHRoZQogICAgIyBwb2xpY3lfZGF0YS5jb250YWluZXJzIGluZm9ybWF0aW9uLgogICAgYWxsb3dfY3JlYXRlX2NvbnRhaW5lcl9pbnB1dChyZXEpCgogICAgaV9vY2kgOj0gcmVxLk9DSQogICAgaV9zdG9yYWdlcyA6PSByZXEuc3RvcmFnZXMKICAgIGlfZGV2aWNlcyA6PSByZXEuZGV2aWNlcwoKICAgICMgYXJyYXkgb2YgcG9zc2libGUgc3RhdGUgb3BlcmF0aW9ucwogICAgb3BzX2J1aWxkZXIgOj0gW10KCiAgICAjIGNoZWNrIHNhbmRib3ggbmFtZQogICAgc2FuZGJveF9uYW1lID0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FX0tFWV0KICAgIGFkZF9zYW5kYm94X25hbWVfdG9fc3RhdGUgOj0gc3RhdGVfYWxsb3dzKCJzYW5kYm94X25hbWUiLCBzYW5kYm94X25hbWUpCiAgICBvcHNfYnVpbGRlcjEgOj0gY29uY2F0X29wX2lmX25vdF9udWxsKG9wc19idWlsZGVyLCBhZGRfc2FuZGJveF9uYW1lX3RvX3N0YXRlKQoKICAgICMgQ2hlY2sgaWYgYW55IGVsZW1lbnQgZnJvbSB0aGUgcG9saWN5X2RhdGEuY29udGFpbmVycyBhcnJheSBhbGxvd3MgdGhlIGlucHV0IHJlcXVlc3QuCiAgICBzb21lIHBfY29udGFpbmVyIGluIHBvbGljeV9kYXRhLmNvbnRhaW5lcnMKICAgIHByaW50KCI9PT09PT09PSBDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiB0cnlpbmcgbmV4dCBwb2xpY3kgY29udGFpbmVyIikKCiAgICBwX3BpZG5zIDo9IHBfY29udGFpbmVyLnNhbmRib3hfcGlkbnMKICAgIGlfcGlkbnMgOj0gcmVxLnNhbmRib3hfcGlkbnMKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiBwX3BpZG5zID0iLCBwX3BpZG5zLCAiaV9waWRucyA9IiwgaV9waWRucykKICAgIHBfcGlkbnMgPT0gaV9waWRucwoKICAgIHBfb2NpIDo9IHBfY29udGFpbmVyLk9DSQoKICAgICMgY2hlY2sgbmFtZXNwYWNlCiAgICBwX25hbWVzcGFjZSA6PSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBpX25hbWVzcGFjZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwcmludCAoIkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb246IHBfbmFtZXNwYWNlID0iLCBwX25hbWVzcGFjZSwgImlfbmFtZXNwYWNlID0iLCBpX25hbWVzcGFjZSkKICAgIGFkZF9uYW1lc3BhY2VfdG9fc3RhdGUgOj0gYWxsb3dfbmFtZXNwYWNlKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkKICAgIG9wc19idWlsZGVyMiA6PSBjb25jYXRfb3BfaWZfbm90X251bGwob3BzX2J1aWxkZXIxLCBhZGRfbmFtZXNwYWNlX3RvX3N0YXRlKQoKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiBwIFZlcnNpb24gPSIsIHBfb2NpLlZlcnNpb24sICJpIFZlcnNpb24gPSIsIGlfb2NpLlZlcnNpb24pCiAgICBwX29jaS5WZXJzaW9uID09IGlfb2NpLlZlcnNpb24KCiAgICBwcmludCgiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdENvbW1vbjogcCBSZWFkb25seSA9IiwgcF9vY2kuUm9vdC5SZWFkb25seSwgImkgUmVhZG9ubHkgPSIsIGlfb2NpLlJvb3QuUmVhZG9ubHkpCiAgICBwX29jaS5Sb290LlJlYWRvbmx5ID09IGlfb2NpLlJvb3QuUmVhZG9ubHkKCiAgICBhbGxvd19hbm5vKHBfb2NpLCBpX29jaSkKCiAgICBwX3N0b3JhZ2VzIDo9IHBfY29udGFpbmVyLnN0b3JhZ2VzCiAgICBhbGxvd19ieV9hbm5vKHBfb2NpLCBpX29jaSwgcF9zdG9yYWdlcywgaV9zdG9yYWdlcykKCiAgICBwX2RldmljZXMgOj0gcF9jb250YWluZXIuZGV2aWNlcwogICAgYWxsb3dfZGV2aWNlcyhwX2RldmljZXMsIGlfZGV2aWNlcykKCiAgICByZXQgOj0gYWxsb3dfbGludXgob3BzX2J1aWxkZXIyLCBwX29jaSwgaV9vY2kpCiAgICByZXQuYWxsb3dlZAoKICAgIG9wcyA6PSByZXQub3BzCgogICAgcHJpbnQoIkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb246IHRydWUiKQp9CgphbGxvd19jcmVhdGVfY29udGFpbmVyX2lucHV0KHJlcSkgewogICAgcHJpbnQoImFsbG93X2NyZWF0ZV9jb250YWluZXJfaW5wdXQ6IGlucHV0ID0iLCByZXEpCgogICAgY291bnQocmVxLnNoYXJlZF9tb3VudHMpID09IDAKICAgIGlzX251bGwocmVxLnN0cmluZ191c2VyKQoKICAgIGlfb2NpIDo9IHJlcS5PQ0kKICAgIGlzX251bGwoaV9vY2kuSG9va3MpCiAgICBpc19udWxsKGlfb2NpLlNvbGFyaXMpCiAgICBpc19udWxsKGlfb2NpLldpbmRvd3MpCgogICAgaV9saW51eCA6PSBpX29jaS5MaW51eAogICAgY291bnQoaV9saW51eC5HSURNYXBwaW5ncykgPT0gMAogICAgY291bnQoaV9saW51eC5Nb3VudExhYmVsKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlJlc291cmNlcy5EZXZpY2VzKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlJvb3Rmc1Byb3BhZ2F0aW9uKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlVJRE1hcHBpbmdzKSA9PSAwCiAgICBpc19udWxsKGlfbGludXguSW50ZWxSZHQpCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLkJsb2NrSU8pCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLk5ldHdvcmspCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLlBpZHMpCiAgICBpc19udWxsKGlfbGludXguU2VjY29tcCkKCiAgICBpX3Byb2Nlc3MgOj0gaV9vY2kuUHJvY2VzcwogICAgY291bnQoaV9wcm9jZXNzLlNlbGludXhMYWJlbCkgPT0gMAogICAgY291bnQoaV9wcm9jZXNzLlVzZXIuVXNlcm5hbWUpID09IDAKCiAgICBwcmludCgiYWxsb3dfY3JlYXRlX2NvbnRhaW5lcl9pbnB1dDogdHJ1ZSIpCn0KCmFsbG93X25hbWVzcGFjZShwX25hbWVzcGFjZSwgaV9uYW1lc3BhY2UpID0gYWRkX25hbWVzcGFjZSB7CiAgICBwX25hbWVzcGFjZSA9PSBpX25hbWVzcGFjZQogICAgYWRkX25hbWVzcGFjZSA6PSBudWxsCiAgICBwcmludCgiYWxsb3dfbmFtZXNwYWNlIDE6IGlucHV0IG5hbWVzcGFjZSBtYXRjaGVzIHBvbGljeSBkYXRhIikKfQoKYWxsb3dfbmFtZXNwYWNlKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkgPSBhZGRfbmFtZXNwYWNlIHsKICAgIHBfbmFtZXNwYWNlID09ICIiCiAgICBwcmludCgiYWxsb3dfbmFtZXNwYWNlIDI6IG5vIG5hbWVzcGFjZSBmb3VuZCBvbiBwb2xpY3kgZGF0YSIpCiAgICBhZGRfbmFtZXNwYWNlIDo9IHN0YXRlX2FsbG93cygibmFtZXNwYWNlIiwgaV9uYW1lc3BhY2UpCn0KCiMgdmFsdWUgaGFzbid0IGJlZW4gc2VlbiBiZWZvcmUsIHNhdmUgaXQgdG8gc3RhdGUKc3RhdGVfYWxsb3dzKGtleSwgdmFsdWUpID0gYWN0aW9uIHsKICBzdGF0ZSA6PSBnZXRfc3RhdGUoKQogIHByaW50KCJzdGF0ZV9hbGxvd3MgMTogc3RhdGVba2V5XSA9Iiwgc3RhdGVba2V5XSwgInZhbHVlID0iLCB2YWx1ZSkKICBub3Qgc3RhdGVba2V5XQogIHByaW50KCJzdGF0ZV9hbGxvd3MgMTogc2F2aW5nIHRvIHN0YXRlIGtleSA9Iiwga2V5LCAidmFsdWUgPSIsIHZhbHVlKQogIHBhdGggOj0gZ2V0X3N0YXRlX3BhdGgoa2V5KSAKICBhY3Rpb24gOj0gewogICAgIm9wIjogImFkZCIsCiAgICAicGF0aCI6IHBhdGgsIAogICAgInZhbHVlIjogdmFsdWUsCiAgfQp9CgojIHZhbHVlIG1hdGNoZXMgd2hhdCdzIGluIHN0YXRlLCBhbGxvdyBpdApzdGF0ZV9hbGxvd3Moa2V5LCB2YWx1ZSkgPSBhY3Rpb24gewogIHByaW50KCJzdGF0ZV9hbGxvd3MgMjogc3RhcnQiKQogIHN0YXRlIDo9IGdldF9zdGF0ZSgpCiAgcHJpbnQoInN0YXRlX2FsbG93cyAyOiBzdGF0ZVtrZXldID0iLCBzdGF0ZVtrZXldLCAidmFsdWUgPSIsIHZhbHVlKQogIHZhbHVlID09IHN0YXRlW2tleV0KICBwcmludCgic3RhdGVfYWxsb3dzIDI6IGZvdW5kIGtleSA9Iiwga2V5LCAidmFsdWUgPSIsIHZhbHVlLCAiIGluIHN0YXRlIikKICBhY3Rpb24gOj0gbnVsbAp9CgojIGhlbHBlciBmdW5jdGlvbnMgdG8gaW50ZXJhY3Qgd2l0aCB0aGUgc3RhdGUKZ2V0X3N0YXRlKCkgPSBzdGF0ZSB7CiAgc3RhdGUgOj0gZGF0YVsicHN0YXRlIl0KfQoKZ2V0X3N0YXRlX3ZhbChrZXkpID0gdmFsdWUgewogICAgc3RhdGUgOj0gZ2V0X3N0YXRlKCkKICAgIHZhbHVlIDo9IHN0YXRlW2tleV0KfQoKZ2V0X3N0YXRlX3BhdGgoa2V5KSA9IHBhdGggewogICAgIyBwcmVwZW5kICIvcHN0YXRlLyIgdG8ga2V5CiAgICBwYXRoIDo9IGNvbmNhdCgiLyIsIFsiL3BzdGF0ZSIsIGtleV0pCn0KCiMgSGVscGVyIGZ1bmN0aW9ucyB0byBjb25kaXRpb25hbGx5IGNvbmNhdGVuYXRlIG9wIGlzIG5vdCBudWxsCmNvbmNhdF9vcF9pZl9ub3RfbnVsbChvcHMsIG9wKSA9IHJlc3VsdCB7CiAgICBvcCA9PSBudWxsCiAgICByZXN1bHQgOj0gb3BzCn0KCmNvbmNhdF9vcF9pZl9ub3RfbnVsbChvcHMsIG9wKSA9IHJlc3VsdCB7CiAgICBvcCAhPSBudWxsCiAgICByZXN1bHQgOj0gYXJyYXkuY29uY2F0KG9wcywgW29wXSkKfQoKIyBSZWplY3QgdW5leHBlY3RlZCBhbm5vdGF0aW9ucy4KYWxsb3dfYW5ubyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19hbm5vIDE6IHN0YXJ0IikKCiAgICBub3QgaV9vY2kuQW5ub3RhdGlvbnMKCiAgICBwcmludCgiYWxsb3dfYW5ubyAxOiB0cnVlIikKfQphbGxvd19hbm5vKHBfb2NpLCBpX29jaSkgewogICAgcHJpbnQoImFsbG93X2Fubm8gMjogcCBBbm5vdGF0aW9ucyA9IiwgcF9vY2kuQW5ub3RhdGlvbnMpCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiBpIEFubm90YXRpb25zID0iLCBpX29jaS5Bbm5vdGF0aW9ucykKCiAgICBpX2tleXMgOj0gb2JqZWN0LmtleXMoaV9vY2kuQW5ub3RhdGlvbnMpCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiBpIGtleXMgPSIsIGlfa2V5cykKCiAgICBldmVyeSBpX2tleSBpbiBpX2tleXMgewogICAgICAgIGFsbG93X2Fubm9fa2V5KGlfa2V5LCBwX29jaSkKICAgIH0KCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiB0cnVlIikKfQoKYWxsb3dfYW5ub19rZXkoaV9rZXksIHBfb2NpKSB7CiAgICBwcmludCgiYWxsb3dfYW5ub19rZXkgMTogaSBrZXkgPSIsIGlfa2V5KQoKICAgIHN0YXJ0c3dpdGgoaV9rZXksICJpby5rdWJlcm5ldGVzLmNyaS4iKQoKICAgIHByaW50KCJhbGxvd19hbm5vX2tleSAxOiB0cnVlIikKfQphbGxvd19hbm5vX2tleShpX2tleSwgcF9vY2kpIHsKICAgIHByaW50KCJhbGxvd19hbm5vX2tleSAyOiBpIGtleSA9IiwgaV9rZXkpCgogICAgc29tZSBwX2tleSwgXyBpbiBwX29jaS5Bbm5vdGF0aW9ucwogICAgcF9rZXkgPT0gaV9rZXkKCiAgICBwcmludCgiYWxsb3dfYW5ub19rZXkgMjogdHJ1ZSIpCn0KCiMgR2V0IHRoZSB2YWx1ZSBvZiB0aGUgU19OQU1FX0tFWSBhbm5vdGF0aW9uIGFuZAojIGNvcnJlbGF0ZSBpdCB3aXRoIG90aGVyIGFubm90YXRpb25zIGFuZCBwcm9jZXNzIGZpZWxkcy4KYWxsb3dfYnlfYW5ubyhwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpIHsKICAgIHByaW50KCJhbGxvd19ieV9hbm5vIDE6IHN0YXJ0IikKCiAgICBub3QgcF9vY2kuQW5ub3RhdGlvbnNbU19OQU1FX0tFWV0KCiAgICBpX3NfbmFtZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMTogaV9zX25hbWUgPSIsIGlfc19uYW1lKQoKICAgIGlfc19uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FU1BBQ0VfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMTogaV9zX25hbWVzcGFjZSA9IiwgaV9zX25hbWVzcGFjZSkKCiAgICBhbGxvd19ieV9zYW5kYm94X25hbWUocF9vY2ksIGlfb2NpLCBwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBpX3NfbmFtZSwgaV9zX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfYnlfYW5ubyAxOiB0cnVlIikKfQphbGxvd19ieV9hbm5vKHBfb2NpLCBpX29jaSwgcF9zdG9yYWdlcywgaV9zdG9yYWdlcykgewogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMjogc3RhcnQiKQoKICAgIHBfc19uYW1lIDo9IHBfb2NpLkFubm90YXRpb25zW1NfTkFNRV9LRVldCiAgICBpX3NfbmFtZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMjogaV9zX25hbWUgPSIsIGlfc19uYW1lLCAicF9zX25hbWUgPSIsIHBfc19uYW1lKQoKICAgIGFsbG93X3NhbmRib3hfbmFtZShwX3NfbmFtZSwgaV9zX25hbWUpCgogICAgaV9zX25hbWVzcGFjZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwcmludCgiYWxsb3dfYnlfYW5ubyAyOiBpX3NfbmFtZXNwYWNlID0iLCBpX3NfbmFtZXNwYWNlKQoKICAgIGFsbG93X2J5X3NhbmRib3hfbmFtZShwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMsIGlfc19uYW1lLCBpX3NfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd19ieV9hbm5vIDI6IHRydWUiKQp9CgphbGxvd19ieV9zYW5kYm94X25hbWUocF9vY2ksIGlfb2NpLCBwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfYnlfc2FuZGJveF9uYW1lOiBzdGFydCIpCgogICAgaV9uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FU1BBQ0VfS0VZXQoKICAgIGFsbG93X2J5X2NvbnRhaW5lcl90eXBlcyhwX29jaSwgaV9vY2ksIHNfbmFtZSwgaV9uYW1lc3BhY2UpCiAgICBhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZChwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpCiAgICBhbGxvd19wcm9jZXNzKHBfb2NpLlByb2Nlc3MsIGlfb2NpLlByb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpCgogICAgcHJpbnQoImFsbG93X2J5X3NhbmRib3hfbmFtZTogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfbmFtZShwX3NfbmFtZSwgaV9zX25hbWUpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X25hbWU6IHN0YXJ0IikKICAgIHJlZ2V4Lm1hdGNoKHBfc19uYW1lLCBpX3NfbmFtZSkKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9uYW1lOiB0cnVlIikKfQoKIyBDaGVjayB0aGF0IHRoZSAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLXR5cGUiIGFuZAojICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIiBhbm5vdGF0aW9ucyBkZXNpZ25hdGUgdGhlCiMgZXhwZWN0ZWQgdHlwZSAtIGVpdGhlciBhICJzYW5kYm94IiBvciBhICJjb250YWluZXIiLiBUaGVuLCB2YWxpZGF0ZQojIG90aGVyIGFubm90YXRpb25zIGJhc2VkIG9uIHRoZSBhY3R1YWwgInNhbmRib3giIG9yICJjb250YWluZXIiIHZhbHVlCiMgZnJvbSB0aGUgaW5wdXQgY29udGFpbmVyLgphbGxvd19ieV9jb250YWluZXJfdHlwZXMocF9vY2ksIGlfb2NpLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfYnlfY29udGFpbmVyX3R5cGVzOiBjaGVja2luZyBpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSIpCgogICAgY190eXBlIDo9ICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSIKICAgIAogICAgcF9jcmlfdHlwZSA6PSBwX29jaS5Bbm5vdGF0aW9uc1tjX3R5cGVdCiAgICBpX2NyaV90eXBlIDo9IGlfb2NpLkFubm90YXRpb25zW2NfdHlwZV0KICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZXM6IHBfY3JpX3R5cGUgPSIsIHBfY3JpX3R5cGUsICJpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgcF9jcmlfdHlwZSA9PSBpX2NyaV90eXBlCgogICAgYWxsb3dfYnlfY29udGFpbmVyX3R5cGUoaV9jcmlfdHlwZSwgcF9vY2ksIGlfb2NpLCBzX25hbWUsIHNfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZXM6IHRydWUiKQp9CgphbGxvd19ieV9jb250YWluZXJfdHlwZShpX2NyaV90eXBlLCBwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAxOiBpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgaV9jcmlfdHlwZSA9PSAic2FuZGJveCIKCiAgICBpX2thdGFfdHlwZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1siaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5jb250YWluZXJfdHlwZSJdCiAgICBwcmludCgiYWxsb3dfYnlfY29udGFpbmVyX3R5cGUgMTogaV9rYXRhX3R5cGUgPSIsIGlfa2F0YV90eXBlKQogICAgaV9rYXRhX3R5cGUgPT0gInBvZF9zYW5kYm94IgoKICAgIGFsbG93X3NhbmRib3hfY29udGFpbmVyX25hbWUocF9vY2ksIGlfb2NpKQogICAgYWxsb3dfc2FuZGJveF9uZXRfbmFtZXNwYWNlKHBfb2NpLCBpX29jaSkKICAgIGFsbG93X3NhbmRib3hfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpCgogICAgcHJpbnQoImFsbG93X2J5X2NvbnRhaW5lcl90eXBlIDE6IHRydWUiKQp9CgphbGxvd19ieV9jb250YWluZXJfdHlwZShpX2NyaV90eXBlLCBwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiBpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgaV9jcmlfdHlwZSA9PSAiY29udGFpbmVyIgoKICAgIGlfa2F0YV90eXBlIDo9IGlfb2NpLkFubm90YXRpb25zWyJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIl0KICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiBpX2thdGFfdHlwZSA9IiwgaV9rYXRhX3R5cGUpCiAgICBpX2thdGFfdHlwZSA9PSAicG9kX2NvbnRhaW5lciIKCiAgICBhbGxvd19jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpCiAgICBhbGxvd19uZXRfbmFtZXNwYWNlKHBfb2NpLCBpX29jaSkKICAgIGFsbG93X2xvZ19kaXJlY3RvcnkocF9vY2ksIGlfb2NpKQoKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiB0cnVlIikKfQoKIyAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLW5hbWUiIGFubm90YXRpb24KYWxsb3dfc2FuZGJveF9jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X2NvbnRhaW5lcl9uYW1lOiBzdGFydCIpCgogICAgY29udGFpbmVyX2Fubm90YXRpb25fbWlzc2luZyhwX29jaSwgaV9vY2ksICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItbmFtZSIpCgogICAgcHJpbnQoImFsbG93X3NhbmRib3hfY29udGFpbmVyX25hbWU6IHRydWUiKQp9CgphbGxvd19jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19jb250YWluZXJfbmFtZTogc3RhcnQiKQoKICAgIGFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uKHBfb2NpLCBpX29jaSwgImlvLmt1YmVybmV0ZXMuY3JpLmNvbnRhaW5lci1uYW1lIikKCiAgICBwcmludCgiYWxsb3dfY29udGFpbmVyX25hbWU6IHRydWUiKQp9Cgpjb250YWluZXJfYW5ub3RhdGlvbl9taXNzaW5nKHBfb2NpLCBpX29jaSwga2V5KSB7CiAgICBwcmludCgiY29udGFpbmVyX2Fubm90YXRpb25fbWlzc2luZzoiLCBrZXkpCgogICAgbm90IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIG5vdCBpX29jaS5Bbm5vdGF0aW9uc1trZXldCgogICAgcHJpbnQoImNvbnRhaW5lcl9hbm5vdGF0aW9uX21pc3Npbmc6IHRydWUiKQp9CgphbGxvd19jb250YWluZXJfYW5ub3RhdGlvbihwX29jaSwgaV9vY2ksIGtleSkgewogICAgcHJpbnQoImFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uOiBrZXkgPSIsIGtleSkKCiAgICBwX3ZhbHVlIDo9IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIGlfdmFsdWUgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgcHJpbnQoImFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uOiBwX3ZhbHVlID0iLCBwX3ZhbHVlLCAiaV92YWx1ZSA9IiwgaV92YWx1ZSkKCiAgICBwX3ZhbHVlID09IGlfdmFsdWUKCiAgICBwcmludCgiYWxsb3dfY29udGFpbmVyX2Fubm90YXRpb246IHRydWUiKQp9CgojICJuZXJkY3RsL25ldHdvcmstbmFtZXNwYWNlIiBhbm5vdGF0aW9uCmFsbG93X3NhbmRib3hfbmV0X25hbWVzcGFjZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X25ldF9uYW1lc3BhY2U6IHN0YXJ0IikKCiAgICBrZXkgOj0gIm5lcmRjdGwvbmV0d29yay1uYW1lc3BhY2UiCgogICAgcF9uYW1lc3BhY2UgOj0gcF9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgaV9uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgcHJpbnQoImFsbG93X3NhbmRib3hfbmV0X25hbWVzcGFjZTogcF9uYW1lc3BhY2UgPSIsIHBfbmFtZXNwYWNlLCAiaV9uYW1lc3BhY2UgPSIsIGlfbmFtZXNwYWNlKQoKICAgIHJlZ2V4Lm1hdGNoKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9uZXRfbmFtZXNwYWNlOiB0cnVlIikKfQoKYWxsb3dfbmV0X25hbWVzcGFjZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19uZXRfbmFtZXNwYWNlOiBzdGFydCIpCgogICAga2V5IDo9ICJuZXJkY3RsL25ldHdvcmstbmFtZXNwYWNlIgoKICAgIG5vdCBwX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICBub3QgaV9vY2kuQW5ub3RhdGlvbnNba2V5XQoKICAgIHByaW50KCJhbGxvd19uZXRfbmFtZXNwYWNlOiB0cnVlIikKfQoKIyAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1sb2ctZGlyZWN0b3J5IiBhbm5vdGF0aW9uCmFsbG93X3NhbmRib3hfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X2xvZ19kaXJlY3Rvcnk6IHN0YXJ0IikKCiAgICBrZXkgOj0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbG9nLWRpcmVjdG9yeSIKCiAgICBwX2RpciA6PSBwX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICByZWdleDEgOj0gcmVwbGFjZShwX2RpciwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHJlZ2V4MiA6PSByZXBsYWNlKHJlZ2V4MSwgIiQoc2FuZGJveC1uYW1lc3BhY2UpIiwgc19uYW1lc3BhY2UpCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiByZWdleDIgPSIsIHJlZ2V4MikKCiAgICBpX2RpciA6PSBpX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiBpX2RpciA9IiwgaV9kaXIpCgogICAgcmVnZXgubWF0Y2gocmVnZXgyLCBpX2RpcikKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiB0cnVlIikKfQoKYWxsb3dfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19sb2dfZGlyZWN0b3J5OiBzdGFydCIpCgogICAga2V5IDo9ICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWxvZy1kaXJlY3RvcnkiCgogICAgbm90IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIG5vdCBpX29jaS5Bbm5vdGF0aW9uc1trZXldCgogICAgcHJpbnQoImFsbG93X2xvZ19kaXJlY3Rvcnk6IHRydWUiKQp9CgphbGxvd19kZXZpY2VzKHBfZGV2aWNlcywgaV9kZXZpY2VzKSB7CiAgICBwcmludCgiYWxsb3dfZGV2aWNlczogc3RhcnQiKQogICAgZXZlcnkgaV9kZXZpY2UgaW4gaV9kZXZpY2VzIHsKICAgICAgICBwcmludCgiYWxsb3dfZGV2aWNlczogaV9kZXZpY2UgPSIsIGlfZGV2aWNlKQogICAgICAgIHNvbWUgcF9kZXZpY2UgaW4gcF9kZXZpY2VzCiAgICAgICAgcF9kZXZpY2UuY29udGFpbmVyX3BhdGggPT0gaV9kZXZpY2UuY29udGFpbmVyX3BhdGgKICAgIH0KICAgIHByaW50KCJhbGxvd19kZXZpY2VzOiB0cnVlIikKfQoKYWxsb3dfbGludXgoc3RhdGVfb3BzLCBwX29jaSwgaV9vY2kpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIHBfbmFtZXNwYWNlcyA6PSBwX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbGludXg6IHAgbmFtZXNwYWNlcyA9IiwgcF9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlcyA6PSBpX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbGludXg6IGkgbmFtZXNwYWNlcyA9IiwgaV9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlX3dpdGhvdXRfbmV0d29yayA6PSBbb2JqIHwgb2JqIDo9IGlfbmFtZXNwYWNlc1tfXTsgb2JqLlR5cGUgIT0gIm5ldHdvcmsiXQoKICAgIHByaW50KCJhbGxvd19saW51eDogaV9uYW1lc3BhY2Vfd2l0aG91dF9uZXR3b3JrID0iLCBpX25hbWVzcGFjZV93aXRob3V0X25ldHdvcmspCgogICAgcF9uYW1lc3BhY2VzID09IGlfbmFtZXNwYWNlX3dpdGhvdXRfbmV0d29yawoKICAgIGFsbG93X21hc2tlZF9wYXRocyhwX29jaSwgaV9vY2kpCiAgICBhbGxvd19yZWFkb25seV9wYXRocyhwX29jaSwgaV9vY2kpCiAgICBhbGxvd19saW51eF9kZXZpY2VzKHBfb2NpLkxpbnV4LkRldmljZXMsIGlfb2NpLkxpbnV4LkRldmljZXMpCiAgICBhbGxvd19saW51eF9zeXNjdGwocF9vY2kuTGludXgsIGlfb2NpLkxpbnV4KQogICAgcmV0IDo9IGFsbG93X25ldHdvcmtfbmFtZXNwYWNlX3N0YXJ0KHN0YXRlX29wcywgcF9vY2ksIGlfb2NpKQogICAgcmV0LmFsbG93ZWQKCiAgICBvcHMgOj0gcmV0Lm9wcwoKICAgIHByaW50KCJhbGxvd19saW51eDogdHJ1ZSIpCn0KCiMgUmV0cmlldmUgdGhlICJuZXR3b3JrIiBuYW1lc3BhY2UgZnJvbSB0aGUgaW5wdXQgZGF0YSBhbmQgcGFzcyBpdCBvbiBmb3IgdGhlCiMgbmV0d29yayBuYW1lc3BhY2UgcG9saWN5IGNoZWNrcy4KYWxsb3dfbmV0d29ya19uYW1lc3BhY2Vfc3RhcnQoc3RhdGVfb3BzLCBwX29jaSwgaV9vY2kpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIHByaW50KCJhbGxvd19uZXR3b3JrX25hbWVzcGFjZSBzdGFydDogc3RhcnQiKQoKICAgIHBfbmFtZXNwYWNlcyA6PSBwX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IHAgbmFtZXNwYWNlcyA9IiwgcF9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlcyA6PSBpX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IGkgbmFtZXNwYWNlcyA9IiwgaV9uYW1lc3BhY2VzKQoKICAgICMgUmV0dXJuIHBhdGggb2YgdGhlICJuZXR3b3JrIiBuYW1lc3BhY2UKICAgIG5ldHdvcmtfbnMgOj0gW29iaiB8IG9iaiA6PSBpX25hbWVzcGFjZXNbX107IG9iai5UeXBlID09ICJuZXR3b3JrIl0KCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IG5ldHdvcmtfbnMgPSIsIG5ldHdvcmtfbnMpCgogICAgcmV0IDo9IGFsbG93X25ldHdvcmtfbmFtZXNwYWNlKHN0YXRlX29wcywgbmV0d29ya19ucykKICAgIHJldC5hbGxvd2VkCgogICAgb3BzIDo9IHJldC5vcHMKfQoKIyBUaGlzIHJ1bGUgaXMgd2hlbiB0aGVyZSdzIG5vIG5ldHdvcmsgbmFtZXNwYWNlIGluIHRoZSBpbnB1dCBkYXRhLgphbGxvd19uZXR3b3JrX25hbWVzcGFjZShzdGF0ZV9vcHMsIG5ldHdvcmtfbnMpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIGNvdW50KG5ldHdvcmtfbnMpID09IDAKCiAgICBuZXR3b3JrX25zX3BhdGggPSAiIgoKICAgIGFkZF9uZXR3b3JrX25hbWVzcGFjZV90b19zdGF0ZSA6PSBzdGF0ZV9hbGxvd3MoIm5ldHdvcmtfbmFtZXNwYWNlIiwgbmV0d29ya19uc19wYXRoKQogICAgb3BzIDo9IGNvbmNhdF9vcF9pZl9ub3RfbnVsbChzdGF0ZV9vcHMsIGFkZF9uZXR3b3JrX25hbWVzcGFjZV90b19zdGF0ZSkKCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2UgMTogdHJ1ZSIpCn0KCiMgVGhpcyBydWxlIGlzIHdoZW4gdGhlcmUncyBleGFjdGx5IG9uZSBuZXR3b3JrIG5hbWVzcGFjZSBpbiB0aGUgaW5wdXQgZGF0YS4KYWxsb3dfbmV0d29ya19uYW1lc3BhY2Uoc3RhdGVfb3BzLCBuZXR3b3JrX25zKSA6PSB7Im9wcyI6IG9wcywgImFsbG93ZWQiOiB0cnVlfSB7CiAgICBjb3VudChuZXR3b3JrX25zKSA9PSAxCgogICAgYWRkX25ldHdvcmtfbmFtZXNwYWNlX3RvX3N0YXRlIDo9IHN0YXRlX2FsbG93cygibmV0d29ya19uYW1lc3BhY2UiLCBuZXR3b3JrX25zWzBdLlBhdGgpCiAgICBvcHMgOj0gY29uY2F0X29wX2lmX25vdF9udWxsKHN0YXRlX29wcywgYWRkX25ldHdvcmtfbmFtZXNwYWNlX3RvX3N0YXRlKQoKICAgIHByaW50KCJhbGxvd19uZXR3b3JrX25hbWVzcGFjZSAyOiB0cnVlIikKfQoKYWxsb3dfbWFza2VkX3BhdGhzKHBfb2NpLCBpX29jaSkgewogICAgcF9wYXRocyA6PSBwX29jaS5MaW51eC5NYXNrZWRQYXRocwogICAgcHJpbnQoImFsbG93X21hc2tlZF9wYXRocyAxOiBwX3BhdGhzID0iLCBwX3BhdGhzKQoKICAgIGlfcGF0aHMgOj0gaV9vY2kuTGludXguTWFza2VkUGF0aHMKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aHMgMTogaV9wYXRocyA9IiwgaV9wYXRocykKCiAgICBhbGxvd19tYXNrZWRfcGF0aHNfYXJyYXkocF9wYXRocywgaV9wYXRocykKCiAgICBwcmludCgiYWxsb3dfbWFza2VkX3BhdGhzIDE6IHRydWUiKQp9CmFsbG93X21hc2tlZF9wYXRocyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aHMgMjogc3RhcnQiKQoKICAgIG5vdCBwX29jaS5MaW51eC5NYXNrZWRQYXRocwogICAgbm90IGlfb2NpLkxpbnV4Lk1hc2tlZFBhdGhzCgogICAgcHJpbnQoImFsbG93X21hc2tlZF9wYXRocyAyOiB0cnVlIikKfQoKIyBBbGwgdGhlIHBvbGljeSBtYXNrZWQgcGF0aHMgbXVzdCBiZSBtYXNrZWQgaW4gdGhlIGlucHV0IGRhdGEgdG9vLgojIElucHV0IGlzIGFsbG93ZWQgdG8gaGF2ZSBtb3JlIG1hc2tlZCBwYXRocyB0aGFuIHRoZSBwb2xpY3kuCmFsbG93X21hc2tlZF9wYXRoc19hcnJheShwX2FycmF5LCBpX2FycmF5KSB7CiAgICBldmVyeSBwX2VsZW0gaW4gcF9hcnJheSB7CiAgICAgICAgYWxsb3dfbWFza2VkX3BhdGgocF9lbGVtLCBpX2FycmF5KQogICAgfQp9CgphbGxvd19tYXNrZWRfcGF0aChwX2VsZW0sIGlfYXJyYXkpIHsKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aDogcF9lbGVtID0iLCBwX2VsZW0pCgogICAgc29tZSBpX2VsZW0gaW4gaV9hcnJheQogICAgcF9lbGVtID09IGlfZWxlbQoKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aDogdHJ1ZSIpCn0KCmFsbG93X3JlYWRvbmx5X3BhdGhzKHBfb2NpLCBpX29jaSkgewogICAgcF9wYXRocyA6PSBwX29jaS5MaW51eC5SZWFkb25seVBhdGhzCiAgICBwcmludCgiYWxsb3dfcmVhZG9ubHlfcGF0aHMgMTogcF9wYXRocyA9IiwgcF9wYXRocykKCiAgICBpX3BhdGhzIDo9IGlfb2NpLkxpbnV4LlJlYWRvbmx5UGF0aHMKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAxOiBpX3BhdGhzID0iLCBpX3BhdGhzKQoKICAgIGFsbG93X3JlYWRvbmx5X3BhdGhzX2FycmF5KHBfcGF0aHMsIGlfcGF0aHMsIGlfb2NpLkxpbnV4Lk1hc2tlZFBhdGhzKQoKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAxOiB0cnVlIikKfQphbGxvd19yZWFkb25seV9wYXRocyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAyOiBzdGFydCIpCgogICAgbm90IHBfb2NpLkxpbnV4LlJlYWRvbmx5UGF0aHMKICAgIG5vdCBpX29jaS5MaW51eC5SZWFkb25seVBhdGhzCgogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGhzIDI6IHRydWUiKQp9CgojIEFsbCB0aGUgcG9saWN5IHJlYWRvbmx5IHBhdGhzIG11c3QgYmUgZWl0aGVyOgojIC0gUHJlc2VudCBpbiB0aGUgaW5wdXQgcmVhZG9ubHkgcGF0aHMsIG9yCiMgLSBQcmVzZW50IGluIHRoZSBpbnB1dCBtYXNrZWQgcGF0aHMuCiMgSW5wdXQgaXMgYWxsb3dlZCB0byBoYXZlIG1vcmUgcmVhZG9ubHkgcGF0aHMgdGhhbiB0aGUgcG9saWN5LgphbGxvd19yZWFkb25seV9wYXRoc19hcnJheShwX2FycmF5LCBpX2FycmF5LCBtYXNrZWRfcGF0aHMpIHsKICAgIGV2ZXJ5IHBfZWxlbSBpbiBwX2FycmF5IHsKICAgICAgICBhbGxvd19yZWFkb25seV9wYXRoKHBfZWxlbSwgaV9hcnJheSwgbWFza2VkX3BhdGhzKQogICAgfQp9CgphbGxvd19yZWFkb25seV9wYXRoKHBfZWxlbSwgaV9hcnJheSwgbWFza2VkX3BhdGhzKSB7CiAgICBwcmludCgiYWxsb3dfcmVhZG9ubHlfcGF0aCAxOiBwX2VsZW0gPSIsIHBfZWxlbSkKCiAgICBzb21lIGlfZWxlbSBpbiBpX2FycmF5CiAgICBwX2VsZW0gPT0gaV9lbGVtCgogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGggMTogdHJ1ZSIpCn0KYWxsb3dfcmVhZG9ubHlfcGF0aChwX2VsZW0sIGlfYXJyYXksIG1hc2tlZF9wYXRocykgewogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGggMjogcF9lbGVtID0iLCBwX2VsZW0pCgogICAgc29tZSBpX21hc2tlZCBpbiBtYXNrZWRfcGF0aHMKICAgIHBfZWxlbSA9PSBpX21hc2tlZAoKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRoIDI6IHRydWUiKQp9CgphbGxvd19saW51eF9kZXZpY2VzKHBfZGV2aWNlcywgaV9kZXZpY2VzKSB7CiAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogc3RhcnQiKQogICAgZXZlcnkgaV9kZXZpY2UgaW4gaV9kZXZpY2VzIHsKICAgICAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogaV9kZXZpY2UgPSIsIGlfZGV2aWNlKQogICAgICAgIHNvbWUgcF9kZXZpY2UgaW4gcF9kZXZpY2VzCiAgICAgICAgaV9kZXZpY2UuUGF0aCA9PSBwX2RldmljZS5QYXRoCiAgICB9CiAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogdHJ1ZSIpCn0KCmFsbG93X2xpbnV4X3N5c2N0bChwX2xpbnV4LCBpX2xpbnV4KSB7CiAgICBwcmludCgiYWxsb3dfbGludXhfc3lzY3RsIDE6IHN0YXJ0IikKICAgIG5vdCBpX2xpbnV4LlN5c2N0bAogICAgcHJpbnQoImFsbG93X2xpbnV4X3N5c2N0bCAxOiB0cnVlIikKfQoKYWxsb3dfbGludXhfc3lzY3RsKHBfbGludXgsIGlfbGludXgpIHsKICAgIHByaW50KCJhbGxvd19saW51eF9zeXNjdGwgMjogc3RhcnQiKQogICAgcF9zeXNjdGwgOj0gcF9saW51eC5TeXNjdGwKICAgIGlfc3lzY3RsIDo9IGlfbGludXguU3lzY3RsCiAgICBldmVyeSBpX25hbWUsIGlfdmFsIGluIGlfc3lzY3RsIHsKICAgICAgICBwcmludCgiYWxsb3dfbGludXhfc3lzY3RsIDI6IGlfbmFtZSA9IiwgaV9uYW1lLCAiaV92YWwgPSIsIGlfdmFsKQogICAgICAgIHBfc3lzY3RsW2lfbmFtZV0gPT0gaV92YWwKICAgIH0KICAgIHByaW50KCJhbGxvd19saW51eF9zeXNjdGwgMjogdHJ1ZSIpCn0KCiMgQ2hlY2sgdGhlIGNvbnNpc3RlbmN5IG9mIHRoZSBpbnB1dCAiaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5idW5kbGVfcGF0aCIKIyBhbmQgaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCIgdmFsdWVzIHdpdGggb3RoZXIgZmllbGRzLgphbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZChwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpIHsKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogc3RhcnQiKQoKICAgIGJ1bmRsZV9wYXRoIDo9IGlfb2NpLkFubm90YXRpb25zWyJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmJ1bmRsZV9wYXRoIl0KICAgIGJ1bmRsZV9pZCA6PSByZXBsYWNlKGJ1bmRsZV9wYXRoLCAiL3J1bi9jb250YWluZXJkL2lvLmNvbnRhaW5lcmQucnVudGltZS52Mi50YXNrL2s4cy5pby8iLCAiIikKCiAgICBidW5kbGVfaWRfZm9ybWF0IDo9IGNvbmNhdCgiIiwgWyJeIiwgQlVORExFX0lELCAiJCJdKQogICAgcmVnZXgubWF0Y2goYnVuZGxlX2lkX2Zvcm1hdCwgYnVuZGxlX2lkKQoKICAgIGtleSA6PSAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCIKCiAgICBwX3JlZ2V4IDo9IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIHNhbmRib3hfaWQgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQoKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogc2FuZGJveF9pZCA9Iiwgc2FuZGJveF9pZCwgInJlZ2V4ID0iLCBwX3JlZ2V4KQogICAgcmVnZXgubWF0Y2gocF9yZWdleCwgc2FuZGJveF9pZCkKCiAgICBhbGxvd19yb290X3BhdGgocF9vY2ksIGlfb2NpLCBidW5kbGVfaWQpCgogICAgZXZlcnkgaV9tb3VudCBpbiBpX29jaS5Nb3VudHMgewogICAgICAgIGFsbG93X21vdW50KHBfb2NpLCBpX21vdW50LCBpX3N0b3JhZ2VzLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpCiAgICB9CgogICAgYWxsb3dfc3RvcmFnZXMocF9zdG9yYWdlcywgaV9zdG9yYWdlcywgYnVuZGxlX2lkLCBzYW5kYm94X2lkKQoKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogdHJ1ZSIpCn0KCmFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHBfcHJvY2VzcyA9IiwgcF9wcm9jZXNzKQogICAgcHJpbnQoImFsbG93X3Byb2Nlc3NfY29tbW9uOiBpX3Byb2Nlc3MgPSAiLCBpX3Byb2Nlc3MpCiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHNfbmFtZSA9Iiwgc19uYW1lKQoKICAgIHBfcHJvY2Vzcy5Dd2QgPT0gaV9wcm9jZXNzLkN3ZAogICAgcF9wcm9jZXNzLk5vTmV3UHJpdmlsZWdlcyA9PSBpX3Byb2Nlc3MuTm9OZXdQcml2aWxlZ2VzCgogICAgYWxsb3dfdXNlcihwX3Byb2Nlc3MsIGlfcHJvY2VzcykKICAgIGFsbG93X2VudihwX3Byb2Nlc3MsIGlfcHJvY2Vzcywgc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHRydWUiKQp9CgojIENvbXBhcmUgdGhlIE9DSSBQcm9jZXNzIGZpZWxkIG9mIGEgcG9saWN5IGNvbnRhaW5lciB3aXRoIHRoZSBpbnB1dCBPQ0kgUHJvY2VzcyBmcm9tIGEgQ3JlYXRlQ29udGFpbmVyUmVxdWVzdAphbGxvd19wcm9jZXNzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfcHJvY2Vzczogc3RhcnQiKQoKICAgIGFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgYWxsb3dfY2FwcyhwX3Byb2Nlc3MuQ2FwYWJpbGl0aWVzLCBpX3Byb2Nlc3MuQ2FwYWJpbGl0aWVzKQogICAgcF9wcm9jZXNzLlRlcm1pbmFsID09IGlfcHJvY2Vzcy5UZXJtaW5hbAoKICAgIHByaW50KCJhbGxvd19wcm9jZXNzOiB0cnVlIikKfQoKIyBDb21wYXJlIHRoZSBPQ0kgUHJvY2VzcyBmaWVsZCBvZiBhIHBvbGljeSBjb250YWluZXIgd2l0aCB0aGUgaW5wdXQgcHJvY2VzcyBmaWVsZCBmcm9tIEV4ZWNQcm9jZXNzUmVxdWVzdAphbGxvd19pbnRlcmFjdGl2ZV9wcm9jZXNzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfaW50ZXJhY3RpdmVfcHJvY2Vzczogc3RhcnQiKQoKICAgIGFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgYWxsb3dfZXhlY19jYXBzKGlfcHJvY2Vzcy5DYXBhYmlsaXRpZXMpCgogICAgIyBUaGVzZSBhcmUgY29tbWFuZHMgZW5hYmxlZCB1c2luZyBFeGVjUHJvY2Vzc1JlcXVlc3QgY29tbWFuZHMgYW5kL29yIHJlZ2V4IGZyb20gdGhlIHNldHRpbmdzIGZpbGUuCiAgICAjIFRoZXkgY2FuIGJlIGV4ZWN1dGVkIGludGVyYWN0aXZlbHkgc28gYWxsb3cgdGhlbSB0byB1c2UgYW55IHZhbHVlIGZvciBpX3Byb2Nlc3MuVGVybWluYWwuCgogICAgcHJpbnQoImFsbG93X2ludGVyYWN0aXZlX3Byb2Nlc3M6IHRydWUiKQp9CgojIENvbXBhcmUgdGhlIE9DSSBQcm9jZXNzIGZpZWxkIG9mIGEgcG9saWN5IGNvbnRhaW5lciB3aXRoIHRoZSBpbnB1dCBwcm9jZXNzIGZpZWxkIGZyb20gRXhlY1Byb2Nlc3NSZXF1ZXN0CmFsbG93X3Byb2JlX3Byb2Nlc3MocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19wcm9iZV9wcm9jZXNzOiBzdGFydCIpCgogICAgYWxsb3dfcHJvY2Vzc19jb21tb24ocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpCiAgICBhbGxvd19leGVjX2NhcHMoaV9wcm9jZXNzLkNhcGFiaWxpdGllcykKICAgIHBfcHJvY2Vzcy5UZXJtaW5hbCA9PSBpX3Byb2Nlc3MuVGVybWluYWwKCiAgICBwcmludCgiYWxsb3dfcHJvYmVfcHJvY2VzczogdHJ1ZSIpCn0KCmFsbG93X3VzZXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MpIHsKICAgIHBfdXNlciA6PSBwX3Byb2Nlc3MuVXNlcgogICAgaV91c2VyIDo9IGlfcHJvY2Vzcy5Vc2VyCgogICAgcHJpbnQoImFsbG93X3VzZXI6IGlucHV0IHVpZCA9IiwgaV91c2VyLlVJRCwgInBvbGljeSB1aWQgPSIsIHBfdXNlci5VSUQpCiAgICBwX3VzZXIuVUlEID09IGlfdXNlci5VSUQKCiAgICAjIFRPRE86IHRyYWNrIGRvd24gdGhlIHJlYXNvbiBmb3IgcmVnaXN0cnkuazhzLmlvL3BhdXNlOjMuOSBiZWluZwogICAgIyAgICAgICBleGVjdXRlZCB3aXRoIGdpZCA9IDAgZGVzcGl0ZSBoYXZpbmcgIjY1NTM1OjY1NTM1IiBpbiBpdHMgY29udGFpbmVyIGltYWdlCiAgICAjICAgICAgIGNvbmZpZy4KICAgICNwcmludCgiYWxsb3dfdXNlcjogaW5wdXQgZ2lkID0iLCBpX3VzZXIuR0lELCAicG9saWN5IGdpZCA9IiwgcF91c2VyLkdJRCkKICAgICNwX3VzZXIuR0lEID09IGlfdXNlci5HSUQKCiAgICAjIFRPRE86IGNvbXBhcmUgdGhlIGFkZGl0aW9uYWxHaWRzIGZpZWxkIHRvbyBhZnRlciBjb21wdXRpbmcgaXRzIHZhbHVlCiAgICAjIGJhc2VkIG9uIC9ldGMvcGFzc3dkIGFuZCAvZXRjL2dyb3VwIGZyb20gdGhlIGNvbnRhaW5lciBpbWFnZS4KfQoKYWxsb3dfZGVwcmVjYXRlZF9hcmdzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZ3MgMTogbm8gYXJncyIpCgogICAgbm90IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJncwogICAgbm90IGlfcHJvY2Vzcy5BcmdzCgogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAxOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZ3MocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSkgewogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiBwb2xpY3kgYXJncyA9IiwgcF9wcm9jZXNzLkRlcHJlY2F0ZWRBcmdzKQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiBpbnB1dCBhcmdzID0iLCBpX3Byb2Nlc3MuQXJncykKCiAgICBjb3VudChwX3Byb2Nlc3MuRGVwcmVjYXRlZEFyZ3MpID09IGNvdW50KGlfcHJvY2Vzcy5BcmdzKQoKICAgIGV2ZXJ5IGksIGlfYXJnIGluIGlfcHJvY2Vzcy5BcmdzIHsKICAgICAgICBhbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpCiAgICB9CgogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDE6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgcF9hcmcyIDo9IHJlcGxhY2UocF9hcmcsICIkJCIsICIkIikKICAgIHBfYXJnMiA9PSBpX2FyZwoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAxOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDI6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgIyBUT0RPOiBjYW4gJChub2RlLW5hbWUpIGJlIGhhbmRsZWQgYmV0dGVyPwogICAgY29udGFpbnMocF9hcmcsICIkKG5vZGUtbmFtZSkiKQoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAyOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDM6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgcF9hcmcyIDo9IHJlcGxhY2UocF9hcmcsICIkJCIsICIkIikKICAgIHBfYXJnMyA6PSByZXBsYWNlKHBfYXJnMiwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAzOiBwX2FyZzMgPSIsIHBfYXJnMykKICAgIHBfYXJnMyA9PSBpX2FyZwoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAzOiB0cnVlIikKfQoKIyBPQ0kgcHJvY2Vzcy5FbnYgZmllbGQKYWxsb3dfZW52KHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfZW52OiBwIGVudiA9IiwgcF9wcm9jZXNzLkVudikKICAgIHByaW50KCJhbGxvd19lbnY6IGkgZW52ID0iLCBpX3Byb2Nlc3MuRW52KQoKICAgIGV2ZXJ5IGlfdmFyIGluIGlfcHJvY2Vzcy5FbnYgewogICAgICAgIHByaW50KCJhbGxvd19lbnY6IGlfdmFyID0iLCBpX3ZhcikKICAgICAgICBhbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgfQoKICAgIHByaW50KCJhbGxvd19lbnY6IHRydWUiKQp9CgojIEFsbG93IGlucHV0IGVudiB2YXJpYWJsZXMgdGhhdCBhcmUgcHJlc2VudCBpbiB0aGUgcG9saWN5IGRhdGEgdG9vLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHBfdmFyID09IGlfdmFyCiAgICBwcmludCgiYWxsb3dfdmFyIDE6IHRydWUiKQp9CgojIE1hdGNoIGlucHV0IHdpdGggb25lIG9mIHRoZSBwb2xpY3kgdmFyaWFibGVzLCBhZnRlciBzdWJzdGl0dXRpbmcgJChzYW5kYm94LW5hbWUpLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHByaW50KCJhbGxvd192YXIgMjogcF92YXIgPSIsIHBfdmFyKQoKICAgIHBfdmFyX3NwbGl0IDo9IHNwbGl0KHBfdmFyLCAiPSIpCiAgICBjb3VudChwX3Zhcl9zcGxpdCkgPT0gMgoKICAgIHBfdmFyX3NwbGl0WzFdID09ICIkKHNhbmRib3gtbmFtZSkiCgogICAgaV92YXJfc3BsaXQgOj0gc3BsaXQoaV92YXIsICI9IikKICAgIGNvdW50KGlfdmFyX3NwbGl0KSA9PSAyCgogICAgaV92YXJfc3BsaXRbMF0gPT0gcF92YXJfc3BsaXRbMF0KICAgIHJlZ2V4Lm1hdGNoKHNfbmFtZSwgaV92YXJfc3BsaXRbMV0pCgogICAgcHJpbnQoImFsbG93X3ZhciAyOiB0cnVlIikKfQoKIyBBbGxvdyBpbnB1dCBlbnYgdmFyaWFibGVzIHRoYXQgbWF0Y2ggd2l0aCBhIHJlcXVlc3RfZGVmYXVsdHMgcmVnZXguCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHNvbWUgcF9yZWdleDEgaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5DcmVhdGVDb250YWluZXJSZXF1ZXN0LmFsbG93X2Vudl9yZWdleAogICAgcF9yZWdleDIgOj0gcmVwbGFjZShwX3JlZ2V4MSwgIiQoaXB2NF9hKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcHY0X2EpCiAgICBwX3JlZ2V4MyA6PSByZXBsYWNlKHBfcmVnZXgyLCAiJChpcF9wKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcF9wKQogICAgcF9yZWdleDQgOj0gcmVwbGFjZShwX3JlZ2V4MywgIiQoc3ZjX25hbWUpIiwgcG9saWN5X2RhdGEuY29tbW9uLnN2Y19uYW1lKQogICAgcF9yZWdleDUgOj0gcmVwbGFjZShwX3JlZ2V4NCwgIiQoZG5zX2xhYmVsKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5kbnNfbGFiZWwpCgogICAgcHJpbnQoImFsbG93X3ZhciAzOiBwX3JlZ2V4NSA9IiwgcF9yZWdleDUpCiAgICByZWdleC5tYXRjaChwX3JlZ2V4NSwgaV92YXIpCgogICAgcHJpbnQoImFsbG93X3ZhciAzOiB0cnVlIikKfQoKIyBBbGxvdyBmaWVsZFJlZiAiZmllbGRQYXRoOiBzdGF0dXMucG9kSVAiIHZhbHVlcy4KYWxsb3dfdmFyKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBpX3Zhciwgc19uYW1lLCBzX25hbWVzcGFjZSkgewogICAgbmFtZV92YWx1ZSA6PSBzcGxpdChpX3ZhciwgIj0iKQogICAgY291bnQobmFtZV92YWx1ZSkgPT0gMgogICAgaXNfaXAobmFtZV92YWx1ZVsxXSkKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIGFsbG93X3BvZF9pcF92YXIobmFtZV92YWx1ZVswXSwgcF92YXIpCgogICAgcHJpbnQoImFsbG93X3ZhciA0OiB0cnVlIikKfQoKIyBBbGxvdyBjb21tb24gZmllbGRSZWYgdmFyaWFibGVzLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBuYW1lX3ZhbHVlIDo9IHNwbGl0KGlfdmFyLCAiPSIpCiAgICBjb3VudChuYW1lX3ZhbHVlKSA9PSAyCgogICAgc29tZSBwX3ZhciBpbiBwX3Byb2Nlc3MuRW52CiAgICBwX25hbWVfdmFsdWUgOj0gc3BsaXQocF92YXIsICI9IikKICAgIGNvdW50KHBfbmFtZV92YWx1ZSkgPT0gMgoKICAgIHBfbmFtZV92YWx1ZVswXSA9PSBuYW1lX3ZhbHVlWzBdCgogICAgIyBUT0RPOiBzaG91bGQgdGhlc2UgYmUgaGFuZGxlZCBpbiBhIGRpZmZlcmVudCB3YXk/CiAgICBhbHdheXNfYWxsb3dlZCA6PSBbIiQoaG9zdC1uYW1lKSIsICIkKG5vZGUtbmFtZSkiLCAiJChwb2QtdWlkKSJdCiAgICBzb21lIGFsbG93ZWQgaW4gYWx3YXlzX2FsbG93ZWQKICAgIGNvbnRhaW5zKHBfbmFtZV92YWx1ZVsxXSwgYWxsb3dlZCkKCiAgICBwcmludCgiYWxsb3dfdmFyIDU6IHRydWUiKQp9CgojIEFsbG93IGZpZWxkUmVmICJmaWVsZFBhdGg6IHN0YXR1cy5ob3N0SVAiIHZhbHVlcy4KYWxsb3dfdmFyKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBpX3Zhciwgc19uYW1lLCBzX25hbWVzcGFjZSkgewogICAgbmFtZV92YWx1ZSA6PSBzcGxpdChpX3ZhciwgIj0iKQogICAgY291bnQobmFtZV92YWx1ZSkgPT0gMgogICAgaXNfaXAobmFtZV92YWx1ZVsxXSkKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIGFsbG93X2hvc3RfaXBfdmFyKG5hbWVfdmFsdWVbMF0sIHBfdmFyKQoKICAgIHByaW50KCJhbGxvd192YXIgNjogdHJ1ZSIpCn0KCiMgQWxsb3cgcmVzb3VyY2VGaWVsZFJlZiB2YWx1ZXMgKGUuZy4sICJsaW1pdHMuY3B1IikuCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIG5hbWVfdmFsdWUgOj0gc3BsaXQoaV92YXIsICI9IikKICAgIGNvdW50KG5hbWVfdmFsdWUpID09IDIKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHBfbmFtZV92YWx1ZSA6PSBzcGxpdChwX3ZhciwgIj0iKQogICAgY291bnQocF9uYW1lX3ZhbHVlKSA9PSAyCgogICAgcF9uYW1lX3ZhbHVlWzBdID09IG5hbWVfdmFsdWVbMF0KCiAgICAjIGEgdmFyaWFibGUgd2Ugc2hvdWxkIGJlIHZhbGlkYXRpbmcgdXNpbmcgYSByZWdleCBmcm9tIHNldHRpbmdzCiAgICBwX25hbWVfdmFsdWVbMV0gPT0gIiQodmFsaWRhdGUtZnJvbS1zZXR0aW5ncykiCgogICAgcmVnZXhfdmFsIDo9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuQ3JlYXRlQ29udGFpbmVyUmVxdWVzdC5hbGxvd19lbnZfcmVnZXhfbWFwW25hbWVfdmFsdWVbMF1dCgogICAgcHJpbnQoImFsbG93X3ZhciA3OiB2YWwgPSIsIG5hbWVfdmFsdWVbMV0pCiAgICBwcmludCgiYWxsb3dfdmFyIDc6IHJlZ2V4X3ZhbCA9IiwgcmVnZXhfdmFsKQoKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4X3ZhbCwgbmFtZV92YWx1ZVsxXSkKCiAgICBwcmludCgiYWxsb3dfdmFyIDc6IHRydWUiKQp9CgojIE1hdGNoIGlucHV0IHdpdGggb25lIG9mIHRoZSBwb2xpY3kgdmFyaWFibGVzLCBhZnRlciBzdWJzdGl0dXRpbmcgJChzYW5kYm94LW5hbWVzcGFjZSkuCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHNvbWUgcF92YXIgaW4gcF9wcm9jZXNzLkVudgogICAgcF92YXIyIDo9IHJlcGxhY2UocF92YXIsICIkKHNhbmRib3gtbmFtZXNwYWNlKSIsIHNfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd192YXIgODogcF92YXIyID0iLCBwX3ZhcjIpCiAgICBwX3ZhcjIgPT0gaV92YXIKCiAgICBwcmludCgiYWxsb3dfdmFyIDg6IHRydWUiKQp9CgphbGxvd19wb2RfaXBfdmFyKHZhcl9uYW1lLCBwX3ZhcikgewogICAgcHJpbnQoImFsbG93X3BvZF9pcF92YXI6IHZhcl9uYW1lID0iLCB2YXJfbmFtZSwgInBfdmFyID0iLCBwX3ZhcikKCiAgICBwX25hbWVfdmFsdWUgOj0gc3BsaXQocF92YXIsICI9IikKICAgIGNvdW50KHBfbmFtZV92YWx1ZSkgPT0gMgoKICAgIHBfbmFtZV92YWx1ZVswXSA9PSB2YXJfbmFtZQogICAgcF9uYW1lX3ZhbHVlWzFdID09ICIkKHBvZC1pcCkiCgogICAgcHJpbnQoImFsbG93X3BvZF9pcF92YXI6IHRydWUiKQp9CgphbGxvd19ob3N0X2lwX3Zhcih2YXJfbmFtZSwgcF92YXIpIHsKICAgIHByaW50KCJhbGxvd19ob3N0X2lwX3ZhcjogdmFyX25hbWUgPSIsIHZhcl9uYW1lLCAicF92YXIgPSIsIHBfdmFyKQoKICAgIHBfbmFtZV92YWx1ZSA6PSBzcGxpdChwX3ZhciwgIj0iKQogICAgY291bnQocF9uYW1lX3ZhbHVlKSA9PSAyCgogICAgcF9uYW1lX3ZhbHVlWzBdID09IHZhcl9uYW1lCiAgICBwX25hbWVfdmFsdWVbMV0gPT0gIiQoaG9zdC1pcCkiCgogICAgcHJpbnQoImFsbG93X2hvc3RfaXBfdmFyOiB0cnVlIikKfQoKaXNfaXAodmFsdWUpIHsKICAgIGJ5dGVzID0gc3BsaXQodmFsdWUsICIuIikKICAgIGNvdW50KGJ5dGVzKSA9PSA0CgogICAgaXNfaXBfZmlyc3RfYnl0ZShieXRlc1swXSkKICAgIGlzX2lwX290aGVyX2J5dGUoYnl0ZXNbMV0pCiAgICBpc19pcF9vdGhlcl9ieXRlKGJ5dGVzWzJdKQogICAgaXNfaXBfb3RoZXJfYnl0ZShieXRlc1szXSkKfQppc19pcF9maXJzdF9ieXRlKGNvbXBvbmVudCkgewogICAgbnVtYmVyID0gdG9fbnVtYmVyKGNvbXBvbmVudCkKICAgIG51bWJlciA+PSAxCiAgICBudW1iZXIgPD0gMjU1Cn0KaXNfaXBfb3RoZXJfYnl0ZShjb21wb25lbnQpIHsKICAgIG51bWJlciA9IHRvX251bWJlcihjb21wb25lbnQpCiAgICBudW1iZXIgPj0gMAogICAgbnVtYmVyIDw9IDI1NQp9CgojIE9DSSByb290LlBhdGgKYWxsb3dfcm9vdF9wYXRoKHBfb2NpLCBpX29jaSwgYnVuZGxlX2lkKSB7CiAgICBpX3BhdGggOj0gaV9vY2kuUm9vdC5QYXRoCiAgICBwX3BhdGgxIDo9IHBfb2NpLlJvb3QuUGF0aAogICAgcHJpbnQoImFsbG93X3Jvb3RfcGF0aDogaV9wYXRoID0iLCBpX3BhdGgsICJwX3BhdGgxID0iLCBwX3BhdGgxKQoKICAgIHBfcGF0aDIgOj0gcmVwbGFjZShwX3BhdGgxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfcm9vdF9wYXRoOiBwX3BhdGgyID0iLCBwX3BhdGgyKQoKICAgIHBfcGF0aDMgOj0gcmVwbGFjZShwX3BhdGgyLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X3Jvb3RfcGF0aDogcF9wYXRoMyA9IiwgcF9wYXRoMykKCiAgICBwX3BhdGgzID09IGlfcGF0aAoKICAgIHByaW50KCJhbGxvd19yb290X3BhdGg6IHRydWUiKQp9CgojIGRldmljZSBtb3VudHMKYWxsb3dfbW91bnQocF9vY2ksIGlfbW91bnQsIGlfc3RvcmFnZXMsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcHJpbnQoImFsbG93X21vdW50OiBpX21vdW50ID0iLCBpX21vdW50KQoKICAgIHNvbWUgcF9tb3VudCBpbiBwX29jaS5Nb3VudHMKICAgIHNvbWUgaV9zdG9yYWdlIGluIGlfc3RvcmFnZXMKCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IHBfbW91bnQgPSIsIHBfbW91bnQpCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IGlfc3RvcmFnZSA9IiwgaV9zdG9yYWdlKQoKICAgIGNoZWNrX21vdW50KHBfbW91bnQsIGlfbW91bnQsIGlfc3RvcmFnZSwgYnVuZGxlX2lkLCBzYW5kYm94X2lkKQoKICAgICMgVE9ETzogYXJlIHRoZXJlIGFueSBvdGhlciByZXF1aXJlZCBwb2xpY3kgY2hlY2tzIGZvciBtb3VudHMgLSBlLmcuLAogICAgIyAgICAgICBtdWx0aXBsZSBtb3VudHMgd2l0aCBzYW1lIHNvdXJjZSBvciBkZXN0aW5hdGlvbj8KCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IHRydWUiKQp9CgpjaGVja19tb3VudChwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcF9tb3VudCA9PSBpX21vdW50CiAgICBwcmludCgiY2hlY2tfbW91bnQgMTogdHJ1ZSIpCn0KY2hlY2tfbW91bnQocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHBfbW91bnQuZGVzdGluYXRpb24gPT0gaV9tb3VudC5kZXN0aW5hdGlvbgogICAgcF9tb3VudC50eXBlXyA9PSBpX21vdW50LnR5cGVfCiAgICBwX21vdW50Lm9wdGlvbnMgPT0gaV9tb3VudC5vcHRpb25zCgogICAgbW91bnRfc291cmNlX2FsbG93cyhwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkKCiAgICBwcmludCgiY2hlY2tfbW91bnQgMjogdHJ1ZSIpCn0KCm1vdW50X3NvdXJjZV9hbGxvd3MocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHJlZ2V4MSA6PSBwX21vdW50LnNvdXJjZQogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5tb3VudF9zb3VyY2VfY3BhdGgpCiAgICByZWdleDQgOj0gcmVwbGFjZShyZWdleDMsICIkKGJ1bmRsZS1pZCkiLCBidW5kbGVfaWQpCgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMTogcmVnZXg0ID0iLCByZWdleDQpCiAgICByZWdleC5tYXRjaChyZWdleDQsIGlfbW91bnQuc291cmNlKQoKICAgIHByaW50KCJtb3VudF9zb3VyY2VfYWxsb3dzIDE6IHRydWUiKQp9Cm1vdW50X3NvdXJjZV9hbGxvd3MocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHJlZ2V4MSA6PSBwX21vdW50LnNvdXJjZQogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5tb3VudF9zb3VyY2VfY3BhdGgpCiAgICByZWdleDQgOj0gcmVwbGFjZShyZWdleDMsICIkKHNhbmRib3gtaWQpIiwgc2FuZGJveF9pZCkKCiAgICBwcmludCgibW91bnRfc291cmNlX2FsbG93cyAyOiByZWdleDQgPSIsIHJlZ2V4NCkKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4NCwgaV9tb3VudC5zb3VyY2UpCgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMjogdHJ1ZSIpCn0KbW91bnRfc291cmNlX2FsbG93cyhwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogaV9tb3VudC5zb3VyY2UgPSIsIGlfbW91bnQuc291cmNlKQogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogaV9zdG9yYWdlLm1vdW50X3BvaW50ID0iLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCgogICAgaV9tb3VudC5zb3VyY2UgPT0gaV9zdG9yYWdlLm1vdW50X3BvaW50CgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogdHJ1ZSIpCn0KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBDcmVhdGUgY29udGFpbmVyIFN0b3JhZ2VzCgphbGxvd19zdG9yYWdlcyhwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHBfY291bnQgOj0gY291bnQocF9zdG9yYWdlcykKICAgIGlfY291bnQgOj0gY291bnQoaV9zdG9yYWdlcykKICAgIHByaW50KCJhbGxvd19zdG9yYWdlczogcF9jb3VudCA9IiwgcF9jb3VudCwgImlfY291bnQgPSIsIGlfY291bnQpCgogICAgcF9jb3VudCA9PSBpX2NvdW50CgogICAgIyBHZXQgdGhlIGNvbnRhaW5lciBpbWFnZSBsYXllciBJRHMgYW5kIHZlcml0eSByb290IGhhc2hlcywgZnJvbSB0aGUgIm92ZXJsYXlmcyIgc3RvcmFnZS4KICAgIHNvbWUgb3ZlcmxheV9zdG9yYWdlIGluIHBfc3RvcmFnZXMKICAgIG92ZXJsYXlfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIHByaW50KCJhbGxvd19zdG9yYWdlczogb3ZlcmxheV9zdG9yYWdlID0iLCBvdmVybGF5X3N0b3JhZ2UpCiAgICBjb3VudChvdmVybGF5X3N0b3JhZ2Uub3B0aW9ucykgPT0gMgoKICAgIGxheWVyX2lkcyA6PSBzcGxpdChvdmVybGF5X3N0b3JhZ2Uub3B0aW9uc1swXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiBsYXllcl9pZHMgPSIsIGxheWVyX2lkcykKCiAgICByb290X2hhc2hlcyA6PSBzcGxpdChvdmVybGF5X3N0b3JhZ2Uub3B0aW9uc1sxXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiByb290X2hhc2hlcyA9Iiwgcm9vdF9oYXNoZXMpCgogICAgZXZlcnkgaV9zdG9yYWdlIGluIGlfc3RvcmFnZXMgewogICAgICAgIGFsbG93X3N0b3JhZ2UocF9zdG9yYWdlcywgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpCiAgICB9CgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiB0cnVlIikKfQoKYWxsb3dfc3RvcmFnZShwX3N0b3JhZ2VzLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgc29tZSBwX3N0b3JhZ2UgaW4gcF9zdG9yYWdlcwoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiBwX3N0b3JhZ2UgPSIsIHBfc3RvcmFnZSkKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiBpX3N0b3JhZ2UgPSIsIGlfc3RvcmFnZSkKCiAgICBwX3N0b3JhZ2UuZHJpdmVyICAgICAgICAgICA9PSBpX3N0b3JhZ2UuZHJpdmVyCiAgICBwX3N0b3JhZ2UuZHJpdmVyX29wdGlvbnMgICA9PSBpX3N0b3JhZ2UuZHJpdmVyX29wdGlvbnMKICAgIHBfc3RvcmFnZS5mc19ncm91cCAgICAgICAgID09IGlfc3RvcmFnZS5mc19ncm91cAogICAgcF9zdG9yYWdlLmZzdHlwZSAgICAgICAgICAgPT0gaV9zdG9yYWdlLmZzdHlwZQoKICAgIGFsbG93X3N0b3JhZ2Vfc291cmNlKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKQogICAgYWxsb3dfc3RvcmFnZV9vcHRpb25zKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKQogICAgYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKQoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiB0cnVlIikKfQoKYWxsb3dfc3RvcmFnZV9zb3VyY2UocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX3NvdXJjZSAxOiBzdGFydCIpCgogICAgcF9zdG9yYWdlLnNvdXJjZSA9PSBpX3N0b3JhZ2Uuc291cmNlCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDE6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX3NvdXJjZShwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDI6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCgogICAgIyBEREREOkJCOkRELkY6IERvbWFpbjpCdXM6RGV2aWNlLkZ1bmN0aW9uCiAgICAjIGh0dHBzOi8vd3d3Lmtlcm5lbC5vcmcvZG9jL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtYnVzLXBjaQogICAgcmVnZXgubWF0Y2goYF5bYS1mMC05XXs0fTpbYS1mMC05XXsyfTpbYS1mMC05XXsyfVwuW2EtZjAtOV0kYCwgaV9zdG9yYWdlLnNvdXJjZSkKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9zb3VyY2UgMjogdHJ1ZSIpCn0KCmFsbG93X3N0b3JhZ2Vfc291cmNlKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKSB7CiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9zb3VyY2UgMzogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIGlfc3RvcmFnZS5zb3VyY2UgPT0gIm5vbmUiCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDM6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX3NvdXJjZShwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDQ6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJzbWIiCgogICAgIyBQYXR0ZXJuOiAvLzxzdG9yYWdlLWFjY291bnQtbmFtZT4uZmlsZS5jb3JlLndpbmRvd3MubmV0LzxrOHMtUFZDLW5hbWU+CiAgICAjIFN0b3JhZ2UgYWNjb3VudCBuYW1lOiBodHRwczovL2xlYXJuLm1pY3Jvc29mdC5jb20vZW4tdXMvYXp1cmUvc3RvcmFnZS9jb21tb24vc3RvcmFnZS1hY2NvdW50LW92ZXJ2aWV3I3N0b3JhZ2UtYWNjb3VudC1uYW1lCiAgICAjIEs4cyBQVkMgbmFtZTogaHR0cHM6Ly9rdWJlcm5ldGVzLmlvL2RvY3MvY29uY2VwdHMvb3ZlcnZpZXcvd29ya2luZy13aXRoLW9iamVjdHMvbmFtZXMvI2Rucy1zdWJkb21haW4tbmFtZXMKICAgIHJlZ2V4Lm1hdGNoKGBeXC9cLyhbYS16MC05XXszLDI0fSlcLmZpbGVcLmNvcmVcLndpbmRvd3NcLm5ldFwvW2EtejAtOV0oW2EtejAtOS4tXXswLDI1MX1bYS16MC05XSk/JGAsIGlfc3RvcmFnZS5zb3VyY2UpCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDQ6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMTogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgIT0gIm92ZXJsYXlmcyIKICAgIHBfc3RvcmFnZS5vcHRpb25zID09IGlfc3RvcmFnZS5vcHRpb25zCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAxOiB0cnVlIikKfQphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIGNvdW50KHBfc3RvcmFnZS5vcHRpb25zKSA9PSAyCgogICAgcG9saWN5X2lkcyA6PSBzcGxpdChwX3N0b3JhZ2Uub3B0aW9uc1swXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBwb2xpY3lfaWRzID0iLCBwb2xpY3lfaWRzKQogICAgcG9saWN5X2lkcyA9PSBsYXllcl9pZHMKCiAgICBwb2xpY3lfaGFzaGVzIDo9IHNwbGl0KHBfc3RvcmFnZS5vcHRpb25zWzFdLCAiOiIpCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IHBvbGljeV9oYXNoZXMgPSIsIHBvbGljeV9oYXNoZXMpCgogICAgcF9jb3VudCA6PSBjb3VudChwb2xpY3lfaWRzKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBwX2NvdW50ID0iLCBwX2NvdW50KQogICAgcF9jb3VudCA+PSAxCiAgICBwX2NvdW50ID09IGNvdW50KHBvbGljeV9oYXNoZXMpCgogICAgaV9jb3VudCA6PSBjb3VudChpX3N0b3JhZ2Uub3B0aW9ucykKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogaV9jb3VudCA9IiwgaV9jb3VudCkKICAgIGlfY291bnQgPT0gcF9jb3VudCArIDMKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zWzBdID0iLCBpX3N0b3JhZ2Uub3B0aW9uc1swXSkKICAgIGlfc3RvcmFnZS5vcHRpb25zWzBdID09ICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQubGF5ZXItc3JjLXByZWZpeD0vdmFyL2xpYi9jb250YWluZXJkL2lvLmNvbnRhaW5lcmQuc25hcHNob3R0ZXIudjEudGFyZGV2L2xheWVycyIKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zW2lfY291bnQgLSAyXSA9IiwgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDJdKQogICAgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDJdID09ICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQub3ZlcmxheS1ydyIKCiAgICBsb3dlcmRpciA6PSBjb25jYXQoIj0iLCBbImxvd2VyZGlyIiwgcF9zdG9yYWdlLm9wdGlvbnNbMF1dKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBsb3dlcmRpciA9IiwgbG93ZXJkaXIpCgogICAgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDFdID09IGxvd2VyZGlyCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zW2lfY291bnQgLSAxXSA9IiwgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDFdKQoKICAgIGV2ZXJ5IGksIHBvbGljeV9pZCBpbiBwb2xpY3lfaWRzIHsKICAgICAgICBhbGxvd19vdmVybGF5X2xheWVyKHBvbGljeV9pZCwgcG9saWN5X2hhc2hlc1tpXSwgaV9zdG9yYWdlLm9wdGlvbnNbaSArIDFdKQogICAgfQoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogdHJ1ZSIpCn0KYWxsb3dfc3RvcmFnZV9vcHRpb25zKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKSB7CiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDM6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCiAgICBjb3VudChwX3N0b3JhZ2Uub3B0aW9ucykgPT0gMQoKICAgIHN0YXJ0c3dpdGgocF9zdG9yYWdlLm9wdGlvbnNbMF0sICIkKGhhc2giKQogICAgaGFzaF9zdWZmaXggOj0gdHJpbV9sZWZ0KHBfc3RvcmFnZS5vcHRpb25zWzBdLCAiJChoYXNoIikKCiAgICBlbmRzd2l0aChoYXNoX3N1ZmZpeCwgIikiKQogICAgaGFzaF9pbmRleCA6PSB0cmltX3JpZ2h0KGhhc2hfc3VmZml4LCAiKSIpCiAgICBpIDo9IHRvX251bWJlcihoYXNoX2luZGV4KQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAzOiBpID0iLCBpKQoKICAgIGhhc2hfb3B0aW9uIDo9IGNvbmNhdCgiPSIsIFsiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LnJvb3QtaGFzaCIsIHJvb3RfaGFzaGVzW2ldXSkKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMzogaGFzaF9vcHRpb24gPSIsIGhhc2hfb3B0aW9uKQoKICAgIGNvdW50KGlfc3RvcmFnZS5vcHRpb25zKSA9PSA0CiAgICBpX3N0b3JhZ2Uub3B0aW9uc1swXSA9PSAicm8iCiAgICBpX3N0b3JhZ2Uub3B0aW9uc1sxXSA9PSAiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmJsb2NrX2RldmljZT1maWxlIgogICAgaV9zdG9yYWdlLm9wdGlvbnNbMl0gPT0gImlvLmthdGFjb250YWluZXJzLmZzLW9wdC5pcy1sYXllciIKICAgIGlfc3RvcmFnZS5vcHRpb25zWzNdID09IGhhc2hfb3B0aW9uCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAzOiB0cnVlIikKfQphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgNDogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gInNtYiIKICAgIHBfb3B0c19jb3VudCA6PSBjb3VudChwX3N0b3JhZ2Uub3B0aW9ucykKICAgIGlfb3B0c19jb3VudCA6PSBjb3VudChpX3N0b3JhZ2Uub3B0aW9ucykKICAgIGlfb3B0c19jb3VudCA9PSBwX29wdHNfY291bnQgKyAyCgogICAgaV9vcHRfbWF0Y2hlcyA6PSBbaSB8IGkgOj0gaWR4OyBpZHggPCBwX29wdHNfY291bnQ7IHBfc3RvcmFnZS5vcHRpb25zW2lkeF0gPT0gaV9zdG9yYWdlLm9wdGlvbnNbaWR4XV0KICAgIGNvdW50KGlfb3B0X21hdGNoZXMpID09IHBfb3B0c19jb3VudAoKICAgIHN0YXJ0c3dpdGgoaV9zdG9yYWdlLm9wdGlvbnNbaV9vcHRzX2NvdW50LTJdLCAiYWRkcj0iKQogICAgY3JlZHMgPSBzcGxpdChpX3N0b3JhZ2Uub3B0aW9uc1tpX29wdHNfY291bnQtMV0sICIsIikKICAgIGNvdW50KGNyZWRzKSA9PSAyCiAgICBzdGFydHN3aXRoKGNyZWRzWzBdLCAidXNlcm5hbWU9IikKICAgIHN0YXJ0c3dpdGgoY3JlZHNbMV0sICJwYXNzd29yZD0iKQogICAgCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDQ6IHRydWUiKQp9CgphbGxvd19vdmVybGF5X2xheWVyKHBvbGljeV9pZCwgcG9saWN5X2hhc2gsIGlfb3B0aW9uKSB7CiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogcG9saWN5X2lkID0iLCBwb2xpY3lfaWQsICJwb2xpY3lfaGFzaCA9IiwgcG9saWN5X2hhc2gpCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogaV9vcHRpb24gPSIsIGlfb3B0aW9uKQoKICAgIHN0YXJ0c3dpdGgoaV9vcHRpb24sICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQubGF5ZXI9IikKICAgIGlfdmFsdWUgOj0gcmVwbGFjZShpX29wdGlvbiwgImlvLmthdGFjb250YWluZXJzLmZzLW9wdC5sYXllcj0iLCAiIikKICAgIGlfdmFsdWVfZGVjb2RlZCA6PSBiYXNlNjQuZGVjb2RlKGlfdmFsdWUpCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogaV92YWx1ZV9kZWNvZGVkID0iLCBpX3ZhbHVlX2RlY29kZWQpCgogICAgcG9saWN5X3N1ZmZpeCA6PSBjb25jYXQoIj0iLCBbInRhcixybyxpby5rYXRhY29udGFpbmVycy5mcy1vcHQuYmxvY2tfZGV2aWNlPWZpbGUsaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmlzLWxheWVyLGlvLmthdGFjb250YWluZXJzLmZzLW9wdC5yb290LWhhc2giLCBwb2xpY3lfaGFzaF0pCiAgICBwX3ZhbHVlIDo9IGNvbmNhdCgiLCIsIFtwb2xpY3lfaWQsIHBvbGljeV9zdWZmaXhdKQogICAgcHJpbnQoImFsbG93X292ZXJsYXlfbGF5ZXI6IHBfdmFsdWUgPSIsIHBfdmFsdWUpCgogICAgcF92YWx1ZSA9PSBpX3ZhbHVlX2RlY29kZWQKCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogdHJ1ZSIpCn0KCmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAidGFyIgoKICAgIHN0YXJ0c3dpdGgocF9zdG9yYWdlLm1vdW50X3BvaW50LCAiJChsYXllciIpCiAgICBtb3VudF9zdWZmaXggOj0gdHJpbV9sZWZ0KHBfc3RvcmFnZS5tb3VudF9wb2ludCwgIiQobGF5ZXIiKQoKICAgIGVuZHN3aXRoKG1vdW50X3N1ZmZpeCwgIikiKQogICAgbGF5ZXJfaW5kZXggOj0gdHJpbV9yaWdodChtb3VudF9zdWZmaXgsICIpIikKICAgIGkgOj0gdG9fbnVtYmVyKGxheWVyX2luZGV4KQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDE6IGkgPSIsIGkpCgogICAgbGF5ZXJfaWQgOj0gbGF5ZXJfaWRzW2ldCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMTogbGF5ZXJfaWQgPSIsIGxheWVyX2lkKQoKICAgIHBfbW91bnQgOj0gY29uY2F0KCIvIiwgWyIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L2xheWVycyIsIGxheWVyX2lkXSkKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCAxOiBwX21vdW50ID0iLCBwX21vdW50KQoKICAgIHBfbW91bnQgPT0gaV9zdG9yYWdlLm1vdW50X3BvaW50CgogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDE6IHRydWUiKQp9CmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAiZnVzZTMua2F0YS1vdmVybGF5IgoKICAgIG1vdW50MSA6PSByZXBsYWNlKHBfc3RvcmFnZS5tb3VudF9wb2ludCwgIiQoY3BhdGgpIiwgcG9saWN5X2RhdGEuY29tbW9uLmNwYXRoKQogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDI6IG1vdW50MiA9IiwgbW91bnQyKQoKICAgIG1vdW50MiA9PSBpX3N0b3JhZ2UubW91bnRfcG9pbnQKCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMjogdHJ1ZSIpCn0KYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKSB7CiAgICBwX3N0b3JhZ2UuZnN0eXBlID09ICJsb2NhbCIKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQyID0iLCBtb3VudDIpCgogICAgbW91bnQzIDo9IHJlcGxhY2UobW91bnQyLCAiJChzYW5kYm94LWlkKSIsIHNhbmRib3hfaWQpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQzID0iLCBtb3VudDMpCgogICAgcmVnZXgubWF0Y2gobW91bnQzLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCgogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDM6IHRydWUiKQp9CmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAiYmluZCIKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNDogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNDogbW91bnQyID0iLCBtb3VudDIpCgogICAgbW91bnQzIDo9IHJlcGxhY2UobW91bnQyLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDQ6IG1vdW50MyA9IiwgbW91bnQzKQoKICAgIHJlZ2V4Lm1hdGNoKG1vdW50MywgaV9zdG9yYWdlLm1vdW50X3BvaW50KQoKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA0OiB0cnVlIikKfQphbGxvd19tb3VudF9wb2ludChwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgYnVuZGxlX2lkLCBzYW5kYm94X2lkLCBsYXllcl9pZHMpIHsKICAgIHBfc3RvcmFnZS5mc3R5cGUgPT0gInRtcGZzIgoKICAgIG1vdW50MSA6PSBwX3N0b3JhZ2UubW91bnRfcG9pbnQKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA1OiBtb3VudDEgPSIsIG1vdW50MSkKCiAgICByZWdleC5tYXRjaChtb3VudDEsIGlfc3RvcmFnZS5tb3VudF9wb2ludCkKCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNTogdHJ1ZSIpCn0KYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKSB7CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogaV9zdG9yYWdlLm1vdW50X3BvaW50ID0iLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCiAgICBhbGxvd19kaXJlY3Rfdm9sX2RyaXZlcihwX3N0b3JhZ2UsIGlfc3RvcmFnZSkKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChzcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQyID0iLCBtb3VudDIpCgogICAgZGlyZWN0X3ZvbF9wYXRoIDo9IGlfc3RvcmFnZS5zb3VyY2UKICAgIG1vdW50MyA6PSByZXBsYWNlKG1vdW50MiwgIiQoYjY0LWRpcmVjdC12b2wtcGF0aCkiLCBiYXNlNjR1cmwuZW5jb2RlKGRpcmVjdF92b2xfcGF0aCkpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQzID0iLCBtb3VudDMpCgogICAgbW91bnQzID09IGlfc3RvcmFnZS5tb3VudF9wb2ludAoKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA2OiB0cnVlIikKfQoKYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIocF9zdG9yYWdlLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19kaXJlY3Rfdm9sX2RyaXZlciAxOiBzdGFydCIpCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCiAgICBwcmludCgiYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIgMTogdHJ1ZSIpCn0KYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIocF9zdG9yYWdlLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19kaXJlY3Rfdm9sX2RyaXZlciAyOiBzdGFydCIpCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJzbWIiCiAgICBwcmludCgiYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIgMjogdHJ1ZSIpCn0KCiMgRXhlY1Byb2Nlc3NSZXF1ZXN0LnByb2Nlc3MuQ2FwYWJpbGl0aWVzCmFsbG93X2V4ZWNfY2FwcyhpX2NhcHMpIHsKICAgIG5vdCBpX2NhcHMuQW1iaWVudAogICAgbm90IGlfY2Fwcy5Cb3VuZGluZwogICAgbm90IGlfY2Fwcy5FZmZlY3RpdmUKICAgIG5vdCBpX2NhcHMuSW5oZXJpdGFibGUKICAgIG5vdCBpX2NhcHMuUGVybWl0dGVkCn0KCiMgT0NJLlByb2Nlc3MuQ2FwYWJpbGl0aWVzCmFsbG93X2NhcHMocF9jYXBzLCBpX2NhcHMpIHsKICAgIHByaW50KCJhbGxvd19jYXBzOiBwb2xpY3kgQW1iaWVudCA9IiwgcF9jYXBzLkFtYmllbnQpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgQW1iaWVudCA9IiwgaV9jYXBzLkFtYmllbnQpCiAgICBtYXRjaF9jYXBzKHBfY2Fwcy5BbWJpZW50LCBpX2NhcHMuQW1iaWVudCkKCiAgICBwcmludCgiYWxsb3dfY2FwczogcG9saWN5IEJvdW5kaW5nID0iLCBwX2NhcHMuQm91bmRpbmcpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgQm91bmRpbmcgPSIsIGlfY2Fwcy5Cb3VuZGluZykKICAgIG1hdGNoX2NhcHMocF9jYXBzLkJvdW5kaW5nLCBpX2NhcHMuQm91bmRpbmcpCgogICAgcHJpbnQoImFsbG93X2NhcHM6IHBvbGljeSBFZmZlY3RpdmUgPSIsIHBfY2Fwcy5FZmZlY3RpdmUpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgRWZmZWN0aXZlID0iLCBpX2NhcHMuRWZmZWN0aXZlKQogICAgbWF0Y2hfY2FwcyhwX2NhcHMuRWZmZWN0aXZlLCBpX2NhcHMuRWZmZWN0aXZlKQoKICAgIHByaW50KCJhbGxvd19jYXBzOiBwb2xpY3kgSW5oZXJpdGFibGUgPSIsIHBfY2Fwcy5Jbmhlcml0YWJsZSkKICAgIHByaW50KCJhbGxvd19jYXBzOiBpbnB1dCBJbmhlcml0YWJsZSA9IiwgaV9jYXBzLkluaGVyaXRhYmxlKQogICAgbWF0Y2hfY2FwcyhwX2NhcHMuSW5oZXJpdGFibGUsIGlfY2Fwcy5Jbmhlcml0YWJsZSkKCiAgICBwcmludCgiYWxsb3dfY2FwczogcG9saWN5IFBlcm1pdHRlZCA9IiwgcF9jYXBzLlBlcm1pdHRlZCkKICAgIHByaW50KCJhbGxvd19jYXBzOiBpbnB1dCBQZXJtaXR0ZWQgPSIsIGlfY2Fwcy5QZXJtaXR0ZWQpCiAgICBtYXRjaF9jYXBzKHBfY2Fwcy5QZXJtaXR0ZWQsIGlfY2Fwcy5QZXJtaXR0ZWQpCn0KCm1hdGNoX2NhcHMocF9jYXBzLCBpX2NhcHMpIHsKICAgIHByaW50KCJtYXRjaF9jYXBzIDE6IHN0YXJ0IikKCiAgICBwX2NhcHMgPT0gaV9jYXBzCgogICAgcHJpbnQoIm1hdGNoX2NhcHMgMTogdHJ1ZSIpCn0KbWF0Y2hfY2FwcyhwX2NhcHMsIGlfY2FwcykgewogICAgcHJpbnQoIm1hdGNoX2NhcHMgMjogc3RhcnQiKQoKICAgIGNvdW50KHBfY2FwcykgPT0gMQogICAgcF9jYXBzWzBdID09ICIkKGRlZmF1bHRfY2FwcykiCgogICAgcHJpbnQoIm1hdGNoX2NhcHMgMjogZGVmYXVsdF9jYXBzID0iLCBwb2xpY3lfZGF0YS5jb21tb24uZGVmYXVsdF9jYXBzKQogICAgcG9saWN5X2RhdGEuY29tbW9uLmRlZmF1bHRfY2FwcyA9PSBpX2NhcHMKCiAgICBwcmludCgibWF0Y2hfY2FwcyAyOiB0cnVlIikKfQptYXRjaF9jYXBzKHBfY2FwcywgaV9jYXBzKSB7CiAgICBwcmludCgibWF0Y2hfY2FwcyAzOiBzdGFydCIpCgogICAgY291bnQocF9jYXBzKSA9PSAxCiAgICBwX2NhcHNbMF0gPT0gIiQocHJpdmlsZWdlZF9jYXBzKSIKCiAgICBwcmludCgibWF0Y2hfY2FwcyAzOiBwcml2aWxlZ2VkX2NhcHMgPSIsIHBvbGljeV9kYXRhLmNvbW1vbi5wcml2aWxlZ2VkX2NhcHMpCiAgICBwb2xpY3lfZGF0YS5jb21tb24ucHJpdmlsZWdlZF9jYXBzID09IGlfY2FwcwoKICAgIHByaW50KCJtYXRjaF9jYXBzIDM6IHRydWUiKQp9CgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgpjaGVja19kaXJlY3RvcnlfdHJhdmVyc2FsKGlfcGF0aCkgewogICAgbm90IHJlZ2V4Lm1hdGNoKCIoXnwvKS4uKCR8LykiLCBpX3BhdGgpCn0KCmNoZWNrX3N5bWxpbmtfc291cmNlKGlfc3JjKSB7CiAgICBpX3NyYyA9PSAiIgogICAgcHJpbnQoImNoZWNrX3N5bWxpbmtfc291cmNlIDE6IHRydWUiKQp9CmNoZWNrX3N5bWxpbmtfc291cmNlKGlfc3JjKSB7CiAgICBpX3NyYyAhPSAiIgogICAgcHJpbnQoImNoZWNrX3N5bWxpbmtfc291cmNlIDI6IGlfc3JjID0iLCBpX3NyYykKCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24uc19zb3VyY2UxLCBpX3NyYykKCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMjogdHJ1ZSIpCn0KY2hlY2tfc3ltbGlua19zb3VyY2UoaV9zcmMpIHsKICAgIGlfc3JjICE9ICIiCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMzogaV9zcmMgPSIsIGlfc3JjKQoKICAgIHJlZ2V4Lm1hdGNoKHBvbGljeV9kYXRhLmNvbW1vbi5zX3NvdXJjZTIsIGlfc3JjKQogICAgY2hlY2tfZGlyZWN0b3J5X3RyYXZlcnNhbChpX3NyYykKCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMzogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfc3RvcmFnZXMoaV9zdG9yYWdlcykgewogICAgcHJpbnQoImFsbG93X3NhbmRib3hfc3RvcmFnZXM6IGlfc3RvcmFnZXMgPSIsIGlfc3RvcmFnZXMpCgogICAgcF9zdG9yYWdlcyA6PSBwb2xpY3lfZGF0YS5zYW5kYm94LnN0b3JhZ2VzCiAgICBldmVyeSBpX3N0b3JhZ2UgaW4gaV9zdG9yYWdlcyB7CiAgICAgICAgYWxsb3dfc2FuZGJveF9zdG9yYWdlKHBfc3RvcmFnZXMsIGlfc3RvcmFnZSkKICAgIH0KCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9zdG9yYWdlczogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfc3RvcmFnZShwX3N0b3JhZ2VzLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IGlfc3RvcmFnZSA9IiwgaV9zdG9yYWdlKQoKICAgIHNvbWUgcF9zdG9yYWdlIGluIHBfc3RvcmFnZXMKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IHBfc3RvcmFnZSA9IiwgcF9zdG9yYWdlKQogICAgaV9zdG9yYWdlID09IHBfc3RvcmFnZQoKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IHRydWUiKQp9CgpDb3B5RmlsZVJlcXVlc3QgewogICAgcHJpbnQoIkNvcHlGaWxlUmVxdWVzdDogaW5wdXQucGF0aCA9IiwgaW5wdXQucGF0aCkKCiAgICBjaGVja19zeW1saW5rX3NvdXJjZShpbnB1dC5zeW1saW5rX3NyYykKICAgIGNoZWNrX2RpcmVjdG9yeV90cmF2ZXJzYWwoaW5wdXQucGF0aCkKCiAgICBzb21lIHJlZ2V4MSBpbiBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLkNvcHlGaWxlUmVxdWVzdAogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5jcGF0aCkKICAgIHJlZ2V4NCA6PSByZXBsYWNlKHJlZ2V4MywgIiQoYnVuZGxlLWlkKSIsIEJVTkRMRV9JRCkKICAgIHByaW50KCJDb3B5RmlsZVJlcXVlc3Q6IHJlZ2V4NCA9IiwgcmVnZXg0KQoKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4NCwgaW5wdXQucGF0aCkKCiAgICBwcmludCgiQ29weUZpbGVSZXF1ZXN0OiB0cnVlIikKfQoKQ3JlYXRlU2FuZGJveFJlcXVlc3QgewogICAgcHJpbnQoIkNyZWF0ZVNhbmRib3hSZXF1ZXN0OiBpbnB1dC5ndWVzdF9ob29rX3BhdGggPSIsIGlucHV0Lmd1ZXN0X2hvb2tfcGF0aCkKICAgIGNvdW50KGlucHV0Lmd1ZXN0X2hvb2tfcGF0aCkgPT0gMAoKICAgIHByaW50KCJDcmVhdGVTYW5kYm94UmVxdWVzdDogaW5wdXQua2VybmVsX21vZHVsZXMgPSIsIGlucHV0Lmtlcm5lbF9tb2R1bGVzKQogICAgY291bnQoaW5wdXQua2VybmVsX21vZHVsZXMpID09IDAKCiAgICBpX3BpZG5zIDo9IGlucHV0LnNhbmRib3hfcGlkbnMKICAgIHByaW50KCJDcmVhdGVTYW5kYm94UmVxdWVzdDogaV9waWRucyA9IiwgaV9waWRucykKICAgIGlfcGlkbnMgPT0gZmFsc2UKICAgIGFsbG93X3NhbmRib3hfc3RvcmFnZXMoaW5wdXQuc3RvcmFnZXMpCn0KCmFsbG93X2V4ZWMocF9jb250YWluZXIsIGlfcHJvY2VzcykgewogICAgcHJpbnQoImFsbG93X2V4ZWM6IHN0YXJ0IikKCiAgICBwX29jaSA9IHBfY29udGFpbmVyLk9DSQogICAgcF9zX25hbWUgPSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc19uYW1lc3BhY2UgPSBnZXRfc3RhdGVfdmFsKCJuYW1lc3BhY2UiKQogICAgYWxsb3dfcHJvYmVfcHJvY2VzcyhwX29jaS5Qcm9jZXNzLCBpX3Byb2Nlc3MsIHBfc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfZXhlYzogdHJ1ZSIpCn0KCmFsbG93X2ludGVyYWN0aXZlX2V4ZWMocF9jb250YWluZXIsIGlfcHJvY2VzcykgewogICAgcHJpbnQoImFsbG93X2ludGVyYWN0aXZlX2V4ZWM6IHN0YXJ0IikKCiAgICBwX29jaSA9IHBfY29udGFpbmVyLk9DSQogICAgcF9zX25hbWUgPSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc19uYW1lc3BhY2UgPSBnZXRfc3RhdGVfdmFsKCJuYW1lc3BhY2UiKQogICAgYWxsb3dfaW50ZXJhY3RpdmVfcHJvY2VzcyhwX29jaS5Qcm9jZXNzLCBpX3Byb2Nlc3MsIHBfc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfaW50ZXJhY3RpdmVfZXhlYzogdHJ1ZSIpCn0KCiMgVE9ETzogc2hvdWxkIG90aGVyIEV4ZWNQcm9jZXNzUmVxdWVzdCBpbnB1dCBkYXRhIGZpZWxkcyBiZSB2YWxpZGF0ZWQgYXMgd2VsbD8KRXhlY1Byb2Nlc3NSZXF1ZXN0IHsKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMTogaW5wdXQgPSIsIGlucHV0KQoKICAgIHNvbWUgcF9jb21tYW5kIGluIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuRXhlY1Byb2Nlc3NSZXF1ZXN0LmFsbG93ZWRfY29tbWFuZHMKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMTogcF9jb21tYW5kID0iLCBwX2NvbW1hbmQpCiAgICBwX2NvbW1hbmQgPT0gaW5wdXQucHJvY2Vzcy5BcmdzCgogICAgIyBUT0RPOiBtYXRjaCBwX2NvbnRhaW5lcidzIElEIHdpdGggdGhlIGlucHV0IGNvbnRhaW5lcl9pZC4KICAgIHNvbWUgcF9jb250YWluZXIgaW4gcG9saWN5X2RhdGEuY29udGFpbmVycwogICAgYWxsb3dfaW50ZXJhY3RpdmVfZXhlYyhwX2NvbnRhaW5lciwgaW5wdXQucHJvY2VzcykKCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDE6IHRydWUiKQp9CkV4ZWNQcm9jZXNzUmVxdWVzdCB7CiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDI6IGlucHV0ID0iLCBpbnB1dCkKCiAgICAjIFRPRE86IG1hdGNoIGlucHV0IGNvbnRhaW5lciBJRCB3aXRoIGl0cyBjb3JyZXNwb25kaW5nIGNvbnRhaW5lci5leGVjX2NvbW1hbmRzLgogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBzb21lIHBfY29tbWFuZCBpbiBwX2NvbnRhaW5lci5leGVjX2NvbW1hbmRzCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDI6IHBfY29tbWFuZCA9IiwgcF9jb21tYW5kKQoKICAgICMgVE9ETzogc2hvdWxkIG90aGVyIGlucHV0IGRhdGEgZmllbGRzIGJlIHZhbGlkYXRlZCBhcyB3ZWxsPwogICAgcF9jb21tYW5kID09IGlucHV0LnByb2Nlc3MuQXJncwoKICAgIGFsbG93X2V4ZWMocF9jb250YWluZXIsIGlucHV0LnByb2Nlc3MpCgogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAyOiB0cnVlIikKfQpFeGVjUHJvY2Vzc1JlcXVlc3QgewogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAzOiBpbnB1dCA9IiwgaW5wdXQpCgogICAgaV9jb21tYW5kID0gY29uY2F0KCIgIiwgaW5wdXQucHJvY2Vzcy5BcmdzKQogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAzOiBpX2NvbW1hbmQgPSIsIGlfY29tbWFuZCkKCiAgICBzb21lIHBfcmVnZXggaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5FeGVjUHJvY2Vzc1JlcXVlc3QucmVnZXgKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMzogcF9yZWdleCA9IiwgcF9yZWdleCkKCiAgICByZWdleC5tYXRjaChwX3JlZ2V4LCBpX2NvbW1hbmQpCgogICAgIyBUT0RPOiBtYXRjaCBwX2NvbnRhaW5lcidzIElEIHdpdGggdGhlIGlucHV0IGNvbnRhaW5lcl9pZC4KICAgIHNvbWUgcF9jb250YWluZXIgaW4gcG9saWN5X2RhdGEuY29udGFpbmVycwogICAgYWxsb3dfaW50ZXJhY3RpdmVfZXhlYyhwX2NvbnRhaW5lciwgaW5wdXQucHJvY2VzcykKCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDM6IHRydWUiKQp9CgpVcGRhdGVSb3V0ZXNSZXF1ZXN0IHsKICAgIHByaW50KCJVcGRhdGVSb3V0ZXNSZXF1ZXN0OiBpbnB1dCA9IiwgaW5wdXQpCiAgICBwcmludCgiVXBkYXRlUm91dGVzUmVxdWVzdDogcG9saWN5ID0iLCBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLlVwZGF0ZVJvdXRlc1JlcXVlc3QpCgogICAgaV9yb3V0ZXMgOj0gaW5wdXQucm91dGVzLlJvdXRlcwogICAgcF9zb3VyY2VfcmVnZXggPSBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLlVwZGF0ZVJvdXRlc1JlcXVlc3QuZm9yYmlkZGVuX3NvdXJjZV9yZWdleAogICAgcF9uYW1lcyA9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuVXBkYXRlUm91dGVzUmVxdWVzdC5mb3JiaWRkZW5fZGV2aWNlX25hbWVzCgogICAgZXZlcnkgaV9yb3V0ZSBpbiBpX3JvdXRlcyB7CiAgICAgICAgcHJpbnQoImlfcm91dGUuc291cmNlID0iLCBpX3JvdXRlLnNvdXJjZSkKICAgICAgICBldmVyeSBwX3JlZ2V4IGluIHBfc291cmNlX3JlZ2V4IHsKICAgICAgICAgICAgcHJpbnQoInBfcmVnZXggPSIsIHBfcmVnZXgpCiAgICAgICAgICAgIG5vdCByZWdleC5tYXRjaChwX3JlZ2V4LCBpX3JvdXRlLnNvdXJjZSkKICAgICAgICB9CgogICAgICAgIHByaW50KCJpX3JvdXRlLmRldmljZSA9IiwgaV9yb3V0ZS5kZXZpY2UpCiAgICAgICAgbm90IGlfcm91dGUuZGV2aWNlIGluIHBfbmFtZXMKICAgIH0KCiAgICBwcmludCgiVXBkYXRlUm91dGVzUmVxdWVzdDogdHJ1ZSIpCn0KClVwZGF0ZUludGVyZmFjZVJlcXVlc3QgewogICAgcHJpbnQoIlVwZGF0ZUludGVyZmFjZVJlcXVlc3Q6IGlucHV0ID0iLCBpbnB1dCkKICAgIHByaW50KCJVcGRhdGVJbnRlcmZhY2VSZXF1ZXN0OiBwb2xpY3kgPSIsIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuVXBkYXRlSW50ZXJmYWNlUmVxdWVzdCkKCiAgICBpX2ludGVyZmFjZSA6PSBpbnB1dC5pbnRlcmZhY2UKICAgIHBfZmxhZ3MgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmFsbG93X3Jhd19mbGFncwoKICAgICMgVHlwaWNhbGx5LCBqdXN0IElGRl9OT0FSUCBpcyB1c2VkLgogICAgYml0cy5hbmQoaV9pbnRlcmZhY2UucmF3X2ZsYWdzLCBiaXRzLm5lZ2F0ZShwX2ZsYWdzKSkgPT0gMAoKICAgIHBfbmFtZXMgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmZvcmJpZGRlbl9uYW1lcwoKICAgIG5vdCBpX2ludGVyZmFjZS5uYW1lIGluIHBfbmFtZXMKCiAgICBwX2h3YWRkcnMgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmZvcmJpZGRlbl9od19hZGRycwoKICAgIG5vdCBpX2ludGVyZmFjZS5od0FkZHIgaW4gcF9od2FkZHJzCgogICAgcHJpbnQoIlVwZGF0ZUludGVyZmFjZVJlcXVlc3Q6IHRydWUiKQp9CgpDbG9zZVN0ZGluUmVxdWVzdCB7CiAgICBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLkNsb3NlU3RkaW5SZXF1ZXN0ID09IHRydWUKfQoKUmVhZFN0cmVhbVJlcXVlc3QgewogICAgcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5SZWFkU3RyZWFtUmVxdWVzdCA9PSB0cnVlCn0KClVwZGF0ZUVwaGVtZXJhbE1vdW50c1JlcXVlc3QgewogICAgcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVFcGhlbWVyYWxNb3VudHNSZXF1ZXN0ID09IHRydWUKfQoKV3JpdGVTdHJlYW1SZXF1ZXN0IHsKICAgIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuV3JpdGVTdHJlYW1SZXF1ZXN0ID09IHRydWUKfQoKcG9saWN5X2RhdGEgOj0gewogICJjb250YWluZXJzIjogWwogICAgewogICAgICAiT0NJIjogewogICAgICAgICJWZXJzaW9uIjogIjEuMS4wLXJjLjEiLAogICAgICAgICJQcm9jZXNzIjogewogICAgICAgICAgIlRlcm1pbmFsIjogZmFsc2UsCiAgICAgICAgICAiVXNlciI6IHsKICAgICAgICAgICAgIlVJRCI6IDY1NTM1LAogICAgICAgICAgICAiR0lEIjogNjU1MzUsCiAgICAgICAgICAgICJBZGRpdGlvbmFsR2lkcyI6IFtdLAogICAgICAgICAgICAiVXNlcm5hbWUiOiAiIgogICAgICAgICAgfSwKICAgICAgICAgICJEZXByZWNhdGVkQXJncyI6IFsKICAgICAgICAgICAgIi9wYXVzZSIKICAgICAgICAgIF0sCiAgICAgICAgICAiQXJncyI6IFsKICAgICAgICAgICAgIi9wYXVzZSIKICAgICAgICAgIF0sCiAgICAgICAgICAiRW52IjogWwogICAgICAgICAgICAiUEFUSD0vdXNyL2xvY2FsL3NiaW46L3Vzci9sb2NhbC9iaW46L3Vzci9zYmluOi91c3IvYmluOi9zYmluOi9iaW4iCiAgICAgICAgICBdLAogICAgICAgICAgIkN3ZCI6ICIvIiwKICAgICAgICAgICJDYXBhYmlsaXRpZXMiOiB7CiAgICAgICAgICAgICJBbWJpZW50IjogW10sCiAgICAgICAgICAgICJCb3VuZGluZyI6IFsKICAgICAgICAgICAgICAiJChkZWZhdWx0X2NhcHMpIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiRWZmZWN0aXZlIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJJbmhlcml0YWJsZSI6IFtdLAogICAgICAgICAgICAiUGVybWl0dGVkIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICAiTm9OZXdQcml2aWxlZ2VzIjogdHJ1ZQogICAgICAgIH0sCiAgICAgICAgIlJvb3QiOiB7CiAgICAgICAgICAiUGF0aCI6ICIkKGNwYXRoKS8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgIlJlYWRvbmx5IjogdHJ1ZQogICAgICAgIH0sCiAgICAgICAgIk1vdW50cyI6IFsKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9wcm9jIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJwcm9jIiwKICAgICAgICAgICAgInR5cGVfIjogInByb2MiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2IiwKICAgICAgICAgICAgInNvdXJjZSI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJzdHJpY3RhdGltZSIsCiAgICAgICAgICAgICAgIm1vZGU9NzU1IiwKICAgICAgICAgICAgICAic2l6ZT02NTUzNmsiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L3B0cyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiZGV2cHRzIiwKICAgICAgICAgICAgInR5cGVfIjogImRldnB0cyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJuZXdpbnN0YW5jZSIsCiAgICAgICAgICAgICAgInB0bXhtb2RlPTA2NjYiLAogICAgICAgICAgICAgICJtb2RlPTA2MjAiLAogICAgICAgICAgICAgICJnaWQ9NSIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvc2htIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L3NobSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi9tcXVldWUiLAogICAgICAgICAgICAic291cmNlIjogIm1xdWV1ZSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJtcXVldWUiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvc3lzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJzeXNmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJzeXNmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2V0Yy9yZXNvbHYuY29uZiIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClyZXNvbHYuY29uZiQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJvIiwKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9kZXYiLAogICAgICAgICAgICAgICJub2V4ZWMiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0KICAgICAgICBdLAogICAgICAgICJBbm5vdGF0aW9ucyI6IHsKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmJ1bmRsZV9wYXRoIjogIi9ydW4vY29udGFpbmVyZC9pby5jb250YWluZXJkLnJ1bnRpbWUudjIudGFzay9rOHMuaW8vJChidW5kbGUtaWQpIiwKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIjogInBvZF9zYW5kYm94IiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSI6ICJzYW5kYm94IiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWlkIjogIl5bYS16MC05XXs2NH0kIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWxvZy1kaXJlY3RvcnkiOiAiXi92YXIvbG9nL3BvZHMvJChzYW5kYm94LW5hbWVzcGFjZSlfJChzYW5kYm94LW5hbWUpX1swLTlhLWZdezh9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezEyfSQiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZSI6ICJeZG5zXFwtdGVzdFxcLWY4ODBlNzNmXFwtMTcxOFxcLTQ0NTVcXC05YTc4XFwtNzY2Njc5ZTIyNDcxJCIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1uYW1lc3BhY2UiOiAiZG5zLTk5ODgiLAogICAgICAgICAgIm5lcmRjdGwvbmV0d29yay1uYW1lc3BhY2UiOiAiXi92YXIvcnVuL25ldG5zL2NuaS1bMC05YS1mXXs4fS1bMC05YS1mXXs0fS1bMC05YS1mXXs0fS1bMC05YS1mXXs0fS1bMC05YS1mXXsxMn0kIgogICAgICAgIH0sCiAgICAgICAgIkxpbnV4IjogewogICAgICAgICAgIk5hbWVzcGFjZXMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiVHlwZSI6ICJpcGMiLAogICAgICAgICAgICAgICJQYXRoIjogIiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJUeXBlIjogInV0cyIsCiAgICAgICAgICAgICAgIlBhdGgiOiAiIgogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgIlR5cGUiOiAibW91bnQiLAogICAgICAgICAgICAgICJQYXRoIjogIiIKICAgICAgICAgICAgfQogICAgICAgICAgXSwKICAgICAgICAgICJNYXNrZWRQYXRocyI6IFsKICAgICAgICAgICAgIi9wcm9jL2FjcGkiLAogICAgICAgICAgICAiL3Byb2MvYXNvdW5kIiwKICAgICAgICAgICAgIi9wcm9jL2tjb3JlIiwKICAgICAgICAgICAgIi9wcm9jL2tleXMiLAogICAgICAgICAgICAiL3Byb2MvbGF0ZW5jeV9zdGF0cyIsCiAgICAgICAgICAgICIvcHJvYy90aW1lcl9saXN0IiwKICAgICAgICAgICAgIi9wcm9jL3RpbWVyX3N0YXRzIiwKICAgICAgICAgICAgIi9wcm9jL3NjaGVkX2RlYnVnIiwKICAgICAgICAgICAgIi9zeXMvZmlybXdhcmUiLAogICAgICAgICAgICAiL3Byb2Mvc2NzaSIKICAgICAgICAgIF0sCiAgICAgICAgICAiUmVhZG9ubHlQYXRocyI6IFsKICAgICAgICAgICAgIi9wcm9jL2J1cyIsCiAgICAgICAgICAgICIvcHJvYy9mcyIsCiAgICAgICAgICAgICIvcHJvYy9pcnEiLAogICAgICAgICAgICAiL3Byb2Mvc3lzIiwKICAgICAgICAgICAgIi9wcm9jL3N5c3JxLXRyaWdnZXIiCiAgICAgICAgICBdLAogICAgICAgICAgIkRldmljZXMiOiBbXSwKICAgICAgICAgICJTeXNjdGwiOiB7CiAgICAgICAgICAgICJuZXQuaXB2NC5pcF91bnByaXZpbGVnZWRfcG9ydF9zdGFydCI6ICIwIiwKICAgICAgICAgICAgIm5ldC5pcHY0LnBpbmdfZ3JvdXBfcmFuZ2UiOiAiMCAyMTQ3NDgzNjQ3IgogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSwKICAgICAgInN0b3JhZ2VzIjogWwogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2gwKSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjApIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAib3ZlcmxheWZzIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJmdXNlMy5rYXRhLW92ZXJsYXkiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICI1YTVhYWQ4MDA1NWZmMjAwMTJhNTBkYzI1ZjhkZjdhMjk5MjQ0NzQzMjRkNjVmN2Q1MzA2ZWU4ZWUyN2ZmNzFkIiwKICAgICAgICAgICAgIjgxNzI1MGYxYTNlMzM2ZGE3NmY1YmQzZmE3ODRlMWIyNmQ5NTliOWMxMzE4NzY4MTViYTI2MDQwNDhiNzBjMTgiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQoY3BhdGgpLyQoYnVuZGxlLWlkKSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfQogICAgICBdLAogICAgICAiZGV2aWNlcyI6IFtdLAogICAgICAic2FuZGJveF9waWRucyI6IGZhbHNlLAogICAgICAiZXhlY19jb21tYW5kcyI6IFtdLAogICAgICAiZW52X21hcCI6IHsKICAgICAgICAiUEFUSCI6ICIvdXNyL2xvY2FsL3NiaW46L3Vzci9sb2NhbC9iaW46L3Vzci9zYmluOi91c3IvYmluOi9zYmluOi9iaW4iCiAgICAgIH0KICAgIH0sCiAgICB7CiAgICAgICJPQ0kiOiB7CiAgICAgICAgIlZlcnNpb24iOiAiMS4xLjAtcmMuMSIsCiAgICAgICAgIlByb2Nlc3MiOiB7CiAgICAgICAgICAiVGVybWluYWwiOiBmYWxzZSwKICAgICAgICAgICJVc2VyIjogewogICAgICAgICAgICAiVUlEIjogMCwKICAgICAgICAgICAgIkdJRCI6IDAsCiAgICAgICAgICAgICJBZGRpdGlvbmFsR2lkcyI6IFtdLAogICAgICAgICAgICAiVXNlcm5hbWUiOiAiIgogICAgICAgICAgfSwKICAgICAgICAgICJEZXByZWNhdGVkQXJncyI6IFsKICAgICAgICAgICAgIi9hZ25ob3N0IiwKICAgICAgICAgICAgInRlc3Qtd2Vic2VydmVyIgogICAgICAgICAgXSwKICAgICAgICAgICJBcmdzIjogWwogICAgICAgICAgICAiL2Fnbmhvc3QiLAogICAgICAgICAgICAidGVzdC13ZWJzZXJ2ZXIiCiAgICAgICAgICBdLAogICAgICAgICAgIkVudiI6IFsKICAgICAgICAgICAgIlBBVEg9L3Vzci9sb2NhbC9zYmluOi91c3IvbG9jYWwvYmluOi91c3Ivc2JpbjovdXNyL2Jpbjovc2JpbjovYmluIiwKICAgICAgICAgICAgIkhPU1ROQU1FPSQoaG9zdC1uYW1lKSIKICAgICAgICAgIF0sCiAgICAgICAgICAiQ3dkIjogIi8iLAogICAgICAgICAgIkNhcGFiaWxpdGllcyI6IHsKICAgICAgICAgICAgIkFtYmllbnQiOiBbXSwKICAgICAgICAgICAgIkJvdW5kaW5nIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJFZmZlY3RpdmUiOiBbCiAgICAgICAgICAgICAgIiQoZGVmYXVsdF9jYXBzKSIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgIkluaGVyaXRhYmxlIjogW10sCiAgICAgICAgICAgICJQZXJtaXR0ZWQiOiBbCiAgICAgICAgICAgICAgIiQoZGVmYXVsdF9jYXBzKSIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgICJOb05ld1ByaXZpbGVnZXMiOiBmYWxzZQogICAgICAgIH0sCiAgICAgICAgIlJvb3QiOiB7CiAgICAgICAgICAiUGF0aCI6ICIkKGNwYXRoKS8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgIlJlYWRvbmx5IjogZmFsc2UKICAgICAgICB9LAogICAgICAgICJNb3VudHMiOiBbCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvcHJvYyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAicHJvYyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJwcm9jIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAgICAgIm5vZGV2IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2RldiIsCiAgICAgICAgICAgICJzb3VyY2UiOiAidG1wZnMiLAogICAgICAgICAgICAidHlwZV8iOiAidG1wZnMiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAic3RyaWN0YXRpbWUiLAogICAgICAgICAgICAgICJtb2RlPTc1NSIsCiAgICAgICAgICAgICAgInNpemU9NjU1MzZrIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi9wdHMiLAogICAgICAgICAgICAic291cmNlIjogImRldnB0cyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJkZXZwdHMiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibmV3aW5zdGFuY2UiLAogICAgICAgICAgICAgICJwdG14bW9kZT0wNjY2IiwKICAgICAgICAgICAgICAibW9kZT0wNjIwIiwKICAgICAgICAgICAgICAiZ2lkPTUiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L3NobSIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiL3J1bi9rYXRhLWNvbnRhaW5lcnMvc2FuZGJveC9zaG0iLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvbXF1ZXVlIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJtcXVldWUiLAogICAgICAgICAgICAidHlwZV8iOiAibXF1ZXVlIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAgICAgIm5vZGV2IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL3N5cyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAic3lzZnMiLAogICAgICAgICAgICAidHlwZV8iOiAic3lzZnMiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiLAogICAgICAgICAgICAgICJybyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9zeXMvZnMvY2dyb3VwIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJjZ3JvdXAiLAogICAgICAgICAgICAidHlwZV8iOiAiY2dyb3VwIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAgICAgIm5vZGV2IiwKICAgICAgICAgICAgICAicmVsYXRpbWUiLAogICAgICAgICAgICAgICJybyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9ldGMvaG9zdHMiLAogICAgICAgICAgICAic291cmNlIjogIiQoc2ZwcmVmaXgpaG9zdHMkIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJ3IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi90ZXJtaW5hdGlvbi1sb2ciLAogICAgICAgICAgICAic291cmNlIjogIiQoc2ZwcmVmaXgpdGVybWluYXRpb24tbG9nJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJydyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9ldGMvaG9zdG5hbWUiLAogICAgICAgICAgICAic291cmNlIjogIiQoc2ZwcmVmaXgpaG9zdG5hbWUkIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJ3IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2V0Yy9yZXNvbHYuY29uZiIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClyZXNvbHYuY29uZiQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicnciCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvdmFyL3J1bi9zZWNyZXRzL2t1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQiLAogICAgICAgICAgICAic291cmNlIjogIiQoc2ZwcmVmaXgpc2VydmljZWFjY291bnQkIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL3Zhci9ydW4vc2VjcmV0cy9henVyZS90b2tlbnMiLAogICAgICAgICAgICAic291cmNlIjogIiQoc2ZwcmVmaXgpdG9rZW5zJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJybyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9yZXN1bHRzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJeJChjcGF0aCkvJChzYW5kYm94LWlkKS9sb2NhbC9yZXN1bHRzJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJsb2NhbCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicnciCiAgICAgICAgICAgIF0KICAgICAgICAgIH0KICAgICAgICBdLAogICAgICAgICJBbm5vdGF0aW9ucyI6IHsKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmJ1bmRsZV9wYXRoIjogIi9ydW4vY29udGFpbmVyZC9pby5jb250YWluZXJkLnJ1bnRpbWUudjIudGFzay9rOHMuaW8vJChidW5kbGUtaWQpIiwKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIjogInBvZF9jb250YWluZXIiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLmNvbnRhaW5lci1uYW1lIjogIndlYnNlcnZlciIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLXR5cGUiOiAiY29udGFpbmVyIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5pbWFnZS1uYW1lIjogInJlZ2lzdHJ5Lms4cy5pby9lMmUtdGVzdC1pbWFnZXMvYWduaG9zdDoyLjQzIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWlkIjogIl5bYS16MC05XXs2NH0kIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LW5hbWUiOiAiXmRuc1xcLXRlc3RcXC1mODgwZTczZlxcLTE3MThcXC00NDU1XFwtOWE3OFxcLTc2NjY3OWUyMjQ3MSQiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZXNwYWNlIjogImRucy05OTg4IgogICAgICAgIH0sCiAgICAgICAgIkxpbnV4IjogewogICAgICAgICAgIk5hbWVzcGFjZXMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiVHlwZSI6ICJpcGMiLAogICAgICAgICAgICAgICJQYXRoIjogIiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJUeXBlIjogInV0cyIsCiAgICAgICAgICAgICAgIlBhdGgiOiAiIgogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgIlR5cGUiOiAibW91bnQiLAogICAgICAgICAgICAgICJQYXRoIjogIiIKICAgICAgICAgICAgfQogICAgICAgICAgXSwKICAgICAgICAgICJNYXNrZWRQYXRocyI6IFsKICAgICAgICAgICAgIi9wcm9jL2FjcGkiLAogICAgICAgICAgICAiL3Byb2Mva2NvcmUiLAogICAgICAgICAgICAiL3Byb2Mva2V5cyIsCiAgICAgICAgICAgICIvcHJvYy9sYXRlbmN5X3N0YXRzIiwKICAgICAgICAgICAgIi9wcm9jL3RpbWVyX2xpc3QiLAogICAgICAgICAgICAiL3Byb2MvdGltZXJfc3RhdHMiLAogICAgICAgICAgICAiL3Byb2Mvc2NoZWRfZGVidWciLAogICAgICAgICAgICAiL3Byb2Mvc2NzaSIsCiAgICAgICAgICAgICIvc3lzL2Zpcm13YXJlIgogICAgICAgICAgXSwKICAgICAgICAgICJSZWFkb25seVBhdGhzIjogWwogICAgICAgICAgICAiL3Byb2MvYXNvdW5kIiwKICAgICAgICAgICAgIi9wcm9jL2J1cyIsCiAgICAgICAgICAgICIvcHJvYy9mcyIsCiAgICAgICAgICAgICIvcHJvYy9pcnEiLAogICAgICAgICAgICAiL3Byb2Mvc3lzIiwKICAgICAgICAgICAgIi9wcm9jL3N5c3JxLXRyaWdnZXIiCiAgICAgICAgICBdLAogICAgICAgICAgIkRldmljZXMiOiBbXSwKICAgICAgICAgICJTeXNjdGwiOiB7CiAgICAgICAgICAgICJuZXQuaXB2NC5pcF91bnByaXZpbGVnZWRfcG9ydF9zdGFydCI6ICIwIiwKICAgICAgICAgICAgIm5ldC5pcHY0LnBpbmdfZ3JvdXBfcmFuZ2UiOiAiMCAyMTQ3NDgzNjQ3IgogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSwKICAgICAgInN0b3JhZ2VzIjogWwogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2gwKSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjApIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2gxKSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjEpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2gyKSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjIpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2gzKSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjMpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2g0KSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjQpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2g1KSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjUpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2g2KSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjYpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2g3KSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjcpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2g4KSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjgpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2g5KSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjkpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAib3ZlcmxheWZzIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJmdXNlMy5rYXRhLW92ZXJsYXkiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICI1MWYxZDVkZjllNWI2NDYzMjc3OWM5OTZhM2FiYjliMzJjYzY5Yzc2ZTBjMTc2MjBlZDZjZWZmMTVkM2YyODFhOmJmNGQwMTQ3ZjNhYmVhNTU1NTBhOGE2MTJiZGMxMTQ0Yjk2OTY2ZDUyMGMyNjdlMTU1MTZkNTE1N2NiMzliYWI6YjFiYjU3YTNlNWQwNjJmOWEzZGU0ZmUxYzJhZDIzMjgyMzNhNjgxN2FhMDRiYjI4ZjgzYjg2ZDgxNDUyYWY1YjpkYWVkNzE3ZWYyMTAwNjc0MjJjOTI3YzRlZGYyMjBjNDMzYTgwNzBjZDdmMGFjMDljNDUwNzlkYTI0NzVjNGYzOmUxZjY5NzliODZjOGVhZTEwYzY4YzE5ZjNiMDUwMzJkZmFiMWQ3NzAxODI3MjlhZGIzZDgwOGM3MGY3YjlmN2Y6MTUzNWY3OGEwN2Q1MjQwNWFkNzMxN2NiZmNlZGYwNGQ2MDBkZTQwYjE3ZTMxZjVhYjI1NTY2MTEwMDRhNWI1YToxOTE4YTA1MmZmZDIwNmU0NTlhMmFkYjcxY2FiZWJlZjAwY2NmNzQ0YzIyZGE2NGE4ZDhhOTRlMDkzZDY4MDNiOjIwN2VhMDBiNWRhZDA0NDVhNmM0NjU4MjZmMmZiNTcxM2JiNGRjY2EzNjk1MzFlMmE3ZjU5NWY1MzczOTU1OTY6OTUwMGU0NjYxN2ZiNDU4MjgyNDkyMWNlMjFmNTVhZWFhOTVhMzE5YmIzNGViZmMxMTkwNDJiZGUxOTk5NmVkYjpkYTU5ODBhN2UzNDM0NDA5ZGExMjMyNDE3YTFkMWNjMDI5NjdiNjJhMDk5NTAyY2FjZDEzY2MyZTM0MjA2ZmE0IiwKICAgICAgICAgICAgImVjZTVlZjIxNmM0MDA0N2FjY2YzOGQzYThiMTY4OTlkMTNiMjcxMjA2N2RkNDc4YTIxNzgzNzhlYzdmY2JmYzY6MTdhODM4YjAyMzQ3ODJlYjdmNmJjYWEwZmIyOGJlZjlmNjMwMjY4ZDJlMTJjM2IyODAyMmRhYmYxY2RiYTgxMjo5MzEwZjRiN2M4ZDczMGJlMDU1MDk2ZmI5ZTBkYmI3OTY0OWIwMmQwOTc4MzdkNjYwOWY5MjA5N2FiODA4MTk0OjFhNjQ0NzFmM2U5NjMwNjAyMGY1NWY4Y2YxN2FiNjliYzI2MDM3MGRmY2NmMzI2MjAwNDJmZjJjNjA2NzY3ZmI6ZjRkMmIyNDQ4NDJmMDVmNGIxYmU3NzA2OTQ2MWViZGNlNzM5NDVkNDMwYjA1ZjQ5YWY5YzU0MGE3YWQ2ZmVlMTphNzFmMDBkMjU4YWJlZTQxMGJhOTIyYjRiNTRjMzBkN2VhOGRjZGMwNWFlMzQ1ZTM1Y2ViMWU4YTdmYjBmZGI5OjIxNWE3ZWIwYjRhZDQ4NGQ1OTlmOTQ1YTVhZmIzNzAwODE4Y2JjZjc5Nzg3YzU5MzFjYjMzZTBiZDJmYThkZjU6YjExZWMyMjkwNTk3NTk3MTM1YTkxZGY4NDgxMjg3NDdiYTc2OGFkM2ZjYWYwYmI3NTBiMjkyMTZlMmUzYzJkMTo5ZjFhODI0NDU5MDExNTRjZjk5ZWQ3NmUyYjAwNzk3YWZhZmJlMmIxNDEzNjE1MWFhMGE3ZGVhNTZhNWM5ZjYzOjI1NGM1MzE0ODczYzI3YThkZTNkYjUzNDdmNTZlYmQ5ZWIyYmY0NmNjODgxMmE0MzYxMWY5OGUzOGFjMzdiYTIiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQoY3BhdGgpLyQoYnVuZGxlLWlkKSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImxvY2FsIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICJsb2NhbCIsCiAgICAgICAgICAiZnN0eXBlIjogImxvY2FsIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAibW9kZT0wNzc3IgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICJeJChjcGF0aCkvJChzYW5kYm94LWlkKS9sb2NhbC9yZXN1bHRzJCIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfQogICAgICBdLAogICAgICAiZGV2aWNlcyI6IFtdLAogICAgICAic2FuZGJveF9waWRucyI6IGZhbHNlLAogICAgICAiZXhlY19jb21tYW5kcyI6IFtdLAogICAgICAiZW52X21hcCI6IHsKICAgICAgICAiSE9TVE5BTUUiOiAiJChob3N0LW5hbWUpIiwKICAgICAgICAiUEFUSCI6ICIvdXNyL2xvY2FsL3NiaW46L3Vzci9sb2NhbC9iaW46L3Vzci9zYmluOi91c3IvYmluOi9zYmluOi9iaW4iCiAgICAgIH0KICAgIH0sCiAgICB7CiAgICAgICJPQ0kiOiB7CiAgICAgICAgIlZlcnNpb24iOiAiMS4xLjAtcmMuMSIsCiAgICAgICAgIlByb2Nlc3MiOiB7CiAgICAgICAgICAiVGVybWluYWwiOiBmYWxzZSwKICAgICAgICAgICJVc2VyIjogewogICAgICAgICAgICAiVUlEIjogMCwKICAgICAgICAgICAgIkdJRCI6IDAsCiAgICAgICAgICAgICJBZGRpdGlvbmFsR2lkcyI6IFtdLAogICAgICAgICAgICAiVXNlcm5hbWUiOiAiIgogICAgICAgICAgfSwKICAgICAgICAgICJEZXByZWNhdGVkQXJncyI6IFsKICAgICAgICAgICAgInNoIiwKICAgICAgICAgICAgIi1jIiwKICAgICAgICAgICAgImZvciBpIGluIGBzZXEgMSA2MDBgOyBkbyBjaGVjaz1cIiQkKGRpZyArbm90Y3AgK25vYWxsICthbnN3ZXIgK3NlYXJjaCBrdWJlcm5ldGVzLmRlZmF1bHQuc3ZjLmNsdXN0ZXIubG9jYWwgQSlcIiAmJiB0ZXN0IC1uIFwiJCRjaGVja1wiICYmIGVjaG8gT0sgPiAvcmVzdWx0cy93aGVlenlfdWRwQGt1YmVybmV0ZXMuZGVmYXVsdC5zdmMuY2x1c3Rlci5sb2NhbDtjaGVjaz1cIiQkKGRpZyArdGNwICtub2FsbCArYW5zd2VyICtzZWFyY2gga3ViZXJuZXRlcy5kZWZhdWx0LnN2Yy5jbHVzdGVyLmxvY2FsIEEpXCIgJiYgdGVzdCAtbiBcIiQkY2hlY2tcIiAmJiBlY2hvIE9LID4gL3Jlc3VsdHMvd2hlZXp5X3RjcEBrdWJlcm5ldGVzLmRlZmF1bHQuc3ZjLmNsdXN0ZXIubG9jYWw7c2xlZXAgMTsgZG9uZSIKICAgICAgICAgIF0sCiAgICAgICAgICAiQXJncyI6IFsKICAgICAgICAgICAgInNoIiwKICAgICAgICAgICAgIi1jIiwKICAgICAgICAgICAgImZvciBpIGluIGBzZXEgMSA2MDBgOyBkbyBjaGVjaz1cIiQkKGRpZyArbm90Y3AgK25vYWxsICthbnN3ZXIgK3NlYXJjaCBrdWJlcm5ldGVzLmRlZmF1bHQuc3ZjLmNsdXN0ZXIubG9jYWwgQSlcIiAmJiB0ZXN0IC1uIFwiJCRjaGVja1wiICYmIGVjaG8gT0sgPiAvcmVzdWx0cy93aGVlenlfdWRwQGt1YmVybmV0ZXMuZGVmYXVsdC5zdmMuY2x1c3Rlci5sb2NhbDtjaGVjaz1cIiQkKGRpZyArdGNwICtub2FsbCArYW5zd2VyICtzZWFyY2gga3ViZXJuZXRlcy5kZWZhdWx0LnN2Yy5jbHVzdGVyLmxvY2FsIEEpXCIgJiYgdGVzdCAtbiBcIiQkY2hlY2tcIiAmJiBlY2hvIE9LID4gL3Jlc3VsdHMvd2hlZXp5X3RjcEBrdWJlcm5ldGVzLmRlZmF1bHQuc3ZjLmNsdXN0ZXIubG9jYWw7c2xlZXAgMTsgZG9uZSIKICAgICAgICAgIF0sCiAgICAgICAgICAiRW52IjogWwogICAgICAgICAgICAiUEFUSD0vdXNyL2xvY2FsL3NiaW46L3Vzci9sb2NhbC9iaW46L3Vzci9zYmluOi91c3IvYmluOi9zYmluOi9iaW4iLAogICAgICAgICAgICAiSE9TVE5BTUU9JChob3N0LW5hbWUpIgogICAgICAgICAgXSwKICAgICAgICAgICJDd2QiOiAiLyIsCiAgICAgICAgICAiQ2FwYWJpbGl0aWVzIjogewogICAgICAgICAgICAiQW1iaWVudCI6IFtdLAogICAgICAgICAgICAiQm91bmRpbmciOiBbCiAgICAgICAgICAgICAgIiQoZGVmYXVsdF9jYXBzKSIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgIkVmZmVjdGl2ZSI6IFsKICAgICAgICAgICAgICAiJChkZWZhdWx0X2NhcHMpIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiSW5oZXJpdGFibGUiOiBbXSwKICAgICAgICAgICAgIlBlcm1pdHRlZCI6IFsKICAgICAgICAgICAgICAiJChkZWZhdWx0X2NhcHMpIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgIk5vTmV3UHJpdmlsZWdlcyI6IGZhbHNlCiAgICAgICAgfSwKICAgICAgICAiUm9vdCI6IHsKICAgICAgICAgICJQYXRoIjogIiQoY3BhdGgpLyQoYnVuZGxlLWlkKSIsCiAgICAgICAgICAiUmVhZG9ubHkiOiBmYWxzZQogICAgICAgIH0sCiAgICAgICAgIk1vdW50cyI6IFsKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9wcm9jIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJwcm9jIiwKICAgICAgICAgICAgInR5cGVfIjogInByb2MiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2IiwKICAgICAgICAgICAgInNvdXJjZSI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJzdHJpY3RhdGltZSIsCiAgICAgICAgICAgICAgIm1vZGU9NzU1IiwKICAgICAgICAgICAgICAic2l6ZT02NTUzNmsiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L3B0cyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiZGV2cHRzIiwKICAgICAgICAgICAgInR5cGVfIjogImRldnB0cyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJuZXdpbnN0YW5jZSIsCiAgICAgICAgICAgICAgInB0bXhtb2RlPTA2NjYiLAogICAgICAgICAgICAgICJtb2RlPTA2MjAiLAogICAgICAgICAgICAgICJnaWQ9NSIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvc2htIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L3NobSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi9tcXVldWUiLAogICAgICAgICAgICAic291cmNlIjogIm1xdWV1ZSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJtcXVldWUiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvc3lzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJzeXNmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJzeXNmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL3N5cy9mcy9jZ3JvdXAiLAogICAgICAgICAgICAic291cmNlIjogImNncm91cCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJjZ3JvdXAiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiLAogICAgICAgICAgICAgICJyZWxhdGltZSIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2V0Yy9ob3N0cyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClob3N0cyQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicnciCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L3Rlcm1pbmF0aW9uLWxvZyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeCl0ZXJtaW5hdGlvbi1sb2ckIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJ3IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2V0Yy9ob3N0bmFtZSIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClob3N0bmFtZSQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicnciCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZXRjL3Jlc29sdi5jb25mIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KXJlc29sdi5jb25mJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJydyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi92YXIvcnVuL3NlY3JldHMva3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudCIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClzZXJ2aWNlYWNjb3VudCQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicm8iCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvdmFyL3J1bi9zZWNyZXRzL2F6dXJlL3Rva2VucyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeCl0b2tlbnMkIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL3Jlc3VsdHMiLAogICAgICAgICAgICAic291cmNlIjogIl4kKGNwYXRoKS8kKHNhbmRib3gtaWQpL2xvY2FsL3Jlc3VsdHMkIiwKICAgICAgICAgICAgInR5cGVfIjogImxvY2FsIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJydyIKICAgICAgICAgICAgXQogICAgICAgICAgfQogICAgICAgIF0sCiAgICAgICAgIkFubm90YXRpb25zIjogewogICAgICAgICAgImlvLmthdGFjb250YWluZXJzLnBrZy5vY2kuYnVuZGxlX3BhdGgiOiAiL3J1bi9jb250YWluZXJkL2lvLmNvbnRhaW5lcmQucnVudGltZS52Mi50YXNrL2s4cy5pby8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgImlvLmthdGFjb250YWluZXJzLnBrZy5vY2kuY29udGFpbmVyX3R5cGUiOiAicG9kX2NvbnRhaW5lciIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLW5hbWUiOiAicXVlcmllciIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLXR5cGUiOiAiY29udGFpbmVyIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5pbWFnZS1uYW1lIjogInJlZ2lzdHJ5Lms4cy5pby9lMmUtdGVzdC1pbWFnZXMvYWduaG9zdDoyLjQzIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWlkIjogIl5bYS16MC05XXs2NH0kIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LW5hbWUiOiAiXmRuc1xcLXRlc3RcXC1mODgwZTczZlxcLTE3MThcXC00NDU1XFwtOWE3OFxcLTc2NjY3OWUyMjQ3MSQiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZXNwYWNlIjogImRucy05OTg4IgogICAgICAgIH0sCiAgICAgICAgIkxpbnV4IjogewogICAgICAgICAgIk5hbWVzcGFjZXMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiVHlwZSI6ICJpcGMiLAogICAgICAgICAgICAgICJQYXRoIjogIiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJUeXBlIjogInV0cyIsCiAgICAgICAgICAgICAgIlBhdGgiOiAiIgogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgIlR5cGUiOiAibW91bnQiLAogICAgICAgICAgICAgICJQYXRoIjogIiIKICAgICAgICAgICAgfQogICAgICAgICAgXSwKICAgICAgICAgICJNYXNrZWRQYXRocyI6IFsKICAgICAgICAgICAgIi9wcm9jL2FjcGkiLAogICAgICAgICAgICAiL3Byb2Mva2NvcmUiLAogICAgICAgICAgICAiL3Byb2Mva2V5cyIsCiAgICAgICAgICAgICIvcHJvYy9sYXRlbmN5X3N0YXRzIiwKICAgICAgICAgICAgIi9wcm9jL3RpbWVyX2xpc3QiLAogICAgICAgICAgICAiL3Byb2MvdGltZXJfc3RhdHMiLAogICAgICAgICAgICAiL3Byb2Mvc2NoZWRfZGVidWciLAogICAgICAgICAgICAiL3Byb2Mvc2NzaSIsCiAgICAgICAgICAgICIvc3lzL2Zpcm13YXJlIgogICAgICAgICAgXSwKICAgICAgICAgICJSZWFkb25seVBhdGhzIjogWwogICAgICAgICAgICAiL3Byb2MvYXNvdW5kIiwKICAgICAgICAgICAgIi9wcm9jL2J1cyIsCiAgICAgICAgICAgICIvcHJvYy9mcyIsCiAgICAgICAgICAgICIvcHJvYy9pcnEiLAogICAgICAgICAgICAiL3Byb2Mvc3lzIiwKICAgICAgICAgICAgIi9wcm9jL3N5c3JxLXRyaWdnZXIiCiAgICAgICAgICBdLAogICAgICAgICAgIkRldmljZXMiOiBbXSwKICAgICAgICAgICJTeXNjdGwiOiB7CiAgICAgICAgICAgICJuZXQuaXB2NC5pcF91bnByaXZpbGVnZWRfcG9ydF9zdGFydCI6ICIwIiwKICAgICAgICAgICAgIm5ldC5pcHY0LnBpbmdfZ3JvdXBfcmFuZ2UiOiAiMCAyMTQ3NDgzNjQ3IgogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSwKICAgICAgInN0b3JhZ2VzIjogWwogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2gwKSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjApIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2gxKSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjEpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2gyKSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjIpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2gzKSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjMpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2g0KSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjQpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2g1KSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjUpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2g2KSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjYpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2g3KSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjcpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2g4KSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjgpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2g5KSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjkpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAib3ZlcmxheWZzIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJmdXNlMy5rYXRhLW92ZXJsYXkiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICI1MWYxZDVkZjllNWI2NDYzMjc3OWM5OTZhM2FiYjliMzJjYzY5Yzc2ZTBjMTc2MjBlZDZjZWZmMTVkM2YyODFhOmJmNGQwMTQ3ZjNhYmVhNTU1NTBhOGE2MTJiZGMxMTQ0Yjk2OTY2ZDUyMGMyNjdlMTU1MTZkNTE1N2NiMzliYWI6YjFiYjU3YTNlNWQwNjJmOWEzZGU0ZmUxYzJhZDIzMjgyMzNhNjgxN2FhMDRiYjI4ZjgzYjg2ZDgxNDUyYWY1YjpkYWVkNzE3ZWYyMTAwNjc0MjJjOTI3YzRlZGYyMjBjNDMzYTgwNzBjZDdmMGFjMDljNDUwNzlkYTI0NzVjNGYzOmUxZjY5NzliODZjOGVhZTEwYzY4YzE5ZjNiMDUwMzJkZmFiMWQ3NzAxODI3MjlhZGIzZDgwOGM3MGY3YjlmN2Y6MTUzNWY3OGEwN2Q1MjQwNWFkNzMxN2NiZmNlZGYwNGQ2MDBkZTQwYjE3ZTMxZjVhYjI1NTY2MTEwMDRhNWI1YToxOTE4YTA1MmZmZDIwNmU0NTlhMmFkYjcxY2FiZWJlZjAwY2NmNzQ0YzIyZGE2NGE4ZDhhOTRlMDkzZDY4MDNiOjIwN2VhMDBiNWRhZDA0NDVhNmM0NjU4MjZmMmZiNTcxM2JiNGRjY2EzNjk1MzFlMmE3ZjU5NWY1MzczOTU1OTY6OTUwMGU0NjYxN2ZiNDU4MjgyNDkyMWNlMjFmNTVhZWFhOTVhMzE5YmIzNGViZmMxMTkwNDJiZGUxOTk5NmVkYjpkYTU5ODBhN2UzNDM0NDA5ZGExMjMyNDE3YTFkMWNjMDI5NjdiNjJhMDk5NTAyY2FjZDEzY2MyZTM0MjA2ZmE0IiwKICAgICAgICAgICAgImVjZTVlZjIxNmM0MDA0N2FjY2YzOGQzYThiMTY4OTlkMTNiMjcxMjA2N2RkNDc4YTIxNzgzNzhlYzdmY2JmYzY6MTdhODM4YjAyMzQ3ODJlYjdmNmJjYWEwZmIyOGJlZjlmNjMwMjY4ZDJlMTJjM2IyODAyMmRhYmYxY2RiYTgxMjo5MzEwZjRiN2M4ZDczMGJlMDU1MDk2ZmI5ZTBkYmI3OTY0OWIwMmQwOTc4MzdkNjYwOWY5MjA5N2FiODA4MTk0OjFhNjQ0NzFmM2U5NjMwNjAyMGY1NWY4Y2YxN2FiNjliYzI2MDM3MGRmY2NmMzI2MjAwNDJmZjJjNjA2NzY3ZmI6ZjRkMmIyNDQ4NDJmMDVmNGIxYmU3NzA2OTQ2MWViZGNlNzM5NDVkNDMwYjA1ZjQ5YWY5YzU0MGE3YWQ2ZmVlMTphNzFmMDBkMjU4YWJlZTQxMGJhOTIyYjRiNTRjMzBkN2VhOGRjZGMwNWFlMzQ1ZTM1Y2ViMWU4YTdmYjBmZGI5OjIxNWE3ZWIwYjRhZDQ4NGQ1OTlmOTQ1YTVhZmIzNzAwODE4Y2JjZjc5Nzg3YzU5MzFjYjMzZTBiZDJmYThkZjU6YjExZWMyMjkwNTk3NTk3MTM1YTkxZGY4NDgxMjg3NDdiYTc2OGFkM2ZjYWYwYmI3NTBiMjkyMTZlMmUzYzJkMTo5ZjFhODI0NDU5MDExNTRjZjk5ZWQ3NmUyYjAwNzk3YWZhZmJlMmIxNDEzNjE1MWFhMGE3ZGVhNTZhNWM5ZjYzOjI1NGM1MzE0ODczYzI3YThkZTNkYjUzNDdmNTZlYmQ5ZWIyYmY0NmNjODgxMmE0MzYxMWY5OGUzOGFjMzdiYTIiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQoY3BhdGgpLyQoYnVuZGxlLWlkKSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImxvY2FsIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICJsb2NhbCIsCiAgICAgICAgICAiZnN0eXBlIjogImxvY2FsIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAibW9kZT0wNzc3IgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICJeJChjcGF0aCkvJChzYW5kYm94LWlkKS9sb2NhbC9yZXN1bHRzJCIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfQogICAgICBdLAogICAgICAiZGV2aWNlcyI6IFtdLAogICAgICAic2FuZGJveF9waWRucyI6IGZhbHNlLAogICAgICAiZXhlY19jb21tYW5kcyI6IFtdLAogICAgICAiZW52X21hcCI6IHsKICAgICAgICAiSE9TVE5BTUUiOiAiJChob3N0LW5hbWUpIiwKICAgICAgICAiUEFUSCI6ICIvdXNyL2xvY2FsL3NiaW46L3Vzci9sb2NhbC9iaW46L3Vzci9zYmluOi91c3IvYmluOi9zYmluOi9iaW4iCiAgICAgIH0KICAgIH0sCiAgICB7CiAgICAgICJPQ0kiOiB7CiAgICAgICAgIlZlcnNpb24iOiAiMS4xLjAtcmMuMSIsCiAgICAgICAgIlByb2Nlc3MiOiB7CiAgICAgICAgICAiVGVybWluYWwiOiBmYWxzZSwKICAgICAgICAgICJVc2VyIjogewogICAgICAgICAgICAiVUlEIjogMCwKICAgICAgICAgICAgIkdJRCI6IDAsCiAgICAgICAgICAgICJBZGRpdGlvbmFsR2lkcyI6IFtdLAogICAgICAgICAgICAiVXNlcm5hbWUiOiAiIgogICAgICAgICAgfSwKICAgICAgICAgICJEZXByZWNhdGVkQXJncyI6IFsKICAgICAgICAgICAgInNoIiwKICAgICAgICAgICAgIi1jIiwKICAgICAgICAgICAgImZvciBpIGluIGBzZXEgMSA2MDBgOyBkbyBjaGVjaz1cIiQkKGRpZyArbm90Y3AgK25vYWxsICthbnN3ZXIgK3NlYXJjaCBrdWJlcm5ldGVzLmRlZmF1bHQuc3ZjLmNsdXN0ZXIubG9jYWwgQSlcIiAmJiB0ZXN0IC1uIFwiJCRjaGVja1wiICYmIGVjaG8gT0sgPiAvcmVzdWx0cy9qZXNzaWVfdWRwQGt1YmVybmV0ZXMuZGVmYXVsdC5zdmMuY2x1c3Rlci5sb2NhbDtjaGVjaz1cIiQkKGRpZyArdGNwICtub2FsbCArYW5zd2VyICtzZWFyY2gga3ViZXJuZXRlcy5kZWZhdWx0LnN2Yy5jbHVzdGVyLmxvY2FsIEEpXCIgJiYgdGVzdCAtbiBcIiQkY2hlY2tcIiAmJiBlY2hvIE9LID4gL3Jlc3VsdHMvamVzc2llX3RjcEBrdWJlcm5ldGVzLmRlZmF1bHQuc3ZjLmNsdXN0ZXIubG9jYWw7c2xlZXAgMTsgZG9uZSIKICAgICAgICAgIF0sCiAgICAgICAgICAiQXJncyI6IFsKICAgICAgICAgICAgInNoIiwKICAgICAgICAgICAgIi1jIiwKICAgICAgICAgICAgImZvciBpIGluIGBzZXEgMSA2MDBgOyBkbyBjaGVjaz1cIiQkKGRpZyArbm90Y3AgK25vYWxsICthbnN3ZXIgK3NlYXJjaCBrdWJlcm5ldGVzLmRlZmF1bHQuc3ZjLmNsdXN0ZXIubG9jYWwgQSlcIiAmJiB0ZXN0IC1uIFwiJCRjaGVja1wiICYmIGVjaG8gT0sgPiAvcmVzdWx0cy9qZXNzaWVfdWRwQGt1YmVybmV0ZXMuZGVmYXVsdC5zdmMuY2x1c3Rlci5sb2NhbDtjaGVjaz1cIiQkKGRpZyArdGNwICtub2FsbCArYW5zd2VyICtzZWFyY2gga3ViZXJuZXRlcy5kZWZhdWx0LnN2Yy5jbHVzdGVyLmxvY2FsIEEpXCIgJiYgdGVzdCAtbiBcIiQkY2hlY2tcIiAmJiBlY2hvIE9LID4gL3Jlc3VsdHMvamVzc2llX3RjcEBrdWJlcm5ldGVzLmRlZmF1bHQuc3ZjLmNsdXN0ZXIubG9jYWw7c2xlZXAgMTsgZG9uZSIKICAgICAgICAgIF0sCiAgICAgICAgICAiRW52IjogWwogICAgICAgICAgICAiUEFUSD0vdXNyL2xvY2FsL3NiaW46L3Vzci9sb2NhbC9iaW46L3Vzci9zYmluOi91c3IvYmluOi9zYmluOi9iaW4iLAogICAgICAgICAgICAiSE9TVE5BTUU9JChob3N0LW5hbWUpIgogICAgICAgICAgXSwKICAgICAgICAgICJDd2QiOiAiLyIsCiAgICAgICAgICAiQ2FwYWJpbGl0aWVzIjogewogICAgICAgICAgICAiQW1iaWVudCI6IFtdLAogICAgICAgICAgICAiQm91bmRpbmciOiBbCiAgICAgICAgICAgICAgIiQoZGVmYXVsdF9jYXBzKSIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgIkVmZmVjdGl2ZSI6IFsKICAgICAgICAgICAgICAiJChkZWZhdWx0X2NhcHMpIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiSW5oZXJpdGFibGUiOiBbXSwKICAgICAgICAgICAgIlBlcm1pdHRlZCI6IFsKICAgICAgICAgICAgICAiJChkZWZhdWx0X2NhcHMpIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgIk5vTmV3UHJpdmlsZWdlcyI6IGZhbHNlCiAgICAgICAgfSwKICAgICAgICAiUm9vdCI6IHsKICAgICAgICAgICJQYXRoIjogIiQoY3BhdGgpLyQoYnVuZGxlLWlkKSIsCiAgICAgICAgICAiUmVhZG9ubHkiOiBmYWxzZQogICAgICAgIH0sCiAgICAgICAgIk1vdW50cyI6IFsKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9wcm9jIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJwcm9jIiwKICAgICAgICAgICAgInR5cGVfIjogInByb2MiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2IiwKICAgICAgICAgICAgInNvdXJjZSI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJzdHJpY3RhdGltZSIsCiAgICAgICAgICAgICAgIm1vZGU9NzU1IiwKICAgICAgICAgICAgICAic2l6ZT02NTUzNmsiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L3B0cyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiZGV2cHRzIiwKICAgICAgICAgICAgInR5cGVfIjogImRldnB0cyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJuZXdpbnN0YW5jZSIsCiAgICAgICAgICAgICAgInB0bXhtb2RlPTA2NjYiLAogICAgICAgICAgICAgICJtb2RlPTA2MjAiLAogICAgICAgICAgICAgICJnaWQ9NSIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvc2htIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L3NobSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi9tcXVldWUiLAogICAgICAgICAgICAic291cmNlIjogIm1xdWV1ZSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJtcXVldWUiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvc3lzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJzeXNmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJzeXNmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL3N5cy9mcy9jZ3JvdXAiLAogICAgICAgICAgICAic291cmNlIjogImNncm91cCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJjZ3JvdXAiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiLAogICAgICAgICAgICAgICJyZWxhdGltZSIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2V0Yy9ob3N0cyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClob3N0cyQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicnciCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L3Rlcm1pbmF0aW9uLWxvZyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeCl0ZXJtaW5hdGlvbi1sb2ckIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJ3IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2V0Yy9ob3N0bmFtZSIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClob3N0bmFtZSQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicnciCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZXRjL3Jlc29sdi5jb25mIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KXJlc29sdi5jb25mJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJydyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi92YXIvcnVuL3NlY3JldHMva3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudCIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClzZXJ2aWNlYWNjb3VudCQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicm8iCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvdmFyL3J1bi9zZWNyZXRzL2F6dXJlL3Rva2VucyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeCl0b2tlbnMkIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL3Jlc3VsdHMiLAogICAgICAgICAgICAic291cmNlIjogIl4kKGNwYXRoKS8kKHNhbmRib3gtaWQpL2xvY2FsL3Jlc3VsdHMkIiwKICAgICAgICAgICAgInR5cGVfIjogImxvY2FsIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJydyIKICAgICAgICAgICAgXQogICAgICAgICAgfQogICAgICAgIF0sCiAgICAgICAgIkFubm90YXRpb25zIjogewogICAgICAgICAgImlvLmthdGFjb250YWluZXJzLnBrZy5vY2kuYnVuZGxlX3BhdGgiOiAiL3J1bi9jb250YWluZXJkL2lvLmNvbnRhaW5lcmQucnVudGltZS52Mi50YXNrL2s4cy5pby8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgImlvLmthdGFjb250YWluZXJzLnBrZy5vY2kuY29udGFpbmVyX3R5cGUiOiAicG9kX2NvbnRhaW5lciIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLW5hbWUiOiAiamVzc2llLXF1ZXJpZXIiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLmNvbnRhaW5lci10eXBlIjogImNvbnRhaW5lciIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuaW1hZ2UtbmFtZSI6ICJyZWdpc3RyeS5rOHMuaW8vZTJlLXRlc3QtaW1hZ2VzL2plc3NpZS1kbnN1dGlsczoxLjciLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtaWQiOiAiXlthLXowLTldezY0fSQiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZSI6ICJeZG5zXFwtdGVzdFxcLWY4ODBlNzNmXFwtMTcxOFxcLTQ0NTVcXC05YTc4XFwtNzY2Njc5ZTIyNDcxJCIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1uYW1lc3BhY2UiOiAiZG5zLTk5ODgiCiAgICAgICAgfSwKICAgICAgICAiTGludXgiOiB7CiAgICAgICAgICAiTmFtZXNwYWNlcyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICJUeXBlIjogImlwYyIsCiAgICAgICAgICAgICAgIlBhdGgiOiAiIgogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgIlR5cGUiOiAidXRzIiwKICAgICAgICAgICAgICAiUGF0aCI6ICIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiVHlwZSI6ICJtb3VudCIsCiAgICAgICAgICAgICAgIlBhdGgiOiAiIgogICAgICAgICAgICB9CiAgICAgICAgICBdLAogICAgICAgICAgIk1hc2tlZFBhdGhzIjogWwogICAgICAgICAgICAiL3Byb2MvYWNwaSIsCiAgICAgICAgICAgICIvcHJvYy9rY29yZSIsCiAgICAgICAgICAgICIvcHJvYy9rZXlzIiwKICAgICAgICAgICAgIi9wcm9jL2xhdGVuY3lfc3RhdHMiLAogICAgICAgICAgICAiL3Byb2MvdGltZXJfbGlzdCIsCiAgICAgICAgICAgICIvcHJvYy90aW1lcl9zdGF0cyIsCiAgICAgICAgICAgICIvcHJvYy9zY2hlZF9kZWJ1ZyIsCiAgICAgICAgICAgICIvcHJvYy9zY3NpIiwKICAgICAgICAgICAgIi9zeXMvZmlybXdhcmUiCiAgICAgICAgICBdLAogICAgICAgICAgIlJlYWRvbmx5UGF0aHMiOiBbCiAgICAgICAgICAgICIvcHJvYy9hc291bmQiLAogICAgICAgICAgICAiL3Byb2MvYnVzIiwKICAgICAgICAgICAgIi9wcm9jL2ZzIiwKICAgICAgICAgICAgIi9wcm9jL2lycSIsCiAgICAgICAgICAgICIvcHJvYy9zeXMiLAogICAgICAgICAgICAiL3Byb2Mvc3lzcnEtdHJpZ2dlciIKICAgICAgICAgIF0sCiAgICAgICAgICAiRGV2aWNlcyI6IFtdLAogICAgICAgICAgIlN5c2N0bCI6IHsKICAgICAgICAgICAgIm5ldC5pcHY0LmlwX3VucHJpdmlsZWdlZF9wb3J0X3N0YXJ0IjogIjAiLAogICAgICAgICAgICAibmV0LmlwdjQucGluZ19ncm91cF9yYW5nZSI6ICIwIDIxNDc0ODM2NDciCiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9LAogICAgICAic3RvcmFnZXMiOiBbCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJibGsiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogInRhciIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIiQoaGFzaDApIgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGxheWVyMCkiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJibGsiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogInRhciIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIiQoaGFzaDEpIgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGxheWVyMSkiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJibGsiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogInRhciIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIiQoaGFzaDIpIgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGxheWVyMikiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJibGsiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogInRhciIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIiQoaGFzaDMpIgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGxheWVyMykiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJibGsiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogInRhciIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIiQoaGFzaDQpIgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGxheWVyNCkiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJibGsiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogInRhciIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIiQoaGFzaDUpIgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGxheWVyNSkiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJvdmVybGF5ZnMiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogImZ1c2UzLmthdGEtb3ZlcmxheSIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIjEwYjU2Yzc1Njg5YjJkM2ZkMzRkYWI1ODZlMjg0Yzg5MTdiYWE3ZjI0NDViNjQzOWQ3OGFiNmQ5NjQ1YTYwYjM6ZTUwMDA0OTYxM2ViNGVmMDJlMDNlNjU4MGU4MGM1YTgyNjczMGE5NDQ1MjFkYWZmMWVlZjc3NmIyZmNjMGYyMDphYzgzZjRhMzcyYjM0MDIxOTNlYTMxNGVjN2U4YTg3YjkxYzU5YzczZTIzYmE3OWNlYzkyYzFhNDFjOGFhZjU0OjBiMmM1YzNjNDYzMzgyMGI1YjRmNmQ3N2VhMjJjNWVkMGUzZDNjMzMyMDkxNjVjMmIxODE1ODdiMmQ4YmUzMTI6NzNmYTBhYTk5NmEzNzRjYzg0NjcyOGY3MjYzOTNjZmNmZjQ2Yzk4MmRjZjYyZDJkMjU5ZjYwMDZkZWU1ZTJiZDozNWY3OGFmMTBiNjM0MDJiYjg5ZGExNjE1MTNmYTU2MzQ2NWJjYzFkNDM0M2M0ZjdkNDk4MTFmZjliNzBkZGE5IiwKICAgICAgICAgICAgIjJiZGMyZmFlM2M4N2FjYzZhMTg2MzM2ZjhiMzA2NTUwMmQxYmU3YmNmYWFjMzIxNTdkZmM0OGM0YjRjMWQ3ZjY6ZWJlNjIzODY2YWIzNzJjNTEwMWJhYWY3NjdiMjgxZGU3MTAwYjkzNDI2OTZiY2M4MmZmNGYwNjFmNGIxNTk2NjoyMTNmODQwYjEwMDY5MDgwNGE3NmExYTlkM2NlM2MwNTMxMzgxYjBhNzYwNzYyNTgwM2E2Zjg2NzEzNDQxMmRiOjY3NDUwMDgyYWI1NmRhMWFlY2M1ZWFlMmYxOGQ5ODBjZDllNzMwNmU3OTMzNGExYTgyNmE5MWNmZDkwMTE0YTg6MDg1OWU1NTMxZmQ3ZjhiMTcwNzE0MTRhMDgyYWZiNjViMmJlNzAyZWNkYWZhMDA3ZGQwNTc3YWVhODZmODU5MzowNmY4OWMyNzVkYzM0ZjI2YjlkYjBjZjAxMDJiMmE4OTlkZTY1NTUxMDU4NTJkMGFmMmJiOTVmMzc0ZjcxNDRkIgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGNwYXRoKS8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJsb2NhbCIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAibG9jYWwiLAogICAgICAgICAgImZzdHlwZSI6ICJsb2NhbCIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIm1vZGU9MDc3NyIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiXiQoY3BhdGgpLyQoc2FuZGJveC1pZCkvbG9jYWwvcmVzdWx0cyQiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0KICAgICAgXSwKICAgICAgImRldmljZXMiOiBbXSwKICAgICAgInNhbmRib3hfcGlkbnMiOiBmYWxzZSwKICAgICAgImV4ZWNfY29tbWFuZHMiOiBbXSwKICAgICAgImVudl9tYXAiOiB7CiAgICAgICAgIkhPU1ROQU1FIjogIiQoaG9zdC1uYW1lKSIsCiAgICAgICAgIlBBVEgiOiAiL3Vzci9sb2NhbC9zYmluOi91c3IvbG9jYWwvYmluOi91c3Ivc2JpbjovdXNyL2Jpbjovc2JpbjovYmluIgogICAgICB9CiAgICB9CiAgXSwKICAiY29tbW9uIjogewogICAgImNwYXRoIjogIi9ydW4va2F0YS1jb250YWluZXJzL3NoYXJlZC9jb250YWluZXJzIiwKICAgICJtb3VudF9zb3VyY2VfY3BhdGgiOiAiL3J1bi9rYXRhLWNvbnRhaW5lcnMvc2hhcmVkL2NvbnRhaW5lcnMiLAogICAgInNmcHJlZml4IjogIl4kKGNwYXRoKS8kKGJ1bmRsZS1pZCktW2EtejAtOV17MTZ9LSIsCiAgICAic3BhdGgiOiAiL3J1bi9rYXRhLWNvbnRhaW5lcnMvc2FuZGJveC9zdG9yYWdlIiwKICAgICJpcHY0X2EiOiAiKChbMC05XXxbMS05XVswLTldfDFbMC05XXsyfXwyWzAtNF1bMC05XXwyNVswLTVdKVxcLil7M30oWzAtOV18WzEtOV1bMC05XXwxWzAtOV17Mn18MlswLTRdWzAtOV18MjVbMC01XSkiLAogICAgImlwX3AiOiAiWzAtOV17MSw1fSIsCiAgICAic3ZjX25hbWUiOiAiW0EtWl9cXC5cXC1dKyIsCiAgICAiZG5zX2xhYmVsIjogIlthLXpBLVowLTlfXFwuXFwtXSsiLAogICAgInNfc291cmNlMSI6ICJeLi4yWzAtOV17M31fWzAtMV1bMC05XV9bMC0zXVswLTldX1swLTJdWzAtOV1fWzAtNV1bMC05XV9bMC01XVswLTldXFwuWzAtOV17MSwxMH0kIiwKICAgICJzX3NvdXJjZTIiOiAiXi4uZGF0YS8iLAogICAgImRuc19zdWJkb21haW4iOiAiXlthLXowLTldKFstYS16MC05XSpbYS16MC05XSk/JCIsCiAgICAicG9kX3VpZCI6ICJeWzAtOWEtZkEtRl17OH0tWzAtOWEtZkEtRl17NH0tWzAtOWEtZkEtRl17NH0tWzAtOWEtZkEtRl17NH0tWzAtOWEtZkEtRl17MTJ9JCIsCiAgICAiZGVmYXVsdF9jYXBzIjogWwogICAgICAiQ0FQX0NIT1dOIiwKICAgICAgIkNBUF9EQUNfT1ZFUlJJREUiLAogICAgICAiQ0FQX0ZTRVRJRCIsCiAgICAgICJDQVBfRk9XTkVSIiwKICAgICAgIkNBUF9NS05PRCIsCiAgICAgICJDQVBfTkVUX1JBVyIsCiAgICAgICJDQVBfU0VUR0lEIiwKICAgICAgIkNBUF9TRVRVSUQiLAogICAgICAiQ0FQX1NFVEZDQVAiLAogICAgICAiQ0FQX1NFVFBDQVAiLAogICAgICAiQ0FQX05FVF9CSU5EX1NFUlZJQ0UiLAogICAgICAiQ0FQX1NZU19DSFJPT1QiLAogICAgICAiQ0FQX0tJTEwiLAogICAgICAiQ0FQX0FVRElUX1dSSVRFIgogICAgXSwKICAgICJwcml2aWxlZ2VkX2NhcHMiOiBbCiAgICAgICJDQVBfQ0hPV04iLAogICAgICAiQ0FQX0RBQ19PVkVSUklERSIsCiAgICAgICJDQVBfREFDX1JFQURfU0VBUkNIIiwKICAgICAgIkNBUF9GT1dORVIiLAogICAgICAiQ0FQX0ZTRVRJRCIsCiAgICAgICJDQVBfS0lMTCIsCiAgICAgICJDQVBfU0VUR0lEIiwKICAgICAgIkNBUF9TRVRVSUQiLAogICAgICAiQ0FQX1NFVFBDQVAiLAogICAgICAiQ0FQX0xJTlVYX0lNTVVUQUJMRSIsCiAgICAgICJDQVBfTkVUX0JJTkRfU0VSVklDRSIsCiAgICAgICJDQVBfTkVUX0JST0FEQ0FTVCIsCiAgICAgICJDQVBfTkVUX0FETUlOIiwKICAgICAgIkNBUF9ORVRfUkFXIiwKICAgICAgIkNBUF9JUENfTE9DSyIsCiAgICAgICJDQVBfSVBDX09XTkVSIiwKICAgICAgIkNBUF9TWVNfTU9EVUxFIiwKICAgICAgIkNBUF9TWVNfUkFXSU8iLAogICAgICAiQ0FQX1NZU19DSFJPT1QiLAogICAgICAiQ0FQX1NZU19QVFJBQ0UiLAogICAgICAiQ0FQX1NZU19QQUNDVCIsCiAgICAgICJDQVBfU1lTX0FETUlOIiwKICAgICAgIkNBUF9TWVNfQk9PVCIsCiAgICAgICJDQVBfU1lTX05JQ0UiLAogICAgICAiQ0FQX1NZU19SRVNPVVJDRSIsCiAgICAgICJDQVBfU1lTX1RJTUUiLAogICAgICAiQ0FQX1NZU19UVFlfQ09ORklHIiwKICAgICAgIkNBUF9NS05PRCIsCiAgICAgICJDQVBfTEVBU0UiLAogICAgICAiQ0FQX0FVRElUX1dSSVRFIiwKICAgICAgIkNBUF9BVURJVF9DT05UUk9MIiwKICAgICAgIkNBUF9TRVRGQ0FQIiwKICAgICAgIkNBUF9NQUNfT1ZFUlJJREUiLAogICAgICAiQ0FQX01BQ19BRE1JTiIsCiAgICAgICJDQVBfU1lTTE9HIiwKICAgICAgIkNBUF9XQUtFX0FMQVJNIiwKICAgICAgIkNBUF9CTE9DS19TVVNQRU5EIiwKICAgICAgIkNBUF9BVURJVF9SRUFEIiwKICAgICAgIkNBUF9QRVJGTU9OIiwKICAgICAgIkNBUF9CUEYiLAogICAgICAiQ0FQX0NIRUNLUE9JTlRfUkVTVE9SRSIKICAgIF0sCiAgICAidmlydGlvX2Jsa19zdG9yYWdlX2NsYXNzZXMiOiBbCiAgICAgICJjYy1sb2NhbC1jc2kiLAogICAgICAiY2MtbWFuYWdlZC1jc2kiLAogICAgICAiY2MtbWFuYWdlZC1wcmVtaXVtLWNzaSIKICAgIF0sCiAgICAic21iX3N0b3JhZ2VfY2xhc3NlcyI6IFsKICAgICAgewogICAgICAgICJuYW1lIjogImF6dXJlZmlsZS1jc2kta2F0YS1jYyIsCiAgICAgICAgIm1vdW50X29wdGlvbnMiOiBbCiAgICAgICAgICAiZGlyX21vZGU9MDc3NyIsCiAgICAgICAgICAiZmlsZV9tb2RlPTA3NzciLAogICAgICAgICAgIm1mc3ltbGlua3MiLAogICAgICAgICAgImNhY2hlPXN0cmljdCIsCiAgICAgICAgICAibm9zaGFyZXNvY2siLAogICAgICAgICAgImFjdGltZW89MzAiLAogICAgICAgICAgIm5vYnJsIgogICAgICAgIF0KICAgICAgfQogICAgXQogIH0sCiAgInNhbmRib3giOiB7CiAgICAic3RvcmFnZXMiOiBbCiAgICAgIHsKICAgICAgICAiZHJpdmVyIjogImVwaGVtZXJhbCIsCiAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgInNvdXJjZSI6ICJzaG0iLAogICAgICAgICJmc3R5cGUiOiAidG1wZnMiLAogICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICJub2RldiIsCiAgICAgICAgICAibW9kZT0xNzc3IiwKICAgICAgICAgICJzaXplPTY3MTA4ODY0IgogICAgICAgIF0sCiAgICAgICAgIm1vdW50X3BvaW50IjogIi9ydW4va2F0YS1jb250YWluZXJzL3NhbmRib3gvc2htIiwKICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgIH0KICAgIF0KICB9LAogICJyZXF1ZXN0X2RlZmF1bHRzIjogewogICAgIkNyZWF0ZUNvbnRhaW5lclJlcXVlc3QiOiB7CiAgICAgICJhbGxvd19lbnZfcmVnZXgiOiBbCiAgICAgICAgIl5IT1NUTkFNRT0kKGRuc19sYWJlbCkkIiwKICAgICAgICAiXiQoc3ZjX25hbWUpX1BPUlRfJChpcF9wKV9UQ1A9dGNwOi8vJChpcHY0X2EpOiQoaXBfcCkkIiwKICAgICAgICAiXiQoc3ZjX25hbWUpX1BPUlRfJChpcF9wKV9UQ1BfUFJPVE89dGNwJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9QT1JUXyQoaXBfcClfVENQX1BPUlQ9JChpcF9wKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfUE9SVF8kKGlwX3ApX1RDUF9BRERSPSQoaXB2NF9hKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfU0VSVklDRV9IT1NUPSQoaXB2NF9hKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfU0VSVklDRV9QT1JUPSQoaXBfcCkkIiwKICAgICAgICAiXiQoc3ZjX25hbWUpX1NFUlZJQ0VfUE9SVF8kKGRuc19sYWJlbCk9JChpcF9wKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfUE9SVD10Y3A6Ly8kKGlwdjRfYSk6JChpcF9wKSQiLAogICAgICAgICJeQVpVUkVfQ0xJRU5UX0lEPVtBLUZhLWYwLTktXSokIiwKICAgICAgICAiXkFaVVJFX1RFTkFOVF9JRD1bQS1GYS1mMC05LV0qJCIsCiAgICAgICAgIl5BWlVSRV9GRURFUkFURURfVE9LRU5fRklMRT0vdmFyL3J1bi9zZWNyZXRzL2F6dXJlL3Rva2Vucy9henVyZS1pZGVudGl0eS10b2tlbiQiLAogICAgICAgICJeQVpVUkVfQVVUSE9SSVRZX0hPU1Q9aHR0cHM6Ly9sb2dpblxcLm1pY3Jvc29mdG9ubGluZVxcLmNvbS8kIiwKICAgICAgICAiXlRFUk09eHRlcm0kIgogICAgICBdLAogICAgICAiYWxsb3dfZW52X3JlZ2V4X21hcCI6IHsKICAgICAgICAiQ1BVX0xJTUlUIjogIl5bMC05XSskIiwKICAgICAgICAiSk9CX0NPTVBMRVRJT05fSU5ERVgiOiAiXlswLTldKiQiLAogICAgICAgICJNRU1PUllfTElNSVQiOiAiXlswLTldKyQiCiAgICAgIH0KICAgIH0sCiAgICAiQ29weUZpbGVSZXF1ZXN0IjogWwogICAgICAiJChzZnByZWZpeCkiCiAgICBdLAogICAgIkV4ZWNQcm9jZXNzUmVxdWVzdCI6IHsKICAgICAgImFsbG93ZWRfY29tbWFuZHMiOiBbXSwKICAgICAgInJlZ2V4IjogW10KICAgIH0sCiAgICAiVXBkYXRlUm91dGVzUmVxdWVzdCI6IHsKICAgICAgImZvcmJpZGRlbl9kZXZpY2VfbmFtZXMiOiBbCiAgICAgICAgImxvIgogICAgICBdLAogICAgICAiZm9yYmlkZGVuX3NvdXJjZV9yZWdleCI6IFsKICAgICAgICAiXig/OjB7MCw0fTopezAsN30wezAsM30xJCIsCiAgICAgICAgIl4xMjdcXC4oPzpbMC05XXsxLDN9XFwuKXsyfVswLTldezEsM30kIgogICAgICBdCiAgICB9LAogICAgIlVwZGF0ZUludGVyZmFjZVJlcXVlc3QiOiB7CiAgICAgICJhbGxvd19yYXdfZmxhZ3MiOiAxMjgsCiAgICAgICJmb3JiaWRkZW5fbmFtZXMiOiBbCiAgICAgICAgImxvIgogICAgICBdLAogICAgICAiZm9yYmlkZGVuX2h3X2FkZHJzIjogWwogICAgICAgICIwMDowMDowMDowMDowMDowMCIKICAgICAgXQogICAgfSwKICAgICJDbG9zZVN0ZGluUmVxdWVzdCI6IGZhbHNlLAogICAgIlJlYWRTdHJlYW1SZXF1ZXN0IjogZmFsc2UsCiAgICAiVXBkYXRlRXBoZW1lcmFsTW91bnRzUmVxdWVzdCI6IGZhbHNlLAogICAgIldyaXRlU3RyZWFtUmVxdWVzdCI6IGZhbHNlCiAgfQp9 +spec: + containers: + - args: + - test-webserver + image: "registry.k8s.io/e2e-test-images/agnhost:2.43" + imagePullPolicy: IfNotPresent + name: webserver + resources: {} + securityContext: {} + terminationMessagePath: /dev/termination-log + terminationMessagePolicy: File + volumeMounts: + - mountPath: /results + name: results + - mountPath: /var/run/secrets/kubernetes.io/serviceaccount + name: kube-api-access-5p7k8 + readOnly: true + - args: + - "for i in `seq 1 600`; do check=\"$$(dig +notcp +noall +answer +search kubernetes.default.svc.cluster.local A)\" && test -n \"$$check\" && echo OK > /results/wheezy_udp@kubernetes.default.svc.cluster.local;check=\"$$(dig +tcp +noall +answer +search kubernetes.default.svc.cluster.local A)\" && test -n \"$$check\" && echo OK > /results/wheezy_tcp@kubernetes.default.svc.cluster.local;sleep 1; done" + command: + - sh + - "-c" + image: "registry.k8s.io/e2e-test-images/agnhost:2.43" + imagePullPolicy: IfNotPresent + name: querier + resources: {} + securityContext: {} + terminationMessagePath: /dev/termination-log + terminationMessagePolicy: File + volumeMounts: + - mountPath: /results + name: results + - mountPath: /var/run/secrets/kubernetes.io/serviceaccount + name: kube-api-access-5p7k8 + readOnly: true + - command: + - sh + - "-c" + - "for i in `seq 1 600`; do check=\"$$(dig +notcp +noall +answer +search kubernetes.default.svc.cluster.local A)\" && test -n \"$$check\" && echo OK > /results/jessie_udp@kubernetes.default.svc.cluster.local;check=\"$$(dig +tcp +noall +answer +search kubernetes.default.svc.cluster.local A)\" && test -n \"$$check\" && echo OK > /results/jessie_tcp@kubernetes.default.svc.cluster.local;sleep 1; done" + image: "registry.k8s.io/e2e-test-images/jessie-dnsutils:1.7" + imagePullPolicy: IfNotPresent + name: jessie-querier + resources: {} + terminationMessagePath: /dev/termination-log + terminationMessagePolicy: File + volumeMounts: + - mountPath: /results + name: results + - mountPath: /var/run/secrets/kubernetes.io/serviceaccount + name: kube-api-access-5p7k8 + readOnly: true + dnsPolicy: ClusterFirst + enableServiceLinks: true + hostname: dns-querier-1 + nodeSelector: + katacontainers.io/kata-runtime: "true" + preemptionPolicy: PreemptLowerPriority + priority: 0 + restartPolicy: Always + runtimeClassName: kata-cc + schedulerName: default-scheduler + securityContext: {} + serviceAccount: default + serviceAccountName: default + subdomain: dns-test-service + terminationGracePeriodSeconds: 0 + tolerations: + - effect: NoExecute + key: node.kubernetes.io/not-ready + operator: Exists + tolerationSeconds: 300 + - effect: NoExecute + key: node.kubernetes.io/unreachable + operator: Exists + tolerationSeconds: 300 + volumes: + - emptyDir: {} + name: results + - name: kube-api-access-5p7k8 + projected: + defaultMode: 420 + sources: + - serviceAccountToken: + expirationSeconds: 3607 + path: token + - configMap: + items: + - key: ca.crt + path: ca.crt + name: kube-root-ca.crt + - downwardAPI: + items: + - fieldRef: + apiVersion: v1 + fieldPath: metadata.namespace + path: namespace +status: + conditions: + - lastProbeTime: ~ + lastTransitionTime: "2023-09-18T23:08:02Z" + status: "True" + type: Initialized + - lastProbeTime: ~ + lastTransitionTime: "2023-09-18T23:08:02Z" + message: "containers with unready status: [webserver querier jessie-querier]" + reason: ContainersNotReady + status: "False" + type: Ready + - lastProbeTime: ~ + lastTransitionTime: "2023-09-18T23:08:02Z" + message: "containers with unready status: [webserver querier jessie-querier]" + reason: ContainersNotReady + status: "False" + type: ContainersReady + - lastProbeTime: ~ + lastTransitionTime: "2023-09-18T23:08:02Z" + status: "True" + type: PodScheduled + containerStatuses: + - image: "registry.k8s.io/e2e-test-images/jessie-dnsutils:1.7" + imageID: "" + lastState: {} + name: jessie-querier + ready: false + restartCount: 0 + started: false + state: + waiting: + reason: ContainerCreating + - image: "registry.k8s.io/e2e-test-images/agnhost:2.43" + imageID: "" + lastState: {} + name: querier + ready: false + restartCount: 0 + started: false + state: + waiting: + reason: ContainerCreating + - image: "registry.k8s.io/e2e-test-images/agnhost:2.43" + imageID: "" + lastState: {} + name: webserver + ready: false + restartCount: 0 + started: false + state: + waiting: + reason: ContainerCreating + hostIP: 10.224.0.5 + phase: Pending + qosClass: BestEffort + startTime: "2023-09-18T23:08:02Z" diff --git a/src/agent/samples/policy/yaml/webhook3/many-layers.yaml b/src/agent/samples/policy/yaml/webhook3/many-layers.yaml new file mode 100644 index 000000000000..f5e04410691b --- /dev/null +++ b/src/agent/samples/policy/yaml/webhook3/many-layers.yaml @@ -0,0 +1,174 @@ +--- +apiVersion: v1 +kind: Namespace +metadata: + name: dns-1370 +--- +apiVersion: v1 +kind: List +items: + - apiVersion: v1 + kind: Pod + metadata: + creationTimestamp: "2023-09-22T17:18:29Z" + labels: + dns-test: "true" + name: dns-test-a848653a-5c17-485b-be46-faa0c0da1192 + namespace: dns-1370 + resourceVersion: "960453" + uid: 94b93dae-74fc-4a7b-86a0-b4fac8402481 + annotations: + io.katacontainers.config.agent.policy: IyBDb3B5cmlnaHQgKGMpIDIwMjMgTWljcm9zb2Z0IENvcnBvcmF0aW9uCiMKIyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMAojCnBhY2thZ2UgYWdlbnRfcG9saWN5CgppbXBvcnQgZnV0dXJlLmtleXdvcmRzLmluCmltcG9ydCBmdXR1cmUua2V5d29yZHMuZXZlcnkKCiMgRGVmYXVsdCB2YWx1ZXMsIHJldHVybmVkIGJ5IE9QQSB3aGVuIHJ1bGVzIGNhbm5vdCBiZSBldmFsdWF0ZWQgdG8gdHJ1ZS4KZGVmYXVsdCBBZGRBUlBOZWlnaGJvcnNSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgQWRkU3dhcFJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBDbG9zZVN0ZGluUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IENvcHlGaWxlUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IENyZWF0ZUNvbnRhaW5lclJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBDcmVhdGVTYW5kYm94UmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IERlc3Ryb3lTYW5kYm94UmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgRXhlY1Byb2Nlc3NSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgR2V0T09NRXZlbnRSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBHdWVzdERldGFpbHNSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBMaXN0SW50ZXJmYWNlc1JlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBMaXN0Um91dGVzUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IE1lbUhvdHBsdWdCeVByb2JlUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IE9ubGluZUNQVU1lbVJlcXVlc3QgOj0gdHJ1ZQpkZWZhdWx0IFBhdXNlQ29udGFpbmVyUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFJlYWRTdHJlYW1SZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgUmVtb3ZlQ29udGFpbmVyUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgUmVtb3ZlU3RhbGVWaXJ0aW9mc1NoYXJlTW91bnRzUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgUmVzZWVkUmFuZG9tRGV2UmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFJlc3VtZUNvbnRhaW5lclJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBTZXRHdWVzdERhdGVUaW1lUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFNldFBvbGljeVJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBTaWduYWxQcm9jZXNzUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgU3RhcnRDb250YWluZXJSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBTdGFydFRyYWNpbmdSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgU3RhdHNDb250YWluZXJSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBTdG9wVHJhY2luZ1JlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBUdHlXaW5SZXNpemVSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBVcGRhdGVDb250YWluZXJSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgVXBkYXRlRXBoZW1lcmFsTW91bnRzUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFVwZGF0ZUludGVyZmFjZVJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBVcGRhdGVSb3V0ZXNSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgV2FpdFByb2Nlc3NSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBXcml0ZVN0cmVhbVJlcXVlc3QgOj0gZmFsc2UKCiMgQWxsb3dSZXF1ZXN0c0ZhaWxpbmdQb2xpY3kgOj0gdHJ1ZSBjb25maWd1cmVzIHRoZSBBZ2VudCB0byAqYWxsb3cgYW55CiMgcmVxdWVzdHMgY2F1c2luZyBhIHBvbGljeSBmYWlsdXJlKi4gVGhpcyBpcyBhbiB1bnNlY3VyZSBjb25maWd1cmF0aW9uCiMgYnV0IGlzIHVzZWZ1bCBmb3IgYWxsb3dpbmcgdW5zZWN1cmUgcG9kcyB0byBzdGFydCwgdGhlbiBjb25uZWN0IHRvCiMgdGhlbSBhbmQgaW5zcGVjdCBPUEEgbG9ncyBmb3IgdGhlIHJvb3QgY2F1c2Ugb2YgYSBmYWlsdXJlLgpkZWZhdWx0IEFsbG93UmVxdWVzdHNGYWlsaW5nUG9saWN5IDo9IGZhbHNlCgojIENvbnN0YW50cwpTX05BTUVfS0VZID0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZSIKU19OQU1FU1BBQ0VfS0VZID0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZXNwYWNlIgpCVU5ETEVfSUQgPSAiW2EtejAtOV17NjR9IgoKQ3JlYXRlQ29udGFpbmVyUmVxdWVzdDo9IHJlc3AgewogICAgbm90IGlzX251bGwoaW5wdXQuZW52X21hcCkKICAgIAogICAgaV9lbnZfbWFwIDo9IGlucHV0LmVudl9tYXAKICAgIAogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBwX2Vudl9tYXAgOj0gcF9jb250YWluZXIuZW52X21hcCAgCiAgICBhbGxvd19lbnZfbWFwKHBfZW52X21hcCwgaV9lbnZfbWFwKQogICAgCiAgICBpX3Byb2Nlc3MgOj0gaW5wdXQuYmFzZS5PQ0kuUHJvY2VzcwogICAgCiAgICBwX3Byb2Nlc3MgOj0gcF9jb250YWluZXIuT0NJLlByb2Nlc3MKICAgIAogICAgYWxsb3dfYXJncyhpX3Byb2Nlc3MsIHBfcHJvY2VzcywgaV9lbnZfbWFwKQoKICAgIHJlc3AgPSBDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uKGlucHV0LmJhc2UpCiAgICBwcmludCgiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdDogdHJ1ZSIpCn0KCmFsbG93X2FyZ3MoaV9wcm9jZXNzLCBwX3Byb2Nlc3MsIGlfZW52X21hcCkgewogICAgaV9hcmdzIDo9IGlfcHJvY2Vzcy5BcmdzCiAgICBwX2FyZ3MgOj0gcF9wcm9jZXNzLkFyZ3MKICAgIHByaW50KCJhbGxvd19hcmdzOiBpX2FyZ3MgPSIsIGlfYXJncywgInBfYXJncyA9IiwgcF9hcmdzKQogICAgY291bnQoaV9hcmdzKSA9PSBjb3VudChwX2FyZ3MpCiAgICBldmVyeSBpLCBpX2FyZyBpbiBpX2FyZ3MgewogICAgICAgIHByaW50KCJhbGxvd19hcmdzOiBpX2FyZyA9IiwgaV9hcmcpCiAgICAgICAgcF9hcmdfcmVwbGFjZWQgOj0gcmVwbGFjZV9lbnZfdmFyaWFibGVzKHBfYXJnc1tpXSwgaV9lbnZfbWFwKQogICAgICAgIHByaW50KCJhbGxvd19hcmdzOiBwX2FyZ19yZXBsYWNlZCA9IiwgcF9hcmdfcmVwbGFjZWQpCiAgICAgICAgcF9hcmdfcmVwbGFjZWQyIDo9IHJlcGxhY2UocF9hcmdfcmVwbGFjZWQsICIkJCIsICIkIikKICAgICAgICBwcmludCgiYWxsb3dfYXJnczogcF9hcmdfcmVwbGFjZWQyID0iLCBwX2FyZ19yZXBsYWNlZDIpCiAgICAgICAgaV9hcmcgPT0gcF9hcmdfcmVwbGFjZWQyCiAgICB9CiAgICBwcmludCgiYWxsb3dfYXJnczogdHJ1ZSIpCn0KCmFsbG93X2FyZ3MoaV9wcm9jZXNzLCBwX3Byb2Nlc3MsIGlfZW52X21hcCkgewogICAgbm90IGlfcHJvY2Vzcy5BcmdzCiAgICBub3QgcF9wcm9jZXNzLkFyZ3MKICAgIHByaW50KCJhbGxvd19hcmdzMjogbm8gYXJncyIpCn0KCiMgdGhpcyBmdW5jdGlvbiByZXBsYWNlcyBhbGwgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyBpbiBhIHN0cmluZywgZ2l2ZW4gYSBtYXAgb2YgZW52aXJvbm1lbnQga2V5cyB0byBlbnZpcm9ubWVudCB2YWx1ZXMKIyBlZyBzdHIgPSAiZWNobyAkKENMVVNURVJfSUQpOyBlY2hvICQoTk9ERV9OQU1FKTsiCiMgZW52X21hcCA9IHsiQ0xVU1RFUl9JRCI6ICJhYmMiLCAiTk9ERV9OQU1FIiA6ICJ4eXoifQojIHJlc3VsdCA9ICJlY2hvIGFiYzsgZWNobyB4eXo7IgpyZXBsYWNlX2Vudl92YXJpYWJsZXMoc3RyLCBlbnZfbWFwKSA9IHJlc3VsdCB7CiAgICAjIG1ha2UgYW4gYXJyYXkgb2YgdGhlIGtleXMgZWcgWyJDTFVTVEVSX0lEIiwgIk5PREVfTkFNRSJdCiAgICBrZXlzIDo9IFt4IHwgc29tZSB4IGluIG9iamVjdC5rZXlzKGVudl9tYXApXQogICAgcmVzdWx0IDo9IHJlcGxhY2Vfc3RyX3JlYyhzdHIsIGVudl9tYXAsIGtleXMsIGNvdW50KGtleXMpIC0gMSkKfQoKIyBiYXNlIGNhc2UKcmVwbGFjZV9zdHJfcmVjKHN0ciwgZW52X21hcCwgYXJyX2tleXMsIGkpID0gcmVzdWx0IHsKICAgIGkgPCAwCiAgICByZXN1bHQgOj0gc3RyCn0KCiMgcmVjdXJzaXZlIHN0ZXAKcmVwbGFjZV9zdHJfcmVjKHN0ciwgZW52X21hcCwgYXJyX2tleXMsIGkpID0gcmVzdWx0IHsKICAgIGkgPj0gMAogICAga2V5IDo9IGFycl9rZXlzW2ldCiAgICBlbnZfa2V5MSA6PSBjb25jYXQoIiIsIFsiJCgiLCBrZXksICIpIl0pCiAgICAjIHJlcGxhY2UgJChWQVIpIHdpdGggdmFsdWUKICAgIG5ld19zdHIxIDo9IHJlcGxhY2Uoc3RyLCBlbnZfa2V5MSwgZW52X21hcFtrZXldKQogICAgIyByZXBsYWNlIG5leHQgZW52aXJvbm1lbnQgdmFyaWFibGUKICAgIHJlc3VsdCA9IHJlcGxhY2Vfc3RyX3JlYyhuZXdfc3RyMSwgZW52X21hcCwgYXJyX2tleXMsIGkgLSAxKQp9CgphbGxvd19lbnZfbWFwKHBfZW52X21hcCwgaV9lbnZfbWFwKSB7CiAgICBwcmludCgiYWxsb3dfZW52X21hcDogcF9lbnZfbWFwID0iLCBwX2Vudl9tYXApCiAgICBldmVyeSBlbnZfa2V5LCBlbnZfdmFsIGluIGlfZW52X21hcCB7CiAgICAgICAgcHJpbnQoImFsbG93X2VudjogZW52X2tleSA9IiwgZW52X2tleSwgImVudl92YWwgPSIsIGVudl92YWwpCiAgICAgICAgYWxsb3dfZW52X21hcF9lbnRyeShlbnZfa2V5LCBlbnZfdmFsLCBwX2Vudl9tYXApCiAgICB9CiAgICBwcmludCgiYWxsb3dfZW52X21hcDogdHJ1ZSIpCn0KCiMgQWxsb3cgZXhhY3QgbWF0Y2gKYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBpX3ZhbCA9PSBwX3ZhbAogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnk6IHRydWUiKQp9CgojIEFsbG93IHJlc291cmNlRmllbGRSZWYgdmFsdWVzIChlLmcuLCAibGltaXRzLmNwdSIpLgphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgICMgYSB2YXJpYWJsZSB3ZSBzaG91bGQgYmUgdmFsaWRhdGluZyB1c2luZyBhIHJlZ2V4IGZyb20gc2V0dGluZ3MKICAgIHBfdmFsID09ICIkKHZhbGlkYXRlLWZyb20tc2V0dGluZ3MpIgogICAgcmVnZXhfdmFsIDo9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuQ3JlYXRlQ29udGFpbmVyUmVxdWVzdC5hbGxvd19lbnZfcmVnZXhfbWFwW2tleV0KICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4X3ZhbCwgaV92YWwpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSAyOiB0cnVlIikKfQoKIyBBbGxvdyBub2RlLW5hbWUKYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChub2RlLW5hbWUpIgogICAgcmVnZXgubWF0Y2gocG9saWN5X2RhdGEuY29tbW9uLmRuc19zdWJkb21haW4gLCBpX3ZhbCkKICAgIHByaW50KCJhbGxvd19lbnZfbWFwX2VudHJ5IDM6IHRydWUiKQp9CgojIEFsbG93IGhvc3QtbmFtZQphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgIHBfdmFsID09ICIkKGhvc3QtbmFtZSkiCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24uZG5zX2xhYmVsICwgaV92YWwpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSA0OiB0cnVlIikKfQoKIyBBbGxvdyBwb2QtdWlkCmFsbG93X2Vudl9tYXBfZW50cnkoa2V5LCBpX3ZhbCwgcF9lbnZfbWFwKSB7CiAgICBwX3ZhbCA6PSBwX2Vudl9tYXBba2V5XQogICAgcF92YWwgPT0gIiQocG9kLXVpZCkiCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24ucG9kX3VpZCAsIGlfdmFsKQogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgNTogdHJ1ZSIpCn0KCiMgQWxsb3cgZmllbGRSZWYgImZpZWxkUGF0aDogc3RhdHVzLnBvZElQIiB2YWx1ZXMuCmFsbG93X2Vudl9tYXBfZW50cnkoa2V5LCBpX3ZhbCwgcF9lbnZfbWFwKSB7CiAgICBpc19pcChpX3ZhbCkKCiAgICBwX3ZhbCA6PSBwX2Vudl9tYXBba2V5XQogICAgcF92YXIgOj0gY29uY2F0KCI9IiwgW2tleSwgcF92YWxdKQogICAgYWxsb3dfcG9kX2lwX3ZhcihrZXksIHBfdmFyKQogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgNjogdHJ1ZSIpCn0KCiMgQWxsb3cgZmllbGRSZWYgImZpZWxkUGF0aDogc3RhdHVzLmhvc3RJUCIgdmFsdWVzLgphbGxvd19lbnZfbWFwX2VudHJ5KGtleSwgaV92YWwsIHBfZW52X21hcCkgewogICAgaXNfaXAoaV92YWwpCgogICAgcF92YWwgOj0gcF9lbnZfbWFwW2tleV0KICAgIHBfdmFyIDo9IGNvbmNhdCgiPSIsIFtrZXksIHBfdmFsXSkKICAgIGFsbG93X2hvc3RfaXBfdmFyKGtleSwgcF92YXIpCiAgICBwcmludCgiYWxsb3dfZW52X21hcF9lbnRyeSA3OiB0cnVlIikKfQoKIyBNYXRjaCBpbnB1dCB3aXRoIG9uZSBvZiB0aGUgcG9saWN5IHZhcmlhYmxlcywgYWZ0ZXIgc3Vic3RpdHV0aW5nICQoc2FuZGJveC1uYW1lKS4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChzYW5kYm94LW5hbWUpIgogICAgc19uYW1lIDo9IGlucHV0LmJhc2UuT0NJLkFubm90YXRpb25zW1NfTkFNRV9LRVldCiAgICBwX3ZhcjIgOj0gcmVwbGFjZShwX3ZhbCwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHBfdmFyMiA9PSBpX3ZhbAogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgODogdHJ1ZSIpCn0KCiMgTWF0Y2ggaW5wdXQgd2l0aCBvbmUgb2YgdGhlIHBvbGljeSB2YXJpYWJsZXMsIGFmdGVyIHN1YnN0aXR1dGluZyAkKHNhbmRib3gtbmFtZXNwYWNlKS4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHBfdmFsIDo9IHBfZW52X21hcFtrZXldCiAgICBwX3ZhbCA9PSAiJChzYW5kYm94LW5hbWVzcGFjZSkiCiAgICBzX25hbWVzcGFjZSA6PSBpbnB1dC5iYXNlLk9DSS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwX3ZhcjIgOj0gcmVwbGFjZShwX3ZhbCwgIiQoc2FuZGJveC1uYW1lc3BhY2UpIiwgc19uYW1lc3BhY2UpCiAgICBwX3ZhcjIgPT0gaV92YWwKICAgIHByaW50KCJhbGxvd19lbnZfbWFwX2VudHJ5IDk6IHRydWUiKQp9CgojIEFsbG93IGlucHV0IGVudiB2YXJpYWJsZXMgdGhhdCBtYXRjaCB3aXRoIGEgcmVxdWVzdF9kZWZhdWx0cyByZWdleC4KYWxsb3dfZW52X21hcF9lbnRyeShrZXksIGlfdmFsLCBwX2Vudl9tYXApIHsKICAgIHNvbWUgcF9yZWdleDEgaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5DcmVhdGVDb250YWluZXJSZXF1ZXN0LmFsbG93X2Vudl9yZWdleAogICAgcF9yZWdleDIgOj0gcmVwbGFjZShwX3JlZ2V4MSwgIiQoaXB2NF9hKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcHY0X2EpCiAgICBwX3JlZ2V4MyA6PSByZXBsYWNlKHBfcmVnZXgyLCAiJChpcF9wKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcF9wKQogICAgcF9yZWdleDQgOj0gcmVwbGFjZShwX3JlZ2V4MywgIiQoc3ZjX25hbWUpIiwgcG9saWN5X2RhdGEuY29tbW9uLnN2Y19uYW1lKQogICAgcF9yZWdleDUgOj0gcmVwbGFjZShwX3JlZ2V4NCwgIiQoZG5zX2xhYmVsKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5kbnNfbGFiZWwpCgogICAgcmVzdWx0IDo9IGNvbmNhdCgiPSIsIFtrZXksIGlfdmFsXSkKICAgIHJlZ2V4Lm1hdGNoKHBfcmVnZXg1LCByZXN1bHQpCgogICAgcHJpbnQoImFsbG93X2Vudl9tYXBfZW50cnkgMTA6IHRydWUiKQp9CgpDcmVhdGVDb250YWluZXJSZXF1ZXN0Oj0gcmVzcCB7CiAgICBub3QgaW5wdXQuZW52X21hcAogICAgaV9wcm9jZXNzID0gaW5wdXQuT0NJLlByb2Nlc3MKICAgIHNfbmFtZSA9IGlucHV0Lk9DSS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBwX3Byb2Nlc3MgPSBwX2NvbnRhaW5lci5PQ0kuUHJvY2VzcwogICAgYWxsb3dfZGVwcmVjYXRlZF9hcmdzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUpCiAgICByZXNwID0gQ3JlYXRlQ29udGFpbmVyUmVxdWVzdENvbW1vbihpbnB1dCkKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0MjogdHJ1ZSIpCn0KCkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb24ocmVxKTo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgICMgQ2hlY2sgaWYgdGhlIGlucHV0IHJlcXVlc3Qgc2hvdWxkIGJlIHJlamVjdGVkIGV2ZW4gYmVmb3JlIGNoZWNraW5nIHRoZQogICAgIyBwb2xpY3lfZGF0YS5jb250YWluZXJzIGluZm9ybWF0aW9uLgogICAgYWxsb3dfY3JlYXRlX2NvbnRhaW5lcl9pbnB1dChyZXEpCgogICAgaV9vY2kgOj0gcmVxLk9DSQogICAgaV9zdG9yYWdlcyA6PSByZXEuc3RvcmFnZXMKICAgIGlfZGV2aWNlcyA6PSByZXEuZGV2aWNlcwoKICAgICMgYXJyYXkgb2YgcG9zc2libGUgc3RhdGUgb3BlcmF0aW9ucwogICAgb3BzX2J1aWxkZXIgOj0gW10KCiAgICAjIGNoZWNrIHNhbmRib3ggbmFtZQogICAgc2FuZGJveF9uYW1lID0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FX0tFWV0KICAgIGFkZF9zYW5kYm94X25hbWVfdG9fc3RhdGUgOj0gc3RhdGVfYWxsb3dzKCJzYW5kYm94X25hbWUiLCBzYW5kYm94X25hbWUpCiAgICBvcHNfYnVpbGRlcjEgOj0gY29uY2F0X29wX2lmX25vdF9udWxsKG9wc19idWlsZGVyLCBhZGRfc2FuZGJveF9uYW1lX3RvX3N0YXRlKQoKICAgICMgQ2hlY2sgaWYgYW55IGVsZW1lbnQgZnJvbSB0aGUgcG9saWN5X2RhdGEuY29udGFpbmVycyBhcnJheSBhbGxvd3MgdGhlIGlucHV0IHJlcXVlc3QuCiAgICBzb21lIHBfY29udGFpbmVyIGluIHBvbGljeV9kYXRhLmNvbnRhaW5lcnMKICAgIHByaW50KCI9PT09PT09PSBDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiB0cnlpbmcgbmV4dCBwb2xpY3kgY29udGFpbmVyIikKCiAgICBwX3BpZG5zIDo9IHBfY29udGFpbmVyLnNhbmRib3hfcGlkbnMKICAgIGlfcGlkbnMgOj0gcmVxLnNhbmRib3hfcGlkbnMKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiBwX3BpZG5zID0iLCBwX3BpZG5zLCAiaV9waWRucyA9IiwgaV9waWRucykKICAgIHBfcGlkbnMgPT0gaV9waWRucwoKICAgIHBfb2NpIDo9IHBfY29udGFpbmVyLk9DSQoKICAgICMgY2hlY2sgbmFtZXNwYWNlCiAgICBwX25hbWVzcGFjZSA6PSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBpX25hbWVzcGFjZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwcmludCAoIkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb246IHBfbmFtZXNwYWNlID0iLCBwX25hbWVzcGFjZSwgImlfbmFtZXNwYWNlID0iLCBpX25hbWVzcGFjZSkKICAgIGFkZF9uYW1lc3BhY2VfdG9fc3RhdGUgOj0gYWxsb3dfbmFtZXNwYWNlKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkKICAgIG9wc19idWlsZGVyMiA6PSBjb25jYXRfb3BfaWZfbm90X251bGwob3BzX2J1aWxkZXIxLCBhZGRfbmFtZXNwYWNlX3RvX3N0YXRlKQoKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0Q29tbW9uOiBwIFZlcnNpb24gPSIsIHBfb2NpLlZlcnNpb24sICJpIFZlcnNpb24gPSIsIGlfb2NpLlZlcnNpb24pCiAgICBwX29jaS5WZXJzaW9uID09IGlfb2NpLlZlcnNpb24KCiAgICBwcmludCgiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdENvbW1vbjogcCBSZWFkb25seSA9IiwgcF9vY2kuUm9vdC5SZWFkb25seSwgImkgUmVhZG9ubHkgPSIsIGlfb2NpLlJvb3QuUmVhZG9ubHkpCiAgICBwX29jaS5Sb290LlJlYWRvbmx5ID09IGlfb2NpLlJvb3QuUmVhZG9ubHkKCiAgICBhbGxvd19hbm5vKHBfb2NpLCBpX29jaSkKCiAgICBwX3N0b3JhZ2VzIDo9IHBfY29udGFpbmVyLnN0b3JhZ2VzCiAgICBhbGxvd19ieV9hbm5vKHBfb2NpLCBpX29jaSwgcF9zdG9yYWdlcywgaV9zdG9yYWdlcykKCiAgICBwX2RldmljZXMgOj0gcF9jb250YWluZXIuZGV2aWNlcwogICAgYWxsb3dfZGV2aWNlcyhwX2RldmljZXMsIGlfZGV2aWNlcykKCiAgICByZXQgOj0gYWxsb3dfbGludXgob3BzX2J1aWxkZXIyLCBwX29jaSwgaV9vY2kpCiAgICByZXQuYWxsb3dlZAoKICAgIG9wcyA6PSByZXQub3BzCgogICAgcHJpbnQoIkNyZWF0ZUNvbnRhaW5lclJlcXVlc3RDb21tb246IHRydWUiKQp9CgphbGxvd19jcmVhdGVfY29udGFpbmVyX2lucHV0KHJlcSkgewogICAgcHJpbnQoImFsbG93X2NyZWF0ZV9jb250YWluZXJfaW5wdXQ6IGlucHV0ID0iLCByZXEpCgogICAgY291bnQocmVxLnNoYXJlZF9tb3VudHMpID09IDAKICAgIGlzX251bGwocmVxLnN0cmluZ191c2VyKQoKICAgIGlfb2NpIDo9IHJlcS5PQ0kKICAgIGlzX251bGwoaV9vY2kuSG9va3MpCiAgICBpc19udWxsKGlfb2NpLlNvbGFyaXMpCiAgICBpc19udWxsKGlfb2NpLldpbmRvd3MpCgogICAgaV9saW51eCA6PSBpX29jaS5MaW51eAogICAgY291bnQoaV9saW51eC5HSURNYXBwaW5ncykgPT0gMAogICAgY291bnQoaV9saW51eC5Nb3VudExhYmVsKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlJlc291cmNlcy5EZXZpY2VzKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlJvb3Rmc1Byb3BhZ2F0aW9uKSA9PSAwCiAgICBjb3VudChpX2xpbnV4LlVJRE1hcHBpbmdzKSA9PSAwCiAgICBpc19udWxsKGlfbGludXguSW50ZWxSZHQpCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLkJsb2NrSU8pCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLk5ldHdvcmspCiAgICBpc19udWxsKGlfbGludXguUmVzb3VyY2VzLlBpZHMpCiAgICBpc19udWxsKGlfbGludXguU2VjY29tcCkKCiAgICBpX3Byb2Nlc3MgOj0gaV9vY2kuUHJvY2VzcwogICAgY291bnQoaV9wcm9jZXNzLlNlbGludXhMYWJlbCkgPT0gMAogICAgY291bnQoaV9wcm9jZXNzLlVzZXIuVXNlcm5hbWUpID09IDAKCiAgICBwcmludCgiYWxsb3dfY3JlYXRlX2NvbnRhaW5lcl9pbnB1dDogdHJ1ZSIpCn0KCmFsbG93X25hbWVzcGFjZShwX25hbWVzcGFjZSwgaV9uYW1lc3BhY2UpID0gYWRkX25hbWVzcGFjZSB7CiAgICBwX25hbWVzcGFjZSA9PSBpX25hbWVzcGFjZQogICAgYWRkX25hbWVzcGFjZSA6PSBudWxsCiAgICBwcmludCgiYWxsb3dfbmFtZXNwYWNlIDE6IGlucHV0IG5hbWVzcGFjZSBtYXRjaGVzIHBvbGljeSBkYXRhIikKfQoKYWxsb3dfbmFtZXNwYWNlKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkgPSBhZGRfbmFtZXNwYWNlIHsKICAgIHBfbmFtZXNwYWNlID09ICIiCiAgICBwcmludCgiYWxsb3dfbmFtZXNwYWNlIDI6IG5vIG5hbWVzcGFjZSBmb3VuZCBvbiBwb2xpY3kgZGF0YSIpCiAgICBhZGRfbmFtZXNwYWNlIDo9IHN0YXRlX2FsbG93cygibmFtZXNwYWNlIiwgaV9uYW1lc3BhY2UpCn0KCiMgdmFsdWUgaGFzbid0IGJlZW4gc2VlbiBiZWZvcmUsIHNhdmUgaXQgdG8gc3RhdGUKc3RhdGVfYWxsb3dzKGtleSwgdmFsdWUpID0gYWN0aW9uIHsKICBzdGF0ZSA6PSBnZXRfc3RhdGUoKQogIHByaW50KCJzdGF0ZV9hbGxvd3MgMTogc3RhdGVba2V5XSA9Iiwgc3RhdGVba2V5XSwgInZhbHVlID0iLCB2YWx1ZSkKICBub3Qgc3RhdGVba2V5XQogIHByaW50KCJzdGF0ZV9hbGxvd3MgMTogc2F2aW5nIHRvIHN0YXRlIGtleSA9Iiwga2V5LCAidmFsdWUgPSIsIHZhbHVlKQogIHBhdGggOj0gZ2V0X3N0YXRlX3BhdGgoa2V5KSAKICBhY3Rpb24gOj0gewogICAgIm9wIjogImFkZCIsCiAgICAicGF0aCI6IHBhdGgsIAogICAgInZhbHVlIjogdmFsdWUsCiAgfQp9CgojIHZhbHVlIG1hdGNoZXMgd2hhdCdzIGluIHN0YXRlLCBhbGxvdyBpdApzdGF0ZV9hbGxvd3Moa2V5LCB2YWx1ZSkgPSBhY3Rpb24gewogIHByaW50KCJzdGF0ZV9hbGxvd3MgMjogc3RhcnQiKQogIHN0YXRlIDo9IGdldF9zdGF0ZSgpCiAgcHJpbnQoInN0YXRlX2FsbG93cyAyOiBzdGF0ZVtrZXldID0iLCBzdGF0ZVtrZXldLCAidmFsdWUgPSIsIHZhbHVlKQogIHZhbHVlID09IHN0YXRlW2tleV0KICBwcmludCgic3RhdGVfYWxsb3dzIDI6IGZvdW5kIGtleSA9Iiwga2V5LCAidmFsdWUgPSIsIHZhbHVlLCAiIGluIHN0YXRlIikKICBhY3Rpb24gOj0gbnVsbAp9CgojIGhlbHBlciBmdW5jdGlvbnMgdG8gaW50ZXJhY3Qgd2l0aCB0aGUgc3RhdGUKZ2V0X3N0YXRlKCkgPSBzdGF0ZSB7CiAgc3RhdGUgOj0gZGF0YVsicHN0YXRlIl0KfQoKZ2V0X3N0YXRlX3ZhbChrZXkpID0gdmFsdWUgewogICAgc3RhdGUgOj0gZ2V0X3N0YXRlKCkKICAgIHZhbHVlIDo9IHN0YXRlW2tleV0KfQoKZ2V0X3N0YXRlX3BhdGgoa2V5KSA9IHBhdGggewogICAgIyBwcmVwZW5kICIvcHN0YXRlLyIgdG8ga2V5CiAgICBwYXRoIDo9IGNvbmNhdCgiLyIsIFsiL3BzdGF0ZSIsIGtleV0pCn0KCiMgSGVscGVyIGZ1bmN0aW9ucyB0byBjb25kaXRpb25hbGx5IGNvbmNhdGVuYXRlIG9wIGlzIG5vdCBudWxsCmNvbmNhdF9vcF9pZl9ub3RfbnVsbChvcHMsIG9wKSA9IHJlc3VsdCB7CiAgICBvcCA9PSBudWxsCiAgICByZXN1bHQgOj0gb3BzCn0KCmNvbmNhdF9vcF9pZl9ub3RfbnVsbChvcHMsIG9wKSA9IHJlc3VsdCB7CiAgICBvcCAhPSBudWxsCiAgICByZXN1bHQgOj0gYXJyYXkuY29uY2F0KG9wcywgW29wXSkKfQoKIyBSZWplY3QgdW5leHBlY3RlZCBhbm5vdGF0aW9ucy4KYWxsb3dfYW5ubyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19hbm5vIDE6IHN0YXJ0IikKCiAgICBub3QgaV9vY2kuQW5ub3RhdGlvbnMKCiAgICBwcmludCgiYWxsb3dfYW5ubyAxOiB0cnVlIikKfQphbGxvd19hbm5vKHBfb2NpLCBpX29jaSkgewogICAgcHJpbnQoImFsbG93X2Fubm8gMjogcCBBbm5vdGF0aW9ucyA9IiwgcF9vY2kuQW5ub3RhdGlvbnMpCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiBpIEFubm90YXRpb25zID0iLCBpX29jaS5Bbm5vdGF0aW9ucykKCiAgICBpX2tleXMgOj0gb2JqZWN0LmtleXMoaV9vY2kuQW5ub3RhdGlvbnMpCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiBpIGtleXMgPSIsIGlfa2V5cykKCiAgICBldmVyeSBpX2tleSBpbiBpX2tleXMgewogICAgICAgIGFsbG93X2Fubm9fa2V5KGlfa2V5LCBwX29jaSkKICAgIH0KCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiB0cnVlIikKfQoKYWxsb3dfYW5ub19rZXkoaV9rZXksIHBfb2NpKSB7CiAgICBwcmludCgiYWxsb3dfYW5ub19rZXkgMTogaSBrZXkgPSIsIGlfa2V5KQoKICAgIHN0YXJ0c3dpdGgoaV9rZXksICJpby5rdWJlcm5ldGVzLmNyaS4iKQoKICAgIHByaW50KCJhbGxvd19hbm5vX2tleSAxOiB0cnVlIikKfQphbGxvd19hbm5vX2tleShpX2tleSwgcF9vY2kpIHsKICAgIHByaW50KCJhbGxvd19hbm5vX2tleSAyOiBpIGtleSA9IiwgaV9rZXkpCgogICAgc29tZSBwX2tleSwgXyBpbiBwX29jaS5Bbm5vdGF0aW9ucwogICAgcF9rZXkgPT0gaV9rZXkKCiAgICBwcmludCgiYWxsb3dfYW5ub19rZXkgMjogdHJ1ZSIpCn0KCiMgR2V0IHRoZSB2YWx1ZSBvZiB0aGUgU19OQU1FX0tFWSBhbm5vdGF0aW9uIGFuZAojIGNvcnJlbGF0ZSBpdCB3aXRoIG90aGVyIGFubm90YXRpb25zIGFuZCBwcm9jZXNzIGZpZWxkcy4KYWxsb3dfYnlfYW5ubyhwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpIHsKICAgIHByaW50KCJhbGxvd19ieV9hbm5vIDE6IHN0YXJ0IikKCiAgICBub3QgcF9vY2kuQW5ub3RhdGlvbnNbU19OQU1FX0tFWV0KCiAgICBpX3NfbmFtZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMTogaV9zX25hbWUgPSIsIGlfc19uYW1lKQoKICAgIGlfc19uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FU1BBQ0VfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMTogaV9zX25hbWVzcGFjZSA9IiwgaV9zX25hbWVzcGFjZSkKCiAgICBhbGxvd19ieV9zYW5kYm94X25hbWUocF9vY2ksIGlfb2NpLCBwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBpX3NfbmFtZSwgaV9zX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfYnlfYW5ubyAxOiB0cnVlIikKfQphbGxvd19ieV9hbm5vKHBfb2NpLCBpX29jaSwgcF9zdG9yYWdlcywgaV9zdG9yYWdlcykgewogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMjogc3RhcnQiKQoKICAgIHBfc19uYW1lIDo9IHBfb2NpLkFubm90YXRpb25zW1NfTkFNRV9LRVldCiAgICBpX3NfbmFtZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMjogaV9zX25hbWUgPSIsIGlfc19uYW1lLCAicF9zX25hbWUgPSIsIHBfc19uYW1lKQoKICAgIGFsbG93X3NhbmRib3hfbmFtZShwX3NfbmFtZSwgaV9zX25hbWUpCgogICAgaV9zX25hbWVzcGFjZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVTUEFDRV9LRVldCiAgICBwcmludCgiYWxsb3dfYnlfYW5ubyAyOiBpX3NfbmFtZXNwYWNlID0iLCBpX3NfbmFtZXNwYWNlKQoKICAgIGFsbG93X2J5X3NhbmRib3hfbmFtZShwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMsIGlfc19uYW1lLCBpX3NfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd19ieV9hbm5vIDI6IHRydWUiKQp9CgphbGxvd19ieV9zYW5kYm94X25hbWUocF9vY2ksIGlfb2NpLCBwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfYnlfc2FuZGJveF9uYW1lOiBzdGFydCIpCgogICAgaV9uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNbU19OQU1FU1BBQ0VfS0VZXQoKICAgIGFsbG93X2J5X2NvbnRhaW5lcl90eXBlcyhwX29jaSwgaV9vY2ksIHNfbmFtZSwgaV9uYW1lc3BhY2UpCiAgICBhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZChwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpCiAgICBhbGxvd19wcm9jZXNzKHBfb2NpLlByb2Nlc3MsIGlfb2NpLlByb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpCgogICAgcHJpbnQoImFsbG93X2J5X3NhbmRib3hfbmFtZTogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfbmFtZShwX3NfbmFtZSwgaV9zX25hbWUpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X25hbWU6IHN0YXJ0IikKICAgIHJlZ2V4Lm1hdGNoKHBfc19uYW1lLCBpX3NfbmFtZSkKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9uYW1lOiB0cnVlIikKfQoKIyBDaGVjayB0aGF0IHRoZSAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLXR5cGUiIGFuZAojICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIiBhbm5vdGF0aW9ucyBkZXNpZ25hdGUgdGhlCiMgZXhwZWN0ZWQgdHlwZSAtIGVpdGhlciBhICJzYW5kYm94IiBvciBhICJjb250YWluZXIiLiBUaGVuLCB2YWxpZGF0ZQojIG90aGVyIGFubm90YXRpb25zIGJhc2VkIG9uIHRoZSBhY3R1YWwgInNhbmRib3giIG9yICJjb250YWluZXIiIHZhbHVlCiMgZnJvbSB0aGUgaW5wdXQgY29udGFpbmVyLgphbGxvd19ieV9jb250YWluZXJfdHlwZXMocF9vY2ksIGlfb2NpLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfYnlfY29udGFpbmVyX3R5cGVzOiBjaGVja2luZyBpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSIpCgogICAgY190eXBlIDo9ICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSIKICAgIAogICAgcF9jcmlfdHlwZSA6PSBwX29jaS5Bbm5vdGF0aW9uc1tjX3R5cGVdCiAgICBpX2NyaV90eXBlIDo9IGlfb2NpLkFubm90YXRpb25zW2NfdHlwZV0KICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZXM6IHBfY3JpX3R5cGUgPSIsIHBfY3JpX3R5cGUsICJpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgcF9jcmlfdHlwZSA9PSBpX2NyaV90eXBlCgogICAgYWxsb3dfYnlfY29udGFpbmVyX3R5cGUoaV9jcmlfdHlwZSwgcF9vY2ksIGlfb2NpLCBzX25hbWUsIHNfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZXM6IHRydWUiKQp9CgphbGxvd19ieV9jb250YWluZXJfdHlwZShpX2NyaV90eXBlLCBwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAxOiBpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgaV9jcmlfdHlwZSA9PSAic2FuZGJveCIKCiAgICBpX2thdGFfdHlwZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1siaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5jb250YWluZXJfdHlwZSJdCiAgICBwcmludCgiYWxsb3dfYnlfY29udGFpbmVyX3R5cGUgMTogaV9rYXRhX3R5cGUgPSIsIGlfa2F0YV90eXBlKQogICAgaV9rYXRhX3R5cGUgPT0gInBvZF9zYW5kYm94IgoKICAgIGFsbG93X3NhbmRib3hfY29udGFpbmVyX25hbWUocF9vY2ksIGlfb2NpKQogICAgYWxsb3dfc2FuZGJveF9uZXRfbmFtZXNwYWNlKHBfb2NpLCBpX29jaSkKICAgIGFsbG93X3NhbmRib3hfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpCgogICAgcHJpbnQoImFsbG93X2J5X2NvbnRhaW5lcl90eXBlIDE6IHRydWUiKQp9CgphbGxvd19ieV9jb250YWluZXJfdHlwZShpX2NyaV90eXBlLCBwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiBpX2NyaV90eXBlID0iLCBpX2NyaV90eXBlKQogICAgaV9jcmlfdHlwZSA9PSAiY29udGFpbmVyIgoKICAgIGlfa2F0YV90eXBlIDo9IGlfb2NpLkFubm90YXRpb25zWyJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIl0KICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiBpX2thdGFfdHlwZSA9IiwgaV9rYXRhX3R5cGUpCiAgICBpX2thdGFfdHlwZSA9PSAicG9kX2NvbnRhaW5lciIKCiAgICBhbGxvd19jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpCiAgICBhbGxvd19uZXRfbmFtZXNwYWNlKHBfb2NpLCBpX29jaSkKICAgIGFsbG93X2xvZ19kaXJlY3RvcnkocF9vY2ksIGlfb2NpKQoKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAyOiB0cnVlIikKfQoKIyAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLW5hbWUiIGFubm90YXRpb24KYWxsb3dfc2FuZGJveF9jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X2NvbnRhaW5lcl9uYW1lOiBzdGFydCIpCgogICAgY29udGFpbmVyX2Fubm90YXRpb25fbWlzc2luZyhwX29jaSwgaV9vY2ksICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItbmFtZSIpCgogICAgcHJpbnQoImFsbG93X3NhbmRib3hfY29udGFpbmVyX25hbWU6IHRydWUiKQp9CgphbGxvd19jb250YWluZXJfbmFtZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19jb250YWluZXJfbmFtZTogc3RhcnQiKQoKICAgIGFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uKHBfb2NpLCBpX29jaSwgImlvLmt1YmVybmV0ZXMuY3JpLmNvbnRhaW5lci1uYW1lIikKCiAgICBwcmludCgiYWxsb3dfY29udGFpbmVyX25hbWU6IHRydWUiKQp9Cgpjb250YWluZXJfYW5ub3RhdGlvbl9taXNzaW5nKHBfb2NpLCBpX29jaSwga2V5KSB7CiAgICBwcmludCgiY29udGFpbmVyX2Fubm90YXRpb25fbWlzc2luZzoiLCBrZXkpCgogICAgbm90IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIG5vdCBpX29jaS5Bbm5vdGF0aW9uc1trZXldCgogICAgcHJpbnQoImNvbnRhaW5lcl9hbm5vdGF0aW9uX21pc3Npbmc6IHRydWUiKQp9CgphbGxvd19jb250YWluZXJfYW5ub3RhdGlvbihwX29jaSwgaV9vY2ksIGtleSkgewogICAgcHJpbnQoImFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uOiBrZXkgPSIsIGtleSkKCiAgICBwX3ZhbHVlIDo9IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIGlfdmFsdWUgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgcHJpbnQoImFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uOiBwX3ZhbHVlID0iLCBwX3ZhbHVlLCAiaV92YWx1ZSA9IiwgaV92YWx1ZSkKCiAgICBwX3ZhbHVlID09IGlfdmFsdWUKCiAgICBwcmludCgiYWxsb3dfY29udGFpbmVyX2Fubm90YXRpb246IHRydWUiKQp9CgojICJuZXJkY3RsL25ldHdvcmstbmFtZXNwYWNlIiBhbm5vdGF0aW9uCmFsbG93X3NhbmRib3hfbmV0X25hbWVzcGFjZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X25ldF9uYW1lc3BhY2U6IHN0YXJ0IikKCiAgICBrZXkgOj0gIm5lcmRjdGwvbmV0d29yay1uYW1lc3BhY2UiCgogICAgcF9uYW1lc3BhY2UgOj0gcF9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgaV9uYW1lc3BhY2UgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgcHJpbnQoImFsbG93X3NhbmRib3hfbmV0X25hbWVzcGFjZTogcF9uYW1lc3BhY2UgPSIsIHBfbmFtZXNwYWNlLCAiaV9uYW1lc3BhY2UgPSIsIGlfbmFtZXNwYWNlKQoKICAgIHJlZ2V4Lm1hdGNoKHBfbmFtZXNwYWNlLCBpX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9uZXRfbmFtZXNwYWNlOiB0cnVlIikKfQoKYWxsb3dfbmV0X25hbWVzcGFjZShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19uZXRfbmFtZXNwYWNlOiBzdGFydCIpCgogICAga2V5IDo9ICJuZXJkY3RsL25ldHdvcmstbmFtZXNwYWNlIgoKICAgIG5vdCBwX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICBub3QgaV9vY2kuQW5ub3RhdGlvbnNba2V5XQoKICAgIHByaW50KCJhbGxvd19uZXRfbmFtZXNwYWNlOiB0cnVlIikKfQoKIyAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1sb2ctZGlyZWN0b3J5IiBhbm5vdGF0aW9uCmFsbG93X3NhbmRib3hfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2ksIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X2xvZ19kaXJlY3Rvcnk6IHN0YXJ0IikKCiAgICBrZXkgOj0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbG9nLWRpcmVjdG9yeSIKCiAgICBwX2RpciA6PSBwX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICByZWdleDEgOj0gcmVwbGFjZShwX2RpciwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHJlZ2V4MiA6PSByZXBsYWNlKHJlZ2V4MSwgIiQoc2FuZGJveC1uYW1lc3BhY2UpIiwgc19uYW1lc3BhY2UpCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiByZWdleDIgPSIsIHJlZ2V4MikKCiAgICBpX2RpciA6PSBpX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiBpX2RpciA9IiwgaV9kaXIpCgogICAgcmVnZXgubWF0Y2gocmVnZXgyLCBpX2RpcikKCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiB0cnVlIikKfQoKYWxsb3dfbG9nX2RpcmVjdG9yeShwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19sb2dfZGlyZWN0b3J5OiBzdGFydCIpCgogICAga2V5IDo9ICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWxvZy1kaXJlY3RvcnkiCgogICAgbm90IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIG5vdCBpX29jaS5Bbm5vdGF0aW9uc1trZXldCgogICAgcHJpbnQoImFsbG93X2xvZ19kaXJlY3Rvcnk6IHRydWUiKQp9CgphbGxvd19kZXZpY2VzKHBfZGV2aWNlcywgaV9kZXZpY2VzKSB7CiAgICBwcmludCgiYWxsb3dfZGV2aWNlczogc3RhcnQiKQogICAgZXZlcnkgaV9kZXZpY2UgaW4gaV9kZXZpY2VzIHsKICAgICAgICBwcmludCgiYWxsb3dfZGV2aWNlczogaV9kZXZpY2UgPSIsIGlfZGV2aWNlKQogICAgICAgIHNvbWUgcF9kZXZpY2UgaW4gcF9kZXZpY2VzCiAgICAgICAgcF9kZXZpY2UuY29udGFpbmVyX3BhdGggPT0gaV9kZXZpY2UuY29udGFpbmVyX3BhdGgKICAgIH0KICAgIHByaW50KCJhbGxvd19kZXZpY2VzOiB0cnVlIikKfQoKYWxsb3dfbGludXgoc3RhdGVfb3BzLCBwX29jaSwgaV9vY2kpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIHBfbmFtZXNwYWNlcyA6PSBwX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbGludXg6IHAgbmFtZXNwYWNlcyA9IiwgcF9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlcyA6PSBpX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbGludXg6IGkgbmFtZXNwYWNlcyA9IiwgaV9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlX3dpdGhvdXRfbmV0d29yayA6PSBbb2JqIHwgb2JqIDo9IGlfbmFtZXNwYWNlc1tfXTsgb2JqLlR5cGUgIT0gIm5ldHdvcmsiXQoKICAgIHByaW50KCJhbGxvd19saW51eDogaV9uYW1lc3BhY2Vfd2l0aG91dF9uZXR3b3JrID0iLCBpX25hbWVzcGFjZV93aXRob3V0X25ldHdvcmspCgogICAgcF9uYW1lc3BhY2VzID09IGlfbmFtZXNwYWNlX3dpdGhvdXRfbmV0d29yawoKICAgIGFsbG93X21hc2tlZF9wYXRocyhwX29jaSwgaV9vY2kpCiAgICBhbGxvd19yZWFkb25seV9wYXRocyhwX29jaSwgaV9vY2kpCiAgICBhbGxvd19saW51eF9kZXZpY2VzKHBfb2NpLkxpbnV4LkRldmljZXMsIGlfb2NpLkxpbnV4LkRldmljZXMpCiAgICBhbGxvd19saW51eF9zeXNjdGwocF9vY2kuTGludXgsIGlfb2NpLkxpbnV4KQogICAgcmV0IDo9IGFsbG93X25ldHdvcmtfbmFtZXNwYWNlX3N0YXJ0KHN0YXRlX29wcywgcF9vY2ksIGlfb2NpKQogICAgcmV0LmFsbG93ZWQKCiAgICBvcHMgOj0gcmV0Lm9wcwoKICAgIHByaW50KCJhbGxvd19saW51eDogdHJ1ZSIpCn0KCiMgUmV0cmlldmUgdGhlICJuZXR3b3JrIiBuYW1lc3BhY2UgZnJvbSB0aGUgaW5wdXQgZGF0YSBhbmQgcGFzcyBpdCBvbiBmb3IgdGhlCiMgbmV0d29yayBuYW1lc3BhY2UgcG9saWN5IGNoZWNrcy4KYWxsb3dfbmV0d29ya19uYW1lc3BhY2Vfc3RhcnQoc3RhdGVfb3BzLCBwX29jaSwgaV9vY2kpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIHByaW50KCJhbGxvd19uZXR3b3JrX25hbWVzcGFjZSBzdGFydDogc3RhcnQiKQoKICAgIHBfbmFtZXNwYWNlcyA6PSBwX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IHAgbmFtZXNwYWNlcyA9IiwgcF9uYW1lc3BhY2VzKQoKICAgIGlfbmFtZXNwYWNlcyA6PSBpX29jaS5MaW51eC5OYW1lc3BhY2VzCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IGkgbmFtZXNwYWNlcyA9IiwgaV9uYW1lc3BhY2VzKQoKICAgICMgUmV0dXJuIHBhdGggb2YgdGhlICJuZXR3b3JrIiBuYW1lc3BhY2UKICAgIG5ldHdvcmtfbnMgOj0gW29iaiB8IG9iaiA6PSBpX25hbWVzcGFjZXNbX107IG9iai5UeXBlID09ICJuZXR3b3JrIl0KCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2Ugc3RhcnQ6IG5ldHdvcmtfbnMgPSIsIG5ldHdvcmtfbnMpCgogICAgcmV0IDo9IGFsbG93X25ldHdvcmtfbmFtZXNwYWNlKHN0YXRlX29wcywgbmV0d29ya19ucykKICAgIHJldC5hbGxvd2VkCgogICAgb3BzIDo9IHJldC5vcHMKfQoKIyBUaGlzIHJ1bGUgaXMgd2hlbiB0aGVyZSdzIG5vIG5ldHdvcmsgbmFtZXNwYWNlIGluIHRoZSBpbnB1dCBkYXRhLgphbGxvd19uZXR3b3JrX25hbWVzcGFjZShzdGF0ZV9vcHMsIG5ldHdvcmtfbnMpIDo9IHsib3BzIjogb3BzLCAiYWxsb3dlZCI6IHRydWV9IHsKICAgIGNvdW50KG5ldHdvcmtfbnMpID09IDAKCiAgICBuZXR3b3JrX25zX3BhdGggPSAiIgoKICAgIGFkZF9uZXR3b3JrX25hbWVzcGFjZV90b19zdGF0ZSA6PSBzdGF0ZV9hbGxvd3MoIm5ldHdvcmtfbmFtZXNwYWNlIiwgbmV0d29ya19uc19wYXRoKQogICAgb3BzIDo9IGNvbmNhdF9vcF9pZl9ub3RfbnVsbChzdGF0ZV9vcHMsIGFkZF9uZXR3b3JrX25hbWVzcGFjZV90b19zdGF0ZSkKCiAgICBwcmludCgiYWxsb3dfbmV0d29ya19uYW1lc3BhY2UgMTogdHJ1ZSIpCn0KCiMgVGhpcyBydWxlIGlzIHdoZW4gdGhlcmUncyBleGFjdGx5IG9uZSBuZXR3b3JrIG5hbWVzcGFjZSBpbiB0aGUgaW5wdXQgZGF0YS4KYWxsb3dfbmV0d29ya19uYW1lc3BhY2Uoc3RhdGVfb3BzLCBuZXR3b3JrX25zKSA6PSB7Im9wcyI6IG9wcywgImFsbG93ZWQiOiB0cnVlfSB7CiAgICBjb3VudChuZXR3b3JrX25zKSA9PSAxCgogICAgYWRkX25ldHdvcmtfbmFtZXNwYWNlX3RvX3N0YXRlIDo9IHN0YXRlX2FsbG93cygibmV0d29ya19uYW1lc3BhY2UiLCBuZXR3b3JrX25zWzBdLlBhdGgpCiAgICBvcHMgOj0gY29uY2F0X29wX2lmX25vdF9udWxsKHN0YXRlX29wcywgYWRkX25ldHdvcmtfbmFtZXNwYWNlX3RvX3N0YXRlKQoKICAgIHByaW50KCJhbGxvd19uZXR3b3JrX25hbWVzcGFjZSAyOiB0cnVlIikKfQoKYWxsb3dfbWFza2VkX3BhdGhzKHBfb2NpLCBpX29jaSkgewogICAgcF9wYXRocyA6PSBwX29jaS5MaW51eC5NYXNrZWRQYXRocwogICAgcHJpbnQoImFsbG93X21hc2tlZF9wYXRocyAxOiBwX3BhdGhzID0iLCBwX3BhdGhzKQoKICAgIGlfcGF0aHMgOj0gaV9vY2kuTGludXguTWFza2VkUGF0aHMKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aHMgMTogaV9wYXRocyA9IiwgaV9wYXRocykKCiAgICBhbGxvd19tYXNrZWRfcGF0aHNfYXJyYXkocF9wYXRocywgaV9wYXRocykKCiAgICBwcmludCgiYWxsb3dfbWFza2VkX3BhdGhzIDE6IHRydWUiKQp9CmFsbG93X21hc2tlZF9wYXRocyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aHMgMjogc3RhcnQiKQoKICAgIG5vdCBwX29jaS5MaW51eC5NYXNrZWRQYXRocwogICAgbm90IGlfb2NpLkxpbnV4Lk1hc2tlZFBhdGhzCgogICAgcHJpbnQoImFsbG93X21hc2tlZF9wYXRocyAyOiB0cnVlIikKfQoKIyBBbGwgdGhlIHBvbGljeSBtYXNrZWQgcGF0aHMgbXVzdCBiZSBtYXNrZWQgaW4gdGhlIGlucHV0IGRhdGEgdG9vLgojIElucHV0IGlzIGFsbG93ZWQgdG8gaGF2ZSBtb3JlIG1hc2tlZCBwYXRocyB0aGFuIHRoZSBwb2xpY3kuCmFsbG93X21hc2tlZF9wYXRoc19hcnJheShwX2FycmF5LCBpX2FycmF5KSB7CiAgICBldmVyeSBwX2VsZW0gaW4gcF9hcnJheSB7CiAgICAgICAgYWxsb3dfbWFza2VkX3BhdGgocF9lbGVtLCBpX2FycmF5KQogICAgfQp9CgphbGxvd19tYXNrZWRfcGF0aChwX2VsZW0sIGlfYXJyYXkpIHsKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aDogcF9lbGVtID0iLCBwX2VsZW0pCgogICAgc29tZSBpX2VsZW0gaW4gaV9hcnJheQogICAgcF9lbGVtID09IGlfZWxlbQoKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aDogdHJ1ZSIpCn0KCmFsbG93X3JlYWRvbmx5X3BhdGhzKHBfb2NpLCBpX29jaSkgewogICAgcF9wYXRocyA6PSBwX29jaS5MaW51eC5SZWFkb25seVBhdGhzCiAgICBwcmludCgiYWxsb3dfcmVhZG9ubHlfcGF0aHMgMTogcF9wYXRocyA9IiwgcF9wYXRocykKCiAgICBpX3BhdGhzIDo9IGlfb2NpLkxpbnV4LlJlYWRvbmx5UGF0aHMKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAxOiBpX3BhdGhzID0iLCBpX3BhdGhzKQoKICAgIGFsbG93X3JlYWRvbmx5X3BhdGhzX2FycmF5KHBfcGF0aHMsIGlfcGF0aHMsIGlfb2NpLkxpbnV4Lk1hc2tlZFBhdGhzKQoKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAxOiB0cnVlIikKfQphbGxvd19yZWFkb25seV9wYXRocyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAyOiBzdGFydCIpCgogICAgbm90IHBfb2NpLkxpbnV4LlJlYWRvbmx5UGF0aHMKICAgIG5vdCBpX29jaS5MaW51eC5SZWFkb25seVBhdGhzCgogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGhzIDI6IHRydWUiKQp9CgojIEFsbCB0aGUgcG9saWN5IHJlYWRvbmx5IHBhdGhzIG11c3QgYmUgZWl0aGVyOgojIC0gUHJlc2VudCBpbiB0aGUgaW5wdXQgcmVhZG9ubHkgcGF0aHMsIG9yCiMgLSBQcmVzZW50IGluIHRoZSBpbnB1dCBtYXNrZWQgcGF0aHMuCiMgSW5wdXQgaXMgYWxsb3dlZCB0byBoYXZlIG1vcmUgcmVhZG9ubHkgcGF0aHMgdGhhbiB0aGUgcG9saWN5LgphbGxvd19yZWFkb25seV9wYXRoc19hcnJheShwX2FycmF5LCBpX2FycmF5LCBtYXNrZWRfcGF0aHMpIHsKICAgIGV2ZXJ5IHBfZWxlbSBpbiBwX2FycmF5IHsKICAgICAgICBhbGxvd19yZWFkb25seV9wYXRoKHBfZWxlbSwgaV9hcnJheSwgbWFza2VkX3BhdGhzKQogICAgfQp9CgphbGxvd19yZWFkb25seV9wYXRoKHBfZWxlbSwgaV9hcnJheSwgbWFza2VkX3BhdGhzKSB7CiAgICBwcmludCgiYWxsb3dfcmVhZG9ubHlfcGF0aCAxOiBwX2VsZW0gPSIsIHBfZWxlbSkKCiAgICBzb21lIGlfZWxlbSBpbiBpX2FycmF5CiAgICBwX2VsZW0gPT0gaV9lbGVtCgogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGggMTogdHJ1ZSIpCn0KYWxsb3dfcmVhZG9ubHlfcGF0aChwX2VsZW0sIGlfYXJyYXksIG1hc2tlZF9wYXRocykgewogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGggMjogcF9lbGVtID0iLCBwX2VsZW0pCgogICAgc29tZSBpX21hc2tlZCBpbiBtYXNrZWRfcGF0aHMKICAgIHBfZWxlbSA9PSBpX21hc2tlZAoKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRoIDI6IHRydWUiKQp9CgphbGxvd19saW51eF9kZXZpY2VzKHBfZGV2aWNlcywgaV9kZXZpY2VzKSB7CiAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogc3RhcnQiKQogICAgZXZlcnkgaV9kZXZpY2UgaW4gaV9kZXZpY2VzIHsKICAgICAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogaV9kZXZpY2UgPSIsIGlfZGV2aWNlKQogICAgICAgIHNvbWUgcF9kZXZpY2UgaW4gcF9kZXZpY2VzCiAgICAgICAgaV9kZXZpY2UuUGF0aCA9PSBwX2RldmljZS5QYXRoCiAgICB9CiAgICBwcmludCgiYWxsb3dfbGludXhfZGV2aWNlczogdHJ1ZSIpCn0KCmFsbG93X2xpbnV4X3N5c2N0bChwX2xpbnV4LCBpX2xpbnV4KSB7CiAgICBwcmludCgiYWxsb3dfbGludXhfc3lzY3RsIDE6IHN0YXJ0IikKICAgIG5vdCBpX2xpbnV4LlN5c2N0bAogICAgcHJpbnQoImFsbG93X2xpbnV4X3N5c2N0bCAxOiB0cnVlIikKfQoKYWxsb3dfbGludXhfc3lzY3RsKHBfbGludXgsIGlfbGludXgpIHsKICAgIHByaW50KCJhbGxvd19saW51eF9zeXNjdGwgMjogc3RhcnQiKQogICAgcF9zeXNjdGwgOj0gcF9saW51eC5TeXNjdGwKICAgIGlfc3lzY3RsIDo9IGlfbGludXguU3lzY3RsCiAgICBldmVyeSBpX25hbWUsIGlfdmFsIGluIGlfc3lzY3RsIHsKICAgICAgICBwcmludCgiYWxsb3dfbGludXhfc3lzY3RsIDI6IGlfbmFtZSA9IiwgaV9uYW1lLCAiaV92YWwgPSIsIGlfdmFsKQogICAgICAgIHBfc3lzY3RsW2lfbmFtZV0gPT0gaV92YWwKICAgIH0KICAgIHByaW50KCJhbGxvd19saW51eF9zeXNjdGwgMjogdHJ1ZSIpCn0KCiMgQ2hlY2sgdGhlIGNvbnNpc3RlbmN5IG9mIHRoZSBpbnB1dCAiaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5idW5kbGVfcGF0aCIKIyBhbmQgaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCIgdmFsdWVzIHdpdGggb3RoZXIgZmllbGRzLgphbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZChwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpIHsKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogc3RhcnQiKQoKICAgIGJ1bmRsZV9wYXRoIDo9IGlfb2NpLkFubm90YXRpb25zWyJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmJ1bmRsZV9wYXRoIl0KICAgIGJ1bmRsZV9pZCA6PSByZXBsYWNlKGJ1bmRsZV9wYXRoLCAiL3J1bi9jb250YWluZXJkL2lvLmNvbnRhaW5lcmQucnVudGltZS52Mi50YXNrL2s4cy5pby8iLCAiIikKCiAgICBidW5kbGVfaWRfZm9ybWF0IDo9IGNvbmNhdCgiIiwgWyJeIiwgQlVORExFX0lELCAiJCJdKQogICAgcmVnZXgubWF0Y2goYnVuZGxlX2lkX2Zvcm1hdCwgYnVuZGxlX2lkKQoKICAgIGtleSA6PSAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCIKCiAgICBwX3JlZ2V4IDo9IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIHNhbmRib3hfaWQgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQoKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogc2FuZGJveF9pZCA9Iiwgc2FuZGJveF9pZCwgInJlZ2V4ID0iLCBwX3JlZ2V4KQogICAgcmVnZXgubWF0Y2gocF9yZWdleCwgc2FuZGJveF9pZCkKCiAgICBhbGxvd19yb290X3BhdGgocF9vY2ksIGlfb2NpLCBidW5kbGVfaWQpCgogICAgZXZlcnkgaV9tb3VudCBpbiBpX29jaS5Nb3VudHMgewogICAgICAgIGFsbG93X21vdW50KHBfb2NpLCBpX21vdW50LCBpX3N0b3JhZ2VzLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpCiAgICB9CgogICAgYWxsb3dfc3RvcmFnZXMocF9zdG9yYWdlcywgaV9zdG9yYWdlcywgYnVuZGxlX2lkLCBzYW5kYm94X2lkKQoKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogdHJ1ZSIpCn0KCmFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHBfcHJvY2VzcyA9IiwgcF9wcm9jZXNzKQogICAgcHJpbnQoImFsbG93X3Byb2Nlc3NfY29tbW9uOiBpX3Byb2Nlc3MgPSAiLCBpX3Byb2Nlc3MpCiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHNfbmFtZSA9Iiwgc19uYW1lKQoKICAgIHBfcHJvY2Vzcy5Dd2QgPT0gaV9wcm9jZXNzLkN3ZAogICAgcF9wcm9jZXNzLk5vTmV3UHJpdmlsZWdlcyA9PSBpX3Byb2Nlc3MuTm9OZXdQcml2aWxlZ2VzCgogICAgYWxsb3dfdXNlcihwX3Byb2Nlc3MsIGlfcHJvY2VzcykKICAgIGFsbG93X2VudihwX3Byb2Nlc3MsIGlfcHJvY2Vzcywgc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfcHJvY2Vzc19jb21tb246IHRydWUiKQp9CgojIENvbXBhcmUgdGhlIE9DSSBQcm9jZXNzIGZpZWxkIG9mIGEgcG9saWN5IGNvbnRhaW5lciB3aXRoIHRoZSBpbnB1dCBPQ0kgUHJvY2VzcyBmcm9tIGEgQ3JlYXRlQ29udGFpbmVyUmVxdWVzdAphbGxvd19wcm9jZXNzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfcHJvY2Vzczogc3RhcnQiKQoKICAgIGFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgYWxsb3dfY2FwcyhwX3Byb2Nlc3MuQ2FwYWJpbGl0aWVzLCBpX3Byb2Nlc3MuQ2FwYWJpbGl0aWVzKQogICAgcF9wcm9jZXNzLlRlcm1pbmFsID09IGlfcHJvY2Vzcy5UZXJtaW5hbAoKICAgIHByaW50KCJhbGxvd19wcm9jZXNzOiB0cnVlIikKfQoKIyBDb21wYXJlIHRoZSBPQ0kgUHJvY2VzcyBmaWVsZCBvZiBhIHBvbGljeSBjb250YWluZXIgd2l0aCB0aGUgaW5wdXQgcHJvY2VzcyBmaWVsZCBmcm9tIEV4ZWNQcm9jZXNzUmVxdWVzdAphbGxvd19pbnRlcmFjdGl2ZV9wcm9jZXNzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfaW50ZXJhY3RpdmVfcHJvY2Vzczogc3RhcnQiKQoKICAgIGFsbG93X3Byb2Nlc3NfY29tbW9uKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgYWxsb3dfZXhlY19jYXBzKGlfcHJvY2Vzcy5DYXBhYmlsaXRpZXMpCgogICAgIyBUaGVzZSBhcmUgY29tbWFuZHMgZW5hYmxlZCB1c2luZyBFeGVjUHJvY2Vzc1JlcXVlc3QgY29tbWFuZHMgYW5kL29yIHJlZ2V4IGZyb20gdGhlIHNldHRpbmdzIGZpbGUuCiAgICAjIFRoZXkgY2FuIGJlIGV4ZWN1dGVkIGludGVyYWN0aXZlbHkgc28gYWxsb3cgdGhlbSB0byB1c2UgYW55IHZhbHVlIGZvciBpX3Byb2Nlc3MuVGVybWluYWwuCgogICAgcHJpbnQoImFsbG93X2ludGVyYWN0aXZlX3Byb2Nlc3M6IHRydWUiKQp9CgojIENvbXBhcmUgdGhlIE9DSSBQcm9jZXNzIGZpZWxkIG9mIGEgcG9saWN5IGNvbnRhaW5lciB3aXRoIHRoZSBpbnB1dCBwcm9jZXNzIGZpZWxkIGZyb20gRXhlY1Byb2Nlc3NSZXF1ZXN0CmFsbG93X3Byb2JlX3Byb2Nlc3MocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHByaW50KCJhbGxvd19wcm9iZV9wcm9jZXNzOiBzdGFydCIpCgogICAgYWxsb3dfcHJvY2Vzc19jb21tb24ocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSwgc19uYW1lc3BhY2UpCiAgICBhbGxvd19leGVjX2NhcHMoaV9wcm9jZXNzLkNhcGFiaWxpdGllcykKICAgIHBfcHJvY2Vzcy5UZXJtaW5hbCA9PSBpX3Byb2Nlc3MuVGVybWluYWwKCiAgICBwcmludCgiYWxsb3dfcHJvYmVfcHJvY2VzczogdHJ1ZSIpCn0KCmFsbG93X3VzZXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MpIHsKICAgIHBfdXNlciA6PSBwX3Byb2Nlc3MuVXNlcgogICAgaV91c2VyIDo9IGlfcHJvY2Vzcy5Vc2VyCgogICAgcHJpbnQoImFsbG93X3VzZXI6IGlucHV0IHVpZCA9IiwgaV91c2VyLlVJRCwgInBvbGljeSB1aWQgPSIsIHBfdXNlci5VSUQpCiAgICBwX3VzZXIuVUlEID09IGlfdXNlci5VSUQKCiAgICAjIFRPRE86IHRyYWNrIGRvd24gdGhlIHJlYXNvbiBmb3IgcmVnaXN0cnkuazhzLmlvL3BhdXNlOjMuOSBiZWluZwogICAgIyAgICAgICBleGVjdXRlZCB3aXRoIGdpZCA9IDAgZGVzcGl0ZSBoYXZpbmcgIjY1NTM1OjY1NTM1IiBpbiBpdHMgY29udGFpbmVyIGltYWdlCiAgICAjICAgICAgIGNvbmZpZy4KICAgICNwcmludCgiYWxsb3dfdXNlcjogaW5wdXQgZ2lkID0iLCBpX3VzZXIuR0lELCAicG9saWN5IGdpZCA9IiwgcF91c2VyLkdJRCkKICAgICNwX3VzZXIuR0lEID09IGlfdXNlci5HSUQKCiAgICAjIFRPRE86IGNvbXBhcmUgdGhlIGFkZGl0aW9uYWxHaWRzIGZpZWxkIHRvbyBhZnRlciBjb21wdXRpbmcgaXRzIHZhbHVlCiAgICAjIGJhc2VkIG9uIC9ldGMvcGFzc3dkIGFuZCAvZXRjL2dyb3VwIGZyb20gdGhlIGNvbnRhaW5lciBpbWFnZS4KfQoKYWxsb3dfZGVwcmVjYXRlZF9hcmdzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZ3MgMTogbm8gYXJncyIpCgogICAgbm90IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJncwogICAgbm90IGlfcHJvY2Vzcy5BcmdzCgogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAxOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZ3MocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSkgewogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiBwb2xpY3kgYXJncyA9IiwgcF9wcm9jZXNzLkRlcHJlY2F0ZWRBcmdzKQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiBpbnB1dCBhcmdzID0iLCBpX3Byb2Nlc3MuQXJncykKCiAgICBjb3VudChwX3Byb2Nlc3MuRGVwcmVjYXRlZEFyZ3MpID09IGNvdW50KGlfcHJvY2Vzcy5BcmdzKQoKICAgIGV2ZXJ5IGksIGlfYXJnIGluIGlfcHJvY2Vzcy5BcmdzIHsKICAgICAgICBhbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpCiAgICB9CgogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJncyAyOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDE6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgcF9hcmcyIDo9IHJlcGxhY2UocF9hcmcsICIkJCIsICIkIikKICAgIHBfYXJnMiA9PSBpX2FyZwoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAxOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDI6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgIyBUT0RPOiBjYW4gJChub2RlLW5hbWUpIGJlIGhhbmRsZWQgYmV0dGVyPwogICAgY29udGFpbnMocF9hcmcsICIkKG5vZGUtbmFtZSkiKQoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAyOiB0cnVlIikKfQphbGxvd19kZXByZWNhdGVkX2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5EZXByZWNhdGVkQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2RlcHJlY2F0ZWRfYXJnIDM6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgcF9hcmcyIDo9IHJlcGxhY2UocF9hcmcsICIkJCIsICIkIikKICAgIHBfYXJnMyA6PSByZXBsYWNlKHBfYXJnMiwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAzOiBwX2FyZzMgPSIsIHBfYXJnMykKICAgIHBfYXJnMyA9PSBpX2FyZwoKICAgIHByaW50KCJhbGxvd19kZXByZWNhdGVkX2FyZyAzOiB0cnVlIikKfQoKIyBPQ0kgcHJvY2Vzcy5FbnYgZmllbGQKYWxsb3dfZW52KHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfZW52OiBwIGVudiA9IiwgcF9wcm9jZXNzLkVudikKICAgIHByaW50KCJhbGxvd19lbnY6IGkgZW52ID0iLCBpX3Byb2Nlc3MuRW52KQoKICAgIGV2ZXJ5IGlfdmFyIGluIGlfcHJvY2Vzcy5FbnYgewogICAgICAgIHByaW50KCJhbGxvd19lbnY6IGlfdmFyID0iLCBpX3ZhcikKICAgICAgICBhbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKQogICAgfQoKICAgIHByaW50KCJhbGxvd19lbnY6IHRydWUiKQp9CgojIEFsbG93IGlucHV0IGVudiB2YXJpYWJsZXMgdGhhdCBhcmUgcHJlc2VudCBpbiB0aGUgcG9saWN5IGRhdGEgdG9vLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHBfdmFyID09IGlfdmFyCiAgICBwcmludCgiYWxsb3dfdmFyIDE6IHRydWUiKQp9CgojIE1hdGNoIGlucHV0IHdpdGggb25lIG9mIHRoZSBwb2xpY3kgdmFyaWFibGVzLCBhZnRlciBzdWJzdGl0dXRpbmcgJChzYW5kYm94LW5hbWUpLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHByaW50KCJhbGxvd192YXIgMjogcF92YXIgPSIsIHBfdmFyKQoKICAgIHBfdmFyX3NwbGl0IDo9IHNwbGl0KHBfdmFyLCAiPSIpCiAgICBjb3VudChwX3Zhcl9zcGxpdCkgPT0gMgoKICAgIHBfdmFyX3NwbGl0WzFdID09ICIkKHNhbmRib3gtbmFtZSkiCgogICAgaV92YXJfc3BsaXQgOj0gc3BsaXQoaV92YXIsICI9IikKICAgIGNvdW50KGlfdmFyX3NwbGl0KSA9PSAyCgogICAgaV92YXJfc3BsaXRbMF0gPT0gcF92YXJfc3BsaXRbMF0KICAgIHJlZ2V4Lm1hdGNoKHNfbmFtZSwgaV92YXJfc3BsaXRbMV0pCgogICAgcHJpbnQoImFsbG93X3ZhciAyOiB0cnVlIikKfQoKIyBBbGxvdyBpbnB1dCBlbnYgdmFyaWFibGVzIHRoYXQgbWF0Y2ggd2l0aCBhIHJlcXVlc3RfZGVmYXVsdHMgcmVnZXguCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHNvbWUgcF9yZWdleDEgaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5DcmVhdGVDb250YWluZXJSZXF1ZXN0LmFsbG93X2Vudl9yZWdleAogICAgcF9yZWdleDIgOj0gcmVwbGFjZShwX3JlZ2V4MSwgIiQoaXB2NF9hKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcHY0X2EpCiAgICBwX3JlZ2V4MyA6PSByZXBsYWNlKHBfcmVnZXgyLCAiJChpcF9wKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5pcF9wKQogICAgcF9yZWdleDQgOj0gcmVwbGFjZShwX3JlZ2V4MywgIiQoc3ZjX25hbWUpIiwgcG9saWN5X2RhdGEuY29tbW9uLnN2Y19uYW1lKQogICAgcF9yZWdleDUgOj0gcmVwbGFjZShwX3JlZ2V4NCwgIiQoZG5zX2xhYmVsKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5kbnNfbGFiZWwpCgogICAgcHJpbnQoImFsbG93X3ZhciAzOiBwX3JlZ2V4NSA9IiwgcF9yZWdleDUpCiAgICByZWdleC5tYXRjaChwX3JlZ2V4NSwgaV92YXIpCgogICAgcHJpbnQoImFsbG93X3ZhciAzOiB0cnVlIikKfQoKIyBBbGxvdyBmaWVsZFJlZiAiZmllbGRQYXRoOiBzdGF0dXMucG9kSVAiIHZhbHVlcy4KYWxsb3dfdmFyKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBpX3Zhciwgc19uYW1lLCBzX25hbWVzcGFjZSkgewogICAgbmFtZV92YWx1ZSA6PSBzcGxpdChpX3ZhciwgIj0iKQogICAgY291bnQobmFtZV92YWx1ZSkgPT0gMgogICAgaXNfaXAobmFtZV92YWx1ZVsxXSkKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIGFsbG93X3BvZF9pcF92YXIobmFtZV92YWx1ZVswXSwgcF92YXIpCgogICAgcHJpbnQoImFsbG93X3ZhciA0OiB0cnVlIikKfQoKIyBBbGxvdyBjb21tb24gZmllbGRSZWYgdmFyaWFibGVzLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBuYW1lX3ZhbHVlIDo9IHNwbGl0KGlfdmFyLCAiPSIpCiAgICBjb3VudChuYW1lX3ZhbHVlKSA9PSAyCgogICAgc29tZSBwX3ZhciBpbiBwX3Byb2Nlc3MuRW52CiAgICBwX25hbWVfdmFsdWUgOj0gc3BsaXQocF92YXIsICI9IikKICAgIGNvdW50KHBfbmFtZV92YWx1ZSkgPT0gMgoKICAgIHBfbmFtZV92YWx1ZVswXSA9PSBuYW1lX3ZhbHVlWzBdCgogICAgIyBUT0RPOiBzaG91bGQgdGhlc2UgYmUgaGFuZGxlZCBpbiBhIGRpZmZlcmVudCB3YXk/CiAgICBhbHdheXNfYWxsb3dlZCA6PSBbIiQoaG9zdC1uYW1lKSIsICIkKG5vZGUtbmFtZSkiLCAiJChwb2QtdWlkKSJdCiAgICBzb21lIGFsbG93ZWQgaW4gYWx3YXlzX2FsbG93ZWQKICAgIGNvbnRhaW5zKHBfbmFtZV92YWx1ZVsxXSwgYWxsb3dlZCkKCiAgICBwcmludCgiYWxsb3dfdmFyIDU6IHRydWUiKQp9CgojIEFsbG93IGZpZWxkUmVmICJmaWVsZFBhdGg6IHN0YXR1cy5ob3N0SVAiIHZhbHVlcy4KYWxsb3dfdmFyKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBpX3Zhciwgc19uYW1lLCBzX25hbWVzcGFjZSkgewogICAgbmFtZV92YWx1ZSA6PSBzcGxpdChpX3ZhciwgIj0iKQogICAgY291bnQobmFtZV92YWx1ZSkgPT0gMgogICAgaXNfaXAobmFtZV92YWx1ZVsxXSkKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIGFsbG93X2hvc3RfaXBfdmFyKG5hbWVfdmFsdWVbMF0sIHBfdmFyKQoKICAgIHByaW50KCJhbGxvd192YXIgNjogdHJ1ZSIpCn0KCiMgQWxsb3cgcmVzb3VyY2VGaWVsZFJlZiB2YWx1ZXMgKGUuZy4sICJsaW1pdHMuY3B1IikuCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIG5hbWVfdmFsdWUgOj0gc3BsaXQoaV92YXIsICI9IikKICAgIGNvdW50KG5hbWVfdmFsdWUpID09IDIKCiAgICBzb21lIHBfdmFyIGluIHBfcHJvY2Vzcy5FbnYKICAgIHBfbmFtZV92YWx1ZSA6PSBzcGxpdChwX3ZhciwgIj0iKQogICAgY291bnQocF9uYW1lX3ZhbHVlKSA9PSAyCgogICAgcF9uYW1lX3ZhbHVlWzBdID09IG5hbWVfdmFsdWVbMF0KCiAgICAjIGEgdmFyaWFibGUgd2Ugc2hvdWxkIGJlIHZhbGlkYXRpbmcgdXNpbmcgYSByZWdleCBmcm9tIHNldHRpbmdzCiAgICBwX25hbWVfdmFsdWVbMV0gPT0gIiQodmFsaWRhdGUtZnJvbS1zZXR0aW5ncykiCgogICAgcmVnZXhfdmFsIDo9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuQ3JlYXRlQ29udGFpbmVyUmVxdWVzdC5hbGxvd19lbnZfcmVnZXhfbWFwW25hbWVfdmFsdWVbMF1dCgogICAgcHJpbnQoImFsbG93X3ZhciA3OiB2YWwgPSIsIG5hbWVfdmFsdWVbMV0pCiAgICBwcmludCgiYWxsb3dfdmFyIDc6IHJlZ2V4X3ZhbCA9IiwgcmVnZXhfdmFsKQoKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4X3ZhbCwgbmFtZV92YWx1ZVsxXSkKCiAgICBwcmludCgiYWxsb3dfdmFyIDc6IHRydWUiKQp9CgojIE1hdGNoIGlucHV0IHdpdGggb25lIG9mIHRoZSBwb2xpY3kgdmFyaWFibGVzLCBhZnRlciBzdWJzdGl0dXRpbmcgJChzYW5kYm94LW5hbWVzcGFjZSkuCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSwgc19uYW1lc3BhY2UpIHsKICAgIHNvbWUgcF92YXIgaW4gcF9wcm9jZXNzLkVudgogICAgcF92YXIyIDo9IHJlcGxhY2UocF92YXIsICIkKHNhbmRib3gtbmFtZXNwYWNlKSIsIHNfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd192YXIgODogcF92YXIyID0iLCBwX3ZhcjIpCiAgICBwX3ZhcjIgPT0gaV92YXIKCiAgICBwcmludCgiYWxsb3dfdmFyIDg6IHRydWUiKQp9CgphbGxvd19wb2RfaXBfdmFyKHZhcl9uYW1lLCBwX3ZhcikgewogICAgcHJpbnQoImFsbG93X3BvZF9pcF92YXI6IHZhcl9uYW1lID0iLCB2YXJfbmFtZSwgInBfdmFyID0iLCBwX3ZhcikKCiAgICBwX25hbWVfdmFsdWUgOj0gc3BsaXQocF92YXIsICI9IikKICAgIGNvdW50KHBfbmFtZV92YWx1ZSkgPT0gMgoKICAgIHBfbmFtZV92YWx1ZVswXSA9PSB2YXJfbmFtZQogICAgcF9uYW1lX3ZhbHVlWzFdID09ICIkKHBvZC1pcCkiCgogICAgcHJpbnQoImFsbG93X3BvZF9pcF92YXI6IHRydWUiKQp9CgphbGxvd19ob3N0X2lwX3Zhcih2YXJfbmFtZSwgcF92YXIpIHsKICAgIHByaW50KCJhbGxvd19ob3N0X2lwX3ZhcjogdmFyX25hbWUgPSIsIHZhcl9uYW1lLCAicF92YXIgPSIsIHBfdmFyKQoKICAgIHBfbmFtZV92YWx1ZSA6PSBzcGxpdChwX3ZhciwgIj0iKQogICAgY291bnQocF9uYW1lX3ZhbHVlKSA9PSAyCgogICAgcF9uYW1lX3ZhbHVlWzBdID09IHZhcl9uYW1lCiAgICBwX25hbWVfdmFsdWVbMV0gPT0gIiQoaG9zdC1pcCkiCgogICAgcHJpbnQoImFsbG93X2hvc3RfaXBfdmFyOiB0cnVlIikKfQoKaXNfaXAodmFsdWUpIHsKICAgIGJ5dGVzID0gc3BsaXQodmFsdWUsICIuIikKICAgIGNvdW50KGJ5dGVzKSA9PSA0CgogICAgaXNfaXBfZmlyc3RfYnl0ZShieXRlc1swXSkKICAgIGlzX2lwX290aGVyX2J5dGUoYnl0ZXNbMV0pCiAgICBpc19pcF9vdGhlcl9ieXRlKGJ5dGVzWzJdKQogICAgaXNfaXBfb3RoZXJfYnl0ZShieXRlc1szXSkKfQppc19pcF9maXJzdF9ieXRlKGNvbXBvbmVudCkgewogICAgbnVtYmVyID0gdG9fbnVtYmVyKGNvbXBvbmVudCkKICAgIG51bWJlciA+PSAxCiAgICBudW1iZXIgPD0gMjU1Cn0KaXNfaXBfb3RoZXJfYnl0ZShjb21wb25lbnQpIHsKICAgIG51bWJlciA9IHRvX251bWJlcihjb21wb25lbnQpCiAgICBudW1iZXIgPj0gMAogICAgbnVtYmVyIDw9IDI1NQp9CgojIE9DSSByb290LlBhdGgKYWxsb3dfcm9vdF9wYXRoKHBfb2NpLCBpX29jaSwgYnVuZGxlX2lkKSB7CiAgICBpX3BhdGggOj0gaV9vY2kuUm9vdC5QYXRoCiAgICBwX3BhdGgxIDo9IHBfb2NpLlJvb3QuUGF0aAogICAgcHJpbnQoImFsbG93X3Jvb3RfcGF0aDogaV9wYXRoID0iLCBpX3BhdGgsICJwX3BhdGgxID0iLCBwX3BhdGgxKQoKICAgIHBfcGF0aDIgOj0gcmVwbGFjZShwX3BhdGgxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfcm9vdF9wYXRoOiBwX3BhdGgyID0iLCBwX3BhdGgyKQoKICAgIHBfcGF0aDMgOj0gcmVwbGFjZShwX3BhdGgyLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X3Jvb3RfcGF0aDogcF9wYXRoMyA9IiwgcF9wYXRoMykKCiAgICBwX3BhdGgzID09IGlfcGF0aAoKICAgIHByaW50KCJhbGxvd19yb290X3BhdGg6IHRydWUiKQp9CgojIGRldmljZSBtb3VudHMKYWxsb3dfbW91bnQocF9vY2ksIGlfbW91bnQsIGlfc3RvcmFnZXMsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcHJpbnQoImFsbG93X21vdW50OiBpX21vdW50ID0iLCBpX21vdW50KQoKICAgIHNvbWUgcF9tb3VudCBpbiBwX29jaS5Nb3VudHMKICAgIHNvbWUgaV9zdG9yYWdlIGluIGlfc3RvcmFnZXMKCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IHBfbW91bnQgPSIsIHBfbW91bnQpCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IGlfc3RvcmFnZSA9IiwgaV9zdG9yYWdlKQoKICAgIGNoZWNrX21vdW50KHBfbW91bnQsIGlfbW91bnQsIGlfc3RvcmFnZSwgYnVuZGxlX2lkLCBzYW5kYm94X2lkKQoKICAgICMgVE9ETzogYXJlIHRoZXJlIGFueSBvdGhlciByZXF1aXJlZCBwb2xpY3kgY2hlY2tzIGZvciBtb3VudHMgLSBlLmcuLAogICAgIyAgICAgICBtdWx0aXBsZSBtb3VudHMgd2l0aCBzYW1lIHNvdXJjZSBvciBkZXN0aW5hdGlvbj8KCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IHRydWUiKQp9CgpjaGVja19tb3VudChwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcF9tb3VudCA9PSBpX21vdW50CiAgICBwcmludCgiY2hlY2tfbW91bnQgMTogdHJ1ZSIpCn0KY2hlY2tfbW91bnQocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHBfbW91bnQuZGVzdGluYXRpb24gPT0gaV9tb3VudC5kZXN0aW5hdGlvbgogICAgcF9tb3VudC50eXBlXyA9PSBpX21vdW50LnR5cGVfCiAgICBwX21vdW50Lm9wdGlvbnMgPT0gaV9tb3VudC5vcHRpb25zCgogICAgbW91bnRfc291cmNlX2FsbG93cyhwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkKCiAgICBwcmludCgiY2hlY2tfbW91bnQgMjogdHJ1ZSIpCn0KCm1vdW50X3NvdXJjZV9hbGxvd3MocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHJlZ2V4MSA6PSBwX21vdW50LnNvdXJjZQogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5tb3VudF9zb3VyY2VfY3BhdGgpCiAgICByZWdleDQgOj0gcmVwbGFjZShyZWdleDMsICIkKGJ1bmRsZS1pZCkiLCBidW5kbGVfaWQpCgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMTogcmVnZXg0ID0iLCByZWdleDQpCiAgICByZWdleC5tYXRjaChyZWdleDQsIGlfbW91bnQuc291cmNlKQoKICAgIHByaW50KCJtb3VudF9zb3VyY2VfYWxsb3dzIDE6IHRydWUiKQp9Cm1vdW50X3NvdXJjZV9hbGxvd3MocF9tb3VudCwgaV9tb3VudCwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHJlZ2V4MSA6PSBwX21vdW50LnNvdXJjZQogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5tb3VudF9zb3VyY2VfY3BhdGgpCiAgICByZWdleDQgOj0gcmVwbGFjZShyZWdleDMsICIkKHNhbmRib3gtaWQpIiwgc2FuZGJveF9pZCkKCiAgICBwcmludCgibW91bnRfc291cmNlX2FsbG93cyAyOiByZWdleDQgPSIsIHJlZ2V4NCkKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4NCwgaV9tb3VudC5zb3VyY2UpCgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMjogdHJ1ZSIpCn0KbW91bnRfc291cmNlX2FsbG93cyhwX21vdW50LCBpX21vdW50LCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogaV9tb3VudC5zb3VyY2UgPSIsIGlfbW91bnQuc291cmNlKQogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogaV9zdG9yYWdlLm1vdW50X3BvaW50ID0iLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCgogICAgaV9tb3VudC5zb3VyY2UgPT0gaV9zdG9yYWdlLm1vdW50X3BvaW50CgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMzogdHJ1ZSIpCn0KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBDcmVhdGUgY29udGFpbmVyIFN0b3JhZ2VzCgphbGxvd19zdG9yYWdlcyhwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHBfY291bnQgOj0gY291bnQocF9zdG9yYWdlcykKICAgIGlfY291bnQgOj0gY291bnQoaV9zdG9yYWdlcykKICAgIHByaW50KCJhbGxvd19zdG9yYWdlczogcF9jb3VudCA9IiwgcF9jb3VudCwgImlfY291bnQgPSIsIGlfY291bnQpCgogICAgcF9jb3VudCA9PSBpX2NvdW50CgogICAgIyBHZXQgdGhlIGNvbnRhaW5lciBpbWFnZSBsYXllciBJRHMgYW5kIHZlcml0eSByb290IGhhc2hlcywgZnJvbSB0aGUgIm92ZXJsYXlmcyIgc3RvcmFnZS4KICAgIHNvbWUgb3ZlcmxheV9zdG9yYWdlIGluIHBfc3RvcmFnZXMKICAgIG92ZXJsYXlfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIHByaW50KCJhbGxvd19zdG9yYWdlczogb3ZlcmxheV9zdG9yYWdlID0iLCBvdmVybGF5X3N0b3JhZ2UpCiAgICBjb3VudChvdmVybGF5X3N0b3JhZ2Uub3B0aW9ucykgPT0gMgoKICAgIGxheWVyX2lkcyA6PSBzcGxpdChvdmVybGF5X3N0b3JhZ2Uub3B0aW9uc1swXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiBsYXllcl9pZHMgPSIsIGxheWVyX2lkcykKCiAgICByb290X2hhc2hlcyA6PSBzcGxpdChvdmVybGF5X3N0b3JhZ2Uub3B0aW9uc1sxXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiByb290X2hhc2hlcyA9Iiwgcm9vdF9oYXNoZXMpCgogICAgZXZlcnkgaV9zdG9yYWdlIGluIGlfc3RvcmFnZXMgewogICAgICAgIGFsbG93X3N0b3JhZ2UocF9zdG9yYWdlcywgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpCiAgICB9CgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2VzOiB0cnVlIikKfQoKYWxsb3dfc3RvcmFnZShwX3N0b3JhZ2VzLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgc29tZSBwX3N0b3JhZ2UgaW4gcF9zdG9yYWdlcwoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiBwX3N0b3JhZ2UgPSIsIHBfc3RvcmFnZSkKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiBpX3N0b3JhZ2UgPSIsIGlfc3RvcmFnZSkKCiAgICBwX3N0b3JhZ2UuZHJpdmVyICAgICAgICAgICA9PSBpX3N0b3JhZ2UuZHJpdmVyCiAgICBwX3N0b3JhZ2UuZHJpdmVyX29wdGlvbnMgICA9PSBpX3N0b3JhZ2UuZHJpdmVyX29wdGlvbnMKICAgIHBfc3RvcmFnZS5mc19ncm91cCAgICAgICAgID09IGlfc3RvcmFnZS5mc19ncm91cAogICAgcF9zdG9yYWdlLmZzdHlwZSAgICAgICAgICAgPT0gaV9zdG9yYWdlLmZzdHlwZQoKICAgIGFsbG93X3N0b3JhZ2Vfc291cmNlKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKQogICAgYWxsb3dfc3RvcmFnZV9vcHRpb25zKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKQogICAgYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKQoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlOiB0cnVlIikKfQoKYWxsb3dfc3RvcmFnZV9zb3VyY2UocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX3NvdXJjZSAxOiBzdGFydCIpCgogICAgcF9zdG9yYWdlLnNvdXJjZSA9PSBpX3N0b3JhZ2Uuc291cmNlCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDE6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX3NvdXJjZShwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDI6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCgogICAgIyBEREREOkJCOkRELkY6IERvbWFpbjpCdXM6RGV2aWNlLkZ1bmN0aW9uCiAgICAjIGh0dHBzOi8vd3d3Lmtlcm5lbC5vcmcvZG9jL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtYnVzLXBjaQogICAgcmVnZXgubWF0Y2goYF5bYS1mMC05XXs0fTpbYS1mMC05XXsyfTpbYS1mMC05XXsyfVwuW2EtZjAtOV0kYCwgaV9zdG9yYWdlLnNvdXJjZSkKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9zb3VyY2UgMjogdHJ1ZSIpCn0KCmFsbG93X3N0b3JhZ2Vfc291cmNlKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKSB7CiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9zb3VyY2UgMzogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIGlfc3RvcmFnZS5zb3VyY2UgPT0gIm5vbmUiCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDM6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX3NvdXJjZShwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDQ6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJzbWIiCgogICAgIyBQYXR0ZXJuOiAvLzxzdG9yYWdlLWFjY291bnQtbmFtZT4uZmlsZS5jb3JlLndpbmRvd3MubmV0LzxrOHMtUFZDLW5hbWU+CiAgICAjIFN0b3JhZ2UgYWNjb3VudCBuYW1lOiBodHRwczovL2xlYXJuLm1pY3Jvc29mdC5jb20vZW4tdXMvYXp1cmUvc3RvcmFnZS9jb21tb24vc3RvcmFnZS1hY2NvdW50LW92ZXJ2aWV3I3N0b3JhZ2UtYWNjb3VudC1uYW1lCiAgICAjIEs4cyBQVkMgbmFtZTogaHR0cHM6Ly9rdWJlcm5ldGVzLmlvL2RvY3MvY29uY2VwdHMvb3ZlcnZpZXcvd29ya2luZy13aXRoLW9iamVjdHMvbmFtZXMvI2Rucy1zdWJkb21haW4tbmFtZXMKICAgIHJlZ2V4Lm1hdGNoKGBeXC9cLyhbYS16MC05XXszLDI0fSlcLmZpbGVcLmNvcmVcLndpbmRvd3NcLm5ldFwvW2EtejAtOV0oW2EtejAtOS4tXXswLDI1MX1bYS16MC05XSk/JGAsIGlfc3RvcmFnZS5zb3VyY2UpCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfc291cmNlIDQ6IHRydWUiKQp9CgphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMTogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgIT0gIm92ZXJsYXlmcyIKICAgIHBfc3RvcmFnZS5vcHRpb25zID09IGlfc3RvcmFnZS5vcHRpb25zCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAxOiB0cnVlIikKfQphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gIm92ZXJsYXlmcyIKICAgIGNvdW50KHBfc3RvcmFnZS5vcHRpb25zKSA9PSAyCgogICAgcG9saWN5X2lkcyA6PSBzcGxpdChwX3N0b3JhZ2Uub3B0aW9uc1swXSwgIjoiKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBwb2xpY3lfaWRzID0iLCBwb2xpY3lfaWRzKQogICAgcG9saWN5X2lkcyA9PSBsYXllcl9pZHMKCiAgICBwb2xpY3lfaGFzaGVzIDo9IHNwbGl0KHBfc3RvcmFnZS5vcHRpb25zWzFdLCAiOiIpCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IHBvbGljeV9oYXNoZXMgPSIsIHBvbGljeV9oYXNoZXMpCgogICAgcF9jb3VudCA6PSBjb3VudChwb2xpY3lfaWRzKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBwX2NvdW50ID0iLCBwX2NvdW50KQogICAgcF9jb3VudCA+PSAxCiAgICBwX2NvdW50ID09IGNvdW50KHBvbGljeV9oYXNoZXMpCgogICAgaV9jb3VudCA6PSBjb3VudChpX3N0b3JhZ2Uub3B0aW9ucykKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogaV9jb3VudCA9IiwgaV9jb3VudCkKICAgIGlfY291bnQgPT0gcF9jb3VudCArIDMKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zWzBdID0iLCBpX3N0b3JhZ2Uub3B0aW9uc1swXSkKICAgIGlfc3RvcmFnZS5vcHRpb25zWzBdID09ICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQubGF5ZXItc3JjLXByZWZpeD0vdmFyL2xpYi9jb250YWluZXJkL2lvLmNvbnRhaW5lcmQuc25hcHNob3R0ZXIudjEudGFyZGV2L2xheWVycyIKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zW2lfY291bnQgLSAyXSA9IiwgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDJdKQogICAgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDJdID09ICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQub3ZlcmxheS1ydyIKCiAgICBsb3dlcmRpciA6PSBjb25jYXQoIj0iLCBbImxvd2VyZGlyIiwgcF9zdG9yYWdlLm9wdGlvbnNbMF1dKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBsb3dlcmRpciA9IiwgbG93ZXJkaXIpCgogICAgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDFdID09IGxvd2VyZGlyCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zW2lfY291bnQgLSAxXSA9IiwgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDFdKQoKICAgIGV2ZXJ5IGksIHBvbGljeV9pZCBpbiBwb2xpY3lfaWRzIHsKICAgICAgICBhbGxvd19vdmVybGF5X2xheWVyKHBvbGljeV9pZCwgcG9saWN5X2hhc2hlc1tpXSwgaV9zdG9yYWdlLm9wdGlvbnNbaSArIDFdKQogICAgfQoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogdHJ1ZSIpCn0KYWxsb3dfc3RvcmFnZV9vcHRpb25zKHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKSB7CiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDM6IHN0YXJ0IikKCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCiAgICBjb3VudChwX3N0b3JhZ2Uub3B0aW9ucykgPT0gMQoKICAgIHN0YXJ0c3dpdGgocF9zdG9yYWdlLm9wdGlvbnNbMF0sICIkKGhhc2giKQogICAgaGFzaF9zdWZmaXggOj0gdHJpbV9sZWZ0KHBfc3RvcmFnZS5vcHRpb25zWzBdLCAiJChoYXNoIikKCiAgICBlbmRzd2l0aChoYXNoX3N1ZmZpeCwgIikiKQogICAgaGFzaF9pbmRleCA6PSB0cmltX3JpZ2h0KGhhc2hfc3VmZml4LCAiKSIpCiAgICBpIDo9IHRvX251bWJlcihoYXNoX2luZGV4KQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAzOiBpID0iLCBpKQoKICAgIGhhc2hfb3B0aW9uIDo9IGNvbmNhdCgiPSIsIFsiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LnJvb3QtaGFzaCIsIHJvb3RfaGFzaGVzW2ldXSkKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMzogaGFzaF9vcHRpb24gPSIsIGhhc2hfb3B0aW9uKQoKICAgIGNvdW50KGlfc3RvcmFnZS5vcHRpb25zKSA9PSA0CiAgICBpX3N0b3JhZ2Uub3B0aW9uc1swXSA9PSAicm8iCiAgICBpX3N0b3JhZ2Uub3B0aW9uc1sxXSA9PSAiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmJsb2NrX2RldmljZT1maWxlIgogICAgaV9zdG9yYWdlLm9wdGlvbnNbMl0gPT0gImlvLmthdGFjb250YWluZXJzLmZzLW9wdC5pcy1sYXllciIKICAgIGlfc3RvcmFnZS5vcHRpb25zWzNdID09IGhhc2hfb3B0aW9uCgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAzOiB0cnVlIikKfQphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgNDogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gInNtYiIKICAgIHBfb3B0c19jb3VudCA6PSBjb3VudChwX3N0b3JhZ2Uub3B0aW9ucykKICAgIGlfb3B0c19jb3VudCA6PSBjb3VudChpX3N0b3JhZ2Uub3B0aW9ucykKICAgIGlfb3B0c19jb3VudCA9PSBwX29wdHNfY291bnQgKyAyCgogICAgaV9vcHRfbWF0Y2hlcyA6PSBbaSB8IGkgOj0gaWR4OyBpZHggPCBwX29wdHNfY291bnQ7IHBfc3RvcmFnZS5vcHRpb25zW2lkeF0gPT0gaV9zdG9yYWdlLm9wdGlvbnNbaWR4XV0KICAgIGNvdW50KGlfb3B0X21hdGNoZXMpID09IHBfb3B0c19jb3VudAoKICAgIHN0YXJ0c3dpdGgoaV9zdG9yYWdlLm9wdGlvbnNbaV9vcHRzX2NvdW50LTJdLCAiYWRkcj0iKQogICAgY3JlZHMgPSBzcGxpdChpX3N0b3JhZ2Uub3B0aW9uc1tpX29wdHNfY291bnQtMV0sICIsIikKICAgIGNvdW50KGNyZWRzKSA9PSAyCiAgICBzdGFydHN3aXRoKGNyZWRzWzBdLCAidXNlcm5hbWU9IikKICAgIHN0YXJ0c3dpdGgoY3JlZHNbMV0sICJwYXNzd29yZD0iKQogICAgCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDQ6IHRydWUiKQp9CgphbGxvd19vdmVybGF5X2xheWVyKHBvbGljeV9pZCwgcG9saWN5X2hhc2gsIGlfb3B0aW9uKSB7CiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogcG9saWN5X2lkID0iLCBwb2xpY3lfaWQsICJwb2xpY3lfaGFzaCA9IiwgcG9saWN5X2hhc2gpCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogaV9vcHRpb24gPSIsIGlfb3B0aW9uKQoKICAgIHN0YXJ0c3dpdGgoaV9vcHRpb24sICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQubGF5ZXI9IikKICAgIGlfdmFsdWUgOj0gcmVwbGFjZShpX29wdGlvbiwgImlvLmthdGFjb250YWluZXJzLmZzLW9wdC5sYXllcj0iLCAiIikKICAgIGlfdmFsdWVfZGVjb2RlZCA6PSBiYXNlNjQuZGVjb2RlKGlfdmFsdWUpCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogaV92YWx1ZV9kZWNvZGVkID0iLCBpX3ZhbHVlX2RlY29kZWQpCgogICAgcG9saWN5X3N1ZmZpeCA6PSBjb25jYXQoIj0iLCBbInRhcixybyxpby5rYXRhY29udGFpbmVycy5mcy1vcHQuYmxvY2tfZGV2aWNlPWZpbGUsaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmlzLWxheWVyLGlvLmthdGFjb250YWluZXJzLmZzLW9wdC5yb290LWhhc2giLCBwb2xpY3lfaGFzaF0pCiAgICBwX3ZhbHVlIDo9IGNvbmNhdCgiLCIsIFtwb2xpY3lfaWQsIHBvbGljeV9zdWZmaXhdKQogICAgcHJpbnQoImFsbG93X292ZXJsYXlfbGF5ZXI6IHBfdmFsdWUgPSIsIHBfdmFsdWUpCgogICAgcF92YWx1ZSA9PSBpX3ZhbHVlX2RlY29kZWQKCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogdHJ1ZSIpCn0KCmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAidGFyIgoKICAgIHN0YXJ0c3dpdGgocF9zdG9yYWdlLm1vdW50X3BvaW50LCAiJChsYXllciIpCiAgICBtb3VudF9zdWZmaXggOj0gdHJpbV9sZWZ0KHBfc3RvcmFnZS5tb3VudF9wb2ludCwgIiQobGF5ZXIiKQoKICAgIGVuZHN3aXRoKG1vdW50X3N1ZmZpeCwgIikiKQogICAgbGF5ZXJfaW5kZXggOj0gdHJpbV9yaWdodChtb3VudF9zdWZmaXgsICIpIikKICAgIGkgOj0gdG9fbnVtYmVyKGxheWVyX2luZGV4KQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDE6IGkgPSIsIGkpCgogICAgbGF5ZXJfaWQgOj0gbGF5ZXJfaWRzW2ldCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMTogbGF5ZXJfaWQgPSIsIGxheWVyX2lkKQoKICAgIHBfbW91bnQgOj0gY29uY2F0KCIvIiwgWyIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L2xheWVycyIsIGxheWVyX2lkXSkKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCAxOiBwX21vdW50ID0iLCBwX21vdW50KQoKICAgIHBfbW91bnQgPT0gaV9zdG9yYWdlLm1vdW50X3BvaW50CgogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDE6IHRydWUiKQp9CmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAiZnVzZTMua2F0YS1vdmVybGF5IgoKICAgIG1vdW50MSA6PSByZXBsYWNlKHBfc3RvcmFnZS5tb3VudF9wb2ludCwgIiQoY3BhdGgpIiwgcG9saWN5X2RhdGEuY29tbW9uLmNwYXRoKQogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDI6IG1vdW50MiA9IiwgbW91bnQyKQoKICAgIG1vdW50MiA9PSBpX3N0b3JhZ2UubW91bnRfcG9pbnQKCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMjogdHJ1ZSIpCn0KYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKSB7CiAgICBwX3N0b3JhZ2UuZnN0eXBlID09ICJsb2NhbCIKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQyID0iLCBtb3VudDIpCgogICAgbW91bnQzIDo9IHJlcGxhY2UobW91bnQyLCAiJChzYW5kYm94LWlkKSIsIHNhbmRib3hfaWQpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQzID0iLCBtb3VudDMpCgogICAgcmVnZXgubWF0Y2gobW91bnQzLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCgogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDM6IHRydWUiKQp9CmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAiYmluZCIKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNDogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNDogbW91bnQyID0iLCBtb3VudDIpCgogICAgbW91bnQzIDo9IHJlcGxhY2UobW91bnQyLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDQ6IG1vdW50MyA9IiwgbW91bnQzKQoKICAgIHJlZ2V4Lm1hdGNoKG1vdW50MywgaV9zdG9yYWdlLm1vdW50X3BvaW50KQoKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA0OiB0cnVlIikKfQphbGxvd19tb3VudF9wb2ludChwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgYnVuZGxlX2lkLCBzYW5kYm94X2lkLCBsYXllcl9pZHMpIHsKICAgIHBfc3RvcmFnZS5mc3R5cGUgPT0gInRtcGZzIgoKICAgIG1vdW50MSA6PSBwX3N0b3JhZ2UubW91bnRfcG9pbnQKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA1OiBtb3VudDEgPSIsIG1vdW50MSkKCiAgICByZWdleC5tYXRjaChtb3VudDEsIGlfc3RvcmFnZS5tb3VudF9wb2ludCkKCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNTogdHJ1ZSIpCn0KYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKSB7CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogaV9zdG9yYWdlLm1vdW50X3BvaW50ID0iLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCiAgICBhbGxvd19kaXJlY3Rfdm9sX2RyaXZlcihwX3N0b3JhZ2UsIGlfc3RvcmFnZSkKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChzcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQyID0iLCBtb3VudDIpCgogICAgZGlyZWN0X3ZvbF9wYXRoIDo9IGlfc3RvcmFnZS5zb3VyY2UKICAgIG1vdW50MyA6PSByZXBsYWNlKG1vdW50MiwgIiQoYjY0LWRpcmVjdC12b2wtcGF0aCkiLCBiYXNlNjR1cmwuZW5jb2RlKGRpcmVjdF92b2xfcGF0aCkpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQzID0iLCBtb3VudDMpCgogICAgbW91bnQzID09IGlfc3RvcmFnZS5tb3VudF9wb2ludAoKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA2OiB0cnVlIikKfQoKYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIocF9zdG9yYWdlLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19kaXJlY3Rfdm9sX2RyaXZlciAxOiBzdGFydCIpCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCiAgICBwcmludCgiYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIgMTogdHJ1ZSIpCn0KYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIocF9zdG9yYWdlLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19kaXJlY3Rfdm9sX2RyaXZlciAyOiBzdGFydCIpCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJzbWIiCiAgICBwcmludCgiYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIgMjogdHJ1ZSIpCn0KCiMgRXhlY1Byb2Nlc3NSZXF1ZXN0LnByb2Nlc3MuQ2FwYWJpbGl0aWVzCmFsbG93X2V4ZWNfY2FwcyhpX2NhcHMpIHsKICAgIG5vdCBpX2NhcHMuQW1iaWVudAogICAgbm90IGlfY2Fwcy5Cb3VuZGluZwogICAgbm90IGlfY2Fwcy5FZmZlY3RpdmUKICAgIG5vdCBpX2NhcHMuSW5oZXJpdGFibGUKICAgIG5vdCBpX2NhcHMuUGVybWl0dGVkCn0KCiMgT0NJLlByb2Nlc3MuQ2FwYWJpbGl0aWVzCmFsbG93X2NhcHMocF9jYXBzLCBpX2NhcHMpIHsKICAgIHByaW50KCJhbGxvd19jYXBzOiBwb2xpY3kgQW1iaWVudCA9IiwgcF9jYXBzLkFtYmllbnQpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgQW1iaWVudCA9IiwgaV9jYXBzLkFtYmllbnQpCiAgICBtYXRjaF9jYXBzKHBfY2Fwcy5BbWJpZW50LCBpX2NhcHMuQW1iaWVudCkKCiAgICBwcmludCgiYWxsb3dfY2FwczogcG9saWN5IEJvdW5kaW5nID0iLCBwX2NhcHMuQm91bmRpbmcpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgQm91bmRpbmcgPSIsIGlfY2Fwcy5Cb3VuZGluZykKICAgIG1hdGNoX2NhcHMocF9jYXBzLkJvdW5kaW5nLCBpX2NhcHMuQm91bmRpbmcpCgogICAgcHJpbnQoImFsbG93X2NhcHM6IHBvbGljeSBFZmZlY3RpdmUgPSIsIHBfY2Fwcy5FZmZlY3RpdmUpCiAgICBwcmludCgiYWxsb3dfY2FwczogaW5wdXQgRWZmZWN0aXZlID0iLCBpX2NhcHMuRWZmZWN0aXZlKQogICAgbWF0Y2hfY2FwcyhwX2NhcHMuRWZmZWN0aXZlLCBpX2NhcHMuRWZmZWN0aXZlKQoKICAgIHByaW50KCJhbGxvd19jYXBzOiBwb2xpY3kgSW5oZXJpdGFibGUgPSIsIHBfY2Fwcy5Jbmhlcml0YWJsZSkKICAgIHByaW50KCJhbGxvd19jYXBzOiBpbnB1dCBJbmhlcml0YWJsZSA9IiwgaV9jYXBzLkluaGVyaXRhYmxlKQogICAgbWF0Y2hfY2FwcyhwX2NhcHMuSW5oZXJpdGFibGUsIGlfY2Fwcy5Jbmhlcml0YWJsZSkKCiAgICBwcmludCgiYWxsb3dfY2FwczogcG9saWN5IFBlcm1pdHRlZCA9IiwgcF9jYXBzLlBlcm1pdHRlZCkKICAgIHByaW50KCJhbGxvd19jYXBzOiBpbnB1dCBQZXJtaXR0ZWQgPSIsIGlfY2Fwcy5QZXJtaXR0ZWQpCiAgICBtYXRjaF9jYXBzKHBfY2Fwcy5QZXJtaXR0ZWQsIGlfY2Fwcy5QZXJtaXR0ZWQpCn0KCm1hdGNoX2NhcHMocF9jYXBzLCBpX2NhcHMpIHsKICAgIHByaW50KCJtYXRjaF9jYXBzIDE6IHN0YXJ0IikKCiAgICBwX2NhcHMgPT0gaV9jYXBzCgogICAgcHJpbnQoIm1hdGNoX2NhcHMgMTogdHJ1ZSIpCn0KbWF0Y2hfY2FwcyhwX2NhcHMsIGlfY2FwcykgewogICAgcHJpbnQoIm1hdGNoX2NhcHMgMjogc3RhcnQiKQoKICAgIGNvdW50KHBfY2FwcykgPT0gMQogICAgcF9jYXBzWzBdID09ICIkKGRlZmF1bHRfY2FwcykiCgogICAgcHJpbnQoIm1hdGNoX2NhcHMgMjogZGVmYXVsdF9jYXBzID0iLCBwb2xpY3lfZGF0YS5jb21tb24uZGVmYXVsdF9jYXBzKQogICAgcG9saWN5X2RhdGEuY29tbW9uLmRlZmF1bHRfY2FwcyA9PSBpX2NhcHMKCiAgICBwcmludCgibWF0Y2hfY2FwcyAyOiB0cnVlIikKfQptYXRjaF9jYXBzKHBfY2FwcywgaV9jYXBzKSB7CiAgICBwcmludCgibWF0Y2hfY2FwcyAzOiBzdGFydCIpCgogICAgY291bnQocF9jYXBzKSA9PSAxCiAgICBwX2NhcHNbMF0gPT0gIiQocHJpdmlsZWdlZF9jYXBzKSIKCiAgICBwcmludCgibWF0Y2hfY2FwcyAzOiBwcml2aWxlZ2VkX2NhcHMgPSIsIHBvbGljeV9kYXRhLmNvbW1vbi5wcml2aWxlZ2VkX2NhcHMpCiAgICBwb2xpY3lfZGF0YS5jb21tb24ucHJpdmlsZWdlZF9jYXBzID09IGlfY2FwcwoKICAgIHByaW50KCJtYXRjaF9jYXBzIDM6IHRydWUiKQp9CgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgpjaGVja19kaXJlY3RvcnlfdHJhdmVyc2FsKGlfcGF0aCkgewogICAgbm90IHJlZ2V4Lm1hdGNoKCIoXnwvKS4uKCR8LykiLCBpX3BhdGgpCn0KCmNoZWNrX3N5bWxpbmtfc291cmNlKGlfc3JjKSB7CiAgICBpX3NyYyA9PSAiIgogICAgcHJpbnQoImNoZWNrX3N5bWxpbmtfc291cmNlIDE6IHRydWUiKQp9CmNoZWNrX3N5bWxpbmtfc291cmNlKGlfc3JjKSB7CiAgICBpX3NyYyAhPSAiIgogICAgcHJpbnQoImNoZWNrX3N5bWxpbmtfc291cmNlIDI6IGlfc3JjID0iLCBpX3NyYykKCiAgICByZWdleC5tYXRjaChwb2xpY3lfZGF0YS5jb21tb24uc19zb3VyY2UxLCBpX3NyYykKCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMjogdHJ1ZSIpCn0KY2hlY2tfc3ltbGlua19zb3VyY2UoaV9zcmMpIHsKICAgIGlfc3JjICE9ICIiCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMzogaV9zcmMgPSIsIGlfc3JjKQoKICAgIHJlZ2V4Lm1hdGNoKHBvbGljeV9kYXRhLmNvbW1vbi5zX3NvdXJjZTIsIGlfc3JjKQogICAgY2hlY2tfZGlyZWN0b3J5X3RyYXZlcnNhbChpX3NyYykKCiAgICBwcmludCgiY2hlY2tfc3ltbGlua19zb3VyY2UgMzogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfc3RvcmFnZXMoaV9zdG9yYWdlcykgewogICAgcHJpbnQoImFsbG93X3NhbmRib3hfc3RvcmFnZXM6IGlfc3RvcmFnZXMgPSIsIGlfc3RvcmFnZXMpCgogICAgcF9zdG9yYWdlcyA6PSBwb2xpY3lfZGF0YS5zYW5kYm94LnN0b3JhZ2VzCiAgICBldmVyeSBpX3N0b3JhZ2UgaW4gaV9zdG9yYWdlcyB7CiAgICAgICAgYWxsb3dfc2FuZGJveF9zdG9yYWdlKHBfc3RvcmFnZXMsIGlfc3RvcmFnZSkKICAgIH0KCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9zdG9yYWdlczogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfc3RvcmFnZShwX3N0b3JhZ2VzLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IGlfc3RvcmFnZSA9IiwgaV9zdG9yYWdlKQoKICAgIHNvbWUgcF9zdG9yYWdlIGluIHBfc3RvcmFnZXMKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IHBfc3RvcmFnZSA9IiwgcF9zdG9yYWdlKQogICAgaV9zdG9yYWdlID09IHBfc3RvcmFnZQoKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IHRydWUiKQp9CgpDb3B5RmlsZVJlcXVlc3QgewogICAgcHJpbnQoIkNvcHlGaWxlUmVxdWVzdDogaW5wdXQucGF0aCA9IiwgaW5wdXQucGF0aCkKCiAgICBjaGVja19zeW1saW5rX3NvdXJjZShpbnB1dC5zeW1saW5rX3NyYykKICAgIGNoZWNrX2RpcmVjdG9yeV90cmF2ZXJzYWwoaW5wdXQucGF0aCkKCiAgICBzb21lIHJlZ2V4MSBpbiBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLkNvcHlGaWxlUmVxdWVzdAogICAgcmVnZXgyIDo9IHJlcGxhY2UocmVnZXgxLCAiJChzZnByZWZpeCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc2ZwcmVmaXgpCiAgICByZWdleDMgOj0gcmVwbGFjZShyZWdleDIsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5jcGF0aCkKICAgIHJlZ2V4NCA6PSByZXBsYWNlKHJlZ2V4MywgIiQoYnVuZGxlLWlkKSIsIEJVTkRMRV9JRCkKICAgIHByaW50KCJDb3B5RmlsZVJlcXVlc3Q6IHJlZ2V4NCA9IiwgcmVnZXg0KQoKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4NCwgaW5wdXQucGF0aCkKCiAgICBwcmludCgiQ29weUZpbGVSZXF1ZXN0OiB0cnVlIikKfQoKQ3JlYXRlU2FuZGJveFJlcXVlc3QgewogICAgcHJpbnQoIkNyZWF0ZVNhbmRib3hSZXF1ZXN0OiBpbnB1dC5ndWVzdF9ob29rX3BhdGggPSIsIGlucHV0Lmd1ZXN0X2hvb2tfcGF0aCkKICAgIGNvdW50KGlucHV0Lmd1ZXN0X2hvb2tfcGF0aCkgPT0gMAoKICAgIHByaW50KCJDcmVhdGVTYW5kYm94UmVxdWVzdDogaW5wdXQua2VybmVsX21vZHVsZXMgPSIsIGlucHV0Lmtlcm5lbF9tb2R1bGVzKQogICAgY291bnQoaW5wdXQua2VybmVsX21vZHVsZXMpID09IDAKCiAgICBpX3BpZG5zIDo9IGlucHV0LnNhbmRib3hfcGlkbnMKICAgIHByaW50KCJDcmVhdGVTYW5kYm94UmVxdWVzdDogaV9waWRucyA9IiwgaV9waWRucykKICAgIGlfcGlkbnMgPT0gZmFsc2UKICAgIGFsbG93X3NhbmRib3hfc3RvcmFnZXMoaW5wdXQuc3RvcmFnZXMpCn0KCmFsbG93X2V4ZWMocF9jb250YWluZXIsIGlfcHJvY2VzcykgewogICAgcHJpbnQoImFsbG93X2V4ZWM6IHN0YXJ0IikKCiAgICBwX29jaSA9IHBfY29udGFpbmVyLk9DSQogICAgcF9zX25hbWUgPSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc19uYW1lc3BhY2UgPSBnZXRfc3RhdGVfdmFsKCJuYW1lc3BhY2UiKQogICAgYWxsb3dfcHJvYmVfcHJvY2VzcyhwX29jaS5Qcm9jZXNzLCBpX3Byb2Nlc3MsIHBfc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfZXhlYzogdHJ1ZSIpCn0KCmFsbG93X2ludGVyYWN0aXZlX2V4ZWMocF9jb250YWluZXIsIGlfcHJvY2VzcykgewogICAgcHJpbnQoImFsbG93X2ludGVyYWN0aXZlX2V4ZWM6IHN0YXJ0IikKCiAgICBwX29jaSA9IHBfY29udGFpbmVyLk9DSQogICAgcF9zX25hbWUgPSBwX29jaS5Bbm5vdGF0aW9uc1tTX05BTUVfS0VZXQogICAgc19uYW1lc3BhY2UgPSBnZXRfc3RhdGVfdmFsKCJuYW1lc3BhY2UiKQogICAgYWxsb3dfaW50ZXJhY3RpdmVfcHJvY2VzcyhwX29jaS5Qcm9jZXNzLCBpX3Byb2Nlc3MsIHBfc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfaW50ZXJhY3RpdmVfZXhlYzogdHJ1ZSIpCn0KCiMgVE9ETzogc2hvdWxkIG90aGVyIEV4ZWNQcm9jZXNzUmVxdWVzdCBpbnB1dCBkYXRhIGZpZWxkcyBiZSB2YWxpZGF0ZWQgYXMgd2VsbD8KRXhlY1Byb2Nlc3NSZXF1ZXN0IHsKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMTogaW5wdXQgPSIsIGlucHV0KQoKICAgIHNvbWUgcF9jb21tYW5kIGluIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuRXhlY1Byb2Nlc3NSZXF1ZXN0LmFsbG93ZWRfY29tbWFuZHMKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMTogcF9jb21tYW5kID0iLCBwX2NvbW1hbmQpCiAgICBwX2NvbW1hbmQgPT0gaW5wdXQucHJvY2Vzcy5BcmdzCgogICAgIyBUT0RPOiBtYXRjaCBwX2NvbnRhaW5lcidzIElEIHdpdGggdGhlIGlucHV0IGNvbnRhaW5lcl9pZC4KICAgIHNvbWUgcF9jb250YWluZXIgaW4gcG9saWN5X2RhdGEuY29udGFpbmVycwogICAgYWxsb3dfaW50ZXJhY3RpdmVfZXhlYyhwX2NvbnRhaW5lciwgaW5wdXQucHJvY2VzcykKCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDE6IHRydWUiKQp9CkV4ZWNQcm9jZXNzUmVxdWVzdCB7CiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDI6IGlucHV0ID0iLCBpbnB1dCkKCiAgICAjIFRPRE86IG1hdGNoIGlucHV0IGNvbnRhaW5lciBJRCB3aXRoIGl0cyBjb3JyZXNwb25kaW5nIGNvbnRhaW5lci5leGVjX2NvbW1hbmRzLgogICAgc29tZSBwX2NvbnRhaW5lciBpbiBwb2xpY3lfZGF0YS5jb250YWluZXJzCiAgICBzb21lIHBfY29tbWFuZCBpbiBwX2NvbnRhaW5lci5leGVjX2NvbW1hbmRzCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDI6IHBfY29tbWFuZCA9IiwgcF9jb21tYW5kKQoKICAgICMgVE9ETzogc2hvdWxkIG90aGVyIGlucHV0IGRhdGEgZmllbGRzIGJlIHZhbGlkYXRlZCBhcyB3ZWxsPwogICAgcF9jb21tYW5kID09IGlucHV0LnByb2Nlc3MuQXJncwoKICAgIGFsbG93X2V4ZWMocF9jb250YWluZXIsIGlucHV0LnByb2Nlc3MpCgogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAyOiB0cnVlIikKfQpFeGVjUHJvY2Vzc1JlcXVlc3QgewogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAzOiBpbnB1dCA9IiwgaW5wdXQpCgogICAgaV9jb21tYW5kID0gY29uY2F0KCIgIiwgaW5wdXQucHJvY2Vzcy5BcmdzKQogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAzOiBpX2NvbW1hbmQgPSIsIGlfY29tbWFuZCkKCiAgICBzb21lIHBfcmVnZXggaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5FeGVjUHJvY2Vzc1JlcXVlc3QucmVnZXgKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMzogcF9yZWdleCA9IiwgcF9yZWdleCkKCiAgICByZWdleC5tYXRjaChwX3JlZ2V4LCBpX2NvbW1hbmQpCgogICAgIyBUT0RPOiBtYXRjaCBwX2NvbnRhaW5lcidzIElEIHdpdGggdGhlIGlucHV0IGNvbnRhaW5lcl9pZC4KICAgIHNvbWUgcF9jb250YWluZXIgaW4gcG9saWN5X2RhdGEuY29udGFpbmVycwogICAgYWxsb3dfaW50ZXJhY3RpdmVfZXhlYyhwX2NvbnRhaW5lciwgaW5wdXQucHJvY2VzcykKCiAgICBwcmludCgiRXhlY1Byb2Nlc3NSZXF1ZXN0IDM6IHRydWUiKQp9CgpVcGRhdGVSb3V0ZXNSZXF1ZXN0IHsKICAgIHByaW50KCJVcGRhdGVSb3V0ZXNSZXF1ZXN0OiBpbnB1dCA9IiwgaW5wdXQpCiAgICBwcmludCgiVXBkYXRlUm91dGVzUmVxdWVzdDogcG9saWN5ID0iLCBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLlVwZGF0ZVJvdXRlc1JlcXVlc3QpCgogICAgaV9yb3V0ZXMgOj0gaW5wdXQucm91dGVzLlJvdXRlcwogICAgcF9zb3VyY2VfcmVnZXggPSBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLlVwZGF0ZVJvdXRlc1JlcXVlc3QuZm9yYmlkZGVuX3NvdXJjZV9yZWdleAogICAgcF9uYW1lcyA9IHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuVXBkYXRlUm91dGVzUmVxdWVzdC5mb3JiaWRkZW5fZGV2aWNlX25hbWVzCgogICAgZXZlcnkgaV9yb3V0ZSBpbiBpX3JvdXRlcyB7CiAgICAgICAgcHJpbnQoImlfcm91dGUuc291cmNlID0iLCBpX3JvdXRlLnNvdXJjZSkKICAgICAgICBldmVyeSBwX3JlZ2V4IGluIHBfc291cmNlX3JlZ2V4IHsKICAgICAgICAgICAgcHJpbnQoInBfcmVnZXggPSIsIHBfcmVnZXgpCiAgICAgICAgICAgIG5vdCByZWdleC5tYXRjaChwX3JlZ2V4LCBpX3JvdXRlLnNvdXJjZSkKICAgICAgICB9CgogICAgICAgIHByaW50KCJpX3JvdXRlLmRldmljZSA9IiwgaV9yb3V0ZS5kZXZpY2UpCiAgICAgICAgbm90IGlfcm91dGUuZGV2aWNlIGluIHBfbmFtZXMKICAgIH0KCiAgICBwcmludCgiVXBkYXRlUm91dGVzUmVxdWVzdDogdHJ1ZSIpCn0KClVwZGF0ZUludGVyZmFjZVJlcXVlc3QgewogICAgcHJpbnQoIlVwZGF0ZUludGVyZmFjZVJlcXVlc3Q6IGlucHV0ID0iLCBpbnB1dCkKICAgIHByaW50KCJVcGRhdGVJbnRlcmZhY2VSZXF1ZXN0OiBwb2xpY3kgPSIsIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuVXBkYXRlSW50ZXJmYWNlUmVxdWVzdCkKCiAgICBpX2ludGVyZmFjZSA6PSBpbnB1dC5pbnRlcmZhY2UKICAgIHBfZmxhZ3MgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmFsbG93X3Jhd19mbGFncwoKICAgICMgVHlwaWNhbGx5LCBqdXN0IElGRl9OT0FSUCBpcyB1c2VkLgogICAgYml0cy5hbmQoaV9pbnRlcmZhY2UucmF3X2ZsYWdzLCBiaXRzLm5lZ2F0ZShwX2ZsYWdzKSkgPT0gMAoKICAgIHBfbmFtZXMgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmZvcmJpZGRlbl9uYW1lcwoKICAgIG5vdCBpX2ludGVyZmFjZS5uYW1lIGluIHBfbmFtZXMKCiAgICBwX2h3YWRkcnMgOj0gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVJbnRlcmZhY2VSZXF1ZXN0LmZvcmJpZGRlbl9od19hZGRycwoKICAgIG5vdCBpX2ludGVyZmFjZS5od0FkZHIgaW4gcF9od2FkZHJzCgogICAgcHJpbnQoIlVwZGF0ZUludGVyZmFjZVJlcXVlc3Q6IHRydWUiKQp9CgpDbG9zZVN0ZGluUmVxdWVzdCB7CiAgICBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLkNsb3NlU3RkaW5SZXF1ZXN0ID09IHRydWUKfQoKUmVhZFN0cmVhbVJlcXVlc3QgewogICAgcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5SZWFkU3RyZWFtUmVxdWVzdCA9PSB0cnVlCn0KClVwZGF0ZUVwaGVtZXJhbE1vdW50c1JlcXVlc3QgewogICAgcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5VcGRhdGVFcGhlbWVyYWxNb3VudHNSZXF1ZXN0ID09IHRydWUKfQoKV3JpdGVTdHJlYW1SZXF1ZXN0IHsKICAgIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuV3JpdGVTdHJlYW1SZXF1ZXN0ID09IHRydWUKfQoKcG9saWN5X2RhdGEgOj0gewogICJjb250YWluZXJzIjogWwogICAgewogICAgICAiT0NJIjogewogICAgICAgICJWZXJzaW9uIjogIjEuMS4wLXJjLjEiLAogICAgICAgICJQcm9jZXNzIjogewogICAgICAgICAgIlRlcm1pbmFsIjogZmFsc2UsCiAgICAgICAgICAiVXNlciI6IHsKICAgICAgICAgICAgIlVJRCI6IDY1NTM1LAogICAgICAgICAgICAiR0lEIjogNjU1MzUsCiAgICAgICAgICAgICJBZGRpdGlvbmFsR2lkcyI6IFtdLAogICAgICAgICAgICAiVXNlcm5hbWUiOiAiIgogICAgICAgICAgfSwKICAgICAgICAgICJEZXByZWNhdGVkQXJncyI6IFsKICAgICAgICAgICAgIi9wYXVzZSIKICAgICAgICAgIF0sCiAgICAgICAgICAiQXJncyI6IFsKICAgICAgICAgICAgIi9wYXVzZSIKICAgICAgICAgIF0sCiAgICAgICAgICAiRW52IjogWwogICAgICAgICAgICAiUEFUSD0vdXNyL2xvY2FsL3NiaW46L3Vzci9sb2NhbC9iaW46L3Vzci9zYmluOi91c3IvYmluOi9zYmluOi9iaW4iCiAgICAgICAgICBdLAogICAgICAgICAgIkN3ZCI6ICIvIiwKICAgICAgICAgICJDYXBhYmlsaXRpZXMiOiB7CiAgICAgICAgICAgICJBbWJpZW50IjogW10sCiAgICAgICAgICAgICJCb3VuZGluZyI6IFsKICAgICAgICAgICAgICAiJChkZWZhdWx0X2NhcHMpIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiRWZmZWN0aXZlIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJJbmhlcml0YWJsZSI6IFtdLAogICAgICAgICAgICAiUGVybWl0dGVkIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICAiTm9OZXdQcml2aWxlZ2VzIjogdHJ1ZQogICAgICAgIH0sCiAgICAgICAgIlJvb3QiOiB7CiAgICAgICAgICAiUGF0aCI6ICIkKGNwYXRoKS8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgIlJlYWRvbmx5IjogdHJ1ZQogICAgICAgIH0sCiAgICAgICAgIk1vdW50cyI6IFsKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9wcm9jIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJwcm9jIiwKICAgICAgICAgICAgInR5cGVfIjogInByb2MiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2IiwKICAgICAgICAgICAgInNvdXJjZSI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJzdHJpY3RhdGltZSIsCiAgICAgICAgICAgICAgIm1vZGU9NzU1IiwKICAgICAgICAgICAgICAic2l6ZT02NTUzNmsiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L3B0cyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiZGV2cHRzIiwKICAgICAgICAgICAgInR5cGVfIjogImRldnB0cyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJuZXdpbnN0YW5jZSIsCiAgICAgICAgICAgICAgInB0bXhtb2RlPTA2NjYiLAogICAgICAgICAgICAgICJtb2RlPTA2MjAiLAogICAgICAgICAgICAgICJnaWQ9NSIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvc2htIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L3NobSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi9tcXVldWUiLAogICAgICAgICAgICAic291cmNlIjogIm1xdWV1ZSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJtcXVldWUiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvc3lzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJzeXNmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJzeXNmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2V0Yy9yZXNvbHYuY29uZiIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClyZXNvbHYuY29uZiQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJvIiwKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9kZXYiLAogICAgICAgICAgICAgICJub2V4ZWMiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0KICAgICAgICBdLAogICAgICAgICJBbm5vdGF0aW9ucyI6IHsKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmJ1bmRsZV9wYXRoIjogIi9ydW4vY29udGFpbmVyZC9pby5jb250YWluZXJkLnJ1bnRpbWUudjIudGFzay9rOHMuaW8vJChidW5kbGUtaWQpIiwKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIjogInBvZF9zYW5kYm94IiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSI6ICJzYW5kYm94IiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWlkIjogIl5bYS16MC05XXs2NH0kIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWxvZy1kaXJlY3RvcnkiOiAiXi92YXIvbG9nL3BvZHMvJChzYW5kYm94LW5hbWVzcGFjZSlfJChzYW5kYm94LW5hbWUpX1swLTlhLWZdezh9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezEyfSQiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZSI6ICJeZG5zXFwtdGVzdFxcLWE4NDg2NTNhXFwtNWMxN1xcLTQ4NWJcXC1iZTQ2XFwtZmFhMGMwZGExMTkyJCIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1uYW1lc3BhY2UiOiAiZG5zLTEzNzAiLAogICAgICAgICAgIm5lcmRjdGwvbmV0d29yay1uYW1lc3BhY2UiOiAiXi92YXIvcnVuL25ldG5zL2NuaS1bMC05YS1mXXs4fS1bMC05YS1mXXs0fS1bMC05YS1mXXs0fS1bMC05YS1mXXs0fS1bMC05YS1mXXsxMn0kIgogICAgICAgIH0sCiAgICAgICAgIkxpbnV4IjogewogICAgICAgICAgIk5hbWVzcGFjZXMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiVHlwZSI6ICJpcGMiLAogICAgICAgICAgICAgICJQYXRoIjogIiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJUeXBlIjogInV0cyIsCiAgICAgICAgICAgICAgIlBhdGgiOiAiIgogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgIlR5cGUiOiAibW91bnQiLAogICAgICAgICAgICAgICJQYXRoIjogIiIKICAgICAgICAgICAgfQogICAgICAgICAgXSwKICAgICAgICAgICJNYXNrZWRQYXRocyI6IFsKICAgICAgICAgICAgIi9wcm9jL2FjcGkiLAogICAgICAgICAgICAiL3Byb2MvYXNvdW5kIiwKICAgICAgICAgICAgIi9wcm9jL2tjb3JlIiwKICAgICAgICAgICAgIi9wcm9jL2tleXMiLAogICAgICAgICAgICAiL3Byb2MvbGF0ZW5jeV9zdGF0cyIsCiAgICAgICAgICAgICIvcHJvYy90aW1lcl9saXN0IiwKICAgICAgICAgICAgIi9wcm9jL3RpbWVyX3N0YXRzIiwKICAgICAgICAgICAgIi9wcm9jL3NjaGVkX2RlYnVnIiwKICAgICAgICAgICAgIi9zeXMvZmlybXdhcmUiLAogICAgICAgICAgICAiL3Byb2Mvc2NzaSIKICAgICAgICAgIF0sCiAgICAgICAgICAiUmVhZG9ubHlQYXRocyI6IFsKICAgICAgICAgICAgIi9wcm9jL2J1cyIsCiAgICAgICAgICAgICIvcHJvYy9mcyIsCiAgICAgICAgICAgICIvcHJvYy9pcnEiLAogICAgICAgICAgICAiL3Byb2Mvc3lzIiwKICAgICAgICAgICAgIi9wcm9jL3N5c3JxLXRyaWdnZXIiCiAgICAgICAgICBdLAogICAgICAgICAgIkRldmljZXMiOiBbXSwKICAgICAgICAgICJTeXNjdGwiOiB7CiAgICAgICAgICAgICJuZXQuaXB2NC5pcF91bnByaXZpbGVnZWRfcG9ydF9zdGFydCI6ICIwIiwKICAgICAgICAgICAgIm5ldC5pcHY0LnBpbmdfZ3JvdXBfcmFuZ2UiOiAiMCAyMTQ3NDgzNjQ3IgogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSwKICAgICAgInN0b3JhZ2VzIjogWwogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2gwKSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjApIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAib3ZlcmxheWZzIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJmdXNlMy5rYXRhLW92ZXJsYXkiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICI1YTVhYWQ4MDA1NWZmMjAwMTJhNTBkYzI1ZjhkZjdhMjk5MjQ0NzQzMjRkNjVmN2Q1MzA2ZWU4ZWUyN2ZmNzFkIiwKICAgICAgICAgICAgIjgxNzI1MGYxYTNlMzM2ZGE3NmY1YmQzZmE3ODRlMWIyNmQ5NTliOWMxMzE4NzY4MTViYTI2MDQwNDhiNzBjMTgiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQoY3BhdGgpLyQoYnVuZGxlLWlkKSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfQogICAgICBdLAogICAgICAiZGV2aWNlcyI6IFtdLAogICAgICAic2FuZGJveF9waWRucyI6IGZhbHNlLAogICAgICAiZXhlY19jb21tYW5kcyI6IFtdLAogICAgICAiZW52X21hcCI6IHsKICAgICAgICAiUEFUSCI6ICIvdXNyL2xvY2FsL3NiaW46L3Vzci9sb2NhbC9iaW46L3Vzci9zYmluOi91c3IvYmluOi9zYmluOi9iaW4iCiAgICAgIH0KICAgIH0sCiAgICB7CiAgICAgICJPQ0kiOiB7CiAgICAgICAgIlZlcnNpb24iOiAiMS4xLjAtcmMuMSIsCiAgICAgICAgIlByb2Nlc3MiOiB7CiAgICAgICAgICAiVGVybWluYWwiOiBmYWxzZSwKICAgICAgICAgICJVc2VyIjogewogICAgICAgICAgICAiVUlEIjogMCwKICAgICAgICAgICAgIkdJRCI6IDAsCiAgICAgICAgICAgICJBZGRpdGlvbmFsR2lkcyI6IFtdLAogICAgICAgICAgICAiVXNlcm5hbWUiOiAiIgogICAgICAgICAgfSwKICAgICAgICAgICJEZXByZWNhdGVkQXJncyI6IFsKICAgICAgICAgICAgIi9hZ25ob3N0IiwKICAgICAgICAgICAgInRlc3Qtd2Vic2VydmVyIgogICAgICAgICAgXSwKICAgICAgICAgICJBcmdzIjogWwogICAgICAgICAgICAiL2Fnbmhvc3QiLAogICAgICAgICAgICAidGVzdC13ZWJzZXJ2ZXIiCiAgICAgICAgICBdLAogICAgICAgICAgIkVudiI6IFsKICAgICAgICAgICAgIlBBVEg9L3Vzci9sb2NhbC9zYmluOi91c3IvbG9jYWwvYmluOi91c3Ivc2JpbjovdXNyL2Jpbjovc2JpbjovYmluIiwKICAgICAgICAgICAgIkhPU1ROQU1FPSQoaG9zdC1uYW1lKSIKICAgICAgICAgIF0sCiAgICAgICAgICAiQ3dkIjogIi8iLAogICAgICAgICAgIkNhcGFiaWxpdGllcyI6IHsKICAgICAgICAgICAgIkFtYmllbnQiOiBbXSwKICAgICAgICAgICAgIkJvdW5kaW5nIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJFZmZlY3RpdmUiOiBbCiAgICAgICAgICAgICAgIiQoZGVmYXVsdF9jYXBzKSIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgIkluaGVyaXRhYmxlIjogW10sCiAgICAgICAgICAgICJQZXJtaXR0ZWQiOiBbCiAgICAgICAgICAgICAgIiQoZGVmYXVsdF9jYXBzKSIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgICJOb05ld1ByaXZpbGVnZXMiOiBmYWxzZQogICAgICAgIH0sCiAgICAgICAgIlJvb3QiOiB7CiAgICAgICAgICAiUGF0aCI6ICIkKGNwYXRoKS8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgIlJlYWRvbmx5IjogZmFsc2UKICAgICAgICB9LAogICAgICAgICJNb3VudHMiOiBbCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvcHJvYyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAicHJvYyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJwcm9jIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAgICAgIm5vZGV2IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2RldiIsCiAgICAgICAgICAgICJzb3VyY2UiOiAidG1wZnMiLAogICAgICAgICAgICAidHlwZV8iOiAidG1wZnMiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAic3RyaWN0YXRpbWUiLAogICAgICAgICAgICAgICJtb2RlPTc1NSIsCiAgICAgICAgICAgICAgInNpemU9NjU1MzZrIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi9wdHMiLAogICAgICAgICAgICAic291cmNlIjogImRldnB0cyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJkZXZwdHMiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibmV3aW5zdGFuY2UiLAogICAgICAgICAgICAgICJwdG14bW9kZT0wNjY2IiwKICAgICAgICAgICAgICAibW9kZT0wNjIwIiwKICAgICAgICAgICAgICAiZ2lkPTUiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L3NobSIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiL3J1bi9rYXRhLWNvbnRhaW5lcnMvc2FuZGJveC9zaG0iLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvbXF1ZXVlIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJtcXVldWUiLAogICAgICAgICAgICAidHlwZV8iOiAibXF1ZXVlIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAgICAgIm5vZGV2IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL3N5cyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAic3lzZnMiLAogICAgICAgICAgICAidHlwZV8iOiAic3lzZnMiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiLAogICAgICAgICAgICAgICJybyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9zeXMvZnMvY2dyb3VwIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJjZ3JvdXAiLAogICAgICAgICAgICAidHlwZV8iOiAiY2dyb3VwIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAgICAgIm5vZGV2IiwKICAgICAgICAgICAgICAicmVsYXRpbWUiLAogICAgICAgICAgICAgICJybyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9ldGMvaG9zdHMiLAogICAgICAgICAgICAic291cmNlIjogIiQoc2ZwcmVmaXgpaG9zdHMkIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJ3IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi90ZXJtaW5hdGlvbi1sb2ciLAogICAgICAgICAgICAic291cmNlIjogIiQoc2ZwcmVmaXgpdGVybWluYXRpb24tbG9nJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJydyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9ldGMvaG9zdG5hbWUiLAogICAgICAgICAgICAic291cmNlIjogIiQoc2ZwcmVmaXgpaG9zdG5hbWUkIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJ3IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2V0Yy9yZXNvbHYuY29uZiIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClyZXNvbHYuY29uZiQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicnciCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvdmFyL3J1bi9zZWNyZXRzL2t1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQiLAogICAgICAgICAgICAic291cmNlIjogIiQoc2ZwcmVmaXgpc2VydmljZWFjY291bnQkIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL3Zhci9ydW4vc2VjcmV0cy9henVyZS90b2tlbnMiLAogICAgICAgICAgICAic291cmNlIjogIiQoc2ZwcmVmaXgpdG9rZW5zJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJybyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9yZXN1bHRzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJeJChjcGF0aCkvJChzYW5kYm94LWlkKS9sb2NhbC9yZXN1bHRzJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJsb2NhbCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicnciCiAgICAgICAgICAgIF0KICAgICAgICAgIH0KICAgICAgICBdLAogICAgICAgICJBbm5vdGF0aW9ucyI6IHsKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmJ1bmRsZV9wYXRoIjogIi9ydW4vY29udGFpbmVyZC9pby5jb250YWluZXJkLnJ1bnRpbWUudjIudGFzay9rOHMuaW8vJChidW5kbGUtaWQpIiwKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIjogInBvZF9jb250YWluZXIiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLmNvbnRhaW5lci1uYW1lIjogIndlYnNlcnZlciIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLXR5cGUiOiAiY29udGFpbmVyIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5pbWFnZS1uYW1lIjogInJlZ2lzdHJ5Lms4cy5pby9lMmUtdGVzdC1pbWFnZXMvYWduaG9zdDoyLjQzIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWlkIjogIl5bYS16MC05XXs2NH0kIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LW5hbWUiOiAiXmRuc1xcLXRlc3RcXC1hODQ4NjUzYVxcLTVjMTdcXC00ODViXFwtYmU0NlxcLWZhYTBjMGRhMTE5MiQiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZXNwYWNlIjogImRucy0xMzcwIgogICAgICAgIH0sCiAgICAgICAgIkxpbnV4IjogewogICAgICAgICAgIk5hbWVzcGFjZXMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiVHlwZSI6ICJpcGMiLAogICAgICAgICAgICAgICJQYXRoIjogIiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJUeXBlIjogInV0cyIsCiAgICAgICAgICAgICAgIlBhdGgiOiAiIgogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgIlR5cGUiOiAibW91bnQiLAogICAgICAgICAgICAgICJQYXRoIjogIiIKICAgICAgICAgICAgfQogICAgICAgICAgXSwKICAgICAgICAgICJNYXNrZWRQYXRocyI6IFsKICAgICAgICAgICAgIi9wcm9jL2FjcGkiLAogICAgICAgICAgICAiL3Byb2Mva2NvcmUiLAogICAgICAgICAgICAiL3Byb2Mva2V5cyIsCiAgICAgICAgICAgICIvcHJvYy9sYXRlbmN5X3N0YXRzIiwKICAgICAgICAgICAgIi9wcm9jL3RpbWVyX2xpc3QiLAogICAgICAgICAgICAiL3Byb2MvdGltZXJfc3RhdHMiLAogICAgICAgICAgICAiL3Byb2Mvc2NoZWRfZGVidWciLAogICAgICAgICAgICAiL3Byb2Mvc2NzaSIsCiAgICAgICAgICAgICIvc3lzL2Zpcm13YXJlIgogICAgICAgICAgXSwKICAgICAgICAgICJSZWFkb25seVBhdGhzIjogWwogICAgICAgICAgICAiL3Byb2MvYXNvdW5kIiwKICAgICAgICAgICAgIi9wcm9jL2J1cyIsCiAgICAgICAgICAgICIvcHJvYy9mcyIsCiAgICAgICAgICAgICIvcHJvYy9pcnEiLAogICAgICAgICAgICAiL3Byb2Mvc3lzIiwKICAgICAgICAgICAgIi9wcm9jL3N5c3JxLXRyaWdnZXIiCiAgICAgICAgICBdLAogICAgICAgICAgIkRldmljZXMiOiBbXSwKICAgICAgICAgICJTeXNjdGwiOiB7CiAgICAgICAgICAgICJuZXQuaXB2NC5pcF91bnByaXZpbGVnZWRfcG9ydF9zdGFydCI6ICIwIiwKICAgICAgICAgICAgIm5ldC5pcHY0LnBpbmdfZ3JvdXBfcmFuZ2UiOiAiMCAyMTQ3NDgzNjQ3IgogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSwKICAgICAgInN0b3JhZ2VzIjogWwogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2gwKSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjApIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2gxKSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjEpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2gyKSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjIpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2gzKSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjMpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2g0KSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjQpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2g1KSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjUpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2g2KSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjYpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2g3KSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjcpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2g4KSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjgpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAiYmxrIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJ0YXIiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICIkKGhhc2g5KSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjkpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJkcml2ZXIiOiAib3ZlcmxheWZzIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICIiLAogICAgICAgICAgImZzdHlwZSI6ICJmdXNlMy5rYXRhLW92ZXJsYXkiLAogICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICI1MWYxZDVkZjllNWI2NDYzMjc3OWM5OTZhM2FiYjliMzJjYzY5Yzc2ZTBjMTc2MjBlZDZjZWZmMTVkM2YyODFhOmJmNGQwMTQ3ZjNhYmVhNTU1NTBhOGE2MTJiZGMxMTQ0Yjk2OTY2ZDUyMGMyNjdlMTU1MTZkNTE1N2NiMzliYWI6YjFiYjU3YTNlNWQwNjJmOWEzZGU0ZmUxYzJhZDIzMjgyMzNhNjgxN2FhMDRiYjI4ZjgzYjg2ZDgxNDUyYWY1YjpkYWVkNzE3ZWYyMTAwNjc0MjJjOTI3YzRlZGYyMjBjNDMzYTgwNzBjZDdmMGFjMDljNDUwNzlkYTI0NzVjNGYzOmUxZjY5NzliODZjOGVhZTEwYzY4YzE5ZjNiMDUwMzJkZmFiMWQ3NzAxODI3MjlhZGIzZDgwOGM3MGY3YjlmN2Y6MTUzNWY3OGEwN2Q1MjQwNWFkNzMxN2NiZmNlZGYwNGQ2MDBkZTQwYjE3ZTMxZjVhYjI1NTY2MTEwMDRhNWI1YToxOTE4YTA1MmZmZDIwNmU0NTlhMmFkYjcxY2FiZWJlZjAwY2NmNzQ0YzIyZGE2NGE4ZDhhOTRlMDkzZDY4MDNiOjIwN2VhMDBiNWRhZDA0NDVhNmM0NjU4MjZmMmZiNTcxM2JiNGRjY2EzNjk1MzFlMmE3ZjU5NWY1MzczOTU1OTY6OTUwMGU0NjYxN2ZiNDU4MjgyNDkyMWNlMjFmNTVhZWFhOTVhMzE5YmIzNGViZmMxMTkwNDJiZGUxOTk5NmVkYjpkYTU5ODBhN2UzNDM0NDA5ZGExMjMyNDE3YTFkMWNjMDI5NjdiNjJhMDk5NTAyY2FjZDEzY2MyZTM0MjA2ZmE0IiwKICAgICAgICAgICAgImVjZTVlZjIxNmM0MDA0N2FjY2YzOGQzYThiMTY4OTlkMTNiMjcxMjA2N2RkNDc4YTIxNzgzNzhlYzdmY2JmYzY6MTdhODM4YjAyMzQ3ODJlYjdmNmJjYWEwZmIyOGJlZjlmNjMwMjY4ZDJlMTJjM2IyODAyMmRhYmYxY2RiYTgxMjo5MzEwZjRiN2M4ZDczMGJlMDU1MDk2ZmI5ZTBkYmI3OTY0OWIwMmQwOTc4MzdkNjYwOWY5MjA5N2FiODA4MTk0OjFhNjQ0NzFmM2U5NjMwNjAyMGY1NWY4Y2YxN2FiNjliYzI2MDM3MGRmY2NmMzI2MjAwNDJmZjJjNjA2NzY3ZmI6ZjRkMmIyNDQ4NDJmMDVmNGIxYmU3NzA2OTQ2MWViZGNlNzM5NDVkNDMwYjA1ZjQ5YWY5YzU0MGE3YWQ2ZmVlMTphNzFmMDBkMjU4YWJlZTQxMGJhOTIyYjRiNTRjMzBkN2VhOGRjZGMwNWFlMzQ1ZTM1Y2ViMWU4YTdmYjBmZGI5OjIxNWE3ZWIwYjRhZDQ4NGQ1OTlmOTQ1YTVhZmIzNzAwODE4Y2JjZjc5Nzg3YzU5MzFjYjMzZTBiZDJmYThkZjU6YjExZWMyMjkwNTk3NTk3MTM1YTkxZGY4NDgxMjg3NDdiYTc2OGFkM2ZjYWYwYmI3NTBiMjkyMTZlMmUzYzJkMTo5ZjFhODI0NDU5MDExNTRjZjk5ZWQ3NmUyYjAwNzk3YWZhZmJlMmIxNDEzNjE1MWFhMGE3ZGVhNTZhNWM5ZjYzOjI1NGM1MzE0ODczYzI3YThkZTNkYjUzNDdmNTZlYmQ5ZWIyYmY0NmNjODgxMmE0MzYxMWY5OGUzOGFjMzdiYTIiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQoY3BhdGgpLyQoYnVuZGxlLWlkKSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImxvY2FsIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICJsb2NhbCIsCiAgICAgICAgICAiZnN0eXBlIjogImxvY2FsIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAibW9kZT0wNzc3IgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICJeJChjcGF0aCkvJChzYW5kYm94LWlkKS9sb2NhbC9yZXN1bHRzJCIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfQogICAgICBdLAogICAgICAiZGV2aWNlcyI6IFtdLAogICAgICAic2FuZGJveF9waWRucyI6IGZhbHNlLAogICAgICAiZXhlY19jb21tYW5kcyI6IFtdLAogICAgICAiZW52X21hcCI6IHsKICAgICAgICAiSE9TVE5BTUUiOiAiJChob3N0LW5hbWUpIiwKICAgICAgICAiUEFUSCI6ICIvdXNyL2xvY2FsL3NiaW46L3Vzci9sb2NhbC9iaW46L3Vzci9zYmluOi91c3IvYmluOi9zYmluOi9iaW4iCiAgICAgIH0KICAgIH0sCiAgICB7CiAgICAgICJPQ0kiOiB7CiAgICAgICAgIlZlcnNpb24iOiAiMS4xLjAtcmMuMSIsCiAgICAgICAgIlByb2Nlc3MiOiB7CiAgICAgICAgICAiVGVybWluYWwiOiBmYWxzZSwKICAgICAgICAgICJVc2VyIjogewogICAgICAgICAgICAiVUlEIjogMCwKICAgICAgICAgICAgIkdJRCI6IDAsCiAgICAgICAgICAgICJBZGRpdGlvbmFsR2lkcyI6IFtdLAogICAgICAgICAgICAiVXNlcm5hbWUiOiAiIgogICAgICAgICAgfSwKICAgICAgICAgICJEZXByZWNhdGVkQXJncyI6IFsKICAgICAgICAgICAgInNoIiwKICAgICAgICAgICAgIi1jIiwKICAgICAgICAgICAgImZvciBpIGluIGBzZXEgMSA2MDBgOyBkbyBjaGVjaz1cIiQkKGRpZyArbm90Y3AgK25vYWxsICthbnN3ZXIgK3NlYXJjaCBkbnMtdGVzdC1zZXJ2aWNlIEEpXCIgJiYgdGVzdCAtbiBcIiQkY2hlY2tcIiAmJiBlY2hvIE9LID4gL3Jlc3VsdHMvd2hlZXp5X3VkcEBkbnMtdGVzdC1zZXJ2aWNlO2NoZWNrPVwiJCQoZGlnICt0Y3AgK25vYWxsICthbnN3ZXIgK3NlYXJjaCBkbnMtdGVzdC1zZXJ2aWNlIEEpXCIgJiYgdGVzdCAtbiBcIiQkY2hlY2tcIiAmJiBlY2hvIE9LID4gL3Jlc3VsdHMvd2hlZXp5X3RjcEBkbnMtdGVzdC1zZXJ2aWNlO2NoZWNrPVwiJCQoZGlnICtub3RjcCArbm9hbGwgK2Fuc3dlciArc2VhcmNoIGRucy10ZXN0LXNlcnZpY2UuZG5zLTEzNzAgQSlcIiAmJiB0ZXN0IC1uIFwiJCRjaGVja1wiICYmIGVjaG8gT0sgPiAvcmVzdWx0cy93aGVlenlfdWRwQGRucy10ZXN0LXNlcnZpY2UuZG5zLTEzNzA7Y2hlY2s9XCIkJChkaWcgK3RjcCArbm9hbGwgK2Fuc3dlciArc2VhcmNoIGRucy10ZXN0LXNlcnZpY2UuZG5zLTEzNzAgQSlcIiAmJiB0ZXN0IC1uIFwiJCRjaGVja1wiICYmIGVjaG8gT0sgPiAvcmVzdWx0cy93aGVlenlfdGNwQGRucy10ZXN0LXNlcnZpY2UuZG5zLTEzNzA7Y2hlY2s9XCIkJChkaWcgK25vdGNwICtub2FsbCArYW5zd2VyICtzZWFyY2ggZG5zLXRlc3Qtc2VydmljZS5kbnMtMTM3MC5zdmMgQSlcIiAmJiB0ZXN0IC1uIFwiJCRjaGVja1wiICYmIGVjaG8gT0sgPiAvcmVzdWx0cy93aGVlenlfdWRwQGRucy10ZXN0LXNlcnZpY2UuZG5zLTEzNzAuc3ZjO2NoZWNrPVwiJCQoZGlnICt0Y3AgK25vYWxsICthbnN3ZXIgK3NlYXJjaCBkbnMtdGVzdC1zZXJ2aWNlLmRucy0xMzcwLnN2YyBBKVwiICYmIHRlc3QgLW4gXCIkJGNoZWNrXCIgJiYgZWNobyBPSyA+IC9yZXN1bHRzL3doZWV6eV90Y3BAZG5zLXRlc3Qtc2VydmljZS5kbnMtMTM3MC5zdmM7Y2hlY2s9XCIkJChkaWcgK25vdGNwICtub2FsbCArYW5zd2VyICtzZWFyY2ggX2h0dHAuX3RjcC5kbnMtdGVzdC1zZXJ2aWNlLmRucy0xMzcwLnN2YyBTUlYpXCIgJiYgdGVzdCAtbiBcIiQkY2hlY2tcIiAmJiBlY2hvIE9LID4gL3Jlc3VsdHMvd2hlZXp5X3VkcEBfaHR0cC5fdGNwLmRucy10ZXN0LXNlcnZpY2UuZG5zLTEzNzAuc3ZjO2NoZWNrPVwiJCQoZGlnICt0Y3AgK25vYWxsICthbnN3ZXIgK3NlYXJjaCBfaHR0cC5fdGNwLmRucy10ZXN0LXNlcnZpY2UuZG5zLTEzNzAuc3ZjIFNSVilcIiAmJiB0ZXN0IC1uIFwiJCRjaGVja1wiICYmIGVjaG8gT0sgPiAvcmVzdWx0cy93aGVlenlfdGNwQF9odHRwLl90Y3AuZG5zLXRlc3Qtc2VydmljZS5kbnMtMTM3MC5zdmM7Y2hlY2s9XCIkJChkaWcgK25vdGNwICtub2FsbCArYW5zd2VyICtzZWFyY2ggX2h0dHAuX3RjcC50ZXN0LXNlcnZpY2UtMi5kbnMtMTM3MC5zdmMgU1JWKVwiICYmIHRlc3QgLW4gXCIkJGNoZWNrXCIgJiYgZWNobyBPSyA+IC9yZXN1bHRzL3doZWV6eV91ZHBAX2h0dHAuX3RjcC50ZXN0LXNlcnZpY2UtMi5kbnMtMTM3MC5zdmM7Y2hlY2s9XCIkJChkaWcgK3RjcCArbm9hbGwgK2Fuc3dlciArc2VhcmNoIF9odHRwLl90Y3AudGVzdC1zZXJ2aWNlLTIuZG5zLTEzNzAuc3ZjIFNSVilcIiAmJiB0ZXN0IC1uIFwiJCRjaGVja1wiICYmIGVjaG8gT0sgPiAvcmVzdWx0cy93aGVlenlfdGNwQF9odHRwLl90Y3AudGVzdC1zZXJ2aWNlLTIuZG5zLTEzNzAuc3ZjO2NoZWNrPVwiJCQoZGlnICtub3RjcCArbm9hbGwgK2Fuc3dlciArc2VhcmNoIDc3LjY1LjAuMTAuaW4tYWRkci5hcnBhLiBQVFIpXCIgJiYgdGVzdCAtbiBcIiQkY2hlY2tcIiAmJiBlY2hvIE9LID4gL3Jlc3VsdHMvMTAuMC42NS43N191ZHBAUFRSO2NoZWNrPVwiJCQoZGlnICt0Y3AgK25vYWxsICthbnN3ZXIgK3NlYXJjaCA3Ny42NS4wLjEwLmluLWFkZHIuYXJwYS4gUFRSKVwiICYmIHRlc3QgLW4gXCIkJGNoZWNrXCIgJiYgZWNobyBPSyA+IC9yZXN1bHRzLzEwLjAuNjUuNzdfdGNwQFBUUjtzbGVlcCAxOyBkb25lIgogICAgICAgICAgXSwKICAgICAgICAgICJBcmdzIjogWwogICAgICAgICAgICAic2giLAogICAgICAgICAgICAiLWMiLAogICAgICAgICAgICAiZm9yIGkgaW4gYHNlcSAxIDYwMGA7IGRvIGNoZWNrPVwiJCQoZGlnICtub3RjcCArbm9hbGwgK2Fuc3dlciArc2VhcmNoIGRucy10ZXN0LXNlcnZpY2UgQSlcIiAmJiB0ZXN0IC1uIFwiJCRjaGVja1wiICYmIGVjaG8gT0sgPiAvcmVzdWx0cy93aGVlenlfdWRwQGRucy10ZXN0LXNlcnZpY2U7Y2hlY2s9XCIkJChkaWcgK3RjcCArbm9hbGwgK2Fuc3dlciArc2VhcmNoIGRucy10ZXN0LXNlcnZpY2UgQSlcIiAmJiB0ZXN0IC1uIFwiJCRjaGVja1wiICYmIGVjaG8gT0sgPiAvcmVzdWx0cy93aGVlenlfdGNwQGRucy10ZXN0LXNlcnZpY2U7Y2hlY2s9XCIkJChkaWcgK25vdGNwICtub2FsbCArYW5zd2VyICtzZWFyY2ggZG5zLXRlc3Qtc2VydmljZS5kbnMtMTM3MCBBKVwiICYmIHRlc3QgLW4gXCIkJGNoZWNrXCIgJiYgZWNobyBPSyA+IC9yZXN1bHRzL3doZWV6eV91ZHBAZG5zLXRlc3Qtc2VydmljZS5kbnMtMTM3MDtjaGVjaz1cIiQkKGRpZyArdGNwICtub2FsbCArYW5zd2VyICtzZWFyY2ggZG5zLXRlc3Qtc2VydmljZS5kbnMtMTM3MCBBKVwiICYmIHRlc3QgLW4gXCIkJGNoZWNrXCIgJiYgZWNobyBPSyA+IC9yZXN1bHRzL3doZWV6eV90Y3BAZG5zLXRlc3Qtc2VydmljZS5kbnMtMTM3MDtjaGVjaz1cIiQkKGRpZyArbm90Y3AgK25vYWxsICthbnN3ZXIgK3NlYXJjaCBkbnMtdGVzdC1zZXJ2aWNlLmRucy0xMzcwLnN2YyBBKVwiICYmIHRlc3QgLW4gXCIkJGNoZWNrXCIgJiYgZWNobyBPSyA+IC9yZXN1bHRzL3doZWV6eV91ZHBAZG5zLXRlc3Qtc2VydmljZS5kbnMtMTM3MC5zdmM7Y2hlY2s9XCIkJChkaWcgK3RjcCArbm9hbGwgK2Fuc3dlciArc2VhcmNoIGRucy10ZXN0LXNlcnZpY2UuZG5zLTEzNzAuc3ZjIEEpXCIgJiYgdGVzdCAtbiBcIiQkY2hlY2tcIiAmJiBlY2hvIE9LID4gL3Jlc3VsdHMvd2hlZXp5X3RjcEBkbnMtdGVzdC1zZXJ2aWNlLmRucy0xMzcwLnN2YztjaGVjaz1cIiQkKGRpZyArbm90Y3AgK25vYWxsICthbnN3ZXIgK3NlYXJjaCBfaHR0cC5fdGNwLmRucy10ZXN0LXNlcnZpY2UuZG5zLTEzNzAuc3ZjIFNSVilcIiAmJiB0ZXN0IC1uIFwiJCRjaGVja1wiICYmIGVjaG8gT0sgPiAvcmVzdWx0cy93aGVlenlfdWRwQF9odHRwLl90Y3AuZG5zLXRlc3Qtc2VydmljZS5kbnMtMTM3MC5zdmM7Y2hlY2s9XCIkJChkaWcgK3RjcCArbm9hbGwgK2Fuc3dlciArc2VhcmNoIF9odHRwLl90Y3AuZG5zLXRlc3Qtc2VydmljZS5kbnMtMTM3MC5zdmMgU1JWKVwiICYmIHRlc3QgLW4gXCIkJGNoZWNrXCIgJiYgZWNobyBPSyA+IC9yZXN1bHRzL3doZWV6eV90Y3BAX2h0dHAuX3RjcC5kbnMtdGVzdC1zZXJ2aWNlLmRucy0xMzcwLnN2YztjaGVjaz1cIiQkKGRpZyArbm90Y3AgK25vYWxsICthbnN3ZXIgK3NlYXJjaCBfaHR0cC5fdGNwLnRlc3Qtc2VydmljZS0yLmRucy0xMzcwLnN2YyBTUlYpXCIgJiYgdGVzdCAtbiBcIiQkY2hlY2tcIiAmJiBlY2hvIE9LID4gL3Jlc3VsdHMvd2hlZXp5X3VkcEBfaHR0cC5fdGNwLnRlc3Qtc2VydmljZS0yLmRucy0xMzcwLnN2YztjaGVjaz1cIiQkKGRpZyArdGNwICtub2FsbCArYW5zd2VyICtzZWFyY2ggX2h0dHAuX3RjcC50ZXN0LXNlcnZpY2UtMi5kbnMtMTM3MC5zdmMgU1JWKVwiICYmIHRlc3QgLW4gXCIkJGNoZWNrXCIgJiYgZWNobyBPSyA+IC9yZXN1bHRzL3doZWV6eV90Y3BAX2h0dHAuX3RjcC50ZXN0LXNlcnZpY2UtMi5kbnMtMTM3MC5zdmM7Y2hlY2s9XCIkJChkaWcgK25vdGNwICtub2FsbCArYW5zd2VyICtzZWFyY2ggNzcuNjUuMC4xMC5pbi1hZGRyLmFycGEuIFBUUilcIiAmJiB0ZXN0IC1uIFwiJCRjaGVja1wiICYmIGVjaG8gT0sgPiAvcmVzdWx0cy8xMC4wLjY1Ljc3X3VkcEBQVFI7Y2hlY2s9XCIkJChkaWcgK3RjcCArbm9hbGwgK2Fuc3dlciArc2VhcmNoIDc3LjY1LjAuMTAuaW4tYWRkci5hcnBhLiBQVFIpXCIgJiYgdGVzdCAtbiBcIiQkY2hlY2tcIiAmJiBlY2hvIE9LID4gL3Jlc3VsdHMvMTAuMC42NS43N190Y3BAUFRSO3NsZWVwIDE7IGRvbmUiCiAgICAgICAgICBdLAogICAgICAgICAgIkVudiI6IFsKICAgICAgICAgICAgIlBBVEg9L3Vzci9sb2NhbC9zYmluOi91c3IvbG9jYWwvYmluOi91c3Ivc2JpbjovdXNyL2Jpbjovc2JpbjovYmluIiwKICAgICAgICAgICAgIkhPU1ROQU1FPSQoaG9zdC1uYW1lKSIKICAgICAgICAgIF0sCiAgICAgICAgICAiQ3dkIjogIi8iLAogICAgICAgICAgIkNhcGFiaWxpdGllcyI6IHsKICAgICAgICAgICAgIkFtYmllbnQiOiBbXSwKICAgICAgICAgICAgIkJvdW5kaW5nIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJFZmZlY3RpdmUiOiBbCiAgICAgICAgICAgICAgIiQoZGVmYXVsdF9jYXBzKSIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgIkluaGVyaXRhYmxlIjogW10sCiAgICAgICAgICAgICJQZXJtaXR0ZWQiOiBbCiAgICAgICAgICAgICAgIiQoZGVmYXVsdF9jYXBzKSIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgICJOb05ld1ByaXZpbGVnZXMiOiBmYWxzZQogICAgICAgIH0sCiAgICAgICAgIlJvb3QiOiB7CiAgICAgICAgICAiUGF0aCI6ICIkKGNwYXRoKS8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgIlJlYWRvbmx5IjogZmFsc2UKICAgICAgICB9LAogICAgICAgICJNb3VudHMiOiBbCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvcHJvYyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAicHJvYyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJwcm9jIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAgICAgIm5vZGV2IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2RldiIsCiAgICAgICAgICAgICJzb3VyY2UiOiAidG1wZnMiLAogICAgICAgICAgICAidHlwZV8iOiAidG1wZnMiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAic3RyaWN0YXRpbWUiLAogICAgICAgICAgICAgICJtb2RlPTc1NSIsCiAgICAgICAgICAgICAgInNpemU9NjU1MzZrIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi9wdHMiLAogICAgICAgICAgICAic291cmNlIjogImRldnB0cyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJkZXZwdHMiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibmV3aW5zdGFuY2UiLAogICAgICAgICAgICAgICJwdG14bW9kZT0wNjY2IiwKICAgICAgICAgICAgICAibW9kZT0wNjIwIiwKICAgICAgICAgICAgICAiZ2lkPTUiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L3NobSIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiL3J1bi9rYXRhLWNvbnRhaW5lcnMvc2FuZGJveC9zaG0iLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvbXF1ZXVlIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJtcXVldWUiLAogICAgICAgICAgICAidHlwZV8iOiAibXF1ZXVlIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAgICAgIm5vZGV2IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL3N5cyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAic3lzZnMiLAogICAgICAgICAgICAidHlwZV8iOiAic3lzZnMiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiLAogICAgICAgICAgICAgICJybyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9zeXMvZnMvY2dyb3VwIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJjZ3JvdXAiLAogICAgICAgICAgICAidHlwZV8iOiAiY2dyb3VwIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAgICAgIm5vZGV2IiwKICAgICAgICAgICAgICAicmVsYXRpbWUiLAogICAgICAgICAgICAgICJybyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9ldGMvaG9zdHMiLAogICAgICAgICAgICAic291cmNlIjogIiQoc2ZwcmVmaXgpaG9zdHMkIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJ3IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi90ZXJtaW5hdGlvbi1sb2ciLAogICAgICAgICAgICAic291cmNlIjogIiQoc2ZwcmVmaXgpdGVybWluYXRpb24tbG9nJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJydyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9ldGMvaG9zdG5hbWUiLAogICAgICAgICAgICAic291cmNlIjogIiQoc2ZwcmVmaXgpaG9zdG5hbWUkIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJ3IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2V0Yy9yZXNvbHYuY29uZiIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClyZXNvbHYuY29uZiQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicnciCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvdmFyL3J1bi9zZWNyZXRzL2t1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQiLAogICAgICAgICAgICAic291cmNlIjogIiQoc2ZwcmVmaXgpc2VydmljZWFjY291bnQkIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL3Zhci9ydW4vc2VjcmV0cy9henVyZS90b2tlbnMiLAogICAgICAgICAgICAic291cmNlIjogIiQoc2ZwcmVmaXgpdG9rZW5zJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJybyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9yZXN1bHRzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJeJChjcGF0aCkvJChzYW5kYm94LWlkKS9sb2NhbC9yZXN1bHRzJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJsb2NhbCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicnciCiAgICAgICAgICAgIF0KICAgICAgICAgIH0KICAgICAgICBdLAogICAgICAgICJBbm5vdGF0aW9ucyI6IHsKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmJ1bmRsZV9wYXRoIjogIi9ydW4vY29udGFpbmVyZC9pby5jb250YWluZXJkLnJ1bnRpbWUudjIudGFzay9rOHMuaW8vJChidW5kbGUtaWQpIiwKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIjogInBvZF9jb250YWluZXIiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLmNvbnRhaW5lci1uYW1lIjogInF1ZXJpZXIiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLmNvbnRhaW5lci10eXBlIjogImNvbnRhaW5lciIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuaW1hZ2UtbmFtZSI6ICJyZWdpc3RyeS5rOHMuaW8vZTJlLXRlc3QtaW1hZ2VzL2Fnbmhvc3Q6Mi40MyIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCI6ICJeW2EtejAtOV17NjR9JCIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1uYW1lIjogIl5kbnNcXC10ZXN0XFwtYTg0ODY1M2FcXC01YzE3XFwtNDg1YlxcLWJlNDZcXC1mYWEwYzBkYTExOTIkIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LW5hbWVzcGFjZSI6ICJkbnMtMTM3MCIKICAgICAgICB9LAogICAgICAgICJMaW51eCI6IHsKICAgICAgICAgICJOYW1lc3BhY2VzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgIlR5cGUiOiAiaXBjIiwKICAgICAgICAgICAgICAiUGF0aCI6ICIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiVHlwZSI6ICJ1dHMiLAogICAgICAgICAgICAgICJQYXRoIjogIiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJUeXBlIjogIm1vdW50IiwKICAgICAgICAgICAgICAiUGF0aCI6ICIiCiAgICAgICAgICAgIH0KICAgICAgICAgIF0sCiAgICAgICAgICAiTWFza2VkUGF0aHMiOiBbCiAgICAgICAgICAgICIvcHJvYy9hY3BpIiwKICAgICAgICAgICAgIi9wcm9jL2tjb3JlIiwKICAgICAgICAgICAgIi9wcm9jL2tleXMiLAogICAgICAgICAgICAiL3Byb2MvbGF0ZW5jeV9zdGF0cyIsCiAgICAgICAgICAgICIvcHJvYy90aW1lcl9saXN0IiwKICAgICAgICAgICAgIi9wcm9jL3RpbWVyX3N0YXRzIiwKICAgICAgICAgICAgIi9wcm9jL3NjaGVkX2RlYnVnIiwKICAgICAgICAgICAgIi9wcm9jL3Njc2kiLAogICAgICAgICAgICAiL3N5cy9maXJtd2FyZSIKICAgICAgICAgIF0sCiAgICAgICAgICAiUmVhZG9ubHlQYXRocyI6IFsKICAgICAgICAgICAgIi9wcm9jL2Fzb3VuZCIsCiAgICAgICAgICAgICIvcHJvYy9idXMiLAogICAgICAgICAgICAiL3Byb2MvZnMiLAogICAgICAgICAgICAiL3Byb2MvaXJxIiwKICAgICAgICAgICAgIi9wcm9jL3N5cyIsCiAgICAgICAgICAgICIvcHJvYy9zeXNycS10cmlnZ2VyIgogICAgICAgICAgXSwKICAgICAgICAgICJEZXZpY2VzIjogW10sCiAgICAgICAgICAiU3lzY3RsIjogewogICAgICAgICAgICAibmV0LmlwdjQuaXBfdW5wcml2aWxlZ2VkX3BvcnRfc3RhcnQiOiAiMCIsCiAgICAgICAgICAgICJuZXQuaXB2NC5waW5nX2dyb3VwX3JhbmdlIjogIjAgMjE0NzQ4MzY0NyIKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0sCiAgICAgICJzdG9yYWdlcyI6IFsKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoMCkiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXIwKSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoMSkiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXIxKSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoMikiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXIyKSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoMykiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXIzKSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoNCkiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXI0KSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoNSkiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXI1KSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoNikiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXI2KSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoNykiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXI3KSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoOCkiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXI4KSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoOSkiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXI5KSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogIm92ZXJsYXlmcyIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAiZnVzZTMua2F0YS1vdmVybGF5IiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiNTFmMWQ1ZGY5ZTViNjQ2MzI3NzljOTk2YTNhYmI5YjMyY2M2OWM3NmUwYzE3NjIwZWQ2Y2VmZjE1ZDNmMjgxYTpiZjRkMDE0N2YzYWJlYTU1NTUwYThhNjEyYmRjMTE0NGI5Njk2NmQ1MjBjMjY3ZTE1NTE2ZDUxNTdjYjM5YmFiOmIxYmI1N2EzZTVkMDYyZjlhM2RlNGZlMWMyYWQyMzI4MjMzYTY4MTdhYTA0YmIyOGY4M2I4NmQ4MTQ1MmFmNWI6ZGFlZDcxN2VmMjEwMDY3NDIyYzkyN2M0ZWRmMjIwYzQzM2E4MDcwY2Q3ZjBhYzA5YzQ1MDc5ZGEyNDc1YzRmMzplMWY2OTc5Yjg2YzhlYWUxMGM2OGMxOWYzYjA1MDMyZGZhYjFkNzcwMTgyNzI5YWRiM2Q4MDhjNzBmN2I5ZjdmOjE1MzVmNzhhMDdkNTI0MDVhZDczMTdjYmZjZWRmMDRkNjAwZGU0MGIxN2UzMWY1YWIyNTU2NjExMDA0YTViNWE6MTkxOGEwNTJmZmQyMDZlNDU5YTJhZGI3MWNhYmViZWYwMGNjZjc0NGMyMmRhNjRhOGQ4YTk0ZTA5M2Q2ODAzYjoyMDdlYTAwYjVkYWQwNDQ1YTZjNDY1ODI2ZjJmYjU3MTNiYjRkY2NhMzY5NTMxZTJhN2Y1OTVmNTM3Mzk1NTk2Ojk1MDBlNDY2MTdmYjQ1ODI4MjQ5MjFjZTIxZjU1YWVhYTk1YTMxOWJiMzRlYmZjMTE5MDQyYmRlMTk5OTZlZGI6ZGE1OTgwYTdlMzQzNDQwOWRhMTIzMjQxN2ExZDFjYzAyOTY3YjYyYTA5OTUwMmNhY2QxM2NjMmUzNDIwNmZhNCIsCiAgICAgICAgICAgICJlY2U1ZWYyMTZjNDAwNDdhY2NmMzhkM2E4YjE2ODk5ZDEzYjI3MTIwNjdkZDQ3OGEyMTc4Mzc4ZWM3ZmNiZmM2OjE3YTgzOGIwMjM0NzgyZWI3ZjZiY2FhMGZiMjhiZWY5ZjYzMDI2OGQyZTEyYzNiMjgwMjJkYWJmMWNkYmE4MTI6OTMxMGY0YjdjOGQ3MzBiZTA1NTA5NmZiOWUwZGJiNzk2NDliMDJkMDk3ODM3ZDY2MDlmOTIwOTdhYjgwODE5NDoxYTY0NDcxZjNlOTYzMDYwMjBmNTVmOGNmMTdhYjY5YmMyNjAzNzBkZmNjZjMyNjIwMDQyZmYyYzYwNjc2N2ZiOmY0ZDJiMjQ0ODQyZjA1ZjRiMWJlNzcwNjk0NjFlYmRjZTczOTQ1ZDQzMGIwNWY0OWFmOWM1NDBhN2FkNmZlZTE6YTcxZjAwZDI1OGFiZWU0MTBiYTkyMmI0YjU0YzMwZDdlYThkY2RjMDVhZTM0NWUzNWNlYjFlOGE3ZmIwZmRiOToyMTVhN2ViMGI0YWQ0ODRkNTk5Zjk0NWE1YWZiMzcwMDgxOGNiY2Y3OTc4N2M1OTMxY2IzM2UwYmQyZmE4ZGY1OmIxMWVjMjI5MDU5NzU5NzEzNWE5MWRmODQ4MTI4NzQ3YmE3NjhhZDNmY2FmMGJiNzUwYjI5MjE2ZTJlM2MyZDE6OWYxYTgyNDQ1OTAxMTU0Y2Y5OWVkNzZlMmIwMDc5N2FmYWZiZTJiMTQxMzYxNTFhYTBhN2RlYTU2YTVjOWY2MzoyNTRjNTMxNDg3M2MyN2E4ZGUzZGI1MzQ3ZjU2ZWJkOWViMmJmNDZjYzg4MTJhNDM2MTFmOThlMzhhYzM3YmEyIgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGNwYXRoKS8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJsb2NhbCIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAibG9jYWwiLAogICAgICAgICAgImZzdHlwZSI6ICJsb2NhbCIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIm1vZGU9MDc3NyIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiXiQoY3BhdGgpLyQoc2FuZGJveC1pZCkvbG9jYWwvcmVzdWx0cyQiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0KICAgICAgXSwKICAgICAgImRldmljZXMiOiBbXSwKICAgICAgInNhbmRib3hfcGlkbnMiOiBmYWxzZSwKICAgICAgImV4ZWNfY29tbWFuZHMiOiBbXSwKICAgICAgImVudl9tYXAiOiB7CiAgICAgICAgIkhPU1ROQU1FIjogIiQoaG9zdC1uYW1lKSIsCiAgICAgICAgIlBBVEgiOiAiL3Vzci9sb2NhbC9zYmluOi91c3IvbG9jYWwvYmluOi91c3Ivc2JpbjovdXNyL2Jpbjovc2JpbjovYmluIgogICAgICB9CiAgICB9LAogICAgewogICAgICAiT0NJIjogewogICAgICAgICJWZXJzaW9uIjogIjEuMS4wLXJjLjEiLAogICAgICAgICJQcm9jZXNzIjogewogICAgICAgICAgIlRlcm1pbmFsIjogZmFsc2UsCiAgICAgICAgICAiVXNlciI6IHsKICAgICAgICAgICAgIlVJRCI6IDAsCiAgICAgICAgICAgICJHSUQiOiAwLAogICAgICAgICAgICAiQWRkaXRpb25hbEdpZHMiOiBbXSwKICAgICAgICAgICAgIlVzZXJuYW1lIjogIiIKICAgICAgICAgIH0sCiAgICAgICAgICAiRGVwcmVjYXRlZEFyZ3MiOiBbCiAgICAgICAgICAgICJzaCIsCiAgICAgICAgICAgICItYyIsCiAgICAgICAgICAgICJmb3IgaSBpbiBgc2VxIDEgNjAwYDsgZG8gY2hlY2s9XCIkJChkaWcgK25vdGNwICtub2FsbCArYW5zd2VyICtzZWFyY2ggZG5zLXRlc3Qtc2VydmljZSBBKVwiICYmIHRlc3QgLW4gXCIkJGNoZWNrXCIgJiYgZWNobyBPSyA+IC9yZXN1bHRzL2plc3NpZV91ZHBAZG5zLXRlc3Qtc2VydmljZTtjaGVjaz1cIiQkKGRpZyArdGNwICtub2FsbCArYW5zd2VyICtzZWFyY2ggZG5zLXRlc3Qtc2VydmljZSBBKVwiICYmIHRlc3QgLW4gXCIkJGNoZWNrXCIgJiYgZWNobyBPSyA+IC9yZXN1bHRzL2plc3NpZV90Y3BAZG5zLXRlc3Qtc2VydmljZTtjaGVjaz1cIiQkKGRpZyArbm90Y3AgK25vYWxsICthbnN3ZXIgK3NlYXJjaCBkbnMtdGVzdC1zZXJ2aWNlLmRucy0xMzcwIEEpXCIgJiYgdGVzdCAtbiBcIiQkY2hlY2tcIiAmJiBlY2hvIE9LID4gL3Jlc3VsdHMvamVzc2llX3VkcEBkbnMtdGVzdC1zZXJ2aWNlLmRucy0xMzcwO2NoZWNrPVwiJCQoZGlnICt0Y3AgK25vYWxsICthbnN3ZXIgK3NlYXJjaCBkbnMtdGVzdC1zZXJ2aWNlLmRucy0xMzcwIEEpXCIgJiYgdGVzdCAtbiBcIiQkY2hlY2tcIiAmJiBlY2hvIE9LID4gL3Jlc3VsdHMvamVzc2llX3RjcEBkbnMtdGVzdC1zZXJ2aWNlLmRucy0xMzcwO2NoZWNrPVwiJCQoZGlnICtub3RjcCArbm9hbGwgK2Fuc3dlciArc2VhcmNoIGRucy10ZXN0LXNlcnZpY2UuZG5zLTEzNzAuc3ZjIEEpXCIgJiYgdGVzdCAtbiBcIiQkY2hlY2tcIiAmJiBlY2hvIE9LID4gL3Jlc3VsdHMvamVzc2llX3VkcEBkbnMtdGVzdC1zZXJ2aWNlLmRucy0xMzcwLnN2YztjaGVjaz1cIiQkKGRpZyArdGNwICtub2FsbCArYW5zd2VyICtzZWFyY2ggZG5zLXRlc3Qtc2VydmljZS5kbnMtMTM3MC5zdmMgQSlcIiAmJiB0ZXN0IC1uIFwiJCRjaGVja1wiICYmIGVjaG8gT0sgPiAvcmVzdWx0cy9qZXNzaWVfdGNwQGRucy10ZXN0LXNlcnZpY2UuZG5zLTEzNzAuc3ZjO2NoZWNrPVwiJCQoZGlnICtub3RjcCArbm9hbGwgK2Fuc3dlciArc2VhcmNoIF9odHRwLl90Y3AuZG5zLXRlc3Qtc2VydmljZS5kbnMtMTM3MC5zdmMgU1JWKVwiICYmIHRlc3QgLW4gXCIkJGNoZWNrXCIgJiYgZWNobyBPSyA+IC9yZXN1bHRzL2plc3NpZV91ZHBAX2h0dHAuX3RjcC5kbnMtdGVzdC1zZXJ2aWNlLmRucy0xMzcwLnN2YztjaGVjaz1cIiQkKGRpZyArdGNwICtub2FsbCArYW5zd2VyICtzZWFyY2ggX2h0dHAuX3RjcC5kbnMtdGVzdC1zZXJ2aWNlLmRucy0xMzcwLnN2YyBTUlYpXCIgJiYgdGVzdCAtbiBcIiQkY2hlY2tcIiAmJiBlY2hvIE9LID4gL3Jlc3VsdHMvamVzc2llX3RjcEBfaHR0cC5fdGNwLmRucy10ZXN0LXNlcnZpY2UuZG5zLTEzNzAuc3ZjO2NoZWNrPVwiJCQoZGlnICtub3RjcCArbm9hbGwgK2Fuc3dlciArc2VhcmNoIF9odHRwLl90Y3AudGVzdC1zZXJ2aWNlLTIuZG5zLTEzNzAuc3ZjIFNSVilcIiAmJiB0ZXN0IC1uIFwiJCRjaGVja1wiICYmIGVjaG8gT0sgPiAvcmVzdWx0cy9qZXNzaWVfdWRwQF9odHRwLl90Y3AudGVzdC1zZXJ2aWNlLTIuZG5zLTEzNzAuc3ZjO2NoZWNrPVwiJCQoZGlnICt0Y3AgK25vYWxsICthbnN3ZXIgK3NlYXJjaCBfaHR0cC5fdGNwLnRlc3Qtc2VydmljZS0yLmRucy0xMzcwLnN2YyBTUlYpXCIgJiYgdGVzdCAtbiBcIiQkY2hlY2tcIiAmJiBlY2hvIE9LID4gL3Jlc3VsdHMvamVzc2llX3RjcEBfaHR0cC5fdGNwLnRlc3Qtc2VydmljZS0yLmRucy0xMzcwLnN2YztjaGVjaz1cIiQkKGRpZyArbm90Y3AgK25vYWxsICthbnN3ZXIgK3NlYXJjaCA3Ny42NS4wLjEwLmluLWFkZHIuYXJwYS4gUFRSKVwiICYmIHRlc3QgLW4gXCIkJGNoZWNrXCIgJiYgZWNobyBPSyA+IC9yZXN1bHRzLzEwLjAuNjUuNzdfdWRwQFBUUjtjaGVjaz1cIiQkKGRpZyArdGNwICtub2FsbCArYW5zd2VyICtzZWFyY2ggNzcuNjUuMC4xMC5pbi1hZGRyLmFycGEuIFBUUilcIiAmJiB0ZXN0IC1uIFwiJCRjaGVja1wiICYmIGVjaG8gT0sgPiAvcmVzdWx0cy8xMC4wLjY1Ljc3X3RjcEBQVFI7c2xlZXAgMTsgZG9uZSIKICAgICAgICAgIF0sCiAgICAgICAgICAiQXJncyI6IFsKICAgICAgICAgICAgInNoIiwKICAgICAgICAgICAgIi1jIiwKICAgICAgICAgICAgImZvciBpIGluIGBzZXEgMSA2MDBgOyBkbyBjaGVjaz1cIiQkKGRpZyArbm90Y3AgK25vYWxsICthbnN3ZXIgK3NlYXJjaCBkbnMtdGVzdC1zZXJ2aWNlIEEpXCIgJiYgdGVzdCAtbiBcIiQkY2hlY2tcIiAmJiBlY2hvIE9LID4gL3Jlc3VsdHMvamVzc2llX3VkcEBkbnMtdGVzdC1zZXJ2aWNlO2NoZWNrPVwiJCQoZGlnICt0Y3AgK25vYWxsICthbnN3ZXIgK3NlYXJjaCBkbnMtdGVzdC1zZXJ2aWNlIEEpXCIgJiYgdGVzdCAtbiBcIiQkY2hlY2tcIiAmJiBlY2hvIE9LID4gL3Jlc3VsdHMvamVzc2llX3RjcEBkbnMtdGVzdC1zZXJ2aWNlO2NoZWNrPVwiJCQoZGlnICtub3RjcCArbm9hbGwgK2Fuc3dlciArc2VhcmNoIGRucy10ZXN0LXNlcnZpY2UuZG5zLTEzNzAgQSlcIiAmJiB0ZXN0IC1uIFwiJCRjaGVja1wiICYmIGVjaG8gT0sgPiAvcmVzdWx0cy9qZXNzaWVfdWRwQGRucy10ZXN0LXNlcnZpY2UuZG5zLTEzNzA7Y2hlY2s9XCIkJChkaWcgK3RjcCArbm9hbGwgK2Fuc3dlciArc2VhcmNoIGRucy10ZXN0LXNlcnZpY2UuZG5zLTEzNzAgQSlcIiAmJiB0ZXN0IC1uIFwiJCRjaGVja1wiICYmIGVjaG8gT0sgPiAvcmVzdWx0cy9qZXNzaWVfdGNwQGRucy10ZXN0LXNlcnZpY2UuZG5zLTEzNzA7Y2hlY2s9XCIkJChkaWcgK25vdGNwICtub2FsbCArYW5zd2VyICtzZWFyY2ggZG5zLXRlc3Qtc2VydmljZS5kbnMtMTM3MC5zdmMgQSlcIiAmJiB0ZXN0IC1uIFwiJCRjaGVja1wiICYmIGVjaG8gT0sgPiAvcmVzdWx0cy9qZXNzaWVfdWRwQGRucy10ZXN0LXNlcnZpY2UuZG5zLTEzNzAuc3ZjO2NoZWNrPVwiJCQoZGlnICt0Y3AgK25vYWxsICthbnN3ZXIgK3NlYXJjaCBkbnMtdGVzdC1zZXJ2aWNlLmRucy0xMzcwLnN2YyBBKVwiICYmIHRlc3QgLW4gXCIkJGNoZWNrXCIgJiYgZWNobyBPSyA+IC9yZXN1bHRzL2plc3NpZV90Y3BAZG5zLXRlc3Qtc2VydmljZS5kbnMtMTM3MC5zdmM7Y2hlY2s9XCIkJChkaWcgK25vdGNwICtub2FsbCArYW5zd2VyICtzZWFyY2ggX2h0dHAuX3RjcC5kbnMtdGVzdC1zZXJ2aWNlLmRucy0xMzcwLnN2YyBTUlYpXCIgJiYgdGVzdCAtbiBcIiQkY2hlY2tcIiAmJiBlY2hvIE9LID4gL3Jlc3VsdHMvamVzc2llX3VkcEBfaHR0cC5fdGNwLmRucy10ZXN0LXNlcnZpY2UuZG5zLTEzNzAuc3ZjO2NoZWNrPVwiJCQoZGlnICt0Y3AgK25vYWxsICthbnN3ZXIgK3NlYXJjaCBfaHR0cC5fdGNwLmRucy10ZXN0LXNlcnZpY2UuZG5zLTEzNzAuc3ZjIFNSVilcIiAmJiB0ZXN0IC1uIFwiJCRjaGVja1wiICYmIGVjaG8gT0sgPiAvcmVzdWx0cy9qZXNzaWVfdGNwQF9odHRwLl90Y3AuZG5zLXRlc3Qtc2VydmljZS5kbnMtMTM3MC5zdmM7Y2hlY2s9XCIkJChkaWcgK25vdGNwICtub2FsbCArYW5zd2VyICtzZWFyY2ggX2h0dHAuX3RjcC50ZXN0LXNlcnZpY2UtMi5kbnMtMTM3MC5zdmMgU1JWKVwiICYmIHRlc3QgLW4gXCIkJGNoZWNrXCIgJiYgZWNobyBPSyA+IC9yZXN1bHRzL2plc3NpZV91ZHBAX2h0dHAuX3RjcC50ZXN0LXNlcnZpY2UtMi5kbnMtMTM3MC5zdmM7Y2hlY2s9XCIkJChkaWcgK3RjcCArbm9hbGwgK2Fuc3dlciArc2VhcmNoIF9odHRwLl90Y3AudGVzdC1zZXJ2aWNlLTIuZG5zLTEzNzAuc3ZjIFNSVilcIiAmJiB0ZXN0IC1uIFwiJCRjaGVja1wiICYmIGVjaG8gT0sgPiAvcmVzdWx0cy9qZXNzaWVfdGNwQF9odHRwLl90Y3AudGVzdC1zZXJ2aWNlLTIuZG5zLTEzNzAuc3ZjO2NoZWNrPVwiJCQoZGlnICtub3RjcCArbm9hbGwgK2Fuc3dlciArc2VhcmNoIDc3LjY1LjAuMTAuaW4tYWRkci5hcnBhLiBQVFIpXCIgJiYgdGVzdCAtbiBcIiQkY2hlY2tcIiAmJiBlY2hvIE9LID4gL3Jlc3VsdHMvMTAuMC42NS43N191ZHBAUFRSO2NoZWNrPVwiJCQoZGlnICt0Y3AgK25vYWxsICthbnN3ZXIgK3NlYXJjaCA3Ny42NS4wLjEwLmluLWFkZHIuYXJwYS4gUFRSKVwiICYmIHRlc3QgLW4gXCIkJGNoZWNrXCIgJiYgZWNobyBPSyA+IC9yZXN1bHRzLzEwLjAuNjUuNzdfdGNwQFBUUjtzbGVlcCAxOyBkb25lIgogICAgICAgICAgXSwKICAgICAgICAgICJFbnYiOiBbCiAgICAgICAgICAgICJQQVRIPS91c3IvbG9jYWwvc2JpbjovdXNyL2xvY2FsL2JpbjovdXNyL3NiaW46L3Vzci9iaW46L3NiaW46L2JpbiIsCiAgICAgICAgICAgICJIT1NUTkFNRT0kKGhvc3QtbmFtZSkiCiAgICAgICAgICBdLAogICAgICAgICAgIkN3ZCI6ICIvIiwKICAgICAgICAgICJDYXBhYmlsaXRpZXMiOiB7CiAgICAgICAgICAgICJBbWJpZW50IjogW10sCiAgICAgICAgICAgICJCb3VuZGluZyI6IFsKICAgICAgICAgICAgICAiJChkZWZhdWx0X2NhcHMpIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiRWZmZWN0aXZlIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJJbmhlcml0YWJsZSI6IFtdLAogICAgICAgICAgICAiUGVybWl0dGVkIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICAiTm9OZXdQcml2aWxlZ2VzIjogZmFsc2UKICAgICAgICB9LAogICAgICAgICJSb290IjogewogICAgICAgICAgIlBhdGgiOiAiJChjcGF0aCkvJChidW5kbGUtaWQpIiwKICAgICAgICAgICJSZWFkb25seSI6IGZhbHNlCiAgICAgICAgfSwKICAgICAgICAiTW91bnRzIjogWwogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL3Byb2MiLAogICAgICAgICAgICAic291cmNlIjogInByb2MiLAogICAgICAgICAgICAidHlwZV8iOiAicHJvYyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYiLAogICAgICAgICAgICAic291cmNlIjogInRtcGZzIiwKICAgICAgICAgICAgInR5cGVfIjogInRtcGZzIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgInN0cmljdGF0aW1lIiwKICAgICAgICAgICAgICAibW9kZT03NTUiLAogICAgICAgICAgICAgICJzaXplPTY1NTM2ayIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvcHRzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJkZXZwdHMiLAogICAgICAgICAgICAidHlwZV8iOiAiZGV2cHRzIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAgICAgIm5ld2luc3RhbmNlIiwKICAgICAgICAgICAgICAicHRteG1vZGU9MDY2NiIsCiAgICAgICAgICAgICAgIm1vZGU9MDYyMCIsCiAgICAgICAgICAgICAgImdpZD01IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi9zaG0iLAogICAgICAgICAgICAic291cmNlIjogIi9ydW4va2F0YS1jb250YWluZXJzL3NhbmRib3gvc2htIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L21xdWV1ZSIsCiAgICAgICAgICAgICJzb3VyY2UiOiAibXF1ZXVlIiwKICAgICAgICAgICAgInR5cGVfIjogIm1xdWV1ZSIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9zeXMiLAogICAgICAgICAgICAic291cmNlIjogInN5c2ZzIiwKICAgICAgICAgICAgInR5cGVfIjogInN5c2ZzIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAgICAgIm5vZGV2IiwKICAgICAgICAgICAgICAicm8iCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvc3lzL2ZzL2Nncm91cCIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiY2dyb3VwIiwKICAgICAgICAgICAgInR5cGVfIjogImNncm91cCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIsCiAgICAgICAgICAgICAgInJlbGF0aW1lIiwKICAgICAgICAgICAgICAicm8iCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZXRjL2hvc3RzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KWhvc3RzJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJydyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvdGVybWluYXRpb24tbG9nIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KXRlcm1pbmF0aW9uLWxvZyQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicnciCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZXRjL2hvc3RuYW1lIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KWhvc3RuYW1lJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJydyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9ldGMvcmVzb2x2LmNvbmYiLAogICAgICAgICAgICAic291cmNlIjogIiQoc2ZwcmVmaXgpcmVzb2x2LmNvbmYkIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJ3IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL3Zhci9ydW4vc2VjcmV0cy9rdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50IiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KXNlcnZpY2VhY2NvdW50JCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJybyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi92YXIvcnVuL3NlY3JldHMvYXp1cmUvdG9rZW5zIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KXRva2VucyQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicm8iCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvcmVzdWx0cyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiXiQoY3BhdGgpLyQoc2FuZGJveC1pZCkvbG9jYWwvcmVzdWx0cyQiLAogICAgICAgICAgICAidHlwZV8iOiAibG9jYWwiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJ3IgogICAgICAgICAgICBdCiAgICAgICAgICB9CiAgICAgICAgXSwKICAgICAgICAiQW5ub3RhdGlvbnMiOiB7CiAgICAgICAgICAiaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5idW5kbGVfcGF0aCI6ICIvcnVuL2NvbnRhaW5lcmQvaW8uY29udGFpbmVyZC5ydW50aW1lLnYyLnRhc2svazhzLmlvLyQoYnVuZGxlLWlkKSIsCiAgICAgICAgICAiaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5jb250YWluZXJfdHlwZSI6ICJwb2RfY29udGFpbmVyIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItbmFtZSI6ICJqZXNzaWUtcXVlcmllciIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLXR5cGUiOiAiY29udGFpbmVyIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5pbWFnZS1uYW1lIjogInJlZ2lzdHJ5Lms4cy5pby9lMmUtdGVzdC1pbWFnZXMvamVzc2llLWRuc3V0aWxzOjEuNyIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCI6ICJeW2EtejAtOV17NjR9JCIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1uYW1lIjogIl5kbnNcXC10ZXN0XFwtYTg0ODY1M2FcXC01YzE3XFwtNDg1YlxcLWJlNDZcXC1mYWEwYzBkYTExOTIkIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LW5hbWVzcGFjZSI6ICJkbnMtMTM3MCIKICAgICAgICB9LAogICAgICAgICJMaW51eCI6IHsKICAgICAgICAgICJOYW1lc3BhY2VzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgIlR5cGUiOiAiaXBjIiwKICAgICAgICAgICAgICAiUGF0aCI6ICIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiVHlwZSI6ICJ1dHMiLAogICAgICAgICAgICAgICJQYXRoIjogIiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJUeXBlIjogIm1vdW50IiwKICAgICAgICAgICAgICAiUGF0aCI6ICIiCiAgICAgICAgICAgIH0KICAgICAgICAgIF0sCiAgICAgICAgICAiTWFza2VkUGF0aHMiOiBbCiAgICAgICAgICAgICIvcHJvYy9hY3BpIiwKICAgICAgICAgICAgIi9wcm9jL2tjb3JlIiwKICAgICAgICAgICAgIi9wcm9jL2tleXMiLAogICAgICAgICAgICAiL3Byb2MvbGF0ZW5jeV9zdGF0cyIsCiAgICAgICAgICAgICIvcHJvYy90aW1lcl9saXN0IiwKICAgICAgICAgICAgIi9wcm9jL3RpbWVyX3N0YXRzIiwKICAgICAgICAgICAgIi9wcm9jL3NjaGVkX2RlYnVnIiwKICAgICAgICAgICAgIi9wcm9jL3Njc2kiLAogICAgICAgICAgICAiL3N5cy9maXJtd2FyZSIKICAgICAgICAgIF0sCiAgICAgICAgICAiUmVhZG9ubHlQYXRocyI6IFsKICAgICAgICAgICAgIi9wcm9jL2Fzb3VuZCIsCiAgICAgICAgICAgICIvcHJvYy9idXMiLAogICAgICAgICAgICAiL3Byb2MvZnMiLAogICAgICAgICAgICAiL3Byb2MvaXJxIiwKICAgICAgICAgICAgIi9wcm9jL3N5cyIsCiAgICAgICAgICAgICIvcHJvYy9zeXNycS10cmlnZ2VyIgogICAgICAgICAgXSwKICAgICAgICAgICJEZXZpY2VzIjogW10sCiAgICAgICAgICAiU3lzY3RsIjogewogICAgICAgICAgICAibmV0LmlwdjQuaXBfdW5wcml2aWxlZ2VkX3BvcnRfc3RhcnQiOiAiMCIsCiAgICAgICAgICAgICJuZXQuaXB2NC5waW5nX2dyb3VwX3JhbmdlIjogIjAgMjE0NzQ4MzY0NyIKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0sCiAgICAgICJzdG9yYWdlcyI6IFsKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoMCkiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXIwKSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoMSkiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXIxKSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoMikiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXIyKSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoMykiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXIzKSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoNCkiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXI0KSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoNSkiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXI1KSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogIm92ZXJsYXlmcyIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAiZnVzZTMua2F0YS1vdmVybGF5IiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiMTBiNTZjNzU2ODliMmQzZmQzNGRhYjU4NmUyODRjODkxN2JhYTdmMjQ0NWI2NDM5ZDc4YWI2ZDk2NDVhNjBiMzplNTAwMDQ5NjEzZWI0ZWYwMmUwM2U2NTgwZTgwYzVhODI2NzMwYTk0NDUyMWRhZmYxZWVmNzc2YjJmY2MwZjIwOmFjODNmNGEzNzJiMzQwMjE5M2VhMzE0ZWM3ZThhODdiOTFjNTljNzNlMjNiYTc5Y2VjOTJjMWE0MWM4YWFmNTQ6MGIyYzVjM2M0NjMzODIwYjViNGY2ZDc3ZWEyMmM1ZWQwZTNkM2MzMzIwOTE2NWMyYjE4MTU4N2IyZDhiZTMxMjo3M2ZhMGFhOTk2YTM3NGNjODQ2NzI4ZjcyNjM5M2NmY2ZmNDZjOTgyZGNmNjJkMmQyNTlmNjAwNmRlZTVlMmJkOjM1Zjc4YWYxMGI2MzQwMmJiODlkYTE2MTUxM2ZhNTYzNDY1YmNjMWQ0MzQzYzRmN2Q0OTgxMWZmOWI3MGRkYTkiLAogICAgICAgICAgICAiMmJkYzJmYWUzYzg3YWNjNmExODYzMzZmOGIzMDY1NTAyZDFiZTdiY2ZhYWMzMjE1N2RmYzQ4YzRiNGMxZDdmNjplYmU2MjM4NjZhYjM3MmM1MTAxYmFhZjc2N2IyODFkZTcxMDBiOTM0MjY5NmJjYzgyZmY0ZjA2MWY0YjE1OTY2OjIxM2Y4NDBiMTAwNjkwODA0YTc2YTFhOWQzY2UzYzA1MzEzODFiMGE3NjA3NjI1ODAzYTZmODY3MTM0NDEyZGI6Njc0NTAwODJhYjU2ZGExYWVjYzVlYWUyZjE4ZDk4MGNkOWU3MzA2ZTc5MzM0YTFhODI2YTkxY2ZkOTAxMTRhODowODU5ZTU1MzFmZDdmOGIxNzA3MTQxNGEwODJhZmI2NWIyYmU3MDJlY2RhZmEwMDdkZDA1NzdhZWE4NmY4NTkzOjA2Zjg5YzI3NWRjMzRmMjZiOWRiMGNmMDEwMmIyYTg5OWRlNjU1NTEwNTg1MmQwYWYyYmI5NWYzNzRmNzE0NGQiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQoY3BhdGgpLyQoYnVuZGxlLWlkKSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImxvY2FsIiwKICAgICAgICAgICJkcml2ZXJfb3B0aW9ucyI6IFtdLAogICAgICAgICAgInNvdXJjZSI6ICJsb2NhbCIsCiAgICAgICAgICAiZnN0eXBlIjogImxvY2FsIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAibW9kZT0wNzc3IgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICJeJChjcGF0aCkvJChzYW5kYm94LWlkKS9sb2NhbC9yZXN1bHRzJCIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfQogICAgICBdLAogICAgICAiZGV2aWNlcyI6IFtdLAogICAgICAic2FuZGJveF9waWRucyI6IGZhbHNlLAogICAgICAiZXhlY19jb21tYW5kcyI6IFtdLAogICAgICAiZW52X21hcCI6IHsKICAgICAgICAiSE9TVE5BTUUiOiAiJChob3N0LW5hbWUpIiwKICAgICAgICAiUEFUSCI6ICIvdXNyL2xvY2FsL3NiaW46L3Vzci9sb2NhbC9iaW46L3Vzci9zYmluOi91c3IvYmluOi9zYmluOi9iaW4iCiAgICAgIH0KICAgIH0KICBdLAogICJjb21tb24iOiB7CiAgICAiY3BhdGgiOiAiL3J1bi9rYXRhLWNvbnRhaW5lcnMvc2hhcmVkL2NvbnRhaW5lcnMiLAogICAgIm1vdW50X3NvdXJjZV9jcGF0aCI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zaGFyZWQvY29udGFpbmVycyIsCiAgICAic2ZwcmVmaXgiOiAiXiQoY3BhdGgpLyQoYnVuZGxlLWlkKS1bYS16MC05XXsxNn0tIiwKICAgICJzcGF0aCI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L3N0b3JhZ2UiLAogICAgImlwdjRfYSI6ICIoKFswLTldfFsxLTldWzAtOV18MVswLTldezJ9fDJbMC00XVswLTldfDI1WzAtNV0pXFwuKXszfShbMC05XXxbMS05XVswLTldfDFbMC05XXsyfXwyWzAtNF1bMC05XXwyNVswLTVdKSIsCiAgICAiaXBfcCI6ICJbMC05XXsxLDV9IiwKICAgICJzdmNfbmFtZSI6ICJbQS1aX1xcLlxcLV0rIiwKICAgICJkbnNfbGFiZWwiOiAiW2EtekEtWjAtOV9cXC5cXC1dKyIsCiAgICAic19zb3VyY2UxIjogIl4uLjJbMC05XXszfV9bMC0xXVswLTldX1swLTNdWzAtOV1fWzAtMl1bMC05XV9bMC01XVswLTldX1swLTVdWzAtOV1cXC5bMC05XXsxLDEwfSQiLAogICAgInNfc291cmNlMiI6ICJeLi5kYXRhLyIsCiAgICAiZG5zX3N1YmRvbWFpbiI6ICJeW2EtejAtOV0oWy1hLXowLTldKlthLXowLTldKT8kIiwKICAgICJwb2RfdWlkIjogIl5bMC05YS1mQS1GXXs4fS1bMC05YS1mQS1GXXs0fS1bMC05YS1mQS1GXXs0fS1bMC05YS1mQS1GXXs0fS1bMC05YS1mQS1GXXsxMn0kIiwKICAgICJkZWZhdWx0X2NhcHMiOiBbCiAgICAgICJDQVBfQ0hPV04iLAogICAgICAiQ0FQX0RBQ19PVkVSUklERSIsCiAgICAgICJDQVBfRlNFVElEIiwKICAgICAgIkNBUF9GT1dORVIiLAogICAgICAiQ0FQX01LTk9EIiwKICAgICAgIkNBUF9ORVRfUkFXIiwKICAgICAgIkNBUF9TRVRHSUQiLAogICAgICAiQ0FQX1NFVFVJRCIsCiAgICAgICJDQVBfU0VURkNBUCIsCiAgICAgICJDQVBfU0VUUENBUCIsCiAgICAgICJDQVBfTkVUX0JJTkRfU0VSVklDRSIsCiAgICAgICJDQVBfU1lTX0NIUk9PVCIsCiAgICAgICJDQVBfS0lMTCIsCiAgICAgICJDQVBfQVVESVRfV1JJVEUiCiAgICBdLAogICAgInByaXZpbGVnZWRfY2FwcyI6IFsKICAgICAgIkNBUF9DSE9XTiIsCiAgICAgICJDQVBfREFDX09WRVJSSURFIiwKICAgICAgIkNBUF9EQUNfUkVBRF9TRUFSQ0giLAogICAgICAiQ0FQX0ZPV05FUiIsCiAgICAgICJDQVBfRlNFVElEIiwKICAgICAgIkNBUF9LSUxMIiwKICAgICAgIkNBUF9TRVRHSUQiLAogICAgICAiQ0FQX1NFVFVJRCIsCiAgICAgICJDQVBfU0VUUENBUCIsCiAgICAgICJDQVBfTElOVVhfSU1NVVRBQkxFIiwKICAgICAgIkNBUF9ORVRfQklORF9TRVJWSUNFIiwKICAgICAgIkNBUF9ORVRfQlJPQURDQVNUIiwKICAgICAgIkNBUF9ORVRfQURNSU4iLAogICAgICAiQ0FQX05FVF9SQVciLAogICAgICAiQ0FQX0lQQ19MT0NLIiwKICAgICAgIkNBUF9JUENfT1dORVIiLAogICAgICAiQ0FQX1NZU19NT0RVTEUiLAogICAgICAiQ0FQX1NZU19SQVdJTyIsCiAgICAgICJDQVBfU1lTX0NIUk9PVCIsCiAgICAgICJDQVBfU1lTX1BUUkFDRSIsCiAgICAgICJDQVBfU1lTX1BBQ0NUIiwKICAgICAgIkNBUF9TWVNfQURNSU4iLAogICAgICAiQ0FQX1NZU19CT09UIiwKICAgICAgIkNBUF9TWVNfTklDRSIsCiAgICAgICJDQVBfU1lTX1JFU09VUkNFIiwKICAgICAgIkNBUF9TWVNfVElNRSIsCiAgICAgICJDQVBfU1lTX1RUWV9DT05GSUciLAogICAgICAiQ0FQX01LTk9EIiwKICAgICAgIkNBUF9MRUFTRSIsCiAgICAgICJDQVBfQVVESVRfV1JJVEUiLAogICAgICAiQ0FQX0FVRElUX0NPTlRST0wiLAogICAgICAiQ0FQX1NFVEZDQVAiLAogICAgICAiQ0FQX01BQ19PVkVSUklERSIsCiAgICAgICJDQVBfTUFDX0FETUlOIiwKICAgICAgIkNBUF9TWVNMT0ciLAogICAgICAiQ0FQX1dBS0VfQUxBUk0iLAogICAgICAiQ0FQX0JMT0NLX1NVU1BFTkQiLAogICAgICAiQ0FQX0FVRElUX1JFQUQiLAogICAgICAiQ0FQX1BFUkZNT04iLAogICAgICAiQ0FQX0JQRiIsCiAgICAgICJDQVBfQ0hFQ0tQT0lOVF9SRVNUT1JFIgogICAgXSwKICAgICJ2aXJ0aW9fYmxrX3N0b3JhZ2VfY2xhc3NlcyI6IFsKICAgICAgImNjLWxvY2FsLWNzaSIsCiAgICAgICJjYy1tYW5hZ2VkLWNzaSIsCiAgICAgICJjYy1tYW5hZ2VkLXByZW1pdW0tY3NpIgogICAgXSwKICAgICJzbWJfc3RvcmFnZV9jbGFzc2VzIjogWwogICAgICB7CiAgICAgICAgIm5hbWUiOiAiYXp1cmVmaWxlLWNzaS1rYXRhLWNjIiwKICAgICAgICAibW91bnRfb3B0aW9ucyI6IFsKICAgICAgICAgICJkaXJfbW9kZT0wNzc3IiwKICAgICAgICAgICJmaWxlX21vZGU9MDc3NyIsCiAgICAgICAgICAibWZzeW1saW5rcyIsCiAgICAgICAgICAiY2FjaGU9c3RyaWN0IiwKICAgICAgICAgICJub3NoYXJlc29jayIsCiAgICAgICAgICAiYWN0aW1lbz0zMCIsCiAgICAgICAgICAibm9icmwiCiAgICAgICAgXQogICAgICB9CiAgICBdCiAgfSwKICAic2FuZGJveCI6IHsKICAgICJzdG9yYWdlcyI6IFsKICAgICAgewogICAgICAgICJkcml2ZXIiOiAiZXBoZW1lcmFsIiwKICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAic291cmNlIjogInNobSIsCiAgICAgICAgImZzdHlwZSI6ICJ0bXBmcyIsCiAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgIm5vZGV2IiwKICAgICAgICAgICJtb2RlPTE3NzciLAogICAgICAgICAgInNpemU9NjcxMDg4NjQiCiAgICAgICAgXSwKICAgICAgICAibW91bnRfcG9pbnQiOiAiL3J1bi9rYXRhLWNvbnRhaW5lcnMvc2FuZGJveC9zaG0iLAogICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgfQogICAgXQogIH0sCiAgInJlcXVlc3RfZGVmYXVsdHMiOiB7CiAgICAiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdCI6IHsKICAgICAgImFsbG93X2Vudl9yZWdleCI6IFsKICAgICAgICAiXkhPU1ROQU1FPSQoZG5zX2xhYmVsKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfUE9SVF8kKGlwX3ApX1RDUD10Y3A6Ly8kKGlwdjRfYSk6JChpcF9wKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfUE9SVF8kKGlwX3ApX1RDUF9QUk9UTz10Y3AkIiwKICAgICAgICAiXiQoc3ZjX25hbWUpX1BPUlRfJChpcF9wKV9UQ1BfUE9SVD0kKGlwX3ApJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9QT1JUXyQoaXBfcClfVENQX0FERFI9JChpcHY0X2EpJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9TRVJWSUNFX0hPU1Q9JChpcHY0X2EpJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9TRVJWSUNFX1BPUlQ9JChpcF9wKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfU0VSVklDRV9QT1JUXyQoZG5zX2xhYmVsKT0kKGlwX3ApJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9QT1JUPXRjcDovLyQoaXB2NF9hKTokKGlwX3ApJCIsCiAgICAgICAgIl5BWlVSRV9DTElFTlRfSUQ9W0EtRmEtZjAtOS1dKiQiLAogICAgICAgICJeQVpVUkVfVEVOQU5UX0lEPVtBLUZhLWYwLTktXSokIiwKICAgICAgICAiXkFaVVJFX0ZFREVSQVRFRF9UT0tFTl9GSUxFPS92YXIvcnVuL3NlY3JldHMvYXp1cmUvdG9rZW5zL2F6dXJlLWlkZW50aXR5LXRva2VuJCIsCiAgICAgICAgIl5BWlVSRV9BVVRIT1JJVFlfSE9TVD1odHRwczovL2xvZ2luXFwubWljcm9zb2Z0b25saW5lXFwuY29tLyQiLAogICAgICAgICJeVEVSTT14dGVybSQiCiAgICAgIF0sCiAgICAgICJhbGxvd19lbnZfcmVnZXhfbWFwIjogewogICAgICAgICJDUFVfTElNSVQiOiAiXlswLTldKyQiLAogICAgICAgICJKT0JfQ09NUExFVElPTl9JTkRFWCI6ICJeWzAtOV0qJCIsCiAgICAgICAgIk1FTU9SWV9MSU1JVCI6ICJeWzAtOV0rJCIKICAgICAgfQogICAgfSwKICAgICJDb3B5RmlsZVJlcXVlc3QiOiBbCiAgICAgICIkKHNmcHJlZml4KSIKICAgIF0sCiAgICAiRXhlY1Byb2Nlc3NSZXF1ZXN0IjogewogICAgICAiYWxsb3dlZF9jb21tYW5kcyI6IFtdLAogICAgICAicmVnZXgiOiBbXQogICAgfSwKICAgICJVcGRhdGVSb3V0ZXNSZXF1ZXN0IjogewogICAgICAiZm9yYmlkZGVuX2RldmljZV9uYW1lcyI6IFsKICAgICAgICAibG8iCiAgICAgIF0sCiAgICAgICJmb3JiaWRkZW5fc291cmNlX3JlZ2V4IjogWwogICAgICAgICJeKD86MHswLDR9Oil7MCw3fTB7MCwzfTEkIiwKICAgICAgICAiXjEyN1xcLig/OlswLTldezEsM31cXC4pezJ9WzAtOV17MSwzfSQiCiAgICAgIF0KICAgIH0sCiAgICAiVXBkYXRlSW50ZXJmYWNlUmVxdWVzdCI6IHsKICAgICAgImFsbG93X3Jhd19mbGFncyI6IDEyOCwKICAgICAgImZvcmJpZGRlbl9uYW1lcyI6IFsKICAgICAgICAibG8iCiAgICAgIF0sCiAgICAgICJmb3JiaWRkZW5faHdfYWRkcnMiOiBbCiAgICAgICAgIjAwOjAwOjAwOjAwOjAwOjAwIgogICAgICBdCiAgICB9LAogICAgIkNsb3NlU3RkaW5SZXF1ZXN0IjogZmFsc2UsCiAgICAiUmVhZFN0cmVhbVJlcXVlc3QiOiBmYWxzZSwKICAgICJVcGRhdGVFcGhlbWVyYWxNb3VudHNSZXF1ZXN0IjogZmFsc2UsCiAgICAiV3JpdGVTdHJlYW1SZXF1ZXN0IjogZmFsc2UKICB9Cn0= + spec: + containers: + - args: + - test-webserver + image: "registry.k8s.io/e2e-test-images/agnhost:2.43" + imagePullPolicy: IfNotPresent + name: webserver + resources: {} + securityContext: {} + terminationMessagePath: /dev/termination-log + terminationMessagePolicy: File + volumeMounts: + - mountPath: /results + name: results + - mountPath: /var/run/secrets/kubernetes.io/serviceaccount + name: kube-api-access-9txsp + readOnly: true + - args: + - "for i in `seq 1 600`; do check=\"$$(dig +notcp +noall +answer +search dns-test-service A)\" && test -n \"$$check\" && echo OK > /results/wheezy_udp@dns-test-service;check=\"$$(dig +tcp +noall +answer +search dns-test-service A)\" && test -n \"$$check\" && echo OK > /results/wheezy_tcp@dns-test-service;check=\"$$(dig +notcp +noall +answer +search dns-test-service.dns-1370 A)\" && test -n \"$$check\" && echo OK > /results/wheezy_udp@dns-test-service.dns-1370;check=\"$$(dig +tcp +noall +answer +search dns-test-service.dns-1370 A)\" && test -n \"$$check\" && echo OK > /results/wheezy_tcp@dns-test-service.dns-1370;check=\"$$(dig +notcp +noall +answer +search dns-test-service.dns-1370.svc A)\" && test -n \"$$check\" && echo OK > /results/wheezy_udp@dns-test-service.dns-1370.svc;check=\"$$(dig +tcp +noall +answer +search dns-test-service.dns-1370.svc A)\" && test -n \"$$check\" && echo OK > /results/wheezy_tcp@dns-test-service.dns-1370.svc;check=\"$$(dig +notcp +noall +answer +search _http._tcp.dns-test-service.dns-1370.svc SRV)\" && test -n \"$$check\" && echo OK > /results/wheezy_udp@_http._tcp.dns-test-service.dns-1370.svc;check=\"$$(dig +tcp +noall +answer +search _http._tcp.dns-test-service.dns-1370.svc SRV)\" && test -n \"$$check\" && echo OK > /results/wheezy_tcp@_http._tcp.dns-test-service.dns-1370.svc;check=\"$$(dig +notcp +noall +answer +search _http._tcp.test-service-2.dns-1370.svc SRV)\" && test -n \"$$check\" && echo OK > /results/wheezy_udp@_http._tcp.test-service-2.dns-1370.svc;check=\"$$(dig +tcp +noall +answer +search _http._tcp.test-service-2.dns-1370.svc SRV)\" && test -n \"$$check\" && echo OK > /results/wheezy_tcp@_http._tcp.test-service-2.dns-1370.svc;check=\"$$(dig +notcp +noall +answer +search 77.65.0.10.in-addr.arpa. PTR)\" && test -n \"$$check\" && echo OK > /results/10.0.65.77_udp@PTR;check=\"$$(dig +tcp +noall +answer +search 77.65.0.10.in-addr.arpa. PTR)\" && test -n \"$$check\" && echo OK > /results/10.0.65.77_tcp@PTR;sleep 1; done" + command: + - sh + - "-c" + image: "registry.k8s.io/e2e-test-images/agnhost:2.43" + imagePullPolicy: IfNotPresent + name: querier + resources: {} + securityContext: {} + terminationMessagePath: /dev/termination-log + terminationMessagePolicy: File + volumeMounts: + - mountPath: /results + name: results + - mountPath: /var/run/secrets/kubernetes.io/serviceaccount + name: kube-api-access-9txsp + readOnly: true + - command: + - sh + - "-c" + - "for i in `seq 1 600`; do check=\"$$(dig +notcp +noall +answer +search dns-test-service A)\" && test -n \"$$check\" && echo OK > /results/jessie_udp@dns-test-service;check=\"$$(dig +tcp +noall +answer +search dns-test-service A)\" && test -n \"$$check\" && echo OK > /results/jessie_tcp@dns-test-service;check=\"$$(dig +notcp +noall +answer +search dns-test-service.dns-1370 A)\" && test -n \"$$check\" && echo OK > /results/jessie_udp@dns-test-service.dns-1370;check=\"$$(dig +tcp +noall +answer +search dns-test-service.dns-1370 A)\" && test -n \"$$check\" && echo OK > /results/jessie_tcp@dns-test-service.dns-1370;check=\"$$(dig +notcp +noall +answer +search dns-test-service.dns-1370.svc A)\" && test -n \"$$check\" && echo OK > /results/jessie_udp@dns-test-service.dns-1370.svc;check=\"$$(dig +tcp +noall +answer +search dns-test-service.dns-1370.svc A)\" && test -n \"$$check\" && echo OK > /results/jessie_tcp@dns-test-service.dns-1370.svc;check=\"$$(dig +notcp +noall +answer +search _http._tcp.dns-test-service.dns-1370.svc SRV)\" && test -n \"$$check\" && echo OK > /results/jessie_udp@_http._tcp.dns-test-service.dns-1370.svc;check=\"$$(dig +tcp +noall +answer +search _http._tcp.dns-test-service.dns-1370.svc SRV)\" && test -n \"$$check\" && echo OK > /results/jessie_tcp@_http._tcp.dns-test-service.dns-1370.svc;check=\"$$(dig +notcp +noall +answer +search _http._tcp.test-service-2.dns-1370.svc SRV)\" && test -n \"$$check\" && echo OK > /results/jessie_udp@_http._tcp.test-service-2.dns-1370.svc;check=\"$$(dig +tcp +noall +answer +search _http._tcp.test-service-2.dns-1370.svc SRV)\" && test -n \"$$check\" && echo OK > /results/jessie_tcp@_http._tcp.test-service-2.dns-1370.svc;check=\"$$(dig +notcp +noall +answer +search 77.65.0.10.in-addr.arpa. PTR)\" && test -n \"$$check\" && echo OK > /results/10.0.65.77_udp@PTR;check=\"$$(dig +tcp +noall +answer +search 77.65.0.10.in-addr.arpa. PTR)\" && test -n \"$$check\" && echo OK > /results/10.0.65.77_tcp@PTR;sleep 1; done" + image: "registry.k8s.io/e2e-test-images/jessie-dnsutils:1.7" + imagePullPolicy: IfNotPresent + name: jessie-querier + resources: {} + terminationMessagePath: /dev/termination-log + terminationMessagePolicy: File + volumeMounts: + - mountPath: /results + name: results + - mountPath: /var/run/secrets/kubernetes.io/serviceaccount + name: kube-api-access-9txsp + readOnly: true + dnsPolicy: ClusterFirst + enableServiceLinks: true + hostname: dns-querier-1 + nodeSelector: + katacontainers.io/kata-runtime: "true" + preemptionPolicy: PreemptLowerPriority + priority: 0 + restartPolicy: Always + runtimeClassName: kata-cc + schedulerName: default-scheduler + securityContext: {} + serviceAccount: default + serviceAccountName: default + subdomain: dns-test-service + terminationGracePeriodSeconds: 0 + tolerations: + - effect: NoExecute + key: node.kubernetes.io/not-ready + operator: Exists + tolerationSeconds: 300 + - effect: NoExecute + key: node.kubernetes.io/unreachable + operator: Exists + tolerationSeconds: 300 + volumes: + - emptyDir: {} + name: results + - name: kube-api-access-9txsp + projected: + defaultMode: 420 + sources: + - serviceAccountToken: + expirationSeconds: 3607 + path: token + - configMap: + items: + - key: ca.crt + path: ca.crt + name: kube-root-ca.crt + - downwardAPI: + items: + - fieldRef: + apiVersion: v1 + fieldPath: metadata.namespace + path: namespace + status: + conditions: + - lastProbeTime: ~ + lastTransitionTime: "2023-09-22T17:18:29Z" + status: "True" + type: Initialized + - lastProbeTime: ~ + lastTransitionTime: "2023-09-22T17:18:29Z" + message: "containers with unready status: [webserver querier jessie-querier]" + reason: ContainersNotReady + status: "False" + type: Ready + - lastProbeTime: ~ + lastTransitionTime: "2023-09-22T17:18:29Z" + message: "containers with unready status: [webserver querier jessie-querier]" + reason: ContainersNotReady + status: "False" + type: ContainersReady + - lastProbeTime: ~ + lastTransitionTime: "2023-09-22T17:18:29Z" + status: "True" + type: PodScheduled + containerStatuses: + - image: "registry.k8s.io/e2e-test-images/jessie-dnsutils:1.7" + imageID: "" + lastState: {} + name: jessie-querier + ready: false + restartCount: 0 + started: false + state: + waiting: + reason: ContainerCreating + - image: "registry.k8s.io/e2e-test-images/agnhost:2.43" + imageID: "" + lastState: {} + name: querier + ready: false + restartCount: 0 + started: false + state: + waiting: + reason: ContainerCreating + - image: "registry.k8s.io/e2e-test-images/agnhost:2.43" + imageID: "" + lastState: {} + name: webserver + ready: false + restartCount: 0 + started: false + state: + waiting: + reason: ContainerCreating + hostIP: 10.224.0.5 + phase: Pending + qosClass: BestEffort + startTime: "2023-09-22T17:18:29Z" diff --git a/src/agent/src/config.rs b/src/agent/src/config.rs index c124d6015d27..04a65b93e909 100644 --- a/src/agent/src/config.rs +++ b/src/agent/src/config.rs @@ -2,7 +2,6 @@ // // SPDX-License-Identifier: Apache-2.0 // - use anyhow::{anyhow, bail, ensure, Context, Result}; use serde::Deserialize; use std::env; diff --git a/src/agent/src/device/block_device_handler.rs b/src/agent/src/device/block_device_handler.rs index d518f9d56ad1..7709a28758a8 100644 --- a/src/agent/src/device/block_device_handler.rs +++ b/src/agent/src/device/block_device_handler.rs @@ -7,11 +7,11 @@ #[cfg(target_arch = "s390x")] use crate::ccw; use crate::device::{ - pcipath_to_sysfs, DeviceContext, DeviceHandler, DeviceInfo, SpecUpdate, BLOCK, + DeviceContext, DeviceHandler, DeviceInfo, SpecUpdate, BLOCK, }; #[cfg(target_arch = "s390x")] use crate::linux_abi::CCW_ROOT_BUS_PATH; -use crate::linux_abi::{create_pci_root_bus_path, SYSFS_DIR, SYSTEM_DEV_PATH}; +use crate::linux_abi::SYSTEM_DEV_PATH; use crate::pci; use crate::sandbox::Sandbox; use crate::uevent::{wait_for_uevent, Uevent, UeventMatcher}; @@ -43,7 +43,7 @@ impl DeviceHandler for VirtioBlkPciDeviceHandler { #[instrument] async fn device_handler(&self, device: &Device, ctx: &mut DeviceContext) -> Result { - let pcipath = pci::Path::from_str(&device.id)?; + let pcipath = pci::Address::from_str(&device.id)?; let vm_path = get_virtio_blk_pci_device_name(ctx.sandbox, &pcipath).await?; Ok(DeviceInfo::new(&vm_path, true) @@ -107,11 +107,10 @@ impl DeviceHandler for VirtioBlkMmioDeviceHandler { #[instrument] pub async fn get_virtio_blk_pci_device_name( sandbox: &Arc>, - pcipath: &pci::Path, + pciaddr: &pci::Address, ) -> Result { - let root_bus_sysfs = format!("{}{}", SYSFS_DIR, create_pci_root_bus_path()); - let sysfs_rel_path = pcipath_to_sysfs(&root_bus_sysfs, pcipath)?; - let matcher = VirtioBlkPciMatcher::new(&sysfs_rel_path); + let sysfs_path = pciaddr.get_sysfs_path(); + let matcher = VirtioBlkPciMatcher::new(&sysfs_path); let uev = wait_for_uevent(sandbox, matcher).await?; Ok(format!("{}/{}", SYSTEM_DEV_PATH, &uev.devname)) @@ -162,9 +161,8 @@ pub struct VirtioBlkPciMatcher { } impl VirtioBlkPciMatcher { - pub fn new(relpath: &str) -> VirtioBlkPciMatcher { - let root_bus = create_pci_root_bus_path(); - let re = format!(r"^{}{}/virtio[0-9]+/block/", root_bus, relpath); + pub fn new(sysfspath: &str) -> VirtioBlkPciMatcher { + let re = format!(r"^{sysfspath}/virtio[0-9]+/block/"); VirtioBlkPciMatcher { rex: Regex::new(&re).expect("BUG: failed to compile VirtioBlkPciMatcher regex"), diff --git a/src/agent/src/main.rs b/src/agent/src/main.rs index 2e7698706c74..03ee13d26c54 100644 --- a/src/agent/src/main.rs +++ b/src/agent/src/main.rs @@ -638,7 +638,7 @@ async fn initialize_policy() -> Result<()> { .await .initialize( AGENT_CONFIG.log_level.as_usize(), - AGENT_CONFIG.policy_file.clone(), + "/etc/kata-opa/default-policy.rego", None, ) .await diff --git a/src/agent/src/mount.rs b/src/agent/src/mount.rs index ec7cf7dff1a1..b2bcdc6c9a9b 100644 --- a/src/agent/src/mount.rs +++ b/src/agent/src/mount.rs @@ -6,7 +6,7 @@ use std::collections::HashMap; use std::fmt::Debug; use std::fs::{self, File}; -use std::io::{BufRead, BufReader}; +use std::io::{self, BufRead, BufReader}; use std::ops::Deref; use std::path::Path; @@ -308,10 +308,43 @@ pub fn cgroups_mount(logger: &Logger, unified_cgroup_hierarchy: bool) -> Result< Ok(()) } +pub fn find_dm_name(mount_point: &str) -> io::Result> { + let mapper = Path::new("/dev/mapper"); + let target = Path::new(mount_point); + + for mount in proc_mounts::MountIter::new()? { + if let Ok(m) = mount { + if m.dest != target { + continue; + } + + if let Some(p) = m.source.parent() { + if p == mapper { + if let Some(f) = m.source.file_name() { + return Ok(Some(f.to_string_lossy().into())); + } + } + } + + break; + } + } + Ok(None) +} + #[instrument] -pub fn remove_mounts + std::fmt::Debug>(mounts: &[P]) -> Result<()> { +pub fn remove_mounts(mounts: &[String]) -> Result<()> { for m in mounts.iter() { - nix::mount::umount(m.as_ref()).context(format!("failed to umount {:?}", m.as_ref()))?; + let dm_target = find_dm_name(&m); + nix::mount::umount(m.as_str()).context(format!("failed to umount {:?}", m))?; + if let Some(dm_name) = dm_target? { + let dm = devicemapper::DM::new()?; + let name = devicemapper::DmName::new(&dm_name)?; + dm.device_remove( + &devicemapper::DevId::Name(&name), + devicemapper::DmOptions::default(), + )?; + } } Ok(()) } diff --git a/src/agent/src/pci.rs b/src/agent/src/pci.rs index 4cb6b521ae4b..e97403d39b99 100644 --- a/src/agent/src/pci.rs +++ b/src/agent/src/pci.rs @@ -109,6 +109,14 @@ impl Address { slotfn, } } + + pub fn get_sysfs_path(&self) -> String { + // Example: /devices/pci0001:00/0001:00:01.0 + format!( + "/devices/pci{:04x}:00/{:04x}:{:02x}:{}", + self.domain, self.domain, self.bus, self.slotfn + ) + } } impl FromStr for Address { diff --git a/src/agent/src/policy.rs b/src/agent/src/policy.rs index 1b8f391c0b13..13ae5fa3012f 100644 --- a/src/agent/src/policy.rs +++ b/src/agent/src/policy.rs @@ -3,11 +3,15 @@ // SPDX-License-Identifier: Apache-2.0 // +use kata_agent_policy::policy::{AgentPolicy, PolicyCopyFileRequest, PolicyCreateContainerRequest}; +use nix::sys::stat; use protobuf::MessageDyn; +use std::ffi::OsStr; +use std::os::unix::ffi::OsStrExt; +use std::path::PathBuf; use crate::rpc::ttrpc_error; use crate::AGENT_POLICY; -use kata_agent_policy::policy::AgentPolicy; async fn allow_request(policy: &mut AgentPolicy, ep: &str, request: &str) -> ttrpc::Result<()> { match policy.allow_request(ep, request).await { @@ -34,6 +38,49 @@ pub async fn is_allowed(req: &(impl MessageDyn + serde::Serialize)) -> ttrpc::Re allow_request(&mut policy, req.descriptor_dyn().name(), &request).await } +pub async fn is_allowed_copy_file(req: &protocols::agent::CopyFileRequest) -> ttrpc::Result<()> { + let sflag = stat::SFlag::from_bits_truncate(req.file_mode); + let symlink_src = if sflag.contains(stat::SFlag::S_IFLNK) { + // The symlink source path + PathBuf::from(OsStr::from_bytes(&req.data)) + } else { + // If this CopyFile request is not creating a symlink, remove the incoming data bytes, + // to avoid sending large amounts of data to OPA, that is unlikely to be use this data anyway. + PathBuf::new() + }; + + let policy_req = PolicyCopyFileRequest { + path: req.path.clone(), + file_size: req.file_size, + file_mode: req.file_mode, + dir_mode: req.dir_mode, + uid: req.uid, + gid: req.gid, + offset: req.offset, + + symlink_src, + }; + + let request = serde_json::to_string(&policy_req).unwrap(); + let mut policy = AGENT_POLICY.lock().await; + allow_request(&mut policy, "CopyFileRequest", &request).await +} + +pub async fn is_allowed_create_container( + req: &protocols::agent::CreateContainerRequest, +) -> ttrpc::Result<()> { + let env_map = get_env_map(&req.OCI.Process.Env); + + let create_container_request = PolicyCreateContainerRequest { + base: req.clone(), + env_map, + }; + + let request = serde_json::to_string(&create_container_request).unwrap(); + let mut policy = AGENT_POLICY.lock().await; + allow_request(&mut policy, "CreateContainerRequest", &request).await +} + pub async fn do_set_policy(req: &protocols::agent::SetPolicyRequest) -> ttrpc::Result<()> { let request = serde_json::to_string(req).unwrap(); let mut policy = AGENT_POLICY.lock().await; @@ -43,3 +90,20 @@ pub async fn do_set_policy(req: &protocols::agent::SetPolicyRequest) -> ttrpc::R .await .map_err(|e| ttrpc_error(ttrpc::Code::INVALID_ARGUMENT, e)) } + +// todo: move to common crate shared with genpolicy +fn get_env_map(env: &[String]) -> std::collections::BTreeMap { + let env_map: std::collections::BTreeMap = env + .iter() + .filter_map(|v| { + // split by leftmost '=' + let split = v.split_once('='); + if let Some((key, value)) = split { + Some((key.to_string(), value.to_string())) + } else { + None + } + }) + .collect(); + env_map +} diff --git a/src/agent/src/rpc.rs b/src/agent/src/rpc.rs index 081eef29e8da..5be0dee4c4a5 100644 --- a/src/agent/src/rpc.rs +++ b/src/agent/src/rpc.rs @@ -11,7 +11,6 @@ use tokio::sync::Mutex; use std::convert::TryFrom; use std::ffi::{CString, OsStr}; use std::fmt::Debug; -use std::io; use std::os::unix::ffi::OsStrExt; use std::path::Path; use std::str::FromStr; @@ -58,7 +57,6 @@ use rustjail::process::ProcessOperations; #[cfg(target_arch = "s390x")] use crate::ccw; use crate::cdh; -use crate::device::block_device_handler::get_virtio_blk_pci_device_name; #[cfg(target_arch = "s390x")] use crate::device::network_device_handler::wait_for_ccw_net_interface; #[cfg(not(target_arch = "s390x"))] @@ -85,7 +83,7 @@ use crate::trace_rpc_call; use crate::tracer::extract_carrier_from_ttrpc; #[cfg(feature = "agent-policy")] -use crate::policy::{do_set_policy, is_allowed}; +use crate::policy::{do_set_policy, is_allowed, is_allowed_copy_file, is_allowed_create_container}; #[cfg(feature = "guest-pull")] use crate::image; @@ -96,7 +94,7 @@ use tracing_opentelemetry::OpenTelemetrySpanExt; use tracing::instrument; -use libc::{self, c_char, c_ushort, pid_t, winsize, TIOCSWINSZ}; +use libc::{self, c_ushort, pid_t, winsize, TIOCSWINSZ}; use std::fs; use std::os::unix::prelude::PermissionsExt; use std::process::{Command, Stdio}; @@ -151,6 +149,17 @@ pub fn ttrpc_error(code: ttrpc::Code, err: impl Debug) -> ttrpc::Error { async fn is_allowed(_req: &impl serde::Serialize) -> ttrpc::Result<()> { Ok(()) } +#[cfg(not(feature = "agent-policy"))] +async fn is_allowed_copy_file(_req: &CopyFileRequest) -> ttrpc::Result<()> { + Ok(()) +} + +#[cfg(not(feature = "agent-policy"))] +async fn is_allowed_create_container( + _req: &protocols::agent::CreateContainerRequest, +) -> ttrpc::Result<()> { + Ok(()) +} fn same(e: E) -> E { e @@ -747,7 +756,7 @@ impl agent_ttrpc::AgentService for AgentService { req: protocols::agent::CreateContainerRequest, ) -> ttrpc::Result { trace_rpc_call!(ctx, "create_container", req); - is_allowed(&req).await?; + is_allowed_create_container(&req).await?; self.do_create_container(req).await.map_ttrpc_err(same)?; Ok(Empty::new()) } @@ -1473,7 +1482,7 @@ impl agent_ttrpc::AgentService for AgentService { req: protocols::agent::CopyFileRequest, ) -> ttrpc::Result { trace_rpc_call!(ctx, "copy_file", req); - is_allowed(&req).await?; + is_allowed_copy_file(&req).await?; do_copy_file(&req).map_ttrpc_err(same)?; @@ -1881,7 +1890,10 @@ async fn remove_container_resources(sandbox: &mut Sandbox, cid: &str) -> Result< } } - for m in cmounts.iter() { + // Unmount in reverse order so that if the i-th mount depends on the j-th mount (with j < i), + // then the i-th mount is unmounted first. This way there won't be any references to the j-th + // mount anymore when it's unmounted. + for m in cmounts.iter().rev() { if let Err(err) = sandbox.remove_sandbox_storage(m).await { error!( sl(), @@ -2085,37 +2097,12 @@ fn do_copy_file(req: &CopyFileRequest) -> Result<()> { Ok(()) } -async fn do_add_swap(sandbox: &Arc>, req: &AddSwapRequest) -> Result<()> { - let mut slots = Vec::new(); - for slot in &req.PCIPath { - slots.push(pci::SlotFn::new(*slot, 0)?); - } - let pcipath = pci::Path::new(slots)?; - let dev_name = get_virtio_blk_pci_device_name(sandbox, &pcipath).await?; - - let c_str = CString::new(dev_name)?; - let ret = unsafe { libc::swapon(c_str.as_ptr() as *const c_char, 0) }; - if ret != 0 { - return Err(anyhow!( - "libc::swapon get error {}", - io::Error::last_os_error() - )); - } - - Ok(()) +async fn do_add_swap(_sandbox: &Arc>, _req: &AddSwapRequest) -> Result<()> { + Err(anyhow!(nix::Error::ENOTSUP)) } -async fn do_add_swap_path(req: &AddSwapPathRequest) -> Result<()> { - let c_str = CString::new(req.path.clone())?; - let ret = unsafe { libc::swapon(c_str.as_ptr() as *const c_char, 0) }; - if ret != 0 { - return Err(anyhow!( - "libc::swapon get error {}", - io::Error::last_os_error() - )); - } - - Ok(()) +async fn do_add_swap_path(_req: &AddSwapPathRequest) -> Result<()> { + Err(anyhow!(nix::Error::ENOTSUP)) } // Setup container bundle under CONTAINER_BASE, which is cleaned up diff --git a/src/agent/src/storage/block_handler.rs b/src/agent/src/storage/block_handler.rs index 251a4dfff70a..6cf9af31d79a 100644 --- a/src/agent/src/storage/block_handler.rs +++ b/src/agent/src/storage/block_handler.rs @@ -83,8 +83,8 @@ impl StorageHandler for VirtioBlkPciHandler { return Err(anyhow!("Invalid device {}", &storage.source)); } } else { - let pcipath = pci::Path::from_str(&storage.source)?; - let dev_path = get_virtio_blk_pci_device_name(ctx.sandbox, &pcipath).await?; + let pciaddr = pci::Address::from_str(&storage.source)?; + let dev_path = get_virtio_blk_pci_device_name(ctx.sandbox, &pciaddr).await?; storage.source = dev_path; } diff --git a/src/agent/src/storage/fs_handler.rs b/src/agent/src/storage/fs_handler.rs index 98b23d6550b2..7d7c4d863d95 100644 --- a/src/agent/src/storage/fs_handler.rs +++ b/src/agent/src/storage/fs_handler.rs @@ -10,7 +10,7 @@ use std::sync::Arc; use crate::storage::{common_storage_handler, new_device, StorageContext, StorageHandler}; use anyhow::{anyhow, Context, Result}; -use kata_types::device::{DRIVER_9P_TYPE, DRIVER_OVERLAYFS_TYPE, DRIVER_VIRTIOFS_TYPE}; +use kata_types::device::{DRIVER_9P_TYPE, DRIVER_OVERLAYFS_TYPE, DRIVER_SMB_TYPE, DRIVER_VIRTIOFS_TYPE}; use kata_types::mount::StorageDevice; use protocols::agent::Storage; use tracing::instrument; @@ -56,7 +56,10 @@ impl StorageHandler for OverlayfsHandler { .push(format!("workdir={}", work.to_string_lossy())); } + let saved = std::env::current_dir()?; + std::env::set_current_dir(Path::new("/run/kata-containers/sandbox/layers"))?; let path = common_storage_handler(ctx.logger, &storage)?; + std::env::set_current_dir(saved)?; new_device(path) } } @@ -102,3 +105,23 @@ impl StorageHandler for VirtioFsHandler { new_device(path) } } + +#[derive(Debug)] +pub struct SMBHandler {} + +#[async_trait::async_trait] +impl StorageHandler for SMBHandler { + fn driver_types(&self) -> &[&str] { + &[DRIVER_SMB_TYPE] + } + + #[instrument] + async fn create_device( + &self, + storage: Storage, + ctx: &mut StorageContext, + ) -> Result> { + let path = common_storage_handler(ctx.logger, &storage)?; + new_device(path) + } +} diff --git a/src/agent/src/storage/mod.rs b/src/agent/src/storage/mod.rs index c1f87b9a4283..1639c0b28d24 100644 --- a/src/agent/src/storage/mod.rs +++ b/src/agent/src/storage/mod.rs @@ -5,7 +5,8 @@ // use std::collections::HashMap; -use std::fs; +use std::fs::{self, File}; +use std::io::{Read, Seek}; use std::os::unix::fs::{MetadataExt, PermissionsExt}; use std::path::Path; use std::sync::Arc; @@ -19,11 +20,12 @@ use protocols::types::FSGroupChangePolicy; use slog::Logger; use tokio::sync::Mutex; use tracing::instrument; +use zerocopy::AsBytes; use self::bind_watcher_handler::BindWatcherHandler; use self::block_handler::{PmemHandler, ScsiHandler, VirtioBlkMmioHandler, VirtioBlkPciHandler}; use self::ephemeral_handler::EphemeralHandler; -use self::fs_handler::{OverlayfsHandler, Virtio9pHandler, VirtioFsHandler}; +use self::fs_handler::{OverlayfsHandler, SMBHandler, Virtio9pHandler, VirtioFsHandler}; #[cfg(feature = "guest-pull")] use self::image_pull_handler::ImagePullHandler; use self::local_handler::LocalHandler; @@ -150,6 +152,7 @@ lazy_static! { Arc::new(self::block_handler::VirtioBlkCcwHandler {}), #[cfg(feature = "guest-pull")] Arc::new(ImagePullHandler {}), + Arc::new(SMBHandler {}), ]; for handler in handlers { @@ -250,11 +253,112 @@ pub(crate) fn new_device(path: String) -> Result> { Ok(Arc::new(device)) } -#[instrument] -pub(crate) fn common_storage_handler(logger: &Logger, storage: &Storage) -> Result { +fn prepare_dm_target(path: &str, hash: &str) -> Result<(u64, u64, String, String)> { + let mut file = File::open(path)?; + let size = file.seek(std::io::SeekFrom::End(0))?; + if size < 4096 { + return Err(anyhow!("Block device ({path}) is too small: {size}")); + } + + file.seek(std::io::SeekFrom::End(-4096))?; + let mut buf = [0u8; 4096]; + file.read_exact(&mut buf)?; + + let mut sb = verity::SuperBlock::default(); + sb.as_bytes_mut() + .copy_from_slice(&buf[4096 - 512..][..std::mem::size_of::()]); + let data_block_size = u64::from(sb.data_block_size.get()); + let hash_block_size = u64::from(sb.hash_block_size.get()); + let data_size = sb + .data_block_count + .get() + .checked_mul(data_block_size) + .ok_or_else(|| anyhow!("Invalid data size"))?; + if data_size > size { + return Err(anyhow!( + "Data size ({data_size}) is greater than device size ({size}) for device {path}" + )); + } + + // TODO: Store other parameters in super block: version, hash type, salt. + Ok(( + 0, + data_size / 512, + "verity".into(), + format!( + "1 {path} {path} {data_block_size} {hash_block_size +} {} {} sha256 {hash} 0000000000000000000000000000000000000000000000000000000000000000", + data_size / data_block_size, + (data_size + hash_block_size - 1) / hash_block_size + ), + )) +} + +fn mount_storage_handler(logger: &Logger, storage: &Storage) -> Result { + // Mount the storage device. + let mount_point = storage.mount_point.to_string(); + mount_storage(logger, storage)?; set_ownership(logger, storage)?; - Ok(storage.mount_point.clone()) + Ok(mount_point) +} + +#[instrument] +pub(crate) fn common_storage_handler(logger: &Logger, storage: &Storage) -> Result { + const DM_VERITY: &str = "io.katacontainers.fs-opt.root-hash="; + let opt = if let Some(o) = storage.options.iter().find(|e| e.starts_with(DM_VERITY)) { + o + } else { + // No dm-verity, so just run the regular handler. + return mount_storage_handler(logger, storage); + }; + + // Enable dm-verity then call the handler. + let mount_path = Path::new(&storage.mount_point); + info!( + logger, + "dm-verity enabled for mount source={:?}, dest={:?}", storage.source, mount_path + ); + + let fname = mount_path + .file_name() + .ok_or_else(|| anyhow!("Unable to get file name from mount path: {:?}", mount_path))? + .to_str() + .ok_or_else(|| { + anyhow!( + "Unable to convert file name to utf8 string: {:?}", + mount_path + ) + })?; + + let dm = devicemapper::DM::new()?; + let name = devicemapper::DmName::new(fname)?; + let opts = devicemapper::DmOptions::default().set_flags(devicemapper::DmFlags::DM_READONLY); + dm.device_create(&name, None, opts) + .context("Unable to create dm device")?; + + let id = devicemapper::DevId::Name(name); + + (|| { + dm.table_load( + &id, + &[prepare_dm_target(&storage.source, &opt[DM_VERITY.len()..])?], + opts, + ) + .context("Unable to load dm-verity table")?; + dm.device_suspend(&id, opts) + .context("Unable to unsuspend dm device")?; + + let mut storage = storage.clone(); + storage.source = format!("/dev/mapper/{fname}"); + mount_storage_handler(logger, &storage) + })() + .map_err(|e| { + if let Err(err) = dm.device_remove(&id, devicemapper::DmOptions::default()) { + error!(logger, "Unable to remove dm device ({fname}): {:?}", err); + } + e + }) } // mount_storage performs the mount described by the storage structure. diff --git a/src/libs/Cargo.lock b/src/libs/Cargo.lock index 1cdd13212d37..8c6a1196ac34 100644 --- a/src/libs/Cargo.lock +++ b/src/libs/Cargo.lock @@ -1,29 +1,29 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. -version = 3 +version = 4 [[package]] name = "addr2line" -version = "0.22.0" +version = "0.24.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e4503c46a5c0c7844e948c9a4d6acd9f50cccb4de1c48eb9e291ea17470c678" +checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" dependencies = [ "gimli", ] [[package]] -name = "adler" -version = "1.0.2" +name = "adler2" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" +checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" [[package]] name = "ahash" -version = "0.7.7" +version = "0.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a824f2aa7e75a0c98c5a504fceb80649e9c35265d44525b5f94de4771a395cd" +checksum = "891477e0c6a8957309ee5c45a6368af3ae14bb510732d2684ffa19af310920f9" dependencies = [ - "getrandom", + "getrandom 0.2.15", "once_cell", "version_check", ] @@ -37,65 +37,69 @@ dependencies = [ "memchr", ] +[[package]] +name = "android-tzdata" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" + +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + [[package]] name = "anyhow" -version = "1.0.57" +version = "1.0.97" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08f9b8508dccb7687a1d6c4ce66b2b0ecef467c94667de27d8d7fe1f8d2a9cdc" +checksum = "dcfed56ad506cb2c684a14971b8861fdc3baaaae314b9e5f9bb532cbe3ba7a4f" [[package]] name = "arc-swap" -version = "1.5.0" +version = "1.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5d78ce20460b82d3fa150275ed9d55e21064fc7951177baacf86a145c4a4b1f" +checksum = "69f7f8c3906b62b754cd5326047894316021dcfe5a194c8ea52bdd94934a3457" [[package]] name = "arrayvec" -version = "0.7.4" +version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" +checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" [[package]] name = "async-trait" -version = "0.1.53" +version = "0.1.88" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed6aa3524a2dfcf9fe180c51eae2b58738348d819517ceadf95789c51fff7600" +checksum = "e539d3fca749fcee5236ab05e93a52867dd549cc157c8cb7f99595f3cedffdb5" dependencies = [ "proc-macro2", "quote", - "syn 1.0.91", -] - -[[package]] -name = "atty" -version = "0.2.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" -dependencies = [ - "hermit-abi", - "libc", - "winapi", + "syn 2.0.100", ] [[package]] name = "autocfg" -version = "1.1.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" +checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" [[package]] name = "backtrace" -version = "0.3.73" +version = "0.3.74" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cc23269a4f8976d0a4d2e7109211a419fe30e8d88d677cd60b6bc79c5732e0a" +checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" dependencies = [ "addr2line", - "cc", "cfg-if", "libc", "miniz_oxide", "object", "rustc-demangle", + "windows-targets 0.52.6", ] [[package]] @@ -106,18 +110,24 @@ checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" [[package]] name = "bitflags" -version = "1.2.1" +version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c8214115b7bf84099f1309324e63141d4c5d7cc26862f97a0a857dbefe165bd" [[package]] name = "bitmask-enum" -version = "2.1.0" +version = "2.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd9e32d7420c85055e8107e5b2463c4eeefeaac18b52359fe9f9c08a18f342b2" +checksum = "e6cbbb8f56245b5a479b30a62cdc86d26e2f35c2b9f594bc4671654b03851380" dependencies = [ "quote", - "syn 1.0.91", + "syn 2.0.100", ] [[package]] @@ -134,60 +144,38 @@ dependencies = [ [[package]] name = "borsh" -version = "0.10.3" +version = "1.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4114279215a005bc675e386011e594e1d9b800918cea18fcadadcce864a2046b" +checksum = "ad8646f98db542e39fc66e68a20b2144f6a732636df7c2354e74645faaa433ce" dependencies = [ "borsh-derive", - "hashbrown 0.12.3", + "cfg_aliases", ] [[package]] name = "borsh-derive" -version = "0.10.3" +version = "1.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0754613691538d51f329cce9af41d7b7ca150bc973056f1156611489475f54f7" +checksum = "fdd1d3c0c2f5833f22386f252fe8ed005c7f59fdcddeef025c01b4c3b9fd9ac3" dependencies = [ - "borsh-derive-internal", - "borsh-schema-derive-internal", + "once_cell", "proc-macro-crate", - "proc-macro2", - "syn 1.0.91", -] - -[[package]] -name = "borsh-derive-internal" -version = "0.10.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "afb438156919598d2c7bad7e1c0adf3d26ed3840dbc010db1a882a65583ca2fb" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.91", -] - -[[package]] -name = "borsh-schema-derive-internal" -version = "0.10.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "634205cc43f74a1b9046ef87c4540ebda95696ec0f315024860cad7c5b0f5ccd" -dependencies = [ "proc-macro2", "quote", - "syn 1.0.91", + "syn 2.0.100", ] [[package]] name = "bumpalo" -version = "3.11.0" +version = "3.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1ad822118d20d2c234f427000d5acc36eabe1e29a348c89b63dd60b13f28e5d" +checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf" [[package]] name = "byte-unit" -version = "5.1.2" +version = "5.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d405b41420a161b4e1dd5a52e3349f41b4dae9a39be02aff1d67fe53256430ac" +checksum = "e1cd29c3c585209b0cbc7309bfe3ed7efd8c84c21b7af29c8bfae908f8777174" dependencies = [ "rust_decimal", "serde", @@ -196,9 +184,9 @@ dependencies = [ [[package]] name = "bytecheck" -version = "0.6.11" +version = "0.6.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b6372023ac861f6e6dc89c8344a8f398fb42aaba2b5dbc649ca0c0e9dbcb627" +checksum = "23cdc57ce23ac53c931e88a43d06d070a6fd142f2617be5855eb75efc9beb1c2" dependencies = [ "bytecheck_derive", "ptr_meta", @@ -207,32 +195,35 @@ dependencies = [ [[package]] name = "bytecheck_derive" -version = "0.6.11" +version = "0.6.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7ec4c6f261935ad534c0c22dbef2201b45918860eb1c574b972bd213a76af61" +checksum = "3db406d29fbcd95542e92559bed4d8ad92636d1ca8b3b72ede10b4bcc010e659" dependencies = [ "proc-macro2", "quote", - "syn 1.0.91", + "syn 1.0.109", ] [[package]] name = "byteorder" -version = "1.4.3" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.5.0" +version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223" +checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" [[package]] name = "cc" -version = "1.0.99" +version = "1.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96c51067fd44124faa7f870b4b1c969379ad32b2ba805aa959430ceaa384f695" +checksum = "1fcb57c740ae1daf453ae85f16e37396f672b039e00d9d866e07ddb24e328e3a" +dependencies = [ + "shlex", +] [[package]] name = "cfg-if" @@ -240,18 +231,24 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +[[package]] +name = "cfg_aliases" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" + [[package]] name = "chrono" -version = "0.4.20" +version = "0.4.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6127248204b9aba09a362f6c930ef6a78f2c1b2215f8a7b398c06e1083f17af0" +checksum = "1a7964611d71df112cb1730f2ee67324fcf4d0fc6606acbbe9bfe06df124637c" dependencies = [ + "android-tzdata", + "iana-time-zone", "js-sys", - "num-integer", "num-traits", - "time 0.1.43", "wasm-bindgen", - "winapi", + "windows-link", ] [[package]] @@ -262,17 +259,16 @@ checksum = "2382f75942f4b3be3690fe4f86365e9c853c1587d6ee58212cebf6e2a9ccd101" [[package]] name = "core-foundation-sys" -version = "0.8.6" +version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" [[package]] name = "crossbeam" -version = "0.8.3" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6eb9105919ca8e40d437fc9cbb8f1975d916f1bd28afe795a48aae32a2cc8920" +checksum = "1137cd7e7fc0fb5d3c5a8678be38ec56e819125d8d7907411fe24ccb943faca8" dependencies = [ - "cfg-if", "crossbeam-channel", "crossbeam-deque", "crossbeam-epoch", @@ -282,54 +278,46 @@ dependencies = [ [[package]] name = "crossbeam-channel" -version = "0.5.10" +version = "0.5.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82a9b73a36529d9c47029b9fb3a6f0ea3cc916a261195352ba19e770fc1748b2" +checksum = "06ba6d68e24814cb8de6bb986db8222d3a027d15872cabc0d18817bc3c0e4471" dependencies = [ - "cfg-if", "crossbeam-utils", ] [[package]] name = "crossbeam-deque" -version = "0.8.4" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fca89a0e215bab21874660c67903c5f143333cab1da83d041c7ded6053774751" +checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" dependencies = [ - "cfg-if", "crossbeam-epoch", "crossbeam-utils", ] [[package]] name = "crossbeam-epoch" -version = "0.9.17" +version = "0.9.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e3681d554572a651dda4186cd47240627c3d0114d45a95f6ad27f2f22e7548d" +checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" dependencies = [ - "autocfg", - "cfg-if", "crossbeam-utils", ] [[package]] name = "crossbeam-queue" -version = "0.3.10" +version = "0.3.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adc6598521bb5a83d491e8c1fe51db7296019d2ca3cb93cc6c2a20369a4d78a2" +checksum = "0f58bbc28f91df819d0aa2a2c00cd19754769c2fad90579b3592b1c9ba7a3115" dependencies = [ - "cfg-if", "crossbeam-utils", ] [[package]] name = "crossbeam-utils" -version = "0.8.18" +version = "0.8.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3a430a770ebd84726f584a90ee7f020d28db52c6d02138900f22341f866d39c" -dependencies = [ - "cfg-if", -] +checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" [[package]] name = "darling" @@ -343,12 +331,12 @@ dependencies = [ [[package]] name = "darling" -version = "0.20.10" +version = "0.20.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f63b86c8a8826a49b8c21f08a2d07338eec8d900540f8630dc76284be802989" +checksum = "fc7f46116c46ff9ab3eb1597a45688b6715c6e628b5c133e288e709a29bcb4ee" dependencies = [ - "darling_core 0.20.10", - "darling_macro 0.20.10", + "darling_core 0.20.11", + "darling_macro 0.20.11", ] [[package]] @@ -361,21 +349,21 @@ dependencies = [ "ident_case", "proc-macro2", "quote", - "syn 1.0.91", + "syn 1.0.109", ] [[package]] name = "darling_core" -version = "0.20.10" +version = "0.20.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95133861a8032aaea082871032f5815eb9e98cef03fa916ab4500513994df9e5" +checksum = "0d00b9596d185e565c2207a0b01f8bd1a135483d02d9b7b0a54b11da8d53412e" dependencies = [ "fnv", "ident_case", "proc-macro2", "quote", "strsim", - "syn 2.0.66", + "syn 2.0.100", ] [[package]] @@ -386,25 +374,25 @@ checksum = "a4aab4dbc9f7611d8b55048a3a16d2d010c2c8334e46304b40ac1cc14bf3b48e" dependencies = [ "darling_core 0.14.4", "quote", - "syn 1.0.91", + "syn 1.0.109", ] [[package]] name = "darling_macro" -version = "0.20.10" +version = "0.20.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" +checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" dependencies = [ - "darling_core 0.20.10", + "darling_core 0.20.11", "quote", - "syn 2.0.66", + "syn 2.0.100", ] [[package]] name = "deranged" -version = "0.3.11" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" +checksum = "28cfac68e08048ae1883171632c2aef3ebc555621ae56fbccce1cbf22dd7f058" dependencies = [ "powerfmt", ] @@ -417,38 +405,38 @@ checksum = "3418329ca0ad70234b9735dc4ceed10af4df60eff9c8e7b06cb5e520d92c3535" dependencies = [ "proc-macro2", "quote", - "syn 1.0.91", + "syn 1.0.109", ] [[package]] name = "derive_builder" -version = "0.20.0" +version = "0.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0350b5cb0331628a5916d6c5c0b72e97393b8b6b03b47a9284f4e7f5a405ffd7" +checksum = "507dfb09ea8b7fa618fcf76e953f4f5e192547945816d5358edffe39f6f94947" dependencies = [ "derive_builder_macro", ] [[package]] name = "derive_builder_core" -version = "0.20.0" +version = "0.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d48cda787f839151732d396ac69e3473923d54312c070ee21e9effcaa8ca0b1d" +checksum = "2d5bcf7b024d6835cfb3d473887cd966994907effbe9227e8c8219824d06c4e8" dependencies = [ - "darling 0.20.10", + "darling 0.20.11", "proc-macro2", "quote", - "syn 2.0.66", + "syn 2.0.100", ] [[package]] name = "derive_builder_macro" -version = "0.20.0" +version = "0.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "206868b8242f27cecce124c19fd88157fbd0dd334df2587f36417bafbc85097b" +checksum = "ab63b0e2bf4d5928aff72e83a7dace85d7bba5fe12dcc3c5a572d78caffd3f3c" dependencies = [ "derive_builder_core", - "syn 2.0.66", + "syn 2.0.100", ] [[package]] @@ -474,29 +462,42 @@ dependencies = [ [[package]] name = "either" -version = "1.6.1" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" + +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[package]] +name = "errno" +version = "0.3.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457" +checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d" +dependencies = [ + "libc", + "windows-sys 0.59.0", +] [[package]] name = "fail" -version = "0.5.0" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec3245a0ca564e7f3c797d20d833a6870f57a728ac967d5225b3ffdef4465011" +checksum = "fe5e43d0f78a42ad591453aedb1d7ae631ce7ee445c7643691055a9ed8d3b01c" dependencies = [ - "lazy_static", "log", + "once_cell", "rand", ] [[package]] name = "fastrand" -version = "1.6.0" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "779d043b6a0b90cc4c0ed7ee380a6504394cee7efd7db050e3774eee387324b2" -dependencies = [ - "instant", -] +checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" [[package]] name = "fixedbitset" @@ -518,9 +519,9 @@ checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" [[package]] name = "futures" -version = "0.3.21" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f73fe65f54d1e12b726f517d3e2135ca3125a437b6d998caf1962961f7172d9e" +checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" dependencies = [ "futures-channel", "futures-core", @@ -533,9 +534,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.21" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3083ce4b914124575708913bca19bfe887522d6e2e6d0952943f5eac4a74010" +checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" dependencies = [ "futures-core", "futures-sink", @@ -543,15 +544,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.21" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c09fd04b7e4073ac7156a9539b57a484a8ea920f79c7c675d05d289ab6110d3" +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" [[package]] name = "futures-executor" -version = "0.3.21" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9420b90cfa29e327d0429f19be13e7ddb68fa1cccb09d65e5706b8c7a749b8a6" +checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" dependencies = [ "futures-core", "futures-task", @@ -560,38 +561,38 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.21" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc4045962a5a5e935ee2fdedaa4e08284547402885ab326734432bed5d12966b" +checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" [[package]] name = "futures-macro" -version = "0.3.21" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33c1e13800337f4d4d7a316bf45a567dbcb6ffe087f16424852d97e97a91f512" +checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 1.0.91", + "syn 2.0.100", ] [[package]] name = "futures-sink" -version = "0.3.21" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21163e139fa306126e6eedaf49ecdb4588f939600f0b1e770f4205ee4b7fa868" +checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" [[package]] name = "futures-task" -version = "0.3.21" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57c66a976bf5909d801bbef33416c41372779507e7a6b3a5e25e4749c58f776a" +checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" [[package]] name = "futures-util" -version = "0.3.21" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8b7abd5d659d9b90c8cba917f6ec750a74e2dc23902ef9cd4cc8c8b22e6036a" +checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" dependencies = [ "futures-channel", "futures-core", @@ -607,44 +608,50 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.6" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" +dependencies = [ + "cfg-if", + "libc", + "wasi 0.11.0+wasi-snapshot-preview1", +] + +[[package]] +name = "getrandom" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9be70c98951c83b8d2f8f60d7065fa6d5146873094452a1008da8c2f1e4205ad" +checksum = "73fea8450eea4bac3940448fb7ae50d91f034f941199fcd9d909a5a07aa455f0" dependencies = [ "cfg-if", "libc", - "wasi 0.10.2+wasi-snapshot-preview1", + "r-efi", + "wasi 0.14.2+wasi-0.2.4", ] [[package]] name = "getset" -version = "0.1.2" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e45727250e75cc04ff2846a66397da8ef2b3db8e40e0cef4df67950a07621eb9" +checksum = "f3586f256131df87204eb733da72e3d3eb4f343c639f4b7be279ac7c48baeafe" dependencies = [ - "proc-macro-error", + "proc-macro-error2", "proc-macro2", "quote", - "syn 1.0.91", + "syn 2.0.100", ] [[package]] name = "gimli" -version = "0.29.0" +version = "0.31.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40ecd4077b5ae9fd2e9e169b102c6c330d0605168eb0e8bf79952b256dbefffd" +checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" [[package]] name = "glob" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b919933a397b79c37e33b77bb2aa3dc8eb6e165ad809e58ff75bc7db2e34574" - -[[package]] -name = "hashbrown" -version = "0.11.2" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e" +checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2" [[package]] name = "hashbrown" @@ -655,6 +662,12 @@ dependencies = [ "ahash", ] +[[package]] +name = "hashbrown" +version = "0.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" + [[package]] name = "heck" version = "0.3.3" @@ -672,12 +685,15 @@ checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" [[package]] name = "hermit-abi" -version = "0.1.19" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" -dependencies = [ - "libc", -] +checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" + +[[package]] +name = "hermit-abi" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbd780fe5cc30f81464441920d82ac8740e2e46b29a6fad543ddd075229ce37e" [[package]] name = "hex" @@ -696,9 +712,9 @@ dependencies = [ [[package]] name = "http" -version = "0.2.8" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75f43d41e26995c17e71ee126451dd3941010b0514a81a9d11f3b341debc2399" +checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" dependencies = [ "bytes", "fnv", @@ -707,9 +723,9 @@ dependencies = [ [[package]] name = "http-body" -version = "0.4.5" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1" +checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" dependencies = [ "bytes", "http", @@ -718,21 +734,21 @@ dependencies = [ [[package]] name = "httparse" -version = "1.8.0" +version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" [[package]] name = "httpdate" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421" +checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" [[package]] name = "hyper" -version = "0.14.23" +version = "0.14.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "034711faac9d2166cb1baf1a2fb0b60b1f277f8492fd72176c17f3515e1abd3c" +checksum = "41dfc780fdec9373c01bae43289ea34c972e40ee3c9f6b3c8801a35f35586ce7" dependencies = [ "bytes", "futures-channel", @@ -744,7 +760,7 @@ dependencies = [ "httpdate", "itoa", "pin-project-lite", - "socket2 0.4.7", + "socket2", "tokio", "tower-service", "tracing", @@ -764,6 +780,30 @@ dependencies = [ "tokio", ] +[[package]] +name = "iana-time-zone" +version = "0.1.63" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0c919e5debc312ad217002b8048a17b7d83f80703865bbfcfebb0458b0b27d8" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "log", + "wasm-bindgen", + "windows-core 0.61.0", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + [[package]] name = "ident_case" version = "1.0.1" @@ -772,44 +812,66 @@ checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" [[package]] name = "indexmap" -version = "1.8.1" +version = "1.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f647032dfaa1f8b6dc29bd3edb7bbef4861b8b8007ebb118d6db284fd59f6ee" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" dependencies = [ "autocfg", - "hashbrown 0.11.2", + "hashbrown 0.12.3", +] + +[[package]] +name = "indexmap" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3954d50fe15b02142bf25d3b8bdadb634ec3948f103d04ffe3031bc8fe9d7058" +dependencies = [ + "equivalent", + "hashbrown 0.15.2", ] [[package]] name = "instant" -version = "0.1.12" +version = "0.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" +checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222" dependencies = [ "cfg-if", ] +[[package]] +name = "is-terminal" +version = "0.4.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e04d7f318608d35d4b61ddd75cbdaee86b023ebe2bd5a66ee0915f0bf93095a9" +dependencies = [ + "hermit-abi 0.5.0", + "libc", + "windows-sys 0.59.0", +] + [[package]] name = "itertools" -version = "0.10.3" +version = "0.10.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9a9d19fa1e79b6215ff29b9d6880b706147f16e9b1dbb1e4e5947b5b02bc5e3" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" dependencies = [ "either", ] [[package]] name = "itoa" -version = "1.0.1" +version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1aab8fc367588b89dcee83ab0fd66b72b50b72fa1904d7095045ace2b0c81c35" +checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" [[package]] name = "js-sys" -version = "0.3.58" +version = "0.3.77" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3fac17f7123a73ca62df411b1bf727ccc805daa070338fda671c86dac1bdc27" +checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" dependencies = [ + "once_cell", "wasm-bindgen", ] @@ -826,7 +888,7 @@ dependencies = [ "kata-types", "lazy_static", "libc", - "nix 0.24.2", + "nix 0.24.3", "num_cpus", "oci-spec", "once_cell", @@ -854,7 +916,7 @@ dependencies = [ "byte-unit", "glob", "lazy_static", - "nix 0.24.2", + "nix 0.24.3", "num_cpus", "oci-spec", "regex", @@ -873,21 +935,43 @@ dependencies = [ [[package]] name = "lazy_static" -version = "1.4.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" [[package]] name = "libc" -version = "0.2.155" +version = "0.2.171" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c19937216e9d3aa9956d9bb8dfc0b0c8beb6058fc4f7a4dc4d850edf86a237d6" + +[[package]] +name = "libredox" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" +dependencies = [ + "bitflags 2.9.0", + "libc", +] + +[[package]] +name = "linux-raw-sys" +version = "0.4.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" + +[[package]] +name = "linux-raw-sys" +version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c" +checksum = "fe7db12097d22ec582439daf8618b8fdd1a7bef6270e9af3b1ebcd30893cf413" [[package]] name = "lock_api" -version = "0.4.7" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "327fa5b6a6940e4699ec49a9beae1ea4845c6bab9314e4f84ac68742139d8c53" +checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" dependencies = [ "autocfg", "scopeguard", @@ -895,12 +979,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.16" +version = "0.4.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6389c490849ff5bc16be905ae24bc913a9c8892e19b2341dbc175e14c341c2b8" -dependencies = [ - "cfg-if", -] +checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" [[package]] name = "logging" @@ -943,22 +1024,22 @@ dependencies = [ [[package]] name = "miniz_oxide" -version = "0.7.3" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87dfd01fe195c66b572b37921ad8803d010623c0aca821bea2302239d155cdae" +checksum = "8e3e04debbb59698c15bacbb6d93584a8c0ca9cc3213cb423d31f760d8843ce5" dependencies = [ - "adler", + "adler2", ] [[package]] name = "mio" -version = "0.8.11" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" +checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" dependencies = [ "libc", "wasi 0.11.0+wasi-snapshot-preview1", - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] @@ -969,11 +1050,11 @@ checksum = "e5ce46fe64a9d73be07dcbe690a38ce1b293be448fd8ce1e6c1b8062c9f72c6a" [[package]] name = "nix" -version = "0.24.2" +version = "0.24.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "195cdbc1741b8134346d515b3a56a1c94b0912758009cfd53f99ea0f57b065fc" +checksum = "fa52e972a9a719cecb6864fb88568781eb706bac2cd1d4f04a648542dbf78069" dependencies = [ - "bitflags", + "bitflags 1.3.2", "cfg-if", "libc", "memoffset 0.6.5", @@ -985,7 +1066,7 @@ version = "0.26.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "598beaf3cc6fdd9a5dfb1630c2800c7acd31df7aaf0f565796fba2b53ca1af1b" dependencies = [ - "bitflags", + "bitflags 1.3.2", "cfg-if", "libc", "memoffset 0.7.1", @@ -1007,49 +1088,30 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" -[[package]] -name = "num-integer" -version = "0.1.44" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2cc698a63b549a70bc047073d2949cce27cd1c7b0a4a862d08a8031bc2801db" -dependencies = [ - "autocfg", - "num-traits", -] - [[package]] name = "num-traits" -version = "0.2.14" +version = "0.2.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a64b1ec5cda2586e284722486d802acf1f7dbdc623e2bfc57e65ca1cd099290" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" dependencies = [ "autocfg", ] [[package]] name = "num_cpus" -version = "1.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19e64526ebdee182341572e50e9ad03965aa510cd94427a4549448f285e957a1" -dependencies = [ - "hermit-abi", - "libc", -] - -[[package]] -name = "num_threads" -version = "0.1.6" +version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2819ce041d2ee131036f4fc9d6ae7ae125a3a40e97ba64d04fe799ad9dabbb44" +checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" dependencies = [ + "hermit-abi 0.3.9", "libc", ] [[package]] name = "object" -version = "0.36.0" +version = "0.36.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "576dfe1fc8f9df304abb159d767a29d0476f7750fbf8aa7ad07816004a207434" +checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" dependencies = [ "memchr", ] @@ -1090,9 +1152,9 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.8.5" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d76e8e1493bcac0d2766c42737f34458f1c8c50c0d23bcb24ea953affb273216" +checksum = "60a2cfe6f0ad2bfc16aefa463b497d5c7a5ecd44a23efa72aa342d90177356dc" dependencies = [ "cfg-if", "instant", @@ -1109,34 +1171,34 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "467d164a6de56270bd7c4d070df81d07beace25012d5103ced4e9ff08d6afdb7" dependencies = [ "fixedbitset", - "indexmap", + "indexmap 1.9.3", ] [[package]] name = "pin-project" -version = "1.0.12" +version = "1.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad29a609b6bcd67fee905812e544992d216af9d755757c05ed2d0e15a74c6ecc" +checksum = "677f1add503faace112b9f1373e43e9e054bfdd22ff1a63c1bc485eaec6a6a8a" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.0.12" +version = "1.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "069bdb1e05adc7a8990dce9cc75370895fbe4e3d58b9b73bf1aee56359344a55" +checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" dependencies = [ "proc-macro2", "quote", - "syn 1.0.91", + "syn 2.0.100", ] [[package]] name = "pin-project-lite" -version = "0.2.14" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" +checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" [[package]] name = "pin-utils" @@ -1152,48 +1214,49 @@ checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" [[package]] name = "ppv-lite86" -version = "0.2.16" +version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb9f9e6e233e5c4a35559a617bf40a4ec447db2e84c20b55a6f83167b7e57872" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" +dependencies = [ + "zerocopy", +] [[package]] name = "proc-macro-crate" -version = "0.1.5" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d6ea3c4595b96363c13943497db34af4460fb474a95c43f4446ad341b8c9785" +checksum = "edce586971a4dfaa28950c6f18ed55e0406c1ab88bbce2c6f6293a7aaba73d35" dependencies = [ - "toml", + "toml_edit", ] [[package]] -name = "proc-macro-error" -version = "1.0.4" +name = "proc-macro-error-attr2" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" +checksum = "96de42df36bb9bba5542fe9f1a054b8cc87e172759a1868aa05c1f3acc89dfc5" dependencies = [ - "proc-macro-error-attr", "proc-macro2", "quote", - "syn 1.0.91", - "version_check", ] [[package]] -name = "proc-macro-error-attr" -version = "1.0.4" +name = "proc-macro-error2" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" +checksum = "11ec05c52be0a07b08061f7dd003e7d7092e0472bc731b4af7bb1ef876109802" dependencies = [ + "proc-macro-error-attr2", "proc-macro2", "quote", - "version_check", + "syn 2.0.100", ] [[package]] name = "proc-macro2" -version = "1.0.85" +version = "1.0.94" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22244ce15aa966053a896d1accb3a6e68469b97c7f33f284b99f0d576879fc23" +checksum = "a31971752e70b8b2686d7e46ec17fb38dad4051d94024c88df49b667caea9c84" dependencies = [ "unicode-ident", ] @@ -1236,7 +1299,7 @@ dependencies = [ "itertools", "proc-macro2", "quote", - "syn 1.0.91", + "syn 1.0.109", ] [[package]] @@ -1251,15 +1314,15 @@ dependencies = [ [[package]] name = "protobuf" -version = "2.27.1" +version = "2.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf7e6d18738ecd0902d30d1ad232c9125985a3422929b16c65517b38adc14f96" +checksum = "106dd99e98437432fed6519dedecfade6a06a73bb7b2a1e019fdd2bee5778d94" [[package]] name = "protobuf" -version = "3.2.0" +version = "3.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b55bad9126f378a853655831eb7363b7b01b81d19f8cb1218861086ca4a1a61e" +checksum = "a3a7c64d9bf75b1b8d981124c14c179074e8caa7dfe7b6a12e6222ddcd0c8f72" dependencies = [ "once_cell", "protobuf-support", @@ -1268,22 +1331,22 @@ dependencies = [ [[package]] name = "protobuf-codegen" -version = "2.27.1" +version = "2.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aec1632b7c8f2e620343439a7dfd1f3c47b18906c4be58982079911482b5d707" +checksum = "033460afb75cf755fcfc16dfaed20b86468082a2ea24e05ac35ab4a099a017d6" dependencies = [ - "protobuf 2.27.1", + "protobuf 2.28.0", ] [[package]] name = "protobuf-codegen" -version = "3.2.0" +version = "3.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0dd418ac3c91caa4032d37cb80ff0d44e2ebe637b2fb243b6234bf89cdac4901" +checksum = "e26b833f144769a30e04b1db0146b2aaa53fd2fd83acf10a6b5f996606c18144" dependencies = [ "anyhow", "once_cell", - "protobuf 3.2.0", + "protobuf 3.7.1", "protobuf-parse", "regex", "tempfile", @@ -1292,14 +1355,14 @@ dependencies = [ [[package]] name = "protobuf-parse" -version = "3.2.0" +version = "3.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d39b14605eaa1f6a340aec7f320b34064feb26c93aec35d6a9a2272a8ddfa49" +checksum = "322330e133eab455718444b4e033ebfac7c6528972c784fcde28d2cc783c6257" dependencies = [ "anyhow", - "indexmap", + "indexmap 2.8.0", "log", - "protobuf 3.2.0", + "protobuf 3.7.1", "protobuf-support", "tempfile", "thiserror", @@ -1308,9 +1371,9 @@ dependencies = [ [[package]] name = "protobuf-support" -version = "3.2.0" +version = "3.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5d4d7b8601c814cfb36bcebb79f0e61e45e1e93640cf778837833bbed05c372" +checksum = "b088fd20b938a875ea00843b6faf48579462630015c3788d397ad6a786663252" dependencies = [ "thiserror", ] @@ -1321,7 +1384,7 @@ version = "0.1.0" dependencies = [ "async-trait", "oci-spec", - "protobuf 3.2.0", + "protobuf 3.7.1", "serde", "serde_json", "ttrpc", @@ -1345,18 +1408,24 @@ checksum = "16b845dbfca988fa33db069c0e230574d15a3088f147a87b64c7589eb662c9ac" dependencies = [ "proc-macro2", "quote", - "syn 1.0.91", + "syn 1.0.109", ] [[package]] name = "quote" -version = "1.0.36" +version = "1.0.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" +checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" dependencies = [ "proc-macro2", ] +[[package]] +name = "r-efi" +version = "5.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74765f6d916ee2faa39bc8e68e4f3ed8949b48cccdac59983d287a7cb71ce9c5" + [[package]] name = "radium" version = "0.7.0" @@ -1386,18 +1455,18 @@ dependencies = [ [[package]] name = "rand_core" -version = "0.6.3" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d34f1408f55294453790c48b2f1ebbb1c5b4b7563eb1f418bcfcfdbb06ebb4e7" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ - "getrandom", + "getrandom 0.2.15", ] [[package]] name = "rayon" -version = "1.8.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c27db03db7734835b3f53954b534c91069375ce6ccaa2e065441e07d9b6cdb1" +checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" dependencies = [ "either", "rayon-core", @@ -1405,9 +1474,9 @@ dependencies = [ [[package]] name = "rayon-core" -version = "1.12.0" +version = "1.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ce3fb6ad83f861aac485e76e1985cd109d9a3713802152be56c3b1f0e0658ed" +checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" dependencies = [ "crossbeam-deque", "crossbeam-utils", @@ -1419,25 +1488,25 @@ version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" dependencies = [ - "bitflags", + "bitflags 1.3.2", ] [[package]] name = "redox_users" -version = "0.4.3" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b" +checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" dependencies = [ - "getrandom", - "redox_syscall", + "getrandom 0.2.15", + "libredox", "thiserror", ] [[package]] name = "regex" -version = "1.10.5" +version = "1.10.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b91213439dad192326a0d7c6ee3955910425f441d7038e0d6933b0aec5c4517f" +checksum = "4219d74c6b67a3654a9fbebc4b419e22126d13d2f3c4a07ee0cb61ff79a79619" dependencies = [ "aho-corasick", "memchr", @@ -1447,9 +1516,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.7" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38caf58cc5ef2fed281f89292ef23f6365465ed9a41b7a7754eb4e26496c92df" +checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" dependencies = [ "aho-corasick", "memchr", @@ -1458,36 +1527,28 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b" - -[[package]] -name = "remove_dir_all" -version = "0.5.3" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7" -dependencies = [ - "winapi", -] +checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" [[package]] name = "rend" -version = "0.4.1" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2571463863a6bd50c32f94402933f03457a3fbaf697a707c5be741e459f08fd" +checksum = "71fe3824f5629716b1589be05dacd749f6aa084c87e00e016714a8cdfccc997c" dependencies = [ "bytecheck", ] [[package]] name = "rkyv" -version = "0.7.42" +version = "0.7.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0200c8230b013893c0b2d6213d6ec64ed2b9be2e0e016682b7224ff82cff5c58" +checksum = "9008cd6385b9e161d8229e1f6549dd23c3d022f132a2ea37ac3a10ac4935779b" dependencies = [ "bitvec", "bytecheck", + "bytes", "hashbrown 0.12.3", "ptr_meta", "rend", @@ -1499,13 +1560,13 @@ dependencies = [ [[package]] name = "rkyv_derive" -version = "0.7.43" +version = "0.7.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5c462a1328c8e67e4d6dbad1eb0355dd43e8ab432c6e227a43657f16ade5033" +checksum = "503d1d27590a2b0a3a4ca4c94755aa2875657196ecbf401a42eff41d7de532c0" dependencies = [ "proc-macro2", "quote", - "syn 1.0.91", + "syn 1.0.109", ] [[package]] @@ -1520,9 +1581,9 @@ dependencies = [ [[package]] name = "rust_decimal" -version = "1.32.0" +version = "1.37.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4c4216490d5a413bc6d10fa4742bd7d4955941d062c0ef873141d6b0e7b30fd" +checksum = "faa7de2ba56ac291bd90c6b9bece784a52ae1411f9506544b3eae36dd2356d50" dependencies = [ "arrayvec", "borsh", @@ -1540,17 +1601,43 @@ version = "0.1.24" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" +[[package]] +name = "rustix" +version = "0.38.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" +dependencies = [ + "bitflags 2.9.0", + "errno", + "libc", + "linux-raw-sys 0.4.15", + "windows-sys 0.59.0", +] + +[[package]] +name = "rustix" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e56a18552996ac8d29ecc3b190b4fdbb2d91ca4ec396de7bbffaf43f3d637e96" +dependencies = [ + "bitflags 2.9.0", + "errno", + "libc", + "linux-raw-sys 0.9.3", + "windows-sys 0.59.0", +] + [[package]] name = "rustversion" -version = "1.0.12" +version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f3208ce4d8448b3f3e7d168a73f5e0c43a61e32930de3bceeccedb388b6bf06" +checksum = "eded382c5f5f786b989652c49544c4877d9f015cc22e145a5ea8ea66c2921cd2" [[package]] name = "ryu" -version = "1.0.9" +version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73b4b750c782965c211b42f022f59af1fbceabdd026623714f104152f1ec149f" +checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" [[package]] name = "safe-path" @@ -1562,9 +1649,9 @@ dependencies = [ [[package]] name = "scopeguard" -version = "1.1.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] name = "seahash" @@ -1574,9 +1661,9 @@ checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b" [[package]] name = "serde" -version = "1.0.210" +version = "1.0.219" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8e3592472072e6e22e0a54d5904d9febf8508f65fb8552499a1abc7d1078c3a" +checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" dependencies = [ "serde_derive", ] @@ -1589,7 +1676,7 @@ checksum = "6eb8ec7724e4e524b2492b510e66957fe1a2c76c26a6975ec80823f2439da685" dependencies = [ "darling_core 0.14.4", "serde-rename-rule", - "syn 1.0.91", + "syn 1.0.109", ] [[package]] @@ -1602,7 +1689,7 @@ dependencies = [ "proc-macro2", "quote", "serde-attributes", - "syn 1.0.91", + "syn 1.0.109", ] [[package]] @@ -1613,22 +1700,23 @@ checksum = "794e44574226fc701e3be5c651feb7939038fc67fb73f6f4dd5c4ba90fd3be70" [[package]] name = "serde_derive" -version = "1.0.210" +version = "1.0.219" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "243902eda00fad750862fc144cea25caca5e20d615af0a81bee94ca738f1df1f" +checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" dependencies = [ "proc-macro2", "quote", - "syn 2.0.66", + "syn 2.0.100", ] [[package]] name = "serde_json" -version = "1.0.75" +version = "1.0.140" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c059c05b48c5c0067d4b4b2b4f0732dd65feb52daf7e0ea09cd87e7dadc1af79" +checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" dependencies = [ "itoa", + "memchr", "ryu", "serde", ] @@ -1652,7 +1740,7 @@ checksum = "b2acd6defeddb41eb60bb468f8825d0cfd0c2a76bc03bfd235b6a1dc4f6a1ad5" dependencies = [ "proc-macro2", "quote", - "syn 1.0.91", + "syn 1.0.109", ] [[package]] @@ -1664,23 +1752,32 @@ dependencies = [ "hyperlocal", "kata-sys-util", "kata-types", - "nix 0.24.2", + "nix 0.24.3", "tempfile", "test-utils", "tokio", ] +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + [[package]] name = "simdutf8" -version = "0.1.4" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f27f6278552951f1f2b8cf9da965d10969b2efdea95a6ec47987ab46edfe263a" +checksum = "e3a9fe34e3e7a50316060351f37187a3f546bce95496156754b601a5fa71b76e" [[package]] name = "slab" -version = "0.4.6" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb703cfe953bccee95685111adeedb76fabe4e97549a58d16f03ea7b9367bb32" +checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" +dependencies = [ + "autocfg", +] [[package]] name = "slog" @@ -1690,9 +1787,9 @@ checksum = "8347046d4ebd943127157b94d63abb990fcf729dc4e9978927fdf4ac3c998d06" [[package]] name = "slog-async" -version = "2.7.0" +version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "766c59b252e62a34651412870ff55d8c4e6d04df19b43eecb2703e417b097ffe" +checksum = "72c8038f898a2c79507940990f05386455b3a317d8f18d4caea7cbc3d5096b84" dependencies = [ "crossbeam-channel", "slog", @@ -1702,14 +1799,14 @@ dependencies = [ [[package]] name = "slog-json" -version = "2.5.0" +version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f7f7a952ce80fca9da17bf0a53895d11f8aa1ba063668ca53fc72e7869329e9" +checksum = "3e1e53f61af1e3c8b852eef0a9dee29008f55d6dd63794f3f12cef786cf0f219" dependencies = [ - "chrono", "serde", "serde_json", "slog", + "time", ] [[package]] @@ -1725,38 +1822,28 @@ dependencies = [ [[package]] name = "slog-term" -version = "2.9.0" +version = "2.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87d29185c55b7b258b4f120eab00f48557d4d9bc814f41713f449d35b0f8977c" +checksum = "b6e022d0b998abfe5c3782c1f03551a596269450ccd677ea51c56f8b214610e8" dependencies = [ - "atty", + "is-terminal", "slog", "term", "thread_local", - "time 0.3.37", + "time", ] [[package]] name = "smallvec" -version = "1.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2dd574626839106c320a323308629dcb1acfc96e32a8cba364ddc61ac23ee83" - -[[package]] -name = "socket2" -version = "0.4.7" +version = "1.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02e2d2db9033d13a1567121ddd7a095ee144db4e1ca1b1bda3419bc0da294ebd" -dependencies = [ - "libc", - "winapi", -] +checksum = "7fcf8323ef1faaee30a44a340193b1ac6814fd9b7b4e88e9d4519a3e4abe1cfd" [[package]] name = "socket2" -version = "0.5.7" +version = "0.5.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c" +checksum = "4f5fd57c80058a56cf5c777ab8a126398ece8e442983605d280a44ce79d0edef" dependencies = [ "libc", "windows-sys 0.52.0", @@ -1784,7 +1871,7 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn 2.0.66", + "syn 2.0.100", ] [[package]] @@ -1799,20 +1886,20 @@ dependencies = [ [[package]] name = "syn" -version = "1.0.91" +version = "1.0.109" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b683b2b825c8eef438b77c36a06dc262294da3d5a5813fac20da149241dcd44d" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" dependencies = [ "proc-macro2", "quote", - "unicode-xid", + "unicode-ident", ] [[package]] name = "syn" -version = "2.0.66" +version = "2.0.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c42f3f41a2de00b01c0aaad383c5a45241efc8b2d1eda5661812fda5f3cdcff5" +checksum = "b09a44accad81e1ba1cd74a32461ba89dee89095ba17b32f5d03683b1b1fc2a0" dependencies = [ "proc-macro2", "quote", @@ -1821,9 +1908,9 @@ dependencies = [ [[package]] name = "sysinfo" -version = "0.30.12" +version = "0.30.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "732ffa00f53e6b2af46208fba5718d9662a421049204e156328b66791ffa15ae" +checksum = "0a5b4ddaee55fb2bea2bf0e5000747e5f5c0de765e5a5ff87f4cd106439f4bb3" dependencies = [ "cfg-if", "core-foundation-sys", @@ -1848,16 +1935,15 @@ checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" [[package]] name = "tempfile" -version = "3.3.0" +version = "3.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cdb1ef4eaeeaddc8fbd371e5017057064af0911902ef36b39801f67cc6d79e4" +checksum = "7437ac7763b9b123ccf33c338a5cc1bac6f69b45a136c19bdd8a65e3916435bf" dependencies = [ - "cfg-if", "fastrand", - "libc", - "redox_syscall", - "remove_dir_all", - "winapi", + "getrandom 0.3.2", + "once_cell", + "rustix 1.0.3", + "windows-sys 0.59.0", ] [[package]] @@ -1875,59 +1961,48 @@ dependencies = [ name = "test-utils" version = "0.1.0" dependencies = [ - "nix 0.24.2", + "nix 0.24.3", ] [[package]] name = "thiserror" -version = "1.0.30" +version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "854babe52e4df1653706b98fcfc05843010039b406875930a70e4d9644e5c417" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.30" +version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa32fd3f627f367fe16f893e2597ae3c05020f8bba2666a4e6ea73d377e5714b" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 1.0.91", + "syn 2.0.100", ] [[package]] name = "thread_local" -version = "1.1.4" +version = "1.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5516c27b78311c50bf42c071425c560ac799b11c30b31f87e3081965fe5e0180" +checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" dependencies = [ + "cfg-if", "once_cell", ] [[package]] name = "time" -version = "0.1.43" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca8a50ef2360fbd1eeb0ecd46795a87a19024eb4b53c5dc916ca1fd95fe62438" -dependencies = [ - "libc", - "winapi", -] - -[[package]] -name = "time" -version = "0.3.37" +version = "0.3.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35e7868883861bd0e56d9ac6efcaaca0d6d5d82a2a7ec8209ff492c07cf37b21" +checksum = "8a7619e19bc266e0f9c5e6686659d394bc57973859340060a69221e57dbc0c40" dependencies = [ "deranged", "itoa", - "libc", "num-conv", - "num_threads", "powerfmt", "serde", "time-core", @@ -1936,15 +2011,15 @@ dependencies = [ [[package]] name = "time-core" -version = "0.1.2" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" +checksum = "c9e9a38711f559d9e3ce1cdb06dd7c5b8ea546bc90052da6d06bb76da74bb07c" [[package]] name = "time-macros" -version = "0.2.19" +version = "0.2.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2834e6017e3e5e4b9834939793b282bc03b37a3336245fa820e35e233e2a85de" +checksum = "3526739392ec93fd8b359c8e98514cb3e8e021beb4e5f597b00a0221f8ed8a49" dependencies = [ "num-conv", "time-core", @@ -1952,9 +2027,9 @@ dependencies = [ [[package]] name = "tinyvec" -version = "1.6.0" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" +checksum = "09b3661f17e86524eccd4371ab0429194e0d7c008abb45f7a7495b1719463c71" dependencies = [ "tinyvec_macros", ] @@ -1967,30 +2042,29 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.38.0" +version = "1.44.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba4f4a02a7a80d6f274636f0aa95c7e383b912d41fe721a31f29e29698585a4a" +checksum = "f382da615b842244d4b8738c82ed1275e6c5dd90c459a30941cd07080b06c91a" dependencies = [ "backtrace", "bytes", "libc", "mio", - "num_cpus", "pin-project-lite", - "socket2 0.5.7", + "socket2", "tokio-macros", - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] name = "tokio-macros" -version = "2.3.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f5ae998a069d4b5aba8ee9dad856af7d520c3699e6159b185c2acd48155d39a" +checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.66", + "syn 2.0.100", ] [[package]] @@ -2008,44 +2082,60 @@ dependencies = [ [[package]] name = "toml" -version = "0.5.9" +version = "0.5.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d82e1a7758622a465f8cee077614c73484dac5b836c02ff6a40d5d1010324d7" +checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" dependencies = [ "serde", ] +[[package]] +name = "toml_datetime" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" + +[[package]] +name = "toml_edit" +version = "0.22.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17b4795ff5edd201c7cd6dca065ae59972ce77d1b80fa0a84d94950ece7d1474" +dependencies = [ + "indexmap 2.8.0", + "toml_datetime", + "winnow", +] + [[package]] name = "tower-service" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" [[package]] name = "tracing" -version = "0.1.34" +version = "0.1.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d0ecdcb44a79f0fe9844f0c4f33a342cbcbb5117de8001e6ba0dc2351327d09" +checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" dependencies = [ - "cfg-if", "pin-project-lite", "tracing-core", ] [[package]] name = "tracing-core" -version = "0.1.26" +version = "0.1.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f54c8ca710e81886d498c2fd3331b56c93aa248d49de2222ad2742247c60072f" +checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" dependencies = [ - "lazy_static", + "once_cell", ] [[package]] name = "try-lock" -version = "0.2.3" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" [[package]] name = "ttrpc" @@ -2061,8 +2151,8 @@ dependencies = [ "libc", "log", "nix 0.26.4", - "protobuf 3.2.0", - "protobuf-codegen 3.2.0", + "protobuf 3.7.1", + "protobuf-codegen 3.7.1", "thiserror", "tokio", "tokio-vsock", @@ -2075,44 +2165,38 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94d7f7631d7a9ebed715a47cd4cb6072cbc7ae1d4ec01598971bbec0024340c2" dependencies = [ - "protobuf 2.27.1", - "protobuf-codegen 3.2.0", + "protobuf 2.28.0", + "protobuf-codegen 3.7.1", "protobuf-support", "ttrpc-compiler", ] [[package]] name = "ttrpc-compiler" -version = "0.6.1" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec3cb5dbf1f0865a34fe3f722290fe776cacb16f50428610b779467b76ddf647" +checksum = "0672eb06e5663ad190c7b93b2973f5d730259859b62e4e3381301a12a7441107" dependencies = [ "derive-new", "prost", "prost-build", "prost-types", - "protobuf 2.27.1", - "protobuf-codegen 2.27.1", + "protobuf 2.28.0", + "protobuf-codegen 2.28.0", "tempfile", ] [[package]] name = "unicode-ident" -version = "1.0.12" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" +checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" [[package]] name = "unicode-segmentation" -version = "1.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e8820f5d777f6224dc4be3632222971ac30164d4a258d595640799554ebfd99" - -[[package]] -name = "unicode-xid" -version = "0.2.2" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3" +checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" [[package]] name = "utf8-width" @@ -2122,15 +2206,15 @@ checksum = "86bd8d4e895da8537e5315b8254664e6b769c4ff3db18321b297a1e7004392e3" [[package]] name = "uuid" -version = "1.6.1" +version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e395fcf16a7a3d8127ec99782007af141946b4795001f876d54fb0d55978560" +checksum = "458f7a779bf54acc9f347480ac654f68407d3aab21269a6e3c9f922acd9e2da9" [[package]] name = "version_check" -version = "0.9.4" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" [[package]] name = "vsock" @@ -2139,61 +2223,64 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4c8e1df0bf1e1b28095c24564d1b90acae64ca69b097ed73896e342fa6649c57" dependencies = [ "libc", - "nix 0.24.2", + "nix 0.24.3", ] [[package]] name = "want" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ce8a968cb1cd110d136ff8b819a556d6fb6d919363c61534f6860c7eb172ba0" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" dependencies = [ - "log", "try-lock", ] [[package]] name = "wasi" -version = "0.10.2+wasi-snapshot-preview1" +version = "0.11.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasi" -version = "0.11.0+wasi-snapshot-preview1" +version = "0.14.2+wasi-0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" +checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" +dependencies = [ + "wit-bindgen-rt", +] [[package]] name = "wasm-bindgen" -version = "0.2.81" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c53b543413a17a202f4be280a7e5c62a1c69345f5de525ee64f8cfdbc954994" +checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" dependencies = [ "cfg-if", + "once_cell", + "rustversion", "wasm-bindgen-macro", ] [[package]] name = "wasm-bindgen-backend" -version = "0.2.81" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5491a68ab4500fa6b4d726bd67408630c3dbe9c4fe7bda16d5c82a1fd8c7340a" +checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" dependencies = [ "bumpalo", - "lazy_static", "log", "proc-macro2", "quote", - "syn 1.0.91", + "syn 2.0.100", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.81" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c441e177922bc58f1e12c022624b6216378e5febc2f0533e41ba443d505b80aa" +checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -2201,32 +2288,36 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.81" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d94ac45fcf608c1f45ef53e748d35660f168490c10b23704c7779ab8f5c3048" +checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" dependencies = [ "proc-macro2", "quote", - "syn 1.0.91", + "syn 2.0.100", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.81" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a89911bd99e5f3659ec4acf9c4d93b0a90fe4a2a11f15328472058edc5261be" +checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" +dependencies = [ + "unicode-ident", +] [[package]] name = "which" -version = "4.2.5" +version = "4.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c4fb54e6113b6a8772ee41c3404fb0301ac79604489467e0a9ce1f3e97c24ae" +checksum = "87ba24419a2078cd2b0f2ede2691b6c66d8e47836da3b6db8265ebad47afbfc7" dependencies = [ "either", - "lazy_static", - "libc", + "home", + "once_cell", + "rustix 0.38.44", ] [[package]] @@ -2257,8 +2348,8 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e48a53791691ab099e5e2ad123536d0fff50652600abaf43bbf952894110d0be" dependencies = [ - "windows-core", - "windows-targets 0.52.5", + "windows-core 0.52.0", + "windows-targets 0.52.6", ] [[package]] @@ -2267,7 +2358,66 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" dependencies = [ - "windows-targets 0.52.5", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-core" +version = "0.61.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4763c1de310c86d75a878046489e2e5ba02c649d185f21c67d4cf8a56d098980" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-link", + "windows-result", + "windows-strings", +] + +[[package]] +name = "windows-implement" +version = "0.60.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", +] + +[[package]] +name = "windows-interface" +version = "0.59.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", +] + +[[package]] +name = "windows-link" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76840935b766e1b0a05c0066835fb9ec80071d4c09a16f6bd5f7e655e3c14c38" + +[[package]] +name = "windows-result" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c64fd11a4fd95df68efcfee5f44a294fe71b8bc6a91993e2791938abcc712252" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-strings" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a2ba9642430ee452d5a7aa78d72907ebe8cfda358e8cb7918a2050581322f97" +dependencies = [ + "windows-link", ] [[package]] @@ -2285,7 +2435,16 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ - "windows-targets 0.52.5", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets 0.52.6", ] [[package]] @@ -2305,18 +2464,18 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f0713a46559409d202e70e28227288446bf7841d3211583a4b53e3f6d96e7eb" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" dependencies = [ - "windows_aarch64_gnullvm 0.52.5", - "windows_aarch64_msvc 0.52.5", - "windows_i686_gnu 0.52.5", + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", "windows_i686_gnullvm", - "windows_i686_msvc 0.52.5", - "windows_x86_64_gnu 0.52.5", - "windows_x86_64_gnullvm 0.52.5", - "windows_x86_64_msvc 0.52.5", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", ] [[package]] @@ -2327,9 +2486,9 @@ checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" [[package]] name = "windows_aarch64_gnullvm" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7088eed71e8b8dda258ecc8bac5fb1153c5cffaf2578fc8ff5d61e23578d3263" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" [[package]] name = "windows_aarch64_msvc" @@ -2339,9 +2498,9 @@ checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" [[package]] name = "windows_aarch64_msvc" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9985fd1504e250c615ca5f281c3f7a6da76213ebd5ccc9561496568a2752afb6" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" [[package]] name = "windows_i686_gnu" @@ -2351,15 +2510,15 @@ checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" [[package]] name = "windows_i686_gnu" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88ba073cf16d5372720ec942a8ccbf61626074c6d4dd2e745299726ce8b89670" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" [[package]] name = "windows_i686_gnullvm" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87f4261229030a858f36b459e748ae97545d6f1ec60e5e0d6a3d32e0dc232ee9" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" [[package]] name = "windows_i686_msvc" @@ -2369,9 +2528,9 @@ checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" [[package]] name = "windows_i686_msvc" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db3c2bf3d13d5b658be73463284eaf12830ac9a26a90c717b7f771dfe97487bf" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" [[package]] name = "windows_x86_64_gnu" @@ -2381,9 +2540,9 @@ checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" [[package]] name = "windows_x86_64_gnu" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e4246f76bdeff09eb48875a0fd3e2af6aada79d409d33011886d3e1581517d9" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" [[package]] name = "windows_x86_64_gnullvm" @@ -2393,9 +2552,9 @@ checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" [[package]] name = "windows_x86_64_gnullvm" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "852298e482cd67c356ddd9570386e2862b5673c85bd5f88df9ab6802b334c596" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" [[package]] name = "windows_x86_64_msvc" @@ -2405,9 +2564,27 @@ checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" [[package]] name = "windows_x86_64_msvc" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bec47e5bfd1bff0eeaf6d8b485cc1074891a197ab4225d504cb7a1ab88b02bf0" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "winnow" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e97b544156e9bebe1a0ffbc03484fc1ffe3100cbce3ffb17eac35f7cdd7ab36" +dependencies = [ + "memchr", +] + +[[package]] +name = "wit-bindgen-rt" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" +dependencies = [ + "bitflags 2.9.0", +] [[package]] name = "wyz" @@ -2417,3 +2594,23 @@ checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" dependencies = [ "tap", ] + +[[package]] +name = "zerocopy" +version = "0.8.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2586fea28e186957ef732a5f8b3be2da217d65c5969d4b1e17f973ebbe876879" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a996a8f63c5c4448cd959ac1bab0aaa3306ccfd060472f85943ee0750f0169be" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", +] diff --git a/src/libs/kata-sys-util/src/mount.rs b/src/libs/kata-sys-util/src/mount.rs index 69728360544d..d6eeb874847a 100644 --- a/src/libs/kata-sys-util/src/mount.rs +++ b/src/libs/kata-sys-util/src/mount.rs @@ -406,6 +406,9 @@ pub fn parse_mount_options>(options: &[T]) -> Result<(MsFlags, Str } else if let Some(v) = parse_mount_flags(flags, opt.as_ref()) { flags = v; } else { + if opt.as_ref().starts_with("io.katacontainers.") { + continue; + } data.push(opt.as_ref().to_string()); } } @@ -483,7 +486,25 @@ fn parse_mount_flags(mut flags: MsFlags, flag_str: &str) -> Option { "silent" => flags |= MsFlags::MS_SILENT, "strictatime" => flags |= MsFlags::MS_STRICTATIME, "sync" => flags |= MsFlags::MS_SYNCHRONOUS, + "io.katacontainers.fs-opt.block_device=file" => return None, + "io.katacontainers.fs-opt.is-layer" => return None, + "io.katacontainers.fs-opt.layer-src-prefix=/var/lib/containerd/io.containerd.snapshotter.v1.tardev/layers" => return None, + "io.katacontainers.fs-opt.overlay-rw" => return None, flag_str => { + let ignored_prefixes = [ + "io.katacontainers.fs-opt.root-hash=", + "io.katacontainers.fs-opt.layer=", + "lowerdir=", + "upperdir=", + "workdir=", + ]; + + for p in &ignored_prefixes { + if flag_str.starts_with(p) { + return None; + } + } + warn!(sl!(), "BUG: unknown mount flag: {:?}", flag_str); return None; } diff --git a/src/libs/kata-types/src/device.rs b/src/libs/kata-types/src/device.rs index d9f28d55067e..b392e450b2cf 100644 --- a/src/libs/kata-types/src/device.rs +++ b/src/libs/kata-types/src/device.rs @@ -39,6 +39,8 @@ pub const DRIVER_OVERLAYFS_TYPE: &str = "overlayfs"; pub const DRIVER_VIRTIOFS_TYPE: &str = "virtio-fs"; /// DRIVER_VIRTIOFS_TYPE is the driver for Bind watch volume. pub const DRIVER_WATCHABLE_BIND_TYPE: &str = "watchable-bind"; +/// DRIVER_VIRTIOFS_TYPE is the driver for SMB volume. +pub const DRIVER_SMB_TYPE: &str = "smb"; /// Manager to manage registered device handlers. pub type DeviceHandlerManager = HandlerManager; diff --git a/src/libs/protocols/Cargo.toml b/src/libs/protocols/Cargo.toml index a3c18d7c9ed9..f3478cc0ab77 100644 --- a/src/libs/protocols/Cargo.toml +++ b/src/libs/protocols/Cargo.toml @@ -13,11 +13,11 @@ async = ["ttrpc/async", "async-trait"] [dependencies] ttrpc = "0.8.4" async-trait = { version = "0.1.42", optional = true } -protobuf = { version = "3.2.0" } +protobuf = { version = "=3.7.1" } serde = { version = "1.0.130", features = ["derive"] } serde_json = "1.0.68" oci-spec = { version = "0.6.8", features = ["runtime"] } [build-dependencies] ttrpc-codegen = "0.4.2" -protobuf = { version = "3.2.0" } +protobuf = { version = "=3.7.1" } diff --git a/src/libs/protocols/build.rs b/src/libs/protocols/build.rs index ab630a351d16..ebd034b26a90 100644 --- a/src/libs/protocols/build.rs +++ b/src/libs/protocols/build.rs @@ -240,6 +240,33 @@ fn real_main() -> Result<(), std::io::Error> { "self: ::std::boxed::Box", )?; + let box_pointers_files = vec![ + "src/agent_ttrpc_async.rs", + "src/confidential_data_hub.rs", + "src/confidential_data_hub_ttrpc.rs", + "src/confidential_data_hub_ttrpc_async.rs", + "src/types.rs", + "src/agent.rs", + "src/agent_ttrpc.rs", + "src/csi.rs", + "src/empty.rs", + "src/gogo.rs", + "src/health.rs", + "src/health_ttrpc.rs", + "src/health_ttrpc_async.rs", + "src/oci.rs", + "src/remote_ttrpc.rs", + "src/remote_ttrpc_async.rs", + ]; + + for f in box_pointers_files { + replace_text_in_file( + f, + "#![allow(box_pointers)]", + "", + )?; + } + Ok(()) } diff --git a/src/overlay/Cargo.lock b/src/overlay/Cargo.lock new file mode 100644 index 000000000000..f091ad441b36 --- /dev/null +++ b/src/overlay/Cargo.lock @@ -0,0 +1,403 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "anstream" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ca84f3628370c59db74ee214b3263d58f9aadd9b4fe7e711fd87dc452b7f163" +dependencies = [ + "anstyle", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "is-terminal", + "utf8parse", +] + +[[package]] +name = "anstyle" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41ed9a86bf92ae6580e0a31281f65a1b1d867c0cc68d5346e2ae128dddfa6a7d" + +[[package]] +name = "anstyle-parse" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e765fd216e48e067936442276d1d57399e37bce53c264d6fefbe298080cb57ee" +dependencies = [ + "utf8parse", +] + +[[package]] +name = "anstyle-query" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ca11d4be1bab0c8bc8734a9aa7bf4ee8316d462a08c6ac5052f888fef5b494b" +dependencies = [ + "windows-sys", +] + +[[package]] +name = "anstyle-wincon" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "180abfa45703aebe0093f79badacc01b8fd4ea2e35118747e5811127f926e188" +dependencies = [ + "anstyle", + "windows-sys", +] + +[[package]] +name = "autocfg" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" + +[[package]] +name = "base64" +version = "0.21.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "604178f6c5c21f02dc555784810edfb88d34ac2c73b2eae109655649ee73ce3d" + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "cc" +version = "1.0.79" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50d30906286121d95be3d479533b458f87493b30a4b5f79a607db8f5d11aa91f" + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "clap" +version = "4.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "401a4694d2bf92537b6867d94de48c4842089645fdcdf6c71865b175d836e9c2" +dependencies = [ + "clap_builder", + "clap_derive", + "once_cell", +] + +[[package]] +name = "clap_builder" +version = "4.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72394f3339a76daf211e57d4bcb374410f3965dcc606dd0e03738c7888766980" +dependencies = [ + "anstream", + "anstyle", + "bitflags", + "clap_lex", + "strsim", +] + +[[package]] +name = "clap_derive" +version = "4.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8cd2b2a819ad6eec39e8f1d6b53001af1e5469f8c177579cdaeb313115b825f" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "clap_lex" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2da6da31387c7e4ef160ffab6d5e7f00c42626fe39aea70a7b0f1773f7dd6c1b" + +[[package]] +name = "colorchoice" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" + +[[package]] +name = "errno" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bcfec3a70f97c962c307b2d2c56e358cf1d00b558d74262b5f929ee8cc7e73a" +dependencies = [ + "errno-dragonfly", + "libc", + "windows-sys", +] + +[[package]] +name = "errno-dragonfly" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf" +dependencies = [ + "cc", + "libc", +] + +[[package]] +name = "fastrand" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be" +dependencies = [ + "instant", +] + +[[package]] +name = "heck" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" + +[[package]] +name = "hermit-abi" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fed44880c466736ef9a5c5b5facefb5ed0785676d0c02d612db14e54f0d84286" + +[[package]] +name = "instant" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "io-lifetimes" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2" +dependencies = [ + "hermit-abi", + "libc", + "windows-sys", +] + +[[package]] +name = "is-terminal" +version = "0.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adcf93614601c8129ddf72e2d5633df827ba6551541c6d8c59520a371475be1f" +dependencies = [ + "hermit-abi", + "io-lifetimes", + "rustix", + "windows-sys", +] + +[[package]] +name = "kata-overlay" +version = "0.1.0" +dependencies = [ + "base64", + "clap", + "nix", + "tempfile", +] + +[[package]] +name = "libc" +version = "0.2.146" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f92be4933c13fd498862a9e02a3055f8a8d9c039ce33db97306fd5a6caa7f29b" + +[[package]] +name = "linux-raw-sys" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef53942eb7bf7ff43a617b3e2c1c4a5ecf5944a7c1bc12d7ee39bbb15e5c1519" + +[[package]] +name = "memoffset" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5aa361d4faea93603064a027415f07bd8e1d5c88c9fbf68bf56a285428fd79ce" +dependencies = [ + "autocfg", +] + +[[package]] +name = "nix" +version = "0.24.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa52e972a9a719cecb6864fb88568781eb706bac2cd1d4f04a648542dbf78069" +dependencies = [ + "bitflags", + "cfg-if", + "libc", + "memoffset", +] + +[[package]] +name = "once_cell" +version = "1.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" + +[[package]] +name = "proc-macro2" +version = "1.0.59" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6aeca18b86b413c660b781aa319e4e2648a3e6f9eadc9b47e9038e6fe9f3451b" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b9ab9c7eadfd8df19006f1cf1a4aed13540ed5cbc047010ece5826e10825488" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "redox_syscall" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" +dependencies = [ + "bitflags", +] + +[[package]] +name = "rustix" +version = "0.37.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fea8ca367a3a01fe35e6943c400addf443c0f57670e6ec51196f71a4b8762dd2" +dependencies = [ + "bitflags", + "errno", + "io-lifetimes", + "libc", + "linux-raw-sys", + "windows-sys", +] + +[[package]] +name = "strsim" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" + +[[package]] +name = "syn" +version = "2.0.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a10b47e4921acc65b7d824cd92bc7b67a26382d8f4eadf3da65cb50aee6e6f3f" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "tempfile" +version = "3.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31c0432476357e58790aaa47a8efb0c5138f137343f3b5f23bd36a27e3b0a6d6" +dependencies = [ + "autocfg", + "cfg-if", + "fastrand", + "redox_syscall", + "rustix", + "windows-sys", +] + +[[package]] +name = "unicode-ident" +version = "1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5464a87b239f13a63a501f2701565754bae92d243d4bb7eb12f6d57d2269bf4" + +[[package]] +name = "utf8parse" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" + +[[package]] +name = "windows-sys" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-targets" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b1eb6f0cd7c80c79759c929114ef071b87354ce476d9d94271031c0497adfd5" +dependencies = [ + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3" + +[[package]] +name = "windows_i686_gnu" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241" + +[[package]] +name = "windows_i686_msvc" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" diff --git a/src/overlay/Cargo.toml b/src/overlay/Cargo.toml new file mode 100644 index 000000000000..541cece1e8ed --- /dev/null +++ b/src/overlay/Cargo.toml @@ -0,0 +1,10 @@ +[package] +name = "kata-overlay" +version = "0.1.0" +edition = "2021" + +[dependencies] +clap = { version = "4.3.2", features = ["derive"] } +base64 = "0.21.2" +tempfile = "3.3.0" +nix = "0.24.2" \ No newline at end of file diff --git a/src/overlay/Makefile b/src/overlay/Makefile new file mode 100644 index 000000000000..18d16616810c --- /dev/null +++ b/src/overlay/Makefile @@ -0,0 +1,8 @@ +all: + cargo build --release + +static-checks-build: + exit 0 + +clean: + cargo clean diff --git a/src/overlay/src/main.rs b/src/overlay/src/main.rs new file mode 100644 index 000000000000..e24284a0f179 --- /dev/null +++ b/src/overlay/src/main.rs @@ -0,0 +1,191 @@ +use base64::{engine::general_purpose, Engine as _}; +use clap::Parser; +use std::io::{self, Error, ErrorKind}; +use std::path::{Path, PathBuf}; +use std::{env::set_current_dir, process::Command}; + +#[derive(Parser, Debug)] +struct Args { + /// The source tarfs file. + source: String, + + /// The directory on which to mount. + directory: String, + + /// The filesystem type. + #[arg(short)] + r#type: Option, + + /// The filesystem options. + #[arg(short, long)] + options: Vec, +} + +const LAYER: &str = "io.katacontainers.fs-opt.layer="; +const LAYER_SRC_PREFIX: &str = "io.katacontainers.fs-opt.layer-src-prefix="; + +struct Layer { + src: PathBuf, + fs: String, + opts: String, +} + +fn parse_layers(args: &Args) -> io::Result> { + let mut layers = Vec::new(); + let mut prefix = Path::new(""); + + for group in &args.options { + for opt in group.split(',') { + if let Some(p) = opt.strip_prefix(LAYER_SRC_PREFIX) { + prefix = Path::new(p); + continue; + } + + let encoded = if let Some(e) = opt.strip_prefix(LAYER) { + e + } else { + continue; + }; + + let decoded = general_purpose::STANDARD + .decode(encoded) + .map_err(|e| Error::new(ErrorKind::InvalidInput, e))?; + let info = std::str::from_utf8(&decoded) + .map_err(|e| Error::new(ErrorKind::InvalidInput, e))?; + + let mut fields = info.split(','); + let src = if let Some(p) = fields.next() { + if !p.is_empty() && p.as_bytes()[0] != b'/' { + prefix.join(Path::new(p)) + } else { + Path::new(p).to_path_buf() + } + } else { + return Err(Error::new( + ErrorKind::InvalidInput, + format!("Missing path from {info}"), + )); + }; + + let fs = if let Some(f) = fields.next() { + f.into() + } else { + return Err(Error::new( + ErrorKind::InvalidInput, + format!("Missing filesystem type from {info}"), + )); + }; + + let fs_opts = fields + .filter(|o| !o.starts_with("io.katacontainers.")) + .fold(String::new(), |a, b| { + if a.is_empty() { + b.into() + } else { + format!("{a},{b}") + } + }); + layers.push(Layer { + src, + fs, + opts: fs_opts, + }); + } + } + + Ok(layers) +} + +struct Unmounter(Vec, tempfile::TempDir); +impl Drop for Unmounter { + fn drop(&mut self) { + for n in &self.0 { + let p = self.1.path().join(n); + match Command::new("umount").arg(&p).status() { + Err(e) => eprintln!("Unable to run umount command: {e}"), + Ok(s) => { + if !s.success() { + eprintln!("Unable to unmount {:?}: {s}", p); + } + } + } + } + } +} + +fn main() -> io::Result<()> { + let args = &Args::parse(); + let layers = parse_layers(args)?; + let mut unmounter = Unmounter(Vec::new(), tempfile::tempdir()?); + + // Mount all layers. + // + // We use the `mount` command instead of a syscall because we want leverage the additional work + // that `mount` does, for example, using helper binaries to mount. + for (i, layer) in layers.iter().enumerate() { + let n = i.to_string(); + let p = unmounter.1.path().join(&n); + std::fs::create_dir_all(&p)?; + println!("Mounting {:?} to {:?}", layer.src, p); + + let status = Command::new("mount") + .arg(&layer.src) + .arg(&p) + .arg("-t") + .arg(&layer.fs) + .arg("-o") + .arg(&layer.opts) + .status()?; + if !status.success() { + return Err(Error::new( + ErrorKind::Other, + format!("failed to mount {:?}: {status}", &layer.src), + )); + } + + unmounter.0.push(n); + } + + // Mount the overlay if we have multiple layers, otherwise do a bind-mount. + let mp = std::fs::canonicalize(&args.directory)?; + if unmounter.0.len() == 1 { + let p = unmounter.1.path().join(unmounter.0.first().unwrap()); + let status = Command::new("mount") + .arg(&p) + .arg(&mp) + .args(&["-t", "bind", "-o", "bind"]) + .status()?; + if !status.success() { + return Err(Error::new( + ErrorKind::Other, + format!("failed to bind mount: {status}"), + )); + } + } else { + let saved = std::env::current_dir()?; + set_current_dir(unmounter.1.path())?; + + let lowerdirs = unmounter.0.join(":"); + let opts = format!("lowerdir={}", lowerdirs); + + // Replace the mount(8) tool with nix::mount to address the limitation of FSCONFIG_SET_STRING, + // which has a 256-byte limit and cannot accommodate multiple lowerdir entries. + nix::mount::mount( + Some("overlay"), + &mp, + Some("overlay"), + nix::mount::MsFlags::empty(), + Some(opts.as_str()), + ) + .map_err(|e| { + Error::new( + ErrorKind::Other, + format!("failed to mount overlay to {}: {}", mp.display(), e), + ) + })?; + + set_current_dir(saved)?; + } + + Ok(()) +} diff --git a/src/runtime/Makefile b/src/runtime/Makefile index 192bab185cd5..6a73a57766b5 100644 --- a/src/runtime/Makefile +++ b/src/runtime/Makefile @@ -62,6 +62,8 @@ IMAGENAME_NV = $(PROJECT_TAG)-nvidia-gpu.img IMAGENAME_CONFIDENTIAL_NV = $(PROJECT_TAG)-nvidia-gpu-confidential.img INITRDNAME_NV = $(PROJECT_TAG)-initrd-nvidia-gpu.img INITRDNAME_CONFIDENTIAL_NV = $(PROJECT_TAG)-initrd-nvidia-gpu-confidential.img +INITRDSEVNAME = $(PROJECT_TAG)-initrd-sev.img +IGVMNAME = $(PROJECT_TAG)-igvm.img TARGET = $(BIN_PREFIX)-runtime RUNTIME_OUTPUT = $(CURDIR)/$(TARGET) @@ -107,6 +109,7 @@ GENERATED_VARS = \ CONFIG_QEMU_TDX_IN \ CONFIG_QEMU_SNP_IN \ CONFIG_CLH_IN \ + CONFIG_CLH_SNP_IN \ CONFIG_FC_IN \ CONFIG_STRATOVIRT_IN \ CONFIG_REMOTE_IN \ @@ -133,6 +136,8 @@ IMAGEPATH_NV := $(PKGDATADIR)/$(IMAGENAME_NV) IMAGEPATH_CONFIDENTIAL_NV := $(PKGDATADIR)/$(IMAGENAME_CONFIDENTIAL_NV) INITRDPATH_NV := $(PKGDATADIR)/$(INITRDNAME_NV) INITRDPATH_CONFIDENTIAL_NV := $(PKGDATADIR)/$(INITRDNAME_CONFIDENTIAL_NV) +INITRDSEVPATH := $(PKGDATADIR)/$(INITRDSEVNAME) +IGVMPATH := $(PKGDATADIR)/$(IGVMNAME) ROOTFSTYPE_EXT4 := \"ext4\" ROOTFSTYPE_XFS := \"xfs\" @@ -193,11 +198,11 @@ STRATOVIRTPATH = $(STRATOVIRTBINDIR)/$(STRATOVIRTCMD) STRATOVIRTVALIDHYPERVISORPATHS := [\"$(STRATOVIRTPATH)\"] # Default number of vCPUs -DEFVCPUS := 1 +DEFVCPUS ?= 1 # Default maximum number of vCPUs DEFMAXVCPUS := 0 # Default memory size in MiB -DEFMEMSZ := 2048 +DEFMEMSZ ?= 2048 # Default memory slots # Cases to consider : # - nvdimm rootfs image @@ -238,6 +243,7 @@ DEFSHAREDFS_QEMU_VIRTIOFS := virtio-fs # Please keep DEFSHAREDFS_QEMU_COCO_DEV_VIRTIOFS in sync with TDX/SEV/SNP DEFSHAREDFS_QEMU_COCO_DEV_VIRTIOFS := none DEFSHAREDFS_STRATOVIRT_VIRTIOFS := virtio-fs +DEFSHAREDFS_CLH_SNP_VIRTIOFS := none DEFSHAREDFS_QEMU_TDX_VIRTIOFS := none DEFSHAREDFS_QEMU_SEV_VIRTIOFS := none DEFSHAREDFS_QEMU_SNP_VIRTIOFS := none @@ -269,6 +275,10 @@ DEFSANDBOXCGROUPONLY ?= false DEFSTATICRESOURCEMGMT ?= false DEFSTATICRESOURCEMGMT_TEE = true +# Default memory and vcpus for use for workloads within the sandbox if no specific workload values are requested +DEFSTATICSANDBOXWORKLOADMEM ?= 2048 +DEFSTATICSANDBOXWORKLOADVCPUS ?= 1 + DEFBINDMOUNTS := [] # Create Container Timeout in seconds @@ -476,6 +486,18 @@ ifneq (,$(CLHCMD)) CONFIGS += $(CONFIG_CLH) + CONFIG_FILE_CLH_SNP = configuration-clh-snp.toml + CONFIG_CLH_SNP = config/$(CONFIG_FILE_CLH_SNP) + CONFIG_CLH_SNP_IN = $(CONFIG_CLH_SNP).in + + CONFIG_PATH_CLH_SNP = $(abspath $(CONFDIR)/$(CONFIG_FILE_CLH_SNP)) + CONFIG_PATHS += $(CONFIG_PATH_CLH_SNP) + + SYSCONFIG_CLH_SNP = $(abspath $(SYSCONFDIR)/$(CONFIG_FILE_CLH_SNP)) + SYSCONFIG_PATHS += $(SYSCONFIG_CLH_SNP) + + CONFIGS += $(CONFIG_CLH_SNP) + # CLH-specific options (all should be suffixed by "_CLH") # currently, huge pages are required for virtiofsd support DEFNETWORKMODEL_CLH := tcfilter @@ -630,6 +652,11 @@ USER_VARS += KERNELSNPPARAMS_NV USER_VARS += DEFAULTTIMEOUT_NV USER_VARS += DEFSANDBOXCGROUPONLY_NV USER_VARS += FIRMWAREPATH_NV +USER_VARS += INITRDSEVNAME +USER_VARS += IGVMNAME +USER_VARS += INITRDPATH +USER_VARS += INITRDSEVPATH +USER_VARS += IGVMPATH USER_VARS += DEFROOTFSTYPE USER_VARS += MACHINETYPE USER_VARS += KERNELDIR @@ -711,6 +738,7 @@ USER_VARS += DEFSHAREDFS_CLH_VIRTIOFS USER_VARS += DEFSHAREDFS_QEMU_VIRTIOFS USER_VARS += DEFSHAREDFS_QEMU_COCO_DEV_VIRTIOFS USER_VARS += DEFSHAREDFS_STRATOVIRT_VIRTIOFS +USER_VARS += DEFSHAREDFS_CLH_SNP_VIRTIOFS USER_VARS += DEFSHAREDFS_QEMU_TDX_VIRTIOFS USER_VARS += DEFSHAREDFS_QEMU_SEV_VIRTIOFS USER_VARS += DEFSHAREDFS_QEMU_SNP_VIRTIOFS @@ -738,13 +766,14 @@ USER_VARS += DEFSTATICRESOURCEMGMT_CLH USER_VARS += DEFSTATICRESOURCEMGMT_FC USER_VARS += DEFSTATICRESOURCEMGMT_STRATOVIRT USER_VARS += DEFSTATICRESOURCEMGMT_TEE +USER_VARS += DEFSTATICSANDBOXWORKLOADMEM +USER_VARS += DEFSTATICSANDBOXWORKLOADVCPUS USER_VARS += DEFBINDMOUNTS USER_VARS += DEFCREATECONTAINERTIMEOUT USER_VARS += DEFDANCONF USER_VARS += DEFVFIOMODE USER_VARS += BUILDFLAGS - V = @ Q = $(V:1=) QUIET_BUILD = $(Q:@=@echo ' BUILD '$@;) diff --git a/src/runtime/config/configuration-clh-snp.toml.in b/src/runtime/config/configuration-clh-snp.toml.in new file mode 100644 index 000000000000..64c61efa1524 --- /dev/null +++ b/src/runtime/config/configuration-clh-snp.toml.in @@ -0,0 +1,468 @@ +# Copyright (c) 2023 Microsoft Corporation +# +# SPDX-License-Identifier: Apache-2.0 +# + +# XXX: WARNING: this file is auto-generated. +# XXX: +# XXX: Source file: "@CONFIG_CLH_IN@" +# XXX: Project: +# XXX: Name: @PROJECT_NAME@ +# XXX: Type: @PROJECT_TYPE@ + +[hypervisor.clh] +path = "@CLHPATH@" +igvm = "@IGVMPATH@" +image = "@IMAGEPATH@" + +# rootfs filesystem type: +# - ext4 (default) +# - xfs +# - erofs +rootfs_type=@DEFROOTFSTYPE@ + +# Enable confidential guest support. +# Toggling that setting may trigger different hardware features, ranging +# from memory encryption to both memory and CPU-state encryption and integrity. +# The Kata Containers runtime dynamically detects the available feature set and +# aims at enabling the largest possible one, returning an error if none is +# available, or none is supported by the hypervisor. +# +# Known limitations: +# * Does not work by design: +# - CPU Hotplug +# - Memory Hotplug +# - NVDIMM devices +# +# Supported TEEs: +# * Intel TDX +# +# Default false +confidential_guest = true + +# enable SEV SNP VMs. +# This is used in the CLH code path to request SEV SNP encryption. The function availableGuestProtection (see hypervisor_linux_amd64.go) +# that detects guest protection features hypervisor_linux_amd64.go only supports QEMU/KVM platforms, and currently there is no way to +# detect SEV SNP support with CLH/MSHV. +sev_snp_guest = true + +# Enable running clh VMM as a non-root user. +# By default clh VMM run as root. When this is set to true, clh VMM process runs as +# a non-root random user. See documentation for the limitations of this mode. +# rootless = true + +# disable applying SELinux on the VMM process (default false) +disable_selinux=@DEFDISABLESELINUX@ + +# disable applying SELinux on the container process +# If set to false, the type `container_t` is applied to the container process by default. +# Note: To enable guest SELinux, the guest rootfs must be CentOS that is created and built +# with `SELINUX=yes`. +# (default: true) +disable_guest_selinux=@DEFDISABLEGUESTSELINUX@ + +# Path to the firmware. +# If you want Cloud Hypervisor to use a specific firmware, set its path below. +# This is option is only used when confidential_guest is enabled. +# +# For more information about firmwared that can be used with specific TEEs, +# please, refer to: +# * Intel TDX: +# - td-shim: https://github.com/confidential-containers/td-shim +# +# firmware = "@FIRMWAREPATH@" + +# List of valid annotation names for the hypervisor +# Each member of the list is a regular expression, which is the base name +# of the annotation, e.g. "path" for io.katacontainers.config.hypervisor.path" +enable_annotations = @DEFENABLEANNOTATIONS@ + +# List of valid annotations values for the hypervisor +# Each member of the list is a path pattern as described by glob(3). +# The default if not set is empty (all annotations rejected.) +# Your distribution recommends: @CLHVALIDHYPERVISORPATHS@ +valid_hypervisor_paths = @CLHVALIDHYPERVISORPATHS@ + +# Optional space-separated list of options to pass to the guest kernel. +# For example, use `kernel_params = "vsyscall=emulate"` if you are having +# trouble running pre-2.15 glibc. +# +# WARNING: - any parameter specified here will take priority over the default +# parameter value of the same name used to start the virtual machine. +# Do not set values here unless you understand the impact of doing so as you +# may stop the virtual machine from booting. +# To see the list of default parameters, enable hypervisor debug, create a +# container and look for 'default-kernel-parameters' log entries. +kernel_params = "@KERNELPARAMS@" + +# Default number of vCPUs per SB/VM: +# unspecified or 0 --> will be set to @DEFVCPUS@ +# < 0 --> will be set to the actual number of physical cores +# > 0 <= number of physical cores --> will be set to the specified number +# > number of physical cores --> will be set to the actual number of physical cores +default_vcpus = @DEFVCPUS@ + +# Default maximum number of vCPUs per SB/VM: +# unspecified or == 0 --> will be set to the actual number of physical cores or to the maximum number +# of vCPUs supported by KVM if that number is exceeded +# > 0 <= number of physical cores --> will be set to the specified number +# > number of physical cores --> will be set to the actual number of physical cores or to the maximum number +# of vCPUs supported by KVM if that number is exceeded +# WARNING: Depending of the architecture, the maximum number of vCPUs supported by KVM is used when +# the actual number of physical cores is greater than it. +# WARNING: Be aware that this value impacts the virtual machine's memory footprint and CPU +# the hotplug functionality. For example, `default_maxvcpus = 240` specifies that until 240 vCPUs +# can be added to a SB/VM, but the memory footprint will be big. Another example, with +# `default_maxvcpus = 8` the memory footprint will be small, but 8 will be the maximum number of +# vCPUs supported by the SB/VM. In general, we recommend that you do not edit this variable, +# unless you know what are you doing. +default_maxvcpus = @DEFMAXVCPUS@ + +# Default memory size in MiB for SB/VM. +# If unspecified then it will be set @DEFMEMSZ@ MiB. +default_memory = @DEFMEMSZ@ + +# Default memory slots per SB/VM. +# If unspecified then it will be set @DEFMEMSLOTS@. +# This is will determine the times that memory will be hotadded to sandbox/VM. +#memory_slots = @DEFMEMSLOTS@ + +# Default maximum memory in MiB per SB / VM +# unspecified or == 0 --> will be set to the actual amount of physical RAM +# > 0 <= amount of physical RAM --> will be set to the specified number +# > amount of physical RAM --> will be set to the actual amount of physical RAM +default_maxmemory = @DEFMAXMEMSZ@ + +# Shared file system type: +# - virtio-fs (default) +# - virtio-fs-nydus +# - none +shared_fs = "@DEFSHAREDFS_CLH_SNP_VIRTIOFS@" + +# Path to vhost-user-fs daemon. +virtio_fs_daemon = "@DEFVIRTIOFSDAEMON@" + +# List of valid annotations values for the virtiofs daemon +# The default if not set is empty (all annotations rejected.) +# Your distribution recommends: @DEFVALIDVIRTIOFSDAEMONPATHS@ +valid_virtio_fs_daemon_paths = @DEFVALIDVIRTIOFSDAEMONPATHS@ + +# Default size of DAX cache in MiB +virtio_fs_cache_size = @DEFVIRTIOFSCACHESIZE@ + +# Default size of virtqueues +virtio_fs_queue_size = @DEFVIRTIOFSQUEUESIZE@ + +# Extra args for virtiofsd daemon +# +# Format example: +# ["-o", "arg1=xxx,arg2", "-o", "hello world", "--arg3=yyy"] +# Examples: +# Set virtiofsd log level to debug : ["-o", "log_level=debug"] or ["-d"] +# see `virtiofsd -h` for possible options. +virtio_fs_extra_args = @DEFVIRTIOFSEXTRAARGS@ + +# Cache mode: +# +# - never +# Metadata, data, and pathname lookup are not cached in guest. They are +# always fetched from host and any changes are immediately pushed to host. +# +# - auto +# Metadata and pathname lookup cache expires after a configured amount of +# time (default is 1 second). Data is cached while the file is open (close +# to open consistency). +# +# - always +# Metadata, data, and pathname lookup are cached in guest and never expire. +virtio_fs_cache = "@DEFVIRTIOFSCACHE@" + +# Block storage driver to be used for the hypervisor in case the container +# rootfs is backed by a block device. This is virtio-blk. +block_device_driver = "virtio-blk" + +# Enable huge pages for VM RAM, default false +# Enabling this will result in the VM memory +# being allocated using huge pages. +#enable_hugepages = true + +# Disable the 'seccomp' feature from Cloud Hypervisor, default false +# disable_seccomp = true + +# This option changes the default hypervisor and kernel parameters +# to enable debug output where available. +# +# Default false +#enable_debug = true + +# This option specifies the loglevel of the hypervisor +# +# Default 1 +#hypervisor_loglevel = 1 + +# Path to OCI hook binaries in the *guest rootfs*. +# This does not affect host-side hooks which must instead be added to +# the OCI spec passed to the runtime. +# +# You can create a rootfs with hooks by customizing the osbuilder scripts: +# https://github.com/kata-containers/kata-containers/tree/main/tools/osbuilder +# +# Hooks must be stored in a subdirectory of guest_hook_path according to their +# hook type, i.e. "guest_hook_path/{prestart,poststart,poststop}". +# The agent will scan these directories for executable files and add them, in +# lexicographical order, to the lifecycle of the guest container. +# Hooks are executed in the runtime namespace of the guest. See the official documentation: +# https://github.com/opencontainers/runtime-spec/blob/v1.0.1/config.md#posix-platform-hooks +# Warnings will be logged if any error is encountered while scanning for hooks, +# but it will not abort container execution. +#guest_hook_path = "/usr/share/oci/hooks" +# +# These options are related to network rate limiter at the VMM level, and are +# based on the Cloud Hypervisor I/O throttling. Those are disabled by default +# and we strongly advise users to refer the Cloud Hypervisor official +# documentation for a better understanding of its internals: +# https://github.com/cloud-hypervisor/cloud-hypervisor/blob/main/docs/io_throttling.md +# +# Bandwidth rate limiter options +# +# net_rate_limiter_bw_max_rate controls network I/O bandwidth (size in bits/sec +# for SB/VM). +# The same value is used for inbound and outbound bandwidth. +# Default 0-sized value means unlimited rate. +#net_rate_limiter_bw_max_rate = 0 +# +# net_rate_limiter_bw_one_time_burst increases the initial max rate and this +# initial extra credit does *NOT* affect the overall limit and can be used for +# an *initial* burst of data. +# This is *optional* and only takes effect if net_rate_limiter_bw_max_rate is +# set to a non zero value. +#net_rate_limiter_bw_one_time_burst = 0 +# +# Operation rate limiter options +# +# net_rate_limiter_ops_max_rate controls network I/O bandwidth (size in ops/sec +# for SB/VM). +# The same value is used for inbound and outbound bandwidth. +# Default 0-sized value means unlimited rate. +#net_rate_limiter_ops_max_rate = 0 +# +# net_rate_limiter_ops_one_time_burst increases the initial max rate and this +# initial extra credit does *NOT* affect the overall limit and can be used for +# an *initial* burst of data. +# This is *optional* and only takes effect if net_rate_limiter_bw_max_rate is +# set to a non zero value. +#net_rate_limiter_ops_one_time_burst = 0 +# +# These options are related to disk rate limiter at the VMM level, and are +# based on the Cloud Hypervisor I/O throttling. Those are disabled by default +# and we strongly advise users to refer the Cloud Hypervisor official +# documentation for a better understanding of its internals: +# https://github.com/cloud-hypervisor/cloud-hypervisor/blob/main/docs/io_throttling.md +# +# Bandwidth rate limiter options +# +# disk_rate_limiter_bw_max_rate controls disk I/O bandwidth (size in bits/sec +# for SB/VM). +# The same value is used for inbound and outbound bandwidth. +# Default 0-sized value means unlimited rate. +#disk_rate_limiter_bw_max_rate = 0 +# +# disk_rate_limiter_bw_one_time_burst increases the initial max rate and this +# initial extra credit does *NOT* affect the overall limit and can be used for +# an *initial* burst of data. +# This is *optional* and only takes effect if disk_rate_limiter_bw_max_rate is +# set to a non zero value. +#disk_rate_limiter_bw_one_time_burst = 0 +# +# Operation rate limiter options +# +# disk_rate_limiter_ops_max_rate controls disk I/O bandwidth (size in ops/sec +# for SB/VM). +# The same value is used for inbound and outbound bandwidth. +# Default 0-sized value means unlimited rate. +#disk_rate_limiter_ops_max_rate = 0 +# +# disk_rate_limiter_ops_one_time_burst increases the initial max rate and this +# initial extra credit does *NOT* affect the overall limit and can be used for +# an *initial* burst of data. +# This is *optional* and only takes effect if disk_rate_limiter_bw_max_rate is +# set to a non zero value. +#disk_rate_limiter_ops_one_time_burst = 0 + +[agent.@PROJECT_TYPE@] +# If enabled, make the agent display debug-level messages. +# (default: disabled) +#enable_debug = true + +# Enable agent tracing. +# +# If enabled, the agent will generate OpenTelemetry trace spans. +# +# Notes: +# +# - If the runtime also has tracing enabled, the agent spans will be +# associated with the appropriate runtime parent span. +# - If enabled, the runtime will wait for the container to shutdown, +# increasing the container shutdown time slightly. +# +# (default: disabled) +#enable_tracing = true + +# Enable debug console. + +# If enabled, user can connect guest OS running inside hypervisor +# through "kata-runtime exec " command + +#debug_console_enabled = true + +# Agent connection dialing timeout value in seconds +# (default: 90) +dial_timeout = 90 + +[runtime] +# If enabled, the runtime will log additional debug messages to the +# system log +# (default: disabled) +#enable_debug = true +# +# Internetworking model +# Determines how the VM should be connected to the +# the container network interface +# Options: +# +# - macvtap +# Used when the Container network interface can be bridged using +# macvtap. +# +# - none +# Used when customize network. Only creates a tap device. No veth pair. +# +# - tcfilter +# Uses tc filter rules to redirect traffic from the network interface +# provided by plugin to a tap interface connected to the VM. +# +internetworking_model="@DEFNETWORKMODEL_CLH@" + +# disable guest seccomp +# Determines whether container seccomp profiles are passed to the virtual +# machine and applied by the kata agent. If set to true, seccomp is not applied +# within the guest +# (default: true) +disable_guest_seccomp=@DEFDISABLEGUESTSECCOMP@ + +# Apply a custom SELinux security policy to the container process inside the VM. +# This is used when you want to apply a type other than the default `container_t`, +# so general users should not uncomment and apply it. +# (format: "user:role:type") +# Note: You cannot specify MCS policy with the label because the sensitivity levels and +# categories are determined automatically by high-level container runtimes such as containerd. +#guest_selinux_label="@DEFGUESTSELINUXLABEL@" + +# If enabled, the runtime will create opentracing.io traces and spans. +# (See https://www.jaegertracing.io/docs/getting-started). +# (default: disabled) +#enable_tracing = true + +# Set the full url to the Jaeger HTTP Thrift collector. +# The default if not set will be "http://localhost:14268/api/traces" +#jaeger_endpoint = "" + +# Sets the username to be used if basic auth is required for Jaeger. +#jaeger_user = "" + +# Sets the password to be used if basic auth is required for Jaeger. +#jaeger_password = "" + +# If enabled, the runtime will not create a network namespace for shim and hypervisor processes. +# This option may have some potential impacts to your host. It should only be used when you know what you're doing. +# `disable_new_netns` conflicts with `internetworking_model=tcfilter` and `internetworking_model=macvtap`. It works only +# with `internetworking_model=none`. The tap device will be in the host network namespace and can connect to a bridge +# (like OVS) directly. +# (default: false) +#disable_new_netns = true + +# if enabled, the runtime will add all the kata processes inside one dedicated cgroup. +# The container cgroups in the host are not created, just one single cgroup per sandbox. +# The runtime caller is free to restrict or collect cgroup stats of the overall Kata sandbox. +# The sandbox cgroup path is the parent cgroup of a container with the PodSandbox annotation. +# The sandbox cgroup is constrained if there is no container type annotation. +# See: https://pkg.go.dev/github.com/kata-containers/kata-containers/src/runtime/virtcontainers#ContainerType +sandbox_cgroup_only=@DEFSANDBOXCGROUPONLY@ + +# If enabled, the runtime will attempt to determine appropriate sandbox size (memory, CPU) before booting the virtual machine. In +# this case, the runtime will not dynamically update the amount of memory and CPU in the virtual machine. This is generally helpful +# when a hardware architecture or hypervisor solutions is utilized which does not support CPU and/or memory hotplug. +# Compatibility for determining appropriate sandbox (VM) size: +# - When running with pods, sandbox sizing information will only be available if using Kubernetes >= 1.23 and containerd >= 1.6. CRI-O +# does not yet support sandbox sizing annotations. +# - When running single containers using a tool like ctr, container sizing information will be available. +static_sandbox_resource_mgmt=@DEFSTATICRESOURCEMGMT_TEE@ + +# If set, the runtime will use the value as the default workload memory in MB for the sandbox when no workload memory request is passed +# down to the shim via the OCI when static sandbox resource management is enabled. With this, we ensure that workloads have a proper +# default amount of memory available within the sandbox. +static_sandbox_default_workload_mem=@DEFSTATICSANDBOXWORKLOADMEM@ + +# If set, the runtime will use the value as the default number of vcpus for the sandbox when no workload vcpu request is passed +# down to the shim via the OCI when static sandbox resource management is enabled. With this, we ensure that workloads have a proper +# default amount of vcpus available within the sandbox. +static_sandbox_default_workload_vcpus=@DEFSTATICSANDBOXWORKLOADVCPUS@ + +# If specified, sandbox_bind_mounts identifieds host paths to be mounted (ro) into the sandboxes shared path. +# This is only valid if filesystem sharing is utilized. The provided path(s) will be bindmounted into the shared fs directory. +# If defaults are utilized, these mounts should be available in the guest at `/run/kata-containers/shared/containers/sandbox-mounts` +# These will not be exposed to the container workloads, and are only provided for potential guest services. +sandbox_bind_mounts=@DEFBINDMOUNTS@ + +# VFIO Mode +# Determines how VFIO devices should be be presented to the container. +# Options: +# +# - vfio +# Matches behaviour of OCI runtimes (e.g. runc) as much as +# possible. VFIO devices will appear in the container as VFIO +# character devices under /dev/vfio. The exact names may differ +# from the host (they need to match the VM's IOMMU group numbers +# rather than the host's) +# +# - guest-kernel +# This is a Kata-specific behaviour that's useful in certain cases. +# The VFIO device is managed by whatever driver in the VM kernel +# claims it. This means it will appear as one or more device nodes +# or network interfaces depending on the nature of the device. +# Using this mode requires specially built workloads that know how +# to locate the relevant device interfaces within the VM. +# +vfio_mode="@DEFVFIOMODE@" + +# If enabled, the runtime will not create Kubernetes emptyDir mounts on the guest filesystem. Instead, emptyDir mounts will +# be created on the host and shared via virtio-fs. This is potentially slower, but allows sharing of files from host to guest. +disable_guest_empty_dir=@DEFDISABLEGUESTEMPTYDIR@ + +# Enabled experimental feature list, format: ["a", "b"]. +# Experimental features are features not stable enough for production, +# they may break compatibility, and are prepared for a big version bump. +# Supported experimental features: +# (default: []) +experimental=@DEFAULTEXPFEATURES@ + +# If enabled, user can run pprof tools with shim v2 process through kata-monitor. +# (default: false) +# enable_pprof = true + +# Indicates the CreateContainer request timeout needed for the workload(s) +# It using guest_pull this includes the time to pull the image inside the guest +# Defaults to @DEFCREATECONTAINERTIMEOUT@ second(s) +# Note: The effective timeout is determined by the lesser of two values: runtime-request-timeout from kubelet config +# (https://kubernetes.io/docs/reference/command-line-tools-reference/kubelet/#:~:text=runtime%2Drequest%2Dtimeout) and create_container_timeout. +# In essence, the timeout used for guest pull=runtime-request-timeout will be set to the actual number of physical cores # > 0 <= number of physical cores --> will be set to the specified number # > number of physical cores --> will be set to the actual number of physical cores -default_vcpus = 1 +default_vcpus = @DEFVCPUS@ # Default maximum number of vCPUs per SB/VM: # unspecified or == 0 --> will be set to the actual number of physical cores or to the maximum number @@ -236,9 +236,9 @@ block_device_driver = "virtio-blk" # and we strongly advise users to refer the Cloud Hypervisor official # documentation for a better understanding of its internals: # https://github.com/cloud-hypervisor/cloud-hypervisor/blob/main/docs/io_throttling.md -# +# # Bandwidth rate limiter options -# +# # net_rate_limiter_bw_max_rate controls network I/O bandwidth (size in bits/sec # for SB/VM). # The same value is used for inbound and outbound bandwidth. @@ -272,9 +272,9 @@ block_device_driver = "virtio-blk" # and we strongly advise users to refer the Cloud Hypervisor official # documentation for a better understanding of its internals: # https://github.com/cloud-hypervisor/cloud-hypervisor/blob/main/docs/io_throttling.md -# +# # Bandwidth rate limiter options -# +# # disk_rate_limiter_bw_max_rate controls disk I/O bandwidth (size in bits/sec # for SB/VM). # The same value is used for inbound and outbound bandwidth. @@ -303,6 +303,12 @@ block_device_driver = "virtio-blk" # set to a non zero value. #disk_rate_limiter_ops_one_time_burst = 0 +# If false and nvdimm is supported, use nvdimm device to plug guest image. +# Otherwise virtio-block device is used. +# +# Default is false +disable_image_nvdimm = true + [agent.@PROJECT_TYPE@] # If enabled, make the agent display debug-level messages. # (default: disabled) @@ -416,6 +422,16 @@ sandbox_cgroup_only=@DEFSANDBOXCGROUPONLY@ # - When running single containers using a tool like ctr, container sizing information will be available. static_sandbox_resource_mgmt=@DEFSTATICRESOURCEMGMT_CLH@ +# If set, the runtime will use the value as the default workload memory in MB for the sandbox when no workload memory request is passed +# down to the shim via the OCI when static sandbox resource management is enabled. With this, we ensure that workloads have a proper +# default amount of memory available within the sandbox. +static_sandbox_default_workload_mem=@DEFSTATICSANDBOXWORKLOADMEM@ + +# If set, the runtime will use the value as the default number of vcpus for the sandbox when no workload vcpu request is passed +# down to the shim via the OCI when static sandbox resource management is enabled. With this, we ensure that workloads have a proper +# default amount of vcpus available within the sandbox. +static_sandbox_default_workload_vcpus=@DEFSTATICSANDBOXWORKLOADVCPUS@ + # If specified, sandbox_bind_mounts identifieds host paths to be mounted (ro) into the sandboxes shared path. # This is only valid if filesystem sharing is utilized. The provided path(s) will be bindmounted into the shared fs directory. # If defaults are utilized, these mounts should be available in the guest at `/run/kata-containers/shared/containers/sandbox-mounts` diff --git a/src/runtime/config/configuration-qemu-snp.toml.in b/src/runtime/config/configuration-qemu-snp.toml.in index dcfb809440f3..d1bde814a1db 100644 --- a/src/runtime/config/configuration-qemu-snp.toml.in +++ b/src/runtime/config/configuration-qemu-snp.toml.in @@ -34,7 +34,7 @@ rootfs_type=@DEFROOTFSTYPE@ # # Known limitations: # * Does not work by design: -# - CPU Hotplug +# - CPU Hotplug # - Memory Hotplug # - NVDIMM devices # @@ -462,7 +462,6 @@ disable_selinux=@DEFDISABLESELINUX@ # (default: true) disable_guest_selinux=@DEFDISABLEGUESTSELINUX@ - [factory] # VM templating support. Once enabled, new VMs are created from template # using vm cloning. They will share the same initial kernel, initramfs and diff --git a/src/runtime/config/configuration-qemu.toml.in b/src/runtime/config/configuration-qemu.toml.in index d3aeefbc3aac..62dd54328085 100644 --- a/src/runtime/config/configuration-qemu.toml.in +++ b/src/runtime/config/configuration-qemu.toml.in @@ -33,7 +33,7 @@ rootfs_type=@DEFROOTFSTYPE@ # # Known limitations: # * Does not work by design: -# - CPU Hotplug +# - CPU Hotplug # - Memory Hotplug # - NVDIMM devices # diff --git a/src/runtime/pkg/containerd-shim-v2/create.go b/src/runtime/pkg/containerd-shim-v2/create.go index c272c89d4ef7..409532e17ccf 100644 --- a/src/runtime/pkg/containerd-shim-v2/create.go +++ b/src/runtime/pkg/containerd-shim-v2/create.go @@ -10,6 +10,7 @@ package containerdshim import ( "context" + "encoding/base64" "fmt" "os" "os/user" @@ -53,20 +54,36 @@ var defaultStartManagementServerFunc startManagementServerFunc = func(s *service } func copyLayersToMounts(rootFs *vc.RootFs, spec *specs.Spec) error { + prefix := "" for _, o := range rootFs.Options { + if strings.HasPrefix(o, annotations.FileSystemLayerSourcePrefix) { + prefix = o[len(annotations.FileSystemLayerSourcePrefix):] + continue + } + if !strings.HasPrefix(o, annotations.FileSystemLayer) { continue } - fields := strings.Split(o[len(annotations.FileSystemLayer):], ",") + decoded, err := base64.StdEncoding.DecodeString(o[len(annotations.FileSystemLayer):]) + if err != nil { + return fmt.Errorf("Unable to decode layer %q: %w", o, err) + } + + fields := strings.Split(string(decoded), ",") if len(fields) < 2 { return fmt.Errorf("Missing fields in rootfs layer: %q", o) } + source := fields[0] + if len(source) > 0 && source[0] != '/' { + source = filepath.Join(prefix, source) + } + spec.Mounts = append(spec.Mounts, specs.Mount{ - Destination: "/run/kata-containers/sandbox/layers/" + filepath.Base(fields[0]), + Destination: "/run/kata-containers/sandbox/layers/" + filepath.Base(source), Type: fields[1], - Source: fields[0], + Source: source, Options: fields[2:], }) } diff --git a/src/runtime/pkg/direct-volume/utils.go b/src/runtime/pkg/direct-volume/utils.go index 9e13a4d227a6..2d5e55b62a27 100644 --- a/src/runtime/pkg/direct-volume/utils.go +++ b/src/runtime/pkg/direct-volume/utils.go @@ -19,6 +19,7 @@ const ( FSGroupMetadataKey = "fsGroup" FSGroupChangePolicyMetadataKey = "fsGroupChangePolicy" + SensitiveMountOptions = "sensitiveMountOptions" ) // FSGroupChangePolicy holds policies that will be used for applying fsGroup to a volume. diff --git a/src/runtime/pkg/katautils/config-settings.go.in b/src/runtime/pkg/katautils/config-settings.go.in index 55438f50078e..74d66a6364ea 100644 --- a/src/runtime/pkg/katautils/config-settings.go.in +++ b/src/runtime/pkg/katautils/config-settings.go.in @@ -59,7 +59,7 @@ const defaultKernelParams = "" const defaultMachineType = "q35" const defaultQgsPort = 4050 -const defaultVCPUCount uint32 = 1 +const defaultVCPUCount uint32 = 0 const defaultMaxVCPUCount uint32 = 0 const defaultMemSize uint32 = 2048 // MiB const defaultMemSlots uint32 = 10 diff --git a/src/runtime/pkg/katautils/config.go b/src/runtime/pkg/katautils/config.go index 79665e259391..4d9aa71f4d13 100644 --- a/src/runtime/pkg/katautils/config.go +++ b/src/runtime/pkg/katautils/config.go @@ -87,6 +87,7 @@ type hypervisor struct { Kernel string `toml:"kernel"` Initrd string `toml:"initrd"` Image string `toml:"image"` + Igvm string `toml:"igvm"` RootfsType string `toml:"rootfs_type"` Firmware string `toml:"firmware"` FirmwareVolume string `toml:"firmware_volume"` @@ -192,6 +193,8 @@ type runtime struct { DisableGuestEmptyDir bool `toml:"disable_guest_empty_dir"` CreateContainerTimeout uint64 `toml:"create_container_timeout"` DanConf string `toml:"dan_conf"` + StaticSandboxWorkloadDefaultMem uint32 `toml:"static_sandbox_default_workload_mem"` + StaticSandboxWorkloadDefaultVcpus float32 `toml:"static_sandbox_default_workload_vcpus"` } type agent struct { @@ -237,11 +240,25 @@ func (h hypervisor) jailerPath() (string, error) { return ResolvePath(p) } +func (h hypervisor) igvm() (string, error) { + p := h.Igvm + + if p == "" { + return "", nil + } + + return ResolvePath(p) +} + func (h hypervisor) kernel() (string, error) { p := h.Kernel if p == "" { - p = defaultKernelPath + if h.Igvm == "" { + p = defaultKernelPath + } else { + return "", nil + } } return ResolvePath(p) @@ -1014,9 +1031,9 @@ func newClhHypervisorConfig(h hypervisor) (vc.HypervisorConfig, error) { return vc.HypervisorConfig{}, err } - if image == "" && initrd == "" { - return vc.HypervisorConfig{}, - errors.New("image or initrd must be defined in the configuration file") + igvm, err := h.igvm() + if err != nil { + return vc.HypervisorConfig{}, err } rootfsType, err := h.rootfsType() @@ -1024,6 +1041,11 @@ func newClhHypervisorConfig(h hypervisor) (vc.HypervisorConfig, error) { return vc.HypervisorConfig{}, err } + if image == "" && initrd == "" && igvm == "" { + return vc.HypervisorConfig{}, + errors.New("image, initrd, or igvm must be defined in the configuration file") + } + firmware, err := h.firmware() if err != nil { return vc.HypervisorConfig{}, err @@ -1059,6 +1081,7 @@ func newClhHypervisorConfig(h hypervisor) (vc.HypervisorConfig, error) { KernelPath: kernel, InitrdPath: initrd, ImagePath: image, + IgvmPath: igvm, RootfsType: rootfsType, FirmwarePath: firmware, MachineAccelerators: machineAccelerators, @@ -1087,6 +1110,7 @@ func newClhHypervisorConfig(h hypervisor) (vc.HypervisorConfig, error) { FileBackedMemRootList: h.FileBackedMemRootList, Debug: h.Debug, DisableNestingChecks: h.DisableNestingChecks, + DisableImageNvdimm: h.DisableImageNvdimm, BlockDeviceDriver: blockDriver, BlockDeviceCacheSet: h.BlockDeviceCacheSet, BlockDeviceCacheDirect: h.BlockDeviceCacheDirect, @@ -1103,6 +1127,7 @@ func newClhHypervisorConfig(h hypervisor) (vc.HypervisorConfig, error) { EnableAnnotations: h.EnableAnnotations, DisableSeccomp: h.DisableSeccomp, ConfidentialGuest: h.ConfidentialGuest, + SevSnpGuest: h.SevSnpGuest, Rootless: h.Rootless, DisableSeLinux: h.DisableSeLinux, DisableGuestSeLinux: h.DisableGuestSeLinux, @@ -1557,6 +1582,8 @@ func LoadConfiguration(configPath string, ignoreLogging bool) (resolvedConfigPat config.EnableVCPUsPinning = tomlConf.Runtime.EnableVCPUsPinning config.GuestSeLinuxLabel = tomlConf.Runtime.GuestSeLinuxLabel config.StaticSandboxResourceMgmt = tomlConf.Runtime.StaticSandboxResourceMgmt + config.StaticSandboxWorkloadDefaultMem = tomlConf.Runtime.StaticSandboxWorkloadDefaultMem + config.StaticSandboxWorkloadDefaultVcpus = tomlConf.Runtime.StaticSandboxWorkloadDefaultVcpus config.SandboxCgroupOnly = tomlConf.Runtime.SandboxCgroupOnly config.DisableNewNetNs = tomlConf.Runtime.DisableNewNetNs config.EnablePprof = tomlConf.Runtime.EnablePprof @@ -1934,11 +1961,6 @@ func checkHypervisorConfig(config vc.HypervisorConfig) error { } memSizeMB := int64(config.MemorySize) - - if memSizeMB == 0 { - return errors.New("VM memory cannot be zero") - } - mb := int64(1024 * 1024) for _, image := range images { diff --git a/src/runtime/pkg/katautils/create.go b/src/runtime/pkg/katautils/create.go index 758e83a3b960..ebfef592bdf8 100644 --- a/src/runtime/pkg/katautils/create.go +++ b/src/runtime/pkg/katautils/create.go @@ -58,7 +58,7 @@ func getKernelParams(needSystemd, trace bool) []vc.Param { } func needSystemd(config vc.HypervisorConfig) bool { - return config.ImagePath != "" + return config.ImagePath != "" || config.InitrdPath != "" } // HandleFactory set the factory diff --git a/src/runtime/pkg/oci/utils.go b/src/runtime/pkg/oci/utils.go index e4f1e562e4c1..c763457aa727 100644 --- a/src/runtime/pkg/oci/utils.go +++ b/src/runtime/pkg/oci/utils.go @@ -146,6 +146,12 @@ type RuntimeConfig struct { // any later resource updates. StaticSandboxResourceMgmt bool + // Memory to allocate for workloads within the sandbox when workload memory is unspecified + StaticSandboxWorkloadDefaultMem uint32 + + // vcpus to allocate for workloads within the sandbox when workload vcpus is unspecified + StaticSandboxWorkloadDefaultVcpus float32 + // Determines if create a netns for hypervisor process DisableNewNetNs bool @@ -1066,6 +1072,10 @@ func SandboxConfig(ocispec specs.Spec, runtime RuntimeConfig, bundlePath, cid st StaticResourceMgmt: runtime.StaticSandboxResourceMgmt, + StaticWorkloadDefaultMem: runtime.StaticSandboxWorkloadDefaultMem, + + StaticWorkloadDefaultVcpus: runtime.StaticSandboxWorkloadDefaultVcpus, + ShmSize: shmSize, VfioMode: runtime.VfioMode, @@ -1094,6 +1104,15 @@ func SandboxConfig(ocispec specs.Spec, runtime RuntimeConfig, bundlePath, cid st // with the base number of CPU/memory (which is equal to the default CPU/memory specified for the runtime // configuration or annotations) as well as any specified workload resources. if sandboxConfig.StaticResourceMgmt { + // If no Limits are set in pod config, use StaticWorkloadDefaultMem/Vcpus to ensure the containers generally + // have a reasonable amount of resources available + if sandboxConfig.SandboxResources.WorkloadMemMB == 0 { + sandboxConfig.SandboxResources.WorkloadMemMB = sandboxConfig.StaticWorkloadDefaultMem + } + if sandboxConfig.SandboxResources.WorkloadCPUs == 0 { + sandboxConfig.SandboxResources.WorkloadCPUs = sandboxConfig.StaticWorkloadDefaultVcpus + } + sandboxConfig.SandboxResources.BaseCPUs = sandboxConfig.HypervisorConfig.NumVCPUsF sandboxConfig.SandboxResources.BaseMemMB = sandboxConfig.HypervisorConfig.MemorySize diff --git a/src/runtime/pkg/resourcecontrol/cgroups.go b/src/runtime/pkg/resourcecontrol/cgroups.go index 42006f494990..734ff6581348 100644 --- a/src/runtime/pkg/resourcecontrol/cgroups.go +++ b/src/runtime/pkg/resourcecontrol/cgroups.go @@ -60,6 +60,7 @@ func sandboxDevices() []specs.LinuxDeviceCgroup { "/dev/zero", "/dev/urandom", "/dev/console", + "/dev/ptmx", } // Processes running in a device-cgroup are constrained, they have acccess diff --git a/src/runtime/virtcontainers/clh.go b/src/runtime/virtcontainers/clh.go index cbb9460dfe96..2b97389ba267 100644 --- a/src/runtime/virtcontainers/clh.go +++ b/src/runtime/virtcontainers/clh.go @@ -74,10 +74,10 @@ const ( // Values based on: clhTimeout = 10 clhAPITimeout = 1 - clhAPITimeoutConfidentialGuest = 20 + clhAPITimeoutConfidentialGuest = 300 // Minimum timout for calling CreateVM followed by BootVM. Executing these two APIs // might take longer than the value returned by getClhAPITimeout(). - clhCreateAndBootVMMinimumTimeout = 10 + clhCreateAndBootVMMinimumTimeout = 100 // Timeout for hot-plug - hotplug devices can take more time, than usual API calls // Use longer time timeout for it. clhHotPlugAPITimeout = 5 @@ -87,6 +87,7 @@ const ( clhAPISocket = "clh-api.sock" virtioFsSocket = "virtiofsd.sock" defaultClhPath = "/usr/local/bin/cloud-hypervisor" + snpZeroHostData = "0000000000000000000000000000000000000000000000000000000000000000" ) // Interface that hides the implementation of openAPI client @@ -417,9 +418,19 @@ func (clh *cloudHypervisor) nydusdAPISocketPath(id string) (string, error) { } func (clh *cloudHypervisor) enableProtection() error { - protection, err := availableGuestProtection() - if err != nil { - return err + + protection := noneProtection + + // SNP protection explicitly requested by config + if clh.config.SevSnpGuest { + protection = snpProtection + } else { + // protection method not explicitly requested, using available method + availableProtection, err := availableGuestProtection() + if err != nil { + return err + } + protection = availableProtection } switch protection { @@ -444,11 +455,24 @@ func (clh *cloudHypervisor) enableProtection() error { case sevProtection: return errors.New("SEV protection is not supported by Cloud Hypervisor") + case snpProtection: - return errors.New("SEV-SNP protection is not supported by Cloud Hypervisor") + if clh.vmconfig.Platform == nil { + clh.vmconfig.Platform = chclient.NewPlatformConfig() + } + clh.vmconfig.Platform.SetSevSnp(true) + + if len(clh.config.PolicyHash) > 0 { + clh.vmconfig.Payload.SetHostData(clh.config.PolicyHash) + } else { + clh.vmconfig.Payload.SetHostData(snpZeroHostData) + } + + return nil default: - return errors.New("This system doesn't support Confidential Computing (Guest Protection)") + // Allow running with no hardware protection for testing. + return nil } } @@ -461,6 +485,11 @@ func (clh *cloudHypervisor) CreateVM(ctx context.Context, id string, network Net clh.ctx = newCtx defer span.End() + clh.Logger(). + WithField("DisableImageNvdimm", hypervisorConfig.DisableImageNvdimm). + WithField("ConfidentialGuest", hypervisorConfig.ConfidentialGuest). + Info("CreateVM") + if err := clh.setConfig(hypervisorConfig); err != nil { return err } @@ -491,16 +520,32 @@ func (clh *cloudHypervisor) CreateVM(ctx context.Context, id string, network Net // Create the VM config via the constructor to ensure default values are properly assigned clh.vmconfig = *chclient.NewVmConfig(*chclient.NewPayloadConfig()) - // Make sure the kernel path is valid - kernelPath, err := clh.config.KernelAssetPath() + // Make sure the igvm path is valid + igvmPath, err := clh.config.IgvmAssetPath() if err != nil { return err } - clh.vmconfig.Payload.SetKernel(kernelPath) + + // Make sure the kernel path is valid if no igvm set + if igvmPath == "" { + if clh.config.SevSnpGuest { + return errors.New("igvm must be set with sev_snp_guest") + } + kernelPath, err := clh.config.KernelAssetPath() + if err != nil { + return err + } + clh.vmconfig.Payload.SetKernel(kernelPath) + } else { + if !clh.config.ConfidentialGuest { + return errors.New("igvm may only be set with confidential_guest") + } + clh.vmconfig.Payload.SetIgvm(igvmPath) + } clh.vmconfig.Platform = chclient.NewPlatformConfig() platform := clh.vmconfig.Platform - platform.SetNumPciSegments(2) + platform.SetNumPciSegments(10) if clh.config.IOMMU { platform.SetIommuSegments([]int32{0}) } @@ -523,7 +568,7 @@ func (clh *cloudHypervisor) CreateVM(ctx context.Context, id string, network Net } // Enable hugepages if needed clh.vmconfig.Memory.Hugepages = func(b bool) *bool { return &b }(clh.config.HugePages) - if !clh.config.ConfidentialGuest { + if !clh.config.ConfidentialGuest && igvmPath == "" { hotplugSize := clh.config.DefaultMaxMemorySize // OpenAPI only supports int64 values clh.vmconfig.Memory.HotplugSize = func(i int64) *int64 { return &i }(int64((utils.MemUnit(hotplugSize) * utils.MiB).ToBytes())) @@ -531,7 +576,9 @@ func (clh *cloudHypervisor) CreateVM(ctx context.Context, id string, network Net // Set initial amount of cpu's for the virtual machine clh.vmconfig.Cpus = chclient.NewCpusConfig(int32(clh.config.NumVCPUs()), int32(clh.config.DefaultMaxVCPUs)) - params, err := GetKernelRootParams(hypervisorConfig.RootfsType, clh.config.ConfidentialGuest, !clh.config.ConfidentialGuest) + disableNvdimm := (clh.config.DisableImageNvdimm || clh.config.ConfidentialGuest) + enableDax := false + params, err := GetKernelRootParams(hypervisorConfig.RootfsType, disableNvdimm, enableDax) if err != nil { return err } @@ -558,7 +605,10 @@ func (clh *cloudHypervisor) CreateVM(ctx context.Context, id string, network Net // Followed by extra kernel parameters defined in the configuration file params = append(params, clh.config.KernelParams...) - clh.vmconfig.Payload.SetCmdline(kernelParamsToString(params)) + // The kernel cmdline is already embedded inside the IGVM file + if igvmPath == "" { + clh.vmconfig.Payload.SetCmdline(kernelParamsToString(params)) + } // set random device generator to hypervisor clh.vmconfig.Rng = chclient.NewRngConfig(clh.config.EntropySource) @@ -571,7 +621,7 @@ func (clh *cloudHypervisor) CreateVM(ctx context.Context, id string, network Net } if assetType == types.ImageAsset { - if clh.config.ConfidentialGuest { + if disableNvdimm { disk := chclient.NewDiskConfig(assetPath) disk.SetReadonly(true) @@ -596,9 +646,15 @@ func (clh *cloudHypervisor) CreateVM(ctx context.Context, id string, network Net clh.vmconfig.Pmem = &[]chclient.PmemConfig{*pmem} } } - } else { - // assetType == types.InitrdAsset - clh.vmconfig.Payload.SetInitramfs(assetPath) + } + + initrdPath, err := clh.config.InitrdAssetPath() + if err != nil { + return err + } + + if initrdPath != "" { + clh.vmconfig.Payload.SetInitramfs(initrdPath) } if clh.config.ConfidentialGuest { @@ -825,7 +881,17 @@ func clhDriveIndexToID(i int) string { // assumption convert a clh PciDeviceInfo into a PCI path func clhPciInfoToPath(pciInfo chclient.PciDeviceInfo) (types.PciPath, error) { tokens := strings.Split(pciInfo.Bdf, ":") - if len(tokens) != 3 || tokens[0] != "0000" || tokens[1] != "00" { + if len(tokens) != 3 || tokens[1] != "00" { + return types.PciPath{}, fmt.Errorf("Unexpected PCI address %q from clh hotplug", pciInfo.Bdf) + } + + // Support up to 10 PCI segments. + pciSegment, err := regexp.Compile(`^000[0-9]$`) + if err != nil { + return types.PciPath{}, fmt.Errorf("Internal error: cannot compile PCI segment regex") + } + + if !pciSegment.MatchString(tokens[0]) { return types.PciPath{}, fmt.Errorf("Unexpected PCI address %q from clh hotplug", pciInfo.Bdf) } @@ -834,7 +900,7 @@ func clhPciInfoToPath(pciInfo chclient.PciDeviceInfo) (types.PciPath, error) { return types.PciPath{}, fmt.Errorf("Unexpected PCI address %q from clh hotplug", pciInfo.Bdf) } - return types.PciPathFromString(tokens[0]) + return types.PciPathFromString(pciInfo.Bdf) } func (clh *cloudHypervisor) hotplugAddBlockDevice(drive *config.BlockDrive) error { @@ -878,6 +944,13 @@ func (clh *cloudHypervisor) hotplugAddBlockDevice(drive *config.BlockDrive) erro clhDisk.SetRateLimiterConfig(*diskRateLimiterConfig) } + // Hotplug block devices on PCI segments >= 1. PCI segment 0 is used + // for the network interface, any disks present at Guest boot time, etc. + // Just bus 0 of each segment is used, and up to 31 devices can be + // plugged in to each bus. + pciSegment := int32(drive.Index)/31 + 1 + clhDisk.SetPciSegment(pciSegment) + pciInfo, _, err := cl.VmAddDiskPut(ctx, clhDisk) if err != nil { @@ -886,6 +959,12 @@ func (clh *cloudHypervisor) hotplugAddBlockDevice(drive *config.BlockDrive) erro clh.devicesIds[driveID] = pciInfo.GetId() drive.PCIPath, err = clhPciInfoToPath(pciInfo) + clh.Logger(). + WithField("bdf", pciInfo.Bdf). + WithField("index", drive.Index). + WithField("pcipath", drive.PCIPath). + WithField("segment", pciSegment). + Debug("hotplugAddBlockDevice") return err } @@ -1394,7 +1473,6 @@ func (clh *cloudHypervisor) launchClh() error { clh.Logger().WithField("path", clhPath).Info() clh.Logger().WithField("args", strings.Join(args, " ")).Info() - cmdHypervisor := exec.Command(clhPath, args...) if clh.config.Debug { cmdHypervisor.Env = os.Environ() diff --git a/src/runtime/virtcontainers/clh_test.go b/src/runtime/virtcontainers/clh_test.go index 41bd71650ac2..718fc89439b0 100644 --- a/src/runtime/virtcontainers/clh_test.go +++ b/src/runtime/virtcontainers/clh_test.go @@ -492,7 +492,7 @@ func TestClhCreateVM(t *testing.T) { {config0, false, true}, {config1, false, true}, {config2, false, true}, - {config3, true, false}, + {config3, false, false}, {config4, false, true}, {config5, false, true}, } diff --git a/src/runtime/virtcontainers/container.go b/src/runtime/virtcontainers/container.go index 536fbcff1349..d30ee5694a56 100644 --- a/src/runtime/virtcontainers/container.go +++ b/src/runtime/virtcontainers/container.go @@ -657,6 +657,8 @@ func (c *Container) createBlockDevices(ctx context.Context) error { continue } c.mounts[i].FSGroupChangePolicy = volume.FSGroupChangePolicy(value) + case volume.SensitiveMountOptions: + c.mounts[i].Options = append(c.mounts[i].Options, value) default: c.Logger().Warnf("Ignoring unsupported direct-assignd volume metadata key: %s, value: %s", key, value) } diff --git a/src/runtime/virtcontainers/fs_share_linux.go b/src/runtime/virtcontainers/fs_share_linux.go index 0dc11cbed551..5b4df9a13355 100644 --- a/src/runtime/virtcontainers/fs_share_linux.go +++ b/src/runtime/virtcontainers/fs_share_linux.go @@ -555,16 +555,18 @@ func (f *FilesystemShare) ShareRootFilesystem(ctx context.Context, c *Container) rootfsGuestPath := filepath.Join(kataGuestSharedDir(), c.id, c.rootfsSuffix) if HasOptionPrefix(c.rootFs.Options, annotations.FileSystemLayer) { - path := filepath.Join("/run/kata-containers", c.id, "rootfs") + if err := os.MkdirAll(filepath.Join(getMountPath(f.sandbox.ID()), c.id, c.rootfsSuffix), DirMode); err != nil { + return nil, err + } return &SharedFile{ containerStorages: []*grpc.Storage{{ - MountPoint: path, + MountPoint: rootfsGuestPath, Source: "none", Fstype: c.rootFs.Type, Driver: kataOverlayDevType, Options: c.rootFs.Options, }}, - guestPath: path, + guestPath: rootfsGuestPath, }, nil } diff --git a/src/runtime/virtcontainers/hypervisor.go b/src/runtime/virtcontainers/hypervisor.go index b6b75d54998e..68db0f433cfe 100644 --- a/src/runtime/virtcontainers/hypervisor.go +++ b/src/runtime/virtcontainers/hypervisor.go @@ -62,7 +62,7 @@ const ( procCPUInfo = "/proc/cpuinfo" - defaultVCPUs = float32(1) + defaultVCPUs = float32(0) // 2 GiB defaultMemSzMiB = 2048 @@ -79,7 +79,7 @@ const ( vSockLogsPort = 1025 // MinHypervisorMemory is the minimum memory required for a VM. - MinHypervisorMemory = 256 + MinHypervisorMemory = 0 defaultMsize9p = 8192 @@ -331,6 +331,9 @@ type HypervisorConfig struct { // ImagePath and InitrdPath cannot be set at the same time. InitrdPath string + // IgvmPath is the guest IGVM host path. + IgvmPath string + // RootfsType is filesystem type of rootfs. RootfsType string @@ -685,8 +688,12 @@ type HypervisorConfig struct { // GPU specific annotations (currently only applicable for Remote Hypervisor) //DefaultGPUs specifies the number of GPUs required for the Kata VM DefaultGPUs uint32 + // DefaultGPUModel specifies GPU model like tesla, h100, readeon etc. DefaultGPUModel string + + // PolicyHash is the digest of the workload policy + PolicyHash string } // vcpu mapping from vcpu number to thread number @@ -805,6 +812,8 @@ func (conf *HypervisorConfig) assetPath(t types.AssetType) (string, error) { return conf.KernelPath, nil case types.ImageAsset: return conf.ImagePath, nil + case types.IgvmAsset: + return conf.IgvmPath, nil case types.InitrdAsset: return conf.InitrdPath, nil case types.HypervisorAsset: @@ -845,6 +854,16 @@ func (conf *HypervisorConfig) CustomImageAsset() bool { return conf.isCustomAsset(types.ImageAsset) } +// IgvmAssetPath returns the guest image path +func (conf *HypervisorConfig) IgvmAssetPath() (string, error) { + return conf.assetPath(types.IgvmAsset) +} + +// CustomIgvmAsset returns true if the image asset is a custom one, false otherwise. +func (conf *HypervisorConfig) CustomIgvmAsset() bool { + return conf.isCustomAsset(types.IgvmAsset) +} + // InitrdAssetPath returns the guest initrd path func (conf *HypervisorConfig) InitrdAssetPath() (string, error) { return conf.assetPath(types.InitrdAsset) diff --git a/src/runtime/virtcontainers/hypervisor_config_linux.go b/src/runtime/virtcontainers/hypervisor_config_linux.go index 1bcd47218c3c..219ac4be7237 100644 --- a/src/runtime/virtcontainers/hypervisor_config_linux.go +++ b/src/runtime/virtcontainers/hypervisor_config_linux.go @@ -17,8 +17,8 @@ func validateHypervisorConfig(conf *HypervisorConfig) error { return nil } - if conf.KernelPath == "" { - return fmt.Errorf("Missing kernel path") + if conf.KernelPath == "" && conf.IgvmPath == "" { + return fmt.Errorf("Missing kernel or igvm path") } if conf.ConfidentialGuest && conf.HypervisorMachineType == QemuCCWVirtio { @@ -26,10 +26,12 @@ func validateHypervisorConfig(conf *HypervisorConfig) error { fmt.Println("yes, failing") return fmt.Errorf("Neither the image or initrd path may be set for Secure Execution") } - } else if conf.ImagePath == "" && conf.InitrdPath == "" { - return fmt.Errorf("Missing image and initrd path") + } else if conf.ImagePath == "" && conf.InitrdPath == "" && conf.IgvmPath == "" { + return fmt.Errorf("Missing image, initrd, and igvm path") } else if conf.ImagePath != "" && conf.InitrdPath != "" { return fmt.Errorf("Image and initrd path cannot be both set") + } else if conf.IgvmPath != "" && conf.InitrdPath != "" { + return fmt.Errorf("Igvm and initrd path cannot be both set") } if err := conf.CheckTemplateConfig(); err != nil { diff --git a/src/runtime/virtcontainers/hypervisor_test.go b/src/runtime/virtcontainers/hypervisor_test.go index f51c323f0027..a0e075392889 100644 --- a/src/runtime/virtcontainers/hypervisor_test.go +++ b/src/runtime/virtcontainers/hypervisor_test.go @@ -480,6 +480,7 @@ func TestAssetPath(t *testing.T) { KernelPath: "/" + "io.katacontainers.config.hypervisor.kernel", + IgvmPath: "/" + "io.katacontainers.config.hypervisor.igvm", ImagePath: "/" + "io.katacontainers.config.hypervisor.image", InitrdPath: "/" + "io.katacontainers.config.hypervisor.initrd", diff --git a/src/runtime/virtcontainers/kata_agent.go b/src/runtime/virtcontainers/kata_agent.go index 25f08d63ad61..b8b9ee5d8c60 100644 --- a/src/runtime/virtcontainers/kata_agent.go +++ b/src/runtime/virtcontainers/kata_agent.go @@ -100,6 +100,7 @@ var ( typeVirtioFS = "virtiofs" typeOverlayFS = "overlay" kata9pDevType = "9p" + smbDevType = "smb" kataMmioBlkDevType = "mmioblk" kataBlkDevType = "blk" kataBlkCCWDevType = "blk-ccw" @@ -1426,6 +1427,12 @@ func (k *kataAgent) createContainer(ctx context.Context, sandbox *Sandbox, c *Co ctrStorages = append(ctrStorages, volumeStorages...) + smbStorages, err := k.handleSMBMounts(c, ociSpec) + if err != nil { + return nil, err + } + ctrStorages = append(ctrStorages, smbStorages...) + // Layer storage objects are prepended to the list so that they come _before_ the // rootfs because the rootfs depends on them (it's an overlay of the layers). ctrStorages = append(layerStorages, ctrStorages...) @@ -1835,6 +1842,60 @@ func (k *kataAgent) createBlkStorageObject(c *Container, m Mount) (*grpc.Storage return vol, err } +// handleSMBMounts will create a unique destination mountpoint in the guest for each volume in the +// given container and will update the OCI spec to utilize this mount point as the new source for the +// container volume. The container mount structure is updated to store the guest destination mountpoint. +func (k *kataAgent) handleSMBMounts(c *Container, spec *specs.Spec) ([]*grpc.Storage, error) { + var volumeStorages []*grpc.Storage + for i, m := range c.mounts { + // Handle only cifs type of mounts + if m.Type != "cifs" { + continue + } + // Create Storage + vol, err := k.createSMBVolumeObject(c, m) + if vol == nil || err != nil { + return nil, err + } + + // Each device will be mounted at a unique location within the VM only once. Mounting + // to the container specific location is handled within the OCI spec. Let's ensure that + // the storage mount point is unique for each device. This is then utilized as the source + filename := b64.URLEncoding.EncodeToString([]byte(vol.Source)) + path := filepath.Join(kataGuestSandboxStorageDir(), filename) + + // Update applicable OCI mount source + for idx, ociMount := range spec.Mounts { + if ociMount.Destination != vol.MountPoint { + continue + } + k.Logger().WithFields(logrus.Fields{ + "original-source": ociMount.Source, + "new-source": path, + }).Debug("Replacing OCI mount source") + spec.Mounts[idx].Source = path + break + } + + // Update storage mountpoint, and save guest device mount path to container mount struct: + vol.MountPoint = path + c.mounts[i].GuestDeviceMount = path + volumeStorages = append(volumeStorages, vol) + } + return volumeStorages, nil +} + +func (k *kataAgent) createSMBVolumeObject(c *Container, m Mount) (*grpc.Storage, error) { + vol := &grpc.Storage{} + vol.Source = m.Source + vol.MountPoint = m.Destination + vol.Fstype = m.Type + vol.Options = m.Options + // Todo: replace this with Confidential Data Hub driver + vol.Driver = smbDevType // This handler as of now calls a default storage handler in kata agent that does a baremount with these options + return vol, nil +} + // handleBlkOCIMounts will create a unique destination mountpoint in the guest for each volume in the // given container and will update the OCI spec to utilize this mount point as the new source for the // container volume. The container mount structure is updated to store the guest destination mountpoint. diff --git a/src/runtime/virtcontainers/pkg/annotations/annotations.go b/src/runtime/virtcontainers/pkg/annotations/annotations.go index e71b0525c11d..22eee2ae2f74 100644 --- a/src/runtime/virtcontainers/pkg/annotations/annotations.go +++ b/src/runtime/virtcontainers/pkg/annotations/annotations.go @@ -37,6 +37,9 @@ const ( // ImagePath is a sandbox annotation for passing a per container path pointing at the guest image that will run in the container VM. ImagePath = kataAnnotHypervisorPrefix + "image" + // IgvmPath is a sandbox annotation for passing a per container path pointing at the guest image and kernel that will run in the container VM. + IgvmPath = kataAnnotHypervisorPrefix + "igvm" + // InitrdPath is a sandbox annotation for passing a per container path pointing at the guest initrd image that will run in the container VM. InitrdPath = kataAnnotHypervisorPrefix + "initrd" @@ -59,6 +62,9 @@ const ( // ImageHash is an sandbox annotation for passing a container guest image SHA-512 hash value. ImageHash = kataAnnotHypervisorPrefix + "image_hash" + // IgvmHash is an sandbox annotation for passing a container guest image and kernel SHA-512 hash value. + IgvmHash = kataAnnotHypervisorPrefix + "igvm_hash" + // InitrdHash is an sandbox annotation for passing a container guest initrd SHA-512 hash value. InitrdHash = kataAnnotHypervisorPrefix + "initrd_hash" @@ -331,6 +337,9 @@ const ( // FileSystemLayer describes a layer of an overlay filesystem. FileSystemLayer = kataAnnotFsOptPrefix + "layer=" + // FileSystemLayerSourcePrefix determines the prefix path of the source files of the subquent layers. + FileSystemLayerSourcePrefix = kataAnnotFsOptPrefix + "layer-src-prefix=" + // IsFileSystemLayer indicates that the annotated filesystem is a layer of an overlay fs. IsFileSystemLayer = kataAnnotFsOptPrefix + "is-layer" diff --git a/src/runtime/virtcontainers/pkg/cloud-hypervisor/client/api/openapi.yaml b/src/runtime/virtcontainers/pkg/cloud-hypervisor/client/api/openapi.yaml index 41c1627db247..eb6567e00972 100644 --- a/src/runtime/virtcontainers/pkg/cloud-hypervisor/client/api/openapi.yaml +++ b/src/runtime/virtcontainers/pkg/cloud-hypervisor/client/api/openapi.yaml @@ -886,7 +886,9 @@ components: description: Payloads to boot in guest example: cmdline: cmdline + igvm: igvm kernel: kernel + host_data: host_data initramfs: initramfs firmware: firmware properties: @@ -898,6 +900,10 @@ components: type: string initramfs: type: string + igvm: + type: string + host_data: + type: string type: object VmConfig: description: Virtual machine configuration @@ -1436,6 +1442,7 @@ components: - oem_strings tdx: false serial_number: serial_number + sev_snp: false uuid: uuid properties: num_pci_segments: @@ -1457,6 +1464,9 @@ components: tdx: default: false type: boolean + sev_snp: + default: false + type: boolean type: object MemoryZoneConfig: example: diff --git a/src/runtime/virtcontainers/pkg/cloud-hypervisor/client/docs/PayloadConfig.md b/src/runtime/virtcontainers/pkg/cloud-hypervisor/client/docs/PayloadConfig.md index 096584a8fe43..85a6d3e045b9 100644 --- a/src/runtime/virtcontainers/pkg/cloud-hypervisor/client/docs/PayloadConfig.md +++ b/src/runtime/virtcontainers/pkg/cloud-hypervisor/client/docs/PayloadConfig.md @@ -8,6 +8,8 @@ Name | Type | Description | Notes **Kernel** | Pointer to **string** | | [optional] **Cmdline** | Pointer to **string** | | [optional] **Initramfs** | Pointer to **string** | | [optional] +**Igvm** | Pointer to **string** | | [optional] +**HostData** | Pointer to **string** | | [optional] ## Methods @@ -128,6 +130,56 @@ SetInitramfs sets Initramfs field to given value. HasInitramfs returns a boolean if a field has been set. +### GetIgvm + +`func (o *PayloadConfig) GetIgvm() string` + +GetIgvm returns the Igvm field if non-nil, zero value otherwise. + +### GetIgvmOk + +`func (o *PayloadConfig) GetIgvmOk() (*string, bool)` + +GetIgvmOk returns a tuple with the Igvm field if it's non-nil, zero value otherwise +and a boolean to check if the value has been set. + +### SetIgvm + +`func (o *PayloadConfig) SetIgvm(v string)` + +SetIgvm sets Igvm field to given value. + +### HasIgvm + +`func (o *PayloadConfig) HasIgvm() bool` + +HasIgvm returns a boolean if a field has been set. + +### GetHostData + +`func (o *PayloadConfig) GetHostData() string` + +GetHostData returns the HostData field if non-nil, zero value otherwise. + +### GetHostDataOk + +`func (o *PayloadConfig) GetHostDataOk() (*string, bool)` + +GetHostDataOk returns a tuple with the HostData field if it's non-nil, zero value otherwise +and a boolean to check if the value has been set. + +### SetHostData + +`func (o *PayloadConfig) SetHostData(v string)` + +SetHostData sets HostData field to given value. + +### HasHostData + +`func (o *PayloadConfig) HasHostData() bool` + +HasHostData returns a boolean if a field has been set. + [[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) diff --git a/src/runtime/virtcontainers/pkg/cloud-hypervisor/client/docs/PlatformConfig.md b/src/runtime/virtcontainers/pkg/cloud-hypervisor/client/docs/PlatformConfig.md index d8772c5e0a75..f89a295729dd 100644 --- a/src/runtime/virtcontainers/pkg/cloud-hypervisor/client/docs/PlatformConfig.md +++ b/src/runtime/virtcontainers/pkg/cloud-hypervisor/client/docs/PlatformConfig.md @@ -10,6 +10,7 @@ Name | Type | Description | Notes **Uuid** | Pointer to **string** | | [optional] **OemStrings** | Pointer to **[]string** | | [optional] **Tdx** | Pointer to **bool** | | [optional] [default to false] +**SevSnp** | Pointer to **bool** | | [optional] [default to false] ## Methods @@ -180,6 +181,31 @@ SetTdx sets Tdx field to given value. HasTdx returns a boolean if a field has been set. +### GetSevSnp + +`func (o *PlatformConfig) GetSevSnp() bool` + +GetSevSnp returns the SevSnp field if non-nil, zero value otherwise. + +### GetSevSnpOk + +`func (o *PlatformConfig) GetSevSnpOk() (*bool, bool)` + +GetSevSnpOk returns a tuple with the SevSnp field if it's non-nil, zero value otherwise +and a boolean to check if the value has been set. + +### SetSevSnp + +`func (o *PlatformConfig) SetSevSnp(v bool)` + +SetSevSnp sets SevSnp field to given value. + +### HasSevSnp + +`func (o *PlatformConfig) HasSevSnp() bool` + +HasSevSnp returns a boolean if a field has been set. + [[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) diff --git a/src/runtime/virtcontainers/pkg/cloud-hypervisor/client/model_payload_config.go b/src/runtime/virtcontainers/pkg/cloud-hypervisor/client/model_payload_config.go index 5029c92d9dde..3436a86e5fec 100644 --- a/src/runtime/virtcontainers/pkg/cloud-hypervisor/client/model_payload_config.go +++ b/src/runtime/virtcontainers/pkg/cloud-hypervisor/client/model_payload_config.go @@ -20,6 +20,8 @@ type PayloadConfig struct { Kernel *string `json:"kernel,omitempty"` Cmdline *string `json:"cmdline,omitempty"` Initramfs *string `json:"initramfs,omitempty"` + Igvm *string `json:"igvm,omitempty"` + HostData *string `json:"host_data,omitempty"` } // NewPayloadConfig instantiates a new PayloadConfig object @@ -167,6 +169,70 @@ func (o *PayloadConfig) SetInitramfs(v string) { o.Initramfs = &v } +// GetIgvm returns the Igvm field value if set, zero value otherwise. +func (o *PayloadConfig) GetIgvm() string { + if o == nil || o.Igvm == nil { + var ret string + return ret + } + return *o.Igvm +} + +// GetIgvmOk returns a tuple with the Igvm field value if set, nil otherwise +// and a boolean to check if the value has been set. +func (o *PayloadConfig) GetIgvmOk() (*string, bool) { + if o == nil || o.Igvm == nil { + return nil, false + } + return o.Igvm, true +} + +// HasIgvm returns a boolean if a field has been set. +func (o *PayloadConfig) HasIgvm() bool { + if o != nil && o.Igvm != nil { + return true + } + + return false +} + +// SetIgvm gets a reference to the given string and assigns it to the Igvm field. +func (o *PayloadConfig) SetIgvm(v string) { + o.Igvm = &v +} + +// GetHostData returns the HostData field value if set, zero value otherwise. +func (o *PayloadConfig) GetHostData() string { + if o == nil || o.HostData == nil { + var ret string + return ret + } + return *o.HostData +} + +// GetHostDataOk returns a tuple with the HostData field value if set, nil otherwise +// and a boolean to check if the value has been set. +func (o *PayloadConfig) GetHostDataOk() (*string, bool) { + if o == nil || o.HostData == nil { + return nil, false + } + return o.HostData, true +} + +// HasHostData returns a boolean if a field has been set. +func (o *PayloadConfig) HasHostData() bool { + if o != nil && o.HostData != nil { + return true + } + + return false +} + +// SetHostData gets a reference to the given string and assigns it to the HostData field. +func (o *PayloadConfig) SetHostData(v string) { + o.HostData = &v +} + func (o PayloadConfig) MarshalJSON() ([]byte, error) { toSerialize := map[string]interface{}{} if o.Firmware != nil { @@ -181,6 +247,12 @@ func (o PayloadConfig) MarshalJSON() ([]byte, error) { if o.Initramfs != nil { toSerialize["initramfs"] = o.Initramfs } + if o.Igvm != nil { + toSerialize["igvm"] = o.Igvm + } + if o.HostData != nil { + toSerialize["host_data"] = o.HostData + } return json.Marshal(toSerialize) } diff --git a/src/runtime/virtcontainers/pkg/cloud-hypervisor/client/model_platform_config.go b/src/runtime/virtcontainers/pkg/cloud-hypervisor/client/model_platform_config.go index 3072f0bd31d7..0dce5958f398 100644 --- a/src/runtime/virtcontainers/pkg/cloud-hypervisor/client/model_platform_config.go +++ b/src/runtime/virtcontainers/pkg/cloud-hypervisor/client/model_platform_config.go @@ -22,6 +22,7 @@ type PlatformConfig struct { Uuid *string `json:"uuid,omitempty"` OemStrings *[]string `json:"oem_strings,omitempty"` Tdx *bool `json:"tdx,omitempty"` + SevSnp *bool `json:"sev_snp,omitempty"` } // NewPlatformConfig instantiates a new PlatformConfig object @@ -32,6 +33,8 @@ func NewPlatformConfig() *PlatformConfig { this := PlatformConfig{} var tdx bool = false this.Tdx = &tdx + var sevSnp bool = false + this.SevSnp = &sevSnp return &this } @@ -42,6 +45,8 @@ func NewPlatformConfigWithDefaults() *PlatformConfig { this := PlatformConfig{} var tdx bool = false this.Tdx = &tdx + var sevSnp bool = false + this.SevSnp = &sevSnp return &this } @@ -237,6 +242,38 @@ func (o *PlatformConfig) SetTdx(v bool) { o.Tdx = &v } +// GetSevSnp returns the SevSnp field value if set, zero value otherwise. +func (o *PlatformConfig) GetSevSnp() bool { + if o == nil || o.SevSnp == nil { + var ret bool + return ret + } + return *o.SevSnp +} + +// GetSevSnpOk returns a tuple with the SevSnp field value if set, nil otherwise +// and a boolean to check if the value has been set. +func (o *PlatformConfig) GetSevSnpOk() (*bool, bool) { + if o == nil || o.SevSnp == nil { + return nil, false + } + return o.SevSnp, true +} + +// HasSevSnp returns a boolean if a field has been set. +func (o *PlatformConfig) HasSevSnp() bool { + if o != nil && o.SevSnp != nil { + return true + } + + return false +} + +// SetSevSnp gets a reference to the given bool and assigns it to the SevSnp field. +func (o *PlatformConfig) SetSevSnp(v bool) { + o.SevSnp = &v +} + func (o PlatformConfig) MarshalJSON() ([]byte, error) { toSerialize := map[string]interface{}{} if o.NumPciSegments != nil { @@ -257,6 +294,9 @@ func (o PlatformConfig) MarshalJSON() ([]byte, error) { if o.Tdx != nil { toSerialize["tdx"] = o.Tdx } + if o.SevSnp != nil { + toSerialize["sev_snp"] = o.SevSnp + } return json.Marshal(toSerialize) } diff --git a/src/runtime/virtcontainers/pkg/cloud-hypervisor/cloud-hypervisor.yaml b/src/runtime/virtcontainers/pkg/cloud-hypervisor/cloud-hypervisor.yaml index b7074fdb5a82..b9d9bd5fcf21 100644 --- a/src/runtime/virtcontainers/pkg/cloud-hypervisor/cloud-hypervisor.yaml +++ b/src/runtime/virtcontainers/pkg/cloud-hypervisor/cloud-hypervisor.yaml @@ -548,6 +548,10 @@ components: type: string initramfs: type: string + igvm: + type: string + host_data: + type: string description: Payloads to boot in guest VmConfig: @@ -729,6 +733,9 @@ components: tdx: type: boolean default: false + sev_snp: + type: boolean + default: false MemoryZoneConfig: required: diff --git a/src/runtime/virtcontainers/sandbox.go b/src/runtime/virtcontainers/sandbox.go index b8b2fb54043b..3db999f57435 100644 --- a/src/runtime/virtcontainers/sandbox.go +++ b/src/runtime/virtcontainers/sandbox.go @@ -10,6 +10,8 @@ import ( "bufio" "bytes" "context" + "crypto/sha256" + "encoding/hex" "fmt" "io" "math" @@ -161,6 +163,11 @@ type SandboxConfig struct { HypervisorConfig HypervisorConfig + StaticWorkloadDefaultMem uint32 + + StaticWorkloadDefaultVcpus float32 + + // Memory to allocate for workloads within the sandbox when workload memory is unspecified ShmSize uint64 SandboxResources SandboxResourceSizing @@ -665,6 +672,8 @@ func newSandbox(ctx context.Context, sandboxConfig SandboxConfig, factory Factor return nil, err } + sandboxConfig.HypervisorConfig.PolicyHash = getAgentPolicyHash(sandboxConfig.AgentConfig.Policy) + // store doesn't require hypervisor to be stored immediately if err = s.hypervisor.CreateVM(ctx, s.id, s.network, &sandboxConfig.HypervisorConfig); err != nil { return nil, err @@ -2907,3 +2916,12 @@ func (s *Sandbox) resetVCPUsPinning(ctx context.Context, vCPUThreadsMap VcpuThre } return nil } +func getAgentPolicyHash(policy string) string { + if len(policy) == 0 { + return "" + } else { + h := sha256.New() + h.Write([]byte(policy)) + return hex.EncodeToString(h.Sum(nil)) + } +} diff --git a/src/runtime/virtcontainers/types/asset.go b/src/runtime/virtcontainers/types/asset.go index 758dfdfbb29a..a080cdf1854b 100644 --- a/src/runtime/virtcontainers/types/asset.go +++ b/src/runtime/virtcontainers/types/asset.go @@ -25,6 +25,9 @@ const ( // ImageAsset is an image asset. ImageAsset AssetType = "image" + // IgvmAsset is an image asset. + IgvmAsset AssetType = "igvm" + // InitrdAsset is an initrd asset. InitrdAsset AssetType = "initrd" @@ -55,6 +58,7 @@ func AssetTypes() []AssetType { FirmwareVolumeAsset, HypervisorAsset, ImageAsset, + IgvmAsset, InitrdAsset, JailerAsset, KernelAsset, @@ -84,6 +88,8 @@ func (t AssetType) Annotations() (string, string, error) { return annotations.KernelPath, annotations.KernelHash, nil case ImageAsset: return annotations.ImagePath, annotations.ImageHash, nil + case IgvmAsset: + return annotations.IgvmPath, annotations.IgvmHash, nil case InitrdAsset: return annotations.InitrdPath, annotations.InitrdHash, nil case HypervisorAsset: diff --git a/src/runtime/virtcontainers/types/pcipath.go b/src/runtime/virtcontainers/types/pcipath.go index 5b7b3db91a72..a14917ca7ca6 100644 --- a/src/runtime/virtcontainers/types/pcipath.go +++ b/src/runtime/virtcontainers/types/pcipath.go @@ -16,6 +16,9 @@ const ( // number), giving slots 0..31 pciSlotBits = 5 maxPciSlot = (1 << pciSlotBits) - 1 + + pcidomainBits = 16 + maxPcidomain = (1 << pcidomainBits) - 1 ) // A PciSlot describes where a PCI device sits on a single bus @@ -25,27 +28,65 @@ const ( // // XXX In order to support multifunction device's we'll need to extend // this to include the PCI 3-bit function number as well. -type PciSlot struct{ slot uint8 } +type PciSlot struct { + domain uint16 + slot uint8 +} func PciSlotFromString(s string) (PciSlot, error) { - v, err := strconv.ParseUint(s, 16, pciSlotBits) + tokens := strings.Split(s, ":") + if len(tokens) == 3 { + return PciSlotFromBdfString(tokens) + } else { + device, err := PciSlotFromDeviceIndexString(s) + if err != nil { + return PciSlot{}, err + } + + return PciSlot{domain: 0, slot: uint8(device)}, nil + } +} + +func PciSlotFromDeviceIndexString(s string) (uint64, error) { + return strconv.ParseUint(s, 16, pciSlotBits) +} + +func PciSlotFromBdfString(bdfTokens []string) (PciSlot, error) { + if bdfTokens[1] != "00" { + return PciSlot{}, fmt.Errorf("Unexpected PCI bus index %q", bdfTokens[1]) + } + + domain, err := strconv.ParseUint(bdfTokens[0], 16, pcidomainBits) + if err != nil { + return PciSlot{}, err + } + + deviceTokens := strings.Split(bdfTokens[2], ".") + if len(deviceTokens) != 2 || deviceTokens[1] != "0" || len(deviceTokens[0]) != 2 { + return PciSlot{}, fmt.Errorf("Unexpected PCI BDF device format %q", bdfTokens[2]) + } + + device, err := PciSlotFromDeviceIndexString(deviceTokens[0]) if err != nil { return PciSlot{}, err } - // The 5 bit width passed to ParseUint ensures the value is <= - // maxPciSlot - return PciSlot{slot: uint8(v)}, nil + + return PciSlot{domain: uint16(domain), slot: uint8(device)}, nil } func PciSlotFromInt(v int) (PciSlot, error) { if v < 0 || v > maxPciSlot { return PciSlot{}, fmt.Errorf("PCI slot 0x%x should be in range [0..0x%x]", v, maxPciSlot) } - return PciSlot{slot: uint8(v)}, nil + return PciSlot{domain: 0, slot: uint8(v)}, nil } func (slot PciSlot) String() string { - return fmt.Sprintf("%02x", slot.slot) + if slot.domain == 0 { + return fmt.Sprintf("%02x", slot.slot) + } else { + return fmt.Sprintf("%04x:00:%02x.0", slot.domain, slot.slot) + } } // A PciPath describes where a PCI sits in a PCI hierarchy. diff --git a/src/tardev-snapshotter/Cargo.lock b/src/tardev-snapshotter/Cargo.lock new file mode 100644 index 000000000000..10ea85aa405f --- /dev/null +++ b/src/tardev-snapshotter/Cargo.lock @@ -0,0 +1,1589 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "adler" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" + +[[package]] +name = "aho-corasick" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67fc08ce920c31afb70f013dcce1bfc3a3195de6a228474e45e1f145b36f8d04" +dependencies = [ + "memchr", +] + +[[package]] +name = "anyhow" +version = "1.0.71" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c7d0618f0e0b7e8ff11427422b64564d5fb0be1940354bfe2e0529b18a9d9b8" + +[[package]] +name = "async-stream" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd56dd203fef61ac097dd65721a419ddccb106b2d2b70ba60a6b529f03961a51" +dependencies = [ + "async-stream-impl", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-stream-impl" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.15", +] + +[[package]] +name = "async-trait" +version = "0.1.68" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9ccdd8f2a161be9bd5c023df56f1b2a0bd1d83872ae53b71a84a12c9bf6e842" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.15", +] + +[[package]] +name = "autocfg" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" + +[[package]] +name = "axum" +version = "0.6.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8175979259124331c1d7bf6586ee7e0da434155e4b2d48ec2c8386281d8df39" +dependencies = [ + "async-trait", + "axum-core", + "bitflags", + "bytes", + "futures-util", + "http", + "http-body", + "hyper", + "itoa", + "matchit", + "memchr", + "mime", + "percent-encoding", + "pin-project-lite", + "rustversion", + "serde", + "sync_wrapper", + "tower", + "tower-layer", + "tower-service", +] + +[[package]] +name = "axum-core" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "759fa577a247914fd3f7f76d62972792636412fbfd634cd452f6a385a74d2d2c" +dependencies = [ + "async-trait", + "bytes", + "futures-util", + "http", + "http-body", + "mime", + "rustversion", + "tower-layer", + "tower-service", +] + +[[package]] +name = "base64" +version = "0.21.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "604178f6c5c21f02dc555784810edfb88d34ac2c73b2eae109655649ee73ce3d" + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "byteorder" +version = "1.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" + +[[package]] +name = "bytes" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4872d67bab6358e59559027aa3b9157c53d9358c51423c17554809a8858e0f8" + +[[package]] +name = "cc" +version = "1.0.79" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50d30906286121d95be3d479533b458f87493b30a4b5f79a607db8f5d11aa91f" + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "cmake" +version = "0.1.50" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a31c789563b815f77f4250caee12365734369f942439b7defd71e18a48197130" +dependencies = [ + "cc", +] + +[[package]] +name = "containerd-client" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcbd55a5b186b60273ed7361d18d566ede8d66db962bafd702dd4db7fd30f23f" +dependencies = [ + "prost", + "prost-types", + "tokio", + "tonic", + "tonic-build", + "tower", +] + +[[package]] +name = "containerd-snapshots" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d52d5b3981fc915b0ffb2a8a6dcf11ca2b75819c6a5b7532334e74c96f3bd8f" +dependencies = [ + "async-stream", + "futures", + "pin-utils", + "prost", + "prost-types", + "serde", + "thiserror", + "tokio", + "tokio-stream", + "tonic", + "tonic-build", +] + +[[package]] +name = "cpufeatures" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e4c1eaa2012c47becbbad2ab175484c2a84d1185b566fb2cc5b8707343dfe58" +dependencies = [ + "libc", +] + +[[package]] +name = "crc32fast" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "digest" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8168378f4e5023e7218c89c891c0fd8ecdb5e5e4f18cb78f38cf245dd021e76f" +dependencies = [ + "block-buffer", + "crypto-common", +] + +[[package]] +name = "either" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fcaabb2fef8c910e7f4c7ce9f67a1283a1715879a7c230ca9d6d1ae31f16d91" + +[[package]] +name = "env_logger" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85cdab6a89accf66733ad5a1693a4dcced6aeff64602b634530dd73c1f3ee9f0" +dependencies = [ + "humantime", + "is-terminal", + "log", + "regex", + "termcolor", +] + +[[package]] +name = "errno" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bcfec3a70f97c962c307b2d2c56e358cf1d00b558d74262b5f929ee8cc7e73a" +dependencies = [ + "errno-dragonfly", + "libc", + "windows-sys 0.48.0", +] + +[[package]] +name = "errno-dragonfly" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf" +dependencies = [ + "cc", + "libc", +] + +[[package]] +name = "fastrand" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be" +dependencies = [ + "instant", +] + +[[package]] +name = "filetime" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5cbc844cecaee9d4443931972e1289c8ff485cb4cc2767cb03ca139ed6885153" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall 0.2.16", + "windows-sys 0.48.0", +] + +[[package]] +name = "fixedbitset" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" + +[[package]] +name = "flate2" +version = "1.0.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b9429470923de8e8cbd4d2dc513535400b4b3fef0319fb5c4e1f520a7bef743" +dependencies = [ + "crc32fast", + "libz-ng-sys", + "miniz_oxide", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "futures" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23342abe12aba583913b2e62f22225ff9c950774065e4bfb61a19cd9770fec40" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "955518d47e09b25bbebc7a18df10b81f0c766eaf4c4f1cccef2fca5f2a4fb5f2" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bca583b7e26f571124fe5b7561d49cb2868d79116cfa0eefce955557c6fee8c" + +[[package]] +name = "futures-executor" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccecee823288125bd88b4d7f565c9e58e41858e47ab72e8ea2d64e93624386e0" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fff74096e71ed47f8e023204cfd0aa1289cd54ae5430a9523be060cdb849964" + +[[package]] +name = "futures-macro" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.15", +] + +[[package]] +name = "futures-sink" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f43be4fe21a13b9781a69afa4985b0f6ee0e1afab2c6f454a8cf30e2b2237b6e" + +[[package]] +name = "futures-task" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76d3d132be6c0e6aa1534069c705a74a5997a356c0dc2f86a47765e5617c5b65" + +[[package]] +name = "futures-util" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26b01e40b772d54cf6c6d721c1d1abd0647a0106a12ecaa1c186273392a69533" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "pin-utils", + "slab", +] + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "getrandom" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c85e1d9ab2eadba7e5040d4e09cbd6d072b76a557ad64e797c2cb9d4da21d7e4" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + +[[package]] +name = "h2" +version = "0.3.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17f8a914c2987b688368b5138aa05321db91f4090cf26118185672ad588bce21" +dependencies = [ + "bytes", + "fnv", + "futures-core", + "futures-sink", + "futures-util", + "http", + "indexmap", + "slab", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" + +[[package]] +name = "heck" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" + +[[package]] +name = "hermit-abi" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee512640fe35acbfb4bb779db6f0d80704c2cacfa2e39b601ef3e3f47d1ae4c7" +dependencies = [ + "libc", +] + +[[package]] +name = "hermit-abi" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fed44880c466736ef9a5c5b5facefb5ed0785676d0c02d612db14e54f0d84286" + +[[package]] +name = "http" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd6effc99afb63425aff9b05836f029929e345a6148a14b7ecd5ab67af944482" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "http-body" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1" +dependencies = [ + "bytes", + "http", + "pin-project-lite", +] + +[[package]] +name = "httparse" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" + +[[package]] +name = "httpdate" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421" + +[[package]] +name = "humantime" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" + +[[package]] +name = "hyper" +version = "0.14.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab302d72a6f11a3b910431ff93aae7e773078c769f0a3ef15fb9ec692ed147d4" +dependencies = [ + "bytes", + "futures-channel", + "futures-core", + "futures-util", + "h2", + "http", + "http-body", + "httparse", + "httpdate", + "itoa", + "pin-project-lite", + "socket2", + "tokio", + "tower-service", + "tracing", + "want", +] + +[[package]] +name = "hyper-timeout" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbb958482e8c7be4bc3cf272a766a2b0bf1a6755e7a6ae777f017a31d11b13b1" +dependencies = [ + "hyper", + "pin-project-lite", + "tokio", + "tokio-io-timeout", +] + +[[package]] +name = "indexmap" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +dependencies = [ + "autocfg", + "hashbrown", +] + +[[package]] +name = "instant" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "io-lifetimes" +version = "1.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c66c74d2ae7e79a5a8f7ac924adbe38ee42a859c6539ad869eb51f0b52dc220" +dependencies = [ + "hermit-abi 0.3.1", + "libc", + "windows-sys 0.48.0", +] + +[[package]] +name = "is-terminal" +version = "0.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adcf93614601c8129ddf72e2d5633df827ba6551541c6d8c59520a371475be1f" +dependencies = [ + "hermit-abi 0.3.1", + "io-lifetimes", + "rustix", + "windows-sys 0.48.0", +] + +[[package]] +name = "itertools" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "453ad9f582a441959e5f0d088b02ce04cfe8d51a8eaf077f12ac6d3e94164ca6" + +[[package]] +name = "lazy_static" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" + +[[package]] +name = "libc" +version = "0.2.144" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b00cc1c228a6782d0f076e7b232802e0c5689d41bb5df366f2a6b6621cfdfe1" + +[[package]] +name = "libz-ng-sys" +version = "1.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2468756f34903b582fe7154dc1ffdebd89d0562c4a43b53c621bb0f1b1043ccb" +dependencies = [ + "cmake", + "libc", +] + +[[package]] +name = "linux-raw-sys" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ece97ea872ece730aed82664c424eb4c8291e1ff2480247ccf7409044bc6479f" + +[[package]] +name = "lock_api" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "435011366fe56583b16cf956f9df0095b405b82d76425bc8981c0e22e60ec4df" +dependencies = [ + "autocfg", + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "matchit" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b87248edafb776e59e6ee64a79086f65890d3510f2c656c000bf2a7e8a0aea40" + +[[package]] +name = "memchr" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" + +[[package]] +name = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + +[[package]] +name = "miniz_oxide" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" +dependencies = [ + "adler", +] + +[[package]] +name = "mio" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b9d9a46eff5b4ff64b45a9e316a6d1e0bc719ef429cbec4dc630684212bfdf9" +dependencies = [ + "libc", + "log", + "wasi", + "windows-sys 0.45.0", +] + +[[package]] +name = "multimap" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5ce46fe64a9d73be07dcbe690a38ce1b293be448fd8ce1e6c1b8062c9f72c6a" + +[[package]] +name = "num_cpus" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fac9e2da13b5eb447a6ce3d392f23a29d8694bff781bf03a16cd9ac8697593b" +dependencies = [ + "hermit-abi 0.2.6", + "libc", +] + +[[package]] +name = "once_cell" +version = "1.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7e5500299e16ebb147ae15a00a942af264cf3688f47923b8fc2cd5858f23ad3" + +[[package]] +name = "parking_lot" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9069cbb9f99e3a5083476ccb29ceb1de18b9118cafa53e90c9551235de2b9521" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall 0.2.16", + "smallvec", + "windows-sys 0.45.0", +] + +[[package]] +name = "percent-encoding" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e" + +[[package]] +name = "petgraph" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4dd7d28ee937e54fe3080c91faa1c3a46c06de6252988a7f4592ba2310ef22a4" +dependencies = [ + "fixedbitset", + "indexmap", +] + +[[package]] +name = "pin-project" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad29a609b6bcd67fee905812e544992d216af9d755757c05ed2d0e15a74c6ecc" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "069bdb1e05adc7a8990dce9cc75370895fbe4e3d58b9b73bf1aee56359344a55" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "ppv-lite86" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" + +[[package]] +name = "prettyplease" +version = "0.1.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c8646e95016a7a6c4adea95bafa8a16baab64b583356217f2c85db4a39d9a86" +dependencies = [ + "proc-macro2", + "syn 1.0.109", +] + +[[package]] +name = "proc-macro2" +version = "1.0.56" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b63bdb0cd06f1f4dedf69b254734f9b45af66e4a031e42a7480257d9898b435" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "prost" +version = "0.11.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b82eaa1d779e9a4bc1c3217db8ffbeabaae1dca241bf70183242128d48681cd" +dependencies = [ + "bytes", + "prost-derive", +] + +[[package]] +name = "prost-build" +version = "0.11.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "119533552c9a7ffacc21e099c24a0ac8bb19c2a2a3f363de84cd9b844feab270" +dependencies = [ + "bytes", + "heck", + "itertools", + "lazy_static", + "log", + "multimap", + "petgraph", + "prettyplease", + "prost", + "prost-types", + "regex", + "syn 1.0.109", + "tempfile", + "which", +] + +[[package]] +name = "prost-derive" +version = "0.11.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5d2d8d10f3c6ded6da8b05b5fb3b8a5082514344d56c9f871412d29b4e075b4" +dependencies = [ + "anyhow", + "itertools", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "prost-types" +version = "0.11.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "213622a1460818959ac1181aaeb2dc9c7f63df720db7d788b3e24eacd1983e13" +dependencies = [ + "prost", +] + +[[package]] +name = "quote" +version = "1.0.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f4f29d145265ec1c483c7c654450edde0bfe043d3938d6972630663356d9500" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha", + "rand_core", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom", +] + +[[package]] +name = "redox_syscall" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" +dependencies = [ + "bitflags", +] + +[[package]] +name = "redox_syscall" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" +dependencies = [ + "bitflags", +] + +[[package]] +name = "regex" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af83e617f331cc6ae2da5443c602dfa5af81e517212d9d611a5b3ba1777b5370" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5996294f19bd3aae0453a862ad728f60e6600695733dd5df01da90c54363a3c" + +[[package]] +name = "rustix" +version = "0.37.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fea8ca367a3a01fe35e6943c400addf443c0f57670e6ec51196f71a4b8762dd2" +dependencies = [ + "bitflags", + "errno", + "io-lifetimes", + "libc", + "linux-raw-sys", + "windows-sys 0.48.0", +] + +[[package]] +name = "rustversion" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f3208ce4d8448b3f3e7d168a73f5e0c43a61e32930de3bceeccedb388b6bf06" + +[[package]] +name = "ryu" +version = "1.0.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f91339c0467de62360649f8d3e185ca8de4224ff281f66000de5eb2a77a79041" + +[[package]] +name = "scopeguard" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" + +[[package]] +name = "serde" +version = "1.0.162" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71b2f6e1ab5c2b98c05f0f35b236b22e8df7ead6ffbf51d7808da7f8817e7ab6" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.162" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2a0814352fd64b58489904a44ea8d90cb1a91dcb6b4f5ebabc32c8318e93cb6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.15", +] + +[[package]] +name = "serde_json" +version = "1.0.96" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "057d394a50403bcac12672b2b18fb387ab6d289d957dab67dd201875391e52f1" +dependencies = [ + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "sha2" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82e6b795fe2e3b1e845bafcb27aa35405c4d47cdfc92af5fc8d3002f76cebdc0" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "signal-hook-registry" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8229b473baa5980ac72ef434c4415e70c4b5e71b423043adb4ba059f89c99a1" +dependencies = [ + "libc", +] + +[[package]] +name = "slab" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6528351c9bc8ab22353f9d776db39a20288e8d6c37ef8cfe3317cf875eecfc2d" +dependencies = [ + "autocfg", +] + +[[package]] +name = "smallvec" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a507befe795404456341dfab10cef66ead4c041f62b8b11bbb92bffe5d0953e0" + +[[package]] +name = "socket2" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64a4a911eed85daf18834cfaa86a79b7d266ff93ff5ba14005426219480ed662" +dependencies = [ + "libc", + "winapi", +] + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a34fcf3e8b60f57e6a14301a2e916d323af98b0ea63c599441eec8558660c822" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "sync_wrapper" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" + +[[package]] +name = "tar" +version = "0.4.38" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b55807c0344e1e6c04d7c965f5289c39a8d94ae23ed5c0b57aabac549f871c6" +dependencies = [ + "filetime", + "libc", + "xattr", +] + +[[package]] +name = "tardev-snapshotter" +version = "0.1.0" +dependencies = [ + "async-stream", + "base64", + "containerd-client", + "containerd-snapshots", + "env_logger", + "flate2", + "futures", + "log", + "serde_json", + "sha2", + "tarindex", + "tempfile", + "tokio", + "tokio-stream", + "tonic", + "verity", +] + +[[package]] +name = "tarfs-defs" +version = "0.1.0" +dependencies = [ + "zerocopy", +] + +[[package]] +name = "tarindex" +version = "0.1.0" +dependencies = [ + "tar", + "tarfs-defs", + "zerocopy", +] + +[[package]] +name = "tempfile" +version = "3.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9fbec84f381d5795b08656e4912bec604d162bff9291d6189a78f4c8ab87998" +dependencies = [ + "cfg-if", + "fastrand", + "redox_syscall 0.3.5", + "rustix", + "windows-sys 0.45.0", +] + +[[package]] +name = "termcolor" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be55cf8942feac5c765c2c993422806843c9a9a45d4d5c407ad6dd2ea95eb9b6" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "thiserror" +version = "1.0.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "978c9a314bd8dc99be594bc3c175faaa9794be04a5a5e153caba6915336cebac" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9456a42c5b0d803c8cd86e73dd7cc9edd429499f37a3550d286d5e86720569f" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.15", +] + +[[package]] +name = "tokio" +version = "1.28.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0aa32867d44e6f2ce3385e89dceb990188b8bb0fb25b0cf576647a6f98ac5105" +dependencies = [ + "autocfg", + "bytes", + "libc", + "mio", + "num_cpus", + "parking_lot", + "pin-project-lite", + "signal-hook-registry", + "socket2", + "tokio-macros", + "windows-sys 0.48.0", +] + +[[package]] +name = "tokio-io-timeout" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30b74022ada614a1b4834de765f9bb43877f910cc8ce4be40e89042c9223a8bf" +dependencies = [ + "pin-project-lite", + "tokio", +] + +[[package]] +name = "tokio-macros" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.15", +] + +[[package]] +name = "tokio-stream" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "397c988d37662c7dda6d2208364a706264bf3d6138b11d436cbac0ad38832842" +dependencies = [ + "futures-core", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "tokio-util" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "806fe8c2c87eccc8b3267cbae29ed3ab2d0bd37fca70ab622e46aaa9375ddb7d" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio", + "tracing", +] + +[[package]] +name = "tonic" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3082666a3a6433f7f511c7192923fa1fe07c69332d3c6a2e6bb040b569199d5a" +dependencies = [ + "async-trait", + "axum", + "base64", + "bytes", + "futures-core", + "futures-util", + "h2", + "http", + "http-body", + "hyper", + "hyper-timeout", + "percent-encoding", + "pin-project", + "prost", + "tokio", + "tokio-stream", + "tower", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "tonic-build" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6fdaae4c2c638bb70fe42803a26fbd6fc6ac8c72f5c59f67ecc2a2dcabf4b07" +dependencies = [ + "prettyplease", + "proc-macro2", + "prost-build", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "tower" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" +dependencies = [ + "futures-core", + "futures-util", + "indexmap", + "pin-project", + "pin-project-lite", + "rand", + "slab", + "tokio", + "tokio-util", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "tower-layer" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0" + +[[package]] +name = "tower-service" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" + +[[package]] +name = "tracing" +version = "0.1.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8" +dependencies = [ + "cfg-if", + "log", + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f57e3ca2a01450b1a921183a9c9cbfda207fd822cef4ccb00a65402cbba7a74" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.15", +] + +[[package]] +name = "tracing-core" +version = "0.1.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24eb03ba0eab1fd845050058ce5e616558e8f8d8fca633e6b163fe25c797213a" +dependencies = [ + "once_cell", +] + +[[package]] +name = "try-lock" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3528ecfd12c466c6f163363caf2d02a71161dd5e1cc6ae7b34207ea2d42d81ed" + +[[package]] +name = "typenum" +version = "1.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba" + +[[package]] +name = "unicode-ident" +version = "1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5464a87b239f13a63a501f2701565754bae92d243d4bb7eb12f6d57d2269bf4" + +[[package]] +name = "verity" +version = "0.1.0" +dependencies = [ + "generic-array", + "sha2", + "zerocopy", +] + +[[package]] +name = "version_check" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" + +[[package]] +name = "want" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ce8a968cb1cd110d136ff8b819a556d6fb6d919363c61534f6860c7eb172ba0" +dependencies = [ + "log", + "try-lock", +] + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "which" +version = "4.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2441c784c52b289a054b7201fc93253e288f094e2f4be9058343127c4226a269" +dependencies = [ + "either", + "libc", + "once_cell", +] + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-util" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" +dependencies = [ + "winapi", +] + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows-sys" +version = "0.45.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" +dependencies = [ + "windows-targets 0.42.2", +] + +[[package]] +name = "windows-sys" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets 0.48.0", +] + +[[package]] +name = "windows-targets" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" +dependencies = [ + "windows_aarch64_gnullvm 0.42.2", + "windows_aarch64_msvc 0.42.2", + "windows_i686_gnu 0.42.2", + "windows_i686_msvc 0.42.2", + "windows_x86_64_gnu 0.42.2", + "windows_x86_64_gnullvm 0.42.2", + "windows_x86_64_msvc 0.42.2", +] + +[[package]] +name = "windows-targets" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b1eb6f0cd7c80c79759c929114ef071b87354ce476d9d94271031c0497adfd5" +dependencies = [ + "windows_aarch64_gnullvm 0.48.0", + "windows_aarch64_msvc 0.48.0", + "windows_i686_gnu 0.48.0", + "windows_i686_msvc 0.48.0", + "windows_x86_64_gnu 0.48.0", + "windows_x86_64_gnullvm 0.48.0", + "windows_x86_64_msvc 0.48.0", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3" + +[[package]] +name = "windows_i686_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" + +[[package]] +name = "windows_i686_gnu" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241" + +[[package]] +name = "windows_i686_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" + +[[package]] +name = "windows_i686_msvc" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" + +[[package]] +name = "xattr" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d1526bbe5aaeb5eb06885f4d987bcdfa5e23187055de9b83fe00156a821fabc" +dependencies = [ + "libc", +] + +[[package]] +name = "zerocopy" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "332f188cc1bcf1fe1064b8c58d150f497e697f49774aa846f2dc949d9a25f236" +dependencies = [ + "byteorder", + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6505e6815af7de1746a08f69c69606bb45695a17149517680f3b2149713b19a3" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] diff --git a/src/tardev-snapshotter/Cargo.toml b/src/tardev-snapshotter/Cargo.toml new file mode 100644 index 000000000000..3319e41ceb9a --- /dev/null +++ b/src/tardev-snapshotter/Cargo.toml @@ -0,0 +1,22 @@ +[package] +name = "tardev-snapshotter" +version = "0.1.0" +edition = "2021" + +[dependencies] +async-stream = "0.3.2" +futures = "0.3.17" +serde_json = "1.0" +tonic = "0.9.2" +tokio = {version = "1.26", features = ["full"]} +tokio-stream = "0.1.8" +containerd-snapshots = "0.3.0" +sha2 = "0.10.6" +tarindex = { path = "./tarindex" } +verity = { path = "./verity" } +log = "0.4.17" +env_logger = "0.10.0" +tempfile = "3.3.0" +flate2 = { version = "1.0.26", features = ["zlib-ng"], default-features = false } +base64 = "0.21.2" +containerd-client = "0.4.0" diff --git a/src/tardev-snapshotter/Makefile b/src/tardev-snapshotter/Makefile new file mode 100644 index 000000000000..430b77aa7b7f --- /dev/null +++ b/src/tardev-snapshotter/Makefile @@ -0,0 +1,8 @@ +all: + RUSTC_BOOTSTRAP=1 cargo build --release + +static-checks-build: + exit 0 + +clean: + cargo clean diff --git a/src/tardev-snapshotter/src/main.rs b/src/tardev-snapshotter/src/main.rs new file mode 100644 index 000000000000..8480fdd78b3c --- /dev/null +++ b/src/tardev-snapshotter/src/main.rs @@ -0,0 +1,83 @@ +#![feature(impl_trait_in_assoc_type)] +#![feature(type_alias_impl_trait)] + +use containerd_snapshots::server; +use log::{error, info, warn}; +use snapshotter::TarDevSnapshotter; +use std::{env, io, path::Path, process, sync::Arc}; +use tokio::net::UnixListener; +use tonic::transport::Server; + +mod snapshotter; + +#[tokio::main] +pub async fn main() { + env_logger::init(); + + let argv: Vec = env::args().collect(); + if argv.len() != 3 && argv.len() != 4 { + error!( + "Usage: {} [containerd-socket]", + argv[0] + ); + process::exit(1); + } + + let containerd_socket = if argv.len() >= 4 { + &argv[3] + } else { + "/var/run/containerd/containerd.sock" + }; + + // TODO: Check that the directory is accessible. + + let incoming = { + let uds = match bind(&argv[2]) { + Ok(l) => l, + Err(e) => { + error!("UnixListener::bind failed: {e:?}"); + process::exit(1); + } + }; + + async_stream::stream! { + loop { + let item = uds.accept().await.map(|p| p.0); + yield item; + } + } + }; + + info!("Snapshotter started"); + if let Err(e) = Server::builder() + .add_service(server(Arc::new(TarDevSnapshotter::new( + Path::new(&argv[1]), + containerd_socket.to_string(), + )))) + .serve_with_incoming(incoming) + .await + { + error!("serve_with_incoming failed: {:?}", e); + process::exit(1); + } +} + +fn bind(addr: &str) -> io::Result { + // Try to bind. Return on success or failure other than "address in use". + match UnixListener::bind(addr) { + Ok(l) => return Ok(l), + Err(e) => { + if e.kind() != io::ErrorKind::AddrInUse { + return Err(e); + } + } + } + + // Try to remove the existing socket and bind again. + warn!( + "Listen address ({}) already exists, trying to remove it", + addr + ); + let _ = std::fs::remove_file(addr); + UnixListener::bind(addr) +} diff --git a/src/tardev-snapshotter/src/snapshotter.rs b/src/tardev-snapshotter/src/snapshotter.rs new file mode 100644 index 000000000000..40f0feb9b049 --- /dev/null +++ b/src/tardev-snapshotter/src/snapshotter.rs @@ -0,0 +1,498 @@ +use base64::prelude::{Engine, BASE64_STANDARD}; +use containerd_client::{services::v1::ReadContentRequest, tonic::Request, with_namespace, Client}; +use containerd_snapshots::{api, Info, Kind, Snapshotter, Usage}; +use log::{debug, info, trace}; +use sha2::{Digest, Sha256}; +use std::path::{Path, PathBuf}; +use std::{collections::HashMap, fs, fs::OpenOptions, io, io::Seek, os::unix::ffi::OsStrExt}; +use tokio::io::{AsyncSeekExt, AsyncWriteExt}; +use tokio::sync::RwLock; +use tonic::Status; + +const ROOT_HASH_LABEL: &str = "io.katacontainers.dm-verity.root-hash"; +const TARGET_LAYER_DIGEST_LABEL: &str = "containerd.io/snapshot/cri.layer-digest"; + +struct Store { + root: PathBuf, +} + +impl Store { + fn new(root: &Path) -> Self { + Self { root: root.into() } + } + + /// Creates the name of the directory that containerd can use to extract a layer into. + fn extract_dir(&self, name: &str) -> PathBuf { + self.root.join("staging").join(name_to_hash(name)) + } + + /// Creates a directory that containerd can use to extract a layer into. + /// + /// It's a temporary directory that will be thrown away by the snapshotter. + fn extract_dir_to_write(&self, name: &str) -> io::Result { + let path = self.extract_dir(name); + fs::create_dir_all(&path)?; + Ok(path) + } + + /// Creates a temporary staging directory for layers. + fn staging_dir(&self) -> io::Result { + let path = self.root.join("staging"); + fs::create_dir_all(&path)?; + tempfile::tempdir_in(path) + } + + /// Creates the snapshot file path from its name. + /// + /// If `write` is `true`, it also ensures that the directory exists. + fn snapshot_path(&self, name: &str, write: bool) -> Result { + let path = self.root.join("snapshots").join(name_to_hash(name)); + if write { + if let Some(parent) = path.parent() { + fs::create_dir_all(parent)?; + } + } + + Ok(path) + } + + /// Creates the layer file path from its name. + fn layer_path(&self, name: &str) -> PathBuf { + self.root.join("layers").join(name_to_hash(name)) + } + + /// Creates the layer file path from its name and ensures that the directory exists. + fn layer_path_to_write(&self, name: &str) -> Result { + let path = self.layer_path(name); + if let Some(parent) = path.parent() { + fs::create_dir_all(parent)?; + } + Ok(path) + } + + /// Reads the information from storage for the given snapshot name. + fn read_snapshot(&self, name: &str) -> Result { + let path = self.snapshot_path(name, false)?; + let file = fs::File::open(path)?; + serde_json::from_reader(file).map_err(|_| Status::unknown("unable to read snapshot")) + } + + /// Writes to storage the given snapshot information. + /// + /// It fails if a snapshot with the given name already exists. + fn write_snapshot( + &mut self, + kind: Kind, + key: String, + parent: String, + labels: HashMap, + ) -> Result<(), Status> { + let info = Info { + kind, + name: key, + parent, + labels, + ..Info::default() + }; + let name = self.snapshot_path(&info.name, true)?; + // TODO: How to specify the file mode (e.g., 0600)? + let file = OpenOptions::new().write(true).create_new(true).open(name)?; + serde_json::to_writer_pretty(file, &info) + .map_err(|_| Status::internal("unable to write snapshot")) + } + + /// Creates a new snapshot for use. + /// + /// It checks that the parent chain exists and that all ancestors are committed and consist of + /// layers before writing the new snapshot. + fn prepare_snapshot_for_use( + &mut self, + kind: Kind, + key: String, + parent: String, + labels: HashMap, + ) -> Result, Status> { + let mounts = self.mounts_from_snapshot(&parent)?; + self.write_snapshot(kind, key, parent, labels)?; + Ok(mounts) + } + + fn mounts_from_snapshot(&self, parent: &str) -> Result, Status> { + const PREFIX: &str = "io.katacontainers.fs-opt"; + + // Get chain of layers. + let mut next_parent = Some(parent.to_string()); + let mut layers = Vec::new(); + let mut opts = vec![format!( + "{PREFIX}.layer-src-prefix={}", + self.root.join("layers").to_string_lossy() + )]; + while let Some(p) = next_parent { + let info = self.read_snapshot(&p)?; + if info.kind != Kind::Committed { + return Err(Status::failed_precondition( + "parent snapshot is not committed", + )); + } + + let root_hash = if let Some(rh) = info.labels.get(ROOT_HASH_LABEL) { + rh + } else { + return Err(Status::failed_precondition( + "parent snapshot has no root hash stored", + )); + }; + + let name = name_to_hash(&p); + let layer_info = format!( + "{name},tar,ro,{PREFIX}.block_device=file,{PREFIX}.is-layer,{PREFIX}.root-hash={root_hash}"); + layers.push(name); + + opts.push(format!( + "{PREFIX}.layer={}", + BASE64_STANDARD.encode(layer_info.as_bytes()) + )); + + next_parent = (!info.parent.is_empty()).then_some(info.parent); + } + + opts.push(format!("{PREFIX}.overlay-rw")); + opts.push(format!("lowerdir={}", layers.join(":"))); + + Ok(vec![api::types::Mount { + r#type: "fuse3.kata-overlay".into(), + source: "/".into(), + target: String::new(), + options: opts, + }]) + } +} + +/// The snapshotter that creates tar devices. +pub(crate) struct TarDevSnapshotter { + store: RwLock, + containerd_path: String, + containerd_client: RwLock>, +} + +impl TarDevSnapshotter { + /// Creates a new instance of the snapshotter. + /// + /// `root` is the root directory where the snapshotter state is to be stored. + pub(crate) fn new(root: &Path, containerd_path: String) -> Self { + Self { + containerd_path, + store: RwLock::new(Store::new(root)), + containerd_client: RwLock::new(None), + } + } + + async fn prepare_unpack_dir( + &self, + key: String, + parent: String, + labels: HashMap, + ) -> Result, Status> { + let extract_dir; + { + let mut store = self.store.write().await; + extract_dir = store.extract_dir_to_write(&key)?; + store.write_snapshot(Kind::Active, key, parent, labels)?; + } + Ok(vec![api::types::Mount { + r#type: "bind".into(), + source: extract_dir.to_string_lossy().into(), + target: String::new(), + options: vec!["bind".into()], + }]) + } + + async fn get_layer_image(&self, fname: &PathBuf, digest: &str) -> Result<(), Status> { + let mut file = tokio::fs::File::create(fname).await?; + let req = ReadContentRequest { + digest: digest.to_string(), + offset: 0, + size: 0, + }; + let req = with_namespace!(req, "k8s.io"); + + loop { + let guard = self.containerd_client.read().await; + let Some(client) = &*guard else { + drop(guard); + info!("Connecting to containerd at {}", self.containerd_path); + let c = Client::from_path(&self.containerd_path) + .await + .map_err(|_| Status::unknown("unable to connect to containerd"))?; + *self.containerd_client.write().await = Some(c); + continue; + }; + let mut c = client.content(); + let resp = c.read(req).await?; + let mut stream = resp.into_inner(); + while let Some(chunk) = stream.message().await? { + if chunk.offset < 0 { + debug!("Containerd reported a negative offset: {}", chunk.offset); + return Err(Status::invalid_argument("negative offset")); + } + file.seek(io::SeekFrom::Start(chunk.offset as u64)).await?; + file.write_all(&chunk.data).await?; + } + + return Ok(()); + } + } + + /// Creates a new snapshot for an image layer. + /// + /// It downloads, decompresses, and creates the index for the layer before writing the new + /// snapshot. + async fn prepare_image_layer( + &self, + key: String, + parent: String, + mut labels: HashMap, + ) -> Result<(), Status> { + let dir = self.store.read().await.staging_dir()?; + + { + let Some(digest_str) = labels.get(TARGET_LAYER_DIGEST_LABEL) else { + return Err(Status::invalid_argument( + "missing target layer digest label", + )); + }; + + let name = dir.path().join(name_to_hash(&key)); + let mut gzname = name.clone(); + gzname.set_extension("gz"); + trace!("Fetching layer image to {:?}", &gzname); + self.get_layer_image(&gzname, digest_str).await?; + + // TODO: Decompress in stream instead of reopening. + // Decompress data. + trace!("Decompressing {:?} to {:?}", &gzname, &name); + let root_hash = tokio::task::spawn_blocking(move || -> io::Result<_> { + let compressed = fs::File::open(&gzname)?; + let mut file = OpenOptions::new() + .read(true) + .write(true) + .create(true) + .truncate(true) + .open(&name)?; + let mut gz_decoder = flate2::read::GzDecoder::new(compressed); + std::io::copy(&mut gz_decoder, &mut file)?; + + trace!("Appending index to {:?}", &name); + file.rewind()?; + tarindex::append_index(&mut file)?; + + trace!("Appending dm-verity tree to {:?}", &name); + let root_hash = verity::append_tree::(&mut file)?; + + trace!("Root hash for {:?} is {:x}", &name, root_hash); + Ok(root_hash) + }) + .await + .map_err(|_| Status::unknown("error in worker task"))??; + + // Store a label with the root hash so that we can recall it later when mounting. + labels.insert(ROOT_HASH_LABEL.into(), format!("{:x}", root_hash)); + } + + // Move file to its final location and write the snapshot. + { + let from = dir.path().join(name_to_hash(&key)); + let mut store = self.store.write().await; + let to = store.layer_path_to_write(&key)?; + trace!("Renaming from {:?} to {:?}", &from, &to); + tokio::fs::rename(from, to).await?; + store.write_snapshot(Kind::Committed, key, parent, labels)?; + } + + trace!("Layer prepared"); + Ok(()) + } +} + +#[tonic::async_trait] +impl Snapshotter for TarDevSnapshotter { + type Error = Status; + + async fn stat(&self, key: String) -> Result { + trace!("stat({})", key); + self.store.read().await.read_snapshot(&key) + } + + async fn update( + &self, + info: Info, + fieldpaths: Option>, + ) -> Result { + trace!("update({:?}, {:?})", info, fieldpaths); + Err(Status::unimplemented("no support for updating snapshots")) + } + + async fn usage(&self, key: String) -> Result { + trace!("usage({})", key); + let store = self.store.read().await; + + let info = store.read_snapshot(&key)?; + if info.kind != Kind::Committed { + // Only committed snapshots consume storage. + return Ok(Usage { inodes: 0, size: 0 }); + } + + let mut file = tokio::fs::File::open(store.layer_path(&key)).await?; + let len = file.seek(io::SeekFrom::End(0)).await?; + Ok(Usage { + // TODO: Read the index "header" to determine the inode count. + inodes: 1, + size: len as _, + }) + } + + async fn mounts(&self, key: String) -> Result, Self::Error> { + trace!("mounts({})", key); + let store = self.store.read().await; + let info = store.read_snapshot(&key)?; + + if info.kind != Kind::View && info.kind != Kind::Active { + return Err(Status::failed_precondition( + "snapshot is not active nor a view", + )); + } + + if info.labels.get(TARGET_LAYER_DIGEST_LABEL).is_some() { + let extract_dir = store.extract_dir(&key); + Ok(vec![api::types::Mount { + r#type: "bind".into(), + source: extract_dir.to_string_lossy().into(), + target: String::new(), + options: Vec::new(), + }]) + } else { + store.mounts_from_snapshot(&info.parent) + } + } + + async fn prepare( + &self, + key: String, + parent: String, + labels: HashMap, + ) -> Result, Status> { + trace!("prepare({}, {}, {:?})", key, parent, labels); + + // There are two reasons for preparing a snapshot: to build an image and to actually use it + // as a container image. We determine the reason by the presence of the snapshot-ref label. + if labels.get(TARGET_LAYER_DIGEST_LABEL).is_some() { + self.prepare_unpack_dir(key, parent, labels).await + } else { + self.store + .write() + .await + .prepare_snapshot_for_use(Kind::Active, key, parent, labels) + } + } + + async fn view( + &self, + key: String, + parent: String, + labels: HashMap, + ) -> Result, Self::Error> { + trace!("view({}, {}, {:?})", key, parent, labels); + self.store + .write() + .await + .prepare_snapshot_for_use(Kind::View, key, parent, labels) + } + + async fn commit( + &self, + name: String, + key: String, + labels: HashMap, + ) -> Result<(), Self::Error> { + trace!("commit({}, {}, {:?})", name, key, labels); + + let info; + { + let store = self.store.write().await; + info = store.read_snapshot(&key)?; + if info.kind != Kind::Active { + return Err(Status::failed_precondition("snapshot is not active")); + } + } + + if info.labels.get(TARGET_LAYER_DIGEST_LABEL).is_some() { + self.prepare_image_layer(name, info.parent, labels).await + } else { + Err(Status::unimplemented( + "no support for commiting arbitrary snapshots", + )) + } + } + + async fn remove(&self, key: String) -> Result<(), Self::Error> { + trace!("remove({})", key); + let store = self.store.write().await; + + // TODO: Move this to store. + if let Ok(info) = store.read_snapshot(&key) { + match info.kind { + Kind::Committed => { + if info.labels.get(TARGET_LAYER_DIGEST_LABEL).is_some() { + // Try to delete a layer. It's ok if it's not found. + if let Err(e) = fs::remove_file(store.layer_path(&key)) { + if e.kind() != io::ErrorKind::NotFound { + return Err(e.into()); + } + } + } + } + Kind::Active => { + if let Err(e) = tokio::fs::remove_dir_all(store.extract_dir(&key)).await { + if e.kind() != io::ErrorKind::NotFound { + return Err(e.into()); + } + } + } + _ => {} + } + } + + let name = store.snapshot_path(&key, false)?; + fs::remove_file(name)?; + + Ok(()) + } + + type InfoStream = impl tokio_stream::Stream> + Send + 'static; + async fn list(&self, _: String, _: Vec) -> Result { + trace!("walk()"); + let store = self.store.read().await; + let snapshots_dir = store.root.join("snapshots"); + Ok(async_stream::try_stream! { + let mut files = tokio::fs::read_dir(snapshots_dir).await?; + while let Some(p) = files.next_entry().await? { + if let Ok(f) = fs::File::open(p.path()) { + if let Ok(i) = serde_json::from_reader(f) { + yield i; + } + } + } + }) + } +} + +/// Converts the given name to a string representation of its sha256 hash. +fn name_to_hash(name: &str) -> String { + let path = Path::new(name); + let mut hasher = Sha256::new(); + match path.file_name() { + Some(n) => hasher.update(n.as_bytes()), + None => hasher.update(name), + } + format!("{:x}", hasher.finalize()) +} diff --git a/src/tardev-snapshotter/tardev-snapshotter.service b/src/tardev-snapshotter/tardev-snapshotter.service new file mode 100644 index 000000000000..15b1b2521167 --- /dev/null +++ b/src/tardev-snapshotter/tardev-snapshotter.service @@ -0,0 +1,11 @@ +[Unit] +Description=tardev containerd snapshotter daemon +After=network.target + +[Service] +ExecStart=/usr/bin/tardev-snapshotter /var/lib/containerd/io.containerd.snapshotter.v1.tardev /run/containerd/tardev-snapshotter.sock +Environment="RUST_LOG=tardev_snapshotter=trace" +Restart=on-failure + +[Install] +WantedBy=kubelet.service diff --git a/src/tardev-snapshotter/tarfs-defs/Cargo.toml b/src/tardev-snapshotter/tarfs-defs/Cargo.toml new file mode 100644 index 000000000000..4b925dc033ce --- /dev/null +++ b/src/tardev-snapshotter/tarfs-defs/Cargo.toml @@ -0,0 +1,7 @@ +[package] +name = "tarfs-defs" +version = "0.1.0" +edition = "2021" + +[dependencies] +zerocopy = "0.6.1" diff --git a/src/tardev-snapshotter/tarfs-defs/src/lib.rs b/src/tardev-snapshotter/tarfs-defs/src/lib.rs new file mode 100644 index 000000000000..3d4ea28739b8 --- /dev/null +++ b/src/tardev-snapshotter/tarfs-defs/src/lib.rs @@ -0,0 +1,125 @@ +use zerocopy::byteorder::{LE, U16, U32, U64}; + +/// Flags used in [`Inode::flags`]. +pub mod inode_flags { + /// Indicates that the inode is opaque. + /// + /// When set, inode will have the "trusted.overlay.opaque" set to "y" at runtime. + pub const OPAQUE: u8 = 0x1; +} + +/// An inode in the tarfs inode table. +#[derive(zerocopy::AsBytes, zerocopy::FromBytes, zerocopy::Unaligned)] +#[repr(C)] +pub struct Inode { + /// The mode of the inode. + /// + /// The bottom 9 bits are the rwx bits for owner, group, all. + /// + /// The bits in the [`S_IFMT`] mask represent the file mode. + pub mode: U16, + + /// Tarfs flags for the inode. + /// + /// Values are drawn from the [`inode_flags`] module. + pub flags: u8, + + /// The bottom 4 bits represent the top 4 bits of mtime. + pub hmtime: u8, + + /// The owner of the inode. + pub owner: U32, + + /// The group of the inode. + pub group: U32, + + /// The bottom 32 bits of mtime. + pub lmtime: U32, + + /// Size of the contents of the inode. + pub size: U64, + + /// Either the offset to the data, or the major and minor numbers of a device. + /// + /// For the latter, the 32 LSB are the minor, and the 32 MSB are the major numbers. + pub offset: U64, +} + +/// An entry in a tarfs directory entry table. +#[derive(zerocopy::AsBytes, zerocopy::FromBytes, zerocopy::Unaligned)] +#[repr(C)] +pub struct DirEntry { + /// The inode number this entry refers to. + pub ino: U64, + + /// The offset to the name of the entry. + pub name_offset: U64, + + /// The length of the name of the entry. + pub name_len: U64, + + /// The type of entry. + pub etype: u8, + + /// Unused padding. + pub _padding: [u8; 7], +} + +/// The super-block of a tarfs instance. +#[derive(zerocopy::AsBytes, zerocopy::FromBytes, zerocopy::Unaligned)] +#[repr(C)] +pub struct SuperBlock { + /// The offset to the beginning of the inode-table. + pub inode_table_offset: U64, + + /// The number of inodes in the file system. + pub inode_count: U64, +} + +/// A mask to be applied to [`Inode::mode`] to extract the inode's type. +pub const S_IFMT: u16 = 0o0170000; + +/// A socket. +pub const S_IFSOCK: u16 = 0o0140000; + +/// A symbolic link. +pub const S_IFLNK: u16 = 0o0120000; + +/// A regular file. +pub const S_IFREG: u16 = 0o0100000; + +/// A block device. +pub const S_IFBLK: u16 = 0o0060000; + +/// A directory. +pub const S_IFDIR: u16 = 0o0040000; + +/// A character device. +pub const S_IFCHR: u16 = 0o0020000; + +/// A (fifo) pipe. +pub const S_IFIFO: u16 = 0o0010000; + +/// Unknown directory entry type. +pub const DT_UNKNOWN: u8 = 0; + +/// A (fifo) pipe. +pub const DT_FIFO: u8 = 1; + +/// A character device. +pub const DT_CHR: u8 = 2; + +/// A directory. +pub const DT_DIR: u8 = 4; + +/// A block device. +pub const DT_BLK: u8 = 6; + +/// A regular file. +pub const DT_REG: u8 = 8; + +/// A symbolic link. +pub const DT_LNK: u8 = 10; + +/// A socket. +pub const DT_SOCK: u8 = 12; diff --git a/src/tardev-snapshotter/tarindex/Cargo.toml b/src/tardev-snapshotter/tarindex/Cargo.toml new file mode 100644 index 000000000000..550291f4dbc1 --- /dev/null +++ b/src/tardev-snapshotter/tarindex/Cargo.toml @@ -0,0 +1,13 @@ +[package] +name = "tarindex" +version = "0.1.0" +edition = "2021" + +[[bin]] +name = "tarindex" +path = "src/bin/tarindex.rs" + +[dependencies] +tar = "0.4" +zerocopy = "0.6.1" +tarfs-defs = { path = "../tarfs-defs" } diff --git a/src/tardev-snapshotter/tarindex/src/bin/tarindex.rs b/src/tardev-snapshotter/tarindex/src/bin/tarindex.rs new file mode 100644 index 000000000000..4a773373726a --- /dev/null +++ b/src/tardev-snapshotter/tarindex/src/bin/tarindex.rs @@ -0,0 +1,13 @@ +use std::{env, fs::OpenOptions, io, process}; +use tarindex::append_index; + +fn main() -> io::Result<()> { + let argv: Vec = env::args().collect(); + if argv.len() != 2 { + eprintln!("Usage: {} ", argv[0]); + process::exit(1); + } + + let mut file = OpenOptions::new().read(true).write(true).open(&argv[1])?; + append_index(&mut file) +} diff --git a/src/tardev-snapshotter/tarindex/src/lib.rs b/src/tardev-snapshotter/tarindex/src/lib.rs new file mode 100644 index 000000000000..f4e0085a2c40 --- /dev/null +++ b/src/tardev-snapshotter/tarindex/src/lib.rs @@ -0,0 +1,503 @@ +use std::collections::{BTreeMap, VecDeque}; +use std::{cell::RefCell, io, mem, rc::Rc}; +use tar::Archive; +use tarfs_defs::*; +use zerocopy::AsBytes; + +#[derive(Default)] +struct Entry { + offset: u64, + size: u64, + children: BTreeMap, Rc>>, + mode: u16, + ino: u64, + emitted: bool, + is_opaque: bool, + + mtime: u64, + owner: u32, + group: u32, +} + +impl Entry { + fn find_or_create_child(&mut self, name: &[u8]) -> Rc> { + self.children + .entry(name.to_vec()) + .or_insert_with(|| Rc::new(RefCell::new(Entry::default()))) + .clone() + } +} + +fn visit_breadth_first_mut( + root: Rc>, + mut visitor: impl FnMut(&mut Entry) -> io::Result<()>, +) -> io::Result<()> { + let mut q = VecDeque::new(); + q.push_back(root); + + while let Some(e) = q.pop_front() { + visitor(&mut e.borrow_mut())?; + + for child in e.borrow().children.values() { + q.push_back(child.clone()); + } + } + + Ok(()) +} + +fn read_all_entries( + reader: &mut (impl io::Read + io::Seek), + root: &mut Rc>, + special_link: &mut Vec>, + mut cb: impl FnMut(&mut Rc>, &[u8], &Entry), + mut hardlink: impl FnMut(&mut Rc>, &[u8], &[u8]), +) -> io::Result { + let mut ar = Archive::new(reader); + + for file in ar.entries()? { + let f = file?; + let h = f.header(); + + let mut mode = if let Ok(m) = h.mode() { + m as u16 & 0x1ff + } else { + continue; + }; + + let entry_size; + let entry_offset; + match h.entry_type() { + tar::EntryType::Regular => { + mode |= S_IFREG; + entry_size = f.size(); + entry_offset = f.raw_file_position(); + } + tar::EntryType::Directory => { + mode |= S_IFDIR; + entry_size = 0; + entry_offset = 0; + } + tar::EntryType::Fifo => { + mode |= S_IFIFO; + entry_size = 0; + entry_offset = 0; + } + tar::EntryType::Char => { + mode |= S_IFCHR; + let major = if let Ok(Some(v)) = h.device_major() { + v as u64 + } else { + eprintln!( + "Skipping chr device without a major device number: {}", + String::from_utf8_lossy(&f.path_bytes()) + ); + continue; + }; + let minor = if let Ok(Some(v)) = h.device_minor() { + v as u64 + } else { + eprintln!( + "Skipping chr device without a minor device number: {}", + String::from_utf8_lossy(&f.path_bytes()) + ); + continue; + }; + entry_offset = minor | (major << 32); + entry_size = 0; + } + tar::EntryType::Block => { + mode |= S_IFBLK; + let major = if let Ok(Some(v)) = h.device_major() { + v as u64 + } else { + eprintln!( + "Skipping blk device without a major device number: {}", + String::from_utf8_lossy(&f.path_bytes()) + ); + continue; + }; + let minor = if let Ok(Some(v)) = h.device_minor() { + v as u64 + } else { + eprintln!( + "Skipping blk device without a minor device number: {}", + String::from_utf8_lossy(&f.path_bytes()) + ); + continue; + }; + entry_offset = minor | (major << 32); + entry_size = 0; + } + tar::EntryType::Symlink => { + mode |= S_IFLNK; + match f.link_name_bytes() { + Some(name) => { + let hname = h + .link_name_bytes() + .unwrap_or(std::borrow::Cow::Borrowed(b"")); + if *hname != *name { + special_link.push(name.to_vec()); + entry_offset = 0; + } else { + entry_offset = f.raw_header_position() + 157; + } + entry_size = name.len() as u64; + } + None => { + eprintln!( + "Skipping symlink without a link name: {}", + String::from_utf8_lossy(&f.path_bytes()) + ); + continue; + } + } + } + tar::EntryType::Link => { + match f.link_name_bytes() { + Some(name) => hardlink(root, &f.path_bytes(), &name), + None => { + eprintln!( + "Skipping hardlink without a link name: {}", + String::from_utf8_lossy(&f.path_bytes()) + ); + } + } + continue; + } + _ => { + eprintln!( + "Skipping unhandled file due to its type ({:?}): {}", + h.entry_type(), + String::from_utf8_lossy(&f.path_bytes()) + ); + continue; + } + } + + cb( + root, + &f.path_bytes(), + &Entry { + size: entry_size, + offset: entry_offset, + children: BTreeMap::new(), + is_opaque: false, + mode, + ino: 0, + emitted: false, + mtime: h.mtime().unwrap_or(0), + owner: h.uid().unwrap_or(0) as u32, // TODO: This can be a u64 in `tar`. + group: h.gid().unwrap_or(0) as u32, // TODO: This can be a u64 in `tar`. + }, + ); + } + + ar.into_inner().seek(io::SeekFrom::End(0)) +} + +fn clean_path(str: &[u8]) -> Option> { + let mut ret = Vec::new(); + + for component in str.split(|&c| c == b'/') { + match component { + // Empty entries or "." are just ignored. + b"" | b"." => {} + + // Pop an element when we see "..". + b".." => { + if ret.is_empty() { + return None; + } + ret.pop(); + } + + // Add anything else. + _ => { + ret.push(component); + } + } + } + + Some(ret) +} + +/// Initilises the `offset` of all `Entry` instances that represent directories. +/// +/// Returns the next available offset. +/// +/// `first_offset` is the offset of the first directory entry. +fn init_direntry_offset(root: Rc>, first_offset: u64) -> io::Result { + let mut offset = first_offset; + visit_breadth_first_mut(root, |e| { + if e.mode & S_IFMT != S_IFDIR { + return Ok(()); + } + + e.offset = offset; + e.size = mem::size_of::() as u64 * e.children.len() as u64; + + offset += e.size; + Ok(()) + })?; + Ok(offset) +} + +/// Writes all directory entries to the given file. +/// +/// Returns the next available offset for the strings. +/// +/// `first_string_offset` is the offset of the first string. +fn write_direntry_bodies( + root: Rc>, + first_string_offset: u64, + file: &mut impl io::Write, +) -> io::Result { + let mut offset = first_string_offset; + visit_breadth_first_mut(root, |e| { + if e.mode & S_IFMT != S_IFDIR { + return Ok(()); + } + + for (name, child) in &e.children { + let child = child.borrow(); + let dirent = DirEntry { + ino: child.ino.into(), + name_offset: offset.into(), + name_len: (name.len() as u64).into(), + etype: match child.mode & S_IFMT { + S_IFSOCK => DT_SOCK, + S_IFLNK => DT_LNK, + S_IFREG => DT_REG, + S_IFBLK => DT_BLK, + S_IFDIR => DT_DIR, + S_IFCHR => DT_CHR, + S_IFIFO => DT_FIFO, + _ => DT_UNKNOWN, + }, + _padding: [0; 7], + }; + file.write_all(dirent.as_bytes())?; + offset += u64::from(dirent.name_len); + } + + Ok(()) + })?; + Ok(offset) +} + +fn traverse_path(root: &Rc>, path: &[&[u8]]) -> Rc> { + let mut ptr = root.clone(); + for component in path { + let new = ptr.borrow_mut().find_or_create_child(component); + ptr = new; + } + + ptr +} + +pub fn append_index(data: &mut (impl io::Read + io::Write + io::Seek)) -> io::Result<()> { + let mut root = Rc::new(RefCell::new(Entry { + mode: S_IFDIR | 0o555, + ..Entry::default() + })); + let mut special_link = Vec::new(); + let contents_size = read_all_entries( + data, + &mut root, + &mut special_link, + |root, name, e| { + // Break the name into path components. + let mut path = if let Some(p) = clean_path(name) { + p + } else { + // Skip files that don't point into the root. + eprintln!("Skipping malformed name: {}", String::from_utf8_lossy(name)); + return; + }; + + if let Some(n) = path.last_mut() { + if n == b".wh..wh..opq" { + // Set the opaque flag on the parent directory. + let ptr = traverse_path(&root, &path[..path.len() - 1]); + ptr.borrow_mut().is_opaque = true; + return; + } + + if n.starts_with(b".wh.") { + // Find the file and make it a char device with (0, 0) as major and minor. This + // indicates to overlayfs that it shouldn't look at lower layers. + *n = &n[4..]; + let ptr = traverse_path(&root, &path); + let mut cur = ptr.borrow_mut(); + cur.children = BTreeMap::new(); + cur.mode = (cur.mode & !S_IFMT) | S_IFCHR; + cur.size = 0; + cur.offset = 0; + return; + } + } + + // Find the right entry in the tree. + let ptr = traverse_path(&root, &path); + let mut cur = ptr.borrow_mut(); + + // Update the entry. We remove any previous existing entry. + *cur = Entry { + children: BTreeMap::new(), + mode: e.mode, + size: e.size, + offset: e.offset, + mtime: e.mtime, + owner: e.owner, + group: e.group, + ino: e.ino, + emitted: e.emitted, + is_opaque: e.is_opaque, + }; + }, + |root, name, linkname| { + // Find the destination. + let path = if let Some(p) = clean_path(linkname) { + p + } else { + // Skip files that don't point into the root. + eprintln!( + "Skipping malformed linkname name: {}", + String::from_utf8_lossy(linkname) + ); + return; + }; + + // Find existing file. + let mut existing = root.clone(); + for component in path { + let new = existing.borrow_mut().find_or_create_child(component); + existing = new; + } + + if existing.borrow().mode & S_IFMT != S_IFREG { + eprintln!( + "Skipping link to non-file: {}", + String::from_utf8_lossy(linkname) + ); + return; + } + + // Find the file to create. + let path = if let Some(p) = clean_path(name) { + p + } else { + // Skip files that don't point into the root. + eprintln!("Skipping malformed name: {}", String::from_utf8_lossy(name)); + return; + }; + + if path.is_empty() { + *root = existing; + } else { + let mut ptr = root.clone(); + for component in path.iter().take(path.len() - 1) { + let new = ptr.borrow_mut().find_or_create_child(component); + ptr = new; + } + ptr.borrow_mut() + .children + .insert(path.last().unwrap().to_vec(), existing); + } + }, + )?; + + data.seek(io::SeekFrom::End(0))?; + + // Assign i-node numbers only for the entries that survided conversion to tree. + let mut ino_count = 0u64; + visit_breadth_first_mut(root.clone(), |e| { + if e.ino == 0 { + ino_count += 1; + e.ino = ino_count; + } + Ok(()) + })?; + + // Calculate the offsets for directory entries. + let inode_table_size: u64 = mem::size_of::() as u64 * ino_count; + let string_table_offset = init_direntry_offset(root.clone(), contents_size + inode_table_size)?; + let mut symlink_offset = string_table_offset; + + // Write the i-node table. + visit_breadth_first_mut(root.clone(), |e| { + if e.emitted { + return Ok(()); + } + + // Check for special symlink names + let inode_offset = if (e.mode & S_IFMT) != S_IFLNK || e.offset != 0 { + e.offset + } else { + let v = symlink_offset; + symlink_offset += e.size; + v + }; + + e.emitted = true; + let inode = Inode { + mode: e.mode.into(), + flags: if e.is_opaque { + tarfs_defs::inode_flags::OPAQUE + } else { + 0 + }, + hmtime: (e.mtime >> 32 & 0xf) as u8, + owner: e.owner.into(), + group: e.group.into(), + lmtime: (e.mtime as u32).into(), + size: e.size.into(), + offset: inode_offset.into(), + }; + data.write_all(inode.as_bytes())?; + Ok(()) + })?; + + // Write the directory bodies. + let mut end_offset = write_direntry_bodies(root.clone(), symlink_offset, data)?; + + // Duplicate special symlink names. + for link_name in special_link.iter() { + data.write_all(link_name.as_bytes())?; + end_offset += link_name.len() as u64; + } + + // Write the strings. + visit_breadth_first_mut(root, |e| { + if e.mode & S_IFMT != S_IFDIR { + return Ok(()); + } + + for name in e.children.keys() { + data.write_all(name)?; + end_offset += name.len() as u64; + } + + Ok(()) + })?; + + // Write the "super-block". + const ALIGNMENT: u64 = 4096; + const fn align(v: u64) -> u64 { + (v + (ALIGNMENT - 1)) / ALIGNMENT * ALIGNMENT + } + end_offset = align(end_offset); + data.seek(io::SeekFrom::Start(end_offset + ALIGNMENT - 512))?; + let sb = SuperBlock { + inode_table_offset: contents_size.into(), + inode_count: ino_count.into(), + }; + data.write_all(sb.as_bytes())?; + + // Write padding to align to a 4096-byte boundary. + data.seek(io::SeekFrom::Start(end_offset + (ALIGNMENT - 1)))?; + data.write_all(&[0])?; + + Ok(()) +} diff --git a/src/tardev-snapshotter/verity/Cargo.toml b/src/tardev-snapshotter/verity/Cargo.toml new file mode 100644 index 000000000000..ff27d893d6c3 --- /dev/null +++ b/src/tardev-snapshotter/verity/Cargo.toml @@ -0,0 +1,17 @@ +[package] +name = "verity" +version = "0.1.0" +edition = "2021" + +[[bin]] +name = "verity" +path = "src/bin/verity.rs" + +[[bin]] +name = "verity-info" +path = "src/bin/verity-info.rs" + +[dependencies] +sha2 = "0.10.6" +generic-array = "0.14.6" +zerocopy = "0.6.1" diff --git a/src/tardev-snapshotter/verity/src/bin/verity-info.rs b/src/tardev-snapshotter/verity/src/bin/verity-info.rs new file mode 100644 index 000000000000..8689b8a8580c --- /dev/null +++ b/src/tardev-snapshotter/verity/src/bin/verity-info.rs @@ -0,0 +1,46 @@ +use std::{env, fs::File, io, io::Read, io::Seek, process}; +use zerocopy::AsBytes; + +fn main() -> io::Result<()> { + let argv: Vec = env::args().collect(); + if argv.len() != 2 { + eprintln!("Usage: {} ", argv[0]); + process::exit(1); + } + + let mut file = File::open(&argv[1])?; + let size = file.seek(io::SeekFrom::End(0))?; + if size < 4096 { + eprintln!("File is too small: {size}"); + process::exit(1); + } + + file.seek(std::io::SeekFrom::End(-4096))?; + let mut buf = [0u8; 4096]; + file.read_exact(&mut buf)?; + + let mut sb = verity::SuperBlock::default(); + sb.as_bytes_mut() + .copy_from_slice(&buf[4096 - 512..][..std::mem::size_of::()]); + let data_block_size = u64::from(sb.data_block_size.get()); + let hash_block_size = u64::from(sb.hash_block_size.get()); + let data_size = if let Some(v) = sb.data_block_count.get().checked_mul(data_block_size) { + v + } else { + eprintln!("Overflow when calculating the data size"); + process::exit(1); + }; + + if data_size > size { + eprintln!("Data size ({data_size}) is greater than device size ({size})"); + process::exit(1); + } + + println!("Data block size: {data_block_size}"); + println!("Data block clount: {}", sb.data_block_count.get()); + println!("Hash block size: {hash_block_size}"); + println!("Hash offset: {data_size}"); + println!("veritysetup verify --data-block-size={data_block_size} --data-blocks={} --hash-block-size={hash_block_size} --hash-offset={data_size} --no-superblock -s 0000000000000000000000000000000000000000000000000000000000000000 {} {}", sb.data_block_count.get(), argv[1], argv[1]); + + Ok(()) +} diff --git a/src/tardev-snapshotter/verity/src/bin/verity.rs b/src/tardev-snapshotter/verity/src/bin/verity.rs new file mode 100644 index 000000000000..a5368b48dfc8 --- /dev/null +++ b/src/tardev-snapshotter/verity/src/bin/verity.rs @@ -0,0 +1,68 @@ +use generic_array::typenum::Unsigned; +use sha2::{digest::OutputSizeUser, Sha256}; +use std::{env, fs::File, fs::OpenOptions, io, io::Seek, process}; +use verity::{append_tree, traverse_file, Verity}; + +fn main() -> io::Result<()> { + let argv: Vec = env::args().collect(); + if argv.len() != 3 && argv.len() != 4 { + eprintln!("Usage: {} [tree.bin]", argv[0]); + process::exit(1); + } + + let mut reader = File::open(&argv[2])?; + let file_size = reader.seek(io::SeekFrom::End(0))?; + reader.rewind()?; + + if file_size == 0 { + eprintln!("Empty input file."); + process::exit(1); + } + + let salt = [0u8; ::OutputSize::USIZE]; + + match argv[1].as_ref() { + // Append the tree to the file. + "a" => { + let mut file = OpenOptions::new().read(true).write(true).open(&argv[2])?; + println!("Root hash: {:x}", append_tree::(&mut file)?); + } + + // Create the tree in a separate file. + "t" => { + if argv.len() != 4 { + eprintln!("Must specify the name of the output file"); + process::exit(1); + } + + let mut writer = File::create(&argv[3])?; + let verity = Verity::::new(file_size, 4096, 4096, &salt, 0)?; + println!( + "Root hash: {:x}", + traverse_file( + &mut reader, + 0, + false, + verity, + &mut verity::write_to(&mut writer) + )? + ); + } + + // Calculate the root hash without writing the tree. + "r" => { + let verity = Verity::::new(file_size, 4096, 4096, &salt, 0)?; + println!( + "Root hash: {:x}", + traverse_file(&mut reader, 0, false, verity, &mut verity::no_write)? + ); + } + + _ => { + eprintln!("Unknown command: {}", argv[1]); + process::exit(1); + } + } + + Ok(()) +} diff --git a/src/tardev-snapshotter/verity/src/lib.rs b/src/tardev-snapshotter/verity/src/lib.rs new file mode 100644 index 000000000000..30c59e87cfda --- /dev/null +++ b/src/tardev-snapshotter/verity/src/lib.rs @@ -0,0 +1,241 @@ +use generic_array::{typenum::Unsigned, GenericArray}; +use sha2::{digest::OutputSizeUser, Digest}; +use std::fs::File; +use std::io::{self, Read, Seek, SeekFrom, Write}; +use zerocopy::byteorder::{LE, U32, U64}; +use zerocopy::AsBytes; + +#[derive(Default, zerocopy::AsBytes, zerocopy::FromBytes, zerocopy::Unaligned)] +#[repr(C)] +pub struct SuperBlock { + pub data_block_size: U32, + pub hash_block_size: U32, + pub data_block_count: U64, +} + +#[derive(Clone)] +struct Level { + next_index: usize, + file_offset: u64, + data: Vec, +} + +pub struct Verity { + levels: Vec, + seeded: T, + data_block_size: usize, + hash_block_size: usize, + block_remaining_count: u64, + super_block: SuperBlock, +} + +impl Verity { + const HASH_SIZE: usize = T::OutputSize::USIZE; + + /// Creates a new `Verity` instance. + pub fn new( + data_size: u64, + data_block_size: usize, + hash_block_size: usize, + salt: &[u8], + mut write_file_offset: u64, + ) -> io::Result { + let level_count = { + let mut max_size = data_block_size as u64; + let mut count = 0usize; + + while max_size < data_size { + count += 1; + max_size *= (hash_block_size / Self::HASH_SIZE) as u64; + } + count + }; + + let mut data = Vec::new(); + data.resize(hash_block_size, 0); + + let mut levels = Vec::new(); + levels.resize( + level_count, + Level { + next_index: 0, + file_offset: 0, + data, + }, + ); + + for (i, l) in levels.iter_mut().enumerate() { + let entry_size = (data_block_size as u64) + * ((hash_block_size / Self::HASH_SIZE) as u64).pow(level_count as u32 - i as u32); + let count = (data_size + entry_size - 1) / entry_size; + l.file_offset = write_file_offset; + write_file_offset += hash_block_size as u64 * count; + } + + let block_count = data_size / (data_block_size as u64); + Ok(Self { + levels, + seeded: T::new_with_prefix(salt), + data_block_size, + block_remaining_count: block_count, + hash_block_size, + super_block: SuperBlock { + data_block_size: (data_block_size as u32).into(), + hash_block_size: (hash_block_size as u32).into(), + data_block_count: block_count.into(), + }, + }) + } + + /// Determines if more blocks are expected. + /// + /// This is based on file size specified when this instance was created. + fn more_blocks(&self) -> bool { + self.block_remaining_count > 0 + } + + /// Adds the given hash to the level. + /// + /// Returns `true` is the level is now full; `false` is there is still room for more hashes. + fn add_hash(&mut self, l: usize, hash: &[u8]) -> bool { + let level = &mut self.levels[l]; + level.data[level.next_index * Self::HASH_SIZE..][..Self::HASH_SIZE].copy_from_slice(hash); + level.next_index += 1; + level.next_index >= self.hash_block_size / Self::HASH_SIZE + } + + /// Finalises the level despite potentially not having filled it. + /// + /// It zeroes out the remaining bytes of the level so that its hash can be calculated + /// consistently. + fn finalize_level(&mut self, l: usize) { + let level = &mut self.levels[l]; + for b in &mut level.data[level.next_index * Self::HASH_SIZE..] { + *b = 0; + } + level.next_index = 0; + } + + fn uplevel(&mut self, l: usize, reader: &mut File, writer: &mut F) -> io::Result + where + F: FnMut(&mut File, &[u8], u64) -> io::Result<()>, + { + self.finalize_level(l); + writer(reader, &self.levels[l].data, self.levels[l].file_offset)?; + self.levels[l].file_offset += self.hash_block_size as u64; + let h = self.digest(&self.levels[l].data); + Ok(self.add_hash(l - 1, h.as_slice())) + } + + fn digest(&self, block: &[u8]) -> GenericArray { + let mut hasher = self.seeded.clone(); + hasher.update(block); + hasher.finalize() + } + + fn add_block(&mut self, b: &[u8], reader: &mut File, writer: &mut F) -> io::Result<()> + where + F: FnMut(&mut File, &[u8], u64) -> io::Result<()>, + { + if self.block_remaining_count == 0 { + return Err(io::Error::new( + io::ErrorKind::InvalidData, + "unexpected block", + )); + } + + self.block_remaining_count -= 1; + + let count = self.levels.len(); + let hash = self.digest(b); + if self.add_hash(count - 1, hash.as_slice()) { + // Go up the levels as far as it can. + for l in (1..count).rev() { + if !self.uplevel(l, reader, writer)? { + break; + } + } + } + Ok(()) + } + + fn finalize( + mut self, + write_superblock: bool, + reader: &mut File, + writer: &mut impl FnMut(&mut File, &[u8], u64) -> io::Result<()>, + ) -> io::Result> { + let len = self.levels.len(); + for mut l in (1..len).rev() { + if self.levels[l].next_index != 0 { + while l > 0 { + self.uplevel(l, reader, writer)?; + l -= 1; + } + break; + } + } + + self.finalize_level(0); + + writer(reader, &self.levels[0].data, self.levels[0].file_offset)?; + self.levels[0].file_offset += self.hash_block_size as u64; + + if write_superblock { + writer( + reader, + self.super_block.as_bytes(), + self.levels[len - 1].file_offset + 4096 - 512, + )?; + + // TODO: Align to the hash_block_size... + // Align to 4096 bytes. + writer(reader, &[0u8], self.levels[len - 1].file_offset + 4095)?; + } + + Ok(self.digest(&self.levels[0].data)) + } +} + +pub fn traverse_file( + file: &mut File, + mut read_offset: u64, + write_superblock: bool, + mut verity: Verity, + writer: &mut impl FnMut(&mut File, &[u8], u64) -> io::Result<()>, +) -> io::Result> { + let mut buf = Vec::new(); + buf.resize(verity.data_block_size, 0); + while verity.more_blocks() { + file.seek(SeekFrom::Start(read_offset))?; + file.read_exact(&mut buf)?; + verity.add_block(&buf, file, writer)?; + read_offset += verity.data_block_size as u64; + } + verity.finalize(write_superblock, file, writer) +} + +pub fn no_write(_: &mut File, _: &[u8], _: u64) -> io::Result<()> { + Ok(()) +} + +pub fn write_to(f: &mut File) -> impl FnMut(&mut File, &[u8], u64) -> io::Result<()> + '_ { + |_, data, offset| { + f.seek(SeekFrom::Start(offset))?; + f.write_all(data) + } +} + +pub fn append_tree( + file: &mut File, +) -> io::Result> { + let file_size = file.seek(io::SeekFrom::End(0))?; + file.rewind()?; + let mut salt = Vec::new(); + salt.resize(::OutputSize::USIZE, 0); + let verity = Verity::::new(file_size, 4096, 4096, &salt, file_size)?; + traverse_file(file, 0, true, verity, &mut |f, data, offset| { + f.seek(SeekFrom::Start(offset))?; + f.write_all(data) + }) +} diff --git a/src/tarfs/Makefile b/src/tarfs/Makefile new file mode 100644 index 000000000000..7435117f5849 --- /dev/null +++ b/src/tarfs/Makefile @@ -0,0 +1,26 @@ +ifneq ($(KERNELRELEASE),) + +obj-m := tarfs.o + +else + +KDIR ?= /lib/modules/`uname -r`/build +KVER ?= `uname -r` +INSTALL_MOD_PATH ?= $$PWD/_install + +default: + $(MAKE) -C $(KDIR) M=$$PWD + +install: + $(MAKE) -C $(KDIR) M=$$PWD INSTALL_MOD_PATH=$(INSTALL_MOD_PATH) modules_install + depmod -a -b $(INSTALL_MOD_PATH) $(KVER) + +static-checks-build: + exit 0 + +clean: + rm -rf _install + $(MAKE) -C $(KDIR) M=$$PWD clean + + +endif diff --git a/src/tarfs/tarfs.c b/src/tarfs/tarfs.c new file mode 100644 index 000000000000..92de8bcc779d --- /dev/null +++ b/src/tarfs/tarfs.c @@ -0,0 +1,673 @@ +// SPDX-License-Identifier: GPL-2.0 + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define TARFS_MAGIC (0x54415246535f) + +struct tarfs_super { + u64 inode_table_offset; + u64 inode_count; +} __packed; + +struct tarfs_state { + struct tarfs_super super; + u64 data_size; +}; + +#define TARFS_INODE_FLAG_OPAQUE 0x1 + +struct tarfs_inode { + u16 mode; + u8 flags; + u8 hmtime; /* High 4 bits of mtime. */ + u32 owner; + u32 group; + u32 lmtime; /* Lower 32 bits of mtime. */ + u64 size; + u64 offset; /* 64 bits of offset, or 32 LSB are minor dev and 32 MSB are major dev. */ +} __packed; + +struct tarfs_direntry { + u64 ino; + u64 nameoffset; + u64 namelen; + u8 type; + u8 padding[7]; +} __packed; + +struct tarfs_inode_info { + struct inode inode; + u64 data_offset; + u8 flags; +}; + +#define TARFS_I(ptr) (container_of(ptr, struct tarfs_inode_info, inode)) + +#define TARFS_BSIZE 4096 + +static struct kmem_cache *tarfs_inode_cachep; + +static struct dentry *tarfs_lookup(struct inode *dir, struct dentry *dentry, + unsigned int flags); + +static int tarfs_dev_read(struct super_block *sb, u64 pos, void *buf, size_t buflen) +{ + struct buffer_head *bh; + unsigned long offset; + size_t segment; + const struct tarfs_state *state = sb->s_fs_info; + + /* Check for overflows. */ + if (pos + buflen < pos) + return -ERANGE; + + /* Check that the read range is within the data part of the device. */ + if (pos + buflen > state->data_size) + return -EIO; + + while (buflen > 0) { + offset = pos & (TARFS_BSIZE - 1); + segment = min_t(size_t, buflen, TARFS_BSIZE - offset); + bh = sb_bread(sb, pos / TARFS_BSIZE); + if (!bh) + return -EIO; + memcpy(buf, bh->b_data + offset, segment); + brelse(bh); + buf += segment; + buflen -= segment; + pos += segment; + } + + return 0; +} + +static int tarfs_readdir(struct file *file, struct dir_context *ctx) +{ + struct inode *inode = file_inode(file); + struct tarfs_direntry disk_dentry; + u64 offset = TARFS_I(inode)->data_offset; + int ret = 0; + char *name_buffer = NULL; + u64 name_len = 0; + u64 size = i_size_read(inode) / sizeof(disk_dentry) * sizeof(disk_dentry); + loff_t orig_pos = ctx->pos; + + /* ctx->pos must be aligned to a directory entry. */ + if (ctx->pos % sizeof(struct tarfs_direntry)) + return -ENOENT; + + /* Make sure we can't overflow the read offset. */ + if (offset + size < offset) + return -ERANGE; + + /* Make sure the increment of ctx->pos won't overflow by limiting size. */ + if (size >= U64_MAX - sizeof(disk_dentry)) + return -ERANGE; + + for (; ctx->pos < size; ctx->pos += sizeof(disk_dentry)) { + u64 disk_len; + u8 type; + + ret = tarfs_dev_read(inode->i_sb, offset + ctx->pos, &disk_dentry, sizeof(disk_dentry)); + if (ret) + break; + + disk_len = le64_to_cpu(disk_dentry.namelen); + if (disk_len > name_len) { + kfree(name_buffer); + name_buffer = NULL; + + if (disk_len > SIZE_MAX) { + ret = -ENOMEM; + break; + } + + name_buffer = kmalloc(disk_len, GFP_NOFS); + if (!name_buffer) { + ret = -ENOMEM; + break; + } + name_len = disk_len; + } + + ret = tarfs_dev_read(inode->i_sb, + le64_to_cpu(disk_dentry.nameoffset), + name_buffer, disk_len); + if (ret) + break; + + /* Filter out bad types. */ + type = disk_dentry.type; + switch (type) { + case DT_FIFO: + case DT_CHR: + case DT_DIR: + case DT_BLK: + case DT_REG: + case DT_LNK: + case DT_SOCK: + break; + default: + type = DT_UNKNOWN; + } + + if (!dir_emit(ctx, name_buffer, disk_len, le64_to_cpu(disk_dentry.ino), type)) { + kfree(name_buffer); + return 0; + } + } + + kfree(name_buffer); + return ctx->pos != orig_pos ? 0 : ret; +} + +static int tarfs_readpage(struct file *file, struct page *page) +{ + struct inode *inode = page->mapping->host; + loff_t offset, size; + unsigned long fillsize, pos; + void *buf; + int ret; + + buf = kmap_local_page(page); + if (!buf) { + SetPageError(page); + unlock_page(page); + return -ENOMEM; + } + + offset = page_offset(page); + size = i_size_read(inode); + fillsize = 0; + ret = 0; + if (offset < size) { + size -= offset; + fillsize = size > PAGE_SIZE ? PAGE_SIZE : size; + + pos = TARFS_I(inode)->data_offset + offset; + + ret = tarfs_dev_read(inode->i_sb, pos, buf, fillsize); + if (ret < 0) { + SetPageError(page); + fillsize = 0; + ret = -EIO; + } + } + + if (fillsize < PAGE_SIZE) + memset(buf + fillsize, 0, PAGE_SIZE - fillsize); + if (ret == 0) + SetPageUptodate(page); + + flush_dcache_page(page); + kunmap(page); + unlock_page(page); + return ret; +} + +#if KERNEL_VERSION(5, 19, 0) <= LINUX_VERSION_CODE +static int tarfs_read_folio(struct file *file, struct folio *folio) +{ + return tarfs_readpage(file, &folio->page); +} +#else +static inline void * +alloc_inode_sb(struct super_block *sb, struct kmem_cache *cache, gfp_t gfp) +{ + return kmem_cache_alloc(cache, gfp); +} +#endif + +static struct inode *tarfs_iget(struct super_block *sb, u64 ino) +{ + static const struct inode_operations tarfs_symlink_inode_operations = { + .get_link = page_get_link, + }; + static const struct inode_operations tarfs_dir_inode_operations = { + .lookup = tarfs_lookup, + }; + static const struct file_operations tarfs_dir_operations = { + .read = generic_read_dir, + .iterate_shared = tarfs_readdir, + .llseek = generic_file_llseek, + }; + static const struct address_space_operations tarfs_aops = { +#if KERNEL_VERSION(5, 19, 0) <= LINUX_VERSION_CODE + .read_folio = tarfs_read_folio, +#else + .readpage = tarfs_readpage, +#endif + }; + struct tarfs_inode_info *info; + struct tarfs_inode disk_inode; + struct inode *inode; + const struct tarfs_state *state = sb->s_fs_info; + int ret; + u16 mode; + u64 offset; + + if (!ino || ino > state->super.inode_count) + return ERR_PTR(-ENOENT); + + inode = iget_locked(sb, ino); + if (!inode) + return ERR_PTR(-ENOMEM); + + if (!(inode->i_state & I_NEW)) + return inode; + + /* + * The checks in tarfs_fill_super ensure that we don't overflow while trying to calculate + * offset of the inode table entry as long as the inode number is less than inode_count. + */ + ret = tarfs_dev_read(sb, + state->super.inode_table_offset + sizeof(struct tarfs_inode) * (ino - 1), + &disk_inode, sizeof(disk_inode)); + if (ret < 0) + goto discard; + + i_uid_write(inode, le32_to_cpu(disk_inode.owner)); + i_gid_write(inode, le32_to_cpu(disk_inode.group)); + + offset = le64_to_cpu(disk_inode.offset); + mode = le16_to_cpu(disk_inode.mode); + + /* Ignore inodes that have unknown mode bits. */ + if (mode & ~(S_IFMT | 0777)) { + ret = -ENOENT; + goto discard; + } + + switch (mode & S_IFMT) { + case S_IFREG: + inode->i_fop = &generic_ro_fops; + inode->i_data.a_ops = &tarfs_aops; + break; + + case S_IFDIR: + inode->i_op = &tarfs_dir_inode_operations; + inode->i_fop = &tarfs_dir_operations; + break; + + case S_IFLNK: + inode->i_data.a_ops = &tarfs_aops; + inode->i_op = &tarfs_symlink_inode_operations; + inode_nohighmem(inode); + break; + + case S_IFSOCK: + case S_IFIFO: + case S_IFCHR: + case S_IFBLK: + init_special_inode(inode, mode, MKDEV(offset >> 32, offset & MINORMASK)); + offset = 0; + break; + + default: + ret = -ENOENT; + goto discard; + } + + set_nlink(inode, 1); + + inode->i_mtime.tv_sec = inode->i_atime.tv_sec = inode->i_ctime.tv_sec = + (((u64)disk_inode.hmtime & 0xf) << 32) | le32_to_cpu(disk_inode.lmtime); + inode->i_mtime.tv_nsec = inode->i_atime.tv_nsec = inode->i_ctime.tv_nsec = 0; + + inode->i_mode = mode; + inode->i_size = le64_to_cpu(disk_inode.size); + inode->i_blocks = (inode->i_size + TARFS_BSIZE - 1) / TARFS_BSIZE; + + info = TARFS_I(inode); + info->data_offset = offset; + info->flags = disk_inode.flags; + + unlock_new_inode(inode); + return inode; + +discard: + iget_failed(inode); + return ERR_PTR(ret); +} + +static int tarfs_strcmp(struct super_block *sb, u64 pos, const char *str, + size_t size) +{ + struct buffer_head *bh; + unsigned long offset; + size_t segment; + bool matched; + const struct tarfs_state *state = sb->s_fs_info; + + /* If the string doesn't fit in the data size, it doesn't match. */ + if (pos + size < pos || pos + size > state->data_size) + return 0; + + /* Compare string up to a block at a time. */ + while (size) { + offset = pos & (TARFS_BSIZE - 1); + segment = min_t(size_t, size, TARFS_BSIZE - offset); + bh = sb_bread(sb, pos / TARFS_BSIZE); + if (!bh) + return -EIO; + matched = memcmp(bh->b_data + offset, str, segment) == 0; + brelse(bh); + if (!matched) + return 0; + + size -= segment; + pos += segment; + str += segment; + } + + return 1; +} + +static struct dentry *tarfs_lookup(struct inode *dir, struct dentry *dentry, + unsigned int flags) +{ + struct inode *inode; + struct tarfs_direntry disk_dentry; + u64 offset = TARFS_I(dir)->data_offset; + int ret; + const char *name = dentry->d_name.name; + size_t len = dentry->d_name.len; + u64 size = i_size_read(dir) / sizeof(disk_dentry) * sizeof(disk_dentry); + u64 cur; + + /* Make sure we can't overflow the read offset. */ + if (offset + size < offset) + return ERR_PTR(-ERANGE); + + /* Make sure the increment of cur won't overflow by limiting size. */ + if (size >= U64_MAX - sizeof(disk_dentry)) + return ERR_PTR(-ERANGE); + + for (cur = 0; cur < size; cur += sizeof(disk_dentry)) { + u64 disk_len; + + ret = tarfs_dev_read(dir->i_sb, offset + cur, &disk_dentry, sizeof(disk_dentry)); + if (ret) + return ERR_PTR(ret); + + disk_len = le64_to_cpu(disk_dentry.namelen); + if (len != disk_len || disk_len > SIZE_MAX) + continue; + + ret = tarfs_strcmp(dir->i_sb, le64_to_cpu(disk_dentry.nameoffset), name, len); + if (ret < 0) + return ERR_PTR(ret); + + if (ret == 1) { + inode = tarfs_iget(dir->i_sb, le64_to_cpu(disk_dentry.ino)); + return d_splice_alias(inode, dentry); + } + } + + /* We reached the end of the directory. */ + return ERR_PTR(-ENOENT); +} + +static int tarfs_statfs(struct dentry *dentry, struct kstatfs *buf) +{ + struct super_block *sb = dentry->d_sb; + const struct tarfs_state *state = sb->s_fs_info; + u64 id = huge_encode_dev(sb->s_bdev->bd_dev); + + buf->f_type = TARFS_MAGIC; + buf->f_namelen = LONG_MAX; + buf->f_bsize = TARFS_BSIZE; + buf->f_bfree = buf->f_bavail = buf->f_ffree = 0; + buf->f_blocks = state->super.inode_table_offset / TARFS_BSIZE; + buf->f_files = state->super.inode_count; + buf->f_fsid = u64_to_fsid(id); + return 0; +} + +static struct inode *tarfs_nfs_get_inode(struct super_block *sb, + u64 ino, u32 generation) +{ + return tarfs_iget(sb, ino); +} + +static struct dentry *tarfs_fh_to_dentry(struct super_block *sb, + struct fid *fid, int fh_len, int fh_type) +{ + return generic_fh_to_dentry(sb, fid, fh_len, fh_type, + tarfs_nfs_get_inode); +} + +static struct dentry *tarfs_fh_to_parent(struct super_block *sb, + struct fid *fid, int fh_len, int fh_type) +{ + return generic_fh_to_parent(sb, fid, fh_len, fh_type, + tarfs_nfs_get_inode); +} + +static struct inode *tarfs_alloc_inode(struct super_block *sb) +{ + struct tarfs_inode_info *info; + + info = alloc_inode_sb(sb, tarfs_inode_cachep, GFP_NOFS); + if (!info) + return NULL; + + return &info->inode; +} + +static void tarfs_free_inode(struct inode *inode) +{ + kmem_cache_free(tarfs_inode_cachep, TARFS_I(inode)); +} + +int tarfs_xattr_trusted_get(const struct xattr_handler *handler, + struct dentry *unused, struct inode *inode, + const char *name, void *buffer, size_t size) +{ + struct tarfs_inode_info *info = TARFS_I(inode); + bool opaque = (info->flags & TARFS_INODE_FLAG_OPAQUE) != 0; + + if (opaque && strcmp(name, "overlay.opaque") == 0) { + if (size == 0) + return 1; + *(char *)buffer = 'y'; + return 1; + } + + return -ENODATA; +} + +static int tarfs_fill_super(struct super_block *sb, struct fs_context *fc) +{ + static const struct export_operations tarfs_export_ops = { + .fh_to_dentry = tarfs_fh_to_dentry, + .fh_to_parent = tarfs_fh_to_parent, + }; + static const struct super_operations super_ops = { + .alloc_inode = tarfs_alloc_inode, + .free_inode = tarfs_free_inode, + .statfs = tarfs_statfs, + }; + static const struct xattr_handler xattr_trusted_handler = { + .prefix = XATTR_TRUSTED_PREFIX, + .get = tarfs_xattr_trusted_get, + }; + static const struct xattr_handler *xattr_handlers[] = { + &xattr_trusted_handler, + NULL, + }; + struct inode *root; + sector_t scount; + struct tarfs_state *state; + struct buffer_head *bh; + const struct tarfs_super *super; + u64 inode_table_end; + + sb_set_blocksize(sb, TARFS_BSIZE); + + sb->s_maxbytes = MAX_LFS_FILESIZE; + sb->s_magic = TARFS_MAGIC; + sb->s_flags |= SB_RDONLY | SB_NOATIME; + sb->s_time_min = 0; + sb->s_time_max = 0; + sb->s_op = &super_ops; + sb->s_xattr = xattr_handlers; + + scount = bdev_nr_sectors(sb->s_bdev); + if (scount < TARFS_BSIZE / SECTOR_SIZE) + return -ENXIO; + + state = kmalloc(sizeof(*state), GFP_KERNEL); + if (!state) + return -ENOMEM; + + /* + * state will be freed by kill_sb even if we fail in one of the + * functions below. + */ + sb->s_fs_info = state; + + /* Read super block then init state. */ + bh = sb_bread(sb, scount * SECTOR_SIZE / TARFS_BSIZE - 1); + if (!bh) + return -EIO; + + super = (const struct tarfs_super *)&bh->b_data[TARFS_BSIZE - 512]; + state->super.inode_count = le64_to_cpu(super->inode_count); + state->super.inode_table_offset = + le64_to_cpu(super->inode_table_offset); + state->data_size = scount * SECTOR_SIZE; + + brelse(bh); + + /* This is used to indicate to overlayfs when this superblock limits inodes to 32 bits. */ + if (state->super.inode_count <= U32_MAX) + sb->s_export_op = &tarfs_export_ops; + + /* Check that the inode table starts within the device data. */ + if (state->super.inode_table_offset >= state->data_size) + return -E2BIG; + + /* Check that we don't overflow while calculating the offset of the last inode. */ + if (state->super.inode_count > U64_MAX / sizeof(struct tarfs_inode)) + return -ERANGE; + + /* Check that we don't overflow calculating the end of the inode table. */ + inode_table_end = state->super.inode_count * sizeof(struct tarfs_inode) + + state->super.inode_table_offset; + + if (inode_table_end < state->super.inode_table_offset) + return -ERANGE; + + /* Check that the inode tanble ends within the device data. */ + if (inode_table_end > state->data_size) + return -E2BIG; + + root = tarfs_iget(sb, 1); + if (IS_ERR(root)) + return PTR_ERR(root); + + sb->s_root = d_make_root(root); + if (!sb->s_root) + return -ENOMEM; + + return 0; +} + +static int tarfs_get_tree(struct fs_context *fc) +{ + int ret; + + ret = get_tree_bdev(fc, tarfs_fill_super); + if (ret) { + pr_err("get_tree_bdev failed: %d\n", ret); + return ret; + } + + return 0; +} + +static int tarfs_reconfigure(struct fs_context *fc) +{ + sync_filesystem(fc->root->d_sb); + fc->sb_flags |= SB_RDONLY; + return 0; +} + +static int tarfs_init_fs_context(struct fs_context *fc) +{ + static const struct fs_context_operations ops = { + .get_tree = tarfs_get_tree, + .reconfigure = tarfs_reconfigure, + }; + fc->ops = &ops; + return 0; +} + +static void tarfs_kill_sb(struct super_block *sb) +{ + if (sb->s_bdev) + kill_block_super(sb); + kfree(sb->s_fs_info); +} + +static void tarfs_inode_init_once(void *ptr) +{ + struct tarfs_inode_info *info = ptr; + inode_init_once(&info->inode); +} + +static struct file_system_type tarfs_fs_type = { + .owner = THIS_MODULE, + .name = "tar", + .init_fs_context = tarfs_init_fs_context, + .kill_sb = tarfs_kill_sb, + .fs_flags = FS_REQUIRES_DEV, +}; +MODULE_ALIAS_FS("tar"); + +static int __init tarfs_init(void) +{ + int ret; + + tarfs_inode_cachep = kmem_cache_create("tarfs_inode_cache", + sizeof(struct tarfs_inode_info), 0, + (SLAB_RECLAIM_ACCOUNT|SLAB_MEM_SPREAD| + SLAB_ACCOUNT), + tarfs_inode_init_once); + if (!tarfs_inode_cachep) { + pr_err("kmem_cache_create failed\n"); + return -ENOMEM; + } + + ret = register_filesystem(&tarfs_fs_type); + if (ret) { + pr_err("register_filesystem failed: %d\n", ret); + kmem_cache_destroy(tarfs_inode_cachep); + return ret; + } + + return 0; +} + +static void __exit tarfs_exit(void) +{ + unregister_filesystem(&tarfs_fs_type); + kmem_cache_destroy(tarfs_inode_cachep); +} + +module_init(tarfs_init); +module_exit(tarfs_exit); + +MODULE_DESCRIPTION("tarfs"); +MODULE_AUTHOR("Wedson Almeida Filho "); +MODULE_LICENSE("GPL"); diff --git a/src/tools/genpolicy/.gitignore b/src/tools/genpolicy/.gitignore index 4306af926630..bf1340636448 100644 --- a/src/tools/genpolicy/.gitignore +++ b/src/tools/genpolicy/.gitignore @@ -1 +1,2 @@ -src/version.rs \ No newline at end of file +layers_cache +src/version.rs diff --git a/src/tools/genpolicy/Cargo.lock b/src/tools/genpolicy/Cargo.lock index 6c948b5c1025..f8a3f956bdd9 100644 --- a/src/tools/genpolicy/Cargo.lock +++ b/src/tools/genpolicy/Cargo.lock @@ -1,21 +1,21 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. -version = 3 +version = 4 [[package]] name = "addr2line" -version = "0.21.0" +version = "0.24.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" +checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" dependencies = [ "gimli", ] [[package]] -name = "adler" -version = "1.0.2" +name = "adler2" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" +checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" [[package]] name = "aho-corasick" @@ -41,11 +41,60 @@ dependencies = [ "libc", ] +[[package]] +name = "anstream" +version = "0.6.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8acc5369981196006228e28809f761875c0327210a891e941f4c683b3a99529b" +dependencies = [ + "anstyle", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "is_terminal_polyfill", + "utf8parse", +] + +[[package]] +name = "anstyle" +version = "1.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9" + +[[package]] +name = "anstyle-parse" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b2d16507662817a6a20a9ea92df6652ee4f94f914589377d69f3b21bc5798a9" +dependencies = [ + "utf8parse", +] + +[[package]] +name = "anstyle-query" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c" +dependencies = [ + "windows-sys 0.59.0", +] + +[[package]] +name = "anstyle-wincon" +version = "3.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2109dbce0e72be3ec00bed26e6a7479ca384ad226efdd66db8fa2e3a38c83125" +dependencies = [ + "anstyle", + "windows-sys 0.59.0", +] + [[package]] name = "anyhow" -version = "1.0.69" +version = "1.0.97" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "224afbd727c3d6e4b90103ece64b8d1b67fbb1973b1046c2281eed3f3803f800" +checksum = "dcfed56ad506cb2c684a14971b8861fdc3baaaae314b9e5f9bb532cbe3ba7a4f" [[package]] name = "arc-swap" @@ -55,20 +104,20 @@ checksum = "69f7f8c3906b62b754cd5326047894316021dcfe5a194c8ea52bdd94934a3457" [[package]] name = "async-trait" -version = "0.1.68" +version = "0.1.88" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9ccdd8f2a161be9bd5c023df56f1b2a0bd1d83872ae53b71a84a12c9bf6e842" +checksum = "e539d3fca749fcee5236ab05e93a52867dd549cc157c8cb7f99595f3cedffdb5" dependencies = [ "proc-macro2", "quote", - "syn 2.0.58", + "syn 2.0.100", ] [[package]] name = "autocfg" -version = "1.1.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" +checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" [[package]] name = "axum" @@ -79,11 +128,11 @@ dependencies = [ "async-trait", "axum-core", "bitflags 1.3.2", - "bytes 1.10.0", + "bytes 1.10.1", "futures-util", - "http 0.2.9", - "http-body 0.4.5", - "hyper 0.14.24", + "http 0.2.12", + "http-body 0.4.6", + "hyper 0.14.32", "itoa", "matchit", "memchr", @@ -92,8 +141,8 @@ dependencies = [ "pin-project-lite", "rustversion", "serde", - "sync_wrapper", - "tower", + "sync_wrapper 0.1.2", + "tower 0.4.13", "tower-layer", "tower-service", ] @@ -105,10 +154,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "759fa577a247914fd3f7f76d62972792636412fbfd634cd452f6a385a74d2d2c" dependencies = [ "async-trait", - "bytes 1.10.0", + "bytes 1.10.1", "futures-util", - "http 0.2.9", - "http-body 0.4.5", + "http 0.2.12", + "http-body 0.4.6", "mime", "rustversion", "tower-layer", @@ -117,17 +166,17 @@ dependencies = [ [[package]] name = "backtrace" -version = "0.3.69" +version = "0.3.74" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2089b7e3f35b9dd2d0ed921ead4f6d318c27680d4a5bd167b3ee120edb105837" +checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" dependencies = [ "addr2line", - "cc", "cfg-if", "libc", "miniz_oxide", "object", "rustc-demangle", + "windows-targets 0.52.6", ] [[package]] @@ -148,6 +197,21 @@ version = "0.22.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" +[[package]] +name = "bincode" +version = "1.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" +dependencies = [ + "serde", +] + +[[package]] +name = "bitfield" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46afbd2983a5d5a7bd740ccb198caf5b82f45c40c09c0eed36052d91cb92e719" + [[package]] name = "bitflags" version = "1.3.2" @@ -156,9 +220,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.4.1" +version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "327762f6e5a765692301e5bb513e0d9fef63be86bbc14528052b1cd3e6f03e07" +checksum = "5c8214115b7bf84099f1309324e63141d4c5d7cc26862f97a0a857dbefe165bd" [[package]] name = "block-buffer" @@ -171,15 +235,15 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.12.0" +version = "3.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d261e256854913907f67ed06efbc3338dfe6179796deefc1ff763fc1aee5535" +checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf" [[package]] name = "byteorder" -version = "1.4.3" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" @@ -193,15 +257,18 @@ dependencies = [ [[package]] name = "bytes" -version = "1.10.0" +version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f61dac84819c6588b558454b194026eb1f09c293b9036ae9b159e74e73ab6cf9" +checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" [[package]] name = "cc" -version = "1.0.79" +version = "1.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50d30906286121d95be3d479533b458f87493b30a4b5f79a607db8f5d11aa91f" +checksum = "1fcb57c740ae1daf453ae85f16e37396f672b039e00d9d866e07ddb24e328e3a" +dependencies = [ + "shlex", +] [[package]] name = "cfg-if" @@ -211,9 +278,9 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "chrono" -version = "0.4.31" +version = "0.4.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f2c685bad3eb3d45a01354cedb7d5faa66194d1d58ba6e267a8de788f79db38" +checksum = "1a7964611d71df112cb1730f2ee67324fcf4d0fc6606acbbe9bfe06df124637c" dependencies = [ "android-tzdata", "iana-time-zone", @@ -221,55 +288,70 @@ dependencies = [ "num-traits", "serde", "wasm-bindgen", - "windows-targets 0.48.0", + "windows-link", ] [[package]] name = "clap" -version = "4.1.8" +version = "4.5.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3d7ae14b20b94cb02149ed21a86c423859cbe18dc7ed69845cace50e52b40a5" +checksum = "e958897981290da2a852763fe9cdb89cd36977a5d729023127095fa94d95e2ff" dependencies = [ - "bitflags 1.3.2", + "clap_builder", "clap_derive", +] + +[[package]] +name = "clap_builder" +version = "4.5.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83b0f35019843db2160b5bb19ae09b4e6411ac33fc6a712003c33e03090e2489" +dependencies = [ + "anstream", + "anstyle", "clap_lex", - "is-terminal", - "once_cell", - "strsim 0.10.0", - "termcolor", + "strsim", ] [[package]] name = "clap_derive" -version = "4.1.8" +version = "4.5.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44bec8e5c9d09e439c4335b1af0abaab56dcf3b94999a936e1bb47b9134288f0" +checksum = "09176aae279615badda0765c0c0b3f6ed53f4709118af73cf4655d85d1530cd7" dependencies = [ - "heck 0.4.1", - "proc-macro-error", + "heck 0.5.0", "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.100", ] [[package]] name = "clap_lex" -version = "0.3.2" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "350b9cf31731f9957399229e9b2adc51eeabdfbe9d71d9a0552275fd12710d09" -dependencies = [ - "os_str_bytes", -] +checksum = "f46ad14479a25103f283c0f10005961cf086d8dc42205bb44c46ac563475dca6" [[package]] name = "cmake" -version = "0.1.50" +version = "0.1.54" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a31c789563b815f77f4250caee12365734369f942439b7defd71e18a48197130" +checksum = "e7caa3f9de89ddbe2c607f4101924c5abec803763ae9534e4f4d7d8f84aa81f0" dependencies = [ "cc", ] +[[package]] +name = "codicon" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12170080f3533d6f09a19f81596f836854d0fa4867dc32c8172b8474b4e9de61" + +[[package]] +name = "colorchoice" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" + [[package]] name = "containerd-client" version = "0.4.0" @@ -281,14 +363,14 @@ dependencies = [ "tokio", "tonic", "tonic-build 0.9.2", - "tower", + "tower 0.4.13", ] [[package]] name = "core-foundation" -version = "0.9.3" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "194a7a9e6de53fa55116934067c844d9d749312f75c6f6d0980e8c252f8c2146" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" dependencies = [ "core-foundation-sys", "libc", @@ -296,24 +378,24 @@ dependencies = [ [[package]] name = "core-foundation-sys" -version = "0.8.3" +version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5827cebf4670468b8772dd191856768aedcb1b0278a04f989f7766351917b9dc" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" [[package]] name = "cpufeatures" -version = "0.2.5" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28d997bd5e24a5928dd43e46dc529867e207907fe0b239c3477d924f7f2ca320" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" dependencies = [ "libc", ] [[package]] name = "crc32fast" -version = "1.3.2" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" +checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" dependencies = [ "cfg-if", ] @@ -333,18 +415,18 @@ dependencies = [ [[package]] name = "crossbeam-channel" -version = "0.5.11" +version = "0.5.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "176dc175b78f56c0f321911d9c8eb2b77a78a4860b9c19db83835fea1a46649b" +checksum = "06ba6d68e24814cb8de6bb986db8222d3a027d15872cabc0d18817bc3c0e4471" dependencies = [ "crossbeam-utils", ] [[package]] name = "crossbeam-deque" -version = "0.8.5" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d" +checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" dependencies = [ "crossbeam-epoch", "crossbeam-utils", @@ -361,18 +443,18 @@ dependencies = [ [[package]] name = "crossbeam-queue" -version = "0.3.11" +version = "0.3.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df0346b5d5e76ac2fe4e327c5fd1118d6be7c51dfb18f9b7922923f287471e35" +checksum = "0f58bbc28f91df819d0aa2a2c00cd19754769c2fad90579b3592b1c9ba7a3115" dependencies = [ "crossbeam-utils", ] [[package]] name = "crossbeam-utils" -version = "0.8.19" +version = "0.8.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "248e3bacc7dc6baa3b21e405ee045c3047101a49145e7e9eca583ab4c2ca5345" +checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" [[package]] name = "crypto-common" @@ -386,9 +468,9 @@ dependencies = [ [[package]] name = "darling" -version = "0.20.9" +version = "0.20.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83b2eb4d90d12bdda5ed17de686c2acb4c57914f8f921b8da7e112b5a36f3fe1" +checksum = "fc7f46116c46ff9ab3eb1597a45688b6715c6e628b5c133e288e709a29bcb4ee" dependencies = [ "darling_core", "darling_macro", @@ -396,34 +478,40 @@ dependencies = [ [[package]] name = "darling_core" -version = "0.20.9" +version = "0.20.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "622687fe0bac72a04e5599029151f5796111b90f1baaa9b544d807a5e31cd120" +checksum = "0d00b9596d185e565c2207a0b01f8bd1a135483d02d9b7b0a54b11da8d53412e" dependencies = [ "fnv", "ident_case", "proc-macro2", "quote", - "strsim 0.11.1", - "syn 2.0.58", + "strsim", + "syn 2.0.100", ] [[package]] name = "darling_macro" -version = "0.20.9" +version = "0.20.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "733cabb43482b1a1b53eee8583c2b9e8684d592215ea83efd305dd31bc2f0178" +checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" dependencies = [ "darling_core", "quote", - "syn 2.0.58", + "syn 2.0.100", ] +[[package]] +name = "data-encoding" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "575f75dfd25738df5b91b8e43e14d44bda14637a58fae779fd2b064f8bf3e010" + [[package]] name = "deranged" -version = "0.3.11" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" +checksum = "28cfac68e08048ae1883171632c2aef3ebc555621ae56fbccce1cbf22dd7f058" dependencies = [ "powerfmt", ] @@ -441,46 +529,55 @@ dependencies = [ [[package]] name = "derive_builder" -version = "0.20.0" +version = "0.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0350b5cb0331628a5916d6c5c0b72e97393b8b6b03b47a9284f4e7f5a405ffd7" +checksum = "507dfb09ea8b7fa618fcf76e953f4f5e192547945816d5358edffe39f6f94947" dependencies = [ "derive_builder_macro", ] [[package]] name = "derive_builder_core" -version = "0.20.0" +version = "0.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d48cda787f839151732d396ac69e3473923d54312c070ee21e9effcaa8ca0b1d" +checksum = "2d5bcf7b024d6835cfb3d473887cd966994907effbe9227e8c8219824d06c4e8" dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.58", + "syn 2.0.100", ] [[package]] name = "derive_builder_macro" -version = "0.20.0" +version = "0.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "206868b8242f27cecce124c19fd88157fbd0dd334df2587f36417bafbc85097b" +checksum = "ab63b0e2bf4d5928aff72e83a7dace85d7bba5fe12dcc3c5a572d78caffd3f3c" dependencies = [ "derive_builder_core", - "syn 2.0.58", + "syn 2.0.100", ] [[package]] name = "digest" -version = "0.10.6" +version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8168378f4e5023e7218c89c891c0fd8ecdb5e5e4f18cb78f38cf245dd021e76f" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ "block-buffer", "crypto-common", "subtle", ] +[[package]] +name = "dirs" +version = "5.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44c45a9d03d6676652bcb5e724c7e988de1acad23a711b5217ab9cbecbec2225" +dependencies = [ + "dirs-sys", +] + [[package]] name = "dirs-next" version = "2.0.0" @@ -491,6 +588,18 @@ dependencies = [ "dirs-sys-next", ] +[[package]] +name = "dirs-sys" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "520f05a5cbd335fae5a99ff7a6ab8627577660ee5cfd6a94a6a929b52ff0321c" +dependencies = [ + "libc", + "option-ext", + "redox_users", + "windows-sys 0.48.0", +] + [[package]] name = "dirs-sys-next" version = "0.1.2" @@ -502,6 +611,17 @@ dependencies = [ "winapi", ] +[[package]] +name = "displaydoc" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", +] + [[package]] name = "docker_credential" version = "1.3.1" @@ -515,9 +635,9 @@ dependencies = [ [[package]] name = "either" -version = "1.9.0" +version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" +checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" [[package]] name = "env_logger" @@ -534,60 +654,36 @@ dependencies = [ [[package]] name = "equivalent" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" - -[[package]] -name = "errno" -version = "0.2.8" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f639046355ee4f37944e44f60642c6f3a7efa3cf6b78c78a0d989a8ce6c396a1" -dependencies = [ - "errno-dragonfly", - "libc", - "winapi", -] +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" [[package]] name = "errno" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" -dependencies = [ - "libc", - "windows-sys 0.52.0", -] - -[[package]] -name = "errno-dragonfly" -version = "0.1.2" +version = "0.3.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf" +checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d" dependencies = [ - "cc", "libc", + "windows-sys 0.59.0", ] [[package]] name = "fastrand" -version = "1.9.0" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be" -dependencies = [ - "instant", -] +checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" [[package]] name = "filetime" -version = "0.2.21" +version = "0.2.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cbc844cecaee9d4443931972e1289c8ff485cb4cc2767cb03ca139ed6885153" +checksum = "35c0522e981e68cbfa8c3f978441a5f34b30b96e146b33cd3359176b50fe8586" dependencies = [ "cfg-if", "libc", - "redox_syscall 0.2.16", - "windows-sys 0.48.0", + "libredox", + "windows-sys 0.59.0", ] [[package]] @@ -604,9 +700,9 @@ checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" [[package]] name = "flate2" -version = "1.0.26" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b9429470923de8e8cbd4d2dc513535400b4b3fef0319fb5c4e1f520a7bef743" +checksum = "11faaf5a5236997af9848be0bef4db95824b1d534ebc64d0f0c6cf3e67bd38dc" dependencies = [ "crc32fast", "libz-ng-sys", @@ -645,11 +741,10 @@ checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" [[package]] name = "form_urlencoded" -version = "1.0.1" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fc25a87fa4fd2094bffb06925852034d90a17f0d1e05197d4956d3555752191" +checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" dependencies = [ - "matches", "percent-encoding", ] @@ -665,9 +760,9 @@ dependencies = [ [[package]] name = "futures" -version = "0.3.28" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23342abe12aba583913b2e62f22225ff9c950774065e4bfb61a19cd9770fec40" +checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" dependencies = [ "futures-channel", "futures-core", @@ -680,9 +775,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.28" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "955518d47e09b25bbebc7a18df10b81f0c766eaf4c4f1cccef2fca5f2a4fb5f2" +checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" dependencies = [ "futures-core", "futures-sink", @@ -690,15 +785,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.28" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4bca583b7e26f571124fe5b7561d49cb2868d79116cfa0eefce955557c6fee8c" +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" [[package]] name = "futures-executor" -version = "0.3.28" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccecee823288125bd88b4d7f565c9e58e41858e47ab72e8ea2d64e93624386e0" +checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" dependencies = [ "futures-core", "futures-task", @@ -707,38 +802,38 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.28" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fff74096e71ed47f8e023204cfd0aa1289cd54ae5430a9523be060cdb849964" +checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" [[package]] name = "futures-macro" -version = "0.3.28" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72" +checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.58", + "syn 2.0.100", ] [[package]] name = "futures-sink" -version = "0.3.28" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f43be4fe21a13b9781a69afa4985b0f6ee0e1afab2c6f454a8cf30e2b2237b6e" +checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" [[package]] name = "futures-task" -version = "0.3.28" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76d3d132be6c0e6aa1534069c705a74a5997a356c0dc2f86a47765e5617c5b65" +checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" [[package]] name = "futures-util" -version = "0.3.28" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26b01e40b772d54cf6c6d721c1d1abd0647a0106a12ecaa1c186273392a69533" +checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" dependencies = [ "futures-channel", "futures-core", @@ -754,9 +849,9 @@ dependencies = [ [[package]] name = "generic-array" -version = "0.14.6" +version = "0.14.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bff49e947297f3312447abdca79f45f4738097cc82b06e72054d2223f601f1b9" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" dependencies = [ "typenum", "version_check", @@ -764,7 +859,7 @@ dependencies = [ [[package]] name = "genpolicy" -version = "0.1.0" +version = "3.2.0-azl3.genpolicy3" dependencies = [ "anyhow", "async-trait", @@ -783,7 +878,7 @@ dependencies = [ "oci-client", "oci-spec", "openssl", - "protobuf 3.3.0", + "protobuf 3.7.1", "protocols", "regex", "serde", @@ -798,52 +893,64 @@ dependencies = [ "tempfile", "tokio", "tonic", - "tower", - "zerocopy", + "tower 0.4.13", + "zerocopy 0.6.6", ] [[package]] name = "getrandom" -version = "0.2.12" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" +dependencies = [ + "cfg-if", + "libc", + "wasi 0.11.0+wasi-snapshot-preview1", +] + +[[package]] +name = "getrandom" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "190092ea657667030ac6a35e305e62fc4dd69fd98ac98631e5d3a2b1575a12b5" +checksum = "73fea8450eea4bac3940448fb7ae50d91f034f941199fcd9d909a5a07aa455f0" dependencies = [ "cfg-if", "libc", - "wasi", + "r-efi", + "wasi 0.14.2+wasi-0.2.4", ] [[package]] name = "getset" -version = "0.1.2" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e45727250e75cc04ff2846a66397da8ef2b3db8e40e0cef4df67950a07621eb9" +checksum = "f3586f256131df87204eb733da72e3d3eb4f343c639f4b7be279ac7c48baeafe" dependencies = [ - "proc-macro-error", + "proc-macro-error2", "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.100", ] [[package]] name = "gimli" -version = "0.28.0" +version = "0.31.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fb8d784f27acf97159b40fc4db5ecd8aa23b9ad5ef69cdd136d3bc80665f0c0" +checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" [[package]] name = "h2" -version = "0.3.16" +version = "0.3.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5be7b54589b581f624f566bf5d8eb2bab1db736c51528720b6bd36b96b55924d" +checksum = "81fe527a889e1532da5c525686d96d4c2e74cdd345badf8dfef9f6b39dd5f5e8" dependencies = [ - "bytes 1.10.0", + "bytes 1.10.1", "fnv", "futures-core", "futures-sink", "futures-util", - "http 0.2.9", - "indexmap 1.9.2", + "http 0.2.12", + "indexmap 2.8.0", "slab", "tokio", "tokio-util", @@ -858,9 +965,9 @@ checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" [[package]] name = "hashbrown" -version = "0.14.3" +version = "0.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" +checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" [[package]] name = "heck" @@ -885,9 +992,15 @@ checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" [[package]] name = "hermit-abi" -version = "0.3.1" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbd780fe5cc30f81464441920d82ac8740e2e46b29a6fad543ddd075229ce37e" + +[[package]] +name = "hex" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fed44880c466736ef9a5c5b5facefb5ed0785676d0c02d612db14e54f0d84286" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" [[package]] name = "hmac" @@ -909,43 +1022,43 @@ dependencies = [ [[package]] name = "http" -version = "0.2.9" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd6effc99afb63425aff9b05836f029929e345a6148a14b7ecd5ab67af944482" +checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" dependencies = [ - "bytes 1.10.0", + "bytes 1.10.1", "fnv", "itoa", ] [[package]] name = "http" -version = "1.2.0" +version = "1.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f16ca2af56261c99fba8bac40a10251ce8188205a4c448fbb745a2e4daa76fea" +checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565" dependencies = [ - "bytes 1.10.0", + "bytes 1.10.1", "fnv", "itoa", ] [[package]] name = "http-auth" -version = "0.1.8" +version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5430cacd7a1f9a02fbeb350dfc81a0e5ed42d81f3398cb0ba184017f85bdcfbc" +checksum = "150fa4a9462ef926824cf4519c84ed652ca8f4fbae34cb8af045b5cbcaf98822" dependencies = [ "memchr", ] [[package]] name = "http-body" -version = "0.4.5" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1" +checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" dependencies = [ - "bytes 1.10.0", - "http 0.2.9", + "bytes 1.10.1", + "http 0.2.12", "pin-project-lite", ] @@ -955,59 +1068,59 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" dependencies = [ - "bytes 1.10.0", - "http 1.2.0", + "bytes 1.10.1", + "http 1.3.1", ] [[package]] name = "http-body-util" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "793429d76616a256bcb62c2a2ec2bed781c8307e797e2598c50010f2bee2544f" +checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" dependencies = [ - "bytes 1.10.0", - "futures-util", - "http 1.2.0", + "bytes 1.10.1", + "futures-core", + "http 1.3.1", "http-body 1.0.1", "pin-project-lite", ] [[package]] name = "httparse" -version = "1.10.0" +version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2d708df4e7140240a16cd6ab0ab65c972d7433ab77819ea693fde9c43811e2a" +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" [[package]] name = "httpdate" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421" +checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" [[package]] name = "humantime" -version = "2.1.0" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" +checksum = "9b112acc8b3adf4b107a8ec20977da0273a8c386765a3ec0229bd500a1443f9f" [[package]] name = "hyper" -version = "0.14.24" +version = "0.14.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e011372fa0b68db8350aa7a248930ecc7839bf46d8485577d69f117a75f164c" +checksum = "41dfc780fdec9373c01bae43289ea34c972e40ee3c9f6b3c8801a35f35586ce7" dependencies = [ - "bytes 1.10.0", + "bytes 1.10.1", "futures-channel", "futures-core", "futures-util", "h2", - "http 0.2.9", - "http-body 0.4.5", + "http 0.2.12", + "http-body 0.4.6", "httparse", "httpdate", "itoa", "pin-project-lite", - "socket2 0.4.9", + "socket2", "tokio", "tower-service", "tracing", @@ -1020,10 +1133,10 @@ version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cc2b571658e38e0c01b1fdca3bbbe93c00d3d71693ff2770043f8c29bc7d6f80" dependencies = [ - "bytes 1.10.0", + "bytes 1.10.1", "futures-channel", "futures-util", - "http 1.2.0", + "http 1.3.1", "http-body 1.0.1", "httparse", "itoa", @@ -1039,7 +1152,7 @@ version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bbb958482e8c7be4bc3cf272a766a2b0bf1a6755e7a6ae777f017a31d11b13b1" dependencies = [ - "hyper 0.14.24", + "hyper 0.14.32", "pin-project-lite", "tokio", "tokio-io-timeout", @@ -1051,7 +1164,7 @@ version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" dependencies = [ - "bytes 1.10.0", + "bytes 1.10.1", "http-body-util", "hyper 1.6.0", "hyper-util", @@ -1063,18 +1176,19 @@ dependencies = [ [[package]] name = "hyper-util" -version = "0.1.10" +version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df2dcfbe0677734ab2f3ffa7fa7bfd4706bfdc1ef393f2ee30184aed67e631b4" +checksum = "497bbc33a26fdd4af9ed9c70d63f61cf56a938375fbb32df34db9b1cd6d643f2" dependencies = [ - "bytes 1.10.0", + "bytes 1.10.1", "futures-channel", "futures-util", - "http 1.2.0", + "http 1.3.1", "http-body 1.0.1", "hyper 1.6.0", + "libc", "pin-project-lite", - "socket2 0.5.5", + "socket2", "tokio", "tower-service", "tracing", @@ -1082,14 +1196,15 @@ dependencies = [ [[package]] name = "iana-time-zone" -version = "0.1.58" +version = "0.1.63" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8326b86b6cff230b97d0d312a6c40a60726df3332e721f72a1b035f451663b20" +checksum = "b0c919e5debc312ad217002b8048a17b7d83f80703865bbfcfebb0458b0b27d8" dependencies = [ "android_system_properties", "core-foundation-sys", "iana-time-zone-haiku", "js-sys", + "log", "wasm-bindgen", "windows-core", ] @@ -1103,6 +1218,124 @@ dependencies = [ "cc", ] +[[package]] +name = "icu_collections" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locid" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_locid_transform" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" +dependencies = [ + "displaydoc", + "icu_locid", + "icu_locid_transform_data", + "icu_provider", + "tinystr", + "zerovec", +] + +[[package]] +name = "icu_locid_transform_data" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7515e6d781098bf9f7205ab3fc7e9709d34554ae0b21ddbcb5febfa4bc7df11d" + +[[package]] +name = "icu_normalizer" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "utf16_iter", + "utf8_iter", + "write16", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5e8338228bdc8ab83303f16b797e177953730f601a96c25d10cb3ab0daa0cb7" + +[[package]] +name = "icu_properties" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_locid_transform", + "icu_properties_data", + "icu_provider", + "tinystr", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85fb8799753b75aee8d2a21d7c14d9f38921b54b3dbda10f5a3c7a7b82dba5e2" + +[[package]] +name = "icu_provider" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" +dependencies = [ + "displaydoc", + "icu_locid", + "icu_provider_macros", + "stable_deref_trait", + "tinystr", + "writeable", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_provider_macros" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", +] + [[package]] name = "ident_case" version = "1.0.1" @@ -1111,53 +1344,50 @@ checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" [[package]] name = "idna" -version = "0.2.3" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "418a0a6fab821475f634efe3ccc45c013f742efe03d853e8d3355d5cb850ecf8" +checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" dependencies = [ - "matches", - "unicode-bidi", - "unicode-normalization", + "idna_adapter", + "smallvec", + "utf8_iter", ] [[package]] -name = "indexmap" -version = "1.9.2" +name = "idna_adapter" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1885e79c1fc4b10f0e172c475f458b7f7b93061064d98c3293e98c5ba0c8b399" +checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71" dependencies = [ - "autocfg", - "hashbrown 0.12.3", + "icu_normalizer", + "icu_properties", ] [[package]] name = "indexmap" -version = "2.2.3" +version = "1.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "233cf39063f058ea2caae4091bf4a3ef70a653afbc026f5c4a4135d114e3c177" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" dependencies = [ - "equivalent", - "hashbrown 0.14.3", + "autocfg", + "hashbrown 0.12.3", ] [[package]] -name = "instant" -version = "0.1.12" +name = "indexmap" +version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" +checksum = "3954d50fe15b02142bf25d3b8bdadb634ec3948f103d04ffe3031bc8fe9d7058" dependencies = [ - "cfg-if", + "equivalent", + "hashbrown 0.15.2", ] [[package]] -name = "io-lifetimes" -version = "1.0.5" +name = "iocuddle" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1abeb7a0dd0f8181267ff8adc397075586500b81b28a73e8a0208b00fc170fb3" -dependencies = [ - "libc", - "windows-sys 0.45.0", -] +checksum = "d8972d5be69940353d5347a1344cb375d9b457d6809b428b05bb1ca2fb9ce007" [[package]] name = "iovec" @@ -1170,22 +1400,27 @@ dependencies = [ [[package]] name = "ipnet" -version = "2.7.1" +version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30e22bd8629359895450b59ea7a776c850561b96a3b1d31321c1949d9e6c9146" +checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" [[package]] name = "is-terminal" -version = "0.4.4" +version = "0.4.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21b6b32576413a8e69b90e952e4a026476040d81017b80445deda5f2d3921857" +checksum = "e04d7f318608d35d4b61ddd75cbdaee86b023ebe2bd5a66ee0915f0bf93095a9" dependencies = [ "hermit-abi", - "io-lifetimes", - "rustix 0.36.8", - "windows-sys 0.45.0", + "libc", + "windows-sys 0.59.0", ] +[[package]] +name = "is_terminal_polyfill" +version = "1.70.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" + [[package]] name = "itertools" version = "0.10.5" @@ -1197,9 +1432,9 @@ dependencies = [ [[package]] name = "itoa" -version = "1.0.6" +version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "453ad9f582a441959e5f0d088b02ce04cfe8d51a8eaf077f12ac6d3e94164ca6" +checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" [[package]] name = "js-sys" @@ -1268,9 +1503,12 @@ dependencies = [ "anyhow", "json-patch", "logging", + "protocols", "regorus", "serde", "serde_json", + "sev", + "sha2", "slog", "slog-scope", "slog-term", @@ -1279,32 +1517,54 @@ dependencies = [ ] [[package]] -name = "lazy_static" -version = "1.4.0" +name = "kvm-bindings" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" +checksum = "3b13baf7bdfda2e10bcb109fcb099ef40cff82374eb6b7cdcf4695bdec4e522c" +dependencies = [ + "vmm-sys-util", +] [[package]] -name = "libc" -version = "0.2.168" +name = "kvm-ioctls" +version = "0.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5aaeb2981e0606ca11d79718f8bb01164f1d6ed75080182d3abf017e6d244b6d" +checksum = "083c460d5a272c2f22205973e319147b791d92a288d7d7a8d4c6194f95229440" +dependencies = [ + "bitflags 2.9.0", + "kvm-bindings", + "libc", + "vmm-sys-util", +] [[package]] -name = "libredox" -version = "0.1.3" +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" + +[[package]] +name = "libc" +version = "0.2.171" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c19937216e9d3aa9956d9bb8dfc0b0c8beb6058fc4f7a4dc4d850edf86a237d6" + +[[package]] +name = "libredox" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" dependencies = [ - "bitflags 2.4.1", + "bitflags 2.9.0", "libc", + "redox_syscall", ] [[package]] name = "libz-ng-sys" -version = "1.1.15" +version = "1.1.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6409efc61b12687963e602df8ecf70e8ddacf95bc6576bcf16e3ac6328083c5" +checksum = "a7118c2c2a3c7b6edc279a8b19507672b9c4d716f95e671172dfa4e23f9fd824" dependencies = [ "cmake", "libc", @@ -1318,21 +1578,21 @@ checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" [[package]] name = "linux-raw-sys" -version = "0.1.4" +version = "0.4.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f051f77a7c8e6957c0696eac88f26b0117e54f52d3fc682ab19397a8812846a4" +checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" [[package]] name = "linux-raw-sys" -version = "0.3.7" +version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ece97ea872ece730aed82664c424eb4c8291e1ff2480247ccf7409044bc6479f" +checksum = "fe7db12097d22ec582439daf8618b8fdd1a7bef6270e9af3b1ebcd30893cf413" [[package]] -name = "linux-raw-sys" -version = "0.4.14" +name = "litemap" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" +checksum = "23fb14cb19457329c82206317a5663005a4d404783dc74f4252769b0d5f42856" [[package]] name = "lock_api" @@ -1346,9 +1606,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.22" +version = "0.4.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" +checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" [[package]] name = "logging" @@ -1364,12 +1624,6 @@ dependencies = [ "slog-term", ] -[[package]] -name = "matches" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2532096657941c2fea9c289d370a250971c689d4f143798ff67113ec042024a5" - [[package]] name = "matchit" version = "0.7.3" @@ -1402,17 +1656,17 @@ dependencies = [ [[package]] name = "mime" -version = "0.3.16" +version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a60c7ce501c71e03a9c9c0d35b861413ae925bd979cc7a4e30d060069aaac8d" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" [[package]] name = "miniz_oxide" -version = "0.7.1" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" +checksum = "8e3e04debbb59698c15bacbb6d93584a8c0ca9cc3213cb423d31f760d8843ce5" dependencies = [ - "adler", + "adler2", ] [[package]] @@ -1422,7 +1676,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" dependencies = [ "libc", - "wasi", + "wasi 0.11.0+wasi-snapshot-preview1", "windows-sys 0.52.0", ] @@ -1434,11 +1688,10 @@ checksum = "e5ce46fe64a9d73be07dcbe690a38ce1b293be448fd8ce1e6c1b8062c9f72c6a" [[package]] name = "native-tls" -version = "0.2.11" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07226173c32f2926027b63cce4bcd8076c3552846cbe7925f3aaffeac0a3b92e" +checksum = "87de3442987e9dbec73158d5c715e7ad9072fda936bb03d19d7fa10e00520f0e" dependencies = [ - "lazy_static", "libc", "log", "openssl", @@ -1493,9 +1746,9 @@ dependencies = [ [[package]] name = "object" -version = "0.32.1" +version = "0.36.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cf5f9dd3933bd50a9e1f149ec995f39ae2c496d31fd772c1fd45ebc27e902b0" +checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" dependencies = [ "memchr", ] @@ -1506,10 +1759,10 @@ version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0f5098b86f972ac3484f7c9011bbbbd64aaa7e21d10d2c1a91fefb4ad0ba2ad9" dependencies = [ - "bytes 1.10.0", + "bytes 1.10.1", "chrono", "futures-util", - "http 1.2.0", + "http 1.3.1", "http-auth", "jwt", "lazy_static", @@ -1544,9 +1797,9 @@ dependencies = [ [[package]] name = "olpc-cjson" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d637c9c15b639ccff597da8f4fa968300651ad2f1e968aefc3b4927a6fb2027a" +checksum = "696183c9b5fe81a7715d074fd632e8bd46f4ccc0231a3ed7fc580a80de5f7083" dependencies = [ "serde", "serde_json", @@ -1561,11 +1814,11 @@ checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" [[package]] name = "openssl" -version = "0.10.55" +version = "0.10.71" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "345df152bc43501c5eb9e4654ff05f794effb78d4efe3d53abc158baddc0703d" +checksum = "5e14130c6a98cd258fdcb0fb6d744152343ff729cbfcb28c656a9d12b999fbcd" dependencies = [ - "bitflags 1.3.2", + "bitflags 2.9.0", "cfg-if", "foreign-types", "libc", @@ -1576,35 +1829,35 @@ dependencies = [ [[package]] name = "openssl-macros" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b501e44f11665960c7e7fcf062c7d96a14ade4aa98116c004b2e37b5be7d736c" +checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.100", ] [[package]] name = "openssl-probe" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" +checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" [[package]] name = "openssl-src" -version = "111.28.2+1.1.1w" +version = "300.4.2+3.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb1830e20a48a975ca898ca8c1d036a36c3c6c5cb7dabc1c216706587857920f" +checksum = "168ce4e058f975fe43e89d9ccf78ca668601887ae736090aacc23ae353c298e2" dependencies = [ "cc", ] [[package]] name = "openssl-sys" -version = "0.9.90" +version = "0.9.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "374533b0e45f3a7ced10fcaeccca020e66656bc03dac384f852e4e5a7a8104a6" +checksum = "8bb61ea9811cc39e3c2069f40b8b8e2e70d8569b361f879786cc7ed48b777cdd" dependencies = [ "cc", "libc", @@ -1614,10 +1867,10 @@ dependencies = [ ] [[package]] -name = "os_str_bytes" -version = "6.4.1" +name = "option-ext" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b7820b9daea5457c9f21c69448905d723fbd21136ccf521748f23fd49e723ee" +checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" [[package]] name = "parking_lot" @@ -1637,16 +1890,16 @@ checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" dependencies = [ "cfg-if", "libc", - "redox_syscall 0.5.8", + "redox_syscall", "smallvec", "windows-targets 0.52.6", ] [[package]] name = "percent-encoding" -version = "2.1.0" +version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" [[package]] name = "petgraph" @@ -1655,44 +1908,44 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "467d164a6de56270bd7c4d070df81d07beace25012d5103ced4e9ff08d6afdb7" dependencies = [ "fixedbitset 0.2.0", - "indexmap 1.9.2", + "indexmap 1.9.3", ] [[package]] name = "petgraph" -version = "0.6.4" +version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1d3afd2628e69da2be385eb6f2fd57c8ac7977ceeff6dc166ff1657b0e386a9" +checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" dependencies = [ "fixedbitset 0.4.2", - "indexmap 2.2.3", + "indexmap 2.8.0", ] [[package]] name = "pin-project" -version = "1.1.4" +version = "1.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0302c4a0442c456bd56f841aee5c3bfd17967563f6fadc9ceb9f9c23cf3807e0" +checksum = "677f1add503faace112b9f1373e43e9e054bfdd22ff1a63c1bc485eaec6a6a8a" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.4" +version = "1.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "266c042b60c9c76b8d53061e52b2e0d1116abc57cefc8c5cd671619a56ac3690" +checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" dependencies = [ "proc-macro2", "quote", - "syn 2.0.58", + "syn 2.0.100", ] [[package]] name = "pin-project-lite" -version = "0.2.13" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58" +checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" [[package]] name = "pin-utils" @@ -1702,9 +1955,9 @@ checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] name = "pkg-config" -version = "0.3.26" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ac9a59f73473f1b8d852421e59e64809f025994837ef743615c6d0c5b305160" +checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" [[package]] name = "powerfmt" @@ -1714,9 +1967,12 @@ checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" [[package]] name = "ppv-lite86" -version = "0.2.17" +version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" +dependencies = [ + "zerocopy 0.8.24", +] [[package]] name = "prettyplease" @@ -1729,34 +1985,32 @@ dependencies = [ ] [[package]] -name = "proc-macro-error" -version = "1.0.4" +name = "proc-macro-error-attr2" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" +checksum = "96de42df36bb9bba5542fe9f1a054b8cc87e172759a1868aa05c1f3acc89dfc5" dependencies = [ - "proc-macro-error-attr", "proc-macro2", "quote", - "syn 1.0.109", - "version_check", ] [[package]] -name = "proc-macro-error-attr" -version = "1.0.4" +name = "proc-macro-error2" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" +checksum = "11ec05c52be0a07b08061f7dd003e7d7092e0472bc731b4af7bb1ef876109802" dependencies = [ + "proc-macro-error-attr2", "proc-macro2", "quote", - "version_check", + "syn 2.0.100", ] [[package]] name = "proc-macro2" -version = "1.0.78" +version = "1.0.94" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2422ad645d89c99f8f3e6b88a9fdeca7fabeac836b1002371c4367c8f984aae" +checksum = "a31971752e70b8b2686d7e46ec17fb38dad4051d94024c88df49b667caea9c84" dependencies = [ "unicode-ident", ] @@ -1767,7 +2021,7 @@ version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "de5e2533f59d08fcf364fd374ebda0692a70bd6d7e66ef97f306f45c6c5d8020" dependencies = [ - "bytes 1.10.0", + "bytes 1.10.1", "prost-derive 0.8.0", ] @@ -1777,7 +2031,7 @@ version = "0.11.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b82eaa1d779e9a4bc1c3217db8ffbeabaae1dca241bf70183242128d48681cd" dependencies = [ - "bytes 1.10.0", + "bytes 1.10.1", "prost-derive 0.11.9", ] @@ -1787,7 +2041,7 @@ version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "355f634b43cdd80724ee7848f95770e7e70eefa6dcf14fea676216573b8fd603" dependencies = [ - "bytes 1.10.0", + "bytes 1.10.1", "heck 0.3.3", "itertools", "log", @@ -1805,13 +2059,13 @@ version = "0.11.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "119533552c9a7ffacc21e099c24a0ac8bb19c2a2a3f363de84cd9b844feab270" dependencies = [ - "bytes 1.10.0", + "bytes 1.10.1", "heck 0.4.1", "itertools", "lazy_static", "log", "multimap", - "petgraph 0.6.4", + "petgraph 0.6.5", "prettyplease", "prost 0.11.9", "prost-types 0.11.9", @@ -1853,7 +2107,7 @@ version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "603bbd6394701d13f3f25aada59c7de9d35a6a5887cfc156181234a44002771b" dependencies = [ - "bytes 1.10.0", + "bytes 1.10.1", "prost 0.8.0", ] @@ -1874,9 +2128,9 @@ checksum = "106dd99e98437432fed6519dedecfade6a06a73bb7b2a1e019fdd2bee5778d94" [[package]] name = "protobuf" -version = "3.3.0" +version = "3.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b65f4a8ec18723a734e5dc09c173e0abf9690432da5340285d536edcb4dac190" +checksum = "a3a7c64d9bf75b1b8d981124c14c179074e8caa7dfe7b6a12e6222ddcd0c8f72" dependencies = [ "once_cell", "protobuf-support", @@ -1894,13 +2148,13 @@ dependencies = [ [[package]] name = "protobuf-codegen" -version = "3.3.0" +version = "3.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e85514a216b1c73111d9032e26cc7a5ecb1bb3d4d9539e91fb72a4395060f78" +checksum = "e26b833f144769a30e04b1db0146b2aaa53fd2fd83acf10a6b5f996606c18144" dependencies = [ "anyhow", "once_cell", - "protobuf 3.3.0", + "protobuf 3.7.1", "protobuf-parse", "regex", "tempfile", @@ -1909,14 +2163,14 @@ dependencies = [ [[package]] name = "protobuf-parse" -version = "3.3.0" +version = "3.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77d6fbd6697c9e531873e81cec565a85e226b99a0f10e1acc079be057fe2fcba" +checksum = "322330e133eab455718444b4e033ebfac7c6528972c784fcde28d2cc783c6257" dependencies = [ "anyhow", - "indexmap 1.9.2", + "indexmap 2.8.0", "log", - "protobuf 3.3.0", + "protobuf 3.7.1", "protobuf-support", "tempfile", "thiserror", @@ -1925,9 +2179,9 @@ dependencies = [ [[package]] name = "protobuf-support" -version = "3.3.0" +version = "3.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6872f4d4f4b98303239a2b5838f5bbbb77b01ffc892d627957f37a22d7cfe69c" +checksum = "b088fd20b938a875ea00843b6faf48579462630015c3788d397ad6a786663252" dependencies = [ "thiserror", ] @@ -1937,7 +2191,7 @@ name = "protocols" version = "0.1.0" dependencies = [ "oci-spec", - "protobuf 3.3.0", + "protobuf 3.7.1", "serde", "serde_json", "ttrpc", @@ -1946,13 +2200,19 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.36" +version = "1.0.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" +checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" dependencies = [ "proc-macro2", ] +[[package]] +name = "r-efi" +version = "5.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74765f6d916ee2faa39bc8e68e4f3ed8949b48cccdac59983d287a7cb71ce9c5" + [[package]] name = "rand" version = "0.8.5" @@ -1980,34 +2240,16 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ - "getrandom", -] - -[[package]] -name = "redox_syscall" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" -dependencies = [ - "bitflags 1.3.2", + "getrandom 0.2.15", ] [[package]] name = "redox_syscall" -version = "0.3.5" +version = "0.5.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" +checksum = "0b8c0c260b63a8219631167be35e6a988e9554dbd323f8bd08439c8ed1302bd1" dependencies = [ - "bitflags 1.3.2", -] - -[[package]] -name = "redox_syscall" -version = "0.5.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03a862b389f93e68874fbf580b9de08dd02facb9a788ebadaf4a3fd33cf58834" -dependencies = [ - "bitflags 2.4.1", + "bitflags 2.9.0", ] [[package]] @@ -2016,16 +2258,16 @@ version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" dependencies = [ - "getrandom", + "getrandom 0.2.15", "libredox", "thiserror", ] [[package]] name = "regex" -version = "1.10.5" +version = "1.10.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b91213439dad192326a0d7c6ee3955910425f441d7038e0d6933b0aec5c4517f" +checksum = "4219d74c6b67a3654a9fbebc4b419e22126d13d2f3c4a07ee0cb61ff79a79619" dependencies = [ "aho-corasick", "memchr", @@ -2035,9 +2277,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.7" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38caf58cc5ef2fed281f89292ef23f6365465ed9a41b7a7754eb4e26496c92df" +checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" dependencies = [ "aho-corasick", "memchr", @@ -2046,9 +2288,9 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.8.4" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b" +checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" [[package]] name = "regorus" @@ -2057,6 +2299,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "843c3d97f07e3b5ac0955d53ad0af4c91fe4a4f8525843ece5bf014f27829b73" dependencies = [ "anyhow", + "data-encoding", "lazy_static", "rand", "regex", @@ -2067,15 +2310,15 @@ dependencies = [ [[package]] name = "reqwest" -version = "0.12.4" +version = "0.12.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "566cafdd92868e0939d3fb961bd0dc25fcfaaed179291093b3d43e6b3150ea10" +checksum = "d19c46a6fdd48bc4dab94b6103fccc55d34c67cc0ad04653aad4ea2a07cd7bbb" dependencies = [ "base64 0.22.1", - "bytes 1.10.0", + "bytes 1.10.1", "futures-core", "futures-util", - "http 1.2.0", + "http 1.3.1", "http-body 1.0.1", "http-body-util", "hyper 1.6.0", @@ -2093,64 +2336,50 @@ dependencies = [ "serde", "serde_json", "serde_urlencoded", - "sync_wrapper", + "sync_wrapper 1.0.2", "tokio", "tokio-native-tls", "tokio-util", + "tower 0.5.2", "tower-service", "url", "wasm-bindgen", "wasm-bindgen-futures", "wasm-streams", "web-sys", - "winreg", + "windows-registry", ] [[package]] name = "rustc-demangle" -version = "0.1.23" +version = "0.1.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" +checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" [[package]] name = "rustix" -version = "0.36.8" +version = "0.38.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f43abb88211988493c1abb44a70efa56ff0ce98f233b7b276146f1f3f7ba9644" +checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" dependencies = [ - "bitflags 1.3.2", - "errno 0.2.8", - "io-lifetimes", + "bitflags 2.9.0", + "errno", "libc", - "linux-raw-sys 0.1.4", - "windows-sys 0.45.0", + "linux-raw-sys 0.4.15", + "windows-sys 0.59.0", ] [[package]] name = "rustix" -version = "0.37.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62b24138615de35e32031d041a09032ef3487a616d901ca4db224e7d557efae2" -dependencies = [ - "bitflags 1.3.2", - "errno 0.3.9", - "io-lifetimes", - "libc", - "linux-raw-sys 0.3.7", - "windows-sys 0.45.0", -] - -[[package]] -name = "rustix" -version = "0.38.36" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f55e80d50763938498dd5ebb18647174e0c76dc38c5505294bb224624f30f36" +checksum = "e56a18552996ac8d29ecc3b190b4fdbb2d91ca4ec396de7bbffaf43f3d637e96" dependencies = [ - "bitflags 2.4.1", - "errno 0.3.9", + "bitflags 2.9.0", + "errno", "libc", - "linux-raw-sys 0.4.14", - "windows-sys 0.52.0", + "linux-raw-sys 0.9.3", + "windows-sys 0.59.0", ] [[package]] @@ -2170,23 +2399,23 @@ checksum = "917ce264624a4b4db1c364dcc35bfca9ded014d0a958cd47ad3e960e988ea51c" [[package]] name = "rustversion" -version = "1.0.14" +version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4" +checksum = "eded382c5f5f786b989652c49544c4877d9f015cc22e145a5ea8ea66c2921cd2" [[package]] name = "ryu" -version = "1.0.13" +version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f91339c0467de62360649f8d3e185ca8de4224ff281f66000de5eb2a77a79041" +checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" [[package]] name = "schannel" -version = "0.1.21" +version = "0.1.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "713cfb06c7059f3588fb8044c0fad1d09e3c01d225e25b9220dbfdcf16dbb1b3" +checksum = "1f29ebaa345f945cec9fbbc532eb307f0fdad8161f281b6369539c8d84876b3d" dependencies = [ - "windows-sys 0.42.0", + "windows-sys 0.59.0", ] [[package]] @@ -2206,7 +2435,7 @@ checksum = "d2ee4885492bb655bfa05d039cd9163eb8fe9f79ddebf00ca23a1637510c2fd2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.58", + "syn 2.0.100", ] [[package]] @@ -2217,11 +2446,11 @@ checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] name = "security-framework" -version = "2.8.2" +version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a332be01508d814fed64bf28f798a146d73792121129962fdf335bb3c49a4254" +checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" dependencies = [ - "bitflags 1.3.2", + "bitflags 2.9.0", "core-foundation", "core-foundation-sys", "libc", @@ -2230,9 +2459,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.8.0" +version = "2.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31c9bb296072e961fcbd8853511dd39c2d8be2deb1e17c6860b1d30732b323b4" +checksum = "49db231d56a190491cb4aeda9527f1ad45345af50b0851622a7adb8c03b01c32" dependencies = [ "core-foundation-sys", "libc", @@ -2240,13 +2469,22 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.210" +version = "1.0.219" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8e3592472072e6e22e0a54d5904d9febf8508f65fb8552499a1abc7d1078c3a" +checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" dependencies = [ "serde_derive", ] +[[package]] +name = "serde-big-array" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11fc7cc2c76d73e0f27ee52abbd64eec84d46f370c88371120433196934e4b7f" +dependencies = [ + "serde", +] + [[package]] name = "serde-transcode" version = "1.1.1" @@ -2256,31 +2494,40 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_bytes" +version = "0.11.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8437fd221bde2d4ca316d61b90e337e9e702b3820b87d63caa9ba6c02bd06d96" +dependencies = [ + "serde", +] + [[package]] name = "serde_derive" -version = "1.0.210" +version = "1.0.219" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "243902eda00fad750862fc144cea25caca5e20d615af0a81bee94ca738f1df1f" +checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" dependencies = [ "proc-macro2", "quote", - "syn 2.0.58", + "syn 2.0.100", ] [[package]] name = "serde_ignored" -version = "0.1.7" +version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94eb4a4087ba8bdf14a9208ac44fddbf55c01a6195f7edfc511ddaff6cae45a6" +checksum = "566da67d80e92e009728b3731ff0e5360cb181432b8ca73ea30bb1d170700d76" dependencies = [ "serde", ] [[package]] name = "serde_json" -version = "1.0.133" +version = "1.0.140" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7fceb2473b9166b2294ef05efcb65a3db80803f0b03ef86a5fc88a2b85ee377" +checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" dependencies = [ "itoa", "memchr", @@ -2306,23 +2553,50 @@ version = "0.8.26" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "578a7433b776b56a35785ed5ce9a7e777ac0598aac5a6dd1b4b18a307c7fc71b" dependencies = [ - "indexmap 1.9.2", + "indexmap 1.9.3", "ryu", "serde", "yaml-rust", ] +[[package]] +name = "sev" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fd749a01c88a51ac718b59fe571177b31e478dfe059267977042477a0531224" +dependencies = [ + "bincode", + "bitfield", + "bitflags 1.3.2", + "codicon", + "dirs", + "hex", + "iocuddle", + "kvm-ioctls", + "serde", + "serde-big-array", + "serde_bytes", + "static_assertions", + "uuid", +] + [[package]] name = "sha2" -version = "0.10.6" +version = "0.10.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82e6b795fe2e3b1e845bafcb27aa35405c4d47cdfc92af5fc8d3002f76cebdc0" +checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" dependencies = [ "cfg-if", "cpufeatures", "digest", ] +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + [[package]] name = "signal-hook-registry" version = "1.4.2" @@ -2334,9 +2608,9 @@ dependencies = [ [[package]] name = "slab" -version = "0.4.8" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6528351c9bc8ab22353f9d776db39a20288e8d6c37ef8cfe3317cf875eecfc2d" +checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" dependencies = [ "autocfg", ] @@ -2397,35 +2671,31 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.13.2" +version = "1.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" +checksum = "7fcf8323ef1faaee30a44a340193b1ac6814fd9b7b4e88e9d4519a3e4abe1cfd" [[package]] name = "socket2" -version = "0.4.9" +version = "0.5.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64a4a911eed85daf18834cfaa86a79b7d266ff93ff5ba14005426219480ed662" +checksum = "4f5fd57c80058a56cf5c777ab8a126398ece8e442983605d280a44ce79d0edef" dependencies = [ "libc", - "winapi", + "windows-sys 0.52.0", ] [[package]] -name = "socket2" -version = "0.5.5" +name = "stable_deref_trait" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b5fac59a5cb5dd637972e5fca70daf0523c9067fcdc4842f053dae04a18f8e9" -dependencies = [ - "libc", - "windows-sys 0.48.0", -] +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" [[package]] -name = "strsim" -version = "0.10.0" +name = "static_assertions" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" [[package]] name = "strsim" @@ -2449,14 +2719,14 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn 2.0.58", + "syn 2.0.100", ] [[package]] name = "subtle" -version = "2.4.1" +version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] name = "syn" @@ -2471,9 +2741,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.58" +version = "2.0.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44cfb93f38070beee36b3fef7d4f5a16f27751d94b187b666a5cc5e9b0d30687" +checksum = "b09a44accad81e1ba1cd74a32461ba89dee89095ba17b32f5d03683b1b1fc2a0" dependencies = [ "proc-macro2", "quote", @@ -2486,6 +2756,26 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" +[[package]] +name = "sync_wrapper" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" +dependencies = [ + "futures-core", +] + +[[package]] +name = "synstructure" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", +] + [[package]] name = "take_mut" version = "0.2.2" @@ -2494,9 +2784,9 @@ checksum = "f764005d11ee5f36500a149ace24e00e3da98b0158b3e2d53a7495660d3f4d60" [[package]] name = "tar" -version = "0.4.41" +version = "0.4.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb797dad5fb5b76fcf519e702f4a589483b5ef06567f160c392832c1f5e44909" +checksum = "1d863878d212c87a19c1a610eb53bb01fe12951c0501cf5a0d65f724914a667a" dependencies = [ "filetime", "libc", @@ -2506,32 +2796,30 @@ dependencies = [ [[package]] name = "tarfs-defs" version = "0.1.0" -source = "git+https://github.com/kata-containers/tardev-snapshotter?rev=06183a5#06183a5e2a83c3261740f4f0f6ce4aa16b14e436" dependencies = [ - "zerocopy", + "zerocopy 0.6.6", ] [[package]] name = "tarindex" version = "0.1.0" -source = "git+https://github.com/kata-containers/tardev-snapshotter?rev=06183a5#06183a5e2a83c3261740f4f0f6ce4aa16b14e436" dependencies = [ "tar", "tarfs-defs", - "zerocopy", + "zerocopy 0.6.6", ] [[package]] name = "tempfile" -version = "3.5.0" +version = "3.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9fbec84f381d5795b08656e4912bec604d162bff9291d6189a78f4c8ab87998" +checksum = "7437ac7763b9b123ccf33c338a5cc1bac6f69b45a136c19bdd8a65e3916435bf" dependencies = [ - "cfg-if", "fastrand", - "redox_syscall 0.3.5", - "rustix 0.37.3", - "windows-sys 0.45.0", + "getrandom 0.3.2", + "once_cell", + "rustix 1.0.3", + "windows-sys 0.59.0", ] [[package]] @@ -2547,31 +2835,31 @@ dependencies = [ [[package]] name = "termcolor" -version = "1.2.0" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be55cf8942feac5c765c2c993422806843c9a9a45d4d5c407ad6dd2ea95eb9b6" +checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" dependencies = [ "winapi-util", ] [[package]] name = "thiserror" -version = "1.0.40" +version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "978c9a314bd8dc99be594bc3c175faaa9794be04a5a5e153caba6915336cebac" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.40" +version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9456a42c5b0d803c8cd86e73dd7cc9edd429499f37a3550d286d5e86720569f" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.58", + "syn 2.0.100", ] [[package]] @@ -2586,9 +2874,9 @@ dependencies = [ [[package]] name = "time" -version = "0.3.37" +version = "0.3.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35e7868883861bd0e56d9ac6efcaaca0d6d5d82a2a7ec8209ff492c07cf37b21" +checksum = "8a7619e19bc266e0f9c5e6686659d394bc57973859340060a69221e57dbc0c40" dependencies = [ "deranged", "itoa", @@ -2601,25 +2889,35 @@ dependencies = [ [[package]] name = "time-core" -version = "0.1.2" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" +checksum = "c9e9a38711f559d9e3ce1cdb06dd7c5b8ea546bc90052da6d06bb76da74bb07c" [[package]] name = "time-macros" -version = "0.2.19" +version = "0.2.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2834e6017e3e5e4b9834939793b282bc03b37a3336245fa820e35e233e2a85de" +checksum = "3526739392ec93fd8b359c8e98514cb3e8e021beb4e5f597b00a0221f8ed8a49" dependencies = [ "num-conv", "time-core", ] +[[package]] +name = "tinystr" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" +dependencies = [ + "displaydoc", + "zerovec", +] + [[package]] name = "tinyvec" -version = "1.6.0" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" +checksum = "09b3661f17e86524eccd4371ab0429194e0d7c008abb45f7a7495b1719463c71" dependencies = [ "tinyvec_macros", ] @@ -2632,18 +2930,18 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.42.0" +version = "1.44.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cec9b21b0450273377fc97bd4c33a8acffc8c996c987a7c5b319a0083707551" +checksum = "f382da615b842244d4b8738c82ed1275e6c5dd90c459a30941cd07080b06c91a" dependencies = [ "backtrace", - "bytes 1.10.0", + "bytes 1.10.1", "libc", "mio", "parking_lot", "pin-project-lite", "signal-hook-registry", - "socket2 0.5.5", + "socket2", "tokio-macros", "windows-sys 0.52.0", ] @@ -2660,13 +2958,13 @@ dependencies = [ [[package]] name = "tokio-macros" -version = "2.4.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" +checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.58", + "syn 2.0.100", ] [[package]] @@ -2681,9 +2979,9 @@ dependencies = [ [[package]] name = "tokio-stream" -version = "0.1.14" +version = "0.1.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "397c988d37662c7dda6d2208364a706264bf3d6138b11d436cbac0ad38832842" +checksum = "eca58d7bba4a75707817a2c44174253f9236b2d5fbd055602e9d5c07c139a047" dependencies = [ "futures-core", "pin-project-lite", @@ -2692,16 +2990,15 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.7" +version = "0.7.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5427d89453009325de0d8f342c9490009f76e999cb7672d77e46267448f7e6b2" +checksum = "6b9590b93e6fcc1739458317cccd391ad3955e2bde8913edf6f95f9e65a8f034" dependencies = [ - "bytes 1.10.0", + "bytes 1.10.1", "futures-core", "futures-sink", "pin-project-lite", "tokio", - "tracing", ] [[package]] @@ -2726,20 +3023,20 @@ dependencies = [ "async-trait", "axum", "base64 0.21.7", - "bytes 1.10.0", + "bytes 1.10.1", "futures-core", "futures-util", "h2", - "http 0.2.9", - "http-body 0.4.5", - "hyper 0.14.24", + "http 0.2.12", + "http-body 0.4.6", + "hyper 0.14.32", "hyper-timeout", "percent-encoding", "pin-project", "prost 0.11.9", "tokio", "tokio-stream", - "tower", + "tower 0.4.13", "tower-layer", "tower-service", "tracing", @@ -2779,7 +3076,7 @@ checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" dependencies = [ "futures-core", "futures-util", - "indexmap 1.9.2", + "indexmap 1.9.3", "pin-project", "pin-project-lite", "rand", @@ -2791,25 +3088,39 @@ dependencies = [ "tracing", ] +[[package]] +name = "tower" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" +dependencies = [ + "futures-core", + "futures-util", + "pin-project-lite", + "sync_wrapper 1.0.2", + "tokio", + "tower-layer", + "tower-service", +] + [[package]] name = "tower-layer" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0" +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" [[package]] name = "tower-service" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" [[package]] name = "tracing" -version = "0.1.37" +version = "0.1.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8" +checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" dependencies = [ - "cfg-if", "log", "pin-project-lite", "tracing-attributes", @@ -2818,29 +3129,29 @@ dependencies = [ [[package]] name = "tracing-attributes" -version = "0.1.23" +version = "0.1.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4017f8f45139870ca7e672686113917c71c7a6e02d4924eda67186083c03081a" +checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.100", ] [[package]] name = "tracing-core" -version = "0.1.30" +version = "0.1.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24eb03ba0eab1fd845050058ce5e616558e8f8d8fca633e6b163fe25c797213a" +checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" dependencies = [ "once_cell", ] [[package]] name = "try-lock" -version = "0.2.4" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3528ecfd12c466c6f163363caf2d02a71161dd5e1cc6ae7b34207ea2d42d81ed" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" [[package]] name = "ttrpc" @@ -2854,8 +3165,8 @@ dependencies = [ "libc", "log", "nix 0.26.4", - "protobuf 3.3.0", - "protobuf-codegen 3.3.0", + "protobuf 3.7.1", + "protobuf-codegen 3.7.1", "thiserror", "windows-sys 0.48.0", ] @@ -2867,7 +3178,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94d7f7631d7a9ebed715a47cd4cb6072cbc7ae1d4ec01598971bbec0024340c2" dependencies = [ "protobuf 2.28.0", - "protobuf-codegen 3.3.0", + "protobuf-codegen 3.7.1", "protobuf-support", "ttrpc-compiler", ] @@ -2889,57 +3200,75 @@ dependencies = [ [[package]] name = "typenum" -version = "1.16.0" +version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba" +checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" [[package]] name = "unicase" -version = "2.6.0" +version = "2.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50f37be617794602aabbeee0be4f259dc1778fabe05e2d67ee8f79326d5cb4f6" -dependencies = [ - "version_check", -] - -[[package]] -name = "unicode-bidi" -version = "0.3.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d54675592c1dbefd78cbd98db9bacd89886e1ca50692a0692baefffdeb92dd58" +checksum = "75b844d17643ee918803943289730bec8aac480150456169e647ed0b576ba539" [[package]] name = "unicode-ident" -version = "1.0.7" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "775c11906edafc97bc378816b94585fbd9a054eabaf86fdd0ced94af449efab7" +checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" [[package]] name = "unicode-normalization" -version = "0.1.22" +version = "0.1.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" +checksum = "5033c97c4262335cded6d6fc3e5c18ab755e1a3dc96376350f3d8e9f009ad956" dependencies = [ "tinyvec", ] [[package]] name = "unicode-segmentation" -version = "1.10.1" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1dd624098567895118886609431a7c3b8f516e41d30e0643f03d94592a147e36" +checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" [[package]] name = "url" -version = "2.3.0" +version = "2.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22fe195a4f217c25b25cb5058ced57059824a678474874038dc88d211bf508d3" +checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" dependencies = [ "form_urlencoded", "idna", "percent-encoding", ] +[[package]] +name = "utf16_iter" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" + +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + +[[package]] +name = "utf8parse" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" + +[[package]] +name = "uuid" +version = "1.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "458f7a779bf54acc9f347480ac654f68407d3aab21269a6e3c9f922acd9e2da9" +dependencies = [ + "serde", +] + [[package]] name = "vcpkg" version = "0.2.15" @@ -2948,9 +3277,19 @@ checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" [[package]] name = "version_check" -version = "0.9.4" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "vmm-sys-util" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d1435039746e20da4f8d507a72ee1b916f7b4b05af7a91c093d2c6561934ede" +dependencies = [ + "bitflags 1.3.2", + "libc", +] [[package]] name = "vsock" @@ -2964,11 +3303,10 @@ dependencies = [ [[package]] name = "want" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ce8a968cb1cd110d136ff8b819a556d6fb6d919363c61534f6860c7eb172ba0" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" dependencies = [ - "log", "try-lock", ] @@ -2978,6 +3316,15 @@ version = "0.11.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" +[[package]] +name = "wasi" +version = "0.14.2+wasi-0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" +dependencies = [ + "wit-bindgen-rt", +] + [[package]] name = "wasm-bindgen" version = "0.2.100" @@ -3000,7 +3347,7 @@ dependencies = [ "log", "proc-macro2", "quote", - "syn 2.0.58", + "syn 2.0.100", "wasm-bindgen-shared", ] @@ -3035,7 +3382,7 @@ checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" dependencies = [ "proc-macro2", "quote", - "syn 2.0.58", + "syn 2.0.100", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -3051,9 +3398,9 @@ dependencies = [ [[package]] name = "wasm-streams" -version = "0.4.1" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e072d4e72f700fb3443d8fe94a39315df013eef1104903cdb0a2abd322bbecd" +checksum = "15053d8d85c7eccdbefef60f06769760a563c7f0a9d6902a13d35c7800b0ad65" dependencies = [ "futures-util", "js-sys", @@ -3081,7 +3428,7 @@ dependencies = [ "either", "home", "once_cell", - "rustix 0.38.36", + "rustix 0.38.44", ] [[package]] @@ -3102,11 +3449,11 @@ checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" [[package]] name = "winapi-util" -version = "0.1.5" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" +checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" dependencies = [ - "winapi", + "windows-sys 0.59.0", ] [[package]] @@ -3117,35 +3464,81 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] name = "windows-core" -version = "0.50.0" +version = "0.61.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af6041b3f84485c21b57acdc0fee4f4f0c93f426053dc05fa5d6fc262537bbff" +checksum = "4763c1de310c86d75a878046489e2e5ba02c649d185f21c67d4cf8a56d098980" dependencies = [ - "windows-targets 0.48.0", + "windows-implement", + "windows-interface", + "windows-link", + "windows-result", + "windows-strings 0.4.0", ] [[package]] -name = "windows-sys" -version = "0.42.0" +name = "windows-implement" +version = "0.60.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", +] + +[[package]] +name = "windows-interface" +version = "0.59.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7" +checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8" dependencies = [ - "windows_aarch64_gnullvm 0.42.1", - "windows_aarch64_msvc 0.42.1", - "windows_i686_gnu 0.42.1", - "windows_i686_msvc 0.42.1", - "windows_x86_64_gnu 0.42.1", - "windows_x86_64_gnullvm 0.42.1", - "windows_x86_64_msvc 0.42.1", + "proc-macro2", + "quote", + "syn 2.0.100", ] [[package]] -name = "windows-sys" -version = "0.45.0" +name = "windows-link" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" +checksum = "76840935b766e1b0a05c0066835fb9ec80071d4c09a16f6bd5f7e655e3c14c38" + +[[package]] +name = "windows-registry" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4286ad90ddb45071efd1a66dfa43eb02dd0dfbae1545ad6cc3c51cf34d7e8ba3" dependencies = [ - "windows-targets 0.42.1", + "windows-result", + "windows-strings 0.3.1", + "windows-targets 0.53.0", +] + +[[package]] +name = "windows-result" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c64fd11a4fd95df68efcfee5f44a294fe71b8bc6a91993e2791938abcc712252" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-strings" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87fa48cc5d406560701792be122a10132491cff9d0aeb23583cc2dcafc847319" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-strings" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a2ba9642430ee452d5a7aa78d72907ebe8cfda358e8cb7918a2050581322f97" +dependencies = [ + "windows-link", ] [[package]] @@ -3154,7 +3547,7 @@ version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" dependencies = [ - "windows-targets 0.48.0", + "windows-targets 0.48.5", ] [[package]] @@ -3167,33 +3560,27 @@ dependencies = [ ] [[package]] -name = "windows-targets" -version = "0.42.1" +name = "windows-sys" +version = "0.59.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e2522491fbfcd58cc84d47aeb2958948c4b8982e9a2d8a2a35bbaed431390e7" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" dependencies = [ - "windows_aarch64_gnullvm 0.42.1", - "windows_aarch64_msvc 0.42.1", - "windows_i686_gnu 0.42.1", - "windows_i686_msvc 0.42.1", - "windows_x86_64_gnu 0.42.1", - "windows_x86_64_gnullvm 0.42.1", - "windows_x86_64_msvc 0.42.1", + "windows-targets 0.52.6", ] [[package]] name = "windows-targets" -version = "0.48.0" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b1eb6f0cd7c80c79759c929114ef071b87354ce476d9d94271031c0497adfd5" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" dependencies = [ - "windows_aarch64_gnullvm 0.48.0", - "windows_aarch64_msvc 0.48.0", - "windows_i686_gnu 0.48.0", - "windows_i686_msvc 0.48.0", - "windows_x86_64_gnu 0.48.0", - "windows_x86_64_gnullvm 0.48.0", - "windows_x86_64_msvc 0.48.0", + "windows_aarch64_gnullvm 0.48.5", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm 0.48.5", + "windows_x86_64_msvc 0.48.5", ] [[package]] @@ -3205,7 +3592,7 @@ dependencies = [ "windows_aarch64_gnullvm 0.52.6", "windows_aarch64_msvc 0.52.6", "windows_i686_gnu 0.52.6", - "windows_i686_gnullvm", + "windows_i686_gnullvm 0.52.6", "windows_i686_msvc 0.52.6", "windows_x86_64_gnu 0.52.6", "windows_x86_64_gnullvm 0.52.6", @@ -3213,16 +3600,26 @@ dependencies = [ ] [[package]] -name = "windows_aarch64_gnullvm" -version = "0.42.1" +name = "windows-targets" +version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c9864e83243fdec7fc9c5444389dcbbfd258f745e7853198f365e3c4968a608" +checksum = "b1e4c7e8ceaaf9cb7d7507c974735728ab453b67ef8f18febdd7c11fe59dca8b" +dependencies = [ + "windows_aarch64_gnullvm 0.53.0", + "windows_aarch64_msvc 0.53.0", + "windows_i686_gnu 0.53.0", + "windows_i686_gnullvm 0.53.0", + "windows_i686_msvc 0.53.0", + "windows_x86_64_gnu 0.53.0", + "windows_x86_64_gnullvm 0.53.0", + "windows_x86_64_msvc 0.53.0", +] [[package]] name = "windows_aarch64_gnullvm" -version = "0.48.0" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" [[package]] name = "windows_aarch64_gnullvm" @@ -3231,16 +3628,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" [[package]] -name = "windows_aarch64_msvc" -version = "0.42.1" +name = "windows_aarch64_gnullvm" +version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c8b1b673ffc16c47a9ff48570a9d85e25d265735c503681332589af6253c6c7" +checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764" [[package]] name = "windows_aarch64_msvc" -version = "0.48.0" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" [[package]] name = "windows_aarch64_msvc" @@ -3249,16 +3646,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" [[package]] -name = "windows_i686_gnu" -version = "0.42.1" +name = "windows_aarch64_msvc" +version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de3887528ad530ba7bdbb1faa8275ec7a1155a45ffa57c37993960277145d640" +checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c" [[package]] name = "windows_i686_gnu" -version = "0.48.0" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" [[package]] name = "windows_i686_gnu" @@ -3266,6 +3663,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" +[[package]] +name = "windows_i686_gnu" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1dc67659d35f387f5f6c479dc4e28f1d4bb90ddd1a5d3da2e5d97b42d6272c3" + [[package]] name = "windows_i686_gnullvm" version = "0.52.6" @@ -3273,16 +3676,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" [[package]] -name = "windows_i686_msvc" -version = "0.42.1" +name = "windows_i686_gnullvm" +version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf4d1122317eddd6ff351aa852118a2418ad4214e6613a50e0191f7004372605" +checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11" [[package]] name = "windows_i686_msvc" -version = "0.48.0" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" [[package]] name = "windows_i686_msvc" @@ -3291,16 +3694,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" [[package]] -name = "windows_x86_64_gnu" -version = "0.42.1" +name = "windows_i686_msvc" +version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1040f221285e17ebccbc2591ffdc2d44ee1f9186324dd3e84e99ac68d699c45" +checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d" [[package]] name = "windows_x86_64_gnu" -version = "0.48.0" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" [[package]] name = "windows_x86_64_gnu" @@ -3309,16 +3712,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" [[package]] -name = "windows_x86_64_gnullvm" -version = "0.42.1" +name = "windows_x86_64_gnu" +version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "628bfdf232daa22b0d64fdb62b09fcc36bb01f05a3939e20ab73aaf9470d0463" +checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba" [[package]] name = "windows_x86_64_gnullvm" -version = "0.48.0" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" [[package]] name = "windows_x86_64_gnullvm" @@ -3327,16 +3730,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" [[package]] -name = "windows_x86_64_msvc" -version = "0.42.1" +name = "windows_x86_64_gnullvm" +version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "447660ad36a13288b1db4d4248e857b510e8c3a225c822ba4fb748c0aafecffd" +checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57" [[package]] name = "windows_x86_64_msvc" -version = "0.48.0" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" [[package]] name = "windows_x86_64_msvc" @@ -3345,24 +3748,40 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] -name = "winreg" -version = "0.52.0" +name = "windows_x86_64_msvc" +version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a277a57398d4bfa075df44f501a17cfdf8542d224f0d36095a2adc7aee4ef0a5" +checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" + +[[package]] +name = "wit-bindgen-rt" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" dependencies = [ - "cfg-if", - "windows-sys 0.48.0", + "bitflags 2.9.0", ] +[[package]] +name = "write16" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" + +[[package]] +name = "writeable" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" + [[package]] name = "xattr" -version = "1.3.1" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8da84f1a25939b27f6820d92aed108f83ff920fdf11a7b19366c27c4cda81d4f" +checksum = "0d65cbf2f12c15564212d48f4e3dfb87923d25d611f2aed18f4cb23f0413d89e" dependencies = [ "libc", - "linux-raw-sys 0.4.14", - "rustix 0.38.36", + "rustix 1.0.3", ] [[package]] @@ -3374,23 +3793,110 @@ dependencies = [ "linked-hash-map", ] +[[package]] +name = "yoke" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40" +dependencies = [ + "serde", + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", + "synstructure", +] + [[package]] name = "zerocopy" -version = "0.6.1" +version = "0.6.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "332f188cc1bcf1fe1064b8c58d150f497e697f49774aa846f2dc949d9a25f236" +checksum = "854e949ac82d619ee9a14c66a1b674ac730422372ccb759ce0c39cabcf2bf8e6" dependencies = [ "byteorder", - "zerocopy-derive", + "zerocopy-derive 0.6.6", +] + +[[package]] +name = "zerocopy" +version = "0.8.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2586fea28e186957ef732a5f8b3be2da217d65c5969d4b1e17f973ebbe876879" +dependencies = [ + "zerocopy-derive 0.8.24", ] [[package]] name = "zerocopy-derive" -version = "0.3.2" +version = "0.6.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6505e6815af7de1746a08f69c69606bb45695a17149517680f3b2149713b19a3" +checksum = "125139de3f6b9d625c39e2efdd73d41bdac468ccd556556440e322be0e1bbd91" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.100", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a996a8f63c5c4448cd959ac1bab0aaa3306ccfd060472f85943ee0750f0169be" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", +] + +[[package]] +name = "zerofrom" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", + "synstructure", +] + +[[package]] +name = "zerovec" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", ] diff --git a/src/tools/genpolicy/Cargo.toml b/src/tools/genpolicy/Cargo.toml index 06587f4e0e9b..8fb1618d6f0f 100644 --- a/src/tools/genpolicy/Cargo.toml +++ b/src/tools/genpolicy/Cargo.toml @@ -5,7 +5,7 @@ [package] name = "genpolicy" -version = "0.1.0" +version = "3.2.0-azl3.genpolicy3" authors = ["The Kata Containers community "] edition = "2021" license = "Apache-2.0" @@ -54,12 +54,12 @@ oci-spec = { version = "0.6.8", features = ["runtime"] } # Kata Agent protocol. protocols = { path = "../../libs/protocols", features = ["with-serde"] } -protobuf = "3.2.0" +protobuf = "=3.7.1" # dm-verity root hash support generic-array = "0.14.6" sha2 = "0.10.6" -tarindex = { git = "https://github.com/kata-containers/tardev-snapshotter", rev = "06183a5" } +tarindex = { path = "../../tardev-snapshotter/tarindex" } tempfile = "3.5.0" zerocopy = "0.6.1" fs2 = "0.4.3" @@ -68,6 +68,7 @@ fs2 = "0.4.3" k8s-cri = "0.7.0" tonic = "0.9.2" tower = "0.4.13" +[target.'cfg(target_os = "linux")'.dependencies] containerd-client = "0.4.0" # username to UID:GID mapping support diff --git a/src/tools/genpolicy/Makefile b/src/tools/genpolicy/Makefile index 532af7eec212..bc741faad2d9 100644 --- a/src/tools/genpolicy/Makefile +++ b/src/tools/genpolicy/Makefile @@ -24,7 +24,7 @@ $(GENERATED_FILES): %: %.in default: build build: $(GENERATED_FILES) - @RUSTFLAGS="$(EXTRA_RUSTFLAGS) --deny warnings" cargo build --target $(TRIPLE) --$(BUILD_TYPE) + @RUSTFLAGS="$(EXTRA_RUSTFLAGS) --deny warnings" cargo build --target $(TRIPLE) $(if $(findstring release,$(BUILD_TYPE)),--release) static-checks-build: @echo "INFO: static-checks-build do nothing.." @@ -36,8 +36,9 @@ clean: vendor: cargo vendor +# todo: --target $(TRIPLE) doesn't work test: $(GENERATED_FILES) - @RUSTFLAGS="$(EXTRA_RUSTFLAGS) --deny warnings" cargo test --all-targets --all-features --target $(TRIPLE) + @RUSTFLAGS="$(EXTRA_RUSTFLAGS --deny warnings)" cargo test --all-targets --all-features install: $(GENERATED_FILES) @RUSTFLAGS="$(EXTRA_RUSTFLAGS) --deny warnings" cargo install --locked --target $(TRIPLE) --path . diff --git a/src/tools/genpolicy/genpolicy-settings.json b/src/tools/genpolicy/genpolicy-settings.json index 56f8154fc486..55fb4da78c7b 100644 --- a/src/tools/genpolicy/genpolicy-settings.json +++ b/src/tools/genpolicy/genpolicy-settings.json @@ -1,7 +1,7 @@ { "pause_container": { "Root": { - "Path": "$(cpath)/$(bundle-id)/rootfs", + "Path": "$(cpath)/$(bundle-id)", "Readonly": true }, "Mounts": [ @@ -66,7 +66,7 @@ }, "other_container": { "Root": { - "Path": "$(cpath)/$(bundle-id)/rootfs" + "Path": "$(cpath)/$(bundle-id)" }, "Mounts": [ { @@ -246,10 +246,15 @@ "cpath": "/run/kata-containers/shared/containers", "mount_source_cpath": "/run/kata-containers/shared/containers", "sfprefix": "^$(cpath)/$(bundle-id)-[a-z0-9]{16}-", + "spath": "/run/kata-containers/sandbox/storage", "ip_p": "[0-9]{1,5}", "ipv4_a": "(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])", "svc_name": "[A-Z_\\.\\-]+", "dns_label": "[a-zA-Z0-9_\\.\\-]+", + "s_source1": "^..2[0-9]{3}_[0-1][0-9]_[0-3][0-9]_[0-2][0-9]_[0-5][0-9]_[0-5][0-9]\\.[0-9]{1,10}$", + "s_source2": "^..data/", + "dns_subdomain": "^[a-z0-9]([-a-z0-9]*[a-z0-9])?$", + "pod_uid": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$", "default_caps": [ "CAP_CHOWN", "CAP_DAC_OVERRIDE", @@ -308,11 +313,30 @@ "CAP_PERFMON", "CAP_BPF", "CAP_CHECKPOINT_RESTORE" + ], + "virtio_blk_storage_classes": [ + "cc-local-csi", + "cc-managed-csi", + "cc-managed-premium-csi" + ], + "smb_storage_classes": [ + { + "name": "azurefile-csi-kata-cc", + "mount_options": [ + "dir_mode=0777", + "file_mode=0777", + "mfsymlinks", + "cache=strict", + "nosharesock", + "actimeo=30", + "nobrl" + ] + } ] }, "kata_config": { - "confidential_guest": false, - "oci_version": "1.1.0" + "confidential_guest": true, + "oci_version": "1.1.0-rc.1" }, "cluster_config": { "pause_container_image": "mcr.microsoft.com/oss/kubernetes/pause:3.6" @@ -332,8 +356,10 @@ "^AZURE_CLIENT_ID=[A-Fa-f0-9-]*$", "^AZURE_TENANT_ID=[A-Fa-f0-9-]*$", "^AZURE_FEDERATED_TOKEN_FILE=/var/run/secrets/azure/tokens/azure-identity-token$", - "^AZURE_AUTHORITY_HOST=https://login\\.microsoftonline\\.com/$" - ] + "^AZURE_AUTHORITY_HOST=https://login\\.microsoftonline\\.com/$", + "^TERM=xterm$" + ], + "allow_env_regex_map": {} }, "UpdateInterfaceRequest": { "allow_raw_flags": 128, diff --git a/src/tools/genpolicy/layers-cache.json b/src/tools/genpolicy/layers-cache.json new file mode 100644 index 000000000000..193651e1178b --- /dev/null +++ b/src/tools/genpolicy/layers-cache.json @@ -0,0 +1,932 @@ +[ + { + "diff_id": "sha256:1be74353c3d0fd55fb5638a52953e6f1bc441e5b1710921db9ec2aa202725569", + "verity_hash": "b643b6217748983830b26ac14a35a3322dd528c00963eaadd91ef55f513dc73f", + "passwd": "root:x:0:0:root:/root:/bin/sh\ndaemon:x:1:1:daemon:/usr/sbin:/bin/false\nbin:x:2:2:bin:/bin:/bin/false\nsys:x:3:3:sys:/dev:/bin/false\nsync:x:4:100:sync:/bin:/bin/sync\nmail:x:8:8:mail:/var/spool/mail:/bin/false\nwww-data:x:33:33:www-data:/var/www:/bin/false\noperator:x:37:37:Operator:/var:/bin/false\nnobody:x:65534:65534:nobody:/home:/bin/false\n" + }, + { + "diff_id": "sha256:84ff92691f909a05b224e1c56abb4864f01b4f8e3c854e4bb4c7baf1d3f6d652", + "verity_hash": "8568c70c0ccfe0051092e818da769111a59882cd19dd799d3bca5ffa82791080", + "passwd": "" + }, + { + "diff_id": "sha256:1be74353c3d0fd55fb5638a52953e6f1bc441e5b1710921db9ec2aa202725569", + "verity_hash": "b643b6217748983830b26ac14a35a3322dd528c00963eaadd91ef55f513dc73f", + "passwd": "root:x:0:0:root:/root:/bin/sh\ndaemon:x:1:1:daemon:/usr/sbin:/bin/false\nbin:x:2:2:bin:/bin:/bin/false\nsys:x:3:3:sys:/dev:/bin/false\nsync:x:4:100:sync:/bin:/bin/sync\nmail:x:8:8:mail:/var/spool/mail:/bin/false\nwww-data:x:33:33:www-data:/var/www:/bin/false\noperator:x:37:37:Operator:/var:/bin/false\nnobody:x:65534:65534:nobody:/home:/bin/false\n" + }, + { + "diff_id": "sha256:1be74353c3d0fd55fb5638a52953e6f1bc441e5b1710921db9ec2aa202725569", + "verity_hash": "b643b6217748983830b26ac14a35a3322dd528c00963eaadd91ef55f513dc73f", + "passwd": "root:x:0:0:root:/root:/bin/sh\ndaemon:x:1:1:daemon:/usr/sbin:/bin/false\nbin:x:2:2:bin:/bin:/bin/false\nsys:x:3:3:sys:/dev:/bin/false\nsync:x:4:100:sync:/bin:/bin/sync\nmail:x:8:8:mail:/var/spool/mail:/bin/false\nwww-data:x:33:33:www-data:/var/www:/bin/false\noperator:x:37:37:Operator:/var:/bin/false\nnobody:x:65534:65534:nobody:/home:/bin/false\n" + }, + { + "diff_id": "sha256:9760f55e20e3f4eb6b837e1b323b3c6f29b1ef4a4617fe98625ead879e91b1c1", + "verity_hash": "817250f1a3e336da76f5bd3fa784e1b26d959b9c131876815ba2604048b70c18", + "passwd": "" + }, + { + "diff_id": "sha256:9760f55e20e3f4eb6b837e1b323b3c6f29b1ef4a4617fe98625ead879e91b1c1", + "verity_hash": "817250f1a3e336da76f5bd3fa784e1b26d959b9c131876815ba2604048b70c18", + "passwd": "" + }, + { + "diff_id": "sha256:c1f171653244eccee9ea3eed88858c5e82d9db2c310a65ea1fbf912b50e5d8fa", + "verity_hash": "53b8028af06009c3af6e8765a5cc63c23199d4ceefcee2c58194a13417f6a6ce", + "passwd": "" + }, + { + "diff_id": "sha256:10e9b9e72178b3e5fe8ff566a61eefb03ad585f5eae5cc0f2b08dbe3c874cecb", + "verity_hash": "6ce35071de2e3b5438919776050906d0ed1164a49dc3d066148a1a839c99e2ef", + "passwd": "" + }, + { + "diff_id": "sha256:e16c585a5d503f63db1e5776d164d1e36cb7376951bd858c9f0b6861d85a1833", + "verity_hash": "23b8c451a7a72846e5f4c81dc20b8d84224ea2c890a582018df2328a9676156c", + "passwd": "" + }, + { + "diff_id": "sha256:ff5700ec54186528cbae40f54c24b1a34fb7c01527beaa1232868c16e2353f52", + "verity_hash": "76ae2ac28a8cb607f0e044ea6d2cad883878575024df299a92f2a55f50bea8a2", + "passwd": "" + }, + { + "diff_id": "sha256:d52f02c6501c9c4410568f0bf6ff30d30d8290f57794c308fe36ea78393afac2", + "verity_hash": "cfeaaa3f7bed80dcaf68d83b4410350df79b9a979aa19100090612cfb89c25e4", + "passwd": "" + }, + { + "diff_id": "sha256:e624a5370eca2b8266e74d179326e2a8767d361db14d13edd9fb57e408731784", + "verity_hash": "8838c182457ea7b7c6f8bf8a73a39737e4a9c59e552dd906321b27e65abea1e7", + "passwd": "" + }, + { + "diff_id": "sha256:1a73b54f556b477f0a8b939d13c504a3b4f4db71f7a09c63afbc10acb3de5849", + "verity_hash": "a10d477bcf18082f2c951eb43a78fd1f4c09975c12e3873bc86f2ca7c969901e", + "passwd": "" + }, + { + "diff_id": "sha256:8f2b2d741d53c8e25da6a3b40a1f45aba2612cf5c1ff06e642286358e756d9a8", + "verity_hash": "bc06cd1927e047047c3e6a373c637a9ca504548337d62aad7eb0dbf79e851ae7", + "passwd": "" + }, + { + "diff_id": "sha256:9959f8de333696342eedd49db37331a9c3efa84899f1236226c18db2e856f2aa", + "verity_hash": "f3e9265398270b4998dd28495c9715219c715411e585e7e3f4bb64c48b122c3d", + "passwd": "" + }, + { + "diff_id": "sha256:756bfb5154c8fc77dcecee84e81741c8665471f750c60c8ac1f52ce3104a9c88", + "verity_hash": "259670f901543068b8f516e43a1dd27ea7b09f540b3a5c0d7b3d3b21ac20c8bb", + "passwd": "" + }, + { + "diff_id": "sha256:23bc2b70b2014dec0ac22f27bb93e9babd08cdd6f1115d0c955b9ff22b382f5a", + "verity_hash": "bd5bb38709d2943a36a02e454e34d3d6caa2385fb140d7f1797fd0a27a937ddb", + "passwd": "root:x:0:0:root:/root:/bin/sh\ndaemon:x:1:1:daemon:/usr/sbin:/bin/false\nbin:x:2:2:bin:/bin:/bin/false\nsys:x:3:3:sys:/dev:/bin/false\nsync:x:4:100:sync:/bin:/bin/sync\nmail:x:8:8:mail:/var/spool/mail:/bin/false\nwww-data:x:33:33:www-data:/var/www:/bin/false\noperator:x:37:37:Operator:/var:/bin/false\nnobody:x:65534:65534:nobody:/home:/bin/false\n" + }, + { + "diff_id": "sha256:f9d9e4e6e2f0689cd752390e14ade48b0ec6f2a488a05af5ab2f9ccaf54c299d", + "verity_hash": "dabfa8333cd8b038d2bb6424717c69221882d27a27ce36c99d660f61902d0038", + "passwd": "root:x:0:0:root:/root:/bin/sh\ndaemon:x:1:1:daemon:/usr/sbin:/bin/false\nbin:x:2:2:bin:/bin:/bin/false\nsys:x:3:3:sys:/dev:/bin/false\nsync:x:4:100:sync:/bin:/bin/sync\nmail:x:8:8:mail:/var/spool/mail:/bin/false\nwww-data:x:33:33:www-data:/var/www:/bin/false\noperator:x:37:37:Operator:/var:/bin/false\nnobody:x:65534:65534:nobody:/home:/bin/false\n" + }, + { + "diff_id": "sha256:e5e13b0c77cbb769548077189c3da2f0a764ceca06af49d8d558e759f5c232bd", + "verity_hash": "62251d85fdf1839e679503d296c8a2cc23c8c749844d3241e09056b55997b991", + "passwd": "root:x:0:0:root:/root:/bin/ash\nbin:x:1:1:bin:/bin:/sbin/nologin\ndaemon:x:2:2:daemon:/sbin:/sbin/nologin\nadm:x:3:4:adm:/var/adm:/sbin/nologin\nlp:x:4:7:lp:/var/spool/lpd:/sbin/nologin\nsync:x:5:0:sync:/sbin:/bin/sync\nshutdown:x:6:0:shutdown:/sbin:/sbin/shutdown\nhalt:x:7:0:halt:/sbin:/sbin/halt\nmail:x:8:12:mail:/var/mail:/sbin/nologin\nnews:x:9:13:news:/usr/lib/news:/sbin/nologin\nuucp:x:10:14:uucp:/var/spool/uucppublic:/sbin/nologin\noperator:x:11:0:operator:/root:/sbin/nologin\nman:x:13:15:man:/usr/man:/sbin/nologin\npostmaster:x:14:12:postmaster:/var/mail:/sbin/nologin\ncron:x:16:16:cron:/var/spool/cron:/sbin/nologin\nftp:x:21:21::/var/lib/ftp:/sbin/nologin\nsshd:x:22:22:sshd:/dev/null:/sbin/nologin\nat:x:25:25:at:/var/spool/cron/atjobs:/sbin/nologin\nsquid:x:31:31:Squid:/var/cache/squid:/sbin/nologin\nxfs:x:33:33:X Font Server:/etc/X11/fs:/sbin/nologin\ngames:x:35:35:games:/usr/games:/sbin/nologin\ncyrus:x:85:12::/usr/cyrus:/sbin/nologin\nvpopmail:x:89:89::/var/vpopmail:/sbin/nologin\nntp:x:123:123:NTP:/var/empty:/sbin/nologin\nsmmsp:x:209:209:smmsp:/var/spool/mqueue:/sbin/nologin\nguest:x:405:100:guest:/dev/null:/sbin/nologin\nnobody:x:65534:65534:nobody:/:/sbin/nologin\n" + }, + { + "diff_id": "sha256:02f2bcb26af5ea6d185dcf509dc795746d907ae10c53918b6944ac85447a0c72", + "verity_hash": "bebf9d4ff3ea2411872133dbacce0972e233815df119521cb74a4474be80d9f4", + "passwd": "root:x:0:0:root:/root:/bin/sh\nbin:x:1:1:bin:/bin:/sbin/nologin\ndaemon:x:2:2:daemon:/sbin:/sbin/nologin\nlp:x:4:7:lp:/var/spool/lpd:/sbin/nologin\nsync:x:5:0:sync:/sbin:/bin/sync\nshutdown:x:6:0:shutdown:/sbin:/sbin/shutdown\nhalt:x:7:0:halt:/sbin:/sbin/halt\nmail:x:8:12:mail:/var/mail:/sbin/nologin\nnews:x:9:13:news:/usr/lib/news:/sbin/nologin\nuucp:x:10:14:uucp:/var/spool/uucppublic:/sbin/nologin\ncron:x:16:16:cron:/var/spool/cron:/sbin/nologin\nftp:x:21:21::/var/lib/ftp:/sbin/nologin\nsshd:x:22:22:sshd:/dev/null:/sbin/nologin\ngames:x:35:35:games:/usr/games:/sbin/nologin\nntp:x:123:123:NTP:/var/empty:/sbin/nologin\nguest:x:405:100:guest:/dev/null:/sbin/nologin\nnobody:x:65534:65534:nobody:/:/sbin/nologin\n" + }, + { + "diff_id": "sha256:0b031aac65698c8794dc6bc317a45589e07bc2db1421178f30a2c7f69a4a2cf5", + "verity_hash": "4f3e38e0e0c06f85e2d214c0a7826e2c0ddb9d0113076a46b15da596399d45de", + "passwd": "" + }, + { + "diff_id": "sha256:30156f6dd72a2545d6b37e4b17baf9df738b67df80e274f3a4a13cae276a4bfa", + "verity_hash": "e63308dc69e33cc949a4189dd464d068ff39b7d73dbc6b26d9149d9d13e1dd8b", + "passwd": "" + }, + { + "diff_id": "sha256:32f366d666a541852cad754ee1cdb53a736110b550f0c2d5a46bc5ba519896b6", + "verity_hash": "47b669e5a7303cd13bc8fbd924e42a25abed3ae1afff9b5c62926f7ce77b054a", + "passwd": "root:x:0:0:root:/root:/bin/ash\nbin:x:1:1:bin:/bin:/sbin/nologin\ndaemon:x:2:2:daemon:/sbin:/sbin/nologin\nadm:x:3:4:adm:/var/adm:/sbin/nologin\nlp:x:4:7:lp:/var/spool/lpd:/sbin/nologin\nsync:x:5:0:sync:/sbin:/bin/sync\nshutdown:x:6:0:shutdown:/sbin:/sbin/shutdown\nhalt:x:7:0:halt:/sbin:/sbin/halt\nmail:x:8:12:mail:/var/mail:/sbin/nologin\nnews:x:9:13:news:/usr/lib/news:/sbin/nologin\nuucp:x:10:14:uucp:/var/spool/uucppublic:/sbin/nologin\noperator:x:11:0:operator:/root:/sbin/nologin\nman:x:13:15:man:/usr/man:/sbin/nologin\npostmaster:x:14:12:postmaster:/var/mail:/sbin/nologin\ncron:x:16:16:cron:/var/spool/cron:/sbin/nologin\nftp:x:21:21::/var/lib/ftp:/sbin/nologin\nsshd:x:22:22:sshd:/dev/null:/sbin/nologin\nat:x:25:25:at:/var/spool/cron/atjobs:/sbin/nologin\nsquid:x:31:31:Squid:/var/cache/squid:/sbin/nologin\nxfs:x:33:33:X Font Server:/etc/X11/fs:/sbin/nologin\ngames:x:35:35:games:/usr/games:/sbin/nologin\ncyrus:x:85:12::/usr/cyrus:/sbin/nologin\nvpopmail:x:89:89::/var/vpopmail:/sbin/nologin\nntp:x:123:123:NTP:/var/empty:/sbin/nologin\nsmmsp:x:209:209:smmsp:/var/spool/mqueue:/sbin/nologin\nguest:x:405:100:guest:/dev/null:/sbin/nologin\nnobody:x:65534:65534:nobody:/:/sbin/nologin\n" + }, + { + "diff_id": "sha256:8088e6fbbf9df8e5cea48d3ae2c0ce52c6399fb790fde704e9689456df99655d", + "verity_hash": "d9ab2a078ff378ccbe9b6c2483b6e96b1a1c52892e2372d81c8be05ff51bdf3d", + "passwd": "root:x:0:0:root:/root:/bin/sh\nbin:x:1:1:bin:/bin:/sbin/nologin\ndaemon:x:2:2:daemon:/sbin:/sbin/nologin\nlp:x:4:7:lp:/var/spool/lpd:/sbin/nologin\nsync:x:5:0:sync:/sbin:/bin/sync\nshutdown:x:6:0:shutdown:/sbin:/sbin/shutdown\nhalt:x:7:0:halt:/sbin:/sbin/halt\nmail:x:8:12:mail:/var/mail:/sbin/nologin\nnews:x:9:13:news:/usr/lib/news:/sbin/nologin\nuucp:x:10:14:uucp:/var/spool/uucppublic:/sbin/nologin\ncron:x:16:16:cron:/var/spool/cron:/sbin/nologin\nftp:x:21:21::/var/lib/ftp:/sbin/nologin\nsshd:x:22:22:sshd:/dev/null:/sbin/nologin\ngames:x:35:35:games:/usr/games:/sbin/nologin\nntp:x:123:123:NTP:/var/empty:/sbin/nologin\nguest:x:405:100:guest:/dev/null:/sbin/nologin\nnobody:x:65534:65534:nobody:/:/sbin/nologin\nklogd:x:100:101:klogd:/dev/null:/sbin/nologin\n" + }, + { + "diff_id": "sha256:208d431c88a991d5c3cfee110e25c859f2ab986dde62f6c6d6a0ab76a09ed79b", + "verity_hash": "92f125dd839dfc0e3f42ddb452631a9817ddb73475fb17c641ae4c7a07e829f5", + "passwd": "" + }, + { + "diff_id": "sha256:8e53e0956b2fb96998da11941da56c963b117e1a3810604d817bbcf9e8bbde7a", + "verity_hash": "d4491ea1887105ef0601f4e5fa3983ffe57d7a57ee8f6b037091f4218c1a6358", + "passwd": "root:x:0:0:root:/root:/bin/bash\nbin:x:1:1:bin:/dev/null:/bin/false\ndaemon:x:6:6:Daemon User:/dev/null:/bin/false\nmessagebus:x:18:18:D-Bus Message Daemon User:/var/run/dbus:/bin/false\nsystemd-bus-proxy:x:72:72:systemd Bus Proxy:/:/bin/false\nsystemd-journal-gateway:x:73:73:systemd Journal Gateway:/:/bin/false\nsystemd-journal-remote:x:74:74:systemd Journal Remote:/:/bin/false\nsystemd-journal-upload:x:75:75:systemd Journal Upload:/:/bin/false\nsystemd-network:x:76:76:systemd Network Management:/:/bin/false\nsystemd-resolve:x:77:77:systemd Resolver:/:/bin/false\nsystemd-timesync:x:78:78:systemd Time Synchronization:/:/bin/false\nsystemd-coredump:x:79:79:systemd Core Dumper:/:/usr/bin/false\nsystemd-oom:x:80:80:systemd Userspace OOM Killer:/:/usr/bin/false\nnobody:x:65534:65534:Unprivileged User:/dev/null:/bin/false\nnonroot:x:65532:65532:Nonroot User:/home/nonroot:/bin/bash\n" + }, + { + "diff_id": "sha256:743494d83fb4e6ee898d4f11378841978cfbc56db3cd99fbfc98c57efa43b080", + "verity_hash": "205f592c14c0e8285923b385342fe4fc4e80b67a6d58c29bf7e5da00888b06f9", + "passwd": "" + }, + { + "diff_id": "sha256:fa9b438e48f4d7a186affe9140032e419ec1891e18ab876609b796902498366b", + "verity_hash": "fbff5a940fd4eba201255bca2838268d1ac986c04cc4f68f65d8457160b4387b", + "passwd": "" + }, + { + "diff_id": "sha256:5efbd343e7fb161ba094e9beeca10d6bd750eb33754702f9382d825cf2fe7764", + "verity_hash": "48d38764ff71360d1080ca1240bae140ef62cf3a78765252156f5dd1527f0eb2", + "passwd": "" + }, + { + "diff_id": "sha256:07c3323c5fbada41f45c63a7db2cb93e53a5a13efe65ee1cae18c42ade3553bc", + "verity_hash": "3ca392994f742c6e2df20ec2304e35d0f47da5e9ad5aaaf609cc1af0365d6f70", + "passwd": "" + }, + { + "diff_id": "sha256:65f3b80187215030849376cb5bf1a23f06b5de8ed571b6611159d269fec74e48", + "verity_hash": "e2afcd993662b3bc2604827dec26de3087fd169f03828353ff563994659c35ee", + "passwd": "" + }, + { + "diff_id": "sha256:1ad27bdd166b922492031b1938a4fb2f775e3d98c8f1b72051dad0570a4dd1b5", + "verity_hash": "254c5314873c27a8de3db5347f56ebd9eb2bf46cc8812a43611f98e38ac37ba2", + "passwd": "root:x:0:0:root:/root:/bin/ash\nbin:x:1:1:bin:/bin:/sbin/nologin\ndaemon:x:2:2:daemon:/sbin:/sbin/nologin\nadm:x:3:4:adm:/var/adm:/sbin/nologin\nlp:x:4:7:lp:/var/spool/lpd:/sbin/nologin\nsync:x:5:0:sync:/sbin:/bin/sync\nshutdown:x:6:0:shutdown:/sbin:/sbin/shutdown\nhalt:x:7:0:halt:/sbin:/sbin/halt\nmail:x:8:12:mail:/var/mail:/sbin/nologin\nnews:x:9:13:news:/usr/lib/news:/sbin/nologin\nuucp:x:10:14:uucp:/var/spool/uucppublic:/sbin/nologin\noperator:x:11:0:operator:/root:/sbin/nologin\nman:x:13:15:man:/usr/man:/sbin/nologin\npostmaster:x:14:12:postmaster:/var/mail:/sbin/nologin\ncron:x:16:16:cron:/var/spool/cron:/sbin/nologin\nftp:x:21:21::/var/lib/ftp:/sbin/nologin\nsshd:x:22:22:sshd:/dev/null:/sbin/nologin\nat:x:25:25:at:/var/spool/cron/atjobs:/sbin/nologin\nsquid:x:31:31:Squid:/var/cache/squid:/sbin/nologin\nxfs:x:33:33:X Font Server:/etc/X11/fs:/sbin/nologin\ngames:x:35:35:games:/usr/games:/sbin/nologin\ncyrus:x:85:12::/usr/cyrus:/sbin/nologin\nvpopmail:x:89:89::/var/vpopmail:/sbin/nologin\nntp:x:123:123:NTP:/var/empty:/sbin/nologin\nsmmsp:x:209:209:smmsp:/var/spool/mqueue:/sbin/nologin\nguest:x:405:100:guest:/dev/null:/sbin/nologin\nnobody:x:65534:65534:nobody:/:/sbin/nologin\n" + }, + { + "diff_id": "sha256:32086b9e08018560d125ed2d4218f527af9fba314b9ad8c30cc3ad1855c043c9", + "verity_hash": "9f625464c7b34a5536f431f5d2946343d272580e36446ddb12b040162e543ce1", + "passwd": "root:x:0:0:root:/root:/bin/bash\nbin:x:1:1:bin:/dev/null:/bin/false\ndaemon:x:6:6:Daemon User:/dev/null:/bin/false\nmessagebus:x:18:18:D-Bus Message Daemon User:/var/run/dbus:/bin/false\nsystemd-bus-proxy:x:72:72:systemd Bus Proxy:/:/bin/false\nsystemd-journal-gateway:x:73:73:systemd Journal Gateway:/:/bin/false\nsystemd-journal-remote:x:74:74:systemd Journal Remote:/:/bin/false\nsystemd-journal-upload:x:75:75:systemd Journal Upload:/:/bin/false\nsystemd-network:x:76:76:systemd Network Management:/:/bin/false\nsystemd-resolve:x:77:77:systemd Resolver:/:/bin/false\nsystemd-timesync:x:78:78:systemd Time Synchronization:/:/bin/false\nsystemd-coredump:x:79:79:systemd Core Dumper:/:/usr/bin/false\nsystemd-oom:x:80:80:systemd Userspace OOM Killer:/:/usr/bin/false\nnobody:x:65534:65534:Unprivileged User:/dev/null:/bin/false\nnonroot:x:65532:65532:Nonroot User:/home/nonroot:/bin/bash\nnginx:x:999:999:Nginx web server:/var/lib/nginx:/sbin/nologin\n" + }, + { + "diff_id": "sha256:5b953a1d950f9944e445e08eb4a7167c8fb91c883280c461621a359a2df9a6f1", + "verity_hash": "48aa118fdfda9a30387e90e0661f2b5b6c8e87354d1fa9a37bf58513ac3e4512", + "passwd": "" + }, + { + "diff_id": "sha256:bd3c8b237a1d2999d990e76d4faa7b458c7849b4d2790e77eaf341435f8632bd", + "verity_hash": "502b537201c7115ef0d171530c7cf5c0e511754e9c95f05941ec27d15c9e0198", + "passwd": "" + }, + { + "diff_id": "sha256:f08a4288aa0802867c85272a89c5b2cbfb6d3206b9c770edf6f0cf0326fb391e", + "verity_hash": "249ef55fcd411c5a8054abb60e715115d599ebbe682d6b74be3bd192724885c1", + "passwd": "" + }, + { + "diff_id": "sha256:16f8f4a1982752bc534f7b1f5fae2c790bd579da72dfcfe353a49cdf1f3608a8", + "verity_hash": "7fa8dafcabed4c69825c3ecad49e17aa4df506f6f987a3d6273989035c1b8663", + "passwd": "" + }, + { + "diff_id": "sha256:06754c1951c6af10aeab2bf64f59e853ce3d9622223667ee05609394028c9426", + "verity_hash": "af31e651edd1f25bd839434b6d60562bcbd9071ec516f41c6b2efb29e840c43e", + "passwd": "" + }, + { + "diff_id": "sha256:38310ed8b4c98f176ab2bba0c6eecb4cfe4560a70e6154c27b6e171cb4624ef6", + "verity_hash": "acae5400f62bca2fb434bfc699b58251a0bbc8b97d19e77e6d60896c73f82f8f", + "passwd": "" + }, + { + "diff_id": "sha256:7f691a75d3b02be31d251296a3bf18ed19280b1cf8a05f51fee3849ce5bed8b9", + "verity_hash": "1231d9b5d1b070a090d8fa074b84c10e9e83baf5d7c416a588acdb920c51340c", + "passwd": "" + }, + { + "diff_id": "sha256:c914e1e37f3a66e093204f890190f7fc29ff458702c6c4d77e7723ea9a444930", + "verity_hash": "6a13214cb021192dca8f7a5d3204a1d934ddd29d426d01eaa4c0f87b50442cf9", + "passwd": "" + }, + { + "diff_id": "sha256:2a655d0f8eff28ac7ad6f50616671e4eaaf7f2f05e8d53eb2205c7386d98a0b5", + "verity_hash": "65c5e83e0da0c15d12f4ffc64509b71e4b49939f2475295359553d37ea5cbf5e", + "passwd": "" + }, + { + "diff_id": "sha256:c698033e7cdcd9f0a8349914c6fc04976c412ebed2e0c9dfe1bc0bbf445ea292", + "verity_hash": "dcbcf58703e9301a34ef3a6e281ab171b53a95a67910e5ba8a35e0fd0efb1fa8", + "passwd": "" + }, + { + "diff_id": "sha256:06b4098852f17e9773bd679c07f0edee169c46141d563f4c459a0bb85acbc47d", + "verity_hash": "b11ec2290597597135a91df848128747ba768ad3fcaf0bb750b29216e2e3c2d1", + "passwd": "" + }, + { + "diff_id": "sha256:06b4098852f17e9773bd679c07f0edee169c46141d563f4c459a0bb85acbc47d", + "verity_hash": "b11ec2290597597135a91df848128747ba768ad3fcaf0bb750b29216e2e3c2d1", + "passwd": "" + }, + { + "diff_id": "sha256:06b4098852f17e9773bd679c07f0edee169c46141d563f4c459a0bb85acbc47d", + "verity_hash": "b11ec2290597597135a91df848128747ba768ad3fcaf0bb750b29216e2e3c2d1", + "passwd": "" + }, + { + "diff_id": "sha256:bbae7090272a384ee2f5d0000b61662dccb00f99007d059dc9552c8f3e60225b", + "verity_hash": "ae1c056998fafcc3078485e03c1d19f5930c4a444f0fea2ee5639be6f9078f25", + "passwd": "" + }, + { + "diff_id": "sha256:ecb05e84ae05ecb7a5cfedb942e9b21f8c3f947889e24ae29874df1d60468b17", + "verity_hash": "ce3fb44629373a3fa18a427ab2e59fe03ad5549fb4e37fe2308e9b6752d744a7", + "passwd": "" + }, + { + "diff_id": "sha256:39456a4cd1d1a83e5b92cd2c2cac83ebe7d3c8711a1bb9051c5e0c2e0491f45e", + "verity_hash": "7f22637432750f5056be79538c541e7175a38961f82287900dc3126735e1fa3a", + "passwd": "" + }, + { + "diff_id": "sha256:25aaa1d9568aefea4062c17f7d13dc83cd53108bfb37e030ccc8e19b9a43e36e", + "verity_hash": "7b0e70c2e27ae95e3abf5c5df7ab2b9b887735d41f0a0a5cac3a95ca0c258304", + "passwd": "" + }, + { + "diff_id": "sha256:618fa69cf6fa6b788c66e8a1d9b4fc68055339c0a943e7de1f33bbf8dd160940", + "verity_hash": "8df7b9a06f4127395ebb7bc1f69f7baefc86bbccfd4e07671a03535efa0d1145", + "passwd": "" + }, + { + "diff_id": "sha256:bf8911a64072a567c0dbd4942ee59681e6366eb9b6007a549fff3830d7812ca2", + "verity_hash": "41aa87f305dff6e256c066f4195108398fdff0281b2099a6a1cd4c8e7a5266ca", + "passwd": "" + }, + { + "diff_id": "sha256:0dead2120a86facca7bd3149f8acbe41e6379a8dcbe70ecf663269b911c7968d", + "verity_hash": "2bb8b6657faa6ea391a5087023f952b280d30aff75161aad7b9057c5781a2819", + "passwd": "" + }, + { + "diff_id": "sha256:618fa69cf6fa6b788c66e8a1d9b4fc68055339c0a943e7de1f33bbf8dd160940", + "verity_hash": "8df7b9a06f4127395ebb7bc1f69f7baefc86bbccfd4e07671a03535efa0d1145", + "passwd": "" + }, + { + "diff_id": "sha256:0a4bfbea68295293b3533578737c342e524368b9e9170948b8cfe289a076cbdb", + "verity_hash": "36b9da1a417d78e8568d43e438585cd982a9fd97efbe11f8c7ee3c131926b1ea", + "passwd": "" + }, + { + "diff_id": "sha256:afbdca70ea57d12fa963254560e2c1aef91cdde63a88e22958c83b9c222c7816", + "verity_hash": "35992e2caba962fc0d3cbb22f238bbe52be0d544b3b3a9eb287d6bfd97fa7df2", + "passwd": "" + }, + { + "diff_id": "sha256:2561a31f68709669ae792541c974db777c82c58036864b7f012c27fc94a26a69", + "verity_hash": "c0cde4091e20bb264c5928fccf3e3157f880d864df3fc321bb9f6b5c35f9e4e4", + "passwd": "" + }, + { + "diff_id": "sha256:282516cc77cebdb92f3e80cf73bf102f361430720459ae5be1b356a9fc49fb48", + "verity_hash": "568d9111b579a9eb661ed7978ecb49b0351f8fb7c9871290be4ec3b5f85a07a9", + "passwd": "" + }, + { + "diff_id": "sha256:3b553237fbdd0f8722a81b8c339c1c73d77d7835dcdad40197c957f263f1ab50", + "verity_hash": "6c7ea0f6c48117ef0b5a25d08e7033194665594aaad182c5d7226788e779bf08", + "passwd": "" + }, + { + "diff_id": "sha256:cb381a32b2296e4eb5af3f84092a2e6685e88adbc54ee0768a1a1010ce6376c7", + "verity_hash": "43b803cb02d5b11ac9f849eaa58258aed73f57ae17c999a023864dbcb26ec0f1", + "passwd": "root:x:0:0:root:/root:/bin/ash\nbin:x:1:1:bin:/bin:/sbin/nologin\ndaemon:x:2:2:daemon:/sbin:/sbin/nologin\nadm:x:3:4:adm:/var/adm:/sbin/nologin\nlp:x:4:7:lp:/var/spool/lpd:/sbin/nologin\nsync:x:5:0:sync:/sbin:/bin/sync\nshutdown:x:6:0:shutdown:/sbin:/sbin/shutdown\nhalt:x:7:0:halt:/sbin:/sbin/halt\nmail:x:8:12:mail:/var/mail:/sbin/nologin\nnews:x:9:13:news:/usr/lib/news:/sbin/nologin\nuucp:x:10:14:uucp:/var/spool/uucppublic:/sbin/nologin\noperator:x:11:0:operator:/root:/sbin/nologin\nman:x:13:15:man:/usr/man:/sbin/nologin\npostmaster:x:14:12:postmaster:/var/mail:/sbin/nologin\ncron:x:16:16:cron:/var/spool/cron:/sbin/nologin\nftp:x:21:21::/var/lib/ftp:/sbin/nologin\nsshd:x:22:22:sshd:/dev/null:/sbin/nologin\nat:x:25:25:at:/var/spool/cron/atjobs:/sbin/nologin\nsquid:x:31:31:Squid:/var/cache/squid:/sbin/nologin\nxfs:x:33:33:X Font Server:/etc/X11/fs:/sbin/nologin\ngames:x:35:35:games:/usr/games:/sbin/nologin\ncyrus:x:85:12::/usr/cyrus:/sbin/nologin\nvpopmail:x:89:89::/var/vpopmail:/sbin/nologin\nntp:x:123:123:NTP:/var/empty:/sbin/nologin\nsmmsp:x:209:209:smmsp:/var/spool/mqueue:/sbin/nologin\nguest:x:405:100:guest:/dev/null:/sbin/nologin\nnobody:x:65534:65534:nobody:/:/sbin/nologin\n" + }, + { + "diff_id": "sha256:e50c5561debea1d0c70a6ebe23e4838fc816bff26bc5c1dca0b5c6a62619fb98", + "verity_hash": "de2b7d6a1f63b9c7d5f6a1402db50e821b381124e99597a5cfad9805bfba68e1", + "passwd": "" + }, + { + "diff_id": "sha256:7882cc107ed38aa707c64dd6314d0bec7a054355b4ad955a05a638c631f68082", + "verity_hash": "b00566b7381f163f42638242a86e51993f4842752612d79b6be7d6a7b5d1fdf5", + "passwd": "" + }, + { + "diff_id": "sha256:23c933b39448b02128c52e2887af3740ff850446c8709aa8580d099755514ac0", + "verity_hash": "43df6f548c1ccbf83a786b694acdcc99e80e555ece17e9ced548fe6705161433", + "passwd": "" + }, + { + "diff_id": "sha256:e50c5561debea1d0c70a6ebe23e4838fc816bff26bc5c1dca0b5c6a62619fb98", + "verity_hash": "de2b7d6a1f63b9c7d5f6a1402db50e821b381124e99597a5cfad9805bfba68e1", + "passwd": "" + }, + { + "diff_id": "sha256:99039a6d30f970c7e021cdc1d8764925523557de6e2b261ffa56854d0552a655", + "verity_hash": "83522a388fdf7a20e5c055b3d8da7a7726fb04b716b7c5228be399e7822044b9", + "passwd": "" + }, + { + "diff_id": "sha256:f33f2ad52ef614bf5e831c8eac2dde2ad51c30891b573c15a329a25cd50f9b8d", + "verity_hash": "11ebc53dfcf008ddacf45ee6639db58df466ed7975e010b47a21622d67048f60", + "passwd": "" + }, + { + "diff_id": "sha256:fbe0f90fe19c5ca81c41a1204be46aa3562204950e13d8e5c1347f8fe17b453e", + "verity_hash": "caad78ccd061c4645d8cd7c015e9f39f3367d6ec3807264ae24b927d96fc62ff", + "passwd": "" + }, + { + "diff_id": "sha256:43f7b6974634a4551150aa53dfcc2b7c052f1d0eb5407a656783cb0cb9e4a496", + "verity_hash": "b9d656db7e2adef428ae6a9944d777d24638ea688ec38d198cef2c6e216f44e8", + "passwd": "" + }, + { + "diff_id": "sha256:cb60fb9b862c6a89f92e484bc3b72bbc0352b41166df5c4a68bfb52f52504a7d", + "verity_hash": "1ac8ab11ad60e870c50d93f1bc37c51d6487b8e7ae5dbb6e5063b19ba3208709", + "passwd": "" + }, + { + "diff_id": "sha256:e3e5579ddd43c08e4b5c74dc12941a4ef656fab070b1087a1fd5a8a836b71e7d", + "verity_hash": "aace8344d84c64b141d4824a9bc42c7f766619cc5efc71072afc7af1dfa66650", + "passwd": "" + }, + { + "diff_id": "sha256:4f145de72059ec2c7e2e10846b6db4b08930d51da88ff09258ed70656be40aab", + "verity_hash": "883200fd778088a12b9ef0a1d3f436489f3a82a76d115a6a1b16814586c2f43c", + "passwd": "" + }, + { + "diff_id": "sha256:812f3d84b25cfb146c889b2525d61dcee636547a3a066640601f8c8b4be375b5", + "verity_hash": "ae70c9eba600c0fe32ce0af51e45191b2976eacdbd4d68ceac8228fbde20a3b6", + "passwd": "" + }, + { + "diff_id": "sha256:003f6426457caafd744ada9b77bf69dbd7054ca3544fb28dcf021c1c743927ed", + "verity_hash": "bf11f7d479662ddfde3cfee997c8d372489b2e013864d1f66e219426f3d03e02", + "passwd": "" + }, + { + "diff_id": "sha256:5f70bf18a086007016e948b04aed3b82103a36bea41755b6cddfaf10ace3c6ef", + "verity_hash": "67450082ab56da1aecc5eae2f18d980cd9e7306e79334a1a826a91cfd90114a8", + "passwd": "" + }, + { + "diff_id": "sha256:9ed3f8c5bd7d398d270c8250971c3896bd10da739eb8a1b5ac4f38adf57708f8", + "verity_hash": "de1b5a8d281b24b424dac0c785861380a9d3a8632f90125b825e56e1caf12a59", + "passwd": "" + }, + { + "diff_id": "sha256:2161dc55f39dda0b2d211847cd23a03d43b5e93f40a2a4e708f92a7c33e03203", + "verity_hash": "12ed3581ab69f3f5255685ac49530887a54d8291d1ea6ed6be44f4138a37f80e", + "passwd": "" + }, + { + "diff_id": "sha256:c52303a0ace55242a4475d36ad1004d4f7b1398ccbfc9431650c0f71fc49950d", + "verity_hash": "da78554853fb399d9a24df2f032d43e41a1964a0f79863197923169d8c085f6d", + "passwd": "" + }, + { + "diff_id": "sha256:6c1e6aa89b26a21525a246638f55f140a9990fd6ff9faaabd4bc20bbe54fd53e", + "verity_hash": "247795691d4e8df7e9913eafc0faec0cb074da089d4bc512c51421acb357b7c7", + "passwd": "" + }, + { + "diff_id": "sha256:20d4b56e054aeabff8025ee7c1802c7bc87b695e63b4d12a5dab906da4bb22f8", + "verity_hash": "ca2e3ee9f35b0ed4b4397691510d55bb8216f8b55398d06387efe7d46a69d6bf", + "passwd": "root:x:0:0:root:/root:/bin/ash\nbin:x:1:1:bin:/bin:/sbin/nologin\ndaemon:x:2:2:daemon:/sbin:/sbin/nologin\nadm:x:3:4:adm:/var/adm:/sbin/nologin\nlp:x:4:7:lp:/var/spool/lpd:/sbin/nologin\nsync:x:5:0:sync:/sbin:/bin/sync\nshutdown:x:6:0:shutdown:/sbin:/sbin/shutdown\nhalt:x:7:0:halt:/sbin:/sbin/halt\nmail:x:8:12:mail:/var/mail:/sbin/nologin\nnews:x:9:13:news:/usr/lib/news:/sbin/nologin\nuucp:x:10:14:uucp:/var/spool/uucppublic:/sbin/nologin\noperator:x:11:0:operator:/root:/sbin/nologin\nman:x:13:15:man:/usr/man:/sbin/nologin\npostmaster:x:14:12:postmaster:/var/mail:/sbin/nologin\ncron:x:16:16:cron:/var/spool/cron:/sbin/nologin\nftp:x:21:21::/var/lib/ftp:/sbin/nologin\nsshd:x:22:22:sshd:/dev/null:/sbin/nologin\nat:x:25:25:at:/var/spool/cron/atjobs:/sbin/nologin\nsquid:x:31:31:Squid:/var/cache/squid:/sbin/nologin\nxfs:x:33:33:X Font Server:/etc/X11/fs:/sbin/nologin\ngames:x:35:35:games:/usr/games:/sbin/nologin\ncyrus:x:85:12::/usr/cyrus:/sbin/nologin\nvpopmail:x:89:89::/var/vpopmail:/sbin/nologin\nntp:x:123:123:NTP:/var/empty:/sbin/nologin\nsmmsp:x:209:209:smmsp:/var/spool/mqueue:/sbin/nologin\nguest:x:405:100:guest:/dev/null:/sbin/nologin\nnobody:x:65534:65534:nobody:/:/sbin/nologin\nwww-data:x:101:101:www-data:/usr/local/nginx:/sbin/nologin\n" + }, + { + "diff_id": "sha256:f1b5933fe4b5f49bbe8258745cf396afe07e625bdab3168e364daf7c956b6b81", + "verity_hash": "12055326c275405a192062137469888e1a498cd829a5c51bc0ddcc1880a10bc3", + "passwd": "root:x:0:0:root:/root:/bin/ash\nbin:x:1:1:bin:/bin:/sbin/nologin\ndaemon:x:2:2:daemon:/sbin:/sbin/nologin\nadm:x:3:4:adm:/var/adm:/sbin/nologin\nlp:x:4:7:lp:/var/spool/lpd:/sbin/nologin\nsync:x:5:0:sync:/sbin:/bin/sync\nshutdown:x:6:0:shutdown:/sbin:/sbin/shutdown\nhalt:x:7:0:halt:/sbin:/sbin/halt\nmail:x:8:12:mail:/var/spool/mail:/sbin/nologin\nnews:x:9:13:news:/usr/lib/news:/sbin/nologin\nuucp:x:10:14:uucp:/var/spool/uucppublic:/sbin/nologin\noperator:x:11:0:operator:/root:/bin/sh\nman:x:13:15:man:/usr/man:/sbin/nologin\npostmaster:x:14:12:postmaster:/var/spool/mail:/sbin/nologin\ncron:x:16:16:cron:/var/spool/cron:/sbin/nologin\nftp:x:21:21::/var/lib/ftp:/sbin/nologin\nsshd:x:22:22:sshd:/dev/null:/sbin/nologin\nat:x:25:25:at:/var/spool/cron/atjobs:/sbin/nologin\nsquid:x:31:31:Squid:/var/cache/squid:/sbin/nologin\nxfs:x:33:33:X Font Server:/etc/X11/fs:/sbin/nologin\ngames:x:35:35:games:/usr/games:/sbin/nologin\npostgres:x:70:70::/var/lib/postgresql:/bin/sh\ncyrus:x:85:12::/usr/cyrus:/sbin/nologin\nvpopmail:x:89:89::/var/vpopmail:/sbin/nologin\nntp:x:123:123:NTP:/var/empty:/sbin/nologin\nsmmsp:x:209:209:smmsp:/var/spool/mqueue:/sbin/nologin\nguest:x:405:100:guest:/dev/null:/sbin/nologin\nnobody:x:65534:65534:nobody:/:/sbin/nologin\n" + }, + { + "diff_id": "sha256:9b9b7f3d56a01e3d9076874990c62e7a516cc4032f784f421574d06b18ef9aa4", + "verity_hash": "790bb51e5958137bfc15d8a2ca693ed7eff66f4fc4691114cf17bf1fd51c12ee", + "passwd": "" + }, + { + "diff_id": "sha256:a8162913332380f3397e90f54f4c1908f7dca73e075c1ef7d58361d941553816", + "verity_hash": "a9b856381d7f41bde7eda8c9419d605a3732413bd9c2301a2a6f7d0863af1d00", + "passwd": "" + }, + { + "diff_id": "sha256:c2def29898a91f99fa712e60fe093dce28df08f87ee430b04121058d14a69dcf", + "verity_hash": "8513a3edd824434589d8eb7567f07f2960e2daea3c474e849ac02b559b74ed77", + "passwd": "" + }, + { + "diff_id": "sha256:e006af9492c4873925885807a877749c376ee73c0c5d01935a100fad441220f4", + "verity_hash": "b7a87fd4c43c2ee293de31132ce5dc2b4c2f6bdcac7b4e1dbefaba6810e45d30", + "passwd": "" + }, + { + "diff_id": "sha256:7981a89f751541140caa477cdb721046925a839660394de64e379c410171c10c", + "verity_hash": "8bdee10d68612f45c859d4639335c75d00470e2f7c296744497377b0c8c8493b", + "passwd": "" + }, + { + "diff_id": "sha256:0c8724a82628df0abfb71ff6638d05c4ae8fc682fb25f17362c98a3817ac69ca", + "verity_hash": "09731a34877c19a2dd4ede2dd29acf2e60b7e95a371f865aa7fb8d2ecca6252f", + "passwd": "root:x:0:0:root:/root:/bin/bash\ndaemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin\nbin:x:2:2:bin:/bin:/usr/sbin/nologin\nsys:x:3:3:sys:/dev:/usr/sbin/nologin\nsync:x:4:65534:sync:/bin:/bin/sync\ngames:x:5:60:games:/usr/games:/usr/sbin/nologin\nman:x:6:12:man:/var/cache/man:/usr/sbin/nologin\nlp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin\nmail:x:8:8:mail:/var/mail:/usr/sbin/nologin\nnews:x:9:9:news:/var/spool/news:/usr/sbin/nologin\nuucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin\nproxy:x:13:13:proxy:/bin:/usr/sbin/nologin\nwww-data:x:33:33:www-data:/var/www:/usr/sbin/nologin\nbackup:x:34:34:backup:/var/backups:/usr/sbin/nologin\nlist:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin\nirc:x:39:39:ircd:/var/run/ircd:/usr/sbin/nologin\ngnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin\nnobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin\n_apt:x:100:65534::/nonexistent:/usr/sbin/nologin\n" + }, + { + "diff_id": "sha256:3abde9518332a9cf24f82b55300e562b988effb9e53dfdbfd3bd4cbdd3cbdab4", + "verity_hash": "41a90ab4cf0bbdf249e22e371bc5035bbd5db2999ca2c1cf834c074e11bd93ec", + "passwd": "" + }, + { + "diff_id": "sha256:610d14dd79c38ebdf89ea158d6768ba70907cf9edaf7c64c92f32836c2abef62", + "verity_hash": "8609f61a1a59d0ab6734342eccb2d394b1949c47311a39287dd9a5b3c9062353", + "passwd": "" + }, + { + "diff_id": "sha256:65d22717bade8e75584ed47489baa2113129307b5356e014665ea99d9c4e66c9", + "verity_hash": "420d4da85c159153d5fc6f44adb996117e0185d05ca89355d8ddca8d7b2b89ad", + "passwd": "" + }, + { + "diff_id": "sha256:99a11caa4be14e98046095c54a53b449f9c805032381a9952cdc61075851aacf", + "verity_hash": "deb43c914f092c3e2d17d6f13f104fe7323e314cb2d8608051e507e9bb2a33ac", + "passwd": "" + }, + { + "diff_id": "sha256:dbc7b78b30db404fb773710975b33427adc20682afe0144f1d40a5e3fd71bf38", + "verity_hash": "2bc61bfd1a7954a3dd1d52ed72e90933fb1cd07c8fb5bcb688ae61735547ddb3", + "passwd": "" + }, + { + "diff_id": "sha256:548a79621a426b4eb077c926eabac5a8620c454fb230640253e1b44dc7dd7562", + "verity_hash": "2dff42aa4048a9afec4710424ef633543e0e4d0a22b44a1b432fa6f1495fd786", + "passwd": "root:x:0:0:root:/root:/bin/bash\ndaemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin\nbin:x:2:2:bin:/bin:/usr/sbin/nologin\nsys:x:3:3:sys:/dev:/usr/sbin/nologin\nsync:x:4:65534:sync:/bin:/bin/sync\ngames:x:5:60:games:/usr/games:/usr/sbin/nologin\nman:x:6:12:man:/var/cache/man:/usr/sbin/nologin\nlp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin\nmail:x:8:8:mail:/var/mail:/usr/sbin/nologin\nnews:x:9:9:news:/var/spool/news:/usr/sbin/nologin\nuucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin\nproxy:x:13:13:proxy:/bin:/usr/sbin/nologin\nwww-data:x:33:33:www-data:/var/www:/usr/sbin/nologin\nbackup:x:34:34:backup:/var/backups:/usr/sbin/nologin\nlist:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin\nirc:x:39:39:ircd:/var/run/ircd:/usr/sbin/nologin\ngnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin\nnobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin\n_apt:x:100:65534::/nonexistent:/usr/sbin/nologin\n" + }, + { + "diff_id": "sha256:f6fd31e134b607efe402583b8035d1ee3a58420ad5e106011528996d36d1f395", + "verity_hash": "b333a58b322dbdf762d4ee92e4252ca40f33b9b13ae3a784ea9feea539696a9a", + "passwd": "" + }, + { + "diff_id": "sha256:28bf8bbf0d249e2eb454ba13db878878298e159788c45756a43cc366c2a9436b", + "verity_hash": "f7ebac270baf61405e763bb3b4ebcbdc58c6c6f158111dfbdc4a7639528facf4", + "passwd": "" + }, + { + "diff_id": "sha256:ceaf9e1ebef5f9eaa707a838848a3c13800fcf32d7757be10d4b08fb85f1bc8a", + "verity_hash": "a7db28e09e51e89b451c2d1fde21b016b65ba48ca733109aad0d5eabd191b02b", + "passwd": "" + }, + { + "diff_id": "sha256:8e396a1aad506affc6fa1b7c7b8ee75b54b78019e0a945e6ac52e3dc407e0766", + "verity_hash": "8f14d589ed977c978826c58f66ec0232017426fac3de5e10c4de5deb837a6797", + "passwd": "root:x:0:0:root:/root:/bin/bash\ndaemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin\nbin:x:2:2:bin:/bin:/usr/sbin/nologin\nsys:x:3:3:sys:/dev:/usr/sbin/nologin\nsync:x:4:65534:sync:/bin:/bin/sync\ngames:x:5:60:games:/usr/games:/usr/sbin/nologin\nman:x:6:12:man:/var/cache/man:/usr/sbin/nologin\nlp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin\nmail:x:8:8:mail:/var/mail:/usr/sbin/nologin\nnews:x:9:9:news:/var/spool/news:/usr/sbin/nologin\nuucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin\nproxy:x:13:13:proxy:/bin:/usr/sbin/nologin\nwww-data:x:33:33:www-data:/var/www:/usr/sbin/nologin\nbackup:x:34:34:backup:/var/backups:/usr/sbin/nologin\nlist:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin\nirc:x:39:39:ircd:/run/ircd:/usr/sbin/nologin\ngnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin\nnobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin\n_apt:x:100:65534::/nonexistent:/usr/sbin/nologin\n" + }, + { + "diff_id": "sha256:582b548209e1d1db74adb53042d2f6340e1a7e21928df98bf242b1aa6bf42fb5", + "verity_hash": "01cdbd8f410ac2079e030e213cc1d2d1d93358b8305ddf125254946a8c36c827", + "passwd": "root:x:0:0:root:/root:/bin/bash\ndaemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin\nbin:x:2:2:bin:/bin:/usr/sbin/nologin\nsys:x:3:3:sys:/dev:/usr/sbin/nologin\nsync:x:4:65534:sync:/bin:/bin/sync\ngames:x:5:60:games:/usr/games:/usr/sbin/nologin\nman:x:6:12:man:/var/cache/man:/usr/sbin/nologin\nlp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin\nmail:x:8:8:mail:/var/mail:/usr/sbin/nologin\nnews:x:9:9:news:/var/spool/news:/usr/sbin/nologin\nuucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin\nproxy:x:13:13:proxy:/bin:/usr/sbin/nologin\nwww-data:x:33:33:www-data:/var/www:/usr/sbin/nologin\nbackup:x:34:34:backup:/var/backups:/usr/sbin/nologin\nlist:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin\nirc:x:39:39:ircd:/var/run/ircd:/usr/sbin/nologin\ngnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin\nnobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin\n_apt:x:100:65534::/nonexistent:/bin/false\n" + }, + { + "diff_id": "sha256:4098bb46704965c2e1f5011714b600020b26fda4f4b475c9c56aca9657c71ce7", + "verity_hash": "30c86c0ee455a36c89472554cd4c2319ae4791fdf1271ba89793b662fb93f450", + "passwd": "" + }, + { + "diff_id": "sha256:9d49e0bc68a4667c0e9626a6c6d52028c7bf4fc70aae065950ecf12ca16cf627", + "verity_hash": "48c5e50aee807178be126e8218297dbaf5768a8aa18482a2fb22223a359943c3", + "passwd": "" + }, + { + "diff_id": "sha256:582b548209e1d1db74adb53042d2f6340e1a7e21928df98bf242b1aa6bf42fb5", + "verity_hash": "01cdbd8f410ac2079e030e213cc1d2d1d93358b8305ddf125254946a8c36c827", + "passwd": "root:x:0:0:root:/root:/bin/bash\ndaemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin\nbin:x:2:2:bin:/bin:/usr/sbin/nologin\nsys:x:3:3:sys:/dev:/usr/sbin/nologin\nsync:x:4:65534:sync:/bin:/bin/sync\ngames:x:5:60:games:/usr/games:/usr/sbin/nologin\nman:x:6:12:man:/var/cache/man:/usr/sbin/nologin\nlp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin\nmail:x:8:8:mail:/var/mail:/usr/sbin/nologin\nnews:x:9:9:news:/var/spool/news:/usr/sbin/nologin\nuucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin\nproxy:x:13:13:proxy:/bin:/usr/sbin/nologin\nwww-data:x:33:33:www-data:/var/www:/usr/sbin/nologin\nbackup:x:34:34:backup:/var/backups:/usr/sbin/nologin\nlist:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin\nirc:x:39:39:ircd:/var/run/ircd:/usr/sbin/nologin\ngnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin\nnobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin\n_apt:x:100:65534::/nonexistent:/bin/false\n" + }, + { + "diff_id": "sha256:dc8e1d8b53e9701a7b4ce09222181108f26772c8c4109737eebc49228533eb2f", + "verity_hash": "c1743cb0a20b2004bf3f4e452402fa450306dc4d29e3e16f354c9b169594298c", + "passwd": "" + }, + { + "diff_id": "sha256:eb47c7ee2d9f227986e042e9056f3d86833c20b91dd234ae73951e66794075f8", + "verity_hash": "36d43a39fe7af722a0e2e46fa5952aa38fa79ad311a86c0da0b759a7e3c41b14", + "passwd": "" + }, + { + "diff_id": "sha256:c95d2191d7773c6e29188f92922bc9547e1f0b6130e85dfc2f5e4eae13137c7c", + "verity_hash": "7d04382685de3f27c7d9db678a023db6a3b4377e4f7efd9e5cbde856f46b154a", + "passwd": "root:x:0:0:root:/root:/bin/bash\ndaemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin\nbin:x:2:2:bin:/bin:/usr/sbin/nologin\nsys:x:3:3:sys:/dev:/usr/sbin/nologin\nsync:x:4:65534:sync:/bin:/bin/sync\ngames:x:5:60:games:/usr/games:/usr/sbin/nologin\nman:x:6:12:man:/var/cache/man:/usr/sbin/nologin\nlp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin\nmail:x:8:8:mail:/var/mail:/usr/sbin/nologin\nnews:x:9:9:news:/var/spool/news:/usr/sbin/nologin\nuucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin\nproxy:x:13:13:proxy:/bin:/usr/sbin/nologin\nwww-data:x:33:33:www-data:/var/www:/usr/sbin/nologin\nbackup:x:34:34:backup:/var/backups:/usr/sbin/nologin\nlist:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin\nirc:x:39:39:ircd:/var/run/ircd:/usr/sbin/nologin\ngnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin\nnobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin\n_apt:x:100:65534::/nonexistent:/usr/sbin/nologin\n" + }, + { + "diff_id": "sha256:27502392e386147bf71f51b4676dbe938b9b86592e41047c17fc94a116aa2841", + "verity_hash": "ff1c81a00214ae520833dbb3bfd5ceaa1e14f29c62fe699668dfa40fbf6c2816", + "passwd": "" + }, + { + "diff_id": "sha256:9f10818f1f96a349981e134a0e8d566fa5ab144c9f9f4e766be8cdab76d4074d", + "verity_hash": "7d4d932cb36b54fee794b8397a940f81fd235da28bc1533975845fd811f1e831", + "passwd": "" + }, + { + "diff_id": "sha256:fd4922c86e779796ea3d5e986ee2f2d38425fc77d1c06efc1058c39f4e056a71", + "verity_hash": "c0d7666f113e39a4c7bfd98086fe189d7e3e95d47e6e4d62d65efcaf7dca099e", + "passwd": "" + }, + { + "diff_id": "sha256:261e5d6450d3b582718d9d1722bb6ceb51499515c09ec061f7cebd1405f48063", + "verity_hash": "a98fc0dcd0ba7c2b67bed6fdd61a48cf19386e07a5bee38cbb56cce580b3146b", + "passwd": "" + }, + { + "diff_id": "sha256:5523d58ec1d5091a6b8c10d345f4ed647772224c95b08245ebdbb19df47f2816", + "verity_hash": "0c9d1b1f2c67fe900d5a1828f887e22de4baf58515f6e9fdbbdd5d036fda753f", + "passwd": "" + }, + { + "diff_id": "sha256:39050480d9dccc5332e29fb47bdbe7738b15fd444dbfd76b13a332915fc2526e", + "verity_hash": "8d46b879cc65ad4250e585f468b42321b12976f1fd2cffd0146a1ebe4fec7edb", + "passwd": "" + }, + { + "diff_id": "sha256:82cc8238d3947d89cf6e5d2165516cbbac583c643f0ce572c223988310aa70c9", + "verity_hash": "258187de55af1fce7c8114a5822e04659f91596b0a9c0f47ad57b94ccdcf7fc2", + "passwd": "root:x:0:0:root:/root:/bin/ash\nbin:x:1:1:bin:/bin:/sbin/nologin\ndaemon:x:2:2:daemon:/sbin:/sbin/nologin\nadm:x:3:4:adm:/var/adm:/sbin/nologin\nlp:x:4:7:lp:/var/spool/lpd:/sbin/nologin\nsync:x:5:0:sync:/sbin:/bin/sync\nshutdown:x:6:0:shutdown:/sbin:/sbin/shutdown\nhalt:x:7:0:halt:/sbin:/sbin/halt\nmail:x:8:12:mail:/var/spool/mail:/sbin/nologin\nnews:x:9:13:news:/usr/lib/news:/sbin/nologin\nuucp:x:10:14:uucp:/var/spool/uucppublic:/sbin/nologin\noperator:x:11:0:operator:/root:/bin/sh\nman:x:13:15:man:/usr/man:/sbin/nologin\npostmaster:x:14:12:postmaster:/var/spool/mail:/sbin/nologin\ncron:x:16:16:cron:/var/spool/cron:/sbin/nologin\nftp:x:21:21::/var/lib/ftp:/sbin/nologin\nsshd:x:22:22:sshd:/dev/null:/sbin/nologin\nat:x:25:25:at:/var/spool/cron/atjobs:/sbin/nologin\nsquid:x:31:31:Squid:/var/cache/squid:/sbin/nologin\nxfs:x:33:33:X Font Server:/etc/X11/fs:/sbin/nologin\ngames:x:35:35:games:/usr/games:/sbin/nologin\npostgres:x:70:70::/var/lib/postgresql:/bin/sh\ncyrus:x:85:12::/usr/cyrus:/sbin/nologin\nvpopmail:x:89:89::/var/vpopmail:/sbin/nologin\nntp:x:123:123:NTP:/var/empty:/sbin/nologin\nsmmsp:x:209:209:smmsp:/var/spool/mqueue:/sbin/nologin\nguest:x:405:100:guest:/dev/null:/sbin/nologin\nnobody:x:65534:65534:nobody:/:/sbin/nologin\n" + }, + { + "diff_id": "sha256:33223b5621be22a3cb12abfe23f0894adc73569f7d828690e25d3a1cf6e885ef", + "verity_hash": "c662e2bbac4813595fabd70e3f9810ad2c33bd563017de23090581967eced65e", + "passwd": "" + }, + { + "diff_id": "sha256:9d934de0951000c3bf83b2e0c35f9ae64a0bd300bd1710690ac101c41434de21", + "verity_hash": "a25ed7d1aa7a682fab7f2116c86a43dc0c09cde626a4e47b374283106c9ae06b", + "passwd": "root:x:0:0:root:/root:/bin/bash\ndaemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin\nbin:x:2:2:bin:/bin:/usr/sbin/nologin\nsys:x:3:3:sys:/dev:/usr/sbin/nologin\nsync:x:4:65534:sync:/bin:/bin/sync\ngames:x:5:60:games:/usr/games:/usr/sbin/nologin\nman:x:6:12:man:/var/cache/man:/usr/sbin/nologin\nlp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin\nmail:x:8:8:mail:/var/mail:/usr/sbin/nologin\nnews:x:9:9:news:/var/spool/news:/usr/sbin/nologin\nuucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin\nproxy:x:13:13:proxy:/bin:/usr/sbin/nologin\nwww-data:x:33:33:www-data:/var/www:/usr/sbin/nologin\nbackup:x:34:34:backup:/var/backups:/usr/sbin/nologin\nlist:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin\nirc:x:39:39:ircd:/var/run/ircd:/usr/sbin/nologin\ngnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin\nnobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin\n_apt:x:100:65534::/nonexistent:/usr/sbin/nologin\nsystemd-network:x:101:102:systemd Network Management,,,:/run/systemd/netif:/usr/sbin/nologin\nsystemd-resolve:x:102:103:systemd Resolver,,,:/run/systemd/resolve:/usr/sbin/nologin\nmessagebus:x:103:104::/nonexistent:/usr/sbin/nologin\nsshd:x:104:65534::/run/sshd:/usr/sbin/nologin\n" + }, + { + "diff_id": "sha256:12c39e58e4882923cb2877b89fcb9b13766058526bcb6ea5da46d63e9e364108", + "verity_hash": "d753cf6af2b7eeff3e41b307cb50d4a7c7f6002fb77b6f165e010d7bd5f96291", + "passwd": "" + }, + { + "diff_id": "sha256:e9fb81929686e24682b9467b32ad59afd4143d9cfd97f80dedcf8e14c484487c", + "verity_hash": "5e65e33ce145509a7238a23d6ac6b17105b272f1fb0396482cb3fa02ec2b25c8", + "passwd": "" + }, + { + "diff_id": "sha256:9d6a655e96398e4d002f7b1f8d2457d22b32ac6a75175131d7bcc958cf1c327d", + "verity_hash": "328a1dfa90d3e02d637333005a57dab23984a0007bfedc4ba0d84acf81833257", + "passwd": "" + }, + { + "diff_id": "sha256:46e9c9d2763d1e484a364893f179740f39aa383c7edbca6a5ba0c658111512c5", + "verity_hash": "60d07e5beb16c6830a7add7c65d4dc32f001c865969b92b4b6c270dc3f87fa68", + "passwd": "" + }, + { + "diff_id": "sha256:de63ccf142b59572a8d69aadc09d8ae213410b75e0bf69edc1ef2e98cff1cfe2", + "verity_hash": "f976d00359d14e60a13380ea863a4ea15ba1a8bc673ad1c71f7d17060f8f7d16", + "passwd": "" + }, + { + "diff_id": "sha256:097c36e5ae1af9b54ca3e6a628296aa72947a83a229563cb64834bcdd3bf768d", + "verity_hash": "942b444ce1728ac0eb515e7b0026d06f3106b1f601ffda662e21d12abdf1833b", + "passwd": "" + }, + { + "diff_id": "sha256:554303d20613bba1e80cf7d72accb0445b3acd72619ee8689ca573154ffa7baf", + "verity_hash": "74251d154f171ff77753646d68e5b2280ac2e4733ca0e1101880fdc0d2c9424e", + "passwd": "root:x:0:0:root:/root:/bin/bash\ndaemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin\nbin:x:2:2:bin:/bin:/usr/sbin/nologin\nsys:x:3:3:sys:/dev:/usr/sbin/nologin\nsync:x:4:65534:sync:/bin:/bin/sync\ngames:x:5:60:games:/usr/games:/usr/sbin/nologin\nman:x:6:12:man:/var/cache/man:/usr/sbin/nologin\nlp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin\nmail:x:8:8:mail:/var/mail:/usr/sbin/nologin\nnews:x:9:9:news:/var/spool/news:/usr/sbin/nologin\nuucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin\nproxy:x:13:13:proxy:/bin:/usr/sbin/nologin\nwww-data:x:33:33:www-data:/var/www:/usr/sbin/nologin\nbackup:x:34:34:backup:/var/backups:/usr/sbin/nologin\nlist:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin\nirc:x:39:39:ircd:/var/run/ircd:/usr/sbin/nologin\ngnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin\nnobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin\n_apt:x:100:65534::/nonexistent:/bin/false\ncassandra:x:1000:1000:,,,:/home/cassandra:/bin/bash\n" + }, + { + "diff_id": "sha256:554303d20613bba1e80cf7d72accb0445b3acd72619ee8689ca573154ffa7baf", + "verity_hash": "74251d154f171ff77753646d68e5b2280ac2e4733ca0e1101880fdc0d2c9424e", + "passwd": "root:x:0:0:root:/root:/bin/bash\ndaemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin\nbin:x:2:2:bin:/bin:/usr/sbin/nologin\nsys:x:3:3:sys:/dev:/usr/sbin/nologin\nsync:x:4:65534:sync:/bin:/bin/sync\ngames:x:5:60:games:/usr/games:/usr/sbin/nologin\nman:x:6:12:man:/var/cache/man:/usr/sbin/nologin\nlp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin\nmail:x:8:8:mail:/var/mail:/usr/sbin/nologin\nnews:x:9:9:news:/var/spool/news:/usr/sbin/nologin\nuucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin\nproxy:x:13:13:proxy:/bin:/usr/sbin/nologin\nwww-data:x:33:33:www-data:/var/www:/usr/sbin/nologin\nbackup:x:34:34:backup:/var/backups:/usr/sbin/nologin\nlist:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin\nirc:x:39:39:ircd:/var/run/ircd:/usr/sbin/nologin\ngnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin\nnobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin\n_apt:x:100:65534::/nonexistent:/bin/false\ncassandra:x:1000:1000:,,,:/home/cassandra:/bin/bash\n" + }, + { + "diff_id": "sha256:01d4e4b4f381ac5a9964a14a650d7c074a2aa6e0789985d843f8eb3070b58f7d", + "verity_hash": "baa7f107b781d10c5456c86a482aa946ec907186658bf24f2f231454e4830046", + "passwd": "root:x:0:0:root:/root:/bin/bash\ndaemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin\nbin:x:2:2:bin:/bin:/usr/sbin/nologin\nsys:x:3:3:sys:/dev:/usr/sbin/nologin\nsync:x:4:65534:sync:/bin:/bin/sync\ngames:x:5:60:games:/usr/games:/usr/sbin/nologin\nman:x:6:12:man:/var/cache/man:/usr/sbin/nologin\nlp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin\nmail:x:8:8:mail:/var/mail:/usr/sbin/nologin\nnews:x:9:9:news:/var/spool/news:/usr/sbin/nologin\nuucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin\nproxy:x:13:13:proxy:/bin:/usr/sbin/nologin\nwww-data:x:33:33:www-data:/var/www:/usr/sbin/nologin\nbackup:x:34:34:backup:/var/backups:/usr/sbin/nologin\nlist:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin\nirc:x:39:39:ircd:/run/ircd:/usr/sbin/nologin\ngnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin\nnobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin\n_apt:x:100:65534::/nonexistent:/usr/sbin/nologin\n" + }, + { + "diff_id": "sha256:bc2c0e526ab2fa38a9b5df8151ae99d661a0a74fc426acfc503f26cdf00aef3a", + "verity_hash": "b3a49e775f42e9fe066200d68ab832058cf463bc215097ad9fd5a80533280a1b", + "passwd": "" + }, + { + "diff_id": "sha256:1296e5e4280886bb926e8fa5c39327694adce62f6d161c0ae0d4657cf33047f9", + "verity_hash": "0ae8f6b02e7b5221f9e452952720154a82b72c3b3546c997acdc859b6c4a1a5a", + "passwd": "" + }, + { + "diff_id": "sha256:961e93cda9dd918dbe26aca24cccd6c5db05176850d2c53476d881df5d0d4816", + "verity_hash": "ae6a711fc3a57a0b3135895b8d002cc184a31d7fd655113cd551feea1446288c", + "passwd": "" + }, + { + "diff_id": "sha256:efb2a1ba50d85c8ff7689077a33dda5f78f7d6df20a3846c59c28a8479eab15f", + "verity_hash": "99a5efef227c8c13e059434ab64d404f683c9e36335e1bd35b2aca3282ce9477", + "passwd": "" + }, + { + "diff_id": "sha256:d6c0c1e8b5bf0b68cf8a4e8ce14f82dd5c620bbb301f193a5a048fd119d6bdba", + "verity_hash": "9f1a82445901154cf99ed76e2b00797afafbe2b14136151aa0a7dea56a5c9f63", + "passwd": "" + }, + { + "diff_id": "sha256:d6c0c1e8b5bf0b68cf8a4e8ce14f82dd5c620bbb301f193a5a048fd119d6bdba", + "verity_hash": "9f1a82445901154cf99ed76e2b00797afafbe2b14136151aa0a7dea56a5c9f63", + "passwd": "" + }, + { + "diff_id": "sha256:e13d5da7c26bcc0f1ffa83af0239d0961eeb71b547998c72f96cc34915f1ec6c", + "verity_hash": "215a7eb0b4ad484d599f945a5afb3700818cbcf79787c5931cb33e0bd2fa8df5", + "passwd": "" + }, + { + "diff_id": "sha256:e837c62cf31343212f2f422a2d58d04f49c2cbca63265bdd2de7dc02f858573c", + "verity_hash": "a71f00d258abee410ba922b4b54c30d7ea8dcdc05ae345e35ceb1e8a7fb0fdb9", + "passwd": "" + }, + { + "diff_id": "sha256:9dc8cfd6fb82c58b26406b9a9c439f598d58f89a6a7c741e4c1ba9ff0dcfe0cd", + "verity_hash": "f4d2b244842f05f4b1be77069461ebdce73945d430b05f49af9c540a7ad6fee1", + "passwd": "" + }, + { + "diff_id": "sha256:d1e0ba740e9d49558a43cb23dd5686e22e7ae3a070df9b1f2a94755df576966f", + "verity_hash": "1a64471f3e96306020f55f8cf17ab69bc260370dfccf32620042ff2c606767fb", + "passwd": "" + }, + { + "diff_id": "sha256:f66dc622a3cdafdc1da3c6ada48752de4a0a779a39f2e5407f1357754aa230b0", + "verity_hash": "a09eb427481e44591bd9a87cfe4b6ca733cbf337c38738944449424ac8b76999", + "passwd": "root:x:0:0:root:/root:/bin/bash\ndaemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin\nbin:x:2:2:bin:/bin:/usr/sbin/nologin\nsys:x:3:3:sys:/dev:/usr/sbin/nologin\nsync:x:4:65534:sync:/bin:/bin/sync\ngames:x:5:60:games:/usr/games:/usr/sbin/nologin\nman:x:6:12:man:/var/cache/man:/usr/sbin/nologin\nlp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin\nmail:x:8:8:mail:/var/mail:/usr/sbin/nologin\nnews:x:9:9:news:/var/spool/news:/usr/sbin/nologin\nuucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin\nproxy:x:13:13:proxy:/bin:/usr/sbin/nologin\nwww-data:x:33:33:www-data:/var/www:/usr/sbin/nologin\nbackup:x:34:34:backup:/var/backups:/usr/sbin/nologin\nlist:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin\nirc:x:39:39:ircd:/run/ircd:/usr/sbin/nologin\ngnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin\nnobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin\n_apt:x:100:65534::/nonexistent:/usr/sbin/nologin\nsystemd-network:x:101:102:systemd Network Management,,,:/run/systemd:/usr/sbin/nologin\nsystemd-resolve:x:102:103:systemd Resolver,,,:/run/systemd:/usr/sbin/nologin\nmessagebus:x:103:104::/nonexistent:/usr/sbin/nologin\nsystemd-timesync:x:104:105:systemd Time Synchronization,,,:/run/systemd:/usr/sbin/nologin\nsshd:x:105:65534::/run/sshd:/usr/sbin/nologin\n" + }, + { + "diff_id": "sha256:754f15f8c3dcb44fc3ead8cd4cbf71f2b7a424227785676ef4f28d3daad73996", + "verity_hash": "b5178dce91914b8ff55b109e2b39d6eca6ca332b1c921e086e1a5ca06e70155b", + "passwd": "" + }, + { + "diff_id": "sha256:9fd49e1a60dcd2d4eca67c1cf906ac7f3664e395521f204c5311fc7395b0c694", + "verity_hash": "95cf9b40e3649a2fc26e83b298ad651e49587e8d3432787812b50c916536b41e", + "passwd": "" + }, + { + "diff_id": "sha256:90c24a25f2c9954c1c26240bf08bdec0660d3ab6f6c01d6d5eba981209970acf", + "verity_hash": "b0aad4ec3e3a7d6ed6f32d24845d92bc590f29e22f23e75bc509504791c7511c", + "passwd": "" + }, + { + "diff_id": "sha256:a09e6a6fd2db59eb48ad55beb5903b2fd82a10c80b8d5b137a8d0baad652b11f", + "verity_hash": "f0bb0aa369fc9be8cdf29e456cf92524969e08b8609988cec5ca36767c004f28", + "passwd": "root:x:0:0:root:/root:/bin/bash\ndaemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin\nbin:x:2:2:bin:/bin:/usr/sbin/nologin\nsys:x:3:3:sys:/dev:/usr/sbin/nologin\nsync:x:4:65534:sync:/bin:/bin/sync\ngames:x:5:60:games:/usr/games:/usr/sbin/nologin\nman:x:6:12:man:/var/cache/man:/usr/sbin/nologin\nlp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin\nmail:x:8:8:mail:/var/mail:/usr/sbin/nologin\nnews:x:9:9:news:/var/spool/news:/usr/sbin/nologin\nuucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin\nproxy:x:13:13:proxy:/bin:/usr/sbin/nologin\nwww-data:x:33:33:www-data:/var/www:/usr/sbin/nologin\nbackup:x:34:34:backup:/var/backups:/usr/sbin/nologin\nlist:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin\nirc:x:39:39:ircd:/run/ircd:/usr/sbin/nologin\ngnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin\nnobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin\n_apt:x:100:65534::/nonexistent:/usr/sbin/nologin\ntcpdump:x:101:103::/nonexistent:/usr/sbin/nologin\nsshd:x:102:65534::/run/sshd:/usr/sbin/nologin\n" + }, + { + "diff_id": "sha256:58f3222e1f7254b0ba3870bb92bcfcfdbfb58d6c48266addcd2ce93386bbfd20", + "verity_hash": "5defa6be35bd183a5e1815ae621ecc72faae9b056310a93dbd4df2776b7d31d3", + "passwd": "" + }, + { + "diff_id": "sha256:585b3244fc95e91c15719e36d1e3b5c9e62f3e84da90a9c0aba3c5c71c9de86e", + "verity_hash": "b0778d3b89617a334acb5afe86e10e0a86fa789c765e0b7b9cdd4d048575d713", + "passwd": "" + }, + { + "diff_id": "sha256:9d072cf35ad34e03564335f7a1f4fb906ff9980270ab2933e36c7866ca00e4ad", + "verity_hash": "ab081115d88966ec7e0d95b41f2efe68b072a0a434c64701ece088026bb56067", + "passwd": "" + }, + { + "diff_id": "sha256:787a66cc77ec572598ef18d9492d02cccd0b026063abf354b53bff8ad1fae71b", + "verity_hash": "feaec483e66ffbcf330a8247af6791ecc63c69e13339bfe6ef58f8bcade64204", + "passwd": "" + }, + { + "diff_id": "sha256:5c6d54b19846dd119167467c5162f108f5eb4a94e1648eb69e37248e807c9edf", + "verity_hash": "95a62b4104926d605106d45297d54efefbc0aebc7b1e958d6fb34cd906a8480e", + "passwd": "" + }, + { + "diff_id": "sha256:853961e578b3ce1b682a25ace3229056ec16f6dfbc8763e9cfdb2dace72cde07", + "verity_hash": "57c02c406decf8722b446b6e0337fb997ef2260438e289d6c068d6d92d65e660", + "passwd": "" + }, + { + "diff_id": "sha256:e13d5da7c26bcc0f1ffa83af0239d0961eeb71b547998c72f96cc34915f1ec6c", + "verity_hash": "215a7eb0b4ad484d599f945a5afb3700818cbcf79787c5931cb33e0bd2fa8df5", + "passwd": "" + }, + { + "diff_id": "sha256:ffdef8fe134012699aa309f2d814b5d4ff545cf34d52470e76fe6a40d169acc8", + "verity_hash": "ed771fd80a695d17ec2ca32feb87d54b7c7fe962bd850b52384c73acb04152d7", + "passwd": "" + }, + { + "diff_id": "sha256:7d2fbfc52685c8900024ee89ca45084cd433438c2438e41da6e181a740a3716b", + "verity_hash": "c879816ae32adbfa778b2f059ac920059a2d949968ff71ad54a2e7e1a9145402", + "passwd": "" + }, + { + "diff_id": "sha256:372b58956289b602f3d019daba0afc6f5d2e0e27a0e423b9c891c33c2dcc4800", + "verity_hash": "dcd7f3597a2bb25de83b7404ca9e55cd52ca4ad89b95a5d5931e6e033d2ee45f", + "passwd": "" + }, + { + "diff_id": "sha256:6c2211fd5f26a6fbe78b5391126501d281315546e548dbfa0cdef8f2f4523f74", + "verity_hash": "71ac7759529579965ca678292cf3d044192fefbeb10f15ab8330e0b6ab9b2c84", + "passwd": "" + }, + { + "diff_id": "sha256:05319b74c5e354adcb751e505c273c805d13342bb15f28f3d15dd7ffd332c5d4", + "verity_hash": "4c5373e1bbed3628e5e0d46a379becf5f66dad9b40c37fc5de64acd1739a258c", + "passwd": "" + }, + { + "diff_id": "sha256:425a71216783ba56fc53dc551a7891f9699162b24b924069e3a16308803f5b79", + "verity_hash": "b745495839136d188b8e78c2dbe56316dd066d038d3036e5b88bdbc3c12b9105", + "passwd": "" + }, + { + "diff_id": "sha256:89a20c42ff07a5726b1d4ca86cbd444dd6f5356509b148254dd2e0f18bdca73c", + "verity_hash": "9310f4b7c8d730be055096fb9e0dbb79649b02d097837d6609f92097ab808194", + "passwd": "" + }, + { + "diff_id": "sha256:3498c01b65882058454208bf259197d6b1d7c9ddd36038bb8664be42af1e151a", + "verity_hash": "17a838b0234782eb7f6bcaa0fb28bef9f630268d2e12c3b28022dabf1cdba812", + "passwd": "" + }, + { + "diff_id": "sha256:7d7c608f22b711a188b662fc4b5d8b1356cf2e259a3066ce5788a09fa68eb7f9", + "verity_hash": "ece5ef216c40047accf38d3a8b16899d13b2712067dd478a2178378ec7fcbfc6", + "passwd": "root:x:0:0:root:/root:/bin/ash\nbin:x:1:1:bin:/bin:/sbin/nologin\ndaemon:x:2:2:daemon:/sbin:/sbin/nologin\nadm:x:3:4:adm:/var/adm:/sbin/nologin\nlp:x:4:7:lp:/var/spool/lpd:/sbin/nologin\nsync:x:5:0:sync:/sbin:/bin/sync\nshutdown:x:6:0:shutdown:/sbin:/sbin/shutdown\nhalt:x:7:0:halt:/sbin:/sbin/halt\nmail:x:8:12:mail:/var/mail:/sbin/nologin\nnews:x:9:13:news:/usr/lib/news:/sbin/nologin\nuucp:x:10:14:uucp:/var/spool/uucppublic:/sbin/nologin\noperator:x:11:0:operator:/root:/sbin/nologin\nman:x:13:15:man:/usr/man:/sbin/nologin\npostmaster:x:14:12:postmaster:/var/mail:/sbin/nologin\ncron:x:16:16:cron:/var/spool/cron:/sbin/nologin\nftp:x:21:21::/var/lib/ftp:/sbin/nologin\nsshd:x:22:22:sshd:/dev/null:/sbin/nologin\nat:x:25:25:at:/var/spool/cron/atjobs:/sbin/nologin\nsquid:x:31:31:Squid:/var/cache/squid:/sbin/nologin\nxfs:x:33:33:X Font Server:/etc/X11/fs:/sbin/nologin\ngames:x:35:35:games:/usr/games:/sbin/nologin\ncyrus:x:85:12::/usr/cyrus:/sbin/nologin\nvpopmail:x:89:89::/var/vpopmail:/sbin/nologin\nntp:x:123:123:NTP:/var/empty:/sbin/nologin\nsmmsp:x:209:209:smmsp:/var/spool/mqueue:/sbin/nologin\nguest:x:405:100:guest:/dev/null:/sbin/nologin\nnobody:x:65534:65534:nobody:/:/sbin/nologin\nuser-defined-in-image:x:1000:1000:Linux User,,,:/home/user-defined-in-image:/bin/ash\n" + }, + { + "diff_id": "sha256:89a20c42ff07a5726b1d4ca86cbd444dd6f5356509b148254dd2e0f18bdca73c", + "verity_hash": "9310f4b7c8d730be055096fb9e0dbb79649b02d097837d6609f92097ab808194", + "passwd": "" + }, + { + "diff_id": "sha256:34714ca250a33969fec32ac02fb0794abf0bb87b2b0727da3b75b73c4b6fe6db", + "verity_hash": "74314937ba1beef79c89559c3f88af9b1ba05e5d28822b34570d05a9e2ba4057", + "passwd": "" + }, + { + "diff_id": "sha256:46b300c55d44199bc23c35e614be8b83209b15fe924aa4d1c33ed921eb7c874c", + "verity_hash": "160dc1281b1d1b5f6caad45a3491c0017f4d9c67ffa52698ea70345e4c63a1d8", + "passwd": "" + }, + { + "diff_id": "sha256:3e815b026a929f920ea0a992fbe8521c50d827356ceb248143639738af5fab1b", + "verity_hash": "3ea5a643d88600294e2a37cd9eebd14e17580352d14fed32bfe51fbdf03ddd45", + "passwd": "" + }, + { + "diff_id": "sha256:4809b29045f3908f4e51fe04e16c17c5c0d624810292b82ea003ad1d5c9199d8", + "verity_hash": "05004dc3a11c82e8c80af46abae728cd6cebffc340181a49310adbcc4d76b138", + "passwd": "" + }, + { + "diff_id": "sha256:e6fd4ebbaaabf218629e733df8f8650c8b64672cc6894a8769f53642a1fad2c9", + "verity_hash": "c1adae2d735cc32acb160b22bb79137421d38bbab022fadc9d91957d2b66b174", + "passwd": "" + }, + { + "diff_id": "sha256:fccbfa2912f0cd6b9d13f91f288f112a2b825f3f758a4443aacb45bfc108cc74", + "verity_hash": "629670d9bb1e00e62d92bddb1ae206048cc2de23419c0f87e3f97622b9b0db20", + "passwd": "root:x:0:0:root:/root:/bin/bash\ndaemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin\nbin:x:2:2:bin:/bin:/usr/sbin/nologin\nsys:x:3:3:sys:/dev:/usr/sbin/nologin\nsync:x:4:65534:sync:/bin:/bin/sync\ngames:x:5:60:games:/usr/games:/usr/sbin/nologin\nman:x:6:12:man:/var/cache/man:/usr/sbin/nologin\nlp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin\nmail:x:8:8:mail:/var/mail:/usr/sbin/nologin\nnews:x:9:9:news:/var/spool/news:/usr/sbin/nologin\nuucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin\nproxy:x:13:13:proxy:/bin:/usr/sbin/nologin\nwww-data:x:33:33:www-data:/var/www:/usr/sbin/nologin\nbackup:x:34:34:backup:/var/backups:/usr/sbin/nologin\nlist:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin\nirc:x:39:39:ircd:/var/run/ircd:/usr/sbin/nologin\ngnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin\nnobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin\nsystemd-timesync:x:100:102:systemd Time Synchronization,,,:/run/systemd:/bin/false\nsystemd-network:x:101:103:systemd Network Management,,,:/run/systemd/netif:/bin/false\nsystemd-resolve:x:102:104:systemd Resolver,,,:/run/systemd/resolve:/bin/false\nsystemd-bus-proxy:x:103:105:systemd Bus Proxy,,,:/run/systemd:/bin/false\n_apt:x:104:65534::/nonexistent:/bin/false\n" + }, + { + "diff_id": "sha256:e1a9a6284d0d24d8194ac84b372619e75cd35a46866b74925b7274c7056561e4", + "verity_hash": "6aea5b3ddfab821031500c5e28949128f02dd7056e097347d8dfc42869100904", + "passwd": "" + }, + { + "diff_id": "sha256:abb5207fd6bdc957db4e3954dc304f91f84b1fdc44e4bcaad83cf8b3acde81e6", + "verity_hash": "45780eb26b4df902d193bb9929d4c12d9d250a908bd950063e02e07104b1a024", + "passwd": "" + }, + { + "diff_id": "sha256:ac7299292f8b2f710d3b911c6a4e02ae8f06792e39822e097f9c4e9c2672b32d", + "verity_hash": "8edba1283e614d6bdc8d39198ab29b8c624b95d8ecd3e811afbffb40bc8737cf", + "passwd": "" + }, + { + "diff_id": "sha256:a5e66470b2812e91798db36eb103c1f1e135bbe167e4b2ad5ba425b8db98ee8d", + "verity_hash": "f5dda5084b20faa0369db54a9e89693cb6b7e98979bb66fc5b3a851cfbbdf0e3", + "passwd": "" + }, + { + "diff_id": "sha256:a8de0e025d94b33db3542e1e8ce58829144b30c6cd1fff057eec55b1491933c3", + "verity_hash": "7f65f0b17878c3551a8c93f276ab4877141b4ef41ddc3d2e2b1ac62b424488d0", + "passwd": "" + }, + { + "diff_id": "sha256:c8357492a30a41f71676315e84c61def14c293748625e1cbdc580d87c3eaf251", + "verity_hash": "f3264c3b7b9a8f5162e75efb16c55ea4b8357f7f64ad9f9afaacdbf2a47f35a5", + "passwd": "" + }, + { + "diff_id": "sha256:9790a64e1d7a4fa9eec160852e80c3214af8f4c1b00b7c5123b1e90cd55d00e1", + "verity_hash": "8cbf4595f0e11d8065310d2ad046e71134975d006a069931c3ff71f5754948a0", + "passwd": "" + }, + { + "diff_id": "sha256:422771fd249f5222d4862e0db60714c5b5487a1b0723a17373372dd97fa3badf", + "verity_hash": "5b77c6df6838103a858787c9ce4865b6d11bbdd986169ed08e0362ac6fde4d74", + "passwd": "" + }, + { + "diff_id": "sha256:ddcdc5de606f08a35fe15909aeee723c9db571a84ecdb728e3b44caad5fd6dba", + "verity_hash": "5ada97ae25d9bfd128336397b857e1a07dce2137bfab07571bf41f9d40d7b590", + "passwd": "" + }, + { + "diff_id": "sha256:bbfb45dde10f9818a73e6c4cf16bf6d12396195254f7986c4d121c4407118612", + "verity_hash": "6bdaef5682444529ffd624280dbad1af757963d6b44d614cb6ca911f39b5f803", + "passwd": "" + }, + { + "diff_id": "sha256:55949bea12c9603f7e97f517a440389117ab6202c784e4a5cf12711124588ac3", + "verity_hash": "9c5e9e653d26ed523f022bd29e19e9267359995d5a0c8fd22756f84cad545d3f", + "passwd": "" + }, + { + "diff_id": "sha256:fac8b84e323effcd7f66bdf7c287444f38f27edbca6958ce5421a8f29d5bb2b4", + "verity_hash": "06f89c275dc34f26b9db0cf0102b2a899de6555105852d0af2bb95f374f7144d", + "passwd": "root:x:0:0:root:/root:/bin/bash\ndaemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin\nbin:x:2:2:bin:/bin:/usr/sbin/nologin\nsys:x:3:3:sys:/dev:/usr/sbin/nologin\nsync:x:4:65534:sync:/bin:/bin/sync\ngames:x:5:60:games:/usr/games:/usr/sbin/nologin\nman:x:6:12:man:/var/cache/man:/usr/sbin/nologin\nlp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin\nmail:x:8:8:mail:/var/mail:/usr/sbin/nologin\nnews:x:9:9:news:/var/spool/news:/usr/sbin/nologin\nuucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin\nproxy:x:13:13:proxy:/bin:/usr/sbin/nologin\nwww-data:x:33:33:www-data:/var/www:/usr/sbin/nologin\nbackup:x:34:34:backup:/var/backups:/usr/sbin/nologin\nlist:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin\nirc:x:39:39:ircd:/var/run/ircd:/usr/sbin/nologin\ngnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin\nnobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin\nsystemd-timesync:x:100:103:systemd Time Synchronization,,,:/run/systemd:/bin/false\nsystemd-network:x:101:104:systemd Network Management,,,:/run/systemd/netif:/bin/false\nsystemd-resolve:x:102:105:systemd Resolver,,,:/run/systemd/resolve:/bin/false\nsystemd-bus-proxy:x:103:106:systemd Bus Proxy,,,:/run/systemd:/bin/false\n" + }, + { + "diff_id": "sha256:d184bf1ae91768ad31d856b5b3c287966263a7ae71aab0fba618a9638d91b377", + "verity_hash": "0859e5531fd7f8b17071414a082afb65b2be702ecdafa007dd0577aea86f8593", + "passwd": "" + }, + { + "diff_id": "sha256:fac8b84e323effcd7f66bdf7c287444f38f27edbca6958ce5421a8f29d5bb2b4", + "verity_hash": "06f89c275dc34f26b9db0cf0102b2a899de6555105852d0af2bb95f374f7144d", + "passwd": "root:x:0:0:root:/root:/bin/bash\ndaemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin\nbin:x:2:2:bin:/bin:/usr/sbin/nologin\nsys:x:3:3:sys:/dev:/usr/sbin/nologin\nsync:x:4:65534:sync:/bin:/bin/sync\ngames:x:5:60:games:/usr/games:/usr/sbin/nologin\nman:x:6:12:man:/var/cache/man:/usr/sbin/nologin\nlp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin\nmail:x:8:8:mail:/var/mail:/usr/sbin/nologin\nnews:x:9:9:news:/var/spool/news:/usr/sbin/nologin\nuucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin\nproxy:x:13:13:proxy:/bin:/usr/sbin/nologin\nwww-data:x:33:33:www-data:/var/www:/usr/sbin/nologin\nbackup:x:34:34:backup:/var/backups:/usr/sbin/nologin\nlist:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin\nirc:x:39:39:ircd:/var/run/ircd:/usr/sbin/nologin\ngnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin\nnobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin\nsystemd-timesync:x:100:103:systemd Time Synchronization,,,:/run/systemd:/bin/false\nsystemd-network:x:101:104:systemd Network Management,,,:/run/systemd/netif:/bin/false\nsystemd-resolve:x:102:105:systemd Resolver,,,:/run/systemd/resolve:/bin/false\nsystemd-bus-proxy:x:103:106:systemd Bus Proxy,,,:/run/systemd:/bin/false\n" + }, + { + "diff_id": "sha256:b889d2789a9263fa4190e4bff6fd40c1e1f17a7bf0cece8cdc337f743a759f41", + "verity_hash": "35baa89da4c21bad87e080af4fecfefd43af564efa6eca61699641f11caa0cea", + "passwd": "" + }, + { + "diff_id": "sha256:52744c6ca882cf4e026fddddc3ef149827abc286deaf64a5950c1e534632b056", + "verity_hash": "213f840b100690804a76a1a9d3ce3c0531381b0a7607625803a6f867134412db", + "passwd": "" + }, + { + "diff_id": "sha256:52744c6ca882cf4e026fddddc3ef149827abc286deaf64a5950c1e534632b056", + "verity_hash": "213f840b100690804a76a1a9d3ce3c0531381b0a7607625803a6f867134412db", + "passwd": "" + }, + { + "diff_id": "sha256:dd697e7ab62a4ecb6f1db7b7e4d4855ba5ae85bc589999516caf03bfbd06ebbe", + "verity_hash": "ebe623866ab372c5101baaf767b281de7100b9342696bcc82ff4f061f4b15966", + "passwd": "" + }, + { + "diff_id": "sha256:dd697e7ab62a4ecb6f1db7b7e4d4855ba5ae85bc589999516caf03bfbd06ebbe", + "verity_hash": "ebe623866ab372c5101baaf767b281de7100b9342696bcc82ff4f061f4b15966", + "passwd": "" + }, + { + "diff_id": "sha256:079fedee6fd5a61235d4788b82a76f6c6306f73e926e80880f534cadb83c8cd9", + "verity_hash": "2bdc2fae3c87acc6a186336f8b3065502d1be7bcfaac32157dfc48c4b4c1d7f6", + "passwd": "" + }, + { + "diff_id": "sha256:079fedee6fd5a61235d4788b82a76f6c6306f73e926e80880f534cadb83c8cd9", + "verity_hash": "2bdc2fae3c87acc6a186336f8b3065502d1be7bcfaac32157dfc48c4b4c1d7f6", + "passwd": "" + }, + { + "diff_id": "sha256:4021ba600a8fa1d4e9f5581f4f3145cd2ef76afa30c610800a66253950857e4a", + "verity_hash": "c8db6d3fd3aaa8f9d0ce5ca8c71f5e387e17f1a6a643f5fed9a4cae1223d21cd", + "passwd": "" + }, + { + "diff_id": "sha256:5f19c1d2190068ba3e416644322ff3510a90f78682f7b1a3fafcee9ea2395478", + "verity_hash": "7a80e71d6d90a50ddf8e9f99141686e4609f0b47550ef74ff353624d2642db98", + "passwd": "" + }, + { + "diff_id": "sha256:c922ccd39f5ae4ff2a09bb9a388679e2ca5721f6c0c111003b60687ebb1f1a0f", + "verity_hash": "e7387f83726b29f52ef463f5744222ba05e2d47997447858764e53a864a6764d", + "passwd": "" + }, + { + "diff_id": "sha256:3949fb783fff93ed417e801c63e90e0c68e6aa26eabbacf3c6f63886e3a31b07", + "verity_hash": "1edef1dcaaf43af3271449906c34958475e0997b9828bca2c0ecaa74033f7aef", + "passwd": "" + }, + { + "diff_id": "sha256:779a75016251a2fea2be2685a464da18ba961b191ff67072a5fa67543f4b29ab", + "verity_hash": "b4a7963727aa96024dc5c5b3f28b66803f4626f6506b58ee9fd49ff108aab822", + "passwd": "" + }, + { + "diff_id": "sha256:52513215bb0a0e4bbc3afef74756b82f65577627868bad76af3c80d33aaf64a4", + "verity_hash": "b29ba7302d7fc8ab1539ea28062e5793955cdc59f7352942928d4c7ab33e52ae", + "passwd": "" + } +] diff --git a/src/tools/genpolicy/policy_samples.json b/src/tools/genpolicy/policy_samples.json new file mode 100644 index 000000000000..950d9ddb5912 --- /dev/null +++ b/src/tools/genpolicy/policy_samples.json @@ -0,0 +1,81 @@ +{ + "default": [ + "configmap/pod-cm1.yaml", + "configmap/pod-cm2.yaml", + "configmap/pod-cm3.yaml", + "cron-job/test-cron-job.yaml", + "deployment/deployment-back.yaml", + "deployment/deployment-front.yaml", + "deployment/deployment-busybox.yaml", + "job/test-job.yaml", + "job/test-job2.yaml", + "kubernetes/conformance/conformance-e2e.yaml", + "kubernetes/conformance/csi-hostpath-plugin.yaml", + "kubernetes/conformance/csi-hostpath-testing.yaml", + "kubernetes/conformance/etcd-statefulset.yaml", + "kubernetes/conformance/hello-populator-deploy.yaml", + "kubernetes/conformance/netexecrc.yaml", + "kubernetes/conformance2/ingress-http-rc.yaml", + "kubernetes/conformance2/ingress-http2-rc.yaml", + "kubernetes/conformance2/ingress-multiple-certs-rc.yaml", + "kubernetes/conformance2/ingress-nginx-rc.yaml", + "kubernetes/conformance2/ingress-static-ip-rc.yaml", + "kubernetes/fixtures/appsv1deployment.yaml", + "kubernetes/fixtures/daemon.yaml", + "kubernetes/fixtures/deploy-clientside.yaml", + "kubernetes/fixtures/job.yaml", + "kubernetes/fixtures/multi-resource-yaml.yaml", + "kubernetes/fixtures/rc-lastapplied.yaml", + "kubernetes/fixtures/rc-noexist.yaml", + "kubernetes/fixtures/replication.yaml", + "kubernetes/fixtures2/rc-service.yaml", + "kubernetes/fixtures2/valid-pod.yaml", + "pod/pod-exec.yaml", + "pod/pod-lifecycle.yaml", + "pod/pod-one-container.yaml", + "pod/pod-persistent-volumes.yaml", + "pod/pod-same-containers.yaml", + "pod/pod-spark.yaml", + "pod/pod-three-containers.yaml", + "pod/pod-ubuntu.yaml", + "replica-set/replica-busy.yaml", + "replica-set/replica2.yaml", + "secrets/azure-file-secrets.yaml", + "stateful-set/web.yaml", + "stateful-set/web2.yaml" + ], + "incomplete_init": [ + "kubernetes/incomplete-init/cassandra-statefulset.yaml", + "kubernetes/incomplete-init/controller.yaml" + ], + "silently_ignored": [ + "webhook/webhook-pod1.yaml", + "webhook/webhook-pod2.yaml", + "webhook/webhook-pod3.yaml", + "webhook/webhook-pod4.yaml", + "webhook/webhook-pod5.yaml", + "webhook/webhook-pod6.yaml", + "webhook/webhook-pod7.yaml", + "webhook2/webhook-pod8.yaml", + "webhook2/webhook-pod9.yaml", + "webhook2/webhook-pod10.yaml", + "webhook2/webhook-pod11.yaml", + "webhook2/webhook-pod12.yaml", + "webhook2/webhook-pod13.yaml", + "webhook3/dns-test.yaml", + "webhook3/many-layers.yaml" + ], + "no_policy": [ + "kubernetes/fixtures/limits.yaml", + "kubernetes/fixtures/namespace.yaml", + "kubernetes/fixtures/quota.yaml" + ], + "needs_containerd_pull": [ + "pod/pod-many-layers.yaml" + ], + "common_images": [ + "mcr.microsoft.com/azurelinux/busybox:1.36", + "mcr.microsoft.com/azurelinux/base/nginx:1.25", + "mcr.microsoft.com/mirror/docker/library/ubuntu:noble" + ] +} \ No newline at end of file diff --git a/src/tools/genpolicy/rules.rego b/src/tools/genpolicy/rules.rego index 51a052234f39..7fe543fd17d2 100644 --- a/src/tools/genpolicy/rules.rego +++ b/src/tools/genpolicy/rules.rego @@ -52,15 +52,199 @@ default AllowRequestsFailingPolicy := false # Constants S_NAME_KEY = "io.kubernetes.cri.sandbox-name" S_NAMESPACE_KEY = "io.kubernetes.cri.sandbox-namespace" +BUNDLE_ID = "[a-z0-9]{64}" -CreateContainerRequest:= {"ops": ops, "allowed": true} { +CreateContainerRequest:= resp { + not is_null(input.env_map) + + i_env_map := input.env_map + + some p_container in policy_data.containers + p_env_map := p_container.env_map + allow_env_map(p_env_map, i_env_map) + + i_process := input.base.OCI.Process + + p_process := p_container.OCI.Process + + allow_args(i_process, p_process, i_env_map) + + resp = CreateContainerRequestCommon(input.base) + print("CreateContainerRequest: true") +} + +allow_args(i_process, p_process, i_env_map) { + i_args := i_process.Args + p_args := p_process.Args + print("allow_args: i_args =", i_args, "p_args =", p_args) + count(i_args) == count(p_args) + every i, i_arg in i_args { + print("allow_args: i_arg =", i_arg) + p_arg_replaced := replace_env_variables(p_args[i], i_env_map) + print("allow_args: p_arg_replaced =", p_arg_replaced) + p_arg_replaced2 := replace(p_arg_replaced, "$$", "$") + print("allow_args: p_arg_replaced2 =", p_arg_replaced2) + i_arg == p_arg_replaced2 + } + print("allow_args: true") +} + +allow_args(i_process, p_process, i_env_map) { + not i_process.Args + not p_process.Args + print("allow_args2: no args") +} + +# this function replaces all the environment variables in a string, given a map of environment keys to environment values +# eg str = "echo $(CLUSTER_ID); echo $(NODE_NAME);" +# env_map = {"CLUSTER_ID": "abc", "NODE_NAME" : "xyz"} +# result = "echo abc; echo xyz;" +replace_env_variables(str, env_map) = result { + # make an array of the keys eg ["CLUSTER_ID", "NODE_NAME"] + keys := [x | some x in object.keys(env_map)] + result := replace_str_rec(str, env_map, keys, count(keys) - 1) +} + +# base case +replace_str_rec(str, env_map, arr_keys, i) = result { + i < 0 + result := str +} + +# recursive step +replace_str_rec(str, env_map, arr_keys, i) = result { + i >= 0 + key := arr_keys[i] + env_key1 := concat("", ["$(", key, ")"]) + # replace $(VAR) with value + new_str1 := replace(str, env_key1, env_map[key]) + # replace next environment variable + result = replace_str_rec(new_str1, env_map, arr_keys, i - 1) +} + +allow_env_map(p_env_map, i_env_map) { + print("allow_env_map: p_env_map =", p_env_map) + every env_key, env_val in i_env_map { + print("allow_env: env_key =", env_key, "env_val =", env_val) + allow_env_map_entry(env_key, env_val, p_env_map) + } + print("allow_env_map: true") +} + +# Allow exact match +allow_env_map_entry(key, i_val, p_env_map) { + p_val := p_env_map[key] + i_val == p_val + print("allow_env_map_entry: true") +} + +# Allow resourceFieldRef values (e.g., "limits.cpu"). +allow_env_map_entry(key, i_val, p_env_map) { + p_val := p_env_map[key] + # a variable we should be validating using a regex from settings + p_val == "$(validate-from-settings)" + regex_val := policy_data.request_defaults.CreateContainerRequest.allow_env_regex_map[key] + regex.match(regex_val, i_val) + print("allow_env_map_entry 2: true") +} + +# Allow node-name +allow_env_map_entry(key, i_val, p_env_map) { + p_val := p_env_map[key] + p_val == "$(node-name)" + regex.match(policy_data.common.dns_subdomain , i_val) + print("allow_env_map_entry 3: true") +} + +# Allow host-name +allow_env_map_entry(key, i_val, p_env_map) { + p_val := p_env_map[key] + p_val == "$(host-name)" + regex.match(policy_data.common.dns_label , i_val) + print("allow_env_map_entry 4: true") +} + +# Allow pod-uid +allow_env_map_entry(key, i_val, p_env_map) { + p_val := p_env_map[key] + p_val == "$(pod-uid)" + regex.match(policy_data.common.pod_uid , i_val) + print("allow_env_map_entry 5: true") +} + +# Allow fieldRef "fieldPath: status.podIP" values. +allow_env_map_entry(key, i_val, p_env_map) { + is_ip(i_val) + + p_val := p_env_map[key] + p_var := concat("=", [key, p_val]) + allow_pod_ip_var(key, p_var) + print("allow_env_map_entry 6: true") +} + +# Allow fieldRef "fieldPath: status.hostIP" values. +allow_env_map_entry(key, i_val, p_env_map) { + is_ip(i_val) + + p_val := p_env_map[key] + p_var := concat("=", [key, p_val]) + allow_host_ip_var(key, p_var) + print("allow_env_map_entry 7: true") +} + +# Match input with one of the policy variables, after substituting $(sandbox-name). +allow_env_map_entry(key, i_val, p_env_map) { + p_val := p_env_map[key] + p_val == "$(sandbox-name)" + s_name := input.base.OCI.Annotations[S_NAME_KEY] + p_var2 := replace(p_val, "$(sandbox-name)", s_name) + p_var2 == i_val + print("allow_env_map_entry 8: true") +} + +# Match input with one of the policy variables, after substituting $(sandbox-namespace). +allow_env_map_entry(key, i_val, p_env_map) { + p_val := p_env_map[key] + p_val == "$(sandbox-namespace)" + s_namespace := input.base.OCI.Annotations[S_NAMESPACE_KEY] + p_var2 := replace(p_val, "$(sandbox-namespace)", s_namespace) + p_var2 == i_val + print("allow_env_map_entry 9: true") +} + +# Allow input env variables that match with a request_defaults regex. +allow_env_map_entry(key, i_val, p_env_map) { + some p_regex1 in policy_data.request_defaults.CreateContainerRequest.allow_env_regex + p_regex2 := replace(p_regex1, "$(ipv4_a)", policy_data.common.ipv4_a) + p_regex3 := replace(p_regex2, "$(ip_p)", policy_data.common.ip_p) + p_regex4 := replace(p_regex3, "$(svc_name)", policy_data.common.svc_name) + p_regex5 := replace(p_regex4, "$(dns_label)", policy_data.common.dns_label) + + result := concat("=", [key, i_val]) + regex.match(p_regex5, result) + + print("allow_env_map_entry 10: true") +} + +CreateContainerRequest:= resp { + not input.env_map + i_process = input.OCI.Process + s_name = input.OCI.Annotations[S_NAME_KEY] + some p_container in policy_data.containers + p_process = p_container.OCI.Process + allow_deprecated_args(p_process, i_process, s_name) + resp = CreateContainerRequestCommon(input) + print("CreateContainerRequest2: true") +} + +CreateContainerRequestCommon(req):= {"ops": ops, "allowed": true} { # Check if the input request should be rejected even before checking the # policy_data.containers information. - allow_create_container_input + allow_create_container_input(req) - i_oci := input.OCI - i_storages := input.storages - i_devices := input.devices + i_oci := req.OCI + i_storages := req.storages + i_devices := req.devices # array of possible state operations ops_builder := [] @@ -72,11 +256,11 @@ CreateContainerRequest:= {"ops": ops, "allowed": true} { # Check if any element from the policy_data.containers array allows the input request. some p_container in policy_data.containers - print("======== CreateContainerRequest: trying next policy container") + print("======== CreateContainerRequestCommon: trying next policy container") p_pidns := p_container.sandbox_pidns - i_pidns := input.sandbox_pidns - print("CreateContainerRequest: p_pidns =", p_pidns, "i_pidns =", i_pidns) + i_pidns := req.sandbox_pidns + print("CreateContainerRequestCommon: p_pidns =", p_pidns, "i_pidns =", i_pidns) p_pidns == i_pidns p_oci := p_container.OCI @@ -84,14 +268,14 @@ CreateContainerRequest:= {"ops": ops, "allowed": true} { # check namespace p_namespace := p_oci.Annotations[S_NAMESPACE_KEY] i_namespace := i_oci.Annotations[S_NAMESPACE_KEY] - print ("CreateContainerRequest: p_namespace =", p_namespace, "i_namespace =", i_namespace) + print ("CreateContainerRequestCommon: p_namespace =", p_namespace, "i_namespace =", i_namespace) add_namespace_to_state := allow_namespace(p_namespace, i_namespace) ops_builder2 := concat_op_if_not_null(ops_builder1, add_namespace_to_state) - print("CreateContainerRequest: p Version =", p_oci.Version, "i Version =", i_oci.Version) + print("CreateContainerRequestCommon: p Version =", p_oci.Version, "i Version =", i_oci.Version) p_oci.Version == i_oci.Version - print("CreateContainerRequest: p Readonly =", p_oci.Root.Readonly, "i Readonly =", i_oci.Root.Readonly) + print("CreateContainerRequestCommon: p Readonly =", p_oci.Root.Readonly, "i Readonly =", i_oci.Root.Readonly) p_oci.Root.Readonly == i_oci.Root.Readonly allow_anno(p_oci, i_oci) @@ -107,16 +291,16 @@ CreateContainerRequest:= {"ops": ops, "allowed": true} { ops := ret.ops - print("CreateContainerRequest: true") + print("CreateContainerRequestCommon: true") } -allow_create_container_input { - print("allow_create_container_input: input =", input) +allow_create_container_input(req) { + print("allow_create_container_input: input =", req) - count(input.shared_mounts) == 0 - is_null(input.string_user) + count(req.shared_mounts) == 0 + is_null(req.string_user) - i_oci := input.OCI + i_oci := req.OCI is_null(i_oci.Hooks) is_null(i_oci.Solaris) is_null(i_oci.Windows) @@ -152,7 +336,7 @@ allow_namespace(p_namespace, i_namespace) = add_namespace { add_namespace := state_allows("namespace", i_namespace) } -# key hasn't been seen before, save key, value pair to state +# value hasn't been seen before, save it to state state_allows(key, value) = action { state := get_state() print("state_allows 1: state[key] =", state[key], "value =", value) @@ -181,6 +365,11 @@ get_state() = state { state := data["pstate"] } +get_state_val(key) = value { + state := get_state() + value := state[key] +} + get_state_path(key) = path { # prepend "/pstate/" to key path := concat("/", ["/pstate", key]) @@ -245,7 +434,10 @@ allow_by_anno(p_oci, i_oci, p_storages, i_storages) { i_s_name := i_oci.Annotations[S_NAME_KEY] print("allow_by_anno 1: i_s_name =", i_s_name) - allow_by_sandbox_name(p_oci, i_oci, p_storages, i_storages, i_s_name) + i_s_namespace := i_oci.Annotations[S_NAMESPACE_KEY] + print("allow_by_anno 1: i_s_namespace =", i_s_namespace) + + allow_by_sandbox_name(p_oci, i_oci, p_storages, i_storages, i_s_name, i_s_namespace) print("allow_by_anno 1: true") } @@ -257,19 +449,23 @@ allow_by_anno(p_oci, i_oci, p_storages, i_storages) { print("allow_by_anno 2: i_s_name =", i_s_name, "p_s_name =", p_s_name) allow_sandbox_name(p_s_name, i_s_name) - allow_by_sandbox_name(p_oci, i_oci, p_storages, i_storages, i_s_name) + + i_s_namespace := i_oci.Annotations[S_NAMESPACE_KEY] + print("allow_by_anno 2: i_s_namespace =", i_s_namespace) + + allow_by_sandbox_name(p_oci, i_oci, p_storages, i_storages, i_s_name, i_s_namespace) print("allow_by_anno 2: true") } -allow_by_sandbox_name(p_oci, i_oci, p_storages, i_storages, s_name) { +allow_by_sandbox_name(p_oci, i_oci, p_storages, i_storages, s_name, s_namespace) { print("allow_by_sandbox_name: start") i_namespace := i_oci.Annotations[S_NAMESPACE_KEY] allow_by_container_types(p_oci, i_oci, s_name, i_namespace) allow_by_bundle_or_sandbox_id(p_oci, i_oci, p_storages, i_storages) - allow_process(p_oci, i_oci, s_name) + allow_process(p_oci.Process, i_oci.Process, s_name, s_namespace) print("allow_by_sandbox_name: true") } @@ -623,6 +819,9 @@ allow_by_bundle_or_sandbox_id(p_oci, i_oci, p_storages, i_storages) { bundle_path := i_oci.Annotations["io.katacontainers.pkg.oci.bundle_path"] bundle_id := replace(bundle_path, "/run/containerd/io.containerd.runtime.v2.task/k8s.io/", "") + bundle_id_format := concat("", ["^", BUNDLE_ID, "$"]) + regex.match(bundle_id_format, bundle_id) + key := "io.kubernetes.cri.sandbox-id" p_regex := p_oci.Annotations[key] @@ -633,37 +832,64 @@ allow_by_bundle_or_sandbox_id(p_oci, i_oci, p_storages, i_storages) { allow_root_path(p_oci, i_oci, bundle_id) - every i_mount in input.OCI.Mounts { - allow_mount(p_oci, i_mount, bundle_id, sandbox_id) + every i_mount in i_oci.Mounts { + allow_mount(p_oci, i_mount, i_storages, bundle_id, sandbox_id) } - # TODO: enable allow_storages() after fixing https://github.com/kata-containers/kata-containers/issues/8833 - # allow_storages(p_storages, i_storages, bundle_id, sandbox_id) + allow_storages(p_storages, i_storages, bundle_id, sandbox_id) print("allow_by_bundle_or_sandbox_id: true") } -allow_process(p_oci, i_oci, s_name) { - p_process := p_oci.Process - i_process := i_oci.Process +allow_process_common(p_process, i_process, s_name, s_namespace) { + print("allow_process_common: p_process =", p_process) + print("allow_process_common: i_process = ", i_process) + print("allow_process_common: s_name =", s_name) - print("allow_process: i terminal =", i_process.Terminal, "p terminal =", p_process.Terminal) - p_process.Terminal == i_process.Terminal - - print("allow_process: i cwd =", i_process.Cwd, "i cwd =", p_process.Cwd) p_process.Cwd == i_process.Cwd - - print("allow_process: i noNewPrivileges =", i_process.NoNewPrivileges, "p noNewPrivileges =", p_process.NoNewPrivileges) p_process.NoNewPrivileges == i_process.NoNewPrivileges - allow_caps(p_process.Capabilities, i_process.Capabilities) allow_user(p_process, i_process) - allow_args(p_process, i_process, s_name) - allow_env(p_process, i_process, s_name) + allow_env(p_process, i_process, s_name, s_namespace) + + print("allow_process_common: true") +} + +# Compare the OCI Process field of a policy container with the input OCI Process from a CreateContainerRequest +allow_process(p_process, i_process, s_name, s_namespace) { + print("allow_process: start") + + allow_process_common(p_process, i_process, s_name, s_namespace) + allow_caps(p_process.Capabilities, i_process.Capabilities) + p_process.Terminal == i_process.Terminal print("allow_process: true") } +# Compare the OCI Process field of a policy container with the input process field from ExecProcessRequest +allow_interactive_process(p_process, i_process, s_name, s_namespace) { + print("allow_interactive_process: start") + + allow_process_common(p_process, i_process, s_name, s_namespace) + allow_exec_caps(i_process.Capabilities) + + # These are commands enabled using ExecProcessRequest commands and/or regex from the settings file. + # They can be executed interactively so allow them to use any value for i_process.Terminal. + + print("allow_interactive_process: true") +} + +# Compare the OCI Process field of a policy container with the input process field from ExecProcessRequest +allow_probe_process(p_process, i_process, s_name, s_namespace) { + print("allow_probe_process: start") + + allow_process_common(p_process, i_process, s_name, s_namespace) + allow_exec_caps(i_process.Capabilities) + p_process.Terminal == i_process.Terminal + + print("allow_probe_process: true") +} + allow_user(p_process, i_process) { p_user := p_process.User i_user := i_process.User @@ -681,89 +907,97 @@ allow_user(p_process, i_process) { # based on /etc/passwd and /etc/group from the container image. } -allow_args(p_process, i_process, s_name) { - print("allow_args 1: no args") +allow_deprecated_args(p_process, i_process, s_name) { + print("allow_deprecated_args 1: no args") - not p_process.Args + not p_process.DeprecatedArgs not i_process.Args - print("allow_args 1: true") + print("allow_deprecated_args 1: true") } -allow_args(p_process, i_process, s_name) { - print("allow_args 2: policy args =", p_process.Args) - print("allow_args 2: input args =", i_process.Args) +allow_deprecated_args(p_process, i_process, s_name) { + print("allow_deprecated_args 2: policy args =", p_process.DeprecatedArgs) + print("allow_deprecated_args 2: input args =", i_process.Args) - count(p_process.Args) == count(i_process.Args) + count(p_process.DeprecatedArgs) == count(i_process.Args) every i, i_arg in i_process.Args { - allow_arg(i, i_arg, p_process, s_name) + allow_deprecated_arg(i, i_arg, p_process, s_name) } - print("allow_args 2: true") + print("allow_deprecated_args 2: true") } -allow_arg(i, i_arg, p_process, s_name) { - p_arg := p_process.Args[i] - print("allow_arg 1: i =", i, "i_arg =", i_arg, "p_arg =", p_arg) +allow_deprecated_arg(i, i_arg, p_process, s_name) { + p_arg := p_process.DeprecatedArgs[i] + print("allow_deprecated_arg 1: i =", i, "i_arg =", i_arg, "p_arg =", p_arg) p_arg2 := replace(p_arg, "$$", "$") p_arg2 == i_arg - print("allow_arg 1: true") + print("allow_deprecated_arg 1: true") } -allow_arg(i, i_arg, p_process, s_name) { - p_arg := p_process.Args[i] - print("allow_arg 2: i =", i, "i_arg =", i_arg, "p_arg =", p_arg) +allow_deprecated_arg(i, i_arg, p_process, s_name) { + p_arg := p_process.DeprecatedArgs[i] + print("allow_deprecated_arg 2: i =", i, "i_arg =", i_arg, "p_arg =", p_arg) # TODO: can $(node-name) be handled better? contains(p_arg, "$(node-name)") - print("allow_arg 2: true") + print("allow_deprecated_arg 2: true") } -allow_arg(i, i_arg, p_process, s_name) { - p_arg := p_process.Args[i] - print("allow_arg 3: i =", i, "i_arg =", i_arg, "p_arg =", p_arg) +allow_deprecated_arg(i, i_arg, p_process, s_name) { + p_arg := p_process.DeprecatedArgs[i] + print("allow_deprecated_arg 3: i =", i, "i_arg =", i_arg, "p_arg =", p_arg) p_arg2 := replace(p_arg, "$$", "$") p_arg3 := replace(p_arg2, "$(sandbox-name)", s_name) - print("allow_arg 3: p_arg3 =", p_arg3) + print("allow_deprecated_arg 3: p_arg3 =", p_arg3) p_arg3 == i_arg - print("allow_arg 3: true") + print("allow_deprecated_arg 3: true") } # OCI process.Env field -allow_env(p_process, i_process, s_name) { +allow_env(p_process, i_process, s_name, s_namespace) { print("allow_env: p env =", p_process.Env) print("allow_env: i env =", i_process.Env) every i_var in i_process.Env { print("allow_env: i_var =", i_var) - allow_var(p_process, i_process, i_var, s_name) + allow_var(p_process, i_process, i_var, s_name, s_namespace) } print("allow_env: true") } # Allow input env variables that are present in the policy data too. -allow_var(p_process, i_process, i_var, s_name) { +allow_var(p_process, i_process, i_var, s_name, s_namespace) { some p_var in p_process.Env p_var == i_var print("allow_var 1: true") } # Match input with one of the policy variables, after substituting $(sandbox-name). -allow_var(p_process, i_process, i_var, s_name) { +allow_var(p_process, i_process, i_var, s_name, s_namespace) { some p_var in p_process.Env - p_var2 := replace(p_var, "$(sandbox-name)", s_name) + print("allow_var 2: p_var =", p_var) - print("allow_var 2: p_var2 =", p_var2) - p_var2 == i_var + p_var_split := split(p_var, "=") + count(p_var_split) == 2 + + p_var_split[1] == "$(sandbox-name)" + + i_var_split := split(i_var, "=") + count(i_var_split) == 2 + + i_var_split[0] == p_var_split[0] + regex.match(s_name, i_var_split[1]) print("allow_var 2: true") } # Allow input env variables that match with a request_defaults regex. -allow_var(p_process, i_process, i_var, s_name) { +allow_var(p_process, i_process, i_var, s_name, s_namespace) { some p_regex1 in policy_data.request_defaults.CreateContainerRequest.allow_env_regex p_regex2 := replace(p_regex1, "$(ipv4_a)", policy_data.common.ipv4_a) p_regex3 := replace(p_regex2, "$(ip_p)", policy_data.common.ip_p) @@ -777,7 +1011,7 @@ allow_var(p_process, i_process, i_var, s_name) { } # Allow fieldRef "fieldPath: status.podIP" values. -allow_var(p_process, i_process, i_var, s_name) { +allow_var(p_process, i_process, i_var, s_name, s_namespace) { name_value := split(i_var, "=") count(name_value) == 2 is_ip(name_value[1]) @@ -789,7 +1023,7 @@ allow_var(p_process, i_process, i_var, s_name) { } # Allow common fieldRef variables. -allow_var(p_process, i_process, i_var, s_name) { +allow_var(p_process, i_process, i_var, s_name, s_namespace) { name_value := split(i_var, "=") count(name_value) == 2 @@ -808,7 +1042,7 @@ allow_var(p_process, i_process, i_var, s_name) { } # Allow fieldRef "fieldPath: status.hostIP" values. -allow_var(p_process, i_process, i_var, s_name) { +allow_var(p_process, i_process, i_var, s_name, s_namespace) { name_value := split(i_var, "=") count(name_value) == 2 is_ip(name_value[1]) @@ -820,7 +1054,7 @@ allow_var(p_process, i_process, i_var, s_name) { } # Allow resourceFieldRef values (e.g., "limits.cpu"). -allow_var(p_process, i_process, i_var, s_name) { +allow_var(p_process, i_process, i_var, s_name, s_namespace) { name_value := split(i_var, "=") count(name_value) == 2 @@ -830,14 +1064,30 @@ allow_var(p_process, i_process, i_var, s_name) { p_name_value[0] == name_value[0] - # TODO: should these be handled in a different way? - always_allowed = ["$(resource-field)", "$(todo-annotation)"] - some allowed in always_allowed - contains(p_name_value[1], allowed) + # a variable we should be validating using a regex from settings + p_name_value[1] == "$(validate-from-settings)" + + regex_val := policy_data.request_defaults.CreateContainerRequest.allow_env_regex_map[name_value[0]] + + print("allow_var 7: val =", name_value[1]) + print("allow_var 7: regex_val =", regex_val) + + regex.match(regex_val, name_value[1]) print("allow_var 7: true") } +# Match input with one of the policy variables, after substituting $(sandbox-namespace). +allow_var(p_process, i_process, i_var, s_name, s_namespace) { + some p_var in p_process.Env + p_var2 := replace(p_var, "$(sandbox-namespace)", s_namespace) + + print("allow_var 8: p_var2 =", p_var2) + p_var2 == i_var + + print("allow_var 8: true") +} + allow_pod_ip_var(var_name, p_var) { print("allow_pod_ip_var: var_name =", var_name, "p_var =", p_var) @@ -900,12 +1150,16 @@ allow_root_path(p_oci, i_oci, bundle_id) { } # device mounts -allow_mount(p_oci, i_mount, bundle_id, sandbox_id) { +allow_mount(p_oci, i_mount, i_storages, bundle_id, sandbox_id) { print("allow_mount: i_mount =", i_mount) some p_mount in p_oci.Mounts + some i_storage in i_storages + print("allow_mount: p_mount =", p_mount) - check_mount(p_mount, i_mount, bundle_id, sandbox_id) + print("allow_mount: i_storage =", i_storage) + + check_mount(p_mount, i_mount, i_storage, bundle_id, sandbox_id) # TODO: are there any other required policy checks for mounts - e.g., # multiple mounts with same source or destination? @@ -913,21 +1167,21 @@ allow_mount(p_oci, i_mount, bundle_id, sandbox_id) { print("allow_mount: true") } -check_mount(p_mount, i_mount, bundle_id, sandbox_id) { +check_mount(p_mount, i_mount, i_storage, bundle_id, sandbox_id) { p_mount == i_mount print("check_mount 1: true") } -check_mount(p_mount, i_mount, bundle_id, sandbox_id) { +check_mount(p_mount, i_mount, i_storage, bundle_id, sandbox_id) { p_mount.destination == i_mount.destination p_mount.type_ == i_mount.type_ p_mount.options == i_mount.options - mount_source_allows(p_mount, i_mount, bundle_id, sandbox_id) + mount_source_allows(p_mount, i_mount, i_storage, bundle_id, sandbox_id) print("check_mount 2: true") } -mount_source_allows(p_mount, i_mount, bundle_id, sandbox_id) { +mount_source_allows(p_mount, i_mount, i_storage, bundle_id, sandbox_id) { regex1 := p_mount.source regex2 := replace(regex1, "$(sfprefix)", policy_data.common.sfprefix) regex3 := replace(regex2, "$(cpath)", policy_data.common.mount_source_cpath) @@ -938,7 +1192,7 @@ mount_source_allows(p_mount, i_mount, bundle_id, sandbox_id) { print("mount_source_allows 1: true") } -mount_source_allows(p_mount, i_mount, bundle_id, sandbox_id) { +mount_source_allows(p_mount, i_mount, i_storage, bundle_id, sandbox_id) { regex1 := p_mount.source regex2 := replace(regex1, "$(sfprefix)", policy_data.common.sfprefix) regex3 := replace(regex2, "$(cpath)", policy_data.common.mount_source_cpath) @@ -949,6 +1203,14 @@ mount_source_allows(p_mount, i_mount, bundle_id, sandbox_id) { print("mount_source_allows 2: true") } +mount_source_allows(p_mount, i_mount, i_storage, bundle_id, sandbox_id) { + print("mount_source_allows 3: i_mount.source =", i_mount.source) + print("mount_source_allows 3: i_storage.mount_point =", i_storage.mount_point) + + i_mount.source == i_storage.mount_point + + print("mount_source_allows 3: true") +} ###################################################################### # Create container Storages @@ -988,19 +1250,60 @@ allow_storage(p_storages, i_storage, bundle_id, sandbox_id, layer_ids, root_hash p_storage.driver == i_storage.driver p_storage.driver_options == i_storage.driver_options p_storage.fs_group == i_storage.fs_group + p_storage.fstype == i_storage.fstype + allow_storage_source(p_storage, i_storage, layer_ids, root_hashes) allow_storage_options(p_storage, i_storage, layer_ids, root_hashes) allow_mount_point(p_storage, i_storage, bundle_id, sandbox_id, layer_ids) - # TODO: validate the source field too. - print("allow_storage: true") } +allow_storage_source(p_storage, i_storage, layer_ids, root_hashes) { + print("allow_storage_source 1: start") + + p_storage.source == i_storage.source + + print("allow_storage_source 1: true") +} + +allow_storage_source(p_storage, i_storage, layer_ids, root_hashes) { + print("allow_storage_source 2: start") + + p_storage.driver == "blk" + + # DDDD:BB:DD.F: Domain:Bus:Device.Function + # https://www.kernel.org/doc/Documentation/ABI/testing/sysfs-bus-pci + regex.match(`^[a-f0-9]{4}:[a-f0-9]{2}:[a-f0-9]{2}\.[a-f0-9]$`, i_storage.source) + + print("allow_storage_source 2: true") +} + +allow_storage_source(p_storage, i_storage, layer_ids, root_hashes) { + print("allow_storage_source 3: start") + + p_storage.driver == "overlayfs" + i_storage.source == "none" + + print("allow_storage_source 3: true") +} + +allow_storage_source(p_storage, i_storage, layer_ids, root_hashes) { + print("allow_storage_source 4: start") + + p_storage.driver == "smb" + + # Pattern: //.file.core.windows.net/ + # Storage account name: https://learn.microsoft.com/en-us/azure/storage/common/storage-account-overview#storage-account-name + # K8s PVC name: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#dns-subdomain-names + regex.match(`^\/\/([a-z0-9]{3,24})\.file\.core\.windows\.net\/[a-z0-9]([a-z0-9.-]{0,251}[a-z0-9])?$`, i_storage.source) + + print("allow_storage_source 4: true") +} + allow_storage_options(p_storage, i_storage, layer_ids, root_hashes) { print("allow_storage_options 1: start") - p_storage.driver != "blk" p_storage.driver != "overlayfs" p_storage.options == i_storage.options @@ -1071,6 +1374,25 @@ allow_storage_options(p_storage, i_storage, layer_ids, root_hashes) { print("allow_storage_options 3: true") } +allow_storage_options(p_storage, i_storage, layer_ids, root_hashes) { + print("allow_storage_options 4: start") + + p_storage.driver == "smb" + p_opts_count := count(p_storage.options) + i_opts_count := count(i_storage.options) + i_opts_count == p_opts_count + 2 + + i_opt_matches := [i | i := idx; idx < p_opts_count; p_storage.options[idx] == i_storage.options[idx]] + count(i_opt_matches) == p_opts_count + + startswith(i_storage.options[i_opts_count-2], "addr=") + creds = split(i_storage.options[i_opts_count-1], ",") + count(creds) == 2 + startswith(creds[0], "username=") + startswith(creds[1], "password=") + + print("allow_storage_options 4: true") +} allow_overlay_layer(policy_id, policy_hash, i_option) { print("allow_overlay_layer: policy_id =", policy_id, "policy_hash =", policy_hash) @@ -1164,8 +1486,46 @@ allow_mount_point(p_storage, i_storage, bundle_id, sandbox_id, layer_ids) { print("allow_mount_point 5: true") } +allow_mount_point(p_storage, i_storage, bundle_id, sandbox_id, layer_ids) { + print("allow_mount_point 6: i_storage.mount_point =", i_storage.mount_point) + allow_direct_vol_driver(p_storage, i_storage) + + mount1 := p_storage.mount_point + print("allow_mount_point 6: mount1 =", mount1) + + mount2 := replace(mount1, "$(spath)", policy_data.common.spath) + print("allow_mount_point 6: mount2 =", mount2) + + direct_vol_path := i_storage.source + mount3 := replace(mount2, "$(b64-direct-vol-path)", base64url.encode(direct_vol_path)) + print("allow_mount_point 6: mount3 =", mount3) + + mount3 == i_storage.mount_point + + print("allow_mount_point 6: true") +} -# process.Capabilities +allow_direct_vol_driver(p_storage, i_storage) { + print("allow_direct_vol_driver 1: start") + p_storage.driver == "blk" + print("allow_direct_vol_driver 1: true") +} +allow_direct_vol_driver(p_storage, i_storage) { + print("allow_direct_vol_driver 2: start") + p_storage.driver == "smb" + print("allow_direct_vol_driver 2: true") +} + +# ExecProcessRequest.process.Capabilities +allow_exec_caps(i_caps) { + not i_caps.Ambient + not i_caps.Bounding + not i_caps.Effective + not i_caps.Inheritable + not i_caps.Permitted +} + +# OCI.Process.Capabilities allow_caps(p_caps, i_caps) { print("allow_caps: policy Ambient =", p_caps.Ambient) print("allow_caps: input Ambient =", i_caps.Ambient) @@ -1224,6 +1584,28 @@ check_directory_traversal(i_path) { not regex.match("(^|/)..($|/)", i_path) } +check_symlink_source(i_src) { + i_src == "" + print("check_symlink_source 1: true") +} +check_symlink_source(i_src) { + i_src != "" + print("check_symlink_source 2: i_src =", i_src) + + regex.match(policy_data.common.s_source1, i_src) + + print("check_symlink_source 2: true") +} +check_symlink_source(i_src) { + i_src != "" + print("check_symlink_source 3: i_src =", i_src) + + regex.match(policy_data.common.s_source2, i_src) + check_directory_traversal(i_src) + + print("check_symlink_source 3: true") +} + allow_sandbox_storages(i_storages) { print("allow_sandbox_storages: i_storages =", i_storages) @@ -1248,12 +1630,13 @@ allow_sandbox_storage(p_storages, i_storage) { CopyFileRequest { print("CopyFileRequest: input.path =", input.path) + check_symlink_source(input.symlink_src) check_directory_traversal(input.path) some regex1 in policy_data.request_defaults.CopyFileRequest regex2 := replace(regex1, "$(sfprefix)", policy_data.common.sfprefix) - regex3 := replace(regex2, "$(cpath)", policy_data.common.mount_source_cpath) - regex4 := replace(regex3, "$(bundle-id)", "[a-z0-9]{64}") + regex3 := replace(regex2, "$(cpath)", policy_data.common.cpath) + regex4 := replace(regex3, "$(bundle-id)", BUNDLE_ID) print("CopyFileRequest: regex4 =", regex4) regex.match(regex4, input.path) @@ -1274,6 +1657,29 @@ CreateSandboxRequest { allow_sandbox_storages(input.storages) } +allow_exec(p_container, i_process) { + print("allow_exec: start") + + p_oci = p_container.OCI + p_s_name = p_oci.Annotations[S_NAME_KEY] + s_namespace = get_state_val("namespace") + allow_probe_process(p_oci.Process, i_process, p_s_name, s_namespace) + + print("allow_exec: true") +} + +allow_interactive_exec(p_container, i_process) { + print("allow_interactive_exec: start") + + p_oci = p_container.OCI + p_s_name = p_oci.Annotations[S_NAME_KEY] + s_namespace = get_state_val("namespace") + allow_interactive_process(p_oci.Process, i_process, p_s_name, s_namespace) + + print("allow_interactive_exec: true") +} + +# TODO: should other ExecProcessRequest input data fields be validated as well? ExecProcessRequest { print("ExecProcessRequest 1: input =", input) @@ -1281,19 +1687,25 @@ ExecProcessRequest { print("ExecProcessRequest 1: p_command =", p_command) p_command == input.process.Args + # TODO: match p_container's ID with the input container_id. + some p_container in policy_data.containers + allow_interactive_exec(p_container, input.process) + print("ExecProcessRequest 1: true") } ExecProcessRequest { print("ExecProcessRequest 2: input =", input) # TODO: match input container ID with its corresponding container.exec_commands. - some container in policy_data.containers - some p_command in container.exec_commands + some p_container in policy_data.containers + some p_command in p_container.exec_commands print("ExecProcessRequest 2: p_command =", p_command) # TODO: should other input data fields be validated as well? p_command == input.process.Args + allow_exec(p_container, input.process) + print("ExecProcessRequest 2: true") } ExecProcessRequest { @@ -1307,6 +1719,10 @@ ExecProcessRequest { regex.match(p_regex, i_command) + # TODO: match p_container's ID with the input container_id. + some p_container in policy_data.containers + allow_interactive_exec(p_container, input.process) + print("ExecProcessRequest 3: true") } diff --git a/src/tools/genpolicy/src/agent.rs b/src/tools/genpolicy/src/agent.rs new file mode 100644 index 000000000000..408d1f704bae --- /dev/null +++ b/src/tools/genpolicy/src/agent.rs @@ -0,0 +1,27 @@ +use serde::{Deserialize, Serialize}; + +#[derive(Clone, Debug, Serialize, Deserialize)] +pub struct Storage { + pub driver: String, + pub driver_options: Vec, + pub source: String, + pub fstype: String, + pub options: Vec, + pub mount_point: String, + pub fs_group: Option, +} + +#[derive(Clone, Debug, Serialize, Deserialize)] +pub struct SerializedFsGroup { + pub group_id: u32, + pub group_change_policy: u32, +} + +#[derive(Clone, Debug, Default, Serialize, Deserialize)] +pub struct Device { + pub id: String, + pub type_: String, + pub vm_path: String, + pub container_path: String, + pub options: Vec, +} diff --git a/src/tools/genpolicy/src/config_map.rs b/src/tools/genpolicy/src/config_map.rs index 69519bd9d3f6..1c3ad3a77f87 100644 --- a/src/tools/genpolicy/src/config_map.rs +++ b/src/tools/genpolicy/src/config_map.rs @@ -6,17 +6,18 @@ // Allow K8s YAML field names. #![allow(non_snake_case)] +use crate::agent; use crate::obj_meta; use crate::pod; use crate::policy; +use crate::pvc; +use crate::settings; use crate::utils::Config; use crate::yaml; use async_trait::async_trait; -use log::debug; use serde::{Deserialize, Serialize}; use std::collections::BTreeMap; -use std::fs::File; /// See Reference / Kubernetes API / Config and Storage Resources / ConfigMap. #[derive(Clone, Debug, Serialize, Deserialize)] @@ -41,14 +42,6 @@ pub struct ConfigMap { } impl ConfigMap { - pub fn new(file: &str) -> anyhow::Result { - debug!("Reading ConfigMap..."); - let config_map: ConfigMap = serde_yaml::from_reader(File::open(file)?)?; - debug!("\nRead ConfigMap => {:#?}", config_map); - - Ok(config_map) - } - pub fn get_value(&self, value_from: &pod::EnvVarSource) -> Option { if let Some(key_ref) = &value_from.configMapKeyRef { if let Some(name) = &key_ref.name { @@ -114,6 +107,21 @@ impl yaml::K8sResource for ConfigMap { self.doc_mapping = doc_mapping.clone(); } + fn get_sandbox_name(&self) -> Option { + panic!("Unsupported"); + } + + fn get_container_mounts_and_storages( + &self, + _policy_mounts: &mut Vec, + _storages: &mut Vec, + _persistent_volume_claims: &[pvc::PersistentVolumeClaim], + _container: &pod::Container, + _settings: &settings::Settings, + ) { + panic!("Unsupported"); + } + fn generate_policy(&self, _agent_policy: &policy::AgentPolicy) -> String { "".to_string() } diff --git a/src/tools/genpolicy/src/containerd.rs b/src/tools/genpolicy/src/containerd.rs index df7e4d110802..0d9af370144d 100644 --- a/src/tools/genpolicy/src/containerd.rs +++ b/src/tools/genpolicy/src/containerd.rs @@ -30,6 +30,7 @@ pub fn get_process(privileged_container: bool, common: &policy::CommonData) -> p policy::KataProcess { Terminal: false, User: Default::default(), + DeprecatedArgs: Vec::new(), Args: Vec::new(), Env: Vec::new(), Cwd: "/".to_string(), diff --git a/src/tools/genpolicy/src/cronjob.rs b/src/tools/genpolicy/src/cronjob.rs index 3719a89c2fa2..61a43675a53d 100644 --- a/src/tools/genpolicy/src/cronjob.rs +++ b/src/tools/genpolicy/src/cronjob.rs @@ -6,16 +6,17 @@ // Allow K8s YAML field names. #![allow(non_snake_case)] +use crate::agent; use crate::job; use crate::obj_meta; use crate::pod; use crate::policy; +use crate::pvc; use crate::settings; use crate::utils::Config; use crate::yaml; use async_trait::async_trait; -use protocols::agent; use serde::{Deserialize, Serialize}; use std::collections::BTreeMap; @@ -91,12 +92,14 @@ impl yaml::K8sResource for CronJob { &self, policy_mounts: &mut Vec, storages: &mut Vec, + persistent_volume_claims: &[pvc::PersistentVolumeClaim], container: &pod::Container, settings: &settings::Settings, ) { yaml::get_container_mounts_and_storages( policy_mounts, storages, + persistent_volume_claims, container, settings, &self.spec.jobTemplate.spec.template.spec.volumes, diff --git a/src/tools/genpolicy/src/daemon_set.rs b/src/tools/genpolicy/src/daemon_set.rs index 012e25adbda5..d5f780abd3d7 100644 --- a/src/tools/genpolicy/src/daemon_set.rs +++ b/src/tools/genpolicy/src/daemon_set.rs @@ -6,16 +6,17 @@ // Allow K8s YAML field names. #![allow(non_snake_case)] +use crate::agent; use crate::obj_meta; use crate::pod; use crate::pod_template; use crate::policy; +use crate::pvc; use crate::settings; use crate::utils::Config; use crate::yaml; use async_trait::async_trait; -use protocols::agent; use serde::{Deserialize, Serialize}; use std::collections::BTreeMap; @@ -93,12 +94,14 @@ impl yaml::K8sResource for DaemonSet { &self, policy_mounts: &mut Vec, storages: &mut Vec, + persistent_volume_claims: &[pvc::PersistentVolumeClaim], container: &pod::Container, settings: &settings::Settings, ) { yaml::get_container_mounts_and_storages( policy_mounts, storages, + persistent_volume_claims, container, settings, &self.spec.template.spec.volumes, diff --git a/src/tools/genpolicy/src/deployment.rs b/src/tools/genpolicy/src/deployment.rs index 3a59bccb76ab..86c9aa56763e 100644 --- a/src/tools/genpolicy/src/deployment.rs +++ b/src/tools/genpolicy/src/deployment.rs @@ -6,16 +6,17 @@ // Allow K8s YAML field names. #![allow(non_snake_case)] +use crate::agent; use crate::obj_meta; use crate::pod; use crate::pod_template; use crate::policy; +use crate::pvc; use crate::settings; use crate::utils::Config; use crate::yaml; use async_trait::async_trait; -use protocols::agent; use serde::{Deserialize, Serialize}; use std::collections::BTreeMap; @@ -91,12 +92,14 @@ impl yaml::K8sResource for Deployment { &self, policy_mounts: &mut Vec, storages: &mut Vec, + persistent_volume_claims: &[pvc::PersistentVolumeClaim], container: &pod::Container, settings: &settings::Settings, ) { yaml::get_container_mounts_and_storages( policy_mounts, storages, + persistent_volume_claims, container, settings, &self.spec.template.spec.volumes, diff --git a/src/tools/genpolicy/src/job.rs b/src/tools/genpolicy/src/job.rs index f5a723a1ac39..330cc894ab99 100644 --- a/src/tools/genpolicy/src/job.rs +++ b/src/tools/genpolicy/src/job.rs @@ -6,16 +6,17 @@ // Allow K8s YAML field names. #![allow(non_snake_case)] +use crate::agent; use crate::obj_meta; use crate::pod; use crate::pod_template; use crate::policy; +use crate::pvc; use crate::settings; use crate::utils::Config; use crate::yaml; use async_trait::async_trait; -use protocols::agent; use serde::{Deserialize, Serialize}; use std::collections::BTreeMap; @@ -65,12 +66,14 @@ impl yaml::K8sResource for Job { &self, policy_mounts: &mut Vec, storages: &mut Vec, + persistent_volume_claims: &[pvc::PersistentVolumeClaim], container: &pod::Container, settings: &settings::Settings, ) { yaml::get_container_mounts_and_storages( policy_mounts, storages, + persistent_volume_claims, container, settings, &self.spec.template.spec.volumes, diff --git a/src/tools/genpolicy/src/lib.rs b/src/tools/genpolicy/src/lib.rs index e6bb2100babb..20657396384b 100644 --- a/src/tools/genpolicy/src/lib.rs +++ b/src/tools/genpolicy/src/lib.rs @@ -3,6 +3,7 @@ // SPDX-License-Identifier: Apache-2.0 // +pub mod agent; pub mod config_map; pub mod containerd; pub mod cronjob; @@ -13,10 +14,10 @@ pub mod list; pub mod mount_and_storage; pub mod no_policy; pub mod obj_meta; -pub mod persistent_volume_claim; pub mod pod; pub mod pod_template; pub mod policy; +pub mod pvc; pub mod registry; pub mod registry_containerd; pub mod replica_set; diff --git a/src/tools/genpolicy/src/list.rs b/src/tools/genpolicy/src/list.rs index e88d5a1deda4..e1418968a1d6 100644 --- a/src/tools/genpolicy/src/list.rs +++ b/src/tools/genpolicy/src/list.rs @@ -6,15 +6,16 @@ // Allow K8s YAML field names. #![allow(non_snake_case)] +use crate::agent; use crate::pod; use crate::policy; +use crate::pvc; use crate::settings; use crate::utils::Config; use crate::yaml; use async_trait::async_trait; use core::fmt::Debug; -use protocols::agent; use serde::{Deserialize, Serialize}; use serde_yaml::Value; use std::boxed; @@ -49,10 +50,15 @@ impl yaml::K8sResource for List { } } + fn get_sandbox_name(&self) -> Option { + panic!("Unsupported"); + } + fn get_container_mounts_and_storages( &self, _policy_mounts: &mut Vec, _storages: &mut Vec, + _persistent_volume_claims: &[pvc::PersistentVolumeClaim], _container: &pod::Container, _settings: &settings::Settings, ) { diff --git a/src/tools/genpolicy/src/main.rs b/src/tools/genpolicy/src/main.rs index db17060491c5..c41a0d3811ea 100644 --- a/src/tools/genpolicy/src/main.rs +++ b/src/tools/genpolicy/src/main.rs @@ -5,6 +5,7 @@ use log::{debug, info}; +mod agent; mod config_map; mod containerd; mod cronjob; @@ -15,11 +16,12 @@ mod list; mod mount_and_storage; mod no_policy; mod obj_meta; -mod persistent_volume_claim; mod pod; mod pod_template; mod policy; +mod pvc; mod registry; +#[cfg(target_os = "linux")] mod registry_containerd; mod replica_set; mod replication_controller; diff --git a/src/tools/genpolicy/src/mount_and_storage.rs b/src/tools/genpolicy/src/mount_and_storage.rs index 394c06658565..a76bffda9582 100644 --- a/src/tools/genpolicy/src/mount_and_storage.rs +++ b/src/tools/genpolicy/src/mount_and_storage.rs @@ -6,13 +6,14 @@ // Allow OCI spec field names. #![allow(non_snake_case)] +use crate::agent; use crate::pod; use crate::policy; +use crate::pvc; use crate::settings; use crate::volume; -use log::debug; -use protocols::agent; +use log::{debug, warn}; use std::ffi::OsString; use std::path::Path; use std::str; @@ -99,17 +100,60 @@ fn adjust_termination_path(mount: &mut policy::KataMount, yaml_container: &pod:: } } +pub fn get_mount_info( + storage_class: Option<&String>, + settings: &settings::Settings, +) -> (bool, bool, Option>) { + if let Some(storage_class) = storage_class { + let is_blk_mount = settings + .common + .virtio_blk_storage_classes + .contains(storage_class); + + let is_smb_mount = settings + .common + .smb_storage_classes + .iter() + .any(|smb_class| &smb_class.name == storage_class); + + let smb_mount_options = if is_smb_mount { + settings + .common + .smb_storage_classes + .iter() + .find(|sc| &sc.name == storage_class) + .map(|sc| sc.mount_options.clone()) + } else { + None + }; + + (is_blk_mount, is_smb_mount, smb_mount_options) + } else { + warn!("Storage class is None. Defaulting to no mounts."); + (false, false, None) + } +} + pub fn get_mount_and_storage( settings: &settings::Settings, p_mounts: &mut Vec, storages: &mut Vec, + persistent_volume_claims: &[pvc::PersistentVolumeClaim], yaml_volume: &volume::Volume, yaml_mount: &pod::VolumeMount, ) { - debug!( - "get_mount_and_storage: adding mount and storage for: {:?}", - &yaml_volume - ); + let propagation = match &yaml_mount.mountPropagation { + Some(p) if p == "Bidirectional" => "rshared", + _ => "rprivate", + }; + + let access = if let Some(true) = yaml_mount.readOnly { + "ro" + } else { + "rw" + }; + + let mount_options = (propagation, access); if let Some(emptyDir) = &yaml_volume.emptyDir { let settings_volumes = &settings.volumes; @@ -130,16 +174,36 @@ pub fn get_mount_and_storage( } get_empty_dir_mount_and_storage(settings, p_mounts, storages, yaml_mount, volume.unwrap()); - } else if yaml_volume.persistentVolumeClaim.is_some() || yaml_volume.azureFile.is_some() { - get_shared_bind_mount(yaml_mount, p_mounts, "rprivate", "rw"); + } else if yaml_volume.persistentVolumeClaim.is_some() { + get_persistent_volume_claim_mount( + settings, + yaml_mount, + yaml_volume, + p_mounts, + storages, + persistent_volume_claims, + mount_options, + ); + } else if yaml_volume.azureFile.is_some() { + get_shared_bind_mount(yaml_mount, p_mounts, mount_options); } else if yaml_volume.hostPath.is_some() { - get_host_path_mount(yaml_mount, yaml_volume, p_mounts); + get_host_path_mount(yaml_mount, yaml_volume, p_mounts, mount_options); } else if yaml_volume.configMap.is_some() || yaml_volume.secret.is_some() { get_config_map_mount_and_storage(settings, p_mounts, storages, yaml_mount); } else if yaml_volume.projected.is_some() { - get_shared_bind_mount(yaml_mount, p_mounts, "rprivate", "ro"); + // Projected mounts are always read-only. + get_shared_bind_mount(yaml_mount, p_mounts, ("rprivate", "ro")); } else if yaml_volume.downwardAPI.is_some() { get_downward_api_mount(yaml_mount, p_mounts); + } else if yaml_volume.ephemeral.is_some() { + get_ephemeral_mount( + settings, + yaml_mount, + yaml_volume, + p_mounts, + storages, + mount_options, + ); } else { todo!("Unsupported volume type {:?}", yaml_volume); } @@ -162,8 +226,7 @@ fn get_empty_dir_mount_and_storage( fstype: settings_empty_dir.fstype.clone(), options: settings_empty_dir.options.clone(), mount_point: format!("{}{}$", &settings_empty_dir.mount_point, &yaml_mount.name), - fs_group: protobuf::MessageField::none(), - special_fields: ::protobuf::SpecialFields::new(), + fs_group: None, }); } @@ -201,29 +264,60 @@ fn get_empty_dir_mount_and_storage( }); } +fn get_persistent_volume_claim_mount( + settings: &settings::Settings, + yaml_mount: &pod::VolumeMount, + yaml_volume: &volume::Volume, + p_mounts: &mut Vec, + storages: &mut Vec, + persistent_volume_claims: &[pvc::PersistentVolumeClaim], + mount_options: (&str, &str), +) { + let volume_pvc = yaml_volume.persistentVolumeClaim.as_ref().unwrap(); + let pvc_name = &volume_pvc.claimName; + let pvc_resource = persistent_volume_claims + .iter() + .find(|pvc_resource| pvc_resource.metadata.name.as_ref() == Some(pvc_name)); + + if pvc_resource.is_none() { + warn!( + "Unable to determine backing storage of persistent volume claim '{pvc_name}'. \ + Pass `-c ` to get rid of this warning." + ); + } + + let storage_class = if let Some(pvc_resource) = pvc_resource { + pvc_resource.spec.storageClassName.as_ref() + } else { + None + }; + + if storage_class.is_none() { + warn!("Storage class is missing for persistent volume claim '{pvc_name}'."); + } + + let (is_blk_mount, is_smb_mount, smb_mount_options) = get_mount_info(storage_class, settings); + + handle_persistent_volume_claim( + is_blk_mount, + is_smb_mount, + yaml_mount, + p_mounts, + storages, + mount_options, + smb_mount_options, + ); +} + fn get_host_path_mount( yaml_mount: &pod::VolumeMount, yaml_volume: &volume::Volume, p_mounts: &mut Vec, + mount_options: (&str, &str), ) { let host_path = yaml_volume.hostPath.as_ref().unwrap().path.clone(); let path = Path::new(&host_path); - let mut biderectional = false; - if let Some(mount_propagation) = &yaml_mount.mountPropagation { - if mount_propagation.eq("Bidirectional") { - debug!("get_host_path_mount: Bidirectional"); - biderectional = true; - } - } - - let access = match yaml_mount.readOnly { - Some(true) => { - debug!("setting read only access for host path mount"); - "ro" - } - _ => "rw", - }; // TODO: // // - When volume.hostPath.path: /dev/ttyS0 @@ -234,15 +328,14 @@ fn get_host_path_mount( // What is the reason for this source path difference in the Guest OS? if !path.starts_with("/dev/") && !path.starts_with("/sys/") { debug!("get_host_path_mount: calling get_shared_bind_mount"); - let propagation = if biderectional { "rshared" } else { "rprivate" }; - get_shared_bind_mount(yaml_mount, p_mounts, propagation, access); + get_shared_bind_mount(yaml_mount, p_mounts, mount_options); } else { let dest = yaml_mount.mountPath.clone(); let type_ = "bind".to_string(); - let mount_option = if biderectional { "rshared" } else { "rprivate" }; + let (propagation, access) = mount_options; let options = vec![ "rbind".to_string(), - mount_option.to_string(), + propagation.to_string(), access.to_string(), ]; @@ -288,8 +381,7 @@ fn get_config_map_mount_and_storage( fstype: settings_config_map.fstype.clone(), options: settings_config_map.options.clone(), mount_point: format!("{}{mount_path_str}$", &settings_config_map.mount_point), - fs_group: protobuf::MessageField::none(), - special_fields: ::protobuf::SpecialFields::new(), + fs_group: None, }); } @@ -306,8 +398,7 @@ fn get_config_map_mount_and_storage( fn get_shared_bind_mount( yaml_mount: &pod::VolumeMount, p_mounts: &mut Vec, - propagation: &str, - access: &str, + mount_options: (&str, &str), ) { let mount_path = if let Some(byte_index) = str::rfind(&yaml_mount.mountPath, '/') { str::from_utf8(&yaml_mount.mountPath.as_bytes()[byte_index + 1..]).unwrap() @@ -318,6 +409,7 @@ fn get_shared_bind_mount( let dest = yaml_mount.mountPath.clone(); let type_ = "bind".to_string(); + let (propagation, access) = mount_options; let options = vec![ "rbind".to_string(), propagation.to_string(), @@ -411,8 +503,7 @@ pub fn get_image_mount_and_storage( fstype: settings_image.fstype.clone(), options: settings_image.options.clone(), mount_point: destination_string.clone(), - fs_group: protobuf::MessageField::none(), - special_fields: ::protobuf::SpecialFields::new(), + fs_group: None, }); let file_name = Path::new(&destination_string).file_name().unwrap(); @@ -426,3 +517,99 @@ pub fn get_image_mount_and_storage( options: settings_image.options.clone(), }); } + +fn get_ephemeral_mount( + settings: &settings::Settings, + yaml_mount: &pod::VolumeMount, + yaml_volume: &volume::Volume, + p_mounts: &mut Vec, + storages: &mut Vec, + mount_options: (&str, &str), +) { + let storage_class = yaml_volume + .ephemeral + .as_ref() + .unwrap() + .volumeClaimTemplate + .spec + .storageClassName + .as_ref(); + + let (is_blk_mount, is_smb_mount, smb_mount_options) = get_mount_info(storage_class, settings); + + handle_persistent_volume_claim( + is_blk_mount, + is_smb_mount, + yaml_mount, + p_mounts, + storages, + mount_options, + smb_mount_options, + ); +} + +pub fn handle_persistent_volume_claim( + is_blk_mount: bool, + is_smb_mount: bool, + yaml_mount: &pod::VolumeMount, + p_mounts: &mut Vec, + storages: &mut Vec, + mount_options: (&str, &str), + smb_mount_options: Option>, // Pass SMB mount options +) { + if is_blk_mount || is_smb_mount { + let source = "$(spath)/$(b64-direct-vol-path)".to_string(); + + storages.push(agent::Storage { + driver: if is_blk_mount { + "blk".to_string() + } else { + "smb".to_string() + }, + driver_options: Vec::new(), + fs_group: None, + source: "".to_string(), + mount_point: source.to_string(), + fstype: if is_blk_mount { + "ext4".to_string() + } else { + "cifs".to_string() + }, + options: if is_smb_mount { + if let Some(mount_options) = smb_mount_options { + mount_options.clone() + } else { + Vec::new() + } + } else { + Vec::new() + }, + }); + + let dest = yaml_mount.mountPath.clone(); + let type_ = "bind".to_string(); + let (propagation, access) = mount_options; + let options = vec![ + "rbind".to_string(), + propagation.to_string(), + access.to_string(), + ]; + + if let Some(policy_mount) = p_mounts.iter_mut().find(|m| m.destination == dest) { + debug!("handle_persistent_volume_claim: updating dest = {dest}, source = {source}"); + policy_mount.type_ = type_; + policy_mount.source = source; + policy_mount.options = options; + } else { + debug!("handle_persistent_volume_claim: adding dest = {dest}, source = {source}"); + p_mounts.push(policy::KataMount { + destination: dest, + type_, + source, + options, + }); + } + } else { + get_shared_bind_mount(yaml_mount, p_mounts, mount_options); + } +} diff --git a/src/tools/genpolicy/src/no_policy.rs b/src/tools/genpolicy/src/no_policy.rs index ce9f5ec55428..9cc06900eed0 100644 --- a/src/tools/genpolicy/src/no_policy.rs +++ b/src/tools/genpolicy/src/no_policy.rs @@ -6,7 +6,11 @@ // Allow K8s YAML field names. #![allow(non_snake_case)] +use crate::agent; +use crate::pod; use crate::policy; +use crate::pvc; +use crate::settings; use crate::utils::Config; use crate::yaml; @@ -27,6 +31,21 @@ impl yaml::K8sResource for NoPolicyResource { ) { } + fn get_sandbox_name(&self) -> Option { + panic!("Unsupported"); + } + + fn get_container_mounts_and_storages( + &self, + _policy_mounts: &mut Vec, + _storages: &mut Vec, + _persistent_volume_claims: &[pvc::PersistentVolumeClaim], + _container: &pod::Container, + _settings: &settings::Settings, + ) { + panic!("Unsupported"); + } + fn generate_policy(&self, _agent_policy: &policy::AgentPolicy) -> String { "".to_string() } diff --git a/src/tools/genpolicy/src/pod.rs b/src/tools/genpolicy/src/pod.rs index 18f5ee5ba6c5..709c2bc37d9b 100644 --- a/src/tools/genpolicy/src/pod.rs +++ b/src/tools/genpolicy/src/pod.rs @@ -6,9 +6,11 @@ // Allow K8s YAML field names. #![allow(non_snake_case)] +use crate::agent; use crate::config_map; use crate::obj_meta; use crate::policy; +use crate::pvc; use crate::registry; use crate::secret; use crate::settings; @@ -18,7 +20,6 @@ use crate::yaml; use async_trait::async_trait; use log::{debug, warn}; -use protocols::agent; use serde::{Deserialize, Serialize}; use std::collections::BTreeMap; @@ -593,6 +594,7 @@ impl Container { self.registry = registry::get_container(config, &self.image).await.unwrap(); } + #[allow(clippy::too_many_arguments)] pub fn get_env_variables( &self, dest_env: &mut Vec, @@ -601,6 +603,7 @@ impl Container { namespace: &str, annotations: &Option>, service_account_name: &str, + settings: &settings::Settings, ) { if let Some(source_env) = &self.env { for env_variable in source_env { @@ -610,6 +613,7 @@ impl Container { namespace, annotations, service_account_name, + settings, ); let src_string = format!("{}={value}", &env_variable.name); @@ -750,6 +754,7 @@ impl EnvVar { namespace: &str, annotations: &Option>, service_account_name: &str, + settings: &settings::Settings, ) -> String { if let Some(value) = &self.value { return value.clone(); @@ -768,14 +773,21 @@ impl EnvVar { let path: &str = &field_ref.fieldPath; match path { "metadata.name" => return "$(sandbox-name)".to_string(), - "metadata.namespace" => return namespace.to_string(), + "metadata.namespace" => { + return if namespace.is_empty() { + "$(sandbox-namespace)".to_string() + } else { + namespace.to_string() + }; + } "metadata.uid" => return "$(pod-uid)".to_string(), "status.hostIP" => return "$(host-ip)".to_string(), "status.podIP" => return "$(pod-ip)".to_string(), "spec.nodeName" => return "$(node-name)".to_string(), "spec.serviceAccountName" => return service_account_name.to_string(), _ => { - if let Some(value) = self.get_annotation_value(path, annotations) { + if let Some(value) = self.get_annotation_value(path, annotations, settings) + { return value; } else { panic!( @@ -788,9 +800,8 @@ impl EnvVar { } if value_from.resourceFieldRef.is_some() { - // TODO: should resource fields such as "limits.cpu" or "limits.memory" - // be handled in a different way? - return "$(resource-field)".to_string(); + settings.panic_on_undefined_variables(&self.name); + return "$(validate-from-settings)".to_string(); } } else { panic!("Environment variable without value or valueFrom!"); @@ -803,6 +814,7 @@ impl EnvVar { &self, reference: &str, anno: &Option>, + settings: &settings::Settings, ) -> Option { let prefix = "metadata.annotations['"; let suffix = "']"; @@ -822,8 +834,9 @@ impl EnvVar { } } - // TODO: should missing annotations be handled differently? - return Some("$(todo-annotation)".to_string()); + settings.panic_on_undefined_variables(&self.name); + + return Some("$(validate-from-settings)".to_string()); } None } @@ -852,12 +865,14 @@ impl yaml::K8sResource for Pod { &self, policy_mounts: &mut Vec, storages: &mut Vec, + persistent_volume_claims: &[pvc::PersistentVolumeClaim], container: &Container, settings: &settings::Settings, ) { yaml::get_container_mounts_and_storages( policy_mounts, storages, + persistent_volume_claims, container, settings, &self.spec.volumes, diff --git a/src/tools/genpolicy/src/policy.rs b/src/tools/genpolicy/src/policy.rs index b9e7e187c9d2..0b291ea2e913 100644 --- a/src/tools/genpolicy/src/policy.rs +++ b/src/tools/genpolicy/src/policy.rs @@ -6,22 +6,24 @@ // Allow OCI spec field names. #![allow(non_snake_case)] +use crate::agent; use crate::config_map; use crate::containerd; use crate::mount_and_storage; use crate::no_policy; use crate::pod; use crate::policy; +use crate::pvc; use crate::registry; use crate::secret; use crate::utils; use crate::yaml; +use anyhow::anyhow; use anyhow::Result; use base64::{engine::general_purpose, Engine as _}; use log::debug; -use oci_spec::runtime as oci; -use protocols::agent; +use protocols::oci; use serde::{Deserialize, Serialize}; use serde_yaml::Value; use sha2::{Digest, Sha256}; @@ -42,6 +44,9 @@ pub struct AgentPolicy { /// K8s Secret resources, containing additional pod settings. secrets: Vec, + /// K8s Persistent volume claim resources + persistent_volume_claims: Vec, + /// Rego rules read from a file (rules.rego). pub rules: String, @@ -115,6 +120,10 @@ pub struct KataProcess { #[serde(default)] pub User: KataUser, + /// DeprecatedArgs specifies the binary and arguments for the application to execute. + #[serde(default, skip_serializing_if = "Vec::is_empty")] + pub DeprecatedArgs: Vec, + /// Args specifies the binary and arguments for the application to execute. #[serde(default, skip_serializing_if = "Vec::is_empty")] pub Args: Vec, @@ -282,6 +291,9 @@ pub struct ContainerPolicy { /// ExecProcessRequest. By default, all ExecProcessRequest calls are blocked /// by the policy. exec_commands: Vec>, + + // a map of environment variable names to value + env_map: std::collections::BTreeMap, } /// See Reference / Kubernetes API / Config and Storage Resources / Volume. @@ -318,6 +330,7 @@ pub struct PersistentVolumeClaimVolume { pub struct CreateContainerRequestDefaults { /// Allow env variables that match any of these regexes. allow_env_regex: Vec, + pub allow_env_regex_map: BTreeMap, } /// ExecProcessRequest settings from genpolicy-settings.json. @@ -389,6 +402,13 @@ pub struct RequestDefaults { pub WriteStreamRequest: bool, } +// SMB storage class settings from genpolicy-settings.json. +#[derive(Clone, Debug, Serialize, Deserialize)] +pub struct SmbStorageClass { + pub name: String, + pub mount_options: Vec, +} + /// Struct used to read data from the settings file and copy that data into the policy. #[derive(Clone, Debug, Serialize, Deserialize)] pub struct CommonData { @@ -401,6 +421,9 @@ pub struct CommonData { /// Regex prefix for shared file paths - e.g., "^$(cpath)/$(bundle-id)-[a-z0-9]{16}-". pub sfprefix: String, + /// Path to the shared sandbox storage - e.g., "/run/kata-containers/sandbox/storage". + pub spath: String, + /// Regex for an IPv4 address. pub ipv4_a: String, @@ -413,11 +436,29 @@ pub struct CommonData { // Regex for a DNS label (e.g., host name). pub dns_label: String, + // Regex for symlink source files similar to "..2024_12_18_17_38_13.2593682734". + pub s_source1: String, + + // Regex for symlink source files similar to "..data/namespace". + pub s_source2: String, + + // Regex for DNS subdomain (e.g., node-name). + pub dns_subdomain: String, + + // Regex for matching a pod uid (UUID). + pub pod_uid: String, + /// Default capabilities for a non-privileged container. pub default_caps: Vec, /// Default capabilities for a privileged container. pub privileged_caps: Vec, + + /// Storage classes which mounts should be handled as virtio-blk devices. + pub virtio_blk_storage_classes: Vec, + + /// Storage classes which mounts should be handled as smb mounts + pub smb_storage_classes: Vec, } /// Configuration from "kubectl config". @@ -434,9 +475,16 @@ pub struct SandboxData { pub storages: Vec, } +enum K8sResourceEnum { + ConfigMap(config_map::ConfigMap), + PersistentVolumeClaim(pvc::PersistentVolumeClaim), + Secret(secret::Secret), +} + impl AgentPolicy { pub async fn from_files(config: &utils::Config) -> Result { let mut config_maps = Vec::new(); + let mut pvcs = Vec::new(); let mut secrets = Vec::new(); let mut resources = Vec::new(); let yaml_contents = yaml::get_input_yaml(&config.yaml_file)?; @@ -474,6 +522,10 @@ impl AgentPolicy { let secret: secret::Secret = serde_yaml::from_str(&yaml_string)?; debug!("{:#?}", &secret); secrets.push(secret); + } else if kind.eq("PersistentVolumeClaim") { + let pvc: pvc::PersistentVolumeClaim = serde_yaml::from_str(&yaml_string)?; + debug!("{:#?}", &pvc); + pvcs.push(pvc); } // Although copies of ConfigMap and Secret resources get created above, @@ -484,9 +536,13 @@ impl AgentPolicy { } } - if let Some(config_map_files) = &config.config_map_files { - for file in config_map_files { - config_maps.push(config_map::ConfigMap::new(file)?); + if let Some(config_files) = &config.config_files { + for resource_file in config_files { + match parse_config_file(resource_file.clone()).await? { + K8sResourceEnum::ConfigMap(config_map) => config_maps.push(config_map), + K8sResourceEnum::PersistentVolumeClaim(pvc) => pvcs.push(pvc), + K8sResourceEnum::Secret(secret) => secrets.push(secret), + } } } @@ -496,6 +552,7 @@ impl AgentPolicy { rules, config_maps, secrets, + persistent_volume_claims: pvcs, config: config.clone(), }) } else { @@ -601,6 +658,7 @@ impl AgentPolicy { resource.get_container_mounts_and_storages( &mut mounts, &mut storages, + &self.persistent_volume_claims, yaml_container, &self.config.settings, ); @@ -627,8 +685,10 @@ impl AgentPolicy { let mut devices: Vec = vec![]; if let Some(volumeDevices) = &yaml_container.volumeDevices { for volumeDevice in volumeDevices { - let mut device = agent::Device::new(); - device.set_container_path(volumeDevice.devicePath.clone()); + let device = agent::Device { + container_path: volumeDevice.devicePath.clone(), + ..Default::default() + }; devices.push(device); linux.Devices.push(KataLinuxDevice { @@ -640,6 +700,7 @@ impl AgentPolicy { for default_device in &c_settings.Linux.Devices { linux.Devices.push(default_device.clone()) } + let env_map = get_env_map(&process.Env); linux.Sysctl.extend(c_settings.Linux.Sysctl.clone()); for sysctl in resource.get_sysctls() { @@ -660,6 +721,7 @@ impl AgentPolicy { devices, sandbox_pidns, exec_commands, + env_map, } } @@ -678,7 +740,8 @@ impl AgentPolicy { yaml_container.apply_capabilities(&mut process.Capabilities, &self.config.settings.common); - let (yaml_has_command, yaml_has_args) = yaml_container.get_process_args(&mut process.Args); + let (yaml_has_command, yaml_has_args) = + yaml_container.get_process_args(&mut process.DeprecatedArgs); yaml_container .registry .get_process(&mut process, yaml_has_command, yaml_has_args); @@ -707,10 +770,12 @@ impl AgentPolicy { namespace, resource.get_annotations(), service_account_name, + &self.config.settings, ); substitute_env_variables(&mut process.Env); - substitute_args_env_variables(&mut process.Args, &process.Env); + process.Args = process.DeprecatedArgs.clone(); + substitute_args_env_variables(&mut process.DeprecatedArgs, &process.Env); c_settings.get_process_fields(&mut process); resource.get_process_fields(&mut process); @@ -737,7 +802,7 @@ impl KataSpec { process.User.AdditionalGids = self.Process.User.AdditionalGids.to_vec(); process.User.Username = String::from(&self.Process.User.Username); - add_missing_strings(&self.Process.Args, &mut process.Args); + add_missing_strings(&self.Process.DeprecatedArgs, &mut process.DeprecatedArgs); add_missing_strings(&self.Process.Env, &mut process.Env); } @@ -781,8 +846,7 @@ fn get_image_layer_storages( fstype: "tar".to_string(), options: vec![format!("$(hash{layer_index})")], mount_point: format!("$(layer{layer_index})"), - fs_group: protobuf::MessageField::none(), - special_fields: ::protobuf::SpecialFields::new(), + fs_group: None, }); } @@ -801,13 +865,35 @@ fn get_image_layer_storages( fstype: "fuse3.kata-overlay".to_string(), options: vec![layer_names.join(":"), layer_hashes.join(":")], mount_point: root.Path.clone(), - fs_group: protobuf::MessageField::none(), - special_fields: ::protobuf::SpecialFields::new(), + fs_group: None, }; storages.push(overlay_storage); } +async fn parse_config_file(yaml_file: String) -> Result { + let yaml_contents = yaml::get_input_yaml(&Some(yaml_file))?; + let document = serde_yaml::Deserializer::from_str(&yaml_contents); + let doc_mapping = Value::deserialize(document)?; + let kind = doc_mapping + .get("kind") + .and_then(|v| v.as_str()) + .ok_or(anyhow!("no kind"))?; + + match kind { + "ConfigMap" => Ok(K8sResourceEnum::ConfigMap(serde_yaml::from_value( + doc_mapping, + )?)), + "PersistentVolumeClaim" => Ok(K8sResourceEnum::PersistentVolumeClaim( + serde_yaml::from_value(doc_mapping)?, + )), + "Secret" => Ok(K8sResourceEnum::Secret(serde_yaml::from_value( + doc_mapping, + )?)), + k => Err(anyhow!("unsupported attached resource kind '{k}'")), + } +} + /// Converts the given name to a string representation of its sha256 hash. fn name_to_hash(name: &str) -> String { let mut hasher = Sha256::new(); @@ -1025,3 +1111,48 @@ pub fn get_kata_namespaces( namespaces } + +// todo: move to common crate shared with the agent +fn get_env_map(env: &[String]) -> std::collections::BTreeMap { + let env_map: std::collections::BTreeMap = env + .iter() + .filter_map(|v| { + // split by leftmost '=' + let split = v.split_once('='); + if let Some((key, value)) = split { + Some((key.to_string(), value.to_string())) + } else { + None + } + }) + .collect(); + env_map +} + +#[cfg(test)] +mod policy_tests { + use super::*; + use std::collections::BTreeMap; + #[test] + fn test_get_env_map() { + let env_vars = vec![ + "FOO=bar".to_string(), // valid entry + "BAZ=qux".to_string(), // valid entry + "INVALID".to_string(), // missing '=' so should be ignored + "EMPTY=".to_string(), // key with empty value + "=EMPTY_KEY".to_string(), // empty key with a value + "MY_BEST_GUESS=guess=foo".to_string(), // multiple '=' + ]; + + let result = get_env_map(&env_vars); + + let mut expected = BTreeMap::new(); + expected.insert("FOO".to_string(), "bar".to_string()); + expected.insert("BAZ".to_string(), "qux".to_string()); + expected.insert("EMPTY".to_string(), "".to_string()); + expected.insert("".to_string(), "EMPTY_KEY".to_string()); + expected.insert("MY_BEST_GUESS".to_string(), "guess=foo".to_string()); + + assert_eq!(result, expected); + } +} diff --git a/src/tools/genpolicy/src/persistent_volume_claim.rs b/src/tools/genpolicy/src/pvc.rs similarity index 91% rename from src/tools/genpolicy/src/persistent_volume_claim.rs rename to src/tools/genpolicy/src/pvc.rs index 3db25a490cec..61d0ce3f0868 100644 --- a/src/tools/genpolicy/src/persistent_volume_claim.rs +++ b/src/tools/genpolicy/src/pvc.rs @@ -21,19 +21,19 @@ pub struct PersistentVolumeClaim { kind: Option, pub metadata: obj_meta::ObjectMeta, - spec: PersistentVolumeClaimSpec, + pub spec: PersistentVolumeClaimSpec, } /// See Reference / Kubernetes API / Config and Storage Resources / PersistentVolumeClaim. #[derive(Clone, Debug, Default, Serialize, Deserialize)] -struct PersistentVolumeClaimSpec { +pub struct PersistentVolumeClaimSpec { resources: ResourceRequirements, #[serde(skip_serializing_if = "Option::is_none")] accessModes: Option>, #[serde(skip_serializing_if = "Option::is_none")] - storageClassName: Option, + pub storageClassName: Option, #[serde(skip_serializing_if = "Option::is_none")] volumeMode: Option, diff --git a/src/tools/genpolicy/src/registry.rs b/src/tools/genpolicy/src/registry.rs index e36350bb5982..0d14a62444d0 100644 --- a/src/tools/genpolicy/src/registry.rs +++ b/src/tools/genpolicy/src/registry.rs @@ -277,7 +277,7 @@ impl Container { containerd::get_default_unix_env(&mut process.Env); } - let policy_args = &mut process.Args; + let policy_args = &mut process.DeprecatedArgs; debug!("Already existing policy args: {:?}", policy_args); if let Some(entry_points) = &docker_config.Entrypoint { @@ -491,6 +491,7 @@ pub fn add_verity_and_users_to_store( let mut writer = BufWriter::new(&file); writeln!(writer, "{}", serialized)?; writer.flush()?; + #[allow(unstable_name_collisions)] file.unlock()?; Ok(()) } @@ -590,6 +591,7 @@ pub fn get_verity_hash_and_users(path: &Path) -> Result<(String, String)> { Ok((result, passwd)) } +#[cfg(target_os = "linux")] pub async fn get_container(config: &Config, image: &str) -> Result { if let Some(socket_path) = &config.containerd_socket_path { return Container::new_containerd_pull( @@ -602,6 +604,11 @@ pub async fn get_container(config: &Config, image: &str) -> Result { Container::new(config, image).await } +#[cfg(target_os = "windows")] +pub async fn get_container(config: &Config, image: &str) -> Result { + Container::new(config.use_cache, image).await +} + fn build_auth(reference: &Reference) -> RegistryAuth { debug!("build_auth: {:?}", reference); diff --git a/src/tools/genpolicy/src/replica_set.rs b/src/tools/genpolicy/src/replica_set.rs index 97d189f469ac..bc9374fc8849 100644 --- a/src/tools/genpolicy/src/replica_set.rs +++ b/src/tools/genpolicy/src/replica_set.rs @@ -6,16 +6,17 @@ // Allow K8s YAML field names. #![allow(non_snake_case)] +use crate::agent; use crate::obj_meta; use crate::pod; use crate::pod_template; use crate::policy; +use crate::pvc; use crate::settings; use crate::utils::Config; use crate::yaml; use async_trait::async_trait; -use protocols::agent; use serde::{Deserialize, Serialize}; use std::collections::BTreeMap; @@ -63,12 +64,14 @@ impl yaml::K8sResource for ReplicaSet { &self, policy_mounts: &mut Vec, storages: &mut Vec, + persistent_volume_claims: &[pvc::PersistentVolumeClaim], container: &pod::Container, settings: &settings::Settings, ) { yaml::get_container_mounts_and_storages( policy_mounts, storages, + persistent_volume_claims, container, settings, &self.spec.template.spec.volumes, diff --git a/src/tools/genpolicy/src/replication_controller.rs b/src/tools/genpolicy/src/replication_controller.rs index f5920b8639d6..122a66ad687a 100644 --- a/src/tools/genpolicy/src/replication_controller.rs +++ b/src/tools/genpolicy/src/replication_controller.rs @@ -6,16 +6,17 @@ // Allow K8s YAML field names. #![allow(non_snake_case)] +use crate::agent; use crate::obj_meta; use crate::pod; use crate::pod_template; use crate::policy; +use crate::pvc; use crate::settings; use crate::utils::Config; use crate::yaml; use async_trait::async_trait; -use protocols::agent; use serde::{Deserialize, Serialize}; use std::collections::BTreeMap; @@ -65,12 +66,14 @@ impl yaml::K8sResource for ReplicationController { &self, policy_mounts: &mut Vec, storages: &mut Vec, + persistent_volume_claims: &[pvc::PersistentVolumeClaim], container: &pod::Container, settings: &settings::Settings, ) { yaml::get_container_mounts_and_storages( policy_mounts, storages, + persistent_volume_claims, container, settings, &self.spec.template.spec.volumes, diff --git a/src/tools/genpolicy/src/secret.rs b/src/tools/genpolicy/src/secret.rs index 17afdc253cb6..761588c69cd2 100644 --- a/src/tools/genpolicy/src/secret.rs +++ b/src/tools/genpolicy/src/secret.rs @@ -6,9 +6,12 @@ // Allow K8s YAML field names. #![allow(non_snake_case)] +use crate::agent; use crate::obj_meta; use crate::pod; use crate::policy; +use crate::pvc; +use crate::settings; use crate::utils::Config; use crate::yaml; @@ -103,6 +106,21 @@ impl yaml::K8sResource for Secret { self.doc_mapping = doc_mapping.clone(); } + fn get_sandbox_name(&self) -> Option { + panic!("Unsupported"); + } + + fn get_container_mounts_and_storages( + &self, + _policy_mounts: &mut Vec, + _storages: &mut Vec, + _persistent_volume_claims: &[pvc::PersistentVolumeClaim], + _container: &pod::Container, + _settings: &settings::Settings, + ) { + panic!("Unsupported"); + } + fn generate_policy(&self, _agent_policy: &policy::AgentPolicy) -> String { "".to_string() } diff --git a/src/tools/genpolicy/src/settings.rs b/src/tools/genpolicy/src/settings.rs index b7f0515d17c1..1d3a3ccff93e 100644 --- a/src/tools/genpolicy/src/settings.rs +++ b/src/tools/genpolicy/src/settings.rs @@ -110,4 +110,17 @@ impl Settings { } } } + + pub fn panic_on_undefined_variables(&self, var_name: &str) { + if !self + .request_defaults + .CreateContainerRequest + .allow_env_regex_map + .contains_key(var_name) + { + panic!( + "Env var: please add a regex validation entry for {} in the settings request_defaults.CreateContainerRequest.allow_env_regex_map", + var_name); + } + } } diff --git a/src/tools/genpolicy/src/stateful_set.rs b/src/tools/genpolicy/src/stateful_set.rs index afa859ef0418..47c9f40acafb 100644 --- a/src/tools/genpolicy/src/stateful_set.rs +++ b/src/tools/genpolicy/src/stateful_set.rs @@ -6,20 +6,21 @@ // Allow K8s YAML field names. #![allow(non_snake_case)] +use crate::agent; +use crate::mount_and_storage; use crate::obj_meta; -use crate::persistent_volume_claim; use crate::pod; use crate::pod_template; use crate::policy; +use crate::pvc; use crate::settings; use crate::utils::Config; use crate::yaml; use async_trait::async_trait; -use protocols::agent; +use log::debug; use serde::{Deserialize, Serialize}; use std::collections::BTreeMap; -use std::path::Path; /// See Reference / Kubernetes API / Workload Resources / StatefulSet. #[derive(Clone, Debug, Serialize, Deserialize)] @@ -46,7 +47,7 @@ struct StatefulSetSpec { template: pod_template::PodTemplateSpec, #[serde(skip_serializing_if = "Option::is_none")] - volumeClaimTemplates: Option>, + volumeClaimTemplates: Option>, #[serde(skip_serializing_if = "Option::is_none")] updateStrategy: Option, @@ -113,9 +114,19 @@ impl yaml::K8sResource for StatefulSet { &self, policy_mounts: &mut Vec, storages: &mut Vec, + persistent_volume_claims: &[pvc::PersistentVolumeClaim], container: &pod::Container, settings: &settings::Settings, ) { + yaml::get_container_mounts_and_storages( + policy_mounts, + storages, + persistent_volume_claims, + container, + settings, + &self.spec.template.spec.volumes, + ); + // Example: // // containers: @@ -137,17 +148,15 @@ impl yaml::K8sResource for StatefulSet { // storage: 1Gi if let Some(volume_mounts) = &container.volumeMounts { if let Some(claims) = &self.spec.volumeClaimTemplates { - StatefulSet::get_mounts_and_storages(policy_mounts, volume_mounts, claims); + StatefulSet::get_mounts_and_storages( + policy_mounts, + storages, + settings, + volume_mounts, + claims, + ); } } - - yaml::get_container_mounts_and_storages( - policy_mounts, - storages, - container, - settings, - &self.spec.template.spec.volumes, - ); } fn generate_policy(&self, agent_policy: &policy::AgentPolicy) -> String { @@ -205,35 +214,41 @@ impl yaml::K8sResource for StatefulSet { impl StatefulSet { fn get_mounts_and_storages( policy_mounts: &mut Vec, + storages: &mut Vec, + settings: &settings::Settings, volume_mounts: &Vec, - claims: &Vec, + claims: &[pvc::PersistentVolumeClaim], ) { + debug!("StatefulSet::get_mounts_and_storages"); for mount in volume_mounts { for claim in claims { if let Some(claim_name) = &claim.metadata.name { if claim_name.eq(&mount.name) { - let file_name = Path::new(&mount.mountPath) - .file_name() - .unwrap() - .to_str() - .unwrap(); - // TODO: - // - Get the source path below from the settings file. - // - Generate proper options value. - policy_mounts.push(policy::KataMount { - destination: mount.mountPath.clone(), - type_: "bind".to_string(), - source: - "^/run/kata-containers/shared/containers/$(bundle-id)-[a-z0-9]{16}-" - .to_string() - + file_name - + "$", - options: vec![ - "rbind".to_string(), - "rprivate".to_string(), - "rw".to_string(), - ], - }); + let storage_class = claim.spec.storageClassName.as_ref(); + let (is_blk_mount, is_smb_mount, smb_mount_options) = + mount_and_storage::get_mount_info(storage_class, settings); + + let propagation = match &mount.mountPropagation { + Some(p) if p == "Bidirectional" => "rshared", + _ => "rprivate", + }; + + let access = if let Some(true) = mount.readOnly { + "ro" + } else { + "rw" + }; + + let mount_options = (propagation, access); + mount_and_storage::handle_persistent_volume_claim( + is_blk_mount, + is_smb_mount, + mount, + policy_mounts, + storages, + mount_options, + smb_mount_options, + ); } } } diff --git a/src/tools/genpolicy/src/utils.rs b/src/tools/genpolicy/src/utils.rs index 6696338cdb52..cacda8835077 100644 --- a/src/tools/genpolicy/src/utils.rs +++ b/src/tools/genpolicy/src/utils.rs @@ -15,12 +15,8 @@ struct CommandLineOptions { )] yaml_file: Option, - #[clap( - short, - long, - help = "Optional Kubernetes config map YAML input file path" - )] - config_map_file: Option, + #[clap(short, long, help = "Optional Kubernetes YAML input file path")] + config_file: Option>, #[clap( short = 'p', @@ -111,7 +107,7 @@ pub struct Config { pub yaml_file: Option, pub rego_rules_path: String, pub settings: settings::Settings, - pub config_map_files: Option>, + pub config_files: Option>, pub silent_unsupported_fields: bool, pub raw_out: bool, @@ -124,18 +120,6 @@ pub struct Config { impl Config { pub fn new() -> Self { let args = CommandLineOptions::parse(); - - let mut config_map_files = Vec::new(); - if let Some(config_map_file) = &args.config_map_file { - config_map_files.push(config_map_file.clone()); - } - - let cm_files = if !config_map_files.is_empty() { - Some(config_map_files.clone()) - } else { - None - }; - let mut layers_cache_file_path = args.layers_cache_file_path; // preserve backwards compatibility for only using the `use_cached_files` flag if args.use_cached_files && layers_cache_file_path.is_none() { @@ -151,7 +135,7 @@ impl Config { yaml_file: args.yaml_file, rego_rules_path: args.rego_rules_path, settings, - config_map_files: cm_files, + config_files: args.config_file, silent_unsupported_fields: args.silent_unsupported_fields, raw_out: args.raw_out, base64_out: args.base64_out, diff --git a/src/tools/genpolicy/src/volume.rs b/src/tools/genpolicy/src/volume.rs index 0bb908a81c2f..90e10c337823 100644 --- a/src/tools/genpolicy/src/volume.rs +++ b/src/tools/genpolicy/src/volume.rs @@ -6,7 +6,7 @@ // Allow K8s YAML field names. #![allow(non_snake_case)] -use crate::pod; +use crate::{obj_meta, pod, pvc}; use serde::{Deserialize, Serialize}; @@ -37,7 +37,11 @@ pub struct Volume { pub secret: Option, #[serde(skip_serializing_if = "Option::is_none")] - pub downwardAPI: Option, // TODO: additional fields. + pub downwardAPI: Option, + + #[serde(skip_serializing_if = "Option::is_none")] + pub ephemeral: Option, + // TODO: additional fields. } /// See Reference / Kubernetes API / Config and Storage Resources / Volume. @@ -129,3 +133,18 @@ pub struct DownwardAPIVolumeFile { #[serde(skip_serializing_if = "Option::is_none")] pub fieldRef: Option, } + +/// See Reference / Kubernetes API / Config and Storage Resources / Volume. +#[derive(Clone, Debug, Serialize, Deserialize)] +pub struct EphemeralVolumeSource { + pub volumeClaimTemplate: PersistentVolumeClaimTemplate, +} + +/// See Reference / Kubernetes API / Config and Storage Resources / Volume. +#[derive(Clone, Debug, Serialize, Deserialize)] +pub struct PersistentVolumeClaimTemplate { + #[serde(skip_serializing_if = "Option::is_none")] + pub metadata: Option, + + pub spec: pvc::PersistentVolumeClaimSpec, +} diff --git a/src/tools/genpolicy/src/yaml.rs b/src/tools/genpolicy/src/yaml.rs index b5d77d81ef80..cf0b216d8610 100644 --- a/src/tools/genpolicy/src/yaml.rs +++ b/src/tools/genpolicy/src/yaml.rs @@ -6,6 +6,7 @@ // Allow K8s YAML field names. #![allow(non_snake_case)] +use crate::agent; use crate::config_map; use crate::cronjob; use crate::daemon_set; @@ -16,6 +17,7 @@ use crate::mount_and_storage; use crate::no_policy; use crate::pod; use crate::policy; +use crate::pvc; use crate::replica_set; use crate::replication_controller; use crate::secret; @@ -27,7 +29,6 @@ use crate::volume; use async_trait::async_trait; use core::fmt::Debug; use log::debug; -use protocols::agent; use serde::{Deserialize, Serialize}; use std::boxed; use std::collections::BTreeMap; @@ -57,11 +58,8 @@ pub trait K8sResource { fn serialize(&mut self, _policy: &str) -> String { panic!("Unsupported"); } - - fn get_sandbox_name(&self) -> Option { - panic!("Unsupported"); - } - + + fn get_sandbox_name(&self) -> Option; fn get_namespace(&self) -> Option { panic!("Unsupported"); } @@ -70,6 +68,7 @@ pub trait K8sResource { &self, _policy_mounts: &mut Vec, _storages: &mut Vec, + _persistent_volume_claims: &[pvc::PersistentVolumeClaim], _container: &pod::Container, _settings: &settings::Settings, ) { @@ -281,6 +280,7 @@ pub async fn k8s_resource_init(spec: &mut pod::PodSpec, config: &Config) { pub fn get_container_mounts_and_storages( policy_mounts: &mut Vec, storages: &mut Vec, + persistent_volume_claims: &[pvc::PersistentVolumeClaim], container: &pod::Container, settings: &settings::Settings, volumes_option: &Option>, @@ -294,6 +294,7 @@ pub fn get_container_mounts_and_storages( settings, policy_mounts, storages, + persistent_volume_claims, volume, volume_mount, ); diff --git a/src/tools/genpolicy/tests/adapt_settings_for_tests.sh b/src/tools/genpolicy/tests/adapt_settings_for_tests.sh new file mode 100755 index 000000000000..6963e6c78d76 --- /dev/null +++ b/src/tools/genpolicy/tests/adapt_settings_for_tests.sh @@ -0,0 +1,15 @@ +#!/bin/sh +# +# Copyright (c) 2025 Microsoft Corporation +# +# SPDX-License-Identifier: Apache-2.0 + +# usage: ./tests/adapt_settings_for_tests.sh + +set -x + +jq '.request_defaults.CreateContainerRequest.allow_env_regex_map = { + "JOB_COMPLETION_INDEX": "^[0-9]*$", + "CPU_LIMIT": "^[0-9]+$", + "MEMORY_LIMIT": "^[0-9]+$" +}' genpolicy-settings.json > /tmp/genpolicy-settings.json diff --git a/src/tools/genpolicy/tests/main.rs b/src/tools/genpolicy/tests/main.rs index 26d7e676c30d..c30dc9078794 100644 --- a/src/tools/genpolicy/tests/main.rs +++ b/src/tools/genpolicy/tests/main.rs @@ -12,13 +12,14 @@ mod tests { use std::str; use protocols::agent::{ - CopyFileRequest, CreateContainerRequest, CreateSandboxRequest, UpdateInterfaceRequest, - UpdateRoutesRequest, + CreateContainerRequest, CreateSandboxRequest, UpdateInterfaceRequest, UpdateRoutesRequest, }; use serde::de::DeserializeOwned; use serde::{Deserialize, Serialize}; - use kata_agent_policy::policy::AgentPolicy; + use kata_agent_policy::policy::{ + AgentPolicy, PolicyCopyFileRequest, PolicyCreateContainerRequest, + }; #[derive(Clone, Debug, Deserialize, Serialize)] struct TestCase { @@ -60,16 +61,18 @@ mod tests { let config = genpolicy::utils::Config { base64_out: false, - config_map_files: None, + config_files: None, containerd_socket_path: None, // Some(String::from("/var/run/containerd/containerd.sock")), - insecure_registries: Vec::new(), - layers_cache_file_path: None, + // insecure_registries: Vec::new(), + // layers_cache_file_path: None, raw_out: false, rego_rules_path: workdir.join("rules.rego").to_str().unwrap().to_string(), - runtime_class_names: Vec::new(), - settings: genpolicy::settings::Settings::new( - workdir.join("genpolicy-settings.json").to_str().unwrap(), - ), + // runtime_class_names: Vec::new(), + json_settings_path: workdir + .join("genpolicy-settings.json") + .to_str() + .unwrap() + .to_string(), silent_unsupported_fields: false, use_cache: false, version: false, @@ -92,7 +95,7 @@ mod tests { let mut pol = AgentPolicy::new(); pol.initialize( slog::Level::Debug.as_usize(), - workdir.join("policy.rego").to_str().unwrap().to_string(), + workdir.join("policy.rego").to_str().unwrap(), workdir.join("policy.log").to_str().map(|s| s.to_string()), ) .await @@ -110,11 +113,10 @@ mod tests { let v = serde_json::to_value(&test_case.request).unwrap(); + let request_type = map_request(any::type_name::().split("::").last().unwrap()); + let results = pol - .allow_request( - any::type_name::().split("::").last().unwrap(), - &serde_json::to_string(&v).unwrap(), - ) + .allow_request(request_type, &serde_json::to_string(&v).unwrap()) .await; let logs = fs::read_to_string(workdir.join("policy.log")).unwrap(); @@ -128,9 +130,17 @@ mod tests { } } + fn map_request(request: &str) -> &str { + match request { + "PolicyCopyFileRequest" => "CopyFileRequest", + "PolicyCreateContainerRequest" => "CreateContainerRequest", + _ => request, + } + } + #[tokio::test] async fn test_copyfile() { - runtests::("copyfile").await; + runtests::("copyfile").await; } #[tokio::test] @@ -147,19 +157,18 @@ mod tests { async fn test_update_interface() { runtests::("updateinterface").await; } - #[tokio::test] - async fn test_create_container_network_namespace() { - runtests::("createcontainer/network_namespace").await; + async fn test_legacy_basic_create_container() { + runtests::("createContainer/legacy").await; } #[tokio::test] - async fn test_create_container_sysctls() { - runtests::("createcontainer/sysctls").await; + async fn test_basic_create_container() { + runtests::("createContainer/basic").await; } #[tokio::test] async fn test_create_container_generate_name() { - runtests::("createcontainer/generate_name").await; + runtests::("createcontainer/generate_name").await; } } diff --git a/src/tools/genpolicy/tests/testdata/copyfile/testcases.json b/src/tools/genpolicy/tests/testdata/copyfile/testcases.json index d6b56f7a19ec..9d7a37778b40 100644 --- a/src/tools/genpolicy/tests/testdata/copyfile/testcases.json +++ b/src/tools/genpolicy/tests/testdata/copyfile/testcases.json @@ -6,60 +6,11 @@ "path": "/run/kata-containers/shared/containers/81e5f43bc8599c5661e66f959ac28df5bfb30da23c5d583f2dcc6f9e0c5186dc-ce23cfeb91e75aaa-resolv.conf" } }, - { - "description": "a dirname can have trailing dots", - "allowed": true, - "request": { - "path": "/run/kata-containers/shared/containers/81e5f43bc8599c5661e66f959ac28df5bfb30da23c5d583f2dcc6f9e0c5186dc-ce23cfeb91e75aaa-foo../bar" - } - }, { "description": "attempt to copy outside of container root", "allowed": false, "request": { "path": "/etc/ssl/cert.pem" } - }, - { - "description": "attempt to write into container root", - "allowed": false, - "request": { - "path": "/run/kata-containers/shared/containers/81e5f43bc8599c5661e66f959ac28df5bfb30da23c5d583f2dcc6f9e0c5186dc/rootfs/bin/sh" - } - }, - { - "description": "attempt to write into container root - guest pull", - "allowed": false, - "request": { - "path": "/run/kata-containers/81e5f43bc8599c5661e66f959ac28df5bfb30da23c5d583f2dcc6f9e0c5186dc/rootfs/bin/sh" - } - }, - { - "description": "attempted directory traversal", - "allowed": false, - "request": { - "path": "/run/kata-containers/shared/containers/81e5f43bc8599c5661e66f959ac28df5bfb30da23c5d583f2dcc6f9e0c5186dc-ce23cfeb91e75aaa-foo/../../../../../etc/ssl/cert.pem" - } - }, - { - "description": "attempted directory traversal - parent directory", - "allowed": false, - "request": { - "path": "/run/kata-containers/shared/containers/81e5f43bc8599c5661e66f959ac28df5bfb30da23c5d583f2dcc6f9e0c5186dc-ce23cfeb91e75aaa-foo/.." - } - }, - { - "description": "relative path", - "allowed": false, - "request": { - "path": "etc/ssl/cert.pem" - } - }, - { - "description": "relative path - parent directory", - "allowed": false, - "request": { - "path": ".." - } } -] +] \ No newline at end of file diff --git a/src/tools/genpolicy/tests/testdata/createContainer/basic/pod.yaml b/src/tools/genpolicy/tests/testdata/createContainer/basic/pod.yaml new file mode 100644 index 000000000000..f016dbb2f5cf --- /dev/null +++ b/src/tools/genpolicy/tests/testdata/createContainer/basic/pod.yaml @@ -0,0 +1,15 @@ +apiVersion: v1 +kind: Pod +metadata: + name: busybox +spec: + runtimeClassName: kata-cc + containers: + - name: first-test-container + image: "quay.io/prometheus/busybox:latest" + env: + - name: CONTAINER_NAME + value: first-test-container + command: + - sleep + - "3600" diff --git a/src/tools/genpolicy/tests/testdata/createContainer/basic/testcases.json b/src/tools/genpolicy/tests/testdata/createContainer/basic/testcases.json new file mode 100644 index 000000000000..046428d8f6ea --- /dev/null +++ b/src/tools/genpolicy/tests/testdata/createContainer/basic/testcases.json @@ -0,0 +1,289 @@ +[ + { + "description": "basic request for pause container", + "allowed": true, + "request": { + "base": { + "OCI": { + "Annotations": { + "io.katacontainers.pkg.oci.bundle_path": "/run/containerd/io.containerd.runtime.v2.task/k8s.io/4878266238663ca723dc5ecbd8b2d06a56c2d5e562eeb77b492046a267c50951", + "io.katacontainers.pkg.oci.container_type": "pod_sandbox", + "io.kubernetes.cri.container-type": "sandbox", + "io.kubernetes.cri.sandbox-cpu-period": "100000", + "io.kubernetes.cri.sandbox-cpu-quota": "0", + "io.kubernetes.cri.sandbox-cpu-shares": "2", + "io.kubernetes.cri.sandbox-id": "4878266238663ca723dc5ecbd8b2d06a56c2d5e562eeb77b492046a267c50951", + "io.kubernetes.cri.sandbox-log-directory": "/var/log/pods/default_busybox_eb1495ed-331a-44ff-ad6d-fce1a69280cd", + "io.kubernetes.cri.sandbox-memory": "0", + "io.kubernetes.cri.sandbox-name": "busybox", + "io.kubernetes.cri.sandbox-namespace": "default", + "io.kubernetes.cri.sandbox-uid": "eb1495ed-331a-44ff-ad6d-fce1a69280cd", + "nerdctl/network-namespace": "/var/run/netns/cni-27ff7b1c-fc08-da24-6925-706999f65227" + }, + "Hooks": null, + "Hostname": "busybox", + "Linux": { + "CgroupsPath": "/kubepods/besteffort/podeb1495ed-331a-44ff-ad6d-fce1a69280cd/4878266238663ca723dc5ecbd8b2d06a56c2d5e562eeb77b492046a267c50951", + "Devices": [], + "GIDMappings": [], + "IntelRdt": null, + "MaskedPaths": [ + "/proc/acpi", + "/proc/asound", + "/proc/kcore", + "/proc/keys", + "/proc/latency_stats", + "/proc/timer_list", + "/proc/timer_stats", + "/proc/sched_debug", + "/sys/firmware", + "/proc/scsi" + ], + "MountLabel": "", + "Namespaces": [ + { + "Path": "", + "Type": "ipc" + }, + { + "Path": "", + "Type": "uts" + }, + { + "Path": "", + "Type": "mount" + } + ], + "ReadonlyPaths": [ + "/proc/bus", + "/proc/fs", + "/proc/irq", + "/proc/sys", + "/proc/sysrq-trigger" + ], + "Resources": { + "BlockIO": null, + "CPU": { + "Cpus": "", + "Mems": "", + "Period": 0, + "Quota": 0, + "RealtimePeriod": 0, + "RealtimeRuntime": 0, + "Shares": 2 + }, + "Devices": [], + "HugepageLimits": [], + "Memory": null, + "Network": null, + "Pids": null + }, + "RootfsPropagation": "", + "Seccomp": null, + "Sysctl": {}, + "UIDMappings": [] + }, + "Mounts": [ + { + "destination": "/proc", + "options": [ + "nosuid", + "noexec", + "nodev" + ], + "source": "proc", + "type_": "proc" + }, + { + "destination": "/dev", + "options": [ + "nosuid", + "strictatime", + "mode=755", + "size=65536k" + ], + "source": "tmpfs", + "type_": "tmpfs" + }, + { + "destination": "/dev/pts", + "options": [ + "nosuid", + "noexec", + "newinstance", + "ptmxmode=0666", + "mode=0620", + "gid=5" + ], + "source": "devpts", + "type_": "devpts" + }, + { + "destination": "/dev/mqueue", + "options": [ + "nosuid", + "noexec", + "nodev" + ], + "source": "mqueue", + "type_": "mqueue" + }, + { + "destination": "/sys", + "options": [ + "nosuid", + "noexec", + "nodev", + "ro" + ], + "source": "sysfs", + "type_": "sysfs" + }, + { + "destination": "/dev/shm", + "options": [ + "rbind" + ], + "source": "/run/kata-containers/sandbox/shm", + "type_": "bind" + }, + { + "destination": "/etc/resolv.conf", + "options": [ + "rbind", + "ro", + "nosuid", + "nodev", + "noexec" + ], + "source": "/run/kata-containers/shared/containers/4878266238663ca723dc5ecbd8b2d06a56c2d5e562eeb77b492046a267c50951-a03e767168d4d11d-resolv.conf", + "type_": "bind" + } + ], + "Process": { + "ApparmorProfile": "", + "Args": [ + "/pause" + ], + "Capabilities": { + "Ambient": [], + "Bounding": [ + "CAP_CHOWN", + "CAP_DAC_OVERRIDE", + "CAP_FSETID", + "CAP_FOWNER", + "CAP_MKNOD", + "CAP_NET_RAW", + "CAP_SETGID", + "CAP_SETUID", + "CAP_SETFCAP", + "CAP_SETPCAP", + "CAP_NET_BIND_SERVICE", + "CAP_SYS_CHROOT", + "CAP_KILL", + "CAP_AUDIT_WRITE" + ], + "Effective": [ + "CAP_CHOWN", + "CAP_DAC_OVERRIDE", + "CAP_FSETID", + "CAP_FOWNER", + "CAP_MKNOD", + "CAP_NET_RAW", + "CAP_SETGID", + "CAP_SETUID", + "CAP_SETFCAP", + "CAP_SETPCAP", + "CAP_NET_BIND_SERVICE", + "CAP_SYS_CHROOT", + "CAP_KILL", + "CAP_AUDIT_WRITE" + ], + "Inheritable": [], + "Permitted": [ + "CAP_CHOWN", + "CAP_DAC_OVERRIDE", + "CAP_FSETID", + "CAP_FOWNER", + "CAP_MKNOD", + "CAP_NET_RAW", + "CAP_SETGID", + "CAP_SETUID", + "CAP_SETFCAP", + "CAP_SETPCAP", + "CAP_NET_BIND_SERVICE", + "CAP_SYS_CHROOT", + "CAP_KILL", + "CAP_AUDIT_WRITE" + ] + }, + "ConsoleSize": null, + "Cwd": "/", + "Env": [ + "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" + ], + "NoNewPrivileges": true, + "OOMScoreAdj": -998, + "Rlimits": [], + "SelinuxLabel": "", + "Terminal": false, + "User": { + "AdditionalGids": [ + 65535 + ], + "GID": 65535, + "UID": 65535, + "Username": "" + } + }, + "Root": { + "Path": "/run/kata-containers/shared/containers/4878266238663ca723dc5ecbd8b2d06a56c2d5e562eeb77b492046a267c50951", + "Readonly": true + }, + "Solaris": null, + "Version": "1.1.0-rc.1", + "Windows": null + }, + "container_id": "4878266238663ca723dc5ecbd8b2d06a56c2d5e562eeb77b492046a267c50951", + "devices": [], + "exec_id": "4878266238663ca723dc5ecbd8b2d06a56c2d5e562eeb77b492046a267c50951", + "sandbox_pidns": false, + "shared_mounts": [], + "storages": [ + { + "driver": "blk", + "driver_options": [], + "fs_group": null, + "fstype": "tar", + "mount_point": "/run/kata-containers/sandbox/layers/5a5aad80055ff20012a50dc25f8df7a29924474324d65f7d5306ee8ee27ff71d", + "options": [ + "ro", + "io.katacontainers.fs-opt.block_device=file", + "io.katacontainers.fs-opt.is-layer", + "io.katacontainers.fs-opt.root-hash=817250f1a3e336da76f5bd3fa784e1b26d959b9c131876815ba2604048b70c18" + ], + "source": "0001:00:01.0" + }, + { + "driver": "overlayfs", + "driver_options": [], + "fs_group": null, + "fstype": "fuse3.kata-overlay", + "mount_point": "/run/kata-containers/shared/containers/4878266238663ca723dc5ecbd8b2d06a56c2d5e562eeb77b492046a267c50951", + "options": [ + "io.katacontainers.fs-opt.layer-src-prefix=/var/lib/containerd/io.containerd.snapshotter.v1.tardev/layers", + "io.katacontainers.fs-opt.layer=NWE1YWFkODAwNTVmZjIwMDEyYTUwZGMyNWY4ZGY3YTI5OTI0NDc0MzI0ZDY1ZjdkNTMwNmVlOGVlMjdmZjcxZCx0YXIscm8saW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmJsb2NrX2RldmljZT1maWxlLGlvLmthdGFjb250YWluZXJzLmZzLW9wdC5pcy1sYXllcixpby5rYXRhY29udGFpbmVycy5mcy1vcHQucm9vdC1oYXNoPTgxNzI1MGYxYTNlMzM2ZGE3NmY1YmQzZmE3ODRlMWIyNmQ5NTliOWMxMzE4NzY4MTViYTI2MDQwNDhiNzBjMTg=", + "io.katacontainers.fs-opt.overlay-rw", + "lowerdir=5a5aad80055ff20012a50dc25f8df7a29924474324d65f7d5306ee8ee27ff71d" + ], + "source": "none" + } + ], + "string_user": null + }, + "env_map": { + "PATH": "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" + } + } + } +] \ No newline at end of file diff --git a/src/tools/genpolicy/tests/testdata/createContainer/legacy/pod.yaml b/src/tools/genpolicy/tests/testdata/createContainer/legacy/pod.yaml new file mode 100644 index 000000000000..f016dbb2f5cf --- /dev/null +++ b/src/tools/genpolicy/tests/testdata/createContainer/legacy/pod.yaml @@ -0,0 +1,15 @@ +apiVersion: v1 +kind: Pod +metadata: + name: busybox +spec: + runtimeClassName: kata-cc + containers: + - name: first-test-container + image: "quay.io/prometheus/busybox:latest" + env: + - name: CONTAINER_NAME + value: first-test-container + command: + - sleep + - "3600" diff --git a/src/tools/genpolicy/tests/testdata/createContainer/legacy/testcases.json b/src/tools/genpolicy/tests/testdata/createContainer/legacy/testcases.json new file mode 100644 index 000000000000..199c80e85df8 --- /dev/null +++ b/src/tools/genpolicy/tests/testdata/createContainer/legacy/testcases.json @@ -0,0 +1,284 @@ +[ + { + "description": "legacy request for pause container", + "allowed": true, + "request": { + "OCI": { + "Annotations": { + "io.katacontainers.pkg.oci.bundle_path": "/run/containerd/io.containerd.runtime.v2.task/k8s.io/4bbf2a6b6b510a279cd17b2bfc8b64d39c11ebb55f855ba78a0034c4fe394246", + "io.katacontainers.pkg.oci.container_type": "pod_sandbox", + "io.kubernetes.cri.container-type": "sandbox", + "io.kubernetes.cri.sandbox-cpu-period": "100000", + "io.kubernetes.cri.sandbox-cpu-quota": "0", + "io.kubernetes.cri.sandbox-cpu-shares": "2", + "io.kubernetes.cri.sandbox-id": "4bbf2a6b6b510a279cd17b2bfc8b64d39c11ebb55f855ba78a0034c4fe394246", + "io.kubernetes.cri.sandbox-log-directory": "/var/log/pods/default_busybox_3a371de8-72b3-4bf8-9b5d-9dbb91e59fe3", + "io.kubernetes.cri.sandbox-memory": "0", + "io.kubernetes.cri.sandbox-name": "busybox", + "io.kubernetes.cri.sandbox-namespace": "default", + "io.kubernetes.cri.sandbox-uid": "3a371de8-72b3-4bf8-9b5d-9dbb91e59fe3", + "nerdctl/network-namespace": "/var/run/netns/cni-04edf9ab-d968-fa0f-1c47-2707af676350" + }, + "Hooks": null, + "Hostname": "busybox", + "Linux": { + "CgroupsPath": "/kubepods/besteffort/pod3a371de8-72b3-4bf8-9b5d-9dbb91e59fe3/4bbf2a6b6b510a279cd17b2bfc8b64d39c11ebb55f855ba78a0034c4fe394246", + "Devices": [], + "GIDMappings": [], + "IntelRdt": null, + "MaskedPaths": [ + "/proc/acpi", + "/proc/asound", + "/proc/kcore", + "/proc/keys", + "/proc/latency_stats", + "/proc/timer_list", + "/proc/timer_stats", + "/proc/sched_debug", + "/sys/firmware", + "/proc/scsi" + ], + "MountLabel": "", + "Namespaces": [ + { + "Path": "", + "Type": "ipc" + }, + { + "Path": "", + "Type": "uts" + }, + { + "Path": "", + "Type": "mount" + } + ], + "ReadonlyPaths": [ + "/proc/bus", + "/proc/fs", + "/proc/irq", + "/proc/sys", + "/proc/sysrq-trigger" + ], + "Resources": { + "BlockIO": null, + "CPU": { + "Cpus": "", + "Mems": "", + "Period": 0, + "Quota": 0, + "RealtimePeriod": 0, + "RealtimeRuntime": 0, + "Shares": 2 + }, + "Devices": [], + "HugepageLimits": [], + "Memory": null, + "Network": null, + "Pids": null + }, + "RootfsPropagation": "", + "Seccomp": null, + "Sysctl": {}, + "UIDMappings": [] + }, + "Mounts": [ + { + "destination": "/proc", + "options": [ + "nosuid", + "noexec", + "nodev" + ], + "source": "proc", + "type_": "proc" + }, + { + "destination": "/dev", + "options": [ + "nosuid", + "strictatime", + "mode=755", + "size=65536k" + ], + "source": "tmpfs", + "type_": "tmpfs" + }, + { + "destination": "/dev/pts", + "options": [ + "nosuid", + "noexec", + "newinstance", + "ptmxmode=0666", + "mode=0620", + "gid=5" + ], + "source": "devpts", + "type_": "devpts" + }, + { + "destination": "/dev/mqueue", + "options": [ + "nosuid", + "noexec", + "nodev" + ], + "source": "mqueue", + "type_": "mqueue" + }, + { + "destination": "/sys", + "options": [ + "nosuid", + "noexec", + "nodev", + "ro" + ], + "source": "sysfs", + "type_": "sysfs" + }, + { + "destination": "/dev/shm", + "options": [ + "rbind" + ], + "source": "/run/kata-containers/sandbox/shm", + "type_": "bind" + }, + { + "destination": "/etc/resolv.conf", + "options": [ + "rbind", + "ro", + "nosuid", + "nodev", + "noexec" + ], + "source": "/run/kata-containers/shared/containers/4bbf2a6b6b510a279cd17b2bfc8b64d39c11ebb55f855ba78a0034c4fe394246-7523f46cbb9b887f-resolv.conf", + "type_": "bind" + } + ], + "Process": { + "ApparmorProfile": "", + "Args": [ + "/pause" + ], + "Capabilities": { + "Ambient": [], + "Bounding": [ + "CAP_CHOWN", + "CAP_DAC_OVERRIDE", + "CAP_FSETID", + "CAP_FOWNER", + "CAP_MKNOD", + "CAP_NET_RAW", + "CAP_SETGID", + "CAP_SETUID", + "CAP_SETFCAP", + "CAP_SETPCAP", + "CAP_NET_BIND_SERVICE", + "CAP_SYS_CHROOT", + "CAP_KILL", + "CAP_AUDIT_WRITE" + ], + "Effective": [ + "CAP_CHOWN", + "CAP_DAC_OVERRIDE", + "CAP_FSETID", + "CAP_FOWNER", + "CAP_MKNOD", + "CAP_NET_RAW", + "CAP_SETGID", + "CAP_SETUID", + "CAP_SETFCAP", + "CAP_SETPCAP", + "CAP_NET_BIND_SERVICE", + "CAP_SYS_CHROOT", + "CAP_KILL", + "CAP_AUDIT_WRITE" + ], + "Inheritable": [], + "Permitted": [ + "CAP_CHOWN", + "CAP_DAC_OVERRIDE", + "CAP_FSETID", + "CAP_FOWNER", + "CAP_MKNOD", + "CAP_NET_RAW", + "CAP_SETGID", + "CAP_SETUID", + "CAP_SETFCAP", + "CAP_SETPCAP", + "CAP_NET_BIND_SERVICE", + "CAP_SYS_CHROOT", + "CAP_KILL", + "CAP_AUDIT_WRITE" + ] + }, + "ConsoleSize": null, + "Cwd": "/", + "Env": [ + "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" + ], + "NoNewPrivileges": true, + "OOMScoreAdj": -998, + "Rlimits": [], + "SelinuxLabel": "", + "Terminal": false, + "User": { + "AdditionalGids": [ + 65535 + ], + "GID": 65535, + "UID": 65535, + "Username": "" + } + }, + "Root": { + "Path": "/run/kata-containers/shared/containers/4bbf2a6b6b510a279cd17b2bfc8b64d39c11ebb55f855ba78a0034c4fe394246", + "Readonly": true + }, + "Solaris": null, + "Version": "1.1.0-rc.1", + "Windows": null + }, + "container_id": "4bbf2a6b6b510a279cd17b2bfc8b64d39c11ebb55f855ba78a0034c4fe394246", + "devices": [], + "exec_id": "4bbf2a6b6b510a279cd17b2bfc8b64d39c11ebb55f855ba78a0034c4fe394246", + "sandbox_pidns": false, + "shared_mounts": [], + "storages": [ + { + "driver": "blk", + "driver_options": [], + "fs_group": null, + "fstype": "tar", + "mount_point": "/run/kata-containers/sandbox/layers/5a5aad80055ff20012a50dc25f8df7a29924474324d65f7d5306ee8ee27ff71d", + "options": [ + "ro", + "io.katacontainers.fs-opt.block_device=file", + "io.katacontainers.fs-opt.is-layer", + "io.katacontainers.fs-opt.root-hash=817250f1a3e336da76f5bd3fa784e1b26d959b9c131876815ba2604048b70c18" + ], + "source": "0001:00:01.0" + }, + { + "driver": "overlayfs", + "driver_options": [], + "fs_group": null, + "fstype": "fuse3.kata-overlay", + "mount_point": "/run/kata-containers/shared/containers/4bbf2a6b6b510a279cd17b2bfc8b64d39c11ebb55f855ba78a0034c4fe394246", + "options": [ + "io.katacontainers.fs-opt.layer-src-prefix=/var/lib/containerd/io.containerd.snapshotter.v1.tardev/layers", + "io.katacontainers.fs-opt.layer=NWE1YWFkODAwNTVmZjIwMDEyYTUwZGMyNWY4ZGY3YTI5OTI0NDc0MzI0ZDY1ZjdkNTMwNmVlOGVlMjdmZjcxZCx0YXIscm8saW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmJsb2NrX2RldmljZT1maWxlLGlvLmthdGFjb250YWluZXJzLmZzLW9wdC5pcy1sYXllcixpby5rYXRhY29udGFpbmVycy5mcy1vcHQucm9vdC1oYXNoPTgxNzI1MGYxYTNlMzM2ZGE3NmY1YmQzZmE3ODRlMWIyNmQ5NTliOWMxMzE4NzY4MTViYTI2MDQwNDhiNzBjMTg=", + "io.katacontainers.fs-opt.overlay-rw", + "lowerdir=5a5aad80055ff20012a50dc25f8df7a29924474324d65f7d5306ee8ee27ff71d" + ], + "source": "none" + } + ], + "string_user": null + } + } +] \ No newline at end of file diff --git a/src/tools/genpolicy/tests/testdata/createcontainer/generate_name/pod.yaml b/src/tools/genpolicy/tests/testdata/createcontainer/generate_name/pod.yaml index acfdb5907702..afcc57b363ee 100644 --- a/src/tools/genpolicy/tests/testdata/createcontainer/generate_name/pod.yaml +++ b/src/tools/genpolicy/tests/testdata/createcontainer/generate_name/pod.yaml @@ -4,7 +4,7 @@ kind: Pod metadata: generateName: dummy spec: - runtimeClassName: kata-cc-isolation + runtimeClassName: kata-cc containers: - name: dummy image: "registry.k8s.io/pause:3.6@sha256:3d380ca8864549e74af4b29c10f9cb0956236dfb01c40ca076fb6c37253234db" diff --git a/src/tools/genpolicy/tests/testdata/createcontainer/generate_name/testcases.json b/src/tools/genpolicy/tests/testdata/createcontainer/generate_name/testcases.json index 031b3062e1cc..16d53fd89cdb 100644 --- a/src/tools/genpolicy/tests/testdata/createcontainer/generate_name/testcases.json +++ b/src/tools/genpolicy/tests/testdata/createcontainer/generate_name/testcases.json @@ -3,130 +3,286 @@ "description": "generated name with valid prefix (dummyxyz)", "allowed": true, "request": { - "OCI": { - "Version": "1.1.0", - "Annotations": { - "io.kubernetes.cri.sandbox-name": "dummyxyz", - "io.kubernetes.cri.sandbox-namespace": "default", - "io.kubernetes.cri.container-type": "sandbox", - "io.katacontainers.pkg.oci.container_type": "pod_sandbox", - "nerdctl/network-namespace": "/var/run/netns/cni-00000000-0000-0000-0000-000000000000", - "io.kubernetes.cri.sandbox-log-directory": "/var/log/pods/default_dummyxyz_00000000-0000-0000-0000-000000000000", - "io.katacontainers.pkg.oci.bundle_path": "/run/containerd/io.containerd.runtime.v2.task/k8s.io/bundle-id", - "io.kubernetes.cri.sandbox-id": "0000000000000000000000000000000000000000000000000000000000000000" - }, - "Linux": { - "GIDMappings": [], - "MountLabel": "", - "Resources": { - "Devices": [] + "base": { + "OCI": { + "Annotations": { + "io.katacontainers.pkg.oci.bundle_path": "/run/containerd/io.containerd.runtime.v2.task/k8s.io/5a1e020e5a08e7b3017743e2325799c95f7c196fdc667582394e4ef451abfeb6", + "io.katacontainers.pkg.oci.container_type": "pod_sandbox", + "io.kubernetes.cri.container-type": "sandbox", + "io.kubernetes.cri.sandbox-cpu-period": "100000", + "io.kubernetes.cri.sandbox-cpu-quota": "0", + "io.kubernetes.cri.sandbox-cpu-shares": "2", + "io.kubernetes.cri.sandbox-id": "5a1e020e5a08e7b3017743e2325799c95f7c196fdc667582394e4ef451abfeb6", + "io.kubernetes.cri.sandbox-log-directory": "/var/log/pods/default_dummyxyz_f5bdbc7e-baa8-415c-8aa2-c8e0b99de1da", + "io.kubernetes.cri.sandbox-memory": "0", + "io.kubernetes.cri.sandbox-name": "dummyxyz", + "io.kubernetes.cri.sandbox-namespace": "default", + "io.kubernetes.cri.sandbox-uid": "f5bdbc7e-baa8-415c-8aa2-c8e0b99de1da", + "nerdctl/network-namespace": "/var/run/netns/cni-543a4e42-b464-f7d3-c155-44213b7987f2" }, - "RootfsPropagation": "", - "Namespaces": [ + "Hooks": null, + "Hostname": "dummyxyz", + "Linux": { + "CgroupsPath": "/kubepods/besteffort/podf5bdbc7e-baa8-415c-8aa2-c8e0b99de1da/5a1e020e5a08e7b3017743e2325799c95f7c196fdc667582394e4ef451abfeb6", + "Devices": [], + "GIDMappings": [], + "IntelRdt": null, + "MaskedPaths": [ + "/proc/acpi", + "/proc/asound", + "/proc/kcore", + "/proc/keys", + "/proc/latency_stats", + "/proc/timer_list", + "/proc/timer_stats", + "/proc/sched_debug", + "/sys/firmware", + "/proc/scsi" + ], + "MountLabel": "", + "Namespaces": [ + { + "Path": "", + "Type": "ipc" + }, + { + "Path": "", + "Type": "uts" + }, + { + "Path": "", + "Type": "mount" + } + ], + "ReadonlyPaths": [ + "/proc/bus", + "/proc/fs", + "/proc/irq", + "/proc/sys", + "/proc/sysrq-trigger" + ], + "Resources": { + "BlockIO": null, + "CPU": { + "Cpus": "", + "Mems": "", + "Period": 0, + "Quota": 0, + "RealtimePeriod": 0, + "RealtimeRuntime": 0, + "Shares": 2 + }, + "Devices": [], + "HugepageLimits": [], + "Memory": null, + "Network": null, + "Pids": null + }, + "RootfsPropagation": "", + "Seccomp": null, + "Sysctl": {}, + "UIDMappings": [] + }, + "Mounts": [ { - "Path": "", - "Type": "ipc" + "destination": "/proc", + "options": [ + "nosuid", + "noexec", + "nodev" + ], + "source": "proc", + "type_": "proc" }, { - "Path": "", - "Type": "uts" + "destination": "/dev", + "options": [ + "nosuid", + "strictatime", + "mode=755", + "size=65536k" + ], + "source": "tmpfs", + "type_": "tmpfs" }, { - "Path": "", - "Type": "mount" + "destination": "/dev/pts", + "options": [ + "nosuid", + "noexec", + "newinstance", + "ptmxmode=0666", + "mode=0620", + "gid=5" + ], + "source": "devpts", + "type_": "devpts" }, { - "Path": "/run/netns/podns", - "Type": "network" + "destination": "/dev/mqueue", + "options": [ + "nosuid", + "noexec", + "nodev" + ], + "source": "mqueue", + "type_": "mqueue" + }, + { + "destination": "/sys", + "options": [ + "nosuid", + "noexec", + "nodev", + "ro" + ], + "source": "sysfs", + "type_": "sysfs" + }, + { + "destination": "/dev/shm", + "options": [ + "rbind" + ], + "source": "/run/kata-containers/sandbox/shm", + "type_": "bind" + }, + { + "destination": "/etc/resolv.conf", + "options": [ + "rbind", + "ro", + "nosuid", + "nodev", + "noexec" + ], + "source": "/run/kata-containers/shared/containers/5a1e020e5a08e7b3017743e2325799c95f7c196fdc667582394e4ef451abfeb6-0af7b951180ff09e-resolv.conf", + "type_": "bind" } ], - "MaskedPaths": [ - "/proc/acpi", - "/proc/asound", - "/proc/kcore", - "/proc/keys", - "/proc/latency_stats", - "/proc/timer_list", - "/proc/timer_stats", - "/proc/sched_debug", - "/sys/firmware", - "/proc/scsi" - ], - "ReadonlyPaths": [ - "/proc/bus", - "/proc/fs", - "/proc/irq", - "/proc/sys", - "/proc/sysrq-trigger" - ] - }, - "Process": { - "SelinuxLabel": "", - "User": { - "Username": "", - "UID": 65535 + "Process": { + "ApparmorProfile": "", + "Args": [ + "/pause" + ], + "Capabilities": { + "Ambient": [], + "Bounding": [ + "CAP_CHOWN", + "CAP_DAC_OVERRIDE", + "CAP_FSETID", + "CAP_FOWNER", + "CAP_MKNOD", + "CAP_NET_RAW", + "CAP_SETGID", + "CAP_SETUID", + "CAP_SETFCAP", + "CAP_SETPCAP", + "CAP_NET_BIND_SERVICE", + "CAP_SYS_CHROOT", + "CAP_KILL", + "CAP_AUDIT_WRITE" + ], + "Effective": [ + "CAP_CHOWN", + "CAP_DAC_OVERRIDE", + "CAP_FSETID", + "CAP_FOWNER", + "CAP_MKNOD", + "CAP_NET_RAW", + "CAP_SETGID", + "CAP_SETUID", + "CAP_SETFCAP", + "CAP_SETPCAP", + "CAP_NET_BIND_SERVICE", + "CAP_SYS_CHROOT", + "CAP_KILL", + "CAP_AUDIT_WRITE" + ], + "Inheritable": [], + "Permitted": [ + "CAP_CHOWN", + "CAP_DAC_OVERRIDE", + "CAP_FSETID", + "CAP_FOWNER", + "CAP_MKNOD", + "CAP_NET_RAW", + "CAP_SETGID", + "CAP_SETUID", + "CAP_SETFCAP", + "CAP_SETPCAP", + "CAP_NET_BIND_SERVICE", + "CAP_SYS_CHROOT", + "CAP_KILL", + "CAP_AUDIT_WRITE" + ] + }, + "ConsoleSize": null, + "Cwd": "/", + "Env": [ + "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" + ], + "NoNewPrivileges": true, + "OOMScoreAdj": -998, + "Rlimits": [], + "SelinuxLabel": "", + "Terminal": false, + "User": { + "AdditionalGids": [ + 65535 + ], + "GID": 65535, + "UID": 65535, + "Username": "" + } }, - "Args": [ - "/pause" - ], - "Cwd": "/", - "NoNewPrivileges": true, - "Capabilities": { - "Ambient": [], - "Bounding": [ - "CAP_CHOWN", - "CAP_DAC_OVERRIDE", - "CAP_FSETID", - "CAP_FOWNER", - "CAP_MKNOD", - "CAP_NET_RAW", - "CAP_SETGID", - "CAP_SETUID", - "CAP_SETFCAP", - "CAP_SETPCAP", - "CAP_NET_BIND_SERVICE", - "CAP_SYS_CHROOT", - "CAP_KILL", - "CAP_AUDIT_WRITE" + "Root": { + "Path": "/run/kata-containers/shared/containers/5a1e020e5a08e7b3017743e2325799c95f7c196fdc667582394e4ef451abfeb6", + "Readonly": true + }, + "Solaris": null, + "Version": "1.1.0-rc.1", + "Windows": null + }, + "container_id": "5a1e020e5a08e7b3017743e2325799c95f7c196fdc667582394e4ef451abfeb6", + "devices": [], + "exec_id": "5a1e020e5a08e7b3017743e2325799c95f7c196fdc667582394e4ef451abfeb6", + "sandbox_pidns": false, + "shared_mounts": [], + "storages": [ + { + "driver": "blk", + "driver_options": [], + "fs_group": null, + "fstype": "tar", + "mount_point": "/run/kata-containers/sandbox/layers/5a5aad80055ff20012a50dc25f8df7a29924474324d65f7d5306ee8ee27ff71d", + "options": [ + "ro", + "io.katacontainers.fs-opt.block_device=file", + "io.katacontainers.fs-opt.is-layer", + "io.katacontainers.fs-opt.root-hash=817250f1a3e336da76f5bd3fa784e1b26d959b9c131876815ba2604048b70c18" ], - "Effective": [ - "CAP_CHOWN", - "CAP_DAC_OVERRIDE", - "CAP_FSETID", - "CAP_FOWNER", - "CAP_MKNOD", - "CAP_NET_RAW", - "CAP_SETGID", - "CAP_SETUID", - "CAP_SETFCAP", - "CAP_SETPCAP", - "CAP_NET_BIND_SERVICE", - "CAP_SYS_CHROOT", - "CAP_KILL", - "CAP_AUDIT_WRITE" + "source": "0001:00:01.0" + }, + { + "driver": "overlayfs", + "driver_options": [], + "fs_group": null, + "fstype": "fuse3.kata-overlay", + "mount_point": "/run/kata-containers/shared/containers/5a1e020e5a08e7b3017743e2325799c95f7c196fdc667582394e4ef451abfeb6", + "options": [ + "io.katacontainers.fs-opt.layer-src-prefix=/var/lib/containerd/io.containerd.snapshotter.v1.tardev/layers", + "io.katacontainers.fs-opt.layer=NWE1YWFkODAwNTVmZjIwMDEyYTUwZGMyNWY4ZGY3YTI5OTI0NDc0MzI0ZDY1ZjdkNTMwNmVlOGVlMjdmZjcxZCx0YXIscm8saW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmJsb2NrX2RldmljZT1maWxlLGlvLmthdGFjb250YWluZXJzLmZzLW9wdC5pcy1sYXllcixpby5rYXRhY29udGFpbmVycy5mcy1vcHQucm9vdC1oYXNoPTgxNzI1MGYxYTNlMzM2ZGE3NmY1YmQzZmE3ODRlMWIyNmQ5NTliOWMxMzE4NzY4MTViYTI2MDQwNDhiNzBjMTg=", + "io.katacontainers.fs-opt.overlay-rw", + "lowerdir=5a5aad80055ff20012a50dc25f8df7a29924474324d65f7d5306ee8ee27ff71d" ], - "Permitted": [ - "CAP_CHOWN", - "CAP_DAC_OVERRIDE", - "CAP_FSETID", - "CAP_FOWNER", - "CAP_MKNOD", - "CAP_NET_RAW", - "CAP_SETGID", - "CAP_SETUID", - "CAP_SETFCAP", - "CAP_SETPCAP", - "CAP_NET_BIND_SERVICE", - "CAP_SYS_CHROOT", - "CAP_KILL", - "CAP_AUDIT_WRITE" - ] + "source": "none" } - }, - "Root": { - "Readonly": true, - "Path": "/run/kata-containers/shared/containers/bundle-id/rootfs" - } + ], + "string_user": null + }, + "env_map": { + "PATH": "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" } } }, @@ -134,6 +290,7 @@ "description": "generated name with invalid prefix (xyzdummy)", "allowed": false, "request": { +<<<<<<< HEAD "OCI": { "Version": "1.1.0", "Annotations": { @@ -262,3 +419,289 @@ } } ] +======= + "base": { + "OCI": { + "Annotations": { + "io.katacontainers.pkg.oci.bundle_path": "/run/containerd/io.containerd.runtime.v2.task/k8s.io/5a1e020e5a08e7b3017743e2325799c95f7c196fdc667582394e4ef451abfeb6", + "io.katacontainers.pkg.oci.container_type": "pod_sandbox", + "io.kubernetes.cri.container-type": "sandbox", + "io.kubernetes.cri.sandbox-cpu-period": "100000", + "io.kubernetes.cri.sandbox-cpu-quota": "0", + "io.kubernetes.cri.sandbox-cpu-shares": "2", + "io.kubernetes.cri.sandbox-id": "5a1e020e5a08e7b3017743e2325799c95f7c196fdc667582394e4ef451abfeb6", + "io.kubernetes.cri.sandbox-log-directory": "/var/log/pods/default_xyzdummy_f5bdbc7e-baa8-415c-8aa2-c8e0b99de1da", + "io.kubernetes.cri.sandbox-memory": "0", + "io.kubernetes.cri.sandbox-name": "xyzdummy", + "io.kubernetes.cri.sandbox-namespace": "default", + "io.kubernetes.cri.sandbox-uid": "f5bdbc7e-baa8-415c-8aa2-c8e0b99de1da", + "nerdctl/network-namespace": "/var/run/netns/cni-543a4e42-b464-f7d3-c155-44213b7987f2" + }, + "Hooks": null, + "Hostname": "xyzdummy", + "Linux": { + "CgroupsPath": "/kubepods/besteffort/podf5bdbc7e-baa8-415c-8aa2-c8e0b99de1da/5a1e020e5a08e7b3017743e2325799c95f7c196fdc667582394e4ef451abfeb6", + "Devices": [], + "GIDMappings": [], + "IntelRdt": null, + "MaskedPaths": [ + "/proc/acpi", + "/proc/asound", + "/proc/kcore", + "/proc/keys", + "/proc/latency_stats", + "/proc/timer_list", + "/proc/timer_stats", + "/proc/sched_debug", + "/sys/firmware", + "/proc/scsi" + ], + "MountLabel": "", + "Namespaces": [ + { + "Path": "", + "Type": "ipc" + }, + { + "Path": "", + "Type": "uts" + }, + { + "Path": "", + "Type": "mount" + } + ], + "ReadonlyPaths": [ + "/proc/bus", + "/proc/fs", + "/proc/irq", + "/proc/sys", + "/proc/sysrq-trigger" + ], + "Resources": { + "BlockIO": null, + "CPU": { + "Cpus": "", + "Mems": "", + "Period": 0, + "Quota": 0, + "RealtimePeriod": 0, + "RealtimeRuntime": 0, + "Shares": 2 + }, + "Devices": [], + "HugepageLimits": [], + "Memory": null, + "Network": null, + "Pids": null + }, + "RootfsPropagation": "", + "Seccomp": null, + "Sysctl": {}, + "UIDMappings": [] + }, + "Mounts": [ + { + "destination": "/proc", + "options": [ + "nosuid", + "noexec", + "nodev" + ], + "source": "proc", + "type_": "proc" + }, + { + "destination": "/dev", + "options": [ + "nosuid", + "strictatime", + "mode=755", + "size=65536k" + ], + "source": "tmpfs", + "type_": "tmpfs" + }, + { + "destination": "/dev/pts", + "options": [ + "nosuid", + "noexec", + "newinstance", + "ptmxmode=0666", + "mode=0620", + "gid=5" + ], + "source": "devpts", + "type_": "devpts" + }, + { + "destination": "/dev/mqueue", + "options": [ + "nosuid", + "noexec", + "nodev" + ], + "source": "mqueue", + "type_": "mqueue" + }, + { + "destination": "/sys", + "options": [ + "nosuid", + "noexec", + "nodev", + "ro" + ], + "source": "sysfs", + "type_": "sysfs" + }, + { + "destination": "/dev/shm", + "options": [ + "rbind" + ], + "source": "/run/kata-containers/sandbox/shm", + "type_": "bind" + }, + { + "destination": "/etc/resolv.conf", + "options": [ + "rbind", + "ro", + "nosuid", + "nodev", + "noexec" + ], + "source": "/run/kata-containers/shared/containers/5a1e020e5a08e7b3017743e2325799c95f7c196fdc667582394e4ef451abfeb6-0af7b951180ff09e-resolv.conf", + "type_": "bind" + } + ], + "Process": { + "ApparmorProfile": "", + "Args": [ + "/pause" + ], + "Capabilities": { + "Ambient": [], + "Bounding": [ + "CAP_CHOWN", + "CAP_DAC_OVERRIDE", + "CAP_FSETID", + "CAP_FOWNER", + "CAP_MKNOD", + "CAP_NET_RAW", + "CAP_SETGID", + "CAP_SETUID", + "CAP_SETFCAP", + "CAP_SETPCAP", + "CAP_NET_BIND_SERVICE", + "CAP_SYS_CHROOT", + "CAP_KILL", + "CAP_AUDIT_WRITE" + ], + "Effective": [ + "CAP_CHOWN", + "CAP_DAC_OVERRIDE", + "CAP_FSETID", + "CAP_FOWNER", + "CAP_MKNOD", + "CAP_NET_RAW", + "CAP_SETGID", + "CAP_SETUID", + "CAP_SETFCAP", + "CAP_SETPCAP", + "CAP_NET_BIND_SERVICE", + "CAP_SYS_CHROOT", + "CAP_KILL", + "CAP_AUDIT_WRITE" + ], + "Inheritable": [], + "Permitted": [ + "CAP_CHOWN", + "CAP_DAC_OVERRIDE", + "CAP_FSETID", + "CAP_FOWNER", + "CAP_MKNOD", + "CAP_NET_RAW", + "CAP_SETGID", + "CAP_SETUID", + "CAP_SETFCAP", + "CAP_SETPCAP", + "CAP_NET_BIND_SERVICE", + "CAP_SYS_CHROOT", + "CAP_KILL", + "CAP_AUDIT_WRITE" + ] + }, + "ConsoleSize": null, + "Cwd": "/", + "Env": [ + "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" + ], + "NoNewPrivileges": true, + "OOMScoreAdj": -998, + "Rlimits": [], + "SelinuxLabel": "", + "Terminal": false, + "User": { + "AdditionalGids": [ + 65535 + ], + "GID": 65535, + "UID": 65535, + "Username": "" + } + }, + "Root": { + "Path": "/run/kata-containers/shared/containers/5a1e020e5a08e7b3017743e2325799c95f7c196fdc667582394e4ef451abfeb6", + "Readonly": true + }, + "Solaris": null, + "Version": "1.1.0-rc.1", + "Windows": null + }, + "container_id": "5a1e020e5a08e7b3017743e2325799c95f7c196fdc667582394e4ef451abfeb6", + "devices": [], + "exec_id": "5a1e020e5a08e7b3017743e2325799c95f7c196fdc667582394e4ef451abfeb6", + "sandbox_pidns": false, + "shared_mounts": [], + "storages": [ + { + "driver": "blk", + "driver_options": [], + "fs_group": null, + "fstype": "tar", + "mount_point": "/run/kata-containers/sandbox/layers/5a5aad80055ff20012a50dc25f8df7a29924474324d65f7d5306ee8ee27ff71d", + "options": [ + "ro", + "io.katacontainers.fs-opt.block_device=file", + "io.katacontainers.fs-opt.is-layer", + "io.katacontainers.fs-opt.root-hash=817250f1a3e336da76f5bd3fa784e1b26d959b9c131876815ba2604048b70c18" + ], + "source": "0001:00:01.0" + }, + { + "driver": "overlayfs", + "driver_options": [], + "fs_group": null, + "fstype": "fuse3.kata-overlay", + "mount_point": "/run/kata-containers/shared/containers/5a1e020e5a08e7b3017743e2325799c95f7c196fdc667582394e4ef451abfeb6", + "options": [ + "io.katacontainers.fs-opt.layer-src-prefix=/var/lib/containerd/io.containerd.snapshotter.v1.tardev/layers", + "io.katacontainers.fs-opt.layer=NWE1YWFkODAwNTVmZjIwMDEyYTUwZGMyNWY4ZGY3YTI5OTI0NDc0MzI0ZDY1ZjdkNTMwNmVlOGVlMjdmZjcxZCx0YXIscm8saW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmJsb2NrX2RldmljZT1maWxlLGlvLmthdGFjb250YWluZXJzLmZzLW9wdC5pcy1sYXllcixpby5rYXRhY29udGFpbmVycy5mcy1vcHQucm9vdC1oYXNoPTgxNzI1MGYxYTNlMzM2ZGE3NmY1YmQzZmE3ODRlMWIyNmQ5NTliOWMxMzE4NzY4MTViYTI2MDQwNDhiNzBjMTg=", + "io.katacontainers.fs-opt.overlay-rw", + "lowerdir=5a5aad80055ff20012a50dc25f8df7a29924474324d65f7d5306ee8ee27ff71d" + ], + "source": "none" + } + ], + "string_user": null + }, + "env_map": { + "PATH": "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" + } + } + } +] +>>>>>>> 913e21d91c (policy: validate pod generated name) diff --git a/src/tools/genpolicy/tests/testdata/createsandbox/testcases.json b/src/tools/genpolicy/tests/testdata/createsandbox/testcases.json index 430c1d7af302..4a024221b127 100644 --- a/src/tools/genpolicy/tests/testdata/createsandbox/testcases.json +++ b/src/tools/genpolicy/tests/testdata/createsandbox/testcases.json @@ -5,28 +5,5 @@ "request": { "sandbox_pidns": false } - }, - { - "description": "pidns", - "allowed": false, - "request": { - "sandbox_pidns": true - } - }, - { - "description": "kernel modules", - "allowed": false, - "request": { - "sandbox_pidns": false, - "kernel_modules": [{"name": "evil.ko"}] - } - }, - { - "description": "guest hooks", - "allowed": false, - "request": { - "sandbox_pidns": false, - "guest_hook_path": "/attacker/controlled/path" - } } ] diff --git a/src/tools/genpolicy/update_policy_samples.py b/src/tools/genpolicy/update_policy_samples.py new file mode 100644 index 000000000000..75c40cafecac --- /dev/null +++ b/src/tools/genpolicy/update_policy_samples.py @@ -0,0 +1,89 @@ +import concurrent.futures +import os +import subprocess +import sys +import json +import time +from pathlib import Path + +# runs genpolicy tools on the following files +# should run this after any change to genpolicy +# usage: python3 update_policy_samples.py + +with open('policy_samples.json') as f: + samples = json.load(f) + +default_yamls = samples["default"] +incomplete_init = samples["incomplete_init"] +silently_ignored = samples["silently_ignored"] +no_policy = samples["no_policy"] +needs_containerd_pull = samples["needs_containerd_pull"] + +file_base_path = "../../agent/samples/policy/yaml" + +def runCmd(arg): + log = [f"========== COMMAND: {arg}"] + return subprocess.run([arg], stdout=subprocess.PIPE, stderr=subprocess.STDOUT, universal_newlines=True, input="", shell=True, check=True) + +def timeRunCmd(arg): + log = [f"========== COMMAND: {arg}"] + start = time.time() + + try: + p = runCmd(arg) + except subprocess.CalledProcessError as e: + log.append(e.stdout) + log.append(f"+++++ Failed with exit code {e.returncode}") + raise + else: + if p.stdout: + log.append(p.stdout) + finally: + end = time.time() + log.append(f"Time taken: {round(end - start, 2)} seconds") + print("\n".join(log)) + +# check we can access all files we are about to update +for file in default_yamls + incomplete_init + silently_ignored + no_policy: + filepath = os.path.join(file_base_path, file) + if not os.path.exists(filepath): + sys.exit(f"filepath does not exists: {filepath}") + +# build tool +next_command = "LIBC=gnu BUILD_TYPE= make" +print("========== COMMAND: " + next_command) +runCmd(next_command) + +# allow all users to pull container images by using containerd +next_command = "sudo chmod a+rw /var/run/containerd/containerd.sock" +print("========== COMMAND: " + next_command) +runCmd(next_command) + +print("Writing settings for testing to /tmp/genpolicy-settings.json") +runCmd("./tests/adapt_settings_for_tests.sh") + +# update files +genpolicy_path = "./target/x86_64-unknown-linux-gnu/debug/genpolicy" + +total_start = time.time() + +with concurrent.futures.ThreadPoolExecutor(max_workers=os.cpu_count()) as executor: + futures = [] + + for file in default_yamls + incomplete_init + no_policy + needs_containerd_pull: + rego_file = "/tmp/" + Path(os.path.basename(file)).stem + "-rego.txt" + cmd = f"{genpolicy_path} -r -d -u -j /tmp/genpolicy-settings.json -y {os.path.join(file_base_path, file)} > {rego_file}" + futures.append(executor.submit(timeRunCmd, cmd)) + + for file in silently_ignored: + rego_file = "/tmp/" + Path(os.path.basename(file)).stem + "-rego.txt" + cmd = f"{genpolicy_path} -r -d -u -s -j /tmp/genpolicy-settings.json -y {os.path.join(file_base_path, file)} > {rego_file}" + futures.append(executor.submit(timeRunCmd, cmd)) + + for future in concurrent.futures.as_completed(futures): + # Surface any potential exception thrown by the future. + future.result() + +total_end = time.time() + +print(f"Total time taken: {total_end - total_start} seconds") diff --git a/src/utarfs/.gitignore b/src/utarfs/.gitignore new file mode 100644 index 000000000000..ea8c4bf7f35f --- /dev/null +++ b/src/utarfs/.gitignore @@ -0,0 +1 @@ +/target diff --git a/src/utarfs/Cargo.lock b/src/utarfs/Cargo.lock new file mode 100644 index 000000000000..3023204d0c60 --- /dev/null +++ b/src/utarfs/Cargo.lock @@ -0,0 +1,575 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "aho-corasick" +version = "0.7.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc936419f96fa211c1b9166887b38e5e40b19958e5b895be7c1f93adec7071ac" +dependencies = [ + "memchr", +] + +[[package]] +name = "anstream" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ca84f3628370c59db74ee214b3263d58f9aadd9b4fe7e711fd87dc452b7f163" +dependencies = [ + "anstyle", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "is-terminal", + "utf8parse", +] + +[[package]] +name = "anstyle" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41ed9a86bf92ae6580e0a31281f65a1b1d867c0cc68d5346e2ae128dddfa6a7d" + +[[package]] +name = "anstyle-parse" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e765fd216e48e067936442276d1d57399e37bce53c264d6fefbe298080cb57ee" +dependencies = [ + "utf8parse", +] + +[[package]] +name = "anstyle-query" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ca11d4be1bab0c8bc8734a9aa7bf4ee8316d462a08c6ac5052f888fef5b494b" +dependencies = [ + "windows-sys", +] + +[[package]] +name = "anstyle-wincon" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "180abfa45703aebe0093f79badacc01b8fd4ea2e35118747e5811127f926e188" +dependencies = [ + "anstyle", + "windows-sys", +] + +[[package]] +name = "atty" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" +dependencies = [ + "hermit-abi 0.1.19", + "libc", + "winapi", +] + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "byteorder" +version = "1.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" + +[[package]] +name = "cc" +version = "1.0.79" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50d30906286121d95be3d479533b458f87493b30a4b5f79a607db8f5d11aa91f" + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "clap" +version = "4.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "401a4694d2bf92537b6867d94de48c4842089645fdcdf6c71865b175d836e9c2" +dependencies = [ + "clap_builder", + "clap_derive", + "once_cell", +] + +[[package]] +name = "clap_builder" +version = "4.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72394f3339a76daf211e57d4bcb374410f3965dcc606dd0e03738c7888766980" +dependencies = [ + "anstream", + "anstyle", + "bitflags", + "clap_lex", + "strsim", +] + +[[package]] +name = "clap_derive" +version = "4.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8cd2b2a819ad6eec39e8f1d6b53001af1e5469f8c177579cdaeb313115b825f" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn 2.0.19", +] + +[[package]] +name = "clap_lex" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2da6da31387c7e4ef160ffab6d5e7f00c42626fe39aea70a7b0f1773f7dd6c1b" + +[[package]] +name = "colorchoice" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" + +[[package]] +name = "daemonize" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab8bfdaacb3c887a54d41bdf48d3af8873b3f5566469f8ba21b92057509f116e" +dependencies = [ + "libc", +] + +[[package]] +name = "env_logger" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aafcde04e90a5226a6443b7aabdb016ba2f8307c847d524724bd9b346dd1a2d3" +dependencies = [ + "atty", + "humantime", + "log", + "regex", + "termcolor", +] + +[[package]] +name = "errno" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bcfec3a70f97c962c307b2d2c56e358cf1d00b558d74262b5f929ee8cc7e73a" +dependencies = [ + "errno-dragonfly", + "libc", + "windows-sys", +] + +[[package]] +name = "errno-dragonfly" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf" +dependencies = [ + "cc", + "libc", +] + +[[package]] +name = "fuser" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5910691a0ececcc6eba8bb14029025c2d123e96a53db1533f6a4602861a5aaf7" +dependencies = [ + "libc", + "log", + "memchr", + "page_size", + "pkg-config", + "smallvec", + "users", + "zerocopy", +] + +[[package]] +name = "heck" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" + +[[package]] +name = "hermit-abi" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" +dependencies = [ + "libc", +] + +[[package]] +name = "hermit-abi" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fed44880c466736ef9a5c5b5facefb5ed0785676d0c02d612db14e54f0d84286" + +[[package]] +name = "humantime" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df004cfca50ef23c36850aaaa59ad52cc70d0e90243c3c7737a4dd32dc7a3c4f" +dependencies = [ + "quick-error", +] + +[[package]] +name = "io-lifetimes" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2" +dependencies = [ + "hermit-abi 0.3.1", + "libc", + "windows-sys", +] + +[[package]] +name = "is-terminal" +version = "0.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adcf93614601c8129ddf72e2d5633df827ba6551541c6d8c59520a371475be1f" +dependencies = [ + "hermit-abi 0.3.1", + "io-lifetimes", + "rustix", + "windows-sys", +] + +[[package]] +name = "libc" +version = "0.2.146" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f92be4933c13fd498862a9e02a3055f8a8d9c039ce33db97306fd5a6caa7f29b" + +[[package]] +name = "linux-raw-sys" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef53942eb7bf7ff43a617b3e2c1c4a5ecf5944a7c1bc12d7ee39bbb15e5c1519" + +[[package]] +name = "log" +version = "0.4.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "memchr" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" + +[[package]] +name = "memmap" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6585fd95e7bb50d6cc31e20d4cf9afb4e2ba16c5846fc76793f11218da9c475b" +dependencies = [ + "libc", + "winapi", +] + +[[package]] +name = "once_cell" +version = "1.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" + +[[package]] +name = "page_size" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eebde548fbbf1ea81a99b128872779c437752fb99f217c45245e1a61dcd9edcd" +dependencies = [ + "libc", + "winapi", +] + +[[package]] +name = "pkg-config" +version = "0.3.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ac9a59f73473f1b8d852421e59e64809f025994837ef743615c6d0c5b305160" + +[[package]] +name = "proc-macro2" +version = "1.0.59" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6aeca18b86b413c660b781aa319e4e2648a3e6f9eadc9b47e9038e6fe9f3451b" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quick-error" +version = "1.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" + +[[package]] +name = "quote" +version = "1.0.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b9ab9c7eadfd8df19006f1cf1a4aed13540ed5cbc047010ece5826e10825488" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "regex" +version = "1.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b1f693b24f6ac912f4893ef08244d70b6067480d2f1a46e950c9691e6749d1d" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.6.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" + +[[package]] +name = "rustix" +version = "0.37.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fea8ca367a3a01fe35e6943c400addf443c0f57670e6ec51196f71a4b8762dd2" +dependencies = [ + "bitflags", + "errno", + "io-lifetimes", + "libc", + "linux-raw-sys", + "windows-sys", +] + +[[package]] +name = "smallvec" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a507befe795404456341dfab10cef66ead4c041f62b8b11bbb92bffe5d0953e0" + +[[package]] +name = "strsim" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a10b47e4921acc65b7d824cd92bc7b67a26382d8f4eadf3da65cb50aee6e6f3f" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "tarfs-defs" +version = "0.1.0" +dependencies = [ + "zerocopy", +] + +[[package]] +name = "termcolor" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be55cf8942feac5c765c2c993422806843c9a9a45d4d5c407ad6dd2ea95eb9b6" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "unicode-ident" +version = "1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5464a87b239f13a63a501f2701565754bae92d243d4bb7eb12f6d57d2269bf4" + +[[package]] +name = "users" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24cc0f6d6f267b73e5a2cadf007ba8f9bc39c6a6f9666f8cf25ea809a153b032" +dependencies = [ + "libc", + "log", +] + +[[package]] +name = "utarfs" +version = "0.1.0" +dependencies = [ + "clap", + "daemonize", + "env_logger", + "fuser", + "libc", + "log", + "memmap", + "tarfs-defs", + "zerocopy", +] + +[[package]] +name = "utf8parse" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-util" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" +dependencies = [ + "winapi", +] + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows-sys" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-targets" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b1eb6f0cd7c80c79759c929114ef071b87354ce476d9d94271031c0497adfd5" +dependencies = [ + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3" + +[[package]] +name = "windows_i686_gnu" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241" + +[[package]] +name = "windows_i686_msvc" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" + +[[package]] +name = "zerocopy" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "332f188cc1bcf1fe1064b8c58d150f497e697f49774aa846f2dc949d9a25f236" +dependencies = [ + "byteorder", + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6505e6815af7de1746a08f69c69606bb45695a17149517680f3b2149713b19a3" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] diff --git a/src/utarfs/Cargo.toml b/src/utarfs/Cargo.toml new file mode 100644 index 000000000000..b5be7b8366dc --- /dev/null +++ b/src/utarfs/Cargo.toml @@ -0,0 +1,15 @@ +[package] +name = "utarfs" +version = "0.1.0" +edition = "2021" + +[dependencies] +fuser = "0.12.0" +libc = "0.2.51" +log = "0.4.17" +env_logger = "0.6.0" +memmap = "0.7.0" +zerocopy = "0.6.1" +tarfs-defs = { path = "../tardev-snapshotter/tarfs-defs" } +clap = { version = "4.3.2", features = ["derive"] } +daemonize = "0.5.0" diff --git a/src/utarfs/Makefile b/src/utarfs/Makefile new file mode 100644 index 000000000000..18d16616810c --- /dev/null +++ b/src/utarfs/Makefile @@ -0,0 +1,8 @@ +all: + cargo build --release + +static-checks-build: + exit 0 + +clean: + cargo clean diff --git a/src/utarfs/src/fs.rs b/src/utarfs/src/fs.rs new file mode 100644 index 000000000000..ecbccd34df43 --- /dev/null +++ b/src/utarfs/src/fs.rs @@ -0,0 +1,283 @@ +use fuser::{FileType, Request}; +use libc::{makedev, EINVAL, ENODATA, ENOENT}; +use std::io::{self, Error, ErrorKind}; +use std::time::{Duration, UNIX_EPOCH}; +use std::{ffi::OsStr, mem::size_of, os::unix::ffi::OsStrExt}; +use tarfs_defs::*; +use zerocopy::FromBytes; + +pub struct Tar { + inode_table_offset: u64, + inode_count: u64, + data: memmap::Mmap, +} + +const TARFS_BSIZE: u64 = 4096; + +impl Tar { + pub fn new(data: memmap::Mmap, last_offset: u64) -> io::Result { + if last_offset > data.len() as u64 { + return Err(Error::new( + ErrorKind::UnexpectedEof, + "last_offset beyond end of file", + )); + } + + if last_offset < 512 { + return Err(Error::new( + ErrorKind::UnexpectedEof, + "last_offset too small", + )); + } + + // TODO: Validate that offsets are and that inode count is also ok. + let sb = SuperBlock::read_from_prefix(&data[(last_offset - 512) as usize..]).unwrap(); + Ok(Self { + inode_table_offset: sb.inode_table_offset.into(), + inode_count: sb.inode_count.into(), + data, + }) + } + + fn inode(&self, ino: u64) -> Result { + if ino < 1 || ino > self.inode_count { + return Err(ENOENT); + } + + // TODO: Remove this unwrap and check we're within range. + Ok(Inode::read_from_prefix( + &self.data + [(self.inode_table_offset + (ino - 1) * size_of::() as u64) as usize..], + ) + .unwrap()) + } + + fn attr(&self, ino: u64) -> Result { + let inode = self.inode(ino)?; + let kind = match u16::from(inode.mode) & S_IFMT { + S_IFIFO => FileType::NamedPipe, + S_IFCHR => FileType::CharDevice, + S_IFDIR => FileType::Directory, + S_IFBLK => FileType::BlockDevice, + S_IFREG => FileType::RegularFile, + S_IFLNK => FileType::Symlink, + S_IFSOCK => FileType::Socket, + _ => return Err(ENOENT), + }; + + let d = Duration::from_secs(u64::from(inode.lmtime) | (u64::from(inode.hmtime) << 32)); + let ts = UNIX_EPOCH.checked_add(d).unwrap_or(UNIX_EPOCH); + + let rdev = match kind { + FileType::BlockDevice | FileType::CharDevice => { + let offset: u64 = inode.offset.into(); + makedev((offset >> 32) as _, offset as _) as u32 + } + _ => 0, + }; + + Ok(fuser::FileAttr { + ino, + size: inode.size.into(), + blocks: (u64::from(inode.size) + TARFS_BSIZE - 1) / TARFS_BSIZE, + atime: ts, + mtime: ts, + ctime: ts, + crtime: ts, + kind, + perm: u16::from(inode.mode) & 0o777, + nlink: 1, + uid: inode.owner.into(), + gid: inode.group.into(), + rdev, + flags: 0, + blksize: TARFS_BSIZE as _, + }) + } + + fn for_each( + &self, + parent: u64, + first: i64, + mut cb: impl FnMut(&DirEntry, u64) -> Result, i32>, + ) -> Result, i32> { + let inode = self.inode(parent)?; + + if u16::from(inode.mode) & S_IFMT != S_IFDIR { + return Err(ENOENT); + } + + if first < 0 || first % size_of::() as i64 != 0 { + return Err(ENOENT); + } + + for offset in (first as u64..inode.size.into()).step_by(size_of::()) { + let dentry = DirEntry::read_from_prefix( + &self.data[(u64::from(inode.offset) + offset) as usize..], + ) + .unwrap(); + if let Some(v) = cb(&dentry, offset)? { + return Ok(Some(v)); + } + } + + Ok(None) + } +} + +impl fuser::Filesystem for Tar { + fn lookup(&mut self, _req: &Request, parent: u64, name: &OsStr, reply: fuser::ReplyEntry) { + let ret = self.for_each(parent, 0, |dentry, _| { + let ename = OsStr::from_bytes( + &self.data[u64::from(dentry.name_offset) as usize..] + [..u64::from(dentry.name_len) as usize], + ); + + Ok(if ename != name { + None + } else { + Some(self.attr(dentry.ino.into())?) + }) + }); + + match ret { + Ok(Some(a)) => reply.entry(&Duration::MAX, &a, 0), + Ok(None) => reply.error(ENOENT), + Err(e) => reply.error(e), + } + } + + fn getattr(&mut self, _req: &Request, ino: u64, reply: fuser::ReplyAttr) { + match self.attr(ino) { + Ok(a) => reply.attr(&Duration::MAX, &a), + Err(e) => reply.error(e), + } + } + + fn read( + &mut self, + _req: &Request, + ino: u64, + _fh: u64, + offset: i64, + size: u32, + _flags: i32, + _lock: Option, + reply: fuser::ReplyData, + ) { + let inode = match self.inode(ino) { + Ok(i) => i, + Err(e) => return reply.error(e), + }; + if u16::from(inode.mode) & S_IFMT != S_IFREG { + return reply.error(ENOENT); + } + let fsize = u64::from(inode.size); + if offset < 0 { + return reply.error(EINVAL); + } + + if offset as u64 >= fsize { + return reply.data(&[]); + } + + let available = fsize - offset as u64; + reply.data( + &self.data[(u64::from(inode.offset) + offset as u64) as usize..] + [..std::cmp::min(available, size.into()) as usize], + ); + } + + fn readlink(&mut self, _req: &Request, ino: u64, reply: fuser::ReplyData) { + let inode = match self.inode(ino) { + Ok(i) => i, + Err(e) => return reply.error(e), + }; + if u16::from(inode.mode) & S_IFMT != S_IFLNK { + return reply.error(ENOENT); + } + reply + .data(&self.data[u64::from(inode.offset) as usize..][..u64::from(inode.size) as usize]); + } + + fn readdir( + &mut self, + _req: &Request, + ino: u64, + _fh: u64, + first: i64, + mut reply: fuser::ReplyDirectory, + ) { + let ret = self.for_each(ino, first, |dentry, offset| { + let etype = match dentry.etype { + DT_FIFO => FileType::NamedPipe, + DT_CHR => FileType::CharDevice, + DT_DIR => FileType::Directory, + DT_BLK => FileType::BlockDevice, + DT_REG => FileType::RegularFile, + DT_LNK => FileType::Symlink, + DT_SOCK => FileType::Socket, + _ => return Ok(None), + }; + + if reply.add( + dentry.ino.into(), + (offset + size_of::() as u64) as i64, + etype, + OsStr::from_bytes( + &self.data[u64::from(dentry.name_offset) as usize..] + [..u64::from(dentry.name_len) as usize], + ), + ) { + Ok(Some(())) + } else { + Ok(None) + } + }); + + match ret { + Err(e) => reply.error(e), + Ok(_) => reply.ok(), + } + } + + fn getxattr( + &mut self, + _req: &Request, + ino: u64, + name: &OsStr, + size: u32, + reply: fuser::ReplyXattr, + ) { + let inode = match self.inode(ino) { + Ok(i) => i, + Err(e) => return reply.error(e), + }; + if inode.flags & inode_flags::OPAQUE == 0 || name != "trusted.overlay.opaque" { + return reply.error(ENODATA); + } + + if size == 0 { + reply.size(1); + } else { + reply.data(b"y"); + } + } + + fn listxattr(&mut self, _req: &Request<'_>, ino: u64, size: u32, reply: fuser::ReplyXattr) { + let inode = match self.inode(ino) { + Ok(i) => i, + Err(e) => return reply.error(e), + }; + if inode.flags & inode_flags::OPAQUE == 0 { + return reply.data(&[]); + } + const DATA: &[u8] = b"trusted.overlay.opaque\0"; + const DATA_SIZE: u32 = DATA.len() as u32; + if size < DATA_SIZE { + reply.size(DATA_SIZE); + } else { + reply.data(DATA); + } + } +} diff --git a/src/utarfs/src/main.rs b/src/utarfs/src/main.rs new file mode 100644 index 000000000000..06bad1c977fd --- /dev/null +++ b/src/utarfs/src/main.rs @@ -0,0 +1,104 @@ +use clap::Parser; +use fuser::MountOption; +use log::debug; +use std::io::{self, Error, ErrorKind}; +use zerocopy::byteorder::{LE, U32, U64}; +use zerocopy::FromBytes; + +mod fs; + +// TODO: Remove this and import from dm-verity crate. +#[derive(Default, zerocopy::AsBytes, zerocopy::FromBytes, zerocopy::Unaligned)] +#[repr(C)] +pub struct VeritySuperBlock { + pub data_block_size: U32, + pub hash_block_size: U32, + pub data_block_count: U64, +} + +#[derive(Parser, Debug)] +struct Args { + /// The source tarfs file. + source: String, + + /// The directory on which to mount. + directory: String, + + /// The filesystem type. + #[arg(short)] + r#type: Option, + + /// The filesystem options. + #[arg(short, long)] + options: Vec, +} + +fn main() -> io::Result<()> { + env_logger::init(); + let args = Args::parse(); + let mountpoint = std::fs::canonicalize(&args.directory)?; + let file = std::fs::File::open(&args.source)?; + + // Check that the filesystem is tar. + if let Some(t) = &args.r#type { + if t != "tar" { + debug!("Bad file system: {t}"); + return Err(Error::new( + ErrorKind::InvalidInput, + "File system (-t) must be \"tar\"", + )); + } + } + + // Parse all options. + let mut options = Vec::new(); + for opts in &args.options { + for opt in opts.split(',') { + debug!("Parsing option {opt}"); + let fsopt = match opt { + "dev" => MountOption::Dev, + "nodev" => MountOption::NoDev, + "suid" => MountOption::Suid, + "nosuid" => MountOption::NoSuid, + "ro" => MountOption::RO, + "exec" => MountOption::Exec, + "noexec" => MountOption::NoExec, + "atime" => MountOption::Atime, + "noatime" => MountOption::NoAtime, + "dirsync" => MountOption::DirSync, + "sync" => MountOption::Sync, + "async" => MountOption::Async, + "rw" => { + return Err(Error::new( + ErrorKind::InvalidInput, + "Tar file system are always read-only", + )); + } + _ => { + return Err(Error::new( + ErrorKind::InvalidInput, + format!("Unknown option ({opt})"), + )); + } + }; + options.push(fsopt); + } + } + + let contents = unsafe { memmap::Mmap::map(&file)? }; + let vsb = VeritySuperBlock::read_from_prefix(&contents[contents.len() - 512..]).unwrap(); + + debug!("Size: {}", contents.len()); + debug!("Data block size: {}", vsb.data_block_size); + debug!("Hash block size: {}", vsb.hash_block_size); + debug!("Data block count: {}", vsb.data_block_count); + + let sb_offset = u64::from(vsb.data_block_size) * u64::from(vsb.data_block_count); + let tar = fs::Tar::new(contents, sb_offset)?; + + daemonize::Daemonize::new() + .start() + .map_err(|e| Error::new(ErrorKind::Other, e))?; + + fuser::mount2(tar, mountpoint, &options) +} diff --git a/tools/osbuilder/.gitignore b/tools/osbuilder/.gitignore index becda8442895..365d32272eb4 100644 --- a/tools/osbuilder/.gitignore +++ b/tools/osbuilder/.gitignore @@ -9,3 +9,5 @@ kata-containers-initrd.img kata-containers.img rootfs-builder/centos/RPM-GPG-KEY-* typescript +node-builder/azure-linux/agent-install +igvm-builder/igvm-tooling diff --git a/tools/osbuilder/Makefile b/tools/osbuilder/Makefile index 91979e99c5fc..e172f7c160f8 100644 --- a/tools/osbuilder/Makefile +++ b/tools/osbuilder/Makefile @@ -8,6 +8,8 @@ TEST_RUNNER := $(MK_DIR)/tests/test_images.sh ROOTFS_BUILDER := $(MK_DIR)/rootfs-builder/rootfs.sh INITRD_BUILDER := $(MK_DIR)/initrd-builder/initrd_builder.sh IMAGE_BUILDER := $(MK_DIR)/image-builder/image_builder.sh +IGVM_BUILDER := $(MK_DIR)/igvm-builder/igvm_builder.sh +IGVM_SVN ?= 0 DISTRO ?= ubuntu BUILD_METHOD := distro @@ -16,11 +18,17 @@ AGENT_INIT ?= no USE_DOCKER ?= true ROOTFS_BUILD_DEST := $(shell pwd) IMAGES_BUILD_DEST := $(shell pwd) +IGVM_BUILD_DEST := $(shell pwd) ROOTFS_MARKER_SUFFIX := _rootfs.done TARGET_ROOTFS := $(ROOTFS_BUILD_DEST)/$(DISTRO)_rootfs TARGET_ROOTFS_MARKER := $(ROOTFS_BUILD_DEST)/.$(DISTRO)$(ROOTFS_MARKER_SUFFIX) TARGET_IMAGE := $(IMAGES_BUILD_DEST)/kata-containers.img TARGET_INITRD := $(IMAGES_BUILD_DEST)/kata-containers-initrd.img +TARGET_IGVM := $(IGVM_BUILD_DEST)/kata-containers-igvm.img +TARGET_IGVM_MSMT := $(IGVM_BUILD_DEST)/igvm-measurement.cose +TARGET_IGVM_DEBUG := $(IGVM_BUILD_DEST)/kata-containers-igvm-debug.img +TARGET_IGVM_DEBUG_MSMT:= $(IGVM_BUILD_DEST)/igvm-debug-measurement.cose +TARGET_IGVM_LOG := $(IGVM_BUILD_DEST)/igvm.log VERSION_FILE := ./VERSION VERSION := $(shell grep -v ^\# $(VERSION_FILE) 2>/dev/null || echo "unknown") @@ -86,7 +94,7 @@ endif ################################################################################ .PHONY: all -all: image initrd +all: image initrd igvm rootfs-%: $(ROOTFS_BUILD_DEST)/.%$(ROOTFS_MARKER_SUFFIX) @ # DONT remove. This is not cancellation rule. @@ -156,6 +164,10 @@ $(DRACUT_OVERLAY_DIR): mkdir -p $@/etc/modules-load.d echo $(DRACUT_KMODULES) | tr " " "\n" > $@/etc/modules-load.d/kata-modules.conf +.PHONY: igvm +igvm: $(TARGET_IMAGE) + $(IGVM_BUILDER) -o $(IGVM_BUILD_DEST) -s $(IGVM_SVN) + .PHONY: test test: $(TEST_RUNNER) "$(DISTRO)" @@ -208,7 +220,8 @@ install-scripts: .PHONY: clean clean: - rm -rf $(TARGET_ROOTFS_MARKER) $(TARGET_ROOTFS) $(TARGET_IMAGE) $(TARGET_INITRD) $(DRACUT_OVERLAY_DIR) + rm -rf $(TARGET_ROOTFS_MARKER) $(TARGET_ROOTFS) $(TARGET_IMAGE) $(TARGET_INITRD) $(DRACUT_OVERLAY_DIR) $(TARGET_IGVM) $(TARGET_IGVM_DEBUG) $(TARGET_IGVM_MSMT) $(TARGET_IGVM_DEBUG_MSMT) $(TARGET_IGVM_LOG) + rm -rf $(IGVM_TOOL_SRC) # Prints the name of the variable passed as suffix to the print- target, # E.g., if Makefile contains: diff --git a/tools/osbuilder/igvm-builder/azure-linux/config.sh b/tools/osbuilder/igvm-builder/azure-linux/config.sh new file mode 100644 index 000000000000..ade604dd6046 --- /dev/null +++ b/tools/osbuilder/igvm-builder/azure-linux/config.sh @@ -0,0 +1,25 @@ +#!/usr/bin/env bash +# +# Copyright (c) 2024 Microsoft Corporation +# +# SPDX-License-Identifier: Apache-2.0 + +# this is where the kernel-uvm package installation places bzImage, see SPEC file +BZIMAGE_BIN="/usr/share/cloud-hypervisor/bzImage" + +IGVM_EXTRACT_FOLDER="${SCRIPT_DIR}/igvm-tooling" +CLH_ACPI_TABLES_DIR="${IGVM_EXTRACT_FOLDER}/src/igvm/acpi/acpi-clh/" +IGVM_PY_FILE="${IGVM_EXTRACT_FOLDER}/src/igvm/igvmgen.py" + +IGVM_BUILD_VARS="-kernel ${BZIMAGE_BIN} -boot_mode x64 -vtl 0 -svme 1 -encrypted_page 1 -pvalidate_opt 1 -acpi ${CLH_ACPI_TABLES_DIR}" + +IGVM_KERNEL_PARAMS_COMMON="dm-mod.create=\"dm-verity,,,ro,0 ${IMAGE_DATA_SECTORS} verity 1 /dev/vda1 /dev/vda2 ${IMAGE_DATA_BLOCK_SIZE} ${IMAGE_HASH_BLOCK_SIZE} ${IMAGE_DATA_BLOCKS} 0 sha256 ${IMAGE_ROOT_HASH} ${IMAGE_SALT}\" \ + root=/dev/dm-0 rootflags=data=ordered,errors=remount-ro ro rootfstype=ext4 panic=1 no_timer_check noreplace-smp systemd.unit=kata-containers.target systemd.mask=systemd-networkd.service \ + systemd.mask=systemd-networkd.socket agent.enable_signature_verification=false" +IGVM_KERNEL_PROD_PARAMS="${IGVM_KERNEL_PARAMS_COMMON} quiet" +IGVM_KERNEL_DEBUG_PARAMS="${IGVM_KERNEL_PARAMS_COMMON} console=hvc0 systemd.log_target=console agent.log=debug agent.debug_console agent.debug_console_vport=1026" + +IGVM_FILE_NAME="kata-containers-igvm.img" +IGVM_DBG_FILE_NAME="kata-containers-igvm-debug.img" +IGVM_MEASUREMENT_FILE_NAME="igvm-measurement.cose" +IGVM_DBG_MEASUREMENT_FILE_NAME="igvm-debug-measurement.cose" diff --git a/tools/osbuilder/igvm-builder/azure-linux/igvm_lib.sh b/tools/osbuilder/igvm-builder/azure-linux/igvm_lib.sh new file mode 100644 index 000000000000..e5b13307445f --- /dev/null +++ b/tools/osbuilder/igvm-builder/azure-linux/igvm_lib.sh @@ -0,0 +1,70 @@ +#!/usr/bin/env bash +# +# Copyright (c) 2024 Microsoft Corporation +# +# SPDX-License-Identifier: Apache-2.0 + +install_igvm_tool() +{ + echo "Installing IGVM tool" + if [ -d ${IGVM_EXTRACT_FOLDER} ]; then + echo "${IGVM_EXTRACT_FOLDER} folder already exists, assuming tool is already installed" + return + fi + + # the igvm tool on Azure Linux will soon be properly installed through dnf via kata-packages-uvm-build + # as of now, even when installing with pip3, we cannot delete the source folder as the ACPI tables are not being installed anywhere, hence relying on this folder + echo "Determining and downloading latest IGVM tooling release, and extracting including ACPI tables" + IGVM_VER=$(curl -sL "https://api.github.com/repos/microsoft/igvm-tooling/releases/latest" | jq -r .tag_name | sed 's/^v//') + curl -sL "https://github.com/microsoft/igvm-tooling/archive/refs/tags/${IGVM_VER}.tar.gz" | tar --no-same-owner -xz + mv igvm-tooling-${IGVM_VER} ${IGVM_EXTRACT_FOLDER} + + echo "Installing IGVM module msigvm (${IGVM_VER}) via pip3" + pushd ${IGVM_EXTRACT_FOLDER}/src + pip3 install --no-deps ./ + popd +} + +uninstall_igvm_tool() +{ + echo "Uninstalling IGVM tool" + + rm -rf ${IGVM_EXTRACT_FOLDER} + pip3 uninstall -y msigvm +} + +build_igvm_files() +{ + echo "Reading Kata image dm_verity root hash information from root_hash file" + ROOT_HASH_FILE="${SCRIPT_DIR}/../root_hash.txt" + + if [ ! -f "${ROOT_HASH_FILE}" ]; then + echo "Could no find image root hash file '${ROOT_HASH_FILE}', aborting" + exit 1 + fi + + IMAGE_ROOT_HASH=$(sed -e 's/Root hash:\s*//g;t;d' "${ROOT_HASH_FILE}") + IMAGE_SALT=$(sed -e 's/Salt:\s*//g;t;d' "${ROOT_HASH_FILE}") + IMAGE_DATA_BLOCKS=$(sed -e 's/Data blocks:\s*//g;t;d' "${ROOT_HASH_FILE}") + IMAGE_DATA_BLOCK_SIZE=$(sed -e 's/Data block size:\s*//g;t;d' "${ROOT_HASH_FILE}") + IMAGE_DATA_SECTORS_PER_BLOCK=$((IMAGE_DATA_BLOCK_SIZE / 512)) + IMAGE_DATA_SECTORS=$((IMAGE_DATA_BLOCKS * IMAGE_DATA_SECTORS_PER_BLOCK)) + IMAGE_HASH_BLOCK_SIZE=$(sed -e 's/Hash block size:\s*//g;t;d' "${ROOT_HASH_FILE}") + + # reloading the config file as various variables depend on above values + load_config_distro + + echo "Building (debug) IGVM files and creating their reference measurement files" + # we could call into the installed binary '~/.local/bin/igvmgen' when adding to PATH or, better, into 'python3 -m msigvm' + # however, as we still need the installation directory for the ACPI tables, we leave things as is for now + # at the same time we seem to need to call pip3 install for invoking the tool at all + python3 ${IGVM_PY_FILE} $IGVM_BUILD_VARS -o $IGVM_FILE_NAME -measurement_file $IGVM_MEASUREMENT_FILE_NAME -append "$IGVM_KERNEL_PROD_PARAMS" -svn $SVN + python3 ${IGVM_PY_FILE} $IGVM_BUILD_VARS -o $IGVM_DBG_FILE_NAME -measurement_file $IGVM_DBG_MEASUREMENT_FILE_NAME -append "$IGVM_KERNEL_DEBUG_PARAMS" -svn $SVN + + if [ "${PWD}" -ef "$(readlink -f $OUT_DIR)" ]; then + echo "OUT_DIR matches with current dir, not moving build artifacts" + else + echo "Moving build artifacts to ${OUT_DIR}" + mv $IGVM_FILE_NAME $IGVM_DBG_FILE_NAME $IGVM_MEASUREMENT_FILE_NAME $IGVM_DBG_MEASUREMENT_FILE_NAME $OUT_DIR + fi +} diff --git a/tools/osbuilder/igvm-builder/igvm_builder.sh b/tools/osbuilder/igvm-builder/igvm_builder.sh new file mode 100755 index 000000000000..8e539f69d941 --- /dev/null +++ b/tools/osbuilder/igvm-builder/igvm_builder.sh @@ -0,0 +1,82 @@ +#!/usr/bin/env bash +# +# Copyright (c) 2024 Microsoft Corporation +# +# SPDX-License-Identifier: Apache-2.0 + +set -o errexit +set -o pipefail +set -o errtrace + +[ -n "$DEBUG" ] && set -x + +SCRIPT_DIR="$(dirname $(readlink -f $0))" + +# distro-specific config file +typeset -r CONFIG_SH="config.sh" + +# Name of an optional distro-specific file which, if it exists, must implement the +# install_igvm_tool, build_igvm_files, and uninstall_igvm_tool functions. +typeset -r LIB_SH="igvm_lib.sh" + +load_config_distro() +{ + distro_config_dir="${SCRIPT_DIR}/${DISTRO}" + + [ -d "${distro_config_dir}" ] || die "Could not find configuration directory '${distro_config_dir}'" + + if [ -e "${distro_config_dir}/${LIB_SH}" ]; then + igvm_lib="${distro_config_dir}/${LIB_SH}" + echo "igvm_lib.sh file found. Loading content" + source "${igvm_lib}" + fi + + # Source config.sh from distro, depends on root_hash based variables here + igvm_config="${distro_config_dir}/${CONFIG_SH}" + source "${igvm_config}" +} + +DISTRO="azure-linux" +MODE="build" + +while getopts ":o:s:iu" OPTIONS; do + case "${OPTIONS}" in + o ) OUT_DIR=$OPTARG ;; + s ) SVN=$OPTARG ;; + i ) MODE="install" ;; + u ) MODE="uninstall" ;; + \? ) + echo "Error - Invalid Option: -$OPTARG" 1>&2 + exit 1 + ;; + : ) + echo "Error - Invalid Option: -$OPTARG requires an argument" 1>&2 + exit 1 + ;; + esac +done + +echo "IGVM builder script" +echo "-- OUT_DIR -> $OUT_DIR" +echo "-- SVN -> $SVN" +echo "-- DISTRO -> $DISTRO" +echo "-- MODE -> $MODE" + +if [ -n "$DISTRO" ]; then + load_config_distro +else + echo "DISTRO must be specified" + exit 1 +fi + +case "$MODE" in + "install") + install_igvm_tool + ;; + "uninstall") + uninstall_igvm_tool + ;; + "build") + build_igvm_files + ;; +esac diff --git a/tools/osbuilder/image-builder/image_builder.sh b/tools/osbuilder/image-builder/image_builder.sh index c0176d0c87dc..7bf71ca5df1e 100755 --- a/tools/osbuilder/image-builder/image_builder.sh +++ b/tools/osbuilder/image-builder/image_builder.sh @@ -12,6 +12,7 @@ set -o pipefail DOCKER_RUNTIME=${DOCKER_RUNTIME:-runc} MEASURED_ROOTFS=${MEASURED_ROOTFS:-no} +IMAGE_SIZE_ALIGNMENT_MB=${IMAGE_SIZE_ALIGNMENT_MB:-2} #For cross build CROSS_BUILD=${CROSS_BUILD:-false} @@ -54,9 +55,6 @@ AGENT_INIT=${AGENT_INIT:-no} SELINUX=${SELINUX:-no} SELINUXFS="/sys/fs/selinux" -# Align image to 128M -readonly mem_boundary_mb=128 - # shellcheck source=../scripts/lib.sh source "${lib_file}" @@ -308,9 +306,9 @@ calculate_img_size() { img_size="$((img_size + root_free_space_mb))" fi - remaining="$((img_size % mem_boundary_mb))" + remaining="$((img_size % ${IMAGE_SIZE_ALIGNMENT_MB}))" if [ "${remaining}" != "0" ]; then - img_size=$((img_size + mem_boundary_mb - remaining)) + img_size=$((img_size + ${IMAGE_SIZE_ALIGNMENT_MB} - remaining)) fi echo "${img_size}" @@ -479,9 +477,27 @@ create_rootfs_image() { fi if [ "${MEASURED_ROOTFS}" == "yes" ] && [ -b "${device}p2" ]; then - info "veritysetup format rootfs device: ${device}p1, hash device: ${device}p2" + setup_cmd="veritysetup format ${device}p1 ${device}p2" + + case "${DM_VERITY_FORMAT}" in + veritysetup) + # Partition format compatible with "veritysetup open" but not with kernel's + # "dm-mod.create" command line parameter. + ;; + kernelinit) + # Partition format compatible with kernel's "dm-mod.create" command line + # parameter but not with "veritysetup open". + setup_cmd+=" --no-superblock" + ;; + *) + error "DM_VERITY_FORMAT(${DM_VERITY_FORMAT}) is incorrect (must be veritysetup or kernelinit)" + return 1 + ;; + esac + + info "${setup_cmd}" local image_dir=$(dirname "${image}") - veritysetup format "${device}p1" "${device}p2" > "${image_dir}"/root_hash.txt 2>&1 + eval "${setup_cmd}" > "${image_dir}"/root_hash.txt 2>&1 fi losetup -d "${device}" @@ -635,8 +651,15 @@ main() { create_rootfs_image "${rootfs}" "${image}" "${rootfs_img_size}" \ "${fs_type}" "${block_size}" "${agent_bin}" fi + + # Skip the insertion of the DAX header due to + # https://github.com/kata-containers/kata-containers/issues/7993 + + #info "Partition information before set_dax_header:" + #fdisk -lu "${image}" + # insert at the beginning of the image the MBR + DAX header - set_dax_header "${image}" "${img_size}" "${fs_type}" "${nsdax_bin}" + # set_dax_header "${image}" "${img_size}" "${fs_type}" "${nsdax_bin}" chown "${USER}:${GROUP}" "${image}" } diff --git a/tools/osbuilder/node-builder/azure-linux/Makefile b/tools/osbuilder/node-builder/azure-linux/Makefile new file mode 100644 index 000000000000..85ebf59e2114 --- /dev/null +++ b/tools/osbuilder/node-builder/azure-linux/Makefile @@ -0,0 +1,77 @@ +# Copyright (c) 2024 Microsoft Corporation +# +# SPDX-License-Identifier: Apache-2.0 +# +BUILD_TYPE := release + +export SHIM_REDEPLOY_CONFIG := yes + +ifeq ($(BUILD_TYPE),debug) + export AGENT_BUILD_TYPE := debug + export AGENT_POLICY_FILE := allow-all.rego + export SHIM_USE_DEBUG_CONFIG := yes +else + export AGENT_BUILD_TYPE := release + export AGENT_POLICY_FILE := allow-set-policy.rego + export SHIM_USE_DEBUG_CONFIG := no +endif + +.PHONY: all +all: package uvm + +.PHONY: all-confpods +all-confpods: package-confpods uvm-confpods + +.PHONY: package +package: + ./package_build.sh + +.PHONY: package-confpods +package-confpods: + CONF_PODS=yes ./package_build.sh + +.PHONY: uvm +uvm: + ./uvm_build.sh + +.PHONY: uvm-confpods +uvm-confpods: + CONF_PODS=yes ./uvm_build.sh + +.PHONY: clean +clean: + ./clean.sh + +.PHONY: clean-confpods +clean-confpods: + CONF_PODS=yes ./clean.sh + +.PHONY: deploy +deploy: deploy-package deploy-uvm + +.PHONY: deploy-package +deploy-package: + ./package_install.sh + +.PHONY: deploy-package-tools +deploy-package-tools: + ./package_tools_install.sh + +.PHONY: deploy-uvm +deploy-uvm: + ./uvm_install.sh + +.PHONY: deploy-confpods +deploy-confpods: deploy-confpods-package deploy-confpods-uvm + +.PHONY: deploy-confpods-package +deploy-confpods-package: + CONF_PODS=yes ./package_install.sh + +.PHONY: deploy-confpods-package-tools +deploy-confpods-package-tools: + CONF_PODS=yes ./package_tools_install.sh + +.PHONY: deploy-confpods-uvm +deploy-confpods-uvm: + CONF_PODS=yes ./uvm_install.sh diff --git a/tools/osbuilder/node-builder/azure-linux/README.md b/tools/osbuilder/node-builder/azure-linux/README.md new file mode 100644 index 000000000000..fbeef9385b04 --- /dev/null +++ b/tools/osbuilder/node-builder/azure-linux/README.md @@ -0,0 +1,312 @@ +# Overview + +This guide serves as a reference on how to build and install the underlying software stack for *Pod Sandboxing with AKS* and for *Confidential Containers on AKS* using Azure Linux. +This enables running Kata (Confidential) Containers via the OCI interface, or via a local kubelet, or leveraging AKS' Kubernetes solution. + +In the following, the terms *Kata* and *Kata-CC* refer to *Pod Sandboxing with AKS* and *Confidential Containers on AKS*, respectively. +The term *building* refers to build the components from source, whereas the term *installing* refers to utilizing components released by the Azure Linux team for straightforward evaluation. + +The guide provides the steps for two different environments: +- Azure Linux 3 based systems, such as Azure VMs + - Variant I: Utilize released components + - Variant II: Build components from source +- AKS nodes (based on Azure Linux 2 as of today) + +# Steps for Azure Linux 3 based environments + +## Set up environment + +While build can happen in any Azure Linux 3 based environment, the stack can only be evaluated on environments with proper virtualization support and, for Kata-CC, on top of AMD SEV-SNP. An example of such environment are Azure Linux 3 based Azure VMs using a proper SKU: +- Deploy an Azure Linux 3 VM via `az vm create` using a [CC vm size SKU](https://learn.microsoft.com/en-us/azure/virtual-machines/dcasccv5-dcadsccv5-series) + - Example: `az vm create --resource-group --name --os-disk-size-gb --public-ip-sku Standard --size --admin-username azureuser --ssh-key-values --image ` +- SSH onto the VM + +Not validated for evaluation: Install [Azure Linux 3](https://github.com/microsoft/azurelinux) on a bare metal machine supporting AMD SEV-SNP. + +To merely build the stack, we refer to the official [Azure Linux GitHub page](https://github.com/microsoft/azurelinux) to set up an Azure Linux 3 environment. + +## Deploy required host packages (incl. VMM, SEV-SNP capable kernel and Microsoft Hypervisor) and extend containerd configuration + +Install relevant packages, append a configuration snippet to `/etc/containerd/config.toml` to register the Kata(-CC) handlers, then reboot the system: +``` +sudo dnf -y makecache +sudo dnf -y install kata-packages-host + +sudo tee -a /etc/containerd/config.toml 2&>1 <` + - For build and deployment of both Kata and Kata-CC artifacts, first run the `make all` and `make deploy` commands to build and install the Kata Containers for AKS components followed by `make clean`, and then run `make all-confpods` and `make deploy-confpods` to build and install the Confidential Containers for AKS components - or vice versa (using `make clean-confpods`). + +## Debug builds + +This section describes how to build and deploy in debug mode. + +`make all-confpods` takes the following variables: + + * `AGENT_BUILD_TYPE`: Specify `release` (default) to build the agent in + release mode, or `debug` to build it in debug mode. + * `AGENT_POLICY_FILE`: Specify `allow-set-policy.rego` (default) to use + a restrictive policy, or `allow-all.rego` to use a permissive policy. + +`make deploy-confpods` takes the following variable: + + * `SHIM_USE_DEBUG_CONFIG`: Specify `no` (default) to use the production + configuration, or `yes` to use the debug configuration (all debug + logging enabled). In this case you'll want to enable debug logging + in containerd as well. Note that this variable has no effect if + `SHIM_REDEPLOY_CONFIG=no`. + +In general, you can specify the debug configuration for all the above +variables by using `BUILD_TYPE=debug` as such: + +```shell +sudo make BUILD_TYPE=debug all-confpods deploy-confpods +``` + +Also note that make still lets you override the other variables even +after setting `BUILD_TYPE`. For example, you can use the production shim +config with `BUILD_TYPE=debug`: + +```shell +sudo make BUILD_TYPE=debug SHIM_USE_DEBUG_CONFIG=no all-confpods deploy-confpods +``` + +### Prevent redeploying the shim configuration + +If you're manually modifying the shim configuration directly on the host +during development and you don't want to redeploy and overwrite that +file each time you redeploy binaries, you can separately specify the +`SHIM_REDEPLOY_CONFIG` (default `yes`): + +```shell +sudo make SHIM_REDEPLOY_CONFIG=no all-confpods deploy-confpods +``` + +Note that this variable is independent from the other variables +mentioned above. So if you want to avoid redeploying the shim +configuration AND build in debug mode, you have to use the following +command: + +```shell +sudo make BUILD_TYPE=debug SHIM_REDEPLOY_CONFIG=no all-confpods deploy-confpods +``` + +## Optional build step: Build and deploy the containerd fork from scratch + +``` +git clone --depth 1 --branch tardev-v1.7.7 https://github.com/microsoft/confidential-containers-containerd.git +pushd confidential-containers-containerd/ +GODEBUG=1 make +popd +``` + +Overwrite existing containerd binary, restart service: +``` +sudo cp -a --backup=numbered confidential-containers-containerd/bin/containerd /usr/bin/containerd +sudo systemctl restart containerd +``` + +# Run Kata (Confidential) Containers + +## Run via CRI or via containerd API + +Use e.g. `crictl` (or `ctr`) to schedule Kata (Confidential) containers, referencing either the Kata or Kata-CC handlers. + +Note: On Kubernetes nodes, pods created via `crictl` will be deleted by the control plane. + +The following instructions serve as a general reference: +- Install `crictl`, `cni` binaries, and set runtime endpoint in `crictl` configuration: + + ``` + sudo dnf -y install cri-tools cni + sudo crictl config --set runtime-endpoint=unix:///run/containerd/containerd.sock + ``` + +- Set a proper CNI configuration and create a sample pod manifest: This step is omitted as it depends on the individual needs. + +- Run pods with `crictl`, for example: + + `sudo crictl runp -T 30s -r ` + +- Run containers with `ctr`, for example a confidential container: + + `sudo ctr -n=k8s.io image pull --snapshotter=tardev docker.io/library/busybox:latest` + + `sudo ctr -n=k8s.io run --cni --runtime io.containerd.run.kata-cc.v2 --runtime-config-path /opt/confidential-containers/share/defaults/kata-containers/configuration-clh-snp.toml --snapshotter tardev -t --rm docker.io/library/busybox:latest hello sh` + +For further usage we refer to the upstream `crictl` (or `ctr`) and CNI documentation. + +## Run via Kubernetes + +If your environment was set up through `az aks create` the respective node is ready to run Kata (Confidential) Containers as AKS Kubernetes pods. +Other types of Kubernetes clusters should work as well. While this document doesn't cover how to set-up those clusters, you can +apply the kata and kata-cc runtime classes to your cluster from the machine that holds your kubeconfig file, for example: +``` +cat << EOF > runtimeClass-kata-cc.yaml +kind: RuntimeClass +apiVersion: node.k8s.io/v1 +metadata: + name: kata-cc +handler: kata-cc +overhead: + podFixed: + memory: "600Mi" +scheduling: + nodeSelector: + katacontainers.io/kata-runtime: "true" +EOF + +cat << EOF > runtimeClass-kata.yaml +kind: RuntimeClass +apiVersion: node.k8s.io/v1 +metadata: + name: kata +handler: kata +overhead: + podFixed: + memory: "600Mi" +scheduling: + nodeSelector: + katacontainers.io/kata-runtime: "true" +EOF + +kubectl apply -f runtimeClass-kata-cc.yaml -f runtimeClass-kata.yaml +``` + +And label your node appropriately: +``` +kubectl label node katacontainers.io/kata-runtime=true +``` + +# Build attestation scenarios +The build artifacts for the UVM ConfPods target include an IGVM file and a so-called reference measurement file (unsigned). The IGVM file is being loaded into memory measured by the AMD SEV-SNP PSP (when a Confidental Container is started). With this and with the Kata security policy feature, attestation scenarios can be built: the reference measurement (often referred to as 'endorsement') can, for example, be signed by a trusted party (such as Microsoft in Confidential Containers on AKS) and be compared with the actual measurement part of the attestation report. The latter can be retrieved through respective system calls inside the Kata Confidential Containers Guest VM. + +An example for an attestation scenario through Microsoft Azure Attestation is presented in [Attestation in Confidential containers on Azure Container Instances](https://learn.microsoft.com/en-us/azure/container-instances/confidential-containers-attestation-concepts). +Documentation for leveraging the Kata security policy feature can be found in [Security policy for Confidential Containers on Azure Kubernetes Service](https://learn.microsoft.com/en-us/azure/confidential-computing/confidential-containers-aks-security-policy). diff --git a/tools/osbuilder/node-builder/azure-linux/clean.sh b/tools/osbuilder/node-builder/azure-linux/clean.sh new file mode 100755 index 000000000000..08c13e88abf9 --- /dev/null +++ b/tools/osbuilder/node-builder/azure-linux/clean.sh @@ -0,0 +1,72 @@ +#!/usr/bin/env bash +# +# Copyright (c) 2024 Microsoft Corporation +# +# SPDX-License-Identifier: Apache-2.0 + +set -o errexit +set -o pipefail +set -o errtrace + +[ -n "$DEBUG" ] && set -x + +script_dir="$(dirname $(readlink -f $0))" +repo_dir="${script_dir}/../../../../" + +common_file="common.sh" +source "${common_file}" + +pushd "${repo_dir}" + +echo "Clean runtime build" +pushd src/runtime/ +make clean SKIP_GO_VERSION_CHECK=1 +popd + +echo "Clean agent build" +pushd src/agent/ +make clean +popd + +rm -rf ${AGENT_INSTALL_DIR} + +echo "Clean UVM build" +pushd tools/osbuilder/ +sudo -E PATH=$PATH make DISTRO=cbl-mariner clean +popd + +echo "Clean IGVM tool installation" + + +if [ "${CONF_PODS}" == "yes" ]; then + + echo "Clean SNP debug shim config" + pushd src/runtime/config/ + rm -f "${SHIM_DBG_CONFIG_FILE_NAME}" + popd + + echo "Clean tardev-snapshotter tarfs driver build" + pushd src/tarfs + set_uvm_kernel_vars + if [ -n "${UVM_KERNEL_HEADER_DIR}" ]; then + make clean KDIR=${UVM_KERNEL_HEADER_DIR} + fi + popd + + echo "Clean utarfs binary build" + pushd src/utarfs/ + make clean + popd + + echo "Clean tardev-snapshotter overlay binary build" + pushd src/overlay/ + make clean + popd + + echo "Clean tardev-snapshotter service build" + pushd src/tardev-snapshotter/ + make clean + popd +fi + +popd diff --git a/tools/osbuilder/node-builder/azure-linux/common.sh b/tools/osbuilder/node-builder/azure-linux/common.sh new file mode 100755 index 000000000000..e76376971c9a --- /dev/null +++ b/tools/osbuilder/node-builder/azure-linux/common.sh @@ -0,0 +1,64 @@ +#!/usr/bin/env bash +# +# Copyright (c) 2024 Microsoft Corporation +# +# SPDX-License-Identifier: Apache-2.0 + +script_dir="$(dirname $(readlink -f $0))" +lib_file="${script_dir}/../../scripts/lib.sh" +source "${lib_file}" + +OS_VERSION=$(sort -r /etc/*-release | gawk 'match($0, /^(VERSION_ID=(.*))$/, a) { print toupper(a[2] a[3]); exit }' | tr -d '"') + +([[ "${OS_VERSION}" == "2.0" ]] || [[ "${OS_VERSION}" == "3.0" ]]) || die "OS_VERSION: value '${OS_VERSION}' must equal 3.0 (default) or 2.0" + +if [ "${CONF_PODS}" == "yes" ]; then + INSTALL_PATH_PREFIX="/opt/confidential-containers" + UVM_TOOLS_PATH_OSB="${INSTALL_PATH_PREFIX}/uvm/tools/osbuilder" + UVM_TOOLS_PATH_SRC="${INSTALL_PATH_PREFIX}/uvm/src" + UVM_PATH_DEFAULT="${INSTALL_PATH_PREFIX}/share/kata-containers" + IMG_FILE_NAME="kata-containers.img" + IGVM_FILE_NAME="kata-containers-igvm.img" + IGVM_DBG_FILE_NAME="kata-containers-igvm-debug.img" + UVM_MEASUREMENT_FILE_NAME="igvm-measurement.cose" + UVM_DBG_MEASUREMENT_FILE_NAME="igvm-debug-measurement.cose" + SHIM_CONFIG_PATH="${INSTALL_PATH_PREFIX}/share/defaults/kata-containers" + SHIM_CONFIG_FILE_NAME="configuration-clh-snp.toml" + SHIM_CONFIG_INST_FILE_NAME="${SHIM_CONFIG_FILE_NAME}" + SHIM_DBG_CONFIG_FILE_NAME="configuration-clh-snp-debug.toml" + SHIM_DBG_CONFIG_INST_FILE_NAME="${SHIM_DBG_CONFIG_FILE_NAME}" + DEBUGGING_BINARIES_PATH="${INSTALL_PATH_PREFIX}/bin" + SHIM_BINARIES_PATH="/usr/local/bin" + SHIM_BINARY_NAME="containerd-shim-kata-cc-v2" +else + INSTALL_PATH_PREFIX="/usr" + UVM_TOOLS_PATH_OSB="/opt/kata-containers/uvm/tools/osbuilder" + UVM_TOOLS_PATH_SRC="/opt/kata-containers/uvm/src" + UVM_PATH_DEFAULT="${INSTALL_PATH_PREFIX}/share/kata-containers" + IMG_FILE_NAME="kata-containers.img" + SHIM_CONFIG_PATH="${INSTALL_PATH_PREFIX}/share/defaults/kata-containers" + SHIM_CONFIG_FILE_NAME="configuration-clh.toml" + SHIM_CONFIG_INST_FILE_NAME="configuration.toml" + DEBUGGING_BINARIES_PATH="${INSTALL_PATH_PREFIX}/local/bin" + SHIM_BINARIES_PATH="${INSTALL_PATH_PREFIX}/local/bin" + SHIM_BINARY_NAME="containerd-shim-kata-v2" +fi + +# this is where cloud-hypervisor-cvm gets installed (see package SPEC) +CLOUD_HYPERVISOR_LOCATION="/usr/bin/cloud-hypervisor" +# this is where kernel-uvm gets installed (see package SPEC) +KERNEL_BINARY_LOCATION="/usr/share/cloud-hypervisor/vmlinux.bin" +# Mariner 3: different binary name +if [ "${OS_VERSION}" == "2.0" ]; then + VIRTIOFSD_BINARY_LOCATION="/usr/libexec/virtiofsd-rs" +else + VIRTIOFSD_BINARY_LOCATION="/usr/libexec/virtiofsd" +fi + +AGENT_INSTALL_DIR="${script_dir}/agent-install" + +set_uvm_kernel_vars() { + UVM_KERNEL_VERSION=$(rpm -q --queryformat '%{VERSION}' kernel-uvm-devel) + UVM_KERNEL_RELEASE=$(rpm -q --queryformat '%{RELEASE}' kernel-uvm-devel) + UVM_KERNEL_HEADER_DIR="/usr/src/linux-headers-${UVM_KERNEL_VERSION}-${UVM_KERNEL_RELEASE}" +} diff --git a/tools/osbuilder/node-builder/azure-linux/package_build.sh b/tools/osbuilder/node-builder/azure-linux/package_build.sh new file mode 100755 index 000000000000..93cedb855470 --- /dev/null +++ b/tools/osbuilder/node-builder/azure-linux/package_build.sh @@ -0,0 +1,96 @@ +#!/usr/bin/env bash +# +# Copyright (c) 2024 Microsoft Corporation +# +# SPDX-License-Identifier: Apache-2.0 + +set -o errexit +set -o pipefail +set -o errtrace + +[ -n "$DEBUG" ] && set -x + +AGENT_BUILD_TYPE=${AGENT_BUILD_TYPE:-release} +CONF_PODS=${CONF_PODS:-no} + +script_dir="$(dirname $(readlink -f $0))" +repo_dir="${script_dir}/../../../../" + +common_file="common.sh" +source "${common_file}" + +# these options ensure we produce the proper CLH config file +runtime_make_flags="SKIP_GO_VERSION_CHECK=1 QEMUCMD= FCCMD= ACRNCMD= STRATOVIRTCMD= DEFAULT_HYPERVISOR=cloud-hypervisor + DEFMEMSZ=0 DEFSTATICSANDBOXWORKLOADMEM=512 DEFVCPUS=0 DEFSTATICSANDBOXWORKLOADVCPUS=1 DEFVIRTIOFSDAEMON=${VIRTIOFSD_BINARY_LOCATION} PREFIX=${INSTALL_PATH_PREFIX}" + +# - for vanilla Kata we use the kernel binary. For ConfPods we use IGVM, so no need to provide kernel path. +# - for vanilla Kata we explicitly set DEFSTATICRESOURCEMGMT_CLH. For ConfPods, +# the variable DEFSTATICRESOURCEMGMT_TEE is used which defaults to false +# - for ConfPods we explicitly set the cloud-hypervisor path. The path is independent of the PREFIX variable +# as we have a single CLH binary for both vanilla Kata and ConfPods +if [ "${CONF_PODS}" == "no" ]; then + runtime_make_flags+=" DEFSTATICRESOURCEMGMT_CLH=true KERNELPATH_CLH=${KERNEL_BINARY_LOCATION}" +else + runtime_make_flags+=" CLHPATH=${CLOUD_HYPERVISOR_LOCATION}" +fi + +# On Mariner 3.0 we use cgroupsv2 with a single sandbox cgroup +if [ "${OS_VERSION}" == "3.0" ]; then + runtime_make_flags+=" DEFSANDBOXCGROUPONLY=true" +fi + +agent_make_flags="LIBC=gnu OPENSSL_NO_VENDOR=Y DESTDIR=${AGENT_INSTALL_DIR} BUILD_TYPE=${AGENT_BUILD_TYPE}" + +if [ "${CONF_PODS}" == "yes" ]; then + agent_make_flags+=" AGENT_POLICY=yes" +fi + +pushd "${repo_dir}" + +if [ "${CONF_PODS}" == "yes" ]; then + + echo "Building utarfs binary" + pushd src/utarfs/ + make all + popd + + echo "Building kata-overlay binary" + pushd src/overlay/ + make all + popd + + echo "Building tardev-snapshotter service binary" + pushd src/tardev-snapshotter/ + make all + popd +fi + +echo "Building shim binary and configuration" +pushd src/runtime/ +if [ "${CONF_PODS}" == "yes" ] || [ "${OS_VERSION}" == "3.0" ]; then + make ${runtime_make_flags} +else + # Mariner 2 pod sandboxing uses cgroupsv1 - note: cannot add the kernelparams in above assignments, + # leads to quotation issue. Hence, implementing the conditional check right here at the time of the make command + make ${runtime_make_flags} KERNELPARAMS="systemd.legacy_systemd_cgroup_controller=yes systemd.unified_cgroup_hierarchy=0" +fi +popd + +pushd src/runtime/config/ +if [ "${CONF_PODS}" == "yes" ]; then + + echo "Creating SNP shim debug configuration" + cp "${SHIM_CONFIG_FILE_NAME}" "${SHIM_DBG_CONFIG_FILE_NAME}" + sed -i "s|${IGVM_FILE_NAME}|${IGVM_DBG_FILE_NAME}|g" "${SHIM_DBG_CONFIG_FILE_NAME}" + sed -i '/^#enable_debug =/s|^#||g' "${SHIM_DBG_CONFIG_FILE_NAME}" + sed -i '/^#debug_console_enabled =/s|^#||g' "${SHIM_DBG_CONFIG_FILE_NAME}" +fi +popd + +echo "Building agent binary and generating service files" +pushd src/agent/ +make ${agent_make_flags} +make install ${agent_make_flags} +popd + +popd diff --git a/tools/osbuilder/node-builder/azure-linux/package_install.sh b/tools/osbuilder/node-builder/azure-linux/package_install.sh new file mode 100755 index 000000000000..fa924f89b6bd --- /dev/null +++ b/tools/osbuilder/node-builder/azure-linux/package_install.sh @@ -0,0 +1,79 @@ +#!/usr/bin/env bash +# +# Copyright (c) 2024 Microsoft Corporation +# +# SPDX-License-Identifier: Apache-2.0 + +set -o errexit +set -o pipefail +set -o errtrace + +[ -n "$DEBUG" ] && set -x + +CONF_PODS=${CONF_PODS:-no} +PREFIX=${PREFIX:-} +SHIM_REDEPLOY_CONFIG=${SHIM_REDEPLOY_CONFIG:-yes} +SHIM_USE_DEBUG_CONFIG=${SHIM_USE_DEBUG_CONFIG:-no} +START_SERVICES=${START_SERVICES:-yes} + +script_dir="$(dirname $(readlink -f $0))" +repo_dir="${script_dir}/../../../../" + +common_file="common.sh" +source "${common_file}" + +pushd "${repo_dir}" + +echo "Creating target directories" +mkdir -p "${PREFIX}/${SHIM_CONFIG_PATH}" +mkdir -p "${PREFIX}/${DEBUGGING_BINARIES_PATH}" +mkdir -p "${PREFIX}/${SHIM_BINARIES_PATH}" + +if [ "${CONF_PODS}" == "yes" ]; then + echo "Installing tardev-snapshotter binaries and service file" + mkdir -p ${PREFIX}/usr/sbin + cp -a --backup=numbered src/utarfs/target/release/utarfs ${PREFIX}/usr/sbin/mount.tar + mkdir -p ${PREFIX}/usr/bin + cp -a --backup=numbered src/overlay/target/release/kata-overlay ${PREFIX}/usr/bin/ + cp -a --backup=numbered src/tardev-snapshotter/target/release/tardev-snapshotter ${PREFIX}/usr/bin/ + mkdir -p ${PREFIX}/usr/lib/systemd/system/ + cp -a --backup=numbered src/tardev-snapshotter/tardev-snapshotter.service ${PREFIX}/usr/lib/systemd/system/ + + if [ "${SHIM_REDEPLOY_CONFIG}" == "yes" ]; then + echo "Installing SNP shim debug configuration" + cp -a --backup=numbered src/runtime/config/"${SHIM_DBG_CONFIG_FILE_NAME}" "${PREFIX}/${SHIM_CONFIG_PATH}"/"${SHIM_DBG_CONFIG_INST_FILE_NAME}" + else + echo "Skipping installation of SNP shim debug configuration" + fi + + echo "Enabling and starting snapshotter service" + if [ "${START_SERVICES}" == "yes" ]; then + systemctl enable tardev-snapshotter && systemctl daemon-reload && systemctl restart tardev-snapshotter + fi +fi + +echo "Installing diagnosability binaries (monitor, runtime, collect-data script)" +cp -a --backup=numbered src/runtime/kata-monitor "${PREFIX}/${DEBUGGING_BINARIES_PATH}" +cp -a --backup=numbered src/runtime/kata-runtime "${PREFIX}/${DEBUGGING_BINARIES_PATH}" +chmod +x src/runtime/data/kata-collect-data.sh +cp -a --backup=numbered src/runtime/data/kata-collect-data.sh "${PREFIX}/${DEBUGGING_BINARIES_PATH}" + +echo "Installing shim binary" +cp -a --backup=numbered src/runtime/containerd-shim-kata-v2 "${PREFIX}/${SHIM_BINARIES_PATH}"/"${SHIM_BINARY_NAME}" + +if [ "${SHIM_REDEPLOY_CONFIG}" == "yes" ]; then + echo "Installing shim configuration" + cp -a --backup=numbered src/runtime/config/"${SHIM_CONFIG_FILE_NAME}" "${PREFIX}/${SHIM_CONFIG_PATH}/${SHIM_CONFIG_INST_FILE_NAME}" + + if [ "${CONF_PODS}" == "yes" ] && [ "${SHIM_USE_DEBUG_CONFIG}" == "yes" ]; then + # We simply override the release config with the debug config, + # which is probably fine when debugging. Not symlinking as that + # would create cycles the next time this script is called. + echo "Overriding shim configuration with SNP debug configuration" + cp -a --backup=numbered src/runtime/config/"${SHIM_DBG_CONFIG_FILE_NAME}" "${PREFIX}/${SHIM_CONFIG_PATH}/${SHIM_CONFIG_INST_FILE_NAME}" + fi +else + echo "Skipping installation of shim configuration" +fi + +popd diff --git a/tools/osbuilder/node-builder/azure-linux/package_tools_install.sh b/tools/osbuilder/node-builder/azure-linux/package_tools_install.sh new file mode 100755 index 000000000000..8bf306bce1ac --- /dev/null +++ b/tools/osbuilder/node-builder/azure-linux/package_tools_install.sh @@ -0,0 +1,65 @@ +#!/usr/bin/env bash +# +# Copyright (c) 2024 Microsoft Corporation +# +# SPDX-License-Identifier: Apache-2.0 + +set -o errexit +set -o pipefail +set -o errtrace + +[ -n "$DEBUG" ] && set -x + +CONF_PODS=${CONF_PODS:-no} +PREFIX=${PREFIX:-} + +script_dir="$(dirname $(readlink -f $0))" +repo_dir="${script_dir}/../../../../" + +common_file="common.sh" +source "${common_file}" + +pushd "${repo_dir}" + +echo "Creating target directories" +mkdir -p "${PREFIX}/${UVM_TOOLS_PATH_OSB}/scripts" +mkdir -p "${PREFIX}/${UVM_TOOLS_PATH_OSB}/rootfs-builder/cbl-mariner" +mkdir -p "${PREFIX}/${UVM_TOOLS_PATH_OSB}/image-builder" +mkdir -p "${PREFIX}/${UVM_TOOLS_PATH_OSB}/node-builder/azure-linux/agent-install/usr/bin" +mkdir -p "${PREFIX}/${UVM_TOOLS_PATH_OSB}/node-builder/azure-linux/agent-install/usr/lib/systemd/system" + +if [ "${CONF_PODS}" == "yes" ]; then + mkdir -p "${PREFIX}/${UVM_TOOLS_PATH_SRC}/kata-opa" + mkdir -p "${PREFIX}/${UVM_TOOLS_PATH_SRC}/tarfs" + mkdir -p "${PREFIX}/${UVM_TOOLS_PATH_OSB}/igvm-builder/azure-linux" +fi + +echo "Installing UVM build scripting" +cp -a --backup=numbered tools/osbuilder/Makefile "${PREFIX}/${UVM_TOOLS_PATH_OSB}/" +cp -a --backup=numbered tools/osbuilder/scripts/lib.sh "${PREFIX}/${UVM_TOOLS_PATH_OSB}/scripts/" +cp -a --backup=numbered tools/osbuilder/rootfs-builder/rootfs.sh "${PREFIX}/${UVM_TOOLS_PATH_OSB}/rootfs-builder/" +cp -a --backup=numbered tools/osbuilder/rootfs-builder/cbl-mariner/config.sh "${PREFIX}/${UVM_TOOLS_PATH_OSB}/rootfs-builder/cbl-mariner/" +cp -a --backup=numbered tools/osbuilder/rootfs-builder/cbl-mariner/rootfs_lib.sh "${PREFIX}/${UVM_TOOLS_PATH_OSB}/rootfs-builder/cbl-mariner/" +cp -a --backup=numbered tools/osbuilder/image-builder/image_builder.sh "${PREFIX}/${UVM_TOOLS_PATH_OSB}/image-builder/" +cp -a --backup=numbered tools/osbuilder/node-builder/azure-linux/Makefile "${PREFIX}/${UVM_TOOLS_PATH_OSB}/node-builder/azure-linux/" +cp -a --backup=numbered tools/osbuilder/node-builder/azure-linux/clean.sh "${PREFIX}/${UVM_TOOLS_PATH_OSB}/node-builder/azure-linux/" +cp -a --backup=numbered tools/osbuilder/node-builder/azure-linux/common.sh "${PREFIX}/${UVM_TOOLS_PATH_OSB}/node-builder/azure-linux/" +cp -a --backup=numbered tools/osbuilder/node-builder/azure-linux/uvm_build.sh "${PREFIX}/${UVM_TOOLS_PATH_OSB}/node-builder/azure-linux/" +cp -a --backup=numbered tools/osbuilder/node-builder/azure-linux/uvm_install.sh "${PREFIX}/${UVM_TOOLS_PATH_OSB}/node-builder/azure-linux/" + +echo "Installing agent binary and service files" +cp -a --backup=numbered tools/osbuilder/node-builder/azure-linux/agent-install/usr/bin/kata-agent "${PREFIX}/${UVM_TOOLS_PATH_OSB}/node-builder/azure-linux/agent-install/usr/bin/" +cp -a --backup=numbered tools/osbuilder/node-builder/azure-linux/agent-install/usr/lib/systemd/system/kata-containers.target "${PREFIX}/${UVM_TOOLS_PATH_OSB}/node-builder/azure-linux/agent-install/usr/lib/systemd/system/" +cp -a --backup=numbered tools/osbuilder/node-builder/azure-linux/agent-install/usr/lib/systemd/system/kata-agent.service "${PREFIX}/${UVM_TOOLS_PATH_OSB}/node-builder/azure-linux/agent-install/usr/lib/systemd/system/" + +if [ "${CONF_PODS}" == "yes" ]; then + cp -a --backup=numbered src/kata-opa/allow-all.rego "${PREFIX}/${UVM_TOOLS_PATH_SRC}/kata-opa/" + cp -a --backup=numbered src/kata-opa/allow-set-policy.rego "${PREFIX}/${UVM_TOOLS_PATH_SRC}/kata-opa/" + cp -a --backup=numbered src/tarfs/Makefile "${PREFIX}/${UVM_TOOLS_PATH_SRC}/tarfs/" + cp -a --backup=numbered src/tarfs/tarfs.c "${PREFIX}/${UVM_TOOLS_PATH_SRC}/tarfs/" + cp -a --backup=numbered tools/osbuilder/igvm-builder/igvm_builder.sh "${PREFIX}/${UVM_TOOLS_PATH_OSB}/igvm-builder/" + cp -a --backup=numbered tools/osbuilder/igvm-builder/azure-linux/config.sh "${PREFIX}/${UVM_TOOLS_PATH_OSB}/igvm-builder/azure-linux/" + cp -a --backup=numbered tools/osbuilder/igvm-builder/azure-linux/igvm_lib.sh "${PREFIX}/${UVM_TOOLS_PATH_OSB}/igvm-builder/azure-linux/" +fi + +popd diff --git a/tools/osbuilder/node-builder/azure-linux/uvm_build.sh b/tools/osbuilder/node-builder/azure-linux/uvm_build.sh new file mode 100755 index 000000000000..67342776506e --- /dev/null +++ b/tools/osbuilder/node-builder/azure-linux/uvm_build.sh @@ -0,0 +1,76 @@ +#!/usr/bin/env bash +# +# Copyright (c) 2024 Microsoft Corporation +# +# SPDX-License-Identifier: Apache-2.0 + +set -o errexit +set -o pipefail +set -o errtrace + +[ -n "$DEBUG" ] && set -x + +AGENT_POLICY_FILE="${AGENT_POLICY_FILE:-allow-set-policy.rego}" +CONF_PODS=${CONF_PODS:-no} +IGVM_SVN=${IGVM_SVN:-0} + +script_dir="$(dirname $(readlink -f $0))" +repo_dir="${script_dir}/../../../../" + +agent_policy_file_abs="${repo_dir}/src/kata-opa/${AGENT_POLICY_FILE}" + +common_file="common.sh" +source "${common_file}" + +# This ensures that a pre-built agent binary is being injected into the rootfs +rootfs_make_flags="AGENT_SOURCE_BIN=${AGENT_INSTALL_DIR}/usr/bin/kata-agent OS_VERSION=${OS_VERSION}" + +if [ "${CONF_PODS}" == "yes" ]; then + rootfs_make_flags+=" AGENT_POLICY=yes CONF_GUEST=yes AGENT_POLICY_FILE=${agent_policy_file_abs}" +fi + +if [ "${CONF_PODS}" == "yes" ]; then + set_uvm_kernel_vars + if [ -z "${UVM_KERNEL_HEADER_DIR}}" ]; then + exit 1 + fi +fi + +pushd "${repo_dir}" + +echo "Building rootfs and including pre-built agent binary" +pushd tools/osbuilder +# This command requires sudo because of dnf-installing packages into rootfs. As a suite, following commands require sudo as well as make clean +sudo -E PATH=$PATH make ${rootfs_make_flags} -B DISTRO=cbl-mariner rootfs +ROOTFS_PATH="$(readlink -f ./cbl-mariner_rootfs)" +popd + +echo "Installing agent service files into rootfs" +sudo cp ${AGENT_INSTALL_DIR}/usr/lib/systemd/system/kata-containers.target ${ROOTFS_PATH}/usr/lib/systemd/system/kata-containers.target +sudo cp ${AGENT_INSTALL_DIR}/usr/lib/systemd/system/kata-agent.service ${ROOTFS_PATH}/usr/lib/systemd/system/kata-agent.service + +if [ "${CONF_PODS}" == "yes" ]; then + echo "Building tarfs kernel driver and installing into rootfs" + pushd src/tarfs + make KDIR=${UVM_KERNEL_HEADER_DIR} + sudo make KDIR=${UVM_KERNEL_HEADER_DIR} KVER=${UVM_KERNEL_VERSION} INSTALL_MOD_PATH=${ROOTFS_PATH} install + popd + + echo "Building dm-verity protected image based on rootfs" + pushd tools/osbuilder + sudo -E PATH=$PATH make DISTRO=cbl-mariner MEASURED_ROOTFS=yes DM_VERITY_FORMAT=kernelinit image + popd + + echo "Building IGVM and UVM measurement files" + pushd tools/osbuilder + sudo chmod o+r root_hash.txt + sudo make igvm DISTRO=cbl-mariner IGVM_SVN=${IGVM_SVN} + popd +else + echo "Building image based on rootfs" + pushd tools/osbuilder + sudo -E PATH=$PATH make DISTRO=cbl-mariner image + popd +fi + +popd diff --git a/tools/osbuilder/node-builder/azure-linux/uvm_install.sh b/tools/osbuilder/node-builder/azure-linux/uvm_install.sh new file mode 100755 index 000000000000..09e2cfa386eb --- /dev/null +++ b/tools/osbuilder/node-builder/azure-linux/uvm_install.sh @@ -0,0 +1,42 @@ +#!/usr/bin/env bash +# +# Copyright (c) 2024 Microsoft Corporation +# +# SPDX-License-Identifier: Apache-2.0 + +set -o errexit +set -o pipefail +set -o errtrace + +[ -n "$DEBUG" ] && set -x + +CONF_PODS=${CONF_PODS:-no} + +script_dir="$(dirname $(readlink -f $0))" +repo_dir="${script_dir}/../../../../" + +common_file="common.sh" +source "${common_file}" + +UVM_PATH=${UVM_PATH:-${UVM_PATH_DEFAULT}} + +pushd "${repo_dir}" + +pushd tools/osbuilder + +echo "Creating target directory" +mkdir -p "${UVM_PATH}" + +echo "Installing UVM files to target directory" +if [ "${CONF_PODS}" == "yes" ]; then + cp -a --backup=numbered "${IGVM_FILE_NAME}" "${UVM_PATH}" + cp -a --backup=numbered "${IGVM_DBG_FILE_NAME}" "${UVM_PATH}" + cp -a --backup=numbered "${UVM_MEASUREMENT_FILE_NAME}" "${UVM_PATH}" + cp -a --backup=numbered "${UVM_DBG_MEASUREMENT_FILE_NAME}" "${UVM_PATH}" +fi + +cp -a --backup=numbered "${IMG_FILE_NAME}" "${UVM_PATH}" + +popd + +popd diff --git a/tools/osbuilder/rootfs-builder/cbl-mariner/config.sh b/tools/osbuilder/rootfs-builder/cbl-mariner/config.sh index 85ff5ad98a10..591b4359ea8d 100644 --- a/tools/osbuilder/rootfs-builder/cbl-mariner/config.sh +++ b/tools/osbuilder/rootfs-builder/cbl-mariner/config.sh @@ -8,5 +8,6 @@ OS_NAME=cbl-mariner OS_VERSION=${OS_VERSION:-3.0} LIBC="gnu" PACKAGES="kata-packages-uvm" +[ "$CONF_GUEST" = yes ] && PACKAGES+=" kata-packages-uvm-coco" [ "$AGENT_INIT" = no ] && PACKAGES+=" systemd" [ "$SECCOMP" = yes ] && PACKAGES+=" libseccomp" diff --git a/tools/osbuilder/rootfs-builder/rootfs.sh b/tools/osbuilder/rootfs-builder/rootfs.sh index fabbba4ee67e..19e815684a66 100755 --- a/tools/osbuilder/rootfs-builder/rootfs.sh +++ b/tools/osbuilder/rootfs-builder/rootfs.sh @@ -1,4 +1,4 @@ -#!/usr/bin/env bash + #!/usr/bin/env bash # # Copyright (c) 2018 Intel Corporation # @@ -61,6 +61,8 @@ NVIDIA_GPU_STACK=${NVIDIA_GPU_STACK:-""} VARIANT=${VARIANT:-""} [[ "${VARIANT}" == "nvidia-gpu"* ]] && source "${script_dir}/nvidia/nvidia_rootfs.sh" +nvidia_rootfs="${script_dir}/nvidia/nvidia_rootfs.sh" +[ "${ARCH}" == "x86_64" ] || [ "${ARCH}" == "aarch64" ] && source "$nvidia_rootfs" #For cross build CROSS_BUILD=${CROSS_BUILD:-false} @@ -83,26 +85,62 @@ fi # The list of systemd units and files that are not needed in Kata Containers readonly -a systemd_units=( + "blk-availability" + "sys-fs-fuse-connections" + "sys-kernel-config" + "systemd-ask-password-console" + "systemd-ask-password-wall" + "systemd-boot-update" "systemd-coredump@" + "systemd-journal-catalog-update" + "systemd-journal-flush" "systemd-journald" + "systemd-journald@" + "systemd-journald-audit" "systemd-journald-dev-log" - "systemd-journal-flush" + "systemd-logind" + "systemd-network-generator" + "systemd-pcrfs@" + "systemd-pcrfs-root" + "systemd-pcrlock-firmware-code" + "systemd-pcrlock-firmware-config" + "systemd-pcrlock-file-system" + "systemd-pcrlock-machine-id" + "systemd-pcrlock-make-policy" + "systemd-pcrlock-secureboot-authority" + "systemd-pcrlock-secureboot-policy" + "systemd-pcrmachine" + "systemd-pcrphase" + "systemd-pcrphase-initrd" + "systemd-pcrphase-sysinit" + "systemd-pcrextend" + "systemd-pcrextend@" + "systemd-pstore" "systemd-random-seed" + "systemd-sysupdate" + "systemd-sysupdate-reboot" "systemd-timesyncd" + "systemd-tmpfiles-clean" "systemd-tmpfiles-setup" - "systemd-udevd" - "systemd-udevd-control" - "systemd-udevd-kernel" - "systemd-udev-trigger" + "systemd-tmpfiles-setup-dev" + "systemd-tmpfiles-setup-dev-early" + "systemd-tpm2-setup" + "systemd-tpm2-setup-early" "systemd-update-utmp" + "systemd-update-utmp-runlevel" + "systemd-vconsole-setup" ) readonly -a systemd_files=( + "blkdeactivate" + "journalctl" "systemd-bless-boot-generator" "systemd-fstab-generator" "systemd-getty-generator" "systemd-gpt-auto-generator" - "systemd-tmpfiles-cleanup.timer" + "systemd-pcrlock" + "systemd-tmpfiles" + "systemd-tty-ask-password-agent" ) handle_error() { @@ -177,7 +215,8 @@ AGENT_INIT When set to "yes", use ${AGENT_BIN} as init process in place AGENT_POLICY_FILE Path to the agent policy rego file to be set in the rootfs. If defined, this overwrites the default setting of the - permissive policy file. + permissive policy file. The path is relative to the policy + rego file directory 'src/kata-opa'. Default value: allow-all.rego AGENT_SOURCE_BIN Path to the directory of agent binary. @@ -356,6 +395,8 @@ copy_kernel_modules() info "Copy kernel modules from ${KERNEL_MODULES_DIR}" mkdir -p "${dest_dir}" cp -a "${KERNEL_MODULES_DIR}" "${dest_dir}/" + local KERNEL_VER=$(ls ${dest_dir}) + depmod -a -b "${rootfs_dir}" ${KERNEL_VER} OK "Kernel modules copied" } @@ -774,7 +815,6 @@ EOF fi if [[ "${AGENT_POLICY}" == "yes" ]]; then - info "Install the default policy" # Install default settings for the kata-opa service. local opa_settings_dir="/etc/kata-opa" local policy_file_name="$(basename ${agent_policy_file})" @@ -850,11 +890,16 @@ detect_host_distro() delete_unnecessary_files() { - info "Removing unneeded systemd services and sockets" + info "Removing unneeded systemd unit files" for u in "${systemd_units[@]}"; do find "${ROOTFS_DIR}" \ \( -type f -o -type l \) \ - \( -name "${u}.service" -o -name "${u}.socket" \) \ + \( -name "${u}" -o \ + -name "${u}.mount" -o \ + -name "${u}.path" -o \ + -name "${u}.service" -o \ + -name "${u}.socket" -o \ + -name "${u}.timer" \) \ -exec echo "deleting {}" \; \ -exec rm -f {} \; done